diff -Nru qbittorrent-4.1.3/.appveyor.yml qbittorrent-3.3.15/.appveyor.yml --- qbittorrent-4.1.3/.appveyor.yml 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/.appveyor.yml 2017-08-03 20:30:10.000000000 +0000 @@ -5,10 +5,6 @@ image: Visual Studio 2017 -branches: - except: # blacklist - - coverity_scan - environment: REPO_DIR: &REPO_DIR c:\qbittorrent CACHE_DIR: &CACHE_DIR c:\qbt_cache @@ -24,8 +20,6 @@ cache: - *CACHE_DIR -clone_depth: 50 - install: # check if library needs update - appveyor DownloadFile "%QBT_VER_URL%" -FileName "c:\version_new" && SET /P newVersion=<"c:\version_new" @@ -45,7 +39,8 @@ - CALL "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat" - SET PATH=%PATH%;c:\qbt\qt5_32\bin;%CACHE_DIR%\jom; # setup project - - COPY /Y "%CACHE_DIR%\conf.pri" "%REPO_DIR%" + - COPY /Y "%CACHE_DIR%\winconf.pri" "%REPO_DIR%" + - COPY /Y "%CACHE_DIR%\winconf-msvc.pri" "%REPO_DIR%" # workarounds - MKLINK /J "c:\qbt\base" "%CACHE_DIR%\base" diff -Nru qbittorrent-4.1.3/AUTHORS qbittorrent-3.3.15/AUTHORS --- qbittorrent-4.1.3/AUTHORS 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/AUTHORS 2017-08-03 20:30:10.000000000 +0000 @@ -34,14 +34,6 @@ license: GPLv2/3 Images Authors: -* files: src/icons/skin/qbittorrent-tray.svg (and related pngs) - copyright: Provided by HVS (raster first proposal) and Atif Afzal(@atfzl github) (vectorized and modified) - license: GPLv2+ - -* files: src/qbittorrent_file.ico src/icons/fileicon.svg - copyright: 'uknown.svg' (LGPLv3+) from Oxygen Icon Theme was used as base which was slightly modified and 'qbittorrent-tray.svg' (GPLv2+) was overlayed above it. - license: GPLv3+ - * files: src/icons/*.png copyright: Gnome Icon Theme license: GPLv2 @@ -52,10 +44,10 @@ license: LGPL url: http://www.oxygen-icons.org -* files: src/icons/flags/*.svg - copyright: lipis/flag-icon-css - license: MIT - url: https://github.com/lipis/flag-icon-css/ +* files: src/icons/flags/*.png + copyright: Mark James + license: Public Domain + url: http://www.famfamfam.com * files: src/icons/skin/*.png files: src/menuicons/YYxYY/*.png diff -Nru qbittorrent-4.1.3/Changelog qbittorrent-3.3.15/Changelog --- qbittorrent-4.1.3/Changelog 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/Changelog 2017-08-03 20:30:10.000000000 +0000 @@ -1,349 +1,21 @@ -* Tue Sep 18 2018 - sledgehammer999 - v4.1.3 - - FEATURE: Preselect name without extension when renaming files (thalieht) - - FEATURE: Allow setting seq & first/last from context menu without metadata (thalieht) - - BUGFIX: Show "N/A" if there is no scrape (thalieht) - - BUGFIX: Save option about tracker favicons under correct key (sledgehammer999) - - BUGFIX: When file data are unreachable pause torrent and show "Missing Files" status (temporary fix) (sledgehammer999) - - BUGFIX: Don't disable DHT when using force proxy (Thomas Piccirello) - - BUGFIX: Correctly save torrent queue position/state/priority changes in fastresume (glassez, thalieht, sledgehammer999) - - BUGFIX: Fix icon height/width ratio (Chocobo1) - - BUGFIX: Fix values sorted wrong in "Last Activity" column (Chocobo1) - - BUGFIX: Replace png icons with svg (Chocobo1) - - WEBUI: Allow WebUI sidebar filters to be hidden (Thomas Piccirello) - - WEBUI: Increase WebUI Options initial height (Thomas Piccirello) - - WEBUI: Adjust WebUI Options form alignment (Thomas Piccirello) - - WEBUI: Fix WebUI unreachable issue (Chocobo1) - - WEBUI: Require torrent category creation to be explicit (Thomas Piccirello) - - WEBUI: Include category save path in web api sync data (Thomas Piccirello) - - WEBUI: Add save path and editing to WebUI new category dialog (Thomas Piccirello) - - WEBUI: Bump Web API version - - SEARCH: Refactor in searchjob to always color visited entries (thalieht) - - SEARCH: Set "enter" as shortcut to download the selected torrents in search job (thalieht) - - SEARCH: Add regex option in the search filter's context menu (thalieht) - - LINUX: Fix GUI scaling issue on Linux (Chocobo1) - - LINUX: Fix regression that broke installing desktop file (Eli Schwartz) - - OPENBSD: Better filesystem support for filewatcher (Elias M. Mariani) - -* Sun Aug 12 2018 - sledgehammer999 - v4.1.2 - - FEATURE: New options for "inhibit sleep" (Lukas Greib) - - FEATURE: Add option for regexps in the transferlist search filter's context menu (thalieht) - - FEATURE: Add async io threads option to AdvancedSettings (tjjh89017) - - FEATURE: Allow save resume interval to be disabled (Chocobo1) - - FEATURE: Add checkbox for recursive download dialog (Chocobo1) - - FEATURE: Add changelog link in program updater (Chocobo1) - - BUGFIX: Avoid allocating large memory when loading a .torrent file (Couchy) - - BUGFIX: Notify users on 1st time close/minimize to tray (sledgehammer999) - - BUGFIX: Fix I/O error after fetching magnet metadata (Chocobo1) - - BUGFIX: Never save resume data for already paused torrents (glassez) - - BUGFIX: Make ProgramUpdater upgrade to 64-bit qbt when running on 64-bit Windows (Chocobo1) - - BUGFIX: Put temporary files in qbt own temp folder (Chocobo1) - - BUGFIX: Avoid potentially setting the wrong piece priorities (Chocobo1) - - BUGFIX: Various code refactorings/improvements (Chocobo1, thalieht, glassez) - - BUGFIX: Add options "Download in sequential order" and "Download first and last pieces first" in AddNewTorrentDialog (Chocobo1) - - BUGFIX: Download favicon using appropriate protocol (glassez) - - BUGFIX: Apply proxy settings on DownloadManager creation (glassez) - - BUGFIX: Improve torrent initialization (glassez) - - BUGFIX: Save resume data on torrent change events (glassez) - - BUGFIX: Increase default resume data save interval (Chocobo1) - - BUGFIX: Work around crash when procesing recursive download. Closes #9086 (Chocobo1) - - BUGFIX: Reduce queries to python version (Chocobo1) - - BUGFIX: Disable certain mouse wheel events in Options dialog (Chocobo1) - - WEBUI: Send all rechecks in one request (Thomas Piccirello) - - WEBUI: Add WebUI Force Reannounce option (Thomas Piccirello) - - WEBUI: Create non-existing path in setLocationAction() (Goshik) - - WEBUI: Add WebUI support for Mac ⌘ (Command) key (Thomas Piccirello) - - WEBUI: Show current save path in 'Set location' window (Goshik) - - WEBUI: Fix WebUI cache behavior for css files (Chocobo1) - - WEBUI: Send Cache-Control header in WebUI responses (Chocobo1) - - WEBUI: Add form-action to CSP (Thomas Piccirello) - - WEBUI: Add upgrade-insecure-requests to CSP when HTTPS is enabled (Thomas Piccirello) - - WEBUI: Reset WebUI ban counter on login success (Chocobo1) - - WEBUI: Add logging messages in WebUI login action (Chocobo1) - - WEBUI: Add option to control CSRF protection (Chocobo1) - - WEBUI: Add option to control WebUI clickjacking protection (Chocobo1) - - RSS: Implement "Sequential downloading" feature. Closes #6835 (glassez) - - RSS: Don't use RSS feed URLs as base for file names. Closes #8399 (glassez) - - SEARCH: Add a name filter for search results (thalieht) - - SEARCH: Fix python version detection (Chocobo1) - - SEARCH: Clear python cache conditionally (Chocobo1) - - SEARCH: Properly normalize version string before parsing it (hannsen) - - WINDOWS: Turn on Control Flow Guard for MSVC builds (Chocobo1) - - MACOS: Replace deprecated function IOPMAssertionCreate() on macOS (Chocobo1) - - OTHER: Fix CMake build with QtSingleApplication. Fixes #9196 (Eugene Shalygin) - -* Sun May 27 2018 - sledgehammer999 - v4.1.1 - - FEATURE: Add 'Moving' state for torrents being relocated/moved (sledgehammer999) - - FEATURE: Show rechecking progress (sledgehammer999) - - FEATURE: Add option to remember last used save path (glassez) - - FEATURE: Torrent name is also renamed if the content was renamed in the "Add New Torrent" dialog (glassez) - - FEATURE: Relax behavior of "Download first and last piece first". It applies to all files and not only to the previewable. (Chocobo1) - - BUGFIX: Fix issues with translatable strings (Chocobo1) - - BUGFIX: Fix displayed tracker messages (Chocobo1) - - BUGFIX: Make settings file recovery more robust (Chocobo1) - - BUGFIX: Retry saving settings when operation failed (Chocobo1) - - BUGFIX: Log successful torrent move (sledgehammer999) - - BUGFIX: Fix deletion of old logs (sledgehammer999) - - BUGFIX: Delete non-commited fastresume files (sledgehammer999) - - BUGFIX: Don't migrate torrents that have newer fastresumes (sledgehammer999) - - BUGFIX: Fix adding multiple torrents at once from WebUI (glassez) - - BUGFIX: Improve "Run External Program" behavior. On Windows, a backslash isn't appended to paths from path variables (Chocobo1) - - BUGFIX: Suppress multiple I/O errors for the same torrent (sledgehammer999) - - BUGFIX: Replace raster qbt logo with vector version (Chocobo1) - - WEBUI: Fix wrong API method names (glassez) - - WEBUI: Filter torrent info endpoint by hashes (Marcel Petersen) - - WEBUI: Fix invalid API calls in WebUI (glassez) - - WEBUI: Improve legacy API params handling (glassez) - - WEBUI: Fix params handling for some legacy API methods (glassez) - - WEBUI: Apply locale changes immediately in WebUI (Chocobo1) - - WEBUI: Use 32px icons for favicon (Chocobo1) - - WEBUI/RSS: Properly set RSS settings via API (glassez) - - RSS: Fix auto-downloading rule when Smart filter with regular Episode filter are used (glassez) - - RSS: Make "Ignoring days" to behave like other filters (glassez) - - RSS: Place "Use Smart Episode Filter" more correctly (glassez) - - RSS: Use RSS feed update time as a fallback (glassez) - - COSMETIC: Fix Stats dialog size (sledgehammer999) - - MACOS: Fix GUI scaling factor on macOS (Chocobo1) - - WINDOWS: Update icons (adem4ik) - - LINUX: Fix open destination folder with Nautilus > 3.28 (Evgeny Lensky) - - OTHER: Code improvements and refactoring (thalieht, Nick Korotysh, Chocobo1) - -* Sat May 05 2018 - sledgehammer999 - v4.1.0 - - FEATURE: Add "Coalesce reads & writes" checkbox in advanced options (Chocobo1) - - FEATURE: Smart Filter for RSS (Stephen Dawkins) - - FEATURE: Possibility to configure at which speed a torrent is considered slow (thalieht) - - FEATURE: When creating a torrent you can choose to preserve the file order (toster, Chocobo1) - - FEATURE: A new, redesigned and refactored WebAPI (glassez) - - BUGFIX: Redefine CacheStatus.readRatio field. (Chocobo1) - - BUGFIX: Clarify some terms in stats dialog (Chocobo1) - - BUGFIX: Fix possible crash when using both share limits (thalieht) - - BUGFIX: Disable options when `Disable connections not supported by proxies` is enabled (Thomas Piccirello) - - BUGFIX: Add link to an explanation of `Disable connections not supported by proxies` (Thomas Piccirello) - - BUGFIX: Fix typo in a log message (Andrei Stepanov) - - BUGFIX: Fix loading very large torrents. Closes #8449. (Chocobo1) - - BUGFIX: Fix reverting backslashes to slashes in run external program. Closes #7800 (Chocobo1) - - BUGFIX: Use https for documentation links (Chocobo1) - - BUGFIX: Use original scheme when downloading favicons (Chocobo1) - - BUGFIX: Parse URL query string at application level (glassez) - - BUGFIX: Properly reply to announce request (embedded tracker) (glassez) - - BUGFIX: Add `Tags` parameter to "Run External Program" (Chocobo1) - - BUGFIX: Fix various typos (Chocobo1) - - BUGFIX: Refactor filesystem watcher. Delay before processing new files. (Chocobo1) - - BUGFIX: Don't strip empty arguments passed to external program. Closes #8454. (Chocobo1) - - BUGFIX: Stop creating Download folder on start (Chocobo1) - - BUGFIX: Avoid data corruption when rechecking paused torrents (sledgehammer999) - - BUGFIX: Fix crashes due to invalid iterator use (Luís Pereira) - - BUGFIX: Fix renaming completed files (Chocobo1) - - BUGFIX: Fix path separator in log messages (Chocobo1) - - WEBUI: Switch built-in Web UI html to HTML5 (glassez) - - WEBUI: WebUI Save user's resized window sizes (Thomas Piccirello) - - WEBUI: Make download + upload windows resizable (Thomas Piccirello) - - WEBUI: Add option to show/hide webui status bar (Thomas Piccirello) - - WEBUI: Add "Use proxy only for torrents" option to webui (Thomas Piccirello) - - WEBUI: Various fixes in the html code (Thomas Piccirello) - - WEBUI: Don't unselect selected torrents after a few seconds (Thomas Piccirello) - - WEBUI: Enable Http/1.1 persistence connection (Chocobo1) - - WEBUI: Format Read cache hits as percentage (Thomas Piccirello) - - WEBUI: Re-order and rename stats (Thomas Piccirello) - - WEBUI: Right align stat values (Thomas Piccirello) - - WEBUI: Enable Statistics window to be scrolled and resized (Tom Piccirello) - - WEBUI: Save WebUI Statistics window size (Thomas Piccirello) - - WEBUI: Make WebUI iframe windows scrollable on iOS (Thomas Piccirello) - - WEBUI: Remove unused CSS from WebUI login page (Thomas Piccirello) - - WEBUI: Consolidate CSS into style.css (Thomas Piccirello) - - WEBUI: Resolve JavaScript errors (Thomas Piccirello) - - WEBUI: Fix spacing in login form(Thomas Piccirello) - - WEBUI: Update WebUI to be more compliant with HTML5 standard (Chocobo1) - - WEBUI: Update clipboard.js to v2.0.0 (Chocobo1) - - WEBUI: Remove unused JavaScript library (Chocobo1) - - WEBUI: Fix setting preferences via WebAPI (glassez) - - WEBUI: Rename property to match its definition (Thomas Piccirello) - - WEBUI: Add Limit Share Ratio context menu option (Thomas Piccirello) - - RSS: Disable Auto TMM when RSS rule has save path (glassez) - - RSS: Process loaded RSS articles in case of error (glassez) - - RSS: Resolve (X)HTML entities in RSS content (glassez) - - SEARCH: Improve Search handling (glassez) - - SEARCH: Calculate supported categories based on selected plugin (Thomas Piccirello) - - SEARCH: Fix memory leak (Chocobo1) - - COSMETIC: Use spinbox suffix to display rate/time units (thalieht) - - COSMETIC: Avoid showing an empty row in AdvancedSettings (Chocobo1) - - OTHER: Various code optimizations and fixes (Luís Pereira, Chocobo1) - - OTHER: Fix build when using Clang under CMake (Luís Pereira) - - OTHER: Allow to disable Stacktrace support (Nick Korotysh) - - OTHER: Use RNG provided by OS (Chocobo1) - -* Fri Feb 16 2018 - sledgehammer999 - v4.0.4 - - FEATURE: Add source field in Torrent creator. Closes #7965. (Chocobo1) - - FEATURE: Torrent creator: raise maximum piece size to 32 MiB (Chocobo1) - - FEATURE: Add a force reannounce option in the transfer list context menu. Closes #6448. (Jesse Bryan) - - BUGFIX: Fix sorting of country flags column in Peers tab. (sledgehammer999) - - BUGFIX: Fix natural sorting when the common part of 2 strings ends partially in a number which continues in the uncommon part. Closes #8080 #6732. (sledgehammer999) - - BUGFIX: Fix application of speed limits on LAN and μTP connections. Closes #7745. (sledgehammer999) - - BUGFIX: Make peer information flags in peerlist more readable. (thalieht) - - BUGFIX: Fix gui issues on high DPI monitor. (Chocobo1) - - BUGFIX: Fix dialog and column size on high DPI monitors. (Chocobo1) - - BUGFIX: Fix constant status of '[F] Downloading'. Closes #7628. (sledgehammer999) - - BUGFIX: Fix translation context. Closes #8211. (sledgehammer999) - - BUGFIX: Separate subnet whitelist options into two lines. (Thomas Piccirello) - - BUGFIX: Don't set application name twice. (Luís Pereira) - - BUGFIX: Set default file log size to 65 KiB and delete backup logs older than 1 month. (sledgehammer999) - - WEBUI: Only prepend scheme when it is not present. Closes #8057. (Chocobo1) - - WEBUI: Add "Remaining" and "Availability" columns to webui Content tab. (Thomas Piccirello) - - WEBUI: Make value formatting consistent with GUI (Thomas Piccirello) - - WEBUI: Reposition Total Size column to match gui (Thomas Piccirello) - - WEBUI: Add Tags and Time Active columns (Thomas Piccirello) - - WEBUI: Use https for www.qbittorrent.org (Thomas Piccirello) - - WEBUI: Match webui statuses to gui, closes #7516 (Thomas Piccirello) - - WEBUI: Right-align stat values (Thomas Piccirello) - - WEBUI: Add missing units. (Thomas Piccirello) - - RSS: Fix crash when deleting rule because it tries to update. Closes #8094 (glassez) - - RSS: Don't process new/updated RSS rules when disabled (glassez) - - RSS: Remove legacy and corrupted RSS settings (glassez) - - SEARCH: Search only when category is supported by plugin. Closes #8053. (jan.karberg) - - SEARCH: Only add search separators as needed. (Thomas Piccirello) - - COSMETIC: Tweak spacing in torrent properties widget and speed widget. (Chocobo1) - - WINDOWS: Use standard folder icon for open file behavior on Windows. Closes #7880. (Chocobo1) - - WINDOWS: Revert "Run external program" function. Now you will not be able to directly run batch scripts. (Chocobo1) - - MACOS: Fix torrent file selection in Finder on mac (vit9696) - - MACOS: Fix Finder reveal in preview and torrent contents (vit9696) - - MACOS: Fix cmd+w not closing the main window on macOS (vit9696) - - OTHER: Fix splitting of compiler flags in configure. Autoconf removes a set of [] during script translation, resulting in a wrong sed command. (sledgehammer999) - - OTHER: configure: Parse all compiler related flags together. (sledgehammer999) - - OTHER: Update copyright year. (sledgehammer999) - -* Sun Dec 17 2017 - sledgehammer999 - v4.0.3 - - BUGFIX: Add height padding to the transfer list icons. Closes #7951. (sledgehammer999) - - BUGFIX: Allow to drag-n-drop URLs into mainwindow to initiate download. (Chocobo1) - - BUGFIX: Fix crash when fitlering search results. Stable sorting is removed. Closes #7952.(Chocobo1) - - WEBUI: Fix missing qbt logo on login page in webUI. Closes #7953. (Chocobo1) - - WEBUI: Add check to avoid type error after logout. (Chocobo1) - - WEBUI: Use POST for logout command. This is to avoid browser being smart to prefetch the link then logging out the user. (Chocobo1) - - WEBUI: Fix WebUI is not reachable via IPv6. (glassez) - - WINDOWS: Disable the "?" help button in all dialogs on Windows. Closes #7365. Requires Qt 5.10. (Chocobo1) - -* Fri Dec 01 2017 - sledgehammer999 - v4.0.2 - - BUGFIX: Fix crash on some systems when creating address object for 255.255.255.255. Closes #7735. (sledgehammer999) - - PERFORMANCE: Change MixedModeAlgorithm default to TCP. This was the v3_3_x default and should sustain higher speeds. Closes #7779. (Chocobo1) - - PERFORMANCE: Stop logging IP filter parsing errors after a while, otherwise the GUI freezes or qBittorrent doesn't start. (sledgehammer999) - - GUI: Implement stable sort. Rows in transfer list shouldn't flicker anymore. (Chocobo1) - - WEBUI: Fix build when webui is disabled. (Heiko Becker) - - RSS: Fix build because of missing header. Closes #7805. (thoradia) - - RSS: Fix RSS parser. (glassez) - - RSS: Implement Import/Export RSS rules in legacy(aka v3_3_x) format. (glassez) - - RSS: Implement Import/Export RSS rules in JSON format. (glassez) - - WINDOWS: Fixed blurry text under Windows by setting DPI awareness to default. (TheNicker) - - LINUX: Fix i386 build. (Evgeny Lensky) - -* Wed Nov 22 2017 - sledgehammer999 - v4.0.1 - - BUGFIX: Fix crash on opening torrent/magnet (uninitialized pointer). Closes #7739 #7723. (sledgehammer999) - - BUGFIX: Enable preferences Apply button when ip banlist is modified (Thomas Piccirello) - - BUGFIX: Allow drag-n-drop magnet links to mainwindow. Closes #7742. (Chocobo1) - - BUGFIX: Fix crash when aborting a torrent creation process. Closes #7783. (Chocobo1) - - BUGFIX: Correctly check if torrent passed during application start already exists. (sledgehammer999) - - WEBUI: Add ip subnet whitelist for bypassing webui auth (Thomas Piccirello) - - WEBUI: Fix logo missing in login page (Chocobo1) - - COSMETIC: Fix english typo. (sledgehammer999) - - OTHER: cmake: qtsingleapplication should always be built statically (luigino) - -* Mon Nov 20 2017 - sledgehammer999 - v4.0.0 - - FEATURE: Change qbittorrent logo. Issue #6467. (HVS, Atif Afzal, sledgehammer999) - - FEATURE: New icon theme with SVG source, so we can scale it appropriately in the future. (Bert Verhelst) - - FEATURE: Drop Qt 4 support. Raise minimum Qt version to 5.5.1 (evsh) - - FEATURE: UI for managing locally banned IP list (dzmat) - - FEATURE: Support for specifying where to save/load config files. Support for portable mode. (evsh) - - FEATURE: It is now possible to pass options via ENV variables instead of cmd options. (evsh) - - FEATURE: Allow to strip subfolder in multifile torrents. (glassez, sledgehammer999) - - FEATURE: Allow cmd args to specify options when adding torrents. (Brian Kendall) - - FEATURE: Widget for showing filesystem paths while typing. Used in the Add New Torrent and Options dialogs. (evsh) - - FEATURE: Trackerlist: Allow to toggle columns (thalieht) - - FEATURE: Add availability column to torrent content model and torrent properties window (evsh) - - FEATURE: Implemented share limit by seeding time (naikel) - - FEATURE: Revamp Torrent creator (Chocobo1) - - FEATURE: Enable drag n drop to create torrent on mainwindow (Chocobo1) - - FEATURE: Add show/hide statusbar option (takiz) - - FEATURE: Show number of pieces. Closes #6774. (Chocobo1) - - FEATURE: Allow to select & delete multiple entries in "Manage Cookies" dialog (Chocobo1) - - FEATURE: Fetch Favicons via google as a final fallback (KingLucius) - - FEATURE: Add a Tags (multi-label) feature to the GUI. Closes #13. (tgregerson) - - FEATURE: Use the system icons for each file type in the Content tab (evsh) - - FEATURE: Use SVG files for monochrome tray icons. Closes #6085. (evsh) - - FEATURE: Prefill torrent name when creating a new torrent. Closes #7229. (Chocobo1) - - FEATURE: Expose more libtorrent options in advanced settings (Chocobo1) - - FEATURE: Add comboBox for selecting BitTorrent protocol. Closes #6316. (Chocobo1) - - FEATURE: Allow SMTP sender to be set. Closes #7575. (Chocobo1) - - FEATURE: Allow to specify if announcing to all tiers is desired. (sledgehammer999) - - FEATURE: Configurable number of history of paths in Add New Torrent dialog. (evsh) - - BUGFIX: Adjust icons names to better fit FDO scheme (evsh) - - BUGFIX: Optimized IP filter parsing, making blazingly fast (sledgehammer999, evsh) - - BUGFIX: Fix dialogs didn't position on the correct screen which qBittorrent window is on. Closes #1690, #2474, #3538. (Chocobo1) - - BUGFIX: Refactor and improve StatusBar (glassez) - - BUGFIX: Set expiration date for newly added cookie to +2 years from now, instead of +99 years. (Chocobo1) - - BUGFIX: Don't create subfolder inside temp folder (glassez) - - BUGFIX: Don't replace existing files when relocating torrent (glassez) - - BUGFIX: Fix explicit Torrent Management Mode in Add New Torrent dialog. Closes #5602. (sledgehammer999) - - BUGFIX: Fix calculation of 'Average time in queue' stat under libtorrent 1.1.x (sledgehammer999) - - BUGFIX: Don't disable bandwidth scheduler when manually switching speed limits. Closes #7306. (glassez) - - BUGFIX: Fix dereferencing freed pointer. Closes #7420. (Chocobo1) - - BUGFIX: Change the default cache size to 64MiB. (Chocobo1) - - BUGFIX: The previous "Disk write cache size" is not accurate since it is also being used for read cache, so rename it to "Disk cache". (Chocobo1) - - BUGFIX: Replace dialog ok-cancel buttons with QDialogButtonBox, which follows the platform specific button order. (Chocobo1) - - BUGFIX: Better reporting of success/failure of torrent and file deletion. (sledgehammer999) - - BUGFIX: Fix last activity calculation. Closes #7461. (Chocobo1) - - BUGFIX: Save state of options windows on cancel too. (silverqx) - - BUGFIX: Persist size and treeview header state in preview dialog. (silverqx) - - BUGFIX: Show torrent name in "add new torrent" dialog on merging trackers (Chocobo1) - - BUGFIX: Properly pre-select the selected torrent's current ratio limiting options in UpDownRatioDlg dialogs. Fixes #7352 (thalieht) - - BUGFIX: Optimize code for SpeedWidget. (dzmat) - - BUGFIX: Disable processing events when adding torrents(prevents crashes). Closes #7436. (Chocobo1) - - BUGFIX: Open links in browser. Closes #7651. (Chocobo1) - - BUGFIX: Change default settings for tracker/tier announces to mimic μTorrent behavior. (sledgehammer999) - - BUGFIX: Explicitly set UPnP state on start-up. Closes #7338. (Chocobo1) - - BUGFIX: Include/print caught signal in stackdump (Chocobo1) - - COSMETIC: Trackerlist: Set text alignment of columns with numbers to the right (thalieht) - - COSMETIC: Enable alternatingRowColors for "Manage Cookie" dialog (Chocobo1) - - COSMETIC: Remove indentation for category/tag filter widgets in all platforms (thalieht) - - COSMETIC: Add space between widgets in left side panel. Closes #7224. (Chocobo1, glassez) - - COSMETIC: Unify preference window borders across the tabs (vit9696) - - COSMETIC: Center Options dialog when showed. (silverqx) - - COSMETIC: Show delete accelerator key in menu. closes #7508 (Nick Korotysh) - - COSMETIC: Set QTextOption::NoWrap property in "Download from URLs" dialog (Chocobo1) - - COSMETIC: Use SVG icons for the country flags. Closes #6223. (sledgehammer999) - - WEBUI: Allow to load/use ECDSA certificate in webUI. (Chocobo1) - - WEBUI: Add copy options to webui context menu (addresses #6815) (#7036) (Tom Piccirello) - - WEBUI: Set torrent location from webui context menu (addresses #6815) (#7062) (Tom Piccirello) - - WEBUI: Add option to rename torrent from WebUI (Thomas Piccirello) - - WEBUI: Add auto torrent management to webui context menu (addresses #6815) (Thomas Piccirello) - - WEBUI: Option for "Create subfolder" when adding new torrent. (thalieht) - - WEBUI: Fix addPaused wrong default behavior. (Chocobo1) - - WEBUI: Reposition "Priority" menu option in WebUI to match gui. Closes #7072. (Thomas Piccirello) - - WEBUI: Report TCPServer errorString() if webui fails to listen to port. (Matthew Fioravante) - - WEBUI: Exit gracefully when failed to initialize web server with qbt-nox (Chocobo1) - - WEBUI: Add file-to-piece-index mappings in /query/propertiesFiles command (Chocobo1) - - WEBUI: Add optional parameters for /command/download & /command/upload (Chocobo1) - - WEBUI: Print error messages upon receiving invalid header fields. (Chocobo1) - - WEBUI: Add WebUi\Address config option. (Matthew Fioravante) - - WEBUI: Reinitialize webUI server when "IP address" setting changed. An app restart won't be necessary from now on. (Chocobo1) - - WEBUI: Improve log and error messages (Chocobo1) - - SEARCH: Use explicit class for search plugin versions (evsh) - - SEARCH: Remove all search plugins from repo. There is another repo named 'search-plugins'. (sledgehammer999) - - SEARCH: Update the backend when a new plugin favicon is downloaded. (sledgehammer999) - - SEARCH: Allow search plugins sorting. Closes #7526. (Nick Korotysh) - - RSS: Redesigned RSS subsystem (glassez) - - RSS: Do not use hardcoded colors in RSS feed view (evsh) - - RSS: Improve RSS events logging (glassez) - - WINDOWS: Use dpiawareness=1 on Windows. Closes #5393. (sledgehammer999) - - WINDOWS: Reformat Windows build configuration files. (glassez) - - LINUX: Allow custom tray icons when system icon theme is used. Closes #7403. (evsh) - - MACOS: Various macOS UI improvements (vit9696) - - MACOS: Fix main menu item location on macOS (vit9696) - - MACOS: Fix macOS window restoration after using hide icon (vit9696) - - MACOS: Fix notification display on macOS (vit9696) - - OTHER: Use new classes/methods from libtorrent and stop using deprecate ones. (glassez) - - OTHER: Various string fixes (Allan Nordhøy, sledgehammer999) - - OTHER: cmake: do not use Qt5Widgets when locating QtSingleApplication. Closes #7551. (evsh) - - OTHER: Update BOOST m4 macros and simplify AX_BOOST_BASE usage (Chocobo1) - - OTHER: Drop OS/2 support. (sledgehammer999) - - OTHER: Optimize file size of PNG and SVG files. (sledgehammer999) - - OTHER: Add new translators in the About page. +* Thu Aug 03 2017 - sledgehammer999 - v3.3.15 + - BUGFIX: Temporary subfolder wasn't being deleted. (glassez) + +* Tue Jul 18 2017 - sledgehammer999 - v3.3.14 + - BUGFIX: Set interface for outgoing traffic(libtorrent 1.1.x series). (evsh) + - WEBUI: Fix KEEP_ALIVE_DURATION value (Chocobo1) + - WEBUI: Relax CSRF defense. Closes #6882. Allow HTTP request which has neither Origin nor Referer header included. (Chocobo1) + - WEBUI: Skip username/password check for active sessions (closes #6860) (Thomas Piccirello) + - WEBUI: Fix javascript errors and follow best practices (Thomas Piccirello) + - WEBUI: Fix value comparison. Closes #7081. (Chocobo1) + - WEBUI: Avoid modifying request headers (Chocobo1) + - WEBUI: Implement HTTP host header filtering. This filtering is required to defend against DNS rebinding attack. Fixes security issues reported by @beardog108 privately. (Chocobo1) + - WEBUI: Add Status column to webui (addresses #6815) (#7032) (Tom Piccirello) + - WEBUI: Bump API_VERSION and API_VERSION_MIN to 15. + - SEARCH: Pad shorter python versions. Closes #6877. (sledgehammer999) + - WINDOWS: Updated Arabic, Turkish, Greek, Russian, Danish languages of the installer. (KingLucius, BouRock, thalieht, Andrei Stepanov, scootergrisen) + - WINDOWS: Raise total stack size on Windows to 8 MB. Closes #7021. (Chocobo1) + - LINUX: Systemd service with user switch and other fixes/optimizations. (anton.latukha) * Thu Jun 01 2017 - sledgehammer999 - v3.3.13 - BUGFIX: Fixed UI glitch about torrent numbers in the sidepanel. Fixes #6454. (evsh) @@ -426,7 +98,7 @@ - FEATURE: Use Ctrl+F to search torrents. Closes #5797. (Tim Delaney) - FEATURE: Transferlist: add hotkeys for double click and recheck selected torrents (thalieht) - FEATURE: Add hotkey for execution log tab, Trackerlist, Peerlist etc (thalieht) - - FEATURE: Separate seeds from peers for DHT, PeX and LSD (thalieht) + - FEATURE: Seperate seeds from peers for DHT, PeX and LSD (thalieht) - BUGFIX: Do not remove added files unconditionally. Closes #6248 (Eugene Shalygin) - BUGFIX: Ignore mouse wheel events in Advanced Settings. Closes #866. (Chocobo1) - BUGFIX: Add queue repair code. It should fix missing torrents after restarting. (Eugene Shalygin, nxd4) @@ -438,7 +110,7 @@ - BUGFIX: TransferListWidget: keep columns width even if they are hidden on qBittorrent startup (unless something goes wrong) (thalieht) - BUGFIX: fix index overflow for torrents with invalid meta data or empty progress (Falco) - BUGFIX: Immediately update torrent_status after manipulating super seeding mode. Partially fixes #6072. (sledgehammer999) - - BUGFIX: Use case-insensitive comparison for torrent content window. Closes #6327. (Chocobo1) + - BUGFIX: Use case-insensitive comparsion for torrent content window. Closes #6327. (Chocobo1) - BUGFIX: Fixed sort order for datetime columns with empty values (closes #2988) (Vladimir Sinenko) - BUGFIX: Disable proxy in WebUI HTTP server. Closes #6349. (Eugene Shalygin) - COSMETIC: Use a disabled progressbar's palette for unselected files. (sledgehammer999) @@ -566,12 +238,12 @@ - FEATURE: Add option to automatically remove .torrent files upon adding (Eugene Shalygin) - FEATURE: Add option to bind directly to an IP instead of using a network Interface (Sjoerd van der Berg, sledgehammer999) - FEATURE: Detailed tooltips on the progress and availability bars in the General button of each torrent. (Eugene Shalygin) - - FEATURE: Let user able to specify a filter when choosing an IP filter file (Chocobo1) + - FEATURE: Let user able to specifiy a filter when choosing an IP filter file (Chocobo1) - FEATURE: Improve usability of "Run External Program". Users can write (platform dependent) shell scripts now. (Chocobo1) - PERFORMANCE: Optimize drawing in speed graph (Anton Lashkov, Chocobo1) - BUGFIX: Fix memory leak. (sledgehammer999) - BUGFIX: Fix resizing bug in "add torrent dialog". Closes #5036. (Chocobo1) - - BUGFIX: Fix qBittorrent doesn't exit immediately when "all downloads are done -> exit" option enabled. (glassez, Chocobo1) + - BUGFIX: Fix qBittorrent doesn't exit immediately when "all donwloads are done -> exit" option enabled. (glassez, Chocobo1) - BUGFIX: Display the filepath when a torrent fails to load. Closes #100 and #805. (sledgehammer999) - BUGFIX: Fix Add tracker dialog empty trackers (ngosang) - BUGFIX: Fix Add tracker dialog URL download (ngosang) @@ -624,9 +296,10 @@ - OTHER: Enable access to shutdown functions when configured with `--disable-gui` option (Chocobo1) - OTHER: Delete Import Torrent Dialog. Just use the "add new torrent" dialog. (glassez) - OTHER: Optimize code for natural sorting (Chocobo1) - - OTHER: Use new alert dispatching API for libtorrent 1.1.x (glassez) + - OTHER: Use new alert dispathing API for libtorrent 1.1.x (glassez) - OTHER: Fix gcc 6 compilation with qmake. See #5237. (sledgehammer999) + * Tue Mar 29 2016 - sledgehammer999 - v3.3.4 - FEATURE: Download more pieces in "Download first and last pieces first" feature (ngosang) - FEATURE: Unlock first column in peerlist too (thalieht) @@ -758,6 +431,7 @@ - COSMETIC: Use QLineEdit built-in ClearButton (Qt5 only) (Chocobo1) - COSMETIC: Change text description for half-open connection (Chocobo1) - OTHER: Change update URL to FossHub. Closes #4188. (sledgehammer999) + * Sun Nov 29 2015 - sledgehammer999 - v3.3.0 - FEATURE: Huge core code refactoring. Problems with labels, temp folders etc should be eliminated. Smoother UI should be observed too. (glassez) @@ -811,166 +485,6 @@ - OTHER: Reduce max value of "Disk cache size" to 1536MB for 32bit. Closes to #4028. (Chocobo1) - OTHER: Make "Download in sequential order" and "Download first and last piece first" options independent. (glassez) -* Sat Oct 31 2015 - sledgehammer999 - v3.2.5 - - BUGFIX: Fix difficult to reproduce crash. (glassez) - - OTHER: Fix Windows' Qt5 build. (Gelmir) - -* Sat Oct 10 2015 - sledgehammer999 - v3.2.4 - - FEATURE: Select the file of single file torrents when opening destination folder (pmzqla) - - BUGFIX: Fix crash with invalid favicon. Closes #3632. (glassez) - - BUGFIX: Try to download favicon.png when the download of favicon.ico fails (pmzqla) - - BUGFIX: Try to avoid loading a corrupted configuration file. Also log errors encountered while saving/loading the configuration. Closes #3503. (sledgehammer999) - - BUGFIX: Allow adding torrent link from Torcache (jsayol) - - BUGFIX: Don't limit the number of torrents that can be announced to the tracker/dht/lsd. Closes #3473. (sledgehammer999) - - BUGFIX: Fix potential crash when memory allocation failed. Closes #3877. (Chocobo1) - - COSMETIC: Change Queue buttons order in the Toolbar (GUI & Web UI) (ngosang) - - COSMETIC: Move option "Ignore transfer limits on local network" to Speed page (Chocobo1) - - COSMETIC: Move option "Confirm torrent deletion" to Behavior page (Chocobo1) - - COSMETIC: Fix typos. Make `μTP` untranslatable. Use American variation of words. Closes #3654. (sledgehammer999) - - COSMETIC: Optimize text color for dark themes. Closes #3633 and #3815. (sledgehammer999) - - COSMETIC: Show current label in the torrent context menu. Closes #3776. (sledgehammer999) - - WEBUI: Add save_path to /query/torrents (Casey Bodley) - - WEBUI: Bump API_VERSION to 5 - - SEARCH: Fix python detection when the 'Anaconda' software is installed. Closes #3731. (sledgehammer999) - - RSS: Handle magnet links as torrents instead of news URLs. Closes #3560 (ngosang) - - RSS: Trim elements text in RSS articles (ngosang) - - RSS: Fix contextual menu in RSS torrents list (ngosang) - - RSS: Improve error handling when a RSS feed doesn't contain torrents (ngosang) - - RSS: More precise message and code simplification in RSS feeds deletion (ngosang) - - RSS: Don't hide the elements in Unread list when clicked (ngosang) - - RSS: Allow multiple selection in RSS torrents list (ngosang) - - RSS: Simplify string translation (ngosang) - - RSS: Handle more types of RSS feeds (ngosang) - - RSS: Fix RSS panel position not saved (ngosang) - - RSS: Fix forgetting label changes to first item in RSS rule list. (Gelmir) - - RSS: Add label to UI when a new one is creating during rule addition. (Gelmir) - - RSS: Removes refresh message when adding a new feed (ngosang) - - RSS: Fix RSS crash when deleting RSS feeds. Closes #997, #2152, #2461, #3718, #3747, #3766, #3806, #3814, #3829 and #3846. (ngosang) - - RSS: Sort labels in RSS Downloader dialog, closes #3140. (Chocobo1) - - WINDOWS: Correctly show german letters in the installer. Closes #3574, #3566. (sledgehammer999) - - WINDOWS: Fix file selection on Explorer when the filename contains weird characters. Closes #3185. (sledgehammer999) - - WINDOWS: Fix wrong default download directory in Windows. Closes #2625. (Chocobo1) - - WINDOWS: Fix German translation of the installer. (netswap) - - LINUX: Fix broken .desktop file icon for some locales. See #3905. (sledgehammer999) - - OTHER: Fix ppc64le detection during configure (sledgehammer999) - - OTHER: Don't use sed in configure. Closes #3169. (pmzqla) - - OTHER: Fix broken donation link. Closes #3771. (sledgehammer999) - - OTHER: Add forum link in README. Closes #3853. (sledgehammer999) - - OTHER: New translation: Esperanto - - OTHER: Fix Qt5 nox build on non-Windows. (sledgehammer999) - -* Sun Aug 02 2015 - sledgehammer999 - v3.2.3 - - BUGFIX: Fix crash when closing a search tab while search is running (pmzqla) - - SEARCH: Other minor search fixes and improvements (pmzqla) - -* Sat Aug 01 2015 - sledgehammer999 - v3.2.2 - - FEATURE: Allow to force reannounce DHT too (Chocobo1) - - FEATURE: Implement an option to disable confirmation of torrent recheck (blaxspirit) - - FEATURE: Allow to copy all the trackers with a keyboard shortcut (pmzqla) - - BUGFIX: Fix torrent renaming. Closes #3398 (ngosang) - - BUGFIX: Fix localhost address (::ffff:127.0.0.1) is not recognized when connecting to WebUI (Chocobo1) - - BUGFIX: Fix '&' character in label name becomes accelerator key, closes #3454. (Chocobo1) - - BUGFIX: Fix HTTP header parsing when torrent filename contains a semicolon. Closes #3511. - - BUGFIX: Fix installing search plugin from local file. (sledgehammer999) - - BUGFIX: Fix installing search plugin by drag-n-dropping file. (sledgehammer999) - - COSMETIC: Update color scheme of completed.png icon. (sledgehammer999) - - COSMETIC: Fix printing of the copyright symbol in the About dialog. (sledgehammer999) - - COSMETIC: Minor changes in Preview File dialog (ngosang) - - COSMETIC: Add Force Resume icon (ngosang) - - COSMETIC: Add count of unread items to RSS tab label (pmzqla) - - WEBUI: Ports between 1 and 65535 as in the GUI. Closes #1602 (ngosang) - - WEBUI: Fix an error in Content tab when the torrent doesn't have metadata (ngosang) - - WEBUI: New option Web UI port UPNP. Closes #3358 (ngosang) - - WEBUI: Fix API Content Types. Closes #3393 (ngosang) - - WEBUI: Fix empty trackers addition (ngosang) - - WEBUI: Torrent download from hash. Closes #1173 (ngosang) - - WEBUI: Fix sort by queue number (ngosang) - - WEBUI: Open external links in a new window/tab (ngosang) - - WEBUI: Massive increase in performance. (ngosang) - - SEARCH: Search status per tab (DoumanAsh) - - SEARCH: Remove the word 'torrent' in ExtraTorrent results (ngosang) - - SEARCH: Prefer python3 over python2 on Linux and OS X (pmzqla) - - SEARCH: Show notification if Python is not found and a search is started (pmzqla) - - SEARCH: Update link to the Windows Python installer (pmzqla) - - SEARCH: Improve checks for python. Print python version and path to log. (sledgehammer999) - - SEARCH: Improve Python detection (ngosang) - - OTHER: Improvements on the build system (Chocobo1) - - OTHER: Bump minimum libtorrent version required to 1.0.6/0.16.19. (sledgehammer999) - - OTHER: New translation: Slovenian - -* Sat Jul 11 2015 - sledgehammer999 - v3.2.1 - - FEATURE: Change default preferences (ngosang) - - FEATURE: Add "Add link to torrent" menu in TrayIconMenu. Closes #2918. (Chocobo1) - - FEATURE: Allow to Open files from the properties pane by pressing "Enter" (pmzqla) - - FEATURE: Add checkbox option for IpFilterTrackers. (Chocobo1) - - FEATURE: Download-from-URL textbox change focus on tab key (Mayank Asthana) - - FEATURE: Increase priority value of "High" (pmzqla) - - FEATURE: Add 16 KiB, 8 MiB and 16 MiB piece sizes in Torrent Creator (ngosang) - - BUGFIX: Disable Auto piece size when creating a new torrent (ngosang) - - BUGFIX: Set default focus to cancel button in delete confirm dlg, closes #3085 (Chocobo1) - - BUGFIX: Set default focus to ok button in add new torrent dlg (Chocobo1) - - BUGFIX: Set default focus to no button in exit confirm box (Chocobo1) - - BUGFIX: Fix Start Minimized checkbox in Options (ngosang) - - BUGFIX: Remove limits on alternative speeds setting (LazyBui) - - BUGFIX: Fix sorting torrents by ETA (pmzqla) - - BUGFIX: Improve ratio calculation formula. Closes #3096. (Chocobo1) - - BUGFIX: Clear missing files flag when resuming or force rechecking. Fixes issues in #2750. (sledgehammer999) - - BUGFIX: Delete tempfile when downloading favicon.ico. Closes #3257. (sledgehammer999) - - BUGFIX: Don't close downloadFromURL dialog when showing empty url warning (Chocobo1) - - BUGFIX: Minimize to tray only if the relevant option is enabled. (sledgehammer999) - - BUGFIX: Update disk space label after changing partition, closes #3309. (Chocobo1) - - BUGFIX: Don't use a default upload limit. Closes #3275. (sledgehammer999) - - BUGFIX: Fix Properties bar size when started minimized to tray. Closes #3206. (sledgehammer999) - - COSMETIC: Change option text "Confirmation on exit when torrents are active" (Chocobo1) - - COSMETIC: Enable to choose dark/light tray icons on all platforms. (Chocobo1) - - COSMETIC: Use AllUppercase for label text (Chocobo1) - - COSMETIC: changes in typography (ngosang) - - COSMETIC: Menu revamp (Chocobo1) - - COSMETIC: Revamp general tab info (Chocobo1) - - COSMETIC: Better update message for users (Chocobo1) - - COSMETIC: Fix ugly 'C++' wrapping in About dialog. (glassez) - - WEBUI: Fix login and logout relative URLs (ngosang) - - WEBUI: Fix resumeAll and pauseAll. Closes #3016 (ngosang) - - WEBUI: Changes in title bar (ngosang) - - WEBUI: Complete translatable strings (ngosang) - - WEBUI: Minor changes in style (ngosang) - - WEBUI: Fix Max connections and Time active in transfer information (ngosang) - - WEBUI: New config - Global maximum number of upload slots (ngosang) - - WEBUI: Display wasted data with friendly units. Closes #2994 (ngosang) - - WEBUI: add delay in shutdown command in order to send out response msg (Chocobo1) - - WEBUI: Option to hide Top Toolbar (ngosang) - - WEBUI: Reorder the tabs/groups in Options window (ngosang) - - WEBUI: Add new options (ngosang) - - WEBUI: Increase API_VERSION due to changes in #3279, #3197, #3226 and #3040 (ngosang) - - WEBUI: Add Web Seeds (HTTP Sources) tab (ngosang) - - WEBUI: Don't update the tabs if tab's panel is collapsed (ngosang) - - WEBUI: Fix alternative global rate limits. (ngosang) - - SEARCH: Fix thepiratebay. Closes #3012 (ngosang) - - SEARCH: Improve torrentz engine to return more results (ngosang) - - SEARCH: Change width of columns in search tab. Closes #764 (ngosang) - - SEARCH: Make strings translatable in search engine (ngosang) - - SEARCH: Aborting search engine process during closure. Close #2671 (DoumanAsh) - - SEARCH: Perform searches in parallel (DoumanAsh) - - SEARCH: Add Demonoid search engine (ngosang) - - SEARCH: Minor fixes in search engines (ngosang) - - SEARCH: Show the version of search engines (ngosang) - - SEARCH: Update Legit Torrent to remove sgmllib (DoumanAsh) - - SEARCH: Update KickassTorrents (ngosang) - - SEARCH: Update BTDigg (ngosang) - - SEARCH: Update Torrentz (ngosang) - - SEARCH: Update ExtraTorrent (ngosang) - - SEARCH: Update TorrentReactor (ngosang) - - SEARCH: Fix Python 2 implementation of Torrentz (ngosang) - - SEARCH: Cosmetic changes in search engine (ngosang) - - SEARCH: Fix column sort in search engine. Closes #2621 (ngosang) - - RSS: Update matching RSS articles while editing rules (pmzqla) - - WINDOWS: Fix python detection from registry when multiple versions are installed (sledgehammer999) - - LINUX: Fixes Linux issue for when the theme doesn't have a corresponding icon. (sledgehammer999) - - OTHER: Correctly detect FreeBSD when configuring. (sledgehammer999, yurivict) - - OTHER: Add translator to credits. - - OTHER: New translation: Indonesian. - - OTHER: Split Chinese locales into Chinese Simplified, Chinese Traditional(Taiwan), Chinese Traditional(Hong Kong). (sledgehammer999) - * Sun May 10 2015 - sledgehammer999 - v3.2.0 - FEATURE: Show actual protocol for listen success/failure in the log. Needs libtorrent v1.0.0 (Gelmir) - FEATURE: Support per tracker re-announce. Needs libtorrent v1.0.0 (Gelmir) @@ -1061,208 +575,6 @@ - OTHER: Backtrace generation now works on MinGW. (Gelmir) - OTHER: New translation: Hindi(India). -* Wed Feb 22 2015 - sledgehammer999 - v3.1.12 - - OSX: Fix build to work with older machines. (sledgehammer999, Noctem) - - WINDOWS: Fix automatic Python download. (sledgehammer999) - - WINDOWS: Fix crashes due to memory corruption and improve Python registry searching. (glassez) - -* Wed Oct 22 2014 - sledgehammer999 - v3.1.11 - - FEATURE: Allow relative torrent paths when qBittorrent is already running (pmzqla) - - FEATURE: Make Windows icons suitable for high dpi screens (pmzqla) - - FEATURE: Increase maximum size of system icons (pmzqla) - - BUGFIX: Fix crash in the "Content" widget when user would right click in it without a torrent selected (Ivan Sorokin) - - BUGFIX: Don't show multiple unlock UI dialogs. Closes #2040. (sledgehammer999) - - SEARCH: Fix bug where python would falsely be detected and nothing worked (paolo-sz) - - SEARCH: Fix TorrentReactor search plugin (Bruno Barbieri) - - SEARCH: Fix search engine encoding issues with python3 on Windows (Bruno Barbieri) - - SEARCH: Pirate bay search engine update (DoumanAsh) - - SEARCH: Internal improvements in the python code (Bruno Barbieri) - - WINDOWS: Fix magnet link association. Closes #1952. (sledgehammer999) - - WINDOWS and OSX: Fix again the program updater. The url was changed by sourceforge.net. Closes #1954. (sledgehammer999) - - OSX: Fix compilation (sledgehammer999) - - WEBUI: Set correct HTTP Content-Type in case of forbidden access. (pmzqla) - - COSMETIC: Remove unneeded tooltip (pmzqla) - - COSMETIC: Don't stretch the last section in the transfer list (pmzqla) - - COSMETIC: Set minimum width of the left panel in the preferences (pmzqla) - - OTHER: Optimize sorting of rows. This should have less CPU impact when many torrents are present. (Ivan Sorokin) - - OTHER: Use the correct character encoding for exceptions coming from libtorrent. (sledgehammer999) - - OTHER: Use boost:bind() as the docs show. Allows compilation with older gcc versions. (sledgehammer999) - -* Sun Sep 21 2014 - sledgehammer999 - v3.1.10 - - FEATURE: Allow disabling of OS cache. This will prevent RAM increases on Windows when seeding many files. Closes #1699. (sledgehammer999) - - FEATURE: Add 'Completed' column. Closes #1241. (sledgehammer999) - - FEATURE: Added 'Ratio Limit' column. Closes #936. (sledgehammer999) - - FEATURE: Add 'Open' and 'Open Containing Folder' entries in the content's right-click menu. Closes #1143. (sledgehammer999) - - FEATURE: Don't listen on IPv6 address by default. Prevents network connectivity problems. Closes #1880. (sledgehammer999) - - FEATURE: Added 'Shutdown now' button in shutdown confirmation dialog. Closes #969. (sledgehammer999) - - FEATURE: Add peer port column to PeerListWidget. Closes #1650. (Ivanov Juriy) - - COSMETIC: Fix weird ratio values when torrent was imported or downloaded history was lost due to crash. (sledgehammer999) - - COSMETIC: Use 'μTP' instead of 'uTP'. (sledgehammer999) - - COSMETIC: Show the loaded torrents in the transferlist when qBT is launched with a torrent/magnet and the AddNewTorrentDialog is showing. Closes #1564. (sledgehammer999) - - COSMETIC: Don't mix finished/unifinished torrents when sorting by ETA. Closes #1688. (sledgehammer999) - - COSMETIC: Sort finished torrents by completed date when sorting by queue number. (sledgehammer999) - - COSMETIC: Right align numerical values in the transfer list. Partially revert 51a9a9aab. Closes #1903. (sledgehammer999) - - COSMETIC: Don't display the Search Engine tab by default. (sledgehammer999) - - WINDOWS: Correctly associate torrents and magnet links with qBittorrent under non-admin accounts. Closes #291 #527 #579 #614 #964. (glassez, sledgehammer999) - - WINDOWS: Check for python before creating the search engine tab. Prevents the creation of python specific files in the user's PC if no python is found. Closes #1370. (sledgehammer999) - - WINDOWS: Don't create keys in the registry if python isn't found. Closes #1370. (sledgehammer999) - - WINDOWS: Can now correctly detect 64bit and 32bit python installations on 64bit Windows. Closes #1148 #445 #795 #1708. (sledgehammer999) - - WINDOWS: Search first in PATH for python. Closes #956. (sledgehammer999) - - OSX: Enable system tray in MACOSX (Nick Korotysh). - - OSX: Fix headless (nox) build. (sledgehammer999) - - WEBUI: Correctly save/load settings and other improvements (glassez) - - WEBUI: Removed broken 'Report a bug' iframe. Closes #1343 (Benjamin Hutchins) - - WEBUI: Removed broken 'Documentation'. Improves fix for #1343 (Benjamin Hutchins) - - WEBUI: Removed essentially useless 'Visit website' iframe and changed it to a regular link. Improves fix for #1343 (Benjamin Hutchins) - - BUGFIX: Fix RSS feed icon. The tmp file gets deleted in the feed destructor. Closes #1639 (sledgehammer999) - - BUGFIX: fix issue #1674: AddNewTorrentDialog is shown again and again even if checkbox "don't ask me again" is set (Ivan Sorokin) - - BUGFIX: Don't show availability bar for magnet links (Ivan Sorokin) - - BUGFIX: Fix crash when the selected torrent disappears from the transfer list. Closes #1661 (sledgehammer999) - - BUGFIX: Fix tracker announcing problem(hit-and-run) when many torrents are being active. Closes #1571 (sledgehammer999) - - BUGFIX: Count magnet links in the 'downloading' filter and make them prevent system inhibition. Closes #1558 (sledgehammer999) - - BUGFIX: Pick up updated plugins. Closes #1745. (sledgehammer999) - - BUGFIX: Bring mainwindow in front when notification is clicked and other windows are in front. (sledgehammer999) - - BUGFIX: Speedup torrent moving (Ivan Sorokin) - - BUGFIX: Fix bug when moving a torrent before the previous move is completed (Ivan Sorokin) - - BUGFIX: Add option to hibernate computer in Auto-Shutdown menu (Bruno Barbieri) - - BUGFIX: Fix column resizing issues (Bryan Roscoe) - - BUGFIX: Fix possible crashes. Closes #1814. (sledgehammer999) - - BUGFIX: Limit max cache to 1800MiB for 32bits compiled binaries and to 4GiB for other. Closes #1698. (sledgehammer999) - - BUGFIX: Don't localize double numbers in the webui. Closes #1525. (sledgehammer999) - - BUGFIX: Don't shrink transferlist rows when scrolling horizontally. Closes #1613. (sledgehammer999) - - BUGFIX: When qBT is launched with a magnet don't show it in the transferlist while the metadata are being loaded in the background. (sledgehammer999) - - BUGFIX: Show disk space while retrieving metadata. Closes #1693. (sledgehammer999) - - BUGFIX: Don't disable DHT/LSD/UPnP in the GUI when anonymous mode is enabled. (sledgehammer999) - - BUGFIX: Possible fix for crash in RSS code. Closes #1901. (sledgehammer999) - - BUGFIX: Fixed SMTP emailing code (Ivanov Juriy, sledgehammer999) - - BUGFIX: Don't display the context menu in 'Content' and 'HTTP Sources' buttons when no torrent is selected. It prevents crashes. Closes #1906, #1900. (sledgehammer999) - - BUGFIX: Don't translate file extensions. Closes #1907. (sledgehammer999) - - BUGFIX: Fix available disk space label on single file torrents. (sledgehammer999) - - BUGFIX: Show stalled downloads that are uploading under the 'Active' filter. Closes #1654." (sledgehammer999) - - BUGFIX: fix import torrent with "Keep incomplete torrents in:" enabled (lojack5) - - BUGFIX: Send a spoofed user agent for the search engines(fixes some of them) (Martin Janco) - - BUGFIX: Support URLs that redirect to magnet links (Gelmir) - - BUGFIX: Consider queued items before deciding to 'auto-shutdown on downloads completion'. Closes #1942. (sledgehammer999) - -* Tue Apr 29 2014 - sledgehammer999 - v3.1.9.2 - - OTHER: The v3.1.9.1 Windows build was broken - -* Mon Apr 28 2014 - sledgehammer999 - v3.1.9.1 - - OTHER: This is an excuse to produce new builds with an OpenSSL version that isn't affected by the heartbleed bug for Windows and Mac. This bug should only affect the WebUI and only if HTTPS/SSL authentication was enabled. - -* Sat Mar 01 2014 - sledgehammer999 - v3.1.9 - - BUGFIX: Fix nox build. Closes #1368 (bob23450) - - BUGFIX: Fix build with libtorrent 0.15.x (sledgehammer999) - - BUGFIX: Fix missing percentage signs. Closes #1392. (sledgehammer999) - - BUGFIX: Fix queue sorting order. (alfrix) - - BUGFIX: Fix build using qt < 4.7 Closes #1385. (Evgeny Lensky) - - BUGFIX: Fix autoupdater. Send our user-agent to sourceforge.net (sledgehammer999) - - FEATURE: Add button for links in toolbar (alfrix) - -* Sun Feb 02 2014 - sledgehammer999 - v3.1.8 - - BUGFIX: Really fix build of v3.1.6 - -* Sun Feb 02 2014 - sledgehammer999 - v3.1.7 - - BUGFIX: Fix build of v3.1.6 - -* Sun Feb 02 2014 - sledgehammer999 - v3.1.6 - - BUGFIX: Fix 'preview file' regression. Closes #1285. (sledgehammer999) - - BUGFIX: Fix peers and seeds sorting in transfer list. (Angel Alonso) - - BUGFIX: Fix btdigg search engine. (BTDigg research team) - - BUGFIX: Save statistics every 15min and only if there was new traffic. Fixes #1288 and partially #1272. (sledgehammer999) - - BUGFIX: Fix share ratio text in the 'general' tab. (sledgehammer999) - - BUGFIX: Output a more generic message when blocking IPs and don't use italics in the log. (sledgehammer999) - - BUGFIX: Allow 2 decimals when setting the share ratio. Closes #1303. (sledgehammer999) - - BUGFIX: Fix extratorrents search plugin. (sledgehammer999) - - BUGFIX: Use shorter names for amount columns in main UI (Gelmir) - - BUGFIX: Fix overstretched options dialog. Closes #1293. (sledgehammer999) - - BUGFIX: Don't show a popup menu when no torrent is selected. (sledgehammer999) - - BUGFIX: Launch external programs async and don't block. Closes #1252. (sledgehammer999) - - BUGFIX: Don't re-announce to trackers when torrent is paused. Closes #1310. (sledgehammer999) - - BUGFIX: Bring dialog boxes in the front when qbt doesn't have focus. (sledgehammer999) - - BUGFIX: Correctly resize 'name' column of the content tab. Closes #1360. (sledgehammer999) - - BUGFIX: Correctly restore 'name' column width when loading magnet links in the 'Add new torrent dialog'. Closes #1334. (sledgehammer999) - - WEBUI: Fix sorting by size in WebUI when non-default locale used. (Vladimir Golovnev) - - UI: Reposition statistics menu item. (sledgehammer999) - - UI: Convert more accurately decimal numbers to text. (sledgehammer999) - - WINDOWS/OSX: Improvements on the behavior of the program updater(closes #1282) (sledgehammer999) - - LINUX: Explicitle tell that we don't support freedesktop's startup notify standard. Fixes GNOME issues. Closes #1217. (sledgehammer999) - - LINUX: Add our WM_CLASS in the .desktop file so window managers know how to group our windows. (sledgehammer999) - - OTHER: Sync translations from Transifex. - -* Thu 16 Jan 2014 - sledgehammer999 - v3.1.5 - - BUGFIX: Fix compilation with Qt 4.7. Closes #1215. (sledgehammer999) - - BUGFIX: Third attempt at fixing saving settings on OS shutdown. (sledgehammer999) - - BUGFIX: Preview now correctly uses the selected file. Closes #1222 #1182. (sledgehammer999) - - BUGFIX: Allow to resize the columns in Add New Torrent dialog. Closes #1207 #676 (sledgehammer999) - - BUGFIX: Ensure that at least one column in the tranferlist is always visible. Closes #1165. (sledgehammer999) - - BUGFIX: Ensure that the options window will always be placed onscreen. Closes #1226. (sledgehammer999) - - BUGFIX: Delete temporary files after they aren't needed. Closes #1188. (sledgehammer999) - - BUGFIX: Correctly detect libtorrent version. (sledgehammer999) - - BUGFIX: Various code cppcheck fixes (Konstantin Goncharik) - - BUGFIX: Remove isohunt search engine and update thepiratebay url (sledgehammer999) - - BUGFIX: Fix rss settings corruption when checking regexp and going to other rule. (Gelmir) - - BUGFIX: Don't count paused torrents for the autoshutdown. Closes #1280. (sledgehammer999) - - LINUX: Fix notifications with xfce4-notifyd. - - OSX: Added basic retina support. Closes #1251. (Sébastien Lavoie) - - OTHER: Sync translations from Transifex. - -* Sun 29 Dec 2013 - sledgehammer999 - v3.1.4 - - FEATURE: Statistics dialog (Gelmir) - - FEATURE: Tooltips explaining each peer's connection flags (sledgehammer999) - - FEATURE: Win/Mac Check for program updates every 15min and allow the user to manually check for updates through the help menu. (sledgehammer999) - - BUGFIX: Better dialog message for torrent delete confirmation (sledgehammer999) - - BUGFIX: Fix resizing grip location. Closes #1146. (sledgehammer999) - - BUGFIX: Lock toolbar in place. Closes #1144. (sledgehammer999) - - BUGFIX: Second attempt at fixing saving settings on shutdown. (sledgehammer999) - - BUGFIX: Sort labels in 'Add new torrent' dialog. Closes #1150 #411. (sledgehammer999) - - LINUX: Fix build under Ubuntu 13.10 (sledgehammer999) - - LINUX: Make sleep and shutdown functions work on systemd's logind (Faheem Pervez) - -* Mon Nov 20 2013 - sledgehammer999 - v3.1.3 - - FEATURE: Add a key shortcut to "Add link to torrent..." (Angel Alonso) - - BUGFIX: Make all columns and headers use the same text alignment in the transferlist. (sledgehammer999) - - BUGFIX: Fix build system for Unix/Linux. (sledgehammer999) - - BUGFIX: Case insensitive sort in Peers list. Closes #1066. (sledgehammer999) - - BUGFIX: Small optimization of WebUI responses when there isn't a data payload. (sledgehammer999) - - BUGFIX: Hide empty folders after filtering. Closes #74. (sledgehammer999) - - BUGFIX: Expand folders when filtering files. Closes #1076. (sledgehammer999) - - BUGFIX: Updated search plugin's URL (Zach Thibeau) - - BUGFIX: Strip some png to fix incorrect sRGB profiles. (Angel Alonso) - - BUGFIX: Fixed font issues on OSX Mavericks (Zach Thibeau) - - BUGFIX: Improve text in the About dialog (Artem S. Tashkinov) - - BUGFIX: Always show a peer IP address as a tool tip (Artem S. Tashkinov) - - BUGFIX: Fix inhibit system functionality. Closes #766. (sledgehammer999) - - BUGFIX: WebUI: Don't gzip too small payloads. (sledgehammer999) - - BUGFIX: Correctly detect if the browser supports gzip compression. (sledgehammer999) - - BUGFIX: Fix WebUI link to 'Anonymous mode' explanation. Closes #1093. (sledgehammer999) - - BUGFIX: Correctly update tracker tier number in the trackers tab. Closes #1075. (sledgehammer999) - - BUGFIX: Speed improvements.(sledgehammer999) - - OTHER: Updated translations. - -* Tue Nov 05 2013 - sledgehammer999 - v3.1.2 - - BUGFIX: Fix WebUI gzip compression. Closes #1037. (sledgehammer999) - - BUGFIX: Fix compilation with qt < 4.8.0. Closes #1043. (sledgehammer999) - - OTHER: Updated translations. - -* Mon Oct 28 2013 - sledgehammer999 - v3.1.1 - - FEATURE: Show external IP in the log. Closes #968. (sledgehammer999) - - FEATURE: Enable gzip compression in the webui. It should be faster now. (sledgehammer999) - - FEATURE: Torrents show more states(queued for checking, downloading metadata, allocating, checking resume). (sledgehammer999) - - FEATURE: Re-enable "force reannounce" to all trackers. (sledgehammer999) - - FEATURE: Allow to clear the UI lock password. Closes #973. (sledgehammer999) - - FEATURE: New translations: English(Australia) and English(United Kingdom) - - BUGFIX: Expose all available translation in the WebUI. Closes #976. (sledgehammer999) - - BUGFIX: Copy IP copied wrong data. Closes #970 (sledgehammer999) - - BUGFIX: "Preview file..." didn't work on single file torrents. (sledgehammer999) - - BUGFIX: Fix and improve the scheduler (Gelmir and sledgehammer999) - - BUGFIX: RSS fixes. Closes #960, #998 (Gelmir) - - BUGFIX: Fix 'append label to save path' with magnet links. (sledgehammer999) - - BUGFIX: Can download up to 10MB .torrent file when a link is provided. Closes #879 (sledgehammer999) - - OTHER: Updated translations. - - LINUX: Fix missing conf.pri error (leigh123linux) - - WINDOWS: Don't remove file associations if they aren't our own. (sledgehammer999) - * Sat Oct 12 2013 - Christophe Dumez and sledgehammer999 - v3.1.0 - FEATURE: Add command line option to daemonize qbittorrent-nox (ngaro) - FEATURE: Add "Shutdown qBittorrent" button to Web UI (ngaro) @@ -1298,120 +610,8 @@ - OTHER: Make peer tab sortable by ip too (Gelmir) - OTHER: Translations moved to Transifex(https://www.transifex.com/projects/p/qbittorrent/) - OTHER: New Translation - Vietnamese (Anh Phan) - - PERFORMANCE: Improve drawing speed of tranferlist when there are many torrents(>100) - - PERFORMANCE: Improve drawing speed of peers list when there are many peers - -* Mon Jul 29 2013 - sledgehammer999 - v3.0.11 - - FEATURE: Allow more fine tuning of upload slots. It should improve speed (sledgehammer999) - - FEATURE: Enable edit/rename via F2 or double click in various places (Gelmir) - - BUGFIX: Fix Spanish and Basque translations being messed up on Windows (sledgehammer999) - - BUGFIX: Don't allow newlines in rename dialog (Gelmir) - - BUGFIX: Treat unfinished dates as the newest ones when sorting (sledgehammer999) - - BUGFIX: Fix text size problem on Windows with custom DPI (sledgehammer999) - - BUGFIX: Respect UI lock when clicking on tray notification (sledgehammer999) - - BUGFIX: Fix kickass torrents search plugin (Gelmir) - - BUGFIX: Use system language as default language. Closes #780 (sledgehammer999) - - BUGFIX: Move completed files to .unwanted folder when they are unselected by the user (constantined) - - BUGFIX: Show delete action when multiple feeds are selected (Gelmir) - - BUGFIX: Use Unicode for libtorrent alert messages (Gelmir) - - OTHER: Update translations - - WINDOWS: Shave off ~4MB from the binary size (sledgehammer999) - - WINDOWS: Remove wrong dependency on msvc2008 runtime (sledgehammer999) - - WINDOWS: Disable stacktrace when building with mingw (Gelmir) - - WINDOWS: Updated NSIS script to include/delete .pdb file. (sledgehammer999) - -* Tue Jul 9 2013 - Christophe Dumez and sledgehammer999 - v3.0.10 - - BUGFIX: Fix LegitTorrents search plugin - - BUGFIX: Improve peer host name resolution (closes #360) - - BUGFIX: Context menu fix in the Web UI - - BUGFIX: Respect 'don't show' torrent dialog in Search (sledgehammer999) - - BUGFIX: Torrent creator can now use files/folders from disk root (Gelmir) - - BUGFIX: Update free disk space when changing drives in the add new torrent dialog (sledgehammer999) - - BUGFIX: Various fixes relating to RSS drag and drop (Gelmir) - - BUGFIX: Properly rename torrent which changes position in filter model (Gelmir) - - BUGFIX: Actually show tray notifications when a torrent finishes downloading (sledgehammer999) - - BUGFIX: Don't download RSS items based on rules still being edited (Gelmir) - - COSMETIC: Native look for the search boxes (Hyperz) - - IMPROVEMENT: Use natural sorting where possible (Gelmir and sledgehammer999) - - LINUX: Drop Boost.Thread dependency from configure script - - OTHER: Update translations. - - OTHER: Drop obsolete Boost.Thread dependency from configure script on linux (Dumez) - - LIBTORRENT: SOCKS5 fixes (0.16.10) - - LIBTORRENT: Fix hanging issue on Windows when closing files (0.16.10) - - LIBTORRENT: Cache can now be returned to the OS (0.16.10) - - PERFORMANCE: Improve drawing speed of tranferlist when there are many torrents(>100) (sledgehammer999) - - PERFORMANCE: Improve drawing speed of peers list when there are many peers (sledgehammer999) - -* Sat Mar 16 2013 - Christophe Dumez - v3.0.9 - - BUGFIX: Raise qBittorrent windows when another instance is launched - - BUGFIX: Show human readable names for network interfaces in preferences (Windows) - - BUGFIX: Fix torrent creator bug when saving non-latin path (Windows) - - BUGFIX: Enable 'copy magnet uri' for torrents without metadata too - - BUGFIX: Fix a few JSON parser issues (Gelmir) - - BUGFIX: Add support for gzipped encoded HTTP responses (daimor) - - BUGFIX: Fix possibly missing "Add torrent" icon (Driim) - - OTHER: Add search plugin for Legit Torrents - -* Sun Jan 20 2013 - Christophe Dumez - v3.0.8 - - BUGFIX: Fix support for --no-splash command line argument - - BUGFIX: Fix compilation error with libtorrent v0.15 - - BUGFIX: Fix search issues with Python3 - - BUGFIX: Fix dead link about certificates in program preferences - -* Sat Jan 19 2013 - Christophe Dumez - v3.0.7 - - BUGFIX: Update max write cache size to 2048MB and set it to automatic by default (closes #148) - - BUGFIX: Add m4v to the list of previewable file extensions (closes #216) - - BUGFIX: Fix "Couldn't set environment variable..." message on start up (closes #245) - - BUGFIX: Use right path separator in torrent addition dialog on Windows - - BUGFIX: Fix "Set as default save path" setting (closes #254) - - BUGFIX: Re-enable disk cache on Windows since the memory issue seems to be gone - - BUGFIX: Fixed several search engine plugins and removed the dead ones - - BUGFIX: Use https links in search plugins when possible - - BUGFIX: Bump Mootools to v1.4.5 (Web UI) - - BUGFIX: Require password to exit qBittorrent from tray icon when locked (closes #311) - - BUGFIX: Fix possible crash in loadPeers() (closes #222) - -* Sun Oct 7 2012 - Christophe Dumez - v3.0.6 - - BUGFIX: Fix unicode support for command-line arguments on Windows (closes #139) - - BUGFIX: Do not store created torrent in memory before writing it to a file (closes #133) - - BUGFIX: No longer fallback to ANY interface if the user-selected interface cannot be found (closes #143) - - BUGFIX: Fix timezone parsing in RSS (closes #136) - - BUGFIX: Fix cookie support for RSS feeds (closes #119) - -* Sun Sep 30 2012 - Christophe Dumez - v3.0.5 - - BUGFIX: Disabling systray icon no longer disables file association settings (closes #114) - - BUGFIX: Import new trackers from magnet link in case of duplicate torrent (closes #111) - - BUGFIX: Fix "Skip hash check" feature in torrent import dialog (closes #128) - - BUGFIX: Several Web UI connection fixes - - BUGFIX: Add Basque locale to Web UI - -* Tue Sep 18 2012 - Christophe Dumez - v3.0.4 - - BUGFIX: Fix issue with downloads starting from scratch on startup if temporary - directory setting is enabled. - -* Sun Sep 16 2012 - Christophe Dumez - v3.0.3 - - BUGFIX: Fix issue with temporary directory not being taken into consideration (closes #94) - - BUGFIX: Address encoding issues when using search engine on Windows (closes #29) - - BUGFIX: Bypass cache when uploading a torrent file in Web UI (closes #68) - - BUGFIX: "Completed On" column is not updated until restart (closes #84) - - BUGFIX: Fix possible build error on some systems - - I18N: Add hebrew translation - -* Sat Sep 1 2012 - Christophe Dumez - v3.0.2 - - FEATURE: Add "clear" functionality to search field (closes #59) - - BUGFIX: Attempt to use qBittorrent icon from theme if available (closes #49) - - BUGFIX: Fix crash when a fastresume file is empty (closes #52) - - BUGFIX: Fix encoding problem for detected XDG Download folder (closes #53) - - BUGFIX: Improve performance when showing torrent content panel (Improves #24) - - BUGFIX: Fix label-based filtering of torrents whose label contains special characters - - BUGFIX: Fix possible crash due to labels (closes #64) - -* Tue Aug 21 2012 - Christophe Dumez - v3.0.1 - - BUGFIX: Fix possible crash when adding a tracker to a magnet torrent without metadata (Closes #1034254) - - BUGFIX: Remember queue position for torrents without metadata (closes #17) - - BUGFIX: Fix crash when using unauthorized characters in label names (closes #19) - - BUGFIX: Fix search plugins updating (closes #25) - - BUGFIX: Make uTP connections rate limited by default + - PERFORMANCE: Impove drawing speed of tranferlist when there are many torrents(>100) + - PERFORMANCE: Impove drawing speed of peers list when there are many peers * Thu Aug 09 2012 - Christophe Dumez - v3.0.0 - FEATURE: Brand new torrent addition dialog @@ -1424,92 +624,6 @@ - OTHER: Drop support for libtorrent v0.14.x - OTHER: Drop support for Qt 4.5 -* Unreleased - Christophe Dumez - v2.9.12 - - BUGFIX: Fix issue when "Minimize to tray" and "Start minimized" are both enabled - -* Sun Jul 1 2012 - Christophe Dumez - v2.9.11 - - BUGFIX: Fix unreversible "Minimize to tray" on some window managers - - BUGFIX: Fix torrent availability computation (closes #988869) - - BUGFIX: Bring window to front after restoring from systray - - BUGFIX: Fix keyboard focus problems on main window (closes #1019563) - - BUGFIX: Fix ThePirateBay search plugin - -* Sun Jun 24 2012 - Christophe Dumez - v2.9.10 - - BUGFIX: Fix possible crash when showing torrent content (closes #1002586) - - BUGFIX: Add support for RSS feeds using magnet links (closes #1016379) - - BUGFIX: Remove 100kb limit for torrent file size in Web UI - - BUGFIX: Fix ratio limiting bug (closes #835217) - - BUGFIX: Do not display .!qB file extensions in Web UI - - BUGFIX: Stop using absolute URLs in Web UI ajax requests (closes #1011226) - - BUGFIX: Fix torrent association and loading on Mac OS X (closes #1011229) - - BUGFIX: Fix unreversible "Minimize to tray" on some window managers (closes #917825) - -* Sun May 20 2012 - Christophe Dumez - v2.9.9 - - BUGFIX: More reliable RSS feed parsing (closes #1001777) - - BUGFIX: Better support for cookies in RSS - - BUGFIX: Make sure show/hide text in tray icon menu is correct - - COSMETIC: Improve style of left panel - - COSMETIC: Never disable properties panel - - COSMETIC: Make sure first tab is initially selected in options dialog - - COSMETIC: Fix a few focus issues on Mac OS X - -* Sat May 5 2012 - Christophe Dumez - v2.9.8 - - BUGFIX: Various UI style fixes - - BUGFIX: Fix compilation with gcc 4.7 - - BUGFIX: Fix possible compilation error with msvc (Windows) - - BUGFIX: Fix compilation on OS/2 - - I18N: Update Italian translation - -* Sun Mar 18 2012 - Christophe Dumez - v2.9.7 - - BUGFIX: Fix important HTTP request parsing bug (Web UI) - -* Sat Mar 17 2012 - Christophe Dumez - v2.9.6 - - BUGFIX: Fix download first/last pieces state reporting - - BUGFIX: Fix name of progress column in torrent content panel - - BUGFIX: Disable system tray icon on Mac OS X - - BUGFIX: RSS downloader should not ignore "Do not start automatically" rule (closes #946910) - - BUGFIX: Fix DHT port setting in Web UI (Closes #952182) - - BUGFIX: Fix possible Web UI authentication problem when using SSL (closes #941343) - - BUGFIX: Fix possible issues with folder removal when removing a torrent - - I18N: Add Basque translation - -* Sat Feb 18 2012 - Christophe Dumez - v2.9.5 - - BUGFIX: Fix crash when disabling then reenabling RSS - - BUGFIX: Fix duplicate torrent detection when adding a magnet link - - BUGFIX: Fix import of new trackers when adding a torrent with same hash (Closes #747000) - - BUGFIX: Fix possible redownload of torrents marked as read (Closes #927495) - - BUGFIX: Properly remove RSS feed settings/history upon feed removal - -* Sat Feb 18 2012 - Christophe Dumez - v2.9.4 - - BUGFIX: qBittorrent does not handle redirection to relative URLs correctly (Closes #919905) - - BUGFIX: Cmd+M minimizes main window on Mac OS X (Closes #928216) - - BUGFIX: Cmd+Del removes torrents on Mac OS X (Closes #928852) - - BUGFIX: Fix potential bug when moving single file torrents to tmp folder (closes #932861) - - BUGFIX: Fix torrent import dialog layout (Closes #930932) - - BUGFIX: Prevent log window buffer from filling up (Closes #929673) - - I18N: Add Belarusian translation - -* Thu Dec 29 2011 - Christophe Dumez - v2.9.3 - - BUGFIX: Fix btdigg plugin (Python3 support + torrent name in magnet links) - - BUGFIX: Fix banning of IPv6 peers (Closes #885021) - - BUGFIX: Fix torrent addition dialog layout problem (Closes #84650522) - - BUGFIX: Do not report any progress for disabled files (Closes #56731485) - - BUGFIX: Make torrent sorting case insensitive (Closes #857154) - - BUGFIX: Improve Web UI usability of small devices - - BUGFIX: Program updater: More reliable version detection / comparison - - I18N: Add Georgian translation - -* Sat Oct 29 2011 - Christophe Dumez - v2.9.2 - - BUGFIX: Fix minimum dimensions for torrent addition dialog - - BUGFIX: Remove dependency on boost-datetime - - BUGFIX: Remove dependency on boost-filesystem (libtorrent v0.16.x) - -* Sun Oct 23 2011 - Christophe Dumez - v2.9.1 - - BUGFIX: Add support for speed limits scheduling (Web UI) - - BUGFIX: Fix ratio calculation for purely seeded torrents - - I18N: Update Russian translation - - COSMETIC: Torrent addition dialog layout fixes - * Sat Oct 08 2011 - Christophe Dumez - v2.9.0 - FEATURE: Add file association settings to program preferences (Windows) - FEATURE: Add setting to ignore slow torrents in queueing system @@ -1711,7 +825,7 @@ - BUGFIX: Update RSS feed as soon as feed downloader is enabled - BUGFIX: RSS Feed downloader ignores articles above maximum number of articles - BUGFIX: Fix possible bug when deleting a RSS folder - - BUGFIX: Remove persistent data when a RSS feed is deleted + - BUGFIX: Remove persistant data when a RSS feed is deleted - BUGFIX: RSS filters are now alphabetically sorted - BUGFIX: Fix crash when renaming currently displayed RSS filter - BUGFIX: Remove overwriting confirmation when exporting RSS filters since Qt takes care of it @@ -1747,7 +861,7 @@ - BUGFIX: Use the save path set in program preferences as a default in torrent addition dialog * Fri Dec 18 2009 - Christophe Dumez - v2.0.2 - - BUGFIX: Fix .qbittorrent folder not being created (critical bug introduced in v2.0.1 that makes qBittorrent unusable for new users) + - BUGFIX: Fix .qbittorrent folder not being created (critical bug introduced in v2.0.1 that makes qBittorrent unusuable for new users) - BUGFIX: Fix RSS Feed downloader for some feeds - BUGFIX: Do not use home folder as a fallback when the save path is not accessible - BUGFIX: Fix Mininova, ThePirateBay search engine plugins @@ -1837,7 +951,7 @@ - BUGFIX: Fix trackers addition to torrents (bug introduced in v1.5.4) - BUGFIX: Suppress compilation warning regarding sortNewsList() not being used - BUGFIX: Make sure scan folder is different than qBittorrent backup directory to avoid torrents deletion - - BUGFIX: Added safety mechanism which adds the torrents back to the list in case qbittorrent-resume.conf gets deleted or corrupted. + - BUGFIX: Added safety mecanism which adds the torrents back to the list in case qbittorrent-resume.conf gets deleted or corrupted. * Sun Oct 25 2009 - Christophe Dumez - v1.5.4 - BUGFIX: Updated man page @@ -1904,7 +1018,7 @@ - FEATURE: Added right click menu in search engine to clear completion history - FEATURE: Allow to set a different port for DHT (UDP) than the one used for Bittorrent - FEATURE: Updated spoofing code to avoid trackers ban - - BUGFIX: Provide more helpful explanation when an I/O error occurred + - BUGFIX: Provide more helpful explanation when an I/O error occured - BUGFIX: Stop enforcing UTF-8 and use system locale instead - COSMETIC: Redesigned program preferences - COSMETIC: Updated icons set @@ -1922,7 +1036,7 @@ - BUGFIX: Suppressed QLayout: Attempting to add QLayout "" to properties "properties" warning message when opening a properties dialog - BUGFIX: Fixed a little bug in search engine plugins helper file - BUGFIX: Fixed compilation problems with Qt 4.3 - - BUGFIX: Percentages no longer disappear with default cleanlooks style + - BUGFIX: Percentages no longer disapear with default cleanlooks style - BUGFIX: Cleanly fixed popup menus position in lists (no more workarounds) - BUGFIX: Fixed memory leak in search engine - BUGFIX: Torrents with an infinite ratio are no longer affected by ratio_limit set in program preferences @@ -2167,7 +1281,7 @@ - FEATURE: Number of complete/incomplete sources are now displayed in download list for each torrent - FEATURE: Implemented close to systray - FEATURE: Added Autocompletion to search engine - - FEATURE: Split BT & GUI parts (huge code rewriting & optimization) + - FEATURE: Splitted BT & GUI parts (huge code rewriting & optimization) - FEATURE: New parameters for configure file to point to custom locations for libtorrent/libcurl - FEATURE: Update application style according to the system (WindowsXP, MacOS, X11) - BUGFIX: Two torrents can now have the same name although they are different (use their hash) diff -Nru qbittorrent-4.1.3/cmake/Modules/bundle.cmake qbittorrent-3.3.15/cmake/Modules/bundle.cmake --- qbittorrent-4.1.3/cmake/Modules/bundle.cmake 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/cmake/Modules/bundle.cmake 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -set(BU_CHMOD_BUNDLE_ITEMS ON) -include(DeployQt5) - -set(plugins "") - -get_property(svgIconPluginLocation TARGET Qt5::QSvgIconPlugin - PROPERTY LOCATION_RELEASE) -list(APPEND plugins "${svgIconPluginLocation}") -get_property(svgPluginLocation TARGET Qt5::QSvgPlugin - PROPERTY LOCATION_RELEASE) -list(APPEND plugins "${svgPluginLocation}") - -set(sfx "") -if(APPLE) - set(sfx ".app") -elseif(WIN32) - set(sfx "${CMAKE_EXECUTABLE_SUFFIX}") -endif() - -get_target_property(exe qBittorrent OUTPUT_NAME) -install_qt5_executable("${exe}${sfx}" "${plugins}" "" "" "") diff -Nru qbittorrent-4.1.3/cmake/Modules/CompileFeature.cmake qbittorrent-3.3.15/cmake/Modules/CompileFeature.cmake --- qbittorrent-4.1.3/cmake/Modules/CompileFeature.cmake 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/cmake/Modules/CompileFeature.cmake 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -# Helper function for coupling add_feature_info(), option(), and add_definitions() - -function(optional_compile_definitions _name) - set(options FEATURE) - set(oneValueArgs DESCRIPTION DEFAULT) - set(multiValueArgs ENABLED DISABLED) - cmake_parse_arguments(OCD "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - option(${_name} "${OCD_DESCRIPTION}" ${OCD_DEFAULT}) - if (${${_name}}) - set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" APPEND PROPERTY COMPILE_DEFINITIONS ${OCD_ENABLED}) - else() - set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" APPEND PROPERTY COMPILE_DEFINITIONS ${OCD_DISABLED}) - endif() - if(${OCD_FEATURE}) - add_feature_info(${_name} ${_name} "${OCD_DESCRIPTION}") - endif() -endfunction() - -macro(feature_option _name _description _default) - option(${_name} "${_description}" ${_default}) - add_feature_info(${_name} ${_name} "${_description}") -endmacro() diff -Nru qbittorrent-4.1.3/cmake/Modules/DeployQt5.cmake qbittorrent-3.3.15/cmake/Modules/DeployQt5.cmake --- qbittorrent-4.1.3/cmake/Modules/DeployQt5.cmake 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/cmake/Modules/DeployQt5.cmake 1970-01-01 00:00:00.000000000 +0000 @@ -1,355 +0,0 @@ -# Borrowed from Avogadro project (https://github.com/OpenChemistry/avogadroapp) - -#.rst: -# DeployQt5 -# --------- -# -# Functions to help assemble a standalone Qt5 executable. -# -# A collection of CMake utility functions useful for deploying Qt5 -# executables. -# -# The following functions are provided by this module: -# -# :: -# -# write_qt5_conf -# resolve_qt5_paths -# fixup_qt5_executable -# install_qt5_plugin_path -# install_qt5_plugin -# install_qt5_executable -# -# Requires CMake 2.8.9 or greater because Qt 5 does. -# Also depends on BundleUtilities.cmake. -# -# :: -# -# WRITE_QT5_CONF( ) -# -# Writes a qt.conf file with the into . -# -# :: -# -# RESOLVE_QT5_PATHS( []) -# -# Loop through list and if any don't exist resolve them -# relative to the (if supplied) or the -# CMAKE_INSTALL_PREFIX. -# -# :: -# -# FIXUP_QT5_EXECUTABLE( [ ]) -# -# Copies Qt plugins, writes a Qt configuration file (if needed) and -# fixes up a Qt5 executable using BundleUtilities so it is standalone -# and can be drag-and-drop copied to another machine as long as all of -# the system libraries are compatible. -# -# should point to the executable to be fixed-up. -# -# should contain a list of the names or paths of any Qt -# plugins to be installed. -# -# will be passed to BundleUtilities and should be a list of any -# already installed plugins, libraries or executables to also be -# fixed-up. -# -# will be passed to BundleUtilities and should contain and -# directories to be searched to find library dependencies. -# -# allows an custom plugins directory to be used. -# -# will force a qt.conf file to be written even if not -# needed. -# -# :: -# -# INSTALL_QT5_PLUGIN_PATH(plugin executable copy installed_plugin_path_var ) -# -# Install (or copy) a resolved to the default plugins directory -# (or ) relative to and store the result in -# . -# -# If is set to TRUE then the plugins will be copied rather than -# installed. This is to allow this module to be used at CMake time -# rather than install time. -# -# If is set then anything installed will use this COMPONENT. -# -# :: -# -# INSTALL_QT5_PLUGIN(plugin executable copy installed_plugin_path_var ) -# -# Install (or copy) an unresolved to the default plugins -# directory (or ) relative to and store the -# result in . See documentation of -# INSTALL_QT5_PLUGIN_PATH. -# -# :: -# -# INSTALL_QT5_EXECUTABLE( [ ]) -# -# Installs Qt plugins, writes a Qt configuration file (if needed) and -# fixes up a Qt5 executable using BundleUtilities so it is standalone -# and can be drag-and-drop copied to another machine as long as all of -# the system libraries are compatible. The executable will be fixed-up -# at install time. is the COMPONENT used for bundle fixup -# and plugin installation. See documentation of FIXUP_QT5_BUNDLE. - -#============================================================================= -# Copyright 2011 Mike McQuaid -# -# Distributed under the OSI-approved BSD License (the "License"); -# see accompanying file Copyright.txt for details. -# -# This software is distributed WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the License for more information. -#============================================================================= -# (To distribute this file outside of CMake, substitute the full -# License text for the above reference.) - -# The functions defined in this file depend on the fixup_bundle function -# (and others) found in BundleUtilities.cmake - -include(BundleUtilities) -set(DeployQt5_cmake_dir "${CMAKE_CURRENT_LIST_DIR}") -set(DeployQt5_apple_plugins_dir "PlugIns") - -function(write_qt5_conf qt_conf_dir qt_conf_contents) - set(qt_conf_path "${qt_conf_dir}/qt.conf") - message(STATUS "Writing ${qt_conf_path}") - file(WRITE "${qt_conf_path}" "${qt_conf_contents}") -endfunction() - -function(resolve_qt5_paths paths_var) - set(executable_path ${ARGV1}) - - set(paths_resolved) - foreach(path ${${paths_var}}) - if(EXISTS "${path}") - list(APPEND paths_resolved "${path}") - else() - if(${executable_path}) - list(APPEND paths_resolved "${executable_path}/${path}") - else() - list(APPEND paths_resolved "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${path}") - endif() - endif() - endforeach() - set(${paths_var} ${paths_resolved} PARENT_SCOPE) -endfunction() - -function(fixup_qt5_executable executable) - set(qtplugins ${ARGV1}) - set(libs ${ARGV2}) - set(dirs ${ARGV3}) - set(plugins_dir ${ARGV4}) - set(request_qt_conf ${ARGV5}) - - message(STATUS "fixup_qt5_executable") - message(STATUS " executable='${executable}'") - message(STATUS " qtplugins='${qtplugins}'") - message(STATUS " libs='${libs}'") - message(STATUS " dirs='${dirs}'") - message(STATUS " plugins_dir='${plugins_dir}'") - message(STATUS " request_qt_conf='${request_qt_conf}'") - - if(QT_LIBRARY_DIR) - list(APPEND dirs "${QT_LIBRARY_DIR}") - endif() - if(QT_BINARY_DIR) - list(APPEND dirs "${QT_BINARY_DIR}") - endif() - - if(APPLE) - set(qt_conf_dir "${executable}/Contents/Resources") - set(executable_path "${executable}") - set(write_qt_conf TRUE) - if(NOT plugins_dir) - set(plugins_dir "${DeployQt5_apple_plugins_dir}") - endif() - else() - get_filename_component(executable_path "${executable}" PATH) - if(NOT executable_path) - set(executable_path ".") - endif() - set(qt_conf_dir "${executable_path}") - set(write_qt_conf ${request_qt_conf}) - endif() - - foreach(plugin ${qtplugins}) - set(installed_plugin_path "") - install_qt5_plugin("${plugin}" "${executable}" 1 installed_plugin_path) - list(APPEND libs ${installed_plugin_path}) - endforeach() - - foreach(lib ${libs}) - if(NOT EXISTS "${lib}") - message(FATAL_ERROR "Library does not exist: ${lib}") - endif() - endforeach() - - resolve_qt5_paths(libs "${executable_path}") - - if(write_qt_conf) - set(qt_conf_contents "[Paths]\nPlugins = ${plugins_dir}") - write_qt5_conf("${qt_conf_dir}" "${qt_conf_contents}") - endif() - - fixup_bundle("${executable}" "${libs}" "${dirs}") -endfunction() - -function(install_qt5_plugin_path plugin executable copy installed_plugin_path_var) - set(plugins_dir ${ARGV4}) - set(component ${ARGV5}) - set(configurations ${ARGV6}) - if(EXISTS "${plugin}") - if(APPLE) - if(NOT plugins_dir) - set(plugins_dir "${DeployQt5_apple_plugins_dir}") - endif() - set(plugins_path "${executable}/Contents/${plugins_dir}") - else() - get_filename_component(plugins_path "${executable}" PATH) - if(NOT plugins_path) - set(plugins_path ".") - endif() - if(plugins_dir) - set(plugins_path "${plugins_path}/${plugins_dir}") - endif() - endif() - - set(plugin_group "") - - get_filename_component(plugin_path "${plugin}" PATH) - get_filename_component(plugin_parent_path "${plugin_path}" PATH) - get_filename_component(plugin_parent_dir_name "${plugin_parent_path}" NAME) - get_filename_component(plugin_name "${plugin}" NAME) - string(TOLOWER "${plugin_parent_dir_name}" plugin_parent_dir_name) - - if("${plugin_parent_dir_name}" STREQUAL "plugins") - get_filename_component(plugin_group "${plugin_path}" NAME) - set(${plugin_group_var} "${plugin_group}") - endif() - set(plugins_path "${plugins_path}/${plugin_group}") - - if(${copy}) - file(MAKE_DIRECTORY "${plugins_path}") - file(COPY "${plugin}" DESTINATION "${plugins_path}") - else() - if(configurations AND (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)) - set(configurations CONFIGURATIONS ${configurations}) - else() - unset(configurations) - endif() - install(FILES "${plugin}" DESTINATION "${plugins_path}" ${configurations} ${component}) - endif() - set(${installed_plugin_path_var} "${plugins_path}/${plugin_name}" PARENT_SCOPE) - endif() -endfunction() - -function(install_qt5_plugin plugin executable copy installed_plugin_path_var) - set(plugins_dir ${ARGV4}) - set(component ${ARGV5}) - if(EXISTS "${plugin}") - install_qt5_plugin_path("${plugin}" "${executable}" "${copy}" "${installed_plugin_path_var}" "${plugins_dir}" "${component}") - else() - string(TOUPPER "QT_${plugin}_PLUGIN" plugin_var) - set(plugin_release_var "${plugin_var}_RELEASE") - set(plugin_debug_var "${plugin_var}_DEBUG") - set(plugin_release "${${plugin_release_var}}") - set(plugin_debug "${${plugin_debug_var}}") - if(DEFINED "${plugin_release_var}" AND DEFINED "${plugin_debug_var}" AND NOT EXISTS "${plugin_release}" AND NOT EXISTS "${plugin_debug}") - message(WARNING "Qt plugin \"${plugin}\" not recognized or found.") - endif() - if(NOT EXISTS "${${plugin_debug_var}}") - set(plugin_debug "${plugin_release}") - endif() - - if(CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE) - install_qt5_plugin_path("${plugin_release}" "${executable}" "${copy}" "${installed_plugin_path_var}_release" "${plugins_dir}" "${component}" "Release|RelWithDebInfo|MinSizeRel") - install_qt5_plugin_path("${plugin_debug}" "${executable}" "${copy}" "${installed_plugin_path_var}_debug" "${plugins_dir}" "${component}" "Debug") - - if(CMAKE_BUILD_TYPE MATCHES "^Debug$") - set(${installed_plugin_path_var} ${${installed_plugin_path_var}_debug}) - else() - set(${installed_plugin_path_var} ${${installed_plugin_path_var}_release}) - endif() - else() - install_qt5_plugin_path("${plugin_release}" "${executable}" "${copy}" "${installed_plugin_path_var}" "${plugins_dir}" "${component}") - endif() - endif() - set(${installed_plugin_path_var} ${${installed_plugin_path_var}} PARENT_SCOPE) -endfunction() - -function(install_qt5_executable executable) - set(qtplugins ${ARGV1}) - set(libs ${ARGV2}) - set(dirs ${ARGV3}) - set(plugins_dir ${ARGV4}) - set(request_qt_conf ${ARGV5}) - set(component ${ARGV6}) - if(QT_LIBRARY_DIR) - list(APPEND dirs "${QT_LIBRARY_DIR}") - endif() - if(QT_BINARY_DIR) - list(APPEND dirs "${QT_BINARY_DIR}") - endif() - if(TARGET Qt5::Core) - get_property(_locCore TARGET Qt5::Core PROPERTY LOCATION_RELEASE) - get_filename_component(_loc ${_locCore} DIRECTORY) - message(STATUS "Adding Qt 5 directory: ${_loc}") - list(APPEND dirs "${_loc}") - else() - message(FATAL_ERROR "No Qt5::Core target found, ensure it is available") - endif() - if(component) - set(component COMPONENT ${component}) - else() - unset(component) - endif() - - get_filename_component(executable_absolute "${executable}" ABSOLUTE) - if(EXISTS "${QT_QTCORE_LIBRARY_RELEASE}") - gp_file_type("${executable_absolute}" "${QT_QTCORE_LIBRARY_RELEASE}" qtcore_type) - elseif(EXISTS "${QT_QTCORE_LIBRARY_DEBUG}") - gp_file_type("${executable_absolute}" "${QT_QTCORE_LIBRARY_DEBUG}" qtcore_type) - endif() - if(qtcore_type STREQUAL "system") - set(qt_plugins_dir "") - endif() - - if(QT_IS_STATIC) - message(WARNING "Qt built statically: not installing plugins.") - else() - if(APPLE) - get_property(loc TARGET Qt5::QCocoaIntegrationPlugin - PROPERTY LOCATION_RELEASE) - install_qt5_plugin("${loc}" "${executable}" 0 installed_plugin_paths - "PlugIns" "${component}") - list(APPEND libs ${installed_plugin_paths}) - elseif(WIN32) - get_property(loc TARGET Qt5::QWindowsIntegrationPlugin - PROPERTY LOCATION_RELEASE) - install_qt5_plugin("${loc}" "${executable}" 0 installed_plugin_paths - "" "${component}") - list(APPEND libs ${installed_plugin_paths}) - endif() - foreach(plugin ${qtplugins}) - set(installed_plugin_paths "") - install_qt5_plugin("${plugin}" "${executable}" 0 installed_plugin_paths "${plugins_dir}" "${component}") - list(APPEND libs ${installed_plugin_paths}) - endforeach() - endif() - - resolve_qt5_paths(libs "") - - install(CODE - "include(\"${DeployQt5_cmake_dir}/DeployQt5.cmake\") - set(BU_CHMOD_BUNDLE_ITEMS TRUE) - fixup_qt5_executable(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${executable}\" \"\" \"${libs}\" \"${dirs}\" \"${plugins_dir}\" \"${request_qt_conf}\")" - ${component} - ) -endfunction() diff -Nru qbittorrent-4.1.3/cmake/Modules/FindLibtorrentRasterbar.cmake qbittorrent-3.3.15/cmake/Modules/FindLibtorrentRasterbar.cmake --- qbittorrent-4.1.3/cmake/Modules/FindLibtorrentRasterbar.cmake 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/cmake/Modules/FindLibtorrentRasterbar.cmake 2017-08-03 20:30:10.000000000 +0000 @@ -99,7 +99,6 @@ if(LibtorrentRasterbar_ENCRYPTION_INDEX GREATER -1) find_package(OpenSSL REQUIRED) set(LibtorrentRasterbar_LIBRARIES ${LibtorrentRasterbar_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto) - list(APPEND LibtorrentRasterbar_INCLUDE_DIRS "${OPENSSL_INCLUDE_DIR}") set(LibtorrentRasterbar_OPENSSL_ENABLED ON) endif() @@ -114,10 +113,10 @@ LibtorrentRasterbar_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES LibtorrentRasterbar_ENCRYPTION_INDEX) -if (LibtorrentRasterbar_FOUND AND NOT TARGET LibtorrentRasterbar::torrent-rasterbar) - add_library(LibtorrentRasterbar::torrent-rasterbar UNKNOWN IMPORTED) +if (LibtorrentRasterbar_FOUND AND NOT TARGET LibtorrentRasterbar::LibTorrent) + add_library(LibtorrentRasterbar::LibTorrent UNKNOWN IMPORTED) - set_target_properties(LibtorrentRasterbar::torrent-rasterbar PROPERTIES + set_target_properties(LibtorrentRasterbar::LibTorrent PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" IMPORTED_LOCATION "${LibtorrentRasterbar_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${LibtorrentRasterbar_INCLUDE_DIRS}" diff -Nru qbittorrent-4.1.3/cmake/Modules/FindQtSingleApplication.cmake qbittorrent-3.3.15/cmake/Modules/FindQtSingleApplication.cmake --- qbittorrent-4.1.3/cmake/Modules/FindQtSingleApplication.cmake 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/cmake/Modules/FindQtSingleApplication.cmake 2017-08-03 20:30:10.000000000 +0000 @@ -1,79 +1,94 @@ # - Try to find the QtSingleApplication includes and library # which defines # -# QtSingleApplication_FOUND - system has QtSingleApplication -# QtSingleApplication_INCLUDE_DIR - where to find header QtSingleApplication -# QtSingleApplication_LIBRARIES - the libraries to link against to use QtSingleApplication -# QtSingleApplication_LIBRARY - where to find the QtSingleApplication library (not for general use) +# QTSINGLEAPPLICATION_FOUND - system has QtSingleApplication +# QTSINGLEAPPLICATION_INCLUDE_DIR - where to find header QtSingleApplication +# QTSINGLEAPPLICATION_LIBRARIES - the libraries to link against to use QtSingleApplication +# QTSINGLEAPPLICATION_LIBRARY - where to find the QtSingleApplication library (not for general use) # copyright (c) 2013 TI_Eugene ti.eugene@gmail.com # # Redistribution and use is allowed according to the terms of the FreeBSD license. -SET(QtSingleApplication_FOUND FALSE) +SET(QTSINGLEAPPLICATION_FOUND FALSE) -if (Qt5Widgets_FOUND) - set(_includeFileName qtsingleapplication.h) -else() - set(_includeFileName qtsinglecoreapplication.h) -endif() - -FOREACH(TOP_INCLUDE_PATH in ${Qt5Core_INCLUDE_DIRS} ${FRAMEWORK_INCLUDE_DIR}) - FIND_PATH(QtSingleApplication_INCLUDE_DIR ${_includeFileName} ${TOP_INCLUDE_PATH}/QtSolutions) - - IF(QtSingleApplication_INCLUDE_DIR) - BREAK() - ENDIF() -ENDFOREACH() - -SET(QtSingleApplication_NAMES ${QtSingleApplication_NAMES} - Qt5Solutions_SingleApplication-2.6 libQt5Solutions_SingleApplication-2.6 - QtSolutions_SingleApplication-2.6 libQtSolutions_SingleApplication-2.6) -GET_TARGET_PROPERTY(_QT5_CORELIBRARY Qt5::Core LOCATION) -GET_FILENAME_COMPONENT(_QT5_CORELIBRARYPATH ${_QT5_CORELIBRARY} PATH) - -FIND_LIBRARY(QtSingleApplication_LIBRARY - NAMES ${QtSingleApplication_NAMES} - PATHS ${_QT5_CORELIBRARYPATH} -) +IF(QT4_FOUND) + message(STATUS "Looking for Qt4 single application library") + FIND_PATH(QTSINGLEAPPLICATION_INCLUDE_DIR QtSingleApplication + # standard locations + /usr/include + /usr/include/QtSolutions + # qt4 location except mac's frameworks + "${QT_INCLUDE_DIR}/QtSolutions" + # mac's frameworks + ${FRAMEWORK_INCLUDE_DIR}/QtSolutions + ) + + SET(QTSINGLEAPPLICATION_NAMES ${QTSINGLEAPPLICATION_NAMES} + QtSolutions_SingleApplication-2.6 libQtSolutions_SingleApplication-2.6) + FIND_LIBRARY(QTSINGLEAPPLICATION_LIBRARY + NAMES ${QTSINGLEAPPLICATION_NAMES} + PATHS ${QT_LIBRARY_DIR} + ) +ELSEIF(Qt5Widgets_FOUND) + message(STATUS "Looking for Qt5 single application library") + FOREACH(TOP_INCLUDE_PATH in ${Qt5Widgets_INCLUDE_DIRS} ${FRAMEWORK_INCLUDE_DIR}) + FIND_PATH(QTSINGLEAPPLICATION_INCLUDE_DIR QtSingleApplication ${TOP_INCLUDE_PATH}/QtSolutions) + + IF(QTSINGLEAPPLICATION_INCLUDE_DIR) + BREAK() + ENDIF() + ENDFOREACH() + + SET(QTSINGLEAPPLICATION_NAMES ${QTSINGLEAPPLICATION_NAMES} + Qt5Solutions_SingleApplication-2.6 libQt5Solutions_SingleApplication-2.6 + QtSolutions_SingleApplication-2.6 libQtSolutions_SingleApplication-2.6) + GET_TARGET_PROPERTY(QT5_WIDGETSLIBRARY Qt5::Widgets LOCATION) + GET_FILENAME_COMPONENT(QT5_WIDGETSLIBRARYPATH ${QT5_WIDGETSLIBRARY} PATH) + + FIND_LIBRARY(QTSINGLEAPPLICATION_LIBRARY + NAMES ${QTSINGLEAPPLICATION_NAMES} + PATHS ${QT5_WIDGETSLIBRARYPATH} + ) +ENDIF() -IF (QtSingleApplication_LIBRARY AND QtSingleApplication_INCLUDE_DIR) +IF (QTSINGLEAPPLICATION_LIBRARY AND QTSINGLEAPPLICATION_INCLUDE_DIR) - SET(QtSingleApplication_LIBRARIES ${QtSingleApplication_LIBRARY}) - SET(QtSingleApplication_FOUND TRUE) + SET(QTSINGLEAPPLICATION_LIBRARIES ${QTSINGLEAPPLICATION_LIBRARY}) + SET(QTSINGLEAPPLICATION_FOUND TRUE) IF (CYGWIN) IF(BUILD_SHARED_LIBS) - # No need to define QtSingleApplication_USE_DLL here, because it's default for Cygwin. + # No need to define QTSINGLEAPPLICATION_USE_DLL here, because it's default for Cygwin. ELSE(BUILD_SHARED_LIBS) - SET (QtSingleApplication_DEFINITIONS -DQTSINGLEAPPLICATION_STATIC) + SET (QTSINGLEAPPLICATION_DEFINITIONS -DQTSINGLEAPPLICATION_STATIC) ENDIF(BUILD_SHARED_LIBS) ENDIF (CYGWIN) -ENDIF (QtSingleApplication_LIBRARY AND QtSingleApplication_INCLUDE_DIR) +ENDIF (QTSINGLEAPPLICATION_LIBRARY AND QTSINGLEAPPLICATION_INCLUDE_DIR) -IF (QtSingleApplication_FOUND) - IF (NOT QtSingleApplication_FIND_QUIETLY) - MESSAGE(STATUS "Found QtSingleApplication: ${QtSingleApplication_LIBRARY}") - MESSAGE(STATUS " includes: ${QtSingleApplication_INCLUDE_DIR}") - ENDIF (NOT QtSingleApplication_FIND_QUIETLY) - if(NOT TARGET QtSingleApplication::QtSingleApplication) - add_library(QtSingleApplication::QtSingleApplication UNKNOWN IMPORTED) - set_target_properties(QtSingleApplication::QtSingleApplication PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${QtSingleApplication_INCLUDE_DIR}" - INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${QtSingleApplication_INCLUDE_DIR}" - ) - if(EXISTS "${QtSingleApplication_LIBRARY}") - set_target_properties(QtSingleApplication::QtSingleApplication PROPERTIES - IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" - IMPORTED_LOCATION "${QtSingleApplication_LIBRARY}") - endif() - endif(NOT TARGET QtSingleApplication::QtSingleApplication) - -ELSE (QtSingleApplication_FOUND) +IF (QTSINGLEAPPLICATION_FOUND) + IF (NOT QtSingleApplication_FIND_QUIETLY) + MESSAGE(STATUS "Found QtSingleApplication: ${QTSINGLEAPPLICATION_LIBRARY}") + MESSAGE(STATUS " includes: ${QTSINGLEAPPLICATION_INCLUDE_DIR}") + ENDIF (NOT QtSingleApplication_FIND_QUIETLY) +ELSE (QTSINGLEAPPLICATION_FOUND) IF (QtSingleApplication_FIND_REQUIRED) MESSAGE(FATAL_ERROR "Could not find QtSingleApplication library") ENDIF (QtSingleApplication_FIND_REQUIRED) -ENDIF (QtSingleApplication_FOUND) +ENDIF (QTSINGLEAPPLICATION_FOUND) + +MARK_AS_ADVANCED(QTSINGLEAPPLICATION_INCLUDE_DIR QTSINGLEAPPLICATION_LIBRARY) -MARK_AS_ADVANCED(QtSingleApplication_INCLUDE_DIR QtSingleApplication_LIBRARY) +if(NOT TARGET QtSingleApplication::QtSingleApplication) + add_library(QtSingleApplication::QtSingleApplication UNKNOWN IMPORTED) + set_target_properties(QtSingleApplication::QtSingleApplication PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${QTSINGLEAPPLICATION_INCLUDE_DIR}" + INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${QTSINGLEAPPLICATION_INCLUDE_DIR}" + ) + if(EXISTS "${QTSINGLEAPPLICATION_LIBRARY}") + set_target_properties(QtSingleApplication::QtSingleApplication PROPERTIES + IMPORTED_LINK_INTERFACE_LANGUAGES "CXX" + IMPORTED_LOCATION "${QTSINGLEAPPLICATION_LIBRARY}") + endif() +endif(NOT TARGET QtSingleApplication::QtSingleApplication) diff -Nru qbittorrent-4.1.3/cmake/Modules/MacroLinkQtComponents.cmake qbittorrent-3.3.15/cmake/Modules/MacroLinkQtComponents.cmake --- qbittorrent-4.1.3/cmake/Modules/MacroLinkQtComponents.cmake 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/cmake/Modules/MacroLinkQtComponents.cmake 2017-08-03 20:30:10.000000000 +0000 @@ -1,5 +1,5 @@ # - macro similar to target_link_libraries, which links Qt components -# names of the components are passed in Qt4/Qt5 agnostic way (Core, DBus, Xml...) +# names of the components are pased in Qt4/Qt5 agnostic way (Core, DBus, Xml...) # and the macro links Qt4 ones if QT4_FOUND is set or Qt5 ones if not macro (target_link_qt_components target) diff -Nru qbittorrent-4.1.3/cmake/Modules/MacroQbtCompilerSettings.cmake qbittorrent-3.3.15/cmake/Modules/MacroQbtCompilerSettings.cmake --- qbittorrent-4.1.3/cmake/Modules/MacroQbtCompilerSettings.cmake 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/cmake/Modules/MacroQbtCompilerSettings.cmake 2017-08-03 20:30:10.000000000 +0000 @@ -11,17 +11,18 @@ #-Wshadow -Wconversion ? set(_GCC_COMMON_C_AND_CXX_FLAGS "-Wall -Wextra" "-Wfloat-equal -Wcast-qual -Wcast-align" - "-Wsign-conversion -Winvalid-pch -Wno-long-long" - #"-fstack-protector-all" - #"-Werror -Wno-error=deprecated-declarations" + "-Wsign-conversion -Winvalid-pch -Werror=return-type -Wno-long-long" +# -fstack-protector-all + "-Werror -Wno-error=deprecated-declarations" ) - set(_GCC_COMMON_CXX_FLAGS "-fexceptions -frtti" - "-Woverloaded-virtual -Wold-style-cast" + set (_GCC_COMMON_CXX_FLAGS "-fexceptions -frtti" + "-Woverloaded-virtual -Wold-style-cast -Wstrict-null-sentinel" "-Wnon-virtual-dtor -Wfloat-equal -Wcast-qual -Wcast-align" - #"-Weffc++" - #"-Werror -Wno-error=cpp" + "-Werror=overloaded-virtual" + # "-Weffc++" + "-Werror -Wno-error=cpp" # we should modify code to make these ones obsolete - #"-Wno-error=sign-conversion -Wno-error=float-equal" + "-Wno-error=old-style-cast -Wno-error=sign-conversion -Wno-error=float-equal" ) if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9) @@ -53,20 +54,6 @@ endif(${GLIBC_VERSION}) endif (CMAKE_SYSTEM_NAME MATCHES Linux) - if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - # Clang 5.0 still doesn't support -Wstrict-null-sentinel - check_cxx_compiler_flag(-Wstrict-null-sentinel _STRICT_NULL_SENTINEL_IS_SUPPORTED) - if (_STRICT_NULL_SENTINEL_IS_SUPPORTED) - list(APPEND _GCC_COMMON_CXX_FLAGS "-Wstrict-null-sentinel") - endif (_STRICT_NULL_SENTINEL_IS_SUPPORTED) - - # Code should be improved to render this not needed - list(APPEND _GCC_COMMON_CXX_FLAGS "-Wno-error=unused-function -Wno-error=inconsistent-missing-override") - else ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - # GCC supports it - list(APPEND _GCC_COMMON_CXX_FLAGS "-Wstrict-null-sentinel") - endif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - string(REPLACE ";" " " _GCC_COMMON_C_AND_CXX_FLAGS_STRING "${_GCC_COMMON_C_AND_CXX_FLAGS}") string(REPLACE ";" " " _GCC_COMMON_CXX_FLAGS_STRING "${_GCC_COMMON_CXX_FLAGS}") diff -Nru qbittorrent-4.1.3/cmake/Modules/QbtTargetSources.cmake qbittorrent-3.3.15/cmake/Modules/QbtTargetSources.cmake --- qbittorrent-4.1.3/cmake/Modules/QbtTargetSources.cmake 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/cmake/Modules/QbtTargetSources.cmake 2017-08-03 20:30:10.000000000 +0000 @@ -1,17 +1,17 @@ -# a helper function which appends source to the target -# sources file names are relative to the the target source dir +# a helper function which appends source to the main qBt target +# the target name is read from QBT_TARGET_NAME variable +# sources file names are relative to the the ${qbt_executable_SOURCE_DIR} -function (qbt_target_sources _target _scope) - get_target_property(targetSourceDir ${_target} SOURCE_DIR) - set(sourcesRelative "") - foreach(source IN ITEMS ${ARGN}) - if(IS_ABSOLUTE "${source}") - set(sourceAbsolutePath "${source}") +function (qbt_target_sources) + set (_sources_rel "") + foreach (_source IN ITEMS ${ARGN}) + if (IS_ABSOLUTE "${_source}") + set(source_abs "${_source}") else() - get_filename_component(sourceAbsolutePath "${source}" ABSOLUTE) + get_filename_component(_source_abs "${_source}" ABSOLUTE) endif() - file(RELATIVE_PATH sourceRelativePath "${targetSourceDir}" "${sourceAbsolutePath}") - list(APPEND sourcesRelative "${sourceRelativePath}") + file (RELATIVE_PATH _source_rel "${qbt_executable_SOURCE_DIR}" "${_source_abs}") + list (APPEND _sources_rel "${_source_rel}") endforeach() - target_sources(${_target} ${_scope} "${sourcesRelative}") -endfunction(qbt_target_sources) + target_sources (${QBT_TARGET_NAME} PRIVATE "${_sources_rel}") +endfunction (qbt_target_sources) diff -Nru qbittorrent-4.1.3/cmake/Modules/winconf.cmake qbittorrent-3.3.15/cmake/Modules/winconf.cmake --- qbittorrent-4.1.3/cmake/Modules/winconf.cmake 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/cmake/Modules/winconf.cmake 2017-08-03 20:30:10.000000000 +0000 @@ -24,7 +24,6 @@ -D_WIN32_IE=0x0501 -D_CRT_SECURE_NO_DEPRECATE -D_SCL_SECURE_NO_DEPRECATE - -DNOMINMAX ) # and boost set(Boost_USE_STATIC_LIBS True) diff -Nru qbittorrent-4.1.3/cmake/Modules/winconf-mingw.cmake qbittorrent-3.3.15/cmake/Modules/winconf-mingw.cmake --- qbittorrent-4.1.3/cmake/Modules/winconf-mingw.cmake 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/cmake/Modules/winconf-mingw.cmake 2017-08-03 20:30:10.000000000 +0000 @@ -1,9 +1,9 @@ -if (STACKTRACE) +if (STACKTRACE_WIN) if ("${WINXXBITS}" NOT STREQUAL "Win64") add_compile_options(-fno-omit-frame-pointer) endif ("${WINXXBITS}" NOT STREQUAL "Win64") link_libraries(libdbghelp -Wl,--export-all-symbols) -endif (STACKTRACE) +endif (STACKTRACE_WIN) if (("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") OR ("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo")) link_libraries(-Wl,--dynamicbase) diff -Nru qbittorrent-4.1.3/cmake/Modules/winconf-msvc.cmake qbittorrent-3.3.15/cmake/Modules/winconf-msvc.cmake --- qbittorrent-4.1.3/cmake/Modules/winconf-msvc.cmake 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/cmake/Modules/winconf-msvc.cmake 2017-08-03 20:30:10.000000000 +0000 @@ -1,4 +1,4 @@ -if (STACKTRACE) +if (STACKTRACE_WIN) if ("${WINXXBITS}" STREQUAL "Win64") add_compile_options(-Zi) else ("${WINXXBITS}" STREQUAL "Win64") @@ -6,7 +6,7 @@ add_compile_options(-Oy-) endif ("${WINXXBITS}" STREQUAL "Win64") link_libraries(dbghelp.lib) -endif (STACKTRACE) +endif (STACKTRACE_WIN) # Enable Wide characters add_definitions(-DTORRENT_USE_WPATH) diff -Nru qbittorrent-4.1.3/CMakeLists.txt qbittorrent-3.3.15/CMakeLists.txt --- qbittorrent-4.1.3/CMakeLists.txt 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/CMakeLists.txt 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,5 @@ -cmake_minimum_required(VERSION 3.9 FATAL_ERROR) - -message(WARNING "No official support for cmake build system. If it is broken, please submit patches!") +cmake_minimum_required(VERSION 3.5) +cmake_policy(VERSION 3.5) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules) include(FunctionReadVersion) @@ -23,32 +22,43 @@ add_definitions(-DQBT_VERSION_BUGFIX=${VER_BUGFIX}) add_definitions(-DQBT_VERSION_BUILD=${VER_BUILD}) +# os2 { +# DEFINES += DQBT_VERSION=\'\"v$${PROJECT_VERSION}\"\' +# DEFINES += DQBT_VERSION_2=\'\"$${PROJECT_VERSION}\"\' +# } else { add_definitions(-DQBT_VERSION="v${PROJECT_VERSION}") add_definitions(-DQBT_VERSION_2="${PROJECT_VERSION}") +# } -include(GNUInstallDirs) -include(FeatureSummary) - -# version requirements -set(requiredBoostVersion 1.35) -set(requiredQtVersion 5.5.1) +if (UNIX AND NOT APPLE) + include(GNUInstallDirs) +endif (UNIX AND NOT APPLE) if(WIN32) include(winconf) endif(WIN32) +# we need options here, because they are used not only in "src" subdir, but in the "dist" dir too +include(CMakeDependentOption) -# we need options here, at the top level, because they are used not only in "src" subdir, but in the "dist" dir too -include(CompileFeature) +option(QT5 "Compile using Qt5" ON) +option(SYSTEM_QTSINGLEAPPLICATION + "Use the system qtsingleapplication library or shipped one otherwise") +cmake_dependent_option(SYSTEM_QJSON + "Use the shipped qjson library or the system one (Qt4 only)" OFF "NOT QT5" OFF) + +option(GUI "Allows to disable GUI for headless running. Disables QtDBus and the GeoIP Database" ON) + +option(WEBUI "Allows to disable the WebUI." ON) + +if (WIN32) + option(STACKTRACE_WIN "") +else (WIN32) + cmake_dependent_option(SYSTEMD "Install the systemd service file (headless only)" OFF + "NOT GUI" OFF) + cmake_dependent_option(DBUS "Enable use of QtDBus (GUI only)" ON "GUI" OFF) +endif(WIN32) -optional_compile_definitions(COUNTRIES_RESOLUTION FEATURE DESCRIPTION "Enable resolving peers IP addresses to countries" - DEFAULT ON DISABLED DISABLE_COUNTRIES_RESOLUTION) -optional_compile_definitions(STACKTRACE FEATURE DESCRIPTION "Enable stacktraces" - DEFAULT ON ENABLED STACKTRACE) -optional_compile_definitions(WEBUI FEATURE DESCRIPTION "Enables built-in HTTP server for headless use" - DEFAULT ON DISABLED DISABLE_WEBUI) add_subdirectory(src) add_subdirectory(dist) - -feature_summary(DESCRIPTION "\nConfiguration results:" WHAT ALL) diff -Nru qbittorrent-4.1.3/CODING_GUIDELINES.md qbittorrent-3.3.15/CODING_GUIDELINES.md --- qbittorrent-4.1.3/CODING_GUIDELINES.md 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/CODING_GUIDELINES.md 2017-08-03 20:30:10.000000000 +0000 @@ -1,43 +1,15 @@ -All new code **must** follow the following coding guidelines. -If you make changes in a file that still uses another coding style, make sure that you follow these guidelines for your changes. -For programming languages other than C++ (e.g. JavaScript) used in this repository and submodules, unless otherwise specified, coding guidelines listed here applies as much as possible. - +All new code must follow the following coding guidelines. +If you make changes in a file that still uses another coding style, make sure that you follow these guidelines for your changes instead. **Note 1:** I will not take your head if you forget and use another style. However, most probably the request will be delayed until you fix your coding style. **Note 2:** You can use the `uncrustify` program/tool to clean up any source file. Use it with the `uncrustify.cfg` configuration file found in the root folder. **Note 3:** There is also a style for QtCreator but it doesn't cover all cases. In QtCreator `Tools->Options...->C++->Code Style->Import...` and choose the `codingStyleQtCreator.xml` file found in the root folder. -### Table Of Contents - -* [1. New lines & curly braces](#1-new-lines--curly-braces) - * [a. Function blocks, class/struct definitions, namespaces](#a-function-blocks-classstruct-definitions-namespaces) - * [b. Other code blocks](#b-other-code-blocks) - * [c. Blocks in switch's case labels](#c-blocks-in-switchs-case-labels) - * [d. If-else statements](#d-if-else-statements) - * [e. Single statement if blocks](#e-single-statement-if-blocks) - * [f. Acceptable conditions to omit braces](#f-acceptable-conditions-to-omit-braces) - * [g. Brace enclosed initializers](#g-brace-enclosed-initializers) -* [2. Indentation](#2-indentation) -* [3. File encoding and line endings](#3-file-encoding-and-line-endings) -* [4. Initialization lists](#4-initialization-lists) -* [5. Enums](#5-enums) -* [6. Names](#6-names) - * [a. Type names and namespaces](#a-type-names-and-namespaces) - * [b. Variable names](#b-variable-names) - * [c. Private member variable names](#c-private-member-variable-names) -* [7. Header inclusion order](#7-header-inclusion-order) -* [8. Include guard](#8-include-guard) -* [9. Misc](#9-misc) -* [10. Git commit message](#10-git-commit-message) -* [11. Not covered above](#11-not-covered-above) ---- - -### 1. New lines & curly braces ### - +### 1. Curly braces ### #### a. Function blocks, class/struct definitions, namespaces #### ```c++ int myFunction(int a) { - // code + //code } void myFunction() {} // empty body @@ -45,29 +17,29 @@ MyClass::MyClass(int *parent) : m_parent(parent) { - // initialize + //initialize } int MyClass::myMethod(int a) { - // code + //code } class MyOtherClass { public: - // code - + //code + protected: - // code - + //code + private: - // code + //code }; namespace Name { - // code + //code } // Lambdas @@ -82,20 +54,20 @@ #### b. Other code blocks #### ```c++ if (condition) { - // code + //code } for (int a = 0; a < b; ++b) { - // code + //code } switch (a) { case 1: - // blah + //blah case 2: - // blah + //blah default: - // blah + //blah } ``` @@ -103,98 +75,77 @@ ```c++ switch (var) { case 1: { - // declare local variables - // code + //declare local variables + //code } break; case 2: { - // declare local variables - // code + //declare local variables + //code } break; default: - // code + //code } ``` -#### d. If-else statements #### -The `else if`/`else` must be on their own lines: +#### d. Brace enclosed initializers #### +Unlike single-line functions, you must not insert spaces between the brackets and concluded expressions.
+But you must insert a space between the variable name and initializer. +```c++ +Class obj {}; // empty +Class obj {expr}; +Class obj {expr1, /*...,*/ exprN}; +QVariantMap map {{"key1", 5}, {"key2", 10}}; +``` + +### 2. If blocks ### +#### a. Multiple tests #### ```c++ if (condition) { - // code + //code } else if (condition) { - // code + //code } else { - // code + //code } ``` +The `else if`/`else` must be on their own lines. -#### e. Single statement if blocks #### -Most single statement if blocks should look like this: +#### b. Single statement if blocks #### +**Most** single statement if blocks should look like this: ```c++ if (condition) a = a + b; ``` -One acceptable exception to this can be `return`, `break` or `continue` statements, -provided that the test condition isn't very long and its body statement occupies only one line. -However you can still choose to use the first rule. +One acceptable exception to this **can be** `return`, `break` or `continue` statements, provided that the test condition isn't very long. However you can choose to use the first rule instead. ```c++ -if (a > 0) return; +a = myFunction(); +b = a * 1500; -while (p) { - // ... - if (!b) continue; -} +if (b > 0) return; +c = 100 / b; ``` -#### f. Acceptable conditions to omit braces #### -When the conditional statement in `if`/`else` has only one line and its body occupy only one line, -this also applies to loops statements. -Notice that for a series of `if - else` branches, if one branch needs braces then all branches must add braces. -```c++ -if (a < b) // conditional statement - do(a); // body +#### c. Using curly braces for single statement if blocks #### -if (a < b) - do(a); -else if (a > b) - do(b); -else - do(c); +However, there are cases where curly braces for single statement if blocks **should** be used. +* If some branch needs braces then all others should use them. Unless you have multiple `else if` in a row and the one needing the braces is only for a very small sub-block of code. +* Another exception would be when we have nested if blocks or generally multiple levels of code that affect code readability. -if (a < b) { - do(a); -} -else if (a > b) { // curly braces required here, then all branches should also add them - do(b); - do(d); -} -else { - do(c); -} -``` - -#### g. Brace enclosed initializers #### -Unlike single-line functions, you must not insert spaces between the brackets and concluded expressions.
-But you must insert a space between the variable name and initializer. -```c++ -Class obj {}; // empty -Class obj {expr}; -Class obj {expr1, /*...,*/ exprN}; -QVariantMap map {{"key1", 5}, {"key2", 10}}; -``` +Generally it will depend on the particular piece of code and would be determined on how readable that piece of code is. **If in doubt** always use braces if one of the above exceptions applies. -### 2. Indentation ### +### 3. Indentation ### 4 spaces. -### 3. File encoding and line endings ### +### 4. File encoding and line endings. ### UTF-8 and Unix-like line ending (LF). Unless some platform specific files need other encodings/line endings. -### 4. Initialization lists ### +### 5. Initialization lists. ### Initialization lists should be vertical. This will allow for more easily readable diffs. The initialization colon should be indented and in its own line along with first argument. The rest of the arguments should be indented too and have the comma prepended. ```c++ myClass::myClass(int a, int b, int c, int d) @@ -203,11 +154,11 @@ , m_c(c) , m_d(d) { - // code + //code } ``` -### 5. Enums ### +### 6. Enums. ### Enums should be vertical. This will allow for more easily readable diffs. The members should be indented. ```c++ enum Days @@ -222,7 +173,7 @@ }; ``` -### 6. Names ### +### 7. Names. ### All names should be camelCased. #### a. Type names and namespaces #### @@ -256,89 +207,40 @@ } ``` -### 7. Header inclusion order ### -The headers should be placed in the following group order: - 1. Module header (in .cpp) - 2. C++ Standard Library headers - 3. System headers - 4. Boost library headers - 5. Libtorrent headers - 6. Qt headers - 7. qBittorrent's own headers, starting from the *base* headers. - -The headers should be ordered alphabetically within each group. -If there are conditionals for the same header group, then put them at the bottom of the respective group. -If there are conditionals that contain headers from several different header groups, then put them above the "qBittorrent's own headers" group. - -One exception is the header containing the library version (for example, QtGlobal), this particular header isn't constrained by the aforementioned order. +### 8. Header inclusion order. ### +The headers should be placed in the following order: + 1. Module header (in .cpp) + 2. System/Qt/Boost etc. headers (splitted in subcategories if you have many). + 3. Application headers, starting from *Base* headers. +The headers should be ordered alphabetically within each group (subgroup).
+
Example: ```c++ -// file: examplewidget.cpp +// examplewidget.cpp -// Module header #include "examplewidget.h" -// exceptions, headers containing version number -#include -#include -#include - -// C++ Standard Library headers -#include - -#ifdef Q_OS_WIN // conditional #include -#endif - -// System headers -#ifdef Q_OS_WIN -#include -#endif - -// Boost library headers -#include - -// Libtorrent headers -#include +#include -// Qt headers +#include +#include #include #include -#ifdef Q_OS_MAC // conditional -#include -#endif - -// conditional that contains headers from several different header groups -#if LIBTORRENT_VERSION_NUM >= 10100 -#include -#include -#endif +#include -// qBittorrent's own headers +#include "base/bittorrent/session.h" #include "base/bittorrent/infohash.h" -#include "anothermodule.h" +#include "base/utils/fs.h" +#include "base/utils/misc.h" +#include "base/utils/string.h" #include "ui_examplewidget.h" -``` - -### 8. Include guard ### -`#pragma once` should be used instead of "include guard" in new code: -```c++ -// examplewidget.h - -#pragma once - -#include - -class ExampleWidget : public QWidget -{ - // (some code omitted) -}; ``` -### 9. Misc ### +### 9. Misc. ### * Line breaks for long lines with operation: @@ -380,32 +282,20 @@ // we know the variable type based on the right-hand expression ``` -* Notice the spaces in the following specific situations: +* Space around operations eg `a = b + c` or `a=b+c`: + +Before and after the assignment and other binary (and ternary) operators there should be a space.
+There should not be a space between increment/decrement and its operand.
+Some valid use cases: ```c++ -// Before and after the assignment and other binary (and ternary) operators there should be a space -// There should not be a space between increment/decrement and its operand a += 20; a = (b <= MAX_B ? b : MAX_B); ++a; ---b; +b--; for (int a = 0; a < b; ++b) { + // code } - -// Range-based for loop, spaces before and after the colon -for (auto i : container) { -} - -// Derived class, spaces before and after the colon -class Derived : public Base -{ -}; -``` - -* Prefer pre-increment, pre-decrement operators -```c++ -++i, --j; // Yes -i++, j--; // No ``` * private/public/protected must not be indented @@ -414,16 +304,5 @@ * Method definitions aren't allowed in header files -### 10. Git commit message ### -1. Limit the subject line to 50 characters. Subject should contain only the very essence of the changes (you should avoid extra details and internals) -2. Separate subject from body with a blank line -3. Capitalize the subject line -4. Do not end the subject line with a period -5. Use the imperative mood in the subject line (it's like you're ordering the program to do something (e.g. "Don't create temporary substrings") -6. Wrap the body at 72 characters -7. Use the body to explain what and why vs. how -8. If commit fixes a reported issue, mention it in the message body (e.g. `Closes #4134.`) - -### 11. Not covered above ### -If something isn't covered above, just follow the same style the file you are editing has. -*This guide is not exhaustive and the style for a particular piece of code not specified here will be determined by project members on code review.* +### 10. Not covered above ### +If something isn't covered above, just follow the same style the file you are editing has. If that particular detail isn't present in the file you are editing, then use whatever the rest of the project uses. diff -Nru qbittorrent-4.1.3/configure qbittorrent-3.3.15/configure --- qbittorrent-4.1.3/configure 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/configure 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for qbittorrent v4.1.3. +# Generated by GNU Autoconf 2.69 for qbittorrent v3.2.0alpha. # # Report bugs to . # @@ -580,10 +580,10 @@ # Identity of this package. PACKAGE_NAME='qbittorrent' PACKAGE_TARNAME='qbittorrent' -PACKAGE_VERSION='v4.1.3' -PACKAGE_STRING='qbittorrent v4.1.3' +PACKAGE_VERSION='v3.2.0alpha' +PACKAGE_STRING='qbittorrent v3.2.0alpha' PACKAGE_BUGREPORT='bugs.qbittorrent.org' -PACKAGE_URL='https://www.qbittorrent.org/' +PACKAGE_URL='http://www.qbittorrent.org/' ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE @@ -603,11 +603,11 @@ zlib_CFLAGS libtorrent_LIBS libtorrent_CFLAGS +qjson_LIBS +qjson_CFLAGS BOOST_SYSTEM_LIB BOOST_LDFLAGS BOOST_CPPFLAGS -Qt5Svg_LIBS -Qt5Svg_CFLAGS QT_QMAKE PKG_CONFIG_LIBDIR PKG_CONFIG_PATH @@ -715,9 +715,10 @@ enable_option_checking enable_dependency_tracking enable_silent_rules +with_qt4 with_qtsingleapplication +with_qjson enable_debug -enable_stacktrace enable_gui enable_systemd enable_webui @@ -741,8 +742,8 @@ PKG_CONFIG_PATH PKG_CONFIG_LIBDIR QT_QMAKE -Qt5Svg_CFLAGS -Qt5Svg_LIBS +qjson_CFLAGS +qjson_LIBS libtorrent_CFLAGS libtorrent_LIBS zlib_CFLAGS @@ -1297,7 +1298,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures qbittorrent v4.1.3 to adapt to many kinds of systems. +\`configure' configures qbittorrent v3.2.0alpha to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1368,7 +1369,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of qbittorrent v4.1.3:";; + short | recursive ) echo "Configuration of qbittorrent v3.2.0alpha:";; esac cat <<\_ACEOF @@ -1383,7 +1384,6 @@ --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-debug Enable debug build - --enable-stacktrace Enable stacktrace feature (default=auto) --disable-gui Disable the GUI for headless running. Disables QtDBus and the GeoIP Database. --enable-systemd Install the systemd service file (headless only). @@ -1393,9 +1393,13 @@ Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-qt4 Compile using Qt4 (default=no) --with-qtsingleapplication=[system|shipped] Use the shipped qtsingleapplication library or the system one (default=shipped) + --with-qjson=[system|shipped] + Use the shipped qjson library or the system one + (default=shipped) (Qt4 only) --with-boost[=ARG] use Boost library from a standard location (ARG=yes), from the specified location (ARG=), or disable it (ARG=no) [ARG=yes] @@ -1425,10 +1429,10 @@ directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path - QT_QMAKE value of host_bins for Qt5Core >= 5.5.1, overriding pkg-config - Qt5Svg_CFLAGS - C compiler flags for Qt5Svg, overriding pkg-config - Qt5Svg_LIBS linker flags for Qt5Svg, overriding pkg-config + QT_QMAKE value of host_bins for Qt5Core >= 5.2.0, overriding pkg-config + qjson_CFLAGS + C compiler flags for qjson, overriding pkg-config + qjson_LIBS linker flags for qjson, overriding pkg-config libtorrent_CFLAGS C compiler flags for libtorrent, overriding pkg-config libtorrent_LIBS @@ -1440,7 +1444,7 @@ it to find libraries and programs with nonstandard names/locations. Report bugs to . -qbittorrent home page: . +qbittorrent home page: . _ACEOF ac_status=$? fi @@ -1503,7 +1507,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -qbittorrent configure v4.1.3 +qbittorrent configure v3.2.0alpha generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1642,7 +1646,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by qbittorrent $as_me v4.1.3, which was +It was created by qbittorrent $as_me v3.2.0alpha, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3820,7 +3824,7 @@ # Define the identity of the package. PACKAGE='qbittorrent' - VERSION='v4.1.3' + VERSION='v3.2.0alpha' cat >>confdefs.h <<_ACEOF @@ -4175,6 +4179,15 @@ # Define --wth-* and --enable-* arguments +# Check whether --with-qt4 was given. +if test "${with_qt4+set}" = set; then : + withval=$with_qt4; +else + with_qt4=no +fi + + + # Check whether --with-qtsingleapplication was given. if test "${with_qtsingleapplication+set}" = set; then : withval=$with_qtsingleapplication; @@ -4183,19 +4196,20 @@ fi -# Check whether --enable-debug was given. -if test "${enable_debug+set}" = set; then : - enableval=$enable_debug; + +# Check whether --with-qjson was given. +if test "${with_qjson+set}" = set; then : + withval=$with_qjson; else - enable_debug=no + with_qjson=shipped fi -# Check whether --enable-stacktrace was given. -if test "${enable_stacktrace+set}" = set; then : - enableval=$enable_stacktrace; +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; else - enable_stacktrace=auto + enable_debug=no fi @@ -4399,39 +4413,6 @@ as_fn_error $? "Unknown option \"$enable_debug\". Use either \"yes\" or \"no\"." "$LINENO" 5 ;; esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable the stacktrace feature" >&5 -$as_echo_n "checking whether to enable the stacktrace feature... " >&6; } - -case "x$enable_stacktrace" in #( - "xno") : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - QBT_REMOVE_CONFIG="$QBT_REMOVE_CONFIG stacktrace" ;; #( - "xyes") : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - QBT_ADD_CONFIG="$QBT_ADD_CONFIG stacktrace" ;; #( - "xauto") : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - QBT_ADD_CONFIG="$QBT_ADD_CONFIG stacktrace" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - QBT_REMOVE_CONFIG="$QBT_REMOVE_CONFIG stacktrace" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; #( - *) : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_stacktrace" >&5 -$as_echo "$enable_stacktrace" >&6; } - as_fn_error $? "Unknown option \"$enable_stacktrace\". Use either \"yes\" or \"no\"." "$LINENO" 5 ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable the GUI" >&5 $as_echo_n "checking whether to enable the GUI... " >&6; } case "x$enable_gui" in #( @@ -4485,9 +4466,15 @@ as_fn_error $? "Unknown option \"$enable_webui\". Use either \"yes\" or \"no\"." "$LINENO" 5 ;; esac -if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core >= 5.5.1\""; } >&5 - ($PKG_CONFIG --exists --print-errors "Qt5Core >= 5.5.1") 2>&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Qt4 should be enabled" >&5 +$as_echo_n "checking whether Qt4 should be enabled... " >&6; } +case "x$with_qt4" in #( + "xno") : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core >= 5.2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "Qt5Core >= 5.2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then @@ -4496,12 +4483,12 @@ pkg_cv_QT_QMAKE="$QT_QMAKE" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core >= 5.5.1\""; } >&5 - ($PKG_CONFIG --exists --print-errors "Qt5Core >= 5.5.1") 2>&5 + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core >= 5.2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "Qt5Core >= 5.2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then - pkg_cv_QT_QMAKE=`$PKG_CONFIG --variable="host_bins" "Qt5Core >= 5.5.1" 2>/dev/null` + pkg_cv_QT_QMAKE=`$PKG_CONFIG --variable="host_bins" "Qt5Core >= 5.2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes @@ -4528,8 +4515,8 @@ fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt5 qmake >= 5.5.1" >&5 -$as_echo_n "checking for Qt5 qmake >= 5.5.1... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt5 qmake >= 5.2.0" >&5 +$as_echo_n "checking for Qt5 qmake >= 5.2.0... " >&6; } if test "x$QT_QMAKE" != "x"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QT_QMAKE" >&5 $as_echo "$QT_QMAKE" >&6; } @@ -4538,44 +4525,27 @@ $as_echo "not found" >&6; } fi - -if test "x$QT_QMAKE" = "x"; then : - as_fn_error $? "Could not find qmake" "$LINENO" 5 - -fi -if test "x$enable_gui" = "xyes"; then : - -pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt5Svg" >&5 -$as_echo_n "checking for Qt5Svg... " >&6; } - -if test -n "$Qt5Svg_CFLAGS"; then - pkg_cv_Qt5Svg_CFLAGS="$Qt5Svg_CFLAGS" - elif test -n "$PKG_CONFIG"; then - if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Svg >= 5.5.1\""; } >&5 - ($PKG_CONFIG --exists --print-errors "Qt5Svg >= 5.5.1") 2>&5 + ;; #( + "xyes") : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtCore >= 4.8.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "QtCore >= 4.8.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then - pkg_cv_Qt5Svg_CFLAGS=`$PKG_CONFIG --cflags "Qt5Svg >= 5.5.1" 2>/dev/null` - test "x$?" != "x0" && pkg_failed=yes -else - pkg_failed=yes -fi - else - pkg_failed=untried -fi -if test -n "$Qt5Svg_LIBS"; then - pkg_cv_Qt5Svg_LIBS="$Qt5Svg_LIBS" + +if test -n "$QT_QMAKE"; then + pkg_cv_QT_QMAKE="$QT_QMAKE" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Svg >= 5.5.1\""; } >&5 - ($PKG_CONFIG --exists --print-errors "Qt5Svg >= 5.5.1") 2>&5 + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtCore >= 4.8.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "QtCore >= 4.8.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then - pkg_cv_Qt5Svg_LIBS=`$PKG_CONFIG --libs "Qt5Svg >= 5.5.1" 2>/dev/null` + pkg_cv_QT_QMAKE=`$PKG_CONFIG --variable="moc_location" "QtCore >= 4.8.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes @@ -4583,71 +4553,82 @@ else pkg_failed=untried fi +QT_QMAKE=$pkg_cv_QT_QMAKE +if test "x$QT_QMAKE" = x""; then : - -if test $pkg_failed = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - -if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then - _pkg_short_errors_supported=yes else - _pkg_short_errors_supported=no + QT_QMAKE=`$as_dirname -- "$QT_QMAKE" || +$as_expr X"$QT_QMAKE" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$QT_QMAKE" : 'X\(//\)[^/]' \| \ + X"$QT_QMAKE" : 'X\(//\)$' \| \ + X"$QT_QMAKE" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$QT_QMAKE" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` fi - if test $_pkg_short_errors_supported = yes; then - Qt5Svg_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "Qt5Svg >= 5.5.1" 2>&1` - else - Qt5Svg_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "Qt5Svg >= 5.5.1" 2>&1` - fi - # Put the nasty error message in config.log where it belongs - echo "$Qt5Svg_PKG_ERRORS" >&5 - - as_fn_error $? "Package requirements (Qt5Svg >= 5.5.1) were not met: - -$Qt5Svg_PKG_ERRORS -Consider adjusting the PKG_CONFIG_PATH environment variable if you -installed software in a non-standard prefix. +fi -Alternatively, you may set the environment variables Qt5Svg_CFLAGS -and Qt5Svg_LIBS to avoid the need to call pkg-config. -See the pkg-config man page for more details." "$LINENO" 5 -elif test $pkg_failed = untried; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it -is in your PATH or set the PKG_CONFIG environment variable to the full -path to pkg-config. +if test -f "$QT_QMAKE/qmake"; then : + QT_QMAKE="$QT_QMAKE/qmake" +else + if test -f "$QT_QMAKE/qmake-qt4"; then : + QT_QMAKE="$QT_QMAKE/qmake-qt4" +else + QT_QMAKE="" +fi -Alternatively, you may set the environment variables Qt5Svg_CFLAGS -and Qt5Svg_LIBS to avoid the need to call pkg-config. -See the pkg-config man page for more details. +fi -To get pkg-config, see . -See \`config.log' for more details" "$LINENO" 5; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt4 qmake >= 4.8.0" >&5 +$as_echo_n "checking for Qt4 qmake >= 4.8.0... " >&6; } +if test "x$QT_QMAKE" != "x"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QT_QMAKE" >&5 +$as_echo "$QT_QMAKE" >&6; } else - Qt5Svg_CFLAGS=$pkg_cv_Qt5Svg_CFLAGS - Qt5Svg_LIBS=$pkg_cv_Qt5Svg_LIBS - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +$as_echo "not found" >&6; } fi + ;; #( + *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_qt4" >&5 +$as_echo "$with_qt4" >&6; } + as_fn_error $? "Unknown option \"$with_qt4\". Use either \"yes\" or \"no\"." "$LINENO" 5 ;; +esac +if test "x$QT_QMAKE" = "x"; then : + as_fn_error $? "Could not find qmake" "$LINENO" 5 fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether QtDBus should be enabled" >&5 $as_echo_n "checking whether QtDBus should be enabled... " >&6; } case "x$enable_qt_dbus" in #( "xyes") : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt5DBus >= 5.5.1" >&5 -$as_echo_n "checking for Qt5DBus >= 5.5.1... " >&6; } + if test "x$with_qt4" = "xno"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt5DBus >= 5.2.0" >&5 +$as_echo_n "checking for Qt5DBus >= 5.2.0... " >&6; } if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5DBus >= 5.5.1\""; } >&5 - ($PKG_CONFIG --exists --print-errors "Qt5DBus >= 5.5.1") 2>&5 + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5DBus >= 5.2.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "Qt5DBus >= 5.2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then @@ -4660,6 +4641,26 @@ HAVE_QTDBUS=false fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for QtDBus >= 4.8.0" >&5 +$as_echo_n "checking for QtDBus >= 4.8.0... " >&6; } + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtDBus >= 4.8.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "QtDBus >= 4.8.0") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 +$as_echo "found" >&6; } + HAVE_QTDBUS=true +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +$as_echo "not found" >&6; } + HAVE_QTDBUS=false +fi + +fi + if test "x$HAVE_QTDBUS" = "xfalse"; then : as_fn_error $? "Could not find QtDBus" "$LINENO" 5 else @@ -4679,17 +4680,19 @@ + # Check whether --with-boost was given. if test "${with_boost+set}" = set; then : withval=$with_boost; - case $withval in #( - no) : - want_boost="no";_AX_BOOST_BASE_boost_path="" ;; #( - yes) : - want_boost="yes";_AX_BOOST_BASE_boost_path="" ;; #( - *) : - want_boost="yes";_AX_BOOST_BASE_boost_path="$withval" ;; -esac + if test "$withval" = "no"; then + want_boost="no" + elif test "$withval" = "yes"; then + want_boost="yes" + ac_boost_path="" + else + want_boost="yes" + ac_boost_path="$withval" + fi else want_boost="yes" @@ -4701,121 +4704,78 @@ # Check whether --with-boost-libdir was given. if test "${with_boost_libdir+set}" = set; then : withval=$with_boost_libdir; - if test -d "$withval"; then : - _AX_BOOST_BASE_boost_lib_path="$withval" -else - as_fn_error $? "--with-boost-libdir expected directory name" "$LINENO" 5 -fi + if test -d "$withval" + then + ac_boost_lib_path="$withval" + else + as_fn_error $? "--with-boost-libdir expected directory name" "$LINENO" 5 + fi else - _AX_BOOST_BASE_boost_lib_path="" -fi - + ac_boost_lib_path="" -BOOST_LDFLAGS="" -BOOST_CPPFLAGS="" -if test "x$want_boost" = "xyes"; then : - - - if test "x1.35" = "x"; then : - _AX_BOOST_BASE_TONUMERICVERSION_req="1.20.0" -else - _AX_BOOST_BASE_TONUMERICVERSION_req="1.35" -fi - _AX_BOOST_BASE_TONUMERICVERSION_req_shorten=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([0-9]*\.[0-9]*\)'` - _AX_BOOST_BASE_TONUMERICVERSION_req_major=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([0-9]*\)'` - if test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_major" = "x"; then : - as_fn_error $? "You should at least specify libboost major version" "$LINENO" 5 fi - _AX_BOOST_BASE_TONUMERICVERSION_req_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[0-9]*\.\([0-9]*\)'` - if test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_minor" = "x"; then : - _AX_BOOST_BASE_TONUMERICVERSION_req_minor="0" -fi - _AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[0-9]*\.[0-9]*\.\([0-9]*\)'` - if test "X$_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor" = "X"; then : - _AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor="0" -fi - _AX_BOOST_BASE_TONUMERICVERSION_RET=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req_major \* 100000 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_minor \* 100 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor` - WANT_BOOST_VERSION=$_AX_BOOST_BASE_TONUMERICVERSION_RET - - succeeded=no - - - - case ${host_cpu} in #( - x86_64) : - libsubdirs="lib64 libx32 lib lib64" ;; #( - ppc64|s390x|sparc64|aarch64|ppc64le) : - libsubdirs="lib64 lib lib64" ;; #( - *) : - libsubdirs="lib" - ;; -esac - case ${host_cpu} in #( - i?86) : - multiarch_libsubdir="lib/i386-${host_os}" ;; #( - *) : - multiarch_libsubdir="lib/${host_cpu}-${host_os}" - ;; -esac - if test "x$_AX_BOOST_BASE_boost_path" != "x"; then : +if test "x$want_boost" = "xyes"; then + boost_lib_version_req=1.35 + boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([0-9]*\.[0-9]*\)'` + boost_lib_version_req_major=`expr $boost_lib_version_req : '\([0-9]*\)'` + boost_lib_version_req_minor=`expr $boost_lib_version_req : '[0-9]*\.\([0-9]*\)'` + boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[0-9]*\.[0-9]*\.\([0-9]*\)'` + if test "x$boost_lib_version_req_sub_minor" = "x" ; then + boost_lib_version_req_sub_minor="0" + fi + WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= $boost_lib_version_req" >&5 +$as_echo_n "checking for boostlib >= $boost_lib_version_req... " >&6; } + succeeded=no - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= 1.35 ($WANT_BOOST_VERSION) includes in \"$_AX_BOOST_BASE_boost_path/include\"" >&5 -$as_echo_n "checking for boostlib >= 1.35 ($WANT_BOOST_VERSION) includes in \"$_AX_BOOST_BASE_boost_path/include\"... " >&6; } - if test -d "$_AX_BOOST_BASE_boost_path/include" && test -r "$_AX_BOOST_BASE_boost_path/include"; then : + libsubdirs="lib" + ax_arch=`uname -m` + case $ax_arch in + x86_64) + libsubdirs="lib64 libx32 lib lib64" + ;; + ppc64|s390x|sparc64|aarch64|ppc64le) + libsubdirs="lib64 lib lib64 ppc64le" + ;; + esac - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include" - for _AX_BOOST_BASE_boost_path_tmp in $multiarch_libsubdir $libsubdirs; do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= 1.35 ($WANT_BOOST_VERSION) lib path in \"$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp\"" >&5 -$as_echo_n "checking for boostlib >= 1.35 ($WANT_BOOST_VERSION) lib path in \"$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp\"... " >&6; } - if test -d "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" && test -r "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" ; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"; - break; + libsubdirs="lib/${host_cpu}-${host_os} $libsubdirs" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - done -else - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - -else + case ${host_cpu} in + i?86) + libsubdirs="lib/i386-${host_os} $libsubdirs" + ;; + esac - if test X"$cross_compiling" = Xyes; then - search_libsubdirs=$multiarch_libsubdir - else - search_libsubdirs="$multiarch_libsubdir $libsubdirs" - fi - for _AX_BOOST_BASE_boost_path_tmp in /usr /usr/local /opt /opt/local ; do - if test -d "$_AX_BOOST_BASE_boost_path_tmp/include/boost" && test -r "$_AX_BOOST_BASE_boost_path_tmp/include/boost" ; then - for libsubdir in $search_libsubdirs ; do - if ls "$_AX_BOOST_BASE_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi + if test "$ac_boost_path" != ""; then + BOOST_CPPFLAGS="-I$ac_boost_path/include" + for ac_boost_path_tmp in $libsubdirs; do + if test -d "$ac_boost_path"/"$ac_boost_path_tmp" ; then + BOOST_LDFLAGS="-L$ac_boost_path/$ac_boost_path_tmp" + break + fi + done + elif test "$cross_compiling" != yes; then + for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do + if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then + for libsubdir in $libsubdirs ; do + if ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done - BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path_tmp/$libsubdir" - BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path_tmp/include" + BOOST_LDFLAGS="-L$ac_boost_path_tmp/$libsubdir" + BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include" break; fi done + fi -fi - - if test "x$_AX_BOOST_BASE_boost_lib_path" != "x"; then : - BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_lib_path" -fi + if test "$ac_boost_lib_path" != ""; then + BOOST_LDFLAGS="-L$ac_boost_lib_path" + fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= 1.35 ($WANT_BOOST_VERSION)" >&5 -$as_echo_n "checking for boostlib >= 1.35 ($WANT_BOOST_VERSION)... " >&6; } CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS @@ -4834,13 +4794,17 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include + #include int main () { -(void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($WANT_BOOST_VERSION))])); + #if BOOST_VERSION >= $WANT_BOOST_VERSION + // Everything is okay + #else + # error Boost version is too old + #endif ; return 0; @@ -4864,47 +4828,39 @@ - if test "x$succeeded" != "xyes" ; then + if test "x$succeeded" != "xyes"; then CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" BOOST_CPPFLAGS= - if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then - BOOST_LDFLAGS= - fi + BOOST_LDFLAGS= _version=0 - if test -n "$_AX_BOOST_BASE_boost_path" ; then - if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path"; then - for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do - _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` + if test "$ac_boost_path" != ""; then + if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then + for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do + _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` - if test "x$V_CHECK" = "x1" ; then + if test "$V_CHECK" = "1" ; then _version=$_version_tmp fi VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` - BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include/boost-$VERSION_UNDERSCORE" + BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE" done if test -z "$BOOST_CPPFLAGS"; then - if test -d "$_AX_BOOST_BASE_boost_path/boost" && test -r "$_AX_BOOST_BASE_boost_path/boost"; then - BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path" + if test -d "$ac_boost_path/boost" && test -r "$ac_boost_path/boost"; then + BOOST_CPPFLAGS="-I$ac_boost_path" fi fi - if test -n "$BOOST_CPPFLAGS" && test -z "$BOOST_LDFLAGS"; then - for libsubdir in $libsubdirs ; do - if ls "$_AX_BOOST_BASE_boost_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi - done - BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$libsubdir" - fi fi else - if test "x$cross_compiling" != "xyes" ; then - for _AX_BOOST_BASE_boost_path in /usr /usr/local /opt /opt/local ; do - if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path" ; then - for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do - _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` + if test "$cross_compiling" != yes; then + for ac_boost_path in /usr /usr/local /opt /opt/local ; do + if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then + for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do + _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` - if test "x$V_CHECK" = "x1" ; then + if test "$V_CHECK" = "1" ; then _version=$_version_tmp - best_path=$_AX_BOOST_BASE_boost_path + best_path=$ac_boost_path fi done fi @@ -4912,7 +4868,7 @@ VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE" - if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then + if test "$ac_boost_lib_path" = ""; then for libsubdir in $libsubdirs ; do if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done @@ -4920,7 +4876,7 @@ fi fi - if test -n "$BOOST_ROOT" ; then + if test "x$BOOST_ROOT" != "x"; then for libsubdir in $libsubdirs ; do if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done @@ -4929,7 +4885,7 @@ stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'` stage_version_shorten=`expr $stage_version : '\([0-9]*\.[0-9]*\)'` V_CHECK=`expr $stage_version_shorten \>\= $_version` - if test "x$V_CHECK" = "x1" && test -z "$_AX_BOOST_BASE_boost_lib_path" ; then + if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: We will use a staged boost library from $BOOST_ROOT" >&5 $as_echo "$as_me: We will use a staged boost library from $BOOST_ROOT" >&6;} BOOST_CPPFLAGS="-I$BOOST_ROOT" @@ -4953,13 +4909,17 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include + #include int main () { -(void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($WANT_BOOST_VERSION))])); + #if BOOST_VERSION >= $WANT_BOOST_VERSION + // Everything is okay + #else + # error Boost version is too old + #endif ; return 0; @@ -4982,71 +4942,41 @@ fi - if test "x$succeeded" != "xyes" ; then - if test "x$_version" = "x0" ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: We could not detect the boost libraries (version 1.35 or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation." >&5 -$as_echo "$as_me: We could not detect the boost libraries (version 1.35 or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation." >&6;} + if test "$succeeded" != "yes" ; then + if test "$_version" = "0" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation." >&5 +$as_echo "$as_me: We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation." >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: Your boost libraries seems to old (version $_version)." >&5 $as_echo "$as_me: Your boost libraries seems to old (version $_version)." >&6;} fi # execute ACTION-IF-NOT-FOUND (if present): - as_fn_error $? "Could not find Boost" "$LINENO" 5 + : else + + $as_echo "#define HAVE_BOOST /**/" >>confdefs.h # execute ACTION-IF-FOUND (if present): - { $as_echo "$as_me:${as_lineno-$LINENO}: Boost CPPFLAGS: \"$BOOST_CPPFLAGS\" - Boost LDFLAGS: \"$BOOST_LDFLAGS\"" >&5 -$as_echo "$as_me: Boost CPPFLAGS: \"$BOOST_CPPFLAGS\" - Boost LDFLAGS: \"$BOOST_LDFLAGS\"" >&6;} + : fi CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" - - fi - -CPPFLAGS="$BOOST_CPPFLAGS $CPPFLAGS" -LDFLAGS="$BOOST_LDFLAGS $LDFLAGS" - -# add workaround for problematic boost version -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -# taken from ax_boost_base.m4 - - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -(void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < (106000))])); - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - -else - QBT_ADD_DEFINES="$QBT_ADD_DEFINES BOOST_NO_CXX11_RVALUE_REFERENCES" +# HAVE_BOOST is set to an empty value when Boost is found. I don't know +# how to test for a set vs unset variable. +if test "x$BOOST_CPPFLAGS" = "x"; then : + as_fn_error $? "Could not find Boost" "$LINENO" 5 +else + { $as_echo "$as_me:${as_lineno-$LINENO}: Boost CPPFLAGS: $BOOST_CPPFLAGS" >&5 +$as_echo "$as_me: Boost CPPFLAGS: $BOOST_CPPFLAGS" >&6;} + CPPFLAGS="$BOOST_CPPFLAGS $CPPFLAGS" + LDFLAGS="$BOOST_LDFLAGS $LDFLAGS" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - @@ -5290,9 +5220,15 @@ LDFLAGS="$LDFLAGS_SAVED" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: Boost.System LIB: \"$BOOST_SYSTEM_LIB\"" >&5 -$as_echo "$as_me: Boost.System LIB: \"$BOOST_SYSTEM_LIB\"" >&6;} -LIBS="$BOOST_SYSTEM_LIB $LIBS" +# HAVE_BOOST_SYSTEM is set to an empty value when Boost.System is found. +# I don't know how to test for a set vs unset variable. +if test "x$BOOST_SYSTEM_LIB" = "x"; then : + as_fn_error $? "Could not find Boost.System" "$LINENO" 5 +else + { $as_echo "$as_me:${as_lineno-$LINENO}: Boost.System LIB: $BOOST_SYSTEM_LIB" >&5 +$as_echo "$as_me: Boost.System LIB: $BOOST_SYSTEM_LIB" >&6;} + LIBS="$BOOST_SYSTEM_LIB $LIBS" +fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking which qtsingleapplication to use" >&5 $as_echo_n "checking which qtsingleapplication to use... " >&6; } @@ -5311,6 +5247,118 @@ as_fn_error $? "Unknown option \"$with_qtsingleapplication\". Use either \"system\" or \"shipped\"." "$LINENO" 5 ;; esac +if test "x$with_qt4" = "xyes"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which qjson to use" >&5 +$as_echo_n "checking which qjson to use... " >&6; } + case "x$with_qjson" in #( + "xshipped") : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: shipped" >&5 +$as_echo "shipped" >&6; } + QBT_REMOVE_CONFIG="$QBT_REMOVE_CONFIG usesystemqjson" ;; #( + "xsystem") : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: system" >&5 +$as_echo "system" >&6; } + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for qjson" >&5 +$as_echo_n "checking for qjson... " >&6; } + +if test -n "$qjson_CFLAGS"; then + pkg_cv_qjson_CFLAGS="$qjson_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QJson >= 0.8.1\""; } >&5 + ($PKG_CONFIG --exists --print-errors "QJson >= 0.8.1") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_qjson_CFLAGS=`$PKG_CONFIG --cflags "QJson >= 0.8.1" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$qjson_LIBS"; then + pkg_cv_qjson_LIBS="$qjson_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QJson >= 0.8.1\""; } >&5 + ($PKG_CONFIG --exists --print-errors "QJson >= 0.8.1") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_qjson_LIBS=`$PKG_CONFIG --libs "QJson >= 0.8.1" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + qjson_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "QJson >= 0.8.1" 2>&1` + else + qjson_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "QJson >= 0.8.1" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$qjson_PKG_ERRORS" >&5 + + as_fn_error $? "Package requirements (QJson >= 0.8.1) were not met: + +$qjson_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +Alternatively, you may set the environment variables qjson_CFLAGS +and qjson_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details." "$LINENO" 5 +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +Alternatively, you may set the environment variables qjson_CFLAGS +and qjson_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details. + +To get pkg-config, see . +See \`config.log' for more details" "$LINENO" 5; } +else + qjson_CFLAGS=$pkg_cv_qjson_CFLAGS + qjson_LIBS=$pkg_cv_qjson_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + CPPFLAGS="$qjson_CFLAGS $CPPFLAGS" + LIBS="$qjson_LIBS $LIBS" +fi + QBT_ADD_CONFIG="$QBT_ADD_CONFIG usesystemqjson" ;; #( + *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_qjson" >&5 +$as_echo "$with_qjson" >&6; } + as_fn_error $? "Unknown option \"$with_qjson\". Use either \"system\" or \"shipped\"." "$LINENO" 5 ;; +esac + +fi + pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libtorrent" >&5 @@ -5577,7 +5625,7 @@ new_line=' ' # Convert " -" to "\n" if not between quotes and remove possible leading white spaces - string=$(echo " $*" | $SED -e "s: -:\\${new_line}:g" -e 's:"\(.*\)\n\(.*\)":\"\1 -\2":g' -e "s:'\(.*\)\n\(.*\)':\'\1 -\2':g" -e 's/^[[:space:]]*//') + string=$(echo " $*" | $SED -e "s: -:\\${new_line}:g" -e 's:"\(.*\)\n\(.*\)":\"\1 -\2":g' -e "s:'\(.*\)\n\(.*\)':\'\1 -\2':g" -e 's/^[:space:]*//') SAVEIFS=$IFS IFS=$(printf "\n\b") for i in $string; do @@ -5591,8 +5639,9 @@ IFS=$SAVEIFS } -extract "$CFLAGS $CPPFLAGS $CXXFLAGS" +extract $CPPFLAGS QBT_ADD_DEFINES="$QBT_ADD_DEFINES $QBT_CONF_DEFINES" +QBT_CONF_EXTRA_CFLAGS="$QBT_CONF_EXTRA_CFLAGS $CXXFLAGS" # Substitute the values of these vars in conf.pri.in @@ -6174,7 +6223,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by qbittorrent $as_me v4.1.3, which was +This file was extended by qbittorrent $as_me v3.2.0alpha, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -6226,13 +6275,13 @@ $config_commands Report bugs to . -qbittorrent home page: ." +qbittorrent home page: ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -qbittorrent config.status v4.1.3 +qbittorrent config.status v3.2.0alpha configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -7489,7 +7538,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by qbittorrent $as_me v4.1.3, which was +This file was extended by qbittorrent $as_me v3.2.0alpha, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -7541,13 +7590,13 @@ $config_commands Report bugs to . -qbittorrent home page: ." +qbittorrent home page: ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -qbittorrent config.status v4.1.3 +qbittorrent config.status v3.2.0alpha configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -8248,3 +8297,4 @@ as_fn_error $? "Failed running $QT_QMAKE to generate the makefile" "$LINENO" 5 fi $as_echo + diff -Nru qbittorrent-4.1.3/configure.ac qbittorrent-3.3.15/configure.ac --- qbittorrent-4.1.3/configure.ac 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/configure.ac 2017-08-03 20:30:10.000000000 +0000 @@ -1,4 +1,4 @@ -AC_INIT([qbittorrent], [v4.1.3], [bugs.qbittorrent.org], [], [https://www.qbittorrent.org/]) +AC_INIT([qbittorrent], [v3.2.0alpha], [bugs.qbittorrent.org], [], [http://www.qbittorrent.org/]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_MACRO_DIR([m4]) AC_PROG_CC @@ -12,24 +12,30 @@ # Define --wth-* and --enable-* arguments +AC_ARG_WITH(qt4, + [AS_HELP_STRING([--with-qt4], + [Compile using Qt4 (default=no)])], + [], + [with_qt4=no]) + AC_ARG_WITH(qtsingleapplication, [AS_HELP_STRING([--with-qtsingleapplication=@<:@system|shipped@:>@], [Use the shipped qtsingleapplication library or the system one (default=shipped)])], [], [with_qtsingleapplication=shipped]) +AC_ARG_WITH(qjson, + [AS_HELP_STRING([--with-qjson=@<:@system|shipped@:>@], + [Use the shipped qjson library or the system one (default=shipped) (Qt4 only)])], + [], + [with_qjson=shipped]) + AC_ARG_ENABLE(debug, [AS_HELP_STRING([--enable-debug], [Enable debug build])], [], [enable_debug=no]) -AC_ARG_ENABLE(stacktrace, - [AS_HELP_STRING([--enable-stacktrace], - [Enable stacktrace feature (default=auto)])], - [], - [enable_stacktrace=auto]) - AC_ARG_ENABLE(gui, [AS_HELP_STRING([--disable-gui], [Disable the GUI for headless running. Disables QtDBus and the GeoIP Database.])], @@ -86,23 +92,6 @@ [AC_MSG_RESULT([$enable_debug]) AC_MSG_ERROR([Unknown option "$enable_debug". Use either "yes" or "no".])]) -AC_MSG_CHECKING([whether to enable the stacktrace feature]) -AS_CASE(["x$enable_stacktrace"], - ["xno"], - [AC_MSG_RESULT([no]) - QBT_REMOVE_CONFIG="$QBT_REMOVE_CONFIG stacktrace"], - ["xyes"], - [AC_MSG_RESULT([yes]) - QBT_ADD_CONFIG="$QBT_ADD_CONFIG stacktrace"], - ["xauto"], - [AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include ]])], - [AC_MSG_RESULT([yes]) - QBT_ADD_CONFIG="$QBT_ADD_CONFIG stacktrace"], - [AC_MSG_RESULT([no]) - QBT_REMOVE_CONFIG="$QBT_REMOVE_CONFIG stacktrace"])], - [AC_MSG_RESULT([$enable_stacktrace]) - AC_MSG_ERROR([Unknown option "$enable_stacktrace". Use either "yes" or "no".])]) - AC_MSG_CHECKING([whether to enable the GUI]) AS_CASE(["x$enable_gui"], ["xyes"], @@ -138,13 +127,20 @@ [AC_MSG_RESULT([$enable_webui]) AC_MSG_ERROR([Unknown option "$enable_webui". Use either "yes" or "no".])]) -FIND_QT5() +AC_MSG_CHECKING([whether Qt4 should be enabled]) +AS_CASE(["x$with_qt4"], + ["xno"], + [AC_MSG_RESULT([no]) + FIND_QT5()], + ["xyes"], + [AC_MSG_RESULT([yes]) + FIND_QT4()], + [AC_MSG_RESULT([$with_qt4]) + AC_MSG_ERROR([Unknown option "$with_qt4". Use either "yes" or "no".])]) AS_IF([test "x$QT_QMAKE" = "x"], [AC_MSG_ERROR([Could not find qmake]) ]) -AS_IF([test "x$enable_gui" = "xyes"], - [PKG_CHECK_MODULES(Qt5Svg, [Qt5Svg >= 5.5.1]) - ]) + AC_MSG_CHECKING([whether QtDBus should be enabled]) AS_CASE(["x$enable_qt_dbus"], ["xyes"], @@ -161,27 +157,22 @@ AC_MSG_ERROR([Unknown option "$enable_qt_dbus". Use either "yes" or "no".])]) -AX_BOOST_BASE([1.35], - [AC_MSG_NOTICE([Boost CPPFLAGS: "$BOOST_CPPFLAGS" - Boost LDFLAGS: "$BOOST_LDFLAGS"])], - [AC_MSG_ERROR([Could not find Boost])]) -CPPFLAGS="$BOOST_CPPFLAGS $CPPFLAGS" -LDFLAGS="$BOOST_LDFLAGS $LDFLAGS" - -# add workaround for problematic boost version -AC_LANG_PUSH(C++) -# taken from ax_boost_base.m4 -m4_define([DETECT_BOOST_VERSION_PROGRAM], - [AC_LANG_PROGRAM([[#include ]], - [[(void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($1))]));]])]) - -AC_COMPILE_IFELSE([DETECT_BOOST_VERSION_PROGRAM(106000)], [], - [QBT_ADD_DEFINES="$QBT_ADD_DEFINES BOOST_NO_CXX11_RVALUE_REFERENCES"]) -AC_LANG_POP([C++]) +AX_BOOST_BASE([1.35]) +# HAVE_BOOST is set to an empty value when Boost is found. I don't know +# how to test for a set vs unset variable. +AS_IF([test "x$BOOST_CPPFLAGS" = "x"], + [AC_MSG_ERROR([Could not find Boost])], + [AC_MSG_NOTICE([Boost CPPFLAGS: $BOOST_CPPFLAGS]) + CPPFLAGS="$BOOST_CPPFLAGS $CPPFLAGS" + LDFLAGS="$BOOST_LDFLAGS $LDFLAGS"]) AX_BOOST_SYSTEM() -AC_MSG_NOTICE([Boost.System LIB: "$BOOST_SYSTEM_LIB"]) -LIBS="$BOOST_SYSTEM_LIB $LIBS" +# HAVE_BOOST_SYSTEM is set to an empty value when Boost.System is found. +# I don't know how to test for a set vs unset variable. +AS_IF([test "x$BOOST_SYSTEM_LIB" = "x"], + [AC_MSG_ERROR([Could not find Boost.System])], + [AC_MSG_NOTICE([Boost.System LIB: $BOOST_SYSTEM_LIB]) + LIBS="$BOOST_SYSTEM_LIB $LIBS"]) AC_MSG_CHECKING([which qtsingleapplication to use]) AS_CASE(["x$with_qtsingleapplication"], @@ -194,6 +185,23 @@ [AC_MSG_RESULT([$with_qtsingleapplication]) AC_MSG_ERROR([Unknown option "$with_qtsingleapplication". Use either "system" or "shipped".])]) +AS_IF([test "x$with_qt4" = "xyes"], + [AC_MSG_CHECKING([which qjson to use]) + AS_CASE(["x$with_qjson"], + ["xshipped"], + [AC_MSG_RESULT([shipped]) + QBT_REMOVE_CONFIG="$QBT_REMOVE_CONFIG usesystemqjson"], + ["xsystem"], + [AC_MSG_RESULT([system]) + PKG_CHECK_MODULES(qjson, + [QJson >= 0.8.1], + [CPPFLAGS="$qjson_CFLAGS $CPPFLAGS" + LIBS="$qjson_LIBS $LIBS"]) + QBT_ADD_CONFIG="$QBT_ADD_CONFIG usesystemqjson"], + [AC_MSG_RESULT([$with_qjson]) + AC_MSG_ERROR([Unknown option "$with_qjson". Use either "system" or "shipped".])]) + ]) + PKG_CHECK_MODULES(libtorrent, [libtorrent-rasterbar >= 1.0.6], [CPPFLAGS="$libtorrent_CFLAGS $CPPFLAGS" @@ -224,7 +232,7 @@ new_line=' ' # Convert " -" to "\n" if not between quotes and remove possible leading white spaces - string=$(echo " $*" | $SED -e "s: -:\\${new_line}:g" -e 's:"\(.*\)\n\(.*\)":\"\1 -\2":g' -e "s:'\(.*\)\n\(.*\)':\'\1 -\2':g" -e 's/^[[[:space:]]]*//') + string=$(echo " $*" | $SED -e "s: -:\\${new_line}:g" -e 's:"\(.*\)\n\(.*\)":\"\1 -\2":g' -e "s:'\(.*\)\n\(.*\)':\'\1 -\2':g" -e 's/^[[:space:]]*//') SAVEIFS=$IFS IFS=$(printf "\n\b") for i in $string; do @@ -238,8 +246,9 @@ IFS=$SAVEIFS } -extract "$CFLAGS $CPPFLAGS $CXXFLAGS" +extract $CPPFLAGS QBT_ADD_DEFINES="$QBT_ADD_DEFINES $QBT_CONF_DEFINES" +QBT_CONF_EXTRA_CFLAGS="$QBT_CONF_EXTRA_CFLAGS $CXXFLAGS" # Substitute the values of these vars in conf.pri.in AC_SUBST(QBT_CONF_INCLUDES) @@ -267,3 +276,4 @@ [AC_MSG_NOTICE([Good, your configure finished.])], [AC_MSG_ERROR([Failed running $QT_QMAKE to generate the makefile])]) AS_ECHO() + diff -Nru qbittorrent-4.1.3/conf.pri.windows qbittorrent-3.3.15/conf.pri.windows --- qbittorrent-4.1.3/conf.pri.windows 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/conf.pri.windows 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ -# Adapt these paths -# Point these to the include folders -INCLUDEPATH += $$quote(C:/qBittorrent/boost) -INCLUDEPATH += $$quote(C:/qBittorrent/libtorrent/include) -INCLUDEPATH += $$quote(C:/qBittorrent/zlib/include) -INCLUDEPATH += $$quote(C:/qBittorrent/openssl/include) -# Point these to the lib folders -LIBS += $$quote(-LC:/qBittorrent/boost/stage/lib) -LIBS += $$quote(-LC:/qBittorrent/libtorrent/lib) -LIBS += $$quote(-LC:/qBittorrent/zlib/lib) -LIBS += $$quote(-LC:/qBittorrent/openssl/lib) - -# Adapt the lib names/versions accordingly -# If you want to use Boost auto-linking then disable -# BOOST_ALL_NO_LIB below and omit Boost libraries here -CONFIG(debug, debug|release) { - LIBS += libtorrentd.lib \ - libboost_system-vc140-mt-sgd-1_64.lib -} -else { - LIBS += libtorrent.lib \ - libboost_system-vc140-mt-s-1_64.lib -} -LIBS += libeay32.lib ssleay32.lib -LIBS += zlib.lib -# ...or if you use MinGW -#CONFIG(debug, debug|release) { -# LIBS += libtorrent-rasterbar \ -# libboost_system-mt -#} -#else { -# LIBS += libtorrent-rasterbar \ -# libboost_system-mt -#} -#LIBS += libcrypto libssl -#LIBS += libz - -DEFINES += NTDDI_VERSION=0x05010000 -DEFINES += _WIN32_WINNT=0x0501 -DEFINES += _WIN32_IE=0x0501 - -# Disable to use Boost auto-linking -DEFINES += BOOST_ALL_NO_LIB -# Use one of the following options -DEFINES += BOOST_SYSTEM_STATIC_LINK -#DEFINES += BOOST_SYSTEM_DYN_LINK -# Boost 1.60+ defaults to Vista+ support. The define below enables XP support again. -DEFINES += BOOST_USE_WINAPI_VERSION=0x0501 -# Enable if building against libtorrent 1.0.x (RC_1_0) (static linking) -#DEFINES += BOOST_ASIO_SEPARATE_COMPILATION -# Enable if building against libtorrent 1.0.x (RC_1_0) (dynamic linking) -#DEFINES += BOOST_ASIO_DYN_LINK -# Enable if encountered build error with boost version <= 1.59 -#DEFINES += BOOST_NO_CXX11_RVALUE_REFERENCES - -# Enable if building against libtorrent 1.1.x (RC_1_1) -# built with this flag defined -#DEFINES += TORRENT_NO_DEPRECATE -# Enable if linking dynamically against libtorrent -#DEFINES += TORRENT_LINKING_SHARED - -# Enable stack trace support -CONFIG += stacktrace - -win32-msvc* { - QMAKE_CXXFLAGS += "/guard:cf" - QMAKE_LFLAGS += "/guard:cf" - QMAKE_LFLAGS_RELEASE += "/OPT:REF /OPT:ICF" -} diff -Nru qbittorrent-4.1.3/CONTRIBUTING.md qbittorrent-3.3.15/CONTRIBUTING.md --- qbittorrent-4.1.3/CONTRIBUTING.md 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/CONTRIBUTING.md 2017-08-03 20:30:10.000000000 +0000 @@ -1,221 +1,35 @@ -# How to contribute to qBittorrent +# Filing an issue -There are three main ways to contribute to the project. -Read the respective section to find out more. - -### Table Of Contents - -* **[Bug reporting etiquette](#bug-reporting-etiquette)** - - -* **[Submitting an issue/bug report](#submitting-an-issuebug-report)** - * [What is an actual bug report?](#what-is-an-actual-bug-report) - * [Before submitting a bug report](#before-submitting-a-bug-report) - * [Steps to ensure a good bug report](#steps-to-ensure-a-good-bug-report) - - -* **[Suggesting enhancements/feature requests](#suggesting-enhancementsfeature-requests)** - * [Before submitting an enhancement/feature request](#before-submitting-an-enhancementfeature-request) - * [Steps to ensure a good enhancement/feature suggestion](#steps-to-ensure-a-good-enhancementfeature-suggestion) - - -* **[Opening a pull request](#opening-a-pull-request)** - * [Must read](#must-read) - * [Good to know](#good-to-know) - -# Bug reporting etiquette - -* Issues, pull requests, and comments must always be in **English.** - -* This project is supported by volunteers, do not expect "customer support"-style interaction. - -* **Be patient.** The development team is small and resource limited. Developers and contributors take from their free time to analyze the problem and fix the issue. :clock3: - -* Harsh words or threats won't help your situation. What's worse, your complain will (very likely) be **ignored.** :fearful: - -# Submitting an issue/bug report - -This section guides you through submitting an issue/bug report for qBittorrent. - -Following these guidelines helps maintainers and the community understand your report, reproduce the behavior, and find related reports. - -Make sure to follow these rules carefully when submitting a bug report. Failure to do so will result in the issue being closed. - -## What is an actual bug report? - -Developers and contributors are not supposed to deal with issues for which little to no investigation to find the actual cause of a purported issue was made by the reporter. - -Positive contributions are those which are reported with efforts to find the actual cause of an issue, or at the very least efforts were made to narrow it as much as possible. - -Requiring people to investigate as much as possible before opening an issue will more than likely avoid burdening the project with invalid issues or issues unrelated to qBittorrent. - -The following are _not_ bug reports. **Check the [wiki][wiki-url], [forum][forum-url] or other places for help and support for issues like these**: - -- Explanation of qBittorrent options (see [wiki][wiki-url]). -- Help with WebUI setup. -- Help with embedded tracker setup. -- Help about BitTorrent in general. -- Issues with specific search plugins. -- Asking for specific builds of qBittorrent other than the current one. You can install older releases at your own risk or for regression testing purposes. Previous Windows and macOS builds are available [here][builds-url]. - - If you want older Linux builds, you will have to compile them yourself from the corresponding commits, or ask someone on the [forum][forum-url] to do it for you. -- Possibly others. Read on and use common sense. - -The issue tracker is for provable issues only: You will have to make the case that the issue is really with qBittorrent and not something else on your side. - -To make a case means to provide detailed steps so that anybody can reproduce the issue. -Be sure to rule out that the issue is not caused by something specific on your side. - -Issue reports for bugs that apparently aren't easily reproducible or that you can't figure out what triggers it even though you tried are OK. - -Any issue opened without effort to provide the required details for developers, contributors or anybody else to reproduce the problem will be closed as invalid. -For example: -- Crash reports with just a stack trace. -- Speculated performance issues that do not come with actual profiling data + analysis supporting the claim. - -## Before submitting a bug report - -- **Do some basic troubleshooting (examples)**: - - Restart qBittorrent. - - Restart your PC. - - Update your OS (e.g. Windows updates). - - Update your network card drivers. - - Fully reinstall qBittorrent. - - etc... -- Make sure the problem is not caused by anti-virus or other program messing with your files. -- Check if you can reproduce the problem in the latest version of qBittorrent. -- **Check [forum][forum-url] and [wiki][wiki-url].** You might be able to find the cause of the problem and fix things yourself. -- **Check if the issue exists already in the issue tracker.** - - If it does and the issue is still open, add a comment to the existing issue instead of opening a new one. - - If you find a Closed issue that seems like it is the same thing that you're experiencing, open a new issue and include a link to the original issue in the body of your new one. -- If the issue is with the search functionality: - - **Make sure you have [`python`][python-url] installed correctly (remember the search functionality requires a working python installation).** - - Make sure it is in fact a problem with the search functionality itself, and not a problem with the plugins. If something does not work properly with the search functionality, the first step is to rule out search plugin-related issues. - - For search plugin issues, report on the respective search plugin support page, or at [qbittorrent/search-plugins][search-plugins-url]. - -## Steps to ensure a good bug report - -**Follow these guidelines** in order to provide as much useful information as possible right away. Not all of them are applicable to all issues, but you are expected to follow most of these steps (use common sense). -Otherwise, we've noticed that a lot of your time (and the developers') gets thrown away on exchanging back and forth to get this information. - -* Use a **clear and descriptive title** for the issue to identify the problem. - -* Post only **one specific issue per submission.** - -* **Fill out the issue template properly.** - -- **Make sure you are using qBittorrent on a supported platform.** Do not submit issues which can only be reproduced on beta/unsupported releases of supported operating systems (e.g. Windows 10 Insider, Ubuntu 12.04 LTS, etc). -These are unstable/unsupported platforms, and in all likelihood, whatever the issue is, it is not related to qBittorrent. - -* **Specify the OS you're using, its version and architecture.** - * Examples: Windows 8.1 32-bit, Linux Mint 17.1 64-bit, Windows 10 Fall creators Update 64-bit, etc. - - -* **Report only if you run into the issue with an official stable release, a beta release, or with the most recent upstream changes (in this last case specify the specific commit you are on).** (beta testing is encouraged :smile:). We do not provide support for bugs on unofficial Windows builds. - -* **Specify the version of qBittorrent** you are using, as well as its **architecture** (x86 or x64) and its **libraries' versions** (Help -> About -> Libraries). - -* Specify **how you installed**: - - Linux: either from the PPA, your distribution's repositories, or compiled from source, or even possibly third-party repositories. - - Windows: either from the installer, or compiled from source, or even possibly third-party repositories. - - macOS: either from the installer, or compiled from source, or even possibly third-party repositories. - - -* **Describe the exact steps which reproduce the problem in as many details as possible.** - - For example, start by explaining how you started qBittorrent, e.g. was it via the terminal? Desktop icon? Did you start it as root or normal user? - - **When listing steps, don't just say what you did, but explain how you did it.** - - For example, if you added a torrent for download, did you do so via a `.torrent` file or via a magnet link? If it was with a torrent file did you do so by dragging the torrent file from the file manager to the transfer list, or did you use the "Add Torrent File" in the Top Bar? - - Describe the behavior you observed after following the steps and point out what exactly is the problem with that behavior; this is what we'll be looking for after executing the steps. - - -* **Explain which behavior you expected to see instead** and why. - -* Use **screenshots/animated GIFs to help describe the issue** whenever appropriate [(How?)][attachments-howto-url]. - -* If the problem wasn't triggered by a specific action, describe what you were doing before the problem happened. - -* **If you are reporting that qBittorrent crashes**, include the stack trace in the report; include it in a code block, a file attachment, or put it in a gist and provide link to that gist. - -* **For performance-related issues**, include as much profiling data as you can (resource usage graphs, etc). - -* Paste the **qBittorrent log** (or put the contents of the log in a gist and provide a link to the gist). The log can be viewed in the GUI (View -> Log -> tick all boxes). If you can't do that, the file is at: - - Linux: `~/.local/share/data/qBittorrent/logs/qBittorrent.log` - - Windows: `%LocalAppData%\qBittorrent\logs` - - macOS: `~/Library/Application Support/qBittorrent/qBittorrent.log` - - -* **Do NOT post comments like "+1" or "me too!"** without providing new relevant info on the issue. Using the built-in reactions is OK though. Remember that you can use the "subscribe" button to receive notifications of that report without having to comment first. - -* If there seems to be an **issue with specific torrent files/magnet links**: - - Don't post private `.torrent` files/magnet links, or ones that point to copyrighted content. If you are willing, offer to email a link or the `.torrent` file itself to whoever developer is debugging it and requests it. - - Make sure you can't reproduce the problem with another client, to rule out the possibility that the issue is with the `.torrent` file/magnet link itself. - - -* A screenshot, transcription or file upload of any of **qBittorrent's preferences that differ from the defaults.** Please include everything different from the defaults whether or not it seems relevant to your issue. - -* **Attachment rules**: - - Short logs and error messages can be pasted as quotes/code whenever small enough; otherwise make a gist with the contents and post the link to the gist. - - Avoid linking/attaching impractical file formats such as PDFs/Word documents with images. If you want to post an image, just post the image. - -### Provide more context by answering these questions (if applicable): - -- Can you **reliably reproduce the issue?** If not, provide details about how often the problem happens and under which conditions it normally happens (e.g. only happens with extremely large torrents/only happens after qBittorrent is open for more than 2 days/etc...) - -- Did the problem start happening recently (e.g. after updating to a new version of qBittorrent) or was this always a problem? - -- If the problem started happening recently, can you reproduce the problem in an older version of qBittorrent? - -- Are you saving files locally (in a disk in your machine), or are you saving them remotely (e.g. network drives)? - -- Are you using qBittorrent with multiple monitors? If so, can you reproduce the problem when you use a single monitor? - -Good read: [How to Report Bugs Effectively][howto-report-bugs-url] - -# Suggesting enhancements/feature requests - -This section guides you through submitting an enhancement suggestion for qBittorrent, including completely new features and minor improvements to existing functionality. - -Following these guidelines helps maintainers and the community understand your suggestion and find related suggestions. - -## Before submitting an enhancement/feature request - -* Check the [wiki][wiki-url] and [forum][forum-url] for tips — you might discover that the enhancement is already available. -* Most importantly, check if you're using the latest version of qBittorrent and if you can get the desired behavior by changing qBittorrent's settings. -* Check in the [releases][releases-url] page or on the [forum][forum-url], see if there's already a alpha/beta version with that enhancement. -* Perform a cursory search to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one. +### Must read +* If you aren't sure, you can ask on the [**forum**](http://forum.qbittorrent.org) or read our [**wiki**](http://wiki.qbittorrent.org) first. +* Do a quick **search**. Others might already reported the issue. +* Write in **English**! +* Provide **version** information: (You can find version numbers at menu `Help -> About -> Libraries`) + ``` + qBittorrent: + Qt: + libtorrent: + boost: + OS version: + ``` +* Provide **steps** to reproduce the problem, it will be easier to pinpoint the fault. +* **Screenshots**! A screenshot is worth a thousand words. just upload it. [(How?)](https://help.github.com/articles/file-attachments-on-issues-and-pull-requests) -## Steps to ensure a good enhancement/feature suggestion +### Good to know +* **Be patient**. The dev team is small and resource limited. Devs finding their free time, analyzing the problem and fixing the issue, it all takes time. :clock3: +* If you can code, why not become a **contributor** by fixing the issue and open a pull request? :wink: +* Harsh words or threats won't help your situation. What's worse, your complain will (very likely) to be **ignored**. :fearful: -- Specify which version of qBittorrent you're using. -- Specify the name and version of the OS you're using. -- Provide a step-by-step description of the suggested enhancement in as many details as possible. -- Describe the current behavior and explain which behavior you expected to see instead and why. -- Include screenshots and animated GIFs which help you demonstrate the steps or point out the part of qBittorrent which the suggestion is related to. -- If this enhancement exists in other BitTorrent clients, list those clients. # Opening a pull request ### Must read -* Read our [**coding guidelines**][coding-guidelines-url]. There are some scripts to help you: [uncrustify script][uncrustify-script-url], [astyle script][astyle-script-url], [(related thread)][coding-guidelines-thread-url]. -* Keep the title **short** and provide a **clear** description about what your pull request does. -* Provide **screenshots** for UI related changes. -* Keep your git commit history **clean** and **precise.** Refer to the section about "Git commit messages" in the [**coding guidelines**][coding-guidelines-url]. -* If your commit fixes a reported issue (for example #4134), add the following message to the commit `Closes #4134.`. Example [here][commit-message-fix-issue-example-url]. +* Read our [**coding guidelines**](https://github.com/qbittorrent/qBittorrent/blob/master/CODING_GUIDELINES.md). There are some scripts to help you: [uncrustify script](https://raw.githubusercontent.com/qbittorrent/qBittorrent/master/uncrustify.cfg), [astyle script](https://gist.github.com/Chocobo1/539cee860d1eef0acfa6), [(related thread)](https://github.com/qbittorrent/qBittorrent/issues/2192). +* Keep the title **short** and provide a **clear** description about what your pull request does. +* Provide **screenshots** for UI related changes. +* Keep your git commit history **clean** and **precise**. Commits like `xxx fixup` should not appear. +* If your commit fix a reported issue (for example #4134), add the following message to the commit `Closes #4134.`. Example [here](https://github.com/qbittorrent/qBittorrent/commit/a74bac20c4e8de9776bf9bb77fdc7526135d1988). ### Good to know -* **Search** pull request history! Others might have already implemented your idea and it is waiting to be merged (or got rejected already). Save your precious time by doing a search first. -* When resolving merge conflicts, do `git rebase `, don't do `git pull`. Then you can start fixing the conflicts. Here is a good explanation: [link][merging-vs-rebasing-url]. - -[astyle-script-url]: https://gist.github.com/Chocobo1/539cee860d1eef0acfa6 -[attachments-howto-url]: https://help.github.com/articles/file-attachments-on-issues-and-pull-requests -[coding-guidelines-url]: https://github.com/qbittorrent/qBittorrent/blob/master/CODING_GUIDELINES.md -[coding-guidelines-thread-url]: https://github.com/qbittorrent/qBittorrent/issues/2192 -[commit-message-fix-issue-example-url]: https://github.com/qbittorrent/qBittorrent/commit/c07cd440cd46345297debb47cb260f8688975f50 -[forum-url]: http://forum.qbittorrent.org/ -[howto-report-bugs-url]: https://www.chiark.greenend.org.uk/~sgtatham/bugs.html -[merging-vs-rebasing-url]: https://www.atlassian.com/git/tutorials/merging-vs-rebasing -[python-url]: https://www.python.org/ -[releases-url]: https://github.com/qbittorrent/qBittorrent/releases -[search-plugins-url]: https://github.com/qbittorrent/search-plugins -[uncrustify-script-url]: https://raw.githubusercontent.com/qbittorrent/qBittorrent/master/uncrustify.cfg -[wiki-url]: https://github.com/qbittorrent/qBittorrent/wiki -[builds-url]: https://sourceforge.net/projects/qbittorrent/files/ +* **Search** pull request history! Others might already implemented your idea and is waiting to be merged (or got rejected already). Save your precious time by doing a search first. +* When resolving merge conflicts, do `git rebase `, don't do `git pull`. Then you can start fixing the conflicts. Here is a good explanation: [link](https://www.atlassian.com/git/tutorials/merging-vs-rebasing). diff -Nru qbittorrent-4.1.3/debian/changelog qbittorrent-3.3.15/debian/changelog --- qbittorrent-4.1.3/debian/changelog 2018-10-05 06:58:32.000000000 +0000 +++ qbittorrent-3.3.15/debian/changelog 2018-10-05 07:11:00.000000000 +0000 @@ -1,32 +1,8 @@ -qbittorrent (4.1.3-1~ubuntu16.04.1~ppa1) xenial; urgency=medium +qbittorrent (3.3.15-1~ubuntu16.04.1~ppa1) xenial; urgency=medium * No-change backport to xenial - -- Micah Gersten Fri, 05 Oct 2018 01:58:32 -0500 - -qbittorrent (4.1.3-1) unstable; urgency=medium - - [ Helmut Grohne ] - * Partially fix FTCBFS: Let dh_auto_configure pass --host to ./configure. - (Closes: #886162) - - [ Andrew Starr-Bochicchio ] - * New upstream release (Closes: #900415, #908974, #893331). - * debian/control: - - Update VCS-* fields for salsa migration. - - Bump Standards-Version to 4.2.1, no changes. - * debian/rules: Remove unnecessary ' --parallel' dh argument - as it is now the default. - * Update lintian-overrides for new file locations. - - -- Andrew Starr-Bochicchio Sun, 23 Sep 2018 18:51:12 -0400 - -qbittorrent (4.0.3-1) unstable; urgency=medium - - * New upstream release (Closes: #883871). - * Build depend on libqt5svg5-dev. - - -- Andrew Starr-Bochicchio Mon, 25 Dec 2017 15:22:26 -0500 + -- Micah Gersten Fri, 05 Oct 2018 02:11:00 -0500 qbittorrent (3.3.15-1) unstable; urgency=medium diff -Nru qbittorrent-4.1.3/debian/control qbittorrent-3.3.15/debian/control --- qbittorrent-4.1.3/debian/control 2018-09-23 22:12:39.000000000 +0000 +++ qbittorrent-3.3.15/debian/control 2017-09-03 18:26:33.000000000 +0000 @@ -7,13 +7,12 @@ dpkg-dev (>= 1.16.1), libtorrent-rasterbar-dev (>= 1.1.2), libboost-dev, - libqt5svg5-dev, qtbase5-dev (>= 5.2.0), qttools5-dev-tools, zlib1g-dev -Standards-Version: 4.2.1 -Vcs-Git: https://salsa.debian.org/debian/qbittorrent.git -Vcs-Browser: https://salsa.debian.org/debian/qbittorrent +Standards-Version: 4.1.0 +Vcs-Git: git://anonscm.debian.org/collab-maint/qbittorrent.git +Vcs-Browser: http://anonscm.debian.org/gitweb/?p=collab-maint/qbittorrent.git Homepage: http://www.qbittorrent.org/ Package: qbittorrent diff -Nru qbittorrent-4.1.3/debian/.gitlab-ci.yml qbittorrent-3.3.15/debian/.gitlab-ci.yml --- qbittorrent-4.1.3/debian/.gitlab-ci.yml 2018-09-23 21:58:39.000000000 +0000 +++ qbittorrent-3.3.15/debian/.gitlab-ci.yml 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -image: registry.gitlab.com/eighthave/ci-image-git-buildpackage:latest - -build: - artifacts: - paths: - - "*.deb" - expire_in: 1 day - script: - - gitlab-ci-git-buildpackage-all diff -Nru qbittorrent-4.1.3/debian/missing-sources/clipboard.js qbittorrent-3.3.15/debian/missing-sources/clipboard.js --- qbittorrent-4.1.3/debian/missing-sources/clipboard.js 2018-09-23 22:21:14.000000000 +0000 +++ qbittorrent-3.3.15/debian/missing-sources/clipboard.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,135 +0,0 @@ -import ClipboardAction from './clipboard-action'; -import Emitter from 'tiny-emitter'; -import listen from 'good-listener'; - -/** - * Base class which takes one or more elements, adds event listeners to them, - * and instantiates a new `ClipboardAction` on each click. - */ -class Clipboard extends Emitter { - /** - * @param {String|HTMLElement|HTMLCollection|NodeList} trigger - * @param {Object} options - */ - constructor(trigger, options) { - super(); - - this.resolveOptions(options); - this.listenClick(trigger); - } - - /** - * Defines if attributes would be resolved using internal setter functions - * or custom functions that were passed in the constructor. - * @param {Object} options - */ - resolveOptions(options = {}) { - this.action = (typeof options.action === 'function') ? options.action : this.defaultAction; - this.target = (typeof options.target === 'function') ? options.target : this.defaultTarget; - this.text = (typeof options.text === 'function') ? options.text : this.defaultText; - this.container = (typeof options.container === 'object') ? options.container : document.body; - } - - /** - * Adds a click event listener to the passed trigger. - * @param {String|HTMLElement|HTMLCollection|NodeList} trigger - */ - listenClick(trigger) { - this.listener = listen(trigger, 'click', (e) => this.onClick(e)); - } - - /** - * Defines a new `ClipboardAction` on each click event. - * @param {Event} e - */ - onClick(e) { - const trigger = e.delegateTarget || e.currentTarget; - - if (this.clipboardAction) { - this.clipboardAction = null; - } - - this.clipboardAction = new ClipboardAction({ - action : this.action(trigger), - target : this.target(trigger), - text : this.text(trigger), - container : this.container, - trigger : trigger, - emitter : this - }); - } - - /** - * Default `action` lookup function. - * @param {Element} trigger - */ - defaultAction(trigger) { - return getAttributeValue('action', trigger); - } - - /** - * Default `target` lookup function. - * @param {Element} trigger - */ - defaultTarget(trigger) { - const selector = getAttributeValue('target', trigger); - - if (selector) { - return document.querySelector(selector); - } - } - - /** - * Returns the support of the given action, or all actions if no action is - * given. - * @param {String} [action] - */ - static isSupported(action = ['copy', 'cut']) { - const actions = (typeof action === 'string') ? [action] : action; - let support = !!document.queryCommandSupported; - - actions.forEach((action) => { - support = support && !!document.queryCommandSupported(action); - }); - - return support; - } - - /** - * Default `text` lookup function. - * @param {Element} trigger - */ - defaultText(trigger) { - return getAttributeValue('text', trigger); - } - - /** - * Destroy lifecycle. - */ - destroy() { - this.listener.destroy(); - - if (this.clipboardAction) { - this.clipboardAction.destroy(); - this.clipboardAction = null; - } - } -} - - -/** - * Helper function to retrieve attribute value. - * @param {String} suffix - * @param {Element} element - */ -function getAttributeValue(suffix, element) { - const attribute = `data-clipboard-${suffix}`; - - if (!element.hasAttribute(attribute)) { - return; - } - - return element.getAttribute(attribute); -} - -module.exports = Clipboard; diff -Nru qbittorrent-4.1.3/debian/patches/honor-buildflags.patch qbittorrent-3.3.15/debian/patches/honor-buildflags.patch --- qbittorrent-4.1.3/debian/patches/honor-buildflags.patch 2018-09-23 22:09:11.000000000 +0000 +++ qbittorrent-3.3.15/debian/patches/honor-buildflags.patch 2017-09-03 17:34:18.000000000 +0000 @@ -5,15 +5,15 @@ Index: qbittorrent/unixconf.pri =================================================================== ---- qbittorrent.orig/unixconf.pri 2018-09-23 18:07:17.491619461 -0400 -+++ qbittorrent/unixconf.pri 2018-09-23 18:08:57.342001409 -0400 -@@ -12,8 +12,9 @@ +--- qbittorrent.orig/unixconf.pri 2015-12-26 14:39:32.176931136 -0500 ++++ qbittorrent/unixconf.pri 2015-12-26 14:39:32.172931077 -0500 +@@ -15,8 +15,9 @@ # COMPILATION SPECIFIC !nogui:dbus: QT += dbus --QMAKE_CXXFLAGS += -Wall -Wextra -Wpedantic -Wformat-security +-QMAKE_CXXFLAGS += -Wformat -Wformat-security -!haiku: QMAKE_LFLAGS_APP += -rdynamic -+QMAKE_CXXFLAGS += -Wall -Wextra -Wpedantic -Wformat-security $$(CXXFLAGS) $$(CPPFLAGS) ++QMAKE_CXXFLAGS += -Wformat -Wformat-security $$(CXXFLAGS) $$(CPPFLAGS) +QMAKE_LFLAGS_RELEASE += $$(LDFLAGS) +!haiku: QMAKE_LFLAGS_APP += -rdynamic $$(LDFLAGS) diff -Nru qbittorrent-4.1.3/debian/patches/kfreebsd-detection.patch qbittorrent-3.3.15/debian/patches/kfreebsd-detection.patch --- qbittorrent-4.1.3/debian/patches/kfreebsd-detection.patch 2018-09-23 22:09:35.000000000 +0000 +++ qbittorrent-3.3.15/debian/patches/kfreebsd-detection.patch 2017-09-03 17:46:46.000000000 +0000 @@ -5,9 +5,9 @@ Index: qbittorrent/configure.ac =================================================================== ---- qbittorrent.orig/configure.ac 2018-09-23 18:09:29.646778507 -0400 -+++ qbittorrent/configure.ac 2018-09-23 18:09:29.642778409 -0400 -@@ -56,7 +56,7 @@ +--- qbittorrent.orig/configure.ac 2017-09-03 13:46:41.639063027 -0400 ++++ qbittorrent/configure.ac 2017-09-03 13:46:41.635062935 -0400 +@@ -62,7 +62,7 @@ # Detect OS AC_MSG_CHECKING([whether OS is FreeBSD]) @@ -18,9 +18,9 @@ [AC_MSG_RESULT([no])]) Index: qbittorrent/configure =================================================================== ---- qbittorrent.orig/configure 2018-09-23 18:09:29.646778507 -0400 -+++ qbittorrent/configure 2018-09-23 18:09:29.642778409 -0400 -@@ -4234,7 +4234,7 @@ +--- qbittorrent.orig/configure 2017-09-03 13:46:41.639063027 -0400 ++++ qbittorrent/configure 2017-09-03 13:46:41.635062935 -0400 +@@ -4248,7 +4248,7 @@ # Detect OS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether OS is FreeBSD" >&5 $as_echo_n "checking whether OS is FreeBSD... " >&6; } diff -Nru qbittorrent-4.1.3/debian/rules qbittorrent-3.3.15/debian/rules --- qbittorrent-4.1.3/debian/rules 2018-09-23 22:13:59.000000000 +0000 +++ qbittorrent-3.3.15/debian/rules 2016-10-29 19:56:06.000000000 +0000 @@ -5,12 +5,12 @@ include /usr/share/dpkg/buildflags.mk %: - dh $@ --without autoreconf + dh $@ --without autoreconf --parallel override_dh_auto_configure: - dh_auto_configure --builddirectory build-nox -- --disable-gui \ + mkdir -p build-nox && cd build-nox && ../configure --prefix=/usr --disable-gui \ --with-boost-libdir=/usr/lib/$(DEB_HOST_MULTIARCH) - dh_auto_configure --builddirectory build-gui -- \ + mkdir -p build-gui && cd build-gui && ../configure --prefix=/usr \ --with-boost-libdir=/usr/lib/$(DEB_HOST_MULTIARCH) override_dh_auto_build: diff -Nru qbittorrent-4.1.3/debian/source/lintian-overrides qbittorrent-3.3.15/debian/source/lintian-overrides --- qbittorrent-4.1.3/debian/source/lintian-overrides 2018-09-23 22:25:37.000000000 +0000 +++ qbittorrent-3.3.15/debian/source/lintian-overrides 2017-09-03 17:34:18.000000000 +0000 @@ -1,9 +1,7 @@ # False positive. File is not minified. -source-is-missing src/webui/www/private/scripts/lib/excanvas-compressed.js -source-is-missing src/webui/www/private/scripts/mocha-init.js line length is 485 characters (>256) +source-is-missing src/webui/www/public/scripts/excanvas-compressed.js +source-is-missing src/webui/www/public/scripts/mocha-init.js line length is 445 characters (>256) # Full source provided in debian/missing-sources -source-is-missing src/webui/www/private/scripts/lib/mootools-1.2-core-yc.js -source-is-missing src/webui/www/public/scripts/lib/mootools-1.2-core-yc.js +source-is-missing src/webui/www/public/scripts/mootools-1.2-core-yc.js source-is-missing debian/missing-sources/mootools-1.2-core-yc.js -source-is-missing src/webui/www/private/scripts/lib/clipboard.min.js \ No newline at end of file diff -Nru qbittorrent-4.1.3/dist/CMakeLists.txt qbittorrent-3.3.15/dist/CMakeLists.txt --- qbittorrent-4.1.3/dist/CMakeLists.txt 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/dist/CMakeLists.txt 2017-08-03 20:30:10.000000000 +0000 @@ -1,5 +1,3 @@ -find_package(Qt5Widgets ${requiredQtVersion}) # to conditionally install desktop-related files - if (APPLE) add_subdirectory(mac) else (APPLE) diff -Nru qbittorrent-4.1.3/dist/mac/bundle.cmake qbittorrent-3.3.15/dist/mac/bundle.cmake --- qbittorrent-4.1.3/dist/mac/bundle.cmake 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/dist/mac/bundle.cmake 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,3 @@ +set(BU_CHMOD_BUNDLE_ITEMS ON) +include(BundleUtilities) +fixup_bundle("$ENV{DESTDIR}/${CMAKE_INSTALL_PREFIX}/qbittorrent.app" "" "") diff -Nru qbittorrent-4.1.3/dist/mac/Info.plist qbittorrent-3.3.15/dist/mac/Info.plist --- qbittorrent-4.1.3/dist/mac/Info.plist 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/dist/mac/Info.plist 2017-08-03 20:30:10.000000000 +0000 @@ -45,7 +45,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 4.1.3 + 3.3.15 CFBundleSignature qBit CFBundleExecutable @@ -59,7 +59,7 @@ NSAppleScriptEnabled YES NSHumanReadableCopyright - Copyright © 2006-2018 The qBittorrent project + Copyright © 2006-2017 The qBittorrent project UTExportedTypeDeclarations Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/mac/qBitTorrentDocument.icns and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/mac/qBitTorrentDocument.icns differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/mac/qbittorrent_mac.icns and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/mac/qbittorrent_mac.icns differ diff -Nru qbittorrent-4.1.3/dist/unix/CMakeLists.txt qbittorrent-3.3.15/dist/unix/CMakeLists.txt --- qbittorrent-4.1.3/dist/unix/CMakeLists.txt 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/dist/unix/CMakeLists.txt 2017-08-03 20:30:10.000000000 +0000 @@ -1,48 +1,39 @@ -if (NOT Qt5Widgets_FOUND) - feature_option(SYSTEMD "Install systemd service file (headless only)" OFF) - if (SYSTEMD) - if (NOT Systemd_SERVICES_INSTALL_DIR) - find_package(Systemd) - if (NOT Systemd_FOUND) - message(FATAL_ERROR "Could not locate systemd services install dir." - " Either pass -DSystemd_SERVICES_INSTALL_DIR=/path/to/systemd/services option or install systemd pkg-config") - endif(NOT Systemd_FOUND) - endif(NOT Systemd_SERVICES_INSTALL_DIR) +if (SYSTEMD) + find_package(Systemd) + if (SYSTEMD_FOUND) set(EXPAND_BINDIR ${CMAKE_INSTALL_FULL_BINDIR}) configure_file(systemd/qbittorrent-nox@.service.in ${CMAKE_CURRENT_BINARY_DIR}/qbittorrent-nox@.service @ONLY) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/qbittorrent-nox@.service - DESTINATION ${Systemd_SERVICES_INSTALL_DIR} + DESTINATION ${SYSTEMD_SERVICES_INSTALL_DIR} COMPONENT data) - endif(SYSTEMD) -endif() + endif(SYSTEMD_FOUND) +endif(SYSTEMD) + -if (Qt5Widgets_FOUND) +if (GUI) list(APPEND MAN_FILES ${qBittorrent_SOURCE_DIR}/doc/qbittorrent.1) -else (Qt5Widgets_FOUND) +else (GUI) list(APPEND MAN_FILES ${qBittorrent_SOURCE_DIR}/doc/qbittorrent-nox.1) -endif (Qt5Widgets_FOUND) +endif (GUI) install(FILES ${MAN_FILES} DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 COMPONENT doc) -if (Qt5Widgets_FOUND) +if (GUI) install(DIRECTORY menuicons/ DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor FILES_MATCHING PATTERN "*.png") - install(FILES qbittorrent.desktop + install(FILES ${qBittorrent_SOURCE_DIR}/src/icons/qbittorrent.png + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pixmaps/ + COMPONENT data) + + install(FILES ${qBittorrent_SOURCE_DIR}/src/icons/qbittorrent.desktop DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications/ COMPONENT data) install(FILES qbittorrent.appdata.xml DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/appdata/ COMPONENT data) - - install(FILES - ${qBittorrent_SOURCE_DIR}/src/icons/skin/qbittorrent-tray.svg - ${qBittorrent_SOURCE_DIR}/src/icons/skin/qbittorrent-tray-dark.svg - ${qBittorrent_SOURCE_DIR}/src/icons/skin/qbittorrent-tray-light.svg - DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/status - COMPONENT data) endif() Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/128x128/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/128x128/apps/qbittorrent.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/128x128/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/128x128/status/qbittorrent-tray.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/16x16/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/16x16/apps/qbittorrent.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/16x16/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/16x16/status/qbittorrent-tray.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/192x192/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/192x192/apps/qbittorrent.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/192x192/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/192x192/status/qbittorrent-tray.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/22x22/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/22x22/apps/qbittorrent.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/22x22/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/22x22/status/qbittorrent-tray.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/24x24/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/24x24/apps/qbittorrent.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/24x24/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/24x24/status/qbittorrent-tray.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/32x32/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/32x32/apps/qbittorrent.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/32x32/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/32x32/status/qbittorrent-tray.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/36x36/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/36x36/apps/qbittorrent.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/36x36/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/36x36/status/qbittorrent-tray.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/48x48/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/48x48/apps/qbittorrent.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/48x48/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/48x48/status/qbittorrent-tray.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/64x64/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/64x64/apps/qbittorrent.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/64x64/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/64x64/status/qbittorrent-tray.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/72x72/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/72x72/apps/qbittorrent.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/72x72/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/72x72/status/qbittorrent-tray.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/96x96/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/96x96/apps/qbittorrent.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/96x96/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/96x96/status/qbittorrent-tray.png differ diff -Nru qbittorrent-4.1.3/dist/unix/qbittorrent.appdata.xml qbittorrent-3.3.15/dist/unix/qbittorrent.appdata.xml --- qbittorrent-4.1.3/dist/unix/qbittorrent.appdata.xml 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/dist/unix/qbittorrent.appdata.xml 2017-08-03 20:30:10.000000000 +0000 @@ -11,7 +11,7 @@ Aiming to be a good alternative to all other bittorrent clients out there, qBittorrent is fast, stable and provides unicode support as well as many other features. Additionally, qBittorrent runs and provides those - same features on all major platforms (Linux, Mac OS X, Windows, FreeBSD). + same features on all major platforms (Linux, Mac OS X, Windows, OS/2, FreeBSD).

It is programmed in C++ / Qt and uses libtorrent (sometimes called @@ -56,7 +56,7 @@ - https://www.qbittorrent.org/ + http://www.qbittorrent.org/ sledgehammer999@qbittorrent.org The qBittorrent Project http://bugs.qbittorrent.org/ diff -Nru qbittorrent-4.1.3/dist/unix/qbittorrent.desktop qbittorrent-3.3.15/dist/unix/qbittorrent.desktop --- qbittorrent-4.1.3/dist/unix/qbittorrent.desktop 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/dist/unix/qbittorrent.desktop 1970-01-01 00:00:00.000000000 +0000 @@ -1,190 +0,0 @@ -[Desktop Entry] -Categories=Network;FileTransfer;P2P;Qt; -Exec=qbittorrent %U -GenericName=BitTorrent client -Comment=Download and share files over BitTorrent -Icon=qbittorrent -MimeType=application/x-bittorrent;x-scheme-handler/magnet; -Name=qBittorrent -Terminal=false -Type=Application -StartupNotify=false -StartupWMClass=qbittorrent -Keywords=bittorrent;torrent;magnet;download;p2p; - -# Translations -Comment[oc]=Telecargar e partejar de fichièrs amb BitTorrent -GenericName[oc]=Client BitTorrent -Name[oc]=qBittorrent -Comment[af]=Aflaai en deel lêers oor BitTorrent -GenericName[af]=BitTorrent kliënt -Name[af]=qBittorrent -Comment[ar]=نزّل وشارك الملفات عبر كيوبت‎تورنت -GenericName[ar]=عميل بت‎تورنت -Name[ar]=كيوبت‎تورنت -Comment[be]=Сцягванне і раздача файлаў праз пратакол BitTorrent -GenericName[be]=BitTorrent-кліент -Name[be]=qBittorrent -Comment[bg]=Сваляне и споделяне на файлове чрез BitTorrent -GenericName[bg]=BitTorrent клиент -Name[bg]=qBittorrent -Comment[bn]=বিটটরেন্টে ফাইল ডাউনলোড এবং শেয়ার করুন -GenericName[bn]=বিটটরেন্ট ক্লায়েন্ট -Name[bn]=কিউবি্টটরেন্ট -Comment[bs]=Preuzmi i dijeli datoteke preko BitTorrent-a -GenericName[bs]=BitTorrent klijent -Name[bs]=qBittorrent -Comment[ca]=Baixeu i compartiu fitxers mitjançant BitTorrent -GenericName[ca]=Client de BitTorrent -Name[ca]=qBittorrent -Comment[cs]=Stahování a sdílení souborů přes síť BitTorrent -GenericName[cs]=BitTorrent klient -Name[cs]=qBittorrent -Comment[da]=Download og del filer over BitTorrent -GenericName[da]=BitTorrent klient -Name[da]=qBittorrent -Comment[de]=Über BitTorrent Dateien herunterladen und teilen -GenericName[de]=BitTorrent Client -Name[de]=qBittorrent -Comment[el]=Κάντε λήψη και ανταλάξτε αρχεία μέσω BitTorrent -GenericName[el]=Πελάτης BitTorrent -Name[el]=qBittorrent -Comment[en_GB]=Download and share files over BitTorrent -GenericName[en_GB]=BitTorrent client -Name[en_GB]=qBittorrent -Comment[es]=Descargue y comparta archivos por BitTorrent -GenericName[es]=Cliente BitTorrent -Name[es]=qBittorrent -Comment[eu]=Jeitsi eta elkarbanatu agiriak BitTorrent-en -GenericName[eu]=BitTorrent bezeroa -Name[eu]=qBittorrent -Comment[fa]=دانلود و به اشتراک گذاری فایل های بوسیله بیت تورنت -GenericName[fa]=بیت تورنت نسخه کلاینت -Name[fa]=کیو بیت تورنت -Comment[fi]=Lataa ja jaa tiedostoja BitTorrentia käyttäen -GenericName[fi]=BitTorrent-asiakasohjelma -Name[fi]=qBittorrent -Comment[fr]=Télécharger et partager des fichiers avec BitTorrent -GenericName[fr]=Client BitTorrent -Name[fr]=qBittorrent -Comment[gl]=Descargar e compartir ficheiros co protocolo BitTorrent -GenericName[gl]=Cliente BitTorrent -Name[gl]=qBittorrent -Comment[gu]=બિટ્ટોરેંટ પર ફાઈલો ડાઉનલોડ અને શેર કરો -GenericName[gu]=બિટ્ટોરેંટ ક્લાયન્ટ -Name[gu]=ક્યૂ-બિટ્ટોરેંટ -Comment[he]=הורד ושתף קבצים על גבי ביטורנט -GenericName[he]=לקוח ביטורנט -Name[he]=qBittorrent -Comment[hr]=Preuzmite i dijelite datoteke putem BitTorrenta -GenericName[hr]=BitTorrent klijent -Name[hr]=qBittorrent -Comment[hu]=Fájlok letöltése és megosztása a BitTorrent hálózaton keresztül -GenericName[hu]=BitTorrent kliens -Name[hu]=qBittorrent -Comment[id]=Unduh dan berbagi berkas melalui BitTorrent -GenericName[id]=Klien BitTorrent -Name[id]=qBittorrent -Comment[is]=Sækja og deila skrám yfir BitTorrent -GenericName[is]=BitTorrent biðlarar -Name[is]=qBittorrent -Comment[it]=Client BitTorrent per il download di file via internet -GenericName[it]=Client BitTorrent -Name[it]=qBittorrent -Comment[ja]=BitTorrent でファイルをダウンロードおよび共有します -GenericName[ja]=BitTorrent クライアント -Name[ja]=qBittorrent -Comment[ka]=ჩამოტვირთე და გააზიარე ფაილები Bittorrent-ის საშუალებით -GenericName[ka]=BitTorrent კლიენტი -Name[ka]=qBittorrent -Comment[ko]=비트토런트를 통해 파일을 다운로드하고 공유합니다 -GenericName[ko]=비트토런트 클라이언트 -Name[ko]=큐빗토런트 -Comment[zh]=通过 BitTorrent 下载和分享文件 -GenericName[zh]=BitTorrent 客户端 -Name[zh]=qBittorrent -Comment[lt]=Atsisiųskite bei dalinkitės failais BitTorrent tinkle -GenericName[lt]=BitTorrent klientas -Name[lt]=qBittorrent -Comment[nb]=Last ned og del filer over BitTorrent -GenericName[nb]=BitTorrent-klient -Name[nb]=qBittorrent -Comment[nqo]=ߞߐߕߐ߯ߘߐ ߟߎ߬ ߟߊߖߌ߰ ߞߊ߬ ߓߊ߲߫ ߞߵߊ߬ߟߎ߬ ߘߐߕߟߊ߫ ߓߌߙߏߙߍ߲ߕ ߞߊ߲߬ -GenericName[nqo]=ߓߌߙߏߙߍ߲ߕ ߕߣߐ߬ߓߐ߬ߟߊ -Name[nqo]=ߞߎ߳ߓߌߕߏߙߍ߲ߕ -Comment[nl]=Bestanden downloaden en delen via BitTorrent -GenericName[nl]=BitTorrent-cliënt -Name[nl]=qBittorrent -Comment[pl]=Pobieraj i dziel się plikami przez BitTorrent -GenericName[pl]=Klient BitTorrent -Name[pl]=qBittorrent -Comment[pt]=Transferir e partilhar ficheiros por BitTorrent -GenericName[pt]=Cliente BitTorrent -Name[pt]=qBittorrent -Comment[pt_BR]=Baixe e compartilhe arquivos por BitTorrent -GenericName[pt_BR]=Cliente BitTorrent -Name[pt_BR]=qBittorrent -Comment[ro]=Descărcați și partajați fișiere prin BitTorrent -GenericName[ro]=Client BitTorrent -Name[ro]=qBittorrent -Comment[ru]=Скачивайте и делитесь файлами с помощью BitTorrent -GenericName[ru]=BitTorrent-клиент -Name[ru]=qBittorrent -Comment[sk]=Sťahovanie a zdieľanie súborov prostredníctvom siete BitTorrent -GenericName[sk]=Klient siete BitTorrent -Name[sk]=qBittorrent -Comment[sl]=Prenesite in delite datoteke preko BitTorrenta -GenericName[sl]=BitTorrent odjemalec -Name[sl]=qBittorrent -GenericName[sr]=BitTorrent-клијент -Comment[sr@latin]=Preuzimanje i deljenje fajlova preko BitTorrent-a -GenericName[sr@latin]=BitTorrent klijent -Name[sr@latin]=qBittorrent -Comment[sv]=Hämta och dela filer över BitTorrent -GenericName[sv]=BitTorrent-klient -Name[sv]=qBittorrent -Comment[uz@Latn]=BitTorrent orqali fayllarni yuklab olish va baham ko‘rish -GenericName[uz@Latn]=BitTorrent mijozi -Name[uz@Latn]=qBittorrent -Comment[te]=క్యు బిట్ టొరెంట్ తో ఫైల్స్ దిగుమతి చేసుకోండి , పంచుకోండి -GenericName[te]=క్యు బిట్ టొరెంట్ క్లయింట్ -Name[te]=క్యు బిట్ టొరెంట్ -Comment[hi_IN]= अपनी फाइलें BitTorrent के माध्यम से डाउनलोड आैर साॅझा करें -GenericName[hi_IN]=BitTorrent उपभोक्ता -Name[hi_IN]=qBittorrent -Comment[tr]=Dosyaları BitTorrent üzerinden indirin ve paylaşın -GenericName[tr]=BitTorrent istemcisi -Name[tr]=qBittorrent -Comment[uk]=Завантажувати і обмінюватися файлами через BitTorrent -GenericName[uk]=BitTorrent-клієнт -Name[uk]=qBittorrent -Comment[vi]=Tải về và chia sẻ các tập tin thông qua BitTorrent -GenericName[vi]=Máy trạm dạng BitTorrent -Name[vi]=qBittorrent -Comment[zh_HK]=經由BitTorrent下載並分享檔案 -GenericName[zh_HK]=BitTorrent用戶端 -Name[zh_HK]=qBittorrent -Comment[zh_TW]=經由 BitTorrent 下載並分享檔案 -GenericName[zh_TW]=BitTorrent 客戶端 -Name[zh_TW]=qBittorrent -Comment[lv_LV]=Lejupielādēt un koplietot failus ar BitTorrent -GenericName[lv_LV]=BitTorrent klients -Name[lv_LV]=qBittorrent -Comment[ms_MY]=Muat turun dan kongsi fail melalui BitTorrent -GenericName[ms_MY]=Klien BitTorrent -Name[ms_MY]=qBittorrent -Comment[eo]=Elŝutu kaj kunhavigu dosierojn per BitTorrent -GenericName[eo]=BitTorrent-kliento -Name[eo]=qBittorrent -Comment[mn_MN]=BitTorrent ашиглан файлуудыг татаж түгээх -GenericName[mn_MN]=BitTorrent үйлчлүүлэгч -Name[mn_MN]=qBittorrent -Comment[ne_NP]=फाइलहरू डाउनलोड गर्नुहोस् र BitTorrent मा साझा गर्नुहोस् -GenericName[ne_NP]=BitTorrent क्लाइन्ट -Name[ne_NP]=qBittorrent -Comment[en_AU]=Download and share files over BitTorrent -GenericName[en_AU]=BitTorrent client -Name[en_AU]=qBittorrent -Comment[th]=ดาว์นโหลดและแชร์ไฟล์ด้วยบิททอเร้น -GenericName[th]=โปรแกรมบิททอเร้น -Name[th]=qBittorrent diff -Nru qbittorrent-4.1.3/dist/windows/installer.nsi qbittorrent-3.3.15/dist/windows/installer.nsi --- qbittorrent-4.1.3/dist/windows/installer.nsi 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/dist/windows/installer.nsi 2017-08-03 20:30:10.000000000 +0000 @@ -86,7 +86,7 @@ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "UninstallString" '"$INSTDIR\uninst.exe"' WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "DisplayIcon" '"$INSTDIR\qbittorrent.exe",0' WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "Publisher" "The qBittorrent project" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "URLInfoAbout" "https://www.qbittorrent.org" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "URLInfoAbout" "http://www.qbittorrent.org" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "DisplayVersion" "${PROG_VERSION}" WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "NoModify" 1 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "NoRepair" 1 Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/windows/nsis plugins/FindProcDLL_mod_by_hnedka.7z and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/windows/nsis plugins/FindProcDLL_mod_by_hnedka.7z differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/windows/nsis plugins/FindProcDLL Unicode bin.zip and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/windows/nsis plugins/FindProcDLL Unicode bin.zip differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/windows/nsis plugins/FindProc Unicode-source.zip and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/windows/nsis plugins/FindProc Unicode-source.zip differ diff -Nru qbittorrent-4.1.3/dist/windows/options.nsi qbittorrent-3.3.15/dist/windows/options.nsi --- qbittorrent-4.1.3/dist/windows/options.nsi 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/dist/windows/options.nsi 2017-08-03 20:30:10.000000000 +0000 @@ -27,7 +27,7 @@ !define CSIDL_LOCALAPPDATA '0x1C' ;Local Application Data path ; Program specific -!define PROG_VERSION "4.1.3" +!define PROG_VERSION "3.3.15" !define MUI_FINISHPAGE_RUN !define MUI_FINISHPAGE_RUN_FUNCTION PageFinishRun @@ -50,7 +50,7 @@ ;Installer Version Information VIAddVersionKey "ProductName" "qBittorrent" VIAddVersionKey "CompanyName" "The qBittorrent project" -VIAddVersionKey "LegalCopyright" "Copyright ©2006-2018 The qBittorrent project" +VIAddVersionKey "LegalCopyright" "Copyright ©2006-2017 The qBittorrent project" VIAddVersionKey "FileDescription" "qBittorrent - A Bittorrent Client" VIAddVersionKey "FileVersion" "${PROG_VERSION}" diff -Nru qbittorrent-4.1.3/dist/windows/qt.conf qbittorrent-3.3.15/dist/windows/qt.conf --- qbittorrent-4.1.3/dist/windows/qt.conf 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/dist/windows/qt.conf 2017-08-03 20:30:10.000000000 +0000 @@ -2,4 +2,4 @@ Translations = translations [Platforms] -;WindowsArguments = dpiawareness=1 +WindowsArguments = dpiawareness=0 diff -Nru qbittorrent-4.1.3/.editorconfig qbittorrent-3.3.15/.editorconfig --- qbittorrent-4.1.3/.editorconfig 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/.editorconfig 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ -# EditorConfig is awesome: http://EditorConfig.org - -root = true - -[*] -indent_style = space -indent_size = 4 -insert_final_newline = true -trim_trailing_whitespace = true - -[**.yml] -indent_size = 2 diff -Nru qbittorrent-4.1.3/.github/ISSUE_TEMPLATE.md qbittorrent-3.3.15/.github/ISSUE_TEMPLATE.md --- qbittorrent-4.1.3/.github/ISSUE_TEMPLATE.md 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/.github/ISSUE_TEMPLATE.md 2017-08-03 20:30:10.000000000 +0000 @@ -1,20 +1,14 @@ **Please provide the following information** -### qBittorrent version and Operating System -(type here) +### qBittorrent version and Operating System: -### If on linux, libtorrent and Qt version -(type here) +### If on linux, libtorrent and Qt version: -### What is the problem -(type here) +### What is the problem: -### What is the expected behavior -(type here) +### What is the expected behavior: -### Steps to reproduce -(type here) +### Steps to reproduce: -### Extra info(if any) -(type here) +### Extra info(if any): diff -Nru qbittorrent-4.1.3/INSTALL qbittorrent-3.3.15/INSTALL --- qbittorrent-4.1.3/INSTALL 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/INSTALL 2017-08-03 20:30:10.000000000 +0000 @@ -1,49 +1,54 @@ -qBittorrent - A BitTorrent client in C++ / Qt +qBittorrent - A BitTorrent client in C++ / Qt4 ------------------------------------------ -1) Compile and install qBittorrent with Qt graphical interface +1) Compile and install qBittorrent with Qt4 Graphical Interface $ ./configure $ make && make install $ qbittorrent - will install and execute qBittorrent. + will install and execute qBittorrent hopefully without any problems. Dependencies: - - Qt >= 5.5.1 + - Qt >= 4.6.0 (libqtgui, libqtcore, libqtnetwork, libqtxml, libqtdbus/optional) - - pkg-config + - pkg-config executable - - libtorrent-rasterbar >= 1.0.6 (by Arvid Norberg) - * https://www.libtorrent.org/ - * Be careful: another library (the one used by rTorrent) uses a similar name + - libtorrent-rasterbar by Arvid Norberg (>= 1.0.6) + -> http://www.libtorrent.net + Be careful: another library (the one used by rTorrent) uses a similar name. - - Boost >= 1.35 + - libboost >= 1.35.x (libboost-system) - - Python >= 2.7.9 / 3.3.0 (optional, runtime only) - * Required by the internal search engine + - python >= 2.3 (needed by search engine) + * Run time only dependency -2) Compile and install qBittorrent without Qt graphical interface + - geoip-database (optional) + * If qBittorrent cannot find this database, it will try to resolve countries using the Internet but it will be a lot slower. + * Run time only dependency + +2) Compile and install qBittorrent without Qt4 Graphical interface $ ./configure --disable-gui $ make && make install - $ qbittorrent-nox + $ qbittorrent - will install and execute qBittorrent. + will install and execute qBittorrent hopefully without any problems. Dependencies: - - Qt >= 5.5.1 + - Qt >= 4.4.0 (libqt-devel, libqtcore, libqtnetwork) + + - pkg-config executable - - pkg-config + - libtorrent-rasterbar by Arvid Norberg (>= v1.0.6) + -> http://www.libtorrent.net + Be careful: another library (the one used by rTorrent) uses a similar name. - - libtorrent-rasterbar >= 1.0.6 (by Arvid Norberg) - * https://www.libtorrent.org/ - * Be careful: another library (the one used by rTorrent) uses a similar name + - libboost: libboost-filesystem, libboost-date-time, libboost-thread, libboost-serialization - - Boost >= 1.35 DOCUMENTATION: -Please note that there is a "Compilation" section at http://wiki.qbittorrent.org. +Please note that there is a documentation with a "compiling howto" at http://wiki.qbittorrent.org. ------------------------------------------ -sledgehammer999 +Christophe Dumez diff -Nru qbittorrent-4.1.3/install.os2 qbittorrent-3.3.15/install.os2 --- qbittorrent-4.1.3/install.os2 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/install.os2 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,187 @@ +QBittorrent installation + + + +0. CONTENTS OF THIS FILE +======================== + +1. INTRODUCTION + +2. REQUIREMENTS + +3. INSTALLATION + +4. BUGREPORTS + +5. CREDITS + +6. SUPPORT AND DONATIONS + +7. HISTORY + + +1. INTRODUCTION +=============== + +Welcome to QBittorrent port for OS/2 and eComStation. + + +2. REQUIREMENTS +=============== + +The following requirements can be installed either by rpm or by zip files. + +RPM Installation: + +klibc +----- + + 1. yum install libc + +openssl 1.0 +----------- + + 1. yum install openssl + +pthread +------- + + 1. yum install pthread + +GCC4Core +-------- + + 1. yum install libgcc + 2. yum install gcc-stack-protector + 3. yum install gcc-stdc++-shared-library + 4. yum install gcc-supc++-shared-library + +Qt4 dll +------- + + 1. yum install libqt4 + + +ZIP Installation: + +klibc +----- + + 1. Download klibc 0.6.5 or better (see http://svn.netlabs.org/libc for more information) + 2. Install the files to your libpath eg x:\ecs\dll + +openssl 1.0 +----------- + + 1. Download the zip file from http://rpm.netlabs.org/release/00/zip + 2. Install the files to your libpath eg. x:\ecs\dll + +pthread +------- + + 1. Download pthread 2012-03-13 or better from http://rpm.netlabs.org/release/00/zip + 2. Install the files to your libpath eg. x:\ecs\dll + +GCC4Core +-------- + + 1. Download GCC4Core 1.2.1 or better from http://ftp.netlabs.org/pub/gcc + 2. Install the files to your libpath eg. x:\ecs\dll + +Qt4 dll +------- + + 1. Download Qt4 4.7.3 or better (see http://svn.netlabs.org/qt4 for more information) + 2. Install the files according to the readme + + +3. INSTALLATION +=============== + +To install QBittorrent, do the following: + + 1. Create a directory for QBittorrent. + 2. Extract the QBittorrent package to the new directory. + 3. Create a WPS object for QBittorrent.exe. + 4. Start QBittorrent + 5. Happy torrenting + + +4. BUGREPORTS +============= + +Please create bugreports at http://svn.netlabs.org/qtapps +Only bug reports with a reproducible bug are accepted. :-) + + +5. CREDITS +========== + +The port was done by: + +Silvan Scherrer aka _diver + +Thanks go to: + + * Dmitry A. Kuminov + +They either helped me when I had some nasty questions or did some testing for +me. + + +6. SUPPORT AND DONATIONS +======================== + +QBittorrent port is based on volunteer work. If you would like to support further +development, you can do so in one of the following ways: + + + * Donate to the Qt4 project: see qt.netlabs.org for more information + + * Contribute to the project: Besides actual development, this also includes + maintaining the documentation and the project web site as well as help + for users. + + +7. HISTORY +========== + +2012-09-19 + + * updated to 3.0.4 code level of QBittorrent + * updated libtorrent to 0.16.3 level + +2012-09-06 + + * updated to 3.0.2 code level of QBittorrent + +2012-05-14 + + * updated to 2.9.8 code level of QBittorrent + +2012-03-15 + + * updated to 2.9.5 code level of QBittorrent + +2011-09-26 + + * updated to 2.8.5 code level of QBittorrent + * updated to Qt 4.7.3 + +2011-06-20 + + * updated to 2.7.3 code level of QBittorrent + * updated libtorrent to 0.15.6 level + +2010-12-23 + + * updated to 2.5.2 code level of QBittorrent + +2010-11-22 + + * updated to 2.4.11 code level of QBittorrent + +2010-xx-xx + + * initial port + diff -Nru qbittorrent-4.1.3/m4/ax_boost_base.m4 qbittorrent-3.3.15/m4/ax_boost_base.m4 --- qbittorrent-4.1.3/m4/ax_boost_base.m4 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/m4/ax_boost_base.m4 2017-08-03 20:30:10.000000000 +0000 @@ -1,5 +1,5 @@ # =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_boost_base.html +# http://www.gnu.org/software/autoconf-archive/ax_boost_base.html # =========================================================================== # # SYNOPSIS @@ -33,15 +33,7 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 42 - -# example boost program (need to pass version) -m4_define([_AX_BOOST_BASE_PROGRAM], - [AC_LANG_PROGRAM([[ -#include -]],[[ -(void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($1))])); -]])]) +#serial 26 AC_DEFUN([AX_BOOST_BASE], [ @@ -52,121 +44,104 @@ or disable it (ARG=no) @<:@ARG=yes@:>@ ])], [ - AS_CASE([$withval], - [no],[want_boost="no";_AX_BOOST_BASE_boost_path=""], - [yes],[want_boost="yes";_AX_BOOST_BASE_boost_path=""], - [want_boost="yes";_AX_BOOST_BASE_boost_path="$withval"]) + if test "$withval" = "no"; then + want_boost="no" + elif test "$withval" = "yes"; then + want_boost="yes" + ac_boost_path="" + else + want_boost="yes" + ac_boost_path="$withval" + fi ], [want_boost="yes"]) AC_ARG_WITH([boost-libdir], - [AS_HELP_STRING([--with-boost-libdir=LIB_DIR], - [Force given directory for boost libraries. - Note that this will override library path detection, - so use this parameter only if default library detection fails - and you know exactly where your boost libraries are located.])], - [ - AS_IF([test -d "$withval"], - [_AX_BOOST_BASE_boost_lib_path="$withval"], - [AC_MSG_ERROR([--with-boost-libdir expected directory name])]) - ], - [_AX_BOOST_BASE_boost_lib_path=""]) - -BOOST_LDFLAGS="" -BOOST_CPPFLAGS="" -AS_IF([test "x$want_boost" = "xyes"], - [_AX_BOOST_BASE_RUNDETECT([$1],[$2],[$3])]) -AC_SUBST(BOOST_CPPFLAGS) -AC_SUBST(BOOST_LDFLAGS) -]) - - -# convert a version string in $2 to numeric and affect to polymorphic var $1 -AC_DEFUN([_AX_BOOST_BASE_TONUMERICVERSION],[ - AS_IF([test "x$2" = "x"],[_AX_BOOST_BASE_TONUMERICVERSION_req="1.20.0"],[_AX_BOOST_BASE_TONUMERICVERSION_req="$2"]) - _AX_BOOST_BASE_TONUMERICVERSION_req_shorten=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([[0-9]]*\.[[0-9]]*\)'` - _AX_BOOST_BASE_TONUMERICVERSION_req_major=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([[0-9]]*\)'` - AS_IF([test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_major" = "x"], - [AC_MSG_ERROR([You should at least specify libboost major version])]) - _AX_BOOST_BASE_TONUMERICVERSION_req_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[[0-9]]*\.\([[0-9]]*\)'` - AS_IF([test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_minor" = "x"], - [_AX_BOOST_BASE_TONUMERICVERSION_req_minor="0"]) - _AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` - AS_IF([test "X$_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor" = "X"], - [_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor="0"]) - _AX_BOOST_BASE_TONUMERICVERSION_RET=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req_major \* 100000 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_minor \* 100 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor` - AS_VAR_SET($1,$_AX_BOOST_BASE_TONUMERICVERSION_RET) -]) - -dnl Run the detection of boost should be run only if $want_boost -AC_DEFUN([_AX_BOOST_BASE_RUNDETECT],[ - _AX_BOOST_BASE_TONUMERICVERSION(WANT_BOOST_VERSION,[$1]) + AS_HELP_STRING([--with-boost-libdir=LIB_DIR], + [Force given directory for boost libraries. Note that this will override library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located.]), + [ + if test -d "$withval" + then + ac_boost_lib_path="$withval" + else + AC_MSG_ERROR(--with-boost-libdir expected directory name) + fi + ], + [ac_boost_lib_path=""] +) + +if test "x$want_boost" = "xyes"; then + boost_lib_version_req=ifelse([$1], ,1.20.0,$1) + boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([[0-9]]*\.[[0-9]]*\)'` + boost_lib_version_req_major=`expr $boost_lib_version_req : '\([[0-9]]*\)'` + boost_lib_version_req_minor=`expr $boost_lib_version_req : '[[0-9]]*\.\([[0-9]]*\)'` + boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` + if test "x$boost_lib_version_req_sub_minor" = "x" ; then + boost_lib_version_req_sub_minor="0" + fi + WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor` + AC_MSG_CHECKING(for boostlib >= $boost_lib_version_req) succeeded=no - - AC_REQUIRE([AC_CANONICAL_HOST]) dnl On 64-bit systems check for system libraries in both lib64 and lib. dnl The former is specified by FHS, but e.g. Debian does not adhere to dnl this (as it rises problems for generic multi-arch support). dnl The last entry in the list is chosen by default when no libraries dnl are found, e.g. when only header-only libraries are installed! - AS_CASE([${host_cpu}], - [x86_64],[libsubdirs="lib64 libx32 lib lib64"], - [ppc64|s390x|sparc64|aarch64|ppc64le],[libsubdirs="lib64 lib lib64"], - [libsubdirs="lib"] - ) + libsubdirs="lib" + ax_arch=`uname -m` + case $ax_arch in + x86_64) + libsubdirs="lib64 libx32 lib lib64" + ;; + ppc64|s390x|sparc64|aarch64|ppc64le) + libsubdirs="lib64 lib lib64 ppc64le" + ;; + esac dnl allow for real multi-arch paths e.g. /usr/lib/x86_64-linux-gnu. Give dnl them priority over the other paths since, if libs are found there, they dnl are almost assuredly the ones desired. - AS_CASE([${host_cpu}], - [i?86],[multiarch_libsubdir="lib/i386-${host_os}"], - [multiarch_libsubdir="lib/${host_cpu}-${host_os}"] - ) + AC_REQUIRE([AC_CANONICAL_HOST]) + libsubdirs="lib/${host_cpu}-${host_os} $libsubdirs" + + case ${host_cpu} in + i?86) + libsubdirs="lib/i386-${host_os} $libsubdirs" + ;; + esac dnl first we check the system location for boost libraries dnl this location ist chosen if boost libraries are installed with the --layout=system option dnl or if you install boost with RPM - AS_IF([test "x$_AX_BOOST_BASE_boost_path" != "x"],[ - AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) includes in "$_AX_BOOST_BASE_boost_path/include"]) - AS_IF([test -d "$_AX_BOOST_BASE_boost_path/include" && test -r "$_AX_BOOST_BASE_boost_path/include"],[ - AC_MSG_RESULT([yes]) - BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include" - for _AX_BOOST_BASE_boost_path_tmp in $multiarch_libsubdir $libsubdirs; do - AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) lib path in "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"]) - AS_IF([test -d "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" && test -r "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" ],[ - AC_MSG_RESULT([yes]) - BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"; - break; - ], - [AC_MSG_RESULT([no])]) - done],[ - AC_MSG_RESULT([no])]) - ],[ - if test X"$cross_compiling" = Xyes; then - search_libsubdirs=$multiarch_libsubdir - else - search_libsubdirs="$multiarch_libsubdir $libsubdirs" - fi - for _AX_BOOST_BASE_boost_path_tmp in /usr /usr/local /opt /opt/local ; do - if test -d "$_AX_BOOST_BASE_boost_path_tmp/include/boost" && test -r "$_AX_BOOST_BASE_boost_path_tmp/include/boost" ; then - for libsubdir in $search_libsubdirs ; do - if ls "$_AX_BOOST_BASE_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi + if test "$ac_boost_path" != ""; then + BOOST_CPPFLAGS="-I$ac_boost_path/include" + for ac_boost_path_tmp in $libsubdirs; do + if test -d "$ac_boost_path"/"$ac_boost_path_tmp" ; then + BOOST_LDFLAGS="-L$ac_boost_path/$ac_boost_path_tmp" + break + fi + done + elif test "$cross_compiling" != yes; then + for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do + if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then + for libsubdir in $libsubdirs ; do + if ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done - BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path_tmp/$libsubdir" - BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path_tmp/include" + BOOST_LDFLAGS="-L$ac_boost_path_tmp/$libsubdir" + BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include" break; fi done - ]) + fi dnl overwrite ld flags if we have required special directory with dnl --with-boost-libdir parameter - AS_IF([test "x$_AX_BOOST_BASE_boost_lib_path" != "x"], - [BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_lib_path"]) + if test "$ac_boost_lib_path" != ""; then + BOOST_LDFLAGS="-L$ac_boost_lib_path" + fi - AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION)]) CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS @@ -177,7 +152,15 @@ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH(C++) - AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + @%:@include + ]], [[ + #if BOOST_VERSION >= $WANT_BOOST_VERSION + // Everything is okay + #else + # error Boost version is too old + #endif + ]])],[ AC_MSG_RESULT(yes) succeeded=yes found_system=yes @@ -189,50 +172,40 @@ dnl if we found no boost with system layout we search for boost libraries dnl built and installed without the --layout=system option or for a staged(not installed) version - if test "x$succeeded" != "xyes" ; then + if test "x$succeeded" != "xyes"; then CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" BOOST_CPPFLAGS= - if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then - BOOST_LDFLAGS= - fi + BOOST_LDFLAGS= _version=0 - if test -n "$_AX_BOOST_BASE_boost_path" ; then - if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path"; then - for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do - _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` + if test "$ac_boost_path" != ""; then + if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then + for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do + _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` - if test "x$V_CHECK" = "x1" ; then + if test "$V_CHECK" = "1" ; then _version=$_version_tmp fi VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` - BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include/boost-$VERSION_UNDERSCORE" + BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE" done dnl if nothing found search for layout used in Windows distributions if test -z "$BOOST_CPPFLAGS"; then - if test -d "$_AX_BOOST_BASE_boost_path/boost" && test -r "$_AX_BOOST_BASE_boost_path/boost"; then - BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path" + if test -d "$ac_boost_path/boost" && test -r "$ac_boost_path/boost"; then + BOOST_CPPFLAGS="-I$ac_boost_path" fi fi - dnl if we found something and BOOST_LDFLAGS was unset before - dnl (because "$_AX_BOOST_BASE_boost_lib_path" = ""), set it here. - if test -n "$BOOST_CPPFLAGS" && test -z "$BOOST_LDFLAGS"; then - for libsubdir in $libsubdirs ; do - if ls "$_AX_BOOST_BASE_boost_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi - done - BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$libsubdir" - fi fi else - if test "x$cross_compiling" != "xyes" ; then - for _AX_BOOST_BASE_boost_path in /usr /usr/local /opt /opt/local ; do - if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path" ; then - for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do - _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` + if test "$cross_compiling" != yes; then + for ac_boost_path in /usr /usr/local /opt /opt/local ; do + if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then + for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do + _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` - if test "x$V_CHECK" = "x1" ; then + if test "$V_CHECK" = "1" ; then _version=$_version_tmp - best_path=$_AX_BOOST_BASE_boost_path + best_path=$ac_boost_path fi done fi @@ -240,7 +213,7 @@ VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE" - if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then + if test "$ac_boost_lib_path" = ""; then for libsubdir in $libsubdirs ; do if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done @@ -248,7 +221,7 @@ fi fi - if test -n "$BOOST_ROOT" ; then + if test "x$BOOST_ROOT" != "x"; then for libsubdir in $libsubdirs ; do if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done @@ -257,7 +230,7 @@ stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'` stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'` V_CHECK=`expr $stage_version_shorten \>\= $_version` - if test "x$V_CHECK" = "x1" && test -z "$_AX_BOOST_BASE_boost_lib_path" ; then + if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT) BOOST_CPPFLAGS="-I$BOOST_ROOT" BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir" @@ -272,7 +245,15 @@ export LDFLAGS AC_LANG_PUSH(C++) - AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + @%:@include + ]], [[ + #if BOOST_VERSION >= $WANT_BOOST_VERSION + // Everything is okay + #else + # error Boost version is too old + #endif + ]])],[ AC_MSG_RESULT(yes) succeeded=yes found_system=yes @@ -281,15 +262,17 @@ AC_LANG_POP([C++]) fi - if test "x$succeeded" != "xyes" ; then - if test "x$_version" = "x0" ; then - AC_MSG_NOTICE([[We could not detect the boost libraries (version $1 or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation.]]) + if test "$succeeded" != "yes" ; then + if test "$_version" = "0" ; then + AC_MSG_NOTICE([[We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation.]]) else AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).]) fi # execute ACTION-IF-NOT-FOUND (if present): ifelse([$3], , :, [$3]) else + AC_SUBST(BOOST_CPPFLAGS) + AC_SUBST(BOOST_LDFLAGS) AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available]) # execute ACTION-IF-FOUND (if present): ifelse([$2], , :, [$2]) @@ -297,5 +280,6 @@ CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" +fi ]) diff -Nru qbittorrent-4.1.3/m4/ax_boost_system.m4 qbittorrent-3.3.15/m4/ax_boost_system.m4 --- qbittorrent-4.1.3/m4/ax_boost_system.m4 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/m4/ax_boost_system.m4 2017-08-03 20:30:10.000000000 +0000 @@ -1,5 +1,5 @@ # =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_boost_system.html +# http://www.gnu.org/software/autoconf-archive/ax_boost_system.html # =========================================================================== # # SYNOPSIS @@ -31,7 +31,7 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 19 +#serial 18 AC_DEFUN([AX_BOOST_SYSTEM], [ diff -Nru qbittorrent-4.1.3/m4/qbittorrent.m4 qbittorrent-3.3.15/m4/qbittorrent.m4 --- qbittorrent-4.1.3/m4/qbittorrent.m4 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/m4/qbittorrent.m4 2017-08-03 20:30:10.000000000 +0000 @@ -1,13 +1,38 @@ # Checking for pkg-config. If found, check for QtCore and query pkg-config # for its exec-prefix variable. +# FIND_QT4() +# Sets the QT_QMAKE variable to the path of Qt4 qmake if found. +# -------------------------------------- +AC_DEFUN([FIND_QT4], +[PKG_CHECK_EXISTS([QtCore >= 4.8.0], + [PKG_CHECK_VAR(QT_QMAKE, + [QtCore >= 4.8.0], + [moc_location], + [QT_QMAKE=`AS_DIRNAME(["$QT_QMAKE"])`]) + ]) + +AS_IF([test -f "$QT_QMAKE/qmake"], + [QT_QMAKE="$QT_QMAKE/qmake"], + [AS_IF([test -f "$QT_QMAKE/qmake-qt4"], + [QT_QMAKE="$QT_QMAKE/qmake-qt4"], + [QT_QMAKE=""]) + ]) + +AC_MSG_CHECKING([for Qt4 qmake >= 4.8.0]) +AS_IF([test "x$QT_QMAKE" != "x"], + [AC_MSG_RESULT([$QT_QMAKE])], + [AC_MSG_RESULT([not found])] + ) +]) + # FIND_QT5() # Sets the QT_QMAKE variable to the path of Qt5 qmake if found. # -------------------------------------- AC_DEFUN([FIND_QT5], -[PKG_CHECK_EXISTS([Qt5Core >= 5.5.1], +[PKG_CHECK_EXISTS([Qt5Core >= 5.2.0], [PKG_CHECK_VAR(QT_QMAKE, - [Qt5Core >= 5.5.1], + [Qt5Core >= 5.2.0], [host_bins]) ]) @@ -18,7 +43,7 @@ [QT_QMAKE=""]) ]) -AC_MSG_CHECKING([for Qt5 qmake >= 5.5.1]) +AC_MSG_CHECKING([for Qt5 qmake >= 5.2.0]) AS_IF([test "x$QT_QMAKE" != "x"], [AC_MSG_RESULT([$QT_QMAKE])], [AC_MSG_RESULT([not found])] @@ -29,10 +54,19 @@ # Sets the HAVE_QTDBUS variable to true or false. # -------------------------------------- AC_DEFUN([FIND_QTDBUS], - [AC_MSG_CHECKING([for Qt5DBus >= 5.5.1]) - PKG_CHECK_EXISTS([Qt5DBus >= 5.5.1], +[AS_IF([test "x$with_qt4" = "xno"], + [AC_MSG_CHECKING([for Qt5DBus >= 5.2.0]) + PKG_CHECK_EXISTS([Qt5DBus >= 5.2.0], + [AC_MSG_RESULT([found]) + HAVE_QTDBUS=[true]], + [AC_MSG_RESULT([not found]) + HAVE_QTDBUS=[false]]) + ], + [AC_MSG_CHECKING([for QtDBus >= 4.8.0]) + PKG_CHECK_EXISTS([QtDBus >= 4.8.0], [AC_MSG_RESULT([found]) HAVE_QTDBUS=[true]], [AC_MSG_RESULT([not found]) HAVE_QTDBUS=[false]]) + ]) ]) diff -Nru qbittorrent-4.1.3/macxconf.pri qbittorrent-3.3.15/macxconf.pri --- qbittorrent-4.1.3/macxconf.pri 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/macxconf.pri 2017-08-03 20:30:10.000000000 +0000 @@ -9,7 +9,10 @@ include(conf.pri) } -LIBS += -framework Carbon -framework IOKit -framework AppKit +LIBS += -framework Carbon -framework IOKit + +# C++11 support +lessThan(QT_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=c++11 QT_LANG_PATH = ../dist/qt-translations DIST_PATH = ../dist/mac diff -Nru qbittorrent-4.1.3/os2conf.pri qbittorrent-3.3.15/os2conf.pri --- qbittorrent-4.1.3/os2conf.pri 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/os2conf.pri 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,19 @@ +# C++11 support +lessThan(QT_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=c++11 + +exists(conf.pri) { + # to the conf.pri goes all system dependent stuff + include(conf.pri) +} + +LIBS += \ + -ltorrent-rasterbar \ + -lboost_thread \ + -lboost_system \ + -lboost_filesystem \ + -lssl -lcrypto -lidn -lpthread -lz + +RC_FILE = qbittorrent_os2.rc + +# LIBTORRENT DEFINES +DEFINES += BOOST_ASIO_DYN_LINK diff -Nru qbittorrent-4.1.3/qbittorrent.pro qbittorrent-3.3.15/qbittorrent.pro --- qbittorrent-4.1.3/qbittorrent.pro 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/qbittorrent.pro 2017-08-03 20:30:10.000000000 +0000 @@ -3,6 +3,7 @@ SUBDIRS += src include(version.pri) +include(qm_gen.pri) # Make target to create release tarball. Use 'make tarball' tarball.commands += rm -fR ../$${PROJECT_NAME}-$${PROJECT_VERSION}/ && @@ -16,11 +17,3 @@ tarball.commands += rm -fR $${PROJECT_NAME}-$${PROJECT_VERSION} QMAKE_EXTRA_TARGETS += tarball - -# Translations included here (at top level) is to avoid regenerating the .qm files -# every time when src.pro is processed -include(src/lang/lang.pri) - -# For Qt Creator beautifier -DISTFILES += \ - uncrustify.cfg diff -Nru qbittorrent-4.1.3/qm_gen.pri qbittorrent-3.3.15/qm_gen.pri --- qbittorrent-4.1.3/qm_gen.pri 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/qm_gen.pri 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,24 @@ +TS_IN = $$fromfile(src/src.pro,TRANSLATIONS) +TS_IN_NOEXT = $$replace(TS_IN,".ts","") + +isEmpty(QMAKE_LRELEASE) { + win32|os2:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\\lrelease.exe + else:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease + unix { + equals(QT_MAJOR_VERSION, 4) { + !exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease-qt4 } + } + equals(QT_MAJOR_VERSION, 5) { + !exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease-qt5 } + } + } else { + !exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease } + } +} + +message("Building translations") +for(L,TS_IN_NOEXT) { + message("Processing $${L}") + system("$$QMAKE_LRELEASE -silent src/$${L}.ts -qm src/$${L}.qm") + !exists("src/$${L}.qm"):error("Building translations failed, cannot continue") +} diff -Nru qbittorrent-4.1.3/README.md qbittorrent-3.3.15/README.md --- qbittorrent-4.1.3/README.md 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/README.md 2017-08-03 20:30:10.000000000 +0000 @@ -35,7 +35,7 @@ ### Misc: For more information please visit: -https://www.qbittorrent.org +http://www.qbittorrent.org or our wiki here: http://wiki.qbittorrent.org diff -Nru qbittorrent-4.1.3/README.os2 qbittorrent-3.3.15/README.os2 --- qbittorrent-4.1.3/README.os2 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/README.os2 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,74 @@ +qBittorrent - A BitTorrent client in Qt4 +------------------------------------------ + +This is the eComStation (OS/2) qBittorrent part of the readme. See also README for more general information. + + +Building qBittorrent +******************** + + +Requirements +============ + +- gcc based build env (recommended gcc v4.4.2 or greater) + +- Qt4 for eCS (OS/2) dev package (see http://svn.netlabs.org/qt4 for more information) + +- libtorrent-rasterbar for eCS (OS/2) port (see http://svn.netlabs.org/ports for more information) + +- boost for eCS (OS/2) port (see http://svn.netlabs.org/ports for more information) + + +How to build +============ + +First you need to create the conf.pri file in the same dir as this readme.os2 is. +the conf.pri file has the following content: + +##### conf.pri content begin ##### +BINDIR = ./bin +INCDIR = ./include +LIBDIR = ./lib +DATADIR = ./share + +CONFIG += staticlib +INCLUDEPATH += x:/trees/libtorrent/trunk/include +LIBS += -Lx:/trees/libtorrent/trunk/src/.libs \ + -Lx:/trees/boost/trunk/stage/lib \ + -Lx:/trees/openssl \ + -Lx:/extras/lib +##### conf.pri content end ##### + +Of course all the above path references have to be adjusted to your build env. + +Now you can either do a normal build or a shadow build. A shadow build has the +advantage that no created files are in the same dir as the sources are. + +For a normal build do the following: + +Simply type: +$ qmake + +Followed by: +$ make + +For a shadow build do the following: +given your sources are in x:\trees\qbittorrent\trunk create a +x:\trees\qbittorrent\build directory + +Now switch to the created directory and type: +$ qmake ..\trunk + +Followed by: +$ make + +If all works fine you should get a working qbittorrent executable. + +If you have any question regarding the eCS (OS/2) port of qBittorrent you can meet me (_diver) on IRC: +#netlabs on irc.freenode.net + +------------------------------------------ +Silvan Scherrer + + diff -Nru qbittorrent-4.1.3/src/app/application.cpp qbittorrent-3.3.15/src/app/application.cpp --- qbittorrent-4.1.3/src/app/application.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/app/application.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -27,129 +27,107 @@ * exception statement from your version. */ -#include "application.h" - -#include - -#include #include -#include +#include #include -#include +#include #include - -#ifdef Q_OS_WIN -#include -#include -#endif +#include +#include #ifndef DISABLE_GUI +#include "gui/guiiconprovider.h" #ifdef Q_OS_WIN -#include +#include #include +#include #endif // Q_OS_WIN #ifdef Q_OS_MAC #include +#include +#include #endif // Q_OS_MAC -#include "addnewtorrentdialog.h" -#include "gui/guiiconprovider.h" #include "mainwindow.h" -#include "shutdownconfirmdialog.h" +#include "addnewtorrentdialog.h" +#include "shutdownconfirmdlg.h" #else // DISABLE_GUI -#include +#include #endif // DISABLE_GUI -#include "base/bittorrent/session.h" -#include "base/bittorrent/torrenthandle.h" -#include "base/iconprovider.h" +#ifndef DISABLE_WEBUI +#include "webui/webui.h" +#endif + +#include "application.h" +#include "filelogger.h" #include "base/logger.h" -#include "base/net/downloadmanager.h" -#include "base/net/geoipmanager.h" -#include "base/net/proxyconfigurationmanager.h" -#include "base/net/smtp.h" #include "base/preferences.h" -#include "base/profile.h" -#include "base/rss/rss_autodownloader.h" -#include "base/rss/rss_session.h" -#include "base/scanfoldersmodel.h" #include "base/settingsstorage.h" #include "base/utils/fs.h" #include "base/utils/misc.h" -#include "base/utils/string.h" -#include "filelogger.h" - -#ifndef DISABLE_WEBUI -#include "webui/webui.h" -#endif +#include "base/iconprovider.h" +#include "base/scanfoldersmodel.h" +#include "base/net/smtp.h" +#include "base/net/downloadmanager.h" +#include "base/net/geoipmanager.h" +#include "base/net/proxyconfigurationmanager.h" +#include "base/bittorrent/session.h" +#include "base/bittorrent/torrenthandle.h" namespace { #define SETTINGS_KEY(name) "Application/" name // FileLogger properties keys -#define FILELOGGER_SETTINGS_KEY(name) QStringLiteral(SETTINGS_KEY("FileLogger/") name) +#define FILELOGGER_SETTINGS_KEY(name) SETTINGS_KEY("FileLogger/") name const QString KEY_FILELOGGER_ENABLED = FILELOGGER_SETTINGS_KEY("Enabled"); const QString KEY_FILELOGGER_PATH = FILELOGGER_SETTINGS_KEY("Path"); const QString KEY_FILELOGGER_BACKUP = FILELOGGER_SETTINGS_KEY("Backup"); const QString KEY_FILELOGGER_DELETEOLD = FILELOGGER_SETTINGS_KEY("DeleteOld"); - const QString KEY_FILELOGGER_MAXSIZEBYTES = FILELOGGER_SETTINGS_KEY("MaxSizeBytes"); + const QString KEY_FILELOGGER_MAXSIZE = FILELOGGER_SETTINGS_KEY("MaxSize"); const QString KEY_FILELOGGER_AGE = FILELOGGER_SETTINGS_KEY("Age"); const QString KEY_FILELOGGER_AGETYPE = FILELOGGER_SETTINGS_KEY("AgeType"); - // just a shortcut + //just a shortcut inline SettingsStorage *settings() { return SettingsStorage::instance(); } - const QString LOG_FOLDER = QStringLiteral("logs"); - const QChar PARAMS_SEPARATOR = '|'; - - const QString DEFAULT_PORTABLE_MODE_PROFILE_DIR = QStringLiteral("profile"); - - const int MIN_FILELOG_SIZE = 1024; // 1KiB - const int MAX_FILELOG_SIZE = 1000 * 1024 * 1024; // 1000MiB - const int DEFAULT_FILELOG_SIZE = 65 * 1024; // 65KiB + const QString LOG_FOLDER("logs"); + const char PARAMS_SEPARATOR[] = "|"; } Application::Application(const QString &id, int &argc, char **argv) : BaseApplication(id, argc, argv) , m_running(false) , m_shutdownAct(ShutdownDialogAction::Exit) - , m_commandLineArgs(parseCommandLine(this->arguments())) -#ifndef DISABLE_WEBUI - , m_webui(nullptr) -#endif { - qRegisterMetaType("Log::Msg"); - - setApplicationName("qBittorrent"); - validateCommandLineParameters(); - - QString profileDir = m_commandLineArgs.portableMode - ? QDir(QCoreApplication::applicationDirPath()).absoluteFilePath(DEFAULT_PORTABLE_MODE_PROFILE_DIR) - : m_commandLineArgs.profileDir; - - Profile::initialize(profileDir, m_commandLineArgs.configurationName, - m_commandLineArgs.relativeFastresumePaths || m_commandLineArgs.portableMode); - Logger::initInstance(); SettingsStorage::initInstance(); Preferences::initInstance(); - if (m_commandLineArgs.webUiPort > 0) // it will be -1 when user did not set any value - Preferences::instance()->setWebUiPort(m_commandLineArgs.webUiPort); +#if defined(Q_OS_MACX) && !defined(DISABLE_GUI) + if (QSysInfo::MacintoshVersion > QSysInfo::MV_10_8) { + // fix Mac OS X 10.9 (mavericks) font issue + // https://bugreports.qt-project.org/browse/QTBUG-32789 + QFont::insertSubstitution(".Lucida Grande UI", "Lucida Grande"); + } +#endif + setApplicationName("qBittorrent"); initializeTranslation(); #if !defined(DISABLE_GUI) +#ifdef QBT_USES_QT5 setAttribute(Qt::AA_UseHighDpiPixmaps, true); // opt-in to the high DPI pixmap support +#endif // QBT_USES_QT5 setQuitOnLastWindowClosed(false); #endif #if defined(Q_OS_WIN) && !defined(DISABLE_GUI) - connect(this, &QGuiApplication::commitDataRequest, this, &Application::shutdownCleanup, Qt::DirectConnection); + connect(this, SIGNAL(commitDataRequest(QSessionManager &)), this, SLOT(shutdownCleanup(QSessionManager &)), Qt::DirectConnection); #endif - connect(this, &Application::messageReceived, this, &Application::processMessage); - connect(this, &QCoreApplication::aboutToQuit, this, &Application::cleanup); + connect(this, SIGNAL(messageReceived(const QString &)), SLOT(processMessage(const QString &))); + connect(this, SIGNAL(aboutToQuit()), SLOT(cleanup())); if (isFileLoggerEnabled()) m_fileLogger = new FileLogger(fileLoggerPath(), isFileLoggerBackup(), fileLoggerMaxSize(), isFileLoggerDeleteOld(), fileLoggerAge(), static_cast(fileLoggerAgeType())); @@ -157,13 +135,6 @@ Logger::instance()->addMessage(tr("qBittorrent %1 started", "qBittorrent v3.2.0alpha started").arg(QBT_VERSION)); } -Application::~Application() -{ - // we still need to call cleanup() - // in case the App failed to start - cleanup(); -} - #ifndef DISABLE_GUI QPointer Application::mainWindow() { @@ -171,11 +142,6 @@ } #endif -const QBtCommandLineParameters &Application::commandLineArgs() const -{ - return m_commandLineArgs; -} - bool Application::isFileLoggerEnabled() const { return settings()->loadValue(KEY_FILELOGGER_ENABLED, true).toBool(); @@ -192,15 +158,14 @@ QString Application::fileLoggerPath() const { - return settings()->loadValue(KEY_FILELOGGER_PATH, - QVariant(specialFolderLocation(SpecialFolder::Data) + LOG_FOLDER)).toString(); + return settings()->loadValue(KEY_FILELOGGER_PATH, QVariant(Utils::Fs::QDesktopServicesDataLocation() + LOG_FOLDER)).toString(); } -void Application::setFileLoggerPath(const QString &path) +void Application::setFileLoggerPath(const QString &value) { if (m_fileLogger) - m_fileLogger->changePath(path); - settings()->storeValue(KEY_FILELOGGER_PATH, path); + m_fileLogger->changePath(value); + settings()->storeValue(KEY_FILELOGGER_PATH, value); } bool Application::isFileLoggerBackup() const @@ -229,22 +194,29 @@ int Application::fileLoggerMaxSize() const { - int val = settings()->loadValue(KEY_FILELOGGER_MAXSIZEBYTES, DEFAULT_FILELOG_SIZE).toInt(); - return std::min(std::max(val, MIN_FILELOG_SIZE), MAX_FILELOG_SIZE); + int val = settings()->loadValue(KEY_FILELOGGER_MAXSIZE, 10).toInt(); + if (val < 1) + return 1; + if (val > 1000) + return 1000; + return val; } -void Application::setFileLoggerMaxSize(const int bytes) +void Application::setFileLoggerMaxSize(const int value) { - int clampedValue = std::min(std::max(bytes, MIN_FILELOG_SIZE), MAX_FILELOG_SIZE); if (m_fileLogger) - m_fileLogger->setMaxSize(clampedValue); - settings()->storeValue(KEY_FILELOGGER_MAXSIZEBYTES, clampedValue); + m_fileLogger->setMaxSize(value); + settings()->storeValue(KEY_FILELOGGER_MAXSIZE, std::min(std::max(value, 1), 1000)); } int Application::fileLoggerAge() const { - int val = settings()->loadValue(KEY_FILELOGGER_AGE, 1).toInt(); - return std::min(std::max(val, 1), 365); + int val = settings()->loadValue(KEY_FILELOGGER_AGE, 6).toInt(); + if (val < 1) + return 1; + if (val > 365) + return 365; + return val; } void Application::setFileLoggerAge(const int value) @@ -255,17 +227,17 @@ int Application::fileLoggerAgeType() const { int val = settings()->loadValue(KEY_FILELOGGER_AGETYPE, 1).toInt(); - return ((val < 0) || (val > 2)) ? 1 : val; + return (val < 0 || val > 2) ? 1 : val; } void Application::setFileLoggerAgeType(const int value) { - settings()->storeValue(KEY_FILELOGGER_AGETYPE, ((value < 0) || (value > 2)) ? 1 : value); + settings()->storeValue(KEY_FILELOGGER_AGETYPE, (value < 0 || value > 2) ? 1 : value); } void Application::processMessage(const QString &message) { - QStringList params = message.split(PARAMS_SEPARATOR, QString::SkipEmptyParts); + QStringList params = message.split(QLatin1String(PARAMS_SEPARATOR), QString::SkipEmptyParts); // If Application is not running (i.e., other // components are not ready) store params if (m_running) @@ -274,77 +246,66 @@ m_paramsQueue.append(params); } -void Application::runExternalProgram(const BitTorrent::TorrentHandle *torrent) const +void Application::runExternalProgram(BitTorrent::TorrentHandle *const torrent) const { - QString program = Preferences::instance()->getAutoRunProgram().trimmed(); + QString program = Preferences::instance()->getAutoRunProgram(); program.replace("%N", torrent->name()); program.replace("%L", torrent->category()); - - QStringList tags = torrent->tags().toList(); - std::sort(tags.begin(), tags.end(), Utils::String::naturalLessThan); - program.replace("%G", tags.join(',')); - -#if defined(Q_OS_WIN) - const auto chopPathSep = [](const QString &str) -> QString - { - if (str.endsWith('\\')) - return str.mid(0, (str.length() -1)); - return str; - }; - program.replace("%F", chopPathSep(Utils::Fs::toNativePath(torrent->contentPath()))); - program.replace("%R", chopPathSep(Utils::Fs::toNativePath(torrent->rootPath()))); - program.replace("%D", chopPathSep(Utils::Fs::toNativePath(torrent->savePath()))); -#else program.replace("%F", Utils::Fs::toNativePath(torrent->contentPath())); program.replace("%R", Utils::Fs::toNativePath(torrent->rootPath())); program.replace("%D", Utils::Fs::toNativePath(torrent->savePath())); -#endif program.replace("%C", QString::number(torrent->filesCount())); program.replace("%Z", QString::number(torrent->totalSize())); program.replace("%T", torrent->currentTracker()); program.replace("%I", torrent->hash()); Logger *logger = Logger::instance(); - logger->addMessage(tr("Torrent: %1, running external program, command: %2").arg(torrent->name(), program)); - -#if defined(Q_OS_WIN) - std::unique_ptr programWchar(new wchar_t[program.length() + 1] {}); - program.toWCharArray(programWchar.get()); + logger->addMessage(tr("Torrent: %1, running external program, command: %2").arg(torrent->name()).arg(program)); - // Need to split arguments manually because QProcess::startDetached(QString) - // will strip off empty parameters. - // E.g. `python.exe "1" "" "3"` will become `python.exe "1" "3"` - int argCount = 0; - LPWSTR *args = ::CommandLineToArgvW(programWchar.get(), &argCount); - - QStringList argList; - for (int i = 1; i < argCount; ++i) - argList += QString::fromWCharArray(args[i]); - - QProcess::startDetached(QString::fromWCharArray(args[0]), argList); +#if defined(Q_OS_UNIX) + QProcess::startDetached(QLatin1String("/bin/sh"), {QLatin1String("-c"), program}); +#elif defined(Q_OS_WIN) // test cmd: `echo "%F" > "c:\ab ba.txt"` + program.prepend(QLatin1String("\"")).append(QLatin1String("\"")); + program.prepend(Utils::Misc::windowsSystemPath() + QLatin1String("\\cmd.exe /C ")); + const int cmdMaxLength = 32768; // max length (incl. terminate char) for `lpCommandLine` in `CreateProcessW()` + if ((program.size() + 1) > cmdMaxLength) { + logger->addMessage(tr("Torrent: %1, run external program command too long (length > %2), execution failed.").arg(torrent->name()).arg(cmdMaxLength), Log::CRITICAL); + return; + } - ::LocalFree(args); + STARTUPINFOW si = {0}; + si.cb = sizeof(si); + PROCESS_INFORMATION pi = {0}; + + WCHAR *arg = new WCHAR[program.size() + 1]; + program.toWCharArray(arg); + arg[program.size()] = L'\0'; + if (CreateProcessW(NULL, arg, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) { + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } + delete[] arg; #else - QProcess::startDetached(QLatin1String("/bin/sh"), {QLatin1String("-c"), program}); + QProcess::startDetached(program); #endif } -void Application::sendNotificationEmail(const BitTorrent::TorrentHandle *torrent) +void Application::sendNotificationEmail(BitTorrent::TorrentHandle *const torrent) { // Prepare mail content - const QString content = tr("Torrent name: %1").arg(torrent->name()) + '\n' - + tr("Torrent size: %1").arg(Utils::Misc::friendlyUnit(torrent->wantedSize())) + '\n' - + tr("Save path: %1").arg(torrent->savePath()) + "\n\n" - + tr("The torrent was downloaded in %1.", "The torrent was downloaded in 1 hour and 20 seconds") - .arg(Utils::Misc::userFriendlyDuration(torrent->activeTime())) + "\n\n\n" - + tr("Thank you for using qBittorrent.") + '\n'; + QString content = QObject::tr("Torrent name: %1").arg(torrent->name()) + "\n"; + content += QObject::tr("Torrent size: %1").arg(Utils::Misc::friendlyUnit(torrent->wantedSize())) + "\n"; + content += QObject::tr("Save path: %1").arg(torrent->savePath()) + "\n\n"; + content += QObject::tr("The torrent was downloaded in %1.", + "The torrent was downloaded in 1 hour and 20 seconds") + .arg(Utils::Misc::userFriendlyDuration(torrent->activeTime())) + "\n\n\n"; + content += QObject::tr("Thank you for using qBittorrent.") + "\n"; // Send the notification email - const Preferences *pref = Preferences::instance(); - Net::Smtp *smtp = new Net::Smtp(this); - smtp->sendMail(pref->getMailNotificationSender(), - pref->getMailNotificationEmail(), - tr("[qBittorrent] '%1' has finished downloading").arg(torrent->name()), + Net::Smtp *sender = new Net::Smtp; + sender->sendMail("notification@qbittorrent.org", + Preferences::instance()->getMailNotificationEmail(), + QObject::tr("[qBittorrent] '%1' has finished downloading").arg(torrent->name()), content); } @@ -388,7 +349,7 @@ // do nothing & skip confirm } else { - if (!ShutdownConfirmDialog::askForConfirmation(m_window, action)) return; + if (!ShutdownConfirmDlg::askForConfirmation(action)) return; } #endif // DISABLE_GUI @@ -409,7 +370,7 @@ bool Application::sendParams(const QStringList ¶ms) { - return sendMessage(params.join(PARAMS_SEPARATOR)); + return sendMessage(params.join(QLatin1String(PARAMS_SEPARATOR))); } // As program parameters, we can get paths or urls. @@ -424,63 +385,15 @@ return; } #endif - BitTorrent::AddTorrentParams torrentParams; - TriStateBool skipTorrentDialog; foreach (QString param, params) { param = param.trimmed(); - - // Process strings indicating options specified by the user. - - if (param.startsWith(QLatin1String("@savePath="))) { - torrentParams.savePath = param.mid(10); - continue; - } - - if (param.startsWith(QLatin1String("@addPaused="))) { - torrentParams.addPaused = param.midRef(11).toInt() ? TriStateBool::True : TriStateBool::False; - continue; - } - - if (param == QLatin1String("@skipChecking")) { - torrentParams.skipChecking = true; - continue; - } - - if (param.startsWith(QLatin1String("@category="))) { - torrentParams.category = param.mid(10); - continue; - } - - if (param == QLatin1String("@sequential")) { - torrentParams.sequential = true; - continue; - } - - if (param == QLatin1String("@firstLastPiecePriority")) { - torrentParams.firstLastPiecePriority = true; - continue; - } - - if (param.startsWith(QLatin1String("@skipDialog="))) { - skipTorrentDialog = param.midRef(12).toInt() ? TriStateBool::True : TriStateBool::False; - continue; - } - #ifndef DISABLE_GUI - // There are two circumstances in which we want to show the torrent - // dialog. One is when the application settings specify that it should - // be shown and skipTorrentDialog is undefined. The other is when - // skipTorrentDialog is false, meaning that the application setting - // should be overridden. - const bool showDialogForThisTorrent = - ((AddNewTorrentDialog::isEnabled() && skipTorrentDialog == TriStateBool::Undefined) - || skipTorrentDialog == TriStateBool::False); - if (showDialogForThisTorrent) - AddNewTorrentDialog::show(param, torrentParams, m_window); + if (AddNewTorrentDialog::isEnabled()) + AddNewTorrentDialog::show(param, m_window); else #endif - BitTorrent::Session::instance()->addTorrent(param, torrentParams); + BitTorrent::Session::instance()->addTorrent(param); } } @@ -495,8 +408,8 @@ #endif BitTorrent::Session::initInstance(); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::torrentFinished, this, &Application::torrentFinished); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::allTorrentsFinished, this, &Application::allTorrentsFinished, Qt::QueuedConnection); + connect(BitTorrent::Session::instance(), SIGNAL(torrentFinished(BitTorrent::TorrentHandle *const)), SLOT(torrentFinished(BitTorrent::TorrentHandle *const))); + connect(BitTorrent::Session::instance(), SIGNAL(allTorrentsFinished()), SLOT(allTorrentsFinished()), Qt::QueuedConnection); #ifndef DISABLE_COUNTRIES_RESOLUTION Net::GeoIPManager::initInstance(); @@ -505,30 +418,19 @@ #ifndef DISABLE_WEBUI m_webui = new WebUI; -#ifdef DISABLE_GUI - if (m_webui->isErrored()) - return 1; - connect(m_webui, &WebUI::fatalError, this, []() { QCoreApplication::exit(1); }); -#endif // DISABLE_GUI -#endif // DISABLE_WEBUI - - new RSS::Session; // create RSS::Session singleton - new RSS::AutoDownloader; // create RSS::AutoDownloader singleton +#endif #ifdef DISABLE_GUI #ifndef DISABLE_WEBUI - Preferences *const pref = Preferences::instance(); + Preferences* const pref = Preferences::instance(); // Display some information to the user - const QString mesg = QString("\n******** %1 ********\n").arg(tr("Information")) - + tr("To control qBittorrent, access the Web UI at %1") - .arg(QString("http://localhost:") + QString::number(pref->getWebUiPort())) + '\n' - + tr("The Web UI administrator user name is: %1").arg(pref->getWebUiUsername()) + '\n'; - printf("%s", qUtf8Printable(mesg)); + std::cout << std::endl << "******** " << qPrintable(tr("Information")) << " ********" << std::endl; + std::cout << qPrintable(tr("To control qBittorrent, access the Web UI at http://localhost:%1").arg(QString::number(pref->getWebUiPort()))) << std::endl; + std::cout << qPrintable(tr("The Web UI administrator user name is: %1").arg(pref->getWebUiUsername())) << std::endl; qDebug() << "Password:" << pref->getWebUiPassword(); if (pref->getWebUiPassword() == "f6fdffe48c908deb0f4c3bd36c032e72") { - const QString warning = tr("The Web UI administrator password is still the default one: %1").arg("adminadmin") + '\n' - + tr("This is a security risk, please consider changing your password from program preferences.") + '\n'; - printf("%s", qUtf8Printable(warning)); + std::cout << qPrintable(tr("The Web UI administrator password is still the default one: %1").arg("adminadmin")) << std::endl; + std::cout << qPrintable(tr("This is a security risk, please consider changing your password from program preferences.")) << std::endl; } #endif // DISABLE_WEBUI #else @@ -536,15 +438,15 @@ #endif // DISABLE_GUI m_running = true; - - // Now UI is ready to process signals from Session - BitTorrent::Session::instance()->startUpTorrents(); - m_paramsQueue = params + m_paramsQueue; if (!m_paramsQueue.isEmpty()) { processParams(m_paramsQueue); m_paramsQueue.clear(); } + + // Now UI is ready to process signals from Session + BitTorrent::Session::instance()->startUpTorrents(); + return BaseApplication::exec(); } @@ -584,7 +486,7 @@ if (path.isEmpty()) // Get the url instead path = static_cast(ev)->url().toString(); - qDebug("Received a mac file open event: %s", qUtf8Printable(path)); + qDebug("Received a mac file open event: %s", qPrintable(path)); if (m_running) processParams(QStringList(path)); else @@ -613,22 +515,24 @@ void Application::initializeTranslation() { - Preferences *const pref = Preferences::instance(); + Preferences* const pref = Preferences::instance(); // Load translation QString localeStr = pref->getLocale(); - if (m_qtTranslator.load(QLatin1String("qtbase_") + localeStr, QLibraryInfo::location(QLibraryInfo::TranslationsPath)) || - m_qtTranslator.load(QLatin1String("qt_") + localeStr, QLibraryInfo::location(QLibraryInfo::TranslationsPath))) - qDebug("Qt %s locale recognized, using translation.", qUtf8Printable(localeStr)); + if ( +#ifdef QBT_USES_QT5 + m_qtTranslator.load(QString::fromUtf8("qtbase_") + localeStr, QLibraryInfo::location(QLibraryInfo::TranslationsPath)) || +#endif + m_qtTranslator.load(QString::fromUtf8("qt_") + localeStr, QLibraryInfo::location(QLibraryInfo::TranslationsPath))) + qDebug("Qt %s locale recognized, using translation.", qPrintable(localeStr)); else - qDebug("Qt %s locale unrecognized, using default (en).", qUtf8Printable(localeStr)); - + qDebug("Qt %s locale unrecognized, using default (en).", qPrintable(localeStr)); installTranslator(&m_qtTranslator); - if (m_translator.load(QLatin1String(":/lang/qbittorrent_") + localeStr)) - qDebug("%s locale recognized, using translation.", qUtf8Printable(localeStr)); + if (m_translator.load(QString::fromUtf8(":/lang/qbittorrent_") + localeStr)) + qDebug("%s locale recognized, using translation.", qPrintable(localeStr)); else - qDebug("%s locale unrecognized, using default (en).", qUtf8Printable(localeStr)); + qDebug("%s locale unrecognized, using default (en).", qPrintable(localeStr)); installTranslator(&m_translator); #ifndef DISABLE_GUI @@ -666,51 +570,49 @@ // According to the qt docs we shouldn't call quit() inside a slot. // aboutToQuit() is never emitted if the user hits "Cancel" in // the above dialog. - QTimer::singleShot(0, qApp, &QCoreApplication::quit); + QTimer::singleShot(0, qApp, SLOT(quit())); } #endif void Application::cleanup() { +#ifndef DISABLE_GUI +#ifdef Q_OS_WIN // cleanup() can be called multiple times during shutdown. We only need it once. static QAtomicInt alreadyDone; if (!alreadyDone.testAndSetAcquire(0, 1)) return; +#endif // Q_OS_WIN -#ifndef DISABLE_GUI - if (m_window) { - // Hide the window and don't leave it on screen as - // unresponsive. Also for Windows take the WinId - // after it's hidden, because hide() may cause a - // WinId change. - m_window->hide(); + // Hide the window and not leave it on screen as + // unresponsive. Also for Windows take the WinId + // after it's hidden, because hide() may cause a + // WinId change. + m_window->hide(); #ifdef Q_OS_WIN - typedef BOOL (WINAPI *PSHUTDOWNBRCREATE)(HWND, LPCWSTR); - const auto shutdownBRCreate = Utils::Misc::loadWinAPI("User32.dll", "ShutdownBlockReasonCreate"); - // Only available on Vista+ - if (shutdownBRCreate) - shutdownBRCreate((HWND)m_window->effectiveWinId(), tr("Saving torrent progress...").toStdWString().c_str()); + typedef BOOL (WINAPI *PSHUTDOWNBRCREATE)(HWND, LPCWSTR); + PSHUTDOWNBRCREATE shutdownBRCreate = (PSHUTDOWNBRCREATE)::GetProcAddress(::GetModuleHandleW(L"User32.dll"), "ShutdownBlockReasonCreate"); + // Only available on Vista+ + if (shutdownBRCreate) + shutdownBRCreate((HWND)m_window->effectiveWinId(), tr("Saving torrent progress...").toStdWString().c_str()); #endif // Q_OS_WIN - // Do manual cleanup in MainWindow to force widgets - // to save their Preferences, stop all timers and - // delete as many widgets as possible to leave only - // a 'shell' MainWindow. - // We need a valid window handle for Windows Vista+ - // otherwise the system shutdown will continue even - // though we created a ShutdownBlockReason - m_window->cleanup(); - } + // Do manual cleanup in MainWindow to force widgets + // to save their Preferences, stop all timers and + // delete as many widgets as possible to leave only + // a 'shell' MainWindow. + // We need a valid window handle for Windows Vista+ + // otherwise the system shutdown will continue even + // though we created a ShutdownBlockReason + m_window->cleanup(); + #endif // DISABLE_GUI #ifndef DISABLE_WEBUI delete m_webui; #endif - delete RSS::AutoDownloader::instance(); - delete RSS::Session::instance(); - ScanFoldersModel::freeInstance(); BitTorrent::Session::freeInstance(); #ifndef DISABLE_COUNTRIES_RESOLUTION @@ -726,16 +628,14 @@ Utils::Fs::removeDirRecursive(Utils::Fs::tempPath()); #ifndef DISABLE_GUI - if (m_window) { #ifdef Q_OS_WIN - typedef BOOL (WINAPI *PSHUTDOWNBRDESTROY)(HWND); - const auto shutdownBRDestroy = Utils::Misc::loadWinAPI("User32.dll", "ShutdownBlockReasonDestroy"); - // Only available on Vista+ - if (shutdownBRDestroy) - shutdownBRDestroy((HWND)m_window->effectiveWinId()); + typedef BOOL (WINAPI *PSHUTDOWNBRDESTROY)(HWND); + PSHUTDOWNBRDESTROY shutdownBRDestroy = (PSHUTDOWNBRDESTROY)::GetProcAddress(::GetModuleHandleW(L"User32.dll"), "ShutdownBlockReasonDestroy"); + // Only available on Vista+ + if (shutdownBRDestroy) + shutdownBRDestroy((HWND)m_window->effectiveWinId()); #endif // Q_OS_WIN - delete m_window; - } + delete m_window; #endif // DISABLE_GUI if (m_shutdownAct != ShutdownDialogAction::Exit) { @@ -743,12 +643,3 @@ Utils::Misc::shutdownComputer(m_shutdownAct); } } - -void Application::validateCommandLineParameters() -{ - if (m_commandLineArgs.portableMode && !m_commandLineArgs.profileDir.isEmpty()) - throw CommandLineParameterError(tr("Portable mode and explicit profile directory options are mutually exclusive")); - - if (m_commandLineArgs.portableMode && m_commandLineArgs.relativeFastresumePaths) - Logger::instance()->addMessage(tr("Portable mode implies relative fastresume"), Log::WARNING); -} diff -Nru qbittorrent-4.1.3/src/app/application.h qbittorrent-3.3.15/src/app/application.h --- qbittorrent-4.1.3/src/app/application.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/app/application.h 2017-08-03 20:30:10.000000000 +0000 @@ -40,16 +40,17 @@ class MainWindow; #ifdef Q_OS_WIN +QT_BEGIN_NAMESPACE class QSessionManager; +QT_END_NAMESPACE #endif // Q_OS_WIN #else #include "qtsinglecoreapplication.h" typedef QtSingleCoreApplication BaseApplication; -#endif // DISABLE_GUI +#endif #include "base/utils/misc.h" -#include "cmdoptions.h" #ifndef DISABLE_WEBUI class WebUI; @@ -62,20 +63,12 @@ class TorrentHandle; } -namespace RSS -{ - class Session; - class AutoDownloader; -} - class Application : public BaseApplication { Q_OBJECT - Q_DISABLE_COPY(Application) public: Application(const QString &id, int &argc, char **argv); - ~Application() override; #if (defined(Q_OS_WIN) && !defined(DISABLE_GUI)) bool isRunning(); @@ -87,8 +80,6 @@ QPointer mainWindow(); #endif - const QBtCommandLineParameters &commandLineArgs() const; - // FileLogger properties bool isFileLoggerEnabled() const; void setFileLoggerEnabled(bool value); @@ -99,7 +90,7 @@ bool isFileLoggerDeleteOld() const; void setFileLoggerDeleteOld(bool value); int fileLoggerMaxSize() const; - void setFileLoggerMaxSize(const int bytes); + void setFileLoggerMaxSize(const int value); int fileLoggerAge() const; void setFileLoggerAge(const int value); int fileLoggerAgeType() const; @@ -108,9 +99,9 @@ protected: #ifndef DISABLE_GUI #ifdef Q_OS_MAC - bool event(QEvent *) override; + bool event(QEvent *); #endif - bool notify(QObject *receiver, QEvent *event) override; + bool notify(QObject* receiver, QEvent* event); #endif private slots: @@ -125,14 +116,13 @@ private: bool m_running; ShutdownDialogAction m_shutdownAct; - QBtCommandLineParameters m_commandLineArgs; #ifndef DISABLE_GUI QPointer m_window; #endif #ifndef DISABLE_WEBUI - WebUI *m_webui; + QPointer m_webui; #endif // FileLog @@ -144,9 +134,8 @@ void initializeTranslation(); void processParams(const QStringList ¶ms); - void runExternalProgram(const BitTorrent::TorrentHandle *torrent) const; - void sendNotificationEmail(const BitTorrent::TorrentHandle *torrent); - void validateCommandLineParameters(); + void runExternalProgram(BitTorrent::TorrentHandle *const torrent) const; + void sendNotificationEmail(BitTorrent::TorrentHandle *const torrent); }; #endif // APPLICATION_H diff -Nru qbittorrent-4.1.3/src/app/app.pri qbittorrent-3.3.15/src/app/app.pri --- qbittorrent-4.1.3/src/app/app.pri 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/app/app.pri 2017-08-03 20:30:10.000000000 +0000 @@ -16,25 +16,19 @@ HEADERS += \ $$PWD/application.h \ - $$PWD/cmdoptions.h \ $$PWD/filelogger.h SOURCES += \ $$PWD/application.cpp \ - $$PWD/cmdoptions.cpp \ $$PWD/filelogger.cpp \ $$PWD/main.cpp -stacktrace { - unix { - HEADERS += $$PWD/stacktrace.h - } - else { - HEADERS += $$PWD/stacktrace_win.h - !nogui { - HEADERS += $$PWD/stacktracedialog.h - FORMS += $$PWD/stacktracedialog.ui - } +unix: HEADERS += $$PWD/stacktrace.h +strace_win { + HEADERS += $$PWD/stacktrace_win.h + !nogui { + HEADERS += $$PWD/stacktrace_win_dlg.h + FORMS += $$PWD/stacktrace_win_dlg.ui } } diff -Nru qbittorrent-4.1.3/src/app/CMakeLists.txt qbittorrent-3.3.15/src/app/CMakeLists.txt --- qbittorrent-4.1.3/src/app/CMakeLists.txt 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/app/CMakeLists.txt 2017-08-03 20:30:10.000000000 +0000 @@ -1,38 +1,32 @@ -add_executable(qBittorrent +project(qbt_executable) +include_directories(${CMAKE_CURRENT_BINARY_DIR}) + +set(QBT_APP_HEADERS application.h -cmdoptions.h filelogger.h -upgrade.h +) + +set(QBT_APP_SOURCES application.cpp -cmdoptions.cpp filelogger.cpp main.cpp ) -target_include_directories(qBittorrent PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -target_link_libraries(qBittorrent - PRIVATE - qbt_base -) - -set_target_properties(qBittorrent - PROPERTIES - AUTOUIC True - AUTORCC True - MACOSX_BUNDLE True -) - # translations file(GLOB QBT_TS_FILES ../lang/*.ts) get_filename_component(QBT_QM_FILES_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/../lang" ABSOLUTE) set_source_files_properties(${QBT_TS_FILES} PROPERTIES OUTPUT_LOCATION "${QBT_QM_FILES_BINARY_DIR}") -find_package(Qt5 COMPONENTS LinguistTools REQUIRED) -qt5_add_translation(QBT_QM_FILES ${QBT_TS_FILES}) - -get_filename_component(_lang_qrc_src "${CMAKE_CURRENT_SOURCE_DIR}/../lang/lang.qrc" ABSOLUTE) -get_filename_component(_lang_qrc_dst "${CMAKE_CURRENT_BINARY_DIR}/../lang/lang.qrc" ABSOLUTE) -get_filename_component(_lang_qrc_dst_dir "${CMAKE_CURRENT_BINARY_DIR}/../lang" ABSOLUTE) +if (QT5) + find_package(Qt5 COMPONENTS LinguistTools REQUIRED) + qt5_add_translation(QBT_QM_FILES ${QBT_TS_FILES}) +else (QT5) + qt4_add_translation(QBT_QM_FILES ${QBT_TS_FILES}) +endif (QT5) + +get_filename_component(_lang_qrc_src "${CMAKE_CURRENT_SOURCE_DIR}/../lang.qrc" ABSOLUTE) +get_filename_component(_lang_qrc_dst "${CMAKE_CURRENT_BINARY_DIR}/../lang.qrc" ABSOLUTE) +get_filename_component(_lang_qrc_dst_dir "${CMAKE_CURRENT_BINARY_DIR}/../" ABSOLUTE) message(STATUS "copying ${_lang_qrc_src} -> ${_lang_qrc_dst}") file(COPY ${_lang_qrc_src} DESTINATION ${_lang_qrc_dst_dir}) @@ -43,52 +37,66 @@ endforeach() set(QBT_APP_RESOURCES -../icons/icons.qrc -../searchengine/searchengine.qrc +../icons.qrc +../searchengine.qrc "${_lang_qrc_dst}" ) # With AUTORCC rcc is ran by cmake before language files are generated, # and thus we call rcc explicitly -qt5_add_resources(QBT_APP_RESOURCE_SOURCE ${QBT_APP_RESOURCES}) +if (QT5) + qt5_add_resources(QBT_APP_RESOURCE_SOURCE ${QBT_APP_RESOURCES}) +else (QT5) + qt4_add_resources(QBT_APP_RESOURCE_SOURCE ${QBT_APP_RESOURCES}) +endif (QT5) if (WIN32) if (MINGW) - target_sources(qBittorrent PRIVATE ../qbittorrent_mingw.rc) + list (APPEND QBT_APP_SOURCES ../qbittorrent_mingw.rc) else (MINGW) - target_sources(qBittorrent PRIVATE ../qbittorrent.rc) + list (APPEND QBT_APP_SOURCES ../qbittorrent.rc) endif (MINGW) - target_sources(qBittorrent PRIVATE ../qbittorrent.exe.manifest) + list(APPEND QBT_APP_SOURCES ../qbittorrent.exe.manifest) endif (WIN32) -if (STACKTRACE) - if (UNIX) - target_sources(qBittorrent PRIVATE stacktrace.h) - else (UNIX) - target_sources(qBittorrent PRIVATE stacktrace_win.h) - if (Qt5Widgets_FOUND) - target_sources(qBittorrent PRIVATE stacktracedialog.h) - endif (Qt5Widgets_FOUND) - endif (UNIX) -endif (STACKTRACE) - - -if (Qt5Widgets_FOUND) - target_link_libraries(qBittorrent PRIVATE qbt_searchengine qbt_gui) - set_target_properties(qBittorrent - PROPERTIES - OUTPUT_NAME qbittorrent - WIN32_EXECUTABLE True - ) -else(Qt5Widgets_FOUND) - set_target_properties(qBittorrent - PROPERTIES - OUTPUT_NAME qbittorrent-nox +if (UNIX) + list(APPEND QBT_APP_HEADERS stacktrace.h) +endif (UNIX) + +if (STACKTRACE_WIN) + list(APPEND QBT_APP_HEADERS stacktrace_win.h) + if (GUI) + list(APPEND QBT_APP_HEADERS stacktrace_win_dlg.h) + endif (GUI) +endif (STACKTRACE_WIN) + +# usesystemqtsingleapplication { +# nogui { +# CONFIG += qtsinglecoreapplication +# } else { +# CONFIG += qtsingleapplication +# } +# } else { +# nogui { +# include(qtsingleapplication/qtsinglecoreapplication.pri) +# } else { +# include(qtsingleapplication/qtsingleapplication.pri) +# } +# } + +# upgrade code +list(APPEND QBT_APP_HEADERS upgrade.h) +list(APPEND QBT_TARGET_LIBRARIES qbt_base) + +if (GUI) + list(APPEND QBT_TARGET_LIBRARIES qbt_searchengine qbt_gui) + include_directories(../gui + ${CMAKE_CURRENT_BINARY_DIR}/../gui ) -endif (Qt5Widgets_FOUND) +endif (GUI) if (WEBUI) - target_link_libraries(qBittorrent PRIVATE qbt_webui) + list(APPEND QBT_TARGET_LIBRARIES qbt_webui) endif (WEBUI) # we have to include resources into the bundle @@ -140,32 +148,39 @@ PROPERTIES MACOSX_PACKAGE_LOCATION translations) endif (APPLE) -target_sources(qBittorrent PRIVATE ${QBT_QM_FILES} ${QBT_APP_RESOURCE_SOURCE}) +add_executable(${QBT_TARGET_NAME} ${QBT_APP_HEADERS} ${QBT_APP_SOURCES} ${QBT_QM_FILES} ${QBT_APP_RESOURCE_SOURCE}) +set_target_properties(${QBT_TARGET_NAME} + PROPERTIES + AUTOUIC True + AUTORCC True + MACOSX_BUNDLE True +) -get_target_property(QBT_EXECUTABLE_NAME qBittorrent OUTPUT_NAME) +if (GUI AND WIN32) + set_target_properties(${QBT_TARGET_NAME} PROPERTIES WIN32_EXECUTABLE True) +endif (GUI AND WIN32) -target_link_libraries(qBittorrent PRIVATE ${QBT_TARGET_LIBRARIES} QtSingleApplication::QtSingleApplication) +target_link_libraries(${QBT_TARGET_NAME} ${QBT_TARGET_LIBRARIES} QtSingleApplication::QtSingleApplication) if (APPLE) - set(qbt_BUNDLE_NAME ${QBT_EXECUTABLE_NAME}) + set(qbt_BUNDLE_NAME "${QBT_TARGET_NAME}") # substitute @EXECUTABLE@ in dist/mac/Info.plist set(EXECUTABLE ${qbt_BUNDLE_NAME}) configure_file(${qBittorrent_SOURCE_DIR}/dist/mac/Info.plist ${qBittorrent_BINARY_DIR}/dist/mac/Info.plist @ONLY) - set_target_properties(qBittorrent PROPERTIES + set_target_properties(${QBT_TARGET_NAME} PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "${qbt_BUNDLE_NAME}" MACOSX_BUNDLE_INFO_PLIST ${qBittorrent_BINARY_DIR}/dist/mac/Info.plist ) endif (APPLE) # installation -install(TARGETS qBittorrent +install(TARGETS ${QBT_TARGET_NAME} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} BUNDLE DESTINATION . COMPONENT runtime) -if (Qt5Widgets_FOUND AND APPLE) - find_package(Qt5Svg REQUIRED) - include(bundle) -endif (Qt5Widgets_FOUND AND APPLE) +if (APPLE AND GUI) + install(SCRIPT ${OSX_RES_SRC_DIR}/bundle.cmake) +endif (APPLE AND GUI) diff -Nru qbittorrent-4.1.3/src/app/cmdoptions.cpp qbittorrent-3.3.15/src/app/cmdoptions.cpp --- qbittorrent-4.1.3/src/app/cmdoptions.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/app/cmdoptions.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,586 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2016 Eugene Shalygin - * Copyright (C) 2014 Vladimir Golovnev - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "cmdoptions.h" - -#include - -#include -#include -#include -#include - -#ifdef Q_OS_WIN -#include -#endif - -#include "base/utils/misc.h" -#include "base/utils/string.h" - -namespace -{ - const int USAGE_INDENTATION = 4; - const int USAGE_TEXT_COLUMN = 31; - const int WRAP_AT_COLUMN = 80; - - // Base option class. Encapsulates name operations. - class Option - { - protected: - constexpr Option(const char *name, char shortcut = 0) - : m_name {name} - , m_shortcut {shortcut} - { - } - - QString fullParameter() const - { - return QLatin1String("--") + QLatin1String(m_name); - } - - QString shortcutParameter() const - { - return QLatin1String("-") + QLatin1Char(m_shortcut); - } - - bool hasShortcut() const - { - return m_shortcut != 0; - } - - QString envVarName() const - { - return QLatin1String("QBT_") - + QString(QLatin1String(m_name)).toUpper().replace(QLatin1Char('-'), QLatin1Char('_')); - } - - public: - static QString padUsageText(const QString &usage) - { - QString res = QString(USAGE_INDENTATION, ' ') + usage; - - if ((USAGE_TEXT_COLUMN - usage.length() - 4) > 0) - return res + QString(USAGE_TEXT_COLUMN - usage.length() - 4, ' '); - else - return res; - } - - private: - const char *m_name; - const char m_shortcut; - }; - - // Boolean option. - class BoolOption : protected Option - { - public: - constexpr BoolOption(const char *name, char shortcut = 0) - : Option {name, shortcut} - { - } - - bool operator==(const QString &arg) const - { - return (hasShortcut() && ((arg.size() == 2) && (arg == shortcutParameter()))) - || (arg == fullParameter()); - } - - bool value(const QProcessEnvironment &env) const - { - QString val = env.value(envVarName()); - // we accept "1" and "true" (upper or lower cased) as boolean 'true' values - return ((val == QLatin1String("1")) || (val.toUpper() == QLatin1String("TRUE"))); - } - - QString usage() const - { - QString res; - if (hasShortcut()) - res += shortcutParameter() + QLatin1String(" | "); - res += fullParameter(); - return padUsageText(res); - } - }; - - bool operator==(const QString &s, const BoolOption &o) - { - return o == s; - } - - // Option with string value. May not have a shortcut - struct StringOption : protected Option - { - public: - constexpr StringOption(const char *name) - : Option {name, 0} - { - } - - bool operator==(const QString &arg) const - { - return arg.startsWith(parameterAssignment()); - } - - QString value(const QString &arg) const - { - QStringList parts = arg.split(QLatin1Char('=')); - if (parts.size() == 2) - return Utils::String::unquote(parts[1], QLatin1String("'\"")); - throw CommandLineParameterError(QObject::tr("Parameter '%1' must follow syntax '%1=%2'", - "e.g. Parameter '--webui-port' must follow syntax '--webui-port=value'") - .arg(fullParameter()).arg(QLatin1String(""))); - } - - QString value(const QProcessEnvironment &env, const QString &defaultValue = QString()) const - { - QString val = env.value(envVarName()); - return val.isEmpty() ? defaultValue : Utils::String::unquote(val, QLatin1String("'\"")); - } - - QString usage(const QString &valueName) const - { - return padUsageText(parameterAssignment() + QLatin1Char('<') + valueName + QLatin1Char('>')); - } - - private: - QString parameterAssignment() const - { - return fullParameter() + QLatin1Char('='); - } - }; - - bool operator==(const QString &s, const StringOption &o) - { - return o == s; - } - - // Option with integer value. May not have a shortcut - class IntOption : protected StringOption - { - public: - constexpr IntOption(const char *name) - : StringOption {name} - { - } - - using StringOption::operator==; - using StringOption::usage; - - int value(const QString &arg) const - { - QString val = StringOption::value(arg); - bool ok = false; - int res = val.toInt(&ok); - if (!ok) - throw CommandLineParameterError(QObject::tr("Parameter '%1' must follow syntax '%1=%2'", - "e.g. Parameter '--webui-port' must follow syntax '--webui-port='") - .arg(fullParameter()).arg(QLatin1String(""))); - return res; - } - - int value(const QProcessEnvironment &env, int defaultValue) const - { - QString val = env.value(envVarName()); - if (val.isEmpty()) return defaultValue; - - bool ok; - int res = val.toInt(&ok); - if (!ok) { - qDebug() << QObject::tr("Expected integer number in environment variable '%1', but got '%2'") - .arg(envVarName(), val); - return defaultValue; - } - return res; - } - }; - - bool operator==(const QString &s, const IntOption &o) - { - return o == s; - } - - // Option that is explicitly set to true or false, and whose value is undefined when unspecified. - // May not have a shortcut. - class TriStateBoolOption : protected Option - { - public: - constexpr TriStateBoolOption(const char *name, bool defaultValue) - : Option {name, 0} - , m_defaultValue(defaultValue) - { - } - - bool operator==(const QString &arg) const - { - QStringList parts = arg.split(QLatin1Char('=')); - return parts[0] == fullParameter(); - } - - QString usage() const - { - return padUsageText(fullParameter() + QLatin1String("=")); - } - - TriStateBool value(const QString &arg) const - { - QStringList parts = arg.split(QLatin1Char('=')); - - if (parts.size() == 1) { - return TriStateBool(m_defaultValue); - } - else if (parts.size() == 2) { - QString val = parts[1]; - - if ((val.toUpper() == QLatin1String("TRUE")) || (val == QLatin1String("1"))) { - return TriStateBool::True; - } - else if ((val.toUpper() == QLatin1String("FALSE")) || (val == QLatin1String("0"))) { - return TriStateBool::False; - } - } - - throw CommandLineParameterError(QObject::tr("Parameter '%1' must follow syntax '%1=%2'", - "e.g. Parameter '--add-paused' must follow syntax " - "'--add-paused='") - .arg(fullParameter()) - .arg(QLatin1String(""))); - } - - TriStateBool value(const QProcessEnvironment &env) const - { - QString val = env.value(envVarName(), "-1"); - - if (val.isEmpty()) { - return TriStateBool(m_defaultValue); - } - else if (val == QLatin1String("-1")) { - return TriStateBool::Undefined; - } - else if ((val.toUpper() == QLatin1String("TRUE")) || (val == QLatin1String("1"))) { - return TriStateBool::True; - } - else if ((val.toUpper() == QLatin1String("FALSE")) || (val == QLatin1String("0"))) { - return TriStateBool::False; - } - else { - qDebug() << QObject::tr("Expected %1 in environment variable '%2', but got '%3'") - .arg(QLatin1String("true|false"), envVarName(), val); - return TriStateBool::Undefined; - } - } - - bool m_defaultValue; - }; - - bool operator==(const QString &s, const TriStateBoolOption &o) - { - return o == s; - } - - constexpr const BoolOption SHOW_HELP_OPTION = {"help", 'h'}; - constexpr const BoolOption SHOW_VERSION_OPTION = {"version", 'v'}; -#ifdef DISABLE_GUI - constexpr const BoolOption DAEMON_OPTION = {"daemon", 'd'}; -#else - constexpr const BoolOption NO_SPLASH_OPTION = {"no-splash"}; -#endif - constexpr const IntOption WEBUI_PORT_OPTION = {"webui-port"}; - constexpr const StringOption PROFILE_OPTION = {"profile"}; - constexpr const StringOption CONFIGURATION_OPTION = {"configuration"}; - constexpr const BoolOption PORTABLE_OPTION = {"portable"}; - constexpr const BoolOption RELATIVE_FASTRESUME = {"relative-fastresume"}; - constexpr const StringOption SAVE_PATH_OPTION = {"save-path"}; - constexpr const TriStateBoolOption PAUSED_OPTION = {"add-paused", true}; - constexpr const BoolOption SKIP_HASH_CHECK_OPTION = {"skip-hash-check"}; - constexpr const StringOption CATEGORY_OPTION = {"category"}; - constexpr const BoolOption SEQUENTIAL_OPTION = {"sequential"}; - constexpr const BoolOption FIRST_AND_LAST_OPTION = {"first-and-last"}; - constexpr const TriStateBoolOption SKIP_DIALOG_OPTION = {"skip-dialog", true}; -} - -QBtCommandLineParameters::QBtCommandLineParameters(const QProcessEnvironment &env) - : showHelp(false) - , relativeFastresumePaths(RELATIVE_FASTRESUME.value(env)) - , portableMode(PORTABLE_OPTION.value(env)) - , skipChecking(SKIP_HASH_CHECK_OPTION.value(env)) - , sequential(SEQUENTIAL_OPTION.value(env)) - , firstLastPiecePriority(FIRST_AND_LAST_OPTION.value(env)) -#ifndef Q_OS_WIN - , showVersion(false) -#endif -#ifndef DISABLE_GUI - , noSplash(NO_SPLASH_OPTION.value(env)) -#else - , shouldDaemonize(DAEMON_OPTION.value(env)) -#endif - , webUiPort(WEBUI_PORT_OPTION.value(env, -1)) - , addPaused(PAUSED_OPTION.value(env)) - , skipDialog(SKIP_DIALOG_OPTION.value(env)) - , profileDir(PROFILE_OPTION.value(env)) - , configurationName(CONFIGURATION_OPTION.value(env)) - , savePath(SAVE_PATH_OPTION.value(env)) - , category(CATEGORY_OPTION.value(env)) -{ -} - -QStringList QBtCommandLineParameters::paramList() const -{ - QStringList result; - // Because we're passing a string list to the currently running - // qBittorrent process, we need some way of passing along the options - // the user has specified. Here we place special strings that are - // almost certainly not going to collide with a file path or URL - // specified by the user, and placing them at the beginning of the - // string list so that they will be processed before the list of - // torrent paths or URLs. - - if (!savePath.isEmpty()) - result.append(QString("@savePath=%1").arg(savePath)); - - if (addPaused == TriStateBool::True) { - result.append(QLatin1String("@addPaused=1")); - } - else if (addPaused == TriStateBool::False) { - result.append(QLatin1String("@addPaused=0")); - } - - if (skipChecking) - result.append(QLatin1String("@skipChecking")); - - if (!category.isEmpty()) - result.append(QString("@category=%1").arg(category)); - - if (sequential) - result.append(QLatin1String("@sequential")); - - if (firstLastPiecePriority) - result.append(QLatin1String("@firstLastPiecePriority")); - - if (skipDialog == TriStateBool::True) { - result.append(QLatin1String("@skipDialog=1")); - } - else if (skipDialog == TriStateBool::False) { - result.append(QLatin1String("@skipDialog=0")); - } - - result += torrents; - return result; -} - -QBtCommandLineParameters parseCommandLine(const QStringList &args) -{ - QBtCommandLineParameters result {QProcessEnvironment::systemEnvironment()}; - - for (int i = 1; i < args.count(); ++i) { - const QString &arg = args[i]; - - if ((arg.startsWith("--") && !arg.endsWith(".torrent")) - || (arg.startsWith('-') && (arg.size() == 2))) { - // Parse known parameters - if (arg == SHOW_HELP_OPTION) { - result.showHelp = true; - } -#ifndef Q_OS_WIN - else if (arg == SHOW_VERSION_OPTION) { - result.showVersion = true; - } -#endif - else if (arg == WEBUI_PORT_OPTION) { - result.webUiPort = WEBUI_PORT_OPTION.value(arg); - if ((result.webUiPort < 1) || (result.webUiPort > 65535)) - throw CommandLineParameterError(QObject::tr("%1 must specify a valid port (1 to 65535).") - .arg(QLatin1String("--webui-port"))); - } -#ifndef DISABLE_GUI - else if (arg == NO_SPLASH_OPTION) { - result.noSplash = true; - } -#else - else if (arg == DAEMON_OPTION) { - result.shouldDaemonize = true; - } -#endif - else if (arg == PROFILE_OPTION) { - result.profileDir = PROFILE_OPTION.value(arg); - } - else if (arg == RELATIVE_FASTRESUME) { - result.relativeFastresumePaths = true; - } - else if (arg == PORTABLE_OPTION) { - result.portableMode = true; - } - else if (arg == CONFIGURATION_OPTION) { - result.configurationName = CONFIGURATION_OPTION.value(arg); - } - else if (arg == SAVE_PATH_OPTION) { - result.savePath = SAVE_PATH_OPTION.value(arg); - } - else if (arg == PAUSED_OPTION) { - result.addPaused = PAUSED_OPTION.value(arg); - } - else if (arg == SKIP_HASH_CHECK_OPTION) { - result.skipChecking = true; - } - else if (arg == CATEGORY_OPTION) { - result.category = CATEGORY_OPTION.value(arg); - } - else if (arg == SEQUENTIAL_OPTION) { - result.sequential = true; - } - else if (arg == FIRST_AND_LAST_OPTION) { - result.firstLastPiecePriority = true; - } - else if (arg == SKIP_DIALOG_OPTION) { - result.skipDialog = SKIP_DIALOG_OPTION.value(arg); - } - else { - // Unknown argument - result.unknownParameter = arg; - break; - } - } - else { - QFileInfo torrentPath; - torrentPath.setFile(arg); - - if (torrentPath.exists()) - result.torrents += torrentPath.absoluteFilePath(); - else - result.torrents += arg; - } - } - - return result; -} - -CommandLineParameterError::CommandLineParameterError(const QString &messageForUser) - : std::runtime_error(messageForUser.toLocal8Bit().data()) - , m_messageForUser(messageForUser) -{ -} - -const QString& CommandLineParameterError::messageForUser() const -{ - return m_messageForUser; -} - -QString wrapText(const QString &text, int initialIndentation = USAGE_TEXT_COLUMN, int wrapAtColumn = WRAP_AT_COLUMN) -{ - QStringList words = text.split(' '); - QStringList lines = {words.first()}; - int currentLineMaxLength = wrapAtColumn - initialIndentation; - - foreach (const QString &word, words.mid(1)) { - if (lines.last().length() + word.length() + 1 < currentLineMaxLength) { - lines.last().append(' ' + word); - } - else { - lines.append(QString(initialIndentation, ' ') + word); - currentLineMaxLength = wrapAtColumn; - } - } - - return lines.join('\n'); -} - -QString makeUsage(const QString &prgName) -{ - QString text; - QTextStream stream(&text, QIODevice::WriteOnly); - QString indentation = QString(USAGE_INDENTATION, ' '); - - stream << QObject::tr("Usage:") << '\n'; - stream << indentation << prgName << QLatin1String(" [options] [( | )...]") << '\n'; - - stream << QObject::tr("Options:") << '\n'; -#ifndef Q_OS_WIN - stream << SHOW_VERSION_OPTION.usage() << wrapText(QObject::tr("Display program version and exit")) << '\n'; -#endif - stream << SHOW_HELP_OPTION.usage() << wrapText(QObject::tr("Display this help message and exit")) << '\n'; - stream << WEBUI_PORT_OPTION.usage(QObject::tr("port")) - << wrapText(QObject::tr("Change the Web UI port")) - << '\n'; -#ifndef DISABLE_GUI - stream << NO_SPLASH_OPTION.usage() << wrapText(QObject::tr("Disable splash screen")) << '\n'; -#else - stream << DAEMON_OPTION.usage() << wrapText(QObject::tr("Run in daemon-mode (background)")) << '\n'; -#endif - //: Use appropriate short form or abbreviation of "directory" - stream << PROFILE_OPTION.usage(QObject::tr("dir")) - << wrapText(QObject::tr("Store configuration files in

")) << '\n'; - stream << CONFIGURATION_OPTION.usage(QObject::tr("name")) - << wrapText(QObject::tr("Store configuration files in directories qBittorrent_")) << '\n'; - stream << RELATIVE_FASTRESUME.usage() - << wrapText(QObject::tr("Hack into libtorrent fastresume files and make file paths relative " - "to the profile directory")) << '\n'; - stream << PORTABLE_OPTION.usage() - << wrapText(QObject::tr("Shortcut for %1", "Shortcut for --profile=/profile --relative-fastresume") - .arg(QLatin1String("--profile=/profile --relative-fastresume"))) << '\n'; - stream << Option::padUsageText(QObject::tr("files or URLs")) - << wrapText(QObject::tr("Download the torrents passed by the user")) << '\n' - << '\n'; - - stream << wrapText(QObject::tr("Options when adding new torrents:"), 0) << '\n'; - stream << SAVE_PATH_OPTION.usage(QObject::tr("path")) << wrapText(QObject::tr("Torrent save path")) << '\n'; - stream << PAUSED_OPTION.usage() << wrapText(QObject::tr("Add torrents as started or paused")) << '\n'; - stream << SKIP_HASH_CHECK_OPTION.usage() << wrapText(QObject::tr("Skip hash check")) << '\n'; - stream << CATEGORY_OPTION.usage(QObject::tr("name")) - << wrapText(QObject::tr("Assign torrents to category. If the category doesn't exist, it will be " - "created.")) << '\n'; - stream << SEQUENTIAL_OPTION.usage() << wrapText(QObject::tr("Download files in sequential order")) << '\n'; - stream << FIRST_AND_LAST_OPTION.usage() - << wrapText(QObject::tr("Download first and last pieces first")) << '\n'; - stream << SKIP_DIALOG_OPTION.usage() - << wrapText(QObject::tr("Specify whether the \"Add New Torrent\" dialog opens when adding a " - "torrent.")) << '\n'; - stream << '\n'; - - stream << wrapText(QObject::tr("Option values may be supplied via environment variables. For option named " - "'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper " - "case, '-' replaced with '_'). To pass flag values, set the variable to '1' or " - "'TRUE'. For example, to disable the splash screen: "), 0) << "\n" - << QLatin1String("QBT_NO_SPLASH=1 ") << prgName << '\n' - << wrapText(QObject::tr("Command line parameters take precedence over environment variables"), 0) << '\n'; - - stream << flush; - return text; -} - -void displayUsage(const QString &prgName) -{ -#ifndef Q_OS_WIN - printf("%s\n", qUtf8Printable(makeUsage(prgName))); -#else - QMessageBox msgBox(QMessageBox::Information, QObject::tr("Help"), makeUsage(prgName), QMessageBox::Ok); - msgBox.show(); // Need to be shown or to moveToCenter does not work - msgBox.move(Utils::Misc::screenCenter(&msgBox)); - msgBox.exec(); -#endif -} diff -Nru qbittorrent-4.1.3/src/app/cmdoptions.h qbittorrent-3.3.15/src/app/cmdoptions.h --- qbittorrent-4.1.3/src/app/cmdoptions.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/app/cmdoptions.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,76 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2016 Eugene Shalygin - * Copyright (C) 2014 Vladimir Golovnev - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef APP_OPTIONS_H -#define APP_OPTIONS_H - -#include - -#include -#include - -#include "base/tristatebool.h" - -class QProcessEnvironment; - -struct QBtCommandLineParameters -{ - bool showHelp, relativeFastresumePaths, portableMode, skipChecking, sequential, firstLastPiecePriority; -#ifndef Q_OS_WIN - bool showVersion; -#endif -#ifndef DISABLE_GUI - bool noSplash; -#else - bool shouldDaemonize; -#endif - int webUiPort; - TriStateBool addPaused, skipDialog; - QStringList torrents; - QString profileDir, configurationName, savePath, category, unknownParameter; - - QBtCommandLineParameters(const QProcessEnvironment&); - QStringList paramList() const; -}; - -class CommandLineParameterError : public std::runtime_error -{ -public: - CommandLineParameterError(const QString &messageForUser); - const QString &messageForUser() const; - -private: - const QString m_messageForUser; -}; - -QBtCommandLineParameters parseCommandLine(const QStringList &args); -void displayUsage(const QString &prgName); - -#endif // APP_OPTIONS_H diff -Nru qbittorrent-4.1.3/src/app/filelogger.cpp qbittorrent-3.3.15/src/app/filelogger.cpp --- qbittorrent-4.1.3/src/app/filelogger.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/app/filelogger.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -26,13 +26,11 @@ * exception statement from your version. */ -#include "filelogger.h" - #include #include #include #include - +#include "filelogger.h" #include "base/logger.h" #include "base/utils/fs.h" @@ -43,17 +41,17 @@ { m_flusher.setInterval(0); m_flusher.setSingleShot(true); - connect(&m_flusher, &QTimer::timeout, this, &FileLogger::flushLog); + connect(&m_flusher, SIGNAL(timeout()), SLOT(flushLog())); changePath(path); if (deleteOld) this->deleteOld(age, ageType); - const Logger *const logger = Logger::instance(); - foreach (const Log::Msg &msg, logger->getMessages()) + const Logger* const logger = Logger::instance(); + foreach (const Log::Msg& msg, logger->getMessages()) addLogMessage(msg); - connect(logger, &Logger::newLogMessage, this, &FileLogger::addLogMessage); + connect(logger, SIGNAL(newLogMessage(const Log::Msg &)), SLOT(addLogMessage(const Log::Msg &))); } FileLogger::~FileLogger() @@ -63,7 +61,7 @@ delete m_logFile; } -void FileLogger::changePath(const QString &newPath) +void FileLogger::changePath(const QString& newPath) { QString tmpPath = Utils::Fs::fromNativePath(newPath); QDir dir(tmpPath); @@ -85,21 +83,21 @@ void FileLogger::deleteOld(const int age, const FileLogAgeType ageType) { QDateTime date = QDateTime::currentDateTime(); - QDir dir(Utils::Fs::branchPath(m_path)); + QDir dir(m_path); + + switch (ageType) { + case DAYS: + date = date.addDays(age); + break; + case MONTHS: + date = date.addMonths(age); + break; + default: + date = date.addYears(age); + } foreach (const QFileInfo file, dir.entryInfoList(QStringList("qbittorrent.log.bak*"), QDir::Files | QDir::Writable, QDir::Time | QDir::Reversed)) { - QDateTime modificationDate = file.lastModified(); - switch (ageType) { - case DAYS: - modificationDate = modificationDate.addDays(age); - break; - case MONTHS: - modificationDate = modificationDate.addMonths(age); - break; - default: - modificationDate = modificationDate.addYears(age); - } - if (modificationDate > date) + if (file.lastModified() < date) break; Utils::Fs::forceRemove(file.absoluteFilePath()); } @@ -137,7 +135,7 @@ str << QDateTime::fromMSecsSinceEpoch(msg.timestamp).toString(Qt::ISODate) << " - " << msg.message << endl; - if (m_backup && (m_logFile->size() >= m_maxSize)) { + if (m_backup && (m_logFile->size() >= (m_maxSize * 1024 * 1024))) { closeLogFile(); int counter = 0; QString backupLogFilename = m_path + ".bak"; @@ -167,7 +165,7 @@ || !m_logFile->setPermissions(QFile::ReadOwner | QFile::WriteOwner)) { delete m_logFile; m_logFile = nullptr; - Logger::instance()->addMessage(tr("An error occurred while trying to open the log file. Logging to file is disabled."), Log::CRITICAL); + Logger::instance()->addMessage(tr("An error occured while trying to open the log file. Logging to file is disabled."), Log::CRITICAL); } } diff -Nru qbittorrent-4.1.3/src/app/filelogger.h qbittorrent-3.3.15/src/app/filelogger.h --- qbittorrent-4.1.3/src/app/filelogger.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/app/filelogger.h 2017-08-03 20:30:10.000000000 +0000 @@ -76,3 +76,4 @@ }; #endif // FILELOGGER_H + diff -Nru qbittorrent-4.1.3/src/app/main.cpp qbittorrent-3.3.15/src/app/main.cpp --- qbittorrent-4.1.3/src/app/main.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/app/main.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,7 +1,7 @@ /* * Bittorrent Client using Qt and libtorrent. * Copyright (C) 2014 Vladimir Golovnev - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -25,13 +25,12 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#include - #include #include -#include #ifndef DISABLE_GUI // GUI-only includes @@ -44,7 +43,11 @@ #ifdef QBT_STATIC_QT #include +#ifdef QBT_USES_QT5 Q_IMPORT_PLUGIN(QICOPlugin) +#else +Q_IMPORT_PLUGIN(qico) +#endif #endif // QBT_STATIC_QT #else @@ -55,53 +58,85 @@ #endif #endif // DISABLE_GUI -#include -#ifdef STACKTRACE #ifdef Q_OS_UNIX +#include +#include #include "stacktrace.h" -#else -#include "stacktrace_win.h" -#include "stacktracedialog.h" #endif // Q_OS_UNIX -#endif //STACKTRACE -#include "base/preferences.h" -#include "base/profile.h" -#include "base/utils/misc.h" +#ifdef STACKTRACE_WIN +#include +#include "stacktrace_win.h" +#include "stacktrace_win_dlg.h" +#endif //STACKTRACE_WIN + +#include +#include #include "application.h" -#include "cmdoptions.h" +#include "base/utils/misc.h" +#include "base/preferences.h" + #include "upgrade.h" // Signal handlers +#if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN) void sigNormalHandler(int signum); -#ifdef STACKTRACE void sigAbnormalHandler(int signum); -#endif // sys_signame[] is only defined in BSD const char *sysSigName[] = { -#if defined(Q_OS_WIN) - "", "", "SIGINT", "", "SIGILL", "", "SIGABRT_COMPAT", "", "SIGFPE", "", - "", "SIGSEGV", "", "", "", "SIGTERM", "", "", "", "", - "", "SIGBREAK", "SIGABRT", "", "", "", "", "", "", "", - "", "" -#else "", "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP", "SIGABRT", "SIGBUS", "SIGFPE", "SIGKILL", "SIGUSR1", "SIGSEGV", "SIGUSR2", "SIGPIPE", "SIGALRM", "SIGTERM", "SIGSTKFLT", "SIGCHLD", "SIGCONT", "SIGSTOP", "SIGTSTP", "SIGTTIN", "SIGTTOU", "SIGURG", "SIGXCPU", "SIGXFSZ", "SIGVTALRM", "SIGPROF", "SIGWINCH", "SIGIO", "SIGPWR", "SIGUNUSED" +}; #endif + +struct QBtCommandLineParameters +{ + bool showHelp; +#ifndef Q_OS_WIN + bool showVersion; +#endif +#ifndef DISABLE_GUI + bool noSplash; +#else + bool shouldDaemonize; +#endif + int webUiPort; + QStringList torrents; + QString unknownParameter; + + QBtCommandLineParameters() + : showHelp(false) +#ifndef Q_OS_WIN + , showVersion(false) +#endif +#ifndef DISABLE_GUI + , noSplash(Preferences::instance()->isSplashScreenDisabled()) +#else + , shouldDaemonize(false) +#endif + , webUiPort(Preferences::instance()->getWebUiPort()) + { + } }; #if !defined Q_OS_WIN && !defined Q_OS_HAIKU -void reportToUser(const char *str); +void reportToUser(const char* str); #endif void displayVersion(); +void displayUsage(const QString &prg_name); bool userAgreesWithLegalNotice(); void displayBadArgMessage(const QString &message); +QBtCommandLineParameters parseCommandLine(); #if !defined(DISABLE_GUI) void showSplashScreen(); + +#if defined(Q_OS_UNIX) +void setupDpi(); +#endif // Q_OS_UNIX #endif // DISABLE_GUI // Main @@ -116,150 +151,214 @@ macMigratePlists(); #endif - try { - // Create Application - QString appId = QLatin1String("qBittorrent-") + Utils::Misc::getUserIDString(); - QScopedPointer app(new Application(appId, argc, argv)); +#if !defined(DISABLE_GUI) && defined(Q_OS_UNIX) + setupDpi(); +#endif + #ifndef DISABLE_GUI - // after the application object creation because we need a profile to be set already - // for the migration - migrateRSS(); + migrateRSS(); #endif - const QBtCommandLineParameters params = app->commandLineArgs(); + // Create Application + QString appId = QLatin1String("qBittorrent-") + Utils::Misc::getUserIDString(); + QScopedPointer app(new Application(appId, argc, argv)); + + const QBtCommandLineParameters params = parseCommandLine(); + + if (!params.unknownParameter.isEmpty()) { + displayBadArgMessage(QObject::tr("%1 is an unknown command line parameter.", "--random-parameter is an unknown command line parameter.") + .arg(params.unknownParameter)); + return EXIT_FAILURE; + } - if (!params.unknownParameter.isEmpty()) { - throw CommandLineParameterError(QObject::tr("%1 is an unknown command line parameter.", - "--random-parameter is an unknown command line parameter.") - .arg(params.unknownParameter)); - } #ifndef Q_OS_WIN - if (params.showVersion) { - if (isOneArg) { - displayVersion(); - return EXIT_SUCCESS; - } - throw CommandLineParameterError(QObject::tr("%1 must be the single command line parameter.") - .arg(QLatin1String("-v (or --version)"))); + if (params.showVersion) { + if (isOneArg) { + displayVersion(); + return EXIT_SUCCESS; + } + else { + displayBadArgMessage(QObject::tr("%1 must be the single command line parameter.") + .arg(QLatin1String("-v (or --version)"))); + return EXIT_FAILURE; } + } #endif - if (params.showHelp) { - if (isOneArg) { - displayUsage(argv[0]); - return EXIT_SUCCESS; - } - throw CommandLineParameterError(QObject::tr("%1 must be the single command line parameter.") + + if (params.showHelp) { + if (isOneArg) { + displayUsage(argv[0]); + return EXIT_SUCCESS; + } + else { + displayBadArgMessage(QObject::tr("%1 must be the single command line parameter.") .arg(QLatin1String("-h (or --help)"))); + return EXIT_FAILURE; } + } - // Set environment variable - if (!qputenv("QBITTORRENT", QBT_VERSION)) - fprintf(stderr, "Couldn't set environment variable...\n"); + if ((params.webUiPort > 0) && (params.webUiPort <= 65535)) { + Preferences::instance()->setWebUiPort(params.webUiPort); + } + else { + displayBadArgMessage(QObject::tr("%1 must specify the correct port (1 to 65535).") + .arg(QLatin1String("--webui-port"))); + return EXIT_FAILURE; + } + + // Set environment variable + if (!qputenv("QBITTORRENT", QBT_VERSION)) + std::cerr << "Couldn't set environment variable...\n"; #ifndef DISABLE_GUI - if (!userAgreesWithLegalNotice()) - return EXIT_SUCCESS; + if (!userAgreesWithLegalNotice()) + return EXIT_SUCCESS; #else - if (!params.shouldDaemonize - && isatty(fileno(stdin)) - && isatty(fileno(stdout)) - && !userAgreesWithLegalNotice()) - return EXIT_SUCCESS; + if (!params.shouldDaemonize + && isatty(fileno(stdin)) + && isatty(fileno(stdout)) + && !userAgreesWithLegalNotice()) + return EXIT_SUCCESS; #endif - // Check if qBittorrent is already running for this user - if (app->isRunning()) { + // Check if qBittorrent is already running for this user + if (app->isRunning()) { #ifdef DISABLE_GUI - if (params.shouldDaemonize) { - throw CommandLineParameterError(QObject::tr("You cannot use %1: qBittorrent is already running for this user.") - .arg(QLatin1String("-d (or --daemon)"))); - } - else + if (params.shouldDaemonize) { + displayBadArgMessage(QObject::tr("You cannot use %1: qBittorrent is already running for this user.") + .arg(QLatin1String("-d (or --daemon)"))); + return EXIT_FAILURE; + } + else #endif - qDebug("qBittorrent is already running for this user."); + qDebug("qBittorrent is already running for this user."); - QThread::msleep(300); - app->sendParams(params.paramList()); + Utils::Misc::msleep(300); + app->sendParams(params.torrents); - return EXIT_SUCCESS; - } + return EXIT_SUCCESS; + } -#if defined(Q_OS_WIN) - // This affects only Windows apparently and Qt5. - // When QNetworkAccessManager is instantiated it regularly starts polling - // the network interfaces to see what's available and their status. - // This polling creates jitter and high ping with wifi interfaces. - // So here we disable it for lack of better measure. - // It will also spew this message in the console: QObject::startTimer: Timers cannot have negative intervals - // For more info see: - // 1. https://github.com/qbittorrent/qBittorrent/issues/4209 - // 2. https://bugreports.qt.io/browse/QTBUG-40332 - // 3. https://bugreports.qt.io/browse/QTBUG-46015 - - qputenv("QT_BEARER_POLL_TIMEOUT", QByteArray::number(-1)); -#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)) - // this is the default in Qt6 - app->setAttribute(Qt::AA_DisableWindowContextHelpButton); -#endif +#if defined(Q_OS_WIN) && defined(QBT_USES_QT5) + // This affects only Windows apparently and Qt5. + // When QNetworkAccessManager is instantiated it regularly starts polling + // the network interfaces to see what's available and their status. + // This polling creates jitter and high ping with wifi interfaces. + // So here we disable it for lack of better measure. + // It will also spew this message in the console: QObject::startTimer: Timers cannot have negative intervals + // For more info see: + // 1. https://github.com/qbittorrent/qBittorrent/issues/4209 + // 2. https://bugreports.qt.io/browse/QTBUG-40332 + // 3. https://bugreports.qt.io/browse/QTBUG-46015 + + qputenv("QT_BEARER_POLL_TIMEOUT", QByteArray::number(-1)); #endif #if defined(Q_OS_MAC) - // Since Apple made difficult for users to set PATH, we set here for convenience. - // Users are supposed to install Homebrew Python for search function. - // For more info see issue #5571. - QByteArray path = "/usr/local/bin:"; - path += qgetenv("PATH"); - qputenv("PATH", path.constData()); - - // On OS X the standard is to not show icons in the menus - app->setAttribute(Qt::AA_DontShowIconsInMenus); +{ + // Since Apple made difficult for users to set PATH, we set here for convenience. + // Users are supposed to install Homebrew Python for search function. + // For more info see issue #5571. + QByteArray path = "/usr/local/bin:"; + path += qgetenv("PATH"); + qputenv("PATH", path.constData()); +} #endif #ifndef DISABLE_GUI - if (!upgrade()) return EXIT_FAILURE; + if (!upgrade()) return EXIT_FAILURE; #else - if (!upgrade(!params.shouldDaemonize - && isatty(fileno(stdin)) - && isatty(fileno(stdout)))) return EXIT_FAILURE; + if (!upgrade(!params.shouldDaemonize + && isatty(fileno(stdin)) + && isatty(fileno(stdout)))) return EXIT_FAILURE; #endif + #ifdef DISABLE_GUI - if (params.shouldDaemonize) { - app.reset(); // Destroy current application - if (daemon(1, 0) == 0) { - app.reset(new Application(appId, argc, argv)); - if (app->isRunning()) { - // Another instance had time to start. - return EXIT_FAILURE; - } - } - else { - qCritical("Something went wrong while daemonizing, exiting..."); + if (params.shouldDaemonize) { + app.reset(); // Destroy current application + if ((daemon(1, 0) == 0)) { + app.reset(new Application(appId, argc, argv)); + if (app->isRunning()) { + // Another instance had time to start. return EXIT_FAILURE; } } + else { + qCritical("Something went wrong while daemonizing, exiting..."); + return EXIT_FAILURE; + } + } #else - if (!(params.noSplash || Preferences::instance()->isSplashScreenDisabled())) - showSplashScreen(); + if (!params.noSplash) + showSplashScreen(); #endif - signal(SIGINT, sigNormalHandler); - signal(SIGTERM, sigNormalHandler); -#ifdef STACKTRACE - signal(SIGABRT, sigAbnormalHandler); - signal(SIGSEGV, sigAbnormalHandler); +#if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN) + signal(SIGINT, sigNormalHandler); + signal(SIGTERM, sigNormalHandler); + signal(SIGABRT, sigAbnormalHandler); + signal(SIGSEGV, sigAbnormalHandler); #endif - return app->exec(params.paramList()); - } - catch (CommandLineParameterError &er) { - displayBadArgMessage(er.messageForUser()); - return EXIT_FAILURE; + return app->exec(params.torrents); +} + +QBtCommandLineParameters parseCommandLine() +{ + QBtCommandLineParameters result; + QStringList appArguments = qApp->arguments(); + + for (int i = 1; i < appArguments.size(); ++i) { + const QString& arg = appArguments[i]; + + if ((arg.startsWith("--") && !arg.endsWith(".torrent")) || + (arg.startsWith("-") && arg.size() == 2)) { + //Parse known parameters + if ((arg == QLatin1String("-h")) || (arg == QLatin1String("--help"))) { + result.showHelp = true; + } +#ifndef Q_OS_WIN + else if ((arg == QLatin1String("-v")) || (arg == QLatin1String("--version"))) { + result.showVersion = true; + } +#endif + else if (arg.startsWith(QLatin1String("--webui-port="))) { + QStringList parts = arg.split(QLatin1Char('=')); + if (parts.size() == 2) + result.webUiPort = parts.last().toInt(); + } +#ifndef DISABLE_GUI + else if (arg == QLatin1String("--no-splash")) { + result.noSplash = true; + } +#else + else if ((arg == QLatin1String("-d")) || (arg == QLatin1String("--daemon"))) { + result.shouldDaemonize = true; + } +#endif + else { + //Unknown argument + result.unknownParameter = arg; + break; + } + } + else { + QFileInfo torrentPath; + torrentPath.setFile(arg); + + if (torrentPath.exists()) + result.torrents += torrentPath.absoluteFilePath(); + else + result.torrents += arg; + } } + + return result; } #if !defined Q_OS_WIN && !defined Q_OS_HAIKU -void reportToUser(const char *str) +void reportToUser(const char* str) { const size_t strLen = strlen(str); if (write(STDERR_FILENO, str, strLen) < static_cast(strLen)) { @@ -269,67 +368,120 @@ } #endif +#if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN) void sigNormalHandler(int signum) { #if !defined Q_OS_WIN && !defined Q_OS_HAIKU - const char msg1[] = "Catching signal: "; - const char msg2[] = "\nExiting cleanly\n"; - reportToUser(msg1); - reportToUser(sysSigName[signum]); - reportToUser(msg2); + const char str1[] = "Catching signal: "; + const char *sigName = sysSigName[signum]; + const char str2[] = "\nExiting cleanly\n"; + reportToUser(str1); + reportToUser(sigName); + reportToUser(str2); #endif // !defined Q_OS_WIN && !defined Q_OS_HAIKU signal(signum, SIG_DFL); qApp->exit(); // unsafe, but exit anyway } -#ifdef STACKTRACE void sigAbnormalHandler(int signum) { - const char *sigName = sysSigName[signum]; #if !defined Q_OS_WIN && !defined Q_OS_HAIKU - const char msg[] = "\n\n*************************************************************\n" - "Please file a bug report at http://bug.qbittorrent.org and provide the following information:\n\n" - "qBittorrent version: " QBT_VERSION "\n\n" - "Caught signal: "; - reportToUser(msg); + const char str1[] = "\n\n*************************************************************\nCatching signal: "; + const char *sigName = sysSigName[signum]; + const char str2[] = "\nPlease file a bug report at http://bug.qbittorrent.org and provide the following information:\n\n" + "qBittorrent version: " QBT_VERSION "\n"; + reportToUser(str1); reportToUser(sigName); - reportToUser("\n"); + reportToUser(str2); print_stacktrace(); // unsafe -#endif - -#if defined Q_OS_WIN - StacktraceDialog dlg; // unsafe - dlg.setStacktraceString(QLatin1String(sigName), straceWin::getBacktrace()); +#endif // !defined Q_OS_WIN && !defined Q_OS_HAIKU +#ifdef STACKTRACE_WIN + StraceDlg dlg; // unsafe + dlg.setStacktraceString(straceWin::getBacktrace()); dlg.exec(); -#endif - +#endif // STACKTRACE_WIN signal(signum, SIG_DFL); raise(signum); } -#endif // STACKTRACE +#endif // defined(Q_OS_UNIX) || defined(STACKTRACE_WIN) #if !defined(DISABLE_GUI) void showSplashScreen() { - QPixmap splashImg(":/icons/skin/splash.png"); - QPainter painter(&splashImg); + QPixmap splash_img(":/icons/skin/splash.png"); + QPainter painter(&splash_img); QString version = QBT_VERSION; painter.setPen(QPen(Qt::white)); painter.setFont(QFont("Arial", 22, QFont::Black)); painter.drawText(224 - painter.fontMetrics().width(version), 270, version); - QSplashScreen *splash = new QSplashScreen(splashImg); + QSplashScreen *splash = new QSplashScreen(splash_img); splash->show(); - QTimer::singleShot(1500, splash, &QObject::deleteLater); + QTimer::singleShot(1500, splash, SLOT(deleteLater())); qApp->processEvents(); } + +#if defined(Q_OS_UNIX) +void setupDpi() +{ + if (qgetenv("QT_AUTO_SCREEN_SCALE_FACTOR").isEmpty()) + qputenv("QT_AUTO_SCREEN_SCALE_FACTOR", "1"); +} +#endif // Q_OS_UNIX #endif // DISABLE_GUI void displayVersion() { - printf("%s %s\n", qUtf8Printable(qApp->applicationName()), QBT_VERSION); + std::cout << qPrintable(qApp->applicationName()) << " " << QBT_VERSION << std::endl; +} + +QString makeUsage(const QString &prg_name) +{ + QString text; + + text += QObject::tr("Usage:") + QLatin1Char('\n'); +#ifndef Q_OS_WIN + text += QLatin1Char('\t') + prg_name + QLatin1String(" (-v | --version)") + QLatin1Char('\n'); +#endif + text += QLatin1Char('\t') + prg_name + QLatin1String(" (-h | --help)") + QLatin1Char('\n'); + text += QLatin1Char('\t') + prg_name + + QLatin1String(" [--webui-port=]") +#ifndef DISABLE_GUI + + QLatin1String(" [--no-splash]") +#else + + QLatin1String(" [-d | --daemon]") +#endif + + QLatin1String("[( | )...]") + QLatin1Char('\n'); + text += QObject::tr("Options:") + QLatin1Char('\n'); +#ifndef Q_OS_WIN + text += QLatin1String("\t-v | --version\t\t") + QObject::tr("Displays program version") + QLatin1Char('\n'); +#endif + text += QLatin1String("\t-h | --help\t\t") + QObject::tr("Displays this help message") + QLatin1Char('\n'); + text += QLatin1String("\t--webui-port=\t") + + QObject::tr("Changes the Web UI port (current: %1)").arg(QString::number(Preferences::instance()->getWebUiPort())) + + QLatin1Char('\n'); +#ifndef DISABLE_GUI + text += QLatin1String("\t--no-splash\t\t") + QObject::tr("Disable splash screen") + QLatin1Char('\n'); +#else + text += QLatin1String("\t-d | --daemon\t\t") + QObject::tr("Run in daemon-mode (background)") + QLatin1Char('\n'); +#endif + text += QLatin1String("\tfiles or urls\t\t") + QObject::tr("Downloads the torrents passed by the user"); + + return text; +} + +void displayUsage(const QString& prg_name) +{ +#ifndef Q_OS_WIN + std::cout << qPrintable(makeUsage(prg_name)) << std::endl; +#else + QMessageBox msgBox(QMessageBox::Information, QObject::tr("Help"), makeUsage(prg_name), QMessageBox::Ok); + msgBox.show(); // Need to be shown or to moveToCenter does not work + msgBox.move(Utils::Misc::screenCenter(&msgBox)); + msgBox.exec(); +#endif } -void displayBadArgMessage(const QString &message) +void displayBadArgMessage(const QString& message) { QString help = QObject::tr("Run application with -h option to read about command line parameters."); #ifdef Q_OS_WIN @@ -339,28 +491,24 @@ msgBox.move(Utils::Misc::screenCenter(&msgBox)); msgBox.exec(); #else - const QString errMsg = QObject::tr("Bad command line: ") + '\n' - + message + '\n' - + help + '\n'; - fprintf(stderr, "%s", qUtf8Printable(errMsg)); + std::cerr << qPrintable(QObject::tr("Bad command line: ")); + std::cerr << qPrintable(message) << std::endl; + std::cerr << qPrintable(help) << std::endl; #endif } bool userAgreesWithLegalNotice() { - Preferences *const pref = Preferences::instance(); + Preferences* const pref = Preferences::instance(); if (pref->getAcceptedLegal()) // Already accepted once return true; #ifdef DISABLE_GUI - const QString eula = QString("\n*** %1 ***\n").arg(QObject::tr("Legal Notice")) - + QObject::tr("qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility.") + "\n\n" - + QObject::tr("No further notices will be issued.") + "\n\n" - + QObject::tr("Press %1 key to accept and continue...").arg("'y'") + '\n'; - printf("%s", qUtf8Printable(eula)); - + std::cout << std::endl << "*** " << qPrintable(QObject::tr("Legal Notice")) << " ***" << std::endl; + std::cout << qPrintable(QObject::tr("qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility.\n\nNo further notices will be issued.")) << std::endl << std::endl; + std::cout << qPrintable(QObject::tr("Press %1 key to accept and continue...").arg("'y'")) << std::endl; char ret = getchar(); // Read pressed key - if ((ret == 'y') || (ret == 'Y')) { + if (ret == 'y' || ret == 'Y') { // Save the answer pref->setAcceptedLegal(true); return true; @@ -370,16 +518,16 @@ msgBox.setText(QObject::tr("qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility.\n\nNo further notices will be issued.")); msgBox.setWindowTitle(QObject::tr("Legal notice")); msgBox.addButton(QObject::tr("Cancel"), QMessageBox::RejectRole); - QAbstractButton *agreeButton = msgBox.addButton(QObject::tr("I Agree"), QMessageBox::AcceptRole); + QAbstractButton *agree_button = msgBox.addButton(QObject::tr("I Agree"), QMessageBox::AcceptRole); msgBox.show(); // Need to be shown or to moveToCenter does not work msgBox.move(Utils::Misc::screenCenter(&msgBox)); msgBox.exec(); - if (msgBox.clickedButton() == agreeButton) { + if (msgBox.clickedButton() == agree_button) { // Save the answer pref->setAcceptedLegal(true); return true; } -#endif // DISABLE_GUI +#endif return false; } diff -Nru qbittorrent-4.1.3/src/app/qtsingleapplication/CMakeLists.txt qbittorrent-3.3.15/src/app/qtsingleapplication/CMakeLists.txt --- qbittorrent-4.1.3/src/app/qtsingleapplication/CMakeLists.txt 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/app/qtsingleapplication/CMakeLists.txt 2017-08-03 20:30:10.000000000 +0000 @@ -8,24 +8,29 @@ qtlocalpeer.cpp ) -if (Qt5Widgets_FOUND) +if (GUI) list(APPEND QBT_QTSINGLEAPPLICATION_HEADERS qtsingleapplication.h) list(APPEND QBT_QTSINGLEAPPLICATION_SOURCES qtsingleapplication.cpp) -else (Qt5Widgets_FOUND) +else (GUI) list(APPEND QBT_QTSINGLEAPPLICATION_HEADERS qtsinglecoreapplication.h) list(APPEND QBT_QTSINGLEAPPLICATION_SOURCES qtsinglecoreapplication.cpp) -endif (Qt5Widgets_FOUND) +endif (GUI) -add_library(qtsingleapplication STATIC ${QBT_QTSINGLEAPPLICATION_HEADERS} ${QBT_QTSINGLEAPPLICATION_SOURCES}) +add_library(qtsingleapplication ${QBT_QTSINGLEAPPLICATION_HEADERS} ${QBT_QTSINGLEAPPLICATION_SOURCES}) target_include_directories(qtsingleapplication INTERFACE "${qtsingleapplication_SOURCE_DIR}") -target_link_libraries(qtsingleapplication PRIVATE Qt5::Network) -if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") - target_compile_options(qtsingleapplication PRIVATE "-w") # disable warning for 3rdparty code -endif() +if (QT4_FOUND) + target_link_libraries(qtsingleapplication Qt4::QtNetwork) +else (QT4_FOUND) + target_link_libraries(qtsingleapplication Qt5::Network) +endif (QT4_FOUND) -if (Qt5Widgets_FOUND) - target_link_libraries(qtsingleapplication PRIVATE Qt5::Widgets) -endif (Qt5Widgets_FOUND) +if (GUI) + if (QT4_FOUND) + target_link_libraries(qtsingleapplication Qt4::QtGui) + else (QT4_FOUND) + target_link_libraries(qtsingleapplication Qt5::Widgets) + endif(QT4_FOUND) +endif (GUI) add_library(QtSingleApplication::QtSingleApplication ALIAS qtsingleapplication) diff -Nru qbittorrent-4.1.3/src/app/qtsingleapplication/qtlocalpeer.cpp qbittorrent-3.3.15/src/app/qtsingleapplication/qtlocalpeer.cpp --- qbittorrent-4.1.3/src/app/qtsingleapplication/qtlocalpeer.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/app/qtsingleapplication/qtlocalpeer.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -176,17 +176,8 @@ if (!socket) return; - while (true) { - if (socket->state() == QLocalSocket::UnconnectedState) { - qWarning("QtLocalPeer: Peer disconnected"); - delete socket; - return; - } - if (socket->bytesAvailable() >= qint64(sizeof(quint32))) - break; + while (socket->bytesAvailable() < (int)sizeof(quint32)) socket->waitForReadyRead(); - } - QDataStream ds(socket); QByteArray uMsg; quint32 remaining; diff -Nru qbittorrent-4.1.3/src/app/stacktracedialog.h qbittorrent-3.3.15/src/app/stacktracedialog.h --- qbittorrent-4.1.3/src/app/stacktracedialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/app/stacktracedialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,87 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015 The qBittorrent project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - * - */ - -#ifndef STACKTRACEDIALOG_H -#define STACKTRACEDIALOG_H - -#include -#include - -#include "base/utils/misc.h" -#include "ui_stacktracedialog.h" - -class StacktraceDialog : public QDialog, private Ui::StacktraceDialog -{ - Q_OBJECT - -public: - StacktraceDialog(QWidget *parent = nullptr) - : QDialog(parent) - { - setupUi(this); - } - - void setStacktraceString(const QString &sigName, const QString &trace) - { - // try to call Qt function as less as possible - QString htmlStr = QString( - "

" - "qBittorrent has crashed" - "

" - "

" - "Please file a bug report at " - "http://bugs.qbittorrent.org " - "and provide the following information:" - "

" - "


" - "

" -#if defined(__x86_64__) || defined(_M_X64) - "qBittorrent version: " QBT_VERSION " (64-bit)
" -#else - "qBittorrent version: " QBT_VERSION " (32-bit)
" -#endif - "Libtorrent version: %1
" - "Qt version: " QT_VERSION_STR "
" - "Boost version: %2
" - "OS version: %3

" - "Caught signal: %4" - "

" - "
%5
" - "



") - .arg(Utils::Misc::libtorrentVersionString()) - .arg(Utils::Misc::boostVersionString()) - .arg(Utils::Misc::osName()) - .arg(sigName) - .arg(trace); - - errorText->setHtml(htmlStr); - } -}; - -#endif // STACKTRACEDIALOG_H diff -Nru qbittorrent-4.1.3/src/app/stacktracedialog.ui qbittorrent-3.3.15/src/app/stacktracedialog.ui --- qbittorrent-4.1.3/src/app/stacktracedialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/app/stacktracedialog.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ - - - StacktraceDialog - - - - 0 - 0 - 640 - 480 - - - - Crash info - - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> - - - true - - - - - - - - diff -Nru qbittorrent-4.1.3/src/app/stacktrace.h qbittorrent-3.3.15/src/app/stacktrace.h --- qbittorrent-4.1.3/src/app/stacktrace.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/app/stacktrace.h 2017-08-03 20:30:10.000000000 +0000 @@ -14,7 +14,7 @@ /** Print a demangled stack backtrace of the caller function to FILE* out. */ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames = 63) { - fprintf(out, "Stack trace:\n"); + fprintf(out, "stack trace:\n"); // storage array for stack trace address data std::vector addrlist(max_frames + 1); @@ -33,7 +33,7 @@ // allocate string which will be filled with the demangled function name size_t funcnamesize = 256; - char *funcname = static_cast(malloc(funcnamesize)); + char *funcname = (char *)malloc(funcnamesize); int functionNamesFound = 0; // iterate over the returned symbol lines. skip the first, it is the diff -Nru qbittorrent-4.1.3/src/app/stacktrace_win_dlg.h qbittorrent-3.3.15/src/app/stacktrace_win_dlg.h --- qbittorrent-4.1.3/src/app/stacktrace_win_dlg.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/app/stacktrace_win_dlg.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,84 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2015 The qBittorrent project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + */ + +#ifndef STACKTRACE_WIN_DLG_H +#define STACKTRACE_WIN_DLG_H + +#include +#include +#include "base/utils/misc.h" +#include "ui_stacktrace_win_dlg.h" + +class StraceDlg : public QDialog, private Ui::errorDialog +{ + Q_OBJECT + +public: + StraceDlg(QWidget* parent = 0) + : QDialog(parent) + { + setupUi(this); + } + + void setStacktraceString(const QString& trace) + { + // try to call Qt function as less as possible + QString htmlStr = QString( + "

" + "qBittorrent has crashed" + "

" + "

" + "Please file a bug report at " + "http://bugs.qbittorrent.org " + "and provide the following information:" + "

" + "


" + "

" +#if defined(__x86_64__) || defined(_M_X64) + "qBittorrent version: " QBT_VERSION " (64-bit)
" +#else + "qBittorrent version: " QBT_VERSION " (32-bit)
" +#endif + "Libtorrent version: %1
" + "Qt version: " QT_VERSION_STR "
" + "Boost version: %2
" + "OS version: %3" + "


" + "
%4
" + "



") + .arg(Utils::Misc::libtorrentVersionString()) + .arg(Utils::Misc::boostVersionString()) + .arg(Utils::Misc::osName()) + .arg(trace); + + errorText->setHtml(htmlStr); + } +}; + +#endif diff -Nru qbittorrent-4.1.3/src/app/stacktrace_win_dlg.ui qbittorrent-3.3.15/src/app/stacktrace_win_dlg.ui --- qbittorrent-4.1.3/src/app/stacktrace_win_dlg.ui 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/app/stacktrace_win_dlg.ui 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,35 @@ + + + errorDialog + + + + 0 + 0 + 640 + 480 + + + + Crash info + + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> + + + true + + + + + + + + diff -Nru qbittorrent-4.1.3/src/app/stacktrace_win.h qbittorrent-3.3.15/src/app/stacktrace_win.h --- qbittorrent-4.1.3/src/app/stacktrace_win.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/app/stacktrace_win.h 2017-08-03 20:30:10.000000000 +0000 @@ -138,7 +138,7 @@ QString straceWin::getSourcePathAndLineNumber(HANDLE hProcess, DWORD64 addr) { - IMAGEHLP_LINE64 line {}; + IMAGEHLP_LINE64 line = {0}; line.SizeOfStruct = sizeof(IMAGEHLP_LINE64); DWORD dwDisplacement = 0; @@ -291,7 +291,7 @@ demangle(funcName); #endif - // now ihsf.InstructionOffset points to the instruction that follows CALL instruction + // now ihsf.InstructionOffset points to the instruction that follows CALL instuction // decrease the query address by one byte to point somewhere in the CALL instruction byte sequence sourceFile = getSourcePathAndLineNumber(hProcess, ihsf.InstructionOffset - 1); } diff -Nru qbittorrent-4.1.3/src/app/upgrade.h qbittorrent-3.3.15/src/app/upgrade.h --- qbittorrent-4.1.3/src/app/upgrade.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/app/upgrade.h 2017-08-03 20:30:10.000000000 +0000 @@ -29,43 +29,39 @@ #ifndef UPGRADE_H #define UPGRADE_H -#include -#include #include - #if LIBTORRENT_VERSION_NUM >= 10100 #include -#else +#endif +#include +#include +#if LIBTORRENT_VERSION_NUM < 10100 #include #endif + #include #include -#include -#include - #ifndef DISABLE_GUI #include #endif -#ifdef Q_OS_MAC -#include -#endif +#include +#include #include "base/logger.h" -#include "base/preferences.h" -#include "base/profile.h" #include "base/utils/fs.h" #include "base/utils/misc.h" #include "base/utils/string.h" +#include "base/preferences.h" +#include "base/qinisettings.h" bool userAcceptsUpgrade() { #ifdef DISABLE_GUI - printf("\n*** %s ***\n", qUtf8Printable(QObject::tr("Upgrade"))); + std::cout << std::endl << "*** " << qPrintable(QObject::tr("Upgrade")) << " ***" << std::endl; char ret = '\0'; do { - printf("%s\n" - , qUtf8Printable(QObject::tr("You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n]"))); + std::cout << qPrintable(QObject::tr("You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n]")) << std::endl; ret = getchar(); // Read pressed key } while ((ret != 'y') && (ret != 'Y') && (ret != 'n') && (ret != 'N')); @@ -114,47 +110,22 @@ bool v3_3 = false; int queuePosition = 0; QString outFilePath = filepath; - static const QRegularExpression rx(QLatin1String("([A-Fa-f0-9]{40})\\.fastresume\\.(.+)$")); - const QRegularExpressionMatch rxMatch = rx.match(filepath); - if (rxMatch.hasMatch()) { - // Old v3.3.x format had a number at the end indicating the queue position. - // The naming scheme was '.fastresume.'. - // However, QSaveFile, which uses QTemporaryFile internally, might leave - // non-commited files behind eg after a crash. These files have the - // naming scheme '.fastresume.XXXXXX' where each X is a random - // character. So we detect if the last part is present. Then check if it - // is 6 chars long. If all the 6 chars are digits we assume it is an old - // v3.3.x format. Otherwise it is considered a non-commited fastresume - // and is deleted, because it may be a corrupted/incomplete fastresume. - // NOTE: When the upgrade code is removed, we must continue to perform - // cleanup of non-commited QSaveFile/QTemporaryFile fastresumes - queuePosition = rxMatch.captured(2).toInt(); - if ((rxMatch.captured(2).size() == 6) && (queuePosition <= 99999)) { - Utils::Fs::forceRemove(filepath); - return true; - } - + QRegExp rx(QLatin1String("([A-Fa-f0-9]{40})\\.fastresume\\.(\\d+)$")); + if (rx.indexIn(filepath) != -1) { + // old v3.3.x format + queuePosition = rx.cap(2).toInt(); v3_3 = true; - outFilePath.replace(QRegularExpression("\\.fastresume\\..+$"), ".fastresume"); + outFilePath.replace(QRegExp("\\.\\d+$"), ""); } else { queuePosition = fastOld.dict_find_int_value("qBt-queuePosition", 0); - fastNew["qBt-name"] = oldTorrent.value("name").toString().toStdString(); + fastNew["qBt-name"] = Utils::String::toStdString(oldTorrent.value("name").toString()); fastNew["qBt-tempPathDisabled"] = false; } // in versions < 3.3 we have -1 for seeding torrents, so we convert it to 0 fastNew["qBt-queuePosition"] = (queuePosition >= 0 ? queuePosition : 0); - if (v3_3) { - QFileInfo oldFile(filepath); - QFileInfo newFile(outFilePath); - if (newFile.exists() - && (oldFile.lastModified() < newFile.lastModified())) { - Utils::Fs::forceRemove(filepath); - return true; - } - } QFile file2(outFilePath); QVector out; libtorrent::bencode(std::back_inserter(out), fastNew); @@ -174,7 +145,7 @@ // Upgrade preferences Preferences::instance()->upgrade(); - QString backupFolderPath = Utils::Fs::expandPathAbs(specialFolderLocation(SpecialFolder::Data) + "BT_backup"); + QString backupFolderPath = Utils::Fs::expandPathAbs(Utils::Fs::QDesktopServicesDataLocation() + "BT_backup"); QDir backupFolderDir(backupFolderPath); // **************************************************************************************** @@ -185,10 +156,15 @@ upgradeResumeFile(backupFolderDir.absoluteFilePath(backupFile)); // **************************************************************************************** - SettingsPtr oldResumeSettings = Profile::instance().applicationSettings(QLatin1String("qBittorrent-resume")); +#ifdef Q_OS_MAC + // native .plist + QSettings *oldResumeSettings = new QSettings("qBittorrent", "qBittorrent-resume"); +#else + QIniSettings *oldResumeSettings = new QIniSettings("qBittorrent", "qBittorrent-resume"); +#endif QString oldResumeFilename = oldResumeSettings->fileName(); QVariantHash oldResumeData = oldResumeSettings->value("torrents").toHash(); - oldResumeSettings.reset(); + delete oldResumeSettings; if (oldResumeData.isEmpty()) { Utils::Fs::forceRemove(oldResumeFilename); @@ -199,34 +175,31 @@ QStringList backupFiles = backupFolderDir.entryList( QStringList(QLatin1String("*.fastresume")), QDir::Files, QDir::Unsorted); - const QRegularExpression rx(QLatin1String("^([A-Fa-f0-9]{40})\\.fastresume$")); + QRegExp rx(QLatin1String("^([A-Fa-f0-9]{40})\\.fastresume$")); foreach (QString backupFile, backupFiles) { - const QRegularExpressionMatch rxMatch = rx.match(backupFile); - if (rxMatch.hasMatch()) { - const QString hashStr = rxMatch.captured(1); - if (upgradeResumeFile(backupFolderDir.absoluteFilePath(backupFile), oldResumeData[hashStr].toHash())) - oldResumeData.remove(hashStr); + if (rx.indexIn(backupFile) != -1) { + if (upgradeResumeFile(backupFolderDir.absoluteFilePath(backupFile), oldResumeData[rx.cap(1)].toHash())) + oldResumeData.remove(rx.cap(1)); else - Logger::instance()->addMessage(QObject::tr("Couldn't migrate torrent with hash: %1").arg(hashStr), Log::WARNING); + Logger::instance()->addMessage(QObject::tr("Couldn't migrate torrent with hash: %1").arg(rx.cap(1)), Log::WARNING); } else { Logger::instance()->addMessage(QObject::tr("Couldn't migrate torrent. Invalid fastresume file name: %1").arg(backupFile), Log::WARNING); } } - for (auto i = oldResumeData.cbegin(); i != oldResumeData.cend(); ++i) { - const QVariantHash oldTorrent = i.value().toHash(); + foreach (const QString &hash, oldResumeData.keys()) { + QVariantHash oldTorrent = oldResumeData[hash].toHash(); if (oldTorrent.value("is_magnet", false).toBool()) { - const QString &hash = i.key(); libtorrent::entry resumeData; - resumeData["qBt-magnetUri"] = oldTorrent.value("magnet_uri").toString().toStdString(); + resumeData["qBt-magnetUri"] = Utils::String::toStdString(oldTorrent.value("magnet_uri").toString()); resumeData["qBt-paused"] = false; resumeData["qBt-forced"] = false; - resumeData["qBt-savePath"] = oldTorrent.value("save_path").toString().toStdString(); - resumeData["qBt-ratioLimit"] = static_cast(oldTorrent.value("max_ratio", -2).toReal() * 1000); - resumeData["qBt-label"] = oldTorrent.value("label").toString().toStdString(); - resumeData["qBt-name"] = oldTorrent.value("name").toString().toStdString(); + resumeData["qBt-savePath"] = Utils::String::toStdString(oldTorrent.value("save_path").toString()); + resumeData["qBt-ratioLimit"] = Utils::String::toStdString(QString::number(oldTorrent.value("max_ratio", -2).toReal())); + resumeData["qBt-label"] = Utils::String::toStdString(oldTorrent.value("label").toString()); + resumeData["qBt-name"] = Utils::String::toStdString(oldTorrent.value("name").toString()); resumeData["qBt-seedStatus"] = oldTorrent.value("seed").toBool(); resumeData["qBt-tempPathDisabled"] = false; @@ -258,7 +231,7 @@ #ifdef Q_OS_MAC void migratePlistToIni(const QString &application) { - QSettings iniFile(QSettings::IniFormat, QSettings::UserScope, "qBittorrent", application); + QIniSettings iniFile("qBittorrent", application); if (!iniFile.allKeys().isEmpty()) return; // We copy the contents of plist, only if inifile does not exist(is empty). QSettings *plistFile = new QSettings("qBittorrent", application); @@ -287,18 +260,18 @@ void migrateRSS() { // Copy old feed items to new file if needed - SettingsPtr qBTRSS = Profile::instance().applicationSettings(QLatin1String("qBittorrent-rss-feeds")); - if (!qBTRSS->allKeys().isEmpty()) return; // We move the contents of RSS old_items only if inifile does not exist (is empty). + QIniSettings qBTRSS("qBittorrent", "qBittorrent-rss-feeds"); + if (!qBTRSS.allKeys().isEmpty()) return; // We move the contents of RSS old_items only if inifile does not exist (is empty). - SettingsPtr qBTRSSLegacy = Profile::instance().applicationSettings(QLatin1String("qBittorrent-rss")); - QHash allOldItems = qBTRSSLegacy->value("old_items", QHash()).toHash(); + QIniSettings qBTRSSLegacy("qBittorrent", "qBittorrent-rss"); + QHash allOldItems = qBTRSSLegacy.value("old_items", QHash()).toHash(); if (!allOldItems.empty()) { qDebug("Moving %d old items for feeds to qBittorrent-rss-feeds", allOldItems.size()); - qBTRSS->setValue("old_items", allOldItems); - qBTRSSLegacy->remove("old_items"); + qBTRSS.setValue("old_items", allOldItems); + qBTRSSLegacy.remove("old_items"); } } -#endif // DISABLE_GUI +#endif #endif // UPGRADE_H diff -Nru qbittorrent-4.1.3/src/base/algorithm.h qbittorrent-3.3.15/src/base/algorithm.h --- qbittorrent-4.1.3/src/base/algorithm.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/algorithm.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2018 Vladimir Golovnev - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#pragma once - -namespace Dict -{ - // To be used with QMap, QHash and it's variants - template - void removeIf(Dictionary &&dict, BinaryPredicate p) - { - auto it = dict.begin(); - while (it != dict.end()) - it = (p(it.key(), it.value()) ? dict.erase(it) : it + 1); - } -} diff -Nru qbittorrent-4.1.3/src/base/asyncfilestorage.cpp qbittorrent-3.3.15/src/base/asyncfilestorage.cpp --- qbittorrent-4.1.3/src/base/asyncfilestorage.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/asyncfilestorage.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,88 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "asyncfilestorage.h" - -#include -#include -#include - -AsyncFileStorage::AsyncFileStorage(const QString &storageFolderPath, QObject *parent) - : QObject(parent) - , m_storageDir(storageFolderPath) - , m_lockFile(m_storageDir.absoluteFilePath(QStringLiteral("storage.lock"))) -{ - if (!m_storageDir.mkpath(m_storageDir.absolutePath())) - throw AsyncFileStorageError( - QString("Could not create directory '%1'.").arg(m_storageDir.absolutePath())); - - // TODO: This folder locking approach does not work for UNIX systems. Implement it. - if (!m_lockFile.open(QFile::WriteOnly)) - throw AsyncFileStorageError(m_lockFile.errorString()); -} - -AsyncFileStorage::~AsyncFileStorage() -{ - m_lockFile.close(); - m_lockFile.remove(); -} - -void AsyncFileStorage::store(const QString &fileName, const QByteArray &data) -{ - QMetaObject::invokeMethod(this, "store_impl", Qt::QueuedConnection - , Q_ARG(QString, fileName), Q_ARG(QByteArray, data)); -} - -QDir AsyncFileStorage::storageDir() const -{ - return m_storageDir; -} - -void AsyncFileStorage::store_impl(const QString &fileName, const QByteArray &data) -{ - const QString filePath = m_storageDir.absoluteFilePath(fileName); - QSaveFile file(filePath); - qDebug() << "AsyncFileStorage: Saving data to" << filePath; - if (file.open(QIODevice::WriteOnly)) { - file.write(data); - if (!file.commit()) { - qDebug() << "AsyncFileStorage: Failed to save data"; - emit failed(filePath, file.errorString()); - } - } -} - -AsyncFileStorageError::AsyncFileStorageError(const QString &message) - : std::runtime_error(message.toUtf8().data()) -{ -} - -QString AsyncFileStorageError::message() const -{ - return what(); -} diff -Nru qbittorrent-4.1.3/src/base/asyncfilestorage.h qbittorrent-3.3.15/src/base/asyncfilestorage.h --- qbittorrent-4.1.3/src/base/asyncfilestorage.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/asyncfilestorage.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,64 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#pragma once - -#include - -#include -#include -#include - -class AsyncFileStorageError : public std::runtime_error -{ -public: - explicit AsyncFileStorageError(const QString &message); - QString message() const; -}; - -class AsyncFileStorage : public QObject -{ - Q_OBJECT - -public: - explicit AsyncFileStorage(const QString &storageFolderPath, QObject *parent = nullptr); - ~AsyncFileStorage() override; - - void store(const QString &fileName, const QByteArray &data); - - QDir storageDir() const; - -signals: - void failed(const QString &fileName, const QString &errorString); - -private: - Q_INVOKABLE void store_impl(const QString &fileName, const QByteArray &data); - - QDir m_storageDir; - QFile m_lockFile; -}; diff -Nru qbittorrent-4.1.3/src/base/base.pri qbittorrent-3.3.15/src/base/base.pri --- qbittorrent-4.1.3/src/base/base.pri 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/base.pri 2017-08-03 20:30:10.000000000 +0000 @@ -1,137 +1,116 @@ HEADERS += \ - $$PWD/algorithm.h \ - $$PWD/asyncfilestorage.h \ - $$PWD/bittorrent/addtorrentparams.h \ - $$PWD/bittorrent/cachestatus.h \ - $$PWD/bittorrent/infohash.h \ - $$PWD/bittorrent/magneturi.h \ - $$PWD/bittorrent/peerinfo.h \ - $$PWD/bittorrent/private/bandwidthscheduler.h \ - $$PWD/bittorrent/private/filterparserthread.h \ - $$PWD/bittorrent/private/resumedatasavingmanager.h \ - $$PWD/bittorrent/private/speedmonitor.h \ - $$PWD/bittorrent/private/statistics.h \ - $$PWD/bittorrent/session.h \ - $$PWD/bittorrent/sessionstatus.h \ - $$PWD/bittorrent/torrentcreatorthread.h \ - $$PWD/bittorrent/torrenthandle.h \ - $$PWD/bittorrent/torrentinfo.h \ - $$PWD/bittorrent/tracker.h \ - $$PWD/bittorrent/trackerentry.h \ - $$PWD/exceptions.h \ + $$PWD/types.h \ + $$PWD/tristatebool.h \ $$PWD/filesystemwatcher.h \ - $$PWD/global.h \ - $$PWD/http/connection.h \ - $$PWD/http/httperror.h \ + $$PWD/qinisettings.h \ + $$PWD/logger.h \ + $$PWD/settingsstorage.h \ + $$PWD/settingvalue.h \ + $$PWD/preferences.h \ + $$PWD/indexrange.h \ + $$PWD/iconprovider.h \ $$PWD/http/irequesthandler.h \ + $$PWD/http/connection.h \ $$PWD/http/requestparser.h \ - $$PWD/http/responsebuilder.h \ $$PWD/http/responsegenerator.h \ $$PWD/http/server.h \ $$PWD/http/types.h \ - $$PWD/iconprovider.h \ - $$PWD/indexrange.h \ - $$PWD/logger.h \ + $$PWD/http/responsebuilder.h \ $$PWD/net/dnsupdater.h \ - $$PWD/net/downloadhandler.h \ $$PWD/net/downloadmanager.h \ + $$PWD/net/downloadhandler.h \ $$PWD/net/geoipmanager.h \ $$PWD/net/portforwarder.h \ - $$PWD/net/private/geoipdatabase.h \ $$PWD/net/proxyconfigurationmanager.h \ $$PWD/net/reverseresolution.h \ $$PWD/net/smtp.h \ - $$PWD/preferences.h \ - $$PWD/private/profile_p.h \ - $$PWD/profile.h \ - $$PWD/rss/private/rss_parser.h \ - $$PWD/rss/rss_article.h \ - $$PWD/rss/rss_autodownloader.h \ - $$PWD/rss/rss_autodownloadrule.h \ - $$PWD/rss/rss_feed.h \ - $$PWD/rss/rss_folder.h \ - $$PWD/rss/rss_item.h \ - $$PWD/rss/rss_session.h \ - $$PWD/scanfoldersmodel.h \ - $$PWD/search/searchhandler.h \ - $$PWD/search/searchdownloadhandler.h \ - $$PWD/search/searchpluginmanager.h \ - $$PWD/settingsstorage.h \ - $$PWD/settingvalue.h \ - $$PWD/torrentfileguard.h \ - $$PWD/torrentfilter.h \ - $$PWD/tristatebool.h \ - $$PWD/types.h \ - $$PWD/unicodestrings.h \ - $$PWD/utils/bytearray.h \ - $$PWD/utils/foreignapps.h \ + $$PWD/net/private/geoipdatabase.h \ + $$PWD/bittorrent/infohash.h \ + $$PWD/bittorrent/session.h \ + $$PWD/bittorrent/sessionstatus.h \ + $$PWD/bittorrent/cachestatus.h \ + $$PWD/bittorrent/magneturi.h \ + $$PWD/bittorrent/torrentinfo.h \ + $$PWD/bittorrent/torrenthandle.h \ + $$PWD/bittorrent/peerinfo.h \ + $$PWD/bittorrent/trackerentry.h \ + $$PWD/bittorrent/tracker.h \ + $$PWD/bittorrent/torrentcreatorthread.h \ + $$PWD/bittorrent/private/speedmonitor.h \ + $$PWD/bittorrent/private/bandwidthscheduler.h \ + $$PWD/bittorrent/private/filterparserthread.h \ + $$PWD/bittorrent/private/statistics.h \ + $$PWD/bittorrent/private/resumedatasavingmanager.h \ + $$PWD/rss/rssmanager.h \ + $$PWD/rss/rssfeed.h \ + $$PWD/rss/rssfolder.h \ + $$PWD/rss/rssfile.h \ + $$PWD/rss/rssarticle.h \ + $$PWD/rss/rssdownloadrule.h \ + $$PWD/rss/rssdownloadrulelist.h \ + $$PWD/rss/private/rssparser.h \ $$PWD/utils/fs.h \ $$PWD/utils/gzip.h \ $$PWD/utils/misc.h \ - $$PWD/utils/net.h \ $$PWD/utils/random.h \ $$PWD/utils/string.h \ - $$PWD/utils/version.h + $$PWD/unicodestrings.h \ + $$PWD/torrentfileguard.h \ + $$PWD/torrentfilter.h \ + $$PWD/scanfoldersmodel.h \ + $$PWD/searchengine.h SOURCES += \ - $$PWD/asyncfilestorage.cpp \ - $$PWD/bittorrent/infohash.cpp \ - $$PWD/bittorrent/magneturi.cpp \ - $$PWD/bittorrent/peerinfo.cpp \ - $$PWD/bittorrent/private/bandwidthscheduler.cpp \ - $$PWD/bittorrent/private/filterparserthread.cpp \ - $$PWD/bittorrent/private/resumedatasavingmanager.cpp \ - $$PWD/bittorrent/private/speedmonitor.cpp \ - $$PWD/bittorrent/private/statistics.cpp \ - $$PWD/bittorrent/session.cpp \ - $$PWD/bittorrent/torrentcreatorthread.cpp \ - $$PWD/bittorrent/torrenthandle.cpp \ - $$PWD/bittorrent/torrentinfo.cpp \ - $$PWD/bittorrent/tracker.cpp \ - $$PWD/bittorrent/trackerentry.cpp \ - $$PWD/exceptions.cpp \ + $$PWD/tristatebool.cpp \ $$PWD/filesystemwatcher.cpp \ + $$PWD/logger.cpp \ + $$PWD/settingsstorage.cpp \ + $$PWD/preferences.cpp \ + $$PWD/iconprovider.cpp \ $$PWD/http/connection.cpp \ - $$PWD/http/httperror.cpp \ $$PWD/http/requestparser.cpp \ - $$PWD/http/responsebuilder.cpp \ $$PWD/http/responsegenerator.cpp \ $$PWD/http/server.cpp \ - $$PWD/iconprovider.cpp \ - $$PWD/logger.cpp \ + $$PWD/http/responsebuilder.cpp \ $$PWD/net/dnsupdater.cpp \ - $$PWD/net/downloadhandler.cpp \ $$PWD/net/downloadmanager.cpp \ + $$PWD/net/downloadhandler.cpp \ $$PWD/net/geoipmanager.cpp \ $$PWD/net/portforwarder.cpp \ - $$PWD/net/private/geoipdatabase.cpp \ $$PWD/net/proxyconfigurationmanager.cpp \ $$PWD/net/reverseresolution.cpp \ $$PWD/net/smtp.cpp \ - $$PWD/preferences.cpp \ - $$PWD/private/profile_p.cpp \ - $$PWD/profile.cpp \ - $$PWD/rss/private/rss_parser.cpp \ - $$PWD/rss/rss_article.cpp \ - $$PWD/rss/rss_autodownloader.cpp \ - $$PWD/rss/rss_autodownloadrule.cpp \ - $$PWD/rss/rss_feed.cpp \ - $$PWD/rss/rss_folder.cpp \ - $$PWD/rss/rss_item.cpp \ - $$PWD/rss/rss_session.cpp \ - $$PWD/scanfoldersmodel.cpp \ - $$PWD/search/searchdownloadhandler.cpp \ - $$PWD/search/searchhandler.cpp \ - $$PWD/search/searchpluginmanager.cpp \ - $$PWD/settingsstorage.cpp \ - $$PWD/torrentfileguard.cpp \ - $$PWD/torrentfilter.cpp \ - $$PWD/tristatebool.cpp \ - $$PWD/utils/bytearray.cpp \ - $$PWD/utils/foreignapps.cpp \ + $$PWD/net/private/geoipdatabase.cpp \ + $$PWD/bittorrent/infohash.cpp \ + $$PWD/bittorrent/session.cpp \ + $$PWD/bittorrent/sessionstatus.cpp \ + $$PWD/bittorrent/cachestatus.cpp \ + $$PWD/bittorrent/magneturi.cpp \ + $$PWD/bittorrent/torrentinfo.cpp \ + $$PWD/bittorrent/torrenthandle.cpp \ + $$PWD/bittorrent/peerinfo.cpp \ + $$PWD/bittorrent/trackerentry.cpp \ + $$PWD/bittorrent/tracker.cpp \ + $$PWD/bittorrent/torrentcreatorthread.cpp \ + $$PWD/bittorrent/private/speedmonitor.cpp \ + $$PWD/bittorrent/private/bandwidthscheduler.cpp \ + $$PWD/bittorrent/private/filterparserthread.cpp \ + $$PWD/bittorrent/private/statistics.cpp \ + $$PWD/bittorrent/private/resumedatasavingmanager.cpp \ + $$PWD/rss/rssmanager.cpp \ + $$PWD/rss/rssfeed.cpp \ + $$PWD/rss/rssfolder.cpp \ + $$PWD/rss/rssarticle.cpp \ + $$PWD/rss/rssdownloadrule.cpp \ + $$PWD/rss/rssdownloadrulelist.cpp \ + $$PWD/rss/rssfile.cpp \ + $$PWD/rss/private/rssparser.cpp \ $$PWD/utils/fs.cpp \ $$PWD/utils/gzip.cpp \ $$PWD/utils/misc.cpp \ - $$PWD/utils/net.cpp \ $$PWD/utils/random.cpp \ - $$PWD/utils/string.cpp + $$PWD/utils/string.cpp \ + $$PWD/torrentfileguard.cpp \ + $$PWD/torrentfilter.cpp \ + $$PWD/scanfoldersmodel.cpp \ + $$PWD/searchengine.cpp diff -Nru qbittorrent-4.1.3/src/base/bittorrent/addtorrentparams.h qbittorrent-3.3.15/src/base/bittorrent/addtorrentparams.h --- qbittorrent-4.1.3/src/base/bittorrent/addtorrentparams.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/addtorrentparams.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015 Vladimir Golovnev - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#pragma once - -#include -#include -#include - -#include "../tristatebool.h" - -namespace BitTorrent -{ - struct AddTorrentParams - { - QString name; - QString category; - QSet tags; - QString savePath; - bool disableTempPath = false; // e.g. for imported torrents - bool sequential = false; - bool firstLastPiecePriority = false; - TriStateBool addForced; - TriStateBool addPaused; - QVector filePriorities; // used if TorrentInfo is set - bool ignoreShareLimits = false; - bool skipChecking = false; - TriStateBool createSubfolder; - TriStateBool useAutoTMM; - int uploadLimit = -1; - int downloadLimit = -1; - }; -} diff -Nru qbittorrent-4.1.3/src/base/bittorrent/cachestatus.cpp qbittorrent-3.3.15/src/base/bittorrent/cachestatus.cpp --- qbittorrent-4.1.3/src/base/bittorrent/cachestatus.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/cachestatus.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,69 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2015 Vladimir Golovnev + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + */ + +#include +#include "cachestatus.h" + +using namespace BitTorrent; + +CacheStatus::CacheStatus(const libtorrent::cache_status &nativeStatus) + : m_nativeStatus(nativeStatus) +{ +} + +int CacheStatus::totalUsedBuffers() const +{ + return m_nativeStatus.total_used_buffers; +} + +qreal CacheStatus::readRatio() const +{ + if (m_nativeStatus.blocks_read > 0) + return (static_cast(m_nativeStatus.blocks_read_hit) / m_nativeStatus.blocks_read); + else + return -1; +} + +int CacheStatus::jobQueueLength() const +{ +#if LIBTORRENT_VERSION_NUM < 10100 + return m_nativeStatus.job_queue_length; +#else + return m_nativeStatus.queued_jobs; +#endif +} + +int CacheStatus::averageJobTime() const +{ + return m_nativeStatus.average_job_time; +} + +qlonglong CacheStatus::queuedBytes() const +{ + return m_nativeStatus.queued_bytes; +} diff -Nru qbittorrent-4.1.3/src/base/bittorrent/cachestatus.h qbittorrent-3.3.15/src/base/bittorrent/cachestatus.h --- qbittorrent-4.1.3/src/base/bittorrent/cachestatus.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/cachestatus.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015, 2017 Vladimir Golovnev + * Copyright (C) 2015 Vladimir Golovnev * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -30,16 +30,23 @@ #define BITTORRENT_CACHESTATUS_H #include +#include namespace BitTorrent { - struct CacheStatus + class CacheStatus { - quint64 totalUsedBuffers = 0; - quint64 jobQueueLength = 0; - quint64 averageJobTime = 0; - quint64 queuedBytes = 0; - qreal readRatio = 0.0; + public: + CacheStatus(const libtorrent::cache_status &nativeStatus); + + int totalUsedBuffers() const; + qreal readRatio() const; + int jobQueueLength() const; + int averageJobTime() const; + qlonglong queuedBytes() const; + + private: + libtorrent::cache_status m_nativeStatus; }; } diff -Nru qbittorrent-4.1.3/src/base/bittorrent/infohash.cpp qbittorrent-3.3.15/src/base/bittorrent/infohash.cpp --- qbittorrent-4.1.3/src/base/bittorrent/infohash.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/infohash.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -26,9 +26,8 @@ * exception statement from your version. */ -#include "infohash.h" - #include +#include "infohash.h" using namespace BitTorrent; @@ -42,7 +41,7 @@ , m_nativeHash(nativeHash) { char out[(libtorrent::sha1_hash::size * 2) + 1]; - libtorrent::to_hex(reinterpret_cast(&m_nativeHash[0]), libtorrent::sha1_hash::size, out); + libtorrent::to_hex((char const*)&m_nativeHash[0], libtorrent::sha1_hash::size, out); m_hashString = QString(out); } @@ -52,7 +51,7 @@ { QByteArray raw = m_hashString.toLatin1(); if (raw.size() == 40) - m_valid = libtorrent::from_hex(raw.constData(), 40, reinterpret_cast(&m_nativeHash[0])); + m_valid = libtorrent::from_hex(raw.constData(), 40, (char*)&m_nativeHash[0]); } @@ -92,7 +91,7 @@ return (m_nativeHash != other.m_nativeHash); } -uint BitTorrent::qHash(const InfoHash &key, uint seed) +uint qHash(const InfoHash &key, uint seed) { return qHash(static_cast(key), seed); } diff -Nru qbittorrent-4.1.3/src/base/bittorrent/infohash.h qbittorrent-3.3.15/src/base/bittorrent/infohash.h --- qbittorrent-4.1.3/src/base/bittorrent/infohash.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/infohash.h 2017-08-03 20:30:10.000000000 +0000 @@ -54,8 +54,8 @@ libtorrent::sha1_hash m_nativeHash; QString m_hashString; }; - - uint qHash(const InfoHash &key, uint seed); } +uint qHash(const BitTorrent::InfoHash &key, uint seed); + #endif // BITTORRENT_INFOHASH_H diff -Nru qbittorrent-4.1.3/src/base/bittorrent/magneturi.cpp qbittorrent-3.3.15/src/base/bittorrent/magneturi.cpp --- qbittorrent-4.1.3/src/base/bittorrent/magneturi.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/magneturi.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -26,17 +26,16 @@ * exception statement from your version. */ -#include "magneturi.h" +#include +#include +#include #include #include #include -#include -#include -#include - #include "base/utils/string.h" +#include "magneturi.h" namespace { @@ -46,7 +45,7 @@ rawBc = rawBc.mid(8); // skip bc://bt/ rawBc = QByteArray::fromBase64(rawBc); // Decode base64 // Format is now AA/url_encoded_filename/size_bytes/info_hash/ZZ - QStringList parts = QString(rawBc).split('/'); + QStringList parts = QString(rawBc).split("/"); if (parts.size() != 5) return QString(); QString filename = parts.at(1); @@ -70,8 +69,8 @@ qDebug("Creating magnet link from bc link"); m_url = bcLinkToMagnet(source); } - else if (((source.size() == 40) && !source.contains(QRegularExpression("[^0-9A-Fa-f]"))) - || ((source.size() == 32) && !source.contains(QRegularExpression("[^2-7A-Za-z]")))) { + else if (((source.size() == 40) && !source.contains(QRegExp("[^0-9A-Fa-f]"))) + || ((source.size() == 32) && !source.contains(QRegExp("[^2-7A-Za-z]")))) { m_url = "magnet:?xt=urn:btih:" + source; } @@ -81,10 +80,10 @@ m_valid = true; m_hash = m_addTorrentParams.info_hash; - m_name = QString::fromStdString(m_addTorrentParams.name); + m_name = Utils::String::fromStdString(m_addTorrentParams.name); foreach (const std::string &tracker, m_addTorrentParams.trackers) - m_trackers.append(QString::fromStdString(tracker)); + m_trackers.append(Utils::String::fromStdString(tracker)); foreach (const std::string &urlSeed, m_addTorrentParams.url_seeds) m_urlSeeds.append(QUrl(urlSeed.c_str())); diff -Nru qbittorrent-4.1.3/src/base/bittorrent/magneturi.h qbittorrent-3.3.15/src/base/bittorrent/magneturi.h --- qbittorrent-4.1.3/src/base/bittorrent/magneturi.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/magneturi.h 2017-08-03 20:30:10.000000000 +0000 @@ -29,8 +29,8 @@ #ifndef BITTORRENT_MAGNETURI_H #define BITTORRENT_MAGNETURI_H -#include #include +#include #include #include diff -Nru qbittorrent-4.1.3/src/base/bittorrent/peerinfo.cpp qbittorrent-3.3.15/src/base/bittorrent/peerinfo.cpp --- qbittorrent-4.1.3/src/base/bittorrent/peerinfo.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/peerinfo.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -26,12 +26,11 @@ * exception statement from your version. */ -#include "peerinfo.h" - -#include "base/bittorrent/torrenthandle.h" #include "base/net/geoipmanager.h" -#include "base/unicodestrings.h" #include "base/utils/string.h" +#include "base/unicodestrings.h" +#include "base/bittorrent/torrenthandle.h" +#include "peerinfo.h" namespace libt = libtorrent; using namespace BitTorrent; @@ -100,6 +99,7 @@ return (m_nativeInfo.flags & libt::peer_info::remote_choked); } + bool PeerInfo::isSupportsExtensions() const { return (m_nativeInfo.flags & libt::peer_info::supports_extensions); @@ -115,11 +115,18 @@ return (m_nativeInfo.flags & libt::peer_info::handshake); } + bool PeerInfo::isConnecting() const { return (m_nativeInfo.flags & libt::peer_info::connecting); } +bool PeerInfo::isQueued() const +{ + return (m_nativeInfo.flags & libt::peer_info::queued); +} + + bool PeerInfo::isOnParole() const { return (m_nativeInfo.flags & libt::peer_info::on_parole); @@ -135,6 +142,7 @@ return (m_nativeInfo.flags & libt::peer_info::optimistic_unchoke); } + bool PeerInfo::isSnubbed() const { return (m_nativeInfo.flags & libt::peer_info::snubbed); @@ -150,6 +158,7 @@ return (m_nativeInfo.flags & libt::peer_info::endgame_mode); } + bool PeerInfo::isHolepunched() const { return (m_nativeInfo.flags & libt::peer_info::holepunched); @@ -180,6 +189,7 @@ return (m_nativeInfo.flags & libt::peer_info::plaintext_encrypted); } + PeerAddress PeerInfo::address() const { return PeerAddress(QHostAddress(QString::fromStdString(m_nativeInfo.ip.address().to_string())), @@ -188,9 +198,10 @@ QString PeerInfo::client() const { - return QString::fromStdString(m_nativeInfo.client); + return Utils::String::fromStdString(m_nativeInfo.client); } + qreal PeerInfo::progress() const { return m_nativeInfo.progress; @@ -201,6 +212,7 @@ return m_nativeInfo.payload_up_speed; } + int PeerInfo::payloadDownSpeed() const { return m_nativeInfo.payload_down_speed; @@ -211,6 +223,7 @@ return m_nativeInfo.total_upload; } + qlonglong PeerInfo::totalDownload() const { return m_nativeInfo.total_download; @@ -232,7 +245,7 @@ return QString::fromUtf8(C_UTP); QString connection; - switch (m_nativeInfo.connection_type) { + switch(m_nativeInfo.connection_type) { case libt::peer_info::http_seed: case libt::peer_info::web_seed: connection = "Web"; @@ -246,8 +259,8 @@ void PeerInfo::calcRelevance(const TorrentHandle *torrent) { - const QBitArray allPieces = torrent->pieces(); - const QBitArray peerPieces = pieces(); + const QBitArray &allPieces = torrent->pieces(); + const QBitArray &peerPieces = pieces(); int localMissing = 0; int remoteHaves = 0; @@ -273,116 +286,117 @@ void PeerInfo::determineFlags() { - QStringList flagsDescriptionList; - if (isInteresting()) { - // d = Your client wants to download, but peer doesn't want to send (interested and choked) + //d = Your client wants to download, but peer doesn't want to send (interested and choked) if (isRemoteChocked()) { m_flags += "d "; - flagsDescriptionList += "d = " - + tr("Interested(local) and Choked(peer)"); + m_flagsDescription += tr("interested(local) and choked(peer)"); + m_flagsDescription += ", "; } else { - // D = Currently downloading (interested and not choked) + //D = Currently downloading (interested and not choked) m_flags += "D "; - flagsDescriptionList += "D = " - + tr("interested(local) and unchoked(peer)"); + m_flagsDescription += tr("interested(local) and unchoked(peer)"); + m_flagsDescription += ", "; } } if (isRemoteInterested()) { - // u = Peer wants your client to upload, but your client doesn't want to (interested and choked) + //u = Peer wants your client to upload, but your client doesn't want to (interested and choked) if (isChocked()) { m_flags += "u "; - flagsDescriptionList += "u = " - + tr("interested(peer) and choked(local)"); + m_flagsDescription += tr("interested(peer) and choked(local)"); + m_flagsDescription += ", "; } else { - // U = Currently uploading (interested and not choked) + //U = Currently uploading (interested and not choked) m_flags += "U "; - flagsDescriptionList += "U = " - + tr("interested(peer) and unchoked(local)"); + m_flagsDescription += tr("interested(peer) and unchoked(local)"); + m_flagsDescription += ", "; } } - // O = Optimistic unchoke + //O = Optimistic unchoke if (optimisticUnchoke()) { m_flags += "O "; - flagsDescriptionList += "O = " - + tr("optimistic unchoke"); + m_flagsDescription += tr("optimistic unchoke"); + m_flagsDescription += ", "; } - // S = Peer is snubbed + //S = Peer is snubbed if (isSnubbed()) { m_flags += "S "; - flagsDescriptionList += "S = " - + tr("peer snubbed"); + m_flagsDescription += tr("peer snubbed"); + m_flagsDescription += ", "; } - // I = Peer is an incoming connection + //I = Peer is an incoming connection if (!isLocalConnection()) { m_flags += "I "; - flagsDescriptionList += "I = " - + tr("incoming connection"); + m_flagsDescription += tr("incoming connection"); + m_flagsDescription += ", "; } - // K = Peer is unchoking your client, but your client is not interested + //K = Peer is unchoking your client, but your client is not interested if (!isRemoteChocked() && !isInteresting()) { m_flags += "K "; - flagsDescriptionList += "K = " - + tr("not interested(local) and unchoked(peer)"); + m_flagsDescription += tr("not interested(local) and unchoked(peer)"); + m_flagsDescription += ", "; } - // ? = Your client unchoked the peer but the peer is not interested + //? = Your client unchoked the peer but the peer is not interested if (!isChocked() && !isRemoteInterested()) { m_flags += "? "; - flagsDescriptionList += "? = " - + tr("not interested(peer) and unchoked(local)"); + m_flagsDescription += tr("not interested(peer) and unchoked(local)"); + m_flagsDescription += ", "; } - // X = Peer was included in peerlists obtained through Peer Exchange (PEX) + //X = Peer was included in peerlists obtained through Peer Exchange (PEX) if (fromPeX()) { m_flags += "X "; - flagsDescriptionList += "X = " - + tr("peer from PEX"); + m_flagsDescription += tr("peer from PEX"); + m_flagsDescription += ", "; } - // H = Peer was obtained through DHT + //H = Peer was obtained through DHT if (fromDHT()) { m_flags += "H "; - flagsDescriptionList += "H = " - + tr("peer from DHT"); + m_flagsDescription += tr("peer from DHT"); + m_flagsDescription += ", "; } - // E = Peer is using Protocol Encryption (all traffic) + //E = Peer is using Protocol Encryption (all traffic) if (isRC4Encrypted()) { m_flags += "E "; - flagsDescriptionList += "E = " - + tr("encrypted traffic"); + m_flagsDescription += tr("encrypted traffic"); + m_flagsDescription += ", "; } - // e = Peer is using Protocol Encryption (handshake) + //e = Peer is using Protocol Encryption (handshake) if (isPlaintextEncrypted()) { m_flags += "e "; - flagsDescriptionList += "e = " - + tr("encrypted handshake"); + m_flagsDescription += tr("encrypted handshake"); + m_flagsDescription += ", "; } - // P = Peer is using uTorrent uTP + //P = Peer is using uTorrent uTP + if (useUTPSocket()) { m_flags += "P "; - flagsDescriptionList += "P = " - + QString::fromUtf8(C_UTP); + m_flagsDescription += QString::fromUtf8(C_UTP); + m_flagsDescription += ", "; } - // L = Peer is local + //L = Peer is local if (fromLSD()) { - m_flags += 'L'; - flagsDescriptionList += "L = " - + tr("peer from LSD"); + m_flags += "L"; + m_flagsDescription += tr("peer from LSD"); } + m_flags = m_flags.trimmed(); - m_flagsDescription = flagsDescriptionList.join('\n'); + m_flagsDescription = m_flagsDescription.trimmed(); + if (m_flagsDescription.endsWith(',', Qt::CaseInsensitive)) + m_flagsDescription.chop(1); } QString PeerInfo::flags() const diff -Nru qbittorrent-4.1.3/src/base/bittorrent/peerinfo.h qbittorrent-3.3.15/src/base/bittorrent/peerinfo.h --- qbittorrent-4.1.3/src/base/bittorrent/peerinfo.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/peerinfo.h 2017-08-03 20:30:10.000000000 +0000 @@ -29,11 +29,11 @@ #ifndef BITTORRENT_PEERINFO_H #define BITTORRENT_PEERINFO_H +#include + +#include #include #include -#include - -#include namespace BitTorrent { @@ -68,6 +68,7 @@ bool isHandshake() const; bool isConnecting() const; + bool isQueued() const; bool isOnParole() const; bool isSeed() const; diff -Nru qbittorrent-4.1.3/src/base/bittorrent/private/bandwidthscheduler.cpp qbittorrent-3.3.15/src/base/bittorrent/private/bandwidthscheduler.cpp --- qbittorrent-4.1.3/src/base/bittorrent/private/bandwidthscheduler.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/private/bandwidthscheduler.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,7 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * Copyright (C) 2010 Christophe Dumez + * Copyright (C) 2010 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -25,78 +24,72 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#include "bandwidthscheduler.h" - -#include - -#include #include +#include +#include "base/bittorrent/session.h" #include "base/preferences.h" +#include "bandwidthscheduler.h" BandwidthScheduler::BandwidthScheduler(QObject *parent) - : QObject(parent) - , m_lastAlternative(false) + : QTimer(parent) { - connect(&m_timer, &QTimer::timeout, this, &BandwidthScheduler::onTimeout); + // Single shot, we call start() again manually + setSingleShot(true); + // Connect Signals/Slots + connect(this, SIGNAL(timeout()), this, SLOT(start())); } void BandwidthScheduler::start() { - m_lastAlternative = isTimeForAlternative(); - emit bandwidthLimitRequested(m_lastAlternative); - - // Timeout regularly to accommodate for external system clock changes - // eg from the user or from a timesync utility - m_timer.start(30000); -} - -bool BandwidthScheduler::isTimeForAlternative() const -{ - const Preferences *const pref = Preferences::instance(); + const Preferences* const pref = Preferences::instance(); + bool alt_bw_enabled = BitTorrent::Session::instance()->isAltGlobalSpeedLimitEnabled(); QTime start = pref->getSchedulerStartTime(); QTime end = pref->getSchedulerEndTime(); - const QTime now = QTime::currentTime(); - const int schedulerDays = pref->getSchedulerDays(); - const int day = QDate::currentDate().dayOfWeek(); - bool alternative = false; + QTime now = QTime::currentTime(); + int sched_days = pref->getSchedulerDays(); + int day = QDateTime::currentDateTime().toLocalTime().date().dayOfWeek(); + bool new_mode = false; + bool reverse = false; if (start > end) { - std::swap(start, end); - alternative = true; + QTime temp = start; + start = end; + end = temp; + reverse = true; } if ((start <= now) && (end >= now)) { - switch (schedulerDays) { + switch(sched_days) { case EVERY_DAY: - alternative = !alternative; + new_mode = true; break; case WEEK_ENDS: if ((day == 6) || (day == 7)) - alternative = !alternative; + new_mode = true; break; case WEEK_DAYS: if ((day != 6) && (day != 7)) - alternative = !alternative; + new_mode = true; break; default: - if (day == (schedulerDays - 2)) - alternative = !alternative; + if (day == (sched_days - 2)) + new_mode = true; } } - return alternative; -} + if (reverse) + new_mode = !new_mode; -void BandwidthScheduler::onTimeout() -{ - bool alternative = isTimeForAlternative(); + if (new_mode != alt_bw_enabled) + emit switchToAlternativeMode(new_mode); - if (alternative != m_lastAlternative) { - m_lastAlternative = alternative; - emit bandwidthLimitRequested(alternative); - } + // Timeout regularly to accommodate for external system clock changes + // eg from the user or from a timesync utility + QTimer::start(1500); } diff -Nru qbittorrent-4.1.3/src/base/bittorrent/private/bandwidthscheduler.h qbittorrent-3.3.15/src/base/bittorrent/private/bandwidthscheduler.h --- qbittorrent-4.1.3/src/base/bittorrent/private/bandwidthscheduler.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/private/bandwidthscheduler.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,7 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * Copyright (C) 2010 Christophe Dumez + * Copyright (C) 2010 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -25,32 +24,27 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef BANDWIDTHSCHEDULER_H #define BANDWIDTHSCHEDULER_H -#include #include -class BandwidthScheduler : public QObject +class BandwidthScheduler : public QTimer { Q_OBJECT - Q_DISABLE_COPY(BandwidthScheduler) public: - explicit BandwidthScheduler(QObject *parent = nullptr); + BandwidthScheduler(QObject *parent = 0); + +public slots: void start(); signals: - void bandwidthLimitRequested(bool alternative); - -private: - bool isTimeForAlternative() const; - void onTimeout(); - - QTimer m_timer; - bool m_lastAlternative; + void switchToAlternativeMode(bool alternative); }; #endif // BANDWIDTHSCHEDULER_H diff -Nru qbittorrent-4.1.3/src/base/bittorrent/private/filterparserthread.cpp qbittorrent-3.3.15/src/base/bittorrent/private/filterparserthread.cpp --- qbittorrent-4.1.3/src/base/bittorrent/private/filterparserthread.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/private/filterparserthread.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * Bittorrent Client using Qt and libt. + * 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 @@ -24,89 +24,26 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#include "filterparserthread.h" - -#include - -#include #include +#include +#include +#include + +#include +#include #include "base/logger.h" +#include "filterparserthread.h" namespace libt = libtorrent; -namespace -{ - class IPv4Parser - { - public: - bool tryParse(const char *str) - { - unsigned char octetIndex = 0; - - const char *octetStart = str; - char *endptr; - for (; *str; ++str) { - if (*str == '.') { - long int extractedNum = strtol(octetStart, &endptr, 10); - if ((extractedNum >= 0L) && (extractedNum <= 255L)) - m_buf[octetIndex++] = static_cast(extractedNum); - else - return false; - - if (endptr != str) - return false; - if (octetIndex == 4) - return true; - - octetStart = str + 1; - } - } - - if (str != octetStart) { - long int extractedNum = strtol(octetStart, &endptr, 10); - if ((extractedNum >= 0L) && (extractedNum <= 255L)) - m_buf[octetIndex] = static_cast(strtol(octetStart, &endptr, 10)); - else - return false; - - if ((endptr == str) && (octetIndex == 3)) - return true; - } - - return false; - } - - libt::address_v4::bytes_type parsed() const - { - return m_buf; - } - - private: - libt::address_v4::bytes_type m_buf; - }; - - bool parseIPAddress(const char *data, libt::address &address) - { - IPv4Parser parser; - boost::system::error_code ec; - - if (parser.tryParse(data)) - address = libt::address_v4(parser.parsed()); - else - address = libt::address_v6::from_string(data, ec); - - return !ec; - } - - const int BUFFER_SIZE = 2 * 1024 * 1024; // 2 MiB - const int MAX_LOGGED_ERRORS = 5; -} - -FilterParserThread::FilterParserThread(QObject *parent) +FilterParserThread::FilterParserThread(libt::session *s, QObject *parent) : QThread(parent) + , m_session(s) , m_abort(false) { } @@ -118,324 +55,216 @@ } // Parser for eMule ip filter in DAT format -int FilterParserThread::parseDATFilterFile() +int FilterParserThread::parseDATFilterFile(QString filePath, libt::ip_filter &filter) { int ruleCount = 0; - QFile file(m_filePath); + QFile file(filePath); if (!file.exists()) return ruleCount; if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - LogMsg(tr("I/O Error: Could not open IP filter file in read mode."), Log::CRITICAL); + Logger::instance()->addMessage(tr("I/O Error: Could not open ip filter file in read mode."), Log::CRITICAL); return ruleCount; } - std::vector buffer(BUFFER_SIZE, 0); // seems a bit faster than QVector - qint64 bytesRead = 0; - int offset = 0; - int start = 0; - int endOfLine = -1; - int nbLine = 0; - int parseErrorCount = 0; - const auto addLog = [&parseErrorCount](const QString &msg) - { - if (parseErrorCount <= MAX_LOGGED_ERRORS) - LogMsg(msg, Log::CRITICAL); - }; - - while (true) { - bytesRead = file.read(buffer.data() + offset, BUFFER_SIZE - offset - 1); - if (bytesRead < 0) - break; - int dataSize = bytesRead + offset; - if ((bytesRead == 0) && (dataSize == 0)) - break; - - for (start = 0; start < dataSize; ++start) { - endOfLine = -1; - // The file might have ended without the last line having a newline - if (!((bytesRead == 0) && (dataSize > 0))) { - for (int i = start; i < dataSize; ++i) { - if (buffer[i] == '\n') { - endOfLine = i; - // We need to NULL the newline in case the line has only an IP range. - // In that case the parser won't work for the end IP, because it ends - // with the newline and not with a number. - buffer[i] = '\0'; - break; - } - } - } - else { - endOfLine = dataSize; - buffer[dataSize] = '\0'; - } - - if (endOfLine == -1) { - // read the next chunk from file - // but first move(copy) the leftover data to the front of the buffer - offset = dataSize - start; - memmove(buffer.data(), buffer.data() + start, offset); - break; - } - else { - ++nbLine; - } - - if ((buffer[start] == '#') - || ((buffer[start] == '/') && ((start + 1 < dataSize) && (buffer[start + 1] == '/')))) { - start = endOfLine; - continue; - } - - // Each line should follow this format: - // 001.009.096.105 - 001.009.096.105 , 000 , Some organization - // The 3rd entry is access level and if above 127 the IP range isn't blocked. - int firstComma = findAndNullDelimiter(buffer.data(), ',', start, endOfLine); - if (firstComma != -1) - findAndNullDelimiter(buffer.data(), ',', firstComma + 1, endOfLine); - - // Check if there is an access value (apparently not mandatory) - if (firstComma != -1) { - // There is possibly one - const long int nbAccess = strtol(buffer.data() + firstComma + 1, nullptr, 10); - // Ignoring this rule because access value is too high - if (nbAccess > 127L) { - start = endOfLine; - continue; - } - } + unsigned int nbLine = 0; + while (!file.atEnd() && !m_abort) { + ++nbLine; + QByteArray line = file.readLine(); + // Ignoring empty lines + line = line.trimmed(); + if (line.isEmpty()) continue; + // Ignoring commented lines + if (line.startsWith('#') || line.startsWith("//")) continue; + + // Line should be split by commas + QList partsList = line.split(','); + const uint nbElem = partsList.size(); + + // IP Range should be split by a dash + QList IPs = partsList.first().split('-'); + if (IPs.size() != 2) { + qDebug("Ipfilter.dat: line %d is malformed.", nbLine); + qDebug("Line was %s", line.constData()); + continue; + } - // IP Range should be split by a dash - int endOfIPRange = ((firstComma == -1) ? (endOfLine - 1) : (firstComma - 1)); - int delimIP = findAndNullDelimiter(buffer.data(), '-', start, endOfIPRange); - if (delimIP == -1) { - ++parseErrorCount; - addLog(tr("IP filter line %1 is malformed.").arg(nbLine)); - start = endOfLine; - continue; - } + boost::system::error_code ec; + const QString strStartIP = cleanupIPAddress(IPs.at(0)); + if (strStartIP.isEmpty()) { + qDebug("Ipfilter.dat: line %d is malformed.", nbLine); + qDebug("Start IP of the range is malformated: %s", qPrintable(strStartIP)); + continue; + } + libt::address startAddr = libt::address::from_string(qPrintable(strStartIP), ec); + if (ec) { + qDebug("Ipfilter.dat: line %d is malformed.", nbLine); + qDebug("Start IP of the range is malformated: %s", qPrintable(strStartIP)); + continue; + } - libt::address startAddr; - int newStart = trim(buffer.data(), start, delimIP - 1); - if (!parseIPAddress(buffer.data() + newStart, startAddr)) { - ++parseErrorCount; - addLog(tr("IP filter line %1 is malformed. Start IP of the range is malformed.").arg(nbLine)); - start = endOfLine; - continue; - } + const QString strEndIP = cleanupIPAddress(IPs.at(1)); + if (strEndIP.isEmpty()) { + qDebug("Ipfilter.dat: line %d is malformed.", nbLine); + qDebug("End IP of the range is malformated: %s", qPrintable(strEndIP)); + continue; + } - libt::address endAddr; - newStart = trim(buffer.data(), delimIP + 1, endOfIPRange); - if (!parseIPAddress(buffer.data() + newStart, endAddr)) { - ++parseErrorCount; - addLog(tr("IP filter line %1 is malformed. End IP of the range is malformed.").arg(nbLine)); - start = endOfLine; - continue; - } + libt::address endAddr = libt::address::from_string(qPrintable(strEndIP), ec); + if (ec) { + qDebug("Ipfilter.dat: line %d is malformed.", nbLine); + qDebug("End IP of the range is malformated: %s", qPrintable(strEndIP)); + continue; + } - if ((startAddr.is_v4() != endAddr.is_v4()) - || (startAddr.is_v6() != endAddr.is_v6())) { - ++parseErrorCount; - addLog(tr("IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6!").arg(nbLine)); - start = endOfLine; - continue; - } + if (startAddr.is_v4() != endAddr.is_v4()) { + qDebug("Ipfilter.dat: line %d is malformed.", nbLine); + qDebug("One IP is IPv4 and the other is IPv6!"); + continue; + } - start = endOfLine; + // Check if there is an access value (apparently not mandatory) + int nbAccess = 0; + if (nbElem > 1) { + // There is possibly one + nbAccess = partsList.at(1).trimmed().toInt(); + } - // Now Add to the filter - try { - m_filter.add_rule(startAddr, endAddr, libt::ip_filter::blocked); - ++ruleCount; - } - catch (std::exception &e) { - ++parseErrorCount; - addLog(tr("IP filter exception thrown for line %1. Exception is: %2") - .arg(nbLine).arg(QString::fromLocal8Bit(e.what()))); - } + if (nbAccess > 127) { + // Ignoring this rule because access value is too high + continue; } - if (start >= dataSize) - offset = 0; + // Now Add to the filter + try { + filter.add_rule(startAddr, endAddr, libt::ip_filter::blocked); + ++ruleCount; + } + catch(std::exception &) { + qDebug("Bad line in filter file, avoided crash..."); + } } - if (parseErrorCount > MAX_LOGGED_ERRORS) - LogMsg(tr("%1 extra IP filter parsing errors occurred.", "513 extra IP filter parsing errors occurred.") - .arg(parseErrorCount - MAX_LOGGED_ERRORS), Log::CRITICAL); + file.close(); return ruleCount; } // Parser for PeerGuardian ip filter in p2p format -int FilterParserThread::parseP2PFilterFile() +int FilterParserThread::parseP2PFilterFile(QString filePath, libt::ip_filter &filter) { int ruleCount = 0; - QFile file(m_filePath); + QFile file(filePath); if (!file.exists()) return ruleCount; if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - LogMsg(tr("I/O Error: Could not open IP filter file in read mode."), Log::CRITICAL); + Logger::instance()->addMessage(tr("I/O Error: Could not open ip filter file in read mode."), Log::CRITICAL); return ruleCount; } - std::vector buffer(BUFFER_SIZE, 0); // seems a bit faster than QVector - qint64 bytesRead = 0; - int offset = 0; - int start = 0; - int endOfLine = -1; - int nbLine = 0; - int parseErrorCount = 0; - const auto addLog = [&parseErrorCount](const QString &msg) - { - if (parseErrorCount <= MAX_LOGGED_ERRORS) - LogMsg(msg, Log::CRITICAL); - }; - - while (true) { - bytesRead = file.read(buffer.data() + offset, BUFFER_SIZE - offset - 1); - if (bytesRead < 0) - break; - int dataSize = bytesRead + offset; - if ((bytesRead == 0) && (dataSize == 0)) - break; - - for (start = 0; start < dataSize; ++start) { - endOfLine = -1; - // The file might have ended without the last line having a newline - if (!((bytesRead == 0) && (dataSize > 0))) { - for (int i = start; i < dataSize; ++i) { - if (buffer[i] == '\n') { - endOfLine = i; - // We need to NULL the newline in case the line has only an IP range. - // In that case the parser won't work for the end IP, because it ends - // with the newline and not with a number. - buffer[i] = '\0'; - break; - } - } - } - else { - endOfLine = dataSize; - buffer[dataSize] = '\0'; - } - - if (endOfLine == -1) { - // read the next chunk from file - // but first move(copy) the leftover data to the front of the buffer - offset = dataSize - start; - memmove(buffer.data(), buffer.data() + start, offset); - break; - } - else { - ++nbLine; - } - - if ((buffer[start] == '#') - || ((buffer[start] == '/') && ((start + 1 < dataSize) && (buffer[start + 1] == '/')))) { - start = endOfLine; - continue; - } - - // Each line should follow this format: - // Some organization:1.0.0.0-1.255.255.255 - // The "Some organization" part might contain a ':' char itself so we find the last occurrence - int partsDelimiter = findAndNullDelimiter(buffer.data(), ':', start, endOfLine, true); - if (partsDelimiter == -1) { - ++parseErrorCount; - addLog(tr("IP filter line %1 is malformed.").arg(nbLine)); - start = endOfLine; - continue; - } - - // IP Range should be split by a dash - int delimIP = findAndNullDelimiter(buffer.data(), '-', partsDelimiter + 1, endOfLine); - if (delimIP == -1) { - ++parseErrorCount; - addLog(tr("IP filter line %1 is malformed.").arg(nbLine)); - start = endOfLine; - continue; - } + unsigned int nbLine = 0; + while (!file.atEnd() && !m_abort) { + ++nbLine; + QByteArray line = file.readLine().trimmed(); + if (line.isEmpty()) continue; + // Ignoring commented lines + if (line.startsWith('#') || line.startsWith("//")) continue; + + // Line is split by : + QList partsList = line.split(':'); + if (partsList.size() < 2) { + qDebug("p2p file: line %d is malformed.", nbLine); + continue; + } + + // Get IP range + QList IPs = partsList.last().split('-'); + if (IPs.size() != 2) { + qDebug("p2p file: line %d is malformed.", nbLine); + qDebug("line was: %s", line.constData()); + continue; + } - libt::address startAddr; - int newStart = trim(buffer.data(), partsDelimiter + 1, delimIP - 1); - if (!parseIPAddress(buffer.data() + newStart, startAddr)) { - ++parseErrorCount; - addLog(tr("IP filter line %1 is malformed. Start IP of the range is malformed.").arg(nbLine)); - start = endOfLine; - continue; - } + boost::system::error_code ec; + QString strStartIP = cleanupIPAddress(IPs.at(0)); + if (strStartIP.isEmpty()) { + qDebug("p2p file: line %d is malformed.", nbLine); + qDebug("Start IP is invalid: %s", qPrintable(strStartIP)); + continue; + } - libt::address endAddr; - newStart = trim(buffer.data(), delimIP + 1, endOfLine); - if (!parseIPAddress(buffer.data() + newStart, endAddr)) { - ++parseErrorCount; - addLog(tr("IP filter line %1 is malformed. End IP of the range is malformed.").arg(nbLine)); - start = endOfLine; - continue; - } + libt::address startAddr = libt::address::from_string(qPrintable(strStartIP), ec); + if (ec) { + qDebug("p2p file: line %d is malformed.", nbLine); + qDebug("Start IP is invalid: %s", qPrintable(strStartIP)); + continue; + } - if ((startAddr.is_v4() != endAddr.is_v4()) - || (startAddr.is_v6() != endAddr.is_v6())) { - ++parseErrorCount; - addLog(tr("IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6!").arg(nbLine)); - start = endOfLine; - continue; - } + QString strEndIP = cleanupIPAddress(IPs.at(1)); + if (strEndIP.isEmpty()) { + qDebug("p2p file: line %d is malformed.", nbLine); + qDebug("End IP is invalid: %s", qPrintable(strStartIP)); + continue; + } - start = endOfLine; + libt::address endAddr = libt::address::from_string(qPrintable(strEndIP), ec); + if (ec) { + qDebug("p2p file: line %d is malformed.", nbLine); + qDebug("End IP is invalid: %s", qPrintable(strStartIP)); + continue; + } - try { - m_filter.add_rule(startAddr, endAddr, libt::ip_filter::blocked); - ++ruleCount; - } - catch (std::exception &e) { - ++parseErrorCount; - addLog(tr("IP filter exception thrown for line %1. Exception is: %2") - .arg(nbLine).arg(QString::fromLocal8Bit(e.what()))); - } + if (startAddr.is_v4() != endAddr.is_v4()) { + qDebug("p2p file: line %d is malformed.", nbLine); + qDebug("Line was: %s", line.constData()); + continue; } - if (start >= dataSize) - offset = 0; + try { + filter.add_rule(startAddr, endAddr, libt::ip_filter::blocked); + ++ruleCount; + } + catch(std::exception &) { + qDebug("p2p file: line %d is malformed.", nbLine); + qDebug("Line was: %s", line.constData()); + continue; + } } - if (parseErrorCount > MAX_LOGGED_ERRORS) - LogMsg(tr("%1 extra IP filter parsing errors occurred.", "513 extra IP filter parsing errors occurred.") - .arg(parseErrorCount - MAX_LOGGED_ERRORS), Log::CRITICAL); + file.close(); return ruleCount; } int FilterParserThread::getlineInStream(QDataStream &stream, std::string &name, char delim) { char c; - int totalRead = 0; + int total_read = 0; int read; do { read = stream.readRawData(&c, 1); - totalRead += read; + total_read += read; if (read > 0) { if (c != delim) { name += c; } else { // Delim found - return totalRead; + return total_read; } } } - while (read > 0); + while(read > 0); - return totalRead; + return total_read; } // Parser for PeerGuardian ip filter in p2p format -int FilterParserThread::parseP2BFilterFile() +int FilterParserThread::parseP2BFilterFile(QString filePath, libt::ip_filter &filter) { int ruleCount = 0; - QFile file(m_filePath); + QFile file(filePath); if (!file.exists()) return ruleCount; if (!file.open(QIODevice::ReadOnly)) { - LogMsg(tr("I/O Error: Could not open IP filter file in read mode."), Log::CRITICAL); + Logger::instance()->addMessage(tr("I/O Error: Could not open ip filter file in read mode."), Log::CRITICAL); return ruleCount; } @@ -445,8 +274,8 @@ unsigned char version; if (!stream.readRawData(buf, sizeof(buf)) || memcmp(buf, "\xFF\xFF\xFF\xFFP2B", 7) - || !stream.readRawData(reinterpret_cast(&version), sizeof(version))) { - LogMsg(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL); + || !stream.readRawData((char*)&version, sizeof(version))) { + Logger::instance()->addMessage(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL); return ruleCount; } @@ -455,10 +284,10 @@ unsigned int start, end; std::string name; - while (getlineInStream(stream, name, '\0') && !m_abort) { - if (!stream.readRawData(reinterpret_cast(&start), sizeof(start)) - || !stream.readRawData(reinterpret_cast(&end), sizeof(end))) { - LogMsg(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL); + while(getlineInStream(stream, name, '\0') && !m_abort) { + if (!stream.readRawData((char*)&start, sizeof(start)) + || !stream.readRawData((char*)&end, sizeof(end))) { + Logger::instance()->addMessage(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL); return ruleCount; } @@ -469,17 +298,17 @@ libt::address_v4 last(ntohl(end)); // Apply to bittorrent session try { - m_filter.add_rule(first, last, libt::ip_filter::blocked); + filter.add_rule(first, last, libt::ip_filter::blocked); ++ruleCount; } - catch (std::exception &) {} + catch(std::exception &) {} } } else if (version == 3) { qDebug ("p2b version 3"); unsigned int namecount; - if (!stream.readRawData(reinterpret_cast(&namecount), sizeof(namecount))) { - LogMsg(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL); + if (!stream.readRawData((char*)&namecount, sizeof(namecount))) { + Logger::instance()->addMessage(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL); return ruleCount; } @@ -488,7 +317,7 @@ for (unsigned int i = 0; i < namecount; ++i) { std::string name; if (!getlineInStream(stream, name, '\0')) { - LogMsg(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL); + Logger::instance()->addMessage(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL); return ruleCount; } @@ -497,18 +326,18 @@ // Reading the ranges unsigned int rangecount; - if (!stream.readRawData(reinterpret_cast(&rangecount), sizeof(rangecount))) { - LogMsg(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL); + if (!stream.readRawData((char*)&rangecount, sizeof(rangecount))) { + Logger::instance()->addMessage(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL); return ruleCount; } rangecount = ntohl(rangecount); unsigned int name, start, end; for (unsigned int i = 0; i < rangecount; ++i) { - if (!stream.readRawData(reinterpret_cast(&name), sizeof(name)) - || !stream.readRawData(reinterpret_cast(&start), sizeof(start)) - || !stream.readRawData(reinterpret_cast(&end), sizeof(end))) { - LogMsg(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL); + if (!stream.readRawData((char*)&name, sizeof(name)) + || !stream.readRawData((char*)&start, sizeof(start)) + || !stream.readRawData((char*)&end, sizeof(end))) { + Logger::instance()->addMessage(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL); return ruleCount; } @@ -519,18 +348,19 @@ libt::address_v4 last(ntohl(end)); // Apply to bittorrent session try { - m_filter.add_rule(first, last, libt::ip_filter::blocked); + filter.add_rule(first, last, libt::ip_filter::blocked); ++ruleCount; } - catch (std::exception &) {} + catch(std::exception &) {} if (m_abort) return ruleCount; } } else { - LogMsg(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL); + Logger::instance()->addMessage(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL); } + file.close(); return ruleCount; } @@ -539,7 +369,7 @@ // * eMule IP list (DAT): http://wiki.phoenixlabs.org/wiki/DAT_Format // * PeerGuardian Text (P2P): http://wiki.phoenixlabs.org/wiki/P2P_Format // * PeerGuardian Binary (P2B): http://wiki.phoenixlabs.org/wiki/P2B_Format -void FilterParserThread::processFilterFile(const QString &filePath) +void FilterParserThread::processFilterFile(QString filePath) { if (isRunning()) { // Already parsing a filter, m_abort first @@ -549,88 +379,68 @@ m_abort = false; m_filePath = filePath; - m_filter = libt::ip_filter(); // Run it start(); } -libt::ip_filter FilterParserThread::IPfilter() +QString FilterParserThread::cleanupIPAddress(QString _ip) { - return m_filter; + _ip = _ip.trimmed(); + + // Emule .DAT files contain leading zeroes in IPv4 addresses + // eg 001.009.106.186 + // We need to remove them because both QHostAddress and Boost.Asio fail to parse them. + QStringList octets = _ip.split('.', QString::SkipEmptyParts); + if (octets.size() == 4) { + QString octet; // it is faster to not recreate this object in the loop + for (int i = 0; i < 4; i++) { + octet = octets[i]; + if ((octet[0] == QChar('0')) && (octet.count() > 1)) { + if ((octet[1] == QChar('0')) && (octet.count() > 2)) + octet.remove(0, 2); + else + octet.remove(0, 1); + + octets[i] = octet; + } + } + + _ip = octets.join("."); + } + + QHostAddress ip(_ip); + if (ip.isNull()) return QString(); + + return ip.toString(); } void FilterParserThread::run() { qDebug("Processing filter file"); + libt::ip_filter filter = m_session->get_ip_filter(); int ruleCount = 0; if (m_filePath.endsWith(".p2p", Qt::CaseInsensitive)) { // PeerGuardian p2p file - ruleCount = parseP2PFilterFile(); + ruleCount = parseP2PFilterFile(m_filePath, filter); } else if (m_filePath.endsWith(".p2b", Qt::CaseInsensitive)) { // PeerGuardian p2b file - ruleCount = parseP2BFilterFile(); + ruleCount = parseP2BFilterFile(m_filePath, filter); } else if (m_filePath.endsWith(".dat", Qt::CaseInsensitive)) { // eMule DAT format - ruleCount = parseDATFilterFile(); + ruleCount = parseDATFilterFile(m_filePath, filter); } if (m_abort) return; try { + m_session->set_ip_filter(filter); emit IPFilterParsed(ruleCount); } - catch (std::exception &) { + catch(std::exception &) { emit IPFilterError(); } qDebug("IP Filter thread: finished parsing, filter applied"); } - -int FilterParserThread::findAndNullDelimiter(char *const data, char delimiter, int start, int end, bool reverse) -{ - if (!reverse) { - for (int i = start; i <= end; ++i) { - if (data[i] == delimiter) { - data[i] = '\0'; - return i; - } - } - } - else { - for (int i = end; i >= start; --i) { - if (data[i] == delimiter) { - data[i] = '\0'; - return i; - } - } - } - - return -1; -} - -int FilterParserThread::trim(char *const data, int start, int end) -{ - if (start >= end) return start; - int newStart = start; - - for (int i = start; i <= end; ++i) { - if (isspace(data[i]) != 0) { - data[i] = '\0'; - } - else { - newStart = i; - break; - } - } - - for (int i = end; i >= start; --i) { - if (isspace(data[i]) != 0) - data[i] = '\0'; - else - break; - } - - return newStart; -} diff -Nru qbittorrent-4.1.3/src/base/bittorrent/private/filterparserthread.h qbittorrent-3.3.15/src/base/bittorrent/private/filterparserthread.h --- qbittorrent-4.1.3/src/base/bittorrent/private/filterparserthread.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/private/filterparserthread.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef FILTERPARSERTHREAD_H @@ -31,38 +33,41 @@ #include -#include - class QDataStream; +class QStringList; + +namespace libtorrent +{ + class session; + struct ip_filter; +} class FilterParserThread : public QThread { Q_OBJECT public: - FilterParserThread(QObject *parent = nullptr); + FilterParserThread(libtorrent::session *s, QObject *parent = 0); ~FilterParserThread(); - void processFilterFile(const QString &filePath); - libtorrent::ip_filter IPfilter(); + void processFilterFile(QString filePath); signals: void IPFilterParsed(int ruleCount); void IPFilterError(); protected: + QString cleanupIPAddress(QString _ip); void run(); private: - int findAndNullDelimiter(char *const data, char delimiter, int start, int end, bool reverse = false); - int trim(char *const data, int start, int end); - int parseDATFilterFile(); - int parseP2PFilterFile(); + int parseDATFilterFile(QString filePath, libtorrent::ip_filter &filter); + int parseP2PFilterFile(QString filePath, libtorrent::ip_filter &filter); int getlineInStream(QDataStream &stream, std::string &name, char delim); - int parseP2BFilterFile(); + int parseP2BFilterFile(QString filePath, libtorrent::ip_filter &filter); + libtorrent::session *m_session; bool m_abort; QString m_filePath; - libtorrent::ip_filter m_filter; }; #endif // BITTORRENT_FILTERPARSERTHREAD_H diff -Nru qbittorrent-4.1.3/src/base/bittorrent/private/resumedatasavingmanager.cpp qbittorrent-3.3.15/src/base/bittorrent/private/resumedatasavingmanager.cpp --- qbittorrent-4.1.3/src/base/bittorrent/private/resumedatasavingmanager.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/private/resumedatasavingmanager.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -26,13 +26,16 @@ * exception statement from your version. */ -#include "resumedatasavingmanager.h" - #include +#ifdef QBT_USES_QT5 #include +#else +#include +#endif #include "base/logger.h" #include "base/utils/fs.h" +#include "resumedatasavingmanager.h" ResumeDataSavingManager::ResumeDataSavingManager(const QString &resumeFolderPath) : m_resumeDataDir(resumeFolderPath) @@ -45,12 +48,18 @@ QString filepath = m_resumeDataDir.absoluteFilePath(filename); qDebug() << "Saving resume data in" << filepath; +#ifdef QBT_USES_QT5 QSaveFile resumeFile(filepath); +#else + QFile resumeFile(filepath); +#endif if (resumeFile.open(QIODevice::WriteOnly)) { resumeFile.write(data); +#ifdef QBT_USES_QT5 if (!resumeFile.commit()) { Logger::instance()->addMessage(QString("Couldn't save resume data in %1. Error: %2") - .arg(filepath, resumeFile.errorString()), Log::WARNING); + .arg(filepath).arg(resumeFile.errorString()), Log::WARNING); } +#endif } } diff -Nru qbittorrent-4.1.3/src/base/bittorrent/private/resumedatasavingmanager.h qbittorrent-3.3.15/src/base/bittorrent/private/resumedatasavingmanager.h --- qbittorrent-4.1.3/src/base/bittorrent/private/resumedatasavingmanager.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/private/resumedatasavingmanager.h 2017-08-03 20:30:10.000000000 +0000 @@ -29,11 +29,11 @@ #ifndef RESUMEDATASAVINGMANAGER_H #define RESUMEDATASAVINGMANAGER_H +#include #include #include -#include -class ResumeDataSavingManager : public QObject +class ResumeDataSavingManager: public QObject { Q_OBJECT diff -Nru qbittorrent-4.1.3/src/base/bittorrent/private/statistics.cpp qbittorrent-3.3.15/src/base/bittorrent/private/statistics.cpp --- qbittorrent-4.1.3/src/base/bittorrent/private/statistics.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/private/statistics.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,12 +1,11 @@ -#include "statistics.h" - #include #include -#include "base/bittorrent/session.h" +#include "base/qinisettings.h" #include "base/bittorrent/sessionstatus.h" -#include "base/profile.h" +#include "base/bittorrent/session.h" +#include "statistics.h" static const qint64 SAVE_INTERVAL = 15 * 60 * 1000; @@ -22,7 +21,7 @@ , m_dirty(false) { load(); - connect(&m_timer, &QTimer::timeout, this, &Statistics::gather); + connect(&m_timer, SIGNAL(timeout()), this, SLOT(gather())); m_timer.start(60 * 1000); } @@ -45,13 +44,13 @@ void Statistics::gather() { - const SessionStatus &ss = m_session->status(); - if (ss.totalDownload > m_sessionDL) { - m_sessionDL = ss.totalDownload; + SessionStatus ss = m_session->status(); + if (ss.totalDownload() > m_sessionDL) { + m_sessionDL = ss.totalDownload(); m_dirty = true; } - if (ss.totalUpload > m_sessionUL) { - m_sessionUL = ss.totalUpload; + if (ss.totalUpload() > m_sessionUL) { + m_sessionUL = ss.totalUpload(); m_dirty = true; } @@ -65,19 +64,19 @@ if (!m_dirty || ((now - m_lastWrite) < SAVE_INTERVAL)) return; - SettingsPtr s = Profile::instance().applicationSettings(QLatin1String("qBittorrent-data")); + QIniSettings s("qBittorrent", "qBittorrent-data"); QVariantHash v; v.insert("AlltimeDL", m_alltimeDL + m_sessionDL); v.insert("AlltimeUL", m_alltimeUL + m_sessionUL); - s->setValue("Stats/AllStats", v); + s.setValue("Stats/AllStats", v); m_dirty = false; m_lastWrite = now; } void Statistics::load() { - SettingsPtr s = Profile::instance().applicationSettings(QLatin1String("qBittorrent-data")); - QVariantHash v = s->value("Stats/AllStats").toHash(); + QIniSettings s("qBittorrent", "qBittorrent-data"); + QVariantHash v = s.value("Stats/AllStats").toHash(); m_alltimeDL = v["AlltimeDL"].toULongLong(); m_alltimeUL = v["AlltimeUL"].toULongLong(); diff -Nru qbittorrent-4.1.3/src/base/bittorrent/private/statistics.h qbittorrent-3.3.15/src/base/bittorrent/private/statistics.h --- qbittorrent-4.1.3/src/base/bittorrent/private/statistics.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/private/statistics.h 2017-08-03 20:30:10.000000000 +0000 @@ -4,12 +4,9 @@ #include #include -namespace BitTorrent -{ - class Session; -} +namespace BitTorrent { class Session; } -class Statistics : public QObject +class Statistics : QObject { Q_OBJECT Q_DISABLE_COPY(Statistics) @@ -28,12 +25,13 @@ void save() const; void load(); +private: BitTorrent::Session *m_session; // Will overflow at 15.9 EiB quint64 m_alltimeUL; quint64 m_alltimeDL; - quint64 m_sessionUL; - quint64 m_sessionDL; + qint64 m_sessionUL; + qint64 m_sessionDL; mutable qint64 m_lastWrite; mutable bool m_dirty; diff -Nru qbittorrent-4.1.3/src/base/bittorrent/session.cpp qbittorrent-3.3.15/src/base/bittorrent/session.cpp --- qbittorrent-4.1.3/src/base/bittorrent/session.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/session.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,3 +1,4 @@ + /* * Bittorrent Client using Qt and libtorrent. * Copyright (C) 2015 Vladimir Golovnev @@ -29,78 +30,64 @@ #include "session.h" -#include -#include -#include -#include - #include +#include #include #include #include #include #include #include -#include +#include #include #include #include -#include + +#include +#include +#include #include +#if LIBTORRENT_VERSION_NUM >= 10100 +#include +#endif #include -#include #include #include #include #include #include #include -#include -#include -#include -#include - #if LIBTORRENT_VERSION_NUM < 10100 #include -#else -#include -#include #endif +#include +#include +#include -#include "base/algorithm.h" #include "base/logger.h" #include "base/net/downloadhandler.h" #include "base/net/downloadmanager.h" #include "base/net/portforwarder.h" #include "base/net/proxyconfigurationmanager.h" -#include "base/profile.h" #include "base/torrentfileguard.h" #include "base/torrentfilter.h" #include "base/unicodestrings.h" -#include "base/utils/fs.h" #include "base/utils/misc.h" -#include "base/utils/net.h" +#include "base/utils/fs.h" #include "base/utils/random.h" #include "base/utils/string.h" +#include "cachestatus.h" #include "magneturi.h" -#include "private/bandwidthscheduler.h" #include "private/filterparserthread.h" -#include "private/resumedatasavingmanager.h" #include "private/statistics.h" +#include "private/bandwidthscheduler.h" +#include "private/resumedatasavingmanager.h" +#include "sessionstatus.h" #include "torrenthandle.h" #include "tracker.h" #include "trackerentry.h" -#ifdef Q_OS_WIN -#include -#include -#endif - -#if defined(Q_OS_WIN) && (_WIN32_WINNT < 0x0600) -using NETIO_STATUS = LONG; -#endif - static const char PEER_ID[] = "qB"; static const char RESUME_FOLDER[] = "BT_backup"; static const char USER_AGENT[] = "qBittorrent/" QBT_VERSION_2; @@ -111,70 +98,31 @@ namespace { bool readFile(const QString &path, QByteArray &buf); - bool loadTorrentResumeData(const QByteArray &data, CreateTorrentParams &torrentParams, int &prio, MagnetUri &magnetUri); + bool loadTorrentResumeData(const QByteArray &data, AddTorrentData &torrentData, int &prio, MagnetUri &magnetUri); void torrentQueuePositionUp(const libt::torrent_handle &handle); void torrentQueuePositionDown(const libt::torrent_handle &handle); void torrentQueuePositionTop(const libt::torrent_handle &handle); void torrentQueuePositionBottom(const libt::torrent_handle &handle); -#ifdef Q_OS_WIN - QString convertIfaceNameToGuid(const QString &name); -#endif + inline SettingsStorage *settings() { return SettingsStorage::instance(); } QStringMap map_cast(const QVariantMap &map) { QStringMap result; - for (auto i = map.cbegin(); i != map.cend(); ++i) - result[i.key()] = i.value().toString(); + foreach (const QString &key, map.keys()) + result[key] = map.value(key).toString(); return result; } QVariantMap map_cast(const QStringMap &map) { QVariantMap result; - for (auto i = map.cbegin(); i != map.cend(); ++i) - result[i.key()] = i.value(); + foreach (const QString &key, map.keys()) + result[key] = map.value(key); return result; } - template - QSet entryListToSetImpl(const Entry &entry) - { - Q_ASSERT(entry.type() == Entry::list_t); - QSet output; - for (int i = 0; i < entry.list_size(); ++i) { - const QString tag = QString::fromStdString(entry.list_string_value_at(i)); - if (Session::isValidTag(tag)) - output.insert(tag); - else - qWarning() << QString("Dropping invalid stored tag: %1").arg(tag); - } - return output; - } - -#if LIBTORRENT_VERSION_NUM < 10100 - bool isList(const libt::lazy_entry *entry) - { - return entry && (entry->type() == libt::lazy_entry::list_t); - } - - QSet entryListToSet(const libt::lazy_entry *entry) - { - return entry ? entryListToSetImpl(*entry) : QSet(); - } -#else - bool isList(const libt::bdecode_node &entry) - { - return entry.type() == libt::bdecode_node::list_t; - } - - QSet entryListToSet(const libt::bdecode_node &entry) - { - return entryListToSetImpl(entry); - } -#endif - QString normalizePath(const QString &path) { QString tmp = Utils::Fs::fromNativePath(path.trimmed()); @@ -183,7 +131,7 @@ return tmp; } - QString normalizeSavePath(QString path, const QString &defaultPath = specialFolderLocation(SpecialFolder::Downloads)) + QString normalizeSavePath(QString path, const QString &defaultPath = Utils::Fs::QDesktopServicesDownloadLocation()) { path = path.trimmed(); if (path.isEmpty()) @@ -196,8 +144,7 @@ { QStringMap expanded = categories; - for (auto i = categories.cbegin(); i != categories.cend(); ++i) { - const QString &category = i.key(); + foreach (const QString &category, categories.keys()) { foreach (const QString &subcat, Session::expandCategory(category)) { if (!expanded.contains(subcat)) expanded[subcat] = ""; @@ -221,7 +168,7 @@ { } - T operator()(T val) const + T operator()(T val) { return val <= m_limit ? m_ret : val; } @@ -236,20 +183,6 @@ template LowerLimited lowerLimited(T limit, T ret) { return LowerLimited(limit, ret); } - - template - std::function clampValue(const T lower, const T upper) - { - // TODO: change return type to `auto` when using C++14 - return [lower, upper](const T value) -> T - { - if (value < lower) - return lower; - if (value > upper) - return upper; - return value; - }; - } } // Session @@ -272,31 +205,16 @@ , m_isIPFilteringEnabled(BITTORRENT_SESSION_KEY("IPFilteringEnabled"), false) , m_isTrackerFilteringEnabled(BITTORRENT_SESSION_KEY("TrackerFilteringEnabled"), false) , m_IPFilterFile(BITTORRENT_SESSION_KEY("IPFilter")) - , m_announceToAllTrackers(BITTORRENT_SESSION_KEY("AnnounceToAllTrackers"), false) - , m_announceToAllTiers(BITTORRENT_SESSION_KEY("AnnounceToAllTiers"), true) - , m_asyncIOThreads(BITTORRENT_SESSION_KEY("AsyncIOThreadsCount"), 4) - , m_diskCacheSize(BITTORRENT_SESSION_KEY("DiskCacheSize"), 64) + , m_announceToAllTrackers(BITTORRENT_SESSION_KEY("AnnounceToAllTrackers"), true) + , m_diskCacheSize(BITTORRENT_SESSION_KEY("DiskCacheSize"), 0) , m_diskCacheTTL(BITTORRENT_SESSION_KEY("DiskCacheTTL"), 60) , m_useOSCache(BITTORRENT_SESSION_KEY("UseOSCache"), true) - , m_guidedReadCacheEnabled(BITTORRENT_SESSION_KEY("GuidedReadCache"), true) -#ifdef Q_OS_WIN - , m_coalesceReadWriteEnabled(BITTORRENT_SESSION_KEY("CoalesceReadWrite"), true) -#else - , m_coalesceReadWriteEnabled(BITTORRENT_SESSION_KEY("CoalesceReadWrite"), false) -#endif - , m_isSuggestMode(BITTORRENT_SESSION_KEY("SuggestMode"), false) - , m_sendBufferWatermark(BITTORRENT_SESSION_KEY("SendBufferWatermark"), 500) - , m_sendBufferLowWatermark(BITTORRENT_SESSION_KEY("SendBufferLowWatermark"), 10) - , m_sendBufferWatermarkFactor(BITTORRENT_SESSION_KEY("SendBufferWatermarkFactor"), 50) , m_isAnonymousModeEnabled(BITTORRENT_SESSION_KEY("AnonymousModeEnabled"), false) , m_isQueueingEnabled(BITTORRENT_SESSION_KEY("QueueingSystemEnabled"), true) , m_maxActiveDownloads(BITTORRENT_SESSION_KEY("MaxActiveDownloads"), 3, lowerLimited(-1)) , m_maxActiveUploads(BITTORRENT_SESSION_KEY("MaxActiveUploads"), 3, lowerLimited(-1)) , m_maxActiveTorrents(BITTORRENT_SESSION_KEY("MaxActiveTorrents"), 5, lowerLimited(-1)) , m_ignoreSlowTorrentsForQueueing(BITTORRENT_SESSION_KEY("IgnoreSlowTorrentsForQueueing"), false) - , m_downloadRateForSlowTorrents(BITTORRENT_SESSION_KEY("SlowTorrentsDownloadRate"), 2) - , m_uploadRateForSlowTorrents(BITTORRENT_SESSION_KEY("SlowTorrentsUploadRate"), 2) - , m_slowTorrentsInactivityTimer(BITTORRENT_SESSION_KEY("SlowTorrentsInactivityTimer"), 60) , m_outgoingPortsMin(BITTORRENT_SESSION_KEY("OutgoingPortsMin"), 0) , m_outgoingPortsMax(BITTORRENT_SESSION_KEY("OutgoingPortsMax"), 0) , m_ignoreLimitsOnLAN(BITTORRENT_SESSION_KEY("IgnoreLimitsOnLAN"), true) @@ -308,18 +226,12 @@ , m_maxUploads(BITTORRENT_SESSION_KEY("MaxUploads"), -1, lowerLimited(0, -1)) , m_maxConnectionsPerTorrent(BITTORRENT_SESSION_KEY("MaxConnectionsPerTorrent"), 100, lowerLimited(0, -1)) , m_maxUploadsPerTorrent(BITTORRENT_SESSION_KEY("MaxUploadsPerTorrent"), -1, lowerLimited(0, -1)) - , m_btProtocol(BITTORRENT_SESSION_KEY("BTProtocol"), BTProtocol::Both - , clampValue(BTProtocol::Both, BTProtocol::UTP)) + , m_isUTPEnabled(BITTORRENT_SESSION_KEY("uTPEnabled"), true) , m_isUTPRateLimited(BITTORRENT_SESSION_KEY("uTPRateLimited"), true) - , m_utpMixedMode(BITTORRENT_SESSION_KEY("uTPMixedMode"), MixedModeAlgorithm::TCP - , clampValue(MixedModeAlgorithm::TCP, MixedModeAlgorithm::Proportional)) - , m_multiConnectionsPerIpEnabled(BITTORRENT_SESSION_KEY("MultiConnectionsPerIp"), false) , m_isAddTrackersEnabled(BITTORRENT_SESSION_KEY("AddTrackersEnabled"), false) , m_additionalTrackers(BITTORRENT_SESSION_KEY("AdditionalTrackers")) , m_globalMaxRatio(BITTORRENT_SESSION_KEY("GlobalMaxRatio"), -1, [](qreal r) { return r < 0 ? -1. : r;}) - , m_globalMaxSeedingMinutes(BITTORRENT_SESSION_KEY("GlobalMaxSeedingMinutes"), -1, lowerLimited(-1)) , m_isAddTorrentPaused(BITTORRENT_SESSION_KEY("AddTorrentPaused"), false) - , m_isCreateTorrentSubfolder(BITTORRENT_SESSION_KEY("CreateTorrentSubfolder"), true) , m_isAppendExtensionEnabled(BITTORRENT_SESSION_KEY("AddExtensionToIncompleteFiles"), false) , m_refreshInterval(BITTORRENT_SESSION_KEY("RefreshInterval"), 1500) , m_isPreallocationEnabled(BITTORRENT_SESSION_KEY("Preallocation"), false) @@ -331,7 +243,7 @@ , m_altGlobalUploadSpeedLimit(BITTORRENT_SESSION_KEY("AlternativeGlobalUPSpeedLimit"), 10, lowerLimited(0)) , m_isAltGlobalSpeedLimitEnabled(BITTORRENT_SESSION_KEY("UseAlternativeGlobalSpeedLimit"), false) , m_isBandwidthSchedulerEnabled(BITTORRENT_SESSION_KEY("BandwidthSchedulerEnabled"), false) - , m_saveResumeDataInterval(BITTORRENT_SESSION_KEY("SaveResumeDataInterval"), 60) + , m_saveResumeDataInterval(BITTORRENT_SESSION_KEY("SaveResumeDataInterval"), 3) , m_port(BITTORRENT_SESSION_KEY("Port"), 8999) , m_useRandomPort(BITTORRENT_SESSION_KEY("UseRandomPort"), false) , m_networkInterface(BITTORRENT_SESSION_KEY("Interface")) @@ -341,14 +253,9 @@ , m_encryption(BITTORRENT_SESSION_KEY("Encryption"), 0) , m_isForceProxyEnabled(BITTORRENT_SESSION_KEY("ForceProxy"), true) , m_isProxyPeerConnectionsEnabled(BITTORRENT_SESSION_KEY("ProxyPeerConnections"), false) - , m_chokingAlgorithm(BITTORRENT_SESSION_KEY("ChokingAlgorithm"), ChokingAlgorithm::FixedSlots - , clampValue(ChokingAlgorithm::FixedSlots, ChokingAlgorithm::RateBased)) - , m_seedChokingAlgorithm(BITTORRENT_SESSION_KEY("SeedChokingAlgorithm"), SeedChokingAlgorithm::FastestUpload - , clampValue(SeedChokingAlgorithm::RoundRobin, SeedChokingAlgorithm::AntiLeech)) , m_storedCategories(BITTORRENT_SESSION_KEY("Categories")) - , m_storedTags(BITTORRENT_SESSION_KEY("Tags")) , m_maxRatioAction(BITTORRENT_SESSION_KEY("MaxRatioAction"), Pause) - , m_defaultSavePath(BITTORRENT_SESSION_KEY("DefaultSavePath"), specialFolderLocation(SpecialFolder::Downloads), normalizePath) + , m_defaultSavePath(BITTORRENT_SESSION_KEY("DefaultSavePath"), Utils::Fs::QDesktopServicesDownloadLocation(), normalizePath) , m_tempPath(BITTORRENT_SESSION_KEY("TempPath"), defaultSavePath() + "temp/", normalizePath) , m_isSubcategoriesEnabled(BITTORRENT_SESSION_KEY("SubcategoriesEnabled"), false) , m_isTempPathEnabled(BITTORRENT_SESSION_KEY("TempPathEnabled"), false) @@ -357,35 +264,22 @@ , m_isDisableAutoTMMWhenDefaultSavePathChanged(BITTORRENT_SESSION_KEY("DisableAutoTMMTriggers/DefaultSavePathChanged"), true) , m_isDisableAutoTMMWhenCategorySavePathChanged(BITTORRENT_SESSION_KEY("DisableAutoTMMTriggers/CategorySavePathChanged"), true) , m_isTrackerEnabled(BITTORRENT_KEY("TrackerEnabled"), false) - , m_bannedIPs("State/BannedIPs" - , QStringList() - , [](const QStringList &value) - { - QStringList tmp = value; - tmp.sort(); - return tmp; - } - ) + , m_bannedIPs("State/BannedIPs") , m_wasPexEnabled(m_isPeXEnabled) , m_numResumeData(0) , m_extraLimit(0) , m_useProxy(false) - , m_recentErroredTorrentsTimer(new QTimer(this)) { - Logger *const logger = Logger::instance(); + Logger* const logger = Logger::instance(); initResumeFolder(); - m_recentErroredTorrentsTimer->setSingleShot(true); - m_recentErroredTorrentsTimer->setInterval(1000); - connect(m_recentErroredTorrentsTimer, &QTimer::timeout, this, [this]() { m_recentErroredTorrents.clear(); }); - - m_seedingLimitTimer = new QTimer(this); - m_seedingLimitTimer->setInterval(10000); - connect(m_seedingLimitTimer, &QTimer::timeout, this, &Session::processShareLimits); + m_bigRatioTimer = new QTimer(this); + m_bigRatioTimer->setInterval(10000); + connect(m_bigRatioTimer, SIGNAL(timeout()), SLOT(processBigRatios())); // Set severity level of libtorrent session - const int alertMask = libt::alert::error_notification + int alertMask = libt::alert::error_notification | libt::alert::peer_notification | libt::alert::port_mapping_notification | libt::alert::storage_notification @@ -393,7 +287,8 @@ | libt::alert::status_notification | libt::alert::ip_block_notification | libt::alert::progress_notification - | libt::alert::stats_notification; + | libt::alert::stats_notification + ; #if LIBTORRENT_VERSION_NUM < 10100 libt::fingerprint fingerprint(PEER_ID, QBT_VERSION_MAJOR, QBT_VERSION_MINOR, QBT_VERSION_BUGFIX, QBT_VERSION_BUILD); @@ -417,10 +312,7 @@ sessionSettings.auto_scrape_min_interval = 900; // 15 minutes sessionSettings.connection_speed = 20; // default is 10 sessionSettings.no_connect_privileged_ports = false; - // Disk cache pool is rarely tested in libtorrent and doesn't free buffers - // Soon to be deprecated there - // More info: https://github.com/arvidn/libtorrent/issues/2251 - sessionSettings.use_disk_cache_pool = false; + sessionSettings.seed_choking_algorithm = libt::session_settings::fastest_upload; configure(sessionSettings); m_nativeSession->set_settings(sessionSettings); configureListeningInterface(); @@ -429,12 +321,13 @@ dispatchAlerts(alertPtr.release()); }); #else - const std::string peerId = libt::generate_fingerprint(PEER_ID, QBT_VERSION_MAJOR, QBT_VERSION_MINOR, QBT_VERSION_BUGFIX, QBT_VERSION_BUILD); + std::string peerId = libt::generate_fingerprint(PEER_ID, QBT_VERSION_MAJOR, QBT_VERSION_MINOR, QBT_VERSION_BUGFIX, QBT_VERSION_BUILD); libt::settings_pack pack; pack.set_int(libt::settings_pack::alert_mask, alertMask); pack.set_str(libt::settings_pack::peer_fingerprint, peerId); pack.set_bool(libt::settings_pack::listen_system_port_fallback, false); pack.set_str(libt::settings_pack::user_agent, USER_AGENT); + pack.set_bool(libt::settings_pack::upnp_ignore_nonrouters, true); pack.set_bool(libt::settings_pack::use_dht_as_fallback, false); // Disable support for SSL torrents for now pack.set_int(libt::settings_pack::ssl_listen, 0); @@ -446,15 +339,7 @@ pack.set_int(libt::settings_pack::auto_scrape_min_interval, 900); // 15 minutes pack.set_int(libt::settings_pack::connection_speed, 20); // default is 10 pack.set_bool(libt::settings_pack::no_connect_privileged_ports, false); - // Disk cache pool is rarely tested in libtorrent and doesn't free buffers - // Soon to be deprecated there - // More info: https://github.com/arvidn/libtorrent/issues/2251 - pack.set_bool(libt::settings_pack::use_disk_cache_pool, false); - // libtorrent 1.1 enables UPnP & NAT-PMP by default - // turn them off before `libt::session` ctor to avoid split second effects - pack.set_bool(libt::settings_pack::enable_upnp, false); - pack.set_bool(libt::settings_pack::enable_natpmp, false); - pack.set_bool(libt::settings_pack::upnp_ignore_nonrouters, true); + pack.set_int(libt::settings_pack::seed_choking_algorithm, libt::settings_pack::fastest_upload); configure(pack); m_nativeSession = new libt::session(pack, 0); @@ -462,8 +347,6 @@ { QMetaObject::invokeMethod(this, "readAlerts", Qt::QueuedConnection); }); - - configurePeerClasses(); #endif // Enabling plugins @@ -473,7 +356,7 @@ m_nativeSession->add_extension(&libt::create_ut_pex_plugin); m_nativeSession->add_extension(&libt::create_smart_ban_plugin); - logger->addMessage(tr("Peer ID: ") + QString::fromStdString(peerId)); + logger->addMessage(tr("Peer ID: ") + Utils::String::fromStdString(peerId)); logger->addMessage(tr("HTTP User-Agent is '%1'").arg(USER_AGENT)); logger->addMessage(tr("DHT support [%1]").arg(isDHTEnabled() ? tr("ON") : tr("OFF")), Log::INFO); logger->addMessage(tr("Local Peer Discovery support [%1]").arg(isLSDEnabled() ? tr("ON") : tr("OFF")), Log::INFO); @@ -483,19 +366,10 @@ .arg(encryption() == 0 ? tr("ON") : encryption() == 1 ? tr("FORCED") : tr("OFF")) , Log::INFO); - if (isBandwidthSchedulerEnabled()) - enableBandwidthScheduler(); - - if (isIPFilteringEnabled()) { - // Manually banned IPs are handled in that function too(in the slots) + if (isIPFilteringEnabled()) enableIPFilter(); - } - else { - // Add the banned IPs - libt::ip_filter filter; - processBannedIPs(filter); - m_nativeSession->set_ip_filter(filter); - } + // Add the banned IPs + processBannedIPs(); m_categories = map_cast(m_storedCategories); if (isSubcategoriesEnabled()) { @@ -504,52 +378,41 @@ m_storedCategories = map_cast(m_categories); } - m_tags = QSet::fromList(m_storedTags.value()); - m_refreshTimer = new QTimer(this); m_refreshTimer->setInterval(refreshInterval()); - connect(m_refreshTimer, &QTimer::timeout, this, &Session::refresh); + connect(m_refreshTimer, SIGNAL(timeout()), SLOT(refresh())); m_refreshTimer->start(); + // Regular saving of fastresume data + m_resumeDataTimer = new QTimer(this); + m_resumeDataTimer->setInterval(saveResumeDataInterval() * 60 * 1000); + connect(m_resumeDataTimer, SIGNAL(timeout()), SLOT(generateResumeData())); + m_statistics = new Statistics(this); - updateSeedingLimitTimer(); + updateRatioTimer(); populateAdditionalTrackers(); enableTracker(isTrackerEnabled()); - connect(Net::ProxyConfigurationManager::instance(), &Net::ProxyConfigurationManager::proxyConfigurationChanged - , this, &Session::configureDeferred); + connect(Net::ProxyConfigurationManager::instance(), SIGNAL(proxyConfigurationChanged()), SLOT(configureDeferred())); // Network configuration monitor - connect(&m_networkManager, &QNetworkConfigurationManager::onlineStateChanged, this, &Session::networkOnlineStateChanged); - connect(&m_networkManager, &QNetworkConfigurationManager::configurationAdded, this, &Session::networkConfigurationChange); - connect(&m_networkManager, &QNetworkConfigurationManager::configurationRemoved, this, &Session::networkConfigurationChange); - connect(&m_networkManager, &QNetworkConfigurationManager::configurationChanged, this, &Session::networkConfigurationChange); + connect(&m_networkManager, SIGNAL(onlineStateChanged(bool)), SLOT(networkOnlineStateChanged(bool))); + connect(&m_networkManager, SIGNAL(configurationAdded(const QNetworkConfiguration&)), SLOT(networkConfigurationChange(const QNetworkConfiguration&))); + connect(&m_networkManager, SIGNAL(configurationRemoved(const QNetworkConfiguration&)), SLOT(networkConfigurationChange(const QNetworkConfiguration&))); + connect(&m_networkManager, SIGNAL(configurationChanged(const QNetworkConfiguration&)), SLOT(networkConfigurationChange(const QNetworkConfiguration&))); m_ioThread = new QThread(this); m_resumeDataSavingManager = new ResumeDataSavingManager(m_resumeFolderPath); m_resumeDataSavingManager->moveToThread(m_ioThread); - connect(m_ioThread, &QThread::finished, m_resumeDataSavingManager, &QObject::deleteLater); + connect(m_ioThread, SIGNAL(finished()), m_resumeDataSavingManager, SLOT(deleteLater())); m_ioThread->start(); - - // Regular saving of fastresume data - m_resumeDataTimer = new QTimer(this); - connect(m_resumeDataTimer, &QTimer::timeout, this, [this]() { generateResumeData(); }); - const uint saveInterval = saveResumeDataInterval(); - if (saveInterval > 0) { - m_resumeDataTimer->setInterval(saveInterval * 60 * 1000); - m_resumeDataTimer->start(); - } + m_resumeDataTimer->start(); // initialize PortForwarder instance Net::PortForwarder::initInstance(m_nativeSession); -#if LIBTORRENT_VERSION_NUM >= 10100 - initMetrics(); - m_statsUpdateTimer.start(); -#endif - qDebug("* BitTorrent Session constructed"); } @@ -683,20 +546,17 @@ return Utils::Fs::fromNativePath(m_tempPath); } -QString Session::torrentTempPath(const TorrentInfo &torrentInfo) const +QString Session::torrentTempPath(const InfoHash &hash) const { - if ((torrentInfo.filesCount() > 1) && !torrentInfo.hasRootFolder()) - return tempPath() - + QString::fromStdString(torrentInfo.nativeInfo()->orig_files().name()) - + '/'; - - return tempPath(); + return tempPath() + + static_cast(hash).left(7) + + "/"; } bool Session::isValidCategoryName(const QString &name) { - static const QRegularExpression re(R"(^([^\\\/]|[^\\\/]([^\\\/]|\/(?=[^\/]))*[^\\\/])$)"); - if (!name.isEmpty() && (name.indexOf(re) != 0)) { + QRegExp re(R"(^([^\\\/]|[^\\\/]([^\\\/]|\/(?=[^\/]))*[^\\\/])$)"); + if (!name.isEmpty() && (re.indexIn(name) != 0)) { qDebug() << "Incorrect category name:" << name; return false; } @@ -720,9 +580,9 @@ return result; } -const QStringMap &Session::categories() const +QStringList Session::categories() const { - return m_categories; + return m_categories.keys(); } QString Session::categorySavePath(const QString &categoryName) const @@ -768,7 +628,6 @@ if (categorySavePath(name) == savePath) return false; m_categories[name] = savePath; - m_storedCategories = map_cast(m_categories); if (isDisableAutoTMMWhenCategorySavePathChanged()) { foreach (TorrentHandle *const torrent, torrents()) if (torrent->category() == name) @@ -793,16 +652,14 @@ bool result = false; if (isSubcategoriesEnabled()) { // remove subcategories - const QString test = name + '/'; - Dict::removeIf(m_categories, [this, &test, &result](const QString &category, const QString &) - { + QString test = name + "/"; + foreach (const QString &category, m_categories.keys()) { if (category.startsWith(test)) { + m_categories.remove(category); result = true; emit categoryRemoved(category); - return true; } - return false; - }); + } } result = (m_categories.remove(name) > 0) || result; @@ -840,47 +697,6 @@ emit subcategoriesSupportChanged(); } -QSet Session::tags() const -{ - return m_tags; -} - -bool Session::isValidTag(const QString &tag) -{ - return (!tag.trimmed().isEmpty() && !tag.contains(',')); -} - -bool Session::hasTag(const QString &tag) const -{ - return m_tags.contains(tag); -} - -bool Session::addTag(const QString &tag) -{ - if (!isValidTag(tag)) - return false; - - if (!hasTag(tag)) { - m_tags.insert(tag); - m_storedTags = m_tags.toList(); - emit tagAdded(tag); - return true; - } - return false; -} - -bool Session::removeTag(const QString &tag) -{ - if (m_tags.remove(tag)) { - foreach (TorrentHandle *const torrent, torrents()) - torrent->removeTag(tag); - m_storedTags = m_tags.toList(); - emit tagRemoved(tag); - return true; - } - return false; -} - bool Session::isAutoTMMDisabledByDefault() const { return m_isAutoTMMDisabledByDefault; @@ -949,7 +765,7 @@ return m_globalMaxRatio; } -// Torrents with a ratio superior to the given value will +// Torrents will a ratio superior to the given value will // be automatically deleted void Session::setGlobalMaxRatio(qreal ratio) { @@ -958,23 +774,7 @@ if (ratio != globalMaxRatio()) { m_globalMaxRatio = ratio; - updateSeedingLimitTimer(); - } -} - -int Session::globalMaxSeedingMinutes() const -{ - return m_globalMaxSeedingMinutes; -} - -void Session::setGlobalMaxSeedingMinutes(int minutes) -{ - if (minutes < 0) - minutes = -1; - - if (minutes != globalMaxSeedingMinutes()) { - m_globalMaxSeedingMinutes = minutes; - updateSeedingLimitTimer(); + updateRatioTimer(); } } @@ -1005,15 +805,20 @@ void Session::initInstance() { - if (!m_instance) + if (!m_instance) { m_instance = new Session; + + // BandwidthScheduler::start() depends on Session being fully constructed + if (m_instance->isBandwidthSchedulerEnabled()) + m_instance->enableBandwidthScheduler(); + } } void Session::freeInstance() { if (m_instance) { delete m_instance; - m_instance = nullptr; + m_instance = 0; } } @@ -1037,19 +842,6 @@ } } -void Session::applyBandwidthLimits() -{ -#if LIBTORRENT_VERSION_NUM < 10100 - libt::session_settings sessionSettings(m_nativeSession->settings()); - applyBandwidthLimits(sessionSettings); - m_nativeSession->set_settings(sessionSettings); -#else - libt::settings_pack settingsPack = m_nativeSession->get_settings(); - applyBandwidthLimits(settingsPack); - m_nativeSession->apply_settings(settingsPack); -#endif -} - // Set BitTorrent session configuration void Session::configure() { @@ -1062,7 +854,6 @@ libt::settings_pack settingsPack = m_nativeSession->get_settings(); configure(settingsPack); m_nativeSession->apply_settings(settingsPack); - configurePeerClasses(); #endif if (m_IPFilteringChanged) { @@ -1077,9 +868,10 @@ qDebug("Session configured"); } -void Session::processBannedIPs(libt::ip_filter &filter) +void Session::processBannedIPs() { // First, import current filter + libt::ip_filter filter = m_nativeSession->get_ip_filter(); foreach (const QString &ip, m_bannedIPs.value()) { boost::system::error_code ec; libt::address addr = libt::address::from_string(ip.toLatin1().constData(), ec); @@ -1087,12 +879,14 @@ if (!ec) filter.add_rule(addr, addr, libt::ip_filter::blocked); } + + m_nativeSession->set_ip_filter(filter); } #if LIBTORRENT_VERSION_NUM >= 10100 void Session::adjustLimits(libt::settings_pack &settingsPack) { - // Internally increase the queue limits to ensure that the magnet is started + //Internally increase the queue limits to ensure that the magnet is started int maxDownloads = maxActiveDownloads(); int maxActive = maxActiveTorrents(); @@ -1102,98 +896,9 @@ , maxActive > -1 ? maxActive + m_extraLimit : maxActive); } -void Session::applyBandwidthLimits(libtorrent::settings_pack &settingsPack) -{ - const bool altSpeedLimitEnabled = isAltGlobalSpeedLimitEnabled(); - settingsPack.set_int(libt::settings_pack::download_rate_limit, altSpeedLimitEnabled ? altGlobalDownloadSpeedLimit() : globalDownloadSpeedLimit()); - settingsPack.set_int(libt::settings_pack::upload_rate_limit, altSpeedLimitEnabled ? altGlobalUploadSpeedLimit() : globalUploadSpeedLimit()); -} - -void Session::initMetrics() -{ - m_metricIndices.net.hasIncomingConnections = libt::find_metric_idx("net.has_incoming_connections"); - Q_ASSERT(m_metricIndices.net.hasIncomingConnections >= 0); - - m_metricIndices.net.sentPayloadBytes = libt::find_metric_idx("net.sent_payload_bytes"); - Q_ASSERT(m_metricIndices.net.sentPayloadBytes >= 0); - - m_metricIndices.net.recvPayloadBytes = libt::find_metric_idx("net.recv_payload_bytes"); - Q_ASSERT(m_metricIndices.net.recvPayloadBytes >= 0); - - m_metricIndices.net.sentBytes = libt::find_metric_idx("net.sent_bytes"); - Q_ASSERT(m_metricIndices.net.sentBytes >= 0); - - m_metricIndices.net.recvBytes = libt::find_metric_idx("net.recv_bytes"); - Q_ASSERT(m_metricIndices.net.recvBytes >= 0); - - m_metricIndices.net.sentIPOverheadBytes = libt::find_metric_idx("net.sent_ip_overhead_bytes"); - Q_ASSERT(m_metricIndices.net.sentIPOverheadBytes >= 0); - - m_metricIndices.net.recvIPOverheadBytes = libt::find_metric_idx("net.recv_ip_overhead_bytes"); - Q_ASSERT(m_metricIndices.net.recvIPOverheadBytes >= 0); - - m_metricIndices.net.sentTrackerBytes = libt::find_metric_idx("net.sent_tracker_bytes"); - Q_ASSERT(m_metricIndices.net.sentTrackerBytes >= 0); - - m_metricIndices.net.recvTrackerBytes = libt::find_metric_idx("net.recv_tracker_bytes"); - Q_ASSERT(m_metricIndices.net.recvTrackerBytes >= 0); - - m_metricIndices.net.recvRedundantBytes = libt::find_metric_idx("net.recv_redundant_bytes"); - Q_ASSERT(m_metricIndices.net.recvRedundantBytes >= 0); - - m_metricIndices.net.recvFailedBytes = libt::find_metric_idx("net.recv_failed_bytes"); - Q_ASSERT(m_metricIndices.net.recvFailedBytes >= 0); - - m_metricIndices.peer.numPeersConnected = libt::find_metric_idx("peer.num_peers_connected"); - Q_ASSERT(m_metricIndices.peer.numPeersConnected >= 0); - - m_metricIndices.peer.numPeersDownDisk = libt::find_metric_idx("peer.num_peers_down_disk"); - Q_ASSERT(m_metricIndices.peer.numPeersDownDisk >= 0); - - m_metricIndices.peer.numPeersUpDisk = libt::find_metric_idx("peer.num_peers_up_disk"); - Q_ASSERT(m_metricIndices.peer.numPeersUpDisk >= 0); - - m_metricIndices.dht.dhtBytesIn = libt::find_metric_idx("dht.dht_bytes_in"); - Q_ASSERT(m_metricIndices.dht.dhtBytesIn >= 0); - - m_metricIndices.dht.dhtBytesOut = libt::find_metric_idx("dht.dht_bytes_out"); - Q_ASSERT(m_metricIndices.dht.dhtBytesOut >= 0); - - m_metricIndices.dht.dhtNodes = libt::find_metric_idx("dht.dht_nodes"); - Q_ASSERT(m_metricIndices.dht.dhtNodes >= 0); - - m_metricIndices.disk.diskBlocksInUse = libt::find_metric_idx("disk.disk_blocks_in_use"); - Q_ASSERT(m_metricIndices.disk.diskBlocksInUse >= 0); - - m_metricIndices.disk.numBlocksRead = libt::find_metric_idx("disk.num_blocks_read"); - Q_ASSERT(m_metricIndices.disk.numBlocksRead >= 0); - - m_metricIndices.disk.numBlocksCacheHits = libt::find_metric_idx("disk.num_blocks_cache_hits"); - Q_ASSERT(m_metricIndices.disk.numBlocksCacheHits >= 0); - - m_metricIndices.disk.writeJobs = libt::find_metric_idx("disk.num_write_ops"); - Q_ASSERT(m_metricIndices.disk.writeJobs >= 0); - - m_metricIndices.disk.readJobs = libt::find_metric_idx("disk.num_read_ops"); - Q_ASSERT(m_metricIndices.disk.readJobs >= 0); - - m_metricIndices.disk.hashJobs = libt::find_metric_idx("disk.num_blocks_hashed"); - Q_ASSERT(m_metricIndices.disk.hashJobs >= 0); - - m_metricIndices.disk.queuedDiskJobs = libt::find_metric_idx("disk.queued_disk_jobs"); - Q_ASSERT(m_metricIndices.disk.queuedDiskJobs >= 0); - - m_metricIndices.disk.diskJobTime = libt::find_metric_idx("disk.disk_job_time"); - Q_ASSERT(m_metricIndices.disk.diskJobTime >= 0); -} - void Session::configure(libtorrent::settings_pack &settingsPack) { - Logger *const logger = Logger::instance(); - -#ifdef Q_OS_WIN - QString chosenIP; -#endif + Logger* const logger = Logger::instance(); if (m_listenInterfaceChanged) { const ushort port = this->port(); @@ -1224,41 +929,23 @@ .arg(ip).arg(port) , Log::INFO); settingsPack.set_str(libt::settings_pack::listen_interfaces, interfacesStr); -#ifdef Q_OS_WIN - chosenIP = ip; -#endif break; } } -#ifdef Q_OS_WIN - // On Vista+ versions and after Qt 5.5 QNetworkInterface::name() returns - // the interface's Luid and not the GUID. - // Libtorrent expects GUIDs for the 'outgoing_interfaces' setting. - if (!networkInterface().isEmpty()) { - QString guid = convertIfaceNameToGuid(networkInterface()); - if (!guid.isEmpty()) { - settingsPack.set_str(libt::settings_pack::outgoing_interfaces, guid.toStdString()); - } - else { - settingsPack.set_str(libt::settings_pack::outgoing_interfaces, chosenIP.toStdString()); - LogMsg(tr("Could not get GUID of configured network interface. Binding to IP %1").arg(chosenIP) - , Log::WARNING); - } - } -#else settingsPack.set_str(libt::settings_pack::outgoing_interfaces, networkInterface().toStdString()); -#endif m_listenInterfaceChanged = false; } - applyBandwidthLimits(settingsPack); + const bool altSpeedLimitEnabled = isAltGlobalSpeedLimitEnabled(); + settingsPack.set_int(libt::settings_pack::download_rate_limit, altSpeedLimitEnabled ? altGlobalDownloadSpeedLimit() : globalDownloadSpeedLimit()); + settingsPack.set_int(libt::settings_pack::upload_rate_limit, altSpeedLimitEnabled ? altGlobalUploadSpeedLimit() : globalUploadSpeedLimit()); // The most secure, rc4 only so that all streams are encrypted settingsPack.set_int(libt::settings_pack::allowed_enc_level, libt::settings_pack::pe_rc4); settingsPack.set_bool(libt::settings_pack::prefer_rc4, true); switch (encryption()) { - case 0: // Enabled + case 0: //Enabled settingsPack.set_int(libt::settings_pack::out_enc_policy, libt::settings_pack::pe_enabled); settingsPack.set_int(libt::settings_pack::in_enc_policy, libt::settings_pack::pe_enabled); break; @@ -1275,11 +962,11 @@ Net::ProxyConfiguration proxyConfig = proxyManager->proxyConfiguration(); if (m_useProxy || (proxyConfig.type != Net::ProxyType::None)) { if (proxyConfig.type != Net::ProxyType::None) { - settingsPack.set_str(libt::settings_pack::proxy_hostname, proxyConfig.ip.toStdString()); + settingsPack.set_str(libt::settings_pack::proxy_hostname, Utils::String::toStdString(proxyConfig.ip)); settingsPack.set_int(libt::settings_pack::proxy_port, proxyConfig.port); if (proxyManager->isAuthenticationRequired()) { - settingsPack.set_str(libt::settings_pack::proxy_username, proxyConfig.username.toStdString()); - settingsPack.set_str(libt::settings_pack::proxy_password, proxyConfig.password.toStdString()); + settingsPack.set_str(libt::settings_pack::proxy_username, Utils::String::toStdString(proxyConfig.username)); + settingsPack.set_str(libt::settings_pack::proxy_password, Utils::String::toStdString(proxyConfig.password)); } settingsPack.set_bool(libt::settings_pack::proxy_peer_connections, isProxyPeerConnectionsEnabled()); } @@ -1308,13 +995,12 @@ } settingsPack.set_bool(libt::settings_pack::force_proxy, m_useProxy ? isForceProxyEnabled() : false); - settingsPack.set_bool(libt::settings_pack::announce_to_all_trackers, announceToAllTrackers()); - settingsPack.set_bool(libt::settings_pack::announce_to_all_tiers, announceToAllTiers()); - - settingsPack.set_int(libt::settings_pack::aio_threads, asyncIOThreads()); + const bool announceToAll = announceToAllTrackers(); + settingsPack.set_bool(libt::settings_pack::announce_to_all_trackers, announceToAll); + settingsPack.set_bool(libt::settings_pack::announce_to_all_tiers, announceToAll); - const int cacheSize = (diskCacheSize() > -1) ? (diskCacheSize() * 64) : -1; - settingsPack.set_int(libt::settings_pack::cache_size, cacheSize); + const int cacheSize = diskCacheSize(); + settingsPack.set_int(libt::settings_pack::cache_size, (cacheSize > 0) ? cacheSize * 64 : -1); settingsPack.set_int(libt::settings_pack::cache_expiry, diskCacheTTL()); qDebug() << "Using a disk cache size of" << cacheSize << "MiB"; @@ -1322,17 +1008,6 @@ : libt::settings_pack::disable_os_cache; settingsPack.set_int(libt::settings_pack::disk_io_read_mode, mode); settingsPack.set_int(libt::settings_pack::disk_io_write_mode, mode); - settingsPack.set_bool(libt::settings_pack::guided_read_cache, isGuidedReadCacheEnabled()); - - settingsPack.set_bool(libt::settings_pack::coalesce_reads, isCoalesceReadWriteEnabled()); - settingsPack.set_bool(libt::settings_pack::coalesce_writes, isCoalesceReadWriteEnabled()); - - settingsPack.set_int(libt::settings_pack::suggest_mode, isSuggestModeEnabled() - ? libt::settings_pack::suggest_read_cache : libt::settings_pack::no_piece_suggestions); - - settingsPack.set_int(libt::settings_pack::send_buffer_watermark, sendBufferWatermark() * 1024); - settingsPack.set_int(libt::settings_pack::send_buffer_low_watermark, sendBufferLowWatermark() * 1024); - settingsPack.set_int(libt::settings_pack::send_buffer_watermark_factor, sendBufferWatermarkFactor()); settingsPack.set_bool(libt::settings_pack::anonymous_mode, isAnonymousModeEnabled()); @@ -1342,9 +1017,6 @@ settingsPack.set_int(libt::settings_pack::active_seeds, maxActiveUploads()); settingsPack.set_bool(libt::settings_pack::dont_count_slow_torrents, ignoreSlowTorrentsForQueueing()); - settingsPack.set_int(libt::settings_pack::inactive_down_rate, downloadRateForSlowTorrents() * 1024); // KiB to Bytes - settingsPack.set_int(libt::settings_pack::inactive_up_rate, uploadRateForSlowTorrents() * 1024); // KiB to Bytes - settingsPack.set_int(libt::settings_pack::auto_manage_startup, slowTorrentsInactivityTimer()); } else { settingsPack.set_int(libt::settings_pack::active_downloads, -1); @@ -1354,58 +1026,38 @@ settingsPack.set_int(libt::settings_pack::active_tracker_limit, -1); settingsPack.set_int(libt::settings_pack::active_dht_limit, -1); settingsPack.set_int(libt::settings_pack::active_lsd_limit, -1); - settingsPack.set_int(libt::settings_pack::alert_queue_size, std::numeric_limits::max() / 2); + // 1 active torrent force 2 connections. If you have more active torrents * 2 than connection limit, + // connection limit will get extended. Multiply max connections or active torrents by 10 for queue. + // Ignore -1 values because we don't want to set a max int message queue + settingsPack.set_int(libt::settings_pack::alert_queue_size, std::max(1000, + 10 * std::max(maxActiveTorrents() * 2, maxConnections()))); // Outgoing ports settingsPack.set_int(libt::settings_pack::outgoing_port, outgoingPortsMin()); settingsPack.set_int(libt::settings_pack::num_outgoing_ports, outgoingPortsMax() - outgoingPortsMin() + 1); + // Ignore limits on LAN + settingsPack.set_bool(libt::settings_pack::ignore_limits_on_local_network, ignoreLimitsOnLAN()); // Include overhead in transfer limits settingsPack.set_bool(libt::settings_pack::rate_limit_ip_overhead, includeOverheadInLimits()); // IP address to announce to trackers - settingsPack.set_str(libt::settings_pack::announce_ip, announceIP().toStdString()); + settingsPack.set_str(libt::settings_pack::announce_ip, Utils::String::toStdString(announceIP())); // Super seeding settingsPack.set_bool(libt::settings_pack::strict_super_seeding, isSuperSeedingEnabled()); + // * Max Half-open connections + settingsPack.set_int(libt::settings_pack::half_open_limit, maxHalfOpenConnections()); // * Max connections limit settingsPack.set_int(libt::settings_pack::connections_limit, maxConnections()); // * Global max upload slots settingsPack.set_int(libt::settings_pack::unchoke_slots_limit, maxUploads()); // uTP - switch (btProtocol()) { - case BTProtocol::Both: - default: - settingsPack.set_bool(libt::settings_pack::enable_incoming_tcp, true); - settingsPack.set_bool(libt::settings_pack::enable_outgoing_tcp, true); - settingsPack.set_bool(libt::settings_pack::enable_incoming_utp, true); - settingsPack.set_bool(libt::settings_pack::enable_outgoing_utp, true); - break; - - case BTProtocol::TCP: - settingsPack.set_bool(libt::settings_pack::enable_incoming_tcp, true); - settingsPack.set_bool(libt::settings_pack::enable_outgoing_tcp, true); - settingsPack.set_bool(libt::settings_pack::enable_incoming_utp, false); - settingsPack.set_bool(libt::settings_pack::enable_outgoing_utp, false); - break; - - case BTProtocol::UTP: - settingsPack.set_bool(libt::settings_pack::enable_incoming_tcp, false); - settingsPack.set_bool(libt::settings_pack::enable_outgoing_tcp, false); - settingsPack.set_bool(libt::settings_pack::enable_incoming_utp, true); - settingsPack.set_bool(libt::settings_pack::enable_outgoing_utp, true); - break; - } - - switch (utpMixedMode()) { - case MixedModeAlgorithm::TCP: - default: - settingsPack.set_int(libt::settings_pack::mixed_mode_algorithm, libt::settings_pack::prefer_tcp); - break; - case MixedModeAlgorithm::Proportional: - settingsPack.set_int(libt::settings_pack::mixed_mode_algorithm, libt::settings_pack::peer_proportional); - break; - } - - settingsPack.set_bool(libt::settings_pack::allow_multiple_connections_per_ip, multiConnectionsPerIpEnabled()); + settingsPack.set_bool(libt::settings_pack::enable_incoming_utp, isUTPEnabled()); + settingsPack.set_bool(libt::settings_pack::enable_outgoing_utp, isUTPEnabled()); + // uTP rate limiting + settingsPack.set_bool(libt::settings_pack::rate_limit_utp, isUTPRateLimited()); + settingsPack.set_int(libt::settings_pack::mixed_mode_algorithm, isUTPRateLimited() + ? libt::settings_pack::prefer_tcp + : libt::settings_pack::peer_proportional); settingsPack.set_bool(libt::settings_pack::apply_ip_filter_to_trackers, isTrackerFilteringEnabled()); @@ -1413,135 +1065,32 @@ if (isDHTEnabled()) settingsPack.set_str(libt::settings_pack::dht_bootstrap_nodes, "dht.libtorrent.org:25401,router.bittorrent.com:6881,router.utorrent.com:6881,dht.transmissionbt.com:6881,dht.aelitis.com:6881"); settingsPack.set_bool(libt::settings_pack::enable_lsd, isLSDEnabled()); - - switch (chokingAlgorithm()) { - case ChokingAlgorithm::FixedSlots: - default: - settingsPack.set_int(libt::settings_pack::choking_algorithm, libt::settings_pack::fixed_slots_choker); - break; - case ChokingAlgorithm::RateBased: - settingsPack.set_int(libt::settings_pack::choking_algorithm, libt::settings_pack::rate_based_choker); - break; - } - - switch (seedChokingAlgorithm()) { - case SeedChokingAlgorithm::RoundRobin: - settingsPack.set_int(libt::settings_pack::seed_choking_algorithm, libt::settings_pack::round_robin); - break; - case SeedChokingAlgorithm::FastestUpload: - default: - settingsPack.set_int(libt::settings_pack::seed_choking_algorithm, libt::settings_pack::fastest_upload); - break; - case SeedChokingAlgorithm::AntiLeech: - settingsPack.set_int(libt::settings_pack::seed_choking_algorithm, libt::settings_pack::anti_leech); - break; - } -} - -void Session::configurePeerClasses() -{ - libt::ip_filter f; - // address_v4::from_string("255.255.255.255") crashes on some people's systems - // so instead we use address_v4::broadcast() - // Proactively do the same for 0.0.0.0 and address_v4::any() - f.add_rule(libt::address_v4::any() - , libt::address_v4::broadcast() - , 1 << libt::session::global_peer_class_id); -#if TORRENT_USE_IPV6 - // IPv6 may not be available on OS and the parsing - // would result in an exception -> abnormal program termination - // Affects Windows XP - try { - f.add_rule(libt::address_v6::from_string("::0") - , libt::address_v6::from_string("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff") - , 1 << libt::session::global_peer_class_id); - } - catch (std::exception &) {} -#endif - if (ignoreLimitsOnLAN()) { - // local networks - f.add_rule(libt::address_v4::from_string("10.0.0.0") - , libt::address_v4::from_string("10.255.255.255") - , 1 << libt::session::local_peer_class_id); - f.add_rule(libt::address_v4::from_string("172.16.0.0") - , libt::address_v4::from_string("172.31.255.255") - , 1 << libt::session::local_peer_class_id); - f.add_rule(libt::address_v4::from_string("192.168.0.0") - , libt::address_v4::from_string("192.168.255.255") - , 1 << libt::session::local_peer_class_id); - // link local - f.add_rule(libt::address_v4::from_string("169.254.0.0") - , libt::address_v4::from_string("169.254.255.255") - , 1 << libt::session::local_peer_class_id); - // loopback - f.add_rule(libt::address_v4::from_string("127.0.0.0") - , libt::address_v4::from_string("127.255.255.255") - , 1 << libt::session::local_peer_class_id); -#if TORRENT_USE_IPV6 - // IPv6 may not be available on OS and the parsing - // would result in an exception -> abnormal program termination - // Affects Windows XP - try { - // link local - f.add_rule(libt::address_v6::from_string("fe80::") - , libt::address_v6::from_string("febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff") - , 1 << libt::session::local_peer_class_id); - // unique local addresses - f.add_rule(libt::address_v6::from_string("fc00::") - , libt::address_v6::from_string("fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff") - , 1 << libt::session::local_peer_class_id); - // loopback - f.add_rule(libt::address_v6::from_string("::1") - , libt::address_v6::from_string("::1") - , 1 << libt::session::local_peer_class_id); - } - catch (std::exception &) {} -#endif - } - m_nativeSession->set_peer_class_filter(f); - - libt::peer_class_type_filter peerClassTypeFilter; - peerClassTypeFilter.add(libt::peer_class_type_filter::tcp_socket, libt::session::tcp_peer_class_id); - peerClassTypeFilter.add(libt::peer_class_type_filter::ssl_tcp_socket, libt::session::tcp_peer_class_id); - peerClassTypeFilter.add(libt::peer_class_type_filter::i2p_socket, libt::session::tcp_peer_class_id); - if (!isUTPRateLimited()) { - peerClassTypeFilter.disallow(libt::peer_class_type_filter::utp_socket - , libt::session::global_peer_class_id); - peerClassTypeFilter.disallow(libt::peer_class_type_filter::ssl_utp_socket - , libt::session::global_peer_class_id); - } - m_nativeSession->set_peer_class_type_filter(peerClassTypeFilter); } #else void Session::adjustLimits(libt::session_settings &sessionSettings) { - // Internally increase the queue limits to ensure that the magnet is started + //Internally increase the queue limits to ensure that the magnet is started int maxDownloads = maxActiveDownloads(); int maxActive = maxActiveTorrents(); - sessionSettings.active_downloads = (maxDownloads > -1) ? (maxDownloads + m_extraLimit) : maxDownloads; - sessionSettings.active_limit = (maxActive > -1) ? (maxActive + m_extraLimit) : maxActive; + sessionSettings.active_downloads = maxDownloads > -1 ? maxDownloads + m_extraLimit : maxDownloads; + sessionSettings.active_limit = maxActive > -1 ? maxActive + m_extraLimit : maxActive; } -void Session::applyBandwidthLimits(libt::session_settings &sessionSettings) +void Session::configure(libtorrent::session_settings &sessionSettings) { const bool altSpeedLimitEnabled = isAltGlobalSpeedLimitEnabled(); sessionSettings.download_rate_limit = altSpeedLimitEnabled ? altGlobalDownloadSpeedLimit() : globalDownloadSpeedLimit(); sessionSettings.upload_rate_limit = altSpeedLimitEnabled ? altGlobalUploadSpeedLimit() : globalUploadSpeedLimit(); -} - -void Session::configure(libtorrent::session_settings &sessionSettings) -{ - applyBandwidthLimits(sessionSettings); // The most secure, rc4 only so that all streams are encrypted libt::pe_settings encryptionSettings; encryptionSettings.allowed_enc_level = libt::pe_settings::rc4; encryptionSettings.prefer_rc4 = true; switch (encryption()) { - case 0: // Enabled + case 0: //Enabled encryptionSettings.out_enc_policy = libt::pe_settings::enabled; encryptionSettings.in_enc_policy = libt::pe_settings::enabled; break; @@ -1560,11 +1109,11 @@ if (m_useProxy || (proxyConfig.type != Net::ProxyType::None)) { libt::proxy_settings proxySettings; if (proxyConfig.type != Net::ProxyType::None) { - proxySettings.hostname = proxyConfig.ip.toStdString(); + proxySettings.hostname = Utils::String::toStdString(proxyConfig.ip); proxySettings.port = proxyConfig.port; if (proxyManager->isAuthenticationRequired()) { - proxySettings.username = proxyConfig.username.toStdString(); - proxySettings.password = proxyConfig.password.toStdString(); + proxySettings.username = Utils::String::toStdString(proxyConfig.username); + proxySettings.password = Utils::String::toStdString(proxyConfig.password); } proxySettings.proxy_peer_connections = isProxyPeerConnectionsEnabled(); } @@ -1594,23 +1143,17 @@ } sessionSettings.force_proxy = m_useProxy ? isForceProxyEnabled() : false; - sessionSettings.announce_to_all_trackers = announceToAllTrackers(); - sessionSettings.announce_to_all_tiers = announceToAllTiers(); - const int cacheSize = (diskCacheSize() > -1) ? (diskCacheSize() * 64) : -1; - sessionSettings.cache_size = cacheSize; + bool announceToAll = announceToAllTrackers(); + sessionSettings.announce_to_all_trackers = announceToAll; + sessionSettings.announce_to_all_tiers = announceToAll; + int cacheSize = diskCacheSize(); + sessionSettings.cache_size = (cacheSize > 0) ? cacheSize * 64 : -1; sessionSettings.cache_expiry = diskCacheTTL(); qDebug() << "Using a disk cache size of" << cacheSize << "MiB"; libt::session_settings::io_buffer_mode_t mode = useOSCache() ? libt::session_settings::enable_os_cache : libt::session_settings::disable_os_cache; sessionSettings.disk_io_read_mode = mode; sessionSettings.disk_io_write_mode = mode; - sessionSettings.guided_read_cache = isGuidedReadCacheEnabled(); - sessionSettings.suggest_mode = isSuggestModeEnabled() - ? libt::session_settings::suggest_read_cache : libt::session_settings::no_piece_suggestions; - - sessionSettings.send_buffer_watermark = sendBufferWatermark() * 1024; - sessionSettings.send_buffer_low_watermark = sendBufferLowWatermark() * 1024; - sessionSettings.send_buffer_watermark_factor = sendBufferWatermarkFactor(); sessionSettings.anonymous_mode = isAnonymousModeEnabled(); @@ -1629,7 +1172,11 @@ sessionSettings.active_tracker_limit = -1; sessionSettings.active_dht_limit = -1; sessionSettings.active_lsd_limit = -1; - sessionSettings.alert_queue_size = std::numeric_limits::max() / 2; + // 1 active torrent force 2 connections. If you have more active torrents * 2 than connection limit, + // connection limit will get extended. Multiply max connections or active torrents by 10 for queue. + // Ignore -1 values because we don't want to set a max int message queue + sessionSettings.alert_queue_size = std::max(1000, + 10 * std::max(maxActiveTorrents() * 2, maxConnections())); // Outgoing ports sessionSettings.outgoing_ports = std::make_pair(outgoingPortsMin(), outgoingPortsMax()); @@ -1639,7 +1186,7 @@ // Include overhead in transfer limits sessionSettings.rate_limit_ip_overhead = includeOverheadInLimits(); // IP address to announce to trackers - sessionSettings.announce_ip = announceIP().toStdString(); + sessionSettings.announce_ip = Utils::String::toStdString(announceIP()); // Super seeding sessionSettings.strict_super_seeding = isSuperSeedingEnabled(); // * Max Half-open connections @@ -1649,43 +1196,13 @@ // * Global max upload slots sessionSettings.unchoke_slots_limit = maxUploads(); // uTP - switch (btProtocol()) { - case BTProtocol::Both: - default: - sessionSettings.enable_incoming_tcp = true; - sessionSettings.enable_outgoing_tcp = true; - sessionSettings.enable_incoming_utp = true; - sessionSettings.enable_outgoing_utp = true; - break; - - case BTProtocol::TCP: - sessionSettings.enable_incoming_tcp = true; - sessionSettings.enable_outgoing_tcp = true; - sessionSettings.enable_incoming_utp = false; - sessionSettings.enable_outgoing_utp = false; - break; - - case BTProtocol::UTP: - sessionSettings.enable_incoming_tcp = false; - sessionSettings.enable_outgoing_tcp = false; - sessionSettings.enable_incoming_utp = true; - sessionSettings.enable_outgoing_utp = true; - break; - } - + sessionSettings.enable_incoming_utp = isUTPEnabled(); + sessionSettings.enable_outgoing_utp = isUTPEnabled(); // uTP rate limiting sessionSettings.rate_limit_utp = isUTPRateLimited(); - switch (utpMixedMode()) { - case MixedModeAlgorithm::TCP: - default: - sessionSettings.mixed_mode_algorithm = libt::session_settings::prefer_tcp; - break; - case MixedModeAlgorithm::Proportional: - sessionSettings.mixed_mode_algorithm = libt::session_settings::peer_proportional; - break; - } - - sessionSettings.allow_multiple_connections_per_ip = multiConnectionsPerIpEnabled(); + sessionSettings.mixed_mode_algorithm = isUTPRateLimited() + ? libt::session_settings::prefer_tcp + : libt::session_settings::peer_proportional; sessionSettings.apply_ip_filter_to_trackers = isTrackerFilteringEnabled(); @@ -1706,29 +1223,6 @@ m_nativeSession->start_lsd(); else m_nativeSession->stop_lsd(); - - switch (chokingAlgorithm()) { - case ChokingAlgorithm::FixedSlots: - default: - sessionSettings.choking_algorithm = libt::session_settings::fixed_slots_choker; - break; - case ChokingAlgorithm::RateBased: - sessionSettings.choking_algorithm = libt::session_settings::rate_based_choker; - break; - } - - switch (seedChokingAlgorithm()) { - case SeedChokingAlgorithm::RoundRobin: - sessionSettings.seed_choking_algorithm = libt::session_settings::round_robin; - break; - case SeedChokingAlgorithm::FastestUpload: - default: - sessionSettings.seed_choking_algorithm = libt::session_settings::fastest_upload; - break; - case SeedChokingAlgorithm::AntiLeech: - sessionSettings.seed_choking_algorithm = libt::session_settings::anti_leech; - break; - } } #endif @@ -1756,8 +1250,7 @@ { if (!m_bwScheduler) { m_bwScheduler = new BandwidthScheduler(this); - connect(m_bwScheduler.data(), &BandwidthScheduler::bandwidthLimitRequested - , this, &Session::setAltGlobalSpeedLimitEnabled); + connect(m_bwScheduler.data(), SIGNAL(switchToAlternativeMode(bool)), this, SLOT(switchToAlternativeMode(bool))); } m_bwScheduler->start(); } @@ -1765,64 +1258,43 @@ void Session::populateAdditionalTrackers() { m_additionalTrackerList.clear(); - foreach (QString tracker, additionalTrackers().split('\n')) { + foreach (QString tracker, additionalTrackers().split("\n")) { tracker = tracker.trimmed(); if (!tracker.isEmpty()) m_additionalTrackerList << tracker; } } -void Session::processShareLimits() +void Session::processBigRatios() { - qDebug("Processing share limits..."); + qDebug("Process big ratios..."); + qreal globalMaxRatio = this->globalMaxRatio(); foreach (TorrentHandle *const torrent, m_torrents) { - if (torrent->isSeed() && !torrent->isForced()) { - if (torrent->ratioLimit() != TorrentHandle::NO_RATIO_LIMIT) { - const qreal ratio = torrent->realRatio(); - qreal ratioLimit = torrent->ratioLimit(); - if (ratioLimit == TorrentHandle::USE_GLOBAL_RATIO) - // If Global Max Ratio is really set... - ratioLimit = globalMaxRatio(); - - if (ratioLimit >= 0) { - qDebug("Ratio: %f (limit: %f)", ratio, ratioLimit); - - if ((ratio <= TorrentHandle::MAX_RATIO) && (ratio >= ratioLimit)) { - Logger *const logger = Logger::instance(); - if (m_maxRatioAction == Remove) { - logger->addMessage(tr("'%1' reached the maximum ratio you set. Removed.").arg(torrent->name())); - deleteTorrent(torrent->hash()); - } - else if (!torrent->isPaused()) { - torrent->pause(); - logger->addMessage(tr("'%1' reached the maximum ratio you set. Paused.").arg(torrent->name())); - } - continue; - } + if (torrent->isSeed() + && (torrent->ratioLimit() != TorrentHandle::NO_RATIO_LIMIT) + && !torrent->isForced()) { + const qreal ratio = torrent->realRatio(); + qreal ratioLimit = torrent->ratioLimit(); + if (ratioLimit == TorrentHandle::USE_GLOBAL_RATIO) { + // If Global Max Ratio is really set... + ratioLimit = globalMaxRatio; + if (ratioLimit < 0) continue; + } + qDebug("Ratio: %f (limit: %f)", ratio, ratioLimit); + Q_ASSERT(ratioLimit >= 0.f); + + if ((ratio <= TorrentHandle::MAX_RATIO) && (ratio >= ratioLimit)) { + Logger* const logger = Logger::instance(); + if (maxRatioAction() == Remove) { + logger->addMessage(tr("'%1' reached the maximum ratio you set. Removing...").arg(torrent->name())); + deleteTorrent(torrent->hash()); } - } - - if (torrent->seedingTimeLimit() != TorrentHandle::NO_SEEDING_TIME_LIMIT) { - const int seedingTimeInMinutes = torrent->seedingTime() / 60; - int seedingTimeLimit = torrent->seedingTimeLimit(); - if (seedingTimeLimit == TorrentHandle::USE_GLOBAL_SEEDING_TIME) - // If Global Seeding Time Limit is really set... - seedingTimeLimit = globalMaxSeedingMinutes(); - - if (seedingTimeLimit >= 0) { - qDebug("Seeding Time: %d (limit: %d)", seedingTimeInMinutes, seedingTimeLimit); - - if ((seedingTimeInMinutes <= TorrentHandle::MAX_SEEDING_TIME) && (seedingTimeInMinutes >= seedingTimeLimit)) { - Logger *const logger = Logger::instance(); - if (m_maxRatioAction == Remove) { - logger->addMessage(tr("'%1' reached the maximum seeding time you set. Removed.").arg(torrent->name())); - deleteTorrent(torrent->hash()); - } - else if (!torrent->isPaused()) { - torrent->pause(); - logger->addMessage(tr("'%1' reached the maximum seeding time you set. Paused.").arg(torrent->name())); - } + else { + // Pause it + if (!torrent->isPaused()) { + logger->addMessage(tr("'%1' reached the maximum ratio you set. Pausing...").arg(torrent->name())); + torrent->pause(); } } } @@ -1840,11 +1312,17 @@ addTorrent_impl(m_downloadedTorrents.take(url), MagnetUri(magnetUri)); } +void Session::switchToAlternativeMode(bool alternative) +{ + changeSpeedLimitMode_impl(alternative); +} + // Add to BitTorrent session the downloaded torrent file -void Session::handleDownloadFinished(const QString &url, const QByteArray &data) +void Session::handleDownloadFinished(const QString &url, const QString &filePath) { emit downloadFromUrlFinished(url); - addTorrent_impl(m_downloadedTorrents.take(url), MagnetUri(), TorrentInfo::load(data)); + addTorrent_impl(m_downloadedTorrents.take(url), MagnetUri(), TorrentInfo::loadFromFile(filePath)); + Utils::Fs::forceRemove(filePath); // remove temporary file } // Return the torrent handle, given its hash @@ -1855,26 +1333,20 @@ bool Session::hasActiveTorrents() const { - return std::any_of(m_torrents.begin(), m_torrents.end(), [](TorrentHandle *torrent) - { - return TorrentFilter::ActiveTorrent.match(torrent); - }); + foreach (TorrentHandle *const torrent, m_torrents) + if (TorrentFilter::ActiveTorrent.match(torrent)) + return true; + + return false; } bool Session::hasUnfinishedTorrents() const { - return std::any_of(m_torrents.begin(), m_torrents.end(), [](const TorrentHandle *torrent) - { - return (!torrent->isSeed() && !torrent->isPaused()); - }); -} + foreach (TorrentHandle *const torrent, m_torrents) + if (!torrent->isSeed() && !torrent->isPaused()) + return true; -bool Session::hasRunningSeed() const -{ - return std::any_of(m_torrents.begin(), m_torrents.end(), [](const TorrentHandle *torrent) - { - return (torrent->isSeed() && !torrent->isPaused()); - }); + return false; } void Session::banIP(const QString &ip) @@ -1890,7 +1362,6 @@ m_nativeSession->set_ip_filter(filter); bannedIPs << ip; - bannedIPs.sort(); m_bannedIPs = bannedIPs; } } @@ -1902,24 +1373,22 @@ TorrentHandle *const torrent = m_torrents.take(hash); if (!torrent) return false; - qDebug("Deleting torrent with hash: %s", qUtf8Printable(torrent->hash())); + qDebug("Deleting torrent with hash: %s", qPrintable(torrent->hash())); emit torrentAboutToBeRemoved(torrent); // Remove it from session if (deleteLocalFiles) { - QString rootPath = torrent->rootPath(true); - if (!rootPath.isEmpty()) - // torrent with root folder - m_removingTorrents[torrent->hash()] = {torrent->name(), rootPath, deleteLocalFiles}; - else if (torrent->useTempPath()) - // torrent without root folder still has it in its temporary save path - m_removingTorrents[torrent->hash()] = {torrent->name(), torrent->savePath(true), deleteLocalFiles}; - else - m_removingTorrents[torrent->hash()] = {torrent->name(), "", deleteLocalFiles}; + if (torrent->savePath(true) == torrentTempPath(torrent->hash())) { + m_savePathsToRemove[torrent->hash()] = torrent->savePath(true); + } + else { + QString rootPath = torrent->rootPath(true); + if (!rootPath.isEmpty()) + m_savePathsToRemove[torrent->hash()] = rootPath; + } m_nativeSession->remove_torrent(torrent->nativeHandle(), libt::session::delete_files); } else { - m_removingTorrents[torrent->hash()] = {torrent->name(), "", deleteLocalFiles}; QStringList unwantedFiles; if (torrent->hasMetadata()) unwantedFiles = torrent->absoluteFilePathsUnwanted(); @@ -1930,10 +1399,10 @@ #endif // Remove unwanted and incomplete files foreach (const QString &unwantedFile, unwantedFiles) { - qDebug("Removing unwanted file: %s", qUtf8Printable(unwantedFile)); + qDebug("Removing unwanted file: %s", qPrintable(unwantedFile)); Utils::Fs::forceRemove(unwantedFile); const QString parentFolder = Utils::Fs::branchPath(unwantedFile); - qDebug("Attempt to remove parent folder (if empty): %s", qUtf8Printable(parentFolder)); + qDebug("Attempt to remove parent folder (if empty): %s", qPrintable(parentFolder)); QDir().rmpath(parentFolder); } } @@ -1946,6 +1415,11 @@ foreach (const QString &file, files) Utils::Fs::forceRemove(resumeDataDir.absoluteFilePath(file)); + if (deleteLocalFiles) + Logger::instance()->addMessage(tr("'%1' was removed from transfer list and hard disk.", "'xxx.avi' was removed...").arg(torrent->name())); + else + Logger::instance()->addMessage(tr("'%1' was removed from transfer list.", "'xxx.avi' was removed...").arg(torrent->name())); + delete torrent; qDebug("Torrent deleted."); return true; @@ -1990,8 +1464,6 @@ torrentQueuePositionUp(torrent->nativeHandle()); torrentQueue.pop(); } - - handleTorrentsPrioritiesChanged(); } void Session::decreaseTorrentsPriority(const QStringList &hashes) @@ -2014,10 +1486,8 @@ torrentQueue.pop(); } - for (auto i = m_loadedMetadata.cbegin(); i != m_loadedMetadata.cend(); ++i) - torrentQueuePositionBottom(m_nativeSession->find_torrent(i.key())); - - handleTorrentsPrioritiesChanged(); + foreach (const InfoHash &hash, m_loadedMetadata.keys()) + torrentQueuePositionBottom(m_nativeSession->find_torrent(hash)); } void Session::topTorrentsPriority(const QStringList &hashes) @@ -2039,8 +1509,6 @@ torrentQueuePositionTop(torrent->nativeHandle()); torrentQueue.pop(); } - - handleTorrentsPrioritiesChanged(); } void Session::bottomTorrentsPriority(const QStringList &hashes) @@ -2063,10 +1531,8 @@ torrentQueue.pop(); } - for (auto i = m_loadedMetadata.cbegin(); i != m_loadedMetadata.cend(); ++i) - torrentQueuePositionBottom(m_nativeSession->find_torrent(i.key())); - - handleTorrentsPrioritiesChanged(); + foreach (const InfoHash &hash, m_loadedMetadata.keys()) + torrentQueuePositionBottom(m_nativeSession->find_torrent(hash)); } QHash Session::torrents() const @@ -2087,14 +1553,12 @@ return addTorrent_impl(params, magnetUri); } else if (Utils::Misc::isUrl(source)) { - LogMsg(tr("Downloading '%1', please wait...", "e.g: Downloading 'xxx.torrent', please wait...").arg(source)); + Logger::instance()->addMessage(tr("Downloading '%1', please wait...", "e.g: Downloading 'xxx.torrent', please wait...").arg(source)); // Launch downloader - Net::DownloadHandler *handler = - Net::DownloadManager::instance()->download(Net::DownloadRequest(source).limit(10485760 /* 10MB */).handleRedirectToMagnet(true)); - connect(handler, static_cast(&Net::DownloadHandler::downloadFinished) - , this, &Session::handleDownloadFinished); - connect(handler, &Net::DownloadHandler::downloadFailed, this, &Session::handleDownloadFailed); - connect(handler, &Net::DownloadHandler::redirectedToMagnet, this, &Session::handleRedirectedToMagnet); + Net::DownloadHandler *handler = Net::DownloadManager::instance()->downloadUrl(source, true, 10485760 /* 10MB */, true); + connect(handler, SIGNAL(downloadFinished(QString, QString)), this, SLOT(handleDownloadFinished(QString, QString))); + connect(handler, SIGNAL(downloadFailed(QString, QString)), this, SLOT(handleDownloadFailed(QString, QString))); + connect(handler, SIGNAL(redirectedToMagnet(QString, QString)), this, SLOT(handleRedirectedToMagnet(QString, QString))); m_downloadedTorrents[handler->url()] = params; } else { @@ -2116,24 +1580,32 @@ } // Add a torrent to the BitTorrent session -bool Session::addTorrent_impl(CreateTorrentParams params, const MagnetUri &magnetUri, +bool Session::addTorrent_impl(AddTorrentData addData, const MagnetUri &magnetUri, TorrentInfo torrentInfo, const QByteArray &fastresumeData) { - params.savePath = normalizeSavePath(params.savePath, ""); - - if (!params.category.isEmpty()) { - if (!m_categories.contains(params.category) && !addCategory(params.category)) { - qWarning() << "Couldn't create category" << params.category; - params.category = ""; + addData.savePath = normalizeSavePath( + addData.savePath, + ((!addData.resumed && isAutoTMMDisabledByDefault()) ? defaultSavePath() : "")); + + if (!addData.category.isEmpty()) { + if (!m_categories.contains(addData.category) && !addCategory(addData.category)) { + qWarning() << "Couldn't create category" << addData.category; + addData.category = ""; } } - // If empty then Automatic mode, otherwise Manual mode - QString savePath = params.savePath.isEmpty() ? categorySavePath(params.category) : params.savePath; libt::add_torrent_params p; InfoHash hash; - const bool fromMagnetUri = magnetUri.isValid(); + std::vector buf(fastresumeData.constData(), fastresumeData.constData() + fastresumeData.size()); + std::vector filePriorities; + + QString savePath; + if (addData.savePath.isEmpty()) // using Automatic mode + savePath = categorySavePath(addData.category); + else // using Manual mode + savePath = addData.savePath; + bool fromMagnetUri = magnetUri.isValid(); if (fromMagnetUri) { hash = magnetUri.hash(); @@ -2152,7 +1624,7 @@ adjustLimits(); // use common 2nd step of torrent addition - m_addingTorrents.insert(hash, params); + m_addingTorrents.insert(hash, addData); createTorrentHandle(handle); return true; } @@ -2160,26 +1632,9 @@ p = magnetUri.addTorrentParams(); } else if (torrentInfo.isValid()) { - if (!params.restored) { - if (!params.hasRootFolder) - torrentInfo.stripRootFolder(); - - // Metadata - if (!params.hasSeedStatus) - findIncompleteFiles(torrentInfo, savePath); - - // if torrent name wasn't explicitly set we handle the case of - // initial renaming of torrent content and rename torrent accordingly - if (params.name.isEmpty()) { - QString contentName = torrentInfo.rootFolder(); - if (contentName.isEmpty() && (torrentInfo.filesCount() == 1)) - contentName = torrentInfo.fileName(0); - - if (!contentName.isEmpty() && (contentName != torrentInfo.name())) - params.name = contentName; - } - } - + // Metadata + if (!addData.resumed && !addData.hasSeedStatus) + findIncompleteFiles(torrentInfo, savePath); p.ti = torrentInfo.nativeInfo(); hash = torrentInfo.hash(); } @@ -2190,21 +1645,23 @@ return false; } - if (params.restored && !fromMagnetUri) { + if (addData.resumed && !fromMagnetUri) { // Set torrent fast resume data - p.resume_data = {fastresumeData.constData(), fastresumeData.constData() + fastresumeData.size()}; + p.resume_data = buf; p.flags |= libt::add_torrent_params::flag_use_resume_save_path; } else { - p.file_priorities = {params.filePriorities.begin(), params.filePriorities.end()}; + foreach (int prio, addData.filePriorities) + filePriorities.push_back(prio); + p.file_priorities = filePriorities; } // We should not add torrent if it already // processed or adding to session if (m_addingTorrents.contains(hash) || m_loadedMetadata.contains(hash)) return false; - TorrentHandle *const torrent = m_torrents.value(hash); - if (torrent) { + if (m_torrents.contains(hash)) { + TorrentHandle *const torrent = m_torrents.value(hash); if (torrent->isPrivate() || (!fromMagnetUri && torrentInfo.isPrivate())) return false; torrent->addTrackers(fromMagnetUri ? magnetUri.trackers() : torrentInfo.trackers()); @@ -2213,7 +1670,7 @@ } qDebug("Adding torrent..."); - qDebug(" -> Hash: %s", qUtf8Printable(hash)); + qDebug(" -> Hash: %s", qPrintable(hash)); // Preallocation mode if (isPreallocationEnabled()) @@ -2227,7 +1684,7 @@ // Seeding mode // Skip checking and directly start seeding (new in libtorrent v0.15) - if (params.skipChecking) + if (addData.skipChecking) p.flags |= libt::add_torrent_params::flag_seed_mode; else p.flags &= ~libt::add_torrent_params::flag_seed_mode; @@ -2235,11 +1692,9 @@ // Limits p.max_connections = maxConnectionsPerTorrent(); p.max_uploads = maxUploadsPerTorrent(); - p.save_path = Utils::Fs::toNativePath(savePath).toStdString(); - p.upload_limit = params.uploadLimit; - p.download_limit = params.downloadLimit; + p.save_path = Utils::String::toStdString(Utils::Fs::toNativePath(savePath)); - m_addingTorrents.insert(hash, params); + m_addingTorrents.insert(hash, addData); // Adding torrent to BitTorrent session m_nativeSession->async_add_torrent(p); return true; @@ -2260,6 +1715,8 @@ found = true; torrentInfo.renameFile(i, filePath + QB_EXT); } + if ((i % 100) == 0) + qApp->processEvents(); } return found; @@ -2267,7 +1724,7 @@ bool found = findInDir(savePath, torrentInfo); if (!found && isTempPathEnabled()) { - savePath = torrentTempPath(torrentInfo); + savePath = torrentTempPath(torrentInfo.hash()); found = findInDir(savePath, torrentInfo); } @@ -2283,15 +1740,15 @@ InfoHash hash = magnetUri.hash(); QString name = magnetUri.name(); - // We should not add torrent if it's already + // We should not add torrent if it already // processed or adding to session if (m_torrents.contains(hash)) return false; if (m_addingTorrents.contains(hash)) return false; if (m_loadedMetadata.contains(hash)) return false; qDebug("Adding torrent to preload metadata..."); - qDebug(" -> Hash: %s", qUtf8Printable(hash)); - qDebug(" -> Name: %s", qUtf8Printable(name)); + qDebug(" -> Hash: %s", qPrintable(hash)); + qDebug(" -> Name: %s", qPrintable(name)); libt::add_torrent_params p = magnetUri.addTorrentParams(); @@ -2306,8 +1763,8 @@ p.max_connections = maxConnectionsPerTorrent(); p.max_uploads = maxUploadsPerTorrent(); - const QString savePath = Utils::Fs::tempPath() + static_cast(hash); - p.save_path = Utils::Fs::toNativePath(savePath).toStdString(); + QString savePath = QString("%1/%2").arg(QDir::tempPath()).arg(hash); + p.save_path = Utils::String::toStdString(Utils::Fs::toNativePath(savePath)); // Forced start p.flags &= ~libt::add_torrent_params::flag_paused; @@ -2352,15 +1809,28 @@ } } +void Session::changeSpeedLimitMode_impl(bool alternative) +{ + qDebug() << Q_FUNC_INFO << alternative; + if (alternative == isAltGlobalSpeedLimitEnabled()) return; + + // Save new state to remember it on startup + m_isAltGlobalSpeedLimitEnabled = alternative; + configureDeferred(); + // Notify + emit speedLimitModeChanged(alternative); +} + void Session::generateResumeData(bool final) { foreach (TorrentHandle *const torrent, m_torrents) { if (!torrent->isValid()) continue; - if (torrent->isChecking() || torrent->isPaused()) continue; + if (torrent->hasMissingFiles()) continue; + if (torrent->isChecking() || torrent->hasError()) continue; if (!final && !torrent->needSaveResumeData()) continue; - if (torrent->hasMissingFiles() || torrent->hasError()) continue; - saveTorrentResumeData(torrent); + saveTorrentResumeData(torrent, final); + qDebug("Saving fastresume data for %s", qPrintable(torrent->name())); } } @@ -2378,7 +1848,9 @@ std::vector alerts; getPendingAlerts(alerts, 30 * 1000); if (alerts.empty()) { - fprintf(stderr, " aborting with %d outstanding torrents to save resume data for\n", m_numResumeData); + std::cerr << " aborting with " << m_numResumeData + << " outstanding torrents to save resume data for" + << std::endl; break; } @@ -2427,7 +1899,7 @@ Logger::instance()->addMessage(tr("System network status changed to %1", "e.g: System network status changed to ONLINE").arg(online ? tr("ONLINE") : tr("OFFLINE")), Log::INFO); } -void Session::networkConfigurationChange(const QNetworkConfiguration &cfg) +void Session::networkConfigurationChange(const QNetworkConfiguration& cfg) { const QString configuredInterfaceName = networkInterface(); // Empty means "Any Interface". In this case libtorrent has binded to 0.0.0.0 so any change to any interface will @@ -2453,7 +1925,7 @@ const QStringList Session::getListeningIPs() { - Logger *const logger = Logger::instance(); + Logger* const logger = Logger::instance(); QStringList IPs; const QString ifaceName = networkInterface(); @@ -2481,7 +1953,7 @@ // Attempt to listen on provided interface const QNetworkInterface networkIFace = QNetworkInterface::interfaceFromName(ifaceName); if (!networkIFace.isValid()) { - qDebug("Invalid network interface: %s", qUtf8Printable(ifaceName)); + qDebug("Invalid network interface: %s", qPrintable(ifaceName)); logger->addMessage(tr("The network interface defined is invalid: %1").arg(ifaceName), Log::CRITICAL); IPs.append("127.0.0.1"); // Force listening to localhost and avoid accidental connection that will expose user data. return IPs; @@ -2496,12 +1968,12 @@ ip = entry.ip(); ipString = ip.toString(); protocol = ip.protocol(); - Q_ASSERT((protocol == QAbstractSocket::IPv4Protocol) || (protocol == QAbstractSocket::IPv6Protocol)); + Q_ASSERT(protocol == QAbstractSocket::IPv4Protocol || protocol == QAbstractSocket::IPv6Protocol); if ((!listenIPv6 && (protocol == QAbstractSocket::IPv6Protocol)) || (listenIPv6 && (protocol == QAbstractSocket::IPv4Protocol))) continue; - // If an iface address has been defined to only allow ip's that match it to go through + //If an iface address has been defined only allow ip's that match it to go through if (!ifaceAddr.isEmpty()) { if (ifaceAddr == ipString) { IPs.append(ipString); @@ -2532,7 +2004,7 @@ const ushort port = this->port(); qDebug() << Q_FUNC_INFO << port; - Logger *const logger = Logger::instance(); + Logger* const logger = Logger::instance(); std::pair ports(port, port); libt::error_code ec; @@ -2678,13 +2150,11 @@ void Session::setAltGlobalSpeedLimitEnabled(bool enabled) { - if (enabled == isAltGlobalSpeedLimitEnabled()) return; + // Stop the scheduler when the user has manually changed the bandwidth mode + if (isBandwidthSchedulerEnabled()) + setBandwidthSchedulerEnabled(false); - // Save new state to remember it on startup - m_isAltGlobalSpeedLimitEnabled = enabled; - applyBandwidthLimits(); - // Notify - emit speedLimitModeChanged(m_isAltGlobalSpeedLimitEnabled); + changeSpeedLimitMode_impl(enabled); } bool Session::isBandwidthSchedulerEnabled() const @@ -2708,19 +2178,11 @@ return m_saveResumeDataInterval; } -void Session::setSaveResumeDataInterval(const uint value) +void Session::setSaveResumeDataInterval(uint value) { - if (value == m_saveResumeDataInterval) - return; - - m_saveResumeDataInterval = value; - - if (value > 0) { + if (value != saveResumeDataInterval()) { + m_saveResumeDataInterval = value; m_resumeDataTimer->setInterval(value * 60 * 1000); - m_resumeDataTimer->start(); - } - else { - m_resumeDataTimer->stop(); } } @@ -2755,10 +2217,10 @@ return m_networkInterface; } -void Session::setNetworkInterface(const QString &iface) +void Session::setNetworkInterface(const QString &interface) { - if (iface != networkInterface()) { - m_networkInterface = iface; + if (interface != networkInterface()) { + m_networkInterface = interface; configureListeningInterface(); } } @@ -2842,32 +2304,6 @@ } } -ChokingAlgorithm Session::chokingAlgorithm() const -{ - return m_chokingAlgorithm; -} - -void Session::setChokingAlgorithm(ChokingAlgorithm mode) -{ - if (mode == m_chokingAlgorithm) return; - - m_chokingAlgorithm = mode; - configureDeferred(); -} - -SeedChokingAlgorithm Session::seedChokingAlgorithm() const -{ - return m_seedChokingAlgorithm; -} - -void Session::setSeedChokingAlgorithm(SeedChokingAlgorithm mode) -{ - if (mode == m_seedChokingAlgorithm) return; - - m_seedChokingAlgorithm = mode; - configureDeferred(); -} - bool Session::isAddTrackersEnabled() const { return m_isAddTrackersEnabled; @@ -2920,45 +2356,6 @@ } } -void Session::setBannedIPs(const QStringList &newList) -{ - if (newList == m_bannedIPs) - return; // do nothing - // here filter out incorrect IP - QStringList filteredList; - for (const QString &ip : newList) { - if (Utils::Net::isValidIP(ip)) { - // the same IPv6 addresses could be written in different forms; - // QHostAddress::toString() result format follows RFC5952; - // thus we avoid duplicate entries pointing to the same address - filteredList << QHostAddress(ip).toString(); - } - else { - Logger::instance()->addMessage( - tr("%1 is not a valid IP address and was rejected while applying the list of banned addresses.") - .arg(ip) - , Log::WARNING); - } - } - // now we have to sort IPs and make them unique - filteredList.sort(); - filteredList.removeDuplicates(); - // Again ensure that the new list is different from the stored one. - if (filteredList == m_bannedIPs) - return; // do nothing - // store to session settings - // also here we have to recreate filter list including 3rd party ban file - // and install it again into m_session - m_bannedIPs = filteredList; - m_IPFilteringChanged = true; - configureDeferred(); -} - -QStringList Session::bannedIPs() const -{ - return m_bannedIPs; -} - int Session::maxConnectionsPerTorrent() const { return m_maxConnectionsPerTorrent; @@ -2976,7 +2373,7 @@ try { handle.set_max_connections(max); } - catch (const std::exception &) {} + catch(std::exception) {} } } } @@ -2998,7 +2395,7 @@ try { handle.set_max_uploads(max); } - catch (const std::exception &) {} + catch(std::exception) {} } } } @@ -3016,54 +2413,27 @@ } } -bool Session::announceToAllTiers() const -{ - return m_announceToAllTiers; -} - -void Session::setAnnounceToAllTiers(bool val) -{ - if (val != m_announceToAllTiers) { - m_announceToAllTiers = val; - configureDeferred(); - } -} - -int Session::asyncIOThreads() const -{ - return qBound(1, m_asyncIOThreads.value(), 1024); -} - -void Session::setAsyncIOThreads(const int num) -{ - if (num == m_asyncIOThreads) - return; - - m_asyncIOThreads = num; - configureDeferred(); -} - -int Session::diskCacheSize() const +uint Session::diskCacheSize() const { - int size = m_diskCacheSize; + uint size = m_diskCacheSize; // These macros may not be available on compilers other than MSVC and GCC #if defined(__x86_64__) || defined(_M_X64) - size = qMin(size, 4096); // 4GiB + size = qMin(size, 4096u); // 4GiB #else // When build as 32bit binary, set the maximum at less than 2GB to prevent crashes // allocate 1536MiB and leave 512MiB to the rest of program data in RAM - size = qMin(size, 1536); + size = qMin(size, 1536u); #endif return size; } -void Session::setDiskCacheSize(int size) +void Session::setDiskCacheSize(uint size) { #if defined(__x86_64__) || defined(_M_X64) - size = qMin(size, 4096); // 4GiB + size = qMin(size, 4096u); // 4GiB #else // allocate 1536MiB and leave 512MiB to the rest of program data in RAM - size = qMin(size, 1536); + size = qMin(size, 1536u); #endif if (size != m_diskCacheSize) { m_diskCacheSize = size; @@ -3071,12 +2441,12 @@ } } -int Session::diskCacheTTL() const +uint Session::diskCacheTTL() const { return m_diskCacheTTL; } -void Session::setDiskCacheTTL(int ttl) +void Session::setDiskCacheTTL(uint ttl) { if (ttl != m_diskCacheTTL) { m_diskCacheTTL = ttl; @@ -3097,84 +2467,6 @@ } } -bool Session::isGuidedReadCacheEnabled() const -{ - return m_guidedReadCacheEnabled; -} - -void Session::setGuidedReadCacheEnabled(bool enabled) -{ - if (enabled == m_guidedReadCacheEnabled) return; - - m_guidedReadCacheEnabled = enabled; - configureDeferred(); -} - -bool Session::isCoalesceReadWriteEnabled() const -{ - return m_coalesceReadWriteEnabled; -} - -void Session::setCoalesceReadWriteEnabled(bool enabled) -{ - if (enabled == m_coalesceReadWriteEnabled) return; - - m_coalesceReadWriteEnabled = enabled; - configureDeferred(); -} - -bool Session::isSuggestModeEnabled() const -{ - return m_isSuggestMode; -} - -void Session::setSuggestMode(bool mode) -{ - if (mode == m_isSuggestMode) return; - - m_isSuggestMode = mode; - configureDeferred(); -} - -int Session::sendBufferWatermark() const -{ - return m_sendBufferWatermark; -} - -void Session::setSendBufferWatermark(int value) -{ - if (value == m_sendBufferWatermark) return; - - m_sendBufferWatermark = value; - configureDeferred(); -} - -int Session::sendBufferLowWatermark() const -{ - return m_sendBufferLowWatermark; -} - -void Session::setSendBufferLowWatermark(int value) -{ - if (value == m_sendBufferLowWatermark) return; - - m_sendBufferLowWatermark = value; - configureDeferred(); -} - -int Session::sendBufferWatermarkFactor() const -{ - return m_sendBufferWatermarkFactor; -} - -void Session::setSendBufferWatermarkFactor(int value) -{ - if (value == m_sendBufferWatermarkFactor) return; - - m_sendBufferWatermarkFactor = value; - configureDeferred(); -} - bool Session::isAnonymousModeEnabled() const { return m_isAnonymousModeEnabled; @@ -3259,54 +2551,12 @@ } } -int Session::downloadRateForSlowTorrents() const -{ - return m_downloadRateForSlowTorrents; -} - -void Session::setDownloadRateForSlowTorrents(int rateInKibiBytes) -{ - if (rateInKibiBytes == m_downloadRateForSlowTorrents) - return; - - m_downloadRateForSlowTorrents = rateInKibiBytes; - configureDeferred(); -} - -int Session::uploadRateForSlowTorrents() const -{ - return m_uploadRateForSlowTorrents; -} - -void Session::setUploadRateForSlowTorrents(int rateInKibiBytes) -{ - if (rateInKibiBytes == m_uploadRateForSlowTorrents) - return; - - m_uploadRateForSlowTorrents = rateInKibiBytes; - configureDeferred(); -} - -int Session::slowTorrentsInactivityTimer() const -{ - return m_slowTorrentsInactivityTimer; -} - -void Session::setSlowTorrentsInactivityTimer(int timeInSeconds) -{ - if (timeInSeconds == m_slowTorrentsInactivityTimer) - return; - - m_slowTorrentsInactivityTimer = timeInSeconds; - configureDeferred(); -} - -int Session::outgoingPortsMin() const +uint Session::outgoingPortsMin() const { return m_outgoingPortsMin; } -void Session::setOutgoingPortsMin(int min) +void Session::setOutgoingPortsMin(uint min) { if (min != m_outgoingPortsMin) { m_outgoingPortsMin = min; @@ -3314,12 +2564,12 @@ } } -int Session::outgoingPortsMax() const +uint Session::outgoingPortsMax() const { return m_outgoingPortsMax; } -void Session::setOutgoingPortsMax(int max) +void Session::setOutgoingPortsMax(uint max) { if (max != m_outgoingPortsMax) { m_outgoingPortsMax = max; @@ -3421,20 +2671,17 @@ } } -BTProtocol Session::btProtocol() const +bool Session::isUTPEnabled() const { - return m_btProtocol; + return m_isUTPEnabled; } -void Session::setBTProtocol(BTProtocol protocol) +void Session::setUTPEnabled(bool enabled) { - if ((protocol < BTProtocol::Both) || (BTProtocol::UTP < protocol)) - return; - - if (protocol == m_btProtocol) return; - - m_btProtocol = protocol; - configureDeferred(); + if (enabled != m_isUTPEnabled) { + m_isUTPEnabled = enabled; + configureDeferred(); + } } bool Session::isUTPRateLimited() const @@ -3450,32 +2697,6 @@ } } -MixedModeAlgorithm Session::utpMixedMode() const -{ - return m_utpMixedMode; -} - -void Session::setUtpMixedMode(MixedModeAlgorithm mode) -{ - if (mode == m_utpMixedMode) return; - - m_utpMixedMode = mode; - configureDeferred(); -} - -bool Session::multiConnectionsPerIpEnabled() const -{ - return m_multiConnectionsPerIpEnabled; -} - -void Session::setMultiConnectionsPerIpEnabled(bool enabled) -{ - if (enabled == m_multiConnectionsPerIpEnabled) return; - - m_multiConnectionsPerIpEnabled = enabled; - configureDeferred(); -} - bool Session::isTrackerFilteringEnabled() const { return m_isTrackerFilteringEnabled; @@ -3505,7 +2726,7 @@ } // If this functions returns true, we cannot add torrent to session, -// but it is still possible to merge trackers in some cases +// but it is still possible to merge trackers in some case bool Session::isKnownTorrent(const InfoHash &hash) const { return (m_torrents.contains(hash) @@ -3513,84 +2734,48 @@ || m_loadedMetadata.contains(hash)); } -void Session::updateSeedingLimitTimer() +void Session::updateRatioTimer() { - if ((globalMaxRatio() == TorrentHandle::NO_RATIO_LIMIT) && !hasPerTorrentRatioLimit() - && (globalMaxSeedingMinutes() == TorrentHandle::NO_SEEDING_TIME_LIMIT) && !hasPerTorrentSeedingTimeLimit()) { - if (m_seedingLimitTimer->isActive()) - m_seedingLimitTimer->stop(); + if ((globalMaxRatio() == -1) && !hasPerTorrentRatioLimit()) { + if (m_bigRatioTimer->isActive()) + m_bigRatioTimer->stop(); } - else if (!m_seedingLimitTimer->isActive()) { - m_seedingLimitTimer->start(); + else if (!m_bigRatioTimer->isActive()) { + m_bigRatioTimer->start(); } } -void Session::handleTorrentShareLimitChanged(TorrentHandle *const torrent) +void Session::handleTorrentRatioLimitChanged(TorrentHandle *const torrent) { - saveTorrentResumeData(torrent); - updateSeedingLimitTimer(); -} - -void Session::handleTorrentsPrioritiesChanged() -{ - // Save fastresume for the torrents that changed queue position - for (TorrentHandle *const torrent : torrents()) { - if (!torrent->isSeed()) { - // cached vs actual queue position, qBt starts queue at 1 - if (torrent->queuePosition() != (torrent->nativeHandle().queue_position() + 1)) - saveTorrentResumeData(torrent); - } - } + Q_UNUSED(torrent); + updateRatioTimer(); } -void Session::saveTorrentResumeData(TorrentHandle *const torrent) +void Session::saveTorrentResumeData(TorrentHandle *const torrent, bool finalSave) { - qDebug("Saving fastresume data for %s", qUtf8Printable(torrent->name())); - torrent->saveResumeData(); + torrent->saveResumeData(finalSave); ++m_numResumeData; } -void Session::handleTorrentNameChanged(TorrentHandle *const torrent) -{ - saveTorrentResumeData(torrent); -} - void Session::handleTorrentSavePathChanged(TorrentHandle *const torrent) { - saveTorrentResumeData(torrent); emit torrentSavePathChanged(torrent); } void Session::handleTorrentCategoryChanged(TorrentHandle *const torrent, const QString &oldCategory) { - saveTorrentResumeData(torrent); emit torrentCategoryChanged(torrent, oldCategory); } -void Session::handleTorrentTagAdded(TorrentHandle *const torrent, const QString &tag) -{ - saveTorrentResumeData(torrent); - emit torrentTagAdded(torrent, tag); -} - -void Session::handleTorrentTagRemoved(TorrentHandle *const torrent, const QString &tag) +void Session::handleTorrentSavingModeChanged(TorrentHandle * const torrent) { - saveTorrentResumeData(torrent); - emit torrentTagRemoved(torrent, tag); -} - -void Session::handleTorrentSavingModeChanged(TorrentHandle *const torrent) -{ - saveTorrentResumeData(torrent); emit torrentSavingModeChanged(torrent); } void Session::handleTorrentTrackersAdded(TorrentHandle *const torrent, const QList &newTrackers) { - saveTorrentResumeData(torrent); - - for (const TrackerEntry &newTracker : newTrackers) - LogMsg(tr("Tracker '%1' was added to torrent '%2'").arg(newTracker.url(), torrent->name())); + foreach (const TrackerEntry &newTracker, newTrackers) + Logger::instance()->addMessage(tr("Tracker '%1' was added to torrent '%2'").arg(newTracker.url()).arg(torrent->name())); emit trackersAdded(torrent, newTrackers); if (torrent->trackers().size() == newTrackers.size()) emit trackerlessStateChanged(torrent, false); @@ -3599,10 +2784,8 @@ void Session::handleTorrentTrackersRemoved(TorrentHandle *const torrent, const QList &deletedTrackers) { - saveTorrentResumeData(torrent); - - for (const TrackerEntry &deletedTracker : deletedTrackers) - LogMsg(tr("Tracker '%1' was deleted from torrent '%2'").arg(deletedTracker.url(), torrent->name())); + foreach (const TrackerEntry &deletedTracker, deletedTrackers) + Logger::instance()->addMessage(tr("Tracker '%1' was deleted from torrent '%2'").arg(deletedTracker.url()).arg(torrent->name())); emit trackersRemoved(torrent, deletedTrackers); if (torrent->trackers().size() == 0) emit trackerlessStateChanged(torrent, true); @@ -3611,22 +2794,19 @@ void Session::handleTorrentTrackersChanged(TorrentHandle *const torrent) { - saveTorrentResumeData(torrent); emit trackersChanged(torrent); } void Session::handleTorrentUrlSeedsAdded(TorrentHandle *const torrent, const QList &newUrlSeeds) { - saveTorrentResumeData(torrent); - for (const QUrl &newUrlSeed : newUrlSeeds) - LogMsg(tr("URL seed '%1' was added to torrent '%2'").arg(newUrlSeed.toString(), torrent->name())); + foreach (const QUrl &newUrlSeed, newUrlSeeds) + Logger::instance()->addMessage(tr("URL seed '%1' was added to torrent '%2'").arg(newUrlSeed.toString()).arg(torrent->name())); } void Session::handleTorrentUrlSeedsRemoved(TorrentHandle *const torrent, const QList &urlSeeds) { - saveTorrentResumeData(torrent); - for (const QUrl &urlSeed : urlSeeds) - LogMsg(tr("URL seed '%1' was removed from torrent '%2'").arg(urlSeed.toString(), torrent->name())); + foreach (const QUrl &urlSeed, urlSeeds) + Logger::instance()->addMessage(tr("URL seed '%1' was removed from torrent '%2'").arg(urlSeed.toString()).arg(torrent->name())); } void Session::handleTorrentMetadataReceived(TorrentHandle *const torrent) @@ -3654,7 +2834,6 @@ void Session::handleTorrentResumed(TorrentHandle *const torrent) { - saveTorrentResumeData(torrent); emit torrentResumed(torrent); } @@ -3665,11 +2844,8 @@ void Session::handleTorrentFinished(TorrentHandle *const torrent) { - if (!torrent->hasError() && !torrent->hasMissingFiles()) { + if (!torrent->hasError() && !torrent->hasMissingFiles()) saveTorrentResumeData(torrent); - if (isQueueingSystemEnabled()) - handleTorrentsPrioritiesChanged(); - } emit torrentFinished(torrent); qDebug("Checking if the torrent contains torrent files to download"); @@ -3678,8 +2854,8 @@ const QString torrentRelpath = torrent->filePath(i); if (torrentRelpath.endsWith(".torrent", Qt::CaseInsensitive)) { qDebug("Found possible recursive torrent download."); - const QString torrentFullpath = torrent->savePath(true) + '/' + torrentRelpath; - qDebug("Full subtorrent path is %s", qUtf8Printable(torrentFullpath)); + const QString torrentFullpath = torrent->savePath(true) + "/" + torrentRelpath; + qDebug("Full subtorrent path is %s", qPrintable(torrentFullpath)); TorrentInfo torrentInfo = TorrentInfo::loadFromFile(torrentFullpath); if (torrentInfo.isValid()) { qDebug("emitting recursiveTorrentDownloadPossible()"); @@ -3751,17 +2927,9 @@ return false; } -bool Session::hasPerTorrentSeedingTimeLimit() const -{ - foreach (TorrentHandle *const torrent, m_torrents) - if (torrent->seedingTimeLimit() >= 0) return true; - - return false; -} - void Session::initResumeFolder() { - m_resumeFolderPath = Utils::Fs::expandPathAbs(specialFolderLocation(SpecialFolder::Data) + RESUME_FOLDER); + m_resumeFolderPath = Utils::Fs::expandPathAbs(Utils::Fs::QDesktopServicesDataLocation() + RESUME_FOLDER); QDir resumeFolderDir(m_resumeFolderPath); if (resumeFolderDir.exists() || resumeFolderDir.mkpath(resumeFolderDir.absolutePath())) { m_resumeFolderLock.setFileName(resumeFolderDir.absoluteFilePath("session.lock")); @@ -3783,19 +2951,15 @@ } // Enable IP Filtering -// this method creates ban list from scratch combining user ban list and 3rd party ban list file void Session::enableIPFilter() { qDebug("Enabling IPFilter"); - // 1. Parse the IP filter - // 2. In the slot add the manually banned IPs to the provided libtorrent::ip_filter - // 3. Set the ip_filter in one go so there isn't a time window where there isn't an ip_filter - // set between clearing the old one and setting the new one. if (!m_filterParser) { - m_filterParser = new FilterParserThread(this); - connect(m_filterParser.data(), &FilterParserThread::IPFilterParsed, this, &Session::handleIPFilterParsed); - connect(m_filterParser.data(), &FilterParserThread::IPFilterError, this, &Session::handleIPFilterError); + m_filterParser = new FilterParserThread(m_nativeSession, this); + connect(m_filterParser.data(), SIGNAL(IPFilterParsed(int)), SLOT(handleIPFilterParsed(int))); + connect(m_filterParser.data(), SIGNAL(IPFilterError()), SLOT(handleIPFilterError())); } + m_filterParser->processFilterFile(IPFilterFile()); } @@ -3803,6 +2967,7 @@ void Session::disableIPFilter() { qDebug("Disabling IPFilter"); + m_nativeSession->set_ip_filter(libt::ip_filter()); if (m_filterParser) { disconnect(m_filterParser.data(), 0, this, 0); delete m_filterParser; @@ -3811,9 +2976,7 @@ // Add the banned IPs after the IPFilter disabling // which creates an empty filter and overrides all previously // applied bans. - libt::ip_filter filter; - processBannedIPs(filter); - m_nativeSession->set_ip_filter(filter); + processBannedIPs(); } void Session::recursiveTorrentDownload(const InfoHash &hash) @@ -3827,8 +2990,8 @@ Logger::instance()->addMessage( tr("Recursive download of file '%1' embedded in torrent '%2'" , "Recursive download of 'test.torrent' embedded in torrent 'test2'") - .arg(Utils::Fs::toNativePath(torrentRelpath), torrent->name())); - const QString torrentFullpath = torrent->savePath() + '/' + torrentRelpath; + .arg(Utils::Fs::toNativePath(torrentRelpath)).arg(torrent->name())); + const QString torrentFullpath = torrent->savePath() + "/" + torrentRelpath; AddTorrentParams params; // Passing the save path along to the sub torrent file @@ -3838,14 +3001,14 @@ } } -const SessionStatus &Session::status() const +SessionStatus Session::status() const { - return m_status; + return m_nativeSession->status(); } -const CacheStatus &Session::cacheStatus() const +CacheStatus Session::cacheStatus() const { - return m_cacheStatus; + return m_nativeSession->get_cache_status(); } // Will resume torrents in backup directory @@ -3863,7 +3026,7 @@ { QString hash; MagnetUri magnetUri; - CreateTorrentParams addTorrentData; + AddTorrentData addTorrentData; QByteArray data; } TorrentResumeData; @@ -3877,7 +3040,7 @@ .arg(params.hash), Log::CRITICAL); // process add torrent messages before message queue overflow - if ((resumedTorrentsCount % 100) == 0) readAlerts(); + if (resumedTorrentsCount % 100 == 0) readAlerts(); ++resumedTorrentsCount; }; @@ -3888,20 +3051,19 @@ QMap queuedResumeData; int nextQueuePosition = 1; int numOfRemappedFiles = 0; - const QRegularExpression rx(QLatin1String("^([A-Fa-f0-9]{40})\\.fastresume$")); + QRegExp rx(QLatin1String("^([A-Fa-f0-9]{40})\\.fastresume$")); foreach (const QString &fastresumeName, fastresumes) { - const QRegularExpressionMatch rxMatch = rx.match(fastresumeName); - if (!rxMatch.hasMatch()) continue; + if (rx.indexIn(fastresumeName) == -1) continue; - QString hash = rxMatch.captured(1); + QString hash = rx.cap(1); QString fastresumePath = resumeDataDir.absoluteFilePath(fastresumeName); QByteArray data; - CreateTorrentParams torrentParams; + AddTorrentData resumeData; MagnetUri magnetUri; int queuePosition; - if (readFile(fastresumePath, data) && loadTorrentResumeData(data, torrentParams, queuePosition, magnetUri)) { + if (readFile(fastresumePath, data) && loadTorrentResumeData(data, resumeData, queuePosition, magnetUri)) { if (queuePosition <= nextQueuePosition) { - startupTorrent({ hash, magnetUri, torrentParams, data }); + startupTorrent({ hash, magnetUri, resumeData, data }); if (queuePosition == nextQueuePosition) { ++nextQueuePosition; @@ -3913,12 +3075,12 @@ } else { int q = queuePosition; - for (; queuedResumeData.contains(q); ++q) { + for(; queuedResumeData.contains(q); ++q) { } if (q != queuePosition) { ++numOfRemappedFiles; } - queuedResumeData[q] = {hash, magnetUri, torrentParams, data}; + queuedResumeData[q] = { hash, magnetUri, resumeData, data }; } } } @@ -3947,28 +3109,16 @@ void Session::refresh() { m_nativeSession->post_torrent_updates(); -#if LIBTORRENT_VERSION_NUM >= 10100 - m_nativeSession->post_session_stats(); -#endif } void Session::handleIPFilterParsed(int ruleCount) { - if (m_filterParser) { - libt::ip_filter filter = m_filterParser->IPfilter(); - processBannedIPs(filter); - m_nativeSession->set_ip_filter(filter); - } Logger::instance()->addMessage(tr("Successfully parsed the provided IP filter: %1 rules were applied.", "%1 is a number").arg(ruleCount)); emit IPFilterParsed(false, ruleCount); } void Session::handleIPFilterError() { - libt::ip_filter filter; - processBannedIPs(filter); - m_nativeSession->set_ip_filter(filter); - Logger::instance()->addMessage(tr("Error: Failed to parse the provided IP filter."), Log::CRITICAL); emit IPFilterParsed(true, 0); } @@ -4007,16 +3157,6 @@ #endif } -bool Session::isCreateTorrentSubfolder() const -{ - return m_isCreateTorrentSubfolder; -} - -void Session::setCreateTorrentSubfolder(bool value) -{ - m_isCreateTorrentSubfolder = value; -} - // Read alerts sent by the BitTorrent session void Session::readAlerts() { @@ -4044,7 +3184,6 @@ case libt::storage_moved_alert::alert_type: case libt::storage_moved_failed_alert::alert_type: case libt::torrent_paused_alert::alert_type: - case libt::torrent_resumed_alert::alert_type: case libt::tracker_error_alert::alert_type: case libt::tracker_reply_alert::alert_type: case libt::tracker_warning_alert::alert_type: @@ -4059,11 +3198,6 @@ case libt::state_update_alert::alert_type: handleStateUpdateAlert(static_cast(a)); break; -#if LIBTORRENT_VERSION_NUM >= 10100 - case libt::session_stats_alert::alert_type: - handleSessionStatsAlert(static_cast(a)); - break; -#endif case libt::file_error_alert::alert_type: handleFileErrorAlert(static_cast(a)); break; @@ -4106,7 +3240,7 @@ } } catch (std::exception &exc) { - qWarning() << "Caught exception in " << Q_FUNC_INFO << ": " << QString::fromStdString(exc.what()); + qWarning() << "Caught exception in " << Q_FUNC_INFO << ": " << Utils::String::fromStdString(exc.what()); } } @@ -4122,19 +3256,25 @@ // Magnet added for preload its metadata if (!m_addingTorrents.contains(nativeHandle.info_hash())) return; - CreateTorrentParams params = m_addingTorrents.take(nativeHandle.info_hash()); + AddTorrentData data = m_addingTorrents.take(nativeHandle.info_hash()); - TorrentHandle *const torrent = new TorrentHandle(this, nativeHandle, params); + TorrentHandle *const torrent = new TorrentHandle(this, nativeHandle, data); m_torrents.insert(torrent->hash(), torrent); Logger *const logger = Logger::instance(); bool fromMagnetUri = !torrent->hasMetadata(); - if (params.restored) { - logger->addMessage(tr("'%1' restored.", "'torrent name' restored.").arg(torrent->name())); + if (data.resumed) { + if (fromMagnetUri && !data.addPaused) + torrent->resume(data.addForced); + + logger->addMessage(tr("'%1' resumed. (fast resume)", "'torrent name' was resumed. (fast resume)") + .arg(torrent->name())); } else { + qDebug("This is a NEW torrent (first time)..."); + // The following is useless for newly added magnet if (!fromMagnetUri) { // Backup torrent file @@ -4153,6 +3293,13 @@ if (isAddTrackersEnabled() && !torrent->isPrivate()) torrent->addTrackers(m_additionalTrackerList); + bool addPaused = data.addPaused; + if (data.addPaused == TriStateBool::Undefined) + addPaused = isAddTorrentPaused(); + + // Start torrent because it was added in paused state + if (!addPaused) + torrent->resume(); logger->addMessage(tr("'%1' added to download list.", "'torrent name' was added to download list.") .arg(torrent->name())); @@ -4161,14 +3308,13 @@ saveTorrentResumeData(torrent); } - if (((torrent->ratioLimit() >= 0) || (torrent->seedingTimeLimit() >= 0)) - && !m_seedingLimitTimer->isActive()) - m_seedingLimitTimer->start(); + if ((torrent->ratioLimit() >= 0) && !m_bigRatioTimer->isActive()) + m_bigRatioTimer->start(); // Send torrent addition signal emit torrentAdded(torrent); // Send new torrent signal - if (!params.restored) + if (!data.resumed) emit torrentNew(torrent); } @@ -4176,7 +3322,7 @@ { if (p->error) { qDebug("/!\\ Error: Failed to add torrent!"); - QString msg = QString::fromStdString(p->message()); + QString msg = Utils::String::fromStdString(p->message()); Logger::instance()->addMessage(tr("Couldn't add torrent. Reason: %1").arg(msg), Log::WARNING); emit addTorrentFailed(msg); } @@ -4189,38 +3335,20 @@ { if (m_loadedMetadata.contains(p->info_hash)) emit metadataLoaded(m_loadedMetadata.take(p->info_hash)); - - if (m_removingTorrents.contains(p->info_hash)) { - const RemovingTorrentData tmpRemovingTorrentData = m_removingTorrents[p->info_hash]; - if (!tmpRemovingTorrentData.requestedFileDeletion) { - LogMsg(tr("'%1' was removed from the transfer list.", "'xxx.avi' was removed...").arg(tmpRemovingTorrentData.name)); - m_removingTorrents.remove(p->info_hash); - } - } } void Session::handleTorrentDeletedAlert(libt::torrent_deleted_alert *p) { - if (!m_removingTorrents.contains(p->info_hash)) - return; - const RemovingTorrentData tmpRemovingTorrentData = m_removingTorrents.take(p->info_hash); - Utils::Fs::smartRemoveEmptyFolderTree(tmpRemovingTorrentData.savePathToRemove); - - LogMsg(tr("'%1' was removed from the transfer list and hard disk.", "'xxx.avi' was removed...").arg(tmpRemovingTorrentData.name)); + const QString path = m_savePathsToRemove.take(p->info_hash); + if (path == torrentTempPath(p->info_hash)) + Utils::Fs::smartRemoveEmptyFolderTree(path); } void Session::handleTorrentDeleteFailedAlert(libt::torrent_delete_failed_alert *p) { - if (!m_removingTorrents.contains(p->info_hash)) - return; - const RemovingTorrentData tmpRemovingTorrentData = m_removingTorrents.take(p->info_hash); // libtorrent won't delete the directory if it contains files not listed in the torrent, // so we remove the directory ourselves - Utils::Fs::smartRemoveEmptyFolderTree(tmpRemovingTorrentData.savePathToRemove); - - LogMsg(tr("'%1' was removed from the transfer list but the files couldn't be deleted. Error: %2", "'xxx.avi' was removed...") - .arg(tmpRemovingTorrentData.name, QString::fromLocal8Bit(p->error.message().c_str())) - , Log::CRITICAL); + Utils::Fs::smartRemoveEmptyFolderTree(m_savePathsToRemove.take(p->info_hash)); } void Session::handleMetadataReceivedAlert(libt::metadata_received_alert *p) @@ -4241,27 +3369,22 @@ // NOTE: Check this function! TorrentHandle *const torrent = m_torrents.value(p->handle.info_hash()); if (torrent) { - const InfoHash hash = torrent->hash(); - if (!m_recentErroredTorrents.contains(hash)) { - m_recentErroredTorrents.insert(hash); - const QString msg = QString::fromStdString(p->message()); - LogMsg(tr("An I/O error occurred, '%1' paused. %2").arg(torrent->name(), msg)); - emit fullDiskError(torrent, msg); - } - - m_recentErroredTorrentsTimer->start(); + QString msg = Utils::String::fromStdString(p->message()); + Logger::instance()->addMessage(tr("An I/O error occurred, '%1' paused. %2") + .arg(torrent->name()).arg(msg)); + emit fullDiskError(torrent, msg); } } void Session::handlePortmapWarningAlert(libt::portmap_error_alert *p) { - Logger::instance()->addMessage(tr("UPnP/NAT-PMP: Port mapping failure, message: %1").arg(QString::fromStdString(p->message())), Log::CRITICAL); + Logger::instance()->addMessage(tr("UPnP/NAT-PMP: Port mapping failure, message: %1").arg(Utils::String::fromStdString(p->message())), Log::CRITICAL); } void Session::handlePortmapAlert(libt::portmap_alert *p) { qDebug("UPnP Success, msg: %s", p->message().c_str()); - Logger::instance()->addMessage(tr("UPnP/NAT-PMP: Port mapping successful, message: %1").arg(QString::fromStdString(p->message())), Log::INFO); + Logger::instance()->addMessage(tr("UPnP/NAT-PMP: Port mapping successful, message: %1").arg(Utils::String::fromStdString(p->message())), Log::INFO); } void Session::handlePeerBlockedAlert(libt::peer_blocked_alert *p) @@ -4304,13 +3427,7 @@ void Session::handleUrlSeedAlert(libt::url_seed_alert *p) { - Logger::instance()->addMessage(tr("URL seed lookup failed for URL: '%1', message: %2") -#if LIBTORRENT_VERSION_NUM >= 10100 - .arg(QString::fromStdString(p->server_url())) -#else - .arg(QString::fromStdString(p->url)) -#endif - .arg(QString::fromStdString(p->message())), Log::CRITICAL); + Logger::instance()->addMessage(tr("URL seed lookup failed for URL: '%1', message: %2").arg(Utils::String::fromStdString(p->url)).arg(Utils::String::fromStdString(p->message())), Log::CRITICAL); } void Session::handleListenSucceededAlert(libt::listen_succeeded_alert *p) @@ -4323,10 +3440,8 @@ proto = "TCP"; else if (p->sock_type == libt::listen_succeeded_alert::tcp_ssl) proto = "TCP_SSL"; - qDebug() << "Successfully listening on " << proto << p->endpoint.address().to_string(ec).c_str() << '/' << p->endpoint.port(); - Logger::instance()->addMessage( - tr("qBittorrent is successfully listening on interface %1 port: %2/%3", "e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881") - .arg(p->endpoint.address().to_string(ec).c_str(), proto, QString::number(p->endpoint.port())), Log::INFO); + qDebug() << "Successfully listening on " << proto << p->endpoint.address().to_string(ec).c_str() << "/" << p->endpoint.port(); + Logger::instance()->addMessage(tr("qBittorrent is successfully listening on interface %1 port: %2/%3", "e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881").arg(p->endpoint.address().to_string(ec).c_str()).arg(proto).arg(QString::number(p->endpoint.port())), Log::INFO); // Force reannounce on all torrents because some trackers blacklist some ports std::vector torrents = m_nativeSession->get_torrents(); @@ -4350,13 +3465,12 @@ proto = "I2P"; else if (p->sock_type == libt::listen_failed_alert::socks5) proto = "SOCKS5"; - qDebug() << "Failed listening on " << proto << p->endpoint.address().to_string(ec).c_str() << '/' << p->endpoint.port(); + qDebug() << "Failed listening on " << proto << p->endpoint.address().to_string(ec).c_str() << "/" << p->endpoint.port(); Logger::instance()->addMessage( - tr("qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4.", - "e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use.") - .arg(p->endpoint.address().to_string(ec).c_str(), proto, QString::number(p->endpoint.port()) - , QString::fromLocal8Bit(p->error.message().c_str())) - , Log::CRITICAL); + tr("qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4.", + "e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use.") + .arg(p->endpoint.address().to_string(ec).c_str()).arg(proto).arg(QString::number(p->endpoint.port())) + .arg(QString::fromLocal8Bit(p->error.message().c_str())), Log::CRITICAL); } void Session::handleExternalIPAlert(libt::external_ip_alert *p) @@ -4365,116 +3479,8 @@ Logger::instance()->addMessage(tr("External IP: %1", "e.g. External IP: 192.168.0.1").arg(p->external_address.to_string(ec).c_str()), Log::INFO); } -#if LIBTORRENT_VERSION_NUM >= 10100 -void Session::handleSessionStatsAlert(libt::session_stats_alert *p) -{ - qreal interval = m_statsUpdateTimer.restart() / 1000.; - - m_status.hasIncomingConnections = static_cast(p->values[m_metricIndices.net.hasIncomingConnections]); - - const auto ipOverheadDownload = p->values[m_metricIndices.net.recvIPOverheadBytes]; - const auto ipOverheadUpload = p->values[m_metricIndices.net.sentIPOverheadBytes]; - const auto totalDownload = p->values[m_metricIndices.net.recvBytes] + ipOverheadDownload; - const auto totalUpload = p->values[m_metricIndices.net.sentBytes] + ipOverheadUpload; - const auto totalPayloadDownload = p->values[m_metricIndices.net.recvPayloadBytes]; - const auto totalPayloadUpload = p->values[m_metricIndices.net.sentPayloadBytes]; - const auto trackerDownload = p->values[m_metricIndices.net.recvTrackerBytes]; - const auto trackerUpload = p->values[m_metricIndices.net.sentTrackerBytes]; - const auto dhtDownload = p->values[m_metricIndices.dht.dhtBytesIn]; - const auto dhtUpload = p->values[m_metricIndices.dht.dhtBytesOut]; - - auto calcRate = [interval](quint64 previous, quint64 current) - { - Q_ASSERT(current >= previous); - return static_cast((current - previous) / interval); - }; - - m_status.payloadDownloadRate = calcRate(m_status.totalPayloadDownload, totalPayloadDownload); - m_status.payloadUploadRate = calcRate(m_status.totalPayloadUpload, totalPayloadUpload); - m_status.downloadRate = calcRate(m_status.totalDownload, totalDownload); - m_status.uploadRate = calcRate(m_status.totalUpload, totalUpload); - m_status.ipOverheadDownloadRate = calcRate(m_status.ipOverheadDownload, ipOverheadDownload); - m_status.ipOverheadUploadRate = calcRate(m_status.ipOverheadUpload, ipOverheadUpload); - m_status.dhtDownloadRate = calcRate(m_status.dhtDownload, dhtDownload); - m_status.dhtUploadRate = calcRate(m_status.dhtUpload, dhtUpload); - m_status.trackerDownloadRate = calcRate(m_status.trackerDownload, trackerDownload); - m_status.trackerUploadRate = calcRate(m_status.trackerUpload, trackerUpload); - - m_status.totalDownload = totalDownload; - m_status.totalUpload = totalUpload; - m_status.totalPayloadDownload = totalPayloadDownload; - m_status.totalPayloadUpload = totalPayloadUpload; - m_status.ipOverheadDownload = ipOverheadDownload; - m_status.ipOverheadUpload = ipOverheadUpload; - m_status.trackerDownload = trackerDownload; - m_status.trackerUpload = trackerUpload; - m_status.dhtDownload = dhtDownload; - m_status.dhtUpload = dhtUpload; - m_status.totalWasted = p->values[m_metricIndices.net.recvRedundantBytes] - + p->values[m_metricIndices.net.recvFailedBytes]; - m_status.dhtNodes = p->values[m_metricIndices.dht.dhtNodes]; - m_status.diskReadQueue = p->values[m_metricIndices.peer.numPeersUpDisk]; - m_status.diskWriteQueue = p->values[m_metricIndices.peer.numPeersDownDisk]; - m_status.peersCount = p->values[m_metricIndices.peer.numPeersConnected]; - - const int numBlocksRead = p->values[m_metricIndices.disk.numBlocksRead]; - const int numBlocksCacheHits = p->values[m_metricIndices.disk.numBlocksCacheHits]; - m_cacheStatus.totalUsedBuffers = p->values[m_metricIndices.disk.diskBlocksInUse]; - m_cacheStatus.readRatio = static_cast(numBlocksCacheHits) / std::max(numBlocksCacheHits + numBlocksRead, 1); - m_cacheStatus.jobQueueLength = p->values[m_metricIndices.disk.queuedDiskJobs]; - - quint64 totalJobs = p->values[m_metricIndices.disk.writeJobs] + p->values[m_metricIndices.disk.readJobs] - + p->values[m_metricIndices.disk.hashJobs]; - m_cacheStatus.averageJobTime = totalJobs > 0 - ? (p->values[m_metricIndices.disk.diskJobTime] / totalJobs) : 0; - - emit statsUpdated(); -} -#else -void Session::updateStats() -{ - libt::session_status ss = m_nativeSession->status(); - m_status.hasIncomingConnections = ss.has_incoming_connections; - m_status.payloadDownloadRate = ss.payload_download_rate; - m_status.payloadUploadRate = ss.payload_upload_rate; - m_status.downloadRate = ss.download_rate; - m_status.uploadRate = ss.upload_rate; - m_status.ipOverheadDownloadRate = ss.ip_overhead_download_rate; - m_status.ipOverheadUploadRate = ss.ip_overhead_upload_rate; - m_status.dhtDownloadRate = ss.dht_download_rate; - m_status.dhtUploadRate = ss.dht_upload_rate; - m_status.trackerDownloadRate = ss.tracker_download_rate; - m_status.trackerUploadRate = ss.tracker_upload_rate; - - m_status.totalDownload = ss.total_download; - m_status.totalUpload = ss.total_upload; - m_status.totalPayloadDownload = ss.total_payload_download; - m_status.totalPayloadUpload = ss.total_payload_upload; - m_status.totalWasted = ss.total_redundant_bytes + ss.total_failed_bytes; - m_status.diskReadQueue = ss.disk_read_queue; - m_status.diskWriteQueue = ss.disk_write_queue; - m_status.dhtNodes = ss.dht_nodes; - m_status.peersCount = ss.num_peers; - - libt::cache_status cs = m_nativeSession->get_cache_status(); - m_cacheStatus.totalUsedBuffers = cs.total_used_buffers; - m_cacheStatus.readRatio = cs.blocks_read > 0 - ? static_cast(cs.blocks_read_hit) / cs.blocks_read - : -1; - m_cacheStatus.jobQueueLength = cs.job_queue_length; - m_cacheStatus.averageJobTime = cs.average_job_time; - m_cacheStatus.queuedBytes = cs.queued_bytes; // it seems that it is constantly equal to zero - - emit statsUpdated(); -} -#endif - void Session::handleStateUpdateAlert(libt::state_update_alert *p) { -#if LIBTORRENT_VERSION_NUM < 10100 - updateStats(); -#endif - foreach (const libt::torrent_status &status, p->status) { TorrentHandle *const torrent = m_torrents.value(status.info_hash); if (torrent) @@ -4510,7 +3516,7 @@ { QFile file(path); if (!file.open(QIODevice::ReadOnly)) { - qDebug("Cannot read file %s: %s", qUtf8Printable(path), qUtf8Printable(file.errorString())); + qDebug("Cannot read file %s: %s", qPrintable(path), qPrintable(file.errorString())); return false; } @@ -4518,11 +3524,11 @@ return true; } - bool loadTorrentResumeData(const QByteArray &data, CreateTorrentParams &torrentParams, int &prio, MagnetUri &magnetUri) + bool loadTorrentResumeData(const QByteArray &data, AddTorrentData &torrentData, int &prio, MagnetUri &magnetUri) { - torrentParams = CreateTorrentParams(); - torrentParams.restored = true; - torrentParams.skipChecking = false; + torrentData = AddTorrentData(); + torrentData.resumed = true; + torrentData.skipChecking = false; libt::error_code ec; #if LIBTORRENT_VERSION_NUM < 10100 @@ -4535,36 +3541,22 @@ if (ec || (fast.type() != libt::bdecode_node::dict_t)) return false; #endif - torrentParams.savePath = Profile::instance().fromPortablePath( - Utils::Fs::fromNativePath(QString::fromStdString(fast.dict_find_string_value("qBt-savePath")))); - - std::string ratioLimitString = fast.dict_find_string_value("qBt-ratioLimit"); - if (ratioLimitString.empty()) - torrentParams.ratioLimit = fast.dict_find_int_value("qBt-ratioLimit", TorrentHandle::USE_GLOBAL_RATIO * 1000) / 1000.0; - else - torrentParams.ratioLimit = QString::fromStdString(ratioLimitString).toDouble(); - torrentParams.seedingTimeLimit = fast.dict_find_int_value("qBt-seedingTimeLimit", TorrentHandle::USE_GLOBAL_SEEDING_TIME); + torrentData.savePath = Utils::Fs::fromNativePath(Utils::String::fromStdString(fast.dict_find_string_value("qBt-savePath"))); + torrentData.ratioLimit = Utils::String::fromStdString(fast.dict_find_string_value("qBt-ratioLimit")).toDouble(); // ************************************************************************************** // Workaround to convert legacy label to category // TODO: Should be removed in future - torrentParams.category = QString::fromStdString(fast.dict_find_string_value("qBt-label")); - if (torrentParams.category.isEmpty()) + torrentData.category = Utils::String::fromStdString(fast.dict_find_string_value("qBt-label")); + if (torrentData.category.isEmpty()) // ************************************************************************************** - torrentParams.category = QString::fromStdString(fast.dict_find_string_value("qBt-category")); - // auto because the return type depends on the #if above. - const auto tagsEntry = fast.dict_find_list("qBt-tags"); - if (isList(tagsEntry)) - torrentParams.tags = entryListToSet(tagsEntry); - torrentParams.name = QString::fromStdString(fast.dict_find_string_value("qBt-name")); - torrentParams.hasSeedStatus = fast.dict_find_int_value("qBt-seedStatus"); - torrentParams.disableTempPath = fast.dict_find_int_value("qBt-tempPathDisabled"); - torrentParams.hasRootFolder = fast.dict_find_int_value("qBt-hasRootFolder"); - - magnetUri = MagnetUri(QString::fromStdString(fast.dict_find_string_value("qBt-magnetUri"))); - torrentParams.paused = fast.dict_find_int_value("qBt-paused"); - torrentParams.forced = fast.dict_find_int_value("qBt-forced"); - torrentParams.firstLastPiecePriority = fast.dict_find_int_value("qBt-firstLastPiecePriority"); - torrentParams.sequential = fast.dict_find_int_value("qBt-sequential"); + torrentData.category = Utils::String::fromStdString(fast.dict_find_string_value("qBt-category")); + torrentData.name = Utils::String::fromStdString(fast.dict_find_string_value("qBt-name")); + torrentData.hasSeedStatus = fast.dict_find_int_value("qBt-seedStatus"); + torrentData.disableTempPath = fast.dict_find_int_value("qBt-tempPathDisabled"); + + magnetUri = MagnetUri(Utils::String::fromStdString(fast.dict_find_string_value("qBt-magnetUri"))); + torrentData.addPaused = fast.dict_find_int_value("qBt-paused"); + torrentData.addForced = fast.dict_find_int_value("qBt-forced"); prio = fast.dict_find_int_value("qBt-queuePosition"); @@ -4610,32 +3602,4 @@ qDebug() << Q_FUNC_INFO << " fails: " << exc.what(); } } - -#ifdef Q_OS_WIN - QString convertIfaceNameToGuid(const QString &name) - { - // Under Windows XP or on Qt version <= 5.5 'name' will be a GUID already. - QUuid uuid(name); - if (!uuid.isNull()) - return uuid.toString().toUpper(); // Libtorrent expects the GUID in uppercase - - using PCONVERTIFACENAMETOLUID = NETIO_STATUS (WINAPI *)(const WCHAR *, PNET_LUID); - const auto ConvertIfaceNameToLuid = Utils::Misc::loadWinAPI("Iphlpapi.dll", "ConvertInterfaceNameToLuidW"); - if (!ConvertIfaceNameToLuid) return QString(); - - using PCONVERTIFACELUIDTOGUID = NETIO_STATUS (WINAPI *)(const NET_LUID *, GUID *); - const auto ConvertIfaceLuidToGuid = Utils::Misc::loadWinAPI("Iphlpapi.dll", "ConvertInterfaceLuidToGuid"); - if (!ConvertIfaceLuidToGuid) return QString(); - - NET_LUID luid; - LONG res = ConvertIfaceNameToLuid(name.toStdWString().c_str(), &luid); - if (res == 0) { - GUID guid; - if (ConvertIfaceLuidToGuid(&luid, &guid) == 0) - return QUuid(guid).toString().toUpper(); - } - - return QString(); - } -#endif } diff -Nru qbittorrent-4.1.3/src/base/bittorrent/session.h qbittorrent-3.3.15/src/base/bittorrent/session.h --- qbittorrent-4.1.3/src/base/bittorrent/session.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/session.h 2017-08-03 20:30:10.000000000 +0000 @@ -30,33 +30,24 @@ #ifndef BITTORRENT_SESSION_H #define BITTORRENT_SESSION_H -#include - #include +#include #include #include -#include #include +#if LIBTORRENT_VERSION_NUM < 10100 +#include +#endif #include #include -#include #include #include #include -#if LIBTORRENT_VERSION_NUM < 10100 -#include -#else -#include -#endif - #include "base/settingvalue.h" #include "base/tristatebool.h" #include "base/types.h" -#include "addtorrentparams.h" -#include "cachestatus.h" -#include "sessionstatus.h" #include "torrentinfo.h" namespace libtorrent @@ -64,12 +55,14 @@ class session; struct torrent_handle; class entry; - struct ip_filter; + struct add_torrent_params; + struct pe_settings; #if LIBTORRENT_VERSION_NUM < 10100 struct session_settings; #else struct settings_pack; #endif + struct session_status; class alert; struct torrent_alert; @@ -103,9 +96,6 @@ struct listen_succeeded_alert; struct listen_failed_alert; struct external_ip_alert; -#if LIBTORRENT_VERSION_NUM >= 10100 - struct session_stats_alert; -#endif } class QThread; @@ -113,6 +103,7 @@ class QStringList; class QString; class QUrl; +template class QList; class FilterParserThread; class BandwidthScheduler; @@ -134,11 +125,27 @@ namespace BitTorrent { class InfoHash; + class CacheStatus; + class SessionStatus; class TorrentHandle; class Tracker; class MagnetUri; class TrackerEntry; - struct CreateTorrentParams; + struct AddTorrentData; + + struct AddTorrentParams + { + QString name; + QString category; + QString savePath; + bool disableTempPath = false; // e.g. for imported torrents + bool sequential = false; + TriStateBool addForced; + TriStateBool addPaused; + QVector filePriorities; // used if TorrentInfo is set + bool ignoreShareRatio = false; + bool skipChecking = false; + }; struct TorrentStatusReport { @@ -152,93 +159,6 @@ uint nbErrored = 0; }; - class SessionSettingsEnums - { - Q_GADGET - - public: - // TODO: remove `SessionSettingsEnums` wrapper when we can use `Q_ENUM_NS` directly (QT >= 5.8 only) - enum class ChokingAlgorithm : int - { - FixedSlots = 0, - RateBased = 1 - }; - Q_ENUM(ChokingAlgorithm) - - enum class SeedChokingAlgorithm : int - { - RoundRobin = 0, - FastestUpload = 1, - AntiLeech = 2 - }; - Q_ENUM(SeedChokingAlgorithm) - - enum class MixedModeAlgorithm : int - { - TCP = 0, - Proportional = 1 - }; - Q_ENUM(MixedModeAlgorithm) - - enum class BTProtocol : int - { - Both = 0, - TCP = 1, - UTP = 2 - }; - Q_ENUM(BTProtocol) - }; - using ChokingAlgorithm = SessionSettingsEnums::ChokingAlgorithm; - using SeedChokingAlgorithm = SessionSettingsEnums::SeedChokingAlgorithm; - using MixedModeAlgorithm = SessionSettingsEnums::MixedModeAlgorithm; - using BTProtocol = SessionSettingsEnums::BTProtocol; - -#if LIBTORRENT_VERSION_NUM >= 10100 - struct SessionMetricIndices - { - struct - { - int hasIncomingConnections = 0; - int sentPayloadBytes = 0; - int recvPayloadBytes = 0; - int sentBytes = 0; - int recvBytes = 0; - int sentIPOverheadBytes = 0; - int recvIPOverheadBytes = 0; - int sentTrackerBytes = 0; - int recvTrackerBytes = 0; - int recvRedundantBytes = 0; - int recvFailedBytes = 0; - } net; - - struct - { - int numPeersConnected = 0; - int numPeersUpDisk = 0; - int numPeersDownDisk = 0; - } peer; - - struct - { - int dhtBytesIn = 0; - int dhtBytesOut = 0; - int dhtNodes = 0; - } dht; - - struct - { - int diskBlocksInUse = 0; - int numBlocksRead = 0; - int numBlocksCacheHits = 0; - int writeJobs = 0; - int readJobs = 0; - int hashJobs = 0; - int queuedDiskJobs = 0; - int diskJobTime = 0; - } disk; - }; -#endif - class Session : public QObject { Q_OBJECT @@ -255,13 +175,13 @@ void setTempPath(QString path); bool isTempPathEnabled() const; void setTempPathEnabled(bool enabled); - QString torrentTempPath(const TorrentInfo &torrentInfo) const; + QString torrentTempPath(const InfoHash &hash) const; static bool isValidCategoryName(const QString &name); // returns category itself and all top level categories static QStringList expandCategory(const QString &category); - const QStringMap &categories() const; + QStringList categories() const; QString categorySavePath(const QString &categoryName) const; bool addCategory(const QString &name, const QString &savePath = ""); bool editCategory(const QString &name, const QString &savePath); @@ -269,12 +189,6 @@ bool isSubcategoriesEnabled() const; void setSubcategoriesEnabled(bool value); - static bool isValidTag(const QString &tag); - QSet tags() const; - bool hasTag(const QString &tag) const; - bool addTag(const QString &tag); - bool removeTag(const QString &tag); - // Torrent Management Mode subsystem (TMM) // // Each torrent can be either in Manual mode or in Automatic mode @@ -297,8 +211,6 @@ qreal globalMaxRatio() const; void setGlobalMaxRatio(qreal ratio); - int globalMaxSeedingMinutes() const; - void setGlobalMaxSeedingMinutes(int minutes); bool isDHTEnabled() const; void setDHTEnabled(bool enabled); bool isLSDEnabled() const; @@ -307,8 +219,6 @@ void setPeXEnabled(bool enabled); bool isAddTorrentPaused() const; void setAddTorrentPaused(bool value); - bool isCreateTorrentSubfolder() const; - void setCreateTorrentSubfolder(bool value); bool isTrackerEnabled() const; void setTrackerEnabled(bool enabled); bool isAppendExtensionEnabled() const; @@ -359,10 +269,6 @@ void setForceProxyEnabled(bool enabled); bool isProxyPeerConnectionsEnabled() const; void setProxyPeerConnectionsEnabled(bool enabled); - ChokingAlgorithm chokingAlgorithm() const; - void setChokingAlgorithm(ChokingAlgorithm mode); - SeedChokingAlgorithm seedChokingAlgorithm() const; - void setSeedChokingAlgorithm(SeedChokingAlgorithm mode); bool isAddTrackersEnabled() const; void setAddTrackersEnabled(bool enabled); QString additionalTrackers() const; @@ -373,44 +279,22 @@ void setIPFilterFile(QString path); bool announceToAllTrackers() const; void setAnnounceToAllTrackers(bool val); - bool announceToAllTiers() const; - void setAnnounceToAllTiers(bool val); - int asyncIOThreads() const; - void setAsyncIOThreads(int num); - int diskCacheSize() const; - void setDiskCacheSize(int size); - int diskCacheTTL() const; - void setDiskCacheTTL(int ttl); + uint diskCacheSize() const; + void setDiskCacheSize(uint size); + uint diskCacheTTL() const; + void setDiskCacheTTL(uint ttl); bool useOSCache() const; void setUseOSCache(bool use); - bool isGuidedReadCacheEnabled() const; - void setGuidedReadCacheEnabled(bool enabled); - bool isCoalesceReadWriteEnabled() const; - void setCoalesceReadWriteEnabled(bool enabled); - bool isSuggestModeEnabled() const; - void setSuggestMode(bool mode); - int sendBufferWatermark() const; - void setSendBufferWatermark(int value); - int sendBufferLowWatermark() const; - void setSendBufferLowWatermark(int value); - int sendBufferWatermarkFactor() const; - void setSendBufferWatermarkFactor(int value); bool isAnonymousModeEnabled() const; void setAnonymousModeEnabled(bool enabled); bool isQueueingSystemEnabled() const; void setQueueingSystemEnabled(bool enabled); bool ignoreSlowTorrentsForQueueing() const; void setIgnoreSlowTorrentsForQueueing(bool ignore); - int downloadRateForSlowTorrents() const; - void setDownloadRateForSlowTorrents(int rateInKibiBytes); - int uploadRateForSlowTorrents() const; - void setUploadRateForSlowTorrents(int rateInKibiBytes); - int slowTorrentsInactivityTimer() const; - void setSlowTorrentsInactivityTimer(int timeInSeconds); - int outgoingPortsMin() const; - void setOutgoingPortsMin(int min); - int outgoingPortsMax() const; - void setOutgoingPortsMax(int max); + uint outgoingPortsMin() const; + void setOutgoingPortsMin(uint min); + uint outgoingPortsMax() const; + void setOutgoingPortsMax(uint max); bool ignoreLimitsOnLAN() const; void setIgnoreLimitsOnLAN(bool ignore); bool includeOverheadInLimits() const; @@ -435,18 +319,12 @@ void setMaxActiveUploads(int max); int maxActiveTorrents() const; void setMaxActiveTorrents(int max); - BTProtocol btProtocol() const; - void setBTProtocol(BTProtocol protocol); + bool isUTPEnabled() const; + void setUTPEnabled(bool enabled); bool isUTPRateLimited() const; void setUTPRateLimited(bool limited); - MixedModeAlgorithm utpMixedMode() const; - void setUtpMixedMode(MixedModeAlgorithm mode); - bool multiConnectionsPerIpEnabled() const; - void setMultiConnectionsPerIpEnabled(bool enabled); bool isTrackerFilteringEnabled() const; void setTrackerFilteringEnabled(bool enabled); - QStringList bannedIPs() const; - void setBannedIPs(const QStringList &newList); void startUpTorrents(); TorrentHandle *findTorrent(const InfoHash &hash) const; @@ -454,9 +332,8 @@ TorrentStatusReport torrentStatusReport() const; bool hasActiveTorrents() const; bool hasUnfinishedTorrents() const; - bool hasRunningSeed() const; - const SessionStatus &status() const; - const CacheStatus &cacheStatus() const; + SessionStatus status() const; + CacheStatus cacheStatus() const; quint64 getAlltimeDL() const; quint64 getAlltimeUL() const; bool isListening() const; @@ -480,13 +357,9 @@ void bottomTorrentsPriority(const QStringList &hashes); // TorrentHandle interface - void handleTorrentShareLimitChanged(TorrentHandle *const torrent); - void handleTorrentsPrioritiesChanged(); - void handleTorrentNameChanged(TorrentHandle *const torrent); + void handleTorrentRatioLimitChanged(TorrentHandle *const torrent); void handleTorrentSavePathChanged(TorrentHandle *const torrent); void handleTorrentCategoryChanged(TorrentHandle *const torrent, const QString &oldCategory); - void handleTorrentTagAdded(TorrentHandle *const torrent, const QString &tag); - void handleTorrentTagRemoved(TorrentHandle *const torrent, const QString &tag); void handleTorrentSavingModeChanged(TorrentHandle *const torrent); void handleTorrentMetadataReceived(TorrentHandle *const torrent); void handleTorrentPaused(TorrentHandle *const torrent); @@ -506,7 +379,6 @@ void handleTorrentTrackerAuthenticationRequired(TorrentHandle *const torrent, const QString &trackerUrl); signals: - void statsUpdated(); void torrentsUpdated(); void addTorrentFailed(const QString &error); void torrentAdded(BitTorrent::TorrentHandle *const torrent); @@ -518,8 +390,6 @@ void torrentFinishedChecking(BitTorrent::TorrentHandle *const torrent); void torrentSavePathChanged(BitTorrent::TorrentHandle *const torrent); void torrentCategoryChanged(BitTorrent::TorrentHandle *const torrent, const QString &oldCategory); - void torrentTagAdded(TorrentHandle *const torrent, const QString &tag); - void torrentTagRemoved(TorrentHandle *const torrent, const QString &tag); void torrentSavingModeChanged(BitTorrent::TorrentHandle *const torrent); void allTorrentsFinished(); void metadataLoaded(const BitTorrent::TorrentInfo &info); @@ -541,38 +411,29 @@ void categoryAdded(const QString &categoryName); void categoryRemoved(const QString &categoryName); void subcategoriesSupportChanged(); - void tagAdded(const QString &tag); - void tagRemoved(const QString &tag); private slots: void configureDeferred(); void readAlerts(); void refresh(); - void processShareLimits(); + void processBigRatios(); void generateResumeData(bool final = false); void handleIPFilterParsed(int ruleCount); void handleIPFilterError(); - void handleDownloadFinished(const QString &url, const QByteArray &data); + void handleDownloadFinished(const QString &url, const QString &filePath); void handleDownloadFailed(const QString &url, const QString &reason); void handleRedirectedToMagnet(const QString &url, const QString &magnetUri); + void switchToAlternativeMode(bool alternative); // Session reconfiguration triggers void networkOnlineStateChanged(const bool online); void networkConfigurationChange(const QNetworkConfiguration&); private: - struct RemovingTorrentData - { - QString name; - QString savePathToRemove; - bool requestedFileDeletion; - }; - - explicit Session(QObject *parent = nullptr); + explicit Session(QObject *parent = 0); ~Session(); bool hasPerTorrentRatioLimit() const; - bool hasPerTorrentSeedingTimeLimit() const; void initResumeFolder(); @@ -581,33 +442,29 @@ #if LIBTORRENT_VERSION_NUM < 10100 void configure(libtorrent::session_settings &sessionSettings); void adjustLimits(libtorrent::session_settings &sessionSettings); - void applyBandwidthLimits(libtorrent::session_settings &sessionSettings); #else void configure(libtorrent::settings_pack &settingsPack); - void configurePeerClasses(); void adjustLimits(libtorrent::settings_pack &settingsPack); - void applyBandwidthLimits(libtorrent::settings_pack &settingsPack); - void initMetrics(); #endif void adjustLimits(); - void applyBandwidthLimits(); - void processBannedIPs(libtorrent::ip_filter &filter); + void processBannedIPs(); const QStringList getListeningIPs(); void configureListeningInterface(); + void changeSpeedLimitMode_impl(bool alternative); void enableTracker(bool enable); void enableBandwidthScheduler(); void populateAdditionalTrackers(); void enableIPFilter(); void disableIPFilter(); - bool addTorrent_impl(CreateTorrentParams params, const MagnetUri &magnetUri, + bool addTorrent_impl(AddTorrentData addData, const MagnetUri &magnetUri, TorrentInfo torrentInfo = TorrentInfo(), const QByteArray &fastresumeData = QByteArray()); bool findIncompleteFiles(TorrentInfo &torrentInfo, QString &savePath) const; - void updateSeedingLimitTimer(); + void updateRatioTimer(); void exportTorrentFile(TorrentHandle *const torrent, TorrentExportFolder folder = TorrentExportFolder::Regular); - void saveTorrentResumeData(TorrentHandle *const torrent); + void saveTorrentResumeData(TorrentHandle *const torrent, bool finalSave = false); void handleAlert(libtorrent::alert *a); void dispatchTorrentAlert(libtorrent::alert *a); @@ -626,9 +483,6 @@ void handleListenSucceededAlert(libtorrent::listen_succeeded_alert *p); void handleListenFailedAlert(libtorrent::listen_failed_alert *p); void handleExternalIPAlert(libtorrent::external_ip_alert *p); -#if LIBTORRENT_VERSION_NUM >= 10100 - void handleSessionStatsAlert(libtorrent::session_stats_alert *p); -#endif void createTorrentHandle(const libtorrent::torrent_handle &nativeHandle); @@ -636,7 +490,6 @@ #if LIBTORRENT_VERSION_NUM < 10100 void dispatchAlerts(libtorrent::alert *alertPtr); - void updateStats(); #endif void getPendingAlerts(std::vector &out, ulong time = 0); @@ -655,28 +508,17 @@ CachedSettingValue m_isTrackerFilteringEnabled; CachedSettingValue m_IPFilterFile; CachedSettingValue m_announceToAllTrackers; - CachedSettingValue m_announceToAllTiers; - CachedSettingValue m_asyncIOThreads; - CachedSettingValue m_diskCacheSize; - CachedSettingValue m_diskCacheTTL; + CachedSettingValue m_diskCacheSize; + CachedSettingValue m_diskCacheTTL; CachedSettingValue m_useOSCache; - CachedSettingValue m_guidedReadCacheEnabled; - CachedSettingValue m_coalesceReadWriteEnabled; - CachedSettingValue m_isSuggestMode; - CachedSettingValue m_sendBufferWatermark; - CachedSettingValue m_sendBufferLowWatermark; - CachedSettingValue m_sendBufferWatermarkFactor; CachedSettingValue m_isAnonymousModeEnabled; CachedSettingValue m_isQueueingEnabled; CachedSettingValue m_maxActiveDownloads; CachedSettingValue m_maxActiveUploads; CachedSettingValue m_maxActiveTorrents; CachedSettingValue m_ignoreSlowTorrentsForQueueing; - CachedSettingValue m_downloadRateForSlowTorrents; - CachedSettingValue m_uploadRateForSlowTorrents; - CachedSettingValue m_slowTorrentsInactivityTimer; - CachedSettingValue m_outgoingPortsMin; - CachedSettingValue m_outgoingPortsMax; + CachedSettingValue m_outgoingPortsMin; + CachedSettingValue m_outgoingPortsMax; CachedSettingValue m_ignoreLimitsOnLAN; CachedSettingValue m_includeOverheadInLimits; CachedSettingValue m_announceIP; @@ -686,16 +528,12 @@ CachedSettingValue m_maxUploads; CachedSettingValue m_maxConnectionsPerTorrent; CachedSettingValue m_maxUploadsPerTorrent; - CachedSettingValue m_btProtocol; + CachedSettingValue m_isUTPEnabled; CachedSettingValue m_isUTPRateLimited; - CachedSettingValue m_utpMixedMode; - CachedSettingValue m_multiConnectionsPerIpEnabled; CachedSettingValue m_isAddTrackersEnabled; CachedSettingValue m_additionalTrackers; CachedSettingValue m_globalMaxRatio; - CachedSettingValue m_globalMaxSeedingMinutes; CachedSettingValue m_isAddTorrentPaused; - CachedSettingValue m_isCreateTorrentSubfolder; CachedSettingValue m_isAppendExtensionEnabled; CachedSettingValue m_refreshInterval; CachedSettingValue m_isPreallocationEnabled; @@ -717,10 +555,7 @@ CachedSettingValue m_encryption; CachedSettingValue m_isForceProxyEnabled; CachedSettingValue m_isProxyPeerConnectionsEnabled; - CachedSettingValue m_chokingAlgorithm; - CachedSettingValue m_seedChokingAlgorithm; CachedSettingValue m_storedCategories; - CachedSettingValue m_storedTags; CachedSettingValue m_maxRatioAction; CachedSettingValue m_defaultSavePath; CachedSettingValue m_tempPath; @@ -743,10 +578,11 @@ QList m_additionalTrackerList; QString m_resumeFolderPath; QFile m_resumeFolderLock; + QHash m_savePathsToRemove; bool m_useProxy; QTimer *m_refreshTimer; - QTimer *m_seedingLimitTimer; + QTimer *m_bigRatioTimer; QTimer *m_resumeDataTimer; Statistics *m_statistics; // IP filtering @@ -760,29 +596,17 @@ QHash m_loadedMetadata; QHash m_torrents; - QHash m_addingTorrents; + QHash m_addingTorrents; QHash m_downloadedTorrents; - QHash m_removingTorrents; TorrentStatusReport m_torrentStatusReport; QStringMap m_categories; - QSet m_tags; - - // I/O errored torrents - QSet m_recentErroredTorrents; - QTimer *m_recentErroredTorrentsTimer; #if LIBTORRENT_VERSION_NUM < 10100 QMutex m_alertsMutex; QWaitCondition m_alertsWaitCondition; std::vector m_alerts; -#else - SessionMetricIndices m_metricIndices; - QElapsedTimer m_statsUpdateTimer; #endif - SessionStatus m_status; - CacheStatus m_cacheStatus; - QNetworkConfigurationManager m_networkManager; static Session *m_instance; diff -Nru qbittorrent-4.1.3/src/base/bittorrent/sessionstatus.cpp qbittorrent-3.3.15/src/base/bittorrent/sessionstatus.cpp --- qbittorrent-4.1.3/src/base/bittorrent/sessionstatus.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/sessionstatus.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,136 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2015 Vladimir Golovnev + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + */ + +#include "sessionstatus.h" + +using namespace BitTorrent; + +SessionStatus::SessionStatus(const libtorrent::session_status &nativeStatus) + : m_nativeStatus(nativeStatus) +{ +} + +bool SessionStatus::hasIncomingConnections() const +{ + return m_nativeStatus.has_incoming_connections; +} + +int SessionStatus::payloadDownloadRate() const +{ + return m_nativeStatus.payload_download_rate; +} + +int SessionStatus::payloadUploadRate() const +{ + return m_nativeStatus.payload_upload_rate; +} + +int SessionStatus::downloadRate() const +{ + return m_nativeStatus.download_rate; +} + +int SessionStatus::uploadRate() const +{ + return m_nativeStatus.upload_rate; +} + +int SessionStatus::ipOverheadDownloadRate() const +{ + return m_nativeStatus.ip_overhead_download_rate; +} + +int SessionStatus::ipOverheadUploadRate() const +{ + return m_nativeStatus.ip_overhead_upload_rate; +} + +int SessionStatus::dhtDownloadRate() const +{ + return m_nativeStatus.dht_download_rate; +} + +int SessionStatus::dhtUploadRate() const +{ + return m_nativeStatus.dht_upload_rate; +} + +int SessionStatus::trackerDownloadRate() const +{ + return m_nativeStatus.tracker_download_rate; +} + +int SessionStatus::trackerUploadRate() const +{ + return m_nativeStatus.tracker_upload_rate; +} + +qlonglong SessionStatus::totalDownload() const +{ + return m_nativeStatus.total_download; +} + +qlonglong SessionStatus::totalUpload() const +{ + return m_nativeStatus.total_upload; +} + +qlonglong SessionStatus::totalPayloadDownload() const +{ + return m_nativeStatus.total_payload_download; +} + +qlonglong SessionStatus::totalPayloadUpload() const +{ + return m_nativeStatus.total_payload_upload; +} + +qlonglong SessionStatus::totalWasted() const +{ + return (m_nativeStatus.total_redundant_bytes + m_nativeStatus.total_failed_bytes); +} + +int SessionStatus::diskReadQueue() const +{ + return m_nativeStatus.disk_read_queue; +} + +int SessionStatus::diskWriteQueue() const +{ + return m_nativeStatus.disk_write_queue; +} + +int SessionStatus::dhtNodes() const +{ + return m_nativeStatus.dht_nodes; +} + +int SessionStatus::peersCount() const +{ + return m_nativeStatus.num_peers; +} diff -Nru qbittorrent-4.1.3/src/base/bittorrent/sessionstatus.h qbittorrent-3.3.15/src/base/bittorrent/sessionstatus.h --- qbittorrent-4.1.3/src/base/bittorrent/sessionstatus.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/sessionstatus.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015, 2017 Vladimir Golovnev + * Copyright (C) 2015 Vladimir Golovnev * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -29,49 +29,50 @@ #ifndef BITTORRENT_SESSIONSTATUS_H #define BITTORRENT_SESSIONSTATUS_H +#include #include namespace BitTorrent { - struct SessionStatus + class SessionStatus { - bool hasIncomingConnections = false; + public: + SessionStatus(const libtorrent::session_status &nativeStatus); - // Current download rate for the BT + bool hasIncomingConnections() const; + + // Return current download rate for the BT // session. Payload means that it only take into // account "useful" part of the rate - quint64 payloadDownloadRate = 0; + int payloadDownloadRate() const; - // Current upload rate for the BT + // Return current upload rate for the BT // session. Payload means that it only take into // account "useful" part of the rate - quint64 payloadUploadRate = 0; + int payloadUploadRate() const; // Additional download/upload rates - quint64 uploadRate = 0; - quint64 downloadRate = 0; - quint64 ipOverheadUploadRate = 0; - quint64 ipOverheadDownloadRate = 0; - quint64 dhtUploadRate = 0; - quint64 dhtDownloadRate = 0; - quint64 trackerUploadRate = 0; - quint64 trackerDownloadRate = 0; - - quint64 totalDownload = 0; - quint64 totalUpload = 0; - quint64 totalPayloadDownload = 0; - quint64 totalPayloadUpload = 0; - quint64 ipOverheadUpload = 0; - quint64 ipOverheadDownload = 0; - quint64 dhtUpload = 0; - quint64 dhtDownload = 0; - quint64 trackerUpload = 0; - quint64 trackerDownload = 0; - quint64 totalWasted = 0; - quint64 diskReadQueue = 0; - quint64 diskWriteQueue = 0; - quint64 dhtNodes = 0; - quint64 peersCount = 0; + int uploadRate() const; + int downloadRate() const; + int ipOverheadUploadRate() const; + int ipOverheadDownloadRate() const; + int dhtUploadRate() const; + int dhtDownloadRate() const; + int trackerUploadRate() const; + int trackerDownloadRate() const; + + qlonglong totalDownload() const; + qlonglong totalUpload() const; + qlonglong totalPayloadDownload() const; + qlonglong totalPayloadUpload() const; + qlonglong totalWasted() const; + int diskReadQueue() const; + int diskWriteQueue() const; + int dhtNodes() const; + int peersCount() const; + + private: + libtorrent::session_status m_nativeStatus; }; } diff -Nru qbittorrent-4.1.3/src/base/bittorrent/torrentcreatorthread.cpp qbittorrent-3.3.15/src/base/bittorrent/torrentcreatorthread.cpp --- qbittorrent-4.1.3/src/base/bittorrent/torrentcreatorthread.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/torrentcreatorthread.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2010 Christophe Dumez + * Copyright (C) 2010 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,196 +24,145 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#include "torrentcreatorthread.h" - -#include - -#include +#include #include -#include -#include #include -#include - -#include +#include +#include +#include +#include +#include #include -#include -#include +#include + +#include +#include +#include -#include "base/global.h" #include "base/utils/fs.h" #include "base/utils/misc.h" #include "base/utils/string.h" - -namespace -{ - // do not include files and folders whose - // name starts with a . - bool fileFilter(const std::string &f) - { - return !Utils::Fs::fileName(QString::fromStdString(f)).startsWith('.'); - } -} +#include "torrentcreatorthread.h" namespace libt = libtorrent; using namespace BitTorrent; +// do not include files and folders whose +// name starts with a . +bool fileFilter(const std::string &f) +{ + return !Utils::Fs::fileName(Utils::String::fromStdString(f)).startsWith('.'); +} + TorrentCreatorThread::TorrentCreatorThread(QObject *parent) : QThread(parent) + , m_private(false) + , m_pieceSize(0) + , m_abort(false) { } TorrentCreatorThread::~TorrentCreatorThread() { - requestInterruption(); + m_abort = true; wait(); } -void TorrentCreatorThread::create(const TorrentCreatorParams ¶ms) +void TorrentCreatorThread::create(const QString &inputPath, const QString &savePath, const QStringList &trackers, + const QStringList &urlSeeds, const QString &comment, bool isPrivate, int pieceSize) { - m_params = params; + m_inputPath = Utils::Fs::fromNativePath(inputPath); + m_savePath = Utils::Fs::fromNativePath(savePath); + if (QFile(m_savePath).exists()) + Utils::Fs::forceRemove(m_savePath); + m_trackers = trackers; + m_urlSeeds = urlSeeds; + m_comment = comment; + m_private = isPrivate; + m_pieceSize = pieceSize; + m_abort = false; + start(); } -void TorrentCreatorThread::sendProgressSignal(int currentPieceIdx, int totalPieces) +void TorrentCreatorThread::sendProgressSignal(int numHashes, int numPieces) { - emit updateProgress(static_cast((currentPieceIdx * 100.) / totalPieces)); + emit updateProgress(static_cast((numHashes * 100.) / numPieces)); } -void TorrentCreatorThread::run() +void TorrentCreatorThread::abortCreation() { - const QString creatorStr("qBittorrent " QBT_VERSION); + m_abort = true; +} +void TorrentCreatorThread::run() +{ emit updateProgress(0); + QString creator_str("qBittorrent " QBT_VERSION); try { - const QString parentPath = Utils::Fs::branchPath(m_params.inputPath) + '/'; - - // Adding files to the torrent libt::file_storage fs; - if (QFileInfo(m_params.inputPath).isFile()) { - libt::add_files(fs, Utils::Fs::toNativePath(m_params.inputPath).toStdString(), fileFilter); - } - else { - // need to sort the file names by natural sort order - QStringList dirs = {m_params.inputPath}; - - QDirIterator dirIter(m_params.inputPath, (QDir::AllDirs | QDir::NoDotAndDotDot), QDirIterator::Subdirectories); - while (dirIter.hasNext()) { - dirIter.next(); - dirs += dirIter.filePath(); - } - std::sort(dirs.begin(), dirs.end(), Utils::String::naturalLessThan); - - QStringList fileNames; - QHash fileSizeMap; - - for (const auto &dir : qAsConst(dirs)) { - QStringList tmpNames; // natural sort files within each dir - - QDirIterator fileIter(dir, QDir::Files); - while (fileIter.hasNext()) { - fileIter.next(); - - const QString relFilePath = fileIter.filePath().mid(parentPath.length()); - tmpNames += relFilePath; - fileSizeMap[relFilePath] = fileIter.fileInfo().size(); - } - - std::sort(tmpNames.begin(), tmpNames.end(), Utils::String::naturalLessThan); - fileNames += tmpNames; - } - - for (const auto &fileName : qAsConst(fileNames)) - fs.add_file(fileName.toStdString(), fileSizeMap[fileName]); - } + // Adding files to the torrent + libt::add_files(fs, Utils::String::toStdString(Utils::Fs::toNativePath(m_inputPath)), fileFilter); + if (m_abort) return; - if (isInterruptionRequested()) return; - -#if LIBTORRENT_VERSION_NUM < 10100 - libt::create_torrent newTorrent(fs, m_params.pieceSize, -1 - , (m_params.isAlignmentOptimized ? libt::create_torrent::optimize : 0)); -#else - libt::create_torrent newTorrent(fs, m_params.pieceSize, -1 - , (m_params.isAlignmentOptimized ? libt::create_torrent::optimize_alignment : 0)); -#endif + libt::create_torrent t(fs, m_pieceSize); // Add url seeds - foreach (QString seed, m_params.urlSeeds) { - seed = seed.trimmed(); - if (!seed.isEmpty()) - newTorrent.add_url_seed(seed.toStdString()); - } + foreach (const QString &seed, m_urlSeeds) + t.add_url_seed(Utils::String::toStdString(seed.trimmed())); int tier = 0; - foreach (const QString &tracker, m_params.trackers) { - if (tracker.isEmpty()) + bool newline = false; + foreach (const QString &tracker, m_trackers) { + if (tracker.isEmpty()) { + if (newline) + continue; ++tier; - else - newTorrent.add_tracker(tracker.trimmed().toStdString(), tier); + newline = true; + continue; + } + t.add_tracker(Utils::String::toStdString(tracker.trimmed()), tier); + newline = false; } - - if (isInterruptionRequested()) return; + if (m_abort) return; // calculate the hash for all pieces - libt::set_piece_hashes(newTorrent, Utils::Fs::toNativePath(parentPath).toStdString() - , [this, &newTorrent](const int n) { sendProgressSignal(n, newTorrent.num_pieces()); }); + const QString parentPath = Utils::Fs::branchPath(m_inputPath) + "/"; + libt::set_piece_hashes(t, Utils::String::toStdString(Utils::Fs::toNativePath(parentPath)), boost::bind(&TorrentCreatorThread::sendProgressSignal, this, _1, t.num_pieces())); // Set qBittorrent as creator and add user comment to // torrent_info structure - newTorrent.set_creator(creatorStr.toUtf8().constData()); - newTorrent.set_comment(m_params.comment.toUtf8().constData()); + t.set_creator(creator_str.toUtf8().constData()); + t.set_comment(m_comment.toUtf8().constData()); // Is private ? - newTorrent.set_priv(m_params.isPrivate); - - if (isInterruptionRequested()) return; - - libt::entry entry = newTorrent.generate(); + t.set_priv(m_private); + if (m_abort) return; - // add source field - if (!m_params.source.isEmpty()) - entry["info"]["source"] = m_params.source.toStdString(); - - if (isInterruptionRequested()) return; - - // create the torrent - std::ofstream outfile( + // create the torrent and print it to out + qDebug("Saving to %s", qPrintable(m_savePath)); #ifdef _MSC_VER - Utils::Fs::toNativePath(m_params.savePath).toStdWString().c_str() + wchar_t *savePathW = new wchar_t[m_savePath.length() + 1]; + int len = Utils::Fs::toNativePath(m_savePath).toWCharArray(savePathW); + savePathW[len] = L'\0'; + std::ofstream outfile(savePathW, std::ios_base::out | std::ios_base::binary); + delete[] savePathW; #else - Utils::Fs::toNativePath(m_params.savePath).toUtf8().constData() + std::ofstream outfile(Utils::Fs::toNativePath(m_savePath).toLocal8Bit().constData(), std::ios_base::out | std::ios_base::binary); #endif - , (std::ios_base::out | std::ios_base::binary | std::ios_base::trunc)); if (outfile.fail()) - throw std::runtime_error(tr("create new torrent file failed").toStdString()); - - if (isInterruptionRequested()) return; + throw std::exception(); - libt::bencode(std::ostream_iterator(outfile), entry); + libt::bencode(std::ostream_iterator(outfile), t.generate()); outfile.close(); emit updateProgress(100); - emit creationSuccess(m_params.savePath, parentPath); + emit creationSuccess(m_savePath, parentPath); } - catch (const std::exception &e) { - emit creationFailure(e.what()); + catch (std::exception& e) { + emit creationFailure(Utils::String::fromStdString(e.what())); } } - -int TorrentCreatorThread::calculateTotalPieces(const QString &inputPath, const int pieceSize, const bool isAlignmentOptimized) -{ - if (inputPath.isEmpty()) - return 0; - - libt::file_storage fs; - libt::add_files(fs, Utils::Fs::toNativePath(inputPath).toStdString(), fileFilter); - -#if LIBTORRENT_VERSION_NUM < 10100 - return libt::create_torrent(fs, pieceSize, -1 - , (isAlignmentOptimized ? libt::create_torrent::optimize : 0)).num_pieces(); -#else - return libt::create_torrent(fs, pieceSize, -1 - , (isAlignmentOptimized ? libt::create_torrent::optimize_alignment : 0)).num_pieces(); -#endif -} diff -Nru qbittorrent-4.1.3/src/base/bittorrent/torrentcreatorthread.h qbittorrent-3.3.15/src/base/bittorrent/torrentcreatorthread.h --- qbittorrent-4.1.3/src/base/bittorrent/torrentcreatorthread.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/torrentcreatorthread.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2010 Christophe Dumez + * Copyright (C) 2010 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,40 +24,29 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef BITTORRENT_TORRENTCREATORTHREAD_H #define BITTORRENT_TORRENTCREATORTHREAD_H -#include #include +#include namespace BitTorrent { - struct TorrentCreatorParams - { - bool isPrivate; - bool isAlignmentOptimized; - int pieceSize; - QString inputPath; - QString savePath; - QString comment; - QString source; - QStringList trackers; - QStringList urlSeeds; - }; - class TorrentCreatorThread : public QThread { Q_OBJECT public: - TorrentCreatorThread(QObject *parent = nullptr); + TorrentCreatorThread(QObject *parent = 0); ~TorrentCreatorThread(); - void create(const TorrentCreatorParams ¶ms); - - static int calculateTotalPieces(const QString &inputPath, const int pieceSize, const bool isAlignmentOptimized); + void create(const QString &inputPath, const QString &savePath, const QStringList &trackers, + const QStringList &urlSeeds, const QString &comment, bool isPrivate, int pieceSize); + void abortCreation(); protected: void run(); @@ -68,9 +57,16 @@ void updateProgress(int progress); private: - void sendProgressSignal(int currentPieceIdx, int totalPieces); + void sendProgressSignal(int numHashes, int numPieces); - TorrentCreatorParams m_params; + QString m_inputPath; + QString m_savePath; + QStringList m_trackers; + QStringList m_urlSeeds; + QString m_comment; + bool m_private; + int m_pieceSize; + bool m_abort; }; } diff -Nru qbittorrent-4.1.3/src/base/bittorrent/torrenthandle.cpp qbittorrent-3.3.15/src/base/bittorrent/torrenthandle.cpp --- qbittorrent-4.1.3/src/base/bittorrent/torrenthandle.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/torrenthandle.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -27,23 +27,20 @@ * exception statement from your version. */ -#include "torrenthandle.h" - -#include #include -#include -#include #include -#include -#include #include +#include +#include +#include +#include +#include +#include #include #include -#include #include -#include #include #if LIBTORRENT_VERSION_NUM >= 10100 #include @@ -57,82 +54,101 @@ #include "base/logger.h" #include "base/preferences.h" -#include "base/profile.h" +#include "base/utils/string.h" #include "base/utils/fs.h" #include "base/utils/misc.h" -#include "base/utils/string.h" -#include "peerinfo.h" #include "session.h" +#include "peerinfo.h" #include "trackerentry.h" +#include "torrenthandle.h" -const QString QB_EXT {QStringLiteral(".!qB")}; +const QString QB_EXT {".!qB"}; namespace libt = libtorrent; using namespace BitTorrent; -namespace -{ - using ListType = libt::entry::list_type; - - ListType setToEntryList(const QSet &input) - { - ListType entryList; - foreach (const QString &setValue, input) - entryList.emplace_back(setValue.toStdString()); - return entryList; - } -} - // AddTorrentData -CreateTorrentParams::CreateTorrentParams() - : restored(false) +AddTorrentData::AddTorrentData() + : resumed(false) , disableTempPath(false) , sequential(false) - , firstLastPiecePriority(false) , hasSeedStatus(false) , skipChecking(false) - , hasRootFolder(true) - , forced(false) - , paused(false) - , uploadLimit(-1) - , downloadLimit(-1) , ratioLimit(TorrentHandle::USE_GLOBAL_RATIO) - , seedingTimeLimit(TorrentHandle::USE_GLOBAL_SEEDING_TIME) { } -CreateTorrentParams::CreateTorrentParams(const AddTorrentParams ¶ms) - : restored(false) +AddTorrentData::AddTorrentData(const AddTorrentParams ¶ms) + : resumed(false) , name(params.name) , category(params.category) - , tags(params.tags) , savePath(params.savePath) , disableTempPath(params.disableTempPath) , sequential(params.sequential) - , firstLastPiecePriority(params.firstLastPiecePriority) , hasSeedStatus(params.skipChecking) // do not react on 'torrent_finished_alert' when skipping , skipChecking(params.skipChecking) - , hasRootFolder(params.createSubfolder == TriStateBool::Undefined - ? Session::instance()->isCreateTorrentSubfolder() - : params.createSubfolder == TriStateBool::True) - , forced(params.addForced == TriStateBool::True) - , paused(params.addPaused == TriStateBool::Undefined - ? Session::instance()->isAddTorrentPaused() - : params.addPaused == TriStateBool::True) - , uploadLimit(params.uploadLimit) - , downloadLimit(params.downloadLimit) + , addForced(params.addForced) + , addPaused(params.addPaused) , filePriorities(params.filePriorities) - , ratioLimit(params.ignoreShareLimits ? TorrentHandle::NO_RATIO_LIMIT : TorrentHandle::USE_GLOBAL_RATIO) - , seedingTimeLimit(params.ignoreShareLimits ? TorrentHandle::NO_SEEDING_TIME_LIMIT : TorrentHandle::USE_GLOBAL_SEEDING_TIME) + , ratioLimit(params.ignoreShareRatio ? TorrentHandle::NO_RATIO_LIMIT : TorrentHandle::USE_GLOBAL_RATIO) +{ +} + +// TorrentState + +TorrentState::TorrentState(int value) + : m_value(value) +{ +} + +QString TorrentState::toString() const +{ + switch (m_value) { + case Error: + return QLatin1String("error"); + case MissingFiles: + return QLatin1String("missingFiles"); + case Uploading: + return QLatin1String("uploading"); + case PausedUploading: + return QLatin1String("pausedUP"); + case QueuedUploading: + return QLatin1String("queuedUP"); + case StalledUploading: + return QLatin1String("stalledUP"); + case CheckingUploading: + return QLatin1String("checkingUP"); + case ForcedUploading: + return QLatin1String("forcedUP"); + case Allocating: + return QLatin1String("allocating"); + case Downloading: + return QLatin1String("downloading"); + case DownloadingMetadata: + return QLatin1String("metaDL"); + case PausedDownloading: + return QLatin1String("pausedDL"); + case QueuedDownloading: + return QLatin1String("queuedDL"); + case StalledDownloading: + return QLatin1String("stalledDL"); + case CheckingDownloading: + return QLatin1String("checkingDL"); + case ForcedDownloading: + return QLatin1String("forcedDL"); + case QueuedForChecking: + return QLatin1String("queuedForChecking"); + case CheckingResumeData: + return QLatin1String("checkingResumeData"); + default: + return QLatin1String("unknown"); + } +} + +TorrentState::operator int() const { - bool useAutoTMM = (params.useAutoTMM == TriStateBool::Undefined - ? !Session::instance()->isAutoTMMDisabledByDefault() - : params.useAutoTMM == TriStateBool::True); - if (useAutoTMM) - savePath = ""; - else if (savePath.trimmed().isEmpty()) - savePath = Session::instance()->defaultSavePath(); + return m_value; } // TorrentHandle @@ -140,11 +156,7 @@ const qreal TorrentHandle::USE_GLOBAL_RATIO = -2.; const qreal TorrentHandle::NO_RATIO_LIMIT = -1.; -const int TorrentHandle::USE_GLOBAL_SEEDING_TIME = -2; -const int TorrentHandle::NO_SEEDING_TIME_LIMIT = -1; - const qreal TorrentHandle::MAX_RATIO = 9999.; -const int TorrentHandle::MAX_SEEDING_TIME = 525600; // The new libtorrent::create_torrent constructor appeared after 1.0.11 in RC_1_0 // and after 1.1.1 in RC_1_1. Since it fixed an ABI incompatibility with previous versions @@ -172,25 +184,22 @@ } TorrentHandle::TorrentHandle(Session *session, const libtorrent::torrent_handle &nativeHandle, - const CreateTorrentParams ¶ms) + const AddTorrentData &data) : QObject(session) , m_session(session) , m_nativeHandle(nativeHandle) , m_state(TorrentState::Unknown) , m_renameCount(0) - , m_useAutoTMM(params.savePath.isEmpty()) - , m_name(params.name) - , m_savePath(Utils::Fs::toNativePath(params.savePath)) - , m_category(params.category) - , m_tags(params.tags) - , m_hasSeedStatus(params.hasSeedStatus) - , m_ratioLimit(params.ratioLimit) - , m_seedingTimeLimit(params.seedingTimeLimit) - , m_tempPathDisabled(params.disableTempPath) + , m_useAutoTMM(data.savePath.isEmpty()) + , m_name(data.name) + , m_savePath(Utils::Fs::toNativePath(data.savePath)) + , m_category(data.category) + , m_hasSeedStatus(data.hasSeedStatus) + , m_ratioLimit(data.ratioLimit) + , m_tempPathDisabled(data.disableTempPath) , m_hasMissingFiles(false) - , m_hasRootFolder(params.hasRootFolder) - , m_needsToSetFirstLastPiecePriority(false) , m_pauseAfterRecheck(false) + , m_needSaveResumeData(false) { if (m_useAutoTMM) m_savePath = Utils::Fs::toNativePath(m_session->categorySavePath(m_category)); @@ -198,37 +207,8 @@ updateStatus(); m_hash = InfoHash(m_nativeStatus.info_hash); - // NB: the following two if statements are present because we don't want - // to set either sequential download or first/last piece priority to false - // if their respective flags in data are false when a torrent is being - // resumed. This is because, in that circumstance, this constructor is - // called with those flags set to false, even if the torrent was set to - // download sequentially or have first/last piece priority enabled when - // its resume data was saved. These two settings are restored later. But - // if we set them to false now, both will erroneously not be restored. - if (!params.restored || params.sequential) - setSequentialDownload(params.sequential); - if (!params.restored || params.firstLastPiecePriority) - setFirstLastPiecePriority(params.firstLastPiecePriority); - - if (!params.restored && hasMetadata()) { - if (filesCount() == 1) - m_hasRootFolder = false; - } - - // "started" means "all initialization has completed and torrent has started regular processing". - // When torrent added/restored in "paused" state it become "started" immediately after construction. - // When it is added/restored in "resumed" state, it become "started" after it is really resumed - // (i.e. after receiving "torrent resumed" alert). - m_started = (params.restored && hasMetadata() ? isPaused() : params.paused); - - if (!m_started) { - if (!params.restored || !hasMetadata()) { - // Resume torrent because it was added in "resumed" state - // but it's actually paused during initialization - resume(params.forced); - } - } + if (!data.resumed) + setSequentialDownload(data.sequential); } TorrentHandle::~TorrentHandle() {} @@ -247,10 +227,7 @@ { QString name = m_name; if (name.isEmpty()) - name = QString::fromStdString(m_nativeStatus.name); - - if (name.isEmpty() && hasMetadata()) - name = QString::fromStdString(m_torrentInfo.nativeInfo()->orig_files().name()); + name = Utils::String::fromStdString(m_nativeStatus.name); if (name.isEmpty()) name = m_hash; @@ -311,7 +288,7 @@ QString TorrentHandle::currentTracker() const { - return QString::fromStdString(m_nativeStatus.current_tracker); + return Utils::String::fromStdString(m_nativeStatus.current_tracker); } QString TorrentHandle::savePath(bool actual) const @@ -324,11 +301,8 @@ QString TorrentHandle::rootPath(bool actual) const { - if ((filesCount() > 1) && !hasRootFolder()) - return QString(); - QString firstFilePath = filePath(0); - const int slashIndex = firstFilePath.indexOf('/'); + const int slashIndex = firstFilePath.indexOf("/"); if (slashIndex >= 0) return QDir(savePath(actual)).absoluteFilePath(firstFilePath.left(slashIndex)); else @@ -339,10 +313,8 @@ { if (filesCount() == 1) return QDir(savePath(actual)).absoluteFilePath(filePath(0)); - else if (hasRootFolder()) - return rootPath(actual); else - return savePath(actual); + return rootPath(actual); } bool TorrentHandle::isAutoTMMEnabled() const @@ -358,17 +330,12 @@ m_session->handleTorrentSavingModeChanged(this); if (m_useAutoTMM) - move_impl(m_session->categorySavePath(m_category), true); -} - -bool TorrentHandle::hasRootFolder() const -{ - return m_hasRootFolder; + move_impl(m_session->categorySavePath(m_category)); } QString TorrentHandle::nativeActualSavePath() const { - return QString::fromStdString(m_nativeStatus.save_path); + return Utils::String::fromStdString(m_nativeStatus.save_path); } QList TorrentHandle::trackers() const @@ -475,7 +442,7 @@ QList seeds = urlSeeds(); if (seeds.contains(urlSeed)) return false; - m_nativeHandle.add_url_seed(urlSeed.toString().toStdString()); + m_nativeHandle.add_url_seed(Utils::String::toStdString(urlSeed.toString())); return true; } @@ -484,14 +451,14 @@ QList seeds = urlSeeds(); if (!seeds.contains(urlSeed)) return false; - m_nativeHandle.remove_url_seed(urlSeed.toString().toStdString()); + m_nativeHandle.remove_url_seed(Utils::String::toStdString(urlSeed.toString())); return true; } bool TorrentHandle::connectPeer(const PeerAddress &peerAddress) { libt::error_code ec; - libt::address addr = libt::address::from_string(peerAddress.ip.toString().toStdString(), ec); + libt::address addr = libt::address::from_string(Utils::String::toStdString(peerAddress.ip.toString()), ec); if (ec) return false; boost::asio::ip::tcp::endpoint ep(addr, peerAddress.port); @@ -501,12 +468,18 @@ bool TorrentHandle::needSaveResumeData() const { + if (m_needSaveResumeData) return true; + return m_nativeHandle.need_save_resume_data(); } -void TorrentHandle::saveResumeData() +void TorrentHandle::saveResumeData(bool updateStatus) { + if (updateStatus) // to update queue_position, see discussion in PR #6154 + this->updateStatus(); + m_nativeHandle.save_resume_data(); + m_needSaveResumeData = false; } int TorrentHandle::filesCount() const @@ -526,19 +499,15 @@ qreal TorrentHandle::progress() const { - if (!isChecking()) { - if (!m_nativeStatus.total_wanted) - return 0.; + if (!m_nativeStatus.total_wanted) + return 0.; - if (m_nativeStatus.total_wanted_done == m_nativeStatus.total_wanted) - return 1.; + if (m_nativeStatus.total_wanted_done == m_nativeStatus.total_wanted) + return 1.; - qreal progress = static_cast(m_nativeStatus.total_wanted_done) / m_nativeStatus.total_wanted; - Q_ASSERT((progress >= 0.f) && (progress <= 1.f)); - return progress; - } - - return m_nativeStatus.progress; + float progress = (float) m_nativeStatus.total_wanted_done / (float) m_nativeStatus.total_wanted; + Q_ASSERT((progress >= 0.f) && (progress <= 1.f)); + return progress; } QString TorrentHandle::category() const @@ -553,54 +522,12 @@ if (m_category == category) return true; - if (m_session->isSubcategoriesEnabled() && m_category.startsWith(category + '/')) + if (m_session->isSubcategoriesEnabled() && m_category.startsWith(category + "/")) return true; return false; } -QSet TorrentHandle::tags() const -{ - return m_tags; -} - -bool TorrentHandle::hasTag(const QString &tag) const -{ - return m_tags.contains(tag); -} - -bool TorrentHandle::addTag(const QString &tag) -{ - if (!Session::isValidTag(tag)) - return false; - - if (!hasTag(tag)) { - if (!m_session->hasTag(tag)) - if (!m_session->addTag(tag)) - return false; - m_tags.insert(tag); - m_session->handleTorrentTagAdded(this, tag); - return true; - } - return false; -} - -bool TorrentHandle::removeTag(const QString &tag) -{ - if (m_tags.remove(tag)) { - m_session->handleTorrentTagRemoved(this, tag); - return true; - } - return false; -} - -void TorrentHandle::removeAllTags() -{ - // QT automatically copies the container in foreach, so it's safe to mutate it. - foreach (const QString &tag, m_tags) - removeTag(tag); -} - QDateTime TorrentHandle::addedTime() const { return QDateTime::fromTime_t(m_nativeStatus.added_time); @@ -611,11 +538,6 @@ return m_ratioLimit; } -int TorrentHandle::seedingTimeLimit() const -{ - return m_seedingTimeLimit; -} - QString TorrentHandle::filePath(int index) const { return m_torrentInfo.filePath(index); @@ -696,12 +618,9 @@ bool TorrentHandle::isChecking() const { - return ((m_nativeStatus.state == libt::torrent_status::checking_files) - || (m_nativeStatus.state == libt::torrent_status::checking_resume_data) -#if LIBTORRENT_VERSION_NUM < 10100 - || (m_nativeStatus.state == libt::torrent_status::queued_for_checking) -#endif - ); + return ((m_nativeStatus.state == libt::torrent_status::queued_for_checking) + || (m_nativeStatus.state == libt::torrent_status::checking_files) + || (m_nativeStatus.state == libt::torrent_status::checking_resume_data)); } bool TorrentHandle::isDownloading() const @@ -743,8 +662,7 @@ || m_state == TorrentState::Downloading || m_state == TorrentState::ForcedDownloading || m_state == TorrentState::Uploading - || m_state == TorrentState::ForcedUploading - || m_state == TorrentState::Moving; + || m_state == TorrentState::ForcedUploading; } bool TorrentHandle::isInactive() const @@ -783,21 +701,30 @@ bool TorrentHandle::hasFirstLastPiecePriority() const { - if (!hasMetadata()) - return m_needsToSetFirstLastPiecePriority; + if (!hasMetadata()) return false; - const std::vector filePriorities = nativeHandle().file_priorities(); - for (int i = 0; i < static_cast(filePriorities.size()); ++i) { - if (filePriorities[i] <= 0) - continue; - - const TorrentInfo::PieceRange extremities = info().filePieces(i); - const int firstPiecePrio = nativeHandle().piece_priority(extremities.first()); - const int lastPiecePrio = nativeHandle().piece_priority(extremities.last()); - return ((firstPiecePrio == 7) && (lastPiecePrio == 7)); + // Get int first media file + std::vector fp; + fp = m_nativeHandle.file_priorities(); + + TorrentInfo::PieceRange extremities; + bool found = false; + int count = static_cast(fp.size()); + for (int i = 0; i < count; ++i) { + const QString ext = Utils::Fs::fileExtension(filePath(i)); + if (Utils::Misc::isPreviewable(ext) && (fp[i] > 0)) { + extremities = info().filePieces(i); + found = true; + break; + } } - return false; + if (!found) return false; // No media file + + int first = m_nativeHandle.piece_priority(extremities.first()); + int last = m_nativeHandle.piece_priority(extremities.last()); + + return ((first == 7) && (last == 7)); } TorrentState TorrentHandle::state() const @@ -807,10 +734,7 @@ void TorrentHandle::updateState() { - if (isMoveInProgress()) { - m_state = TorrentState::Moving; - } - else if (isPaused()) { + if (isPaused()) { if (hasMissingFiles()) m_state = TorrentState::MissingFiles; else if (hasError()) @@ -834,11 +758,9 @@ case libt::torrent_status::allocating: m_state = TorrentState::Allocating; break; -#if LIBTORRENT_VERSION_NUM < 10100 case libt::torrent_status::queued_for_checking: m_state = TorrentState::QueuedForChecking; break; -#endif case libt::torrent_status::checking_resume_data: m_state = TorrentState::CheckingResumeData; break; @@ -874,11 +796,7 @@ bool TorrentHandle::hasError() const { -#if LIBTORRENT_VERSION_NUM < 10100 return (m_nativeStatus.paused && !m_nativeStatus.error.empty()); -#else - return (m_nativeStatus.paused && m_nativeStatus.errc); -#endif } bool TorrentHandle::hasFilteredPieces() const @@ -900,11 +818,7 @@ QString TorrentHandle::error() const { -#if LIBTORRENT_VERSION_NUM < 10100 - return QString::fromStdString(m_nativeStatus.error); -#else - return QString::fromStdString(m_nativeStatus.errc.message()); -#endif + return Utils::String::fromStdString(m_nativeStatus.error); } qlonglong TorrentHandle::totalDownload() const @@ -936,38 +850,24 @@ { if (isPaused()) return MAX_ETA; - const SpeedSampleAvg speedAverage = m_speedMonitor.average(); + const SpeedSampleAvg speed_average = m_speedMonitor.average(); if (isSeed()) { - qreal maxRatioValue = maxRatio(); - int maxSeedingTimeValue = maxSeedingTime(); - if ((maxRatioValue < 0) && (maxSeedingTimeValue < 0)) return MAX_ETA; - - qlonglong ratioEta = MAX_ETA; + if (speed_average.upload == 0) return MAX_ETA; - if ((speedAverage.upload > 0) && (maxRatioValue >= 0)) { + qreal max_ratio = maxRatio(); + if (max_ratio < 0) return MAX_ETA; - qlonglong realDL = totalDownload(); - if (realDL <= 0) - realDL = wantedSize(); + qlonglong realDL = totalDownload(); + if (realDL <= 0) + realDL = wantedSize(); - ratioEta = ((realDL * maxRatioValue) - totalUpload()) / speedAverage.upload; - } - - qlonglong seedingTimeEta = MAX_ETA; - - if (maxSeedingTimeValue >= 0) { - seedingTimeEta = (maxSeedingTimeValue * 60) - seedingTime(); - if (seedingTimeEta < 0) - seedingTimeEta = 0; - } - - return qMin(ratioEta, seedingTimeEta); + return ((realDL * max_ratio) - totalUpload()) / speed_average.upload; } - if (!speedAverage.download) return MAX_ETA; + if (!speed_average.download) return MAX_ETA; - return (wantedSize() - completedSize()) / speedAverage.download; + return (wantedSize() - completedSize()) / speed_average.download; } QVector TorrentHandle::filesProgress() const @@ -1059,9 +959,10 @@ int TorrentHandle::timeSinceActivity() const { - return ((m_nativeStatus.time_since_upload < 0) != (m_nativeStatus.time_since_download < 0)) - ? std::max(m_nativeStatus.time_since_upload, m_nativeStatus.time_since_download) - : std::min(m_nativeStatus.time_since_upload, m_nativeStatus.time_since_download); + if (m_nativeStatus.time_since_upload < m_nativeStatus.time_since_download) + return m_nativeStatus.time_since_upload; + else + return m_nativeStatus.time_since_download; } int TorrentHandle::downloadLimit() const @@ -1130,20 +1031,21 @@ return m_nativeStatus.distributed_copies; } -qreal TorrentHandle::maxRatio() const +qreal TorrentHandle::maxRatio(bool *usesGlobalRatio) const { - if (m_ratioLimit == USE_GLOBAL_RATIO) - return m_session->globalMaxRatio(); + qreal ratioLimit = m_ratioLimit; - return m_ratioLimit; -} - -int TorrentHandle::maxSeedingTime() const -{ - if (m_seedingTimeLimit == USE_GLOBAL_SEEDING_TIME) - return m_session->globalMaxSeedingMinutes(); + if (ratioLimit == USE_GLOBAL_RATIO) { + ratioLimit = m_session->globalMaxRatio(); + if (usesGlobalRatio) + *usesGlobalRatio = true; + } + else { + if (usesGlobalRatio) + *usesGlobalRatio = false; + } - return m_seedingTimeLimit; + return ratioLimit; } qreal TorrentHandle::realRatio() const @@ -1203,23 +1105,28 @@ { if (m_name != name) { m_name = name; - m_session->handleTorrentNameChanged(this); + m_needSaveResumeData = true; } } bool TorrentHandle::setCategory(const QString &category) { if (m_category != category) { - if (!category.isEmpty() && !m_session->categories().contains(category)) - return false; + if (!category.isEmpty()) { + if (!Session::isValidCategoryName(category)) return false; + if (!m_session->categories().contains(category)) + if (!m_session->addCategory(category)) + return false; + } QString oldCategory = m_category; m_category = category; + m_needSaveResumeData = true; m_session->handleTorrentCategoryChanged(this, oldCategory); if (m_useAutoTMM) { if (!m_session->isDisableAutoTMMWhenCategoryChanged()) - move_impl(m_session->categorySavePath(m_category), true); + move_impl(m_session->categorySavePath(m_category)); else setAutoTMMEnabled(false); } @@ -1239,19 +1146,20 @@ if (!path.endsWith('/')) path += '/'; - move_impl(path, false); + move_impl(path); } -void TorrentHandle::move_impl(QString path, bool overwrite) +void TorrentHandle::move_impl(QString path) { - if (path == savePath()) return; path = Utils::Fs::toNativePath(path); + if (path == savePath()) return; if (!useTempPath()) { - moveStorage(path, overwrite); + moveStorage(path); } else { m_savePath = path; + m_needSaveResumeData = true; m_session->handleTorrentSavePathChanged(this); } } @@ -1272,7 +1180,7 @@ if (isPaused()) { m_pauseAfterRecheck = true; - resume_impl(true, true); + resume(); } m_nativeHandle.force_recheck(); @@ -1291,45 +1199,36 @@ setSequentialDownload(!isSequentialDownload()); } -void TorrentHandle::setFirstLastPiecePriority(const bool enabled) +void TorrentHandle::setFirstLastPiecePriority(bool b) { - setFirstLastPiecePriorityImpl(enabled); -} - -void TorrentHandle::setFirstLastPiecePriorityImpl(const bool enabled, const QVector &updatedFilePrio) -{ - // Download first and last pieces first for every file in the torrent + if (!hasMetadata()) return; - if (!hasMetadata()) { - m_needsToSetFirstLastPiecePriority = enabled; - return; - } + std::vector fp = m_nativeHandle.file_priorities(); + std::vector pp = m_nativeHandle.piece_priorities(); - // Updating file priorities is an async operation in libtorrent, when we just updated it and immediately query it - // we might get the old/wrong values, so we rely on `updatedFilePrio` in this case. - const std::vector filePriorities = !updatedFilePrio.isEmpty() ? updatedFilePrio.toStdVector() : nativeHandle().file_priorities(); - std::vector piecePriorities = nativeHandle().piece_priorities(); - for (int index = 0; index < static_cast(filePriorities.size()); ++index) { - const int filePrio = filePriorities[index]; - if (filePrio <= 0) - continue; - - // Determine the priority to set - const int newPrio = enabled ? 7 : filePrio; - const TorrentInfo::PieceRange extremities = info().filePieces(index); - - // worst case: AVI index = 1% of total file size (at the end of the file) - const int nNumPieces = std::ceil(fileSize(index) * 0.01 / pieceLength()); - for (int i = 0; i < nNumPieces; ++i) { - piecePriorities[extremities.first() + i] = newPrio; - piecePriorities[extremities.last() - i] = newPrio; + // Download first and last pieces first for all media files in the torrent + int nbfiles = static_cast(fp.size()); + for (int index = 0; index < nbfiles; ++index) { + const QString path = filePath(index); + const QString ext = Utils::Fs::fileExtension(path); + if (Utils::Misc::isPreviewable(ext) && (fp[index] > 0)) { + qDebug() << "File" << path << "is previewable, toggle downloading of first/last pieces first"; + + // Determine the priority to set + int prio = b ? 7 : fp[index]; + + TorrentInfo::PieceRange extremities = info().filePieces(index); + + // worst case: AVI index = 1% of total file size (at the end of the file) + int nNumPieces = ceil(fileSize(index) * 0.01 / pieceLength()); + for (int i = 0; i < nNumPieces; ++i) { + pp[extremities.first() + i] = prio; + pp[extremities.last() - i] = prio; + } } } - m_nativeHandle.prioritize_pieces(piecePriorities); - - LogMsg(tr("Download first and last piece first: %1, torrent: '%2'") - .arg((enabled ? tr("On") : tr("Off")), name())); + m_nativeHandle.prioritize_pieces(pp); } void TorrentHandle::toggleFirstLastPiecePriority() @@ -1343,63 +1242,47 @@ m_nativeHandle.auto_managed(false); m_nativeHandle.pause(); - - // Libtorrent doesn't emit a torrent_paused_alert when the - // torrent is queued (no I/O) - // We test on the cached m_nativeStatus - if (isQueued()) - m_session->handleTorrentPaused(this); } void TorrentHandle::resume(bool forced) { - resume_impl(forced, false); -} - -void TorrentHandle::resume_impl(bool forced, bool uploadMode) -{ if (hasError()) m_nativeHandle.clear_error(); m_hasMissingFiles = false; + m_nativeHandle.set_upload_mode(false); m_nativeHandle.auto_managed(!forced); - m_nativeHandle.set_upload_mode(uploadMode); m_nativeHandle.resume(); } -void TorrentHandle::moveStorage(const QString &newPath, bool overwrite) +void TorrentHandle::moveStorage(const QString &newPath) { if (isMoveInProgress()) { - qDebug("enqueue move storage to %s", qUtf8Printable(newPath)); - m_moveStorageInfo.queuedPath = newPath; - m_moveStorageInfo.queuedOverwrite = overwrite; + qDebug("enqueue move storage to %s", qPrintable(newPath)); + m_queuedPath = newPath; } else { const QString oldPath = nativeActualSavePath(); if (QDir(oldPath) == QDir(newPath)) return; - qDebug("move storage: %s to %s", qUtf8Printable(oldPath), qUtf8Printable(newPath)); + qDebug("move storage: %s to %s", qPrintable(oldPath), qPrintable(newPath)); // Actually move the storage - m_nativeHandle.move_storage(newPath.toUtf8().constData() - , (overwrite ? libt::always_replace_files : libt::dont_replace)); - m_moveStorageInfo.oldPath = oldPath; - m_moveStorageInfo.newPath = newPath; - updateState(); + m_nativeHandle.move_storage(newPath.toUtf8().constData()); + m_oldPath = oldPath; + m_newPath = newPath; } } -#if LIBTORRENT_VERSION_NUM < 10100 void TorrentHandle::setTrackerLogin(const QString &username, const QString &password) { m_nativeHandle.set_tracker_login(std::string(username.toLocal8Bit().constData()) , std::string(password.toLocal8Bit().constData())); } -#endif void TorrentHandle::renameFile(int index, const QString &name) { ++m_renameCount; qDebug() << Q_FUNC_INFO << index << name; - m_nativeHandle.rename_file(index, Utils::Fs::toNativePath(name).toStdString()); + m_nativeHandle.rename_file(index, Utils::String::toStdString(Utils::Fs::toNativePath(name))); } bool TorrentHandle::saveTorrentFile(const QString &path) @@ -1433,40 +1316,30 @@ updateStatus(nativeStatus); } -void TorrentHandle::handleStorageMovedAlert(const libtorrent::storage_moved_alert *p) +void TorrentHandle::handleStorageMovedAlert(libtorrent::storage_moved_alert *p) { if (!isMoveInProgress()) { qWarning() << "Unexpected " << Q_FUNC_INFO << " call."; return; } -#if LIBTORRENT_VERSION_NUM < 10100 - const QString newPath = QString::fromStdString(p->path); -#else - const QString newPath(p->storage_path()); -#endif - if (newPath != m_moveStorageInfo.newPath) { + const QString newPath = Utils::String::fromStdString(p->path); + if (newPath != m_newPath) { qWarning() << Q_FUNC_INFO << ": New path doesn't match a path in a queue."; return; } - LogMsg(tr("Successfully moved torrent: %1. New path: %2").arg(name(), m_moveStorageInfo.newPath)); - - const QDir oldDir {m_moveStorageInfo.oldPath}; - if ((oldDir == QDir(m_session->torrentTempPath(info()))) - && (oldDir != QDir(m_session->tempPath()))) { - // torrent without root folder still has it in its temporary save path - // so its temp path isn't equal to temp path root - qDebug() << "Removing torrent temp folder:" << m_moveStorageInfo.oldPath; - Utils::Fs::smartRemoveEmptyFolderTree(m_moveStorageInfo.oldPath); + qDebug("Torrent is successfully moved from %s to %s", qPrintable(m_oldPath), qPrintable(m_newPath)); + if (QDir(m_oldPath) == QDir(m_session->torrentTempPath(hash()))) { + qDebug() << "Removing torrent temp folder:" << m_oldPath; + Utils::Fs::smartRemoveEmptyFolderTree(m_oldPath); } - - m_moveStorageInfo.newPath.clear(); updateStatus(); - if (!m_moveStorageInfo.queuedPath.isEmpty()) { - moveStorage(m_moveStorageInfo.queuedPath, m_moveStorageInfo.queuedOverwrite); - m_moveStorageInfo.queuedPath.clear(); + m_newPath.clear(); + if (!m_queuedPath.isEmpty()) { + moveStorage(m_queuedPath); + m_queuedPath.clear(); } if (!useTempPath()) { @@ -1478,36 +1351,30 @@ m_moveFinishedTriggers.takeFirst()(); } -void TorrentHandle::handleStorageMovedFailedAlert(const libtorrent::storage_moved_failed_alert *p) +void TorrentHandle::handleStorageMovedFailedAlert(libtorrent::storage_moved_failed_alert *p) { if (!isMoveInProgress()) { qWarning() << "Unexpected " << Q_FUNC_INFO << " call."; return; } - LogMsg(tr("Could not move torrent: '%1'. Reason: %2") - .arg(name(), QString::fromStdString(p->message())), Log::CRITICAL); + Logger::instance()->addMessage(tr("Could not move torrent: '%1'. Reason: %2") + .arg(name()).arg(Utils::String::fromStdString(p->message())), Log::CRITICAL); - m_moveStorageInfo.newPath.clear(); - updateStatus(); - - if (!m_moveStorageInfo.queuedPath.isEmpty()) { - moveStorage(m_moveStorageInfo.queuedPath, m_moveStorageInfo.queuedOverwrite); - m_moveStorageInfo.queuedPath.clear(); + m_newPath.clear(); + if (!m_queuedPath.isEmpty()) { + moveStorage(m_queuedPath); + m_queuedPath.clear(); } while (!isMoveInProgress() && (m_renameCount == 0) && !m_moveFinishedTriggers.isEmpty()) m_moveFinishedTriggers.takeFirst()(); } -void TorrentHandle::handleTrackerReplyAlert(const libtorrent::tracker_reply_alert *p) +void TorrentHandle::handleTrackerReplyAlert(libtorrent::tracker_reply_alert *p) { -#if LIBTORRENT_VERSION_NUM < 10100 - QString trackerUrl = QString::fromStdString(p->url); -#else - QString trackerUrl(p->tracker_url()); -#endif - qDebug("Received a tracker reply from %s (Num_peers = %d)", qUtf8Printable(trackerUrl), p->num_peers); + QString trackerUrl = Utils::String::fromStdString(p->url); + qDebug("Received a tracker reply from %s (Num_peers = %d)", qPrintable(trackerUrl), p->num_peers); // Connection was successful now. Remove possible old errors m_trackerInfos[trackerUrl].lastMessage.clear(); // Reset error/warning message m_trackerInfos[trackerUrl].numPeers = p->num_peers; @@ -1515,32 +1382,22 @@ m_session->handleTorrentTrackerReply(this, trackerUrl); } -void TorrentHandle::handleTrackerWarningAlert(const libtorrent::tracker_warning_alert *p) +void TorrentHandle::handleTrackerWarningAlert(libtorrent::tracker_warning_alert *p) { -#if LIBTORRENT_VERSION_NUM < 10100 - const QString trackerUrl = QString::fromStdString(p->url); - const QString message = QString::fromStdString(p->msg); -#else - const QString trackerUrl = p->tracker_url(); - const QString message = p->warning_message(); -#endif - + QString trackerUrl = Utils::String::fromStdString(p->url); + QString message = Utils::String::fromStdString(p->msg); + qDebug("Received a tracker warning for %s: %s", qPrintable(trackerUrl), qPrintable(message)); // Connection was successful now but there is a warning message m_trackerInfos[trackerUrl].lastMessage = message; // Store warning message m_session->handleTorrentTrackerWarning(this, trackerUrl); } -void TorrentHandle::handleTrackerErrorAlert(const libtorrent::tracker_error_alert *p) +void TorrentHandle::handleTrackerErrorAlert(libtorrent::tracker_error_alert *p) { -#if LIBTORRENT_VERSION_NUM < 10100 - const QString trackerUrl = QString::fromStdString(p->url); - const QString message = QString::fromStdString(p->msg); -#else - const QString trackerUrl = p->tracker_url(); - const QString message = p->error_message(); -#endif - + QString trackerUrl = Utils::String::fromStdString(p->url); + QString message = Utils::String::fromStdString(p->msg); + qDebug("Received a tracker error for %s: %s", qPrintable(trackerUrl), qPrintable(message)); m_trackerInfos[trackerUrl].lastMessage = message; if (p->status_code == 401) @@ -1549,10 +1406,10 @@ m_session->handleTorrentTrackerError(this, trackerUrl); } -void TorrentHandle::handleTorrentCheckedAlert(const libtorrent::torrent_checked_alert *p) +void TorrentHandle::handleTorrentCheckedAlert(libtorrent::torrent_checked_alert *p) { Q_UNUSED(p); - qDebug("%s have just finished checking", qUtf8Printable(hash())); + qDebug("%s have just finished checking", qPrintable(hash())); updateStatus(); @@ -1572,10 +1429,10 @@ m_session->handleTorrentChecked(this); } -void TorrentHandle::handleTorrentFinishedAlert(const libtorrent::torrent_finished_alert *p) +void TorrentHandle::handleTorrentFinishedAlert(libtorrent::torrent_finished_alert *p) { Q_UNUSED(p); - qDebug("Got a torrent finished alert for %s", qUtf8Printable(name())); + qDebug("Got a torrent finished alert for %s", qPrintable(name())); qDebug("Torrent has seed status: %s", m_hasSeedStatus ? "yes" : "no"); if (m_hasSeedStatus) return; @@ -1599,7 +1456,7 @@ } } -void TorrentHandle::handleTorrentPausedAlert(const libtorrent::torrent_paused_alert *p) +void TorrentHandle::handleTorrentPausedAlert(libtorrent::torrent_paused_alert *p) { Q_UNUSED(p); updateStatus(); @@ -1607,95 +1464,80 @@ m_session->handleTorrentPaused(this); } -void TorrentHandle::handleTorrentResumedAlert(const libtorrent::torrent_resumed_alert *p) +void TorrentHandle::handleTorrentResumedAlert(libtorrent::torrent_resumed_alert *p) { Q_UNUSED(p); - - if (m_started) - m_session->handleTorrentResumed(this); - else - m_started = true; + m_session->handleTorrentResumed(this); } -void TorrentHandle::handleSaveResumeDataAlert(const libtorrent::save_resume_data_alert *p) +void TorrentHandle::handleSaveResumeDataAlert(libtorrent::save_resume_data_alert *p) { const bool useDummyResumeData = !(p && p->resume_data); libtorrent::entry dummyEntry; libtorrent::entry &resumeData = useDummyResumeData ? dummyEntry : *(p->resume_data); if (useDummyResumeData) { - resumeData["qBt-magnetUri"] = toMagnetUri().toStdString(); + resumeData["qBt-magnetUri"] = Utils::String::toStdString(toMagnetUri()); resumeData["qBt-paused"] = isPaused(); resumeData["qBt-forced"] = isForced(); - // Both firstLastPiecePriority and sequential need to be stored in the - // resume data if there is no metadata, otherwise they won't be - // restored if qBittorrent quits before the metadata are retrieved: - resumeData["qBt-firstLastPiecePriority"] = hasFirstLastPiecePriority(); - resumeData["qBt-sequential"] = isSequentialDownload(); - } - else { - auto savePath = resumeData.find_key("save_path")->string(); - resumeData["save_path"] = Profile::instance().toPortablePath(QString::fromStdString(savePath)).toStdString(); } - resumeData["qBt-savePath"] = m_useAutoTMM ? "" : Profile::instance().toPortablePath(m_savePath).toStdString(); - resumeData["qBt-ratioLimit"] = static_cast(m_ratioLimit * 1000); - resumeData["qBt-seedingTimeLimit"] = m_seedingTimeLimit; - resumeData["qBt-category"] = m_category.toStdString(); - resumeData["qBt-tags"] = setToEntryList(m_tags); - resumeData["qBt-name"] = m_name.toStdString(); + resumeData["qBt-savePath"] = m_useAutoTMM ? "" : Utils::String::toStdString(m_savePath); + resumeData["qBt-ratioLimit"] = Utils::String::toStdString(QString::number(m_ratioLimit)); + resumeData["qBt-category"] = Utils::String::toStdString(m_category); + resumeData["qBt-name"] = Utils::String::toStdString(m_name); resumeData["qBt-seedStatus"] = m_hasSeedStatus; resumeData["qBt-tempPathDisabled"] = m_tempPathDisabled; - resumeData["qBt-queuePosition"] = (nativeHandle().queue_position() + 1); // qBt starts queue at 1 - resumeData["qBt-hasRootFolder"] = m_hasRootFolder; + resumeData["qBt-queuePosition"] = queuePosition(); m_session->handleTorrentResumeDataReady(this, resumeData); } -void TorrentHandle::handleSaveResumeDataFailedAlert(const libtorrent::save_resume_data_failed_alert *p) +void TorrentHandle::handleSaveResumeDataFailedAlert(libtorrent::save_resume_data_failed_alert *p) { // if torrent has no metadata we should save dummy fastresume data // containing Magnet URI and qBittorrent own resume data only if (p->error.value() == libt::errors::no_metadata) - handleSaveResumeDataAlert(nullptr); + handleSaveResumeDataAlert(0); else m_session->handleTorrentResumeDataFailed(this); } -void TorrentHandle::handleFastResumeRejectedAlert(const libtorrent::fastresume_rejected_alert *p) +void TorrentHandle::handleFastResumeRejectedAlert(libtorrent::fastresume_rejected_alert *p) { + qDebug("/!\\ Fast resume failed for %s, reason: %s", qPrintable(name()), p->message().c_str()); + Logger *const logger = Logger::instance(); + + updateStatus(); if (p->error.value() == libt::errors::mismatching_file_size) { // Mismatching file size (files were probably moved) - pause(); + logger->addMessage(tr("File sizes mismatch for torrent '%1', pausing it.").arg(name()), Log::CRITICAL); m_hasMissingFiles = true; - LogMsg(tr("File sizes mismatch for torrent '%1', pausing it.").arg(name()), Log::CRITICAL); + if (!isPaused()) + pause(); } else { - LogMsg(tr("Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again...") - .arg(name(), QString::fromStdString(p->message())), Log::CRITICAL); + logger->addMessage(tr("Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again...") + .arg(name()).arg(Utils::String::fromStdString(p->message())), Log::CRITICAL); } } -void TorrentHandle::handleFileRenamedAlert(const libtorrent::file_renamed_alert *p) +void TorrentHandle::handleFileRenamedAlert(libtorrent::file_renamed_alert *p) { -#if LIBTORRENT_VERSION_NUM < 10100 - QString newName = Utils::Fs::fromNativePath(QString::fromStdString(p->name)); -#else - QString newName = Utils::Fs::fromNativePath(p->new_name()); -#endif + QString newName = Utils::Fs::fromNativePath(Utils::String::fromStdString(p->name)); // TODO: Check this! if (filesCount() > 1) { // Check if folders were renamed - QStringList oldPathParts = m_torrentInfo.origFilePath(p->index).split('/'); + QStringList oldPathParts = m_torrentInfo.origFilePath(p->index).split("/"); oldPathParts.removeLast(); - QString oldPath = oldPathParts.join('/'); - QStringList newPathParts = newName.split('/'); + QString oldPath = oldPathParts.join("/"); + QStringList newPathParts = newName.split("/"); newPathParts.removeLast(); - QString newPath = newPathParts.join('/'); + QString newPath = newPathParts.join("/"); if (!newPathParts.isEmpty() && (oldPath != newPath)) { - qDebug("oldPath(%s) != newPath(%s)", qUtf8Printable(oldPath), qUtf8Printable(newPath)); - oldPath = QString("%1/%2").arg(savePath(true), oldPath); - qDebug("Detected folder renaming, attempt to delete old folder: %s", qUtf8Printable(oldPath)); + qDebug("oldPath(%s) != newPath(%s)", qPrintable(oldPath), qPrintable(newPath)); + oldPath = QString("%1/%2").arg(savePath(true)).arg(oldPath); + qDebug("Detected folder renaming, attempt to delete old folder: %s", qPrintable(oldPath)); QDir().rmpath(oldPath); } } @@ -1707,7 +1549,7 @@ m_moveFinishedTriggers.takeFirst()(); } -void TorrentHandle::handleFileRenameFailedAlert(const libtorrent::file_rename_failed_alert *p) +void TorrentHandle::handleFileRenameFailedAlert(libtorrent::file_rename_failed_alert *p) { Q_UNUSED(p); @@ -1716,23 +1558,23 @@ m_moveFinishedTriggers.takeFirst()(); } -void TorrentHandle::handleFileCompletedAlert(const libtorrent::file_completed_alert *p) +void TorrentHandle::handleFileCompletedAlert(libtorrent::file_completed_alert *p) { updateStatus(); - qDebug("A file completed download in torrent \"%s\"", qUtf8Printable(name())); + qDebug("A file completed download in torrent \"%s\"", qPrintable(name())); if (m_session->isAppendExtensionEnabled()) { QString name = filePath(p->index); if (name.endsWith(QB_EXT)) { const QString oldName = name; name.chop(QB_EXT.size()); - qDebug("Renaming %s to %s", qUtf8Printable(oldName), qUtf8Printable(name)); + qDebug("Renaming %s to %s", qPrintable(oldName), qPrintable(name)); renameFile(p->index, name); } } } -void TorrentHandle::handleStatsAlert(const libtorrent::stats_alert *p) +void TorrentHandle::handleStatsAlert(libtorrent::stats_alert *p) { Q_ASSERT(p->interval >= 1000); SpeedSample transferred(p->transferred[libt::stats_alert::download_payload] * 1000LL / p->interval, @@ -1740,17 +1582,13 @@ m_speedMonitor.addSample(transferred); } -void TorrentHandle::handleMetadataReceivedAlert(const libt::metadata_received_alert *p) +void TorrentHandle::handleMetadataReceivedAlert(libt::metadata_received_alert *p) { Q_UNUSED(p); - qDebug("Metadata received for torrent %s.", qUtf8Printable(name())); + qDebug("Metadata received for torrent %s.", qPrintable(name())); updateStatus(); if (m_session->isAppendExtensionEnabled()) manageIncompleteFiles(); - if (!m_hasRootFolder) - m_torrentInfo.stripRootFolder(); - if (filesCount() == 1) - m_hasRootFolder = false; m_session->handleTorrentMetadataReceived(this); if (isPaused()) { @@ -1759,13 +1597,6 @@ m_speedMonitor.reset(); m_session->handleTorrentPaused(this); } - - // If first/last piece priority was specified when adding this torrent, we can set it - // now that we have metadata: - if (m_needsToSetFirstLastPiecePriority) { - setFirstLastPiecePriority(true); - m_needsToSetFirstLastPiecePriority = false; - } } void TorrentHandle::handleTempPathChanged() @@ -1776,7 +1607,7 @@ void TorrentHandle::handleCategorySavePathChanged() { if (m_useAutoTMM) - move_impl(m_session->categorySavePath(m_category), true); + move_impl(m_session->categorySavePath(m_category)); } void TorrentHandle::handleAppendExtensionToggled() @@ -1819,9 +1650,6 @@ case libt::torrent_paused_alert::alert_type: handleTorrentPausedAlert(static_cast(a)); break; - case libt::torrent_resumed_alert::alert_type: - handleTorrentResumedAlert(static_cast(a)); - break; case libt::tracker_error_alert::alert_type: handleTrackerErrorAlert(static_cast(a)); break; @@ -1847,7 +1675,7 @@ { const bool isAppendExtensionEnabled = m_session->isAppendExtensionEnabled(); QVector fp = filesProgress(); - if (fp.size() != filesCount()) { + if( fp.size() != filesCount() ) { qDebug() << "skip manageIncompleteFiles because of invalid torrent meta-data or empty file-progress"; return; } @@ -1889,12 +1717,12 @@ path = savePath(); } else { - // Moving all downloading torrents to temporary folder - path = m_session->torrentTempPath(info()); - qDebug() << "Moving torrent to its temporary folder:" << path; + // Moving all downloading torrents to temporary save path + path = m_session->torrentTempPath(hash()); + qDebug() << "Moving torrent to its temp save path:" << path; } - moveStorage(Utils::Fs::toNativePath(path), true); + moveStorage(Utils::Fs::toNativePath(path)); } libtorrent::torrent_handle TorrentHandle::nativeHandle() const @@ -1914,7 +1742,7 @@ bool TorrentHandle::isMoveInProgress() const { - return !m_moveStorageInfo.newPath.isEmpty(); + return !m_newPath.isEmpty(); } bool TorrentHandle::useTempPath() const @@ -1944,20 +1772,8 @@ if (m_ratioLimit != limit) { m_ratioLimit = limit; - m_session->handleTorrentShareLimitChanged(this); - } -} - -void TorrentHandle::setSeedingTimeLimit(int limit) -{ - if (limit < USE_GLOBAL_SEEDING_TIME) - limit = NO_SEEDING_TIME_LIMIT; - else if (limit > MAX_SEEDING_TIME) - limit = MAX_SEEDING_TIME; - - if (m_seedingTimeLimit != limit) { - m_seedingTimeLimit = limit; - m_session->handleTorrentShareLimitChanged(this); + m_needSaveResumeData = true; + m_session->handleTorrentRatioLimitChanged(this); } } @@ -1985,7 +1801,7 @@ QString TorrentHandle::toMagnetUri() const { - return QString::fromStdString(libt::make_magnet_uri(m_nativeHandle)); + return Utils::String::fromStdString(libt::make_magnet_uri(m_nativeHandle)); } void TorrentHandle::prioritizeFiles(const QVector &priorities) @@ -1994,7 +1810,7 @@ if (priorities.size() != filesCount()) return; // Save first/last piece first option state - const bool firstLastPieceFirst = hasFirstLastPiecePriority(); + bool firstLastPieceFirst = hasFirstLastPiecePriority(); // Reset 'm_hasSeedStatus' if needed in order to react again to // 'torrent_finished_alert' and eg show tray notifications @@ -2021,7 +1837,7 @@ // Make sure the file does not already exists if (QDir(parentAbsPath).dirName() != ".unwanted") { QString unwantedAbsPath = parentAbsPath + "/.unwanted"; - QString newAbsPath = unwantedAbsPath + '/' + Utils::Fs::fileName(filepath); + QString newAbsPath = unwantedAbsPath + "/" + Utils::Fs::fileName(filepath); qDebug() << "Unwanted path is" << unwantedAbsPath; if (QFile::exists(newAbsPath)) { qWarning() << "File" << newAbsPath << "already exists at destination."; @@ -2041,8 +1857,8 @@ } #endif QString parentPath = Utils::Fs::branchPath(filepath); - if (!parentPath.isEmpty() && !parentPath.endsWith('/')) - parentPath += '/'; + if (!parentPath.isEmpty() && !parentPath.endsWith("/")) + parentPath += "/"; renameFile(i, parentPath + ".unwanted/" + Utils::Fs::fileName(filepath)); } } @@ -2059,38 +1875,15 @@ renameFile(i, QDir(newRelPath).filePath(oldName)); // Remove .unwanted directory if empty - qDebug() << "Attempting to remove .unwanted folder at " << QDir(spath + '/' + newRelPath).absoluteFilePath(".unwanted"); - QDir(spath + '/' + newRelPath).rmdir(".unwanted"); + qDebug() << "Attempting to remove .unwanted folder at " << QDir(spath + "/" + newRelPath).absoluteFilePath(".unwanted"); + QDir(spath + "/" + newRelPath).rmdir(".unwanted"); } } } // Restore first/last piece first option if necessary if (firstLastPieceFirst) - setFirstLastPiecePriorityImpl(true, priorities); + setFirstLastPiecePriority(true); updateStatus(); } - -QVector TorrentHandle::availableFileFractions() const -{ - const auto filesCount = this->filesCount(); - if (filesCount < 0) return {}; - - const QVector piecesAvailability = pieceAvailability(); - // libtorrent returns empty array for seeding only torrents - if (piecesAvailability.empty()) return QVector(filesCount, -1.); - - QVector res; - res.reserve(filesCount); - TorrentInfo info = this->info(); - for (int file = 0; file < filesCount; ++file) { - TorrentInfo::PieceRange filePieces = info.filePieces(file); - int availablePieces = 0; - for (int piece = filePieces.first(); piece <= filePieces.last(); ++piece) { - availablePieces += piecesAvailability[piece] > 0 ? 1 : 0; - } - res.push_back(static_cast(availablePieces) / filePieces.size()); - } - return res; -} diff -Nru qbittorrent-4.1.3/src/base/bittorrent/torrenthandle.h qbittorrent-3.3.15/src/base/bittorrent/torrenthandle.h --- qbittorrent-4.1.3/src/base/bittorrent/torrenthandle.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/torrenthandle.h 2017-08-03 20:30:10.000000000 +0000 @@ -30,13 +30,12 @@ #ifndef BITTORRENT_TORRENTHANDLE_H #define BITTORRENT_TORRENTHANDLE_H -#include -#include #include -#include -#include #include +#include +#include #include +#include #include #include @@ -88,32 +87,26 @@ class TrackerEntry; struct AddTorrentParams; - struct CreateTorrentParams + struct AddTorrentData { - bool restored; // is existing torrent job? - // for both new and restored torrents + bool resumed; + // for both new and resumed torrents QString name; QString category; - QSet tags; QString savePath; bool disableTempPath; bool sequential; - bool firstLastPiecePriority; bool hasSeedStatus; bool skipChecking; - bool hasRootFolder; - bool forced; - bool paused; - int uploadLimit; - int downloadLimit; + TriStateBool addForced; + TriStateBool addPaused; // for new torrents QVector filePriorities; - // for restored torrents + // for resumed torrents qreal ratioLimit; - int seedingTimeLimit; - CreateTorrentParams(); - CreateTorrentParams(const AddTorrentParams ¶ms); + AddTorrentData(); + AddTorrentData(const AddTorrentParams ¶ms); }; struct TrackerInfo @@ -122,37 +115,46 @@ quint32 numPeers = 0; }; - enum class TorrentState + class TorrentState { - Unknown = -1, + public: + enum + { + Unknown = -1, - ForcedDownloading, - Downloading, - DownloadingMetadata, - Allocating, - StalledDownloading, - - ForcedUploading, - Uploading, - StalledUploading, + ForcedDownloading, + Downloading, + DownloadingMetadata, + Allocating, + StalledDownloading, -#if LIBTORRENT_VERSION_NUM < 10100 - QueuedForChecking, -#endif - CheckingResumeData, - QueuedDownloading, - QueuedUploading, + ForcedUploading, + Uploading, + StalledUploading, + + QueuedDownloading, + QueuedUploading, + + CheckingUploading, + CheckingDownloading, - CheckingUploading, - CheckingDownloading, + QueuedForChecking, + CheckingResumeData, - PausedDownloading, - PausedUploading, + PausedDownloading, + PausedUploading, - Moving, + MissingFiles, + Error + }; - MissingFiles, - Error + TorrentState(int value); + + operator int() const; + QString toString() const; + + private: + int m_value; }; class TorrentHandle : public QObject @@ -163,14 +165,10 @@ static const qreal USE_GLOBAL_RATIO; static const qreal NO_RATIO_LIMIT; - static const int USE_GLOBAL_SEEDING_TIME; - static const int NO_SEEDING_TIME_LIMIT; - static const qreal MAX_RATIO; - static const int MAX_SEEDING_TIME; TorrentHandle(Session *session, const libtorrent::torrent_handle &nativeHandle, - const CreateTorrentParams ¶ms); + const AddTorrentData &data); ~TorrentHandle(); bool isValid() const; @@ -208,9 +206,6 @@ // file4 // // - // Torrent A* (Torrent A in "strip root folder" mode) - // - // // Torrent B (singlefile) // // torrentB/ @@ -227,7 +222,6 @@ // | | rootPath | contentPath | // |---|------------------------------|--------------------------------------------| // | A | /home/user/torrents/torrentA | /home/user/torrents/torrentA | - // | A*| | /home/user/torrents | // | B | /home/user/torrents/torrentB | /home/user/torrents/torrentB/subdir1/file1 | // | C | /home/user/torrents/file1 | /home/user/torrents/file1 | @@ -235,29 +229,18 @@ QString rootPath(bool actual = false) const; QString contentPath(bool actual = false) const; - bool useTempPath() const; - bool isAutoTMMEnabled() const; void setAutoTMMEnabled(bool enabled); QString category() const; bool belongsToCategory(const QString &category) const; bool setCategory(const QString &category); - QSet tags() const; - bool hasTag(const QString &tag) const; - bool addTag(const QString &tag); - bool removeTag(const QString &tag); - void removeAllTags(); - - bool hasRootFolder() const; - int filesCount() const; int piecesCount() const; int piecesHave() const; qreal progress() const; QDateTime addedTime() const; qreal ratioLimit() const; - int seedingTimeLimit() const; QString filePath(int index) const; QString fileName(int index) const; @@ -319,8 +302,7 @@ QBitArray downloadingPieces() const; QVector pieceAvailability() const; qreal distributedCopies() const; - qreal maxRatio() const; - int maxSeedingTime() const; + qreal maxRatio(bool *usesGlobalRatio = 0) const; qreal realRatio() const; int uploadPayloadRate() const; int downloadPayloadRate() const; @@ -333,7 +315,7 @@ void setName(const QString &name); void setSequentialDownload(bool b); void toggleSequentialDownload(); - void setFirstLastPiecePriority(bool enabled); + void setFirstLastPiecePriority(bool b); void toggleFirstLastPiecePriority(); void pause(); void resume(bool forced = false); @@ -341,15 +323,12 @@ void forceReannounce(int index = -1); void forceDHTAnnounce(); void forceRecheck(); -#if LIBTORRENT_VERSION_NUM < 10100 void setTrackerLogin(const QString &username, const QString &password); -#endif void renameFile(int index, const QString &name); bool saveTorrentFile(const QString &path); void prioritizeFiles(const QVector &priorities); void setFilePriority(int index, int priority); void setRatioLimit(qreal limit); - void setSeedingTimeLimit(int limit); void setUploadLimit(int limit); void setDownloadLimit(int limit); void setSuperSeeding(bool enable); @@ -372,15 +351,7 @@ void handleTempPathChanged(); void handleCategorySavePathChanged(); void handleAppendExtensionToggled(); - void saveResumeData(); - - /** - * @brief fraction of file pieces that are available at least from one peer - * - * This is not the same as torrrent availability, it is just a fraction of pieces - * that can be downloaded right now. It varies between 0 to 1. - */ - QVector availableFileFractions() const; + void saveResumeData(bool updateStatus = false); private: typedef boost::function EventTrigger; @@ -390,57 +361,51 @@ void updateState(); void updateTorrentInfo(); - void handleStorageMovedAlert(const libtorrent::storage_moved_alert *p); - void handleStorageMovedFailedAlert(const libtorrent::storage_moved_failed_alert *p); - void handleTrackerReplyAlert(const libtorrent::tracker_reply_alert *p); - void handleTrackerWarningAlert(const libtorrent::tracker_warning_alert *p); - void handleTrackerErrorAlert(const libtorrent::tracker_error_alert *p); - void handleTorrentCheckedAlert(const libtorrent::torrent_checked_alert *p); - void handleTorrentFinishedAlert(const libtorrent::torrent_finished_alert *p); - void handleTorrentPausedAlert(const libtorrent::torrent_paused_alert *p); - void handleTorrentResumedAlert(const libtorrent::torrent_resumed_alert *p); - void handleSaveResumeDataAlert(const libtorrent::save_resume_data_alert *p); - void handleSaveResumeDataFailedAlert(const libtorrent::save_resume_data_failed_alert *p); - void handleFastResumeRejectedAlert(const libtorrent::fastresume_rejected_alert *p); - void handleFileRenamedAlert(const libtorrent::file_renamed_alert *p); - void handleFileRenameFailedAlert(const libtorrent::file_rename_failed_alert *p); - void handleFileCompletedAlert(const libtorrent::file_completed_alert *p); - void handleMetadataReceivedAlert(const libtorrent::metadata_received_alert *p); - void handleStatsAlert(const libtorrent::stats_alert *p); + void handleStorageMovedAlert(libtorrent::storage_moved_alert *p); + void handleStorageMovedFailedAlert(libtorrent::storage_moved_failed_alert *p); + void handleTrackerReplyAlert(libtorrent::tracker_reply_alert *p); + void handleTrackerWarningAlert(libtorrent::tracker_warning_alert *p); + void handleTrackerErrorAlert(libtorrent::tracker_error_alert *p); + void handleTorrentCheckedAlert(libtorrent::torrent_checked_alert *p); + void handleTorrentFinishedAlert(libtorrent::torrent_finished_alert *p); + void handleTorrentPausedAlert(libtorrent::torrent_paused_alert *p); + void handleTorrentResumedAlert(libtorrent::torrent_resumed_alert *p); + void handleSaveResumeDataAlert(libtorrent::save_resume_data_alert *p); + void handleSaveResumeDataFailedAlert(libtorrent::save_resume_data_failed_alert *p); + void handleFastResumeRejectedAlert(libtorrent::fastresume_rejected_alert *p); + void handleFileRenamedAlert(libtorrent::file_renamed_alert *p); + void handleFileRenameFailedAlert(libtorrent::file_rename_failed_alert *p); + void handleFileCompletedAlert(libtorrent::file_completed_alert *p); + void handleMetadataReceivedAlert(libtorrent::metadata_received_alert *p); + void handleStatsAlert(libtorrent::stats_alert *p); - void resume_impl(bool forced, bool uploadMode); bool isMoveInProgress() const; + bool useTempPath() const; QString nativeActualSavePath() const; void adjustActualSavePath(); void adjustActualSavePath_impl(); - void move_impl(QString path, bool overwrite); - void moveStorage(const QString &newPath, bool overwrite); + void move_impl(QString path); + void moveStorage(const QString &newPath); void manageIncompleteFiles(); bool addTracker(const TrackerEntry &tracker); bool addUrlSeed(const QUrl &urlSeed); bool removeUrlSeed(const QUrl &urlSeed); - void setFirstLastPiecePriorityImpl(bool enabled, const QVector &updatedFilePrio = {}); Session *const m_session; libtorrent::torrent_handle m_nativeHandle; libtorrent::torrent_status m_nativeStatus; - TorrentState m_state; + TorrentState m_state; TorrentInfo m_torrentInfo; SpeedMonitor m_speedMonitor; InfoHash m_hash; - struct - { - QString oldPath; - QString newPath; - // queuedPath is where files should be moved to, - // when current moving is completed - QString queuedPath; - bool queuedOverwrite = true; - } m_moveStorageInfo; - + QString m_oldPath; + QString m_newPath; + // m_queuedPath is where files should be moved to, + // when current moving is completed + QString m_queuedPath; // m_moveFinishedTriggers is activated only when the following conditions are met: // all file rename jobs complete, all file move jobs complete QQueue m_moveFinishedTriggers; @@ -452,22 +417,15 @@ QString m_name; QString m_savePath; QString m_category; - QSet m_tags; bool m_hasSeedStatus; qreal m_ratioLimit; - int m_seedingTimeLimit; bool m_tempPathDisabled; bool m_hasMissingFiles; - bool m_hasRootFolder; - bool m_needsToSetFirstLastPiecePriority; bool m_pauseAfterRecheck; + bool m_needSaveResumeData; QHash m_trackerInfos; - - bool m_started = false; }; } -Q_DECLARE_METATYPE(BitTorrent::TorrentState) - #endif // BITTORRENT_TORRENTHANDLE_H diff -Nru qbittorrent-4.1.3/src/base/bittorrent/torrentinfo.cpp qbittorrent-3.3.15/src/base/bittorrent/torrentinfo.cpp --- qbittorrent-4.1.3/src/base/bittorrent/torrentinfo.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/torrentinfo.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -26,20 +26,20 @@ * exception statement from your version. */ -#include "torrentinfo.h" - -#include - -#include #include #include +#include #include +#include + +#include -#include "base/utils/fs.h" #include "base/utils/misc.h" +#include "base/utils/fs.h" #include "base/utils/string.h" #include "infohash.h" #include "trackerentry.h" +#include "torrentinfo.h" namespace libt = libtorrent; using namespace BitTorrent; @@ -60,76 +60,23 @@ return *this; } -TorrentInfo TorrentInfo::load(const QByteArray &data, QString *error) noexcept +TorrentInfo TorrentInfo::loadFromFile(const QString &path, QString &error) { - // 2-step construction to overcome default limits of `depth_limit` & `token_limit` which are - // used in `torrent_info()` constructor - const int depthLimit = 100; - const int tokenLimit = 10000000; + error.clear(); libt::error_code ec; - -#if LIBTORRENT_VERSION_NUM < 10100 - libt::lazy_entry node; - libt::lazy_bdecode(data.constData(), (data.constData() + data.size()), node, ec - , nullptr, depthLimit, tokenLimit); -#else - libt::bdecode_node node; - bdecode(data.constData(), (data.constData() + data.size()), node, ec - , nullptr, depthLimit, tokenLimit); -#endif - if (ec) { - if (error) - *error = QString::fromStdString(ec.message()); - return TorrentInfo(); - } - - TorrentInfo info {NativePtr(new libt::torrent_info(node, ec))}; + TorrentInfo info(NativePtr(new libt::torrent_info(Utils::String::toStdString(Utils::Fs::toNativePath(path)), ec))); if (ec) { - if (error) - *error = QString::fromStdString(ec.message()); - return TorrentInfo(); + error = QString::fromUtf8(ec.message().c_str()); + qDebug("Cannot load .torrent file: %s", qPrintable(error)); } return info; } -TorrentInfo TorrentInfo::loadFromFile(const QString &path, QString *error) noexcept +TorrentInfo TorrentInfo::loadFromFile(const QString &path) { - if (error) - error->clear(); - - QFile file {path}; - if (!file.open(QIODevice::ReadOnly)) { - if (error) - *error = file.errorString(); - return TorrentInfo(); - } - - const qint64 fileSizeLimit = 100 * 1024 * 1024; // 100 MB - if (file.size() > fileSizeLimit) { - if (error) - *error = tr("File size exceeds max limit %1").arg(fileSizeLimit); - return TorrentInfo(); - } - - QByteArray data; - try { - data = file.readAll(); - } - catch (const std::bad_alloc &e) { - if (error) - *error = tr("Torrent file read error: %1").arg(e.what()); - return TorrentInfo(); - } - if (data.size() != file.size()) { - if (error) - *error = tr("Torrent file read error: size mismatch"); - return TorrentInfo(); - } - - file.close(); - - return load(data, error); + QString error; + return loadFromFile(path, error); } bool TorrentInfo::isValid() const @@ -146,7 +93,7 @@ QString TorrentInfo::name() const { if (!isValid()) return QString(); - return QString::fromStdString(m_nativeInfo->name()); + return Utils::String::fromStdString(m_nativeInfo->name()); } QDateTime TorrentInfo::creationDate() const @@ -159,13 +106,13 @@ QString TorrentInfo::creator() const { if (!isValid()) return QString(); - return QString::fromStdString(m_nativeInfo->creator()); + return Utils::String::fromStdString(m_nativeInfo->creator()); } QString TorrentInfo::comment() const { if (!isValid()) return QString(); - return QString::fromStdString(m_nativeInfo->comment()); + return Utils::String::fromStdString(m_nativeInfo->comment()); } bool TorrentInfo::isPrivate() const @@ -207,7 +154,7 @@ QString TorrentInfo::filePath(int index) const { if (!isValid()) return QString(); - return Utils::Fs::fromNativePath(QString::fromStdString(m_nativeInfo->files().file_path(index))); + return Utils::Fs::fromNativePath(Utils::String::fromStdString(m_nativeInfo->files().file_path(index))); } QStringList TorrentInfo::filePaths() const @@ -227,7 +174,7 @@ QString TorrentInfo::origFilePath(int index) const { if (!isValid()) return QString(); - return Utils::Fs::fromNativePath(QString::fromStdString(m_nativeInfo->orig_files().file_path(index))); + return Utils::Fs::fromNativePath(Utils::String::fromStdString(m_nativeInfo->orig_files().file_path(index))); } qlonglong TorrentInfo::fileSize(int index) const @@ -239,7 +186,7 @@ qlonglong TorrentInfo::fileOffset(int index) const { if (!isValid()) return -1; - return m_nativeInfo->files().file_offset(index); + return m_nativeInfo->file_at(index).offset; } QList TorrentInfo::trackers() const @@ -314,7 +261,7 @@ return hashes; } -TorrentInfo::PieceRange TorrentInfo::filePieces(const QString &file) const +TorrentInfo::PieceRange TorrentInfo::filePieces(const QString& file) const { if (!isValid()) // if we do not check here the debug message will be printed, which would be not correct return {}; @@ -339,21 +286,21 @@ const libt::file_storage &files = nativeInfo()->files(); const auto fileSize = files.file_size(fileIndex); - const auto fileOffset = files.file_offset(fileIndex); - return makeInterval(static_cast(fileOffset / pieceLength()), - static_cast((fileOffset + fileSize - 1) / pieceLength())); + const auto firstOffset = files.file_offset(fileIndex); + return makeInterval(static_cast(firstOffset / pieceLength()), + static_cast((firstOffset + fileSize - 1) / pieceLength())); } -void TorrentInfo::renameFile(const int index, const QString &newPath) +void TorrentInfo::renameFile(uint index, const QString &newPath) { if (!isValid()) return; - nativeInfo()->rename_file(index, Utils::Fs::toNativePath(newPath).toStdString()); + nativeInfo()->rename_file(index, Utils::String::toStdString(newPath)); } int BitTorrent::TorrentInfo::fileIndex(const QString& fileName) const { - // the check whether the object is valid is not needed here - // because if filesCount() returns -1 the loop exits immediately + // the check whether the object valid is not needed here + // because filesCount() returns -1 in that case and the loop exits immediately for (int i = 0; i < filesCount(); ++i) if (fileName == filePath(i)) return i; @@ -361,49 +308,6 @@ return -1; } -QString TorrentInfo::rootFolder() const -{ - QString rootFolder; - for (int i = 0; i < filesCount(); ++i) { - const QString filePath = this->filePath(i); - if (QDir::isAbsolutePath(filePath)) continue; - - const auto filePathElements = filePath.splitRef('/'); - // if at least one file has no root folder, no common root folder exists - if (filePathElements.count() <= 1) return ""; - - if (rootFolder.isEmpty()) - rootFolder = filePathElements.at(0).toString(); - else if (rootFolder != filePathElements.at(0)) - return ""; - } - - return rootFolder; -} - -bool TorrentInfo::hasRootFolder() const -{ - return !rootFolder().isEmpty(); -} - -void TorrentInfo::stripRootFolder() -{ - if (!hasRootFolder()) return; - - libtorrent::file_storage files = m_nativeInfo->files(); - - // Solution for case of renamed root folder - std::string testName = filePath(0).split('/').value(0).toStdString(); - if (files.name() != testName) { - files.set_name(testName); - for (int i = 0; i < files.num_files(); ++i) - files.rename_file(i, files.file_path(i)); - } - - files.set_name(""); - m_nativeInfo->remap_files(files); -} - TorrentInfo::NativePtr TorrentInfo::nativeInfo() const { return m_nativeInfo; diff -Nru qbittorrent-4.1.3/src/base/bittorrent/torrentinfo.h qbittorrent-3.3.15/src/base/bittorrent/torrentinfo.h --- qbittorrent-4.1.3/src/base/bittorrent/torrentinfo.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/torrentinfo.h 2017-08-03 20:30:10.000000000 +0000 @@ -29,21 +29,20 @@ #ifndef BITTORRENT_TORRENTINFO_H #define BITTORRENT_TORRENTINFO_H +#include + #include #include -#include -#include -#include -#include - #include "base/indexrange.h" -class QByteArray; -class QDateTime; class QString; -class QStringList; class QUrl; +class QDateTime; +class QStringList; +class QByteArray; +template class QList; +template class QVector; namespace BitTorrent { @@ -52,8 +51,6 @@ class TorrentInfo { - Q_DECLARE_TR_FUNCTIONS(TorrentInfo) - public: #if LIBTORRENT_VERSION_NUM < 10100 typedef boost::intrusive_ptr NativeConstPtr; @@ -66,8 +63,8 @@ explicit TorrentInfo(NativeConstPtr nativeInfo = NativeConstPtr()); TorrentInfo(const TorrentInfo &other); - static TorrentInfo load(const QByteArray &data, QString *error = nullptr) noexcept; - static TorrentInfo loadFromFile(const QString &path, QString *error = nullptr) noexcept; + static TorrentInfo loadFromFile(const QString &path, QString &error); + static TorrentInfo loadFromFile(const QString &path); TorrentInfo &operator=(const TorrentInfo &other); @@ -102,11 +99,7 @@ PieceRange filePieces(const QString &file) const; PieceRange filePieces(int fileIndex) const; - void renameFile(int index, const QString &newPath); - - QString rootFolder() const; - bool hasRootFolder() const; - void stripRootFolder(); + void renameFile(uint index, const QString &newPath); NativePtr nativeInfo() const; diff -Nru qbittorrent-4.1.3/src/base/bittorrent/tracker.cpp qbittorrent-3.3.15/src/base/bittorrent/tracker.cpp --- qbittorrent-4.1.3/src/base/bittorrent/tracker.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/tracker.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,7 +1,7 @@ /* - * Bittorrent Client using Qt and libtorrent. + * Bittorrent Client using Qt4 and libtorrent. * Copyright (C) 2015 Vladimir Golovnev - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -25,20 +25,18 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#include "tracker.h" - #include - #include #include -#include "base/global.h" -#include "base/http/server.h" #include "base/preferences.h" -#include "base/utils/bytearray.h" +#include "base/http/server.h" #include "base/utils/string.h" +#include "tracker.h" // static limits static const int MAX_TORRENTS = 100; @@ -60,15 +58,15 @@ QString Peer::uid() const { - return ip + ':' + QString::number(port); + return ip + ":" + QString::number(port); } libtorrent::entry Peer::toEntry(bool noPeerId) const { libtorrent::entry::dictionary_type peerMap; if (!noPeerId) - peerMap["id"] = libtorrent::entry(peerId.toStdString()); - peerMap["ip"] = libtorrent::entry(ip.toStdString()); + peerMap["id"] = libtorrent::entry(Utils::String::toStdString(peerId)); + peerMap["ip"] = libtorrent::entry(Utils::String::toStdString(ip)); peerMap["port"] = libtorrent::entry(port); return libtorrent::entry(peerMap); @@ -77,7 +75,7 @@ // Tracker Tracker::Tracker(QObject *parent) - : QObject(parent) + : Http::ResponseBuilder(parent) , m_server(new Http::Server(this, this)) { } @@ -111,14 +109,14 @@ { clear(); // clear response - //qDebug("Tracker received the following request:\n%s", qUtf8Printable(parser.toString())); + //qDebug("Tracker received the following request:\n%s", qPrintable(parser.toString())); // Is request a GET request? if (request.method != "GET") { - qDebug("Tracker: Unsupported HTTP request: %s", qUtf8Printable(request.method)); + qDebug("Tracker: Unsupported HTTP request: %s", qPrintable(request.method)); status(100, "Invalid request type"); } else if (!request.path.startsWith("/announce", Qt::CaseInsensitive)) { - qDebug("Tracker: Unrecognized path: %s", qUtf8Printable(request.path)); + qDebug("Tracker: Unrecognized path: %s", qPrintable(request.path)); status(100, "Invalid request type"); } else { @@ -133,60 +131,49 @@ void Tracker::respondToAnnounceRequest() { - QMap queryParams; - // Parse GET parameters - using namespace Utils::ByteArray; - for (const QByteArray ¶m : copyAsConst(splitToViews(m_request.query, "&"))) { - const int sepPos = param.indexOf('='); - if (sepPos <= 0) continue; // ignores params without name - - const QString paramName {QString::fromUtf8(param.constData(), sepPos)}; - const QByteArray paramValue {param.mid(sepPos + 1)}; - queryParams[paramName] = paramValue; - } - + const QStringMap &gets = m_request.gets; TrackerAnnounceRequest annonceReq; // IP annonceReq.peer.ip = m_env.clientAddress.toString(); // 1. Get info_hash - if (!queryParams.contains("info_hash")) { + if (!gets.contains("info_hash")) { qDebug("Tracker: Missing info_hash"); status(101, "Missing info_hash"); return; } - annonceReq.infoHash = queryParams.value("info_hash"); + annonceReq.infoHash = gets.value("info_hash"); // info_hash cannot be longer than 20 bytes /*if (annonce_req.info_hash.toLatin1().length() > 20) { - qDebug("Tracker: Info_hash is not 20 byte long: %s (%d)", qUtf8Printable(annonce_req.info_hash), annonce_req.info_hash.toLatin1().length()); + qDebug("Tracker: Info_hash is not 20 byte long: %s (%d)", qPrintable(annonce_req.info_hash), annonce_req.info_hash.toLatin1().length()); status(150, "Invalid infohash"); return; }*/ // 2. Get peer ID - if (!queryParams.contains("peer_id")) { + if (!gets.contains("peer_id")) { qDebug("Tracker: Missing peer_id"); status(102, "Missing peer_id"); return; } - annonceReq.peer.peerId = queryParams.value("peer_id"); + annonceReq.peer.peerId = gets.value("peer_id"); // peer_id cannot be longer than 20 bytes /*if (annonce_req.peer.peer_id.length() > 20) { - qDebug("Tracker: peer_id is not 20 byte long: %s", qUtf8Printable(annonce_req.peer.peer_id)); + qDebug("Tracker: peer_id is not 20 byte long: %s", qPrintable(annonce_req.peer.peer_id)); status(151, "Invalid peerid"); return; }*/ // 3. Get port - if (!queryParams.contains("port")) { + if (!gets.contains("port")) { qDebug("Tracker: Missing port"); status(103, "Missing port"); return; } bool ok = false; - annonceReq.peer.port = queryParams.value("port").toInt(&ok); - if (!ok || (annonceReq.peer.port < 0) || (annonceReq.peer.port > 65535)) { + annonceReq.peer.port = gets.value("port").toInt(&ok); + if (!ok || annonceReq.peer.port < 1 || annonceReq.peer.port > 65535) { qDebug("Tracker: Invalid port number (%d)", annonceReq.peer.port); status(103, "Missing port"); return; @@ -194,15 +181,15 @@ // 4. Get event annonceReq.event = ""; - if (queryParams.contains("event")) { - annonceReq.event = queryParams.value("event"); - qDebug("Tracker: event is %s", qUtf8Printable(annonceReq.event)); + if (gets.contains("event")) { + annonceReq.event = gets.value("event"); + qDebug("Tracker: event is %s", qPrintable(annonceReq.event)); } // 5. Get numwant annonceReq.numwant = 50; - if (queryParams.contains("numwant")) { - int tmp = queryParams.value("numwant").toInt(); + if (gets.contains("numwant")) { + int tmp = gets.value("numwant").toInt(); if (tmp > 0) { qDebug("Tracker: numwant = %d", tmp); annonceReq.numwant = tmp; @@ -211,51 +198,37 @@ // 6. no_peer_id (extension) annonceReq.noPeerId = false; - if (queryParams.contains("no_peer_id")) + if (gets.contains("no_peer_id")) annonceReq.noPeerId = true; // 7. TODO: support "compact" extension // Done parsing, now let's reply - if (annonceReq.event == "stopped") { - unregisterPeer(annonceReq); + if (m_torrents.contains(annonceReq.infoHash)) { + if (annonceReq.event == "stopped") { + qDebug("Tracker: Peer stopped downloading, deleting it from the list"); + m_torrents[annonceReq.infoHash].remove(annonceReq.peer.uid()); + return; + } } else { - registerPeer(annonceReq); - replyWithPeerList(annonceReq); - } -} - -void Tracker::registerPeer(const TrackerAnnounceRequest &annonceReq) -{ - if (annonceReq.peer.port == 0) return; - - if (!m_torrents.contains(annonceReq.infoHash)) { // Unknown torrent if (m_torrents.size() == MAX_TORRENTS) { // Reached max size, remove a random torrent m_torrents.erase(m_torrents.begin()); } } - // Register the user - PeerList &peers = m_torrents[annonceReq.infoHash]; - if (!peers.contains(annonceReq.peer.uid())) { - // Unknown peer - if (peers.size() == MAX_PEERS_PER_TORRENT) { - // Too many peers, remove a random one - peers.erase(peers.begin()); - } + PeerList peers = m_torrents.value(annonceReq.infoHash); + if (peers.size() == MAX_PEERS_PER_TORRENT) { + // Too many peers, remove a random one + peers.erase(peers.begin()); } peers[annonceReq.peer.uid()] = annonceReq.peer; -} - -void Tracker::unregisterPeer(const TrackerAnnounceRequest &annonceReq) -{ - if (annonceReq.peer.port == 0) return; + m_torrents[annonceReq.infoHash] = peers; - if (m_torrents[annonceReq.infoHash].remove(annonceReq.peer.uid()) > 0) - qDebug("Tracker: Peer stopped downloading, deleting it from the list"); + // Reply + replyWithPeerList(annonceReq); } void Tracker::replyWithPeerList(const TrackerAnnounceRequest &annonceReq) @@ -263,18 +236,22 @@ // Prepare the entry for bencoding libtorrent::entry::dictionary_type replyDict; replyDict["interval"] = libtorrent::entry(ANNOUNCE_INTERVAL); - + QList peers = m_torrents.value(annonceReq.infoHash).values(); libtorrent::entry::list_type peerList; - for (const Peer &p : m_torrents.value(annonceReq.infoHash)) + foreach (const Peer &p, peers) { + //if (p != annonce_req.peer) peerList.push_back(p.toEntry(annonceReq.noPeerId)); + } replyDict["peers"] = libtorrent::entry(peerList); - - const libtorrent::entry replyEntry(replyDict); + libtorrent::entry replyEntry(replyDict); // bencode - QByteArray reply; - libtorrent::bencode(std::back_inserter(reply), replyEntry); + std::vector buf; + libtorrent::bencode(std::back_inserter(buf), replyEntry); + QByteArray reply(&buf[0], static_cast(buf.size())); qDebug("Tracker: reply with the following bencoded data:\n %s", reply.constData()); // HTTP reply print(reply, Http::CONTENT_TYPE_TXT); } + + diff -Nru qbittorrent-4.1.3/src/base/bittorrent/trackerentry.cpp qbittorrent-3.3.15/src/base/bittorrent/trackerentry.cpp --- qbittorrent-4.1.3/src/base/bittorrent/trackerentry.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/trackerentry.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -26,17 +26,16 @@ * exception statement from your version. */ -#include "trackerentry.h" - #include #include "base/utils/misc.h" #include "base/utils/string.h" +#include "trackerentry.h" using namespace BitTorrent; TrackerEntry::TrackerEntry(const QString &url) - : m_nativeEntry(libtorrent::announce_entry(url.toStdString())) + : m_nativeEntry(libtorrent::announce_entry(Utils::String::toStdString(url))) { } @@ -52,7 +51,7 @@ QString TrackerEntry::url() const { - return QString::fromStdString(m_nativeEntry.url); + return Utils::String::fromStdString(m_nativeEntry.url); } int TrackerEntry::tier() const @@ -85,7 +84,7 @@ return *this; } -bool TrackerEntry::operator==(const TrackerEntry &other) const +bool TrackerEntry::operator==(const TrackerEntry &other) { return (QUrl(url()) == QUrl(other.url())); } diff -Nru qbittorrent-4.1.3/src/base/bittorrent/trackerentry.h qbittorrent-3.3.15/src/base/bittorrent/trackerentry.h --- qbittorrent-4.1.3/src/base/bittorrent/trackerentry.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/trackerentry.h 2017-08-03 20:30:10.000000000 +0000 @@ -60,7 +60,7 @@ void setTier(int value); TrackerEntry &operator=(const TrackerEntry &other); - bool operator==(const TrackerEntry &other) const; + bool operator==(const TrackerEntry &other); libtorrent::announce_entry nativeEntry() const; diff -Nru qbittorrent-4.1.3/src/base/bittorrent/tracker.h qbittorrent-3.3.15/src/base/bittorrent/tracker.h --- qbittorrent-4.1.3/src/base/bittorrent/tracker.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/bittorrent/tracker.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,7 +1,7 @@ /* * Bittorrent Client using Qt and libtorrent. * Copyright (C) 2015 Vladimir Golovnev - * Copyright (C) 2010 Christophe Dumez + * Copyright (C) 2010 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -25,17 +25,17 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef BITTORRENT_TRACKER_H #define BITTORRENT_TRACKER_H #include -#include - -#include "base/http/irequesthandler.h" -#include "base/http/responsebuilder.h" #include "base/http/types.h" +#include "base/http/responsebuilder.h" +#include "base/http/irequesthandler.h" namespace libtorrent { @@ -52,7 +52,7 @@ struct Peer { QString ip; - QByteArray peerId; + QString peerId; int port; bool operator!=(const Peer &other) const; @@ -63,7 +63,7 @@ struct TrackerAnnounceRequest { - QByteArray infoHash; + QString infoHash; QString event; int numwant; Peer peer; @@ -72,17 +72,17 @@ }; typedef QHash PeerList; - typedef QHash TorrentList; + typedef QHash TorrentList; /* Basic Bittorrent tracker implementation in Qt */ /* Following http://wiki.theory.org/BitTorrent_Tracker_Protocol */ - class Tracker : public QObject, public Http::IRequestHandler, private Http::ResponseBuilder + class Tracker : public Http::ResponseBuilder, public Http::IRequestHandler { Q_OBJECT Q_DISABLE_COPY(Tracker) public: - explicit Tracker(QObject *parent = nullptr); + explicit Tracker(QObject *parent = 0); ~Tracker(); bool start(); @@ -90,8 +90,6 @@ private: void respondToAnnounceRequest(); - void registerPeer(const TrackerAnnounceRequest &annonceReq); - void unregisterPeer(const TrackerAnnounceRequest &annonceReq); void replyWithPeerList(const TrackerAnnounceRequest &annonceReq); Http::Server *m_server; diff -Nru qbittorrent-4.1.3/src/base/CMakeLists.txt qbittorrent-3.3.15/src/base/CMakeLists.txt --- qbittorrent-4.1.3/src/base/CMakeLists.txt 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/CMakeLists.txt 2017-08-03 20:30:10.000000000 +0000 @@ -1,8 +1,6 @@ find_package(ZLIB 1.2.5.2 REQUIRED) -add_library(qbt_base STATIC -# headers -bittorrent/addtorrentparams.h +set(QBT_BASE_HEADERS bittorrent/cachestatus.h bittorrent/infohash.h bittorrent/magneturi.h @@ -20,7 +18,6 @@ bittorrent/tracker.h bittorrent/trackerentry.h http/connection.h -http/httperror.h http/irequesthandler.h http/requestparser.h http/responsebuilder.h @@ -36,46 +33,37 @@ net/proxyconfigurationmanager.h net/reverseresolution.h net/smtp.h -private/profile_p.h -rss/private/rss_parser.h -rss/rss_article.h -rss/rss_autodownloader.h -rss/rss_autodownloadrule.h -rss/rss_feed.h -rss/rss_folder.h -rss/rss_item.h -rss/rss_session.h -search/searchdownloadhandler.h -search/searchhandler.h -search/searchpluginmanager.h -utils/bytearray.h -utils/foreignapps.h +rss/private/rssparser.h +rss/rssarticle.h +rss/rssdownloadrule.h +rss/rssdownloadrulelist.h +rss/rssfeed.h +rss/rssfile.h +rss/rssfolder.h +rss/rssmanager.h utils/fs.h utils/gzip.h utils/misc.h -utils/net.h utils/random.h utils/string.h -utils/version.h -algorithm.h -asyncfilestorage.h -exceptions.h filesystemwatcher.h -global.h iconprovider.h indexrange.h logger.h preferences.h -profile.h +qinisettings.h scanfoldersmodel.h +searchengine.h settingsstorage.h torrentfileguard.h torrentfilter.h tristatebool.h types.h unicodestrings.h +) -# sources +set(QBT_BASE_SOURCES +bittorrent/cachestatus.cpp bittorrent/infohash.cpp bittorrent/magneturi.cpp bittorrent/peerinfo.cpp @@ -85,13 +73,13 @@ bittorrent/private/speedmonitor.cpp bittorrent/private/statistics.cpp bittorrent/session.cpp +bittorrent/sessionstatus.cpp bittorrent/torrentcreatorthread.cpp bittorrent/torrenthandle.cpp bittorrent/torrentinfo.cpp bittorrent/tracker.cpp bittorrent/trackerentry.cpp http/connection.cpp -http/httperror.cpp http/requestparser.cpp http/responsebuilder.cpp http/responsegenerator.cpp @@ -105,59 +93,50 @@ net/proxyconfigurationmanager.cpp net/reverseresolution.cpp net/smtp.cpp -private/profile_p.cpp -rss/private/rss_parser.cpp -rss/rss_article.cpp -rss/rss_autodownloader.cpp -rss/rss_autodownloadrule.cpp -rss/rss_feed.cpp -rss/rss_folder.cpp -rss/rss_item.cpp -rss/rss_session.cpp -search/searchdownloadhandler.cpp -search/searchhandler.cpp -search/searchpluginmanager.cpp -utils/bytearray.cpp -utils/foreignapps.cpp +rss/private/rssparser.cpp +rss/rssarticle.cpp +rss/rssdownloadrule.cpp +rss/rssdownloadrulelist.cpp +rss/rssfeed.cpp +rss/rssfile.cpp +rss/rssfolder.cpp +rss/rssmanager.cpp utils/fs.cpp utils/gzip.cpp utils/misc.cpp -utils/net.cpp utils/random.cpp utils/string.cpp -asyncfilestorage.cpp -exceptions.cpp filesystemwatcher.cpp iconprovider.cpp logger.cpp preferences.cpp -profile.cpp scanfoldersmodel.cpp +searchengine.cpp settingsstorage.cpp torrentfileguard.cpp torrentfilter.cpp tristatebool.cpp ) -target_link_libraries(qbt_base - PRIVATE - ZLIB::ZLIB - PUBLIC - LibtorrentRasterbar::torrent-rasterbar - Qt5::Core Qt5::Network Qt5::Xml -) - -if (Qt5Widgets_FOUND) - target_link_libraries(qbt_base PUBLIC Qt5::Gui Qt5::Widgets) -endif (Qt5Widgets_FOUND) +add_library(qbt_base STATIC ${QBT_BASE_HEADERS} ${QBT_BASE_SOURCES}) +target_link_libraries(qbt_base PRIVATE ZLIB::ZLIB PUBLIC LibtorrentRasterbar::LibTorrent) +target_link_qt_components(qbt_base PUBLIC Core Network Xml) +if (QT4_FOUND) + if (GUI) + target_link_libraries(qbt_base PUBLIC Qt4::QtGui) + endif (GUI) +else (QT4_FOUND) + if (GUI) + target_link_libraries(qbt_base PUBLIC Qt5::Gui Qt5::Widgets) + endif (GUI) +endif (QT4_FOUND) -if (Qt5DBus_FOUND) - target_link_libraries(qbt_base PRIVATE Qt5::DBus) +if (DBUS) + target_link_qt_components(qbt_base PRIVATE DBus) endif () if (APPLE) find_library(IOKit_LIBRARY IOKit) find_library(Carbon_LIBRARY Carbon) - find_library(AppKit_LIBRARY AppKit) - target_link_libraries(qbt_base PRIVATE ${Carbon_LIBRARY} ${IOKit_LIBRARY} ${AppKit_LIBRARY}) + target_link_libraries(qbt_base PRIVATE ${Carbon_LIBRARY} ${IOKit_LIBRARY}) endif (APPLE) diff -Nru qbittorrent-4.1.3/src/base/exceptions.cpp qbittorrent-3.3.15/src/base/exceptions.cpp --- qbittorrent-4.1.3/src/base/exceptions.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/exceptions.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2018 Vladimir Golovnev - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "exceptions.h" - -RuntimeError::RuntimeError(const QString &message) - : std::runtime_error {message.toUtf8().data()} - , m_message {message} -{ -} - -QString RuntimeError::message() const -{ - return m_message; -} diff -Nru qbittorrent-4.1.3/src/base/exceptions.h qbittorrent-3.3.15/src/base/exceptions.h --- qbittorrent-4.1.3/src/base/exceptions.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/exceptions.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2018 Vladimir Golovnev - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#pragma once - -#include -#include - -class RuntimeError : public std::runtime_error -{ -public: - explicit RuntimeError(const QString &message = ""); - QString message() const; - -private: - const QString m_message; -}; diff -Nru qbittorrent-4.1.3/src/base/filesystemwatcher.cpp qbittorrent-3.3.15/src/base/filesystemwatcher.cpp --- qbittorrent-4.1.3/src/base/filesystemwatcher.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/filesystemwatcher.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,161 +1,176 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2018 - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ +#include +#ifndef Q_OS_WIN +#include +#include +#include +#if defined(Q_OS_MAC) || defined(Q_OS_FREEBSD) +#include +#include +#include +#elif !defined Q_OS_HAIKU +#include +#endif +#endif +#include "base/preferences.h" +#include "base/bittorrent/torrentinfo.h" +#include "base/bittorrent/magneturi.h" #include "filesystemwatcher.h" -#include +#ifndef CIFS_MAGIC_NUMBER +#define CIFS_MAGIC_NUMBER 0xFF534D42 +#endif -#if defined(Q_OS_MAC) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD) -#include -#include -#include +#ifndef NFS_SUPER_MAGIC +#define NFS_SUPER_MAGIC 0x6969 #endif -#include "base/algorithm.h" -#include "base/bittorrent/magneturi.h" -#include "base/bittorrent/torrentinfo.h" -#include "base/global.h" -#include "base/preferences.h" -#include "base/utils/fs.h" +#ifndef SMB_SUPER_MAGIC +#define SMB_SUPER_MAGIC 0x517B +#endif -namespace -{ - const int WATCH_INTERVAL = 10000; // 10 sec - const int MAX_PARTIAL_RETRIES = 5; -} +const int WATCH_INTERVAL = 10000; // 10 sec +const int MAX_PARTIAL_RETRIES = 5; FileSystemWatcher::FileSystemWatcher(QObject *parent) : QFileSystemWatcher(parent) { - connect(this, &QFileSystemWatcher::directoryChanged, this, &FileSystemWatcher::scanLocalFolder); - - m_partialTorrentTimer.setSingleShot(true); - connect(&m_partialTorrentTimer, &QTimer::timeout, this, &FileSystemWatcher::processPartialTorrents); + m_filters << "*.torrent" << "*.magnet"; + connect(this, SIGNAL(directoryChanged(QString)), SLOT(scanLocalFolder(QString))); +} +FileSystemWatcher::~FileSystemWatcher() +{ #ifndef Q_OS_WIN - connect(&m_watchTimer, &QTimer::timeout, this, &FileSystemWatcher::scanNetworkFolders); + if (m_watchTimer) + delete m_watchTimer; #endif + if (m_partialTorrentTimer) + delete m_partialTorrentTimer; } QStringList FileSystemWatcher::directories() const { - QStringList dirs = QFileSystemWatcher::directories(); + QStringList dirs; #ifndef Q_OS_WIN - for (const QDir &dir : qAsConst(m_watchedFolders)) - dirs << dir.canonicalPath(); + if (m_watchTimer) { + foreach (const QDir &dir, m_watchedFolders) + dirs << dir.canonicalPath(); + } #endif + dirs << QFileSystemWatcher::directories(); return dirs; } void FileSystemWatcher::addPath(const QString &path) { - if (path.isEmpty()) return; - #if !defined Q_OS_WIN && !defined Q_OS_HAIKU - const QDir dir(path); + QDir dir(path); if (!dir.exists()) return; // Check if the path points to a network file system or not - if (Utils::Fs::isNetworkFileSystem(path)) { + if (isNetworkFileSystem(path)) { // Network mode - qDebug("Network folder detected: %s", qUtf8Printable(path)); + qDebug("Network folder detected: %s", qPrintable(path)); qDebug("Using file polling mode instead of inotify..."); m_watchedFolders << dir; - - m_watchTimer.start(WATCH_INTERVAL); - return; + // Set up the watch timer + if (!m_watchTimer) { + m_watchTimer = new QTimer(this); + connect(m_watchTimer, SIGNAL(timeout()), SLOT(scanNetworkFolders())); + m_watchTimer->start(WATCH_INTERVAL); // 5 sec + } + } + else { +#endif + // Normal mode + qDebug("FS Watching is watching %s in normal mode", qPrintable(path)); + QFileSystemWatcher::addPath(path); + scanLocalFolder(path); +#if !defined Q_OS_WIN && !defined Q_OS_HAIKU } #endif - - // Normal mode - qDebug("FS Watcher is watching %s in normal mode", qUtf8Printable(path)); - QFileSystemWatcher::addPath(path); - scanLocalFolder(path); } void FileSystemWatcher::removePath(const QString &path) { #ifndef Q_OS_WIN - if (m_watchedFolders.removeOne(path)) { - if (m_watchedFolders.isEmpty()) - m_watchTimer.stop(); - return; + QDir dir(path); + for (int i = 0; i < m_watchedFolders.count(); ++i) { + if (QDir(m_watchedFolders.at(i)) == dir) { + m_watchedFolders.removeAt(i); + if (m_watchedFolders.isEmpty()) + delete m_watchTimer; + return; + } } #endif // Normal mode QFileSystemWatcher::removePath(path); } -void FileSystemWatcher::scanLocalFolder(const QString &path) +void FileSystemWatcher::scanLocalFolder(QString path) { - QTimer::singleShot(2000, this, [this, path]() { processTorrentsInDir(path); }); + qDebug("scanLocalFolder(%s) called", qPrintable(path)); + QStringList torrents; + // Local folders scan + addTorrentsFromDir(QDir(path), torrents); + // Report detected torrent files + if (!torrents.empty()) { + qDebug("The following files are being reported: %s", qPrintable(torrents.join("\n"))); + emit torrentsAdded(torrents); + } } -#ifndef Q_OS_WIN void FileSystemWatcher::scanNetworkFolders() { - for (const QDir &dir : qAsConst(m_watchedFolders)) - processTorrentsInDir(dir); -} +#ifndef Q_OS_WIN + qDebug("scanNetworkFolders() called"); + QStringList torrents; + // Network folders scan + foreach (const QDir &dir, m_watchedFolders) { + //qDebug("FSWatcher: Polling manually folder %s", qPrintable(dir.path())); + addTorrentsFromDir(dir, torrents); + } + // Report detected torrent files + if (!torrents.empty()) { + qDebug("The following files are being reported: %s", qPrintable(torrents.join("\n"))); + emit torrentsAdded(torrents); + } #endif +} void FileSystemWatcher::processPartialTorrents() { QStringList noLongerPartial; // Check which torrents are still partial - Dict::removeIf(m_partialTorrents, [&noLongerPartial](const QString &torrentPath, int &value) - { - if (!QFile::exists(torrentPath)) - return true; - - if (BitTorrent::TorrentInfo::loadFromFile(torrentPath).isValid()) { + foreach (const QString &torrentPath, m_partialTorrents.keys()) { + if (!QFile::exists(torrentPath)) { + m_partialTorrents.remove(torrentPath); + } + else if (BitTorrent::TorrentInfo::loadFromFile(torrentPath).isValid()) { noLongerPartial << torrentPath; - return true; + m_partialTorrents.remove(torrentPath); } - - if (value >= MAX_PARTIAL_RETRIES) { - QFile::rename(torrentPath, torrentPath + ".qbt_rejected"); - return true; + else if (m_partialTorrents[torrentPath] >= MAX_PARTIAL_RETRIES) { + m_partialTorrents.remove(torrentPath); + QFile::rename(torrentPath, torrentPath + ".invalid"); } - - ++value; - return false; - }); + else { + ++m_partialTorrents[torrentPath]; + } + } // Stop the partial timer if necessary if (m_partialTorrents.empty()) { - m_partialTorrentTimer.stop(); + m_partialTorrentTimer->stop(); + m_partialTorrentTimer->deleteLater(); qDebug("No longer any partial torrent."); } else { qDebug("Still %d partial torrents after delayed processing.", m_partialTorrents.count()); - m_partialTorrentTimer.start(WATCH_INTERVAL); + m_partialTorrentTimer->start(WATCH_INTERVAL); } // Notify of new torrents @@ -163,23 +178,97 @@ emit torrentsAdded(noLongerPartial); } -void FileSystemWatcher::processTorrentsInDir(const QDir &dir) +void FileSystemWatcher::startPartialTorrentTimer() { - QStringList torrents; - const QStringList files = dir.entryList({"*.torrent", "*.magnet"}, QDir::Files); - for (const QString &file : files) { + Q_ASSERT(!m_partialTorrents.isEmpty()); + if (!m_partialTorrentTimer) { + m_partialTorrentTimer = new QTimer(); + connect(m_partialTorrentTimer, SIGNAL(timeout()), SLOT(processPartialTorrents())); + m_partialTorrentTimer->setSingleShot(true); + m_partialTorrentTimer->start(WATCH_INTERVAL); + } +} + +void FileSystemWatcher::addTorrentsFromDir(const QDir &dir, QStringList &torrents) +{ + const QStringList files = dir.entryList(m_filters, QDir::Files, QDir::Unsorted); + foreach (const QString &file, files) { const QString fileAbsPath = dir.absoluteFilePath(file); - if (file.endsWith(".magnet")) + if (fileAbsPath.endsWith(".magnet")) { torrents << fileAbsPath; - else if (BitTorrent::TorrentInfo::loadFromFile(fileAbsPath).isValid()) + } + else if (BitTorrent::TorrentInfo::loadFromFile(fileAbsPath).isValid()) { torrents << fileAbsPath; - else if (!m_partialTorrents.contains(fileAbsPath)) - m_partialTorrents[fileAbsPath] = 0; + } + else if (!m_partialTorrents.contains(fileAbsPath)) { + qDebug("Partial torrent detected at: %s", qPrintable(fileAbsPath)); + qDebug("Delay the file's processing..."); + m_partialTorrents.insert(fileAbsPath, 0); + } } - if (!torrents.empty()) - emit torrentsAdded(torrents); + if (!m_partialTorrents.empty()) + startPartialTorrentTimer(); +} - if (!m_partialTorrents.empty() && !m_partialTorrentTimer.isActive()) - m_partialTorrentTimer.start(WATCH_INTERVAL); +#if !defined Q_OS_WIN && !defined Q_OS_HAIKU +bool FileSystemWatcher::isNetworkFileSystem(QString path) +{ + QString file = path; + if (!file.endsWith("/")) + file += "/"; + file += "."; + struct statfs buf; + if (!statfs(file.toLocal8Bit().constData(), &buf)) { +#ifdef Q_OS_MAC + // XXX: should we make sure HAVE_STRUCT_FSSTAT_F_FSTYPENAME is defined? + return ((strcmp(buf.f_fstypename, "nfs") == 0) || (strcmp(buf.f_fstypename, "cifs") == 0) || (strcmp(buf.f_fstypename, "smbfs") == 0)); +#else + return ((buf.f_type == (long)CIFS_MAGIC_NUMBER) || (buf.f_type == (long)NFS_SUPER_MAGIC) || (buf.f_type == (long)SMB_SUPER_MAGIC)); +#endif + } + else { + std::cerr << "Error: statfs() call failed for " << qPrintable(file) << ". Supposing it is a local folder..." << std::endl; + switch(errno) { + case EACCES: + std::cerr << "Search permission is denied for a component of the path prefix of the path" << std::endl; + break; + case EFAULT: + std::cerr << "Buf or path points to an invalid address" << std::endl; + break; + case EINTR: + std::cerr << "This call was interrupted by a signal" << std::endl; + break; + case EIO: + std::cerr << "I/O Error" << std::endl; + break; + case ELOOP: + std::cerr << "Too many symlinks" << std::endl; + break; + case ENAMETOOLONG: + std::cerr << "path is too long" << std::endl; + break; + case ENOENT: + std::cerr << "The file referred by path does not exist" << std::endl; + break; + case ENOMEM: + std::cerr << "Insufficient kernel memory" << std::endl; + break; + case ENOSYS: + std::cerr << "The file system does not detect this call" << std::endl; + break; + case ENOTDIR: + std::cerr << "A component of the path is not a directory" << std::endl; + break; + case EOVERFLOW: + std::cerr << "Some values were too large to be represented in the struct" << std::endl; + break; + default: + std::cerr << "Unknown error" << std::endl; + } + + std::cerr << "Errno: " << errno << std::endl; + return false; + } } +#endif diff -Nru qbittorrent-4.1.3/src/base/filesystemwatcher.h qbittorrent-3.3.15/src/base/filesystemwatcher.h --- qbittorrent-4.1.3/src/base/filesystemwatcher.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/filesystemwatcher.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,39 +1,12 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2018 - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - #ifndef FILESYSTEMWATCHER_H #define FILESYSTEMWATCHER_H -#include #include -#include -#include +#include #include +#include +#include +#include /* * Subclassing QFileSystemWatcher in order to support Network File @@ -44,7 +17,8 @@ Q_OBJECT public: - explicit FileSystemWatcher(QObject *parent = nullptr); + explicit FileSystemWatcher(QObject *parent = 0); + ~FileSystemWatcher(); QStringList directories() const; void addPath(const QString &path); @@ -54,23 +28,25 @@ void torrentsAdded(const QStringList &pathList); protected slots: - void scanLocalFolder(const QString &path); - void processPartialTorrents(); -#ifndef Q_OS_WIN + void scanLocalFolder(QString path); void scanNetworkFolders(); -#endif + void processPartialTorrents(); private: - void processTorrentsInDir(const QDir &dir); - - // Partial torrents - QHash m_partialTorrents; - QTimer m_partialTorrentTimer; + void startPartialTorrentTimer(); + void addTorrentsFromDir(const QDir &dir, QStringList &torrents); +#if !defined Q_OS_WIN && !defined Q_OS_HAIKU + static bool isNetworkFileSystem(QString path); +#endif #ifndef Q_OS_WIN QList m_watchedFolders; - QTimer m_watchTimer; + QPointer m_watchTimer; #endif + QStringList m_filters; + // Partial torrents + QHash m_partialTorrents; + QPointer m_partialTorrentTimer; }; #endif // FILESYSTEMWATCHER_H diff -Nru qbittorrent-4.1.3/src/base/global.h qbittorrent-3.3.15/src/base/global.h --- qbittorrent-4.1.3/src/base/global.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/global.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2016 Mike Tzou - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#pragma once - -#include -#include - -const char C_TORRENT_FILE_EXTENSION[] = ".torrent"; - - -#if QT_VERSION < QT_VERSION_CHECK(5, 7, 0) -template -constexpr typename std::add_const::type &qAsConst(T &t) noexcept { return t; } - -// prevent rvalue arguments: -template -void qAsConst(const T &&) = delete; -#endif - -// returns a const object copy -template -constexpr typename std::add_const::type copyAsConst(T &&t) noexcept { return std::move(t); } diff -Nru qbittorrent-4.1.3/src/base/http/connection.cpp qbittorrent-3.3.15/src/base/http/connection.cpp --- qbittorrent-4.1.3/src/base/http/connection.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/http/connection.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,8 +1,7 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2018 Mike Tzou (Chocobo1) * Copyright (C) 2014 Vladimir Golovnev - * Copyright (C) 2006 Ishan Arora and Christophe Dumez + * Copyright (C) 2006 Ishan Arora and Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -26,13 +25,18 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #include "connection.h" +#include +#ifndef QBT_USES_QT5 +#include +#endif #include -#include "base/logger.h" #include "irequesthandler.h" #include "requestparser.h" #include "responsegenerator.h" @@ -46,7 +50,7 @@ { m_socket->setParent(this); m_idleTimer.start(); - connect(m_socket, &QTcpSocket::readyRead, this, &Connection::read); + connect(m_socket, SIGNAL(readyRead()), SLOT(read())); } Connection::~Connection() @@ -57,64 +61,37 @@ void Connection::read() { m_idleTimer.restart(); - m_receivedData.append(m_socket->readAll()); - while (!m_receivedData.isEmpty()) { - const RequestParser::ParseResult result = RequestParser::parse(m_receivedData); + m_receivedData.append(m_socket->readAll()); + Request request; + RequestParser::ErrorCode err = RequestParser::parse(m_receivedData, request); // TODO: transform request headers to lowercase - switch (result.status) { - case RequestParser::ParseStatus::Incomplete: { - const long bufferLimit = RequestParser::MAX_CONTENT_SIZE * 1.1; // some margin for headers - if (m_receivedData.size() > bufferLimit) { - Logger::instance()->addMessage(tr("Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s") - .arg(bufferLimit).arg(m_socket->peerAddress().toString()), Log::WARNING); - - Response resp(413, "Payload Too Large"); - resp.headers[HEADER_CONNECTION] = "close"; - - sendResponse(resp); - m_socket->close(); - } - } - return; - - case RequestParser::ParseStatus::BadRequest: { - Logger::instance()->addMessage(tr("Bad Http request, closing socket. IP: %s") - .arg(m_socket->peerAddress().toString()), Log::WARNING); - - Response resp(400, "Bad Request"); - resp.headers[HEADER_CONNECTION] = "close"; - - sendResponse(resp); - m_socket->close(); - } - return; - - case RequestParser::ParseStatus::OK: { - const Environment env {m_socket->localAddress(), m_socket->localPort(), m_socket->peerAddress(), m_socket->peerPort()}; - - Response resp = m_requestHandler->processRequest(result.request, env); - - if (acceptsGzipEncoding(result.request.headers["accept-encoding"])) - resp.headers[HEADER_CONTENT_ENCODING] = "gzip"; - - resp.headers[HEADER_CONNECTION] = "keep-alive"; - - sendResponse(resp); - m_receivedData = m_receivedData.mid(result.frameSize); - } - break; - - default: - Q_ASSERT(false); - return; - } + switch (err) { + case RequestParser::IncompleteRequest: + // Partial request waiting for the rest + break; + + case RequestParser::BadRequest: + sendResponse(Response(400, "Bad Request")); + m_receivedData.clear(); + break; + + case RequestParser::NoError: + const Environment env {m_socket->localAddress(), m_socket->localPort(), m_socket->peerAddress(), m_socket->peerPort()}; + + Response response = m_requestHandler->processRequest(request, env); + if (acceptsGzipEncoding(request.headers["accept-encoding"])) + response.headers[HEADER_CONTENT_ENCODING] = "gzip"; + sendResponse(response); + m_receivedData.clear(); + break; } } -void Connection::sendResponse(const Response &response) const +void Connection::sendResponse(const Response &response) { m_socket->write(toByteArray(response)); + m_socket->close(); // TODO: remove when HTTP pipelining is supported } bool Connection::hasExpired(const qint64 timeout) const @@ -133,7 +110,7 @@ const auto isCodingAvailable = [](const QStringList &list, const QString &encoding) -> bool { - foreach (const QString &str, list) { + for (const QString &str: list) { if (!str.startsWith(encoding)) continue; @@ -142,7 +119,11 @@ return true; // [rfc7231] 5.3.1. Quality Values +#ifdef QBT_USES_QT5 const QStringRef substr = str.midRef(encoding.size() + 3); // ex. skip over "gzip;q=" +#else + const QString substr = str.mid(encoding.size() + 3); // ex. skip over "gzip;q=" +#endif bool ok = false; const double qvalue = substr.toDouble(&ok); diff -Nru qbittorrent-4.1.3/src/base/http/connection.h qbittorrent-3.3.15/src/base/http/connection.h --- qbittorrent-4.1.3/src/base/http/connection.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/http/connection.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,7 +1,7 @@ /* * Bittorrent Client using Qt and libtorrent. * Copyright (C) 2014 Vladimir Golovnev - * Copyright (C) 2006 Ishan Arora and Christophe Dumez + * Copyright (C) 2006 Ishan Arora and Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -25,6 +25,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ @@ -48,7 +50,7 @@ Q_DISABLE_COPY(Connection) public: - Connection(QTcpSocket *socket, IRequestHandler *requestHandler, QObject *parent = nullptr); + Connection(QTcpSocket *socket, IRequestHandler *requestHandler, QObject *parent = 0); ~Connection(); bool hasExpired(qint64 timeout) const; @@ -59,7 +61,7 @@ private: static bool acceptsGzipEncoding(QString codings); - void sendResponse(const Response &response) const; + void sendResponse(const Response &response); QTcpSocket *m_socket; IRequestHandler *m_requestHandler; diff -Nru qbittorrent-4.1.3/src/base/http/httperror.cpp qbittorrent-3.3.15/src/base/http/httperror.cpp --- qbittorrent-4.1.3/src/base/http/httperror.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/http/httperror.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,81 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "httperror.h" - -HTTPError::HTTPError(int statusCode, const QString &statusText, const QString &message) - : RuntimeError {message} - , m_statusCode {statusCode} - , m_statusText {statusText} -{ -} - -int HTTPError::statusCode() const -{ - return m_statusCode; -} - -QString HTTPError::statusText() const -{ - return m_statusText; -} - -BadRequestHTTPError::BadRequestHTTPError(const QString &message) - : HTTPError(400, QLatin1String("Bad Request"), message) -{ -} - -ConflictHTTPError::ConflictHTTPError(const QString &message) - : HTTPError(409, QLatin1String("Conflict"), message) -{ -} - -ForbiddenHTTPError::ForbiddenHTTPError(const QString &message) - : HTTPError(403, QLatin1String("Forbidden"), message) -{ -} - -NotFoundHTTPError::NotFoundHTTPError(const QString &message) - : HTTPError(404, QLatin1String("Not Found"), message) -{ -} - -UnsupportedMediaTypeHTTPError::UnsupportedMediaTypeHTTPError(const QString &message) - : HTTPError(415, QLatin1String("Unsupported Media Type"), message) -{ -} - -UnauthorizedHTTPError::UnauthorizedHTTPError(const QString &message) - : HTTPError(401, QLatin1String("Unauthorized"), message) -{ -} - -InternalServerErrorHTTPError::InternalServerErrorHTTPError(const QString &message) - : HTTPError(500, QLatin1String("Internal Server Error"), message) -{ -} diff -Nru qbittorrent-4.1.3/src/base/http/httperror.h qbittorrent-3.3.15/src/base/http/httperror.h --- qbittorrent-4.1.3/src/base/http/httperror.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/http/httperror.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,86 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#pragma once - -#include "base/exceptions.h" - -class HTTPError : public RuntimeError -{ -public: - HTTPError(int statusCode, const QString &statusText, const QString &message = ""); - - int statusCode() const; - QString statusText() const; - -private: - const int m_statusCode; - const QString m_statusText; -}; - -class BadRequestHTTPError : public HTTPError -{ -public: - explicit BadRequestHTTPError(const QString &message = ""); -}; - -class ForbiddenHTTPError : public HTTPError -{ -public: - explicit ForbiddenHTTPError(const QString &message = ""); -}; - -class NotFoundHTTPError : public HTTPError -{ -public: - explicit NotFoundHTTPError(const QString &message = ""); -}; - -class ConflictHTTPError : public HTTPError -{ -public: - explicit ConflictHTTPError(const QString &message = ""); -}; - -class UnsupportedMediaTypeHTTPError : public HTTPError -{ -public: - explicit UnsupportedMediaTypeHTTPError(const QString &message = ""); -}; - -class UnauthorizedHTTPError : public HTTPError -{ -public: - explicit UnauthorizedHTTPError(const QString &message = ""); -}; - -class InternalServerErrorHTTPError : public HTTPError -{ -public: - explicit InternalServerErrorHTTPError(const QString &message = ""); -}; diff -Nru qbittorrent-4.1.3/src/base/http/requestparser.cpp qbittorrent-3.3.15/src/base/http/requestparser.cpp --- qbittorrent-4.1.3/src/base/http/requestparser.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/http/requestparser.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,8 +1,7 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2018 Mike Tzou (Chocobo1) * Copyright (C) 2014 Vladimir Golovnev - * Copyright (C) 2006 Ishan Arora and Christophe Dumez + * Copyright (C) 2006 Ishan Arora and Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -26,220 +25,259 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#include "requestparser.h" - -#include -#include #include #include +#ifdef QBT_USES_QT5 #include +#endif +#include +#include +#include "requestparser.h" -#include "base/utils/bytearray.h" -#include "base/utils/string.h" - -using namespace Http; -using namespace Utils::ByteArray; -using QStringPair = QPair; +const QByteArray EOL("\r\n"); +const QByteArray EOH("\r\n\r\n"); -namespace +inline QString unquoted(const QString& str) { - const QByteArray EOH = QByteArray(CRLF).repeated(2); - - const QByteArray viewWithoutEndingWith(const QByteArray &in, const QByteArray &str) - { - if (in.endsWith(str)) - return QByteArray::fromRawData(in.constData(), (in.size() - str.size())); - return in; - } - - bool parseHeaderLine(const QString &line, QStringMap &out) - { - // [rfc7230] 3.2. Header Fields - const int i = line.indexOf(':'); - if (i <= 0) { - qWarning() << Q_FUNC_INFO << "invalid http header:" << line; - return false; - } + if ((str[0] == '\"') && (str[str.length() - 1] == '\"')) + return str.mid(1, str.length() - 2); - const QString name = line.leftRef(i).trimmed().toString().toLower(); - const QString value = line.midRef(i + 1).trimmed().toString(); - out[name] = value; - - return true; - } + return str; } -RequestParser::RequestParser() +using namespace Http; + +RequestParser::ErrorCode RequestParser::parse(const QByteArray& data, Request& request, uint maxContentLength) { + return RequestParser(maxContentLength).parseHttpRequest(data, request); } -RequestParser::ParseResult RequestParser::parse(const QByteArray &data) +RequestParser::RequestParser(uint maxContentLength) + : m_maxContentLength(maxContentLength) { - // Warning! Header names are converted to lowercase - return RequestParser().doParse(data); } -RequestParser::ParseResult RequestParser::doParse(const QByteArray &data) +RequestParser::ErrorCode RequestParser::parseHttpRequest(const QByteArray& data, Request& request) { - // we don't handle malformed requests which use double `LF` as delimiter - const int headerEnd = data.indexOf(EOH); - if (headerEnd < 0) { + m_request = Request(); + + // Parse HTTP request header + const int header_end = data.indexOf(EOH); + if (header_end < 0) { qDebug() << Q_FUNC_INFO << "incomplete request"; - return {ParseStatus::Incomplete, Request(), 0}; + return IncompleteRequest; } - const QString httpHeaders = QString::fromLatin1(data.constData(), headerEnd); - if (!parseStartLines(httpHeaders)) { + if (!parseHttpHeader(data.left(header_end))) { qWarning() << Q_FUNC_INFO << "header parsing error"; - return {ParseStatus::BadRequest, Request(), 0}; + return BadRequest; } - const int headerLength = headerEnd + EOH.length(); - - // handle supported methods - if ((m_request.method == HEADER_REQUEST_METHOD_GET) || (m_request.method == HEADER_REQUEST_METHOD_HEAD)) - return {ParseStatus::OK, m_request, headerLength}; - if (m_request.method == HEADER_REQUEST_METHOD_POST) { - bool ok = false; - const int contentLength = m_request.headers[HEADER_CONTENT_LENGTH].toInt(&ok); - if (!ok || (contentLength < 0)) { - qWarning() << Q_FUNC_INFO << "bad request: content-length invalid"; - return {ParseStatus::BadRequest, Request(), 0}; + // Parse HTTP request message + if (m_request.headers.contains("content-length")) { + int content_length = m_request.headers["content-length"].toInt(); + if (content_length < 0) { + qWarning() << Q_FUNC_INFO << "bad request: content-length negative"; + return BadRequest; } - if (contentLength > MAX_CONTENT_SIZE) { + + if (content_length > static_cast(m_maxContentLength)) { qWarning() << Q_FUNC_INFO << "bad request: message too long"; - return {ParseStatus::BadRequest, Request(), 0}; + return BadRequest; } - if (contentLength > 0) { - const QByteArray httpBodyView = midView(data, headerLength, contentLength); - if (httpBodyView.length() < contentLength) { - qDebug() << Q_FUNC_INFO << "incomplete request"; - return {ParseStatus::Incomplete, Request(), 0}; - } + QByteArray content = data.mid(header_end + EOH.length(), content_length); + if (content.length() < content_length) { + qDebug() << Q_FUNC_INFO << "incomplete request"; + return IncompleteRequest; + } - if (!parsePostMessage(httpBodyView)) { - qWarning() << Q_FUNC_INFO << "message body parsing error"; - return {ParseStatus::BadRequest, Request(), 0}; - } + if ((content_length > 0) && !parseContent(content)) { + qWarning() << Q_FUNC_INFO << "message parsing error"; + return BadRequest; + } + } + + // qDebug() << Q_FUNC_INFO; + // qDebug() << "HTTP Request header:"; + // qDebug() << data.left(header_end) << "\n"; + + request = m_request; + return NoError; +} + +bool RequestParser::parseStartingLine(const QString &line) +{ + const QRegExp rx("^([A-Z]+)\\s+(\\S+)\\s+HTTP/\\d\\.\\d$"); + + if (rx.indexIn(line.trimmed()) >= 0) { + m_request.method = rx.cap(1); + + QUrl url = QUrl::fromEncoded(rx.cap(2).toLatin1()); + m_request.path = url.path(); // Path + + // Parse GET parameters +#ifndef QBT_USES_QT5 + QListIterator > i(url.queryItems()); +#else + QListIterator > i(QUrlQuery(url).queryItems()); +#endif + while (i.hasNext()) { + QPair pair = i.next(); + m_request.gets[pair.first] = pair.second; } - return {ParseStatus::OK, m_request, (headerLength + contentLength)}; + return true; + } + + qWarning() << Q_FUNC_INFO << "invalid http header:" << line; + return false; +} + +bool RequestParser::parseHeaderLine(const QString &line, QPair& out) +{ + int i = line.indexOf(QLatin1Char(':')); + if (i == -1) { + qWarning() << Q_FUNC_INFO << "invalid http header:" << line; + return false; } - qWarning() << Q_FUNC_INFO << "unsupported request method: " << m_request.method; - return {ParseStatus::BadRequest, Request(), 0}; // TODO: SHOULD respond "501 Not Implemented" + out = qMakePair(line.left(i).trimmed().toLower(), line.mid(i + 1).trimmed()); + return true; } -bool RequestParser::parseStartLines(const QString &data) +bool RequestParser::parseHttpHeader(const QByteArray &data) { - // we don't handle malformed request which uses `LF` for newline - const QVector lines = data.splitRef(CRLF, QString::SkipEmptyParts); + QString str = QString::fromUtf8(data); + QStringList lines = str.trimmed().split(EOL); - // [rfc7230] 3.2.2. Field Order - QStringList requestLines; - for (const auto &line : lines) { - if (line.at(0).isSpace() && !requestLines.isEmpty()) { - // continuation of previous line - requestLines.last() += line.toString(); + QStringList headerLines; + foreach (const QString& line, lines) { + if (line[0].isSpace()) { // header line continuation + if (!headerLines.isEmpty()) { // really continuation + headerLines.last() += QLatin1Char(' '); + headerLines.last() += line.trimmed(); + } } else { - requestLines += line.toString(); + headerLines.append(line); } } - if (requestLines.isEmpty()) - return false; + if (headerLines.isEmpty()) + return false; // Empty header - if (!parseRequestLine(requestLines[0])) + QStringList::Iterator it = headerLines.begin(); + if (!parseStartingLine(*it)) return false; - for (auto i = ++(requestLines.begin()); i != requestLines.end(); ++i) { - if (!parseHeaderLine(*i, m_request.headers)) + ++it; + for (; it != headerLines.end(); ++it) { + QPair header; + if (!parseHeaderLine(*it, header)) return false; + + m_request.headers[header.first] = header.second; } return true; } -bool RequestParser::parseRequestLine(const QString &line) +QList RequestParser::splitMultipartData(const QByteArray& data, const QByteArray& boundary) { - // [rfc7230] 3.1.1. Request Line + QList ret; + QByteArray sep = boundary + EOL; + const int sepLength = sep.size(); - const QRegularExpression re(QLatin1String("^([A-Z]+)\\s+(\\S+)\\s+HTTP\\/(\\d\\.\\d)$")); - const QRegularExpressionMatch match = re.match(line); + int start = 0, end = 0; + if ((end = data.indexOf(sep, start)) >= 0) { + start = end + sepLength; // skip first boundary - if (!match.hasMatch()) { - qWarning() << Q_FUNC_INFO << "invalid http header:" << line; - return false; - } - - // Request Methods - m_request.method = match.captured(1); - - // Request Target - const QByteArray decodedUrl {QByteArray::fromPercentEncoding(match.captured(2).toLatin1())}; - const int sepPos = decodedUrl.indexOf('?'); - m_request.path = QString::fromUtf8(decodedUrl.constData(), (sepPos == -1 ? decodedUrl.size() : sepPos)); - if (sepPos >= 0) - m_request.query = decodedUrl.mid(sepPos + 1); + while ((end = data.indexOf(sep, start)) >= 0) { + ret << data.mid(start, end - EOL.length() - start); + start = end + sepLength; + } - // HTTP-version - m_request.version = match.captured(3); + // last or single part + sep = boundary + "--" + EOL; + if ((end = data.indexOf(sep, start)) >= 0) + ret << data.mid(start, end - EOL.length() - start); + } - return true; + return ret; } -bool RequestParser::parsePostMessage(const QByteArray &data) +bool RequestParser::parseContent(const QByteArray& data) { - // parse POST message-body - const QString contentType = m_request.headers[HEADER_CONTENT_TYPE]; - const QString contentTypeLower = contentType.toLower(); - - // application/x-www-form-urlencoded - if (contentTypeLower.startsWith(CONTENT_TYPE_FORM_ENCODED)) { - QListIterator i(QUrlQuery(data).queryItems(QUrl::FullyDecoded)); + // Parse message content + qDebug() << Q_FUNC_INFO << "Content-Length: " << m_request.headers["content-length"]; + qDebug() << Q_FUNC_INFO << "data.size(): " << data.size(); + + // Parse url-encoded POST data + if (m_request.headers["content-type"].startsWith("application/x-www-form-urlencoded")) { + QUrl url; +#ifndef QBT_USES_QT5 + url.setEncodedQuery(data); + QListIterator > i(url.queryItems()); +#else + url.setQuery(data); + QListIterator > i(QUrlQuery(url).queryItems(QUrl::FullyDecoded)); +#endif while (i.hasNext()) { - const QStringPair pair = i.next(); - m_request.posts[pair.first] = pair.second; + QPair pair = i.next(); + m_request.posts[pair.first.toLower()] = pair.second; } return true; } - // multipart/form-data - if (contentTypeLower.startsWith(CONTENT_TYPE_FORM_DATA)) { - // [rfc2046] 5.1.1. Common Syntax - - // find boundary delimiter - const QLatin1String boundaryFieldName("boundary="); - const int idx = contentType.indexOf(boundaryFieldName); - if (idx < 0) { - qWarning() << Q_FUNC_INFO << "Could not find boundary in multipart/form-data header!"; - return false; - } - - const QByteArray delimiter = Utils::String::unquote(contentType.midRef(idx + boundaryFieldName.size())).toLatin1(); - if (delimiter.isEmpty()) { - qWarning() << Q_FUNC_INFO << "boundary delimiter field empty!"; - return false; + // Parse multipart/form data (torrent file) + /** + data has the following format (if boundary is "cH2ae0GI3KM7GI3Ij5ae0ei4Ij5Ij5") + +--cH2ae0GI3KM7GI3Ij5ae0ei4Ij5Ij5 +Content-Disposition: form-data; name=\"Filename\" + +PB020344.torrent +--cH2ae0GI3KM7GI3Ij5ae0ei4Ij5Ij5 +Content-Disposition: form-data; name=\"torrentfile"; filename=\"PB020344.torrent\" +Content-Type: application/x-bittorrent + +BINARY DATA IS HERE +--cH2ae0GI3KM7GI3Ij5ae0ei4Ij5Ij5 +Content-Disposition: form-data; name=\"Upload\" + +Submit Query +--cH2ae0GI3KM7GI3Ij5ae0ei4Ij5Ij5-- +**/ + QString content_type = m_request.headers["content-type"]; + if (content_type.startsWith("multipart/form-data")) { + const QRegExp boundaryRegexQuoted("boundary=\"([ \\w'()+,-\\./:=\\?]+)\""); + const QRegExp boundaryRegexNotQuoted("boundary=([\\w'()+,-\\./:=\\?]+)"); + + QByteArray boundary; + if (boundaryRegexQuoted.indexIn(content_type) < 0) { + if (boundaryRegexNotQuoted.indexIn(content_type) < 0) { + qWarning() << "Could not find boundary in multipart/form-data header!"; + return false; + } + else { + boundary = "--" + boundaryRegexNotQuoted.cap(1).toLatin1(); + } } - - // split data by "dash-boundary" - const QByteArray dashDelimiter = QByteArray("--") + delimiter + CRLF; - QList multipart = splitToViews(data, dashDelimiter, QString::SkipEmptyParts); - if (multipart.isEmpty()) { - qWarning() << Q_FUNC_INFO << "multipart empty"; - return false; + else { + boundary = "--" + boundaryRegexQuoted.cap(1).toLatin1(); } - // remove the ending delimiter - const QByteArray endDelimiter = QByteArray("--") + delimiter + QByteArray("--") + CRLF; - multipart.push_back(viewWithoutEndingWith(multipart.takeLast(), endDelimiter)); + qDebug() << "Boundary is " << boundary; + QList parts = splitMultipartData(data, boundary); + qDebug() << parts.size() << "parts in data"; - for (const auto &part : multipart) { + foreach (const QByteArray& part, parts) { if (!parseFormData(part)) return false; } @@ -247,60 +285,71 @@ return true; } - qWarning() << Q_FUNC_INFO << "unknown content type:" << contentType; + qWarning() << Q_FUNC_INFO << "unknown content type:" << qPrintable(content_type); return false; } -bool RequestParser::parseFormData(const QByteArray &data) +bool RequestParser::parseFormData(const QByteArray& data) { - const QList list = splitToViews(data, EOH, QString::KeepEmptyParts); + // Parse form data header + const int header_end = data.indexOf(EOH); + if (header_end < 0) { + qDebug() << "Invalid form data: \n" << data; + return false; + } + + QString header_str = QString::fromUtf8(data.left(header_end)); + QStringList lines = header_str.trimmed().split(EOL); + QStringMap headers; + foreach (const QString& line, lines) { + QPair header; + if (!parseHeaderLine(line, header)) + return false; - if (list.size() != 2) { - qWarning() << Q_FUNC_INFO << "multipart/form-data format error"; + headers[header.first] = header.second; + } + + QStringMap disposition; + if (!headers.contains("content-disposition") + || !parseHeaderValue(headers["content-disposition"], disposition) + || !disposition.contains("name")) { + qDebug() << "Invalid form data header: \n" << header_str; return false; } - const QString headers = QString::fromLatin1(list[0]); - const QByteArray payload = viewWithoutEndingWith(list[1], CRLF); + if (disposition.contains("filename")) { + UploadedFile ufile; + ufile.filename = disposition["filename"]; + ufile.type = disposition["content-type"]; + ufile.data = data.mid(header_end + EOH.length()); - QStringMap headersMap; - const QVector headerLines = headers.splitRef(CRLF, QString::SkipEmptyParts); - for (const auto &line : headerLines) { - if (line.trimmed().startsWith(HEADER_CONTENT_DISPOSITION, Qt::CaseInsensitive)) { - // extract out filename & name - const QVector directives = line.split(';', QString::SkipEmptyParts); - - for (const auto &directive : directives) { - const int idx = directive.indexOf('='); - if (idx < 0) - continue; - - const QString name = directive.left(idx).trimmed().toString().toLower(); - const QString value = Utils::String::unquote(directive.mid(idx + 1).trimmed()).toString(); - headersMap[name] = value; - } - } - else { - if (!parseHeaderLine(line.toString(), headersMap)) - return false; - } + m_request.files.append(ufile); + } + else { + m_request.posts[disposition["name"]] = QString::fromUtf8(data.mid(header_end + EOH.length())); } - // pick data - const QLatin1String filename("filename"); - const QLatin1String name("name"); + return true; +} - if (headersMap.contains(filename)) { - m_request.files.append({headersMap[filename], headersMap[HEADER_CONTENT_TYPE], payload}); +bool RequestParser::parseHeaderValue(const QString& value, QStringMap& out) +{ + int pos = value.indexOf(QLatin1Char(';')); + if (pos == -1) { + out[""] = value.trimmed(); + return true; } - else if (headersMap.contains(name)) { - m_request.posts[headersMap[name]] = payload; + + out[""] = value.left(pos).trimmed(); + + QRegExp rx(";\\s*([^=;\"]+)\\s*=\\s*(\"[^\"]*\"|[^\";\\s]+)\\s*"); + while (rx.indexIn(value, pos) == pos) { + out[rx.cap(1).trimmed()] = unquoted(rx.cap(2)); + pos += rx.cap(0).length(); } - else { - // malformed - qWarning() << Q_FUNC_INFO << "multipart/form-data header error"; + + if (pos != value.length()) return false; - } return true; } diff -Nru qbittorrent-4.1.3/src/base/http/requestparser.h qbittorrent-3.3.15/src/base/http/requestparser.h --- qbittorrent-4.1.3/src/base/http/requestparser.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/http/requestparser.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,8 +1,7 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2018 Mike Tzou (Chocobo1) * Copyright (C) 2014 Vladimir Golovnev - * Copyright (C) 2006 Ishan Arora and Christophe Dumez + * Copyright (C) 2006 Ishan Arora and Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -26,6 +25,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef HTTP_REQUESTPARSER_H @@ -38,35 +39,32 @@ class RequestParser { public: - enum class ParseStatus + enum ErrorCode { - OK, - Incomplete, + NoError = 0, + IncompleteRequest, BadRequest }; - struct ParseResult - { - // when `status != ParseStatus::OK`, `request` & `frameSize` are undefined - ParseStatus status; - Request request; - long frameSize; // http request frame size (bytes) - }; - - static ParseResult parse(const QByteArray &data); - - static const long MAX_CONTENT_SIZE = 64 * 1024 * 1024; // 64 MB + // when result != NoError parsed request is undefined + // Warning! Header names are converted to lower-case. + static ErrorCode parse(const QByteArray &data, Request &request, uint maxContentLength = 10000000 /* ~10MB */); private: - RequestParser(); + RequestParser(uint maxContentLength); - ParseResult doParse(const QByteArray &data); - bool parseStartLines(const QString &data); - bool parseRequestLine(const QString &line); + ErrorCode parseHttpRequest(const QByteArray &data, Request &request); - bool parsePostMessage(const QByteArray &data); + bool parseHttpHeader(const QByteArray &data); + bool parseStartingLine(const QString &line); + bool parseContent(const QByteArray &data); bool parseFormData(const QByteArray &data); + QList splitMultipartData(const QByteArray &data, const QByteArray &boundary); + + static bool parseHeaderLine(const QString &line, QPair &out); + static bool parseHeaderValue(const QString &value, QStringMap &out); + const uint m_maxContentLength; Request m_request; }; } diff -Nru qbittorrent-4.1.3/src/base/http/responsebuilder.cpp qbittorrent-3.3.15/src/base/http/responsebuilder.cpp --- qbittorrent-4.1.3/src/base/http/responsebuilder.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/http/responsebuilder.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -30,6 +30,11 @@ using namespace Http; +ResponseBuilder::ResponseBuilder(QObject *parent) + : QObject(parent) +{ +} + void ResponseBuilder::status(uint code, const QString &text) { m_response.status = ResponseStatus(code, text); diff -Nru qbittorrent-4.1.3/src/base/http/responsebuilder.h qbittorrent-3.3.15/src/base/http/responsebuilder.h --- qbittorrent-4.1.3/src/base/http/responsebuilder.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/http/responsebuilder.h 2017-08-03 20:30:10.000000000 +0000 @@ -29,13 +29,17 @@ #ifndef HTTP_RESPONSEBUILDER_H #define HTTP_RESPONSEBUILDER_H +#include #include "types.h" namespace Http { - class ResponseBuilder + class ResponseBuilder : public QObject { public: + explicit ResponseBuilder(QObject *parent = 0); + + protected: void status(uint code = 200, const QString &text = QLatin1String("OK")); void header(const QString &name, const QString &value); void print(const QString &text, const QString &type = CONTENT_TYPE_HTML); diff -Nru qbittorrent-4.1.3/src/base/http/responsegenerator.cpp qbittorrent-3.3.15/src/base/http/responsegenerator.cpp --- qbittorrent-4.1.3/src/base/http/responsegenerator.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/http/responsegenerator.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,7 +1,7 @@ /* * Bittorrent Client using Qt and libtorrent. * Copyright (C) 2014 Vladimir Golovnev - * Copyright (C) 2006 Ishan Arora and Christophe Dumez + * Copyright (C) 2006 Ishan Arora and Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -25,11 +25,16 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #include "responsegenerator.h" #include +#ifndef QBT_USES_QT5 +#include +#endif #include "base/utils/gzip.h" @@ -67,7 +72,7 @@ QString Http::httpDate() { // [RFC 7231] 7.1.1.1. Date/Time Formats - // example: "Sun, 06 Nov 1994 08:49:37 GMT" + // example: "Sun, 06 Nov 1994 08:49:37 GMT" return QLocale::c().toString(QDateTime::currentDateTimeUtc(), QLatin1String("ddd, dd MMM yyyy HH:mm:ss")) .append(QLatin1String(" GMT")); diff -Nru qbittorrent-4.1.3/src/base/http/responsegenerator.h qbittorrent-3.3.15/src/base/http/responsegenerator.h --- qbittorrent-4.1.3/src/base/http/responsegenerator.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/http/responsegenerator.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,7 +1,7 @@ /* * Bittorrent Client using Qt and libtorrent. * Copyright (C) 2014 Vladimir Golovnev - * Copyright (C) 2006 Ishan Arora and Christophe Dumez + * Copyright (C) 2006 Ishan Arora and Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -25,6 +25,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ diff -Nru qbittorrent-4.1.3/src/base/http/server.cpp qbittorrent-3.3.15/src/base/http/server.cpp --- qbittorrent-4.1.3/src/base/http/server.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/http/server.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -34,6 +34,7 @@ #include #include #include + #ifndef QT_NO_OPENSSL #include #else @@ -61,7 +62,7 @@ #endif QTimer *dropConnectionTimer = new QTimer(this); - connect(dropConnectionTimer, &QTimer::timeout, this, &Server::dropTimedOutConnection); + connect(dropConnectionTimer, SIGNAL(timeout()), SLOT(dropTimedOutConnection())); dropConnectionTimer->start(CONNECTIONS_SCAN_INTERVAL * 1000); } @@ -69,7 +70,11 @@ { } +#ifdef QBT_USES_QT5 void Server::incomingConnection(qintptr socketDescriptor) +#else +void Server::incomingConnection(int socketDescriptor) +#endif { if (m_connections.size() >= CONNECTIONS_LIMIT) return; @@ -90,7 +95,11 @@ if (m_https) { static_cast(serverSocket)->setProtocol(QSsl::SecureProtocols); static_cast(serverSocket)->setPrivateKey(m_key); +#ifdef QBT_USES_QT5 static_cast(serverSocket)->setLocalCertificateChain(m_certificates); +#else + static_cast(serverSocket)->setLocalCertificate(m_certificates.first()); +#endif static_cast(serverSocket)->setPeerVerifyMode(QSslSocket::VerifyNone); static_cast(serverSocket)->startServerEncryption(); } @@ -117,18 +126,27 @@ { QSslKey sslKey(key, QSsl::Rsa); if (sslKey.isNull()) +#if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0) sslKey = QSslKey(key, QSsl::Ec); +#else + { + disableHttps(); + return false; + } +#endif const QList certs = QSslCertificate::fromData(certificates); const bool areCertsValid = !certs.empty() && std::all_of(certs.begin(), certs.end(), [](const QSslCertificate &c) { return !c.isNull(); }); - if (!sslKey.isNull() && areCertsValid) { + if (!sslKey.isNull() && areCertsValid) + { m_key = sslKey; m_certificates = certs; m_https = true; return true; } - else { + else + { disableHttps(); return false; } @@ -161,4 +179,4 @@ return safeCiphers; } -#endif // QT_NO_OPENSSL +#endif diff -Nru qbittorrent-4.1.3/src/base/http/server.h qbittorrent-3.3.15/src/base/http/server.h --- qbittorrent-4.1.3/src/base/http/server.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/http/server.h 2017-08-03 20:30:10.000000000 +0000 @@ -25,6 +25,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ @@ -44,13 +46,13 @@ class IRequestHandler; class Connection; - class Server : public QTcpServer + class Server: public QTcpServer { Q_OBJECT Q_DISABLE_COPY(Server) public: - Server(IRequestHandler *requestHandler, QObject *parent = nullptr); + Server(IRequestHandler *requestHandler, QObject *parent = 0); ~Server(); #ifndef QT_NO_OPENSSL @@ -62,10 +64,14 @@ void dropTimedOutConnection(); private: +#ifdef QBT_USES_QT5 void incomingConnection(qintptr socketDescriptor); +#else + void incomingConnection(int socketDescriptor); +#endif IRequestHandler *m_requestHandler; - QList m_connections; // for tracking persistent connections + QList m_connections; // for tracking persistence connections #ifndef QT_NO_OPENSSL QList safeCipherList() const; diff -Nru qbittorrent-4.1.3/src/base/http/types.h qbittorrent-3.3.15/src/base/http/types.h --- qbittorrent-4.1.3/src/base/http/types.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/http/types.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,5 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2018 Mike Tzou (Chocobo1) * Copyright (C) 2014 Vladimir Golovnev * * This program is free software; you can redistribute it and/or @@ -38,12 +37,7 @@ namespace Http { - const char METHOD_GET[] = "GET"; - const char METHOD_POST[] = "POST"; - const char HEADER_CACHE_CONTROL[] = "cache-control"; - const char HEADER_CONNECTION[] = "connection"; - const char HEADER_CONTENT_DISPOSITION[] = "content-disposition"; const char HEADER_CONTENT_ENCODING[] = "content-encoding"; const char HEADER_CONTENT_LENGTH[] = "content-length"; const char HEADER_CONTENT_SECURITY_POLICY[] = "content-security-policy"; @@ -58,21 +52,15 @@ const char HEADER_X_FRAME_OPTIONS[] = "x-frame-options"; const char HEADER_X_XSS_PROTECTION[] = "x-xss-protection"; - const char HEADER_REQUEST_METHOD_GET[] = "GET"; - const char HEADER_REQUEST_METHOD_HEAD[] = "HEAD"; - const char HEADER_REQUEST_METHOD_POST[] = "POST"; - - const char CONTENT_TYPE_HTML[] = "text/html"; - const char CONTENT_TYPE_CSS[] = "text/css"; - const char CONTENT_TYPE_TXT[] = "text/plain"; - const char CONTENT_TYPE_JS[] = "application/javascript"; - const char CONTENT_TYPE_JSON[] = "application/json"; + const char CONTENT_TYPE_CSS[] = "text/css; charset=UTF-8"; const char CONTENT_TYPE_GIF[] = "image/gif"; + const char CONTENT_TYPE_HTML[] = "text/html; charset=UTF-8"; + const char CONTENT_TYPE_JS[] = "application/javascript; charset=UTF-8"; + const char CONTENT_TYPE_JSON[] = "application/json"; const char CONTENT_TYPE_PNG[] = "image/png"; - const char CONTENT_TYPE_FORM_ENCODED[] = "application/x-www-form-urlencoded"; - const char CONTENT_TYPE_FORM_DATA[] = "multipart/form-data"; + const char CONTENT_TYPE_TXT[] = "text/plain; charset=UTF-8"; - // portability: "\r\n" doesn't guarantee mapping to the correct symbol + // portability: "\r\n" doesn't guarantee mapping to the correct value const char CRLF[] = {0x0D, 0x0A, '\0'}; struct Environment @@ -86,18 +74,17 @@ struct UploadedFile { - QString filename; - QString type; // MIME type - QByteArray data; + QString filename; // original filename + QString type; // MIME type + QByteArray data; // File data }; struct Request { - QString version; QString method; QString path; - QByteArray query; QStringMap headers; + QStringMap gets; QStringMap posts; QVector files; }; diff -Nru qbittorrent-4.1.3/src/base/iconprovider.cpp qbittorrent-3.3.15/src/base/iconprovider.cpp --- qbittorrent-4.1.3/src/base/iconprovider.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/iconprovider.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -27,10 +27,9 @@ * exception statement from your version. */ +#include #include "iconprovider.h" -#include - IconProvider::IconProvider(QObject *parent) : QObject(parent) { @@ -48,7 +47,7 @@ { if (m_instance) { delete m_instance; - m_instance = nullptr; + m_instance = 0; } } @@ -57,15 +56,9 @@ return m_instance; } -QString IconProvider::getIconPath(const QString &iconId) const +QString IconProvider::getIconPath(const QString &iconId) { - // there are a few icons not available in svg - const QString pathSvg = ":/icons/qbt-theme/" + iconId + ".svg"; - if (QFileInfo::exists(pathSvg)) - return pathSvg; - - const QString pathPng = ":/icons/qbt-theme/" + iconId + ".png"; - return pathPng; + return ":/icons/oxygen/" + iconId + ".png"; } -IconProvider *IconProvider::m_instance = nullptr; +IconProvider *IconProvider::m_instance = 0; diff -Nru qbittorrent-4.1.3/src/base/iconprovider.h qbittorrent-3.3.15/src/base/iconprovider.h --- qbittorrent-4.1.3/src/base/iconprovider.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/iconprovider.h 2017-08-03 20:30:10.000000000 +0000 @@ -31,7 +31,8 @@ #define ICONPROVIDER_H #include -#include + +class QString; class IconProvider : public QObject { @@ -42,10 +43,10 @@ static void freeInstance(); static IconProvider *instance(); - virtual QString getIconPath(const QString &iconId) const; + virtual QString getIconPath(const QString &iconId); protected: - explicit IconProvider(QObject *parent = nullptr); + explicit IconProvider(QObject *parent = 0); ~IconProvider(); static IconProvider *m_instance; diff -Nru qbittorrent-4.1.3/src/base/indexrange.h qbittorrent-3.3.15/src/base/indexrange.h --- qbittorrent-4.1.3/src/base/indexrange.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/indexrange.h 2017-08-03 20:30:10.000000000 +0000 @@ -38,30 +38,30 @@ public: using IndexType = Index; - IndexInterval(IndexType first, IndexType last) // add constexpr when using C++14 + IndexInterval(IndexType first, IndexType last) : m_first {first} , m_last {last} { Q_ASSERT(first <= last); } - constexpr IndexType first() const + IndexType first() const { return m_first; } - constexpr IndexType last() const + IndexType last() const { return m_last; } private: - const IndexType m_first; - const IndexType m_last; + IndexType m_first; + IndexType m_last; }; template -constexpr IndexInterval makeInterval(T first, T last) +inline IndexInterval makeInterval(T first, T last) { return {first, last}; } @@ -99,7 +99,7 @@ constexpr IndexType end() const { - return (m_first + m_size); + return m_first + m_size; } constexpr IndexDiffType size() const @@ -114,12 +114,12 @@ constexpr IndexType last() const { - return (m_first + m_size - 1); + return m_first + m_size - 1; } constexpr bool isEmpty() const { - return (m_size == 0); + return m_size == 0; } private: diff -Nru qbittorrent-4.1.3/src/base/logger.cpp qbittorrent-3.3.15/src/base/logger.cpp --- qbittorrent-4.1.3/src/base/logger.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/logger.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -3,12 +3,12 @@ #include #include "base/utils/string.h" -Logger *Logger::m_instance = nullptr; +Logger* Logger::m_instance = 0; Logger::Logger() - : m_lock(QReadWriteLock::Recursive) - , m_msgCounter(0) - , m_peerCounter(0) + : lock(QReadWriteLock::Recursive) + , msgCounter(0) + , peerCounter(0) { } @@ -29,15 +29,15 @@ { if (m_instance) { delete m_instance; - m_instance = nullptr; + m_instance = 0; } } void Logger::addMessage(const QString &message, const Log::MsgType &type) { - QWriteLocker locker(&m_lock); + QWriteLocker locker(&lock); - Log::Msg temp = {m_msgCounter++, QDateTime::currentMSecsSinceEpoch(), type, message.toHtmlEscaped()}; + Log::Msg temp = { msgCounter++, QDateTime::currentMSecsSinceEpoch(), type, Utils::String::toHtmlEscaped(message) }; m_messages.push_back(temp); if (m_messages.size() >= MAX_LOG_MESSAGES) @@ -48,9 +48,9 @@ void Logger::addPeer(const QString &ip, bool blocked, const QString &reason) { - QWriteLocker locker(&m_lock); + QWriteLocker locker(&lock); - Log::Peer temp = {m_peerCounter++, QDateTime::currentMSecsSinceEpoch(), ip.toHtmlEscaped(), blocked, reason.toHtmlEscaped()}; + Log::Peer temp = { peerCounter++, QDateTime::currentMSecsSinceEpoch(), Utils::String::toHtmlEscaped(ip), blocked, Utils::String::toHtmlEscaped(reason) }; m_peers.push_back(temp); if (m_peers.size() >= MAX_LOG_MESSAGES) @@ -61,9 +61,9 @@ QVector Logger::getMessages(int lastKnownId) const { - QReadLocker locker(&m_lock); + QReadLocker locker(&lock); - int diff = m_msgCounter - lastKnownId - 1; + int diff = msgCounter - lastKnownId - 1; int size = m_messages.size(); if ((lastKnownId == -1) || (diff >= size)) @@ -77,9 +77,9 @@ QVector Logger::getPeers(int lastKnownId) const { - QReadLocker locker(&m_lock); + QReadLocker locker(&lock); - int diff = m_peerCounter - lastKnownId - 1; + int diff = peerCounter - lastKnownId - 1; int size = m_peers.size(); if ((lastKnownId == -1) || (diff >= size)) @@ -90,8 +90,3 @@ return m_peers.mid(size - diff); } - -void LogMsg(const QString &message, const Log::MsgType &type) -{ - Logger::instance()->addMessage(message, type); -} diff -Nru qbittorrent-4.1.3/src/base/logger.h qbittorrent-3.3.15/src/base/logger.h --- qbittorrent-4.1.3/src/base/logger.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/logger.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,12 +1,12 @@ #ifndef LOGGER_H #define LOGGER_H -#include -#include #include #include +#include +#include -const int MAX_LOG_MESSAGES = 20000; +const int MAX_LOG_MESSAGES = 1000; namespace Log { @@ -16,7 +16,7 @@ NORMAL = 0x1, INFO = 0x2, WARNING = 0x4, - CRITICAL = 0x8 // ERROR is defined by libtorrent and results in compiler error + CRITICAL = 0x8 //ERROR is defined by libtorrent and results in compiler error }; Q_DECLARE_FLAGS(MsgTypes, MsgType) @@ -63,15 +63,12 @@ Logger(); ~Logger(); - static Logger *m_instance; + static Logger* m_instance; QVector m_messages; QVector m_peers; - mutable QReadWriteLock m_lock; - int m_msgCounter; - int m_peerCounter; + mutable QReadWriteLock lock; + int msgCounter; + int peerCounter; }; -// Helper function -void LogMsg(const QString &message, const Log::MsgType &type = Log::NORMAL); - #endif // LOGGER_H diff -Nru qbittorrent-4.1.3/src/base/net/dnsupdater.cpp qbittorrent-3.3.15/src/base/net/dnsupdater.cpp --- qbittorrent-4.1.3/src/base/net/dnsupdater.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/net/dnsupdater.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2011 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2011 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,17 +24,21 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#include "dnsupdater.h" - #include -#include +#include +#include +#ifdef QBT_USES_QT5 #include +#endif #include "base/logger.h" -#include "base/net/downloadhandler.h" #include "base/net/downloadmanager.h" +#include "base/net/downloadhandler.h" +#include "dnsupdater.h" using namespace Net; @@ -52,7 +56,7 @@ // Start IP checking timer m_ipCheckTimer.setInterval(IP_CHECK_INTERVAL_MS); - connect(&m_ipCheckTimer, &QTimer::timeout, this, &DNSUpdater::checkPublicIP); + connect(&m_ipCheckTimer, SIGNAL(timeout()), SLOT(checkPublicIP())); m_ipCheckTimer.start(); // Check lastUpdate to avoid flooding @@ -74,11 +78,11 @@ { Q_ASSERT(m_state == OK); - DownloadHandler *handler = DownloadManager::instance()->download( - DownloadRequest("http://checkip.dyndns.org").userAgent("qBittorrent/" QBT_VERSION_2)); - connect(handler, static_cast(&Net::DownloadHandler::downloadFinished) - , this, &DNSUpdater::ipRequestFinished); - connect(handler, &Net::DownloadHandler::downloadFailed, this, &DNSUpdater::ipRequestFailed); + DownloadHandler *handler = DownloadManager::instance()->downloadUrl( + "http://checkip.dyndns.org", false, 0, false, + "qBittorrent/" QBT_VERSION_2); + connect(handler, SIGNAL(downloadFinished(QString, QByteArray)), SLOT(ipRequestFinished(QString, QByteArray))); + connect(handler, SIGNAL(downloadFailed(QString, QString)), SLOT(ipRequestFailed(QString, QString))); m_lastIPCheckTime = QDateTime::currentDateTime(); } @@ -88,9 +92,9 @@ Q_UNUSED(url); // Parse response - const QRegularExpressionMatch ipRegexMatch = QRegularExpression("Current IP Address:\\s+([^<]+)").match(data); - if (ipRegexMatch.hasMatch()) { - QString ipStr = ipRegexMatch.captured(1); + QRegExp ipregex("Current IP Address:\\s+([^<]+)"); + if (ipregex.indexIn(data) >= 0) { + QString ipStr = ipregex.cap(1); qDebug() << Q_FUNC_INFO << "Regular expression captured the following IP:" << ipStr; QHostAddress newIp(ipStr); if (!newIp.isNull()) { @@ -121,11 +125,11 @@ qDebug() << Q_FUNC_INFO; m_lastIPCheckTime = QDateTime::currentDateTime(); - DownloadHandler *handler = DownloadManager::instance()->download( - DownloadRequest(getUpdateUrl()).userAgent("qBittorrent/" QBT_VERSION_2)); - connect(handler, static_cast(&Net::DownloadHandler::downloadFinished) - , this, &DNSUpdater::ipUpdateFinished); - connect(handler, &Net::DownloadHandler::downloadFailed, this, &DNSUpdater::ipUpdateFailed); + DownloadHandler *handler = DownloadManager::instance()->downloadUrl( + getUpdateUrl(), false, 0, false, + "qBittorrent/" QBT_VERSION_2); + connect(handler, SIGNAL(downloadFinished(QString, QByteArray)), SLOT(ipUpdateFinished(QString, QByteArray))); + connect(handler, SIGNAL(downloadFailed(QString, QString)), SLOT(ipUpdateFailed(QString, QString))); } QString DNSUpdater::getUpdateUrl() const @@ -141,7 +145,7 @@ Q_ASSERT(!m_lastIP.isNull()); // Service specific - switch (m_service) { + switch(m_service) { case DNS::DYNDNS: url.setHost("members.dyndns.org"); break; @@ -154,10 +158,15 @@ } url.setPath("/nic/update"); +#ifndef QBT_USES_QT5 + url.addQueryItem("hostname", m_domain); + url.addQueryItem("myip", m_lastIP.toString()); +#else QUrlQuery urlQuery(url); urlQuery.addQueryItem("hostname", m_domain); urlQuery.addQueryItem("myip", m_lastIP.toString()); url.setQuery(urlQuery); +#endif Q_ASSERT(url.isValid()); qDebug() << Q_FUNC_INFO << url.toString(); @@ -181,7 +190,7 @@ { Logger *const logger = Logger::instance(); qDebug() << Q_FUNC_INFO << reply; - QString code = reply.split(' ').first(); + QString code = reply.split(" ").first(); qDebug() << Q_FUNC_INFO << "Code:" << code; if ((code == "good") || (code == "nochg")) { @@ -196,7 +205,7 @@ return; } - // Everything below is an error, stop updating until the user updates something + // Everything bellow is an error, stop updating until the user updates something m_ipCheckTimer.stop(); m_lastIP.clear(); if (code == "nohost") { @@ -228,6 +237,7 @@ if (code == "abuse") { logger->addMessage(tr("Dynamic DNS error: Your username was blocked due to abuse."), Log::CRITICAL); m_state = FATAL; + return; } } @@ -244,8 +254,8 @@ } if (m_domain != pref->getDynDomainName()) { m_domain = pref->getDynDomainName(); - const QRegularExpressionMatch domainRegexMatch = QRegularExpression("^(?:(?!\\d|-)[a-zA-Z0-9\\-]{1,63}\\.)+[a-zA-Z]{2,}$").match(m_domain); - if (!domainRegexMatch.hasMatch()) { + QRegExp domain_regex("^(?:(?!\\d|-)[a-zA-Z0-9\\-]{1,63}\\.)+[a-zA-Z]{2,}$"); + if (domain_regex.indexIn(m_domain) < 0) { logger->addMessage(tr("Dynamic DNS error: supplied domain name is invalid."), Log::CRITICAL); m_lastIP.clear(); m_ipCheckTimer.stop(); @@ -286,7 +296,7 @@ QUrl DNSUpdater::getRegistrationUrl(int service) { - switch (service) { + switch(service) { case DNS::DYNDNS: return QUrl("https://www.dyndns.com/account/services/hosts/add.html"); case DNS::NOIP: diff -Nru qbittorrent-4.1.3/src/base/net/dnsupdater.h qbittorrent-3.3.15/src/base/net/dnsupdater.h --- qbittorrent-4.1.3/src/base/net/dnsupdater.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/net/dnsupdater.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2011 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2011 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,14 +24,16 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef DNSUPDATER_H #define DNSUPDATER_H -#include -#include #include +#include +#include #include #include "base/preferences.h" @@ -39,12 +41,12 @@ namespace Net { // Based on http://www.dyndns.com/developers/specs/ - class DNSUpdater : public QObject + class DNSUpdater: public QObject { Q_OBJECT public: - explicit DNSUpdater(QObject *parent = nullptr); + explicit DNSUpdater(QObject *parent = 0); ~DNSUpdater(); static QUrl getRegistrationUrl(int service); diff -Nru qbittorrent-4.1.3/src/base/net/downloadhandler.cpp qbittorrent-3.3.15/src/base/net/downloadhandler.cpp --- qbittorrent-4.1.3/src/base/net/downloadhandler.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/net/downloadhandler.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015, 2018 Vladimir Golovnev + * Copyright (C) 2015 Vladimir Golovnev * Copyright (C) 2006 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -27,81 +27,58 @@ * exception statement from your version. */ -#include "downloadhandler.h" - -#include -#include +#include #include -#include -#include #include -#include +#include +#include +#include #include +#include #include "base/utils/fs.h" #include "base/utils/gzip.h" #include "base/utils/misc.h" #include "downloadmanager.h" +#include "downloadhandler.h" -namespace -{ - bool saveToFile(const QByteArray &replyData, QString &filePath) - { - QTemporaryFile tmpfile {Utils::Fs::tempPath() + "XXXXXX"}; - tmpfile.setAutoRemove(false); - - if (!tmpfile.open()) - return false; - - filePath = tmpfile.fileName(); +static QString errorCodeToString(QNetworkReply::NetworkError status); - tmpfile.write(replyData); - return true; - } -} +using namespace Net; -Net::DownloadHandler::DownloadHandler(QNetworkReply *reply, DownloadManager *manager, const DownloadRequest &downloadRequest) +DownloadHandler::DownloadHandler(QNetworkReply *reply, DownloadManager *manager, bool saveToFile, qint64 limit, bool handleRedirectToMagnet) : QObject(manager) , m_reply(reply) , m_manager(manager) - , m_downloadRequest(downloadRequest) + , m_saveToFile(saveToFile) + , m_sizeLimit(limit) + , m_handleRedirectToMagnet(handleRedirectToMagnet) + , m_url(reply->url().toString()) { - if (reply) - assignNetworkReply(reply); + init(); } -Net::DownloadHandler::~DownloadHandler() +DownloadHandler::~DownloadHandler() { if (m_reply) delete m_reply; } -void Net::DownloadHandler::assignNetworkReply(QNetworkReply *reply) -{ - Q_ASSERT(reply); - - m_reply = reply; - m_reply->setParent(this); - if (m_downloadRequest.limit() > 0) - connect(m_reply, &QNetworkReply::downloadProgress, this, &Net::DownloadHandler::checkDownloadSize); - connect(m_reply, &QNetworkReply::finished, this, &Net::DownloadHandler::processFinishedDownload); -} - // Returns original url -QString Net::DownloadHandler::url() const +QString DownloadHandler::url() const { - return m_downloadRequest.url(); + return m_url; } -void Net::DownloadHandler::processFinishedDownload() +void DownloadHandler::processFinishedDownload() { QString url = m_reply->url().toString(); - qDebug("Download finished: %s", qUtf8Printable(url)); + qDebug("Download finished: %s", qPrintable(url)); // Check if the request was successful if (m_reply->error() != QNetworkReply::NoError) { // Failure - qDebug("Download failure (%s), reason: %s", qUtf8Printable(url), qUtf8Printable(errorCodeToString(m_reply->error()))); - emit downloadFailed(m_downloadRequest.url(), errorCodeToString(m_reply->error())); + qDebug("Download failure (%s), reason: %s", qPrintable(url), qPrintable(errorCodeToString(m_reply->error()))); + emit downloadFailed(m_url, errorCodeToString(m_reply->error())); this->deleteLater(); } else { @@ -119,15 +96,15 @@ replyData = Utils::Gzip::decompress(replyData); } - if (m_downloadRequest.saveToFile()) { + if (m_saveToFile) { QString filePath; if (saveToFile(replyData, filePath)) - emit downloadFinished(m_downloadRequest.url(), filePath); + emit downloadFinished(m_url, filePath); else - emit downloadFailed(m_downloadRequest.url(), tr("I/O Error")); - } + emit downloadFailed(m_url, tr("I/O Error")); + } else { - emit downloadFinished(m_downloadRequest.url(), replyData); + emit downloadFinished(m_url, replyData); } this->deleteLater(); @@ -135,116 +112,137 @@ } } -void Net::DownloadHandler::checkDownloadSize(qint64 bytesReceived, qint64 bytesTotal) +void DownloadHandler::checkDownloadSize(qint64 bytesReceived, qint64 bytesTotal) { QString msg = tr("The file size is %1. It exceeds the download limit of %2."); if (bytesTotal > 0) { // Total number of bytes is available - if (bytesTotal > m_downloadRequest.limit()) { + if (bytesTotal > m_sizeLimit) { m_reply->abort(); - emit downloadFailed(m_downloadRequest.url(), msg.arg(Utils::Misc::friendlyUnit(bytesTotal), Utils::Misc::friendlyUnit(m_downloadRequest.limit()))); + emit downloadFailed(m_url, msg.arg(Utils::Misc::friendlyUnit(bytesTotal)).arg(Utils::Misc::friendlyUnit(m_sizeLimit))); } else { - disconnect(m_reply, &QNetworkReply::downloadProgress, this, &Net::DownloadHandler::checkDownloadSize); + disconnect(m_reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(checkDownloadSize(qint64, qint64))); } } - else if (bytesReceived > m_downloadRequest.limit()) { + else if (bytesReceived > m_sizeLimit) { m_reply->abort(); - emit downloadFailed(m_downloadRequest.url(), msg.arg(Utils::Misc::friendlyUnit(bytesReceived), Utils::Misc::friendlyUnit(m_downloadRequest.limit()))); + emit downloadFailed(m_url, msg.arg(Utils::Misc::friendlyUnit(bytesReceived)).arg(Utils::Misc::friendlyUnit(m_sizeLimit))); + } +} + +void DownloadHandler::init() +{ + m_reply->setParent(this); + if (m_sizeLimit > 0) + connect(m_reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(checkDownloadSize(qint64, qint64))); + connect(m_reply, SIGNAL(finished()), this, SLOT(processFinishedDownload())); +} + +bool DownloadHandler::saveToFile(const QByteArray &replyData, QString &filePath) +{ + QTemporaryFile *tmpfile = new QTemporaryFile(Utils::Fs::tempPath() + "XXXXXX"); + if (!tmpfile->open()) { + delete tmpfile; + return false; + } + + tmpfile->setAutoRemove(false); + filePath = tmpfile->fileName(); + qDebug("Temporary filename is: %s", qPrintable(filePath)); + if (m_reply->isOpen() || m_reply->open(QIODevice::ReadOnly)) { + tmpfile->write(replyData); + tmpfile->close(); + // XXX: tmpfile needs to be deleted on Windows before using the file + // or it will complain that the file is used by another process. + delete tmpfile; + return true; + } + else { + delete tmpfile; + Utils::Fs::forceRemove(filePath); } + + return false; } -void Net::DownloadHandler::handleRedirection(QUrl newUrl) +void DownloadHandler::handleRedirection(QUrl newUrl) { // Resolve relative urls if (newUrl.isRelative()) newUrl = m_reply->url().resolved(newUrl); const QString newUrlString = newUrl.toString(); - qDebug("Redirecting from %s to %s...", qUtf8Printable(m_reply->url().toString()), qUtf8Printable(newUrlString)); + qDebug("Redirecting from %s to %s", qPrintable(m_reply->url().toString()), qPrintable(newUrlString)); // Redirect to magnet workaround if (newUrlString.startsWith("magnet:", Qt::CaseInsensitive)) { qDebug("Magnet redirect detected."); m_reply->abort(); - if (m_downloadRequest.handleRedirectToMagnet()) - emit redirectedToMagnet(m_downloadRequest.url(), newUrlString); + if (m_handleRedirectToMagnet) + emit redirectedToMagnet(m_url, newUrlString); else - emit downloadFailed(m_downloadRequest.url(), tr("Unexpected redirect to magnet URI.")); + emit downloadFailed(m_url, tr("Unexpected redirect to magnet URI.")); this->deleteLater(); } else { - DownloadHandler *redirected = m_manager->download(DownloadRequest(m_downloadRequest).url(newUrlString)); - connect(redirected, &DownloadHandler::destroyed, this, &DownloadHandler::deleteLater); - connect(redirected, &DownloadHandler::downloadFailed, this, [this](const QString &, const QString &reason) - { - emit downloadFailed(url(), reason); - }); - connect(redirected, &DownloadHandler::redirectedToMagnet, this, [this](const QString &, const QString &magnetUri) - { - emit redirectedToMagnet(url(), magnetUri); - }); - connect(redirected, static_cast(&DownloadHandler::downloadFinished) - , this, [this](const QString &, const QString &fileName) - { - emit downloadFinished(url(), fileName); - }); - connect(redirected, static_cast(&DownloadHandler::downloadFinished) - , this, [this](const QString &, const QByteArray &data) - { - emit downloadFinished(url(), data); - }); + DownloadHandler *tmp = m_manager->downloadUrl(newUrlString, m_saveToFile, m_sizeLimit, m_handleRedirectToMagnet); + m_reply->deleteLater(); + m_reply = tmp->m_reply; + init(); + tmp->m_reply = 0; + delete tmp; } } -QString Net::DownloadHandler::errorCodeToString(const QNetworkReply::NetworkError status) +QString errorCodeToString(QNetworkReply::NetworkError status) { - switch (status) { + switch(status) { case QNetworkReply::HostNotFoundError: - return tr("The remote host name was not found (invalid hostname)"); + return QObject::tr("The remote host name was not found (invalid hostname)"); case QNetworkReply::OperationCanceledError: - return tr("The operation was canceled"); + return QObject::tr("The operation was canceled"); case QNetworkReply::RemoteHostClosedError: - return tr("The remote server closed the connection prematurely, before the entire reply was received and processed"); + return QObject::tr("The remote server closed the connection prematurely, before the entire reply was received and processed"); case QNetworkReply::TimeoutError: - return tr("The connection to the remote server timed out"); + return QObject::tr("The connection to the remote server timed out"); case QNetworkReply::SslHandshakeFailedError: - return tr("SSL/TLS handshake failed"); + return QObject::tr("SSL/TLS handshake failed"); case QNetworkReply::ConnectionRefusedError: - return tr("The remote server refused the connection"); + return QObject::tr("The remote server refused the connection"); case QNetworkReply::ProxyConnectionRefusedError: - return tr("The connection to the proxy server was refused"); + return QObject::tr("The connection to the proxy server was refused"); case QNetworkReply::ProxyConnectionClosedError: - return tr("The proxy server closed the connection prematurely"); + return QObject::tr("The proxy server closed the connection prematurely"); case QNetworkReply::ProxyNotFoundError: - return tr("The proxy host name was not found"); + return QObject::tr("The proxy host name was not found"); case QNetworkReply::ProxyTimeoutError: - return tr("The connection to the proxy timed out or the proxy did not reply in time to the request sent"); + return QObject::tr("The connection to the proxy timed out or the proxy did not reply in time to the request sent"); case QNetworkReply::ProxyAuthenticationRequiredError: - return tr("The proxy requires authentication in order to honor the request but did not accept any credentials offered"); + return QObject::tr("The proxy requires authentication in order to honor the request but did not accept any credentials offered"); case QNetworkReply::ContentAccessDenied: - return tr("The access to the remote content was denied (401)"); + return QObject::tr("The access to the remote content was denied (401)"); case QNetworkReply::ContentOperationNotPermittedError: - return tr("The operation requested on the remote content is not permitted"); + return QObject::tr("The operation requested on the remote content is not permitted"); case QNetworkReply::ContentNotFoundError: - return tr("The remote content was not found at the server (404)"); + return QObject::tr("The remote content was not found at the server (404)"); case QNetworkReply::AuthenticationRequiredError: - return tr("The remote server requires authentication to serve the content but the credentials provided were not accepted"); + return QObject::tr("The remote server requires authentication to serve the content but the credentials provided were not accepted"); case QNetworkReply::ProtocolUnknownError: - return tr("The Network Access API cannot honor the request because the protocol is not known"); + return QObject::tr("The Network Access API cannot honor the request because the protocol is not known"); case QNetworkReply::ProtocolInvalidOperationError: - return tr("The requested operation is invalid for this protocol"); + return QObject::tr("The requested operation is invalid for this protocol"); case QNetworkReply::UnknownNetworkError: - return tr("An unknown network-related error was detected"); + return QObject::tr("An unknown network-related error was detected"); case QNetworkReply::UnknownProxyError: - return tr("An unknown proxy-related error was detected"); + return QObject::tr("An unknown proxy-related error was detected"); case QNetworkReply::UnknownContentError: - return tr("An unknown error related to the remote content was detected"); + return QObject::tr("An unknown error related to the remote content was detected"); case QNetworkReply::ProtocolFailure: - return tr("A breakdown in protocol was detected"); + return QObject::tr("A breakdown in protocol was detected"); default: - return tr("Unknown error"); + return QObject::tr("Unknown error"); } } diff -Nru qbittorrent-4.1.3/src/base/net/downloadhandler.h qbittorrent-3.3.15/src/base/net/downloadhandler.h --- qbittorrent-4.1.3/src/base/net/downloadhandler.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/net/downloadhandler.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015, 2018 Vladimir Golovnev + * Copyright (C) 2015 Vladimir Golovnev * Copyright (C) 2006 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -30,12 +30,13 @@ #ifndef NET_DOWNLOADHANDLER_H #define NET_DOWNLOADHANDLER_H -#include #include -#include "downloadmanager.h" - +QT_BEGIN_NAMESPACE +class QNetworkAccessManager; +class QNetworkReply; class QUrl; +QT_END_NAMESPACE namespace Net { @@ -44,14 +45,10 @@ class DownloadHandler : public QObject { Q_OBJECT - Q_DISABLE_COPY(DownloadHandler) - - friend class DownloadManager; - - DownloadHandler(QNetworkReply *reply, DownloadManager *manager, const DownloadRequest &downloadRequest); public: - ~DownloadHandler() override; + DownloadHandler(QNetworkReply *reply, DownloadManager *manager, bool saveToFile = false, qint64 limit = 0, bool handleRedirectToMagnet = false); + ~DownloadHandler(); QString url() const; @@ -66,14 +63,16 @@ void checkDownloadSize(qint64 bytesReceived, qint64 bytesTotal); private: - void assignNetworkReply(QNetworkReply *reply); + void init(); + bool saveToFile(const QByteArray &replyData, QString &filePath); void handleRedirection(QUrl newUrl); - static QString errorCodeToString(QNetworkReply::NetworkError status); - QNetworkReply *m_reply; DownloadManager *m_manager; - const DownloadRequest m_downloadRequest; + bool m_saveToFile; + qint64 m_sizeLimit; + bool m_handleRedirectToMagnet; + QString m_url; }; } diff -Nru qbittorrent-4.1.3/src/base/net/downloadmanager.cpp qbittorrent-3.3.15/src/base/net/downloadmanager.cpp --- qbittorrent-4.1.3/src/base/net/downloadmanager.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/net/downloadmanager.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015, 2018 Vladimir Golovnev + * Copyright (C) 2015 Vladimir Golovnev * Copyright (C) 2006 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -48,10 +48,10 @@ namespace { - class NetworkCookieJar : public QNetworkCookieJar + class NetworkCookieJar: public QNetworkCookieJar { public: - explicit NetworkCookieJar(QObject *parent = nullptr) + explicit NetworkCookieJar(QObject *parent = 0) : QNetworkCookieJar(parent) { QDateTime now = QDateTime::currentDateTime(); @@ -64,7 +64,7 @@ setAllCookies(cookies); } - ~NetworkCookieJar() override + ~NetworkCookieJar() { QDateTime now = QDateTime::currentDateTime(); QList cookies = allCookies(); @@ -79,6 +79,26 @@ using QNetworkCookieJar::allCookies; using QNetworkCookieJar::setAllCookies; +#ifndef QBT_USES_QT5 + virtual bool deleteCookie(const QNetworkCookie &cookie) + { + auto myCookies = allCookies(); + + QList::Iterator it; + for (it = myCookies.begin(); it != myCookies.end(); ++it) { + if ((it->name() == cookie.name()) + && (it->domain() == cookie.domain()) + && (it->path() == cookie.path())) { + myCookies.erase(it); + setAllCookies(myCookies); + return true; + } + } + + return false; + } +#endif + QList cookiesForUrl(const QUrl &url) const override { QDateTime now = QDateTime::currentDateTime(); @@ -103,113 +123,91 @@ return QNetworkCookieJar::setCookiesFromUrl(cookies, url); } }; - - QNetworkRequest createNetworkRequest(const Net::DownloadRequest &downloadRequest) - { - QNetworkRequest request {downloadRequest.url()}; - - if (downloadRequest.userAgent().isEmpty()) - request.setRawHeader("User-Agent", DEFAULT_USER_AGENT); - else - request.setRawHeader("User-Agent", downloadRequest.userAgent().toUtf8()); - - // Spoof HTTP Referer to allow adding torrent link from Torcache/KickAssTorrents - request.setRawHeader("Referer", request.url().toEncoded().data()); - // Accept gzip - request.setRawHeader("Accept-Encoding", "gzip"); - - return request; - } } -Net::DownloadManager *Net::DownloadManager::m_instance = nullptr; +using namespace Net; -Net::DownloadManager::DownloadManager(QObject *parent) +DownloadManager *DownloadManager::m_instance = 0; + +DownloadManager::DownloadManager(QObject *parent) : QObject(parent) { #ifndef QT_NO_OPENSSL - connect(&m_networkManager, &QNetworkAccessManager::sslErrors, this, &Net::DownloadManager::ignoreSslErrors); + connect(&m_networkManager, SIGNAL(sslErrors(QNetworkReply *, QList)), this, SLOT(ignoreSslErrors(QNetworkReply *, QList))); #endif - connect(&m_networkManager, &QNetworkAccessManager::finished, this, &DownloadManager::handleReplyFinished); - connect(ProxyConfigurationManager::instance(), &ProxyConfigurationManager::proxyConfigurationChanged - , this, &DownloadManager::applyProxySettings); m_networkManager.setCookieJar(new NetworkCookieJar(this)); - applyProxySettings(); } -void Net::DownloadManager::initInstance() +void DownloadManager::initInstance() { if (!m_instance) m_instance = new DownloadManager; } -void Net::DownloadManager::freeInstance() +void DownloadManager::freeInstance() { if (m_instance) { delete m_instance; - m_instance = nullptr; + m_instance = 0; } } -Net::DownloadManager *Net::DownloadManager::instance() +DownloadManager *DownloadManager::instance() { return m_instance; } -Net::DownloadHandler *Net::DownloadManager::download(const DownloadRequest &downloadRequest) +DownloadHandler *DownloadManager::downloadUrl(const QString &url, bool saveToFile, qint64 limit, bool handleRedirectToMagnet, const QString &userAgent) { - // Process download request - const QNetworkRequest request = createNetworkRequest(downloadRequest); - const ServiceID id = ServiceID::fromURL(request.url()); - const bool isSequentialService = m_sequentialServices.contains(id); - if (!isSequentialService || !m_busyServices.contains(id)) { - qDebug("Downloading %s...", qUtf8Printable(downloadRequest.url())); - if (isSequentialService) - m_busyServices.insert(id); - return new DownloadHandler { - m_networkManager.get(request), this, downloadRequest}; - } - - auto *downloadHandler = new DownloadHandler {nullptr, this, downloadRequest}; - connect(downloadHandler, &DownloadHandler::destroyed, this, [this, id, downloadHandler]() - { - m_waitingJobs[id].removeOne(downloadHandler); - }); - m_waitingJobs[id].enqueue(downloadHandler); - return downloadHandler; -} + // Update proxy settings + applyProxySettings(); -void Net::DownloadManager::registerSequentialService(const Net::ServiceID &serviceID) -{ - m_sequentialServices.insert(serviceID); + // Process download request + qDebug("url is %s", qPrintable(url)); + const QUrl qurl = QUrl::fromEncoded(url.toUtf8()); + QNetworkRequest request(qurl); + + if (userAgent.isEmpty()) + request.setRawHeader("User-Agent", DEFAULT_USER_AGENT); + else + request.setRawHeader("User-Agent", userAgent.toUtf8()); + + // Spoof HTTP Referer to allow adding torrent link from Torcache/KickAssTorrents + request.setRawHeader("Referer", request.url().toEncoded().data()); + + qDebug("Downloading %s...", request.url().toEncoded().data()); + qDebug() << "Cookies:" << m_networkManager.cookieJar()->cookiesForUrl(request.url()); + // accept gzip + request.setRawHeader("Accept-Encoding", "gzip"); + return new DownloadHandler(m_networkManager.get(request), this, saveToFile, limit, handleRedirectToMagnet); } -QList Net::DownloadManager::cookiesForUrl(const QUrl &url) const +QList DownloadManager::cookiesForUrl(const QUrl &url) const { return m_networkManager.cookieJar()->cookiesForUrl(url); } -bool Net::DownloadManager::setCookiesFromUrl(const QList &cookieList, const QUrl &url) +bool DownloadManager::setCookiesFromUrl(const QList &cookieList, const QUrl &url) { return m_networkManager.cookieJar()->setCookiesFromUrl(cookieList, url); } -QList Net::DownloadManager::allCookies() const +QList DownloadManager::allCookies() const { return static_cast(m_networkManager.cookieJar())->allCookies(); } -void Net::DownloadManager::setAllCookies(const QList &cookieList) +void DownloadManager::setAllCookies(const QList &cookieList) { static_cast(m_networkManager.cookieJar())->setAllCookies(cookieList); } -bool Net::DownloadManager::deleteCookie(const QNetworkCookie &cookie) +bool DownloadManager::deleteCookie(const QNetworkCookie &cookie) { return static_cast(m_networkManager.cookieJar())->deleteCookie(cookie); } -void Net::DownloadManager::applyProxySettings() +void DownloadManager::applyProxySettings() { auto proxyManager = ProxyConfigurationManager::instance(); ProxyConfiguration proxyConfig = proxyManager->proxyConfiguration(); @@ -230,7 +228,7 @@ } // Authentication? if (proxyManager->isAuthenticationRequired()) { - qDebug("Proxy requires authentication, authenticating..."); + qDebug("Proxy requires authentication, authenticating"); proxy.setUser(proxyConfig.username); proxy.setPassword(proxyConfig.password); } @@ -242,101 +240,11 @@ m_networkManager.setProxy(proxy); } -void Net::DownloadManager::handleReplyFinished(QNetworkReply *reply) -{ - const ServiceID id = ServiceID::fromURL(reply->url()); - auto waitingJobsIter = m_waitingJobs.find(id); - if ((waitingJobsIter == m_waitingJobs.end()) || waitingJobsIter.value().isEmpty()) { - m_busyServices.remove(id); - return; - } - - DownloadHandler *handler = waitingJobsIter.value().dequeue(); - qDebug("Downloading %s...", qUtf8Printable(handler->m_downloadRequest.url())); - handler->assignNetworkReply(m_networkManager.get(createNetworkRequest(handler->m_downloadRequest))); - handler->disconnect(this); -} - #ifndef QT_NO_OPENSSL -void Net::DownloadManager::ignoreSslErrors(QNetworkReply *reply, const QList &errors) +void DownloadManager::ignoreSslErrors(QNetworkReply *reply, const QList &errors) { Q_UNUSED(errors) // Ignore all SSL errors reply->ignoreSslErrors(); } #endif - -Net::DownloadRequest::DownloadRequest(const QString &url) - : m_url {url} -{ -} - -QString Net::DownloadRequest::url() const -{ - return m_url; -} - -Net::DownloadRequest &Net::DownloadRequest::url(const QString &value) -{ - m_url = value; - return *this; -} - -QString Net::DownloadRequest::userAgent() const -{ - return m_userAgent; -} - -Net::DownloadRequest &Net::DownloadRequest::userAgent(const QString &value) -{ - m_userAgent = value; - return *this; -} - -qint64 Net::DownloadRequest::limit() const -{ - return m_limit; -} - -Net::DownloadRequest &Net::DownloadRequest::limit(qint64 value) -{ - m_limit = value; - return *this; -} - -bool Net::DownloadRequest::saveToFile() const -{ - return m_saveToFile; -} - -Net::DownloadRequest &Net::DownloadRequest::saveToFile(bool value) -{ - m_saveToFile = value; - return *this; -} - -bool Net::DownloadRequest::handleRedirectToMagnet() const -{ - return m_handleRedirectToMagnet; -} - -Net::DownloadRequest &Net::DownloadRequest::handleRedirectToMagnet(bool value) -{ - m_handleRedirectToMagnet = value; - return *this; -} - -Net::ServiceID Net::ServiceID::fromURL(const QUrl &url) -{ - return {url.host(), url.port(80)}; -} - -uint Net::qHash(const ServiceID &serviceID, uint seed) -{ - return ::qHash(serviceID.hostName, seed) ^ serviceID.port; -} - -bool Net::operator==(const ServiceID &lhs, const ServiceID &rhs) -{ - return ((lhs.hostName == rhs.hostName) && (lhs.port == rhs.port)); -} diff -Nru qbittorrent-4.1.3/src/base/net/downloadmanager.h qbittorrent-3.3.15/src/base/net/downloadmanager.h --- qbittorrent-4.1.3/src/base/net/downloadmanager.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/net/downloadmanager.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015, 2018 Vladimir Golovnev + * Copyright (C) 2015 Vladimir Golovnev * Copyright (C) 2006 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -30,12 +30,8 @@ #ifndef NET_DOWNLOADMANAGER_H #define NET_DOWNLOADMANAGER_H -#include -#include -#include #include -#include -#include +#include class QNetworkReply; class QNetworkCookie; @@ -46,57 +42,16 @@ { class DownloadHandler; - class DownloadRequest - { - public: - DownloadRequest(const QString &url); - DownloadRequest(const DownloadRequest &other) = default; - - QString url() const; - DownloadRequest &url(const QString &value); - - QString userAgent() const; - DownloadRequest &userAgent(const QString &value); - - qint64 limit() const; - DownloadRequest &limit(qint64 value); - - bool saveToFile() const; - DownloadRequest &saveToFile(bool value); - - bool handleRedirectToMagnet() const; - DownloadRequest &handleRedirectToMagnet(bool value); - - private: - QString m_url; - QString m_userAgent; - qint64 m_limit = 0; - bool m_saveToFile = false; - bool m_handleRedirectToMagnet = false; - }; - - struct ServiceID - { - QString hostName; - int port; - - static ServiceID fromURL(const QUrl &url); - }; - class DownloadManager : public QObject { Q_OBJECT - Q_DISABLE_COPY(DownloadManager) public: static void initInstance(); static void freeInstance(); static DownloadManager *instance(); - DownloadHandler *download(const DownloadRequest &downloadRequest); - - void registerSequentialService(const ServiceID &serviceID); - + DownloadHandler *downloadUrl(const QString &url, bool saveToFile = false, qint64 limit = 0, bool handleRedirectToMagnet = false, const QString &userAgent = ""); QList cookiesForUrl(const QUrl &url) const; bool setCookiesFromUrl(const QList &cookieList, const QUrl &url); QList allCookies() const; @@ -105,25 +60,17 @@ private slots: #ifndef QT_NO_OPENSSL - void ignoreSslErrors(QNetworkReply *, const QList &); + void ignoreSslErrors(QNetworkReply *,const QList &); #endif private: - explicit DownloadManager(QObject *parent = nullptr); + explicit DownloadManager(QObject *parent = 0); void applyProxySettings(); - void handleReplyFinished(QNetworkReply *reply); static DownloadManager *m_instance; QNetworkAccessManager m_networkManager; - - QSet m_sequentialServices; - QSet m_busyServices; - QHash> m_waitingJobs; }; - - uint qHash(const ServiceID &serviceID, uint seed); - bool operator==(const ServiceID &lhs, const ServiceID &rhs); } #endif // NET_DOWNLOADMANAGER_H diff -Nru qbittorrent-4.1.3/src/base/net/geoipmanager.cpp qbittorrent-3.3.15/src/base/net/geoipmanager.cpp --- qbittorrent-4.1.3/src/base/net/geoipmanager.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/net/geoipmanager.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -27,22 +27,20 @@ * exception statement from your version. */ -#include "geoipmanager.h" - -#include #include -#include #include +#include #include +#include #include "base/logger.h" #include "base/preferences.h" -#include "base/profile.h" #include "base/utils/fs.h" #include "base/utils/gzip.h" -#include "downloadhandler.h" #include "downloadmanager.h" +#include "downloadhandler.h" #include "private/geoipdatabase.h" +#include "geoipmanager.h" static const char DATABASE_URL[] = "https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz"; static const char GEOIP_FOLDER[] = "GeoIP"; @@ -53,14 +51,14 @@ // GeoIPManager -GeoIPManager *GeoIPManager::m_instance = nullptr; +GeoIPManager *GeoIPManager::m_instance = 0; GeoIPManager::GeoIPManager() : m_enabled(false) - , m_geoIPDatabase(nullptr) + , m_geoIPDatabase(0) { configure(); - connect(Preferences::instance(), &Preferences::changed, this, &GeoIPManager::configure); + connect(Preferences::instance(), SIGNAL(changed()), SLOT(configure())); } GeoIPManager::~GeoIPManager() @@ -79,7 +77,7 @@ { if (m_instance) { delete m_instance; - m_instance = nullptr; + m_instance = 0; } } @@ -92,18 +90,19 @@ { if (m_geoIPDatabase) { delete m_geoIPDatabase; - m_geoIPDatabase = nullptr; + m_geoIPDatabase = 0; } QString filepath = Utils::Fs::expandPathAbs( - QString("%1%2/%3").arg(specialFolderLocation(SpecialFolder::Data), GEOIP_FOLDER, GEOIP_FILENAME)); + QString("%1%2/%3").arg(Utils::Fs::QDesktopServicesDataLocation()) + .arg(GEOIP_FOLDER).arg(GEOIP_FILENAME)); QString error; m_geoIPDatabase = GeoIPDatabase::load(filepath, error); if (m_geoIPDatabase) Logger::instance()->addMessage(tr("GeoIP database loaded. Type: %1. Build time: %2.") - .arg(m_geoIPDatabase->type(), m_geoIPDatabase->buildEpoch().toString()), - Log::INFO); + .arg(m_geoIPDatabase->type()).arg(m_geoIPDatabase->buildEpoch().toString()), + Log::INFO); else Logger::instance()->addMessage(tr("Couldn't load GeoIP database. Reason: %1").arg(error), Log::WARNING); @@ -118,10 +117,9 @@ void GeoIPManager::downloadDatabaseFile() { - DownloadHandler *handler = DownloadManager::instance()->download({DATABASE_URL}); - connect(handler, static_cast(&Net::DownloadHandler::downloadFinished) - , this, &GeoIPManager::downloadFinished); - connect(handler, &Net::DownloadHandler::downloadFailed, this, &GeoIPManager::downloadFailed); + DownloadHandler *handler = DownloadManager::instance()->downloadUrl(DATABASE_URL); + connect(handler, SIGNAL(downloadFinished(QString, QByteArray)), SLOT(downloadFinished(QString, QByteArray))); + connect(handler, SIGNAL(downloadFailed(QString, QString)), SLOT(downloadFailed(QString, QString))); } QString GeoIPManager::lookup(const QHostAddress &hostAddr) const @@ -408,7 +406,7 @@ } else if (!m_enabled && m_geoIPDatabase) { delete m_geoIPDatabase; - m_geoIPDatabase = nullptr; + m_geoIPDatabase = 0; } } } @@ -432,13 +430,13 @@ delete m_geoIPDatabase; m_geoIPDatabase = geoIPDatabase; Logger::instance()->addMessage(tr("GeoIP database loaded. Type: %1. Build time: %2.") - .arg(m_geoIPDatabase->type(), m_geoIPDatabase->buildEpoch().toString()), - Log::INFO); + .arg(m_geoIPDatabase->type()).arg(m_geoIPDatabase->buildEpoch().toString()), + Log::INFO); QString targetPath = Utils::Fs::expandPathAbs( - specialFolderLocation(SpecialFolder::Data) + GEOIP_FOLDER); + Utils::Fs::QDesktopServicesDataLocation() + GEOIP_FOLDER); if (!QDir(targetPath).exists()) QDir().mkpath(targetPath); - QFile targetFile(QString("%1/%2").arg(targetPath, GEOIP_FILENAME)); + QFile targetFile(QString("%1/%2").arg(targetPath).arg(GEOIP_FILENAME)); if (!targetFile.open(QFile::WriteOnly) || (targetFile.write(data) == -1)) { Logger::instance()->addMessage( tr("Couldn't save downloaded GeoIP database file."), Log::WARNING); diff -Nru qbittorrent-4.1.3/src/base/net/geoipmanager.h qbittorrent-3.3.15/src/base/net/geoipmanager.h --- qbittorrent-4.1.3/src/base/net/geoipmanager.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/net/geoipmanager.h 2017-08-03 20:30:10.000000000 +0000 @@ -30,8 +30,8 @@ #ifndef NET_GEOIPMANAGER_H #define NET_GEOIPMANAGER_H -#include #include +#include class QHostAddress; class QString; diff -Nru qbittorrent-4.1.3/src/base/net/portforwarder.cpp qbittorrent-3.3.15/src/base/net/portforwarder.cpp --- qbittorrent-4.1.3/src/base/net/portforwarder.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/net/portforwarder.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -36,7 +36,7 @@ #include "base/logger.h" #include "base/settingsstorage.h" -static const QString KEY_ENABLED = QStringLiteral("Network/PortForwardingEnabled"); +static const QString KEY_ENABLED = QLatin1String("Network/PortForwardingEnabled"); namespace libt = libtorrent; using namespace Net; @@ -65,7 +65,7 @@ { if (m_instance) { delete m_instance; - m_instance = nullptr; + m_instance = 0; } } @@ -121,10 +121,8 @@ settingsPack.set_bool(libt::settings_pack::enable_natpmp, true); m_provider->apply_settings(settingsPack); #endif - for (auto i = m_mappedPorts.begin(); i != m_mappedPorts.end(); ++i) { - // quint16 port = i.key(); - i.value() = m_provider->add_port_mapping(libt::session::tcp, i.key(), i.key()); - } + foreach (quint16 port, m_mappedPorts.keys()) + m_mappedPorts[port] = m_provider->add_port_mapping(libt::session::tcp, port, port); m_active = true; Logger::instance()->addMessage(tr("UPnP / NAT-PMP support [ON]"), Log::INFO); } @@ -145,4 +143,4 @@ Logger::instance()->addMessage(tr("UPnP / NAT-PMP support [OFF]"), Log::INFO); } -PortForwarder *PortForwarder::m_instance = nullptr; +PortForwarder *PortForwarder::m_instance = 0; diff -Nru qbittorrent-4.1.3/src/base/net/portforwarder.h qbittorrent-3.3.15/src/base/net/portforwarder.h --- qbittorrent-4.1.3/src/base/net/portforwarder.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/net/portforwarder.h 2017-08-03 20:30:10.000000000 +0000 @@ -29,8 +29,8 @@ #ifndef NET_PORTFORWARDER_H #define NET_PORTFORWARDER_H -#include #include +#include namespace libtorrent { @@ -56,7 +56,7 @@ void deletePort(quint16 port); private: - explicit PortForwarder(libtorrent::session *const provider, QObject *parent = nullptr); + explicit PortForwarder(libtorrent::session *const provider, QObject *parent = 0); ~PortForwarder(); void start(); diff -Nru qbittorrent-4.1.3/src/base/net/private/geoipdatabase.cpp qbittorrent-3.3.15/src/base/net/private/geoipdatabase.cpp --- qbittorrent-4.1.3/src/base/net/private/geoipdatabase.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/net/private/geoipdatabase.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -26,22 +26,25 @@ * exception statement from your version. */ -#include #include -#include -#include #include +#include +#include +#include +#include #include "base/types.h" #include "geoipdatabase.h" namespace { + const quint32 __ENDIAN_TEST__ = 0x00000001; + const bool __IS_LITTLE_ENDIAN__ = (reinterpret_cast(&__ENDIAN_TEST__)[0] == 0x01); const qint32 MAX_FILE_SIZE = 67108864; // 64MB const char DB_TYPE[] = "GeoLite2-Country"; const quint32 MAX_METADATA_SIZE = 131072; // 128KB const char METADATA_BEGIN_MARK[] = "\xab\xcd\xefMaxMind.com"; - const char DATA_SECTION_SEPARATOR[16] = {0}; + const char DATA_SECTION_SEPARATOR[16] = { 0 }; enum class DataType { @@ -62,6 +65,10 @@ Boolean = 14, Float = 15 }; + +#ifndef QBT_USES_QT5 + Q_IPV6ADDR createMappedAddress(quint32 ip4); +#endif } struct DataFieldDescriptor @@ -88,30 +95,30 @@ GeoIPDatabase *GeoIPDatabase::load(const QString &filename, QString &error) { - GeoIPDatabase *db = nullptr; + GeoIPDatabase *db = 0; QFile file(filename); if (file.size() > MAX_FILE_SIZE) { error = tr("Unsupported database file size."); - return nullptr; + return 0; } if (!file.open(QFile::ReadOnly)) { error = file.errorString(); - return nullptr; + return 0; } db = new GeoIPDatabase(file.size()); - if (file.read(reinterpret_cast(db->m_data), db->m_size) != db->m_size) { + if (file.read((char *)db->m_data, db->m_size) != db->m_size) { error = file.errorString(); delete db; - return nullptr; + return 0; } if (!db->parseMetadata(db->readMetadata(), error) || !db->loadDB(error)) { delete db; - return nullptr; + return 0; } return db; @@ -119,19 +126,19 @@ GeoIPDatabase *GeoIPDatabase::load(const QByteArray &data, QString &error) { - GeoIPDatabase *db = nullptr; + GeoIPDatabase *db = 0; if (data.size() > MAX_FILE_SIZE) { error = tr("Unsupported database file size."); - return nullptr; + return 0; } db = new GeoIPDatabase(data.size()); - memcpy(reinterpret_cast(db->m_data), data.constData(), db->m_size); + memcpy((char *)db->m_data, data.constData(), db->m_size); if (!db->parseMetadata(db->readMetadata(), error) || !db->loadDB(error)) { delete db; - return nullptr; + return 0; } return db; @@ -159,7 +166,13 @@ QString GeoIPDatabase::lookup(const QHostAddress &hostAddr) const { +#ifndef QBT_USES_QT5 + Q_IPV6ADDR addr = hostAddr.protocol() == QAbstractSocket::IPv4Protocol + ? createMappedAddress(hostAddr.toIPv4Address()) + : hostAddr.toIPv6Address(); +#else Q_IPV6ADDR addr = hostAddr.toIPv6Address(); +#endif const uchar *ptr = m_data; @@ -445,12 +458,8 @@ void GeoIPDatabase::fromBigEndian(uchar *buf, quint32 len) const { -#if (Q_BYTE_ORDER == Q_LITTLE_ENDIAN) - std::reverse(buf, buf + len); -#else - Q_UNUSED(buf); - Q_UNUSED(len); -#endif + if (__IS_LITTLE_ENDIAN__) + std::reverse(buf, buf + len); } QVariant GeoIPDatabase::readMapValue(quint32 &offset, quint32 count) const @@ -487,3 +496,25 @@ return array; } + +namespace +{ +#ifndef QBT_USES_QT5 + Q_IPV6ADDR createMappedAddress(quint32 ip4) + { + Q_IPV6ADDR ip6; + memset(&ip6, 0, sizeof(ip6)); + + int i; + for (i = 15; ip4 != 0; i--) { + ip6[i] = ip4 & 0xFF; + ip4 >>= 8; + } + + ip6[11] = 0xFF; + ip6[10] = 0xFF; + + return ip6; + } +#endif +} diff -Nru qbittorrent-4.1.3/src/base/net/private/geoipdatabase.h qbittorrent-3.3.15/src/base/net/private/geoipdatabase.h --- qbittorrent-4.1.3/src/base/net/private/geoipdatabase.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/net/private/geoipdatabase.h 2017-08-03 20:30:10.000000000 +0000 @@ -29,13 +29,13 @@ #ifndef GEOIPDATABASE_H #define GEOIPDATABASE_H -#include #include +#include -class QByteArray; -class QDateTime; class QHostAddress; class QString; +class QByteArray; +class QDateTime; struct DataFieldDescriptor; diff -Nru qbittorrent-4.1.3/src/base/net/proxyconfigurationmanager.cpp qbittorrent-3.3.15/src/base/net/proxyconfigurationmanager.cpp --- qbittorrent-4.1.3/src/base/net/proxyconfigurationmanager.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/net/proxyconfigurationmanager.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -27,10 +27,9 @@ */ #include "proxyconfigurationmanager.h" - #include "base/settingsstorage.h" -#define SETTINGS_KEY(name) QStringLiteral("Network/Proxy/" name) +#define SETTINGS_KEY(name) "Network/Proxy/" name const QString KEY_ONLY_FOR_TORRENTS = SETTINGS_KEY("OnlyForTorrents"); const QString KEY_TYPE = SETTINGS_KEY("Type"); const QString KEY_IP = SETTINGS_KEY("IP"); @@ -81,7 +80,7 @@ { if (m_instance) { delete m_instance; - m_instance = nullptr; + m_instance = 0; } } @@ -136,25 +135,25 @@ if (!m_isProxyOnlyForTorrents) { switch (m_config.type) { case ProxyType::HTTP_PW: - proxyStrHTTP = QString("http://%1:%2@%3:%4").arg(m_config.username - , m_config.password, m_config.ip, QString::number(m_config.port)); + proxyStrHTTP = QString("http://%1:%2@%3:%4").arg(m_config.username) + .arg(m_config.password).arg(m_config.ip).arg(m_config.port); break; case ProxyType::HTTP: - proxyStrHTTP = QString("http://%1:%2").arg(m_config.ip, QString::number(m_config.port)); + proxyStrHTTP = QString("http://%1:%2").arg(m_config.ip).arg(m_config.port); break; case ProxyType::SOCKS5: - proxyStrSOCK = QString("%1:%2").arg(m_config.ip, QString::number(m_config.port)); + proxyStrSOCK = QString("%1:%2").arg(m_config.ip).arg(m_config.port); break; case ProxyType::SOCKS5_PW: - proxyStrSOCK = QString("%1:%2@%3:%4").arg(m_config.username - , m_config.password, m_config.ip, QString::number(m_config.port)); + proxyStrSOCK = QString("%1:%2@%3:%4").arg(m_config.username) + .arg(m_config.password).arg(m_config.ip).arg(m_config.port); break; default: qDebug("Disabling HTTP communications proxy"); } qDebug("HTTP communications proxy string: %s" - , qUtf8Printable((m_config.type == ProxyType::SOCKS5) || (m_config.type == ProxyType::SOCKS5_PW) + , qPrintable((m_config.type == ProxyType::SOCKS5) || (m_config.type == ProxyType::SOCKS5_PW) ? proxyStrSOCK : proxyStrHTTP)); } diff -Nru qbittorrent-4.1.3/src/base/net/proxyconfigurationmanager.h qbittorrent-3.3.15/src/base/net/proxyconfigurationmanager.h --- qbittorrent-4.1.3/src/base/net/proxyconfigurationmanager.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/net/proxyconfigurationmanager.h 2017-08-03 20:30:10.000000000 +0000 @@ -52,7 +52,7 @@ QString password; }; - class ProxyConfigurationManager : public QObject + class ProxyConfigurationManager: public QObject { Q_OBJECT Q_DISABLE_COPY(ProxyConfigurationManager) diff -Nru qbittorrent-4.1.3/src/base/net/reverseresolution.cpp qbittorrent-3.3.15/src/base/net/reverseresolution.cpp --- qbittorrent-4.1.3/src/base/net/reverseresolution.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/net/reverseresolution.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,24 +24,26 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#include "reverseresolution.h" - -#include -#include - #include #include #include +#include +#include + +#include "reverseresolution.h" + const int CACHE_SIZE = 500; using namespace Net; static inline bool isUsefulHostName(const QString &hostname, const QString &ip) { - return (!hostname.isEmpty() && (hostname != ip)); + return (!hostname.isEmpty() && hostname != ip); } ReverseResolution::ReverseResolution(QObject *parent) @@ -65,17 +67,13 @@ } else { // Actually resolve the ip -#if (QT_VERSION >= QT_VERSION_CHECK(5, 9, 0)) - m_lookups.insert(QHostInfo::lookupHost(ip, this, &ReverseResolution::hostResolved), ip); -#else m_lookups.insert(QHostInfo::lookupHost(ip, this, SLOT(hostResolved(QHostInfo))), ip); -#endif } } void ReverseResolution::hostResolved(const QHostInfo &host) { - const QString ip = m_lookups.take(host.lookupId()); + const QString &ip = m_lookups.take(host.lookupId()); Q_ASSERT(!ip.isNull()); if (host.error() != QHostInfo::NoError) { @@ -83,7 +81,7 @@ return; } - const QString hostname = host.hostName(); + const QString &hostname = host.hostName(); qDebug() << Q_FUNC_INFO << ip << QString("->") << hostname; m_cache.insert(ip, new QString(hostname)); diff -Nru qbittorrent-4.1.3/src/base/net/reverseresolution.h qbittorrent-3.3.15/src/base/net/reverseresolution.h --- qbittorrent-4.1.3/src/base/net/reverseresolution.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/net/reverseresolution.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef NET_REVERSERESOLUTION_H @@ -32,8 +34,10 @@ #include #include +QT_BEGIN_NAMESPACE class QHostInfo; class QString; +QT_END_NAMESPACE namespace Net { @@ -43,7 +47,7 @@ Q_DISABLE_COPY(ReverseResolution) public: - explicit ReverseResolution(QObject *parent = nullptr); + explicit ReverseResolution(QObject *parent = 0); ~ReverseResolution(); void resolve(const QString &ip); diff -Nru qbittorrent-4.1.3/src/base/net/smtp.cpp qbittorrent-3.3.15/src/base/net/smtp.cpp --- qbittorrent-4.1.3/src/base/net/smtp.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/net/smtp.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2011 Christophe Dumez + * Copyright (C) 2011 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ /* @@ -31,20 +33,22 @@ */ #include "smtp.h" +#include "base/preferences.h" +#include "base/logger.h" -#include -#include -#include -#include -#include +#include #ifndef QT_NO_OPENSSL #include #else #include #endif - -#include "base/logger.h" -#include "base/preferences.h" +#include +#include +#include +#include +#include +#include +#include namespace { @@ -64,7 +68,7 @@ // ascii characters 0x36 ("6") and 0x5c ("\") are selected because they have large // Hamming distance (http://en.wikipedia.org/wiki/Hamming_distance) - for (int i = 0; i < key.length(); ++i) { + for (int i = 0; i < key.length(); i++) { innerPadding[i] = innerPadding[i] ^ key.at(i); // XOR operation between every byte in key and innerpadding, of key length outerPadding[i] = outerPadding[i] ^ key.at(i); // XOR operation between every byte in key and outerpadding, of key length } @@ -108,10 +112,9 @@ m_socket = new QTcpSocket(this); #endif - connect(m_socket, &QIODevice::readyRead, this, &Smtp::readyRead); - connect(m_socket, &QAbstractSocket::disconnected, this, &QObject::deleteLater); - connect(m_socket, static_cast(&QAbstractSocket::error) - , this, &Smtp::error); + connect(m_socket, SIGNAL(readyRead()), SLOT(readyRead())); + connect(m_socket, SIGNAL(disconnected()), SLOT(deleteLater())); + connect(m_socket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(error(QAbstractSocket::SocketError))); // Test hmacMD5 function (http://www.faqs.org/rfcs/rfc2202.html) Q_ASSERT(hmacMD5("Jefe", "what do ya want for nothing?").toHex() @@ -127,8 +130,8 @@ void Smtp::sendMail(const QString &from, const QString &to, const QString &subject, const QString &body) { - const Preferences *const pref = Preferences::instance(); - QTextCodec *latin1 = QTextCodec::codecForName("latin1"); + const Preferences* const pref = Preferences::instance(); + QTextCodec* latin1 = QTextCodec::codecForName("latin1"); m_message = "Date: " + getCurrentDateTime().toLatin1() + "\r\n" + encodeMimeHeader("From", from, latin1) + encodeMimeHeader("Subject", subject, latin1) @@ -138,8 +141,8 @@ + "Content-Transfer-Encoding: base64\r\n" + "\r\n"; // Encode the body in base64 - QString crlfBody = body; - QByteArray b = crlfBody.replace("\n", "\r\n").toUtf8().toBase64(); + QString crlf_body = body; + QByteArray b = crlf_body.replace("\n", "\r\n").toUtf8().toBase64(); int ct = b.length(); for (int i = 0; i < ct; i += 78) m_message += b.mid(i, 78); @@ -162,7 +165,7 @@ m_socket->connectToHost(pref->getMailNotificationSMTP(), DEFAULT_PORT); m_useSsl = false; #ifndef QT_NO_OPENSSL - } +} #endif } @@ -181,7 +184,7 @@ QByteArray code = line.left(3); switch (m_state) { - case Init: + case Init: { if (code[0] == '2') { // The server may send a multiline greeting/INIT/220 response. // We wait until it finishes. @@ -191,10 +194,11 @@ ehlo(); } else { - logError(QLatin1String("Connection failed, unrecognized reply: ") + line); + logError("Connection failed, unrecognized reply: " + line); m_state = Close; } break; + } case EhloSent: case HeloSent: case EhloGreetReceived: @@ -227,7 +231,7 @@ } else { // Authentication failed! - logError(QLatin1String("Authentication failed, msg: ") + line); + logError("Authentication failed, msg: " + line); m_state = Close; } break; @@ -238,7 +242,7 @@ m_state = Data; } else { - logError(QLatin1String(" was rejected by server, msg: ") + line); + logError(" was rejected by server, msg: " + line); m_state = Close; } break; @@ -249,7 +253,7 @@ m_state = Body; } else { - logError(QLatin1String(" was rejected by server, msg: ") + line); + logError(" was rejected by server, msg: " + line); m_state = Close; } break; @@ -260,7 +264,7 @@ m_state = Quit; } else { - logError(QLatin1String(" was rejected by server, msg: ") + line); + logError(" was rejected by server, msg: " + line); m_state = Close; } break; @@ -272,7 +276,7 @@ m_state = Close; } else { - logError(QLatin1String("Message was rejected by the server, error: ") + line); + logError("Message was rejected by the server, error: " + line); m_state = Close; } break; @@ -299,7 +303,7 @@ if (firstWord) line += word; else - line += ' ' + word; + line += " " + word; firstWord = false; } } @@ -423,7 +427,7 @@ // Skip authentication logError("The SMTP server does not seem to support any of the authentications modes " "we support [CRAM-MD5|PLAIN|LOGIN], skipping authentication, " - "knowing it is likely to fail... Server Auth Modes: " + auth.join('|')); + "knowing it is likely to fail... Server Auth Modes: " + auth.join("|")); m_state = Authenticated; // At this point the server will not send any response // So fill the buffer with a fake one to pass the tests @@ -444,7 +448,7 @@ #endif } -void Smtp::authCramMD5(const QByteArray &challenge) +void Smtp::authCramMD5(const QByteArray& challenge) { if (m_state != AuthRequestSent) { m_socket->write("auth cram-md5\r\n"); @@ -503,7 +507,7 @@ void Smtp::logError(const QString &msg) { qDebug() << "Email Notification Error:" << msg; - Logger::instance()->addMessage(tr("Email Notification Error:") + ' ' + msg, Log::CRITICAL); + Logger::instance()->addMessage(tr("Email Notification Error:") + " " + msg, Log::CRITICAL); } QString Smtp::getCurrentDateTime() const @@ -529,7 +533,7 @@ std::snprintf(buf, sizeof(buf), "%+05d", timeOffset); QString timeOffsetStr = buf; - QString ret = weekDayStr + ", " + dayStr + ' ' + monthStr + ' ' + yearStr + ' ' + timeStr + ' ' + timeOffsetStr; + QString ret = weekDayStr + ", " + dayStr + " " + monthStr + " " + yearStr + " " + timeStr + " " + timeOffsetStr; return ret; } diff -Nru qbittorrent-4.1.3/src/base/net/smtp.h qbittorrent-3.3.15/src/base/net/smtp.h --- qbittorrent-4.1.3/src/base/net/smtp.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/net/smtp.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2011 Christophe Dumez + * Copyright (C) 2011 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ /* @@ -33,19 +35,22 @@ #ifndef SMTP_H #define SMTP_H -#include +#include +#include #include #include +#include #include -#include -#include +QT_BEGIN_NAMESPACE +class QTextStream; #ifndef QT_NO_OPENSSL class QSslSocket; #else class QTcpSocket; #endif class QTextCodec; +QT_END_NAMESPACE namespace Net { @@ -54,10 +59,10 @@ Q_OBJECT public: - Smtp(QObject *parent = nullptr); + Smtp(QObject *parent = 0); ~Smtp(); - void sendMail(const QString &from, const QString &to, const QString &subject, const QString &body); + void sendMail(const QString &m_from, const QString &to, const QString &subject, const QString &body); private slots: void readyRead(); @@ -121,4 +126,8 @@ }; } -#endif // SMTP_H +#ifndef QBT_USES_QT5 +Q_DECLARE_METATYPE(QAbstractSocket::SocketError) +#endif + +#endif diff -Nru qbittorrent-4.1.3/src/base/preferences.cpp qbittorrent-3.3.15/src/base/preferences.cpp --- qbittorrent-4.1.3/src/base/preferences.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/preferences.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,7 +1,7 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2014 sledgehammer999 - * Copyright (C) 2006 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * Copyright (C) 2014 sledgehammer999 * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -25,14 +25,15 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org + * Contact : hammered999@gmail.com */ -#include "preferences.h" - #include #include #include -#include +#include #include #ifndef DISABLE_GUI @@ -44,21 +45,21 @@ #ifdef Q_OS_WIN #include #include -#include #endif #ifdef Q_OS_MAC #include #endif -#include "logger.h" -#include "settingsstorage.h" #include "utils/fs.h" #include "utils/misc.h" +#include "settingsstorage.h" +#include "logger.h" +#include "preferences.h" -Preferences *Preferences::m_instance = nullptr; +Preferences* Preferences::m_instance = 0; -Preferences::Preferences() = default; +Preferences::Preferences() {} Preferences *Preferences::instance() { @@ -75,7 +76,7 @@ { if (m_instance) { delete m_instance; - m_instance = nullptr; + m_instance = 0; } } @@ -160,9 +161,6 @@ setValue("Preferences/General/HideZeroComboValues", n); } -// In Mac OS X the dock is sufficient for our needs so we disable the sys tray functionality. -// See extensive discussion in https://github.com/qbittorrent/qBittorrent/pull/3018 -#ifndef Q_OS_MAC bool Preferences::systrayIntegration() const { return value("Preferences/General/SystrayEnabled", true).toBool(); @@ -173,24 +171,24 @@ setValue("Preferences/General/SystrayEnabled", enabled); } -bool Preferences::minimizeToTray() const +bool Preferences::isToolbarDisplayed() const { - return value("Preferences/General/MinimizeToTray", false).toBool(); + return value("Preferences/General/ToolbarDisplayed", true).toBool(); } -void Preferences::setMinimizeToTray(bool b) +void Preferences::setToolbarDisplayed(bool displayed) { - setValue("Preferences/General/MinimizeToTray", b); + setValue("Preferences/General/ToolbarDisplayed", displayed); } -bool Preferences::minimizeToTrayNotified() const +bool Preferences::minimizeToTray() const { - return value("Preferences/General/MinimizeToTrayNotified", false).toBool(); + return value("Preferences/General/MinimizeToTray", false).toBool(); } -void Preferences::setMinimizeToTrayNotified(bool b) +void Preferences::setMinimizeToTray(bool b) { - setValue("Preferences/General/MinimizeToTrayNotified", b); + setValue("Preferences/General/MinimizeToTray", b); } bool Preferences::closeToTray() const @@ -203,37 +201,6 @@ setValue("Preferences/General/CloseToTray", b); } -bool Preferences::closeToTrayNotified() const -{ - return value("Preferences/General/CloseToTrayNotified", false).toBool(); -} - -void Preferences::setCloseToTrayNotified(bool b) -{ - setValue("Preferences/General/CloseToTrayNotified", b); -} -#endif - -bool Preferences::isToolbarDisplayed() const -{ - return value("Preferences/General/ToolbarDisplayed", true).toBool(); -} - -void Preferences::setToolbarDisplayed(bool displayed) -{ - setValue("Preferences/General/ToolbarDisplayed", displayed); -} - -bool Preferences::isStatusbarDisplayed() const -{ - return value("Preferences/General/StatusbarDisplayed", true).toBool(); -} - -void Preferences::setStatusbarDisplayed(bool displayed) -{ - setValue("Preferences/General/StatusbarDisplayed", displayed); -} - bool Preferences::startMinimized() const { return value("Preferences/General/StartMinimized", false).toBool(); @@ -255,24 +222,14 @@ } // Preventing from system suspend while active torrents are presented. -bool Preferences::preventFromSuspendWhenDownloading() const +bool Preferences::preventFromSuspend() const { - return value("Preferences/General/PreventFromSuspendWhenDownloading", false).toBool(); + return value("Preferences/General/PreventFromSuspend", false).toBool(); } -void Preferences::setPreventFromSuspendWhenDownloading(bool b) +void Preferences::setPreventFromSuspend(bool b) { - setValue("Preferences/General/PreventFromSuspendWhenDownloading", b); -} - -bool Preferences::preventFromSuspendWhenSeeding() const -{ - return value("Preferences/General/PreventFromSuspendWhenSeeding", false).toBool(); -} - -void Preferences::setPreventFromSuspendWhenSeeding(bool b) -{ - setValue("Preferences/General/PreventFromSuspendWhenSeeding", b); + setValue("Preferences/General/PreventFromSuspend", b); } #ifdef Q_OS_WIN @@ -286,8 +243,8 @@ { QSettings settings("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat); if (b) { - const QString binPath = '"' + Utils::Fs::toNativePath(qApp->applicationFilePath()) + '"'; - settings.setValue("qBittorrent", binPath); + const QString bin_path = "\"" + Utils::Fs::toNativePath(qApp->applicationFilePath()) + "\""; + settings.setValue("qBittorrent", bin_path); } else { settings.remove("qBittorrent"); @@ -337,16 +294,6 @@ setValue("Preferences/MailNotification/enabled", enabled); } -QString Preferences::getMailNotificationSender() const -{ - return value("Preferences/MailNotification/sender", "qBittorrent_notification@example.com").toString(); -} - -void Preferences::setMailNotificationSender(const QString &mail) -{ - setValue("Preferences/MailNotification/sender", mail); -} - QString Preferences::getMailNotificationEmail() const { return value("Preferences/MailNotification/email").toString(); @@ -447,14 +394,14 @@ setValue("Preferences/Scheduler/end_time", time); } -SchedulerDays Preferences::getSchedulerDays() const +scheduler_days Preferences::getSchedulerDays() const { - return static_cast(value("Preferences/Scheduler/days", EVERY_DAY).toInt()); + return (scheduler_days)value("Preferences/Scheduler/days", EVERY_DAY).toInt(); } -void Preferences::setSchedulerDays(SchedulerDays days) +void Preferences::setSchedulerDays(scheduler_days days) { - setValue("Preferences/Scheduler/days", static_cast(days)); + setValue("Preferences/Scheduler/days", (int)days); } // Search @@ -492,45 +439,9 @@ setValue("Preferences/WebUI/LocalHostAuth", enabled); } -bool Preferences::isWebUiAuthSubnetWhitelistEnabled() const -{ - return value("Preferences/WebUI/AuthSubnetWhitelistEnabled", false).toBool(); -} - -void Preferences::setWebUiAuthSubnetWhitelistEnabled(bool enabled) -{ - setValue("Preferences/WebUI/AuthSubnetWhitelistEnabled", enabled); -} - -QList Preferences::getWebUiAuthSubnetWhitelist() const -{ - QList subnets; - foreach (const QString &rawSubnet, value("Preferences/WebUI/AuthSubnetWhitelist").toStringList()) { - bool ok = false; - const Utils::Net::Subnet subnet = Utils::Net::parseSubnet(rawSubnet.trimmed(), &ok); - if (ok) - subnets.append(subnet); - } - - return subnets; -} - -void Preferences::setWebUiAuthSubnetWhitelist(QStringList subnets) -{ - QMutableListIterator i(subnets); - while (i.hasNext()) { - bool ok = false; - const Utils::Net::Subnet subnet = Utils::Net::parseSubnet(i.next().trimmed(), &ok); - if (!ok) - i.remove(); - } - - setValue("Preferences/WebUI/AuthSubnetWhitelist", subnets); -} - QString Preferences::getServerDomains() const { - return value("Preferences/WebUI/ServerDomains", QChar('*')).toString(); + return value("Preferences/WebUI/ServerDomains", "*").toString(); } void Preferences::setServerDomains(const QString &str) @@ -538,16 +449,6 @@ setValue("Preferences/WebUI/ServerDomains", str); } -QString Preferences::getWebUiAddress() const -{ - return value("Preferences/WebUI/Address", QChar('*')).toString().trimmed(); -} - -void Preferences::setWebUiAddress(const QString &addr) -{ - setValue("Preferences/WebUI/Address", addr.trimmed()); -} - quint16 Preferences::getWebUiPort() const { return value("Preferences/WebUI/Port", 8080).toInt(); @@ -584,48 +485,28 @@ QString Preferences::getWebUiPassword() const { - QString passHa1 = value("Preferences/WebUI/Password_ha1").toString(); - if (passHa1.isEmpty()) { + QString pass_ha1 = value("Preferences/WebUI/Password_ha1").toString(); + if (pass_ha1.isEmpty()) { QCryptographicHash md5(QCryptographicHash::Md5); md5.addData("adminadmin"); - passHa1 = md5.result().toHex(); + pass_ha1 = md5.result().toHex(); } - return passHa1; + return pass_ha1; } -void Preferences::setWebUiPassword(const QString &newPassword) +void Preferences::setWebUiPassword(const QString &new_password) { // Do not overwrite current password with its hash - if (newPassword == getWebUiPassword()) + if (new_password == getWebUiPassword()) return; // Encode to md5 and save QCryptographicHash md5(QCryptographicHash::Md5); - md5.addData(newPassword.toLocal8Bit()); + md5.addData(new_password.toLocal8Bit()); setValue("Preferences/WebUI/Password_ha1", md5.result().toHex()); } -bool Preferences::isWebUiClickjackingProtectionEnabled() const -{ - return value("Preferences/WebUI/ClickjackingProtection", true).toBool(); -} - -void Preferences::setWebUiClickjackingProtectionEnabled(bool enabled) -{ - setValue("Preferences/WebUI/ClickjackingProtection", enabled); -} - -bool Preferences::isWebUiCSRFProtectionEnabled() const -{ - return value("Preferences/WebUI/CSRFProtection", true).toBool(); -} - -void Preferences::setWebUiCSRFProtectionEnabled(bool enabled) -{ - setValue("Preferences/WebUI/CSRFProtection", enabled); -} - bool Preferences::isWebUiHttpsEnabled() const { return value("Preferences/WebUI/HTTPS/Enabled", false).toBool(); @@ -656,26 +537,6 @@ setValue("Preferences/WebUI/HTTPS/Key", data); } -bool Preferences::isAltWebUiEnabled() const -{ - return value("Preferences/WebUI/AlternativeUIEnabled", false).toBool(); -} - -void Preferences::setAltWebUiEnabled(bool enabled) -{ - setValue("Preferences/WebUI/AlternativeUIEnabled", enabled); -} - -QString Preferences::getWebUiRootFolder() const -{ - return value("Preferences/WebUI/RootFolder").toString(); -} - -void Preferences::setWebUiRootFolder(const QString &path) -{ - setValue("Preferences/WebUI/RootFolder", path); -} - bool Preferences::isDynDNSEnabled() const { return value("Preferences/DynDNS/Enabled", false).toBool(); @@ -737,12 +598,12 @@ return value("Locking/password").toString(); } -void Preferences::setUILockPassword(const QString &clearPassword) +void Preferences::setUILockPassword(const QString &clear_password) { QCryptographicHash md5(QCryptographicHash::Md5); - md5.addData(clearPassword.toLocal8Bit()); - QString md5Password = md5.result().toHex(); - setValue("Locking/password", md5Password); + md5.addData(clear_password.toLocal8Bit()); + QString md5_password = md5.result().toHex(); + setValue("Locking/password", md5_password); } bool Preferences::isUILocked() const @@ -878,8 +739,7 @@ } #ifdef Q_OS_WIN -namespace -{ +namespace { enum REG_SEARCH_TYPE { USER, @@ -896,7 +756,7 @@ LONG res = ::RegQueryInfoKeyW(handle, NULL, NULL, NULL, &cSubKeys, &cMaxSubKeyLen, NULL, NULL, NULL, NULL, NULL, NULL); if (res == ERROR_SUCCESS) { - ++cMaxSubKeyLen; // For null character + cMaxSubKeyLen++; // For null character LPWSTR lpName = new WCHAR[cMaxSubKeyLen]; DWORD cName; @@ -968,7 +828,7 @@ versions.sort(); bool found = false; - while (!found && !versions.empty()) { + while(!found && !versions.empty()) { const QString version = versions.takeLast() + "\\InstallPath"; LPWSTR lpSubkey = new WCHAR[version.size() + 1]; version.toWCharArray(lpSubkey); @@ -979,12 +839,12 @@ delete[] lpSubkey; if (res == ERROR_SUCCESS) { - qDebug("Detected possible Python v%s location", qUtf8Printable(version)); + qDebug("Detected possible Python v%s location", qPrintable(version)); path = getRegValue(hkInstallPath); ::RegCloseKey(hkInstallPath); if (!path.isEmpty() && QDir(path).exists("python.exe")) { - qDebug("Found python.exe at %s", qUtf8Printable(path)); + qDebug("Found python.exe at %s", qPrintable(path)); found = true; } } @@ -998,6 +858,7 @@ return path; } + } QString Preferences::getPythonPath() @@ -1017,7 +878,7 @@ // Fallback: Detect python from default locations const QStringList dirs = QDir("C:/").entryList(QStringList("Python*"), QDir::Dirs, QDir::Name | QDir::Reversed); foreach (const QString &dir, dirs) { - const QString path("C:/" + dir + '/'); + const QString path("C:/" + dir + "/"); if (QFile::exists(path + "python.exe")) return path; } @@ -1051,14 +912,13 @@ QSettings settings("HKEY_CURRENT_USER\\Software\\Classes", QSettings::NativeFormat); // Check magnet link assoc - const QString shellCommand = Utils::Fs::toNativePath(settings.value("magnet/shell/open/command/Default", "").toString()); - - const QRegularExpressionMatch exeRegMatch = QRegularExpression("\"([^\"]+)\".*").match(shellCommand); - if (!exeRegMatch.hasMatch()) + QRegExp exe_reg("\"([^\"]+)\".*"); + QString shell_command = Utils::Fs::toNativePath(settings.value("magnet/shell/open/command/Default", "").toString()); + if (exe_reg.indexIn(shell_command) < 0) return false; - - const QString assocExe = exeRegMatch.captured(1); - if (assocExe.compare(Utils::Fs::toNativePath(qApp->applicationFilePath()), Qt::CaseInsensitive) != 0) + QString assoc_exe = exe_reg.cap(1); + qDebug("exe: %s", qPrintable(assoc_exe)); + if (assoc_exe.compare(Utils::Fs::toNativePath(qApp->applicationFilePath()), Qt::CaseInsensitive) != 0) return false; return true; @@ -1070,9 +930,9 @@ // .Torrent association if (set) { - QString oldProgId = settings.value(".torrent/Default").toString(); - if (!oldProgId.isEmpty() && (oldProgId != "qBittorrent")) - settings.setValue(".torrent/OpenWithProgids/" + oldProgId, ""); + QString old_progid = settings.value(".torrent/Default").toString(); + if (!old_progid.isEmpty() && (old_progid != "qBittorrent")) + settings.setValue(".torrent/OpenWithProgids/" + old_progid, ""); settings.setValue(".torrent/Default", "qBittorrent"); } else if (isTorrentFileAssocSet()) { @@ -1088,15 +948,15 @@ // Magnet association if (set) { - const QString commandStr = '"' + qApp->applicationFilePath() + "\" \"%1\""; - const QString iconStr = '"' + qApp->applicationFilePath() + "\",1"; + const QString command_str = "\"" + qApp->applicationFilePath() + "\" \"%1\""; + const QString icon_str = "\"" + qApp->applicationFilePath() + "\",1"; settings.setValue("magnet/Default", "URL:Magnet link"); settings.setValue("magnet/Content Type", "application/x-magnet"); settings.setValue("magnet/URL Protocol", ""); - settings.setValue("magnet/DefaultIcon/Default", Utils::Fs::toNativePath(iconStr)); + settings.setValue("magnet/DefaultIcon/Default", Utils::Fs::toNativePath(icon_str)); settings.setValue("magnet/shell/Default", "open"); - settings.setValue("magnet/shell/open/command/Default", Utils::Fs::toNativePath(commandStr)); + settings.setValue("magnet/shell/open/command/Default", Utils::Fs::toNativePath(command_str)); } else if (isMagnetLinkAssocSet()) { settings.remove("magnet"); @@ -1204,17 +1064,6 @@ setValue("Preferences/Advanced/confirmTorrentRecheck", enabled); } -bool Preferences::confirmRemoveAllTags() const -{ - return value("Preferences/Advanced/confirmRemoveAllTags", true).toBool(); -} - -void Preferences::setConfirmRemoveAllTags(bool enabled) -{ - setValue("Preferences/Advanced/confirmRemoveAllTags", enabled); -} - -#ifndef Q_OS_MAC TrayIcon::Style Preferences::trayIconStyle() const { return TrayIcon::Style(value("Preferences/Advanced/TrayIconStyle", TrayIcon::NORMAL).toInt()); @@ -1224,7 +1073,6 @@ { setValue("Preferences/Advanced/TrayIconStyle", style); } -#endif // Stuff that don't appear in the Options GUI but are saved // in the same file. @@ -1271,12 +1119,20 @@ QByteArray Preferences::getMainVSplitterState() const { +#ifdef QBT_USES_QT5 return value("MainWindow/qt5/vsplitterState").toByteArray(); +#else + return value("MainWindow/vsplitterState").toByteArray(); +#endif } void Preferences::setMainVSplitterState(const QByteArray &state) { +#ifdef QBT_USES_QT5 setValue("MainWindow/qt5/vsplitterState", state); +#else + setValue("MainWindow/vsplitterState", state); +#endif } QString Preferences::getMainLastDir() const @@ -1289,15 +1145,27 @@ setValue("MainWindowLastDir", path); } -QSize Preferences::getPrefSize() const +#ifndef DISABLE_GUI +QSize Preferences::getPrefSize(const QSize& defaultSize) const { - return value("Preferences/State/size").toSize(); + return value("Preferences/State/size", defaultSize).toSize(); } void Preferences::setPrefSize(const QSize &size) { setValue("Preferences/State/size", size); } +#endif + +QPoint Preferences::getPrefPos() const +{ + return value("Preferences/State/pos").toPoint(); +} + +void Preferences::setPrefPos(const QPoint &pos) +{ + setValue("Preferences/State/pos", pos); +} QStringList Preferences::getPrefHSplitterSizes() const { @@ -1311,12 +1179,20 @@ QByteArray Preferences::getPeerListState() const { +#ifdef QBT_USES_QT5 return value("TorrentProperties/Peers/qt5/PeerListState").toByteArray(); +#else + return value("TorrentProperties/Peers/PeerListState").toByteArray(); +#endif } void Preferences::setPeerListState(const QByteArray &state) { +#ifdef QBT_USES_QT5 setValue("TorrentProperties/Peers/qt5/PeerListState", state); +#else + setValue("TorrentProperties/Peers/PeerListState", state); +#endif } QString Preferences::getPropSplitterSizes() const @@ -1331,12 +1207,20 @@ QByteArray Preferences::getPropFileListState() const { +#ifdef QBT_USES_QT5 return value("TorrentProperties/qt5/FilesListState").toByteArray(); +#else + return value("TorrentProperties/FilesListState").toByteArray(); +#endif } void Preferences::setPropFileListState(const QByteArray &state) { +#ifdef QBT_USES_QT5 setValue("TorrentProperties/qt5/FilesListState", state); +#else + setValue("TorrentProperties/FilesListState", state); +#endif } int Preferences::getPropCurTab() const @@ -1361,92 +1245,172 @@ QByteArray Preferences::getPropTrackerListState() const { +#ifdef QBT_USES_QT5 return value("TorrentProperties/Trackers/qt5/TrackerListState").toByteArray(); +#else + return value("TorrentProperties/Trackers/TrackerListState").toByteArray(); +#endif } void Preferences::setPropTrackerListState(const QByteArray &state) { +#ifdef QBT_USES_QT5 setValue("TorrentProperties/Trackers/qt5/TrackerListState", state); +#else + setValue("TorrentProperties/Trackers/TrackerListState", state); +#endif } -QSize Preferences::getRssGeometrySize() const +QByteArray Preferences::getRssGeometry() const { - return value("RssFeedDownloader/geometrySize").toSize(); + return value("RssFeedDownloader/geometry").toByteArray(); } -void Preferences::setRssGeometrySize(const QSize &geometry) +void Preferences::setRssGeometry(const QByteArray &geometry) { - setValue("RssFeedDownloader/geometrySize", geometry); + setValue("RssFeedDownloader/geometry", geometry); } QByteArray Preferences::getRssHSplitterSizes() const { +#ifdef QBT_USES_QT5 return value("RssFeedDownloader/qt5/hsplitterSizes").toByteArray(); +#else + return value("RssFeedDownloader/hsplitterSizes").toByteArray(); +#endif } void Preferences::setRssHSplitterSizes(const QByteArray &sizes) { +#ifdef QBT_USES_QT5 setValue("RssFeedDownloader/qt5/hsplitterSizes", sizes); +#else + setValue("RssFeedDownloader/hsplitterSizes", sizes); +#endif } QStringList Preferences::getRssOpenFolders() const { - return value("GUI/RSSWidget/OpenedFolders").toStringList(); + return value("Rss/open_folders").toStringList(); } void Preferences::setRssOpenFolders(const QStringList &folders) { - setValue("GUI/RSSWidget/OpenedFolders", folders); + setValue("Rss/open_folders", folders); } QByteArray Preferences::getRssSideSplitterState() const { - return value("GUI/RSSWidget/qt5/splitter_h").toByteArray(); +#ifdef QBT_USES_QT5 + return value("Rss/qt5/splitter_h").toByteArray(); +#else + return value("Rss/splitter_h").toByteArray(); +#endif } void Preferences::setRssSideSplitterState(const QByteArray &state) { - setValue("GUI/RSSWidget/qt5/splitter_h", state); +#ifdef QBT_USES_QT5 + setValue("Rss/qt5/splitter_h", state); +#else + setValue("Rss/splitter_h", state); +#endif } QByteArray Preferences::getRssMainSplitterState() const { - return value("GUI/RSSWidget/qt5/splitterMain").toByteArray(); +#ifdef QBT_USES_QT5 + return value("Rss/qt5/splitterMain").toByteArray(); +#else + return value("Rss/splitterMain").toByteArray(); +#endif } void Preferences::setRssMainSplitterState(const QByteArray &state) { - setValue("GUI/RSSWidget/qt5/splitterMain", state); +#ifdef QBT_USES_QT5 + setValue("Rss/qt5/splitterMain", state); +#else + setValue("Rss/splitterMain", state); +#endif } QByteArray Preferences::getSearchTabHeaderState() const { +#ifdef QBT_USES_QT5 return value("SearchTab/qt5/HeaderState").toByteArray(); +#else + return value("SearchTab/HeaderState").toByteArray(); +#endif } void Preferences::setSearchTabHeaderState(const QByteArray &state) { +#ifdef QBT_USES_QT5 setValue("SearchTab/qt5/HeaderState", state); +#else + setValue("SearchTab/HeaderState", state); +#endif +} + +QStringList Preferences::getSearchEngDisabled() const +{ + return value("SearchEngines/disabledEngines").toStringList(); } -bool Preferences::getRegexAsFilteringPatternForSearchJob() const +void Preferences::setSearchEngDisabled(const QStringList &engines) { - return value("SearchTab/UseRegexAsFilteringPattern", false).toBool(); + setValue("SearchEngines/disabledEngines", engines); } -void Preferences::setRegexAsFilteringPatternForSearchJob(const bool checked) +QString Preferences::getCreateTorLastAddPath() const { - setValue("SearchTab/UseRegexAsFilteringPattern", checked); + return value("CreateTorrent/last_add_path", QDir::homePath()).toString(); } -QStringList Preferences::getSearchEngDisabled() const +void Preferences::setCreateTorLastAddPath(const QString &path) { - return value("SearchEngines/disabledEngines").toStringList(); + setValue("CreateTorrent/last_add_path", path); } -void Preferences::setSearchEngDisabled(const QStringList &engines) +QString Preferences::getCreateTorLastSavePath() const { - setValue("SearchEngines/disabledEngines", engines); + return value("CreateTorrent/last_save_path", QDir::homePath()).toString(); +} + +void Preferences::setCreateTorLastSavePath(const QString &path) +{ + setValue("CreateTorrent/last_save_path", path); +} + +QString Preferences::getCreateTorTrackers() const +{ + return value("CreateTorrent/TrackerList").toString(); +} + +void Preferences::setCreateTorTrackers(const QString &path) +{ + setValue("CreateTorrent/TrackerList", path); +} + +QByteArray Preferences::getCreateTorGeometry() const +{ + return value("CreateTorrent/dimensions").toByteArray(); +} + +void Preferences::setCreateTorGeometry(const QByteArray &geometry) +{ + setValue("CreateTorrent/dimensions", geometry); +} + +bool Preferences::getCreateTorIgnoreRatio() const +{ + return value("CreateTorrent/IgnoreRatio").toBool(); +} + +void Preferences::setCreateTorIgnoreRatio(const bool ignore) +{ + setValue("CreateTorrent/IgnoreRatio", ignore); } QString Preferences::getTorImportLastContentDir() const @@ -1489,16 +1453,6 @@ setValue("TransferListFilters/CategoryFilterState", checked); } -bool Preferences::getTagFilterState() const -{ - return value("TransferListFilters/TagFilterState", true).toBool(); -} - -void Preferences::setTagFilterState(const bool checked) -{ - setValue("TransferListFilters/TagFilterState", checked); -} - bool Preferences::getTrackerFilterState() const { return value("TransferListFilters/trackerFilterState", true).toBool(); @@ -1521,33 +1475,81 @@ QByteArray Preferences::getTransHeaderState() const { +#ifdef QBT_USES_QT5 return value("TransferList/qt5/HeaderState").toByteArray(); +#else + return value("TransferList/HeaderState").toByteArray(); +#endif } void Preferences::setTransHeaderState(const QByteArray &state) { +#ifdef QBT_USES_QT5 setValue("TransferList/qt5/HeaderState", state); +#else + setValue("TransferList/HeaderState", state); +#endif +} + +//From old RssSettings class +bool Preferences::isRSSEnabled() const +{ + return value("Preferences/RSS/RSSEnabled", false).toBool(); +} + +void Preferences::setRSSEnabled(const bool enabled) +{ + setValue("Preferences/RSS/RSSEnabled", enabled); +} + +uint Preferences::getRSSRefreshInterval() const +{ + return value("Preferences/RSS/RSSRefresh", 30).toUInt(); +} + +void Preferences::setRSSRefreshInterval(const uint &interval) +{ + setValue("Preferences/RSS/RSSRefresh", interval); +} + +int Preferences::getRSSMaxArticlesPerFeed() const +{ + return value("Preferences/RSS/RSSMaxArticlesPerFeed", 50).toInt(); +} + +void Preferences::setRSSMaxArticlesPerFeed(const int &nb) +{ + setValue("Preferences/RSS/RSSMaxArticlesPerFeed", nb); +} + +bool Preferences::isRssDownloadingEnabled() const +{ + return value("Preferences/RSS/RssDownloading", true).toBool(); +} + +void Preferences::setRssDownloadingEnabled(const bool b) +{ + setValue("Preferences/RSS/RssDownloading", b); } -bool Preferences::getRegexAsFilteringPatternForTransferList() const +QStringList Preferences::getRssFeedsUrls() const { - return value("TransferList/UseRegexAsFilteringPattern", false).toBool(); + return value("Rss/streamList").toStringList(); } -void Preferences::setRegexAsFilteringPatternForTransferList(const bool checked) +void Preferences::setRssFeedsUrls(const QStringList &rssFeeds) { - setValue("TransferList/UseRegexAsFilteringPattern", checked); + setValue("Rss/streamList", rssFeeds); } -// From old RssSettings class -bool Preferences::isRSSWidgetEnabled() const +QStringList Preferences::getRssFeedsAliases() const { - return value("GUI/RSSWidget/Enabled", false).toBool(); + return value("Rss/streamAlias").toStringList(); } -void Preferences::setRSSWidgetVisible(const bool enabled) +void Preferences::setRssFeedsAliases(const QStringList &rssAliases) { - setValue("GUI/RSSWidget/Enabled", enabled); + setValue("Rss/streamAlias", rssAliases); } int Preferences::getToolbarTextPosition() const @@ -1602,7 +1604,23 @@ void Preferences::upgrade() { - SettingsStorage *settingsStorage = SettingsStorage::instance(); + // Move RSS cookies to global storage + QList cookies = getNetworkCookies(); + QVariantMap hostsTable = value("Rss/hosts_cookies").toMap(); + foreach (const QString &key, hostsTable.keys()) { + QVariant value = hostsTable[key]; + QList rawCookies = value.toByteArray().split(':'); + foreach (const QByteArray &rawCookie, rawCookies) { + foreach (QNetworkCookie cookie, QNetworkCookie::parseCookies(rawCookie)) { + cookie.setDomain(key); + cookie.setPath("/"); + cookie.setExpirationDate(QDateTime::currentDateTime().addYears(10)); + cookies << cookie; + } + } + } + + setNetworkCookies(cookies); QStringList labels = value("TransferListFilters/customLabels").toStringList(); if (!labels.isEmpty()) { @@ -1612,17 +1630,11 @@ categories[label] = ""; } setValue("BitTorrent/Session/Categories", categories); - settingsStorage->removeValue("TransferListFilters/customLabels"); + SettingsStorage::instance()->removeValue("TransferListFilters/customLabels"); } - settingsStorage->removeValue("Preferences/Downloads/AppendLabel"); - - // Inhibit sleep based on running downloads/available seeds rather than network activity. - if (value("Preferences/General/PreventFromSuspend", false).toBool()) { - setPreventFromSuspendWhenDownloading(true); - setPreventFromSuspendWhenSeeding(true); - } - settingsStorage->removeValue("Preferences/General/PreventFromSuspend"); + SettingsStorage::instance()->removeValue("Rss/hosts_cookies"); + SettingsStorage::instance()->removeValue("Preferences/Downloads/AppendLabel"); } void Preferences::apply() diff -Nru qbittorrent-4.1.3/src/base/preferences.h qbittorrent-3.3.15/src/base/preferences.h --- qbittorrent-4.1.3/src/base/preferences.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/preferences.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,7 +1,7 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2014 sledgehammer999 - * Copyright (C) 2006 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * Copyright (C) 2014 sledgehammer999 * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -25,26 +25,25 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org + * Contact : hammered999@gmail.com */ #ifndef PREFERENCES_H #define PREFERENCES_H +#include #include -#include #include -#include -#include -#include -#include -#include #include +#include +#include #include -#include "base/utils/net.h" #include "types.h" -enum SchedulerDays +enum scheduler_days { EVERY_DAY, WEEK_DAYS, @@ -80,7 +79,7 @@ class SettingsStorage; -class Preferences : public QObject +class Preferences: public QObject { Q_OBJECT Q_DISABLE_COPY(Preferences) @@ -90,7 +89,7 @@ const QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const; void setValue(const QString &key, const QVariant &value); - static Preferences *m_instance; + static Preferences* m_instance; signals: void changed(); @@ -98,7 +97,7 @@ public: static void initInstance(); static void freeInstance(); - static Preferences *instance(); + static Preferences* instance(); // General options QString getLocale() const; @@ -115,18 +114,20 @@ void setHideZeroValues(bool b); int getHideZeroComboValues() const; void setHideZeroComboValues(int n); - bool isStatusbarDisplayed() const; - void setStatusbarDisplayed(bool displayed); + bool systrayIntegration() const; + void setSystrayIntegration(bool enabled); bool isToolbarDisplayed() const; void setToolbarDisplayed(bool displayed); + bool minimizeToTray() const; + void setMinimizeToTray(bool b); + bool closeToTray() const; + void setCloseToTray(bool b); bool startMinimized() const; void setStartMinimized(bool b); bool isSplashScreenDisabled() const; void setSplashScreenDisabled(bool b); - bool preventFromSuspendWhenDownloading() const; - void setPreventFromSuspendWhenDownloading(bool b); - bool preventFromSuspendWhenSeeding() const; - void setPreventFromSuspendWhenSeeding(bool b); + bool preventFromSuspend() const; + void setPreventFromSuspend(bool b); #ifdef Q_OS_WIN bool WinStartup() const; void setWinStartup(bool b); @@ -141,8 +142,6 @@ void setScanDirsLastPath(const QString &path); bool isMailNotificationEnabled() const; void setMailNotificationEnabled(bool enabled); - QString getMailNotificationSender() const; - void setMailNotificationSender(const QString &mail); QString getMailNotificationEmail() const; void setMailNotificationEmail(const QString &mail); QString getMailNotificationSMTP() const; @@ -165,56 +164,33 @@ void setSchedulerStartTime(const QTime &time); QTime getSchedulerEndTime() const; void setSchedulerEndTime(const QTime &time); - SchedulerDays getSchedulerDays() const; - void setSchedulerDays(SchedulerDays days); + scheduler_days getSchedulerDays() const; + void setSchedulerDays(scheduler_days days); // Search bool isSearchEnabled() const; void setSearchEnabled(bool enabled); - // HTTP Server bool isWebUiEnabled() const; void setWebUiEnabled(bool enabled); + bool isWebUiLocalAuthEnabled() const; + void setWebUiLocalAuthEnabled(bool enabled); QString getServerDomains() const; void setServerDomains(const QString &str); - QString getWebUiAddress() const; - void setWebUiAddress(const QString &addr); quint16 getWebUiPort() const; void setWebUiPort(quint16 port); bool useUPnPForWebUIPort() const; void setUPnPForWebUIPort(bool enabled); - - // Authentication - bool isWebUiLocalAuthEnabled() const; - void setWebUiLocalAuthEnabled(bool enabled); - bool isWebUiAuthSubnetWhitelistEnabled() const; - void setWebUiAuthSubnetWhitelistEnabled(bool enabled); - QList getWebUiAuthSubnetWhitelist() const; - void setWebUiAuthSubnetWhitelist(QStringList subnets); QString getWebUiUsername() const; void setWebUiUsername(const QString &username); QString getWebUiPassword() const; - void setWebUiPassword(const QString &newPassword); - - // WebUI security - bool isWebUiClickjackingProtectionEnabled() const; - void setWebUiClickjackingProtectionEnabled(bool enabled); - bool isWebUiCSRFProtectionEnabled() const; - void setWebUiCSRFProtectionEnabled(bool enabled); - - // HTTPS + void setWebUiPassword(const QString &new_password); bool isWebUiHttpsEnabled() const; void setWebUiHttpsEnabled(bool enabled); QByteArray getWebUiHttpsCertificate() const; void setWebUiHttpsCertificate(const QByteArray &data); QByteArray getWebUiHttpsKey() const; void setWebUiHttpsKey(const QByteArray &data); - bool isAltWebUiEnabled() const; - void setAltWebUiEnabled(bool enabled); - QString getWebUiRootFolder() const; - void setWebUiRootFolder(const QString &path); - - // Dynamic DNS bool isDynDNSEnabled() const; void setDynDNSEnabled(bool enabled); DNS::Service getDynDNSService() const; @@ -227,7 +203,7 @@ void setDynDNSPassword(const QString &password); // Advanced settings - void setUILockPassword(const QString &clearPassword); + void setUILockPassword(const QString &clear_password); void clearUILockPassword(); QString getUILockPasswordMD5() const; bool isUILocked() const; @@ -283,22 +259,8 @@ void setConfirmTorrentDeletion(bool enabled); bool confirmTorrentRecheck() const; void setConfirmTorrentRecheck(bool enabled); - bool confirmRemoveAllTags() const; - void setConfirmRemoveAllTags(bool enabled); -#ifndef Q_OS_MAC - bool systrayIntegration() const; - void setSystrayIntegration(bool enabled); - bool minimizeToTrayNotified() const; - void setMinimizeToTrayNotified(bool b); - bool minimizeToTray() const; - void setMinimizeToTray(bool b); - bool closeToTray() const; - void setCloseToTray(bool b); - bool closeToTrayNotified() const; - void setCloseToTrayNotified(bool b); TrayIcon::Style trayIconStyle() const; void setTrayIconStyle(TrayIcon::Style style); -#endif // Stuff that don't appear in the Options GUI but are saved // in the same file. @@ -314,8 +276,12 @@ void setMainVSplitterState(const QByteArray &state); QString getMainLastDir() const; void setMainLastDir(const QString &path); - QSize getPrefSize() const; +#ifndef DISABLE_GUI + QSize getPrefSize(const QSize &defaultSize) const; void setPrefSize(const QSize &size); +#endif + QPoint getPrefPos() const; + void setPrefPos(const QPoint &pos); QStringList getPrefHSplitterSizes() const; void setPrefHSplitterSizes(const QStringList &sizes); QByteArray getPeerListState() const; @@ -330,8 +296,8 @@ void setPropVisible(const bool visible); QByteArray getPropTrackerListState() const; void setPropTrackerListState(const QByteArray &state); - QSize getRssGeometrySize() const; - void setRssGeometrySize(const QSize &geometry); + QByteArray getRssGeometry() const; + void setRssGeometry(const QByteArray &geometry); QByteArray getRssHSplitterSizes() const; void setRssHSplitterSizes(const QByteArray &sizes); QStringList getRssOpenFolders() const; @@ -342,30 +308,45 @@ void setRssMainSplitterState(const QByteArray &state); QByteArray getSearchTabHeaderState() const; void setSearchTabHeaderState(const QByteArray &state); - bool getRegexAsFilteringPatternForSearchJob() const; - void setRegexAsFilteringPatternForSearchJob(bool checked); QStringList getSearchEngDisabled() const; void setSearchEngDisabled(const QStringList &engines); + QString getCreateTorLastAddPath() const; + void setCreateTorLastAddPath(const QString &path); + QString getCreateTorLastSavePath() const; + void setCreateTorLastSavePath(const QString &path); + QString getCreateTorTrackers() const; + void setCreateTorTrackers(const QString &path); + QByteArray getCreateTorGeometry() const; + void setCreateTorGeometry(const QByteArray &geometry); + bool getCreateTorIgnoreRatio() const; + void setCreateTorIgnoreRatio(const bool ignore); QString getTorImportLastContentDir() const; void setTorImportLastContentDir(const QString &path); QByteArray getTorImportGeometry() const; void setTorImportGeometry(const QByteArray &geometry); bool getStatusFilterState() const; bool getCategoryFilterState() const; - bool getTagFilterState() const; bool getTrackerFilterState() const; int getTransSelFilter() const; void setTransSelFilter(const int &index); QByteArray getTransHeaderState() const; void setTransHeaderState(const QByteArray &state); - bool getRegexAsFilteringPatternForTransferList() const; - void setRegexAsFilteringPatternForTransferList(bool checked); int getToolbarTextPosition() const; void setToolbarTextPosition(const int position); - // From old RssSettings class - bool isRSSWidgetEnabled() const; - void setRSSWidgetVisible(const bool enabled); + //From old RssSettings class + bool isRSSEnabled() const; + void setRSSEnabled(const bool enabled); + uint getRSSRefreshInterval() const; + void setRSSRefreshInterval(const uint &interval); + int getRSSMaxArticlesPerFeed() const; + void setRSSMaxArticlesPerFeed(const int &nb); + bool isRssDownloadingEnabled() const; + void setRssDownloadingEnabled(const bool b); + QStringList getRssFeedsUrls() const; + void setRssFeedsUrls(const QStringList &rssFeeds); + QStringList getRssFeedsAliases() const; + void setRssFeedsAliases(const QStringList &rssAliases); // Network QList getNetworkCookies() const; @@ -382,7 +363,6 @@ public slots: void setStatusFilterState(bool checked); void setCategoryFilterState(bool checked); - void setTagFilterState(bool checked); void setTrackerFilterState(bool checked); void apply(); diff -Nru qbittorrent-4.1.3/src/base/private/profile_p.cpp qbittorrent-3.3.15/src/base/private/profile_p.cpp --- qbittorrent-4.1.3/src/base/private/profile_p.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/private/profile_p.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,193 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2016 Eugene Shalygin - * Copyright (C) 2012 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "profile_p.h" - -#include - -#include "base/utils/fs.h" - -Private::Profile::Profile(const QString &configurationName) - : m_configurationSuffix {configurationName.isEmpty() ? QString() : QLatin1Char('_') + configurationName} -{ -} - -QString Private::Profile::configurationSuffix() const -{ - return m_configurationSuffix; -} - -QString Private::Profile::profileName() const -{ - return QCoreApplication::applicationName() + configurationSuffix(); -} - -Private::DefaultProfile::DefaultProfile(const QString &configurationName) - : Profile(configurationName) -{ -} - -QString Private::DefaultProfile::baseDirectory() const -{ - return QDir::homePath(); -} - -QString Private::DefaultProfile::cacheLocation() const -{ - return locationWithConfigurationName(QStandardPaths::CacheLocation); -} - -QString Private::DefaultProfile::configLocation() const -{ -#if defined(Q_OS_WIN) - // On Windows QSettings stores files in FOLDERID_RoamingAppData\AppName - return locationWithConfigurationName(QStandardPaths::AppDataLocation); -#else - return locationWithConfigurationName(QStandardPaths::AppConfigLocation); -#endif -} - -QString Private::DefaultProfile::dataLocation() const -{ -#if defined(Q_OS_WIN) || defined (Q_OS_MAC) - return locationWithConfigurationName(QStandardPaths::AppLocalDataLocation); -#else - // on Linux gods know why qBittorrent creates 'data' subdirectory in ~/.local/share/ - return QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) - + QLatin1String("/data/") + profileName() + QLatin1Char('/'); -#endif -} - -QString Private::DefaultProfile::downloadLocation() const -{ -#if defined(Q_OS_WIN) - if (QSysInfo::windowsVersion() <= QSysInfo::WV_XP) // Windows XP - return QDir(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)).absoluteFilePath( - QCoreApplication::translate("fsutils", "Downloads")); -#endif - return QStandardPaths::writableLocation(QStandardPaths::DownloadLocation); -} - -SettingsPtr Private::DefaultProfile::applicationSettings(const QString &name) const -{ -#if defined(Q_OS_WIN) || defined(Q_OS_MAC) - return SettingsPtr(new QSettings(QSettings::IniFormat, QSettings::UserScope, profileName(), name)); -#else - return SettingsPtr(new QSettings(profileName(), name)); -#endif -} - -QString Private::DefaultProfile::locationWithConfigurationName(QStandardPaths::StandardLocation location) const -{ - return QStandardPaths::writableLocation(location) + configurationSuffix(); -} - -Private::CustomProfile::CustomProfile(const QString &rootPath, const QString &configurationName) - : Profile {configurationName} - , m_rootDirectory {QDir(rootPath).absoluteFilePath(this->profileName())} -{ -} - -QString Private::CustomProfile::baseDirectory() const -{ - return m_rootDirectory.canonicalPath(); -} - -QString Private::CustomProfile::cacheLocation() const -{ - return m_rootDirectory.absoluteFilePath(QLatin1String(cacheDirName)); -} - -QString Private::CustomProfile::configLocation() const -{ - return m_rootDirectory.absoluteFilePath(QLatin1String(configDirName)); -} - -QString Private::CustomProfile::dataLocation() const -{ - return m_rootDirectory.absoluteFilePath(QLatin1String(dataDirName)); -} - -QString Private::CustomProfile::downloadLocation() const -{ - return m_rootDirectory.absoluteFilePath(QLatin1String(downloadsDirName)); -} - -SettingsPtr Private::CustomProfile::applicationSettings(const QString &name) const -{ - // here we force QSettings::IniFormat format always because we need it to be portable across platforms -#if defined(Q_OS_WIN) || defined(Q_OS_MAC) - constexpr const char *CONF_FILE_EXTENSION = ".ini"; -#else - constexpr const char *CONF_FILE_EXTENSION = ".conf"; -#endif - const QString settingsFileName {QDir(configLocation()).absoluteFilePath(name + QLatin1String(CONF_FILE_EXTENSION))}; - return SettingsPtr(new QSettings(settingsFileName, QSettings::IniFormat)); -} - -QString Private::NoConvertConverter::fromPortablePath(const QString &portablePath) const -{ - return portablePath; -} - -QString Private::NoConvertConverter::toPortablePath(const QString &path) const -{ - return path; -} - -Private::Converter::Converter(const QString &basePath) - : m_baseDir {basePath} -{ - m_baseDir.makeAbsolute(); -} - -QString Private::Converter::toPortablePath(const QString &path) const -{ - if (path.isEmpty() || m_baseDir.path().isEmpty()) - return path; - -#ifdef Q_OS_WIN - if (QDir::isAbsolutePath(path)) { - QChar driveLeter = path[0].toUpper(); - QChar baseDriveLetter = m_baseDir.path()[0].toUpper(); - bool onSameDrive = (driveLeter.category() == QChar::Letter_Uppercase) && (driveLeter == baseDriveLetter); - if (!onSameDrive) - return path; - } -#endif - return m_baseDir.relativeFilePath(path); -} - -QString Private::Converter::fromPortablePath(const QString &portablePath) const -{ - if (QDir::isAbsolutePath(portablePath)) - return portablePath; - - return QDir::cleanPath(m_baseDir.absoluteFilePath(portablePath)); -} diff -Nru qbittorrent-4.1.3/src/base/private/profile_p.h qbittorrent-3.3.15/src/base/private/profile_p.h --- qbittorrent-4.1.3/src/base/private/profile_p.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/private/profile_p.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,136 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2016 Eugene Shalygin - * Copyright (C) 2012 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef QBT_PROFILE_P_H -#define QBT_PROFILE_P_H - -#include -#include - -#include "base/profile.h" - -namespace Private -{ - class Profile - { - public: - virtual QString baseDirectory() const = 0; - virtual QString cacheLocation() const = 0; - virtual QString configLocation() const = 0; - virtual QString dataLocation() const = 0; - virtual QString downloadLocation() const = 0; - virtual SettingsPtr applicationSettings(const QString &name) const = 0; - - virtual ~Profile() = default; - - /** - * @brief QCoreApplication::applicationName() with optional configuration name appended - */ - QString profileName() const; - - protected: - Profile(const QString &configurationName); - - QString configurationSuffix() const; - private: - QString m_configurationSuffix; - }; - - /// Default implementation. Takes paths from system - class DefaultProfile : public Profile - { - public: - DefaultProfile(const QString &configurationName); - - QString baseDirectory() const override; - QString cacheLocation() const override; - QString configLocation() const override; - QString dataLocation() const override; - QString downloadLocation() const override; - SettingsPtr applicationSettings(const QString &name) const override; - - private: - /** - * @brief Standard path writable location for profile files - * - * @param location location kind - * @return QStandardPaths::writableLocation(location) / configurationName() - */ - QString locationWithConfigurationName(QStandardPaths::StandardLocation location) const; - }; - - /// Custom tree: creates directories under the specified root directory - class CustomProfile : public Profile - { - public: - CustomProfile(const QString &rootPath, const QString &configurationName); - - QString baseDirectory() const override; - QString cacheLocation() const override; - QString configLocation() const override; - QString dataLocation() const override; - QString downloadLocation() const override; - SettingsPtr applicationSettings(const QString &name) const override; - - private: - QDir m_rootDirectory; - static constexpr const char *cacheDirName = "cache"; - static constexpr const char *configDirName = "config"; - static constexpr const char *dataDirName = "data"; - static constexpr const char *downloadsDirName = "downloads"; - }; - - class PathConverter - { - public: - virtual QString toPortablePath(const QString &path) const = 0; - virtual QString fromPortablePath(const QString &portablePath) const = 0; - virtual ~PathConverter() = default; - }; - - class NoConvertConverter : public PathConverter - { - public: - QString toPortablePath(const QString &path) const override; - QString fromPortablePath(const QString &portablePath) const override; - }; - - class Converter : public PathConverter - { - public: - Converter(const QString &basePath); - QString toPortablePath(const QString &path) const override; - QString fromPortablePath(const QString &portablePath) const override; - - private: - QDir m_baseDir; - }; -} - -#endif // QBT_PROFILE_P_H diff -Nru qbittorrent-4.1.3/src/base/profile.cpp qbittorrent-3.3.15/src/base/profile.cpp --- qbittorrent-4.1.3/src/base/profile.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/profile.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,116 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2016 Eugene Shalygin - * Copyright (C) 2012 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "profile.h" - -#include - -#include "private/profile_p.h" - -Profile *Profile::m_instance = nullptr; - -Profile::Profile(Private::Profile *impl, Private::PathConverter *pathConverter) - : m_profileImpl(impl) - , m_pathConverterImpl(pathConverter) -{ - ensureDirectoryExists(SpecialFolder::Cache); - ensureDirectoryExists(SpecialFolder::Config); - ensureDirectoryExists(SpecialFolder::Data); -} - -// to generate correct call to ProfilePrivate::~ProfileImpl() -Profile::~Profile() = default; - -void Profile::initialize(const QString &rootProfilePath, const QString &configurationName, - bool convertPathsToProfileRelative) -{ - QScopedPointer profile(rootProfilePath.isEmpty() - ? static_cast(new Private::DefaultProfile(configurationName)) - : static_cast(new Private::CustomProfile(rootProfilePath, configurationName))); - - QScopedPointer converter(convertPathsToProfileRelative - ? static_cast(new Private::Converter(profile->baseDirectory())) - : static_cast(new Private::NoConvertConverter())); - m_instance = new Profile(profile.take(), converter.take()); -} - -const Profile &Profile::instance() -{ - return *m_instance; -} - -QString Profile::location(SpecialFolder folder) const -{ - QString result; - switch (folder) { - case SpecialFolder::Cache: - result = m_profileImpl->cacheLocation(); - break; - case SpecialFolder::Config: - result = m_profileImpl->configLocation(); - break; - case SpecialFolder::Data: - result = m_profileImpl->dataLocation(); - break; - case SpecialFolder::Downloads: - result = m_profileImpl->downloadLocation(); - break; - } - - if (!result.endsWith(QLatin1Char('/'))) - result += QLatin1Char('/'); - return result; -} - -QString Profile::profileName() const -{ - return m_profileImpl->profileName(); -} - -SettingsPtr Profile::applicationSettings(const QString &name) const -{ - return m_profileImpl->applicationSettings(name); -} - -void Profile::ensureDirectoryExists(SpecialFolder folder) -{ - QString locationPath = location(folder); - if (!locationPath.isEmpty() && !QDir().mkpath(locationPath)) - qFatal("Could not create required directory '%s'", qUtf8Printable(locationPath)); -} - -QString Profile::toPortablePath(const QString &absolutePath) const -{ - return m_pathConverterImpl->toPortablePath(absolutePath); -} - -QString Profile::fromPortablePath(const QString &portablePath) const -{ - return m_pathConverterImpl->fromPortablePath(portablePath); -} diff -Nru qbittorrent-4.1.3/src/base/profile.h qbittorrent-3.3.15/src/base/profile.h --- qbittorrent-4.1.3/src/base/profile.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/profile.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,91 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2016 Eugene Shalygin - * Copyright (C) 2012 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef QBT_PROFILE_H -#define QBT_PROFILE_H - -#include - -#include -#include -#include - -class Application; - -namespace Private -{ - class Profile; - class PathConverter; -} - -using SettingsPtr = std::unique_ptr; - -enum class SpecialFolder -{ - Cache, - Config, - Data, - Downloads -}; - -class Profile -{ -public: - QString location(SpecialFolder folder) const; - SettingsPtr applicationSettings(const QString &name) const; - - /// Returns either default name for configuration file (QCoreApplication::applicationName()) - /// or the value, supplied via parameters - QString profileName() const; - - QString toPortablePath(const QString &absolutePath) const; - QString fromPortablePath(const QString &portablePath) const; - - static const Profile &instance(); - -private: - Profile(Private::Profile *impl, Private::PathConverter *pathConverter); - ~Profile(); - - friend class ::Application; - static void initialize(const QString &rootProfilePath, const QString &configurationName, - bool convertPathsToProfileRelative); - void ensureDirectoryExists(SpecialFolder folder); - - QScopedPointer m_profileImpl; - QScopedPointer m_pathConverterImpl; - static Profile *m_instance; -}; - -inline QString specialFolderLocation(SpecialFolder folder) -{ - return Profile::instance().location(folder); -} - -#endif // QBT_PROFILE_H diff -Nru qbittorrent-4.1.3/src/base/qinisettings.h qbittorrent-3.3.15/src/base/qinisettings.h --- qbittorrent-4.1.3/src/base/qinisettings.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/base/qinisettings.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,73 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef QINISETTINGS_H +#define QINISETTINGS_H + +#include + +class QIniSettings : public QSettings { + Q_OBJECT + Q_DISABLE_COPY (QIniSettings) + +public: + QIniSettings(const QString &organization = "qBittorrent", const QString &application = "qBittorrent", QObject *parent = 0 ): +#if defined(Q_OS_WIN) || defined(Q_OS_MAC) + QSettings(QSettings::IniFormat, QSettings::UserScope, organization, application, parent) +#else + QSettings(organization, application, parent) +#endif + { + + } + + QIniSettings(const QString &fileName, Format format, QObject *parent = 0 ) : QSettings(fileName, format, parent) { + + } + +#ifdef Q_OS_WIN + QVariant value(const QString & key, const QVariant &defaultValue = QVariant()) const { + QString key_tmp(key); + QVariant ret = QSettings::value(key_tmp); + if (ret.isNull()) + return defaultValue; + return ret; + } + + void setValue(const QString &key, const QVariant &val) { + QString key_tmp(key); + if (format() == QSettings::NativeFormat) // Using registry, don't touch replace here + key_tmp.replace("\\", "/"); + QSettings::setValue(key_tmp, val); + } +#endif +}; + +#endif // QINISETTINGS_H diff -Nru qbittorrent-4.1.3/src/base/rss/private/rss_parser.cpp qbittorrent-3.3.15/src/base/rss/private/rss_parser.cpp --- qbittorrent-4.1.3/src/base/rss/private/rss_parser.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/private/rss_parser.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,768 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015 Vladimir Golovnev - * Copyright (C) 2012 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "rss_parser.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../rss_article.h" - -namespace -{ - // (X)HTML entities declared in: - // http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent - // http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent - // http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent - using StringHash = QHash; - Q_GLOBAL_STATIC_WITH_ARGS(StringHash, HTML_ENTITIES, ({ - {"nbsp", " "}, // no-break space = non-breaking space, U+00A0 ISOnum - {"iexcl", "¡"}, // inverted exclamation mark, U+00A1 ISOnum - {"cent", "¢"}, // cent sign, U+00A2 ISOnum - {"pound", "£"}, // pound sign, U+00A3 ISOnum - {"curren", "¤"}, // currency sign, U+00A4 ISOnum - {"yen", "¥"}, // yen sign = yuan sign, U+00A5 ISOnum - {"brvbar", "¦"}, // broken bar = broken vertical bar, U+00A6 ISOnum - {"sect", "§"}, // section sign, U+00A7 ISOnum - {"uml", "¨"}, // diaeresis = spacing diaeresis, U+00A8 ISOdia - {"copy", "©"}, // copyright sign, U+00A9 ISOnum - {"ordf", "ª"}, // feminine ordinal indicator, U+00AA ISOnum - {"laquo", "«"}, // left-pointing double angle quotation mark = left pointing guillemet, U+00AB ISOnum - {"not", "¬"}, // not sign = angled dash, U+00AC ISOnum - {"shy", "­"}, // soft hyphen = discretionary hyphen, U+00AD ISOnum - {"reg", "®"}, // registered sign = registered trade mark sign, U+00AE ISOnum - {"macr", "¯"}, // macron = spacing macron = overline = APL overbar, U+00AF ISOdia - {"deg", "°"}, // degree sign, U+00B0 ISOnum - {"plusmn", "±"}, // plus-minus sign = plus-or-minus sign, U+00B1 ISOnum - {"sup2", "²"}, // superscript two = superscript digit two = squared, U+00B2 ISOnum - {"sup3", "³"}, // superscript three = superscript digit three = cubed, U+00B3 ISOnum - {"acute", "´"}, // acute accent = spacing acute, U+00B4 ISOdia - {"micro", "µ"}, // micro sign, U+00B5 ISOnum - {"para", "¶"}, // pilcrow sign = paragraph sign, U+00B6 ISOnum - {"middot", "·"}, // middle dot = Georgian comma = Greek middle dot, U+00B7 ISOnum - {"cedil", "¸"}, // cedilla = spacing cedilla, U+00B8 ISOdia - {"sup1", "¹"}, // superscript one = superscript digit one, U+00B9 ISOnum - {"ordm", "º"}, // masculine ordinal indicator, U+00BA ISOnum - {"raquo", "»"}, // right-pointing double angle quotation mark = right pointing guillemet, U+00BB ISOnum - {"frac14", "¼"}, // vulgar fraction one quarter = fraction one quarter, U+00BC ISOnum - {"frac12", "½"}, // vulgar fraction one half = fraction one half, U+00BD ISOnum - {"frac34", "¾"}, // vulgar fraction three quarters = fraction three quarters, U+00BE ISOnum - {"iquest", "¿"}, // inverted question mark = turned question mark, U+00BF ISOnum - {"Agrave", "À"}, // latin capital letter A with grave = latin capital letter A grave, U+00C0 ISOlat1 - {"Aacute", "Á"}, // latin capital letter A with acute, U+00C1 ISOlat1 - {"Acirc", "Â"}, // latin capital letter A with circumflex, U+00C2 ISOlat1 - {"Atilde", "Ã"}, // latin capital letter A with tilde, U+00C3 ISOlat1 - {"Auml", "Ä"}, // latin capital letter A with diaeresis, U+00C4 ISOlat1 - {"Aring", "Å"}, // latin capital letter A with ring above = latin capital letter A ring, U+00C5 ISOlat1 - {"AElig", "Æ"}, // latin capital letter AE = latin capital ligature AE, U+00C6 ISOlat1 - {"Ccedil", "Ç"}, // latin capital letter C with cedilla, U+00C7 ISOlat1 - {"Egrave", "È"}, // latin capital letter E with grave, U+00C8 ISOlat1 - {"Eacute", "É"}, // latin capital letter E with acute, U+00C9 ISOlat1 - {"Ecirc", "Ê"}, // latin capital letter E with circumflex, U+00CA ISOlat1 - {"Euml", "Ë"}, // latin capital letter E with diaeresis, U+00CB ISOlat1 - {"Igrave", "Ì"}, // latin capital letter I with grave, U+00CC ISOlat1 - {"Iacute", "Í"}, // latin capital letter I with acute, U+00CD ISOlat1 - {"Icirc", "Î"}, // latin capital letter I with circumflex, U+00CE ISOlat1 - {"Iuml", "Ï"}, // latin capital letter I with diaeresis, U+00CF ISOlat1 - {"ETH", "Ð"}, // latin capital letter ETH, U+00D0 ISOlat1 - {"Ntilde", "Ñ"}, // latin capital letter N with tilde, U+00D1 ISOlat1 - {"Ograve", "Ò"}, // latin capital letter O with grave, U+00D2 ISOlat1 - {"Oacute", "Ó"}, // latin capital letter O with acute, U+00D3 ISOlat1 - {"Ocirc", "Ô"}, // latin capital letter O with circumflex, U+00D4 ISOlat1 - {"Otilde", "Õ"}, // latin capital letter O with tilde, U+00D5 ISOlat1 - {"Ouml", "Ö"}, // latin capital letter O with diaeresis, U+00D6 ISOlat1 - {"times", "×"}, // multiplication sign, U+00D7 ISOnum - {"Oslash", "Ø"}, // latin capital letter O with stroke = latin capital letter O slash, U+00D8 ISOlat1 - {"Ugrave", "Ù"}, // latin capital letter U with grave, U+00D9 ISOlat1 - {"Uacute", "Ú"}, // latin capital letter U with acute, U+00DA ISOlat1 - {"Ucirc", "Û"}, // latin capital letter U with circumflex, U+00DB ISOlat1 - {"Uuml", "Ü"}, // latin capital letter U with diaeresis, U+00DC ISOlat1 - {"Yacute", "Ý"}, // latin capital letter Y with acute, U+00DD ISOlat1 - {"THORN", "Þ"}, // latin capital letter THORN, U+00DE ISOlat1 - {"szlig", "ß"}, // latin small letter sharp s = ess-zed, U+00DF ISOlat1 - {"agrave", "à"}, // latin small letter a with grave = latin small letter a grave, U+00E0 ISOlat1 - {"aacute", "á"}, // latin small letter a with acute, U+00E1 ISOlat1 - {"acirc", "â"}, // latin small letter a with circumflex, U+00E2 ISOlat1 - {"atilde", "ã"}, // latin small letter a with tilde, U+00E3 ISOlat1 - {"auml", "ä"}, // latin small letter a with diaeresis, U+00E4 ISOlat1 - {"aring", "å"}, // latin small letter a with ring above = latin small letter a ring, U+00E5 ISOlat1 - {"aelig", "æ"}, // latin small letter ae = latin small ligature ae, U+00E6 ISOlat1 - {"ccedil", "ç"}, // latin small letter c with cedilla, U+00E7 ISOlat1 - {"egrave", "è"}, // latin small letter e with grave, U+00E8 ISOlat1 - {"eacute", "é"}, // latin small letter e with acute, U+00E9 ISOlat1 - {"ecirc", "ê"}, // latin small letter e with circumflex, U+00EA ISOlat1 - {"euml", "ë"}, // latin small letter e with diaeresis, U+00EB ISOlat1 - {"igrave", "ì"}, // latin small letter i with grave, U+00EC ISOlat1 - {"iacute", "í"}, // latin small letter i with acute, U+00ED ISOlat1 - {"icirc", "î"}, // latin small letter i with circumflex, U+00EE ISOlat1 - {"iuml", "ï"}, // latin small letter i with diaeresis, U+00EF ISOlat1 - {"eth", "ð"}, // latin small letter eth, U+00F0 ISOlat1 - {"ntilde", "ñ"}, // latin small letter n with tilde, U+00F1 ISOlat1 - {"ograve", "ò"}, // latin small letter o with grave, U+00F2 ISOlat1 - {"oacute", "ó"}, // latin small letter o with acute, U+00F3 ISOlat1 - {"ocirc", "ô"}, // latin small letter o with circumflex, U+00F4 ISOlat1 - {"otilde", "õ"}, // latin small letter o with tilde, U+00F5 ISOlat1 - {"ouml", "ö"}, // latin small letter o with diaeresis, U+00F6 ISOlat1 - {"divide", "÷"}, // division sign, U+00F7 ISOnum - {"oslash", "ø"}, // latin small letter o with stroke, = latin small letter o slash, U+00F8 ISOlat1 - {"ugrave", "ù"}, // latin small letter u with grave, U+00F9 ISOlat1 - {"uacute", "ú"}, // latin small letter u with acute, U+00FA ISOlat1 - {"ucirc", "û"}, // latin small letter u with circumflex, U+00FB ISOlat1 - {"uuml", "ü"}, // latin small letter u with diaeresis, U+00FC ISOlat1 - {"yacute", "ý"}, // latin small letter y with acute, U+00FD ISOlat1 - {"thorn", "þ"}, // latin small letter thorn, U+00FE ISOlat1 - {"yuml", "ÿ"}, // latin small letter y with diaeresis, U+00FF ISOlat1 - - // Latin Extended-A - {"OElig", "Œ"}, // latin capital ligature OE, U+0152 ISOlat2 - {"oelig", "œ"}, // latin small ligature oe, U+0153 ISOlat2 - // ligature is a misnomer, this is a separate character in some languages - {"Scaron", "Š"}, // latin capital letter S with caron, U+0160 ISOlat2 - {"scaron", "š"}, // latin small letter s with caron, U+0161 ISOlat2 - {"Yuml", "Ÿ"}, // latin capital letter Y with diaeresis, U+0178 ISOlat2 - - // Spacing Modifier Letters - {"circ", "ˆ"}, // modifier letter circumflex accent, U+02C6 ISOpub - {"tilde", "˜"}, // small tilde, U+02DC ISOdia - - // General Punctuation - {"ensp", " "}, // en space, U+2002 ISOpub - {"emsp", " "}, // em space, U+2003 ISOpub - {"thinsp", " "}, // thin space, U+2009 ISOpub - {"zwnj", "‌"}, // zero width non-joiner, U+200C NEW RFC 2070 - {"zwj", "‍"}, // zero width joiner, U+200D NEW RFC 2070 - {"lrm", "‎"}, // left-to-right mark, U+200E NEW RFC 2070 - {"rlm", "‏"}, // right-to-left mark, U+200F NEW RFC 2070 - {"ndash", "–"}, // en dash, U+2013 ISOpub - {"mdash", "—"}, // em dash, U+2014 ISOpub - {"lsquo", "‘"}, // left single quotation mark, U+2018 ISOnum - {"rsquo", "’"}, // right single quotation mark, U+2019 ISOnum - {"sbquo", "‚"}, // single low-9 quotation mark, U+201A NEW - {"ldquo", "“"}, // left double quotation mark, U+201C ISOnum - {"rdquo", "”"}, // right double quotation mark, U+201D ISOnum - {"bdquo", "„"}, // double low-9 quotation mark, U+201E NEW - {"dagger", "†"}, // dagger, U+2020 ISOpub - {"Dagger", "‡"}, // double dagger, U+2021 ISOpub - {"permil", "‰"}, // per mille sign, U+2030 ISOtech - {"lsaquo", "‹"}, // single left-pointing angle quotation mark, U+2039 ISO proposed - // lsaquo is proposed but not yet ISO standardized - {"rsaquo", "›"}, // single right-pointing angle quotation mark, U+203A ISO proposed - // rsaquo is proposed but not yet ISO standardized - - // Currency Symbols - {"euro", "€"}, // euro sign, U+20AC NEW - - // Latin Extended-B - {"fnof", "ƒ"}, // latin small letter f with hook = function = florin, U+0192 ISOtech - - // Greek - {"Alpha", "Α"}, // greek capital letter alpha, U+0391 - {"Beta", "Β"}, // greek capital letter beta, U+0392 - {"Gamma", "Γ"}, // greek capital letter gamma, U+0393 ISOgrk3 - {"Delta", "Δ"}, // greek capital letter delta, U+0394 ISOgrk3 - {"Epsilon", "Ε"}, // greek capital letter epsilon, U+0395 - {"Zeta", "Ζ"}, // greek capital letter zeta, U+0396 - {"Eta", "Η"}, // greek capital letter eta, U+0397 - {"Theta", "Θ"}, // greek capital letter theta, U+0398 ISOgrk3 - {"Iota", "Ι"}, // greek capital letter iota, U+0399 - {"Kappa", "Κ"}, // greek capital letter kappa, U+039A - {"Lambda", "Λ"}, // greek capital letter lamda, U+039B ISOgrk3 - {"Mu", "Μ"}, // greek capital letter mu, U+039C - {"Nu", "Ν"}, // greek capital letter nu, U+039D - {"Xi", "Ξ"}, // greek capital letter xi, U+039E ISOgrk3 - {"Omicron", "Ο"}, // greek capital letter omicron, U+039F - {"Pi", "Π"}, // greek capital letter pi, U+03A0 ISOgrk3 - {"Rho", "Ρ"}, // greek capital letter rho, U+03A1 - {"Sigma", "Σ"}, // greek capital letter sigma, U+03A3 ISOgrk3 - {"Tau", "Τ"}, // greek capital letter tau, U+03A4 - {"Upsilon", "Υ"}, // greek capital letter upsilon, U+03A5 ISOgrk3 - {"Phi", "Φ"}, // greek capital letter phi, U+03A6 ISOgrk3 - {"Chi", "Χ"}, // greek capital letter chi, U+03A7 - {"Psi", "Ψ"}, // greek capital letter psi, U+03A8 ISOgrk3 - {"Omega", "Ω"}, // greek capital letter omega, U+03A9 ISOgrk3 - {"alpha", "α"}, // greek small letter alpha, U+03B1 ISOgrk3 - {"beta", "β"}, // greek small letter beta, U+03B2 ISOgrk3 - {"gamma", "γ"}, // greek small letter gamma, U+03B3 ISOgrk3 - {"delta", "δ"}, // greek small letter delta, U+03B4 ISOgrk3 - {"epsilon", "ε"}, // greek small letter epsilon, U+03B5 ISOgrk3 - {"zeta", "ζ"}, // greek small letter zeta, U+03B6 ISOgrk3 - {"eta", "η"}, // greek small letter eta, U+03B7 ISOgrk3 - {"theta", "θ"}, // greek small letter theta, U+03B8 ISOgrk3 - {"iota", "ι"}, // greek small letter iota, U+03B9 ISOgrk3 - {"kappa", "κ"}, // greek small letter kappa, U+03BA ISOgrk3 - {"lambda", "λ"}, // greek small letter lamda, U+03BB ISOgrk3 - {"mu", "μ"}, // greek small letter mu, U+03BC ISOgrk3 - {"nu", "ν"}, // greek small letter nu, U+03BD ISOgrk3 - {"xi", "ξ"}, // greek small letter xi, U+03BE ISOgrk3 - {"omicron", "ο"}, // greek small letter omicron, U+03BF NEW - {"pi", "π"}, // greek small letter pi, U+03C0 ISOgrk3 - {"rho", "ρ"}, // greek small letter rho, U+03C1 ISOgrk3 - {"sigmaf", "ς"}, // greek small letter final sigma, U+03C2 ISOgrk3 - {"sigma", "σ"}, // greek small letter sigma, U+03C3 ISOgrk3 - {"tau", "τ"}, // greek small letter tau, U+03C4 ISOgrk3 - {"upsilon", "υ"}, // greek small letter upsilon, U+03C5 ISOgrk3 - {"phi", "φ"}, // greek small letter phi, U+03C6 ISOgrk3 - {"chi", "χ"}, // greek small letter chi, U+03C7 ISOgrk3 - {"psi", "ψ"}, // greek small letter psi, U+03C8 ISOgrk3 - {"omega", "ω"}, // greek small letter omega, U+03C9 ISOgrk3 - {"thetasym", "ϑ"}, // greek theta symbol, U+03D1 NEW - {"upsih", "ϒ"}, // greek upsilon with hook symbol, U+03D2 NEW - {"piv", "ϖ"}, // greek pi symbol, U+03D6 ISOgrk3 - - // General Punctuation - {"bull", "•"}, // bullet = black small circle, U+2022 ISOpub - // bullet is NOT the same as bullet operator, U+2219 - {"hellip", "…"}, // horizontal ellipsis = three dot leader, U+2026 ISOpub - {"prime", "′"}, // prime = minutes = feet, U+2032 ISOtech - {"Prime", "″"}, // double prime = seconds = inches, U+2033 ISOtech - {"oline", "‾"}, // overline = spacing overscore, U+203E NEW - {"frasl", "⁄"}, // fraction slash, U+2044 NEW - - // Letterlike Symbols - {"weierp", "℘"}, // script capital P = power set = Weierstrass p, U+2118 ISOamso - {"image", "ℑ"}, // black-letter capital I = imaginary part, U+2111 ISOamso - {"real", "ℜ"}, // black-letter capital R = real part symbol, U+211C ISOamso - {"trade", "™"}, // trade mark sign, U+2122 ISOnum - {"alefsym", "ℵ"}, // alef symbol = first transfinite cardinal, U+2135 NEW - // alef symbol is NOT the same as hebrew letter alef, - // U+05D0 although the same glyph could be used to depict both characters - - // Arrows - {"larr", "←"}, // leftwards arrow, U+2190 ISOnum - {"uarr", "↑"}, // upwards arrow, U+2191 ISOnum - {"rarr", "→"}, // rightwards arrow, U+2192 ISOnum - {"darr", "↓"}, // downwards arrow, U+2193 ISOnum - {"harr", "↔"}, // left right arrow, U+2194 ISOamsa - {"crarr", "↵"}, // downwards arrow with corner leftwards = carriage return, U+21B5 NEW - {"lArr", "⇐"}, // leftwards double arrow, U+21D0 ISOtech - // Unicode does not say that lArr is the same as the 'is implied by' arrow - // but also does not have any other character for that function. So lArr can - // be used for 'is implied by' as ISOtech suggests - {"uArr", "⇑"}, // upwards double arrow, U+21D1 ISOamsa - {"rArr", "⇒"}, // rightwards double arrow, U+21D2 ISOtech - // Unicode does not say this is the 'implies' character but does not have - // another character with this function so rArr can be used for 'implies' - // as ISOtech suggests - {"dArr", "⇓"}, // downwards double arrow, U+21D3 ISOamsa - {"hArr", "⇔"}, // left right double arrow, U+21D4 ISOamsa - - // Mathematical Operators - {"forall", "∀"}, // for all, U+2200 ISOtech - {"part", "∂"}, // partial differential, U+2202 ISOtech - {"exist", "∃"}, // there exists, U+2203 ISOtech - {"empty", "∅"}, // empty set = null set, U+2205 ISOamso - {"nabla", "∇"}, // nabla = backward difference, U+2207 ISOtech - {"isin", "∈"}, // element of, U+2208 ISOtech - {"notin", "∉"}, // not an element of, U+2209 ISOtech - {"ni", "∋"}, // contains as member, U+220B ISOtech - {"prod", "∏"}, // n-ary product = product sign, U+220F ISOamsb - // prod is NOT the same character as U+03A0 'greek capital letter pi' though - // the same glyph might be used for both - {"sum", "∑"}, // n-ary summation, U+2211 ISOamsb - // sum is NOT the same character as U+03A3 'greek capital letter sigma' - // though the same glyph might be used for both - {"minus", "−"}, // minus sign, U+2212 ISOtech - {"lowast", "∗"}, // asterisk operator, U+2217 ISOtech - {"radic", "√"}, // square root = radical sign, U+221A ISOtech - {"prop", "∝"}, // proportional to, U+221D ISOtech - {"infin", "∞"}, // infinity, U+221E ISOtech - {"ang", "∠"}, // angle, U+2220 ISOamso - {"and", "∧"}, // logical and = wedge, U+2227 ISOtech - {"or", "∨"}, // logical or = vee, U+2228 ISOtech - {"cap", "∩"}, // intersection = cap, U+2229 ISOtech - {"cup", "∪"}, // union = cup, U+222A ISOtech - {"int", "∫"}, // integral, U+222B ISOtech - {"there4", "∴"}, // therefore, U+2234 ISOtech - {"sim", "∼"}, // tilde operator = varies with = similar to, U+223C ISOtech - // tilde operator is NOT the same character as the tilde, U+007E, - // although the same glyph might be used to represent both - {"cong", "≅"}, // approximately equal to, U+2245 ISOtech - {"asymp", "≈"}, // almost equal to = asymptotic to, U+2248 ISOamsr - {"ne", "≠"}, // not equal to, U+2260 ISOtech - {"equiv", "≡"}, // identical to, U+2261 ISOtech - {"le", "≤"}, // less-than or equal to, U+2264 ISOtech - {"ge", "≥"}, // greater-than or equal to, U+2265 ISOtech - {"sub", "⊂"}, // subset of, U+2282 ISOtech - {"sup", "⊃"}, // superset of, U+2283 ISOtech - {"nsub", "⊄"}, // not a subset of, U+2284 ISOamsn - {"sube", "⊆"}, // subset of or equal to, U+2286 ISOtech - {"supe", "⊇"}, // superset of or equal to, U+2287 ISOtech - {"oplus", "⊕"}, // circled plus = direct sum, U+2295 ISOamsb - {"otimes", "⊗"}, // circled times = vector product, U+2297 ISOamsb - {"perp", "⊥"}, // up tack = orthogonal to = perpendicular, U+22A5 ISOtech - {"sdot", "⋅"}, // dot operator, U+22C5 ISOamsb - // dot operator is NOT the same character as U+00B7 middle dot - - // Miscellaneous Technical - {"lceil", "⌈"}, // left ceiling = APL upstile, U+2308 ISOamsc - {"rceil", "⌉"}, // right ceiling, U+2309 ISOamsc - {"lfloor", "⌊"}, // left floor = APL downstile, U+230A ISOamsc - {"rfloor", "⌋"}, // right floor, U+230B ISOamsc - {"lang", "〈"}, // left-pointing angle bracket = bra, U+2329 ISOtech - // lang is NOT the same character as U+003C 'less than sign' - // or U+2039 'single left-pointing angle quotation mark' - {"rang", "〉"}, // right-pointing angle bracket = ket, U+232A ISOtech - // rang is NOT the same character as U+003E 'greater than sign' - // or U+203A 'single right-pointing angle quotation mark' - - // Geometric Shapes - {"loz", "◊"}, // lozenge, U+25CA ISOpub - - // Miscellaneous Symbols - {"spades", "♠"}, // black spade suit, U+2660 ISOpub - {"clubs", "♣"}, // black club suit = shamrock, U+2663 ISOpub - {"hearts", "♥"}, // black heart suit = valentine, U+2665 ISOpub - {"diams", "♦"} // black diamond suit, U+2666 ISOpub - })) - - class XmlStreamEntityResolver : public QXmlStreamEntityResolver - { - public: - QString resolveUndeclaredEntity(const QString &name) override - { - return HTML_ENTITIES->value(name); - } - }; - - const char shortDay[][4] = { - "Mon", "Tue", "Wed", - "Thu", "Fri", "Sat", - "Sun" - }; - - const char longDay[][10] = { - "Monday", "Tuesday", "Wednesday", - "Thursday", "Friday", "Saturday", - "Sunday" - }; - - const char shortMonth[][4] = { - "Jan", "Feb", "Mar", "Apr", - "May", "Jun", "Jul", "Aug", - "Sep", "Oct", "Nov", "Dec" - }; - - // Ported to Qt from KDElibs4 - QDateTime parseDate(const QString &string) - { - const QString str = string.trimmed(); - if (str.isEmpty()) - return QDateTime::currentDateTime(); - - int nyear = 6; // indexes within string to values - int nmonth = 4; - int nday = 2; - int nwday = 1; - int nhour = 7; - int nmin = 8; - int nsec = 9; - // Also accept obsolete form "Weekday, DD-Mon-YY HH:MM:SS ±hhmm" - QRegExp rx("^(?:([A-Z][a-z]+),\\s*)?(\\d{1,2})(\\s+|-)([^-\\s]+)(\\s+|-)(\\d{2,4})\\s+(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s+(\\S+)$"); - QStringList parts; - if (!str.indexOf(rx)) { - // Check that if date has '-' separators, both separators are '-'. - parts = rx.capturedTexts(); - bool h1 = (parts[3] == QLatin1String("-")); - bool h2 = (parts[5] == QLatin1String("-")); - if (h1 != h2) - return QDateTime::currentDateTime(); - } - else { - // Check for the obsolete form "Wdy Mon DD HH:MM:SS YYYY" - rx = QRegExp("^([A-Z][a-z]+)\\s+(\\S+)\\s+(\\d\\d)\\s+(\\d\\d):(\\d\\d):(\\d\\d)\\s+(\\d\\d\\d\\d)$"); - if (str.indexOf(rx)) - return QDateTime::currentDateTime(); - nyear = 7; - nmonth = 2; - nday = 3; - nwday = 1; - nhour = 4; - nmin = 5; - nsec = 6; - parts = rx.capturedTexts(); - } - - bool ok[4]; - const int day = parts[nday].toInt(&ok[0]); - int year = parts[nyear].toInt(&ok[1]); - const int hour = parts[nhour].toInt(&ok[2]); - const int minute = parts[nmin].toInt(&ok[3]); - if (!ok[0] || !ok[1] || !ok[2] || !ok[3]) - return QDateTime::currentDateTime(); - - int second = 0; - if (!parts[nsec].isEmpty()) { - second = parts[nsec].toInt(&ok[0]); - if (!ok[0]) - return QDateTime::currentDateTime(); - } - - bool leapSecond = (second == 60); - if (leapSecond) - second = 59; // apparently a leap second - validate below, once time zone is known - int month = 0; - for ( ; (month < 12) && (parts[nmonth] != shortMonth[month]); ++month); - int dayOfWeek = -1; - if (!parts[nwday].isEmpty()) { - // Look up the weekday name - while (++dayOfWeek < 7 && (shortDay[dayOfWeek] != parts[nwday])); - if (dayOfWeek >= 7) - for (dayOfWeek = 0; dayOfWeek < 7 && (longDay[dayOfWeek] != parts[nwday]); ++dayOfWeek); - } - - // if (month >= 12 || dayOfWeek >= 7 - // || (dayOfWeek < 0 && format == RFCDateDay)) - // return QDateTime; - int i = parts[nyear].size(); - if (i < 4) { - // It's an obsolete year specification with less than 4 digits - year += (i == 2 && year < 50) ? 2000 : 1900; - } - - // Parse the UTC offset part - int offset = 0; // set default to '-0000' - bool negOffset = false; - if (parts.count() > 10) { - rx = QRegExp("^([+-])(\\d\\d)(\\d\\d)$"); - if (!parts[10].indexOf(rx)) { - // It's a UTC offset ±hhmm - parts = rx.capturedTexts(); - offset = parts[2].toInt(&ok[0]) * 3600; - int offsetMin = parts[3].toInt(&ok[1]); - if (!ok[0] || !ok[1] || offsetMin > 59) - return QDateTime(); - offset += offsetMin * 60; - negOffset = (parts[1] == QLatin1String("-")); - if (negOffset) - offset = -offset; - } - else { - // Check for an obsolete time zone name - QByteArray zone = parts[10].toLatin1(); - if (zone.length() == 1 && isalpha(zone[0]) && toupper(zone[0]) != 'J') { - negOffset = true; // military zone: RFC 2822 treats as '-0000' - } - else if (zone != "UT" && zone != "GMT") { // treated as '+0000' - offset = (zone == "EDT") - ? -4 * 3600 - : ((zone == "EST") || (zone == "CDT")) - ? -5 * 3600 - : ((zone == "CST") || (zone == "MDT")) - ? -6 * 3600 - : (zone == "MST" || zone == "PDT") - ? -7 * 3600 - : (zone == "PST") - ? -8 * 3600 - : 0; - if (!offset) { - // Check for any other alphabetic time zone - bool nonalpha = false; - for (int i = 0, end = zone.size(); (i < end) && !nonalpha; ++i) - nonalpha = !isalpha(zone[i]); - if (nonalpha) - return QDateTime(); - // TODO: Attempt to recognize the time zone abbreviation? - negOffset = true; // unknown time zone: RFC 2822 treats as '-0000' - } - } - } - } - - QDate qdate(year, month + 1, day); // convert date, and check for out-of-range - if (!qdate.isValid()) - return QDateTime::currentDateTime(); - - QTime qTime(hour, minute, second); - QDateTime result(qdate, qTime, Qt::UTC); - if (offset) - result = result.addSecs(-offset); - if (!result.isValid()) - return QDateTime::currentDateTime(); // invalid date/time - - if (leapSecond) { - // Validate a leap second time. Leap seconds are inserted after 23:59:59 UTC. - // Convert the time to UTC and check that it is 00:00:00. - if ((hour*3600 + minute*60 + 60 - offset + 86400*5) % 86400) // (max abs(offset) is 100 hours) - return QDateTime::currentDateTime(); // the time isn't the last second of the day - } - - return result; - } -} - -using namespace RSS::Private; - -const int ParsingResultTypeId = qRegisterMetaType(); - -Parser::Parser(QString lastBuildDate) -{ - m_result.lastBuildDate = lastBuildDate; -} - -void Parser::parse(const QByteArray &feedData) -{ - QMetaObject::invokeMethod(this, "parse_impl", Qt::QueuedConnection - , Q_ARG(QByteArray, feedData)); -} - -// read and create items from a rss document -void Parser::parse_impl(const QByteArray &feedData) -{ - QXmlStreamReader xml(feedData); - XmlStreamEntityResolver resolver; - xml.setEntityResolver(&resolver); - bool foundChannel = false; - - while (xml.readNextStartElement()) { - if (xml.name() == "rss") { - // Find channels - while (xml.readNextStartElement()) { - if (xml.name() == "channel") { - parseRSSChannel(xml); - foundChannel = true; - break; - } - else { - qDebug() << "Skip rss item: " << xml.name(); - xml.skipCurrentElement(); - } - } - break; - } - else if (xml.name() == "feed") { // Atom feed - parseAtomChannel(xml); - foundChannel = true; - break; - } - else { - qDebug() << "Skip root item: " << xml.name(); - xml.skipCurrentElement(); - } - } - - if (!foundChannel) { - m_result.error = tr("Invalid RSS feed."); - } - else if (xml.hasError()) { - m_result.error = tr("%1 (line: %2, column: %3, offset: %4).") - .arg(xml.errorString()).arg(xml.lineNumber()) - .arg(xml.columnNumber()).arg(xml.characterOffset()); - } - else { - // Sort article list chronologically - // NOTE: We don't need to sort it here if articles are always - // sorted in fetched XML in reverse chronological order - std::sort(m_result.articles.begin(), m_result.articles.end() - , [](const QVariantHash &a1, const QVariantHash &a2) - { - return a1["date"].toDateTime() < a2["date"].toDateTime(); - }); - } - - emit finished(m_result); - m_result.articles.clear(); // clear articles only -} - -void Parser::parseRssArticle(QXmlStreamReader &xml) -{ - QVariantHash article; - - while (!xml.atEnd()) { - xml.readNext(); - const QString name(xml.name().toString()); - - if (xml.isEndElement() && (name == QLatin1String("item"))) - break; - - if (xml.isStartElement()) { - if (name == QLatin1String("title")) { - article[Article::KeyTitle] = xml.readElementText().trimmed(); - } - else if (name == QLatin1String("enclosure")) { - if (xml.attributes().value("type") == QLatin1String("application/x-bittorrent")) - article[Article::KeyTorrentURL] = xml.attributes().value(QLatin1String("url")).toString(); - } - else if (name == QLatin1String("link")) { - const QString text {xml.readElementText().trimmed()}; - if (text.startsWith(QLatin1String("magnet:"), Qt::CaseInsensitive)) - article[Article::KeyTorrentURL] = text; // magnet link instead of a news URL - else - article[Article::KeyLink] = text; - } - else if (name == QLatin1String("description")) { - article[Article::KeyDescription] = xml.readElementText(QXmlStreamReader::IncludeChildElements); - } - else if (name == QLatin1String("pubDate")) { - article[Article::KeyDate] = parseDate(xml.readElementText().trimmed()); - } - else if (name == QLatin1String("author")) { - article[Article::KeyAuthor] = xml.readElementText().trimmed(); - } - else if (name == QLatin1String("guid")) { - article[Article::KeyId] = xml.readElementText().trimmed(); - } - else { - article[name] = xml.readElementText(QXmlStreamReader::IncludeChildElements); - } - } - } - - m_result.articles.prepend(article); -} - -void Parser::parseRSSChannel(QXmlStreamReader &xml) -{ - while (!xml.atEnd()) { - xml.readNext(); - - if (xml.isStartElement()) { - if (xml.name() == QLatin1String("title")) { - m_result.title = xml.readElementText(); - } - else if (xml.name() == QLatin1String("lastBuildDate")) { - QString lastBuildDate = xml.readElementText(); - if (!lastBuildDate.isEmpty()) { - if (m_result.lastBuildDate == lastBuildDate) { - qDebug() << "The RSS feed has not changed since last time, aborting parsing."; - return; - } - m_result.lastBuildDate = lastBuildDate; - } - } - else if (xml.name() == QLatin1String("item")) { - parseRssArticle(xml); - } - } - } -} - -void Parser::parseAtomArticle(QXmlStreamReader &xml) -{ - QVariantHash article; - bool doubleContent = false; - - while (!xml.atEnd()) { - xml.readNext(); - const QString name(xml.name().toString()); - - if (xml.isEndElement() && (name == QLatin1String("entry"))) - break; - - if (xml.isStartElement()) { - if (name == QLatin1String("title")) { - article[Article::KeyTitle] = xml.readElementText().trimmed(); - } - else if (name == QLatin1String("link")) { - QString link = (xml.attributes().isEmpty() - ? xml.readElementText().trimmed() - : xml.attributes().value(QLatin1String("href")).toString()); - - if (link.startsWith(QLatin1String("magnet:"), Qt::CaseInsensitive)) - article[Article::KeyTorrentURL] = link; // magnet link instead of a news URL - else - // Atom feeds can have relative links, work around this and - // take the stress of figuring article full URI from UI - // Assemble full URI - article[Article::KeyLink] = (m_baseUrl.isEmpty() ? link : m_baseUrl + link); - - } - else if ((name == QLatin1String("summary")) || (name == QLatin1String("content"))) { - if (doubleContent) { // Duplicate content -> ignore - xml.skipCurrentElement(); - continue; - } - - // Try to also parse broken articles, which don't use html '&' escapes - // Actually works great for non-broken content too - QString feedText = xml.readElementText(QXmlStreamReader::IncludeChildElements).trimmed(); - if (!feedText.isEmpty()) { - article[Article::KeyDescription] = feedText; - doubleContent = true; - } - } - else if (name == QLatin1String("updated")) { - // ATOM uses standard compliant date, don't do fancy stuff - QDateTime articleDate = QDateTime::fromString(xml.readElementText().trimmed(), Qt::ISODate); - article[Article::KeyDate] = (articleDate.isValid() ? articleDate : QDateTime::currentDateTime()); - } - else if (name == QLatin1String("author")) { - while (xml.readNextStartElement()) { - if (xml.name() == QLatin1String("name")) - article[Article::KeyAuthor] = xml.readElementText().trimmed(); - else - xml.skipCurrentElement(); - } - } - else if (name == QLatin1String("id")) { - article[Article::KeyId] = xml.readElementText().trimmed(); - } - else { - article[name] = xml.readElementText(QXmlStreamReader::IncludeChildElements); - } - } - } - - m_result.articles.prepend(article); -} - -void Parser::parseAtomChannel(QXmlStreamReader &xml) -{ - m_baseUrl = xml.attributes().value("xml:base").toString(); - - while (!xml.atEnd()) { - xml.readNext(); - - if (xml.isStartElement()) { - if (xml.name() == QLatin1String("title")) { - m_result.title = xml.readElementText(); - } - else if (xml.name() == QLatin1String("updated")) { - QString lastBuildDate = xml.readElementText(); - if (!lastBuildDate.isEmpty()) { - if (m_result.lastBuildDate == lastBuildDate) { - qDebug() << "The RSS feed has not changed since last time, aborting parsing."; - return; - } - m_result.lastBuildDate = lastBuildDate; - } - } - else if (xml.name() == QLatin1String("entry")) { - parseAtomArticle(xml); - } - } - } -} diff -Nru qbittorrent-4.1.3/src/base/rss/private/rssparser.cpp qbittorrent-3.3.15/src/base/rss/private/rssparser.cpp --- qbittorrent-4.1.3/src/base/rss/private/rssparser.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/private/rssparser.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,467 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2015 Vladimir Golovnev + * Copyright (C) 2012 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#include +#include +#include +#include +#include +#include + +#include "rssparser.h" + +namespace +{ + const char shortDay[][4] = { + "Mon", "Tue", "Wed", + "Thu", "Fri", "Sat", + "Sun" + }; + + const char longDay[][10] = { + "Monday", "Tuesday", "Wednesday", + "Thursday", "Friday", "Saturday", + "Sunday" + }; + + const char shortMonth[][4] = { + "Jan", "Feb", "Mar", "Apr", + "May", "Jun", "Jul", "Aug", + "Sep", "Oct", "Nov", "Dec" + }; + + // Ported to Qt from KDElibs4 + QDateTime parseDate(const QString &string) + { + const QString str = string.trimmed(); + if (str.isEmpty()) + return QDateTime::currentDateTime(); + + int nyear = 6; // indexes within string to values + int nmonth = 4; + int nday = 2; + int nwday = 1; + int nhour = 7; + int nmin = 8; + int nsec = 9; + // Also accept obsolete form "Weekday, DD-Mon-YY HH:MM:SS ±hhmm" + QRegExp rx("^(?:([A-Z][a-z]+),\\s*)?(\\d{1,2})(\\s+|-)([^-\\s]+)(\\s+|-)(\\d{2,4})\\s+(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s+(\\S+)$"); + QStringList parts; + if (!str.indexOf(rx)) { + // Check that if date has '-' separators, both separators are '-'. + parts = rx.capturedTexts(); + bool h1 = (parts[3] == QLatin1String("-")); + bool h2 = (parts[5] == QLatin1String("-")); + if (h1 != h2) + return QDateTime::currentDateTime(); + } + else { + // Check for the obsolete form "Wdy Mon DD HH:MM:SS YYYY" + rx = QRegExp("^([A-Z][a-z]+)\\s+(\\S+)\\s+(\\d\\d)\\s+(\\d\\d):(\\d\\d):(\\d\\d)\\s+(\\d\\d\\d\\d)$"); + if (str.indexOf(rx)) + return QDateTime::currentDateTime(); + nyear = 7; + nmonth = 2; + nday = 3; + nwday = 1; + nhour = 4; + nmin = 5; + nsec = 6; + parts = rx.capturedTexts(); + } + + bool ok[4]; + const int day = parts[nday].toInt(&ok[0]); + int year = parts[nyear].toInt(&ok[1]); + const int hour = parts[nhour].toInt(&ok[2]); + const int minute = parts[nmin].toInt(&ok[3]); + if (!ok[0] || !ok[1] || !ok[2] || !ok[3]) + return QDateTime::currentDateTime(); + + int second = 0; + if (!parts[nsec].isEmpty()) { + second = parts[nsec].toInt(&ok[0]); + if (!ok[0]) + return QDateTime::currentDateTime(); + } + + bool leapSecond = (second == 60); + if (leapSecond) + second = 59; // apparently a leap second - validate below, once time zone is known + int month = 0; + for ( ; (month < 12) && (parts[nmonth] != shortMonth[month]); ++month); + int dayOfWeek = -1; + if (!parts[nwday].isEmpty()) { + // Look up the weekday name + while (++dayOfWeek < 7 && (shortDay[dayOfWeek] != parts[nwday])); + if (dayOfWeek >= 7) + for (dayOfWeek = 0; dayOfWeek < 7 && (longDay[dayOfWeek] != parts[nwday]); ++dayOfWeek); + } + + // if (month >= 12 || dayOfWeek >= 7 + // || (dayOfWeek < 0 && format == RFCDateDay)) + // return QDateTime; + int i = parts[nyear].size(); + if (i < 4) { + // It's an obsolete year specification with less than 4 digits + year += (i == 2 && year < 50) ? 2000 : 1900; + } + + // Parse the UTC offset part + int offset = 0; // set default to '-0000' + bool negOffset = false; + if (parts.count() > 10) { + rx = QRegExp("^([+-])(\\d\\d)(\\d\\d)$"); + if (!parts[10].indexOf(rx)) { + // It's a UTC offset ±hhmm + parts = rx.capturedTexts(); + offset = parts[2].toInt(&ok[0]) * 3600; + int offsetMin = parts[3].toInt(&ok[1]); + if (!ok[0] || !ok[1] || offsetMin > 59) + return QDateTime(); + offset += offsetMin * 60; + negOffset = (parts[1] == QLatin1String("-")); + if (negOffset) + offset = -offset; + } + else { + // Check for an obsolete time zone name + QByteArray zone = parts[10].toLatin1(); + if (zone.length() == 1 && isalpha(zone[0]) && toupper(zone[0]) != 'J') { + negOffset = true; // military zone: RFC 2822 treats as '-0000' + } + else if (zone != "UT" && zone != "GMT") { // treated as '+0000' + offset = (zone == "EDT") + ? -4 * 3600 + : ((zone == "EST") || (zone == "CDT")) + ? -5 * 3600 + : ((zone == "CST") || (zone == "MDT")) + ? -6 * 3600 + : (zone == "MST" || zone == "PDT") + ? -7 * 3600 + : (zone == "PST") + ? -8 * 3600 + : 0; + if (!offset) { + // Check for any other alphabetic time zone + bool nonalpha = false; + for (int i = 0, end = zone.size(); (i < end) && !nonalpha; ++i) + nonalpha = !isalpha(zone[i]); + if (nonalpha) + return QDateTime(); + // TODO: Attempt to recognize the time zone abbreviation? + negOffset = true; // unknown time zone: RFC 2822 treats as '-0000' + } + } + } + } + + QDate qdate(year, month + 1, day); // convert date, and check for out-of-range + if (!qdate.isValid()) + return QDateTime::currentDateTime(); + + QTime qTime(hour, minute, second); + QDateTime result(qdate, qTime, Qt::UTC); + if (offset) + result = result.addSecs(-offset); + if (!result.isValid()) + return QDateTime::currentDateTime(); // invalid date/time + + if (leapSecond) { + // Validate a leap second time. Leap seconds are inserted after 23:59:59 UTC. + // Convert the time to UTC and check that it is 00:00:00. + if ((hour*3600 + minute*60 + 60 - offset + 86400*5) % 86400) // (max abs(offset) is 100 hours) + return QDateTime::currentDateTime(); // the time isn't the last second of the day + } + + return result; + } +} + +using namespace Rss::Private; + +// read and create items from a rss document +void Parser::parse(const QByteArray &feedData) +{ + qDebug() << Q_FUNC_INFO; + + QXmlStreamReader xml(feedData); + bool foundChannel = false; + while (xml.readNextStartElement()) { + if (xml.name() == "rss") { + // Find channels + while (xml.readNextStartElement()) { + if (xml.name() == "channel") { + parseRSSChannel(xml); + foundChannel = true; + break; + } + else { + qDebug() << "Skip rss item: " << xml.name(); + xml.skipCurrentElement(); + } + } + break; + } + else if (xml.name() == "feed") { // Atom feed + parseAtomChannel(xml); + foundChannel = true; + break; + } + else { + qDebug() << "Skip root item: " << xml.name(); + xml.skipCurrentElement(); + } + } + + if (xml.hasError()) + emit finished(xml.errorString()); + else if (!foundChannel) + emit finished(tr("Invalid RSS feed.")); + else + emit finished(QString()); +} + +void Parser::parseRssArticle(QXmlStreamReader &xml) +{ + QVariantHash article; + + while(!xml.atEnd()) { + xml.readNext(); + + if(xml.isEndElement() && xml.name() == "item") + break; + + if (xml.isStartElement()) { + if (xml.name() == "title") { + article["title"] = xml.readElementText().trimmed(); + } + else if (xml.name() == "enclosure") { + if (xml.attributes().value("type") == "application/x-bittorrent") + article["torrent_url"] = xml.attributes().value("url").toString(); + } + else if (xml.name() == "link") { + QString link = xml.readElementText().trimmed(); + if (link.startsWith("magnet:", Qt::CaseInsensitive)) + article["torrent_url"] = link; // magnet link instead of a news URL + else + article["news_link"] = link; + } + else if (xml.name() == "description") { + article["description"] = xml.readElementText().trimmed(); + } + else if (xml.name() == "pubDate") { + article["date"] = parseDate(xml.readElementText().trimmed()); + } + else if (xml.name() == "author") { + article["author"] = xml.readElementText().trimmed(); + } + else if (xml.name() == "guid") { + article["id"] = xml.readElementText().trimmed(); + } + } + } + + if (!article.contains("torrent_url") && article.contains("news_link")) + article["torrent_url"] = article["news_link"]; + + if (!article.contains("id")) { + // Item does not have a guid, fall back to some other identifier + const QString link = article.value("news_link").toString(); + if (!link.isEmpty()) { + article["id"] = link; + } + else { + const QString title = article.value("title").toString(); + if (!title.isEmpty()) { + article["id"] = title; + } + else { + qWarning() << "Item has no guid, link or title, ignoring it..."; + return; + } + } + } + + emit newArticle(article); +} + +void Parser::parseRSSChannel(QXmlStreamReader &xml) +{ + qDebug() << Q_FUNC_INFO; + Q_ASSERT(xml.isStartElement() && xml.name() == "channel"); + + while(!xml.atEnd()) { + xml.readNext(); + + if (xml.isStartElement()) { + if (xml.name() == "title") { + QString title = xml.readElementText(); + emit feedTitle(title); + } + else if (xml.name() == "lastBuildDate") { + QString lastBuildDate = xml.readElementText(); + if (!lastBuildDate.isEmpty()) { + if (m_lastBuildDate == lastBuildDate) { + qDebug() << "The RSS feed has not changed since last time, aborting parsing."; + return; + } + m_lastBuildDate = lastBuildDate; + } + } + else if (xml.name() == "item") { + parseRssArticle(xml); + } + } + } +} + +void Parser::parseAtomArticle(QXmlStreamReader &xml) +{ + QVariantHash article; + bool doubleContent = false; + + while(!xml.atEnd()) { + xml.readNext(); + + if(xml.isEndElement() && (xml.name() == "entry")) + break; + + if (xml.isStartElement()) { + if (xml.name() == "title") { + article["title"] = xml.readElementText().trimmed(); + } + else if (xml.name() == "link") { + QString link = ( xml.attributes().isEmpty() ? + xml.readElementText().trimmed() : + xml.attributes().value("href").toString() ); + + if (link.startsWith("magnet:", Qt::CaseInsensitive)) + article["torrent_url"] = link; // magnet link instead of a news URL + else + // Atom feeds can have relative links, work around this and + // take the stress of figuring article full URI from UI + // Assemble full URI + article["news_link"] = ( m_baseUrl.isEmpty() ? link : m_baseUrl + link ); + + } + else if ((xml.name() == "summary") || (xml.name() == "content")){ + if (doubleContent) { // Duplicate content -> ignore + xml.readNext(); + + while ((xml.name() != "summary") && (xml.name() != "content")) + xml.readNext(); + + continue; + } + + // Try to also parse broken articles, which don't use html '&' escapes + // Actually works great for non-broken content too + QString feedText = xml.readElementText(QXmlStreamReader::IncludeChildElements); + if (!feedText.isEmpty()) + article["description"] = feedText.trimmed(); + + doubleContent = true; + } + else if (xml.name() == "updated") { + // ATOM uses standard compliant date, don't do fancy stuff + QDateTime articleDate = QDateTime::fromString(xml.readElementText().trimmed(), Qt::ISODate); + article["date"] = (articleDate.isValid() ? articleDate : QDateTime::currentDateTime()); + } + else if (xml.name() == "author") { + xml.readNext(); + while(xml.name() != "author") { + if(xml.name() == "name") + article["author"] = xml.readElementText().trimmed(); + xml.readNext(); + } + } + else if (xml.name() == "id") { + article["id"] = xml.readElementText().trimmed(); + } + } + } + + if (!article.contains("torrent_url") && article.contains("news_link")) + article["torrent_url"] = article["news_link"]; + + if (!article.contains("id")) { + // Item does not have a guid, fall back to some other identifier + const QString link = article.value("news_link").toString(); + if (!link.isEmpty()) { + article["id"] = link; + } + else { + const QString title = article.value("title").toString(); + if (!title.isEmpty()) { + article["id"] = title; + } + else { + qWarning() << "Item has no guid, link or title, ignoring it..."; + return; + } + } + } + + emit newArticle(article); +} + +void Parser::parseAtomChannel(QXmlStreamReader &xml) +{ + qDebug() << Q_FUNC_INFO; + Q_ASSERT(xml.isStartElement() && xml.name() == "feed"); + + m_baseUrl = xml.attributes().value("xml:base").toString(); + + while (!xml.atEnd()) { + xml.readNext(); + + if (xml.isStartElement()) { + if (xml.name() == "title") { + QString title = xml.readElementText(); + emit feedTitle(title); + } + else if (xml.name() == "updated") { + QString lastBuildDate = xml.readElementText(); + if (!lastBuildDate.isEmpty()) { + if (m_lastBuildDate == lastBuildDate) { + qDebug() << "The RSS feed has not changed since last time, aborting parsing."; + return; + } + m_lastBuildDate = lastBuildDate; + } + } + else if (xml.name() == "entry") { + parseAtomArticle(xml); + } + } + } +} diff -Nru qbittorrent-4.1.3/src/base/rss/private/rss_parser.h qbittorrent-3.3.15/src/base/rss/private/rss_parser.h --- qbittorrent-4.1.3/src/base/rss/private/rss_parser.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/private/rss_parser.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,75 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015 Vladimir Golovnev - * Copyright (C) 2012 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#pragma once - -#include -#include -#include -#include - -class QXmlStreamReader; - -namespace RSS -{ - namespace Private - { - struct ParsingResult - { - QString error; - QString lastBuildDate; - QString title; - QList articles; - }; - - class Parser : public QObject - { - Q_OBJECT - - public: - explicit Parser(QString lastBuildDate); - void parse(const QByteArray &feedData); - - signals: - void finished(const RSS::Private::ParsingResult &result); - - private: - Q_INVOKABLE void parse_impl(const QByteArray &feedData); - void parseRssArticle(QXmlStreamReader &xml); - void parseRSSChannel(QXmlStreamReader &xml); - void parseAtomArticle(QXmlStreamReader &xml); - void parseAtomChannel(QXmlStreamReader &xml); - - QString m_baseUrl; - ParsingResult m_result; - }; - } -} - -Q_DECLARE_METATYPE(RSS::Private::ParsingResult) diff -Nru qbittorrent-4.1.3/src/base/rss/private/rssparser.h qbittorrent-3.3.15/src/base/rss/private/rssparser.h --- qbittorrent-4.1.3/src/base/rss/private/rssparser.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/private/rssparser.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,69 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2015 Vladimir Golovnev + * Copyright (C) 2012 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef RSSPARSER_H +#define RSSPARSER_H + +#include +#include +#include + +class QXmlStreamReader; + +namespace Rss +{ + namespace Private + { + class Parser: public QObject + { + Q_OBJECT + + public slots: + void parse(const QByteArray &feedData); + + signals: + void newArticle(const QVariantHash &rssArticle); + void feedTitle(const QString &title); + void finished(const QString &error); + + private: + void parseRssArticle(QXmlStreamReader &xml); + void parseRSSChannel(QXmlStreamReader &xml); + void parseAtomArticle(QXmlStreamReader &xml); + void parseAtomChannel(QXmlStreamReader &xml); + + QString m_lastBuildDate; // Optimization + QString m_baseUrl; + }; + } +} + +#endif // RSSPARSER_H diff -Nru qbittorrent-4.1.3/src/base/rss/rss_article.cpp qbittorrent-3.3.15/src/base/rss/rss_article.cpp --- qbittorrent-4.1.3/src/base/rss/rss_article.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rss_article.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,171 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * Copyright (C) 2010 Christophe Dumez - * Copyright (C) 2010 Arnaud Demaiziere - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "rss_article.h" - -#include -#include -#include - -#include "rss_feed.h" - -using namespace RSS; - -namespace -{ - QVariantHash articleDataFromJSON(const QJsonObject &jsonObj) - { - auto varHash = jsonObj.toVariantHash(); - // JSON object store DateTime as string so we need to convert it - varHash[Article::KeyDate] = - QDateTime::fromString(jsonObj.value(Article::KeyDate).toString(), Qt::RFC2822Date); - - return varHash; - } -} - -const QString Article::KeyId(QStringLiteral("id")); -const QString Article::KeyDate(QStringLiteral("date")); -const QString Article::KeyTitle(QStringLiteral("title")); -const QString Article::KeyAuthor(QStringLiteral("author")); -const QString Article::KeyDescription(QStringLiteral("description")); -const QString Article::KeyTorrentURL(QStringLiteral("torrentURL")); -const QString Article::KeyLink(QStringLiteral("link")); -const QString Article::KeyIsRead(QStringLiteral("isRead")); - -Article::Article(Feed *feed, const QVariantHash &varHash) - : QObject(feed) - , m_feed(feed) - , m_guid(varHash.value(KeyId).toString()) - , m_date(varHash.value(KeyDate).toDateTime()) - , m_title(varHash.value(KeyTitle).toString()) - , m_author(varHash.value(KeyAuthor).toString()) - , m_description(varHash.value(KeyDescription).toString()) - , m_torrentURL(varHash.value(KeyTorrentURL).toString()) - , m_link(varHash.value(KeyLink).toString()) - , m_isRead(varHash.value(KeyIsRead, false).toBool()) - , m_data(varHash) -{ - if (!m_date.isValid()) - throw std::runtime_error("Bad RSS Article data"); - - // If item does not have a guid, fall back to some other identifier - if (m_guid.isEmpty()) - m_guid = varHash.value(KeyTorrentURL).toString(); - if (m_guid.isEmpty()) - m_guid = varHash.value(KeyTitle).toString(); - if (m_guid.isEmpty()) - throw std::runtime_error("Bad RSS Article data"); - - m_data[KeyId] = m_guid; - - if (m_torrentURL.isEmpty()) { - m_torrentURL = m_link; - m_data[KeyTorrentURL] = m_torrentURL; - } -} - -Article::Article(Feed *feed, const QJsonObject &jsonObj) - : Article(feed, articleDataFromJSON(jsonObj)) -{ -} - -QString Article::guid() const -{ - return m_guid; -} - -QDateTime Article::date() const -{ - return m_date; -} - -QString Article::title() const -{ - return m_title; -} - -QString Article::author() const -{ - return m_author; -} - -QString Article::description() const -{ - return m_description; -} - -QString Article::torrentUrl() const -{ - return (m_torrentURL.isEmpty() ? m_link : m_torrentURL); -} - -QString Article::link() const -{ - return m_link; -} - -bool Article::isRead() const -{ - return m_isRead; -} - -QVariantHash Article::data() const -{ - return m_data; -} - -void Article::markAsRead() -{ - if (!m_isRead) { - m_isRead = true; - m_data[KeyIsRead] = m_isRead; - emit read(this); - } -} - -QJsonObject Article::toJsonObject() const -{ - auto jsonObj = QJsonObject::fromVariantHash(m_data); - // JSON object doesn't support DateTime so we need to convert it - jsonObj[KeyDate] = m_date.toString(Qt::RFC2822Date); - - return jsonObj; -} - -bool Article::articleDateRecentThan(Article *article, const QDateTime &date) -{ - return article->date() > date; -} - -Feed *Article::feed() const -{ - return m_feed; -} diff -Nru qbittorrent-4.1.3/src/base/rss/rssarticle.cpp qbittorrent-3.3.15/src/base/rss/rssarticle.cpp --- qbittorrent-4.1.3/src/base/rss/rssarticle.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rssarticle.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,143 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2010 Christophe Dumez + * Copyright (C) 2010 Arnaud Demaiziere + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact: chris@qbittorrent.org, arnaud@qbittorrent.org + */ + +#include +#include +#include + +#include "rssfeed.h" +#include "rssarticle.h" + +using namespace Rss; + +// public constructor +Article::Article(Feed *parent, const QString &guid) + : m_parent(parent) + , m_guid(guid) + , m_read(false) +{ +} + +bool Article::hasAttachment() const +{ + return !m_torrentUrl.isEmpty(); +} + +QVariantHash Article::toHash() const +{ + QVariantHash item; + item["title"] = m_title; + item["id"] = m_guid; + item["torrent_url"] = m_torrentUrl; + item["news_link"] = m_link; + item["description"] = m_description; + item["date"] = m_date; + item["author"] = m_author; + item["read"] = m_read; + return item; +} + +ArticlePtr Article::fromHash(Feed *parent, const QVariantHash &h) +{ + const QString guid = h.value("id").toString(); + if (guid.isEmpty()) + return ArticlePtr(); + + ArticlePtr art(new Article(parent, guid)); + art->m_title = h.value("title", "").toString(); + art->m_torrentUrl = h.value("torrent_url", "").toString(); + art->m_link = h.value("news_link", "").toString(); + art->m_description = h.value("description").toString(); + art->m_date = h.value("date").toDateTime(); + art->m_author = h.value("author").toString(); + art->m_read = h.value("read", false).toBool(); + + return art; +} + +Feed *Article::parent() const +{ + return m_parent; +} + +const QString &Article::author() const +{ + return m_author; +} + +const QString &Article::torrentUrl() const +{ + return m_torrentUrl; +} + +const QString &Article::link() const +{ + return m_link; +} + +QString Article::description() const +{ + return m_description.isNull() ? "" : m_description; +} + +const QDateTime &Article::date() const +{ + return m_date; +} + +bool Article::isRead() const +{ + return m_read; +} + +void Article::markAsRead() +{ + if (!m_read) { + m_read = true; + emit articleWasRead(); + } +} + +const QString &Article::guid() const +{ + return m_guid; +} + +const QString &Article::title() const +{ + return m_title; +} + +void Article::handleTorrentDownloadSuccess(const QString &url) +{ + if (url == m_torrentUrl) + markAsRead(); +} diff -Nru qbittorrent-4.1.3/src/base/rss/rss_article.h qbittorrent-3.3.15/src/base/rss/rss_article.h --- qbittorrent-4.1.3/src/base/rss/rss_article.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rss_article.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,94 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * Copyright (C) 2010 Christophe Dumez - * Copyright (C) 2010 Arnaud Demaiziere - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#pragma once - -#include -#include -#include -#include - -namespace RSS -{ - class Feed; - - class Article : public QObject - { - Q_OBJECT - Q_DISABLE_COPY(Article) - - friend class Feed; - - Article(Feed *feed, const QVariantHash &varHash); - Article(Feed *feed, const QJsonObject &jsonObj); - - public: - static const QString KeyId; - static const QString KeyDate; - static const QString KeyTitle; - static const QString KeyAuthor; - static const QString KeyDescription; - static const QString KeyTorrentURL; - static const QString KeyLink; - static const QString KeyIsRead; - - Feed *feed() const; - QString guid() const; - QDateTime date() const; - QString title() const; - QString author() const; - QString description() const; - QString torrentUrl() const; - QString link() const; - bool isRead() const; - QVariantHash data() const; - - void markAsRead(); - - QJsonObject toJsonObject() const; - - static bool articleDateRecentThan(Article *article, const QDateTime &date); - - signals: - void read(Article *article = nullptr); - - private: - Feed *m_feed = nullptr; - QString m_guid; - QDateTime m_date; - QString m_title; - QString m_author; - QString m_description; - QString m_torrentURL; - QString m_link; - bool m_isRead = false; - QVariantHash m_data; - }; -} diff -Nru qbittorrent-4.1.3/src/base/rss/rssarticle.h qbittorrent-3.3.15/src/base/rss/rssarticle.h --- qbittorrent-4.1.3/src/base/rss/rssarticle.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rssarticle.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,91 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2010 Christophe Dumez + * Copyright (C) 2010 Arnaud Demaiziere + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact: chris@qbittorrent.org, arnaud@qbittorrent.org + */ + +#ifndef RSSARTICLE_H +#define RSSARTICLE_H + +#include +#include +#include + +namespace Rss +{ + class Feed; + class Article; + + typedef QSharedPointer
ArticlePtr; + + // Item of a rss stream, single information + class Article: public QObject + { + Q_OBJECT + + public: + Article(Feed *parent, const QString &guid); + + // Accessors + bool hasAttachment() const; + const QString &guid() const; + Feed *parent() const; + const QString &title() const; + const QString &author() const; + const QString &torrentUrl() const; + const QString &link() const; + QString description() const; + const QDateTime &date() const; + bool isRead() const; + // Setters + void markAsRead(); + + // Serialization + QVariantHash toHash() const; + static ArticlePtr fromHash(Feed *parent, const QVariantHash &hash); + + signals: + void articleWasRead(); + + public slots: + void handleTorrentDownloadSuccess(const QString &url); + + private: + Feed *m_parent; + QString m_guid; + QString m_title; + QString m_torrentUrl; + QString m_link; + QString m_description; + QDateTime m_date; + QString m_author; + bool m_read; + }; +} + +#endif // RSSARTICLE_H diff -Nru qbittorrent-4.1.3/src/base/rss/rss_autodownloader.cpp qbittorrent-3.3.15/src/base/rss/rss_autodownloader.cpp --- qbittorrent-4.1.3/src/base/rss/rss_autodownloader.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rss_autodownloader.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,508 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "rss_autodownloader.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../bittorrent/magneturi.h" -#include "../bittorrent/session.h" -#include "../asyncfilestorage.h" -#include "../global.h" -#include "../logger.h" -#include "../profile.h" -#include "../settingsstorage.h" -#include "../tristatebool.h" -#include "../utils/fs.h" -#include "rss_article.h" -#include "rss_autodownloadrule.h" -#include "rss_feed.h" -#include "rss_folder.h" -#include "rss_session.h" - -struct ProcessingJob -{ - QString feedURL; - QVariantHash articleData; -}; - -const QString ConfFolderName(QStringLiteral("rss")); -const QString RulesFileName(QStringLiteral("download_rules.json")); - -const QString SettingsKey_ProcessingEnabled(QStringLiteral("RSS/AutoDownloader/EnableProcessing")); -const QString SettingsKey_SmartEpisodeFilter(QStringLiteral("RSS/AutoDownloader/SmartEpisodeFilter")); - -namespace -{ - QVector rulesFromJSON(const QByteArray &jsonData) - { - QJsonParseError jsonError; - QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData, &jsonError); - if (jsonError.error != QJsonParseError::NoError) - throw RSS::ParsingError(jsonError.errorString()); - - if (!jsonDoc.isObject()) - throw RSS::ParsingError(RSS::AutoDownloader::tr("Invalid data format.")); - - const QJsonObject jsonObj {jsonDoc.object()}; - QVector rules; - for (auto it = jsonObj.begin(); it != jsonObj.end(); ++it) { - const QJsonValue jsonVal {it.value()}; - if (!jsonVal.isObject()) - throw RSS::ParsingError(RSS::AutoDownloader::tr("Invalid data format.")); - - rules.append(RSS::AutoDownloadRule::fromJsonObject(jsonVal.toObject(), it.key())); - } - - return rules; - } -} - -using namespace RSS; - -QPointer AutoDownloader::m_instance = nullptr; - -QString computeSmartFilterRegex(const QStringList &filters) -{ - return QString("(?:_|\\b)(?:%1)(?:_|\\b)").arg(filters.join(QString(")|(?:"))); -} - -AutoDownloader::AutoDownloader() - : m_processingEnabled(SettingsStorage::instance()->loadValue(SettingsKey_ProcessingEnabled, false).toBool()) - , m_processingTimer(new QTimer(this)) - , m_ioThread(new QThread(this)) -{ - Q_ASSERT(!m_instance); // only one instance is allowed - m_instance = this; - - m_fileStorage = new AsyncFileStorage( - Utils::Fs::expandPathAbs(specialFolderLocation(SpecialFolder::Config) + ConfFolderName)); - if (!m_fileStorage) - throw std::runtime_error("Directory for RSS AutoDownloader data is unavailable."); - - m_fileStorage->moveToThread(m_ioThread); - connect(m_ioThread, &QThread::finished, m_fileStorage, &AsyncFileStorage::deleteLater); - connect(m_fileStorage, &AsyncFileStorage::failed, [](const QString &fileName, const QString &errorString) - { - LogMsg(tr("Couldn't save RSS AutoDownloader data in %1. Error: %2") - .arg(fileName, errorString), Log::CRITICAL); - }); - - m_ioThread->start(); - - connect(BitTorrent::Session::instance(), &BitTorrent::Session::downloadFromUrlFinished - , this, &AutoDownloader::handleTorrentDownloadFinished); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::downloadFromUrlFailed - , this, &AutoDownloader::handleTorrentDownloadFailed); - - // initialise the smart episode regex - const QString regex = computeSmartFilterRegex(smartEpisodeFilters()); - m_smartEpisodeRegex = QRegularExpression(regex, - QRegularExpression::CaseInsensitiveOption - | QRegularExpression::ExtendedPatternSyntaxOption - | QRegularExpression::UseUnicodePropertiesOption); - - load(); - - m_processingTimer->setSingleShot(true); - connect(m_processingTimer, &QTimer::timeout, this, &AutoDownloader::process); - - if (m_processingEnabled) - startProcessing(); -} - -AutoDownloader::~AutoDownloader() -{ - store(); - - m_ioThread->quit(); - m_ioThread->wait(); -} - -AutoDownloader *AutoDownloader::instance() -{ - return m_instance; -} - -bool AutoDownloader::hasRule(const QString &ruleName) const -{ - return m_rules.contains(ruleName); -} - -AutoDownloadRule AutoDownloader::ruleByName(const QString &ruleName) const -{ - return m_rules.value(ruleName, AutoDownloadRule("Unknown Rule")); -} - -QList AutoDownloader::rules() const -{ - return m_rules.values(); -} - -void AutoDownloader::insertRule(const AutoDownloadRule &rule) -{ - if (!hasRule(rule.name())) { - // Insert new rule - setRule_impl(rule); - m_dirty = true; - store(); - emit ruleAdded(rule.name()); - resetProcessingQueue(); - } - else if (ruleByName(rule.name()) != rule) { - // Update existing rule - setRule_impl(rule); - m_dirty = true; - storeDeferred(); - emit ruleChanged(rule.name()); - resetProcessingQueue(); - } -} - -bool AutoDownloader::renameRule(const QString &ruleName, const QString &newRuleName) -{ - if (!hasRule(ruleName)) return false; - if (hasRule(newRuleName)) return false; - - m_rules.insert(newRuleName, m_rules.take(ruleName)); - m_dirty = true; - store(); - emit ruleRenamed(newRuleName, ruleName); - return true; -} - -void AutoDownloader::removeRule(const QString &ruleName) -{ - if (m_rules.contains(ruleName)) { - emit ruleAboutToBeRemoved(ruleName); - m_rules.remove(ruleName); - m_dirty = true; - store(); - } -} - -QByteArray AutoDownloader::exportRules(AutoDownloader::RulesFileFormat format) const -{ - switch (format) { - case RulesFileFormat::Legacy: - return exportRulesToLegacyFormat(); - default: - return exportRulesToJSONFormat(); - } -} - -void AutoDownloader::importRules(const QByteArray &data, AutoDownloader::RulesFileFormat format) -{ - switch (format) { - case RulesFileFormat::Legacy: - importRulesFromLegacyFormat(data); - break; - default: - importRulesFromJSONFormat(data); - } -} - -QByteArray AutoDownloader::exportRulesToJSONFormat() const -{ - QJsonObject jsonObj; - for (const auto &rule : copyAsConst(rules())) - jsonObj.insert(rule.name(), rule.toJsonObject()); - - return QJsonDocument(jsonObj).toJson(); -} - -void AutoDownloader::importRulesFromJSONFormat(const QByteArray &data) -{ - for (const auto &rule : copyAsConst(rulesFromJSON(data))) - insertRule(rule); -} - -QByteArray AutoDownloader::exportRulesToLegacyFormat() const -{ - QVariantHash dict; - for (const auto &rule : copyAsConst(rules())) - dict[rule.name()] = rule.toLegacyDict(); - - QByteArray data; - QDataStream out(&data, QIODevice::WriteOnly); - out.setVersion(QDataStream::Qt_4_5); - out << dict; - - return data; -} - -void AutoDownloader::importRulesFromLegacyFormat(const QByteArray &data) -{ - QDataStream in(data); - in.setVersion(QDataStream::Qt_4_5); - QVariantHash dict; - in >> dict; - if (in.status() != QDataStream::Ok) - throw ParsingError(tr("Invalid data format")); - - for (const QVariant &val : qAsConst(dict)) - insertRule(AutoDownloadRule::fromLegacyDict(val.toHash())); -} - -QStringList AutoDownloader::smartEpisodeFilters() const -{ - const QVariant filtersSetting = SettingsStorage::instance()->loadValue(SettingsKey_SmartEpisodeFilter); - - if (filtersSetting.isNull()) { - QStringList filters = { - "s(\\d+)e(\\d+)", // Format 1: s01e01 - "(\\d+)x(\\d+)", // Format 2: 01x01 - "(\\d{4}[.\\-]\\d{1,2}[.\\-]\\d{1,2})", // Format 3: 2017.01.01 - "(\\d{1,2}[.\\-]\\d{1,2}[.\\-]\\d{4})" // Format 4: 01.01.2017 - }; - - return filters; - } - - return filtersSetting.toStringList(); -} - -QRegularExpression AutoDownloader::smartEpisodeRegex() const -{ - return m_smartEpisodeRegex; -} - -void AutoDownloader::setSmartEpisodeFilters(const QStringList &filters) -{ - SettingsStorage::instance()->storeValue(SettingsKey_SmartEpisodeFilter, filters); - - const QString regex = computeSmartFilterRegex(filters); - m_smartEpisodeRegex.setPattern(regex); -} - -void AutoDownloader::process() -{ - if (m_processingQueue.isEmpty()) return; // processing was disabled - - processJob(m_processingQueue.takeFirst()); - if (!m_processingQueue.isEmpty()) - // Schedule to process the next torrent (if any) - m_processingTimer->start(); -} - -void AutoDownloader::handleTorrentDownloadFinished(const QString &url) -{ - auto job = m_waitingJobs.take(url); - if (!job) return; - - if (Feed *feed = Session::instance()->feedByURL(job->feedURL)) - if (Article *article = feed->articleByGUID(job->articleData.value(Article::KeyId).toString())) - article->markAsRead(); -} - -void AutoDownloader::handleTorrentDownloadFailed(const QString &url) -{ - m_waitingJobs.remove(url); - // TODO: Re-schedule job here. -} - -void AutoDownloader::handleNewArticle(Article *article) -{ - if (!article->isRead() && !article->torrentUrl().isEmpty()) - addJobForArticle(article); -} - -void AutoDownloader::setRule_impl(const AutoDownloadRule &rule) -{ - m_rules.insert(rule.name(), rule); -} - -void AutoDownloader::addJobForArticle(Article *article) -{ - const QString torrentURL = article->torrentUrl(); - if (m_waitingJobs.contains(torrentURL)) return; - - QSharedPointer job(new ProcessingJob); - job->feedURL = article->feed()->url(); - job->articleData = article->data(); - m_processingQueue.append(job); - if (!m_processingTimer->isActive()) - m_processingTimer->start(); -} - -void AutoDownloader::processJob(const QSharedPointer &job) -{ - for (AutoDownloadRule &rule: m_rules) { - if (!rule.isEnabled()) continue; - if (!rule.feedURLs().contains(job->feedURL)) continue; - if (!rule.accepts(job->articleData)) continue; - - m_dirty = true; - storeDeferred(); - - BitTorrent::AddTorrentParams params; - params.savePath = rule.savePath(); - params.category = rule.assignedCategory(); - params.addPaused = rule.addPaused(); - if (!rule.savePath().isEmpty()) - params.useAutoTMM = TriStateBool::False; - auto torrentURL = job->articleData.value(Article::KeyTorrentURL).toString(); - BitTorrent::Session::instance()->addTorrent(torrentURL, params); - - if (BitTorrent::MagnetUri(torrentURL).isValid()) { - if (Feed *feed = Session::instance()->feedByURL(job->feedURL)) { - if (Article *article = feed->articleByGUID(job->articleData.value(Article::KeyId).toString())) - article->markAsRead(); - } - } - else { - // waiting for torrent file downloading - // normalize URL string via QUrl since DownloadManager do it - m_waitingJobs.insert(QUrl(torrentURL).toString(), job); - } - - return; - } -} - -void AutoDownloader::load() -{ - QFile rulesFile(m_fileStorage->storageDir().absoluteFilePath(RulesFileName)); - - if (!rulesFile.exists()) - loadRulesLegacy(); - else if (rulesFile.open(QFile::ReadOnly)) - loadRules(rulesFile.readAll()); - else - LogMsg(tr("Couldn't read RSS AutoDownloader rules from %1. Error: %2") - .arg(rulesFile.fileName(), rulesFile.errorString()), Log::CRITICAL); -} - -void AutoDownloader::loadRules(const QByteArray &data) -{ - try { - const auto rules = rulesFromJSON(data); - for (const auto &rule : rules) - setRule_impl(rule); - } - catch (const ParsingError &error) { - LogMsg(tr("Couldn't load RSS AutoDownloader rules. Reason: %1") - .arg(error.message()), Log::CRITICAL); - } -} - -void AutoDownloader::loadRulesLegacy() -{ - SettingsPtr settings = Profile::instance().applicationSettings(QStringLiteral("qBittorrent-rss")); - QVariantHash rules = settings->value(QStringLiteral("download_rules")).toHash(); - foreach (const QVariant &ruleVar, rules) { - auto rule = AutoDownloadRule::fromLegacyDict(ruleVar.toHash()); - if (!rule.name().isEmpty()) - insertRule(rule); - } -} - -void AutoDownloader::store() -{ - if (!m_dirty) return; - - m_dirty = false; - m_savingTimer.stop(); - - QJsonObject jsonObj; - foreach (auto rule, m_rules) - jsonObj.insert(rule.name(), rule.toJsonObject()); - - m_fileStorage->store(RulesFileName, QJsonDocument(jsonObj).toJson()); -} - -void AutoDownloader::storeDeferred() -{ - if (!m_savingTimer.isActive()) - m_savingTimer.start(5 * 1000, this); -} - -bool AutoDownloader::isProcessingEnabled() const -{ - return m_processingEnabled; -} - -void AutoDownloader::resetProcessingQueue() -{ - m_processingQueue.clear(); - if (!m_processingEnabled) return; - - foreach (Article *article, Session::instance()->rootFolder()->articles()) { - if (!article->isRead() && !article->torrentUrl().isEmpty()) - addJobForArticle(article); - } -} - -void AutoDownloader::startProcessing() -{ - resetProcessingQueue(); - connect(Session::instance()->rootFolder(), &Folder::newArticle, this, &AutoDownloader::handleNewArticle); -} - -void AutoDownloader::setProcessingEnabled(bool enabled) -{ - if (m_processingEnabled != enabled) { - m_processingEnabled = enabled; - SettingsStorage::instance()->storeValue(SettingsKey_ProcessingEnabled, m_processingEnabled); - if (m_processingEnabled) { - startProcessing(); - } - else { - m_processingQueue.clear(); - disconnect(Session::instance()->rootFolder(), &Folder::newArticle, this, &AutoDownloader::handleNewArticle); - } - - emit processingStateChanged(m_processingEnabled); - } -} - -void AutoDownloader::timerEvent(QTimerEvent *event) -{ - Q_UNUSED(event); - store(); -} - -ParsingError::ParsingError(const QString &message) - : std::runtime_error(message.toUtf8().data()) -{ -} - -QString ParsingError::message() const -{ - return what(); -} diff -Nru qbittorrent-4.1.3/src/base/rss/rss_autodownloader.h qbittorrent-3.3.15/src/base/rss/rss_autodownloader.h --- qbittorrent-4.1.3/src/base/rss/rss_autodownloader.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rss_autodownloader.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,142 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#pragma once - -#include - -#include -#include -#include -#include -#include -#include -#include - -class QThread; -class QTimer; -class Application; -class AsyncFileStorage; -struct ProcessingJob; - -namespace RSS -{ - class Article; - class Feed; - class Item; - - class AutoDownloadRule; - - class ParsingError : public std::runtime_error - { - public: - explicit ParsingError(const QString &message); - QString message() const; - }; - - class AutoDownloader final : public QObject - { - Q_OBJECT - Q_DISABLE_COPY(AutoDownloader) - - friend class ::Application; - - AutoDownloader(); - ~AutoDownloader() override; - - public: - enum class RulesFileFormat - { - Legacy, - JSON - }; - - static AutoDownloader *instance(); - - bool isProcessingEnabled() const; - void setProcessingEnabled(bool enabled); - - QStringList smartEpisodeFilters() const; - void setSmartEpisodeFilters(const QStringList &filters); - QRegularExpression smartEpisodeRegex() const; - - bool hasRule(const QString &ruleName) const; - AutoDownloadRule ruleByName(const QString &ruleName) const; - QList rules() const; - - void insertRule(const AutoDownloadRule &rule); - bool renameRule(const QString &ruleName, const QString &newRuleName); - void removeRule(const QString &ruleName); - - QByteArray exportRules(RulesFileFormat format = RulesFileFormat::JSON) const; - void importRules(const QByteArray &data, RulesFileFormat format = RulesFileFormat::JSON); - - signals: - void processingStateChanged(bool enabled); - void ruleAdded(const QString &ruleName); - void ruleChanged(const QString &ruleName); - void ruleRenamed(const QString &ruleName, const QString &oldRuleName); - void ruleAboutToBeRemoved(const QString &ruleName); - - private slots: - void process(); - void handleTorrentDownloadFinished(const QString &url); - void handleTorrentDownloadFailed(const QString &url); - void handleNewArticle(Article *article); - - private: - void timerEvent(QTimerEvent *event) override; - void setRule_impl(const AutoDownloadRule &rule); - void resetProcessingQueue(); - void startProcessing(); - void addJobForArticle(Article *article); - void processJob(const QSharedPointer &job); - void load(); - void loadRules(const QByteArray &data); - void loadRulesLegacy(); - void store(); - void storeDeferred(); - QByteArray exportRulesToJSONFormat() const; - void importRulesFromJSONFormat(const QByteArray &data); - QByteArray exportRulesToLegacyFormat() const; - void importRulesFromLegacyFormat(const QByteArray &data); - - static QPointer m_instance; - - bool m_processingEnabled; - QTimer *m_processingTimer; - QThread *m_ioThread; - AsyncFileStorage *m_fileStorage; - QHash m_rules; - QList> m_processingQueue; - QHash> m_waitingJobs; - bool m_dirty = false; - QBasicTimer m_savingTimer; - QRegularExpression m_smartEpisodeRegex; - }; -} diff -Nru qbittorrent-4.1.3/src/base/rss/rss_autodownloadrule.cpp qbittorrent-3.3.15/src/base/rss/rss_autodownloadrule.cpp --- qbittorrent-4.1.3/src/base/rss/rss_autodownloadrule.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rss_autodownloadrule.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,656 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * Copyright (C) 2010 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "rss_autodownloadrule.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../global.h" -#include "../preferences.h" -#include "../tristatebool.h" -#include "../utils/fs.h" -#include "../utils/string.h" -#include "rss_article.h" -#include "rss_autodownloader.h" -#include "rss_feed.h" - -namespace -{ - TriStateBool jsonValueToTriStateBool(const QJsonValue &jsonVal) - { - if (jsonVal.isBool()) - return TriStateBool(jsonVal.toBool()); - - if (!jsonVal.isNull()) - qDebug() << Q_FUNC_INFO << "Incorrect value" << jsonVal.toVariant(); - - return TriStateBool::Undefined; - } - - QJsonValue triStateBoolToJsonValue(const TriStateBool &triStateBool) - { - switch (static_cast(triStateBool)) { - case 0: return false; - case 1: return true; - default: return QJsonValue(); - } - } - - TriStateBool addPausedLegacyToTriStateBool(int val) - { - switch (val) { - case 1: return TriStateBool::True; // always - case 2: return TriStateBool::False; // never - default: return TriStateBool::Undefined; // default - } - } - - int triStateBoolToAddPausedLegacy(const TriStateBool &triStateBool) - { - switch (static_cast(triStateBool)) { - case 0: return 2; // never - case 1: return 1; // always - default: return 0; // default - } - } -} - -const QString Str_Name(QStringLiteral("name")); -const QString Str_Enabled(QStringLiteral("enabled")); -const QString Str_UseRegex(QStringLiteral("useRegex")); -const QString Str_MustContain(QStringLiteral("mustContain")); -const QString Str_MustNotContain(QStringLiteral("mustNotContain")); -const QString Str_EpisodeFilter(QStringLiteral("episodeFilter")); -const QString Str_AffectedFeeds(QStringLiteral("affectedFeeds")); -const QString Str_SavePath(QStringLiteral("savePath")); -const QString Str_AssignedCategory(QStringLiteral("assignedCategory")); -const QString Str_LastMatch(QStringLiteral("lastMatch")); -const QString Str_IgnoreDays(QStringLiteral("ignoreDays")); -const QString Str_AddPaused(QStringLiteral("addPaused")); -const QString Str_SmartFilter(QStringLiteral("smartFilter")); -const QString Str_PreviouslyMatched(QStringLiteral("previouslyMatchedEpisodes")); - -namespace RSS -{ - struct AutoDownloadRuleData : public QSharedData - { - QString name; - bool enabled = true; - - QStringList mustContain; - QStringList mustNotContain; - QString episodeFilter; - QStringList feedURLs; - bool useRegex = false; - int ignoreDays = 0; - QDateTime lastMatch; - - QString savePath; - QString category; - TriStateBool addPaused = TriStateBool::Undefined; - - bool smartFilter = false; - QStringList previouslyMatchedEpisodes; - - mutable QString lastComputedEpisode; - mutable QHash cachedRegexes; - - bool operator==(const AutoDownloadRuleData &other) const - { - return (name == other.name) - && (enabled == other.enabled) - && (mustContain == other.mustContain) - && (mustNotContain == other.mustNotContain) - && (episodeFilter == other.episodeFilter) - && (feedURLs == other.feedURLs) - && (useRegex == other.useRegex) - && (ignoreDays == other.ignoreDays) - && (lastMatch == other.lastMatch) - && (savePath == other.savePath) - && (category == other.category) - && (addPaused == other.addPaused) - && (smartFilter == other.smartFilter); - } - }; -} - -using namespace RSS; - -QString computeEpisodeName(const QString &article) -{ - const QRegularExpression episodeRegex = AutoDownloader::instance()->smartEpisodeRegex(); - const QRegularExpressionMatch match = episodeRegex.match(article); - - // See if we can extract an season/episode number or date from the title - if (!match.hasMatch()) - return QString(); - - QStringList ret; - for (int i = 1; i <= match.lastCapturedIndex(); ++i) { - QString cap = match.captured(i); - - if (cap.isEmpty()) - continue; - - bool isInt = false; - int x = cap.toInt(&isInt); - - ret.append(isInt ? QString::number(x) : cap); - } - return ret.join('x'); -} - -AutoDownloadRule::AutoDownloadRule(const QString &name) - : m_dataPtr(new AutoDownloadRuleData) -{ - setName(name); -} - -AutoDownloadRule::AutoDownloadRule(const AutoDownloadRule &other) - : m_dataPtr(other.m_dataPtr) -{ -} - -AutoDownloadRule::~AutoDownloadRule() {} - -QRegularExpression AutoDownloadRule::cachedRegex(const QString &expression, bool isRegex) const -{ - // Use a cache of regexes so we don't have to continually recompile - big performance increase. - // The cache is cleared whenever the regex/wildcard, must or must not contain fields or - // episode filter are modified. - Q_ASSERT(!expression.isEmpty()); - - QRegularExpression ®ex = m_dataPtr->cachedRegexes[expression]; - if (regex.pattern().isEmpty()) { - regex = QRegularExpression { - (isRegex ? expression : Utils::String::wildcardToRegex(expression)) - , QRegularExpression::CaseInsensitiveOption}; - } - - return regex; -} - -bool AutoDownloadRule::matchesExpression(const QString &articleTitle, const QString &expression) const -{ - const QRegularExpression whitespace {"\\s+"}; - - if (expression.isEmpty()) { - // A regex of the form "expr|" will always match, so do the same for wildcards - return true; - } - - if (m_dataPtr->useRegex) { - QRegularExpression reg(cachedRegex(expression)); - return reg.match(articleTitle).hasMatch(); - } - - // Only match if every wildcard token (separated by spaces) is present in the article name. - // Order of wildcard tokens is unimportant (if order is important, they should have used *). - const QStringList wildcards {expression.split(whitespace, QString::SplitBehavior::SkipEmptyParts)}; - for (const QString &wildcard : wildcards) { - const QRegularExpression reg {cachedRegex(wildcard, false)}; - if (!reg.match(articleTitle).hasMatch()) - return false; - } - - return true; -} - -bool AutoDownloadRule::matchesMustContainExpression(const QString &articleTitle) const -{ - if (m_dataPtr->mustContain.empty()) - return true; - - // Each expression is either a regex, or a set of wildcards separated by whitespace. - // Accept if any complete expression matches. - for (const QString &expression : qAsConst(m_dataPtr->mustContain)) { - // A regex of the form "expr|" will always match, so do the same for wildcards - if (matchesExpression(articleTitle, expression)) - return true; - } - - return false; -} - -bool AutoDownloadRule::matchesMustNotContainExpression(const QString& articleTitle) const -{ - if (m_dataPtr->mustNotContain.empty()) - return true; - - // Each expression is either a regex, or a set of wildcards separated by whitespace. - // Reject if any complete expression matches. - for (const QString &expression : qAsConst(m_dataPtr->mustNotContain)) { - // A regex of the form "expr|" will always match, so do the same for wildcards - if (matchesExpression(articleTitle, expression)) - return false; - } - - return true; -} - -bool AutoDownloadRule::matchesEpisodeFilterExpression(const QString& articleTitle) const -{ - // Reset the lastComputedEpisode, we don't want to leak it between matches - m_dataPtr->lastComputedEpisode.clear(); - - if (m_dataPtr->episodeFilter.isEmpty()) - return true; - - const QRegularExpression filterRegex {cachedRegex("(^\\d{1,4})x(.*;$)")}; - const QRegularExpressionMatch matcher {filterRegex.match(m_dataPtr->episodeFilter)}; - if (!matcher.hasMatch()) - return false; - - const QString season {matcher.captured(1)}; - const QStringList episodes {matcher.captured(2).split(';')}; - const int seasonOurs {season.toInt()}; - - for (QString episode : episodes) { - if (episode.isEmpty()) - continue; - - // We need to trim leading zeroes, but if it's all zeros then we want episode zero. - while ((episode.size() > 1) && episode.startsWith('0')) - episode = episode.right(episode.size() - 1); - - if (episode.indexOf('-') != -1) { // Range detected - const QString partialPattern1 {"\\bs0?(\\d{1,4})[ -_\\.]?e(0?\\d{1,4})(?:\\D|\\b)"}; - const QString partialPattern2 {"\\b(\\d{1,4})x(0?\\d{1,4})(?:\\D|\\b)"}; - - // Extract partial match from article and compare as digits - QRegularExpressionMatch matcher = cachedRegex(partialPattern1).match(articleTitle); - bool matched = matcher.hasMatch(); - - if (!matched) { - matcher = cachedRegex(partialPattern2).match(articleTitle); - matched = matcher.hasMatch(); - } - - if (matched) { - const int seasonTheirs {matcher.captured(1).toInt()}; - const int episodeTheirs {matcher.captured(2).toInt()}; - - if (episode.endsWith('-')) { // Infinite range - const int episodeOurs {episode.leftRef(episode.size() - 1).toInt()}; - if (((seasonTheirs == seasonOurs) && (episodeTheirs >= episodeOurs)) || (seasonTheirs > seasonOurs)) - return true; - } - else { // Normal range - const QStringList range {episode.split('-')}; - Q_ASSERT(range.size() == 2); - if (range.first().toInt() > range.last().toInt()) - continue; // Ignore this subrule completely - - const int episodeOursFirst {range.first().toInt()}; - const int episodeOursLast {range.last().toInt()}; - if ((seasonTheirs == seasonOurs) && ((episodeOursFirst <= episodeTheirs) && (episodeOursLast >= episodeTheirs))) - return true; - } - } - } - else { // Single number - const QString expStr {QString("\\b(?:s0?%1[ -_\\.]?e0?%2|%1x0?%2)(?:\\D|\\b)").arg(season, episode)}; - if (cachedRegex(expStr).match(articleTitle).hasMatch()) - return true; - } - } - - return false; -} - -bool AutoDownloadRule::matchesSmartEpisodeFilter(const QString& articleTitle) const -{ - if (!useSmartFilter()) - return true; - - const QString episodeStr = computeEpisodeName(articleTitle); - if (episodeStr.isEmpty()) - return true; - - // See if this episode has been downloaded before - const bool previouslyMatched = m_dataPtr->previouslyMatchedEpisodes.contains(episodeStr); - const bool isRepack = articleTitle.contains("REPACK", Qt::CaseInsensitive) || articleTitle.contains("PROPER", Qt::CaseInsensitive); - if (previouslyMatched && !isRepack) - return false; - - m_dataPtr->lastComputedEpisode = episodeStr; - return true; -} - -bool AutoDownloadRule::matches(const QVariantHash &articleData) const -{ - const QDateTime articleDate {articleData[Article::KeyDate].toDateTime()}; - if (ignoreDays() > 0) { - if (lastMatch().isValid() && (articleDate < lastMatch().addDays(ignoreDays()))) - return false; - } - - const QString articleTitle {articleData[Article::KeyTitle].toString()}; - if (!matchesMustContainExpression(articleTitle)) - return false; - if (!matchesMustNotContainExpression(articleTitle)) - return false; - if (!matchesEpisodeFilterExpression(articleTitle)) - return false; - if (!matchesSmartEpisodeFilter(articleTitle)) - return false; - - return true; -} - -bool AutoDownloadRule::accepts(const QVariantHash &articleData) -{ - if (!matches(articleData)) - return false; - - setLastMatch(articleData[Article::KeyDate].toDateTime()); - - if (!m_dataPtr->lastComputedEpisode.isEmpty()) { - // TODO: probably need to add a marker for PROPER/REPACK to avoid duplicate downloads - m_dataPtr->previouslyMatchedEpisodes.append(m_dataPtr->lastComputedEpisode); - m_dataPtr->lastComputedEpisode.clear(); - } - - return true; -} - -AutoDownloadRule &AutoDownloadRule::operator=(const AutoDownloadRule &other) -{ - m_dataPtr = other.m_dataPtr; - return *this; -} - -bool AutoDownloadRule::operator==(const AutoDownloadRule &other) const -{ - return (m_dataPtr == other.m_dataPtr) // optimization - || (*m_dataPtr == *other.m_dataPtr); -} - -bool AutoDownloadRule::operator!=(const AutoDownloadRule &other) const -{ - return !operator==(other); -} - -QJsonObject AutoDownloadRule::toJsonObject() const -{ - return {{Str_Enabled, isEnabled()} - , {Str_UseRegex, useRegex()} - , {Str_MustContain, mustContain()} - , {Str_MustNotContain, mustNotContain()} - , {Str_EpisodeFilter, episodeFilter()} - , {Str_AffectedFeeds, QJsonArray::fromStringList(feedURLs())} - , {Str_SavePath, savePath()} - , {Str_AssignedCategory, assignedCategory()} - , {Str_LastMatch, lastMatch().toString(Qt::RFC2822Date)} - , {Str_IgnoreDays, ignoreDays()} - , {Str_AddPaused, triStateBoolToJsonValue(addPaused())} - , {Str_SmartFilter, useSmartFilter()} - , {Str_PreviouslyMatched, QJsonArray::fromStringList(previouslyMatchedEpisodes())}}; -} - -AutoDownloadRule AutoDownloadRule::fromJsonObject(const QJsonObject &jsonObj, const QString &name) -{ - AutoDownloadRule rule(name.isEmpty() ? jsonObj.value(Str_Name).toString() : name); - - rule.setUseRegex(jsonObj.value(Str_UseRegex).toBool(false)); - rule.setMustContain(jsonObj.value(Str_MustContain).toString()); - rule.setMustNotContain(jsonObj.value(Str_MustNotContain).toString()); - rule.setEpisodeFilter(jsonObj.value(Str_EpisodeFilter).toString()); - rule.setEnabled(jsonObj.value(Str_Enabled).toBool(true)); - rule.setSavePath(jsonObj.value(Str_SavePath).toString()); - rule.setCategory(jsonObj.value(Str_AssignedCategory).toString()); - rule.setAddPaused(jsonValueToTriStateBool(jsonObj.value(Str_AddPaused))); - rule.setLastMatch(QDateTime::fromString(jsonObj.value(Str_LastMatch).toString(), Qt::RFC2822Date)); - rule.setIgnoreDays(jsonObj.value(Str_IgnoreDays).toInt()); - rule.setUseSmartFilter(jsonObj.value(Str_SmartFilter).toBool(false)); - - const QJsonValue feedsVal = jsonObj.value(Str_AffectedFeeds); - QStringList feedURLs; - if (feedsVal.isString()) - feedURLs << feedsVal.toString(); - else foreach (const QJsonValue &urlVal, feedsVal.toArray()) - feedURLs << urlVal.toString(); - rule.setFeedURLs(feedURLs); - - const QJsonValue previouslyMatchedVal = jsonObj.value(Str_PreviouslyMatched); - QStringList previouslyMatched; - if (previouslyMatchedVal.isString()) { - previouslyMatched << previouslyMatchedVal.toString(); - } - else { - foreach (const QJsonValue &val, previouslyMatchedVal.toArray()) - previouslyMatched << val.toString(); - } - rule.setPreviouslyMatchedEpisodes(previouslyMatched); - - return rule; -} - -QVariantHash AutoDownloadRule::toLegacyDict() const -{ - return {{"name", name()}, - {"must_contain", mustContain()}, - {"must_not_contain", mustNotContain()}, - {"save_path", savePath()}, - {"affected_feeds", feedURLs()}, - {"enabled", isEnabled()}, - {"category_assigned", assignedCategory()}, - {"use_regex", useRegex()}, - {"add_paused", triStateBoolToAddPausedLegacy(addPaused())}, - {"episode_filter", episodeFilter()}, - {"last_match", lastMatch()}, - {"ignore_days", ignoreDays()}}; -} - -AutoDownloadRule AutoDownloadRule::fromLegacyDict(const QVariantHash &dict) -{ - AutoDownloadRule rule(dict.value("name").toString()); - - rule.setUseRegex(dict.value("use_regex", false).toBool()); - rule.setMustContain(dict.value("must_contain").toString()); - rule.setMustNotContain(dict.value("must_not_contain").toString()); - rule.setEpisodeFilter(dict.value("episode_filter").toString()); - rule.setFeedURLs(dict.value("affected_feeds").toStringList()); - rule.setEnabled(dict.value("enabled", false).toBool()); - rule.setSavePath(dict.value("save_path").toString()); - rule.setCategory(dict.value("category_assigned").toString()); - rule.setAddPaused(addPausedLegacyToTriStateBool(dict.value("add_paused").toInt())); - rule.setLastMatch(dict.value("last_match").toDateTime()); - rule.setIgnoreDays(dict.value("ignore_days").toInt()); - - return rule; -} - -void AutoDownloadRule::setMustContain(const QString &tokens) -{ - m_dataPtr->cachedRegexes.clear(); - - if (m_dataPtr->useRegex) - m_dataPtr->mustContain = QStringList() << tokens; - else - m_dataPtr->mustContain = tokens.split('|'); - - // Check for single empty string - if so, no condition - if ((m_dataPtr->mustContain.size() == 1) && m_dataPtr->mustContain[0].isEmpty()) - m_dataPtr->mustContain.clear(); -} - -void AutoDownloadRule::setMustNotContain(const QString &tokens) -{ - m_dataPtr->cachedRegexes.clear(); - - if (m_dataPtr->useRegex) - m_dataPtr->mustNotContain = QStringList() << tokens; - else - m_dataPtr->mustNotContain = tokens.split('|'); - - // Check for single empty string - if so, no condition - if ((m_dataPtr->mustNotContain.size() == 1) && m_dataPtr->mustNotContain[0].isEmpty()) - m_dataPtr->mustNotContain.clear(); -} - -QStringList AutoDownloadRule::feedURLs() const -{ - return m_dataPtr->feedURLs; -} - -void AutoDownloadRule::setFeedURLs(const QStringList &urls) -{ - m_dataPtr->feedURLs = urls; -} - -QString AutoDownloadRule::name() const -{ - return m_dataPtr->name; -} - -void AutoDownloadRule::setName(const QString &name) -{ - m_dataPtr->name = name; -} - -QString AutoDownloadRule::savePath() const -{ - return m_dataPtr->savePath; -} - -void AutoDownloadRule::setSavePath(const QString &savePath) -{ - m_dataPtr->savePath = Utils::Fs::fromNativePath(savePath); -} - -TriStateBool AutoDownloadRule::addPaused() const -{ - return m_dataPtr->addPaused; -} - -void AutoDownloadRule::setAddPaused(const TriStateBool &addPaused) -{ - m_dataPtr->addPaused = addPaused; -} - -QString AutoDownloadRule::assignedCategory() const -{ - return m_dataPtr->category; -} - -void AutoDownloadRule::setCategory(const QString &category) -{ - m_dataPtr->category = category; -} - -bool AutoDownloadRule::isEnabled() const -{ - return m_dataPtr->enabled; -} - -void AutoDownloadRule::setEnabled(bool enable) -{ - m_dataPtr->enabled = enable; -} - -QDateTime AutoDownloadRule::lastMatch() const -{ - return m_dataPtr->lastMatch; -} - -void AutoDownloadRule::setLastMatch(const QDateTime &lastMatch) -{ - m_dataPtr->lastMatch = lastMatch; -} - -void AutoDownloadRule::setIgnoreDays(int d) -{ - m_dataPtr->ignoreDays = d; -} - -int AutoDownloadRule::ignoreDays() const -{ - return m_dataPtr->ignoreDays; -} - -QString AutoDownloadRule::mustContain() const -{ - return m_dataPtr->mustContain.join('|'); -} - -QString AutoDownloadRule::mustNotContain() const -{ - return m_dataPtr->mustNotContain.join('|'); -} - -bool AutoDownloadRule::useSmartFilter() const -{ - return m_dataPtr->smartFilter; -} - -void AutoDownloadRule::setUseSmartFilter(bool enabled) -{ - m_dataPtr->smartFilter = enabled; -} - -bool AutoDownloadRule::useRegex() const -{ - return m_dataPtr->useRegex; -} - -void AutoDownloadRule::setUseRegex(bool enabled) -{ - m_dataPtr->useRegex = enabled; - m_dataPtr->cachedRegexes.clear(); -} - -QStringList AutoDownloadRule::previouslyMatchedEpisodes() const -{ - return m_dataPtr->previouslyMatchedEpisodes; -} - -void AutoDownloadRule::setPreviouslyMatchedEpisodes(const QStringList &previouslyMatchedEpisodes) -{ - m_dataPtr->previouslyMatchedEpisodes = previouslyMatchedEpisodes; -} - -QString AutoDownloadRule::episodeFilter() const -{ - return m_dataPtr->episodeFilter; -} - -void AutoDownloadRule::setEpisodeFilter(const QString &e) -{ - m_dataPtr->episodeFilter = e; - m_dataPtr->cachedRegexes.clear(); -} diff -Nru qbittorrent-4.1.3/src/base/rss/rss_autodownloadrule.h qbittorrent-3.3.15/src/base/rss/rss_autodownloadrule.h --- qbittorrent-4.1.3/src/base/rss/rss_autodownloadrule.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rss_autodownloadrule.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,107 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * Copyright (C) 2010 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#pragma once - -#include -#include -#include - -class QJsonObject; -class QRegularExpression; -class TriStateBool; - -namespace RSS -{ - struct AutoDownloadRuleData; - - class AutoDownloadRule - { - public: - explicit AutoDownloadRule(const QString &name = ""); - AutoDownloadRule(const AutoDownloadRule &other); - ~AutoDownloadRule(); - - QString name() const; - void setName(const QString &name); - - bool isEnabled() const; - void setEnabled(bool enable); - - QString mustContain() const; - void setMustContain(const QString &tokens); - QString mustNotContain() const; - void setMustNotContain(const QString &tokens); - QStringList feedURLs() const; - void setFeedURLs(const QStringList &urls); - int ignoreDays() const; - void setIgnoreDays(int d); - QDateTime lastMatch() const; - void setLastMatch(const QDateTime &lastMatch); - bool useRegex() const; - void setUseRegex(bool enabled); - bool useSmartFilter() const; - void setUseSmartFilter(bool enabled); - QString episodeFilter() const; - void setEpisodeFilter(const QString &e); - - QStringList previouslyMatchedEpisodes() const; - void setPreviouslyMatchedEpisodes(const QStringList &previouslyMatchedEpisodes); - - QString savePath() const; - void setSavePath(const QString &savePath); - TriStateBool addPaused() const; - void setAddPaused(const TriStateBool &addPaused); - QString assignedCategory() const; - void setCategory(const QString &category); - - bool matches(const QVariantHash &articleData) const; - bool accepts(const QVariantHash &articleData); - - AutoDownloadRule &operator=(const AutoDownloadRule &other); - bool operator==(const AutoDownloadRule &other) const; - bool operator!=(const AutoDownloadRule &other) const; - - QJsonObject toJsonObject() const; - static AutoDownloadRule fromJsonObject(const QJsonObject &jsonObj, const QString &name = ""); - - QVariantHash toLegacyDict() const; - static AutoDownloadRule fromLegacyDict(const QVariantHash &dict); - - private: - bool matchesMustContainExpression(const QString &articleTitle) const; - bool matchesMustNotContainExpression(const QString &articleTitle) const; - bool matchesEpisodeFilterExpression(const QString &articleTitle) const; - bool matchesSmartEpisodeFilter(const QString &articleTitle) const; - bool matchesExpression(const QString &articleTitle, const QString &expression) const; - QRegularExpression cachedRegex(const QString &expression, bool isRegex = true) const; - - QSharedDataPointer m_dataPtr; - }; -} diff -Nru qbittorrent-4.1.3/src/base/rss/rssdownloadrule.cpp qbittorrent-3.3.15/src/base/rss/rssdownloadrule.cpp --- qbittorrent-4.1.3/src/base/rss/rssdownloadrule.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rssdownloadrule.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,406 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2010 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#include +#include +#include +#include +#include + +#include "base/preferences.h" +#include "base/utils/fs.h" +#include "rssfeed.h" +#include "rssarticle.h" +#include "rssdownloadrule.h" + +using namespace Rss; + +DownloadRule::DownloadRule() + : m_enabled(false) + , m_useRegex(false) + , m_apstate(USE_GLOBAL) + , m_ignoreDays(0) +{ +} + +bool DownloadRule::matches(const QString &articleTitle, const QString &expression) const +{ + static QRegExp whitespace("\\s+"); + + if (expression.isEmpty()) { + // A regex of the form "expr|" will always match, so do the same for wildcards + return true; + } + else if (m_useRegex) { + QRegExp reg(expression, Qt::CaseInsensitive, QRegExp::RegExp); + return reg.indexIn(articleTitle) > -1; + } + else { + // Only match if every wildcard token (separated by spaces) is present in the article name. + // Order of wildcard tokens is unimportant (if order is important, they should have used *). + foreach (const QString &wildcard, expression.split(whitespace, QString::SplitBehavior::SkipEmptyParts)) { + QRegExp reg(wildcard, Qt::CaseInsensitive, QRegExp::Wildcard); + + if (reg.indexIn(articleTitle) == -1) + return false; + } + } + + return true; +} + +bool DownloadRule::matches(const QString &articleTitle) const +{ + if (!m_mustContain.empty()) { + bool logged = false; + bool foundMustContain = false; + + // Each expression is either a regex, or a set of wildcards separated by whitespace. + // Accept if any complete expression matches. + foreach (const QString &expression, m_mustContain) { + if (!logged) { + qDebug() << "Checking matching" << (m_useRegex ? "regex:" : "wildcard expressions:") << m_mustContain.join("|"); + logged = true; + } + + // A regex of the form "expr|" will always match, so do the same for wildcards + foundMustContain = matches(articleTitle, expression); + + if (foundMustContain) { + qDebug() << "Found matching" << (m_useRegex ? "regex:" : "wildcard expression:") << expression; + break; + } + } + + if (!foundMustContain) + return false; + } + + if (!m_mustNotContain.empty()) { + bool logged = false; + + // Each expression is either a regex, or a set of wildcards separated by whitespace. + // Reject if any complete expression matches. + foreach (const QString &expression, m_mustNotContain) { + if (!logged) { + qDebug() << "Checking not matching" << (m_useRegex ? "regex:" : "wildcard expressions:") << m_mustNotContain.join("|"); + logged = true; + } + + // A regex of the form "expr|" will always match, so do the same for wildcards + if (matches(articleTitle, expression)) { + qDebug() << "Found not matching" << (m_useRegex ? "regex:" : "wildcard expression:") << expression; + return false; + } + } + } + + if (!m_episodeFilter.isEmpty()) { + qDebug() << "Checking episode filter:" << m_episodeFilter; + QRegExp f("(^\\d{1,4})x(.*;$)"); + int pos = f.indexIn(m_episodeFilter); + + if (pos < 0) + return false; + + QString s = f.cap(1); + QStringList eps = f.cap(2).split(";"); + int sOurs = s.toInt(); + + foreach (QString ep, eps) { + if (ep.isEmpty()) + continue; + + // We need to trim leading zeroes, but if it's all zeros then we want episode zero. + while (ep.size() > 1 && ep.startsWith("0")) + ep = ep.right(ep.size() - 1); + + if (ep.indexOf('-') != -1) { // Range detected + QString partialPattern1 = "\\bs0?(\\d{1,4})[ -_\\.]?e(0?\\d{1,4})(?:\\D|\\b)"; + QString partialPattern2 = "\\b(\\d{1,4})x(0?\\d{1,4})(?:\\D|\\b)"; + QRegExp reg(partialPattern1, Qt::CaseInsensitive); + + if (ep.endsWith('-')) { // Infinite range + int epOurs = ep.left(ep.size() - 1).toInt(); + + // Extract partial match from article and compare as digits + pos = reg.indexIn(articleTitle); + + if (pos == -1) { + reg = QRegExp(partialPattern2, Qt::CaseInsensitive); + pos = reg.indexIn(articleTitle); + } + + if (pos != -1) { + int sTheirs = reg.cap(1).toInt(); + int epTheirs = reg.cap(2).toInt(); + if (((sTheirs == sOurs) && (epTheirs >= epOurs)) || (sTheirs > sOurs)) { + qDebug() << "Matched episode:" << ep; + qDebug() << "Matched article:" << articleTitle; + return true; + } + } + } + else { // Normal range + QStringList range = ep.split('-'); + Q_ASSERT(range.size() == 2); + if (range.first().toInt() > range.last().toInt()) + continue; // Ignore this subrule completely + + int epOursFirst = range.first().toInt(); + int epOursLast = range.last().toInt(); + + // Extract partial match from article and compare as digits + pos = reg.indexIn(articleTitle); + + if (pos == -1) { + reg = QRegExp(partialPattern2, Qt::CaseInsensitive); + pos = reg.indexIn(articleTitle); + } + + if (pos != -1) { + int sTheirs = reg.cap(1).toInt(); + int epTheirs = reg.cap(2).toInt(); + if ((sTheirs == sOurs) && ((epOursFirst <= epTheirs) && (epOursLast >= epTheirs))) { + qDebug() << "Matched episode:" << ep; + qDebug() << "Matched article:" << articleTitle; + return true; + } + } + } + } + else { // Single number + QString expStr("\\b(?:s0?" + s + "[ -_\\.]?" + "e0?" + ep + "|" + s + "x" + "0?" + ep + ")(?:\\D|\\b)"); + QRegExp reg(expStr, Qt::CaseInsensitive); + if (reg.indexIn(articleTitle) != -1) { + qDebug() << "Matched episode:" << ep; + qDebug() << "Matched article:" << articleTitle; + return true; + } + } + } + + return false; + } + + qDebug() << "Matched article:" << articleTitle; + return true; +} + +void DownloadRule::setMustContain(const QString &tokens) +{ + if (m_useRegex) + m_mustContain = QStringList() << tokens; + else + m_mustContain = tokens.split("|"); + + // Check for single empty string - if so, no condition + if ((m_mustContain.size() == 1) && m_mustContain[0].isEmpty()) + m_mustContain.clear(); +} + +void DownloadRule::setMustNotContain(const QString &tokens) +{ + if (m_useRegex) + m_mustNotContain = QStringList() << tokens; + else + m_mustNotContain = tokens.split("|"); + + // Check for single empty string - if so, no condition + if ((m_mustNotContain.size() == 1) && m_mustNotContain[0].isEmpty()) + m_mustNotContain.clear(); +} + +QStringList DownloadRule::rssFeeds() const +{ + return m_rssFeeds; +} + +void DownloadRule::setRssFeeds(const QStringList &rssFeeds) +{ + m_rssFeeds = rssFeeds; +} + +QString DownloadRule::name() const +{ + return m_name; +} + +void DownloadRule::setName(const QString &name) +{ + m_name = name; +} + +QString DownloadRule::savePath() const +{ + return m_savePath; +} + +DownloadRulePtr DownloadRule::fromVariantHash(const QVariantHash &ruleHash) +{ + DownloadRulePtr rule(new DownloadRule); + rule->setName(ruleHash.value("name").toString()); + rule->setUseRegex(ruleHash.value("use_regex", false).toBool()); + rule->setMustContain(ruleHash.value("must_contain").toString()); + rule->setMustNotContain(ruleHash.value("must_not_contain").toString()); + rule->setEpisodeFilter(ruleHash.value("episode_filter").toString()); + rule->setRssFeeds(ruleHash.value("affected_feeds").toStringList()); + rule->setEnabled(ruleHash.value("enabled", false).toBool()); + rule->setSavePath(ruleHash.value("save_path").toString()); + rule->setCategory(ruleHash.value("category_assigned").toString()); + rule->setAddPaused(AddPausedState(ruleHash.value("add_paused").toUInt())); + rule->setLastMatch(ruleHash.value("last_match").toDateTime()); + rule->setIgnoreDays(ruleHash.value("ignore_days").toInt()); + return rule; +} + +QVariantHash DownloadRule::toVariantHash() const +{ + QVariantHash hash; + hash["name"] = m_name; + hash["must_contain"] = m_mustContain.join("|"); + hash["must_not_contain"] = m_mustNotContain.join("|"); + hash["save_path"] = m_savePath; + hash["affected_feeds"] = m_rssFeeds; + hash["enabled"] = m_enabled; + hash["category_assigned"] = m_category; + hash["use_regex"] = m_useRegex; + hash["add_paused"] = m_apstate; + hash["episode_filter"] = m_episodeFilter; + hash["last_match"] = m_lastMatch; + hash["ignore_days"] = m_ignoreDays; + return hash; +} + +bool DownloadRule::operator==(const DownloadRule &other) const +{ + return m_name == other.name(); +} + +void DownloadRule::setSavePath(const QString &savePath) +{ + m_savePath = Utils::Fs::fromNativePath(savePath); +} + +DownloadRule::AddPausedState DownloadRule::addPaused() const +{ + return m_apstate; +} + +void DownloadRule::setAddPaused(const DownloadRule::AddPausedState &aps) +{ + m_apstate = aps; +} + +QString DownloadRule::category() const +{ + return m_category; +} + +void DownloadRule::setCategory(const QString &category) +{ + m_category = category; +} + +bool DownloadRule::isEnabled() const +{ + return m_enabled; +} + +void DownloadRule::setEnabled(bool enable) +{ + m_enabled = enable; +} + +void DownloadRule::setLastMatch(const QDateTime &d) +{ + m_lastMatch = d; +} + +QDateTime DownloadRule::lastMatch() const +{ + return m_lastMatch; +} + +void DownloadRule::setIgnoreDays(int d) +{ + m_ignoreDays = d; +} + +int DownloadRule::ignoreDays() const +{ + return m_ignoreDays; +} + +QString DownloadRule::mustContain() const +{ + return m_mustContain.join("|"); +} + +QString DownloadRule::mustNotContain() const +{ + return m_mustNotContain.join("|"); +} + +bool DownloadRule::useRegex() const +{ + return m_useRegex; +} + +void DownloadRule::setUseRegex(bool enabled) +{ + m_useRegex = enabled; +} + +QString DownloadRule::episodeFilter() const +{ + return m_episodeFilter; +} + +void DownloadRule::setEpisodeFilter(const QString &e) +{ + m_episodeFilter = e; +} + +QStringList DownloadRule::findMatchingArticles(const FeedPtr &feed) const +{ + QStringList ret; + const ArticleHash &feedArticles = feed->articleHash(); + + ArticleHash::ConstIterator artIt = feedArticles.begin(); + ArticleHash::ConstIterator artItend = feedArticles.end(); + for (; artIt != artItend; ++artIt) { + const QString title = artIt.value()->title(); + qDebug() << "Matching article:" << title; + if (matches(title)) + ret << title; + } + return ret; +} diff -Nru qbittorrent-4.1.3/src/base/rss/rssdownloadrule.h qbittorrent-3.3.15/src/base/rss/rssdownloadrule.h --- qbittorrent-4.1.3/src/base/rss/rssdownloadrule.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rssdownloadrule.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,108 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2010 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef RSSDOWNLOADRULE_H +#define RSSDOWNLOADRULE_H + +#include +#include +#include +#include + +namespace Rss +{ + class Feed; + typedef QSharedPointer FeedPtr; + + class DownloadRule; + typedef QSharedPointer DownloadRulePtr; + + class DownloadRule + { + public: + enum AddPausedState + { + USE_GLOBAL = 0, + ALWAYS_PAUSED, + NEVER_PAUSED + }; + + DownloadRule(); + + static DownloadRulePtr fromVariantHash(const QVariantHash &ruleHash); + QVariantHash toVariantHash() const; + bool matches(const QString &articleTitle) const; + void setMustContain(const QString &tokens); + void setMustNotContain(const QString &tokens); + QStringList rssFeeds() const; + void setRssFeeds(const QStringList &rssFeeds); + QString name() const; + void setName(const QString &name); + QString savePath() const; + void setSavePath(const QString &savePath); + AddPausedState addPaused() const; + void setAddPaused(const AddPausedState &aps); + QString category() const; + void setCategory(const QString &category); + bool isEnabled() const; + void setEnabled(bool enable); + void setLastMatch(const QDateTime &d); + QDateTime lastMatch() const; + void setIgnoreDays(int d); + int ignoreDays() const; + QString mustContain() const; + QString mustNotContain() const; + bool useRegex() const; + void setUseRegex(bool enabled); + QString episodeFilter() const; + void setEpisodeFilter(const QString &e); + QStringList findMatchingArticles(const FeedPtr &feed) const; + // Operators + bool operator==(const DownloadRule &other) const; + + private: + bool matches(const QString &articleTitle, const QString &expression) const; + + QString m_name; + QStringList m_mustContain; + QStringList m_mustNotContain; + QString m_episodeFilter; + QString m_savePath; + QString m_category; + bool m_enabled; + QStringList m_rssFeeds; + bool m_useRegex; + AddPausedState m_apstate; + QDateTime m_lastMatch; + int m_ignoreDays; + }; +} + +#endif // RSSDOWNLOADRULE_H diff -Nru qbittorrent-4.1.3/src/base/rss/rssdownloadrulelist.cpp qbittorrent-3.3.15/src/base/rss/rssdownloadrulelist.cpp --- qbittorrent-4.1.3/src/base/rss/rssdownloadrulelist.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rssdownloadrulelist.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,186 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2010 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#include +#include +#include + +#include "base/preferences.h" +#include "base/qinisettings.h" +#include "rssdownloadrulelist.h" + +using namespace Rss; + +DownloadRuleList::DownloadRuleList() +{ + loadRulesFromStorage(); +} + +DownloadRulePtr DownloadRuleList::findMatchingRule(const QString &feedUrl, const QString &articleTitle) const +{ + Q_ASSERT(Preferences::instance()->isRssDownloadingEnabled()); + qDebug() << "Matching article:" << articleTitle; + QStringList ruleNames = m_feedRules.value(feedUrl); + foreach (const QString &rule_name, ruleNames) { + DownloadRulePtr rule = m_rules[rule_name]; + if (rule->isEnabled() && rule->matches(articleTitle)) return rule; + } + return DownloadRulePtr(); +} + +void DownloadRuleList::replace(DownloadRuleList *other) +{ + m_rules.clear(); + m_feedRules.clear(); + foreach (const QString &name, other->ruleNames()) { + saveRule(other->getRule(name)); + } +} + +void DownloadRuleList::saveRulesToStorage() +{ + QIniSettings qBTRSS("qBittorrent", "qBittorrent-rss"); + qBTRSS.setValue("download_rules", toVariantHash()); +} + +void DownloadRuleList::loadRulesFromStorage() +{ + QIniSettings qBTRSS("qBittorrent", "qBittorrent-rss"); + loadRulesFromVariantHash(qBTRSS.value("download_rules").toHash()); +} + +QVariantHash DownloadRuleList::toVariantHash() const +{ + QVariantHash ret; + foreach (const DownloadRulePtr &rule, m_rules.values()) { + ret.insert(rule->name(), rule->toVariantHash()); + } + return ret; +} + +void DownloadRuleList::loadRulesFromVariantHash(const QVariantHash &h) +{ + QVariantHash::ConstIterator it = h.begin(); + QVariantHash::ConstIterator itend = h.end(); + for ( ; it != itend; ++it) { + DownloadRulePtr rule = DownloadRule::fromVariantHash(it.value().toHash()); + if (rule && !rule->name().isEmpty()) + saveRule(rule); + } +} + +void DownloadRuleList::saveRule(const DownloadRulePtr &rule) +{ + qDebug() << Q_FUNC_INFO << rule->name(); + Q_ASSERT(rule); + if (m_rules.contains(rule->name())) { + qDebug("This is an update, removing old rule first"); + removeRule(rule->name()); + } + m_rules.insert(rule->name(), rule); + // Update feedRules hashtable + foreach (const QString &feedUrl, rule->rssFeeds()) { + m_feedRules[feedUrl].append(rule->name()); + } + qDebug() << Q_FUNC_INFO << "EXIT"; +} + +void DownloadRuleList::removeRule(const QString &name) +{ + qDebug() << Q_FUNC_INFO << name; + if (!m_rules.contains(name)) return; + DownloadRulePtr rule = m_rules.take(name); + // Update feedRules hashtable + foreach (const QString &feedUrl, rule->rssFeeds()) { + m_feedRules[feedUrl].removeOne(rule->name()); + } +} + +void DownloadRuleList::renameRule(const QString &oldName, const QString &newName) +{ + if (!m_rules.contains(oldName)) return; + + DownloadRulePtr rule = m_rules.take(oldName); + rule->setName(newName); + m_rules.insert(newName, rule); + // Update feedRules hashtable + foreach (const QString &feedUrl, rule->rssFeeds()) { + m_feedRules[feedUrl].replace(m_feedRules[feedUrl].indexOf(oldName), newName); + } +} + +DownloadRulePtr DownloadRuleList::getRule(const QString &name) const +{ + return m_rules.value(name); +} + +QStringList DownloadRuleList::ruleNames() const +{ + return m_rules.keys(); +} + +bool DownloadRuleList::isEmpty() const +{ + return m_rules.isEmpty(); +} + +bool DownloadRuleList::serialize(const QString &path) +{ + QFile f(path); + if (f.open(QIODevice::WriteOnly)) { + QDataStream out(&f); + out.setVersion(QDataStream::Qt_4_5); + out << toVariantHash(); + f.close(); + return true; + } + + return false; +} + +bool DownloadRuleList::unserialize(const QString &path) +{ + QFile f(path); + if (f.open(QIODevice::ReadOnly)) { + QDataStream in(&f); + in.setVersion(QDataStream::Qt_4_5); + QVariantHash tmp; + in >> tmp; + f.close(); + if (tmp.isEmpty()) + return false; + qDebug("Processing was successful!"); + loadRulesFromVariantHash(tmp); + return true; + } else { + qDebug("Error: could not open file at %s", qPrintable(path)); + return false; + } +} diff -Nru qbittorrent-4.1.3/src/base/rss/rssdownloadrulelist.h qbittorrent-3.3.15/src/base/rss/rssdownloadrulelist.h --- qbittorrent-4.1.3/src/base/rss/rssdownloadrulelist.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rssdownloadrulelist.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,73 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2010 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef RSSDOWNLOADRULELIST_H +#define RSSDOWNLOADRULELIST_H + +#include +#include +#include + +#include "rssdownloadrule.h" + +namespace Rss +{ + class DownloadRuleList + { + Q_DISABLE_COPY(DownloadRuleList) + + public: + DownloadRuleList(); + + DownloadRulePtr findMatchingRule(const QString &feedUrl, const QString &articleTitle) const; + // Operators + void saveRule(const DownloadRulePtr &rule); + void removeRule(const QString &name); + void renameRule(const QString &oldName, const QString &newName); + DownloadRulePtr getRule(const QString &name) const; + QStringList ruleNames() const; + bool isEmpty() const; + void saveRulesToStorage(); + bool serialize(const QString &path); + bool unserialize(const QString &path); + void replace(DownloadRuleList *other); + + private: + void loadRulesFromStorage(); + void loadRulesFromVariantHash(const QVariantHash &l); + QVariantHash toVariantHash() const; + + private: + QHash m_rules; + QHash m_feedRules; + }; +} + +#endif // RSSDOWNLOADFILTERLIST_H diff -Nru qbittorrent-4.1.3/src/base/rss/rss_feed.cpp qbittorrent-3.3.15/src/base/rss/rss_feed.cpp --- qbittorrent-4.1.3/src/base/rss/rss_feed.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rss_feed.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,481 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015, 2017 Vladimir Golovnev - * Copyright (C) 2010 Christophe Dumez - * Copyright (C) 2010 Arnaud Demaiziere - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "rss_feed.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../asyncfilestorage.h" -#include "../global.h" -#include "../logger.h" -#include "../net/downloadhandler.h" -#include "../net/downloadmanager.h" -#include "../profile.h" -#include "../utils/fs.h" -#include "private/rss_parser.h" -#include "rss_article.h" -#include "rss_session.h" - -const QString KEY_UID(QStringLiteral("uid")); -const QString KEY_URL(QStringLiteral("url")); -const QString KEY_TITLE(QStringLiteral("title")); -const QString KEY_LASTBUILDDATE(QStringLiteral("lastBuildDate")); -const QString KEY_ISLOADING(QStringLiteral("isLoading")); -const QString KEY_HASERROR(QStringLiteral("hasError")); -const QString KEY_ARTICLES(QStringLiteral("articles")); - -using namespace RSS; - -Feed::Feed(const QUuid &uid, const QString &url, const QString &path, Session *session) - : Item(path) - , m_session(session) - , m_uid(uid) - , m_url(url) -{ - m_dataFileName = QString::fromLatin1(m_uid.toRfc4122().toHex()) + QLatin1String(".json"); - - // Move to new file naming scheme (since v4.1.2) - const QString legacyFilename {Utils::Fs::toValidFileSystemName(m_url, false, QLatin1String("_")) - + QLatin1String(".json")}; - const QDir storageDir {m_session->dataFileStorage()->storageDir()}; - if (!QFile::exists(storageDir.absoluteFilePath(m_dataFileName))) - QFile::rename(storageDir.absoluteFilePath(legacyFilename), storageDir.absoluteFilePath(m_dataFileName)); - - m_parser = new Private::Parser(m_lastBuildDate); - m_parser->moveToThread(m_session->workingThread()); - connect(this, &Feed::destroyed, m_parser, &Private::Parser::deleteLater); - connect(m_parser, &Private::Parser::finished, this, &Feed::handleParsingFinished); - - connect(m_session, &Session::maxArticlesPerFeedChanged, this, &Feed::handleMaxArticlesPerFeedChanged); - - if (m_session->isProcessingEnabled()) - downloadIcon(); - else - connect(m_session, &Session::processingStateChanged, this, &Feed::handleSessionProcessingEnabledChanged); - - Net::DownloadManager::instance()->registerSequentialService(Net::ServiceID::fromURL(m_url)); - - load(); -} - -Feed::~Feed() -{ - emit aboutToBeDestroyed(this); - Utils::Fs::forceRemove(m_iconPath); -} - -QList
Feed::articles() const -{ - return m_articlesByDate; -} - -void Feed::markAsRead() -{ - auto oldUnreadCount = m_unreadCount; - foreach (Article *article, m_articles) { - if (!article->isRead()) { - article->disconnect(this); - article->markAsRead(); - --m_unreadCount; - emit articleRead(article); - } - } - - if (m_unreadCount != oldUnreadCount) { - m_dirty = true; - store(); - emit unreadCountChanged(this); - } -} - -void Feed::refresh() -{ - if (isLoading()) return; - - // NOTE: Should we allow manually refreshing for disabled session? - - Net::DownloadHandler *handler = Net::DownloadManager::instance()->download({m_url}); - connect(handler - , static_cast(&Net::DownloadHandler::downloadFinished) - , this, &Feed::handleDownloadFinished); - connect(handler, &Net::DownloadHandler::downloadFailed, this, &Feed::handleDownloadFailed); - - m_isLoading = true; - emit stateChanged(this); -} - -QUuid Feed::uid() const -{ - return m_uid; -} - -QString Feed::url() const -{ - return m_url; -} - -QString Feed::title() const -{ - return m_title; -} - -bool Feed::isLoading() const -{ - return m_isLoading; -} - -QString Feed::lastBuildDate() const -{ - return m_lastBuildDate; -} - -int Feed::unreadCount() const -{ - return m_unreadCount; -} - -Article *Feed::articleByGUID(const QString &guid) const -{ - return m_articles.value(guid); -} - -void Feed::handleMaxArticlesPerFeedChanged(int n) -{ - while (m_articlesByDate.size() > n) - removeOldestArticle(); - // We don't need store articles here -} - -void Feed::handleIconDownloadFinished(const QString &url, const QString &filePath) -{ - Q_UNUSED(url); - - m_iconPath = Utils::Fs::fromNativePath(filePath); - emit iconLoaded(this); -} - -bool Feed::hasError() const -{ - return m_hasError; -} - -void Feed::handleDownloadFinished(const QString &url, const QByteArray &data) -{ - qDebug() << "Successfully downloaded RSS feed at" << url; - // Parse the download RSS - m_parser->parse(data); -} - -void Feed::handleDownloadFailed(const QString &url, const QString &error) -{ - m_isLoading = false; - m_hasError = true; - - LogMsg(tr("Failed to download RSS feed at '%1'. Reason: %2").arg(url, error) - , Log::WARNING); - - emit stateChanged(this); -} - -void Feed::handleParsingFinished(const RSS::Private::ParsingResult &result) -{ - m_hasError = !result.error.isEmpty(); - - // For some reason, the RSS feed may contain malformed XML data and it may not be - // successfully parsed by the XML parser. We are still trying to load as many articles - // as possible until we encounter corrupted data. So we can have some articles here - // even in case of parsing error. - if (!m_hasError || !result.articles.isEmpty()) { - if (title() != result.title) { - m_title = result.title; - emit titleChanged(this); - } - - m_lastBuildDate = result.lastBuildDate; - - int newArticlesCount = 0; - const QDateTime now {QDateTime::currentDateTime()}; - for (QVariantHash varHash : result.articles) { - // if article has no publication date we use feed update time as a fallback - QVariant &articleDate = varHash[Article::KeyDate]; - if (!articleDate.toDateTime().isValid()) - articleDate = now; - - try { - auto article = new Article(this, varHash); - if (addArticle(article)) - ++newArticlesCount; - else - delete article; - } - catch (const std::runtime_error&) {} - } - - m_dirty = (newArticlesCount > 0); - store(); - - LogMsg(tr("RSS feed at '%1' updated. Added %2 new articles.") - .arg(m_url, QString::number(newArticlesCount))); - } - - if (m_hasError) { - LogMsg(tr("Failed to parse RSS feed at '%1'. Reason: %2").arg(m_url, result.error) - , Log::WARNING); - } - - m_isLoading = false; - emit stateChanged(this); -} - -void Feed::load() -{ - QFile file(m_session->dataFileStorage()->storageDir().absoluteFilePath(m_dataFileName)); - - if (!file.exists()) { - loadArticlesLegacy(); - m_dirty = true; - store(); // convert to new format - } - else if (file.open(QFile::ReadOnly)) { - loadArticles(file.readAll()); - file.close(); - } - else { - LogMsg(tr("Couldn't read RSS Session data from %1. Error: %2") - .arg(m_dataFileName, file.errorString()) - , Log::WARNING); - } -} - -void Feed::loadArticles(const QByteArray &data) -{ - QJsonParseError jsonError; - QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &jsonError); - if (jsonError.error != QJsonParseError::NoError) { - LogMsg(tr("Couldn't parse RSS Session data. Error: %1").arg(jsonError.errorString()) - , Log::WARNING); - return; - } - - if (!jsonDoc.isArray()) { - LogMsg(tr("Couldn't load RSS Session data. Invalid data format."), Log::WARNING); - return; - } - - QJsonArray jsonArr = jsonDoc.array(); - int i = -1; - foreach (const QJsonValue &jsonVal, jsonArr) { - ++i; - if (!jsonVal.isObject()) { - LogMsg(tr("Couldn't load RSS article '%1#%2'. Invalid data format.").arg(m_url).arg(i) - , Log::WARNING); - continue; - } - - try { - auto article = new Article(this, jsonVal.toObject()); - if (!addArticle(article)) - delete article; - } - catch (const std::runtime_error&) {} - } -} - -void Feed::loadArticlesLegacy() -{ - SettingsPtr qBTRSSFeeds = Profile::instance().applicationSettings(QStringLiteral("qBittorrent-rss-feeds")); - QVariantHash allOldItems = qBTRSSFeeds->value("old_items").toHash(); - - foreach (const QVariant &var, allOldItems.value(m_url).toList()) { - auto hash = var.toHash(); - // update legacy keys - hash[Article::KeyLink] = hash.take(QLatin1String("news_link")); - hash[Article::KeyTorrentURL] = hash.take(QLatin1String("torrent_url")); - hash[Article::KeyIsRead] = hash.take(QLatin1String("read")); - try { - auto article = new Article(this, hash); - if (!addArticle(article)) - delete article; - } - catch (const std::runtime_error&) {} - } -} - -void Feed::store() -{ - if (!m_dirty) return; - - m_dirty = false; - m_savingTimer.stop(); - - QJsonArray jsonArr; - foreach (Article *article, m_articles) - jsonArr << article->toJsonObject(); - - m_session->dataFileStorage()->store(m_dataFileName, QJsonDocument(jsonArr).toJson()); -} - -void Feed::storeDeferred() -{ - if (!m_savingTimer.isActive()) - m_savingTimer.start(5 * 1000, this); -} - -bool Feed::addArticle(Article *article) -{ - Q_ASSERT(article); - - if (m_articles.contains(article->guid())) - return false; - - // Insertion sort - const int maxArticles = m_session->maxArticlesPerFeed(); - auto lowerBound = std::lower_bound(m_articlesByDate.begin(), m_articlesByDate.end() - , article->date(), Article::articleDateRecentThan); - if ((lowerBound - m_articlesByDate.begin()) >= maxArticles) - return false; // we reach max articles - - m_articles[article->guid()] = article; - m_articlesByDate.insert(lowerBound, article); - if (!article->isRead()) { - increaseUnreadCount(); - connect(article, &Article::read, this, &Feed::handleArticleRead); - } - emit newArticle(article); - - if (m_articlesByDate.size() > maxArticles) - removeOldestArticle(); - - return true; -} - -void Feed::removeOldestArticle() -{ - auto oldestArticle = m_articlesByDate.last(); - emit articleAboutToBeRemoved(oldestArticle); - - m_articles.remove(oldestArticle->guid()); - m_articlesByDate.removeLast(); - bool isRead = oldestArticle->isRead(); - delete oldestArticle; - - if (!isRead) - decreaseUnreadCount(); -} - -void Feed::increaseUnreadCount() -{ - ++m_unreadCount; - emit unreadCountChanged(this); -} - -void Feed::decreaseUnreadCount() -{ - Q_ASSERT(m_unreadCount > 0); - - --m_unreadCount; - emit unreadCountChanged(this); -} - -void Feed::downloadIcon() -{ - // Download the RSS Feed icon - // XXX: This works for most sites but it is not perfect - const QUrl url(m_url); - auto iconUrl = QString("%1://%2/favicon.ico").arg(url.scheme(), url.host()); - Net::DownloadHandler *handler = Net::DownloadManager::instance()->download( - Net::DownloadRequest(iconUrl).saveToFile(true)); - connect(handler - , static_cast(&Net::DownloadHandler::downloadFinished) - , this, &Feed::handleIconDownloadFinished); -} - -QString Feed::iconPath() const -{ - return m_iconPath; -} - -QJsonValue Feed::toJsonValue(bool withData) const -{ - QJsonObject jsonObj; - jsonObj.insert(KEY_UID, uid().toString()); - jsonObj.insert(KEY_URL, url()); - - if (withData) { - jsonObj.insert(KEY_TITLE, title()); - jsonObj.insert(KEY_LASTBUILDDATE, lastBuildDate()); - jsonObj.insert(KEY_ISLOADING, isLoading()); - jsonObj.insert(KEY_HASERROR, hasError()); - - QJsonArray jsonArr; - for (Article *article : qAsConst(m_articles)) - jsonArr << article->toJsonObject(); - jsonObj.insert(KEY_ARTICLES, jsonArr); - } - - return jsonObj; -} - -void Feed::handleSessionProcessingEnabledChanged(bool enabled) -{ - if (enabled) { - downloadIcon(); - disconnect(m_session, &Session::processingStateChanged - , this, &Feed::handleSessionProcessingEnabledChanged); - } -} - -void Feed::handleArticleRead(Article *article) -{ - article->disconnect(this); - decreaseUnreadCount(); - emit articleRead(article); - // will be stored deferred - m_dirty = true; - storeDeferred(); -} - -void Feed::cleanup() -{ - Utils::Fs::forceRemove(m_session->dataFileStorage()->storageDir().absoluteFilePath(m_dataFileName)); -} - -void Feed::timerEvent(QTimerEvent *event) -{ - Q_UNUSED(event); - store(); -} diff -Nru qbittorrent-4.1.3/src/base/rss/rssfeed.cpp qbittorrent-3.3.15/src/base/rss/rssfeed.cpp --- qbittorrent-4.1.3/src/base/rss/rssfeed.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rssfeed.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,458 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2015 Vladimir Golovnev + * Copyright (C) 2010 Christophe Dumez + * Copyright (C) 2010 Arnaud Demaiziere + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact: chris@qbittorrent.org, arnaud@qbittorrent.org + */ + +#include + +#include "base/preferences.h" +#include "base/qinisettings.h" +#include "base/logger.h" +#include "base/bittorrent/session.h" +#include "base/bittorrent/magneturi.h" +#include "base/utils/misc.h" +#include "base/utils/fs.h" +#include "base/net/downloadmanager.h" +#include "base/net/downloadhandler.h" +#include "private/rssparser.h" +#include "rssdownloadrulelist.h" +#include "rssarticle.h" +#include "rssfolder.h" +#include "rssmanager.h" +#include "rssfeed.h" + +namespace Rss +{ + bool articleDateRecentThan(const ArticlePtr &left, const ArticlePtr &right) + { + return left->date() > right->date(); + } +} + +using namespace Rss; + +Feed::Feed(const QString &url, Manager *manager) + : m_manager(manager) + , m_url (QUrl::fromEncoded(url.toUtf8()).toString()) + , m_icon(":/icons/oxygen/application-rss+xml.png") + , m_unreadCount(0) + , m_dirty(false) + , m_inErrorState(false) + , m_loading(false) +{ + qDebug() << Q_FUNC_INFO << m_url; + m_parser = new Private::Parser; + m_parser->moveToThread(m_manager->workingThread()); + connect(this, SIGNAL(destroyed()), m_parser, SLOT(deleteLater())); + // Listen for new RSS downloads + connect(m_parser, SIGNAL(feedTitle(QString)), SLOT(handleFeedTitle(QString))); + connect(m_parser, SIGNAL(newArticle(QVariantHash)), SLOT(handleNewArticle(QVariantHash))); + connect(m_parser, SIGNAL(finished(QString)), SLOT(handleParsingFinished(QString))); + + // Download the RSS Feed icon + Net::DownloadHandler *handler = Net::DownloadManager::instance()->downloadUrl(iconUrl(), true); + connect(handler, SIGNAL(downloadFinished(QString,QString)), this, SLOT(handleIconDownloadFinished(QString,QString))); + + // Load old RSS articles + loadItemsFromDisk(); + + refresh(); +} + +Feed::~Feed() +{ + if (!m_icon.startsWith(":/") && QFile::exists(m_icon)) + Utils::Fs::forceRemove(m_icon); +} + +void Feed::saveItemsToDisk() +{ + qDebug() << Q_FUNC_INFO << m_url; + if (!m_dirty) return; + + m_dirty = false; + + QIniSettings qBTRSSFeeds("qBittorrent", "qBittorrent-rss-feeds"); + QVariantList oldItems; + + ArticleHash::ConstIterator it = m_articles.begin(); + ArticleHash::ConstIterator itend = m_articles.end(); + for (; it != itend; ++it) + oldItems << it.value()->toHash(); + qDebug("Saving %d old items for feed %s", oldItems.size(), qPrintable(displayName())); + QHash allOldItems = qBTRSSFeeds.value("old_items", QHash()).toHash(); + allOldItems[m_url] = oldItems; + qBTRSSFeeds.setValue("old_items", allOldItems); +} + +void Feed::loadItemsFromDisk() +{ + QIniSettings qBTRSSFeeds("qBittorrent", "qBittorrent-rss-feeds"); + QHash allOldItems = qBTRSSFeeds.value("old_items", QHash()).toHash(); + + const QVariantList oldItems = allOldItems.value(m_url, QVariantList()).toList(); + qDebug("Loading %d old items for feed %s", oldItems.size(), qPrintable(displayName())); + + foreach (const QVariant &var_it, oldItems) { + QVariantHash item = var_it.toHash(); + ArticlePtr rssItem = Article::fromHash(this, item); + if (rssItem) + addArticle(rssItem); + } +} + +void Feed::addArticle(const ArticlePtr &article) +{ + int maxArticles = Preferences::instance()->getRSSMaxArticlesPerFeed(); + + if (!m_articles.contains(article->guid())) { + m_dirty = true; + + // Update unreadCount + if (!article->isRead()) + ++m_unreadCount; + // Insert in hash table + m_articles[article->guid()] = article; + if (!article->isRead()) // Optimization + connect(article.data(), SIGNAL(articleWasRead()), SLOT(handleArticleRead()), Qt::UniqueConnection); + // Insertion sort + ArticleList::Iterator lowerBound = qLowerBound(m_articlesByDate.begin(), m_articlesByDate.end(), article, articleDateRecentThan); + m_articlesByDate.insert(lowerBound, article); + int lbIndex = m_articlesByDate.indexOf(article); + if (m_articlesByDate.size() > maxArticles) { + ArticlePtr oldestArticle = m_articlesByDate.takeLast(); + m_articles.remove(oldestArticle->guid()); + // Update unreadCount + if (!oldestArticle->isRead()) + --m_unreadCount; + } + + // Check if article was inserted at the end of the list and will break max_articles limit + if (Preferences::instance()->isRssDownloadingEnabled()) + if ((lbIndex < maxArticles) && !article->isRead()) + downloadArticleTorrentIfMatching(article); + } + else { + // m_articles.contains(article->guid()) + // Try to download skipped articles + if (Preferences::instance()->isRssDownloadingEnabled()) { + ArticlePtr skipped = m_articles.value(article->guid(), ArticlePtr()); + if (skipped) + if (!skipped->isRead()) + downloadArticleTorrentIfMatching(skipped); + } + } +} + +bool Feed::refresh() +{ + if (m_loading) { + qWarning() << Q_FUNC_INFO << "Feed" << displayName() << "is already being refreshed, ignoring request"; + return false; + } + m_loading = true; + // Download the RSS again + Net::DownloadHandler *handler = Net::DownloadManager::instance()->downloadUrl(m_url); + connect(handler, SIGNAL(downloadFinished(QString,QByteArray)), this, SLOT(handleRssDownloadFinished(QString,QByteArray))); + connect(handler, SIGNAL(downloadFailed(QString,QString)), this, SLOT(handleRssDownloadFailed(QString,QString))); + return true; +} + +QString Feed::id() const +{ + return m_url; +} + +void Feed::removeAllSettings() +{ + qDebug() << "Removing all settings / history for feed: " << m_url; + QIniSettings qBTRSS("qBittorrent", "qBittorrent-rss"); + QVariantHash feedsWDownloader = qBTRSS.value("downloader_on", QVariantHash()).toHash(); + if (feedsWDownloader.contains(m_url)) { + feedsWDownloader.remove(m_url); + qBTRSS.setValue("downloader_on", feedsWDownloader); + } + QVariantHash allFeedsFilters = qBTRSS.value("feed_filters", QVariantHash()).toHash(); + if (allFeedsFilters.contains(m_url)) { + allFeedsFilters.remove(m_url); + qBTRSS.setValue("feed_filters", allFeedsFilters); + } + QIniSettings qBTRSSFeeds("qBittorrent", "qBittorrent-rss-feeds"); + QVariantHash allOldItems = qBTRSSFeeds.value("old_items", QVariantHash()).toHash(); + if (allOldItems.contains(m_url)) { + allOldItems.remove(m_url); + qBTRSSFeeds.setValue("old_items", allOldItems); + } +} + +bool Feed::isLoading() const +{ + return m_loading; +} + +QString Feed::title() const +{ + return m_title; +} + +void Feed::rename(const QString &newName) +{ + qDebug() << "Renaming stream to" << newName; + m_alias = newName; +} + +// Return the alias if the stream has one, the url if it has no alias +QString Feed::displayName() const +{ + if (!m_alias.isEmpty()) + return m_alias; + if (!m_title.isEmpty()) + return m_title; + return m_url; +} + +QString Feed::url() const +{ + return m_url; +} + +QString Feed::iconPath() const +{ + if (m_inErrorState) + return QLatin1String(":/icons/oxygen/unavailable.png"); + + return m_icon; +} + +bool Feed::hasCustomIcon() const +{ + return !m_icon.startsWith(":/"); +} + +void Feed::setIconPath(const QString &path) +{ + QString nativePath = Utils::Fs::fromNativePath(path); + if ((nativePath == m_icon) || nativePath.isEmpty() || !QFile::exists(nativePath)) return; + + if (!m_icon.startsWith(":/") && QFile::exists(m_icon)) + Utils::Fs::forceRemove(m_icon); + + m_icon = nativePath; +} + +ArticlePtr Feed::getItem(const QString &guid) const +{ + return m_articles.value(guid); +} + +uint Feed::count() const +{ + return m_articles.size(); +} + +void Feed::markAsRead() +{ + ArticleHash::ConstIterator it = m_articles.begin(); + ArticleHash::ConstIterator itend = m_articles.end(); + for (; it != itend; ++it) + it.value()->markAsRead(); + m_unreadCount = 0; + m_manager->forwardFeedInfosChanged(m_url, displayName(), 0); +} + +uint Feed::unreadCount() const +{ + return m_unreadCount; +} + +ArticleList Feed::articleListByDateDesc() const +{ + return m_articlesByDate; +} + +const ArticleHash &Feed::articleHash() const +{ + return m_articles; +} + +ArticleList Feed::unreadArticleListByDateDesc() const +{ + ArticleList unreadNews; + + ArticleList::ConstIterator it = m_articlesByDate.begin(); + ArticleList::ConstIterator itend = m_articlesByDate.end(); + for (; it != itend; ++it) + if (!(*it)->isRead()) + unreadNews << *it; + return unreadNews; +} + +// download the icon from the address +QString Feed::iconUrl() const +{ + // XXX: This works for most sites but it is not perfect + return QString("http://%1/favicon.ico").arg(QUrl(m_url).host()); +} + +void Feed::handleIconDownloadFinished(const QString &url, const QString &filePath) +{ + Q_UNUSED(url); + setIconPath(filePath); + qDebug() << Q_FUNC_INFO << "icon path:" << m_icon; + m_manager->forwardFeedIconChanged(m_url, m_icon); +} + +void Feed::handleRssDownloadFinished(const QString &url, const QByteArray &data) +{ + Q_UNUSED(url); + qDebug() << Q_FUNC_INFO << "Successfully downloaded RSS feed at" << m_url; + // Parse the download RSS + QMetaObject::invokeMethod(m_parser, "parse", Qt::QueuedConnection, Q_ARG(QByteArray, data)); +} + +void Feed::handleRssDownloadFailed(const QString &url, const QString &error) +{ + Q_UNUSED(url); + m_inErrorState = true; + m_loading = false; + m_manager->forwardFeedInfosChanged(m_url, displayName(), m_unreadCount); + qWarning() << "Failed to download RSS feed at" << m_url; + qWarning() << "Reason:" << error; +} + +void Feed::handleFeedTitle(const QString &title) +{ + if (m_title == title) return; + + m_title = title; + + // Notify that we now have something better than a URL to display + if (m_alias.isEmpty()) + m_manager->forwardFeedInfosChanged(m_url, title, m_unreadCount); +} + +void Feed::downloadArticleTorrentIfMatching(const ArticlePtr &article) +{ + Q_ASSERT(Preferences::instance()->isRssDownloadingEnabled()); + qDebug().nospace() << Q_FUNC_INFO << " Deferring matching of " << article->title() << " from " << displayName() << " RSS feed"; + m_manager->downloadArticleTorrentIfMatching(m_url, article); +} + +void Feed::deferredDownloadArticleTorrentIfMatching(const ArticlePtr &article) +{ + qDebug().nospace() << Q_FUNC_INFO << " Matching of " << article->title() << " from " << displayName() << " RSS feed"; + + DownloadRuleList *rules = m_manager->downloadRules(); + DownloadRulePtr matchingRule = rules->findMatchingRule(m_url, article->title()); + if (!matchingRule) return; + + if (matchingRule->ignoreDays() > 0) { + QDateTime lastMatch = matchingRule->lastMatch(); + if (lastMatch.isValid()) { + if (QDateTime::currentDateTime() < lastMatch.addDays(matchingRule->ignoreDays())) { + article->markAsRead(); + return; + } + } + } + + matchingRule->setLastMatch(QDateTime::currentDateTime()); + rules->saveRulesToStorage(); + // Download the torrent + const QString &torrentUrl = article->torrentUrl(); + if (torrentUrl.isEmpty()) { + Logger::instance()->addMessage(tr("Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link...").arg(article->title()).arg(displayName()), Log::WARNING); + article->markAsRead(); + return; + } + + Logger::instance()->addMessage(tr("Automatically downloading '%1' torrent from '%2' RSS feed...").arg(article->title()).arg(displayName())); + if (BitTorrent::MagnetUri(torrentUrl).isValid()) + article->markAsRead(); + else + connect(BitTorrent::Session::instance(), SIGNAL(downloadFromUrlFinished(QString)), article.data(), SLOT(handleTorrentDownloadSuccess(const QString&)), Qt::UniqueConnection); + + BitTorrent::AddTorrentParams params; + params.savePath = matchingRule->savePath(); + params.category = matchingRule->category(); + if (matchingRule->addPaused() == DownloadRule::ALWAYS_PAUSED) + params.addPaused = TriStateBool::True; + else if (matchingRule->addPaused() == DownloadRule::NEVER_PAUSED) + params.addPaused = TriStateBool::False; + BitTorrent::Session::instance()->addTorrent(torrentUrl, params); +} + +void Feed::recheckRssItemsForDownload() +{ + Q_ASSERT(Preferences::instance()->isRssDownloadingEnabled()); + foreach (const ArticlePtr &article, m_articlesByDate) + if (!article->isRead()) + downloadArticleTorrentIfMatching(article); +} + +void Feed::handleNewArticle(const QVariantHash &articleData) +{ + ArticlePtr article = Article::fromHash(this, articleData); + if (article.isNull()) { + qDebug() << "Article hash corrupted or guid is uncomputable; feed url: " << m_url; + return; + } + Q_ASSERT(article); + addArticle(article); + + m_manager->forwardFeedInfosChanged(m_url, displayName(), m_unreadCount); + // FIXME: We should forward the information here but this would seriously decrease + // performance with current design. + // m_manager->forwardFeedContentChanged(m_url); +} + +void Feed::handleParsingFinished(const QString &error) +{ + if (!error.isEmpty()) { + qWarning() << "Failed to parse RSS feed at" << m_url; + qWarning() << "Reason:" << error; + } + + m_loading = false; + m_inErrorState = !error.isEmpty(); + + m_manager->forwardFeedInfosChanged(m_url, displayName(), m_unreadCount); + // XXX: Would not be needed if we did this in handleNewArticle() instead + m_manager->forwardFeedContentChanged(m_url); + + saveItemsToDisk(); +} + +void Feed::handleArticleRead() +{ + --m_unreadCount; + m_dirty = true; + m_manager->forwardFeedInfosChanged(m_url, displayName(), m_unreadCount); +} diff -Nru qbittorrent-4.1.3/src/base/rss/rss_feed.h qbittorrent-3.3.15/src/base/rss/rss_feed.h --- qbittorrent-4.1.3/src/base/rss/rss_feed.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rss_feed.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,124 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015, 2017 Vladimir Golovnev - * Copyright (C) 2010 Christophe Dumez - * Copyright (C) 2010 Arnaud Demaiziere - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#pragma once - -#include -#include -#include -#include - -#include "rss_item.h" - -class AsyncFileStorage; - -namespace RSS -{ - class Article; - class Session; - - namespace Private - { - class Parser; - struct ParsingResult; - } - - class Feed final : public Item - { - Q_OBJECT - Q_DISABLE_COPY(Feed) - - friend class Session; - - Feed(const QUuid &uid, const QString &url, const QString &path, Session *session); - ~Feed() override; - - public: - QList
articles() const override; - int unreadCount() const override; - void markAsRead() override; - void refresh() override; - - QUuid uid() const; - QString url() const; - QString title() const; - QString lastBuildDate() const; - bool hasError() const; - bool isLoading() const; - Article *articleByGUID(const QString &guid) const; - QString iconPath() const; - - QJsonValue toJsonValue(bool withData = false) const override; - - signals: - void iconLoaded(Feed *feed = nullptr); - void titleChanged(Feed *feed = nullptr); - void stateChanged(Feed *feed = nullptr); - - private slots: - void handleSessionProcessingEnabledChanged(bool enabled); - void handleMaxArticlesPerFeedChanged(int n); - void handleIconDownloadFinished(const QString &url, const QString &filePath); - void handleDownloadFinished(const QString &url, const QByteArray &data); - void handleDownloadFailed(const QString &url, const QString &error); - void handleParsingFinished(const Private::ParsingResult &result); - void handleArticleRead(Article *article); - - private: - void timerEvent(QTimerEvent *event) override; - void cleanup() override; - void load(); - void loadArticles(const QByteArray &data); - void loadArticlesLegacy(); - void store(); - void storeDeferred(); - bool addArticle(Article *article); - void removeOldestArticle(); - void increaseUnreadCount(); - void decreaseUnreadCount(); - void downloadIcon(); - - Session *m_session; - Private::Parser *m_parser; - const QUuid m_uid; - const QString m_url; - QString m_title; - QString m_lastBuildDate; - bool m_hasError = false; - bool m_isLoading = false; - QHash m_articles; - QList
m_articlesByDate; - int m_unreadCount = 0; - QString m_iconPath; - QString m_dataFileName; - QBasicTimer m_savingTimer; - bool m_dirty = false; - }; -} diff -Nru qbittorrent-4.1.3/src/base/rss/rssfeed.h qbittorrent-3.3.15/src/base/rss/rssfeed.h --- qbittorrent-4.1.3/src/base/rss/rssfeed.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rssfeed.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,125 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2015 Vladimir Golovnev + * Copyright (C) 2010 Christophe Dumez + * Copyright (C) 2010 Arnaud Demaiziere + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact: chris@qbittorrent.org, arnaud@qbittorrent.org + */ + +#ifndef RSSFEED_H +#define RSSFEED_H + +#include +#include +#include +#include +#include + +#include "rssfile.h" + +namespace Rss +{ + class Folder; + class Feed; + class Manager; + class DownloadRuleList; + + typedef QHash ArticleHash; + typedef QSharedPointer FeedPtr; + typedef QList FeedList; + + namespace Private + { + class Parser; + } + + bool articleDateRecentThan(const ArticlePtr &left, const ArticlePtr &right); + + class Feed: public QObject, public File + { + Q_OBJECT + + public: + Feed(const QString &url, Manager * manager); + ~Feed(); + + bool refresh(); + QString id() const; + void removeAllSettings(); + void saveItemsToDisk(); + bool isLoading() const; + QString title() const; + void rename(const QString &newName); + QString displayName() const; + QString url() const; + QString iconPath() const; + bool hasCustomIcon() const; + void setIconPath(const QString &pathHierarchy); + ArticlePtr getItem(const QString &guid) const; + uint count() const; + void markAsRead(); + uint unreadCount() const; + ArticleList articleListByDateDesc() const; + const ArticleHash &articleHash() const; + ArticleList unreadArticleListByDateDesc() const; + void recheckRssItemsForDownload(); + + private slots: + void handleIconDownloadFinished(const QString &url, const QString &filePath); + void handleRssDownloadFinished(const QString &url, const QByteArray &data); + void handleRssDownloadFailed(const QString &url, const QString &error); + void handleFeedTitle(const QString &title); + void handleNewArticle(const QVariantHash &article); + void handleParsingFinished(const QString &error); + void handleArticleRead(); + + private: + friend class Manager; + + QString iconUrl() const; + void loadItemsFromDisk(); + void addArticle(const ArticlePtr &article); + void downloadArticleTorrentIfMatching(const ArticlePtr &article); + void deferredDownloadArticleTorrentIfMatching(const ArticlePtr &article); + + private: + Manager *m_manager; + Private::Parser *m_parser; + ArticleHash m_articles; + ArticleList m_articlesByDate; // Articles sorted by date (more recent first) + QString m_title; + QString m_url; + QString m_alias; + QString m_icon; + uint m_unreadCount; + bool m_dirty; + bool m_inErrorState; + bool m_loading; + }; +} + +#endif // RSSFEED_H diff -Nru qbittorrent-4.1.3/src/base/rss/rssfile.cpp qbittorrent-3.3.15/src/base/rss/rssfile.cpp --- qbittorrent-4.1.3/src/base/rss/rssfile.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rssfile.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,51 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2010 Christophe Dumez + * Copyright (C) 2010 Arnaud Demaiziere + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact: chris@qbittorrent.org, arnaud@qbittorrent.org + */ + +#include "rssfolder.h" +#include "rssfile.h" + +using namespace Rss; + +File::~File() {} + +Folder *File::parentFolder() const +{ + return m_parent; +} + +QStringList File::pathHierarchy() const +{ + QStringList path; + if (m_parent) + path << m_parent->pathHierarchy(); + path << id(); + return path; +} diff -Nru qbittorrent-4.1.3/src/base/rss/rssfile.h qbittorrent-3.3.15/src/base/rss/rssfile.h --- qbittorrent-4.1.3/src/base/rss/rssfile.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rssfile.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,82 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2010 Christophe Dumez + * Copyright (C) 2010 Arnaud Demaiziere + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact: chris@qbittorrent.org, arnaud@qbittorrent.org + */ + +#ifndef RSSFILE_H +#define RSSFILE_H + +#include +#include +#include + +namespace Rss +{ + class Folder; + class File; + class Article; + + typedef QSharedPointer FilePtr; + typedef QSharedPointer
ArticlePtr; + typedef QList ArticleList; + typedef QList FileList; + + /** + * Parent interface for Rss::Folder and Rss::Feed. + */ + class File + { + public: + virtual ~File(); + + virtual QString id() const = 0; + virtual QString displayName() const = 0; + virtual uint unreadCount() const = 0; + virtual QString iconPath() const = 0; + virtual ArticleList articleListByDateDesc() const = 0; + virtual ArticleList unreadArticleListByDateDesc() const = 0; + + virtual void rename(const QString &newName) = 0; + virtual void markAsRead() = 0; + virtual bool refresh() = 0; + virtual void removeAllSettings() = 0; + virtual void saveItemsToDisk() = 0; + virtual void recheckRssItemsForDownload() = 0; + + Folder *parentFolder() const; + QStringList pathHierarchy() const; + + protected: + friend class Folder; + + Folder *m_parent = nullptr; + }; +} + +#endif // RSSFILE_H diff -Nru qbittorrent-4.1.3/src/base/rss/rss_folder.cpp qbittorrent-3.3.15/src/base/rss/rss_folder.cpp --- qbittorrent-4.1.3/src/base/rss/rss_folder.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rss_folder.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,144 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * Copyright (C) 2010 Christophe Dumez - * Copyright (C) 2010 Arnaud Demaiziere - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "rss_folder.h" - -#include -#include - -#include "base/global.h" -#include "rss_article.h" - -using namespace RSS; - -Folder::Folder(const QString &path) - : Item(path) -{ -} - -Folder::~Folder() -{ - emit aboutToBeDestroyed(this); - - foreach (auto item, items()) - delete item; -} - -QList
Folder::articles() const -{ - QList
news; - - foreach (Item *item, items()) { - int n = news.size(); - news << item->articles(); - std::inplace_merge(news.begin(), news.begin() + n, news.end() - , [](Article *a1, Article *a2) - { - return Article::articleDateRecentThan(a1, a2->date()); - }); - } - return news; -} - -int Folder::unreadCount() const -{ - int count = 0; - foreach (Item *item, items()) - count += item->unreadCount(); - return count; -} - -void Folder::markAsRead() -{ - foreach (Item *item, items()) - item->markAsRead(); -} - -void Folder::refresh() -{ - foreach (Item *item, items()) - item->refresh(); -} - -QList Folder::items() const -{ - return m_items; -} - -QJsonValue Folder::toJsonValue(bool withData) const -{ - QJsonObject jsonObj; - foreach (Item *item, items()) - jsonObj.insert(item->name(), item->toJsonValue(withData)); - - return jsonObj; -} - -void Folder::handleItemUnreadCountChanged() -{ - emit unreadCountChanged(this); -} - -void Folder::cleanup() -{ - foreach (Item *item, items()) - item->cleanup(); -} - -void Folder::addItem(Item *item) -{ - Q_ASSERT(item); - Q_ASSERT(!m_items.contains(item)); - - m_items.append(item); - connect(item, &Item::newArticle, this, &Item::newArticle); - connect(item, &Item::articleRead, this, &Item::articleRead); - connect(item, &Item::articleAboutToBeRemoved, this, &Item::articleAboutToBeRemoved); - connect(item, &Item::unreadCountChanged, this, &Folder::handleItemUnreadCountChanged); - - for (auto article: copyAsConst(item->articles())) - emit newArticle(article); - - if (item->unreadCount() > 0) - emit unreadCountChanged(this); -} - -void Folder::removeItem(Item *item) -{ - Q_ASSERT(m_items.contains(item)); - - for (auto article: copyAsConst(item->articles())) - emit articleAboutToBeRemoved(article); - - item->disconnect(this); - m_items.removeOne(item); - if (item->unreadCount() > 0) - emit unreadCountChanged(this); -} diff -Nru qbittorrent-4.1.3/src/base/rss/rssfolder.cpp qbittorrent-3.3.15/src/base/rss/rssfolder.cpp --- qbittorrent-4.1.3/src/base/rss/rssfolder.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rssfolder.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,253 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2010 Christophe Dumez + * Copyright (C) 2010 Arnaud Demaiziere + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact: chris@qbittorrent.org, arnaud@qbittorrent.org + */ + +#include + +#include "base/iconprovider.h" +#include "base/bittorrent/session.h" +#include "rssmanager.h" +#include "rssfeed.h" +#include "rssarticle.h" +#include "rssfolder.h" + +using namespace Rss; + +Folder::Folder(const QString &name) + : m_name(name) +{ +} + +uint Folder::unreadCount() const +{ + uint nbUnread = 0; + + FileHash::ConstIterator it = m_children.begin(); + FileHash::ConstIterator itend = m_children.end(); + for ( ; it != itend; ++it) + nbUnread += it.value()->unreadCount(); + + return nbUnread; +} + +void Folder::removeChild(const QString &childId) +{ + if (m_children.contains(childId)) { + FilePtr child = m_children.take(childId); + child->removeAllSettings(); + } +} + +// Refresh All Children +bool Folder::refresh() +{ + FileHash::ConstIterator it = m_children.begin(); + FileHash::ConstIterator itend = m_children.end(); + bool refreshed = false; + for ( ; it != itend; ++it) { + if (it.value()->refresh()) + refreshed = true; + } + return refreshed; +} + +ArticleList Folder::articleListByDateDesc() const +{ + ArticleList news; + + FileHash::ConstIterator it = m_children.begin(); + FileHash::ConstIterator itend = m_children.end(); + for ( ; it != itend; ++it) { + int n = news.size(); + news << it.value()->articleListByDateDesc(); + std::inplace_merge(news.begin(), news.begin() + n, news.end(), articleDateRecentThan); + } + return news; +} + +ArticleList Folder::unreadArticleListByDateDesc() const +{ + ArticleList unreadNews; + + FileHash::ConstIterator it = m_children.begin(); + FileHash::ConstIterator itend = m_children.end(); + for ( ; it != itend; ++it) { + int n = unreadNews.size(); + unreadNews << it.value()->unreadArticleListByDateDesc(); + std::inplace_merge(unreadNews.begin(), unreadNews.begin() + n, unreadNews.end(), articleDateRecentThan); + } + return unreadNews; +} + +FileList Folder::getContent() const +{ + return m_children.values(); +} + +uint Folder::getNbFeeds() const +{ + uint nbFeeds = 0; + + FileHash::ConstIterator it = m_children.begin(); + FileHash::ConstIterator itend = m_children.end(); + for ( ; it != itend; ++it) { + if (FolderPtr folder = qSharedPointerDynamicCast(it.value())) + nbFeeds += folder->getNbFeeds(); + else + ++nbFeeds; // Feed + } + return nbFeeds; +} + +QString Folder::displayName() const +{ + return m_name; +} + +void Folder::rename(const QString &newName) +{ + if (m_name == newName) return; + + Q_ASSERT(!m_parent->hasChild(newName)); + if (!m_parent->hasChild(newName)) { + // Update parent + FilePtr folder = m_parent->m_children.take(m_name); + m_parent->m_children[newName] = folder; + // Actually rename + m_name = newName; + } +} + +void Folder::markAsRead() +{ + FileHash::ConstIterator it = m_children.begin(); + FileHash::ConstIterator itend = m_children.end(); + for ( ; it != itend; ++it) { + it.value()->markAsRead(); + } +} + +FeedList Folder::getAllFeeds() const +{ + FeedList streams; + + FileHash::ConstIterator it = m_children.begin(); + FileHash::ConstIterator itend = m_children.end(); + for ( ; it != itend; ++it) { + if (FeedPtr feed = qSharedPointerDynamicCast(it.value())) + streams << feed; + else if (FolderPtr folder = qSharedPointerDynamicCast(it.value())) + streams << folder->getAllFeeds(); + } + return streams; +} + +QHash Folder::getAllFeedsAsHash() const +{ + QHash ret; + + FileHash::ConstIterator it = m_children.begin(); + FileHash::ConstIterator itend = m_children.end(); + for ( ; it != itend; ++it) { + if (FeedPtr feed = qSharedPointerDynamicCast(it.value())) { + qDebug() << Q_FUNC_INFO << feed->url(); + ret[feed->url()] = feed; + } + else if (FolderPtr folder = qSharedPointerDynamicCast(it.value())) { + ret.unite(folder->getAllFeedsAsHash()); + } + } + return ret; +} + +bool Folder::addFile(const FilePtr &item) +{ + Q_ASSERT(!m_children.contains(item->id())); + if (!m_children.contains(item->id())) { + m_children[item->id()] = item; + // Update parent + item->m_parent = this; + return true; + } + + return false; +} + +void Folder::removeAllItems() +{ + m_children.clear(); +} + +FilePtr Folder::child(const QString &childId) +{ + return m_children.value(childId); +} + +void Folder::removeAllSettings() +{ + FileHash::ConstIterator it = m_children.begin(); + FileHash::ConstIterator itend = m_children.end(); + for ( ; it != itend; ++it) + it.value()->removeAllSettings(); +} + +void Folder::saveItemsToDisk() +{ + foreach (const FilePtr &child, m_children.values()) + child->saveItemsToDisk(); +} + +QString Folder::id() const +{ + return m_name; +} + +QString Folder::iconPath() const +{ + return IconProvider::instance()->getIconPath("inode-directory"); +} + +bool Folder::hasChild(const QString &childId) +{ + return m_children.contains(childId); +} + +FilePtr Folder::takeChild(const QString &childId) +{ + return m_children.take(childId); +} + +void Folder::recheckRssItemsForDownload() +{ + FileHash::ConstIterator it = m_children.begin(); + FileHash::ConstIterator itend = m_children.end(); + for ( ; it != itend; ++it) + it.value()->recheckRssItemsForDownload(); +} diff -Nru qbittorrent-4.1.3/src/base/rss/rss_folder.h qbittorrent-3.3.15/src/base/rss/rss_folder.h --- qbittorrent-4.1.3/src/base/rss/rss_folder.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rss_folder.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * Copyright (C) 2010 Christophe Dumez - * Copyright (C) 2010 Arnaud Demaiziere - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#pragma once - -#include -#include "rss_item.h" - -namespace RSS -{ - class Session; - - class Folder final : public Item - { - Q_OBJECT - Q_DISABLE_COPY(Folder) - - friend class Session; - - explicit Folder(const QString &path = ""); - ~Folder() override; - - public: - QList
articles() const override; - int unreadCount() const override; - void markAsRead() override; - void refresh() override; - - QList items() const; - - QJsonValue toJsonValue(bool withData = false) const override; - - private slots: - void handleItemUnreadCountChanged(); - - private: - void cleanup() override; - void addItem(Item *item); - void removeItem(Item *item); - - QList m_items; - }; -} diff -Nru qbittorrent-4.1.3/src/base/rss/rssfolder.h qbittorrent-3.3.15/src/base/rss/rssfolder.h --- qbittorrent-4.1.3/src/base/rss/rssfolder.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rssfolder.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,86 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2010 Christophe Dumez + * Copyright (C) 2010 Arnaud Demaiziere + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact: chris@qbittorrent.org, arnaud@qbittorrent.org + */ + +#ifndef RSSFOLDER_H +#define RSSFOLDER_H + +#include +#include + +#include "rssfile.h" + +namespace Rss +{ + class Folder; + class Feed; + class Manager; + + typedef QHash FileHash; + typedef QSharedPointer FeedPtr; + typedef QSharedPointer FolderPtr; + typedef QList FeedList; + + class Folder: public File + { + public: + explicit Folder(const QString &name = QString()); + + uint unreadCount() const; + uint getNbFeeds() const; + FileList getContent() const; + FeedList getAllFeeds() const; + QHash getAllFeedsAsHash() const; + QString displayName() const; + QString id() const; + QString iconPath() const; + bool hasChild(const QString &childId); + ArticleList articleListByDateDesc() const; + ArticleList unreadArticleListByDateDesc() const; + + void rename(const QString &newName); + void markAsRead(); + bool refresh(); + void removeAllSettings(); + void saveItemsToDisk(); + void recheckRssItemsForDownload(); + void removeAllItems(); + FilePtr child(const QString &childId); + FilePtr takeChild(const QString &childId); + bool addFile(const FilePtr &item); + void removeChild(const QString &childId); + + private: + QString m_name; + FileHash m_children; + }; +} + +#endif // RSSFOLDER_H diff -Nru qbittorrent-4.1.3/src/base/rss/rss_item.cpp qbittorrent-3.3.15/src/base/rss/rss_item.cpp --- qbittorrent-4.1.3/src/base/rss/rss_item.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rss_item.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,115 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * Copyright (C) 2010 Christophe Dumez - * Copyright (C) 2010 Arnaud Demaiziere - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "rss_item.h" - -#include -#include -#include - -using namespace RSS; - -const QChar Item::PathSeparator('\\'); - -Item::Item(const QString &path) - : m_path(path) -{ -} - -Item::~Item() {} - -void Item::setPath(const QString &path) -{ - if (path != m_path) { - m_path = path; - emit pathChanged(this); - } -} - -QString Item::path() const -{ - return m_path; -} - -QString Item::name() const -{ - return relativeName(path()); -} - -bool Item::isValidPath(const QString &path) -{ - static const QRegularExpression re( - QString(R"(\A[^\%1]+(\%1[^\%1]+)*\z)").arg(Item::PathSeparator) - , QRegularExpression::DontCaptureOption | QRegularExpression::OptimizeOnFirstUsageOption); - - if (path.isEmpty() || !re.match(path).hasMatch()) { - qDebug() << "Incorrect RSS Item path:" << path; - return false; - } - - return true; -} - -QString Item::joinPath(const QString &path1, const QString &path2) -{ - if (path1.isEmpty()) - return path2; - else - return path1 + Item::PathSeparator + path2; -} - -QStringList Item::expandPath(const QString &path) -{ - QStringList result; - if (path.isEmpty()) return result; - // if (!isValidRSSFolderName(folder)) - // return result; - - int index = 0; - while ((index = path.indexOf(Item::PathSeparator, index)) >= 0) { - result << path.left(index); - ++index; - } - result << path; - - return result; -} - -QString Item::parentPath(const QString &path) -{ - int pos; - return ((pos = path.lastIndexOf(Item::PathSeparator)) >= 0 ? path.left(pos) : ""); -} - -QString Item::relativeName(const QString &path) -{ - int pos; - return ((pos = path.lastIndexOf(Item::PathSeparator)) >= 0 ? path.right(path.size() - (pos + 1)) : path); -} diff -Nru qbittorrent-4.1.3/src/base/rss/rss_item.h qbittorrent-3.3.15/src/base/rss/rss_item.h --- qbittorrent-4.1.3/src/base/rss/rss_item.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rss_item.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,88 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * Copyright (C) 2010 Christophe Dumez - * Copyright (C) 2010 Arnaud Demaiziere - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#pragma once - -#include -#include - -namespace RSS -{ - class Article; - class Folder; - class Session; - - class Item : public QObject - { - Q_OBJECT - Q_DISABLE_COPY(Item) - - friend class Folder; - friend class Session; - - public: - virtual QList
articles() const = 0; - virtual int unreadCount() const = 0; - virtual void markAsRead() = 0; - virtual void refresh() = 0; - - QString path() const; - QString name() const; - - virtual QJsonValue toJsonValue(bool withData = false) const = 0; - - static const QChar PathSeparator; - - static bool isValidPath(const QString &path); - static QString joinPath(const QString &path1, const QString &path2); - static QStringList expandPath(const QString &path); - static QString parentPath(const QString &path); - static QString relativeName(const QString &path); - - signals: - void pathChanged(Item *item = nullptr); - void unreadCountChanged(Item *item = nullptr); - void aboutToBeDestroyed(Item *item = nullptr); - void newArticle(Article *article); - void articleRead(Article *article); - void articleAboutToBeRemoved(Article *article); - - protected: - explicit Item(const QString &path); - ~Item() override; - - virtual void cleanup() = 0; - - private: - void setPath(const QString &path); - - QString m_path; - }; -} diff -Nru qbittorrent-4.1.3/src/base/rss/rssmanager.cpp qbittorrent-3.3.15/src/base/rss/rssmanager.cpp --- qbittorrent-4.1.3/src/base/rss/rssmanager.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rssmanager.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,218 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2010 Christophe Dumez + * Copyright (C) 2010 Arnaud Demaiziere + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact: chris@qbittorrent.org, arnaud@qbittorrent.org + */ + +#include + +#include "base/logger.h" +#include "base/preferences.h" +#include "rssfolder.h" +#include "rssfeed.h" +#include "rssarticle.h" +#include "rssdownloadrulelist.h" +#include "rssmanager.h" + +static const int MSECS_PER_MIN = 60000; + +using namespace Rss; +using namespace Rss::Private; + +Manager::Manager(QObject *parent) + : QObject(parent) + , m_downloadRules(new DownloadRuleList) + , m_rootFolder(new Folder) + , m_workingThread(new QThread(this)) +{ + m_workingThread->start(); + connect(&m_refreshTimer, SIGNAL(timeout()), SLOT(refresh())); + m_refreshInterval = Preferences::instance()->getRSSRefreshInterval(); + m_refreshTimer.start(m_refreshInterval * MSECS_PER_MIN); + + m_deferredDownloadTimer.setInterval(1); + m_deferredDownloadTimer.setSingleShot(true); + connect(&m_deferredDownloadTimer, SIGNAL(timeout()), SLOT(downloadNextArticleTorrentIfMatching())); +} + +Manager::~Manager() +{ + qDebug("Deleting RSSManager..."); + m_workingThread->quit(); + m_workingThread->wait(); + delete m_downloadRules; + m_rootFolder->saveItemsToDisk(); + saveStreamList(); + m_rootFolder.clear(); + qDebug("RSSManager deleted"); +} + +void Manager::updateRefreshInterval(uint val) +{ + if (m_refreshInterval != val) { + m_refreshInterval = val; + m_refreshTimer.start(m_refreshInterval * 60000); + qDebug("New RSS refresh interval is now every %dmin", m_refreshInterval); + } +} + +void Manager::loadStreamList() +{ + const Preferences *const pref = Preferences::instance(); + const QStringList streamsUrl = pref->getRssFeedsUrls(); + const QStringList aliases = pref->getRssFeedsAliases(); + if (streamsUrl.size() != aliases.size()) { + Logger::instance()->addMessage("Corrupted RSS list, not loading it.", Log::WARNING); + return; + } + + uint i = 0; + qDebug() << Q_FUNC_INFO << streamsUrl; + foreach (QString s, streamsUrl) { + QStringList path = s.split("\\", QString::SkipEmptyParts); + if (path.empty()) continue; + + const QString feedUrl = path.takeLast(); + qDebug() << "Feed URL:" << feedUrl; + // Create feed path (if it does not exists) + FolderPtr feedParent = m_rootFolder; + foreach (const QString &folderName, path) { + if (!feedParent->hasChild(folderName)) { + qDebug() << "Adding parent folder:" << folderName; + FolderPtr folder(new Folder(folderName)); + feedParent->addFile(folder); + feedParent = folder; + } + else { + feedParent = qSharedPointerDynamicCast(feedParent->child(folderName)); + } + } + // Create feed + qDebug() << "Adding feed to parent folder"; + FeedPtr stream(new Feed(feedUrl, this)); + feedParent->addFile(stream); + const QString &alias = aliases[i]; + if (!alias.isEmpty()) + stream->rename(alias); + ++i; + } + qDebug("NB RSS streams loaded: %d", streamsUrl.size()); +} + +void Manager::forwardFeedContentChanged(const QString &url) +{ + emit feedContentChanged(url); +} + +void Manager::forwardFeedInfosChanged(const QString &url, const QString &displayName, uint unreadCount) +{ + emit feedInfosChanged(url, displayName, unreadCount); +} + +void Manager::forwardFeedIconChanged(const QString &url, const QString &iconPath) +{ + emit feedIconChanged(url, iconPath); +} + +void Manager::moveFile(const FilePtr &file, const FolderPtr &destinationFolder) +{ + Folder *srcFolder = file->parentFolder(); + if (destinationFolder != srcFolder) { + // Remove reference in old folder + srcFolder->takeChild(file->id()); + // add to new Folder + destinationFolder->addFile(file); + } + else { + qDebug("Nothing to move, same destination folder"); + } +} + +void Manager::saveStreamList() const +{ + QStringList streamsUrl; + QStringList aliases; + FeedList streams = m_rootFolder->getAllFeeds(); + foreach (const FeedPtr &stream, streams) { + // This backslash has nothing to do with path handling + QString streamPath = stream->pathHierarchy().join("\\"); + if (streamPath.isNull()) + streamPath = ""; + qDebug("Saving stream path: %s", qPrintable(streamPath)); + streamsUrl << streamPath; + aliases << stream->displayName(); + } + Preferences *const pref = Preferences::instance(); + pref->setRssFeedsUrls(streamsUrl); + pref->setRssFeedsAliases(aliases); +} + +DownloadRuleList *Manager::downloadRules() const +{ + Q_ASSERT(m_downloadRules); + return m_downloadRules; +} + +FolderPtr Manager::rootFolder() const +{ + return m_rootFolder; +} + +QThread *Manager::workingThread() const +{ + return m_workingThread; +} + +void Manager::refresh() +{ + m_rootFolder->refresh(); +} + +void Manager::downloadArticleTorrentIfMatching(const QString &url, const ArticlePtr &article) +{ + m_deferredDownloads.append(qMakePair(url, article)); + m_deferredDownloadTimer.start(); +} + +void Manager::downloadNextArticleTorrentIfMatching() +{ + if (m_deferredDownloads.empty()) + return; + + // Schedule to process the next article (if any) + m_deferredDownloadTimer.start(); + + QPair urlArticle(m_deferredDownloads.takeFirst()); + FeedList streams = m_rootFolder->getAllFeeds(); + foreach (const FeedPtr &stream, streams) { + if (stream->url() == urlArticle.first) { + stream->deferredDownloadArticleTorrentIfMatching(urlArticle.second); + break; + } + } +} diff -Nru qbittorrent-4.1.3/src/base/rss/rssmanager.h qbittorrent-3.3.15/src/base/rss/rssmanager.h --- qbittorrent-4.1.3/src/base/rss/rssmanager.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rssmanager.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,100 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2010 Christophe Dumez + * Copyright (C) 2010 Arnaud Demaiziere + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact: chris@qbittorrent.org, arnaud@qbittorrent.org + */ + +#ifndef RSSMANAGER_H +#define RSSMANAGER_H + +#include +#include +#include +#include +#include +#include + +namespace Rss +{ + class Article; + class DownloadRuleList; + class File; + class Folder; + class Feed; + class Manager; + + typedef QSharedPointer
ArticlePtr; + typedef QSharedPointer FilePtr; + typedef QSharedPointer FolderPtr; + typedef QSharedPointer FeedPtr; + + typedef QSharedPointer ManagerPtr; + + class Manager: public QObject + { + Q_OBJECT + + public: + explicit Manager(QObject *parent = 0); + ~Manager(); + + DownloadRuleList *downloadRules() const; + FolderPtr rootFolder() const; + QThread *workingThread() const; + void downloadArticleTorrentIfMatching(const QString &url, const ArticlePtr &article); + + public slots: + void refresh(); + void loadStreamList(); + void saveStreamList() const; + void forwardFeedContentChanged(const QString &url); + void forwardFeedInfosChanged(const QString &url, const QString &displayName, uint unreadCount); + void forwardFeedIconChanged(const QString &url, const QString &iconPath); + void moveFile(const FilePtr &file, const FolderPtr &destinationFolder); + void updateRefreshInterval(uint val); + + signals: + void feedContentChanged(const QString &url); + void feedInfosChanged(const QString &url, const QString &displayName, uint unreadCount); + void feedIconChanged(const QString &url, const QString &iconPath); + + private slots: + void downloadNextArticleTorrentIfMatching(); + + private: + QTimer m_refreshTimer; + uint m_refreshInterval; + DownloadRuleList *m_downloadRules; + FolderPtr m_rootFolder; + QThread *m_workingThread; + QTimer m_deferredDownloadTimer; + QList> m_deferredDownloads; + }; +} + +#endif // RSSMANAGER_H diff -Nru qbittorrent-4.1.3/src/base/rss/rss_session.cpp qbittorrent-3.3.15/src/base/rss/rss_session.cpp --- qbittorrent-4.1.3/src/base/rss/rss_session.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rss_session.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,543 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * Copyright (C) 2010 Christophe Dumez - * Copyright (C) 2010 Arnaud Demaiziere - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "rss_session.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../asyncfilestorage.h" -#include "../logger.h" -#include "../profile.h" -#include "../settingsstorage.h" -#include "../utils/fs.h" -#include "rss_article.h" -#include "rss_feed.h" -#include "rss_folder.h" -#include "rss_item.h" - -const int MsecsPerMin = 60000; -const QString ConfFolderName(QStringLiteral("rss")); -const QString DataFolderName(QStringLiteral("rss/articles")); -const QString FeedsFileName(QStringLiteral("feeds.json")); - -const QString SettingsKey_ProcessingEnabled(QStringLiteral("RSS/Session/EnableProcessing")); -const QString SettingsKey_RefreshInterval(QStringLiteral("RSS/Session/RefreshInterval")); -const QString SettingsKey_MaxArticlesPerFeed(QStringLiteral("RSS/Session/MaxArticlesPerFeed")); - -using namespace RSS; - -QPointer Session::m_instance = nullptr; - -Session::Session() - : m_processingEnabled(SettingsStorage::instance()->loadValue(SettingsKey_ProcessingEnabled, false).toBool()) - , m_workingThread(new QThread(this)) - , m_refreshInterval(SettingsStorage::instance()->loadValue(SettingsKey_RefreshInterval, 30).toUInt()) - , m_maxArticlesPerFeed(SettingsStorage::instance()->loadValue(SettingsKey_MaxArticlesPerFeed, 50).toInt()) -{ - Q_ASSERT(!m_instance); // only one instance is allowed - m_instance = this; - - m_confFileStorage = new AsyncFileStorage( - Utils::Fs::expandPathAbs(specialFolderLocation(SpecialFolder::Config) + ConfFolderName)); - m_confFileStorage->moveToThread(m_workingThread); - connect(m_workingThread, &QThread::finished, m_confFileStorage, &AsyncFileStorage::deleteLater); - connect(m_confFileStorage, &AsyncFileStorage::failed, [](const QString &fileName, const QString &errorString) - { - Logger::instance()->addMessage(QString("Couldn't save RSS Session configuration in %1. Error: %2") - .arg(fileName, errorString), Log::WARNING); - }); - - m_dataFileStorage = new AsyncFileStorage( - Utils::Fs::expandPathAbs(specialFolderLocation(SpecialFolder::Data) + DataFolderName)); - m_dataFileStorage->moveToThread(m_workingThread); - connect(m_workingThread, &QThread::finished, m_dataFileStorage, &AsyncFileStorage::deleteLater); - connect(m_dataFileStorage, &AsyncFileStorage::failed, [](const QString &fileName, const QString &errorString) - { - Logger::instance()->addMessage(QString("Couldn't save RSS Session data in %1. Error: %2") - .arg(fileName, errorString), Log::WARNING); - }); - - m_itemsByPath.insert("", new Folder); // root folder - - m_workingThread->start(); - load(); - - connect(&m_refreshTimer, &QTimer::timeout, this, &Session::refresh); - if (m_processingEnabled) { - m_refreshTimer.start(m_refreshInterval * MsecsPerMin); - refresh(); - } - - // Remove legacy/corrupted settings - // (at least on Windows, QSettings is case-insensitive and it can get - // confused when asked about settings that differ only in their case) - auto settingsStorage = SettingsStorage::instance(); - settingsStorage->removeValue("Rss/streamList"); - settingsStorage->removeValue("Rss/streamAlias"); - settingsStorage->removeValue("Rss/open_folders"); - settingsStorage->removeValue("Rss/qt5/splitter_h"); - settingsStorage->removeValue("Rss/qt5/splitterMain"); - settingsStorage->removeValue("Rss/hosts_cookies"); - settingsStorage->removeValue("RSS/streamList"); - settingsStorage->removeValue("RSS/streamAlias"); - settingsStorage->removeValue("RSS/open_folders"); - settingsStorage->removeValue("RSS/qt5/splitter_h"); - settingsStorage->removeValue("RSS/qt5/splitterMain"); - settingsStorage->removeValue("RSS/hosts_cookies"); - settingsStorage->removeValue("Rss/Session/EnableProcessing"); - settingsStorage->removeValue("Rss/Session/RefreshInterval"); - settingsStorage->removeValue("Rss/Session/MaxArticlesPerFeed"); - settingsStorage->removeValue("Rss/AutoDownloader/EnableProcessing"); -} - -Session::~Session() -{ - qDebug() << "Deleting RSS Session..."; - - m_workingThread->quit(); - m_workingThread->wait(); - - //store(); - delete m_itemsByPath[""]; // deleting root folder - - qDebug() << "RSS Session deleted."; -} - -Session *Session::instance() -{ - return m_instance; -} - -bool Session::addFolder(const QString &path, QString *error) -{ - Folder *destFolder = prepareItemDest(path, error); - if (!destFolder) - return false; - - addItem(new Folder(path), destFolder); - store(); - return true; -} - -bool Session::addFeed(const QString &url, const QString &path, QString *error) -{ - if (m_feedsByURL.contains(url)) { - if (error) - *error = tr("RSS feed with given URL already exists: %1.").arg(url); - return false; - } - - Folder *destFolder = prepareItemDest(path, error); - if (!destFolder) - return false; - - addItem(new Feed(generateUID(), url, path, this), destFolder); - store(); - if (m_processingEnabled) - feedByURL(url)->refresh(); - return true; -} - -bool Session::moveItem(const QString &itemPath, const QString &destPath, QString *error) -{ - if (itemPath.isEmpty()) { - if (error) - *error = tr("Cannot move root folder."); - return false; - } - - auto item = m_itemsByPath.value(itemPath); - if (!item) { - if (error) - *error = tr("Item doesn't exist: %1.").arg(itemPath); - return false; - } - - return moveItem(item, destPath, error); -} - -bool Session::moveItem(Item *item, const QString &destPath, QString *error) -{ - Q_ASSERT(item); - Q_ASSERT(item != rootFolder()); - - Folder *destFolder = prepareItemDest(destPath, error); - if (!destFolder) - return false; - - auto srcFolder = static_cast(m_itemsByPath.value(Item::parentPath(item->path()))); - if (srcFolder != destFolder) { - srcFolder->removeItem(item); - destFolder->addItem(item); - } - m_itemsByPath.insert(destPath, m_itemsByPath.take(item->path())); - item->setPath(destPath); - store(); - return true; -} - -bool Session::removeItem(const QString &itemPath, QString *error) -{ - if (itemPath.isEmpty()) { - if (error) - *error = tr("Cannot delete root folder."); - return false; - } - - auto item = m_itemsByPath.value(itemPath); - if (!item) { - if (error) - *error = tr("Item doesn't exist: %1.").arg(itemPath); - return false; - } - - emit itemAboutToBeRemoved(item); - item->cleanup(); - - auto folder = static_cast(m_itemsByPath.value(Item::parentPath(item->path()))); - folder->removeItem(item); - delete item; - store(); - return true; -} - -QList Session::items() const -{ - return m_itemsByPath.values(); -} - -Item *Session::itemByPath(const QString &path) const -{ - return m_itemsByPath.value(path); -} - -void Session::load() -{ - QFile itemsFile(m_confFileStorage->storageDir().absoluteFilePath(FeedsFileName)); - if (!itemsFile.exists()) { - loadLegacy(); - return; - } - - if (!itemsFile.open(QFile::ReadOnly)) { - Logger::instance()->addMessage( - QString("Couldn't read RSS Session data from %1. Error: %2") - .arg(itemsFile.fileName(), itemsFile.errorString()), Log::WARNING); - return; - } - - QJsonParseError jsonError; - QJsonDocument jsonDoc = QJsonDocument::fromJson(itemsFile.readAll(), &jsonError); - if (jsonError.error != QJsonParseError::NoError) { - Logger::instance()->addMessage( - QString("Couldn't parse RSS Session data from %1. Error: %2") - .arg(itemsFile.fileName(), jsonError.errorString()), Log::WARNING); - return; - } - - if (!jsonDoc.isObject()) { - Logger::instance()->addMessage( - QString("Couldn't load RSS Session data from %1. Invalid data format.") - .arg(itemsFile.fileName()), Log::WARNING); - return; - } - - loadFolder(jsonDoc.object(), rootFolder()); -} - -void Session::loadFolder(const QJsonObject &jsonObj, Folder *folder) -{ - bool updated = false; - foreach (const QString &key, jsonObj.keys()) { - const QJsonValue val {jsonObj[key]}; - if (val.isString()) { - // previous format (reduced form) doesn't contain UID - QString url = val.toString(); - if (url.isEmpty()) - url = key; - addFeedToFolder(generateUID(), url, key, folder); - updated = true; - } - else if (val.isObject()) { - const QJsonObject valObj {val.toObject()}; - if (valObj.contains("url")) { - if (!valObj["url"].isString()) { - LogMsg(QString("Couldn't load RSS Feed '%1'. URL is required.") - .arg(QString("%1\\%2").arg(folder->path(), key)), Log::WARNING); - continue; - } - - QUuid uid; - if (valObj.contains("uid")) { - uid = QUuid {valObj["uid"].toString()}; - if (uid.isNull()) { - LogMsg(QString("Couldn't load RSS Feed '%1'. UID is invalid.") - .arg(QString("%1\\%2").arg(folder->path(), key)), Log::WARNING); - continue; - } - - if (m_feedsByUID.contains(uid)) { - LogMsg(QString("Duplicate RSS Feed UID: %1. Configuration seems to be corrupted.") - .arg(uid.toString()), Log::WARNING); - continue; - } - } - else { - // previous format doesn't contain UID - uid = generateUID(); - updated = true; - } - - addFeedToFolder(uid, valObj["url"].toString(), key, folder); - } - else { - loadFolder(valObj, addSubfolder(key, folder)); - } - } - else { - LogMsg(QString("Couldn't load RSS Item '%1'. Invalid data format.") - .arg(QString("%1\\%2").arg(folder->path(), key)), Log::WARNING); - } - } - - if (updated) - store(); // convert to updated format -} - -void Session::loadLegacy() -{ - const QStringList legacyFeedPaths = SettingsStorage::instance()->loadValue("Rss/streamList").toStringList(); - const QStringList feedAliases = SettingsStorage::instance()->loadValue("Rss/streamAlias").toStringList(); - if (legacyFeedPaths.size() != feedAliases.size()) { - Logger::instance()->addMessage("Corrupted RSS list, not loading it.", Log::WARNING); - return; - } - - uint i = 0; - for (QString legacyPath : legacyFeedPaths) { - if (Item::PathSeparator == QString(legacyPath[0])) - legacyPath.remove(0, 1); - const QString parentFolderPath = Item::parentPath(legacyPath); - const QString feedUrl = Item::relativeName(legacyPath); - - foreach (const QString &folderPath, Item::expandPath(parentFolderPath)) - addFolder(folderPath); - - const QString feedPath = feedAliases[i].isEmpty() - ? legacyPath - : Item::joinPath(parentFolderPath, feedAliases[i]); - addFeed(feedUrl, feedPath); - ++i; - } - - store(); // convert to new format -} - -void Session::store() -{ - m_confFileStorage->store(FeedsFileName, QJsonDocument(rootFolder()->toJsonValue().toObject()).toJson()); -} - -Folder *Session::prepareItemDest(const QString &path, QString *error) -{ - if (!Item::isValidPath(path)) { - if (error) - *error = tr("Incorrect RSS Item path: %1.").arg(path); - return nullptr; - } - - if (m_itemsByPath.contains(path)) { - if (error) - *error = tr("RSS item with given path already exists: %1.").arg(path); - return nullptr; - } - - const QString destFolderPath = Item::parentPath(path); - auto destFolder = qobject_cast(m_itemsByPath.value(destFolderPath)); - if (!destFolder) { - if (error) - *error = tr("Parent folder doesn't exist: %1.").arg(destFolderPath); - return nullptr; - } - - return destFolder; -} - -Folder *Session::addSubfolder(const QString &name, Folder *parentFolder) -{ - auto folder = new Folder(Item::joinPath(parentFolder->path(), name)); - addItem(folder, parentFolder); - return folder; -} - -Feed *Session::addFeedToFolder(const QUuid &uid, const QString &url, const QString &name, Folder *parentFolder) -{ - auto feed = new Feed(uid, url, Item::joinPath(parentFolder->path(), name), this); - addItem(feed, parentFolder); - return feed; -} - -void Session::addItem(Item *item, Folder *destFolder) -{ - if (auto feed = qobject_cast(item)) { - connect(feed, &Feed::titleChanged, this, &Session::handleFeedTitleChanged); - connect(feed, &Feed::iconLoaded, this, &Session::feedIconLoaded); - connect(feed, &Feed::stateChanged, this, &Session::feedStateChanged); - m_feedsByUID[feed->uid()] = feed; - m_feedsByURL[feed->url()] = feed; - } - - connect(item, &Item::pathChanged, this, &Session::itemPathChanged); - connect(item, &Item::aboutToBeDestroyed, this, &Session::handleItemAboutToBeDestroyed); - m_itemsByPath[item->path()] = item; - destFolder->addItem(item); - emit itemAdded(item); -} - -bool Session::isProcessingEnabled() const -{ - return m_processingEnabled; -} - -void Session::setProcessingEnabled(bool enabled) -{ - if (m_processingEnabled != enabled) { - m_processingEnabled = enabled; - SettingsStorage::instance()->storeValue(SettingsKey_ProcessingEnabled, m_processingEnabled); - if (m_processingEnabled) { - m_refreshTimer.start(m_refreshInterval * MsecsPerMin); - refresh(); - } - else { - m_refreshTimer.stop(); - } - - emit processingStateChanged(m_processingEnabled); - } -} - -AsyncFileStorage *Session::confFileStorage() const -{ - return m_confFileStorage; -} - -AsyncFileStorage *Session::dataFileStorage() const -{ - return m_dataFileStorage; -} - -Folder *Session::rootFolder() const -{ - return static_cast(m_itemsByPath.value("")); -} - -QList Session::feeds() const -{ - return m_feedsByURL.values(); -} - -Feed *Session::feedByURL(const QString &url) const -{ - return m_feedsByURL.value(url); -} - -uint Session::refreshInterval() const -{ - return m_refreshInterval; -} - -void Session::setRefreshInterval(uint refreshInterval) -{ - if (m_refreshInterval != refreshInterval) { - SettingsStorage::instance()->storeValue(SettingsKey_RefreshInterval, refreshInterval); - m_refreshInterval = refreshInterval; - m_refreshTimer.start(m_refreshInterval * MsecsPerMin); - } -} - -QThread *Session::workingThread() const -{ - return m_workingThread; -} - -void Session::handleItemAboutToBeDestroyed(Item *item) -{ - m_itemsByPath.remove(item->path()); - auto feed = qobject_cast(item); - if (feed) { - m_feedsByUID.remove(feed->uid()); - m_feedsByURL.remove(feed->url()); - } -} - -void Session::handleFeedTitleChanged(Feed *feed) -{ - if (feed->name() == feed->url()) - // Now we have something better than a URL. - // Trying to rename feed... - moveItem(feed, Item::joinPath(Item::parentPath(feed->path()), feed->title())); -} - -QUuid Session::generateUID() const -{ - QUuid uid = QUuid::createUuid(); - while (m_feedsByUID.contains(uid)) - uid = QUuid::createUuid(); - - return uid; -} - -int Session::maxArticlesPerFeed() const -{ - return m_maxArticlesPerFeed; -} - -void Session::setMaxArticlesPerFeed(int n) -{ - if (m_maxArticlesPerFeed != n) { - m_maxArticlesPerFeed = n; - SettingsStorage::instance()->storeValue(SettingsKey_MaxArticlesPerFeed, n); - emit maxArticlesPerFeedChanged(n); - } -} - -void Session::refresh() -{ - // NOTE: Should we allow manually refreshing for disabled session? - rootFolder()->refresh(); -} diff -Nru qbittorrent-4.1.3/src/base/rss/rss_session.h qbittorrent-3.3.15/src/base/rss/rss_session.h --- qbittorrent-4.1.3/src/base/rss/rss_session.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/rss/rss_session.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,160 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * Copyright (C) 2010 Christophe Dumez - * Copyright (C) 2010 Arnaud Demaiziere - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#pragma once - -/* - * RSS Session configuration file format (JSON): - * - * =============== BEGIN =============== - * { - * "folder1": { - * "subfolder1": { - * "Feed name 1 (Alias)": { - * "uid": "feed unique identifier", - * "url": "http://some-feed-url1" - * } - * "Feed name 2 (Alias)": { - * "uid": "feed unique identifier", - * "url": "http://some-feed-url2" - * } - * }, - * "subfolder2": {}, - * "Feed name 3 (Alias)": { - * "uid": "feed unique identifier", - * "url": "http://some-feed-url3" - * } - * }, - * "folder2": {}, - * "folder3": {} - * } - * ================ END ================ - * - * 1. Document is JSON object (the same as Folder) - * 2. Folder is JSON object (keys are Item names, values are Items) - * 3. Feed is JSON object (keys are property names, values are property values; 'uid' and 'url' are required) - */ - -#include -#include -#include -#include - -class QThread; -class Application; -class AsyncFileStorage; - -namespace RSS -{ - class Feed; - class Folder; - class Item; - - class Session : public QObject - { - Q_OBJECT - Q_DISABLE_COPY(Session) - - friend class ::Application; - - Session(); - ~Session() override; - - public: - static Session *instance(); - - bool isProcessingEnabled() const; - void setProcessingEnabled(bool enabled); - - QThread *workingThread() const; - AsyncFileStorage *confFileStorage() const; - AsyncFileStorage *dataFileStorage() const; - - int maxArticlesPerFeed() const; - void setMaxArticlesPerFeed(int n); - - uint refreshInterval() const; - void setRefreshInterval(uint refreshInterval); - - bool addFolder(const QString &path, QString *error = nullptr); - bool addFeed(const QString &url, const QString &path, QString *error = nullptr); - bool moveItem(const QString &itemPath, const QString &destPath - , QString *error = nullptr); - bool moveItem(Item *item, const QString &destPath, QString *error = nullptr); - bool removeItem(const QString &itemPath, QString *error = nullptr); - - QList items() const; - Item *itemByPath(const QString &path) const; - QList feeds() const; - Feed *feedByURL(const QString &url) const; - - Folder *rootFolder() const; - - public slots: - void refresh(); - - signals: - void processingStateChanged(bool enabled); - void maxArticlesPerFeedChanged(int n); - void itemAdded(Item *item); - void itemPathChanged(Item *item); - void itemAboutToBeRemoved(Item *item); - void feedIconLoaded(Feed *feed); - void feedStateChanged(Feed *feed); - - private slots: - void handleItemAboutToBeDestroyed(Item *item); - void handleFeedTitleChanged(Feed *feed); - - private: - QUuid generateUID() const; - void load(); - void loadFolder(const QJsonObject &jsonObj, Folder *folder); - void loadLegacy(); - void store(); - Folder *prepareItemDest(const QString &path, QString *error); - Folder *addSubfolder(const QString &name, Folder *parentFolder); - Feed *addFeedToFolder(const QUuid &uid, const QString &url, const QString &name, Folder *parentFolder); - void addItem(Item *item, Folder *destFolder); - - static QPointer m_instance; - - bool m_processingEnabled; - QThread *m_workingThread; - AsyncFileStorage *m_confFileStorage; - AsyncFileStorage *m_dataFileStorage; - QTimer m_refreshTimer; - uint m_refreshInterval; - int m_maxArticlesPerFeed; - QHash m_itemsByPath; - QHash m_feedsByUID; - QHash m_feedsByURL; - }; -} diff -Nru qbittorrent-4.1.3/src/base/scanfoldersmodel.cpp qbittorrent-3.3.15/src/base/scanfoldersmodel.cpp --- qbittorrent-4.1.3/src/base/scanfoldersmodel.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/scanfoldersmodel.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2010 Christian Kandeler, Christophe Dumez + * Copyright (C) 2010 Christian Kandeler, Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #include "scanfoldersmodel.h" @@ -54,7 +56,7 @@ QString downloadPath; // valid for CUSTOM_LOCATION }; -ScanFoldersModel *ScanFoldersModel::m_instance = nullptr; +ScanFoldersModel *ScanFoldersModel::m_instance = 0; bool ScanFoldersModel::initInstance(QObject *parent) { @@ -70,7 +72,7 @@ { if (m_instance) { delete m_instance; - m_instance = nullptr; + m_instance = 0; } } @@ -81,10 +83,10 @@ ScanFoldersModel::ScanFoldersModel(QObject *parent) : QAbstractListModel(parent) - , m_fsWatcher(nullptr) + , m_fsWatcher(0) { configure(); - connect(Preferences::instance(), &Preferences::changed, this, &ScanFoldersModel::configure); + connect(Preferences::instance(), SIGNAL(changed()), SLOT(configure())); } ScanFoldersModel::~ScanFoldersModel() @@ -212,15 +214,15 @@ if (!watchDir.exists()) return DoesNotExist; if (!watchDir.isReadable()) return CannotRead; - const QString canonicalWatchPath = watchDir.canonicalPath(); + const QString &canonicalWatchPath = watchDir.canonicalPath(); if (findPathData(canonicalWatchPath) != -1) return AlreadyInList; QDir downloadDir(downloadPath); - const QString canonicalDownloadPath = downloadDir.canonicalPath(); + const QString &canonicalDownloadPath = downloadDir.canonicalPath(); if (!m_fsWatcher) { m_fsWatcher = new FileSystemWatcher(this); - connect(m_fsWatcher, &FileSystemWatcher::torrentsAdded, this, &ScanFoldersModel::addTorrentsToSession); + connect(m_fsWatcher, SIGNAL(torrentsAdded(const QStringList &)), this, SLOT(addTorrentsToSession(const QStringList &))); } beginInsertRows(QModelIndex(), rowCount(), rowCount()); @@ -233,15 +235,15 @@ return Ok; } -ScanFoldersModel::PathStatus ScanFoldersModel::updatePath(const QString &watchPath, const PathType &downloadType, const QString &downloadPath) +ScanFoldersModel::PathStatus ScanFoldersModel::updatePath(const QString &watchPath, const PathType& downloadType, const QString &downloadPath) { QDir watchDir(watchPath); - const QString canonicalWatchPath = watchDir.canonicalPath(); + const QString &canonicalWatchPath = watchDir.canonicalPath(); int row = findPathData(canonicalWatchPath); if (row == -1) return DoesNotExist; QDir downloadDir(downloadPath); - const QString canonicalDownloadPath = downloadDir.canonicalPath(); + const QString &canonicalDownloadPath = downloadDir.canonicalPath(); m_pathList.at(row)->downloadType = downloadType; m_pathList.at(row)->downloadPath = Utils::Fs::toNativePath(canonicalDownloadPath); @@ -256,7 +258,7 @@ foreach (const QString &path, watchPaths) { QDir watchDir(path); - const QString canonicalWatchPath = watchDir.canonicalPath(); + const QString &canonicalWatchPath = watchDir.canonicalPath(); m_fsWatcher->addPath(canonicalWatchPath); } } @@ -338,7 +340,7 @@ void ScanFoldersModel::configure() { - const QVariantHash dirs = Preferences::instance()->getScanDirs(); + QVariantHash dirs = Preferences::instance()->getScanDirs(); for (QVariantHash::const_iterator i = dirs.begin(), e = dirs.end(); i != e; ++i) { if (i.value().type() == QVariant::Int) @@ -351,7 +353,7 @@ void ScanFoldersModel::addTorrentsToSession(const QStringList &pathList) { foreach (const QString &file, pathList) { - qDebug("File %s added", qUtf8Printable(file)); + qDebug("File %s added", qPrintable(file)); BitTorrent::AddTorrentParams params; if (downloadInWatchFolder(file)) @@ -370,7 +372,7 @@ Utils::Fs::forceRemove(file); } else { - qDebug("Failed to open magnet file: %s", qUtf8Printable(f.errorString())); + qDebug("Failed to open magnet file: %s", qPrintable(f.errorString())); } } else { @@ -380,7 +382,7 @@ Utils::Fs::forceRemove(file); } else { - qDebug("Ignoring incomplete torrent file: %s", qUtf8Printable(file)); + qDebug("Ignoring incomplete torrent file: %s", qPrintable(file)); } } } @@ -388,7 +390,7 @@ QString ScanFoldersModel::pathTypeDisplayName(const PathType type) { - switch (type) { + switch(type) { case DOWNLOAD_IN_WATCH_FOLDER: return tr("Monitored folder"); case DEFAULT_LOCATION: diff -Nru qbittorrent-4.1.3/src/base/scanfoldersmodel.h qbittorrent-3.3.15/src/base/scanfoldersmodel.h --- qbittorrent-4.1.3/src/base/scanfoldersmodel.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/scanfoldersmodel.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2010 Christian Kandeler, Christophe Dumez + * Copyright (C) 2010 Christian Kandeler, Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef SCANFOLDERSMODEL_H @@ -35,7 +37,7 @@ class QStringList; class FileSystemWatcher; -class ScanFoldersModel : public QAbstractListModel +class ScanFoldersModel: public QAbstractListModel { Q_OBJECT Q_DISABLE_COPY(ScanFoldersModel) @@ -64,9 +66,9 @@ CUSTOM_LOCATION }; - static bool initInstance(QObject *parent = nullptr); + static bool initInstance(QObject *parent = 0); static void freeInstance(); - static ScanFoldersModel *instance(); + static ScanFoldersModel* instance(); static QString pathTypeDisplayName(const PathType type); @@ -95,7 +97,7 @@ void addTorrentsToSession(const QStringList &pathList); private: - explicit ScanFoldersModel(QObject *parent = nullptr); + explicit ScanFoldersModel(QObject *parent = 0); ~ScanFoldersModel(); virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); @@ -104,6 +106,7 @@ QString downloadPathTorrentFolder(const QString &filePath) const; int findPathData(const QString &path) const; +private: static ScanFoldersModel *m_instance; struct PathData; diff -Nru qbittorrent-4.1.3/src/base/search/searchdownloadhandler.cpp qbittorrent-3.3.15/src/base/search/searchdownloadhandler.cpp --- qbittorrent-4.1.3/src/base/search/searchdownloadhandler.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/search/searchdownloadhandler.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2018 Vladimir Golovnev - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "searchdownloadhandler.h" - -#include - -#include "../utils/foreignapps.h" -#include "../utils/fs.h" -#include "searchpluginmanager.h" - -SearchDownloadHandler::SearchDownloadHandler(const QString &siteUrl, const QString &url, SearchPluginManager *manager) - : QObject {manager} - , m_manager {manager} - , m_downloadProcess {new QProcess {this}} -{ - m_downloadProcess->setEnvironment(QProcess::systemEnvironment()); - connect(m_downloadProcess, static_cast(&QProcess::finished) - , this, &SearchDownloadHandler::downloadProcessFinished); - const QStringList params { - Utils::Fs::toNativePath(m_manager->engineLocation() + "/nova2dl.py"), - siteUrl, - url - }; - // Launch search - m_downloadProcess->start(Utils::ForeignApps::pythonInfo().executableName, params, QIODevice::ReadOnly); -} - -void SearchDownloadHandler::downloadProcessFinished(int exitcode) -{ - QString path; - - if ((exitcode == 0) && (m_downloadProcess->exitStatus() == QProcess::NormalExit)) { - const QString line = QString::fromUtf8(m_downloadProcess->readAllStandardOutput()).trimmed(); - const QVector parts = line.splitRef(' '); - if (parts.size() == 2) - path = parts[0].toString(); - } - - emit downloadFinished(path); -} diff -Nru qbittorrent-4.1.3/src/base/search/searchdownloadhandler.h qbittorrent-3.3.15/src/base/search/searchdownloadhandler.h --- qbittorrent-4.1.3/src/base/search/searchdownloadhandler.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/search/searchdownloadhandler.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2018 Vladimir Golovnev - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#pragma once - -#include - -class QProcess; -class SearchPluginManager; - -class SearchDownloadHandler : public QObject -{ - Q_OBJECT - Q_DISABLE_COPY(SearchDownloadHandler) - - friend class SearchPluginManager; - - SearchDownloadHandler(const QString &siteUrl, const QString &url, SearchPluginManager *manager); - -signals: - void downloadFinished(const QString &path); - -private: - void downloadProcessFinished(int exitcode); - - SearchPluginManager *m_manager; - QProcess *m_downloadProcess; -}; diff -Nru qbittorrent-4.1.3/src/base/search/searchhandler.cpp qbittorrent-3.3.15/src/base/search/searchhandler.cpp --- qbittorrent-4.1.3/src/base/search/searchhandler.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/search/searchhandler.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,199 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015, 2018 Vladimir Golovnev - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "searchhandler.h" - -#include -#include - -#include "../utils/foreignapps.h" -#include "../utils/fs.h" -#include "searchpluginmanager.h" - -namespace -{ - enum SearchResultColumn - { - PL_DL_LINK, - PL_NAME, - PL_SIZE, - PL_SEEDS, - PL_LEECHS, - PL_ENGINE_URL, - PL_DESC_LINK, - NB_PLUGIN_COLUMNS - }; -} - -SearchHandler::SearchHandler(const QString &pattern, const QString &category, const QStringList &usedPlugins, SearchPluginManager *manager) - : QObject {manager} - , m_pattern {pattern} - , m_category {category} - , m_usedPlugins {usedPlugins} - , m_manager {manager} - , m_searchProcess {new QProcess {this}} - , m_searchTimeout {new QTimer {this}} -{ - // Load environment variables (proxy) - m_searchProcess->setEnvironment(QProcess::systemEnvironment()); - - const QStringList params { - Utils::Fs::toNativePath(m_manager->engineLocation() + "/nova2.py"), - m_usedPlugins.join(','), - m_category - }; - - // Launch search - m_searchProcess->setProgram(Utils::ForeignApps::pythonInfo().executableName); - m_searchProcess->setArguments(params + m_pattern.split(' ')); - -#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) - connect(m_searchProcess, &QProcess::errorOccurred, this, &SearchHandler::processFailed); -#else - connect(m_searchProcess, static_cast(&QProcess::error) - , this, &SearchHandler::processFailed); -#endif - connect(m_searchProcess, &QProcess::readyReadStandardOutput, this, &SearchHandler::readSearchOutput); - connect(m_searchProcess, static_cast(&QProcess::finished) - , this, &SearchHandler::processFinished); - - m_searchTimeout->setSingleShot(true); - connect(m_searchTimeout, &QTimer::timeout, this, &SearchHandler::cancelSearch); - m_searchTimeout->start(180000); // 3 min - - // deferred start allows clients to handle starting-related signals - QTimer::singleShot(0, this, [this]() { m_searchProcess->start(QIODevice::ReadOnly); }); -} - -bool SearchHandler::isActive() const -{ - return (m_searchProcess->state() != QProcess::NotRunning); -} - -void SearchHandler::cancelSearch() -{ - if ((m_searchProcess->state() == QProcess::NotRunning) || m_searchCancelled) - return; - -#ifdef Q_OS_WIN - m_searchProcess->kill(); -#else - m_searchProcess->terminate(); -#endif - m_searchCancelled = true; - m_searchTimeout->stop(); -} - -// Slot called when QProcess is Finished -// QProcess can be finished for 3 reasons: -// Error | Stopped by user | Finished normally -void SearchHandler::processFinished(int exitcode) -{ - m_searchTimeout->stop(); - - if (m_searchCancelled) - emit searchFinished(true); - else if ((m_searchProcess->exitStatus() == QProcess::NormalExit) && (exitcode == 0)) - emit searchFinished(false); - else - emit searchFailed(); -} - -// search QProcess return output as soon as it gets new -// stuff to read. We split it into lines and parse each -// line to SearchResult calling parseSearchResult(). -void SearchHandler::readSearchOutput() -{ - QByteArray output = m_searchProcess->readAllStandardOutput(); - output.replace("\r", ""); - QList lines = output.split('\n'); - if (!m_searchResultLineTruncated.isEmpty()) - lines.prepend(m_searchResultLineTruncated + lines.takeFirst()); - m_searchResultLineTruncated = lines.takeLast().trimmed(); - - QList searchResultList; - foreach (const QByteArray &line, lines) { - SearchResult searchResult; - if (parseSearchResult(QString::fromUtf8(line), searchResult)) - searchResultList << searchResult; - } - - if (!searchResultList.isEmpty()) { - m_results.append(searchResultList); - emit newSearchResults(searchResultList); - } -} - -void SearchHandler::processFailed() -{ - if (!m_searchCancelled) - emit searchFailed(); -} - -// Parse one line of search results list -// Line is in the following form: -// file url | file name | file size | nb seeds | nb leechers | Search engine url -bool SearchHandler::parseSearchResult(const QString &line, SearchResult &searchResult) -{ - const QStringList parts = line.split('|'); - const int nbFields = parts.size(); - if (nbFields < (NB_PLUGIN_COLUMNS - 1)) return false; // -1 because desc_link is optional - - searchResult = SearchResult(); - searchResult.fileUrl = parts.at(PL_DL_LINK).trimmed(); // download URL - searchResult.fileName = parts.at(PL_NAME).trimmed(); // Name - searchResult.fileSize = parts.at(PL_SIZE).trimmed().toLongLong(); // Size - bool ok = false; - searchResult.nbSeeders = parts.at(PL_SEEDS).trimmed().toLongLong(&ok); // Seeders - if (!ok || (searchResult.nbSeeders < 0)) - searchResult.nbSeeders = -1; - searchResult.nbLeechers = parts.at(PL_LEECHS).trimmed().toLongLong(&ok); // Leechers - if (!ok || (searchResult.nbLeechers < 0)) - searchResult.nbLeechers = -1; - searchResult.siteUrl = parts.at(PL_ENGINE_URL).trimmed(); // Search site URL - if (nbFields == NB_PLUGIN_COLUMNS) - searchResult.descrLink = parts.at(PL_DESC_LINK).trimmed(); // Description Link - - return true; -} - -SearchPluginManager *SearchHandler::manager() const -{ - return m_manager; -} - -QList SearchHandler::results() const -{ - return m_results; -} - -QString SearchHandler::pattern() const -{ - return m_pattern; -} diff -Nru qbittorrent-4.1.3/src/base/search/searchhandler.h qbittorrent-3.3.15/src/base/search/searchhandler.h --- qbittorrent-4.1.3/src/base/search/searchhandler.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/search/searchhandler.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,90 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015, 2018 Vladimir Golovnev - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#pragma once - -#include -#include -#include - -class QProcess; -class QTimer; - -struct SearchResult -{ - QString fileName; - QString fileUrl; - qlonglong fileSize; - qlonglong nbSeeders; - qlonglong nbLeechers; - QString siteUrl; - QString descrLink; -}; - -class SearchPluginManager; - -class SearchHandler : public QObject -{ - Q_OBJECT - Q_DISABLE_COPY(SearchHandler) - - friend class SearchPluginManager; - - SearchHandler(const QString &pattern, const QString &category - , const QStringList &usedPlugins, SearchPluginManager *manager); - -public: - bool isActive() const; - QString pattern() const; - SearchPluginManager *manager() const; - QList results() const; - - void cancelSearch(); - -signals: - void searchFinished(bool cancelled = false); - void searchFailed(); - void newSearchResults(const QList &results); - -private: - void readSearchOutput(); - void processFailed(); - void processFinished(int exitcode); - bool parseSearchResult(const QString &line, SearchResult &searchResult); - - const QString m_pattern; - const QString m_category; - const QStringList m_usedPlugins; - SearchPluginManager *m_manager; - QProcess *m_searchProcess; - QTimer *m_searchTimeout; - QByteArray m_searchResultLineTruncated; - bool m_searchCancelled = false; - QList m_results; -}; diff -Nru qbittorrent-4.1.3/src/base/search/searchpluginmanager.cpp qbittorrent-3.3.15/src/base/search/searchpluginmanager.cpp --- qbittorrent-4.1.3/src/base/search/searchpluginmanager.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/search/searchpluginmanager.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,566 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015, 2018 Vladimir Golovnev - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "searchpluginmanager.h" - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "base/global.h" -#include "base/logger.h" -#include "base/net/downloadhandler.h" -#include "base/net/downloadmanager.h" -#include "base/preferences.h" -#include "base/profile.h" -#include "base/utils/foreignapps.h" -#include "base/utils/fs.h" -#include "base/utils/misc.h" -#include "searchdownloadhandler.h" -#include "searchhandler.h" - -namespace -{ - void clearPythonCache(const QString &path) - { - // remove python cache artifacts in `path` and subdirs - - QStringList dirs = {path}; - QDirIterator iter {path, (QDir::AllDirs | QDir::NoDotAndDotDot), QDirIterator::Subdirectories}; - while (iter.hasNext()) - dirs += iter.next(); - - for (const QString &dir : qAsConst(dirs)) { - // python 3: remove "__pycache__" folders - if (dir.endsWith("/__pycache__")) { - Utils::Fs::removeDirRecursive(dir); - continue; - } - - // python 2: remove "*.pyc" files - const QStringList files = QDir(dir).entryList(QDir::Files); - for (const QString &file : files) { - if (file.endsWith(".pyc")) - Utils::Fs::forceRemove(file); - } - } - } -} - -QPointer SearchPluginManager::m_instance = nullptr; - -SearchPluginManager::SearchPluginManager() - : m_updateUrl(QString("http://searchplugins.qbittorrent.org/%1/engines/").arg(Utils::ForeignApps::pythonInfo().version.majorNumber() >= 3 ? "nova3" : "nova")) -{ - Q_ASSERT(!m_instance); // only one instance is allowed - m_instance = this; - - updateNova(); - update(); -} - -SearchPluginManager::~SearchPluginManager() -{ - qDeleteAll(m_plugins); -} - -SearchPluginManager *SearchPluginManager::instance() -{ - return m_instance; -} - -QStringList SearchPluginManager::allPlugins() const -{ - return m_plugins.keys(); -} - -QStringList SearchPluginManager::enabledPlugins() const -{ - QStringList plugins; - for (const PluginInfo *plugin : qAsConst(m_plugins)) { - if (plugin->enabled) - plugins << plugin->name; - } - - return plugins; -} - -QStringList SearchPluginManager::supportedCategories() const -{ - QStringList result; - for (const PluginInfo *plugin : qAsConst(m_plugins)) { - if (plugin->enabled) { - foreach (QString cat, plugin->supportedCategories) { - if (!result.contains(cat)) - result << cat; - } - } - } - - return result; -} - -QStringList SearchPluginManager::getPluginCategories(const QString &pluginName) const -{ - QStringList plugins; - if (pluginName == "all") - plugins = allPlugins(); - else if ((pluginName == "enabled") || (pluginName == "multi")) - plugins = enabledPlugins(); - else - plugins << pluginName.trimmed(); - - QSet categories; - for (const QString &pluginName : qAsConst(plugins)) { - const PluginInfo *plugin = pluginInfo(pluginName); - if (!plugin) continue; // plugin wasn't found - for (const QString &category : plugin->supportedCategories) - categories << category; - } - - return categories.toList(); -} - -PluginInfo *SearchPluginManager::pluginInfo(const QString &name) const -{ - return m_plugins.value(name); -} - -void SearchPluginManager::enablePlugin(const QString &name, bool enabled) -{ - PluginInfo *plugin = m_plugins.value(name, 0); - if (plugin) { - plugin->enabled = enabled; - // Save to Hard disk - Preferences *const pref = Preferences::instance(); - QStringList disabledPlugins = pref->getSearchEngDisabled(); - if (enabled) - disabledPlugins.removeAll(name); - else if (!disabledPlugins.contains(name)) - disabledPlugins.append(name); - pref->setSearchEngDisabled(disabledPlugins); - - emit pluginEnabled(name, enabled); - } -} - -// Updates shipped plugin -void SearchPluginManager::updatePlugin(const QString &name) -{ - installPlugin(QString("%1%2.py").arg(m_updateUrl, name)); -} - -// Install or update plugin from file or url -void SearchPluginManager::installPlugin(const QString &source) -{ - qDebug("Asked to install plugin at %s", qUtf8Printable(source)); - - clearPythonCache(engineLocation()); - - if (Utils::Misc::isUrl(source)) { - using namespace Net; - DownloadHandler *handler = DownloadManager::instance()->download(DownloadRequest(source).saveToFile(true)); - connect(handler, static_cast(&DownloadHandler::downloadFinished) - , this, &SearchPluginManager::pluginDownloaded); - connect(handler, &DownloadHandler::downloadFailed, this, &SearchPluginManager::pluginDownloadFailed); - } - else { - QString path = source; - if (path.startsWith("file:", Qt::CaseInsensitive)) - path = QUrl(path).toLocalFile(); - - QString pluginName = Utils::Fs::fileName(path); - pluginName.chop(pluginName.size() - pluginName.lastIndexOf('.')); - - if (!path.endsWith(".py", Qt::CaseInsensitive)) - emit pluginInstallationFailed(pluginName, tr("Unknown search engine plugin file format.")); - else - installPlugin_impl(pluginName, path); - } -} - -void SearchPluginManager::installPlugin_impl(const QString &name, const QString &path) -{ - PluginVersion newVersion = getPluginVersion(path); - qDebug() << "Version to be installed:" << newVersion; - - PluginInfo *plugin = pluginInfo(name); - if (plugin && !(plugin->version < newVersion)) { - qDebug("Apparently update is not needed, we have a more recent version"); - emit pluginUpdateFailed(name, tr("A more recent version of this plugin is already installed.")); - return; - } - - // Process with install - QString destPath = pluginPath(name); - bool updated = false; - if (QFile::exists(destPath)) { - // Backup in case install fails - QFile::copy(destPath, destPath + ".bak"); - Utils::Fs::forceRemove(destPath); - updated = true; - } - // Copy the plugin - QFile::copy(path, destPath); - // Update supported plugins - update(); - // Check if this was correctly installed - if (!m_plugins.contains(name)) { - // Remove broken file - Utils::Fs::forceRemove(destPath); - if (updated) { - // restore backup - QFile::copy(destPath + ".bak", destPath); - Utils::Fs::forceRemove(destPath + ".bak"); - // Update supported plugins - update(); - emit pluginUpdateFailed(name, tr("Plugin is not supported.")); - } - else { - emit pluginInstallationFailed(name, tr("Plugin is not supported.")); - } - } - else { - // Install was successful, remove backup - if (updated) - Utils::Fs::forceRemove(destPath + ".bak"); - } -} - -bool SearchPluginManager::uninstallPlugin(const QString &name) -{ - clearPythonCache(engineLocation()); - - // remove it from hard drive - QDir pluginsFolder(pluginsLocation()); - QStringList filters; - filters << name + ".*"; - QStringList files = pluginsFolder.entryList(filters, QDir::Files, QDir::Unsorted); - QString file; - foreach (file, files) - Utils::Fs::forceRemove(pluginsFolder.absoluteFilePath(file)); - // Remove it from supported engines - delete m_plugins.take(name); - - emit pluginUninstalled(name); - return true; -} - -void SearchPluginManager::updateIconPath(PluginInfo *const plugin) -{ - if (!plugin) return; - QString iconPath = QString("%1/%2.png").arg(pluginsLocation(), plugin->name); - if (QFile::exists(iconPath)) { - plugin->iconPath = iconPath; - } - else { - iconPath = QString("%1/%2.ico").arg(pluginsLocation(), plugin->name); - if (QFile::exists(iconPath)) - plugin->iconPath = iconPath; - } -} - -void SearchPluginManager::checkForUpdates() -{ - // Download version file from update server - using namespace Net; - DownloadHandler *handler = DownloadManager::instance()->download({m_updateUrl + "versions.txt"}); - connect(handler, static_cast(&DownloadHandler::downloadFinished) - , this, &SearchPluginManager::versionInfoDownloaded); - connect(handler, &DownloadHandler::downloadFailed, this, &SearchPluginManager::versionInfoDownloadFailed); -} - -SearchDownloadHandler *SearchPluginManager::downloadTorrent(const QString &siteUrl, const QString &url) -{ - return new SearchDownloadHandler {siteUrl, url, this}; -} - -SearchHandler *SearchPluginManager::startSearch(const QString &pattern, const QString &category, const QStringList &usedPlugins) -{ - // No search pattern entered - Q_ASSERT(!pattern.isEmpty()); - - return new SearchHandler {pattern, category, usedPlugins, this}; -} - -QString SearchPluginManager::categoryFullName(const QString &categoryName) -{ - static const QHash categoryTable { - {"all", tr("All categories")}, - {"movies", tr("Movies")}, - {"tv", tr("TV shows")}, - {"music", tr("Music")}, - {"games", tr("Games")}, - {"anime", tr("Anime")}, - {"software", tr("Software")}, - {"pictures", tr("Pictures")}, - {"books", tr("Books")} - }; - return categoryTable.value(categoryName); -} - -QString SearchPluginManager::pluginFullName(const QString &pluginName) -{ - return pluginInfo(pluginName) ? pluginInfo(pluginName)->fullName : QString(); -} - -QString SearchPluginManager::pluginsLocation() -{ - return QString("%1/engines").arg(engineLocation()); -} - -QString SearchPluginManager::engineLocation() -{ - static QString location; - if (location.isEmpty()) { - const QString folder = (Utils::ForeignApps::pythonInfo().version.majorNumber() >= 3) - ? "nova3" : "nova"; - location = Utils::Fs::expandPathAbs(specialFolderLocation(SpecialFolder::Data) + folder); - - const QDir locationDir(location); - locationDir.mkpath(locationDir.absolutePath()); - } - - return location; -} - -void SearchPluginManager::versionInfoDownloaded(const QString &url, const QByteArray &data) -{ - Q_UNUSED(url) - parseVersionInfo(data); -} - -void SearchPluginManager::versionInfoDownloadFailed(const QString &url, const QString &reason) -{ - Q_UNUSED(url) - emit checkForUpdatesFailed(tr("Update server is temporarily unavailable. %1").arg(reason)); -} - -void SearchPluginManager::pluginDownloaded(const QString &url, QString filePath) -{ - filePath = Utils::Fs::fromNativePath(filePath); - - QString pluginName = Utils::Fs::fileName(url); - pluginName.chop(pluginName.size() - pluginName.lastIndexOf('.')); // Remove extension - installPlugin_impl(pluginName, filePath); - Utils::Fs::forceRemove(filePath); -} - -void SearchPluginManager::pluginDownloadFailed(const QString &url, const QString &reason) -{ - QString pluginName = url.split('/').last(); - pluginName.replace(".py", "", Qt::CaseInsensitive); - if (pluginInfo(pluginName)) - emit pluginUpdateFailed(pluginName, tr("Failed to download the plugin file. %1").arg(reason)); - else - emit pluginInstallationFailed(pluginName, tr("Failed to download the plugin file. %1").arg(reason)); -} - -// Update nova.py search plugin if necessary -void SearchPluginManager::updateNova() -{ - // create nova directory if necessary - const QDir searchDir(engineLocation()); - const QString novaFolder = Utils::ForeignApps::pythonInfo().version.majorNumber() >= 3 - ? "searchengine/nova3" : "searchengine/nova"; - - QFile packageFile(searchDir.absoluteFilePath("__init__.py")); - packageFile.open(QIODevice::WriteOnly); - packageFile.close(); - - searchDir.mkdir("engines"); - - QFile packageFile2(searchDir.absolutePath() + "/engines/__init__.py"); - packageFile2.open(QIODevice::WriteOnly); - packageFile2.close(); - - // Copy search plugin files (if necessary) - const auto updateFile = [&novaFolder](const QString &filename, const bool compareVersion) - { - const QString filePathBundled = ":/" + novaFolder + '/' + filename; - const QString filePathDisk = QDir(engineLocation()).absoluteFilePath(filename); - - if (compareVersion && (getPluginVersion(filePathBundled) <= getPluginVersion(filePathDisk))) - return; - - Utils::Fs::forceRemove(filePathDisk); - QFile::copy(filePathBundled, filePathDisk); - }; - - updateFile("helpers.py", true); - updateFile("nova2.py", true); - updateFile("nova2dl.py", true); - updateFile("novaprinter.py", true); - updateFile("socks.py", false); - - if (Utils::ForeignApps::pythonInfo().version.majorNumber() >= 3) - updateFile("sgmllib3.py", false); - else - updateFile("fix_encoding.py", false); -} - -void SearchPluginManager::update() -{ - QProcess nova; - nova.setProcessEnvironment(QProcessEnvironment::systemEnvironment()); - - const QStringList params {Utils::Fs::toNativePath(engineLocation() + "/nova2.py"), "--capabilities"}; - nova.start(Utils::ForeignApps::pythonInfo().executableName, params, QIODevice::ReadOnly); - nova.waitForFinished(); - - QString capabilities = nova.readAll(); - QDomDocument xmlDoc; - if (!xmlDoc.setContent(capabilities)) { - qWarning() << "Could not parse Nova search engine capabilities, msg: " << capabilities.toLocal8Bit().data(); - qWarning() << "Error: " << nova.readAllStandardError().constData(); - return; - } - - QDomElement root = xmlDoc.documentElement(); - if (root.tagName() != "capabilities") { - qWarning() << "Invalid XML file for Nova search engine capabilities, msg: " << capabilities.toLocal8Bit().data(); - return; - } - - for (QDomNode engineNode = root.firstChild(); !engineNode.isNull(); engineNode = engineNode.nextSibling()) { - QDomElement engineElem = engineNode.toElement(); - if (!engineElem.isNull()) { - QString pluginName = engineElem.tagName(); - - std::unique_ptr plugin {new PluginInfo {}}; - plugin->name = pluginName; - plugin->version = getPluginVersion(pluginPath(pluginName)); - plugin->fullName = engineElem.elementsByTagName("name").at(0).toElement().text(); - plugin->url = engineElem.elementsByTagName("url").at(0).toElement().text(); - - const auto categories = engineElem.elementsByTagName("categories").at(0).toElement().text().split(' '); - for (QString cat : categories) { - cat = cat.trimmed(); - if (!cat.isEmpty()) - plugin->supportedCategories << cat; - } - - QStringList disabledEngines = Preferences::instance()->getSearchEngDisabled(); - plugin->enabled = !disabledEngines.contains(pluginName); - - updateIconPath(plugin.get()); - - if (!m_plugins.contains(pluginName)) { - m_plugins[pluginName] = plugin.release(); - emit pluginInstalled(pluginName); - } - else if (m_plugins[pluginName]->version != plugin->version) { - delete m_plugins.take(pluginName); - m_plugins[pluginName] = plugin.release(); - emit pluginUpdated(pluginName); - } - } - } -} - -void SearchPluginManager::parseVersionInfo(const QByteArray &info) -{ - qDebug("Checking if update is needed"); - - QHash updateInfo; - bool dataCorrect = false; - QList lines = info.split('\n'); - foreach (QByteArray line, lines) { - line = line.trimmed(); - if (line.isEmpty()) continue; - if (line.startsWith('#')) continue; - - QList list = line.split(' '); - if (list.size() != 2) continue; - - QString pluginName = QString(list.first()); - if (!pluginName.endsWith(':')) continue; - - pluginName.chop(1); // remove trailing ':' - PluginVersion version = PluginVersion::tryParse(list.last(), {}); - if (version == PluginVersion()) continue; - - dataCorrect = true; - if (isUpdateNeeded(pluginName, version)) { - qDebug("Plugin: %s is outdated", qUtf8Printable(pluginName)); - updateInfo[pluginName] = version; - } - } - - if (!dataCorrect) - emit checkForUpdatesFailed(tr("An incorrect update info received.")); - else - emit checkForUpdatesFinished(updateInfo); -} - -bool SearchPluginManager::isUpdateNeeded(QString pluginName, PluginVersion newVersion) const -{ - PluginInfo *plugin = pluginInfo(pluginName); - if (!plugin) return true; - - PluginVersion oldVersion = plugin->version; - qDebug() << "IsUpdate needed? to be installed:" << newVersion << ", already installed:" << oldVersion; - return (newVersion > oldVersion); -} - -QString SearchPluginManager::pluginPath(const QString &name) -{ - return QString("%1/%2.py").arg(pluginsLocation(), name); -} - -PluginVersion SearchPluginManager::getPluginVersion(const QString &filePath) -{ - QFile pluginFile(filePath); - if (!pluginFile.open(QIODevice::ReadOnly | QIODevice::Text)) - return {}; - - while (!pluginFile.atEnd()) { - const QString line = QString(pluginFile.readLine()).remove(' '); - if (!line.startsWith("#VERSION:", Qt::CaseInsensitive)) continue; - - const QString versionStr = line.mid(9); - const PluginVersion version = PluginVersion::tryParse(versionStr, {}); - if (version.isValid()) - return version; - - LogMsg(tr("Search plugin '%1' contains invalid version string ('%2')") - .arg(Utils::Fs::fileName(filePath), versionStr), Log::MsgType::WARNING); - break; - } - - return {}; -} diff -Nru qbittorrent-4.1.3/src/base/search/searchpluginmanager.h qbittorrent-3.3.15/src/base/search/searchpluginmanager.h --- qbittorrent-4.1.3/src/base/search/searchpluginmanager.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/search/searchpluginmanager.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,118 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015, 2018 Vladimir Golovnev - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#pragma once - -#include -#include -#include - -#include "base/utils/version.h" - -using PluginVersion = Utils::Version; -Q_DECLARE_METATYPE(PluginVersion) - -struct PluginInfo -{ - QString name; - PluginVersion version; - QString fullName; - QString url; - QStringList supportedCategories; - QString iconPath; - bool enabled; -}; - -class SearchDownloadHandler; -class SearchHandler; - -class SearchPluginManager : public QObject -{ - Q_OBJECT - Q_DISABLE_COPY(SearchPluginManager) - -public: - SearchPluginManager(); - ~SearchPluginManager() override; - - static SearchPluginManager *instance(); - - QStringList allPlugins() const; - QStringList enabledPlugins() const; - QStringList supportedCategories() const; - QStringList getPluginCategories(const QString &pluginName) const; - PluginInfo *pluginInfo(const QString &name) const; - - void enablePlugin(const QString &name, bool enabled = true); - void updatePlugin(const QString &name); - void installPlugin(const QString &source); - bool uninstallPlugin(const QString &name); - static void updateIconPath(PluginInfo *const plugin); - void checkForUpdates(); - - SearchHandler *startSearch(const QString &pattern, const QString &category, const QStringList &usedPlugins); - SearchDownloadHandler *downloadTorrent(const QString &siteUrl, const QString &url); - - static PluginVersion getPluginVersion(const QString &filePath); - static QString categoryFullName(const QString &categoryName); - QString pluginFullName(const QString &pluginName); - static QString pluginsLocation(); - static QString engineLocation(); - -signals: - void pluginEnabled(const QString &name, bool enabled); - void pluginInstalled(const QString &name); - void pluginInstallationFailed(const QString &name, const QString &reason); - void pluginUninstalled(const QString &name); - void pluginUpdated(const QString &name); - void pluginUpdateFailed(const QString &name, const QString &reason); - - void checkForUpdatesFinished(const QHash &updateInfo); - void checkForUpdatesFailed(const QString &reason); - -private: - void update(); - void updateNova(); - void parseVersionInfo(const QByteArray &info); - void installPlugin_impl(const QString &name, const QString &path); - bool isUpdateNeeded(QString pluginName, PluginVersion newVersion) const; - - void versionInfoDownloaded(const QString &url, const QByteArray &data); - void versionInfoDownloadFailed(const QString &url, const QString &reason); - void pluginDownloaded(const QString &url, QString filePath); - void pluginDownloadFailed(const QString &url, const QString &reason); - - static QString pluginPath(const QString &name); - - static QPointer m_instance; - - const QString m_updateUrl; - - QHash m_plugins; -}; diff -Nru qbittorrent-4.1.3/src/base/searchengine.cpp qbittorrent-3.3.15/src/base/searchengine.cpp --- qbittorrent-4.1.3/src/base/searchengine.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/base/searchengine.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,698 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2015 Vladimir Golovnev + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + */ + +#include +#include +#include +#include +#include +#include + +#include "base/utils/fs.h" +#include "base/utils/misc.h" +#include "base/preferences.h" +#include "base/net/downloadmanager.h" +#include "base/net/downloadhandler.h" +#include "searchengine.h" + +enum SearchResultColumn +{ + PL_DL_LINK, + PL_NAME, + PL_SIZE, + PL_SEEDS, + PL_LEECHS, + PL_ENGINE_URL, + PL_DESC_LINK, + NB_PLUGIN_COLUMNS +}; + +static inline void removePythonScriptIfExists(const QString &scriptPath) +{ + Utils::Fs::forceRemove(scriptPath); + Utils::Fs::forceRemove(scriptPath + "c"); +} + +const QHash SearchEngine::m_categoryNames = SearchEngine::initializeCategoryNames(); + +SearchEngine::SearchEngine() + : m_updateUrl(QString("http://searchplugins.qbittorrent.org/%1/engines/").arg(Utils::Misc::pythonVersion() >= 3 ? "nova3" : "nova")) + , m_searchStopped(false) +{ + updateNova(); + + m_searchProcess = new QProcess(this); + m_searchProcess->setEnvironment(QProcess::systemEnvironment()); + connect(m_searchProcess, SIGNAL(started()), this, SIGNAL(searchStarted())); + connect(m_searchProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readSearchOutput())); + connect(m_searchProcess, SIGNAL(finished(int)), this, SLOT(processFinished(int))); + + m_searchTimeout = new QTimer(this); + m_searchTimeout->setSingleShot(true); + connect(m_searchTimeout, SIGNAL(timeout()), this, SLOT(onTimeout())); + + update(); +} + +SearchEngine::~SearchEngine() +{ + qDeleteAll(m_plugins.values()); + cancelSearch(); +} + +QStringList SearchEngine::allPlugins() const +{ + return m_plugins.keys(); +} + +QStringList SearchEngine::enabledPlugins() const +{ + QStringList plugins; + foreach (const PluginInfo *plugin, m_plugins.values()) { + if (plugin->enabled) + plugins << plugin->name; + } + + return plugins; +} + +QStringList SearchEngine::supportedCategories() const +{ + QStringList result; + foreach (const PluginInfo *plugin, m_plugins.values()) { + if (plugin->enabled) { + foreach (QString cat, plugin->supportedCategories) { + if (!result.contains(cat)) + result << cat; + } + } + } + + return result; +} + +PluginInfo *SearchEngine::pluginInfo(const QString &name) const +{ + return m_plugins.value(name, 0); +} + +bool SearchEngine::isActive() const +{ + return (m_searchProcess->state() != QProcess::NotRunning); +} + +void SearchEngine::enablePlugin(const QString &name, bool enabled) +{ + PluginInfo *plugin = m_plugins.value(name, 0); + if (plugin) { + plugin->enabled = enabled; + // Save to Hard disk + Preferences *const pref = Preferences::instance(); + QStringList disabledPlugins = pref->getSearchEngDisabled(); + if (enabled) + disabledPlugins.removeAll(name); + else if (!disabledPlugins.contains(name)) + disabledPlugins.append(name); + pref->setSearchEngDisabled(disabledPlugins); + } +} + +// Updates shipped plugin +void SearchEngine::updatePlugin(const QString &name) +{ + installPlugin(QString("%1%2.py").arg(m_updateUrl).arg(name)); +} + +// Install or update plugin from file or url +void SearchEngine::installPlugin(const QString &source) +{ + qDebug("Asked to install plugin at %s", qPrintable(source)); + + if (Utils::Misc::isUrl(source)) { + Net::DownloadHandler *handler = Net::DownloadManager::instance()->downloadUrl(source, true); + connect(handler, SIGNAL(downloadFinished(QString, QString)), this, SLOT(pluginDownloaded(QString, QString))); + connect(handler, SIGNAL(downloadFailed(QString, QString)), this, SLOT(pluginDownloadFailed(QString, QString))); + } + else { + QString path = source; + if (path.startsWith("file:", Qt::CaseInsensitive)) + path = QUrl(path).toLocalFile(); + + QString pluginName = Utils::Fs::fileName(path); + pluginName.chop(pluginName.size() - pluginName.lastIndexOf(".")); + + if (!path.endsWith(".py", Qt::CaseInsensitive)) + emit pluginInstallationFailed(pluginName, tr("Unknown search engine plugin file format.")); + else + installPlugin_impl(pluginName, path); + } +} + +void SearchEngine::installPlugin_impl(const QString &name, const QString &path) +{ + qreal newVersion = getPluginVersion(path); + qDebug("Version to be installed: %.2f", newVersion); + + PluginInfo *plugin = pluginInfo(name); + if (plugin && (plugin->version >= newVersion)) { + qDebug("Apparently update is not needed, we have a more recent version"); + emit pluginUpdateFailed(name, tr("A more recent version of this plugin is already installed.")); + return; + } + + // Process with install + QString destPath = pluginPath(name); + bool updated = false; + if (QFile::exists(destPath)) { + // Backup in case install fails + QFile::copy(destPath, destPath + ".bak"); + Utils::Fs::forceRemove(destPath); + Utils::Fs::forceRemove(destPath + "c"); + updated = true; + } + // Copy the plugin + QFile::copy(path, destPath); + // Update supported plugins + update(); + // Check if this was correctly installed + if (!m_plugins.contains(name)) { + // Remove broken file + Utils::Fs::forceRemove(destPath); + if (updated) { + // restore backup + QFile::copy(destPath + ".bak", destPath); + Utils::Fs::forceRemove(destPath + ".bak"); + // Update supported plugins + update(); + emit pluginUpdateFailed(name, tr("Plugin is not supported.")); + } + else { + emit pluginInstallationFailed(name, tr("Plugin is not supported.")); + } + } + else { + // Install was successful, remove backup + if (updated) + Utils::Fs::forceRemove(destPath + ".bak"); + } +} + +bool SearchEngine::uninstallPlugin(const QString &name) +{ + if (QFile::exists(":/nova/engines/" + name + ".py")) + return false; + + // Proceed with uninstall + // remove it from hard drive + QDir pluginsFolder(pluginsLocation()); + QStringList filters; + filters << name + ".*"; + QStringList files = pluginsFolder.entryList(filters, QDir::Files, QDir::Unsorted); + QString file; + foreach (file, files) + Utils::Fs::forceRemove(pluginsFolder.absoluteFilePath(file)); + // Remove it from supported engines + delete m_plugins.take(name); + + return true; +} + +void SearchEngine::checkForUpdates() +{ + // Download version file from update server on sourceforge + Net::DownloadHandler *handler = Net::DownloadManager::instance()->downloadUrl(m_updateUrl + "versions.txt"); + connect(handler, SIGNAL(downloadFinished(QString, QByteArray)), this, SLOT(versionInfoDownloaded(QString, QByteArray))); + connect(handler, SIGNAL(downloadFailed(QString, QString)), this, SLOT(versionInfoDownloadFailed(QString, QString))); +} + +void SearchEngine::cancelSearch() +{ + if (m_searchProcess->state() != QProcess::NotRunning) { +#ifdef Q_OS_WIN + m_searchProcess->kill(); +#else + m_searchProcess->terminate(); +#endif + m_searchStopped = true; + m_searchTimeout->stop(); + + m_searchProcess->waitForFinished(1000); + } +} + +void SearchEngine::downloadTorrent(const QString &siteUrl, const QString &url) +{ + QProcess *downloadProcess = new QProcess(this); + downloadProcess->setEnvironment(QProcess::systemEnvironment()); + connect(downloadProcess, SIGNAL(finished(int)), this, SLOT(torrentFileDownloadFinished(int))); + m_downloaders << downloadProcess; + QStringList params { + Utils::Fs::toNativePath(engineLocation() + "/nova2dl.py"), + siteUrl, + url + }; + // Launch search + downloadProcess->start(Utils::Misc::pythonExecutable(), params, QIODevice::ReadOnly); +} + +void SearchEngine::startSearch(const QString &pattern, const QString &category, const QStringList &usedPlugins) +{ + // Search process already running or + // No search pattern entered + if ((m_searchProcess->state() != QProcess::NotRunning) || pattern.isEmpty()) { + emit searchFailed(); + return; + } + + // Reload environment variables (proxy) + m_searchProcess->setEnvironment(QProcess::systemEnvironment()); + + QStringList params; + m_searchStopped = false; + params << Utils::Fs::toNativePath(engineLocation() + "/nova2.py"); + params << usedPlugins.join(","); + params << category; + params << pattern.split(" "); + + // Launch search + m_searchProcess->start(Utils::Misc::pythonExecutable(), params, QIODevice::ReadOnly); + m_searchTimeout->start(180000); // 3min +} + +QString SearchEngine::categoryFullName(const QString &categoryName) +{ + return tr(m_categoryNames.value(categoryName).toUtf8().constData()); +} + +QString SearchEngine::pluginFullName(const QString &pluginName) +{ + return pluginInfo(pluginName) ? pluginInfo(pluginName)->fullName : QString(); +} + +QString SearchEngine::pluginsLocation() +{ + return QString("%1/engines").arg(engineLocation()); +} + +QString SearchEngine::engineLocation() +{ + QString folder = "nova"; + if (Utils::Misc::pythonVersion() >= 3) + folder = "nova3"; + const QString location = Utils::Fs::expandPathAbs(Utils::Fs::QDesktopServicesDataLocation() + folder); + QDir locationDir(location); + if (!locationDir.exists()) + locationDir.mkpath(locationDir.absolutePath()); + return location; +} + +// Slot called when QProcess is Finished +// QProcess can be finished for 3 reasons : +// Error | Stopped by user | Finished normally +void SearchEngine::processFinished(int exitcode) +{ + m_searchTimeout->stop(); + + if (exitcode == 0) + emit searchFinished(m_searchStopped); + else + emit searchFailed(); +} + +void SearchEngine::versionInfoDownloaded(const QString &url, const QByteArray &data) +{ + Q_UNUSED(url) + parseVersionInfo(data); +} + +void SearchEngine::versionInfoDownloadFailed(const QString &url, const QString &reason) +{ + Q_UNUSED(url) + emit checkForUpdatesFailed(tr("Update server is temporarily unavailable. %1").arg(reason)); +} + +void SearchEngine::pluginDownloaded(const QString &url, QString filePath) +{ + filePath = Utils::Fs::fromNativePath(filePath); + + QString pluginName = Utils::Fs::fileName(url); + pluginName.chop(pluginName.size() - pluginName.lastIndexOf(".")); // Remove extension + installPlugin_impl(pluginName, filePath); + Utils::Fs::forceRemove(filePath); +} + +void SearchEngine::pluginDownloadFailed(const QString &url, const QString &reason) +{ + QString pluginName = url.split('/').last(); + pluginName.replace(".py", "", Qt::CaseInsensitive); + if (pluginInfo(pluginName)) + emit pluginUpdateFailed(pluginName, tr("Failed to download the plugin file. %1").arg(reason)); + else + emit pluginInstallationFailed(pluginName, tr("Failed to download the plugin file. %1").arg(reason)); +} + +void SearchEngine::torrentFileDownloadFinished(int exitcode) +{ + QProcess *downloadProcess = static_cast(sender()); + if (exitcode == 0) { + QString line = QString::fromUtf8(downloadProcess->readAllStandardOutput()).trimmed(); + QStringList parts = line.split(' '); + if (parts.size() == 2) + emit torrentFileDownloaded(parts[0]); + } + + qDebug() << "Deleting downloadProcess"; + m_downloaders.removeOne(downloadProcess); + downloadProcess->deleteLater(); +} + +// Update nova.py search plugin if necessary +void SearchEngine::updateNova() +{ + qDebug("Updating nova"); + + // create nova directory if necessary + QDir searchDir(engineLocation()); + QString novaFolder = Utils::Misc::pythonVersion() >= 3 ? "searchengine/nova3" : "searchengine/nova"; + QFile packageFile(searchDir.absoluteFilePath("__init__.py")); + packageFile.open(QIODevice::WriteOnly | QIODevice::Text); + packageFile.close(); + if (!searchDir.exists("engines")) + searchDir.mkdir("engines"); + Utils::Fs::removeDirRecursive(searchDir.absoluteFilePath("__pycache__")); + + QFile packageFile2(searchDir.absolutePath() + "/engines/__init__.py"); + packageFile2.open(QIODevice::WriteOnly | QIODevice::Text); + packageFile2.close(); + + // Copy search plugin files (if necessary) + QString filePath = searchDir.absoluteFilePath("nova2.py"); + if (getPluginVersion(":/" + novaFolder + "/nova2.py") > getPluginVersion(filePath)) { + removePythonScriptIfExists(filePath); + QFile::copy(":/" + novaFolder + "/nova2.py", filePath); + } + + filePath = searchDir.absoluteFilePath("nova2dl.py"); + if (getPluginVersion(":/" + novaFolder + "/nova2dl.py") > getPluginVersion(filePath)) { + removePythonScriptIfExists(filePath); + QFile::copy(":/" + novaFolder + "/nova2dl.py", filePath); + } + + filePath = searchDir.absoluteFilePath("fix_encoding.py"); + QFile::copy(":/" + novaFolder + "/fix_encoding.py", filePath); + + filePath = searchDir.absoluteFilePath("novaprinter.py"); + if (getPluginVersion(":/" + novaFolder + "/novaprinter.py") > getPluginVersion(filePath)) { + removePythonScriptIfExists(filePath); + QFile::copy(":/" + novaFolder + "/novaprinter.py", filePath); + } + + filePath = searchDir.absoluteFilePath("helpers.py"); + if (getPluginVersion(":/" + novaFolder + "/helpers.py") > getPluginVersion(filePath)) { + removePythonScriptIfExists(filePath); + QFile::copy(":/" + novaFolder + "/helpers.py", filePath); + } + + filePath = searchDir.absoluteFilePath("socks.py"); + removePythonScriptIfExists(filePath); + QFile::copy(":/" + novaFolder + "/socks.py", filePath); + + if (novaFolder.endsWith("nova")) { + filePath = searchDir.absoluteFilePath("fix_encoding.py"); + removePythonScriptIfExists(filePath); + QFile::copy(":/" + novaFolder + "/fix_encoding.py", filePath); + } + else if (novaFolder.endsWith("nova3")) { + filePath = searchDir.absoluteFilePath("sgmllib3.py"); + removePythonScriptIfExists(filePath); + QFile::copy(":/" + novaFolder + "/sgmllib3.py", filePath); + } + + QDir destDir(pluginsLocation()); + Utils::Fs::removeDirRecursive(destDir.absoluteFilePath("__pycache__")); + QDir shippedSubdir(":/" + novaFolder + "/engines/"); + QStringList files = shippedSubdir.entryList(); + foreach (const QString &file, files) { + QString shippedFile = shippedSubdir.absoluteFilePath(file); + // Copy python classes + if (file.endsWith(".py")) { + const QString destFile = destDir.absoluteFilePath(file); + if (getPluginVersion(shippedFile) > getPluginVersion(destFile) ) { + qDebug("shipped %s is more recent then local plugin, updating...", qPrintable(file)); + removePythonScriptIfExists(destFile); + qDebug("%s copied to %s", qPrintable(shippedFile), qPrintable(destFile)); + QFile::copy(shippedFile, destFile); + } + } + else { + // Copy icons + if (file.endsWith(".png")) + if (!QFile::exists(destDir.absoluteFilePath(file))) + QFile::copy(shippedFile, destDir.absoluteFilePath(file)); + } + } +} + +void SearchEngine::onTimeout() +{ + cancelSearch(); +} + +// search QProcess return output as soon as it gets new +// stuff to read. We split it into lines and parse each +// line to SearchResult calling parseSearchResult(). +void SearchEngine::readSearchOutput() +{ + QByteArray output = m_searchProcess->readAllStandardOutput(); + output.replace("\r", ""); + QList lines = output.split('\n'); + if (!m_searchResultLineTruncated.isEmpty()) + lines.prepend(m_searchResultLineTruncated + lines.takeFirst()); + m_searchResultLineTruncated = lines.takeLast().trimmed(); + + QList searchResultList; + foreach (const QByteArray &line, lines) { + SearchResult searchResult; + if (parseSearchResult(QString::fromUtf8(line), searchResult)) + searchResultList << searchResult; + } + + if (!searchResultList.isEmpty()) + emit newSearchResults(searchResultList); +} + +void SearchEngine::update() +{ + QProcess nova; + nova.setEnvironment(QProcess::systemEnvironment()); + QStringList params; + params << Utils::Fs::toNativePath(engineLocation() + "/nova2.py"); + params << "--capabilities"; + nova.start(Utils::Misc::pythonExecutable(), params, QIODevice::ReadOnly); + nova.waitForStarted(); + nova.waitForFinished(); + + QString capabilities = QString(nova.readAll()); + QDomDocument xmlDoc; + if (!xmlDoc.setContent(capabilities)) { + qWarning() << "Could not parse Nova search engine capabilities, msg: " << capabilities.toLocal8Bit().data(); + qWarning() << "Error: " << nova.readAllStandardError().constData(); + return; + } + + QDomElement root = xmlDoc.documentElement(); + if (root.tagName() != "capabilities") { + qWarning() << "Invalid XML file for Nova search engine capabilities, msg: " << capabilities.toLocal8Bit().data(); + return; + } + + for (QDomNode engineNode = root.firstChild(); !engineNode.isNull(); engineNode = engineNode.nextSibling()) { + QDomElement engineElem = engineNode.toElement(); + if (!engineElem.isNull()) { + QString pluginName = engineElem.tagName(); + + PluginInfo *plugin = new PluginInfo; + plugin->name = pluginName; + plugin->version = getPluginVersion(pluginPath(pluginName)); + plugin->fullName = engineElem.elementsByTagName("name").at(0).toElement().text(); + plugin->url = engineElem.elementsByTagName("url").at(0).toElement().text(); + + foreach (QString cat, engineElem.elementsByTagName("categories").at(0).toElement().text().split(" ")) { + cat = cat.trimmed(); + if (!cat.isEmpty()) + plugin->supportedCategories << cat; + } + + QStringList disabledEngines = Preferences::instance()->getSearchEngDisabled(); + plugin->enabled = !disabledEngines.contains(pluginName); + + // Handle icon + QString iconPath = QString("%1/%2.png").arg(pluginsLocation()).arg(pluginName); + if (QFile::exists(iconPath)) { + plugin->iconPath = iconPath; + } + else { + iconPath = QString("%1/%2.ico").arg(pluginsLocation()).arg(pluginName); + if (QFile::exists(iconPath)) + plugin->iconPath = iconPath; + } + + if (!m_plugins.contains(pluginName)) { + m_plugins[pluginName] = plugin; + emit pluginInstalled(pluginName); + } + else if (m_plugins[pluginName]->version != plugin->version) { + delete m_plugins.take(pluginName); + m_plugins[pluginName] = plugin; + emit pluginUpdated(pluginName); + } + } + } +} + +// Parse one line of search results list +// Line is in the following form: +// file url | file name | file size | nb seeds | nb leechers | Search engine url +bool SearchEngine::parseSearchResult(const QString &line, SearchResult &searchResult) +{ + const QStringList parts = line.split("|"); + const int nbFields = parts.size(); + if (nbFields < (NB_PLUGIN_COLUMNS - 1)) return false; // -1 because desc_link is optional + + searchResult = SearchResult(); + searchResult.fileUrl = parts.at(PL_DL_LINK).trimmed(); // download URL + searchResult.fileName = parts.at(PL_NAME).trimmed(); // Name + searchResult.fileSize = parts.at(PL_SIZE).trimmed().toLongLong(); // Size + bool ok = false; + searchResult.nbSeeders = parts.at(PL_SEEDS).trimmed().toLongLong(&ok); // Seeders + if (!ok || (searchResult.nbSeeders < 0)) + searchResult.nbSeeders = -1; + searchResult.nbLeechers = parts.at(PL_LEECHS).trimmed().toLongLong(&ok); // Leechers + if (!ok || (searchResult.nbLeechers < 0)) + searchResult.nbLeechers = -1; + searchResult.siteUrl = parts.at(PL_ENGINE_URL).trimmed(); // Search site URL + if (nbFields == NB_PLUGIN_COLUMNS) + searchResult.descrLink = parts.at(PL_DESC_LINK).trimmed(); // Description Link + + return true; +} + +void SearchEngine::parseVersionInfo(const QByteArray &info) +{ + qDebug("Checking if update is needed"); + + QHash updateInfo; + bool dataCorrect = false; + QList lines = info.split('\n'); + foreach (QByteArray line, lines) { + line = line.trimmed(); + if (line.isEmpty()) continue; + if (line.startsWith("#")) continue; + + QList list = line.split(' '); + if (list.size() != 2) continue; + + QString pluginName = QString(list.first()); + if (!pluginName.endsWith(":")) continue; + + pluginName.chop(1); // remove trailing ':' + bool ok; + qreal version = list.last().toFloat(&ok); + qDebug("read line %s: %.2f", qPrintable(pluginName), version); + if (!ok) continue; + + dataCorrect = true; + if (isUpdateNeeded(pluginName, version)) { + qDebug("Plugin: %s is outdated", qPrintable(pluginName)); + updateInfo[pluginName] = version; + } + } + + if (!dataCorrect) + emit checkForUpdatesFailed(tr("An incorrect update info received.")); + else + emit checkForUpdatesFinished(updateInfo); +} + +bool SearchEngine::isUpdateNeeded(QString pluginName, qreal newVersion) const +{ + PluginInfo *plugin = pluginInfo(pluginName); + if (!plugin) return true; + + qreal oldVersion = plugin->version; + qDebug("IsUpdate needed? to be installed: %.2f, already installed: %.2f", newVersion, oldVersion); + return (newVersion > oldVersion); +} + +QString SearchEngine::pluginPath(const QString &name) +{ + return QString("%1/%2.py").arg(pluginsLocation()).arg(name); +} + +QHash SearchEngine::initializeCategoryNames() +{ + QHash result; + + result["all"] = QT_TRANSLATE_NOOP("SearchEngine", "All categories"); + result["movies"] = QT_TRANSLATE_NOOP("SearchEngine", "Movies"); + result["tv"] = QT_TRANSLATE_NOOP("SearchEngine", "TV shows"); + result["music"] = QT_TRANSLATE_NOOP("SearchEngine", "Music"); + result["games"] = QT_TRANSLATE_NOOP("SearchEngine", "Games"); + result["anime"] = QT_TRANSLATE_NOOP("SearchEngine", "Anime"); + result["software"] = QT_TRANSLATE_NOOP("SearchEngine", "Software"); + result["pictures"] = QT_TRANSLATE_NOOP("SearchEngine", "Pictures"); + result["books"] = QT_TRANSLATE_NOOP("SearchEngine", "Books"); + + return result; +} + +qreal SearchEngine::getPluginVersion(QString filePath) +{ + QFile plugin(filePath); + if (!plugin.exists()) { + qDebug("%s plugin does not exist, returning 0.0", qPrintable(filePath)); + return 0.0; + } + + if (!plugin.open(QIODevice::ReadOnly | QIODevice::Text)) + return 0.0; + + qreal version = 0.0; + while (!plugin.atEnd()) { + QByteArray line = plugin.readLine(); + if (line.startsWith("#VERSION: ")) { + line = line.split(' ').last().trimmed(); + version = line.toFloat(); + qDebug("plugin %s version: %.2f", qPrintable(filePath), version); + break; + } + } + + return version; +} diff -Nru qbittorrent-4.1.3/src/base/searchengine.h qbittorrent-3.3.15/src/base/searchengine.h --- qbittorrent-4.1.3/src/base/searchengine.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/base/searchengine.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,144 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2015 Vladimir Golovnev + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + */ + +#ifndef SEARCHENGINE_H +#define SEARCHENGINE_H + +#include +#include +#include +#include + +class QProcess; +class QTimer; + +struct PluginInfo +{ + QString name; + qreal version; + QString fullName; + QString url; + QStringList supportedCategories; + QString iconPath; + bool enabled; +}; + +struct SearchResult +{ + QString fileName; + QString fileUrl; + qlonglong fileSize; + qlonglong nbSeeders; + qlonglong nbLeechers; + QString siteUrl; + QString descrLink; +}; + +class SearchEngine: public QObject +{ + Q_OBJECT + +public: + SearchEngine(); + ~SearchEngine(); + + QStringList allPlugins() const; + QStringList enabledPlugins() const; + QStringList supportedCategories() const; + PluginInfo *pluginInfo(const QString &name) const; + + bool isActive() const; + + void enablePlugin(const QString &name, bool enabled = true); + void updatePlugin(const QString &name); + void installPlugin(const QString &source); + bool uninstallPlugin(const QString &name); + void checkForUpdates(); + + void startSearch(const QString &pattern, const QString &category, const QStringList &usedPlugins); + void cancelSearch(); + + void downloadTorrent(const QString &siteUrl, const QString &url); + + static qreal getPluginVersion(QString filePath); + static QString categoryFullName(const QString &categoryName); + QString pluginFullName(const QString &pluginName); + static QString pluginsLocation(); + +signals: + void searchStarted(); + void searchFinished(bool cancelled); + void searchFailed(); + void newSearchResults(const QList &results); + + void pluginInstalled(const QString &name); + void pluginInstallationFailed(const QString &name, const QString &reason); + void pluginUpdated(const QString &name); + void pluginUpdateFailed(const QString &name, const QString &reason); + + void checkForUpdatesFinished(const QHash &updateInfo); + void checkForUpdatesFailed(const QString &reason); + + void torrentFileDownloaded(const QString &path); + +private slots: + void onTimeout(); + void readSearchOutput(); + void processFinished(int exitcode); + void versionInfoDownloaded(const QString &url, const QByteArray &data); + void versionInfoDownloadFailed(const QString &url, const QString &reason); + void pluginDownloaded(const QString &url, QString filePath); + void pluginDownloadFailed(const QString &url, const QString &reason); + void torrentFileDownloadFinished(int exitcode); + +private: + void update(); + void updateNova(); + bool parseSearchResult(const QString &line, SearchResult &searchResult); + void parseVersionInfo(const QByteArray &info); + void installPlugin_impl(const QString &name, const QString &path); + bool isUpdateNeeded(QString pluginName, qreal newVersion) const; + + static QString engineLocation(); + static QString pluginPath(const QString &name); + static QHash initializeCategoryNames(); + + static const QHash m_categoryNames; + + const QString m_updateUrl; + + QHash m_plugins; + QProcess *m_searchProcess; + bool m_searchStopped; + QTimer *m_searchTimeout; + QByteArray m_searchResultLineTruncated; + QList m_downloaders; +}; + +#endif // SEARCHENGINE_H diff -Nru qbittorrent-4.1.3/src/base/settingsstorage.cpp qbittorrent-3.3.15/src/base/settingsstorage.cpp --- qbittorrent-4.1.3/src/base/settingsstorage.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/settingsstorage.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -32,9 +32,10 @@ #include #include #include +#include +#include #include "logger.h" -#include "profile.h" #include "utils/fs.h" namespace @@ -61,12 +62,38 @@ QString deserialize(const QString &name, QVariantHash &data); QString serialize(const QString &name, const QVariantHash &data); - const QString m_name; + using SettingsPtr = std::unique_ptr; + SettingsPtr createSettings(const QString &name) + { +#if defined(Q_OS_WIN) || defined(Q_OS_MAC) + return SettingsPtr(new QSettings(QSettings::IniFormat, QSettings::UserScope, "qBittorrent", name)); +#else + return SettingsPtr(new QSettings("qBittorrent", name)); +#endif + } + + QString m_name; + }; + +#ifdef QBT_USES_QT5 + typedef QHash MappingTable; +#else + class MappingTable: public QHash + { + public: + MappingTable(std::initializer_list> list) + { + reserve(static_cast(list.size())); + for (const auto &i : list) + insert(i.first, i.second); + } }; +#endif QString mapKey(const QString &key) { - static const QHash keyMapping = { + static const MappingTable keyMapping = { + {"BitTorrent/Session/MaxRatioAction", "Preferences/Bittorrent/MaxRatioAction"}, {"BitTorrent/Session/DefaultSavePath", "Preferences/Downloads/SavePath"}, {"BitTorrent/Session/TempPath", "Preferences/Downloads/TempPath"}, @@ -134,7 +161,11 @@ {"Network/Proxy/IP", "Preferences/Connection/Proxy/IP"}, {"Network/Proxy/Port", "Preferences/Connection/Proxy/Port"}, {"Network/PortForwardingEnabled", "Preferences/Connection/UPnP"}, +#ifdef QBT_USES_QT5 {"AddNewTorrentDialog/TreeHeaderState", "AddNewTorrentDialog/qt5/treeHeaderState"}, +#else + {"AddNewTorrentDialog/TreeHeaderState", "AddNewTorrentDialog/treeHeaderState"}, +#endif {"AddNewTorrentDialog/Width", "AddNewTorrentDialog/width"}, {"AddNewTorrentDialog/Position", "AddNewTorrentDialog/y"}, {"AddNewTorrentDialog/Expanded", "AddNewTorrentDialog/expanded"}, @@ -143,6 +174,7 @@ {"AddNewTorrentDialog/TopLevel", "Preferences/Downloads/NewAdditionDialogFront"}, {"State/BannedIPs", "Preferences/IPFilter/BannedIPs"} + }; return keyMapping.value(key, key); @@ -158,7 +190,7 @@ { m_timer.setSingleShot(true); m_timer.setInterval(5 * 1000); - connect(&m_timer, &QTimer::timeout, this, &SettingsStorage::save); + connect(&m_timer, SIGNAL(timeout()), SLOT(save())); } SettingsStorage::~SettingsStorage() @@ -195,7 +227,6 @@ return true; } - m_timer.start(); return false; } @@ -207,7 +238,7 @@ void SettingsStorage::storeValue(const QString &key, const QVariant &value) { - const QString realKey = mapKey(key); + QString realKey = mapKey(key); QWriteLocker locker(&m_lock); if (m_data.value(realKey) != value) { m_dirty = true; @@ -218,7 +249,7 @@ void SettingsStorage::removeValue(const QString &key) { - const QString realKey = mapKey(key); + QString realKey = mapKey(key); QWriteLocker locker(&m_lock); if (m_data.contains(realKey)) { m_dirty = true; @@ -230,39 +261,36 @@ QVariantHash TransactionalSettings::read() { QVariantHash res; - - const QString newPath = deserialize(m_name + QLatin1String("_new"), res); + bool writeBackNeeded = false; + QString newPath = deserialize(m_name + QLatin1String("_new"), res); if (!newPath.isEmpty()) { // "_new" file is NOT empty // This means that the PC closed either due to power outage - // or because the disk was full. In any case the settings weren't transferred + // or because the disk was full. In any case the settings weren't transfered // in their final position. So assume that qbittorrent_new.ini/qbittorrent_new.conf // contains the most recent settings. - Logger::instance()->addMessage(QObject::tr("Detected unclean program exit. Using fallback file to restore settings: %1") - .arg(Utils::Fs::toNativePath(newPath)) - , Log::WARNING); - - QString finalPath = newPath; - int index = finalPath.lastIndexOf("_new", -1, Qt::CaseInsensitive); - finalPath.remove(index, 4); - - Utils::Fs::forceRemove(finalPath); - QFile::rename(newPath, finalPath); + Logger::instance()->addMessage(QObject::tr("Detected unclean program exit. Using fallback file to restore settings."), Log::WARNING); + writeBackNeeded = true; } else { deserialize(m_name, res); } + Utils::Fs::forceRemove(newPath); + + if (writeBackNeeded) + write(res); + return res; } bool TransactionalSettings::write(const QVariantHash &data) { - // QSettings deletes the file before writing it out. This can result in problems + // QSettings delete the file before writing it out. This can result in problems // if the disk is full or a power outage occurs. Those events might occur // between deleting the file and recreating it. This is a safety measure. // Write everything to qBittorrent_new.ini/qBittorrent_new.conf and if it succeeds // replace qBittorrent.ini/qBittorrent.conf with it. - const QString newPath = serialize(m_name + QLatin1String("_new"), data); + QString newPath = serialize(m_name + QLatin1String("_new"), data); if (newPath.isEmpty()) { Utils::Fs::forceRemove(newPath); return false; @@ -271,14 +299,15 @@ QString finalPath = newPath; int index = finalPath.lastIndexOf("_new", -1, Qt::CaseInsensitive); finalPath.remove(index, 4); - Utils::Fs::forceRemove(finalPath); - return QFile::rename(newPath, finalPath); + QFile::rename(newPath, finalPath); + + return true; } QString TransactionalSettings::deserialize(const QString &name, QVariantHash &data) { - SettingsPtr settings = Profile::instance().applicationSettings(name); + SettingsPtr settings = createSettings(name); if (settings->allKeys().isEmpty()) return QString(); @@ -294,24 +323,18 @@ QString TransactionalSettings::serialize(const QString &name, const QVariantHash &data) { - SettingsPtr settings = Profile::instance().applicationSettings(name); + SettingsPtr settings = createSettings(name); for (auto i = data.begin(); i != data.end(); ++i) settings->setValue(i.key(), i.value()); settings->sync(); // Important to get error status - - switch (settings->status()) { - case QSettings::NoError: - return settings->fileName(); - case QSettings::AccessError: - Logger::instance()->addMessage(QObject::tr("An access error occurred while trying to write the configuration file."), Log::CRITICAL); - break; - case QSettings::FormatError: - Logger::instance()->addMessage(QObject::tr("A format error occurred while trying to write the configuration file."), Log::CRITICAL); - break; - default: - Logger::instance()->addMessage(QObject::tr("An unknown error occurred while trying to write the configuration file."), Log::CRITICAL); - break; + QSettings::Status status = settings->status(); + if (status != QSettings::NoError) { + if (status == QSettings::AccessError) + Logger::instance()->addMessage(QObject::tr("An access error occurred while trying to write the configuration file."), Log::CRITICAL); + else + Logger::instance()->addMessage(QObject::tr("A format error occurred while trying to write the configuration file."), Log::CRITICAL); + return QString(); } - return QString(); + return settings->fileName(); } diff -Nru qbittorrent-4.1.3/src/base/settingsstorage.h qbittorrent-3.3.15/src/base/settingsstorage.h --- qbittorrent-4.1.3/src/base/settingsstorage.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/settingsstorage.h 2017-08-03 20:30:10.000000000 +0000 @@ -31,11 +31,11 @@ #define SETTINGSSTORAGE_H #include -#include -#include #include +#include +#include -class SettingsStorage : public QObject +class SettingsStorage: public QObject { Q_OBJECT SettingsStorage(); @@ -44,7 +44,7 @@ public: static void initInstance(); static void freeInstance(); - static SettingsStorage *instance(); + static SettingsStorage* instance(); QVariant loadValue(const QString &key, const QVariant &defaultValue = QVariant()) const; void storeValue(const QString &key, const QVariant &value); diff -Nru qbittorrent-4.1.3/src/base/settingvalue.h qbittorrent-3.3.15/src/base/settingvalue.h --- qbittorrent-4.1.3/src/base/settingvalue.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/settingvalue.h 2017-08-03 20:30:10.000000000 +0000 @@ -30,11 +30,7 @@ #define SETTINGVALUE_H #include -#include - -#include #include -#include #include "settingsstorage.h" @@ -46,14 +42,16 @@ public: explicit CachedSettingValue(const char *keyName, const T &defaultValue = T()) : m_keyName(QLatin1String(keyName)) - , m_value(loadValue(defaultValue)) + , m_value(SettingsStorage::instance()->loadValue( + m_keyName, defaultValue).template value()) { } explicit CachedSettingValue(const char *keyName, const T &defaultValue , const ProxyFunc &proxyFunc) : m_keyName(QLatin1String(keyName)) - , m_value(proxyFunc(loadValue(defaultValue))) + , m_value(proxyFunc(SettingsStorage::instance()->loadValue( + m_keyName, defaultValue).template value())) { } @@ -70,45 +68,11 @@ CachedSettingValue &operator=(const T &newValue) { m_value = newValue; - storeValue(m_value); + SettingsStorage::instance()->storeValue(m_keyName, m_value); return *this; } private: - // regular load/save pair - template ::value, int>::type = 0> - U loadValue(const U &defaultValue) - { - return SettingsStorage::instance()->loadValue(m_keyName, defaultValue).template value(); - } - - template ::value, int>::type = 0> - void storeValue(const U &value) - { - SettingsStorage::instance()->storeValue(m_keyName, value); - } - - // load/save pair for an enum - // saves literal value of the enum constant, obtained from QMetaEnum - template ::value, int>::type = 0> - U loadValue(const U &defaultValue) - { - static_assert(std::is_same::type>::value, - "Enumeration underlying type has to be int"); - - bool ok = false; - const U res = static_cast(QMetaEnum::fromType().keyToValue( - SettingsStorage::instance()->loadValue(m_keyName).toString().toLatin1().constData(), &ok)); - return ok ? res : defaultValue; - } - - template ::value, int>::type = 0> - void storeValue(const U &value) - { - SettingsStorage::instance()->storeValue(m_keyName, - QString::fromLatin1(QMetaEnum::fromType().valueToKey(static_cast(value)))); - } - const QString m_keyName; T m_value; }; diff -Nru qbittorrent-4.1.3/src/base/torrentfileguard.cpp qbittorrent-3.3.15/src/base/torrentfileguard.cpp --- qbittorrent-4.1.3/src/base/torrentfileguard.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/torrentfileguard.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -28,9 +28,15 @@ #include "torrentfileguard.h" -#include "settingvalue.h" +#include +#include "settingsstorage.h" #include "utils/fs.h" +namespace +{ + const QLatin1String KEY_AUTO_DELETE_ENABLED ("Core/AutoDeleteAddedTorrentFile"); +} + FileGuard::FileGuard(const QString &path) : m_path {path} , m_remove {true} @@ -48,22 +54,17 @@ Utils::Fs::forceRemove(m_path); // forceRemove() checks for file existence } -TorrentFileGuard::TorrentFileGuard(const QString &path, TorrentFileGuard::AutoDeleteMode mode) - : FileGuard {mode != Never ? path : QString()} - , m_mode {mode} - , m_wasAdded {false} -{ -} - TorrentFileGuard::TorrentFileGuard(const QString &path) - : TorrentFileGuard {path, autoDeleteMode()} + : m_mode {autoDeleteMode()} + , m_wasAdded {false} + , m_guard {m_mode != Never ? path : QString()} { } TorrentFileGuard::~TorrentFileGuard() { if (!m_wasAdded && (m_mode != Always)) - setAutoRemove(false); + m_guard.setAutoRemove(false); } void TorrentFileGuard::markAsAddedToSession() @@ -71,19 +72,31 @@ m_wasAdded = true; } +void TorrentFileGuard::setAutoRemove(bool remove) +{ + m_guard.setAutoRemove(remove); +} + TorrentFileGuard::AutoDeleteMode TorrentFileGuard::autoDeleteMode() { - return autoDeleteModeSetting(); + QMetaEnum meta {modeMetaEnum()}; + return static_cast(meta.keyToValue(SettingsStorage::instance()->loadValue( + KEY_AUTO_DELETE_ENABLED, meta.valueToKey(Never)).toByteArray())); } void TorrentFileGuard::setAutoDeleteMode(TorrentFileGuard::AutoDeleteMode mode) { - autoDeleteModeSetting() = mode; + QMetaEnum meta {modeMetaEnum()}; + SettingsStorage::instance()->storeValue(KEY_AUTO_DELETE_ENABLED, meta.valueToKey(mode)); } -CachedSettingValue &TorrentFileGuard::autoDeleteModeSetting() +QMetaEnum TorrentFileGuard::modeMetaEnum() { - static CachedSettingValue setting("Core/AutoDeleteAddedTorrentFile", AutoDeleteMode::Never); - return setting; +#if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0) + return QMetaEnum::fromType(); +#else + const int enumeratorIndex = staticMetaObject.indexOfEnumerator("AutoDeleteMode"); + Q_ASSERT(enumeratorIndex >= 0); + return staticMetaObject.enumerator(enumeratorIndex); +#endif } - diff -Nru qbittorrent-4.1.3/src/base/torrentfileguard.h qbittorrent-3.3.15/src/base/torrentfileguard.h --- qbittorrent-4.1.3/src/base/torrentfileguard.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/torrentfileguard.h 2017-08-03 20:30:10.000000000 +0000 @@ -29,11 +29,10 @@ #ifndef TOFFENTFILEGURAD_H #define TOFFENTFILEGURAD_H -#include #include +#include -template class CachedSettingValue; - +class QMetaEnum; /// Utility class to defer file deletion class FileGuard { @@ -51,9 +50,13 @@ /// Reads settings for .torrent files from preferences /// and sets the file guard up accordingly -class TorrentFileGuard : private FileGuard +class TorrentFileGuard { Q_GADGET + // moc from Qt4 ignores Q_ENUMS when it is behind #if QT_VERSION check + // this declaration is needed for Qt 4 only + // TODO Qt5: remove when dropping Qt4 support + Q_ENUMS(AutoDeleteMode) public: TorrentFileGuard(const QString &path = QString()); @@ -61,9 +64,9 @@ /// marks the torrent file as loaded (added) into the BitTorrent::Session void markAsAddedToSession(); - using FileGuard::setAutoRemove; + void setAutoRemove(bool remove); - enum AutoDeleteMode: int // do not change these names: they are stored in config file + enum AutoDeleteMode // do not change these names: they are stored in config file { Never, IfAdded, @@ -75,12 +78,26 @@ static void setAutoDeleteMode(AutoDeleteMode mode); private: - TorrentFileGuard(const QString &path, AutoDeleteMode mode); - static CachedSettingValue &autoDeleteModeSetting(); - + static QMetaEnum modeMetaEnum(); +#if QT_VERSION >= QT_VERSION_CHECK(5, 5, 0) Q_ENUM(AutoDeleteMode) +#endif AutoDeleteMode m_mode; bool m_wasAdded; + // Qt 4 moc has troubles with Q_GADGET: if Q_GADGET is present in a class, moc unconditionally + // references in the generated code the statiMetaObject from the class ancestor. + // Moreover, if the ancestor class has Q_GADGET but does not have other + // Q_ declarations, moc does not generate staticMetaObject for it. These results + // in referencing the non existent staticMetaObject and such code fails to compile. + // This problem is NOT present in Qt 5.7.0 and maybe in some older Qt 5 versions too + // Qt 4.8.7 has it. + // Therefore, we can't inherit FileGuard :( + // TODO Qt5: port to private inheritance when dropping Qt 4 support + FileGuard m_guard; }; +#if QT_VERSION < QT_VERSION_CHECK(5, 5, 0) +Q_DECLARE_METATYPE(TorrentFileGuard::AutoDeleteMode) +#endif + #endif // TOFFENTFILEGURAD_H diff -Nru qbittorrent-4.1.3/src/base/torrentfilter.cpp qbittorrent-3.3.15/src/base/torrentfilter.cpp --- qbittorrent-4.1.3/src/base/torrentfilter.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/torrentfilter.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -26,13 +26,11 @@ * exception statement from your version. */ -#include "torrentfilter.h" - #include "bittorrent/torrenthandle.h" +#include "torrentfilter.h" const QString TorrentFilter::AnyCategory; const QStringSet TorrentFilter::AnyHash = (QStringSet() << QString()); -const QString TorrentFilter::AnyTag; const TorrentFilter TorrentFilter::DownloadingTorrent(TorrentFilter::Downloading); const TorrentFilter TorrentFilter::SeedingTorrent(TorrentFilter::Seeding); @@ -51,18 +49,16 @@ { } -TorrentFilter::TorrentFilter(const Type type, const QStringSet &hashSet, const QString &category, const QString &tag) +TorrentFilter::TorrentFilter(Type type, QStringSet hashSet, QString category) : m_type(type) , m_category(category) - , m_tag(tag) , m_hashSet(hashSet) { } -TorrentFilter::TorrentFilter(const QString &filter, const QStringSet &hashSet, const QString &category, const QString &tag) +TorrentFilter::TorrentFilter(QString filter, QStringSet hashSet, QString category) : m_type(All) , m_category(category) - , m_tag(tag) , m_hashSet(hashSet) { setTypeByName(filter); @@ -125,27 +121,14 @@ return false; } -bool TorrentFilter::setTag(const QString &tag) -{ - // QString::operator==() doesn't distinguish between empty and null strings. - if ((m_tag != tag) - || (m_tag.isNull() && !tag.isNull()) - || (!m_tag.isNull() && tag.isNull())) { - m_tag = tag; - return true; - } - - return false; -} - -bool TorrentFilter::match(const TorrentHandle *const torrent) const +bool TorrentFilter::match(TorrentHandle *const torrent) const { if (!torrent) return false; - return (matchState(torrent) && matchHash(torrent) && matchCategory(torrent) && matchTag(torrent)); + return (matchState(torrent) && matchHash(torrent) && matchCategory(torrent)); } -bool TorrentFilter::matchState(const BitTorrent::TorrentHandle *const torrent) const +bool TorrentFilter::matchState(BitTorrent::TorrentHandle *const torrent) const { switch (m_type) { case All: @@ -171,22 +154,14 @@ } } -bool TorrentFilter::matchHash(const BitTorrent::TorrentHandle *const torrent) const +bool TorrentFilter::matchHash(BitTorrent::TorrentHandle *const torrent) const { if (m_hashSet == AnyHash) return true; else return m_hashSet.contains(torrent->hash()); } -bool TorrentFilter::matchCategory(const BitTorrent::TorrentHandle *const torrent) const +bool TorrentFilter::matchCategory(BitTorrent::TorrentHandle *const torrent) const { if (m_category.isNull()) return true; else return (torrent->belongsToCategory(m_category)); } - -bool TorrentFilter::matchTag(const BitTorrent::TorrentHandle *const torrent) const -{ - // Empty tag is a special value to indicate we're filtering for untagged torrents. - if (m_tag.isNull()) return true; - else if (m_tag.isEmpty()) return torrent->tags().isEmpty(); - else return (torrent->hasTag(m_tag)); -} diff -Nru qbittorrent-4.1.3/src/base/torrentfilter.h qbittorrent-3.3.15/src/base/torrentfilter.h --- qbittorrent-4.1.3/src/base/torrentfilter.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/torrentfilter.h 2017-08-03 20:30:10.000000000 +0000 @@ -29,14 +29,17 @@ #ifndef TORRENTFILTER_H #define TORRENTFILTER_H -#include #include +#include typedef QSet QStringSet; namespace BitTorrent { - class TorrentHandle; + +class TorrentHandle; +class TorrentState; + } class TorrentFilter @@ -55,10 +58,8 @@ Errored }; - // These mean any permutation, including no category / tag. static const QString AnyCategory; static const QStringSet AnyHash; - static const QString AnyTag; static const TorrentFilter DownloadingTorrent; static const TorrentFilter SeedingTorrent; @@ -70,28 +71,24 @@ static const TorrentFilter ErroredTorrent; TorrentFilter(); - // category & tags: pass empty string for uncategorized / untagged torrents. - // Pass null string (QString()) to disable filtering (i.e. all torrents). - TorrentFilter(const Type type, const QStringSet &hashSet = AnyHash, const QString &category = AnyCategory, const QString &tag = AnyTag); - TorrentFilter(const QString &filter, const QStringSet &hashSet = AnyHash, const QString &category = AnyCategory, const QString &tags = AnyTag); + // category: pass empty string for "no category" or null string (QString()) for "any category" + TorrentFilter(Type type, QStringSet hashSet = AnyHash, QString category = AnyCategory); + TorrentFilter(QString filter, QStringSet hashSet = AnyHash, QString category = AnyCategory); bool setType(Type type); bool setTypeByName(const QString &filter); bool setHashSet(const QStringSet &hashSet); bool setCategory(const QString &category); - bool setTag(const QString &tag); - bool match(const BitTorrent::TorrentHandle *torrent) const; + bool match(BitTorrent::TorrentHandle *const torrent) const; private: - bool matchState(const BitTorrent::TorrentHandle *torrent) const; - bool matchHash(const BitTorrent::TorrentHandle *torrent) const; - bool matchCategory(const BitTorrent::TorrentHandle *torrent) const; - bool matchTag(const BitTorrent::TorrentHandle *torrent) const; + bool matchState(BitTorrent::TorrentHandle *const torrent) const; + bool matchHash(BitTorrent::TorrentHandle *const torrent) const; + bool matchCategory(BitTorrent::TorrentHandle *const torrent) const; Type m_type; QString m_category; - QString m_tag; QStringSet m_hashSet; }; diff -Nru qbittorrent-4.1.3/src/base/tristatebool.cpp qbittorrent-3.3.15/src/base/tristatebool.cpp --- qbittorrent-4.1.3/src/base/tristatebool.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/tristatebool.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -28,6 +28,33 @@ #include "tristatebool.h" -const TriStateBool TriStateBool::Undefined(-1); -const TriStateBool TriStateBool::False(0); -const TriStateBool TriStateBool::True(1); +TriStateBool::TriStateBool() + : m_value(Undefined) +{ +} + +TriStateBool::TriStateBool(bool b) +{ + m_value = (b ? True : False); +} + +TriStateBool::TriStateBool(TriStateBool::ValueType value) + : m_value(Undefined) +{ + switch (value) { + case Undefined: + case True: + case False: + m_value = value; + } +} + +TriStateBool::operator bool() const +{ + return (m_value == True); +} + +TriStateBool::operator ValueType() const +{ + return m_value; +} diff -Nru qbittorrent-4.1.3/src/base/tristatebool.h qbittorrent-3.3.15/src/base/tristatebool.h --- qbittorrent-4.1.3/src/base/tristatebool.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/tristatebool.h 2017-08-03 20:30:10.000000000 +0000 @@ -32,36 +32,22 @@ class TriStateBool { public: - static const TriStateBool Undefined; - static const TriStateBool False; - static const TriStateBool True; - - constexpr TriStateBool() = default; - constexpr TriStateBool(const TriStateBool &other) = default; - explicit constexpr TriStateBool(int value) - : m_value(value < 0 ? -1 : (value > 0 ? 1 : 0)) - { - } - - explicit constexpr operator int() const + enum ValueType { - return m_value; - } - - TriStateBool &operator=(const TriStateBool &other) = default; // add constexpr when using C++14 + Undefined = -1, + False = 0, + True = 1 + }; + + TriStateBool(); + TriStateBool(bool b); + TriStateBool(ValueType value); - constexpr bool operator==(const TriStateBool &other) const - { - return (m_value == other.m_value); - } - - constexpr bool operator!=(const TriStateBool &other) const - { - return !operator==(other); - } + operator ValueType() const; + operator bool() const; private: - signed char m_value = -1; // Undefined by default + ValueType m_value; }; #endif // TRISTATEBOOL_H diff -Nru qbittorrent-4.1.3/src/base/unicodestrings.h qbittorrent-3.3.15/src/base/unicodestrings.h --- qbittorrent-4.1.3/src/base/unicodestrings.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/unicodestrings.h 2017-08-03 20:30:10.000000000 +0000 @@ -39,7 +39,6 @@ const char C_UP[] = "▲"; const char C_DOWN[] = "▼"; const char C_COPYRIGHT[] = "©"; -const char C_THIN_SPACE[] = " "; const char C_UTP[] = "μTP"; const char C_LOCALE_ENGLISH[] = "English"; const char C_LOCALE_ENGLISH_AUSTRALIA[] = "English(Australia)"; diff -Nru qbittorrent-4.1.3/src/base/utils/bytearray.cpp qbittorrent-3.3.15/src/base/utils/bytearray.cpp --- qbittorrent-4.1.3/src/base/utils/bytearray.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/utils/bytearray.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2018 Mike Tzou (Chocobo1) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "bytearray.h" - -#include - -QList Utils::ByteArray::splitToViews(const QByteArray &in, const QByteArray &sep, const QString::SplitBehavior behavior) -{ - if (sep.isEmpty()) - return {in}; - - QList ret; - - int head = 0; - while (head < in.size()) { - int end = in.indexOf(sep, head); - if (end < 0) - end = in.size(); - - // omit empty parts - const QByteArray part = QByteArray::fromRawData((in.constData() + head), (end - head)); - if (!part.isEmpty() || (behavior == QString::KeepEmptyParts)) - ret += part; - - head = end + sep.size(); - } - - return ret; -} - -const QByteArray Utils::ByteArray::midView(const QByteArray &in, const int pos, const int len) -{ - if ((pos < 0) || (pos >= in.size()) || (len == 0)) - return {}; - - const int validLen = ((len < 0) || (pos + len) >= in.size()) - ? in.size() - pos - : len; - return QByteArray::fromRawData(in.constData() + pos, validLen); -} diff -Nru qbittorrent-4.1.3/src/base/utils/bytearray.h qbittorrent-3.3.15/src/base/utils/bytearray.h --- qbittorrent-4.1.3/src/base/utils/bytearray.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/utils/bytearray.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2018 Mike Tzou (Chocobo1) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#pragma once - -#include -#include - -namespace Utils -{ - namespace ByteArray - { - // Mimic QString::split(sep, behavior) - QList splitToViews(const QByteArray &in, const QByteArray &sep, const QString::SplitBehavior behavior = QString::KeepEmptyParts); - - // Mimic QByteArray::mid(pos, len) but instead of returning a full-copy, - // we only return a partial view - const QByteArray midView(const QByteArray &in, const int pos, const int len = -1); - } -} diff -Nru qbittorrent-4.1.3/src/base/utils/foreignapps.cpp qbittorrent-3.3.15/src/base/utils/foreignapps.cpp --- qbittorrent-4.1.3/src/base/utils/foreignapps.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/utils/foreignapps.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,106 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2018 Mike Tzou - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "foreignapps.h" - -#include -#include -#include -#include - -#include "base/logger.h" - -using namespace Utils::ForeignApps; - -namespace -{ - bool testPythonInstallation(const QString &exeName, PythonInfo &info) - { - QProcess proc; - proc.start(exeName, {"--version"}, QIODevice::ReadOnly); - if (proc.waitForFinished() && (proc.exitCode() == QProcess::NormalExit)) { - QByteArray procOutput = proc.readAllStandardOutput(); - if (procOutput.isEmpty()) - procOutput = proc.readAllStandardError(); - procOutput = procOutput.simplified(); - - // Software 'Anaconda' installs its own python interpreter - // and `python --version` returns a string like this: - // "Python 3.4.3 :: Anaconda 2.3.0 (64-bit)" - const QList outputSplit = procOutput.split(' '); - if (outputSplit.size() <= 1) - return false; - - // User reports: `python --version` -> "Python 3.6.6+" - // So trim off unrelated characters - const QString versionStr = outputSplit[1]; - const int idx = versionStr.indexOf(QRegularExpression("[^\\.\\d]")); - - try { - info = {exeName, versionStr.left(idx)}; - } - catch (const std::runtime_error &err) { - return false; - } - - LogMsg(QCoreApplication::translate("Utils::ForeignApps", "Python detected, version: %1").arg(info.version), Log::INFO); - return true; - } - - return false; - } -} - -bool Utils::ForeignApps::PythonInfo::isValid() const -{ - return (!executableName.isEmpty() && version.isValid()); -} - -PythonInfo Utils::ForeignApps::pythonInfo() -{ - static PythonInfo pyInfo; - if (!pyInfo.isValid()) { -#if defined(Q_OS_UNIX) - // On Unix-Like Systems python2 and python3 should always exist - // https://legacy.python.org/dev/peps/pep-0394/ - if (testPythonInstallation("python3", pyInfo)) - return pyInfo; - if (testPythonInstallation("python2", pyInfo)) - return pyInfo; -#endif - // Look for "python" in Windows and in UNIX if "python2" and "python3" are - // not detected. - if (testPythonInstallation("python", pyInfo)) - return pyInfo; - - LogMsg(QCoreApplication::translate("Utils::ForeignApps", "Python not detected"), Log::INFO); - } - - return pyInfo; -} diff -Nru qbittorrent-4.1.3/src/base/utils/foreignapps.h qbittorrent-3.3.15/src/base/utils/foreignapps.h --- qbittorrent-4.1.3/src/base/utils/foreignapps.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/utils/foreignapps.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2018 Mike Tzou - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#pragma once - -#include - -#include "base/utils/version.h" - -namespace Utils -{ - namespace ForeignApps - { - struct PythonInfo - { - using Version = Utils::Version; - - bool isValid() const; - - QString executableName; - Version version; - }; - - PythonInfo pythonInfo(); - } -} diff -Nru qbittorrent-4.1.3/src/base/utils/fs.cpp qbittorrent-3.3.15/src/base/utils/fs.cpp --- qbittorrent-4.1.3/src/base/utils/fs.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/utils/fs.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2012 Christophe Dumez + * Copyright (C) 2012 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,45 +24,57 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#include "fs.h" - -#include - -#include #include #include -#include #include #include -#include -#include +#include +#include +#include -#include -#include +#ifdef Q_OS_MAC +#include +#include +#endif -#if defined(Q_OS_WIN) -#include -#elif defined(Q_OS_MAC) || defined(Q_OS_FREEBSD) || defined(Q_OS_OPENBSD) +#ifndef Q_OS_WIN +#if defined(Q_OS_MAC) || defined(Q_OS_FREEBSD) #include #include #elif defined(Q_OS_HAIKU) #include #else #include -#include +#endif +#else +#include +#include #endif -#include "base/bittorrent/torrenthandle.h" -#include "base/global.h" +#ifndef QBT_USES_QT5 + +#ifndef DISABLE_GUI +#include +#endif + +#else +#include +#endif + + +#include "misc.h" +#include "fs.h" /** * Converts a path to a string suitable for display. * This function makes sure the directory separator used is consistent * with the OS being run. */ -QString Utils::Fs::toNativePath(const QString &path) +QString Utils::Fs::toNativePath(const QString& path) { return QDir::toNativeSeparators(path); } @@ -77,27 +89,27 @@ */ QString Utils::Fs::fileExtension(const QString &filename) { - QString ext = QString(filename).remove(QB_EXT); - const int pointIndex = ext.lastIndexOf('.'); - return (pointIndex >= 0) ? ext.mid(pointIndex + 1) : QString(); + QString ext = QString(filename).remove(".!qB"); + const int point_index = ext.lastIndexOf("."); + return (point_index >= 0) ? ext.mid(point_index + 1) : QString(); } -QString Utils::Fs::fileName(const QString &filePath) +QString Utils::Fs::fileName(const QString& file_path) { - QString path = fromNativePath(filePath); - const int slashIndex = path.lastIndexOf('/'); - if (slashIndex == -1) + QString path = fromNativePath(file_path); + const int slash_index = path.lastIndexOf("/"); + if (slash_index == -1) return path; - return path.mid(slashIndex + 1); + return path.mid(slash_index + 1); } -QString Utils::Fs::folderName(const QString &filePath) +QString Utils::Fs::folderName(const QString& file_path) { - QString path = fromNativePath(filePath); - const int slashIndex = path.lastIndexOf('/'); - if (slashIndex == -1) + QString path = fromNativePath(file_path); + const int slash_index = path.lastIndexOf("/"); + if (slash_index == -1) return path; - return path.left(slashIndex); + return path.left(slash_index); } /** @@ -105,12 +117,12 @@ * `.DS_Store`. Then will try to remove the whole tree if the tree consist * only of folders */ -bool Utils::Fs::smartRemoveEmptyFolderTree(const QString &path) +bool Utils::Fs::smartRemoveEmptyFolderTree(const QString& path) { if (path.isEmpty() || !QDir(path).exists()) - return true; + return false; - const QStringList deleteFilesList = { + static const QStringList deleteFilesList = { // Windows "Thumbs.db", "desktop.ini", @@ -121,15 +133,13 @@ }; // travel from the deepest folder and remove anything unwanted on the way out. - QStringList dirList(path + '/'); // get all sub directories paths + QStringList dirList(path + "/"); // get all sub directories paths QDirIterator iter(path, (QDir::AllDirs | QDir::NoDotAndDotDot), QDirIterator::Subdirectories); while (iter.hasNext()) - dirList << iter.next() + '/'; - // sort descending by directory depth - std::sort(dirList.begin(), dirList.end() - , [](const QString &l, const QString &r) { return l.count('/') > r.count('/'); }); + dirList << iter.next() + "/"; + std::sort(dirList.begin(), dirList.end(), [](const QString &l, const QString &r) { return l.count("/") > r.count("/"); }); // sort descending by directory depth - for (const QString &p : qAsConst(dirList)) { + for (const QString &p : dirList) { // remove unwanted files for (const QString &f : deleteFilesList) { forceRemove(p + f); @@ -139,7 +149,7 @@ QDir dir(p); QStringList tmpFileList = dir.entryList(QDir::Files); for (const QString &f : tmpFileList) { - if (f.endsWith('~')) + if (f.endsWith("~")) forceRemove(p + f); } @@ -151,13 +161,13 @@ } /** - * Removes the file with the given filePath. + * Removes the file with the given file_path. * * This function will try to fix the file permissions before removing it. */ -bool Utils::Fs::forceRemove(const QString &filePath) +bool Utils::Fs::forceRemove(const QString& file_path) { - QFile f(filePath); + QFile f(file_path); if (!f.exists()) return true; // Make sure we have read/write permissions @@ -168,11 +178,30 @@ /** * Removes directory and its content recursively. + * */ void Utils::Fs::removeDirRecursive(const QString &path) { - if (!path.isEmpty()) - QDir(path).removeRecursively(); +if (path.isEmpty()) + return; +#ifdef QBT_USES_QT5 + QDir(path).removeRecursively(); +#else + QDir dir(path); + + if (!dir.exists()) return; + + Q_FOREACH(QFileInfo info, dir.entryInfoList(QDir::NoDotAndDotDot | + QDir::System | + QDir::Hidden | + QDir::AllDirs | + QDir::Files, QDir::DirsFirst)) { + if (info.isDir()) removeDirRecursive(info.absoluteFilePath()); + else forceRemove(info.absoluteFilePath()); + } + + dir.rmdir(path); +#endif } /** @@ -181,19 +210,20 @@ * * Returns -1 in case of error. */ -qint64 Utils::Fs::computePathSize(const QString &path) +qint64 Utils::Fs::computePathSize(const QString& path) { // Check if it is a file QFileInfo fi(path); if (!fi.exists()) return -1; if (fi.isFile()) return fi.size(); - // Compute folder size based on its content qint64 size = 0; - QDirIterator iter(path, QDir::Files | QDir::Hidden | QDir::NoSymLinks, QDirIterator::Subdirectories); - while (iter.hasNext()) { - iter.next(); - size += iter.fileInfo().size(); + foreach (const QFileInfo &subfi, QDir(path).entryInfoList(QDir::Dirs|QDir::Files)) { + if (subfi.fileName().startsWith(".")) continue; + if (subfi.isDir()) + size += computePathSize(subfi.absoluteFilePath()); + else + size += subfi.size(); } return size; } @@ -201,28 +231,33 @@ /** * Makes deep comparison of two files to make sure they are identical. */ -bool Utils::Fs::sameFiles(const QString &path1, const QString &path2) +bool Utils::Fs::sameFiles(const QString& path1, const QString& path2) { QFile f1(path1), f2(path2); if (!f1.exists() || !f2.exists()) return false; if (f1.size() != f2.size()) return false; if (!f1.open(QIODevice::ReadOnly)) return false; - if (!f2.open(QIODevice::ReadOnly)) return false; - - const int readSize = 1024 * 1024; // 1 MiB - while (!f1.atEnd() && !f2.atEnd()) { - if (f1.read(readSize) != f2.read(readSize)) - return false; + if (!f2.open(QIODevice::ReadOnly)) { + f1.close(); + return false; + } + bool same = true; + while(!f1.atEnd() && !f2.atEnd()) { + if (f1.read(1024) != f2.read(1024)) { + same = false; + break; + } } - return true; + f1.close(); f2.close(); + return same; } -QString Utils::Fs::toValidFileSystemName(const QString &name, bool allowSeparators, const QString &pad) +QString Utils::Fs::toValidFileSystemName(const QString &name, bool allowSeparators) { - const QRegularExpression regex(allowSeparators ? "[:?\"*<>|]+" : "[\\\\/:?\"*<>|]+"); + QRegExp regex(allowSeparators ? "[:?\"*<>|]+" : "[\\\\/:?\"*<>|]+"); QString validName = name.trimmed(); - validName.replace(regex, pad); + validName.replace(regex, " "); qDebug() << "toValidFileSystemName:" << name << "=>" << validName; return validName; @@ -232,23 +267,56 @@ { if (name.isEmpty()) return false; - const QRegularExpression regex(allowSeparators ? "[:?\"*<>|]" : "[\\\\/:?\"*<>|]"); + QRegExp regex(allowSeparators ? "[:?\"*<>|]" : "[\\\\/:?\"*<>|]"); return !name.contains(regex); } -qint64 Utils::Fs::freeDiskSpaceOnPath(const QString &path) +qulonglong Utils::Fs::freeDiskSpaceOnPath(const QString &path) { - if (path.isEmpty()) return -1; + if (path.isEmpty()) return 0; - return QStorageInfo(path).bytesAvailable(); + QDir dirPath(path); + if (!dirPath.exists()) { + QStringList parts = path.split("/"); + while (parts.size() > 1 && !QDir(parts.join("/")).exists()) + parts.removeLast(); + + dirPath = QDir(parts.join("/")); + if (!dirPath.exists()) return 0; + } + Q_ASSERT(dirPath.exists()); + +#if defined(Q_OS_WIN) + ULARGE_INTEGER bytesFree; + LPCWSTR nativePath = reinterpret_cast((toNativePath(dirPath.path())).utf16()); + if (GetDiskFreeSpaceExW(nativePath, &bytesFree, NULL, NULL) == 0) + return 0; + return bytesFree.QuadPart; +#elif defined(Q_OS_HAIKU) + const QString statfsPath = dirPath.path() + "/."; + dev_t device = dev_for_path(qPrintable(statfsPath)); + if (device < 0) + return 0; + fs_info info; + if (fs_stat_dev(device, &info) != B_OK) + return 0; + return ((qulonglong) info.free_blocks * (qulonglong) info.block_size); +#else + struct statfs stats; + const QString statfsPath = dirPath.path() + "/."; + const int ret = statfs(qPrintable(statfsPath), &stats); + if (ret != 0) + return 0; + return ((qulonglong) stats.f_bavail * (qulonglong) stats.f_bsize); +#endif } -QString Utils::Fs::branchPath(const QString &filePath, QString *removed) +QString Utils::Fs::branchPath(const QString& file_path, QString* removed) { - QString ret = fromNativePath(filePath); - if (ret.endsWith('/')) + QString ret = fromNativePath(file_path); + if (ret.endsWith("/")) ret.chop(1); - const int slashIndex = ret.lastIndexOf('/'); + const int slashIndex = ret.lastIndexOf("/"); if (slashIndex >= 0) { if (removed) *removed = ret.mid(slashIndex + 1); @@ -268,65 +336,167 @@ QString Utils::Fs::expandPath(const QString &path) { - QString ret = path.trimmed(); + QString ret = fromNativePath(path.trimmed()); if (ret.isEmpty()) return ret; return QDir::cleanPath(ret); } -QString Utils::Fs::expandPathAbs(const QString &path) +QString Utils::Fs::expandPathAbs(const QString& path) { - return QDir(expandPath(path)).absolutePath(); + QString ret = expandPath(path); + + if (!QDir::isAbsolutePath(ret)) + ret = QDir(ret).absolutePath(); + + return ret; } -QString Utils::Fs::tempPath() +QString Utils::Fs::QDesktopServicesDataLocation() { - static const QString path = QDir::tempPath() + "/.qBittorrent/"; - QDir().mkdir(path); - return path; + QString result; +#if defined(Q_OS_WIN) + wchar_t path[MAX_PATH + 1] = {L'\0'}; + if (SHGetSpecialFolderPathW(0, path, CSIDL_LOCAL_APPDATA, FALSE)) + result = fromNativePath(QString::fromWCharArray(path)); + if (!QCoreApplication::applicationName().isEmpty()) + result += QLatin1String("/") + qApp->applicationName(); +#elif defined(Q_OS_MAC) + FSRef ref; + OSErr err = FSFindFolder(kUserDomain, kApplicationSupportFolderType, false, &ref); + if (err) + return QString(); + QByteArray ba(2048, 0); + if (FSRefMakePath(&ref, reinterpret_cast(ba.data()), ba.size()) == noErr) + result = QString::fromUtf8(ba).normalized(QString::NormalizationForm_C); + result += QLatin1Char('/') + qApp->applicationName(); +#else + QString xdgDataHome = QLatin1String(qgetenv("XDG_DATA_HOME")); + if (xdgDataHome.isEmpty()) + xdgDataHome = QDir::homePath() + QLatin1String("/.local/share"); + xdgDataHome += QLatin1String("/data/") + + qApp->applicationName(); + result = xdgDataHome; +#endif + if (!result.endsWith("/")) + result += "/"; + return result; } -bool Utils::Fs::isRegularFile(const QString &path) +QString Utils::Fs::QDesktopServicesCacheLocation() { - struct ::stat st; - if (::stat(path.toUtf8().constData(), &st) != 0) { - // analyse erno and log the error - const auto err = errno; - qDebug("Could not get file stats for path '%s'. Error: %s" - , qUtf8Printable(path), qUtf8Printable(strerror(err))); - return false; - } - - return (st.st_mode & S_IFMT) == S_IFREG; + QString result; +#if defined(Q_OS_WIN) || defined(Q_OS_OS2) + result = QDesktopServicesDataLocation() + QLatin1String("cache"); +#else +#ifdef Q_OS_MAC + // http://developer.apple.com/documentation/Carbon/Reference/Folder_Manager/Reference/reference.html + FSRef ref; + OSErr err = FSFindFolder(kUserDomain, kCachedDataFolderType, false, &ref); + if (err) + return QString(); + QByteArray ba(2048, 0); + if (FSRefMakePath(&ref, reinterpret_cast(ba.data()), ba.size()) == noErr) + result = QString::fromUtf8(ba).normalized(QString::NormalizationForm_C); + result += QLatin1Char('/') + qApp->applicationName(); +#else + QString xdgCacheHome = QLatin1String(qgetenv("XDG_CACHE_HOME")); + if (xdgCacheHome.isEmpty()) + xdgCacheHome = QDir::homePath() + QLatin1String("/.cache"); + xdgCacheHome += QLatin1Char('/') + QCoreApplication::applicationName(); + result = xdgCacheHome; +#endif +#endif + if (!result.endsWith("/")) + result += "/"; + return result; } -#if !defined Q_OS_WIN && !defined Q_OS_HAIKU -bool Utils::Fs::isNetworkFileSystem(const QString &path) +QString Utils::Fs::QDesktopServicesDownloadLocation() { - QString file = path; - if (!file.endsWith('/')) - file += '/'; - file += '.'; +#ifdef QBT_USES_QT5 +#if defined(Q_OS_WIN) + if (QSysInfo::windowsVersion() <= QSysInfo::WV_XP) // Windows XP + return QDir(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)).absoluteFilePath( + QCoreApplication::translate("fsutils", "Downloads")); +#endif + return QStandardPaths::writableLocation(QStandardPaths::DownloadLocation); +#else - struct statfs buf {}; - if (statfs(file.toLocal8Bit().constData(), &buf) != 0) - return false; +#if defined(Q_OS_OS2) + return QDir(QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation)).absoluteFilePath( + QCoreApplication::translate("fsutils", "Downloads")); +#endif -#if defined(Q_OS_MAC) || defined(Q_OS_OPENBSD) - // XXX: should we make sure HAVE_STRUCT_FSSTAT_F_FSTYPENAME is defined? - return ((strncmp(buf.f_fstypename, "nfs", sizeof(buf.f_fstypename)) == 0) - || (strncmp(buf.f_fstypename, "cifs", sizeof(buf.f_fstypename)) == 0) - || (strncmp(buf.f_fstypename, "smbfs", sizeof(buf.f_fstypename)) == 0)); -#else - // usually defined in /usr/include/linux/magic.h - const unsigned long CIFS_MAGIC_NUMBER = 0xFF534D42; - const unsigned long NFS_SUPER_MAGIC = 0x6969; - const unsigned long SMB_SUPER_MAGIC = 0x517B; - - return ((buf.f_type == CIFS_MAGIC_NUMBER) - || (buf.f_type == NFS_SUPER_MAGIC) - || (buf.f_type == SMB_SUPER_MAGIC)); +#if defined(Q_OS_WIN) + // as long as it stays WinXP like we do the same on OS/2 + // TODO: Use IKnownFolderManager to get path of FOLDERID_Downloads + // instead of hardcoding "Downloads" + // Unfortunately, this would break compatibility with WinXP + if (QSysInfo::windowsVersion() <= QSysInfo::WV_XP) // Windows XP + return QDir(QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation)).absoluteFilePath( + QCoreApplication::translate("fsutils", "Downloads")); + else + return QDir(QDesktopServices::storageLocation(QDesktopServices::HomeLocation)).absoluteFilePath("Downloads"); #endif -} + +#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) + QString save_path; + // Default save path on Linux + QString config_path = QString::fromLocal8Bit(qgetenv("XDG_CONFIG_HOME").constData()); + if (config_path.isEmpty()) + config_path = QDir::home().absoluteFilePath(".config"); + + QString user_dirs_file = config_path + "/user-dirs.dirs"; + if (QFile::exists(user_dirs_file)) { + QSettings settings(user_dirs_file, QSettings::IniFormat); + // We need to force UTF-8 encoding here since this is not + // the default for Ini files. + settings.setIniCodec("UTF-8"); + QString xdg_download_dir = settings.value("XDG_DOWNLOAD_DIR").toString(); + if (!xdg_download_dir.isEmpty()) { + // Resolve $HOME environment variables + xdg_download_dir.replace("$HOME", QDir::homePath()); + save_path = xdg_download_dir; + qDebug() << Q_FUNC_INFO << "SUCCESS: Using XDG path for downloads: " << save_path; + } + } + + // Fallback + if (!save_path.isEmpty() && !QFile::exists(save_path)) { + QDir().mkpath(save_path); + } + + if (save_path.isEmpty() || !QFile::exists(save_path)) { + save_path = QDir::home().absoluteFilePath(QCoreApplication::translate("fsutils", "Downloads")); + qDebug() << Q_FUNC_INFO << "using" << save_path << "as fallback since the XDG detection did not work"; + } + + return save_path; +#endif + +#if defined(Q_OS_MAC) + // TODO: How to support this on Mac OS? +#endif + + // Fallback + return QDir::home().absoluteFilePath(QCoreApplication::translate("fsutils", "Downloads")); #endif +} + +QString Utils::Fs::cacheLocation() +{ + QString location = expandPathAbs(QDesktopServicesCacheLocation()); + QDir locationDir(location); + if (!locationDir.exists()) + locationDir.mkpath(locationDir.absolutePath()); + return location; +} + +QString Utils::Fs::tempPath() +{ + static const QString path = QDir::tempPath() + "/.qBittorrent/"; + QDir().mkdir(path); + return path; +} diff -Nru qbittorrent-4.1.3/src/base/utils/fs.h qbittorrent-3.3.15/src/base/utils/fs.h --- qbittorrent-4.1.3/src/base/utils/fs.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/utils/fs.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2012 Christophe Dumez + * Copyright (C) 2012 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef UTILS_FS_H @@ -39,32 +41,33 @@ { namespace Fs { - QString toNativePath(const QString &path); - QString fromNativePath(const QString &path); - QString fileExtension(const QString &filename); - QString fileName(const QString &filePath); - QString folderName(const QString &filePath); - qint64 computePathSize(const QString &path); - bool sameFiles(const QString &path1, const QString &path2); - QString toValidFileSystemName(const QString &name, bool allowSeparators = false - , const QString &pad = QLatin1String(" ")); - bool isValidFileSystemName(const QString &name, bool allowSeparators = false); - qint64 freeDiskSpaceOnPath(const QString &path); - QString branchPath(const QString &filePath, QString *removed = nullptr); - bool sameFileNames(const QString &first, const QString &second); - QString expandPath(const QString &path); - QString expandPathAbs(const QString &path); - bool isRegularFile(const QString &path); - - bool smartRemoveEmptyFolderTree(const QString &path); - bool forceRemove(const QString &filePath); - void removeDirRecursive(const QString &path); + QString toNativePath(const QString& path); + QString fromNativePath(const QString& path); + QString fileExtension(const QString& filename); + QString fileName(const QString& file_path); + QString folderName(const QString& file_path); + qint64 computePathSize(const QString& path); + bool sameFiles(const QString& path1, const QString& path2); + QString toValidFileSystemName(const QString &name, bool allowSeparators = false); + bool isValidFileSystemName(const QString& name, bool allowSeparators = false); + qulonglong freeDiskSpaceOnPath(const QString &path); + QString branchPath(const QString& file_path, QString* removed = 0); + bool sameFileNames(const QString& first, const QString& second); + QString expandPath(const QString& path); + QString expandPathAbs(const QString& path); + + bool smartRemoveEmptyFolderTree(const QString& path); + bool forceRemove(const QString& file_path); + void removeDirRecursive(const QString& path); + + /* Ported from Qt4 to drop dependency on QtGui */ + QString QDesktopServicesDataLocation(); + QString QDesktopServicesCacheLocation(); + QString QDesktopServicesDownloadLocation(); + /* End of Qt4 code */ + QString cacheLocation(); QString tempPath(); - -#if !defined Q_OS_WIN && !defined Q_OS_HAIKU - bool isNetworkFileSystem(const QString &path); -#endif } } diff -Nru qbittorrent-4.1.3/src/base/utils/misc.cpp qbittorrent-3.3.15/src/base/utils/misc.cpp --- qbittorrent-4.1.3/src/base/utils/misc.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/utils/misc.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,19 +24,39 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#include "misc.h" - +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include +#ifdef DISABLE_GUI +#include +#else +#include +#include +#include +#endif + #ifdef Q_OS_WIN #include +#include #include +const int UNLEN = 256; #else -#include #include +#include #endif #ifdef Q_OS_MAC @@ -44,47 +64,33 @@ #include #endif -#include -#include -#include -#include -#include -#include -#include - -#ifdef DISABLE_GUI -#include -#else -#include -#include -#include -#include +#ifndef DISABLE_GUI #if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) && defined(QT_DBUS_LIB) #include #include #endif -#if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) -#include "base/utils/version.h" -#endif +#endif // DISABLE_GUI + +#ifndef DISABLE_GUI +#include +#include #endif -#include "base/logger.h" -#include "base/unicodestrings.h" #include "base/utils/string.h" +#include "base/unicodestrings.h" +#include "base/logger.h" +#include "misc.h" #include "fs.h" -namespace -{ - const struct { const char *source; const char *comment; } units[] = { - QT_TRANSLATE_NOOP3("misc", "B", "bytes"), - QT_TRANSLATE_NOOP3("misc", "KiB", "kibibytes (1024 bytes)"), - QT_TRANSLATE_NOOP3("misc", "MiB", "mebibytes (1024 kibibytes)"), - QT_TRANSLATE_NOOP3("misc", "GiB", "gibibytes (1024 mibibytes)"), - QT_TRANSLATE_NOOP3("misc", "TiB", "tebibytes (1024 gibibytes)"), - QT_TRANSLATE_NOOP3("misc", "PiB", "pebibytes (1024 tebibytes)"), - QT_TRANSLATE_NOOP3("misc", "EiB", "exbibytes (1024 pebibytes)") - }; -} +static struct { const char *source; const char *comment; } units[] = { + QT_TRANSLATE_NOOP3("misc", "B", "bytes"), + QT_TRANSLATE_NOOP3("misc", "KiB", "kibibytes (1024 bytes)"), + QT_TRANSLATE_NOOP3("misc", "MiB", "mebibytes (1024 kibibytes)"), + QT_TRANSLATE_NOOP3("misc", "GiB", "gibibytes (1024 mibibytes)"), + QT_TRANSLATE_NOOP3("misc", "TiB", "tebibytes (1024 gibibytes)"), + QT_TRANSLATE_NOOP3("misc", "PiB", "pebibytes (1024 tebibytes)"), + QT_TRANSLATE_NOOP3("misc", "EiB", "exbibytes (1024 pebibytes)") +}; void Utils::Misc::shutdownComputer(const ShutdownDialogAction &action) { @@ -110,23 +116,12 @@ if (GetLastError() != ERROR_SUCCESS) return; - using PSETSUSPENDSTATE = BOOLEAN (WINAPI *)(BOOLEAN, BOOLEAN, BOOLEAN); - const auto setSuspendState = Utils::Misc::loadWinAPI("PowrProf.dll", "SetSuspendState"); - - if (action == ShutdownDialogAction::Suspend) { - if (setSuspendState) - setSuspendState(false, false, false); - } - else if (action == ShutdownDialogAction::Hibernate) { - if (setSuspendState) - setSuspendState(true, false, false); - } - else { - const QString msg = QCoreApplication::translate("misc", "qBittorrent will shutdown the computer now because all downloads are complete."); - std::unique_ptr msgWchar(new wchar_t[msg.length() + 1] {}); - msg.toWCharArray(msgWchar.get()); - ::InitiateSystemShutdownW(nullptr, msgWchar.get(), 10, true, false); - } + if (action == ShutdownDialogAction::Suspend) + SetSuspendState(false, false, false); + else if (action == ShutdownDialogAction::Hibernate) + SetSuspendState(true, false, false); + else + InitiateSystemShutdownA(0, QCoreApplication::translate("misc", "qBittorrent will shutdown the computer now because all downloads are complete.").toLocal8Bit().data(), 10, true, false); // Disable shutdown privilege. tkp.Privileges[0].Attributes = 0; @@ -139,7 +134,7 @@ else EventToSend = kAEShutDown; AEAddressDesc targetDesc; - const ProcessSerialNumber kPSNOfSystemProcess = {0, kSystemProcess}; + static const ProcessSerialNumber kPSNOfSystemProcess = { 0, kSystemProcess }; AppleEvent eventReply = {typeNull, NULL}; AppleEvent appleEventToSend = {typeNull, NULL}; @@ -225,17 +220,121 @@ } #ifndef DISABLE_GUI -QPoint Utils::Misc::screenCenter(const QWidget *w) +// Get screen center +QPoint Utils::Misc::screenCenter(QWidget *win) { - // Returns the QPoint which the widget will be placed center on screen (where parent resides) + int scrn = 0; + const QWidget *w = win->window(); - QWidget *parent = w->parentWidget(); - QDesktopWidget *desktop = QApplication::desktop(); - int scrn = desktop->screenNumber(parent); // fallback to `primaryScreen` when parent is invalid - QRect r = desktop->availableGeometry(scrn); - return QPoint(r.x() + (r.width() - w->frameSize().width()) / 2, r.y() + (r.height() - w->frameSize().height()) / 2); + if (w) + scrn = QApplication::desktop()->screenNumber(w); + else if (QApplication::desktop()->isVirtualDesktop()) + scrn = QApplication::desktop()->screenNumber(QCursor::pos()); + else + scrn = QApplication::desktop()->screenNumber(win); + + QRect desk(QApplication::desktop()->availableGeometry(scrn)); + return QPoint((desk.width() - win->frameGeometry().width()) / 2, (desk.height() - win->frameGeometry().height()) / 2); +} + +#endif + +/** + * Detects the python version. + */ +int Utils::Misc::pythonVersion() +{ + static int version = -1; + if (version < 0) { + QString versionComplete = pythonVersionComplete().trimmed(); + QStringList splitted = versionComplete.split('.'); + if (splitted.size() > 1) { + int highVer = splitted.at(0).toInt(); + if ((highVer == 2) || (highVer == 3)) + version = highVer; + } + } + return version; } + +/** + * Detects the python executable by calling "python --version". + */ +QString Utils::Misc::pythonExecutable() +{ + static QString executable; + if (executable.isEmpty()) { + QProcess pythonProc; +#if defined(Q_OS_UNIX) + /* + * On Unix-Like Systems python2 and python3 should always exist + * http://legacy.python.org/dev/peps/pep-0394/ + */ + pythonProc.start("python3", QStringList() << "--version", QIODevice::ReadOnly); + if (pythonProc.waitForFinished() && (pythonProc.exitCode() == 0)) { + executable = "python3"; + return executable; + } + pythonProc.start("python2", QStringList() << "--version", QIODevice::ReadOnly); + if (pythonProc.waitForFinished() && (pythonProc.exitCode() == 0)) { + executable = "python2"; + return executable; + } #endif + // Look for "python" in Windows and in UNIX if "python2" and "python3" are + // not detected. + pythonProc.start("python", QStringList() << "--version", QIODevice::ReadOnly); + if (pythonProc.waitForFinished() && (pythonProc.exitCode() == 0)) + executable = "python"; + else + Logger::instance()->addMessage(QCoreApplication::translate("misc", "Python not detected"), Log::INFO); + } + return executable; +} + +/** + * Returns the complete python version + * eg 2.7.9 + * Make sure to have setup python first + */ +QString Utils::Misc::pythonVersionComplete() +{ + static QString version; + if (version.isEmpty()) { + if (pythonExecutable().isEmpty()) + return version; + QProcess pythonProc; + pythonProc.start(pythonExecutable(), QStringList() << "--version", QIODevice::ReadOnly); + if (pythonProc.waitForFinished() && (pythonProc.exitCode() == 0)) { + QByteArray output = pythonProc.readAllStandardOutput(); + if (output.isEmpty()) + output = pythonProc.readAllStandardError(); + + // Software 'Anaconda' installs its own python interpreter + // and `python --version` returns a string like this: + // `Python 3.4.3 :: Anaconda 2.3.0 (64-bit)` + const QList outSplit = output.split(' '); + if (outSplit.size() > 1) { + version = outSplit.at(1).trimmed(); + Logger::instance()->addMessage(QCoreApplication::translate("misc", "Python version: %1").arg(version), Log::INFO); + } + + // If python doesn't report a 3-piece version e.g. 3.6.1 + // then fill the missing pieces with zero + const QStringList verSplit = version.split('.', QString::SkipEmptyParts); + if (verSplit.size() < 3) { + for (int i = verSplit.size(); i < 3; ++i) { + if (version.endsWith('.')) + version.append('0'); + else + version.append(".0"); + } + Logger::instance()->addMessage(QCoreApplication::translate("misc", "Normalized Python version: %1").arg(version), Log::INFO); + } + } + } + return version; +} QString Utils::Misc::unitString(Utils::Misc::SizeUnit unit) { @@ -297,50 +396,55 @@ bool Utils::Misc::isPreviewable(const QString &extension) { - static const QSet multimediaExtensions = { - "3GP", - "AAC", - "AC3", - "AIF", - "AIFC", - "AIFF", - "ASF", - "AU", - "AVI", - "FLAC", - "FLV", - "M3U", - "M4A", - "M4P", - "M4V", - "MID", - "MKV", - "MOV", - "MP2", - "MP3", - "MP4", - "MPC", - "MPE", - "MPEG", - "MPG", - "MPP", - "OGG", - "OGM", - "OGV", - "QT", - "RA", - "RAM", - "RM", - "RMV", - "RMVB", - "SWA", - "SWF", - "VOB", - "WAV", - "WMA", - "WMV" - }; - return multimediaExtensions.contains(extension.toUpper()); + static QSet multimedia_extensions; + if (multimedia_extensions.empty()) { + multimedia_extensions.insert("3GP"); + multimedia_extensions.insert("AAC"); + multimedia_extensions.insert("AC3"); + multimedia_extensions.insert("AIF"); + multimedia_extensions.insert("AIFC"); + multimedia_extensions.insert("AIFF"); + multimedia_extensions.insert("ASF"); + multimedia_extensions.insert("AU"); + multimedia_extensions.insert("AVI"); + multimedia_extensions.insert("FLAC"); + multimedia_extensions.insert("FLV"); + multimedia_extensions.insert("M3U"); + multimedia_extensions.insert("M4A"); + multimedia_extensions.insert("M4P"); + multimedia_extensions.insert("M4V"); + multimedia_extensions.insert("MID"); + multimedia_extensions.insert("MKV"); + multimedia_extensions.insert("MOV"); + multimedia_extensions.insert("MP2"); + multimedia_extensions.insert("MP3"); + multimedia_extensions.insert("MP4"); + multimedia_extensions.insert("MPC"); + multimedia_extensions.insert("MPE"); + multimedia_extensions.insert("MPEG"); + multimedia_extensions.insert("MPG"); + multimedia_extensions.insert("MPP"); + multimedia_extensions.insert("OGG"); + multimedia_extensions.insert("OGM"); + multimedia_extensions.insert("OGV"); + multimedia_extensions.insert("QT"); + multimedia_extensions.insert("RA"); + multimedia_extensions.insert("RAM"); + multimedia_extensions.insert("RM"); + multimedia_extensions.insert("RMV"); + multimedia_extensions.insert("RMVB"); + multimedia_extensions.insert("SWA"); + multimedia_extensions.insert("SWF"); + multimedia_extensions.insert("VOB"); + multimedia_extensions.insert("WAV"); + multimedia_extensions.insert("WMA"); + multimedia_extensions.insert("WMV"); + } + + if (extension.isEmpty()) + return false; + + return multimedia_extensions.contains(extension.toUpper()); } // Take a number of seconds and return an user-friendly @@ -363,12 +467,12 @@ qlonglong hours = minutes / 60; minutes -= hours * 60; if (hours < 24) - return QCoreApplication::translate("misc", "%1h %2m", "e.g: 3hours 5minutes").arg(QString::number(hours), QString::number(minutes)); + return QCoreApplication::translate("misc", "%1h %2m", "e.g: 3hours 5minutes").arg(QString::number(hours)).arg(QString::number(minutes)); qlonglong days = hours / 24; hours -= days * 24; if (days < 100) - return QCoreApplication::translate("misc", "%1d %2h", "e.g: 2days 10hours").arg(QString::number(days), QString::number(hours)); + return QCoreApplication::translate("misc", "%1d %2h", "e.g: 2days 10hours").arg(QString::number(days)).arg(QString::number(hours)); return QString::fromUtf8(C_INFINITY); } @@ -377,7 +481,6 @@ { QString uid = "0"; #ifdef Q_OS_WIN - const int UNLEN = 256; WCHAR buffer[UNLEN + 1] = {0}; DWORD buffer_len = sizeof(buffer) / sizeof(*buffer); if (GetUserNameW(buffer, &buffer_len)) @@ -414,16 +517,15 @@ bool Utils::Misc::isUrl(const QString &s) { - static const QRegularExpression reURLScheme( - "http[s]?|ftp", QRegularExpression::CaseInsensitiveOption); - - return reURLScheme.match(QUrl(s).scheme()).hasMatch(); + const QString scheme = QUrl(s).scheme(); + QRegExp is_url("http[s]?|ftp", Qt::CaseInsensitive); + return is_url.exactMatch(scheme); } -QString Utils::Misc::parseHtmlLinks(const QString &rawText) +QString Utils::Misc::parseHtmlLinks(const QString &raw_text) { - QString result = rawText; - static const QRegularExpression reURL( + QString result = raw_text; + static QRegExp reURL( "(\\s|^)" // start with whitespace or beginning of line "(" "(" // case 1 -- URL with scheme @@ -470,11 +572,12 @@ ")" ); + // Capture links result.replace(reURL, "\\1\\2"); // Capture links without scheme - static const QRegularExpression reNoScheme(""); + static QRegExp reNoScheme(""); result.replace(reNoScheme, ""); // to preserve plain text formatting @@ -500,8 +603,8 @@ { const QString path = Utils::Fs::fromNativePath(absolutePath); // If the item to select doesn't exist, try to open its parent - if (!QFileInfo::exists(path)) { - openPath(path.left(path.lastIndexOf('/'))); + if (!QFileInfo(path).exists()) { + openPath(path.left(path.lastIndexOf("/"))); return; } #ifdef Q_OS_WIN @@ -515,48 +618,68 @@ ::CoUninitialize(); #elif defined(Q_OS_UNIX) && !defined(Q_OS_MAC) QProcess proc; - proc.start("xdg-mime", {"query", "default", "inode/directory"}); + proc.start("xdg-mime", QStringList() << "query" << "default" << "inode/directory"); proc.waitForFinished(); QString output = proc.readLine().simplified(); - if ((output == "dolphin.desktop") || (output == "org.kde.dolphin.desktop")) { - proc.startDetached("dolphin", {"--select", Utils::Fs::toNativePath(path)}); - } + if ((output == "dolphin.desktop") || (output == "org.kde.dolphin.desktop")) + proc.startDetached("dolphin", QStringList() << "--select" << Utils::Fs::toNativePath(path)); else if ((output == "nautilus.desktop") || (output == "org.gnome.Nautilus.desktop") - || (output == "nautilus-folder-handler.desktop")) { - proc.start("nautilus", {"--version"}); - proc.waitForFinished(); - const QString nautilusVerStr = QString(proc.readLine()).remove(QRegularExpression("[^0-9.]")); - using NautilusVersion = Utils::Version; - if (NautilusVersion::tryParse(nautilusVerStr, {1, 0, 0}) > NautilusVersion {3, 28}) - proc.startDetached("nautilus", {Utils::Fs::toNativePath(path)}); - else - proc.startDetached("nautilus", {"--no-desktop", Utils::Fs::toNativePath(path)}); - } - else if (output == "nemo.desktop") { - proc.startDetached("nemo", {"--no-desktop", Utils::Fs::toNativePath(path)}); - } - else if ((output == "konqueror.desktop") || (output == "kfmclient_dir.desktop")) { - proc.startDetached("konqueror", {"--select", Utils::Fs::toNativePath(path)}); - } - else { + || (output == "nautilus-folder-handler.desktop")) + proc.startDetached("nautilus", QStringList() << "--no-desktop" << Utils::Fs::toNativePath(path)); + else if (output == "nemo.desktop") + proc.startDetached("nemo", QStringList() << "--no-desktop" << Utils::Fs::toNativePath(path)); + else if ((output == "konqueror.desktop") || (output == "kfmclient_dir.desktop")) + proc.startDetached("konqueror", QStringList() << "--select" << Utils::Fs::toNativePath(path)); + else // "caja" manager can't pinpoint the file, see: https://github.com/qbittorrent/qBittorrent/issues/5003 - openPath(path.left(path.lastIndexOf('/'))); - } + openPath(path.left(path.lastIndexOf("/"))); #else - openPath(path.left(path.lastIndexOf('/'))); + openPath(path.left(path.lastIndexOf("/"))); #endif } #endif // DISABLE_GUI +namespace +{ + // Trick to get a portable sleep() function + class SleeperThread: public QThread + { + public: + static void msleep(unsigned long msecs) + { + QThread::msleep(msecs); + } + }; +} + +void Utils::Misc::msleep(unsigned long msecs) +{ + SleeperThread::msleep(msecs); +} + +#ifndef DISABLE_GUI +QSize Utils::Misc::smallIconSize() +{ + // Get DPI scaled icon size (device-dependent), see QT source + int s = QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize); + return QSize(s, s); +} + +#endif + QString Utils::Misc::osName() { // static initialization for usage in signal handler static const QString name = +#if (QT_VERSION >= QT_VERSION_CHECK(5, 4, 0)) QString("%1 %2 %3") - .arg(QSysInfo::prettyProductName() - , QSysInfo::kernelVersion() - , QSysInfo::currentCpuArchitecture()); + .arg(QSysInfo::prettyProductName()) + .arg(QSysInfo::kernelVersion()) + .arg(QSysInfo::currentCpuArchitecture()); +#else + ""; +#endif return name; } diff -Nru qbittorrent-4.1.3/src/base/utils/misc.h qbittorrent-3.3.15/src/base/utils/misc.h --- qbittorrent-4.1.3/src/base/utils/misc.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/utils/misc.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,28 +24,22 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef UTILS_MISC_H #define UTILS_MISC_H -#include #include - -#include - -#ifdef Q_OS_WIN -#include -#include -#endif - -#include -#include -#include #include #include +#include +#include +#include +#include #include - +#include #include "base/types.h" /* Miscellaneous functions that can be useful */ @@ -70,27 +64,36 @@ // YobiByte, // 1024^8 }; - QString parseHtmlLinks(const QString &rawText); + QString parseHtmlLinks(const QString &raw_text); bool isUrl(const QString &s); void shutdownComputer(const ShutdownDialogAction &action); +#ifndef DISABLE_GUI + // Get screen center + QPoint screenCenter(QWidget *win); + QSize smallIconSize(); +#endif QString osName(); QString boostVersionString(); QString libtorrentVersionString(); + int pythonVersion(); + QString pythonExecutable(); + QString pythonVersionComplete(); + QString unitString(SizeUnit unit); - // return the best user friendly storage unit (B, KiB, MiB, GiB, TiB) + // return best user friendly storage unit (B, KiB, MiB, GiB, TiB) // value must be given in bytes - bool friendlyUnit(qint64 sizeInBytes, qreal &val, SizeUnit &unit); + bool friendlyUnit(qint64 sizeInBytes, qreal& val, SizeUnit& unit); QString friendlyUnit(qint64 bytesValue, bool isSpeed = false); int friendlyUnitPrecision(SizeUnit unit); qint64 sizeInBytes(qreal size, SizeUnit unit); - bool isPreviewable(const QString &extension); + bool isPreviewable(const QString& extension); - // Take a number of seconds and return a user-friendly + // Take a number of seconds and return an user-friendly // time duration like "1d 2h 10m". QString userFriendlyDuration(qlonglong seconds); QString getUserIDString(); @@ -100,33 +103,17 @@ QList intListfromStringList(const QStringList &l); QList boolListfromStringList(const QStringList &l); -#ifndef DISABLE_GUI - void openPath(const QString &absolutePath); - void openFolderSelect(const QString &absolutePath); + void msleep(unsigned long msecs); - QPoint screenCenter(const QWidget *w); +#ifndef DISABLE_GUI + void openPath(const QString& absolutePath); + void openFolderSelect(const QString& absolutePath); #endif #ifdef Q_OS_WIN QString windowsSystemPath(); - - template - T loadWinAPI(const QString &source, const char *funcName) - { - QString path = windowsSystemPath(); - if (!path.endsWith('\\')) - path += '\\'; - - path += source; - - std::unique_ptr pathWchar(new wchar_t[path.length() + 1] {}); - path.toWCharArray(pathWchar.get()); - - return reinterpret_cast( - ::GetProcAddress(::LoadLibraryW(pathWchar.get()), funcName)); - } #endif } } -#endif // UTILS_MISC_H +#endif diff -Nru qbittorrent-4.1.3/src/base/utils/net.cpp qbittorrent-3.3.15/src/base/utils/net.cpp --- qbittorrent-4.1.3/src/base/utils/net.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/utils/net.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,93 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2016 Alexandr Milovantsev - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "net.h" - -#include -#include - -namespace Utils -{ - namespace Net - { - bool isValidIP(const QString &ip) - { - return !QHostAddress(ip).isNull(); - } - - Subnet parseSubnet(const QString &subnetStr, bool *ok) - { - const Subnet invalid = qMakePair(QHostAddress(), -1); - const Subnet subnet = QHostAddress::parseSubnet(subnetStr); - if (ok) - *ok = (subnet != invalid); - return subnet; - } - - bool canParseSubnet(const QString &subnetStr) - { - bool ok = false; - parseSubnet(subnetStr, &ok); - return ok; - } - - bool isLoopbackAddress(const QHostAddress &addr) - { - return (addr == QHostAddress::LocalHost) - || (addr == QHostAddress::LocalHostIPv6) - || (addr == QHostAddress(QLatin1String("::ffff:127.0.0.1"))); - } - - bool isIPInRange(const QHostAddress &addr, const QList &subnets) - { - QHostAddress protocolEquivalentAddress; - bool addrConversionOk = false; - - if (addr.protocol() == QAbstractSocket::IPv4Protocol) { - // always succeeds - protocolEquivalentAddress = QHostAddress(addr.toIPv6Address()); - addrConversionOk = true; - } - else { - // only succeeds when addr is an ipv4-mapped ipv6 address - protocolEquivalentAddress = QHostAddress(addr.toIPv4Address(&addrConversionOk)); - } - - for (const Subnet &subnet : subnets) - if (addr.isInSubnet(subnet) || (addrConversionOk && protocolEquivalentAddress.isInSubnet(subnet))) - return true; - - return false; - } - - QString subnetToString(const Subnet &subnet) - { - return subnet.first.toString() + '/' + QString::number(subnet.second); - } - } -} diff -Nru qbittorrent-4.1.3/src/base/utils/net.h qbittorrent-3.3.15/src/base/utils/net.h --- qbittorrent-4.1.3/src/base/utils/net.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/utils/net.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2016 Alexandr Milovantsev - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef BASE_UTILS_NET_H -#define BASE_UTILS_NET_H - -#include -#include - -class QHostAddress; -class QString; - -namespace Utils -{ - namespace Net - { - using Subnet = QPair; - - bool isValidIP(const QString &ip); - Subnet parseSubnet(const QString &subnetStr, bool *ok = nullptr); - bool canParseSubnet(const QString &subnetStr); - bool isLoopbackAddress(const QHostAddress &addr); - bool isIPInRange(const QHostAddress &addr, const QList &subnets); - QString subnetToString(const Subnet &subnet); - } -} - -#endif // BASE_UTILS_NET_H diff -Nru qbittorrent-4.1.3/src/base/utils/random.cpp qbittorrent-3.3.15/src/base/utils/random.cpp --- qbittorrent-4.1.3/src/base/utils/random.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/utils/random.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -24,117 +24,52 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * */ #include "random.h" -#include +#include +#include #include #include -#ifdef Q_OS_WIN -#ifndef NOMINMAX -#define NOMINMAX -#endif -#include -#include -#else // Q_OS_WIN -#include +#ifdef Q_OS_MAC +#include #endif -#include "misc.h" +// on some platform `std::random_device` may generate the same number sequence +static bool hasTrueRandomDevice{ std::random_device{}() != std::random_device{}() }; -namespace +uint32_t Utils::Random::rand(const uint32_t min, const uint32_t max) { -#ifdef Q_OS_WIN - class RandomLayer - { - // need to satisfy UniformRandomBitGenerator requirements - public: - using result_type = uint32_t; - - RandomLayer() - : m_rtlGenRandom {Utils::Misc::loadWinAPI("Advapi32.dll", "SystemFunction036")} - { - if (!m_rtlGenRandom) - qFatal("Failed to load RtlGenRandom()"); - } - - static constexpr result_type min() - { - return std::numeric_limits::min(); - } - - static constexpr result_type max() - { - return std::numeric_limits::max(); - } - - result_type operator()() - { - result_type buf = 0; - const bool result = m_rtlGenRandom(&buf, sizeof(buf)); - if (!result) - qFatal("RtlGenRandom() failed"); - - return buf; - } - - private: - using PRTLGENRANDOM = BOOLEAN (WINAPI *)(PVOID, ULONG); - const PRTLGENRANDOM m_rtlGenRandom; - }; -#else // Q_OS_WIN - class RandomLayer - { - // need to satisfy UniformRandomBitGenerator requirements - public: - using result_type = uint32_t; - - RandomLayer() - : m_randDev {fopen("/dev/urandom", "rb")} - { - if (!m_randDev) - qFatal("Failed to open /dev/urandom"); - } - - ~RandomLayer() - { - fclose(m_randDev); - } - - static constexpr result_type min() - { - return std::numeric_limits::min(); - } - - static constexpr result_type max() - { - return std::numeric_limits::max(); - } - - result_type operator()() const - { - result_type buf = 0; - if (fread(&buf, sizeof(buf), 1, m_randDev) != 1) - qFatal("Read /dev/urandom error"); - - return buf; - } - - private: - FILE *m_randDev; +#ifdef Q_OS_MAC // workaround for Apple xcode: https://stackoverflow.com/a/29929949 + static QThreadStorage generator; + if (!generator.hasLocalData()) + generator.localData().seed( + hasTrueRandomDevice + ? std::random_device{}() + : (std::random_device::result_type) std::chrono::system_clock::now().time_since_epoch().count() + ); +#else + static thread_local std::mt19937 generator{ + hasTrueRandomDevice + ? std::random_device{}() + : (std::random_device::result_type) std::chrono::system_clock::now().time_since_epoch().count() }; #endif -} -uint32_t Utils::Random::rand(const uint32_t min, const uint32_t max) -{ - static RandomLayer layer; + // better replacement for `std::rand`, don't use this for real cryptography application + // min <= returned_value <= max + assert(min <= max); - // new distribution is cheap: https://stackoverflow.com/a/19036349 + // new distribution is cheap: http://stackoverflow.com/a/19036349 std::uniform_int_distribution uniform(min, max); - return uniform(layer); +#ifdef Q_OS_MAC + return uniform(generator.localData()); +#else + return uniform(generator); +#endif } diff -Nru qbittorrent-4.1.3/src/base/utils/random.h qbittorrent-3.3.15/src/base/utils/random.h --- qbittorrent-4.1.3/src/base/utils/random.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/utils/random.h 2017-08-03 20:30:10.000000000 +0000 @@ -24,18 +24,20 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * */ #ifndef UTILS_RANDOM_H #define UTILS_RANDOM_H #include +#include namespace Utils { namespace Random { - uint32_t rand(const uint32_t min = 0, const uint32_t max = UINT32_MAX); + uint32_t rand(uint32_t min = 0, uint32_t max = UINT32_MAX); } } diff -Nru qbittorrent-4.1.3/src/base/utils/string.cpp qbittorrent-3.3.15/src/base/utils/string.cpp --- qbittorrent-4.1.3/src/base/utils/string.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/utils/string.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -32,125 +32,160 @@ #include #include -#include -#include -#include #include +#include + +#ifdef QBT_USES_QT5 +#include +#endif #ifdef Q_OS_MAC #include #endif -#include "../tristatebool.h" - namespace { class NaturalCompare { public: - explicit NaturalCompare(const Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive) - : m_caseSensitivity(caseSensitivity) + explicit NaturalCompare(const bool caseSensitive = true) + : m_caseSensitive(caseSensitive) { -#ifdef Q_OS_WIN +#ifdef QBT_USES_QT5 +#if defined(Q_OS_WIN) // Without ICU library, QCollator uses the native API on Windows 7+. But that API // sorts older versions of μTorrent differently than the newer ones because the // 'μ' character is encoded differently and the native API can't cope with that. // So default to using our custom natural sorting algorithm instead. // See #5238 and #5240 - // Without ICU library, QCollator doesn't support `setNumericMode(true)` on an OS older than Win7 -#else + // Without ICU library, QCollator doesn't support `setNumericMode(true)` on OS older than Win7 + // if (QSysInfo::windowsVersion() < QSysInfo::WV_WINDOWS7) + return; +#endif m_collator.setNumericMode(true); - m_collator.setCaseSensitivity(caseSensitivity); + m_collator.setCaseSensitivity(caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive); #endif } - int operator()(const QString &left, const QString &right) const + bool operator()(const QString &left, const QString &right) const { -#ifdef Q_OS_WIN - return compare(left, right); +#ifdef QBT_USES_QT5 +#if defined(Q_OS_WIN) + // Without ICU library, QCollator uses the native API on Windows 7+. But that API + // sorts older versions of μTorrent differently than the newer ones because the + // 'μ' character is encoded differently and the native API can't cope with that. + // So default to using our custom natural sorting algorithm instead. + // See #5238 and #5240 + // Without ICU library, QCollator doesn't support `setNumericMode(true)` on OS older than Win7 + // if (QSysInfo::windowsVersion() < QSysInfo::WV_WINDOWS7) + return lessThan(left, right); +#endif + return (m_collator.compare(left, right) < 0); #else - return m_collator.compare(left, right); + return lessThan(left, right); #endif } - private: - int compare(const QString &left, const QString &right) const + bool lessThan(const QString &left, const QString &right) const { - // Return value <0: `left` is smaller than `right` - // Return value >0: `left` is greater than `right` - // Return value =0: both strings are equal - + // Return value `false` indicates `right` should go before `left`, otherwise, after int posL = 0; int posR = 0; while (true) { - if ((posL == left.size()) || (posR == right.size())) - return (left.size() - right.size()); // when a shorter string is another string's prefix, shorter string place before longer string + while (true) { + if ((posL == left.size()) || (posR == right.size())) + return (left.size() < right.size()); // when a shorter string is another string's prefix, shorter string place before longer string + + QChar leftChar = m_caseSensitive ? left[posL] : left[posL].toLower(); + QChar rightChar = m_caseSensitive ? right[posR] : right[posR].toLower(); + if (leftChar == rightChar) + ; // compare next character + else if (leftChar.isDigit() && rightChar.isDigit()) + break; // Both are digits, break this loop and compare numbers + else + return leftChar < rightChar; - const QChar leftChar = (m_caseSensitivity == Qt::CaseSensitive) ? left[posL] : left[posL].toLower(); - const QChar rightChar = (m_caseSensitivity == Qt::CaseSensitive) ? right[posR] : right[posR].toLower(); - // Compare only non-digits. - // Numbers should be compared as a whole - // otherwise the string->int conversion can yield a wrong value - if ((leftChar == rightChar) && !leftChar.isDigit()) { - // compare next character ++posL; ++posR; } - else if (leftChar.isDigit() && rightChar.isDigit()) { - // Both are digits, compare the numbers - const auto consumeNumber = [](const QString &str, int &pos) -> int - { - const int start = pos; - while ((pos < str.size()) && str[pos].isDigit()) - ++pos; - return str.midRef(start, (pos - start)).toInt(); - }; - - const int numL = consumeNumber(left, posL); - const int numR = consumeNumber(right, posR); - if (numL != numR) - return (numL - numR); - // String + digits do match and we haven't hit the end of both strings - // then continue to consume the remainings - } - else { - return (leftChar.unicode() - rightChar.unicode()); - } + int startL = posL; + while ((posL < left.size()) && left[posL].isDigit()) + ++posL; +#ifdef QBT_USES_QT5 + int numL = left.midRef(startL, posL - startL).toInt(); +#else + int numL = left.mid(startL, posL - startL).toInt(); +#endif + + int startR = posR; + while ((posR < right.size()) && right[posR].isDigit()) + ++posR; +#ifdef QBT_USES_QT5 + int numR = right.midRef(startR, posR - startR).toInt(); +#else + int numR = right.mid(startR, posR - startR).toInt(); +#endif + + if (numL != numR) + return (numL < numR); + + // Strings + digits do match and we haven't hit string end + // Do another round } + return false; } + private: +#ifdef QBT_USES_QT5 QCollator m_collator; - const Qt::CaseSensitivity m_caseSensitivity; +#endif + const bool m_caseSensitive; }; } -int Utils::String::naturalCompare(const QString &left, const QString &right, const Qt::CaseSensitivity caseSensitivity) +bool Utils::String::naturalCompareCaseSensitive(const QString &left, const QString &right) { // provide a single `NaturalCompare` instance for easy use // https://doc.qt.io/qt-5/threads-reentrancy.html - if (caseSensitivity == Qt::CaseSensitive) { #ifdef Q_OS_MAC // workaround for Apple xcode: https://stackoverflow.com/a/29929949 - static QThreadStorage nCmp; - if (!nCmp.hasLocalData()) - nCmp.setLocalData(NaturalCompare(Qt::CaseSensitive)); - return (nCmp.localData())(left, right); + static QThreadStorage nCmp; + if (!nCmp.hasLocalData()) nCmp.setLocalData(NaturalCompare(true)); + return (nCmp.localData())(left, right); #else - thread_local NaturalCompare nCmp(Qt::CaseSensitive); - return nCmp(left, right); + thread_local NaturalCompare nCmp(true); + return nCmp(left, right); #endif - } +} -#ifdef Q_OS_MAC +bool Utils::String::naturalCompareCaseInsensitive(const QString &left, const QString &right) +{ + // provide a single `NaturalCompare` instance for easy use + // https://doc.qt.io/qt-5/threads-reentrancy.html +#ifdef Q_OS_MAC // workaround for Apple xcode: https://stackoverflow.com/a/29929949 static QThreadStorage nCmp; - if (!nCmp.hasLocalData()) - nCmp.setLocalData(NaturalCompare(Qt::CaseInsensitive)); + if (!nCmp.hasLocalData()) nCmp.setLocalData(NaturalCompare(false)); return (nCmp.localData())(left, right); #else - thread_local NaturalCompare nCmp(Qt::CaseInsensitive); + thread_local NaturalCompare nCmp(false); return nCmp(left, right); #endif } +QString Utils::String::fromStdString(const std::string &str) +{ + return QString::fromUtf8(str.c_str()); +} + +std::string Utils::String::toStdString(const QString &str) +{ +#ifdef QBT_USES_QT5 + return str.toStdString(); +#else + QByteArray utf8 = str.toUtf8(); + return std::string(utf8.constData(), utf8.length()); +#endif +} + // to send numbers instead of strings with suffixes QString Utils::String::fromDouble(double n, int precision) { @@ -172,33 +207,34 @@ int lengthB = b.length(); int diff = lengthA ^ lengthB; - for (int i = 0; (i < lengthA) && (i < lengthB); ++i) + for (int i = 0; (i < lengthA) && (i < lengthB); i++) diff |= a[i] ^ b[i]; return (diff == 0); } -// This is marked as internal in QRegExp.cpp, but is exported. The alternative would be to -// copy the code from QRegExp::wc2rx(). -QString qt_regexp_toCanonical(const QString &pattern, QRegExp::PatternSyntax patternSyntax); - -QString Utils::String::wildcardToRegex(const QString &pattern) -{ - return qt_regexp_toCanonical(pattern, QRegExp::Wildcard); -} - -bool Utils::String::parseBool(const QString &string, const bool defaultValue) -{ - if (defaultValue) - return (string.compare("false", Qt::CaseInsensitive) == 0) ? false : true; - return (string.compare("true", Qt::CaseInsensitive) == 0) ? true : false; -} - -TriStateBool Utils::String::parseTriStateBool(const QString &string) +QString Utils::String::toHtmlEscaped(const QString &str) { - if (string.compare("true", Qt::CaseInsensitive) == 0) - return TriStateBool::True; - if (string.compare("false", Qt::CaseInsensitive) == 0) - return TriStateBool::False; - return TriStateBool::Undefined; +#ifdef QBT_USES_QT5 + return str.toHtmlEscaped(); +#else + // code from Qt + QString rich; + const int len = str.length(); + rich.reserve(int(len * 1.1)); + for (int i = 0; i < len; ++i) { + if (str.at(i) == QLatin1Char('<')) + rich += QLatin1String("<"); + else if (str.at(i) == QLatin1Char('>')) + rich += QLatin1String(">"); + else if (str.at(i) == QLatin1Char('&')) + rich += QLatin1String("&"); + else if (str.at(i) == QLatin1Char('"')) + rich += QLatin1String("""); + else + rich += str.at(i); + } + rich.squeeze(); + return rich; +#endif } diff -Nru qbittorrent-4.1.3/src/base/utils/string.h qbittorrent-3.3.15/src/base/utils/string.h --- qbittorrent-4.1.3/src/base/utils/string.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/utils/string.h 2017-08-03 20:30:10.000000000 +0000 @@ -34,26 +34,23 @@ class QByteArray; class QLatin1String; -class TriStateBool; namespace Utils { namespace String { + QString fromStdString(const std::string &str); + std::string toStdString(const QString &str); QString fromDouble(double n, int precision); // Implements constant-time comparison to protect against timing attacks // Taken from https://crackstation.net/hashing-security.htm bool slowEquals(const QByteArray &a, const QByteArray &b); - int naturalCompare(const QString &left, const QString &right, const Qt::CaseSensitivity caseSensitivity); - template - bool naturalLessThan(const QString &left, const QString &right) - { - return (naturalCompare(left, right, caseSensitivity) < 0); - } + QString toHtmlEscaped(const QString &str); - QString wildcardToRegex(const QString &pattern); + bool naturalCompareCaseSensitive(const QString &left, const QString &right); + bool naturalCompareCaseInsensitive(const QString &left, const QString &right); template T unquote(const T &str, const QString "es = QLatin1String("\"")) @@ -67,9 +64,6 @@ return str; } - - bool parseBool(const QString &string, const bool defaultValue); - TriStateBool parseTriStateBool(const QString &string); } } diff -Nru qbittorrent-4.1.3/src/base/utils/version.h qbittorrent-3.3.15/src/base/utils/version.h --- qbittorrent-4.1.3/src/base/utils/version.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/base/utils/version.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,211 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2016 Eugene Shalygin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef QBITTORRENT_UTILS_VERSION_H -#define QBITTORRENT_UTILS_VERSION_H - -#include -#include - -#include -#include - -namespace Utils -{ - template - class Version - { - static_assert(N > 0, "The number of version components may not be smaller than 1"); - static_assert(N >= Mandatory, - "The number of mandatory components may not be larger than the total number of components"); - - public: - typedef T ComponentType; - typedef Version ThisType; - - constexpr Version() - : m_components {{}} - { - } - - constexpr Version(const ThisType &other) = default; - - template - constexpr Version(Other ... components) - : m_components {{static_cast(components) ...}} - { - } - - /** - * @brief Creates version from string in format "x.y.z" - * - * @param version Version string in format "x.y.z" - * @throws std::runtime_error if parsing fails - */ - Version(const QString &version) - : Version {version.split(QLatin1Char('.'))} - { - } - - /** - * @brief Creates version from byte array in format "x.y.z" - * - * @param version Version string in format "x.y.z" - * @throws std::runtime_error if parsing fails - */ - Version(const QByteArray &version) - : Version {version.split('.')} - { - } - - constexpr ComponentType majorNumber() const - { - static_assert(N >= 1, "The number of version components is too small"); - return m_components[0]; - } - - constexpr ComponentType minorNumber() const - { - static_assert(N >= 2, "The number of version components is too small"); - return m_components[1]; - } - - constexpr ComponentType revisionNumber() const - { - static_assert(N >= 3, "The number of version components is too small"); - return m_components[2]; - } - - constexpr ComponentType patchNumber() const - { - static_assert(N >= 4, "The number of version components is too small"); - return m_components[3]; - } - - constexpr ComponentType operator[](const std::size_t i) const - { - return m_components.at(i); - } - - operator QString() const - { - // find the last one non-zero component - std::size_t lastSignificantIndex = N - 1; - while ((lastSignificantIndex > 0) && ((*this)[lastSignificantIndex] == 0)) - --lastSignificantIndex; - - if (lastSignificantIndex + 1 < Mandatory) // lastSignificantIndex >= 0 - lastSignificantIndex = Mandatory - 1; // and Mandatory >= 1 - - QString res = QString::number((*this)[0]); - for (std::size_t i = 1; i <= lastSignificantIndex; ++i) - res += QLatin1Char('.') + QString::number((*this)[i]); - return res; - } - - constexpr bool isValid() const - { - return (*this != ThisType {}); - } - - constexpr bool operator==(const ThisType &other) const - { - return (m_components == other.m_components); - } - - constexpr bool operator<(const ThisType &other) const - { - return (m_components < other.m_components); - } - - constexpr bool operator>(const ThisType &other) const - { - return (m_components > other.m_components); - } - - template - static Version tryParse(const StringClassWithSplitMethod &s, const Version &defaultVersion) - { - try { - return Version(s); - } - catch (const std::runtime_error &er) { - qDebug() << "Error parsing version:" << er.what(); - return defaultVersion; - } - } - - private: - using ComponentsArray = std::array; - - template - static ComponentsArray parseList(const StringsList &versionParts) - { - if ((static_cast(versionParts.size()) > N) - || (static_cast(versionParts.size()) < Mandatory)) - throw std::runtime_error ("Incorrect number of version components"); - - bool ok = false; - ComponentsArray res {{}}; - for (std::size_t i = 0; i < static_cast(versionParts.size()); ++i) { - res[i] = static_cast(versionParts[i].toInt(&ok)); - if (!ok) - throw std::runtime_error("Can not parse version component"); - } - return res; - } - - template - Version(const StringsList &versionParts) - : m_components (parseList(versionParts)) // GCC 4.8.4 has problems with the uniform initializer here - { - } - - ComponentsArray m_components; - }; - - template - constexpr bool operator!=(const Version &left, const Version &right) - { - return !(left == right); - } - - template - constexpr bool operator<=(const Version &left, const Version &right) - { - return !(left > right); - } - - template - constexpr bool operator>=(const Version &left, const Version &right) - { - return !(left < right); - } -} - -#endif // QBITTORRENT_UTILS_VERSION_H diff -Nru qbittorrent-4.1.3/src/CMakeLists.txt qbittorrent-3.3.15/src/CMakeLists.txt --- qbittorrent-4.1.3/src/CMakeLists.txt 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/CMakeLists.txt 2017-08-03 20:30:10.000000000 +0000 @@ -1,81 +1,110 @@ set(CMAKE_CXX_STANDARD_REQUIRED True) set(CMAKE_CXX_STANDARD "11") +add_definitions(-DBOOST_NO_CXX11_RVALUE_REFERENCES) include(MacroQbtCompilerSettings) qbt_set_compiler_options() +include(MacroLinkQtComponents) include(QbtTargetSources) -find_package(Boost ${requiredBoostVersion} REQUIRED) find_package(LibtorrentRasterbar REQUIRED) -if (Boost_VERSION VERSION_LESS 106000) - add_definitions(-DBOOST_NO_CXX11_RVALUE_REFERENCES) -endif() - -find_package(Qt5 ${requiredQtVersion} REQUIRED COMPONENTS Core Network Xml) -find_package(Qt5Widgets ${requiredQtVersion}) -if (Qt5Widgets_FOUND) - find_package(Qt5DBus ${requiredQtVersion}) -else() - add_definitions(-DDISABLE_GUI) -endif() - -set_package_properties(Qt5Widgets PROPERTIES - DESCRIPTION "Set of components for creating classic desktop-style UIs for the Qt5 framework" - PURPOSE "Enables qBittorrent GUI. Unneeded for headless configuration." - TYPE OPTIONAL -) - -set_package_properties(Qt5DBus PROPERTIES - DESCRIPTION "Qt5 module for inter-process communication over the D-Bus protocol" - PURPOSE "Enables communication with other system components (e.g. notification service) via D-Bus. " - TYPE RECOMMENDED -) +# Qt +if (QT5) + add_definitions(-DQBT_USES_QT5) + list(APPEND QBT_QT_COMPONENTS Core Network Xml) + if (GUI) + list (APPEND QBT_QT_COMPONENTS Concurrent Gui Widgets) + endif (GUI) + if (DBUS) + list (APPEND QBT_QT_COMPONENTS DBus) + endif (DBUS) + find_package(Qt5 5.2.0 COMPONENTS ${QBT_QT_COMPONENTS} REQUIRED) +else (QT5) + list(APPEND QBT_QT_COMPONENTS QtCore QtNetwork QtXml) + if (GUI) + list (APPEND QBT_QT_COMPONENTS QtGui) + endif (GUI) + if (DBUS) + list (APPEND QBT_QT_COMPONENTS QtDBus) + endif (DBUS) + find_package(Qt4 4.8.0 COMPONENTS ${QBT_QT_COMPONENTS} REQUIRED) + include(${QT_USE_FILE}) + add_definitions(-DQStringLiteral=QLatin1String) +endif (QT5) set(CMAKE_AUTOMOC True) list(APPEND CMAKE_AUTORCC_OPTIONS -compress 9 -threshold 5) -if (APPLE) - # Workaround CMake bug (autogen does not pass required parameters to moc) - # Relevant issue: https://gitlab.kitware.com/cmake/cmake/issues/18041 - list(APPEND CMAKE_AUTOMOC_MOC_OPTIONS -DQ_OS_MAC -DQ_OS_DARWIN) -endif () include_directories(${CMAKE_CURRENT_SOURCE_DIR}) # defines add_definitions(-DQT_NO_CAST_TO_ASCII) -# Efficient construction for QString & QByteArray (Qt >= 4.8) -add_definitions(-DQT_USE_QSTRINGBUILDER) +# Fast concatenation (Qt >= 4.6) +add_definitions(-DQT_USE_FAST_CONCATENATION -DQT_USE_FAST_OPERATOR_PLUS) +if (WIN32) + add_definitions(-DNOMINMAX) +endif (WIN32) + +if (NOT GUI) + add_definitions(-DDISABLE_GUI -DDISABLE_COUNTRIES_RESOLUTION) +endif (NOT GUI) + +if (NOT WEBUI) + add_definitions(-DDISABLE_WEBUI) +endif (NOT WEBUI) + +if (STACKTRACE_WIN) + add_definitions(-DSTACKTRACE_WIN) +endif(STACKTRACE_WIN) +# nogui { +# TARGET = qbittorrent-nox +# } else { +# CONFIG(static) { +# DEFINES += QBT_STATIC_QT +# QTPLUGIN += qico +# } +# TARGET = qbittorrent +# } + +if (UNIX AND NOT APPLE) + add_compile_options(-Wformat -Wformat-security) +endif () -if (CMAKE_BUILD_TYPE MATCHES "Debug") +if (CMAKE_BUILD_TYPE STREQUAL "Debug") message(STATUS "Project is built in DEBUG mode.") -else() +else (CMAKE_BUILD_TYPE STREQUAL "Debug") message(STATUS "Project is built in RELEASE mode.") message(STATUS "Disabling debug output.") add_definitions(-DQT_NO_DEBUG_OUTPUT) -endif() +endif (CMAKE_BUILD_TYPE STREQUAL "Debug") + +set(QBT_USE_GUI ${GUI}) +set(QBT_USE_WEBUI ${WEBUI}) +set(QBT_USES_QT5 ${QT5}) configure_file(config.h.cmakein ${CMAKE_CURRENT_BINARY_DIR}/config.h) -find_package(QtSingleApplication) -set_package_properties(QtSingleApplication PROPERTIES - URL "https://code.qt.io/cgit/qt-solutions/qt-solutions.git/" - DESCRIPTION "Qt library to start applications only once per user" - TYPE RECOMMENDED - PURPOSE "Use the system qtsingleapplication library or shipped one otherwise" -) +if (GUI) + set(QBT_TARGET_NAME qbittorrent) +else (GUI) + set(QBT_TARGET_NAME qbittorrent-nox) +endif (GUI) -if (NOT QtSingleApplication_FOUND) + +if (SYSTEM_QTSINGLEAPPLICATION) + find_package(QtSingleApplication REQUIRED) +else (SYSTEM_QTSINGLEAPPLICATION) add_subdirectory(app/qtsingleapplication) -endif () +endif (SYSTEM_QTSINGLEAPPLICATION) add_subdirectory(app) add_subdirectory(base) -if (Qt5Widgets_FOUND) +if (GUI) add_subdirectory(gui) -endif () +endif (GUI) if (WEBUI) add_subdirectory(webui) diff -Nru qbittorrent-4.1.3/src/config.h.cmakein qbittorrent-3.3.15/src/config.h.cmakein --- qbittorrent-4.1.3/src/config.h.cmakein 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/config.h.cmakein 2017-08-03 20:30:10.000000000 +0000 @@ -1,3 +1,4 @@ +#cmakedefine QBT_USES_QT5 #cmakedefine QBT_USE_GUI #ifndef QBT_USE_GUI diff -Nru qbittorrent-4.1.3/src/gui/aboutdialog.h qbittorrent-3.3.15/src/gui/aboutdialog.h --- qbittorrent-4.1.3/src/gui/aboutdialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/aboutdialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,110 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef ABOUTDIALOG_H -#define ABOUTDIALOG_H - -#include - -#include "base/unicodestrings.h" -#include "base/utils/misc.h" -#include "ui_aboutdialog.h" -#include "utils.h" - -class AboutDialog : public QDialog, private Ui::AboutDialog -{ - Q_OBJECT - -public: - AboutDialog(QWidget *parent) - : QDialog(parent) - { - setupUi(this); - setAttribute(Qt::WA_DeleteOnClose); - - // Title -#if defined(__x86_64__) || defined(_M_X64) - labelName->setText("

qBittorrent " QBT_VERSION " (64-bit)

"); -#else - labelName->setText("

qBittorrent " QBT_VERSION " (32-bit)

"); -#endif - - logo->setPixmap(Utils::Gui::scaledPixmapSvg(":/icons/skin/qbittorrent-tray.svg", this, 32)); - - // About - QString aboutText = QString( - "

" - "%1\n\n" - "%2\n\n" - "" - "" - "" - "" - "
%3https://www.qbittorrent.org
%4http://forum.qbittorrent.org
%5http://bugs.qbittorrent.org
" - "

") - .arg(tr("An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar.") - , tr("Copyright %1 2006-2018 The qBittorrent project").arg(QString::fromUtf8(C_COPYRIGHT)) - , tr("Home Page:") - , tr("Forum:") - , tr("Bug Tracker:")); - labelAbout->setText(aboutText); - - labelMascot->setPixmap(Utils::Gui::scaledPixmap(":/icons/skin/mascot.png", this)); - - // Thanks - QFile thanksfile(":/thanks.html"); - if (thanksfile.open(QIODevice::ReadOnly | QIODevice::Text)) { - textBrowserThanks->setHtml(QString::fromUtf8(thanksfile.readAll().constData())); - thanksfile.close(); - } - - // Translation - QFile translatorsfile(":/translators.html"); - if (translatorsfile.open(QIODevice::ReadOnly | QIODevice::Text)) { - textBrowserTranslation->setHtml(QString::fromUtf8(translatorsfile.readAll().constData())); - translatorsfile.close(); - } - - // License - QFile licensefile(":/gpl.html"); - if (licensefile.open(QIODevice::ReadOnly | QIODevice::Text)) { - textBrowserLicense->setHtml(QString::fromUtf8(licensefile.readAll().constData())); - licensefile.close(); - } - - // Libraries - labelQtVer->setText(QT_VERSION_STR); - labelLibtVer->setText(Utils::Misc::libtorrentVersionString()); - labelBoostVer->setText(Utils::Misc::boostVersionString()); - - Utils::Gui::resize(this); - show(); - } -}; - -#endif // ABOUTDIALOG_H diff -Nru qbittorrent-4.1.3/src/gui/aboutdialog.ui qbittorrent-3.3.15/src/gui/aboutdialog.ui --- qbittorrent-4.1.3/src/gui/aboutdialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/aboutdialog.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,455 +0,0 @@ - - - Christophe Dumez - AboutDialog - - - - 0 - 0 - 545 - 295 - - - - About qBittorrent - - - - - - - - - - - qBittorrent - - - - - - - Qt::Horizontal - - - - 0 - 0 - - - - - - - - - - 0 - - - - About - - - - - - - - - - 0 - 0 - - - - Qt::RichText - - - true - - - true - - - - - - - - Author - - - - - - Current maintainer - - - - - - Greece - - - - - - - <a href="mailto:sledgehammer999@qbittorrent.org">sledgehammer999@qbittorrent.org</a> - - - true - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - Nationality: - - - - - - - E-mail: - - - - - - - Name: - - - - - - - Sledgehammer999 - - - - - - - Qt::Horizontal - - - - 0 - 0 - - - - - - - - - - - Original author - - - - - - France - - - - - - - Christophe Dumez - - - - - - - <a href="mailto:chris@qbittorrent.org">chris@qbittorrent.org</a> - - - true - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - Name: - - - - - - - E-mail: - - - - - - - Nationality: - - - - - - - Qt::Horizontal - - - - 0 - 0 - - - - - - - - - - - Qt::Vertical - - - - 0 - 0 - - - - - - - - - Special Thanks - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - true - - - - - - - - Translators - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QTextEdit::NoWrap - - - - - - - - License - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - true - - - - - - - - Libraries - - - - - - qBittorrent was built with the following libraries: - - - - - - - Qt::Horizontal - - - - - - - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - Qt::Horizontal - - - - 0 - 0 - - - - - - - - Qt: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - Libtorrent: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - Boost: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - - - - - Qt::Horizontal - - - - 0 - 0 - - - - - - - - - - Qt::Horizontal - - - - - - - Qt::Vertical - - - - 0 - 0 - - - - - - - - - - - - - - diff -Nru qbittorrent-4.1.3/src/gui/about_imp.h qbittorrent-3.3.15/src/gui/about_imp.h --- qbittorrent-4.1.3/src/gui/about_imp.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/about_imp.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,104 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef ABOUT_H +#define ABOUT_H + +#include "ui_about.h" +#include +#include "base/utils/misc.h" +#include "base/unicodestrings.h" + +class about: public QDialog, private Ui::AboutDlg +{ + Q_OBJECT + +public: + about(QWidget *parent) : QDialog(parent) + { + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + + // Title +#if defined(__x86_64__) || defined(_M_X64) + lb_name->setText("

qBittorrent " QBT_VERSION " (64-bit)

"); +#else + lb_name->setText("

qBittorrent " QBT_VERSION " (32-bit)

"); +#endif + + // About + QString aboutText = QString( + "

" + "%1\n\n" + "%2\n\n" + "" + "" + "" + "" + "
%3http://www.qbittorrent.org
%4http://forum.qbittorrent.org
%5http://bugs.qbittorrent.org
" + "

") + .arg(tr("An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar.")) + .arg(tr("Copyright %1 2006-2017 The qBittorrent project").arg(QString::fromUtf8(C_COPYRIGHT))) + .arg(tr("Home Page:")) + .arg(tr("Forum:")) + .arg(tr("Bug Tracker:")); + lb_about->setText(aboutText); + + // Thanks + QFile thanksfile(":/thanks.html"); + if (thanksfile.open(QIODevice::ReadOnly | QIODevice::Text)) { + te_thanks->setHtml(QString::fromUtf8(thanksfile.readAll().constData())); + thanksfile.close(); + } + + // Translation + QFile translatorsfile(":/translators.html"); + if (translatorsfile.open(QIODevice::ReadOnly | QIODevice::Text)) { + te_translation->setHtml(QString::fromUtf8(translatorsfile.readAll().constData())); + translatorsfile.close(); + } + + // License + QFile licensefile(":/gpl.html"); + if (licensefile.open(QIODevice::ReadOnly | QIODevice::Text)) { + te_license->setHtml(QString::fromUtf8(licensefile.readAll().constData())); + licensefile.close(); + } + + // Libraries + label_11->setText(QT_VERSION_STR); + label_12->setText(Utils::Misc::libtorrentVersionString()); + label_13->setText(Utils::Misc::boostVersionString()); + + show(); + } +}; + +#endif diff -Nru qbittorrent-4.1.3/src/gui/about.qrc qbittorrent-3.3.15/src/gui/about.qrc --- qbittorrent-4.1.3/src/gui/about.qrc 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/about.qrc 2017-08-03 20:30:10.000000000 +0000 @@ -1,7 +1,7 @@ - - - gpl.html - thanks.html - translators.html - + + + gpl.html + thanks.html + translators.html + diff -Nru qbittorrent-4.1.3/src/gui/about.ui qbittorrent-3.3.15/src/gui/about.ui --- qbittorrent-4.1.3/src/gui/about.ui 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/about.ui 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,461 @@ + + + Christophe Dumez + AboutDlg + + + + 0 + 0 + 545 + 295 + + + + About qBittorrent + + + + + + + + :/icons/skin/qbittorrent32.png + + + + + + + qBittorrent + + + + + + + Qt::Horizontal + + + + 0 + 0 + + + + + + + + + + 0 + + + + About + + + + + + :/icons/skin/mascot.png + + + + + + + + 0 + 0 + + + + Qt::RichText + + + true + + + true + + + + + + + + Author + + + + + + Current maintainer + + + + + + Greece + + + + + + + <a href="mailto:sledgehammer999@qbittorrent.org">sledgehammer999@qbittorrent.org</a> + + + true + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Nationality: + + + + + + + E-mail: + + + + + + + Name: + + + + + + + Sledgehammer999 + + + + + + + Qt::Horizontal + + + + 0 + 0 + + + + + + + + + + + Original author + + + + + + France + + + + + + + Christophe Dumez + + + + + + + <a href="mailto:chris@qbittorrent.org">chris@qbittorrent.org</a> + + + true + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Name: + + + + + + + E-mail: + + + + + + + Nationality: + + + + + + + Qt::Horizontal + + + + 0 + 0 + + + + + + + + + + + Qt::Vertical + + + + 0 + 0 + + + + + + + + + Special Thanks + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + true + + + + + + + + Translators + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QTextEdit::NoWrap + + + + + + + + License + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + Libraries + + + + + + qBittorrent was built with the following libraries: + + + + + + + Qt::Horizontal + + + + + + + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Qt::Horizontal + + + + 0 + 0 + + + + + + + + Qt: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Libtorrent: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Boost: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + Qt::Horizontal + + + + 0 + 0 + + + + + + + + + + Qt::Horizontal + + + + + + + Qt::Vertical + + + + 0 + 0 + + + + + + + + + + + + + + + + diff -Nru qbittorrent-4.1.3/src/gui/addnewtorrentdialog.cpp qbittorrent-3.3.15/src/gui/addnewtorrentdialog.cpp --- qbittorrent-4.1.3/src/gui/addnewtorrentdialog.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/addnewtorrentdialog.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2012 Christophe Dumez + * Copyright (C) 2012 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,54 +24,50 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#include "addnewtorrentdialog.h" - #include -#include -#include -#include #include +#include #include -#include +#include +#include -#include "base/bittorrent/magneturi.h" +#include "base/settingsstorage.h" +#include "base/net/downloadmanager.h" +#include "base/net/downloadhandler.h" #include "base/bittorrent/session.h" -#include "base/bittorrent/torrenthandle.h" +#include "base/bittorrent/magneturi.h" #include "base/bittorrent/torrentinfo.h" -#include "base/global.h" -#include "base/net/downloadhandler.h" -#include "base/net/downloadmanager.h" -#include "base/preferences.h" -#include "base/settingsstorage.h" -#include "base/torrentfileguard.h" -#include "base/unicodestrings.h" +#include "base/bittorrent/torrenthandle.h" #include "base/utils/fs.h" #include "base/utils/misc.h" #include "base/utils/string.h" -#include "autoexpandabledialog.h" +#include "base/torrentfileguard.h" +#include "base/unicodestrings.h" #include "guiiconprovider.h" +#include "autoexpandabledialog.h" +#include "messageboxraised.h" #include "proplistdelegate.h" -#include "raisedmessagebox.h" -#include "torrentcontentfiltermodel.h" #include "torrentcontentmodel.h" +#include "torrentcontentfiltermodel.h" #include "ui_addnewtorrentdialog.h" -#include "utils.h" +#include "addnewtorrentdialog.h" + +#define SETTINGS_KEY(name) "AddNewTorrentDialog/" name +const QString KEY_ENABLED = SETTINGS_KEY("Enabled"); +const QString KEY_DEFAULTCATEGORY = SETTINGS_KEY("DefaultCategory"); +const QString KEY_TREEHEADERSTATE = SETTINGS_KEY("TreeHeaderState"); +const QString KEY_WIDTH = SETTINGS_KEY("Width"); +const QString KEY_EXPANDED = SETTINGS_KEY("Expanded"); +const QString KEY_POSITION = SETTINGS_KEY("Position"); +const QString KEY_TOPLEVEL = SETTINGS_KEY("TopLevel"); +const QString KEY_SAVEPATHHISTORY = SETTINGS_KEY("SavePathHistory"); namespace { -#define SETTINGS_KEY(name) QStringLiteral("AddNewTorrentDialog/" name) - const QString KEY_ENABLED = SETTINGS_KEY("Enabled"); - const QString KEY_DEFAULTCATEGORY = SETTINGS_KEY("DefaultCategory"); - const QString KEY_TREEHEADERSTATE = SETTINGS_KEY("TreeHeaderState"); - const QString KEY_WIDTH = SETTINGS_KEY("Width"); - const QString KEY_EXPANDED = SETTINGS_KEY("Expanded"); - const QString KEY_TOPLEVEL = SETTINGS_KEY("TopLevel"); - const QString KEY_SAVEPATHHISTORY = SETTINGS_KEY("SavePathHistory"); - const QString KEY_SAVEPATHHISTORYLENGTH = SETTINGS_KEY("SavePathHistoryLength"); - const QString KEY_REMEMBERLASTSAVEPATH = SETTINGS_KEY("RememberLastSavePath"); - // just a shortcut inline SettingsStorage *settings() { @@ -79,92 +75,64 @@ } } -const int AddNewTorrentDialog::minPathHistoryLength; -const int AddNewTorrentDialog::maxPathHistoryLength; - -AddNewTorrentDialog::AddNewTorrentDialog(const BitTorrent::AddTorrentParams &inParams, QWidget *parent) +AddNewTorrentDialog::AddNewTorrentDialog(QWidget *parent) : QDialog(parent) - , m_ui(new Ui::AddNewTorrentDialog) - , m_contentModel(nullptr) - , m_contentDelegate(nullptr) + , ui(new Ui::AddNewTorrentDialog) + , m_contentModel(0) + , m_contentDelegate(0) , m_hasMetadata(false) , m_oldIndex(0) - , m_torrentParams(inParams) { - // TODO: set dialog file properties using m_torrentParams.filePriorities - m_ui->setupUi(this); + ui->setupUi(this); setAttribute(Qt::WA_DeleteOnClose); - m_ui->lblMetaLoading->setVisible(false); - m_ui->progMetaLoading->setVisible(false); - - m_ui->savePath->setMode(FileSystemPathEdit::Mode::DirectorySave); - m_ui->savePath->setDialogCaption(tr("Choose save path")); - m_ui->savePath->setMaxVisibleItems(20); + ui->lblMetaLoading->setVisible(false); + ui->progMetaLoading->setVisible(false); auto session = BitTorrent::Session::instance(); - if (m_torrentParams.addPaused == TriStateBool::True) - m_ui->startTorrentCheckBox->setChecked(false); - else if (m_torrentParams.addPaused == TriStateBool::False) - m_ui->startTorrentCheckBox->setChecked(true); - else - m_ui->startTorrentCheckBox->setChecked(!session->isAddTorrentPaused()); - - m_ui->comboTTM->blockSignals(true); // the TreeView size isn't correct if the slot does it job at this point - m_ui->comboTTM->setCurrentIndex(!session->isAutoTMMDisabledByDefault()); - m_ui->comboTTM->blockSignals(false); + ui->startTorrentCheckBox->setChecked(!session->isAddTorrentPaused()); + ui->comboTTM->blockSignals(true); // the TreeView size isn't correct if the slot does it job at this point + ui->comboTTM->setCurrentIndex(!session->isAutoTMMDisabledByDefault()); + ui->comboTTM->blockSignals(false); populateSavePathComboBox(); - connect(m_ui->savePath, &FileSystemPathEdit::selectedPathChanged, this, &AddNewTorrentDialog::onSavePathChanged); - - const bool rememberLastSavePath = settings()->loadValue(KEY_REMEMBERLASTSAVEPATH, false).toBool(); - m_ui->checkBoxRememberLastSavePath->setChecked(rememberLastSavePath); + connect(ui->savePathComboBox, SIGNAL(currentIndexChanged(int)), SLOT(onSavePathChanged(int))); + connect(ui->browseButton, SIGNAL(clicked()), SLOT(browseButton_clicked())); + ui->defaultSavePathCheckBox->setVisible(false); // Default path is selected by default - if (m_torrentParams.createSubfolder == TriStateBool::True) - m_ui->createSubfolderCheckBox->setChecked(true); - else if (m_torrentParams.createSubfolder == TriStateBool::False) - m_ui->createSubfolderCheckBox->setChecked(false); - else - m_ui->createSubfolderCheckBox->setChecked(session->isCreateTorrentSubfolder()); - - m_ui->sequentialCheckBox->setChecked(m_torrentParams.sequential); - m_ui->firstLastCheckBox->setChecked(m_torrentParams.firstLastPiecePriority); - - m_ui->skipCheckingCheckBox->setChecked(m_torrentParams.skipChecking); - m_ui->doNotDeleteTorrentCheckBox->setVisible(TorrentFileGuard::autoDeleteMode() != TorrentFileGuard::Never); + ui->doNotDeleteTorrentCheckBox->setVisible(TorrentFileGuard::autoDeleteMode() != TorrentFileGuard::Never); // Load categories - QStringList categories = session->categories().keys(); - std::sort(categories.begin(), categories.end(), Utils::String::naturalLessThan); + QStringList categories = session->categories(); + std::sort(categories.begin(), categories.end(), Utils::String::naturalCompareCaseInsensitive); QString defaultCategory = settings()->loadValue(KEY_DEFAULTCATEGORY).toString(); - if (!m_torrentParams.category.isEmpty()) - m_ui->categoryComboBox->addItem(m_torrentParams.category); if (!defaultCategory.isEmpty()) - m_ui->categoryComboBox->addItem(defaultCategory); - m_ui->categoryComboBox->addItem(""); + ui->categoryComboBox->addItem(defaultCategory); + ui->categoryComboBox->addItem(""); foreach (const QString &category, categories) - if (category != defaultCategory && category != m_torrentParams.category) - m_ui->categoryComboBox->addItem(category); + if (category != defaultCategory) + ui->categoryComboBox->addItem(category); - m_ui->contentTreeView->header()->setSortIndicator(0, Qt::AscendingOrder); + ui->contentTreeView->header()->setSortIndicator(0, Qt::AscendingOrder); loadState(); // Signal / slots - connect(m_ui->toolButtonAdvanced, &QToolButton::clicked, this, &AddNewTorrentDialog::showAdvancedSettings); - connect(m_ui->doNotDeleteTorrentCheckBox, &QCheckBox::clicked, this, &AddNewTorrentDialog::doNotDeleteTorrentClicked); - QShortcut *editHotkey = new QShortcut(Qt::Key_F2, m_ui->contentTreeView, nullptr, nullptr, Qt::WidgetShortcut); - connect(editHotkey, &QShortcut::activated, this, &AddNewTorrentDialog::renameSelectedFile); - connect(m_ui->contentTreeView, &QAbstractItemView::doubleClicked, this, &AddNewTorrentDialog::renameSelectedFile); + connect(ui->adv_button, SIGNAL(clicked(bool)), SLOT(showAdvancedSettings(bool))); + connect(ui->doNotDeleteTorrentCheckBox, SIGNAL(clicked(bool)), SLOT(doNotDeleteTorrentClicked(bool))); + editHotkey = new QShortcut(Qt::Key_F2, ui->contentTreeView, 0, 0, Qt::WidgetShortcut); + connect(editHotkey, SIGNAL(activated()), SLOT(renameSelectedFile())); + connect(ui->contentTreeView, SIGNAL(doubleClicked(QModelIndex)), SLOT(renameSelectedFile())); - m_ui->buttonBox->button(QDialogButtonBox::Ok)->setFocus(); + ui->buttonBox->button(QDialogButtonBox::Ok)->setFocus(); } AddNewTorrentDialog::~AddNewTorrentDialog() { saveState(); - - delete m_contentDelegate; - delete m_ui; + delete ui; + if (m_contentModel) + delete m_contentModel; + delete editHotkey; } bool AddNewTorrentDialog::isEnabled() @@ -187,58 +155,37 @@ SettingsStorage::instance()->storeValue(KEY_TOPLEVEL, value); } -int AddNewTorrentDialog::savePathHistoryLength() -{ - const int defaultHistoryLength = 8; - const int value = settings()->loadValue(KEY_SAVEPATHHISTORYLENGTH, defaultHistoryLength).toInt(); - return qBound(minPathHistoryLength, value, maxPathHistoryLength); -} - -void AddNewTorrentDialog::setSavePathHistoryLength(int value) -{ - const int clampedValue = qBound(minPathHistoryLength, value, maxPathHistoryLength); - const int oldValue = savePathHistoryLength(); - if (clampedValue == oldValue) - return; - - settings()->storeValue(KEY_SAVEPATHHISTORYLENGTH, clampedValue); - settings()->storeValue(KEY_SAVEPATHHISTORY - , QStringList(settings()->loadValue(KEY_SAVEPATHHISTORY).toStringList().mid(0, clampedValue))); -} - void AddNewTorrentDialog::loadState() { m_headerState = settings()->loadValue(KEY_TREEHEADERSTATE).toByteArray(); - - const QSize newSize = Utils::Gui::scaledSize(this, size()); - const int width = settings()->loadValue(KEY_WIDTH, newSize.width()).toInt(); - const int height = newSize.height(); - resize(width, height); - - m_ui->toolButtonAdvanced->setChecked(settings()->loadValue(KEY_EXPANDED).toBool()); + int width = settings()->loadValue(KEY_WIDTH, -1).toInt(); + if (width >= 0) { + QRect geo = geometry(); + geo.setWidth(width); + setGeometry(geo); + } + ui->adv_button->setChecked(settings()->loadValue(KEY_EXPANDED).toBool()); } void AddNewTorrentDialog::saveState() { if (m_contentModel) - settings()->storeValue(KEY_TREEHEADERSTATE, m_ui->contentTreeView->header()->saveState()); + settings()->storeValue(KEY_TREEHEADERSTATE, ui->contentTreeView->header()->saveState()); + settings()->storeValue(KEY_POSITION, pos().y()); settings()->storeValue(KEY_WIDTH, width()); - settings()->storeValue(KEY_EXPANDED, m_ui->toolButtonAdvanced->isChecked()); + settings()->storeValue(KEY_EXPANDED, ui->adv_button->isChecked()); } -void AddNewTorrentDialog::show(QString source, const BitTorrent::AddTorrentParams &inParams, QWidget *parent) +void AddNewTorrentDialog::show(QString source, QWidget *parent) { - AddNewTorrentDialog *dlg = new AddNewTorrentDialog(inParams, parent); + AddNewTorrentDialog *dlg = new AddNewTorrentDialog(parent); if (Utils::Misc::isUrl(source)) { // Launch downloader - // TODO: Don't save loaded torrent to file, just use downloaded data! - Net::DownloadHandler *handler = Net::DownloadManager::instance()->download( - Net::DownloadRequest(source).limit(10485760 /* 10MB */).handleRedirectToMagnet(true).saveToFile(true)); - connect(handler, static_cast(&Net::DownloadHandler::downloadFinished) - , dlg, &AddNewTorrentDialog::handleDownloadFinished); - connect(handler, &Net::DownloadHandler::downloadFailed, dlg, &AddNewTorrentDialog::handleDownloadFailed); - connect(handler, &Net::DownloadHandler::redirectedToMagnet, dlg, &AddNewTorrentDialog::handleRedirectedToMagnet); + Net::DownloadHandler *handler = Net::DownloadManager::instance()->downloadUrl(source, true, 10485760 /* 10MB */, true); + connect(handler, SIGNAL(downloadFinished(QString,QString)), dlg, SLOT(handleDownloadFinished(QString,QString))); + connect(handler, SIGNAL(downloadFailed(QString,QString)), dlg, SLOT(handleDownloadFailed(QString,QString))); + connect(handler, SIGNAL(redirectedToMagnet(QString,QString)), dlg, SLOT(handleRedirectedToMagnet(QString,QString))); } else { bool ok = false; @@ -249,21 +196,12 @@ ok = dlg->loadTorrent(source); if (ok) -#ifdef Q_OS_MAC - dlg->exec(); -#else dlg->open(); -#endif else delete dlg; } } -void AddNewTorrentDialog::show(QString source, QWidget *parent) -{ - show(source, BitTorrent::AddTorrentParams(), parent); -} - bool AddNewTorrentDialog::loadTorrent(const QString &torrentPath) { if (torrentPath.startsWith("file://", Qt::CaseInsensitive)) @@ -272,22 +210,21 @@ m_filePath = torrentPath; if (!QFile::exists(m_filePath)) { - RaisedMessageBox::critical(this, tr("I/O Error"), tr("The torrent file '%1' does not exist.").arg(Utils::Fs::toNativePath(m_filePath))); + MessageBoxRaised::critical(0, tr("I/O Error"), tr("The torrent file '%1' does not exist.").arg(Utils::Fs::toNativePath(m_filePath))); return false; } QFileInfo fileinfo(m_filePath); if (!fileinfo.isReadable()) { - RaisedMessageBox::critical(this, tr("I/O Error"), tr("The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions.").arg(Utils::Fs::toNativePath(m_filePath))); + MessageBoxRaised::critical(0, tr("I/O Error"), tr("The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions.").arg(Utils::Fs::toNativePath(m_filePath))); return false; } m_hasMetadata = true; QString error; - m_torrentInfo = BitTorrent::TorrentInfo::loadFromFile(m_filePath, &error); + m_torrentInfo = BitTorrent::TorrentInfo::loadFromFile(m_filePath, error); if (!m_torrentInfo.isValid()) { - RaisedMessageBox::critical(this, tr("Invalid torrent"), tr("Failed to load the torrent: %1.\nError: %2", "Don't remove the '\n' characters. They insert a newline.") - .arg(Utils::Fs::toNativePath(m_filePath), error)); + MessageBoxRaised::critical(0, tr("Invalid torrent"), tr("Failed to load the torrent: %1.\nError: %2", "Don't remove the '\n' characters. They insert a newline.").arg(Utils::Fs::toNativePath(m_filePath)).arg(error)); return false; } @@ -299,30 +236,30 @@ BitTorrent::TorrentHandle *const torrent = BitTorrent::Session::instance()->findTorrent(m_hash); if (torrent) { if (torrent->isPrivate() || m_torrentInfo.isPrivate()) { - RaisedMessageBox::warning(this, tr("Torrent is already present"), tr("Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent.").arg(torrent->name()), QMessageBox::Ok); + MessageBoxRaised::critical(0, tr("Already in download list"), tr("Torrent is already in download list. Trackers weren't merged because it is a private torrent."), QMessageBox::Ok); } else { torrent->addTrackers(m_torrentInfo.trackers()); torrent->addUrlSeeds(m_torrentInfo.urlSeeds()); - RaisedMessageBox::information(this, tr("Torrent is already present"), tr("Torrent '%1' is already in the transfer list. Trackers have been merged.").arg(torrent->name()), QMessageBox::Ok); + MessageBoxRaised::information(0, tr("Already in download list"), tr("Torrent is already in download list. Trackers were merged."), QMessageBox::Ok); } } else { - RaisedMessageBox::information(this, tr("Torrent is already present"), tr("Torrent is already queued for processing."), QMessageBox::Ok); + MessageBoxRaised::critical(0, tr("Cannot add torrent"), tr("Cannot add this torrent. Perhaps it is already in adding state."), QMessageBox::Ok); } return false; } - m_ui->lblhash->setText(m_hash); + ui->lblhash->setText(m_hash); setupTreeview(); - TMMChanged(m_ui->comboTTM->currentIndex()); + TMMChanged(ui->comboTTM->currentIndex()); return true; } bool AddNewTorrentDialog::loadMagnet(const BitTorrent::MagnetUri &magnetUri) { if (!magnetUri.isValid()) { - RaisedMessageBox::critical(this, tr("Invalid magnet link"), tr("This magnet link was not recognized")); + MessageBoxRaised::critical(0, tr("Invalid magnet link"), tr("This magnet link was not recognized")); return false; } @@ -333,32 +270,34 @@ BitTorrent::TorrentHandle *const torrent = BitTorrent::Session::instance()->findTorrent(m_hash); if (torrent) { if (torrent->isPrivate()) { - RaisedMessageBox::warning(this, tr("Torrent is already present"), tr("Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent.").arg(torrent->name()), QMessageBox::Ok); + MessageBoxRaised::critical(0, tr("Already in download list"), tr("Torrent is already in download list. Trackers weren't merged because it is a private torrent."), QMessageBox::Ok); } else { torrent->addTrackers(magnetUri.trackers()); torrent->addUrlSeeds(magnetUri.urlSeeds()); - RaisedMessageBox::information(this, tr("Torrent is already present"), tr("Magnet link '%1' is already in the transfer list. Trackers have been merged.").arg(torrent->name()), QMessageBox::Ok); + MessageBoxRaised::information(0, tr("Already in download list"), tr("Magnet link is already in download list. Trackers were merged."), QMessageBox::Ok); } } else { - RaisedMessageBox::information(this, tr("Torrent is already present"), tr("Magnet link is already queued for processing."), QMessageBox::Ok); + MessageBoxRaised::critical(0, tr("Cannot add torrent"), tr("Cannot add this torrent. Perhaps it is already in adding."), QMessageBox::Ok); } return false; } - connect(BitTorrent::Session::instance(), &BitTorrent::Session::metadataLoaded, this, &AddNewTorrentDialog::updateMetadata); + connect(BitTorrent::Session::instance(), SIGNAL(metadataLoaded(BitTorrent::TorrentInfo)), SLOT(updateMetadata(BitTorrent::TorrentInfo))); // Set dialog title - QString torrentName = magnetUri.name(); - setWindowTitle(torrentName.isEmpty() ? tr("Magnet link") : torrentName); + QString torrent_name = magnetUri.name(); + setWindowTitle(torrent_name.isEmpty() ? tr("Magnet link") : torrent_name); setupTreeview(); - TMMChanged(m_ui->comboTTM->currentIndex()); + TMMChanged(ui->comboTTM->currentIndex()); + // Set dialog position + setdialogPosition(); BitTorrent::Session::instance()->loadMetadata(magnetUri); setMetadataProgressIndicator(true, tr("Retrieving metadata...")); - m_ui->lblhash->setText(m_hash); + ui->lblhash->setText(m_hash); return true; } @@ -375,19 +314,19 @@ void AddNewTorrentDialog::showAdvancedSettings(bool show) { const int minimumW = minimumWidth(); - setMinimumWidth(width()); // to remain the same width + setMinimumWidth(width()); // to remain the same width if (show) { - m_ui->toolButtonAdvanced->setText(QString::fromUtf8(C_UP)); - m_ui->groupBoxSettings->setVisible(true); - m_ui->infoGroup->setVisible(true); - m_ui->contentTreeView->setVisible(m_hasMetadata); - static_cast(layout())->insertWidget(layout()->indexOf(m_ui->checkBoxNeverShow) + 1, m_ui->toolButtonAdvanced); + ui->adv_button->setText(QString::fromUtf8(C_UP)); + ui->settings_group->setVisible(true); + ui->infoGroup->setVisible(true); + ui->contentTreeView->setVisible(m_hasMetadata); + static_cast(layout())->insertWidget(layout()->indexOf(ui->never_show_cb) + 1, ui->adv_button); } else { - m_ui->toolButtonAdvanced->setText(QString::fromUtf8(C_DOWN)); - m_ui->groupBoxSettings->setVisible(false); - m_ui->infoGroup->setVisible(false); - m_ui->buttonsHLayout->insertWidget(0, layout()->takeAt(layout()->indexOf(m_ui->checkBoxNeverShow) + 1)->widget()); + ui->adv_button->setText(QString::fromUtf8(C_DOWN)); + ui->settings_group->setVisible(false); + ui->infoGroup->setVisible(false); + ui->buttonsHLayout->insertWidget(0, layout()->takeAt(layout()->indexOf(ui->never_show_cb) + 1)->widget()); } adjustSize(); setMinimumWidth(minimumW); @@ -395,30 +334,29 @@ void AddNewTorrentDialog::saveSavePathHistory() const { + QDir selectedSavePath(ui->savePathComboBox->itemData(ui->savePathComboBox->currentIndex()).toString()); // Get current history QStringList history = settings()->loadValue(KEY_SAVEPATHHISTORY).toStringList(); - QVector historyDirs; - for (const QString &path : qAsConst(history)) - historyDirs << QDir {path}; - - const QDir selectedSavePath {m_ui->savePath->selectedPath()}; - const int selectedSavePathIndex = historyDirs.indexOf(selectedSavePath); - if (selectedSavePathIndex > 0) - history.removeAt(selectedSavePathIndex); - if (selectedSavePathIndex != 0) - // Add last used save path to the front of history + QList historyDirs; + foreach (const QString dir, history) + historyDirs << QDir(dir); + if (!historyDirs.contains(selectedSavePath)) { + // Add save path to history history.push_front(selectedSavePath.absolutePath()); - - // Save history - settings()->storeValue(KEY_SAVEPATHHISTORY, QStringList {history.mid(0, savePathHistoryLength())}); + // Limit list size + if (history.size() > 8) + history.pop_back(); + // Save history + settings()->storeValue(KEY_SAVEPATHHISTORY, history); + } } -// savePath is a folder, not an absolute file path -int AddNewTorrentDialog::indexOfSavePath(const QString &savePath) +// save_path is a folder, not an absolute file path +int AddNewTorrentDialog::indexOfSavePath(const QString &save_path) { - QDir saveDir(savePath); - for (int i = 0; i < m_ui->savePath->count(); ++i) - if (QDir(m_ui->savePath->item(i)) == saveDir) + QDir saveDir(save_path); + for (int i = 0; i < ui->savePathComboBox->count(); ++i) + if (QDir(ui->savePathComboBox->itemData(i).toString()) == saveDir) return i; return -1; } @@ -426,7 +364,7 @@ void AddNewTorrentDialog::updateDiskSpaceLabel() { // Determine torrent size - qlonglong torrentSize = 0; + qulonglong torrent_size = 0; if (m_hasMetadata) { if (m_contentModel) { @@ -434,26 +372,33 @@ Q_ASSERT(priorities.size() == m_torrentInfo.filesCount()); for (int i = 0; i < priorities.size(); ++i) if (priorities[i] > 0) - torrentSize += m_torrentInfo.fileSize(i); + torrent_size += m_torrentInfo.fileSize(i); } else { - torrentSize = m_torrentInfo.totalSize(); + torrent_size = m_torrentInfo.totalSize(); } } - QString sizeString = torrentSize ? Utils::Misc::friendlyUnit(torrentSize) : QString(tr("Not Available", "This size is unavailable.")); - sizeString += " ("; - sizeString += tr("Free space on disk: %1").arg(Utils::Misc::friendlyUnit(Utils::Fs::freeDiskSpaceOnPath( - m_ui->savePath->selectedPath()))); - sizeString += ')'; - m_ui->labelSize->setText(sizeString); + QString size_string = torrent_size ? Utils::Misc::friendlyUnit(torrent_size) : QString(tr("Not Available", "This size is unavailable.")); + size_string += " ("; + size_string += tr("Free space on disk: %1").arg(Utils::Misc::friendlyUnit(Utils::Fs::freeDiskSpaceOnPath( + ui->savePathComboBox->itemData( + ui->savePathComboBox->currentIndex()).toString()))); + size_string += ")"; + ui->size_lbl->setText(size_string); } -void AddNewTorrentDialog::onSavePathChanged(const QString &newPath) +void AddNewTorrentDialog::onSavePathChanged(int index) { - Q_UNUSED(newPath); + // Toggle default save path setting checkbox visibility + ui->defaultSavePathCheckBox->setChecked(false); + ui->defaultSavePathCheckBox->setVisible( + QDir(ui->savePathComboBox->itemData(ui->savePathComboBox->currentIndex()).toString()) + != QDir(BitTorrent::Session::instance()->defaultSavePath())); + // Remember index - m_oldIndex = m_ui->savePath->currentIndex(); + m_oldIndex = index; + updateDiskSpaceLabel(); } @@ -461,159 +406,198 @@ { Q_UNUSED(index); - if (m_ui->comboTTM->currentIndex() == 1) { - QString savePath = BitTorrent::Session::instance()->categorySavePath(m_ui->categoryComboBox->currentText()); - m_ui->savePath->setSelectedPath(Utils::Fs::toNativePath(savePath)); + if (ui->comboTTM->currentIndex() == 1) { + QString savePath = BitTorrent::Session::instance()->categorySavePath(ui->categoryComboBox->currentText()); + ui->savePathComboBox->setItemText(0, Utils::Fs::toNativePath(savePath)); + ui->savePathComboBox->setItemData(0, savePath); } } -void AddNewTorrentDialog::setSavePath(const QString &newPath) +void AddNewTorrentDialog::browseButton_clicked() { - int existingIndex = indexOfSavePath(newPath); - if (existingIndex < 0) { - // New path, prepend to combo box - m_ui->savePath->insertItem(0, newPath); - existingIndex = 0; - } - m_ui->savePath->setCurrentIndex(existingIndex); - onSavePathChanged(newPath); -} + disconnect(ui->savePathComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onSavePathChanged(int))); -void AddNewTorrentDialog::renameSelectedFile() -{ - const QModelIndexList selectedIndexes = m_ui->contentTreeView->selectionModel()->selectedRows(0); - if (selectedIndexes.size() != 1) return; + // User is asking for a new save path + QString curSavePath = ui->savePathComboBox->itemText(m_oldIndex); + QString newPath; - const QModelIndex modelIndex = selectedIndexes.first(); - if (!modelIndex.isValid()) return; + if (!curSavePath.isEmpty() && QDir(curSavePath).exists()) + newPath = QFileDialog::getExistingDirectory(this, tr("Choose save path"), curSavePath); + else + newPath = QFileDialog::getExistingDirectory(this, tr("Choose save path"), QDir::homePath()); - // Ask for new name - bool ok = false; - const bool isFile = (m_contentModel->itemType(modelIndex) == TorrentContentModelItem::FileType); - QString newName = AutoExpandableDialog::getText(this, tr("Renaming"), tr("New name:"), QLineEdit::Normal - , modelIndex.data().toString(), &ok, isFile).trimmed(); - if (!ok) return; - - if (newName.isEmpty() || !Utils::Fs::isValidFileSystemName(newName)) { - RaisedMessageBox::warning(this, tr("Rename error"), - tr("The name is empty or contains forbidden characters, please choose a different one."), - QMessageBox::Ok); - return; - } + if (!newPath.isEmpty()) { + const int existingIndex = indexOfSavePath(newPath); + if (existingIndex >= 0) { + ui->savePathComboBox->setCurrentIndex(existingIndex); + } + else { + // New path, prepend to combo box + ui->savePathComboBox->insertItem(0, Utils::Fs::toNativePath(newPath), newPath); + ui->savePathComboBox->setCurrentIndex(0); + } - if (isFile) { - const int fileIndex = m_contentModel->getFileIndex(modelIndex); + onSavePathChanged(0); + } + else { + // Restore index + ui->savePathComboBox->setCurrentIndex(m_oldIndex); + } - if (newName.endsWith(QB_EXT)) - newName.chop(QB_EXT.size()); - const QString oldFileName = m_torrentInfo.fileName(fileIndex); - const QString oldFilePath = m_torrentInfo.filePath(fileIndex); - const QString newFilePath = oldFilePath.leftRef(oldFilePath.size() - oldFileName.size()) + newName; + connect(ui->savePathComboBox, SIGNAL(currentIndexChanged(int)), SLOT(onSavePathChanged(int))); +} - if (oldFileName == newName) { - qDebug("Name did not change: %s", qUtf8Printable(oldFileName)); +void AddNewTorrentDialog::renameSelectedFile() +{ + const QModelIndexList selectedIndexes = ui->contentTreeView->selectionModel()->selectedRows(0); + if (selectedIndexes.size() != 1) + return; + const QModelIndex &index = selectedIndexes.first(); + if (!index.isValid()) + return; + // Ask for new name + bool ok; + const QString new_name_last = AutoExpandableDialog::getText(this, tr("Rename the file"), + tr("New name:"), QLineEdit::Normal, + index.data().toString(), &ok).trimmed(); + if (ok && !new_name_last.isEmpty()) { + if (!Utils::Fs::isValidFileSystemName(new_name_last)) { + MessageBoxRaised::warning(this, tr("The file could not be renamed"), + tr("This file name contains forbidden characters, please choose a different one."), + QMessageBox::Ok); return; } - - // check if that name is already used - for (int i = 0; i < m_torrentInfo.filesCount(); ++i) { - if (i == fileIndex) continue; - if (Utils::Fs::sameFileNames(m_torrentInfo.filePath(i), newFilePath)) { - RaisedMessageBox::warning(this, tr("Rename error"), - tr("This name is already in use in this folder. Please use a different name."), - QMessageBox::Ok); + if (m_contentModel->itemType(index) == TorrentContentModelItem::FileType) { + // File renaming + const int file_index = m_contentModel->getFileIndex(index); + QString old_name = Utils::Fs::fromNativePath(m_torrentInfo.filePath(file_index)); + qDebug("Old name: %s", qPrintable(old_name)); + QStringList path_items = old_name.split("/"); + path_items.removeLast(); + path_items << new_name_last; + QString new_name = path_items.join("/"); + if (Utils::Fs::sameFileNames(old_name, new_name)) { + qDebug("Name did not change"); return; } + new_name = Utils::Fs::expandPath(new_name); + qDebug("New name: %s", qPrintable(new_name)); + // Check if that name is already used + for (int i = 0; i < m_torrentInfo.filesCount(); ++i) { + if (i == file_index) continue; + if (Utils::Fs::sameFileNames(m_torrentInfo.filePath(i), new_name)) { + // Display error message + MessageBoxRaised::warning(this, tr("The file could not be renamed"), + tr("This name is already in use in this folder. Please use a different name."), + QMessageBox::Ok); + return; + } + } + qDebug("Renaming %s to %s", qPrintable(old_name), qPrintable(new_name)); + m_torrentInfo.renameFile(file_index, new_name); + // Rename in torrent files model too + m_contentModel->setData(index, new_name_last); } - - qDebug("Renaming %s to %s", qUtf8Printable(oldFilePath), qUtf8Printable(newFilePath)); - m_torrentInfo.renameFile(fileIndex, newFilePath); - - m_contentModel->setData(modelIndex, newName); - } - else { - // renaming a folder - QStringList pathItems; - pathItems << modelIndex.data().toString(); - QModelIndex parent = m_contentModel->parent(modelIndex); - while (parent.isValid()) { - pathItems.prepend(parent.data().toString()); - parent = m_contentModel->parent(parent); - } - const QString oldPath = pathItems.join('/'); - pathItems.removeLast(); - pathItems << newName; - QString newPath = pathItems.join('/'); - if (Utils::Fs::sameFileNames(oldPath, newPath)) { - qDebug("Name did not change"); - return; - } - if (!newPath.endsWith('/')) newPath += '/'; - // Check for overwriting - for (int i = 0; i < m_torrentInfo.filesCount(); ++i) { - const QString currentName = m_torrentInfo.filePath(i); + else { + // Folder renaming + QStringList path_items; + path_items << index.data().toString(); + QModelIndex parent = m_contentModel->parent(index); + while (parent.isValid()) { + path_items.prepend(parent.data().toString()); + parent = m_contentModel->parent(parent); + } + const QString old_path = path_items.join("/"); + path_items.removeLast(); + path_items << new_name_last; + QString new_path = path_items.join("/"); + if (Utils::Fs::sameFileNames(old_path, new_path)) { + qDebug("Name did not change"); + return; + } + if (!new_path.endsWith("/")) new_path += "/"; + // Check for overwriting + for (int i = 0; i < m_torrentInfo.filesCount(); ++i) { + const QString ¤t_name = m_torrentInfo.filePath(i); #if defined(Q_OS_UNIX) || defined(Q_WS_QWS) - if (currentName.startsWith(newPath, Qt::CaseSensitive)) { + if (current_name.startsWith(new_path, Qt::CaseSensitive)) { #else - if (currentName.startsWith(newPath, Qt::CaseInsensitive)) { + if (current_name.startsWith(new_path, Qt::CaseInsensitive)) { #endif - RaisedMessageBox::warning(this, tr("The folder could not be renamed"), - tr("This name is already in use in this folder. Please use a different name."), - QMessageBox::Ok); - return; + MessageBoxRaised::warning(this, tr("The folder could not be renamed"), + tr("This name is already in use in this folder. Please use a different name."), + QMessageBox::Ok); + return; + } } - } - // Replace path in all files - for (int i = 0; i < m_torrentInfo.filesCount(); ++i) { - const QString currentName = m_torrentInfo.filePath(i); - if (currentName.startsWith(oldPath)) { - QString newName = currentName; - newName.replace(0, oldPath.length(), newPath); - newName = Utils::Fs::expandPath(newName); - qDebug("Rename %s to %s", qUtf8Printable(currentName), qUtf8Printable(newName)); - m_torrentInfo.renameFile(i, newName); + // Replace path in all files + for (int i = 0; i < m_torrentInfo.filesCount(); ++i) { + const QString ¤t_name = m_torrentInfo.filePath(i); + if (current_name.startsWith(old_path)) { + QString new_name = current_name; + new_name.replace(0, old_path.length(), new_path); + new_name = Utils::Fs::expandPath(new_name); + qDebug("Rename %s to %s", qPrintable(current_name), qPrintable(new_name)); + m_torrentInfo.renameFile(i, new_name); + } } + + // Rename folder in torrent files model too + m_contentModel->setData(index, new_name_last); } + } +} - // Rename folder in torrent files model too - m_contentModel->setData(modelIndex, newName); +void AddNewTorrentDialog::setdialogPosition() +{ + // In macOS, AddNewTorrentDialog is a sheet, not a window. Moving it + // causes very bad things to happen, especially if AddNewTorrentDialog is + // on a secondary monitor. +#ifndef Q_OS_MAC + qApp->processEvents(); + QPoint center(Utils::Misc::screenCenter(this)); + // Adjust y + int y = settings()->loadValue(KEY_POSITION, -1).toInt(); + if (y >= 0) { + center.setY(y); } + else { + center.ry() -= 120; + if (center.y() < 0) + center.setY(0); + } + move(center); +#endif } void AddNewTorrentDialog::populateSavePathComboBox() { - m_ui->savePath->clear(); + QString defSavePath = BitTorrent::Session::instance()->defaultSavePath(); + ui->savePathComboBox->clear(); + ui->savePathComboBox->addItem(Utils::Fs::toNativePath(defSavePath), defSavePath); + QDir defaultSaveDir(defSavePath); // Load save path history - const QStringList savePathHistory {settings()->loadValue(KEY_SAVEPATHHISTORY).toStringList()}; - for (const QString &savePath : savePathHistory) - m_ui->savePath->addItem(savePath); - - const bool rememberLastSavePath {settings()->loadValue(KEY_REMEMBERLASTSAVEPATH, false).toBool()}; - const QString defSavePath {BitTorrent::Session::instance()->defaultSavePath()}; - - if (!m_torrentParams.savePath.isEmpty()) - setSavePath(m_torrentParams.savePath); - else if (!rememberLastSavePath) - setSavePath(defSavePath); - // else last used save path will be selected since it is the first in the list + foreach (const QString &savePath, settings()->loadValue(KEY_SAVEPATHHISTORY).toStringList()) + if (QDir(savePath) != defaultSaveDir) + ui->savePathComboBox->addItem(Utils::Fs::toNativePath(savePath), savePath); } void AddNewTorrentDialog::displayContentTreeMenu(const QPoint &) { QMenu myFilesLlistMenu; - const QModelIndexList selectedRows = m_ui->contentTreeView->selectionModel()->selectedRows(0); - QAction *actRename = nullptr; + const QModelIndexList selectedRows = ui->contentTreeView->selectionModel()->selectedRows(0); + QAction *actRename = 0; if (selectedRows.size() == 1) { actRename = myFilesLlistMenu.addAction(GuiIconProvider::instance()->getIcon("edit-rename"), tr("Rename...")); myFilesLlistMenu.addSeparator(); } QMenu subMenu; subMenu.setTitle(tr("Priority")); - subMenu.addAction(m_ui->actionNotDownloaded); - subMenu.addAction(m_ui->actionNormal); - subMenu.addAction(m_ui->actionHigh); - subMenu.addAction(m_ui->actionMaximum); + subMenu.addAction(ui->actionNot_downloaded); + subMenu.addAction(ui->actionNormal); + subMenu.addAction(ui->actionHigh); + subMenu.addAction(ui->actionMaximum); myFilesLlistMenu.addMenu(&subMenu); // Call menu QAction *act = myFilesLlistMenu.exec(QCursor::pos()); @@ -623,11 +607,11 @@ } else { int prio = prio::NORMAL; - if (act == m_ui->actionHigh) + if (act == ui->actionHigh) prio = prio::HIGH; - else if (act == m_ui->actionMaximum) + else if (act == ui->actionMaximum) prio = prio::MAXIMUM; - else if (act == m_ui->actionNotDownloaded) + else if (act == ui->actionNot_downloaded) prio = prio::IGNORED; qDebug("Setting files priority"); @@ -644,43 +628,39 @@ if (!m_hasMetadata) disconnect(this, SLOT(updateMetadata(const BitTorrent::TorrentInfo&))); - // TODO: Check if destination actually exists - m_torrentParams.skipChecking = m_ui->skipCheckingCheckBox->isChecked(); + BitTorrent::AddTorrentParams params; + + if (ui->skip_check_cb->isChecked()) + // TODO: Check if destination actually exists + params.skipChecking = true; // Category - m_torrentParams.category = m_ui->categoryComboBox->currentText(); - if (m_ui->defaultCategoryCheckbox->isChecked()) - settings()->storeValue(KEY_DEFAULTCATEGORY, m_torrentParams.category); + params.category = ui->categoryComboBox->currentText(); - settings()->storeValue(KEY_REMEMBERLASTSAVEPATH, m_ui->checkBoxRememberLastSavePath->isChecked()); + if (ui->defaultCategoryCheckbox->isChecked()) + settings()->storeValue(KEY_DEFAULTCATEGORY, params.category); // Save file priorities if (m_contentModel) - m_torrentParams.filePriorities = m_contentModel->model()->getFilePriorities(); + params.filePriorities = m_contentModel->model()->getFilePriorities(); - m_torrentParams.addPaused = TriStateBool(!m_ui->startTorrentCheckBox->isChecked()); - m_torrentParams.createSubfolder = TriStateBool(m_ui->createSubfolderCheckBox->isChecked()); + params.addPaused = !ui->startTorrentCheckBox->isChecked(); - m_torrentParams.sequential = m_ui->sequentialCheckBox->isChecked(); - m_torrentParams.firstLastPiecePriority = m_ui->firstLastCheckBox->isChecked(); - - QString savePath = m_ui->savePath->selectedPath(); - if (m_ui->comboTTM->currentIndex() != 1) { // 0 is Manual mode and 1 is Automatic mode. Handle all non 1 values as manual mode. - m_torrentParams.useAutoTMM = TriStateBool::False; - m_torrentParams.savePath = savePath; + QString savePath = ui->savePathComboBox->itemData(ui->savePathComboBox->currentIndex()).toString(); + if (ui->comboTTM->currentIndex() != 1) { // 0 is Manual mode and 1 is Automatic mode. Handle all non 1 values as manual mode. + params.savePath = savePath; saveSavePathHistory(); - } - else { - m_torrentParams.useAutoTMM = TriStateBool::True; + if (ui->defaultSavePathCheckBox->isChecked()) + BitTorrent::Session::instance()->setDefaultSavePath(savePath); } - setEnabled(!m_ui->checkBoxNeverShow->isChecked()); + setEnabled(!ui->never_show_cb->isChecked()); // Add torrent if (!m_hasMetadata) - BitTorrent::Session::instance()->addTorrent(m_hash, m_torrentParams); + BitTorrent::Session::instance()->addTorrent(m_hash, params); else - BitTorrent::Session::instance()->addTorrent(m_torrentInfo, m_torrentParams); + BitTorrent::Session::instance()->addTorrent(m_torrentInfo, params); m_torrentGuard->markAsAddedToSession(); QDialog::accept(); @@ -703,7 +683,7 @@ disconnect(this, SLOT(updateMetadata(BitTorrent::TorrentInfo))); if (!info.isValid()) { - RaisedMessageBox::critical(this, tr("I/O Error"), ("Invalid metadata.")); + MessageBoxRaised::critical(0, tr("I/O Error"), ("Invalid metadata.")); setMetadataProgressIndicator(false, tr("Invalid metadata")); return; } @@ -721,16 +701,16 @@ void AddNewTorrentDialog::setMetadataProgressIndicator(bool visibleIndicator, const QString &labelText) { // Always show info label when waiting for metadata - m_ui->lblMetaLoading->setVisible(true); - m_ui->lblMetaLoading->setText(labelText); - m_ui->progMetaLoading->setVisible(visibleIndicator); + ui->lblMetaLoading->setVisible(true); + ui->lblMetaLoading->setText(labelText); + ui->progMetaLoading->setVisible(visibleIndicator); } void AddNewTorrentDialog::setupTreeview() { if (!m_hasMetadata) { setCommentText(tr("Not Available", "This comment is unavailable")); - m_ui->labelDate->setText(tr("Not Available", "This date is unavailable")); + ui->date_lbl->setText(tr("Not Available", "This date is unavailable")); } else { // Set dialog title @@ -738,40 +718,39 @@ // Set torrent information setCommentText(Utils::Misc::parseHtmlLinks(m_torrentInfo.comment())); - m_ui->labelDate->setText(!m_torrentInfo.creationDate().isNull() ? m_torrentInfo.creationDate().toString(Qt::DefaultLocaleShortDate) : tr("Not available")); + ui->date_lbl->setText(!m_torrentInfo.creationDate().isNull() ? m_torrentInfo.creationDate().toString(Qt::DefaultLocaleShortDate) : tr("Not available")); // Prepare content tree m_contentModel = new TorrentContentFilterModel(this); - connect(m_contentModel->model(), &TorrentContentModel::filteredFilesChanged, this, &AddNewTorrentDialog::updateDiskSpaceLabel); - m_ui->contentTreeView->setModel(m_contentModel); + connect(m_contentModel->model(), SIGNAL(filteredFilesChanged()), SLOT(updateDiskSpaceLabel())); + ui->contentTreeView->setModel(m_contentModel); m_contentDelegate = new PropListDelegate(nullptr); - m_ui->contentTreeView->setItemDelegate(m_contentDelegate); - connect(m_ui->contentTreeView, &QAbstractItemView::clicked, m_ui->contentTreeView - , static_cast(&QAbstractItemView::edit)); - connect(m_ui->contentTreeView, &QWidget::customContextMenuRequested, this, &AddNewTorrentDialog::displayContentTreeMenu); + ui->contentTreeView->setItemDelegate(m_contentDelegate); + connect(ui->contentTreeView, SIGNAL(clicked(const QModelIndex&)), ui->contentTreeView, SLOT(edit(const QModelIndex&))); + connect(ui->contentTreeView, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayContentTreeMenu(const QPoint&))); // List files in torrent m_contentModel->model()->setupModelData(m_torrentInfo); if (!m_headerState.isEmpty()) - m_ui->contentTreeView->header()->restoreState(m_headerState); + ui->contentTreeView->header()->restoreState(m_headerState); // Hide useless columns after loading the header state - m_ui->contentTreeView->hideColumn(PROGRESS); - m_ui->contentTreeView->hideColumn(REMAINING); - m_ui->contentTreeView->hideColumn(AVAILABILITY); + ui->contentTreeView->hideColumn(PROGRESS); + ui->contentTreeView->hideColumn(REMAINING); // Expand root folder - m_ui->contentTreeView->setExpanded(m_contentModel->index(0, 0), true); + ui->contentTreeView->setExpanded(m_contentModel->index(0, 0), true); } updateDiskSpaceLabel(); showAdvancedSettings(settings()->loadValue(KEY_EXPANDED, false).toBool()); + // Set dialog position + setdialogPosition(); } void AddNewTorrentDialog::handleDownloadFailed(const QString &url, const QString &reason) { - RaisedMessageBox::critical(this, tr("Download Error"), - QString("Cannot download '%1': %2").arg(url, reason)); + MessageBoxRaised::critical(0, tr("Download Error"), QString("Cannot download '%1': %2").arg(url).arg(reason)); this->deleteLater(); } @@ -797,32 +776,33 @@ { if (index != 1) { // 0 is Manual mode and 1 is Automatic mode. Handle all non 1 values as manual mode. populateSavePathComboBox(); - m_ui->groupBoxSavePath->setEnabled(true); - m_ui->savePath->blockSignals(false); - m_ui->savePath->setCurrentIndex(m_oldIndex < m_ui->savePath->count() ? m_oldIndex : m_ui->savePath->count() - 1); - m_ui->toolButtonAdvanced->setEnabled(true); + ui->groupBoxSavePath->setEnabled(true); + ui->savePathComboBox->blockSignals(false); + ui->savePathComboBox->setCurrentIndex(m_oldIndex < ui->savePathComboBox->count() ? m_oldIndex : ui->savePathComboBox->count() - 1); + ui->adv_button->setEnabled(true); } else { - m_ui->groupBoxSavePath->setEnabled(false); - m_ui->savePath->blockSignals(true); - m_ui->savePath->clear(); - QString savePath = BitTorrent::Session::instance()->categorySavePath(m_ui->categoryComboBox->currentText()); - m_ui->savePath->addItem(savePath); - m_ui->toolButtonAdvanced->setChecked(true); - m_ui->toolButtonAdvanced->setEnabled(false); + ui->groupBoxSavePath->setEnabled(false); + ui->savePathComboBox->blockSignals(true); + ui->savePathComboBox->clear(); + QString savePath = BitTorrent::Session::instance()->categorySavePath(ui->categoryComboBox->currentText()); + ui->savePathComboBox->addItem(Utils::Fs::toNativePath(savePath), savePath); + ui->defaultSavePathCheckBox->setVisible(false); + ui->adv_button->setChecked(true); + ui->adv_button->setEnabled(false); showAdvancedSettings(true); } } void AddNewTorrentDialog::setCommentText(const QString &str) const { - m_ui->commentLabel->setText(str); + ui->commentLabel->setText(str); // workaround for the additional space introduced by QScrollArea - int lineHeight = m_ui->commentLabel->fontMetrics().lineSpacing(); - int lines = 1 + str.count('\n'); + int lineHeight = ui->commentLabel->fontMetrics().lineSpacing(); + int lines = 1 + str.count("\n"); int height = lineHeight * lines; - m_ui->scrollArea->setMaximumHeight(height); + ui->scrollArea->setMaximumHeight(height); } void AddNewTorrentDialog::doNotDeleteTorrentClicked(bool checked) diff -Nru qbittorrent-4.1.3/src/gui/addnewtorrentdialog.h qbittorrent-3.3.15/src/gui/addnewtorrentdialog.h --- qbittorrent-4.1.3/src/gui/addnewtorrentdialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/addnewtorrentdialog.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2012 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2012 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef ADDNEWTORRENTDIALOG_H @@ -32,8 +34,8 @@ #include #include #include +#include -#include "base/bittorrent/addtorrentparams.h" #include "base/bittorrent/infohash.h" #include "base/bittorrent/torrentinfo.h" @@ -47,37 +49,33 @@ class AddNewTorrentDialog; } -class PropListDelegate; class TorrentContentFilterModel; class TorrentFileGuard; +class PropListDelegate; -class AddNewTorrentDialog : public QDialog +class AddNewTorrentDialog: public QDialog { Q_OBJECT public: - static const int minPathHistoryLength = 0; - static const int maxPathHistoryLength = 99; - ~AddNewTorrentDialog(); static bool isEnabled(); static void setEnabled(bool value); static bool isTopLevel(); static void setTopLevel(bool value); - static int savePathHistoryLength(); - static void setSavePathHistoryLength(int value); - static void show(QString source, const BitTorrent::AddTorrentParams &inParams, QWidget *parent); - static void show(QString source, QWidget *parent); + static void show(QString source, QWidget *parent = 0); private slots: void showAdvancedSettings(bool show); - void displayContentTreeMenu(const QPoint &); + void displayContentTreeMenu(const QPoint&); void updateDiskSpaceLabel(); - void onSavePathChanged(const QString &newPath); + void onSavePathChanged(int); void renameSelectedFile(); + void setdialogPosition(); void updateMetadata(const BitTorrent::TorrentInfo &info); + void browseButton_clicked(); void handleDownloadFailed(const QString &url, const QString &reason); void handleRedirectedToMagnet(const QString &url, const QString &magnetUri); void handleDownloadFinished(const QString &url, const QString &filePath); @@ -89,32 +87,31 @@ void reject() override; private: - explicit AddNewTorrentDialog(const BitTorrent::AddTorrentParams &inParams, QWidget *parent); + explicit AddNewTorrentDialog(QWidget *parent = 0); bool loadTorrent(const QString &torrentPath); bool loadMagnet(const BitTorrent::MagnetUri &magnetUri); void populateSavePathComboBox(); void saveSavePathHistory() const; - int indexOfSavePath(const QString &savePath); + int indexOfSavePath(const QString& save_path); void loadState(); void saveState(); void setMetadataProgressIndicator(bool visibleIndicator, const QString &labelText = QString()); void setupTreeview(); void setCommentText(const QString &str) const; - void setSavePath(const QString &newPath); void showEvent(QShowEvent *event) override; - Ui::AddNewTorrentDialog *m_ui; + Ui::AddNewTorrentDialog *ui; TorrentContentFilterModel *m_contentModel; PropListDelegate *m_contentDelegate; bool m_hasMetadata; QString m_filePath; BitTorrent::InfoHash m_hash; BitTorrent::TorrentInfo m_torrentInfo; + QShortcut *editHotkey; QByteArray m_headerState; int m_oldIndex; QScopedPointer m_torrentGuard; - BitTorrent::AddTorrentParams m_torrentParams; }; #endif // ADDNEWTORRENTDIALOG_H diff -Nru qbittorrent-4.1.3/src/gui/addnewtorrentdialog.ui qbittorrent-3.3.15/src/gui/addnewtorrentdialog.ui --- qbittorrent-4.1.3/src/gui/addnewtorrentdialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/addnewtorrentdialog.ui 2017-08-03 20:30:10.000000000 +0000 @@ -7,7 +7,7 @@ 0 0 414 - 630 + 661 @@ -59,12 +59,33 @@ - + + + + + + 0 + 0 + + + + QComboBox::AdjustToMinimumContentsLength + + + + + + + Browse... + + + + - + - Remember last used save path + Set as default save path @@ -82,14 +103,14 @@
- + Never show again - + @@ -99,7 +120,7 @@ - + Torrent settings @@ -149,7 +170,7 @@ - + Skip hash check @@ -171,30 +192,6 @@ - - - - Create subfolder - - - true - - - - - - - Download in sequential order - - - - - - - Download first and last pieces first - - -
@@ -238,7 +235,7 @@ - + @@ -259,7 +256,7 @@ - + @@ -288,8 +285,8 @@ 0 0 - 321 - 69 + 308 + 74 @@ -386,7 +383,7 @@ Maximum - + Do not download @@ -398,20 +395,15 @@ QTreeView
torrentcontenttreeview.h
- - FileSystemPathComboEdit - QWidget -
fspathedit.h
- 1 -
- savePath - checkBoxRememberLastSavePath - checkBoxNeverShow - toolButtonAdvanced + savePathComboBox + browseButton + defaultSavePathCheckBox + never_show_cb + adv_button startTorrentCheckBox - skipCheckingCheckBox + skip_check_cb categoryComboBox defaultCategoryCheckbox scrollArea diff -Nru qbittorrent-4.1.3/src/gui/advancedsettings.cpp qbittorrent-3.3.15/src/gui/advancedsettings.cpp --- qbittorrent-4.1.3/src/gui/advancedsettings.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/advancedsettings.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -28,18 +28,14 @@ #include "advancedsettings.h" -#include - #include #include #include #include +#include "app/application.h" #include "base/bittorrent/session.h" #include "base/preferences.h" -#include "base/unicodestrings.h" -#include "app/application.h" -#include "gui/addnewtorrentdialog.h" #include "gui/mainwindow.h" enum AdvSettingsCols @@ -70,46 +66,28 @@ RESOLVE_COUNTRIES, PROGRAM_NOTIFICATIONS, TORRENT_ADDED_NOTIFICATIONS, - CONFIRM_REMOVE_ALL_TAGS, DOWNLOAD_TRACKER_FAVICON, - SAVE_PATH_HISTORY_LENGTH, #if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) USE_ICON_THEME, #endif // libtorrent section LIBTORRENT_HEADER, -#if LIBTORRENT_VERSION_NUM >= 10100 - ASYNC_IO_THREADS, -#endif // cache DISK_CACHE, DISK_CACHE_TTL, OS_CACHE, - GUIDED_READ_CACHE, -#if LIBTORRENT_VERSION_NUM >= 10107 - COALESCE_RW, -#endif - SUGGEST_MODE, - SEND_BUF_WATERMARK, - SEND_BUF_LOW_WATERMARK, - SEND_BUF_WATERMARK_FACTOR, // ports MAX_HALF_OPEN, OUTGOING_PORT_MIN, OUTGOING_PORT_MAX, - UTP_MIX_MODE, - MULTI_CONNECTIONS_PER_IP, // embedded tracker TRACKER_STATUS, TRACKER_PORT, // seeding - CHOKING_ALGORITHM, - SEED_CHOKING_ALGORITHM, SUPER_SEEDING, // tracker ANNOUNCE_ALL_TRACKERS, - ANNOUNCE_ALL_TIERS, ANNOUNCE_IP, ROW_COUNT @@ -120,7 +98,7 @@ { // column setColumnCount(COL_COUNT); - QStringList header = {tr("Setting"), tr("Value", "Value set for this setting")}; + QStringList header = { tr("Setting"), tr("Value", "Value set for this setting") }; setHorizontalHeaderLabels(header); // row setRowCount(ROW_COUNT); @@ -130,12 +108,8 @@ setSelectionMode(QAbstractItemView::NoSelection); setEditTriggers(QAbstractItemView::NoEditTriggers); // Signals - connect(&spinBoxCache, static_cast(&QSpinBox::valueChanged) - , this, &AdvancedSettings::updateCacheSpinSuffix); - connect(&comboBoxInterface, static_cast(&QComboBox::currentIndexChanged) - , this, &AdvancedSettings::updateInterfaceAddressCombo); - connect(&spinBoxSaveResumeDataInterval, static_cast(&QSpinBox::valueChanged) - , this, &AdvancedSettings::updateSaveResumeDataIntervalSuffix); + connect(&spin_cache, SIGNAL(valueChanged(int)), SLOT(updateCacheSpinSuffix(int))); + connect(&combo_iface, SIGNAL(currentIndexChanged(int)), SLOT(updateInterfaceAddressCombo())); // Load settings loadAdvancedSettings(); resizeColumnToContents(0); @@ -144,143 +118,105 @@ void AdvancedSettings::saveAdvancedSettings() { - Preferences *const pref = Preferences::instance(); + Preferences* const pref = Preferences::instance(); BitTorrent::Session *const session = BitTorrent::Session::instance(); -#if LIBTORRENT_VERSION_NUM >= 10100 - // Async IO threads - session->setAsyncIOThreads(spinBoxAsyncIOThreads.value()); -#endif // Disk write cache - session->setDiskCacheSize(spinBoxCache.value()); - session->setDiskCacheTTL(spinBoxCacheTTL.value()); + session->setDiskCacheSize(spin_cache.value()); + session->setDiskCacheTTL(spin_cache_ttl.value()); // Enable OS cache - session->setUseOSCache(checkBoxOsCache.isChecked()); - // Guided read cache - session->setGuidedReadCacheEnabled(checkBoxGuidedReadCache.isChecked()); - // Coalesce reads & writes - session->setCoalesceReadWriteEnabled(checkBoxCoalesceRW.isChecked()); - // Suggest mode - session->setSuggestMode(checkBoxSuggestMode.isChecked()); - // Send buffer watermark - session->setSendBufferWatermark(spinBoxSendBufferWatermark.value()); - session->setSendBufferLowWatermark(spinBoxSendBufferLowWatermark.value()); - session->setSendBufferWatermarkFactor(spinBoxSendBufferWatermarkFactor.value()); + session->setUseOSCache(cb_os_cache.isChecked()); // Save resume data interval - session->setSaveResumeDataInterval(spinBoxSaveResumeDataInterval.value()); + session->setSaveResumeDataInterval(spin_save_resume_data_interval.value()); // Outgoing ports - session->setOutgoingPortsMin(spinBoxOutgoingPortsMin.value()); - session->setOutgoingPortsMax(spinBoxOutgoingPortsMax.value()); - // uTP-TCP mixed mode - session->setUtpMixedMode(static_cast(comboBoxUtpMixedMode.currentIndex())); - // multiple connections per IP - session->setMultiConnectionsPerIpEnabled(checkBoxMultiConnectionsPerIp.isChecked()); + session->setOutgoingPortsMin(outgoing_ports_min.value()); + session->setOutgoingPortsMax(outgoing_ports_max.value()); // Recheck torrents on completion - pref->recheckTorrentsOnCompletion(checkBoxRecheckCompleted.isChecked()); + pref->recheckTorrentsOnCompletion(cb_recheck_completed.isChecked()); // Transfer list refresh interval - session->setRefreshInterval(spinBoxListRefresh.value()); + session->setRefreshInterval(spin_list_refresh.value()); // Peer resolution - pref->resolvePeerCountries(checkBoxResolveCountries.isChecked()); - pref->resolvePeerHostNames(checkBoxResolveHosts.isChecked()); + pref->resolvePeerCountries(cb_resolve_countries.isChecked()); + pref->resolvePeerHostNames(cb_resolve_hosts.isChecked()); // Max Half-Open connections - session->setMaxHalfOpenConnections(spinBoxMaxHalfOpen.value()); + session->setMaxHalfOpenConnections(spin_maxhalfopen.value()); // Super seeding - session->setSuperSeedingEnabled(checkBoxSuperSeeding.isChecked()); + session->setSuperSeedingEnabled(cb_super_seeding.isChecked()); // Network interface - if (comboBoxInterface.currentIndex() == 0) { + if (combo_iface.currentIndex() == 0) { // All interfaces (default) session->setNetworkInterface(QString()); session->setNetworkInterfaceName(QString()); } else { - session->setNetworkInterface(comboBoxInterface.itemData(comboBoxInterface.currentIndex()).toString()); - session->setNetworkInterfaceName(comboBoxInterface.currentText()); + session->setNetworkInterface(combo_iface.itemData(combo_iface.currentIndex()).toString()); + session->setNetworkInterfaceName(combo_iface.currentText()); } // Interface address - if (comboBoxInterfaceAddress.currentIndex() == 0) { + if (combo_iface_address.currentIndex() == 0) { // All addresses (default) session->setNetworkInterfaceAddress(QString::null); } else { - QHostAddress ifaceAddr(comboBoxInterfaceAddress.currentText().trimmed()); + QHostAddress ifaceAddr(combo_iface_address.currentText().trimmed()); ifaceAddr.isNull() ? session->setNetworkInterfaceAddress(QString::null) : session->setNetworkInterfaceAddress(ifaceAddr.toString()); } - session->setIPv6Enabled(checkBoxListenIPv6.isChecked()); + session->setIPv6Enabled(cb_listen_ipv6.isChecked()); // Announce IP - QHostAddress addr(lineEditAnnounceIP.text().trimmed()); + QHostAddress addr(txtAnnounceIP.text().trimmed()); session->setAnnounceIP(addr.isNull() ? "" : addr.toString()); // Program notification - MainWindow *const mainWindow = static_cast(QCoreApplication::instance())->mainWindow(); - mainWindow->setNotificationsEnabled(checkBoxProgramNotifications.isChecked()); - mainWindow->setTorrentAddedNotificationsEnabled(checkBoxTorrentAddedNotifications.isChecked()); + MainWindow * const mainWindow = static_cast(QCoreApplication::instance())->mainWindow(); + mainWindow->setNotificationsEnabled(cb_program_notifications.isChecked()); + mainWindow->setTorrentAddedNotificationsEnabled(cb_torrent_added_notifications.isChecked()); // Misc GUI properties - mainWindow->setDownloadTrackerFavicon(checkBoxTrackerFavicon.isChecked()); - AddNewTorrentDialog::setSavePathHistoryLength(spinBoxSavePathHistoryLength.value()); + mainWindow->setDownloadTrackerFavicon(cb_tracker_favicon.isChecked()); // Tracker - session->setTrackerEnabled(checkBoxTrackerStatus.isChecked()); - pref->setTrackerPort(spinBoxTrackerPort.value()); - // Choking algorithm - session->setChokingAlgorithm(static_cast(comboBoxChokingAlgorithm.currentIndex())); - // Seed choking algorithm - session->setSeedChokingAlgorithm(static_cast(comboBoxSeedChokingAlgorithm.currentIndex())); - + session->setTrackerEnabled(cb_tracker_status.isChecked()); + pref->setTrackerPort(spin_tracker_port.value()); #if defined(Q_OS_WIN) || defined(Q_OS_MAC) - pref->setUpdateCheckEnabled(checkBoxUpdateCheck.isChecked()); + pref->setUpdateCheckEnabled(cb_update_check.isChecked()); #endif // Icon theme #if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) - pref->useSystemIconTheme(checkBoxUseIconTheme.isChecked()); + pref->useSystemIconTheme(cb_use_icon_theme.isChecked()); #endif - pref->setConfirmTorrentRecheck(checkBoxConfirmTorrentRecheck.isChecked()); - - pref->setConfirmRemoveAllTags(checkBoxConfirmRemoveAllTags.isChecked()); - - session->setAnnounceToAllTrackers(checkBoxAnnounceAllTrackers.isChecked()); - session->setAnnounceToAllTiers(checkBoxAnnounceAllTiers.isChecked()); + pref->setConfirmTorrentRecheck(cb_confirm_torrent_recheck.isChecked()); + session->setAnnounceToAllTrackers(cb_announce_all_trackers.isChecked()); } void AdvancedSettings::updateCacheSpinSuffix(int value) { - if (value == 0) - spinBoxCache.setSuffix(tr(" (disabled)")); - else if (value < 0) - spinBoxCache.setSuffix(tr(" (auto)")); - else - spinBoxCache.setSuffix(tr(" MiB")); -} - -void AdvancedSettings::updateSaveResumeDataIntervalSuffix(const int value) -{ - if (value > 0) - spinBoxSaveResumeDataInterval.setSuffix(tr(" min", " minutes")); + if (value <= 0) + spin_cache.setSuffix(tr(" (auto)")); else - spinBoxSaveResumeDataInterval.setSuffix(tr(" (disabled)")); + spin_cache.setSuffix(tr(" MiB")); } void AdvancedSettings::updateInterfaceAddressCombo() { // Try to get the currently selected interface name - const QString ifaceName = comboBoxInterface.itemData(comboBoxInterface.currentIndex()).toString(); // Empty string for the first element + const QString ifaceName = combo_iface.itemData(combo_iface.currentIndex()).toString(); // Empty string for the first element const QString currentAddress = BitTorrent::Session::instance()->networkInterfaceAddress(); - // Clear all items and reinsert them, default to all - comboBoxInterfaceAddress.clear(); - comboBoxInterfaceAddress.addItem(tr("All addresses")); - comboBoxInterfaceAddress.setCurrentIndex(0); + //Clear all items and reinsert them, default to all + combo_iface_address.clear(); + combo_iface_address.addItem(tr("All addresses")); + combo_iface_address.setCurrentIndex(0); auto populateCombo = [this, ¤tAddress](const QString &ip, const QAbstractSocket::NetworkLayerProtocol &protocol) { - Q_ASSERT((protocol == QAbstractSocket::IPv4Protocol) || (protocol == QAbstractSocket::IPv6Protocol)); - // Only take ipv4 for now? - if ((protocol != QAbstractSocket::IPv4Protocol) && (protocol != QAbstractSocket::IPv6Protocol)) + Q_ASSERT(protocol == QAbstractSocket::IPv4Protocol || protocol == QAbstractSocket::IPv6Protocol); + //Only take ipv4 for now? + if (protocol != QAbstractSocket::IPv4Protocol && protocol != QAbstractSocket::IPv6Protocol) return; - comboBoxInterfaceAddress.addItem(ip); + combo_iface_address.addItem(ip); //Try to select the last added one if (ip == currentAddress) - comboBoxInterfaceAddress.setCurrentIndex(comboBoxInterfaceAddress.count() - 1); + combo_iface_address.setCurrentIndex(combo_iface_address.count() - 1); }; if (ifaceName.isEmpty()) { @@ -299,7 +235,7 @@ void AdvancedSettings::loadAdvancedSettings() { - const Preferences *const pref = Preferences::instance(); + const Preferences* const pref = Preferences::instance(); const BitTorrent::Session *const session = BitTorrent::Session::instance(); // add section headers @@ -307,121 +243,78 @@ boldFont.setBold(true); addRow(QBITTORRENT_HEADER, tr("qBittorrent Section"), &labelQbtLink); item(QBITTORRENT_HEADER, PROPERTY)->setFont(boldFont); - labelQbtLink.setText(QString("
%2") - .arg("https://github.com/qbittorrent/qBittorrent/wiki/Explanation-of-Options-in-qBittorrent#Advanced", tr("Open documentation"))); + labelQbtLink.setText(QString("%2").arg("https://github.com/qbittorrent/qBittorrent/wiki/Explanation-of-Options-in-qBittorrent#Advanced").arg(tr("Open documentation"))); labelQbtLink.setOpenExternalLinks(true); addRow(LIBTORRENT_HEADER, tr("libtorrent Section"), &labelLibtorrentLink); item(LIBTORRENT_HEADER, PROPERTY)->setFont(boldFont); - labelLibtorrentLink.setText(QString("%2").arg("https://www.libtorrent.org/reference.html", tr("Open documentation"))); + labelLibtorrentLink.setText(QString("%2").arg("http://www.libtorrent.org/reference.html").arg(tr("Open documentation"))); labelLibtorrentLink.setOpenExternalLinks(true); - -#if LIBTORRENT_VERSION_NUM >= 10100 - // Async IO threads - spinBoxAsyncIOThreads.setMinimum(1); - spinBoxAsyncIOThreads.setMaximum(1024); - spinBoxAsyncIOThreads.setValue(session->asyncIOThreads()); - addRow(ASYNC_IO_THREADS, tr("Asynchronous I/O threads"), &spinBoxAsyncIOThreads); -#endif // Disk write cache - spinBoxCache.setMinimum(-1); + spin_cache.setMinimum(0); // When build as 32bit binary, set the maximum at less than 2GB to prevent crashes. // These macros may not be available on compilers other than MSVC and GCC #if defined(__x86_64__) || defined(_M_X64) - spinBoxCache.setMaximum(4096); + spin_cache.setMaximum(4096); #else // allocate 1536MiB and leave 512MiB to the rest of program data in RAM - spinBoxCache.setMaximum(1536); + spin_cache.setMaximum(1536); #endif - spinBoxCache.setValue(session->diskCacheSize()); - updateCacheSpinSuffix(spinBoxCache.value()); - addRow(DISK_CACHE, tr("Disk cache"), &spinBoxCache); + spin_cache.setValue(session->diskCacheSize()); + updateCacheSpinSuffix(spin_cache.value()); + addRow(DISK_CACHE, tr("Disk write cache size"), &spin_cache); // Disk cache expiry - spinBoxCacheTTL.setMinimum(15); - spinBoxCacheTTL.setMaximum(600); - spinBoxCacheTTL.setValue(session->diskCacheTTL()); - spinBoxCacheTTL.setSuffix(tr(" s", " seconds")); - addRow(DISK_CACHE_TTL, tr("Disk cache expiry interval"), &spinBoxCacheTTL); + spin_cache_ttl.setMinimum(15); + spin_cache_ttl.setMaximum(600); + spin_cache_ttl.setValue(session->diskCacheTTL()); + spin_cache_ttl.setSuffix(tr(" s", " seconds")); + addRow(DISK_CACHE_TTL, tr("Disk cache expiry interval"), &spin_cache_ttl); // Enable OS cache - checkBoxOsCache.setChecked(session->useOSCache()); - addRow(OS_CACHE, tr("Enable OS cache"), &checkBoxOsCache); - // Guided read cache - checkBoxGuidedReadCache.setChecked(session->isGuidedReadCacheEnabled()); - addRow(GUIDED_READ_CACHE, tr("Guided read cache"), &checkBoxGuidedReadCache); - // Coalesce reads & writes - checkBoxCoalesceRW.setChecked(session->isCoalesceReadWriteEnabled()); -#if LIBTORRENT_VERSION_NUM >= 10107 - addRow(COALESCE_RW, tr("Coalesce reads & writes"), &checkBoxCoalesceRW); -#endif - // Suggest mode - checkBoxSuggestMode.setChecked(session->isSuggestModeEnabled()); - addRow(SUGGEST_MODE, tr("Send upload piece suggestions"), &checkBoxSuggestMode); - // Send buffer watermark - spinBoxSendBufferWatermark.setMinimum(1); - spinBoxSendBufferWatermark.setMaximum(INT_MAX); - spinBoxSendBufferWatermark.setSuffix(tr(" KiB")); - spinBoxSendBufferWatermark.setValue(session->sendBufferWatermark()); - addRow(SEND_BUF_WATERMARK, tr("Send buffer watermark"), &spinBoxSendBufferWatermark); - spinBoxSendBufferLowWatermark.setMinimum(1); - spinBoxSendBufferLowWatermark.setMaximum(INT_MAX); - spinBoxSendBufferLowWatermark.setSuffix(tr(" KiB")); - spinBoxSendBufferLowWatermark.setValue(session->sendBufferLowWatermark()); - addRow(SEND_BUF_LOW_WATERMARK, tr("Send buffer low watermark"), &spinBoxSendBufferLowWatermark); - spinBoxSendBufferWatermarkFactor.setMinimum(1); - spinBoxSendBufferWatermarkFactor.setMaximum(INT_MAX); - spinBoxSendBufferWatermarkFactor.setSuffix(" %"); - spinBoxSendBufferWatermarkFactor.setValue(session->sendBufferWatermarkFactor()); - addRow(SEND_BUF_WATERMARK_FACTOR, tr("Send buffer watermark factor"), &spinBoxSendBufferWatermarkFactor); + cb_os_cache.setChecked(session->useOSCache()); + addRow(OS_CACHE, tr("Enable OS cache"), &cb_os_cache); // Save resume data interval - spinBoxSaveResumeDataInterval.setMinimum(0); - spinBoxSaveResumeDataInterval.setMaximum(std::numeric_limits::max()); - spinBoxSaveResumeDataInterval.setValue(session->saveResumeDataInterval()); - updateSaveResumeDataIntervalSuffix(spinBoxSaveResumeDataInterval.value()); - addRow(SAVE_RESUME_DATA_INTERVAL, tr("Save resume data interval", "How often the fastresume file is saved."), &spinBoxSaveResumeDataInterval); + spin_save_resume_data_interval.setMinimum(1); + spin_save_resume_data_interval.setMaximum(1440); + spin_save_resume_data_interval.setValue(session->saveResumeDataInterval()); + spin_save_resume_data_interval.setSuffix(tr(" m", " minutes")); + addRow(SAVE_RESUME_DATA_INTERVAL, tr("Save resume data interval", "How often the fastresume file is saved."), &spin_save_resume_data_interval); // Outgoing port Min - spinBoxOutgoingPortsMin.setMinimum(0); - spinBoxOutgoingPortsMin.setMaximum(65535); - spinBoxOutgoingPortsMin.setValue(session->outgoingPortsMin()); - addRow(OUTGOING_PORT_MIN, tr("Outgoing ports (Min) [0: Disabled]"), &spinBoxOutgoingPortsMin); + outgoing_ports_min.setMinimum(0); + outgoing_ports_min.setMaximum(65535); + outgoing_ports_min.setValue(session->outgoingPortsMin()); + addRow(OUTGOING_PORT_MIN, tr("Outgoing ports (Min) [0: Disabled]"), &outgoing_ports_min); // Outgoing port Min - spinBoxOutgoingPortsMax.setMinimum(0); - spinBoxOutgoingPortsMax.setMaximum(65535); - spinBoxOutgoingPortsMax.setValue(session->outgoingPortsMax()); - addRow(OUTGOING_PORT_MAX, tr("Outgoing ports (Max) [0: Disabled]"), &spinBoxOutgoingPortsMax); - // uTP-TCP mixed mode - comboBoxUtpMixedMode.addItems({tr("Prefer TCP"), tr("Peer proportional (throttles TCP)")}); - comboBoxUtpMixedMode.setCurrentIndex(static_cast(session->utpMixedMode())); - addRow(UTP_MIX_MODE, tr("%1-TCP mixed mode algorithm", "uTP-TCP mixed mode algorithm").arg(C_UTP), &comboBoxUtpMixedMode); - // multiple connections per IP - checkBoxMultiConnectionsPerIp.setChecked(session->multiConnectionsPerIpEnabled()); - addRow(MULTI_CONNECTIONS_PER_IP, tr("Allow multiple connections from the same IP address"), &checkBoxMultiConnectionsPerIp); + outgoing_ports_max.setMinimum(0); + outgoing_ports_max.setMaximum(65535); + outgoing_ports_max.setValue(session->outgoingPortsMax()); + addRow(OUTGOING_PORT_MAX, tr("Outgoing ports (Max) [0: Disabled]"), &outgoing_ports_max); // Recheck completed torrents - checkBoxRecheckCompleted.setChecked(pref->recheckTorrentsOnCompletion()); - addRow(RECHECK_COMPLETED, tr("Recheck torrents on completion"), &checkBoxRecheckCompleted); + cb_recheck_completed.setChecked(pref->recheckTorrentsOnCompletion()); + addRow(RECHECK_COMPLETED, tr("Recheck torrents on completion"), &cb_recheck_completed); // Transfer list refresh interval - spinBoxListRefresh.setMinimum(30); - spinBoxListRefresh.setMaximum(99999); - spinBoxListRefresh.setValue(session->refreshInterval()); - spinBoxListRefresh.setSuffix(tr(" ms", " milliseconds")); - addRow(LIST_REFRESH, tr("Transfer list refresh interval"), &spinBoxListRefresh); + spin_list_refresh.setMinimum(30); + spin_list_refresh.setMaximum(99999); + spin_list_refresh.setValue(session->refreshInterval()); + spin_list_refresh.setSuffix(tr(" ms", " milliseconds")); + addRow(LIST_REFRESH, tr("Transfer list refresh interval"), &spin_list_refresh); // Resolve Peer countries - checkBoxResolveCountries.setChecked(pref->resolvePeerCountries()); - addRow(RESOLVE_COUNTRIES, tr("Resolve peer countries (GeoIP)"), &checkBoxResolveCountries); + cb_resolve_countries.setChecked(pref->resolvePeerCountries()); + addRow(RESOLVE_COUNTRIES, tr("Resolve peer countries (GeoIP)"), &cb_resolve_countries); // Resolve peer hosts - checkBoxResolveHosts.setChecked(pref->resolvePeerHostNames()); - addRow(RESOLVE_HOSTS, tr("Resolve peer host names"), &checkBoxResolveHosts); + cb_resolve_hosts.setChecked(pref->resolvePeerHostNames()); + addRow(RESOLVE_HOSTS, tr("Resolve peer host names"), &cb_resolve_hosts); // Max Half Open connections - spinBoxMaxHalfOpen.setMinimum(0); - spinBoxMaxHalfOpen.setMaximum(99999); - spinBoxMaxHalfOpen.setValue(session->maxHalfOpenConnections()); - addRow(MAX_HALF_OPEN, tr("Maximum number of half-open connections [0: Unlimited]"), &spinBoxMaxHalfOpen); + spin_maxhalfopen.setMinimum(0); + spin_maxhalfopen.setMaximum(99999); + spin_maxhalfopen.setValue(session->maxHalfOpenConnections()); + addRow(MAX_HALF_OPEN, tr("Maximum number of half-open connections [0: Unlimited]"), &spin_maxhalfopen); // Super seeding - checkBoxSuperSeeding.setChecked(session->isSuperSeedingEnabled()); - addRow(SUPER_SEEDING, tr("Strict super seeding"), &checkBoxSuperSeeding); + cb_super_seeding.setChecked(session->isSuperSeedingEnabled()); + addRow(SUPER_SEEDING, tr("Strict super seeding"), &cb_super_seeding); // Network interface - comboBoxInterface.addItem(tr("Any interface", "i.e. Any network interface")); - const QString currentInterface = session->networkInterface(); - bool interfaceExists = currentInterface.isEmpty(); + combo_iface.addItem(tr("Any interface", "i.e. Any network interface")); + const QString current_iface = session->networkInterface(); + bool interface_exists = current_iface.isEmpty(); int i = 1; foreach (const QNetworkInterface& iface, QNetworkInterface::allInterfaces()) { // This line fixes a Qt bug => https://bugreports.qt.io/browse/QTBUG-52633 @@ -430,88 +323,72 @@ // https://github.com/qbittorrent/qBittorrent/pull/5135 if (iface.addressEntries().isEmpty()) continue; - comboBoxInterface.addItem(iface.humanReadableName(), iface.name()); - if (!currentInterface.isEmpty() && (iface.name() == currentInterface)) { - comboBoxInterface.setCurrentIndex(i); - interfaceExists = true; + if (iface.flags() & QNetworkInterface::IsLoopBack) continue; + combo_iface.addItem(iface.humanReadableName(), iface.name()); + if (!current_iface.isEmpty() && (iface.name() == current_iface)) { + combo_iface.setCurrentIndex(i); + interface_exists = true; } ++i; } // Saved interface does not exist, show it anyway - if (!interfaceExists) { - comboBoxInterface.addItem(session->networkInterfaceName(), currentInterface); - comboBoxInterface.setCurrentIndex(i); + if (!interface_exists) { + combo_iface.addItem(session->networkInterfaceName(), current_iface); + combo_iface.setCurrentIndex(i); } - addRow(NETWORK_IFACE, tr("Network Interface (requires restart)"), &comboBoxInterface); + addRow(NETWORK_IFACE, tr("Network Interface (requires restart)"), &combo_iface); // Network interface address updateInterfaceAddressCombo(); - addRow(NETWORK_IFACE_ADDRESS, tr("Optional IP Address to bind to (requires restart)"), &comboBoxInterfaceAddress); + addRow(NETWORK_IFACE_ADDRESS, tr("Optional IP Address to bind to (requires restart)"), &combo_iface_address); // Listen on IPv6 address - checkBoxListenIPv6.setChecked(session->isIPv6Enabled()); - addRow(NETWORK_LISTEN_IPV6, tr("Listen on IPv6 address (requires restart)"), &checkBoxListenIPv6); + cb_listen_ipv6.setChecked(session->isIPv6Enabled()); + addRow(NETWORK_LISTEN_IPV6, tr("Listen on IPv6 address (requires restart)"), &cb_listen_ipv6); // Announce IP - lineEditAnnounceIP.setText(session->announceIP()); - addRow(ANNOUNCE_IP, tr("IP Address to report to trackers (requires restart)"), &lineEditAnnounceIP); + txtAnnounceIP.setText(session->announceIP()); + addRow(ANNOUNCE_IP, tr("IP Address to report to trackers (requires restart)"), &txtAnnounceIP); // Program notifications - const MainWindow *const mainWindow = static_cast(QCoreApplication::instance())->mainWindow(); - checkBoxProgramNotifications.setChecked(mainWindow->isNotificationsEnabled()); - addRow(PROGRAM_NOTIFICATIONS, tr("Display notifications"), &checkBoxProgramNotifications); + const MainWindow * const mainWindow = static_cast(QCoreApplication::instance())->mainWindow(); + cb_program_notifications.setChecked(mainWindow->isNotificationsEnabled()); + addRow(PROGRAM_NOTIFICATIONS, tr("Display notifications"), &cb_program_notifications); // Torrent added notifications - checkBoxTorrentAddedNotifications.setChecked(mainWindow->isTorrentAddedNotificationsEnabled()); - addRow(TORRENT_ADDED_NOTIFICATIONS, tr("Display notifications for added torrents"), &checkBoxTorrentAddedNotifications); + cb_torrent_added_notifications.setChecked(mainWindow->isTorrentAddedNotificationsEnabled()); + addRow(TORRENT_ADDED_NOTIFICATIONS, tr("Display notifications for added torrents"), &cb_torrent_added_notifications); // Download tracker's favicon - checkBoxTrackerFavicon.setChecked(mainWindow->isDownloadTrackerFavicon()); - addRow(DOWNLOAD_TRACKER_FAVICON, tr("Download tracker's favicon"), &checkBoxTrackerFavicon); - // Save path history length - spinBoxSavePathHistoryLength.setRange(AddNewTorrentDialog::minPathHistoryLength, AddNewTorrentDialog::maxPathHistoryLength); - spinBoxSavePathHistoryLength.setValue(AddNewTorrentDialog::savePathHistoryLength()); - addRow(SAVE_PATH_HISTORY_LENGTH, tr("Save path history length"), &spinBoxSavePathHistoryLength); + cb_tracker_favicon.setChecked(mainWindow->isDownloadTrackerFavicon()); + addRow(DOWNLOAD_TRACKER_FAVICON, tr("Download tracker's favicon"), &cb_tracker_favicon); + // Tracker State - checkBoxTrackerStatus.setChecked(session->isTrackerEnabled()); - addRow(TRACKER_STATUS, tr("Enable embedded tracker"), &checkBoxTrackerStatus); + cb_tracker_status.setChecked(session->isTrackerEnabled()); + addRow(TRACKER_STATUS, tr("Enable embedded tracker"), &cb_tracker_status); // Tracker port - spinBoxTrackerPort.setMinimum(1); - spinBoxTrackerPort.setMaximum(65535); - spinBoxTrackerPort.setValue(pref->getTrackerPort()); - addRow(TRACKER_PORT, tr("Embedded tracker port"), &spinBoxTrackerPort); - // Choking algorithm - comboBoxChokingAlgorithm.addItems({tr("Fixed slots"), tr("Upload rate based")}); - comboBoxChokingAlgorithm.setCurrentIndex(static_cast(session->chokingAlgorithm())); - addRow(CHOKING_ALGORITHM, tr("Upload slots behavior"), &comboBoxChokingAlgorithm); - // Seed choking algorithm - comboBoxSeedChokingAlgorithm.addItems({tr("Round-robin"), tr("Fastest upload"), tr("Anti-leech")}); - comboBoxSeedChokingAlgorithm.setCurrentIndex(static_cast(session->seedChokingAlgorithm())); - addRow(SEED_CHOKING_ALGORITHM, tr("Upload choking algorithm"), &comboBoxSeedChokingAlgorithm); - + spin_tracker_port.setMinimum(1); + spin_tracker_port.setMaximum(65535); + spin_tracker_port.setValue(pref->getTrackerPort()); + addRow(TRACKER_PORT, tr("Embedded tracker port"), &spin_tracker_port); #if defined(Q_OS_WIN) || defined(Q_OS_MAC) - checkBoxUpdateCheck.setChecked(pref->isUpdateCheckEnabled()); - addRow(UPDATE_CHECK, tr("Check for software updates"), &checkBoxUpdateCheck); + cb_update_check.setChecked(pref->isUpdateCheckEnabled()); + addRow(UPDATE_CHECK, tr("Check for software updates"), &cb_update_check); #endif #if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) - checkBoxUseIconTheme.setChecked(pref->useSystemIconTheme()); - addRow(USE_ICON_THEME, tr("Use system icon theme"), &checkBoxUseIconTheme); + cb_use_icon_theme.setChecked(pref->useSystemIconTheme()); + addRow(USE_ICON_THEME, tr("Use system icon theme"), &cb_use_icon_theme); #endif // Torrent recheck confirmation - checkBoxConfirmTorrentRecheck.setChecked(pref->confirmTorrentRecheck()); - addRow(CONFIRM_RECHECK_TORRENT, tr("Confirm torrent recheck"), &checkBoxConfirmTorrentRecheck); - - // Remove all tags confirmation - checkBoxConfirmRemoveAllTags.setChecked(pref->confirmRemoveAllTags()); - addRow(CONFIRM_REMOVE_ALL_TAGS, tr("Confirm removal of all tags"), &checkBoxConfirmRemoveAllTags); - - // Announce to all trackers in a tier - checkBoxAnnounceAllTrackers.setChecked(session->announceToAllTrackers()); - addRow(ANNOUNCE_ALL_TRACKERS, tr("Always announce to all trackers in a tier"), &checkBoxAnnounceAllTrackers); - - // Announce to all tiers - checkBoxAnnounceAllTiers.setChecked(session->announceToAllTiers()); - addRow(ANNOUNCE_ALL_TIERS, tr("Always announce to all tiers"), &checkBoxAnnounceAllTiers); + cb_confirm_torrent_recheck.setChecked(pref->confirmTorrentRecheck()); + addRow(CONFIRM_RECHECK_TORRENT, tr("Confirm torrent recheck"), &cb_confirm_torrent_recheck); + // Announce to all trackers + cb_announce_all_trackers.setChecked(session->announceToAllTrackers()); + addRow(ANNOUNCE_ALL_TRACKERS, tr("Always announce to all trackers"), &cb_announce_all_trackers); } template -void AdvancedSettings::addRow(int row, const QString &rowText, T *widget) +void AdvancedSettings::addRow(int row, const QString &rowText, T* widget) { + // ignore mouse wheel event + static WheelEventEater filter; + widget->installEventFilter(&filter); + setItem(row, PROPERTY, new QTableWidgetItem(rowText)); setCellWidget(row, VALUE, widget); diff -Nru qbittorrent-4.1.3/src/gui/advancedsettings.h qbittorrent-3.3.15/src/gui/advancedsettings.h --- qbittorrent-4.1.3/src/gui/advancedsettings.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/advancedsettings.h 2017-08-03 20:30:10.000000000 +0000 @@ -29,14 +29,32 @@ #ifndef ADVANCEDSETTINGS_H #define ADVANCEDSETTINGS_H -#include -#include +#include #include -#include #include +#include +#include +#include #include -class AdvancedSettings : public QTableWidget + +class WheelEventEater: public QObject +{ + Q_OBJECT + +private: + bool eventFilter(QObject *obj, QEvent *event) + { + switch (event->type()) { + case QEvent::Wheel: + return true; + default: + return QObject::eventFilter(obj, event); + } + } +}; + +class AdvancedSettings: public QTableWidget { Q_OBJECT @@ -51,31 +69,27 @@ private slots: void updateCacheSpinSuffix(int value); - void updateSaveResumeDataIntervalSuffix(int value); void updateInterfaceAddressCombo(); private: void loadAdvancedSettings(); - template void addRow(int row, const QString &rowText, T *widget); + template void addRow(int row, const QString &rowText, T* widget); QLabel labelQbtLink, labelLibtorrentLink; - QSpinBox spinBoxAsyncIOThreads, spinBoxCache, spinBoxSaveResumeDataInterval, spinBoxOutgoingPortsMin, spinBoxOutgoingPortsMax, spinBoxListRefresh, spinBoxMaxHalfOpen, - spinBoxTrackerPort, spinBoxCacheTTL, spinBoxSendBufferWatermark, spinBoxSendBufferLowWatermark, - spinBoxSendBufferWatermarkFactor, spinBoxSavePathHistoryLength; - QCheckBox checkBoxOsCache, checkBoxRecheckCompleted, checkBoxResolveCountries, checkBoxResolveHosts, checkBoxSuperSeeding, - checkBoxProgramNotifications, checkBoxTorrentAddedNotifications, checkBoxTrackerFavicon, checkBoxTrackerStatus, - checkBoxConfirmTorrentRecheck, checkBoxConfirmRemoveAllTags, checkBoxListenIPv6, checkBoxAnnounceAllTrackers, checkBoxAnnounceAllTiers, - checkBoxGuidedReadCache, checkBoxMultiConnectionsPerIp, checkBoxSuggestMode, checkBoxCoalesceRW; - QComboBox comboBoxInterface, comboBoxInterfaceAddress, comboBoxUtpMixedMode, comboBoxChokingAlgorithm, comboBoxSeedChokingAlgorithm; - QLineEdit lineEditAnnounceIP; + QSpinBox spin_cache, spin_save_resume_data_interval, outgoing_ports_min, outgoing_ports_max, spin_list_refresh, spin_maxhalfopen, spin_tracker_port, spin_cache_ttl; + QCheckBox cb_os_cache, cb_recheck_completed, cb_resolve_countries, cb_resolve_hosts, cb_super_seeding, + cb_program_notifications, cb_torrent_added_notifications, cb_tracker_favicon, cb_tracker_status, + cb_confirm_torrent_recheck, cb_listen_ipv6, cb_announce_all_trackers; + QComboBox combo_iface, combo_iface_address; + QLineEdit txtAnnounceIP; // OS dependent settings #if defined(Q_OS_WIN) || defined(Q_OS_MAC) - QCheckBox checkBoxUpdateCheck; + QCheckBox cb_update_check; #endif #if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) - QCheckBox checkBoxUseIconTheme; + QCheckBox cb_use_icon_theme; #endif }; diff -Nru qbittorrent-4.1.3/src/gui/autoexpandabledialog.cpp qbittorrent-3.3.15/src/gui/autoexpandabledialog.cpp --- qbittorrent-4.1.3/src/gui/autoexpandabledialog.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/autoexpandabledialog.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2013 Nick Tiskov + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2013 Nick Tiskov * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,84 +24,98 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : daymansmail@gmail.com */ -#include "autoexpandabledialog.h" - #include #include "mainwindow.h" +#include "autoexpandabledialog.h" #include "ui_autoexpandabledialog.h" -#include "utils.h" -AutoExpandableDialog::AutoExpandableDialog(QWidget *parent) - : QDialog(parent) - , m_ui(new Ui::AutoExpandableDialog) -{ - m_ui->setupUi(this); +AutoExpandableDialog::AutoExpandableDialog(QWidget *parent) : QDialog(parent), ui(new Ui::AutoExpandableDialog) { + ui->setupUi(this); } -AutoExpandableDialog::~AutoExpandableDialog() -{ - delete m_ui; +AutoExpandableDialog::~AutoExpandableDialog() { + delete ui; } QString AutoExpandableDialog::getText(QWidget *parent, const QString &title, const QString &label, - QLineEdit::EchoMode mode, const QString &text, - bool *ok, const bool excludeExtension, Qt::InputMethodHints inputMethodHints) -{ - AutoExpandableDialog d(parent); - d.setWindowTitle(title); - d.m_ui->textLabel->setText(label); - d.m_ui->textEdit->setText(text); - d.m_ui->textEdit->setEchoMode(mode); - d.m_ui->textEdit->setInputMethodHints(inputMethodHints); - - d.m_ui->textEdit->selectAll(); - if (excludeExtension) { - int lastDotIndex = text.lastIndexOf('.'); - if ((lastDotIndex > 3) && (text.mid(lastDotIndex - 4, 4).toLower() == ".tar")) - lastDotIndex -= 4; - // Select file name without extension, except dot files like .gitignore - if (lastDotIndex > 0) - d.m_ui->textEdit->setSelection(0, lastDotIndex); - } - - bool res = d.exec(); - if (ok) - *ok = res; + QLineEdit::EchoMode mode, const QString &text, bool *ok, + Qt::InputMethodHints inputMethodHints) { + + AutoExpandableDialog d(parent); + d.setWindowTitle(title); + d.ui->textLabel->setText(label); + d.ui->textEdit->setText(text); + d.ui->textEdit->setEchoMode(mode); + d.ui->textEdit->setInputMethodHints(inputMethodHints); + + bool res = d.exec(); + if (ok) + *ok = res; - if (!res) return QString(); + if (!res) + return QString(); - return d.m_ui->textEdit->text(); + return d.ui->textEdit->text(); } -void AutoExpandableDialog::showEvent(QShowEvent *e) -{ - // Overriding showEvent is required for consistent UI with fixed size under custom DPI - QDialog::showEvent(e); - - // Show dialog and resize textbox to fit the text - // NOTE: For unknown reason QFontMetrics gets more accurate when called from showEvent. - int wd = m_ui->textEdit->fontMetrics().width(m_ui->textEdit->text()) + 4; - - if (!windowTitle().isEmpty()) { - // not really the font metrics in window title, so we enlarge it a bit, - // including the small icon and close button width - int w = fontMetrics().width(windowTitle()) * 1.8; - wd = std::max(wd, w); - } - - if (!m_ui->textLabel->text().isEmpty()) { - int w = m_ui->textLabel->fontMetrics().width(m_ui->textLabel->text()); - wd = std::max(wd, w); - } - - // Now resize the dialog to fit the contents - // max width of text from either of: label, title, textedit - // If the value is less than dialog default size, default size is used - if (wd > width()) { - QSize size = {width() - m_ui->verticalLayout->sizeHint().width() + wd, height()}; - Utils::Gui::resize(this, size); - } +void AutoExpandableDialog::showEvent(QShowEvent *e) { + // Overriding showEvent is required for consistent UI with fixed size under custom DPI + // Show dialog + QDialog::showEvent(e); + // and resize textbox to fit the text + + // NOTE: For some strange reason QFontMetrics gets more accurate + // when called from showEvent. Only 6 symbols off instead of 11 symbols off. + int textW = ui->textEdit->fontMetrics().width(ui->textEdit->text()) + 4; + int screenW = QApplication::desktop()->width() / 4; + int wd = textW; + + if (!windowTitle().isEmpty()) { + int _w = fontMetrics().width(windowTitle()); + if (_w > wd) + wd = _w; + } + + if (!ui->textLabel->text().isEmpty()) { + int _w = ui->textLabel->fontMetrics().width(ui->textLabel->text()); + if (_w > wd) + wd = _w; + } + + + // Now resize the dialog to fit the contents + // Maximum value is whichever is smaller: + // 1. screen width / 4 + // 2. max width of text from either of: label, title, textedit + // If the value is less than dialog default size default size is used + wd = textW < screenW ? textW : screenW; + if (wd > width()) + resize(width() - ui->horizontalLayout->sizeHint().width() + wd, height()); + + // Use old dialog behavior: prohibit resizing the dialog + setFixedHeight(height()); + + // Update geometry: center on screen + QDesktopWidget *desk = QApplication::desktop(); + MainWindow *wnd = qobject_cast(QApplication::activeWindow()); + QPoint p = QCursor::pos(); + + int screenNum = 0; + if (wnd == 0) + screenNum = desk->screenNumber(p); + else if (!wnd->isHidden()) + screenNum = desk->screenNumber(wnd); + else + screenNum = desk->screenNumber(p); + + QRect screenRes = desk->screenGeometry(screenNum); + + QRect geom = geometry(); + geom.moveCenter(QPoint(screenRes.width() / 2, screenRes.height() / 2)); + setGeometry(geom); } diff -Nru qbittorrent-4.1.3/src/gui/autoexpandabledialog.h qbittorrent-3.3.15/src/gui/autoexpandabledialog.h --- qbittorrent-4.1.3/src/gui/autoexpandabledialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/autoexpandabledialog.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2013 Nick Tiskov + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2013 Nick Tiskov * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,37 +24,37 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : daymansmail@gmail.com */ #ifndef AUTOEXPANDABLEDIALOG_H #define AUTOEXPANDABLEDIALOG_H #include -#include #include +#include -namespace Ui -{ - class AutoExpandableDialog; +namespace Ui { +class AutoExpandableDialog; } -class AutoExpandableDialog : public QDialog -{ - Q_OBJECT - +class AutoExpandableDialog : public QDialog { + Q_OBJECT + public: - explicit AutoExpandableDialog(QWidget *parent); - ~AutoExpandableDialog(); + explicit AutoExpandableDialog(QWidget *parent = 0); + ~AutoExpandableDialog(); - static QString getText(QWidget *parent, const QString &title, const QString &label, - QLineEdit::EchoMode mode = QLineEdit::Normal, const QString &text = QString(), - bool *ok = nullptr, bool excludeExtension = false, Qt::InputMethodHints inputMethodHints = Qt::ImhNone); + static QString getText(QWidget *parent, const QString& title, const QString& label, + QLineEdit::EchoMode mode = QLineEdit::Normal, const QString & text = QString(), + bool * ok = 0, Qt::InputMethodHints inputMethodHints = Qt::ImhNone); protected: - void showEvent(QShowEvent *e) override; - + void showEvent(QShowEvent *e); + private: - Ui::AutoExpandableDialog *m_ui; + Ui::AutoExpandableDialog *ui; }; #endif // AUTOEXPANDABLEDIALOG_H diff -Nru qbittorrent-4.1.3/src/gui/autoexpandabledialog.ui qbittorrent-3.3.15/src/gui/autoexpandabledialog.ui --- qbittorrent-4.1.3/src/gui/autoexpandabledialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/autoexpandabledialog.ui 2017-08-03 20:30:10.000000000 +0000 @@ -7,23 +7,79 @@ 0 0 222 - 105 + 94 + + + 0 + 0 + + + + Dialog + - + + + Qt::Vertical + + + + 20 + 40 + + + - + + + + + + + + - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + diff -Nru qbittorrent-4.1.3/src/gui/bandwidth_limit.ui qbittorrent-3.3.15/src/gui/bandwidth_limit.ui --- qbittorrent-4.1.3/src/gui/bandwidth_limit.ui 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/bandwidth_limit.ui 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,88 @@ + + + bandwidth_dlg + + + + 0 + 0 + 338 + 83 + + + + Bandwidth allocation + + + + + + + + Qt::Horizontal + + + + + + + + + + 65535 + + + 0 + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + rejected() + bandwidth_dlg + reject() + + + 221 + 73 + + + 221 + 82 + + + + + buttonBox + accepted() + bandwidth_dlg + accept() + + + 277 + 59 + + + 343 + 80 + + + + + diff -Nru qbittorrent-4.1.3/src/gui/banlistoptionsdialog.cpp qbittorrent-3.3.15/src/gui/banlistoptionsdialog.cpp --- qbittorrent-4.1.3/src/gui/banlistoptionsdialog.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/banlistoptionsdialog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,120 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2016 Alexandr Milovantsev - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "banlistoptionsdialog.h" - -#include -#include -#include -#include - -#include "base/bittorrent/session.h" -#include "base/utils/net.h" -#include "ui_banlistoptionsdialog.h" -#include "utils.h" - -BanListOptionsDialog::BanListOptionsDialog(QWidget *parent) - : QDialog(parent) - , m_ui(new Ui::BanListOptionsDialog) - , m_model(new QStringListModel(BitTorrent::Session::instance()->bannedIPs(), this)) - , m_modified(false) -{ - m_ui->setupUi(this); - - m_sortFilter = new QSortFilterProxyModel(this); - m_sortFilter->setDynamicSortFilter(true); - m_sortFilter->setSourceModel(m_model); - - m_ui->bannedIPList->setModel(m_sortFilter); - m_ui->bannedIPList->sortByColumn(0, Qt::AscendingOrder); - m_ui->buttonBanIP->setEnabled(false); - - Utils::Gui::resize(this); -} - -BanListOptionsDialog::~BanListOptionsDialog() -{ - delete m_ui; -} - -void BanListOptionsDialog::on_buttonBox_accepted() -{ - if (m_modified) { - // save to session - QStringList IPList; - // Operate on the m_sortFilter to grab the strings in sorted order - for (int i = 0; i < m_sortFilter->rowCount(); ++i) { - QModelIndex index = m_sortFilter->index(i, 0); - IPList << index.data().toString(); - } - BitTorrent::Session::instance()->setBannedIPs(IPList); - QDialog::accept(); - } - else { - QDialog::reject(); - } -} - -void BanListOptionsDialog::on_buttonBanIP_clicked() -{ - QString ip = m_ui->txtIP->text(); - if (!Utils::Net::isValidIP(ip)) { - QMessageBox::warning(this, tr("Warning"), tr("The entered IP address is invalid.")); - return; - } - // the same IPv6 addresses could be written in different forms; - // QHostAddress::toString() result format follows RFC5952; - // thus we avoid duplicate entries pointing to the same address - ip = QHostAddress(ip).toString(); - for (int i = 0; i < m_sortFilter->rowCount(); ++i) { - QModelIndex index = m_sortFilter->index(i, 0); - if (ip == index.data().toString()) { - QMessageBox::warning(this, tr("Warning"), tr("The entered IP is already banned.")); - return; - } - } - - m_model->insertRow(m_model->rowCount()); - m_model->setData(m_model->index(m_model->rowCount() - 1, 0), ip); - m_ui->txtIP->clear(); - m_modified = true; -} - -void BanListOptionsDialog::on_buttonDeleteIP_clicked() -{ - QModelIndexList selection = m_ui->bannedIPList->selectionModel()->selectedIndexes(); - for (auto &i : selection) - m_sortFilter->removeRow(i.row()); - - m_modified = true; -} - -void BanListOptionsDialog::on_txtIP_textChanged(const QString &ip) -{ - m_ui->buttonBanIP->setEnabled(Utils::Net::isValidIP(ip)); -} diff -Nru qbittorrent-4.1.3/src/gui/banlistoptionsdialog.h qbittorrent-3.3.15/src/gui/banlistoptionsdialog.h --- qbittorrent-4.1.3/src/gui/banlistoptionsdialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/banlistoptionsdialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,63 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2016 Alexandr Milovantsev - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef BANLISTOPTIONSDIALOG_H -#define BANLISTOPTIONSDIALOG_H - -#include - -class QSortFilterProxyModel; -class QStringListModel; - -namespace Ui -{ - class BanListOptionsDialog; -} - -class BanListOptionsDialog : public QDialog -{ - Q_OBJECT - -public: - explicit BanListOptionsDialog(QWidget *parent = nullptr); - ~BanListOptionsDialog(); - -private slots: - void on_buttonBox_accepted(); - void on_buttonBanIP_clicked(); - void on_buttonDeleteIP_clicked(); - void on_txtIP_textChanged(const QString &ip); - -private: - Ui::BanListOptionsDialog *m_ui; - QStringListModel *m_model; - QSortFilterProxyModel *m_sortFilter; - bool m_modified; -}; - -#endif // BANLISTOPTIONSDIALOG_H diff -Nru qbittorrent-4.1.3/src/gui/banlistoptionsdialog.ui qbittorrent-3.3.15/src/gui/banlistoptionsdialog.ui --- qbittorrent-4.1.3/src/gui/banlistoptionsdialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/banlistoptionsdialog.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,127 +0,0 @@ - - - BanListOptionsDialog - - - - 0 - 0 - 360 - 450 - - - - List of banned IP addresses - - - - - - true - - - - 0 - 0 - - - - true - - - QFrame::Panel - - - QFrame::Raised - - - 1 - - - 0 - - - - - - - 0 - 0 - - - - false - - - true - - - false - - - true - - - false - - - - - - - - - - - - Ban IP - - - - - - - Delete - - - - - - - - - - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - bannedIPList - txtIP - buttonBanIP - buttonDeleteIP - - - - - buttonBox - rejected() - BanListOptionsDialog - reject() - - - 179 - 427 - - - 179 - 224 - - - - - diff -Nru qbittorrent-4.1.3/src/gui/categoryfiltermodel.cpp qbittorrent-3.3.15/src/gui/categoryfiltermodel.cpp --- qbittorrent-4.1.3/src/gui/categoryfiltermodel.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/categoryfiltermodel.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -31,8 +31,8 @@ #include #include -#include "base/bittorrent/session.h" #include "base/bittorrent/torrenthandle.h" +#include "base/bittorrent/session.h" #include "guiiconprovider.h" class CategoryModelItem @@ -74,7 +74,7 @@ if (!m_parent || m_parent->name().isEmpty()) return m_name; - return QString("%1/%2").arg(m_parent->fullName(), m_name); + return QString("%1/%2").arg(m_parent->fullName()).arg(m_name); } CategoryModelItem *parent() const @@ -174,15 +174,17 @@ : QAbstractItemModel(parent) , m_rootItem(new CategoryModelItem) { - using namespace BitTorrent; - auto session = Session::instance(); + auto session = BitTorrent::Session::instance(); - connect(session, &Session::categoryAdded, this, &CategoryFilterModel::categoryAdded); - connect(session, &Session::categoryRemoved, this, &CategoryFilterModel::categoryRemoved); - connect(session, &Session::torrentCategoryChanged, this, &CategoryFilterModel::torrentCategoryChanged); - connect(session, &Session::subcategoriesSupportChanged, this, &CategoryFilterModel::subcategoriesSupportChanged); - connect(session, &Session::torrentAdded, this, &CategoryFilterModel::torrentAdded); - connect(session, &Session::torrentAboutToBeRemoved, this, &CategoryFilterModel::torrentAboutToBeRemoved); + connect(session, SIGNAL(categoryAdded(QString)), SLOT(categoryAdded(QString))); + connect(session, SIGNAL(categoryRemoved(QString)), SLOT(categoryRemoved(QString))); + connect(session, SIGNAL(torrentCategoryChanged(BitTorrent::TorrentHandle *const, QString)) + , SLOT(torrentCategoryChanged(BitTorrent::TorrentHandle *const, QString))); + connect(session, SIGNAL(subcategoriesSupportChanged()), SLOT(subcategoriesSupportChanged())); + connect(session, SIGNAL(torrentAdded(BitTorrent::TorrentHandle *const)) + , SLOT(torrentAdded(BitTorrent::TorrentHandle *const))); + connect(session, SIGNAL(torrentAboutToBeRemoved(BitTorrent::TorrentHandle *const)) + , SLOT(torrentAboutToBeRemoved(BitTorrent::TorrentHandle *const))); populate(); } @@ -228,7 +230,7 @@ Qt::ItemFlags CategoryFilterModel::flags(const QModelIndex &index) const { - if (!index.isValid()) return Qt::NoItemFlags; + if (!index.isValid()) return 0; return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } @@ -403,8 +405,7 @@ , [](Torrent *torrent) { return torrent->category().isEmpty(); }))); using Torrent = BitTorrent::TorrentHandle; - for (auto i = session->categories().cbegin(); i != session->categories().cend(); ++i) { - const QString &category = i.key(); + foreach (const QString &category, session->categories()) { if (m_isSubcategoriesEnabled) { CategoryModelItem *parent = m_rootItem; foreach (const QString &subcat, session->expandCategory(category)) { diff -Nru qbittorrent-4.1.3/src/gui/categoryfiltermodel.h qbittorrent-3.3.15/src/gui/categoryfiltermodel.h --- qbittorrent-4.1.3/src/gui/categoryfiltermodel.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/categoryfiltermodel.h 2017-08-03 20:30:10.000000000 +0000 @@ -30,6 +30,7 @@ #define CATEGORYFILTERMODEL_H #include +#include #include namespace BitTorrent @@ -39,7 +40,7 @@ class CategoryModelItem; -class CategoryFilterModel : public QAbstractItemModel +class CategoryFilterModel: public QAbstractItemModel { Q_OBJECT diff -Nru qbittorrent-4.1.3/src/gui/categoryfilterproxymodel.cpp qbittorrent-3.3.15/src/gui/categoryfilterproxymodel.cpp --- qbittorrent-4.1.3/src/gui/categoryfilterproxymodel.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/categoryfilterproxymodel.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -50,10 +50,8 @@ { // "All" and "Uncategorized" must be left in place if (CategoryFilterModel::isSpecialItem(left) || CategoryFilterModel::isSpecialItem(right)) - return (left < right); - - int result = Utils::String::naturalCompare(left.data().toString(), right.data().toString() - , Qt::CaseInsensitive); - - return (result < 0); + return left.row() < right.row(); + else + return Utils::String::naturalCompareCaseInsensitive( + left.data().toString(), right.data().toString()); } diff -Nru qbittorrent-4.1.3/src/gui/categoryfilterproxymodel.h qbittorrent-3.3.15/src/gui/categoryfilterproxymodel.h --- qbittorrent-4.1.3/src/gui/categoryfilterproxymodel.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/categoryfilterproxymodel.h 2017-08-03 20:30:10.000000000 +0000 @@ -32,7 +32,7 @@ #include #include -class CategoryFilterProxyModel : public QSortFilterProxyModel +class CategoryFilterProxyModel: public QSortFilterProxyModel { public: explicit CategoryFilterProxyModel(QObject *parent = nullptr); diff -Nru qbittorrent-4.1.3/src/gui/categoryfilterwidget.cpp qbittorrent-3.3.15/src/gui/categoryfilterwidget.cpp --- qbittorrent-4.1.3/src/gui/categoryfilterwidget.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/categoryfilterwidget.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -30,15 +30,16 @@ #include #include +#include #include +#include #include "base/bittorrent/session.h" -#include "base/global.h" +#include "base/utils/misc.h" +#include "autoexpandabledialog.h" #include "categoryfiltermodel.h" #include "categoryfilterproxymodel.h" #include "guiiconprovider.h" -#include "torrentcategorydialog.h" -#include "utils.h" namespace { @@ -69,23 +70,20 @@ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); setUniformRowHeights(true); setHeaderHidden(true); - setIconSize(Utils::Gui::smallIconSize()); -#ifdef Q_OS_MAC + setIconSize(Utils::Misc::smallIconSize()); +#if defined(Q_OS_MAC) setAttribute(Qt::WA_MacShowFocusRect, false); #endif - m_defaultIndentation = indentation(); - if (!BitTorrent::Session::instance()->isSubcategoriesEnabled()) - setIndentation(0); setContextMenuPolicy(Qt::CustomContextMenu); sortByColumn(0, Qt::AscendingOrder); setCurrentIndex(model()->index(0, 0)); - connect(this, &QTreeView::collapsed, this, &CategoryFilterWidget::callUpdateGeometry); - connect(this, &QTreeView::expanded, this, &CategoryFilterWidget::callUpdateGeometry); - connect(this, &QWidget::customContextMenuRequested, this, &CategoryFilterWidget::showMenu); - connect(selectionModel(), &QItemSelectionModel::currentRowChanged - , this, &CategoryFilterWidget::onCurrentRowChanged); - connect(model(), &QAbstractItemModel::modelReset, this, &CategoryFilterWidget::callUpdateGeometry); + connect(this, SIGNAL(collapsed(QModelIndex)), SLOT(callUpdateGeometry())); + connect(this, SIGNAL(expanded(QModelIndex)), SLOT(callUpdateGeometry())); + connect(this, SIGNAL(customContextMenuRequested(QPoint)), SLOT(showMenu(QPoint))); + connect(selectionModel(), SIGNAL(currentRowChanged(QModelIndex,QModelIndex)) + , SLOT(onCurrentRowChanged(QModelIndex,QModelIndex))); + connect(model(), SIGNAL(modelReset()), SLOT(callUpdateGeometry())); } QString CategoryFilterWidget::currentCategory() const @@ -112,7 +110,7 @@ QAction *addAct = menu.addAction( GuiIconProvider::instance()->getIcon("list-add") , tr("Add category...")); - connect(addAct, &QAction::triggered, this, &CategoryFilterWidget::addCategory); + connect(addAct, SIGNAL(triggered()), SLOT(addCategory())); auto selectedRows = selectionModel()->selectedRows(); if (!selectedRows.empty() && !CategoryFilterModel::isSpecialItem(selectedRows.first())) { @@ -120,65 +118,63 @@ QAction *addSubAct = menu.addAction( GuiIconProvider::instance()->getIcon("list-add") , tr("Add subcategory...")); - connect(addSubAct, &QAction::triggered, this, &CategoryFilterWidget::addSubcategory); + connect(addSubAct, SIGNAL(triggered()), SLOT(addSubcategory())); } - QAction *editAct = menu.addAction( - GuiIconProvider::instance()->getIcon("document-edit") - , tr("Edit category...")); - connect(editAct, &QAction::triggered, this, &CategoryFilterWidget::editCategory); - QAction *removeAct = menu.addAction( GuiIconProvider::instance()->getIcon("list-remove") , tr("Remove category")); - connect(removeAct, &QAction::triggered, this, &CategoryFilterWidget::removeCategory); + connect(removeAct, SIGNAL(triggered()), SLOT(removeCategory())); } QAction *removeUnusedAct = menu.addAction( GuiIconProvider::instance()->getIcon("list-remove") , tr("Remove unused categories")); - connect(removeUnusedAct, &QAction::triggered, this, &CategoryFilterWidget::removeUnusedCategories); + connect(removeUnusedAct, SIGNAL(triggered()), SLOT(removeUnusedCategories())); menu.addSeparator(); QAction *startAct = menu.addAction( GuiIconProvider::instance()->getIcon("media-playback-start") , tr("Resume torrents")); - connect(startAct, &QAction::triggered, this, &CategoryFilterWidget::actionResumeTorrentsTriggered); + connect(startAct, SIGNAL(triggered()), SIGNAL(actionResumeTorrentsTriggered())); QAction *pauseAct = menu.addAction( GuiIconProvider::instance()->getIcon("media-playback-pause") , tr("Pause torrents")); - connect(pauseAct, &QAction::triggered, this, &CategoryFilterWidget::actionPauseTorrentsTriggered); + connect(pauseAct, SIGNAL(triggered()), SIGNAL(actionPauseTorrentsTriggered())); QAction *deleteTorrentsAct = menu.addAction( GuiIconProvider::instance()->getIcon("edit-delete") , tr("Delete torrents")); - connect(deleteTorrentsAct, &QAction::triggered, this, &CategoryFilterWidget::actionDeleteTorrentsTriggered); + connect(deleteTorrentsAct, SIGNAL(triggered()), SIGNAL(actionDeleteTorrentsTriggered())); menu.exec(QCursor::pos()); } void CategoryFilterWidget::callUpdateGeometry() { - if (!BitTorrent::Session::instance()->isSubcategoriesEnabled()) - setIndentation(0); - else - setIndentation(m_defaultIndentation); - updateGeometry(); } QSize CategoryFilterWidget::sizeHint() const { - // The sizeHint must depend on viewportSizeHint, - // otherwise widget will not correctly adjust the - // size when subcategories are used. - const QSize viewportSize {viewportSizeHint()}; - return { - viewportSize.width(), - viewportSize.height() + static_cast(0.5 * sizeHintForRow(0)) - }; +#ifdef QBT_USES_QT5 + return viewportSizeHint(); +#else + int lastRow = model()->rowCount() - 1; + QModelIndex last = model()->index(lastRow, 0); + while ((lastRow >= 0) && isExpanded(last)) { + lastRow = model()->rowCount(last) - 1; + last = model()->index(lastRow, 0, last); + } + const QRect deepestRect = visualRect(last); + + if (!deepestRect.isValid()) + return viewport()->sizeHint(); + + return QSize(header()->length(), deepestRect.bottom() + 1); +#endif } QSize CategoryFilterWidget::minimumSizeHint() const @@ -203,19 +199,53 @@ updateGeometry(); } -void CategoryFilterWidget::addCategory() +QString CategoryFilterWidget::askCategoryName() { - TorrentCategoryDialog::createCategory(this); + bool ok; + QString category = ""; + bool invalid; + do { + invalid = false; + category = AutoExpandableDialog::getText( + this, tr("New Category"), tr("Category:"), QLineEdit::Normal, category, &ok); + if (ok && !category.isEmpty()) { + if (!BitTorrent::Session::isValidCategoryName(category)) { + QMessageBox::warning( + this, tr("Invalid category name") + , tr("Category name must not contain '\\'.\n" + "Category name must not start/end with '/'.\n" + "Category name must not contain '//' sequence.")); + invalid = true; + } + } + } while (invalid); + + return ok ? category : QString(); } -void CategoryFilterWidget::addSubcategory() +void CategoryFilterWidget::addCategory() { - TorrentCategoryDialog::createCategory(this, currentCategory()); + const QString category = askCategoryName(); + if (category.isEmpty()) return; + + if (BitTorrent::Session::instance()->categories().contains(category)) + QMessageBox::warning(this, tr("Category exists"), tr("Category name already exists.")); + else + BitTorrent::Session::instance()->addCategory(category); } -void CategoryFilterWidget::editCategory() +void CategoryFilterWidget::addSubcategory() { - TorrentCategoryDialog::editCategory(this, currentCategory()); + const QString subcat = askCategoryName(); + if (subcat.isEmpty()) return; + + const QString category = QString(QStringLiteral("%1/%2")).arg(currentCategory()).arg(subcat); + + if (BitTorrent::Session::instance()->categories().contains(category)) + QMessageBox::warning(this, tr("Category exists") + , tr("Subcategory name already exists in selected category.")); + else + BitTorrent::Session::instance()->addCategory(category); } void CategoryFilterWidget::removeCategory() @@ -231,9 +261,8 @@ void CategoryFilterWidget::removeUnusedCategories() { auto session = BitTorrent::Session::instance(); - for (const QString &category : copyAsConst(session->categories().keys())) { + foreach (const QString &category, session->categories()) if (model()->data(static_cast(model())->index(category), Qt::UserRole) == 0) session->removeCategory(category); - } updateGeometry(); } diff -Nru qbittorrent-4.1.3/src/gui/categoryfilterwidget.h qbittorrent-3.3.15/src/gui/categoryfilterwidget.h --- qbittorrent-4.1.3/src/gui/categoryfilterwidget.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/categoryfilterwidget.h 2017-08-03 20:30:10.000000000 +0000 @@ -28,10 +28,9 @@ #include -class CategoryFilterWidget : public QTreeView +class CategoryFilterWidget: public QTreeView { Q_OBJECT - Q_DISABLE_COPY(CategoryFilterWidget) public: explicit CategoryFilterWidget(QWidget *parent = nullptr); @@ -50,7 +49,6 @@ void callUpdateGeometry(); void addCategory(); void addSubcategory(); - void editCategory(); void removeCategory(); void removeUnusedCategories(); @@ -58,6 +56,5 @@ QSize sizeHint() const override; QSize minimumSizeHint() const override; void rowsInserted(const QModelIndex &parent, int start, int end) override; - - int m_defaultIndentation; + QString askCategoryName(); }; diff -Nru qbittorrent-4.1.3/src/gui/CMakeLists.txt qbittorrent-3.3.15/src/gui/CMakeLists.txt --- qbittorrent-4.1.3/src/gui/CMakeLists.txt 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/CMakeLists.txt 2017-08-03 20:30:10.000000000 +0000 @@ -1,8 +1,7 @@ set(CMAKE_AUTORCC True) set(CMAKE_AUTOUIC True) -add_library(qbt_gui_headers INTERFACE) -target_include_directories(qbt_gui_headers INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) +include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) add_subdirectory(lineedit) add_subdirectory(properties) @@ -10,155 +9,133 @@ add_subdirectory(rss) add_subdirectory(search) -add_library(qbt_gui STATIC -# headers -aboutdialog.h +if (UNIX AND NOT APPLE AND DBUS) + add_subdirectory(qtnotify) + include_directories(qtnotify) + list(APPEND QBT_GUI_OPTIONAL_LINK_LIBRARIES qbt_qtnotify) +endif (UNIX AND NOT APPLE AND DBUS) + +include_directories( +${CMAKE_CURRENT_BINARY_DIR}/properties +${CMAKE_CURRENT_BINARY_DIR}/rss +${CMAKE_CURRENT_BINARY_DIR}/search +lineedit/src +powermanagement +properties +rss +../app +) + +set(QBT_GUI_HEADERS +about_imp.h addnewtorrentdialog.h advancedsettings.h +advancedsettings.h autoexpandabledialog.h -banlistoptionsdialog.h categoryfiltermodel.h categoryfilterproxymodel.h categoryfilterwidget.h cookiesdialog.h cookiesmodel.h -deletionconfirmationdialog.h -downloadfromurldialog.h -executionlogwidget.h -fspathedit.h -fspathedit_p.h +deletionconfirmationdlg.h +downloadfromurldlg.h +executionlog.h guiiconprovider.h hidabletabwidget.h -ipsubnetwhitelistoptionsdialog.h +ico.h loglistwidget.h mainwindow.h -optionsdialog.h +messageboxraised.h +optionsdlg.h previewlistdelegate.h -previewselectdialog.h -raisedmessagebox.h +previewselect.h scanfoldersdelegate.h -shutdownconfirmdialog.h -speedlimitdialog.h +shutdownconfirmdlg.h +speedlimitdlg.h statsdialog.h statusbar.h -tagfiltermodel.h -tagfilterproxymodel.h -tagfilterwidget.h -torrentcategorydialog.h torrentcontentfiltermodel.h torrentcontentmodel.h torrentcontentmodelfile.h torrentcontentmodelfolder.h torrentcontentmodelitem.h torrentcontenttreeview.h -torrentcreatordialog.h -trackerlogindialog.h +torrentcreatordlg.h +torrentmodel.h +trackerlogin.h transferlistdelegate.h transferlistfilterswidget.h -transferlistmodel.h transferlistsortmodel.h transferlistwidget.h -updownratiodialog.h -utils.h +updownratiodlg.h +) -# sources +set(QBT_GUI_SOURCES addnewtorrentdialog.cpp advancedsettings.cpp autoexpandabledialog.cpp -banlistoptionsdialog.cpp categoryfiltermodel.cpp categoryfilterproxymodel.cpp categoryfilterwidget.cpp cookiesdialog.cpp cookiesmodel.cpp -downloadfromurldialog.cpp -executionlogwidget.cpp -fspathedit.cpp -fspathedit_p.cpp +executionlog.cpp guiiconprovider.cpp -ipsubnetwhitelistoptionsdialog.cpp +ico.cpp loglistwidget.cpp mainwindow.cpp -optionsdialog.cpp -previewselectdialog.cpp -raisedmessagebox.cpp +messageboxraised.cpp +optionsdlg.cpp +previewselect.cpp scanfoldersdelegate.cpp -shutdownconfirmdialog.cpp -speedlimitdialog.cpp +shutdownconfirmdlg.cpp +speedlimitdlg.cpp statsdialog.cpp statusbar.cpp -tagfiltermodel.cpp -tagfilterproxymodel.cpp -tagfilterwidget.cpp -torrentcategorydialog.cpp torrentcontentfiltermodel.cpp torrentcontentmodel.cpp torrentcontentmodelfile.cpp torrentcontentmodelfolder.cpp torrentcontentmodelitem.cpp torrentcontenttreeview.cpp -torrentcreatordialog.cpp -trackerlogindialog.cpp +torrentcreatordlg.cpp +torrentmodel.cpp +trackerlogin.cpp transferlistdelegate.cpp transferlistfilterswidget.cpp -transferlistmodel.cpp transferlistsortmodel.cpp transferlistwidget.cpp -updownratiodialog.cpp -utils.cpp +updownratiodlg.cpp +) -# forms -aboutdialog.ui +if (WIN32 OR APPLE) + list(APPEND QBT_GUI_HEADERS programupdater.h) + list(APPEND QBT_GUI_SOURCES programupdater.cpp) +endif (WIN32 OR APPLE) + +set(QBT_GUI_FORMS +mainwindow.ui +about.ui +cookiesdialog.ui +preview.ui +login.ui +downloadfromurldlg.ui +bandwidth_limit.ui +updownratiodlg.ui +confirmdeletiondlg.ui +executionlog.ui addnewtorrentdialog.ui autoexpandabledialog.ui -banlistoptionsdialog.ui -cookiesdialog.ui -deletionconfirmationdialog.ui -downloadfromurldialog.ui -executionlogwidget.ui -ipsubnetwhitelistoptionsdialog.ui -mainwindow.ui -optionsdialog.ui -previewselectdialog.ui -shutdownconfirmdialog.ui -speedlimitdialog.ui statsdialog.ui -torrentcategorydialog.ui -torrentcreatordialog.ui -trackerlogindialog.ui -updownratiodialog.ui +optionsdlg.ui +torrentcreatordlg.ui +shutdownconfirmdlg.ui ) -target_link_libraries(qbt_gui - PRIVATE - qbt_lineedit qbt_powermanagement qbt_rss qbt_properties qbt_searchengine - qbt_base - QtSingleApplication::QtSingleApplication -) +qbt_target_sources(about.qrc) -target_include_directories(qbt_gui - PRIVATE ../app - PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} +add_library(qbt_gui STATIC ${QBT_GUI_HEADERS} ${QBT_GUI_SOURCES} ${QBT_GUI_FORMS}) +target_link_libraries(qbt_gui qbt_lineedit qbt_powermanagement qbt_rss qbt_properties qbt_searchengine + ${QBT_GUI_OPTIONAL_LINK_LIBRARIES} qbt_base + QtSingleApplication::QtSingleApplication ) - -if (UNIX AND Qt5DBus_FOUND) - add_subdirectory(qtnotify) - target_link_libraries(qbt_gui PRIVATE qbt_qtnotify) -endif (UNIX AND Qt5DBus_FOUND) - -if (APPLE) - target_sources(qbt_gui PRIVATE macutilities.h macutilities.mm) - find_package(Qt5 ${requiredQtVersion} REQUIRED COMPONENTS MacExtras) - target_link_libraries(qbt_gui PRIVATE Qt5::MacExtras objc) -endif (APPLE) - -if (WIN32 OR APPLE) - target_sources(qbt_gui PRIVATE programupdater.h programupdater.cpp) -endif (WIN32 OR APPLE) - -qbt_target_sources(qBittorrent PRIVATE about.qrc) - -if(WIN32) - find_package(Qt5 ${requiredQtVersion} REQUIRED COMPONENTS WinExtras) - target_link_libraries(qbt_gui PRIVATE Qt5::WinExtras) -endif(WIN32) diff -Nru qbittorrent-4.1.3/src/gui/confirmdeletiondlg.ui qbittorrent-3.3.15/src/gui/confirmdeletiondlg.ui --- qbittorrent-4.1.3/src/gui/confirmdeletiondlg.ui 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/confirmdeletiondlg.ui 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,153 @@ + + + confirmDeletionDlg + + + + 0 + 0 + 463 + 128 + + + + + 0 + 0 + + + + Deletion confirmation + + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + deletion message goes here + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + + + + + + + + + false + + + Remember choice + + + + + + + 24 + 24 + + + + + + + + + 0 + 0 + + + + + true + + + + Also delete the files on the hard disk + + + + + + + + + + 0 + 0 + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + confirmDeletionDlg + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + confirmDeletionDlg + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff -Nru qbittorrent-4.1.3/src/gui/cookiesdialog.cpp qbittorrent-3.3.15/src/gui/cookiesdialog.cpp --- qbittorrent-4.1.3/src/gui/cookiesdialog.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/cookiesdialog.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -28,17 +28,14 @@ #include "cookiesdialog.h" -#include - -#include "base/net/downloadmanager.h" #include "base/settingsstorage.h" -#include "cookiesmodel.h" +#include "base/net/downloadmanager.h" #include "guiiconprovider.h" +#include "cookiesmodel.h" #include "ui_cookiesdialog.h" -#include "utils.h" -#define SETTINGS_KEY(name) QStringLiteral("CookiesDialog/" name) -const QString KEY_SIZE = SETTINGS_KEY("Size"); +#define SETTINGS_KEY(name) "CookiesDialog/" name +const QString KEY_GEOMETRY = SETTINGS_KEY("Geometry"); const QString KEY_COOKIESVIEWSTATE = SETTINGS_KEY("CookiesViewState"); CookiesDialog::CookiesDialog(QWidget *parent) @@ -51,8 +48,6 @@ setWindowIcon(GuiIconProvider::instance()->getIcon("preferences-web-browser-cookies")); m_ui->buttonAdd->setIcon(GuiIconProvider::instance()->getIcon("list-add")); m_ui->buttonDelete->setIcon(GuiIconProvider::instance()->getIcon("list-remove")); - m_ui->buttonAdd->setIconSize(Utils::Gui::mediumIconSize()); - m_ui->buttonDelete->setIconSize(Utils::Gui::mediumIconSize()); m_ui->treeView->setModel(m_cookiesModel); if (m_cookiesModel->rowCount() > 0) @@ -60,14 +55,14 @@ m_cookiesModel->index(0, 0), QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); - Utils::Gui::resize(this, SettingsStorage::instance()->loadValue(KEY_SIZE).toSize()); + restoreGeometry(SettingsStorage::instance()->loadValue(KEY_GEOMETRY).toByteArray()); m_ui->treeView->header()->restoreState( SettingsStorage::instance()->loadValue(KEY_COOKIESVIEWSTATE).toByteArray()); } CookiesDialog::~CookiesDialog() { - SettingsStorage::instance()->storeValue(KEY_SIZE, size()); + SettingsStorage::instance()->storeValue(KEY_GEOMETRY, saveGeometry()); SettingsStorage::instance()->storeValue( KEY_COOKIESVIEWSTATE, m_ui->treeView->header()->saveState()); delete m_ui; @@ -90,16 +85,5 @@ void CookiesDialog::onButtonDeleteClicked() { - QModelIndexList idxs = m_ui->treeView->selectionModel()->selectedRows(); - - // sort in descending order - std::sort(idxs.begin(), idxs.end(), - [](const QModelIndex &l, const QModelIndex &r) - { - return (l.row() > r.row()); - } - ); - - for (const QModelIndex &idx : idxs) - m_cookiesModel->removeRow(idx.row()); + m_cookiesModel->removeRow(m_ui->treeView->selectionModel()->currentIndex().row()); } diff -Nru qbittorrent-4.1.3/src/gui/cookiesdialog.h qbittorrent-3.3.15/src/gui/cookiesdialog.h --- qbittorrent-4.1.3/src/gui/cookiesdialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/cookiesdialog.h 2017-08-03 20:30:10.000000000 +0000 @@ -43,7 +43,7 @@ Q_OBJECT public: - explicit CookiesDialog(QWidget *parent = nullptr); + explicit CookiesDialog(QWidget *parent = 0); ~CookiesDialog(); public slots: diff -Nru qbittorrent-4.1.3/src/gui/cookiesdialog.ui qbittorrent-3.3.15/src/gui/cookiesdialog.ui --- qbittorrent-4.1.3/src/gui/cookiesdialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/cookiesdialog.ui 2017-08-03 20:30:10.000000000 +0000 @@ -17,17 +17,7 @@ - - - QAbstractItemView::AllEditTriggers - - - true - - - QAbstractItemView::ExtendedSelection - - + @@ -45,7 +35,17 @@ - + + + + + + + 20 + 20 + + + @@ -64,7 +64,17 @@ - + + + + + + + 20 + 20 + + + diff -Nru qbittorrent-4.1.3/src/gui/cookiesmodel.cpp qbittorrent-3.3.15/src/gui/cookiesmodel.cpp --- qbittorrent-4.1.3/src/gui/cookiesmodel.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/cookiesmodel.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -26,9 +26,8 @@ * exception statement from your version. */ -#include "cookiesmodel.h" - #include +#include "cookiesmodel.h" CookiesModel::CookiesModel(const QList &cookies, QObject *parent) : QAbstractItemModel(parent) @@ -44,7 +43,8 @@ QVariant CookiesModel::headerData(int section, Qt::Orientation orientation, int role) const { if ((role == Qt::DisplayRole) && (orientation == Qt::Horizontal)) { - switch (section) { + switch (section) + { case COL_DOMAIN: return tr("Domain"); case COL_PATH: @@ -145,7 +145,7 @@ if ((row < 0) || (row > m_cookies.size())) return false; QNetworkCookie newCookie; - newCookie.setExpirationDate(QDateTime::currentDateTime().addYears(2)); + newCookie.setExpirationDate(QDateTime::currentDateTime().addYears(99)); beginInsertRows(parent, row, row + count - 1); while (count-- > 0) @@ -172,7 +172,7 @@ Qt::ItemFlags CookiesModel::flags(const QModelIndex &index) const { - if (!index.isValid()) return Qt::NoItemFlags; + if (!index.isValid()) return 0; return Qt::ItemIsEditable | QAbstractItemModel::flags(index); } diff -Nru qbittorrent-4.1.3/src/gui/cookiesmodel.h qbittorrent-3.3.15/src/gui/cookiesmodel.h --- qbittorrent-4.1.3/src/gui/cookiesmodel.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/cookiesmodel.h 2017-08-03 20:30:10.000000000 +0000 @@ -49,7 +49,7 @@ NB_COLUMNS }; - explicit CookiesModel(const QList &cookies, QObject *parent = nullptr); + explicit CookiesModel(const QList &cookies, QObject *parent = 0); QList cookies() const; diff -Nru qbittorrent-4.1.3/src/gui/deletionconfirmationdialog.h qbittorrent-3.3.15/src/gui/deletionconfirmationdialog.h --- qbittorrent-4.1.3/src/gui/deletionconfirmationdialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/deletionconfirmationdialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,97 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef DELETIONCONFIRMATIONDIALOG_H -#define DELETIONCONFIRMATIONDIALOG_H - -#include -#include - -#include "base/preferences.h" -#include "base/utils/misc.h" -#include "base/utils/string.h" -#include "guiiconprovider.h" -#include "ui_deletionconfirmationdialog.h" -#include "utils.h" - -class DeletionConfirmationDialog : public QDialog, private Ui::DeletionConfirmationDialog -{ - Q_OBJECT - -public: - DeletionConfirmationDialog(QWidget *parent, const int &size, const QString &name, bool defaultDeleteFiles) - : QDialog(parent) - { - setupUi(this); - if (size == 1) - label->setText(tr("Are you sure you want to delete '%1' from the transfer list?", "Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list?").arg(name.toHtmlEscaped())); - else - label->setText(tr("Are you sure you want to delete these %1 torrents from the transfer list?", "Are you sure you want to delete these 5 torrents from the transfer list?").arg(QString::number(size))); - // Icons - const QSize iconSize = Utils::Gui::largeIconSize(); - labelWarning->setPixmap(GuiIconProvider::instance()->getIcon("dialog-warning").pixmap(iconSize)); - labelWarning->setFixedWidth(iconSize.width()); - rememberBtn->setIcon(GuiIconProvider::instance()->getIcon("object-locked")); - rememberBtn->setIconSize(Utils::Gui::mediumIconSize()); - - checkPermDelete->setChecked(defaultDeleteFiles || Preferences::instance()->deleteTorrentFilesAsDefault()); - connect(checkPermDelete, &QCheckBox::clicked, this, &DeletionConfirmationDialog::updateRememberButtonState); - buttonBox->button(QDialogButtonBox::Cancel)->setFocus(); - - Utils::Gui::resize(this); - } - - bool shouldDeleteLocalFiles() const - { - return checkPermDelete->isChecked(); - } - - static bool askForDeletionConfirmation(QWidget *parent, bool &deleteLocalFiles, const int &size, const QString &name) - { - DeletionConfirmationDialog dlg(parent, size, name, deleteLocalFiles); - if (dlg.exec() == QDialog::Accepted) { - deleteLocalFiles = dlg.shouldDeleteLocalFiles(); - return true; - } - return false; - } - -private slots: - void updateRememberButtonState() - { - rememberBtn->setEnabled(checkPermDelete->isChecked() != Preferences::instance()->deleteTorrentFilesAsDefault()); - } - - void on_rememberBtn_clicked() - { - Preferences::instance()->setDeleteTorrentFilesAsDefault(checkPermDelete->isChecked()); - rememberBtn->setEnabled(false); - } -}; - -#endif // DELETIONCONFIRMATIONDIALOG_H diff -Nru qbittorrent-4.1.3/src/gui/deletionconfirmationdialog.ui qbittorrent-3.3.15/src/gui/deletionconfirmationdialog.ui --- qbittorrent-4.1.3/src/gui/deletionconfirmationdialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/deletionconfirmationdialog.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,150 +0,0 @@ - - - DeletionConfirmationDialog - - - - 0 - 0 - 463 - 128 - - - - - 0 - 0 - - - - Deletion confirmation - - - - - - - - - 0 - 0 - - - - - - - - - - - - 0 - 0 - - - - deletion message goes here - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - true - - - - - - - - - - - false - - - Remember choice - - - - 24 - 24 - - - - - - - - - 0 - 0 - - - - - true - - - - Also delete the files on the hard disk - - - - - - - - - - 0 - 0 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - buttonBox - accepted() - DeletionConfirmationDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - DeletionConfirmationDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff -Nru qbittorrent-4.1.3/src/gui/deletionconfirmationdlg.h qbittorrent-3.3.15/src/gui/deletionconfirmationdlg.h --- qbittorrent-4.1.3/src/gui/deletionconfirmationdlg.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/deletionconfirmationdlg.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,87 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef DELETIONCONFIRMATIONDLG_H +#define DELETIONCONFIRMATIONDLG_H + +#include +#include +#include "ui_confirmdeletiondlg.h" +#include "base/preferences.h" +#include "base/utils/misc.h" +#include "base/utils/string.h" +#include "guiiconprovider.h" + +class DeletionConfirmationDlg : public QDialog, private Ui::confirmDeletionDlg { + Q_OBJECT + + public: + DeletionConfirmationDlg(QWidget *parent, const int &size, const QString &name, bool defaultDeleteFiles): QDialog(parent) { + setupUi(this); + if (size == 1) + label->setText(tr("Are you sure you want to delete '%1' from the transfer list?", "Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list?").arg(Utils::String::toHtmlEscaped(name))); + else + label->setText(tr("Are you sure you want to delete these %1 torrents from the transfer list?", "Are you sure you want to delete these 5 torrents from the transfer list?").arg(QString::number(size))); + // Icons + lbl_warn->setPixmap(GuiIconProvider::instance()->getIcon("dialog-warning").pixmap(lbl_warn->height())); + lbl_warn->setFixedWidth(lbl_warn->height()); + rememberBtn->setIcon(GuiIconProvider::instance()->getIcon("object-locked")); + + move(Utils::Misc::screenCenter(this)); + checkPermDelete->setChecked(defaultDeleteFiles || Preferences::instance()->deleteTorrentFilesAsDefault()); + connect(checkPermDelete, SIGNAL(clicked()), this, SLOT(updateRememberButtonState())); + buttonBox->button(QDialogButtonBox::Cancel)->setFocus(); + } + + bool shouldDeleteLocalFiles() const { + return checkPermDelete->isChecked(); + } + + static bool askForDeletionConfirmation(bool& deleteLocalFiles, const int& size, const QString& name) { + DeletionConfirmationDlg dlg(NULL, size, name, deleteLocalFiles); + if (dlg.exec() == QDialog::Accepted) { + deleteLocalFiles = dlg.shouldDeleteLocalFiles(); + return true; + } + return false; + } + +private slots: + void updateRememberButtonState() { + rememberBtn->setEnabled(checkPermDelete->isChecked() != Preferences::instance()->deleteTorrentFilesAsDefault()); + } + + void on_rememberBtn_clicked() { + Preferences::instance()->setDeleteTorrentFilesAsDefault(checkPermDelete->isChecked()); + rememberBtn->setEnabled(false); + } +}; + +#endif // DELETIONCONFIRMATIONDLG_H diff -Nru qbittorrent-4.1.3/src/gui/downloadfromurldialog.cpp qbittorrent-3.3.15/src/gui/downloadfromurldialog.cpp --- qbittorrent-4.1.3/src/gui/downloadfromurldialog.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/downloadfromurldialog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,111 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "downloadfromurldialog.h" - -#include -#include -#include -#include -#include -#include -#include - -#include "ui_downloadfromurldialog.h" -#include "utils.h" - -namespace -{ - bool isDownloadable(const QString &str) - { - return (str.startsWith("http://", Qt::CaseInsensitive) - || str.startsWith("https://", Qt::CaseInsensitive) - || str.startsWith("ftp://", Qt::CaseInsensitive) - || str.startsWith("magnet:", Qt::CaseInsensitive) - || str.startsWith("bc://bt/", Qt::CaseInsensitive) - || ((str.size() == 40) && !str.contains(QRegularExpression("[^0-9A-Fa-f]"))) - || ((str.size() == 32) && !str.contains(QRegularExpression("[^2-7A-Za-z]")))); - } -} - -DownloadFromURLDialog::DownloadFromURLDialog(QWidget *parent) - : QDialog(parent) - , m_ui(new Ui::DownloadFromURLDialog) -{ - m_ui->setupUi(this); - setAttribute(Qt::WA_DeleteOnClose); - setModal(true); - - m_ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Download")); - connect(m_ui->buttonBox, &QDialogButtonBox::accepted, this, &DownloadFromURLDialog::downloadButtonClicked); - connect(m_ui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); - - m_ui->textUrls->setWordWrapMode(QTextOption::NoWrap); - - // Paste clipboard if there is an URL in it - const QStringList clipboardList = qApp->clipboard()->text().split('\n'); - - QSet uniqueURLs; - for (QString str : clipboardList) { - str = str.trimmed(); - if (str.isEmpty()) continue; - - if (isDownloadable(str)) - uniqueURLs << str; - } - m_ui->textUrls->setText(uniqueURLs.toList().join('\n')); - - Utils::Gui::resize(this); - show(); -} - -DownloadFromURLDialog::~DownloadFromURLDialog() -{ - delete m_ui; -} - -void DownloadFromURLDialog::downloadButtonClicked() -{ - const QStringList urls = m_ui->textUrls->toPlainText().split('\n'); - - QSet uniqueURLs; - for (QString url : urls) { - url = url.trimmed(); - if (url.isEmpty()) continue; - - uniqueURLs << url; - } - - if (uniqueURLs.isEmpty()) { - QMessageBox::warning(this, tr("No URL entered"), tr("Please type at least one URL.")); - return; - } - - emit urlsReadyToBeDownloaded(uniqueURLs.toList()); - accept(); -} diff -Nru qbittorrent-4.1.3/src/gui/downloadfromurldialog.h qbittorrent-3.3.15/src/gui/downloadfromurldialog.h --- qbittorrent-4.1.3/src/gui/downloadfromurldialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/downloadfromurldialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef DOWNLOADFROMURL_H -#define DOWNLOADFROMURL_H - -#include - -namespace Ui -{ - class DownloadFromURLDialog; -} - -class DownloadFromURLDialog : public QDialog -{ - Q_OBJECT - Q_DISABLE_COPY(DownloadFromURLDialog) - -public: - explicit DownloadFromURLDialog(QWidget *parent); - ~DownloadFromURLDialog(); - -signals: - void urlsReadyToBeDownloaded(const QStringList &torrentURLs); - -private slots: - void downloadButtonClicked(); - -private: - Ui::DownloadFromURLDialog *m_ui; -}; - -#endif // DOWNLOADFROMURL_H diff -Nru qbittorrent-4.1.3/src/gui/downloadfromurldialog.ui qbittorrent-3.3.15/src/gui/downloadfromurldialog.ui --- qbittorrent-4.1.3/src/gui/downloadfromurldialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/downloadfromurldialog.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ - - - DownloadFromURLDialog - - - - 0 - 0 - 501 - 220 - - - - Download from URLs - - - - - - - 75 - true - - - - Add torrent links - - - - - - - true - - - false - - - - - - - - true - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - true - - - - - - - - diff -Nru qbittorrent-4.1.3/src/gui/downloadfromurldlg.h qbittorrent-3.3.15/src/gui/downloadfromurldlg.h --- qbittorrent-4.1.3/src/gui/downloadfromurldlg.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/downloadfromurldlg.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,109 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef DOWNLOADFROMURL_H +#define DOWNLOADFROMURL_H + +#include +#include +#include +#include +#include +#include +#include "ui_downloadfromurldlg.h" + +class downloadFromURL : public QDialog, private Ui::downloadFromURL{ + Q_OBJECT + + public: + downloadFromURL(QWidget *parent): QDialog(parent) { + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + setModal(true); + show(); + // Paste clipboard if there is an URL in it + QString clip_txt = qApp->clipboard()->text(); + QStringList clip_txt_list = clip_txt.split(QString::fromUtf8("\n")); + clip_txt.clear(); + QStringList clip_txt_list_cleaned; + foreach (clip_txt, clip_txt_list) { + clip_txt = clip_txt.trimmed(); + if (!clip_txt.isEmpty()) { + if (clip_txt_list_cleaned.indexOf(QRegExp(clip_txt, Qt::CaseInsensitive, QRegExp::FixedString)) < 0) { + if (clip_txt.startsWith("http://", Qt::CaseInsensitive) + || clip_txt.startsWith("https://", Qt::CaseInsensitive) + || clip_txt.startsWith("ftp://", Qt::CaseInsensitive) + || clip_txt.startsWith("magnet:", Qt::CaseInsensitive) + || clip_txt.startsWith("bc://bt/", Qt::CaseInsensitive) + || (clip_txt.size() == 40 && !clip_txt.contains(QRegExp("[^0-9A-Fa-f]"))) + || (clip_txt.size() == 32 && !clip_txt.contains(QRegExp("[^2-7A-Za-z]")))) { + clip_txt_list_cleaned << clip_txt; + } + } + } + } + if (clip_txt_list_cleaned.size() > 0) + textUrls->setText(clip_txt_list_cleaned.join("\n")); + } + + ~downloadFromURL() {} + + signals: + void urlsReadyToBeDownloaded(const QStringList& torrent_urls); + + public slots: + void on_downloadButton_clicked() { + QString urls = textUrls->toPlainText(); + QStringList url_list = urls.split(QString::fromUtf8("\n")); + QString url; + QStringList url_list_cleaned; + foreach (url, url_list) { + url = url.trimmed(); + if (!url.isEmpty()) { + if (url_list_cleaned.indexOf(QRegExp(url, Qt::CaseInsensitive, QRegExp::FixedString)) < 0) { + url_list_cleaned << url; + } + } + } + if (!url_list_cleaned.size()) { + QMessageBox::warning(0, tr("No URL entered"), tr("Please type at least one URL.")); + return; + } + emit urlsReadyToBeDownloaded(url_list_cleaned); + qDebug("Emitted urlsReadytobedownloaded signal"); + close(); + } + + void on_cancelButton_clicked() { + close(); + } +}; + +#endif diff -Nru qbittorrent-4.1.3/src/gui/downloadfromurldlg.ui qbittorrent-3.3.15/src/gui/downloadfromurldlg.ui --- qbittorrent-4.1.3/src/gui/downloadfromurldlg.ui 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/downloadfromurldlg.ui 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,110 @@ + + + downloadFromURL + + + + 0 + 0 + 482 + 220 + + + + Download from URLs + + + + + + + + + 75 + true + + + + Add torrent links + + + + + + + + + true + + + false + + + + + + + + 16777215 + 17 + + + + + true + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Download + + + + + + + Cancel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + diff -Nru qbittorrent-4.1.3/src/gui/executionlog.cpp qbittorrent-3.3.15/src/gui/executionlog.cpp --- qbittorrent-4.1.3/src/gui/executionlog.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/executionlog.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,111 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2011 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#include +#include +#include +#include +#include +#include "executionlog.h" +#include "ui_executionlog.h" +#include "guiiconprovider.h" +#include "loglistwidget.h" + +ExecutionLog::ExecutionLog(QWidget *parent, const Log::MsgTypes &types) + : QWidget(parent) + , ui(new Ui::ExecutionLog) + , m_peerList(new LogListWidget(MAX_LOG_MESSAGES)) +{ + ui->setupUi(this); + + m_msgList = new LogListWidget(MAX_LOG_MESSAGES, Log::MsgTypes(types)); + + ui->tabConsole->setTabIcon(0, GuiIconProvider::instance()->getIcon("view-calendar-journal")); + ui->tabConsole->setTabIcon(1, GuiIconProvider::instance()->getIcon("view-filter")); + ui->tabGeneral->layout()->addWidget(m_msgList); + ui->tabBan->layout()->addWidget(m_peerList); + + const Logger* const logger = Logger::instance(); + foreach (const Log::Msg& msg, logger->getMessages()) + addLogMessage(msg); + foreach (const Log::Peer& peer, logger->getPeers()) + addPeerMessage(peer); + connect(logger, SIGNAL(newLogMessage(const Log::Msg &)), SLOT(addLogMessage(const Log::Msg &))); + connect(logger, SIGNAL(newLogPeer(const Log::Peer &)), SLOT(addPeerMessage(const Log::Peer &))); +} + +ExecutionLog::~ExecutionLog() +{ + delete m_msgList; + delete m_peerList; + delete ui; +} + +void ExecutionLog::showMsgTypes(const Log::MsgTypes &types) +{ + m_msgList->showMsgTypes(types); +} + +void ExecutionLog::addLogMessage(const Log::Msg &msg) +{ + QString text; + QDateTime time = QDateTime::fromMSecsSinceEpoch(msg.timestamp); + QColor color; + + switch (msg.type) { + case Log::INFO: + color.setNamedColor("blue"); + break; + case Log::WARNING: + color.setNamedColor("orange"); + break; + case Log::CRITICAL: + color.setNamedColor("red"); + break; + default: + color = QApplication::palette().color(QPalette::WindowText); + } + + text = "" + time.toString(Qt::SystemLocaleShortDate) + " - " + msg.message + ""; + m_msgList->appendLine(text, msg.type); +} + +void ExecutionLog::addPeerMessage(const Log::Peer& peer) +{ + QString text; + QDateTime time = QDateTime::fromMSecsSinceEpoch(peer.timestamp); + + if (peer.blocked) + text = "" + time.toString(Qt::SystemLocaleShortDate) + " - " + tr("%1 was blocked %2", "x.y.z.w was blocked").arg(peer.ip).arg(peer.reason); + else + text = "" + time.toString(Qt::SystemLocaleShortDate) + " - " + tr("%1 was banned", "x.y.z.w was banned").arg(peer.ip); + + m_peerList->appendLine(text, Log::NORMAL); +} diff -Nru qbittorrent-4.1.3/src/gui/executionlog.h qbittorrent-3.3.15/src/gui/executionlog.h --- qbittorrent-4.1.3/src/gui/executionlog.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/executionlog.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,64 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2011 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef EXECUTIONLOG_H +#define EXECUTIONLOG_H + +#include +#include "base/logger.h" + +QT_BEGIN_NAMESPACE +namespace Ui { + class ExecutionLog; +} +QT_END_NAMESPACE +class LogListWidget; + +class ExecutionLog: public QWidget +{ + Q_OBJECT + +public: + ExecutionLog(QWidget *parent, const Log::MsgTypes &types); + void showMsgTypes(const Log::MsgTypes &types); + ~ExecutionLog(); + +private slots: + void addLogMessage(const Log::Msg &msg); + void addPeerMessage(const Log::Peer &peer); + +private: + Ui::ExecutionLog *ui; + + LogListWidget *m_msgList; + LogListWidget *m_peerList; +}; + +#endif // EXECUTIONLOG_H diff -Nru qbittorrent-4.1.3/src/gui/executionlog.ui qbittorrent-3.3.15/src/gui/executionlog.ui --- qbittorrent-4.1.3/src/gui/executionlog.ui 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/executionlog.ui 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,55 @@ + + + ExecutionLog + + + + 0 + 0 + 400 + 300 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + QTabWidget::East + + + 0 + + + + General + + + + + + Blocked IPs + + + + + + + + + + diff -Nru qbittorrent-4.1.3/src/gui/executionlogwidget.cpp qbittorrent-3.3.15/src/gui/executionlogwidget.cpp --- qbittorrent-4.1.3/src/gui/executionlogwidget.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/executionlogwidget.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,111 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2011 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "executionlogwidget.h" - -#include -#include -#include - -#include "guiiconprovider.h" -#include "loglistwidget.h" -#include "ui_executionlogwidget.h" - -ExecutionLogWidget::ExecutionLogWidget(QWidget *parent, const Log::MsgTypes &types) - : QWidget(parent) - , m_ui(new Ui::ExecutionLogWidget) - , m_msgList(new LogListWidget(MAX_LOG_MESSAGES, Log::MsgTypes(types))) - , m_peerList(new LogListWidget(MAX_LOG_MESSAGES)) -{ - m_ui->setupUi(this); - -#ifndef Q_OS_MAC - m_ui->tabConsole->setTabIcon(0, GuiIconProvider::instance()->getIcon("view-calendar-journal")); - m_ui->tabConsole->setTabIcon(1, GuiIconProvider::instance()->getIcon("view-filter")); -#endif - m_ui->tabGeneral->layout()->addWidget(m_msgList); - m_ui->tabBan->layout()->addWidget(m_peerList); - - const Logger *const logger = Logger::instance(); - foreach (const Log::Msg &msg, logger->getMessages()) - addLogMessage(msg); - foreach (const Log::Peer &peer, logger->getPeers()) - addPeerMessage(peer); - connect(logger, &Logger::newLogMessage, this, &ExecutionLogWidget::addLogMessage); - connect(logger, &Logger::newLogPeer, this, &ExecutionLogWidget::addPeerMessage); -} - -ExecutionLogWidget::~ExecutionLogWidget() -{ - delete m_msgList; - delete m_peerList; - delete m_ui; -} - -void ExecutionLogWidget::showMsgTypes(const Log::MsgTypes &types) -{ - m_msgList->showMsgTypes(types); -} - -void ExecutionLogWidget::addLogMessage(const Log::Msg &msg) -{ - QString text; - QDateTime time = QDateTime::fromMSecsSinceEpoch(msg.timestamp); - QColor color; - - switch (msg.type) { - case Log::INFO: - color.setNamedColor("blue"); - break; - case Log::WARNING: - color.setNamedColor("orange"); - break; - case Log::CRITICAL: - color.setNamedColor("red"); - break; - default: - color = QApplication::palette().color(QPalette::WindowText); - } - - text = "" + time.toString(Qt::SystemLocaleShortDate) + " - " + msg.message + ""; - m_msgList->appendLine(text, msg.type); -} - -void ExecutionLogWidget::addPeerMessage(const Log::Peer &peer) -{ - QString text; - QDateTime time = QDateTime::fromMSecsSinceEpoch(peer.timestamp); - - if (peer.blocked) - text = "" + time.toString(Qt::SystemLocaleShortDate) + " - " - + tr("%1 was blocked %2", "x.y.z.w was blocked").arg(peer.ip, peer.reason); - else - text = "" + time.toString(Qt::SystemLocaleShortDate) + " - " + tr("%1 was banned", "x.y.z.w was banned").arg(peer.ip); - - m_peerList->appendLine(text, Log::NORMAL); -} diff -Nru qbittorrent-4.1.3/src/gui/executionlogwidget.h qbittorrent-3.3.15/src/gui/executionlogwidget.h --- qbittorrent-4.1.3/src/gui/executionlogwidget.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/executionlogwidget.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2011 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef EXECUTIONLOGWIDGET_H -#define EXECUTIONLOGWIDGET_H - -#include -#include "base/logger.h" - -namespace Ui -{ - class ExecutionLogWidget; -} -class LogListWidget; - -class ExecutionLogWidget : public QWidget -{ - Q_OBJECT - -public: - ExecutionLogWidget(QWidget *parent, const Log::MsgTypes &types); - void showMsgTypes(const Log::MsgTypes &types); - ~ExecutionLogWidget(); - -private slots: - void addLogMessage(const Log::Msg &msg); - void addPeerMessage(const Log::Peer &peer); - -private: - Ui::ExecutionLogWidget *m_ui; - - LogListWidget *m_msgList; - LogListWidget *m_peerList; -}; - -#endif // EXECUTIONLOGWIDGET_H diff -Nru qbittorrent-4.1.3/src/gui/executionlogwidget.ui qbittorrent-3.3.15/src/gui/executionlogwidget.ui --- qbittorrent-4.1.3/src/gui/executionlogwidget.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/executionlogwidget.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ - - - ExecutionLogWidget - - - - 0 - 0 - 400 - 300 - - - - Form - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QTabWidget::East - - - 0 - - - - General - - - - - - Blocked IPs - - - - - - - - - - diff -Nru qbittorrent-4.1.3/src/gui/fspathedit.cpp qbittorrent-3.3.15/src/gui/fspathedit.cpp --- qbittorrent-4.1.3/src/gui/fspathedit.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/fspathedit.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,386 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2016 Eugene Shalygin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "fspathedit.h" - -#include -#include -#include -#include -#include -#include -#include - -#include "base/utils/fs.h" -#include "fspathedit_p.h" - -namespace -{ - struct TrStringWithComment - { - const char *source; - const char *comment; - - QString tr() const - { - return QCoreApplication::translate("FileSystemPathEdit", source, comment); - } - }; - - constexpr TrStringWithComment browseButtonBriefText = - QT_TRANSLATE_NOOP3("FileSystemPathEdit", "...", "Launch file dialog button text (brief)"); - constexpr TrStringWithComment browseButtonFullText = - QT_TRANSLATE_NOOP3("FileSystemPathEdit", "&Browse...", "Launch file dialog button text (full)"); - constexpr TrStringWithComment defaultDialogCaptionForFile = - QT_TRANSLATE_NOOP3("FileSystemPathEdit", "Choose a file", "Caption for file open/save dialog"); - constexpr TrStringWithComment defaultDialogCaptionForDirectory = - QT_TRANSLATE_NOOP3("FileSystemPathEdit", "Choose a folder", "Caption for directory open dialog"); -} - -class FileSystemPathEdit::FileSystemPathEditPrivate -{ - Q_DECLARE_PUBLIC(FileSystemPathEdit) - Q_DISABLE_COPY(FileSystemPathEditPrivate) - - FileSystemPathEditPrivate(FileSystemPathEdit *q, Private::FileEditorWithCompletion *editor); - - void modeChanged(); - void browseActionTriggered(); - QString dialogCaptionOrDefault() const; - - FileSystemPathEdit *q_ptr; - QScopedPointer m_editor; - QAction *m_browseAction; - QToolButton *m_browseBtn; - QString m_fileNameFilter; - Mode m_mode; - QString m_lastSignaledPath; - QString m_dialogCaption; - Private::FileSystemPathValidator *m_validator; -}; - -FileSystemPathEdit::FileSystemPathEditPrivate::FileSystemPathEditPrivate( - FileSystemPathEdit *q, Private::FileEditorWithCompletion *editor) - : q_ptr {q} - , m_editor {editor} - , m_browseAction {new QAction(q)} - , m_browseBtn {new QToolButton(q)} - , m_mode {FileSystemPathEdit::Mode::FileOpen} - , m_validator {new Private::FileSystemPathValidator(q)} -{ - m_browseAction->setIconText(browseButtonBriefText.tr()); - m_browseAction->setText(browseButtonFullText.tr()); - m_browseAction->setToolTip(browseButtonFullText.tr().remove(QLatin1Char('&'))); - m_browseAction->setShortcut(Qt::CTRL + Qt::Key_B); - m_browseBtn->setDefaultAction(m_browseAction); - m_fileNameFilter = tr("Any file") + QLatin1String(" (*)"); - m_editor->setBrowseAction(m_browseAction); - m_validator->setStrictMode(false); - m_editor->setValidator(m_validator); - modeChanged(); -} - -void FileSystemPathEdit::FileSystemPathEditPrivate::browseActionTriggered() -{ - Q_Q(FileSystemPathEdit); - QString filter = q->fileNameFilter(); - QString directory = q->currentDirectory().isEmpty() ? QDir::homePath() : q->currentDirectory(); - - QString selectedPath; - switch (m_mode) { - case FileSystemPathEdit::Mode::FileOpen: - selectedPath = QFileDialog::getOpenFileName(q, dialogCaptionOrDefault(), directory, filter); - break; - case FileSystemPathEdit::Mode::FileSave: - selectedPath = QFileDialog::getSaveFileName(q, dialogCaptionOrDefault(), directory, filter, &filter); - break; - case FileSystemPathEdit::Mode::DirectoryOpen: - case FileSystemPathEdit::Mode::DirectorySave: - selectedPath = QFileDialog::getExistingDirectory(q, dialogCaptionOrDefault(), - directory, QFileDialog::DontResolveSymlinks | QFileDialog::ShowDirsOnly); - break; - default: - throw std::logic_error("Unknown FileSystemPathEdit mode"); - } - if (!selectedPath.isEmpty()) - q->setEditWidgetText(Utils::Fs::toNativePath(selectedPath)); -} - -QString FileSystemPathEdit::FileSystemPathEditPrivate::dialogCaptionOrDefault() const -{ - if (!m_dialogCaption.isEmpty()) - return m_dialogCaption; - - switch (m_mode) { - case FileSystemPathEdit::Mode::FileOpen: - case FileSystemPathEdit::Mode::FileSave: - return defaultDialogCaptionForFile.tr(); - case FileSystemPathEdit::Mode::DirectoryOpen: - case FileSystemPathEdit::Mode::DirectorySave: - return defaultDialogCaptionForDirectory.tr(); - default: - throw std::logic_error("Unknown FileSystemPathEdit mode"); - } -} - -void FileSystemPathEdit::FileSystemPathEditPrivate::modeChanged() -{ - QStyle::StandardPixmap pixmap = QStyle::SP_DialogOpenButton; - bool showDirsOnly = false; - switch (m_mode) { - case FileSystemPathEdit::Mode::FileOpen: - case FileSystemPathEdit::Mode::FileSave: -#ifdef Q_OS_WIN - pixmap = QStyle::SP_DirOpenIcon; -#endif - showDirsOnly = false; - break; - case FileSystemPathEdit::Mode::DirectoryOpen: - case FileSystemPathEdit::Mode::DirectorySave: - pixmap = QStyle::SP_DirOpenIcon; - showDirsOnly = true; - break; - default: - throw std::logic_error("Unknown FileSystemPathEdit mode"); - } - m_browseAction->setIcon(QApplication::style()->standardIcon(pixmap)); - m_editor->completeDirectoriesOnly(showDirsOnly); - - m_validator->setExistingOnly(m_mode != FileSystemPathEdit::Mode::FileSave); - m_validator->setDirectoriesOnly((m_mode == FileSystemPathEdit::Mode::DirectoryOpen) || (m_mode == FileSystemPathEdit::Mode::DirectorySave)); - m_validator->setCheckReadPermission((m_mode == FileSystemPathEdit::Mode::FileOpen) || (m_mode == FileSystemPathEdit::Mode::DirectoryOpen)); - m_validator->setCheckWritePermission((m_mode == FileSystemPathEdit::Mode::FileSave) || (m_mode == FileSystemPathEdit::Mode::DirectorySave)); -} - -FileSystemPathEdit::FileSystemPathEdit(Private::FileEditorWithCompletion *editor, QWidget *parent) - : QWidget(parent) - , d_ptr(new FileSystemPathEditPrivate(this, editor)) -{ - Q_D(FileSystemPathEdit); - editor->widget()->setParent(this); - - QHBoxLayout *layout = new QHBoxLayout(this); - layout->setContentsMargins(0, 0, 0, 0); - layout->addWidget(editor->widget()); - layout->addWidget(d->m_browseBtn); - - connect(d->m_browseAction, &QAction::triggered, this, [this]() { this->d_func()->browseActionTriggered(); }); -} - -FileSystemPathEdit::~FileSystemPathEdit() = default; - -QString FileSystemPathEdit::selectedPath() const -{ - return Utils::Fs::fromNativePath(editWidgetText()); -} - -void FileSystemPathEdit::setSelectedPath(const QString &val) -{ - Q_D(FileSystemPathEdit); - setEditWidgetText(Utils::Fs::toNativePath(val)); - d->m_editor->widget()->setToolTip(val); -} - -QString FileSystemPathEdit::fileNameFilter() const -{ - Q_D(const FileSystemPathEdit); - return d->m_fileNameFilter; -} - -void FileSystemPathEdit::setFileNameFilter(const QString &val) -{ - Q_D(FileSystemPathEdit); - d->m_fileNameFilter = val; - -#if 0 - // QFileSystemModel applies name filters to directories too. - // To use the filters we have to subclass QFileSystemModel and skip directories while filtering - // extract file masks - const int openBracePos = val.indexOf(QLatin1Char('('), 0); - const int closeBracePos = val.indexOf(QLatin1Char(')'), openBracePos + 1); - if ((openBracePos > 0) && (closeBracePos > 0) && (closeBracePos > openBracePos + 2)) { - QString filterString = val.mid(openBracePos + 1, closeBracePos - openBracePos - 1); - if (filterString == QLatin1String("*")) { // no filters - d->m_editor->setFilenameFilters({}); - } - else { - QStringList filters = filterString.split(QLatin1Char(' '), QString::SkipEmptyParts); - d->m_editor->setFilenameFilters(filters); - } - } - else { - d->m_editor->setFilenameFilters({}); - } -#endif -} - -bool FileSystemPathEdit::briefBrowseButtonCaption() const -{ - Q_D(const FileSystemPathEdit); - return d->m_browseBtn->text() == browseButtonBriefText.tr(); -} - -void FileSystemPathEdit::setBriefBrowseButtonCaption(bool brief) -{ - Q_D(FileSystemPathEdit); - d->m_browseBtn->setText(brief ? browseButtonBriefText.tr() : browseButtonFullText.tr()); -} - -void FileSystemPathEdit::onPathEdited() -{ - Q_D(FileSystemPathEdit); - QString newPath = selectedPath(); - if (newPath != d->m_lastSignaledPath) { - emit selectedPathChanged(newPath); - d->m_lastSignaledPath = newPath; - d->m_editor->widget()->setToolTip(editWidgetText()); - } -} - -FileSystemPathEdit::Mode FileSystemPathEdit::mode() const -{ - Q_D(const FileSystemPathEdit); - return d->m_mode; -} - -void FileSystemPathEdit::setMode(FileSystemPathEdit::Mode theMode) -{ - Q_D(FileSystemPathEdit); - d->m_mode = theMode; - d->modeChanged(); -} - -QString FileSystemPathEdit::dialogCaption() const -{ - Q_D(const FileSystemPathEdit); - return d->m_dialogCaption; -} - -void FileSystemPathEdit::setDialogCaption(const QString &caption) -{ - Q_D(FileSystemPathEdit); - d->m_dialogCaption = caption; -} - -QString FileSystemPathEdit::currentDirectory() const -{ - return QFileInfo(selectedPath()).absoluteDir().absolutePath(); -} - -QWidget *FileSystemPathEdit::editWidgetImpl() const -{ - Q_D(const FileSystemPathEdit); - return d->m_editor->widget(); -} - -// ------------------------- FileSystemPathLineEdit ---------------------- -FileSystemPathLineEdit::FileSystemPathLineEdit(QWidget *parent) - : FileSystemPathEdit(new WidgetType(), parent) -{ - connect(editWidget(), &QLineEdit::editingFinished, this, &FileSystemPathLineEdit::onPathEdited); - connect(editWidget(), &QLineEdit::textChanged, this, &FileSystemPathLineEdit::onPathEdited); -} - -QString FileSystemPathLineEdit::editWidgetText() const -{ - return editWidget()->text(); -} - -void FileSystemPathLineEdit::clear() -{ - editWidget()->clear(); -} - -void FileSystemPathLineEdit::setEditWidgetText(const QString &text) -{ - editWidget()->setText(text); -} - -// ----------------------- FileSystemPathComboEdit ----------------------- -FileSystemPathComboEdit::FileSystemPathComboEdit(QWidget *parent) - : FileSystemPathEdit(new WidgetType(), parent) -{ - editWidget()->setEditable(true); - connect(editWidget(), &QComboBox::currentTextChanged, this, &FileSystemPathComboEdit::onPathEdited); - connect(editWidget()->lineEdit(), &QLineEdit::editingFinished, this, &FileSystemPathComboEdit::onPathEdited); -} - -void FileSystemPathComboEdit::clear() -{ - editWidget()->clear(); -} - -int FileSystemPathComboEdit::count() const -{ - return editWidget()->count(); -} - -QString FileSystemPathComboEdit::item(int index) const -{ - return Utils::Fs::fromNativePath(editWidget()->itemText(index)); -} - -void FileSystemPathComboEdit::addItem(const QString &text) -{ - editWidget()->addItem(Utils::Fs::toNativePath(text)); -} - -void FileSystemPathComboEdit::insertItem(int index, const QString& text) -{ - editWidget()->insertItem(index, Utils::Fs::toNativePath(text)); -} - -int FileSystemPathComboEdit::currentIndex() const -{ - return editWidget()->currentIndex(); -} - -void FileSystemPathComboEdit::setCurrentIndex(int index) -{ - editWidget()->setCurrentIndex(index); -} - -int FileSystemPathComboEdit::maxVisibleItems() const -{ - return editWidget()->maxVisibleItems(); -} - -void FileSystemPathComboEdit::setMaxVisibleItems(int maxItems) -{ - editWidget()->setMaxVisibleItems(maxItems); -} - -QString FileSystemPathComboEdit::editWidgetText() const -{ - return editWidget()->currentText(); -} - -void FileSystemPathComboEdit::setEditWidgetText(const QString &text) -{ - editWidget()->setCurrentText(text); -} diff -Nru qbittorrent-4.1.3/src/gui/fspathedit.h qbittorrent-3.3.15/src/gui/fspathedit.h --- qbittorrent-4.1.3/src/gui/fspathedit.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/fspathedit.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,154 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2016 Eugene Shalygin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef QBT_FSPATHEDIT_H -#define QBT_FSPATHEDIT_H - -#include -#include - -namespace Private -{ - class FileComboEdit; - class FileEditorWithCompletion; - class FileLineEdit; -} - -/*! - * \brief - * Widget for editing strings which are paths in filesystem - */ -class FileSystemPathEdit : public QWidget -{ - Q_OBJECT - Q_ENUMS(Mode) - Q_PROPERTY(Mode mode READ mode WRITE setMode) - Q_PROPERTY(QString selectedPath READ selectedPath WRITE setSelectedPath NOTIFY selectedPathChanged) - Q_PROPERTY(QString fileNameFilter READ fileNameFilter WRITE setFileNameFilter) - Q_PROPERTY(QString dialogCaption READ dialogCaption WRITE setDialogCaption) - -public: - ~FileSystemPathEdit() override; - - enum class Mode - { - FileOpen, //!< opening files, shows open file dialog - FileSave, //!< saving files, shows save file dialog - DirectoryOpen, //!< selecting existing directories - DirectorySave //!< selecting directories for saving - }; - - Mode mode() const; - void setMode(Mode mode); - - QString currentDirectory() const; - QString selectedPath() const; - void setSelectedPath(const QString &val); - - QString fileNameFilter() const; - void setFileNameFilter(const QString &val); - - /// The browse button caption is "..." if true, and "Browse" otherwise - bool briefBrowseButtonCaption() const; - void setBriefBrowseButtonCaption(bool brief); - - QString dialogCaption() const; - void setDialogCaption(const QString &caption); - - virtual void clear() = 0; - -signals: - void selectedPathChanged(const QString &path); - -protected: - explicit FileSystemPathEdit(Private::FileEditorWithCompletion *editor, QWidget *parent); - - template - Widget *editWidget() const - { - return static_cast(editWidgetImpl()); - } - -protected slots: - void onPathEdited(); - -private: - virtual QString editWidgetText() const = 0; - virtual void setEditWidgetText(const QString &text) = 0; - - QWidget *editWidgetImpl() const; - Q_DISABLE_COPY(FileSystemPathEdit) - class FileSystemPathEditPrivate; - Q_DECLARE_PRIVATE(FileSystemPathEdit) - QScopedPointer const d_ptr; -}; - -/// Widget which uses QLineEdit for path editing -class FileSystemPathLineEdit : public FileSystemPathEdit -{ - using base = FileSystemPathEdit; - using WidgetType = Private::FileLineEdit; - -public: - explicit FileSystemPathLineEdit(QWidget *parent = nullptr); - - void clear() override; - -private: - QString editWidgetText() const override; - void setEditWidgetText(const QString &text) override; -}; - -/// Widget which uses QComboBox for path editing -class FileSystemPathComboEdit : public FileSystemPathEdit -{ - using base = FileSystemPathEdit; - using WidgetType = Private::FileComboEdit; - -public: - explicit FileSystemPathComboEdit(QWidget *parent = nullptr); - - void clear() override; - - int count() const; - QString item(int index) const; - void addItem(const QString &text); - void insertItem(int index, const QString &text); - - int currentIndex() const; - void setCurrentIndex(int index); - - int maxVisibleItems() const; - void setMaxVisibleItems(int maxItems); - -private: - QString editWidgetText() const override; - void setEditWidgetText(const QString &text) override; -}; - -#endif // QBT_FSPATHEDIT_H diff -Nru qbittorrent-4.1.3/src/gui/fspathedit_p.cpp qbittorrent-3.3.15/src/gui/fspathedit_p.cpp --- qbittorrent-4.1.3/src/gui/fspathedit_p.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/fspathedit_p.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,354 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2016 Eugene Shalygin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "fspathedit_p.h" - -#include -#include -#include -#include -#include - -// -------------------- FileSystemPathValidator ---------------------------------------- -Private::FileSystemPathValidator::FileSystemPathValidator(QObject *parent) - : QValidator(parent) - , m_strictMode(false) - , m_existingOnly(false) - , m_directoriesOnly(false) - , m_checkReadPermission(false) - , m_checkWritePermission(false) - , m_lastTestResult(TestResult::DoesNotExist) - , m_lastValidationState(QValidator::Invalid) -{ -} - -bool Private::FileSystemPathValidator::strictMode() const -{ - return m_strictMode; -} - -void Private::FileSystemPathValidator::setStrictMode(bool v) -{ - m_strictMode = v; -} - -bool Private::FileSystemPathValidator::existingOnly() const -{ - return m_existingOnly; -} - -void Private::FileSystemPathValidator::setExistingOnly(bool v) -{ - m_existingOnly = v; -} - -bool Private::FileSystemPathValidator::directoriesOnly() const -{ - return m_directoriesOnly; -} - -void Private::FileSystemPathValidator::setDirectoriesOnly(bool v) -{ - m_directoriesOnly = v; -} - -bool Private::FileSystemPathValidator::checkReadPermission() const -{ - return m_checkReadPermission; -} - -void Private::FileSystemPathValidator::setCheckReadPermission(bool v) -{ - m_checkReadPermission = v; -} - -bool Private::FileSystemPathValidator::checkWritePermission() const -{ - return m_checkWritePermission; -} - -void Private::FileSystemPathValidator::setCheckWritePermission(bool v) -{ - m_checkWritePermission = v; -} - -QValidator::State Private::FileSystemPathValidator::validate(QString &input, int &pos) const -{ - if (input.isEmpty()) - return m_strictMode ? QValidator::Invalid : QValidator::Intermediate; - - // we test path components from beginning to the one with cursor location in strict mode - // and the one with cursor and beyond in non-strict mode - QVector components = input.splitRef(QDir::separator(), QString::KeepEmptyParts); - // find index of the component that contains pos - int componentWithCursorIndex = 0; - int pathLength = 0; - - // components.size() - 1 because when path ends with QDir::separator(), we will not see the last - // character in the components array, yet everything past the one before the last delimiter - // belongs to the last component - for (; (componentWithCursorIndex < components.size() - 1) && (pathLength < pos); ++componentWithCursorIndex) { - pathLength = components[componentWithCursorIndex].position() + components[componentWithCursorIndex].size(); - } - - Q_ASSERT(componentWithCursorIndex < components.size()); - - m_lastValidationState = QValidator::Acceptable; - if (componentWithCursorIndex > 0) - m_lastValidationState = validate(input, components, m_strictMode, 0, componentWithCursorIndex - 1); - if ((m_lastValidationState == QValidator::Acceptable) && (componentWithCursorIndex < components.size())) - m_lastValidationState = validate(input, components, false, componentWithCursorIndex, components.size() - 1); - return m_lastValidationState; -} - -QValidator::State Private::FileSystemPathValidator::validate(const QString &path, const QVector &pathComponents, bool strict, - int firstComponentToTest, int lastComponentToTest) const -{ - Q_ASSERT(firstComponentToTest >= 0); - Q_ASSERT(lastComponentToTest >= firstComponentToTest); - Q_ASSERT(lastComponentToTest < pathComponents.size()); - - m_lastTestResult = TestResult::DoesNotExist; - if (pathComponents.empty()) - return strict ? QValidator::Invalid : QValidator::Intermediate; - - for (int i = firstComponentToTest; i < lastComponentToTest; ++i) { - if (pathComponents[i].isEmpty()) continue; - - QStringRef componentPath(&path, 0, pathComponents[i].position() + pathComponents[i].size()); - m_lastTestResult = testPath(componentPath, false); - if (m_lastTestResult != TestResult::OK) { - m_lastTestedPath = componentPath.toString(); - return strict ? QValidator::Invalid : QValidator::Intermediate; - } - } - - const bool finalPath = (lastComponentToTest == (pathComponents.size() - 1)); - QStringRef componentPath(&path, 0, pathComponents[lastComponentToTest].position() - + pathComponents[lastComponentToTest].size()); - m_lastTestResult = testPath(componentPath, finalPath); - if (m_lastTestResult != TestResult::OK) { - m_lastTestedPath = componentPath.toString(); - return strict ? QValidator::Invalid : QValidator::Intermediate; - } - return QValidator::Acceptable; -} - -Private::FileSystemPathValidator::TestResult -Private::FileSystemPathValidator::testPath(const QStringRef &path, bool pathIsComplete) const -{ - QFileInfo fi(path.toString()); - if (m_existingOnly && !fi.exists()) - return TestResult::DoesNotExist; - - if ((!pathIsComplete || m_directoriesOnly) && !fi.isDir()) - return TestResult::NotADir; - - if (pathIsComplete) { - if (!m_directoriesOnly && fi.isDir()) - return TestResult::NotAFile; - - if (m_checkWritePermission && (fi.exists() && !fi.isWritable())) - return TestResult::CantWrite; - if (m_checkReadPermission && !fi.isReadable()) - return TestResult::CantRead; - } - - return TestResult::OK; -} - -Private::FileSystemPathValidator::TestResult Private::FileSystemPathValidator::lastTestResult() const -{ - return m_lastTestResult; -} - -QValidator::State Private::FileSystemPathValidator::lastValidationState() const -{ - return m_lastValidationState; -} - -QString Private::FileSystemPathValidator::lastTestedPath() const -{ - return m_lastTestedPath; -} - -Private::FileLineEdit::FileLineEdit(QWidget *parent) - : QLineEdit {parent} - , m_completerModel {new QFileSystemModel(this)} - , m_completer {new QCompleter(this)} - , m_browseAction {nullptr} - , m_warningAction {nullptr} -{ - m_completerModel->setRootPath(""); - m_completerModel->setIconProvider(&m_iconProvider); - m_completer->setModel(m_completerModel); - m_completer->setCompletionMode(QCompleter::PopupCompletion); - setCompleter(m_completer); -} - -Private::FileLineEdit::~FileLineEdit() -{ - delete m_completerModel; // has to be deleted before deleting the m_iconProvider object -} - -void Private::FileLineEdit::completeDirectoriesOnly(bool completeDirsOnly) -{ - QDir::Filters filters = completeDirsOnly ? QDir::Dirs : QDir::AllEntries; - filters |= QDir::NoDotAndDotDot; - m_completerModel->setFilter(filters); -} - -void Private::FileLineEdit::setFilenameFilters(const QStringList &filters) -{ - m_completerModel->setNameFilters(filters); -} - -void Private::FileLineEdit::setBrowseAction(QAction *action) -{ - m_browseAction = action; -} - -void Private::FileLineEdit::setValidator(QValidator *validator) -{ - QLineEdit::setValidator(validator); -} - -QWidget *Private::FileLineEdit::widget() -{ - return this; -} - -void Private::FileLineEdit::keyPressEvent(QKeyEvent *e) -{ - QLineEdit::keyPressEvent(e); - if ((e->key() == Qt::Key_Space) && (e->modifiers() == Qt::CTRL)) { - m_completerModel->setRootPath(QFileInfo(text()).absoluteDir().absolutePath()); - showCompletionPopup(); - } - - const FileSystemPathValidator *validator = - qobject_cast(this->validator()); - if (validator) { - FileSystemPathValidator::TestResult lastTestResult = validator->lastTestResult(); - QValidator::State lastState = validator->lastValidationState(); - if (lastTestResult == FileSystemPathValidator::TestResult::OK) { - if (m_warningAction) { - delete m_warningAction; - m_warningAction = nullptr; - } - } - else { - if (!m_warningAction) { - m_warningAction = new QAction(this); - addAction(m_warningAction, QLineEdit::TrailingPosition); - } - } - - if (m_warningAction) { - if (lastState == QValidator::Invalid) - m_warningAction->setIcon(style()->standardIcon(QStyle::SP_MessageBoxCritical)); - else if (lastState == QValidator::Intermediate) - m_warningAction->setIcon(style()->standardIcon(QStyle::SP_MessageBoxWarning)); - m_warningAction->setToolTip(warningText(lastTestResult).arg(validator->lastTestedPath())); - } - } -} - -void Private::FileLineEdit::contextMenuEvent(QContextMenuEvent *event) -{ - QMenu *menu = createStandardContextMenu(); - menu->addSeparator(); - if (m_browseAction) { - menu->addSeparator(); - menu->addAction(m_browseAction); - } - menu->exec(event->globalPos()); - delete menu; -} - -void Private::FileLineEdit::showCompletionPopup() -{ - m_completer->setCompletionPrefix(text()); - m_completer->complete(); -} - -QString Private::FileLineEdit::warningText(FileSystemPathValidator::TestResult r) -{ - using TestResult = FileSystemPathValidator::TestResult; - switch (r) { - case TestResult::DoesNotExist: - return tr("'%1' does not exist"); - case TestResult::NotADir: - return tr("'%1' does not point to a directory"); - case TestResult::NotAFile: - return tr("'%1' does not point to a file"); - case TestResult::CantRead: - return tr("Does not have read permission in '%1'"); - case TestResult::CantWrite: - return tr("Does not have write permission in '%1'"); - default: - return QString(); - } -} - -Private::FileComboEdit::FileComboEdit(QWidget *parent) - : QComboBox {parent} -{ - setEditable(true); - setLineEdit(new FileLineEdit(this)); -} - -void Private::FileComboEdit::completeDirectoriesOnly(bool completeDirsOnly) -{ - static_cast(lineEdit())->completeDirectoriesOnly(completeDirsOnly); -} - -void Private::FileComboEdit::setBrowseAction(QAction *action) -{ - static_cast(lineEdit())->setBrowseAction(action); -} - -void Private::FileComboEdit::setValidator(QValidator *validator) -{ - lineEdit()->setValidator(validator); -} - -void Private::FileComboEdit::setFilenameFilters(const QStringList &filters) -{ - static_cast(lineEdit())->setFilenameFilters(filters); -} - -QWidget *Private::FileComboEdit::widget() -{ - return this; -} - -QString Private::FileComboEdit::text() const -{ - return currentText(); -} diff -Nru qbittorrent-4.1.3/src/gui/fspathedit_p.h qbittorrent-3.3.15/src/gui/fspathedit_p.h --- qbittorrent-4.1.3/src/gui/fspathedit_p.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/fspathedit_p.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,163 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2016 Eugene Shalygin - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef QBT_GUI_FSPATHEDIT_P_H -#define QBT_GUI_FSPATHEDIT_P_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class QStringList; - -namespace Private -{ - class FileSystemPathValidator : public QValidator - { - Q_OBJECT - - public: - FileSystemPathValidator(QObject *parent = nullptr); - - bool strictMode() const; - void setStrictMode(bool v); - - bool existingOnly() const; - void setExistingOnly(bool v); - - bool directoriesOnly() const; - void setDirectoriesOnly(bool v); - - bool checkReadPermission() const; - void setCheckReadPermission(bool v); - - bool checkWritePermission() const; - void setCheckWritePermission(bool v); - - QValidator::State validate(QString &input, int &pos) const override; - - enum class TestResult - { - OK, - DoesNotExist, - NotADir, - NotAFile, - CantRead, - CantWrite - }; - - TestResult lastTestResult() const; - QValidator::State lastValidationState() const; - QString lastTestedPath() const; - - private: - QValidator::State validate(const QString &path, const QVector &pathComponents, bool strict, - int firstComponentToTest, int lastComponentToTest) const; - - TestResult testPath(const QStringRef &path, bool pathIsComplete) const; - - bool m_strictMode; - bool m_existingOnly; - bool m_directoriesOnly; - bool m_checkReadPermission; - bool m_checkWritePermission; - - mutable TestResult m_lastTestResult; - mutable QValidator::State m_lastValidationState; - mutable QString m_lastTestedPath; - }; - - class FileEditorWithCompletion - { - public: - virtual ~FileEditorWithCompletion() = default; - virtual void completeDirectoriesOnly(bool completeDirsOnly) = 0; - virtual void setFilenameFilters(const QStringList &filters) = 0; - virtual void setBrowseAction(QAction *action) = 0; - virtual void setValidator(QValidator *validator) = 0; - virtual QWidget *widget() = 0; - }; - - class FileLineEdit : public QLineEdit, public FileEditorWithCompletion - { - Q_OBJECT - Q_DISABLE_COPY(FileLineEdit) - - public: - FileLineEdit(QWidget *parent = nullptr); - ~FileLineEdit(); - - void completeDirectoriesOnly(bool completeDirsOnly) override; - void setFilenameFilters(const QStringList &filters) override; - void setBrowseAction(QAction *action) override; - void setValidator(QValidator *validator) override; - QWidget *widget() override; - - protected: - void keyPressEvent(QKeyEvent *event) override; - void contextMenuEvent(QContextMenuEvent *event) override; - - private: - static QString warningText(FileSystemPathValidator::TestResult r); - void showCompletionPopup(); - - QFileSystemModel *m_completerModel; - QCompleter *m_completer; - QAction *m_browseAction; - QFileIconProvider m_iconProvider; - QAction *m_warningAction; - }; - - class FileComboEdit : public QComboBox, public FileEditorWithCompletion - { - Q_OBJECT - - public: - FileComboEdit(QWidget *parent = nullptr); - - void completeDirectoriesOnly(bool completeDirsOnly) override; - void setFilenameFilters(const QStringList &filters) override; - void setBrowseAction(QAction *action) override; - void setValidator(QValidator *validator) override; - QWidget *widget() override; - - protected: - QString text() const; - }; -} - -#endif // QBT_GUI_FSPATHEDIT_P_H diff -Nru qbittorrent-4.1.3/src/gui/guiiconprovider.cpp qbittorrent-3.3.15/src/gui/guiiconprovider.cpp --- qbittorrent-4.1.3/src/gui/guiiconprovider.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/guiiconprovider.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -28,26 +28,22 @@ */ #include "guiiconprovider.h" +#include "base/preferences.h" -#include #include -#include #if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) #include #include #endif -#include "base/preferences.h" -#include "base/utils/fs.h" - GuiIconProvider::GuiIconProvider(QObject *parent) : IconProvider(parent) { configure(); - connect(Preferences::instance(), &Preferences::changed, this, &GuiIconProvider::configure); + connect(Preferences::instance(), SIGNAL(changed()), SLOT(configure())); } -GuiIconProvider::~GuiIconProvider() = default; +GuiIconProvider::~GuiIconProvider() {} void GuiIconProvider::initInstance() { @@ -60,45 +56,74 @@ return static_cast(m_instance); } -QIcon GuiIconProvider::getIcon(const QString &iconId) const +QIcon GuiIconProvider::getIcon(const QString &iconId) { return getIcon(iconId, iconId); } -QIcon GuiIconProvider::getIcon(const QString &iconId, const QString &fallback) const +QIcon GuiIconProvider::getIcon(const QString &iconId, const QString &fallback) { #if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) if (m_useSystemTheme) { QIcon icon = QIcon::fromTheme(iconId); if (icon.name() != iconId) icon = QIcon::fromTheme(fallback, QIcon(IconProvider::getIconPath(iconId))); + icon = generateDifferentSizes(icon); return icon; } #else Q_UNUSED(fallback) #endif - // cache to avoid rescaling svg icons - static QHash iconCache; - const auto iter = iconCache.find(iconId); - if (iter != iconCache.end()) - return *iter; - - const QIcon icon {IconProvider::getIconPath(iconId)}; - iconCache[iconId] = icon; - return icon; + return QIcon(IconProvider::getIconPath(iconId)); } -QIcon GuiIconProvider::getFlagIcon(const QString &countryIsoCode) const +QIcon GuiIconProvider::getFlagIcon(const QString &countryIsoCode) { if (countryIsoCode.isEmpty()) return QIcon(); - return QIcon(":/icons/flags/" + countryIsoCode.toLower() + ".svg"); + return QIcon(":/icons/flags/" + countryIsoCode.toLower() + ".png"); } -QString GuiIconProvider::getIconPath(const QString &iconId) const +// Makes sure the icon is at least available in 16px and 24px size +// It scales the icon from the theme if necessary +// Otherwise, the UI looks broken if the icon is not available +// in the correct size. +#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) +QIcon GuiIconProvider::generateDifferentSizes(const QIcon &icon) +{ + // if icon is loaded from SVG format, it already contains all the required sizes and we shall not resize it + // In that case it will be available in the following sizes: + // (QSize(16, 16), QSize(22, 22), QSize(32, 32), QSize(48, 48), QSize(64, 64), QSize(128, 128), QSize(256, 256)) + + if (icon.availableSizes(QIcon::Normal, QIcon::On).size() > 6) + return icon; + + QIcon newIcon; + QList requiredSizes; + requiredSizes << QSize(16, 16) << QSize(24, 24) << QSize(32, 32); + QList modes; + modes << QIcon::Normal << QIcon::Active << QIcon::Selected << QIcon::Disabled; + foreach (const QSize &size, requiredSizes) { + foreach (QIcon::Mode mode, modes) { + QPixmap pixoff = icon.pixmap(size, mode, QIcon::Off); + if (pixoff.height() > size.height()) + pixoff = pixoff.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation); + newIcon.addPixmap(pixoff, mode, QIcon::Off); + QPixmap pixon = icon.pixmap(size, mode, QIcon::On); + if (pixon.height() > size.height()) + pixon = pixoff.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation); + newIcon.addPixmap(pixon, mode, QIcon::On); + } + } + + return newIcon; +} +#endif + +QString GuiIconProvider::getIconPath(const QString &iconId) { #if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) if (m_useSystemTheme) { - QString path = Utils::Fs::tempPath() + iconId + ".png"; + QString path = QDir::temp().absoluteFilePath(iconId + ".png"); if (!QFile::exists(path)) { const QIcon icon = QIcon::fromTheme(iconId); if (!icon.isNull()) @@ -113,6 +138,7 @@ return IconProvider::getIconPath(iconId); } + void GuiIconProvider::configure() { #if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) diff -Nru qbittorrent-4.1.3/src/gui/guiiconprovider.h qbittorrent-3.3.15/src/gui/guiiconprovider.h --- qbittorrent-4.1.3/src/gui/guiiconprovider.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/guiiconprovider.h 2017-08-03 20:30:10.000000000 +0000 @@ -43,19 +43,20 @@ static void initInstance(); static GuiIconProvider *instance(); - QIcon getIcon(const QString &iconId) const; - QIcon getIcon(const QString &iconId, const QString &fallback) const; - QIcon getFlagIcon(const QString &countryIsoCode) const; - QString getIconPath(const QString &iconId) const override; + QIcon getIcon(const QString &iconId); + QIcon getIcon(const QString &iconId, const QString &fallback); + QIcon getFlagIcon(const QString &countryIsoCode); + QString getIconPath(const QString &iconId); private slots: void configure(); private: - explicit GuiIconProvider(QObject *parent = nullptr); - ~GuiIconProvider() override; - + explicit GuiIconProvider(QObject *parent = 0); + ~GuiIconProvider(); #if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) + QIcon generateDifferentSizes(const QIcon &icon); + bool m_useSystemTheme; #endif }; diff -Nru qbittorrent-4.1.3/src/gui/gui.pri qbittorrent-3.3.15/src/gui/gui.pri --- qbittorrent-4.1.3/src/gui/gui.pri 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/gui.pri 2017-08-03 20:30:10.000000000 +0000 @@ -1,163 +1,127 @@ INCLUDEPATH += $$PWD include(lineedit/lineedit.pri) -include(powermanagement/powermanagement.pri) include(properties/properties.pri) +include(rss/rss.pri) +include(powermanagement/powermanagement.pri) unix:!macx:dbus: include(qtnotify/qtnotify.pri) HEADERS += \ - $$PWD/aboutdialog.h \ - $$PWD/addnewtorrentdialog.h \ - $$PWD/advancedsettings.h \ - $$PWD/autoexpandabledialog.h \ - $$PWD/banlistoptionsdialog.h \ - $$PWD/categoryfiltermodel.h \ - $$PWD/categoryfilterproxymodel.h \ - $$PWD/categoryfilterwidget.h \ - $$PWD/cookiesdialog.h \ - $$PWD/cookiesmodel.h \ - $$PWD/deletionconfirmationdialog.h \ - $$PWD/downloadfromurldialog.h \ - $$PWD/executionlogwidget.h \ - $$PWD/fspathedit.h \ - $$PWD/fspathedit_p.h \ - $$PWD/guiiconprovider.h \ - $$PWD/hidabletabwidget.h \ - $$PWD/ipsubnetwhitelistoptionsdialog.h \ - $$PWD/loglistwidget.h \ $$PWD/mainwindow.h \ - $$PWD/optionsdialog.h \ + $$PWD/transferlistwidget.h \ + $$PWD/transferlistdelegate.h \ + $$PWD/transferlistfilterswidget.h \ + $$PWD/transferlistsortmodel.h \ + $$PWD/torrentcontentmodel.h \ + $$PWD/torrentcontentmodelitem.h \ + $$PWD/torrentcontentmodelfolder.h \ + $$PWD/torrentcontentmodelfile.h \ + $$PWD/torrentcontentfiltermodel.h \ + $$PWD/torrentcontenttreeview.h \ + $$PWD/deletionconfirmationdlg.h \ + $$PWD/statusbar.h \ + $$PWD/ico.h \ + $$PWD/speedlimitdlg.h \ + $$PWD/about_imp.h \ + $$PWD/previewselect.h \ $$PWD/previewlistdelegate.h \ - $$PWD/previewselectdialog.h \ - $$PWD/raisedmessagebox.h \ - $$PWD/rss/articlelistwidget.h \ - $$PWD/rss/automatedrssdownloader.h \ - $$PWD/rss/feedlistwidget.h \ - $$PWD/rss/htmlbrowser.h \ - $$PWD/rss/rsswidget.h \ + $$PWD/downloadfromurldlg.h \ + $$PWD/trackerlogin.h \ + $$PWD/hidabletabwidget.h \ + $$PWD/executionlog.h \ + $$PWD/guiiconprovider.h \ + $$PWD/updownratiodlg.h \ + $$PWD/loglistwidget.h \ + $$PWD/addnewtorrentdialog.h \ + $$PWD/autoexpandabledialog.h \ + $$PWD/statsdialog.h \ + $$PWD/messageboxraised.h \ + $$PWD/optionsdlg.h \ + $$PWD/advancedsettings.h \ + $$PWD/shutdownconfirmdlg.h \ + $$PWD/torrentmodel.h \ + $$PWD/torrentcreatordlg.h \ $$PWD/scanfoldersdelegate.h \ - $$PWD/search/pluginselectdialog.h \ - $$PWD/search/pluginsourcedialog.h \ - $$PWD/search/searchjobwidget.h \ + $$PWD/search/searchwidget.h \ + $$PWD/search/searchtab.h \ + $$PWD/search/pluginselectdlg.h \ + $$PWD/search/pluginsourcedlg.h \ $$PWD/search/searchlistdelegate.h \ $$PWD/search/searchsortmodel.h \ - $$PWD/search/searchwidget.h \ - $$PWD/shutdownconfirmdialog.h \ - $$PWD/speedlimitdialog.h \ - $$PWD/statsdialog.h \ - $$PWD/statusbar.h \ - $$PWD/tagfiltermodel.h \ - $$PWD/tagfilterproxymodel.h \ - $$PWD/tagfilterwidget.h \ - $$PWD/torrentcategorydialog.h \ - $$PWD/torrentcontentfiltermodel.h \ - $$PWD/torrentcontentmodel.h \ - $$PWD/torrentcontentmodelfile.h \ - $$PWD/torrentcontentmodelfolder.h \ - $$PWD/torrentcontentmodelitem.h \ - $$PWD/torrentcontenttreeview.h \ - $$PWD/torrentcreatordialog.h \ - $$PWD/trackerlogindialog.h \ - $$PWD/transferlistdelegate.h \ - $$PWD/transferlistfilterswidget.h \ - $$PWD/transferlistmodel.h \ - $$PWD/transferlistsortmodel.h \ - $$PWD/transferlistwidget.h \ - $$PWD/updownratiodialog.h \ - $$PWD/utils.h + $$PWD/cookiesmodel.h \ + $$PWD/cookiesdialog.h \ + $$PWD/categoryfiltermodel.h \ + $$PWD/categoryfilterproxymodel.h \ + $$PWD/categoryfilterwidget.h SOURCES += \ - $$PWD/addnewtorrentdialog.cpp \ - $$PWD/advancedsettings.cpp \ - $$PWD/autoexpandabledialog.cpp \ - $$PWD/banlistoptionsdialog.cpp \ - $$PWD/categoryfiltermodel.cpp \ - $$PWD/categoryfilterproxymodel.cpp \ - $$PWD/categoryfilterwidget.cpp \ - $$PWD/cookiesdialog.cpp \ - $$PWD/cookiesmodel.cpp \ - $$PWD/downloadfromurldialog.cpp \ - $$PWD/executionlogwidget.cpp \ - $$PWD/fspathedit.cpp \ - $$PWD/fspathedit_p.cpp \ + $$PWD/mainwindow.cpp \ + $$PWD/ico.cpp \ + $$PWD/transferlistwidget.cpp \ + $$PWD/transferlistsortmodel.cpp \ + $$PWD/transferlistdelegate.cpp \ + $$PWD/transferlistfilterswidget.cpp \ + $$PWD/torrentcontentmodel.cpp \ + $$PWD/torrentcontentmodelitem.cpp \ + $$PWD/torrentcontentmodelfolder.cpp \ + $$PWD/torrentcontentmodelfile.cpp \ + $$PWD/torrentcontentfiltermodel.cpp \ + $$PWD/torrentcontenttreeview.cpp \ + $$PWD/executionlog.cpp \ + $$PWD/speedlimitdlg.cpp \ + $$PWD/previewselect.cpp \ $$PWD/guiiconprovider.cpp \ - $$PWD/ipsubnetwhitelistoptionsdialog.cpp \ + $$PWD/updownratiodlg.cpp \ $$PWD/loglistwidget.cpp \ - $$PWD/mainwindow.cpp \ - $$PWD/optionsdialog.cpp \ - $$PWD/previewselectdialog.cpp \ - $$PWD/raisedmessagebox.cpp \ - $$PWD/rss/articlelistwidget.cpp \ - $$PWD/rss/automatedrssdownloader.cpp \ - $$PWD/rss/feedlistwidget.cpp \ - $$PWD/rss/htmlbrowser.cpp \ - $$PWD/rss/rsswidget.cpp \ + $$PWD/addnewtorrentdialog.cpp \ + $$PWD/autoexpandabledialog.cpp \ + $$PWD/statsdialog.cpp \ + $$PWD/messageboxraised.cpp \ + $$PWD/statusbar.cpp \ + $$PWD/advancedsettings.cpp \ + $$PWD/trackerlogin.cpp \ + $$PWD/optionsdlg.cpp \ + $$PWD/shutdownconfirmdlg.cpp \ + $$PWD/torrentmodel.cpp \ + $$PWD/torrentcreatordlg.cpp \ $$PWD/scanfoldersdelegate.cpp \ - $$PWD/search/pluginselectdialog.cpp \ - $$PWD/search/pluginsourcedialog.cpp \ - $$PWD/search/searchjobwidget.cpp \ + $$PWD/search/searchwidget.cpp \ + $$PWD/search/searchtab.cpp \ + $$PWD/search/pluginselectdlg.cpp \ + $$PWD/search/pluginsourcedlg.cpp \ $$PWD/search/searchlistdelegate.cpp \ $$PWD/search/searchsortmodel.cpp \ - $$PWD/search/searchwidget.cpp \ - $$PWD/shutdownconfirmdialog.cpp \ - $$PWD/speedlimitdialog.cpp \ - $$PWD/statsdialog.cpp \ - $$PWD/statusbar.cpp \ - $$PWD/tagfiltermodel.cpp \ - $$PWD/tagfilterproxymodel.cpp \ - $$PWD/tagfilterwidget.cpp \ - $$PWD/torrentcategorydialog.cpp \ - $$PWD/torrentcontentfiltermodel.cpp \ - $$PWD/torrentcontentmodel.cpp \ - $$PWD/torrentcontentmodelfile.cpp \ - $$PWD/torrentcontentmodelfolder.cpp \ - $$PWD/torrentcontentmodelitem.cpp \ - $$PWD/torrentcontenttreeview.cpp \ - $$PWD/torrentcreatordialog.cpp \ - $$PWD/trackerlogindialog.cpp \ - $$PWD/transferlistdelegate.cpp \ - $$PWD/transferlistfilterswidget.cpp \ - $$PWD/transferlistmodel.cpp \ - $$PWD/transferlistsortmodel.cpp \ - $$PWD/transferlistwidget.cpp \ - $$PWD/updownratiodialog.cpp \ - $$PWD/utils.cpp + $$PWD/cookiesmodel.cpp \ + $$PWD/cookiesdialog.cpp \ + $$PWD/categoryfiltermodel.cpp \ + $$PWD/categoryfilterproxymodel.cpp \ + $$PWD/categoryfilterwidget.cpp win32|macx { HEADERS += $$PWD/programupdater.h SOURCES += $$PWD/programupdater.cpp } -macx { - HEADERS += $$PWD/macutilities.h - OBJECTIVE_SOURCES += $$PWD/macutilities.mm -} - FORMS += \ - $$PWD/aboutdialog.ui \ + $$PWD/mainwindow.ui \ + $$PWD/about.ui \ + $$PWD/preview.ui \ + $$PWD/login.ui \ + $$PWD/downloadfromurldlg.ui \ + $$PWD/bandwidth_limit.ui \ + $$PWD/updownratiodlg.ui \ + $$PWD/confirmdeletiondlg.ui \ + $$PWD/shutdownconfirmdlg.ui \ + $$PWD/executionlog.ui \ $$PWD/addnewtorrentdialog.ui \ $$PWD/autoexpandabledialog.ui \ - $$PWD/banlistoptionsdialog.ui \ - $$PWD/cookiesdialog.ui \ - $$PWD/deletionconfirmationdialog.ui \ - $$PWD/downloadfromurldialog.ui \ - $$PWD/executionlogwidget.ui \ - $$PWD/ipsubnetwhitelistoptionsdialog.ui \ - $$PWD/mainwindow.ui \ - $$PWD/optionsdialog.ui \ - $$PWD/previewselectdialog.ui \ - $$PWD/rss/automatedrssdownloader.ui \ - $$PWD/rss/rsswidget.ui \ - $$PWD/search/pluginselectdialog.ui \ - $$PWD/search/pluginsourcedialog.ui \ - $$PWD/search/searchjobwidget.ui \ - $$PWD/search/searchwidget.ui \ - $$PWD/shutdownconfirmdialog.ui \ - $$PWD/speedlimitdialog.ui \ $$PWD/statsdialog.ui \ - $$PWD/torrentcategorydialog.ui \ - $$PWD/torrentcreatordialog.ui \ - $$PWD/trackerlogindialog.ui \ - $$PWD/updownratiodialog.ui + $$PWD/optionsdlg.ui \ + $$PWD/torrentcreatordlg.ui \ + $$PWD/search/searchwidget.ui \ + $$PWD/search/pluginselectdlg.ui \ + $$PWD/search/pluginsourcedlg.ui \ + $$PWD/search/searchtab.ui \ + $$PWD/cookiesdialog.ui RESOURCES += $$PWD/about.qrc diff -Nru qbittorrent-4.1.3/src/gui/hidabletabwidget.h qbittorrent-3.3.15/src/gui/hidabletabwidget.h --- qbittorrent-4.1.3/src/gui/hidabletabwidget.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/hidabletabwidget.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,43 +24,32 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef HIDABLETABWIDGET_H #define HIDABLETABWIDGET_H -#include #include - -#ifdef Q_OS_MAC -#include -#endif +#include class HidableTabWidget : public QTabWidget { public: - explicit HidableTabWidget(QWidget *parent = nullptr) + explicit HidableTabWidget(QWidget *parent = 0) : QTabWidget(parent) { } protected: -#ifdef Q_OS_MAC - void paintEvent(QPaintEvent *event) override - { - // Hide the pane for macintosh style - if (!style()->inherits("QMacStyle")) - QTabWidget::paintEvent(event); - } -#endif - - void tabInserted(int index) override + void tabInserted(int index) { QTabWidget::tabInserted(index); tabBar()->setVisible(count() != 1); } - void tabRemoved(int index) override + void tabRemoved(int index) { //QTabWidget::tabInserted(index); QTabWidget::tabRemoved(index); diff -Nru qbittorrent-4.1.3/src/gui/ico.cpp qbittorrent-3.3.15/src/gui/ico.cpp --- qbittorrent-4.1.3/src/gui/ico.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/ico.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,467 @@ +/* + * kimgio import filter for MS Windows .ico files + * + * Distributed under the terms of the LGPL + * Copyright (c) 2000 Malte Starostik + * + */ + +#include "ico.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace +{ + // Global header (see http://www.daubnet.com/formats/ICO.html) + struct IcoHeader + { + enum Type { Icon = 1, Cursor }; + quint16 reserved; + quint16 type; + quint16 count; + }; + + inline QDataStream& operator >>( QDataStream& s, IcoHeader& h ) + { + return s >> h.reserved >> h.type >> h.count; + } + + // Based on qt_read_dib et al. from qimage.cpp + // (c) 1992-2002 Trolltech AS. + struct BMP_INFOHDR + { + static const quint32 Size = 40; + quint32 biSize; // size of this struct + quint32 biWidth; // pixmap width + quint32 biHeight; // pixmap height + quint16 biPlanes; // should be 1 + quint16 biBitCount; // number of bits per pixel + enum Compression { RGB = 0 }; + quint32 biCompression; // compression method + quint32 biSizeImage; // size of image + quint32 biXPelsPerMeter; // horizontal resolution + quint32 biYPelsPerMeter; // vertical resolution + quint32 biClrUsed; // number of colors used + quint32 biClrImportant; // number of important colors + }; + const quint32 BMP_INFOHDR::Size; + + QDataStream& operator >>( QDataStream &s, BMP_INFOHDR &bi ) + { + s >> bi.biSize; + if ( bi.biSize == BMP_INFOHDR::Size ) + { + s >> bi.biWidth >> bi.biHeight >> bi.biPlanes >> bi.biBitCount; + s >> bi.biCompression >> bi.biSizeImage; + s >> bi.biXPelsPerMeter >> bi.biYPelsPerMeter; + s >> bi.biClrUsed >> bi.biClrImportant; + } + return s; + } + +#if 0 + QDataStream &operator<<( QDataStream &s, const BMP_INFOHDR &bi ) + { + s << bi.biSize; + s << bi.biWidth << bi.biHeight; + s << bi.biPlanes; + s << bi.biBitCount; + s << bi.biCompression; + s << bi.biSizeImage; + s << bi.biXPelsPerMeter << bi.biYPelsPerMeter; + s << bi.biClrUsed << bi.biClrImportant; + return s; + } +#endif + + // Header for every icon in the file + struct IconRec + { + unsigned char width; + unsigned char height; + quint16 colors; + quint16 hotspotX; + quint16 hotspotY; + quint32 size; + quint32 offset; + }; + + inline QDataStream& operator >>( QDataStream& s, IconRec& r ) + { + return s >> r.width >> r.height >> r.colors + >> r.hotspotX >> r.hotspotY >> r.size >> r.offset; + } + + struct LessDifference + { + LessDifference( unsigned s, unsigned c ) + : size( s ), colors( c ) {} + + bool operator ()( const IconRec& lhs, const IconRec& rhs ) const + { + // closest size match precedes everything else + if ( std::abs( int( lhs.width - size ) ) < + std::abs( int( rhs.width - size ) ) ) return true; + else if ( std::abs( int( lhs.width - size ) ) > + std::abs( int( rhs.width - size ) ) ) return false; + else if ( colors == 0 ) + { + // high/true color requested + if ( lhs.colors == 0 ) return true; + else if ( rhs.colors == 0 ) return false; + else return lhs.colors > rhs.colors; + } + else + { + // indexed icon requested + if ( lhs.colors == 0 && rhs.colors == 0 ) return false; + else if ( lhs.colors == 0 ) return false; + else return std::abs( int( lhs.colors - colors ) ) < + std::abs( int( rhs.colors - colors ) ); + } + } + unsigned size; + unsigned colors; + }; + + bool loadFromDIB( QDataStream& stream, const IconRec& rec, QImage& icon ) + { + BMP_INFOHDR header; + stream >> header; + if ( stream.atEnd() || header.biSize != BMP_INFOHDR::Size || + header.biSize > rec.size || + header.biCompression != BMP_INFOHDR::RGB || + ( header.biBitCount != 1 && header.biBitCount != 4 && + header.biBitCount != 8 && header.biBitCount != 24 && + header.biBitCount != 32 ) ) return false; + + unsigned paletteSize, paletteEntries; + + if (header.biBitCount > 8) + { + paletteEntries = 0; + paletteSize = 0; + } + else + { + paletteSize = (1 << header.biBitCount); + paletteEntries = paletteSize; + if (header.biClrUsed && header.biClrUsed < paletteSize) + paletteEntries = header.biClrUsed; + } + + // Always create a 32-bit image to get the mask right + // Note: this is safe as rec.width, rec.height are bytes + icon = QImage( rec.width, rec.height, QImage::Format_ARGB32 ); + if ( icon.isNull() ) return false; + + QVector< QRgb > colorTable( paletteSize ); + + colorTable.fill( QRgb( 0 ) ); + for ( unsigned i = 0; i < paletteEntries; ++i ) + { + unsigned char rgb[ 4 ]; + stream.readRawData( reinterpret_cast< char* >( &rgb ), + sizeof( rgb ) ); + colorTable[ i ] = qRgb( rgb[ 2 ], rgb[ 1 ], rgb[ 0 ] ); + } + + unsigned bpl = ( rec.width * header.biBitCount + 31 ) / 32 * 4; + + unsigned char* buf = new unsigned char[ bpl ]; + for ( unsigned y = rec.height; !stream.atEnd() && y--; ) + { + stream.readRawData( reinterpret_cast< char* >( buf ), bpl ); + unsigned char* pixel = buf; + QRgb* p = reinterpret_cast< QRgb* >( icon.scanLine(y)); + switch ( header.biBitCount ) + { + case 1: + for ( unsigned x = 0; x < rec.width; ++x ) + *p++ = colorTable[ + ( pixel[ x / 8 ] >> ( 7 - ( x & 0x07 ) ) ) & 1 ]; + break; + case 4: + for ( unsigned x = 0; x < rec.width; ++x ) + if ( x & 1 ) *p++ = colorTable[ pixel[ x / 2 ] & 0x0f ]; + else *p++ = colorTable[ pixel[ x / 2 ] >> 4 ]; + break; + case 8: + for ( unsigned x = 0; x < rec.width; ++x ) + *p++ = colorTable[ pixel[ x ] ]; + break; + case 24: + for ( unsigned x = 0; x < rec.width; ++x ) + *p++ = qRgb( pixel[ 3 * x + 2 ], + pixel[ 3 * x + 1 ], + pixel[ 3 * x ] ); + break; + case 32: + for ( unsigned x = 0; x < rec.width; ++x ) + *p++ = qRgba( pixel[ 4 * x + 2 ], + pixel[ 4 * x + 1 ], + pixel[ 4 * x ], + pixel[ 4 * x + 3] ); + break; + } + } + delete[] buf; + + if ( header.biBitCount < 32 ) + { + // Traditional 1-bit mask + bpl = ( rec.width + 31 ) / 32 * 4; + buf = new unsigned char[ bpl ]; + for ( unsigned y = rec.height; y--; ) + { + stream.readRawData( reinterpret_cast< char* >( buf ), bpl ); + QRgb* p = reinterpret_cast< QRgb* >(icon.scanLine(y)); + for ( unsigned x = 0; x < rec.width; ++x, ++p ) + if ( ( ( buf[ x / 8 ] >> ( 7 - ( x & 0x07 ) ) ) & 1 ) ) + *p &= RGB_MASK; + } + delete[] buf; + } + return true; + } +} + +ICOHandler::ICOHandler() +{ +} + +bool ICOHandler::canRead() const +{ + if (canRead(device())) { + setFormat("ico"); + return true; + } + return false; +} + +bool ICOHandler::read(QImage *outImage) +{ + + qint64 offset = device()->pos(); + + QDataStream stream( device() ); + stream.setByteOrder( QDataStream::LittleEndian ); + IcoHeader header; + stream >> header; + if ( stream.atEnd() || !header.count || + ( header.type != IcoHeader::Icon && header.type != IcoHeader::Cursor) ) + return false; + + unsigned requestedSize = 32; + unsigned requestedColors = QApplication::desktop()->depth() > 8 ? 0 : QApplication::desktop()->depth(); + int requestedIndex = -1; +#if 0 + if ( io->parameters() ) + { + QStringList params = QString(io->parameters()).split( ';', QString::SkipEmptyParts ); + QMap< QString, QString > options; + for ( QStringList::ConstIterator it = params.begin(); + it != params.end(); ++it ) + { + QStringList tmp = (*it).split( '=', QString::SkipEmptyParts ); + if ( tmp.count() == 2 ) options[ tmp[ 0 ] ] = tmp[ 1 ]; + } + if ( options[ "index" ].toUInt() ) + requestedIndex = options[ "index" ].toUInt(); + if ( options[ "size" ].toUInt() ) + requestedSize = options[ "size" ].toUInt(); + if ( options[ "colors" ].toUInt() ) + requestedColors = options[ "colors" ].toUInt(); + } +#endif + + typedef std::vector< IconRec > IconList; + IconList icons; + for ( unsigned i = 0; i < header.count; ++i ) + { + if ( stream.atEnd() ) + return false; + IconRec rec; + stream >> rec; + icons.push_back( rec ); + } + IconList::const_iterator selected; + if (requestedIndex >= 0) { + selected = std::min( icons.begin() + requestedIndex, icons.end() ); + } else { + selected = std::min_element( icons.begin(), icons.end(), + LessDifference( requestedSize, requestedColors ) ); + } + if ( stream.atEnd() || selected == icons.end() || + offset + selected->offset > device()->size() ) + return false; + + device()->seek( offset + selected->offset ); + QImage icon; + if ( loadFromDIB( stream, *selected, icon ) ) + { + icon.setText( "X-Index", QString::number( selected - icons.begin() ) ); + if ( header.type == IcoHeader::Cursor ) + { + icon.setText( "X-HotspotX", QString::number( selected->hotspotX ) ); + icon.setText( "X-HotspotY", QString::number( selected->hotspotY ) ); + } + + *outImage = icon; + return true; + } + return false; +} + +bool ICOHandler::write(const QImage &/*image*/) +{ +#if 0 + if (image.isNull()) + return; + + QByteArray dibData; + QDataStream dib(dibData, QIODevice::ReadWrite); + dib.setByteOrder(QDataStream::LittleEndian); + + QImage pixels = image; + QImage mask; + if (io->image().hasAlphaBuffer()) + mask = image.createAlphaMask(); + else + mask = image.createHeuristicMask(); + mask.invertPixels(); + for ( int y = 0; y < pixels.height(); ++y ) + for ( int x = 0; x < pixels.width(); ++x ) + if ( mask.pixel( x, y ) == 0 ) pixels.setPixel( x, y, 0 ); + + if (!qt_write_dib(dib, pixels)) + return; + + uint hdrPos = dib.device()->at(); + if (!qt_write_dib(dib, mask)) + return; + memmove(dibData.data() + hdrPos, dibData.data() + hdrPos + BMP_WIN + 8, dibData.size() - hdrPos - BMP_WIN - 8); + dibData.resize(dibData.size() - BMP_WIN - 8); + + QDataStream ico(device()); + ico.setByteOrder(QDataStream::LittleEndian); + IcoHeader hdr; + hdr.reserved = 0; + hdr.type = Icon; + hdr.count = 1; + ico << hdr.reserved << hdr.type << hdr.count; + IconRec rec; + rec.width = image.width(); + rec.height = image.height(); + if (image.numColors() <= 16) + rec.colors = 16; + else if (image.depth() <= 8) + rec.colors = 256; + else + rec.colors = 0; + rec.hotspotX = 0; + rec.hotspotY = 0; + rec.dibSize = dibData.size(); + ico << rec.width << rec.height << rec.colors + << rec.hotspotX << rec.hotspotY << rec.dibSize; + rec.dibOffset = ico.device()->at() + sizeof(rec.dibOffset); + ico << rec.dibOffset; + + BMP_INFOHDR dibHeader; + dib.device()->at(0); + dib >> dibHeader; + dibHeader.biHeight = image.height() << 1; + dib.device()->at(0); + dib << dibHeader; + + ico.writeRawBytes(dibData.data(), dibData.size()); + return true; +#endif + return false; +} + +QByteArray ICOHandler::name() const +{ + return "ico"; +} + +bool ICOHandler::canRead(QIODevice *device) +{ + if (!device) { + qWarning("ICOHandler::canRead() called with no device"); + return false; + } + + const qint64 oldPos = device->pos(); + + char head[8]; + qint64 readBytes = device->read(head, sizeof(head)); + const bool readOk = readBytes == sizeof(head); + + if (device->isSequential()) { + while (readBytes > 0) + device->ungetChar(head[readBytes-- - 1]); + } else { + device->seek(oldPos); + } + + if ( !readOk ) + return false; + + return head[2] == '\001' && head[3] == '\000' && // type should be 1 + ( head[6] == 16 || head[6] == 32 || head[6] == 64 ) && // width can only be one of those + ( head[7] == 16 || head[7] == 32 || head[7] == 64 ); // same for height +} + +class ICOPlugin : public QImageIOPlugin +{ +#ifdef QBT_USES_QT5 + Q_PLUGIN_METADATA(IID "org.qbittorrent.ICOPlugin") +#endif +public: + QStringList keys() const; + Capabilities capabilities(QIODevice *device, const QByteArray &format) const; + QImageIOHandler *create(QIODevice *device, const QByteArray &format = QByteArray()) const; +}; + +QStringList ICOPlugin::keys() const +{ + return QStringList() << "ico" << "ICO"; +} + +QImageIOPlugin::Capabilities ICOPlugin::capabilities(QIODevice *device, const QByteArray &format) const +{ + if (format == "ico" || format == "ICO") + return Capabilities(CanRead); + if (!format.isEmpty()) + return 0; + if (!device->isOpen()) + return 0; + + Capabilities cap; + if (device->isReadable() && ICOHandler::canRead(device)) + cap |= CanRead; + return cap; +} + +QImageIOHandler *ICOPlugin::create(QIODevice *device, const QByteArray &format) const +{ + QImageIOHandler *handler = new ICOHandler; + handler->setDevice(device); + handler->setFormat(format); + return handler; +} + +#ifndef QBT_USES_QT5 +Q_EXPORT_STATIC_PLUGIN(ICOPlugin) +Q_EXPORT_PLUGIN2(ico, ICOPlugin) +#endif diff -Nru qbittorrent-4.1.3/src/gui/ico.h qbittorrent-3.3.15/src/gui/ico.h --- qbittorrent-4.1.3/src/gui/ico.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/ico.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,52 @@ +/* + * ico.h - kimgio import filter for MS Windows .ico files + * + * Distributed under the terms of the LGPL + * Copyright (c) 2000 Malte Starostik + * + */ + +// You can use QImageIO::setParameters() to request a specific +// Icon out of an .ico file: +// +// Options consist of a name=value pair and are separated by a semicolon. +// Available options are: +// size= select the icon that most closely matches (pixels) +// default: 32 +// colors= select the icon that has colors (or comes closest) +// default: 1 << display depth or 0 (RGB) if display depth > 8 +// index= select the indexth icon from the file. If this option +// is present, the size and colors options will be ignored. +// default: none +// If both size and colors are given, size takes precedence. +// +// The old format is still supported: +// the parameters consist of a single string in the form +// "[:]" which correspond to the options above +// +// If an icon was returned (i.e. the file is valid and the index option +// if present was not out of range), the icon's index within the .ico +// file is returned in the text tag "X-Index" of the image. +// If the icon is in fact a cursor, its hotspot coordinates are returned +// in the text tags "X-HotspotX" and "X-HotspotY". + +#ifndef _ICO_H_ +#define _ICO_H_ + +#include + +class ICOHandler : public QImageIOHandler +{ +public: + ICOHandler(); + + bool canRead() const; + bool read(QImage *image); + bool write(const QImage &image); + + QByteArray name() const; + + static bool canRead(QIODevice *device); +}; + +#endif diff -Nru qbittorrent-4.1.3/src/gui/ipsubnetwhitelistoptionsdialog.cpp qbittorrent-3.3.15/src/gui/ipsubnetwhitelistoptionsdialog.cpp --- qbittorrent-4.1.3/src/gui/ipsubnetwhitelistoptionsdialog.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/ipsubnetwhitelistoptionsdialog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,111 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Thomas Piccirello - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "ipsubnetwhitelistoptionsdialog.h" - -#include -#include -#include - -#include "base/global.h" -#include "base/preferences.h" -#include "base/utils/net.h" -#include "ui_ipsubnetwhitelistoptionsdialog.h" -#include "utils.h" - -IPSubnetWhitelistOptionsDialog::IPSubnetWhitelistOptionsDialog(QWidget *parent) - : QDialog(parent) - , m_ui(new Ui::IPSubnetWhitelistOptionsDialog) - , m_modified(false) -{ - m_ui->setupUi(this); - - QStringList authSubnetWhitelistStringList; - for (const Utils::Net::Subnet &subnet : copyAsConst(Preferences::instance()->getWebUiAuthSubnetWhitelist())) - authSubnetWhitelistStringList << Utils::Net::subnetToString(subnet); - m_model = new QStringListModel(authSubnetWhitelistStringList, this); - - m_sortFilter = new QSortFilterProxyModel(this); - m_sortFilter->setDynamicSortFilter(true); - m_sortFilter->setSourceModel(m_model); - - m_ui->whitelistedIPSubnetList->setModel(m_sortFilter); - m_ui->whitelistedIPSubnetList->sortByColumn(0, Qt::AscendingOrder); - m_ui->buttonWhitelistIPSubnet->setEnabled(false); - - Utils::Gui::resize(this); -} - -IPSubnetWhitelistOptionsDialog::~IPSubnetWhitelistOptionsDialog() -{ - delete m_ui; -} - -void IPSubnetWhitelistOptionsDialog::on_buttonBox_accepted() -{ - if (m_modified) { - // save to session - QStringList subnets; - // Operate on the m_sortFilter to grab the strings in sorted order - for (int i = 0; i < m_sortFilter->rowCount(); ++i) - subnets.append(m_sortFilter->index(i, 0).data().toString()); - Preferences::instance()->setWebUiAuthSubnetWhitelist(subnets); - QDialog::accept(); - } - else { - QDialog::reject(); - } -} - -void IPSubnetWhitelistOptionsDialog::on_buttonWhitelistIPSubnet_clicked() -{ - bool ok = false; - const Utils::Net::Subnet subnet = Utils::Net::parseSubnet(m_ui->txtIPSubnet->text(), &ok); - if (!ok) { - QMessageBox::critical(this, tr("Error"), tr("The entered subnet is invalid.")); - return; - } - - m_model->insertRow(m_model->rowCount()); - m_model->setData(m_model->index(m_model->rowCount() - 1, 0), Utils::Net::subnetToString(subnet)); - m_ui->txtIPSubnet->clear(); - m_modified = true; -} - -void IPSubnetWhitelistOptionsDialog::on_buttonDeleteIPSubnet_clicked() -{ - for (const auto &i : copyAsConst(m_ui->whitelistedIPSubnetList->selectionModel()->selectedIndexes())) - m_sortFilter->removeRow(i.row()); - - m_modified = true; -} - -void IPSubnetWhitelistOptionsDialog::on_txtIPSubnet_textChanged(const QString &subnetStr) -{ - m_ui->buttonWhitelistIPSubnet->setEnabled(Utils::Net::canParseSubnet(subnetStr)); -} diff -Nru qbittorrent-4.1.3/src/gui/ipsubnetwhitelistoptionsdialog.h qbittorrent-3.3.15/src/gui/ipsubnetwhitelistoptionsdialog.h --- qbittorrent-4.1.3/src/gui/ipsubnetwhitelistoptionsdialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/ipsubnetwhitelistoptionsdialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,64 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Thomas Piccirello - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef OPTIONS_IPSUBNETWHITELIST_H -#define OPTIONS_IPSUBNETWHITELIST_H - -#include - -class QSortFilterProxyModel; -class QStringListModel; - -namespace Ui -{ - class IPSubnetWhitelistOptionsDialog; -} - -class IPSubnetWhitelistOptionsDialog : public QDialog -{ - Q_OBJECT - Q_DISABLE_COPY(IPSubnetWhitelistOptionsDialog) - -public: - explicit IPSubnetWhitelistOptionsDialog(QWidget *parent = nullptr); - ~IPSubnetWhitelistOptionsDialog(); - -private slots: - void on_buttonBox_accepted(); - void on_buttonWhitelistIPSubnet_clicked(); - void on_buttonDeleteIPSubnet_clicked(); - void on_txtIPSubnet_textChanged(const QString &subnetStr); - -private: - Ui::IPSubnetWhitelistOptionsDialog *m_ui; - QStringListModel *m_model; - QSortFilterProxyModel *m_sortFilter; - bool m_modified; -}; - -#endif // OPTIONS_IPSUBNETWHITELIST_H diff -Nru qbittorrent-4.1.3/src/gui/ipsubnetwhitelistoptionsdialog.ui qbittorrent-3.3.15/src/gui/ipsubnetwhitelistoptionsdialog.ui --- qbittorrent-4.1.3/src/gui/ipsubnetwhitelistoptionsdialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/ipsubnetwhitelistoptionsdialog.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,114 +0,0 @@ - - - IPSubnetWhitelistOptionsDialog - - - - 0 - 0 - 360 - 450 - - - - List of whitelisted IP subnets - - - - - - true - - - QFrame::Panel - - - QFrame::Raised - - - - - - false - - - true - - - false - - - true - - - false - - - - - - - - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - - - - - - - - - - - Add subnet - - - - - - - Delete - - - - - - - - - - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - whitelistedIPSubnetList - txtIPSubnet - buttonWhitelistIPSubnet - buttonDeleteIPSubnet - - - - - buttonBox - rejected() - IPSubnetWhitelistOptionsDialog - reject() - - - 179 - 427 - - - 179 - 224 - - - - - diff -Nru qbittorrent-4.1.3/src/gui/lineedit/CMakeLists.txt qbittorrent-3.3.15/src/gui/lineedit/CMakeLists.txt --- qbittorrent-4.1.3/src/gui/lineedit/CMakeLists.txt 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/lineedit/CMakeLists.txt 2017-08-03 20:30:10.000000000 +0000 @@ -1,13 +1,20 @@ -add_library(qbt_lineedit STATIC +set(QBT_LINEEDIT_SOURCES src/lineedit.cpp +) + +set(QBT_LINEEDIT_HEADERS src/lineedit.h ) -target_link_libraries(qbt_lineedit - PRIVATE - qbt_gui_headers - PUBLIC - Qt5::Widgets +set(QBT_LINEEDIT_RESOURCES +resources/lineeditimages.qrc ) -target_include_directories(qbt_lineedit PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src) +add_library(qbt_lineedit STATIC ${QBT_LINEEDIT_SOURCES} ${QBT_LINEEDIT_HEADERS}) +if (QT4_FOUND) + target_link_libraries(qbt_lineedit Qt4::QtGui) +else (QT4_FOUND) + target_link_libraries(qbt_lineedit Qt5::Widgets) +endif (QT4_FOUND) + +qbt_target_sources(${QBT_LINEEDIT_RESOURCES}) diff -Nru qbittorrent-4.1.3/src/gui/lineedit/lineedit.pri qbittorrent-3.3.15/src/gui/lineedit/lineedit.pri --- qbittorrent-4.1.3/src/gui/lineedit/lineedit.pri 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/lineedit/lineedit.pri 2017-08-03 20:30:10.000000000 +0000 @@ -1,3 +1,4 @@ INCLUDEPATH += $$PWD/src HEADERS += $$PWD/src/lineedit.h SOURCES += $$PWD/src/lineedit.cpp +RESOURCES += $$PWD/resources/lineeditimages.qrc Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/gui/lineedit/resources/lineeditimages/clear_left.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/gui/lineedit/resources/lineeditimages/clear_left.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/gui/lineedit/resources/lineeditimages/search.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/gui/lineedit/resources/lineeditimages/search.png differ diff -Nru qbittorrent-4.1.3/src/gui/lineedit/resources/lineeditimages.qrc qbittorrent-3.3.15/src/gui/lineedit/resources/lineeditimages.qrc --- qbittorrent-4.1.3/src/gui/lineedit/resources/lineeditimages.qrc 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/lineedit/resources/lineeditimages.qrc 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,6 @@ + + + lineeditimages/clear_left.png + lineeditimages/search.png + + diff -Nru qbittorrent-4.1.3/src/gui/lineedit/src/lineedit.cpp qbittorrent-3.3.15/src/gui/lineedit/src/lineedit.cpp --- qbittorrent-4.1.3/src/gui/lineedit/src/lineedit.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/lineedit/src/lineedit.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -8,35 +8,63 @@ ****************************************************************************/ #include "lineedit.h" - #include - -#include #include #include - -#include "guiiconprovider.h" +#include LineEdit::LineEdit(QWidget *parent) : QLineEdit(parent) { - m_searchButton = new QToolButton(this); - m_searchButton->setIcon(GuiIconProvider::instance()->getIcon("edit-find")); - m_searchButton->setCursor(Qt::ArrowCursor); - m_searchButton->setStyleSheet("QToolButton {border: none; padding: 2px;}"); - - // padding between text and widget borders - setStyleSheet(QString("QLineEdit {padding-left: %1px;}").arg(m_searchButton->sizeHint().width())); - + QPixmap pixmap1(":/lineeditimages/search.png"); + searchButton = new QToolButton(this); + searchButton->setIcon(QIcon(pixmap1)); + searchButton->setIconSize(pixmap1.size()); + searchButton->setCursor(Qt::ArrowCursor); + searchButton->setStyleSheet("QToolButton { border: none; padding: 2px; }"); + QSize searchButtonHint = searchButton->sizeHint(); + + QSize clearButtonHint(0, 0); +#ifndef QBT_USES_QT5 + QPixmap pixmap2(":/lineeditimages/clear_left.png"); + clearButton = new QToolButton(this); + clearButton->setIcon(QIcon(pixmap2)); + clearButton->setIconSize(pixmap2.size()); + clearButton->setCursor(Qt::ArrowCursor); + clearButton->setStyleSheet("QToolButton { border: none; padding: 2px; }"); + clearButton->setToolTip(tr("Clear the text")); + clearButton->hide(); + connect(clearButton, SIGNAL(clicked()), this, SLOT(clear())); + connect(this, SIGNAL(textChanged(const QString &)), this, SLOT(updateCloseButton(const QString &))); + + clearButtonHint = clearButton->sizeHint(); + setStyleSheet(QString("QLineEdit { padding-left: %1px; padding-right: %2px; }").arg(searchButtonHint.width()).arg(clearButtonHint.width())); +#else setClearButtonEnabled(true); + setStyleSheet(QString("QLineEdit { padding-left: %1px; }").arg(searchButtonHint.width())); // padding between text and widget borders +#endif - const int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); - setMaximumHeight(std::max(sizeHint().height(), m_searchButton->sizeHint().height()) + frameWidth * 2); + QSize widgetHint = sizeHint(); + int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); + setMaximumHeight(std::max({ widgetHint.height(), searchButtonHint.height(), clearButtonHint.height() }) + frameWidth * 2); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); } void LineEdit::resizeEvent(QResizeEvent *e) { - const int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); - m_searchButton->move(frameWidth, (e->size().height() - m_searchButton->sizeHint().height()) / 2); + int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); + + QSize sz = searchButton->sizeHint(); + searchButton->move(frameWidth, (e->size().height() - sz.height()) / 2); +#ifndef QBT_USES_QT5 + QSize cz = clearButton->sizeHint(); + clearButton->move((e->size().width() - frameWidth - cz.width()), (e->size().height() - sz.height()) / 2); +#endif +} + +#ifndef QBT_USES_QT5 +void LineEdit::updateCloseButton(const QString &text) +{ + clearButton->setVisible(!text.isEmpty()); } +#endif diff -Nru qbittorrent-4.1.3/src/gui/lineedit/src/lineedit.h qbittorrent-3.3.15/src/gui/lineedit/src/lineedit.h --- qbittorrent-4.1.3/src/gui/lineedit/src/lineedit.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/lineedit/src/lineedit.h 2017-08-03 20:30:10.000000000 +0000 @@ -22,10 +22,18 @@ LineEdit(QWidget *parent); protected: - void resizeEvent(QResizeEvent *e) override; + void resizeEvent(QResizeEvent *e); + +#ifndef QBT_USES_QT5 +private slots: + void updateCloseButton(const QString &text); +#endif private: - QToolButton *m_searchButton; + QToolButton *searchButton; +#ifndef QBT_USES_QT5 + QToolButton *clearButton; +#endif }; #endif // LIENEDIT_H diff -Nru qbittorrent-4.1.3/src/gui/login.ui qbittorrent-3.3.15/src/gui/login.ui --- qbittorrent-4.1.3/src/gui/login.ui 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/login.ui 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,233 @@ + + + authentication + + + + 0 + 0 + 311 + 231 + + + + Tracker authentication + + + + + + + + + 39 + 39 + + + + + + + + + + + + 16777215 + 39 + + + + + 75 + true + + + + Tracker authentication + + + + + + + + + + + + 75 + true + + + + Tracker: + + + + + + + + 220 + 0 + + + + + + + + + + + + + Login + + + + + + + + Username: + + + lineUsername + + + + + + + + + + + + + + + 68 + 0 + + + + Password: + + + linePasswd + + + + + + + QLineEdit::Password + + + + + + + + + + + + + + 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 -Nru qbittorrent-4.1.3/src/gui/loglistwidget.cpp qbittorrent-3.3.15/src/gui/loglistwidget.cpp --- qbittorrent-4.1.3/src/gui/loglistwidget.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/loglistwidget.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2011 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2011 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,18 +24,17 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ - -#include "loglistwidget.h" - -#include +#include #include #include -#include -#include #include -#include - +#include +#include +#include +#include "loglistwidget.h" #include "guiiconprovider.h" LogListWidget::LogListWidget(int maxLines, const Log::MsgTypes &types, QWidget *parent) @@ -48,8 +47,8 @@ // Context menu QAction *copyAct = new QAction(GuiIconProvider::instance()->getIcon("edit-copy"), tr("Copy"), this); QAction *clearAct = new QAction(GuiIconProvider::instance()->getIcon("edit-clear"), tr("Clear"), this); - connect(copyAct, &QAction::triggered, this, &LogListWidget::copySelection); - connect(clearAct, &QAction::triggered, this, &LogListWidget::clear); + connect(copyAct, SIGNAL(triggered()), SLOT(copySelection())); + connect(clearAct, SIGNAL(triggered()), SLOT(clear())); addAction(copyAct); addAction(clearAct); setContextMenuPolicy(Qt::ActionsContextMenu); @@ -95,10 +94,10 @@ void LogListWidget::copySelection() { - static const QRegularExpression htmlTag("<[^>]+>"); + static QRegExp htmlTag("<[^>]+>"); QStringList strings; foreach (QListWidgetItem* it, selectedItems()) - strings << static_cast(itemWidget(it))->text().remove(htmlTag); + strings << static_cast(itemWidget(it))->text().replace(htmlTag, ""); - QApplication::clipboard()->setText(strings.join('\n')); + QApplication::clipboard()->setText(strings.join("\n")); } diff -Nru qbittorrent-4.1.3/src/gui/loglistwidget.h qbittorrent-3.3.15/src/gui/loglistwidget.h --- qbittorrent-4.1.3/src/gui/loglistwidget.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/loglistwidget.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2011 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2011 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,23 +24,26 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ - #ifndef LOGLISTWIDGET_H #define LOGLISTWIDGET_H #include #include "base/logger.h" +QT_BEGIN_NAMESPACE class QKeyEvent; +QT_END_NAMESPACE -class LogListWidget : public QListWidget +class LogListWidget: public QListWidget { Q_OBJECT public: // -1 is the portable way to have all the bits set - explicit LogListWidget(int maxLines, const Log::MsgTypes &types = Log::ALL, QWidget *parent = nullptr); + explicit LogListWidget(int maxLines, const Log::MsgTypes &types = Log::ALL, QWidget *parent = 0); void showMsgTypes(const Log::MsgTypes &types); public slots: @@ -50,7 +53,7 @@ void copySelection(); protected: - void keyPressEvent(QKeyEvent *event) override; + void keyPressEvent(QKeyEvent *event); private: int m_maxLines; diff -Nru qbittorrent-4.1.3/src/gui/macutilities.h qbittorrent-3.3.15/src/gui/macutilities.h --- qbittorrent-4.1.3/src/gui/macutilities.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/macutilities.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Brian Kendall - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef MACUTILITIES_H -#define MACUTILITIES_H - -#include -#include -#include - -namespace MacUtils -{ - QPixmap pixmapForExtension(const QString &ext, const QSize &size); - void overrideDockClickHandler(bool (*dockClickHandler)(id, SEL, ...)); - void displayNotification(const QString &title, const QString &message); - void openFiles(const QSet &pathsList); -} - -#endif // MACUTILITIES_H diff -Nru qbittorrent-4.1.3/src/gui/macutilities.mm qbittorrent-3.3.15/src/gui/macutilities.mm --- qbittorrent-4.1.3/src/gui/macutilities.mm 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/macutilities.mm 1970-01-01 00:00:00.000000000 +0000 @@ -1,99 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Brian Kendall - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "macutilities.h" - -#include -#include -#include -#import - -namespace MacUtils -{ - QPixmap pixmapForExtension(const QString &ext, const QSize &size) - { - @autoreleasepool { - NSImage *image = [[NSWorkspace sharedWorkspace] iconForFileType:ext.toNSString()]; - if (image) { - NSRect rect = NSMakeRect(0, 0, size.width(), size.height()); - CGImageRef cgImage = [image CGImageForProposedRect:&rect context:nil hints:nil]; - return QtMac::fromCGImageRef(cgImage); - } - - return QPixmap(); - } - } - - void overrideDockClickHandler(bool (*dockClickHandler)(id, SEL, ...)) - { - NSApplication *appInst = [NSApplication sharedApplication]; - - if (!appInst) - return; - - Class delClass = [[appInst delegate] class]; - SEL shouldHandle = sel_registerName("applicationShouldHandleReopen:hasVisibleWindows:"); - - if (class_getInstanceMethod(delClass, shouldHandle)) { - if (class_replaceMethod(delClass, shouldHandle, (IMP)dockClickHandler, "B@:")) - qDebug("Registered dock click handler (replaced original method)"); - else - qWarning("Failed to replace method for dock click handler"); - } - else { - if (class_addMethod(delClass, shouldHandle, (IMP)dockClickHandler, "B@:")) - qDebug("Registered dock click handler"); - else - qWarning("Failed to register dock click handler"); - } - } - - void displayNotification(const QString &title, const QString &message) - { - @autoreleasepool { - NSUserNotification *notification = [[NSUserNotification alloc] init]; - notification.title = title.toNSString(); - notification.informativeText = message.toNSString(); - notification.soundName = NSUserNotificationDefaultSoundName; - - [[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:notification]; - } - } - - void openFiles(const QSet &pathsList) - { - @autoreleasepool { - NSMutableArray *pathURLs = [NSMutableArray arrayWithCapacity:pathsList.size()]; - - for (const auto &path : pathsList) - [pathURLs addObject:[NSURL fileURLWithPath:path.toNSString()]]; - - [[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs:pathURLs]; - } - } -} diff -Nru qbittorrent-4.1.3/src/gui/mainwindow.cpp qbittorrent-3.3.15/src/gui/mainwindow.cpp --- qbittorrent-4.1.3/src/gui/mainwindow.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/mainwindow.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,91 +24,76 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #include "mainwindow.h" -#include -#include -#include +#include +#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) && defined(QT_DBUS_LIB) +#include +#include "notifications.h" +#endif #include -#include #include #include #include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include #include +#include #include -#include #include -#include -#include +#include +#include +#include -#ifdef Q_OS_MAC -#include -#include -#endif -#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) && defined(QT_DBUS_LIB) -#include -#include "notifications.h" +#include "base/preferences.h" +#include "base/settingsstorage.h" +#include "base/logger.h" +#include "base/utils/misc.h" +#include "base/utils/fs.h" +#ifdef Q_OS_WIN +#include "base/net/downloadmanager.h" +#include "base/net/downloadhandler.h" #endif - #include "base/bittorrent/session.h" #include "base/bittorrent/sessionstatus.h" #include "base/bittorrent/torrenthandle.h" -#include "base/global.h" -#include "base/logger.h" -#include "base/preferences.h" -#include "base/rss/rss_folder.h" -#include "base/rss/rss_session.h" -#include "base/settingsstorage.h" -#include "base/utils/foreignapps.h" -#include "base/utils/fs.h" -#include "base/utils/misc.h" -#include "aboutdialog.h" -#include "addnewtorrentdialog.h" + #include "application.h" +#if defined(Q_OS_WIN) || defined(Q_OS_MAC) +#include "programupdater.h" +#endif +#include "powermanagement.h" +#include "guiiconprovider.h" +#include "torrentmodel.h" #include "autoexpandabledialog.h" +#include "torrentcreatordlg.h" +#include "downloadfromurldlg.h" +#include "addnewtorrentdialog.h" +#include "statsdialog.h" #include "cookiesdialog.h" -#include "downloadfromurldialog.h" -#include "executionlogwidget.h" -#include "guiiconprovider.h" -#include "hidabletabwidget.h" -#include "lineedit.h" -#include "optionsdialog.h" +#include "speedlimitdlg.h" +#include "transferlistwidget.h" +#include "search/searchwidget.h" +#include "trackerlist.h" #include "peerlistwidget.h" -#include "powermanagement.h" +#include "transferlistfilterswidget.h" #include "propertieswidget.h" -#include "rss/rsswidget.h" -#include "search/searchwidget.h" -#include "speedlimitdialog.h" -#include "statsdialog.h" #include "statusbar.h" -#include "torrentcreatordialog.h" -#include "transferlistmodel.h" -#include "trackerlistwidget.h" -#include "transferlistfilterswidget.h" -#include "transferlistwidget.h" +#include "rss_imp.h" +#include "about_imp.h" +#include "optionsdlg.h" +#include "trackerlogin.h" +#include "lineedit.h" +#include "executionlog.h" +#include "hidabletabwidget.h" #include "ui_mainwindow.h" -#include "utils.h" - -#ifdef Q_OS_WIN -#include "base/net/downloadhandler.h" -#include "base/net/downloadmanager.h" -#endif -#ifdef Q_OS_MAC -#include "macutilities.h" -#endif -#if defined(Q_OS_WIN) || defined(Q_OS_MAC) -#include "programupdater.h" -#endif -#if LIBTORRENT_VERSION_NUM < 10100 -#include "trackerlogindialog.h" -#endif #ifdef Q_OS_MAC void qt_mac_set_dock_menu(QMenu *menu); @@ -122,17 +107,17 @@ #define SETTINGS_KEY(name) "GUI/" name // ExecutionLog properties keys -#define EXECUTIONLOG_SETTINGS_KEY(name) QStringLiteral(SETTINGS_KEY("Log/") name) +#define EXECUTIONLOG_SETTINGS_KEY(name) SETTINGS_KEY("Log/") name const QString KEY_EXECUTIONLOG_ENABLED = EXECUTIONLOG_SETTINGS_KEY("Enabled"); const QString KEY_EXECUTIONLOG_TYPES = EXECUTIONLOG_SETTINGS_KEY("Types"); // Notifications properties keys -#define NOTIFICATIONS_SETTINGS_KEY(name) QStringLiteral(SETTINGS_KEY("Notifications/") name) +#define NOTIFICATIONS_SETTINGS_KEY(name) SETTINGS_KEY("Notifications/") name const QString KEY_NOTIFICATIONS_ENABLED = NOTIFICATIONS_SETTINGS_KEY("Enabled"); const QString KEY_NOTIFICATIONS_TORRENTADDED = NOTIFICATIONS_SETTINGS_KEY("TorrentAdded"); // Misc - const QString KEY_DOWNLOAD_TRACKER_FAVICON = QStringLiteral(SETTINGS_KEY("DownloadTrackerFavicon")); + const QString KEY_DOWNLOAD_TRACKER_FAVICON = NOTIFICATIONS_SETTINGS_KEY("DownloadTrackerFavicon"); // just a shortcut inline SettingsStorage *settings() @@ -159,29 +144,21 @@ setWindowTitle("qBittorrent " QBT_VERSION); m_displaySpeedInTitle = pref->speedInTitleBar(); // Setting icons -#ifndef Q_OS_MAC -#ifdef Q_OS_UNIX - const QIcon appLogo = Preferences::instance()->useSystemIconTheme() - ? QIcon::fromTheme("qbittorrent", QIcon(":/icons/skin/qbittorrent-tray.svg")) - : QIcon(":/icons/skin/qbittorrent-tray.svg"); -#else - const QIcon appLogo(":/icons/skin/qbittorrent-tray.svg"); -#endif // Q_OS_UNIX - setWindowIcon(appLogo); -#endif // Q_OS_MAC - -#if (defined(Q_OS_UNIX)) - m_ui->actionOptions->setText(tr("Preferences")); +#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) + if (Preferences::instance()->useSystemIconTheme()) + setWindowIcon(QIcon::fromTheme("qbittorrent", QIcon(":/icons/skin/qbittorrent32.png"))); + else #endif + setWindowIcon(QIcon(":/icons/skin/qbittorrent32.png")); addToolbarContextMenu(); m_ui->actionOpen->setIcon(GuiIconProvider::instance()->getIcon("list-add")); m_ui->actionDownloadFromURL->setIcon(GuiIconProvider::instance()->getIcon("insert-link")); - m_ui->actionSetUploadLimit->setIcon(GuiIconProvider::instance()->getIcon("kt-set-max-upload-speed")); - m_ui->actionSetDownloadLimit->setIcon(GuiIconProvider::instance()->getIcon("kt-set-max-download-speed")); - m_ui->actionSetGlobalUploadLimit->setIcon(GuiIconProvider::instance()->getIcon("kt-set-max-upload-speed")); - m_ui->actionSetGlobalDownloadLimit->setIcon(GuiIconProvider::instance()->getIcon("kt-set-max-download-speed")); + m_ui->actionSetUploadLimit->setIcon(QIcon(":/icons/skin/uploadLimit.png")); + m_ui->actionSetDownloadLimit->setIcon(QIcon(":/icons/skin/downloadLimit.png")); + m_ui->actionSetGlobalUploadLimit->setIcon(QIcon(":/icons/skin/uploadLimit.png")); + m_ui->actionSetGlobalDownloadLimit->setIcon(QIcon(":/icons/skin/downloadLimit.png")); m_ui->actionCreateTorrent->setIcon(GuiIconProvider::instance()->getIcon("document-edit")); m_ui->actionAbout->setIcon(GuiIconProvider::instance()->getIcon("help-about")); m_ui->actionStatistics->setIcon(GuiIconProvider::instance()->getIcon("view-statistics")); @@ -194,7 +171,7 @@ m_ui->actionIncreasePriority->setIcon(GuiIconProvider::instance()->getIcon("go-up")); m_ui->actionTopPriority->setIcon(GuiIconProvider::instance()->getIcon("go-top")); m_ui->actionLock->setIcon(GuiIconProvider::instance()->getIcon("object-locked")); - m_ui->actionOptions->setIcon(GuiIconProvider::instance()->getIcon("configure", "preferences-system")); + m_ui->actionOptions->setIcon(GuiIconProvider::instance()->getIcon("preferences-system")); m_ui->actionPause->setIcon(GuiIconProvider::instance()->getIcon("media-playback-pause")); m_ui->actionPauseAll->setIcon(GuiIconProvider::instance()->getIcon("media-playback-pause")); m_ui->actionStart->setIcon(GuiIconProvider::instance()->getIcon("media-playback-start")); @@ -204,24 +181,24 @@ QMenu *lockMenu = new QMenu(this); QAction *defineUiLockPasswdAct = lockMenu->addAction(tr("&Set Password")); - connect(defineUiLockPasswdAct, &QAction::triggered, this, &MainWindow::defineUILockPassword); + connect(defineUiLockPasswdAct, SIGNAL(triggered()), this, SLOT(defineUILockPassword())); QAction *clearUiLockPasswdAct = lockMenu->addAction(tr("&Clear Password")); - connect(clearUiLockPasswdAct, &QAction::triggered, this, &MainWindow::clearUILockPassword); + connect(clearUiLockPasswdAct, SIGNAL(triggered()), this, SLOT(clearUILockPassword())); m_ui->actionLock->setMenu(lockMenu); // Creating Bittorrent session - connect(BitTorrent::Session::instance(), &BitTorrent::Session::fullDiskError, this, &MainWindow::fullDiskError); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::addTorrentFailed, this, &MainWindow::addTorrentFailed); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::torrentNew,this, &MainWindow::torrentNew); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::torrentFinished, this, &MainWindow::finishedTorrent); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackerAuthenticationRequired, this, &MainWindow::trackerAuthenticationRequired); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::downloadFromUrlFailed, this, &MainWindow::handleDownloadFromUrlFailure); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::speedLimitModeChanged, this, &MainWindow::updateAltSpeedsBtn); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::recursiveTorrentDownloadPossible, this, &MainWindow::askRecursiveTorrentDownloadConfirmation); + connect(BitTorrent::Session::instance(), SIGNAL(fullDiskError(BitTorrent::TorrentHandle * const,QString)), this, SLOT(fullDiskError(BitTorrent::TorrentHandle * const,QString))); + connect(BitTorrent::Session::instance(), SIGNAL(addTorrentFailed(const QString&)), this, SLOT(addTorrentFailed(const QString&))); + connect(BitTorrent::Session::instance(), SIGNAL(torrentNew(BitTorrent::TorrentHandle * const)), this, SLOT(torrentNew(BitTorrent::TorrentHandle * const))); + connect(BitTorrent::Session::instance(), SIGNAL(torrentFinished(BitTorrent::TorrentHandle * const)), this, SLOT(finishedTorrent(BitTorrent::TorrentHandle * const))); + connect(BitTorrent::Session::instance(), SIGNAL(trackerAuthenticationRequired(BitTorrent::TorrentHandle * const)), this, SLOT(trackerAuthenticationRequired(BitTorrent::TorrentHandle * const))); + connect(BitTorrent::Session::instance(), SIGNAL(downloadFromUrlFailed(QString,QString)), this, SLOT(handleDownloadFromUrlFailure(QString,QString))); + connect(BitTorrent::Session::instance(), SIGNAL(speedLimitModeChanged(bool)), this, SLOT(updateAltSpeedsBtn(bool))); + connect(BitTorrent::Session::instance(), SIGNAL(recursiveTorrentDownloadPossible(BitTorrent::TorrentHandle * const)), this, SLOT(askRecursiveTorrentDownloadConfirmation(BitTorrent::TorrentHandle * const))); qDebug("create tabWidget"); m_tabs = new HidableTabWidget(this); - connect(m_tabs.data(), &QTabWidget::currentChanged, this, &MainWindow::tabChanged); + connect(m_tabs, SIGNAL(currentChanged(int)), this, SLOT(tabChanged(int))); m_splitter = new QSplitter(Qt::Horizontal, this); // vSplitter->setChildrenCollapsible(false); @@ -232,11 +209,9 @@ // Name filter m_searchFilter = new LineEdit(this); - m_searchFilter->setPlaceholderText(tr("Filter torrent list...")); - m_searchFilter->setFixedWidth(Utils::Gui::scaledSize(this, 200)); - m_searchFilter->setContextMenuPolicy(Qt::CustomContextMenu); - connect(m_searchFilter, &QWidget::customContextMenuRequested, this, &MainWindow::showFilterContextMenu); m_searchFilterAction = m_ui->toolBar->insertWidget(m_ui->actionLock, m_searchFilter); + m_searchFilter->setPlaceholderText(tr("Filter torrent list...")); + m_searchFilter->setFixedWidth(200); QWidget *spacer = new QWidget(this); spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); @@ -254,106 +229,65 @@ m_splitter->addWidget(hSplitter); m_splitter->setCollapsible(0, true); m_splitter->setCollapsible(1, false); - m_tabs->addTab(m_splitter, -#ifndef Q_OS_MAC - GuiIconProvider::instance()->getIcon("folder-remote"), -#endif - tr("Transfers")); - - connect(m_searchFilter, &LineEdit::textChanged, m_transferListWidget, &TransferListWidget::applyNameFilter); - connect(hSplitter, &QSplitter::splitterMoved, this, &MainWindow::writeSettings); - connect(m_splitter, &QSplitter::splitterMoved, this, &MainWindow::writeSettings); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackersChanged, m_propertiesWidget, &PropertiesWidget::loadTrackers); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackersAdded, m_transferListFiltersWidget, &TransferListFiltersWidget::addTrackers); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackersRemoved, m_transferListFiltersWidget, &TransferListFiltersWidget::removeTrackers); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackerlessStateChanged, m_transferListFiltersWidget, &TransferListFiltersWidget::changeTrackerless); - - using Func = void (TransferListFiltersWidget::*)(BitTorrent::TorrentHandle *const, const QString &); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackerSuccess, m_transferListFiltersWidget, static_cast(&TransferListFiltersWidget::trackerSuccess)); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackerError, m_transferListFiltersWidget, static_cast(&TransferListFiltersWidget::trackerError)); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::trackerWarning, m_transferListFiltersWidget, static_cast(&TransferListFiltersWidget::trackerWarning)); + m_tabs->addTab(m_splitter, GuiIconProvider::instance()->getIcon("folder-remote"), tr("Transfers")); -#ifdef Q_OS_MAC - // Increase top spacing to avoid tab overlapping - m_ui->centralWidgetLayout->addSpacing(8); -#endif + connect(m_searchFilter, SIGNAL(textChanged(QString)), m_transferListWidget, SLOT(applyNameFilter(QString))); + connect(hSplitter, SIGNAL(splitterMoved(int,int)), this, SLOT(writeSettings())); + connect(m_splitter, SIGNAL(splitterMoved(int,int)), this, SLOT(writeSettings())); + connect(BitTorrent::Session::instance(), SIGNAL(trackersChanged(BitTorrent::TorrentHandle * const)), m_propertiesWidget, SLOT(loadTrackers(BitTorrent::TorrentHandle * const))); + connect(BitTorrent::Session::instance(), SIGNAL(trackersAdded(BitTorrent::TorrentHandle * const,const QList &)), m_transferListFiltersWidget, SLOT(addTrackers(BitTorrent::TorrentHandle * const,const QList &))); + connect(BitTorrent::Session::instance(), SIGNAL(trackersRemoved(BitTorrent::TorrentHandle * const,const QList &)), m_transferListFiltersWidget, SLOT(removeTrackers(BitTorrent::TorrentHandle * const,const QList &))); + connect(BitTorrent::Session::instance(), SIGNAL(trackerlessStateChanged(BitTorrent::TorrentHandle * const,bool)), m_transferListFiltersWidget, SLOT(changeTrackerless(BitTorrent::TorrentHandle * const,bool))); + connect(BitTorrent::Session::instance(), SIGNAL(trackerSuccess(BitTorrent::TorrentHandle * const,const QString&)), m_transferListFiltersWidget, SLOT(trackerSuccess(BitTorrent::TorrentHandle * const,const QString&))); + connect(BitTorrent::Session::instance(), SIGNAL(trackerError(BitTorrent::TorrentHandle * const,const QString&)), m_transferListFiltersWidget, SLOT(trackerError(BitTorrent::TorrentHandle * const,const QString&))); + connect(BitTorrent::Session::instance(), SIGNAL(trackerWarning(BitTorrent::TorrentHandle * const,const QString&)), m_transferListFiltersWidget, SLOT(trackerWarning(BitTorrent::TorrentHandle * const,const QString&))); m_ui->centralWidgetLayout->addWidget(m_tabs); m_prioSeparator = m_ui->toolBar->insertSeparator(m_ui->actionTopPriority); m_prioSeparatorMenu = m_ui->menuEdit->insertSeparator(m_ui->actionTopPriority); -#ifdef Q_OS_MAC - foreach (QAction *action, m_ui->toolBar->actions()) { - if (action->isSeparator()) { - QWidget *spacer = new QWidget(this); - spacer->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - spacer->setMinimumWidth(16); - m_ui->toolBar->insertWidget(action, spacer); - m_ui->toolBar->removeAction(action); - } - } - { - QWidget *spacer = new QWidget(this); - spacer->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - spacer->setMinimumWidth(8); - m_ui->toolBar->insertWidget(m_ui->actionDownloadFromURL, spacer); - } - { - QWidget *spacer = new QWidget(this); - spacer->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - spacer->setMinimumWidth(8); - m_ui->toolBar->addWidget(spacer); - } -#endif - // Transfer list slots - connect(m_ui->actionStart, &QAction::triggered, m_transferListWidget, &TransferListWidget::startSelectedTorrents); - connect(m_ui->actionStartAll, &QAction::triggered, m_transferListWidget, &TransferListWidget::resumeAllTorrents); - connect(m_ui->actionPause, &QAction::triggered, m_transferListWidget, &TransferListWidget::pauseSelectedTorrents); - connect(m_ui->actionPauseAll, &QAction::triggered, m_transferListWidget, &TransferListWidget::pauseAllTorrents); - connect(m_ui->actionDelete, &QAction::triggered, m_transferListWidget, &TransferListWidget::softDeleteSelectedTorrents); - connect(m_ui->actionTopPriority, &QAction::triggered, m_transferListWidget, &TransferListWidget::topPrioSelectedTorrents); - connect(m_ui->actionIncreasePriority, &QAction::triggered, m_transferListWidget, &TransferListWidget::increasePrioSelectedTorrents); - connect(m_ui->actionDecreasePriority, &QAction::triggered, m_transferListWidget, &TransferListWidget::decreasePrioSelectedTorrents); - connect(m_ui->actionBottomPriority, &QAction::triggered, m_transferListWidget, &TransferListWidget::bottomPrioSelectedTorrents); -#ifndef Q_OS_MAC - connect(m_ui->actionToggleVisibility, &QAction::triggered, this, [this]() { toggleVisibility(); }); -#endif - connect(m_ui->actionMinimize, &QAction::triggered, this, &MainWindow::minimizeWindow); - connect(m_ui->actionUseAlternativeSpeedLimits, &QAction::triggered, this, &MainWindow::toggleAlternativeSpeeds); + connect(m_ui->actionStart, SIGNAL(triggered()), m_transferListWidget, SLOT(startSelectedTorrents())); + connect(m_ui->actionStartAll, SIGNAL(triggered()), m_transferListWidget, SLOT(resumeAllTorrents())); + connect(m_ui->actionPause, SIGNAL(triggered()), m_transferListWidget, SLOT(pauseSelectedTorrents())); + connect(m_ui->actionPauseAll, SIGNAL(triggered()), m_transferListWidget, SLOT(pauseAllTorrents())); + connect(m_ui->actionDelete, SIGNAL(triggered()), m_transferListWidget, SLOT(softDeleteSelectedTorrents())); + connect(m_ui->actionTopPriority, SIGNAL(triggered()), m_transferListWidget, SLOT(topPrioSelectedTorrents())); + connect(m_ui->actionIncreasePriority, SIGNAL(triggered()), m_transferListWidget, SLOT(increasePrioSelectedTorrents())); + connect(m_ui->actionDecreasePriority, SIGNAL(triggered()), m_transferListWidget, SLOT(decreasePrioSelectedTorrents())); + connect(m_ui->actionBottomPriority, SIGNAL(triggered()), m_transferListWidget, SLOT(bottomPrioSelectedTorrents())); + connect(m_ui->actionToggleVisibility, SIGNAL(triggered()), this, SLOT(toggleVisibility())); + connect(m_ui->actionMinimize, SIGNAL(triggered()), SLOT(minimizeWindow())); #if defined(Q_OS_WIN) || defined(Q_OS_MAC) m_programUpdateTimer = new QTimer(this); m_programUpdateTimer->setInterval(60 * 60 * 1000); m_programUpdateTimer->setSingleShot(true); - connect(m_programUpdateTimer, &QTimer::timeout, this, &MainWindow::checkProgramUpdate); - connect(m_ui->actionCheckForUpdates, &QAction::triggered, this, &MainWindow::checkProgramUpdate); + connect(m_programUpdateTimer, SIGNAL(timeout()), SLOT(checkProgramUpdate())); + connect(m_ui->actionCheckForUpdates, SIGNAL(triggered()), SLOT(checkProgramUpdate())); #else m_ui->actionCheckForUpdates->setVisible(false); #endif - // Certain menu items should reside at specific places on macOS. - // Qt partially does it on its own, but updates and different languages require tuning. - m_ui->actionExit->setMenuRole(QAction::QuitRole); - m_ui->actionAbout->setMenuRole(QAction::AboutRole); - m_ui->actionCheckForUpdates->setMenuRole(QAction::ApplicationSpecificRole); - m_ui->actionOptions->setMenuRole(QAction::PreferencesRole); - - connect(m_ui->actionManageCookies, &QAction::triggered, this, &MainWindow::manageCookies); + connect(m_ui->actionManageCookies, SIGNAL(triggered()), SLOT(manageCookies())); m_pwr = new PowerManagement(this); m_preventTimer = new QTimer(this); - connect(m_preventTimer, &QTimer::timeout, this, &MainWindow::updatePowerManagementState); + connect(m_preventTimer, SIGNAL(timeout()), SLOT(checkForActiveTorrents())); // Configure BT session according to options loadPreferences(false); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::torrentsUpdated, this, &MainWindow::updateGUI); + connect(BitTorrent::Session::instance(), SIGNAL(torrentsUpdated()), this, SLOT(updateGUI())); // Accept drag 'n drops setAcceptDrops(true); createKeyboardShortcuts(); + // Create status bar + m_statusBar = new StatusBar(QMainWindow::statusBar()); + connect(m_statusBar->connectionStatusButton(), SIGNAL(clicked()), SLOT(showConnectionSettings())); + connect(m_ui->actionUseAlternativeSpeedLimits, SIGNAL(triggered()), m_statusBar, SLOT(toggleAlternativeSpeeds())); #ifdef Q_OS_MAC setUnifiedTitleAndToolBarOnMac(true); @@ -361,9 +295,8 @@ // View settings m_ui->actionTopToolBar->setChecked(pref->isToolbarDisplayed()); - m_ui->actionShowStatusbar->setChecked(pref->isStatusbarDisplayed()); m_ui->actionSpeedInTitleBar->setChecked(pref->speedInTitleBar()); - m_ui->actionRSSReader->setChecked(pref->isRSSWidgetEnabled()); + m_ui->actionRSSReader->setChecked(pref->isRSSEnabled()); m_ui->actionSearchWidget->setChecked(pref->isSearchEnabled()); m_ui->actionExecutionLogs->setChecked(isExecutionLogEnabled()); @@ -380,7 +313,7 @@ on_actionWarningMessages_triggered(m_ui->actionWarningMessages->isChecked()); on_actionCriticalMessages_triggered(m_ui->actionCriticalMessages->isChecked()); if (m_ui->actionSearchWidget->isChecked()) - QTimer::singleShot(0, this, &MainWindow::on_actionSearchWidget_triggered); + QTimer::singleShot(0, this, SLOT(on_actionSearchWidget_triggered())); // Auto shutdown actions QActionGroup *autoShutdownGroup = new QActionGroup(this); @@ -407,7 +340,6 @@ // Load Window state and sizes readSettings(); -#ifndef Q_OS_MAC if (m_systrayIcon) { if (!(pref->startMinimized() || m_uiLocked)) { show(); @@ -416,17 +348,11 @@ } else if (pref->startMinimized()) { showMinimized(); - if (pref->minimizeToTray()) { + if (pref->minimizeToTray()) hide(); - if (!pref->minimizeToTrayNotified()) { - showNotificationBaloon(tr("qBittorrent is minimized to tray"), tr("This behavior can be changed in the settings. You won't be reminded again.")); - pref->setMinimizeToTrayNotified(true); - } - } } } else { -#endif // Make sure the Window is visible if we don't have a tray icon if (pref->startMinimized()) { showMinimized(); @@ -436,30 +362,28 @@ activateWindow(); raise(); } -#ifndef Q_OS_MAC } -#endif m_propertiesWidget->readSettings(); // Start watching the executable for updates m_executableWatcher = new QFileSystemWatcher(this); - connect(m_executableWatcher, &QFileSystemWatcher::fileChanged, this, &MainWindow::notifyOfUpdate); + connect(m_executableWatcher, SIGNAL(fileChanged(QString)), this, SLOT(notifyOfUpdate(QString))); m_executableWatcher->addPath(qApp->applicationFilePath()); m_transferListWidget->setFocus(); // Update the number of torrents (tab) updateNbTorrents(); - connect(m_transferListWidget->getSourceModel(), &QAbstractItemModel::rowsInserted, this, &MainWindow::updateNbTorrents); - connect(m_transferListWidget->getSourceModel(), &QAbstractItemModel::rowsRemoved, this, &MainWindow::updateNbTorrents); + connect(m_transferListWidget->getSourceModel(), SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(updateNbTorrents())); + connect(m_transferListWidget->getSourceModel(), SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(updateNbTorrents())); - connect(pref, &Preferences::changed, this, &MainWindow::optionsSaved); + connect(pref, SIGNAL(changed()), this, SLOT(optionsSaved())); qDebug("GUI Built"); #ifdef Q_OS_WIN if (!pref->neverCheckFileAssoc() && (!Preferences::isTorrentFileAssocSet() || !Preferences::isMagnetLinkAssocSet())) { - if (QMessageBox::question(this, tr("Torrent file association"), + if (QMessageBox::question(0, tr("Torrent file association"), tr("qBittorrent is not the default application to open torrent files or Magnet links.\nDo you want to associate qBittorrent to torrent files and Magnet links?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { Preferences::setTorrentFileAssoc(true); @@ -471,7 +395,6 @@ } #endif #ifdef Q_OS_MAC - setupDockClickHandler(); qt_mac_set_dock_menu(trayIconMenu()); #endif } @@ -541,18 +464,18 @@ m_toolbarMenu = new QMenu(this); m_ui->toolBar->setContextMenuPolicy(Qt::CustomContextMenu); - connect(m_ui->toolBar, &QWidget::customContextMenuRequested, this, &MainWindow::toolbarMenuRequested); + connect(m_ui->toolBar, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(toolbarMenuRequested(QPoint))); QAction *iconsOnly = new QAction(tr("Icons Only"), m_toolbarMenu); - connect(iconsOnly, &QAction::triggered, this, &MainWindow::toolbarIconsOnly); + connect(iconsOnly, SIGNAL(triggered()), this, SLOT(toolbarIconsOnly())); QAction *textOnly = new QAction(tr("Text Only"), m_toolbarMenu); - connect(textOnly, &QAction::triggered, this, &MainWindow::toolbarTextOnly); + connect(textOnly, SIGNAL(triggered()), this, SLOT(toolbarTextOnly())); QAction *textBesideIcons = new QAction(tr("Text Alongside Icons"), m_toolbarMenu); - connect(textBesideIcons, &QAction::triggered, this, &MainWindow::toolbarTextBeside); + connect(textBesideIcons, SIGNAL(triggered()), this, SLOT(toolbarTextBeside())); QAction *textUnderIcons = new QAction(tr("Text Under Icons"), m_toolbarMenu); - connect(textUnderIcons, &QAction::triggered, this, &MainWindow::toolbarTextUnder); + connect(textUnderIcons, SIGNAL(triggered()), this, SLOT(toolbarTextUnder())); QAction *followSystemStyle = new QAction(tr("Follow System Style"), m_toolbarMenu); - connect(followSystemStyle, &QAction::triggered, this, &MainWindow::toolbarFollowSystem); + connect(followSystemStyle, SIGNAL(triggered()), this, SLOT(toolbarFollowSystem())); m_toolbarMenu->addAction(iconsOnly); m_toolbarMenu->addAction(textOnly); m_toolbarMenu->addAction(textBesideIcons); @@ -677,24 +600,15 @@ hide(); } -void MainWindow::handleRSSUnreadCountUpdated(int count) -{ - m_tabs->setTabText(m_tabs->indexOf(m_rssWidget), tr("RSS (%1)").arg(count)); -} - void MainWindow::displayRSSTab(bool enable) { if (enable) { // RSS tab if (!m_rssWidget) { - m_rssWidget = new RSSWidget(m_tabs); - connect(m_rssWidget.data(), &RSSWidget::unreadCountUpdated, this, &MainWindow::handleRSSUnreadCountUpdated); -#ifdef Q_OS_MAC - m_tabs->addTab(m_rssWidget, tr("RSS (%1)").arg(RSS::Session::instance()->rootFolder()->unreadCount())); -#else - const int indexTab = m_tabs->addTab(m_rssWidget, tr("RSS (%1)").arg(RSS::Session::instance()->rootFolder()->unreadCount())); + m_rssWidget = new RSSImp(m_tabs); + connect(m_rssWidget, SIGNAL(updateRSSCount(int)), this, SLOT(updateRSSTabLabel(int))); + int indexTab = m_tabs->addTab(m_rssWidget, tr("RSS (%1)").arg(0)); m_tabs->setTabIcon(indexTab, GuiIconProvider::instance()->getIcon("application-rss+xml")); -#endif } } else if (m_rssWidget) { @@ -702,21 +616,9 @@ } } -void MainWindow::showFilterContextMenu(const QPoint &) +void MainWindow::updateRSSTabLabel(int count) { - const Preferences *pref = Preferences::instance(); - - QMenu *menu = m_searchFilter->createStandardContextMenu(); - menu->addSeparator(); - QAction *useRegexAct = new QAction(tr("Use regular expressions"), menu); - useRegexAct->setCheckable(true); - useRegexAct->setChecked(pref->getRegexAsFilteringPatternForTransferList()); - menu->addAction(useRegexAct); - - connect(useRegexAct, &QAction::toggled, pref, &Preferences::setRegexAsFilteringPatternForTransferList); - connect(useRegexAct, &QAction::toggled, this, [this]() { m_transferListWidget->applyNameFilter(m_searchFilter->text()); }); - - menu->exec(QCursor::pos()); + m_tabs->setTabText(m_tabs->indexOf(m_rssWidget), tr("RSS (%1)").arg(count)); } void MainWindow::displaySearchTab(bool enable) @@ -726,11 +628,7 @@ // RSS tab if (!m_searchWidget) { m_searchWidget = new SearchWidget(this); - m_tabs->insertTab(1, m_searchWidget, -#ifndef Q_OS_MAC - GuiIconProvider::instance()->getIcon("edit-find"), -#endif - tr("Search")); + m_tabs->insertTab(1, m_searchWidget, GuiIconProvider::instance()->getIcon("edit-find"), tr("Search")); } } else if (m_searchWidget) { @@ -787,15 +685,9 @@ { writeSettings(); - // delete RSSWidget explicitly to avoid crash in - // handleRSSUnreadCountUpdated() at application shutdown - delete m_rssWidget; - delete m_executableWatcher; -#ifndef Q_OS_MAC if (m_systrayCreator) m_systrayCreator->stop(); -#endif if (m_preventTimer) m_preventTimer->stop(); #if (defined(Q_OS_WIN) || defined(Q_OS_MAC)) @@ -861,42 +753,32 @@ // Notification when disk is full void MainWindow::fullDiskError(BitTorrent::TorrentHandle *const torrent, QString msg) const { - showNotificationBaloon(tr("I/O Error", "i.e: Input/Output Error") - , tr("An I/O error occurred for torrent '%1'.\n Reason: %2" - , "e.g: An error occurred for torrent 'xxx.avi'.\n Reason: disk is full.").arg(torrent->name(), msg)); + showNotificationBaloon(tr("I/O Error", "i.e: Input/Output Error"), tr("An I/O error occurred for torrent '%1'.\n Reason: %2", "e.g: An error occurred for torrent 'xxx.avi'.\n Reason: disk is full.").arg(torrent->name()).arg(msg)); } void MainWindow::createKeyboardShortcuts() { m_ui->actionCreateTorrent->setShortcut(QKeySequence::New); m_ui->actionOpen->setShortcut(QKeySequence::Open); - m_ui->actionDelete->setShortcut(QKeySequence::Delete); - m_ui->actionDelete->setShortcutContext(Qt::WidgetShortcut); // nullify its effect: delete key event is handled by respective widgets, not here m_ui->actionDownloadFromURL->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_O); m_ui->actionExit->setShortcut(Qt::CTRL + Qt::Key_Q); -#ifdef Q_OS_MAC - m_ui->actionCloseWindow->setShortcut(QKeySequence::Close); -#else - m_ui->actionCloseWindow->setVisible(false); -#endif QShortcut *switchTransferShortcut = new QShortcut(Qt::ALT + Qt::Key_1, this); - connect(switchTransferShortcut, &QShortcut::activated, this, &MainWindow::displayTransferTab); - - using Func = void (MainWindow::*)(); + connect(switchTransferShortcut, SIGNAL(activated()), this, SLOT(displayTransferTab())); QShortcut *switchSearchShortcut = new QShortcut(Qt::ALT + Qt::Key_2, this); - connect(switchSearchShortcut, &QShortcut::activated, this, static_cast(&MainWindow::displaySearchTab)); + connect(switchSearchShortcut, SIGNAL(activated()), this, SLOT(displaySearchTab())); QShortcut *switchRSSShortcut = new QShortcut(Qt::ALT + Qt::Key_3, this); - connect(switchRSSShortcut, &QShortcut::activated, this, static_cast(&MainWindow::displayRSSTab)); + connect(switchRSSShortcut, SIGNAL(activated()), this, SLOT(displayRSSTab())); QShortcut *switchExecutionLogShortcut = new QShortcut(Qt::ALT + Qt::Key_4, this); - connect(switchExecutionLogShortcut, &QShortcut::activated, this, &MainWindow::displayExecutionLogTab); - QShortcut *switchSearchFilterShortcut = new QShortcut(QKeySequence::Find, m_transferListWidget); - connect(switchSearchFilterShortcut, &QShortcut::activated, this, &MainWindow::focusSearchFilter); + connect(switchExecutionLogShortcut, SIGNAL(activated()), this, SLOT(displayExecutionLogTab())); + + QShortcut *switchSearchFilterShortcut = new QShortcut(QKeySequence::Find, this); + connect(switchSearchFilterShortcut, SIGNAL(activated()), this, SLOT(focusSearchFilter())); m_ui->actionDocumentation->setShortcut(QKeySequence::HelpContents); m_ui->actionOptions->setShortcut(Qt::ALT + Qt::Key_O); m_ui->actionStart->setShortcut(Qt::CTRL + Qt::Key_S); - m_ui->actionStartAll->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_S); + m_ui->actionStartAll->setShortcut(Qt::CTRL + Qt::SHIFT +Qt::Key_S); m_ui->actionPause->setShortcut(Qt::CTRL + Qt::Key_P); m_ui->actionPauseAll->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_P); m_ui->actionBottomPriority->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_Minus); @@ -951,44 +833,33 @@ { Preferences *const pref = Preferences::instance(); if (pref->recursiveDownloadDisabled()) return; - - const auto torrentHash = torrent->hash(); - - QMessageBox *confirmBox = new QMessageBox(QMessageBox::Question, tr("Recursive download confirmation") - , tr("The torrent '%1' contains torrent files, do you want to proceed with their download?").arg(torrent->name()) - , QMessageBox::NoButton, this); - confirmBox->setAttribute(Qt::WA_DeleteOnClose); - confirmBox->setModal(true); - - const QPushButton *yes = confirmBox->addButton(tr("Yes"), QMessageBox::YesRole); - /*QPushButton *no = */ confirmBox->addButton(tr("No"), QMessageBox::NoRole); - const QPushButton *never = confirmBox->addButton(tr("Never"), QMessageBox::NoRole); - connect(confirmBox, &QMessageBox::buttonClicked, this, [torrentHash, yes, never](const QAbstractButton *button) - { - if (button == yes) - BitTorrent::Session::instance()->recursiveTorrentDownload(torrentHash); - if (button == never) - Preferences::instance()->disableRecursiveDownload(); - }); - confirmBox->show(); + // Get Torrent name + QString torrentName = torrent->name(); + QMessageBox confirmBox(QMessageBox::Question, tr("Recursive download confirmation"), tr("The torrent '%1' contains torrent files, do you want to proceed with their download?").arg(torrentName)); + QPushButton *yes = confirmBox.addButton(tr("Yes"), QMessageBox::YesRole); + /*QPushButton *no = */ confirmBox.addButton(tr("No"), QMessageBox::NoRole); + QPushButton *never = confirmBox.addButton(tr("Never"), QMessageBox::NoRole); + confirmBox.exec(); + + if (confirmBox.clickedButton() == yes) + BitTorrent::Session::instance()->recursiveTorrentDownload(torrent->hash()); + else if (confirmBox.clickedButton() == never) + pref->disableRecursiveDownload(); } void MainWindow::handleDownloadFromUrlFailure(QString url, QString reason) const { // Display a message box - showNotificationBaloon(tr("URL download error") - , tr("Couldn't download file at URL '%1', reason: %2.").arg(url, reason)); + showNotificationBaloon(tr("URL download error"), tr("Couldn't download file at URL '%1', reason: %2.").arg(url).arg(reason)); } void MainWindow::on_actionSetGlobalUploadLimit_triggered() { qDebug() << Q_FUNC_INFO; - BitTorrent::Session *const session = BitTorrent::Session::instance(); bool ok = false; const long newLimit = SpeedLimitDialog::askSpeedLimit( - this, &ok, tr("Global Upload Speed Limit"), session->uploadSpeedLimit()); - + &ok, tr("Global Upload Speed Limit"), session->uploadSpeedLimit()); if (ok) { qDebug("Setting global upload rate limit to %.1fKb/s", newLimit / 1024.); session->setUploadSpeedLimit(newLimit); @@ -998,12 +869,10 @@ void MainWindow::on_actionSetGlobalDownloadLimit_triggered() { qDebug() << Q_FUNC_INFO; - BitTorrent::Session *const session = BitTorrent::Session::instance(); bool ok = false; const long newLimit = SpeedLimitDialog::askSpeedLimit( - this, &ok, tr("Global Download Speed Limit"), session->downloadSpeedLimit()); - + &ok, tr("Global Download Speed Limit"), session->downloadSpeedLimit()); if (ok) { qDebug("Setting global download rate limit to %.1fKb/s", newLimit / 1024.); session->setDownloadSpeedLimit(newLimit); @@ -1023,20 +892,10 @@ close(); } -#ifdef Q_OS_MAC -void MainWindow::on_actionCloseWindow_triggered() -{ - // On macOS window close is basically equivalent to window hide. - // If you decide to implement this functionality for other OS, - // then you will also need ui lock checks like in actionExit. - close(); -} -#endif - QWidget *MainWindow::currentTabWidget() const { if (isMinimized() || !isVisible()) - return nullptr; + return 0; if (m_tabs->currentIndex() == 0) return m_transferListWidget; return m_tabs->currentWidget(); @@ -1078,19 +937,16 @@ { // Show restart message m_statusBar->showRestartRequired(); - Logger::instance()->addMessage(tr("qBittorrent was just updated and needs to be restarted for the changes to be effective.") - , Log::CRITICAL); // Delete the executable watcher delete m_executableWatcher; - m_executableWatcher = nullptr; + m_executableWatcher = 0; } -#ifndef Q_OS_MAC // Toggle Main window visibility void MainWindow::toggleVisibility(const QSystemTrayIcon::ActivationReason reason) { switch (reason) { - case QSystemTrayIcon::Trigger: + case QSystemTrayIcon::Trigger: { if (isHidden()) { if (m_uiLocked && !unlockUI()) // Ask for UI lock password return; @@ -1106,13 +962,14 @@ else { hide(); } + break; + } default: break; } } -#endif // Display About Dialog void MainWindow::on_actionAbout_triggered() @@ -1121,7 +978,7 @@ if (m_aboutDlg) m_aboutDlg->activateWindow(); else - m_aboutDlg = new AboutDialog(this); + m_aboutDlg = new about(this); } void MainWindow::on_actionStatistics_triggered() @@ -1152,24 +1009,12 @@ void MainWindow::closeEvent(QCloseEvent *e) { Preferences *const pref = Preferences::instance(); -#ifdef Q_OS_MAC - if (!m_forceExit) { - hide(); - e->accept(); - return; - } -#else const bool goToSystrayOnExit = pref->closeToTray(); if (!m_forceExit && m_systrayIcon && goToSystrayOnExit && !this->isHidden()) { hide(); e->accept(); - if (!pref->closeToTrayNotified()) { - showNotificationBaloon(tr("qBittorrent is closed to tray"), tr("This behavior can be changed in the settings. You won't be reminded again.")); - pref->setCloseToTrayNotified(true); - } return; } -#endif // Q_OS_MAC if (pref->confirmOnExit() && BitTorrent::Session::instance()->hasActiveTorrents()) { if (e->spontaneous() || m_forceExit) { @@ -1177,7 +1022,7 @@ show(); QMessageBox confirmBox(QMessageBox::Question, tr("Exiting qBittorrent"), // Split it because the last sentence is used in the Web UI - tr("Some files are currently transferring.") + '\n' + tr("Are you sure you want to quit qBittorrent?"), + tr("Some files are currently transferring.") + "\n" + tr("Are you sure you want to quit qBittorrent?"), QMessageBox::NoButton, this); QPushButton *noBtn = confirmBox.addButton(tr("&No"), QMessageBox::NoRole); confirmBox.addButton(tr("&Yes"), QMessageBox::YesRole); @@ -1201,11 +1046,9 @@ delete m_searchWidget; hide(); -#ifndef Q_OS_MAC // Hide tray icon if (m_systrayIcon) m_systrayIcon->hide(); -#endif // Accept exit e->accept(); qApp->exit(); @@ -1214,31 +1057,22 @@ // Display window to create a torrent void MainWindow::on_actionCreateTorrent_triggered() { - createTorrentTriggered(); -} - -void MainWindow::createTorrentTriggered(const QString &path) -{ - if (m_createTorrentDlg) { - m_createTorrentDlg->updateInputPath(path); + if (m_createTorrentDlg) m_createTorrentDlg->activateWindow(); - } else - m_createTorrentDlg = new TorrentCreatorDialog(this, path); + m_createTorrentDlg = new TorrentCreatorDlg(this); } bool MainWindow::event(QEvent *e) { -#ifndef Q_OS_MAC switch (e->type()) { case QEvent::WindowStateChange: { qDebug("Window change event"); // Now check to see if the window is minimised if (isMinimized()) { qDebug("minimisation"); - Preferences *const pref = Preferences::instance(); - if (m_systrayIcon && pref->minimizeToTray()) { - qDebug() << "Has active window:" << (qApp->activeWindow() != nullptr); + if (m_systrayIcon && Preferences::instance()->minimizeToTray()) { + qDebug("Has active window: %d", (int)(qApp->activeWindow() != 0)); // Check if there is a modal window bool hasModalWindow = false; foreach (QWidget *widget, QApplication::allWidgets()) { @@ -1251,17 +1085,14 @@ if (!hasModalWindow) { qDebug("Minimize to Tray enabled, hiding!"); e->ignore(); - QTimer::singleShot(0, this, &QWidget::hide); - if (!pref->minimizeToTrayNotified()) { - showNotificationBaloon(tr("qBittorrent is minimized to tray"), tr("This behavior can be changed in the settings. You won't be reminded again.")); - pref->setMinimizeToTrayNotified(true); - } + QTimer::singleShot(0, this, SLOT(hide())); return true; } } } break; } +#ifdef Q_OS_MAC case QEvent::ToolBarChange: { qDebug("MAC: Received a toolbar change event!"); bool ret = QMainWindow::event(e); @@ -1271,10 +1102,10 @@ Preferences::instance()->setToolbarDisplayed(m_ui->actionTopToolBar->isChecked()); return ret; } +#endif default: break; } -#endif return QMainWindow::event(e); } @@ -1283,53 +1114,31 @@ void MainWindow::dropEvent(QDropEvent *event) { event->acceptProposedAction(); - - // remove scheme QStringList files; if (event->mimeData()->hasUrls()) { - foreach (const QUrl &url, event->mimeData()->urls()) { - if (url.isEmpty()) - continue; - - files << ((url.scheme().compare("file", Qt::CaseInsensitive) == 0) - ? url.toLocalFile() - : url.toString()); + const QList urls = event->mimeData()->urls(); + foreach (const QUrl &url, urls) { + if (!url.isEmpty()) { + if (url.scheme().compare("file", Qt::CaseInsensitive) == 0) + files << url.toLocalFile(); + else + files << url.toString(); + } } } else { files = event->mimeData()->text().split('\n'); } - // differentiate ".torrent" files/links & magnet links from others - QStringList torrentFiles, otherFiles; - foreach (const QString &file, files) { - const bool isTorrentLink = (file.startsWith("magnet:", Qt::CaseInsensitive) - || file.endsWith(C_TORRENT_FILE_EXTENSION, Qt::CaseInsensitive) - || Utils::Misc::isUrl(file)); - if (isTorrentLink) - torrentFiles << file; - else - otherFiles << file; - } - - // Download torrents + // Add file to download list const bool useTorrentAdditionDialog = AddNewTorrentDialog::isEnabled(); - foreach (const QString &file, torrentFiles) { + foreach (QString file, files) { + qDebug("Dropped file %s on download list", qPrintable(file)); if (useTorrentAdditionDialog) AddNewTorrentDialog::show(file, this); else BitTorrent::Session::instance()->addTorrent(file); } - if (!torrentFiles.isEmpty()) return; - - // Create torrent - foreach (const QString &file, otherFiles) { - createTorrentTriggered(file); - - // currently only hande the first entry - // this is a stub that can be expanded later to create many torrents at once - break; - } } // Decode if we accept drag 'n drop or not @@ -1341,30 +1150,6 @@ event->acceptProposedAction(); } -#ifdef Q_OS_MAC - -static MainWindow *dockMainWindowHandle; - -static bool dockClickHandler(id self, SEL cmd, ...) -{ - Q_UNUSED(self) - Q_UNUSED(cmd) - - if (dockMainWindowHandle && !dockMainWindowHandle->isVisible()) { - dockMainWindowHandle->activate(); - } - - return true; -} - -void MainWindow::setupDockClickHandler() -{ - dockMainWindowHandle = this; - MacUtils::overrideDockClickHandler(dockClickHandler); -} - -#endif - /***************************************************** * * * Torrent * @@ -1379,13 +1164,12 @@ // Open File Open Dialog // Note: it is possible to select more than one file const QStringList pathsList = - QFileDialog::getOpenFileNames(this, tr("Open Torrent Files"), pref->getMainLastDir(), - tr("Torrent Files") + " (*" + C_TORRENT_FILE_EXTENSION + ')'); - + QFileDialog::getOpenFileNames(0, tr("Open Torrent Files"), pref->getMainLastDir(), + tr("Torrent Files") + " (*.torrent)"); const bool useTorrentAdditionDialog = AddNewTorrentDialog::isEnabled(); if (!pathsList.isEmpty()) { foreach (QString file, pathsList) { - qDebug("Dropped file %s on download list", qUtf8Printable(file)); + qDebug("Dropped file %s on download list", qPrintable(file)); if (useTorrentAdditionDialog) AddNewTorrentDialog::show(file, this); else @@ -1393,9 +1177,9 @@ } // Save last dir to remember it - QStringList topDir = Utils::Fs::fromNativePath(pathsList.at(0)).split('/'); + QStringList topDir = Utils::Fs::fromNativePath(pathsList.at(0)).split("/"); topDir.removeLast(); - pref->setMainLastDir(Utils::Fs::fromNativePath(topDir.join('/'))); + pref->setMainLastDir(Utils::Fs::fromNativePath(topDir.join("/"))); } } @@ -1413,37 +1197,20 @@ loadPreferences(); } -void MainWindow::showStatusBar(bool show) -{ - if (!show) { - // Remove status bar - setStatusBar(nullptr); - } - else if (!m_statusBar) { - // Create status bar - m_statusBar = new StatusBar; - connect(m_statusBar.data(), &StatusBar::connectionButtonClicked, this, &MainWindow::showConnectionSettings); - connect(m_statusBar.data(), &StatusBar::alternativeSpeedsButtonClicked, this, &MainWindow::toggleAlternativeSpeeds); - setStatusBar(m_statusBar); - } -} - +// Load program preferences void MainWindow::loadPreferences(bool configureSession) { Logger::instance()->addMessage(tr("Options were saved successfully.")); const Preferences *const pref = Preferences::instance(); -#ifdef Q_OS_MAC - Q_UNUSED(configureSession); -#else const bool newSystrayIntegration = pref->systrayIntegration(); m_ui->actionLock->setVisible(newSystrayIntegration); - if (newSystrayIntegration != (m_systrayIcon != nullptr)) { + if (newSystrayIntegration != (m_systrayIcon != 0)) { if (newSystrayIntegration) { // create the trayicon if (!QSystemTrayIcon::isSystemTrayAvailable()) { if (!configureSession) { // Program startup m_systrayCreator = new QTimer(this); - connect(m_systrayCreator.data(), &QTimer::timeout, this, &MainWindow::createSystrayDelayed); + connect(m_systrayCreator, SIGNAL(timeout()), this, SLOT(createSystrayDelayed())); m_systrayCreator->setSingleShot(true); m_systrayCreator->start(2000); qDebug("Info: System tray is unavailable, trying again later."); @@ -1465,7 +1232,6 @@ // Reload systray icon if (newSystrayIntegration && m_systrayIcon) m_systrayIcon->setIcon(getSystrayIcon()); -#endif // General if (pref->isToolbarDisplayed()) { m_ui->toolBar->setVisible(true); @@ -1476,9 +1242,7 @@ m_ui->toolBar->setVisible(false); } - showStatusBar(pref->isStatusbarDisplayed()); - - if ((pref->preventFromSuspendWhenDownloading() || pref->preventFromSuspendWhenSeeding()) && !m_preventTimer->isActive()) { + if (pref->preventFromSuspend() && !m_preventTimer->isActive()) { m_preventTimer->start(PREVENT_SUSPEND_INTERVAL); } else { @@ -1499,9 +1263,7 @@ m_ui->actionIncreasePriority->setVisible(true); m_ui->actionTopPriority->setVisible(true); m_ui->actionBottomPriority->setVisible(true); -#ifndef Q_OS_MAC m_prioSeparator->setVisible(true); -#endif m_prioSeparatorMenu->setVisible(true); } } @@ -1512,9 +1274,7 @@ m_ui->actionIncreasePriority->setVisible(false); m_ui->actionTopPriority->setVisible(false); m_ui->actionBottomPriority->setVisible(false); -#ifndef Q_OS_MAC m_prioSeparator->setVisible(false); -#endif m_prioSeparatorMenu->setVisible(false); } } @@ -1546,54 +1306,42 @@ // Called when a tracker requires authentication void MainWindow::trackerAuthenticationRequired(BitTorrent::TorrentHandle *const torrent) { -#if LIBTORRENT_VERSION_NUM < 10100 if (m_unauthenticatedTrackers.indexOf(qMakePair(torrent, torrent->currentTracker())) < 0) // Tracker login - new TrackerLoginDialog(this, torrent); -#else - Q_UNUSED(torrent); -#endif + new trackerLogin(this, torrent); } // Check connection status and display right icon void MainWindow::updateGUI() { - const BitTorrent::SessionStatus &status = BitTorrent::Session::instance()->status(); + BitTorrent::SessionStatus status = BitTorrent::Session::instance()->status(); - // update global information -#ifndef Q_OS_MAC + // update global informations if (m_systrayIcon) { -#ifdef Q_OS_UNIX +#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) QString html = "
"; html += "qBittorrent"; html += "
"; html += "
"; - html += " " + tr("DL speed: %1", "e.g: Download speed: 10 KiB/s").arg(Utils::Misc::friendlyUnit(status.payloadDownloadRate, true)); + html += " " + tr("DL speed: %1", "e.g: Download speed: 10 KiB/s").arg(Utils::Misc::friendlyUnit(status.payloadDownloadRate(), true)); html += "
"; html += "
"; - html += " " + tr("UP speed: %1", "e.g: Upload speed: 10 KiB/s").arg(Utils::Misc::friendlyUnit(status.payloadUploadRate, true)); + html += " " + tr("UP speed: %1", "e.g: Upload speed: 10 KiB/s").arg(Utils::Misc::friendlyUnit(status.payloadUploadRate(), true)); html += "
"; #else // OSes such as Windows do not support html here - QString html = tr("DL speed: %1", "e.g: Download speed: 10 KiB/s").arg(Utils::Misc::friendlyUnit(status.payloadDownloadRate, true)); - html += '\n'; - html += tr("UP speed: %1", "e.g: Upload speed: 10 KiB/s").arg(Utils::Misc::friendlyUnit(status.payloadUploadRate, true)); -#endif // Q_OS_UNIX + QString html = tr("DL speed: %1", "e.g: Download speed: 10 KiB/s").arg(Utils::Misc::friendlyUnit(status.payloadDownloadRate(), true)); + html += "\n"; + html += tr("UP speed: %1", "e.g: Upload speed: 10 KiB/s").arg(Utils::Misc::friendlyUnit(status.payloadUploadRate(), true)); +#endif m_systrayIcon->setToolTip(html); // tray icon } -#else - if (status.payloadDownloadRate > 0) - QtMac::setBadgeLabelText(tr("%1/s", "s is a shorthand for seconds") - .arg(Utils::Misc::friendlyUnit(status.payloadDownloadRate))); - else if (!QtMac::badgeLabelText().isEmpty()) - QtMac::setBadgeLabelText(""); -#endif // Q_OS_MAC if (m_displaySpeedInTitle) { setWindowTitle(tr("[D: %1, U: %2] qBittorrent %3", "D = Download; U = Upload; %3 is qBittorrent version") - .arg(Utils::Misc::friendlyUnit(status.payloadDownloadRate, true) - , Utils::Misc::friendlyUnit(status.payloadUploadRate, true) - , QBT_VERSION)); + .arg(Utils::Misc::friendlyUnit(status.payloadDownloadRate(), true)) + .arg(Utils::Misc::friendlyUnit(status.payloadUploadRate(), true)) + .arg(QBT_VERSION)); } } @@ -1620,12 +1368,9 @@ reply.waitForFinished(); if (!reply.isError()) return; -#elif defined(Q_OS_MAC) - MacUtils::displayNotification(title, msg); -#else +#endif if (m_systrayIcon && QSystemTrayIcon::supportsMessages()) m_systrayIcon->showMessage(title, msg, QSystemTrayIcon::Information, TIME_TRAY_BALLOON); -#endif } /***************************************************** @@ -1638,8 +1383,8 @@ { const bool useTorrentAdditionDialog = AddNewTorrentDialog::isEnabled(); foreach (QString url, urlList) { - if (((url.size() == 40) && !url.contains(QRegularExpression("[^0-9A-Fa-f]"))) - || ((url.size() == 32) && !url.contains(QRegularExpression("[^2-7A-Za-z]")))) + if (((url.size() == 40) && !url.contains(QRegExp("[^0-9A-Fa-f]"))) + || ((url.size() == 32) && !url.contains(QRegExp("[^2-7A-Za-z]")))) url = "magnet:?xt=urn:btih:" + url; if (useTorrentAdditionDialog) @@ -1655,7 +1400,6 @@ * * *****************************************************/ -#ifndef Q_OS_MAC void MainWindow::createSystrayDelayed() { static int timeout = 20; @@ -1682,34 +1426,24 @@ } } -void MainWindow::updateTrayIconMenu() +void MainWindow::updateAltSpeedsBtn(bool alternative) { - m_ui->actionToggleVisibility->setText(isVisible() ? tr("Hide") : tr("Show")); + m_ui->actionUseAlternativeSpeedLimits->setChecked(alternative); } -void MainWindow::createTrayIcon() +void MainWindow::updateTrayIconMenu() { - // Tray icon - m_systrayIcon = new QSystemTrayIcon(getSystrayIcon(), this); - - m_systrayIcon->setContextMenu(trayIconMenu()); - connect(m_systrayIcon.data(), &QSystemTrayIcon::messageClicked, this, &MainWindow::balloonClicked); - // End of Icon Menu - connect(m_systrayIcon.data(), &QSystemTrayIcon::activated, this, &MainWindow::toggleVisibility); - m_systrayIcon->show(); + m_ui->actionToggleVisibility->setText(isVisible() ? tr("Hide") : tr("Show")); } -#endif // Q_OS_MAC QMenu *MainWindow::trayIconMenu() { if (m_trayIconMenu) return m_trayIconMenu; m_trayIconMenu = new QMenu(this); -#ifndef Q_OS_MAC - connect(m_trayIconMenu.data(), &QMenu::aboutToShow, this, &MainWindow::updateTrayIconMenu); + connect(m_trayIconMenu, SIGNAL(aboutToShow()), SLOT(updateTrayIconMenu())); m_trayIconMenu->addAction(m_ui->actionToggleVisibility); m_trayIconMenu->addSeparator(); -#endif m_trayIconMenu->addAction(m_ui->actionOpen); m_trayIconMenu->addAction(m_ui->actionDownloadFromURL); m_trayIconMenu->addSeparator(); @@ -1722,24 +1456,29 @@ m_trayIconMenu->addSeparator(); m_trayIconMenu->addAction(m_ui->actionStartAll); m_trayIconMenu->addAction(m_ui->actionPauseAll); -#ifndef Q_OS_MAC m_trayIconMenu->addSeparator(); m_trayIconMenu->addAction(m_ui->actionExit); -#endif if (m_uiLocked) m_trayIconMenu->setEnabled(false); return m_trayIconMenu; } -void MainWindow::updateAltSpeedsBtn(bool alternative) +PropertiesWidget *MainWindow::propertiesWidget() const { - m_ui->actionUseAlternativeSpeedLimits->setChecked(alternative); + return m_propertiesWidget; } -PropertiesWidget *MainWindow::propertiesWidget() const +void MainWindow::createTrayIcon() { - return m_propertiesWidget; + // Tray icon + m_systrayIcon = new QSystemTrayIcon(getSystrayIcon(), this); + + m_systrayIcon->setContextMenu(trayIconMenu()); + connect(m_systrayIcon, SIGNAL(messageClicked()), this, SLOT(balloonClicked())); + // End of Icon Menu + connect(m_systrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(toggleVisibility(QSystemTrayIcon::ActivationReason))); + m_systrayIcon->show(); } // Display Program Options @@ -1753,18 +1492,11 @@ void MainWindow::on_actionTopToolBar_triggered() { - const bool isVisible = static_cast(sender())->isChecked(); + bool isVisible = static_cast(sender())->isChecked(); m_ui->toolBar->setVisible(isVisible); Preferences::instance()->setToolbarDisplayed(isVisible); } -void MainWindow::on_actionShowStatusbar_triggered() -{ - const bool isVisible = static_cast(sender())->isChecked(); - Preferences::instance()->setStatusbarDisplayed(isVisible); - showStatusBar(isVisible); -} - void MainWindow::on_actionSpeedInTitleBar_triggered() { m_displaySpeedInTitle = static_cast(sender())->isChecked(); @@ -1777,49 +1509,51 @@ void MainWindow::on_actionRSSReader_triggered() { - Preferences::instance()->setRSSWidgetVisible(m_ui->actionRSSReader->isChecked()); + Preferences::instance()->setRSSEnabled(m_ui->actionRSSReader->isChecked()); displayRSSTab(m_ui->actionRSSReader->isChecked()); } void MainWindow::on_actionSearchWidget_triggered() { if (!m_hasPython && m_ui->actionSearchWidget->isChecked()) { - int majorVersion = Utils::ForeignApps::pythonInfo().version.majorNumber(); + int pythonVersion = Utils::Misc::pythonVersion(); // Check if python is already in PATH - if (majorVersion > 0) { + if (pythonVersion > 0) // Prevent translators from messing with PATH - Logger::instance()->addMessage(tr("Python found in %1: %2", "Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin") - .arg("PATH", qgetenv("PATH").constData()), Log::INFO); - } + Logger::instance()->addMessage(tr("Python found in %1: %2", "Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin").arg("PATH").arg(qgetenv("PATH").constData()), Log::INFO); #ifdef Q_OS_WIN - else if (addPythonPathToEnv()) { - majorVersion = Utils::ForeignApps::pythonInfo().version.majorNumber(); - } + else if (addPythonPathToEnv()) + pythonVersion = Utils::Misc::pythonVersion(); #endif - else { - QMessageBox::information(this, tr("Undetermined Python version"), tr("Couldn't determine your Python version. Search engine disabled.")); - m_ui->actionSearchWidget->setChecked(false); - Preferences::instance()->setSearchEnabled(false); - return; - } bool res = false; - if ((majorVersion == 2) || (majorVersion == 3)) { + if ((pythonVersion == 2) || (pythonVersion == 3)) { // Check Python minimum requirement: 2.7.9 / 3.3.0 - using Version = Utils::ForeignApps::PythonInfo::Version; - const Version pyVersion = Utils::ForeignApps::pythonInfo().version; - - if (((majorVersion == 2) && (pyVersion < Version {2, 7, 9})) - || ((majorVersion == 3) && (pyVersion < Version {3, 3, 0}))) { - QMessageBox::information(this, tr("Old Python Interpreter"), tr("Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work.\nMinimum requirement: 2.7.9 / 3.3.0.").arg(pyVersion)); + QString version = Utils::Misc::pythonVersionComplete(); + QStringList splitted = version.split('.'); + if (splitted.size() > 2) { + int middleVer = splitted.at(1).toInt(); + int lowerVer = splitted.at(2).toInt(); + if (((pythonVersion == 2) && (middleVer < 7)) + || ((pythonVersion == 2) && (middleVer == 7) && (lowerVer < 9)) + || ((pythonVersion == 3) && (middleVer < 3))) { + QMessageBox::information(this, tr("Old Python Interpreter"), tr("Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work.\nMinimum requirement: 2.7.9 / 3.3.0.").arg(version)); + m_ui->actionSearchWidget->setChecked(false); + Preferences::instance()->setSearchEnabled(false); + return; + } + else { + res = true; + } + } + else { + QMessageBox::information(this, tr("Undetermined Python version"), tr("Couldn't determine your Python version (%1). Search engine disabled.").arg(version)); m_ui->actionSearchWidget->setChecked(false); Preferences::instance()->setSearchEnabled(false); return; } - - res = true; } if (res) { @@ -1859,8 +1593,8 @@ void MainWindow::on_actionDownloadFromURL_triggered() { if (!m_downloadFromURLDialog) { - m_downloadFromURLDialog = new DownloadFromURLDialog(this); - connect(m_downloadFromURLDialog.data(), &DownloadFromURLDialog::urlsReadyToBeDownloaded, this, &MainWindow::downloadFromURLList); + m_downloadFromURLDialog = new downloadFromURL(this); + connect(m_downloadFromURLDialog, SIGNAL(urlsReadyToBeDownloaded(QStringList)), this, SLOT(downloadFromURLList(QStringList))); } } @@ -1870,11 +1604,9 @@ { QMessageBox::StandardButton answer = QMessageBox::Yes; if (updateAvailable) { - answer = QMessageBox::question(this, tr("qBittorrent Update Available") - , tr("A new version is available.") + "
" - + tr("Do you want to download %1?").arg(newVersion) + "

" - + QString("%1").arg(tr("Open changelog...")) - , QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + answer = QMessageBox::question(this, tr("qBittorrent Update Available"), + tr("A new version is available.\nDo you want to download %1?").arg(newVersion), + QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); if (answer == QMessageBox::Yes) { // The user want to update, let's download the update ProgramUpdater *updater = dynamic_cast(sender()); @@ -1893,17 +1625,12 @@ if (Preferences::instance()->isUpdateCheckEnabled() && (answer == QMessageBox::Yes)) m_programUpdateTimer->start(); } -#endif -void MainWindow::toggleAlternativeSpeeds() -{ - BitTorrent::Session *const session = BitTorrent::Session::instance(); - session->setAltGlobalSpeedLimitEnabled(!session->isAltGlobalSpeedLimitEnabled()); -} +#endif void MainWindow::on_actionDonateMoney_triggered() { - QDesktopServices::openUrl(QUrl("https://www.qbittorrent.org/donate")); + QDesktopServices::openUrl(QUrl("http://www.qbittorrent.org/donate")); } void MainWindow::showConnectionSettings() @@ -1921,13 +1648,9 @@ { if (checked) { Q_ASSERT(!m_executionLog); - m_executionLog = new ExecutionLogWidget(m_tabs, static_cast(executionLogMsgTypes())); -#ifdef Q_OS_MAC - m_tabs->addTab(m_executionLog, tr("Execution Log")); -#else - const int indexTab = m_tabs->addTab(m_executionLog, tr("Execution Log")); + m_executionLog = new ExecutionLog(m_tabs, static_cast(executionLogMsgTypes())); + int indexTab = m_tabs->addTab(m_executionLog, tr("Execution Log")); m_tabs->setTabIcon(indexTab, GuiIconProvider::instance()->getIcon("view-calendar-journal")); -#endif } else if (m_executionLog) { delete m_executionLog; @@ -2004,46 +1727,36 @@ Preferences::instance()->setShutdownWhenDownloadsComplete(enabled); } -void MainWindow::updatePowerManagementState() +void MainWindow::checkForActiveTorrents() { - const bool inhibitSuspend = (Preferences::instance()->preventFromSuspendWhenDownloading() && BitTorrent::Session::instance()->hasUnfinishedTorrents()) - || (Preferences::instance()->preventFromSuspendWhenSeeding() && BitTorrent::Session::instance()->hasRunningSeed()); - m_pwr->setActivityState(inhibitSuspend); + m_pwr->setActivityState(BitTorrent::Session::instance()->hasActiveTorrents()); } -#ifndef Q_OS_MAC QIcon MainWindow::getSystrayIcon() const { - const TrayIcon::Style style = Preferences::instance()->trayIconStyle(); - // on Linux we use theme icons, and icons from resources everywhere else -#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) - switch (style) { - case TrayIcon::NORMAL: - return QIcon::fromTheme(QLatin1String("qbittorrent-tray")); - case TrayIcon::MONO_DARK: - return QIcon::fromTheme(QLatin1String("qbittorrent-tray-dark")); - case TrayIcon::MONO_LIGHT: - return QIcon::fromTheme(QLatin1String("qbittorrent-tray-light")); - default: - break; - } -#else + TrayIcon::Style style = Preferences::instance()->trayIconStyle(); switch (style) { - case TrayIcon::NORMAL: - return QIcon(QLatin1String(":/icons/skin/qbittorrent-tray.svg")); case TrayIcon::MONO_DARK: - return QIcon(QLatin1String(":/icons/skin/qbittorrent-tray-dark.svg")); + return QIcon(":/icons/skin/qbittorrent_mono_dark.png"); case TrayIcon::MONO_LIGHT: - return QIcon(QLatin1String(":/icons/skin/qbittorrent-tray-light.svg")); + return QIcon(":/icons/skin/qbittorrent_mono_light.png"); default: break; } -#endif - // As a failsafe in case the enum is invalid - return QIcon(QLatin1String(":/icons/skin/qbittorrent-tray.svg")); + QIcon icon; +#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) + if (Preferences::instance()->useSystemIconTheme()) + icon = QIcon::fromTheme("qbittorrent-tray"); + +#endif + if (icon.isNull()) { + icon.addFile(":/icons/skin/qbittorrent22.png", QSize(22, 22)); + icon.addFile(":/icons/skin/qbittorrent16.png", QSize(16, 16)); + icon.addFile(":/icons/skin/qbittorrent32.png", QSize(32, 32)); + } + return icon; } -#endif // Q_OS_MAC #if defined(Q_OS_WIN) || defined(Q_OS_MAC) void MainWindow::checkProgramUpdate() @@ -2054,7 +1767,7 @@ m_ui->actionCheckForUpdates->setToolTip(tr("Already checking for program updates in the background")); bool invokedByUser = m_ui->actionCheckForUpdates == qobject_cast(sender()); ProgramUpdater *updater = new ProgramUpdater(this, invokedByUser); - connect(updater, &ProgramUpdater::updateCheckFinished, this, &MainWindow::handleUpdateCheckFinished); + connect(updater, SIGNAL(updateCheckFinished(bool,QString,bool)), SLOT(handleUpdateCheckFinished(bool,QString,bool))); updater->checkForUpdates(); } @@ -2072,8 +1785,8 @@ QString pathEnvar = QString::fromLocal8Bit(qgetenv("PATH").constData()); if (pathEnvar.isNull()) pathEnvar = ""; - pathEnvar = pythonPath + ';' + pathEnvar; - qDebug("New PATH envvar is: %s", qUtf8Printable(pathEnvar)); + pathEnvar = pythonPath + ";" + pathEnvar; + qDebug("New PATH envvar is: %s", qPrintable(pathEnvar)); qputenv("PATH", Utils::Fs::toNativePath(pathEnvar).toLocal8Bit()); return true; } @@ -2084,15 +1797,13 @@ { setCursor(QCursor(Qt::WaitCursor)); // Download python - const QString installerURL = ((QSysInfo::windowsVersion() >= QSysInfo::WV_VISTA) - ? "https://www.python.org/ftp/python/3.5.2/python-3.5.2.exe" - : "https://www.python.org/ftp/python/3.4.4/python-3.4.4.msi"); - Net::DownloadHandler *handler = Net::DownloadManager::instance()->download( - Net::DownloadRequest(installerURL).saveToFile(true)); - - using Func = void (Net::DownloadHandler::*)(const QString &, const QString &); - connect(handler, static_cast(&Net::DownloadHandler::downloadFinished), this, &MainWindow::pythonDownloadSuccess); - connect(handler, static_cast(&Net::DownloadHandler::downloadFailed), this, &MainWindow::pythonDownloadFailure); + Net::DownloadHandler *handler = nullptr; + if (QSysInfo::windowsVersion() >= QSysInfo::WV_VISTA) + handler = Net::DownloadManager::instance()->downloadUrl("https://www.python.org/ftp/python/3.5.2/python-3.5.2.exe", true); + else + handler = Net::DownloadManager::instance()->downloadUrl("https://www.python.org/ftp/python/3.4.4/python-3.4.4.msi", true); + connect(handler, SIGNAL(downloadFinished(QString,QString)), this, SLOT(pythonDownloadSuccess(QString,QString))); + connect(handler, SIGNAL(downloadFailed(QString,QString)), this, SLOT(pythonDownloadFailure(QString,QString))); } void MainWindow::pythonDownloadSuccess(const QString &url, const QString &filePath) @@ -2104,7 +1815,7 @@ if (QSysInfo::windowsVersion() >= QSysInfo::WV_VISTA) { QFile::rename(filePath, filePath + ".exe"); - installer.start('"' + Utils::Fs::toNativePath(filePath) + ".exe\" /passive"); + installer.start("\"" + Utils::Fs::toNativePath(filePath) + ".exe\" /passive"); } else { QFile::rename(filePath, filePath + ".msi"); @@ -2126,7 +1837,7 @@ m_hasPython = addPythonPathToEnv(); if (m_hasPython) { // Make it print the version to Log - Utils::ForeignApps::pythonInfo(); + Utils::Misc::pythonVersion(); m_ui->actionSearchWidget->setChecked(true); displaySearchTab(true); } @@ -2139,4 +1850,4 @@ QMessageBox::warning(this, tr("Download error"), tr("Python setup could not be downloaded, reason: %1.\nPlease install it manually.").arg(error)); } -#endif // Q_OS_WIN +#endif diff -Nru qbittorrent-4.1.3/src/gui/mainwindow.h qbittorrent-3.3.15/src/gui/mainwindow.h --- qbittorrent-4.1.3/src/gui/mainwindow.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/mainwindow.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,38 +24,39 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include -#include - -#ifndef Q_OS_MAC #include -#endif +#include class QCloseEvent; class QFileSystemWatcher; +class QShortcut; class QSplitter; class QTabWidget; class QTimer; -class AboutDialog; -class DownloadFromURLDialog; -class ExecutionLogWidget; -class LineEdit; +class downloadFromURL; +class SearchWidget; +class RSSImp; +class about; class OptionsDialog; -class PowerManagement; +class TransferListWidget; +class TransferListFiltersWidget; class PropertiesWidget; -class RSSWidget; -class SearchWidget; -class StatsDialog; class StatusBar; -class TorrentCreatorDialog; -class TransferListFiltersWidget; -class TransferListWidget; +class TorrentCreatorDlg; +class downloadFromURL; +class LineEdit; +class ExecutionLog; +class PowerManagement; +class StatsDialog; namespace BitTorrent { @@ -67,12 +68,12 @@ class MainWindow; } -class MainWindow : public QMainWindow +class MainWindow: public QMainWindow { Q_OBJECT public: - explicit MainWindow(QWidget *parent = nullptr); + explicit MainWindow(QWidget *parent = 0); ~MainWindow() override; QWidget *currentTabWidget() const; @@ -102,12 +103,15 @@ void showNotificationBaloon(QString title, QString msg) const; private slots: - void showFilterContextMenu(const QPoint &); + void toggleVisibility(const QSystemTrayIcon::ActivationReason reason = QSystemTrayIcon::Trigger); + void balloonClicked(); void writeSettings(); void readSettings(); + void createTrayIcon(); void fullDiskError(BitTorrent::TorrentHandle *const torrent, QString msg) const; void handleDownloadFromUrlFailure(QString, QString) const; + void createSystrayDelayed(); void tabChanged(int newTab); void defineUILockPassword(); void clearUILockPassword(); @@ -115,6 +119,7 @@ void notifyOfUpdate(QString); void showConnectionSettings(); void minimizeWindow(); + void updateTrayIconMenu(); // Keyboard shortcuts void createKeyboardShortcuts(); void displayTransferTab() const; @@ -133,7 +138,7 @@ #if defined(Q_OS_WIN) || defined(Q_OS_MAC) void handleUpdateCheckFinished(bool updateAvailable, QString newVersion, bool invokedByUser); #endif - void toggleAlternativeSpeeds(); + void updateRSSTabLabel(int count); #ifdef Q_OS_WIN void pythonDownloadSuccess(const QString &url, const QString &filePath); @@ -146,13 +151,11 @@ void downloadFromURLList(const QStringList &urlList); void updateAltSpeedsBtn(bool alternative); void updateNbTorrents(); - void handleRSSUnreadCountUpdated(int count); void on_actionSearchWidget_triggered(); void on_actionRSSReader_triggered(); void on_actionSpeedInTitleBar_triggered(); void on_actionTopToolBar_triggered(); - void on_actionShowStatusbar_triggered(); void on_actionDonateMoney_triggered(); void on_actionExecutionLogs_triggered(bool checked); void on_actionNormalMessages_triggered(bool checked); @@ -174,8 +177,8 @@ void on_actionDownloadFromURL_triggered(); void on_actionExit_triggered(); void on_actionLock_triggered(); - // Check for unpaused downloading or seeding torrents and prevent system suspend/sleep according to preferences - void updatePowerManagementState(); + // Check for active torrents and set preventing from suspend state + void checkForActiveTorrents(); #if defined(Q_OS_WIN) || defined(Q_OS_MAC) void checkProgramUpdate(); #endif @@ -185,21 +188,9 @@ void toolbarTextBeside(); void toolbarTextUnder(); void toolbarFollowSystem(); -#ifdef Q_OS_MAC - void on_actionCloseWindow_triggered(); -#else - void toggleVisibility(const QSystemTrayIcon::ActivationReason reason = QSystemTrayIcon::Trigger); - void createSystrayDelayed(); - void updateTrayIconMenu(); -#endif private: -#ifdef Q_OS_MAC - void setupDockClickHandler(); -#else - void createTrayIcon(); QIcon getSystrayIcon() const; -#endif #ifdef Q_OS_WIN bool addPythonPathToEnv(); void installPython(); @@ -209,11 +200,9 @@ void dragEnterEvent(QDragEnterEvent *event) override; void closeEvent(QCloseEvent *) override; void showEvent(QShowEvent *) override; - bool event(QEvent *e) override; + bool event(QEvent *event) override; void displayRSSTab(bool enable); void displaySearchTab(bool enable); - void createTorrentTriggered(const QString &path = QString()); - void showStatusBar(bool show); Ui::MainWindow *m_ui; @@ -222,17 +211,15 @@ QList> m_unauthenticatedTrackers; // Still needed? // GUI related bool m_posInitialized; - QPointer m_tabs; - QPointer m_statusBar; + QTabWidget *m_tabs; + StatusBar *m_statusBar; QPointer m_options; - QPointer m_aboutDlg; + QPointer m_aboutDlg; QPointer m_statsDlg; - QPointer m_createTorrentDlg; - QPointer m_downloadFromURLDialog; -#ifndef Q_OS_MAC + QPointer m_createTorrentDlg; + QPointer m_downloadFromURLDialog; QPointer m_systrayIcon; QPointer m_systrayCreator; -#endif QPointer m_trayIconMenu; TransferListWidget *m_transferListWidget; TransferListFiltersWidget *m_transferListFiltersWidget; @@ -248,8 +235,8 @@ QAction *m_prioSeparatorMenu; QSplitter *m_splitter; QPointer m_searchWidget; - QPointer m_rssWidget; - QPointer m_executionLog; + QPointer m_rssWidget; + QPointer m_executionLog; // Power Management PowerManagement *m_pwr; QTimer *m_preventTimer; diff -Nru qbittorrent-4.1.3/src/gui/mainwindow.ui qbittorrent-3.3.15/src/gui/mainwindow.ui --- qbittorrent-4.1.3/src/gui/mainwindow.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/mainwindow.ui 2017-08-03 20:30:10.000000000 +0000 @@ -90,7 +90,6 @@ -
@@ -111,7 +110,6 @@ - @@ -302,14 +300,6 @@ Display Top Toolbar - - - true - - - Status &Bar - - true @@ -467,11 +457,6 @@ Critical Messages - - - Close Window - - diff -Nru qbittorrent-4.1.3/src/gui/messageboxraised.cpp qbittorrent-3.3.15/src/gui/messageboxraised.cpp --- qbittorrent-4.1.3/src/gui/messageboxraised.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/messageboxraised.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,63 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2014 sledgehammer999 + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : hammered999@gmail.com + */ + +#include "messageboxraised.h" + +MessageBoxRaised::MessageBoxRaised(QMessageBox::Icon icon, const QString &title, const QString &text, + QMessageBox::StandardButtons buttons, QWidget *parent, Qt::WindowFlags f) + : QMessageBox(icon, title, text, buttons, parent, f) {} + +QMessageBox::StandardButton MessageBoxRaised::impl(const QMessageBox::Icon &icon, QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton) { + MessageBoxRaised dlg(icon, title, text, buttons, parent); + dlg.setDefaultButton(defaultButton); + return (QMessageBox::StandardButton)dlg.exec(); +} + +QMessageBox::StandardButton MessageBoxRaised::critical(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton) { + return impl(Critical, parent, title, text, buttons, defaultButton); +} + +QMessageBox::StandardButton MessageBoxRaised::information(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton) { + return impl(Information, parent, title, text, buttons, defaultButton); +} + +QMessageBox::StandardButton MessageBoxRaised::question(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton) { + return impl(Question, parent, title, text, buttons, defaultButton); +} + +QMessageBox::StandardButton MessageBoxRaised::warning(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton) { + return impl(Warning, parent, title, text, buttons, defaultButton); +} + +void MessageBoxRaised::showEvent(QShowEvent *event) { + QMessageBox::showEvent(event); + activateWindow(); + raise(); +} diff -Nru qbittorrent-4.1.3/src/gui/messageboxraised.h qbittorrent-3.3.15/src/gui/messageboxraised.h --- qbittorrent-4.1.3/src/gui/messageboxraised.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/messageboxraised.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,59 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2014 sledgehammer999 + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : hammered999@gmail.com + */ + +#ifndef MESSAGEBOXRAISED_H +#define MESSAGEBOXRAISED_H + +#include + +class MessageBoxRaised : public QMessageBox +{ + Q_OBJECT + +private: + MessageBoxRaised(QMessageBox::Icon icon, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = NoButton, QWidget *parent = 0, Qt::WindowFlags f = Qt::Dialog|Qt::MSWindowsFixedSizeDialogHint); + MessageBoxRaised(); + MessageBoxRaised(MessageBoxRaised const&); + void operator=(MessageBoxRaised const&); + +public: + static QMessageBox::StandardButton critical(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = QMessageBox::Ok, QMessageBox::StandardButton defaultButton = QMessageBox::NoButton); + static QMessageBox::StandardButton information(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = QMessageBox::Ok, QMessageBox::StandardButton defaultButton = QMessageBox::NoButton); + static QMessageBox::StandardButton question(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = QMessageBox::Ok, QMessageBox::StandardButton defaultButton = QMessageBox::NoButton); + static QMessageBox::StandardButton warning(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = QMessageBox::Ok, QMessageBox::StandardButton defaultButton = QMessageBox::NoButton); + +protected: + void showEvent(QShowEvent *event); + +private: + static QMessageBox::StandardButton impl(const QMessageBox::Icon &icon, QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = QMessageBox::Ok, QMessageBox::StandardButton defaultButton = QMessageBox::NoButton); +}; + +#endif // MESSAGEBOXRAISED_H diff -Nru qbittorrent-4.1.3/src/gui/optionsdialog.cpp qbittorrent-3.3.15/src/gui/optionsdialog.cpp --- qbittorrent-4.1.3/src/gui/optionsdialog.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/optionsdialog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,1820 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "optionsdialog.h" - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifndef QT_NO_OPENSSL -#include -#include -#endif - -#include "base/bittorrent/session.h" -#include "base/global.h" -#include "base/net/dnsupdater.h" -#include "base/net/portforwarder.h" -#include "base/net/proxyconfigurationmanager.h" -#include "base/preferences.h" -#include "base/rss/rss_autodownloader.h" -#include "base/rss/rss_session.h" -#include "base/scanfoldersmodel.h" -#include "base/torrentfileguard.h" -#include "base/unicodestrings.h" -#include "base/utils/fs.h" -#include "base/utils/random.h" -#include "addnewtorrentdialog.h" -#include "advancedsettings.h" -#include "app/application.h" -#include "banlistoptionsdialog.h" -#include "ipsubnetwhitelistoptionsdialog.h" -#include "guiiconprovider.h" -#include "rss/automatedrssdownloader.h" -#include "scanfoldersdelegate.h" -#include "ui_optionsdialog.h" -#include "utils.h" - -class WheelEventEater : public QObject -{ -public: - using QObject::QObject; - -private: - bool eventFilter(QObject *, QEvent *event) override - { - return (event->type() == QEvent::Wheel); - } -}; - -// Constructor -OptionsDialog::OptionsDialog(QWidget *parent) - : QDialog(parent) - , m_refreshingIpFilter(false) - , m_ui(new Ui::OptionsDialog) -{ - qDebug("-> Constructing Options"); - m_ui->setupUi(this); - setAttribute(Qt::WA_DeleteOnClose); - setModal(true); - -#if (defined(Q_OS_UNIX)) - setWindowTitle(tr("Preferences")); -#endif - - // Icons - m_ui->tabSelection->item(TAB_UI)->setIcon(GuiIconProvider::instance()->getIcon("preferences-desktop")); - m_ui->tabSelection->item(TAB_BITTORRENT)->setIcon(GuiIconProvider::instance()->getIcon("preferences-system-network")); - m_ui->tabSelection->item(TAB_CONNECTION)->setIcon(GuiIconProvider::instance()->getIcon("network-wired")); - m_ui->tabSelection->item(TAB_DOWNLOADS)->setIcon(GuiIconProvider::instance()->getIcon("folder-download")); - m_ui->tabSelection->item(TAB_SPEED)->setIcon(GuiIconProvider::instance()->getIcon("speedometer", "chronometer")); - m_ui->tabSelection->item(TAB_RSS)->setIcon(GuiIconProvider::instance()->getIcon("rss-config", "application-rss+xml")); -#ifndef DISABLE_WEBUI - m_ui->tabSelection->item(TAB_WEBUI)->setIcon(GuiIconProvider::instance()->getIcon("network-server")); -#else - m_ui->tabSelection->item(TAB_WEBUI)->setHidden(true); -#endif - m_ui->tabSelection->item(TAB_ADVANCED)->setIcon(GuiIconProvider::instance()->getIcon("preferences-other")); - - // set uniform size for all icons - int maxHeight = -1; - for (int i = 0; i < m_ui->tabSelection->count(); ++i) - maxHeight = std::max(maxHeight, m_ui->tabSelection->visualItemRect(m_ui->tabSelection->item(i)).size().height()); - for (int i = 0; i < m_ui->tabSelection->count(); ++i) { - const QSize size(std::numeric_limits::max(), static_cast(maxHeight * 1.2)); - m_ui->tabSelection->item(i)->setSizeHint(size); - } - - m_ui->IpFilterRefreshBtn->setIcon(GuiIconProvider::instance()->getIcon("view-refresh")); - - m_ui->labelGlobalRate->setPixmap(Utils::Gui::scaledPixmap(":/icons/slow_off.png", this, 16)); - m_ui->labelAltRate->setPixmap(Utils::Gui::scaledPixmap(":/icons/slow.png", this, 16)); - - m_ui->deleteTorrentWarningIcon->setPixmap(QApplication::style()->standardIcon(QStyle::SP_MessageBoxCritical).pixmap(16, 16)); - m_ui->deleteTorrentWarningIcon->hide(); - m_ui->deleteTorrentWarningLabel->hide(); - m_ui->deleteTorrentWarningLabel->setToolTip(QLatin1String("

") + - tr("By enabling these options, you can irrevocably lose your .torrent files!") + - QLatin1String("

") + - tr("When these options are enabled, qBittorent will delete .torrent files " - "after they were successfully (the first option) or not (the second option) added to its " - "download queue. This will be applied not only to the files opened via " - "“Add torrent” menu action but to those opened via file type association as well") + - QLatin1String("

") + - tr("If you enable the second option (“Also when addition is cancelled”) the " - ".torrent file will be deleted even if you press “Cancel” in " - "the “Add torrent” dialog") + - QLatin1String("

")); - - m_ui->hsplitter->setCollapsible(0, false); - m_ui->hsplitter->setCollapsible(1, false); - // Get apply button in button box - QList buttons = m_ui->buttonBox->buttons(); - foreach (QAbstractButton *button, buttons) { - if (m_ui->buttonBox->buttonRole(button) == QDialogButtonBox::ApplyRole) { - applyButton = button; - break; - } - } - - m_ui->scanFoldersView->header()->setSectionResizeMode(QHeaderView::ResizeToContents); - m_ui->scanFoldersView->setModel(ScanFoldersModel::instance()); - m_ui->scanFoldersView->setItemDelegate(new ScanFoldersDelegate(this, m_ui->scanFoldersView)); - connect(ScanFoldersModel::instance(), &QAbstractListModel::dataChanged, this, &ThisType::enableApplyButton); - connect(m_ui->scanFoldersView->selectionModel(), &QItemSelectionModel::selectionChanged, this, &ThisType::handleScanFolderViewSelectionChanged); - - connect(m_ui->buttonBox, &QDialogButtonBox::clicked, this, &OptionsDialog::applySettings); - // Languages supported - initializeLanguageCombo(); - - // Load week days (scheduler) - for (uint i = 1; i <= 7; ++i) - m_ui->comboBoxScheduleDays->addItem(QDate::longDayName(i, QDate::StandaloneFormat)); - - // Load options - loadOptions(); -#ifdef Q_OS_MAC - m_ui->checkShowSystray->setVisible(false); -#else - // Disable systray integration if it is not supported by the system - if (!QSystemTrayIcon::isSystemTrayAvailable()) { - m_ui->checkShowSystray->setChecked(false); - m_ui->checkShowSystray->setEnabled(false); - m_ui->labelTrayIconStyle->setVisible(false); - m_ui->comboTrayIcon->setVisible(false); - } -#endif - -#if defined(QT_NO_OPENSSL) - m_ui->checkWebUiHttps->setVisible(false); - m_ui->checkSmtpSSL->setVisible(false); -#endif - -#ifndef Q_OS_WIN - m_ui->checkStartup->setVisible(false); -#endif - -#if !(defined(Q_OS_WIN) || defined(Q_OS_MAC)) - m_ui->groupFileAssociation->setVisible(false); -#endif - - m_ui->textWebUIRootFolder->setMode(FileSystemPathEdit::Mode::DirectoryOpen); - m_ui->textWebUIRootFolder->setDialogCaption(tr("Choose Alternative UI files location")); - - // Connect signals / slots - // Shortcuts for frequently used signals that have more than one overload. They would require - // type casts and that is why we declare required member pointer here instead. - void (QComboBox::*qComboBoxCurrentIndexChanged)(int) = &QComboBox::currentIndexChanged; - void (QSpinBox::*qSpinBoxValueChanged)(int) = &QSpinBox::valueChanged; - - connect(m_ui->checkForceProxy, &QAbstractButton::toggled, this, &ThisType::enableForceProxy); - connect(m_ui->comboProxyType, qComboBoxCurrentIndexChanged, this, &ThisType::enableProxy); - connect(m_ui->checkRandomPort, &QAbstractButton::toggled, m_ui->spinPort, &ThisType::setDisabled); - - // Apply button is activated when a value is changed - // General tab - connect(m_ui->comboI18n, qComboBoxCurrentIndexChanged, this, &ThisType::enableApplyButton); - connect(m_ui->confirmDeletion, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkAltRowColors, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkHideZero, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkHideZero, &QAbstractButton::toggled, m_ui->comboHideZero, &QWidget::setEnabled); - connect(m_ui->comboHideZero, qComboBoxCurrentIndexChanged, this, &ThisType::enableApplyButton); - connect(m_ui->checkShowSystray, &QGroupBox::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkCloseToSystray, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkMinimizeToSysTray, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkStartMinimized, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); -#ifdef Q_OS_WIN - connect(m_ui->checkStartup, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); -#endif - connect(m_ui->checkShowSplash, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkProgramExitConfirm, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkProgramAutoExitConfirm, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkPreventFromSuspendWhenDownloading, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkPreventFromSuspendWhenSeeding, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->comboTrayIcon, qComboBoxCurrentIndexChanged, this, &ThisType::enableApplyButton); -#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) && !defined(QT_DBUS_LIB) - m_ui->checkPreventFromSuspendWhenDownloading->setDisabled(true); - m_ui->checkPreventFromSuspendWhenSeeding->setDisabled(true); -#endif -#if defined(Q_OS_WIN) || defined(Q_OS_MAC) - connect(m_ui->checkAssociateTorrents, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkAssociateMagnetLinks, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); -#endif - connect(m_ui->checkFileLog, &QGroupBox::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->textFileLogPath, &FileSystemPathEdit::selectedPathChanged, this, &ThisType::enableApplyButton); - connect(m_ui->checkFileLogBackup, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkFileLogBackup, &QAbstractButton::toggled, m_ui->spinFileLogSize, &QWidget::setEnabled); - connect(m_ui->checkFileLogDelete, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkFileLogDelete, &QAbstractButton::toggled, m_ui->spinFileLogAge, &QWidget::setEnabled); - connect(m_ui->checkFileLogDelete, &QAbstractButton::toggled, m_ui->comboFileLogAgeType, &QWidget::setEnabled); - connect(m_ui->spinFileLogSize, qSpinBoxValueChanged, this, &ThisType::enableApplyButton); - connect(m_ui->spinFileLogAge, qSpinBoxValueChanged, this, &ThisType::enableApplyButton); - connect(m_ui->comboFileLogAgeType, qComboBoxCurrentIndexChanged, this, &ThisType::enableApplyButton); - // Downloads tab - connect(m_ui->textSavePath, &FileSystemPathEdit::selectedPathChanged, this, &ThisType::enableApplyButton); - connect(m_ui->checkUseSubcategories, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->comboSavingMode, qComboBoxCurrentIndexChanged, this, &ThisType::enableApplyButton); - connect(m_ui->comboTorrentCategoryChanged, qComboBoxCurrentIndexChanged, this, &ThisType::enableApplyButton); - connect(m_ui->comboCategoryDefaultPathChanged, qComboBoxCurrentIndexChanged, this, &ThisType::enableApplyButton); - connect(m_ui->comboCategoryChanged, qComboBoxCurrentIndexChanged, this, &ThisType::enableApplyButton); - connect(m_ui->textTempPath, &FileSystemPathEdit::selectedPathChanged, this, &ThisType::enableApplyButton); - connect(m_ui->checkAppendqB, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkPreallocateAll, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkRecursiveDownload, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkAdditionDialog, &QGroupBox::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkAdditionDialogFront, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkStartPaused, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkCreateSubfolder, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->deleteTorrentBox, &QGroupBox::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->deleteCancelledTorrentBox, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkExportDir, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkExportDir, &QAbstractButton::toggled, m_ui->textExportDir, &QWidget::setEnabled); - connect(m_ui->checkExportDirFin, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkExportDirFin, &QAbstractButton::toggled, m_ui->textExportDirFin, &QWidget::setEnabled); - connect(m_ui->textExportDir, &FileSystemPathEdit::selectedPathChanged, this, &ThisType::enableApplyButton); - connect(m_ui->textExportDirFin, &FileSystemPathEdit::selectedPathChanged, this, &ThisType::enableApplyButton); - connect(m_ui->actionTorrentDlOnDblClBox, qComboBoxCurrentIndexChanged, this, &ThisType::enableApplyButton); - connect(m_ui->actionTorrentFnOnDblClBox, qComboBoxCurrentIndexChanged, this, &ThisType::enableApplyButton); - connect(m_ui->checkTempFolder, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkTempFolder, &QAbstractButton::toggled, m_ui->textTempPath, &QWidget::setEnabled); - connect(m_ui->addScanFolderButton, &QAbstractButton::clicked, this, &ThisType::enableApplyButton); - connect(m_ui->removeScanFolderButton, &QAbstractButton::clicked, this, &ThisType::enableApplyButton); - connect(m_ui->groupMailNotification, &QGroupBox::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->senderEmailTxt, &QLineEdit::textChanged, this, &ThisType::enableApplyButton); - connect(m_ui->lineEditDestEmail, &QLineEdit::textChanged, this, &ThisType::enableApplyButton); - connect(m_ui->lineEditSmtpServer, &QLineEdit::textChanged, this, &ThisType::enableApplyButton); - connect(m_ui->checkSmtpSSL, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->groupMailNotifAuth, &QGroupBox::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->mailNotifUsername, &QLineEdit::textChanged, this, &ThisType::enableApplyButton); - connect(m_ui->mailNotifPassword, &QLineEdit::textChanged, this, &ThisType::enableApplyButton); - connect(m_ui->autoRunBox, &QGroupBox::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->lineEditAutoRun, &QLineEdit::textChanged, this, &ThisType::enableApplyButton); - - const QString autoRunStr = QString("%1\n %2\n %3\n %4\n %5\n %6\n %7\n %8\n %9\n %10\n %11\n%12") - .arg(tr("Supported parameters (case sensitive):") - , tr("%N: Torrent name") - , tr("%L: Category") - , tr("%G: Tags (seperated by comma)") - , tr("%F: Content path (same as root path for multifile torrent)") - , tr("%R: Root path (first torrent subdirectory path)") - , tr("%D: Save path") - , tr("%C: Number of files") - , tr("%Z: Torrent size (bytes)")) - .arg(tr("%T: Current tracker") - , tr("%I: Info hash") - , tr("Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., \"%N\")")); - m_ui->labelAutoRunParam->setText(autoRunStr); - - // Connection tab - connect(m_ui->comboProtocol, qComboBoxCurrentIndexChanged, this, &ThisType::enableApplyButton); - connect(m_ui->spinPort, qSpinBoxValueChanged, this, &ThisType::enableApplyButton); - connect(m_ui->checkRandomPort, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkUPnP, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkUploadLimit, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkDownloadLimit, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkUploadLimitAlt, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkDownloadLimitAlt, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->spinUploadLimit, qSpinBoxValueChanged, this, &ThisType::enableApplyButton); - connect(m_ui->spinDownloadLimit, qSpinBoxValueChanged, this, &ThisType::enableApplyButton); - connect(m_ui->spinUploadLimitAlt, qSpinBoxValueChanged, this, &ThisType::enableApplyButton); - connect(m_ui->spinDownloadLimitAlt, qSpinBoxValueChanged, this, &ThisType::enableApplyButton); - connect(m_ui->groupBoxSchedule, &QGroupBox::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->timeEditScheduleFrom, &QDateTimeEdit::timeChanged, this, &ThisType::enableApplyButton); - connect(m_ui->timeEditScheduleTo, &QDateTimeEdit::timeChanged, this, &ThisType::enableApplyButton); - connect(m_ui->comboBoxScheduleDays, qComboBoxCurrentIndexChanged, this, &ThisType::enableApplyButton); - connect(m_ui->checkLimituTPConnections, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkLimitTransportOverhead, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkLimitLocalPeerRate, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - // Bittorrent tab - connect(m_ui->checkMaxConnecs, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkMaxConnecsPerTorrent, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkMaxUploads, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkMaxUploadsPerTorrent, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->spinMaxConnec, qSpinBoxValueChanged, this, &ThisType::enableApplyButton); - connect(m_ui->spinMaxConnecPerTorrent, qSpinBoxValueChanged, this, &ThisType::enableApplyButton); - connect(m_ui->spinMaxUploads, qSpinBoxValueChanged, this, &ThisType::enableApplyButton); - connect(m_ui->spinMaxUploadsPerTorrent, qSpinBoxValueChanged, this, &ThisType::enableApplyButton); - connect(m_ui->checkDHT, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkAnonymousMode, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkPeX, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkLSD, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->comboEncryption, qComboBoxCurrentIndexChanged, this, &ThisType::enableApplyButton); - connect(m_ui->checkMaxRatio, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkMaxRatio, &QAbstractButton::toggled, this, &ThisType::toggleComboRatioLimitAct); - connect(m_ui->spinMaxRatio, static_cast(&QDoubleSpinBox::valueChanged), - this, &ThisType::enableApplyButton); - connect(m_ui->comboRatioLimitAct, qComboBoxCurrentIndexChanged, this, &ThisType::enableApplyButton); - connect(m_ui->checkMaxSeedingMinutes, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkMaxSeedingMinutes, &QAbstractButton::toggled, this, &ThisType::toggleComboRatioLimitAct); - connect(m_ui->spinMaxSeedingMinutes, qSpinBoxValueChanged, this, &ThisType::enableApplyButton); - // Proxy tab - connect(m_ui->comboProxyType, qComboBoxCurrentIndexChanged, this, &ThisType::enableApplyButton); - connect(m_ui->textProxyIP, &QLineEdit::textChanged, this, &ThisType::enableApplyButton); - connect(m_ui->spinProxyPort, qSpinBoxValueChanged, this, &ThisType::enableApplyButton); - connect(m_ui->checkProxyPeerConnecs, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkForceProxy, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->isProxyOnlyForTorrents, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkProxyAuth, &QGroupBox::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->textProxyUsername, &QLineEdit::textChanged, this, &ThisType::enableApplyButton); - connect(m_ui->textProxyPassword, &QLineEdit::textChanged, this, &ThisType::enableApplyButton); - // Misc tab - connect(m_ui->checkIPFilter, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkIPFilter, &QAbstractButton::toggled, m_ui->textFilterPath, &QWidget::setEnabled); - connect(m_ui->checkIPFilter, &QAbstractButton::toggled, m_ui->IpFilterRefreshBtn, &QWidget::setEnabled); - connect(m_ui->checkIpFilterTrackers, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->textFilterPath, &FileSystemPathEdit::selectedPathChanged, this, &ThisType::enableApplyButton); - connect(m_ui->checkEnableQueueing, &QGroupBox::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->spinMaxActiveDownloads, qSpinBoxValueChanged, this, &ThisType::enableApplyButton); - connect(m_ui->spinMaxActiveUploads, qSpinBoxValueChanged, this, &ThisType::enableApplyButton); - connect(m_ui->spinMaxActiveTorrents, qSpinBoxValueChanged, this, &ThisType::enableApplyButton); - connect(m_ui->checkIgnoreSlowTorrentsForQueueing, &QGroupBox::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->spinDownloadRateForSlowTorrents, qSpinBoxValueChanged, this, &ThisType::enableApplyButton); - connect(m_ui->spinUploadRateForSlowTorrents, qSpinBoxValueChanged, this, &ThisType::enableApplyButton); - connect(m_ui->spinSlowTorrentsInactivityTimer, qSpinBoxValueChanged, this, &ThisType::enableApplyButton); - connect(m_ui->checkEnableAddTrackers, &QGroupBox::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->textTrackers, &QPlainTextEdit::textChanged, this, &ThisType::enableApplyButton); - - const QString slowTorrentsExplanation = QLatin1String("

") - + tr("A torrent will be considered slow if its download and upload rates stay below these values for \"Torrent inactivity timer\" seconds") - + QLatin1String("

"); - m_ui->labelDownloadRateForSlowTorrents->setToolTip(slowTorrentsExplanation); - m_ui->labelUploadRateForSlowTorrents->setToolTip(slowTorrentsExplanation); - m_ui->labelSlowTorrentInactivityTimer->setToolTip(slowTorrentsExplanation); - -#ifndef DISABLE_WEBUI - // Web UI tab - connect(m_ui->textServerDomains, &QLineEdit::textChanged, this, &ThisType::enableApplyButton); - connect(m_ui->checkWebUi, &QGroupBox::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->textWebUiAddress, &QLineEdit::textChanged, this, &ThisType::enableApplyButton); - connect(m_ui->spinWebUiPort, qSpinBoxValueChanged, this, &ThisType::enableApplyButton); - connect(m_ui->checkWebUIUPnP, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkWebUiHttps, &QGroupBox::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->btnWebUiKey, &QAbstractButton::clicked, this, &ThisType::enableApplyButton); - connect(m_ui->btnWebUiCrt, &QAbstractButton::clicked, this, &ThisType::enableApplyButton); - connect(m_ui->textWebUiUsername, &QLineEdit::textChanged, this, &ThisType::enableApplyButton); - connect(m_ui->textWebUiPassword, &QLineEdit::textChanged, this, &ThisType::enableApplyButton); - connect(m_ui->checkBypassLocalAuth, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkBypassAuthSubnetWhitelist, &QAbstractButton::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkBypassAuthSubnetWhitelist, &QAbstractButton::toggled, m_ui->IPSubnetWhitelistButton, &QPushButton::setEnabled); - connect(m_ui->checkClickjacking, &QCheckBox::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkCSRFProtection, &QCheckBox::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->checkDynDNS, &QGroupBox::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->comboDNSService, qComboBoxCurrentIndexChanged, this, &ThisType::enableApplyButton); - connect(m_ui->domainNameTxt, &QLineEdit::textChanged, this, &ThisType::enableApplyButton); - connect(m_ui->DNSUsernameTxt, &QLineEdit::textChanged, this, &ThisType::enableApplyButton); - connect(m_ui->DNSPasswordTxt, &QLineEdit::textChanged, this, &ThisType::enableApplyButton); - connect(m_ui->groupAltWebUI, &QGroupBox::toggled, this, &ThisType::enableApplyButton); - connect(m_ui->textWebUIRootFolder, &FileSystemPathLineEdit::selectedPathChanged, this, &ThisType::enableApplyButton); -#endif // DISABLE_WEBUI - - // RSS tab - connect(m_ui->checkRSSEnable, &QCheckBox::toggled, this, &OptionsDialog::enableApplyButton); - connect(m_ui->checkRSSAutoDownloaderEnable, &QCheckBox::toggled, this, &OptionsDialog::enableApplyButton); - connect(m_ui->textSmartEpisodeFilters, &QPlainTextEdit::textChanged, this, &OptionsDialog::enableApplyButton); - connect(m_ui->spinRSSRefreshInterval, qSpinBoxValueChanged, this, &OptionsDialog::enableApplyButton); - connect(m_ui->spinRSSMaxArticlesPerFeed, qSpinBoxValueChanged, this, &OptionsDialog::enableApplyButton); - connect(m_ui->btnEditRules, &QPushButton::clicked, this, [this]() { AutomatedRssDownloader(this).exec(); }); - - // Disable apply Button - applyButton->setEnabled(false); - // Tab selection mechanism - connect(m_ui->tabSelection, &QListWidget::currentItemChanged, this, &ThisType::changePage); - // Load Advanced settings - advancedSettings = new AdvancedSettings(m_ui->tabAdvancedPage); - m_ui->advPageLayout->addWidget(advancedSettings); - connect(advancedSettings, &AdvancedSettings::settingsChanged, this, &ThisType::enableApplyButton); - - m_ui->textFileLogPath->setDialogCaption(tr("Choose a save directory")); - m_ui->textFileLogPath->setMode(FileSystemPathEdit::Mode::DirectorySave); - - m_ui->textExportDir->setDialogCaption(tr("Choose export directory")); - m_ui->textExportDir->setMode(FileSystemPathEdit::Mode::DirectorySave); - - m_ui->textExportDirFin->setDialogCaption(tr("Choose export directory")); - m_ui->textExportDirFin->setMode(FileSystemPathEdit::Mode::DirectorySave); - - m_ui->textFilterPath->setDialogCaption(tr("Choose an IP filter file")); - m_ui->textFilterPath->setFileNameFilter(tr("All supported filters") - + QLatin1String(" (*.dat *.p2p *.p2b);;.dat (*.dat);;.p2p (*.p2p);;.p2b (*.p2b)")); - - m_ui->textSavePath->setDialogCaption(tr("Choose a save directory")); - m_ui->textSavePath->setMode(FileSystemPathEdit::Mode::DirectorySave); - - m_ui->textTempPath->setDialogCaption(tr("Choose a save directory")); - m_ui->textTempPath->setMode(FileSystemPathEdit::Mode::DirectorySave); - - // disable mouse wheel event on widgets to avoid mis-selection - WheelEventEater *wheelEventEater = new WheelEventEater(this); - for (QComboBox *widget : copyAsConst(findChildren())) - widget->installEventFilter(wheelEventEater); - for (QSpinBox *widget : copyAsConst(findChildren())) - widget->installEventFilter(wheelEventEater); - - loadWindowState(); - show(); - // Have to be called after show(), because splitter width needed - loadSplitterState(); -} - -void OptionsDialog::initializeLanguageCombo() -{ - // List language files - const QDir langDir(":/lang"); - const QStringList langFiles = langDir.entryList(QStringList("qbittorrent_*.qm"), QDir::Files); - foreach (const QString langFile, langFiles) { - QString localeStr = langFile.mid(12); // remove "qbittorrent_" - localeStr.chop(3); // Remove ".qm" - QString languageName; - if (localeStr.startsWith("eo", Qt::CaseInsensitive)) { - // QLocale doesn't work with that locale. Esperanto isn't a "real" language. - languageName = QString::fromUtf8(C_LOCALE_ESPERANTO); - } - else { - QLocale locale(localeStr); - languageName = languageToLocalizedString(locale); - } - m_ui->comboI18n->addItem(/*QIcon(":/icons/flags/"+country+".svg"), */ languageName, localeStr); - qDebug() << "Supported locale:" << localeStr; - } -} - -// Main destructor -OptionsDialog::~OptionsDialog() -{ - qDebug("-> destructing Options"); - - saveWindowState(); - - foreach (const QString &path, addedScanDirs) - ScanFoldersModel::instance()->removePath(path); - ScanFoldersModel::instance()->configure(); // reloads "removed" paths - delete m_ui; -} - -void OptionsDialog::changePage(QListWidgetItem *current, QListWidgetItem *previous) -{ - if (!current) - current = previous; - m_ui->tabOption->setCurrentIndex(m_ui->tabSelection->row(current)); -} - -void OptionsDialog::loadWindowState() -{ - Utils::Gui::resize(this, Preferences::instance()->getPrefSize()); -} - -void OptionsDialog::loadSplitterState() -{ - const QStringList sizesStr = Preferences::instance()->getPrefHSplitterSizes(); - - // width has been modified, use height as width reference instead - const int width = Utils::Gui::scaledSize(this - , (m_ui->tabSelection->item(TAB_UI)->sizeHint().height() * 2)); - QList sizes {width, (m_ui->hsplitter->width() - width)}; - if (sizesStr.size() == 2) - sizes = {sizesStr.first().toInt(), sizesStr.last().toInt()}; - m_ui->hsplitter->setSizes(sizes); -} - -void OptionsDialog::saveWindowState() const -{ - Preferences *const pref = Preferences::instance(); - - // window size - pref->setPrefSize(size()); - - // Splitter size - const QStringList sizesStr = { - QString::number(m_ui->hsplitter->sizes().first()), - QString::number(m_ui->hsplitter->sizes().last()) - }; - pref->setPrefHSplitterSizes(sizesStr); -} - -void OptionsDialog::saveOptions() -{ - applyButton->setEnabled(false); - Preferences *const pref = Preferences::instance(); - // Load the translation - QString locale = getLocale(); - if (pref->getLocale() != locale) { - QTranslator *translator = new QTranslator; - if (translator->load(QLatin1String(":/lang/qbittorrent_") + locale)) - qDebug("%s locale recognized, using translation.", qUtf8Printable(locale)); - else - qDebug("%s locale unrecognized, using default (en).", qUtf8Printable(locale)); - qApp->installTranslator(translator); - } - - // General preferences - pref->setLocale(locale); - pref->setConfirmTorrentDeletion(m_ui->confirmDeletion->isChecked()); - pref->setAlternatingRowColors(m_ui->checkAltRowColors->isChecked()); - pref->setHideZeroValues(m_ui->checkHideZero->isChecked()); - pref->setHideZeroComboValues(m_ui->comboHideZero->currentIndex()); -#ifndef Q_OS_MAC - pref->setSystrayIntegration(systrayIntegration()); - pref->setTrayIconStyle(TrayIcon::Style(m_ui->comboTrayIcon->currentIndex())); - pref->setCloseToTray(closeToTray()); - pref->setMinimizeToTray(minimizeToTray()); - pref->setStartMinimized(startMinimized()); -#endif - pref->setSplashScreenDisabled(isSplashScreenDisabled()); - pref->setConfirmOnExit(m_ui->checkProgramExitConfirm->isChecked()); - pref->setDontConfirmAutoExit(!m_ui->checkProgramAutoExitConfirm->isChecked()); - pref->setPreventFromSuspendWhenDownloading(m_ui->checkPreventFromSuspendWhenDownloading->isChecked()); - pref->setPreventFromSuspendWhenSeeding(m_ui->checkPreventFromSuspendWhenSeeding->isChecked()); -#ifdef Q_OS_WIN - pref->setWinStartup(WinStartup()); - // Windows: file association settings - Preferences::setTorrentFileAssoc(m_ui->checkAssociateTorrents->isChecked()); - Preferences::setMagnetLinkAssoc(m_ui->checkAssociateMagnetLinks->isChecked()); -#endif -#ifdef Q_OS_MAC - if (m_ui->checkAssociateTorrents->isChecked()) { - Preferences::setTorrentFileAssoc(); - m_ui->checkAssociateTorrents->setChecked(Preferences::isTorrentFileAssocSet()); - m_ui->checkAssociateTorrents->setEnabled(!m_ui->checkAssociateTorrents->isChecked()); - } - if (m_ui->checkAssociateMagnetLinks->isChecked()) { - Preferences::setMagnetLinkAssoc(); - m_ui->checkAssociateMagnetLinks->setChecked(Preferences::isMagnetLinkAssocSet()); - m_ui->checkAssociateMagnetLinks->setEnabled(!m_ui->checkAssociateMagnetLinks->isChecked()); - } -#endif - Application *const app = static_cast(QCoreApplication::instance()); - app->setFileLoggerPath(m_ui->textFileLogPath->selectedPath()); - app->setFileLoggerBackup(m_ui->checkFileLogBackup->isChecked()); - app->setFileLoggerMaxSize(m_ui->spinFileLogSize->value() * 1024); - app->setFileLoggerAge(m_ui->spinFileLogAge->value()); - app->setFileLoggerAgeType(m_ui->comboFileLogAgeType->currentIndex()); - app->setFileLoggerDeleteOld(m_ui->checkFileLogDelete->isChecked()); - app->setFileLoggerEnabled(m_ui->checkFileLog->isChecked()); - // End General preferences - - RSS::Session::instance()->setRefreshInterval(m_ui->spinRSSRefreshInterval->value()); - RSS::Session::instance()->setMaxArticlesPerFeed(m_ui->spinRSSMaxArticlesPerFeed->value()); - RSS::Session::instance()->setProcessingEnabled(m_ui->checkRSSEnable->isChecked()); - RSS::AutoDownloader::instance()->setProcessingEnabled(m_ui->checkRSSAutoDownloaderEnable->isChecked()); - RSS::AutoDownloader::instance()->setSmartEpisodeFilters(m_ui->textSmartEpisodeFilters->toPlainText().split('\n', QString::SplitBehavior::SkipEmptyParts)); - - auto session = BitTorrent::Session::instance(); - - // Downloads preferences - session->setDefaultSavePath(Utils::Fs::expandPathAbs(m_ui->textSavePath->selectedPath())); - session->setSubcategoriesEnabled(m_ui->checkUseSubcategories->isChecked()); - session->setAutoTMMDisabledByDefault(m_ui->comboSavingMode->currentIndex() == 0); - session->setDisableAutoTMMWhenCategoryChanged(m_ui->comboTorrentCategoryChanged->currentIndex() == 1); - session->setDisableAutoTMMWhenCategorySavePathChanged(m_ui->comboCategoryChanged->currentIndex() == 1); - session->setDisableAutoTMMWhenDefaultSavePathChanged(m_ui->comboCategoryDefaultPathChanged->currentIndex() == 1); - session->setTempPathEnabled(m_ui->checkTempFolder->isChecked()); - session->setTempPath(Utils::Fs::expandPathAbs(m_ui->textTempPath->selectedPath())); - session->setAppendExtensionEnabled(m_ui->checkAppendqB->isChecked()); - session->setPreallocationEnabled(preAllocateAllFiles()); - pref->disableRecursiveDownload(!m_ui->checkRecursiveDownload->isChecked()); - AddNewTorrentDialog::setEnabled(useAdditionDialog()); - AddNewTorrentDialog::setTopLevel(m_ui->checkAdditionDialogFront->isChecked()); - session->setAddTorrentPaused(addTorrentsInPause()); - session->setCreateTorrentSubfolder(m_ui->checkCreateSubfolder->isChecked()); - ScanFoldersModel::instance()->removeFromFSWatcher(removedScanDirs); - ScanFoldersModel::instance()->addToFSWatcher(addedScanDirs); - ScanFoldersModel::instance()->makePersistent(); - removedScanDirs.clear(); - addedScanDirs.clear(); - session->setTorrentExportDirectory(getTorrentExportDir()); - session->setFinishedTorrentExportDirectory(getFinishedTorrentExportDir()); - pref->setMailNotificationEnabled(m_ui->groupMailNotification->isChecked()); - pref->setMailNotificationSender(m_ui->senderEmailTxt->text()); - pref->setMailNotificationEmail(m_ui->lineEditDestEmail->text()); - pref->setMailNotificationSMTP(m_ui->lineEditSmtpServer->text()); - pref->setMailNotificationSMTPSSL(m_ui->checkSmtpSSL->isChecked()); - pref->setMailNotificationSMTPAuth(m_ui->groupMailNotifAuth->isChecked()); - pref->setMailNotificationSMTPUsername(m_ui->mailNotifUsername->text()); - pref->setMailNotificationSMTPPassword(m_ui->mailNotifPassword->text()); - pref->setAutoRunEnabled(m_ui->autoRunBox->isChecked()); - pref->setAutoRunProgram(m_ui->lineEditAutoRun->text().trimmed()); - pref->setActionOnDblClOnTorrentDl(getActionOnDblClOnTorrentDl()); - pref->setActionOnDblClOnTorrentFn(getActionOnDblClOnTorrentFn()); - TorrentFileGuard::setAutoDeleteMode(!m_ui->deleteTorrentBox->isChecked() ? TorrentFileGuard::Never - : !m_ui->deleteCancelledTorrentBox->isChecked() ? TorrentFileGuard::IfAdded - : TorrentFileGuard::Always); - // End Downloads preferences - - // Connection preferences - session->setBTProtocol(static_cast(m_ui->comboProtocol->currentIndex())); - session->setPort(getPort()); - session->setUseRandomPort(m_ui->checkRandomPort->isChecked()); - Net::PortForwarder::instance()->setEnabled(isUPnPEnabled()); - const QPair downUpLimit = getGlobalBandwidthLimits(); - session->setGlobalDownloadSpeedLimit(downUpLimit.first); - session->setGlobalUploadSpeedLimit(downUpLimit.second); - session->setUTPRateLimited(m_ui->checkLimituTPConnections->isChecked()); - session->setIncludeOverheadInLimits(m_ui->checkLimitTransportOverhead->isChecked()); - session->setIgnoreLimitsOnLAN(!m_ui->checkLimitLocalPeerRate->isChecked()); - const QPair altDownUpLimit = getAltGlobalBandwidthLimits(); - session->setAltGlobalDownloadSpeedLimit(altDownUpLimit.first); - session->setAltGlobalUploadSpeedLimit(altDownUpLimit.second); - pref->setSchedulerStartTime(m_ui->timeEditScheduleFrom->time()); - pref->setSchedulerEndTime(m_ui->timeEditScheduleTo->time()); - pref->setSchedulerDays(static_cast(m_ui->comboBoxScheduleDays->currentIndex())); - session->setBandwidthSchedulerEnabled(m_ui->groupBoxSchedule->isChecked()); - - auto proxyConfigManager = Net::ProxyConfigurationManager::instance(); - Net::ProxyConfiguration proxyConf; - proxyConf.type = getProxyType(); - proxyConf.ip = getProxyIp(); - proxyConf.port = getProxyPort(); - proxyConf.username = getProxyUsername(); - proxyConf.password = getProxyPassword(); - proxyConfigManager->setProxyOnlyForTorrents(m_ui->isProxyOnlyForTorrents->isChecked()); - proxyConfigManager->setProxyConfiguration(proxyConf); - - session->setProxyPeerConnectionsEnabled(m_ui->checkProxyPeerConnecs->isChecked()); - session->setForceProxyEnabled(m_ui->checkForceProxy->isChecked()); - // End Connection preferences - - // Bittorrent preferences - session->setMaxConnections(getMaxConnecs()); - session->setMaxConnectionsPerTorrent(getMaxConnecsPerTorrent()); - session->setMaxUploads(getMaxUploads()); - session->setMaxUploadsPerTorrent(getMaxUploadsPerTorrent()); - session->setDHTEnabled(isDHTEnabled()); - session->setPeXEnabled(m_ui->checkPeX->isChecked()); - session->setLSDEnabled(isLSDEnabled()); - session->setEncryption(getEncryptionSetting()); - session->setAnonymousModeEnabled(m_ui->checkAnonymousMode->isChecked()); - session->setAddTrackersEnabled(m_ui->checkEnableAddTrackers->isChecked()); - session->setAdditionalTrackers(m_ui->textTrackers->toPlainText()); - session->setGlobalMaxRatio(getMaxRatio()); - session->setGlobalMaxSeedingMinutes(getMaxSeedingMinutes()); - session->setMaxRatioAction(static_cast(m_ui->comboRatioLimitAct->currentIndex())); - // End Bittorrent preferences - - // Misc preferences - // * IPFilter - session->setIPFilteringEnabled(isIPFilteringEnabled()); - session->setTrackerFilteringEnabled(m_ui->checkIpFilterTrackers->isChecked()); - session->setIPFilterFile(m_ui->textFilterPath->selectedPath()); - // End IPFilter preferences - // Queueing system - session->setQueueingSystemEnabled(isQueueingSystemEnabled()); - session->setMaxActiveDownloads(m_ui->spinMaxActiveDownloads->value()); - session->setMaxActiveUploads(m_ui->spinMaxActiveUploads->value()); - session->setMaxActiveTorrents(m_ui->spinMaxActiveTorrents->value()); - session->setIgnoreSlowTorrentsForQueueing(m_ui->checkIgnoreSlowTorrentsForQueueing->isChecked()); - session->setDownloadRateForSlowTorrents(m_ui->spinDownloadRateForSlowTorrents->value()); - session->setUploadRateForSlowTorrents(m_ui->spinUploadRateForSlowTorrents->value()); - session->setSlowTorrentsInactivityTimer(m_ui->spinSlowTorrentsInactivityTimer->value()); - // End Queueing system preferences - // Web UI - pref->setWebUiEnabled(isWebUiEnabled()); - if (isWebUiEnabled()) { - pref->setServerDomains(m_ui->textServerDomains->text()); - pref->setWebUiAddress(m_ui->textWebUiAddress->text()); - pref->setWebUiPort(m_ui->spinWebUiPort->value()); - pref->setUPnPForWebUIPort(m_ui->checkWebUIUPnP->isChecked()); - pref->setWebUiHttpsEnabled(m_ui->checkWebUiHttps->isChecked()); - // HTTPS - if (m_ui->checkWebUiHttps->isChecked()) { - pref->setWebUiHttpsCertificate(m_sslCert); - pref->setWebUiHttpsKey(m_sslKey); - } - // Authentication - pref->setWebUiUsername(webUiUsername()); - pref->setWebUiPassword(webUiPassword()); - pref->setWebUiLocalAuthEnabled(!m_ui->checkBypassLocalAuth->isChecked()); - pref->setWebUiAuthSubnetWhitelistEnabled(m_ui->checkBypassAuthSubnetWhitelist->isChecked()); - // Security - pref->setWebUiClickjackingProtectionEnabled(m_ui->checkClickjacking->isChecked()); - pref->setWebUiCSRFProtectionEnabled(m_ui->checkCSRFProtection->isChecked()); - // DynDNS - pref->setDynDNSEnabled(m_ui->checkDynDNS->isChecked()); - pref->setDynDNSService(m_ui->comboDNSService->currentIndex()); - pref->setDynDomainName(m_ui->domainNameTxt->text()); - pref->setDynDNSUsername(m_ui->DNSUsernameTxt->text()); - pref->setDynDNSPassword(m_ui->DNSPasswordTxt->text()); - // Alternative UI - pref->setAltWebUiEnabled(m_ui->groupAltWebUI->isChecked()); - pref->setWebUiRootFolder(m_ui->textWebUIRootFolder->selectedPath()); - } - // End Web UI - // End preferences - // Save advanced settings - advancedSettings->saveAdvancedSettings(); - // Assume that user changed multiple settings - // so it's best to save immediately - pref->apply(); -} - -bool OptionsDialog::isIPFilteringEnabled() const -{ - return m_ui->checkIPFilter->isChecked(); -} - -Net::ProxyType OptionsDialog::getProxyType() const -{ - switch (m_ui->comboProxyType->currentIndex()) { - case 1: - return Net::ProxyType::SOCKS4; - break; - case 2: - if (isProxyAuthEnabled()) - return Net::ProxyType::SOCKS5_PW; - return Net::ProxyType::SOCKS5; - case 3: - if (isProxyAuthEnabled()) - return Net::ProxyType::HTTP_PW; - return Net::ProxyType::HTTP; - default: - return Net::ProxyType::None; - } -} - -void OptionsDialog::loadOptions() -{ - int intValue; - QString strValue; - bool fileLogBackup = true; - bool fileLogDelete = true; - const Preferences *const pref = Preferences::instance(); - - // General preferences - setLocale(pref->getLocale()); - m_ui->confirmDeletion->setChecked(pref->confirmTorrentDeletion()); - m_ui->checkAltRowColors->setChecked(pref->useAlternatingRowColors()); - m_ui->checkHideZero->setChecked(pref->getHideZeroValues()); - m_ui->comboHideZero->setEnabled(m_ui->checkHideZero->isChecked()); - m_ui->comboHideZero->setCurrentIndex(pref->getHideZeroComboValues()); - - m_ui->checkShowSplash->setChecked(!pref->isSplashScreenDisabled()); - m_ui->checkStartMinimized->setChecked(pref->startMinimized()); - m_ui->checkProgramExitConfirm->setChecked(pref->confirmOnExit()); - m_ui->checkProgramAutoExitConfirm->setChecked(!pref->dontConfirmAutoExit()); - -#ifndef Q_OS_MAC - m_ui->checkShowSystray->setChecked(pref->systrayIntegration()); - if (m_ui->checkShowSystray->isChecked()) { - m_ui->checkMinimizeToSysTray->setChecked(pref->minimizeToTray()); - m_ui->checkCloseToSystray->setChecked(pref->closeToTray()); - m_ui->comboTrayIcon->setCurrentIndex(pref->trayIconStyle()); - } -#endif - - m_ui->checkPreventFromSuspendWhenDownloading->setChecked(pref->preventFromSuspendWhenDownloading()); - m_ui->checkPreventFromSuspendWhenSeeding->setChecked(pref->preventFromSuspendWhenSeeding()); - -#ifdef Q_OS_WIN - m_ui->checkStartup->setChecked(pref->WinStartup()); - m_ui->checkAssociateTorrents->setChecked(Preferences::isTorrentFileAssocSet()); - m_ui->checkAssociateMagnetLinks->setChecked(Preferences::isMagnetLinkAssocSet()); -#endif -#ifdef Q_OS_MAC - m_ui->checkAssociateTorrents->setChecked(Preferences::isTorrentFileAssocSet()); - m_ui->checkAssociateTorrents->setEnabled(!m_ui->checkAssociateTorrents->isChecked()); - m_ui->checkAssociateMagnetLinks->setChecked(Preferences::isMagnetLinkAssocSet()); - m_ui->checkAssociateMagnetLinks->setEnabled(!m_ui->checkAssociateMagnetLinks->isChecked()); -#endif - - const Application *const app = static_cast(QCoreApplication::instance()); - m_ui->checkFileLog->setChecked(app->isFileLoggerEnabled()); - m_ui->textFileLogPath->setSelectedPath(app->fileLoggerPath()); - fileLogBackup = app->isFileLoggerBackup(); - m_ui->checkFileLogBackup->setChecked(fileLogBackup); - m_ui->spinFileLogSize->setEnabled(fileLogBackup); - fileLogDelete = app->isFileLoggerDeleteOld(); - m_ui->checkFileLogDelete->setChecked(fileLogDelete); - m_ui->spinFileLogAge->setEnabled(fileLogDelete); - m_ui->comboFileLogAgeType->setEnabled(fileLogDelete); - m_ui->spinFileLogSize->setValue(app->fileLoggerMaxSize() / 1024); - m_ui->spinFileLogAge->setValue(app->fileLoggerAge()); - m_ui->comboFileLogAgeType->setCurrentIndex(app->fileLoggerAgeType()); - // End General preferences - - m_ui->checkRSSEnable->setChecked(RSS::Session::instance()->isProcessingEnabled()); - m_ui->checkRSSAutoDownloaderEnable->setChecked(RSS::AutoDownloader::instance()->isProcessingEnabled()); - m_ui->textSmartEpisodeFilters->setPlainText(RSS::AutoDownloader::instance()->smartEpisodeFilters().join('\n')); - - m_ui->spinRSSRefreshInterval->setValue(RSS::Session::instance()->refreshInterval()); - m_ui->spinRSSMaxArticlesPerFeed->setValue(RSS::Session::instance()->maxArticlesPerFeed()); - - auto session = BitTorrent::Session::instance(); - - // Downloads preferences - m_ui->checkAdditionDialog->setChecked(AddNewTorrentDialog::isEnabled()); - m_ui->checkAdditionDialogFront->setChecked(AddNewTorrentDialog::isTopLevel()); - m_ui->checkStartPaused->setChecked(session->isAddTorrentPaused()); - m_ui->checkCreateSubfolder->setChecked(session->isCreateTorrentSubfolder()); - const TorrentFileGuard::AutoDeleteMode autoDeleteMode = TorrentFileGuard::autoDeleteMode(); - m_ui->deleteTorrentBox->setChecked(autoDeleteMode != TorrentFileGuard::Never); - m_ui->deleteCancelledTorrentBox->setChecked(autoDeleteMode == TorrentFileGuard::Always); - - m_ui->textSavePath->setSelectedPath(session->defaultSavePath()); - m_ui->checkUseSubcategories->setChecked(session->isSubcategoriesEnabled()); - m_ui->comboSavingMode->setCurrentIndex(!session->isAutoTMMDisabledByDefault()); - m_ui->comboTorrentCategoryChanged->setCurrentIndex(session->isDisableAutoTMMWhenCategoryChanged()); - m_ui->comboCategoryChanged->setCurrentIndex(session->isDisableAutoTMMWhenCategorySavePathChanged()); - m_ui->comboCategoryDefaultPathChanged->setCurrentIndex(session->isDisableAutoTMMWhenDefaultSavePathChanged()); - m_ui->checkTempFolder->setChecked(session->isTempPathEnabled()); - m_ui->textTempPath->setEnabled(m_ui->checkTempFolder->isChecked()); - m_ui->textTempPath->setEnabled(m_ui->checkTempFolder->isChecked()); - m_ui->textTempPath->setSelectedPath(Utils::Fs::toNativePath(session->tempPath())); - m_ui->checkAppendqB->setChecked(session->isAppendExtensionEnabled()); - m_ui->checkPreallocateAll->setChecked(session->isPreallocationEnabled()); - m_ui->checkRecursiveDownload->setChecked(!pref->recursiveDownloadDisabled()); - - strValue = session->torrentExportDirectory(); - if (strValue.isEmpty()) { - // Disable - m_ui->checkExportDir->setChecked(false); - m_ui->textExportDir->setEnabled(false); - } - else { - // Enable - m_ui->checkExportDir->setChecked(true); - m_ui->textExportDir->setEnabled(true); - m_ui->textExportDir->setSelectedPath(strValue); - } - - strValue = session->finishedTorrentExportDirectory(); - if (strValue.isEmpty()) { - // Disable - m_ui->checkExportDirFin->setChecked(false); - m_ui->textExportDirFin->setEnabled(false); - } - else { - // Enable - m_ui->checkExportDirFin->setChecked(true); - m_ui->textExportDirFin->setEnabled(true); - m_ui->textExportDirFin->setSelectedPath(strValue); - } - - m_ui->groupMailNotification->setChecked(pref->isMailNotificationEnabled()); - m_ui->senderEmailTxt->setText(pref->getMailNotificationSender()); - m_ui->lineEditDestEmail->setText(pref->getMailNotificationEmail()); - m_ui->lineEditSmtpServer->setText(pref->getMailNotificationSMTP()); - m_ui->checkSmtpSSL->setChecked(pref->getMailNotificationSMTPSSL()); - m_ui->groupMailNotifAuth->setChecked(pref->getMailNotificationSMTPAuth()); - m_ui->mailNotifUsername->setText(pref->getMailNotificationSMTPUsername()); - m_ui->mailNotifPassword->setText(pref->getMailNotificationSMTPPassword()); - - m_ui->autoRunBox->setChecked(pref->isAutoRunEnabled()); - m_ui->lineEditAutoRun->setText(pref->getAutoRunProgram()); - intValue = pref->getActionOnDblClOnTorrentDl(); - if (intValue >= m_ui->actionTorrentDlOnDblClBox->count()) - intValue = 0; - m_ui->actionTorrentDlOnDblClBox->setCurrentIndex(intValue); - intValue = pref->getActionOnDblClOnTorrentFn(); - if (intValue >= m_ui->actionTorrentFnOnDblClBox->count()) - intValue = 1; - m_ui->actionTorrentFnOnDblClBox->setCurrentIndex(intValue); - // End Downloads preferences - - // Connection preferences - m_ui->comboProtocol->setCurrentIndex(static_cast(session->btProtocol())); - m_ui->checkUPnP->setChecked(Net::PortForwarder::instance()->isEnabled()); - m_ui->checkRandomPort->setChecked(session->useRandomPort()); - m_ui->spinPort->setValue(session->port()); - m_ui->spinPort->setDisabled(m_ui->checkRandomPort->isChecked()); - - intValue = session->maxConnections(); - if (intValue > 0) { - // enable - m_ui->checkMaxConnecs->setChecked(true); - m_ui->spinMaxConnec->setEnabled(true); - m_ui->spinMaxConnec->setValue(intValue); - } - else { - // disable - m_ui->checkMaxConnecs->setChecked(false); - m_ui->spinMaxConnec->setEnabled(false); - } - intValue = session->maxConnectionsPerTorrent(); - if (intValue > 0) { - // enable - m_ui->checkMaxConnecsPerTorrent->setChecked(true); - m_ui->spinMaxConnecPerTorrent->setEnabled(true); - m_ui->spinMaxConnecPerTorrent->setValue(intValue); - } - else { - // disable - m_ui->checkMaxConnecsPerTorrent->setChecked(false); - m_ui->spinMaxConnecPerTorrent->setEnabled(false); - } - intValue = session->maxUploads(); - if (intValue > 0) { - // enable - m_ui->checkMaxUploads->setChecked(true); - m_ui->spinMaxUploads->setEnabled(true); - m_ui->spinMaxUploads->setValue(intValue); - } - else { - // disable - m_ui->checkMaxUploads->setChecked(false); - m_ui->spinMaxUploads->setEnabled(false); - } - intValue = session->maxUploadsPerTorrent(); - if (intValue > 0) { - // enable - m_ui->checkMaxUploadsPerTorrent->setChecked(true); - m_ui->spinMaxUploadsPerTorrent->setEnabled(true); - m_ui->spinMaxUploadsPerTorrent->setValue(intValue); - } - else { - // disable - m_ui->checkMaxUploadsPerTorrent->setChecked(false); - m_ui->spinMaxUploadsPerTorrent->setEnabled(false); - } - - auto proxyConfigManager = Net::ProxyConfigurationManager::instance(); - Net::ProxyConfiguration proxyConf = proxyConfigManager->proxyConfiguration(); - using Net::ProxyType; - bool useProxyAuth = false; - switch (proxyConf.type) { - case ProxyType::SOCKS4: - m_ui->comboProxyType->setCurrentIndex(1); - break; - - case ProxyType::SOCKS5_PW: - useProxyAuth = true; - // fallthrough - case ProxyType::SOCKS5: - m_ui->comboProxyType->setCurrentIndex(2); - break; - - case ProxyType::HTTP_PW: - useProxyAuth = true; - // fallthrough - case ProxyType::HTTP: - m_ui->comboProxyType->setCurrentIndex(3); - break; - - default: - m_ui->comboProxyType->setCurrentIndex(0); - } - m_ui->textProxyIP->setText(proxyConf.ip); - m_ui->spinProxyPort->setValue(proxyConf.port); - m_ui->checkProxyAuth->setChecked(useProxyAuth); - m_ui->textProxyUsername->setText(proxyConf.username); - m_ui->textProxyPassword->setText(proxyConf.password); - - m_ui->checkProxyPeerConnecs->setChecked(session->isProxyPeerConnectionsEnabled()); - m_ui->checkForceProxy->setChecked(session->isForceProxyEnabled()); - enableForceProxy(session->isForceProxyEnabled()); - m_ui->isProxyOnlyForTorrents->setChecked(proxyConfigManager->isProxyOnlyForTorrents()); - enableProxy(m_ui->comboProxyType->currentIndex()); - - m_ui->checkIPFilter->setChecked(session->isIPFilteringEnabled()); - m_ui->textFilterPath->setEnabled(m_ui->checkIPFilter->isChecked()); - m_ui->textFilterPath->setSelectedPath(session->IPFilterFile()); - m_ui->IpFilterRefreshBtn->setEnabled(m_ui->checkIPFilter->isChecked()); - m_ui->checkIpFilterTrackers->setChecked(session->isTrackerFilteringEnabled()); - // End Connection preferences - - // Speed preferences - intValue = session->globalDownloadSpeedLimit() / 1024; - if (intValue > 0) { - // Enabled - m_ui->checkDownloadLimit->setChecked(true); - m_ui->spinDownloadLimit->setEnabled(true); - m_ui->spinDownloadLimit->setValue(intValue); - } - else { - // Disabled - m_ui->checkDownloadLimit->setChecked(false); - m_ui->spinDownloadLimit->setEnabled(false); - } - intValue = session->globalUploadSpeedLimit() / 1024; - if (intValue > 0) { - // Enabled - m_ui->checkUploadLimit->setChecked(true); - m_ui->spinUploadLimit->setEnabled(true); - m_ui->spinUploadLimit->setValue(intValue); - } - else { - // Disabled - m_ui->checkUploadLimit->setChecked(false); - m_ui->spinUploadLimit->setEnabled(false); - } - - intValue = session->altGlobalDownloadSpeedLimit() / 1024; - if (intValue > 0) { - // Enabled - m_ui->checkDownloadLimitAlt->setChecked(true); - m_ui->spinDownloadLimitAlt->setEnabled(true); - m_ui->spinDownloadLimitAlt->setValue(intValue); - } - else { - // Disabled - m_ui->checkDownloadLimitAlt->setChecked(false); - m_ui->spinDownloadLimitAlt->setEnabled(false); - } - intValue = session->altGlobalUploadSpeedLimit() / 1024; - if (intValue > 0) { - // Enabled - m_ui->checkUploadLimitAlt->setChecked(true); - m_ui->spinUploadLimitAlt->setEnabled(true); - m_ui->spinUploadLimitAlt->setValue(intValue); - } - else { - // Disabled - m_ui->checkUploadLimitAlt->setChecked(false); - m_ui->spinUploadLimitAlt->setEnabled(false); - } - - m_ui->checkLimituTPConnections->setChecked(session->isUTPRateLimited()); - m_ui->checkLimitTransportOverhead->setChecked(session->includeOverheadInLimits()); - m_ui->checkLimitLocalPeerRate->setChecked(!session->ignoreLimitsOnLAN()); - - m_ui->groupBoxSchedule->setChecked(session->isBandwidthSchedulerEnabled()); - m_ui->timeEditScheduleFrom->setTime(pref->getSchedulerStartTime()); - m_ui->timeEditScheduleTo->setTime(pref->getSchedulerEndTime()); - m_ui->comboBoxScheduleDays->setCurrentIndex(static_cast(pref->getSchedulerDays())); - // End Speed preferences - - // Bittorrent preferences - m_ui->checkDHT->setChecked(session->isDHTEnabled()); - m_ui->checkPeX->setChecked(session->isPeXEnabled()); - m_ui->checkLSD->setChecked(session->isLSDEnabled()); - m_ui->comboEncryption->setCurrentIndex(session->encryption()); - m_ui->checkAnonymousMode->setChecked(session->isAnonymousModeEnabled()); - m_ui->checkEnableAddTrackers->setChecked(session->isAddTrackersEnabled()); - m_ui->textTrackers->setPlainText(session->additionalTrackers()); - - m_ui->checkEnableQueueing->setChecked(session->isQueueingSystemEnabled()); - m_ui->spinMaxActiveDownloads->setValue(session->maxActiveDownloads()); - m_ui->spinMaxActiveUploads->setValue(session->maxActiveUploads()); - m_ui->spinMaxActiveTorrents->setValue(session->maxActiveTorrents()); - m_ui->checkIgnoreSlowTorrentsForQueueing->setChecked(session->ignoreSlowTorrentsForQueueing()); - m_ui->spinDownloadRateForSlowTorrents->setValue(session->downloadRateForSlowTorrents()); - m_ui->spinUploadRateForSlowTorrents->setValue(session->uploadRateForSlowTorrents()); - m_ui->spinSlowTorrentsInactivityTimer->setValue(session->slowTorrentsInactivityTimer()); - - if (session->globalMaxRatio() >= 0.) { - // Enable - m_ui->checkMaxRatio->setChecked(true); - m_ui->spinMaxRatio->setEnabled(true); - m_ui->comboRatioLimitAct->setEnabled(true); - m_ui->spinMaxRatio->setValue(session->globalMaxRatio()); - } - else { - // Disable - m_ui->checkMaxRatio->setChecked(false); - m_ui->spinMaxRatio->setEnabled(false); - } - if (session->globalMaxSeedingMinutes() >= 0) { - // Enable - m_ui->checkMaxSeedingMinutes->setChecked(true); - m_ui->spinMaxSeedingMinutes->setEnabled(true); - m_ui->spinMaxSeedingMinutes->setValue(session->globalMaxSeedingMinutes()); - } - else { - // Disable - m_ui->checkMaxSeedingMinutes->setChecked(false); - m_ui->spinMaxSeedingMinutes->setEnabled(false); - } - m_ui->comboRatioLimitAct->setEnabled((session->globalMaxSeedingMinutes() >= 0) || (session->globalMaxRatio() >= 0.)); - m_ui->comboRatioLimitAct->setCurrentIndex(session->maxRatioAction()); - // End Bittorrent preferences - - // Web UI preferences - m_ui->textServerDomains->setText(pref->getServerDomains()); - m_ui->checkWebUi->setChecked(pref->isWebUiEnabled()); - m_ui->textWebUiAddress->setText(pref->getWebUiAddress()); - m_ui->spinWebUiPort->setValue(pref->getWebUiPort()); - m_ui->checkWebUIUPnP->setChecked(pref->useUPnPForWebUIPort()); - m_ui->checkWebUiHttps->setChecked(pref->isWebUiHttpsEnabled()); - setSslCertificate(pref->getWebUiHttpsCertificate()); - setSslKey(pref->getWebUiHttpsKey()); - m_ui->textWebUiUsername->setText(pref->getWebUiUsername()); - m_ui->textWebUiPassword->setText(pref->getWebUiPassword()); - m_ui->checkBypassLocalAuth->setChecked(!pref->isWebUiLocalAuthEnabled()); - m_ui->checkBypassAuthSubnetWhitelist->setChecked(pref->isWebUiAuthSubnetWhitelistEnabled()); - m_ui->IPSubnetWhitelistButton->setEnabled(m_ui->checkBypassAuthSubnetWhitelist->isChecked()); - - // Security - m_ui->checkClickjacking->setChecked(pref->isWebUiClickjackingProtectionEnabled()); - m_ui->checkCSRFProtection->setChecked(pref->isWebUiCSRFProtectionEnabled()); - - m_ui->checkDynDNS->setChecked(pref->isDynDNSEnabled()); - m_ui->comboDNSService->setCurrentIndex(static_cast(pref->getDynDNSService())); - m_ui->domainNameTxt->setText(pref->getDynDomainName()); - m_ui->DNSUsernameTxt->setText(pref->getDynDNSUsername()); - m_ui->DNSPasswordTxt->setText(pref->getDynDNSPassword()); - - m_ui->groupAltWebUI->setChecked(pref->isAltWebUiEnabled()); - m_ui->textWebUIRootFolder->setSelectedPath(pref->getWebUiRootFolder()); - // End Web UI preferences -} - -// return min & max ports -// [min, max] -int OptionsDialog::getPort() const -{ - return m_ui->spinPort->value(); -} - -void OptionsDialog::on_randomButton_clicked() -{ - // Range [1024: 65535] - m_ui->spinPort->setValue(Utils::Random::rand(1024, 65535)); -} - -int OptionsDialog::getEncryptionSetting() const -{ - return m_ui->comboEncryption->currentIndex(); -} - -int OptionsDialog::getMaxActiveDownloads() const -{ - return m_ui->spinMaxActiveDownloads->value(); -} - -int OptionsDialog::getMaxActiveUploads() const -{ - return m_ui->spinMaxActiveUploads->value(); -} - -int OptionsDialog::getMaxActiveTorrents() const -{ - return m_ui->spinMaxActiveTorrents->value(); -} - -bool OptionsDialog::isQueueingSystemEnabled() const -{ - return m_ui->checkEnableQueueing->isChecked(); -} - -bool OptionsDialog::isDHTEnabled() const -{ - return m_ui->checkDHT->isChecked(); -} - -bool OptionsDialog::isLSDEnabled() const -{ - return m_ui->checkLSD->isChecked(); -} - -bool OptionsDialog::isUPnPEnabled() const -{ - return m_ui->checkUPnP->isChecked(); -} - -// Return Download & Upload limits in kbps -// [download,upload] -QPair OptionsDialog::getGlobalBandwidthLimits() const -{ - int DL = 0, UP = 0; - if (m_ui->checkDownloadLimit->isChecked()) - DL = m_ui->spinDownloadLimit->value() * 1024; - if (m_ui->checkUploadLimit->isChecked()) - UP = m_ui->spinUploadLimit->value() * 1024; - return qMakePair(DL, UP); -} - -// Return alternate Download & Upload limits in kbps -// [download,upload] -QPair OptionsDialog::getAltGlobalBandwidthLimits() const -{ - int DL = 0, UP = 0; - if (m_ui->checkDownloadLimitAlt->isChecked()) - DL = m_ui->spinDownloadLimitAlt->value() * 1024; - if (m_ui->checkUploadLimitAlt->isChecked()) - UP = m_ui->spinUploadLimitAlt->value() * 1024; - return qMakePair(DL, UP); -} - -bool OptionsDialog::startMinimized() const -{ - return m_ui->checkStartMinimized->isChecked(); -} - -#ifndef Q_OS_MAC -bool OptionsDialog::systrayIntegration() const -{ - if (!QSystemTrayIcon::isSystemTrayAvailable()) return false; - return m_ui->checkShowSystray->isChecked(); -} - -bool OptionsDialog::minimizeToTray() const -{ - if (!m_ui->checkShowSystray->isChecked()) return false; - return m_ui->checkMinimizeToSysTray->isChecked(); -} - -bool OptionsDialog::closeToTray() const -{ - if (!m_ui->checkShowSystray->isChecked()) return false; - return m_ui->checkCloseToSystray->isChecked(); -} -#endif // Q_OS_MAC - -// Return Share ratio -qreal OptionsDialog::getMaxRatio() const -{ - if (m_ui->checkMaxRatio->isChecked()) - return m_ui->spinMaxRatio->value(); - return -1; -} - -// Return Seeding Minutes -int OptionsDialog::getMaxSeedingMinutes() const -{ - if (m_ui->checkMaxSeedingMinutes->isChecked()) - return m_ui->spinMaxSeedingMinutes->value(); - return -1; -} - -// Return max connections number -int OptionsDialog::getMaxConnecs() const -{ - if (!m_ui->checkMaxConnecs->isChecked()) - return -1; - else - return m_ui->spinMaxConnec->value(); -} - -int OptionsDialog::getMaxConnecsPerTorrent() const -{ - if (!m_ui->checkMaxConnecsPerTorrent->isChecked()) - return -1; - else - return m_ui->spinMaxConnecPerTorrent->value(); -} - -int OptionsDialog::getMaxUploads() const -{ - if (!m_ui->checkMaxUploads->isChecked()) - return -1; - else - return m_ui->spinMaxUploads->value(); -} - -int OptionsDialog::getMaxUploadsPerTorrent() const -{ - if (!m_ui->checkMaxUploadsPerTorrent->isChecked()) - return -1; - else - return m_ui->spinMaxUploadsPerTorrent->value(); -} - -void OptionsDialog::on_buttonBox_accepted() -{ - if (applyButton->isEnabled()) { - if (!schedTimesOk()) { - m_ui->tabSelection->setCurrentRow(TAB_SPEED); - return; - } - if (!webUIAuthenticationOk()) { - m_ui->tabSelection->setCurrentRow(TAB_WEBUI); - return; - } - applyButton->setEnabled(false); - this->hide(); - saveOptions(); - } - - accept(); -} - -void OptionsDialog::applySettings(QAbstractButton *button) -{ - if (button == applyButton) { - if (!schedTimesOk()) { - m_ui->tabSelection->setCurrentRow(TAB_SPEED); - return; - } - if (!webUIAuthenticationOk()) { - m_ui->tabSelection->setCurrentRow(TAB_WEBUI); - return; - } - saveOptions(); - } -} - -void OptionsDialog::closeEvent(QCloseEvent *e) -{ - setAttribute(Qt::WA_DeleteOnClose); - e->accept(); -} - -void OptionsDialog::on_buttonBox_rejected() -{ - setAttribute(Qt::WA_DeleteOnClose); - reject(); -} - -bool OptionsDialog::useAdditionDialog() const -{ - return m_ui->checkAdditionDialog->isChecked(); -} - -void OptionsDialog::enableApplyButton() -{ - applyButton->setEnabled(true); -} - -void OptionsDialog::toggleComboRatioLimitAct() -{ - // Verify if the share action button must be enabled - m_ui->comboRatioLimitAct->setEnabled(m_ui->checkMaxRatio->isChecked() || m_ui->checkMaxSeedingMinutes->isChecked()); -} - -void OptionsDialog::enableForceProxy(bool enable) -{ - m_ui->checkUPnP->setEnabled(!enable); - m_ui->checkLSD->setEnabled(!enable); -} - -void OptionsDialog::enableProxy(int index) -{ - if (index) { - //enable - m_ui->lblProxyIP->setEnabled(true); - m_ui->textProxyIP->setEnabled(true); - m_ui->lblProxyPort->setEnabled(true); - m_ui->spinProxyPort->setEnabled(true); - m_ui->checkProxyPeerConnecs->setEnabled(true); - m_ui->checkForceProxy->setEnabled(true); - if (index > 1) { - m_ui->checkProxyAuth->setEnabled(true); - m_ui->isProxyOnlyForTorrents->setEnabled(true); - } - else { - m_ui->checkProxyAuth->setEnabled(false); - m_ui->checkProxyAuth->setChecked(false); - m_ui->isProxyOnlyForTorrents->setEnabled(false); - m_ui->isProxyOnlyForTorrents->setChecked(true); - } - enableForceProxy(m_ui->checkForceProxy->isChecked()); - } - else { - //disable - m_ui->lblProxyIP->setEnabled(false); - m_ui->textProxyIP->setEnabled(false); - m_ui->lblProxyPort->setEnabled(false); - m_ui->spinProxyPort->setEnabled(false); - m_ui->checkProxyPeerConnecs->setEnabled(false); - m_ui->checkForceProxy->setEnabled(false); - m_ui->isProxyOnlyForTorrents->setEnabled(false); - m_ui->checkProxyAuth->setEnabled(false); - m_ui->checkProxyAuth->setChecked(false); - enableForceProxy(false); - } -} - -bool OptionsDialog::isSplashScreenDisabled() const -{ - return !m_ui->checkShowSplash->isChecked(); -} - -#ifdef Q_OS_WIN -bool OptionsDialog::WinStartup() const -{ - return m_ui->checkStartup->isChecked(); -} -#endif - -bool OptionsDialog::preAllocateAllFiles() const -{ - return m_ui->checkPreallocateAll->isChecked(); -} - -bool OptionsDialog::addTorrentsInPause() const -{ - return m_ui->checkStartPaused->isChecked(); -} - -// Proxy settings -bool OptionsDialog::isProxyEnabled() const -{ - return m_ui->comboProxyType->currentIndex(); -} - -bool OptionsDialog::isProxyAuthEnabled() const -{ - return m_ui->checkProxyAuth->isChecked(); -} - -QString OptionsDialog::getProxyIp() const -{ - return m_ui->textProxyIP->text().trimmed(); -} - -unsigned short OptionsDialog::getProxyPort() const -{ - return m_ui->spinProxyPort->value(); -} - -QString OptionsDialog::getProxyUsername() const -{ - QString username = m_ui->textProxyUsername->text().trimmed(); - return username; -} - -QString OptionsDialog::getProxyPassword() const -{ - QString password = m_ui->textProxyPassword->text(); - password = password.trimmed(); - return password; -} - -// Locale Settings -QString OptionsDialog::getLocale() const -{ - return m_ui->comboI18n->itemData(m_ui->comboI18n->currentIndex(), Qt::UserRole).toString(); -} - -void OptionsDialog::setLocale(const QString &localeStr) -{ - QString name; - if (localeStr.startsWith("eo", Qt::CaseInsensitive)) { - name = "eo"; - } - else { - QLocale locale(localeStr); - if (locale.language() == QLocale::Uzbek) - name = "uz@Latn"; - else - name = locale.name(); - } - // Attempt to find exact match - int index = m_ui->comboI18n->findData(name, Qt::UserRole); - if (index < 0) { - //Attempt to find a language match without a country - int pos = name.indexOf('_'); - if (pos > -1) { - QString lang = name.left(pos); - index = m_ui->comboI18n->findData(lang, Qt::UserRole); - } - } - if (index < 0) { - // Unrecognized, use US English - index = m_ui->comboI18n->findData("en", Qt::UserRole); - Q_ASSERT(index >= 0); - } - m_ui->comboI18n->setCurrentIndex(index); -} - -QString OptionsDialog::getTorrentExportDir() const -{ - if (m_ui->checkExportDir->isChecked()) - return Utils::Fs::expandPathAbs(m_ui->textExportDir->selectedPath()); - return QString(); -} - -QString OptionsDialog::getFinishedTorrentExportDir() const -{ - if (m_ui->checkExportDirFin->isChecked()) - return Utils::Fs::expandPathAbs(m_ui->textExportDirFin->selectedPath()); - return QString(); -} - -// Return action on double-click on a downloading torrent set in options -int OptionsDialog::getActionOnDblClOnTorrentDl() const -{ - if (m_ui->actionTorrentDlOnDblClBox->currentIndex() < 1) - return 0; - return m_ui->actionTorrentDlOnDblClBox->currentIndex(); -} - -// Return action on double-click on a finished torrent set in options -int OptionsDialog::getActionOnDblClOnTorrentFn() const -{ - if (m_ui->actionTorrentFnOnDblClBox->currentIndex() < 1) - return 0; - return m_ui->actionTorrentFnOnDblClBox->currentIndex(); -} - -void OptionsDialog::on_addScanFolderButton_clicked() -{ - Preferences *const pref = Preferences::instance(); - const QString dir = QFileDialog::getExistingDirectory(this, tr("Select folder to monitor"), - Utils::Fs::toNativePath(Utils::Fs::folderName(pref->getScanDirsLastPath()))); - if (!dir.isEmpty()) { - const ScanFoldersModel::PathStatus status = ScanFoldersModel::instance()->addPath(dir, ScanFoldersModel::DEFAULT_LOCATION, QString(), false); - QString error; - switch (status) { - case ScanFoldersModel::AlreadyInList: - error = tr("Folder is already being monitored:"); - break; - case ScanFoldersModel::DoesNotExist: - error = tr("Folder does not exist:"); - break; - case ScanFoldersModel::CannotRead: - error = tr("Folder is not readable:"); - break; - default: - pref->setScanDirsLastPath(dir); - addedScanDirs << dir; - for (int i = 0; i < ScanFoldersModel::instance()->columnCount(); ++i) - m_ui->scanFoldersView->resizeColumnToContents(i); - enableApplyButton(); - } - - if (!error.isEmpty()) - QMessageBox::critical(this, tr("Adding entry failed"), QString("%1\n%2").arg(error, dir)); - } -} - -void OptionsDialog::on_removeScanFolderButton_clicked() -{ - const QModelIndexList selected - = m_ui->scanFoldersView->selectionModel()->selectedIndexes(); - if (selected.isEmpty()) - return; - Q_ASSERT(selected.count() == ScanFoldersModel::instance()->columnCount()); - foreach (const QModelIndex &index, selected) { - if (index.column() == ScanFoldersModel::WATCH) - removedScanDirs << index.data().toString(); - } - ScanFoldersModel::instance()->removePath(selected.first().row(), false); -} - -void OptionsDialog::handleScanFolderViewSelectionChanged() -{ - m_ui->removeScanFolderButton->setEnabled(!m_ui->scanFoldersView->selectionModel()->selectedIndexes().isEmpty()); -} - -QString OptionsDialog::askForExportDir(const QString ¤tExportPath) -{ - QDir currentExportDir(Utils::Fs::expandPathAbs(currentExportPath)); - QString dir; - if (!currentExportPath.isEmpty() && currentExportDir.exists()) - dir = QFileDialog::getExistingDirectory(this, tr("Choose export directory"), currentExportDir.absolutePath()); - else - dir = QFileDialog::getExistingDirectory(this, tr("Choose export directory"), QDir::homePath()); - return dir; -} - -// Return Filter object to apply to BT session -QString OptionsDialog::getFilter() const -{ - return m_ui->textFilterPath->selectedPath(); -} - -// Web UI - -bool OptionsDialog::isWebUiEnabled() const -{ - return m_ui->checkWebUi->isChecked(); -} - -QString OptionsDialog::webUiUsername() const -{ - return m_ui->textWebUiUsername->text(); -} - -QString OptionsDialog::webUiPassword() const -{ - return m_ui->textWebUiPassword->text(); -} - -void OptionsDialog::showConnectionTab() -{ - m_ui->tabSelection->setCurrentRow(TAB_CONNECTION); -} - -void OptionsDialog::on_btnWebUiCrt_clicked() -{ - const QString filename = QFileDialog::getOpenFileName(this, tr("Import SSL certificate"), QString(), tr("SSL Certificate") + QLatin1String(" (*.crt *.pem)")); - if (filename.isEmpty()) - return; - - QFile cert(filename); - if (!cert.open(QIODevice::ReadOnly)) - return; - - bool success = setSslCertificate(cert.read(1024 * 1024)); - if (!success) - QMessageBox::warning(this, tr("Invalid certificate"), tr("This is not a valid SSL certificate.")); -} - -void OptionsDialog::on_btnWebUiKey_clicked() -{ - const QString filename = QFileDialog::getOpenFileName(this, tr("Import SSL key"), QString(), tr("SSL key") + QLatin1String(" (*.key *.pem)")); - if (filename.isEmpty()) - return; - - QFile key(filename); - if (!key.open(QIODevice::ReadOnly)) - return; - - bool success = setSslKey(key.read(1024 * 1024)); - if (!success) - QMessageBox::warning(this, tr("Invalid key"), tr("This is not a valid SSL key.")); -} - -void OptionsDialog::on_registerDNSBtn_clicked() -{ - QDesktopServices::openUrl(Net::DNSUpdater::getRegistrationUrl(m_ui->comboDNSService->currentIndex())); -} - -void OptionsDialog::on_IpFilterRefreshBtn_clicked() -{ - if (m_refreshingIpFilter) return; - m_refreshingIpFilter = true; - // Updating program preferences - BitTorrent::Session *const session = BitTorrent::Session::instance(); - session->setIPFilteringEnabled(true); - session->setIPFilterFile(""); // forcing Session reload filter file - session->setIPFilterFile(getFilter()); - connect(session, &BitTorrent::Session::IPFilterParsed, this, &OptionsDialog::handleIPFilterParsed); - setCursor(QCursor(Qt::WaitCursor)); -} - -void OptionsDialog::handleIPFilterParsed(bool error, int ruleCount) -{ - setCursor(QCursor(Qt::ArrowCursor)); - if (error) - QMessageBox::warning(this, tr("Parsing error"), tr("Failed to parse the provided IP filter")); - else - QMessageBox::information(this, tr("Successfully refreshed"), tr("Successfully parsed the provided IP filter: %1 rules were applied.", "%1 is a number").arg(ruleCount)); - m_refreshingIpFilter = false; - disconnect(BitTorrent::Session::instance(), &BitTorrent::Session::IPFilterParsed, this, &OptionsDialog::handleIPFilterParsed); -} - -QString OptionsDialog::languageToLocalizedString(const QLocale &locale) -{ - switch (locale.language()) { - case QLocale::English: { - if (locale.country() == QLocale::Australia) - return QString::fromUtf8(C_LOCALE_ENGLISH_AUSTRALIA); - else if (locale.country() == QLocale::UnitedKingdom) - return QString::fromUtf8(C_LOCALE_ENGLISH_UNITEDKINGDOM); - return QString::fromUtf8(C_LOCALE_ENGLISH); - } - case QLocale::French: return QString::fromUtf8(C_LOCALE_FRENCH); - case QLocale::German: return QString::fromUtf8(C_LOCALE_GERMAN); - case QLocale::Hungarian: return QString::fromUtf8(C_LOCALE_HUNGARIAN); - case QLocale::Icelandic: return QString::fromUtf8(C_LOCALE_ICELANDIC); - case QLocale::Indonesian: return QString::fromUtf8(C_LOCALE_INDONESIAN); - case QLocale::Italian: return QString::fromUtf8(C_LOCALE_ITALIAN); - case QLocale::Dutch: return QString::fromUtf8(C_LOCALE_DUTCH); - case QLocale::Spanish: return QString::fromUtf8(C_LOCALE_SPANISH); - case QLocale::Catalan: return QString::fromUtf8(C_LOCALE_CATALAN); - case QLocale::Galician: return QString::fromUtf8(C_LOCALE_GALICIAN); - case QLocale::Occitan: return QString::fromUtf8(C_LOCALE_OCCITAN); - case QLocale::Portuguese: { - if (locale.country() == QLocale::Brazil) - return QString::fromUtf8(C_LOCALE_PORTUGUESE_BRAZIL); - return QString::fromUtf8(C_LOCALE_PORTUGUESE); - } - case QLocale::Polish: return QString::fromUtf8(C_LOCALE_POLISH); - case QLocale::Latvian: return QString::fromUtf8(C_LOCALE_LATVIAN); - case QLocale::Lithuanian: return QString::fromUtf8(C_LOCALE_LITHUANIAN); - case QLocale::Malay: return QString::fromUtf8(C_LOCALE_MALAY); - case QLocale::Czech: return QString::fromUtf8(C_LOCALE_CZECH); - case QLocale::Slovak: return QString::fromUtf8(C_LOCALE_SLOVAK); - case QLocale::Slovenian: return QString::fromUtf8(C_LOCALE_SLOVENIAN); - case QLocale::Serbian: return QString::fromUtf8(C_LOCALE_SERBIAN); - case QLocale::Croatian: return QString::fromUtf8(C_LOCALE_CROATIAN); - case QLocale::Armenian: return QString::fromUtf8(C_LOCALE_ARMENIAN); - case QLocale::Romanian: return QString::fromUtf8(C_LOCALE_ROMANIAN); - case QLocale::Turkish: return QString::fromUtf8(C_LOCALE_TURKISH); - case QLocale::Greek: return QString::fromUtf8(C_LOCALE_GREEK); - case QLocale::Swedish: return QString::fromUtf8(C_LOCALE_SWEDISH); - case QLocale::Finnish: return QString::fromUtf8(C_LOCALE_FINNISH); - case QLocale::Norwegian: return QString::fromUtf8(C_LOCALE_NORWEGIAN); - case QLocale::Danish: return QString::fromUtf8(C_LOCALE_DANISH); - case QLocale::Bulgarian: return QString::fromUtf8(C_LOCALE_BULGARIAN); - case QLocale::Ukrainian: return QString::fromUtf8(C_LOCALE_UKRAINIAN); - case QLocale::Uzbek: return QString::fromUtf8(C_LOCALE_UZBEK); - case QLocale::Russian: return QString::fromUtf8(C_LOCALE_RUSSIAN); - case QLocale::Japanese: return QString::fromUtf8(C_LOCALE_JAPANESE); - case QLocale::Hebrew: return QString::fromUtf8(C_LOCALE_HEBREW); - case QLocale::Hindi: return QString::fromUtf8(C_LOCALE_HINDI); - case QLocale::Arabic: return QString::fromUtf8(C_LOCALE_ARABIC); - case QLocale::Georgian: return QString::fromUtf8(C_LOCALE_GEORGIAN); - case QLocale::Byelorussian: return QString::fromUtf8(C_LOCALE_BYELORUSSIAN); - case QLocale::Basque: return QString::fromUtf8(C_LOCALE_BASQUE); - case QLocale::Vietnamese: return QString::fromUtf8(C_LOCALE_VIETNAMESE); - case QLocale::Chinese: { - switch (locale.country()) { - case QLocale::China: - return QString::fromUtf8(C_LOCALE_CHINESE_SIMPLIFIED); - case QLocale::HongKong: - return QString::fromUtf8(C_LOCALE_CHINESE_TRADITIONAL_HK); - default: - return QString::fromUtf8(C_LOCALE_CHINESE_TRADITIONAL_TW); - } - } - case QLocale::Korean: return QString::fromUtf8(C_LOCALE_KOREAN); - default: { - // Fallback to English - const QString engLang = QLocale::languageToString(locale.language()); - qWarning() << "Unrecognized language name: " << engLang; - return engLang; - } - } -} - -bool OptionsDialog::setSslKey(const QByteArray &key) -{ -#ifndef QT_NO_OPENSSL - // try different formats - const bool isKeyValid = (!QSslKey(key, QSsl::Rsa).isNull() || !QSslKey(key, QSsl::Ec).isNull()); - if (isKeyValid) { - m_ui->lblSslKeyStatus->setPixmap(Utils::Gui::scaledPixmapSvg(":/icons/qbt-theme/security-high.svg", this, 24)); - m_sslKey = key; - } - else { - m_ui->lblSslKeyStatus->setPixmap(Utils::Gui::scaledPixmapSvg(":/icons/qbt-theme/security-low.svg", this, 24)); - m_sslKey.clear(); - } - return isKeyValid; -#else - Q_UNUSED(key); - return false; -#endif -} - -bool OptionsDialog::setSslCertificate(const QByteArray &cert) -{ -#ifndef QT_NO_OPENSSL - const bool isCertValid = !QSslCertificate(cert).isNull(); - if (isCertValid) { - m_ui->lblSslCertStatus->setPixmap(Utils::Gui::scaledPixmapSvg(":/icons/qbt-theme/security-high.svg", this, 24)); - m_sslCert = cert; - } - else { - m_ui->lblSslCertStatus->setPixmap(Utils::Gui::scaledPixmapSvg(":/icons/qbt-theme/security-low.svg", this, 24)); - m_sslCert.clear(); - } - return isCertValid; -#else - Q_UNUSED(cert); - return false; -#endif -} - -bool OptionsDialog::schedTimesOk() -{ - if (m_ui->timeEditScheduleFrom->time() == m_ui->timeEditScheduleTo->time()) { - QMessageBox::warning(this, tr("Time Error"), tr("The start time and the end time can't be the same.")); - return false; - } - return true; -} - -bool OptionsDialog::webUIAuthenticationOk() -{ - if (webUiUsername().length() < 3) { - QMessageBox::warning(this, tr("Length Error"), tr("The Web UI username must be at least 3 characters long.")); - return false; - } - if (webUiPassword().length() < 6) { - QMessageBox::warning(this, tr("Length Error"), tr("The Web UI password must be at least 6 characters long.")); - return false; - } - return true; -} - -void OptionsDialog::on_banListButton_clicked() -{ - // call dialog window - if (BanListOptionsDialog(this).exec() == QDialog::Accepted) - enableApplyButton(); -} - -void OptionsDialog::on_IPSubnetWhitelistButton_clicked() -{ - // call dialog window - if (IPSubnetWhitelistOptionsDialog(this).exec() == QDialog::Accepted) - enableApplyButton(); -} diff -Nru qbittorrent-4.1.3/src/gui/optionsdialog.h qbittorrent-3.3.15/src/gui/optionsdialog.h --- qbittorrent-4.1.3/src/gui/optionsdialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/optionsdialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,188 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef OPTIONSDIALOG_H -#define OPTIONSDIALOG_H - -#include -#include - -class QAbstractButton; -class QCloseEvent; -class QListWidgetItem; -class AdvancedSettings; - -// actions on double-click on torrents -enum DoubleClickAction -{ - TOGGLE_PAUSE, - OPEN_DEST, - NO_ACTION -}; - -namespace Net -{ - enum class ProxyType; -} - -namespace Ui -{ - class OptionsDialog; -} - -class OptionsDialog : public QDialog -{ - Q_OBJECT - using ThisType = OptionsDialog; - -private: - enum Tabs - { - TAB_UI, - TAB_DOWNLOADS, - TAB_CONNECTION, - TAB_SPEED, - TAB_BITTORRENT, - TAB_RSS, - TAB_WEBUI, - TAB_ADVANCED - }; - -public: - // Constructor / Destructor - OptionsDialog(QWidget *parent = nullptr); - ~OptionsDialog(); - -public slots: - void showConnectionTab(); - -private slots: - void enableForceProxy(bool enable); - void enableProxy(int index); - void on_buttonBox_accepted(); - void closeEvent(QCloseEvent *e) override; - void on_buttonBox_rejected(); - void applySettings(QAbstractButton *button); - void enableApplyButton(); - void toggleComboRatioLimitAct(); - void changePage(QListWidgetItem *, QListWidgetItem *); - void loadWindowState(); - void loadSplitterState(); - void saveWindowState() const; - void handleScanFolderViewSelectionChanged(); - void on_IpFilterRefreshBtn_clicked(); - void handleIPFilterParsed(bool error, int ruleCount); - void on_banListButton_clicked(); - void on_IPSubnetWhitelistButton_clicked(); - void on_randomButton_clicked(); - void on_addScanFolderButton_clicked(); - void on_removeScanFolderButton_clicked(); - void on_btnWebUiCrt_clicked(); - void on_btnWebUiKey_clicked(); - void on_registerDNSBtn_clicked(); - void setLocale(const QString &localeStr); - -private: - // Methods - void saveOptions(); - void loadOptions(); - void initializeLanguageCombo(); - static QString languageToLocalizedString(const QLocale &locale); - // General options - QString getLocale() const; -#ifndef Q_OS_MAC - bool systrayIntegration() const; - bool minimizeToTray() const; - bool closeToTray() const; -#endif - bool startMinimized() const; - bool isSplashScreenDisabled() const; -#ifdef Q_OS_WIN - bool WinStartup() const; -#endif - // Downloads - bool preAllocateAllFiles() const; - bool useAdditionDialog() const; - bool addTorrentsInPause() const; - QString getTorrentExportDir() const; - QString getFinishedTorrentExportDir() const; - QString askForExportDir(const QString ¤tExportPath); - int getActionOnDblClOnTorrentDl() const; - int getActionOnDblClOnTorrentFn() const; - // Connection options - int getPort() const; - bool isUPnPEnabled() const; - QPair getGlobalBandwidthLimits() const; - QPair getAltGlobalBandwidthLimits() const; - // Bittorrent options - int getMaxConnecs() const; - int getMaxConnecsPerTorrent() const; - int getMaxUploads() const; - int getMaxUploadsPerTorrent() const; - bool isDHTEnabled() const; - bool isLSDEnabled() const; - int getEncryptionSetting() const; - qreal getMaxRatio() const; - int getMaxSeedingMinutes() const; - // Proxy options - bool isProxyEnabled() const; - bool isProxyAuthEnabled() const; - QString getProxyIp() const; - unsigned short getProxyPort() const; - QString getProxyUsername() const; - QString getProxyPassword() const; - Net::ProxyType getProxyType() const; - // IP Filter - bool isIPFilteringEnabled() const; - QString getFilter() const; - bool m_refreshingIpFilter; - // Queueing system - bool isQueueingSystemEnabled() const; - int getMaxActiveDownloads() const; - int getMaxActiveUploads() const; - int getMaxActiveTorrents() const; - bool isWebUiEnabled() const; - QString webUiUsername() const; - QString webUiPassword() const; - // WebUI SSL Cert / key - bool setSslKey(const QByteArray &key); - bool setSslCertificate(const QByteArray &cert); - bool schedTimesOk(); - bool webUIAuthenticationOk(); - - QByteArray m_sslCert, m_sslKey; - - Ui::OptionsDialog *m_ui; - QButtonGroup choiceLanguage; - QAbstractButton *applyButton; - AdvancedSettings *advancedSettings; - QList addedScanDirs; - QList removedScanDirs; -}; - -#endif // OPTIONSDIALOG_H diff -Nru qbittorrent-4.1.3/src/gui/optionsdialog.ui qbittorrent-3.3.15/src/gui/optionsdialog.ui --- qbittorrent-4.1.3/src/gui/optionsdialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/optionsdialog.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,3658 +0,0 @@ - - - OptionsDialog - - - - 0 - 0 - 779 - 591 - - - - Options - - - - - - Qt::Horizontal - - - false - - - - Qt::LeftToRight - - - Qt::ScrollBarAlwaysOff - - - QListView::Static - - - QListView::TopToBottom - - - false - - - QListView::Adjust - - - QListView::IconMode - - - -1 - - - - Behavior - - - - - Downloads - - - - - Connection - - - - - Speed - - - - - BitTorrent - - - - - RSS - - - - - Web UI - - - - - Advanced - - - - - - 0 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - true - - - - - 0 - 0 - 501 - 893 - - - - - - - Language - - - - - - - - User Interface Language: - - - - - - - - 0 - 0 - - - - QComboBox::AdjustToContents - - - 0 - - - - - - - - true - - - - (Requires restart) - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - Transfer List - - - - - - Confirm when deleting torrents - - - true - - - - - - - Use alternating row colors - - - true - - - - - - - - - Hide zero and infinity values - - - - - - - - Always - - - - - Paused torrents only - - - - - - - - Qt::Horizontal - - - - 0 - 0 - - - - - - - - - - - 50 - false - - - - Action on double-click - - - true - - - - - - Downloading torrents: - - - - - - - - 0 - 0 - - - - 0 - - - - Start / Stop Torrent - - - - - Open destination folder - - - - - No action - - - - - - - - Completed torrents: - - - - - - - - Start / Stop Torrent - - - - - Open destination folder - - - - - No action - - - - - - - - - - - - - - Desktop - - - - - - Start qBittorrent on Windows start up - - - - - - - Show splash screen on start up - - - true - - - - - - - Start qBittorrent minimized - - - - - - - Confirmation on exit when torrents are active - - - true - - - - - - - Confirmation on auto-exit when downloads finish - - - true - - - - - - - Show &qBittorrent in notification area - - - true - - - - - - Minimize qBittorrent to notification area - - - false - - - - - - - Close qBittorrent to notification area - - - - - - - - - Tray icon style: - - - - - - - - Normal - - - - - Monochrome (Dark theme) - - - - - Monochrome (Light theme) - - - - - - - - - - - - - File association - - - - - - Use qBittorrent for .torrent files - - - - - - - Use qBittorrent for magnet links - - - - - - - - - - - - - Power Management - - - - - - Inhibit system sleep when torrents are downloading - - - - - - - Inhibit system sleep when torrents are seeding - - - - - - - - - - &Log file - - - true - - - true - - - - - - - - - 0 - 0 - - - - Save path: - - - - - - - - - - - - 0 - - - - - Backup the log file after: - - - - - - - KiB - - - 1 - - - 1024000 - - - 65 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - 0 - - - - - Delete backup logs older than: - - - - - - - 1 - - - 365 - - - 6 - - - - - - - 1 - - - - days - - - - - months - - - - - years - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - true - - - - - 0 - 0 - 591 - 1138 - - - - - - - When adding a torrent - - - - - - Display &torrent content and some options - - - true - - - - 0 - - - - - Bring torrent dialog to the front - - - true - - - - - - - - - - Create subfolder for torrents with multiple files - - - true - - - - - - - Do not start the download automatically - - - - - - - Should the .torrent file be deleted after adding it - - - De&lete .torrent files afterwards - - - true - - - false - - - - - - Also delete .torrent files whose addition was cancelled - - - Also when addition is cancelled - - - - - - - - - - 0 - 0 - - - - <> - - - - - - - Warning! Data loss possible! - - - - - - - - - - - - - - - Pre-allocate disk space for all files - - - - - - - Append .!qB extension to incomplete files - - - - - - - Enable recursive download dialog - - - - - - - Saving Management - - - - - - - - Default Torrent Management Mode: - - - - - - - 10 - - - - - Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - - - - Manual - - - - - Automatic - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - When Torrent Category changed: - - - - - - - - - - Relocate torrent - - - - - Switch torrent to Manual Mode - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - When Default Save Path changed: - - - - - - - - - 1 - - - - Relocate affected torrents - - - - - Switch affected torrents to Manual Mode - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - When Category changed: - - - - - - - - - 1 - - - - Relocate affected torrents - - - - - Switch affected torrents to Manual Mode - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - Use Subcategories - - - - - - - - - - - - Copy .torrent files for finished downloads to: - - - - - - - Default Save Path: - - - - - - - Copy .torrent files to: - - - - - - - Keep incomplete torrents in: - - - - - - - - - - - - - - - - - - - - - Automatically add torrents from: - - - - - - - - - 0 - 1 - - - - - 250 - 150 - - - - QAbstractItemView::AllEditTriggers - - - QAbstractItemView::SingleSelection - - - QAbstractItemView::SelectRows - - - Qt::ElideNone - - - false - - - 80 - - - false - - - - - - - - - Add entry - - - - - - - false - - - Remove entry - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - - Email notification &upon download completion - - - true - - - false - - - - - - - - - - - To: - - - - - - - SMTP server: - - - - - - - - - - - - - From: - - - - - - - - - This server requires a secure connection (SSL) - - - - - - - Authentication - - - true - - - false - - - - - - Username: - - - - - - - - - - Password: - - - - - - - QLineEdit::Password - - - - - - - - - - - - - Run e&xternal program on torrent completion - - - true - - - false - - - - - - - - - true - - - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - true - - - - - 0 - 0 - 501 - 745 - - - - - - - - - - 0 - 0 - - - - Enabled protocol: - - - - - - - - TCP and μTP - - - - - TCP - - - - - μTP - - - - - - - - - - Listening Port - - - - - - - - Port used for incoming connections: - - - - - - - 1 - - - 65535 - - - 8999 - - - - - - - Random - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Use UPnP / NAT-PMP port forwarding from my router - - - true - - - - - - - Use different port on each startup - - - - - - - - - - Connections Limits - - - - - - 500 - - - 4 - - - - - - - Maximum number of connections per torrent: - - - true - - - - - - - Global maximum number of connections: - - - true - - - - - - - true - - - 2 - - - 2000 - - - 500 - - - - - - - 2 - - - 2000 - - - 100 - - - - - - - Maximum number of upload slots per torrent: - - - false - - - - - - - Global maximum number of upload slots: - - - false - - - - - - - 2000 - - - 8 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - true - - - Proxy Server - - - - - - - - Type: - - - - - - - - (None) - - - - - SOCKS4 - - - - - SOCKS5 - - - - - HTTP - - - - - - - - false - - - Host: - - - - - - - false - - - - - - - - - - false - - - Port: - - - - - - - false - - - 1 - - - 65535 - - - 8080 - - - - - - - - - false - - - Otherwise, the proxy server is only used for tracker connections - - - Use proxy for peer connections - - - - - - - - - Disable connections not supported by proxies - - - true - - - - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - - - true - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - - - Use proxy only for torrents - - - false - - - - - - - false - - - A&uthentication - - - true - - - false - - - - - - - - Username: - - - - - - - - - - Password: - - - - - - - QLineEdit::Password - - - - - - - - - Info: The password is saved unencrypted - - - - - - - - - - - - - IP Fi&ltering - - - - - - - - Filter path (.dat, .p2p, .p2b): - - - - - - - - - - - 0 - 25 - - - - Reload the filter - - - - - - - - - - 0 - 0 - - - - Manually banned IP addresses... - - - - - - - Apply to trackers - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - true - - - - - 0 - 0 - 516 - 525 - - - - - - - Global Rate Limits - - - - - - false - - - KiB/s - - - 1 - - - 1000000 - - - 100 - - - - - - - Upload: - - - - - - - false - - - KiB/s - - - 1 - - - 1000000 - - - 100 - - - - - - - - - - Download: - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - Alternative Rate Limits - - - - - - - - - Schedule &the use of alternative rate limits - - - true - - - false - - - - - - From: - - - - - - - true - - - hh:mm - - - - - - - - - - To: - - - - - - - true - - - hh:mm - - - false - - - - - - - - - - When: - - - - - - - - 0 - 0 - - - - - Every day - - - - - Weekdays - - - - - Weekends - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - Upload: - - - - - - - Download: - - - - - - - false - - - KiB/s - - - 1 - - - 1000000 - - - 10 - - - - - - - false - - - KiB/s - - - 1 - - - 1000000 - - - 10 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - Rate Limits Settings - - - - - - Apply rate limit to µTP protocol - - - - - - - Apply rate limit to transport overhead - - - - - - - Apply rate limit to peers on LAN - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - true - - - - - 0 - 0 - 513 - 679 - - - - - - - Privacy - - - - - - Enable DHT (decentralized network) to find more peers - - - true - - - - - - - Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - - - Enable Peer Exchange (PeX) to find more peers - - - true - - - - - - - Look for peers on your local network - - - Enable Local Peer Discovery to find more peers - - - true - - - - - - - - - Encryption mode: - - - - - - - - Prefer encryption - - - - - Require encryption - - - - - Disable encryption - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - Enable when using a proxy or a VPN connection - - - Enable anonymous mode - - - - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - - true - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - &Torrent Queueing - - - true - - - false - - - - 9 - - - - - Maximum active downloads: - - - - - - - -1 - - - 999 - - - 3 - - - - - - - Maximum active uploads: - - - - - - - -1 - - - 999 - - - 3 - - - - - - - Maximum active torrents: - - - - - - - -1 - - - 999 - - - 5 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Do not count slow torrents in these limits - - - true - - - false - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - KiB/s - - - 2000000 - - - 2 - - - - - - - KiB/s - - - 2000000 - - - 2 - - - - - - - Upload rate threshold: - - - - - - - Download rate threshold: - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - sec - - - 1 - - - 999999 - - - 60 - - - - - - - Torrent inactivity timer: - - - - - - - - - - - - - Share Ratio Limiting - - - - - - Seed torrents until their ratio reaches - - - - - - - Qt::Horizontal - - - - 109 - 20 - - - - - - - - then - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Qt::Horizontal - - - - 121 - 28 - - - - - - - - Qt::Horizontal - - - - 100 - 42 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - false - - - Qt::AlignCenter - - - min - - - 9999999 - - - 1440 - - - - - - - false - - - Qt::AlignHCenter - - - 0.000000000000000 - - - 9998.000000000000000 - - - 0.050000000000000 - - - 1.000000000000000 - - - - - - - Seed torrents until their seeding time reaches - - - - - - - false - - - - Pause them - - - - - Remove them - - - - - - - - - - - - 0 - 0 - - - - A&utomatically add these trackers to new downloads: - - - true - - - false - - - - - - true - - - Qt::StrongFocus - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - true - - - - - 0 - 0 - 516 - 525 - - - - - - - RSS Reader - - - - - - Enable fetching RSS feeds - - - - - - - - - Feeds refresh interval: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - Maximum number of articles per feed: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - min - - - 1 - - - 999999 - - - 5 - - - - - - - 9999 - - - 100 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - RSS Torrent Auto Downloader - - - - - - Enable auto downloading of RSS torrents - - - - - - - Edit auto downloading rules... - - - - - - - - - - RSS Smart Episode Filters - - - - - - - - - - - - Qt::Vertical - - - - 20 - 200 - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - true - - - - - 0 - 0 - 501 - 636 - - - - - - - Web User Interface (Remote control) - - - true - - - false - - - - - - - - IP address: - - - - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - - - - - - - Port: - - - - - - - 1 - - - 65535 - - - 8080 - - - - - - - - - - - Server domains: - - - - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - - - - - - - - - Use UPnP / NAT-PMP to forward the port from my router - - - true - - - - - - - &Use HTTPS instead of HTTP - - - true - - - false - - - - - - - - - Certificate: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - - Import SSL Certificate - - - - - - - Qt::Horizontal - - - - 138 - 28 - - - - - - - - - - - - - Key: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - - Import SSL Key - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - - - true - - - - - - - - - - Authentication - - - - - - - - - 1000 - - - QLineEdit::Normal - - - - - - - - - - 1000 - - - QLineEdit::Password - - - - - - - Bypass authentication for clients on localhost - - - - - - - Bypass authentication for clients in whitelisted IP subnets - - - - - - - - 0 - 0 - - - - IP subnet whitelist... - - - - - - - Username: - - - - - - - Password: - - - - - - - - - - Use alternative Web UI - - - true - - - false - - - - - - Files location: - - - - - - - - - - - - - Enable clickjacking protection - - - - - - - Enable Cross-Site Request Forgery (CSRF) protection - - - - - - - Upda&te my dynamic domain name - - - true - - - false - - - - - - Service: - - - - - - - - - - DynDNS - - - - - No-IP - - - - - - - - Register - - - - - - - - - Domain name: - - - - - - - changeme.dyndns.org - - - - - - - Username: - - - - - - - 50 - - - - - - - Password: - - - - - - - 50 - - - QLineEdit::Password - - - - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - - QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - FileSystemPathLineEdit - QWidget -
fspathedit.h
- 1 -
-
- - tabOption - comboI18n - checkStartPaused - spinPort - checkUPnP - textWebUiUsername - checkWebUi - textSavePath - scrollArea_7 - scrollArea_2 - spinWebUiPort - textWebUiPassword - buttonBox - tabSelection - scrollArea - confirmDeletion - checkAltRowColors - actionTorrentDlOnDblClBox - actionTorrentFnOnDblClBox - checkStartup - checkShowSplash - checkStartMinimized - checkProgramExitConfirm - checkShowSystray - checkMinimizeToSysTray - checkCloseToSystray - comboTrayIcon - checkAssociateTorrents - checkAssociateMagnetLinks - checkPreventFromSuspendWhenDownloading - checkPreventFromSuspendWhenSeeding - checkAdditionDialog - checkAdditionDialogFront - checkPreallocateAll - checkTempFolder - textTempPath - checkAppendqB - scanFoldersView - addScanFolderButton - removeScanFolderButton - checkExportDir - textExportDir - checkExportDirFin - textExportDirFin - groupMailNotification - lineEditDestEmail - lineEditSmtpServer - groupMailNotifAuth - mailNotifUsername - mailNotifPassword - checkSmtpSSL - autoRunBox - lineEditAutoRun - scrollArea_3 - randomButton - checkRandomPort - checkMaxConnecs - spinMaxConnec - checkMaxConnecsPerTorrent - spinMaxConnecPerTorrent - checkMaxUploadsPerTorrent - spinMaxUploadsPerTorrent - checkMaxUploads - spinMaxUploads - comboProxyType - textProxyIP - spinProxyPort - checkProxyPeerConnecs - checkForceProxy - isProxyOnlyForTorrents - checkProxyAuth - textProxyUsername - textProxyPassword - checkIPFilter - textFilterPath - IpFilterRefreshBtn - checkIpFilterTrackers - scrollArea_9 - spinUploadLimit - checkUploadLimit - spinDownloadLimit - checkDownloadLimit - groupBoxSchedule - timeEditScheduleTo - timeEditScheduleFrom - comboBoxScheduleDays - checkUploadLimitAlt - checkDownloadLimitAlt - spinUploadLimitAlt - spinDownloadLimitAlt - checkLimitLocalPeerRate - checkLimitTransportOverhead - scrollArea_4 - checkDHT - checkPeX - checkLSD - comboEncryption - checkAnonymousMode - checkEnableQueueing - spinMaxActiveDownloads - spinMaxActiveUploads - spinMaxActiveTorrents - checkMaxRatio - spinMaxRatio - checkMaxSeedingMinutes - spinMaxSeedingMinutes - comboRatioLimitAct - checkWebUIUPnP - checkWebUiHttps - btnWebUiCrt - btnWebUiKey - checkBypassLocalAuth - checkBypassAuthSubnetWhitelist - IPSubnetWhitelistButton - checkDynDNS - comboDNSService - registerDNSBtn - domainNameTxt - DNSUsernameTxt - DNSPasswordTxt - - - - - checkUploadLimit - toggled(bool) - spinUploadLimit - setEnabled(bool) - - - 367 - 61 - - - 448 - 62 - - - - - checkDownloadLimit - toggled(bool) - spinDownloadLimit - setEnabled(bool) - - - 377 - 81 - - - 430 - 87 - - - - - checkMaxConnecs - toggled(bool) - spinMaxConnec - setEnabled(bool) - - - 604 - 205 - - - 677 - 206 - - - - - checkMaxConnecsPerTorrent - toggled(bool) - spinMaxConnecPerTorrent - setEnabled(bool) - - - 604 - 238 - - - 677 - 239 - - - - - checkMaxUploadsPerTorrent - toggled(bool) - spinMaxUploadsPerTorrent - setEnabled(bool) - - - 604 - 304 - - - 677 - 305 - - - - - checkMaxUploads - toggled(bool) - spinMaxUploads - setEnabled(bool) - - - 547 - 415 - - - 642 - 414 - - - - - checkDownloadLimitAlt - toggled(bool) - spinDownloadLimitAlt - setEnabled(bool) - - - 547 - 415 - - - 815 - 413 - - - - - checkUploadLimitAlt - toggled(bool) - spinUploadLimitAlt - setEnabled(bool) - - - 604 - 271 - - - 677 - 272 - - - - - checkMaxRatio - toggled(bool) - spinMaxRatio - setEnabled(bool) - - - 395 - 203 - - - 496 - 204 - - - - - checkMaxSeedingMinutes - toggled(bool) - spinMaxSeedingMinutes - setEnabled(bool) - - - 395 - 170 - - - 496 - 171 - - - - - deleteTorrentBox - toggled(bool) - deleteTorrentWarningIcon - setVisible(bool) - - - 554 - 153 - - - 324 - 214 - - - - - deleteTorrentBox - toggled(bool) - deleteTorrentWarningLabel - setVisible(bool) - - - 646 - 158 - - - 629 - 207 - - - - -
diff -Nru qbittorrent-4.1.3/src/gui/optionsdlg.cpp qbittorrent-3.3.15/src/gui/optionsdlg.cpp --- qbittorrent-4.1.3/src/gui/optionsdlg.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/optionsdlg.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,1703 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#include "optionsdlg.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef QT_NO_OPENSSL +#include +#include +#endif + +#include "app/application.h" +#include "base/bittorrent/session.h" +#include "base/net/dnsupdater.h" +#include "base/net/portforwarder.h" +#include "base/net/proxyconfigurationmanager.h" +#include "base/preferences.h" +#include "base/scanfoldersmodel.h" +#include "base/torrentfileguard.h" +#include "base/unicodestrings.h" +#include "base/utils/fs.h" +#include "base/utils/random.h" +#include "addnewtorrentdialog.h" +#include "advancedsettings.h" +#include "guiiconprovider.h" +#include "scanfoldersdelegate.h" + +#include "ui_optionsdlg.h" + +// Constructor +OptionsDialog::OptionsDialog(QWidget *parent) + : QDialog(parent) + , m_refreshingIpFilter(false) + , m_ui(new Ui::OptionsDialog) +{ + qDebug("-> Constructing Options"); + m_ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + setModal(true); + + // Icons + m_ui->tabSelection->item(TAB_UI)->setIcon(GuiIconProvider::instance()->getIcon("preferences-desktop")); + m_ui->tabSelection->item(TAB_BITTORRENT)->setIcon(GuiIconProvider::instance()->getIcon("preferences-system-network")); + m_ui->tabSelection->item(TAB_CONNECTION)->setIcon(GuiIconProvider::instance()->getIcon("network-wired")); + m_ui->tabSelection->item(TAB_DOWNLOADS)->setIcon(GuiIconProvider::instance()->getIcon("download")); + m_ui->tabSelection->item(TAB_SPEED)->setIcon(GuiIconProvider::instance()->getIcon("chronometer")); +#ifndef DISABLE_WEBUI + m_ui->tabSelection->item(TAB_WEBUI)->setIcon(GuiIconProvider::instance()->getIcon("network-server")); +#else + m_ui->tabSelection->item(TAB_WEBUI)->setHidden(true); +#endif + m_ui->tabSelection->item(TAB_ADVANCED)->setIcon(GuiIconProvider::instance()->getIcon("preferences-other")); + for (int i = 0; i < m_ui->tabSelection->count(); ++i) { + m_ui->tabSelection->item(i)->setSizeHint(QSize(std::numeric_limits::max(), 64)); // uniform size for all icons + } + + m_ui->IpFilterRefreshBtn->setIcon(GuiIconProvider::instance()->getIcon("view-refresh")); + + m_ui->deleteTorrentWarningIcon->setPixmap(QApplication::style()->standardIcon(QStyle::SP_MessageBoxCritical).pixmap(16, 16)); + m_ui->deleteTorrentWarningIcon->hide(); + m_ui->deleteTorrentWarningLabel->hide(); + m_ui->deleteTorrentWarningLabel->setToolTip(QLatin1String("

") + + tr("By enabling these options, you can irrevocably lose your .torrent files!") + + QLatin1String("

") + + tr("When these options are enabled, qBittorent will delete .torrent files " + "after they were successfully (the first option) or not (the second option) added to its " + "download queue. This will be applied not only to the files opened via " + "“Add torrent” menu action but to those opened via file type association as well") + + QLatin1String("

") + + tr("If you enable the second option (“Also when addition is cancelled”) the " + ".torrent file will be deleted even if you press “Cancel” in " + "the “Add torrent” dialog") + + QLatin1String("

")); + + m_ui->hsplitter->setCollapsible(0, false); + m_ui->hsplitter->setCollapsible(1, false); + // Get apply button in button box + QList buttons = m_ui->buttonBox->buttons(); + foreach (QAbstractButton *button, buttons) { + if (m_ui->buttonBox->buttonRole(button) == QDialogButtonBox::ApplyRole) { + applyButton = button; + break; + } + } + +#ifndef QBT_USES_QT5 + m_ui->scanFoldersView->header()->setResizeMode(QHeaderView::ResizeToContents); +#else + m_ui->scanFoldersView->header()->setSectionResizeMode(QHeaderView::ResizeToContents); +#endif + m_ui->scanFoldersView->setModel(ScanFoldersModel::instance()); + m_ui->scanFoldersView->setItemDelegate(new ScanFoldersDelegate(this, m_ui->scanFoldersView)); + connect(ScanFoldersModel::instance(), SIGNAL(dataChanged(QModelIndex, QModelIndex)), this, SLOT(enableApplyButton())); + connect(m_ui->scanFoldersView->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(handleScanFolderViewSelectionChanged())); + + connect(m_ui->buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(applySettings(QAbstractButton*))); + // Languages supported + initializeLanguageCombo(); + + // Load week days (scheduler) + for (uint i = 1; i <= 7; ++i) + m_ui->schedule_days->addItem(QDate::longDayName(i, QDate::StandaloneFormat)); + + // Load options + loadOptions(); + // Disable systray integration if it is not supported by the system + if (!QSystemTrayIcon::isSystemTrayAvailable()) { + m_ui->checkShowSystray->setChecked(false); + m_ui->checkShowSystray->setEnabled(false); + m_ui->label_trayIconStyle->setVisible(false); + m_ui->comboTrayIcon->setVisible(false); + } + +#if defined(QT_NO_OPENSSL) + m_ui->checkWebUiHttps->setVisible(false); + m_ui->checkSmtpSSL->setVisible(false); +#endif + +#ifndef Q_OS_WIN + m_ui->checkStartup->setVisible(false); +#endif + +#if !(defined(Q_OS_WIN) || defined(Q_OS_MAC)) + m_ui->groupFileAssociation->setVisible(false); +#endif + + // Connect signals / slots + connect(m_ui->comboProxyType, SIGNAL(currentIndexChanged(int)), this, SLOT(enableProxy(int))); + connect(m_ui->checkRandomPort, SIGNAL(toggled(bool)), m_ui->spinPort, SLOT(setDisabled(bool))); + + // Apply button is activated when a value is changed + // General tab + connect(m_ui->comboI18n, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); + connect(m_ui->confirmDeletion, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkAltRowColors, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkHideZero, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkHideZero, SIGNAL(toggled(bool)), m_ui->comboHideZero, SLOT(setEnabled(bool))); + connect(m_ui->comboHideZero, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); + connect(m_ui->checkShowSystray, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkCloseToSystray, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkMinimizeToSysTray, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkStartMinimized, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); +#ifdef Q_OS_WIN + connect(m_ui->checkStartup, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); +#endif + connect(m_ui->checkShowSplash, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkProgramExitConfirm, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkProgramAutoExitConfirm, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkPreventFromSuspend, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->comboTrayIcon, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); +#if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) && !defined(QT_DBUS_LIB) + m_ui->checkPreventFromSuspend->setDisabled(true); +#endif +#if defined(Q_OS_WIN) || defined(Q_OS_MAC) + connect(m_ui->checkAssociateTorrents, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkAssociateMagnetLinks, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); +#endif + connect(m_ui->checkFileLog, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->textFileLogPath, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->checkFileLogBackup, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkFileLogBackup, SIGNAL(toggled(bool)), m_ui->spinFileLogSize, SLOT(setEnabled(bool))); + connect(m_ui->checkFileLogDelete, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkFileLogDelete, SIGNAL(toggled(bool)), m_ui->spinFileLogAge, SLOT(setEnabled(bool))); + connect(m_ui->checkFileLogDelete, SIGNAL(toggled(bool)), m_ui->comboFileLogAgeType, SLOT(setEnabled(bool))); + connect(m_ui->spinFileLogSize, SIGNAL(valueChanged(int)), this, SLOT(enableApplyButton())); + connect(m_ui->spinFileLogAge, SIGNAL(valueChanged(int)), this, SLOT(enableApplyButton())); + connect(m_ui->comboFileLogAgeType, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); + // Downloads tab + connect(m_ui->textSavePath, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->checkUseSubcategories, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->comboSavingMode, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); + connect(m_ui->comboTorrentCategoryChanged, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); + connect(m_ui->comboCategoryDefaultPathChanged, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); + connect(m_ui->comboCategoryChanged, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); + connect(m_ui->textTempPath, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->checkAppendqB, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkPreallocateAll, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkAdditionDialog, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkAdditionDialogFront, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkStartPaused, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->deleteTorrentBox, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->deleteCancelledTorrentBox, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkExportDir, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkExportDir, SIGNAL(toggled(bool)), m_ui->textExportDir, SLOT(setEnabled(bool))); + connect(m_ui->checkExportDir, SIGNAL(toggled(bool)), m_ui->browseExportDirButton, SLOT(setEnabled(bool))); + connect(m_ui->checkExportDirFin, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkExportDirFin, SIGNAL(toggled(bool)), m_ui->textExportDirFin, SLOT(setEnabled(bool))); + connect(m_ui->checkExportDirFin, SIGNAL(toggled(bool)), m_ui->browseExportDirFinButton, SLOT(setEnabled(bool))); + connect(m_ui->textExportDir, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->textExportDirFin, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->actionTorrentDlOnDblClBox, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); + connect(m_ui->actionTorrentFnOnDblClBox, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); + connect(m_ui->checkTempFolder, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkTempFolder, SIGNAL(toggled(bool)), m_ui->textTempPath, SLOT(setEnabled(bool))); + connect(m_ui->checkTempFolder, SIGNAL(toggled(bool)), m_ui->browseTempDirButton, SLOT(setEnabled(bool))); + connect(m_ui->addScanFolderButton, SIGNAL(clicked()), this, SLOT(enableApplyButton())); + connect(m_ui->removeScanFolderButton, SIGNAL(clicked()), this, SLOT(enableApplyButton())); + connect(m_ui->groupMailNotification, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->dest_email_txt, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->smtp_server_txt, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->checkSmtpSSL, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->groupMailNotifAuth, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->mailNotifUsername, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->mailNotifPassword, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->autoRunBox, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->autoRun_txt, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + + const QString autoRunStr = QString::fromUtf8("%1\n %2\n %3\n %4\n %5\n %6\n %7\n %8\n %9\n %10\n%11") + .arg(tr("Supported parameters (case sensitive):")) + .arg(tr("%N: Torrent name")) + .arg(tr("%L: Category")) + .arg(tr("%F: Content path (same as root path for multifile torrent)")) + .arg(tr("%R: Root path (first torrent subdirectory path)")) + .arg(tr("%D: Save path")) + .arg(tr("%C: Number of files")) + .arg(tr("%Z: Torrent size (bytes)")) + .arg(tr("%T: Current tracker")) + .arg(tr("%I: Info hash")) + .arg(tr("Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., \"%N\")")); + m_ui->autoRun_param->setText(autoRunStr); + + // Connection tab + connect(m_ui->spinPort, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->checkRandomPort, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkUPnP, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkUploadLimit, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkDownloadLimit, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkUploadLimitAlt, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkDownloadLimitAlt, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->spinUploadLimit, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->spinDownloadLimit, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->spinUploadLimitAlt, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->spinDownloadLimitAlt, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->check_schedule, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->schedule_from, SIGNAL(timeChanged(QTime)), this, SLOT(enableApplyButton())); + connect(m_ui->schedule_to, SIGNAL(timeChanged(QTime)), this, SLOT(enableApplyButton())); + connect(m_ui->schedule_days, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); + connect(m_ui->checkuTP, SIGNAL(toggled(bool)), SLOT(enableApplyButton())); + connect(m_ui->checkuTP, SIGNAL(toggled(bool)), m_ui->checkLimituTPConnections, SLOT(setEnabled(bool))); + connect(m_ui->checkLimituTPConnections, SIGNAL(toggled(bool)), SLOT(enableApplyButton())); + connect(m_ui->checkLimitTransportOverhead, SIGNAL(toggled(bool)), SLOT(enableApplyButton())); + connect(m_ui->checkLimitLocalPeerRate, SIGNAL(toggled(bool)), SLOT(enableApplyButton())); + // Bittorrent tab + connect(m_ui->checkMaxConnecs, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkMaxConnecsPerTorrent, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkMaxUploads, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkMaxUploadsPerTorrent, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->spinMaxConnec, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->spinMaxConnecPerTorrent, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->spinMaxUploads, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->spinMaxUploadsPerTorrent, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->checkDHT, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkAnonymousMode, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkPeX, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkLSD, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->comboEncryption, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); + connect(m_ui->checkMaxRatio, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->spinMaxRatio, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->comboRatioLimitAct, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); + // Proxy tab + connect(m_ui->comboProxyType, SIGNAL(currentIndexChanged(int)), this, SLOT(enableApplyButton())); + connect(m_ui->textProxyIP, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->spinProxyPort, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->checkProxyPeerConnecs, SIGNAL(toggled(bool)), SLOT(enableApplyButton())); + connect(m_ui->checkForceProxy, SIGNAL(toggled(bool)), SLOT(enableApplyButton())); + connect(m_ui->isProxyOnlyForTorrents, SIGNAL(toggled(bool)), SLOT(enableApplyButton())); + connect(m_ui->checkProxyAuth, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->textProxyUsername, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->textProxyPassword, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + // Misc tab + connect(m_ui->checkIPFilter, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkIpFilterTrackers, SIGNAL(toggled(bool)), SLOT(enableApplyButton())); + connect(m_ui->textFilterPath, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->checkEnableQueueing, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->spinMaxActiveDownloads, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->spinMaxActiveUploads, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->spinMaxActiveTorrents, SIGNAL(valueChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->checkIgnoreSlowTorrentsForQueueing, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkEnableAddTrackers, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->textTrackers, SIGNAL(textChanged()), this, SLOT(enableApplyButton())); +#ifndef DISABLE_WEBUI + // Web UI tab + connect(m_ui->textServerDomains, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->checkWebUi, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->spinWebUiPort, SIGNAL(valueChanged(int)), this, SLOT(enableApplyButton())); + connect(m_ui->checkWebUIUPnP, SIGNAL(toggled(bool)), SLOT(enableApplyButton())); + connect(m_ui->checkWebUiHttps, SIGNAL(toggled(bool)), SLOT(enableApplyButton())); + connect(m_ui->btnWebUiKey, SIGNAL(clicked()), SLOT(enableApplyButton())); + connect(m_ui->btnWebUiCrt, SIGNAL(clicked()), SLOT(enableApplyButton())); + connect(m_ui->textWebUiUsername, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->textWebUiPassword, SIGNAL(textChanged(QString)), this, SLOT(enableApplyButton())); + connect(m_ui->checkBypassLocalAuth, SIGNAL(toggled(bool)), this, SLOT(enableApplyButton())); + connect(m_ui->checkDynDNS, SIGNAL(toggled(bool)), SLOT(enableApplyButton())); + connect(m_ui->comboDNSService, SIGNAL(currentIndexChanged(int)), SLOT(enableApplyButton())); + connect(m_ui->domainNameTxt, SIGNAL(textChanged(QString)), SLOT(enableApplyButton())); + connect(m_ui->DNSUsernameTxt, SIGNAL(textChanged(QString)), SLOT(enableApplyButton())); + connect(m_ui->DNSPasswordTxt, SIGNAL(textChanged(QString)), SLOT(enableApplyButton())); +#endif + // Disable apply Button + applyButton->setEnabled(false); + // Tab selection mechanism + connect(m_ui->tabSelection, SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)), this, SLOT(changePage(QListWidgetItem *, QListWidgetItem*))); + // Load Advanced settings + advancedSettings = new AdvancedSettings(m_ui->tabAdvancedPage); + m_ui->advPageLayout->addWidget(advancedSettings); + connect(advancedSettings, SIGNAL(settingsChanged()), this, SLOT(enableApplyButton())); + + // Adapt size + show(); + loadWindowState(); +} + +void OptionsDialog::initializeLanguageCombo() +{ + // List language files + const QDir langDir(":/lang"); + const QStringList langFiles = langDir.entryList(QStringList("qbittorrent_*.qm"), QDir::Files); + foreach (const QString langFile, langFiles) { + QString localeStr = langFile.mid(12); // remove "qbittorrent_" + localeStr.chop(3); // Remove ".qm" + QString languageName; + if (localeStr.startsWith("eo", Qt::CaseInsensitive)) { + // QLocale doesn't work with that locale. Esperanto isn't a "real" language. + languageName = QString::fromUtf8(C_LOCALE_ESPERANTO); + } + else { + QLocale locale(localeStr); + languageName = languageToLocalizedString(locale); + } + m_ui->comboI18n->addItem(/*QIcon(":/icons/flags/"+country+".png"), */ languageName, localeStr); + qDebug() << "Supported locale:" << localeStr; + } +} + +// Main destructor +OptionsDialog::~OptionsDialog() +{ + qDebug("-> destructing Options"); + foreach (const QString &path, addedScanDirs) + ScanFoldersModel::instance()->removePath(path); + ScanFoldersModel::instance()->configure(); // reloads "removed" paths + delete m_ui; +} + +void OptionsDialog::changePage(QListWidgetItem *current, QListWidgetItem *previous) +{ + if (!current) + current = previous; + m_ui->tabOption->setCurrentIndex(m_ui->tabSelection->row(current)); +} + +void OptionsDialog::loadWindowState() +{ + const Preferences* const pref = Preferences::instance(); + resize(pref->getPrefSize(sizeFittingScreen())); + QPoint p = pref->getPrefPos(); + QRect scr_rect = qApp->desktop()->screenGeometry(); + if (!p.isNull() && scr_rect.contains(p)) + move(p); + // Load slider size + const QStringList sizes_str = pref->getPrefHSplitterSizes(); + // Splitter size + QList sizes; + if (sizes_str.size() == 2) { + sizes << sizes_str.first().toInt(); + sizes << sizes_str.last().toInt(); + } + else { + sizes << 116; + sizes << m_ui->hsplitter->width() - 116; + } + m_ui->hsplitter->setSizes(sizes); +} + +void OptionsDialog::saveWindowState() const +{ + Preferences* const pref = Preferences::instance(); + pref->setPrefSize(size()); + pref->setPrefPos(pos()); + // Splitter size + QStringList sizes_str; + sizes_str << QString::number(m_ui->hsplitter->sizes().first()); + sizes_str << QString::number(m_ui->hsplitter->sizes().last()); + pref->setPrefHSplitterSizes(sizes_str); +} + +QSize OptionsDialog::sizeFittingScreen() const +{ + int scrn = 0; + QWidget *w = this->topLevelWidget(); + + if (w) + scrn = QApplication::desktop()->screenNumber(w); + else if (QApplication::desktop()->isVirtualDesktop()) + scrn = QApplication::desktop()->screenNumber(QCursor::pos()); + else + scrn = QApplication::desktop()->screenNumber(this); + + QRect desk(QApplication::desktop()->availableGeometry(scrn)); + if (width() > desk.width() || height() > desk.height()) + if (desk.width() > 0 && desk.height() > 0) + return QSize(desk.width(), desk.height()); + return size(); +} + +void OptionsDialog::saveOptions() +{ + applyButton->setEnabled(false); + Preferences* const pref = Preferences::instance(); + // Load the translation + QString locale = getLocale(); + if (pref->getLocale() != locale) { + QTranslator *translator = new QTranslator; + if (translator->load(QString::fromUtf8(":/lang/qbittorrent_") + locale)) + qDebug("%s locale recognized, using translation.", qPrintable(locale)); + else + qDebug("%s locale unrecognized, using default (en).", qPrintable(locale)); + qApp->installTranslator(translator); + } + + // General preferences + pref->setLocale(locale); + pref->setConfirmTorrentDeletion(m_ui->confirmDeletion->isChecked()); + pref->setAlternatingRowColors(m_ui->checkAltRowColors->isChecked()); + pref->setHideZeroValues(m_ui->checkHideZero->isChecked()); + pref->setHideZeroComboValues(m_ui->comboHideZero->currentIndex()); + pref->setSystrayIntegration(systrayIntegration()); + pref->setTrayIconStyle(TrayIcon::Style(m_ui->comboTrayIcon->currentIndex())); + pref->setCloseToTray(closeToTray()); + pref->setMinimizeToTray(minimizeToTray()); + pref->setStartMinimized(startMinimized()); + pref->setSplashScreenDisabled(isSlashScreenDisabled()); + pref->setConfirmOnExit(m_ui->checkProgramExitConfirm->isChecked()); + pref->setDontConfirmAutoExit(!m_ui->checkProgramAutoExitConfirm->isChecked()); + pref->setPreventFromSuspend(preventFromSuspend()); +#ifdef Q_OS_WIN + pref->setWinStartup(WinStartup()); + // Windows: file association settings + Preferences::setTorrentFileAssoc(m_ui->checkAssociateTorrents->isChecked()); + Preferences::setMagnetLinkAssoc(m_ui->checkAssociateMagnetLinks->isChecked()); +#endif +#ifdef Q_OS_MAC + if (m_ui->checkAssociateTorrents->isChecked()) { + Preferences::setTorrentFileAssoc(); + m_ui->checkAssociateTorrents->setChecked(Preferences::isTorrentFileAssocSet()); + m_ui->checkAssociateTorrents->setEnabled(!m_ui->checkAssociateTorrents->isChecked()); + } + if (m_ui->checkAssociateMagnetLinks->isChecked()) { + Preferences::setMagnetLinkAssoc(); + m_ui->checkAssociateMagnetLinks->setChecked(Preferences::isMagnetLinkAssocSet()); + m_ui->checkAssociateMagnetLinks->setEnabled(!m_ui->checkAssociateMagnetLinks->isChecked()); + } +#endif + Application * const app = static_cast(QCoreApplication::instance()); + app->setFileLoggerPath(Utils::Fs::fromNativePath(m_ui->textFileLogPath->text())); + app->setFileLoggerBackup(m_ui->checkFileLogBackup->isChecked()); + app->setFileLoggerMaxSize(m_ui->spinFileLogSize->value()); + app->setFileLoggerAge(m_ui->spinFileLogAge->value()); + app->setFileLoggerAgeType(m_ui->comboFileLogAgeType->currentIndex()); + app->setFileLoggerDeleteOld(m_ui->checkFileLogDelete->isChecked()); + app->setFileLoggerEnabled(m_ui->checkFileLog->isChecked()); + // End General preferences + + auto session = BitTorrent::Session::instance(); + + // Downloads preferences + session->setDefaultSavePath(Utils::Fs::expandPathAbs(m_ui->textSavePath->text())); + session->setSubcategoriesEnabled(m_ui->checkUseSubcategories->isChecked()); + session->setAutoTMMDisabledByDefault(m_ui->comboSavingMode->currentIndex() == 0); + session->setDisableAutoTMMWhenCategoryChanged(m_ui->comboTorrentCategoryChanged->currentIndex() == 1); + session->setDisableAutoTMMWhenCategorySavePathChanged(m_ui->comboCategoryChanged->currentIndex() == 1); + session->setDisableAutoTMMWhenDefaultSavePathChanged(m_ui->comboCategoryDefaultPathChanged->currentIndex() == 1); + session->setTempPathEnabled(m_ui->checkTempFolder->isChecked()); + session->setTempPath(Utils::Fs::expandPathAbs(m_ui->textTempPath->text())); + session->setAppendExtensionEnabled(m_ui->checkAppendqB->isChecked()); + session->setPreallocationEnabled(preAllocateAllFiles()); + AddNewTorrentDialog::setEnabled(useAdditionDialog()); + AddNewTorrentDialog::setTopLevel(m_ui->checkAdditionDialogFront->isChecked()); + session->setAddTorrentPaused(addTorrentsInPause()); + ScanFoldersModel::instance()->removeFromFSWatcher(removedScanDirs); + ScanFoldersModel::instance()->addToFSWatcher(addedScanDirs); + ScanFoldersModel::instance()->makePersistent(); + removedScanDirs.clear(); + addedScanDirs.clear(); + session->setTorrentExportDirectory(getTorrentExportDir()); + session->setFinishedTorrentExportDirectory(getFinishedTorrentExportDir()); + pref->setMailNotificationEnabled(m_ui->groupMailNotification->isChecked()); + pref->setMailNotificationEmail(m_ui->dest_email_txt->text()); + pref->setMailNotificationSMTP(m_ui->smtp_server_txt->text()); + pref->setMailNotificationSMTPSSL(m_ui->checkSmtpSSL->isChecked()); + pref->setMailNotificationSMTPAuth(m_ui->groupMailNotifAuth->isChecked()); + pref->setMailNotificationSMTPUsername(m_ui->mailNotifUsername->text()); + pref->setMailNotificationSMTPPassword(m_ui->mailNotifPassword->text()); + pref->setAutoRunEnabled(m_ui->autoRunBox->isChecked()); + pref->setAutoRunProgram(m_ui->autoRun_txt->text().trimmed()); + pref->setActionOnDblClOnTorrentDl(getActionOnDblClOnTorrentDl()); + pref->setActionOnDblClOnTorrentFn(getActionOnDblClOnTorrentFn()); + TorrentFileGuard::setAutoDeleteMode(!m_ui->deleteTorrentBox->isChecked() ? TorrentFileGuard::Never + : !m_ui->deleteCancelledTorrentBox->isChecked() ? TorrentFileGuard::IfAdded + : TorrentFileGuard::Always); + // End Downloads preferences + + // Connection preferences + session->setPort(getPort()); + session->setUseRandomPort(m_ui->checkRandomPort->isChecked()); + Net::PortForwarder::instance()->setEnabled(isUPnPEnabled()); + const QPair down_up_limit = getGlobalBandwidthLimits(); + session->setGlobalDownloadSpeedLimit(down_up_limit.first); + session->setGlobalUploadSpeedLimit(down_up_limit.second); + session->setUTPEnabled(m_ui->checkuTP->isChecked()); + session->setUTPRateLimited(m_ui->checkLimituTPConnections->isChecked()); + session->setIncludeOverheadInLimits(m_ui->checkLimitTransportOverhead->isChecked()); + session->setIgnoreLimitsOnLAN(!m_ui->checkLimitLocalPeerRate->isChecked()); + const QPair alt_down_up_limit = getAltGlobalBandwidthLimits(); + session->setAltGlobalDownloadSpeedLimit(alt_down_up_limit.first); + session->setAltGlobalUploadSpeedLimit(alt_down_up_limit.second); + session->setBandwidthSchedulerEnabled(m_ui->check_schedule->isChecked()); + pref->setSchedulerStartTime(m_ui->schedule_from->time()); + pref->setSchedulerEndTime(m_ui->schedule_to->time()); + pref->setSchedulerDays((scheduler_days)m_ui->schedule_days->currentIndex()); + + auto proxyConfigManager = Net::ProxyConfigurationManager::instance(); + Net::ProxyConfiguration proxyConf; + proxyConf.type = getProxyType(); + proxyConf.ip = getProxyIp(); + proxyConf.port = getProxyPort(); + proxyConf.username = getProxyUsername(); + proxyConf.password = getProxyPassword(); + proxyConfigManager->setProxyOnlyForTorrents(m_ui->isProxyOnlyForTorrents->isChecked()); + proxyConfigManager->setProxyConfiguration(proxyConf); + + session->setProxyPeerConnectionsEnabled(m_ui->checkProxyPeerConnecs->isChecked()); + session->setForceProxyEnabled(m_ui->checkForceProxy->isChecked()); + // End Connection preferences + + // Bittorrent preferences + session->setMaxConnections(getMaxConnecs()); + session->setMaxConnectionsPerTorrent(getMaxConnecsPerTorrent()); + session->setMaxUploads(getMaxUploads()); + session->setMaxUploadsPerTorrent(getMaxUploadsPerTorrent()); + session->setDHTEnabled(isDHTEnabled()); + session->setPeXEnabled(m_ui->checkPeX->isChecked()); + session->setLSDEnabled(isLSDEnabled()); + session->setEncryption(getEncryptionSetting()); + session->setAnonymousModeEnabled(m_ui->checkAnonymousMode->isChecked()); + session->setAddTrackersEnabled(m_ui->checkEnableAddTrackers->isChecked()); + session->setAdditionalTrackers(m_ui->textTrackers->toPlainText()); + session->setGlobalMaxRatio(getMaxRatio()); + session->setMaxRatioAction(static_cast(m_ui->comboRatioLimitAct->currentIndex())); + // End Bittorrent preferences + + // Misc preferences + // * IPFilter + session->setIPFilteringEnabled(isIPFilteringEnabled()); + session->setTrackerFilteringEnabled(m_ui->checkIpFilterTrackers->isChecked()); + session->setIPFilterFile(m_ui->textFilterPath->text()); + // End IPFilter preferences + // Queueing system + session->setQueueingSystemEnabled(isQueueingSystemEnabled()); + session->setMaxActiveDownloads(m_ui->spinMaxActiveDownloads->value()); + session->setMaxActiveUploads(m_ui->spinMaxActiveUploads->value()); + session->setMaxActiveTorrents(m_ui->spinMaxActiveTorrents->value()); + session->setIgnoreSlowTorrentsForQueueing(m_ui->checkIgnoreSlowTorrentsForQueueing->isChecked()); + // End Queueing system preferences + // Web UI + pref->setWebUiEnabled(isWebUiEnabled()); + if (isWebUiEnabled()) { + pref->setServerDomains(m_ui->textServerDomains->text()); + pref->setWebUiPort(webUiPort()); + pref->setUPnPForWebUIPort(m_ui->checkWebUIUPnP->isChecked()); + pref->setWebUiHttpsEnabled(m_ui->checkWebUiHttps->isChecked()); + if (m_ui->checkWebUiHttps->isChecked()) { + pref->setWebUiHttpsCertificate(m_sslCert); + pref->setWebUiHttpsKey(m_sslKey); + } + pref->setWebUiUsername(webUiUsername()); + pref->setWebUiPassword(webUiPassword()); + pref->setWebUiLocalAuthEnabled(!m_ui->checkBypassLocalAuth->isChecked()); + // DynDNS + pref->setDynDNSEnabled(m_ui->checkDynDNS->isChecked()); + pref->setDynDNSService(m_ui->comboDNSService->currentIndex()); + pref->setDynDomainName(m_ui->domainNameTxt->text()); + pref->setDynDNSUsername(m_ui->DNSUsernameTxt->text()); + pref->setDynDNSPassword(m_ui->DNSPasswordTxt->text()); + } + // End Web UI + // End preferences + // Save advanced settings + advancedSettings->saveAdvancedSettings(); + // Assume that user changed multiple settings + // so it's best to save immediately + pref->apply(); +} + +bool OptionsDialog::isIPFilteringEnabled() const +{ + return m_ui->checkIPFilter->isChecked(); +} + +Net::ProxyType OptionsDialog::getProxyType() const +{ + switch (m_ui->comboProxyType->currentIndex()) { + case 1: + return Net::ProxyType::SOCKS4; + break; + case 2: + if (isProxyAuthEnabled()) + return Net::ProxyType::SOCKS5_PW; + return Net::ProxyType::SOCKS5; + case 3: + if (isProxyAuthEnabled()) + return Net::ProxyType::HTTP_PW; + return Net::ProxyType::HTTP; + default: + return Net::ProxyType::None; + } +} + +void OptionsDialog::loadOptions() +{ + int intValue; + QString strValue; + bool fileLogBackup = true; + bool fileLogDelete = true; + const Preferences* const pref = Preferences::instance(); + + // General preferences + setLocale(pref->getLocale()); + m_ui->confirmDeletion->setChecked(pref->confirmTorrentDeletion()); + m_ui->checkAltRowColors->setChecked(pref->useAlternatingRowColors()); + m_ui->checkHideZero->setChecked(pref->getHideZeroValues()); + m_ui->comboHideZero->setEnabled(m_ui->checkHideZero->isChecked()); + m_ui->comboHideZero->setCurrentIndex(pref->getHideZeroComboValues()); + + m_ui->checkShowSplash->setChecked(!pref->isSplashScreenDisabled()); + m_ui->checkStartMinimized->setChecked(pref->startMinimized()); + m_ui->checkProgramExitConfirm->setChecked(pref->confirmOnExit()); + m_ui->checkProgramAutoExitConfirm->setChecked(!pref->dontConfirmAutoExit()); + + m_ui->checkShowSystray->setChecked(pref->systrayIntegration()); + if (m_ui->checkShowSystray->isChecked()) { + m_ui->checkMinimizeToSysTray->setChecked(pref->minimizeToTray()); + m_ui->checkCloseToSystray->setChecked(pref->closeToTray()); + m_ui->comboTrayIcon->setCurrentIndex(pref->trayIconStyle()); + } + + m_ui->checkPreventFromSuspend->setChecked(pref->preventFromSuspend()); + +#ifdef Q_OS_WIN + m_ui->checkStartup->setChecked(pref->WinStartup()); + m_ui->checkAssociateTorrents->setChecked(Preferences::isTorrentFileAssocSet()); + m_ui->checkAssociateMagnetLinks->setChecked(Preferences::isMagnetLinkAssocSet()); +#endif +#ifdef Q_OS_MAC + m_ui->checkAssociateTorrents->setChecked(Preferences::isTorrentFileAssocSet()); + m_ui->checkAssociateTorrents->setEnabled(!m_ui->checkAssociateTorrents->isChecked()); + m_ui->checkAssociateMagnetLinks->setChecked(Preferences::isMagnetLinkAssocSet()); + m_ui->checkAssociateMagnetLinks->setEnabled(!m_ui->checkAssociateMagnetLinks->isChecked()); +#endif + + const Application * const app = static_cast(QCoreApplication::instance()); + m_ui->checkFileLog->setChecked(app->isFileLoggerEnabled()); + m_ui->textFileLogPath->setText(Utils::Fs::toNativePath(app->fileLoggerPath())); + fileLogBackup = app->isFileLoggerBackup(); + m_ui->checkFileLogBackup->setChecked(fileLogBackup); + m_ui->spinFileLogSize->setEnabled(fileLogBackup); + fileLogDelete = app->isFileLoggerDeleteOld(); + m_ui->checkFileLogDelete->setChecked(fileLogDelete); + m_ui->spinFileLogAge->setEnabled(fileLogDelete); + m_ui->comboFileLogAgeType->setEnabled(fileLogDelete); + m_ui->spinFileLogSize->setValue(app->fileLoggerMaxSize()); + m_ui->spinFileLogAge->setValue(app->fileLoggerAge()); + m_ui->comboFileLogAgeType->setCurrentIndex(app->fileLoggerAgeType()); + // End General preferences + + auto session = BitTorrent::Session::instance(); + + // Downloads preferences + m_ui->checkAdditionDialog->setChecked(AddNewTorrentDialog::isEnabled()); + m_ui->checkAdditionDialogFront->setChecked(AddNewTorrentDialog::isTopLevel()); + m_ui->checkStartPaused->setChecked(session->isAddTorrentPaused()); + const TorrentFileGuard::AutoDeleteMode autoDeleteMode = TorrentFileGuard::autoDeleteMode(); + m_ui->deleteTorrentBox->setChecked(autoDeleteMode != TorrentFileGuard::Never); + m_ui->deleteCancelledTorrentBox->setChecked(autoDeleteMode == TorrentFileGuard::Always); + + m_ui->textSavePath->setText(Utils::Fs::toNativePath(session->defaultSavePath())); + m_ui->checkUseSubcategories->setChecked(session->isSubcategoriesEnabled()); + m_ui->comboSavingMode->setCurrentIndex(!session->isAutoTMMDisabledByDefault()); + m_ui->comboTorrentCategoryChanged->setCurrentIndex(session->isDisableAutoTMMWhenCategoryChanged()); + m_ui->comboCategoryChanged->setCurrentIndex(session->isDisableAutoTMMWhenCategorySavePathChanged()); + m_ui->comboCategoryDefaultPathChanged->setCurrentIndex(session->isDisableAutoTMMWhenDefaultSavePathChanged()); + m_ui->checkTempFolder->setChecked(session->isTempPathEnabled()); + m_ui->textTempPath->setEnabled(m_ui->checkTempFolder->isChecked()); + m_ui->browseTempDirButton->setEnabled(m_ui->checkTempFolder->isChecked()); + m_ui->textTempPath->setText(Utils::Fs::toNativePath(session->tempPath())); + m_ui->checkAppendqB->setChecked(session->isAppendExtensionEnabled()); + m_ui->checkPreallocateAll->setChecked(session->isPreallocationEnabled()); + + strValue = Utils::Fs::toNativePath(session->torrentExportDirectory()); + if (strValue.isEmpty()) { + // Disable + m_ui->checkExportDir->setChecked(false); + m_ui->textExportDir->setEnabled(false); + m_ui->browseExportDirButton->setEnabled(false); + } + else { + // Enable + m_ui->checkExportDir->setChecked(true); + m_ui->textExportDir->setEnabled(true); + m_ui->browseExportDirButton->setEnabled(true); + m_ui->textExportDir->setText(strValue); + } + + strValue = Utils::Fs::toNativePath(session->finishedTorrentExportDirectory()); + if (strValue.isEmpty()) { + // Disable + m_ui->checkExportDirFin->setChecked(false); + m_ui->textExportDirFin->setEnabled(false); + m_ui->browseExportDirFinButton->setEnabled(false); + } + else { + // Enable + m_ui->checkExportDirFin->setChecked(true); + m_ui->textExportDirFin->setEnabled(true); + m_ui->browseExportDirFinButton->setEnabled(true); + m_ui->textExportDirFin->setText(strValue); + } + + m_ui->groupMailNotification->setChecked(pref->isMailNotificationEnabled()); + m_ui->dest_email_txt->setText(pref->getMailNotificationEmail()); + m_ui->smtp_server_txt->setText(pref->getMailNotificationSMTP()); + m_ui->checkSmtpSSL->setChecked(pref->getMailNotificationSMTPSSL()); + m_ui->groupMailNotifAuth->setChecked(pref->getMailNotificationSMTPAuth()); + m_ui->mailNotifUsername->setText(pref->getMailNotificationSMTPUsername()); + m_ui->mailNotifPassword->setText(pref->getMailNotificationSMTPPassword()); + + m_ui->autoRunBox->setChecked(pref->isAutoRunEnabled()); + m_ui->autoRun_txt->setText(pref->getAutoRunProgram()); + intValue = pref->getActionOnDblClOnTorrentDl(); + if (intValue >= m_ui->actionTorrentDlOnDblClBox->count()) + intValue = 0; + m_ui->actionTorrentDlOnDblClBox->setCurrentIndex(intValue); + intValue = pref->getActionOnDblClOnTorrentFn(); + if (intValue >= m_ui->actionTorrentFnOnDblClBox->count()) + intValue = 1; + m_ui->actionTorrentFnOnDblClBox->setCurrentIndex(intValue); + // End Downloads preferences + + // Connection preferences + m_ui->checkUPnP->setChecked(Net::PortForwarder::instance()->isEnabled()); + m_ui->checkRandomPort->setChecked(session->useRandomPort()); + m_ui->spinPort->setValue(session->port()); + m_ui->spinPort->setDisabled(m_ui->checkRandomPort->isChecked()); + + intValue = session->maxConnections(); + if (intValue > 0) { + // enable + m_ui->checkMaxConnecs->setChecked(true); + m_ui->spinMaxConnec->setEnabled(true); + m_ui->spinMaxConnec->setValue(intValue); + } + else { + // disable + m_ui->checkMaxConnecs->setChecked(false); + m_ui->spinMaxConnec->setEnabled(false); + } + intValue = session->maxConnectionsPerTorrent(); + if (intValue > 0) { + // enable + m_ui->checkMaxConnecsPerTorrent->setChecked(true); + m_ui->spinMaxConnecPerTorrent->setEnabled(true); + m_ui->spinMaxConnecPerTorrent->setValue(intValue); + } + else { + // disable + m_ui->checkMaxConnecsPerTorrent->setChecked(false); + m_ui->spinMaxConnecPerTorrent->setEnabled(false); + } + intValue = session->maxUploads(); + if (intValue > 0) { + // enable + m_ui->checkMaxUploads->setChecked(true); + m_ui->spinMaxUploads->setEnabled(true); + m_ui->spinMaxUploads->setValue(intValue); + } + else { + // disable + m_ui->checkMaxUploads->setChecked(false); + m_ui->spinMaxUploads->setEnabled(false); + } + intValue = session->maxUploadsPerTorrent(); + if (intValue > 0) { + // enable + m_ui->checkMaxUploadsPerTorrent->setChecked(true); + m_ui->spinMaxUploadsPerTorrent->setEnabled(true); + m_ui->spinMaxUploadsPerTorrent->setValue(intValue); + } + else { + // disable + m_ui->checkMaxUploadsPerTorrent->setChecked(false); + m_ui->spinMaxUploadsPerTorrent->setEnabled(false); + } + + auto proxyConfigManager = Net::ProxyConfigurationManager::instance(); + Net::ProxyConfiguration proxyConf = proxyConfigManager->proxyConfiguration(); + using Net::ProxyType; + bool useProxyAuth = false; + switch (proxyConf.type) { + case ProxyType::SOCKS4: + m_ui->comboProxyType->setCurrentIndex(1); + break; + + case ProxyType::SOCKS5_PW: + useProxyAuth = true; + // fallthrough + case ProxyType::SOCKS5: + m_ui->comboProxyType->setCurrentIndex(2); + break; + + case ProxyType::HTTP_PW: + useProxyAuth = true; + // fallthrough + case ProxyType::HTTP: + m_ui->comboProxyType->setCurrentIndex(3); + break; + + default: + m_ui->comboProxyType->setCurrentIndex(0); + } + m_ui->textProxyIP->setText(proxyConf.ip); + m_ui->spinProxyPort->setValue(proxyConf.port); + m_ui->checkProxyAuth->setChecked(useProxyAuth); + m_ui->textProxyUsername->setText(proxyConf.username); + m_ui->textProxyPassword->setText(proxyConf.password); + + m_ui->checkProxyPeerConnecs->setChecked(session->isProxyPeerConnectionsEnabled()); + m_ui->checkForceProxy->setChecked(session->isForceProxyEnabled()); + m_ui->isProxyOnlyForTorrents->setChecked(proxyConfigManager->isProxyOnlyForTorrents()); + enableProxy(m_ui->comboProxyType->currentIndex()); + + m_ui->checkIPFilter->setChecked(session->isIPFilteringEnabled()); + m_ui->checkIpFilterTrackers->setChecked(session->isTrackerFilteringEnabled()); + m_ui->textFilterPath->setText(Utils::Fs::toNativePath(session->IPFilterFile())); + // End Connection preferences + + // Speed preferences + intValue = session->globalDownloadSpeedLimit() / 1024; + if (intValue > 0) { + // Enabled + m_ui->checkDownloadLimit->setChecked(true); + m_ui->spinDownloadLimit->setEnabled(true); + m_ui->spinDownloadLimit->setValue(intValue); + } + else { + // Disabled + m_ui->checkDownloadLimit->setChecked(false); + m_ui->spinDownloadLimit->setEnabled(false); + } + intValue = session->globalUploadSpeedLimit() / 1024; + if (intValue > 0) { + // Enabled + m_ui->checkUploadLimit->setChecked(true); + m_ui->spinUploadLimit->setEnabled(true); + m_ui->spinUploadLimit->setValue(intValue); + } + else { + // Disabled + m_ui->checkUploadLimit->setChecked(false); + m_ui->spinUploadLimit->setEnabled(false); + } + + intValue = session->altGlobalDownloadSpeedLimit() / 1024; + if (intValue > 0) { + // Enabled + m_ui->checkDownloadLimitAlt->setChecked(true); + m_ui->spinDownloadLimitAlt->setEnabled(true); + m_ui->spinDownloadLimitAlt->setValue(intValue); + } + else { + // Disabled + m_ui->checkDownloadLimitAlt->setChecked(false); + m_ui->spinDownloadLimitAlt->setEnabled(false); + } + intValue = session->altGlobalUploadSpeedLimit() / 1024; + if (intValue > 0) { + // Enabled + m_ui->checkUploadLimitAlt->setChecked(true); + m_ui->spinUploadLimitAlt->setEnabled(true); + m_ui->spinUploadLimitAlt->setValue(intValue); + } + else { + // Disabled + m_ui->checkUploadLimitAlt->setChecked(false); + m_ui->spinUploadLimitAlt->setEnabled(false); + } + + m_ui->checkuTP->setChecked(session->isUTPEnabled()); + m_ui->checkLimituTPConnections->setEnabled(m_ui->checkuTP->isChecked()); + m_ui->checkLimituTPConnections->setChecked(session->isUTPRateLimited()); + m_ui->checkLimitTransportOverhead->setChecked(session->includeOverheadInLimits()); + m_ui->checkLimitLocalPeerRate->setChecked(!session->ignoreLimitsOnLAN()); + + m_ui->check_schedule->setChecked(session->isBandwidthSchedulerEnabled()); + m_ui->schedule_from->setTime(pref->getSchedulerStartTime()); + m_ui->schedule_to->setTime(pref->getSchedulerEndTime()); + m_ui->schedule_days->setCurrentIndex((int)pref->getSchedulerDays()); + // End Speed preferences + + // Bittorrent preferences + m_ui->checkDHT->setChecked(session->isDHTEnabled()); + m_ui->checkPeX->setChecked(session->isPeXEnabled()); + m_ui->checkLSD->setChecked(session->isLSDEnabled()); + m_ui->comboEncryption->setCurrentIndex(session->encryption()); + m_ui->checkAnonymousMode->setChecked(session->isAnonymousModeEnabled()); + m_ui->checkEnableAddTrackers->setChecked(session->isAddTrackersEnabled()); + m_ui->textTrackers->setPlainText(session->additionalTrackers()); + + m_ui->checkEnableQueueing->setChecked(session->isQueueingSystemEnabled()); + m_ui->spinMaxActiveDownloads->setValue(session->maxActiveDownloads()); + m_ui->spinMaxActiveUploads->setValue(session->maxActiveUploads()); + m_ui->spinMaxActiveTorrents->setValue(session->maxActiveTorrents()); + m_ui->checkIgnoreSlowTorrentsForQueueing->setChecked(session->ignoreSlowTorrentsForQueueing()); + + if (session->globalMaxRatio() >= 0.) { + // Enable + m_ui->checkMaxRatio->setChecked(true); + m_ui->spinMaxRatio->setEnabled(true); + m_ui->comboRatioLimitAct->setEnabled(true); + m_ui->spinMaxRatio->setValue(session->globalMaxRatio()); + } + else { + // Disable + m_ui->checkMaxRatio->setChecked(false); + m_ui->spinMaxRatio->setEnabled(false); + m_ui->comboRatioLimitAct->setEnabled(false); + } + m_ui->comboRatioLimitAct->setCurrentIndex(session->maxRatioAction()); + // End Bittorrent preferences + + // Web UI preferences + m_ui->textServerDomains->setText(pref->getServerDomains()); + m_ui->checkWebUi->setChecked(pref->isWebUiEnabled()); + m_ui->spinWebUiPort->setValue(pref->getWebUiPort()); + m_ui->checkWebUIUPnP->setChecked(pref->useUPnPForWebUIPort()); + m_ui->checkWebUiHttps->setChecked(pref->isWebUiHttpsEnabled()); + setSslCertificate(pref->getWebUiHttpsCertificate(), false); + setSslKey(pref->getWebUiHttpsKey(), false); + m_ui->textWebUiUsername->setText(pref->getWebUiUsername()); + m_ui->textWebUiPassword->setText(pref->getWebUiPassword()); + m_ui->checkBypassLocalAuth->setChecked(!pref->isWebUiLocalAuthEnabled()); + + m_ui->checkDynDNS->setChecked(pref->isDynDNSEnabled()); + m_ui->comboDNSService->setCurrentIndex((int)pref->getDynDNSService()); + m_ui->domainNameTxt->setText(pref->getDynDomainName()); + m_ui->DNSUsernameTxt->setText(pref->getDynDNSUsername()); + m_ui->DNSPasswordTxt->setText(pref->getDynDNSPassword()); + // End Web UI preferences +} + +// return min & max ports +// [min, max] +int OptionsDialog::getPort() const +{ + return m_ui->spinPort->value(); +} + +void OptionsDialog::on_randomButton_clicked() +{ + // Range [1024: 65535] + m_ui->spinPort->setValue(Utils::Random::rand(1024, 65535)); +} + +int OptionsDialog::getEncryptionSetting() const +{ + return m_ui->comboEncryption->currentIndex(); +} + +int OptionsDialog::getMaxActiveDownloads() const +{ + return m_ui->spinMaxActiveDownloads->value(); +} + +int OptionsDialog::getMaxActiveUploads() const +{ + return m_ui->spinMaxActiveUploads->value(); +} + +int OptionsDialog::getMaxActiveTorrents() const +{ + return m_ui->spinMaxActiveTorrents->value(); +} + +bool OptionsDialog::minimizeToTray() const +{ + if (!m_ui->checkShowSystray->isChecked()) return false; + return m_ui->checkMinimizeToSysTray->isChecked(); +} + +bool OptionsDialog::closeToTray() const +{ + if (!m_ui->checkShowSystray->isChecked()) return false; + return m_ui->checkCloseToSystray->isChecked(); +} + +bool OptionsDialog::isQueueingSystemEnabled() const +{ + return m_ui->checkEnableQueueing->isChecked(); +} + +bool OptionsDialog::isDHTEnabled() const +{ + return m_ui->checkDHT->isChecked(); +} + +bool OptionsDialog::isLSDEnabled() const +{ + return m_ui->checkLSD->isChecked(); +} + +bool OptionsDialog::isUPnPEnabled() const +{ + return m_ui->checkUPnP->isChecked(); +} + +// Return Download & Upload limits in kbps +// [download,upload] +QPair OptionsDialog::getGlobalBandwidthLimits() const +{ + int DL = 0, UP = 0; + if (m_ui->checkDownloadLimit->isChecked()) + DL = m_ui->spinDownloadLimit->value() * 1024; + if (m_ui->checkUploadLimit->isChecked()) + UP = m_ui->spinUploadLimit->value() * 1024; + return qMakePair(DL, UP); +} + +// Return alternate Download & Upload limits in kbps +// [download,upload] +QPair OptionsDialog::getAltGlobalBandwidthLimits() const +{ + int DL = 0, UP = 0; + if (m_ui->checkDownloadLimitAlt->isChecked()) + DL = m_ui->spinDownloadLimitAlt->value() * 1024; + if (m_ui->checkUploadLimitAlt->isChecked()) + UP = m_ui->spinUploadLimitAlt->value() * 1024; + return qMakePair(DL, UP); +} + +bool OptionsDialog::startMinimized() const +{ + return m_ui->checkStartMinimized->isChecked(); +} + +bool OptionsDialog::systrayIntegration() const +{ + if (!QSystemTrayIcon::isSystemTrayAvailable()) return false; + return m_ui->checkShowSystray->isChecked(); +} + +// Return Share ratio +qreal OptionsDialog::getMaxRatio() const +{ + if (m_ui->checkMaxRatio->isChecked()) + return m_ui->spinMaxRatio->value(); + return -1; +} + +// Return max connections number +int OptionsDialog::getMaxConnecs() const +{ + if (!m_ui->checkMaxConnecs->isChecked()) + return -1; + else + return m_ui->spinMaxConnec->value(); +} + +int OptionsDialog::getMaxConnecsPerTorrent() const +{ + if (!m_ui->checkMaxConnecsPerTorrent->isChecked()) + return -1; + else + return m_ui->spinMaxConnecPerTorrent->value(); +} + +int OptionsDialog::getMaxUploads() const +{ + if (!m_ui->checkMaxUploads->isChecked()) + return -1; + else + return m_ui->spinMaxUploads->value(); +} + +int OptionsDialog::getMaxUploadsPerTorrent() const +{ + if (!m_ui->checkMaxUploadsPerTorrent->isChecked()) + return -1; + else + return m_ui->spinMaxUploadsPerTorrent->value(); +} + +void OptionsDialog::on_buttonBox_accepted() +{ + if (applyButton->isEnabled()) { + if (!schedTimesOk()) { + m_ui->tabSelection->setCurrentRow(TAB_SPEED); + return; + } + if (!webUIAuthenticationOk()) { + m_ui->tabSelection->setCurrentRow(TAB_WEBUI); + return; + } + applyButton->setEnabled(false); + this->hide(); + saveOptions(); + } + saveWindowState(); + accept(); +} + +void OptionsDialog::applySettings(QAbstractButton* button) +{ + if (button == applyButton) { + if (!schedTimesOk()) { + m_ui->tabSelection->setCurrentRow(TAB_SPEED); + return; + } + if (!webUIAuthenticationOk()) { + m_ui->tabSelection->setCurrentRow(TAB_WEBUI); + return; + } + saveOptions(); + } +} + +void OptionsDialog::closeEvent(QCloseEvent *e) +{ + setAttribute(Qt::WA_DeleteOnClose); + e->accept(); +} + +void OptionsDialog::on_buttonBox_rejected() +{ + setAttribute(Qt::WA_DeleteOnClose); + reject(); +} + +bool OptionsDialog::useAdditionDialog() const +{ + return m_ui->checkAdditionDialog->isChecked(); +} + +void OptionsDialog::enableApplyButton() +{ + applyButton->setEnabled(true); +} + +void OptionsDialog::enableProxy(int index) +{ + if (index) { + //enable + m_ui->lblProxyIP->setEnabled(true); + m_ui->textProxyIP->setEnabled(true); + m_ui->lblProxyPort->setEnabled(true); + m_ui->spinProxyPort->setEnabled(true); + m_ui->checkProxyPeerConnecs->setEnabled(true); + m_ui->checkForceProxy->setEnabled(true); + if (index > 1) { + m_ui->checkProxyAuth->setEnabled(true); + m_ui->isProxyOnlyForTorrents->setEnabled(true); + } + else { + m_ui->checkProxyAuth->setEnabled(false); + m_ui->checkProxyAuth->setChecked(false); + m_ui->isProxyOnlyForTorrents->setEnabled(false); + m_ui->isProxyOnlyForTorrents->setChecked(true); + } + } + else { + //disable + m_ui->lblProxyIP->setEnabled(false); + m_ui->textProxyIP->setEnabled(false); + m_ui->lblProxyPort->setEnabled(false); + m_ui->spinProxyPort->setEnabled(false); + m_ui->checkProxyPeerConnecs->setEnabled(false); + m_ui->checkForceProxy->setEnabled(false); + m_ui->isProxyOnlyForTorrents->setEnabled(false); + m_ui->checkProxyAuth->setEnabled(false); + m_ui->checkProxyAuth->setChecked(false); + } +} + +bool OptionsDialog::isSlashScreenDisabled() const +{ + return !m_ui->checkShowSplash->isChecked(); +} + +#ifdef Q_OS_WIN +bool OptionsDialog::WinStartup() const +{ + return m_ui->checkStartup->isChecked(); +} +#endif + +bool OptionsDialog::preventFromSuspend() const +{ + return m_ui->checkPreventFromSuspend->isChecked(); +} + +bool OptionsDialog::preAllocateAllFiles() const +{ + return m_ui->checkPreallocateAll->isChecked(); +} + +bool OptionsDialog::addTorrentsInPause() const +{ + return m_ui->checkStartPaused->isChecked(); +} + +// Proxy settings +bool OptionsDialog::isProxyEnabled() const +{ + return m_ui->comboProxyType->currentIndex(); +} + +bool OptionsDialog::isProxyAuthEnabled() const +{ + return m_ui->checkProxyAuth->isChecked(); +} + +QString OptionsDialog::getProxyIp() const +{ + return m_ui->textProxyIP->text().trimmed(); +} + +unsigned short OptionsDialog::getProxyPort() const +{ + return m_ui->spinProxyPort->value(); +} + +QString OptionsDialog::getProxyUsername() const +{ + QString username = m_ui->textProxyUsername->text().trimmed(); + return username; +} + +QString OptionsDialog::getProxyPassword() const +{ + QString password = m_ui->textProxyPassword->text(); + password = password.trimmed(); + return password; +} + +// Locale Settings +QString OptionsDialog::getLocale() const +{ + return m_ui->comboI18n->itemData(m_ui->comboI18n->currentIndex(), Qt::UserRole).toString(); +} + +void OptionsDialog::setLocale(const QString &localeStr) +{ + QString name; + if (localeStr.startsWith("eo", Qt::CaseInsensitive)) { + name = "eo"; + } + else { + QLocale locale(localeStr); + if (locale.language() == QLocale::Uzbek) + name = "uz@Latn"; + else + name = locale.name(); + } + // Attempt to find exact match + int index = m_ui->comboI18n->findData(name, Qt::UserRole); + if (index < 0) { + //Attempt to find a language match without a country + int pos = name.indexOf('_'); + if (pos > -1) { + QString lang = name.left(pos); + index = m_ui->comboI18n->findData(lang, Qt::UserRole); + } + } + if (index < 0) { + // Unrecognized, use US English + index = m_ui->comboI18n->findData("en", Qt::UserRole); + Q_ASSERT(index >= 0); + } + m_ui->comboI18n->setCurrentIndex(index); +} + +QString OptionsDialog::getTorrentExportDir() const +{ + if (m_ui->checkExportDir->isChecked()) + return Utils::Fs::expandPathAbs(m_ui->textExportDir->text()); + return QString(); +} + +QString OptionsDialog::getFinishedTorrentExportDir() const +{ + if (m_ui->checkExportDirFin->isChecked()) + return Utils::Fs::expandPathAbs(m_ui->textExportDirFin->text()); + return QString(); +} + +// Return action on double-click on a downloading torrent set in options +int OptionsDialog::getActionOnDblClOnTorrentDl() const +{ + if (m_ui->actionTorrentDlOnDblClBox->currentIndex() < 1) + return 0; + return m_ui->actionTorrentDlOnDblClBox->currentIndex(); +} + +// Return action on double-click on a finished torrent set in options +int OptionsDialog::getActionOnDblClOnTorrentFn() const +{ + if (m_ui->actionTorrentFnOnDblClBox->currentIndex() < 1) + return 0; + return m_ui->actionTorrentFnOnDblClBox->currentIndex(); +} + +void OptionsDialog::on_addScanFolderButton_clicked() +{ + Preferences* const pref = Preferences::instance(); + const QString dir = QFileDialog::getExistingDirectory(this, tr("Select folder to monitor"), + Utils::Fs::toNativePath(Utils::Fs::folderName(pref->getScanDirsLastPath()))); + if (!dir.isEmpty()) { + const ScanFoldersModel::PathStatus status = ScanFoldersModel::instance()->addPath(dir, ScanFoldersModel::DEFAULT_LOCATION, QString(), false); + QString error; + switch (status) { + case ScanFoldersModel::AlreadyInList: + error = tr("Folder is already being monitored:"); + break; + case ScanFoldersModel::DoesNotExist: + error = tr("Folder does not exist:"); + break; + case ScanFoldersModel::CannotRead: + error = tr("Folder is not readable:"); + break; + default: + pref->setScanDirsLastPath(dir); + addedScanDirs << dir; + for (int i = 0; i < ScanFoldersModel::instance()->columnCount(); ++i) + m_ui->scanFoldersView->resizeColumnToContents(i); + enableApplyButton(); + } + + if (!error.isEmpty()) + QMessageBox::critical(this, tr("Adding entry failed"), QString("%1\n%2").arg(error).arg(dir)); + } +} + +void OptionsDialog::on_removeScanFolderButton_clicked() +{ + const QModelIndexList selected + = m_ui->scanFoldersView->selectionModel()->selectedIndexes(); + if (selected.isEmpty()) + return; + Q_ASSERT(selected.count() == ScanFoldersModel::instance()->columnCount()); + foreach (const QModelIndex &index, selected) { + if (index.column() == ScanFoldersModel::WATCH) + removedScanDirs << index.data().toString(); + } + ScanFoldersModel::instance()->removePath(selected.first().row(), false); +} + +void OptionsDialog::handleScanFolderViewSelectionChanged() +{ + m_ui->removeScanFolderButton->setEnabled(!m_ui->scanFoldersView->selectionModel()->selectedIndexes().isEmpty()); +} + +QString OptionsDialog::askForExportDir(const QString& currentExportPath) +{ + QDir currentExportDir(Utils::Fs::expandPathAbs(currentExportPath)); + QString dir; + if (!currentExportPath.isEmpty() && currentExportDir.exists()) + dir = QFileDialog::getExistingDirectory(this, tr("Choose export directory"), currentExportDir.absolutePath()); + else + dir = QFileDialog::getExistingDirectory(this, tr("Choose export directory"), QDir::homePath()); + return dir; +} + +void OptionsDialog::on_browseFileLogDir_clicked() +{ + const QString path = Utils::Fs::expandPathAbs(Utils::Fs::fromNativePath(m_ui->textFileLogPath->text())); + QDir pathDir(path); + QString dir; + if (!path.isEmpty() && pathDir.exists()) + dir = QFileDialog::getExistingDirectory(this, tr("Choose a save directory"), pathDir.absolutePath()); + else + dir = QFileDialog::getExistingDirectory(this, tr("Choose a save directory"), QDir::homePath()); + if (!dir.isNull()) + m_ui->textFileLogPath->setText(Utils::Fs::toNativePath(dir)); +} + +void OptionsDialog::on_browseExportDirButton_clicked() +{ + const QString newExportDir = askForExportDir(m_ui->textExportDir->text()); + if (!newExportDir.isNull()) + m_ui->textExportDir->setText(Utils::Fs::toNativePath(newExportDir)); +} + +void OptionsDialog::on_browseExportDirFinButton_clicked() +{ + const QString newExportDir = askForExportDir(m_ui->textExportDirFin->text()); + if (!newExportDir.isNull()) + m_ui->textExportDirFin->setText(Utils::Fs::toNativePath(newExportDir)); +} + +void OptionsDialog::on_browseFilterButton_clicked() +{ + QDir lastDir(Utils::Fs::fromNativePath(m_ui->textFilterPath->text())); + QString lastPath = lastDir.exists() ? lastDir.absolutePath() : QDir::homePath(); + QString newPath = QFileDialog::getOpenFileName(this, tr("Choose an IP filter file"), lastPath, tr("All supported filters") + QString(" (*.dat *.p2p *.p2b);;.dat (*.dat);;.p2p (*.p2p);;.p2b (*.p2b)")); + if (!newPath.isEmpty()) + m_ui->textFilterPath->setText(Utils::Fs::toNativePath(newPath)); +} + +// Display dialog to choose save dir +void OptionsDialog::on_browseSaveDirButton_clicked() +{ + const QString save_path = Utils::Fs::expandPathAbs(m_ui->textSavePath->text()); + QDir saveDir(save_path); + QString dir; + if (!save_path.isEmpty() && saveDir.exists()) + dir = QFileDialog::getExistingDirectory(this, tr("Choose a save directory"), saveDir.absolutePath()); + else + dir = QFileDialog::getExistingDirectory(this, tr("Choose a save directory"), QDir::homePath()); + if (!dir.isNull()) + m_ui->textSavePath->setText(Utils::Fs::toNativePath(dir)); +} + +void OptionsDialog::on_browseTempDirButton_clicked() +{ + const QString temp_path = Utils::Fs::expandPathAbs(m_ui->textTempPath->text()); + QDir tempDir(temp_path); + QString dir; + if (!temp_path.isEmpty() && tempDir.exists()) + dir = QFileDialog::getExistingDirectory(this, tr("Choose a save directory"), tempDir.absolutePath()); + else + dir = QFileDialog::getExistingDirectory(this, tr("Choose a save directory"), QDir::homePath()); + if (!dir.isNull()) + m_ui->textTempPath->setText(Utils::Fs::toNativePath(dir)); +} + +// Return Filter object to apply to BT session +QString OptionsDialog::getFilter() const +{ + return Utils::Fs::fromNativePath(m_ui->textFilterPath->text()); +} + +// Web UI + +bool OptionsDialog::isWebUiEnabled() const +{ + return m_ui->checkWebUi->isChecked(); +} + +quint16 OptionsDialog::webUiPort() const +{ + return m_ui->spinWebUiPort->value(); +} + +QString OptionsDialog::webUiUsername() const +{ + return m_ui->textWebUiUsername->text(); +} + +QString OptionsDialog::webUiPassword() const +{ + return m_ui->textWebUiPassword->text(); +} + +void OptionsDialog::showConnectionTab() +{ + m_ui->tabSelection->setCurrentRow(TAB_CONNECTION); +} + +void OptionsDialog::on_btnWebUiCrt_clicked() +{ + QString filename = QFileDialog::getOpenFileName(this, QString(), QString(), tr("SSL Certificate") + QString(" (*.crt *.pem)")); + if (filename.isNull()) + return; + QFile file(filename); + if (file.open(QIODevice::ReadOnly)) { + setSslCertificate(file.readAll()); + file.close(); + } +} + +void OptionsDialog::on_btnWebUiKey_clicked() +{ + QString filename = QFileDialog::getOpenFileName(this, QString(), QString(), tr("SSL Key") + QString(" (*.key *.pem)")); + if (filename.isNull()) + return; + QFile file(filename); + if (file.open(QIODevice::ReadOnly)) { + setSslKey(file.readAll()); + file.close(); + } +} + +void OptionsDialog::on_registerDNSBtn_clicked() +{ + QDesktopServices::openUrl(Net::DNSUpdater::getRegistrationUrl(m_ui->comboDNSService->currentIndex())); +} + +void OptionsDialog::on_IpFilterRefreshBtn_clicked() +{ + if (m_refreshingIpFilter) return; + m_refreshingIpFilter = true; + // Updating program preferences + BitTorrent::Session *const session = BitTorrent::Session::instance(); + session->setIPFilteringEnabled(true); + session->setIPFilterFile(""); // forcing Session reload filter file + session->setIPFilterFile(getFilter()); + connect(session, SIGNAL(IPFilterParsed(bool, int)), SLOT(handleIPFilterParsed(bool, int))); + setCursor(QCursor(Qt::WaitCursor)); +} + +void OptionsDialog::handleIPFilterParsed(bool error, int ruleCount) +{ + setCursor(QCursor(Qt::ArrowCursor)); + if (error) + QMessageBox::warning(this, tr("Parsing error"), tr("Failed to parse the provided IP filter")); + else + QMessageBox::information(this, tr("Successfully refreshed"), tr("Successfully parsed the provided IP filter: %1 rules were applied.", "%1 is a number").arg(ruleCount)); + m_refreshingIpFilter = false; + disconnect(BitTorrent::Session::instance(), SIGNAL(IPFilterParsed(bool, int)), this, SLOT(handleIPFilterParsed(bool, int))); +} + +QString OptionsDialog::languageToLocalizedString(const QLocale &locale) +{ + switch (locale.language()) { + case QLocale::English: { + if (locale.country() == QLocale::Australia) + return QString::fromUtf8(C_LOCALE_ENGLISH_AUSTRALIA); + else if (locale.country() == QLocale::UnitedKingdom) + return QString::fromUtf8(C_LOCALE_ENGLISH_UNITEDKINGDOM); + return QString::fromUtf8(C_LOCALE_ENGLISH); + } + case QLocale::French: return QString::fromUtf8(C_LOCALE_FRENCH); + case QLocale::German: return QString::fromUtf8(C_LOCALE_GERMAN); + case QLocale::Hungarian: return QString::fromUtf8(C_LOCALE_HUNGARIAN); + case QLocale::Icelandic: return QString::fromUtf8(C_LOCALE_ICELANDIC); + case QLocale::Indonesian: return QString::fromUtf8(C_LOCALE_INDONESIAN); + case QLocale::Italian: return QString::fromUtf8(C_LOCALE_ITALIAN); + case QLocale::Dutch: return QString::fromUtf8(C_LOCALE_DUTCH); + case QLocale::Spanish: return QString::fromUtf8(C_LOCALE_SPANISH); + case QLocale::Catalan: return QString::fromUtf8(C_LOCALE_CATALAN); + case QLocale::Galician: return QString::fromUtf8(C_LOCALE_GALICIAN); + case QLocale::Occitan: return QString::fromUtf8(C_LOCALE_OCCITAN); + case QLocale::Portuguese: { + if (locale.country() == QLocale::Brazil) + return QString::fromUtf8(C_LOCALE_PORTUGUESE_BRAZIL); + return QString::fromUtf8(C_LOCALE_PORTUGUESE); + } + case QLocale::Polish: return QString::fromUtf8(C_LOCALE_POLISH); + case QLocale::Latvian: return QString::fromUtf8(C_LOCALE_LATVIAN); + case QLocale::Lithuanian: return QString::fromUtf8(C_LOCALE_LITHUANIAN); + case QLocale::Malay: return QString::fromUtf8(C_LOCALE_MALAY); + case QLocale::Czech: return QString::fromUtf8(C_LOCALE_CZECH); + case QLocale::Slovak: return QString::fromUtf8(C_LOCALE_SLOVAK); + case QLocale::Slovenian: return QString::fromUtf8(C_LOCALE_SLOVENIAN); + case QLocale::Serbian: return QString::fromUtf8(C_LOCALE_SERBIAN); + case QLocale::Croatian: return QString::fromUtf8(C_LOCALE_CROATIAN); + case QLocale::Armenian: return QString::fromUtf8(C_LOCALE_ARMENIAN); + case QLocale::Romanian: return QString::fromUtf8(C_LOCALE_ROMANIAN); + case QLocale::Turkish: return QString::fromUtf8(C_LOCALE_TURKISH); + case QLocale::Greek: return QString::fromUtf8(C_LOCALE_GREEK); + case QLocale::Swedish: return QString::fromUtf8(C_LOCALE_SWEDISH); + case QLocale::Finnish: return QString::fromUtf8(C_LOCALE_FINNISH); + case QLocale::Norwegian: return QString::fromUtf8(C_LOCALE_NORWEGIAN); + case QLocale::Danish: return QString::fromUtf8(C_LOCALE_DANISH); + case QLocale::Bulgarian: return QString::fromUtf8(C_LOCALE_BULGARIAN); + case QLocale::Ukrainian: return QString::fromUtf8(C_LOCALE_UKRAINIAN); + case QLocale::Uzbek: return QString::fromUtf8(C_LOCALE_UZBEK); + case QLocale::Russian: return QString::fromUtf8(C_LOCALE_RUSSIAN); + case QLocale::Japanese: return QString::fromUtf8(C_LOCALE_JAPANESE); + case QLocale::Hebrew: return QString::fromUtf8(C_LOCALE_HEBREW); + case QLocale::Hindi: return QString::fromUtf8(C_LOCALE_HINDI); + case QLocale::Arabic: return QString::fromUtf8(C_LOCALE_ARABIC); + case QLocale::Georgian: return QString::fromUtf8(C_LOCALE_GEORGIAN); + case QLocale::Byelorussian: return QString::fromUtf8(C_LOCALE_BYELORUSSIAN); + case QLocale::Basque: return QString::fromUtf8(C_LOCALE_BASQUE); + case QLocale::Vietnamese: return QString::fromUtf8(C_LOCALE_VIETNAMESE); + case QLocale::Chinese: { + switch (locale.country()) { + case QLocale::China: + return QString::fromUtf8(C_LOCALE_CHINESE_SIMPLIFIED); + case QLocale::HongKong: + return QString::fromUtf8(C_LOCALE_CHINESE_TRADITIONAL_HK); + default: + return QString::fromUtf8(C_LOCALE_CHINESE_TRADITIONAL_TW); + + } + } + case QLocale::Korean: return QString::fromUtf8(C_LOCALE_KOREAN); + default: { + // Fallback to English + const QString eng_lang = QLocale::languageToString(locale.language()); + qWarning() << "Unrecognized language name: " << eng_lang; + return eng_lang; + } + } +} + +void OptionsDialog::setSslKey(const QByteArray &key, bool interactive) +{ +#ifndef QT_NO_OPENSSL + if (!key.isEmpty() && !QSslKey(key, QSsl::Rsa).isNull()) { + m_ui->lblSslKeyStatus->setPixmap(QPixmap(":/icons/oxygen/security-high.png").scaledToHeight(20, Qt::SmoothTransformation)); + m_sslKey = key; + } + else { + m_ui->lblSslKeyStatus->setPixmap(QPixmap(":/icons/oxygen/security-low.png").scaledToHeight(20, Qt::SmoothTransformation)); + m_sslKey.clear(); + if (interactive) + QMessageBox::warning(this, tr("Invalid key"), tr("This is not a valid SSL key.")); + } +#else + Q_UNUSED(key); + Q_UNUSED(interactive); +#endif +} + +void OptionsDialog::setSslCertificate(const QByteArray &cert, bool interactive) +{ +#ifndef QT_NO_OPENSSL + if (!cert.isEmpty() && !QSslCertificate(cert).isNull()) { + m_ui->lblSslCertStatus->setPixmap(QPixmap(":/icons/oxygen/security-high.png").scaledToHeight(20, Qt::SmoothTransformation)); + m_sslCert = cert; + } + else { + m_ui->lblSslCertStatus->setPixmap(QPixmap(":/icons/oxygen/security-low.png").scaledToHeight(20, Qt::SmoothTransformation)); + m_sslCert.clear(); + if (interactive) + QMessageBox::warning(this, tr("Invalid certificate"), tr("This is not a valid SSL certificate.")); + } +#else + Q_UNUSED(cert); + Q_UNUSED(interactive); +#endif +} + +bool OptionsDialog::schedTimesOk() +{ + if (m_ui->schedule_from->time() == m_ui->schedule_to->time()) { + QMessageBox::warning(this, tr("Time Error"), tr("The start time and the end time can't be the same.")); + return false; + } + return true; +} + +bool OptionsDialog::webUIAuthenticationOk() +{ + if (webUiUsername().length() < 3) { + QMessageBox::warning(this, tr("Length Error"), tr("The Web UI username must be at least 3 characters long.")); + return false; + } + if (webUiPassword().length() < 6) { + QMessageBox::warning(this, tr("Length Error"), tr("The Web UI password must be at least 6 characters long.")); + return false; + } + return true; +} diff -Nru qbittorrent-4.1.3/src/gui/optionsdlg.h qbittorrent-3.3.15/src/gui/optionsdlg.h --- qbittorrent-4.1.3/src/gui/optionsdlg.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/optionsdlg.h 2017-08-03 20:30:10.000000000 +0000 @@ -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. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef OPTIONSDLG_H +#define OPTIONSDLG_H + +#include +#include + +class QAbstractButton; +class QCloseEvent; +class QListWidgetItem; +class AdvancedSettings; + +// actions on double-click on torrents +enum DoubleClickAction +{ + TOGGLE_PAUSE, + OPEN_DEST, + NO_ACTION +}; + +namespace Net +{ + enum class ProxyType; +} + +namespace Ui +{ + class OptionsDialog; +} + +class OptionsDialog: public QDialog +{ + Q_OBJECT +private: + enum Tabs + { + TAB_UI, + TAB_DOWNLOADS, + TAB_CONNECTION, + TAB_SPEED, + TAB_BITTORRENT, + TAB_WEBUI, + TAB_ADVANCED + }; + +public: + // Constructor / Destructor + OptionsDialog(QWidget *parent = 0); + ~OptionsDialog(); + +public slots: + void showConnectionTab(); + +private slots: + void enableProxy(int comboIndex); + void on_buttonBox_accepted(); + void closeEvent(QCloseEvent *e); + void on_buttonBox_rejected(); + void applySettings(QAbstractButton* button); + void enableApplyButton(); + void changePage(QListWidgetItem*, QListWidgetItem*); + void loadWindowState(); + void saveWindowState() const; + void handleScanFolderViewSelectionChanged(); + void on_IpFilterRefreshBtn_clicked(); + void handleIPFilterParsed(bool error, int ruleCount); + void on_browseFileLogDir_clicked(); + void on_browseExportDirButton_clicked(); + void on_browseExportDirFinButton_clicked(); + void on_browseFilterButton_clicked(); + void on_browseSaveDirButton_clicked(); + void on_browseTempDirButton_clicked(); + void on_randomButton_clicked(); + void on_addScanFolderButton_clicked(); + void on_removeScanFolderButton_clicked(); + void on_btnWebUiCrt_clicked(); + void on_btnWebUiKey_clicked(); + void on_registerDNSBtn_clicked(); + void setLocale(const QString &locale); + +private: + // Methods + void saveOptions(); + void loadOptions(); + void initializeLanguageCombo(); + static QString languageToLocalizedString(const QLocale &locale); + // General options + QString getLocale() const; + bool systrayIntegration() const; + bool minimizeToTray() const; + bool closeToTray() const; + bool startMinimized() const; + bool isSlashScreenDisabled() const; + bool preventFromSuspend() const; +#ifdef Q_OS_WIN + bool WinStartup() const; +#endif + // Downloads + bool preAllocateAllFiles() const; + bool useAdditionDialog() const; + bool addTorrentsInPause() const; + QString getTorrentExportDir() const; + QString getFinishedTorrentExportDir() const; + QString askForExportDir(const QString& currentExportPath); + int getActionOnDblClOnTorrentDl() const; + int getActionOnDblClOnTorrentFn() const; + // Connection options + int getPort() const; + bool isUPnPEnabled() const; + QPair getGlobalBandwidthLimits() const; + QPair getAltGlobalBandwidthLimits() const; + // Bittorrent options + int getMaxConnecs() const; + int getMaxConnecsPerTorrent() const; + int getMaxUploads() const; + int getMaxUploadsPerTorrent() const; + bool isDHTEnabled() const; + bool isLSDEnabled() const; + int getEncryptionSetting() const; + qreal getMaxRatio() const; + // Proxy options + bool isProxyEnabled() const; + bool isProxyAuthEnabled() const; + QString getProxyIp() const; + unsigned short getProxyPort() const; + QString getProxyUsername() const; + QString getProxyPassword() const; + Net::ProxyType getProxyType() const; + // IP Filter + bool isIPFilteringEnabled() const; + QString getFilter() const; + bool m_refreshingIpFilter; + // Queueing system + bool isQueueingSystemEnabled() const; + int getMaxActiveDownloads() const; + int getMaxActiveUploads() const; + int getMaxActiveTorrents() const; + bool isWebUiEnabled() const; + quint16 webUiPort() const; + QString webUiUsername() const; + QString webUiPassword() const; + QSize sizeFittingScreen() const; + +private: + void setSslKey(const QByteArray &key, bool interactive = true); + void setSslCertificate(const QByteArray &cert, bool interactive = true); + bool schedTimesOk(); + bool webUIAuthenticationOk(); + +private: + Ui::OptionsDialog *m_ui; + QButtonGroup choiceLanguage; + QAbstractButton *applyButton; + AdvancedSettings *advancedSettings; + QList addedScanDirs; + QList removedScanDirs; + // SSL Cert / key + QByteArray m_sslCert, m_sslKey; +}; + +#endif diff -Nru qbittorrent-4.1.3/src/gui/optionsdlg.ui qbittorrent-3.3.15/src/gui/optionsdlg.ui --- qbittorrent-4.1.3/src/gui/optionsdlg.ui 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/optionsdlg.ui 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,3236 @@ + + + OptionsDialog + + + + 0 + 0 + 779 + 591 + + + + Options + + + + + + Qt::Horizontal + + + false + + + + Qt::LeftToRight + + + Qt::ScrollBarAlwaysOff + + + QListView::Static + + + QListView::TopToBottom + + + false + + + QListView::Adjust + + + QListView::IconMode + + + 0 + + + + Behavior + + + + + Downloads + + + + + Connection + + + + + Speed + + + + + BitTorrent + + + + + Web UI + + + + + Advanced + + + + + + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + true + + + + + 0 + 0 + 497 + 880 + + + + + + + Language + + + + + + + + User Interface Language: + + + + + + + + 0 + 0 + + + + QComboBox::AdjustToContents + + + 0 + + + + + + + + true + + + + (Requires restart) + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + Transfer List + + + + + + Confirm when deleting torrents + + + true + + + + + + + Use alternating row colors + + + true + + + + + + + + + Hide zero and infinity values + + + + + + + + Always + + + + + Paused torrents only + + + + + + + + Qt::Horizontal + + + + 0 + 0 + + + + + + + + + + + 50 + false + + + + Action on double-click + + + true + + + + + + Downloading torrents: + + + + + + + + 0 + 0 + + + + 0 + + + + Start / Stop Torrent + + + + + Open destination folder + + + + + No action + + + + + + + + Completed torrents: + + + + + + + + Start / Stop Torrent + + + + + Open destination folder + + + + + No action + + + + + + + + + + + + + + Desktop + + + + + + Start qBittorrent on Windows start up + + + + + + + Show splash screen on start up + + + true + + + + + + + Start qBittorrent minimized + + + + + + + Confirmation on exit when torrents are active + + + true + + + + + + + Confirmation on auto-exit when downloads finish + + + true + + + + + + + Show qBittorrent in notification area + + + true + + + + + + Minimize qBittorrent to notification area + + + false + + + + + + + Close qBittorrent to notification area + + + + + + + + + Tray icon style: + + + + + + + + Normal + + + + + Monochrome (Dark theme) + + + + + Monochrome (Light theme) + + + + + + + + + + + + + File association + + + + + + Use qBittorrent for .torrent files + + + + + + + Use qBittorrent for magnet links + + + + + + + + + + + + + Power Management + + + + + + Inhibit system sleep when torrents are active + + + + + + + + + + Log file + + + true + + + true + + + + + + + + Save path: + + + + + + + + + + + 0 + 25 + + + + ... + + + + + + + + + 0 + + + + + Backup the log file after: + + + + + + + MB + + + 1 + + + 1000 + + + 10 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + 0 + + + + + Delete backup logs older than: + + + + + + + 1 + + + 365 + + + 6 + + + + + + + 1 + + + + days + + + + + months + + + + + years + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + true + + + + + 0 + 0 + 586 + 1118 + + + + + + + When adding a torrent + + + + + + Display torrent content and some options + + + true + + + + 0 + + + + + Bring torrent dialog to the front + + + true + + + + + + + + + + Do not start the download automatically + + + + + + + Should the .torrent file be deleted after adding it + + + Delete .torrent files afterwards + + + true + + + false + + + + + + Also delete .torrent files whose addition was cancelled + + + Also when addition is cancelled + + + + + + + + + + 0 + 0 + + + + <> + + + + + + + Warning! Data loss possible! + + + + + + + + + + + + + + + Saving Management + + + + + + + + Default Torrent Management Mode: + + + + + + + 10 + + + + + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category + + + + Manual + + + + + Automatic + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + When Torrent Category changed: + + + + + + + + + + Relocate torrent + + + + + Switch torrent to Manual Mode + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + When Default Save Path changed: + + + + + + + + + 1 + + + + Relocate affected torrents + + + + + Switch affected torrents to Manual Mode + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + When Category changed: + + + + + + + + + 1 + + + + Relocate affected torrents + + + + + Switch affected torrents to Manual Mode + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Use Subcategories + + + + + + + + + Default Save Path: + + + + + + + + + + 0 + 0 + + + + + + + + + + + true + + + + 22 + 22 + + + + + 25 + 27 + + + + ... + + + + + + + + + Keep incomplete torrents in: + + + + + + + + + + + + + 25 + 27 + + + + + 22 + 22 + + + + + 25 + 27 + + + + ... + + + + + + + + + Copy .torrent files to: + + + + + + + + + + + + + 22 + 22 + + + + + 25 + 27 + + + + ... + + + + + + + + + Copy .torrent files for finished downloads to: + + + + + + + + + + + + + 22 + 22 + + + + + 25 + 27 + + + + ... + + + + + + + + + + + Pre-allocate disk space for all files + + + + + + + Append .!qB extension to incomplete files + + + + + + + + + + Automatically add torrents from: + + + + + + + + + 0 + 1 + + + + + 250 + 150 + + + + QAbstractItemView::AllEditTriggers + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + Qt::ElideNone + + + false + + + 80 + + + false + + + + + + + + + Add entry + + + + + + + false + + + Remove entry + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + Email notification upon download completion + + + true + + + false + + + + + + + + + + + Destination email: + + + + + + + SMTP server: + + + + + + + + + + + + This server requires a secure connection (SSL) + + + + + + + Authentication + + + true + + + false + + + + + + Username: + + + + + + + + + + Password: + + + + + + + QLineEdit::Password + + + + + + + + + + + + + Run external program on torrent completion + + + true + + + false + + + + + + + + + true + + + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + true + + + + + 0 + 0 + 457 + 672 + + + + + + + Listening Port + + + + + + + + Port used for incoming connections: + + + + + + + 1 + + + 65535 + + + 8999 + + + + + + + Random + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Use UPnP / NAT-PMP port forwarding from my router + + + true + + + + + + + Use different port on each startup + + + + + + + + + + Connections Limits + + + + + + 500 + + + 4 + + + + + + + Maximum number of connections per torrent: + + + true + + + + + + + Global maximum number of connections: + + + true + + + + + + + true + + + 2 + + + 2000 + + + 500 + + + + + + + 2 + + + 2000 + + + 100 + + + + + + + Maximum number of upload slots per torrent: + + + false + + + + + + + Global maximum number of upload slots: + + + false + + + + + + + 2000 + + + 8 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + true + + + Proxy Server + + + + + + + + Type: + + + + + + + + (None) + + + + + SOCKS4 + + + + + SOCKS5 + + + + + HTTP + + + + + + + + false + + + Host: + + + + + + + false + + + + + + + + + + false + + + Port: + + + + + + + false + + + 1 + + + 65535 + + + 8080 + + + + + + + + + false + + + Otherwise, the proxy server is only used for tracker connections + + + Use proxy for peer connections + + + + + + + Disable connections not supported by proxies + + + true + + + + + + + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection + + + Use proxy only for torrents + + + false + + + + + + + false + + + Authentication + + + true + + + false + + + + + + + + Username: + + + + + + + + + + Password: + + + + + + + QLineEdit::Password + + + + + + + + + Info: The password is saved unencrypted + + + + + + + + + + + + + IP Filtering + + + true + + + false + + + + + + + + Filter path (.dat, .p2p, .p2b): + + + + + + + + + + + 0 + 25 + + + + ... + + + + + + + + 0 + 25 + + + + Reload the filter + + + + + + + + + Apply to trackers + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + true + + + + + 0 + 0 + 388 + 452 + + + + + + + Global Rate Limits + + + + + + false + + + 1 + + + 1000000 + + + 100 + + + + + + + Upload: + + + + + + + KiB/s + + + + + + + false + + + 1 + + + 1000000 + + + 100 + + + + + + + KiB/s + + + + + + + :/icons/slow_off.png + + + + + + + Download: + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Alternative Rate Limits + + + + + + Schedule the use of alternative rate limits + + + true + + + false + + + + + + From: + + + + + + + true + + + hh:mm + + + + + + + + + + To: + + + + + + + true + + + hh:mm + + + false + + + + + + + + + + When: + + + + + + + + 0 + 0 + + + + + Every day + + + + + Weekdays + + + + + Weekends + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + :/icons/slow.png + + + + + + + Upload: + + + + + + + Download: + + + + + + + false + + + 1 + + + 1000000 + + + 10 + + + + + + + false + + + 1 + + + 1000000 + + + 10 + + + + + + + KiB/s + + + + + + + KiB/s + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Rate Limits Settings + + + + + + Apply rate limit to peers on LAN + + + + + + + Apply rate limit to transport overhead + + + + + + + Enable µTP protocol + + + + + + + Apply rate limit to µTP protocol + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + true + + + + + 0 + 0 + 574 + 534 + + + + + + + Privacy + + + + + + Enable DHT (decentralized network) to find more peers + + + true + + + + + + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) + + + Enable Peer Exchange (PeX) to find more peers + + + true + + + + + + + Look for peers on your local network + + + Enable Local Peer Discovery to find more peers + + + true + + + + + + + + + Encryption mode: + + + + + + + + Prefer encryption + + + + + Require encryption + + + + + Disable encryption + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Enable when using a proxy or a VPN connection + + + Enable anonymous mode + + + + + + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + Torrent Queueing + + + true + + + false + + + + 9 + + + + + Maximum active downloads: + + + + + + + -1 + + + 999 + + + 3 + + + + + + + Maximum active uploads: + + + + + + + -1 + + + 999 + + + 3 + + + + + + + Maximum active torrents: + + + + + + + -1 + + + 999 + + + 5 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Do not count slow torrents in these limits + + + + + + + + + + Share Ratio Limiting + + + + 9 + + + + + + + Seed torrents until their ratio reaches + + + + + + + false + + + Qt::AlignHCenter + + + 0.000000000000000 + + + 9998.000000000000000 + + + 0.050000000000000 + + + 1.000000000000000 + + + + + + + then + + + + + + + false + + + + Pause them + + + + + Remove them + + + + + + + + + + + + + + 0 + 0 + + + + Automatically add these trackers to new downloads: + + + true + + + false + + + + + + true + + + Qt::StrongFocus + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + true + + + + + 0 + 0 + 518 + 602 + + + + + + + Web User Interface (Remote control) + + + true + + + false + + + + + + + + Server domains: + + + + + + + Whitelist for filtering HTTP Host header values. +In order to defend against DNS rebinding attack, +you should put in domain names used by WebUI server. + +Use ';' to split multiple entries. Can use wildcard '*'. + + + + + + + + + + + Port: + + + + + + + 1 + + + 65535 + + + 8080 + + + + + + + Qt::Horizontal + + + + 21 + 29 + + + + + + + + + + Use UPnP / NAT-PMP to forward the port from my router + + + true + + + + + + + Use HTTPS instead of HTTP + + + true + + + false + + + + + + + 22 + 22 + + + + + 22 + 22 + + + + + + + + + + + Certificate: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + Import SSL Certificate + + + + + + + Qt::Horizontal + + + + 138 + 28 + + + + + + + + + + + 22 + 22 + + + + + 22 + 22 + + + + + + + + + + + Key: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + Import SSL Key + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> + + + true + + + + + + + + + + Authentication + + + + + + + + + 1000 + + + QLineEdit::Normal + + + + + + + + + + 1000 + + + QLineEdit::Password + + + + + + + Bypass authentication for localhost + + + + + + + Username: + + + + + + + Password: + + + + + + + + + + Update my dynamic domain name + + + true + + + false + + + + + + Service: + + + + + + + + + + DynDNS + + + + + No-IP + + + + + + + + Register + + + + + + + + + Domain name: + + + + + + + changeme.dyndns.org + + + + + + + Username: + + + + + + + 50 + + + + + + + Password: + + + + + + + 50 + + + QLineEdit::Password + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + + QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + tabOption + comboI18n + textSavePath + browseSaveDirButton + checkStartPaused + spinPort + checkUPnP + checkLSD + comboEncryption + checkMaxRatio + spinMaxRatio + spinWebUiPort + textWebUiUsername + textWebUiPassword + + + + + + + checkUploadLimit + toggled(bool) + spinUploadLimit + setEnabled(bool) + + + 367 + 61 + + + 448 + 62 + + + + + checkDownloadLimit + toggled(bool) + spinDownloadLimit + setEnabled(bool) + + + 377 + 81 + + + 430 + 87 + + + + + checkMaxConnecs + toggled(bool) + spinMaxConnec + setEnabled(bool) + + + 604 + 205 + + + 677 + 206 + + + + + checkMaxConnecsPerTorrent + toggled(bool) + spinMaxConnecPerTorrent + setEnabled(bool) + + + 604 + 238 + + + 677 + 239 + + + + + checkMaxUploadsPerTorrent + toggled(bool) + spinMaxUploadsPerTorrent + setEnabled(bool) + + + 604 + 304 + + + 677 + 305 + + + + + checkMaxRatio + toggled(bool) + spinMaxRatio + setEnabled(bool) + + + 547 + 415 + + + 642 + 414 + + + + + checkMaxRatio + toggled(bool) + comboRatioLimitAct + setEnabled(bool) + + + 547 + 415 + + + 815 + 413 + + + + + checkMaxUploads + toggled(bool) + spinMaxUploads + setEnabled(bool) + + + 604 + 271 + + + 677 + 272 + + + + + checkDownloadLimitAlt + toggled(bool) + spinDownloadLimitAlt + setEnabled(bool) + + + 395 + 203 + + + 496 + 204 + + + + + checkUploadLimitAlt + toggled(bool) + spinUploadLimitAlt + setEnabled(bool) + + + 395 + 170 + + + 496 + 171 + + + + + deleteTorrentBox + toggled(bool) + deleteTorrentWarningIcon + setVisible(bool) + + + 554 + 153 + + + 324 + 214 + + + + + deleteTorrentBox + toggled(bool) + deleteTorrentWarningLabel + setVisible(bool) + + + 646 + 158 + + + 629 + 207 + + + + + diff -Nru qbittorrent-4.1.3/src/gui/powermanagement/CMakeLists.txt qbittorrent-3.3.15/src/gui/powermanagement/CMakeLists.txt --- qbittorrent-4.1.3/src/gui/powermanagement/CMakeLists.txt 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/powermanagement/CMakeLists.txt 2017-08-03 20:30:10.000000000 +0000 @@ -1,20 +1,25 @@ -add_library(qbt_powermanagement STATIC +set(QBT_POWERMANAGEMENT_HEADERS powermanagement.h -powermanagement.cpp ) -target_link_libraries(qbt_powermanagement PUBLIC Qt5::Core) -set_target_properties(qbt_powermanagement PROPERTIES AUTOUIC False AUTORCC False) -target_include_directories(qbt_powermanagement PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +set(QBT_POWERMANAGEMENT_SOURCES +powermanagement.cpp +) -if (UNIX AND Qt5DBus_FOUND) +if (UNIX AND DBUS) find_package(X11) if (X11_FOUND) - target_sources(qbt_powermanagement PRIVATE powermanagement_x11.h powermanagement_x11.cpp) - target_link_libraries(qbt_powermanagement PRIVATE Qt5::DBus) + list(APPEND QBT_POWERMANAGEMENT_HEADERS powermanagement_x11.h) + list(APPEND QBT_POWERMANAGEMENT_SOURCES powermanagement_x11.cpp) endif (X11_FOUND) -endif (UNIX AND Qt5DBus_FOUND) +endif (UNIX AND DBUS) +add_library(qbt_powermanagement STATIC ${QBT_POWERMANAGEMENT_SOURCES} ${QBT_POWERMANAGEMENT_HEADERS}) +set_target_properties(qbt_powermanagement PROPERTIES AUTOUIC False AUTORCC False) +target_link_qt_components(qbt_powermanagement Core) +if (X11_FOUND) + target_link_qt_components(qbt_powermanagement DBus) +endif (X11_FOUND) if (WIN32) - target_link_libraries(qbt_powermanagement PRIVATE PowrProf) + target_link_libraries(qbt_powermanagement PowrProf) endif (WIN32) diff -Nru qbittorrent-4.1.3/src/gui/powermanagement/powermanagement.cpp qbittorrent-3.3.15/src/gui/powermanagement/powermanagement.cpp --- qbittorrent-4.1.3/src/gui/powermanagement/powermanagement.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/powermanagement/powermanagement.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Bittorrent Client using Qt and libtorrent. + * Bittorrent Client using Qt4 and libtorrent. * Copyright (C) 2011 Vladimir Golovnev * * This program is free software; you can redistribute it and/or @@ -24,15 +24,16 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#include "powermanagement.h" - #include #if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) && defined(QT_DBUS_LIB) #include "powermanagement_x11.h" #endif +#include "powermanagement.h" #ifdef Q_OS_MAC #include @@ -42,9 +43,7 @@ #include #endif -PowerManagement::PowerManagement(QObject *parent) - : QObject(parent) - , m_busy(false) +PowerManagement::PowerManagement(QObject *parent) : QObject(parent), m_busy(false) { #if (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) && defined(QT_DBUS_LIB) m_inhibitor = new PowerManagementInhibitor(this); @@ -57,10 +56,8 @@ void PowerManagement::setActivityState(bool busy) { - if (busy) - setBusy(); - else - setIdle(); + if (busy) setBusy(); + else setIdle(); } void PowerManagement::setBusy() @@ -71,12 +68,10 @@ #ifdef Q_OS_WIN SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED); #elif (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) && defined(QT_DBUS_LIB) - m_inhibitor->requestBusy(); + m_inhibitor->RequestBusy(); #elif defined(Q_OS_MAC) - IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoIdleSleep, kIOPMAssertionLevelOn - , tr("qBittorrent is active").toCFString(), &m_assertionID); - if (success != kIOReturnSuccess) - m_busy = false; + IOReturn success = IOPMAssertionCreate(kIOPMAssertionTypeNoIdleSleep, kIOPMAssertionLevelOn, &m_assertionID); + if (success != kIOReturnSuccess) m_busy = false; #endif } @@ -88,7 +83,7 @@ #ifdef Q_OS_WIN SetThreadExecutionState(ES_CONTINUOUS); #elif (defined(Q_OS_UNIX) && !defined(Q_OS_MAC)) && defined(QT_DBUS_LIB) - m_inhibitor->requestIdle(); + m_inhibitor->RequestIdle(); #elif defined(Q_OS_MAC) IOPMAssertionRelease(m_assertionID); #endif diff -Nru qbittorrent-4.1.3/src/gui/powermanagement/powermanagement.h qbittorrent-3.3.15/src/gui/powermanagement/powermanagement.h --- qbittorrent-4.1.3/src/gui/powermanagement/powermanagement.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/powermanagement/powermanagement.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Bittorrent Client using Qt and libtorrent. + * Bittorrent Client using Qt4 and libtorrent. * Copyright (C) 2011 Vladimir Golovnev * * This program is free software; you can redistribute it and/or @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef POWERMANAGEMENT_H @@ -46,7 +48,7 @@ Q_OBJECT public: - PowerManagement(QObject *parent = nullptr); + PowerManagement(QObject *parent = 0); virtual ~PowerManagement(); void setActivityState(bool busy); diff -Nru qbittorrent-4.1.3/src/gui/powermanagement/powermanagement_x11.cpp qbittorrent-3.3.15/src/gui/powermanagement/powermanagement_x11.cpp --- qbittorrent-4.1.3/src/gui/powermanagement/powermanagement_x11.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/powermanagement/powermanagement_x11.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Bittorrent Client using Qt and libtorrent. + * Bittorrent Client using Qt4 and libtorrent. * Copyright (C) 2011 Vladimir Golovnev * * This program is free software; you can redistribute it and/or @@ -24,45 +24,48 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#include "powermanagement_x11.h" - #include #include #include #include -PowerManagementInhibitor::PowerManagementInhibitor(QObject *parent) - : QObject(parent) +#include "powermanagement_x11.h" + +PowerManagementInhibitor::PowerManagementInhibitor(QObject *parent) : QObject(parent) { - if (!QDBusConnection::sessionBus().isConnected()) { + if (!QDBusConnection::sessionBus().isConnected()) + { qDebug("D-Bus: Could not connect to session bus"); - m_state = Error; + m_state = error; } - else { - m_state = Idle; + else + { + m_state = idle; } - m_intendedState = Idle; + m_intended_state = idle; m_cookie = 0; - m_useGSM = false; + m_use_gsm = false; } PowerManagementInhibitor::~PowerManagementInhibitor() { } -void PowerManagementInhibitor::requestIdle() +void PowerManagementInhibitor::RequestIdle() { - m_intendedState = Idle; - if ((m_state == Error) || (m_state == Idle) || (m_state == RequestIdle) || (m_state == RequestBusy)) + m_intended_state = idle; + if (m_state == error || m_state == idle || m_state == request_idle || m_state == request_busy) return; qDebug("D-Bus: PowerManagementInhibitor: Requesting idle"); QDBusMessage call; - if (!m_useGSM) + if (!m_use_gsm) call = QDBusMessage::createMethodCall( "org.freedesktop.PowerManagement", "/org/freedesktop/PowerManagement/Inhibit", @@ -75,7 +78,7 @@ "org.gnome.SessionManager", "Uninhibit"); - m_state = RequestIdle; + m_state = request_idle; QList args; args << m_cookie; @@ -83,20 +86,21 @@ QDBusPendingCall pcall = QDBusConnection::sessionBus().asyncCall(call, 1000); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pcall, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, &PowerManagementInhibitor::onAsyncReply); + connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), + this, SLOT(OnAsyncReply(QDBusPendingCallWatcher*))); } -void PowerManagementInhibitor::requestBusy() +void PowerManagementInhibitor::RequestBusy() { - m_intendedState = Busy; - if ((m_state == Error) || (m_state == Busy) || (m_state == RequestBusy) || (m_state == RequestIdle)) + m_intended_state = busy; + if (m_state == error || m_state == busy || m_state == request_busy || m_state == request_idle) return; qDebug("D-Bus: PowerManagementInhibitor: Requesting busy"); QDBusMessage call; - if (!m_useGSM) + if (!m_use_gsm) call = QDBusMessage::createMethodCall( "org.freedesktop.PowerManagement", "/org/freedesktop/PowerManagement/Inhibit", @@ -109,64 +113,72 @@ "org.gnome.SessionManager", "Inhibit"); - m_state = RequestBusy; + m_state = request_busy; QList args; args << "qBittorrent"; - if (m_useGSM) args << 0u; + if (m_use_gsm) args << (uint)0; args << "Active torrents are presented"; - if (m_useGSM) args << 8u; + if (m_use_gsm) args << (uint)8; call.setArguments(args); QDBusPendingCall pcall = QDBusConnection::sessionBus().asyncCall(call, 1000); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pcall, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, &PowerManagementInhibitor::onAsyncReply); + connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), + this, SLOT(OnAsyncReply(QDBusPendingCallWatcher*))); } -void PowerManagementInhibitor::onAsyncReply(QDBusPendingCallWatcher *call) +void PowerManagementInhibitor::OnAsyncReply(QDBusPendingCallWatcher *call) { - if (m_state == RequestIdle) { + if (m_state == request_idle) + { QDBusPendingReply<> reply = *call; - if (reply.isError()) { - qDebug("D-Bus: Reply: Error: %s", qUtf8Printable(reply.error().message())); - m_state = Error; + if (reply.isError()) + { + qDebug("D-Bus: Reply: Error: %s", qPrintable(reply.error().message())); + m_state = error; } - else { - m_state = Idle; + else + { + m_state = idle; qDebug("D-Bus: PowerManagementInhibitor: Request successful"); - if (m_intendedState == Busy) - requestBusy(); + if (m_intended_state == busy) RequestBusy(); } } - else if (m_state == RequestBusy) { + else if (m_state == request_busy) + { QDBusPendingReply reply = *call; - if (reply.isError()) { - qDebug("D-Bus: Reply: Error: %s", qUtf8Printable(reply.error().message())); + if (reply.isError()) + { + qDebug("D-Bus: Reply: Error: %s", qPrintable(reply.error().message())); - if (!m_useGSM) { + if (!m_use_gsm) + { qDebug("D-Bus: Falling back to org.gnome.SessionManager"); - m_useGSM = true; - m_state = Idle; - if (m_intendedState == Busy) - requestBusy(); + m_use_gsm = true; + m_state = idle; + if (m_intended_state == busy) + RequestBusy(); } - else { - m_state = Error; + else + { + m_state = error; } } - else { - m_state = Busy; + else + { + m_state = busy; m_cookie = reply.value(); qDebug("D-Bus: PowerManagementInhibitor: Request successful, cookie is %d", m_cookie); - if (m_intendedState == Idle) - requestIdle(); + if (m_intended_state == idle) RequestIdle(); } } - else { + else + { qDebug("D-Bus: Unexpected reply in state %d", m_state); - m_state = Error; + m_state = error; } call->deleteLater(); diff -Nru qbittorrent-4.1.3/src/gui/powermanagement/powermanagement_x11.h qbittorrent-3.3.15/src/gui/powermanagement/powermanagement_x11.h --- qbittorrent-4.1.3/src/gui/powermanagement/powermanagement_x11.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/powermanagement/powermanagement_x11.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,5 +1,5 @@ /* - * Bittorrent Client using Qt and libtorrent. + * Bittorrent Client using Qt4 and libtorrent. * Copyright (C) 2011 Vladimir Golovnev * * This program is free software; you can redistribute it and/or @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef POWERMANAGEMENTINHIBITOR_H @@ -31,37 +33,39 @@ #include +QT_BEGIN_NAMESPACE class QDBusPendingCallWatcher; +QT_END_NAMESPACE class PowerManagementInhibitor : public QObject { Q_OBJECT public: - PowerManagementInhibitor(QObject *parent = nullptr); + PowerManagementInhibitor(QObject *parent = 0); virtual ~PowerManagementInhibitor(); - void requestIdle(); - void requestBusy(); + void RequestIdle(); + void RequestBusy(); private slots: - void onAsyncReply(QDBusPendingCallWatcher *call); + void OnAsyncReply(QDBusPendingCallWatcher *call); private: - enum State + enum _state { - Error, - Idle, - RequestBusy, - Busy, - RequestIdle + error, + idle, + request_busy, + busy, + request_idle }; - enum State m_state; - enum State m_intendedState; + enum _state m_state; + enum _state m_intended_state; unsigned int m_cookie; - bool m_useGSM; + bool m_use_gsm; }; #endif // POWERMANAGEMENTINHIBITOR_H diff -Nru qbittorrent-4.1.3/src/gui/previewlistdelegate.h qbittorrent-3.3.15/src/gui/previewlistdelegate.h --- qbittorrent-4.1.3/src/gui/previewlistdelegate.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/previewlistdelegate.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,79 +24,81 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef PREVIEWLISTDELEGATE_H #define PREVIEWLISTDELEGATE_H -#include #include -#include -#include #include #include +#include +#include +#include +#include "base/utils/misc.h" +#include "base/utils/string.h" +#include "previewselect.h" #ifdef Q_OS_WIN +#ifndef QBT_USES_QT5 +#include +#else #include #endif +#endif -#include "base/utils/misc.h" -#include "base/utils/string.h" -#include "previewselectdialog.h" +class PreviewListDelegate: public QItemDelegate { + Q_OBJECT -class PreviewListDelegate : public QItemDelegate -{ - Q_OBJECT - -public: - PreviewListDelegate(QObject *parent = nullptr) - : QItemDelegate(parent) - { - } + public: + PreviewListDelegate(QObject *parent=0) : QItemDelegate(parent) {} ~PreviewListDelegate() {} - void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const - { - painter->save(); - QStyleOptionViewItem opt = QItemDelegate::setOptions(index, option); - - switch (index.column()) { - case PreviewSelectDialog::SIZE: - QItemDelegate::drawBackground(painter, opt, index); - QItemDelegate::drawDisplay(painter, opt, option.rect, Utils::Misc::friendlyUnit(index.data().toLongLong())); - break; - case PreviewSelectDialog::PROGRESS: { - QStyleOptionProgressBar newopt; - qreal progress = index.data().toDouble() * 100.; - newopt.rect = opt.rect; - newopt.text = ((progress == 100.0) ? QString("100%") : Utils::String::fromDouble(progress, 1) + '%'); - newopt.progress = static_cast(progress); - newopt.maximum = 100; - newopt.minimum = 0; - newopt.state |= QStyle::State_Enabled; - newopt.textVisible = true; + void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const { + painter->save(); + QStyleOptionViewItem opt = QItemDelegate::setOptions(index, option); + + switch(index.column()) { + case PreviewSelect::SIZE: + QItemDelegate::drawBackground(painter, opt, index); + QItemDelegate::drawDisplay(painter, opt, option.rect, Utils::Misc::friendlyUnit(index.data().toLongLong())); + break; + case PreviewSelect::PROGRESS:{ + QStyleOptionProgressBar newopt; + qreal progress = index.data().toDouble()*100.; + newopt.rect = opt.rect; + newopt.text = ((progress == 100.0) ? QString("100%") : Utils::String::fromDouble(progress, 1) + "%"); + newopt.progress = (int)progress; + newopt.maximum = 100; + newopt.minimum = 0; + newopt.state |= QStyle::State_Enabled; + newopt.textVisible = true; #ifndef Q_OS_WIN - QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, painter); + QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, painter); +#else + // XXX: To avoid having the progress text on the right of the bar +#ifndef QBT_USES_QT5 + QPlastiqueStyle st; #else - // XXX: To avoid having the progress text on the right of the bar - QProxyStyle st("fusion"); - st.drawControl(QStyle::CE_ProgressBar, &newopt, painter, 0); + QProxyStyle st("fusion"); #endif - } - break; - default: - QItemDelegate::paint(painter, option, index); + st.drawControl(QStyle::CE_ProgressBar, &newopt, painter, 0); +#endif + break; } - - painter->restore(); + default: + QItemDelegate::paint(painter, option, index); + } + painter->restore(); } - QWidget *createEditor(QWidget *, const QStyleOptionViewItem &, const QModelIndex &) const - { - // No editor here - return nullptr; + QWidget* createEditor(QWidget*, const QStyleOptionViewItem &, const QModelIndex &) const { + // No editor here + return 0; } }; -#endif // PREVIEWLISTDELEGATE_H +#endif diff -Nru qbittorrent-4.1.3/src/gui/previewselect.cpp qbittorrent-3.3.15/src/gui/previewselect.cpp --- qbittorrent-4.1.3/src/gui/previewselect.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/previewselect.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,133 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2011 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#include +#include +#include +#include +#ifdef QBT_USES_QT5 +#include +#endif + +#include "base/utils/misc.h" +#include "previewlistdelegate.h" +#include "previewselect.h" +#include "base/utils/fs.h" +#include "base/preferences.h" + +PreviewSelect::PreviewSelect(QWidget* parent, BitTorrent::TorrentHandle *const torrent) + : QDialog(parent) + , m_torrent(torrent) +{ + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + Preferences* const pref = Preferences::instance(); + // Preview list + previewListModel = new QStandardItemModel(0, NB_COLUMNS); + previewListModel->setHeaderData(NAME, Qt::Horizontal, tr("Name")); + previewListModel->setHeaderData(SIZE, Qt::Horizontal, tr("Size")); + previewListModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Progress")); +#ifdef QBT_USES_QT5 + // This hack fixes reordering of first column with Qt5. + // https://github.com/qtproject/qtbase/commit/e0fc088c0c8bc61dbcaf5928b24986cd61a22777 + QTableView unused; + unused.setVerticalHeader(previewList->header()); + previewList->header()->setParent(previewList); + unused.setVerticalHeader(new QHeaderView(Qt::Horizontal)); +#endif + previewList->setModel(previewListModel); + previewList->hideColumn(FILE_INDEX); + listDelegate = new PreviewListDelegate(this); + previewList->setItemDelegate(listDelegate); + previewList->header()->resizeSection(0, 200); + previewList->setAlternatingRowColors(pref->useAlternatingRowColors()); + // Fill list in + QVector fp = torrent->filesProgress(); + int nbFiles = torrent->filesCount(); + for (int i = 0; i < nbFiles; ++i) { + QString fileName = torrent->fileName(i); + if (fileName.endsWith(".!qB")) + fileName.chop(4); + QString extension = Utils::Fs::fileExtension(fileName).toUpper(); + if (Utils::Misc::isPreviewable(extension)) { + int row = previewListModel->rowCount(); + previewListModel->insertRow(row); + previewListModel->setData(previewListModel->index(row, NAME), QVariant(fileName)); + previewListModel->setData(previewListModel->index(row, SIZE), QVariant(torrent->fileSize(i))); + previewListModel->setData(previewListModel->index(row, PROGRESS), QVariant(fp[i])); + previewListModel->setData(previewListModel->index(row, FILE_INDEX), QVariant(i)); + } + } + + if (!previewListModel->rowCount()) { + QMessageBox::critical(0, tr("Preview impossible"), tr("Sorry, we can't preview this file")); + close(); + } + connect(this, SIGNAL(readyToPreviewFile(QString)), parent, SLOT(previewFile(QString))); + previewListModel->sort(NAME); + previewList->header()->setSortIndicator(0, Qt::AscendingOrder); + previewList->selectionModel()->select(previewListModel->index(0, NAME), QItemSelectionModel::Select | QItemSelectionModel::Rows); + + if (previewListModel->rowCount() == 1) { + qDebug("Torrent file only contains one file, no need to display selection dialog before preview"); + // Only one file : no choice + on_previewButton_clicked(); + }else{ + qDebug("Displaying media file selection dialog for preview"); + show(); + } +} + +PreviewSelect::~PreviewSelect() { + delete previewListModel; + delete listDelegate; +} + + +void PreviewSelect::on_previewButton_clicked() { + QModelIndexList selectedIndexes = previewList->selectionModel()->selectedRows(FILE_INDEX); + if (selectedIndexes.size() == 0) return; + // Flush data + m_torrent->flushCache(); + + QStringList absolute_paths(m_torrent->absoluteFilePaths()); + //only one file should be selected + QString path = absolute_paths.at(selectedIndexes.at(0).data().toInt()); + // File + if (QFile::exists(path)) + emit readyToPreviewFile(path); + else + QMessageBox::critical(0, tr("Preview impossible"), tr("Sorry, we can't preview this file")); + close(); +} + +void PreviewSelect::on_cancelButton_clicked() { + close(); +} diff -Nru qbittorrent-4.1.3/src/gui/previewselectdialog.cpp qbittorrent-3.3.15/src/gui/previewselectdialog.cpp --- qbittorrent-4.1.3/src/gui/previewselectdialog.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/previewselectdialog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,177 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2011 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "previewselectdialog.h" - -#include -#include -#include -#include -#include -#include - -#include "base/preferences.h" -#include "base/utils/fs.h" -#include "base/utils/misc.h" -#include "previewlistdelegate.h" -#include "utils.h" - -#define SETTINGS_KEY(name) "PreviewSelectDialog/" name - -PreviewSelectDialog::PreviewSelectDialog(QWidget *parent, BitTorrent::TorrentHandle *const torrent) - : QDialog(parent) - , m_torrent(torrent) - , m_storeDialogSize(SETTINGS_KEY("Dimension")) - , m_storeTreeHeaderState(SETTINGS_KEY("HeaderState")) -{ - setupUi(this); - setAttribute(Qt::WA_DeleteOnClose); - - buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Preview")); - connect(buttonBox, &QDialogButtonBox::accepted, this, &PreviewSelectDialog::previewButtonClicked); - connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); - - Preferences *const pref = Preferences::instance(); - // Preview list - m_previewListModel = new QStandardItemModel(0, NB_COLUMNS); - m_previewListModel->setHeaderData(NAME, Qt::Horizontal, tr("Name")); - m_previewListModel->setHeaderData(SIZE, Qt::Horizontal, tr("Size")); - m_previewListModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Progress")); - - // This hack fixes reordering of first column with Qt5. - // https://github.com/qtproject/qtbase/commit/e0fc088c0c8bc61dbcaf5928b24986cd61a22777 - QTableView unused; - unused.setVerticalHeader(previewList->header()); - previewList->header()->setParent(previewList); - unused.setVerticalHeader(new QHeaderView(Qt::Horizontal)); - - previewList->setModel(m_previewListModel); - previewList->hideColumn(FILE_INDEX); - m_listDelegate = new PreviewListDelegate(this); - previewList->setItemDelegate(m_listDelegate); - previewList->setAlternatingRowColors(pref->useAlternatingRowColors()); - // Fill list in - QVector fp = torrent->filesProgress(); - int nbFiles = torrent->filesCount(); - for (int i = 0; i < nbFiles; ++i) { - QString fileName = torrent->fileName(i); - if (fileName.endsWith(QB_EXT)) - fileName.chop(4); - QString extension = Utils::Fs::fileExtension(fileName).toUpper(); - if (Utils::Misc::isPreviewable(extension)) { - int row = m_previewListModel->rowCount(); - m_previewListModel->insertRow(row); - m_previewListModel->setData(m_previewListModel->index(row, NAME), QVariant(fileName)); - m_previewListModel->setData(m_previewListModel->index(row, SIZE), QVariant(torrent->fileSize(i))); - m_previewListModel->setData(m_previewListModel->index(row, PROGRESS), QVariant(fp[i])); - m_previewListModel->setData(m_previewListModel->index(row, FILE_INDEX), QVariant(i)); - } - } - - if (m_previewListModel->rowCount() == 0) { - QMessageBox::critical(this->parentWidget(), tr("Preview impossible"), tr("Sorry, we can't preview this file")); - close(); - } - connect(this, SIGNAL(readyToPreviewFile(QString)), parent, SLOT(previewFile(QString))); - m_previewListModel->sort(NAME); - previewList->header()->setSortIndicator(0, Qt::AscendingOrder); - previewList->selectionModel()->select(m_previewListModel->index(0, NAME), QItemSelectionModel::Select | QItemSelectionModel::Rows); - - // Restore dialog state - loadWindowState(); - - if (m_previewListModel->rowCount() == 1) { - qDebug("Torrent file only contains one file, no need to display selection dialog before preview"); - // Only one file : no choice - previewButtonClicked(); - } - else { - qDebug("Displaying media file selection dialog for preview"); - show(); - } -} - -PreviewSelectDialog::~PreviewSelectDialog() -{ - saveWindowState(); - - delete m_previewListModel; - delete m_listDelegate; -} - -void PreviewSelectDialog::previewButtonClicked() -{ - QModelIndexList selectedIndexes = previewList->selectionModel()->selectedRows(FILE_INDEX); - if (selectedIndexes.size() == 0) return; - - // Flush data - m_torrent->flushCache(); - - QStringList absolutePaths(m_torrent->absoluteFilePaths()); - // Only one file should be selected - QString path = absolutePaths.at(selectedIndexes.at(0).data().toInt()); - // File - if (QFile::exists(path)) - emit readyToPreviewFile(path); - else - QMessageBox::critical(this->parentWidget(), tr("Preview impossible"), tr("Sorry, we can't preview this file")); - - accept(); -} - -void PreviewSelectDialog::saveWindowState() -{ - // Persist dialog size - m_storeDialogSize = size(); - // Persist TreeView Header state - m_storeTreeHeaderState = previewList->header()->saveState(); -} - -void PreviewSelectDialog::loadWindowState() -{ - // Restore dialog size - Utils::Gui::resize(this, m_storeDialogSize); - - // Restore TreeView Header state - if (!m_storeTreeHeaderState.value().isEmpty()) { - m_headerStateInitialized = previewList->header()->restoreState(m_storeTreeHeaderState); - } -} - -void PreviewSelectDialog::showEvent(QShowEvent *event) -{ - Q_UNUSED(event); - - // Default size, have to be called after show(), because width is needed - // Set Name column width to 60% of TreeView - if (!m_headerStateInitialized) { - int nameSize = (previewList->size().width() * 0.6); - previewList->header()->resizeSection(0, nameSize); - m_headerStateInitialized = true; - } -} diff -Nru qbittorrent-4.1.3/src/gui/previewselectdialog.h qbittorrent-3.3.15/src/gui/previewselectdialog.h --- qbittorrent-4.1.3/src/gui/previewselectdialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/previewselectdialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,83 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2011 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef PREVIEWSELECTDIALOG_H -#define PREVIEWSELECTDIALOG_H - -#include - -#include "base/bittorrent/torrenthandle.h" -#include "base/settingvalue.h" -#include "ui_previewselectdialog.h" - -class QStandardItemModel; - -class PreviewListDelegate; - -class PreviewSelectDialog : public QDialog, private Ui::preview -{ - Q_OBJECT - -public: - enum PreviewColumn - { - NAME, - SIZE, - PROGRESS, - FILE_INDEX, - - NB_COLUMNS - }; - - PreviewSelectDialog(QWidget *parent, BitTorrent::TorrentHandle *const torrent); - ~PreviewSelectDialog(); - -signals: - void readyToPreviewFile(QString) const; - -protected: - void showEvent(QShowEvent *event) override; - -private slots: - void previewButtonClicked(); - -private: - void loadWindowState(); - void saveWindowState(); - - QStandardItemModel *m_previewListModel; - PreviewListDelegate *m_listDelegate; - BitTorrent::TorrentHandle *const m_torrent; - bool m_headerStateInitialized = false; - - // Settings - CachedSettingValue m_storeDialogSize; - CachedSettingValue m_storeTreeHeaderState; -}; - -#endif // PREVIEWSELECTDIALOG_H diff -Nru qbittorrent-4.1.3/src/gui/previewselectdialog.ui qbittorrent-3.3.15/src/gui/previewselectdialog.ui --- qbittorrent-4.1.3/src/gui/previewselectdialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/previewselectdialog.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ - - - preview - - - - 0 - 0 - 462 - 256 - - - - Preview selection - - - - - - The following files support previewing, please select one of them: - - - true - - - - - - - true - - - - - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - true - - - - - - - - diff -Nru qbittorrent-4.1.3/src/gui/previewselect.h qbittorrent-3.3.15/src/gui/previewselect.h --- qbittorrent-4.1.3/src/gui/previewselect.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/previewselect.h 2017-08-03 20:30:10.000000000 +0000 @@ -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. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef PREVIEWSELECT_H +#define PREVIEWSELECT_H + +#include +#include +#include "ui_preview.h" +#include "base/bittorrent/torrenthandle.h" + +class PreviewListDelegate; + +QT_BEGIN_NAMESPACE +class QStandardItemModel; +QT_END_NAMESPACE + +class PreviewSelect: public QDialog, private Ui::preview { + Q_OBJECT + +public: + enum PreviewColumn { NAME, SIZE, PROGRESS, FILE_INDEX, NB_COLUMNS }; + +public: + PreviewSelect(QWidget* parent, BitTorrent::TorrentHandle *const torrent); + ~PreviewSelect(); + +signals: + void readyToPreviewFile(QString) const; + +protected slots: + void on_previewButton_clicked(); + void on_cancelButton_clicked(); + +private: + QStandardItemModel *previewListModel; + PreviewListDelegate *listDelegate; + BitTorrent::TorrentHandle *const m_torrent; +}; + +#endif diff -Nru qbittorrent-4.1.3/src/gui/preview.ui qbittorrent-3.3.15/src/gui/preview.ui --- qbittorrent-4.1.3/src/gui/preview.ui 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/preview.ui 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,108 @@ + + + preview + + + + 0 + 0 + 462 + 256 + + + + Preview selection + + + + + + + 16777215 + 42 + + + + The following files support previewing, please select one of them: + + + Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft + + + true + + + + + + + true + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Preview + + + + + + + Cancel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + cancelButton + clicked() + preview + reject() + + + 296 + 245 + + + 179 + 282 + + + + + diff -Nru qbittorrent-4.1.3/src/gui/programupdater.cpp qbittorrent-3.3.15/src/gui/programupdater.cpp --- qbittorrent-4.1.3/src/gui/programupdater.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/programupdater.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2010 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2010 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,24 +24,32 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#include "programupdater.h" - -#include +#include #include -#include +#include +#include #include -#include -#include -#include "base/net/downloadhandler.h" -#include "base/net/downloadmanager.h" #include "base/utils/fs.h" +#include "base/net/downloadmanager.h" +#include "base/net/downloadhandler.h" +#include "programupdater.h" namespace { - const QString RSS_URL {QStringLiteral("https://www.fosshub.com/software/feedqBittorent")}; + const QString RSS_URL("https://www.fosshub.com/software/feedqBittorent"); + +#ifdef Q_OS_MAC + const QString OS_TYPE("Mac OS X"); +#elif defined(Q_OS_WIN) && (defined(__x86_64__) || defined(_M_X64)) + const QString OS_TYPE("Windows x64"); +#else + const QString OS_TYPE("Windows"); +#endif QString getStringValue(QXmlStreamReader &xml); } @@ -54,29 +62,22 @@ void ProgramUpdater::checkForUpdates() { - // Don't change this User-Agent. In case our updater goes haywire, - // the filehost can identify it and contact us. - Net::DownloadHandler *handler = Net::DownloadManager::instance()->download( - Net::DownloadRequest(RSS_URL).userAgent("qBittorrent/" QBT_VERSION_2 " ProgramUpdater (www.qbittorrent.org)")); - connect(handler, static_cast(&Net::DownloadHandler::downloadFinished) - , this, &ProgramUpdater::rssDownloadFinished); - connect(handler, &Net::DownloadHandler::downloadFailed, this, &ProgramUpdater::rssDownloadFailed); + Net::DownloadHandler *handler = Net::DownloadManager::instance()->downloadUrl( + RSS_URL, false, 0, false, + // Don't change this User-Agent. In case our updater goes haywire, + // the filehost can identify it and contact us. + "qBittorrent/" QBT_VERSION_2 " ProgramUpdater (www.qbittorrent.org)"); + connect(handler, SIGNAL(downloadFinished(QString,QByteArray)), SLOT(rssDownloadFinished(QString,QByteArray))); + connect(handler, SIGNAL(downloadFailed(QString,QString)), SLOT(rssDownloadFailed(QString,QString))); } void ProgramUpdater::rssDownloadFinished(const QString &url, const QByteArray &data) { Q_UNUSED(url); - qDebug("Finished downloading the new qBittorrent updates RSS"); - -#ifdef Q_OS_MAC - const QString OS_TYPE {"Mac OS X"}; -#elif defined(Q_OS_WIN) - const QString OS_TYPE {((QSysInfo::windowsVersion() >= QSysInfo::WV_WINDOWS7) - && QSysInfo::currentCpuArchitecture().endsWith("64")) - ? "Windows x64" : "Windows"}; -#endif + qDebug("Finished downloading the new qBittorrent updates RSS"); QString version; + QXmlStreamReader xml(data); bool inItem = false; QString updateLink; @@ -98,9 +99,9 @@ else if (xml.isEndElement()) { if (inItem && xml.name() == "item") { if (type.compare(OS_TYPE, Qt::CaseInsensitive) == 0) { - qDebug("The last update available is %s", qUtf8Printable(version)); + qDebug("The last update available is %s", qPrintable(version)); if (!version.isEmpty()) { - qDebug("Detected version is %s", qUtf8Printable(version)); + qDebug("Detected version is %s", qPrintable(version)); if (isVersionMoreRecent(version)) m_updateUrl = updateLink; } @@ -135,9 +136,9 @@ bool ProgramUpdater::isVersionMoreRecent(const QString &remoteVersion) const { - const QRegularExpressionMatch regVerMatch = QRegularExpression("([0-9.]+)").match(QBT_VERSION); - if (regVerMatch.hasMatch()) { - QString localVersion = regVerMatch.captured(1); + QRegExp regVer("([0-9.]+)"); + if (regVer.indexIn(QBT_VERSION) >= 0) { + QString localVersion = regVer.cap(1); qDebug() << Q_FUNC_INFO << "local version:" << localVersion << "/" << QBT_VERSION; QStringList remoteParts = remoteVersion.split('.'); QStringList localParts = localVersion.split('.'); @@ -151,8 +152,8 @@ if (remoteParts.size() > localParts.size()) return true; // versions are equal, check if the local version is a development release, in which case it is older (2.9.2beta < 2.9.2) - const QRegularExpressionMatch regDevelMatch = QRegularExpression("(alpha|beta|rc)").match(QBT_VERSION); - if (regDevelMatch.hasMatch()) + QRegExp regDevel("(alpha|beta|rc)"); + if (regDevel.indexIn(QBT_VERSION) >= 0) return true; } return false; diff -Nru qbittorrent-4.1.3/src/gui/programupdater.h qbittorrent-3.3.15/src/gui/programupdater.h --- qbittorrent-4.1.3/src/gui/programupdater.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/programupdater.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2010 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2010 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef PROGRAMUPDATER_H @@ -32,12 +34,12 @@ #include #include -class ProgramUpdater : public QObject +class ProgramUpdater: public QObject { Q_OBJECT public: - explicit ProgramUpdater(QObject *parent = nullptr, bool invokedByUser = false); + explicit ProgramUpdater(QObject *parent = 0, bool invokedByUser = false); void checkForUpdates(); void updateProgram(); diff -Nru qbittorrent-4.1.3/src/gui/properties/CMakeLists.txt qbittorrent-3.3.15/src/gui/properties/CMakeLists.txt --- qbittorrent-4.1.3/src/gui/properties/CMakeLists.txt 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/CMakeLists.txt 2017-08-03 20:30:10.000000000 +0000 @@ -1,50 +1,49 @@ -add_library(qbt_properties STATIC -# headers +include_directories( +${CMAKE_CURRENT_BINARY_DIR} +${CMAKE_CURRENT_SOURCE_DIR} +../lineedit/src/ +) + +set(QBT_PROPERTIES_FORMS +propertieswidget.ui +trackersadditiondlg.ui +peersadditiondlg.ui +) + +set(QBT_PROPERTIES_HEADERS +propertieswidget.h +peerlistwidget.h +proplistdelegate.h +trackerlist.h downloadedpiecesbar.h +piecesbar.h peerlistdelegate.h peerlistsortmodel.h -peerlistwidget.h -peersadditiondialog.h +peersadditiondlg.h +trackersadditiondlg.h pieceavailabilitybar.h -piecesbar.h -propertieswidget.h -proplistdelegate.h proptabbar.h -speedplotview.h speedwidget.h -trackerlistwidget.h -trackersadditiondialog.h +speedplotview.h +) -# sources -downloadedpiecesbar.cpp -peerlistwidget.cpp -peersadditiondialog.cpp -pieceavailabilitybar.cpp -piecesbar.cpp +set(QBT_PROPERTIES_SOURCES propertieswidget.cpp proplistdelegate.cpp +peerlistwidget.cpp +trackerlist.cpp +peersadditiondlg.cpp +downloadedpiecesbar.cpp +piecesbar.cpp +trackersadditiondlg.cpp +pieceavailabilitybar.cpp proptabbar.cpp -speedplotview.cpp speedwidget.cpp -trackerlistwidget.cpp -trackersadditiondialog.cpp - -# forms -peersadditiondialog.ui -propertieswidget.ui -trackersadditiondialog.ui -) - -target_link_libraries(qbt_properties - PRIVATE - qbt_gui_headers - PUBLIC - qbt_base qbt_lineedit Qt5::Widgets +speedplotview.cpp ) -target_include_directories(qbt_properties - PRIVATE - ${CMAKE_CURRENT_BINARY_DIR} - PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR} -) +add_library(qbt_properties STATIC ${QBT_PROPERTIES_HEADERS} ${QBT_PROPERTIES_SOURCES} ${QBT_PROPERTIES_FORMS}) +target_link_libraries(qbt_properties qbt_base) +if (NOT QT4_FOUND) + target_link_libraries(qbt_properties Qt5::Widgets Qt5::Concurrent) +endif (NOT QT4_FOUND) diff -Nru qbittorrent-4.1.3/src/gui/properties/downloadedpiecesbar.cpp qbittorrent-3.3.15/src/gui/properties/downloadedpiecesbar.cpp --- qbittorrent-4.1.3/src/gui/properties/downloadedpiecesbar.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/downloadedpiecesbar.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #include "downloadedpiecesbar.h" @@ -101,7 +103,7 @@ // normalization <0, 1> value /= ratio; - // float precision sometimes gives > 1, because it's not possible to store irrational numbers + // float precision sometimes gives > 1, because in not possible to store irrational numbers value = qMin(value, 1.0f); result[x] = value; @@ -125,24 +127,24 @@ return true; } - QVector scaledPieces = bitfieldToFloatVector(m_pieces, image2.width()); - QVector scaledPiecesDl = bitfieldToFloatVector(m_downloadedPieces, image2.width()); + QVector scaled_pieces = bitfieldToFloatVector(m_pieces, image2.width()); + QVector scaled_pieces_dl = bitfieldToFloatVector(m_downloadedPieces, image2.width()); // filling image - for (int x = 0; x < scaledPieces.size(); ++x) { - float piecesToValue = scaledPieces.at(x); - float piecesToValueDl = scaledPiecesDl.at(x); - if (piecesToValueDl != 0) { - float fillRatio = piecesToValue + piecesToValueDl; - float ratio = piecesToValueDl / fillRatio; + for (int x = 0; x < scaled_pieces.size(); ++x) { + float pieces2_val = scaled_pieces.at(x); + float pieces2_val_dl = scaled_pieces_dl.at(x); + if (pieces2_val_dl != 0) { + float fill_ratio = pieces2_val + pieces2_val_dl; + float ratio = pieces2_val_dl / fill_ratio; QRgb mixedColor = mixTwoColors(pieceColor().rgb(), m_dlPieceColor.rgb(), ratio); - mixedColor = mixTwoColors(backgroundColor().rgb(), mixedColor, fillRatio); + mixedColor = mixTwoColors(backgroundColor().rgb(), mixedColor, fill_ratio); image2.setPixel(x, 0, mixedColor); } else { - image2.setPixel(x, 0, pieceColors()[piecesToValue * 255]); + image2.setPixel(x, 0, pieceColors()[pieces2_val * 255]); } } image = image2; diff -Nru qbittorrent-4.1.3/src/gui/properties/downloadedpiecesbar.h qbittorrent-3.3.15/src/gui/properties/downloadedpiecesbar.h --- qbittorrent-4.1.3/src/gui/properties/downloadedpiecesbar.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/downloadedpiecesbar.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,18 +24,20 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef DOWNLOADEDPIECESBAR_H #define DOWNLOADEDPIECESBAR_H +#include #include #include -#include #include "piecesbar.h" -class DownloadedPiecesBar : public PiecesBar +class DownloadedPiecesBar: public PiecesBar { using base = PiecesBar; Q_OBJECT diff -Nru qbittorrent-4.1.3/src/gui/properties/peerlistdelegate.h qbittorrent-3.3.15/src/gui/properties/peerlistdelegate.h --- qbittorrent-4.1.3/src/gui/properties/peerlistdelegate.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/peerlistdelegate.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef PEERLISTDELEGATE_H @@ -36,7 +38,7 @@ #include "base/utils/misc.h" #include "base/utils/string.h" -class PeerListDelegate : public QItemDelegate +class PeerListDelegate: public QItemDelegate { Q_OBJECT @@ -61,9 +63,10 @@ COL_COUNT }; +public: PeerListDelegate(QObject *parent) : QItemDelegate(parent) {} - ~PeerListDelegate() override {} + ~PeerListDelegate() {} void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override { @@ -74,33 +77,34 @@ QItemDelegate::drawBackground(painter, opt, index); switch (index.column()) { - case PORT: + case PORT: { opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; QItemDelegate::drawDisplay(painter, opt, option.rect, index.data().toString()); + } break; case TOT_DOWN: case TOT_UP: { - qlonglong size = index.data().toLongLong(); - if (hideValues && (size <= 0)) - break; - opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; - QItemDelegate::drawDisplay(painter, opt, option.rect, Utils::Misc::friendlyUnit(size)); + qlonglong size = index.data().toLongLong(); + if (hideValues && (size <= 0)) + break; + opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; + QItemDelegate::drawDisplay(painter, opt, option.rect, Utils::Misc::friendlyUnit(size)); } break; case DOWN_SPEED: case UP_SPEED: { - qreal speed = index.data().toDouble(); - if (speed <= 0.0) - break; - opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; - QItemDelegate::drawDisplay(painter, opt, opt.rect, Utils::Misc::friendlyUnit(speed, true)); + qreal speed = index.data().toDouble(); + if (speed <= 0.0) + break; + opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; + QItemDelegate::drawDisplay(painter, opt, opt.rect, Utils::Misc::friendlyUnit(speed, true)); } break; case PROGRESS: case RELEVANCE: { - qreal progress = index.data().toDouble(); - opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; - QItemDelegate::drawDisplay(painter, opt, opt.rect, Utils::String::fromDouble(progress * 100.0, 1) + '%'); + qreal progress = index.data().toDouble(); + opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; + QItemDelegate::drawDisplay(painter, opt, opt.rect, Utils::String::fromDouble(progress * 100.0, 1) + "%"); } break; default: diff -Nru qbittorrent-4.1.3/src/gui/properties/peerlistsortmodel.h qbittorrent-3.3.15/src/gui/properties/peerlistsortmodel.h --- qbittorrent-4.1.3/src/gui/properties/peerlistsortmodel.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/peerlistsortmodel.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2013 Nick Tiskov + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2013 Nick Tiskov * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,41 +24,36 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : daymansmail@gmail.com */ #ifndef PEERLISTSORTMODEL_H #define PEERLISTSORTMODEL_H +#include #include - #include "peerlistdelegate.h" -class PeerListSortModel : public QSortFilterProxyModel -{ - Q_OBJECT +class PeerListSortModel : public QSortFilterProxyModel { + Q_OBJECT public: - PeerListSortModel(QObject *parent = nullptr) - : QSortFilterProxyModel(parent) - { - } + PeerListSortModel(QObject *parent = 0) : QSortFilterProxyModel(parent) {} protected: - bool lessThan(const QModelIndex &left, const QModelIndex &right) const - { - switch (sortColumn()) { - case PeerListDelegate::IP: - case PeerListDelegate::CLIENT: { - const QString strL = left.data().toString(); - const QString strR = right.data().toString(); - const int result = Utils::String::naturalCompare(strL, strR, Qt::CaseInsensitive); - return (result < 0); - } - break; - default: - return QSortFilterProxyModel::lessThan(left, right); - }; - } + bool lessThan(const QModelIndex &left, const QModelIndex &right) const { + switch (sortColumn()) { + case PeerListDelegate::IP: + case PeerListDelegate::CLIENT: { + QString vL = left.data().toString(); + QString vR = right.data().toString(); + return Utils::String::naturalCompareCaseInsensitive(vL, vR); + } + }; + + return QSortFilterProxyModel::lessThan(left, right); + } }; #endif // PEERLISTSORTMODEL_H diff -Nru qbittorrent-4.1.3/src/gui/properties/peerlistwidget.cpp qbittorrent-3.3.15/src/gui/properties/peerlistwidget.cpp --- qbittorrent-4.1.3/src/gui/properties/peerlistwidget.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/peerlistwidget.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,34 +24,38 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #include "peerlistwidget.h" #include -#include +#include +#include +#include #include #include +#include #include -#include -#include -#include -#include #include +#ifdef QBT_USES_QT5 +#include +#endif -#include "base/bittorrent/peerinfo.h" -#include "base/bittorrent/torrenthandle.h" -#include "base/logger.h" -#include "base/net/geoipmanager.h" #include "base/net/reverseresolution.h" +#include "base/bittorrent/torrenthandle.h" +#include "base/bittorrent/peerinfo.h" #include "base/preferences.h" +#include "base/logger.h" #include "base/unicodestrings.h" +#include "propertieswidget.h" +#include "base/net/geoipmanager.h" +#include "peersadditiondlg.h" +#include "speedlimitdlg.h" #include "guiiconprovider.h" #include "peerlistdelegate.h" #include "peerlistsortmodel.h" -#include "peersadditiondialog.h" -#include "propertieswidget.h" -#include "speedlimitdialog.h" PeerListWidget::PeerListWidget(PropertiesWidget *parent) : QTreeView(parent) @@ -102,7 +106,7 @@ hideColumn(PeerListDelegate::COUNTRY); // Ensure that at least one column is visible at all times bool atLeastOne = false; - for (unsigned int i = 0; i < PeerListDelegate::IP_HIDDEN; ++i) { + for (unsigned int i = 0; i < PeerListDelegate::IP_HIDDEN; i++) { if (!isColumnHidden(i)) { atLeastOne = true; break; @@ -113,12 +117,12 @@ // To also mitigate the above issue, we have to resize each column when // its size is 0, because explicitly 'showing' the column isn't enough // in the above scenario. - for (unsigned int i = 0; i < PeerListDelegate::IP_HIDDEN; ++i) + for (unsigned int i = 0; i < PeerListDelegate::IP_HIDDEN; i++) if ((columnWidth(i) <= 0) && !isColumnHidden(i)) resizeColumnToContents(i); // Context menu setContextMenuPolicy(Qt::CustomContextMenu); - connect(this, &QWidget::customContextMenuRequested, this, &PeerListWidget::showPeerListMenu); + connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showPeerListMenu(QPoint))); // List delegate m_listDelegate = new PeerListDelegate(this); setItemDelegate(m_listDelegate); @@ -128,21 +132,19 @@ updatePeerHostNameResolutionState(); // SIGNAL/SLOT header()->setContextMenuPolicy(Qt::CustomContextMenu); - connect(header(), &QWidget::customContextMenuRequested, this, &PeerListWidget::displayToggleColumnsMenu); - connect(header(), &QHeaderView::sectionClicked, this, &PeerListWidget::handleSortColumnChanged); - connect(header(), &QHeaderView::sectionMoved, this, &PeerListWidget::saveSettings); - connect(header(), &QHeaderView::sectionResized, this, &PeerListWidget::saveSettings); - connect(header(), &QHeaderView::sortIndicatorChanged, this, &PeerListWidget::saveSettings); + connect(header(), SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayToggleColumnsMenu(const QPoint&))); + connect(header(), SIGNAL(sectionClicked(int)), SLOT(handleSortColumnChanged(int))); handleSortColumnChanged(header()->sortIndicatorSection()); - m_copyHotkey = new QShortcut(QKeySequence::Copy, this, nullptr, nullptr, Qt::WidgetShortcut); - connect(m_copyHotkey, &QShortcut::activated, this, &PeerListWidget::copySelectedPeers); + m_copyHotkey = new QShortcut(QKeySequence::Copy, this, SLOT(copySelectedPeers()), 0, Qt::WidgetShortcut); +#ifdef QBT_USES_QT5 // This hack fixes reordering of first column with Qt5. // https://github.com/qtproject/qtbase/commit/e0fc088c0c8bc61dbcaf5928b24986cd61a22777 QTableView unused; unused.setVerticalHeader(this->header()); this->header()->setParent(this); unused.setVerticalHeader(new QHeaderView(Qt::Horizontal)); +#endif } PeerListWidget::~PeerListWidget() @@ -168,9 +170,9 @@ actions.append(myAct); } int visibleCols = 0; - for (unsigned int i = 0; i < PeerListDelegate::IP_HIDDEN; ++i) { + for (unsigned int i = 0; i < PeerListDelegate::IP_HIDDEN; i++) { if (!isColumnHidden(i)) - ++visibleCols; + visibleCols++; if (visibleCols > 1) break; @@ -184,9 +186,10 @@ Q_ASSERT(visibleCols > 0); if (!isColumnHidden(col) && (visibleCols == 1)) return; + qDebug("Toggling column %d visibility", col); setColumnHidden(col, !isColumnHidden(col)); if (!isColumnHidden(col) && (columnWidth(col) <= 5)) - resizeColumnToContents(col); + setColumnWidth(col, 100); saveSettings(); } } @@ -196,7 +199,7 @@ if (Preferences::instance()->resolvePeerHostNames()) { if (!m_resolver) { m_resolver = new Net::ReverseResolution(this); - connect(m_resolver.data(), &Net::ReverseResolution::ipResolved, this, &PeerListWidget::handleResolved); + connect(m_resolver, SIGNAL(ipResolved(QString,QString)), SLOT(handleResolved(QString,QString))); loadPeers(m_properties->getCurrentTorrent(), true); } } @@ -229,13 +232,13 @@ if (!torrent) return; // Add Peer Action - QAction *addPeerAct = nullptr; + QAction *addPeerAct = 0; if (!torrent->isQueued() && !torrent->isChecking()) { addPeerAct = menu.addAction(GuiIconProvider::instance()->getIcon("user-group-new"), tr("Add a new peer...")); emptyMenu = false; } - QAction *banAct = nullptr; - QAction *copyPeerAct = nullptr; + QAction *banAct = 0; + QAction *copyPeerAct = 0; if (!selectionModel()->selectedRows().isEmpty()) { copyPeerAct = menu.addAction(GuiIconProvider::instance()->getIcon("edit-copy"), tr("Copy IP:port")); menu.addSeparator(); @@ -244,25 +247,24 @@ } if (emptyMenu) return; QAction *act = menu.exec(QCursor::pos()); - if (!act) return; - + if (act == 0) return; if (act == addPeerAct) { - QList peersList = PeersAdditionDialog::askForPeers(this); + QList peersList = PeersAdditionDlg::askForPeers(); int peerCount = 0; foreach (const BitTorrent::PeerAddress &addr, peersList) { if (torrent->connectPeer(addr)) { - qDebug("Adding peer %s...", qUtf8Printable(addr.ip.toString())); + qDebug("Adding peer %s...", qPrintable(addr.ip.toString())); Logger::instance()->addMessage(tr("Manually adding peer '%1'...").arg(addr.ip.toString())); - ++peerCount; + peerCount++; } else { Logger::instance()->addMessage(tr("The peer '%1' could not be added to this torrent.").arg(addr.ip.toString()), Log::WARNING); } } if (peerCount < peersList.length()) - QMessageBox::information(this, tr("Peer addition"), tr("Some peers could not be added. Check the Log for details.")); + QMessageBox::information(0, tr("Peer addition"), tr("Some peers could not be added. Check the Log for details.")); else if (peerCount > 0) - QMessageBox::information(this, tr("Peer addition"), tr("The peers were added to this torrent.")); + QMessageBox::information(0, tr("Peer addition"), tr("The peers were added to this torrent.")); return; } if (act == banAct) { @@ -281,7 +283,8 @@ int ret = QMessageBox::question(this, tr("Ban peer permanently"), tr("Are you sure you want to ban permanently the selected peers?"), tr("&Yes"), tr("&No"), QString(), 0, 1); - if (ret) return; + if (ret) + return; QModelIndexList selectedIndexes = selectionModel()->selectedRows(); foreach (const QModelIndex &index, selectedIndexes) { @@ -303,12 +306,12 @@ int row = m_proxyModel->mapToSource(index).row(); QString ip = m_listModel->data(m_listModel->index(row, PeerListDelegate::IP_HIDDEN)).toString(); QString myport = m_listModel->data(m_listModel->index(row, PeerListDelegate::PORT)).toString(); - if (ip.indexOf('.') == -1) // IPv6 - selectedPeers << '[' + ip + "]:" + myport; + if (ip.indexOf(".") == -1) // IPv6 + selectedPeers << "[" + ip + "]:" + myport; else // IPv4 - selectedPeers << ip + ':' + myport; + selectedPeers << ip + ":" + myport; } - QApplication::clipboard()->setText(selectedPeers.join('\n')); + QApplication::clipboard()->setText(selectedPeers.join("\n")); } void PeerListWidget::clear() @@ -339,7 +342,7 @@ if (!torrent) return; QList peers = torrent->peers(); - QSet oldPeersSet = m_peerItems.keys().toSet(); + QSet oldeersSet = m_peerItems.keys().toSet(); foreach (const BitTorrent::PeerInfo &peer, peers) { BitTorrent::PeerAddress addr = peer.address(); @@ -349,7 +352,7 @@ if (m_peerItems.contains(peerIp)) { // Update existing peer updatePeer(peerIp, torrent, peer); - oldPeersSet.remove(peerIp); + oldeersSet.remove(peerIp); if (forceHostnameResolution && m_resolver) m_resolver->resolve(peerIp); } @@ -363,7 +366,7 @@ } } // Delete peers that are gone - QSetIterator it(oldPeersSet); + QSetIterator it(oldeersSet); while (it.hasNext()) { const QString &ip = it.next(); m_missingFlags.remove(ip); @@ -396,7 +399,7 @@ m_listModel->setData(m_listModel->index(row, PeerListDelegate::CONNECTION), peer.connectionType()); m_listModel->setData(m_listModel->index(row, PeerListDelegate::FLAGS), peer.flags()); m_listModel->setData(m_listModel->index(row, PeerListDelegate::FLAGS), peer.flagsDescription(), Qt::ToolTipRole); - m_listModel->setData(m_listModel->index(row, PeerListDelegate::CLIENT), peer.client().toHtmlEscaped()); + m_listModel->setData(m_listModel->index(row, PeerListDelegate::CLIENT), Utils::String::toHtmlEscaped(peer.client())); m_listModel->setData(m_listModel->index(row, PeerListDelegate::PROGRESS), peer.progress()); m_listModel->setData(m_listModel->index(row, PeerListDelegate::DOWN_SPEED), peer.payloadDownSpeed()); m_listModel->setData(m_listModel->index(row, PeerListDelegate::UP_SPEED), peer.payloadUpSpeed()); @@ -404,8 +407,8 @@ m_listModel->setData(m_listModel->index(row, PeerListDelegate::TOT_UP), peer.totalUpload()); m_listModel->setData(m_listModel->index(row, PeerListDelegate::RELEVANCE), peer.relevance()); QStringList downloadingFiles(torrent->info().filesForPiece(peer.downloadingPieceIndex())); - m_listModel->setData(m_listModel->index(row, PeerListDelegate::DOWNLOADING_PIECE), downloadingFiles.join(QLatin1Char(';'))); - m_listModel->setData(m_listModel->index(row, PeerListDelegate::DOWNLOADING_PIECE), downloadingFiles.join(QLatin1Char('\n')), Qt::ToolTipRole); + m_listModel->setData(m_listModel->index(row, PeerListDelegate::DOWNLOADING_PIECE), downloadingFiles.join(QLatin1String(";"))); + m_listModel->setData(m_listModel->index(row, PeerListDelegate::DOWNLOADING_PIECE), downloadingFiles.join(QLatin1String("\n")), Qt::ToolTipRole); return m_listModel->item(row, PeerListDelegate::IP); } @@ -427,7 +430,7 @@ m_listModel->setData(m_listModel->index(row, PeerListDelegate::PORT), peer.address().port); m_listModel->setData(m_listModel->index(row, PeerListDelegate::FLAGS), peer.flags()); m_listModel->setData(m_listModel->index(row, PeerListDelegate::FLAGS), peer.flagsDescription(), Qt::ToolTipRole); - m_listModel->setData(m_listModel->index(row, PeerListDelegate::CLIENT), peer.client().toHtmlEscaped()); + m_listModel->setData(m_listModel->index(row, PeerListDelegate::CLIENT), Utils::String::toHtmlEscaped(peer.client())); m_listModel->setData(m_listModel->index(row, PeerListDelegate::PROGRESS), peer.progress()); m_listModel->setData(m_listModel->index(row, PeerListDelegate::DOWN_SPEED), peer.payloadDownSpeed()); m_listModel->setData(m_listModel->index(row, PeerListDelegate::UP_SPEED), peer.payloadUpSpeed()); @@ -441,9 +444,9 @@ void PeerListWidget::handleResolved(const QString &ip, const QString &hostname) { - QStandardItem *item = m_peerItems.value(ip, nullptr); + QStandardItem *item = m_peerItems.value(ip, 0); if (item) { - qDebug("Resolved %s -> %s", qUtf8Printable(ip), qUtf8Printable(hostname)); + qDebug("Resolved %s -> %s", qPrintable(ip), qPrintable(hostname)); item->setData(hostname, Qt::DisplayRole); } } diff -Nru qbittorrent-4.1.3/src/gui/properties/peerlistwidget.h qbittorrent-3.3.15/src/gui/properties/peerlistwidget.h --- qbittorrent-4.1.3/src/gui/properties/peerlistwidget.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/peerlistwidget.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,16 +24,18 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef PEERLISTWIDGET_H #define PEERLISTWIDGET_H +#include #include #include #include #include -#include namespace Net { @@ -44,9 +46,11 @@ class PeerListSortModel; class PropertiesWidget; +QT_BEGIN_NAMESPACE class QSortFilterProxyModel; class QStandardItem; class QStandardItemModel; +QT_END_NAMESPACE namespace BitTorrent { @@ -55,13 +59,13 @@ struct PeerAddress; } -class PeerListWidget : public QTreeView +class PeerListWidget: public QTreeView { Q_OBJECT public: explicit PeerListWidget(PropertiesWidget *parent); - ~PeerListWidget() override; + ~PeerListWidget(); void loadPeers(BitTorrent::TorrentHandle *const torrent, bool forceHostnameResolution = false); QStandardItem *addPeer(const QString &ip, BitTorrent::TorrentHandle *const torrent, const BitTorrent::PeerInfo &peer); diff -Nru qbittorrent-4.1.3/src/gui/properties/peersadditiondialog.cpp qbittorrent-3.3.15/src/gui/properties/peersadditiondialog.cpp --- qbittorrent-4.1.3/src/gui/properties/peersadditiondialog.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/peersadditiondialog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,104 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "peersadditiondialog.h" - -#include -#include - -#include "ui_peersadditiondialog.h" - -PeersAdditionDialog::PeersAdditionDialog(QWidget *parent) - : QDialog(parent) - , m_ui(new Ui::PeersAdditionDialog()) -{ - m_ui->setupUi(this); - connect(m_ui->buttonBox, &QDialogButtonBox::accepted, this, &PeersAdditionDialog::validateInput); -} - -PeersAdditionDialog::~PeersAdditionDialog() -{ - delete m_ui; -} - -QList PeersAdditionDialog::askForPeers(QWidget *parent) -{ - PeersAdditionDialog dlg(parent); - dlg.exec(); - return dlg.m_peersList; -} - -void PeersAdditionDialog::validateInput() -{ - if (m_ui->textEditPeers->toPlainText().trimmed().isEmpty()) { - QMessageBox::warning(this, tr("No peer entered"), - tr("Please type at least one peer."), - QMessageBox::Ok); - return; - } - foreach (const QString &peer, m_ui->textEditPeers->toPlainText().trimmed().split('\n')) { - BitTorrent::PeerAddress addr = parsePeer(peer); - if (!addr.ip.isNull()) { - m_peersList.append(addr); - } - else { - QMessageBox::warning(this, tr("Invalid peer"), - tr("The peer '%1' is invalid.").arg(peer), - QMessageBox::Ok); - m_peersList.clear(); - return; - } - } - accept(); -} - -BitTorrent::PeerAddress PeersAdditionDialog::parsePeer(QString peer) -{ - BitTorrent::PeerAddress addr; - QStringList ipPort; - - if ((peer[0] == '[') && (peer.indexOf("]:") != -1)) // IPv6 - ipPort = peer.remove(QChar('[')).split("]:"); - else if (peer.indexOf(':') != -1) // IPv4 - ipPort = peer.split(':'); - else - return addr; - - QHostAddress ip(ipPort[0]); - if (ip.isNull()) - return addr; - - bool ok; - int port = ipPort[1].toInt(&ok); - if (!ok || (port < 1) || (port > 65535)) - return addr; - - addr.ip = ip; - addr.port = port; - return addr; -} diff -Nru qbittorrent-4.1.3/src/gui/properties/peersadditiondialog.h qbittorrent-3.3.15/src/gui/properties/peersadditiondialog.h --- qbittorrent-4.1.3/src/gui/properties/peersadditiondialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/peersadditiondialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef PEERADDITION_H -#define PEERADDITION_H - -#include -#include - -#include "base/bittorrent/peerinfo.h" - -namespace Ui -{ - class PeersAdditionDialog; -} - -class PeersAdditionDialog : public QDialog -{ - Q_OBJECT - -public: - PeersAdditionDialog(QWidget *parent); - ~PeersAdditionDialog(); - - static QList askForPeers(QWidget *parent); - -protected slots: - void validateInput(); - -private: - BitTorrent::PeerAddress parsePeer(QString peer); - - Ui::PeersAdditionDialog *m_ui; - QList m_peersList; -}; - -#endif // PEERADDITION_H diff -Nru qbittorrent-4.1.3/src/gui/properties/peersadditiondialog.ui qbittorrent-3.3.15/src/gui/properties/peersadditiondialog.ui --- qbittorrent-4.1.3/src/gui/properties/peersadditiondialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/peersadditiondialog.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,68 +0,0 @@ - - - PeersAdditionDialog - - - - 0 - 0 - 367 - 274 - - - - Add Peers - - - - - - List of peers to add (one IP per line): - - - - - - - QTextEdit::NoWrap - - - false - - - Format: IPv4:port / [IPv6]:port - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - buttonBox - rejected() - PeersAdditionDialog - reject() - - - 183 - 251 - - - 183 - 136 - - - - - diff -Nru qbittorrent-4.1.3/src/gui/properties/peersadditiondlg.cpp qbittorrent-3.3.15/src/gui/properties/peersadditiondlg.cpp --- qbittorrent-4.1.3/src/gui/properties/peersadditiondlg.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/peersadditiondlg.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,111 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#include "peersadditiondlg.h" + +#include +#include + +#include "ui_peersadditiondlg.h" + +PeersAdditionDlg::PeersAdditionDlg(QWidget *parent) + : QDialog(parent) + , m_ui(new Ui::addPeersDialog()) +{ + m_ui->setupUi(this); + connect(m_ui->buttonBox, SIGNAL(accepted()), this, SLOT(validateInput())); + +#ifdef QBT_USES_QT5 + m_ui->label_format->hide(); + m_ui->peers_txt->setPlaceholderText("Format: IPv4:port / [IPv6]:port"); +#endif +} + +PeersAdditionDlg::~PeersAdditionDlg() +{ + delete m_ui; +} + +QList PeersAdditionDlg::askForPeers() +{ + PeersAdditionDlg dlg; + dlg.exec(); + return dlg.m_peersList; +} + +void PeersAdditionDlg::validateInput() +{ + if (m_ui->peers_txt->toPlainText().trimmed().isEmpty()) { + QMessageBox::warning(this, tr("No peer entered"), + tr("Please type at least one peer."), + QMessageBox::Ok); + return; + } + foreach (const QString &peer, m_ui->peers_txt->toPlainText().trimmed().split("\n")) { + BitTorrent::PeerAddress addr = parsePeer(peer); + if (!addr.ip.isNull()) { + m_peersList.append(addr); + } + else { + QMessageBox::warning(this, tr("Invalid peer"), + tr("The peer '%1' is invalid.").arg(peer), + QMessageBox::Ok); + m_peersList.clear(); + return; + } + } + accept(); +} + +BitTorrent::PeerAddress PeersAdditionDlg::parsePeer(QString peer) +{ + BitTorrent::PeerAddress addr; + QStringList ipPort; + + if (peer[0] == '[' && peer.indexOf("]:") != -1) // IPv6 + ipPort = peer.remove(QChar('[')).split("]:"); + else if (peer.indexOf(":") != -1) // IPv4 + ipPort = peer.split(":"); + else + return addr; + + QHostAddress ip(ipPort[0]); + if (ip.isNull()) + return addr; + + bool ok; + int port = ipPort[1].toInt(&ok); + if (!ok || port < 1 || port > 65535) + return addr; + + addr.ip = ip; + addr.port = port; + return addr; +} diff -Nru qbittorrent-4.1.3/src/gui/properties/peersadditiondlg.h qbittorrent-3.3.15/src/gui/properties/peersadditiondlg.h --- qbittorrent-4.1.3/src/gui/properties/peersadditiondlg.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/peersadditiondlg.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,66 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef PEERADDITION_H +#define PEERADDITION_H + +#include + +#include "base/bittorrent/peerinfo.h" + +template class QList; + +namespace Ui +{ + class addPeersDialog; +} + +class PeersAdditionDlg: public QDialog +{ + Q_OBJECT + +public: + PeersAdditionDlg(QWidget *parent = 0); + ~PeersAdditionDlg(); + + static QList askForPeers(); + +protected slots: + void validateInput(); + +private: + BitTorrent::PeerAddress parsePeer(QString peer); + + Ui::addPeersDialog *m_ui; + QList m_peersList; + +}; + +#endif // PEERADDITION_H diff -Nru qbittorrent-4.1.3/src/gui/properties/peersadditiondlg.ui qbittorrent-3.3.15/src/gui/properties/peersadditiondlg.ui --- qbittorrent-4.1.3/src/gui/properties/peersadditiondlg.ui 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/peersadditiondlg.ui 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,75 @@ + + + addPeersDialog + + + + 0 + 0 + 367 + 274 + + + + Add Peers + + + + + + List of peers to add (one per line): + + + + + + + QTextEdit::NoWrap + + + false + + + + + + + Format: IPv4:port / [IPv6]:port + + + + + + + true + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + rejected() + addPeersDialog + reject() + + + 183 + 251 + + + 183 + 136 + + + + + diff -Nru qbittorrent-4.1.3/src/gui/properties/pieceavailabilitybar.cpp qbittorrent-3.3.15/src/gui/properties/pieceavailabilitybar.cpp --- qbittorrent-4.1.3/src/gui/properties/pieceavailabilitybar.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/pieceavailabilitybar.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #include "pieceavailabilitybar.h" @@ -42,7 +44,7 @@ QVector result(reqSize, 0.0); if (vecin.isEmpty()) return result; - const float ratio = static_cast(vecin.size()) / reqSize; + const float ratio = vecin.size() / (float)reqSize; const int maxElement = *std::max_element(vecin.begin(), vecin.end()); @@ -109,8 +111,8 @@ // normalization <0, 1> value /= ratio * maxElement; - // float precision sometimes gives > 1, because it's not possible to store irrational numbers - value = qMin(value, 1.0f); + // float precision sometimes gives > 1, because in not possible to store irrational numbers + value = qMin(value, (float)1.0); result[x] = value; } @@ -132,12 +134,12 @@ return true; } - QVector scaledPieces = intToFloatVector(m_pieces, image2.width()); + QVector scaled_pieces = intToFloatVector(m_pieces, image2.width()); // filling image - for (int x = 0; x < scaledPieces.size(); ++x) { - float piecesToValue = scaledPieces.at(x); - image2.setPixel(x, 0, pieceColors()[piecesToValue * 255]); + for (int x = 0; x < scaled_pieces.size(); ++x) { + float pieces2_val = scaled_pieces.at(x); + image2.setPixel(x, 0, pieceColors()[pieces2_val * 255]); } image = image2; return true; diff -Nru qbittorrent-4.1.3/src/gui/properties/pieceavailabilitybar.h qbittorrent-3.3.15/src/gui/properties/pieceavailabilitybar.h --- qbittorrent-4.1.3/src/gui/properties/pieceavailabilitybar.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/pieceavailabilitybar.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef PIECEAVAILABILITYBAR_H @@ -31,7 +33,7 @@ #include "piecesbar.h" -class PieceAvailabilityBar : public PiecesBar +class PieceAvailabilityBar: public PiecesBar { using base = PiecesBar; Q_OBJECT diff -Nru qbittorrent-4.1.3/src/gui/properties/piecesbar.cpp qbittorrent-3.3.15/src/gui/properties/piecesbar.cpp --- qbittorrent-4.1.3/src/gui/properties/piecesbar.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/piecesbar.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -50,7 +50,7 @@ { public: PieceIndexToImagePos(const BitTorrent::TorrentInfo &torrentInfo, const QImage &image) - : m_bytesPerPixel {((image.width() > 0) && (torrentInfo.totalSize() >= image.width())) + : m_bytesPerPixel {(image.width() > 0 && torrentInfo.totalSize() >= image.width()) ? torrentInfo.totalSize() / image.width() : -1} , m_torrentInfo {torrentInfo} { diff -Nru qbittorrent-4.1.3/src/gui/properties/piecesbar.h qbittorrent-3.3.15/src/gui/properties/piecesbar.h --- qbittorrent-4.1.3/src/gui/properties/piecesbar.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/piecesbar.h 2017-08-03 20:30:10.000000000 +0000 @@ -41,7 +41,7 @@ class TorrentHandle; } -class PiecesBar : public QWidget +class PiecesBar: public QWidget { using base = QWidget; Q_OBJECT diff -Nru qbittorrent-4.1.3/src/gui/properties/properties.pri qbittorrent-3.3.15/src/gui/properties/properties.pri --- qbittorrent-4.1.3/src/gui/properties/properties.pri 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/properties.pri 2017-08-03 20:30:10.000000000 +0000 @@ -1,36 +1,33 @@ INCLUDEPATH += $$PWD -FORMS += \ - $$PWD/peersadditiondialog.ui \ - $$PWD/propertieswidget.ui \ - $$PWD/trackersadditiondialog.ui +FORMS += $$PWD/propertieswidget.ui \ + $$PWD/trackersadditiondlg.ui \ + $$PWD/peersadditiondlg.ui -HEADERS += \ - $$PWD/downloadedpiecesbar.h \ - $$PWD/peerlistdelegate.h \ - $$PWD/peerlistsortmodel.h \ - $$PWD/peerlistwidget.h \ - $$PWD/peersadditiondialog.h \ - $$PWD/pieceavailabilitybar.h \ - $$PWD/piecesbar.h \ - $$PWD/propertieswidget.h \ - $$PWD/proplistdelegate.h \ - $$PWD/proptabbar.h \ - $$PWD/speedplotview.h \ - $$PWD/speedwidget.h \ - $$PWD/trackerlistwidget.h \ - $$PWD/trackersadditiondialog.h +HEADERS += $$PWD/propertieswidget.h \ + $$PWD/peerlistwidget.h \ + $$PWD/proplistdelegate.h \ + $$PWD/trackerlist.h \ + $$PWD/downloadedpiecesbar.h \ + $$PWD/peerlistdelegate.h \ + $$PWD/peerlistsortmodel.h \ + $$PWD/peersadditiondlg.h \ + $$PWD/trackersadditiondlg.h \ + $$PWD/pieceavailabilitybar.h \ + $$PWD/proptabbar.h \ + $$PWD/speedwidget.h \ + $$PWD/speedplotview.h \ + $$PWD/piecesbar.h -SOURCES += \ - $$PWD/downloadedpiecesbar.cpp \ - $$PWD/peerlistwidget.cpp \ - $$PWD/peersadditiondialog.cpp \ - $$PWD/pieceavailabilitybar.cpp \ - $$PWD/piecesbar.cpp \ - $$PWD/propertieswidget.cpp \ - $$PWD/proplistdelegate.cpp \ - $$PWD/proptabbar.cpp \ - $$PWD/speedplotview.cpp \ - $$PWD/speedwidget.cpp \ - $$PWD/trackerlistwidget.cpp \ - $$PWD/trackersadditiondialog.cpp +SOURCES += $$PWD/propertieswidget.cpp \ + $$PWD/proplistdelegate.cpp \ + $$PWD/peerlistwidget.cpp \ + $$PWD/trackerlist.cpp \ + $$PWD/peersadditiondlg.cpp \ + $$PWD/downloadedpiecesbar.cpp \ + $$PWD/trackersadditiondlg.cpp \ + $$PWD/pieceavailabilitybar.cpp \ + $$PWD/proptabbar.cpp \ + $$PWD/speedwidget.cpp \ + $$PWD/speedplotview.cpp \ + $$PWD/piecesbar.cpp diff -Nru qbittorrent-4.1.3/src/gui/properties/propertieswidget.cpp qbittorrent-3.3.15/src/gui/properties/propertieswidget.cpp --- qbittorrent-4.1.3/src/gui/properties/propertieswidget.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/propertieswidget.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,207 +24,218 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #include "propertieswidget.h" -#include #include -#include +#include #include -#include -#include +#include #include -#include -#include +#include +#include +#include +#include +#include +#include +#include #include "base/bittorrent/session.h" #include "base/preferences.h" -#include "base/unicodestrings.h" #include "base/utils/fs.h" #include "base/utils/misc.h" #include "base/utils/string.h" -#include "autoexpandabledialog.h" -#include "downloadedpiecesbar.h" -#include "guiiconprovider.h" -#include "lineedit.h" -#include "mainwindow.h" -#include "peerlistwidget.h" -#include "pieceavailabilitybar.h" +#include "base/unicodestrings.h" #include "proplistdelegate.h" -#include "proptabbar.h" -#include "raisedmessagebox.h" -#include "speedwidget.h" #include "torrentcontentfiltermodel.h" #include "torrentcontentmodel.h" -#include "trackerlistwidget.h" +#include "peerlistwidget.h" +#include "speedwidget.h" +#include "trackerlist.h" +#include "mainwindow.h" +#include "messageboxraised.h" +#include "downloadedpiecesbar.h" +#include "pieceavailabilitybar.h" +#include "proptabbar.h" +#include "guiiconprovider.h" +#include "lineedit.h" #include "transferlistwidget.h" -#include "utils.h" +#include "autoexpandabledialog.h" #include "ui_propertieswidget.h" -#ifdef Q_OS_MAC -#include "macutilities.h" -#endif - -PropertiesWidget::PropertiesWidget(QWidget *parent, MainWindow *mainWindow, TransferListWidget *transferList) +PropertiesWidget::PropertiesWidget(QWidget *parent, MainWindow *main_window, TransferListWidget *transferList) : QWidget(parent) , m_ui(new Ui::PropertiesWidget()) - , m_transferList(transferList) - , m_mainWindow(mainWindow) - , m_torrent(nullptr) + , transferList(transferList) + , main_window(main_window) + , m_torrent(0) { m_ui->setupUi(this); setAutoFillBackground(true); - m_state = VISIBLE; + state = VISIBLE; // Set Properties list model - m_propListModel = new TorrentContentFilterModel(); - m_ui->filesList->setModel(m_propListModel); - m_propListDelegate = new PropListDelegate(this); - m_ui->filesList->setItemDelegate(m_propListDelegate); + PropListModel = new TorrentContentFilterModel(); + m_ui->filesList->setModel(PropListModel); + PropDelegate = new PropListDelegate(this); + m_ui->filesList->setItemDelegate(PropDelegate); m_ui->filesList->setSortingEnabled(true); - // Torrent content filtering m_contentFilterLine = new LineEdit(this); m_contentFilterLine->setPlaceholderText(tr("Filter files...")); - m_contentFilterLine->setFixedWidth(Utils::Gui::scaledSize(this, 300)); - connect(m_contentFilterLine, &LineEdit::textChanged, this, &PropertiesWidget::filterText); + m_contentFilterLine->setMaximumSize(300, m_contentFilterLine->size().height()); + connect(m_contentFilterLine, SIGNAL(textChanged(QString)), this, SLOT(filterText(QString))); m_ui->contentFilterLayout->insertWidget(3, m_contentFilterLine); // SIGNAL/SLOTS - connect(m_ui->filesList, &QAbstractItemView::clicked - , m_ui->filesList, static_cast(&QAbstractItemView::edit)); - connect(m_ui->selectAllButton, &QPushButton::clicked, m_propListModel, &TorrentContentFilterModel::selectAll); - connect(m_ui->selectNoneButton, &QPushButton::clicked, m_propListModel, &TorrentContentFilterModel::selectNone); - connect(m_ui->filesList, &QWidget::customContextMenuRequested, this, &PropertiesWidget::displayFilesListMenu); - connect(m_ui->filesList, &QAbstractItemView::doubleClicked, this, &PropertiesWidget::openDoubleClickedFile); - connect(m_propListModel, &TorrentContentFilterModel::filteredFilesChanged, this, &PropertiesWidget::filteredFilesChanged); - connect(m_ui->listWebSeeds, &QWidget::customContextMenuRequested, this, &PropertiesWidget::displayWebSeedListMenu); - connect(transferList, &TransferListWidget::currentTorrentChanged, this, &PropertiesWidget::loadTorrentInfos); - connect(m_propListDelegate, &PropListDelegate::filteredFilesChanged, this, &PropertiesWidget::filteredFilesChanged); - connect(m_ui->stackedProperties, &QStackedWidget::currentChanged, this, &PropertiesWidget::loadDynamicData); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::torrentSavePathChanged, this, &PropertiesWidget::updateSavePath); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::torrentMetadataLoaded, this, &PropertiesWidget::updateTorrentInfos); - connect(m_ui->filesList->header(), &QHeaderView::sectionMoved, this, &PropertiesWidget::saveSettings); - connect(m_ui->filesList->header(), &QHeaderView::sectionResized, this, &PropertiesWidget::saveSettings); - connect(m_ui->filesList->header(), &QHeaderView::sortIndicatorChanged, this, &PropertiesWidget::saveSettings); + connect(m_ui->filesList, SIGNAL(clicked(const QModelIndex&)), m_ui->filesList, SLOT(edit(const QModelIndex&))); + connect(m_ui->selectAllButton, SIGNAL(clicked()), PropListModel, SLOT(selectAll())); + connect(m_ui->selectNoneButton, SIGNAL(clicked()), PropListModel, SLOT(selectNone())); + connect(m_ui->filesList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFilesListMenu(const QPoint&))); + connect(m_ui->filesList, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(openDoubleClickedFile(const QModelIndex&))); + connect(PropListModel, SIGNAL(filteredFilesChanged()), this, SLOT(filteredFilesChanged())); + connect(m_ui->listWebSeeds, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayWebSeedListMenu(const QPoint&))); + connect(transferList, SIGNAL(currentTorrentChanged(BitTorrent::TorrentHandle * const)), this, SLOT(loadTorrentInfos(BitTorrent::TorrentHandle * const))); + connect(PropDelegate, SIGNAL(filteredFilesChanged()), this, SLOT(filteredFilesChanged())); + connect(m_ui->stackedProperties, SIGNAL(currentChanged(int)), this, SLOT(loadDynamicData())); + connect(BitTorrent::Session::instance(), SIGNAL(torrentSavePathChanged(BitTorrent::TorrentHandle * const)), this, SLOT(updateSavePath(BitTorrent::TorrentHandle * const))); + connect(BitTorrent::Session::instance(), SIGNAL(torrentMetadataLoaded(BitTorrent::TorrentHandle * const)), this, SLOT(updateTorrentInfos(BitTorrent::TorrentHandle * const))); + connect(m_ui->filesList->header(), SIGNAL(sectionMoved(int,int,int)), this, SLOT(saveSettings())); + connect(m_ui->filesList->header(), SIGNAL(sectionResized(int,int,int)), this, SLOT(saveSettings())); + connect(m_ui->filesList->header(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), this, SLOT(saveSettings())); +#ifdef QBT_USES_QT5 // set bar height relative to screen dpi - const int barHeight = Utils::Gui::scaledSize(this, 18); + int barHeight = devicePixelRatio() * 18; +#else + // set bar height relative to font height + QFont defFont; + QFontMetrics fMetrics(defFont, 0); // need to be device-dependent + int barHeight = fMetrics.height() * 5 / 4; +#endif // Downloaded pieces progress bar m_ui->tempProgressBarArea->setVisible(false); - m_downloadedPieces = new DownloadedPiecesBar(this); - m_ui->groupBarLayout->addWidget(m_downloadedPieces, 0, 1); - m_downloadedPieces->setFixedHeight(barHeight); - m_downloadedPieces->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + downloaded_pieces = new DownloadedPiecesBar(this); + m_ui->groupBarLayout->addWidget(downloaded_pieces, 0, 1); + downloaded_pieces->setFixedHeight(barHeight); + downloaded_pieces->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); // Pieces availability bar m_ui->tempAvailabilityBarArea->setVisible(false); - m_piecesAvailability = new PieceAvailabilityBar(this); - m_ui->groupBarLayout->addWidget(m_piecesAvailability, 1, 1); - m_piecesAvailability->setFixedHeight(barHeight); - m_piecesAvailability->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + pieces_availability = new PieceAvailabilityBar(this); + m_ui->groupBarLayout->addWidget(pieces_availability, 1, 1); + pieces_availability->setFixedHeight(barHeight); + pieces_availability->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); // Tracker list - m_trackerList = new TrackerListWidget(this); + trackerList = new TrackerList(this); m_ui->trackerUpButton->setIcon(GuiIconProvider::instance()->getIcon("go-up")); - m_ui->trackerUpButton->setIconSize(Utils::Gui::smallIconSize()); + m_ui->trackerUpButton->setIconSize(Utils::Misc::smallIconSize()); m_ui->trackerDownButton->setIcon(GuiIconProvider::instance()->getIcon("go-down")); - m_ui->trackerDownButton->setIconSize(Utils::Gui::smallIconSize()); - connect(m_ui->trackerUpButton, &QPushButton::clicked, m_trackerList, &TrackerListWidget::moveSelectionUp); - connect(m_ui->trackerDownButton, &QPushButton::clicked, m_trackerList, &TrackerListWidget::moveSelectionDown); - m_ui->hBoxLayoutTrackers->insertWidget(0, m_trackerList); + m_ui->trackerDownButton->setIconSize(Utils::Misc::smallIconSize()); + connect(m_ui->trackerUpButton, SIGNAL(clicked()), trackerList, SLOT(moveSelectionUp())); + connect(m_ui->trackerDownButton, SIGNAL(clicked()), trackerList, SLOT(moveSelectionDown())); + m_ui->horizontalLayout_trackers->insertWidget(0, trackerList); + connect(trackerList->header(), SIGNAL(sectionMoved(int,int,int)), trackerList, SLOT(saveSettings())); + connect(trackerList->header(), SIGNAL(sectionResized(int,int,int)), trackerList, SLOT(saveSettings())); + connect(trackerList->header(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), trackerList, SLOT(saveSettings())); // Peers list - m_peerList = new PeerListWidget(this); - m_ui->vBoxLayoutPeerPage->addWidget(m_peerList); + peersList = new PeerListWidget(this); + m_ui->peerpage_layout->addWidget(peersList); + connect(peersList->header(), SIGNAL(sectionMoved(int,int,int)), peersList, SLOT(saveSettings())); + connect(peersList->header(), SIGNAL(sectionResized(int,int,int)), peersList, SLOT(saveSettings())); + connect(peersList->header(), SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)), peersList, SLOT(saveSettings())); // Speed widget - m_speedWidget = new SpeedWidget(this); - m_ui->speedLayout->addWidget(m_speedWidget); + speedWidget = new SpeedWidget(this); + m_ui->speed_layout->addWidget(speedWidget); // Tab bar m_tabBar = new PropTabBar(); m_tabBar->setContentsMargins(0, 5, 0, 0); m_ui->verticalLayout->addLayout(m_tabBar); - connect(m_tabBar, &PropTabBar::tabChanged, m_ui->stackedProperties, &QStackedWidget::setCurrentIndex); - connect(m_tabBar, &PropTabBar::tabChanged, this, &PropertiesWidget::saveSettings); - connect(m_tabBar, &PropTabBar::visibilityToggled, this, &PropertiesWidget::setVisibility); - connect(m_tabBar, &PropTabBar::visibilityToggled, this, &PropertiesWidget::saveSettings); + connect(m_tabBar, SIGNAL(tabChanged(int)), m_ui->stackedProperties, SLOT(setCurrentIndex(int))); + connect(m_tabBar, SIGNAL(tabChanged(int)), this, SLOT(saveSettings())); + connect(m_tabBar, SIGNAL(visibilityToggled(bool)), SLOT(setVisibility(bool))); + connect(m_tabBar, SIGNAL(visibilityToggled(bool)), this, SLOT(saveSettings())); // Dynamic data refresher - m_refreshTimer = new QTimer(this); - connect(m_refreshTimer, &QTimer::timeout, this, &PropertiesWidget::loadDynamicData); - m_refreshTimer->start(3000); // 3sec - m_editHotkeyFile = new QShortcut(Qt::Key_F2, m_ui->filesList, nullptr, nullptr, Qt::WidgetShortcut); - connect(m_editHotkeyFile, &QShortcut::activated, this, &PropertiesWidget::renameSelectedFile); - m_editHotkeyWeb = new QShortcut(Qt::Key_F2, m_ui->listWebSeeds, nullptr, nullptr, Qt::WidgetShortcut); - connect(m_editHotkeyWeb, &QShortcut::activated, this, &PropertiesWidget::editWebSeed); - connect(m_ui->listWebSeeds, &QListWidget::doubleClicked, this, &PropertiesWidget::editWebSeed); - m_deleteHotkeyWeb = new QShortcut(QKeySequence::Delete, m_ui->listWebSeeds, nullptr, nullptr, Qt::WidgetShortcut); - connect(m_deleteHotkeyWeb, &QShortcut::activated, this, &PropertiesWidget::deleteSelectedUrlSeeds); - m_openHotkeyFile = new QShortcut(Qt::Key_Return, m_ui->filesList, nullptr, nullptr, Qt::WidgetShortcut); - connect(m_openHotkeyFile, &QShortcut::activated, this, &PropertiesWidget::openSelectedFile); + refreshTimer = new QTimer(this); + connect(refreshTimer, SIGNAL(timeout()), this, SLOT(loadDynamicData())); + refreshTimer->start(3000); // 3sec + editHotkeyFile = new QShortcut(Qt::Key_F2, m_ui->filesList, 0, 0, Qt::WidgetShortcut); + connect(editHotkeyFile, SIGNAL(activated()), SLOT(renameSelectedFile())); + editHotkeyWeb = new QShortcut(Qt::Key_F2, m_ui->listWebSeeds, 0, 0, Qt::WidgetShortcut); + connect(editHotkeyWeb, SIGNAL(activated()), SLOT(editWebSeed())); + connect(m_ui->listWebSeeds, SIGNAL(doubleClicked(QModelIndex)), SLOT(editWebSeed())); + deleteHotkeyWeb = new QShortcut(QKeySequence::Delete, m_ui->listWebSeeds, 0, 0, Qt::WidgetShortcut); + connect(deleteHotkeyWeb, SIGNAL(activated()), SLOT(deleteSelectedUrlSeeds())); + openHotkeyFile = new QShortcut(Qt::Key_Return, m_ui->filesList, 0, 0, Qt::WidgetShortcut); + connect(openHotkeyFile, SIGNAL(activated()), SLOT(openSelectedFile())); } PropertiesWidget::~PropertiesWidget() { qDebug() << Q_FUNC_INFO << "ENTER"; - delete m_refreshTimer; - delete m_trackerList; - delete m_peerList; - delete m_speedWidget; - delete m_downloadedPieces; - delete m_piecesAvailability; - delete m_propListModel; - delete m_propListDelegate; + delete refreshTimer; + delete trackerList; + delete peersList; + delete speedWidget; + delete downloaded_pieces; + delete pieces_availability; + delete PropListModel; + delete PropDelegate; delete m_tabBar; - delete m_editHotkeyFile; - delete m_editHotkeyWeb; - delete m_deleteHotkeyWeb; - delete m_openHotkeyFile; + delete editHotkeyFile; + delete editHotkeyWeb; + delete deleteHotkeyWeb; + delete openHotkeyFile; delete m_ui; qDebug() << Q_FUNC_INFO << "EXIT"; } void PropertiesWidget::showPiecesAvailability(bool show) { - m_ui->labelPiecesAvailability->setVisible(show); - m_piecesAvailability->setVisible(show); - m_ui->labelAverageAvailabilityVal->setVisible(show); - if (show || !m_downloadedPieces->isVisible()) - m_ui->lineBelowBars->setVisible(show); + m_ui->avail_pieces_lbl->setVisible(show); + pieces_availability->setVisible(show); + m_ui->avail_average_lbl->setVisible(show); + if (show || !downloaded_pieces->isVisible()) + m_ui->line_2->setVisible(show); } void PropertiesWidget::showPiecesDownloaded(bool show) { - m_ui->labelDownloadedPieces->setVisible(show); - m_downloadedPieces->setVisible(show); - m_ui->labelProgressVal->setVisible(show); - if (show || !m_piecesAvailability->isVisible()) - m_ui->lineBelowBars->setVisible(show); + m_ui->downloaded_pieces_lbl->setVisible(show); + downloaded_pieces->setVisible(show); + m_ui->progress_lbl->setVisible(show); + if (show || !pieces_availability->isVisible()) + m_ui->line_2->setVisible(show); } void PropertiesWidget::setVisibility(bool visible) { - if (!visible && (m_state == VISIBLE)) { + if (!visible && ( state == VISIBLE) ) { QSplitter *hSplitter = static_cast(parentWidget()); m_ui->stackedProperties->setVisible(false); - m_slideSizes = hSplitter->sizes(); + slideSizes = hSplitter->sizes(); hSplitter->handle(1)->setVisible(false); hSplitter->handle(1)->setDisabled(true); QList sizes = QList() << hSplitter->geometry().height() - 30 << 30; hSplitter->setSizes(sizes); - m_state = REDUCED; + state = REDUCED; return; } - if (visible && (m_state == REDUCED)) { + if (visible && ( state == REDUCED) ) { m_ui->stackedProperties->setVisible(true); QSplitter *hSplitter = static_cast(parentWidget()); hSplitter->handle(1)->setDisabled(false); hSplitter->handle(1)->setVisible(true); - hSplitter->setSizes(m_slideSizes); - m_state = VISIBLE; + hSplitter->setSizes(slideSizes); + state = VISIBLE; // Force refresh loadDynamicData(); } @@ -233,39 +244,39 @@ void PropertiesWidget::clear() { qDebug("Clearing torrent properties"); - m_ui->labelSavePathVal->clear(); - m_ui->labelCreatedOnVal->clear(); - m_ui->labelTotalPiecesVal->clear(); - m_ui->labelHashVal->clear(); - m_ui->labelCommentVal->clear(); - m_ui->labelProgressVal->clear(); - m_ui->labelAverageAvailabilityVal->clear(); - m_ui->labelWastedVal->clear(); - m_ui->labelUpTotalVal->clear(); - m_ui->labelDlTotalVal->clear(); - m_ui->labelUpLimitVal->clear(); - m_ui->labelDlLimitVal->clear(); - m_ui->labelElapsedVal->clear(); - m_ui->labelConnectionsVal->clear(); - m_ui->labelReannounceInVal->clear(); - m_ui->labelShareRatioVal->clear(); + m_ui->save_path->clear(); + m_ui->lbl_creationDate->clear(); + m_ui->label_total_pieces_val->clear(); + m_ui->hash_lbl->clear(); + m_ui->comment_text->clear(); + m_ui->progress_lbl->clear(); + trackerList->clear(); + downloaded_pieces->clear(); + pieces_availability->clear(); + m_ui->avail_average_lbl->clear(); + m_ui->wasted->clear(); + m_ui->upTotal->clear(); + m_ui->dlTotal->clear(); + peersList->clear(); + m_ui->lbl_uplimit->clear(); + m_ui->lbl_dllimit->clear(); + m_ui->lbl_elapsed->clear(); + m_ui->lbl_connections->clear(); + m_ui->reannounce_lbl->clear(); + m_ui->shareRatio->clear(); m_ui->listWebSeeds->clear(); - m_ui->labelETAVal->clear(); - m_ui->labelSeedsVal->clear(); - m_ui->labelPeersVal->clear(); - m_ui->labelDlSpeedVal->clear(); - m_ui->labelUpSpeedVal->clear(); - m_ui->labelTotalSizeVal->clear(); - m_ui->labelCompletedOnVal->clear(); - m_ui->labelLastSeenCompleteVal->clear(); - m_ui->labelCreatedByVal->clear(); - m_ui->labelAddedOnVal->clear(); - m_trackerList->clear(); - m_downloadedPieces->clear(); - m_piecesAvailability->clear(); - m_peerList->clear(); m_contentFilterLine->clear(); - m_propListModel->model()->clear(); + PropListModel->model()->clear(); + m_ui->label_eta_val->clear(); + m_ui->label_seeds_val->clear(); + m_ui->label_peers_val->clear(); + m_ui->label_dl_speed_val->clear(); + m_ui->label_upload_speed_val->clear(); + m_ui->label_total_size_val->clear(); + m_ui->label_completed_on_val->clear(); + m_ui->label_last_complete_val->clear(); + m_ui->label_created_by_val->clear(); + m_ui->label_added_on_val->clear(); } BitTorrent::TorrentHandle *PropertiesWidget::getCurrentTorrent() const @@ -273,41 +284,26 @@ return m_torrent; } -TrackerListWidget *PropertiesWidget::getTrackerList() const -{ - return m_trackerList; -} - -PeerListWidget *PropertiesWidget::getPeerList() const -{ - return m_peerList; -} - QTreeView *PropertiesWidget::getFilesList() const { return m_ui->filesList; } -SpeedWidget *PropertiesWidget::getSpeedWidget() const -{ - return m_speedWidget; -} - void PropertiesWidget::updateSavePath(BitTorrent::TorrentHandle *const torrent) { - if (torrent == m_torrent) - m_ui->labelSavePathVal->setText(Utils::Fs::toNativePath(m_torrent->savePath())); + if (m_torrent == torrent) + m_ui->save_path->setText(Utils::Fs::toNativePath(m_torrent->savePath())); } void PropertiesWidget::loadTrackers(BitTorrent::TorrentHandle *const torrent) { if (torrent == m_torrent) - m_trackerList->loadTrackers(); + trackerList->loadTrackers(); } void PropertiesWidget::updateTorrentInfos(BitTorrent::TorrentHandle *const torrent) { - if (torrent == m_torrent) + if (m_torrent == torrent) loadTorrentInfos(m_torrent); } @@ -315,36 +311,35 @@ { clear(); m_torrent = torrent; - m_downloadedPieces->setTorrent(m_torrent); - m_piecesAvailability->setTorrent(m_torrent); + downloaded_pieces->setTorrent(m_torrent); + pieces_availability->setTorrent(m_torrent); if (!m_torrent) return; // Save path updateSavePath(m_torrent); // Hash - m_ui->labelHashVal->setText(m_torrent->hash()); - m_propListModel->model()->clear(); + m_ui->hash_lbl->setText(m_torrent->hash()); + PropListModel->model()->clear(); if (m_torrent->hasMetadata()) { // Creation date - m_ui->labelCreatedOnVal->setText(m_torrent->creationDate().toString(Qt::DefaultLocaleShortDate)); + m_ui->lbl_creationDate->setText(m_torrent->creationDate().toString(Qt::DefaultLocaleShortDate)); - m_ui->labelTotalSizeVal->setText(Utils::Misc::friendlyUnit(m_torrent->totalSize())); + m_ui->label_total_size_val->setText(Utils::Misc::friendlyUnit(m_torrent->totalSize())); // Comment - m_ui->labelCommentVal->setText(Utils::Misc::parseHtmlLinks(m_torrent->comment().toHtmlEscaped())); + m_ui->comment_text->setText(Utils::Misc::parseHtmlLinks(Utils::String::toHtmlEscaped(m_torrent->comment()))); // URL seeds loadUrlSeeds(); - m_ui->labelCreatedByVal->setText(m_torrent->creator().toHtmlEscaped()); + m_ui->label_created_by_val->setText(Utils::String::toHtmlEscaped(m_torrent->creator())); // List files in torrent - m_propListModel->model()->setupModelData(m_torrent->info()); - if (m_propListModel->model()->rowCount() == 1) - m_ui->filesList->setExpanded(m_propListModel->index(0, 0), true); + PropListModel->model()->setupModelData(m_torrent->info()); + m_ui->filesList->setExpanded(PropListModel->index(0, 0), true); // Load file priorities - m_propListModel->model()->updateFilesPriorities(m_torrent->filePriorities()); + PropListModel->model()->updateFilesPriorities(m_torrent->filePriorities()); } // Load dynamic data loadDynamicData(); @@ -354,17 +349,19 @@ { const Preferences *const pref = Preferences::instance(); // Restore splitter sizes - QStringList sizesStr = pref->getPropSplitterSizes().split(','); - if (sizesStr.size() == 2) { - m_slideSizes << sizesStr.first().toInt(); - m_slideSizes << sizesStr.last().toInt(); + QStringList sizes_str = pref->getPropSplitterSizes().split(","); + if (sizes_str.size() == 2) { + slideSizes << sizes_str.first().toInt(); + slideSizes << sizes_str.last().toInt(); QSplitter *hSplitter = static_cast(parentWidget()); - hSplitter->setSizes(m_slideSizes); + hSplitter->setSizes(slideSizes); } - const int currentTab = pref->getPropCurTab(); + const int current_tab = pref->getPropCurTab(); const bool visible = pref->getPropVisible(); - m_ui->filesList->header()->restoreState(pref->getPropFileListState()); - m_tabBar->setCurrentIndex(currentTab); + // the following will call saveSettings but shouldn't change any state + if (!m_ui->filesList->header()->restoreState(pref->getPropFileListState())) + m_ui->filesList->header()->resizeSection(0, 400); // Default + m_tabBar->setCurrentIndex(current_tab); if (!visible) setVisibility(false); } @@ -372,14 +369,14 @@ void PropertiesWidget::saveSettings() { Preferences *const pref = Preferences::instance(); - pref->setPropVisible(m_state == VISIBLE); + pref->setPropVisible(state==VISIBLE); // Splitter sizes QSplitter *hSplitter = static_cast(parentWidget()); QList sizes; - if (m_state == VISIBLE) + if (state == VISIBLE) sizes = hSplitter->sizes(); else - sizes = m_slideSizes; + sizes = slideSizes; qDebug("Sizes: %d", sizes.size()); if (sizes.size() == 2) pref->setPropSplitterSizes(QString::number(sizes.first()) + ',' + QString::number(sizes.last())); @@ -391,112 +388,117 @@ void PropertiesWidget::reloadPreferences() { // Take program preferences into consideration - m_peerList->updatePeerHostNameResolutionState(); - m_peerList->updatePeerCountryResolutionState(); + peersList->updatePeerHostNameResolutionState(); + peersList->updatePeerCountryResolutionState(); } void PropertiesWidget::loadDynamicData() { - // Refresh only if the torrent handle is valid and visible - if (!m_torrent || (m_mainWindow->currentTabWidget() != m_transferList) || (m_state != VISIBLE)) return; + // Refresh only if the torrent handle is valid and if visible + if (!m_torrent || (main_window->currentTabWidget() != transferList) || (state != VISIBLE)) return; // Transfer infos switch (m_ui->stackedProperties->currentIndex()) { - case PropTabBar::MainTab: { - m_ui->labelWastedVal->setText(Utils::Misc::friendlyUnit(m_torrent->wastedSize())); + case PropTabBar::MAIN_TAB: { + m_ui->wasted->setText(Utils::Misc::friendlyUnit(m_torrent->wastedSize())); - m_ui->labelUpTotalVal->setText(tr("%1 (%2 this session)").arg(Utils::Misc::friendlyUnit(m_torrent->totalUpload()) - , Utils::Misc::friendlyUnit(m_torrent->totalPayloadUpload()))); + m_ui->upTotal->setText(tr("%1 (%2 this session)").arg(Utils::Misc::friendlyUnit(m_torrent->totalUpload())) + .arg(Utils::Misc::friendlyUnit(m_torrent->totalPayloadUpload()))); - m_ui->labelDlTotalVal->setText(tr("%1 (%2 this session)").arg(Utils::Misc::friendlyUnit(m_torrent->totalDownload()) - , Utils::Misc::friendlyUnit(m_torrent->totalPayloadDownload()))); + m_ui->dlTotal->setText(tr("%1 (%2 this session)").arg(Utils::Misc::friendlyUnit(m_torrent->totalDownload())) + .arg(Utils::Misc::friendlyUnit(m_torrent->totalPayloadDownload()))); - m_ui->labelUpLimitVal->setText(m_torrent->uploadLimit() <= 0 ? QString::fromUtf8(C_INFINITY) : Utils::Misc::friendlyUnit(m_torrent->uploadLimit(), true)); + m_ui->lbl_uplimit->setText(m_torrent->uploadLimit() <= 0 ? QString::fromUtf8(C_INFINITY) : Utils::Misc::friendlyUnit(m_torrent->uploadLimit(), true)); - m_ui->labelDlLimitVal->setText(m_torrent->downloadLimit() <= 0 ? QString::fromUtf8(C_INFINITY) : Utils::Misc::friendlyUnit(m_torrent->downloadLimit(), true)); + m_ui->lbl_dllimit->setText(m_torrent->downloadLimit() <= 0 ? QString::fromUtf8(C_INFINITY) : Utils::Misc::friendlyUnit(m_torrent->downloadLimit(), true)); - QString elapsedString; - if (m_torrent->isSeed()) - elapsedString = tr("%1 (seeded for %2)", "e.g. 4m39s (seeded for 3m10s)") - .arg(Utils::Misc::userFriendlyDuration(m_torrent->activeTime()) - , Utils::Misc::userFriendlyDuration(m_torrent->seedingTime())); - else - elapsedString = Utils::Misc::userFriendlyDuration(m_torrent->activeTime()); - m_ui->labelElapsedVal->setText(elapsedString); + QString elapsed_txt; + if (m_torrent->isSeed()) + elapsed_txt = tr("%1 (seeded for %2)", "e.g. 4m39s (seeded for 3m10s)") + .arg(Utils::Misc::userFriendlyDuration(m_torrent->activeTime())) + .arg(Utils::Misc::userFriendlyDuration(m_torrent->seedingTime())); + else + elapsed_txt = Utils::Misc::userFriendlyDuration(m_torrent->activeTime()); + m_ui->lbl_elapsed->setText(elapsed_txt); - m_ui->labelConnectionsVal->setText(tr("%1 (%2 max)", "%1 and %2 are numbers, e.g. 3 (10 max)") - .arg(m_torrent->connectionsCount()) - .arg(m_torrent->connectionsLimit() < 0 ? QString::fromUtf8(C_INFINITY) : QString::number(m_torrent->connectionsLimit()))); + m_ui->lbl_connections->setText(tr("%1 (%2 max)", "%1 and %2 are numbers, e.g. 3 (10 max)") + .arg(m_torrent->connectionsCount()) + .arg(m_torrent->connectionsLimit() < 0 ? QString::fromUtf8(C_INFINITY) : QString::number(m_torrent->connectionsLimit()))); - m_ui->labelETAVal->setText(Utils::Misc::userFriendlyDuration(m_torrent->eta())); + m_ui->label_eta_val->setText(Utils::Misc::userFriendlyDuration(m_torrent->eta())); - // Update next announce time - m_ui->labelReannounceInVal->setText(Utils::Misc::userFriendlyDuration(m_torrent->nextAnnounce())); + // Update next announce time + m_ui->reannounce_lbl->setText(Utils::Misc::userFriendlyDuration(m_torrent->nextAnnounce())); - // Update ratio info - const qreal ratio = m_torrent->realRatio(); - m_ui->labelShareRatioVal->setText(ratio > BitTorrent::TorrentHandle::MAX_RATIO ? QString::fromUtf8(C_INFINITY) : Utils::String::fromDouble(ratio, 2)); + // Update ratio info + const qreal ratio = m_torrent->realRatio(); + m_ui->shareRatio->setText(ratio > BitTorrent::TorrentHandle::MAX_RATIO ? QString::fromUtf8(C_INFINITY) : Utils::String::fromDouble(ratio, 2)); - m_ui->labelSeedsVal->setText(tr("%1 (%2 total)", "%1 and %2 are numbers, e.g. 3 (10 total)") - .arg(QString::number(m_torrent->seedsCount()) - , QString::number(m_torrent->totalSeedsCount()))); + m_ui->label_seeds_val->setText(tr("%1 (%2 total)", "%1 and %2 are numbers, e.g. 3 (10 total)") + .arg(QString::number(m_torrent->seedsCount())) + .arg(QString::number(m_torrent->totalSeedsCount()))); - m_ui->labelPeersVal->setText(tr("%1 (%2 total)", "%1 and %2 are numbers, e.g. 3 (10 total)") - .arg(QString::number(m_torrent->leechsCount()) - , QString::number(m_torrent->totalLeechersCount()))); + m_ui->label_peers_val->setText(tr("%1 (%2 total)", "%1 and %2 are numbers, e.g. 3 (10 total)") + .arg(QString::number(m_torrent->leechsCount())) + .arg(QString::number(m_torrent->totalLeechersCount()))); - m_ui->labelDlSpeedVal->setText(tr("%1 (%2 avg.)", "%1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.)") - .arg(Utils::Misc::friendlyUnit(m_torrent->downloadPayloadRate(), true) - , Utils::Misc::friendlyUnit(m_torrent->totalDownload() / (1 + m_torrent->activeTime() - m_torrent->finishedTime()), true))); + m_ui->label_dl_speed_val->setText(tr("%1 (%2 avg.)", "%1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.)") + .arg(Utils::Misc::friendlyUnit(m_torrent->downloadPayloadRate(), true)) + .arg(Utils::Misc::friendlyUnit(m_torrent->totalDownload() / (1 + m_torrent->activeTime() - m_torrent->finishedTime()), true))); - m_ui->labelUpSpeedVal->setText(tr("%1 (%2 avg.)", "%1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.)") - .arg(Utils::Misc::friendlyUnit(m_torrent->uploadPayloadRate(), true) - , Utils::Misc::friendlyUnit(m_torrent->totalUpload() / (1 + m_torrent->activeTime()), true))); + m_ui->label_upload_speed_val->setText(tr("%1 (%2 avg.)", "%1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.)") + .arg(Utils::Misc::friendlyUnit(m_torrent->uploadPayloadRate(), true)) + .arg(Utils::Misc::friendlyUnit(m_torrent->totalUpload() / (1 + m_torrent->activeTime()), true))); - m_ui->labelLastSeenCompleteVal->setText(m_torrent->lastSeenComplete().isValid() ? m_torrent->lastSeenComplete().toString(Qt::DefaultLocaleShortDate) : tr("Never")); + m_ui->label_last_complete_val->setText(m_torrent->lastSeenComplete().isValid() ? m_torrent->lastSeenComplete().toString(Qt::DefaultLocaleShortDate) : tr("Never")); - m_ui->labelCompletedOnVal->setText(m_torrent->completedTime().isValid() ? m_torrent->completedTime().toString(Qt::DefaultLocaleShortDate) : ""); + m_ui->label_completed_on_val->setText(m_torrent->completedTime().isValid() ? m_torrent->completedTime().toString(Qt::DefaultLocaleShortDate) : ""); - m_ui->labelAddedOnVal->setText(m_torrent->addedTime().toString(Qt::DefaultLocaleShortDate)); + m_ui->label_added_on_val->setText(m_torrent->addedTime().toString(Qt::DefaultLocaleShortDate)); - if (m_torrent->hasMetadata()) { - m_ui->labelTotalPiecesVal->setText(tr("%1 x %2 (have %3)", "(torrent pieces) eg 152 x 4MB (have 25)").arg(m_torrent->piecesCount()).arg(Utils::Misc::friendlyUnit(m_torrent->pieceLength())).arg(m_torrent->piecesHave())); - - if (!m_torrent->isSeed() && !m_torrent->isPaused() && !m_torrent->isQueued() && !m_torrent->isChecking()) { - // Pieces availability - showPiecesAvailability(true); - m_piecesAvailability->setAvailability(m_torrent->pieceAvailability()); - m_ui->labelAverageAvailabilityVal->setText(Utils::String::fromDouble(m_torrent->distributedCopies(), 3)); - } - else { - showPiecesAvailability(false); - } + if (m_torrent->hasMetadata()) { + m_ui->label_total_pieces_val->setText(tr("%1 x %2 (have %3)", "(torrent pieces) eg 152 x 4MB (have 25)").arg(m_torrent->piecesCount()).arg(Utils::Misc::friendlyUnit(m_torrent->pieceLength())).arg(m_torrent->piecesHave())); - // Progress - qreal progress = m_torrent->progress() * 100.; - m_ui->labelProgressVal->setText(Utils::String::fromDouble(progress, 1) + '%'); - m_downloadedPieces->setProgress(m_torrent->pieces(), m_torrent->downloadingPieces()); + if (!m_torrent->isSeed() && !m_torrent->isPaused() && !m_torrent->isQueued() && !m_torrent->isChecking()) { + // Pieces availability + showPiecesAvailability(true); + pieces_availability->setAvailability(m_torrent->pieceAvailability()); + m_ui->avail_average_lbl->setText(Utils::String::fromDouble(m_torrent->distributedCopies(), 3)); } else { showPiecesAvailability(false); } + + // Progress + qreal progress = m_torrent->progress() * 100.; + m_ui->progress_lbl->setText(Utils::String::fromDouble(progress, 1) + "%"); + downloaded_pieces->setProgress(m_torrent->pieces(), m_torrent->downloadingPieces()); + } + else { + showPiecesAvailability(false); } + break; - case PropTabBar::TrackersTab: + } + + case PropTabBar::TRACKERS_TAB: { // Trackers - m_trackerList->loadTrackers(); + trackerList->loadTrackers(); break; - case PropTabBar::PeersTab: + } + + case PropTabBar::PEERS_TAB: { // Load peers - m_peerList->loadPeers(m_torrent); + peersList->loadPeers(m_torrent); break; - case PropTabBar::FilesTab: + } + + case PropTabBar::FILES_TAB: { // Files progress if (m_torrent->hasMetadata()) { qDebug("Updating priorities in files tab"); m_ui->filesList->setUpdatesEnabled(false); - m_propListModel->model()->updateFilesProgress(m_torrent->filesProgress()); - m_propListModel->model()->updateFilesAvailability(m_torrent->availableFileFractions()); + PropListModel->model()->updateFilesProgress(m_torrent->filesProgress()); // XXX: We don't update file priorities regularly for performance // reasons. This means that priorities will not be updated if // set from the Web UI. @@ -504,6 +506,8 @@ m_ui->filesList->setUpdatesEnabled(true); } break; + } + default:; } } @@ -512,19 +516,19 @@ { m_ui->listWebSeeds->clear(); qDebug("Loading URL seeds"); - const QList hcSeeds = m_torrent->urlSeeds(); + const QList hc_seeds = m_torrent->urlSeeds(); // Add url seeds - foreach (const QUrl &hcSeed, hcSeeds) { - qDebug("Loading URL seed: %s", qUtf8Printable(hcSeed.toString())); - new QListWidgetItem(hcSeed.toString(), m_ui->listWebSeeds); + foreach (const QUrl &hc_seed, hc_seeds) { + qDebug("Loading URL seed: %s", qPrintable(hc_seed.toString())); + new QListWidgetItem(hc_seed.toString(), m_ui->listWebSeeds); } } void PropertiesWidget::openDoubleClickedFile(const QModelIndex &index) { - if (!index.isValid() || !m_torrent || !m_torrent->hasMetadata()) return; - - if (m_propListModel->itemType(index) == TorrentContentModelItem::FileType) + if (!index.isValid()) return; + if (!m_torrent || !m_torrent->hasMetadata()) return; + if (PropListModel->itemType(index) == TorrentContentModelItem::FileType) openFile(index); else openFolder(index, false); @@ -532,53 +536,48 @@ void PropertiesWidget::openFile(const QModelIndex &index) { - int i = m_propListModel->getFileIndex(index); + int i = PropListModel->getFileIndex(index); const QDir saveDir(m_torrent->savePath(true)); const QString filename = m_torrent->filePath(i); - const QString filePath = Utils::Fs::expandPath(saveDir.absoluteFilePath(filename)); - qDebug("Trying to open file at %s", qUtf8Printable(filePath)); + const QString file_path = Utils::Fs::expandPath(saveDir.absoluteFilePath(filename)); + qDebug("Trying to open file at %s", qPrintable(file_path)); // Flush data m_torrent->flushCache(); - Utils::Misc::openPath(filePath); + Utils::Misc::openPath(file_path); } -void PropertiesWidget::openFolder(const QModelIndex &index, bool containingFolder) +void PropertiesWidget::openFolder(const QModelIndex &index, bool containing_folder) { - QString absolutePath; + QString absolute_path; // FOLDER - if (m_propListModel->itemType(index) == TorrentContentModelItem::FolderType) { + if (PropListModel->itemType(index) == TorrentContentModelItem::FolderType) { // Generate relative path to selected folder - QStringList pathItems; - pathItems << index.data().toString(); - QModelIndex parent = m_propListModel->parent(index); + QStringList path_items; + path_items << index.data().toString(); + QModelIndex parent = PropListModel->parent(index); while (parent.isValid()) { - pathItems.prepend(parent.data().toString()); - parent = m_propListModel->parent(parent); + path_items.prepend(parent.data().toString()); + parent = PropListModel->parent(parent); } - if (pathItems.isEmpty()) + if (path_items.isEmpty()) return; const QDir saveDir(m_torrent->savePath(true)); - const QString relativePath = pathItems.join('/'); - absolutePath = Utils::Fs::expandPath(saveDir.absoluteFilePath(relativePath)); + const QString relative_path = path_items.join("/"); + absolute_path = Utils::Fs::expandPath(saveDir.absoluteFilePath(relative_path)); } else { - int i = m_propListModel->getFileIndex(index); + int i = PropListModel->getFileIndex(index); const QDir saveDir(m_torrent->savePath(true)); - const QString relativePath = m_torrent->filePath(i); - absolutePath = Utils::Fs::expandPath(saveDir.absoluteFilePath(relativePath)); + const QString relative_path = m_torrent->filePath(i); + absolute_path = Utils::Fs::expandPath(saveDir.absoluteFilePath(relative_path)); } // Flush data m_torrent->flushCache(); -#ifdef Q_OS_MAC - Q_UNUSED(containingFolder); - MacUtils::openFiles(QSet{absolutePath}); -#else - if (containingFolder) - Utils::Misc::openFolderSelect(absolutePath); + if (containing_folder) + Utils::Misc::openFolderSelect(absolute_path); else - Utils::Misc::openPath(absolutePath); -#endif + Utils::Misc::openPath(absolute_path); } void PropertiesWidget::displayFilesListMenu(const QPoint &) @@ -586,12 +585,12 @@ if (!m_torrent) return; QModelIndexList selectedRows = m_ui->filesList->selectionModel()->selectedRows(0); - if (selectedRows.empty()) return; - + if (selectedRows.empty()) + return; QMenu myFilesLlistMenu; - QAction *actOpen = nullptr; - QAction *actOpenContainingFolder = nullptr; - QAction *actRename = nullptr; + QAction *actOpen = 0; + QAction *actOpenContainingFolder = 0; + QAction *actRename = 0; if (selectedRows.size() == 1) { actOpen = myFilesLlistMenu.addAction(GuiIconProvider::instance()->getIcon("folder-documents"), tr("Open")); actOpenContainingFolder = myFilesLlistMenu.addAction(GuiIconProvider::instance()->getIcon("inode-directory"), tr("Open Containing Folder")); @@ -601,7 +600,7 @@ QMenu subMenu; if (!m_torrent->isSeed()) { subMenu.setTitle(tr("Priority")); - subMenu.addAction(m_ui->actionNotDownloaded); + subMenu.addAction(m_ui->actionNot_downloaded); subMenu.addAction(m_ui->actionNormal); subMenu.addAction(m_ui->actionHigh); subMenu.addAction(m_ui->actionMaximum); @@ -612,33 +611,35 @@ // The selected torrent might have disappeared during exec() // from the current view thus leaving invalid indices. const QModelIndex index = *(selectedRows.begin()); - if (!index.isValid() || !act) return; - - if (act == actOpen) { - openDoubleClickedFile(index); - } - else if (act == actOpenContainingFolder) { - openFolder(index, true); - } - else if (act == actRename) { - renameSelectedFile(); - } - else { - int prio = prio::NORMAL; - if (act == m_ui->actionHigh) - prio = prio::HIGH; - else if (act == m_ui->actionMaximum) - prio = prio::MAXIMUM; - else if (act == m_ui->actionNotDownloaded) - prio = prio::IGNORED; - - qDebug("Setting files priority"); - foreach (QModelIndex index, selectedRows) { - qDebug("Setting priority(%d) for file at row %d", prio, index.row()); - m_propListModel->setData(m_propListModel->index(index.row(), PRIORITY, index.parent()), prio); + if (!index.isValid()) + return; + if (act) { + if (act == actOpen) { + openDoubleClickedFile(index); + } + else if (act == actOpenContainingFolder) { + openFolder(index, true); + } + else if (act == actRename) { + renameSelectedFile(); + } + else { + int prio = prio::NORMAL; + if (act == m_ui->actionHigh) + prio = prio::HIGH; + else if (act == m_ui->actionMaximum) + prio = prio::MAXIMUM; + else if (act == m_ui->actionNot_downloaded) + prio = prio::IGNORED; + + qDebug("Setting files priority"); + foreach (QModelIndex index, selectedRows) { + qDebug("Setting priority(%d) for file at row %d", prio, index.row()); + PropListModel->setData(PropListModel->index(index.row(), PRIORITY, index.parent()), prio); + } + // Save changes + filteredFilesChanged(); } - // Save changes - filteredFilesChanged(); } } @@ -649,11 +650,11 @@ QMenu seedMenu; QModelIndexList rows = m_ui->listWebSeeds->selectionModel()->selectedRows(); QAction *actAdd = seedMenu.addAction(GuiIconProvider::instance()->getIcon("list-add"), tr("New Web seed")); - QAction *actDel = nullptr; - QAction *actCpy = nullptr; - QAction *actEdit = nullptr; + QAction *actDel = 0; + QAction *actCpy = 0; + QAction *actEdit = 0; - if (!rows.isEmpty()) { + if (rows.size()) { actDel = seedMenu.addAction(GuiIconProvider::instance()->getIcon("list-remove"), tr("Remove Web seed")); seedMenu.addSeparator(); actCpy = seedMenu.addAction(GuiIconProvider::instance()->getIcon("edit-copy"), tr("Copy Web seed URL")); @@ -661,133 +662,134 @@ } const QAction *act = seedMenu.exec(QCursor::pos()); - if (!act) return; - - if (act == actAdd) - askWebSeed(); - else if (act == actDel) - deleteSelectedUrlSeeds(); - else if (act == actCpy) - copySelectedWebSeedsToClipboard(); - else if (act == actEdit) - editWebSeed(); + if (act) { + if (act == actAdd) + askWebSeed(); + else if (act == actDel) + deleteSelectedUrlSeeds(); + else if (act == actCpy) + copySelectedWebSeedsToClipboard(); + else if (act == actEdit) + editWebSeed(); + } } void PropertiesWidget::renameSelectedFile() { - if (!m_torrent) return; - const QModelIndexList selectedIndexes = m_ui->filesList->selectionModel()->selectedRows(0); - if (selectedIndexes.size() != 1) return; - - const QModelIndex modelIndex = selectedIndexes.first(); - if (!modelIndex.isValid()) return; - - // Ask for new name - bool ok = false; - const bool isFile = (m_propListModel->itemType(modelIndex) == TorrentContentModelItem::FileType); - QString newName = AutoExpandableDialog::getText(this, tr("Renaming"), tr("New name:"), QLineEdit::Normal - , modelIndex.data().toString(), &ok, isFile).trimmed(); - if (!ok) return; - - if (newName.isEmpty() || !Utils::Fs::isValidFileSystemName(newName)) { - RaisedMessageBox::warning(this, tr("Rename error"), - tr("The name is empty or contains forbidden characters, please choose a different one."), - QMessageBox::Ok); + if (selectedIndexes.size() != 1) return; - } - - if (isFile) { - const int fileIndex = m_propListModel->getFileIndex(modelIndex); - - if (newName.endsWith(QB_EXT)) - newName.chop(QB_EXT.size()); - const QString oldFileName = m_torrent->fileName(fileIndex); - const QString oldFilePath = m_torrent->filePath(fileIndex); - - const bool useFilenameExt = BitTorrent::Session::instance()->isAppendExtensionEnabled() - && (m_torrent->filesProgress()[fileIndex] != 1); - const QString newFileName = newName + (useFilenameExt ? QB_EXT : QString()); - const QString newFilePath = oldFilePath.leftRef(oldFilePath.size() - oldFileName.size()) + newFileName; - - if (oldFileName == newFileName) { - qDebug("Name did not change: %s", qUtf8Printable(oldFileName)); + const QModelIndex index = selectedIndexes.first(); + if (!index.isValid()) + return; + // Ask for new name + bool ok; + QString new_name_last = AutoExpandableDialog::getText(this, tr("Rename the file"), + tr("New name:"), QLineEdit::Normal, + index.data().toString(), &ok).trimmed(); + if (ok && !new_name_last.isEmpty()) { + if (!Utils::Fs::isValidFileSystemName(new_name_last)) { + MessageBoxRaised::warning(this, tr("The file could not be renamed"), + tr("This file name contains forbidden characters, please choose a different one."), + QMessageBox::Ok); return; } - - // check if that name is already used - for (int i = 0; i < m_torrent->filesCount(); ++i) { - if (i == fileIndex) continue; - if (Utils::Fs::sameFileNames(m_torrent->filePath(i), newFilePath)) { - RaisedMessageBox::warning(this, tr("Rename error"), - tr("This name is already in use in this folder. Please use a different name."), - QMessageBox::Ok); + if (PropListModel->itemType(index) == TorrentContentModelItem::FileType) { + // File renaming + const int file_index = PropListModel->getFileIndex(index); + if (!m_torrent || !m_torrent->hasMetadata()) return; + QString old_name = m_torrent->filePath(file_index); + if (old_name.endsWith(".!qB") && !new_name_last.endsWith(".!qB")) + new_name_last += ".!qB"; + QStringList path_items = old_name.split("/"); + path_items.removeLast(); + path_items << new_name_last; + QString new_name = path_items.join("/"); + if (old_name == new_name) { + qDebug("Name did not change"); return; } - } - - qDebug("Renaming %s to %s", qUtf8Printable(oldFilePath), qUtf8Printable(newFilePath)); - m_torrent->renameFile(fileIndex, newFilePath); - - m_propListModel->setData(modelIndex, newName); - } - else { - // renaming a folder - QStringList pathItems; - pathItems << modelIndex.data().toString(); - QModelIndex parent = m_propListModel->parent(modelIndex); - while (parent.isValid()) { - pathItems.prepend(parent.data().toString()); - parent = m_propListModel->parent(parent); - } - const QString oldPath = pathItems.join('/'); - pathItems.removeLast(); - pathItems << newName; - QString newPath = pathItems.join('/'); - if (Utils::Fs::sameFileNames(oldPath, newPath)) { - qDebug("Name did not change"); - return; - } - if (!newPath.endsWith('/')) newPath += '/'; - // Check for overwriting - for (int i = 0; i < m_torrent->filesCount(); ++i) { - const QString currentName = m_torrent->filePath(i); + new_name = Utils::Fs::expandPath(new_name); + qDebug("New name: %s", qPrintable(new_name)); + // Check if that name is already used + for (int i = 0; i < m_torrent->filesCount(); ++i) { + if (i == file_index) continue; + if (Utils::Fs::sameFileNames(m_torrent->filePath(i), new_name)) { + // Display error message + MessageBoxRaised::warning(this, tr("The file could not be renamed"), + tr("This name is already in use in this folder. Please use a different name."), + QMessageBox::Ok); + return; + } + } + const bool force_recheck = QFile::exists(m_torrent->savePath(true) + "/" + new_name); + qDebug("Renaming %s to %s", qPrintable(old_name), qPrintable(new_name)); + m_torrent->renameFile(file_index, new_name); + // Force recheck + if (force_recheck) m_torrent->forceRecheck(); + // Rename if torrent files model too + if (new_name_last.endsWith(".!qB")) + new_name_last.chop(4); + PropListModel->setData(index, new_name_last); + } + else { + // Folder renaming + QStringList path_items; + path_items << index.data().toString(); + QModelIndex parent = PropListModel->parent(index); + while (parent.isValid()) { + path_items.prepend(parent.data().toString()); + parent = PropListModel->parent(parent); + } + const QString old_path = path_items.join("/"); + path_items.removeLast(); + path_items << new_name_last; + QString new_path = path_items.join("/"); + if (Utils::Fs::sameFileNames(old_path, new_path)) { + qDebug("Name did not change"); + return; + } + if (!new_path.endsWith("/")) new_path += "/"; + // Check for overwriting + for (int i = 0; i < m_torrent->filesCount(); ++i) { + const QString ¤t_name = m_torrent->filePath(i); #if defined(Q_OS_UNIX) || defined(Q_WS_QWS) - if (currentName.startsWith(newPath, Qt::CaseSensitive)) { + if (current_name.startsWith(new_path, Qt::CaseSensitive)) { #else - if (currentName.startsWith(newPath, Qt::CaseInsensitive)) { + if (current_name.startsWith(new_path, Qt::CaseInsensitive)) { #endif - QMessageBox::warning(this, tr("The folder could not be renamed"), - tr("This name is already in use in this folder. Please use a different name."), - QMessageBox::Ok); - return; + QMessageBox::warning(this, tr("The folder could not be renamed"), + tr("This name is already in use in this folder. Please use a different name."), + QMessageBox::Ok); + return; + } } - } - bool forceRecheck = false; - // Replace path in all files - for (int i = 0; i < m_torrent->filesCount(); ++i) { - const QString currentName = m_torrent->filePath(i); - if (currentName.startsWith(oldPath)) { - QString newName = currentName; - newName.replace(0, oldPath.length(), newPath); - if (!forceRecheck && QDir(m_torrent->savePath(true)).exists(newName)) - forceRecheck = true; - newName = Utils::Fs::expandPath(newName); - qDebug("Rename %s to %s", qUtf8Printable(currentName), qUtf8Printable(newName)); - m_torrent->renameFile(i, newName); + bool force_recheck = false; + // Replace path in all files + for (int i = 0; i < m_torrent->filesCount(); ++i) { + const QString current_name = m_torrent->filePath(i); + if (current_name.startsWith(old_path)) { + QString new_name = current_name; + new_name.replace(0, old_path.length(), new_path); + if (!force_recheck && QDir(m_torrent->savePath(true)).exists(new_name)) + force_recheck = true; + new_name = Utils::Fs::expandPath(new_name); + qDebug("Rename %s to %s", qPrintable(current_name), qPrintable(new_name)); + m_torrent->renameFile(i, new_name); + } + } + // Force recheck + if (force_recheck) m_torrent->forceRecheck(); + // Rename folder in torrent files model too + PropListModel->setData(index, new_name_last); + // Remove old folder + const QDir old_folder(m_torrent->savePath(true) + "/" + old_path); + int timeout = 10; + while (!QDir().rmpath(old_folder.absolutePath()) && timeout > 0) { + // FIXME: We should not sleep here (freezes the UI for 1 second) + Utils::Misc::msleep(100); + --timeout; } - } - // Force recheck - if (forceRecheck) m_torrent->forceRecheck(); - // Rename folder in torrent files model too - m_propListModel->setData(modelIndex, newName); - // Remove old folder - const QDir oldFolder(m_torrent->savePath(true) + '/' + oldPath); - int timeout = 10; - while (!QDir().rmpath(oldFolder.absolutePath()) && (timeout > 0)) { - // FIXME: We should not sleep here (freezes the UI for 1 second) - QThread::msleep(100); - --timeout; } } } @@ -804,19 +806,19 @@ { bool ok; // Ask user for a new url seed - const QString urlSeed = AutoExpandableDialog::getText(this, tr("New URL seed", "New HTTP source"), + const QString url_seed = AutoExpandableDialog::getText(this, tr("New URL seed", "New HTTP source"), tr("New URL seed:"), QLineEdit::Normal, - QLatin1String("http://www."), &ok); + QString::fromUtf8("http://www."), &ok); if (!ok) return; - qDebug("Adding %s web seed", qUtf8Printable(urlSeed)); - if (!m_ui->listWebSeeds->findItems(urlSeed, Qt::MatchFixedString).empty()) { + qDebug("Adding %s web seed", qPrintable(url_seed)); + if (!m_ui->listWebSeeds->findItems(url_seed, Qt::MatchFixedString).empty()) { QMessageBox::warning(this, "qBittorrent", tr("This URL seed is already in the list."), QMessageBox::Ok); return; } if (m_torrent) - m_torrent->addUrlSeeds(QList() << urlSeed); + m_torrent->addUrlSeeds(QList() << url_seed); // Refresh the seeds list loadUrlSeeds(); } @@ -837,48 +839,52 @@ void PropertiesWidget::copySelectedWebSeedsToClipboard() const { - const QList selectedItems = m_ui->listWebSeeds->selectedItems(); - if (selectedItems.isEmpty()) return; + const QList selected_items = m_ui->listWebSeeds->selectedItems(); + if (selected_items.isEmpty()) + return; - QStringList urlsToCopy; - foreach (QListWidgetItem *item, selectedItems) - urlsToCopy << item->text(); + QStringList urls_to_copy; + foreach (QListWidgetItem *item, selected_items) + urls_to_copy << item->text(); - QApplication::clipboard()->setText(urlsToCopy.join('\n')); + QApplication::clipboard()->setText(urls_to_copy.join("\n")); } void PropertiesWidget::editWebSeed() { - const QList selectedItems = m_ui->listWebSeeds->selectedItems(); - if (selectedItems.size() != 1) return; + const QList selected_items = m_ui->listWebSeeds->selectedItems(); + if (selected_items.size() != 1) + return; - const QListWidgetItem *selectedItem = selectedItems.last(); - const QString oldSeed = selectedItem->text(); + const QListWidgetItem *selected_item = selected_items.last(); + const QString old_seed = selected_item->text(); bool result; - const QString newSeed = AutoExpandableDialog::getText(this, tr("Web seed editing"), + const QString new_seed = AutoExpandableDialog::getText(this, tr("Web seed editing"), tr("Web seed URL:"), QLineEdit::Normal, - oldSeed, &result); - if (!result) return; + old_seed, &result); + if (!result) + return; - if (!m_ui->listWebSeeds->findItems(newSeed, Qt::MatchFixedString).empty()) { + if (!m_ui->listWebSeeds->findItems(new_seed, Qt::MatchFixedString).empty()) { QMessageBox::warning(this, tr("qBittorrent"), tr("This URL seed is already in the list."), QMessageBox::Ok); return; } - m_torrent->removeUrlSeeds(QList() << oldSeed); - m_torrent->addUrlSeeds(QList() << newSeed); + m_torrent->removeUrlSeeds(QList() << old_seed); + m_torrent->addUrlSeeds(QList() << new_seed); loadUrlSeeds(); } -void PropertiesWidget::applyPriorities() +bool PropertiesWidget::applyPriorities() { qDebug("Saving files priorities"); - const QVector priorities = m_propListModel->model()->getFilePriorities(); + const QVector priorities = PropListModel->model()->getFilePriorities(); // Prioritize the files qDebug("prioritize files: %d", priorities[0]); m_torrent->prioritizeFiles(priorities); + return true; } void PropertiesWidget::filteredFilesChanged() @@ -889,10 +895,10 @@ void PropertiesWidget::filterText(const QString &filter) { - m_propListModel->setFilterRegExp(QRegExp(filter, Qt::CaseInsensitive, QRegExp::WildcardUnix)); + PropListModel->setFilterRegExp(QRegExp(filter, Qt::CaseInsensitive, QRegExp::WildcardUnix)); if (filter.isEmpty()) { m_ui->filesList->collapseAll(); - m_ui->filesList->expand(m_propListModel->index(0, 0)); + m_ui->filesList->expand(PropListModel->index(0, 0)); } else { m_ui->filesList->expandAll(); diff -Nru qbittorrent-4.1.3/src/gui/properties/propertieswidget.h qbittorrent-3.3.15/src/gui/properties/propertieswidget.h --- qbittorrent-4.1.3/src/gui/properties/propertieswidget.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/propertieswidget.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef PROPERTIESWIDGET_H @@ -31,65 +33,55 @@ #include #include - #include "base/bittorrent/torrenthandle.h" -class QAction; -class QPushButton; -class QTimer; -class QTreeView; -class DownloadedPiecesBar; -class LineEdit; -class MainWindow; +class TransferListWidget; +class TorrentContentFilterModel; +class PropListDelegate; +class torrent_file; class PeerListWidget; +class TrackerList; +class SpeedWidget; +class MainWindow; +class DownloadedPiecesBar; class PieceAvailabilityBar; -class PropListDelegate; class PropTabBar; -class SpeedWidget; -class torrent_file; -class TorrentContentFilterModel; -class TrackerListWidget; -class TransferListWidget; +class LineEdit; + +QT_BEGIN_NAMESPACE +class QAction; +class QModelIndex; +class QPushButton; +class QTimer; +class QTreeView; +QT_END_NAMESPACE namespace Ui { class PropertiesWidget; } -class PropertiesWidget : public QWidget +class PropertiesWidget: public QWidget { Q_OBJECT Q_DISABLE_COPY(PropertiesWidget) public: - enum SlideState - { - REDUCED, - VISIBLE - }; + enum SlideState {REDUCED, VISIBLE}; - PropertiesWidget(QWidget *parent, MainWindow *mainWindow, TransferListWidget *transferList); +public: + PropertiesWidget(QWidget *parent, MainWindow *main_window, TransferListWidget *transferList); ~PropertiesWidget(); BitTorrent::TorrentHandle *getCurrentTorrent() const; - TrackerListWidget *getTrackerList() const; - PeerListWidget *getPeerList() const; + TrackerList *getTrackerList() const { return trackerList; } + PeerListWidget *getPeerList() const { return peersList; } QTreeView *getFilesList() const; - SpeedWidget *getSpeedWidget() const; - -public slots: - void setVisibility(bool visible); - void loadDynamicData(); - void clear(); - void readSettings(); - void saveSettings(); - void reloadPreferences(); - void openDoubleClickedFile(const QModelIndex &); - void loadTrackers(BitTorrent::TorrentHandle *const torrent); + SpeedWidget *getSpeedWidget() const { return speedWidget; } protected: QPushButton *getButtonFromIndex(int index); - void applyPriorities(); + bool applyPriorities(); protected slots: void loadTorrentInfos(BitTorrent::TorrentHandle *const torrent); @@ -107,34 +99,45 @@ void renameSelectedFile(); void openSelectedFile(); -private slots: - void filterText(const QString &filter); - void updateSavePath(BitTorrent::TorrentHandle *const torrent); +public slots: + void setVisibility(bool visible); + void loadDynamicData(); + void clear(); + void readSettings(); + void saveSettings(); + void reloadPreferences(); + void openDoubleClickedFile(const QModelIndex &); + void loadTrackers(BitTorrent::TorrentHandle *const torrent); private: void openFile(const QModelIndex &index); - void openFolder(const QModelIndex &index, bool containingFolder); + void openFolder(const QModelIndex &index, bool containing_folder); +private: Ui::PropertiesWidget *m_ui; - TransferListWidget *m_transferList; - MainWindow *m_mainWindow; + TransferListWidget *transferList; + MainWindow *main_window; BitTorrent::TorrentHandle *m_torrent; - QTimer *m_refreshTimer; - SlideState m_state; - TorrentContentFilterModel *m_propListModel; - PropListDelegate *m_propListDelegate; - PeerListWidget *m_peerList; - TrackerListWidget *m_trackerList; - SpeedWidget *m_speedWidget; - QList m_slideSizes; - DownloadedPiecesBar *m_downloadedPieces; - PieceAvailabilityBar *m_piecesAvailability; + QTimer *refreshTimer; + SlideState state; + TorrentContentFilterModel *PropListModel; + PropListDelegate *PropDelegate; + PeerListWidget *peersList; + TrackerList *trackerList; + SpeedWidget *speedWidget; + QList slideSizes; + DownloadedPiecesBar *downloaded_pieces; + PieceAvailabilityBar *pieces_availability; PropTabBar *m_tabBar; LineEdit *m_contentFilterLine; - QShortcut *m_editHotkeyFile; - QShortcut *m_editHotkeyWeb; - QShortcut *m_deleteHotkeyWeb; - QShortcut *m_openHotkeyFile; + QShortcut *editHotkeyFile; + QShortcut *editHotkeyWeb; + QShortcut *deleteHotkeyWeb; + QShortcut *openHotkeyFile; + +private slots: + void filterText(const QString &filter); + void updateSavePath(BitTorrent::TorrentHandle *const torrent); }; #endif // PROPERTIESWIDGET_H diff -Nru qbittorrent-4.1.3/src/gui/properties/propertieswidget.ui qbittorrent-3.3.15/src/gui/properties/propertieswidget.ui --- qbittorrent-4.1.3/src/gui/properties/propertieswidget.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/propertieswidget.ui 2017-08-03 20:30:10.000000000 +0000 @@ -67,7 +67,7 @@ 4 - + 0 @@ -83,7 +83,7 @@ - + 0 @@ -96,7 +96,7 @@ - + 0 @@ -112,7 +112,7 @@ - + 0 @@ -142,7 +142,7 @@ - + Qt::Horizontal @@ -161,7 +161,7 @@ 4 - + 0 @@ -174,7 +174,7 @@ - + 0 @@ -190,7 +190,7 @@ - + 0 @@ -203,7 +203,7 @@ - + 0 @@ -219,7 +219,7 @@ - + 0 @@ -235,7 +235,7 @@ - + 0 @@ -248,7 +248,7 @@ - + 0 @@ -261,7 +261,7 @@ - + 0 @@ -277,7 +277,7 @@ - + 0 @@ -293,7 +293,7 @@ - + 0 @@ -306,7 +306,7 @@ - + 0 @@ -319,7 +319,7 @@ - + 0 @@ -335,7 +335,7 @@ - + 0 @@ -351,7 +351,7 @@ - + 0 @@ -367,7 +367,7 @@ - + 0 @@ -380,7 +380,7 @@ - + 0 @@ -393,7 +393,7 @@ - + 0 @@ -409,7 +409,7 @@ - + 0 @@ -422,7 +422,7 @@ - + 0 @@ -438,7 +438,7 @@ - + 0 @@ -454,7 +454,7 @@ - + 0 @@ -467,7 +467,7 @@ - + 0 @@ -480,7 +480,7 @@ - + 0 @@ -493,7 +493,7 @@ - + 0 @@ -509,7 +509,7 @@ - + 0 @@ -522,7 +522,7 @@ - + 0 @@ -535,7 +535,7 @@ - + 0 @@ -551,7 +551,7 @@ - + 0 @@ -564,7 +564,7 @@ - + 0 @@ -580,7 +580,7 @@ - + 0 @@ -611,7 +611,7 @@ 2 - + 0 @@ -627,7 +627,7 @@ - + 0 @@ -640,7 +640,7 @@ - + 0 @@ -656,7 +656,7 @@ - + 0 @@ -669,7 +669,7 @@ - + 0 @@ -685,7 +685,7 @@ - + 0 @@ -698,7 +698,7 @@ - + 0 @@ -714,7 +714,7 @@ - + 0 @@ -727,7 +727,7 @@ - + 0 @@ -743,7 +743,7 @@ - + 0 @@ -756,7 +756,7 @@ - + 0 @@ -772,7 +772,7 @@ - + 0 @@ -785,7 +785,7 @@ - + 0 @@ -801,7 +801,7 @@ - + 0 @@ -817,7 +817,7 @@ - + 0 @@ -833,7 +833,7 @@ - + 0 @@ -852,7 +852,7 @@ - + 0 @@ -868,7 +868,7 @@ - + 0 @@ -905,7 +905,7 @@
- + 0 @@ -957,7 +957,7 @@ - + 0 @@ -1000,9 +1000,6 @@ - - 3 - 0 @@ -1065,7 +1062,7 @@ - + 0 @@ -1083,7 +1080,7 @@
- + Do not download diff -Nru qbittorrent-4.1.3/src/gui/properties/proplistdelegate.cpp qbittorrent-3.3.15/src/gui/properties/proplistdelegate.cpp --- qbittorrent-4.1.3/src/gui/properties/proplistdelegate.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/proplistdelegate.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #include "proplistdelegate.h" @@ -37,10 +39,13 @@ #include #ifdef Q_OS_WIN +#ifndef QBT_USES_QT5 +#include +#else #include #endif +#endif -#include "base/unicodestrings.h" #include "base/utils/misc.h" #include "base/utils/string.h" #include "propertieswidget.h" @@ -81,66 +86,58 @@ QItemDelegate::drawDisplay(painter, opt, option.rect, Utils::Misc::friendlyUnit(index.data().toLongLong())); break; case PROGRESS: { - if (index.data().toDouble() < 0) - break; + if (index.data().toDouble() < 0) + break; - QStyleOptionProgressBar newopt; - qreal progress = index.data().toDouble() * 100.; - newopt.rect = opt.rect; - newopt.text = ((progress == 100.0) ? QString("100%") : Utils::String::fromDouble(progress, 1) + '%'); - newopt.progress = int(progress); - newopt.maximum = 100; - newopt.minimum = 0; - newopt.textVisible = true; - if (index.sibling(index.row(), PRIORITY).data().toInt() == prio::IGNORED) { - newopt.state &= ~QStyle::State_Enabled; - newopt.palette = progressBarDisabledPalette(); - } - else { - newopt.state |= QStyle::State_Enabled; - } + QStyleOptionProgressBar newopt; + qreal progress = index.data().toDouble() * 100.; + newopt.rect = opt.rect; + newopt.text = ((progress == 100.0) ? QString("100%") : Utils::String::fromDouble(progress, 1) + "%"); + newopt.progress = int(progress); + newopt.maximum = 100; + newopt.minimum = 0; + newopt.textVisible = true; + if (index.sibling(index.row(), PRIORITY).data().toInt() == prio::IGNORED) { + newopt.state &= ~QStyle::State_Enabled; + newopt.palette = progressBarDisabledPalette(); + } + else { + newopt.state |= QStyle::State_Enabled; + } #ifndef Q_OS_WIN - QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, painter); + QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, painter); +#else + // XXX: To avoid having the progress text on the right of the bar +#ifndef QBT_USES_QT5 + QPlastiqueStyle st; #else - // XXX: To avoid having the progress text on the right of the bar - QProxyStyle("fusion").drawControl(QStyle::CE_ProgressBar, &newopt, painter, 0); + QProxyStyle st("fusion"); #endif - } - break; + st.drawControl(QStyle::CE_ProgressBar, &newopt, painter, 0); +#endif + } + break; case PRIORITY: { - QString text = ""; - switch (index.data().toInt()) { - case prio::MIXED: - text = tr("Mixed", "Mixed (priorities"); - break; - case prio::IGNORED: - text = tr("Not downloaded"); - break; - case prio::HIGH: - text = tr("High", "High (priority)"); - break; - case prio::MAXIMUM: - text = tr("Maximum", "Maximum (priority)"); - break; - default: - text = tr("Normal", "Normal (priority)"); - break; - } - QItemDelegate::drawDisplay(painter, opt, option.rect, text); + QString text = ""; + switch (index.data().toInt()) { + case prio::MIXED: + text = tr("Mixed", "Mixed (priorities"); + break; + case prio::IGNORED: + text = tr("Not downloaded"); + break; + case prio::HIGH: + text = tr("High", "High (priority)"); + break; + case prio::MAXIMUM: + text = tr("Maximum", "Maximum (priority)"); + break; + default: + text = tr("Normal", "Normal (priority)"); + break; } - break; - case AVAILABILITY: { - const qreal availability = index.data().toDouble(); - if (availability < 0) { - QItemDelegate::drawDisplay(painter, opt, option.rect, tr("N/A")); - } - else { - const QString value = (availability >= 1.0) - ? QLatin1String("100") - : Utils::String::fromDouble(availability * 100., 1); - QItemDelegate::drawDisplay(painter, opt, option.rect, value + C_THIN_SPACE + QLatin1Char('%')); - } + QItemDelegate::drawDisplay(painter, opt, option.rect, text); } break; default: @@ -172,16 +169,16 @@ QWidget *PropListDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const { - if (index.column() != PRIORITY) return nullptr; + if (index.column() != PRIORITY) return 0; if (m_properties) { BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent(); if (!torrent || !torrent->hasMetadata() || torrent->isSeed()) - return nullptr; + return 0; } if (index.data().toInt() == prio::MIXED) - return nullptr; + return 0; QComboBox *editor = new QComboBox(parent); editor->setFocusPolicy(Qt::StrongFocus); diff -Nru qbittorrent-4.1.3/src/gui/properties/proplistdelegate.h qbittorrent-3.3.15/src/gui/properties/proplistdelegate.h --- qbittorrent-4.1.3/src/gui/properties/proplistdelegate.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/proplistdelegate.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef PROPLISTDELEGATE_H @@ -31,10 +33,10 @@ #include -class QAbstractItemModel; -class QModelIndex; class QPainter; +class QModelIndex; class QStyleOptionViewItem; +class QAbstractItemModel; class PropertiesWidget; // Defines for properties list columns @@ -44,11 +46,10 @@ PCSIZE, PROGRESS, PRIORITY, - REMAINING, - AVAILABILITY + REMAINING }; -class PropListDelegate : public QItemDelegate +class PropListDelegate: public QItemDelegate { Q_OBJECT @@ -70,4 +71,4 @@ PropertiesWidget *m_properties; }; -#endif // PROPLISTDELEGATE_H +#endif diff -Nru qbittorrent-4.1.3/src/gui/properties/proptabbar.cpp qbittorrent-3.3.15/src/gui/properties/proptabbar.cpp --- qbittorrent-4.1.3/src/gui/properties/proptabbar.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/proptabbar.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2010 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2010 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,122 +24,96 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#include "proptabbar.h" - #include -#include #include #include +#include +#include "proptabbar.h" #include "guiiconprovider.h" -PropTabBar::PropTabBar(QWidget *parent) - : QHBoxLayout(parent) - , m_currentIndex(-1) +PropTabBar::PropTabBar(QWidget *parent) : + QHBoxLayout(parent), m_currentIndex(-1) { - setAlignment(Qt::AlignLeft | Qt::AlignCenter); - setSpacing(3); - m_btnGroup = new QButtonGroup(this); - // General tab - QPushButton *mainInfosButton = new QPushButton( -#ifndef Q_OS_MAC - GuiIconProvider::instance()->getIcon("document-properties"), -#endif - tr("General"), parent); - mainInfosButton->setShortcut(Qt::ALT + Qt::Key_G); - addWidget(mainInfosButton); - m_btnGroup->addButton(mainInfosButton, MainTab); - // Trackers tab - QPushButton *trackersButton = new QPushButton( -#ifndef Q_OS_MAC - GuiIconProvider::instance()->getIcon("network-server"), -#endif - tr("Trackers"), parent); - trackersButton->setShortcut(Qt::ALT + Qt::Key_C); - addWidget(trackersButton); - m_btnGroup->addButton(trackersButton, TrackersTab); - // Peers tab - QPushButton *peersButton = new QPushButton( -#ifndef Q_OS_MAC - GuiIconProvider::instance()->getIcon("edit-find-user"), -#endif - tr("Peers"), parent); - peersButton->setShortcut(Qt::ALT + Qt::Key_R); - addWidget(peersButton); - m_btnGroup->addButton(peersButton, PeersTab); - // URL seeds tab - QPushButton *URLSeedsButton = new QPushButton( -#ifndef Q_OS_MAC - GuiIconProvider::instance()->getIcon("network-server"), -#endif - tr("HTTP Sources"), parent); - URLSeedsButton->setShortcut(Qt::ALT + Qt::Key_B); - addWidget(URLSeedsButton); - m_btnGroup->addButton(URLSeedsButton, URLSeedsTab); - // Files tab - QPushButton *filesButton = new QPushButton( -#ifndef Q_OS_MAC - GuiIconProvider::instance()->getIcon("inode-directory"), -#endif - tr("Content"), parent); - filesButton->setShortcut(Qt::ALT + Qt::Key_Z); - addWidget(filesButton); - m_btnGroup->addButton(filesButton, FilesTab); - // Spacer - addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Fixed)); - // Speed tab - QPushButton *speedButton = new QPushButton( -#ifndef Q_OS_MAC - GuiIconProvider::instance()->getIcon("office-chart-line"), -#endif - tr("Speed"), parent); - speedButton->setShortcut(Qt::ALT + Qt::Key_D); - addWidget(speedButton); - m_btnGroup->addButton(speedButton, SpeedTab); - // SIGNAL/SLOT - connect(m_btnGroup, static_cast(&QButtonGroup::buttonClicked) - , this, &PropTabBar::setCurrentIndex); - // Disable buttons focus - foreach (QAbstractButton *btn, m_btnGroup->buttons()) - btn->setFocusPolicy(Qt::NoFocus); + setAlignment(Qt::AlignLeft | Qt::AlignCenter); + setSpacing(3); + m_btnGroup = new QButtonGroup(this); + // General tab + QPushButton *main_infos_button = new QPushButton(GuiIconProvider::instance()->getIcon("document-properties"), tr("General"), parent); + main_infos_button->setShortcut(Qt::ALT + Qt::Key_G); + addWidget(main_infos_button); + m_btnGroup->addButton(main_infos_button, MAIN_TAB); + // Trackers tab + QPushButton *trackers_button = new QPushButton(GuiIconProvider::instance()->getIcon("network-server"), tr("Trackers"), parent); + trackers_button->setShortcut(Qt::ALT + Qt::Key_C); + addWidget(trackers_button); + m_btnGroup->addButton(trackers_button, TRACKERS_TAB); + // Peers tab + QPushButton *peers_button = new QPushButton(GuiIconProvider::instance()->getIcon("edit-find-user"), tr("Peers"), parent); + peers_button->setShortcut(Qt::ALT + Qt::Key_R); + addWidget(peers_button); + m_btnGroup->addButton(peers_button, PEERS_TAB); + // URL seeds tab + QPushButton *urlseeds_button = new QPushButton(GuiIconProvider::instance()->getIcon("network-server"), tr("HTTP Sources"), parent); + urlseeds_button->setShortcut(Qt::ALT + Qt::Key_B); + addWidget(urlseeds_button); + m_btnGroup->addButton(urlseeds_button, URLSEEDS_TAB); + // Files tab + QPushButton *files_button = new QPushButton(GuiIconProvider::instance()->getIcon("inode-directory"), tr("Content"), parent); + files_button->setShortcut(Qt::ALT + Qt::Key_Z); + addWidget(files_button); + m_btnGroup->addButton(files_button, FILES_TAB); + // Spacer + addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Fixed)); + // Speed tab + QPushButton *speed_button = new QPushButton(GuiIconProvider::instance()->getIcon("office-chart-line"), tr("Speed"), parent); + speed_button->setShortcut(Qt::ALT + Qt::Key_D); + addWidget(speed_button); + m_btnGroup->addButton(speed_button, SPEED_TAB); + // SIGNAL/SLOT + connect(m_btnGroup, SIGNAL(buttonClicked(int)), SLOT(setCurrentIndex(int))); + // Disable buttons focus + foreach (QAbstractButton *btn, m_btnGroup->buttons()) { + btn->setFocusPolicy(Qt::NoFocus); + } } -PropTabBar::~PropTabBar() -{ - delete m_btnGroup; +PropTabBar::~PropTabBar() { + delete m_btnGroup; } int PropTabBar::currentIndex() const { - return m_currentIndex; + return m_currentIndex; } void PropTabBar::setCurrentIndex(int index) { - if (index >= m_btnGroup->buttons().size()) + if (index >= m_btnGroup->buttons().size()) index = 0; - // If asked to hide or if the currently selected tab is clicked - if (index < 0 || m_currentIndex == index) { - if (m_currentIndex >= 0) { - m_btnGroup->button(m_currentIndex)->setDown(false); - m_currentIndex = -1; - emit visibilityToggled(false); - } - return; - } - // Unselect previous tab + // If asked to hide or if the currently selected tab is clicked + if (index < 0 || m_currentIndex == index) { if (m_currentIndex >= 0) { - m_btnGroup->button(m_currentIndex)->setDown(false); - } - else { - // Nothing was selected, show! - emit visibilityToggled(true); + m_btnGroup->button(m_currentIndex)->setDown(false); + m_currentIndex = -1; + emit visibilityToggled(false); } - // Select the new button - m_btnGroup->button(index)->setDown(true); - m_currentIndex = index; - // Emit the signal - emit tabChanged(index); + return; + } + // Unselect previous tab + if (m_currentIndex >= 0) { + m_btnGroup->button(m_currentIndex)->setDown(false); + } else { + // Nothing was selected, show! + emit visibilityToggled(true); + } + // Select the new button + m_btnGroup->button(index)->setDown(true); + m_currentIndex = index; + // Emit the signal + emit tabChanged(index); } diff -Nru qbittorrent-4.1.3/src/gui/properties/proptabbar.h qbittorrent-3.3.15/src/gui/properties/proptabbar.h --- qbittorrent-4.1.3/src/gui/properties/proptabbar.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/proptabbar.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2010 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2010 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef PROPTABBAR_H @@ -31,7 +33,9 @@ #include +QT_BEGIN_NAMESPACE class QButtonGroup; +QT_END_NAMESPACE class PropTabBar : public QHBoxLayout { @@ -39,30 +43,24 @@ Q_DISABLE_COPY(PropTabBar) public: - enum PropertyTab - { - MainTab, - TrackersTab, - PeersTab, - URLSeedsTab, - FilesTab, - SpeedTab - }; - - explicit PropTabBar(QWidget *parent = nullptr); - ~PropTabBar(); - int currentIndex() const; + enum PropertyTab {MAIN_TAB, TRACKERS_TAB, PEERS_TAB, URLSEEDS_TAB, FILES_TAB, SPEED_TAB}; + +public: + explicit PropTabBar(QWidget *parent = 0); + ~PropTabBar(); + int currentIndex() const; signals: - void tabChanged(int index); - void visibilityToggled(bool visible); + void tabChanged(int index); + void visibilityToggled(bool visible); public slots: - void setCurrentIndex(int index); + void setCurrentIndex(int index); private: - QButtonGroup *m_btnGroup; - int m_currentIndex; + QButtonGroup *m_btnGroup; + int m_currentIndex; + }; #endif // PROPTABBAR_H diff -Nru qbittorrent-4.1.3/src/gui/properties/speedplotview.cpp qbittorrent-3.3.15/src/gui/properties/speedplotview.cpp --- qbittorrent-4.1.3/src/gui/properties/speedplotview.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/speedplotview.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -30,7 +30,6 @@ #include #include -#include "base/global.h" #include "base/utils/misc.h" SpeedPlotView::SpeedPlotView(QWidget *parent) @@ -161,7 +160,7 @@ if (!m_properties[static_cast(id)].enable) continue; - for (int i = static_cast(queue.size()) - 1, j = 0; (i >= 0) && (j <= m_viewablePointsCount); --i, ++j) + for (int i = int(queue.size()) - 1, j = 0; i >= 0 && j <= m_viewablePointsCount; --i, ++j) if (queue[i].y[id] > maxYValue) maxYValue = queue[i].y[id]; } @@ -192,20 +191,20 @@ Utils::Misc::friendlyUnit(0, true) }; - int yAxisWidth = 0; + int yAxeWidth = 0; for (const QString &label : speedLabels) - if (fontMetrics.width(label) > yAxisWidth) - yAxisWidth = fontMetrics.width(label); + if (fontMetrics.width(label) > yAxeWidth) + yAxeWidth = fontMetrics.width(label); int i = 0; for (const QString &label : speedLabels) { - QRectF labelRect(rect.topLeft() + QPointF(-yAxisWidth, (i++) * 0.25 * rect.height() - fontMetrics.height()), - QSizeF(2 * yAxisWidth, fontMetrics.height())); + QRectF labelRect(rect.topLeft() + QPointF(-yAxeWidth, (i++) * 0.25 * rect.height() - fontMetrics.height()), + QSizeF(2 * yAxeWidth, fontMetrics.height())); painter.drawText(labelRect, label, Qt::AlignRight | Qt::AlignTop); } // draw grid lines - rect.adjust(yAxisWidth + 4, 0, 0, 0); + rect.adjust(yAxeWidth + 4, 0, 0, 0); QPen gridPen; gridPen.setStyle(Qt::DashLine); @@ -237,16 +236,18 @@ boost::circular_buffer &queue = getCurrentData(); for (int id = UP; id < NB_GRAPHS; ++id) { + if (!m_properties[static_cast(id)].enable) continue; QVector points; - for (int i = static_cast(queue.size()) - 1, j = 0; (i >= 0) && (j <= m_viewablePointsCount); --i, ++j) { - int newX = rect.right() - j * xTickSize; - int newY = rect.bottom() - queue[i].y[id] * yMultiplier; + for (int i = int(queue.size()) - 1, j = 0; i >= 0 && j <= m_viewablePointsCount; --i, ++j) { + + int new_x = rect.right() - j * xTickSize; + int new_y = rect.bottom() - queue[i].y[id] * yMultiplier; - points.push_back(QPoint(newX, newY)); + points.push_back(QPoint(new_x, new_y)); } painter.setPen(m_properties[static_cast(id)].pen); @@ -258,7 +259,8 @@ double legendHeight = 0; int legendWidth = 0; - for (const auto &property : qAsConst(m_properties)) { + for (const auto &property : m_properties) { + if (!property.enable) continue; @@ -273,7 +275,8 @@ painter.fillRect(legendBackgroundRect, legendBackgroundColor); i = 0; - for (const auto &property : qAsConst(m_properties)) { + for (const auto &property : m_properties) { + if (!property.enable) continue; @@ -290,12 +293,10 @@ SpeedPlotView::GraphProperties::GraphProperties() : enable(false) -{ -} +{} SpeedPlotView::GraphProperties::GraphProperties(const QString &name, const QPen &pen, bool enable) : name(name) , pen(pen) , enable(enable) -{ -} +{} diff -Nru qbittorrent-4.1.3/src/gui/properties/speedplotview.h qbittorrent-3.3.15/src/gui/properties/speedplotview.h --- qbittorrent-4.1.3/src/gui/properties/speedplotview.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/speedplotview.h 2017-08-03 20:30:10.000000000 +0000 @@ -35,10 +35,9 @@ #include #include - class QPen; -class SpeedPlotView : public QGraphicsView +class SpeedPlotView: public QGraphicsView { Q_OBJECT @@ -55,7 +54,6 @@ DHT_DOWN, TRACKER_UP, TRACKER_DOWN, - NB_GRAPHS }; @@ -69,11 +67,11 @@ struct PointData { - qint64 x; + uint x; int y[NB_GRAPHS]; }; - explicit SpeedPlotView(QWidget *parent = nullptr); + explicit SpeedPlotView(QWidget *parent = 0); void setGraphEnable(GraphID id, bool enable); void setViewableLastPoints(TimePeriod period); @@ -83,7 +81,7 @@ void replot(); protected: - void paintEvent(QPaintEvent *event) override; + virtual void paintEvent(QPaintEvent *event); private: enum PeriodInSeconds @@ -111,9 +109,6 @@ bool enable; }; - int maxYValue(); - boost::circular_buffer &getCurrentData(); - boost::circular_buffer m_data5Min; boost::circular_buffer m_data30Min; boost::circular_buffer m_data6Hour; @@ -124,6 +119,10 @@ int m_counter30Min; int m_counter6Hour; + + int maxYValue(); + + boost::circular_buffer &getCurrentData(); }; #endif // SPEEDPLOTVIEW_H diff -Nru qbittorrent-4.1.3/src/gui/properties/speedwidget.cpp qbittorrent-3.3.15/src/gui/properties/speedwidget.cpp --- qbittorrent-4.1.3/src/gui/properties/speedwidget.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/speedwidget.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -33,20 +33,19 @@ #include #include #include -#include #include +#include "propertieswidget.h" #include "base/bittorrent/session.h" #include "base/bittorrent/sessionstatus.h" #include "base/preferences.h" -#include "propertieswidget.h" +#include "base/utils/misc.h" ComboBoxMenuButton::ComboBoxMenuButton(QWidget *parent, QMenu *menu) : QComboBox(parent) , m_menu(menu) -{ -} +{} void ComboBoxMenuButton::showPopup() { @@ -60,7 +59,6 @@ { m_layout = new QVBoxLayout(this); m_layout->setContentsMargins(0, 0, 0, 0); - m_layout->setSpacing(3); m_hlayout = new QHBoxLayout(); m_hlayout->setContentsMargins(0, 0, 0, 0); @@ -73,8 +71,7 @@ m_periodCombobox->addItem(tr("30 Minutes")); m_periodCombobox->addItem(tr("6 Hours")); - connect(m_periodCombobox, static_cast(&QComboBox::currentIndexChanged) - , this, &SpeedWidget::onPeriodChange); + connect(m_periodCombobox, SIGNAL(currentIndexChanged(int)), this, SLOT(onPeriodChange(int))); m_graphsMenu = new QMenu(this); m_graphsMenu->addAction(tr("Total Upload")); @@ -89,18 +86,16 @@ m_graphsMenu->addAction(tr("Tracker Download")); m_graphsMenuActions = m_graphsMenu->actions(); - m_graphsSignalMapper = new QSignalMapper(this); + m_graphsSignalMapper = new QSignalMapper(); for (int id = SpeedPlotView::UP; id < SpeedPlotView::NB_GRAPHS; ++id) { QAction *action = m_graphsMenuActions.at(id); action->setCheckable(true); action->setChecked(true); - connect(action, &QAction::changed, m_graphsSignalMapper - , static_cast(&QSignalMapper::map)); + connect(action, SIGNAL(changed()), m_graphsSignalMapper, SLOT(map())); m_graphsSignalMapper->setMapping(action, id); } - connect(m_graphsSignalMapper, static_cast(&QSignalMapper::mapped) - , this, &SpeedWidget::onGraphChange); + connect(m_graphsSignalMapper, SIGNAL(mapped(int)), this, SLOT(onGraphChange(int))); m_graphsButton = new ComboBoxMenuButton(this, m_graphsMenu); m_graphsButton->addItem(tr("Select Graphs")); @@ -117,9 +112,8 @@ loadSettings(); - QTimer *localUpdateTimer = new QTimer(this); - connect(localUpdateTimer, &QTimer::timeout, this, &SpeedWidget::update); - localUpdateTimer->start(1000); + m_isUpdating = true; + m_updateFuture = QtConcurrent::run(this, &SpeedWidget::update); m_plot->show(); } @@ -127,28 +121,43 @@ SpeedWidget::~SpeedWidget() { qDebug("SpeedWidget::~SpeedWidget() ENTER"); + + m_isUpdating = false; + m_updateFuture.waitForFinished(); + saveSettings(); + qDebug("SpeedWidget::~SpeedWidget() EXIT"); } void SpeedWidget::update() { - const BitTorrent::SessionStatus &btStatus = BitTorrent::Session::instance()->status(); + while (m_isUpdating) { - SpeedPlotView::PointData point; - point.x = QDateTime::currentMSecsSinceEpoch() / 1000; - point.y[SpeedPlotView::UP] = btStatus.uploadRate; - point.y[SpeedPlotView::DOWN] = btStatus.downloadRate; - point.y[SpeedPlotView::PAYLOAD_UP] = btStatus.payloadUploadRate; - point.y[SpeedPlotView::PAYLOAD_DOWN] = btStatus.payloadDownloadRate; - point.y[SpeedPlotView::OVERHEAD_UP] = btStatus.ipOverheadUploadRate; - point.y[SpeedPlotView::OVERHEAD_DOWN] = btStatus.ipOverheadDownloadRate; - point.y[SpeedPlotView::DHT_UP] = btStatus.dhtUploadRate; - point.y[SpeedPlotView::DHT_DOWN] = btStatus.dhtDownloadRate; - point.y[SpeedPlotView::TRACKER_UP] = btStatus.trackerUploadRate; - point.y[SpeedPlotView::TRACKER_DOWN] = btStatus.trackerDownloadRate; + BitTorrent::SessionStatus btStatus = BitTorrent::Session::instance()->status(); - m_plot->pushPoint(point); + SpeedPlotView::PointData point; + point.x = QDateTime::currentDateTime().toTime_t(); + point.y[SpeedPlotView::UP] = btStatus.uploadRate(); + point.y[SpeedPlotView::DOWN] = btStatus.downloadRate(); + point.y[SpeedPlotView::PAYLOAD_UP] = btStatus.payloadUploadRate(); + point.y[SpeedPlotView::PAYLOAD_DOWN] = btStatus.payloadDownloadRate(); + point.y[SpeedPlotView::OVERHEAD_UP] = btStatus.ipOverheadUploadRate(); + point.y[SpeedPlotView::OVERHEAD_DOWN] = btStatus.ipOverheadDownloadRate(); + point.y[SpeedPlotView::DHT_UP] = btStatus.dhtUploadRate(); + point.y[SpeedPlotView::DHT_DOWN] = btStatus.dhtDownloadRate(); + point.y[SpeedPlotView::TRACKER_UP] = btStatus.trackerUploadRate(); + point.y[SpeedPlotView::TRACKER_DOWN] = btStatus.trackerDownloadRate(); + + m_plot->pushPoint(point); + + QMetaObject::invokeMethod(this, "graphUpdate", Qt::QueuedConnection); + Utils::Misc::msleep(1000); + } +} + +void SpeedWidget::graphUpdate() +{ m_plot->replot(); } diff -Nru qbittorrent-4.1.3/src/gui/properties/speedwidget.h qbittorrent-3.3.15/src/gui/properties/speedwidget.h --- qbittorrent-4.1.3/src/gui/properties/speedwidget.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/speedwidget.h 2017-08-03 20:30:10.000000000 +0000 @@ -29,8 +29,9 @@ #ifndef SPEEDWIDGET_H #define SPEEDWIDGET_H -#include #include +#include +#include #include "speedplotview.h" @@ -44,10 +45,9 @@ class ComboBoxMenuButton : public QComboBox { Q_OBJECT - public: ComboBoxMenuButton(QWidget *parent, QMenu *menu); - void showPopup() override; + virtual void showPopup(); private: QMenu *m_menu; @@ -57,7 +57,6 @@ class SpeedWidget : public QWidget { Q_OBJECT - public: SpeedWidget(PropertiesWidget *parent); ~SpeedWidget(); @@ -65,11 +64,12 @@ private slots: void onPeriodChange(int period); void onGraphChange(int id); - void update(); private: + void update(); void loadSettings(); void saveSettings() const; + Q_INVOKABLE void graphUpdate(); QVBoxLayout *m_layout; QHBoxLayout *m_hlayout; @@ -81,6 +81,9 @@ QMenu *m_graphsMenu; QList m_graphsMenuActions; QSignalMapper *m_graphsSignalMapper; + + QFuture m_updateFuture; + bool m_isUpdating; }; #endif // SPEEDWIDGET_H diff -Nru qbittorrent-4.1.3/src/gui/properties/trackerlist.cpp qbittorrent-3.3.15/src/gui/properties/trackerlist.cpp --- qbittorrent-4.1.3/src/gui/properties/trackerlist.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/trackerlist.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,540 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#include "trackerlist.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef QBT_USES_QT5 +#include +#endif + +#include "base/bittorrent/session.h" +#include "base/bittorrent/torrenthandle.h" +#include "base/bittorrent/peerinfo.h" +#include "base/bittorrent/trackerentry.h" +#include "base/preferences.h" +#include "base/utils/misc.h" +#include "propertieswidget.h" +#include "trackersadditiondlg.h" +#include "guiiconprovider.h" +#include "autoexpandabledialog.h" + +TrackerList::TrackerList(PropertiesWidget *properties): QTreeWidget(), properties(properties) { + // Graphical settings + setRootIsDecorated(false); + setAllColumnsShowFocus(true); + setItemsExpandable(false); + setSelectionMode(QAbstractItemView::ExtendedSelection); + // Context menu + setContextMenuPolicy(Qt::CustomContextMenu); + connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showTrackerListMenu(QPoint))); + // Set header + QStringList header; + header << "#"; + header << tr("URL"); + header << tr("Status"); + header << tr("Received"); + header << tr("Seeds"); + header << tr("Peers"); + header << tr("Downloaded"); + header << tr("Message"); + setHeaderItem(new QTreeWidgetItem(header)); + dht_item = new QTreeWidgetItem({ "", "** [DHT] **", "", "0", "", "", "0" }); + insertTopLevelItem(0, dht_item); + setRowColor(0, QColor("grey")); + pex_item = new QTreeWidgetItem({ "", "** [PeX] **", "", "0", "", "", "0" }); + insertTopLevelItem(1, pex_item); + setRowColor(1, QColor("grey")); + lsd_item = new QTreeWidgetItem({ "", "** [LSD] **", "", "0", "", "", "0" }); + insertTopLevelItem(2, lsd_item); + setRowColor(2, QColor("grey")); + editHotkey = new QShortcut(Qt::Key_F2, this, SLOT(editSelectedTracker()), 0, Qt::WidgetShortcut); + connect(this, SIGNAL(doubleClicked(QModelIndex)), SLOT(editSelectedTracker())); + deleteHotkey = new QShortcut(QKeySequence::Delete, this, SLOT(deleteSelectedTrackers()), 0, Qt::WidgetShortcut); + copyHotkey = new QShortcut(QKeySequence::Copy, this, SLOT(copyTrackerUrl()), 0, Qt::WidgetShortcut); + +#ifdef QBT_USES_QT5 + // This hack fixes reordering of first column with Qt5. + // https://github.com/qtproject/qtbase/commit/e0fc088c0c8bc61dbcaf5928b24986cd61a22777 + QTableView unused; + unused.setVerticalHeader(this->header()); + this->header()->setParent(this); + unused.setVerticalHeader(new QHeaderView(Qt::Horizontal)); +#endif + + loadSettings(); +} + +TrackerList::~TrackerList() { + delete editHotkey; + delete deleteHotkey; + delete copyHotkey; + saveSettings(); +} + +QList TrackerList::getSelectedTrackerItems() const { + const QList selected_items = selectedItems(); + QList selected_trackers; + foreach (QTreeWidgetItem *item, selected_items) { + if (indexOfTopLevelItem(item) >= NB_STICKY_ITEM) { // Ignore STICKY ITEMS + selected_trackers << item; + } + } + return selected_trackers; +} + +void TrackerList::setRowColor(int row, QColor color) { + unsigned int nbColumns = columnCount(); + QTreeWidgetItem *item = topLevelItem(row); + for (unsigned int i=0; isetData(i, Qt::ForegroundRole, color); + } +} + +void TrackerList::moveSelectionUp() { + BitTorrent::TorrentHandle *const torrent = properties->getCurrentTorrent(); + if (!torrent) { + clear(); + return; + } + QList selected_items = getSelectedTrackerItems(); + if (selected_items.isEmpty()) return; + bool change = false; + foreach (QTreeWidgetItem *item, selected_items) { + int index = indexOfTopLevelItem(item); + if (index > NB_STICKY_ITEM) { + insertTopLevelItem(index-1, takeTopLevelItem(index)); + change = true; + } + } + if (!change) return; + // Restore selection + QItemSelectionModel *selection = selectionModel(); + foreach (QTreeWidgetItem *item, selected_items) { + selection->select(indexFromItem(item), QItemSelectionModel::Rows|QItemSelectionModel::Select); + } + setSelectionModel(selection); + // Update torrent trackers + QList trackers; + for (int i = NB_STICKY_ITEM; i < topLevelItemCount(); ++i) { + QString tracker_url = topLevelItem(i)->data(COL_URL, Qt::DisplayRole).toString(); + BitTorrent::TrackerEntry e(tracker_url); + e.setTier(i - NB_STICKY_ITEM); + trackers.append(e); + } + + torrent->replaceTrackers(trackers); + // Reannounce + if (!torrent->isPaused()) + torrent->forceReannounce(); +} + +void TrackerList::moveSelectionDown() { + BitTorrent::TorrentHandle *const torrent = properties->getCurrentTorrent(); + if (!torrent) { + clear(); + return; + } + QList selected_items = getSelectedTrackerItems(); + if (selected_items.isEmpty()) return; + bool change = false; + for (int i=selectedItems().size()-1; i>= 0; --i) { + int index = indexOfTopLevelItem(selected_items.at(i)); + if (index < topLevelItemCount()-1) { + insertTopLevelItem(index+1, takeTopLevelItem(index)); + change = true; + } + } + if (!change) return; + // Restore selection + QItemSelectionModel *selection = selectionModel(); + foreach (QTreeWidgetItem *item, selected_items) { + selection->select(indexFromItem(item), QItemSelectionModel::Rows|QItemSelectionModel::Select); + } + setSelectionModel(selection); + // Update torrent trackers + QList trackers; + for (int i = NB_STICKY_ITEM; i < topLevelItemCount(); ++i) { + QString tracker_url = topLevelItem(i)->data(COL_URL, Qt::DisplayRole).toString(); + BitTorrent::TrackerEntry e(tracker_url); + e.setTier(i - NB_STICKY_ITEM); + trackers.append(e); + } + + torrent->replaceTrackers(trackers); + // Reannounce + if (!torrent->isPaused()) + torrent->forceReannounce(); +} + +void TrackerList::clear() +{ + qDeleteAll(tracker_items.values()); + tracker_items.clear(); + dht_item->setText(COL_STATUS, ""); + dht_item->setText(COL_SEEDS, ""); + dht_item->setText(COL_PEERS, ""); + dht_item->setText(COL_MSG, ""); + pex_item->setText(COL_STATUS, ""); + pex_item->setText(COL_SEEDS, ""); + pex_item->setText(COL_PEERS, ""); + pex_item->setText(COL_MSG, ""); + lsd_item->setText(COL_STATUS, ""); + lsd_item->setText(COL_SEEDS, ""); + lsd_item->setText(COL_PEERS, ""); + lsd_item->setText(COL_MSG, ""); +} + +void TrackerList::loadStickyItems(BitTorrent::TorrentHandle *const torrent) { + QString working = tr("Working"); + QString disabled = tr("Disabled"); + + // load DHT information + if (BitTorrent::Session::instance()->isDHTEnabled() && !torrent->isPrivate()) + dht_item->setText(COL_STATUS, working); + else + dht_item->setText(COL_STATUS, disabled); + + // Load PeX Information + if (BitTorrent::Session::instance()->isPeXEnabled() && !torrent->isPrivate()) + pex_item->setText(COL_STATUS, working); + else + pex_item->setText(COL_STATUS, disabled); + + // Load LSD Information + if (BitTorrent::Session::instance()->isLSDEnabled() && !torrent->isPrivate()) + lsd_item->setText(COL_STATUS, working); + else + lsd_item->setText(COL_STATUS, disabled); + + if (torrent->isPrivate()) { + QString privateMsg = tr("This torrent is private"); + dht_item->setText(COL_MSG, privateMsg); + pex_item->setText(COL_MSG, privateMsg); + lsd_item->setText(COL_MSG, privateMsg); + } + + // XXX: libtorrent should provide this info... + // Count peers from DHT, PeX, LSD + uint seedsDHT = 0, seedsPeX = 0, seedsLSD = 0, peersDHT = 0, peersPeX = 0, peersLSD = 0; + foreach (const BitTorrent::PeerInfo &peer, torrent->peers()) { + if (peer.isConnecting()) continue; + + if (peer.fromDHT()) { + if (peer.isSeed()) + ++seedsDHT; + else + ++peersDHT; + } + if (peer.fromPeX()) { + if (peer.isSeed()) + ++seedsPeX; + else + ++peersPeX; + } + if (peer.fromLSD()) { + if (peer.isSeed()) + ++seedsLSD; + else + ++peersLSD; + } + } + + dht_item->setText(COL_SEEDS, QString::number(seedsDHT)); + dht_item->setText(COL_PEERS, QString::number(peersDHT)); + pex_item->setText(COL_SEEDS, QString::number(seedsPeX)); + pex_item->setText(COL_PEERS, QString::number(peersPeX)); + lsd_item->setText(COL_SEEDS, QString::number(seedsLSD)); + lsd_item->setText(COL_PEERS, QString::number(peersLSD)); +} + +void TrackerList::loadTrackers() { + // Load trackers from torrent handle + BitTorrent::TorrentHandle *const torrent = properties->getCurrentTorrent(); + if (!torrent) return; + + loadStickyItems(torrent); + // Load actual trackers information + QHash trackers_data = torrent->trackerInfos(); + QStringList old_trackers_urls = tracker_items.keys(); + foreach (const BitTorrent::TrackerEntry &entry, torrent->trackers()) { + QString trackerUrl = entry.url(); + QTreeWidgetItem *item = tracker_items.value(trackerUrl, 0); + if (!item) { + item = new QTreeWidgetItem(); + item->setText(COL_URL, trackerUrl); + addTopLevelItem(item); + tracker_items[trackerUrl] = item; + } else { + old_trackers_urls.removeOne(trackerUrl); + } + item->setText(COL_TIER, QString::number(entry.tier())); + BitTorrent::TrackerInfo data = trackers_data.value(trackerUrl); + QString error_message = data.lastMessage.trimmed(); + switch (entry.status()) { + case BitTorrent::TrackerEntry::Working: + item->setText(COL_STATUS, tr("Working")); + item->setText(COL_MSG, ""); + break; + case BitTorrent::TrackerEntry::Updating: + item->setText(COL_STATUS, tr("Updating...")); + item->setText(COL_MSG, ""); + break; + case BitTorrent::TrackerEntry::NotWorking: + item->setText(COL_STATUS, tr("Not working")); + item->setText(COL_MSG, error_message); + break; + case BitTorrent::TrackerEntry::NotContacted: + item->setText(COL_STATUS, tr("Not contacted yet")); + item->setText(COL_MSG, ""); + break; + } + item->setText(COL_RECEIVED, QString::number(data.numPeers)); + +#if LIBTORRENT_VERSION_NUM >= 10000 + item->setText(COL_SEEDS, QString::number(entry.nativeEntry().scrape_complete > 0 ? entry.nativeEntry().scrape_complete : 0)); + item->setText(COL_PEERS, QString::number(entry.nativeEntry().scrape_incomplete > 0 ? entry.nativeEntry().scrape_incomplete : 0)); + item->setText(COL_DOWNLOADED, QString::number(entry.nativeEntry().scrape_downloaded > 0 ? entry.nativeEntry().scrape_downloaded : 0)); +#else + item->setText(COL_SEEDS, "0"); + item->setText(COL_PEERS, "0"); + item->setText(COL_DOWNLOADED, "0"); +#endif + + } + // Remove old trackers + foreach (const QString &tracker, old_trackers_urls) { + delete tracker_items.take(tracker); + } +} + +// Ask the user for new trackers and add them to the torrent +void TrackerList::askForTrackers() { + BitTorrent::TorrentHandle *const torrent = properties->getCurrentTorrent(); + if (!torrent) return; + + QList trackers; + foreach (const QString &tracker, TrackersAdditionDlg::askForTrackers(torrent)) + trackers << tracker; + torrent->addTrackers(trackers); +} + +void TrackerList::copyTrackerUrl() { + QList selected_items = getSelectedTrackerItems(); + if (selected_items.isEmpty()) return; + QStringList urls_to_copy; + foreach (QTreeWidgetItem *item, selected_items) { + QString tracker_url = item->data(COL_URL, Qt::DisplayRole).toString(); + qDebug() << QString("Copy: ") + tracker_url; + urls_to_copy << tracker_url; + } + QApplication::clipboard()->setText(urls_to_copy.join("\n")); +} + + +void TrackerList::deleteSelectedTrackers() { + BitTorrent::TorrentHandle *const torrent = properties->getCurrentTorrent(); + if (!torrent) { + clear(); + return; + } + + QList selected_items = getSelectedTrackerItems(); + if (selected_items.isEmpty()) return; + + QStringList urls_to_remove; + foreach (QTreeWidgetItem *item, selected_items) { + QString tracker_url = item->data(COL_URL, Qt::DisplayRole).toString(); + urls_to_remove << tracker_url; + tracker_items.remove(tracker_url); + delete item; + } + + // Iterate of trackers and remove selected ones + QList remaining_trackers; + QList trackers = torrent->trackers(); + foreach (const BitTorrent::TrackerEntry &entry, trackers) { + if (!urls_to_remove.contains(entry.url())) { + remaining_trackers.push_back(entry); + } + } + + torrent->replaceTrackers(remaining_trackers); + if (!torrent->isPaused()) + torrent->forceReannounce(); +} + +void TrackerList::editSelectedTracker() { + BitTorrent::TorrentHandle *const torrent = properties->getCurrentTorrent(); + if (!torrent) return; + + QString hash = torrent->hash(); + + QList selected_items = getSelectedTrackerItems(); + if (selected_items.isEmpty()) + return; + // During multi-select only process item selected last + QUrl tracker_url = selected_items.last()->text(COL_URL); + + bool ok; + QUrl new_tracker_url = AutoExpandableDialog::getText(this, tr("Tracker editing"), tr("Tracker URL:"), + QLineEdit::Normal, tracker_url.toString(), &ok).trimmed(); + if (!ok) + return; + + if (!new_tracker_url.isValid()) { + QMessageBox::warning(this, tr("Tracker editing failed"), tr("The tracker URL entered is invalid.")); + return; + } + if (new_tracker_url == tracker_url) + return; + + QList trackers = torrent->trackers(); + bool match = false; + for (int i = 0; i < trackers.size(); ++i) { + BitTorrent::TrackerEntry &entry = trackers[i]; + if (new_tracker_url == QUrl(entry.url())) { + QMessageBox::warning(this, tr("Tracker editing failed"), tr("The tracker URL already exists.")); + return; + } + + if (tracker_url == QUrl(entry.url()) && !match) { + BitTorrent::TrackerEntry new_entry(new_tracker_url.toString()); + new_entry.setTier(entry.tier()); + match = true; + entry = new_entry; + } + } + + torrent->replaceTrackers(trackers); + if (!torrent->isPaused()) { + torrent->forceReannounce(); + } +} + +void TrackerList::reannounceSelected() { + QList selected_items = selectedItems(); + if (selected_items.isEmpty()) return; + + BitTorrent::TorrentHandle *const torrent = properties->getCurrentTorrent(); + if (!torrent) return; + QList trackers = torrent->trackers(); + + foreach (QTreeWidgetItem* item, selected_items) { + // DHT case + if (item == dht_item) { + torrent->forceDHTAnnounce(); + continue; + } + + // Trackers case + for (int i = 0; i < trackers.size(); ++i) { + if (item->text(COL_URL) == trackers[i].url()) { + torrent->forceReannounce(i); + break; + } + } + } + + loadTrackers(); +} + +void TrackerList::showTrackerListMenu(QPoint) { + BitTorrent::TorrentHandle *const torrent = properties->getCurrentTorrent(); + if (!torrent) return; + //QList selected_items = getSelectedTrackerItems(); + QMenu menu; + // Add actions + QAction *addAct = menu.addAction(GuiIconProvider::instance()->getIcon("list-add"), tr("Add a new tracker...")); + QAction *copyAct = 0; + QAction *delAct = 0; + QAction *editAct = 0; + if (!getSelectedTrackerItems().isEmpty()) { + delAct = menu.addAction(GuiIconProvider::instance()->getIcon("list-remove"), tr("Remove tracker")); + copyAct = menu.addAction(GuiIconProvider::instance()->getIcon("edit-copy"), tr("Copy tracker URL")); + editAct = menu.addAction(GuiIconProvider::instance()->getIcon("edit-rename"),tr("Edit selected tracker URL")); + } + QAction *reannounceSelAct = NULL; + QAction *reannounceAct = NULL; + if (!torrent->isPaused()) { + reannounceSelAct = menu.addAction(GuiIconProvider::instance()->getIcon("view-refresh"), tr("Force reannounce to selected trackers")); + menu.addSeparator(); + reannounceAct = menu.addAction(GuiIconProvider::instance()->getIcon("view-refresh"), tr("Force reannounce to all trackers")); + } + QAction *act = menu.exec(QCursor::pos()); + if (act == 0) return; + if (act == addAct) { + askForTrackers(); + return; + } + if (act == copyAct) { + copyTrackerUrl(); + return; + } + if (act == delAct) { + deleteSelectedTrackers(); + return; + } + if (act == reannounceSelAct) { + reannounceSelected(); + return; + } + if (act == reannounceAct) { + BitTorrent::TorrentHandle *h = properties->getCurrentTorrent(); + h->forceReannounce(); + h->forceDHTAnnounce(); + return; + } + if (act == editAct) { + editSelectedTracker(); + return; + } +} + +void TrackerList::loadSettings() { + if (!header()->restoreState(Preferences::instance()->getPropTrackerListState())) { + setColumnWidth(0, 30); + setColumnWidth(1, 300); + } +} + +void TrackerList::saveSettings() const { + Preferences::instance()->setPropTrackerListState(header()->saveState()); +} diff -Nru qbittorrent-4.1.3/src/gui/properties/trackerlist.h qbittorrent-3.3.15/src/gui/properties/trackerlist.h --- qbittorrent-4.1.3/src/gui/properties/trackerlist.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/trackerlist.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,90 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef TRACKERLIST_H +#define TRACKERLIST_H + +#include +#include +#include +#include + +#include "propertieswidget.h" + +enum TrackerListColumn {COL_TIER, COL_URL, COL_STATUS, COL_RECEIVED, COL_SEEDS, COL_PEERS, COL_DOWNLOADED, COL_MSG}; +#define NB_STICKY_ITEM 3 + +namespace BitTorrent +{ + class TorrentHandle; +} + +class TrackerList: public QTreeWidget { + Q_OBJECT + Q_DISABLE_COPY(TrackerList) + +private: + PropertiesWidget *properties; + QHash tracker_items; + QTreeWidgetItem* dht_item; + QTreeWidgetItem* pex_item; + QTreeWidgetItem* lsd_item; + QShortcut *editHotkey; + QShortcut *deleteHotkey; + QShortcut *copyHotkey; + +public: + TrackerList(PropertiesWidget *properties); + ~TrackerList(); + +protected: + QList getSelectedTrackerItems() const; + +public slots: + void setRowColor(int row, QColor color); + + void moveSelectionUp(); + void moveSelectionDown(); + + void clear(); + void loadStickyItems(BitTorrent::TorrentHandle *const torrent); + void loadTrackers(); + void askForTrackers(); + void copyTrackerUrl(); + void reannounceSelected(); + void deleteSelectedTrackers(); + void editSelectedTracker(); + void showTrackerListMenu(QPoint); + void loadSettings(); + void saveSettings() const; + +}; + +#endif // TRACKERLIST_H diff -Nru qbittorrent-4.1.3/src/gui/properties/trackerlistwidget.cpp qbittorrent-3.3.15/src/gui/properties/trackerlistwidget.cpp --- qbittorrent-4.1.3/src/gui/properties/trackerlistwidget.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/trackerlistwidget.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,638 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "trackerlistwidget.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "base/bittorrent/peerinfo.h" -#include "base/bittorrent/session.h" -#include "base/bittorrent/torrenthandle.h" -#include "base/bittorrent/trackerentry.h" -#include "base/preferences.h" -#include "base/utils/misc.h" -#include "autoexpandabledialog.h" -#include "guiiconprovider.h" -#include "propertieswidget.h" -#include "trackersadditiondialog.h" - -TrackerListWidget::TrackerListWidget(PropertiesWidget *properties) - : QTreeWidget() - , m_properties(properties) -{ - // Set header - // Must be set before calling loadSettings() otherwise the header is reset on restart - setHeaderLabels(headerLabels()); - // Load settings - loadSettings(); - // Graphical settings - setRootIsDecorated(false); - setAllColumnsShowFocus(true); - setItemsExpandable(false); - setSelectionMode(QAbstractItemView::ExtendedSelection); - header()->setStretchLastSection(false); // Must be set after loadSettings() in order to work - // Ensure that at least one column is visible at all times - if (visibleColumnsCount() == 0) - setColumnHidden(COL_URL, false); - // To also mitigate the above issue, we have to resize each column when - // its size is 0, because explicitly 'showing' the column isn't enough - // in the above scenario. - for (int i = 0; i < COL_COUNT; ++i) - if ((columnWidth(i) <= 0) && !isColumnHidden(i)) - resizeColumnToContents(i); - // Context menu - setContextMenuPolicy(Qt::CustomContextMenu); - connect(this, &QWidget::customContextMenuRequested, this, &TrackerListWidget::showTrackerListMenu); - // Header - header()->setContextMenuPolicy(Qt::CustomContextMenu); - connect(header(), &QWidget::customContextMenuRequested, this, &TrackerListWidget::displayToggleColumnsMenu); - connect(header(), &QHeaderView::sectionMoved, this, &TrackerListWidget::saveSettings); - connect(header(), &QHeaderView::sectionResized, this, &TrackerListWidget::saveSettings); - connect(header(), &QHeaderView::sortIndicatorChanged, this, &TrackerListWidget::saveSettings); - // Set DHT, PeX, LSD items - m_DHTItem = new QTreeWidgetItem({ "", "** [DHT] **", "", "0", "", "", "0" }); - insertTopLevelItem(0, m_DHTItem); - setRowColor(0, QColor("grey")); - m_PEXItem = new QTreeWidgetItem({ "", "** [PeX] **", "", "0", "", "", "0" }); - insertTopLevelItem(1, m_PEXItem); - setRowColor(1, QColor("grey")); - m_LSDItem = new QTreeWidgetItem({ "", "** [LSD] **", "", "0", "", "", "0" }); - insertTopLevelItem(2, m_LSDItem); - setRowColor(2, QColor("grey")); - // Set static items alignment - m_DHTItem->setTextAlignment(COL_RECEIVED, (Qt::AlignRight | Qt::AlignVCenter)); - m_PEXItem->setTextAlignment(COL_RECEIVED, (Qt::AlignRight | Qt::AlignVCenter)); - m_LSDItem->setTextAlignment(COL_RECEIVED, (Qt::AlignRight | Qt::AlignVCenter)); - m_DHTItem->setTextAlignment(COL_SEEDS, (Qt::AlignRight | Qt::AlignVCenter)); - m_PEXItem->setTextAlignment(COL_SEEDS, (Qt::AlignRight | Qt::AlignVCenter)); - m_LSDItem->setTextAlignment(COL_SEEDS, (Qt::AlignRight | Qt::AlignVCenter)); - m_DHTItem->setTextAlignment(COL_PEERS, (Qt::AlignRight | Qt::AlignVCenter)); - m_PEXItem->setTextAlignment(COL_PEERS, (Qt::AlignRight | Qt::AlignVCenter)); - m_LSDItem->setTextAlignment(COL_PEERS, (Qt::AlignRight | Qt::AlignVCenter)); - m_DHTItem->setTextAlignment(COL_DOWNLOADED, (Qt::AlignRight | Qt::AlignVCenter)); - m_PEXItem->setTextAlignment(COL_DOWNLOADED, (Qt::AlignRight | Qt::AlignVCenter)); - m_LSDItem->setTextAlignment(COL_DOWNLOADED, (Qt::AlignRight | Qt::AlignVCenter)); - // Set header alignment - headerItem()->setTextAlignment(COL_TIER, (Qt::AlignRight | Qt::AlignVCenter)); - headerItem()->setTextAlignment(COL_RECEIVED, (Qt::AlignRight | Qt::AlignVCenter)); - headerItem()->setTextAlignment(COL_SEEDS, (Qt::AlignRight | Qt::AlignVCenter)); - headerItem()->setTextAlignment(COL_PEERS, (Qt::AlignRight | Qt::AlignVCenter)); - headerItem()->setTextAlignment(COL_DOWNLOADED, (Qt::AlignRight | Qt::AlignVCenter)); - // Set hotkeys - m_editHotkey = new QShortcut(Qt::Key_F2, this, nullptr, nullptr, Qt::WidgetShortcut); - connect(m_editHotkey, &QShortcut::activated, this, &TrackerListWidget::editSelectedTracker); - connect(this, &QAbstractItemView::doubleClicked, this, &TrackerListWidget::editSelectedTracker); - m_deleteHotkey = new QShortcut(QKeySequence::Delete, this, nullptr, nullptr, Qt::WidgetShortcut); - connect(m_deleteHotkey, &QShortcut::activated, this, &TrackerListWidget::deleteSelectedTrackers); - m_copyHotkey = new QShortcut(QKeySequence::Copy, this, nullptr, nullptr, Qt::WidgetShortcut); - connect(m_copyHotkey, &QShortcut::activated, this, &TrackerListWidget::copyTrackerUrl); - - // This hack fixes reordering of first column with Qt5. - // https://github.com/qtproject/qtbase/commit/e0fc088c0c8bc61dbcaf5928b24986cd61a22777 - QTableView unused; - unused.setVerticalHeader(header()); - header()->setParent(this); - unused.setVerticalHeader(new QHeaderView(Qt::Horizontal)); -} - -TrackerListWidget::~TrackerListWidget() -{ - saveSettings(); -} - -QList TrackerListWidget::getSelectedTrackerItems() const -{ - const QList selectedTrackerItems = selectedItems(); - QList selectedTrackers; - foreach (QTreeWidgetItem *item, selectedTrackerItems) { - if (indexOfTopLevelItem(item) >= NB_STICKY_ITEM) // Ignore STICKY ITEMS - selectedTrackers << item; - } - - return selectedTrackers; -} - -void TrackerListWidget::setRowColor(int row, QColor color) -{ - const int nbColumns = columnCount(); - QTreeWidgetItem *item = topLevelItem(row); - for (int i = 0; i < nbColumns; ++i) - item->setData(i, Qt::ForegroundRole, color); -} - -void TrackerListWidget::moveSelectionUp() -{ - BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent(); - if (!torrent) { - clear(); - return; - } - QList selectedTrackerItems = getSelectedTrackerItems(); - if (selectedTrackerItems.isEmpty()) return; - - bool change = false; - foreach (QTreeWidgetItem *item, selectedTrackerItems) { - int index = indexOfTopLevelItem(item); - if (index > NB_STICKY_ITEM) { - insertTopLevelItem(index - 1, takeTopLevelItem(index)); - change = true; - } - } - if (!change) return; - - // Restore selection - QItemSelectionModel *selection = selectionModel(); - foreach (QTreeWidgetItem *item, selectedTrackerItems) - selection->select(indexFromItem(item), (QItemSelectionModel::Rows | QItemSelectionModel::Select)); - - setSelectionModel(selection); - // Update torrent trackers - QList trackers; - for (int i = NB_STICKY_ITEM; i < topLevelItemCount(); ++i) { - QString trackerURL = topLevelItem(i)->data(COL_URL, Qt::DisplayRole).toString(); - BitTorrent::TrackerEntry e(trackerURL); - e.setTier(i - NB_STICKY_ITEM); - trackers.append(e); - } - - torrent->replaceTrackers(trackers); - // Reannounce - if (!torrent->isPaused()) - torrent->forceReannounce(); -} - -void TrackerListWidget::moveSelectionDown() -{ - BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent(); - if (!torrent) { - clear(); - return; - } - QList selectedTrackerItems = getSelectedTrackerItems(); - if (selectedTrackerItems.isEmpty()) return; - - bool change = false; - for (int i = selectedItems().size() - 1; i >= 0; --i) { - int index = indexOfTopLevelItem(selectedTrackerItems.at(i)); - if (index < (topLevelItemCount() - 1)) { - insertTopLevelItem(index + 1, takeTopLevelItem(index)); - change = true; - } - } - if (!change) return; - - // Restore selection - QItemSelectionModel *selection = selectionModel(); - foreach (QTreeWidgetItem *item, selectedTrackerItems) - selection->select(indexFromItem(item), (QItemSelectionModel::Rows | QItemSelectionModel::Select)); - - setSelectionModel(selection); - // Update torrent trackers - QList trackers; - for (int i = NB_STICKY_ITEM; i < topLevelItemCount(); ++i) { - QString trackerURL = topLevelItem(i)->data(COL_URL, Qt::DisplayRole).toString(); - BitTorrent::TrackerEntry e(trackerURL); - e.setTier(i - NB_STICKY_ITEM); - trackers.append(e); - } - - torrent->replaceTrackers(trackers); - // Reannounce - if (!torrent->isPaused()) - torrent->forceReannounce(); -} - -void TrackerListWidget::clear() -{ - qDeleteAll(m_trackerItems); - m_trackerItems.clear(); - m_DHTItem->setText(COL_STATUS, ""); - m_DHTItem->setText(COL_SEEDS, ""); - m_DHTItem->setText(COL_PEERS, ""); - m_DHTItem->setText(COL_MSG, ""); - m_PEXItem->setText(COL_STATUS, ""); - m_PEXItem->setText(COL_SEEDS, ""); - m_PEXItem->setText(COL_PEERS, ""); - m_PEXItem->setText(COL_MSG, ""); - m_LSDItem->setText(COL_STATUS, ""); - m_LSDItem->setText(COL_SEEDS, ""); - m_LSDItem->setText(COL_PEERS, ""); - m_LSDItem->setText(COL_MSG, ""); -} - -void TrackerListWidget::loadStickyItems(BitTorrent::TorrentHandle *const torrent) -{ - QString working = tr("Working"); - QString disabled = tr("Disabled"); - - // load DHT information - if (BitTorrent::Session::instance()->isDHTEnabled() && !torrent->isPrivate()) - m_DHTItem->setText(COL_STATUS, working); - else - m_DHTItem->setText(COL_STATUS, disabled); - - // Load PeX Information - if (BitTorrent::Session::instance()->isPeXEnabled() && !torrent->isPrivate()) - m_PEXItem->setText(COL_STATUS, working); - else - m_PEXItem->setText(COL_STATUS, disabled); - - // Load LSD Information - if (BitTorrent::Session::instance()->isLSDEnabled() && !torrent->isPrivate()) - m_LSDItem->setText(COL_STATUS, working); - else - m_LSDItem->setText(COL_STATUS, disabled); - - if (torrent->isPrivate()) { - QString privateMsg = tr("This torrent is private"); - m_DHTItem->setText(COL_MSG, privateMsg); - m_PEXItem->setText(COL_MSG, privateMsg); - m_LSDItem->setText(COL_MSG, privateMsg); - } - - // XXX: libtorrent should provide this info... - // Count peers from DHT, PeX, LSD - uint seedsDHT = 0, seedsPeX = 0, seedsLSD = 0, peersDHT = 0, peersPeX = 0, peersLSD = 0; - foreach (const BitTorrent::PeerInfo &peer, torrent->peers()) { - if (peer.isConnecting()) continue; - - if (peer.fromDHT()) { - if (peer.isSeed()) - ++seedsDHT; - else - ++peersDHT; - } - if (peer.fromPeX()) { - if (peer.isSeed()) - ++seedsPeX; - else - ++peersPeX; - } - if (peer.fromLSD()) { - if (peer.isSeed()) - ++seedsLSD; - else - ++peersLSD; - } - } - - m_DHTItem->setText(COL_SEEDS, QString::number(seedsDHT)); - m_DHTItem->setText(COL_PEERS, QString::number(peersDHT)); - m_PEXItem->setText(COL_SEEDS, QString::number(seedsPeX)); - m_PEXItem->setText(COL_PEERS, QString::number(peersPeX)); - m_LSDItem->setText(COL_SEEDS, QString::number(seedsLSD)); - m_LSDItem->setText(COL_PEERS, QString::number(peersLSD)); -} - -void TrackerListWidget::loadTrackers() -{ - // Load trackers from torrent handle - BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent(); - if (!torrent) return; - - loadStickyItems(torrent); - - // Load actual trackers information - QHash trackerData = torrent->trackerInfos(); - QStringList oldTrackerURLs = m_trackerItems.keys(); - foreach (const BitTorrent::TrackerEntry &entry, torrent->trackers()) { - QString trackerURL = entry.url(); - QTreeWidgetItem *item = m_trackerItems.value(trackerURL, nullptr); - if (!item) { - item = new QTreeWidgetItem(); - item->setText(COL_URL, trackerURL); - addTopLevelItem(item); - m_trackerItems[trackerURL] = item; - } - else { - oldTrackerURLs.removeOne(trackerURL); - } - item->setText(COL_TIER, QString::number(entry.tier())); - BitTorrent::TrackerInfo data = trackerData.value(trackerURL); - QString errorMessage = data.lastMessage.trimmed(); - switch (entry.status()) { - case BitTorrent::TrackerEntry::Working: - item->setText(COL_STATUS, tr("Working")); - item->setText(COL_MSG, ""); - break; - case BitTorrent::TrackerEntry::Updating: - item->setText(COL_STATUS, tr("Updating...")); - item->setText(COL_MSG, ""); - break; - case BitTorrent::TrackerEntry::NotWorking: - item->setText(COL_STATUS, tr("Not working")); - item->setText(COL_MSG, errorMessage); - break; - case BitTorrent::TrackerEntry::NotContacted: - item->setText(COL_STATUS, tr("Not contacted yet")); - item->setText(COL_MSG, ""); - break; - } - - item->setText(COL_RECEIVED, QString::number(data.numPeers)); -#if LIBTORRENT_VERSION_NUM >= 10000 - item->setText(COL_SEEDS, (entry.nativeEntry().scrape_complete > -1) ? QString::number(entry.nativeEntry().scrape_complete) : tr("N/A")); - item->setText(COL_PEERS, (entry.nativeEntry().scrape_incomplete > -1) ? QString::number(entry.nativeEntry().scrape_incomplete) : tr("N/A")); - item->setText(COL_DOWNLOADED, (entry.nativeEntry().scrape_downloaded > -1) ? QString::number(entry.nativeEntry().scrape_downloaded) : tr("N/A")); -#else - item->setText(COL_SEEDS, tr("N/A")); - item->setText(COL_PEERS, tr("N/A")); - item->setText(COL_DOWNLOADED, tr("N/A")); -#endif - - item->setTextAlignment(COL_TIER, (Qt::AlignRight | Qt::AlignVCenter)); - item->setTextAlignment(COL_RECEIVED, (Qt::AlignRight | Qt::AlignVCenter)); - item->setTextAlignment(COL_SEEDS, (Qt::AlignRight | Qt::AlignVCenter)); - item->setTextAlignment(COL_PEERS, (Qt::AlignRight | Qt::AlignVCenter)); - item->setTextAlignment(COL_DOWNLOADED, (Qt::AlignRight | Qt::AlignVCenter)); - } - // Remove old trackers - foreach (const QString &tracker, oldTrackerURLs) - delete m_trackerItems.take(tracker); -} - -// Ask the user for new trackers and add them to the torrent -void TrackerListWidget::askForTrackers() -{ - BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent(); - if (!torrent) return; - - QList trackers; - foreach (const QString &tracker, TrackersAdditionDialog::askForTrackers(this, torrent)) - trackers << tracker; - - torrent->addTrackers(trackers); -} - -void TrackerListWidget::copyTrackerUrl() -{ - QList selectedTrackerItems = getSelectedTrackerItems(); - if (selectedTrackerItems.isEmpty()) return; - - QStringList urlsToCopy; - foreach (QTreeWidgetItem *item, selectedTrackerItems) { - QString trackerURL = item->data(COL_URL, Qt::DisplayRole).toString(); - qDebug() << QString("Copy: ") + trackerURL; - urlsToCopy << trackerURL; - } - QApplication::clipboard()->setText(urlsToCopy.join('\n')); -} - - -void TrackerListWidget::deleteSelectedTrackers() -{ - BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent(); - if (!torrent) { - clear(); - return; - } - - QList selectedTrackerItems = getSelectedTrackerItems(); - if (selectedTrackerItems.isEmpty()) return; - - QStringList urlsToRemove; - foreach (QTreeWidgetItem *item, selectedTrackerItems) { - QString trackerURL = item->data(COL_URL, Qt::DisplayRole).toString(); - urlsToRemove << trackerURL; - m_trackerItems.remove(trackerURL); - delete item; - } - - // Iterate over the trackers and remove the selected ones - QList remainingTrackers; - QList trackers = torrent->trackers(); - foreach (const BitTorrent::TrackerEntry &entry, trackers) { - if (!urlsToRemove.contains(entry.url())) - remainingTrackers.push_back(entry); - } - - torrent->replaceTrackers(remainingTrackers); - if (!torrent->isPaused()) - torrent->forceReannounce(); -} - -void TrackerListWidget::editSelectedTracker() -{ - BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent(); - if (!torrent) return; - - QList selectedTrackerItems = getSelectedTrackerItems(); - if (selectedTrackerItems.isEmpty()) return; - - // During multi-select only process item selected last - QUrl trackerURL = selectedTrackerItems.last()->text(COL_URL); - - bool ok; - QUrl newTrackerURL = AutoExpandableDialog::getText(this, tr("Tracker editing"), tr("Tracker URL:"), - QLineEdit::Normal, trackerURL.toString(), &ok).trimmed(); - if (!ok) return; - - if (!newTrackerURL.isValid()) { - QMessageBox::warning(this, tr("Tracker editing failed"), tr("The tracker URL entered is invalid.")); - return; - } - if (newTrackerURL == trackerURL) return; - - QList trackers = torrent->trackers(); - bool match = false; - for (int i = 0; i < trackers.size(); ++i) { - BitTorrent::TrackerEntry &entry = trackers[i]; - if (newTrackerURL == QUrl(entry.url())) { - QMessageBox::warning(this, tr("Tracker editing failed"), tr("The tracker URL already exists.")); - return; - } - - if (trackerURL == QUrl(entry.url()) && !match) { - BitTorrent::TrackerEntry newEntry(newTrackerURL.toString()); - newEntry.setTier(entry.tier()); - match = true; - entry = newEntry; - } - } - - torrent->replaceTrackers(trackers); - if (!torrent->isPaused()) - torrent->forceReannounce(); -} - -void TrackerListWidget::reannounceSelected() -{ - QList selItems = selectedItems(); - if (selItems.isEmpty()) return; - - BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent(); - if (!torrent) return; - - QList trackers = torrent->trackers(); - - foreach (QTreeWidgetItem* item, selItems) { - // DHT case - if (item == m_DHTItem) { - torrent->forceDHTAnnounce(); - continue; - } - - // Trackers case - for (int i = 0; i < trackers.size(); ++i) { - if (item->text(COL_URL) == trackers[i].url()) { - torrent->forceReannounce(i); - break; - } - } - } - - loadTrackers(); -} - -void TrackerListWidget::showTrackerListMenu(QPoint) -{ - BitTorrent::TorrentHandle *const torrent = m_properties->getCurrentTorrent(); - if (!torrent) return; - - //QList selected_items = getSelectedTrackerItems(); - QMenu menu; - // Add actions - QAction *addAct = menu.addAction(GuiIconProvider::instance()->getIcon("list-add"), tr("Add a new tracker...")); - QAction *copyAct = nullptr; - QAction *delAct = nullptr; - QAction *editAct = nullptr; - if (!getSelectedTrackerItems().isEmpty()) { - delAct = menu.addAction(GuiIconProvider::instance()->getIcon("list-remove"), tr("Remove tracker")); - copyAct = menu.addAction(GuiIconProvider::instance()->getIcon("edit-copy"), tr("Copy tracker URL")); - editAct = menu.addAction(GuiIconProvider::instance()->getIcon("edit-rename"),tr("Edit selected tracker URL")); - } - QAction *reannounceSelAct = nullptr; - QAction *reannounceAllAct = nullptr; - if (!torrent->isPaused()) { - reannounceSelAct = menu.addAction(GuiIconProvider::instance()->getIcon("view-refresh"), tr("Force reannounce to selected trackers")); - menu.addSeparator(); - reannounceAllAct = menu.addAction(GuiIconProvider::instance()->getIcon("view-refresh"), tr("Force reannounce to all trackers")); - } - QAction *act = menu.exec(QCursor::pos()); - if (act == nullptr) return; - - if (act == addAct) { - askForTrackers(); - return; - } - if (act == copyAct) { - copyTrackerUrl(); - return; - } - if (act == delAct) { - deleteSelectedTrackers(); - return; - } - if (act == reannounceSelAct) { - reannounceSelected(); - return; - } - if (act == reannounceAllAct) { - BitTorrent::TorrentHandle *h = m_properties->getCurrentTorrent(); - h->forceReannounce(); - h->forceDHTAnnounce(); - return; - } - if (act == editAct) { - editSelectedTracker(); - return; - } -} - -void TrackerListWidget::loadSettings() -{ - header()->restoreState(Preferences::instance()->getPropTrackerListState()); -} - -void TrackerListWidget::saveSettings() const -{ - Preferences::instance()->setPropTrackerListState(header()->saveState()); -} - -QStringList TrackerListWidget::headerLabels() -{ - static const QStringList header { - "#" - , tr("URL") - , tr("Status") - , tr("Received") - , tr("Seeds") - , tr("Peers") - , tr("Downloaded") - , tr("Message") - }; - - return header; -} - -int TrackerListWidget::visibleColumnsCount() const -{ - int visibleCols = 0; - for (int i = 0; i < COL_COUNT; ++i) { - if (!isColumnHidden(i)) - ++visibleCols; - } - - return visibleCols; -} - -void TrackerListWidget::displayToggleColumnsMenu(const QPoint &) -{ - QMenu hideshowColumn(this); - hideshowColumn.setTitle(tr("Column visibility")); - for (int i = 0; i < COL_COUNT; ++i) { - QAction *myAct = hideshowColumn.addAction(headerLabels().at(i)); - myAct->setCheckable(true); - myAct->setChecked(!isColumnHidden(i)); - myAct->setData(i); - } - - // Call menu - QAction *act = hideshowColumn.exec(QCursor::pos()); - if (!act) return; - - int col = act->data().toInt(); - Q_ASSERT(visibleColumnsCount() > 0); - if (!isColumnHidden(col) && (visibleColumnsCount() == 1)) - return; - setColumnHidden(col, !isColumnHidden(col)); - if (!isColumnHidden(col) && (columnWidth(col) <= 5)) - resizeColumnToContents(col); - saveSettings(); -} diff -Nru qbittorrent-4.1.3/src/gui/properties/trackerlistwidget.h qbittorrent-3.3.15/src/gui/properties/trackerlistwidget.h --- qbittorrent-4.1.3/src/gui/properties/trackerlistwidget.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/trackerlistwidget.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,106 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef TRACKERLIST_H -#define TRACKERLIST_H - -#include -#include -#include -#include - -#include "propertieswidget.h" - -#define NB_STICKY_ITEM 3 - -namespace BitTorrent -{ - class TorrentHandle; -} - -class TrackerListWidget : public QTreeWidget -{ - Q_OBJECT - Q_DISABLE_COPY(TrackerListWidget) - -public: - enum TrackerListColumn - { - COL_TIER, - COL_URL, - COL_STATUS, - COL_RECEIVED, - COL_SEEDS, - COL_PEERS, - COL_DOWNLOADED, - COL_MSG, - - COL_COUNT - }; - - TrackerListWidget(PropertiesWidget *properties); - ~TrackerListWidget(); - - int visibleColumnsCount() const; - -public slots: - void setRowColor(int row, QColor color); - - void moveSelectionUp(); - void moveSelectionDown(); - - void clear(); - void loadStickyItems(BitTorrent::TorrentHandle *const torrent); - void loadTrackers(); - void askForTrackers(); - void copyTrackerUrl(); - void reannounceSelected(); - void deleteSelectedTrackers(); - void editSelectedTracker(); - void showTrackerListMenu(QPoint); - void displayToggleColumnsMenu(const QPoint &); - void loadSettings(); - void saveSettings() const; - -protected: - QList getSelectedTrackerItems() const; - -private: - PropertiesWidget *m_properties; - QHash m_trackerItems; - QTreeWidgetItem *m_DHTItem; - QTreeWidgetItem *m_PEXItem; - QTreeWidgetItem *m_LSDItem; - QShortcut *m_editHotkey; - QShortcut *m_deleteHotkey; - QShortcut *m_copyHotkey; - - static QStringList headerLabels(); -}; - -#endif // TRACKERLIST_H diff -Nru qbittorrent-4.1.3/src/gui/properties/trackersadditiondialog.cpp qbittorrent-3.3.15/src/gui/properties/trackersadditiondialog.cpp --- qbittorrent-4.1.3/src/gui/properties/trackersadditiondialog.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/trackersadditiondialog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,135 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "trackersadditiondialog.h" - -#include -#include -#include - -#include "base/bittorrent/torrenthandle.h" -#include "base/bittorrent/trackerentry.h" -#include "base/net/downloadhandler.h" -#include "base/net/downloadmanager.h" -#include "base/utils/fs.h" -#include "base/utils/misc.h" -#include "guiiconprovider.h" -#include "ui_trackersadditiondialog.h" - -TrackersAdditionDialog::TrackersAdditionDialog(QWidget *parent, BitTorrent::TorrentHandle *const torrent) - : QDialog(parent) - , m_ui(new Ui::TrackersAdditionDialog()) - , m_torrent(torrent) -{ - m_ui->setupUi(this); - // Icons - m_ui->uTorrentListButton->setIcon(GuiIconProvider::instance()->getIcon("download")); -} - -TrackersAdditionDialog::~TrackersAdditionDialog() -{ - delete m_ui; -} - -QStringList TrackersAdditionDialog::newTrackers() const -{ - QStringList cleanTrackers; - foreach (QString url, m_ui->textEditTrackersList->toPlainText().split('\n')) { - url = url.trimmed(); - if (!url.isEmpty()) - cleanTrackers << url; - } - return cleanTrackers; -} - -void TrackersAdditionDialog::on_uTorrentListButton_clicked() -{ - m_ui->uTorrentListButton->setEnabled(false); - Net::DownloadHandler *handler = Net::DownloadManager::instance()->download({m_ui->lineEditListURL->text()}); - connect(handler, static_cast(&Net::DownloadHandler::downloadFinished) - , this, &TrackersAdditionDialog::parseUTorrentList); - connect(handler, &Net::DownloadHandler::downloadFailed, this, &TrackersAdditionDialog::getTrackerError); - // Just to show that it takes times - setCursor(Qt::WaitCursor); -} - -void TrackersAdditionDialog::parseUTorrentList(const QString &, const QByteArray &data) -{ - // Load from torrent handle - QList existingTrackers = m_torrent->trackers(); - // Load from current user list - QStringList tmp = m_ui->textEditTrackersList->toPlainText().split('\n'); - foreach (const QString &userURL, tmp) { - BitTorrent::TrackerEntry userTracker(userURL); - if (!existingTrackers.contains(userTracker)) - existingTrackers << userTracker; - } - - // Add new trackers to the list - if (!m_ui->textEditTrackersList->toPlainText().isEmpty() && !m_ui->textEditTrackersList->toPlainText().endsWith('\n')) - m_ui->textEditTrackersList->insertPlainText("\n"); - int nb = 0; - QBuffer buffer; - buffer.setData(data); - buffer.open(QBuffer::ReadOnly); - while (!buffer.atEnd()) { - const QString line = buffer.readLine().trimmed(); - if (line.isEmpty()) continue; - - BitTorrent::TrackerEntry newTracker(line); - if (!existingTrackers.contains(newTracker)) { - m_ui->textEditTrackersList->insertPlainText(line + '\n'); - ++nb; - } - } - - // To restore the cursor ... - setCursor(Qt::ArrowCursor); - m_ui->uTorrentListButton->setEnabled(true); - // Display information message if necessary - if (nb == 0) - QMessageBox::information(this, tr("No change"), tr("No additional trackers were found."), QMessageBox::Ok); -} - -void TrackersAdditionDialog::getTrackerError(const QString &, const QString &error) -{ - // To restore the cursor ... - setCursor(Qt::ArrowCursor); - m_ui->uTorrentListButton->setEnabled(true); - QMessageBox::warning(this, tr("Download error"), tr("The trackers list could not be downloaded, reason: %1").arg(error), QMessageBox::Ok); -} - -QStringList TrackersAdditionDialog::askForTrackers(QWidget *parent, BitTorrent::TorrentHandle *const torrent) -{ - QStringList trackers; - TrackersAdditionDialog dlg(parent, torrent); - if (dlg.exec() == QDialog::Accepted) - return dlg.newTrackers(); - - return trackers; -} diff -Nru qbittorrent-4.1.3/src/gui/properties/trackersadditiondialog.h qbittorrent-3.3.15/src/gui/properties/trackersadditiondialog.h --- qbittorrent-4.1.3/src/gui/properties/trackersadditiondialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/trackersadditiondialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,68 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef TRACKERSADDITION_H -#define TRACKERSADDITION_H - -#include - -class QString; -class QStringList; - -namespace BitTorrent -{ - class TorrentHandle; -} - -namespace Ui -{ - class TrackersAdditionDialog; -} - -class TrackersAdditionDialog : public QDialog -{ - Q_OBJECT - -public: - TrackersAdditionDialog(QWidget *parent, BitTorrent::TorrentHandle *const torrent); - ~TrackersAdditionDialog(); - - QStringList newTrackers() const; - static QStringList askForTrackers(QWidget *parent, BitTorrent::TorrentHandle *const torrent); - -public slots: - void on_uTorrentListButton_clicked(); - void parseUTorrentList(const QString &, const QByteArray &data); - void getTrackerError(const QString &, const QString &error); - -private: - Ui::TrackersAdditionDialog *m_ui; - BitTorrent::TorrentHandle *const m_torrent; -}; - -#endif // TRACKERSADDITION_H diff -Nru qbittorrent-4.1.3/src/gui/properties/trackersadditiondialog.ui qbittorrent-3.3.15/src/gui/properties/trackersadditiondialog.ui --- qbittorrent-4.1.3/src/gui/properties/trackersadditiondialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/trackersadditiondialog.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,98 +0,0 @@ - - - TrackersAdditionDialog - - - - 0 - 0 - 367 - 274 - - - - Trackers addition dialog - - - - - - List of trackers to add (one per line): - - - - - - - QTextEdit::NoWrap - - - false - - - - - - - µTorrent compatible list URL: - - - - - - - - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - buttonBox - accepted() - TrackersAdditionDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - TrackersAdditionDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff -Nru qbittorrent-4.1.3/src/gui/properties/trackersadditiondlg.cpp qbittorrent-3.3.15/src/gui/properties/trackersadditiondlg.cpp --- qbittorrent-4.1.3/src/gui/properties/trackersadditiondlg.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/trackersadditiondlg.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,143 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ +#include "trackersadditiondlg.h" + +#include +#include +#include +#include + +#include "base/utils/misc.h" +#include "base/utils/fs.h" +#include "base/net/downloadmanager.h" +#include "base/net/downloadhandler.h" +#include "base/bittorrent/trackerentry.h" +#include "base/bittorrent/torrenthandle.h" +#include "guiiconprovider.h" +#include "ui_trackersadditiondlg.h" + +TrackersAdditionDlg::TrackersAdditionDlg(BitTorrent::TorrentHandle *const torrent, QWidget *parent) + : QDialog(parent) + , m_ui(new Ui::TrackersAdditionDlg()) + , m_torrent(torrent) +{ + m_ui->setupUi(this); + // Icons + m_ui->uTorrentListButton->setIcon(GuiIconProvider::instance()->getIcon("download")); +} + +TrackersAdditionDlg::~TrackersAdditionDlg() +{ + delete m_ui; +} + +QStringList TrackersAdditionDlg::newTrackers() const +{ + QStringList cleanTrackers; + foreach (QString url, m_ui->trackers_list->toPlainText().split("\n")) { + url = url.trimmed(); + if (!url.isEmpty()) + cleanTrackers << url; + } + return cleanTrackers; +} + +void TrackersAdditionDlg::on_uTorrentListButton_clicked() +{ + m_ui->uTorrentListButton->setEnabled(false); + Net::DownloadHandler *handler = Net::DownloadManager::instance()->downloadUrl(m_ui->list_url->text(), true); + connect(handler, SIGNAL(downloadFinished(QString, QString)), this, SLOT(parseUTorrentList(QString, QString))); + connect(handler, SIGNAL(downloadFailed(QString, QString)), this, SLOT(getTrackerError(QString, QString))); + //Just to show that it takes times + setCursor(Qt::WaitCursor); +} + +void TrackersAdditionDlg::parseUTorrentList(const QString &, const QString &path) +{ + QFile list_file(path); + if (!list_file.open(QFile::ReadOnly)) { + QMessageBox::warning(this, tr("I/O Error"), tr("Error while trying to open the downloaded file."), QMessageBox::Ok); + setCursor(Qt::ArrowCursor); + m_ui->uTorrentListButton->setEnabled(true); + Utils::Fs::forceRemove(path); + return; + } + + // Load from torrent handle + QList existingTrackers = m_torrent->trackers(); + // Load from current user list + QStringList tmp = m_ui->trackers_list->toPlainText().split("\n"); + foreach (const QString &user_url, tmp) { + BitTorrent::TrackerEntry userTracker(user_url); + if (!existingTrackers.contains(userTracker)) + existingTrackers << userTracker; + } + + // Add new trackers to the list + if (!m_ui->trackers_list->toPlainText().isEmpty() && !m_ui->trackers_list->toPlainText().endsWith("\n")) + m_ui->trackers_list->insertPlainText("\n"); + int nb = 0; + while (!list_file.atEnd()) { + const QByteArray line = list_file.readLine().trimmed(); + if (line.isEmpty()) continue; + BitTorrent::TrackerEntry newTracker(line); + if (!existingTrackers.contains(newTracker)) { + m_ui->trackers_list->insertPlainText(line + "\n"); + ++nb; + } + } + // Clean up + list_file.close(); + Utils::Fs::forceRemove(path); + //To restore the cursor ... + setCursor(Qt::ArrowCursor); + m_ui->uTorrentListButton->setEnabled(true); + // Display information message if necessary + if (nb == 0) + QMessageBox::information(this, tr("No change"), tr("No additional trackers were found."), QMessageBox::Ok); +} + +void TrackersAdditionDlg::getTrackerError(const QString &, const QString &error) +{ + //To restore the cursor ... + setCursor(Qt::ArrowCursor); + m_ui->uTorrentListButton->setEnabled(true); + QMessageBox::warning(this, tr("Download error"), tr("The trackers list could not be downloaded, reason: %1").arg(error), QMessageBox::Ok); +} + +QStringList TrackersAdditionDlg::askForTrackers(BitTorrent::TorrentHandle *const torrent) +{ + QStringList trackers; + TrackersAdditionDlg dlg(torrent); + if (dlg.exec() == QDialog::Accepted) + return dlg.newTrackers(); + + return trackers; +} diff -Nru qbittorrent-4.1.3/src/gui/properties/trackersadditiondlg.h qbittorrent-3.3.15/src/gui/properties/trackersadditiondlg.h --- qbittorrent-4.1.3/src/gui/properties/trackersadditiondlg.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/trackersadditiondlg.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,70 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef TRACKERSADDITION_H +#define TRACKERSADDITION_H + +#include + +class QString; +class QStringList; + +namespace BitTorrent +{ + class TorrentHandle; +} + +namespace Ui +{ + class TrackersAdditionDlg; +} + +class TrackersAdditionDlg : public QDialog +{ + Q_OBJECT + +public: + TrackersAdditionDlg(BitTorrent::TorrentHandle *const torrent, QWidget *parent = 0); + ~TrackersAdditionDlg(); + + QStringList newTrackers() const; + static QStringList askForTrackers(BitTorrent::TorrentHandle *const torrent); + +public slots: + void on_uTorrentListButton_clicked(); + void parseUTorrentList(const QString &, const QString &path); + void getTrackerError(const QString &, const QString &error); + +private: + Ui::TrackersAdditionDlg *m_ui; + BitTorrent::TorrentHandle *const m_torrent; +}; + +#endif diff -Nru qbittorrent-4.1.3/src/gui/properties/trackersadditiondlg.ui qbittorrent-3.3.15/src/gui/properties/trackersadditiondlg.ui --- qbittorrent-4.1.3/src/gui/properties/trackersadditiondlg.ui 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/properties/trackersadditiondlg.ui 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,121 @@ + + + TrackersAdditionDlg + + + + 0 + 0 + 367 + 274 + + + + Trackers addition dialog + + + + + + List of trackers to add (one per line): + + + + + + + QTextEdit::NoWrap + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p></body></html> + + + false + + + + + + + µTorrent compatible list URL: + + + + + + + + + + + + + 31 + 31 + + + + + 31 + 31 + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + TrackersAdditionDlg + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + TrackersAdditionDlg + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff -Nru qbittorrent-4.1.3/src/gui/qtnotify/CMakeLists.txt qbittorrent-3.3.15/src/gui/qtnotify/CMakeLists.txt --- qbittorrent-4.1.3/src/gui/qtnotify/CMakeLists.txt 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/qtnotify/CMakeLists.txt 2017-08-03 20:30:10.000000000 +0000 @@ -1,8 +1,11 @@ -add_library(qbt_qtnotify STATIC +set(QBT_QTNOTIFY_SOURCES notifications.cpp +) + +set(QBT_QTNOTIFY_HEADERS notifications.h ) +add_library(qbt_qtnotify STATIC ${QBT_QTNOTIFY_SOURCES} ${QBT_QTNOTIFY_HEADERS}) set_target_properties(qbt_qtnotify PROPERTIES AUTOUIC False AUTORCC False) -target_link_libraries(qbt_qtnotify PUBLIC Qt5::DBus) -target_include_directories(qbt_qtnotify PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_qt_components(qbt_qtnotify DBus) diff -Nru qbittorrent-4.1.3/src/gui/qtnotify/notifications.h qbittorrent-3.3.15/src/gui/qtnotify/notifications.h --- qbittorrent-4.1.3/src/gui/qtnotify/notifications.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/qtnotify/notifications.h 2017-08-03 20:30:10.000000000 +0000 @@ -31,7 +31,7 @@ { return "org.freedesktop.Notifications"; } public: - OrgFreedesktopNotificationsInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); + OrgFreedesktopNotificationsInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); ~OrgFreedesktopNotificationsInterface(); diff -Nru qbittorrent-4.1.3/src/gui/raisedmessagebox.cpp qbittorrent-3.3.15/src/gui/raisedmessagebox.cpp --- qbittorrent-4.1.3/src/gui/raisedmessagebox.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/raisedmessagebox.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,69 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2014 sledgehammer999 - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "raisedmessagebox.h" - -RaisedMessageBox::RaisedMessageBox(QMessageBox::Icon icon, const QString &title, const QString &text, - QMessageBox::StandardButtons buttons, QWidget *parent, Qt::WindowFlags f) - : QMessageBox(icon, title, text, buttons, parent, f) -{ -} - -QMessageBox::StandardButton RaisedMessageBox::impl(const QMessageBox::Icon &icon, QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton) -{ - RaisedMessageBox dlg(icon, title, text, buttons, parent); - dlg.setDefaultButton(defaultButton); - return static_cast(dlg.exec()); -} - -QMessageBox::StandardButton RaisedMessageBox::critical(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton) -{ - return impl(Critical, parent, title, text, buttons, defaultButton); -} - -QMessageBox::StandardButton RaisedMessageBox::information(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton) -{ - return impl(Information, parent, title, text, buttons, defaultButton); -} - -QMessageBox::StandardButton RaisedMessageBox::question(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton) -{ - return impl(Question, parent, title, text, buttons, defaultButton); -} - -QMessageBox::StandardButton RaisedMessageBox::warning(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton) -{ - return impl(Warning, parent, title, text, buttons, defaultButton); -} - -void RaisedMessageBox::showEvent(QShowEvent *event) -{ - QMessageBox::showEvent(event); - activateWindow(); - raise(); -} diff -Nru qbittorrent-4.1.3/src/gui/raisedmessagebox.h qbittorrent-3.3.15/src/gui/raisedmessagebox.h --- qbittorrent-4.1.3/src/gui/raisedmessagebox.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/raisedmessagebox.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2014 sledgehammer999 - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef RAISEDMESSAGEBOX_H -#define RAISEDMESSAGEBOX_H - -#include - -class RaisedMessageBox : public QMessageBox -{ - Q_OBJECT - -public: - static QMessageBox::StandardButton critical(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = QMessageBox::Ok, QMessageBox::StandardButton defaultButton = QMessageBox::NoButton); - static QMessageBox::StandardButton information(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = QMessageBox::Ok, QMessageBox::StandardButton defaultButton = QMessageBox::NoButton); - static QMessageBox::StandardButton question(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = QMessageBox::Ok, QMessageBox::StandardButton defaultButton = QMessageBox::NoButton); - static QMessageBox::StandardButton warning(QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = QMessageBox::Ok, QMessageBox::StandardButton defaultButton = QMessageBox::NoButton); - -protected: - void showEvent(QShowEvent *event) override; - -private: - RaisedMessageBox(QMessageBox::Icon icon, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = NoButton, QWidget *parent = nullptr, Qt::WindowFlags f = Qt::Dialog|Qt::MSWindowsFixedSizeDialogHint); - RaisedMessageBox(); - RaisedMessageBox(RaisedMessageBox const&); - void operator=(RaisedMessageBox const&); - - static QMessageBox::StandardButton impl(const QMessageBox::Icon &icon, QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons = QMessageBox::Ok, QMessageBox::StandardButton defaultButton = QMessageBox::NoButton); -}; - -#endif // RAISEDMESSAGEBOX_H diff -Nru qbittorrent-4.1.3/src/gui/rss/articlelistwidget.cpp qbittorrent-3.3.15/src/gui/rss/articlelistwidget.cpp --- qbittorrent-4.1.3/src/gui/rss/articlelistwidget.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/rss/articlelistwidget.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,133 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "articlelistwidget.h" - -#include - -#include "base/rss/rss_article.h" -#include "base/rss/rss_item.h" - -ArticleListWidget::ArticleListWidget(QWidget *parent) - : QListWidget(parent) -{ - setContextMenuPolicy(Qt::CustomContextMenu); - setSelectionMode(QAbstractItemView::ExtendedSelection); - - checkInvariant(); -} - -RSS::Article *ArticleListWidget::getRSSArticle(QListWidgetItem *item) const -{ - Q_ASSERT(item); - return reinterpret_cast(item->data(Qt::UserRole).value()); -} - -QListWidgetItem *ArticleListWidget::mapRSSArticle(RSS::Article *rssArticle) const -{ - return m_rssArticleToListItemMapping.value(rssArticle); -} - -void ArticleListWidget::setRSSItem(RSS::Item *rssItem, bool unreadOnly) -{ - // Clear the list first - clear(); - m_rssArticleToListItemMapping.clear(); - if (m_rssItem) - m_rssItem->disconnect(this); - - m_unreadOnly = unreadOnly; - m_rssItem = rssItem; - if (m_rssItem) { - connect(m_rssItem, &RSS::Item::newArticle, this, &ArticleListWidget::handleArticleAdded); - connect(m_rssItem, &RSS::Item::articleRead, this, &ArticleListWidget::handleArticleRead); - connect(m_rssItem, &RSS::Item::articleAboutToBeRemoved, this, &ArticleListWidget::handleArticleAboutToBeRemoved); - - foreach (auto article, rssItem->articles()) { - if (!(m_unreadOnly && article->isRead())) { - auto item = createItem(article); - addItem(item); - m_rssArticleToListItemMapping.insert(article, item); - } - } - } - - checkInvariant(); -} - -void ArticleListWidget::handleArticleAdded(RSS::Article *rssArticle) -{ - if (!(m_unreadOnly && rssArticle->isRead())) { - auto item = createItem(rssArticle); - insertItem(0, item); - m_rssArticleToListItemMapping.insert(rssArticle, item); - } - - checkInvariant(); -} - -void ArticleListWidget::handleArticleRead(RSS::Article *rssArticle) -{ - auto item = mapRSSArticle(rssArticle); - if (!item) return; - - item->setData(Qt::ForegroundRole, QPalette().color(QPalette::Inactive, QPalette::WindowText)); - item->setData(Qt::DecorationRole, QIcon(":/icons/sphere.png")); - - checkInvariant(); -} - -void ArticleListWidget::handleArticleAboutToBeRemoved(RSS::Article *rssArticle) -{ - delete m_rssArticleToListItemMapping.take(rssArticle); - checkInvariant(); -} - -void ArticleListWidget::checkInvariant() const -{ - Q_ASSERT(count() == m_rssArticleToListItemMapping.count()); -} - -QListWidgetItem *ArticleListWidget::createItem(RSS::Article *article) const -{ - Q_ASSERT(article); - QListWidgetItem *item = new QListWidgetItem; - - item->setData(Qt::DisplayRole, article->title()); - item->setData(Qt::UserRole, reinterpret_cast(article)); - if (article->isRead()) { - item->setData(Qt::ForegroundRole, QPalette().color(QPalette::Inactive, QPalette::WindowText)); - item->setData(Qt::DecorationRole, QIcon(":/icons/sphere.png")); - } - else { - item->setData(Qt::ForegroundRole, QPalette().color(QPalette::Active, QPalette::Link)); - item->setData(Qt::DecorationRole, QIcon(":/icons/sphere2.png")); - } - - return item; -} diff -Nru qbittorrent-4.1.3/src/gui/rss/articlelistwidget.h qbittorrent-3.3.15/src/gui/rss/articlelistwidget.h --- qbittorrent-4.1.3/src/gui/rss/articlelistwidget.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/rss/articlelistwidget.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef ARTICLELISTWIDGET_H -#define ARTICLELISTWIDGET_H - -#include -#include - -namespace RSS -{ - class Article; - class Item; -} - -class ArticleListWidget : public QListWidget -{ - Q_OBJECT - -public: - explicit ArticleListWidget(QWidget *parent); - - RSS::Article *getRSSArticle(QListWidgetItem *item) const; - QListWidgetItem *mapRSSArticle(RSS::Article *rssArticle) const; - - void setRSSItem(RSS::Item *rssItem, bool unreadOnly = false); - -private slots: - void handleArticleAdded(RSS::Article *rssArticle); - void handleArticleRead(RSS::Article *rssArticle); - void handleArticleAboutToBeRemoved(RSS::Article *rssArticle); - -private: - void checkInvariant() const; - QListWidgetItem *createItem(RSS::Article *article) const; - - RSS::Item *m_rssItem = nullptr; - bool m_unreadOnly = false; - QHash m_rssArticleToListItemMapping; -}; - -#endif // ARTICLELISTWIDGET_H diff -Nru qbittorrent-4.1.3/src/gui/rss/automatedrssdownloader.cpp qbittorrent-3.3.15/src/gui/rss/automatedrssdownloader.cpp --- qbittorrent-4.1.3/src/gui/rss/automatedrssdownloader.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/rss/automatedrssdownloader.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,7 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * Copyright (C) 2010 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2010 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -25,198 +24,221 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#include "automatedrssdownloader.h" - -#include -#include +#include #include +#include #include -#include -#include -#include -#include -#include -#include +#include -#include "base/bittorrent/session.h" #include "base/preferences.h" -#include "base/rss/rss_article.h" -#include "base/rss/rss_autodownloader.h" -#include "base/rss/rss_feed.h" -#include "base/rss/rss_folder.h" -#include "base/rss/rss_session.h" +#include "base/bittorrent/session.h" +#include "base/rss/rssdownloadrulelist.h" +#include "base/rss/rssmanager.h" +#include "base/rss/rssfolder.h" +#include "base/rss/rssfeed.h" #include "base/utils/fs.h" #include "base/utils/string.h" -#include "autoexpandabledialog.h" #include "guiiconprovider.h" +#include "autoexpandabledialog.h" #include "ui_automatedrssdownloader.h" -#include "utils.h" - -const QString EXT_JSON {QStringLiteral(".json")}; -const QString EXT_LEGACY {QStringLiteral(".rssrules")}; +#include "automatedrssdownloader.h" -AutomatedRssDownloader::AutomatedRssDownloader(QWidget *parent) - : QDialog(parent) - , m_formatFilterJSON(QString("%1 (*%2)").arg(tr("Rules"), EXT_JSON)) - , m_formatFilterLegacy(QString("%1 (*%2)").arg(tr("Rules (legacy)"), EXT_LEGACY)) - , m_ui(new Ui::AutomatedRssDownloader) - , m_currentRuleItem(nullptr) +AutomatedRssDownloader::AutomatedRssDownloader(const QWeakPointer &manager, QWidget *parent) + : QDialog(parent), + ui(new Ui::AutomatedRssDownloader), + m_manager(manager), m_editedRule(0) { - m_ui->setupUi(this); + ui->setupUi(this); // Icons - m_ui->removeRuleBtn->setIcon(GuiIconProvider::instance()->getIcon("list-remove")); - m_ui->addRuleBtn->setIcon(GuiIconProvider::instance()->getIcon("list-add")); + ui->removeRuleBtn->setIcon(GuiIconProvider::instance()->getIcon("list-remove")); + ui->addRuleBtn->setIcon(GuiIconProvider::instance()->getIcon("list-add")); // Ui Settings - m_ui->listRules->setSortingEnabled(true); - m_ui->listRules->setSelectionMode(QAbstractItemView::ExtendedSelection); - m_ui->treeMatchingArticles->setSortingEnabled(true); - m_ui->treeMatchingArticles->sortByColumn(0, Qt::AscendingOrder); - m_ui->hsplitter->setCollapsible(0, false); - m_ui->hsplitter->setCollapsible(1, false); - m_ui->hsplitter->setCollapsible(2, true); // Only the preview list is collapsible - - connect(m_ui->checkRegex, &QAbstractButton::toggled, this, &AutomatedRssDownloader::updateFieldsToolTips); - connect(m_ui->listRules, &QWidget::customContextMenuRequested, this, &AutomatedRssDownloader::displayRulesListMenu); - - m_episodeRegex = new QRegularExpression("^(^\\d{1,4}x(\\d{1,4}(-(\\d{1,4})?)?;){1,}){1,1}" - , QRegularExpression::CaseInsensitiveOption); + ui->listRules->setSortingEnabled(true); + ui->listRules->setSelectionMode(QAbstractItemView::ExtendedSelection); + ui->treeMatchingArticles->setSortingEnabled(true); + ui->treeMatchingArticles->sortByColumn(0, Qt::AscendingOrder); + ui->hsplitter->setCollapsible(0, false); + ui->hsplitter->setCollapsible(1, false); + ui->hsplitter->setCollapsible(2, true); // Only the preview list is collapsible + bool ok; Q_UNUSED(ok); + ok = connect(ui->checkRegex, SIGNAL(toggled(bool)), SLOT(updateFieldsToolTips(bool))); + Q_ASSERT(ok); + ok = connect(ui->listRules, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayRulesListMenu(const QPoint&))); + Q_ASSERT(ok); + m_ruleList = manager.toStrongRef()->downloadRules(); + m_editableRuleList = new Rss::DownloadRuleList; // Read rule list from disk + m_episodeRegex = new QRegExp("^(^\\d{1,4}x(\\d{1,4}(-(\\d{1,4})?)?;){1,}){1,1}", + Qt::CaseInsensitive); QString tip = "

" + tr("Matches articles based on episode filter.") + "

" + tr("Example: ") + "1x2;8-15;5;30-;" + tr(" will match 2, 5, 8 through 15, 30 and onward episodes of season one", "example X will match") + "

"; tip += "

" + tr("Episode filter rules: ") + "

  • " + tr("Season number is a mandatory non-zero value") + "
  • " + "
  • " + tr("Episode number is a mandatory positive value") + "
  • " + "
  • " + tr("Filter must end with semicolon") + "
  • " + "
  • " + tr("Three range types for episodes are supported: ") + "
  • " + "
    • " - + "
    • " + tr("Single number: 1x25; matches episode 25 of season one") + "
    • " + "
    • " + tr("Single number: 1x25; matches episode 25 of season one") + "
    • " + "
    • " + tr("Normal range: 1x25-40; matches episodes 25 through 40 of season one") + "
    • " + "
    • " + tr("Infinite range: 1x25-; matches episodes 25 and upward of season one, and all episodes of later seasons") + "
    • " + "
"; - m_ui->lineEFilter->setToolTip(tip); - + ui->lineEFilter->setToolTip(tip); initCategoryCombobox(); loadSettings(); - - connect(RSS::AutoDownloader::instance(), &RSS::AutoDownloader::ruleAdded, this, &AutomatedRssDownloader::handleRuleAdded); - connect(RSS::AutoDownloader::instance(), &RSS::AutoDownloader::ruleRenamed, this, &AutomatedRssDownloader::handleRuleRenamed); - connect(RSS::AutoDownloader::instance(), &RSS::AutoDownloader::ruleChanged, this, &AutomatedRssDownloader::handleRuleChanged); - connect(RSS::AutoDownloader::instance(), &RSS::AutoDownloader::ruleAboutToBeRemoved, this, &AutomatedRssDownloader::handleRuleAboutToBeRemoved); - // Update matching articles when necessary - connect(m_ui->lineContains, &QLineEdit::textEdited, this, &AutomatedRssDownloader::handleRuleDefinitionChanged); - connect(m_ui->lineContains, &QLineEdit::textEdited, this, &AutomatedRssDownloader::updateMustLineValidity); - connect(m_ui->lineNotContains, &QLineEdit::textEdited, this, &AutomatedRssDownloader::handleRuleDefinitionChanged); - connect(m_ui->lineNotContains, &QLineEdit::textEdited, this, &AutomatedRssDownloader::updateMustNotLineValidity); - connect(m_ui->lineEFilter, &QLineEdit::textEdited, this, &AutomatedRssDownloader::handleRuleDefinitionChanged); - connect(m_ui->lineEFilter, &QLineEdit::textEdited, this, &AutomatedRssDownloader::updateEpisodeFilterValidity); - connect(m_ui->checkRegex, &QCheckBox::stateChanged, this, &AutomatedRssDownloader::handleRuleDefinitionChanged); - connect(m_ui->checkRegex, &QCheckBox::stateChanged, this, &AutomatedRssDownloader::updateMustLineValidity); - connect(m_ui->checkRegex, &QCheckBox::stateChanged, this, &AutomatedRssDownloader::updateMustNotLineValidity); - connect(m_ui->checkSmart, &QCheckBox::stateChanged, this, &AutomatedRssDownloader::handleRuleDefinitionChanged); - connect(m_ui->spinIgnorePeriod, static_cast(&QSpinBox::valueChanged) - , this, &AutomatedRssDownloader::handleRuleDefinitionChanged); - - connect(m_ui->listFeeds, &QListWidget::itemChanged, this, &AutomatedRssDownloader::handleFeedCheckStateChange); - - connect(m_ui->listRules, &QListWidget::itemSelectionChanged, this, &AutomatedRssDownloader::updateRuleDefinitionBox); - connect(m_ui->listRules, &QListWidget::itemChanged, this, &AutomatedRssDownloader::handleRuleCheckStateChange); - - m_editHotkey = new QShortcut(Qt::Key_F2, m_ui->listRules, nullptr, nullptr, Qt::WidgetShortcut); - connect(m_editHotkey, &QShortcut::activated, this, &AutomatedRssDownloader::renameSelectedRule); - connect(m_ui->listRules, &QAbstractItemView::doubleClicked, this, &AutomatedRssDownloader::renameSelectedRule); - - m_deleteHotkey = new QShortcut(QKeySequence::Delete, m_ui->listRules, nullptr, nullptr, Qt::WidgetShortcut); - connect(m_deleteHotkey, &QShortcut::activated, this, &AutomatedRssDownloader::on_removeRuleBtn_clicked); - - loadFeedList(); - - m_ui->listRules->blockSignals(true); - foreach (const RSS::AutoDownloadRule &rule, RSS::AutoDownloader::instance()->rules()) - createRuleItem(rule); - m_ui->listRules->blockSignals(false); + ok = connect(ui->lineContains, SIGNAL(textEdited(QString)), SLOT(updateMatchingArticles())); + Q_ASSERT(ok); + ok = connect(ui->lineContains, SIGNAL(textEdited(QString)), SLOT(updateMustLineValidity())); + Q_ASSERT(ok); + ok = connect(ui->lineNotContains, SIGNAL(textEdited(QString)), SLOT(updateMatchingArticles())); + Q_ASSERT(ok); + ok = connect(ui->lineNotContains, SIGNAL(textEdited(QString)), SLOT(updateMustNotLineValidity())); + Q_ASSERT(ok); + ok = connect(ui->lineEFilter, SIGNAL(textEdited(QString)), SLOT(updateEpisodeFilterValidity())); + Q_ASSERT(ok); + ok = connect(ui->checkRegex, SIGNAL(stateChanged(int)), SLOT(updateMatchingArticles())); + Q_ASSERT(ok); + ok = connect(ui->checkRegex, SIGNAL(stateChanged(int)), SLOT(updateMustLineValidity())); + Q_ASSERT(ok); + ok = connect(ui->checkRegex, SIGNAL(stateChanged(int)), SLOT(updateMustNotLineValidity())); + Q_ASSERT(ok); + ok = connect(this, SIGNAL(finished(int)), SLOT(onFinished(int))); + Q_ASSERT(ok); + ok = connect(ui->lineEFilter, SIGNAL(textEdited(QString)), SLOT(updateMatchingArticles())); + Q_ASSERT(ok); + editHotkey = new QShortcut(Qt::Key_F2, ui->listRules, 0, 0, Qt::WidgetShortcut); + ok = connect(editHotkey, SIGNAL(activated()), SLOT(renameSelectedRule())); + Q_ASSERT(ok); + ok = connect(ui->listRules, SIGNAL(doubleClicked(QModelIndex)), SLOT(renameSelectedRule())); + Q_ASSERT(ok); + deleteHotkey = new QShortcut(QKeySequence::Delete, ui->listRules, 0, 0, Qt::WidgetShortcut); + ok = connect(deleteHotkey, SIGNAL(activated()), SLOT(on_removeRuleBtn_clicked())); + Q_ASSERT(ok); updateRuleDefinitionBox(); - - if (RSS::AutoDownloader::instance()->isProcessingEnabled()) - m_ui->labelWarn->hide(); - connect(RSS::AutoDownloader::instance(), &RSS::AutoDownloader::processingStateChanged - , this, &AutomatedRssDownloader::handleProcessingStateChanged); } AutomatedRssDownloader::~AutomatedRssDownloader() { - // Save current item on exit - saveEditedRule(); - saveSettings(); - - delete m_editHotkey; - delete m_deleteHotkey; - delete m_ui; + qDebug() << Q_FUNC_INFO; + delete editHotkey; + delete deleteHotkey; + delete ui; + delete m_editableRuleList; delete m_episodeRegex; } +void AutomatedRssDownloader::connectRuleFeedSlots() +{ + qDebug() << Q_FUNC_INFO << "Connecting rule and feed slots"; + connect(ui->listRules, SIGNAL(itemSelectionChanged()), this, SLOT(updateRuleDefinitionBox()), Qt::UniqueConnection); + connect(ui->listRules, SIGNAL(itemChanged(QListWidgetItem *)), this, SLOT(handleRuleCheckStateChange(QListWidgetItem *)), Qt::UniqueConnection); + connect(ui->listFeeds, SIGNAL(itemChanged(QListWidgetItem *)), this, SLOT(handleFeedCheckStateChange(QListWidgetItem *)), Qt::UniqueConnection); +} + +void AutomatedRssDownloader::disconnectRuleFeedSlots() +{ + qDebug() << Q_FUNC_INFO << "Disconnecting rule and feed slots"; + disconnect(ui->listRules, SIGNAL(itemSelectionChanged()), this, SLOT(updateRuleDefinitionBox())); + disconnect(ui->listRules, SIGNAL(itemChanged(QListWidgetItem *)), this, SLOT(handleRuleCheckStateChange(QListWidgetItem *))); + disconnect(ui->listFeeds, SIGNAL(itemChanged(QListWidgetItem *)), this, SLOT(handleFeedCheckStateChange(QListWidgetItem *))); +} + void AutomatedRssDownloader::loadSettings() { + // load dialog geometry const Preferences *const pref = Preferences::instance(); - Utils::Gui::resize(this, pref->getRssGeometrySize()); - m_ui->hsplitter->restoreState(pref->getRssHSplitterSizes()); + restoreGeometry(pref->getRssGeometry()); + ui->checkEnableDownloader->setChecked(pref->isRssDownloadingEnabled()); + ui->hsplitter->restoreState(pref->getRssHSplitterSizes()); + // Display download rules + loadRulesList(); } void AutomatedRssDownloader::saveSettings() { + Preferences::instance()->setRssDownloadingEnabled(ui->checkEnableDownloader->isChecked()); + // Save dialog geometry Preferences *const pref = Preferences::instance(); - pref->setRssGeometrySize(size()); - pref->setRssHSplitterSizes(m_ui->hsplitter->saveState()); + pref->setRssGeometry(saveGeometry()); + pref->setRssHSplitterSizes(ui->hsplitter->saveState()); } -void AutomatedRssDownloader::createRuleItem(const RSS::AutoDownloadRule &rule) +void AutomatedRssDownloader::loadRulesList() { - QListWidgetItem *item = new QListWidgetItem(rule.name(), m_ui->listRules); - m_itemsByRuleName.insert(rule.name(), item); - item->setFlags(item->flags() | Qt::ItemIsUserCheckable); - item->setCheckState(rule.isEnabled() ? Qt::Checked : Qt::Unchecked); + // Make sure we save the current item before clearing + saveEditedRule(); + ui->listRules->clear(); + + foreach (const QString &rule_name, m_editableRuleList->ruleNames()) { + QListWidgetItem *item = new QListWidgetItem(rule_name, ui->listRules); + item->setFlags(item->flags() | Qt::ItemIsUserCheckable); + if (m_editableRuleList->getRule(rule_name)->isEnabled()) + item->setCheckState(Qt::Checked); + else + item->setCheckState(Qt::Unchecked); + } } void AutomatedRssDownloader::loadFeedList() { - const QSignalBlocker feedListSignalBlocker(m_ui->listFeeds); + disconnectRuleFeedSlots(); + + const Preferences *const pref = Preferences::instance(); + const QStringList feed_aliases = pref->getRssFeedsAliases(); + const QStringList feed_urls = pref->getRssFeedsUrls(); + ui->listFeeds->clear(); + + for (int i = 0; i < feed_aliases.size(); ++i) { + QString feed_url = feed_urls.at(i); + feed_url = feed_url.split("\\").last(); + qDebug() << Q_FUNC_INFO << feed_url; - foreach (auto feed, RSS::Session::instance()->feeds()) { - QListWidgetItem *item = new QListWidgetItem(feed->name(), m_ui->listFeeds); - item->setData(Qt::UserRole, feed->url()); + QListWidgetItem *item = new QListWidgetItem(feed_aliases.at(i), ui->listFeeds); + item->setData(Qt::UserRole, feed_url); item->setFlags(item->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsTristate); } + // Reconnects slots updateFeedList(); } -void AutomatedRssDownloader::updateFeedList() +void AutomatedRssDownloader::updateFeedList(QListWidgetItem *selected) { - const QSignalBlocker feedListSignalBlocker(m_ui->listFeeds); + disconnectRuleFeedSlots(); QList selection; - if (m_currentRuleItem) - selection << m_currentRuleItem; + if (selected) + selection << selected; else - selection = m_ui->listRules->selectedItems(); + selection = ui->listRules->selectedItems(); bool enable = !selection.isEmpty(); - for (int i = 0; i < m_ui->listFeeds->count(); ++i) { - QListWidgetItem *item = m_ui->listFeeds->item(i); - const QString feedURL = item->data(Qt::UserRole).toString(); + for (int i = 0; ilistFeeds->count(); ++i) { + QListWidgetItem *item = ui->listFeeds->item(i); + const QString feed_url = item->data(Qt::UserRole).toString(); item->setHidden(!enable); bool allEnabled = true; bool anyEnabled = false; foreach (const QListWidgetItem *ruleItem, selection) { - auto rule = RSS::AutoDownloader::instance()->ruleByName(ruleItem->text()); - if (rule.feedURLs().contains(feedURL)) + Rss::DownloadRulePtr rule = m_editableRuleList->getRule(ruleItem->text()); + if (!rule) continue; + qDebug() << "Rule" << rule->name() << "affects" << rule->rssFeeds().size() << "feeds."; + foreach (QString test, rule->rssFeeds()) + qDebug() << "Feed is " << test; + if (rule->rssFeeds().contains(feed_url)) { + qDebug() << "Rule " << rule->name() << " affects feed " << feed_url; anyEnabled = true; - else + } + else { + qDebug() << "Rule " << rule->name() << " does NOT affect feed " << feed_url; allEnabled = false; + } } if (anyEnabled && allEnabled) @@ -227,254 +249,270 @@ item->setCheckState(Qt::Unchecked); } - m_ui->listFeeds->sortItems(); - m_ui->lblListFeeds->setEnabled(enable); - m_ui->listFeeds->setEnabled(enable); -} + ui->listFeeds->sortItems(); + ui->lblListFeeds->setEnabled(enable); + ui->listFeeds->setEnabled(enable); -void AutomatedRssDownloader::updateRuleDefinitionBox() -{ - const QList selection = m_ui->listRules->selectedItems(); - QListWidgetItem *currentRuleItem = ((selection.count() == 1) ? selection.first() : nullptr); - if (m_currentRuleItem != currentRuleItem) { - saveEditedRule(); // Save previous rule first - m_currentRuleItem = currentRuleItem; - //m_ui->listRules->setCurrentItem(m_currentRuleItem); + if (selected) { + m_editedRule = selected; + ui->listRules->clearSelection(); + ui->listRules->setCurrentItem(selected); } + connectRuleFeedSlots(); + updateMatchingArticles(); +} + +bool AutomatedRssDownloader::isRssDownloaderEnabled() const +{ + return ui->checkEnableDownloader->isChecked(); +} + +void AutomatedRssDownloader::updateRuleDefinitionBox(QListWidgetItem *selected) +{ + disconnectRuleFeedSlots(); + + qDebug() << Q_FUNC_INFO; + // Save previous rule first + saveEditedRule(); // Update rule definition box - if (m_currentRuleItem) { - m_currentRule = RSS::AutoDownloader::instance()->ruleByName(m_currentRuleItem->text()); + const QList selection = ui->listRules->selectedItems(); - m_ui->lineContains->setText(m_currentRule.mustContain()); - m_ui->lineNotContains->setText(m_currentRule.mustNotContain()); - if (!m_currentRule.episodeFilter().isEmpty()) - m_ui->lineEFilter->setText(m_currentRule.episodeFilter()); - else - m_ui->lineEFilter->clear(); - m_ui->checkBoxSaveDiffDir->setChecked(!m_currentRule.savePath().isEmpty()); - m_ui->lineSavePath->setText(Utils::Fs::toNativePath(m_currentRule.savePath())); - m_ui->checkRegex->blockSignals(true); - m_ui->checkRegex->setChecked(m_currentRule.useRegex()); - m_ui->checkRegex->blockSignals(false); - m_ui->checkSmart->blockSignals(true); - m_ui->checkSmart->setChecked(m_currentRule.useSmartFilter()); - m_ui->checkSmart->blockSignals(false); - m_ui->comboCategory->setCurrentIndex(m_ui->comboCategory->findText(m_currentRule.assignedCategory())); - if (m_currentRule.assignedCategory().isEmpty()) - m_ui->comboCategory->clearEditText(); - int index = 0; - if (m_currentRule.addPaused() == TriStateBool::True) - index = 1; - else if (m_currentRule.addPaused() == TriStateBool::False) - index = 2; - m_ui->comboAddPaused->setCurrentIndex(index); - m_ui->spinIgnorePeriod->setValue(m_currentRule.ignoreDays()); - QDateTime dateTime = m_currentRule.lastMatch(); - QString lMatch; - if (dateTime.isValid()) - lMatch = tr("Last Match: %1 days ago").arg(dateTime.daysTo(QDateTime::currentDateTime())); - else - lMatch = tr("Last Match: Unknown"); - m_ui->lblLastMatch->setText(lMatch); - updateMustLineValidity(); - updateMustNotLineValidity(); - updateEpisodeFilterValidity(); + if (!selected && (selection.count() == 1)) + selected = selection.first(); - updateFieldsToolTips(m_ui->checkRegex->isChecked()); - m_ui->ruleDefBox->setEnabled(true); + if (selected) { + m_editedRule = selected; + + // Cannot call getCurrentRule() here as the current item hasn't been updated yet + // and we could get the details from the wrong rule. + // Also can't set the current item here or the selected items gets messed up. + Rss::DownloadRulePtr rule = m_editableRuleList->getRule(m_editedRule->text()); + + if (rule) { + ui->lineContains->setText(rule->mustContain()); + ui->lineNotContains->setText(rule->mustNotContain()); + QString ep = rule->episodeFilter(); + if (!ep.isEmpty()) + ui->lineEFilter->setText(ep); + else + ui->lineEFilter->clear(); + ui->saveDiffDir_check->setChecked(!rule->savePath().isEmpty()); + ui->lineSavePath->setText(Utils::Fs::toNativePath(rule->savePath())); + ui->checkRegex->blockSignals(true); + ui->checkRegex->setChecked(rule->useRegex()); + ui->checkRegex->blockSignals(false); + ui->comboCategory->setCurrentIndex(ui->comboCategory->findText(rule->category())); + if (rule->category().isEmpty()) + ui->comboCategory->clearEditText(); + ui->comboAddPaused->setCurrentIndex(rule->addPaused()); + ui->spinIgnorePeriod->setValue(rule->ignoreDays()); + QDateTime dateTime = rule->lastMatch(); + QString lMatch; + if (dateTime.isValid()) + lMatch = tr("Last Match: %1 days ago").arg(dateTime.daysTo(QDateTime::currentDateTime())); + else + lMatch = tr("Last Match: Unknown"); + ui->lblLastMatch->setText(lMatch); + updateMustLineValidity(); + updateMustNotLineValidity(); + updateEpisodeFilterValidity(); + } + else { + // New rule + clearRuleDefinitionBox(); + ui->comboAddPaused->setCurrentIndex(0); + ui->comboCategory->setCurrentIndex(0); + ui->spinIgnorePeriod->setValue(0); + } + + updateFieldsToolTips(ui->checkRegex->isChecked()); + ui->ruleDefBox->setEnabled(true); } else { - m_currentRule = RSS::AutoDownloadRule(); + m_editedRule = 0; clearRuleDefinitionBox(); - m_ui->ruleDefBox->setEnabled(false); + ui->ruleDefBox->setEnabled(false); } - updateFeedList(); - updateMatchingArticles(); + // Reconnects slots + updateFeedList(selected); } void AutomatedRssDownloader::clearRuleDefinitionBox() { - m_ui->lineContains->clear(); - m_ui->lineNotContains->clear(); - m_ui->lineEFilter->clear(); - m_ui->checkBoxSaveDiffDir->setChecked(false); - m_ui->lineSavePath->clear(); - m_ui->comboCategory->clearEditText(); - m_ui->comboCategory->setCurrentIndex(-1); - m_ui->checkRegex->setChecked(false); - m_ui->checkSmart->setChecked(false); - m_ui->spinIgnorePeriod->setValue(0); - m_ui->comboAddPaused->clearEditText(); - m_ui->comboAddPaused->setCurrentIndex(-1); - updateFieldsToolTips(m_ui->checkRegex->isChecked()); + ui->lineContains->clear(); + ui->lineNotContains->clear(); + ui->lineEFilter->clear(); + ui->saveDiffDir_check->setChecked(false); + ui->lineSavePath->clear(); + ui->comboCategory->clearEditText(); + ui->comboCategory->setCurrentIndex(-1); + ui->checkRegex->setChecked(false); + ui->spinIgnorePeriod->setValue(0); + ui->comboAddPaused->clearEditText(); + ui->comboAddPaused->setCurrentIndex(-1); + updateFieldsToolTips(ui->checkRegex->isChecked()); updateMustLineValidity(); updateMustNotLineValidity(); updateEpisodeFilterValidity(); } +Rss::DownloadRulePtr AutomatedRssDownloader::getCurrentRule() const +{ + QListWidgetItem *current_item = ui->listRules->currentItem(); + if (current_item) + return m_editableRuleList->getRule(current_item->text()); + return Rss::DownloadRulePtr(); +} + void AutomatedRssDownloader::initCategoryCombobox() { // Load torrent categories - QStringList categories = BitTorrent::Session::instance()->categories().keys(); - std::sort(categories.begin(), categories.end(), Utils::String::naturalLessThan); - m_ui->comboCategory->addItem(""); - m_ui->comboCategory->addItems(categories); -} - -void AutomatedRssDownloader::updateEditedRule() -{ - if (!m_currentRuleItem || !m_ui->ruleDefBox->isEnabled()) return; - - m_currentRule.setEnabled(m_currentRuleItem->checkState() != Qt::Unchecked); - m_currentRule.setUseRegex(m_ui->checkRegex->isChecked()); - m_currentRule.setUseSmartFilter(m_ui->checkSmart->isChecked()); - m_currentRule.setMustContain(m_ui->lineContains->text()); - m_currentRule.setMustNotContain(m_ui->lineNotContains->text()); - m_currentRule.setEpisodeFilter(m_ui->lineEFilter->text()); - m_currentRule.setSavePath(m_ui->checkBoxSaveDiffDir->isChecked() ? m_ui->lineSavePath->text() : ""); - m_currentRule.setCategory(m_ui->comboCategory->currentText()); - TriStateBool addPaused; // Undefined by default - if (m_ui->comboAddPaused->currentIndex() == 1) - addPaused = TriStateBool::True; - else if (m_ui->comboAddPaused->currentIndex() == 2) - addPaused = TriStateBool::False; - m_currentRule.setAddPaused(addPaused); - m_currentRule.setIgnoreDays(m_ui->spinIgnorePeriod->value()); + QStringList categories = BitTorrent::Session::instance()->categories(); + std::sort(categories.begin(), categories.end(), Utils::String::naturalCompareCaseInsensitive); + ui->comboCategory->addItem(QString("")); + ui->comboCategory->addItems(categories); } void AutomatedRssDownloader::saveEditedRule() { - if (!m_currentRuleItem || !m_ui->ruleDefBox->isEnabled()) return; + if (!m_editedRule || !ui->ruleDefBox->isEnabled()) return; - updateEditedRule(); - RSS::AutoDownloader::instance()->insertRule(m_currentRule); + qDebug() << Q_FUNC_INFO << m_editedRule; + if (ui->listRules->findItems(m_editedRule->text(), Qt::MatchExactly).isEmpty()) { + qDebug() << "Could not find rule" << m_editedRule->text() << "in the UI list"; + qDebug() << "Probably removed the item, no need to save it"; + return; + } + Rss::DownloadRulePtr rule = m_editableRuleList->getRule(m_editedRule->text()); + if (!rule) { + rule = Rss::DownloadRulePtr(new Rss::DownloadRule); + rule->setName(m_editedRule->text()); + } + if (m_editedRule->checkState() == Qt::Unchecked) + rule->setEnabled(false); + else + rule->setEnabled(true); + rule->setUseRegex(ui->checkRegex->isChecked()); + rule->setMustContain(ui->lineContains->text()); + rule->setMustNotContain(ui->lineNotContains->text()); + rule->setEpisodeFilter(ui->lineEFilter->text()); + if (ui->saveDiffDir_check->isChecked()) + rule->setSavePath(ui->lineSavePath->text()); + else + rule->setSavePath(""); + rule->setCategory(ui->comboCategory->currentText()); + + rule->setAddPaused(Rss::DownloadRule::AddPausedState(ui->comboAddPaused->currentIndex())); + rule->setIgnoreDays(ui->spinIgnorePeriod->value()); + // rule->setRssFeeds(getSelectedFeeds()); + // Save it + m_editableRuleList->saveRule(rule); } void AutomatedRssDownloader::on_addRuleBtn_clicked() { -// saveEditedRule(); + saveEditedRule(); // Ask for a rule name - const QString ruleName = AutoExpandableDialog::getText( - this, tr("New rule name"), tr("Please type the name of the new download rule.")); - if (ruleName.isEmpty()) return; - + const QString rule_name = AutoExpandableDialog::getText(this, tr("New rule name"), tr("Please type the name of the new download rule.")); + if (rule_name.isEmpty()) return; // Check if this rule name already exists - if (RSS::AutoDownloader::instance()->hasRule(ruleName)) { - QMessageBox::warning(this, tr("Rule name conflict") - , tr("A rule with this name already exists, please choose another name.")); + if (m_editableRuleList->getRule(rule_name)) { + QMessageBox::warning(this, tr("Rule name conflict"), tr("A rule with this name already exists, please choose another name.")); return; } - RSS::AutoDownloader::instance()->insertRule(RSS::AutoDownloadRule(ruleName)); + disconnectRuleFeedSlots(); + + // Add the new rule to the list + QListWidgetItem *item = new QListWidgetItem(rule_name, ui->listRules); + item->setFlags(item->flags() | Qt::ItemIsUserCheckable | Qt::ItemIsTristate); + item->setCheckState(Qt::Checked); // Enable as a default + m_editedRule = 0; + + // Reconnects slots + updateRuleDefinitionBox(item); } void AutomatedRssDownloader::on_removeRuleBtn_clicked() { - const QList selection = m_ui->listRules->selectedItems(); + const QList selection = ui->listRules->selectedItems(); if (selection.isEmpty()) return; - // Ask for confirmation - const QString confirmText = ((selection.count() == 1) - ? tr("Are you sure you want to remove the download rule named '%1'?") - .arg(selection.first()->text()) - : tr("Are you sure you want to remove the selected download rules?")); - if (QMessageBox::question(this, tr("Rule deletion confirmation"), confirmText, QMessageBox::Yes, QMessageBox::No) != QMessageBox::Yes) + QString confirm_text; + if (selection.count() == 1) + confirm_text = tr("Are you sure you want to remove the download rule named '%1'?").arg(selection.first()->text()); + else + confirm_text = tr("Are you sure you want to remove the selected download rules?"); + if (QMessageBox::question(this, tr("Rule deletion confirmation"), confirm_text, QMessageBox::Yes, QMessageBox::No) != QMessageBox::Yes) return; - foreach (QListWidgetItem *item, selection) - RSS::AutoDownloader::instance()->removeRule(item->text()); + disconnectRuleFeedSlots(); + + foreach (QListWidgetItem *item, selection) { + // Actually remove the item + ui->listRules->removeItemWidget(item); + const QString rule_name = item->text(); + // Clean up memory + delete item; + qDebug("Removed item for the UI list"); + // Remove it from the m_editableRuleList + m_editableRuleList->removeRule(rule_name); + } + + m_editedRule = 0; + // Reconnects slots + updateRuleDefinitionBox(); } void AutomatedRssDownloader::on_browseSP_clicked() { - QString savePath = QFileDialog::getExistingDirectory(this, tr("Destination directory"), QDir::homePath()); - if (!savePath.isEmpty()) - m_ui->lineSavePath->setText(Utils::Fs::toNativePath(savePath)); + QString save_path = QFileDialog::getExistingDirectory(this, tr("Destination directory"), QDir::homePath()); + if (!save_path.isEmpty()) + ui->lineSavePath->setText(Utils::Fs::toNativePath(save_path)); } void AutomatedRssDownloader::on_exportBtn_clicked() { - if (RSS::AutoDownloader::instance()->rules().isEmpty()) { - QMessageBox::warning(this, tr("Invalid action") - , tr("The list is empty, there is nothing to export.")); + if (m_editableRuleList->isEmpty()) { + QMessageBox::warning(this, tr("Invalid action"), tr("The list is empty, there is nothing to export.")); return; } - - QString selectedFilter {m_formatFilterJSON}; - QString path = QFileDialog::getSaveFileName( - this, tr("Export RSS rules"), QDir::homePath() - , QString("%1;;%2").arg(m_formatFilterJSON, m_formatFilterLegacy), &selectedFilter); - if (path.isEmpty()) return; - - const RSS::AutoDownloader::RulesFileFormat format { - (selectedFilter == m_formatFilterJSON) - ? RSS::AutoDownloader::RulesFileFormat::JSON - : RSS::AutoDownloader::RulesFileFormat::Legacy - }; - - if (format == RSS::AutoDownloader::RulesFileFormat::JSON) { - if (!path.endsWith(EXT_JSON, Qt::CaseInsensitive)) - path += EXT_JSON; - } - else { - if (!path.endsWith(EXT_LEGACY, Qt::CaseInsensitive)) - path += EXT_LEGACY; - } - - QFile file {path}; - if (!file.open(QFile::WriteOnly) - || (file.write(RSS::AutoDownloader::instance()->exportRules(format)) == -1)) { - QMessageBox::critical( - this, tr("I/O Error") - , tr("Failed to create the destination file. Reason: %1").arg(file.errorString())); + // Ask for a save path + QString save_path = QFileDialog::getSaveFileName(this, tr("Where would you like to save the list?"), QDir::homePath(), tr("Rules list (*.rssrules)")); + if (save_path.isEmpty()) return; + if (!save_path.endsWith(".rssrules", Qt::CaseInsensitive)) + save_path += ".rssrules"; + if (!m_editableRuleList->serialize(save_path)) { + QMessageBox::warning(this, tr("I/O Error"), tr("Failed to create the destination file")); + return; } } void AutomatedRssDownloader::on_importBtn_clicked() { - QString selectedFilter {m_formatFilterJSON}; - QString path = QFileDialog::getOpenFileName( - this, tr("Import RSS rules"), QDir::homePath() - , QString("%1;;%2").arg(m_formatFilterJSON, m_formatFilterLegacy), &selectedFilter); - if (path.isEmpty() || !QFile::exists(path)) + // Ask for filter path + QString load_path = QFileDialog::getOpenFileName(this, tr("Please point to the RSS download rules file"), QDir::homePath(), tr("Rules list") + QString(" (*.rssrules *.filters)")); + if (load_path.isEmpty() || !QFile::exists(load_path)) return; + // Load it + if (!m_editableRuleList->unserialize(load_path)) { + QMessageBox::warning(this, tr("Import Error"), tr("Failed to import the selected rules file")); return; - - QFile file {path}; - if (!file.open(QIODevice::ReadOnly)) { - QMessageBox::critical( - this, tr("I/O Error") - , tr("Failed to open the file. Reason: %1").arg(file.errorString())); - return; - } - - const RSS::AutoDownloader::RulesFileFormat format { - (selectedFilter == m_formatFilterJSON) - ? RSS::AutoDownloader::RulesFileFormat::JSON - : RSS::AutoDownloader::RulesFileFormat::Legacy - }; - - try { - RSS::AutoDownloader::instance()->importRules(file.readAll(),format); - } - catch (const RSS::ParsingError &error) { - QMessageBox::critical( - this, tr("Import Error") - , tr("Failed to import the selected rules file. Reason: %1").arg(error.message())); } + // Reload the rule list + loadRulesList(); } -void AutomatedRssDownloader::displayRulesListMenu() +void AutomatedRssDownloader::displayRulesListMenu(const QPoint &pos) { + Q_UNUSED(pos); QMenu menu; QAction *addAct = menu.addAction(GuiIconProvider::instance()->getIcon("list-add"), tr("Add new rule...")); - QAction *delAct = nullptr; - QAction *renameAct = nullptr; - QAction *clearAct = nullptr; - const QList selection = m_ui->listRules->selectedItems(); - + QAction *delAct = 0; + QAction *renameAct = 0; + const QList selection = ui->listRules->selectedItems(); if (!selection.isEmpty()) { if (selection.count() == 1) { delAct = menu.addAction(GuiIconProvider::instance()->getIcon("list-remove"), tr("Delete rule")); @@ -484,123 +522,116 @@ else { delAct = menu.addAction(GuiIconProvider::instance()->getIcon("list-remove"), tr("Delete selected rules")); } - menu.addSeparator(); - clearAct = menu.addAction(GuiIconProvider::instance()->getIcon("edit-clear"), tr("Clear downloaded episodes...")); } - QAction *act = menu.exec(QCursor::pos()); if (!act) return; - - if (act == addAct) + if (act == addAct) { on_addRuleBtn_clicked(); - else if (act == delAct) + return; + } + if (act == delAct) { on_removeRuleBtn_clicked(); - else if (act == renameAct) + return; + } + if (act == renameAct) { renameSelectedRule(); - else if (act == clearAct) - clearSelectedRuleDownloadedEpisodeList(); + return; + } } void AutomatedRssDownloader::renameSelectedRule() { - const QList selection = m_ui->listRules->selectedItems(); - if (selection.isEmpty()) return; + const QList selection = ui->listRules->selectedItems(); + if (selection.isEmpty()) + return; QListWidgetItem *item = selection.first(); forever { - QString newName = AutoExpandableDialog::getText( - this, tr("Rule renaming"), tr("Please type the new rule name") - , QLineEdit::Normal, item->text()); - newName = newName.trimmed(); - if (newName.isEmpty()) return; - - if (RSS::AutoDownloader::instance()->hasRule(newName)) { - QMessageBox::warning(this, tr("Rule name conflict") - , tr("A rule with this name already exists, please choose another name.")); + QString new_name = AutoExpandableDialog::getText(this, tr("Rule renaming"), tr("Please type the new rule name"), QLineEdit::Normal, item->text()); + new_name = new_name.trimmed(); + if (new_name.isEmpty()) return; + if (m_editableRuleList->ruleNames().contains(new_name, Qt::CaseInsensitive)) { + QMessageBox::warning(this, tr("Rule name conflict"), tr("A rule with this name already exists, please choose another name.")); } else { // Rename the rule - RSS::AutoDownloader::instance()->renameRule(item->text(), newName); + m_editableRuleList->renameRule(item->text(), new_name); + item->setText(new_name); return; } } } -void AutomatedRssDownloader::handleRuleCheckStateChange(QListWidgetItem *ruleItem) +void AutomatedRssDownloader::handleRuleCheckStateChange(QListWidgetItem *rule_item) { - m_ui->listRules->setCurrentItem(ruleItem); -} - -void AutomatedRssDownloader::clearSelectedRuleDownloadedEpisodeList() -{ - const QMessageBox::StandardButton reply = QMessageBox::question( - this, - tr("Clear downloaded episodes"), - tr("Are you sure you want to clear the list of downloaded episodes for the selected rule?"), - QMessageBox::Yes | QMessageBox::No); + // Make sure the current rule is saved + saveEditedRule(); - if (reply == QMessageBox::Yes) { - m_currentRule.setPreviouslyMatchedEpisodes(QStringList()); - handleRuleDefinitionChanged(); - } + // Make sure we save the rule that was enabled or disabled - it might not be the current selection. + m_editedRule = rule_item; + saveEditedRule(); + updateRuleDefinitionBox(); } -void AutomatedRssDownloader::handleFeedCheckStateChange(QListWidgetItem *feedItem) +void AutomatedRssDownloader::handleFeedCheckStateChange(QListWidgetItem *feed_item) { - const QString feedURL = feedItem->data(Qt::UserRole).toString(); - foreach (QListWidgetItem *ruleItem, m_ui->listRules->selectedItems()) { - RSS::AutoDownloadRule rule = (ruleItem == m_currentRuleItem - ? m_currentRule - : RSS::AutoDownloader::instance()->ruleByName(ruleItem->text())); - QStringList affectedFeeds = rule.feedURLs(); - if ((feedItem->checkState() == Qt::Checked) && !affectedFeeds.contains(feedURL)) - affectedFeeds << feedURL; - else if ((feedItem->checkState() == Qt::Unchecked) && affectedFeeds.contains(feedURL)) - affectedFeeds.removeOne(feedURL); - - rule.setFeedURLs(affectedFeeds); - if (ruleItem != m_currentRuleItem) - RSS::AutoDownloader::instance()->insertRule(rule); - else - m_currentRule = rule; + // Make sure the current rule is saved + saveEditedRule(); + const QString feed_url = feed_item->data(Qt::UserRole).toString(); + foreach (QListWidgetItem *rule_item, ui->listRules->selectedItems()) { + Rss::DownloadRulePtr rule = m_editableRuleList->getRule(rule_item->text()); + Q_ASSERT(rule); + QStringList affected_feeds = rule->rssFeeds(); + if ((feed_item->checkState() == Qt::Checked) && !affected_feeds.contains(feed_url)) + affected_feeds << feed_url; + else if ((feed_item->checkState() == Qt::Unchecked) && affected_feeds.contains(feed_url)) + affected_feeds.removeOne(feed_url); + // Save the updated rule + if (affected_feeds.size() != rule->rssFeeds().size()) { + rule->setRssFeeds(affected_feeds); + m_editableRuleList->saveRule(rule); + } } - - handleRuleDefinitionChanged(); + // Update Matching articles + updateMatchingArticles(); } void AutomatedRssDownloader::updateMatchingArticles() { - m_ui->treeMatchingArticles->clear(); + ui->treeMatchingArticles->clear(); + Rss::ManagerPtr manager = m_manager.toStrongRef(); + if (!manager) + return; + const QHash all_feeds = manager->rootFolder()->getAllFeedsAsHash(); - foreach (const QListWidgetItem *ruleItem, m_ui->listRules->selectedItems()) { - RSS::AutoDownloadRule rule = (ruleItem == m_currentRuleItem - ? m_currentRule - : RSS::AutoDownloader::instance()->ruleByName(ruleItem->text())); - foreach (const QString &feedURL, rule.feedURLs()) { - auto feed = RSS::Session::instance()->feedByURL(feedURL); - if (!feed) continue; // feed doesn't exist - - QStringList matchingArticles; - foreach (auto article, feed->articles()) - if (rule.matches(article->data())) - matchingArticles << article->title(); - if (!matchingArticles.isEmpty()) - addFeedArticlesToTree(feed, matchingArticles); + saveEditedRule(); + foreach (const QListWidgetItem *rule_item, ui->listRules->selectedItems()) { + Rss::DownloadRulePtr rule = m_editableRuleList->getRule(rule_item->text()); + if (!rule) continue; + foreach (const QString &feed_url, rule->rssFeeds()) { + qDebug() << Q_FUNC_INFO << feed_url; + if (!all_feeds.contains(feed_url)) continue; // Feed was removed + Rss::FeedPtr feed = all_feeds.value(feed_url); + Q_ASSERT(feed); + if (!feed) continue; + const QStringList matching_articles = rule->findMatchingArticles(feed); + if (!matching_articles.isEmpty()) + addFeedArticlesToTree(feed, matching_articles); } } m_treeListEntries.clear(); } -void AutomatedRssDownloader::addFeedArticlesToTree(RSS::Feed *feed, const QStringList &articles) +void AutomatedRssDownloader::addFeedArticlesToTree(const Rss::FeedPtr &feed, const QStringList &articles) { // Turn off sorting while inserting - m_ui->treeMatchingArticles->setSortingEnabled(false); + ui->treeMatchingArticles->setSortingEnabled(false); // Check if this feed is already in the tree - QTreeWidgetItem *treeFeedItem = nullptr; - for (int i = 0; i < m_ui->treeMatchingArticles->topLevelItemCount(); ++i) { - QTreeWidgetItem *item = m_ui->treeMatchingArticles->topLevelItem(i); + QTreeWidgetItem *treeFeedItem = 0; + for (int i = 0; itreeMatchingArticles->topLevelItemCount(); ++i) { + QTreeWidgetItem *item = ui->treeMatchingArticles->topLevelItem(i); if (item->data(0, Qt::UserRole).toString() == feed->url()) { treeFeedItem = item; break; @@ -609,38 +640,38 @@ // If there is none, create it if (!treeFeedItem) { - treeFeedItem = new QTreeWidgetItem(QStringList() << feed->name()); - treeFeedItem->setToolTip(0, feed->name()); + treeFeedItem = new QTreeWidgetItem(QStringList() << feed->displayName()); + treeFeedItem->setToolTip(0, feed->displayName()); QFont f = treeFeedItem->font(0); f.setBold(true); treeFeedItem->setFont(0, f); treeFeedItem->setData(0, Qt::DecorationRole, GuiIconProvider::instance()->getIcon("inode-directory")); treeFeedItem->setData(0, Qt::UserRole, feed->url()); - m_ui->treeMatchingArticles->addTopLevelItem(treeFeedItem); + ui->treeMatchingArticles->addTopLevelItem(treeFeedItem); } // Insert the articles - foreach (const QString &article, articles) { - QPair key(feed->name(), article); + foreach (const QString &art, articles) { + QPair key(feed->displayName(), art); if (!m_treeListEntries.contains(key)) { m_treeListEntries << key; - QTreeWidgetItem *item = new QTreeWidgetItem(QStringList() << article); - item->setToolTip(0, article); + QTreeWidgetItem *item = new QTreeWidgetItem(QStringList() << art); + item->setToolTip(0, art); treeFeedItem->addChild(item); } } - m_ui->treeMatchingArticles->expandItem(treeFeedItem); - m_ui->treeMatchingArticles->sortItems(0, Qt::AscendingOrder); - m_ui->treeMatchingArticles->setSortingEnabled(true); + ui->treeMatchingArticles->expandItem(treeFeedItem); + ui->treeMatchingArticles->sortItems(0, Qt::AscendingOrder); + ui->treeMatchingArticles->setSortingEnabled(true); } void AutomatedRssDownloader::updateFieldsToolTips(bool regex) { QString tip; if (regex) { - tip = "

" + tr("Regex mode: use Perl-compatible regular expressions") + "

"; + tip = "

" + tr("Regex mode: use Perl-like regular expressions") + "

"; } else { tip = "

" + tr("Wildcard mode: you can use") + "

    " @@ -658,31 +689,25 @@ tip += tr("An expression with an empty %1 clause (e.g. %2)", "We talk about regex/wildcards in the RSS filters section here." " So a valid sentence would be: An expression with an empty | clause (e.g. expr|)" - ).arg("|", "expr|"); - m_ui->lineContains->setToolTip(tip + tr(" will match all articles.") + "

    "); - m_ui->lineNotContains->setToolTip(tip + tr(" will exclude all articles.") + "

    "); + ).arg("|").arg("expr|"); + ui->lineContains->setToolTip(tip + tr(" will match all articles.") + "

    "); + ui->lineNotContains->setToolTip(tip + tr(" will exclude all articles.") + "

    "); } void AutomatedRssDownloader::updateMustLineValidity() { - const QString text = m_ui->lineContains->text(); - bool isRegex = m_ui->checkRegex->isChecked(); + const QString text = ui->lineContains->text(); bool valid = true; - QString error; if (!text.isEmpty()) { QStringList tokens; - if (isRegex) + if (ui->checkRegex->isChecked()) tokens << text; else - foreach (const QString &token, text.split('|')) - tokens << Utils::String::wildcardToRegex(token); - + tokens << text.split("|"); foreach (const QString &token, tokens) { - QRegularExpression reg(token, QRegularExpression::CaseInsensitiveOption); + QRegExp reg(token, Qt::CaseInsensitive, ui->checkRegex->isChecked() ? QRegExp::RegExp : QRegExp::Wildcard); if (!reg.isValid()) { - if (isRegex) - error = tr("Position %1: %2").arg(reg.patternErrorOffset()).arg(reg.errorString()); valid = false; break; } @@ -690,37 +715,29 @@ } if (valid) { - m_ui->lineContains->setStyleSheet(""); - m_ui->labelMustStat->setPixmap(QPixmap()); - m_ui->labelMustStat->setToolTip(""); + ui->lineContains->setStyleSheet(""); + ui->lbl_must_stat->setPixmap(QPixmap()); } else { - m_ui->lineContains->setStyleSheet("QLineEdit { color: #ff0000; }"); - m_ui->labelMustStat->setPixmap(GuiIconProvider::instance()->getIcon("task-attention").pixmap(16, 16)); - m_ui->labelMustStat->setToolTip(error); + ui->lineContains->setStyleSheet("QLineEdit { color: #ff0000; }"); + ui->lbl_must_stat->setPixmap(GuiIconProvider::instance()->getIcon("task-attention").pixmap(16, 16)); } } void AutomatedRssDownloader::updateMustNotLineValidity() { - const QString text = m_ui->lineNotContains->text(); - bool isRegex = m_ui->checkRegex->isChecked(); + const QString text = ui->lineNotContains->text(); bool valid = true; - QString error; if (!text.isEmpty()) { QStringList tokens; - if (isRegex) + if (ui->checkRegex->isChecked()) tokens << text; else - foreach (const QString &token, text.split('|')) - tokens << Utils::String::wildcardToRegex(token); - + tokens << text.split("|"); foreach (const QString &token, tokens) { - QRegularExpression reg(token, QRegularExpression::CaseInsensitiveOption); + QRegExp reg(token, Qt::CaseInsensitive, ui->checkRegex->isChecked() ? QRegExp::RegExp : QRegExp::Wildcard); if (!reg.isValid()) { - if (isRegex) - error = tr("Position %1: %2").arg(reg.patternErrorOffset()).arg(reg.errorString()); valid = false; break; } @@ -728,66 +745,55 @@ } if (valid) { - m_ui->lineNotContains->setStyleSheet(""); - m_ui->labelMustNotStat->setPixmap(QPixmap()); - m_ui->labelMustNotStat->setToolTip(""); + ui->lineNotContains->setStyleSheet(""); + ui->lbl_mustnot_stat->setPixmap(QPixmap()); } else { - m_ui->lineNotContains->setStyleSheet("QLineEdit { color: #ff0000; }"); - m_ui->labelMustNotStat->setPixmap(GuiIconProvider::instance()->getIcon("task-attention").pixmap(16, 16)); - m_ui->labelMustNotStat->setToolTip(error); + ui->lineNotContains->setStyleSheet("QLineEdit { color: #ff0000; }"); + ui->lbl_mustnot_stat->setPixmap(GuiIconProvider::instance()->getIcon("task-attention").pixmap(16, 16)); } } void AutomatedRssDownloader::updateEpisodeFilterValidity() { - const QString text = m_ui->lineEFilter->text(); - bool valid = text.isEmpty() || m_episodeRegex->match(text).hasMatch(); + const QString text = ui->lineEFilter->text(); + bool valid = text.isEmpty() || m_episodeRegex->indexIn(text) != -1; if (valid) { - m_ui->lineEFilter->setStyleSheet(""); - m_ui->labelEpFilterStat->setPixmap(QPixmap()); + ui->lineEFilter->setStyleSheet(""); + ui->lbl_epfilter_stat->setPixmap(QPixmap()); } else { - m_ui->lineEFilter->setStyleSheet("QLineEdit { color: #ff0000; }"); - m_ui->labelEpFilterStat->setPixmap(GuiIconProvider::instance()->getIcon("task-attention").pixmap(16, 16)); + ui->lineEFilter->setStyleSheet("QLineEdit { color: #ff0000; }"); + ui->lbl_epfilter_stat->setPixmap(GuiIconProvider::instance()->getIcon("task-attention").pixmap(16, 16)); } } -void AutomatedRssDownloader::handleRuleDefinitionChanged() +void AutomatedRssDownloader::showEvent(QShowEvent *event) { - updateEditedRule(); - updateMatchingArticles(); + // Connects the signals and slots + loadFeedList(); + QDialog::showEvent(event); } -void AutomatedRssDownloader::handleRuleAdded(const QString &ruleName) +void AutomatedRssDownloader::hideEvent(QHideEvent *event) { - createRuleItem(RSS::AutoDownloadRule(ruleName)); + disconnectRuleFeedSlots(); + QDialog::hideEvent(event); } -void AutomatedRssDownloader::handleRuleRenamed(const QString &ruleName, const QString &oldRuleName) +void AutomatedRssDownloader::onFinished(int result) { - auto item = m_itemsByRuleName.take(oldRuleName); - m_itemsByRuleName.insert(ruleName, item); - if (m_currentRule.name() == oldRuleName) - m_currentRule.setName(ruleName); - item->setText(ruleName); -} + Q_UNUSED(result); + disconnectRuleFeedSlots(); -void AutomatedRssDownloader::handleRuleChanged(const QString &ruleName) -{ - auto item = m_itemsByRuleName.value(ruleName); - if (item && (item != m_currentRuleItem)) - item->setCheckState(RSS::AutoDownloader::instance()->ruleByName(ruleName).isEnabled() ? Qt::Checked : Qt::Unchecked); -} - -void AutomatedRssDownloader::handleRuleAboutToBeRemoved(const QString &ruleName) -{ - m_currentRuleItem = nullptr; - delete m_itemsByRuleName.take(ruleName); -} + // Save current item on exit + saveEditedRule(); + ui->listRules->clearSelection(); + m_ruleList->replace(m_editableRuleList); + m_ruleList->saveRulesToStorage(); + saveSettings(); -void AutomatedRssDownloader::handleProcessingStateChanged(bool enabled) -{ - m_ui->labelWarn->setVisible(!enabled); + m_treeListEntries.clear(); + ui->treeMatchingArticles->clear(); } diff -Nru qbittorrent-4.1.3/src/gui/rss/automatedrssdownloader.h qbittorrent-3.3.15/src/gui/rss/automatedrssdownloader.h --- qbittorrent-4.1.3/src/gui/rss/automatedrssdownloader.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/rss/automatedrssdownloader.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,7 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * Copyright (C) 2010 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2010 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -25,89 +24,98 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef AUTOMATEDRSSDOWNLOADER_H #define AUTOMATEDRSSDOWNLOADER_H #include -#include +#include #include #include +#include +#include +#include +#include +#include -#include "base/rss/rss_autodownloadrule.h" +#include "base/rss/rssdownloadrule.h" -namespace Ui -{ +QT_BEGIN_NAMESPACE +namespace Ui { class AutomatedRssDownloader; } +QT_END_NAMESPACE -class QListWidgetItem; -class QRegularExpression; -class QShortcut; - -namespace RSS +namespace Rss { - class Feed; + class DownloadRuleList; + class Manager; } -class AutomatedRssDownloader : public QDialog +QT_BEGIN_NAMESPACE +class QListWidgetItem; +QT_END_NAMESPACE + +class AutomatedRssDownloader: public QDialog { Q_OBJECT public: - explicit AutomatedRssDownloader(QWidget *parent = nullptr); - ~AutomatedRssDownloader() override; + explicit AutomatedRssDownloader(const QWeakPointer &manager, QWidget *parent = 0); + ~AutomatedRssDownloader(); + bool isRssDownloaderEnabled() const; + +protected: + virtual void showEvent(QShowEvent *event) override; + virtual void hideEvent(QHideEvent *event) override; + +protected slots: + void loadSettings(); + void saveSettings(); + void loadRulesList(); + void handleRuleCheckStateChange(QListWidgetItem *rule_item); + void handleFeedCheckStateChange(QListWidgetItem *feed_item); + void updateRuleDefinitionBox(QListWidgetItem *selected = 0); + void clearRuleDefinitionBox(); + void saveEditedRule(); + void loadFeedList(); + void updateFeedList(QListWidgetItem *selected = 0); private slots: + void displayRulesListMenu(const QPoint &pos); void on_addRuleBtn_clicked(); void on_removeRuleBtn_clicked(); void on_browseSP_clicked(); void on_exportBtn_clicked(); void on_importBtn_clicked(); - - void handleRuleCheckStateChange(QListWidgetItem *ruleItem); - void handleFeedCheckStateChange(QListWidgetItem *feedItem); - void displayRulesListMenu(); void renameSelectedRule(); - void updateRuleDefinitionBox(); - void clearSelectedRuleDownloadedEpisodeList(); + void updateMatchingArticles(); void updateFieldsToolTips(bool regex); void updateMustLineValidity(); void updateMustNotLineValidity(); void updateEpisodeFilterValidity(); - void handleRuleDefinitionChanged(); - void handleRuleAdded(const QString &ruleName); - void handleRuleRenamed(const QString &ruleName, const QString &oldRuleName); - void handleRuleChanged(const QString &ruleName); - void handleRuleAboutToBeRemoved(const QString &ruleName); - - void handleProcessingStateChanged(bool enabled); + void onFinished(int result); private: - void loadSettings(); - void saveSettings(); - void createRuleItem(const RSS::AutoDownloadRule &rule); + Rss::DownloadRulePtr getCurrentRule() const; void initCategoryCombobox(); - void clearRuleDefinitionBox(); - void updateEditedRule(); - void updateMatchingArticles(); - void saveEditedRule(); - void loadFeedList(); - void updateFeedList(); - void addFeedArticlesToTree(RSS::Feed *feed, const QStringList &articles); + void addFeedArticlesToTree(const Rss::FeedPtr &feed, const QStringList &articles); + void disconnectRuleFeedSlots(); + void connectRuleFeedSlots(); - const QString m_formatFilterJSON; - const QString m_formatFilterLegacy; - - Ui::AutomatedRssDownloader *m_ui; - QListWidgetItem *m_currentRuleItem; - QShortcut *m_editHotkey; - QShortcut *m_deleteHotkey; - QSet> m_treeListEntries; - RSS::AutoDownloadRule m_currentRule; - QHash m_itemsByRuleName; - QRegularExpression *m_episodeRegex; +private: + Ui::AutomatedRssDownloader *ui; + QWeakPointer m_manager; + QListWidgetItem *m_editedRule; + Rss::DownloadRuleList *m_ruleList; + Rss::DownloadRuleList *m_editableRuleList; + QRegExp *m_episodeRegex; + QShortcut *editHotkey; + QShortcut *deleteHotkey; + QSet> m_treeListEntries; }; #endif // AUTOMATEDRSSDOWNLOADER_H diff -Nru qbittorrent-4.1.3/src/gui/rss/automatedrssdownloader.ui qbittorrent-3.3.15/src/gui/rss/automatedrssdownloader.ui --- qbittorrent-4.1.3/src/gui/rss/automatedrssdownloader.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/rss/automatedrssdownloader.ui 2017-08-03 20:30:10.000000000 +0000 @@ -6,8 +6,8 @@ 0 0 - 818 - 571 + 816 + 537 @@ -15,31 +15,20 @@ - + - true + 75 + true - - color: red; - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - - - true + Enable Automated RSS Downloader - - - 0 - 0 - - Qt::Horizontal @@ -140,7 +129,7 @@ - + 18 @@ -153,7 +142,7 @@ - + 18 @@ -163,7 +152,7 @@ - + 18 @@ -181,17 +170,6 @@ - - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - Use Smart Episode Filter - - - - Qt::Horizontal @@ -223,7 +201,7 @@ - + Save to a Different Directory @@ -271,12 +249,12 @@ - - true - Disabled + + true + days @@ -396,9 +374,6 @@ - - true - &Import... @@ -406,9 +381,6 @@ - - true - &Export... @@ -416,9 +388,6 @@ - - Qt::StrongFocus - QDialogButtonBox::Close @@ -428,26 +397,6 @@ - - removeRuleBtn - addRuleBtn - listRules - checkRegex - checkSmart - lineContains - lineNotContains - lineEFilter - comboCategory - checkBoxSaveDiffDir - lineSavePath - browseSP - spinIgnorePeriod - comboAddPaused - listFeeds - treeMatchingArticles - importBtn - exportBtn - @@ -483,7 +432,7 @@ - checkBoxSaveDiffDir + saveDiffDir_check toggled(bool) label_6 setEnabled(bool) @@ -499,7 +448,7 @@ - checkBoxSaveDiffDir + saveDiffDir_check toggled(bool) lineSavePath setEnabled(bool) @@ -515,7 +464,7 @@ - checkBoxSaveDiffDir + saveDiffDir_check toggled(bool) browseSP setEnabled(bool) diff -Nru qbittorrent-4.1.3/src/gui/rss/CMakeLists.txt qbittorrent-3.3.15/src/gui/rss/CMakeLists.txt --- qbittorrent-4.1.3/src/gui/rss/CMakeLists.txt 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/rss/CMakeLists.txt 2017-08-03 20:30:10.000000000 +0000 @@ -1,27 +1,31 @@ -add_library(qbt_rss STATIC -# headers -articlelistwidget.h +include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) + +set(QBT_RSS_HEADERS automatedrssdownloader.h feedlistwidget.h htmlbrowser.h -rsswidget.h +rss_imp.h +rsssettingsdlg.h +) -#sources -articlelistwidget.cpp +set(QBT_RSS_SOURCE automatedrssdownloader.cpp feedlistwidget.cpp htmlbrowser.cpp -rsswidget.cpp +rss_imp.cpp +rsssettingsdlg.cpp +) -# forms +set(QBT_RSS_FORMS automatedrssdownloader.ui -rsswidget.ui +rss.ui +rsssettingsdlg.ui ) -target_include_directories(qbt_rss PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(qbt_rss - PRIVATE - qbt_gui_headers - PUBLIC - qbt_base Qt5::Gui Qt5::Widgets Qt5::Network -) +add_library(qbt_rss STATIC ${QBT_RSS_HEADERS} ${QBT_RSS_SOURCE} ${QBT_RSS_FORMS}) +target_link_libraries(qbt_rss qbt_base) +if (QT4_FOUND) + target_link_libraries(qbt_rss Qt4::QtGui Qt4::QtNetwork) +else (QT4_FOUND) + target_link_libraries(qbt_rss Qt5::Gui Qt5::Widgets Qt5::Network) +endif (QT4_FOUND) diff -Nru qbittorrent-4.1.3/src/gui/rss/feedlistwidget.cpp qbittorrent-3.3.15/src/gui/rss/feedlistwidget.cpp --- qbittorrent-4.1.3/src/gui/rss/feedlistwidget.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/rss/feedlistwidget.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,7 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * Copyright (C) 2010 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2010 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -25,249 +24,213 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact: chris@qbittorrent.org, arnaud@qbittorrent.org */ -#include "feedlistwidget.h" - -#include -#include -#include - -#include "base/rss/rss_article.h" -#include "base/rss/rss_feed.h" -#include "base/rss/rss_folder.h" -#include "base/rss/rss_session.h" +#include "base/rss/rssmanager.h" +#include "base/rss/rssfolder.h" +#include "base/rss/rssfeed.h" #include "guiiconprovider.h" +#include "feedlistwidget.h" -FeedListWidget::FeedListWidget(QWidget *parent) +FeedListWidget::FeedListWidget(QWidget *parent, const Rss::ManagerPtr& rssmanager) : QTreeWidget(parent) + , m_rssManager(rssmanager) + , m_currentFeed(nullptr) { - setContextMenuPolicy(Qt::CustomContextMenu); - setDragDropMode(QAbstractItemView::InternalMove); - setSelectionMode(QAbstractItemView::ExtendedSelection); - setColumnCount(1); - headerItem()->setText(0, tr("RSS feeds")); - - connect(RSS::Session::instance(), &RSS::Session::itemAdded, this, &FeedListWidget::handleItemAdded); - connect(RSS::Session::instance(), &RSS::Session::feedStateChanged, this, &FeedListWidget::handleFeedStateChanged); - connect(RSS::Session::instance(), &RSS::Session::feedIconLoaded, this, &FeedListWidget::handleFeedIconLoaded); - connect(RSS::Session::instance(), &RSS::Session::itemPathChanged, this, &FeedListWidget::handleItemPathChanged); - connect(RSS::Session::instance(), &RSS::Session::itemAboutToBeRemoved, this, &FeedListWidget::handleItemAboutToBeRemoved); - - m_rssToTreeItemMapping[RSS::Session::instance()->rootFolder()] = invisibleRootItem(); - - m_unreadStickyItem = new QTreeWidgetItem(this); - m_unreadStickyItem->setData(0, Qt::UserRole, reinterpret_cast(RSS::Session::instance()->rootFolder())); - m_unreadStickyItem->setText(0, tr("Unread (%1)").arg(RSS::Session::instance()->rootFolder()->unreadCount())); - m_unreadStickyItem->setData(0, Qt::DecorationRole, GuiIconProvider::instance()->getIcon("mail-folder-inbox")); - - connect(RSS::Session::instance()->rootFolder(), &RSS::Item::unreadCountChanged, this, &FeedListWidget::handleItemUnreadCountChanged); - - setSortingEnabled(false); - fill(nullptr, RSS::Session::instance()->rootFolder()); - setSortingEnabled(true); - -// setCurrentItem(m_unreadStickyItem); -} - -FeedListWidget::~FeedListWidget() -{ - delete m_unreadStickyItem; -} - -void FeedListWidget::handleItemAdded(RSS::Item *rssItem) -{ - auto parentItem = m_rssToTreeItemMapping.value( - RSS::Session::instance()->itemByPath(RSS::Item::parentPath(rssItem->path()))); - createItem(rssItem, parentItem); -} - -void FeedListWidget::handleFeedStateChanged(RSS::Feed *feed) -{ - QTreeWidgetItem *item = m_rssToTreeItemMapping.value(feed); - Q_ASSERT(item); - - QIcon icon; - if (feed->isLoading()) - icon = QIcon(QStringLiteral(":/icons/loading.png")); - else if (feed->hasError()) - icon = GuiIconProvider::instance()->getIcon(QStringLiteral("unavailable")); - else if (!feed->iconPath().isEmpty()) - icon = QIcon(feed->iconPath()); + setContextMenuPolicy(Qt::CustomContextMenu); + setDragDropMode(QAbstractItemView::InternalMove); + setSelectionMode(QAbstractItemView::ExtendedSelection); + setColumnCount(1); + headerItem()->setText(0, tr("RSS feeds")); + m_unreadStickyItem = new QTreeWidgetItem(this); + m_unreadStickyItem->setText(0, tr("Unread") + QString::fromUtf8(" (") + QString::number(rssmanager->rootFolder()->unreadCount()) + QString(")")); + m_unreadStickyItem->setData(0,Qt::DecorationRole, GuiIconProvider::instance()->getIcon("mail-folder-inbox")); + itemAdded(m_unreadStickyItem, rssmanager->rootFolder()); + connect(this, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(updateCurrentFeed(QTreeWidgetItem*))); + setCurrentItem(m_unreadStickyItem); +} + +FeedListWidget::~FeedListWidget() { + delete m_unreadStickyItem; +} + +void FeedListWidget::itemAdded(QTreeWidgetItem *item, const Rss::FilePtr& file) { + m_rssMapping[item] = file; + if (Rss::FeedPtr feed = qSharedPointerDynamicCast(file)) { + m_feedsItems[feed->id()] = item; + } +} + +void FeedListWidget::itemAboutToBeRemoved(QTreeWidgetItem *item) { + Rss::FilePtr file = m_rssMapping.take(item); + if (Rss::FeedPtr feed = qSharedPointerDynamicCast(file)) { + m_feedsItems.remove(feed->id()); + } else if (Rss::FolderPtr folder = qSharedPointerDynamicCast(file)) { + Rss::FeedList feeds = folder->getAllFeeds(); + foreach (const Rss::FeedPtr& feed, feeds) { + m_feedsItems.remove(feed->id()); + } + } +} + +bool FeedListWidget::hasFeed(const QString &url) const { + return m_feedsItems.contains(QUrl(url).toString()); +} + +QList FeedListWidget::getAllFeedItems() const { + return m_feedsItems.values(); +} + +QTreeWidgetItem* FeedListWidget::stickyUnreadItem() const { + return m_unreadStickyItem; +} + +QStringList FeedListWidget::getItemPath(QTreeWidgetItem* item) const { + QStringList path; + if (item) { + if (item->parent()) + path << getItemPath(item->parent()); + path.append(getRSSItem(item)->id()); + } + return path; +} + +QList FeedListWidget::getAllOpenFolders(QTreeWidgetItem *parent) const { + QList open_folders; + int nbChildren; + if (parent) + nbChildren = parent->childCount(); + else + nbChildren = topLevelItemCount(); + for (int i=0; ichild(i); else - icon = GuiIconProvider::instance()->getIcon(QStringLiteral("application-rss+xml")); - item->setData(0, Qt::DecorationRole, icon); -} - -void FeedListWidget::handleFeedIconLoaded(RSS::Feed *feed) -{ - if (!feed->isLoading() && !feed->hasError()) { - QTreeWidgetItem *item = m_rssToTreeItemMapping.value(feed); - Q_ASSERT(item); - - item->setData(0, Qt::DecorationRole, QIcon(feed->iconPath())); - } -} - -void FeedListWidget::handleItemUnreadCountChanged(RSS::Item *rssItem) -{ - if (rssItem == RSS::Session::instance()->rootFolder()) { - m_unreadStickyItem->setText(0, tr("Unread (%1)").arg(RSS::Session::instance()->rootFolder()->unreadCount())); - } - else { - QTreeWidgetItem *item = mapRSSItem(rssItem); - Q_ASSERT(item); - item->setData(0, Qt::DisplayRole, QString("%1 (%2)").arg(rssItem->name()).arg(rssItem->unreadCount())); - } -} - -void FeedListWidget::handleItemPathChanged(RSS::Item *rssItem) -{ - QTreeWidgetItem *item = mapRSSItem(rssItem); - Q_ASSERT(item); - - item->setData(0, Qt::DisplayRole, QString("%1 (%2)").arg(rssItem->name()).arg(rssItem->unreadCount())); - - RSS::Item *parentRssItem = RSS::Session::instance()->itemByPath(RSS::Item::parentPath(rssItem->path())); - QTreeWidgetItem *parentItem = mapRSSItem(parentRssItem); - Q_ASSERT(parentItem); - - parentItem->addChild(item); -} - -void FeedListWidget::handleItemAboutToBeRemoved(RSS::Item *rssItem) -{ - rssItem->disconnect(this); - delete m_rssToTreeItemMapping.take(rssItem); - - // RSS Item is still valid in this slot so if it is the last - // item we should prevent Unread list populating - if (m_rssToTreeItemMapping.size() == 1) - setCurrentItem(nullptr); -} - -QTreeWidgetItem *FeedListWidget::stickyUnreadItem() const -{ - return m_unreadStickyItem; -} - -QList FeedListWidget::getAllOpenedFolders(QTreeWidgetItem *parent) const -{ - QList openedFolders; - int nbChildren = (parent ? parent->childCount() : topLevelItemCount()); - for (int i = 0; i < nbChildren; ++i) { - QTreeWidgetItem *item (parent ? parent->child(i) : topLevelItem(i)); - if (isFolder(item) && item->isExpanded()) { - QList openedSubfolders = getAllOpenedFolders(item); - if (!openedSubfolders.empty()) - openedFolders << openedSubfolders; - else - openedFolders << item; - } + item = topLevelItem(i); + if (isFolder(item) && item->isExpanded()) { + QList open_subfolders = getAllOpenFolders(item); + if (!open_subfolders.empty()) { + open_folders << open_subfolders; + } else { + open_folders << item; + } + } + } + return open_folders; +} + +QList FeedListWidget::getAllFeedItems(QTreeWidgetItem* folder) { + QList feeds; + const int nbChildren = folder->childCount(); + for (int i=0; ichild(i); + if (isFeed(item)) { + feeds << item; + } else { + feeds << getAllFeedItems(item); } - return openedFolders; -} - -RSS::Item *FeedListWidget::getRSSItem(QTreeWidgetItem *item) const -{ - if (!item) return nullptr; - - return reinterpret_cast(item->data(0, Qt::UserRole).value()); + } + return feeds; } -QTreeWidgetItem *FeedListWidget::mapRSSItem(RSS::Item *rssItem) const -{ - return m_rssToTreeItemMapping.value(rssItem); -} - -QString FeedListWidget::itemPath(QTreeWidgetItem *item) const -{ - return getRSSItem(item)->path(); +Rss::FilePtr FeedListWidget::getRSSItem(QTreeWidgetItem *item) const { + return m_rssMapping.value(item, Rss::FilePtr()); } bool FeedListWidget::isFeed(QTreeWidgetItem *item) const { - return qobject_cast(getRSSItem(item)); + return (qSharedPointerDynamicCast(m_rssMapping.value(item)) != NULL); } bool FeedListWidget::isFolder(QTreeWidgetItem *item) const { - return qobject_cast(getRSSItem(item)); + return (qSharedPointerDynamicCast(m_rssMapping.value(item)) != NULL); } -void FeedListWidget::dragMoveEvent(QDragMoveEvent *event) -{ - QTreeWidget::dragMoveEvent(event); - - QTreeWidgetItem *item = itemAt(event->pos()); - // Prohibit dropping onto global unread counter - if (item == m_unreadStickyItem) - event->ignore(); - // Prohibit dragging of global unread counter - else if (selectedItems().contains(m_unreadStickyItem)) - event->ignore(); - // Prohibit dropping onto feeds - else if (item && isFeed(item)) - event->ignore(); -} - -void FeedListWidget::dropEvent(QDropEvent *event) -{ - QTreeWidgetItem *destFolderItem = itemAt(event->pos()); - RSS::Folder *destFolder = (destFolderItem - ? static_cast(getRSSItem(destFolderItem)) - : RSS::Session::instance()->rootFolder()); - - // move as much items as possible - foreach (QTreeWidgetItem *srcItem, selectedItems()) { - auto rssItem = getRSSItem(srcItem); - RSS::Session::instance()->moveItem(rssItem, RSS::Item::joinPath(destFolder->path(), rssItem->name())); - } - - QTreeWidget::dropEvent(event); - if (destFolderItem) - destFolderItem->setExpanded(true); -} - -QTreeWidgetItem *FeedListWidget::createItem(RSS::Item *rssItem, QTreeWidgetItem *parentItem) -{ - QTreeWidgetItem *item = new QTreeWidgetItem; - item->setData(0, Qt::DisplayRole, QString("%1 (%2)").arg(rssItem->name()).arg(rssItem->unreadCount())); - item->setData(0, Qt::UserRole, reinterpret_cast(rssItem)); - m_rssToTreeItemMapping[rssItem] = item; - - QIcon icon; - if (auto feed = qobject_cast(rssItem)) { - if (feed->isLoading()) - icon = QIcon(QStringLiteral(":/icons/loading.png")); - else if (feed->hasError()) - icon = GuiIconProvider::instance()->getIcon(QStringLiteral("unavailable")); - else if (!feed->iconPath().isEmpty()) - icon = QIcon(feed->iconPath()); - else - icon = GuiIconProvider::instance()->getIcon(QStringLiteral("application-rss+xml")); - } - else { - icon = GuiIconProvider::instance()->getIcon("inode-directory"); - } - item->setData(0, Qt::DecorationRole, icon); - - connect(rssItem, &RSS::Item::unreadCountChanged, this, &FeedListWidget::handleItemUnreadCountChanged); - - if (!parentItem || (parentItem == m_unreadStickyItem)) - addTopLevelItem(item); - else - parentItem->addChild(item); - - return item; +QString FeedListWidget::getItemID(QTreeWidgetItem *item) const { + return m_rssMapping.value(item)->id(); } -void FeedListWidget::fill(QTreeWidgetItem *parent, RSS::Folder *rssParent) -{ - foreach (auto rssItem, rssParent->items()) { - QTreeWidgetItem *item = createItem(rssItem, parent); - // Recursive call if this is a folder. - if (auto folder = qobject_cast(rssItem)) - fill(item, folder); - } +QTreeWidgetItem* FeedListWidget::getTreeItemFromUrl(const QString &url) const { + return m_feedsItems.value(url, 0); +} + +Rss::FeedPtr FeedListWidget::getRSSItemFromUrl(const QString &url) const { + return qSharedPointerDynamicCast(getRSSItem(getTreeItemFromUrl(url))); +} + +QTreeWidgetItem* FeedListWidget::currentItem() const { + return m_currentFeed; +} + +QTreeWidgetItem* FeedListWidget::currentFeed() const { + return m_currentFeed; +} + +void FeedListWidget::updateCurrentFeed(QTreeWidgetItem* new_item) { + if (!new_item) return; + if (!m_rssMapping.contains(new_item)) return; + if (isFeed(new_item) || new_item == m_unreadStickyItem) + m_currentFeed = new_item; +} + +void FeedListWidget::dragMoveEvent(QDragMoveEvent * event) { + QTreeWidget::dragMoveEvent(event); + + QTreeWidgetItem *item = itemAt(event->pos()); + // Prohibit dropping onto global unread counter + if (item == m_unreadStickyItem) { + event->ignore(); + return; + } + // Prohibit dragging of global unread counter + if (selectedItems().contains(m_unreadStickyItem)) { + event->ignore(); + return; + } + // Prohibit dropping onto feeds + if (item && isFeed(item)) { + event->ignore(); + return; + } +} + +void FeedListWidget::dropEvent(QDropEvent *event) { + qDebug("dropEvent"); + QList folders_altered; + QTreeWidgetItem *dest_folder_item = itemAt(event->pos()); + Rss::FolderPtr dest_folder; + if (dest_folder_item) { + dest_folder = qSharedPointerCast(getRSSItem(dest_folder_item)); + folders_altered << dest_folder_item; + } else { + dest_folder = m_rssManager->rootFolder(); + } + QList src_items = selectedItems(); + // Check if there is not going to overwrite another file + foreach (QTreeWidgetItem *src_item, src_items) { + Rss::FilePtr file = getRSSItem(src_item); + if (dest_folder->hasChild(file->id())) { + QTreeWidget::dropEvent(event); + return; + } + } + // Proceed with the move + foreach (QTreeWidgetItem *src_item, src_items) { + QTreeWidgetItem *parent_folder = src_item->parent(); + if (parent_folder && !folders_altered.contains(parent_folder)) + folders_altered << parent_folder; + // Actually move the file + Rss::FilePtr file = getRSSItem(src_item); + m_rssManager->moveFile(file, dest_folder); + } + QTreeWidget::dropEvent(event); + if (dest_folder_item) + dest_folder_item->setExpanded(true); + // Emit signal for update + if (!folders_altered.empty()) + emit foldersAltered(folders_altered); } diff -Nru qbittorrent-4.1.3/src/gui/rss/feedlistwidget.h qbittorrent-3.3.15/src/gui/rss/feedlistwidget.h --- qbittorrent-4.1.3/src/gui/rss/feedlistwidget.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/rss/feedlistwidget.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,7 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * Copyright (C) 2010 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2010 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -25,54 +24,67 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact: chris@qbittorrent.org, arnaud@qbittorrent.org */ -#ifndef FEEDLISTWIDGET_H -#define FEEDLISTWIDGET_H +#ifndef FEEDLIST_H +#define FEEDLIST_H -#include #include +#include +#include +#include +#include +#include +#include + +#include "base/rss/rssfile.h" +#include "base/rss/rssfeed.h" +#include "base/rss/rssmanager.h" -namespace RSS -{ - class Article; - class Feed; - class Folder; - class Item; -} - -class FeedListWidget : public QTreeWidget -{ - Q_OBJECT +class FeedListWidget: public QTreeWidget { + Q_OBJECT public: - explicit FeedListWidget(QWidget *parent); - ~FeedListWidget(); + FeedListWidget(QWidget *parent, const Rss::ManagerPtr& rssManager); + ~FeedListWidget(); - QTreeWidgetItem *stickyUnreadItem() const; - QList getAllOpenedFolders(QTreeWidgetItem *parent = nullptr) const; - RSS::Item *getRSSItem(QTreeWidgetItem *item) const; - QTreeWidgetItem *mapRSSItem(RSS::Item *rssItem) const; - QString itemPath(QTreeWidgetItem *item) const; - bool isFeed(QTreeWidgetItem *item) const; - bool isFolder(QTreeWidgetItem *item) const; + bool hasFeed(const QString &url) const; + QList getAllFeedItems() const; + QTreeWidgetItem* stickyUnreadItem() const; + QStringList getItemPath(QTreeWidgetItem* item) const; + QList getAllOpenFolders(QTreeWidgetItem *parent=0) const; + QList getAllFeedItems(QTreeWidgetItem* folder); + Rss::FilePtr getRSSItem(QTreeWidgetItem *item) const; + bool isFeed(QTreeWidgetItem *item) const; + bool isFolder(QTreeWidgetItem *item) const; + QString getItemID(QTreeWidgetItem *item) const; + QTreeWidgetItem* getTreeItemFromUrl(const QString &url) const; + Rss::FeedPtr getRSSItemFromUrl(const QString &url) const; + QTreeWidgetItem* currentItem() const; + QTreeWidgetItem* currentFeed() const; + +public slots: + void itemAdded(QTreeWidgetItem *item, const Rss::FilePtr& file); + void itemAboutToBeRemoved(QTreeWidgetItem *item); + +signals: + void foldersAltered(const QList &folders); private slots: - void handleItemAdded(RSS::Item *rssItem); - void handleFeedStateChanged(RSS::Feed *feed); - void handleFeedIconLoaded(RSS::Feed *feed); - void handleItemUnreadCountChanged(RSS::Item *rssItem); - void handleItemPathChanged(RSS::Item *rssItem); - void handleItemAboutToBeRemoved(RSS::Item *rssItem); + void updateCurrentFeed(QTreeWidgetItem* new_item); -private: - void dragMoveEvent(QDragMoveEvent *event); - void dropEvent(QDropEvent *event); - QTreeWidgetItem *createItem(RSS::Item *rssItem, QTreeWidgetItem *parentItem = nullptr); - void fill(QTreeWidgetItem *parent, RSS::Folder *rssParent); +protected: + void dragMoveEvent(QDragMoveEvent * event); + void dropEvent(QDropEvent *event); - QHash m_rssToTreeItemMapping; - QTreeWidgetItem *m_unreadStickyItem; +private: + Rss::ManagerPtr m_rssManager; + QHash m_rssMapping; + QHash m_feedsItems; + QTreeWidgetItem* m_currentFeed; + QTreeWidgetItem *m_unreadStickyItem; }; -#endif // FEEDLISTWIDGET_H +#endif // FEEDLIST_H diff -Nru qbittorrent-4.1.3/src/gui/rss/htmlbrowser.cpp qbittorrent-3.3.15/src/gui/rss/htmlbrowser.cpp --- qbittorrent-4.1.3/src/gui/rss/htmlbrowser.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/rss/htmlbrowser.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,28 +1,28 @@ #include "htmlbrowser.h" -#include -#include -#include #include -#include -#include #include -#include +#include +#include #include +#include +#include +#include +#include -#include "base/profile.h" +#include "base/utils/fs.h" -HtmlBrowser::HtmlBrowser(QWidget *parent) +HtmlBrowser::HtmlBrowser(QWidget* parent) : QTextBrowser(parent) { m_netManager = new QNetworkAccessManager(this); m_diskCache = new QNetworkDiskCache(this); - m_diskCache->setCacheDirectory(QDir::cleanPath(specialFolderLocation(SpecialFolder::Cache) + "/rss")); + m_diskCache->setCacheDirectory(QDir::cleanPath(Utils::Fs::cacheLocation() + "/rss")); m_diskCache->setMaximumCacheSize(50 * 1024 * 1024); qDebug() << "HtmlBrowser cache path:" << m_diskCache->cacheDirectory() << " max size:" << m_diskCache->maximumCacheSize() / 1024 / 1024 << "MB"; m_netManager->setCache(m_diskCache); - connect(m_netManager, &QNetworkAccessManager::finished, this, &HtmlBrowser::resourceLoaded); + connect(m_netManager, SIGNAL(finished(QNetworkReply *)), this, SLOT(resourceLoaded(QNetworkReply*))); } HtmlBrowser::~HtmlBrowser() @@ -31,20 +31,20 @@ QVariant HtmlBrowser::loadResource(int type, const QUrl &name) { - if (type == QTextDocument::ImageResource) { + if(type == QTextDocument::ImageResource) { QUrl url(name); - if (url.scheme().isEmpty()) + if(url.scheme().isEmpty()) url.setScheme("http"); QIODevice *dev = m_diskCache->data(url); - if (dev != nullptr) { + if(dev != 0) { qDebug() << "HtmlBrowser::loadResource() cache " << url.toString(); QByteArray res = dev->readAll(); delete dev; return res; } - if (!m_activeRequests.contains(url)) { + if(!m_activeRequests.contains(url)) { m_activeRequests.insert(url, true); qDebug() << "HtmlBrowser::loadResource() get " << url.toString(); QNetworkRequest req(url); @@ -62,7 +62,7 @@ { m_activeRequests.remove(reply->request().url()); - if ((reply->error() == QNetworkReply::NoError) && (reply->size() > 0)) { + if(reply->error() == QNetworkReply::NoError && reply->size() > 0) { qDebug() << "HtmlBrowser::resourceLoaded() save " << reply->request().url().toString(); } else { @@ -79,8 +79,8 @@ metaData.setLastModified(QDateTime::currentDateTime()); metaData.setExpirationDate(QDateTime::currentDateTime().addDays(1)); QIODevice *dev = m_diskCache->prepare(metaData); - if (!dev) return; - + if(!dev) + return; QApplication::style()->standardIcon(QStyle::SP_MessageBoxWarning).pixmap(32, 32).save(dev, "PNG"); m_diskCache->insert(dev); } diff -Nru qbittorrent-4.1.3/src/gui/rss/htmlbrowser.h qbittorrent-3.3.15/src/gui/rss/htmlbrowser.h --- qbittorrent-4.1.3/src/gui/rss/htmlbrowser.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/rss/htmlbrowser.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,19 +1,19 @@ #ifndef HTMLBROWSER_H #define HTMLBROWSER_H -#include #include +#include class QNetworkAccessManager; class QNetworkDiskCache; class QNetworkReply; -class HtmlBrowser : public QTextBrowser +class HtmlBrowser: public QTextBrowser { Q_OBJECT public: - explicit HtmlBrowser(QWidget* parent = nullptr); + explicit HtmlBrowser(QWidget* parent = 0); ~HtmlBrowser(); virtual QVariant loadResource(int type, const QUrl &name); diff -Nru qbittorrent-4.1.3/src/gui/rss/rss_imp.cpp qbittorrent-3.3.15/src/gui/rss/rss_imp.cpp --- qbittorrent-4.1.3/src/gui/rss/rss_imp.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/rss/rss_imp.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,806 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez, Arnaud Demaiziere + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org arnaud@qbittorrent.org + */ + +#include "rss_imp.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "feedlistwidget.h" +#include "base/bittorrent/session.h" +#include "base/net/downloadmanager.h" +#include "base/preferences.h" +#include "rsssettingsdlg.h" +#include "base/rss/rssmanager.h" +#include "base/rss/rssfolder.h" +#include "base/rss/rssarticle.h" +#include "base/rss/rssfeed.h" +#include "automatedrssdownloader.h" +#include "guiiconprovider.h" +#include "autoexpandabledialog.h" +#include "addnewtorrentdialog.h" + +#include "ui_rss.h" + +namespace Article +{ + enum ArticleRoles + { + TitleRole = Qt::DisplayRole, + IconRole = Qt::DecorationRole, + ColorRole = Qt::ForegroundRole, + IdRole = Qt::UserRole + 1, + FeedUrlRole = Qt::UserRole + 2 + }; +} + +// display a right-click menu +void RSSImp::displayRSSListMenu(const QPoint &pos) +{ + if (!m_feedList->indexAt(pos).isValid()) + // No item under the mouse, clear selection + m_feedList->clearSelection(); + QMenu myRSSListMenu(this); + QList selectedItems = m_feedList->selectedItems(); + if (selectedItems.size() > 0) { + myRSSListMenu.addAction(m_ui->actionUpdate); + myRSSListMenu.addAction(m_ui->actionMark_items_read); + myRSSListMenu.addSeparator(); + if (selectedItems.size() == 1) { + if (m_feedList->getRSSItem(selectedItems.first()) != m_rssManager->rootFolder()) { + myRSSListMenu.addAction(m_ui->actionRename); + myRSSListMenu.addAction(m_ui->actionDelete); + myRSSListMenu.addSeparator(); + if (m_feedList->isFolder(selectedItems.first())) + myRSSListMenu.addAction(m_ui->actionNew_folder); + } + } + else { + myRSSListMenu.addAction(m_ui->actionDelete); + myRSSListMenu.addSeparator(); + } + myRSSListMenu.addAction(m_ui->actionNew_subscription); + if (m_feedList->isFeed(selectedItems.first())) { + myRSSListMenu.addSeparator(); + myRSSListMenu.addAction(m_ui->actionCopy_feed_URL); + } + } + else { + myRSSListMenu.addAction(m_ui->actionNew_subscription); + myRSSListMenu.addAction(m_ui->actionNew_folder); + myRSSListMenu.addSeparator(); + myRSSListMenu.addAction(m_ui->actionUpdate_all_feeds); + } + myRSSListMenu.exec(QCursor::pos()); +} + +void RSSImp::displayItemsListMenu(const QPoint &) +{ + QMenu myItemListMenu(this); + QList selectedItems = m_ui->listArticles->selectedItems(); + if (selectedItems.size() <= 0) + return; + + bool hasTorrent = false; + bool hasLink = false; + foreach (const QListWidgetItem *item, selectedItems) { + if (!item) continue; + Rss::FeedPtr feed = m_feedList->getRSSItemFromUrl(item->data(Article::FeedUrlRole).toString()); + if (!feed) continue; + Rss::ArticlePtr article = feed->getItem(item->data(Article::IdRole).toString()); + if (!article) continue; + + if (!article->torrentUrl().isEmpty()) + hasTorrent = true; + if (!article->link().isEmpty()) + hasLink = true; + if (hasTorrent && hasLink) + break; + } + if (hasTorrent) + myItemListMenu.addAction(m_ui->actionDownload_torrent); + if (hasLink) + myItemListMenu.addAction(m_ui->actionOpen_news_URL); + if (hasTorrent || hasLink) + myItemListMenu.exec(QCursor::pos()); +} + +void RSSImp::askNewFolder() +{ + QTreeWidgetItem *parent_item = 0; + Rss::FolderPtr rss_parent; + if (m_feedList->selectedItems().size() > 0) { + parent_item = m_feedList->selectedItems().at(0); + rss_parent = qSharedPointerDynamicCast(m_feedList->getRSSItem(parent_item)); + Q_ASSERT(rss_parent); + } + else { + rss_parent = m_rssManager->rootFolder(); + } + bool ok; + QString new_name = AutoExpandableDialog::getText(this, tr("Please choose a folder name"), tr("Folder name:"), QLineEdit::Normal, tr("New folder"), &ok); + if (!ok || rss_parent->hasChild(new_name)) + return; + + Rss::FolderPtr newFolder(new Rss::Folder(new_name)); + rss_parent->addFile(newFolder); + QTreeWidgetItem *folderItem = createFolderListItem(newFolder); + if (parent_item) + parent_item->addChild(folderItem); + else + m_feedList->addTopLevelItem(folderItem); + // Notify TreeWidget + m_feedList->itemAdded(folderItem, newFolder); + // Expand parent folder to display new folder + if (parent_item) + parent_item->setExpanded(true); + m_feedList->setCurrentItem(folderItem); + m_rssManager->saveStreamList(); +} + +// add a stream by a button +void RSSImp::on_newFeedButton_clicked() +{ + // Determine parent folder for new feed + QTreeWidgetItem *parent_item = 0; + QList selected_items = m_feedList->selectedItems(); + if (!selected_items.empty()) { + parent_item = selected_items.first(); + // Consider the case where the user clicked on Unread item + if (parent_item == m_feedList->stickyUnreadItem()) + parent_item = 0; + else + if (!m_feedList->isFolder(parent_item)) + parent_item = parent_item->parent(); + } + Rss::FolderPtr rss_parent; + if (parent_item) + rss_parent = qSharedPointerCast(m_feedList->getRSSItem(parent_item)); + else + rss_parent = m_rssManager->rootFolder(); + // Ask for feed URL + bool ok; + QString clip_txt = qApp->clipboard()->text(); + QString default_url = "http://"; + if (clip_txt.startsWith("http://", Qt::CaseInsensitive) || clip_txt.startsWith("https://", Qt::CaseInsensitive) || clip_txt.startsWith("ftp://", Qt::CaseInsensitive)) + default_url = clip_txt; + + QString newUrl = AutoExpandableDialog::getText(this, tr("Please type a RSS stream URL"), tr("Stream URL:"), QLineEdit::Normal, default_url, &ok); + if (!ok) + return; + + newUrl = newUrl.trimmed(); + if (newUrl.isEmpty()) + return; + + if (m_feedList->hasFeed(newUrl)) { + QMessageBox::warning(this, "qBittorrent", + tr("This RSS feed is already in the list."), + QMessageBox::Ok); + return; + } + + Rss::FeedPtr stream(new Rss::Feed(newUrl, m_rssManager.data())); + rss_parent->addFile(stream); + // Create TreeWidget item + QTreeWidgetItem *item = createFolderListItem(stream); + if (parent_item) + parent_item->addChild(item); + else + m_feedList->addTopLevelItem(item); + // Notify TreeWidget + m_feedList->itemAdded(item, stream); + // Expand parent folder to display new feed + if (parent_item) + parent_item->setExpanded(true); + m_feedList->setCurrentItem(item); + m_rssManager->saveStreamList(); +} + +// delete a stream by a button +void RSSImp::deleteSelectedItems() +{ + QList selectedItems = m_feedList->selectedItems(); + if (selectedItems.isEmpty()) + return; + if ((selectedItems.size() == 1) && (selectedItems.first() == m_feedList->stickyUnreadItem())) + return; + + QMessageBox::StandardButton answer = QMessageBox::question(this, tr("Deletion confirmation"), + tr("Are you sure you want to delete the selected RSS feeds?"), + QMessageBox::Yes | QMessageBox::No, QMessageBox::No); + if (answer == QMessageBox::No) + return; + + QList deleted; + + foreach (QTreeWidgetItem *item, selectedItems) { + if (item == m_feedList->stickyUnreadItem()) + continue; + Rss::FilePtr rss_item = m_feedList->getRSSItem(item); + QTreeWidgetItem *parent = item->parent(); + // Notify TreeWidget + m_feedList->itemAboutToBeRemoved(item); + // Actually delete the item + rss_item->parentFolder()->removeChild(rss_item->id()); + deleted << rss_item->id(); + delete item; + // Update parents count + while (parent && (parent != m_feedList->invisibleRootItem())) { + updateItemInfos(parent); + parent = parent->parent(); + } + } + m_rssManager->saveStreamList(); + + foreach (const QString &feed_id, deleted) + m_rssManager->forwardFeedInfosChanged(feed_id, "", 0); + + // Update Unread items + updateItemInfos(m_feedList->stickyUnreadItem()); + if (m_feedList->currentItem() == m_feedList->stickyUnreadItem()) + populateArticleList(m_feedList->stickyUnreadItem()); +} + +void RSSImp::loadFoldersOpenState() +{ + QStringList open_folders = Preferences::instance()->getRssOpenFolders(); + foreach (const QString &var_path, open_folders) { + QStringList path = var_path.split("\\"); + QTreeWidgetItem *parent = 0; + foreach (const QString &name, path) { + int nbChildren = 0; + if (parent) + nbChildren = parent->childCount(); + else + nbChildren = m_feedList->topLevelItemCount(); + for (int i = 0; i < nbChildren; ++i) { + QTreeWidgetItem *child; + if (parent) + child = parent->child(i); + else + child = m_feedList->topLevelItem(i); + if (m_feedList->getRSSItem(child)->id() == name) { + parent = child; + parent->setExpanded(true); + qDebug("expanding folder %s", qPrintable(name)); + break; + } + } + } + } +} + +void RSSImp::saveFoldersOpenState() +{ + QStringList open_folders; + QList items = m_feedList->getAllOpenFolders(); + foreach (QTreeWidgetItem *item, items) { + QString path = m_feedList->getItemPath(item).join("\\"); + qDebug("saving open folder: %s", qPrintable(path)); + open_folders << path; + } + Preferences::instance()->setRssOpenFolders(open_folders); +} + +// refresh all streams by a button +void RSSImp::refreshAllFeeds() +{ + foreach (QTreeWidgetItem *item, m_feedList->getAllFeedItems()) + item->setData(0, Qt::DecorationRole, QVariant(QIcon(":/icons/loading.png"))); + m_rssManager->refresh(); +} + +void RSSImp::downloadSelectedTorrents() +{ + QList selected_items = m_ui->listArticles->selectedItems(); + if (selected_items.size() <= 0) + return; + foreach (QListWidgetItem *item, selected_items) { + if (!item) continue; + Rss::FeedPtr feed = m_feedList->getRSSItemFromUrl(item->data(Article::FeedUrlRole).toString()); + if (!feed) continue; + Rss::ArticlePtr article = feed->getItem(item->data(Article::IdRole).toString()); + if (!article) continue; + + // Mark as read + article->markAsRead(); + item->setData(Article::ColorRole, QVariant(QColor("grey"))); + item->setData(Article::IconRole, QVariant(QIcon(":/icons/sphere.png"))); + + if (article->torrentUrl().isEmpty()) + continue; + if (AddNewTorrentDialog::isEnabled()) + AddNewTorrentDialog::show(article->torrentUrl()); + else + BitTorrent::Session::instance()->addTorrent(article->torrentUrl()); + } + // Decrement feed nb unread news + updateItemInfos(m_feedList->stickyUnreadItem()); + updateItemInfos(m_feedList->getTreeItemFromUrl(selected_items.first()->data(Article::FeedUrlRole).toString())); +} + +// open the url of the selected RSS articles in the Web browser +void RSSImp::openSelectedArticlesUrls() +{ + QList selected_items = m_ui->listArticles->selectedItems(); + if (selected_items.size() <= 0) + return; + foreach (QListWidgetItem *item, selected_items) { + if (!item) continue; + Rss::FeedPtr feed = m_feedList->getRSSItemFromUrl(item->data(Article::FeedUrlRole).toString()); + if (!feed) continue; + Rss::ArticlePtr article = feed->getItem(item->data(Article::IdRole).toString()); + if (!article) continue; + + // Mark as read + article->markAsRead(); + item->setData(Article::ColorRole, QVariant(QColor("grey"))); + item->setData(Article::IconRole, QVariant(QIcon(":/icons/sphere.png"))); + + const QString link = article->link(); + if (!link.isEmpty()) + QDesktopServices::openUrl(QUrl(link)); + } + // Decrement feed nb unread news + updateItemInfos(m_feedList->stickyUnreadItem()); + updateItemInfos(m_feedList->getTreeItemFromUrl(selected_items.first()->data(Article::FeedUrlRole).toString())); +} + +// right-click on stream : give it an alias +void RSSImp::renameSelectedRssFile() +{ + QList selectedItems = m_feedList->selectedItems(); + if (selectedItems.size() != 1) + return; + QTreeWidgetItem *item = selectedItems.first(); + if (item == m_feedList->stickyUnreadItem()) + return; + Rss::FilePtr rss_item = m_feedList->getRSSItem(item); + bool ok; + QString newName; + do { + newName = AutoExpandableDialog::getText(this, tr("Please choose a new name for this RSS feed"), tr("New feed name:"), QLineEdit::Normal, m_feedList->getRSSItem(item)->displayName(), &ok); + // Check if name is already taken + if (ok) { + if (rss_item->parentFolder()->hasChild(newName)) { + QMessageBox::warning(0, tr("Name already in use"), tr("This name is already used by another item, please choose another one.")); + ok = false; + } + } + else { + return; + } + } while (!ok); + // Rename item + rss_item->rename(newName); + m_rssManager->saveStreamList(); + // Update TreeWidget + updateItemInfos(item); +} + +// right-click on stream : refresh it +void RSSImp::refreshSelectedItems() +{ + QList selectedItems = m_feedList->selectedItems(); + foreach (QTreeWidgetItem *item, selectedItems) { + Rss::FilePtr file = m_feedList->getRSSItem(item); + // Update icons + if (item == m_feedList->stickyUnreadItem()) { + refreshAllFeeds(); + return; + } + else { + if (!file->refresh()) + continue; + // Update UI + if (qSharedPointerDynamicCast(file)) { + item->setData(0, Qt::DecorationRole, QVariant(QIcon(":/icons/loading.png"))); + } + else if (qSharedPointerDynamicCast(file)) { + // Update feeds in the folder + foreach (QTreeWidgetItem *feed, m_feedList->getAllFeedItems(item)) + feed->setData(0, Qt::DecorationRole, QVariant(QIcon(":/icons/loading.png"))); + } + } + } +} + +void RSSImp::copySelectedFeedsURL() +{ + QStringList URLs; + QList selectedItems = m_feedList->selectedItems(); + QTreeWidgetItem *item; + foreach (item, selectedItems) + if (m_feedList->isFeed(item)) + URLs << m_feedList->getItemID(item); + qApp->clipboard()->setText(URLs.join("\n")); +} + +void RSSImp::on_markReadButton_clicked() +{ + QList selectedItems = m_feedList->selectedItems(); + foreach (QTreeWidgetItem *item, selectedItems) { + Rss::FilePtr rss_item = m_feedList->getRSSItem(item); + Q_ASSERT(rss_item); + rss_item->markAsRead(); + updateItemInfos(item); + } + // Update article list + if (!selectedItems.isEmpty()) + populateArticleList(m_feedList->currentItem()); +} + +QTreeWidgetItem *RSSImp::createFolderListItem(const Rss::FilePtr &rssFile) +{ + Q_ASSERT(rssFile); + QTreeWidgetItem *item = new QTreeWidgetItem; + item->setData(0, Qt::DisplayRole, QVariant(rssFile->displayName() + QString::fromUtf8(" (") + QString::number(rssFile->unreadCount()) + QString(")"))); + item->setData(0, Qt::DecorationRole, QIcon(rssFile->iconPath())); + + return item; +} + +void RSSImp::fillFeedsList(QTreeWidgetItem *parent, const Rss::FolderPtr &rss_parent) +{ + QList children; + if (parent) + children = rss_parent->getContent(); + else + children = m_rssManager->rootFolder()->getContent(); + foreach (const Rss::FilePtr &rssFile, children) { + QTreeWidgetItem *item = createFolderListItem(rssFile); + Q_ASSERT(item); + if (parent) + parent->addChild(item); + else + m_feedList->addTopLevelItem(item); + + // Notify TreeWidget of item addition + m_feedList->itemAdded(item, rssFile); + + // Recursive call if this is a folder. + if (Rss::FolderPtr folder = qSharedPointerDynamicCast(rssFile)) + fillFeedsList(item, folder); + } +} + +QListWidgetItem *RSSImp::createArticleListItem(const Rss::ArticlePtr &article) +{ + Q_ASSERT(article); + QListWidgetItem *item = new QListWidgetItem; + + item->setData(Article::TitleRole, article->title()); + item->setData(Article::FeedUrlRole, article->parent()->url()); + item->setData(Article::IdRole, article->guid()); + if (article->isRead()) { + item->setData(Article::ColorRole, QVariant(QColor("grey"))); + item->setData(Article::IconRole, QVariant(QIcon(":/icons/sphere.png"))); + } + else { + item->setData(Article::ColorRole, QVariant(QColor("blue"))); + item->setData(Article::IconRole, QVariant(QIcon(":/icons/sphere2.png"))); + } + + return item; +} + +// fills the newsList +void RSSImp::populateArticleList(QTreeWidgetItem *item) +{ + if (!item) { + m_ui->listArticles->clear(); + return; + } + + Rss::FilePtr rss_item = m_feedList->getRSSItem(item); + if (!rss_item) + return; + + // Clear the list first + m_ui->textBrowser->clear(); + m_currentArticle = 0; + m_ui->listArticles->clear(); + + qDebug("Getting the list of news"); + Rss::ArticleList articles; + if (rss_item == m_rssManager->rootFolder()) + articles = rss_item->unreadArticleListByDateDesc(); + else + articles = rss_item->articleListByDateDesc(); + + qDebug("Got the list of news"); + foreach (const Rss::ArticlePtr &article, articles) { + QListWidgetItem *articleItem = createArticleListItem(article); + m_ui->listArticles->addItem(articleItem); + } + qDebug("Added all news to the GUI"); +} + +// display a news +void RSSImp::refreshTextBrowser() +{ + QList selection = m_ui->listArticles->selectedItems(); + if (selection.empty()) return; + QListWidgetItem *item = selection.first(); + Q_ASSERT(item); + if (item == m_currentArticle) return; + m_currentArticle = item; + + Rss::FeedPtr feed = m_feedList->getRSSItemFromUrl(item->data(Article::FeedUrlRole).toString()); + if (!feed) return; + Rss::ArticlePtr article = feed->getItem(item->data(Article::IdRole).toString()); + if (!article) return; + QString html; + html += "
    "; + html += "
    " + article->title() + "
    "; + if (article->date().isValid()) + html += "
    " + tr("Date: ") + "" + article->date().toLocalTime().toString(Qt::SystemLocaleLongDate) + "
    "; + if (!article->author().isEmpty()) + html += "
    " + tr("Author: ") + "" + article->author() + "
    "; + html += "
    "; + html += "
    "; + if (Qt::mightBeRichText(article->description())) { + html += article->description(); + } + else { + QString description = article->description(); + QRegExp rx; + // If description is plain text, replace BBCode tags with HTML and wrap everything in
     so it looks nice
    +        rx.setMinimal(true);
    +        rx.setCaseSensitivity(Qt::CaseInsensitive);
    +
    +        rx.setPattern("\\[img\\](.+)\\[/img\\]");
    +        description = description.replace(rx, "");
    +
    +        rx.setPattern("\\[url=(\")?(.+)\\1\\]");
    +        description = description.replace(rx, "");
    +        description = description.replace("[/url]", "", Qt::CaseInsensitive);
    +
    +        rx.setPattern("\\[(/)?([bius])\\]");
    +        description = description.replace(rx, "<\\1\\2>");
    +
    +        rx.setPattern("\\[color=(\")?(.+)\\1\\]");
    +        description = description.replace(rx, "");
    +        description = description.replace("[/color]", "", Qt::CaseInsensitive);
    +
    +        rx.setPattern("\\[size=(\")?(.+)\\d\\1\\]");
    +        description = description.replace(rx, "");
    +        description = description.replace("[/size]", "", Qt::CaseInsensitive);
    +
    +        html += "
    " + description + "
    "; + } + html += "
    "; + m_ui->textBrowser->setHtml(html); + article->markAsRead(); + item->setData(Article::ColorRole, QVariant(QColor("grey"))); + item->setData(Article::IconRole, QVariant(QIcon(":/icons/sphere.png"))); + // Decrement feed nb unread news + updateItemInfos(m_feedList->stickyUnreadItem()); + updateItemInfos(m_feedList->getTreeItemFromUrl(item->data(Article::FeedUrlRole).toString())); +} + +void RSSImp::saveSlidersPosition() +{ + // Remember sliders positions + Preferences *const pref = Preferences::instance(); + pref->setRssSideSplitterState(m_ui->splitterSide->saveState()); + pref->setRssMainSplitterState(m_ui->splitterMain->saveState()); + qDebug("Splitters position saved"); +} + +void RSSImp::restoreSlidersPosition() +{ + const Preferences *const pref = Preferences::instance(); + const QByteArray stateSide = pref->getRssSideSplitterState(); + if (!stateSide.isEmpty()) + m_ui->splitterSide->restoreState(stateSide); + const QByteArray stateMain = pref->getRssMainSplitterState(); + if (!stateMain.isEmpty()) + m_ui->splitterMain->restoreState(stateMain); +} + +void RSSImp::updateItemsInfos(const QList &items) +{ + foreach (QTreeWidgetItem *item, items) + updateItemInfos(item); +} + +void RSSImp::updateItemInfos(QTreeWidgetItem *item) +{ + Rss::FilePtr rss_item = m_feedList->getRSSItem(item); + if (!rss_item) + return; + + QString name; + if (rss_item == m_rssManager->rootFolder()) { + name = tr("Unread"); + emit updateRSSCount(rss_item->unreadCount()); + } + else { + name = rss_item->displayName(); + } + item->setText(0, name + QString::fromUtf8(" (") + QString::number(rss_item->unreadCount()) + QString(")")); + // If item has a parent, update it too + if (item->parent()) + updateItemInfos(item->parent()); +} + +void RSSImp::updateFeedIcon(const QString &url, const QString &iconPath) +{ + QTreeWidgetItem *item = m_feedList->getTreeItemFromUrl(url); + + if (item) + item->setData(0, Qt::DecorationRole, QVariant(QIcon(iconPath))); +} + +void RSSImp::updateFeedInfos(const QString &url, const QString &display_name, uint nbUnread) +{ + qDebug() << Q_FUNC_INFO << display_name; + QTreeWidgetItem *item = m_feedList->getTreeItemFromUrl(url); + + if (item) { + Rss::FeedPtr stream = qSharedPointerCast(m_feedList->getRSSItem(item)); + item->setText(0, display_name + QString::fromUtf8(" (") + QString::number(nbUnread) + QString(")")); + if (!stream->isLoading()) + item->setData(0, Qt::DecorationRole, QIcon(stream->iconPath())); + // Update parent + if (item->parent()) + updateItemInfos(item->parent()); + } + + // Update Unread item + updateItemInfos(m_feedList->stickyUnreadItem()); +} + +void RSSImp::onFeedContentChanged(const QString &url) +{ + qDebug() << Q_FUNC_INFO << url; + QTreeWidgetItem *item = m_feedList->getTreeItemFromUrl(url); + // If the feed is selected, update the displayed news + if (m_feedList->currentItem() == item) + populateArticleList(item); + // Update unread items + else if (m_feedList->currentItem() == m_feedList->stickyUnreadItem()) + populateArticleList(m_feedList->stickyUnreadItem()); +} + +void RSSImp::updateRefreshInterval(uint val) +{ + m_rssManager->updateRefreshInterval(val); +} + +RSSImp::RSSImp(QWidget *parent) + : QWidget(parent) + , m_ui(new Ui::RSS()) + , m_rssManager(new Rss::Manager) +{ + m_ui->setupUi(this); + // Icons + m_ui->actionCopy_feed_URL->setIcon(GuiIconProvider::instance()->getIcon("edit-copy")); + m_ui->actionDelete->setIcon(GuiIconProvider::instance()->getIcon("edit-delete")); + m_ui->actionDownload_torrent->setIcon(GuiIconProvider::instance()->getIcon("download")); + m_ui->actionMark_items_read->setIcon(GuiIconProvider::instance()->getIcon("mail-mark-read")); + m_ui->actionNew_folder->setIcon(GuiIconProvider::instance()->getIcon("folder-new")); + m_ui->actionNew_subscription->setIcon(GuiIconProvider::instance()->getIcon("list-add")); + m_ui->actionOpen_news_URL->setIcon(GuiIconProvider::instance()->getIcon("application-x-mswinurl")); + m_ui->actionRename->setIcon(GuiIconProvider::instance()->getIcon("edit-rename")); + m_ui->actionUpdate->setIcon(GuiIconProvider::instance()->getIcon("view-refresh")); + m_ui->actionUpdate_all_feeds->setIcon(GuiIconProvider::instance()->getIcon("view-refresh")); + m_ui->newFeedButton->setIcon(GuiIconProvider::instance()->getIcon("list-add")); + m_ui->markReadButton->setIcon(GuiIconProvider::instance()->getIcon("mail-mark-read")); + m_ui->updateAllButton->setIcon(GuiIconProvider::instance()->getIcon("view-refresh")); + m_ui->rssDownloaderBtn->setIcon(GuiIconProvider::instance()->getIcon("download")); + m_ui->settingsButton->setIcon(GuiIconProvider::instance()->getIcon("preferences-system")); + + m_feedList = new FeedListWidget(m_ui->splitterSide, m_rssManager); + m_ui->splitterSide->insertWidget(0, m_feedList); + editHotkey = new QShortcut(Qt::Key_F2, m_feedList, 0, 0, Qt::WidgetShortcut); + connect(editHotkey, SIGNAL(activated()), SLOT(renameSelectedRssFile())); + connect(m_feedList, SIGNAL(doubleClicked(QModelIndex)), SLOT(renameSelectedRssFile())); + deleteHotkey = new QShortcut(QKeySequence::Delete, m_feedList, 0, 0, Qt::WidgetShortcut); + connect(deleteHotkey, SIGNAL(activated()), SLOT(deleteSelectedItems())); + + m_rssManager->loadStreamList(); + m_feedList->setSortingEnabled(false); + fillFeedsList(); + m_feedList->setSortingEnabled(true); + populateArticleList(m_feedList->currentItem()); + + loadFoldersOpenState(); + connect(m_rssManager.data(), SIGNAL(feedInfosChanged(QString,QString,unsigned int)), SLOT(updateFeedInfos(QString,QString,unsigned int))); + connect(m_rssManager.data(), SIGNAL(feedContentChanged(QString)), SLOT(onFeedContentChanged(QString))); + connect(m_rssManager.data(), SIGNAL(feedIconChanged(QString,QString)), SLOT(updateFeedIcon(QString,QString))); + + connect(m_feedList, SIGNAL(customContextMenuRequested(const QPoint&)), SLOT(displayRSSListMenu(const QPoint&))); + connect(m_ui->listArticles, SIGNAL(customContextMenuRequested(const QPoint&)), SLOT(displayItemsListMenu(const QPoint&))); + + // Feeds list actions + connect(m_ui->actionDelete, SIGNAL(triggered()), this, SLOT(deleteSelectedItems())); + connect(m_ui->actionRename, SIGNAL(triggered()), this, SLOT(renameSelectedRssFile())); + connect(m_ui->actionUpdate, SIGNAL(triggered()), this, SLOT(refreshSelectedItems())); + connect(m_ui->actionNew_folder, SIGNAL(triggered()), this, SLOT(askNewFolder())); + connect(m_ui->actionNew_subscription, SIGNAL(triggered()), this, SLOT(on_newFeedButton_clicked())); + connect(m_ui->actionUpdate_all_feeds, SIGNAL(triggered()), this, SLOT(refreshAllFeeds())); + connect(m_ui->updateAllButton, SIGNAL(clicked()), SLOT(refreshAllFeeds())); + connect(m_ui->actionCopy_feed_URL, SIGNAL(triggered()), this, SLOT(copySelectedFeedsURL())); + connect(m_ui->actionMark_items_read, SIGNAL(triggered()), this, SLOT(on_markReadButton_clicked())); + // News list actions + connect(m_ui->actionOpen_news_URL, SIGNAL(triggered()), this, SLOT(openSelectedArticlesUrls())); + connect(m_ui->actionDownload_torrent, SIGNAL(triggered()), this, SLOT(downloadSelectedTorrents())); + + connect(m_feedList, SIGNAL(currentItemChanged(QTreeWidgetItem *,QTreeWidgetItem *)), this, SLOT(populateArticleList(QTreeWidgetItem *))); + connect(m_feedList, SIGNAL(foldersAltered(QList)), this, SLOT(updateItemsInfos(QList))); + + connect(m_ui->listArticles, SIGNAL(itemSelectionChanged()), this, SLOT(refreshTextBrowser())); + connect(m_ui->listArticles, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(downloadSelectedTorrents())); + + // Restore sliders position + restoreSlidersPosition(); + // Bind saveSliders slots + connect(m_ui->splitterMain, SIGNAL(splitterMoved(int,int)), this, SLOT(saveSlidersPosition())); + connect(m_ui->splitterSide, SIGNAL(splitterMoved(int,int)), this, SLOT(saveSlidersPosition())); + + qDebug("RSSImp constructed"); +} + +RSSImp::~RSSImp() +{ + qDebug("Deleting RSSImp..."); + saveFoldersOpenState(); + delete editHotkey; + delete deleteHotkey; + delete m_feedList; + delete m_ui; + qDebug("RSSImp deleted"); +} + +void RSSImp::on_settingsButton_clicked() +{ + RssSettingsDlg dlg(this); + if (dlg.exec()) + updateRefreshInterval(Preferences::instance()->getRSSRefreshInterval()); +} + +void RSSImp::on_rssDownloaderBtn_clicked() +{ + AutomatedRssDownloader dlg(m_rssManager, this); + dlg.exec(); + if (dlg.isRssDownloaderEnabled()) { + m_rssManager->rootFolder()->recheckRssItemsForDownload(); + refreshAllFeeds(); + } +} diff -Nru qbittorrent-4.1.3/src/gui/rss/rss_imp.h qbittorrent-3.3.15/src/gui/rss/rss_imp.h --- qbittorrent-4.1.3/src/gui/rss/rss_imp.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/rss/rss_imp.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,108 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez, Arnaud Demaiziere + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org arnaud@qbittorrent.org + */ +#ifndef __RSS_IMP_H__ +#define __RSS_IMP_H__ + +#define REFRESH_MAX_LATENCY 600000 + +#include +#include + +#include "base/rss/rssfolder.h" +#include "base/rss/rssmanager.h" + +class FeedListWidget; + +QT_BEGIN_NAMESPACE +class QListWidgetItem; +class QTreeWidgetItem; +QT_END_NAMESPACE + +namespace Ui +{ + class RSS; +} + +class RSSImp: public QWidget +{ + Q_OBJECT + +public: + RSSImp(QWidget * parent); + ~RSSImp(); + +public slots: + void deleteSelectedItems(); + void updateRefreshInterval(uint val); + +signals: + void updateRSSCount(int); + +private slots: + void on_newFeedButton_clicked(); + void refreshAllFeeds(); + void on_markReadButton_clicked(); + void displayRSSListMenu(const QPoint &); + void displayItemsListMenu(const QPoint &); + void renameSelectedRssFile(); + void refreshSelectedItems(); + void copySelectedFeedsURL(); + void populateArticleList(QTreeWidgetItem *item); + void refreshTextBrowser(); + void updateFeedIcon(const QString &url, const QString &icon_path); + void updateFeedInfos(const QString &url, const QString &display_name, uint nbUnread); + void onFeedContentChanged(const QString &url); + void updateItemsInfos(const QList &items); + void updateItemInfos(QTreeWidgetItem *item); + void openSelectedArticlesUrls(); + void downloadSelectedTorrents(); + void fillFeedsList(QTreeWidgetItem *parent = 0, const Rss::FolderPtr &rss_parent = Rss::FolderPtr()); + void saveSlidersPosition(); + void restoreSlidersPosition(); + void askNewFolder(); + void saveFoldersOpenState(); + void loadFoldersOpenState(); + void on_settingsButton_clicked(); + void on_rssDownloaderBtn_clicked(); + +private: + static QListWidgetItem *createArticleListItem(const Rss::ArticlePtr &article); + static QTreeWidgetItem *createFolderListItem(const Rss::FilePtr &rssFile); + +private: + Ui::RSS *m_ui; + Rss::ManagerPtr m_rssManager; + FeedListWidget *m_feedList; + QListWidgetItem *m_currentArticle; + QShortcut *editHotkey; + QShortcut *deleteHotkey; +}; + +#endif diff -Nru qbittorrent-4.1.3/src/gui/rss/rss.pri qbittorrent-3.3.15/src/gui/rss/rss.pri --- qbittorrent-4.1.3/src/gui/rss/rss.pri 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/rss/rss.pri 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,17 @@ +INCLUDEPATH += $$PWD + +HEADERS += $$PWD/rss_imp.h \ + $$PWD/rsssettingsdlg.h \ + $$PWD/feedlistwidget.h \ + $$PWD/automatedrssdownloader.h \ + $$PWD/htmlbrowser.h + +SOURCES += $$PWD/rss_imp.cpp \ + $$PWD/rsssettingsdlg.cpp \ + $$PWD/feedlistwidget.cpp \ + $$PWD/automatedrssdownloader.cpp \ + $$PWD/htmlbrowser.cpp + +FORMS += $$PWD/rss.ui \ + $$PWD/rsssettingsdlg.ui \ + $$PWD/automatedrssdownloader.ui diff -Nru qbittorrent-4.1.3/src/gui/rss/rsssettingsdlg.cpp qbittorrent-3.3.15/src/gui/rss/rsssettingsdlg.cpp --- qbittorrent-4.1.3/src/gui/rss/rsssettingsdlg.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/rss/rsssettingsdlg.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,57 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2010 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#include "rsssettingsdlg.h" +#include "ui_rsssettingsdlg.h" +#include "base/preferences.h" + +RssSettingsDlg::RssSettingsDlg(QWidget *parent) : + QDialog(parent), + ui(new Ui::RssSettingsDlg) +{ + ui->setupUi(this); + // Load settings + const Preferences* const pref = Preferences::instance(); + ui->spinRSSRefresh->setValue(pref->getRSSRefreshInterval()); + ui->spinRSSMaxArticlesPerFeed->setValue(pref->getRSSMaxArticlesPerFeed()); +} + +RssSettingsDlg::~RssSettingsDlg() +{ + qDebug("Deleting the RSS settings dialog"); + delete ui; +} + +void RssSettingsDlg::on_buttonBox_accepted() { + // Save settings + Preferences* const pref = Preferences::instance(); + pref->setRSSRefreshInterval(ui->spinRSSRefresh->value()); + pref->setRSSMaxArticlesPerFeed(ui->spinRSSMaxArticlesPerFeed->value()); +} diff -Nru qbittorrent-4.1.3/src/gui/rss/rsssettingsdlg.h qbittorrent-3.3.15/src/gui/rss/rsssettingsdlg.h --- qbittorrent-4.1.3/src/gui/rss/rsssettingsdlg.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/rss/rsssettingsdlg.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,58 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2010 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef RSSSETTINGSDLG_H +#define RSSSETTINGSDLG_H + +#include + +QT_BEGIN_NAMESPACE +namespace Ui { + class RssSettingsDlg; +} +QT_END_NAMESPACE + +class RssSettingsDlg : public QDialog +{ + Q_OBJECT + +public: + explicit RssSettingsDlg(QWidget *parent = 0); + ~RssSettingsDlg(); + +protected slots: + void on_buttonBox_accepted(); + +private: + Ui::RssSettingsDlg *ui; + +}; + +#endif // RSSSETTINGS_H diff -Nru qbittorrent-4.1.3/src/gui/rss/rsssettingsdlg.ui qbittorrent-3.3.15/src/gui/rss/rsssettingsdlg.ui --- qbittorrent-4.1.3/src/gui/rss/rsssettingsdlg.ui 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/rss/rsssettingsdlg.ui 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,133 @@ + + + RssSettingsDlg + + + + 0 + 0 + 415 + 123 + + + + RSS Reader Settings + + + + + + + + + + + :/icons/oxygen/application-rss+xml.png + + + + + + + RSS feeds refresh interval: + + + + + + + min + + + 1 + + + 999999 + + + 5 + + + + + + + Maximum number of articles per feed: + + + + + + + 9999 + + + 100 + + + + + + + + + Qt::Vertical + + + + 0 + 0 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + buttonBox + accepted() + RssSettingsDlg + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + RssSettingsDlg + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff -Nru qbittorrent-4.1.3/src/gui/rss/rss.ui qbittorrent-3.3.15/src/gui/rss/rss.ui --- qbittorrent-4.1.3/src/gui/rss/rss.ui 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/rss/rss.ui 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,207 @@ + + + RSS + + + + 0 + 0 + 811 + 447 + + + + false + + + Search + + + + + + + + New subscription + + + + + + + Mark items read + + + + + + + Refresh RSS streams + + + Update all + + + + + + + Qt::Horizontal + + + + 0 + 0 + + + + + + + + RSS Downloader... + + + + + + + Settings... + + + + + + + + + + 0 + 0 + + + + Qt::Horizontal + + + + + + + + 75 + true + + + + Torrents: (double-click to download) + + + + + + + + 0 + 0 + + + + Qt::Horizontal + + + + Qt::CustomContextMenu + + + QAbstractItemView::ExtendedSelection + + + + + true + + + + + + + + + + + + Delete + + + Delete + + + + + Rename... + + + Rename + + + + + Update + + + Update + + + + + New subscription... + + + + + Update all feeds + + + Update all feeds + + + + + Mark items read + + + Mark items read + + + + + Download torrent + + + + + Open news URL + + + + + Copy feed URL + + + + + New folder... + + + + + + HtmlBrowser + QTextBrowser +
    htmlbrowser.h
    +
    +
    + + +
    diff -Nru qbittorrent-4.1.3/src/gui/rss/rsswidget.cpp qbittorrent-3.3.15/src/gui/rss/rsswidget.cpp --- qbittorrent-4.1.3/src/gui/rss/rsswidget.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/rss/rsswidget.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,531 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * Copyright (C) 2006 Christophe Dumez - * Copyright (C) 2006 Arnaud Demaiziere - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "rsswidget.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "base/bittorrent/session.h" -#include "base/net/downloadmanager.h" -#include "base/preferences.h" -#include "base/rss/rss_article.h" -#include "base/rss/rss_feed.h" -#include "base/rss/rss_folder.h" -#include "base/rss/rss_session.h" -#include "base/utils/misc.h" -#include "addnewtorrentdialog.h" -#include "articlelistwidget.h" -#include "autoexpandabledialog.h" -#include "automatedrssdownloader.h" -#include "feedlistwidget.h" -#include "guiiconprovider.h" -#include "ui_rsswidget.h" - -RSSWidget::RSSWidget(QWidget *parent) - : QWidget(parent) - , m_ui(new Ui::RSSWidget) -{ - m_ui->setupUi(this); - - // Icons - m_ui->actionCopyFeedURL->setIcon(GuiIconProvider::instance()->getIcon("edit-copy")); - m_ui->actionDelete->setIcon(GuiIconProvider::instance()->getIcon("edit-delete")); - m_ui->actionDownloadTorrent->setIcon(GuiIconProvider::instance()->getIcon("download")); - m_ui->actionMarkItemsRead->setIcon(GuiIconProvider::instance()->getIcon("mail-mark-read")); - m_ui->actionNewFolder->setIcon(GuiIconProvider::instance()->getIcon("folder-new")); - m_ui->actionNewSubscription->setIcon(GuiIconProvider::instance()->getIcon("list-add")); - m_ui->actionOpenNewsURL->setIcon(GuiIconProvider::instance()->getIcon("application-x-mswinurl")); - m_ui->actionRename->setIcon(GuiIconProvider::instance()->getIcon("edit-rename")); - m_ui->actionUpdate->setIcon(GuiIconProvider::instance()->getIcon("view-refresh")); - m_ui->actionUpdateAllFeeds->setIcon(GuiIconProvider::instance()->getIcon("view-refresh")); -#ifndef Q_OS_MAC - m_ui->newFeedButton->setIcon(GuiIconProvider::instance()->getIcon("list-add")); - m_ui->markReadButton->setIcon(GuiIconProvider::instance()->getIcon("mail-mark-read")); - m_ui->updateAllButton->setIcon(GuiIconProvider::instance()->getIcon("view-refresh")); - m_ui->rssDownloaderBtn->setIcon(GuiIconProvider::instance()->getIcon("download")); -#endif - - m_articleListWidget = new ArticleListWidget(m_ui->splitterMain); - m_ui->splitterMain->insertWidget(0, m_articleListWidget); - connect(m_articleListWidget, &ArticleListWidget::customContextMenuRequested, this, &RSSWidget::displayItemsListMenu); - connect(m_articleListWidget, &ArticleListWidget::currentItemChanged, this, &RSSWidget::handleCurrentArticleItemChanged); - connect(m_articleListWidget, &ArticleListWidget::itemDoubleClicked, this, &RSSWidget::downloadSelectedTorrents); - - m_feedListWidget = new FeedListWidget(m_ui->splitterSide); - m_ui->splitterSide->insertWidget(0, m_feedListWidget); - connect(m_feedListWidget, &QAbstractItemView::doubleClicked, this, &RSSWidget::renameSelectedRSSItem); - connect(m_feedListWidget, &QTreeWidget::currentItemChanged, this, &RSSWidget::handleCurrentFeedItemChanged); - connect(m_feedListWidget, &QWidget::customContextMenuRequested, this, &RSSWidget::displayRSSListMenu); - loadFoldersOpenState(); - m_feedListWidget->setCurrentItem(m_feedListWidget->stickyUnreadItem()); - - m_editHotkey = new QShortcut(Qt::Key_F2, m_feedListWidget, nullptr, nullptr, Qt::WidgetShortcut); - connect(m_editHotkey, &QShortcut::activated, this, &RSSWidget::renameSelectedRSSItem); - m_deleteHotkey = new QShortcut(QKeySequence::Delete, m_feedListWidget, nullptr, nullptr, Qt::WidgetShortcut); - connect(m_deleteHotkey, &QShortcut::activated, this, &RSSWidget::deleteSelectedItems); - - // Feeds list actions - connect(m_ui->actionDelete, &QAction::triggered, this, &RSSWidget::deleteSelectedItems); - connect(m_ui->actionRename, &QAction::triggered, this, &RSSWidget::renameSelectedRSSItem); - connect(m_ui->actionUpdate, &QAction::triggered, this, &RSSWidget::refreshSelectedItems); - connect(m_ui->actionNewFolder, &QAction::triggered, this, &RSSWidget::askNewFolder); - connect(m_ui->actionNewSubscription, &QAction::triggered, this, &RSSWidget::on_newFeedButton_clicked); - connect(m_ui->actionUpdateAllFeeds, &QAction::triggered, this, &RSSWidget::refreshAllFeeds); - connect(m_ui->updateAllButton, &QAbstractButton::clicked, this, &RSSWidget::refreshAllFeeds); - connect(m_ui->actionCopyFeedURL, &QAction::triggered, this, &RSSWidget::copySelectedFeedsURL); - connect(m_ui->actionMarkItemsRead, &QAction::triggered, this, &RSSWidget::on_markReadButton_clicked); - - // News list actions - connect(m_ui->actionOpenNewsURL, &QAction::triggered, this, &RSSWidget::openSelectedArticlesUrls); - connect(m_ui->actionDownloadTorrent, &QAction::triggered, this, &RSSWidget::downloadSelectedTorrents); - - // Restore sliders position - restoreSlidersPosition(); - // Bind saveSliders slots - connect(m_ui->splitterMain, &QSplitter::splitterMoved, this, &RSSWidget::saveSlidersPosition); - connect(m_ui->splitterSide, &QSplitter::splitterMoved, this, &RSSWidget::saveSlidersPosition); - - if (RSS::Session::instance()->isProcessingEnabled()) - m_ui->labelWarn->hide(); - connect(RSS::Session::instance(), &RSS::Session::processingStateChanged - , this, &RSSWidget::handleSessionProcessingStateChanged); - connect(RSS::Session::instance()->rootFolder(), &RSS::Folder::unreadCountChanged - , this, &RSSWidget::handleUnreadCountChanged); -} - -RSSWidget::~RSSWidget() -{ - // we need it here to properly mark latest article - // as read without having additional code - m_articleListWidget->clear(); - - saveFoldersOpenState(); - - delete m_editHotkey; - delete m_deleteHotkey; - delete m_feedListWidget; - delete m_ui; -} - -// display a right-click menu -void RSSWidget::displayRSSListMenu(const QPoint &pos) -{ - if (!m_feedListWidget->indexAt(pos).isValid()) - // No item under the mouse, clear selection - m_feedListWidget->clearSelection(); - QMenu myRSSListMenu(this); - QList selectedItems = m_feedListWidget->selectedItems(); - if (selectedItems.size() > 0) { - myRSSListMenu.addAction(m_ui->actionUpdate); - myRSSListMenu.addAction(m_ui->actionMarkItemsRead); - myRSSListMenu.addSeparator(); - if (selectedItems.size() == 1) { - if (selectedItems.first() != m_feedListWidget->stickyUnreadItem()) { - myRSSListMenu.addAction(m_ui->actionRename); - myRSSListMenu.addAction(m_ui->actionDelete); - myRSSListMenu.addSeparator(); - if (m_feedListWidget->isFolder(selectedItems.first())) - myRSSListMenu.addAction(m_ui->actionNewFolder); - } - } - else { - myRSSListMenu.addAction(m_ui->actionDelete); - myRSSListMenu.addSeparator(); - } - myRSSListMenu.addAction(m_ui->actionNewSubscription); - if (m_feedListWidget->isFeed(selectedItems.first())) { - myRSSListMenu.addSeparator(); - myRSSListMenu.addAction(m_ui->actionCopyFeedURL); - } - } - else { - myRSSListMenu.addAction(m_ui->actionNewSubscription); - myRSSListMenu.addAction(m_ui->actionNewFolder); - myRSSListMenu.addSeparator(); - myRSSListMenu.addAction(m_ui->actionUpdateAllFeeds); - } - myRSSListMenu.exec(QCursor::pos()); -} - -void RSSWidget::displayItemsListMenu(const QPoint &) -{ - bool hasTorrent = false; - bool hasLink = false; - foreach (const QListWidgetItem *item, m_articleListWidget->selectedItems()) { - auto article = reinterpret_cast(item->data(Qt::UserRole).value()); - Q_ASSERT(article); - - if (!article->torrentUrl().isEmpty()) - hasTorrent = true; - if (!article->link().isEmpty()) - hasLink = true; - if (hasTorrent && hasLink) - break; - } - - QMenu myItemListMenu(this); - if (hasTorrent) - myItemListMenu.addAction(m_ui->actionDownloadTorrent); - if (hasLink) - myItemListMenu.addAction(m_ui->actionOpenNewsURL); - if (hasTorrent || hasLink) - myItemListMenu.exec(QCursor::pos()); -} - -void RSSWidget::askNewFolder() -{ - bool ok; - QString newName = AutoExpandableDialog::getText( - this, tr("Please choose a folder name"), tr("Folder name:"), QLineEdit::Normal - , tr("New folder"), &ok); - if (!ok) return; - - newName = newName.trimmed(); - if (newName.isEmpty()) return; - - // Determine destination folder for new item - QTreeWidgetItem *destItem = nullptr; - QList selectedItems = m_feedListWidget->selectedItems(); - if (!selectedItems.empty()) { - destItem = selectedItems.first(); - if (!m_feedListWidget->isFolder(destItem)) - destItem = destItem->parent(); - } - // Consider the case where the user clicked on Unread item - RSS::Folder *rssDestFolder = ((!destItem || (destItem == m_feedListWidget->stickyUnreadItem())) - ? RSS::Session::instance()->rootFolder() - : qobject_cast(m_feedListWidget->getRSSItem(destItem))); - - QString error; - const QString newFolderPath = RSS::Item::joinPath(rssDestFolder->path(), newName); - if (!RSS::Session::instance()->addFolder(newFolderPath, &error)) - QMessageBox::warning(this, "qBittorrent", error, QMessageBox::Ok); - - // Expand destination folder to display new feed - if (destItem && (destItem != m_feedListWidget->stickyUnreadItem())) - destItem->setExpanded(true); - // As new RSS items are added synchronously, we can do the following here. - m_feedListWidget->setCurrentItem(m_feedListWidget->mapRSSItem(RSS::Session::instance()->itemByPath(newFolderPath))); -} - -// add a stream by a button -void RSSWidget::on_newFeedButton_clicked() -{ - // Ask for feed URL - const QString clipText = qApp->clipboard()->text(); - const QString defaultURL = (Utils::Misc::isUrl(clipText) ? clipText : "http://"); - - bool ok; - QString newURL = AutoExpandableDialog::getText( - this, tr("Please type a RSS feed URL"), tr("Feed URL:"), QLineEdit::Normal, defaultURL, &ok); - if (!ok) return; - - newURL = newURL.trimmed(); - if (newURL.isEmpty()) return; - - // Determine destination folder for new item - QTreeWidgetItem *destItem = nullptr; - QList selectedItems = m_feedListWidget->selectedItems(); - if (!selectedItems.empty()) { - destItem = selectedItems.first(); - if (!m_feedListWidget->isFolder(destItem)) - destItem = destItem->parent(); - } - // Consider the case where the user clicked on Unread item - RSS::Folder *rssDestFolder = ((!destItem || (destItem == m_feedListWidget->stickyUnreadItem())) - ? RSS::Session::instance()->rootFolder() - : qobject_cast(m_feedListWidget->getRSSItem(destItem))); - - QString error; - // NOTE: We still add feed using legacy way (with URL as feed name) - const QString newFeedPath = RSS::Item::joinPath(rssDestFolder->path(), newURL); - if (!RSS::Session::instance()->addFeed(newURL, newFeedPath, &error)) - QMessageBox::warning(this, "qBittorrent", error, QMessageBox::Ok); - - // Expand destination folder to display new feed - if (destItem && (destItem != m_feedListWidget->stickyUnreadItem())) - destItem->setExpanded(true); - // As new RSS items are added synchronously, we can do the following here. - m_feedListWidget->setCurrentItem(m_feedListWidget->mapRSSItem(RSS::Session::instance()->itemByPath(newFeedPath))); -} - -void RSSWidget::deleteSelectedItems() -{ - QList selectedItems = m_feedListWidget->selectedItems(); - if (selectedItems.isEmpty()) - return; - if ((selectedItems.size() == 1) && (selectedItems.first() == m_feedListWidget->stickyUnreadItem())) - return; - - QMessageBox::StandardButton answer = QMessageBox::question( - this, tr("Deletion confirmation"), tr("Are you sure you want to delete the selected RSS feeds?") - , QMessageBox::Yes | QMessageBox::No, QMessageBox::No); - if (answer == QMessageBox::No) - return; - - foreach (QTreeWidgetItem *item, selectedItems) - if (item != m_feedListWidget->stickyUnreadItem()) - RSS::Session::instance()->removeItem(m_feedListWidget->itemPath(item)); -} - -void RSSWidget::loadFoldersOpenState() -{ - const QStringList openedFolders = Preferences::instance()->getRssOpenFolders(); - foreach (const QString &varPath, openedFolders) { - QTreeWidgetItem *parent = nullptr; - foreach (const QString &name, varPath.split('\\')) { - int nbChildren = (parent ? parent->childCount() : m_feedListWidget->topLevelItemCount()); - for (int i = 0; i < nbChildren; ++i) { - QTreeWidgetItem *child = (parent ? parent->child(i) : m_feedListWidget->topLevelItem(i)); - if (m_feedListWidget->getRSSItem(child)->name() == name) { - parent = child; - parent->setExpanded(true); - break; - } - } - } - } -} - -void RSSWidget::saveFoldersOpenState() -{ - QStringList openedFolders; - foreach (QTreeWidgetItem *item, m_feedListWidget->getAllOpenedFolders()) - openedFolders << m_feedListWidget->itemPath(item); - Preferences::instance()->setRssOpenFolders(openedFolders); -} - -void RSSWidget::refreshAllFeeds() -{ - RSS::Session::instance()->refresh(); -} - -void RSSWidget::downloadSelectedTorrents() -{ - foreach (QListWidgetItem *item, m_articleListWidget->selectedItems()) { - auto article = reinterpret_cast(item->data(Qt::UserRole).value()); - Q_ASSERT(article); - - // Mark as read - article->markAsRead(); - - if (!article->torrentUrl().isEmpty()) { - if (AddNewTorrentDialog::isEnabled()) - AddNewTorrentDialog::show(article->torrentUrl(), window()); - else - BitTorrent::Session::instance()->addTorrent(article->torrentUrl()); - } - } -} - -// open the url of the selected RSS articles in the Web browser -void RSSWidget::openSelectedArticlesUrls() -{ - foreach (QListWidgetItem *item, m_articleListWidget->selectedItems()) { - auto article = reinterpret_cast(item->data(Qt::UserRole).value()); - Q_ASSERT(article); - - // Mark as read - article->markAsRead(); - - if (!article->link().isEmpty()) - QDesktopServices::openUrl(QUrl(article->link())); - } -} - -void RSSWidget::renameSelectedRSSItem() -{ - QList selectedItems = m_feedListWidget->selectedItems(); - if (selectedItems.size() != 1) return; - - QTreeWidgetItem *item = selectedItems.first(); - if (item == m_feedListWidget->stickyUnreadItem()) - return; - - RSS::Item *rssItem = m_feedListWidget->getRSSItem(item); - const QString parentPath = RSS::Item::parentPath(rssItem->path()); - bool ok; - do { - QString newName = AutoExpandableDialog::getText( - this, tr("Please choose a new name for this RSS feed"), tr("New feed name:") - , QLineEdit::Normal, rssItem->name(), &ok); - // Check if name is already taken - if (!ok) return; - - QString error; - if (!RSS::Session::instance()->moveItem(rssItem, RSS::Item::joinPath(parentPath, newName), &error)) { - QMessageBox::warning(nullptr, tr("Rename failed"), error); - ok = false; - } - } while (!ok); -} - -void RSSWidget::refreshSelectedItems() -{ - foreach (QTreeWidgetItem *item, m_feedListWidget->selectedItems()) { - if (item == m_feedListWidget->stickyUnreadItem()) { - refreshAllFeeds(); - return; - } - - m_feedListWidget->getRSSItem(item)->refresh(); - } -} - -void RSSWidget::copySelectedFeedsURL() -{ - QStringList URLs; - foreach (QTreeWidgetItem *item, m_feedListWidget->selectedItems()) { - if (auto feed = qobject_cast(m_feedListWidget->getRSSItem(item))) - URLs << feed->url(); - } - qApp->clipboard()->setText(URLs.join('\n')); -} - -void RSSWidget::handleCurrentFeedItemChanged(QTreeWidgetItem *currentItem) -{ - m_articleListWidget->setRSSItem(m_feedListWidget->getRSSItem(currentItem) - , (currentItem == m_feedListWidget->stickyUnreadItem())); -} - -void RSSWidget::on_markReadButton_clicked() -{ - foreach (QTreeWidgetItem *item, m_feedListWidget->selectedItems()) { - m_feedListWidget->getRSSItem(item)->markAsRead(); - if (item == m_feedListWidget->stickyUnreadItem()) - break; // all items was read - } -} - -// display a news -void RSSWidget::handleCurrentArticleItemChanged(QListWidgetItem *currentItem, QListWidgetItem *previousItem) -{ - m_ui->textBrowser->clear(); - - if (previousItem) { - auto article = m_articleListWidget->getRSSArticle(previousItem); - Q_ASSERT(article); - article->markAsRead(); - } - - if (!currentItem) return; - - auto article = m_articleListWidget->getRSSArticle(currentItem); - Q_ASSERT(article); - - QString html; - html += "
    "; - html += "
    " + article->title() + "
    "; - if (article->date().isValid()) - html += "
    " + tr("Date: ") + "" + article->date().toLocalTime().toString(Qt::SystemLocaleLongDate) + "
    "; - if (!article->author().isEmpty()) - html += "
    " + tr("Author: ") + "" + article->author() + "
    "; - html += "
    "; - html += "
    "; - if (Qt::mightBeRichText(article->description())) { - html += article->description(); - } - else { - QString description = article->description(); - QRegularExpression rx; - // If description is plain text, replace BBCode tags with HTML and wrap everything in
     so it looks nice
    -        rx.setPatternOptions(QRegularExpression::InvertedGreedinessOption
    -            | QRegularExpression::CaseInsensitiveOption);
    -
    -        rx.setPattern("\\[img\\](.+)\\[/img\\]");
    -        description = description.replace(rx, "");
    -
    -        rx.setPattern("\\[url=(\")?(.+)\\1\\]");
    -        description = description.replace(rx, "");
    -        description = description.replace("[/url]", "", Qt::CaseInsensitive);
    -
    -        rx.setPattern("\\[(/)?([bius])\\]");
    -        description = description.replace(rx, "<\\1\\2>");
    -
    -        rx.setPattern("\\[color=(\")?(.+)\\1\\]");
    -        description = description.replace(rx, "");
    -        description = description.replace("[/color]", "", Qt::CaseInsensitive);
    -
    -        rx.setPattern("\\[size=(\")?(.+)\\d\\1\\]");
    -        description = description.replace(rx, "");
    -        description = description.replace("[/size]", "", Qt::CaseInsensitive);
    -
    -        html += "
    " + description + "
    "; - } - html += "
    "; - m_ui->textBrowser->setHtml(html); -} - -void RSSWidget::saveSlidersPosition() -{ - // Remember sliders positions - Preferences *const pref = Preferences::instance(); - pref->setRssSideSplitterState(m_ui->splitterSide->saveState()); - pref->setRssMainSplitterState(m_ui->splitterMain->saveState()); -} - -void RSSWidget::restoreSlidersPosition() -{ - const Preferences *const pref = Preferences::instance(); - const QByteArray stateSide = pref->getRssSideSplitterState(); - if (!stateSide.isEmpty()) - m_ui->splitterSide->restoreState(stateSide); - const QByteArray stateMain = pref->getRssMainSplitterState(); - if (!stateMain.isEmpty()) - m_ui->splitterMain->restoreState(stateMain); -} - -void RSSWidget::updateRefreshInterval(uint val) -{ - RSS::Session::instance()->setRefreshInterval(val); -} - -void RSSWidget::on_rssDownloaderBtn_clicked() -{ - AutomatedRssDownloader(this).exec(); -} - -void RSSWidget::handleSessionProcessingStateChanged(bool enabled) -{ - m_ui->labelWarn->setVisible(!enabled); -} - -void RSSWidget::handleUnreadCountChanged() -{ - emit unreadCountUpdated(RSS::Session::instance()->rootFolder()->unreadCount()); -} diff -Nru qbittorrent-4.1.3/src/gui/rss/rsswidget.h qbittorrent-3.3.15/src/gui/rss/rsswidget.h --- qbittorrent-4.1.3/src/gui/rss/rsswidget.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/rss/rsswidget.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,92 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * Copyright (C) 2006 Christophe Dumez - * Copyright (C) 2006 Arnaud Demaiziere - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef RSSWIDGET_H -#define RSSWIDGET_H - -#include -#include - -class ArticleListWidget; -class FeedListWidget; -class QListWidgetItem; -class QTreeWidgetItem; - -namespace Ui -{ - class RSSWidget; -} - -class RSSWidget : public QWidget -{ - Q_OBJECT - -public: - RSSWidget(QWidget *parent); - ~RSSWidget(); - -public slots: - void deleteSelectedItems(); - void updateRefreshInterval(uint val); - -signals: - void unreadCountUpdated(int count); - -private slots: - void on_newFeedButton_clicked(); - void refreshAllFeeds(); - void on_markReadButton_clicked(); - void displayRSSListMenu(const QPoint &); - void displayItemsListMenu(const QPoint &); - void renameSelectedRSSItem(); - void refreshSelectedItems(); - void copySelectedFeedsURL(); - void handleCurrentFeedItemChanged(QTreeWidgetItem *currentItem); - void handleCurrentArticleItemChanged(QListWidgetItem *currentItem, QListWidgetItem *previousItem); - void openSelectedArticlesUrls(); - void downloadSelectedTorrents(); - void saveSlidersPosition(); - void restoreSlidersPosition(); - void askNewFolder(); - void saveFoldersOpenState(); - void loadFoldersOpenState(); - void on_rssDownloaderBtn_clicked(); - void handleSessionProcessingStateChanged(bool enabled); - void handleUnreadCountChanged(); - -private: - Ui::RSSWidget *m_ui; - ArticleListWidget *m_articleListWidget; - FeedListWidget *m_feedListWidget; - QShortcut *m_editHotkey; - QShortcut *m_deleteHotkey; -}; - -#endif // RSSWIDGET_H diff -Nru qbittorrent-4.1.3/src/gui/rss/rsswidget.ui qbittorrent-3.3.15/src/gui/rss/rsswidget.ui --- qbittorrent-4.1.3/src/gui/rss/rsswidget.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/rss/rsswidget.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,210 +0,0 @@ - - - RSSWidget - - - - 0 - 0 - 811 - 447 - - - - false - - - Search - - - - - - - true - - - - color: red; - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - - - true - - - - - - - - - New subscription - - - - - - - Mark items read - - - - - - - Refresh RSS streams - - - Update all - - - - - - - Qt::Horizontal - - - - 0 - 0 - - - - - - - - RSS Downloader... - - - - - - - - - - 0 - 0 - - - - Qt::Horizontal - - - - - - - - 75 - true - - - - Torrents: (double-click to download) - - - - - - - - 0 - 0 - - - - Qt::Horizontal - - - - true - - - - - - - - - - - - Delete - - - Delete - - - - - Rename... - - - Rename - - - - - Update - - - Update - - - - - New subscription... - - - - - Update all feeds - - - Update all feeds - - - - - Mark items read - - - Mark items read - - - - - Download torrent - - - - - Open news URL - - - - - Copy feed URL - - - - - New folder... - - - - - - HtmlBrowser - QTextBrowser -
    gui/rss/htmlbrowser.h
    -
    -
    - - -
    diff -Nru qbittorrent-4.1.3/src/gui/scanfoldersdelegate.cpp qbittorrent-3.3.15/src/gui/scanfoldersdelegate.cpp --- qbittorrent-4.1.3/src/gui/scanfoldersdelegate.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/scanfoldersdelegate.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015 sledgehammer999 + * Copyright (C) 2015 sledgehammer999 * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,17 +24,21 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : hammered999@gmail.com */ -#include "scanfoldersdelegate.h" - -#include #include +#include +#include #include #include +#include -#include "base/bittorrent/session.h" #include "base/scanfoldersmodel.h" +#include "base/bittorrent/session.h" +#include "scanfoldersdelegate.h" + ScanFoldersDelegate::ScanFoldersDelegate(QObject *parent, QTreeView *foldersView) : QItemDelegate(parent) @@ -54,9 +58,9 @@ QWidget *ScanFoldersDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const { - if (index.column() != ScanFoldersModel::DOWNLOAD) return nullptr; + if (index.column() != ScanFoldersModel::DOWNLOAD) return 0; - QComboBox *editor = new QComboBox(parent); + QComboBox* editor = new QComboBox(parent); editor->setFocusPolicy(Qt::StrongFocus); editor->addItem(ScanFoldersModel::pathTypeDisplayName(ScanFoldersModel::DOWNLOAD_IN_WATCH_FOLDER)); @@ -67,8 +71,7 @@ editor->addItem(index.data().toString()); } - connect(editor, static_cast(&QComboBox::currentIndexChanged) - , this, &ScanFoldersDelegate::comboboxIndexChanged); + connect(editor, SIGNAL(currentIndexChanged(int)), this, SLOT(comboboxIndexChanged(int))); return editor; } @@ -96,7 +99,7 @@ model->setData( index, QFileDialog::getExistingDirectory( - nullptr, tr("Select save location"), + 0, tr("Select save location"), index.data(Qt::UserRole).toInt() == ScanFoldersModel::CUSTOM_LOCATION ? index.data().toString() : BitTorrent::Session::instance()->defaultSavePath()), diff -Nru qbittorrent-4.1.3/src/gui/scanfoldersdelegate.h qbittorrent-3.3.15/src/gui/scanfoldersdelegate.h --- qbittorrent-4.1.3/src/gui/scanfoldersdelegate.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/scanfoldersdelegate.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015 sledgehammer999 + * Copyright (C) 2015 sledgehammer999 * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : hammered999@gmail.com */ #ifndef SCANFOLDERSDELEGATE_H @@ -31,12 +33,12 @@ #include -class QAbstractItemModel; -class QModelIndex; class QPainter; +class QModelIndex; class QStyleOptionViewItem; -class QTreeView; +class QAbstractItemModel; class PropertiesWidget; +class QTreeView; class ScanFoldersDelegate : public QItemDelegate { @@ -49,12 +51,13 @@ void comboboxIndexChanged(int index); private: - void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override; - void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &) const override; - void setEditorData(QWidget *editor, const QModelIndex &index) const override; - QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const override; + void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; + void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &) const; + void setEditorData(QWidget *editor, const QModelIndex &index) const; + QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const; QTreeView *m_folderView; }; #endif // SCANFOLDERSDELEGATE_H + diff -Nru qbittorrent-4.1.3/src/gui/search/CMakeLists.txt qbittorrent-3.3.15/src/gui/search/CMakeLists.txt --- qbittorrent-4.1.3/src/gui/search/CMakeLists.txt 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/CMakeLists.txt 2017-08-03 20:30:10.000000000 +0000 @@ -1,33 +1,38 @@ -add_library(qbt_searchengine STATIC -# headers -pluginselectdialog.h -pluginsourcedialog.h -searchjobwidget.h +include_directories( +${CMAKE_CURRENT_BINARY_DIR} +${CMAKE_CURRENT_SOURCE_DIR}/.. +${CMAKE_CURRENT_SOURCE_DIR}/../lineedit/src +) + +set(QBT_SEARCHENGINE_FORMS +pluginselectdlg.ui +pluginsourcedlg.ui +searchwidget.ui +) + +set(QBT_SEARCHENGINE_HEADERS +pluginselectdlg.h +pluginsourcedlg.h searchlistdelegate.h searchsortmodel.h +searchtab.h searchwidget.h +) -# sources -pluginselectdialog.cpp -pluginsourcedialog.cpp -searchjobwidget.cpp +set(QBT_SEARCHENGINE_SOURCES +pluginselectdlg.cpp +pluginsourcedlg.cpp searchlistdelegate.cpp searchsortmodel.cpp +searchtab.cpp searchwidget.cpp - -# forms -pluginselectdialog.ui -pluginsourcedialog.ui -searchwidget.ui +../ico.cpp ) set(QBT_SEARCHENGINE_RESOURCES # search.qrc ) -target_link_libraries(qbt_searchengine - PUBLIC - qbt_base - PRIVATE - qbt_lineedit qbt_gui_headers -) +add_library(qbt_searchengine STATIC ${QBT_SEARCHENGINE_HEADERS} ${QBT_SEARCHENGINE_SOURCES} ${QBT_SEARCHENGINE_RESOURCES} ${QBT_SEARCHENGINE_FORMS}) +target_link_libraries(qbt_searchengine qbt_base) + diff -Nru qbittorrent-4.1.3/src/gui/search/pluginselectdialog.cpp qbittorrent-3.3.15/src/gui/search/pluginselectdialog.cpp --- qbittorrent-4.1.3/src/gui/search/pluginselectdialog.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/pluginselectdialog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,471 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015 Vladimir Golovnev - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "pluginselectdialog.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "base/net/downloadhandler.h" -#include "base/net/downloadmanager.h" -#include "base/utils/fs.h" -#include "base/utils/misc.h" -#include "autoexpandabledialog.h" -#include "guiiconprovider.h" -#include "pluginsourcedialog.h" -#include "searchwidget.h" -#include "ui_pluginselectdialog.h" -#include "utils.h" - -enum PluginColumns -{ - PLUGIN_NAME, - PLUGIN_VERSION, - PLUGIN_URL, - PLUGIN_STATE, - PLUGIN_ID -}; - -PluginSelectDialog::PluginSelectDialog(SearchPluginManager *pluginManager, QWidget *parent) - : QDialog(parent) - , m_ui(new Ui::PluginSelectDialog()) - , m_pluginManager(pluginManager) - , m_asyncOps(0) - , m_pendingUpdates(0) -{ - m_ui->setupUi(this); - setAttribute(Qt::WA_DeleteOnClose); - - // This hack fixes reordering of first column with Qt5. - // https://github.com/qtproject/qtbase/commit/e0fc088c0c8bc61dbcaf5928b24986cd61a22777 - QTableView unused; - unused.setVerticalHeader(m_ui->pluginsTree->header()); - m_ui->pluginsTree->header()->setParent(m_ui->pluginsTree); - unused.setVerticalHeader(new QHeaderView(Qt::Horizontal)); - - m_ui->pluginsTree->setRootIsDecorated(false); - m_ui->pluginsTree->hideColumn(PLUGIN_ID); - m_ui->pluginsTree->header()->setSortIndicator(0, Qt::AscendingOrder); - - m_ui->actionUninstall->setIcon(GuiIconProvider::instance()->getIcon("list-remove")); - - connect(m_ui->actionEnable, &QAction::toggled, this, &PluginSelectDialog::enableSelection); - connect(m_ui->pluginsTree, &QTreeWidget::customContextMenuRequested, this, &PluginSelectDialog::displayContextMenu); - connect(m_ui->pluginsTree, &QTreeWidget::itemDoubleClicked, this, &PluginSelectDialog::togglePluginState); - - loadSupportedSearchPlugins(); - - connect(m_pluginManager, &SearchPluginManager::pluginInstalled, this, &PluginSelectDialog::pluginInstalled); - connect(m_pluginManager, &SearchPluginManager::pluginInstallationFailed, this, &PluginSelectDialog::pluginInstallationFailed); - connect(m_pluginManager, &SearchPluginManager::pluginUpdated, this, &PluginSelectDialog::pluginUpdated); - connect(m_pluginManager, &SearchPluginManager::pluginUpdateFailed, this, &PluginSelectDialog::pluginUpdateFailed); - connect(m_pluginManager, &SearchPluginManager::checkForUpdatesFinished, this, &PluginSelectDialog::checkForUpdatesFinished); - connect(m_pluginManager, &SearchPluginManager::checkForUpdatesFailed, this, &PluginSelectDialog::checkForUpdatesFailed); - - Utils::Gui::resize(this); - show(); -} - -PluginSelectDialog::~PluginSelectDialog() -{ - delete m_ui; -} - -void PluginSelectDialog::dropEvent(QDropEvent *event) -{ - event->acceptProposedAction(); - - QStringList files; - if (event->mimeData()->hasUrls()) { - foreach (const QUrl &url, event->mimeData()->urls()) { - if (!url.isEmpty()) { - if (url.scheme().compare("file", Qt::CaseInsensitive) == 0) - files << url.toLocalFile(); - else - files << url.toString(); - } - } - } - else { - files = event->mimeData()->text().split(QLatin1String("\n")); - } - - if (files.isEmpty()) return; - - foreach (QString file, files) { - qDebug("dropped %s", qUtf8Printable(file)); - startAsyncOp(); - m_pluginManager->installPlugin(file); - } -} - -// Decode if we accept drag 'n drop or not -void PluginSelectDialog::dragEnterEvent(QDragEnterEvent *event) -{ - QString mime; - foreach (mime, event->mimeData()->formats()) { - qDebug("mimeData: %s", qUtf8Printable(mime)); - } - - if (event->mimeData()->hasFormat(QLatin1String("text/plain")) || event->mimeData()->hasFormat(QLatin1String("text/uri-list"))) { - event->acceptProposedAction(); - } -} - -void PluginSelectDialog::on_updateButton_clicked() -{ - startAsyncOp(); - m_pluginManager->checkForUpdates(); -} - -void PluginSelectDialog::togglePluginState(QTreeWidgetItem *item, int) -{ - PluginInfo *plugin = m_pluginManager->pluginInfo(item->text(PLUGIN_ID)); - m_pluginManager->enablePlugin(plugin->name, !plugin->enabled); - if (plugin->enabled) { - item->setText(PLUGIN_STATE, tr("Yes")); - setRowColor(m_ui->pluginsTree->indexOfTopLevelItem(item), "green"); - } - else { - item->setText(PLUGIN_STATE, tr("No")); - setRowColor(m_ui->pluginsTree->indexOfTopLevelItem(item), "red"); - } -} - -void PluginSelectDialog::displayContextMenu(const QPoint&) -{ - QMenu myContextMenu(this); - // Enable/disable pause/start action given the DL state - QList items = m_ui->pluginsTree->selectedItems(); - if (items.isEmpty()) return; - - QString firstID = items.first()->text(PLUGIN_ID); - m_ui->actionEnable->setChecked(m_pluginManager->pluginInfo(firstID)->enabled); - myContextMenu.addAction(m_ui->actionEnable); - myContextMenu.addSeparator(); - myContextMenu.addAction(m_ui->actionUninstall); - myContextMenu.exec(QCursor::pos()); -} - -void PluginSelectDialog::on_closeButton_clicked() -{ - close(); -} - -void PluginSelectDialog::on_actionUninstall_triggered() -{ - bool error = false; - foreach (QTreeWidgetItem *item, m_ui->pluginsTree->selectedItems()) { - int index = m_ui->pluginsTree->indexOfTopLevelItem(item); - Q_ASSERT(index != -1); - QString id = item->text(PLUGIN_ID); - if (m_pluginManager->uninstallPlugin(id)) { - delete item; - } - else { - error = true; - // Disable it instead - m_pluginManager->enablePlugin(id, false); - item->setText(PLUGIN_STATE, tr("No")); - setRowColor(index, "red"); - } - } - - if (error) - QMessageBox::warning(this, tr("Uninstall warning"), tr("Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled.\nThose plugins were disabled.")); - else - QMessageBox::information(this, tr("Uninstall success"), tr("All selected plugins were uninstalled successfully")); -} - -void PluginSelectDialog::enableSelection(bool enable) -{ - foreach (QTreeWidgetItem *item, m_ui->pluginsTree->selectedItems()) { - int index = m_ui->pluginsTree->indexOfTopLevelItem(item); - Q_ASSERT(index != -1); - QString id = item->text(PLUGIN_ID); - m_pluginManager->enablePlugin(id, enable); - if (enable) { - item->setText(PLUGIN_STATE, tr("Yes")); - setRowColor(index, "green"); - } - else { - item->setText(PLUGIN_STATE, tr("No")); - setRowColor(index, "red"); - } - } -} - -// Set the color of a row in data model -void PluginSelectDialog::setRowColor(int row, QString color) -{ - QTreeWidgetItem *item = m_ui->pluginsTree->topLevelItem(row); - for (int i = 0; i < m_ui->pluginsTree->columnCount(); ++i) { - item->setData(i, Qt::ForegroundRole, QVariant(QColor(color))); - } -} - -QList PluginSelectDialog::findItemsWithUrl(QString url) -{ - QList res; - - for (int i = 0; i < m_ui->pluginsTree->topLevelItemCount(); ++i) { - QTreeWidgetItem *item = m_ui->pluginsTree->topLevelItem(i); - if (url.startsWith(item->text(PLUGIN_URL), Qt::CaseInsensitive)) - res << item; - } - - return res; -} - -QTreeWidgetItem *PluginSelectDialog::findItemWithID(QString id) -{ - for (int i = 0; i < m_ui->pluginsTree->topLevelItemCount(); ++i) { - QTreeWidgetItem *item = m_ui->pluginsTree->topLevelItem(i); - if (id == item->text(PLUGIN_ID)) - return item; - } - - return nullptr; -} - -void PluginSelectDialog::loadSupportedSearchPlugins() -{ - // Some clean up first - m_ui->pluginsTree->clear(); - foreach (QString name, m_pluginManager->allPlugins()) - addNewPlugin(name); -} - -void PluginSelectDialog::addNewPlugin(QString pluginName) -{ - QTreeWidgetItem *item = new QTreeWidgetItem(m_ui->pluginsTree); - PluginInfo *plugin = m_pluginManager->pluginInfo(pluginName); - item->setText(PLUGIN_NAME, plugin->fullName); - item->setText(PLUGIN_URL, plugin->url); - item->setText(PLUGIN_ID, plugin->name); - if (plugin->enabled) { - item->setText(PLUGIN_STATE, tr("Yes")); - setRowColor(m_ui->pluginsTree->indexOfTopLevelItem(item), "green"); - } - else { - item->setText(PLUGIN_STATE, tr("No")); - setRowColor(m_ui->pluginsTree->indexOfTopLevelItem(item), "red"); - } - // Handle icon - if (QFile::exists(plugin->iconPath)) { - // Good, we already have the icon - item->setData(PLUGIN_NAME, Qt::DecorationRole, QVariant(QIcon(plugin->iconPath))); - } - else { - // Icon is missing, we must download it - using namespace Net; - DownloadHandler *handler = DownloadManager::instance()->download( - DownloadRequest(plugin->url + "/favicon.ico").saveToFile(true)); - connect(handler, static_cast(&DownloadHandler::downloadFinished) - , this, &PluginSelectDialog::iconDownloaded); - connect(handler, &DownloadHandler::downloadFailed, this, &PluginSelectDialog::iconDownloadFailed); - } - item->setText(PLUGIN_VERSION, plugin->version); -} - -void PluginSelectDialog::startAsyncOp() -{ - ++m_asyncOps; - if (m_asyncOps == 1) - setCursor(QCursor(Qt::WaitCursor)); -} - -void PluginSelectDialog::finishAsyncOp() -{ - --m_asyncOps; - if (m_asyncOps == 0) - setCursor(QCursor(Qt::ArrowCursor)); -} - -void PluginSelectDialog::finishPluginUpdate() -{ - --m_pendingUpdates; - if ((m_pendingUpdates == 0) && !m_updatedPlugins.isEmpty()) { - m_updatedPlugins.sort(Qt::CaseInsensitive); - QMessageBox::information(this, tr("Search plugin update"), tr("Plugins installed or updated: %1").arg(m_updatedPlugins.join(", "))); - m_updatedPlugins.clear(); - } -} - -void PluginSelectDialog::on_installButton_clicked() -{ - PluginSourceDialog *dlg = new PluginSourceDialog(this); - connect(dlg, &PluginSourceDialog::askForLocalFile, this, &PluginSelectDialog::askForLocalPlugin); - connect(dlg, &PluginSourceDialog::askForUrl, this, &PluginSelectDialog::askForPluginUrl); -} - -void PluginSelectDialog::askForPluginUrl() -{ - bool ok = false; - QString clipTxt = qApp->clipboard()->text(); - QString defaultUrl = "http://"; - if (Utils::Misc::isUrl(clipTxt) && clipTxt.endsWith(".py")) - defaultUrl = clipTxt; - QString url = AutoExpandableDialog::getText( - this, tr("New search engine plugin URL"), - tr("URL:"), QLineEdit::Normal, defaultUrl, &ok - ); - - while (ok && !url.isEmpty() && !url.endsWith(".py")) { - QMessageBox::warning(this, tr("Invalid link"), tr("The link doesn't seem to point to a search engine plugin.")); - url = AutoExpandableDialog::getText( - this, tr("New search engine plugin URL"), - tr("URL:"), QLineEdit::Normal, url, &ok - ); - } - - if (ok && !url.isEmpty()) { - startAsyncOp(); - m_pluginManager->installPlugin(url); - } -} - -void PluginSelectDialog::askForLocalPlugin() -{ - QStringList pathsList = QFileDialog::getOpenFileNames( - nullptr, tr("Select search plugins"), QDir::homePath(), - tr("qBittorrent search plugin") + QLatin1String(" (*.py)") - ); - foreach (QString path, pathsList) { - startAsyncOp(); - m_pluginManager->installPlugin(path); - } -} - -void PluginSelectDialog::iconDownloaded(const QString &url, QString filePath) -{ - filePath = Utils::Fs::fromNativePath(filePath); - - // Icon downloaded - QIcon icon(filePath); - // Detect a non-decodable icon - QList sizes = icon.availableSizes(); - bool invalid = (sizes.isEmpty() || icon.pixmap(sizes.first()).isNull()); - if (!invalid) { - foreach (QTreeWidgetItem *item, findItemsWithUrl(url)) { - QString id = item->text(PLUGIN_ID); - PluginInfo *plugin = m_pluginManager->pluginInfo(id); - if (!plugin) continue; - - QString iconPath = QString("%1/%2.%3") - .arg(SearchPluginManager::pluginsLocation() - , id - , url.endsWith(".ico", Qt::CaseInsensitive) ? "ico" : "png"); - if (QFile::copy(filePath, iconPath)) { - // This 2nd check is necessary. Some favicons (eg from piratebay) - // decode fine without an ext, but fail to do so when appending the ext - // from the url. Probably a Qt bug. - QIcon iconWithExt(iconPath); - QList sizesExt = iconWithExt.availableSizes(); - bool invalidExt = (sizesExt.isEmpty() || iconWithExt.pixmap(sizesExt.first()).isNull()); - if (invalidExt) { - Utils::Fs::forceRemove(iconPath); - continue; - } - - item->setData(PLUGIN_NAME, Qt::DecorationRole, iconWithExt); - m_pluginManager->updateIconPath(plugin); - } - } - } - // Delete tmp file - Utils::Fs::forceRemove(filePath); -} - -void PluginSelectDialog::iconDownloadFailed(const QString &url, const QString &reason) -{ - qDebug("Could not download favicon: %s, reason: %s", qUtf8Printable(url), qUtf8Printable(reason)); -} - -void PluginSelectDialog::checkForUpdatesFinished(const QHash &updateInfo) -{ - finishAsyncOp(); - if (updateInfo.isEmpty()) { - QMessageBox::information(this, tr("Search plugin update"), tr("All your plugins are already up to date.")); - return; - } - - for (auto i = updateInfo.cbegin(); i != updateInfo.cend(); ++i) { - startAsyncOp(); - ++m_pendingUpdates; - m_pluginManager->updatePlugin(i.key()); - } -} - -void PluginSelectDialog::checkForUpdatesFailed(const QString &reason) -{ - finishAsyncOp(); - QMessageBox::warning(this, tr("Search plugin update"), tr("Sorry, couldn't check for plugin updates. %1").arg(reason)); -} - -void PluginSelectDialog::pluginInstalled(const QString &name) -{ - addNewPlugin(name); - finishAsyncOp(); - m_updatedPlugins.append(name); - finishPluginUpdate(); -} - -void PluginSelectDialog::pluginInstallationFailed(const QString &name, const QString &reason) -{ - finishAsyncOp(); - QMessageBox::information(this, tr("Search plugin install") - , tr("Couldn't install \"%1\" search engine plugin. %2").arg(name, reason)); - finishPluginUpdate(); -} - -void PluginSelectDialog::pluginUpdated(const QString &name) -{ - finishAsyncOp(); - PluginVersion version = m_pluginManager->pluginInfo(name)->version; - QTreeWidgetItem *item = findItemWithID(name); - item->setText(PLUGIN_VERSION, version); - m_updatedPlugins.append(name); - finishPluginUpdate(); -} - -void PluginSelectDialog::pluginUpdateFailed(const QString &name, const QString &reason) -{ - finishAsyncOp(); - QMessageBox::information(this, tr("Search plugin update") - , tr("Couldn't update \"%1\" search engine plugin. %2").arg(name, reason)); - finishPluginUpdate(); -} diff -Nru qbittorrent-4.1.3/src/gui/search/pluginselectdialog.h qbittorrent-3.3.15/src/gui/search/pluginselectdialog.h --- qbittorrent-4.1.3/src/gui/search/pluginselectdialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/pluginselectdialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,96 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015 Vladimir Golovnev - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef PLUGINSELECTDIALOG_H -#define PLUGINSELECTDIALOG_H - -#include - -#include "base/search/searchpluginmanager.h" - -class QDropEvent; -class QStringList; -class QTreeWidgetItem; - -namespace Ui -{ - class PluginSelectDialog; -} - -class PluginSelectDialog : public QDialog -{ - Q_OBJECT - -public: - explicit PluginSelectDialog(SearchPluginManager *pluginManager, QWidget *parent = nullptr); - ~PluginSelectDialog(); - - QList findItemsWithUrl(QString url); - QTreeWidgetItem *findItemWithID(QString id); - -protected: - void dropEvent(QDropEvent *event) override; - void dragEnterEvent(QDragEnterEvent *event) override; - -private slots: - void on_actionUninstall_triggered(); - void on_updateButton_clicked(); - void on_installButton_clicked(); - void on_closeButton_clicked(); - void togglePluginState(QTreeWidgetItem*, int); - void setRowColor(int row, QString color); - void displayContextMenu(const QPoint &pos); - void enableSelection(bool enable); - void askForLocalPlugin(); - void askForPluginUrl(); - void iconDownloaded(const QString &url, QString filePath); - void iconDownloadFailed(const QString &url, const QString &reason); - - void checkForUpdatesFinished(const QHash &updateInfo); - void checkForUpdatesFailed(const QString &reason); - void pluginInstalled(const QString &name); - void pluginInstallationFailed(const QString &name, const QString &reason); - void pluginUpdated(const QString &name); - void pluginUpdateFailed(const QString &name, const QString &reason); - -private: - void loadSupportedSearchPlugins(); - void addNewPlugin(QString pluginName); - void startAsyncOp(); - void finishAsyncOp(); - void finishPluginUpdate(); - - Ui::PluginSelectDialog *m_ui; - SearchPluginManager *m_pluginManager; - QStringList m_updatedPlugins; - int m_asyncOps; - int m_pendingUpdates; -}; - -#endif // PLUGINSELECTDIALOG_H diff -Nru qbittorrent-4.1.3/src/gui/search/pluginselectdialog.ui qbittorrent-3.3.15/src/gui/search/pluginselectdialog.ui --- qbittorrent-4.1.3/src/gui/search/pluginselectdialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/pluginselectdialog.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,145 +0,0 @@ - - - PluginSelectDialog - - - - 0 - 0 - 600 - 345 - - - - true - - - Search plugins - - - - - - - 75 - true - true - - - - Installed search plugins: - - - - - - - Qt::CustomContextMenu - - - QAbstractItemView::ExtendedSelection - - - true - - - false - - - true - - - - Name - - - - - Version - - - - - Url - - - - - Enabled - - - - - - - - - - - - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - - - true - - - - - - - - true - - - - You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - - - true - - - - - - - - - Install a new one - - - - - - - Check for updates - - - - - - - Close - - - - - - - - - true - - - Enabled - - - - - Uninstall - - - - - - diff -Nru qbittorrent-4.1.3/src/gui/search/pluginselectdlg.cpp qbittorrent-3.3.15/src/gui/search/pluginselectdlg.cpp --- qbittorrent-4.1.3/src/gui/search/pluginselectdlg.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/pluginselectdlg.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,441 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2015 Vladimir Golovnev + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#include "pluginselectdlg.h" + +#include +#include +#include +#include +#include +#include +#include +#ifdef QBT_USES_QT5 +#include +#endif + +#include "base/utils/fs.h" +#include "base/utils/misc.h" +#include "base/net/downloadmanager.h" +#include "base/net/downloadhandler.h" +#include "base/searchengine.h" +#include "ico.h" +#include "searchwidget.h" +#include "pluginsourcedlg.h" +#include "guiiconprovider.h" +#include "autoexpandabledialog.h" +#include "ui_pluginselectdlg.h" + +enum PluginColumns +{ + PLUGIN_NAME, + PLUGIN_VERSION, + PLUGIN_URL, + PLUGIN_STATE, + PLUGIN_ID +}; + +PluginSelectDlg::PluginSelectDlg(SearchEngine *pluginManager, QWidget *parent) + : QDialog(parent) + , m_ui(new Ui::PluginSelectDlg()) + , m_pluginManager(pluginManager) + , m_asyncOps(0) +{ + m_ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + +#ifdef QBT_USES_QT5 + // This hack fixes reordering of first column with Qt5. + // https://github.com/qtproject/qtbase/commit/e0fc088c0c8bc61dbcaf5928b24986cd61a22777 + QTableView unused; + unused.setVerticalHeader(m_ui->pluginsTree->header()); + m_ui->pluginsTree->header()->setParent(m_ui->pluginsTree); + unused.setVerticalHeader(new QHeaderView(Qt::Horizontal)); +#endif + m_ui->pluginsTree->setRootIsDecorated(false); + m_ui->pluginsTree->header()->resizeSection(0, 160); + m_ui->pluginsTree->header()->resizeSection(1, 80); + m_ui->pluginsTree->header()->resizeSection(2, 200); + m_ui->pluginsTree->hideColumn(PLUGIN_ID); + + m_ui->actionUninstall->setIcon(GuiIconProvider::instance()->getIcon("list-remove")); + + connect(m_ui->actionEnable, SIGNAL(toggled(bool)), this, SLOT(enableSelection(bool))); + connect(m_ui->pluginsTree, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayContextMenu(const QPoint&))); + connect(m_ui->pluginsTree, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(togglePluginState(QTreeWidgetItem*, int))); + + loadSupportedSearchPlugins(); + + connect(m_pluginManager, SIGNAL(pluginInstalled(QString)), SLOT(pluginInstalled(QString))); + connect(m_pluginManager, SIGNAL(pluginInstallationFailed(QString, QString)), SLOT(pluginInstallationFailed(QString, QString))); + connect(m_pluginManager, SIGNAL(pluginUpdated(QString)), SLOT(pluginUpdated(QString))); + connect(m_pluginManager, SIGNAL(pluginUpdateFailed(QString, QString)), SLOT(pluginUpdateFailed(QString, QString))); + connect(m_pluginManager, SIGNAL(checkForUpdatesFinished(QHash)), SLOT(checkForUpdatesFinished(QHash))); + connect(m_pluginManager, SIGNAL(checkForUpdatesFailed(QString)), SLOT(checkForUpdatesFailed(QString))); + + show(); +} + +PluginSelectDlg::~PluginSelectDlg() +{ + emit pluginsChanged(); + delete m_ui; +} + +void PluginSelectDlg::dropEvent(QDropEvent *event) +{ + event->acceptProposedAction(); + + QStringList files; + if (event->mimeData()->hasUrls()) { + foreach (const QUrl &url, event->mimeData()->urls()) { + if (!url.isEmpty()) { + if (url.scheme().compare("file", Qt::CaseInsensitive) == 0) + files << url.toLocalFile(); + else + files << url.toString(); + } + } + } + else { + files = event->mimeData()->text().split(QLatin1String("\n")); + } + + if (files.isEmpty()) return; + + foreach (QString file, files) { + qDebug("dropped %s", qPrintable(file)); + startAsyncOp(); + m_pluginManager->installPlugin(file); + } +} + +// Decode if we accept drag 'n drop or not +void PluginSelectDlg::dragEnterEvent(QDragEnterEvent *event) +{ + QString mime; + foreach (mime, event->mimeData()->formats()) { + qDebug("mimeData: %s", qPrintable(mime)); + } + + if (event->mimeData()->hasFormat(QLatin1String("text/plain")) || event->mimeData()->hasFormat(QLatin1String("text/uri-list"))) { + event->acceptProposedAction(); + } +} + +void PluginSelectDlg::on_updateButton_clicked() +{ + startAsyncOp(); + m_pluginManager->checkForUpdates(); +} + +void PluginSelectDlg::togglePluginState(QTreeWidgetItem *item, int) +{ + PluginInfo *plugin = m_pluginManager->pluginInfo(item->text(PLUGIN_ID)); + m_pluginManager->enablePlugin(plugin->name, !plugin->enabled); + if (plugin->enabled) { + item->setText(PLUGIN_STATE, tr("Yes")); + setRowColor(m_ui->pluginsTree->indexOfTopLevelItem(item), "green"); + } + else { + item->setText(PLUGIN_STATE, tr("No")); + setRowColor(m_ui->pluginsTree->indexOfTopLevelItem(item), "red"); + } +} + +void PluginSelectDlg::displayContextMenu(const QPoint&) +{ + QMenu myContextMenu(this); + // Enable/disable pause/start action given the DL state + QList items = m_ui->pluginsTree->selectedItems(); + if (items.isEmpty()) return; + + QString first_id = items.first()->text(PLUGIN_ID); + m_ui->actionEnable->setChecked(m_pluginManager->pluginInfo(first_id)->enabled); + myContextMenu.addAction(m_ui->actionEnable); + myContextMenu.addSeparator(); + myContextMenu.addAction(m_ui->actionUninstall); + myContextMenu.exec(QCursor::pos()); +} + +void PluginSelectDlg::on_closeButton_clicked() +{ + close(); +} + +void PluginSelectDlg::on_actionUninstall_triggered() +{ + bool error = false; + foreach (QTreeWidgetItem *item, m_ui->pluginsTree->selectedItems()) { + int index = m_ui->pluginsTree->indexOfTopLevelItem(item); + Q_ASSERT(index != -1); + QString id = item->text(PLUGIN_ID); + if (m_pluginManager->uninstallPlugin(id)) { + delete item; + } + else { + error = true; + // Disable it instead + m_pluginManager->enablePlugin(id, false); + item->setText(PLUGIN_STATE, tr("No")); + setRowColor(index, "red"); + } + } + + if (error) + QMessageBox::warning(0, tr("Uninstall warning"), tr("Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled.\nThose plugins were disabled.")); + else + QMessageBox::information(0, tr("Uninstall success"), tr("All selected plugins were uninstalled successfully")); +} + +void PluginSelectDlg::enableSelection(bool enable) +{ + foreach (QTreeWidgetItem *item, m_ui->pluginsTree->selectedItems()) { + int index = m_ui->pluginsTree->indexOfTopLevelItem(item); + Q_ASSERT(index != -1); + QString id = item->text(PLUGIN_ID); + m_pluginManager->enablePlugin(id, enable); + if (enable) { + item->setText(PLUGIN_STATE, tr("Yes")); + setRowColor(index, "green"); + } + else { + item->setText(PLUGIN_STATE, tr("No")); + setRowColor(index, "red"); + } + } +} + +// Set the color of a row in data model +void PluginSelectDlg::setRowColor(int row, QString color) +{ + QTreeWidgetItem *item = m_ui->pluginsTree->topLevelItem(row); + for (int i = 0; i < m_ui->pluginsTree->columnCount(); ++i) { + item->setData(i, Qt::ForegroundRole, QVariant(QColor(color))); + } +} + +QList PluginSelectDlg::findItemsWithUrl(QString url) +{ + QList res; + + for (int i = 0; i < m_ui->pluginsTree->topLevelItemCount(); ++i) { + QTreeWidgetItem *item = m_ui->pluginsTree->topLevelItem(i); + if (url.startsWith(item->text(PLUGIN_URL), Qt::CaseInsensitive)) + res << item; + } + + return res; +} + +QTreeWidgetItem* PluginSelectDlg::findItemWithID(QString id) +{ + for (int i = 0; i < m_ui->pluginsTree->topLevelItemCount(); ++i) { + QTreeWidgetItem *item = m_ui->pluginsTree->topLevelItem(i); + if (id == item->text(PLUGIN_ID)) + return item; + } + + return 0; +} + +void PluginSelectDlg::loadSupportedSearchPlugins() +{ + // Some clean up first + m_ui->pluginsTree->clear(); + foreach (QString name, m_pluginManager->allPlugins()) + addNewPlugin(name); +} + +void PluginSelectDlg::addNewPlugin(QString pluginName) +{ + QTreeWidgetItem *item = new QTreeWidgetItem(m_ui->pluginsTree); + PluginInfo *plugin = m_pluginManager->pluginInfo(pluginName); + item->setText(PLUGIN_NAME, plugin->fullName); + item->setText(PLUGIN_URL, plugin->url); + item->setText(PLUGIN_ID, plugin->name); + if (plugin->enabled) { + item->setText(PLUGIN_STATE, tr("Yes")); + setRowColor(m_ui->pluginsTree->indexOfTopLevelItem(item), "green"); + } + else { + item->setText(PLUGIN_STATE, tr("No")); + setRowColor(m_ui->pluginsTree->indexOfTopLevelItem(item), "red"); + } + // Handle icon + if (QFile::exists(plugin->iconPath)) { + // Good, we already have the icon + item->setData(PLUGIN_NAME, Qt::DecorationRole, QVariant(QIcon(plugin->iconPath))); + } + else { + // Icon is missing, we must download it + Net::DownloadHandler *handler = Net::DownloadManager::instance()->downloadUrl(plugin->url + "/favicon.ico", true); + connect(handler, SIGNAL(downloadFinished(QString, QString)), this, SLOT(iconDownloaded(QString, QString))); + connect(handler, SIGNAL(downloadFailed(QString, QString)), this, SLOT(iconDownloadFailed(QString, QString))); + } + item->setText(PLUGIN_VERSION, QString::number(plugin->version, 'f', 2)); +} + +void PluginSelectDlg::startAsyncOp() +{ + ++m_asyncOps; + if (m_asyncOps == 1) + setCursor(QCursor(Qt::WaitCursor)); +} + +void PluginSelectDlg::finishAsyncOp() +{ + --m_asyncOps; + if (m_asyncOps == 0) + setCursor(QCursor(Qt::ArrowCursor)); +} + +void PluginSelectDlg::on_installButton_clicked() +{ + PluginSourceDlg *dlg = new PluginSourceDlg(this); + connect(dlg, SIGNAL(askForLocalFile()), this, SLOT(askForLocalPlugin())); + connect(dlg, SIGNAL(askForUrl()), this, SLOT(askForPluginUrl())); +} + +void PluginSelectDlg::askForPluginUrl() +{ + bool ok = false; + QString clipTxt = qApp->clipboard()->text(); + QString defaultUrl = "http://"; + if (Utils::Misc::isUrl(clipTxt) && clipTxt.endsWith(".py")) + defaultUrl = clipTxt; + QString url = AutoExpandableDialog::getText( + this, tr("New search engine plugin URL"), + tr("URL:"), QLineEdit::Normal, defaultUrl, &ok + ); + + while (ok && !url.isEmpty() && !url.endsWith(".py")) { + QMessageBox::warning(this, tr("Invalid link"), tr("The link doesn't seem to point to a search engine plugin.")); + url = AutoExpandableDialog::getText( + this, tr("New search engine plugin URL"), + tr("URL:"), QLineEdit::Normal, url, &ok + ); + } + + if (ok && !url.isEmpty()) { + startAsyncOp(); + m_pluginManager->installPlugin(url); + } +} + +void PluginSelectDlg::askForLocalPlugin() +{ + QStringList pathsList = QFileDialog::getOpenFileNames( + 0, tr("Select search plugins"), QDir::homePath(), + tr("qBittorrent search plugin") + QLatin1String(" (*.py)") + ); + foreach (QString path, pathsList) { + startAsyncOp(); + m_pluginManager->installPlugin(path); + } +} + +void PluginSelectDlg::iconDownloaded(const QString &url, QString filePath) +{ + filePath = Utils::Fs::fromNativePath(filePath); + + // Icon downloaded + QImage fileIcon; + if (fileIcon.load(filePath)) { + foreach (QTreeWidgetItem *item, findItemsWithUrl(url)) { + QString id = item->text(PLUGIN_ID); + PluginInfo *plugin = m_pluginManager->pluginInfo(id); + if (!plugin) continue; + + QFile icon(filePath); + icon.open(QIODevice::ReadOnly); + QString iconPath = QString("%1/%2.%3").arg(SearchEngine::pluginsLocation()).arg(id).arg(ICOHandler::canRead(&icon) ? "ico" : "png"); + if (QFile::copy(filePath, iconPath)) + item->setData(PLUGIN_NAME, Qt::DecorationRole, QVariant(QIcon(iconPath))); + } + } + // Delete tmp file + Utils::Fs::forceRemove(filePath); +} + +void PluginSelectDlg::iconDownloadFailed(const QString &url, const QString &reason) +{ + qDebug("Could not download favicon: %s, reason: %s", qPrintable(url), qPrintable(reason)); +} + +void PluginSelectDlg::checkForUpdatesFinished(const QHash &updateInfo) +{ + finishAsyncOp(); + if (updateInfo.isEmpty()) { + QMessageBox::information(this, tr("Search plugin update"), tr("All your plugins are already up to date.")); + return; + } + + foreach (const QString &pluginName, updateInfo.keys()) { + startAsyncOp(); + m_pluginManager->updatePlugin(pluginName); + } +} + +void PluginSelectDlg::checkForUpdatesFailed(const QString &reason) +{ + finishAsyncOp(); + QMessageBox::warning(this, tr("Search plugin update"), tr("Sorry, couldn't check for plugin updates. %1").arg(reason)); +} + +void PluginSelectDlg::pluginInstalled(const QString &name) +{ + addNewPlugin(name); + finishAsyncOp(); + QMessageBox::information(this, tr("Search plugin install"), tr("\"%1\" search engine plugin was successfully installed.", "%1 is the name of the search engine").arg(name)); +} + +void PluginSelectDlg::pluginInstallationFailed(const QString &name, const QString &reason) +{ + finishAsyncOp(); + QMessageBox::information(this, tr("Search plugin install"), tr("Couldn't install \"%1\" search engine plugin. %2").arg(name).arg(reason)); +} + +void PluginSelectDlg::pluginUpdated(const QString &name) +{ + finishAsyncOp(); + qreal version = m_pluginManager->pluginInfo(name)->version; + QTreeWidgetItem *item = findItemWithID(name); + item->setText(PLUGIN_VERSION, QString::number(version, 'f', 2)); + QMessageBox::information(this, tr("Search plugin install"), tr("\"%1\" search engine plugin was successfully updated.", "%1 is the name of the search engine").arg(name)); + +} + +void PluginSelectDlg::pluginUpdateFailed(const QString &name, const QString &reason) +{ + finishAsyncOp(); + QMessageBox::information(this, tr("Search plugin update"), tr("Couldn't update \"%1\" search engine plugin. %2").arg(name).arg(reason)); +} diff -Nru qbittorrent-4.1.3/src/gui/search/pluginselectdlg.h qbittorrent-3.3.15/src/gui/search/pluginselectdlg.h --- qbittorrent-4.1.3/src/gui/search/pluginselectdlg.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/pluginselectdlg.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,97 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2015 Vladimir Golovnev + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef PLUGINSELECTDLG_H +#define PLUGINSELECTDLG_H + +#include + +class QDropEvent; +class QTreeWidgetItem; + +class SearchEngine; + +namespace Ui +{ + class PluginSelectDlg; +} + +class PluginSelectDlg: public QDialog +{ + Q_OBJECT + +public: + explicit PluginSelectDlg(SearchEngine *pluginManager, QWidget *parent = 0); + ~PluginSelectDlg(); + + QList findItemsWithUrl(QString url); + QTreeWidgetItem* findItemWithID(QString id); + +signals: + void pluginsChanged(); + +protected: + void dropEvent(QDropEvent *event); + void dragEnterEvent(QDragEnterEvent *event); + +private slots: + void on_actionUninstall_triggered(); + void on_updateButton_clicked(); + void on_installButton_clicked(); + void on_closeButton_clicked(); + void togglePluginState(QTreeWidgetItem*, int); + void setRowColor(int row, QString color); + void displayContextMenu(const QPoint& pos); + void enableSelection(bool enable); + void askForLocalPlugin(); + void askForPluginUrl(); + void iconDownloaded(const QString &url, QString filePath); + void iconDownloadFailed(const QString &url, const QString &reason); + + void checkForUpdatesFinished(const QHash &updateInfo); + void checkForUpdatesFailed(const QString &reason); + void pluginInstalled(const QString &name); + void pluginInstallationFailed(const QString &name, const QString &reason); + void pluginUpdated(const QString &name); + void pluginUpdateFailed(const QString &name, const QString &reason); + +private: + void loadSupportedSearchPlugins(); + void addNewPlugin(QString pluginName); + void startAsyncOp(); + void finishAsyncOp(); + + Ui::PluginSelectDlg *m_ui; + SearchEngine *m_pluginManager; + int m_asyncOps; +}; + +#endif // PLUGINSELECTDLG_H diff -Nru qbittorrent-4.1.3/src/gui/search/pluginselectdlg.ui qbittorrent-3.3.15/src/gui/search/pluginselectdlg.ui --- qbittorrent-4.1.3/src/gui/search/pluginselectdlg.ui 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/pluginselectdlg.ui 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,132 @@ + + + PluginSelectDlg + + + + 0 + 0 + 600 + 300 + + + + true + + + Search plugins + + + + + + + 75 + true + true + + + + Installed search plugins: + + + + + + + Qt::CustomContextMenu + + + QAbstractItemView::ExtendedSelection + + + true + + + false + + + + Name + + + + + Version + + + + + Url + + + + + Enabled + + + + + + + + + + + + + + true + + + + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + + + true + + + + + + + + + Install a new one + + + + + + + Check for updates + + + + + + + Close + + + + + + + + + true + + + Enabled + + + + + Uninstall + + + + + + diff -Nru qbittorrent-4.1.3/src/gui/search/pluginsourcedialog.cpp qbittorrent-3.3.15/src/gui/search/pluginsourcedialog.cpp --- qbittorrent-4.1.3/src/gui/search/pluginsourcedialog.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/pluginsourcedialog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "pluginsourcedialog.h" - -#include "ui_pluginsourcedialog.h" -#include "utils.h" - -PluginSourceDialog::PluginSourceDialog(QWidget *parent) - : QDialog(parent) - , m_ui(new Ui::PluginSourceDialog()) -{ - m_ui->setupUi(this); - setAttribute(Qt::WA_DeleteOnClose); - - Utils::Gui::resize(this); - show(); -} - -PluginSourceDialog::~PluginSourceDialog() -{ - delete m_ui; -} - -void PluginSourceDialog::on_localButton_clicked() -{ - emit askForLocalFile(); - close(); -} - -void PluginSourceDialog::on_urlButton_clicked() -{ - emit askForUrl(); - close(); -} diff -Nru qbittorrent-4.1.3/src/gui/search/pluginsourcedialog.h qbittorrent-3.3.15/src/gui/search/pluginsourcedialog.h --- qbittorrent-4.1.3/src/gui/search/pluginsourcedialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/pluginsourcedialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef PLUGINSOURCEDIALOG_H -#define PLUGINSOURCEDIALOG_H - -#include - -namespace Ui -{ - class PluginSourceDialog; -} - -class PluginSourceDialog : public QDialog -{ - Q_OBJECT - -public: - explicit PluginSourceDialog(QWidget *parent = nullptr); - ~PluginSourceDialog(); - -signals: - void askForUrl(); - void askForLocalFile(); - -private slots: - void on_localButton_clicked(); - void on_urlButton_clicked(); - -private: - Ui::PluginSourceDialog *m_ui; -}; - -#endif // PLUGINSOURCEDIALOG_H diff -Nru qbittorrent-4.1.3/src/gui/search/pluginsourcedialog.ui qbittorrent-3.3.15/src/gui/search/pluginsourcedialog.ui --- qbittorrent-4.1.3/src/gui/search/pluginsourcedialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/pluginsourcedialog.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ - - - PluginSourceDialog - - - - 0 - 0 - 207 - 76 - - - - Plugin source - - - - - - - 75 - true - true - - - - Search plugin source: - - - - - - - - - Local file - - - - - - - Web link - - - - - - - - - - diff -Nru qbittorrent-4.1.3/src/gui/search/pluginsourcedlg.cpp qbittorrent-3.3.15/src/gui/search/pluginsourcedlg.cpp --- qbittorrent-4.1.3/src/gui/search/pluginsourcedlg.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/pluginsourcedlg.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,59 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#include "pluginsourcedlg.h" + +#include "ui_pluginsourcedlg.h" + +PluginSourceDlg::PluginSourceDlg(QWidget *parent) + : QDialog(parent) + , m_ui(new Ui::PluginSourceDlg()) +{ + m_ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + show(); +} + +PluginSourceDlg::~PluginSourceDlg() +{ + delete m_ui; +} + +void PluginSourceDlg::on_localButton_clicked() +{ + emit askForLocalFile(); + close(); +} + +void PluginSourceDlg::on_urlButton_clicked() +{ + emit askForUrl(); + close(); +} diff -Nru qbittorrent-4.1.3/src/gui/search/pluginsourcedlg.h qbittorrent-3.3.15/src/gui/search/pluginsourcedlg.h --- qbittorrent-4.1.3/src/gui/search/pluginsourcedlg.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/pluginsourcedlg.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,61 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef PLUGINSOURCEDLG_H +#define PLUGINSOURCEDLG_H + +#include + +namespace Ui +{ + class PluginSourceDlg; +} + +class PluginSourceDlg: public QDialog +{ + Q_OBJECT + +public: + explicit PluginSourceDlg(QWidget *parent = 0); + ~PluginSourceDlg(); + +signals: + void askForUrl(); + void askForLocalFile(); + +private slots: + void on_localButton_clicked(); + void on_urlButton_clicked(); + +private: + Ui::PluginSourceDlg *m_ui; +}; + +#endif // PLUGINSOURCEDLG_H diff -Nru qbittorrent-4.1.3/src/gui/search/pluginsourcedlg.ui qbittorrent-3.3.15/src/gui/search/pluginsourcedlg.ui --- qbittorrent-4.1.3/src/gui/search/pluginsourcedlg.ui 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/pluginsourcedlg.ui 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,53 @@ + + + PluginSourceDlg + + + + 0 + 0 + 207 + 76 + + + + Plugin source + + + + + + + 75 + true + true + + + + Search plugin source: + + + + + + + + + Local file + + + + + + + Web link + + + + + + + + + + diff -Nru qbittorrent-4.1.3/src/gui/search/searchjobwidget.cpp qbittorrent-3.3.15/src/gui/search/searchjobwidget.cpp --- qbittorrent-4.1.3/src/gui/search/searchjobwidget.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/searchjobwidget.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,479 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2018 Vladimir Golovnev - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "searchjobwidget.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "base/bittorrent/session.h" -#include "base/preferences.h" -#include "base/search/searchdownloadhandler.h" -#include "base/search/searchhandler.h" -#include "base/search/searchpluginmanager.h" -#include "base/settingvalue.h" -#include "base/utils/misc.h" -#include "addnewtorrentdialog.h" -#include "guiiconprovider.h" -#include "lineedit.h" -#include "searchlistdelegate.h" -#include "searchsortmodel.h" -#include "ui_searchjobwidget.h" -#include "utils.h" - -SearchJobWidget::SearchJobWidget(SearchHandler *searchHandler, QWidget *parent) - : QWidget(parent) - , m_ui(new Ui::SearchJobWidget) - , m_searchHandler(searchHandler) -{ - m_ui->setupUi(this); - - // This hack fixes reordering of first column with Qt5. - // https://github.com/qtproject/qtbase/commit/e0fc088c0c8bc61dbcaf5928b24986cd61a22777 - QTableView unused; - unused.setVerticalHeader(m_ui->resultsBrowser->header()); - m_ui->resultsBrowser->header()->setParent(m_ui->resultsBrowser); - unused.setVerticalHeader(new QHeaderView(Qt::Horizontal)); - - loadSettings(); - m_ui->resultsBrowser->setSelectionMode(QAbstractItemView::ExtendedSelection); - header()->setStretchLastSection(false); - - // Set Search results list model - m_searchListModel = new QStandardItemModel(0, SearchSortModel::NB_SEARCH_COLUMNS, this); - m_searchListModel->setHeaderData(SearchSortModel::NAME, Qt::Horizontal, tr("Name", "i.e: file name")); - m_searchListModel->setHeaderData(SearchSortModel::SIZE, Qt::Horizontal, tr("Size", "i.e: file size")); - m_searchListModel->setHeaderData(SearchSortModel::SEEDS, Qt::Horizontal, tr("Seeders", "i.e: Number of full sources")); - m_searchListModel->setHeaderData(SearchSortModel::LEECHES, Qt::Horizontal, tr("Leechers", "i.e: Number of partial sources")); - m_searchListModel->setHeaderData(SearchSortModel::ENGINE_URL, Qt::Horizontal, tr("Search engine")); - // Set columns text alignment - m_searchListModel->setHeaderData(SearchSortModel::SIZE, Qt::Horizontal, QVariant(Qt::AlignRight | Qt::AlignVCenter), Qt::TextAlignmentRole); - m_searchListModel->setHeaderData(SearchSortModel::SEEDS, Qt::Horizontal, QVariant(Qt::AlignRight | Qt::AlignVCenter), Qt::TextAlignmentRole); - m_searchListModel->setHeaderData(SearchSortModel::LEECHES, Qt::Horizontal, QVariant(Qt::AlignRight | Qt::AlignVCenter), Qt::TextAlignmentRole); - - m_proxyModel = new SearchSortModel(this); - m_proxyModel->setDynamicSortFilter(true); - m_proxyModel->setSourceModel(m_searchListModel); - m_proxyModel->setNameFilter(searchHandler->pattern()); - m_ui->resultsBrowser->setModel(m_proxyModel); - - m_searchDelegate = new SearchListDelegate(this); - m_ui->resultsBrowser->setItemDelegate(m_searchDelegate); - - m_ui->resultsBrowser->hideColumn(SearchSortModel::DL_LINK); // Hide url column - m_ui->resultsBrowser->hideColumn(SearchSortModel::DESC_LINK); - - m_ui->resultsBrowser->setRootIsDecorated(false); - m_ui->resultsBrowser->setAllColumnsShowFocus(true); - m_ui->resultsBrowser->setSortingEnabled(true); - - // Ensure that at least one column is visible at all times - bool atLeastOne = false; - for (int i = 0; i < SearchSortModel::DL_LINK; ++i) { - if (!m_ui->resultsBrowser->isColumnHidden(i)) { - atLeastOne = true; - break; - } - } - if (!atLeastOne) - m_ui->resultsBrowser->setColumnHidden(SearchSortModel::NAME, false); - // To also mitigate the above issue, we have to resize each column when - // its size is 0, because explicitly 'showing' the column isn't enough - // in the above scenario. - for (int i = 0; i < SearchSortModel::DL_LINK; ++i) - if ((m_ui->resultsBrowser->columnWidth(i) <= 0) && !m_ui->resultsBrowser->isColumnHidden(i)) - m_ui->resultsBrowser->resizeColumnToContents(i); - - header()->setContextMenuPolicy(Qt::CustomContextMenu); - connect(header(), &QWidget::customContextMenuRequested, this, &SearchJobWidget::displayToggleColumnsMenu); - connect(header(), &QHeaderView::sectionResized, this, &SearchJobWidget::saveSettings); - connect(header(), &QHeaderView::sectionMoved, this, &SearchJobWidget::saveSettings); - connect(header(), &QHeaderView::sortIndicatorChanged, this, &SearchJobWidget::saveSettings); - - fillFilterComboBoxes(); - - updateFilter(); - - m_lineEditSearchResultsFilter = new LineEdit(this); - m_lineEditSearchResultsFilter->setFixedWidth(Utils::Gui::scaledSize(this, 170)); - m_lineEditSearchResultsFilter->setPlaceholderText(tr("Filter search results...")); - m_lineEditSearchResultsFilter->setContextMenuPolicy(Qt::CustomContextMenu); - connect(m_lineEditSearchResultsFilter, &QWidget::customContextMenuRequested, this, &SearchJobWidget::showFilterContextMenu); - m_ui->horizontalLayout->insertWidget(0, m_lineEditSearchResultsFilter); - - connect(m_lineEditSearchResultsFilter, &LineEdit::textChanged, this, &SearchJobWidget::filterSearchResults); - connect(m_ui->filterMode, static_cast(&QComboBox::currentIndexChanged) - , this, &SearchJobWidget::updateFilter); - connect(m_ui->minSeeds, &QAbstractSpinBox::editingFinished, this, &SearchJobWidget::updateFilter); - connect(m_ui->minSeeds, static_cast(&QSpinBox::valueChanged) - , this, &SearchJobWidget::updateFilter); - connect(m_ui->maxSeeds, &QAbstractSpinBox::editingFinished, this, &SearchJobWidget::updateFilter); - connect(m_ui->maxSeeds, static_cast(&QSpinBox::valueChanged) - , this, &SearchJobWidget::updateFilter); - connect(m_ui->minSize, &QAbstractSpinBox::editingFinished, this, &SearchJobWidget::updateFilter); - connect(m_ui->minSize, static_cast(&QDoubleSpinBox::valueChanged) - , this, &SearchJobWidget::updateFilter); - connect(m_ui->maxSize, &QAbstractSpinBox::editingFinished, this, &SearchJobWidget::updateFilter); - connect(m_ui->maxSize, static_cast(&QDoubleSpinBox::valueChanged) - , this, &SearchJobWidget::updateFilter); - connect(m_ui->minSizeUnit, static_cast(&QComboBox::currentIndexChanged) - , this, &SearchJobWidget::updateFilter); - connect(m_ui->maxSizeUnit, static_cast(&QComboBox::currentIndexChanged) - , this, &SearchJobWidget::updateFilter); - - connect(m_ui->resultsBrowser, &QAbstractItemView::doubleClicked, this, &SearchJobWidget::onItemDoubleClicked); - - connect(searchHandler, &SearchHandler::newSearchResults, this, &SearchJobWidget::appendSearchResults); - connect(searchHandler, &SearchHandler::searchFinished, this, &SearchJobWidget::searchFinished); - connect(searchHandler, &SearchHandler::searchFailed, this, &SearchJobWidget::searchFailed); - connect(this, &QObject::destroyed, searchHandler, &QObject::deleteLater); - - QShortcut *enterHotkey = new QShortcut(Qt::Key_Return, m_ui->resultsBrowser, nullptr, nullptr, Qt::WidgetShortcut); - connect(enterHotkey, &QShortcut::activated, this, &SearchJobWidget::downloadTorrents); -} - -SearchJobWidget::~SearchJobWidget() -{ - saveSettings(); - delete m_ui; -} - -void SearchJobWidget::onItemDoubleClicked(const QModelIndex &index) -{ - downloadTorrent(index); -} - -QHeaderView *SearchJobWidget::header() const -{ - return m_ui->resultsBrowser->header(); -} - -// Set the color of a row in data model -void SearchJobWidget::setRowColor(int row, const QColor &color) -{ - m_proxyModel->setDynamicSortFilter(false); - for (int i = 0; i < m_proxyModel->columnCount(); ++i) - m_proxyModel->setData(m_proxyModel->index(row, i), color, Qt::ForegroundRole); - - m_proxyModel->setDynamicSortFilter(true); -} - -SearchJobWidget::Status SearchJobWidget::status() const -{ - return m_status; -} - -int SearchJobWidget::visibleResultsCount() const -{ - return m_proxyModel->rowCount(); -} - -LineEdit *SearchJobWidget::lineEditSearchResultsFilter() const -{ - return m_lineEditSearchResultsFilter; -} - -void SearchJobWidget::cancelSearch() -{ - m_searchHandler->cancelSearch(); -} - -void SearchJobWidget::downloadTorrents() -{ - const QModelIndexList rows {m_ui->resultsBrowser->selectionModel()->selectedRows()}; - for (const QModelIndex &rowIndex : rows) - downloadTorrent(rowIndex); -} - -void SearchJobWidget::openTorrentPages() -{ - const QModelIndexList rows {m_ui->resultsBrowser->selectionModel()->selectedRows()}; - for (const QModelIndex &rowIndex : rows) { - const QString descrLink = m_proxyModel->data( - m_proxyModel->index(rowIndex.row(), SearchSortModel::DESC_LINK)).toString(); - if (!descrLink.isEmpty()) - QDesktopServices::openUrl(QUrl::fromEncoded(descrLink.toUtf8())); - } -} - -void SearchJobWidget::copyTorrentURLs() -{ - const QModelIndexList rows {m_ui->resultsBrowser->selectionModel()->selectedRows()}; - QStringList urls; - for (const QModelIndex &rowIndex : rows) { - const QString descrLink = m_proxyModel->data( - m_proxyModel->index(rowIndex.row(), SearchSortModel::DESC_LINK)).toString(); - if (!descrLink.isEmpty()) - urls << descrLink; - } - - if (!urls.empty()) { - QClipboard *clipboard = QApplication::clipboard(); - clipboard->setText(urls.join('\n')); - } -} - -void SearchJobWidget::setStatus(Status value) -{ - if (m_status == value) return; - - m_status = value; - setStatusTip(statusText(value)); - emit statusChanged(); -} - -void SearchJobWidget::downloadTorrent(const QModelIndex &rowIndex) -{ - const QString torrentUrl = m_proxyModel->data( - m_proxyModel->index(rowIndex.row(), SearchSortModel::DL_LINK)).toString(); - const QString siteUrl = m_proxyModel->data( - m_proxyModel->index(rowIndex.row(), SearchSortModel::ENGINE_URL)).toString(); - - if (torrentUrl.startsWith("bc://bt/", Qt::CaseInsensitive) || torrentUrl.startsWith("magnet:", Qt::CaseInsensitive)) { - addTorrentToSession(torrentUrl); - } - else { - SearchDownloadHandler *downloadHandler = m_searchHandler->manager()->downloadTorrent(siteUrl, torrentUrl); - connect(downloadHandler, &SearchDownloadHandler::downloadFinished, this, &SearchJobWidget::addTorrentToSession); - connect(downloadHandler, &SearchDownloadHandler::downloadFinished, downloadHandler, &SearchDownloadHandler::deleteLater); - } - setRowColor(rowIndex.row(), QApplication::palette().color(QPalette::LinkVisited)); -} - -void SearchJobWidget::addTorrentToSession(const QString &source) -{ - if (source.isEmpty()) return; - - if (AddNewTorrentDialog::isEnabled()) - AddNewTorrentDialog::show(source, this); - else - BitTorrent::Session::instance()->addTorrent(source); -} - -void SearchJobWidget::updateResultsCount() -{ - const int totalResults = m_searchListModel->rowCount(); - const int filteredResults = m_proxyModel->rowCount(); - m_ui->resultsLbl->setText(tr("Results (showing %1 out of %2):", "i.e: Search results") - .arg(filteredResults).arg(totalResults)); - - m_noSearchResults = (totalResults == 0); - emit resultsCountUpdated(); -} - -void SearchJobWidget::updateFilter() -{ - using Utils::Misc::SizeUnit; - - m_proxyModel->enableNameFilter(filteringMode() == NameFilteringMode::OnlyNames); - // we update size and seeds filter parameters in the model even if they are disabled - m_proxyModel->setSeedsFilter(m_ui->minSeeds->value(), m_ui->maxSeeds->value()); - m_proxyModel->setSizeFilter( - sizeInBytes(m_ui->minSize->value(), static_cast(m_ui->minSizeUnit->currentIndex())), - sizeInBytes(m_ui->maxSize->value(), static_cast(m_ui->maxSizeUnit->currentIndex()))); - - nameFilteringModeSetting() = filteringMode(); - - m_proxyModel->invalidate(); - updateResultsCount(); -} - -void SearchJobWidget::fillFilterComboBoxes() -{ - using Utils::Misc::SizeUnit; - QStringList unitStrings; - unitStrings.append(unitString(SizeUnit::Byte)); - unitStrings.append(unitString(SizeUnit::KibiByte)); - unitStrings.append(unitString(SizeUnit::MebiByte)); - unitStrings.append(unitString(SizeUnit::GibiByte)); - unitStrings.append(unitString(SizeUnit::TebiByte)); - unitStrings.append(unitString(SizeUnit::PebiByte)); - unitStrings.append(unitString(SizeUnit::ExbiByte)); - - m_ui->minSizeUnit->clear(); - m_ui->maxSizeUnit->clear(); - m_ui->minSizeUnit->addItems(unitStrings); - m_ui->maxSizeUnit->addItems(unitStrings); - - m_ui->minSize->setValue(0); - m_ui->minSizeUnit->setCurrentIndex(static_cast(SizeUnit::MebiByte)); - - m_ui->maxSize->setValue(-1); - m_ui->maxSizeUnit->setCurrentIndex(static_cast(SizeUnit::GibiByte)); - - m_ui->filterMode->clear(); - - m_ui->filterMode->addItem(tr("Torrent names only"), static_cast(NameFilteringMode::OnlyNames)); - m_ui->filterMode->addItem(tr("Everywhere"), static_cast(NameFilteringMode::Everywhere)); - - QVariant selectedMode = static_cast(nameFilteringModeSetting().value()); - int index = m_ui->filterMode->findData(selectedMode); - m_ui->filterMode->setCurrentIndex((index == -1) ? 0 : index); -} - -void SearchJobWidget::filterSearchResults(const QString &name) -{ - const QRegExp::PatternSyntax patternSyntax = Preferences::instance()->getRegexAsFilteringPatternForSearchJob() - ? QRegExp::RegExp : QRegExp::WildcardUnix; - m_proxyModel->setFilterRegExp(QRegExp(name, Qt::CaseInsensitive, patternSyntax)); - updateResultsCount(); -} - -void SearchJobWidget::showFilterContextMenu(const QPoint &) -{ - const Preferences *pref = Preferences::instance(); - - QMenu *menu = m_lineEditSearchResultsFilter->createStandardContextMenu(); - menu->addSeparator(); - QAction *useRegexAct = new QAction(tr("Use regular expressions"), menu); - useRegexAct->setCheckable(true); - useRegexAct->setChecked(pref->getRegexAsFilteringPatternForSearchJob()); - menu->addAction(useRegexAct); - - connect(useRegexAct, &QAction::toggled, pref, &Preferences::setRegexAsFilteringPatternForSearchJob); - connect(useRegexAct, &QAction::toggled, this, [this]() { filterSearchResults(m_lineEditSearchResultsFilter->text()); }); - - menu->exec(QCursor::pos()); -} - -QString SearchJobWidget::statusText(SearchJobWidget::Status st) -{ - switch (st) { - case Status::Ongoing: - return tr("Searching..."); - case Status::Finished: - return tr("Search has finished"); - case Status::Aborted: - return tr("Search aborted"); - case Status::Error: - return tr("An error occurred during search..."); - case Status::NoResults: - return tr("Search returned no results"); - default: - return QString(); - } -} - -SearchJobWidget::NameFilteringMode SearchJobWidget::filteringMode() const -{ - return static_cast(m_ui->filterMode->itemData(m_ui->filterMode->currentIndex()).toInt()); -} - -void SearchJobWidget::loadSettings() -{ - header()->restoreState(Preferences::instance()->getSearchTabHeaderState()); -} - -void SearchJobWidget::saveSettings() const -{ - Preferences::instance()->setSearchTabHeaderState(header()->saveState()); -} - -void SearchJobWidget::displayToggleColumnsMenu(const QPoint&) -{ - QMenu hideshowColumn(this); - hideshowColumn.setTitle(tr("Column visibility")); - QList actions; - for (int i = 0; i < SearchSortModel::DL_LINK; ++i) { - QAction *myAct = hideshowColumn.addAction(m_searchListModel->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString()); - myAct->setCheckable(true); - myAct->setChecked(!m_ui->resultsBrowser->isColumnHidden(i)); - actions.append(myAct); - } - int visibleCols = 0; - for (int i = 0; i < SearchSortModel::DL_LINK; ++i) { - if (!m_ui->resultsBrowser->isColumnHidden(i)) - ++visibleCols; - - if (visibleCols > 1) - break; - } - - // Call menu - QAction *act = hideshowColumn.exec(QCursor::pos()); - if (act) { - int col = actions.indexOf(act); - Q_ASSERT(col >= 0); - Q_ASSERT(visibleCols > 0); - if ((!m_ui->resultsBrowser->isColumnHidden(col)) && (visibleCols == 1)) - return; - m_ui->resultsBrowser->setColumnHidden(col, !m_ui->resultsBrowser->isColumnHidden(col)); - if ((!m_ui->resultsBrowser->isColumnHidden(col)) && (m_ui->resultsBrowser->columnWidth(col) <= 5)) - m_ui->resultsBrowser->resizeColumnToContents(col); - saveSettings(); - } -} - -void SearchJobWidget::searchFinished(bool cancelled) -{ - if (cancelled) - setStatus(Status::Aborted); - else if (m_noSearchResults) - setStatus(Status::NoResults); - else - setStatus(Status::Finished); -} - -void SearchJobWidget::searchFailed() -{ - setStatus(Status::Error); -} - -void SearchJobWidget::appendSearchResults(const QList &results) -{ - for (const SearchResult &result : results) { - // Add item to search result list - int row = m_searchListModel->rowCount(); - m_searchListModel->insertRow(row); - - m_searchListModel->setData(m_searchListModel->index(row, SearchSortModel::NAME), result.fileName); // Name - m_searchListModel->setData(m_searchListModel->index(row, SearchSortModel::DL_LINK), result.fileUrl); // download URL - m_searchListModel->setData(m_searchListModel->index(row, SearchSortModel::SIZE), result.fileSize); // Size - m_searchListModel->setData(m_searchListModel->index(row, SearchSortModel::SEEDS), result.nbSeeders); // Seeders - m_searchListModel->setData(m_searchListModel->index(row, SearchSortModel::LEECHES), result.nbLeechers); // Leechers - m_searchListModel->setData(m_searchListModel->index(row, SearchSortModel::ENGINE_URL), result.siteUrl); // Search site URL - m_searchListModel->setData(m_searchListModel->index(row, SearchSortModel::DESC_LINK), result.descrLink); // Description Link - } - - updateResultsCount(); -} - -CachedSettingValue &SearchJobWidget::nameFilteringModeSetting() -{ - static CachedSettingValue setting("Search/FilteringMode", NameFilteringMode::OnlyNames); - return setting; -} diff -Nru qbittorrent-4.1.3/src/gui/search/searchjobwidget.h qbittorrent-3.3.15/src/gui/search/searchjobwidget.h --- qbittorrent-4.1.3/src/gui/search/searchjobwidget.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/searchjobwidget.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,127 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2018 Vladimir Golovnev - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#pragma once - -#include - -#define ENGINE_URL_COLUMN 4 -#define URL_COLUMN 5 - -class QHeaderView; -class QModelIndex; -class QStandardItem; -class QStandardItemModel; - -template class CachedSettingValue; - -class LineEdit; -class SearchHandler; -class SearchListDelegate; -class SearchSortModel; -struct SearchResult; - -namespace Ui -{ - class SearchJobWidget; -} - -class SearchJobWidget : public QWidget -{ - Q_OBJECT - Q_DISABLE_COPY(SearchJobWidget) - -public: - enum class NameFilteringMode - { - Everywhere, - OnlyNames - }; - Q_ENUM(NameFilteringMode) - - enum class Status - { - Ongoing, - Finished, - Error, - Aborted, - NoResults - }; - - explicit SearchJobWidget(SearchHandler *searchHandler, QWidget *parent = nullptr); - ~SearchJobWidget() override; - - Status status() const; - int visibleResultsCount() const; - LineEdit *lineEditSearchResultsFilter() const; - - void cancelSearch(); - - void downloadTorrents(); - void openTorrentPages(); - void copyTorrentURLs(); - -signals: - void resultsCountUpdated(); - void statusChanged(); - -private: - void loadSettings(); - void saveSettings() const; - void updateFilter(); - void filterSearchResults(const QString &name); - void showFilterContextMenu(const QPoint &); - void displayToggleColumnsMenu(const QPoint&); - void onItemDoubleClicked(const QModelIndex &index); - void searchFinished(bool cancelled); - void searchFailed(); - void appendSearchResults(const QList &results); - void updateResultsCount(); - void setStatus(Status value); - void downloadTorrent(const QModelIndex &rowIndex); - void addTorrentToSession(const QString &source); - void fillFilterComboBoxes(); - NameFilteringMode filteringMode() const; - QHeaderView *header() const; - void setRowColor(int row, const QColor &color); - - static QString statusText(Status st); - static CachedSettingValue &nameFilteringModeSetting(); - - Ui::SearchJobWidget *m_ui; - SearchHandler *m_searchHandler; - QStandardItemModel *m_searchListModel; - SearchSortModel *m_proxyModel; - SearchListDelegate *m_searchDelegate; - LineEdit *m_lineEditSearchResultsFilter; - Status m_status = Status::Ongoing; - bool m_noSearchResults = true; -}; - -Q_DECLARE_METATYPE(SearchJobWidget::NameFilteringMode) diff -Nru qbittorrent-4.1.3/src/gui/search/searchjobwidget.ui qbittorrent-3.3.15/src/gui/search/searchjobwidget.ui --- qbittorrent-4.1.3/src/gui/search/searchjobwidget.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/searchjobwidget.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,250 +0,0 @@ - - - SearchJobWidget - - - - 0 - 0 - 1216 - 364 - - - - Form - - - - - - - - Results(xxx) - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::NoFocus - - - Search in: - - - filterMode - - - - - - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - - - - - - - Qt::Horizontal - - - QSizePolicy::Minimum - - - - 12 - 20 - - - - - - - - - 0 - 0 - - - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - - - Seeds: - - - - - - - <html><head/><body><p>Minimal number of seeds</p></body></html> - - - 0 - - - 1000 - - - 0 - - - - - - - - 0 - 0 - - - - to - - - - - - - <html><head/><body><p>Maximal number of seeds</p></body></html> - - - - - - - - - -1 - - - 1000 - - - -1 - - - - - - - Qt::Horizontal - - - QSizePolicy::Minimum - - - - 12 - 20 - - - - - - - - - 0 - 0 - - - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - - - Size: - - - - - - - - - <html><head/><body><p>Minimal torrent size</p></body></html> - - - 0.000000000000000 - - - 1000.000000000000000 - - - 0.000000000000000 - - - - - - - QComboBox::AdjustToContents - - - - - - - - - to - - - - - - - - - <html><head/><body><p>Maximal torrent size</p></body></html> - - - - - - -1.000000000000000 - - - 1000.000000000000000 - - - 1000.000000000000000 - - - - - - - -1 - - - QComboBox::AdjustToContents - - - - - - - - - - - - - - - diff -Nru qbittorrent-4.1.3/src/gui/search/searchlistdelegate.cpp qbittorrent-3.3.15/src/gui/search/searchlistdelegate.cpp --- qbittorrent-4.1.3/src/gui/search/searchlistdelegate.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/searchlistdelegate.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,23 +24,18 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#include "searchlistdelegate.h" - -#include +#include #include #include #include -#include #include "base/utils/misc.h" #include "searchsortmodel.h" - -namespace -{ - const char i18nContext[] = "SearchListDelegate"; -} +#include "searchlistdelegate.h" SearchListDelegate::SearchListDelegate(QObject *parent) : QItemDelegate(parent) @@ -62,8 +57,7 @@ case SearchSortModel::SEEDS: case SearchSortModel::LEECHES: opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; - QItemDelegate::drawDisplay(painter, opt, option.rect - , (index.data().toLongLong() >= 0) ? index.data().toString() : QCoreApplication::translate(i18nContext, "Unknown")); + QItemDelegate::drawDisplay(painter, opt, option.rect, (index.data().toLongLong() >= 0) ? index.data().toString() : tr("Unknown")); break; default: QItemDelegate::paint(painter, option, index); diff -Nru qbittorrent-4.1.3/src/gui/search/searchlistdelegate.h qbittorrent-3.3.15/src/gui/search/searchlistdelegate.h --- qbittorrent-4.1.3/src/gui/search/searchlistdelegate.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/searchlistdelegate.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef SEARCHLISTDELEGATE_H @@ -31,7 +33,7 @@ #include -class SearchListDelegate : public QItemDelegate +class SearchListDelegate: public QItemDelegate { public: explicit SearchListDelegate(QObject *parent); @@ -40,4 +42,4 @@ QWidget *createEditor(QWidget *, const QStyleOptionViewItem &, const QModelIndex &) const override; }; -#endif // SEARCHLISTDELEGATE_H +#endif diff -Nru qbittorrent-4.1.3/src/gui/search/searchsortmodel.cpp qbittorrent-3.3.15/src/gui/search/searchsortmodel.cpp --- qbittorrent-4.1.3/src/gui/search/searchsortmodel.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/searchsortmodel.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -40,9 +40,9 @@ { } -void SearchSortModel::enableNameFilter(bool enabled) +void SearchSortModel::enableNameFilter(bool enable) { - m_isNameFilterEnabled = enabled; + m_isNameFilterEnabled = enable; } void SearchSortModel::setNameFilter(const QString &searchTerm) @@ -110,12 +110,11 @@ switch (sortColumn()) { case NAME: case ENGINE_URL: { - const QString strL = left.data().toString(); - const QString strR = right.data().toString(); - const int result = Utils::String::naturalCompare(strL, strR, Qt::CaseInsensitive); - return (result < 0); + QString vL = left.data().toString(); + QString vR = right.data().toString(); + return Utils::String::naturalCompareCaseInsensitive(vL, vR); } - break; + default: return base::lessThan(left, right); }; @@ -123,10 +122,10 @@ bool SearchSortModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { - const QAbstractItemModel *const sourceModel = this->sourceModel(); + const QAbstractItemModel* const sourceModel = this->sourceModel(); if (m_isNameFilterEnabled && !m_searchTerm.isEmpty()) { QString name = sourceModel->data(sourceModel->index(sourceRow, NAME, sourceParent)).toString(); - for (const QString &word: m_searchTermWords) { + for (const QString& word: m_searchTermWords) { int i = name.indexOf(word, 0, Qt::CaseInsensitive); if (i == -1) { return false; @@ -134,26 +133,26 @@ } } - if ((m_minSize > 0) || (m_maxSize >= 0)) { + if (m_minSize > 0 || m_maxSize >= 0) { qlonglong size = sourceModel->data(sourceModel->index(sourceRow, SIZE, sourceParent)).toLongLong(); - if (((m_minSize > 0) && (size < m_minSize)) - || ((m_maxSize > 0) && (size > m_maxSize))) { + if ((m_minSize > 0 && size < m_minSize) + || (m_maxSize > 0 && size > m_maxSize)) { return false; } } - if ((m_minSeeds > 0) || (m_maxSeeds >= 0)) { + if (m_minSeeds > 0 || m_maxSeeds >= 0) { int seeds = sourceModel->data(sourceModel->index(sourceRow, SEEDS, sourceParent)).toInt(); - if (((m_minSeeds > 0) && (seeds < m_minSeeds)) - || ((m_maxSeeds > 0) && (seeds > m_maxSeeds))) { + if ((m_minSeeds > 0 && seeds < m_minSeeds) + || (m_maxSeeds > 0 && seeds > m_maxSeeds)) { return false; } } - if ((m_minLeeches > 0) || (m_maxLeeches >= 0)) { + if (m_minLeeches > 0 || m_maxLeeches >= 0) { int leeches = sourceModel->data(sourceModel->index(sourceRow, LEECHES, sourceParent)).toInt(); - if (((m_minLeeches > 0) && (leeches < m_minLeeches)) - || ((m_maxLeeches > 0) && (leeches > m_maxLeeches))) { + if ((m_minLeeches > 0 && leeches < m_minLeeches) + || (m_maxLeeches > 0 && leeches > m_maxLeeches)) { return false; } } diff -Nru qbittorrent-4.1.3/src/gui/search/searchsortmodel.h qbittorrent-3.3.15/src/gui/search/searchsortmodel.h --- qbittorrent-4.1.3/src/gui/search/searchsortmodel.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/searchsortmodel.h 2017-08-03 20:30:10.000000000 +0000 @@ -33,7 +33,7 @@ #include #include "base/utils/string.h" -class SearchSortModel : public QSortFilterProxyModel +class SearchSortModel: public QSortFilterProxyModel { using base = QSortFilterProxyModel; @@ -50,10 +50,10 @@ NB_SEARCH_COLUMNS }; - explicit SearchSortModel(QObject *parent = nullptr); + explicit SearchSortModel(QObject *parent = 0); void enableNameFilter(bool enabled); - void setNameFilter(const QString &searchTerm = QString()); + void setNameFilter(const QString& searchTerm = QString()); //! \brief Sets parameters for filtering by size //! \param minSize minimal size in bytes diff -Nru qbittorrent-4.1.3/src/gui/search/searchtab.cpp qbittorrent-3.3.15/src/gui/search/searchtab.cpp --- qbittorrent-4.1.3/src/gui/search/searchtab.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/searchtab.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,360 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef QBT_USES_QT5 +#include +#endif + +#include "base/utils/misc.h" +#include "base/preferences.h" +#include "base/settingsstorage.h" +#include "guiiconprovider.h" +#include "searchsortmodel.h" +#include "searchlistdelegate.h" +#include "searchwidget.h" +#include "searchtab.h" +#include "ui_searchtab.h" + +namespace +{ +#define SETTINGS_KEY(name) "Search/" name + + const QString KEY_FILTER_MODE_SETTING_NAME = SETTINGS_KEY("FilteringMode"); +} + +SearchTab::SearchTab(SearchWidget *parent) + : QWidget(parent) + , m_ui(new Ui::SearchTab()) + , m_parent(parent) +{ + m_ui->setupUi(this); + +#ifdef QBT_USES_QT5 + // This hack fixes reordering of first column with Qt5. + // https://github.com/qtproject/qtbase/commit/e0fc088c0c8bc61dbcaf5928b24986cd61a22777 + QTableView unused; + unused.setVerticalHeader(m_ui->resultsBrowser->header()); + m_ui->resultsBrowser->header()->setParent(m_ui->resultsBrowser); + unused.setVerticalHeader(new QHeaderView(Qt::Horizontal)); +#endif + loadSettings(); + m_ui->resultsBrowser->setSelectionMode(QAbstractItemView::ExtendedSelection); + header()->setStretchLastSection(false); + + // Set Search results list model + m_searchListModel = new QStandardItemModel(0, SearchSortModel::NB_SEARCH_COLUMNS, this); + m_searchListModel->setHeaderData(SearchSortModel::NAME, Qt::Horizontal, tr("Name", "i.e: file name")); + m_searchListModel->setHeaderData(SearchSortModel::SIZE, Qt::Horizontal, tr("Size", "i.e: file size")); + m_searchListModel->setHeaderData(SearchSortModel::SEEDS, Qt::Horizontal, tr("Seeders", "i.e: Number of full sources")); + m_searchListModel->setHeaderData(SearchSortModel::LEECHES, Qt::Horizontal, tr("Leechers", "i.e: Number of partial sources")); + m_searchListModel->setHeaderData(SearchSortModel::ENGINE_URL, Qt::Horizontal, tr("Search engine")); + // Set columns text alignment + m_searchListModel->setHeaderData(SearchSortModel::SIZE, Qt::Horizontal, QVariant(Qt::AlignRight | Qt::AlignVCenter), Qt::TextAlignmentRole); + m_searchListModel->setHeaderData(SearchSortModel::SEEDS, Qt::Horizontal, QVariant(Qt::AlignRight | Qt::AlignVCenter), Qt::TextAlignmentRole); + m_searchListModel->setHeaderData(SearchSortModel::LEECHES, Qt::Horizontal, QVariant(Qt::AlignRight | Qt::AlignVCenter), Qt::TextAlignmentRole); + + m_proxyModel = new SearchSortModel(this); + m_proxyModel->setDynamicSortFilter(true); + m_proxyModel->setSourceModel(m_searchListModel); + m_ui->resultsBrowser->setModel(m_proxyModel); + + m_searchDelegate = new SearchListDelegate(this); + m_ui->resultsBrowser->setItemDelegate(m_searchDelegate); + + m_ui->resultsBrowser->hideColumn(SearchSortModel::DL_LINK); // Hide url column + m_ui->resultsBrowser->hideColumn(SearchSortModel::DESC_LINK); + + m_ui->resultsBrowser->setRootIsDecorated(false); + m_ui->resultsBrowser->setAllColumnsShowFocus(true); + m_ui->resultsBrowser->setSortingEnabled(true); + + //Ensure that at least one column is visible at all times + bool atLeastOne = false; + for (unsigned int i = 0; i < SearchSortModel::DL_LINK; i++) { + if (!m_ui->resultsBrowser->isColumnHidden(i)) { + atLeastOne = true; + break; + } + } + if (!atLeastOne) + m_ui->resultsBrowser->setColumnHidden(SearchSortModel::NAME, false); + //To also mitigate the above issue, we have to resize each column when + //its size is 0, because explicitly 'showing' the column isn't enough + //in the above scenario. + for (unsigned int i = 0; i < SearchSortModel::DL_LINK; i++) + if ((m_ui->resultsBrowser->columnWidth(i) <= 0) && !m_ui->resultsBrowser->isColumnHidden(i)) + m_ui->resultsBrowser->resizeColumnToContents(i); + + // Connect signals to slots (search part) + connect(m_ui->resultsBrowser, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(downloadItem(const QModelIndex&))); + + header()->setContextMenuPolicy(Qt::CustomContextMenu); + connect(header(), SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(displayToggleColumnsMenu(const QPoint &))); + connect(header(), SIGNAL(sectionResized(int, int, int)), this, SLOT(saveSettings())); + connect(header(), SIGNAL(sectionMoved(int, int, int)), this, SLOT(saveSettings())); + connect(header(), SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), this, SLOT(saveSettings())); + + fillFilterComboBoxes(); + + updateFilter(); + + connect(m_ui->filterMode, SIGNAL(currentIndexChanged(int)), this, SLOT(updateFilter())); + connect(m_ui->minSeeds, SIGNAL(editingFinished()), this, SLOT(updateFilter())); + connect(m_ui->minSeeds, SIGNAL(valueChanged(int)), this, SLOT(updateFilter())); + connect(m_ui->maxSeeds, SIGNAL(editingFinished()), this, SLOT(updateFilter())); + connect(m_ui->maxSeeds, SIGNAL(valueChanged(int)), this, SLOT(updateFilter())); + connect(m_ui->minSize, SIGNAL(editingFinished()), this, SLOT(updateFilter())); + connect(m_ui->minSize, SIGNAL(valueChanged(double)), this, SLOT(updateFilter())); + connect(m_ui->maxSize, SIGNAL(editingFinished()), this, SLOT(updateFilter())); + connect(m_ui->maxSize, SIGNAL(valueChanged(double)), this, SLOT(updateFilter())); + connect(m_ui->minSizeUnit, SIGNAL(currentIndexChanged(int)), this, SLOT(updateFilter())); + connect(m_ui->maxSizeUnit, SIGNAL(currentIndexChanged(int)), this, SLOT(updateFilter())); +} + +SearchTab::~SearchTab() +{ + saveSettings(); + delete m_ui; +} + +void SearchTab::downloadItem(const QModelIndex &index) +{ + QString torrentUrl = m_proxyModel->data(m_proxyModel->index(index.row(), SearchSortModel::DL_LINK)).toString(); + QString siteUrl = m_proxyModel->data(m_proxyModel->index(index.row(), SearchSortModel::ENGINE_URL)).toString(); + setRowColor(index.row(), QApplication::palette().color(QPalette::LinkVisited)); + m_parent->downloadTorrent(siteUrl, torrentUrl); +} + +QHeaderView* SearchTab::header() const +{ + return m_ui->resultsBrowser->header(); +} + +QTreeView* SearchTab::getCurrentTreeView() const +{ + return m_ui->resultsBrowser; +} + +SearchSortModel* SearchTab::getCurrentSearchListProxy() const +{ + return m_proxyModel; +} + +QStandardItemModel* SearchTab::getCurrentSearchListModel() const +{ + return m_searchListModel; +} + +// Set the color of a row in data model +void SearchTab::setRowColor(int row, const QColor &color) +{ + m_proxyModel->setDynamicSortFilter(false); + for (int i = 0; i < m_proxyModel->columnCount(); ++i) + m_proxyModel->setData(m_proxyModel->index(row, i), color, Qt::ForegroundRole); + + m_proxyModel->setDynamicSortFilter(true); +} + +SearchTab::Status SearchTab::status() const +{ + return m_status; +} + +void SearchTab::setStatus(Status value) +{ + m_status = value; + setStatusTip(statusText(value)); + const int thisTabIndex = m_parent->searchTabs()->indexOf(this); + m_parent->searchTabs()->setTabToolTip(thisTabIndex, statusTip()); + m_parent->searchTabs()->setTabIcon(thisTabIndex, GuiIconProvider::instance()->getIcon(statusIconName(value))); +} + +void SearchTab::updateResultsCount() +{ + const int totalResults = getCurrentSearchListModel() ? getCurrentSearchListModel()->rowCount(QModelIndex()) : 0; + const int filteredResults = getCurrentSearchListProxy() ? getCurrentSearchListProxy()->rowCount(QModelIndex()) : totalResults; + m_ui->resultsLbl->setText(tr("Results (showing %1 out of %2):", "i.e: Search results") + .arg(filteredResults).arg(totalResults)); +} + +void SearchTab::updateFilter() +{ + using Utils::Misc::SizeUnit; + SearchSortModel* filterModel = getCurrentSearchListProxy(); + filterModel->enableNameFilter(filteringMode() == OnlyNames); + // we update size and seeds filter parameters in the model even if they are disabled + filterModel->setSeedsFilter(m_ui->minSeeds->value(), m_ui->maxSeeds->value()); + filterModel->setSizeFilter( + sizeInBytes(m_ui->minSize->value(), static_cast(m_ui->minSizeUnit->currentIndex())), + sizeInBytes(m_ui->maxSize->value(), static_cast(m_ui->maxSizeUnit->currentIndex()))); + + SettingsStorage::instance()->storeValue(KEY_FILTER_MODE_SETTING_NAME, + m_ui->filterMode->itemData(m_ui->filterMode->currentIndex())); + + filterModel->invalidate(); + updateResultsCount(); +} + +void SearchTab::fillFilterComboBoxes() +{ + using Utils::Misc::SizeUnit; + QStringList unitStrings; + unitStrings.append(unitString(SizeUnit::Byte)); + unitStrings.append(unitString(SizeUnit::KibiByte)); + unitStrings.append(unitString(SizeUnit::MebiByte)); + unitStrings.append(unitString(SizeUnit::GibiByte)); + unitStrings.append(unitString(SizeUnit::TebiByte)); + unitStrings.append(unitString(SizeUnit::PebiByte)); + unitStrings.append(unitString(SizeUnit::ExbiByte)); + + m_ui->minSizeUnit->clear(); + m_ui->maxSizeUnit->clear(); + m_ui->minSizeUnit->addItems(unitStrings); + m_ui->maxSizeUnit->addItems(unitStrings); + + m_ui->minSize->setValue(0); + m_ui->minSizeUnit->setCurrentIndex(static_cast(SizeUnit::MebiByte)); + + m_ui->maxSize->setValue(-1); + m_ui->maxSizeUnit->setCurrentIndex(static_cast(SizeUnit::GibiByte)); + + m_ui->filterMode->clear(); + + QMetaEnum nameFilteringModeEnum = + this->metaObject()->enumerator(this->metaObject()->indexOfEnumerator("NameFilteringMode")); + + m_ui->filterMode->addItem(tr("Torrent names only"), nameFilteringModeEnum.valueToKey(OnlyNames)); + m_ui->filterMode->addItem(tr("Everywhere"), nameFilteringModeEnum.valueToKey(Everywhere)); + + QVariant selectedMode = SettingsStorage::instance()->loadValue( + KEY_FILTER_MODE_SETTING_NAME, nameFilteringModeEnum.valueToKey(OnlyNames)); + int index = m_ui->filterMode->findData(selectedMode); + m_ui->filterMode->setCurrentIndex(index == -1 ? 0 : index); +} + +QString SearchTab::statusText(SearchTab::Status st) +{ + switch (st) { + case Status::Ongoing: + return tr("Searching..."); + case Status::Finished: + return tr("Search has finished"); + case Status::Aborted: + return tr("Search aborted"); + case Status::Error: + return tr("An error occurred during search..."); + case Status::NoResults: + return tr("Search returned no results"); + default: + return QString(); + } +} + +QString SearchTab::statusIconName(SearchTab::Status st) +{ + switch (st) { + case Status::Ongoing: + return QLatin1String("task-ongoing"); + case Status::Finished: + return QLatin1String("task-complete"); + case Status::Aborted: + return QLatin1String("task-reject"); + case Status::Error: + return QLatin1String("task-attention"); + case Status::NoResults: + return QLatin1String("task-attention"); + default: + return QString(); + } +} + +SearchTab::NameFilteringMode SearchTab::filteringMode() const +{ + QMetaEnum metaEnum = + this->metaObject()->enumerator(this->metaObject()->indexOfEnumerator("NameFilteringMode")); + return static_cast(metaEnum.keyToValue(m_ui->filterMode->itemData(m_ui->filterMode->currentIndex()).toByteArray())); +} + +void SearchTab::loadSettings() +{ + header()->restoreState(Preferences::instance()->getSearchTabHeaderState()); +} + +void SearchTab::saveSettings() const +{ + Preferences::instance()->setSearchTabHeaderState(header()->saveState()); +} + +void SearchTab::displayToggleColumnsMenu(const QPoint&) +{ + QMenu hideshowColumn(this); + hideshowColumn.setTitle(tr("Column visibility")); + QList actions; + for (int i = 0; i < SearchSortModel::DL_LINK; ++i) { + QAction *myAct = hideshowColumn.addAction(m_searchListModel->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString()); + myAct->setCheckable(true); + myAct->setChecked(!m_ui->resultsBrowser->isColumnHidden(i)); + actions.append(myAct); + } + int visibleCols = 0; + for (unsigned int i = 0; i < SearchSortModel::DL_LINK; i++) { + if (!m_ui->resultsBrowser->isColumnHidden(i)) + visibleCols++; + + if (visibleCols > 1) + break; + } + + // Call menu + QAction *act = hideshowColumn.exec(QCursor::pos()); + if (act) { + int col = actions.indexOf(act); + Q_ASSERT(col >= 0); + Q_ASSERT(visibleCols > 0); + if ((!m_ui->resultsBrowser->isColumnHidden(col)) && (visibleCols == 1)) + return; + qDebug("Toggling column %d visibility", col); + m_ui->resultsBrowser->setColumnHidden(col, !m_ui->resultsBrowser->isColumnHidden(col)); + if ((!m_ui->resultsBrowser->isColumnHidden(col)) && (m_ui->resultsBrowser->columnWidth(col) <= 5)) + m_ui->resultsBrowser->setColumnWidth(col, 100); + saveSettings(); + } +} diff -Nru qbittorrent-4.1.3/src/gui/search/searchtab.h qbittorrent-3.3.15/src/gui/search/searchtab.h --- qbittorrent-4.1.3/src/gui/search/searchtab.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/searchtab.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,120 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef SEARCHTAB_H +#define SEARCHTAB_H + +#include // I don't know why is not enought for Qt's 4.8.7 moc +#include + +#define ENGINE_URL_COLUMN 4 +#define URL_COLUMN 5 + +class QLabel; +class QModelIndex; +class QTreeView; +class QHeaderView; +class QStandardItemModel; +class QVBoxLayout; + +class SearchSortModel; +class SearchListDelegate; +class SearchWidget; + +namespace Ui +{ + class SearchTab; +} + +class SearchTab: public QWidget +{ + Q_OBJECT + +public: + + enum NameFilteringMode + { + Everywhere, + OnlyNames + }; + + Q_ENUMS(NameFilteringMode) + + explicit SearchTab(SearchWidget *parent); + ~SearchTab(); + + QStandardItemModel* getCurrentSearchListModel() const; + SearchSortModel* getCurrentSearchListProxy() const; + QTreeView* getCurrentTreeView() const; + QHeaderView* header() const; + + void setRowColor(int row, const QColor &color); + + enum class Status + { + Ongoing, + Finished, + Error, + Aborted, + NoResults + }; + + void setStatus(Status value); + Status status() const; + + void updateResultsCount(); + +public slots: + void downloadItem(const QModelIndex &index); + +private slots: + void loadSettings(); + void saveSettings() const; + void updateFilter(); + void displayToggleColumnsMenu(const QPoint&); + +private: + void fillFilterComboBoxes(); + NameFilteringMode filteringMode() const; + static QString statusText(Status st); + static QString statusIconName(Status st); + + Ui::SearchTab *m_ui; + QTreeView *m_resultsBrowser; + QStandardItemModel *m_searchListModel; + SearchSortModel *m_proxyModel; + SearchListDelegate *m_searchDelegate; + SearchWidget *m_parent; + Status m_status; +}; + +Q_DECLARE_METATYPE(SearchTab::NameFilteringMode) + +#endif // SEARCHTAB_H diff -Nru qbittorrent-4.1.3/src/gui/search/searchtab.ui qbittorrent-3.3.15/src/gui/search/searchtab.ui --- qbittorrent-4.1.3/src/gui/search/searchtab.ui 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/searchtab.ui 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,250 @@ + + + SearchTab + + + + 0 + 0 + 1216 + 364 + + + + Form + + + + + + + + Results(xxx) + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::NoFocus + + + Search in: + + + filterMode + + + + + + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 12 + 20 + + + + + + + + + 0 + 0 + + + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + + + Seeds: + + + + + + + <html><head/><body><p>Minimal number of seeds</p></body></html> + + + 0 + + + 1000 + + + 0 + + + + + + + + 0 + 0 + + + + to + + + + + + + <html><head/><body><p>Maximal number of seeds</p></body></html> + + + + + + + + + -1 + + + 1000 + + + -1 + + + + + + + Qt::Horizontal + + + QSizePolicy::Minimum + + + + 12 + 20 + + + + + + + + + 0 + 0 + + + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + + + Size: + + + + + + + + + <html><head/><body><p>Minimal torrent size</p></body></html> + + + 0.000000000000000 + + + 1000.000000000000000 + + + 0.000000000000000 + + + + + + + QComboBox::AdjustToContents + + + + + + + + + to + + + + + + + + + <html><head/><body><p>Maximal torrent size</p></body></html> + + + + + + -1.000000000000000 + + + 1000.000000000000000 + + + 1000.000000000000000 + + + + + + + -1 + + + QComboBox::AdjustToContents + + + + + + + + + + + + + + + diff -Nru qbittorrent-4.1.3/src/gui/search/searchwidget.cpp qbittorrent-3.3.15/src/gui/search/searchwidget.cpp --- qbittorrent-4.1.3/src/gui/search/searchwidget.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/searchwidget.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015, 2018 Vladimir Golovnev + * Copyright (C) 2015 Vladimir Golovnev * Copyright (C) 2006 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -25,74 +25,59 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #include "searchwidget.h" -#include - -#ifdef Q_OS_WIN -#include -#endif - -#include #include #include +#include +#include +#include +#include +#include #include -#include -#include -#include -#include -#include #include +#include +#include +#include +#include +#include +#include #include #include +#include +#ifdef Q_OS_WIN +#include +#endif + #include "base/bittorrent/session.h" -#include "base/preferences.h" -#include "base/search/searchpluginmanager.h" -#include "base/search/searchhandler.h" -#include "base/utils/foreignapps.h" #include "base/utils/fs.h" +#include "base/utils/misc.h" +#include "base/preferences.h" +#include "base/searchengine.h" +#include "searchlistdelegate.h" +#include "mainwindow.h" #include "addnewtorrentdialog.h" #include "guiiconprovider.h" -#include "mainwindow.h" -#include "pluginselectdialog.h" -#include "searchlistdelegate.h" +#include "pluginselectdlg.h" #include "searchsortmodel.h" -#include "searchjobwidget.h" +#include "searchtab.h" + #include "ui_searchwidget.h" #define SEARCHHISTORY_MAXSIZE 50 #define URL_COLUMN 5 -namespace -{ - QString statusIconName(SearchJobWidget::Status st) - { - switch (st) { - case SearchJobWidget::Status::Ongoing: - return QLatin1String("task-ongoing"); - case SearchJobWidget::Status::Finished: - return QLatin1String("task-complete"); - case SearchJobWidget::Status::Aborted: - return QLatin1String("task-reject"); - case SearchJobWidget::Status::Error: - return QLatin1String("task-attention"); - case SearchJobWidget::Status::NoResults: - return QLatin1String("task-attention"); - default: - return QString(); - } - } -} - SearchWidget::SearchWidget(MainWindow *mainWindow) : QWidget(mainWindow) , m_ui(new Ui::SearchWidget()) - , m_tabStatusChangedMapper(new QSignalMapper(this)) , m_mainWindow(mainWindow) , m_isNewQueryString(false) + , m_noSearchResults(true) { m_ui->setupUi(this); @@ -112,72 +97,48 @@ "Search phrase example, illustrates quotes usage, double quoted" "pair of space delimited words, the whole pair is highlighted") << "

    " << flush; - m_ui->lineEditSearchPattern->setToolTip(searchPatternHint); + m_ui->m_searchPattern->setToolTip(searchPatternHint); -#ifndef Q_OS_MAC // Icons m_ui->searchButton->setIcon(GuiIconProvider::instance()->getIcon("edit-find")); m_ui->downloadButton->setIcon(GuiIconProvider::instance()->getIcon("download")); m_ui->goToDescBtn->setIcon(GuiIconProvider::instance()->getIcon("application-x-mswinurl")); m_ui->pluginsButton->setIcon(GuiIconProvider::instance()->getIcon("preferences-system-network")); m_ui->copyURLBtn->setIcon(GuiIconProvider::instance()->getIcon("edit-copy")); -#else - // On macOS the icons overlap the text otherwise - QSize iconSize = m_ui->tabWidget->iconSize(); - iconSize.setWidth(iconSize.width() + 16); - m_ui->tabWidget->setIconSize(iconSize); -#endif - connect(m_ui->tabWidget, &QTabWidget::tabCloseRequested, this, &SearchWidget::closeTab); - connect(m_ui->tabWidget, &QTabWidget::currentChanged, this, &SearchWidget::tabChanged); + connect(m_ui->tabWidget, SIGNAL(tabCloseRequested(int)), this, SLOT(closeTab(int))); - connect(m_tabStatusChangedMapper, static_cast(&QSignalMapper::mapped) - , this, &SearchWidget::tabStatusChanged); - - // NOTE: Although SearchManager is Application-wide component now, we still create it the legacy way. - auto *searchManager = new SearchPluginManager; - const auto onPluginChanged = [this]() - { - fillPluginComboBox(); - fillCatCombobox(); - selectActivePage(); - }; - connect(searchManager, &SearchPluginManager::pluginInstalled, this, onPluginChanged); - connect(searchManager, &SearchPluginManager::pluginUninstalled, this, onPluginChanged); - connect(searchManager, &SearchPluginManager::pluginUpdated, this, onPluginChanged); - connect(searchManager, &SearchPluginManager::pluginEnabled, this, onPluginChanged); + m_searchEngine = new SearchEngine; + connect(m_searchEngine, SIGNAL(searchStarted()), SLOT(searchStarted())); + connect(m_searchEngine, SIGNAL(newSearchResults(QList)), SLOT(appendSearchResults(QList))); + connect(m_searchEngine, SIGNAL(searchFinished(bool)), SLOT(searchFinished(bool))); + connect(m_searchEngine, SIGNAL(searchFailed()), SLOT(searchFailed())); + connect(m_searchEngine, SIGNAL(torrentFileDownloaded(QString)), SLOT(addTorrentToSession(QString))); // Fill in category combobox - onPluginChanged(); - - connect(m_ui->lineEditSearchPattern, &LineEdit::returnPressed, m_ui->searchButton, &QPushButton::click); - connect(m_ui->lineEditSearchPattern, &LineEdit::textEdited, this, &SearchWidget::searchTextEdited); - connect(m_ui->selectPlugin, static_cast(&QComboBox::currentIndexChanged) - , this, &SearchWidget::selectMultipleBox); - connect(m_ui->selectPlugin, static_cast(&QComboBox::currentIndexChanged) - , this, &SearchWidget::fillCatCombobox); + fillCatCombobox(); + fillPluginComboBox(); - m_focusSearchHotkey = new QShortcut(QKeySequence::Find, this); - connect(m_focusSearchHotkey, &QShortcut::activated, this, &SearchWidget::toggleFocusBetweenLineEdits); + connect(m_ui->m_searchPattern, SIGNAL(returnPressed()), m_ui->searchButton, SLOT(click())); + connect(m_ui->m_searchPattern, SIGNAL(textEdited(QString)), this, SLOT(searchTextEdited(QString))); + connect(m_ui->selectPlugin, SIGNAL(currentIndexChanged(int)), this, SLOT(selectMultipleBox(int))); } void SearchWidget::fillCatCombobox() { m_ui->comboCategory->clear(); - m_ui->comboCategory->addItem(SearchPluginManager::categoryFullName("all"), QVariant("all")); + m_ui->comboCategory->addItem(SearchEngine::categoryFullName("all"), QVariant("all")); + m_ui->comboCategory->insertSeparator(1); using QStrPair = QPair; QList tmpList; - foreach (const QString &cat, SearchPluginManager::instance()->getPluginCategories(selectedPlugin())) - tmpList << qMakePair(SearchPluginManager::categoryFullName(cat), cat); + foreach (const QString &cat, m_searchEngine->supportedCategories()) + tmpList << qMakePair(SearchEngine::categoryFullName(cat), cat); std::sort(tmpList.begin(), tmpList.end(), [](const QStrPair &l, const QStrPair &r) { return (QString::localeAwareCompare(l.first, r.first) < 0); }); foreach (const QStrPair &p, tmpList) { - qDebug("Supported category: %s", qUtf8Printable(p.second)); + qDebug("Supported category: %s", qPrintable(p.second)); m_ui->comboCategory->addItem(p.first, QVariant(p.second)); } - - if (m_ui->comboCategory->count() > 1) - m_ui->comboCategory->insertSeparator(1); } void SearchWidget::fillPluginComboBox() @@ -186,18 +147,16 @@ m_ui->selectPlugin->addItem(tr("Only enabled"), QVariant("enabled")); m_ui->selectPlugin->addItem(tr("All plugins"), QVariant("all")); m_ui->selectPlugin->addItem(tr("Select..."), QVariant("multi")); + m_ui->selectPlugin->insertSeparator(3); using QStrPair = QPair; QList tmpList; - foreach (const QString &name, SearchPluginManager::instance()->enabledPlugins()) - tmpList << qMakePair(SearchPluginManager::instance()->pluginFullName(name), name); + foreach (const QString &name, m_searchEngine->enabledPlugins()) + tmpList << qMakePair(m_searchEngine->pluginFullName(name), name); std::sort(tmpList.begin(), tmpList.end(), [](const QStrPair &l, const QStrPair &r) { return (l.first < r.first); } ); foreach (const QStrPair &p, tmpList) m_ui->selectPlugin->addItem(p.first, QVariant(p.second)); - - if (m_ui->selectPlugin->count() > 3) - m_ui->selectPlugin->insertSeparator(3); } QString SearchWidget::selectedCategory() const @@ -210,51 +169,39 @@ return m_ui->selectPlugin->itemData(m_ui->selectPlugin->currentIndex()).toString(); } -void SearchWidget::selectActivePage() -{ - if (SearchPluginManager::instance()->allPlugins().isEmpty()) { - m_ui->stackedPages->setCurrentWidget(m_ui->emptyPage); - m_ui->lineEditSearchPattern->setEnabled(false); - m_ui->comboCategory->setEnabled(false); - m_ui->selectPlugin->setEnabled(false); - m_ui->searchButton->setEnabled(false); - } - else { - m_ui->stackedPages->setCurrentWidget(m_ui->searchPage); - m_ui->lineEditSearchPattern->setEnabled(true); - m_ui->comboCategory->setEnabled(true); - m_ui->selectPlugin->setEnabled(true); - m_ui->searchButton->setEnabled(true); - } -} - SearchWidget::~SearchWidget() { qDebug("Search destruction"); - delete SearchPluginManager::instance(); + delete m_searchEngine; delete m_ui; } -void SearchWidget::updateButtons() +void SearchWidget::downloadTorrent(const QString &siteUrl, const QString &url) { - if (m_currentSearchTab && (m_currentSearchTab->visibleResultsCount() > 0)) { - m_ui->downloadButton->setEnabled(true); - m_ui->goToDescBtn->setEnabled(true); - m_ui->copyURLBtn->setEnabled(true); - } - else { - m_ui->downloadButton->setEnabled(false); - m_ui->goToDescBtn->setEnabled(false); - m_ui->copyURLBtn->setEnabled(false); - } + if (url.startsWith("bc://bt/", Qt::CaseInsensitive) || url.startsWith("magnet:", Qt::CaseInsensitive)) + addTorrentToSession(url); + else + m_searchEngine->downloadTorrent(siteUrl, url); } -void SearchWidget::tabChanged(int index) +void SearchWidget::tab_changed(int t) { - // when we switch from a tab that is not empty to another that is empty - // the download button doesn't have to be available - m_currentSearchTab = ((index < 0) ? nullptr : m_allTabs.at(m_ui->tabWidget->currentIndex())); - updateButtons(); + //when we switch from a tab that is not empty to another that is empty the download button + //doesn't have to be available + if (t > -1) { + //-1 = no more tab + m_currentSearchTab = m_allTabs.at(m_ui->tabWidget->currentIndex()); + if (m_currentSearchTab->getCurrentSearchListModel()->rowCount()) { + m_ui->downloadButton->setEnabled(true); + m_ui->goToDescBtn->setEnabled(true); + m_ui->copyURLBtn->setEnabled(true); + } + else { + m_ui->downloadButton->setEnabled(false); + m_ui->goToDescBtn->setEnabled(false); + m_ui->copyURLBtn->setEnabled(false); + } + } } void SearchWidget::selectMultipleBox(int index) @@ -264,21 +211,19 @@ on_pluginsButton_clicked(); } -void SearchWidget::toggleFocusBetweenLineEdits() +void SearchWidget::addTorrentToSession(const QString &source) { - if (m_ui->lineEditSearchPattern->hasFocus() && m_currentSearchTab) { - m_currentSearchTab->lineEditSearchResultsFilter()->setFocus(); - m_currentSearchTab->lineEditSearchResultsFilter()->selectAll(); - } - else { - m_ui->lineEditSearchPattern->setFocus(); - m_ui->lineEditSearchPattern->selectAll(); - } + if (AddNewTorrentDialog::isEnabled()) + AddNewTorrentDialog::show(source, this); + else + BitTorrent::Session::instance()->addTorrent(source); } void SearchWidget::on_pluginsButton_clicked() { - new PluginSelectDialog(SearchPluginManager::instance(), this); + PluginSelectDlg *dlg = new PluginSelectDlg(m_searchEngine, this); + connect(dlg, SIGNAL(pluginsChanged()), this, SLOT(fillCatCombobox())); + connect(dlg, SIGNAL(pluginsChanged()), this, SLOT(fillPluginComboBox())); } void SearchWidget::searchTextEdited(QString) @@ -290,19 +235,25 @@ void SearchWidget::giveFocusToSearchInput() { - m_ui->lineEditSearchPattern->setFocus(); + m_ui->m_searchPattern->setFocus(); +} + +QTabWidget *SearchWidget::searchTabs() const +{ + return m_ui->tabWidget; } // Function called when we click on search button void SearchWidget::on_searchButton_clicked() { - if (Utils::ForeignApps::pythonInfo().version.majorNumber() <= 0) { + if (Utils::Misc::pythonVersion() < 0) { m_mainWindow->showNotificationBaloon(tr("Search Engine"), tr("Please install Python to use the Search Engine.")); return; } - if (m_activeSearchTab) { - m_activeSearchTab->cancelSearch(); + if (m_searchEngine->isActive()) { + m_searchEngine->cancelSearch(); + if (!m_isNewQueryString) { m_ui->searchButton->setText(tr("Search")); return; @@ -311,95 +262,180 @@ m_isNewQueryString = false; - const QString pattern = m_ui->lineEditSearchPattern->text().trimmed(); + const QString pattern = m_ui->m_searchPattern->text().trimmed(); // No search pattern entered if (pattern.isEmpty()) { - QMessageBox::critical(this, tr("Empty search pattern"), tr("Please type a search pattern first")); + QMessageBox::critical(0, tr("Empty search pattern"), tr("Please type a search pattern first")); return; } + // Tab Addition + m_currentSearchTab = new SearchTab(this); + m_activeSearchTab = m_currentSearchTab; + m_allTabs.append(m_currentSearchTab); + QString tabName = pattern; + tabName.replace(QRegExp("&{1}"), "&&"); + m_ui->tabWidget->addTab(m_currentSearchTab, tabName); + m_ui->tabWidget->setCurrentWidget(m_currentSearchTab); + m_currentSearchTab->getCurrentSearchListProxy()->setNameFilter(pattern); + QStringList plugins; - if (selectedPlugin() == "all") - plugins = SearchPluginManager::instance()->allPlugins(); - else if (selectedPlugin() == "enabled") - plugins = SearchPluginManager::instance()->enabledPlugins(); - else if (selectedPlugin() == "multi") - plugins = SearchPluginManager::instance()->enabledPlugins(); - else - plugins << selectedPlugin(); + if (selectedPlugin() == "all") plugins = m_searchEngine->allPlugins(); + else if (selectedPlugin() == "enabled") plugins = m_searchEngine->enabledPlugins(); + else if (selectedPlugin() == "multi") plugins = m_searchEngine->enabledPlugins(); + else plugins << selectedPlugin(); - qDebug("Search with category: %s", qUtf8Printable(selectedCategory())); + qDebug("Search with category: %s", qPrintable(selectedCategory())); - // Launch search - auto *searchHandler = SearchPluginManager::instance()->startSearch(pattern, selectedCategory(), plugins); + // Update SearchEngine widgets + m_noSearchResults = true; - // Tab Addition - auto *newTab = new SearchJobWidget(searchHandler, this); - m_allTabs.append(newTab); + // Changing the text of the current label + m_activeSearchTab->updateResultsCount(); - QString tabName = pattern; - tabName.replace(QRegularExpression("&{1}"), "&&"); - m_ui->tabWidget->addTab(newTab, tabName); - m_ui->tabWidget->setCurrentWidget(newTab); - - connect(newTab, &SearchJobWidget::resultsCountUpdated, this, &SearchWidget::resultsCountUpdated); - connect(newTab, &SearchJobWidget::statusChanged - , m_tabStatusChangedMapper, static_cast(&QSignalMapper::map)); - m_tabStatusChangedMapper->setMapping(newTab, newTab); + // Launch search + m_searchEngine->startSearch(pattern, selectedCategory(), plugins); +} +void SearchWidget::searchStarted() +{ + // Update SearchEngine widgets + m_activeSearchTab->setStatus(SearchTab::Status::Ongoing); m_ui->searchButton->setText(tr("Stop")); - m_activeSearchTab = newTab; - tabStatusChanged(newTab); } -void SearchWidget::resultsCountUpdated() -{ - updateButtons(); +// Slot called when search is Finished +// Search can be finished for 3 reasons : +// Error | Stopped by user | Finished normally +void SearchWidget::searchFinished(bool cancelled) +{ + if (m_mainWindow->isNotificationsEnabled() && (m_mainWindow->currentTabWidget() != this)) + m_mainWindow->showNotificationBaloon(tr("Search Engine"), tr("Search has finished")); + + if (m_activeSearchTab.isNull()) return; // The active tab was closed + + if (cancelled) + m_activeSearchTab->setStatus(SearchTab::Status::Aborted); + else if (m_noSearchResults) + m_activeSearchTab->setStatus(SearchTab::Status::NoResults); + else + m_activeSearchTab->setStatus(SearchTab::Status::Finished); + + m_activeSearchTab = 0; + m_ui->searchButton->setText(tr("Search")); } -void SearchWidget::tabStatusChanged(QWidget *tab) +void SearchWidget::searchFailed() { - const int tabIndex = m_ui->tabWidget->indexOf(tab); - m_ui->tabWidget->setTabToolTip(tabIndex, tab->statusTip()); - m_ui->tabWidget->setTabIcon(tabIndex, GuiIconProvider::instance()->getIcon( - statusIconName(static_cast(tab)->status()))); + if (m_mainWindow->isNotificationsEnabled() && (m_mainWindow->currentTabWidget() != this)) + m_mainWindow->showNotificationBaloon(tr("Search Engine"), tr("Search has failed")); - if ((tab == m_activeSearchTab) && (m_activeSearchTab->status() != SearchJobWidget::Status::Ongoing)) { - Q_ASSERT(m_activeSearchTab->status() != SearchJobWidget::Status::Ongoing); + if (m_activeSearchTab.isNull()) return; // The active tab was closed - if (m_mainWindow->isNotificationsEnabled() && (m_mainWindow->currentTabWidget() != this)) { - if (m_activeSearchTab->status() == SearchJobWidget::Status::Error) - m_mainWindow->showNotificationBaloon(tr("Search Engine"), tr("Search has failed")); - else - m_mainWindow->showNotificationBaloon(tr("Search Engine"), tr("Search has finished")); - } +#ifdef Q_OS_WIN + m_activeSearchTab->setStatus(SearchTab::Status::Aborted); +#else + m_activeSearchTab->setStatus(SearchTab::Status::Error); +#endif +} - m_activeSearchTab = nullptr; - m_ui->searchButton->setText(tr("Search")); +void SearchWidget::appendSearchResults(const QList &results) +{ + if (m_activeSearchTab.isNull()) { + m_searchEngine->cancelSearch(); + return; } + + Q_ASSERT(m_activeSearchTab); + + QStandardItemModel *curModel = m_activeSearchTab->getCurrentSearchListModel(); + Q_ASSERT(curModel); + + foreach (const SearchResult &result, results) { + // Add item to search result list + int row = curModel->rowCount(); + curModel->insertRow(row); + + curModel->setData(curModel->index(row, SearchSortModel::DL_LINK), result.fileUrl); // download URL + curModel->setData(curModel->index(row, SearchSortModel::NAME), result.fileName); // Name + curModel->setData(curModel->index(row, SearchSortModel::SIZE), result.fileSize); // Size + curModel->setData(curModel->index(row, SearchSortModel::SEEDS), result.nbSeeders); // Seeders + curModel->setData(curModel->index(row, SearchSortModel::LEECHES), result.nbLeechers); // Leechers + curModel->setData(curModel->index(row, SearchSortModel::ENGINE_URL), result.siteUrl); // Search site URL + curModel->setData(curModel->index(row, SearchSortModel::DESC_LINK), result.descrLink); // Description Link + } + + m_noSearchResults = false; + m_activeSearchTab->updateResultsCount(); + + // Enable clear & download buttons + m_ui->downloadButton->setEnabled(true); + m_ui->goToDescBtn->setEnabled(true); + m_ui->copyURLBtn->setEnabled(true); } void SearchWidget::closeTab(int index) { - SearchJobWidget *tab = m_allTabs.takeAt(index); - if (tab == m_activeSearchTab) - m_ui->searchButton->setText(tr("Search")); + // Search is run for active tab so if user decided to close it, then stop search + if (!m_activeSearchTab.isNull() && index == m_ui->tabWidget->indexOf(m_activeSearchTab)) { + qDebug("Closed active search Tab"); + if (m_searchEngine->isActive()) + m_searchEngine->cancelSearch(); + m_activeSearchTab = 0; + } + + delete m_allTabs.takeAt(index); - delete tab; + if (!m_allTabs.size()) { + m_ui->downloadButton->setEnabled(false); + m_ui->goToDescBtn->setEnabled(false); + m_ui->copyURLBtn->setEnabled(false); + } } // Download selected items in search results list void SearchWidget::on_downloadButton_clicked() { - m_allTabs.at(m_ui->tabWidget->currentIndex())->downloadTorrents(); + //QModelIndexList selectedIndexes = currentSearchTab->getCurrentTreeView()->selectionModel()->selectedIndexes(); + QModelIndexList selectedIndexes = + m_allTabs.at(m_ui->tabWidget->currentIndex())->getCurrentTreeView()->selectionModel()->selectedIndexes(); + foreach (const QModelIndex &index, selectedIndexes) { + if (index.column() == SearchSortModel::NAME) + m_allTabs.at(m_ui->tabWidget->currentIndex())->downloadItem(index); + } } void SearchWidget::on_goToDescBtn_clicked() { - m_allTabs.at(m_ui->tabWidget->currentIndex())->openTorrentPages(); + QModelIndexList selectedIndexes = + m_allTabs.at(m_ui->tabWidget->currentIndex())->getCurrentTreeView()->selectionModel()->selectedIndexes(); + foreach (const QModelIndex &index, selectedIndexes) { + if (index.column() == SearchSortModel::NAME) { + QSortFilterProxyModel *model = m_allTabs.at(m_ui->tabWidget->currentIndex())->getCurrentSearchListProxy(); + const QString descUrl = model->data(model->index(index.row(), SearchSortModel::DESC_LINK)).toString(); + if (!descUrl.isEmpty()) + QDesktopServices::openUrl(QUrl::fromEncoded(descUrl.toUtf8())); + } + } } void SearchWidget::on_copyURLBtn_clicked() { - m_allTabs.at(m_ui->tabWidget->currentIndex())->copyTorrentURLs(); + QStringList urls; + QModelIndexList selectedIndexes = + m_allTabs.at(m_ui->tabWidget->currentIndex())->getCurrentTreeView()->selectionModel()->selectedIndexes(); + + foreach (const QModelIndex &index, selectedIndexes) { + if (index.column() == SearchSortModel::NAME) { + QSortFilterProxyModel *model = m_allTabs.at(m_ui->tabWidget->currentIndex())->getCurrentSearchListProxy(); + const QString descUrl = model->data(model->index(index.row(), SearchSortModel::DESC_LINK)).toString(); + if (!descUrl.isEmpty()) + urls << descUrl.toUtf8(); + } + } + + if (!urls.empty()) { + QClipboard *clipboard = QApplication::clipboard(); + clipboard->setText(urls.join("\n")); + } } diff -Nru qbittorrent-4.1.3/src/gui/search/searchwidget.h qbittorrent-3.3.15/src/gui/search/searchwidget.h --- qbittorrent-4.1.3/src/gui/search/searchwidget.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/searchwidget.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015, 2018 Vladimir Golovnev + * Copyright (C) 2015 Vladimir Golovnev * Copyright (C) 2006 Christophe Dumez * * This program is free software; you can redistribute it and/or @@ -25,67 +25,78 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#pragma once +#ifndef SEARCHWIDGET_H +#define SEARCHWIDGET_H #include #include #include -class QShortcut; -class QSignalMapper; class QTabWidget; class MainWindow; -class SearchJobWidget; +class SearchEngine; +struct SearchResult; +class SearchTab; namespace Ui { class SearchWidget; } -class SearchWidget : public QWidget +class SearchWidget: public QWidget { Q_OBJECT Q_DISABLE_COPY(SearchWidget) public: explicit SearchWidget(MainWindow *mainWindow); - ~SearchWidget() override; + ~SearchWidget(); + void downloadTorrent(const QString &siteUrl, const QString &url); void giveFocusToSearchInput(); + QTabWidget* searchTabs() const; + private slots: + // Search slots + void tab_changed(int); //to prevent the use of the download button when the tab is empty void on_searchButton_clicked(); void on_downloadButton_clicked(); void on_goToDescBtn_clicked(); void on_copyURLBtn_clicked(); void on_pluginsButton_clicked(); -private: - void tabChanged(int index); void closeTab(int index); - void resultsCountUpdated(); - void tabStatusChanged(QWidget *tab); + void appendSearchResults(const QList &results); + void searchStarted(); + void searchFinished(bool cancelled); + void searchFailed(); void selectMultipleBox(int index); - void toggleFocusBetweenLineEdits(); + + void addTorrentToSession(const QString &source); void fillCatCombobox(); void fillPluginComboBox(); - void selectActivePage(); void searchTextEdited(QString); - void updateButtons(); +private: QString selectedCategory() const; QString selectedPlugin() const; Ui::SearchWidget *m_ui; - QSignalMapper *m_tabStatusChangedMapper; - QPointer m_currentSearchTab; // Selected tab - QPointer m_activeSearchTab; // Tab with running search - QList m_allTabs; // To store all tabs + SearchEngine *m_searchEngine; + QPointer m_currentSearchTab; // Selected tab + QPointer m_activeSearchTab; // Tab with running search + QList> m_allTabs; // To store all tabs MainWindow *m_mainWindow; bool m_isNewQueryString; - QShortcut *m_focusSearchHotkey; + bool m_noSearchResults; + QByteArray m_searchResultLineTruncated; }; + +#endif // SEARCHWIDGET_H diff -Nru qbittorrent-4.1.3/src/gui/search/searchwidget.ui qbittorrent-3.3.15/src/gui/search/searchwidget.ui --- qbittorrent-4.1.3/src/gui/search/searchwidget.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/search/searchwidget.ui 2017-08-03 20:30:10.000000000 +0000 @@ -13,11 +13,11 @@ Search - + - + @@ -55,60 +55,10 @@ - - - 1 + + + true - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - Qt::AlignCenter - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - true - - - - - diff -Nru qbittorrent-4.1.3/src/gui/shutdownconfirmdialog.cpp qbittorrent-3.3.15/src/gui/shutdownconfirmdialog.cpp --- qbittorrent-4.1.3/src/gui/shutdownconfirmdialog.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/shutdownconfirmdialog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,142 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2014 sledgehammer999 - * Copyright (C) 2011 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "shutdownconfirmdialog.h" - -#include -#include -#include -#include - -#include "base/preferences.h" -#include "base/utils/misc.h" -#include "ui_shutdownconfirmdialog.h" -#include "utils.h" - -ShutdownConfirmDialog::ShutdownConfirmDialog(QWidget *parent, const ShutdownDialogAction &action) - : QDialog(parent) - , m_ui(new Ui::ShutdownConfirmDialog) - , m_timeout(15) - , m_action(action) -{ - m_ui->setupUi(this); - - initText(); - QIcon warningIcon(style()->standardIcon(QStyle::SP_MessageBoxWarning)); - m_ui->warningLabel->setPixmap(warningIcon.pixmap(32)); - - if (m_action == ShutdownDialogAction::Exit) - m_ui->neverShowAgainCheckbox->setVisible(true); - else - m_ui->neverShowAgainCheckbox->setVisible(false); - - // Cancel Button - QPushButton *cancelButton = m_ui->buttonBox->button(QDialogButtonBox::Cancel); - cancelButton->setFocus(); - cancelButton->setDefault(true); - - // Always on top - setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); - move(Utils::Misc::screenCenter(this)); - - m_timer.setInterval(1000); // 1sec - connect(&m_timer, &QTimer::timeout, this, &ShutdownConfirmDialog::updateSeconds); - - Utils::Gui::resize(this); -} - -ShutdownConfirmDialog::~ShutdownConfirmDialog() -{ - delete m_ui; -} - -void ShutdownConfirmDialog::showEvent(QShowEvent *event) -{ - QDialog::showEvent(event); - m_timer.start(); -} - -bool ShutdownConfirmDialog::askForConfirmation(QWidget *parent, const ShutdownDialogAction &action) -{ - ShutdownConfirmDialog dlg(parent, action); - return (dlg.exec() == QDialog::Accepted); -} - -void ShutdownConfirmDialog::updateSeconds() -{ - --m_timeout; - updateText(); - if (m_timeout == 0) { - m_timer.stop(); - accept(); - } -} - -void ShutdownConfirmDialog::accept() -{ - Preferences::instance()->setDontConfirmAutoExit(m_ui->neverShowAgainCheckbox->isChecked()); - QDialog::accept(); -} - -void ShutdownConfirmDialog::initText() -{ - QPushButton *okButton = m_ui->buttonBox->button(QDialogButtonBox::Ok); - - switch (m_action) { - case ShutdownDialogAction::Exit: - m_msg = tr("qBittorrent will now exit."); - okButton->setText(tr("E&xit Now")); - setWindowTitle(tr("Exit confirmation")); - break; - case ShutdownDialogAction::Shutdown: - m_msg = tr("The computer is going to shutdown."); - okButton->setText(tr("&Shutdown Now")); - setWindowTitle(tr("Shutdown confirmation")); - break; - case ShutdownDialogAction::Suspend: - m_msg = tr("The computer is going to enter suspend mode."); - okButton->setText(tr("&Suspend Now")); - setWindowTitle(tr("Suspend confirmation")); - break; - case ShutdownDialogAction::Hibernate: - m_msg = tr("The computer is going to enter hibernation mode."); - okButton->setText(tr("&Hibernate Now")); - setWindowTitle(tr("Hibernate confirmation")); - break; - } - - m_msg += '\n'; - updateText(); -} - -void ShutdownConfirmDialog::updateText() -{ - QString t = tr("You can cancel the action within %1 seconds.").arg(QString::number(m_timeout)) + '\n'; - m_ui->shutdownText->setText(m_msg + t); -} diff -Nru qbittorrent-4.1.3/src/gui/shutdownconfirmdialog.h qbittorrent-3.3.15/src/gui/shutdownconfirmdialog.h --- qbittorrent-4.1.3/src/gui/shutdownconfirmdialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/shutdownconfirmdialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2011 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef SHUTDOWNCONFIRMDIALOG_H -#define SHUTDOWNCONFIRMDIALOG_H - -#include -#include - -#include "base/types.h" - -namespace Ui -{ - class ShutdownConfirmDialog; -} - -class ShutdownConfirmDialog : public QDialog -{ - Q_OBJECT - -public: - ShutdownConfirmDialog(QWidget *parent, const ShutdownDialogAction &action); - ~ShutdownConfirmDialog(); - - static bool askForConfirmation(QWidget *parent, const ShutdownDialogAction &action); - -protected: - void showEvent(QShowEvent *event) override; - -private slots: - void updateSeconds(); - void accept() override; - -private: - // Methods - void initText(); - void updateText(); - - // Vars - Ui::ShutdownConfirmDialog *m_ui; - QTimer m_timer; - int m_timeout; - ShutdownDialogAction m_action; - QString m_msg; -}; - -#endif // SHUTDOWNCONFIRMDIALOG_H diff -Nru qbittorrent-4.1.3/src/gui/shutdownconfirmdialog.ui qbittorrent-3.3.15/src/gui/shutdownconfirmdialog.ui --- qbittorrent-4.1.3/src/gui/shutdownconfirmdialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/shutdownconfirmdialog.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,127 +0,0 @@ - - - ShutdownConfirmDialog - - - - 0 - 0 - 410 - 140 - - - - - 15 - - - - - - - warning icon - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 20 - 0 - - - - - - - - - 0 - 0 - - - - shutdown message goes here - - - true - - - - - - - Don't show again - - - - - - - - - Qt::Vertical - - - - 0 - 0 - - - - - - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - buttonBox - accepted() - ShutdownConfirmDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - ShutdownConfirmDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff -Nru qbittorrent-4.1.3/src/gui/shutdownconfirmdlg.cpp qbittorrent-3.3.15/src/gui/shutdownconfirmdlg.cpp --- qbittorrent-4.1.3/src/gui/shutdownconfirmdlg.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/shutdownconfirmdlg.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,146 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2011 Christophe Dumez + * Copyright (C) 2014 sledgehammer999 + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + * Contact : hammered999@gmail.com + */ + +#include "shutdownconfirmdlg.h" +#include "ui_shutdownconfirmdlg.h" + +#include +#include +#include +#include + +#include "base/preferences.h" +#include "base/utils/misc.h" + + +ShutdownConfirmDlg::ShutdownConfirmDlg(const ShutdownDialogAction &action) + : ui(new Ui::confirmShutdownDlg) + , m_timeout(15) + , m_action(action) +{ + ui->setupUi(this); + + initText(); + QIcon warningIcon(style()->standardIcon(QStyle::SP_MessageBoxWarning)); + ui->warningLabel->setPixmap(warningIcon.pixmap(32)); + + if (m_action == ShutdownDialogAction::Exit) + ui->neverShowAgainCheckbox->setVisible(true); + else + ui->neverShowAgainCheckbox->setVisible(false); + + // Cancel Button + QPushButton *cancelButton = ui->buttonBox->button(QDialogButtonBox::Cancel); + cancelButton->setFocus(); + cancelButton->setDefault(true); + + // Always on top + setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); + move(Utils::Misc::screenCenter(this)); + + m_timer.setInterval(1000); // 1sec + connect(&m_timer, SIGNAL(timeout()), this, SLOT(updateSeconds())); +} + +ShutdownConfirmDlg::~ShutdownConfirmDlg() +{ + delete ui; +} + +void ShutdownConfirmDlg::showEvent(QShowEvent *event) +{ + QDialog::showEvent(event); + m_timer.start(); +} + +bool ShutdownConfirmDlg::askForConfirmation(const ShutdownDialogAction &action) +{ + ShutdownConfirmDlg dlg(action); + return (dlg.exec() == QDialog::Accepted); +} + +void ShutdownConfirmDlg::updateSeconds() +{ + --m_timeout; + updateText(); + if (m_timeout == 0) { + m_timer.stop(); + accept(); + } +} + +void ShutdownConfirmDlg::accept() +{ + Preferences::instance()->setDontConfirmAutoExit(ui->neverShowAgainCheckbox->isChecked()); + QDialog::accept(); +} + +void ShutdownConfirmDlg::initText() +{ + QPushButton *okButton = ui->buttonBox->button(QDialogButtonBox::Ok); + + switch (m_action) { + case ShutdownDialogAction::Exit: + m_msg = tr("qBittorrent will now exit."); + + okButton->setText(tr("E&xit Now")); + setWindowTitle(tr("Exit confirmation")); + break; + case ShutdownDialogAction::Shutdown: + m_msg = tr("The computer is going to shutdown."); + + okButton->setText(tr("&Shutdown Now")); + setWindowTitle(tr("Shutdown confirmation")); + break; + case ShutdownDialogAction::Suspend: + m_msg = tr("The computer is going to enter suspend mode."); + + okButton->setText(tr("&Suspend Now")); + setWindowTitle(tr("Suspend confirmation")); + break; + case ShutdownDialogAction::Hibernate: + m_msg = tr("The computer is going to enter hibernation mode."); + + okButton->setText(tr("&Hibernate Now")); + setWindowTitle(tr("Hibernate confirmation")); + break; + } + + m_msg += "\n"; + updateText(); +} + +void ShutdownConfirmDlg::updateText() +{ + QString t = tr("You can cancel the action within %1 seconds.").arg(QString::number(m_timeout)) + "\n"; + ui->shutdownText->setText(m_msg + t); +} diff -Nru qbittorrent-4.1.3/src/gui/shutdownconfirmdlg.h qbittorrent-3.3.15/src/gui/shutdownconfirmdlg.h --- qbittorrent-4.1.3/src/gui/shutdownconfirmdlg.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/shutdownconfirmdlg.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,73 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2011 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef SHUTDOWNCONFIRMDLG_H +#define SHUTDOWNCONFIRMDLG_H + +#include +#include +#include "base/types.h" + +namespace Ui +{ + class confirmShutdownDlg; +} + +class ShutdownConfirmDlg: public QDialog +{ + Q_OBJECT + +public: + ShutdownConfirmDlg(const ShutdownDialogAction &action); + ~ShutdownConfirmDlg(); + + static bool askForConfirmation(const ShutdownDialogAction &action); + +protected: + void showEvent(QShowEvent *event) override; + +private slots: + void updateSeconds(); + void accept() override; + +private: + // Methods + void initText(); + void updateText(); + + // Vars + Ui::confirmShutdownDlg *ui; + QTimer m_timer; + int m_timeout; + ShutdownDialogAction m_action; + QString m_msg; +}; + +#endif // SHUTDOWNCONFIRM_H diff -Nru qbittorrent-4.1.3/src/gui/shutdownconfirmdlg.ui qbittorrent-3.3.15/src/gui/shutdownconfirmdlg.ui --- qbittorrent-4.1.3/src/gui/shutdownconfirmdlg.ui 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/shutdownconfirmdlg.ui 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,127 @@ + + + confirmShutdownDlg + + + + 0 + 0 + 410 + 140 + + + + + 15 + + + + + + + warning icon + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 0 + + + + + + + + + 0 + 0 + + + + shutdown message goes here + + + true + + + + + + + Don't show again + + + + + + + + + Qt::Vertical + + + + 0 + 0 + + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + confirmShutdownDlg + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + confirmShutdownDlg + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff -Nru qbittorrent-4.1.3/src/gui/speedlimitdialog.cpp qbittorrent-3.3.15/src/gui/speedlimitdialog.cpp --- qbittorrent-4.1.3/src/gui/speedlimitdialog.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/speedlimitdialog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,122 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "speedlimitdialog.h" - -#include "base/unicodestrings.h" -#include "ui_speedlimitdialog.h" -#include "utils.h" - -SpeedLimitDialog::SpeedLimitDialog(QWidget *parent) - : QDialog(parent) - , m_ui(new Ui::SpeedLimitDialog()) -{ - m_ui->setupUi(this); - qDebug("Bandwidth allocation dialog creation"); - - // Connect to slots - connect(m_ui->bandwidthSlider, &QSlider::valueChanged, this, &SpeedLimitDialog::updateSpinValue); - connect(m_ui->spinBandwidth, static_cast(&QSpinBox::valueChanged) - , this, &SpeedLimitDialog::updateSliderValue); - - Utils::Gui::resize(this); -} - -SpeedLimitDialog::~SpeedLimitDialog() -{ - qDebug("Deleting bandwidth allocation dialog"); - delete m_ui; -} - -// -2: if cancel -long SpeedLimitDialog::askSpeedLimit(QWidget *parent, bool *ok, QString title, long defaultVal, long maxVal) -{ - SpeedLimitDialog dlg(parent); - dlg.setWindowTitle(title); - dlg.setupDialog(maxVal / 1024., defaultVal / 1024.); - if (dlg.exec() == QDialog::Accepted) { - *ok = true; - int val = dlg.getSpeedLimit(); - if (val <= 0) - return 0; - return (val * 1024); - } - else { - *ok = false; - return -2; - } -} - -void SpeedLimitDialog::updateSpinValue(int val) const -{ - qDebug("Called updateSpinValue with %d", val); - if (val <= 0) { - m_ui->spinBandwidth->setValue(0); - m_ui->spinBandwidth->setSpecialValueText(QString::fromUtf8(C_INFINITY)); - m_ui->spinBandwidth->setSuffix(""); - } - else { - m_ui->spinBandwidth->setValue(val); - m_ui->spinBandwidth->setSuffix(' ' + tr("KiB/s")); - } -} - -void SpeedLimitDialog::updateSliderValue(int val) const -{ - if (val <= 0) { - m_ui->spinBandwidth->setValue(0); - m_ui->spinBandwidth->setSpecialValueText(QString::fromUtf8(C_INFINITY)); - m_ui->spinBandwidth->setSuffix(""); - } - if (val > m_ui->bandwidthSlider->maximum()) - m_ui->bandwidthSlider->setMaximum(val); - m_ui->bandwidthSlider->setValue(val); -} - -long SpeedLimitDialog::getSpeedLimit() const -{ - long val = m_ui->bandwidthSlider->value(); - if (val > 0) - return val; - return -1; -} - -void SpeedLimitDialog::setupDialog(long maxSlider, long val) const -{ - if (val < 0) - val = 0; - if (maxSlider <= 0) - maxSlider = 10000; - // This can happen for example if global rate limit is lower - // than torrent rate limit. - if (val > maxSlider) - maxSlider = val; - m_ui->bandwidthSlider->setMaximum(maxSlider); - m_ui->bandwidthSlider->setValue(val); - updateSpinValue(val); -} diff -Nru qbittorrent-4.1.3/src/gui/speedlimitdialog.h qbittorrent-3.3.15/src/gui/speedlimitdialog.h --- qbittorrent-4.1.3/src/gui/speedlimitdialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/speedlimitdialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef SPEEDLIMITDIALOG_H -#define SPEEDLIMITDIALOG_H - -#include - -#include "base/bittorrent/session.h" -#include "base/utils/misc.h" - -namespace Ui -{ - class SpeedLimitDialog; -} - -class SpeedLimitDialog : public QDialog -{ - Q_OBJECT - -public: - explicit SpeedLimitDialog(QWidget *parent); - ~SpeedLimitDialog(); - static long askSpeedLimit(QWidget *parent, bool *ok, QString title, long defaultVal, long maxVal=10240000); - -protected slots: - void updateSpinValue(int val) const; - void updateSliderValue(int val) const; - void setupDialog(long maxSlider, long val) const; - -private: - long getSpeedLimit() const; - - Ui::SpeedLimitDialog *m_ui; -}; - -#endif // SPEEDLIMITDIALOG_H diff -Nru qbittorrent-4.1.3/src/gui/speedlimitdialog.ui qbittorrent-3.3.15/src/gui/speedlimitdialog.ui --- qbittorrent-4.1.3/src/gui/speedlimitdialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/speedlimitdialog.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,79 +0,0 @@ - - - SpeedLimitDialog - - - - 0 - 0 - 338 - 83 - - - - - - - - - Qt::Horizontal - - - - - - - 65535 - - - 0 - - - - - - - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - buttonBox - rejected() - SpeedLimitDialog - reject() - - - 221 - 73 - - - 221 - 82 - - - - - buttonBox - accepted() - SpeedLimitDialog - accept() - - - 277 - 59 - - - 343 - 80 - - - - - diff -Nru qbittorrent-4.1.3/src/gui/speedlimitdlg.cpp qbittorrent-3.3.15/src/gui/speedlimitdlg.cpp --- qbittorrent-4.1.3/src/gui/speedlimitdlg.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/speedlimitdlg.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,120 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#include "speedlimitdlg.h" + +#include "ui_bandwidth_limit.h" +#include "base/unicodestrings.h" + +SpeedLimitDialog::SpeedLimitDialog(QWidget *parent) + : QDialog(parent) + , m_ui(new Ui::bandwidth_dlg()) +{ + m_ui->setupUi(this); + qDebug("Bandwidth allocation dialog creation"); + // Connect to slots + connect(m_ui->bandwidthSlider, SIGNAL(valueChanged(int)), this, SLOT(updateSpinValue(int))); + connect(m_ui->spinBandwidth, SIGNAL(valueChanged(int)), this, SLOT(updateSliderValue(int))); + move(Utils::Misc::screenCenter(this)); +} + +SpeedLimitDialog::~SpeedLimitDialog() +{ + qDebug("Deleting bandwidth allocation dialog"); + delete m_ui; +} + +// -2: if cancel +long SpeedLimitDialog::askSpeedLimit(bool *ok, QString title, long default_value, long max_value) +{ + SpeedLimitDialog dlg; + dlg.setWindowTitle(title); + dlg.setupDialog(max_value / 1024., default_value / 1024.); + if (dlg.exec() == QDialog::Accepted) { + *ok = true; + int val = dlg.getSpeedLimit(); + if (val <= 0) + return 0; + return val * 1024; + } + else { + *ok = false; + return -2; + } +} + +void SpeedLimitDialog::updateSpinValue(int val) const +{ + qDebug("Called updateSpinValue with %d", val); + if (val <= 0) { + m_ui->spinBandwidth->setValue(0); + m_ui->spinBandwidth->setSpecialValueText(QString::fromUtf8(C_INFINITY)); + m_ui->spinBandwidth->setSuffix(QString::fromUtf8("")); + } + else { + m_ui->spinBandwidth->setValue(val); + m_ui->spinBandwidth->setSuffix(" " + tr("KiB/s")); + } +} + +void SpeedLimitDialog::updateSliderValue(int val) const +{ + if (val <= 0) { + m_ui->spinBandwidth->setValue(0); + m_ui->spinBandwidth->setSpecialValueText(QString::fromUtf8(C_INFINITY)); + m_ui->spinBandwidth->setSuffix(QString::fromUtf8("")); + } + if (val > m_ui->bandwidthSlider->maximum()) + m_ui->bandwidthSlider->setMaximum(val); + m_ui->bandwidthSlider->setValue(val); +} + +long SpeedLimitDialog::getSpeedLimit() const +{ + long val = m_ui->bandwidthSlider->value(); + if (val > 0) + return val; + return -1; +} + +void SpeedLimitDialog::setupDialog(long max_slider, long val) const +{ + if (val < 0) + val = 0; + if (max_slider <= 0) + max_slider = 10000; + // This can happen for example if global rate limit is lower + // than torrent rate limit. + if (val > max_slider) + max_slider = val; + m_ui->bandwidthSlider->setMaximum(max_slider); + m_ui->bandwidthSlider->setValue(val); + updateSpinValue(val); +} diff -Nru qbittorrent-4.1.3/src/gui/speedlimitdlg.h qbittorrent-3.3.15/src/gui/speedlimitdlg.h --- qbittorrent-4.1.3/src/gui/speedlimitdlg.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/speedlimitdlg.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,61 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef BANDWIDTH_ALLOCATION_H +#define BANDWIDTH_ALLOCATION_H + +#include +#include +#include "base/utils/misc.h" +#include "base/bittorrent/session.h" + +namespace Ui +{ + class bandwidth_dlg; +} + +class SpeedLimitDialog : public QDialog { + Q_OBJECT +public: + explicit SpeedLimitDialog(QWidget *parent=0); + ~SpeedLimitDialog(); + static long askSpeedLimit(bool *ok, QString title, long default_value, long max_value=10240000); + +protected slots: + void updateSpinValue(int val) const; + void updateSliderValue(int val) const; + long getSpeedLimit() const; + void setupDialog(long max_slider, long val) const; + +private: + Ui::bandwidth_dlg *m_ui; +}; + +#endif diff -Nru qbittorrent-4.1.3/src/gui/statsdialog.cpp qbittorrent-3.3.15/src/gui/statsdialog.cpp --- qbittorrent-4.1.3/src/gui/statsdialog.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/statsdialog.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2013 Nick Tiskov + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2013 Nick Tiskov * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,87 +24,83 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : daymansmail@gmail.com */ #include "statsdialog.h" +#include "ui_statsdialog.h" -#include "base/bittorrent/cachestatus.h" +#include "base/utils/misc.h" +#include "base/utils/string.h" #include "base/bittorrent/session.h" #include "base/bittorrent/sessionstatus.h" +#include "base/bittorrent/cachestatus.h" #include "base/bittorrent/torrenthandle.h" -#include "base/utils/misc.h" -#include "base/utils/string.h" -#include "ui_statsdialog.h" -#include "utils.h" StatsDialog::StatsDialog(QWidget *parent) : QDialog(parent) - , m_ui(new Ui::StatsDialog) + , ui(new Ui::StatsDialog) { - m_ui->setupUi(this); - setAttribute(Qt::WA_DeleteOnClose); - connect(m_ui->buttonBox, &QDialogButtonBox::accepted, this, &StatsDialog::close); - - update(); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::statsUpdated - , this, &StatsDialog::update); - - Utils::Gui::resize(this); - show(); + ui->setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + connect(ui->buttonOK, SIGNAL(clicked()), SLOT(close())); + updateUI(); + t = new QTimer(this); + t->setInterval(1500); + connect(t, SIGNAL(timeout()), SLOT(updateUI())); + t->start(); + show(); } -StatsDialog::~StatsDialog() -{ - delete m_ui; +StatsDialog::~StatsDialog() { + t->stop(); + delete t; + delete ui; } -void StatsDialog::update() -{ - const BitTorrent::SessionStatus &ss = BitTorrent::Session::instance()->status(); - const BitTorrent::CacheStatus &cs = BitTorrent::Session::instance()->cacheStatus(); - - // All-time DL/UL - quint64 atd = BitTorrent::Session::instance()->getAlltimeDL(); - quint64 atu = BitTorrent::Session::instance()->getAlltimeUL(); - m_ui->labelAlltimeDL->setText(Utils::Misc::friendlyUnit(atd)); - m_ui->labelAlltimeUL->setText(Utils::Misc::friendlyUnit(atu)); - // Total waste (this session) - m_ui->labelWaste->setText(Utils::Misc::friendlyUnit(ss.totalWasted)); - // Global ratio - m_ui->labelGlobalRatio->setText( - ((atd > 0) && (atu > 0)) - ? Utils::String::fromDouble(static_cast(atu) / atd, 2) - : "-"); - // Cache hits - qreal readRatio = cs.readRatio; - m_ui->labelCacheHits->setText(QString("%1%").arg( - readRatio > 0 - ? Utils::String::fromDouble(100 * readRatio, 2) - : "0")); - // Buffers size - m_ui->labelTotalBuf->setText(Utils::Misc::friendlyUnit(cs.totalUsedBuffers * 16 * 1024)); - // Disk overload (100%) equivalent - // From lt manual: disk_write_queue and disk_read_queue are the number of peers currently waiting on a disk write or disk read - // to complete before it receives or sends any more data on the socket. It's a metric of how disk bound you are. - - // num_peers is not reliable (adds up peers, which didn't even overcome tcp handshake) - quint32 peers = 0; - foreach (BitTorrent::TorrentHandle *const torrent, BitTorrent::Session::instance()->torrents()) - peers += torrent->peersCount(); - - m_ui->labelWriteStarve->setText(QString("%1%") - .arg(((ss.diskWriteQueue > 0) && (peers > 0)) - ? Utils::String::fromDouble((100. * ss.diskWriteQueue) / peers, 2) - : "0")); - m_ui->labelReadStarve->setText(QString("%1%") - .arg(((ss.diskReadQueue > 0) && (peers > 0)) - ? Utils::String::fromDouble((100. * ss.diskReadQueue) / peers, 2) - : "0")); - // Disk queues - m_ui->labelQueuedJobs->setText(QString::number(cs.jobQueueLength)); - m_ui->labelJobsTime->setText(tr("%1 ms", "18 milliseconds").arg(cs.averageJobTime)); - m_ui->labelQueuedBytes->setText(Utils::Misc::friendlyUnit(cs.queuedBytes)); +void StatsDialog::updateUI() { + BitTorrent::SessionStatus ss = BitTorrent::Session::instance()->status(); + BitTorrent::CacheStatus cs = BitTorrent::Session::instance()->cacheStatus(); + + // Alltime DL/UL + quint64 atd = BitTorrent::Session::instance()->getAlltimeDL(); + quint64 atu = BitTorrent::Session::instance()->getAlltimeUL(); + ui->labelAlltimeDL->setText(Utils::Misc::friendlyUnit(atd)); + ui->labelAlltimeUL->setText(Utils::Misc::friendlyUnit(atu)); + // Total waste (this session) + ui->labelWaste->setText(Utils::Misc::friendlyUnit(ss.totalWasted())); + // Global ratio + ui->labelGlobalRatio->setText( + ( atd > 0 && atu > 0 ) ? + Utils::String::fromDouble((qreal)atu / (qreal)atd, 2) : + "-" + ); + // Cache hits + qreal readRatio = cs.readRatio(); + ui->labelCacheHits->setText((readRatio >= 0) ? Utils::String::fromDouble(100 * readRatio, 2) : "-"); + // Buffers size + ui->labelTotalBuf->setText(Utils::Misc::friendlyUnit(cs.totalUsedBuffers() * 16 * 1024)); + // Disk overload (100%) equivalent + // From lt manual: disk_write_queue and disk_read_queue are the number of peers currently waiting on a disk write or disk read + // to complete before it receives or sends any more data on the socket. It's a metric of how disk bound you are. + + // num_peers is not reliable (adds up peers, which didn't even overcome tcp handshake) + quint32 peers = 0; + foreach (BitTorrent::TorrentHandle *const torrent, BitTorrent::Session::instance()->torrents()) + peers += torrent->peersCount(); + + ui->labelWriteStarve->setText(QString("%1%").arg(((ss.diskWriteQueue() > 0) && (peers > 0)) + ? Utils::String::fromDouble((100. * ss.diskWriteQueue()) / peers, 2) + : "0")); + ui->labelReadStarve->setText(QString("%1%").arg(((ss.diskReadQueue() > 0) && (peers > 0)) + ? Utils::String::fromDouble((100. * ss.diskReadQueue()) / peers, 2) + : "0")); + // Disk queues + ui->labelQueuedJobs->setText(QString::number(cs.jobQueueLength())); + ui->labelJobsTime->setText(tr("%1 ms", "18 milliseconds").arg(cs.averageJobTime())); + ui->labelQueuedBytes->setText(Utils::Misc::friendlyUnit(cs.queuedBytes())); - // Total connected peers - m_ui->labelPeers->setText(QString::number(ss.peersCount)); + // Total connected peers + ui->labelPeers->setText(QString::number(ss.peersCount())); } diff -Nru qbittorrent-4.1.3/src/gui/statsdialog.h qbittorrent-3.3.15/src/gui/statsdialog.h --- qbittorrent-4.1.3/src/gui/statsdialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/statsdialog.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2013 Nick Tiskov + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2013 Nick Tiskov * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,31 +24,33 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : daymansmail@gmail.com */ #ifndef STATSDIALOG_H #define STATSDIALOG_H #include +#include -namespace Ui -{ - class StatsDialog; +namespace Ui { + class StatsDialog; } -class StatsDialog : public QDialog -{ - Q_OBJECT +class StatsDialog : public QDialog { + Q_OBJECT public: - explicit StatsDialog(QWidget *parent); - ~StatsDialog() override; + explicit StatsDialog(QWidget *parent = 0); + ~StatsDialog(); private slots: - void update(); + void updateUI(); private: - Ui::StatsDialog *m_ui; + Ui::StatsDialog *ui; + QTimer* t; }; #endif // STATSDIALOG_H diff -Nru qbittorrent-4.1.3/src/gui/statsdialog.ui qbittorrent-3.3.15/src/gui/statsdialog.ui --- qbittorrent-4.1.3/src/gui/statsdialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/statsdialog.ui 2017-08-03 20:30:10.000000000 +0000 @@ -6,8 +6,8 @@ 0 0 - 286 - 401 + 273 + 395 @@ -20,71 +20,71 @@ User statistics - - - - TextLabel - - - - + - Connected peers: + Total peer connections: - + - All-time share ratio: + Global ratio: - + TextLabel - + - All-time download: + Alltime download: - + TextLabel - - + + TextLabel - - + + - Session waste: + Alltime upload: - - + + - All-time upload: + TextLabel - - + + + + Total waste (this session): + + + + + TextLabel @@ -99,31 +99,31 @@ Cache statistics - + Read cache hits: - + TextLabel - + TextLabel - + - Total buffer size: + Total buffers size: @@ -223,11 +223,28 @@ - - - QDialogButtonBox::Ok - - + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + OK + + + + diff -Nru qbittorrent-4.1.3/src/gui/statusbar.cpp qbittorrent-3.3.15/src/gui/statusbar.cpp --- qbittorrent-4.1.3/src/gui/statusbar.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/statusbar.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,130 +24,121 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #include "statusbar.h" #include -#include +#include #include -#include #include +#include #include -#include +#include +#include +#include #include "base/bittorrent/session.h" #include "base/bittorrent/sessionstatus.h" -#include "base/utils/misc.h" +#include "speedlimitdlg.h" #include "guiiconprovider.h" -#include "speedlimitdialog.h" -#include "utils.h" +#include "base/utils/misc.h" +#include "base/logger.h" -StatusBar::StatusBar(QWidget *parent) - : QStatusBar(parent) +StatusBar::StatusBar(QStatusBar *bar) + : m_bar(bar) { -#ifndef Q_OS_MAC - // Redefining global stylesheet breaks certain elements on mac like tabs. - // Qt checks whether the stylesheet class inherts("QMacStyle") and this becomes false. qApp->setStyleSheet("QStatusBar::item { border-width: 0; }"); -#endif BitTorrent::Session *const session = BitTorrent::Session::instance(); - connect(session, &BitTorrent::Session::speedLimitModeChanged, this, &StatusBar::updateAltSpeedsBtn); - QWidget *container = new QWidget(this); - QHBoxLayout *layout = new QHBoxLayout(container); - layout->setContentsMargins(0,0,0,0); + connect(session, SIGNAL(speedLimitModeChanged(bool)), this, SLOT(updateAltSpeedsBtn(bool))); + m_container = new QWidget(bar); + m_layout = new QHBoxLayout(m_container); + m_layout->setContentsMargins(0,0,0,0); - container->setLayout(layout); - m_connecStatusLblIcon = new QPushButton(this); + m_container->setLayout(m_layout); + m_connecStatusLblIcon = new QPushButton(bar); m_connecStatusLblIcon->setFlat(true); m_connecStatusLblIcon->setFocusPolicy(Qt::NoFocus); m_connecStatusLblIcon->setCursor(Qt::PointingHandCursor); - m_connecStatusLblIcon->setIcon(QIcon(":/icons/skin/firewalled.svg")); - m_connecStatusLblIcon->setToolTip( - QString(QLatin1String("%1
    %2")).arg(tr("Connection status:") - , tr("No direct connections. This may indicate network configuration problems."))); - connect(m_connecStatusLblIcon, &QAbstractButton::clicked, this, &StatusBar::connectionButtonClicked); - - m_dlSpeedLbl = new QPushButton(this); - m_dlSpeedLbl->setIcon(QIcon(":/icons/skin/download.svg")); - connect(m_dlSpeedLbl, &QAbstractButton::clicked, this, &StatusBar::capDownloadSpeed); + m_connecStatusLblIcon->setIcon(QIcon(":/icons/skin/firewalled.png")); + m_connecStatusLblIcon->setToolTip(QString::fromUtf8("") + tr("Connection status:") + QString::fromUtf8("
    ") + QString::fromUtf8("") + tr("No direct connections. This may indicate network configuration problems.") + QString::fromUtf8("")); + + m_dlSpeedLbl = new QPushButton(bar); + m_dlSpeedLbl->setIcon(QIcon(":/icons/skin/download.png")); + connect(m_dlSpeedLbl, SIGNAL(clicked()), this, SLOT(capDownloadSpeed())); m_dlSpeedLbl->setFlat(true); m_dlSpeedLbl->setFocusPolicy(Qt::NoFocus); m_dlSpeedLbl->setCursor(Qt::PointingHandCursor); m_dlSpeedLbl->setStyleSheet("text-align:left;"); m_dlSpeedLbl->setMinimumWidth(200); - m_upSpeedLbl = new QPushButton(this); - m_upSpeedLbl->setIcon(QIcon(":/icons/skin/seeding.svg")); - connect(m_upSpeedLbl, &QAbstractButton::clicked, this, &StatusBar::capUploadSpeed); + m_upSpeedLbl = new QPushButton(bar); + m_upSpeedLbl->setIcon(QIcon(":/icons/skin/seeding.png")); + connect(m_upSpeedLbl, SIGNAL(clicked()), this, SLOT(capUploadSpeed())); m_upSpeedLbl->setFlat(true); m_upSpeedLbl->setFocusPolicy(Qt::NoFocus); m_upSpeedLbl->setCursor(Qt::PointingHandCursor); m_upSpeedLbl->setStyleSheet("text-align:left;"); m_upSpeedLbl->setMinimumWidth(200); - m_DHTLbl = new QLabel(tr("DHT: %1 nodes").arg(0), this); + m_DHTLbl = new QLabel(tr("DHT: %1 nodes").arg(0), bar); m_DHTLbl->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); - m_altSpeedsBtn = new QPushButton(this); + m_altSpeedsBtn = new QPushButton(bar); m_altSpeedsBtn->setFlat(true); m_altSpeedsBtn->setFocusPolicy(Qt::NoFocus); m_altSpeedsBtn->setCursor(Qt::PointingHandCursor); updateAltSpeedsBtn(session->isAltGlobalSpeedLimitEnabled()); - connect(m_altSpeedsBtn, &QAbstractButton::clicked, this, &StatusBar::alternativeSpeedsButtonClicked); + connect(m_altSpeedsBtn, SIGNAL(clicked()), this, SLOT(toggleAlternativeSpeeds())); // Because on some platforms the default icon size is bigger // and it will result in taller/fatter statusbar, even if the // icons are actually 16x16 - m_connecStatusLblIcon->setIconSize(Utils::Gui::smallIconSize()); - m_dlSpeedLbl->setIconSize(Utils::Gui::smallIconSize()); - m_upSpeedLbl->setIconSize(Utils::Gui::smallIconSize()); - m_altSpeedsBtn->setIconSize(QSize(Utils::Gui::mediumIconSize().width(), Utils::Gui::smallIconSize().height())); + m_connecStatusLblIcon->setIconSize(QSize(16, 16)); + m_dlSpeedLbl->setIconSize(QSize(16, 16)); + m_upSpeedLbl->setIconSize(QSize(16, 16)); + m_altSpeedsBtn->setIconSize(QSize(28, 16)); // Set to the known maximum width(plus some padding) // so the speed widgets will take the rest of the space - m_connecStatusLblIcon->setMaximumWidth(Utils::Gui::largeIconSize().width()); - m_altSpeedsBtn->setMaximumWidth(Utils::Gui::largeIconSize().width()); + m_connecStatusLblIcon->setMaximumWidth(16 + 6); + m_altSpeedsBtn->setMaximumWidth(28 + 6); - QFrame *statusSep1 = new QFrame(this); - statusSep1->setFrameStyle(QFrame::VLine); -#ifndef Q_OS_MAC - statusSep1->setFrameShadow(QFrame::Raised); -#endif - QFrame *statusSep2 = new QFrame(this); - statusSep2->setFrameStyle(QFrame::VLine); -#ifndef Q_OS_MAC - statusSep2->setFrameShadow(QFrame::Raised); -#endif - QFrame *statusSep3 = new QFrame(this); - statusSep3->setFrameStyle(QFrame::VLine); -#ifndef Q_OS_MAC - statusSep3->setFrameShadow(QFrame::Raised); -#endif - QFrame *statusSep4 = new QFrame(this); - statusSep4->setFrameStyle(QFrame::VLine); -#ifndef Q_OS_MAC - statusSep4->setFrameShadow(QFrame::Raised); -#endif - layout->addWidget(m_DHTLbl); - layout->addWidget(statusSep1); - layout->addWidget(m_connecStatusLblIcon); - layout->addWidget(statusSep2); - layout->addWidget(m_altSpeedsBtn); - layout->addWidget(statusSep4); - layout->addWidget(m_dlSpeedLbl); - layout->addWidget(statusSep3); - layout->addWidget(m_upSpeedLbl); - - addPermanentWidget(container); - setStyleSheet("QWidget {margin: 0;}"); - container->adjustSize(); - adjustSize(); + m_statusSep1 = new QFrame(bar); + m_statusSep1->setFrameStyle(QFrame::VLine); + m_statusSep1->setFrameShadow(QFrame::Raised); + m_statusSep2 = new QFrame(bar); + m_statusSep2->setFrameStyle(QFrame::VLine); + m_statusSep2->setFrameShadow(QFrame::Raised); + m_statusSep3 = new QFrame(bar); + m_statusSep3->setFrameStyle(QFrame::VLine); + m_statusSep3->setFrameShadow(QFrame::Raised); + m_statusSep4 = new QFrame(bar); + m_statusSep4->setFrameStyle(QFrame::VLine); + m_statusSep4->setFrameShadow(QFrame::Raised); + m_layout->addWidget(m_DHTLbl); + m_layout->addWidget(m_statusSep1); + m_layout->addWidget(m_connecStatusLblIcon); + m_layout->addWidget(m_statusSep2); + m_layout->addWidget(m_altSpeedsBtn); + m_layout->addWidget(m_statusSep4); + m_layout->addWidget(m_dlSpeedLbl); + m_layout->addWidget(m_statusSep3); + m_layout->addWidget(m_upSpeedLbl); + + bar->addPermanentWidget(m_container); + bar->setStyleSheet("QWidget {margin: 0;}"); + m_container->adjustSize(); + bar->adjustSize(); // Is DHT enabled m_DHTLbl->setVisible(session->isDHTEnabled()); - refresh(); - connect(session, &BitTorrent::Session::statsUpdated, this, &StatusBar::refresh); + m_refreshTimer = new QTimer(bar); + refreshStatusBar(); + connect(m_refreshTimer, SIGNAL(timeout()), this, SLOT(refreshStatusBar())); + m_refreshTimer->start(1500); } StatusBar::~StatusBar() @@ -155,76 +146,84 @@ qDebug() << Q_FUNC_INFO; } +QPushButton* StatusBar::connectionStatusButton() const +{ + return m_connecStatusLblIcon; +} + void StatusBar::showRestartRequired() { // Restart required notification - const QString restartText = tr("qBittorrent needs to be restarted!"); - QLabel *restartIconLbl = new QLabel(this); - restartIconLbl->setPixmap(style()->standardPixmap(QStyle::SP_MessageBoxWarning)); + const QString restartText = tr("qBittorrent needs to be restarted"); + QLabel *restartIconLbl = new QLabel(m_bar); + restartIconLbl->setPixmap(QPixmap(":/icons/oxygen/dialog-warning.png").scaled(QSize(24,24))); restartIconLbl->setToolTip(restartText); - insertWidget(0, restartIconLbl); - - QLabel *restartLbl = new QLabel(this); - restartLbl->setText(restartText); - insertWidget(1, restartLbl); + m_bar->insertWidget(0, restartIconLbl); + QLabel *restartLbl = new QLabel(m_bar); + restartLbl->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); + m_bar->insertWidget(1, restartLbl); + QFontMetrics fm(restartLbl->font()); + restartLbl->setText(fm.elidedText(restartText, Qt::ElideRight, restartLbl->width())); + Logger::instance()->addMessage(tr("qBittorrent was just updated and needs to be restarted for the changes to be effective."), Log::CRITICAL); } -void StatusBar::updateConnectionStatus() +void StatusBar::stopTimer() { - const BitTorrent::SessionStatus &sessionStatus = BitTorrent::Session::instance()->status(); + m_refreshTimer->stop(); +} +void StatusBar::updateConnectionStatus(const BitTorrent::SessionStatus &sessionStatus) +{ if (!BitTorrent::Session::instance()->isListening()) { - m_connecStatusLblIcon->setIcon(QIcon(QLatin1String(":/icons/skin/disconnected.svg"))); + m_connecStatusLblIcon->setIcon(QIcon(QLatin1String(":/icons/skin/disconnected.png"))); m_connecStatusLblIcon->setToolTip(QLatin1String("") + tr("Connection Status:") + QLatin1String("
    ") + tr("Offline. This usually means that qBittorrent failed to listen on the selected port for incoming connections.")); } else { - if (sessionStatus.hasIncomingConnections) { + if (sessionStatus.hasIncomingConnections()) { // Connection OK - m_connecStatusLblIcon->setIcon(QIcon(QLatin1String(":/icons/skin/connected.svg"))); + m_connecStatusLblIcon->setIcon(QIcon(QLatin1String(":/icons/skin/connected.png"))); m_connecStatusLblIcon->setToolTip(QLatin1String("") + tr("Connection Status:") + QLatin1String("
    ") + tr("Online")); } else { - m_connecStatusLblIcon->setIcon(QIcon(QLatin1String(":/icons/skin/firewalled.svg"))); + m_connecStatusLblIcon->setIcon(QIcon(QLatin1String(":/icons/skin/firewalled.png"))); m_connecStatusLblIcon->setToolTip(QLatin1String("") + tr("Connection status:") + QLatin1String("
    ") + QLatin1String("") + tr("No direct connections. This may indicate network configuration problems.") + QLatin1String("")); } } } -void StatusBar::updateDHTNodesNumber() +void StatusBar::updateDHTNodesNumber(const BitTorrent::SessionStatus &sessionStatus) { if (BitTorrent::Session::instance()->isDHTEnabled()) { m_DHTLbl->setVisible(true); - m_DHTLbl->setText(tr("DHT: %1 nodes") - .arg(BitTorrent::Session::instance()->status().dhtNodes)); + m_DHTLbl->setText(tr("DHT: %1 nodes").arg(QString::number(sessionStatus.dhtNodes()))); } else { m_DHTLbl->setVisible(false); } } -void StatusBar::updateSpeedLabels() +void StatusBar::updateSpeedLabels(const BitTorrent::SessionStatus &sessionStatus) { - const BitTorrent::SessionStatus &sessionStatus = BitTorrent::Session::instance()->status(); - - QString speedLbl = Utils::Misc::friendlyUnit(sessionStatus.payloadDownloadRate, true); + QString speedLbl = Utils::Misc::friendlyUnit(sessionStatus.payloadDownloadRate(), true); int speedLimit = BitTorrent::Session::instance()->downloadSpeedLimit(); if (speedLimit) - speedLbl += " [" + Utils::Misc::friendlyUnit(speedLimit, true) + ']'; - speedLbl += " (" + Utils::Misc::friendlyUnit(sessionStatus.totalPayloadDownload) + ')'; + speedLbl += " [" + Utils::Misc::friendlyUnit(speedLimit, true) + "]"; + speedLbl += " (" + Utils::Misc::friendlyUnit(sessionStatus.totalPayloadDownload()) + ")"; m_dlSpeedLbl->setText(speedLbl); speedLimit = BitTorrent::Session::instance()->uploadSpeedLimit(); - speedLbl = Utils::Misc::friendlyUnit(sessionStatus.payloadUploadRate, true); + speedLbl = Utils::Misc::friendlyUnit(sessionStatus.payloadUploadRate(), true); if (speedLimit) - speedLbl += " [" + Utils::Misc::friendlyUnit(speedLimit, true) + ']'; - speedLbl += " (" + Utils::Misc::friendlyUnit(sessionStatus.totalPayloadUpload) + ')'; + speedLbl += " [" + Utils::Misc::friendlyUnit(speedLimit, true) + "]"; + speedLbl += " (" + Utils::Misc::friendlyUnit(sessionStatus.totalPayloadUpload()) + ")"; m_upSpeedLbl->setText(speedLbl); } -void StatusBar::refresh() +void StatusBar::refreshStatusBar() { - updateConnectionStatus(); - updateDHTNodesNumber(); - updateSpeedLabels(); + const BitTorrent::SessionStatus sessionStatus = BitTorrent::Session::instance()->status(); + updateConnectionStatus(sessionStatus); + updateDHTNodesNumber(sessionStatus); + updateSpeedLabels(sessionStatus); } void StatusBar::updateAltSpeedsBtn(bool alternative) @@ -239,33 +238,39 @@ m_altSpeedsBtn->setToolTip(tr("Click to switch to alternative speed limits")); m_altSpeedsBtn->setDown(false); } - refresh(); + refreshStatusBar(); } -void StatusBar::capDownloadSpeed() +void StatusBar::toggleAlternativeSpeeds() { BitTorrent::Session *const session = BitTorrent::Session::instance(); + if (session->isBandwidthSchedulerEnabled()) + m_bar->showMessage(tr("Manual change of rate limits mode. The scheduler is disabled."), 5000); + session->setAltGlobalSpeedLimitEnabled(!session->isAltGlobalSpeedLimitEnabled()); +} +void StatusBar::capDownloadSpeed() +{ + BitTorrent::Session *const session = BitTorrent::Session::instance(); bool ok = false; const long newLimit = SpeedLimitDialog::askSpeedLimit( - parentWidget(), &ok, tr("Global Download Speed Limit"), session->downloadSpeedLimit()); + &ok, tr("Global Download Speed Limit"), session->downloadSpeedLimit()); if (ok) { qDebug("Setting global download rate limit to %.1fKb/s", newLimit / 1024.); session->setDownloadSpeedLimit(newLimit); - refresh(); + refreshStatusBar(); } } void StatusBar::capUploadSpeed() { BitTorrent::Session *const session = BitTorrent::Session::instance(); - bool ok = false; const long newLimit = SpeedLimitDialog::askSpeedLimit( - parentWidget(), &ok, tr("Global Upload Speed Limit"), session->uploadSpeedLimit()); + &ok, tr("Global Upload Speed Limit"), session->uploadSpeedLimit()); if (ok) { qDebug("Setting global upload rate limit to %.1fKb/s", newLimit / 1024.); session->setUploadSpeedLimit(newLimit); - refresh(); + refreshStatusBar(); } } diff -Nru qbittorrent-4.1.3/src/gui/statusbar.h qbittorrent-3.3.15/src/gui/statusbar.h --- qbittorrent-4.1.3/src/gui/statusbar.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/statusbar.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,53 +24,64 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef STATUSBAR_H #define STATUSBAR_H -#include +#include +class QStatusBar; +class QFrame; class QLabel; +class QTimer; class QPushButton; +class QHBoxLayout; namespace BitTorrent { - struct SessionStatus; + class SessionStatus; } -class StatusBar : public QStatusBar +class StatusBar: public QObject { Q_OBJECT - Q_DISABLE_COPY(StatusBar) public: - StatusBar(QWidget *parent = nullptr); - ~StatusBar() override; + StatusBar(QStatusBar *bar); + ~StatusBar(); -signals: - void alternativeSpeedsButtonClicked(); - void connectionButtonClicked(); + QPushButton* connectionStatusButton() const; public slots: void showRestartRequired(); - -private slots: - void refresh(); + void stopTimer(); + void refreshStatusBar(); void updateAltSpeedsBtn(bool alternative); + void toggleAlternativeSpeeds(); void capDownloadSpeed(); void capUploadSpeed(); private: - void updateConnectionStatus(); - void updateDHTNodesNumber(); - void updateSpeedLabels(); - + QStatusBar *m_bar; QPushButton *m_dlSpeedLbl; QPushButton *m_upSpeedLbl; QLabel *m_DHTLbl; + QFrame *m_statusSep1; + QFrame *m_statusSep2; + QFrame *m_statusSep3; + QFrame *m_statusSep4; QPushButton *m_connecStatusLblIcon; QPushButton *m_altSpeedsBtn; + QTimer *m_refreshTimer; + QWidget *m_container; + QHBoxLayout *m_layout; + + void updateConnectionStatus(const BitTorrent::SessionStatus &sessionStatus); + void updateDHTNodesNumber(const BitTorrent::SessionStatus &sessionStatus); + void updateSpeedLabels(const BitTorrent::SessionStatus &sessionStatus); }; #endif // STATUSBAR_H diff -Nru qbittorrent-4.1.3/src/gui/tagfiltermodel.cpp qbittorrent-3.3.15/src/gui/tagfiltermodel.cpp --- qbittorrent-4.1.3/src/gui/tagfiltermodel.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/tagfiltermodel.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,336 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Tony Gregerson - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "tagfiltermodel.h" - -#include -#include - -#include "base/bittorrent/session.h" -#include "base/bittorrent/torrenthandle.h" -#include "guiiconprovider.h" - -namespace -{ - QString getSpecialAllTag() - { - const QString ALL_TAG = QLatin1String(" "); - Q_ASSERT(!BitTorrent::Session::isValidTag(ALL_TAG)); - return ALL_TAG; - } - - QString getSpecialUntaggedTag() - { - const QString UNTAGGED_TAG = QLatin1String(" "); - Q_ASSERT(!BitTorrent::Session::isValidTag(UNTAGGED_TAG)); - return UNTAGGED_TAG; - } -} - -class TagModelItem -{ -public: - TagModelItem(const QString &tag, int torrentsCount = 0) - : m_tag(tag) - , m_torrentsCount(torrentsCount) - { - } - - QString tag() const - { - return m_tag; - } - - int torrentsCount() const - { - return m_torrentsCount; - } - - void increaseTorrentsCount() - { - ++m_torrentsCount; - } - - void decreaseTorrentsCount() - { - Q_ASSERT(m_torrentsCount > 0); - --m_torrentsCount; - } - -private: - QString m_tag; - int m_torrentsCount; -}; - -TagFilterModel::TagFilterModel(QObject *parent) - : QAbstractListModel(parent) -{ - using Session = BitTorrent::Session; - auto session = Session::instance(); - - connect(session, &Session::tagAdded, this, &TagFilterModel::tagAdded); - connect(session, &Session::tagRemoved, this, &TagFilterModel::tagRemoved); - connect(session, &Session::torrentTagAdded, this, &TagFilterModel::torrentTagAdded); - connect(session, &Session::torrentTagRemoved, this, &TagFilterModel::torrentTagRemoved); - connect(session, &Session::torrentAdded, this, &TagFilterModel::torrentAdded); - connect(session, &Session::torrentAboutToBeRemoved, this, &TagFilterModel::torrentAboutToBeRemoved); - populate(); -} - -TagFilterModel::~TagFilterModel() = default; - -bool TagFilterModel::isSpecialItem(const QModelIndex &index) -{ - // the first two items are special items: 'All' and 'Untagged' - return (!index.parent().isValid() && (index.row() <= 1)); -} - -QVariant TagFilterModel::data(const QModelIndex &index, int role) const -{ - if (!index.isValid() || (index.column() != 0)) - return QVariant(); - - const int row = index.internalId(); - Q_ASSERT(isValidRow(row)); - const TagModelItem &item = m_tagItems[row]; - - switch (role) { - case Qt::DecorationRole: - return GuiIconProvider::instance()->getIcon("inode-directory"); - case Qt::DisplayRole: - return QString(QLatin1String("%1 (%2)")) - .arg(tagDisplayName(item.tag())).arg(item.torrentsCount()); - case Qt::UserRole: - return item.torrentsCount(); - default: - return QVariant(); - } -} - -Qt::ItemFlags TagFilterModel::flags(const QModelIndex &index) const -{ - if (!index.isValid()) - return Qt::NoItemFlags; - return Qt::ItemIsEnabled | Qt::ItemIsSelectable; -} - -QVariant TagFilterModel::headerData(int section, Qt::Orientation orientation, int role) const -{ - if ((orientation == Qt::Horizontal) && (role == Qt::DisplayRole)) - if (section == 0) - return tr("Tags"); - return QVariant(); -} - -QModelIndex TagFilterModel::index(int row, int, const QModelIndex &) const -{ - if (!isValidRow(row)) - return QModelIndex(); - return createIndex(row, 0, row); -} - -int TagFilterModel::rowCount(const QModelIndex &parent) const -{ - if (!parent.isValid()) - return m_tagItems.count(); - return 0; -} - -bool TagFilterModel::isValidRow(int row) const -{ - return (row >= 0) && (row < m_tagItems.size()); -} - -QModelIndex TagFilterModel::index(const QString &tag) const -{ - const int row = findRow(tag); - if (!isValidRow(row)) - return QModelIndex(); - return index(row, 0, QModelIndex()); -} - -QString TagFilterModel::tag(const QModelIndex &index) const -{ - if (!index.isValid()) - return QString(); - const int row = index.internalId(); - Q_ASSERT(isValidRow(row)); - return m_tagItems[row].tag(); -} - -void TagFilterModel::tagAdded(const QString &tag) -{ - const int row = m_tagItems.count(); - beginInsertRows(QModelIndex(), row, row); - addToModel(tag, 0); - endInsertRows(); -} - -void TagFilterModel::tagRemoved(const QString &tag) -{ - QModelIndex i = index(tag); - beginRemoveRows(i.parent(), i.row(), i.row()); - removeFromModel(i.row()); - endRemoveRows(); -} - -void TagFilterModel::torrentTagAdded(BitTorrent::TorrentHandle *const torrent, const QString &tag) -{ - if (torrent->tags().count() == 1) - untaggedItem()->decreaseTorrentsCount(); - - const int row = findRow(tag); - Q_ASSERT(isValidRow(row)); - TagModelItem &item = m_tagItems[row]; - - item.increaseTorrentsCount(); - const QModelIndex i = index(row, 0, QModelIndex()); - emit dataChanged(i, i); -} - -void TagFilterModel::torrentTagRemoved(BitTorrent::TorrentHandle *const torrent, const QString &tag) -{ - Q_ASSERT(torrent->tags().count() >= 0); - if (torrent->tags().count() == 0) - untaggedItem()->increaseTorrentsCount(); - - const int row = findRow(tag); - Q_ASSERT(isValidRow(row)); - TagModelItem &item = m_tagItems[row]; - - item.decreaseTorrentsCount(); - const QModelIndex i = index(row, 0, QModelIndex()); - emit dataChanged(i, i); -} - -void TagFilterModel::torrentAdded(BitTorrent::TorrentHandle *const torrent) -{ - allTagsItem()->increaseTorrentsCount(); - - const QVector items = findItems(torrent->tags()); - if (items.isEmpty()) - untaggedItem()->increaseTorrentsCount(); - - foreach (TagModelItem *item, items) - item->increaseTorrentsCount(); -} - -void TagFilterModel::torrentAboutToBeRemoved(BitTorrent::TorrentHandle *const torrent) -{ - allTagsItem()->decreaseTorrentsCount(); - - if (torrent->tags().isEmpty()) - untaggedItem()->decreaseTorrentsCount(); - - foreach (TagModelItem *item, findItems(torrent->tags())) - item->decreaseTorrentsCount(); -} - -QString TagFilterModel::tagDisplayName(const QString &tag) -{ - if (tag == getSpecialAllTag()) - return tr("All"); - if (tag == getSpecialUntaggedTag()) - return tr("Untagged"); - return tag; -} - -void TagFilterModel::populate() -{ - using Torrent = BitTorrent::TorrentHandle; - - auto session = BitTorrent::Session::instance(); - auto torrents = session->torrents(); - - // All torrents - addToModel(getSpecialAllTag(), torrents.count()); - - const int untaggedCount = std::count_if(torrents.begin(), torrents.end(), - [](Torrent *torrent) { return torrent->tags().isEmpty(); }); - addToModel(getSpecialUntaggedTag(), untaggedCount); - - foreach (const QString &tag, session->tags()) { - const int count = std::count_if(torrents.begin(), torrents.end(), - [tag](Torrent *torrent) { return torrent->hasTag(tag); }); - addToModel(tag, count); - } -} - -void TagFilterModel::addToModel(const QString &tag, int count) -{ - m_tagItems.append(TagModelItem(tag, count)); -} - -void TagFilterModel::removeFromModel(int row) -{ - Q_ASSERT(isValidRow(row)); - m_tagItems.removeAt(row); -} - -int TagFilterModel::findRow(const QString &tag) const -{ - for (int i = 0; i < m_tagItems.size(); ++i) { - if (m_tagItems[i].tag() == tag) - return i; - } - return -1; -} - -TagModelItem *TagFilterModel::findItem(const QString &tag) -{ - const int row = findRow(tag); - if (!isValidRow(row)) - return nullptr; - return &m_tagItems[row]; -} - -QVector TagFilterModel::findItems(const QSet &tags) -{ - QVector items; - items.reserve(tags.size()); - foreach (const QString &tag, tags) { - TagModelItem *item = findItem(tag); - if (item) - items.push_back(item); - else - qWarning() << QString("Requested tag '%1' missing from the model.").arg(tag); - } - return items; -} - -TagModelItem *TagFilterModel::allTagsItem() -{ - Q_ASSERT(m_tagItems.size() > 0); - return &m_tagItems[0]; -} - -TagModelItem *TagFilterModel::untaggedItem() -{ - Q_ASSERT(m_tagItems.size() > 1); - return &m_tagItems[1]; -} diff -Nru qbittorrent-4.1.3/src/gui/tagfiltermodel.h qbittorrent-3.3.15/src/gui/tagfiltermodel.h --- qbittorrent-4.1.3/src/gui/tagfiltermodel.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/tagfiltermodel.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,87 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Tony Gregerson - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef TAGFILTERMODEL_H -#define TAGFILTERMODEL_H - -#include -#include -#include -#include - -namespace BitTorrent -{ - class TorrentHandle; -} - -class TagModelItem; - -class TagFilterModel : public QAbstractListModel -{ - Q_OBJECT - -public: - explicit TagFilterModel(QObject *parent = nullptr); - ~TagFilterModel() override; - - static bool isSpecialItem(const QModelIndex &index); - - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; - Qt::ItemFlags flags(const QModelIndex &index) const override; - QVariant headerData(int section, Qt::Orientation orientation, int role) const override; - QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; - int rowCount(const QModelIndex &parent = QModelIndex()) const override; - - QModelIndex index(const QString &tag) const; - QString tag(const QModelIndex &index) const; - -private slots: - void tagAdded(const QString &tag); - void tagRemoved(const QString &tag); - void torrentTagAdded(BitTorrent::TorrentHandle *const torrent, const QString &tag); - void torrentTagRemoved(BitTorrent::TorrentHandle *const, const QString &tag); - void torrentAdded(BitTorrent::TorrentHandle *const torrent); - void torrentAboutToBeRemoved(BitTorrent::TorrentHandle *const torrent); - -private: - static QString tagDisplayName(const QString &tag); - - void populate(); - void addToModel(const QString &tag, int count); - void removeFromModel(int row); - bool isValidRow(int row) const; - int findRow(const QString &tag) const; - TagModelItem *findItem(const QString &tag); - QVector findItems(const QSet &tags); - TagModelItem *allTagsItem(); - TagModelItem *untaggedItem(); - - QList m_tagItems; // Index corresponds to its row -}; - -#endif // TAGFILTERMODEL_H diff -Nru qbittorrent-4.1.3/src/gui/tagfilterproxymodel.cpp qbittorrent-3.3.15/src/gui/tagfilterproxymodel.cpp --- qbittorrent-4.1.3/src/gui/tagfilterproxymodel.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/tagfilterproxymodel.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Tony Gregerson - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "tagfilterproxymodel.h" - -#include "base/utils/string.h" -#include "tagfiltermodel.h" - -TagFilterProxyModel::TagFilterProxyModel(QObject *parent) - : QSortFilterProxyModel(parent) -{ -} - -QModelIndex TagFilterProxyModel::index(const QString &tag) const -{ - return mapFromSource(static_cast(sourceModel())->index(tag)); -} - -QString TagFilterProxyModel::tag(const QModelIndex &index) const -{ - return static_cast(sourceModel())->tag(mapToSource(index)); -} - -bool TagFilterProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const -{ - // "All" and "Untagged" must be left in place - if (TagFilterModel::isSpecialItem(left) || TagFilterModel::isSpecialItem(right)) - return (left < right); - - int result = Utils::String::naturalCompare(left.data().toString(), right.data().toString() - , Qt::CaseInsensitive); - return (result < 0); -} diff -Nru qbittorrent-4.1.3/src/gui/tagfilterproxymodel.h qbittorrent-3.3.15/src/gui/tagfilterproxymodel.h --- qbittorrent-4.1.3/src/gui/tagfilterproxymodel.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/tagfilterproxymodel.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Tony Gregerson - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef TAGFILTERPROXYMODEL_H -#define TAGFILTERPROXYMODEL_H - -#include -#include - -class TagFilterProxyModel : public QSortFilterProxyModel -{ -public: - explicit TagFilterProxyModel(QObject *parent = nullptr); - - // TagFilterModel methods which we need to relay - QModelIndex index(const QString &tag) const; - QString tag(const QModelIndex &index) const; - -protected: - bool lessThan(const QModelIndex &left, const QModelIndex &right) const override; - -private: - // we added another overload of index(), hence this using directive: - using QSortFilterProxyModel::index; -}; - -#endif // TAGFILTERPROXYMODEL_H diff -Nru qbittorrent-4.1.3/src/gui/tagfilterwidget.cpp qbittorrent-3.3.15/src/gui/tagfilterwidget.cpp --- qbittorrent-4.1.3/src/gui/tagfilterwidget.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/tagfilterwidget.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,229 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Tony Gregerson - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "tagfilterwidget.h" - -#include -#include -#include -#include -#include - -#include "base/bittorrent/session.h" -#include "autoexpandabledialog.h" -#include "guiiconprovider.h" -#include "tagfiltermodel.h" -#include "tagfilterproxymodel.h" -#include "utils.h" - -namespace -{ - QString getTagFilter(const TagFilterProxyModel *const model, const QModelIndex &index) - { - QString tagFilter; // Defaults to All - if (index.isValid()) { - if (index.row() == 1) - tagFilter = ""; // Untagged - else if (index.row() > 1) - tagFilter = model->tag(index); - } - return tagFilter; - } -} - -TagFilterWidget::TagFilterWidget(QWidget *parent) - : QTreeView(parent) -{ - TagFilterProxyModel *proxyModel = new TagFilterProxyModel(this); - proxyModel->setSortCaseSensitivity(Qt::CaseInsensitive); - proxyModel->setSourceModel(new TagFilterModel(this)); - setModel(proxyModel); - setFrameShape(QFrame::NoFrame); - setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - setUniformRowHeights(true); - setHeaderHidden(true); - setIconSize(Utils::Gui::smallIconSize()); -#if defined(Q_OS_MAC) - setAttribute(Qt::WA_MacShowFocusRect, false); -#endif - setIndentation(0); - setContextMenuPolicy(Qt::CustomContextMenu); - sortByColumn(0, Qt::AscendingOrder); - setCurrentIndex(model()->index(0, 0)); - - connect(this, &TagFilterWidget::collapsed, this, &TagFilterWidget::callUpdateGeometry); - connect(this, &TagFilterWidget::expanded, this, &TagFilterWidget::callUpdateGeometry); - connect(this, &TagFilterWidget::customContextMenuRequested, this, &TagFilterWidget::showMenu); - connect(selectionModel(), &QItemSelectionModel::currentRowChanged, this - , &TagFilterWidget::onCurrentRowChanged); - connect(model(), &QAbstractItemModel::modelReset, this, &TagFilterWidget::callUpdateGeometry); -} - -QString TagFilterWidget::currentTag() const -{ - QModelIndex current; - auto selectedRows = selectionModel()->selectedRows(); - if (!selectedRows.isEmpty()) - current = selectedRows.first(); - - return getTagFilter(static_cast(model()), current); -} - -void TagFilterWidget::onCurrentRowChanged(const QModelIndex ¤t, const QModelIndex &previous) -{ - Q_UNUSED(previous); - - emit tagChanged(getTagFilter(static_cast(model()), current)); -} - -void TagFilterWidget::showMenu(QPoint) -{ - QMenu menu(this); - - QAction *addAct = menu.addAction( - GuiIconProvider::instance()->getIcon("list-add") - , tr("Add tag...")); - connect(addAct, &QAction::triggered, this, &TagFilterWidget::addTag); - - auto selectedRows = selectionModel()->selectedRows(); - if (!selectedRows.empty() && !TagFilterModel::isSpecialItem(selectedRows.first())) { - QAction *removeAct = menu.addAction( - GuiIconProvider::instance()->getIcon("list-remove") - , tr("Remove tag")); - connect(removeAct, &QAction::triggered, this, &TagFilterWidget::removeTag); - } - - QAction *removeUnusedAct = menu.addAction( - GuiIconProvider::instance()->getIcon("list-remove") - , tr("Remove unused tags")); - connect(removeUnusedAct, &QAction::triggered, this, &TagFilterWidget::removeUnusedTags); - - menu.addSeparator(); - - QAction *startAct = menu.addAction( - GuiIconProvider::instance()->getIcon("media-playback-start") - , tr("Resume torrents")); - connect(startAct, &QAction::triggered - , this, &TagFilterWidget::actionResumeTorrentsTriggered); - - QAction *pauseAct = menu.addAction( - GuiIconProvider::instance()->getIcon("media-playback-pause") - , tr("Pause torrents")); - connect(pauseAct, &QAction::triggered, this - , &TagFilterWidget::actionPauseTorrentsTriggered); - - QAction *deleteTorrentsAct = menu.addAction( - GuiIconProvider::instance()->getIcon("edit-delete") - , tr("Delete torrents")); - connect(deleteTorrentsAct, &QAction::triggered, this - , &TagFilterWidget::actionDeleteTorrentsTriggered); - - menu.exec(QCursor::pos()); -} - -void TagFilterWidget::callUpdateGeometry() -{ - updateGeometry(); -} - -QSize TagFilterWidget::sizeHint() const -{ - return { - // Width should be exactly the width of the content - sizeHintForColumn(0), - // Height should be exactly the height of the content - static_cast(sizeHintForRow(0) * (model()->rowCount() + 0.5)), - }; -} - -QSize TagFilterWidget::minimumSizeHint() const -{ - QSize size = sizeHint(); - size.setWidth(6); - return size; -} - -void TagFilterWidget::rowsInserted(const QModelIndex &parent, int start, int end) -{ - QTreeView::rowsInserted(parent, start, end); - updateGeometry(); -} - -QString TagFilterWidget::askTagName() -{ - bool ok = false; - QString tag = ""; - bool invalid = true; - while (invalid) { - invalid = false; - tag = AutoExpandableDialog::getText( - this, tr("New Tag"), tr("Tag:"), QLineEdit::Normal, tag, &ok).trimmed(); - if (ok && !tag.isEmpty()) { - if (!BitTorrent::Session::isValidTag(tag)) { - QMessageBox::warning( - this, tr("Invalid tag name") - , tr("Tag name '%1' is invalid").arg(tag)); - invalid = true; - } - } - } - - return ok ? tag : QString(); -} - -void TagFilterWidget::addTag() -{ - const QString tag = askTagName(); - if (tag.isEmpty()) return; - - if (BitTorrent::Session::instance()->tags().contains(tag)) - QMessageBox::warning(this, tr("Tag exists"), tr("Tag name already exists.")); - else - BitTorrent::Session::instance()->addTag(tag); -} - -void TagFilterWidget::removeTag() -{ - auto selectedRows = selectionModel()->selectedRows(); - if (!selectedRows.empty() && !TagFilterModel::isSpecialItem(selectedRows.first())) { - BitTorrent::Session::instance()->removeTag( - static_cast(model())->tag(selectedRows.first())); - updateGeometry(); - } -} - -void TagFilterWidget::removeUnusedTags() -{ - auto session = BitTorrent::Session::instance(); - foreach (const QString &tag, session->tags()) - if (model()->data(static_cast(model())->index(tag), Qt::UserRole) == 0) - session->removeTag(tag); - updateGeometry(); -} diff -Nru qbittorrent-4.1.3/src/gui/tagfilterwidget.h qbittorrent-3.3.15/src/gui/tagfilterwidget.h --- qbittorrent-4.1.3/src/gui/tagfilterwidget.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/tagfilterwidget.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,64 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Tony Gregerson - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef TAGFILTERWIDGET_H -#define TAGFILTERWIDGET_H - -#include - -class TagFilterWidget : public QTreeView -{ - Q_OBJECT - -public: - explicit TagFilterWidget(QWidget *parent = nullptr); - - QString currentTag() const; - -signals: - void tagChanged(const QString &tag); - void actionResumeTorrentsTriggered(); - void actionPauseTorrentsTriggered(); - void actionDeleteTorrentsTriggered(); - -private slots: - void onCurrentRowChanged(const QModelIndex ¤t, const QModelIndex &previous); - void showMenu(QPoint); - void callUpdateGeometry(); - void addTag(); - void removeTag(); - void removeUnusedTags(); - -private: - QSize sizeHint() const override; - QSize minimumSizeHint() const override; - void rowsInserted(const QModelIndex &parent, int start, int end) override; - QString askTagName(); -}; - -#endif // TAGFILTERWIDGET_H diff -Nru qbittorrent-4.1.3/src/gui/torrentcategorydialog.cpp qbittorrent-3.3.15/src/gui/torrentcategorydialog.cpp --- qbittorrent-4.1.3/src/gui/torrentcategorydialog.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentcategorydialog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,125 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "torrentcategorydialog.h" - -#include -#include - -#include "base/bittorrent/session.h" -#include "ui_torrentcategorydialog.h" - -TorrentCategoryDialog::TorrentCategoryDialog(QWidget *parent) - : QDialog {parent} - , m_ui {new Ui::TorrentCategoryDialog} -{ - m_ui->setupUi(this); - m_ui->comboSavePath->setMode(FileSystemPathEdit::Mode::DirectorySave); - m_ui->comboSavePath->setDialogCaption(tr("Choose save path")); -} - -TorrentCategoryDialog::~TorrentCategoryDialog() -{ - delete m_ui; -} - -QString TorrentCategoryDialog::createCategory(QWidget *parent, const QString &parentCategoryName) -{ - using BitTorrent::Session; - - QString newCategoryName {parentCategoryName}; - if (!newCategoryName.isEmpty()) - newCategoryName += QLatin1Char('/'); - newCategoryName += tr("New Category"); - - TorrentCategoryDialog dialog(parent); - dialog.setCategoryName(newCategoryName); - while (dialog.exec() == TorrentCategoryDialog::Accepted) { - newCategoryName = dialog.categoryName(); - - if (!BitTorrent::Session::isValidCategoryName(newCategoryName)) { - QMessageBox::critical( - parent, tr("Invalid category name") - , tr("Category name cannot contain '\\'.\n" - "Category name cannot start/end with '/'.\n" - "Category name cannot contain '//' sequence.")); - } - else if (BitTorrent::Session::instance()->categories().contains(newCategoryName)) { - QMessageBox::critical( - parent, tr("Category creation error") - , tr("Category with the given name already exists.\n" - "Please choose a different name and try again.")); - } - else { - Session::instance()->addCategory(newCategoryName, dialog.savePath()); - return newCategoryName; - } - } - - return {}; -} - -void TorrentCategoryDialog::editCategory(QWidget *parent, const QString &categoryName) -{ - using BitTorrent::Session; - - Q_ASSERT(Session::instance()->categories().contains(categoryName)); - - TorrentCategoryDialog dialog(parent); - dialog.setCategoryNameEditable(false); - dialog.setCategoryName(categoryName); - dialog.setSavePath(Session::instance()->categories()[categoryName]); - if (dialog.exec() == TorrentCategoryDialog::Accepted) { - Session::instance()->editCategory(categoryName, dialog.savePath()); - } -} - -void TorrentCategoryDialog::setCategoryNameEditable(bool editable) -{ - m_ui->textCategoryName->setEnabled(editable); -} - -QString TorrentCategoryDialog::categoryName() const -{ - return m_ui->textCategoryName->text(); -} - -void TorrentCategoryDialog::setCategoryName(const QString &categoryName) -{ - m_ui->textCategoryName->setText(categoryName); -} - -QString TorrentCategoryDialog::savePath() const -{ - return m_ui->comboSavePath->selectedPath(); -} - -void TorrentCategoryDialog::setSavePath(const QString &savePath) -{ - m_ui->comboSavePath->setSelectedPath(savePath); -} diff -Nru qbittorrent-4.1.3/src/gui/torrentcategorydialog.h qbittorrent-3.3.15/src/gui/torrentcategorydialog.h --- qbittorrent-4.1.3/src/gui/torrentcategorydialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentcategorydialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,58 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Vladimir Golovnev - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#pragma once - -#include - -namespace Ui -{ - class TorrentCategoryDialog; -} - -class TorrentCategoryDialog : public QDialog -{ - Q_OBJECT - Q_DISABLE_COPY(TorrentCategoryDialog) - -public: - static QString createCategory(QWidget *parent, const QString &parentCategoryName = QString()); - static void editCategory(QWidget *parent, const QString &categoryName); - - explicit TorrentCategoryDialog(QWidget *parent = nullptr); - ~TorrentCategoryDialog() override; - - void setCategoryNameEditable(bool editable); - QString categoryName() const; - void setCategoryName(const QString &categoryName); - QString savePath() const; - void setSavePath(const QString &savePath); - -private: - Ui::TorrentCategoryDialog *m_ui; -}; diff -Nru qbittorrent-4.1.3/src/gui/torrentcategorydialog.ui qbittorrent-3.3.15/src/gui/torrentcategorydialog.ui --- qbittorrent-4.1.3/src/gui/torrentcategorydialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentcategorydialog.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,129 +0,0 @@ - - - TorrentCategoryDialog - - - - 0 - 0 - 400 - 100 - - - - Torrent Category Properties - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - Name: - - - - - - - - - - Save path: - - - - - - - - 0 - 0 - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - FileSystemPathComboEdit - QWidget -
    fspathedit.h
    - 1 -
    -
    - - - - buttonBox - accepted() - TorrentCategoryDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - TorrentCategoryDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - -
    diff -Nru qbittorrent-4.1.3/src/gui/torrentcontentfiltermodel.cpp qbittorrent-3.3.15/src/gui/torrentcontentfiltermodel.cpp --- qbittorrent-4.1.3/src/gui/torrentcontentfiltermodel.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentcontentfiltermodel.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006-2012 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006-2012 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,125 +24,117 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#include "torrentcontentfiltermodel.h" - #include "base/utils/string.h" +#include "torrentcontentfiltermodel.h" #include "torrentcontentmodel.h" -TorrentContentFilterModel::TorrentContentFilterModel(QObject *parent) - : QSortFilterProxyModel(parent) - , m_model(new TorrentContentModel(this)) -{ - connect(m_model, &TorrentContentModel::filteredFilesChanged, this, &TorrentContentFilterModel::filteredFilesChanged); - setSourceModel(m_model); - // Filter settings - setFilterKeyColumn(TorrentContentModelItem::COL_NAME); - setFilterRole(Qt::DisplayRole); - setDynamicSortFilter(true); - setSortCaseSensitivity(Qt::CaseInsensitive); +TorrentContentFilterModel::TorrentContentFilterModel(QObject *parent): + QSortFilterProxyModel(parent), m_model(new TorrentContentModel(this)) +{ + connect(m_model, SIGNAL(filteredFilesChanged()), this, SIGNAL(filteredFilesChanged())); + setSourceModel(m_model); + // Filter settings + setFilterKeyColumn(TorrentContentModelItem::COL_NAME); + setFilterRole(Qt::DisplayRole); + setDynamicSortFilter(true); + setSortCaseSensitivity(Qt::CaseInsensitive); } TorrentContentFilterModel::~TorrentContentFilterModel() { - delete m_model; + delete m_model; } -TorrentContentModel *TorrentContentFilterModel::model() const +TorrentContentModel* TorrentContentFilterModel::model() const { - return m_model; + return m_model; } -TorrentContentModelItem::ItemType TorrentContentFilterModel::itemType(const QModelIndex &index) const +TorrentContentModelItem::ItemType TorrentContentFilterModel::itemType(const QModelIndex& index) const { - return m_model->itemType(mapToSource(index)); + return m_model->itemType(mapToSource(index)); } -int TorrentContentFilterModel::getFileIndex(const QModelIndex &index) const +int TorrentContentFilterModel::getFileIndex(const QModelIndex& index) const { - return m_model->getFileIndex(mapToSource(index)); + return m_model->getFileIndex(mapToSource(index)); } -QModelIndex TorrentContentFilterModel::parent(const QModelIndex &child) const +QModelIndex TorrentContentFilterModel::parent(const QModelIndex& child) const { - if (!child.isValid()) return QModelIndex(); - - QModelIndex sourceParent = m_model->parent(mapToSource(child)); - if (!sourceParent.isValid()) return QModelIndex(); - - return mapFromSource(sourceParent); + if (!child.isValid()) return QModelIndex(); + QModelIndex sourceParent = m_model->parent(mapToSource(child)); + if (!sourceParent.isValid()) return QModelIndex(); + return mapFromSource(sourceParent); } -bool TorrentContentFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const +bool TorrentContentFilterModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const { - if (m_model->itemType(m_model->index(sourceRow, 0, sourceParent)) == TorrentContentModelItem::FolderType) { - // accept folders if they have at least one filtered item - return hasFiltered(m_model->index(sourceRow, 0, sourceParent)); - } - - return QSortFilterProxyModel::filterAcceptsRow(sourceRow, sourceParent); + if (m_model->itemType(m_model->index(source_row, 0, source_parent)) == TorrentContentModelItem::FolderType) { + // accept folders if they have at least one filtered item + return hasFiltered(m_model->index(source_row, 0, source_parent)); + } + return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent); } -bool TorrentContentFilterModel::lessThan(const QModelIndex &left, const QModelIndex &right) const -{ - switch (sortColumn()) { - case TorrentContentModelItem::COL_NAME: { - const TorrentContentModelItem::ItemType leftType = m_model->itemType(m_model->index(left.row(), 0, left.parent())); - const TorrentContentModelItem::ItemType rightType = m_model->itemType(m_model->index(right.row(), 0, right.parent())); - - if (leftType == rightType) { - const QString strL = left.data().toString(); - const QString strR = right.data().toString(); - return Utils::String::naturalLessThan(strL, strR); - } - else if ((leftType == TorrentContentModelItem::FolderType) && (sortOrder() == Qt::AscendingOrder)) { - return true; - } - else { - return false; - } - } - default: - return QSortFilterProxyModel::lessThan(left, right); - }; -} +bool TorrentContentFilterModel::lessThan(const QModelIndex &left, const QModelIndex &right) const { + switch (sortColumn()) { + case TorrentContentModelItem::COL_NAME: { + QString vL = left.data().toString(); + QString vR = right.data().toString(); + TorrentContentModelItem::ItemType leftType = m_model->itemType(m_model->index(left.row(), 0, left.parent())); + TorrentContentModelItem::ItemType rightType = m_model->itemType(m_model->index(right.row(), 0, right.parent())); -void TorrentContentFilterModel::selectAll() -{ - for (int i = 0; i < rowCount(); ++i) - setData(index(i, 0), Qt::Checked, Qt::CheckStateRole); + if (leftType == rightType) + return Utils::String::naturalCompareCaseInsensitive(vL, vR); + else if (leftType == TorrentContentModelItem::FolderType && sortOrder() == Qt::AscendingOrder) + return true; + else + return false; + } + }; - emit dataChanged(index(0,0), index(rowCount(), columnCount())); + return QSortFilterProxyModel::lessThan(left, right); } -void TorrentContentFilterModel::selectNone() +void TorrentContentFilterModel::selectAll() { - for (int i = 0; i < rowCount(); ++i) - setData(index(i, 0), Qt::Unchecked, Qt::CheckStateRole); - - emit dataChanged(index(0,0), index(rowCount(), columnCount())); + for (int i=0; irowCount(folder); child++) { + QModelIndex childIndex = m_model->index(child, 0, folder); + if (m_model->hasChildren(childIndex)) { + if (hasFiltered(childIndex)) return true; - for (int child = 0; child < m_model->rowCount(folder); ++child) { - QModelIndex childIndex = m_model->index(child, 0, folder); - if (m_model->hasChildren(childIndex)) { - if (hasFiltered(childIndex)) - return true; - else - continue; - } - name = childIndex.data().toString(); - if (name.contains(filterRegExp())) - return true; + else + continue; } + name = childIndex.data().toString(); + if (name.contains(filterRegExp())) + return true; + } - return false; + return false; } diff -Nru qbittorrent-4.1.3/src/gui/torrentcontentfiltermodel.h qbittorrent-3.3.15/src/gui/torrentcontentfiltermodel.h --- qbittorrent-4.1.3/src/gui/torrentcontentfiltermodel.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentcontentfiltermodel.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006-2012 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006-2012 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,44 +24,44 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef TORRENTCONTENTFILTERMODEL_H #define TORRENTCONTENTFILTERMODEL_H #include - #include "torrentcontentmodelitem.h" class TorrentContentModel; -class TorrentContentFilterModel : public QSortFilterProxyModel -{ - Q_OBJECT +class TorrentContentFilterModel: public QSortFilterProxyModel { + Q_OBJECT public: - TorrentContentFilterModel(QObject *parent = nullptr); - ~TorrentContentFilterModel() override; - - TorrentContentModel *model() const; - TorrentContentModelItem::ItemType itemType(const QModelIndex &index) const; - int getFileIndex(const QModelIndex &index) const; - QModelIndex parent(const QModelIndex &child) const override; + TorrentContentFilterModel(QObject *parent = 0); + virtual ~TorrentContentFilterModel(); -public slots: - void selectAll(); - void selectNone(); + TorrentContentModel* model() const; + TorrentContentModelItem::ItemType itemType(const QModelIndex& index) const; + int getFileIndex(const QModelIndex& index) const; + virtual QModelIndex parent(const QModelIndex& child) const; signals: - void filteredFilesChanged(); + void filteredFilesChanged(); protected: - bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; - bool lessThan(const QModelIndex &left, const QModelIndex &right) const override; + virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const; + virtual bool lessThan(const QModelIndex &left, const QModelIndex &right) const; + +public slots: + void selectAll(); + void selectNone(); private: - TorrentContentModel *m_model; - bool hasFiltered(const QModelIndex &folder) const; + TorrentContentModel* m_model; + bool hasFiltered(const QModelIndex& folder) const; }; #endif // TORRENTCONTENTFILTERMODEL_H diff -Nru qbittorrent-4.1.3/src/gui/torrentcontentmodel.cpp qbittorrent-3.3.15/src/gui/torrentcontentmodel.cpp --- qbittorrent-4.1.3/src/gui/torrentcontentmodel.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentcontentmodel.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006-2012 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006-2012 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,40 +24,20 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#include "torrentcontentmodel.h" - #include -#include -#include #include -#include - -#if defined(Q_OS_WIN) -#include -#include -#include -#else -#include -#include -#endif - -#if defined Q_OS_WIN || defined Q_OS_MAC -#define QBT_PIXMAP_CACHE_FOR_FILE_ICONS -#include -#endif +#include "guiiconprovider.h" #include "base/utils/misc.h" #include "base/utils/fs.h" -#include "guiiconprovider.h" -#include "torrentcontentmodelfile.h" -#include "torrentcontentmodelfolder.h" +#include "torrentcontentmodel.h" #include "torrentcontentmodelitem.h" - -#ifdef Q_OS_MAC -#include "macutilities.h" -#endif +#include "torrentcontentmodelfolder.h" +#include "torrentcontentmodelfile.h" namespace { @@ -67,156 +47,21 @@ return cached; } - class UnifiedFileIconProvider : public QFileIconProvider - { - public: - using QFileIconProvider::icon; - - QIcon icon(const QFileInfo &info) const override - { - Q_UNUSED(info); - static QIcon cached = GuiIconProvider::instance()->getIcon("text-plain"); - return cached; - } - }; - -#ifdef QBT_PIXMAP_CACHE_FOR_FILE_ICONS - struct Q_DECL_UNUSED PixmapCacheSetup - { - static const int PixmapCacheForIconsSize = 2 * 1024 * 1024; // 2 MiB for file icons - - PixmapCacheSetup() - { - QPixmapCache::setCacheLimit(QPixmapCache::cacheLimit() + PixmapCacheForIconsSize); - } - - ~PixmapCacheSetup() - { - Q_ASSERT(QPixmapCache::cacheLimit() > PixmapCacheForIconsSize); - QPixmapCache::setCacheLimit(QPixmapCache::cacheLimit() - PixmapCacheForIconsSize); - } - }; - - PixmapCacheSetup pixmapCacheSetup; - - class CachingFileIconProvider : public UnifiedFileIconProvider - { - public: - using QFileIconProvider::icon; - - QIcon icon(const QFileInfo &info) const final override - { - const QString ext = info.suffix(); - if (!ext.isEmpty()) { - QPixmap cached; - if (QPixmapCache::find(ext, &cached)) return QIcon(cached); - - const QPixmap pixmap = pixmapForExtension(ext); - if (!pixmap.isNull()) { - QPixmapCache::insert(ext, pixmap); - return QIcon(pixmap); - } - } - return UnifiedFileIconProvider::icon(info); - } - - protected: - virtual QPixmap pixmapForExtension(const QString &ext) const = 0; - }; -#endif // QBT_PIXMAP_CACHE_FOR_FILE_ICONS - -#if defined(Q_OS_WIN) - // See QTBUG-25319 for explanation why this is required - class WinShellFileIconProvider final : public CachingFileIconProvider + QIcon getFileIcon() { - QPixmap pixmapForExtension(const QString &ext) const override - { - const QString extWithDot = QLatin1Char('.') + ext; - SHFILEINFO sfi {}; - HRESULT hr = ::SHGetFileInfoW(extWithDot.toStdWString().c_str(), - FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES); - if (FAILED(hr)) - return QPixmap(); - - QPixmap iconPixmap = QtWin::fromHICON(sfi.hIcon); - ::DestroyIcon(sfi.hIcon); - return iconPixmap; - } - }; -#elif defined(Q_OS_MAC) - // There is a similar bug on macOS, to be reported to Qt - // https://github.com/qbittorrent/qBittorrent/pull/6156#issuecomment-316302615 - class MacFileIconProvider final: public CachingFileIconProvider - { - QPixmap pixmapForExtension(const QString &ext) const override - { - return MacUtils::pixmapForExtension(ext, QSize(32, 32)); - } - }; -#else - /** - * @brief Tests whether QFileIconProvider actually works - * - * Some QPA plugins do not implement QPlatformTheme::fileIcon(), and - * QFileIconProvider::icon() returns empty icons as the result. Here we ask it for - * two icons for probably absent files and when both icons are null, we assume that - * the current QPA plugin does not implement QPlatformTheme::fileIcon(). - */ - bool doesQFileIconProviderWork() - { - QFileIconProvider provider; - const char PSEUDO_UNIQUE_FILE_NAME[] = "/tmp/qBittorrent-test-QFileIconProvider-845eb448-7ad5-4cdb-b764-b3f322a266a9"; - QIcon testIcon1 = provider.icon(QFileInfo( - QLatin1String(PSEUDO_UNIQUE_FILE_NAME) + QLatin1String(".pdf"))); - QIcon testIcon2 = provider.icon(QFileInfo( - QLatin1String(PSEUDO_UNIQUE_FILE_NAME) + QLatin1String(".png"))); - - return (!testIcon1.isNull() || !testIcon2.isNull()); + static QIcon cached = GuiIconProvider::instance()->getIcon("text-plain"); + return cached; } - - class MimeFileIconProvider : public UnifiedFileIconProvider - { - using QFileIconProvider::icon; - - QIcon icon(const QFileInfo &info) const override - { - const QMimeType mimeType = m_db.mimeTypeForFile(info, QMimeDatabase::MatchExtension); - QIcon res = QIcon::fromTheme(mimeType.iconName()); - if (!res.isNull()) { - return res; - } - - res = QIcon::fromTheme(mimeType.genericIconName()); - if (!res.isNull()) { - return res; - } - - return UnifiedFileIconProvider::icon(info); - } - - private: - QMimeDatabase m_db; - }; -#endif // Q_OS_WIN } TorrentContentModel::TorrentContentModel(QObject *parent) : QAbstractItemModel(parent) - , m_rootItem(new TorrentContentModelFolder(QList({ tr("Name"), tr("Size"), tr("Progress"), tr("Download Priority"), tr("Remaining"), tr("Availability") }))) + , m_rootItem(new TorrentContentModelFolder(QList({ tr("Name"), tr("Size"), tr("Progress"), tr("Download Priority"), tr("Remaining") }))) { -#if defined(Q_OS_WIN) - m_fileIconProvider = new WinShellFileIconProvider(); -#elif defined(Q_OS_MAC) - m_fileIconProvider = new MacFileIconProvider(); -#else - static bool doesBuiltInProviderWork = doesQFileIconProviderWork(); - m_fileIconProvider = doesBuiltInProviderWork ? new QFileIconProvider() : new MimeFileIconProvider(); -#endif } TorrentContentModel::~TorrentContentModel() { - delete m_fileIconProvider; delete m_rootItem; } @@ -231,15 +76,14 @@ m_filesIndex[i]->setProgress(fp[i]); // Update folders progress in the tree m_rootItem->recalculateProgress(); - m_rootItem->recalculateAvailability(); emit dataChanged(index(0, 0), index(rowCount(), columnCount())); } void TorrentContentModel::updateFilesPriorities(const QVector &fprio) { - Q_ASSERT(m_filesIndex.size() == fprio.size()); + Q_ASSERT(m_filesIndex.size() == (int)fprio.size()); // XXX: Why is this necessary? - if (m_filesIndex.size() != fprio.size()) + if (m_filesIndex.size() != (int)fprio.size()) return; emit layoutAboutToBeChanged(); @@ -248,38 +92,24 @@ emit dataChanged(index(0, 0), index(rowCount(), columnCount())); } -void TorrentContentModel::updateFilesAvailability(const QVector &fa) -{ - Q_ASSERT(m_filesIndex.size() == fa.size()); - // XXX: Why is this necessary? - if (m_filesIndex.size() != fa.size()) return; - - emit layoutAboutToBeChanged(); - for (int i = 0; i < fa.size(); ++i) - m_filesIndex[i]->setAvailability(fa[i]); - // Update folders progress in the tree - m_rootItem->recalculateProgress(); - emit dataChanged(index(0, 0), index(rowCount(), columnCount())); -} - QVector TorrentContentModel::getFilePriorities() const { QVector prio; prio.reserve(m_filesIndex.size()); - foreach (const TorrentContentModelFile *file, m_filesIndex) + foreach (const TorrentContentModelFile* file, m_filesIndex) prio.push_back(file->priority()); return prio; } bool TorrentContentModel::allFiltered() const { - foreach (const TorrentContentModelFile *fileItem, m_filesIndex) + foreach (const TorrentContentModelFile* fileItem, m_filesIndex) if (fileItem->priority() != prio::IGNORED) return false; return true; } -int TorrentContentModel::columnCount(const QModelIndex &parent) const +int TorrentContentModel::columnCount(const QModelIndex& parent) const { if (parent.isValid()) return static_cast(parent.internalPointer())->columnCount(); @@ -287,14 +117,14 @@ return m_rootItem->columnCount(); } -bool TorrentContentModel::setData(const QModelIndex &index, const QVariant &value, int role) +bool TorrentContentModel::setData(const QModelIndex& index, const QVariant& value, int role) { if (!index.isValid()) return false; if ((index.column() == TorrentContentModelItem::COL_NAME) && (role == Qt::CheckStateRole)) { TorrentContentModelItem *item = static_cast(index.internalPointer()); - qDebug("setData(%s, %d", qUtf8Printable(item->name()), value.toInt()); + qDebug("setData(%s, %d", qPrintable(item->name()), value.toInt()); if (item->priority() != value.toInt()) { if (value.toInt() == Qt::PartiallyChecked) item->setPriority(prio::MIXED); @@ -304,7 +134,6 @@ item->setPriority(prio::NORMAL); // Update folders progress in the tree m_rootItem->recalculateProgress(); - m_rootItem->recalculateAvailability(); emit dataChanged(this->index(0, 0), this->index(rowCount() - 1, columnCount() - 1)); emit filteredFilesChanged(); } @@ -313,7 +142,7 @@ if (role == Qt::EditRole) { Q_ASSERT(index.isValid()); - TorrentContentModelItem *item = static_cast(index.internalPointer()); + TorrentContentModelItem* item = static_cast(index.internalPointer()); switch (index.column()) { case TorrentContentModelItem::COL_NAME: item->setName(value.toString()); @@ -331,12 +160,12 @@ return false; } -TorrentContentModelItem::ItemType TorrentContentModel::itemType(const QModelIndex &index) const +TorrentContentModelItem::ItemType TorrentContentModel::itemType(const QModelIndex& index) const { return static_cast(index.internalPointer())->itemType(); } -int TorrentContentModel::getFileIndex(const QModelIndex &index) +int TorrentContentModel::getFileIndex(const QModelIndex& index) { TorrentContentModelItem *item = static_cast(index.internalPointer()); if (item->itemType() == TorrentContentModelItem::FileType) @@ -351,13 +180,13 @@ if (!index.isValid()) return QVariant(); - TorrentContentModelItem *item = static_cast(index.internalPointer()); + TorrentContentModelItem* item = static_cast(index.internalPointer()); if ((index.column() == TorrentContentModelItem::COL_NAME) && (role == Qt::DecorationRole)) { if (item->itemType() == TorrentContentModelItem::FolderType) return getDirectoryIcon(); else - return m_fileIconProvider->icon(QFileInfo(item->name())); + return getFileIcon(); } if ((index.column() == TorrentContentModelItem::COL_NAME) && (role == Qt::CheckStateRole)) { @@ -374,10 +203,10 @@ return QVariant(); } -Qt::ItemFlags TorrentContentModel::flags(const QModelIndex &index) const +Qt::ItemFlags TorrentContentModel::flags(const QModelIndex& index) const { if (!index.isValid()) - return Qt::NoItemFlags; + return 0; if (itemType(index) == TorrentContentModelItem::FolderType) return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable | Qt::ItemIsTristate; @@ -393,7 +222,7 @@ return QVariant(); } -QModelIndex TorrentContentModel::index(int row, int column, const QModelIndex &parent) const +QModelIndex TorrentContentModel::index(int row, int column, const QModelIndex& parent) const { if (parent.isValid() && (parent.column() != 0)) return QModelIndex(); @@ -401,7 +230,7 @@ if (column >= TorrentContentModelItem::NB_COL) return QModelIndex(); - TorrentContentModelFolder *parentItem; + TorrentContentModelFolder* parentItem; if (!parent.isValid()) parentItem = m_rootItem; else @@ -411,18 +240,18 @@ if (row >= parentItem->childCount()) return QModelIndex(); - TorrentContentModelItem *childItem = parentItem->child(row); + TorrentContentModelItem* childItem = parentItem->child(row); if (childItem) return createIndex(row, column, childItem); return QModelIndex(); } -QModelIndex TorrentContentModel::parent(const QModelIndex &index) const +QModelIndex TorrentContentModel::parent(const QModelIndex& index) const { if (!index.isValid()) return QModelIndex(); - TorrentContentModelItem *childItem = static_cast(index.internalPointer()); + TorrentContentModelItem* childItem = static_cast(index.internalPointer()); if (!childItem) return QModelIndex(); @@ -433,12 +262,12 @@ return createIndex(parentItem->row(), 0, parentItem); } -int TorrentContentModel::rowCount(const QModelIndex &parent) const +int TorrentContentModel::rowCount(const QModelIndex& parent) const { if (parent.column() > 0) return 0; - TorrentContentModelFolder *parentItem; + TorrentContentModelFolder* parentItem; if (!parent.isValid()) parentItem = m_rootItem; else @@ -468,15 +297,15 @@ qDebug("Torrent contains %d files", filesCount); m_filesIndex.reserve(filesCount); - TorrentContentModelFolder *currentParent; + TorrentContentModelFolder* currentParent; // Iterate over files for (int i = 0; i < filesCount; ++i) { currentParent = m_rootItem; QString path = Utils::Fs::fromNativePath(info.filePath(i)); // Iterate of parts of the path to create necessary folders - QStringList pathFolders = path.split('/', QString::SkipEmptyParts); + QStringList pathFolders = path.split("/", QString::SkipEmptyParts); pathFolders.removeLast(); - foreach (const QString &pathPart, pathFolders) { + foreach (const QString& pathPart, pathFolders) { if (pathPart == ".unwanted") continue; TorrentContentModelFolder* newParent = currentParent->childFolderWithName(pathPart); @@ -487,7 +316,7 @@ currentParent = newParent; } // Actually create the file - TorrentContentModelFile *fileItem = new TorrentContentModelFile(info.fileName(i), info.fileSize(i), currentParent, i); + TorrentContentModelFile* fileItem = new TorrentContentModelFile(info.fileName(i), info.fileSize(i), currentParent, i); currentParent->appendChild(fileItem); m_filesIndex.push_back(fileItem); } diff -Nru qbittorrent-4.1.3/src/gui/torrentcontentmodelfile.cpp qbittorrent-3.3.15/src/gui/torrentcontentmodelfile.cpp --- qbittorrent-4.1.3/src/gui/torrentcontentmodelfile.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentcontentmodelfile.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006-2012 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006-2012 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,11 +24,11 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #include "torrentcontentmodelfile.h" - -#include "base/bittorrent/torrenthandle.h" #include "torrentcontentmodelfolder.h" TorrentContentModelFile::TorrentContentModelFile(const QString &fileName, qulonglong fileSize, @@ -41,7 +41,7 @@ m_name = fileName; // Do not display incomplete extensions - if (m_name.endsWith(QB_EXT)) + if (m_name.endsWith(".!qB")) m_name.chop(4); m_size = fileSize; @@ -73,12 +73,6 @@ Q_ASSERT(m_progress <= 1.); } -void TorrentContentModelFile::setAvailability(qreal availability) -{ - m_availability = availability; - Q_ASSERT(m_availability <= 1.); -} - TorrentContentModelItem::ItemType TorrentContentModelFile::itemType() const { return FileType; diff -Nru qbittorrent-4.1.3/src/gui/torrentcontentmodelfile.h qbittorrent-3.3.15/src/gui/torrentcontentmodelfile.h --- qbittorrent-4.1.3/src/gui/torrentcontentmodelfile.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentcontentmodelfile.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006-2012 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006-2012 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef TORRENTCONTENTMODELFILE_H @@ -31,7 +33,7 @@ #include "torrentcontentmodelitem.h" -class TorrentContentModelFile : public TorrentContentModelItem +class TorrentContentModelFile: public TorrentContentModelItem { public: TorrentContentModelFile(const QString &fileName, qulonglong fileSize, @@ -40,7 +42,6 @@ int fileIndex() const; void setPriority(int newPriority, bool updateParent = true) override; void setProgress(qreal progress); - void setAvailability(qreal availability); ItemType itemType() const override; private: diff -Nru qbittorrent-4.1.3/src/gui/torrentcontentmodelfolder.cpp qbittorrent-3.3.15/src/gui/torrentcontentmodelfolder.cpp --- qbittorrent-4.1.3/src/gui/torrentcontentmodelfolder.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentcontentmodelfolder.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006-2012 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006-2012 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,24 +24,25 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ +#include #include "torrentcontentmodelfolder.h" -#include "base/bittorrent/torrenthandle.h" - TorrentContentModelFolder::TorrentContentModelFolder(const QString &name, TorrentContentModelFolder *parent) : TorrentContentModelItem(parent) { Q_ASSERT(parent); m_name = name; // Do not display incomplete extensions - if (m_name.endsWith(QB_EXT)) + if (m_name.endsWith(".!qB")) m_name.chop(4); } TorrentContentModelFolder::TorrentContentModelFolder(const QList &data) - : TorrentContentModelItem(nullptr) + : TorrentContentModelItem(0) { Q_ASSERT(data.size() == NB_COL); m_itemData = data; @@ -80,7 +81,7 @@ TorrentContentModelItem *TorrentContentModelFolder::child(int row) const { - return m_childItems.value(row, nullptr); + return m_childItems.value(row, 0); } TorrentContentModelFolder *TorrentContentModelFolder::childFolderWithName(const QString &name) const @@ -88,7 +89,7 @@ foreach (TorrentContentModelItem *child, m_childItems) if ((child->itemType() == FolderType) && (child->name() == name)) return static_cast(child); - return nullptr; + return 0; } int TorrentContentModelFolder::childCount() const @@ -158,34 +159,6 @@ } } -void TorrentContentModelFolder::recalculateAvailability() -{ - qreal tAvailability = 0; - qulonglong tSize = 0; - bool foundAnyData = false; - foreach (TorrentContentModelItem *child, m_childItems) { - if (child->priority() == prio::IGNORED) - continue; - - if (child->itemType() == FolderType) - static_cast(child)->recalculateAvailability(); - const qreal childAvailability = child->availability(); - if (childAvailability >= 0) { // -1 means "no data" - tAvailability += childAvailability * child->size(); - foundAnyData = true; - } - tSize += child->size(); - } - - if (!isRootItem() && (tSize > 0) && foundAnyData) { - m_availability = tAvailability / tSize; - Q_ASSERT(m_availability <= 1.); - } - else { - m_availability = -1.; - } -} - void TorrentContentModelFolder::increaseSize(qulonglong delta) { if (isRootItem()) diff -Nru qbittorrent-4.1.3/src/gui/torrentcontentmodelfolder.h qbittorrent-3.3.15/src/gui/torrentcontentmodelfolder.h --- qbittorrent-4.1.3/src/gui/torrentcontentmodelfolder.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentcontentmodelfolder.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006-2012 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006-2012 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef TORRENTCONTENTMODELFOLDER_H @@ -31,31 +33,30 @@ #include "torrentcontentmodelitem.h" -class TorrentContentModelFolder : public TorrentContentModelItem +class TorrentContentModelFolder: public TorrentContentModelItem { public: // Folder constructor - TorrentContentModelFolder(const QString &name, TorrentContentModelFolder *parent); + TorrentContentModelFolder(const QString& name, TorrentContentModelFolder* parent); // Invisible root item constructor - TorrentContentModelFolder(const QList &data); + TorrentContentModelFolder(const QList& data); - ~TorrentContentModelFolder() override; + ~TorrentContentModelFolder(); ItemType itemType() const override; void increaseSize(qulonglong delta); void recalculateProgress(); - void recalculateAvailability(); void updatePriority(); void setPriority(int newPriority, bool updateParent = true) override; void deleteAllChildren(); - const QList &children() const; - void appendChild(TorrentContentModelItem *item); - TorrentContentModelItem *child(int row) const; - TorrentContentModelFolder *childFolderWithName(const QString &name) const; + const QList& children() const; + void appendChild(TorrentContentModelItem* item); + TorrentContentModelItem* child(int row) const; + TorrentContentModelFolder* childFolderWithName(const QString& name) const; int childCount() const; private: diff -Nru qbittorrent-4.1.3/src/gui/torrentcontentmodel.h qbittorrent-3.3.15/src/gui/torrentcontentmodel.h --- qbittorrent-4.1.3/src/gui/torrentcontentmodel.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentcontentmodel.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006-2012 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006-2012 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef TORRENTCONTENTMODEL_H @@ -31,38 +33,36 @@ #include #include -#include #include +#include #include "base/bittorrent/torrentinfo.h" #include "torrentcontentmodelitem.h" -class QFileIconProvider; class TorrentContentModelFile; -class TorrentContentModel : public QAbstractItemModel +class TorrentContentModel: public QAbstractItemModel { Q_OBJECT public: - TorrentContentModel(QObject *parent = nullptr); - ~TorrentContentModel() override; + TorrentContentModel(QObject *parent = 0); + ~TorrentContentModel(); void updateFilesProgress(const QVector &fp); void updateFilesPriorities(const QVector &fprio); - void updateFilesAvailability(const QVector &fa); QVector getFilePriorities() const; bool allFiltered() const; - int columnCount(const QModelIndex &parent = QModelIndex()) const override; - bool setData(const QModelIndex &index, const QVariant& value, int role = Qt::EditRole) override; - TorrentContentModelItem::ItemType itemType(const QModelIndex &index) const; - int getFileIndex(const QModelIndex &index); - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; - Qt::ItemFlags flags(const QModelIndex &index) const override; - QVariant headerData(int section, Qt::Orientation orientation, int role) const override; - QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const override; - QModelIndex parent(const QModelIndex &index) const override; - int rowCount(const QModelIndex &parent = QModelIndex()) const override; + virtual int columnCount(const QModelIndex &parent = QModelIndex()) const; + virtual bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole); + TorrentContentModelItem::ItemType itemType(const QModelIndex& index) const; + int getFileIndex(const QModelIndex& index); + virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const; + virtual Qt::ItemFlags flags(const QModelIndex& index) const; + virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const; + virtual QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const; + virtual QModelIndex parent(const QModelIndex& index) const; + virtual int rowCount(const QModelIndex& parent = QModelIndex()) const; void clear(); void setupModelData(const BitTorrent::TorrentInfo &info); @@ -76,7 +76,6 @@ private: TorrentContentModelFolder *m_rootItem; QVector m_filesIndex; - QFileIconProvider *m_fileIconProvider; }; #endif // TORRENTCONTENTMODEL_H diff -Nru qbittorrent-4.1.3/src/gui/torrentcontentmodelitem.cpp qbittorrent-3.3.15/src/gui/torrentcontentmodelitem.cpp --- qbittorrent-4.1.3/src/gui/torrentcontentmodelitem.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentcontentmodelitem.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006-2012 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006-2012 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,15 +24,15 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#include "torrentcontentmodelitem.h" - -#include - #include "base/utils/misc.h" #include "base/utils/fs.h" +#include "torrentcontentmodelitem.h" #include "torrentcontentmodelfolder.h" +#include TorrentContentModelItem::TorrentContentModelItem(TorrentContentModelFolder *parent) : m_parentItem(parent) @@ -40,7 +40,6 @@ , m_remaining(0) , m_priority(prio::NORMAL) , m_progress(0) - , m_availability(-1.) { } @@ -85,13 +84,6 @@ return m_remaining; } -qreal TorrentContentModelItem::availability() const -{ - Q_ASSERT(!isRootItem()); - - return m_size > 0 ? m_availability : 0.; -} - int TorrentContentModelItem::priority() const { Q_ASSERT(!isRootItem()); @@ -119,8 +111,6 @@ return m_size; case COL_REMAINING: return remaining(); - case COL_AVAILABILITY: - return availability(); default: Q_ASSERT(false); return QVariant(); diff -Nru qbittorrent-4.1.3/src/gui/torrentcontentmodelitem.h qbittorrent-3.3.15/src/gui/torrentcontentmodelitem.h --- qbittorrent-4.1.3/src/gui/torrentcontentmodelitem.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentcontentmodelitem.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006-2012 Christophe Dumez + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006-2012 Christophe Dumez * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef TORRENTCONTENTMODELITEM_H @@ -56,7 +58,6 @@ COL_PROGRESS, COL_PRIO, COL_REMAINING, - COL_AVAILABILITY, NB_COL }; @@ -80,8 +81,6 @@ qreal progress() const; qulonglong remaining() const; - qreal availability() const; - int priority() const; virtual void setPriority(int newPriority, bool updateParent = true) = 0; @@ -99,7 +98,6 @@ qulonglong m_remaining; int m_priority; qreal m_progress; - qreal m_availability; }; #endif // TORRENTCONTENTMODELITEM_H diff -Nru qbittorrent-4.1.3/src/gui/torrentcontenttreeview.cpp qbittorrent-3.3.15/src/gui/torrentcontenttreeview.cpp --- qbittorrent-4.1.3/src/gui/torrentcontenttreeview.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentcontenttreeview.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2014 Ivan Sorokin + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2014 Ivan Sorokin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,65 +24,68 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : vanyacpp@gmail.com */ #include "torrentcontenttreeview.h" -#include #include #include +#ifdef QBT_USES_QT5 #include +#include +#endif #include "torrentcontentmodelitem.h" -TorrentContentTreeView::TorrentContentTreeView(QWidget *parent) - : QTreeView(parent) +TorrentContentTreeView::TorrentContentTreeView(QWidget* parent) + : QTreeView(parent) { +#ifdef QBT_USES_QT5 // This hack fixes reordering of first column with Qt5. // https://github.com/qtproject/qtbase/commit/e0fc088c0c8bc61dbcaf5928b24986cd61a22777 QTableView unused; unused.setVerticalHeader(header()); header()->setParent(this); - header()->setStretchLastSection(false); unused.setVerticalHeader(new QHeaderView(Qt::Horizontal)); +#endif } -void TorrentContentTreeView::keyPressEvent(QKeyEvent *event) -{ - if ((event->key() != Qt::Key_Space) && (event->key() != Qt::Key_Select)) { - QTreeView::keyPressEvent(event); - return; - } - - event->accept(); - - QModelIndex current = currentNameCell(); - - QVariant value = current.data(Qt::CheckStateRole); - if (!value.isValid()) { - Q_ASSERT(false); - return; - } - - Qt::CheckState state = (static_cast(value.toInt()) == Qt::Checked - ? Qt::Unchecked : Qt::Checked); - - const QModelIndexList selection = selectionModel()->selectedRows(TorrentContentModelItem::COL_NAME); - - for (QModelIndexList::const_iterator i = selection.begin(); i != selection.end(); ++i) { - QModelIndex index = *i; - Q_ASSERT(i->column() == TorrentContentModelItem::COL_NAME); - model()->setData(index, state, Qt::CheckStateRole); - } +void TorrentContentTreeView::keyPressEvent(QKeyEvent *event) { + if (event->key() != Qt::Key_Space && event->key() != Qt::Key_Select) { + QTreeView::keyPressEvent(event); + return; + } + + event->accept(); + + QModelIndex current = currentNameCell(); + + QVariant value = current.data(Qt::CheckStateRole); + if (!value.isValid()) { + Q_ASSERT(false); + return; + } + + Qt::CheckState state = (static_cast(value.toInt()) == Qt::Checked + ? Qt::Unchecked : Qt::Checked); + + QModelIndexList selection = selectionModel()->selectedRows(TorrentContentModelItem::COL_NAME); + + for (QModelIndexList::const_iterator i = selection.begin(); i != selection.end(); ++i) { + QModelIndex index = *i; + Q_ASSERT(i->column() == TorrentContentModelItem::COL_NAME); + model()->setData(index, state, Qt::CheckStateRole); + } } -QModelIndex TorrentContentTreeView::currentNameCell() -{ - QModelIndex current = currentIndex(); - if (!current.isValid()) { - Q_ASSERT(false); - return QModelIndex(); - } +QModelIndex TorrentContentTreeView::currentNameCell() { + QModelIndex current = currentIndex(); + if (!current.isValid()) { + Q_ASSERT(false); + return QModelIndex(); + } - return model()->index(current.row(), TorrentContentModelItem::COL_NAME, current.parent()); + return model()->index(current.row(), TorrentContentModelItem::COL_NAME, current.parent()); } diff -Nru qbittorrent-4.1.3/src/gui/torrentcontenttreeview.h qbittorrent-3.3.15/src/gui/torrentcontenttreeview.h --- qbittorrent-4.1.3/src/gui/torrentcontenttreeview.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentcontenttreeview.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2014 Ivan Sorokin + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2014 Ivan Sorokin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : vanyacpp@gmail.com */ #ifndef TORRENTCONTENTTREEVIEW_H @@ -31,16 +33,15 @@ #include -class TorrentContentTreeView : public QTreeView -{ - Q_OBJECT +class TorrentContentTreeView : public QTreeView { + Q_OBJECT public: - explicit TorrentContentTreeView(QWidget *parent = nullptr); - void keyPressEvent(QKeyEvent *event) override; + explicit TorrentContentTreeView(QWidget *parent = 0); + void keyPressEvent(QKeyEvent *event); private: - QModelIndex currentNameCell(); + QModelIndex currentNameCell(); }; -#endif // TORRENTCONTENTTREEVIEW_H +#endif diff -Nru qbittorrent-4.1.3/src/gui/torrentcreatordialog.cpp qbittorrent-3.3.15/src/gui/torrentcreatordialog.cpp --- qbittorrent-4.1.3/src/gui/torrentcreatordialog.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentcreatordialog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,274 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Mike Tzou (Chocobo1) - * Copyright (C) 2010 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "torrentcreatordialog.h" - -#include -#include -#include -#include -#include -#include - -#include "base/bittorrent/session.h" -#include "base/bittorrent/torrentcreatorthread.h" -#include "base/bittorrent/torrentinfo.h" -#include "base/global.h" -#include "base/utils/fs.h" -#include "ui_torrentcreatordialog.h" -#include "utils.h" - -#define SETTINGS_KEY(name) "TorrentCreator/" name - -TorrentCreatorDialog::TorrentCreatorDialog(QWidget *parent, const QString &defaultPath) - : QDialog(parent) - , m_ui(new Ui::TorrentCreatorDialog) - , m_creatorThread(new BitTorrent::TorrentCreatorThread(this)) - , m_storeDialogSize(SETTINGS_KEY("Dimension")) - , m_storePieceSize(SETTINGS_KEY("PieceSize")) - , m_storePrivateTorrent(SETTINGS_KEY("PrivateTorrent")) - , m_storeStartSeeding(SETTINGS_KEY("StartSeeding")) - , m_storeIgnoreRatio(SETTINGS_KEY("IgnoreRatio")) - , m_storeOptimizeAlignment(SETTINGS_KEY("OptimizeAlignment"), true) - , m_storeLastAddPath(SETTINGS_KEY("LastAddPath"), QDir::homePath()) - , m_storeTrackerList(SETTINGS_KEY("TrackerList")) - , m_storeWebSeedList(SETTINGS_KEY("WebSeedList")) - , m_storeComments(SETTINGS_KEY("Comments")) - , m_storeLastSavePath(SETTINGS_KEY("LastSavePath"), QDir::homePath()) - , m_storeSource(SETTINGS_KEY("Source")) -{ - m_ui->setupUi(this); - setAttribute(Qt::WA_DeleteOnClose); - setModal(false); - - m_ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Create Torrent")); - - connect(m_ui->addFileButton, &QPushButton::clicked, this, &TorrentCreatorDialog::onAddFileButtonClicked); - connect(m_ui->addFolderButton, &QPushButton::clicked, this, &TorrentCreatorDialog::onAddFolderButtonClicked); - connect(m_ui->buttonBox, &QDialogButtonBox::accepted, this, &TorrentCreatorDialog::onCreateButtonClicked); - connect(m_ui->buttonCalcTotalPieces, &QPushButton::clicked, this, &TorrentCreatorDialog::updatePiecesCount); - - connect(m_creatorThread, &BitTorrent::TorrentCreatorThread::creationSuccess, this, &TorrentCreatorDialog::handleCreationSuccess); - connect(m_creatorThread, &BitTorrent::TorrentCreatorThread::creationFailure, this, &TorrentCreatorDialog::handleCreationFailure); - connect(m_creatorThread, &BitTorrent::TorrentCreatorThread::updateProgress, this, &TorrentCreatorDialog::updateProgressBar); - - loadSettings(); - updateInputPath(defaultPath); - - show(); -} - -TorrentCreatorDialog::~TorrentCreatorDialog() -{ - saveSettings(); - - delete m_ui; -} - -void TorrentCreatorDialog::updateInputPath(const QString &path) -{ - if (path.isEmpty()) return; - m_ui->textInputPath->setText(Utils::Fs::toNativePath(path)); - updateProgressBar(0); -} - -void TorrentCreatorDialog::onAddFolderButtonClicked() -{ - QString oldPath = m_ui->textInputPath->text(); - QString path = QFileDialog::getExistingDirectory(this, tr("Select folder"), oldPath); - updateInputPath(path); -} - -void TorrentCreatorDialog::onAddFileButtonClicked() -{ - QString oldPath = m_ui->textInputPath->text(); - QString path = QFileDialog::getOpenFileName(this, tr("Select file"), oldPath); - updateInputPath(path); -} - -int TorrentCreatorDialog::getPieceSize() const -{ - const int pieceSizes[] = {0, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768}; // base unit in KiB - return pieceSizes[m_ui->comboPieceSize->currentIndex()] * 1024; -} - -void TorrentCreatorDialog::dropEvent(QDropEvent *event) -{ - event->acceptProposedAction(); - - if (event->mimeData()->hasUrls()) { - // only take the first one - QUrl firstItem = event->mimeData()->urls().first(); - QString path = (firstItem.scheme().compare("file", Qt::CaseInsensitive) == 0) - ? firstItem.toLocalFile() : firstItem.toString(); - updateInputPath(path); - } -} - -void TorrentCreatorDialog::dragEnterEvent(QDragEnterEvent *event) -{ - if (event->mimeData()->hasFormat("text/plain") || event->mimeData()->hasFormat("text/uri-list")) - event->acceptProposedAction(); -} - -// Main function that create a .torrent file -void TorrentCreatorDialog::onCreateButtonClicked() -{ - QString input = Utils::Fs::fromNativePath(m_ui->textInputPath->text()).trimmed(); - - // test if readable - const QFileInfo fi(input); - if (!fi.isReadable()) { - QMessageBox::critical(this, tr("Torrent creation failed"), tr("Reason: Path to file/folder is not readable.")); - return; - } - input = fi.canonicalFilePath(); - - // get save path - const QString savePath = QString(m_storeLastSavePath) + QLatin1Char('/') + fi.fileName() + QLatin1String(".torrent"); - QString destination = QFileDialog::getSaveFileName(this, tr("Select where to save the new torrent"), savePath, tr("Torrent Files (*.torrent)")); - if (destination.isEmpty()) - return; - if (!destination.endsWith(C_TORRENT_FILE_EXTENSION, Qt::CaseInsensitive)) - destination += C_TORRENT_FILE_EXTENSION; - m_storeLastSavePath = Utils::Fs::branchPath(destination); - - // Disable dialog & set busy cursor - setInteractionEnabled(false); - setCursor(QCursor(Qt::WaitCursor)); - - const QStringList trackers = m_ui->trackersList->toPlainText().trimmed() - .replace(QRegularExpression("\n\n[\n]+"), "\n\n").split('\n'); - const QStringList urlSeeds = m_ui->URLSeedsList->toPlainText().split('\n', QString::SkipEmptyParts); - const QString comment = m_ui->txtComment->toPlainText(); - const QString source = m_ui->lineEditSource->text(); - - // run the creator thread - m_creatorThread->create({ m_ui->checkPrivate->isChecked() - , m_ui->checkOptimizeAlignment->isChecked(), getPieceSize() - , input, destination, comment, source, trackers, urlSeeds }); -} - -void TorrentCreatorDialog::handleCreationFailure(const QString &msg) -{ - // Remove busy cursor - setCursor(QCursor(Qt::ArrowCursor)); - QMessageBox::information(this, tr("Torrent creation failed"), tr("Reason: %1").arg(msg)); - setInteractionEnabled(true); -} - -void TorrentCreatorDialog::handleCreationSuccess(const QString &path, const QString &branchPath) -{ - // Remove busy cursor - setCursor(QCursor(Qt::ArrowCursor)); - if (m_ui->checkStartSeeding->isChecked()) { - // Create save path temp data - BitTorrent::TorrentInfo t = BitTorrent::TorrentInfo::loadFromFile(Utils::Fs::toNativePath(path)); - if (!t.isValid()) { - QMessageBox::critical(this, tr("Torrent creation failed"), tr("Reason: Created torrent is invalid. It won't be added to download list.")); - return; - } - - BitTorrent::AddTorrentParams params; - params.savePath = branchPath; - params.skipChecking = true; - params.ignoreShareLimits = m_ui->checkIgnoreShareLimits->isChecked(); - - BitTorrent::Session::instance()->addTorrent(t, params); - } - QMessageBox::information(this, tr("Torrent creator") - , QString("%1\n%2").arg(tr("Torrent created:"), Utils::Fs::toNativePath(path))); - setInteractionEnabled(true); -} - -void TorrentCreatorDialog::updateProgressBar(int progress) -{ - m_ui->progressBar->setValue(progress); -} - -void TorrentCreatorDialog::updatePiecesCount() -{ - const QString path = m_ui->textInputPath->text().trimmed(); - const bool isAlignmentOptimized = m_ui->checkOptimizeAlignment->isChecked(); - - const int count = BitTorrent::TorrentCreatorThread::calculateTotalPieces(path, getPieceSize(), isAlignmentOptimized); - m_ui->labelTotalPieces->setText(QString::number(count)); -} - -void TorrentCreatorDialog::setInteractionEnabled(bool enabled) -{ - m_ui->textInputPath->setEnabled(enabled); - m_ui->addFileButton->setEnabled(enabled); - m_ui->addFolderButton->setEnabled(enabled); - m_ui->trackersList->setEnabled(enabled); - m_ui->URLSeedsList->setEnabled(enabled); - m_ui->txtComment->setEnabled(enabled); - m_ui->comboPieceSize->setEnabled(enabled); - m_ui->checkPrivate->setEnabled(enabled); - m_ui->checkStartSeeding->setEnabled(enabled); - m_ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(enabled); - m_ui->checkIgnoreShareLimits->setEnabled(enabled && m_ui->checkStartSeeding->isChecked()); -} - -void TorrentCreatorDialog::saveSettings() -{ - m_storeLastAddPath = m_ui->textInputPath->text().trimmed(); - - m_storePieceSize = m_ui->comboPieceSize->currentIndex(); - m_storePrivateTorrent = m_ui->checkPrivate->isChecked(); - m_storeStartSeeding = m_ui->checkStartSeeding->isChecked(); - m_storeIgnoreRatio = m_ui->checkIgnoreShareLimits->isChecked(); - m_storeOptimizeAlignment = m_ui->checkOptimizeAlignment->isChecked(); - - m_storeTrackerList = m_ui->trackersList->toPlainText(); - m_storeWebSeedList = m_ui->URLSeedsList->toPlainText(); - m_storeComments = m_ui->txtComment->toPlainText(); - m_storeSource = m_ui->lineEditSource->text(); - - m_storeDialogSize = size(); -} - -void TorrentCreatorDialog::loadSettings() -{ - m_ui->textInputPath->setText(m_storeLastAddPath); - - m_ui->comboPieceSize->setCurrentIndex(m_storePieceSize); - m_ui->checkPrivate->setChecked(m_storePrivateTorrent); - m_ui->checkStartSeeding->setChecked(m_storeStartSeeding); - m_ui->checkIgnoreShareLimits->setChecked(m_storeIgnoreRatio); - m_ui->checkOptimizeAlignment->setChecked(m_storeOptimizeAlignment); - m_ui->checkIgnoreShareLimits->setEnabled(m_ui->checkStartSeeding->isChecked()); - - m_ui->trackersList->setPlainText(m_storeTrackerList); - m_ui->URLSeedsList->setPlainText(m_storeWebSeedList); - m_ui->txtComment->setPlainText(m_storeComments); - m_ui->lineEditSource->setText(m_storeSource); - - Utils::Gui::resize(this, m_storeDialogSize); -} diff -Nru qbittorrent-4.1.3/src/gui/torrentcreatordialog.h qbittorrent-3.3.15/src/gui/torrentcreatordialog.h --- qbittorrent-4.1.3/src/gui/torrentcreatordialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentcreatordialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,92 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Mike Tzou (Chocobo1) - * Copyright (C) 2010 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef TORRENTCREATORDIALOG_H -#define TORRENTCREATORDIALOG_H - -#include - -#include "base/settingvalue.h" - -namespace Ui -{ - class TorrentCreatorDialog; -} - -namespace BitTorrent -{ - class TorrentCreatorThread; -} - -class TorrentCreatorDialog : public QDialog -{ - Q_OBJECT - -public: - TorrentCreatorDialog(QWidget *parent = nullptr, const QString &defaultPath = QString()); - ~TorrentCreatorDialog() override; - void updateInputPath(const QString &path); - -private slots: - void updateProgressBar(int progress); - void updatePiecesCount(); - void onCreateButtonClicked(); - void onAddFileButtonClicked(); - void onAddFolderButtonClicked(); - void handleCreationFailure(const QString &msg); - void handleCreationSuccess(const QString &path, const QString &branchPath); - -private: - void dropEvent(QDropEvent *event) override; - void dragEnterEvent(QDragEnterEvent *event) override; - - void saveSettings(); - void loadSettings(); - int getPieceSize() const; - void setInteractionEnabled(bool enabled); - - Ui::TorrentCreatorDialog *m_ui; - BitTorrent::TorrentCreatorThread *m_creatorThread; - - // settings - CachedSettingValue m_storeDialogSize; - CachedSettingValue m_storePieceSize; - CachedSettingValue m_storePrivateTorrent; - CachedSettingValue m_storeStartSeeding; - CachedSettingValue m_storeIgnoreRatio; - CachedSettingValue m_storeOptimizeAlignment; - CachedSettingValue m_storeLastAddPath; - CachedSettingValue m_storeTrackerList; - CachedSettingValue m_storeWebSeedList; - CachedSettingValue m_storeComments; - CachedSettingValue m_storeLastSavePath; - CachedSettingValue m_storeSource; -}; - -#endif // TORRENTCREATORDIALOG_H diff -Nru qbittorrent-4.1.3/src/gui/torrentcreatordialog.ui qbittorrent-3.3.15/src/gui/torrentcreatordialog.ui --- qbittorrent-4.1.3/src/gui/torrentcreatordialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentcreatordialog.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,382 +0,0 @@ - - - TorrentCreatorDialog - - - - 0 - 0 - 592 - 658 - - - - true - - - Torrent Creator - - - - - - Select file/folder to share - - - - - - - - Path: - - - - - - - false - - - - - - - - - - - false - - - - 0 - 0 - - - - [Drag and drop area] - - - Qt::AlignCenter - - - - - - - Select file - - - - - - - Select folder - - - - - - - - - - - - Settings - - - - - - - - Piece size: - - - - - - - 0 - - - 7 - - - - Auto - - - - - 16 KiB - - - - - 32 KiB - - - - - 64 KiB - - - - - 128 KiB - - - - - 256 KiB - - - - - 512 KiB - - - - - 1 MiB - - - - - 2 MiB - - - - - 4 MiB - - - - - 8 MiB - - - - - 16 MiB - - - - - 32 MiB - - - - - - - - Calculate number of pieces: - - - - - - - 0 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Private torrent (Won't distribute on DHT network) - - - - - - - Start seeding immediately - - - true - - - - - - - Ignore share ratio limits for this torrent - - - - - - - Optimize alignment - - - true - - - - - - - - - - Fields - - - - - - You can separate tracker tiers / groups with an empty line. - - - false - - - - - - - Web seed URLs: - - - - - - - false - - - - - - - false - - - - - - - Tracker URLs: - - - - - - - Comments: - - - - - - - Source: - - - - - - - - - - - - - - - Progress: - - - - - - - 0 - - - - - - - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - true - - - - - - - textInputPath - addFileButton - addFolderButton - comboPieceSize - checkPrivate - checkStartSeeding - checkIgnoreShareLimits - checkOptimizeAlignment - trackersList - URLSeedsList - txtComment - - - - - checkStartSeeding - clicked(bool) - checkIgnoreShareLimits - setEnabled(bool) - - - 295 - 532 - - - 295 - 555 - - - - - buttonBox - rejected() - TorrentCreatorDialog - reject() - - - 295 - 635 - - - 295 - 328 - - - - - diff -Nru qbittorrent-4.1.3/src/gui/torrentcreatordlg.cpp qbittorrent-3.3.15/src/gui/torrentcreatordlg.cpp --- qbittorrent-4.1.3/src/gui/torrentcreatordlg.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentcreatordlg.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,281 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2010 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#include +#include +#include + +#include "torrentcreatordlg.h" +#include "base/utils/fs.h" +#include "base/utils/misc.h" +#include "base/preferences.h" +#include "guiiconprovider.h" +#include "base/bittorrent/session.h" +#include "base/bittorrent/torrentinfo.h" +#include "base/bittorrent/torrentcreatorthread.h" + +const uint NB_PIECES_MIN = 1200; +const uint NB_PIECES_MAX = 2200; + +TorrentCreatorDlg::TorrentCreatorDlg(QWidget *parent) + : QDialog(parent) + , m_creatorThread(0) +{ + setupUi(this); + // Icons + addFile_button->setIcon(GuiIconProvider::instance()->getIcon("document-new")); + addFolder_button->setIcon(GuiIconProvider::instance()->getIcon("folder-new")); + createButton->setIcon(GuiIconProvider::instance()->getIcon("document-save")); + cancelButton->setIcon(GuiIconProvider::instance()->getIcon("dialog-cancel")); + + setAttribute(Qt::WA_DeleteOnClose); + setModal(true); + showProgressBar(false); + loadTrackerList(); + // Piece sizes + m_pieceSizes << 16 << 32 << 64 << 128 << 256 << 512 << 1024 << 2048 << 4096 << 8192 << 16384; + loadSettings(); + show(); +} + +TorrentCreatorDlg::~TorrentCreatorDlg() +{ + if (m_creatorThread) + delete m_creatorThread; +} + +void TorrentCreatorDlg::on_addFolder_button_clicked() +{ + Preferences* const pref = Preferences::instance(); + QString lastPath = pref->getCreateTorLastAddPath(); + QString dir = QFileDialog::getExistingDirectory(this, tr("Select a folder to add to the torrent"), lastPath, QFileDialog::ShowDirsOnly); + if (!dir.isEmpty()) { + pref->setCreateTorLastAddPath(dir); + textInputPath->setText(Utils::Fs::toNativePath(dir)); + // Update piece size + if (checkAutoPieceSize->isChecked()) + updateOptimalPieceSize(); + } +} + +void TorrentCreatorDlg::on_addFile_button_clicked() +{ + Preferences* const pref = Preferences::instance(); + QString lastPath = pref->getCreateTorLastAddPath(); + QString file = QFileDialog::getOpenFileName(this, tr("Select a file to add to the torrent"), lastPath); + if (!file.isEmpty()) { + pref->setCreateTorLastAddPath(Utils::Fs::branchPath(file)); + textInputPath->setText(Utils::Fs::toNativePath(file)); + // Update piece size + if (checkAutoPieceSize->isChecked()) + updateOptimalPieceSize(); + } +} + +int TorrentCreatorDlg::getPieceSize() const +{ + return m_pieceSizes.at(comboPieceSize->currentIndex()) * 1024; +} + +// Main function that create a .torrent file +void TorrentCreatorDlg::on_createButton_clicked() +{ + QString input = Utils::Fs::fromNativePath(textInputPath->text()).trimmed(); + if (input.endsWith("/")) + input.chop(1); + if (input.isEmpty()) { + QMessageBox::critical(0, tr("No input path set"), tr("Please type an input path first")); + return; + } + QStringList trackers = trackers_list->toPlainText().split("\n"); + if (!trackers_list->toPlainText().trimmed().isEmpty()) + saveTrackerList(); + + Preferences* const pref = Preferences::instance(); + QString lastPath = pref->getCreateTorLastSavePath(); + + QString destination = QFileDialog::getSaveFileName(this, tr("Select destination torrent file"), lastPath, tr("Torrent Files (*.torrent)")); + if (destination.isEmpty()) + return; + + pref->setCreateTorLastSavePath(Utils::Fs::branchPath(destination)); + if (!destination.toUpper().endsWith(".TORRENT")) + destination += QString::fromUtf8(".torrent"); + + // Disable dialog + setInteractionEnabled(false); + showProgressBar(true); + // Set busy cursor + setCursor(QCursor(Qt::WaitCursor)); + // Actually create the torrent + QStringList urlSeeds = URLSeeds_list->toPlainText().split("\n"); + QString comment = txt_comment->toPlainText(); + // Create the creator thread + m_creatorThread = new BitTorrent::TorrentCreatorThread(this); + connect(m_creatorThread, SIGNAL(creationSuccess(QString, QString)), this, SLOT(handleCreationSuccess(QString, QString))); + connect(m_creatorThread, SIGNAL(creationFailure(QString)), this, SLOT(handleCreationFailure(QString))); + connect(m_creatorThread, SIGNAL(updateProgress(int)), this, SLOT(updateProgressBar(int))); + m_creatorThread->create(input, destination, trackers, urlSeeds, comment, check_private->isChecked(), getPieceSize()); +} + +void TorrentCreatorDlg::handleCreationFailure(QString msg) +{ + // Remove busy cursor + setCursor(QCursor(Qt::ArrowCursor)); + QMessageBox::information(0, tr("Torrent creation"), tr("Torrent creation was unsuccessful, reason: %1").arg(msg)); + setInteractionEnabled(true); + showProgressBar(false); +} + +void TorrentCreatorDlg::handleCreationSuccess(QString path, QString branch_path) +{ + // Remove busy cursor + setCursor(QCursor(Qt::ArrowCursor)); + if (checkStartSeeding->isChecked()) { + // Create save path temp data + BitTorrent::TorrentInfo t = BitTorrent::TorrentInfo::loadFromFile(Utils::Fs::toNativePath(path)); + if (!t.isValid()) { + QMessageBox::critical(0, tr("Torrent creation"), tr("Created torrent file is invalid. It won't be added to download list.")); + return; + } + + BitTorrent::AddTorrentParams params; + params.savePath = branch_path; + params.skipChecking = true; + params.ignoreShareRatio = checkIgnoreShareLimits->isChecked(); + + BitTorrent::Session::instance()->addTorrent(t, params); + } + QMessageBox::information(0, tr("Torrent creation"), tr("Torrent was created successfully: %1", "%1 is the path of the torrent").arg(Utils::Fs::toNativePath(path))); + close(); +} + +void TorrentCreatorDlg::on_cancelButton_clicked() +{ + // End torrent creation thread + if (m_creatorThread && m_creatorThread->isRunning()) { + m_creatorThread->abortCreation(); + m_creatorThread->terminate(); + // Wait for termination + m_creatorThread->wait(); + } + // Close the dialog + close(); +} + +void TorrentCreatorDlg::updateProgressBar(int progress) +{ + progressBar->setValue(progress); +} + +void TorrentCreatorDlg::setInteractionEnabled(bool enabled) +{ + textInputPath->setEnabled(enabled); + addFile_button->setEnabled(enabled); + addFolder_button->setEnabled(enabled); + trackers_list->setEnabled(enabled); + URLSeeds_list->setEnabled(enabled); + txt_comment->setEnabled(enabled); + comboPieceSize->setEnabled(enabled); + checkAutoPieceSize->setEnabled(enabled); + check_private->setEnabled(enabled); + checkStartSeeding->setEnabled(enabled); + createButton->setEnabled(enabled); + checkIgnoreShareLimits->setEnabled(enabled && checkStartSeeding->isChecked()); +} + +void TorrentCreatorDlg::showProgressBar(bool show) +{ + progressLbl->setVisible(show); + progressBar->setVisible(show); +} + +void TorrentCreatorDlg::on_checkAutoPieceSize_clicked(bool checked) +{ + comboPieceSize->setEnabled(!checked); + if (checked) + updateOptimalPieceSize(); +} + +void TorrentCreatorDlg::updateOptimalPieceSize() +{ + qint64 torrentSize = Utils::Fs::computePathSize(textInputPath->text()); + qDebug("Torrent size is %lld", torrentSize); + if (torrentSize < 0) + return; + int i = 0; + qulonglong nb_pieces = 0; + do { + nb_pieces = (double)torrentSize/(m_pieceSizes.at(i) * 1024.); + qDebug("nb_pieces=%lld with piece_size=%s", nb_pieces, qPrintable(comboPieceSize->itemText(i))); + if (nb_pieces <= NB_PIECES_MIN) { + if (i > 1) + --i; + break; + } + else if (nb_pieces < NB_PIECES_MAX) { + qDebug("Good, nb_pieces=%lld < %d", nb_pieces + 1, NB_PIECES_MAX); + break; + } + ++i; + } while (i < (m_pieceSizes.size() - 1)); + comboPieceSize->setCurrentIndex(i); +} + +void TorrentCreatorDlg::saveTrackerList() +{ + Preferences::instance()->setCreateTorTrackers(trackers_list->toPlainText()); +} + +void TorrentCreatorDlg::loadTrackerList() +{ + trackers_list->setPlainText(Preferences::instance()->getCreateTorTrackers()); +} + +void TorrentCreatorDlg::saveSettings() +{ + Preferences* const pref = Preferences::instance(); + pref->setCreateTorGeometry(saveGeometry()); + pref->setCreateTorIgnoreRatio(checkIgnoreShareLimits->isChecked()); +} + +void TorrentCreatorDlg::loadSettings() +{ + const Preferences* const pref = Preferences::instance(); + restoreGeometry(pref->getCreateTorGeometry()); + checkIgnoreShareLimits->setChecked(pref->getCreateTorIgnoreRatio()); +} + +void TorrentCreatorDlg::closeEvent(QCloseEvent *event) +{ + qDebug() << Q_FUNC_INFO; + saveSettings(); + QDialog::closeEvent(event); +} diff -Nru qbittorrent-4.1.3/src/gui/torrentcreatordlg.h qbittorrent-3.3.15/src/gui/torrentcreatordlg.h --- qbittorrent-4.1.3/src/gui/torrentcreatordlg.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentcreatordlg.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,79 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2010 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef CREATE_TORRENT_IMP_H +#define CREATE_TORRENT_IMP_H + +#include "ui_torrentcreatordlg.h" + +namespace BitTorrent +{ + class TorrentCreatorThread; +} + +class TorrentCreatorDlg : public QDialog, private Ui::createTorrentDialog +{ + Q_OBJECT + +public: + TorrentCreatorDlg(QWidget *parent = 0); + ~TorrentCreatorDlg(); + int getPieceSize() const; + +public slots: + void updateProgressBar(int progress); + void on_cancelButton_clicked(); + +protected slots: + void on_createButton_clicked(); + void on_addFile_button_clicked(); + void on_addFolder_button_clicked(); + void handleCreationFailure(QString msg); + void handleCreationSuccess(QString path, QString branch_path); + void setInteractionEnabled(bool enabled); + void showProgressBar(bool show); + void on_checkAutoPieceSize_clicked(bool checked); + void updateOptimalPieceSize(); + void saveTrackerList(); + void loadTrackerList(); + +protected: + void closeEvent(QCloseEvent *event); + +private: + void saveSettings(); + void loadSettings(); + +private: + BitTorrent::TorrentCreatorThread *m_creatorThread; + QList m_pieceSizes; +}; + +#endif diff -Nru qbittorrent-4.1.3/src/gui/torrentcreatordlg.ui qbittorrent-3.3.15/src/gui/torrentcreatordlg.ui --- qbittorrent-4.1.3/src/gui/torrentcreatordlg.ui 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentcreatordlg.ui 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,348 @@ + + + createTorrentDialog + + + + 0 + 0 + 592 + 658 + + + + Torrent Creation Tool + + + + + + + 0 + 27 + + + + + 16777215 + 27 + + + + + 75 + true + + + + Torrent file creation + + + Qt::AlignCenter + + + + + + + File or folder to add to the torrent: + + + + + + + + + + + + Add file + + + + + + + Add folder + + + + + + + + + + + Tracker URLs: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Web seeds urls: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + Comment: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + false + + + + + + + + 0 + 0 + + + + You can separate tracker tiers / groups with an empty line. + + + false + + + + + + + false + + + + + + + + + + + Piece size: + + + + + + + false + + + false + + + 4 + + + + 16 KiB + + + + + 32 KiB + + + + + 64 KiB + + + + + 128 KiB + + + + + 256 KiB + + + + + 512 KiB + + + + + 1 MiB + + + + + 2 MiB + + + + + 4 MiB + + + + + 8 MiB + + + + + 16 MiB + + + + + + + + Auto + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Private (won't be distributed on DHT network if enabled) + + + + + + + Start seeding after creation + + + true + + + + + + + Ignore share ratio limits for this torrent + + + + + + + Progress: + + + + + + + 0 + + + + + + + + + Qt::Horizontal + + + + 131 + 31 + + + + + + + + Create and save... + + + + + + + Cancel + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + checkStartSeeding + clicked(bool) + checkIgnoreShareLimits + setEnabled(bool) + + + 295 + 532 + + + 295 + 555 + + + + + diff -Nru qbittorrent-4.1.3/src/gui/torrentmodel.cpp qbittorrent-3.3.15/src/gui/torrentmodel.cpp --- qbittorrent-4.1.3/src/gui/torrentmodel.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentmodel.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,468 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2015 Vladimir Golovnev + * Copyright (C) 2010 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#include +#include +#include +#include + +#include "base/bittorrent/session.h" +#include "base/bittorrent/torrenthandle.h" +#include "base/torrentfilter.h" +#include "base/utils/fs.h" +#include "torrentmodel.h" + +static QIcon getIconByState(BitTorrent::TorrentState state); +static QColor getColorByState(BitTorrent::TorrentState state); + +static QIcon getPausedIcon(); +static QIcon getQueuedIcon(); +static QIcon getDownloadingIcon(); +static QIcon getStalledDownloadingIcon(); +static QIcon getUploadingIcon(); +static QIcon getStalledUploadingIcon(); +static QIcon getCompletedIcon(); +static QIcon getCheckingIcon(); +static QIcon getErrorIcon(); + +static bool isDarkTheme(); + +// TorrentModel + +TorrentModel::TorrentModel(QObject *parent) + : QAbstractListModel(parent) +{ + // Load the torrents + foreach (BitTorrent::TorrentHandle *const torrent, BitTorrent::Session::instance()->torrents()) + addTorrent(torrent); + + // Listen for torrent changes + connect(BitTorrent::Session::instance(), SIGNAL(torrentAdded(BitTorrent::TorrentHandle * const)), SLOT(addTorrent(BitTorrent::TorrentHandle * const))); + connect(BitTorrent::Session::instance(), SIGNAL(torrentAboutToBeRemoved(BitTorrent::TorrentHandle * const)), SLOT(handleTorrentAboutToBeRemoved(BitTorrent::TorrentHandle * const))); + connect(BitTorrent::Session::instance(), SIGNAL(torrentsUpdated()), SLOT(handleTorrentsUpdated())); + + connect(BitTorrent::Session::instance(), SIGNAL(torrentFinished(BitTorrent::TorrentHandle * const)), SLOT(handleTorrentStatusUpdated(BitTorrent::TorrentHandle * const))); + connect(BitTorrent::Session::instance(), SIGNAL(torrentMetadataLoaded(BitTorrent::TorrentHandle * const)), SLOT(handleTorrentStatusUpdated(BitTorrent::TorrentHandle * const))); + connect(BitTorrent::Session::instance(), SIGNAL(torrentResumed(BitTorrent::TorrentHandle * const)), SLOT(handleTorrentStatusUpdated(BitTorrent::TorrentHandle * const))); + connect(BitTorrent::Session::instance(), SIGNAL(torrentPaused(BitTorrent::TorrentHandle * const)), SLOT(handleTorrentStatusUpdated(BitTorrent::TorrentHandle * const))); + connect(BitTorrent::Session::instance(), SIGNAL(torrentFinishedChecking(BitTorrent::TorrentHandle * const)), SLOT(handleTorrentStatusUpdated(BitTorrent::TorrentHandle * const))); +} + +int TorrentModel::rowCount(const QModelIndex &index) const +{ + Q_UNUSED(index); + return m_torrents.size(); +} + +int TorrentModel::columnCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent); + return NB_COLUMNS; +} + +QVariant TorrentModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (orientation == Qt::Horizontal) { + if (role == Qt::DisplayRole) { + switch (section) { + case TR_PRIORITY: return "#"; + case TR_NAME: return tr("Name", "i.e: torrent name"); + case TR_SIZE: return tr("Size", "i.e: torrent size"); + case TR_PROGRESS: return tr("Done", "% Done"); + case TR_STATUS: return tr("Status", "Torrent status (e.g. downloading, seeding, paused)"); + case TR_SEEDS: return tr("Seeds", "i.e. full sources (often untranslated)"); + case TR_PEERS: return tr("Peers", "i.e. partial sources (often untranslated)"); + case TR_DLSPEED: return tr("Down Speed", "i.e: Download speed"); + case TR_UPSPEED: return tr("Up Speed", "i.e: Upload speed"); + case TR_RATIO: return tr("Ratio", "Share ratio"); + case TR_ETA: return tr("ETA", "i.e: Estimated Time of Arrival / Time left"); + case TR_CATEGORY: return tr("Category"); + case TR_ADD_DATE: return tr("Added On", "Torrent was added to transfer list on 01/01/2010 08:00"); + case TR_SEED_DATE: return tr("Completed On", "Torrent was completed on 01/01/2010 08:00"); + case TR_TRACKER: return tr("Tracker"); + case TR_DLLIMIT: return tr("Down Limit", "i.e: Download limit"); + case TR_UPLIMIT: return tr("Up Limit", "i.e: Upload limit"); + case TR_AMOUNT_DOWNLOADED: return tr("Downloaded", "Amount of data downloaded (e.g. in MB)"); + case TR_AMOUNT_UPLOADED: return tr("Uploaded", "Amount of data uploaded (e.g. in MB)"); + case TR_AMOUNT_DOWNLOADED_SESSION: return tr("Session Download", "Amount of data downloaded since program open (e.g. in MB)"); + case TR_AMOUNT_UPLOADED_SESSION: return tr("Session Upload", "Amount of data uploaded since program open (e.g. in MB)"); + case TR_AMOUNT_LEFT: return tr("Remaining", "Amount of data left to download (e.g. in MB)"); + case TR_TIME_ELAPSED: return tr("Time Active", "Time (duration) the torrent is active (not paused)"); + case TR_SAVE_PATH: return tr("Save path", "Torrent save path"); + case TR_COMPLETED: return tr("Completed", "Amount of data completed (e.g. in MB)"); + case TR_RATIO_LIMIT: return tr("Ratio Limit", "Upload share ratio limit"); + case TR_SEEN_COMPLETE_DATE: return tr("Last Seen Complete", "Indicates the time when the torrent was last seen complete/whole"); + case TR_LAST_ACTIVITY: return tr("Last Activity", "Time passed since a chunk was downloaded/uploaded"); + case TR_TOTAL_SIZE: return tr("Total Size", "i.e. Size including unwanted data"); + default: + return QVariant(); + } + } + else if (role == Qt::TextAlignmentRole) { + switch (section) { + case TR_AMOUNT_DOWNLOADED: + case TR_AMOUNT_UPLOADED: + case TR_AMOUNT_DOWNLOADED_SESSION: + case TR_AMOUNT_UPLOADED_SESSION: + case TR_AMOUNT_LEFT: + case TR_COMPLETED: + case TR_SIZE: + case TR_TOTAL_SIZE: + case TR_ETA: + case TR_SEEDS: + case TR_PEERS: + case TR_UPSPEED: + case TR_DLSPEED: + case TR_UPLIMIT: + case TR_DLLIMIT: + case TR_RATIO_LIMIT: + case TR_RATIO: + case TR_PRIORITY: + case TR_LAST_ACTIVITY: + return QVariant(Qt::AlignRight | Qt::AlignVCenter); + default: + return QAbstractListModel::headerData(section, orientation, role); + } + } + } + + return QVariant(); +} + +QVariant TorrentModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) return QVariant(); + + BitTorrent::TorrentHandle *const torrent = m_torrents.value(index.row()); + if (!torrent) return QVariant(); + + if ((role == Qt::DecorationRole) && (index.column() == TR_NAME)) + return getIconByState(torrent->state()); + + if (role == Qt::ForegroundRole) + return getColorByState(torrent->state()); + + if ((role != Qt::DisplayRole) && (role != Qt::UserRole)) + return QVariant(); + + switch (index.column()) { + case TR_NAME: + return torrent->name(); + case TR_PRIORITY: + return torrent->queuePosition(); + case TR_SIZE: + return torrent->wantedSize(); + case TR_PROGRESS: + return torrent->progress(); + case TR_STATUS: + return static_cast(torrent->state()); + case TR_SEEDS: + return (role == Qt::DisplayRole) ? torrent->seedsCount() : torrent->totalSeedsCount(); + case TR_PEERS: + return (role == Qt::DisplayRole) ? torrent->leechsCount() : torrent->totalLeechersCount(); + case TR_DLSPEED: + return torrent->downloadPayloadRate(); + case TR_UPSPEED: + return torrent->uploadPayloadRate(); + case TR_ETA: + return torrent->eta(); + case TR_RATIO: + return torrent->realRatio(); + case TR_CATEGORY: + return torrent->category(); + case TR_ADD_DATE: + return torrent->addedTime(); + case TR_SEED_DATE: + return torrent->completedTime(); + case TR_TRACKER: + return torrent->currentTracker(); + case TR_DLLIMIT: + return torrent->downloadLimit(); + case TR_UPLIMIT: + return torrent->uploadLimit(); + case TR_AMOUNT_DOWNLOADED: + return torrent->totalDownload(); + case TR_AMOUNT_UPLOADED: + return torrent->totalUpload(); + case TR_AMOUNT_DOWNLOADED_SESSION: + return torrent->totalPayloadDownload(); + case TR_AMOUNT_UPLOADED_SESSION: + return torrent->totalPayloadUpload(); + case TR_AMOUNT_LEFT: + return torrent->incompletedSize(); + case TR_TIME_ELAPSED: + return (role == Qt::DisplayRole) ? torrent->activeTime() : torrent->seedingTime(); + case TR_SAVE_PATH: + return Utils::Fs::toNativePath(torrent->savePath()); + case TR_COMPLETED: + return torrent->completedSize(); + case TR_RATIO_LIMIT: + return torrent->maxRatio(); + case TR_SEEN_COMPLETE_DATE: + return torrent->lastSeenComplete(); + case TR_LAST_ACTIVITY: + if (torrent->isPaused() || torrent->isChecking()) + return -1; + return torrent->timeSinceActivity(); + case TR_TOTAL_SIZE: + return torrent->totalSize(); + default: + return QVariant(); + } + + return QVariant(); +} + +bool TorrentModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + qDebug() << Q_FUNC_INFO << value; + if (!index.isValid() || (role != Qt::DisplayRole)) return false; + + qDebug("Index is valid and role is DisplayRole"); + BitTorrent::TorrentHandle *const torrent = m_torrents.value(index.row()); + if (!torrent) return false; + + // Category, seed date and Name columns can be edited + switch (index.column()) { + case TR_NAME: + torrent->setName(value.toString()); + break; + case TR_CATEGORY: + torrent->setCategory(value.toString()); + break; + default: + return false; + } + + return true; +} + +void TorrentModel::addTorrent(BitTorrent::TorrentHandle *const torrent) +{ + if (m_torrents.indexOf(torrent) == -1) { + const int row = m_torrents.size(); + beginInsertRows(QModelIndex(), row, row); + m_torrents << torrent; + endInsertRows(); + } +} + +Qt::ItemFlags TorrentModel::flags(const QModelIndex &index) const +{ + if (!index.isValid()) return 0; + + // Explicitly mark as editable + return QAbstractListModel::flags(index) | Qt::ItemIsEditable; +} + +BitTorrent::TorrentHandle *TorrentModel::torrentHandle(const QModelIndex &index) const +{ + if (!index.isValid()) return 0; + + return m_torrents.value(index.row()); +} + +void TorrentModel::handleTorrentAboutToBeRemoved(BitTorrent::TorrentHandle *const torrent) +{ + const int row = m_torrents.indexOf(torrent); + if (row >= 0) { + beginRemoveRows(QModelIndex(), row, row); + m_torrents.removeAt(row); + endRemoveRows(); + } +} + +void TorrentModel::handleTorrentStatusUpdated(BitTorrent::TorrentHandle *const torrent) +{ + const int row = m_torrents.indexOf(torrent); + if (row >= 0) + emit dataChanged(index(row, 0), index(row, columnCount() - 1)); +} + +void TorrentModel::handleTorrentsUpdated() +{ + emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1)); +} + +// Static functions + +QIcon getIconByState(BitTorrent::TorrentState state) +{ + switch (state) { + case BitTorrent::TorrentState::Downloading: + case BitTorrent::TorrentState::ForcedDownloading: + case BitTorrent::TorrentState::DownloadingMetadata: + return getDownloadingIcon(); + case BitTorrent::TorrentState::Allocating: + case BitTorrent::TorrentState::StalledDownloading: + return getStalledDownloadingIcon(); + case BitTorrent::TorrentState::StalledUploading: + return getStalledUploadingIcon(); + case BitTorrent::TorrentState::Uploading: + case BitTorrent::TorrentState::ForcedUploading: + return getUploadingIcon(); + case BitTorrent::TorrentState::PausedDownloading: + return getPausedIcon(); + case BitTorrent::TorrentState::PausedUploading: + return getCompletedIcon(); + case BitTorrent::TorrentState::QueuedDownloading: + case BitTorrent::TorrentState::QueuedUploading: + return getQueuedIcon(); + case BitTorrent::TorrentState::CheckingDownloading: + case BitTorrent::TorrentState::CheckingUploading: + case BitTorrent::TorrentState::QueuedForChecking: + case BitTorrent::TorrentState::CheckingResumeData: + return getCheckingIcon(); + case BitTorrent::TorrentState::Unknown: + case BitTorrent::TorrentState::MissingFiles: + case BitTorrent::TorrentState::Error: + return getErrorIcon(); + default: + Q_ASSERT(false); + return getErrorIcon(); + } +} + +QColor getColorByState(BitTorrent::TorrentState state) +{ + // Color names taken from http://cloford.com/resources/colours/500col.htm + bool dark = isDarkTheme(); + + switch (state) { + case BitTorrent::TorrentState::Downloading: + case BitTorrent::TorrentState::ForcedDownloading: + case BitTorrent::TorrentState::DownloadingMetadata: + if (!dark) + return QColor(34, 139, 34); // Forest Green + else + return QColor(50, 205, 50); // Lime Green + case BitTorrent::TorrentState::Allocating: + case BitTorrent::TorrentState::StalledDownloading: + case BitTorrent::TorrentState::StalledUploading: + if (!dark) + return QColor(0, 0, 0); // Black + else + return QColor(204, 204, 204); // Gray 80 + case BitTorrent::TorrentState::Uploading: + case BitTorrent::TorrentState::ForcedUploading: + if (!dark) + return QColor(65, 105, 225); // Royal Blue + else + return QColor(99, 184, 255); // Steel Blue 1 + case BitTorrent::TorrentState::PausedDownloading: + return QColor(250, 128, 114); // Salmon + case BitTorrent::TorrentState::PausedUploading: + if (!dark) + return QColor(0, 0, 139); // Dark Blue + else + return QColor(79, 148, 205); // Steel Blue 3 + case BitTorrent::TorrentState::Error: + case BitTorrent::TorrentState::MissingFiles: + return QColor(255, 0, 0); // red + case BitTorrent::TorrentState::QueuedDownloading: + case BitTorrent::TorrentState::QueuedUploading: + case BitTorrent::TorrentState::CheckingDownloading: + case BitTorrent::TorrentState::CheckingUploading: + case BitTorrent::TorrentState::QueuedForChecking: + case BitTorrent::TorrentState::CheckingResumeData: + if (!dark) + return QColor(0, 128, 128); // Teal + else + return QColor(0, 205, 205); // Cyan 3 + case BitTorrent::TorrentState::Unknown: + return QColor(255, 0, 0); // red + default: + Q_ASSERT(false); + return QColor(255, 0, 0); // red + } +} + +QIcon getPausedIcon() +{ + static QIcon cached = QIcon(":/icons/skin/paused.png"); + return cached; +} + +QIcon getQueuedIcon() +{ + static QIcon cached = QIcon(":/icons/skin/queued.png"); + return cached; +} + +QIcon getDownloadingIcon() +{ + static QIcon cached = QIcon(":/icons/skin/downloading.png"); + return cached; +} + +QIcon getStalledDownloadingIcon() +{ + static QIcon cached = QIcon(":/icons/skin/stalledDL.png"); + return cached; +} + +QIcon getUploadingIcon() +{ + static QIcon cached = QIcon(":/icons/skin/uploading.png"); + return cached; +} + +QIcon getStalledUploadingIcon() +{ + static QIcon cached = QIcon(":/icons/skin/stalledUP.png"); + return cached; +} + +QIcon getCompletedIcon() +{ + static QIcon cached = QIcon(":/icons/skin/completed.png"); + return cached; +} + +QIcon getCheckingIcon() +{ + static QIcon cached = QIcon(":/icons/skin/checking.png"); + return cached; +} + +QIcon getErrorIcon() +{ + static QIcon cached = QIcon(":/icons/skin/error.png"); + return cached; +} + +bool isDarkTheme() +{ + QPalette pal = QApplication::palette(); + // QPalette::Base is used for the background of the Treeview + QColor color = pal.color(QPalette::Active, QPalette::Base); + return (color.lightness() < 127); +} diff -Nru qbittorrent-4.1.3/src/gui/torrentmodel.h qbittorrent-3.3.15/src/gui/torrentmodel.h --- qbittorrent-4.1.3/src/gui/torrentmodel.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/torrentmodel.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,106 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2015 Vladimir Golovnev + * Copyright (C) 2010 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef TORRENTMODEL_H +#define TORRENTMODEL_H + +#include +#include + +namespace BitTorrent +{ + class InfoHash; + class TorrentHandle; +} + +class TorrentModel : public QAbstractListModel +{ + Q_OBJECT + Q_DISABLE_COPY(TorrentModel) + +public: + enum Column + { + TR_PRIORITY, + TR_NAME, + TR_SIZE, + TR_TOTAL_SIZE, + TR_PROGRESS, + TR_STATUS, + TR_SEEDS, + TR_PEERS, + TR_DLSPEED, + TR_UPSPEED, + TR_ETA, + TR_RATIO, + TR_CATEGORY, + TR_ADD_DATE, + TR_SEED_DATE, + TR_TRACKER, + TR_DLLIMIT, + TR_UPLIMIT, + TR_AMOUNT_DOWNLOADED, + TR_AMOUNT_UPLOADED, + TR_AMOUNT_DOWNLOADED_SESSION, + TR_AMOUNT_UPLOADED_SESSION, + TR_AMOUNT_LEFT, + TR_TIME_ELAPSED, + TR_SAVE_PATH, + TR_COMPLETED, + TR_RATIO_LIMIT, + TR_SEEN_COMPLETE_DATE, + TR_LAST_ACTIVITY, + + NB_COLUMNS + }; + + explicit TorrentModel(QObject *parent = 0); + + int rowCount(const QModelIndex& index = QModelIndex()) const; + int columnCount(const QModelIndex &parent=QModelIndex()) const; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::DisplayRole); + QVariant headerData(int section, Qt::Orientation orientation, int role) const; + Qt::ItemFlags flags(const QModelIndex &index) const; + + BitTorrent::TorrentHandle *torrentHandle(const QModelIndex &index) const; + +private slots: + void addTorrent(BitTorrent::TorrentHandle *const torrent); + void handleTorrentAboutToBeRemoved(BitTorrent::TorrentHandle *const torrent); + void handleTorrentStatusUpdated(BitTorrent::TorrentHandle *const torrent); + void handleTorrentsUpdated(); + +private: + QList m_torrents; +}; + +#endif // TORRENTMODEL_H diff -Nru qbittorrent-4.1.3/src/gui/trackerlogin.cpp qbittorrent-3.3.15/src/gui/trackerlogin.cpp --- qbittorrent-4.1.3/src/gui/trackerlogin.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/trackerlogin.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,58 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#include "base/bittorrent/torrenthandle.h" +#include "trackerlogin.h" + +trackerLogin::trackerLogin(QWidget *parent, BitTorrent::TorrentHandle *const torrent) + : QDialog(parent) + , m_torrent(torrent) +{ + setupUi(this); + setAttribute(Qt::WA_DeleteOnClose); + login_logo->setPixmap(QPixmap(QString::fromUtf8(":/icons/oxygen/encrypted.png"))); + tracker_url->setText(torrent->currentTracker()); + connect(this, SIGNAL(trackerLoginCancelled(QPair)), parent, SLOT(addUnauthenticatedTracker(QPair))); + show(); +} + +trackerLogin::~trackerLogin() {} + +void trackerLogin::on_loginButton_clicked() { + // login + m_torrent->setTrackerLogin(lineUsername->text(), linePasswd->text()); + close(); +} + +void trackerLogin::on_cancelButton_clicked() { + // Emit a signal to GUI to stop asking for authentication + emit trackerLoginCancelled(qMakePair(m_torrent, m_torrent->currentTracker())); + close(); +} diff -Nru qbittorrent-4.1.3/src/gui/trackerlogindialog.cpp qbittorrent-3.3.15/src/gui/trackerlogindialog.cpp --- qbittorrent-4.1.3/src/gui/trackerlogindialog.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/trackerlogindialog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,78 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "trackerlogindialog.h" - -#include - -#include - -#include "base/bittorrent/torrenthandle.h" -#include "guiiconprovider.h" -#include "utils.h" - -TrackerLoginDialog::TrackerLoginDialog(QWidget *parent, BitTorrent::TorrentHandle *const torrent) - : QDialog(parent) - , m_torrent(torrent) -{ - setupUi(this); - setAttribute(Qt::WA_DeleteOnClose); - - buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Log in")); - - labelLoginLogo->setPixmap(Utils::Gui::scaledPixmap(GuiIconProvider::instance()->getIcon("document-encrypt"), this, 32)); - - labelTrackerURL->setText(torrent->currentTracker()); - - connect(buttonBox, &QDialogButtonBox::accepted, this, &TrackerLoginDialog::loginButtonClicked); - connect(buttonBox, &QDialogButtonBox::rejected, this, &TrackerLoginDialog::cancelButtonClicked); - connect(linePasswd, &QLineEdit::returnPressed, this, &TrackerLoginDialog::loginButtonClicked); - connect(this, SIGNAL(trackerLoginCancelled(QPair)), // TODO: use Qt5 connect syntax - parent, SLOT(addUnauthenticatedTracker(QPair))); - - Utils::Gui::resize(this); - show(); -} - -TrackerLoginDialog::~TrackerLoginDialog() {} - -void TrackerLoginDialog::loginButtonClicked() -{ - // login -#if LIBTORRENT_VERSION_NUM < 10100 - m_torrent->setTrackerLogin(lineUsername->text(), linePasswd->text()); -#endif - accept(); -} - -void TrackerLoginDialog::cancelButtonClicked() -{ - // Emit a signal to GUI to stop asking for authentication - emit trackerLoginCancelled(qMakePair(m_torrent, m_torrent->currentTracker())); - reject(); -} diff -Nru qbittorrent-4.1.3/src/gui/trackerlogindialog.h qbittorrent-3.3.15/src/gui/trackerlogindialog.h --- qbittorrent-4.1.3/src/gui/trackerlogindialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/trackerlogindialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,60 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef TRACKERLOGINDIALOG_H -#define TRACKERLOGINDIALOG_H - -#include - -#include "ui_trackerlogindialog.h" - -namespace BitTorrent -{ - class TorrentHandle; -} - -class TrackerLoginDialog : public QDialog, private Ui::TrackerLoginDialog -{ - Q_OBJECT - -public: - TrackerLoginDialog(QWidget *parent, BitTorrent::TorrentHandle *const torrent); - ~TrackerLoginDialog(); - -signals: - void trackerLoginCancelled(QPair tracker); - -private slots: - void loginButtonClicked(); - void cancelButtonClicked(); - -private: - BitTorrent::TorrentHandle *const m_torrent; -}; - -#endif // TRACKERLOGINDIALOG_H diff -Nru qbittorrent-4.1.3/src/gui/trackerlogindialog.ui qbittorrent-3.3.15/src/gui/trackerlogindialog.ui --- qbittorrent-4.1.3/src/gui/trackerlogindialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/trackerlogindialog.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,167 +0,0 @@ - - - TrackerLoginDialog - - - - 0 - 0 - 311 - 231 - - - - Tracker authentication - - - - - - - - - 39 - 39 - - - - - - - - - - - - 16777215 - 39 - - - - - 75 - true - - - - Tracker authentication - - - - - - - - - - - - 75 - true - - - - Tracker: - - - - - - - - 220 - 0 - - - - - - - - - - - - - Login - - - - - - - - Username: - - - lineUsername - - - - - - - - - - - - - - - 68 - 0 - - - - Password: - - - linePasswd - - - - - - - QLineEdit::Password - - - - - - - - - - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - true - - - - - - - - - lineUsername - returnPressed() - linePasswd - setFocus() - - - 199 - 130 - - - 198 - 157 - - - - - diff -Nru qbittorrent-4.1.3/src/gui/trackerlogin.h qbittorrent-3.3.15/src/gui/trackerlogin.h --- qbittorrent-4.1.3/src/gui/trackerlogin.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/trackerlogin.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,61 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef TRACKERLOGIN_H +#define TRACKERLOGIN_H + +#include + +#include "ui_login.h" + +namespace BitTorrent +{ + class TorrentHandle; +} + +class trackerLogin : public QDialog, private Ui::authentication{ + Q_OBJECT + + private: + BitTorrent::TorrentHandle *const m_torrent; + + public: + trackerLogin(QWidget *parent, BitTorrent::TorrentHandle *const torrent); + ~trackerLogin(); + + signals: + void trackerLoginCancelled(QPair tracker); + + public slots: + void on_loginButton_clicked(); + void on_cancelButton_clicked(); +}; + +#endif diff -Nru qbittorrent-4.1.3/src/gui/transferlistdelegate.cpp qbittorrent-3.3.15/src/gui/transferlistdelegate.cpp --- qbittorrent-4.1.3/src/gui/transferlistdelegate.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/transferlistdelegate.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,40 +24,45 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #include "transferlistdelegate.h" -#include #include -#include #include - -#ifdef Q_OS_WIN -#include -#endif - +#include +#include +#include "base/utils/misc.h" +#include "base/utils/string.h" +#include "torrentmodel.h" #include "base/bittorrent/session.h" #include "base/bittorrent/torrenthandle.h" -#include "base/preferences.h" #include "base/types.h" +#include "base/preferences.h" #include "base/unicodestrings.h" -#include "base/utils/misc.h" -#include "base/utils/string.h" -#include "transferlistmodel.h" + +#ifdef Q_OS_WIN +#ifndef QBT_USES_QT5 +#include +#else +#include +#endif +#endif TransferListDelegate::TransferListDelegate(QObject *parent) : QItemDelegate(parent) { } -void TransferListDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +void TransferListDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const { painter->save(); bool isHideState = true; if (Preferences::instance()->getHideZeroComboValues() == 1) { // paused torrents only - QModelIndex stateIndex = index.sibling(index.row(), TransferListModel::TR_STATUS); - if (stateIndex.data().value() != BitTorrent::TorrentState::PausedDownloading) + QModelIndex stateIndex = index.sibling(index.row(), TorrentModel::TR_STATUS); + if (stateIndex.data().toInt() != BitTorrent::TorrentState::PausedDownloading) isHideState = false; } const bool hideValues = Preferences::instance()->getHideZeroValues() & isHideState; @@ -65,146 +70,150 @@ QStyleOptionViewItem opt = QItemDelegate::setOptions(index, option); QItemDelegate::drawBackground(painter, opt, index); switch (index.column()) { - case TransferListModel::TR_AMOUNT_DOWNLOADED: - case TransferListModel::TR_AMOUNT_UPLOADED: - case TransferListModel::TR_AMOUNT_DOWNLOADED_SESSION: - case TransferListModel::TR_AMOUNT_UPLOADED_SESSION: - case TransferListModel::TR_AMOUNT_LEFT: - case TransferListModel::TR_COMPLETED: - case TransferListModel::TR_SIZE: - case TransferListModel::TR_TOTAL_SIZE: { - qlonglong size = index.data().toLongLong(); - if (hideValues && !size) - break; - opt.displayAlignment = (Qt::AlignRight | Qt::AlignVCenter); - QItemDelegate::drawDisplay(painter, opt, option.rect, Utils::Misc::friendlyUnit(size)); - } + case TorrentModel::TR_AMOUNT_DOWNLOADED: + case TorrentModel::TR_AMOUNT_UPLOADED: + case TorrentModel::TR_AMOUNT_DOWNLOADED_SESSION: + case TorrentModel::TR_AMOUNT_UPLOADED_SESSION: + case TorrentModel::TR_AMOUNT_LEFT: + case TorrentModel::TR_COMPLETED: + case TorrentModel::TR_SIZE: + case TorrentModel::TR_TOTAL_SIZE: { + qlonglong size = index.data().toLongLong(); + if (hideValues && !size) + break; + opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; + QItemDelegate::drawDisplay(painter, opt, option.rect, Utils::Misc::friendlyUnit(size)); break; - case TransferListModel::TR_ETA: { + } + case TorrentModel::TR_ETA: { opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; QItemDelegate::drawDisplay(painter, opt, option.rect, Utils::Misc::userFriendlyDuration(index.data().toLongLong())); break; } - case TransferListModel::TR_SEEDS: - case TransferListModel::TR_PEERS: { - qlonglong value = index.data().toLongLong(); - qlonglong total = index.data(Qt::UserRole).toLongLong(); - if (hideValues && (!value && !total)) - break; - QString display = QString::number(value) + " (" + QString::number(total) + ')'; - opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; - QItemDelegate::drawDisplay(painter, opt, opt.rect, display); - } + case TorrentModel::TR_SEEDS: + case TorrentModel::TR_PEERS: { + qlonglong value = index.data().toLongLong(); + qlonglong total = index.data(Qt::UserRole).toLongLong(); + if (hideValues && (!value && !total)) + break; + QString display = QString::number(value) + " (" + QString::number(total) + ")"; + opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; + QItemDelegate::drawDisplay(painter, opt, opt.rect, display); break; - case TransferListModel::TR_STATUS: { - const auto state = index.data().value(); - QString display = getStatusString(state); - QItemDelegate::drawDisplay(painter, opt, opt.rect, display); - } + } + case TorrentModel::TR_STATUS: { + const int state = index.data().toInt(); + QString display = getStatusString(state); + QItemDelegate::drawDisplay(painter, opt, opt.rect, display); break; - case TransferListModel::TR_UPSPEED: - case TransferListModel::TR_DLSPEED: { - const int speed = index.data().toInt(); - if (hideValues && !speed) - break; - opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; - QItemDelegate::drawDisplay(painter, opt, opt.rect, Utils::Misc::friendlyUnit(speed, true)); - } + } + case TorrentModel::TR_UPSPEED: + case TorrentModel::TR_DLSPEED: { + const qulonglong speed = index.data().toULongLong(); + if (hideValues && !speed) + break; + opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; + QItemDelegate::drawDisplay(painter, opt, opt.rect, Utils::Misc::friendlyUnit(speed, true)); break; - case TransferListModel::TR_UPLIMIT: - case TransferListModel::TR_DLLIMIT: { - const qlonglong limit = index.data().toLongLong(); - if (hideValues && !limit) - break; - opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; - QItemDelegate::drawDisplay(painter, opt, opt.rect, limit > 0 ? Utils::Misc::friendlyUnit(limit, true) : QString::fromUtf8(C_INFINITY)); - } + } + case TorrentModel::TR_UPLIMIT: + case TorrentModel::TR_DLLIMIT: { + const qlonglong limit = index.data().toLongLong(); + if (hideValues && !limit) + break; + opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; + QItemDelegate::drawDisplay(painter, opt, opt.rect, limit > 0 ? Utils::Misc::friendlyUnit(limit, true) : QString::fromUtf8(C_INFINITY)); break; - case TransferListModel::TR_TIME_ELAPSED: { - const int elapsedTime = index.data().toInt(); - const int seedingTime = index.data(Qt::UserRole).toInt(); - const QString txt = (seedingTime > 0) - ? tr("%1 (seeded for %2)", "e.g. 4m39s (seeded for 3m10s)") - .arg(Utils::Misc::userFriendlyDuration(elapsedTime) - , Utils::Misc::userFriendlyDuration(seedingTime)) - : Utils::Misc::userFriendlyDuration(elapsedTime); - QItemDelegate::drawDisplay(painter, opt, opt.rect, txt); - } + } + case TorrentModel::TR_TIME_ELAPSED: { + qlonglong elapsedTime = index.data().toLongLong(); + qlonglong seedingTime = index.data(Qt::UserRole).toLongLong(); + QString txt; + if (seedingTime > 0) + txt += tr("%1 (seeded for %2)", "e.g. 4m39s (seeded for 3m10s)") + .arg(Utils::Misc::userFriendlyDuration(elapsedTime)) + .arg(Utils::Misc::userFriendlyDuration(seedingTime)); + QItemDelegate::drawDisplay(painter, opt, opt.rect, txt); break; - case TransferListModel::TR_ADD_DATE: - case TransferListModel::TR_SEED_DATE: + } + case TorrentModel::TR_ADD_DATE: + case TorrentModel::TR_SEED_DATE: QItemDelegate::drawDisplay(painter, opt, opt.rect, index.data().toDateTime().toLocalTime().toString(Qt::DefaultLocaleShortDate)); break; - case TransferListModel::TR_RATIO_LIMIT: - case TransferListModel::TR_RATIO: { - const qreal ratio = index.data().toDouble(); - if (hideValues && (ratio <= 0)) - break; - QString str = ((ratio == -1) || (ratio > BitTorrent::TorrentHandle::MAX_RATIO)) ? QString::fromUtf8(C_INFINITY) : Utils::String::fromDouble(ratio, 2); - opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; - QItemDelegate::drawDisplay(painter, opt, opt.rect, str); - } + case TorrentModel::TR_RATIO_LIMIT: + case TorrentModel::TR_RATIO: { + const qreal ratio = index.data().toDouble(); + if (hideValues && (ratio <= 0)) + break; + QString str = ((ratio == -1) || (ratio > BitTorrent::TorrentHandle::MAX_RATIO)) ? QString::fromUtf8(C_INFINITY) : Utils::String::fromDouble(ratio, 2); + opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; + QItemDelegate::drawDisplay(painter, opt, opt.rect, str); break; - case TransferListModel::TR_PRIORITY: { - const int priority = index.data().toInt(); - opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; - if (priority > 0) { - QItemDelegate::paint(painter, opt, index); - } - else { - QItemDelegate::drawDisplay(painter, opt, opt.rect, "*"); - } + } + case TorrentModel::TR_PRIORITY: { + const int priority = index.data().toInt(); + opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; + if (priority > 0) { + QItemDelegate::paint(painter, opt, index); + } + else { + QItemDelegate::drawDisplay(painter, opt, opt.rect, "*"); } break; - case TransferListModel::TR_PROGRESS: { - QStyleOptionProgressBar newopt; - qreal progress = index.data().toDouble() * 100.; - newopt.rect = opt.rect; - newopt.text = ((progress == 100.0) ? QString("100%") : Utils::String::fromDouble(progress, 1) + '%'); - newopt.progress = static_cast(progress); - newopt.maximum = 100; - newopt.minimum = 0; - newopt.state |= QStyle::State_Enabled; - newopt.textVisible = true; + } + case TorrentModel::TR_PROGRESS: { + QStyleOptionProgressBar newopt; + qreal progress = index.data().toDouble() * 100.; + newopt.rect = opt.rect; + newopt.text = ((progress == 100.0) ? QString("100%") : Utils::String::fromDouble(progress, 1) + "%"); + newopt.progress = (int)progress; + newopt.maximum = 100; + newopt.minimum = 0; + newopt.state |= QStyle::State_Enabled; + newopt.textVisible = true; #ifndef Q_OS_WIN - QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, painter); + QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, painter); #else - // XXX: To avoid having the progress text on the right of the bar - QProxyStyle st("fusion"); - st.drawControl(QStyle::CE_ProgressBar, &newopt, painter, 0); + // XXX: To avoid having the progress text on the right of the bar +#ifndef QBT_USES_QT5 + QPlastiqueStyle st; +#else + QProxyStyle st("fusion"); +#endif + st.drawControl(QStyle::CE_ProgressBar, &newopt, painter, 0); #endif - } break; - case TransferListModel::TR_LAST_ACTIVITY: { - qlonglong elapsed = index.data().toLongLong(); - if (hideValues && ((elapsed < 0) || (elapsed >= MAX_ETA))) - break; + } + case TorrentModel::TR_LAST_ACTIVITY: { + qlonglong elapsed = index.data().toLongLong(); + if (hideValues && ((elapsed < 0) || (elapsed >= MAX_ETA))) + break; + QString elapsedString; + if (elapsed == 0) // Show '< 1m ago' when elapsed time is 0 - if (elapsed == 0) - elapsed = 1; - - QString elapsedString = (elapsed >= 0) - ? tr("%1 ago", "e.g.: 1h 20m ago").arg(Utils::Misc::userFriendlyDuration(elapsed)) - : Utils::Misc::userFriendlyDuration(elapsed); - - opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; - QItemDelegate::drawDisplay(painter, opt, option.rect, elapsedString); - } + elapsed = 1; + else if (elapsed < 0) + elapsedString = Utils::Misc::userFriendlyDuration(elapsed); + else + elapsedString = tr("%1 ago", "e.g.: 1h 20m ago").arg(Utils::Misc::userFriendlyDuration(elapsed)); + opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter; + QItemDelegate::drawDisplay(painter, opt, option.rect, elapsedString); break; + } default: QItemDelegate::paint(painter, option, index); } painter->restore(); } -QWidget *TransferListDelegate::createEditor(QWidget *, const QStyleOptionViewItem &, const QModelIndex &) const +QWidget* TransferListDelegate::createEditor(QWidget*, const QStyleOptionViewItem &, const QModelIndex &) const { // No editor here - return nullptr; + return 0; } -QSize TransferListDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const +QSize TransferListDelegate::sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const { // Reimplementing sizeHint() because the 'name' column contains text+icon. // When that WHOLE column goes out of view(eg user scrolls horizontally) @@ -213,7 +222,7 @@ static int nameColHeight = -1; if (nameColHeight == -1) { - QModelIndex nameColumn = index.sibling(index.row(), TransferListModel::TR_NAME); + QModelIndex nameColumn = index.sibling(index.row(), TorrentModel::TR_NAME); nameColHeight = QItemDelegate::sizeHint(option, nameColumn).height(); } @@ -222,7 +231,7 @@ return size; } -QString TransferListDelegate::getStatusString(const BitTorrent::TorrentState state) const +QString TransferListDelegate::getStatusString(const int state) const { QString str; @@ -257,11 +266,9 @@ case BitTorrent::TorrentState::CheckingUploading: str = tr("Checking", "Torrent local data is being checked"); break; -#if LIBTORRENT_VERSION_NUM < 10100 case BitTorrent::TorrentState::QueuedForChecking: str = tr("Queued for checking", "i.e. torrent is queued for hash checking"); break; -#endif case BitTorrent::TorrentState::CheckingResumeData: str = tr("Checking resume data", "used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents."); break; @@ -271,9 +278,6 @@ case BitTorrent::TorrentState::PausedUploading: str = tr("Completed"); break; - case BitTorrent::TorrentState::Moving: - str = tr("Moving", "Torrent local data are being moved/relocated"); - break; case BitTorrent::TorrentState::MissingFiles: str = tr("Missing Files"); break; diff -Nru qbittorrent-4.1.3/src/gui/transferlistdelegate.h qbittorrent-3.3.15/src/gui/transferlistdelegate.h --- qbittorrent-4.1.3/src/gui/transferlistdelegate.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/transferlistdelegate.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef TRANSFERLISTDELEGATE_H @@ -31,28 +33,26 @@ #include -class QModelIndex; +QT_BEGIN_NAMESPACE class QPainter; class QStyleOptionViewItem; +class QModelIndex; +QT_END_NAMESPACE -namespace BitTorrent -{ - enum class TorrentState; -} // Defines for download list list columns -class TransferListDelegate : public QItemDelegate +class TransferListDelegate: public QItemDelegate { Q_OBJECT public: TransferListDelegate(QObject *parent); - void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; - QWidget *createEditor(QWidget *, const QStyleOptionViewItem &, const QModelIndex &) const override; - QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; + void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const; + QWidget* createEditor(QWidget*, const QStyleOptionViewItem &, const QModelIndex &) const; + QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const; private: - QString getStatusString(const BitTorrent::TorrentState state) const; + QString getStatusString(const int state) const; }; #endif // TRANSFERLISTDELEGATE_H diff -Nru qbittorrent-4.1.3/src/gui/transferlistfilterswidget.cpp qbittorrent-3.3.15/src/gui/transferlistfilterswidget.cpp --- qbittorrent-4.1.3/src/gui/transferlistfilterswidget.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/transferlistfilterswidget.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #include "transferlistfilterswidget.h" @@ -33,44 +35,29 @@ #include #include #include +#include #include -#include #include #include "base/bittorrent/session.h" #include "base/bittorrent/torrenthandle.h" #include "base/bittorrent/trackerentry.h" #include "base/logger.h" -#include "base/net/downloadhandler.h" #include "base/net/downloadmanager.h" +#include "base/net/downloadhandler.h" #include "base/preferences.h" #include "base/torrentfilter.h" #include "base/utils/fs.h" +#include "base/utils/misc.h" #include "base/utils/string.h" #include "autoexpandabledialog.h" #include "categoryfilterwidget.h" #include "guiiconprovider.h" -#include "tagfilterwidget.h" +#include "torrentmodel.h" #include "transferlistdelegate.h" -#include "transferlistmodel.h" #include "transferlistwidget.h" -#include "utils.h" - -namespace -{ - QString getScheme(const QString &tracker) - { - const QUrl url {tracker}; - QString scheme = url.scheme(); - if (scheme.isEmpty()) - scheme = "http"; - return scheme; - } - - const QLatin1String GOOGLE_FAVICON_URL("https://www.google.com/s2/favicons?domain="); -} -BaseFilterWidget::BaseFilterWidget(QWidget *parent, TransferListWidget *transferList) +FiltersBase::FiltersBase(QWidget *parent, TransferListWidget *transferList) : QListWidget(parent) , transferList(transferList) { @@ -81,40 +68,38 @@ setUniformItemSizes(true); setSpacing(0); - setIconSize(Utils::Gui::smallIconSize()); + setIconSize(Utils::Misc::smallIconSize()); #if defined(Q_OS_MAC) setAttribute(Qt::WA_MacShowFocusRect, false); #endif setContextMenuPolicy(Qt::CustomContextMenu); - connect(this, &BaseFilterWidget::customContextMenuRequested, this, &BaseFilterWidget::showMenu); - connect(this, &BaseFilterWidget::currentRowChanged, this, &BaseFilterWidget::applyFilter); + connect(this, SIGNAL(customContextMenuRequested(QPoint)), SLOT(showMenu(QPoint))); + connect(this, SIGNAL(currentRowChanged(int)), SLOT(applyFilter(int))); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::torrentAdded - , this, &BaseFilterWidget::handleNewTorrent); - connect(BitTorrent::Session::instance(), &BitTorrent::Session::torrentAboutToBeRemoved - , this, &BaseFilterWidget::torrentAboutToBeDeleted); + connect(BitTorrent::Session::instance(), SIGNAL(torrentAdded(BitTorrent::TorrentHandle *const)), SLOT(handleNewTorrent(BitTorrent::TorrentHandle *const))); + connect(BitTorrent::Session::instance(), SIGNAL(torrentAboutToBeRemoved(BitTorrent::TorrentHandle *const)), SLOT(torrentAboutToBeDeleted(BitTorrent::TorrentHandle *const))); } -QSize BaseFilterWidget::sizeHint() const +QSize FiltersBase::sizeHint() const { - return { - // Width should be exactly the width of the content - sizeHintForColumn(0), - // Height should be exactly the height of the content - static_cast((sizeHintForRow(0) + 2 * spacing()) * (count() + 0.5)), - }; + QSize size; + // Height should be exactly the height of the content + size.setHeight(((sizeHintForRow(0) + 2 * spacing()) * (count() + 0.5))); + // Width should be exactly the width of the content + size.setWidth(sizeHintForColumn(0)); + return size; } -QSize BaseFilterWidget::minimumSizeHint() const +QSize FiltersBase::minimumSizeHint() const { QSize size = sizeHint(); size.setWidth(6); return size; } -void BaseFilterWidget::toggleFilter(bool checked) +void FiltersBase::toggleFilter(bool checked) { setVisible(checked); if (checked) @@ -123,52 +108,51 @@ applyFilter(0); } -StatusFilterWidget::StatusFilterWidget(QWidget *parent, TransferListWidget *transferList) - : BaseFilterWidget(parent, transferList) +StatusFiltersWidget::StatusFiltersWidget(QWidget *parent, TransferListWidget *transferList) + : FiltersBase(parent, transferList) { - connect(BitTorrent::Session::instance(), &BitTorrent::Session::torrentsUpdated - , this, &StatusFilterWidget::updateTorrentNumbers); + connect(BitTorrent::Session::instance(), SIGNAL(torrentsUpdated()), SLOT(updateTorrentNumbers())); // Add status filters QListWidgetItem *all = new QListWidgetItem(this); all->setData(Qt::DisplayRole, QVariant(tr("All (0)", "this is for the status filter"))); - all->setData(Qt::DecorationRole, QIcon(":/icons/skin/filterall.svg")); + all->setData(Qt::DecorationRole, QIcon(":/icons/skin/filterall.png")); QListWidgetItem *downloading = new QListWidgetItem(this); downloading->setData(Qt::DisplayRole, QVariant(tr("Downloading (0)"))); - downloading->setData(Qt::DecorationRole, QIcon(":/icons/skin/downloading.svg")); + downloading->setData(Qt::DecorationRole, QIcon(":/icons/skin/downloading.png")); QListWidgetItem *seeding = new QListWidgetItem(this); seeding->setData(Qt::DisplayRole, QVariant(tr("Seeding (0)"))); - seeding->setData(Qt::DecorationRole, QIcon(":/icons/skin/uploading.svg")); + seeding->setData(Qt::DecorationRole, QIcon(":/icons/skin/uploading.png")); QListWidgetItem *completed = new QListWidgetItem(this); completed->setData(Qt::DisplayRole, QVariant(tr("Completed (0)"))); - completed->setData(Qt::DecorationRole, QIcon(":/icons/skin/completed.svg")); + completed->setData(Qt::DecorationRole, QIcon(":/icons/skin/completed.png")); QListWidgetItem *resumed = new QListWidgetItem(this); resumed->setData(Qt::DisplayRole, QVariant(tr("Resumed (0)"))); - resumed->setData(Qt::DecorationRole, QIcon(":/icons/skin/resumed.svg")); + resumed->setData(Qt::DecorationRole, QIcon(":/icons/skin/resumed.png")); QListWidgetItem *paused = new QListWidgetItem(this); paused->setData(Qt::DisplayRole, QVariant(tr("Paused (0)"))); - paused->setData(Qt::DecorationRole, QIcon(":/icons/skin/paused.svg")); + paused->setData(Qt::DecorationRole, QIcon(":/icons/skin/paused.png")); QListWidgetItem *active = new QListWidgetItem(this); active->setData(Qt::DisplayRole, QVariant(tr("Active (0)"))); - active->setData(Qt::DecorationRole, QIcon(":/icons/skin/filteractive.svg")); + active->setData(Qt::DecorationRole, QIcon(":/icons/skin/filteractive.png")); QListWidgetItem *inactive = new QListWidgetItem(this); inactive->setData(Qt::DisplayRole, QVariant(tr("Inactive (0)"))); - inactive->setData(Qt::DecorationRole, QIcon(":/icons/skin/filterinactive.svg")); + inactive->setData(Qt::DecorationRole, QIcon(":/icons/skin/filterinactive.png")); QListWidgetItem *errored = new QListWidgetItem(this); errored->setData(Qt::DisplayRole, QVariant(tr("Errored (0)"))); - errored->setData(Qt::DecorationRole, QIcon(":/icons/skin/error.svg")); + errored->setData(Qt::DecorationRole, QIcon(":/icons/skin/error.png")); - const Preferences *const pref = Preferences::instance(); + const Preferences* const pref = Preferences::instance(); setCurrentRow(pref->getTransSelFilter(), QItemSelectionModel::SelectCurrent); toggleFilter(pref->getStatusFilterState()); } -StatusFilterWidget::~StatusFilterWidget() +StatusFiltersWidget::~StatusFiltersWidget() { Preferences::instance()->setTransSelFilter(currentRow()); } -void StatusFilterWidget::updateTorrentNumbers() +void StatusFiltersWidget::updateTorrentNumbers() { auto report = BitTorrent::Session::instance()->torrentStatusReport(); @@ -183,19 +167,19 @@ item(TorrentFilter::Errored)->setData(Qt::DisplayRole, QVariant(tr("Errored (%1)").arg(report.nbErrored))); } -void StatusFilterWidget::showMenu(QPoint) {} +void StatusFiltersWidget::showMenu(QPoint) {} -void StatusFilterWidget::applyFilter(int row) +void StatusFiltersWidget::applyFilter(int row) { transferList->applyStatusFilter(row); } -void StatusFilterWidget::handleNewTorrent(BitTorrent::TorrentHandle *const) {} +void StatusFiltersWidget::handleNewTorrent(BitTorrent::TorrentHandle *const) {} -void StatusFilterWidget::torrentAboutToBeDeleted(BitTorrent::TorrentHandle *const) {} +void StatusFiltersWidget::torrentAboutToBeDeleted(BitTorrent::TorrentHandle *const) {} TrackerFiltersList::TrackerFiltersList(QWidget *parent, TransferListWidget *transferList) - : BaseFilterWidget(parent, transferList) + : FiltersBase(parent, transferList) , m_totalTorrents(0) , m_downloadTrackerFavicon(true) { @@ -226,7 +210,7 @@ void TrackerFiltersList::addItem(const QString &tracker, const QString &hash) { QStringList tmp; - QListWidgetItem *trackerItem = nullptr; + QListWidgetItem *trackerItem = 0; QString host = getHost(tracker); bool exists = m_trackers.contains(host); @@ -246,8 +230,7 @@ trackerItem = new QListWidgetItem(); trackerItem->setData(Qt::DecorationRole, GuiIconProvider::instance()->getIcon("network-server")); - const QString scheme = getScheme(tracker); - downloadFavicon(QString("%1://%2/favicon.ico").arg((scheme.startsWith("http") ? scheme : "http"), host)); + downloadFavicon(QString("http://%1/favicon.ico").arg(host)); } if (!trackerItem) return; @@ -270,7 +253,7 @@ Q_ASSERT(count() >= 4); int insPos = count(); for (int i = 4; i < count(); ++i) { - if (Utils::String::naturalLessThan(host, item(i)->text())) { + if (Utils::String::naturalCompareCaseSensitive(host, item(i)->text())) { insPos = i; break; } @@ -331,13 +314,9 @@ m_downloadTrackerFavicon = value; if (m_downloadTrackerFavicon) { - for (auto i = m_trackers.cbegin(); i != m_trackers.cend(); ++i) { - const QString &tracker = i.key(); - if (!tracker.isEmpty()) { - const QString scheme = getScheme(tracker); - downloadFavicon(QString("%1://%2/favicon.ico") - .arg((scheme.startsWith("http") ? scheme : "http"), getHost(tracker))); - } + foreach (const QString &tracker, m_trackers.keys()) { + if (!tracker.isEmpty()) + downloadFavicon(QString("http://%1/favicon.ico").arg(tracker)); } } } @@ -407,21 +386,14 @@ void TrackerFiltersList::downloadFavicon(const QString& url) { if (!m_downloadTrackerFavicon) return; - Net::DownloadHandler *h = Net::DownloadManager::instance()->download( - Net::DownloadRequest(url).saveToFile(true)); - using Func = void (Net::DownloadHandler::*)(const QString &, const QString &); - connect(h, static_cast(&Net::DownloadHandler::downloadFinished), this - , &TrackerFiltersList::handleFavicoDownload); - connect(h, static_cast(&Net::DownloadHandler::downloadFailed), this - , &TrackerFiltersList::handleFavicoFailure); + Net::DownloadHandler *h = Net::DownloadManager::instance()->downloadUrl(url, true); + connect(h, SIGNAL(downloadFinished(QString, QString)), this, SLOT(handleFavicoDownload(QString, QString))); + connect(h, SIGNAL(downloadFailed(QString, QString)), this, SLOT(handleFavicoFailure(QString, QString))); } void TrackerFiltersList::handleFavicoDownload(const QString& url, const QString& filePath) { - QString host = url.startsWith(GOOGLE_FAVICON_URL) - ? url.mid(GOOGLE_FAVICON_URL.size()) - : getHost(url); - + QString host = getHost(url); if (!m_trackers.contains(host)) { Utils::Fs::forceRemove(filePath); return; @@ -445,15 +417,11 @@ } } -void TrackerFiltersList::handleFavicoFailure(const QString &url, const QString &error) +void TrackerFiltersList::handleFavicoFailure(const QString& url, const QString& error) { Q_UNUSED(error) - if (url.endsWith(".ico", Qt::CaseInsensitive)) { + if (url.endsWith(".ico", Qt::CaseInsensitive)) downloadFavicon(url.left(url.size() - 4) + ".png"); - } - else if (!url.startsWith(GOOGLE_FAVICON_URL)) { - downloadFavicon(GOOGLE_FAVICON_URL + getHost(url)); - } } void TrackerFiltersList::showMenu(QPoint) @@ -462,7 +430,7 @@ QAction *startAct = menu.addAction(GuiIconProvider::instance()->getIcon("media-playback-start"), tr("Resume torrents")); QAction *pauseAct = menu.addAction(GuiIconProvider::instance()->getIcon("media-playback-pause"), tr("Pause torrents")); QAction *deleteTorrentsAct = menu.addAction(GuiIconProvider::instance()->getIcon("edit-delete"), tr("Delete torrents")); - QAction *act = nullptr; + QAction *act = 0; act = menu.exec(QCursor::pos()); if (!act) @@ -515,11 +483,11 @@ QString TrackerFiltersList::trackerFromRow(int row) const { Q_ASSERT(row > 1); - const QString tracker = item(row)->text(); - QStringList parts = tracker.split(' '); + const QString &tracker = item(row)->text(); + QStringList parts = tracker.split(" "); Q_ASSERT(parts.size() >= 2); parts.removeLast(); // Remove trailing number - return parts.join(' '); + return parts.join(" "); } int TrackerFiltersList::rowFromTracker(const QString &tracker) const @@ -561,8 +529,9 @@ TransferListFiltersWidget::TransferListFiltersWidget(QWidget *parent, TransferListWidget *transferList) : QFrame(parent) , m_transferList(transferList) + , m_trackerFilters(0) { - Preferences *const pref = Preferences::instance(); + Preferences* const pref = Preferences::instance(); // Construct lists QVBoxLayout *vLayout = new QVBoxLayout(this); @@ -588,51 +557,32 @@ vLayout->addWidget(scroll); setLayout(vLayout); - QCheckBox *statusLabel = new QCheckBox(tr("Status"), this); + QCheckBox * statusLabel = new QCheckBox(tr("Status"), this); statusLabel->setChecked(pref->getStatusFilterState()); statusLabel->setFont(font); frameLayout->addWidget(statusLabel); - StatusFilterWidget *statusFilters = new StatusFilterWidget(this, transferList); + StatusFiltersWidget *statusFilters = new StatusFiltersWidget(this, transferList); frameLayout->addWidget(statusFilters); QCheckBox *categoryLabel = new QCheckBox(tr("Categories"), this); categoryLabel->setChecked(pref->getCategoryFilterState()); categoryLabel->setFont(font); - connect(categoryLabel, &QCheckBox::toggled, this - , &TransferListFiltersWidget::onCategoryFilterStateChanged); + connect(categoryLabel, SIGNAL(toggled(bool)), SLOT(onCategoryFilterStateChanged(bool))); frameLayout->addWidget(categoryLabel); m_categoryFilterWidget = new CategoryFilterWidget(this); - connect(m_categoryFilterWidget, &CategoryFilterWidget::actionDeleteTorrentsTriggered - , transferList, &TransferListWidget::deleteVisibleTorrents); - connect(m_categoryFilterWidget, &CategoryFilterWidget::actionPauseTorrentsTriggered - , transferList, &TransferListWidget::pauseVisibleTorrents); - connect(m_categoryFilterWidget, &CategoryFilterWidget::actionResumeTorrentsTriggered - , transferList, &TransferListWidget::startVisibleTorrents); - connect(m_categoryFilterWidget, &CategoryFilterWidget::categoryChanged - , transferList, &TransferListWidget::applyCategoryFilter); + connect(m_categoryFilterWidget, SIGNAL(actionDeleteTorrentsTriggered()) + , transferList, SLOT(deleteVisibleTorrents())); + connect(m_categoryFilterWidget, SIGNAL(actionPauseTorrentsTriggered()) + , transferList, SLOT(pauseVisibleTorrents())); + connect(m_categoryFilterWidget, SIGNAL(actionResumeTorrentsTriggered()) + , transferList, SLOT(startVisibleTorrents())); + connect(m_categoryFilterWidget, SIGNAL(categoryChanged(QString)) + , transferList, SLOT(applyCategoryFilter(QString))); toggleCategoryFilter(pref->getCategoryFilterState()); frameLayout->addWidget(m_categoryFilterWidget); - QCheckBox *tagsLabel = new QCheckBox(tr("Tags"), this); - tagsLabel->setChecked(pref->getTagFilterState()); - tagsLabel->setFont(font); - connect(tagsLabel, &QCheckBox::toggled, this, &TransferListFiltersWidget::onTagFilterStateChanged); - frameLayout->addWidget(tagsLabel); - - m_tagFilterWidget = new TagFilterWidget(this); - connect(m_tagFilterWidget, &TagFilterWidget::actionDeleteTorrentsTriggered - , transferList, &TransferListWidget::deleteVisibleTorrents); - connect(m_tagFilterWidget, &TagFilterWidget::actionPauseTorrentsTriggered - , transferList, &TransferListWidget::pauseVisibleTorrents); - connect(m_tagFilterWidget, &TagFilterWidget::actionResumeTorrentsTriggered - , transferList, &TransferListWidget::startVisibleTorrents); - connect(m_tagFilterWidget, &TagFilterWidget::tagChanged - , transferList, &TransferListWidget::applyTagFilter); - toggleTagFilter(pref->getTagFilterState()); - frameLayout->addWidget(m_tagFilterWidget); - QCheckBox *trackerLabel = new QCheckBox(tr("Trackers"), this); trackerLabel->setChecked(pref->getTrackerFilterState()); trackerLabel->setFont(font); @@ -641,18 +591,13 @@ m_trackerFilters = new TrackerFiltersList(this, transferList); frameLayout->addWidget(m_trackerFilters); - connect(statusLabel, &QCheckBox::toggled, statusFilters, &StatusFilterWidget::toggleFilter); - connect(statusLabel, &QCheckBox::toggled, pref, &Preferences::setStatusFilterState); - connect(trackerLabel, &QCheckBox::toggled, m_trackerFilters, &TrackerFiltersList::toggleFilter); - connect(trackerLabel, &QCheckBox::toggled, pref, &Preferences::setTrackerFilterState); - - using Func = void (TransferListFiltersWidget::*)(const QString&, const QString&); - connect(this, static_cast(&TransferListFiltersWidget::trackerSuccess) - , m_trackerFilters, &TrackerFiltersList::trackerSuccess); - connect(this, static_cast(&TransferListFiltersWidget::trackerError) - , m_trackerFilters, &TrackerFiltersList::trackerError); - connect(this, static_cast(&TransferListFiltersWidget::trackerWarning) - , m_trackerFilters, &TrackerFiltersList::trackerWarning); + connect(statusLabel, SIGNAL(toggled(bool)), statusFilters, SLOT(toggleFilter(bool))); + connect(statusLabel, SIGNAL(toggled(bool)), pref, SLOT(setStatusFilterState(const bool))); + connect(trackerLabel, SIGNAL(toggled(bool)), m_trackerFilters, SLOT(toggleFilter(bool))); + connect(trackerLabel, SIGNAL(toggled(bool)), pref, SLOT(setTrackerFilterState(const bool))); + connect(this, SIGNAL(trackerSuccess(const QString &, const QString &)), m_trackerFilters, SLOT(trackerSuccess(const QString &, const QString &))); + connect(this, SIGNAL(trackerError(const QString &, const QString &)), m_trackerFilters, SLOT(trackerError(const QString &, const QString &))); + connect(this, SIGNAL(trackerWarning(const QString &, const QString &)), m_trackerFilters, SLOT(trackerWarning(const QString &, const QString &))); } void TransferListFiltersWidget::setDownloadTrackerFavicon(bool value) @@ -703,15 +648,3 @@ m_categoryFilterWidget->setVisible(enabled); m_transferList->applyCategoryFilter(enabled ? m_categoryFilterWidget->currentCategory() : QString()); } - -void TransferListFiltersWidget::onTagFilterStateChanged(bool enabled) -{ - toggleTagFilter(enabled); - Preferences::instance()->setTagFilterState(enabled); -} - -void TransferListFiltersWidget::toggleTagFilter(bool enabled) -{ - m_tagFilterWidget->setVisible(enabled); - m_transferList->applyTagFilter(enabled ? m_tagFilterWidget->currentTag() : QString()); -} diff -Nru qbittorrent-4.1.3/src/gui/transferlistfilterswidget.h qbittorrent-3.3.15/src/gui/transferlistfilterswidget.h --- qbittorrent-4.1.3/src/gui/transferlistfilterswidget.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/transferlistfilterswidget.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,16 +24,21 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef TRANSFERLISTFILTERSWIDGET_H #define TRANSFERLISTFILTERSWIDGET_H -#include #include +#include -class QCheckBox; +QT_BEGIN_NAMESPACE class QResizeEvent; +class QCheckBox; +QT_END_NAMESPACE + class TransferListWidget; namespace BitTorrent @@ -42,15 +47,15 @@ class TrackerEntry; } -class BaseFilterWidget : public QListWidget +class FiltersBase: public QListWidget { Q_OBJECT public: - BaseFilterWidget(QWidget *parent, TransferListWidget *transferList); + FiltersBase(QWidget *parent, TransferListWidget *transferList); - QSize sizeHint() const override; - QSize minimumSizeHint() const override; + virtual QSize sizeHint() const; + virtual QSize minimumSizeHint() const; public slots: void toggleFilter(bool checked); @@ -65,13 +70,13 @@ virtual void torrentAboutToBeDeleted(BitTorrent::TorrentHandle *const) = 0; }; -class StatusFilterWidget : public BaseFilterWidget +class StatusFiltersWidget: public FiltersBase { Q_OBJECT public: - StatusFilterWidget(QWidget *parent, TransferListWidget *transferList); - ~StatusFilterWidget() override; + StatusFiltersWidget(QWidget *parent, TransferListWidget *transferList); + ~StatusFiltersWidget(); private slots: void updateTorrentNumbers(); @@ -79,19 +84,19 @@ private: // These 4 methods are virtual slots in the base class. // No need to redeclare them here as slots. - void showMenu(QPoint) override; - void applyFilter(int row) override; - void handleNewTorrent(BitTorrent::TorrentHandle *const) override; - void torrentAboutToBeDeleted(BitTorrent::TorrentHandle *const) override; + virtual void showMenu(QPoint); + virtual void applyFilter(int row); + virtual void handleNewTorrent(BitTorrent::TorrentHandle *const); + virtual void torrentAboutToBeDeleted(BitTorrent::TorrentHandle *const); }; -class TrackerFiltersList : public BaseFilterWidget +class TrackerFiltersList: public FiltersBase { Q_OBJECT public: TrackerFiltersList(QWidget *parent, TransferListWidget *transferList); - ~TrackerFiltersList() override; + ~TrackerFiltersList(); // Redefine addItem() to make sure the list stays sorted void addItem(const QString &tracker, const QString &hash); @@ -106,21 +111,22 @@ private slots: void handleFavicoDownload(const QString &url, const QString &filePath); - void handleFavicoFailure(const QString &url, const QString &error); + void handleFavicoFailure(const QString &url, const QString &reason); private: // These 4 methods are virtual slots in the base class. // No need to redeclare them here as slots. - void showMenu(QPoint) override; - void applyFilter(int row) override; - void handleNewTorrent(BitTorrent::TorrentHandle *const torrent) override; - void torrentAboutToBeDeleted(BitTorrent::TorrentHandle *const torrent) override; + virtual void showMenu(QPoint); + virtual void applyFilter(int row); + virtual void handleNewTorrent(BitTorrent::TorrentHandle *const torrent); + virtual void torrentAboutToBeDeleted(BitTorrent::TorrentHandle *const torrent); QString trackerFromRow(int row) const; int rowFromTracker(const QString &tracker) const; QString getHost(const QString &tracker) const; QStringList getHashes(int row); void downloadFavicon(const QString &url); +private: QHash m_trackers; QHash m_errors; QHash m_warnings; @@ -130,9 +136,8 @@ }; class CategoryFilterWidget; -class TagFilterWidget; -class TransferListFiltersWidget : public QFrame +class TransferListFiltersWidget: public QFrame { Q_OBJECT @@ -155,16 +160,13 @@ private slots: void onCategoryFilterStateChanged(bool enabled); - void onTagFilterStateChanged(bool enabled); private: void toggleCategoryFilter(bool enabled); - void toggleTagFilter(bool enabled); TransferListWidget *m_transferList; TrackerFiltersList *m_trackerFilters; CategoryFilterWidget *m_categoryFilterWidget; - TagFilterWidget *m_tagFilterWidget; }; #endif // TRANSFERLISTFILTERSWIDGET_H diff -Nru qbittorrent-4.1.3/src/gui/transferlistmodel.cpp qbittorrent-3.3.15/src/gui/transferlistmodel.cpp --- qbittorrent-4.1.3/src/gui/transferlistmodel.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/transferlistmodel.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,478 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015 Vladimir Golovnev - * Copyright (C) 2010 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "transferlistmodel.h" - -#include -#include -#include -#include - -#include "base/bittorrent/session.h" -#include "base/bittorrent/torrenthandle.h" -#include "base/torrentfilter.h" -#include "base/utils/fs.h" - -static QIcon getIconByState(BitTorrent::TorrentState state); -static QColor getColorByState(BitTorrent::TorrentState state); - -static QIcon getPausedIcon(); -static QIcon getQueuedIcon(); -static QIcon getDownloadingIcon(); -static QIcon getStalledDownloadingIcon(); -static QIcon getUploadingIcon(); -static QIcon getStalledUploadingIcon(); -static QIcon getCompletedIcon(); -static QIcon getCheckingIcon(); -static QIcon getErrorIcon(); - -static bool isDarkTheme(); - -// TransferListModel - -TransferListModel::TransferListModel(QObject *parent) - : QAbstractListModel(parent) -{ - // Load the torrents - using namespace BitTorrent; - foreach (TorrentHandle *const torrent, Session::instance()->torrents()) - addTorrent(torrent); - - // Listen for torrent changes - connect(Session::instance(), &Session::torrentAdded, this, &TransferListModel::addTorrent); - connect(Session::instance(), &Session::torrentAboutToBeRemoved, this, &TransferListModel::handleTorrentAboutToBeRemoved); - connect(Session::instance(), &Session::torrentsUpdated, this, &TransferListModel::handleTorrentsUpdated); - - connect(Session::instance(), &Session::torrentFinished, this, &TransferListModel::handleTorrentStatusUpdated); - connect(Session::instance(), &Session::torrentMetadataLoaded, this, &TransferListModel::handleTorrentStatusUpdated); - connect(Session::instance(), &Session::torrentResumed, this, &TransferListModel::handleTorrentStatusUpdated); - connect(Session::instance(), &Session::torrentPaused, this, &TransferListModel::handleTorrentStatusUpdated); - connect(Session::instance(), &Session::torrentFinishedChecking, this, &TransferListModel::handleTorrentStatusUpdated); -} - -int TransferListModel::rowCount(const QModelIndex &index) const -{ - Q_UNUSED(index); - return m_torrents.size(); -} - -int TransferListModel::columnCount(const QModelIndex &parent) const -{ - Q_UNUSED(parent); - return NB_COLUMNS; -} - -QVariant TransferListModel::headerData(int section, Qt::Orientation orientation, int role) const -{ - if (orientation == Qt::Horizontal) { - if (role == Qt::DisplayRole) { - switch (section) { - case TR_PRIORITY: return QChar('#'); - case TR_NAME: return tr("Name", "i.e: torrent name"); - case TR_SIZE: return tr("Size", "i.e: torrent size"); - case TR_PROGRESS: return tr("Done", "% Done"); - case TR_STATUS: return tr("Status", "Torrent status (e.g. downloading, seeding, paused)"); - case TR_SEEDS: return tr("Seeds", "i.e. full sources (often untranslated)"); - case TR_PEERS: return tr("Peers", "i.e. partial sources (often untranslated)"); - case TR_DLSPEED: return tr("Down Speed", "i.e: Download speed"); - case TR_UPSPEED: return tr("Up Speed", "i.e: Upload speed"); - case TR_RATIO: return tr("Ratio", "Share ratio"); - case TR_ETA: return tr("ETA", "i.e: Estimated Time of Arrival / Time left"); - case TR_CATEGORY: return tr("Category"); - case TR_TAGS: return tr("Tags"); - case TR_ADD_DATE: return tr("Added On", "Torrent was added to transfer list on 01/01/2010 08:00"); - case TR_SEED_DATE: return tr("Completed On", "Torrent was completed on 01/01/2010 08:00"); - case TR_TRACKER: return tr("Tracker"); - case TR_DLLIMIT: return tr("Down Limit", "i.e: Download limit"); - case TR_UPLIMIT: return tr("Up Limit", "i.e: Upload limit"); - case TR_AMOUNT_DOWNLOADED: return tr("Downloaded", "Amount of data downloaded (e.g. in MB)"); - case TR_AMOUNT_UPLOADED: return tr("Uploaded", "Amount of data uploaded (e.g. in MB)"); - case TR_AMOUNT_DOWNLOADED_SESSION: return tr("Session Download", "Amount of data downloaded since program open (e.g. in MB)"); - case TR_AMOUNT_UPLOADED_SESSION: return tr("Session Upload", "Amount of data uploaded since program open (e.g. in MB)"); - case TR_AMOUNT_LEFT: return tr("Remaining", "Amount of data left to download (e.g. in MB)"); - case TR_TIME_ELAPSED: return tr("Time Active", "Time (duration) the torrent is active (not paused)"); - case TR_SAVE_PATH: return tr("Save path", "Torrent save path"); - case TR_COMPLETED: return tr("Completed", "Amount of data completed (e.g. in MB)"); - case TR_RATIO_LIMIT: return tr("Ratio Limit", "Upload share ratio limit"); - case TR_SEEN_COMPLETE_DATE: return tr("Last Seen Complete", "Indicates the time when the torrent was last seen complete/whole"); - case TR_LAST_ACTIVITY: return tr("Last Activity", "Time passed since a chunk was downloaded/uploaded"); - case TR_TOTAL_SIZE: return tr("Total Size", "i.e. Size including unwanted data"); - default: - return QVariant(); - } - } - else if (role == Qt::TextAlignmentRole) { - switch (section) { - case TR_AMOUNT_DOWNLOADED: - case TR_AMOUNT_UPLOADED: - case TR_AMOUNT_DOWNLOADED_SESSION: - case TR_AMOUNT_UPLOADED_SESSION: - case TR_AMOUNT_LEFT: - case TR_COMPLETED: - case TR_SIZE: - case TR_TOTAL_SIZE: - case TR_ETA: - case TR_SEEDS: - case TR_PEERS: - case TR_UPSPEED: - case TR_DLSPEED: - case TR_UPLIMIT: - case TR_DLLIMIT: - case TR_RATIO_LIMIT: - case TR_RATIO: - case TR_PRIORITY: - case TR_LAST_ACTIVITY: - return QVariant(Qt::AlignRight | Qt::AlignVCenter); - default: - return QAbstractListModel::headerData(section, orientation, role); - } - } - } - - return QVariant(); -} - -QVariant TransferListModel::data(const QModelIndex &index, int role) const -{ - if (!index.isValid()) return QVariant(); - - BitTorrent::TorrentHandle *const torrent = m_torrents.value(index.row()); - if (!torrent) return QVariant(); - - if ((role == Qt::DecorationRole) && (index.column() == TR_NAME)) - return getIconByState(torrent->state()); - - if (role == Qt::ForegroundRole) - return getColorByState(torrent->state()); - - if ((role != Qt::DisplayRole) && (role != Qt::UserRole)) - return QVariant(); - - switch (index.column()) { - case TR_NAME: - return torrent->name(); - case TR_PRIORITY: - return torrent->queuePosition(); - case TR_SIZE: - return torrent->wantedSize(); - case TR_PROGRESS: - return torrent->progress(); - case TR_STATUS: - return QVariant::fromValue(torrent->state()); - case TR_SEEDS: - return (role == Qt::DisplayRole) ? torrent->seedsCount() : torrent->totalSeedsCount(); - case TR_PEERS: - return (role == Qt::DisplayRole) ? torrent->leechsCount() : torrent->totalLeechersCount(); - case TR_DLSPEED: - return torrent->downloadPayloadRate(); - case TR_UPSPEED: - return torrent->uploadPayloadRate(); - case TR_ETA: - return torrent->eta(); - case TR_RATIO: - return torrent->realRatio(); - case TR_CATEGORY: - return torrent->category(); - case TR_TAGS: { - QStringList tagsList = torrent->tags().toList(); - tagsList.sort(); - return tagsList.join(", "); - } - case TR_ADD_DATE: - return torrent->addedTime(); - case TR_SEED_DATE: - return torrent->completedTime(); - case TR_TRACKER: - return torrent->currentTracker(); - case TR_DLLIMIT: - return torrent->downloadLimit(); - case TR_UPLIMIT: - return torrent->uploadLimit(); - case TR_AMOUNT_DOWNLOADED: - return torrent->totalDownload(); - case TR_AMOUNT_UPLOADED: - return torrent->totalUpload(); - case TR_AMOUNT_DOWNLOADED_SESSION: - return torrent->totalPayloadDownload(); - case TR_AMOUNT_UPLOADED_SESSION: - return torrent->totalPayloadUpload(); - case TR_AMOUNT_LEFT: - return torrent->incompletedSize(); - case TR_TIME_ELAPSED: - return (role == Qt::DisplayRole) ? torrent->activeTime() : torrent->seedingTime(); - case TR_SAVE_PATH: - return Utils::Fs::toNativePath(torrent->savePath()); - case TR_COMPLETED: - return torrent->completedSize(); - case TR_RATIO_LIMIT: - return torrent->maxRatio(); - case TR_SEEN_COMPLETE_DATE: - return torrent->lastSeenComplete(); - case TR_LAST_ACTIVITY: - if (torrent->isPaused() || torrent->isChecking()) - return -1; - return torrent->timeSinceActivity(); - case TR_TOTAL_SIZE: - return torrent->totalSize(); - } - - return QVariant(); -} - -bool TransferListModel::setData(const QModelIndex &index, const QVariant &value, int role) -{ - qDebug() << Q_FUNC_INFO << value; - if (!index.isValid() || (role != Qt::DisplayRole)) return false; - - qDebug("Index is valid and role is DisplayRole"); - BitTorrent::TorrentHandle *const torrent = m_torrents.value(index.row()); - if (!torrent) return false; - - // Category, seed date and Name columns can be edited - switch (index.column()) { - case TR_NAME: - torrent->setName(value.toString()); - break; - case TR_CATEGORY: - torrent->setCategory(value.toString()); - break; - default: - return false; - } - - return true; -} - -void TransferListModel::addTorrent(BitTorrent::TorrentHandle *const torrent) -{ - if (m_torrents.indexOf(torrent) == -1) { - const int row = m_torrents.size(); - beginInsertRows(QModelIndex(), row, row); - m_torrents << torrent; - endInsertRows(); - } -} - -Qt::ItemFlags TransferListModel::flags(const QModelIndex &index) const -{ - if (!index.isValid()) return Qt::NoItemFlags; - - // Explicitly mark as editable - return QAbstractListModel::flags(index) | Qt::ItemIsEditable; -} - -BitTorrent::TorrentHandle *TransferListModel::torrentHandle(const QModelIndex &index) const -{ - if (!index.isValid()) return nullptr; - - return m_torrents.value(index.row()); -} - -void TransferListModel::handleTorrentAboutToBeRemoved(BitTorrent::TorrentHandle *const torrent) -{ - const int row = m_torrents.indexOf(torrent); - if (row >= 0) { - beginRemoveRows(QModelIndex(), row, row); - m_torrents.removeAt(row); - endRemoveRows(); - } -} - -void TransferListModel::handleTorrentStatusUpdated(BitTorrent::TorrentHandle *const torrent) -{ - const int row = m_torrents.indexOf(torrent); - if (row >= 0) - emit dataChanged(index(row, 0), index(row, columnCount() - 1)); -} - -void TransferListModel::handleTorrentsUpdated() -{ - emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1)); -} - -// Static functions - -QIcon getIconByState(BitTorrent::TorrentState state) -{ - switch (state) { - case BitTorrent::TorrentState::Downloading: - case BitTorrent::TorrentState::ForcedDownloading: - case BitTorrent::TorrentState::DownloadingMetadata: - return getDownloadingIcon(); - case BitTorrent::TorrentState::Allocating: - case BitTorrent::TorrentState::StalledDownloading: - return getStalledDownloadingIcon(); - case BitTorrent::TorrentState::StalledUploading: - return getStalledUploadingIcon(); - case BitTorrent::TorrentState::Uploading: - case BitTorrent::TorrentState::ForcedUploading: - return getUploadingIcon(); - case BitTorrent::TorrentState::PausedDownloading: - return getPausedIcon(); - case BitTorrent::TorrentState::PausedUploading: - return getCompletedIcon(); - case BitTorrent::TorrentState::QueuedDownloading: - case BitTorrent::TorrentState::QueuedUploading: - return getQueuedIcon(); - case BitTorrent::TorrentState::CheckingDownloading: - case BitTorrent::TorrentState::CheckingUploading: -#if LIBTORRENT_VERSION_NUM < 10100 - case BitTorrent::TorrentState::QueuedForChecking: -#endif - case BitTorrent::TorrentState::CheckingResumeData: - case BitTorrent::TorrentState::Moving: - return getCheckingIcon(); - case BitTorrent::TorrentState::Unknown: - case BitTorrent::TorrentState::MissingFiles: - case BitTorrent::TorrentState::Error: - return getErrorIcon(); - default: - Q_ASSERT(false); - return getErrorIcon(); - } -} - -QColor getColorByState(BitTorrent::TorrentState state) -{ - // Color names taken from http://cloford.com/resources/colours/500col.htm - bool dark = isDarkTheme(); - - switch (state) { - case BitTorrent::TorrentState::Downloading: - case BitTorrent::TorrentState::ForcedDownloading: - case BitTorrent::TorrentState::DownloadingMetadata: - if (!dark) - return QColor(34, 139, 34); // Forest Green - else - return QColor(50, 205, 50); // Lime Green - case BitTorrent::TorrentState::Allocating: - case BitTorrent::TorrentState::StalledDownloading: - case BitTorrent::TorrentState::StalledUploading: - if (!dark) - return QColor(0, 0, 0); // Black - else - return QColor(204, 204, 204); // Gray 80 - case BitTorrent::TorrentState::Uploading: - case BitTorrent::TorrentState::ForcedUploading: - if (!dark) - return QColor(65, 105, 225); // Royal Blue - else - return QColor(99, 184, 255); // Steel Blue 1 - case BitTorrent::TorrentState::PausedDownloading: - return QColor(250, 128, 114); // Salmon - case BitTorrent::TorrentState::PausedUploading: - if (!dark) - return QColor(0, 0, 139); // Dark Blue - else - return QColor(79, 148, 205); // Steel Blue 3 - case BitTorrent::TorrentState::Error: - case BitTorrent::TorrentState::MissingFiles: - return QColor(255, 0, 0); // red - case BitTorrent::TorrentState::QueuedDownloading: - case BitTorrent::TorrentState::QueuedUploading: - case BitTorrent::TorrentState::CheckingDownloading: - case BitTorrent::TorrentState::CheckingUploading: -#if LIBTORRENT_VERSION_NUM < 10100 - case BitTorrent::TorrentState::QueuedForChecking: -#endif - case BitTorrent::TorrentState::CheckingResumeData: - case BitTorrent::TorrentState::Moving: - if (!dark) - return QColor(0, 128, 128); // Teal - else - return QColor(0, 205, 205); // Cyan 3 - case BitTorrent::TorrentState::Unknown: - return QColor(255, 0, 0); // red - default: - Q_ASSERT(false); - return QColor(255, 0, 0); // red - } -} - -QIcon getPausedIcon() -{ - static QIcon cached = QIcon(":/icons/skin/paused.svg"); - return cached; -} - -QIcon getQueuedIcon() -{ - static QIcon cached = QIcon(":/icons/skin/queued.svg"); - return cached; -} - -QIcon getDownloadingIcon() -{ - static QIcon cached = QIcon(":/icons/skin/downloading.svg"); - return cached; -} - -QIcon getStalledDownloadingIcon() -{ - static QIcon cached = QIcon(":/icons/skin/stalledDL.svg"); - return cached; -} - -QIcon getUploadingIcon() -{ - static QIcon cached = QIcon(":/icons/skin/uploading.svg"); - return cached; -} - -QIcon getStalledUploadingIcon() -{ - static QIcon cached = QIcon(":/icons/skin/stalledUP.svg"); - return cached; -} - -QIcon getCompletedIcon() -{ - static QIcon cached = QIcon(":/icons/skin/completed.svg"); - return cached; -} - -QIcon getCheckingIcon() -{ - static QIcon cached = QIcon(":/icons/skin/checking.svg"); - return cached; -} - -QIcon getErrorIcon() -{ - static QIcon cached = QIcon(":/icons/skin/error.svg"); - return cached; -} - -bool isDarkTheme() -{ - QPalette pal = QApplication::palette(); - // QPalette::Base is used for the background of the Treeview - QColor color = pal.color(QPalette::Active, QPalette::Base); - return (color.lightness() < 127); -} diff -Nru qbittorrent-4.1.3/src/gui/transferlistmodel.h qbittorrent-3.3.15/src/gui/transferlistmodel.h --- qbittorrent-4.1.3/src/gui/transferlistmodel.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/transferlistmodel.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,105 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2015 Vladimir Golovnev - * Copyright (C) 2010 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef TRANSFERLISTMODEL_H -#define TRANSFERLISTMODEL_H - -#include -#include - -namespace BitTorrent -{ - class InfoHash; - class TorrentHandle; -} - -class TransferListModel : public QAbstractListModel -{ - Q_OBJECT - Q_DISABLE_COPY(TransferListModel) - -public: - enum Column - { - TR_PRIORITY, - TR_NAME, - TR_SIZE, - TR_TOTAL_SIZE, - TR_PROGRESS, - TR_STATUS, - TR_SEEDS, - TR_PEERS, - TR_DLSPEED, - TR_UPSPEED, - TR_ETA, - TR_RATIO, - TR_CATEGORY, - TR_TAGS, - TR_ADD_DATE, - TR_SEED_DATE, - TR_TRACKER, - TR_DLLIMIT, - TR_UPLIMIT, - TR_AMOUNT_DOWNLOADED, - TR_AMOUNT_UPLOADED, - TR_AMOUNT_DOWNLOADED_SESSION, - TR_AMOUNT_UPLOADED_SESSION, - TR_AMOUNT_LEFT, - TR_TIME_ELAPSED, - TR_SAVE_PATH, - TR_COMPLETED, - TR_RATIO_LIMIT, - TR_SEEN_COMPLETE_DATE, - TR_LAST_ACTIVITY, - - NB_COLUMNS - }; - - explicit TransferListModel(QObject *parent = nullptr); - - int rowCount(const QModelIndex& index = QModelIndex()) const override; - int columnCount(const QModelIndex &parent=QModelIndex()) const override; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; - bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::DisplayRole) override; - QVariant headerData(int section, Qt::Orientation orientation, int role) const override; - Qt::ItemFlags flags(const QModelIndex &index) const override; - - BitTorrent::TorrentHandle *torrentHandle(const QModelIndex &index) const; - -private slots: - void addTorrent(BitTorrent::TorrentHandle *const torrent); - void handleTorrentAboutToBeRemoved(BitTorrent::TorrentHandle *const torrent); - void handleTorrentStatusUpdated(BitTorrent::TorrentHandle *const torrent); - void handleTorrentsUpdated(); - -private: - QList m_torrents; -}; - -#endif // TRANSFERLISTMODEL_H diff -Nru qbittorrent-4.1.3/src/gui/transferlistsortmodel.cpp qbittorrent-3.3.15/src/gui/transferlistsortmodel.cpp --- qbittorrent-4.1.3/src/gui/transferlistsortmodel.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/transferlistsortmodel.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2013 Nick Tiskov + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2013 Nick Tiskov * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,17 +24,17 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : daymansmail@gmail.com */ -#include "transferlistsortmodel.h" - #include -#include "base/bittorrent/torrenthandle.h" #include "base/types.h" #include "base/utils/string.h" -#include "transferlistmodel.h" - +#include "base/bittorrent/torrenthandle.h" +#include "torrentmodel.h" +#include "transferlistsortmodel.h" TransferListSortModel::TransferListSortModel(QObject *parent) : QSortFilterProxyModel(parent) @@ -59,18 +59,6 @@ invalidateFilter(); } -void TransferListSortModel::setTagFilter(const QString &tag) -{ - if (m_filter.setTag(tag)) - invalidateFilter(); -} - -void TransferListSortModel::disableTagFilter() -{ - if (m_filter.setTag(TorrentFilter::AnyTag)) - invalidateFilter(); -} - void TransferListSortModel::setTrackerFilter(const QStringList &hashes) { if (m_filter.setHashSet(hashes.toSet())) @@ -86,138 +74,119 @@ bool TransferListSortModel::lessThan(const QModelIndex &left, const QModelIndex &right) const { switch (sortColumn()) { - case TransferListModel::TR_CATEGORY: - case TransferListModel::TR_TAGS: - case TransferListModel::TR_NAME: { - const QVariant vL = left.data(); - const QVariant vR = right.data(); - if (!vL.isValid() || !vR.isValid() || (vL == vR)) - return lowerPositionThan(left, right); - - const int result = Utils::String::naturalCompare(vL.toString(), vR.toString(), Qt::CaseInsensitive); - return (result < 0); - } - - case TransferListModel::TR_STATUS: { - // QSortFilterProxyModel::lessThan() uses the < operator only for specific QVariant types - // so our custom type is outside that list. - // In this case QSortFilterProxyModel::lessThan() converts other types to QString and - // sorts them. - // Thus we can't use the code in the default label. - const BitTorrent::TorrentState leftValue = left.data().value(); - const BitTorrent::TorrentState rightValue = right.data().value(); - if (leftValue != rightValue) - return leftValue < rightValue; - + case TorrentModel::TR_CATEGORY: + case TorrentModel::TR_NAME: { + QVariant vL = left.data(); + QVariant vR = right.data(); + if (!vL.isValid() || !vR.isValid() || (vL == vR)) return lowerPositionThan(left, right); - } - case TransferListModel::TR_ADD_DATE: - case TransferListModel::TR_SEED_DATE: - case TransferListModel::TR_SEEN_COMPLETE_DATE: { + return Utils::String::naturalCompareCaseInsensitive(vL.toString(), vR.toString()); + } + + case TorrentModel::TR_ADD_DATE: + case TorrentModel::TR_SEED_DATE: + case TorrentModel::TR_SEEN_COMPLETE_DATE: { return dateLessThan(sortColumn(), left, right, true); - } + } - case TransferListModel::TR_PRIORITY: { + case TorrentModel::TR_PRIORITY: { return lowerPositionThan(left, right); - } - - case TransferListModel::TR_SEEDS: - case TransferListModel::TR_PEERS: { - const int leftActive = left.data().toInt(); - const int leftTotal = left.data(Qt::UserRole).toInt(); - const int rightActive = right.data().toInt(); - const int rightTotal = right.data(Qt::UserRole).toInt(); - - // Active peers/seeds take precedence over total peers/seeds. - if (leftActive != rightActive) - return (leftActive < rightActive); - - if (leftTotal != rightTotal) - return (leftTotal < rightTotal); + } - return lowerPositionThan(left, right); + case TorrentModel::TR_SEEDS: + case TorrentModel::TR_PEERS: { + int left_active = left.data().toInt(); + int left_total = left.data(Qt::UserRole).toInt(); + int right_active = right.data().toInt(); + int right_total = right.data(Qt::UserRole).toInt(); + + // Active peers/seeds take precedence over total peers/seeds. + if (left_active == right_active) { + if (left_total == right_total) + return lowerPositionThan(left, right); + return (left_total < right_total); } + else { + return (left_active < right_active); + } + } - case TransferListModel::TR_ETA: { - const TransferListModel *model = qobject_cast(sourceModel()); - - // Sorting rules prioritized. - // 1. Active torrents at the top - // 2. Seeding torrents at the bottom - // 3. Torrents with invalid ETAs at the bottom - - const bool isActiveL = TorrentFilter::ActiveTorrent.match(model->torrentHandle(model->index(left.row()))); - const bool isActiveR = TorrentFilter::ActiveTorrent.match(model->torrentHandle(model->index(right.row()))); - if (isActiveL != isActiveR) - return isActiveL; - - const int prioL = model->data(model->index(left.row(), TransferListModel::TR_PRIORITY)).toInt(); - const int prioR = model->data(model->index(right.row(), TransferListModel::TR_PRIORITY)).toInt(); - const bool isSeedingL = (prioL < 0); - const bool isSeedingR = (prioR < 0); - if (isSeedingL != isSeedingR) { - const bool isAscendingOrder = (sortOrder() == Qt::AscendingOrder); - if (isSeedingL) - return !isAscendingOrder; - else - return isAscendingOrder; - } - - const qlonglong etaL = left.data().toLongLong(); - const qlonglong etaR = right.data().toLongLong(); - const bool isInvalidL = ((etaL < 0) || (etaL >= MAX_ETA)); - const bool isInvalidR = ((etaR < 0) || (etaR >= MAX_ETA)); - if (isInvalidL && isInvalidR) { - if (isSeedingL) // Both seeding - return dateLessThan(TransferListModel::TR_SEED_DATE, left, right, true); - else - return (prioL < prioR); - } - else if (!isInvalidL && !isInvalidR) { - return (etaL < etaR); - } - else { - return !isInvalidL; - } + case TorrentModel::TR_ETA: { + TorrentModel *model = qobject_cast(sourceModel()); + const int prioL = model->data(model->index(left.row(), TorrentModel::TR_PRIORITY)).toInt(); + const int prioR = model->data(model->index(right.row(), TorrentModel::TR_PRIORITY)).toInt(); + const qlonglong etaL = left.data().toLongLong(); + const qlonglong etaR = right.data().toLongLong(); + const bool ascend = (sortOrder() == Qt::AscendingOrder); + const bool invalidL = (etaL < 0 || etaL >= MAX_ETA); + const bool invalidR = (etaR < 0 || etaR >= MAX_ETA); + const bool seedingL = (prioL < 0); + const bool seedingR = (prioR < 0); + + bool activeR = TorrentFilter::ActiveTorrent.match(model->torrentHandle(model->index(right.row()))); + bool activeL = TorrentFilter::ActiveTorrent.match(model->torrentHandle(model->index(left.row()))); + + // Sorting rules prioritized. + // 1. Active torrents at the top + // 2. Seeding torrents at the bottom + // 3. Torrents with invalid ETAs at the bottom + + if (activeL != activeR) return activeL; + if (seedingL != seedingR) { + if (seedingL) return !ascend; + else return ascend; + } + + if (invalidL && invalidR) { + if (seedingL) // Both seeding + return dateLessThan(TorrentModel::TR_SEED_DATE, left, right, true); + else + return prioL < prioR; + } + else if (!invalidL && !invalidR) { + return etaL < etaR; } + else { + return !invalidL; + } + } - case TransferListModel::TR_LAST_ACTIVITY: { - const int vL = left.data().toInt(); - const int vR = right.data().toInt(); + case TorrentModel::TR_LAST_ACTIVITY: { + const qlonglong vL = left.data().toLongLong(); + const qlonglong vR = right.data().toLongLong(); - if (vL < 0) return false; - if (vR < 0) return true; + if (vL == -1) return false; + if (vR == -1) return true; - return (vL < vR); - } + return vL < vR; + } - case TransferListModel::TR_RATIO_LIMIT: { - const qreal vL = left.data().toReal(); - const qreal vR = right.data().toReal(); + case TorrentModel::TR_RATIO_LIMIT: { + const qreal vL = left.data().toDouble(); + const qreal vR = right.data().toDouble(); - if (vL < 0) return false; - if (vR < 0) return true; + if (vL == -1) return false; + if (vR == -1) return true; - return (vL < vR); - } + return vL < vR; + } default: { - if (left.data() != right.data()) - return QSortFilterProxyModel::lessThan(left, right); - - return lowerPositionThan(left, right); - } + if (left.data() == right.data()) + return lowerPositionThan(left, right); + return QSortFilterProxyModel::lessThan(left, right); + } } } bool TransferListSortModel::lowerPositionThan(const QModelIndex &left, const QModelIndex &right) const { - const TransferListModel *model = qobject_cast(sourceModel()); + const TorrentModel *model = qobject_cast(sourceModel()); // Sort according to TR_PRIORITY - const int queueL = model->data(model->index(left.row(), TransferListModel::TR_PRIORITY)).toInt(); - const int queueR = model->data(model->index(right.row(), TransferListModel::TR_PRIORITY)).toInt(); + const int queueL = model->data(model->index(left.row(), TorrentModel::TR_PRIORITY)).toInt(); + const int queueR = model->data(model->index(right.row(), TorrentModel::TR_PRIORITY)).toInt(); if ((queueL > 0) || (queueR > 0)) { if ((queueL > 0) && (queueR > 0)) return queueL < queueR; @@ -226,7 +195,7 @@ } // Sort according to TR_SEED_DATE - return dateLessThan(TransferListModel::TR_SEED_DATE, left, right, false); + return dateLessThan(TorrentModel::TR_SEED_DATE, left, right, false); } // Every time we compare QDateTimes we need a fallback comparison in case both @@ -234,7 +203,7 @@ // (detailed discussion in #2526 and #2158). bool TransferListSortModel::dateLessThan(const int dateColumn, const QModelIndex &left, const QModelIndex &right, bool sortInvalidInBottom) const { - const TransferListModel *model = qobject_cast(sourceModel()); + const TorrentModel *model = qobject_cast(sourceModel()); const QDateTime dateL = model->data(model->index(left.row(), dateColumn)).toDateTime(); const QDateTime dateR = model->data(model->index(right.row(), dateColumn)).toDateTime(); if (dateL.isValid() && dateR.isValid()) { @@ -262,7 +231,7 @@ bool TransferListSortModel::matchFilter(int sourceRow, const QModelIndex &sourceParent) const { - TransferListModel *model = qobject_cast(sourceModel()); + TorrentModel *model = qobject_cast(sourceModel()); if (!model) return false; BitTorrent::TorrentHandle *const torrent = model->torrentHandle(model->index(sourceRow, 0, sourceParent)); diff -Nru qbittorrent-4.1.3/src/gui/transferlistsortmodel.h qbittorrent-3.3.15/src/gui/transferlistsortmodel.h --- qbittorrent-4.1.3/src/gui/transferlistsortmodel.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/transferlistsortmodel.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2013 Nick Tiskov + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2013 Nick Tiskov * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -24,6 +24,8 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : daymansmail@gmail.com */ #ifndef TRANSFERLISTSORTMODEL_H @@ -34,26 +36,24 @@ class QStringList; -class TransferListSortModel : public QSortFilterProxyModel +class TransferListSortModel: public QSortFilterProxyModel { Q_OBJECT public: - TransferListSortModel(QObject *parent = nullptr); + TransferListSortModel(QObject *parent = 0); void setStatusFilter(TorrentFilter::Type filter); void setCategoryFilter(const QString &category); void disableCategoryFilter(); - void setTagFilter(const QString &tag); - void disableTagFilter(); void setTrackerFilter(const QStringList &hashes); void disableTrackerFilter(); private: - bool lessThan(const QModelIndex &left, const QModelIndex &right) const override; + bool lessThan(const QModelIndex &left, const QModelIndex &right) const; bool lowerPositionThan(const QModelIndex &left, const QModelIndex &right) const; bool dateLessThan(const int dateColumn, const QModelIndex &left, const QModelIndex &right, bool sortInvalidInBottom) const; - bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; + bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const; bool matchFilter(int sourceRow, const QModelIndex &sourceParent) const; private: diff -Nru qbittorrent-4.1.3/src/gui/transferlistwidget.cpp qbittorrent-3.3.15/src/gui/transferlistwidget.cpp --- qbittorrent-4.1.3/src/gui/transferlistwidget.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/transferlistwidget.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,205 +24,74 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ -#include "transferlistwidget.h" - -#include #include -#include +#include +#include +#include +#include +#include +#include +#include #include -#include #include -#include -#include -#include -#include +#include +#include #include -#include +#ifdef QBT_USES_QT5 +#include +#endif +#include "transferlistwidget.h" #include "base/bittorrent/session.h" #include "base/bittorrent/torrenthandle.h" #include "base/logger.h" -#include "base/preferences.h" #include "base/torrentfilter.h" +#include "transferlistdelegate.h" +#include "previewselect.h" +#include "speedlimitdlg.h" +#include "updownratiodlg.h" +#include "optionsdlg.h" +#include "mainwindow.h" +#include "base/preferences.h" +#include "torrentmodel.h" +#include "deletionconfirmationdlg.h" +#include "propertieswidget.h" +#include "guiiconprovider.h" #include "base/utils/fs.h" #include "base/utils/string.h" #include "autoexpandabledialog.h" -#include "deletionconfirmationdialog.h" -#include "guiiconprovider.h" -#include "mainwindow.h" -#include "optionsdialog.h" -#include "previewselectdialog.h" -#include "speedlimitdialog.h" -#include "torrentcategorydialog.h" -#include "transferlistdelegate.h" -#include "transferlistmodel.h" #include "transferlistsortmodel.h" -#include "updownratiodialog.h" - -#ifdef Q_OS_MAC -#include "macutilities.h" -#endif -namespace -{ - using ToggleFn = std::function; +static QStringList extractHashes(const QList &torrents); - QStringList extractHashes(const QList &torrents) - { - QStringList hashes; - foreach (BitTorrent::TorrentHandle *const torrent, torrents) - hashes << torrent->hash(); - - return hashes; - } - - // Helper for setting style parameters when painting check box primitives. - class CheckBoxIconHelper : public QCheckBox - { - public: - explicit CheckBoxIconHelper(QWidget *parent); - QSize sizeHint() const override; - void initStyleOption(QStyleOptionButton *opt) const; - - protected: - void paintEvent(QPaintEvent *) override {} - }; - - CheckBoxIconHelper::CheckBoxIconHelper(QWidget *parent) - : QCheckBox(parent) - { - setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - } - - QSize CheckBoxIconHelper::sizeHint() const - { - const int dim = QCheckBox::sizeHint().height(); - return QSize(dim, dim); - } - - void CheckBoxIconHelper::initStyleOption(QStyleOptionButton *opt) const - { - QCheckBox::initStyleOption(opt); - } - - // Tristate checkbox styled for use in menus. - class MenuCheckBox : public QWidget - { - public: - MenuCheckBox(const QString &text, const ToggleFn &onToggle, Qt::CheckState initialState); - QSize sizeHint() const override; - - protected: - void paintEvent(QPaintEvent *e) override; - void mousePressEvent(QMouseEvent *) override; - - private: - CheckBoxIconHelper *const m_checkBox; - const QString m_text; - QSize m_sizeHint; - QSize m_checkBoxOffset; - }; - - MenuCheckBox::MenuCheckBox(const QString &text, const ToggleFn &onToggle, Qt::CheckState initialState) - : m_checkBox(new CheckBoxIconHelper(this)) - , m_text(text) - , m_sizeHint(QCheckBox(m_text).sizeHint()) - { - m_checkBox->setCheckState(initialState); - connect(m_checkBox, &QCheckBox::stateChanged, this, [this, onToggle](int newState) - { - m_checkBox->setTristate(false); - onToggle(static_cast(newState)); - }); - setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - setMouseTracking(true); - - // We attempt to mimic the amount of vertical whitespace padding around a QCheckBox. - QSize layoutPadding(3, 0); - const int sizeHintMargin = (m_sizeHint.height() - m_checkBox->sizeHint().height()) / 2; - if (sizeHintMargin > 0) { - m_checkBoxOffset.setHeight(sizeHintMargin); - } - else { - layoutPadding.setHeight(1); - m_checkBoxOffset.setHeight(1); - } - m_checkBoxOffset.setWidth(layoutPadding.width()); - - QHBoxLayout *layout = new QHBoxLayout(this); - layout->addWidget(m_checkBox); - layout->addStretch(); - layout->setContentsMargins(layoutPadding.width(), layoutPadding.height(), layoutPadding.width(), layoutPadding.height()); - setLayout(layout); - } - - QSize MenuCheckBox::sizeHint() const - { - return m_sizeHint; - } - - void MenuCheckBox::paintEvent(QPaintEvent *e) - { - if (!rect().intersects(e->rect())) - return; - QStylePainter painter(this); - QStyleOptionMenuItem menuOpt; - menuOpt.initFrom(this); - menuOpt.menuItemType = QStyleOptionMenuItem::Normal; - menuOpt.text = m_text; - QStyleOptionButton checkBoxOpt; - m_checkBox->initStyleOption(&checkBoxOpt); - checkBoxOpt.rect.translate(m_checkBoxOffset.width(), m_checkBoxOffset.height()); - if (rect().contains(mapFromGlobal(QCursor::pos()))) { - menuOpt.state |= QStyle::State_Selected; - checkBoxOpt.state |= QStyle::State_MouseOver; - } - painter.drawControl(QStyle::CE_MenuItem, menuOpt); - painter.drawPrimitive(QStyle::PE_IndicatorCheckBox, checkBoxOpt); - } - - void MenuCheckBox::mousePressEvent(QMouseEvent *) - { - m_checkBox->click(); - } - - class CheckBoxMenuItem : public QWidgetAction - { - public: - CheckBoxMenuItem(const QString &text, const ToggleFn &onToggle, Qt::CheckState initialState, QObject *parent) - : QWidgetAction(parent) - { - setDefaultWidget(new MenuCheckBox(text, onToggle, initialState)); - } - }; -} - -TransferListWidget::TransferListWidget(QWidget *parent, MainWindow *mainWindow) +TransferListWidget::TransferListWidget(QWidget *parent, MainWindow *main_window) : QTreeView(parent) - , m_mainWindow(mainWindow) + , main_window(main_window) { setUniformRowHeights(true); // Load settings - bool columnLoaded = loadSettings(); + bool column_loaded = loadSettings(); // Create and apply delegate - m_listDelegate = new TransferListDelegate(this); - setItemDelegate(m_listDelegate); + listDelegate = new TransferListDelegate(this); + setItemDelegate(listDelegate); // Create transfer list model - m_listModel = new TransferListModel(this); + listModel = new TorrentModel(this); - m_sortFilterModel = new TransferListSortModel(); - m_sortFilterModel->setDynamicSortFilter(true); - m_sortFilterModel->setSourceModel(m_listModel); - m_sortFilterModel->setFilterKeyColumn(TransferListModel::TR_NAME); - m_sortFilterModel->setFilterRole(Qt::DisplayRole); - m_sortFilterModel->setSortCaseSensitivity(Qt::CaseInsensitive); + nameFilterModel = new TransferListSortModel(); + nameFilterModel->setDynamicSortFilter(true); + nameFilterModel->setSourceModel(listModel); + nameFilterModel->setFilterKeyColumn(TorrentModel::TR_NAME); + nameFilterModel->setFilterRole(Qt::DisplayRole); + nameFilterModel->setSortCaseSensitivity(Qt::CaseInsensitive); - setModel(m_sortFilterModel); + setModel(nameFilterModel); // Visual settings setRootIsDecorated(false); @@ -238,72 +107,69 @@ header()->setStretchLastSection(false); // Default hidden columns - if (!columnLoaded) { - setColumnHidden(TransferListModel::TR_ADD_DATE, true); - setColumnHidden(TransferListModel::TR_SEED_DATE, true); - setColumnHidden(TransferListModel::TR_UPLIMIT, true); - setColumnHidden(TransferListModel::TR_DLLIMIT, true); - setColumnHidden(TransferListModel::TR_TRACKER, true); - setColumnHidden(TransferListModel::TR_AMOUNT_DOWNLOADED, true); - setColumnHidden(TransferListModel::TR_AMOUNT_UPLOADED, true); - setColumnHidden(TransferListModel::TR_AMOUNT_DOWNLOADED_SESSION, true); - setColumnHidden(TransferListModel::TR_AMOUNT_UPLOADED_SESSION, true); - setColumnHidden(TransferListModel::TR_AMOUNT_LEFT, true); - setColumnHidden(TransferListModel::TR_TIME_ELAPSED, true); - setColumnHidden(TransferListModel::TR_SAVE_PATH, true); - setColumnHidden(TransferListModel::TR_COMPLETED, true); - setColumnHidden(TransferListModel::TR_RATIO_LIMIT, true); - setColumnHidden(TransferListModel::TR_SEEN_COMPLETE_DATE, true); - setColumnHidden(TransferListModel::TR_LAST_ACTIVITY, true); - setColumnHidden(TransferListModel::TR_TOTAL_SIZE, true); + if (!column_loaded) { + setColumnHidden(TorrentModel::TR_ADD_DATE, true); + setColumnHidden(TorrentModel::TR_SEED_DATE, true); + setColumnHidden(TorrentModel::TR_UPLIMIT, true); + setColumnHidden(TorrentModel::TR_DLLIMIT, true); + setColumnHidden(TorrentModel::TR_TRACKER, true); + setColumnHidden(TorrentModel::TR_AMOUNT_DOWNLOADED, true); + setColumnHidden(TorrentModel::TR_AMOUNT_UPLOADED, true); + setColumnHidden(TorrentModel::TR_AMOUNT_DOWNLOADED_SESSION, true); + setColumnHidden(TorrentModel::TR_AMOUNT_UPLOADED_SESSION, true); + setColumnHidden(TorrentModel::TR_AMOUNT_LEFT, true); + setColumnHidden(TorrentModel::TR_TIME_ELAPSED, true); + setColumnHidden(TorrentModel::TR_SAVE_PATH, true); + setColumnHidden(TorrentModel::TR_COMPLETED, true); + setColumnHidden(TorrentModel::TR_RATIO_LIMIT, true); + setColumnHidden(TorrentModel::TR_SEEN_COMPLETE_DATE, true); + setColumnHidden(TorrentModel::TR_LAST_ACTIVITY, true); + setColumnHidden(TorrentModel::TR_TOTAL_SIZE, true); } //Ensure that at least one column is visible at all times bool atLeastOne = false; - for (int i = 0; i < TransferListModel::NB_COLUMNS; ++i) { + for (unsigned int i = 0; isetContextMenuPolicy(Qt::CustomContextMenu); - connect(header(), &QWidget::customContextMenuRequested, this, &TransferListWidget::displayDLHoSMenu); - connect(header(), &QHeaderView::sectionMoved, this, &TransferListWidget::saveSettings); - connect(header(), &QHeaderView::sectionResized, this, &TransferListWidget::saveSettings); - connect(header(), &QHeaderView::sortIndicatorChanged, this, &TransferListWidget::saveSettings); - - m_editHotkey = new QShortcut(Qt::Key_F2, this, nullptr, nullptr, Qt::WidgetShortcut); - connect(m_editHotkey, &QShortcut::activated, this, &TransferListWidget::renameSelectedTorrent); - m_deleteHotkey = new QShortcut(QKeySequence::Delete, this, nullptr, nullptr, Qt::WidgetShortcut); - connect(m_deleteHotkey, &QShortcut::activated, this, &TransferListWidget::softDeleteSelectedTorrents); - m_permDeleteHotkey = new QShortcut(Qt::SHIFT + Qt::Key_Delete, this, nullptr, nullptr, Qt::WidgetShortcut); - connect(m_permDeleteHotkey, &QShortcut::activated, this, &TransferListWidget::permDeleteSelectedTorrents); - m_doubleClickHotkey = new QShortcut(Qt::Key_Return, this, nullptr, nullptr, Qt::WidgetShortcut); - connect(m_doubleClickHotkey, &QShortcut::activated, this, &TransferListWidget::torrentDoubleClicked); - m_recheckHotkey = new QShortcut(Qt::CTRL + Qt::Key_R, this, nullptr, nullptr, Qt::WidgetShortcut); - connect(m_recheckHotkey, &QShortcut::activated, this, &TransferListWidget::recheckSelectedTorrents); + connect(header(), SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(displayDLHoSMenu(const QPoint &))); + connect(header(), SIGNAL(sectionMoved(int, int, int)), this, SLOT(saveSettings())); + connect(header(), SIGNAL(sectionResized(int, int, int)), this, SLOT(saveSettings())); + connect(header(), SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), this, SLOT(saveSettings())); + + editHotkey = new QShortcut(Qt::Key_F2, this, SLOT(renameSelectedTorrent()), 0, Qt::WidgetShortcut); + deleteHotkey = new QShortcut(QKeySequence::Delete, this, SLOT(softDeleteSelectedTorrents()), 0, Qt::WidgetShortcut); + permDeleteHotkey = new QShortcut(Qt::SHIFT + Qt::Key_Delete, this, SLOT(permDeleteSelectedTorrents()), 0, Qt::WidgetShortcut); + doubleClickHotkey = new QShortcut(Qt::Key_Return, this, SLOT(torrentDoubleClicked()), 0, Qt::WidgetShortcut); + recheckHotkey = new QShortcut(Qt::CTRL + Qt::Key_R, this, SLOT(recheckSelectedTorrents()), 0, Qt::WidgetShortcut); +#ifdef QBT_USES_QT5 // This hack fixes reordering of first column with Qt5. // https://github.com/qtproject/qtbase/commit/e0fc088c0c8bc61dbcaf5928b24986cd61a22777 QTableView unused; unused.setVerticalHeader(header()); header()->setParent(this); unused.setVerticalHeader(new QHeaderView(Qt::Horizontal)); +#endif } TransferListWidget::~TransferListWidget() @@ -312,15 +178,17 @@ // Save settings saveSettings(); // Clean up - delete m_sortFilterModel; - delete m_listModel; - delete m_listDelegate; + delete nameFilterModel; + delete listModel; + delete listDelegate; + delete editHotkey; + delete deleteHotkey; qDebug() << Q_FUNC_INFO << "EXIT"; } -TransferListModel *TransferListWidget::getSourceModel() const +TorrentModel* TransferListWidget::getSourceModel() const { - return m_listModel; + return listModel; } void TransferListWidget::previewFile(QString filePath) @@ -331,16 +199,16 @@ inline QModelIndex TransferListWidget::mapToSource(const QModelIndex &index) const { Q_ASSERT(index.isValid()); - if (index.model() == m_sortFilterModel) - return m_sortFilterModel->mapToSource(index); + if (index.model() == nameFilterModel) + return nameFilterModel->mapToSource(index); return index; } inline QModelIndex TransferListWidget::mapFromSource(const QModelIndex &index) const { Q_ASSERT(index.isValid()); - Q_ASSERT(index.model() == m_sortFilterModel); - return m_sortFilterModel->mapFromSource(index); + Q_ASSERT(index.model() == nameFilterModel); + return nameFilterModel->mapFromSource(index); } void TransferListWidget::torrentDoubleClicked() @@ -348,8 +216,8 @@ const QModelIndexList selectedIndexes = selectionModel()->selectedRows(); if ((selectedIndexes.size() != 1) || !selectedIndexes.first().isValid()) return; - const QModelIndex index = m_listModel->index(mapToSource(selectedIndexes.first()).row()); - BitTorrent::TorrentHandle *const torrent = m_listModel->torrentHandle(index); + const QModelIndex index = listModel->index(mapToSource(selectedIndexes.first()).row()); + BitTorrent::TorrentHandle *const torrent = listModel->torrentHandle(index); if (!torrent) return; int action; @@ -358,7 +226,7 @@ else action = Preferences::instance()->getActionOnDblClOnTorrentDl(); - switch (action) { + switch(action) { case TOGGLE_PAUSE: if (torrent->isPaused()) torrent->resume(); @@ -366,14 +234,10 @@ torrent->pause(); break; case OPEN_DEST: -#ifdef Q_OS_MAC - MacUtils::openFiles(QSet{torrent->contentPath(true)}); -#else if (torrent->filesCount() == 1) Utils::Misc::openFolderSelect(torrent->contentPath(true)); else Utils::Misc::openPath(torrent->contentPath(true)); -#endif break; } } @@ -382,7 +246,7 @@ { QList torrents; foreach (const QModelIndex &index, selectionModel()->selectedRows()) - torrents << m_listModel->torrentHandle(mapToSource(index)); + torrents << listModel->torrentHandle(mapToSource(index)); return torrents; } @@ -393,19 +257,16 @@ if (torrents.isEmpty()) return; const QString oldLocation = torrents[0]->savePath(); - qDebug("Old location is %s", qUtf8Printable(oldLocation)); + qDebug("Old location is %s", qPrintable(oldLocation)); const QString newLocation = QFileDialog::getExistingDirectory(this, tr("Choose save path"), oldLocation, QFileDialog::DontConfirmOverwrite | QFileDialog::ShowDirsOnly | QFileDialog::HideNameFilterDetails); if (newLocation.isEmpty() || !QDir(newLocation).exists()) return; - qDebug("New location is %s", qUtf8Printable(newLocation)); + qDebug("New location is %s", qPrintable(newLocation)); // Actually move storage foreach (BitTorrent::TorrentHandle *const torrent, torrents) { - Logger::instance()->addMessage(tr("Set location: moving \"%1\", from \"%2\" to \"%3\"" - , "Set location: moving \"ubuntu_16_04.iso\", from \"/home/dir1\" to \"/home/dir2\"") - .arg(torrent->name(), Utils::Fs::toNativePath(torrent->savePath()) - , Utils::Fs::toNativePath(newLocation))); + Logger::instance()->addMessage(tr("Set location: moving \"%1\", from \"%2\" to \"%3\"", "Set location: moving \"ubuntu_16_04.iso\", from \"/home/dir1\" to \"/home/dir2\"").arg(torrent->name()).arg(torrent->savePath()).arg(newLocation)); torrent->move(Utils::Fs::expandPathAbs(newLocation)); } } @@ -436,8 +297,8 @@ void TransferListWidget::startVisibleTorrents() { - for (int i = 0; i < m_sortFilterModel->rowCount(); ++i) { - BitTorrent::TorrentHandle *const torrent = m_listModel->torrentHandle(mapToSource(m_sortFilterModel->index(i, 0))); + for (int i = 0; i < nameFilterModel->rowCount(); ++i) { + BitTorrent::TorrentHandle *const torrent = listModel->torrentHandle(mapToSource(nameFilterModel->index(i, 0))); if (torrent) torrent->resume(); } @@ -451,8 +312,8 @@ void TransferListWidget::pauseVisibleTorrents() { - for (int i = 0; i < m_sortFilterModel->rowCount(); ++i) { - BitTorrent::TorrentHandle *const torrent = m_listModel->torrentHandle(mapToSource(m_sortFilterModel->index(i, 0))); + for (int i = 0; i < nameFilterModel->rowCount(); ++i) { + BitTorrent::TorrentHandle *const torrent = listModel->torrentHandle(mapToSource(nameFilterModel->index(i, 0))); if (torrent) torrent->pause(); } @@ -470,13 +331,13 @@ void TransferListWidget::deleteSelectedTorrents(bool deleteLocalFiles) { - if (m_mainWindow->currentTabWidget() != this) return; + if (main_window->currentTabWidget() != this) return; const QList torrents = getSelectedTorrents(); if (torrents.empty()) return; if (Preferences::instance()->confirmTorrentDeletion() - && !DeletionConfirmationDialog::askForDeletionConfirmation(this, deleteLocalFiles, torrents.size(), torrents[0]->name())) + && !DeletionConfirmationDlg::askForDeletionConfirmation(deleteLocalFiles, torrents.size(), torrents[0]->name())) return; foreach (BitTorrent::TorrentHandle *const torrent, torrents) BitTorrent::Session::instance()->deleteTorrent(torrent->hash(), deleteLocalFiles); @@ -484,17 +345,16 @@ void TransferListWidget::deleteVisibleTorrents() { - if (m_sortFilterModel->rowCount() <= 0) return; + if (nameFilterModel->rowCount() <= 0) return; QList torrents; - for (int i = 0; i < m_sortFilterModel->rowCount(); ++i) - torrents << m_listModel->torrentHandle(mapToSource(m_sortFilterModel->index(i, 0))); + for (int i = 0; i < nameFilterModel->rowCount(); ++i) + torrents << listModel->torrentHandle(mapToSource(nameFilterModel->index(i, 0))); bool deleteLocalFiles = false; if (Preferences::instance()->confirmTorrentDeletion() - && !DeletionConfirmationDialog::askForDeletionConfirmation(this, deleteLocalFiles, torrents.size(), torrents[0]->name())) + && !DeletionConfirmationDlg::askForDeletionConfirmation(deleteLocalFiles, torrents.size(), torrents[0]->name())) return; - foreach (BitTorrent::TorrentHandle *const torrent, torrents) BitTorrent::Session::instance()->deleteTorrent(torrent->hash(), deleteLocalFiles); } @@ -502,76 +362,58 @@ void TransferListWidget::increasePrioSelectedTorrents() { qDebug() << Q_FUNC_INFO; - if (m_mainWindow->currentTabWidget() == this) + if (main_window->currentTabWidget() == this) BitTorrent::Session::instance()->increaseTorrentsPriority(extractHashes(getSelectedTorrents())); } void TransferListWidget::decreasePrioSelectedTorrents() { qDebug() << Q_FUNC_INFO; - if (m_mainWindow->currentTabWidget() == this) + if (main_window->currentTabWidget() == this) BitTorrent::Session::instance()->decreaseTorrentsPriority(extractHashes(getSelectedTorrents())); } void TransferListWidget::topPrioSelectedTorrents() { - if (m_mainWindow->currentTabWidget() == this) + if (main_window->currentTabWidget() == this) BitTorrent::Session::instance()->topTorrentsPriority(extractHashes(getSelectedTorrents())); } void TransferListWidget::bottomPrioSelectedTorrents() { - if (m_mainWindow->currentTabWidget() == this) + if (main_window->currentTabWidget() == this) BitTorrent::Session::instance()->bottomTorrentsPriority(extractHashes(getSelectedTorrents())); } void TransferListWidget::copySelectedMagnetURIs() const { - QStringList magnetUris; + QStringList magnet_uris; foreach (BitTorrent::TorrentHandle *const torrent, getSelectedTorrents()) - magnetUris << torrent->toMagnetUri(); + magnet_uris << torrent->toMagnetUri(); - qApp->clipboard()->setText(magnetUris.join('\n')); + qApp->clipboard()->setText(magnet_uris.join("\n")); } void TransferListWidget::copySelectedNames() const { - QStringList torrentNames; + QStringList torrent_names; foreach (BitTorrent::TorrentHandle *const torrent, getSelectedTorrents()) - torrentNames << torrent->name(); + torrent_names << torrent->name(); - qApp->clipboard()->setText(torrentNames.join('\n')); -} - -void TransferListWidget::copySelectedHashes() const -{ - QStringList torrentHashes; - foreach (BitTorrent::TorrentHandle *const torrent, getSelectedTorrents()) - torrentHashes << torrent->hash(); - - qApp->clipboard()->setText(torrentHashes.join('\n')); + qApp->clipboard()->setText(torrent_names.join("\n")); } void TransferListWidget::hidePriorityColumn(bool hide) { qDebug("hidePriorityColumn(%d)", hide); - setColumnHidden(TransferListModel::TR_PRIORITY, hide); - if (!hide && !columnWidth(TransferListModel::TR_PRIORITY)) - resizeColumnToContents(TransferListModel::TR_PRIORITY); + setColumnHidden(TorrentModel::TR_PRIORITY, hide); + if (!hide && !columnWidth(TorrentModel::TR_PRIORITY)) + resizeColumnToContents(TorrentModel::TR_PRIORITY); } void TransferListWidget::openSelectedTorrentsFolder() const { QSet pathsList; -#ifdef Q_OS_MAC - // On macOS you expect both the files and folders to be opened in their parent - // folders prehilighted for opening, so we use a custom method. - foreach (BitTorrent::TorrentHandle *const torrent, getSelectedTorrents()) { - QString path = torrent->contentPath(true); - pathsList.insert(path); - } - MacUtils::openFiles(pathsList); -#else foreach (BitTorrent::TorrentHandle *const torrent, getSelectedTorrents()) { QString path = torrent->contentPath(true); if (!pathsList.contains(path)) { @@ -582,14 +424,13 @@ } pathsList.insert(path); } -#endif } void TransferListWidget::previewSelectedTorrents() { foreach (BitTorrent::TorrentHandle *const torrent, getSelectedTorrents()) { if (torrent->hasMetadata()) - new PreviewSelectDialog(this, torrent); + new PreviewSelect(this, torrent); } } @@ -613,12 +454,12 @@ bool ok = false; const long newLimit = SpeedLimitDialog::askSpeedLimit( - this, &ok, tr("Torrent Download Speed Limiting"), oldLimit + &ok, tr("Torrent Download Speed Limiting"), oldLimit , BitTorrent::Session::instance()->globalDownloadSpeedLimit()); if (!ok) return; foreach (BitTorrent::TorrentHandle *const torrent, TorrentsList) { - qDebug("Applying download speed limit of %ld Kb/s to torrent %s", (newLimit / 1024l), qUtf8Printable(torrent->hash())); + qDebug("Applying download speed limit of %ld Kb/s to torrent %s", (long) (newLimit / 1024.), qPrintable(torrent->hash())); torrent->setDownloadLimit(newLimit); } } @@ -638,12 +479,12 @@ bool ok = false; const long newLimit = SpeedLimitDialog::askSpeedLimit( - this, &ok, tr("Torrent Upload Speed Limiting"), oldLimit + &ok, tr("Torrent Upload Speed Limiting"), oldLimit , BitTorrent::Session::instance()->globalUploadSpeedLimit()); if (!ok) return; foreach (BitTorrent::TorrentHandle *const torrent, TorrentsList) { - qDebug("Applying upload speed limit of %ld Kb/s to torrent %s", (newLimit / 1024l), qUtf8Printable(torrent->hash())); + qDebug("Applying upload speed limit of %ld Kb/s to torrent %s", (long) (newLimit / 1024.), qPrintable(torrent->hash())); torrent->setUploadLimit(newLimit); } } @@ -653,29 +494,17 @@ const QList torrents = getSelectedTorrents(); if (torrents.isEmpty()) return; - qreal currentMaxRatio = BitTorrent::Session::instance()->globalMaxRatio(); - if (torrents.count() == 1) - currentMaxRatio = torrents[0]->maxRatio(); - - int currentMaxSeedingTime = BitTorrent::Session::instance()->globalMaxSeedingMinutes(); - if (torrents.count() == 1) - currentMaxSeedingTime = torrents[0]->maxSeedingTime(); - bool useGlobalValue = true; + qreal currentMaxRatio = BitTorrent::Session::instance()->globalMaxRatio();; if (torrents.count() == 1) - useGlobalValue = (torrents[0]->ratioLimit() == BitTorrent::TorrentHandle::USE_GLOBAL_RATIO) - && (torrents[0]->seedingTimeLimit() == BitTorrent::TorrentHandle::USE_GLOBAL_SEEDING_TIME); + currentMaxRatio = torrents[0]->maxRatio(&useGlobalValue); - UpDownRatioDialog dlg(useGlobalValue, currentMaxRatio, BitTorrent::TorrentHandle::MAX_RATIO, - currentMaxSeedingTime, BitTorrent::TorrentHandle::MAX_SEEDING_TIME, this); + UpDownRatioDlg dlg(useGlobalValue, currentMaxRatio, BitTorrent::TorrentHandle::MAX_RATIO, this); if (dlg.exec() != QDialog::Accepted) return; foreach (BitTorrent::TorrentHandle *const torrent, torrents) { qreal ratio = (dlg.useDefault() ? BitTorrent::TorrentHandle::USE_GLOBAL_RATIO : dlg.ratio()); torrent->setRatioLimit(ratio); - - int seedingTime = (dlg.useDefault() ? BitTorrent::TorrentHandle::USE_GLOBAL_SEEDING_TIME : dlg.seedingTime()); - torrent->setSeedingTimeLimit(seedingTime); } } @@ -690,32 +519,26 @@ torrent->forceRecheck(); } -void TransferListWidget::reannounceSelectedTorrents() -{ - foreach (BitTorrent::TorrentHandle *const torrent, getSelectedTorrents()) - torrent->forceReannounce(); -} - // hide/show columns menu void TransferListWidget::displayDLHoSMenu(const QPoint&) { QMenu hideshowColumn(this); hideshowColumn.setTitle(tr("Column visibility")); QList actions; - for (int i = 0; i < m_listModel->columnCount(); ++i) { - if (!BitTorrent::Session::instance()->isQueueingSystemEnabled() && (i == TransferListModel::TR_PRIORITY)) { - actions.append(nullptr); + for (int i = 0; i < listModel->columnCount(); ++i) { + if (!BitTorrent::Session::instance()->isQueueingSystemEnabled() && i == TorrentModel::TR_PRIORITY) { + actions.append(0); continue; } - QAction *myAct = hideshowColumn.addAction(m_listModel->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString()); + QAction *myAct = hideshowColumn.addAction(listModel->headerData(i, Qt::Horizontal, Qt::DisplayRole).toString()); myAct->setCheckable(true); myAct->setChecked(!isColumnHidden(i)); actions.append(myAct); } int visibleCols = 0; - for (int i = 0; i < TransferListModel::NB_COLUMNS; ++i) { + for (unsigned int i = 0; i 1) break; @@ -729,9 +552,10 @@ Q_ASSERT(visibleCols > 0); if (!isColumnHidden(col) && visibleCols == 1) return; + qDebug("Toggling column %d visibility", col); setColumnHidden(col, !isColumnHidden(col)); if (!isColumnHidden(col) && columnWidth(col) <= 5) - resizeColumnToContents(col); + setColumnWidth(col, 100); saveSettings(); } } @@ -764,58 +588,25 @@ void TransferListWidget::askNewCategoryForSelection() { - const QString newCategoryName = TorrentCategoryDialog::createCategory(this); - if (!newCategoryName.isEmpty()) - setSelectionCategory(newCategoryName); -} - -void TransferListWidget::askAddTagsForSelection() -{ - const QStringList tags = askTagsForSelection(tr("Add Tags")); - foreach (const QString &tag, tags) - addSelectionTag(tag); -} - -void TransferListWidget::confirmRemoveAllTagsForSelection() -{ - QMessageBox::StandardButton response = QMessageBox::question( - this, tr("Remove All Tags"), tr("Remove all tags from selected torrents?"), - QMessageBox::Yes | QMessageBox::No); - if (response == QMessageBox::Yes) - clearSelectionTags(); -} - -QStringList TransferListWidget::askTagsForSelection(const QString &dialogTitle) -{ - QStringList tags; - bool invalid = true; - while (invalid) { - bool ok = false; + // Ask for category + bool ok; + bool invalid; + do { invalid = false; - const QString tagsInput = AutoExpandableDialog::getText( - this, dialogTitle, tr("Comma-separated tags:"), QLineEdit::Normal, "", &ok).trimmed(); - if (!ok || tagsInput.isEmpty()) - return QStringList(); - tags = tagsInput.split(',', QString::SkipEmptyParts); - for (QString &tag : tags) { - tag = tag.trimmed(); - if (!BitTorrent::Session::isValidTag(tag)) { - QMessageBox::warning(this, tr("Invalid tag") - , tr("Tag name: '%1' is invalid").arg(tag)); + const QString category = AutoExpandableDialog::getText(this, tr("New Category"), tr("Category:"), QLineEdit::Normal, "", &ok).trimmed(); + if (ok && !category.isEmpty()) { + if (!BitTorrent::Session::isValidCategoryName(category)) { + QMessageBox::warning(this, tr("Invalid category name"), + tr("Category name must not contain '\\'.\n" + "Category name must not start/end with '/'.\n" + "Category name must not contain '//' sequence.")); invalid = true; } + else { + setSelectionCategory(category); + } } - } - return tags; -} - -void TransferListWidget::applyToSelectedTorrents(const std::function &fn) -{ - foreach (const QModelIndex &index, selectionModel()->selectedRows()) { - BitTorrent::TorrentHandle *const torrent = m_listModel->torrentHandle(mapToSource(index)); - Q_ASSERT(torrent); - fn(torrent); - } + } while(invalid); } void TransferListWidget::renameSelectedTorrent() @@ -823,39 +614,24 @@ const QModelIndexList selectedIndexes = selectionModel()->selectedRows(); if ((selectedIndexes.size() != 1) || !selectedIndexes.first().isValid()) return; - const QModelIndex mi = m_listModel->index(mapToSource(selectedIndexes.first()).row(), TransferListModel::TR_NAME); - BitTorrent::TorrentHandle *const torrent = m_listModel->torrentHandle(mi); + const QModelIndex mi = listModel->index(mapToSource(selectedIndexes.first()).row(), TorrentModel::TR_NAME); + BitTorrent::TorrentHandle *const torrent = listModel->torrentHandle(mi); if (!torrent) return; // Ask for a new Name bool ok; QString name = AutoExpandableDialog::getText(this, tr("Rename"), tr("New name:"), QLineEdit::Normal, torrent->name(), &ok); if (ok && !name.isEmpty()) { - name.replace(QRegularExpression("\r?\n|\r"), " "); + name.replace(QRegExp("\r?\n|\r"), " "); // Rename the torrent - m_listModel->setData(mi, name, Qt::DisplayRole); + listModel->setData(mi, name, Qt::DisplayRole); } } void TransferListWidget::setSelectionCategory(QString category) { foreach (const QModelIndex &index, selectionModel()->selectedRows()) - m_listModel->setData(m_listModel->index(mapToSource(index).row(), TransferListModel::TR_CATEGORY), category, Qt::DisplayRole); -} - -void TransferListWidget::addSelectionTag(const QString &tag) -{ - applyToSelectedTorrents([&tag](BitTorrent::TorrentHandle *const torrent) { torrent->addTag(tag); }); -} - -void TransferListWidget::removeSelectionTag(const QString &tag) -{ - applyToSelectedTorrents([&tag](BitTorrent::TorrentHandle *const torrent) { torrent->removeTag(tag); }); -} - -void TransferListWidget::clearSelectionTags() -{ - applyToSelectedTorrents([](BitTorrent::TorrentHandle *const torrent) { torrent->removeAllTags(); }); + listModel->setData(listModel->index(mapToSource(index).row(), TorrentModel::TR_CATEGORY), category, Qt::DisplayRole); } void TransferListWidget::displayListMenu(const QPoint&) @@ -864,82 +640,76 @@ if (selectedIndexes.size() == 0) return; // Create actions - QAction actionStart(GuiIconProvider::instance()->getIcon("media-playback-start"), tr("Resume", "Resume/start the torrent"), nullptr); - connect(&actionStart, &QAction::triggered, this, &TransferListWidget::startSelectedTorrents); - QAction actionPause(GuiIconProvider::instance()->getIcon("media-playback-pause"), tr("Pause", "Pause the torrent"), nullptr); - connect(&actionPause, &QAction::triggered, this, &TransferListWidget::pauseSelectedTorrents); - QAction actionForceStart(GuiIconProvider::instance()->getIcon("media-seek-forward"), tr("Force Resume", "Force Resume/start the torrent"), nullptr); - connect(&actionForceStart, &QAction::triggered, this, &TransferListWidget::forceStartSelectedTorrents); - QAction actionDelete(GuiIconProvider::instance()->getIcon("edit-delete"), tr("Delete", "Delete the torrent"), nullptr); - connect(&actionDelete, &QAction::triggered, this, &TransferListWidget::softDeleteSelectedTorrents); - QAction actionPreviewFile(GuiIconProvider::instance()->getIcon("view-preview"), tr("Preview file..."), nullptr); - connect(&actionPreviewFile, &QAction::triggered, this, &TransferListWidget::previewSelectedTorrents); - QAction actionSetMaxRatio(QIcon(QLatin1String(":/icons/skin/ratio.svg")), tr("Limit share ratio..."), nullptr); - connect(&actionSetMaxRatio, &QAction::triggered, this, &TransferListWidget::setMaxRatioSelectedTorrents); - QAction actionSetUploadLimit(GuiIconProvider::instance()->getIcon("kt-set-max-upload-speed"), tr("Limit upload rate..."), nullptr); - connect(&actionSetUploadLimit, &QAction::triggered, this, &TransferListWidget::setUpLimitSelectedTorrents); - QAction actionSetDownloadLimit(GuiIconProvider::instance()->getIcon("kt-set-max-download-speed"), tr("Limit download rate..."), nullptr); - connect(&actionSetDownloadLimit, &QAction::triggered, this, &TransferListWidget::setDlLimitSelectedTorrents); - QAction actionOpenDestinationFolder(GuiIconProvider::instance()->getIcon("inode-directory"), tr("Open destination folder"), nullptr); - connect(&actionOpenDestinationFolder, &QAction::triggered, this, &TransferListWidget::openSelectedTorrentsFolder); - QAction actionIncreasePriority(GuiIconProvider::instance()->getIcon("go-up"), tr("Move up", "i.e. move up in the queue"), nullptr); - connect(&actionIncreasePriority, &QAction::triggered, this, &TransferListWidget::increasePrioSelectedTorrents); - QAction actionDecreasePriority(GuiIconProvider::instance()->getIcon("go-down"), tr("Move down", "i.e. Move down in the queue"), nullptr); - connect(&actionDecreasePriority, &QAction::triggered, this, &TransferListWidget::decreasePrioSelectedTorrents); - QAction actionTopPriority(GuiIconProvider::instance()->getIcon("go-top"), tr("Move to top", "i.e. Move to top of the queue"), nullptr); - connect(&actionTopPriority, &QAction::triggered, this, &TransferListWidget::topPrioSelectedTorrents); - QAction actionBottomPriority(GuiIconProvider::instance()->getIcon("go-bottom"), tr("Move to bottom", "i.e. Move to bottom of the queue"), nullptr); - connect(&actionBottomPriority, &QAction::triggered, this, &TransferListWidget::bottomPrioSelectedTorrents); - QAction actionSetTorrentPath(GuiIconProvider::instance()->getIcon("inode-directory"), tr("Set location..."), nullptr); - connect(&actionSetTorrentPath, &QAction::triggered, this, &TransferListWidget::setSelectedTorrentsLocation); - QAction actionForceRecheck(GuiIconProvider::instance()->getIcon("document-edit-verify"), tr("Force recheck"), nullptr); - connect(&actionForceRecheck, &QAction::triggered, this, &TransferListWidget::recheckSelectedTorrents); - QAction actionForceReannounce(GuiIconProvider::instance()->getIcon("document-edit-verify"), tr("Force reannounce"), nullptr); - connect(&actionForceReannounce, &QAction::triggered, this, &TransferListWidget::reannounceSelectedTorrents); - QAction actionCopyMagnetLink(GuiIconProvider::instance()->getIcon("kt-magnet"), tr("Copy magnet link"), nullptr); - connect(&actionCopyMagnetLink, &QAction::triggered, this, &TransferListWidget::copySelectedMagnetURIs); - QAction actionCopyName(GuiIconProvider::instance()->getIcon("edit-copy"), tr("Copy name"), nullptr); - connect(&actionCopyName, &QAction::triggered, this, &TransferListWidget::copySelectedNames); - QAction actionCopyHash(GuiIconProvider::instance()->getIcon("edit-copy"), tr("Copy hash"), nullptr); - connect(&actionCopyHash, &QAction::triggered, this, &TransferListWidget::copySelectedHashes); - QAction actionSuperSeedingMode(tr("Super seeding mode"), nullptr); - actionSuperSeedingMode.setCheckable(true); - connect(&actionSuperSeedingMode, &QAction::triggered, this, &TransferListWidget::toggleSelectedTorrentsSuperSeeding); - QAction actionRename(GuiIconProvider::instance()->getIcon("edit-rename"), tr("Rename..."), nullptr); - connect(&actionRename, &QAction::triggered, this, &TransferListWidget::renameSelectedTorrent); - QAction actionSequentialDownload(tr("Download in sequential order"), nullptr); - actionSequentialDownload.setCheckable(true); - connect(&actionSequentialDownload, &QAction::triggered, this, &TransferListWidget::toggleSelectedTorrentsSequentialDownload); - QAction actionFirstLastPiecePrio(tr("Download first and last pieces first"), nullptr); - actionFirstLastPiecePrio.setCheckable(true); - connect(&actionFirstLastPiecePrio, &QAction::triggered, this, &TransferListWidget::toggleSelectedFirstLastPiecePrio); - QAction actionAutoTMM(tr("Automatic Torrent Management"), nullptr); + QAction actionStart(GuiIconProvider::instance()->getIcon("media-playback-start"), tr("Resume", "Resume/start the torrent"), 0); + connect(&actionStart, SIGNAL(triggered()), this, SLOT(startSelectedTorrents())); + QAction actionPause(GuiIconProvider::instance()->getIcon("media-playback-pause"), tr("Pause", "Pause the torrent"), 0); + connect(&actionPause, SIGNAL(triggered()), this, SLOT(pauseSelectedTorrents())); + QAction actionForceStart(GuiIconProvider::instance()->getIcon("media-seek-forward"), tr("Force Resume", "Force Resume/start the torrent"), 0); + connect(&actionForceStart, SIGNAL(triggered()), this, SLOT(forceStartSelectedTorrents())); + QAction actionDelete(GuiIconProvider::instance()->getIcon("edit-delete"), tr("Delete", "Delete the torrent"), 0); + connect(&actionDelete, SIGNAL(triggered()), this, SLOT(softDeleteSelectedTorrents())); + QAction actionPreview_file(GuiIconProvider::instance()->getIcon("view-preview"), tr("Preview file..."), 0); + connect(&actionPreview_file, SIGNAL(triggered()), this, SLOT(previewSelectedTorrents())); + QAction actionSet_max_ratio(QIcon(QString::fromUtf8(":/icons/skin/ratio.png")), tr("Limit share ratio..."), 0); + connect(&actionSet_max_ratio, SIGNAL(triggered()), this, SLOT(setMaxRatioSelectedTorrents())); + QAction actionSet_upload_limit(QIcon(QString::fromUtf8(":/icons/skin/uploadLimit.png")), tr("Limit upload rate..."), 0); + connect(&actionSet_upload_limit, SIGNAL(triggered()), this, SLOT(setUpLimitSelectedTorrents())); + QAction actionSet_download_limit(QIcon(QString::fromUtf8(":/icons/skin/downloadLimit.png")), tr("Limit download rate..."), 0); + connect(&actionSet_download_limit, SIGNAL(triggered()), this, SLOT(setDlLimitSelectedTorrents())); + QAction actionOpen_destination_folder(GuiIconProvider::instance()->getIcon("inode-directory"), tr("Open destination folder"), 0); + connect(&actionOpen_destination_folder, SIGNAL(triggered()), this, SLOT(openSelectedTorrentsFolder())); + QAction actionIncreasePriority(GuiIconProvider::instance()->getIcon("go-up"), tr("Move up", "i.e. move up in the queue"), 0); + connect(&actionIncreasePriority, SIGNAL(triggered()), this, SLOT(increasePrioSelectedTorrents())); + QAction actionDecreasePriority(GuiIconProvider::instance()->getIcon("go-down"), tr("Move down", "i.e. Move down in the queue"), 0); + connect(&actionDecreasePriority, SIGNAL(triggered()), this, SLOT(decreasePrioSelectedTorrents())); + QAction actionTopPriority(GuiIconProvider::instance()->getIcon("go-top"), tr("Move to top", "i.e. Move to top of the queue"), 0); + connect(&actionTopPriority, SIGNAL(triggered()), this, SLOT(topPrioSelectedTorrents())); + QAction actionBottomPriority(GuiIconProvider::instance()->getIcon("go-bottom"), tr("Move to bottom", "i.e. Move to bottom of the queue"), 0); + connect(&actionBottomPriority, SIGNAL(triggered()), this, SLOT(bottomPrioSelectedTorrents())); + QAction actionSetTorrentPath(GuiIconProvider::instance()->getIcon("inode-directory"), tr("Set location..."), 0); + connect(&actionSetTorrentPath, SIGNAL(triggered()), this, SLOT(setSelectedTorrentsLocation())); + QAction actionForce_recheck(GuiIconProvider::instance()->getIcon("document-edit-verify"), tr("Force recheck"), 0); + connect(&actionForce_recheck, SIGNAL(triggered()), this, SLOT(recheckSelectedTorrents())); + QAction actionCopy_magnet_link(QIcon(":/icons/magnet.png"), tr("Copy magnet link"), 0); + connect(&actionCopy_magnet_link, SIGNAL(triggered()), this, SLOT(copySelectedMagnetURIs())); + QAction actionCopy_name(GuiIconProvider::instance()->getIcon("edit-copy"), tr("Copy name"), 0); + connect(&actionCopy_name, SIGNAL(triggered()), this, SLOT(copySelectedNames())); + QAction actionSuper_seeding_mode(tr("Super seeding mode"), 0); + actionSuper_seeding_mode.setCheckable(true); + connect(&actionSuper_seeding_mode, SIGNAL(triggered()), this, SLOT(toggleSelectedTorrentsSuperSeeding())); + QAction actionRename(GuiIconProvider::instance()->getIcon("edit-rename"), tr("Rename..."), 0); + connect(&actionRename, SIGNAL(triggered()), this, SLOT(renameSelectedTorrent())); + QAction actionSequential_download(tr("Download in sequential order"), 0); + actionSequential_download.setCheckable(true); + connect(&actionSequential_download, SIGNAL(triggered()), this, SLOT(toggleSelectedTorrentsSequentialDownload())); + QAction actionFirstLastPiece_prio(tr("Download first and last pieces first"), 0); + actionFirstLastPiece_prio.setCheckable(true); + connect(&actionFirstLastPiece_prio, SIGNAL(triggered()), this, SLOT(toggleSelectedFirstLastPiecePrio())); + QAction actionAutoTMM(tr("Automatic Torrent Management"), 0); actionAutoTMM.setCheckable(true); actionAutoTMM.setToolTip(tr("Automatic mode means that various torrent properties(eg save path) will be decided by the associated category")); - connect(&actionAutoTMM, &QAction::triggered, this, &TransferListWidget::setSelectedAutoTMMEnabled); + connect(&actionAutoTMM, SIGNAL(triggered(bool)), this, SLOT(setSelectedAutoTMMEnabled(bool))); // End of actions // Enable/disable pause/start action given the DL state - bool needsPause = false, needsStart = false, needsForce = false, needsPreview = false; - bool allSameSuperSeeding = true; - bool superSeedingMode = false; - bool allSameSequentialDownloadMode = true, allSamePrioFirstlast = true; - bool sequentialDownloadMode = false, prioritizeFirstLast = false; - bool oneHasMetadata = false, oneNotSeed = false; + bool needs_pause = false, needs_start = false, needs_force = false, needs_preview = false; + bool all_same_super_seeding = true; + bool super_seeding_mode = false; + bool all_same_sequential_download_mode = true, all_same_prio_firstlast = true; + bool sequential_download_mode = false, prioritize_first_last = false; + bool one_has_metadata = false, one_not_seed = false; bool allSameCategory = true; bool allSameAutoTMM = true; bool firstAutoTMM = false; QString firstCategory; bool first = true; - QSet tagsInAny; - QSet tagsInAll; BitTorrent::TorrentHandle *torrent; qDebug("Displaying menu"); foreach (const QModelIndex &index, selectedIndexes) { // Get the file name // Get handle and pause the torrent - torrent = m_listModel->torrentHandle(mapToSource(index)); + torrent = listModel->torrentHandle(mapToSource(index)); if (!torrent) continue; if (firstCategory.isEmpty() && first) @@ -947,66 +717,63 @@ if (firstCategory != torrent->category()) allSameCategory = false; - tagsInAny.unite(torrent->tags()); - - if (first) { + if (first) firstAutoTMM = torrent->isAutoTMMEnabled(); - tagsInAll = torrent->tags(); - } - else { - tagsInAll.intersect(torrent->tags()); - } if (firstAutoTMM != torrent->isAutoTMMEnabled()) allSameAutoTMM = false; if (torrent->hasMetadata()) - oneHasMetadata = true; + one_has_metadata = true; if (!torrent->isSeed()) { - oneNotSeed = true; - if (first) { - sequentialDownloadMode = torrent->isSequentialDownload(); - prioritizeFirstLast = torrent->hasFirstLastPiecePriority(); - } - else { - if (sequentialDownloadMode != torrent->isSequentialDownload()) - allSameSequentialDownloadMode = false; - if (prioritizeFirstLast != torrent->hasFirstLastPiecePriority()) - allSamePrioFirstlast = false; + one_not_seed = true; + if (torrent->hasMetadata()) { + if (first) { + sequential_download_mode = torrent->isSequentialDownload(); + prioritize_first_last = torrent->hasFirstLastPiecePriority(); + } + else { + if (sequential_download_mode != torrent->isSequentialDownload()) + all_same_sequential_download_mode = false; + if (prioritize_first_last != torrent->hasFirstLastPiecePriority()) + all_same_prio_firstlast = false; + } } } else { - if (!oneNotSeed && allSameSuperSeeding && torrent->hasMetadata()) { - if (first) - superSeedingMode = torrent->superSeeding(); - else if (superSeedingMode != torrent->superSeeding()) - allSameSuperSeeding = false; + if (!one_not_seed && all_same_super_seeding && torrent->hasMetadata()) { + if (first) { + super_seeding_mode = torrent->superSeeding(); + } + else if (super_seeding_mode != torrent->superSeeding()) + all_same_super_seeding = false; + } } if (!torrent->isForced()) - needsForce = true; + needs_force = true; else - needsStart = true; + needs_start = true; if (torrent->isPaused()) - needsStart = true; + needs_start = true; else - needsPause = true; + needs_pause = true; if (torrent->hasMetadata()) - needsPreview = true; + needs_preview = true; first = false; - if (oneHasMetadata && oneNotSeed && !allSameSequentialDownloadMode - && !allSamePrioFirstlast && !allSameSuperSeeding && !allSameCategory - && needsStart && needsForce && needsPause && needsPreview && !allSameAutoTMM) { + if (one_has_metadata && one_not_seed && !all_same_sequential_download_mode + && !all_same_prio_firstlast && !all_same_super_seeding && !allSameCategory + && needs_start && needs_force && needs_pause && needs_preview && !allSameAutoTMM) { break; } } QMenu listMenu(this); - if (needsStart) + if (needs_start) listMenu.addAction(&actionStart); - if (needsPause) + if (needs_pause) listMenu.addAction(&actionPause); - if (needsForce) + if (needs_force) listMenu.addAction(&actionForceStart); listMenu.addSeparator(); listMenu.addAction(&actionDelete); @@ -1015,8 +782,8 @@ if (selectedIndexes.size() == 1) listMenu.addAction(&actionRename); // Category Menu - QStringList categories = BitTorrent::Session::instance()->categories().keys(); - std::sort(categories.begin(), categories.end(), Utils::String::naturalLessThan); + QStringList categories = BitTorrent::Session::instance()->categories(); + std::sort(categories.begin(), categories.end(), Utils::String::naturalCompareCaseInsensitive); QList categoryActions; QMenu *categoryMenu = listMenu.addMenu(GuiIconProvider::instance()->getIcon("view-categories"), tr("Category")); categoryActions << categoryMenu->addAction(GuiIconProvider::instance()->getIcon("list-add"), tr("New...", "New category...")); @@ -1033,73 +800,47 @@ categoryActions << cat; } - // Tag Menu - QStringList tags(BitTorrent::Session::instance()->tags().toList()); - std::sort(tags.begin(), tags.end(), Utils::String::naturalLessThan); - QList tagsActions; - QMenu *tagsMenu = listMenu.addMenu(GuiIconProvider::instance()->getIcon("view-categories"), tr("Tags")); - tagsActions << tagsMenu->addAction(GuiIconProvider::instance()->getIcon("list-add"), tr("Add...", "Add / assign multiple tags...")); - tagsActions << tagsMenu->addAction(GuiIconProvider::instance()->getIcon("edit-clear"), tr("Remove All", "Remove all tags")); - tagsMenu->addSeparator(); - foreach (QString tag, tags) { - const Qt::CheckState initialState = tagsInAll.contains(tag) ? Qt::Checked - : tagsInAny.contains(tag) ? Qt::PartiallyChecked - : Qt::Unchecked; - - const ToggleFn onToggle = [this, tag](Qt::CheckState newState) - { - Q_ASSERT(newState == Qt::CheckState::Checked || newState == Qt::CheckState::Unchecked); - if (newState == Qt::CheckState::Checked) - addSelectionTag(tag); - else - removeSelectionTag(tag); - }; - - tagsMenu->addAction(new CheckBoxMenuItem(tag, onToggle, initialState, tagsMenu)); - } - if (allSameAutoTMM) { actionAutoTMM.setChecked(firstAutoTMM); listMenu.addAction(&actionAutoTMM); } listMenu.addSeparator(); - if (oneNotSeed) - listMenu.addAction(&actionSetDownloadLimit); - listMenu.addAction(&actionSetUploadLimit); - listMenu.addAction(&actionSetMaxRatio); - if (!oneNotSeed && allSameSuperSeeding && oneHasMetadata) { - actionSuperSeedingMode.setChecked(superSeedingMode); - listMenu.addAction(&actionSuperSeedingMode); + if (one_not_seed) + listMenu.addAction(&actionSet_download_limit); + listMenu.addAction(&actionSet_upload_limit); + listMenu.addAction(&actionSet_max_ratio); + if (!one_not_seed && all_same_super_seeding && one_has_metadata) { + actionSuper_seeding_mode.setChecked(super_seeding_mode); + listMenu.addAction(&actionSuper_seeding_mode); } listMenu.addSeparator(); - bool addedPreviewAction = false; - if (needsPreview) { - listMenu.addAction(&actionPreviewFile); - addedPreviewAction = true; - } - if (oneNotSeed) { - if (allSameSequentialDownloadMode) { - actionSequentialDownload.setChecked(sequentialDownloadMode); - listMenu.addAction(&actionSequentialDownload); - addedPreviewAction = true; + bool added_preview_action = false; + if (needs_preview) { + listMenu.addAction(&actionPreview_file); + added_preview_action = true; + } + if (one_not_seed && one_has_metadata) { + if (all_same_sequential_download_mode) { + actionSequential_download.setChecked(sequential_download_mode); + listMenu.addAction(&actionSequential_download); + added_preview_action = true; } - if (allSamePrioFirstlast) { - actionFirstLastPiecePrio.setChecked(prioritizeFirstLast); - listMenu.addAction(&actionFirstLastPiecePrio); - addedPreviewAction = true; + if (all_same_prio_firstlast) { + actionFirstLastPiece_prio.setChecked(prioritize_first_last); + listMenu.addAction(&actionFirstLastPiece_prio); + added_preview_action = true; } } - if (addedPreviewAction) + if (added_preview_action) listMenu.addSeparator(); - if (oneHasMetadata) { - listMenu.addAction(&actionForceRecheck); - listMenu.addAction(&actionForceReannounce); + if (one_has_metadata) { + listMenu.addAction(&actionForce_recheck); listMenu.addSeparator(); } - listMenu.addAction(&actionOpenDestinationFolder); - if (BitTorrent::Session::instance()->isQueueingSystemEnabled() && oneNotSeed) { + listMenu.addAction(&actionOpen_destination_folder); + if (BitTorrent::Session::instance()->isQueueingSystemEnabled() && one_not_seed) { listMenu.addSeparator(); QMenu *prioMenu = listMenu.addMenu(tr("Priority")); prioMenu->addAction(&actionTopPriority); @@ -1108,14 +849,13 @@ prioMenu->addAction(&actionBottomPriority); } listMenu.addSeparator(); - listMenu.addAction(&actionCopyName); - listMenu.addAction(&actionCopyHash); - listMenu.addAction(&actionCopyMagnetLink); + listMenu.addAction(&actionCopy_name); + listMenu.addAction(&actionCopy_magnet_link); // Call menu - QAction *act = nullptr; + QAction *act = 0; act = listMenu.exec(QCursor::pos()); if (act) { - // Parse category & tag actions only (others have slots assigned) + // Parse category actions only (others have slots assigned) int i = categoryActions.indexOf(act); if (i >= 0) { // Category action @@ -1131,25 +871,15 @@ setSelectionCategory(category); } } - i = tagsActions.indexOf(act); - if (i == 0) { - askAddTagsForSelection(); - } - else if (i == 1) { - if (Preferences::instance()->confirmRemoveAllTags()) - confirmRemoveAllTagsForSelection(); - else - clearSelectionTags(); - } } } void TransferListWidget::currentChanged(const QModelIndex& current, const QModelIndex&) { qDebug("CURRENT CHANGED"); - BitTorrent::TorrentHandle *torrent = nullptr; + BitTorrent::TorrentHandle *torrent = 0; if (current.isValid()) { - torrent = m_listModel->torrentHandle(mapToSource(current)); + torrent = listModel->torrentHandle(mapToSource(current)); // Scroll Fix scrollTo(current); } @@ -1159,43 +889,33 @@ void TransferListWidget::applyCategoryFilter(QString category) { if (category.isNull()) - m_sortFilterModel->disableCategoryFilter(); - else - m_sortFilterModel->setCategoryFilter(category); -} - -void TransferListWidget::applyTagFilter(const QString &tag) -{ - if (tag.isNull()) - m_sortFilterModel->disableTagFilter(); + nameFilterModel->disableCategoryFilter(); else - m_sortFilterModel->setTagFilter(tag); + nameFilterModel->setCategoryFilter(category); } void TransferListWidget::applyTrackerFilterAll() { - m_sortFilterModel->disableTrackerFilter(); + nameFilterModel->disableTrackerFilter(); } void TransferListWidget::applyTrackerFilter(const QStringList &hashes) { - m_sortFilterModel->setTrackerFilter(hashes); + nameFilterModel->setTrackerFilter(hashes); } -void TransferListWidget::applyNameFilter(const QString &name) +void TransferListWidget::applyNameFilter(const QString& name) { - const QRegExp::PatternSyntax patternSyntax = Preferences::instance()->getRegexAsFilteringPatternForTransferList() - ? QRegExp::RegExp : QRegExp::WildcardUnix; - m_sortFilterModel->setFilterRegExp(QRegExp(name, Qt::CaseInsensitive, patternSyntax)); + nameFilterModel->setFilterRegExp(QRegExp(name, Qt::CaseInsensitive, QRegExp::WildcardUnix)); } void TransferListWidget::applyStatusFilter(int f) { - m_sortFilterModel->setStatusFilter(static_cast(f)); + nameFilterModel->setStatusFilter(static_cast(f)); // Select first item if nothing is selected - if (selectionModel()->selectedRows(0).empty() && (m_sortFilterModel->rowCount() > 0)) { - qDebug("Nothing is selected, selecting first row: %s", qUtf8Printable(m_sortFilterModel->index(0, TransferListModel::TR_NAME).data().toString())); - selectionModel()->setCurrentIndex(m_sortFilterModel->index(0, TransferListModel::TR_NAME), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows); + if (selectionModel()->selectedRows(0).empty() && nameFilterModel->rowCount() > 0) { + qDebug("Nothing is selected, selecting first row: %s", qPrintable(nameFilterModel->index(0, TorrentModel::TR_NAME).data().toString())); + selectionModel()->setCurrentIndex(nameFilterModel->index(0, TorrentModel::TR_NAME), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows); } } @@ -1206,7 +926,10 @@ bool TransferListWidget::loadSettings() { - return header()->restoreState(Preferences::instance()->getTransHeaderState()); + bool ok = header()->restoreState(Preferences::instance()->getTransHeaderState()); + if (!ok) + header()->resizeSection(0, 200); // Default + return ok; } void TransferListWidget::wheelEvent(QWheelEvent *event) @@ -1222,3 +945,12 @@ QTreeView::wheelEvent(event); // event delegated to base class } + +QStringList extractHashes(const QList &torrents) +{ + QStringList hashes; + foreach (BitTorrent::TorrentHandle *const torrent, torrents) + hashes << torrent->hash(); + + return hashes; +} diff -Nru qbittorrent-4.1.3/src/gui/transferlistwidget.h qbittorrent-3.3.15/src/gui/transferlistwidget.h --- qbittorrent-4.1.3/src/gui/transferlistwidget.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/transferlistwidget.h 2017-08-03 20:30:10.000000000 +0000 @@ -1,6 +1,6 @@ /* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2006 Christophe Dumez + * 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 @@ -24,12 +24,13 @@ * modify file(s), you may extend this exception to your version of the file(s), * but you are not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. + * + * Contact : chris@qbittorrent.org */ #ifndef TRANSFERLISTWIDGET_H #define TRANSFERLISTWIDGET_H -#include #include namespace BitTorrent @@ -37,29 +38,28 @@ class TorrentHandle; } -class QShortcut; -class QSortFilterProxyModel; -class QStandardItemModel; - class MainWindow; class TransferListDelegate; -class TransferListModel; class TransferListSortModel; +class TorrentModel; -class TransferListWidget : public QTreeView +QT_BEGIN_NAMESPACE +class QShortcut; +class QSortFilterProxyModel; +class QStandardItemModel; +QT_END_NAMESPACE + +class TransferListWidget: public QTreeView { Q_OBJECT public: - TransferListWidget(QWidget *parent, MainWindow *mainWindow); - ~TransferListWidget() override; - TransferListModel *getSourceModel() const; + TransferListWidget(QWidget *parent, MainWindow *main_window); + ~TransferListWidget(); + TorrentModel* getSourceModel() const; public slots: void setSelectionCategory(QString category); - void addSelectionTag(const QString &tag); - void removeSelectionTag(const QString &tag); - void clearSelectionTags(); void setSelectedTorrentsLocation(); void pauseAllTorrents(); void resumeAllTorrents(); @@ -78,20 +78,17 @@ void bottomPrioSelectedTorrents(); void copySelectedMagnetURIs() const; void copySelectedNames() const; - void copySelectedHashes() const; void openSelectedTorrentsFolder() const; void recheckSelectedTorrents(); - void reannounceSelectedTorrents(); void setDlLimitSelectedTorrents(); void setUpLimitSelectedTorrents(); void setMaxRatioSelectedTorrents(); void previewSelectedTorrents(); void hidePriorityColumn(bool hide); void displayDLHoSMenu(const QPoint&); - void applyNameFilter(const QString &name); + void applyNameFilter(const QString& name); void applyStatusFilter(int f); void applyCategoryFilter(QString category); - void applyTagFilter(const QString &tag); void applyTrackerFilterAll(); void applyTrackerFilter(const QStringList &hashes); void previewFile(QString filePath); @@ -106,7 +103,7 @@ protected slots: void torrentDoubleClicked(); void displayListMenu(const QPoint&); - void currentChanged(const QModelIndex& current, const QModelIndex&) override; + void currentChanged(const QModelIndex& current, const QModelIndex&); void toggleSelectedTorrentsSuperSeeding() const; void toggleSelectedTorrentsSequentialDownload() const; void toggleSelectedFirstLastPiecePrio() const; @@ -119,20 +116,16 @@ private: void wheelEvent(QWheelEvent *event) override; - void askAddTagsForSelection(); - void confirmRemoveAllTagsForSelection(); - QStringList askTagsForSelection(const QString &dialogTitle); - void applyToSelectedTorrents(const std::function &fn); - - TransferListDelegate *m_listDelegate; - TransferListModel *m_listModel; - TransferListSortModel *m_sortFilterModel; - MainWindow *m_mainWindow; - QShortcut *m_editHotkey; - QShortcut *m_deleteHotkey; - QShortcut *m_permDeleteHotkey; - QShortcut *m_doubleClickHotkey; - QShortcut *m_recheckHotkey; + + TransferListDelegate *listDelegate; + TorrentModel *listModel; + TransferListSortModel *nameFilterModel; + MainWindow *main_window; + QShortcut *editHotkey; + QShortcut *deleteHotkey; + QShortcut *permDeleteHotkey; + QShortcut *doubleClickHotkey; + QShortcut *recheckHotkey; }; #endif // TRANSFERLISTWIDGET_H diff -Nru qbittorrent-4.1.3/src/gui/translators.html qbittorrent-3.3.15/src/gui/translators.html --- qbittorrent-4.1.3/src/gui/translators.html 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/translators.html 2017-08-03 20:30:10.000000000 +0000 @@ -17,7 +17,7 @@
  • Chinese (Traditional): Yi-Shun Wang (dnextstep@gmail.com) and 冥王歐西里斯 s8321414(Transifex)
  • Croatian: Oliver Mucafir (oliver.untwist@gmail.com)
  • Czech: Jirka Vilim (web@tets.cz) and Petr Cernobila abr(Transifex)
  • -
  • Danish: Mathias Nielsen (comoneo@gmail.com), scootergrisen, Nicolaj (fuskern@gmail.com) and Joe Hansen (joedalton2@yahoo.dk)
  • +
  • Danish: Mathias Nielsen (comoneo@gmail.com)
  • Dutch: Pieter Heyvaert (pieter_heyvaert@hotmail.com)
  • English(Australia): Robert Readman readmanr(Transifex)
  • English(United Kingdom): Robert Readman readmanr(Transifex)
  • @@ -34,7 +34,7 @@
  • Lithuanian: Naglis Jonaitis (njonaitis@gmail.com)
  • Norwegian: Tomaso
  • Polish: Mariusz Fik (fisiu@opensuse.org)
  • -
  • Portuguese: Sérgio Marques smarquespt(Transifex) and L.Sousa(Transifex)
  • +
  • Portuguese: Sérgio Marques smarquespt(Transifex)
  • Portuguese(Brazil): Nick Marinho (nickmarinho@gmail.com)
  • Romanian: Obada Denis (obadadenis@users.sourceforge.net), Adrian Gabor Adriannho(Transifex) and Mihai Coman z0id(Transifex)
  • Russian: Nick Khazov (m2k3d0n at users.sourceforge.net), Alexey Morsov (samurai@ricom.ru), Nick Tiskov Dayman(daymansmail (at) gmail (dot) com), Dmitry DmitryKX(Transifex) and kraleksandr kraleksandr(Transifex)
  • @@ -42,7 +42,7 @@
  • Slovak: helix84
  • Spanish: Alfredo Monclús (alfrix), Francisco Luque Contreras (frannoe@ya.com), José Antonio Moray moray33(Transifex) and Diego de las Heras(Transifex)
  • Swedish: Daniel Nylander (po@danielnylander.se) and Emil Hammarberg Ooglogput(Transifex)
  • -
  • Turkish: Hasan YILMAZ (iletisim@hedefturkce.com), Erdem Bingöl (erdem84@gmail.com) and Burak Yavuz (BouRock)
  • +
  • Turkish: Hasan YILMAZ (iletisim@hedefturkce.com) and Erdem Bingöl (erdem84@gmail.com)
  • Ukrainian: Oleh Prypin (blaxpirit@gmail.com)
  • Vietnamese: Anh Phan ppanhh(Transifex)
diff -Nru qbittorrent-4.1.3/src/gui/updownratiodialog.cpp qbittorrent-3.3.15/src/gui/updownratiodialog.cpp --- qbittorrent-4.1.3/src/gui/updownratiodialog.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/updownratiodialog.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,129 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2011 Christian Kandeler - * Copyright (C) 2011 Christophe Dumez - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "updownratiodialog.h" - -#include - -#include "base/bittorrent/session.h" -#include "ui_updownratiodialog.h" -#include "utils.h" - -UpDownRatioDialog::UpDownRatioDialog(bool useDefault, qreal initialRatioValue, - qreal maxRatioValue, int initialTimeValue, - int maxTimeValue, QWidget *parent) - : QDialog(parent) - , m_ui(new Ui::UpDownRatioDialog) -{ - m_ui->setupUi(this); - - if (useDefault) { - m_ui->useDefaultButton->setChecked(true); - } - else if ((initialRatioValue == -1.) && (initialTimeValue == -1)) { - m_ui->noLimitButton->setChecked(true); - initialRatioValue = BitTorrent::Session::instance()->globalMaxRatio(); - initialTimeValue = BitTorrent::Session::instance()->globalMaxSeedingMinutes(); - } - else { - m_ui->torrentLimitButton->setChecked(true); - - if (initialRatioValue >= 0) - m_ui->checkMaxRatio->setChecked(true); - - if (initialTimeValue >= 0) - m_ui->checkMaxTime->setChecked(true); - } - - m_ui->ratioSpinBox->setMinimum(0); - m_ui->ratioSpinBox->setMaximum(maxRatioValue); - m_ui->ratioSpinBox->setValue(initialRatioValue); - - m_ui->timeSpinBox->setMinimum(0); - m_ui->timeSpinBox->setMaximum(maxTimeValue); - m_ui->timeSpinBox->setValue(initialTimeValue); - - connect(m_ui->buttonGroup, static_cast(&QButtonGroup::buttonClicked) - , this, &UpDownRatioDialog::handleRatioTypeChanged); - connect(m_ui->checkMaxRatio, &QCheckBox::toggled, this, &UpDownRatioDialog::enableRatioSpin); - connect(m_ui->checkMaxTime, &QCheckBox::toggled, this, &UpDownRatioDialog::enableTimeSpin); - - handleRatioTypeChanged(); - - Utils::Gui::resize(this); -} - -void UpDownRatioDialog::accept() -{ - if (m_ui->torrentLimitButton->isChecked() && !m_ui->checkMaxRatio->isChecked() && !m_ui->checkMaxTime->isChecked()) - QMessageBox::critical(this, tr("No share limit method selected"), - tr("Please select a limit method first")); - else - QDialog::accept(); -} - -bool UpDownRatioDialog::useDefault() const -{ - return m_ui->useDefaultButton->isChecked(); -} - -qreal UpDownRatioDialog::ratio() const -{ - return (m_ui->noLimitButton->isChecked() || !m_ui->checkMaxRatio->isChecked()) ? -1. : m_ui->ratioSpinBox->value(); -} - -int UpDownRatioDialog::seedingTime() const -{ - return (m_ui->noLimitButton->isChecked() || !m_ui->checkMaxTime->isChecked()) ? -1 : m_ui->timeSpinBox->value(); -} - -void UpDownRatioDialog::handleRatioTypeChanged() -{ - // ui->ratioSpinBox->setEnabled(ui->torrentLimitButton->isChecked()); - m_ui->checkMaxRatio->setEnabled(m_ui->torrentLimitButton->isChecked()); - m_ui->checkMaxTime->setEnabled(m_ui->torrentLimitButton->isChecked()); - - m_ui->ratioSpinBox->setEnabled(m_ui->torrentLimitButton->isChecked() && m_ui->checkMaxRatio->isChecked()); - m_ui->timeSpinBox->setEnabled(m_ui->torrentLimitButton->isChecked() && m_ui->checkMaxTime->isChecked()); -} - -void UpDownRatioDialog::enableRatioSpin() -{ - m_ui->ratioSpinBox->setEnabled(m_ui->checkMaxRatio->isChecked()); -} - -void UpDownRatioDialog::enableTimeSpin() -{ - m_ui->timeSpinBox->setEnabled(m_ui->checkMaxTime->isChecked()); -} - -UpDownRatioDialog::~UpDownRatioDialog() -{ - delete m_ui; -} diff -Nru qbittorrent-4.1.3/src/gui/updownratiodialog.h qbittorrent-3.3.15/src/gui/updownratiodialog.h --- qbittorrent-4.1.3/src/gui/updownratiodialog.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/updownratiodialog.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2011 Christian Kandeler - * Copyright (C) 2011 Christophe Dumez - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef UPDOWNRATIODIALOG_H -#define UPDOWNRATIODIALOG_H - -#include - -namespace Ui -{ - class UpDownRatioDialog; -} - -class UpDownRatioDialog : public QDialog -{ - Q_OBJECT - -public: - UpDownRatioDialog(bool useDefault, qreal initialValue, qreal maxValue, - int initialTimeValue, int maxTimeValue, - QWidget *parent = nullptr); - ~UpDownRatioDialog(); - - bool useDefault() const; - qreal ratio() const; - int seedingTime() const; - -public slots: - void accept() override; - -private slots: - void handleRatioTypeChanged(); - void enableRatioSpin(); - void enableTimeSpin(); - -private: - Ui::UpDownRatioDialog *m_ui; -}; - -#endif // UPDOWNRATIODIALOG_H diff -Nru qbittorrent-4.1.3/src/gui/updownratiodialog.ui qbittorrent-3.3.15/src/gui/updownratiodialog.ui --- qbittorrent-4.1.3/src/gui/updownratiodialog.ui 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/updownratiodialog.ui 1970-01-01 00:00:00.000000000 +0000 @@ -1,177 +0,0 @@ - - - UpDownRatioDialog - - - - 0 - 0 - 399 - 195 - - - - Torrent Upload/Download Ratio Limiting - - - - - - Use global share limit - - - buttonGroup - - - - - - - Set no share limit - - - buttonGroup - - - - - - - - - Set share limit to - - - buttonGroup - - - - - - - 9998.000000000000000 - - - 0.050000000000000 - - - 1.000000000000000 - - - - - - - - 0 - 0 - - - - 0 - - - 525600.000000000000000 - - - 1.000000000000000 - - - 1440.000000000000000 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - ratio - - - - - - - minutes - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - buttonBox - accepted() - UpDownRatioDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - UpDownRatioDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - - - - - - diff -Nru qbittorrent-4.1.3/src/gui/updownratiodlg.cpp qbittorrent-3.3.15/src/gui/updownratiodlg.cpp --- qbittorrent-4.1.3/src/gui/updownratiodlg.cpp 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/updownratiodlg.cpp 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,79 @@ +/* + * Bittorrent Client using Qt and libtorrent. + * Copyright (C) 2011 Christian Kandeler, Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#include "updownratiodlg.h" + +#include "base/bittorrent/session.h" +#include "ui_updownratiodlg.h" + +UpDownRatioDlg::UpDownRatioDlg(bool useDefault, qreal initialValue, + qreal maxValue, QWidget *parent) + : QDialog(parent) + , ui(new Ui::UpDownRatioDlg) +{ + ui->setupUi(this); + + if (useDefault) { + ui->useDefaultButton->setChecked(true); + } + else if (initialValue == -1) { + ui->noLimitButton->setChecked(true); + initialValue = BitTorrent::Session::instance()->globalMaxRatio(); + } + else { + ui->torrentLimitButton->setChecked(true); + } + + ui->ratioSpinBox->setMinimum(0); + ui->ratioSpinBox->setMaximum(maxValue); + ui->ratioSpinBox->setValue(initialValue); + connect(ui->buttonGroup, SIGNAL(buttonClicked(int)), SLOT(handleRatioTypeChanged())); + handleRatioTypeChanged(); +} + +bool UpDownRatioDlg::useDefault() const +{ + return ui->useDefaultButton->isChecked(); +} + +qreal UpDownRatioDlg::ratio() const +{ + return ui->noLimitButton->isChecked() ? -1 : ui->ratioSpinBox->value(); +} + +void UpDownRatioDlg::handleRatioTypeChanged() +{ + ui->ratioSpinBox->setEnabled(ui->torrentLimitButton->isChecked()); +} + +UpDownRatioDlg::~UpDownRatioDlg() +{ + delete ui; +} diff -Nru qbittorrent-4.1.3/src/gui/updownratiodlg.h qbittorrent-3.3.15/src/gui/updownratiodlg.h --- qbittorrent-4.1.3/src/gui/updownratiodlg.h 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/updownratiodlg.h 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,61 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2011 Christian Kandeler, Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#ifndef UPDOWNRATIODLG_H +#define UPDOWNRATIODLG_H + +#include + +QT_BEGIN_NAMESPACE +namespace Ui { + class UpDownRatioDlg; +} +QT_END_NAMESPACE + +class UpDownRatioDlg : public QDialog +{ + Q_OBJECT + +public: + explicit UpDownRatioDlg(bool useDefault, qreal initialValue, qreal maxValue, + QWidget *parent = 0); + ~UpDownRatioDlg(); + + bool useDefault() const; + qreal ratio() const; + +private slots: + void handleRatioTypeChanged(); + +private: + Ui::UpDownRatioDlg *ui; +}; + +#endif // UPDOWNRATIODLG_H diff -Nru qbittorrent-4.1.3/src/gui/updownratiodlg.ui qbittorrent-3.3.15/src/gui/updownratiodlg.ui --- qbittorrent-4.1.3/src/gui/updownratiodlg.ui 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/updownratiodlg.ui 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,140 @@ + + + UpDownRatioDlg + + + + 0 + 0 + 317 + 152 + + + + Torrent Upload/Download Ratio Limiting + + + + + + Use global ratio limit + + + buttonGroup + + + + + + + Set no ratio limit + + + buttonGroup + + + + + + + + + Set ratio limit to + + + buttonGroup + + + + + + + 9998.000000000000000 + + + 0.050000000000000 + + + 1.000000000000000 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + UpDownRatioDlg + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + UpDownRatioDlg + reject() + + + 316 + 260 + + + 286 + 274 + + + + + + + + diff -Nru qbittorrent-4.1.3/src/gui/utils.cpp qbittorrent-3.3.15/src/gui/utils.cpp --- qbittorrent-4.1.3/src/gui/utils.cpp 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/utils.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,114 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Mike Tzou - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#include "utils.h" - -#include -#include -#include -#include -#include -#include -#include - -void Utils::Gui::resize(QWidget *widget, const QSize &newSize) -{ - if (newSize.isValid()) - widget->resize(newSize); - else // depends on screen DPI - widget->resize(widget->size() * screenScalingFactor(widget)); -} - -qreal Utils::Gui::screenScalingFactor(const QWidget *widget) -{ - if (!widget) - return 1; - -#ifdef Q_OS_WIN - const int screen = qApp->desktop()->screenNumber(widget); - return (QApplication::screens()[screen]->logicalDotsPerInch() / 96); -#elif defined(Q_OS_MAC) - return 1; -#else -#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) - return widget->devicePixelRatioF(); -#else - return widget->devicePixelRatio(); -#endif -#endif // Q_OS_WIN -} - -QPixmap Utils::Gui::scaledPixmap(const QIcon &icon, const QWidget *widget, const int height) -{ - Q_ASSERT(height > 0); - const int scaledHeight = height * Utils::Gui::screenScalingFactor(widget); - return icon.pixmap(scaledHeight); -} - -QPixmap Utils::Gui::scaledPixmap(const QString &path, const QWidget *widget, const int height) -{ - const QPixmap pixmap(path); - const int scaledHeight = ((height > 0) ? height : pixmap.height()) * Utils::Gui::screenScalingFactor(widget); - return pixmap.scaledToHeight(scaledHeight, Qt::SmoothTransformation); -} - -QPixmap Utils::Gui::scaledPixmapSvg(const QString &path, const QWidget *widget, const int baseHeight) -{ - const int scaledHeight = baseHeight * Utils::Gui::screenScalingFactor(widget); - const QString normalizedKey = path + '@' + QString::number(scaledHeight); - - QPixmap pm; - QPixmapCache cache; - if (!cache.find(normalizedKey, &pm)) { - pm = QIcon(path).pixmap(scaledHeight); - cache.insert(normalizedKey, pm); - } - return pm; -} - -QSize Utils::Gui::smallIconSize(const QWidget *widget) -{ - // Get DPI scaled icon size (device-dependent), see QT source - // under a 1080p screen is usually 16x16 - const int s = QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize, nullptr, widget); - return QSize(s, s); -} - -QSize Utils::Gui::mediumIconSize(const QWidget *widget) -{ - // under a 1080p screen is usually 24x24 - return ((smallIconSize(widget) + largeIconSize(widget)) / 2); -} - -QSize Utils::Gui::largeIconSize(const QWidget *widget) -{ - // Get DPI scaled icon size (device-dependent), see QT source - // under a 1080p screen is usually 32x32 - const int s = QApplication::style()->pixelMetric(QStyle::PM_LargeIconSize, nullptr, widget); - return QSize(s, s); -} diff -Nru qbittorrent-4.1.3/src/gui/utils.h qbittorrent-3.3.15/src/gui/utils.h --- qbittorrent-4.1.3/src/gui/utils.h 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/gui/utils.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -/* - * Bittorrent Client using Qt and libtorrent. - * Copyright (C) 2017 Mike Tzou - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * In addition, as a special exception, the copyright holders give permission to - * link this program with the OpenSSL project's "OpenSSL" library (or with - * modified versions of it that use the same license as the "OpenSSL" library), - * and distribute the linked executables. You must obey the GNU General Public - * License in all respects for all of the code used other than "OpenSSL". If you - * modify file(s), you may extend this exception to your version of the file(s), - * but you are not obligated to do so. If you do not wish to do so, delete this - * exception statement from your version. - */ - -#ifndef UTILS_GUI_H -#define UTILS_GUI_H - -#include -#include -#include - -class QIcon; -class QWidget; - -namespace Utils -{ - namespace Gui - { - void resize(QWidget *widget, const QSize &newSize = {}); - qreal screenScalingFactor(const QWidget *widget); - - template - T scaledSize(const QWidget *widget, const T &size) - { - return (size * screenScalingFactor(widget)); - } - - QPixmap scaledPixmap(const QIcon &icon, const QWidget *widget, const int height); - QPixmap scaledPixmap(const QString &path, const QWidget *widget, const int height = 0); - QPixmap scaledPixmapSvg(const QString &path, const QWidget *widget, const int baseHeight); - QSize smallIconSize(const QWidget *widget = nullptr); - QSize mediumIconSize(const QWidget *widget = nullptr); - QSize largeIconSize(const QWidget *widget = nullptr); - } -} - -#endif // UTILS_GUI_H diff -Nru qbittorrent-4.1.3/src/icons/fileicon.svg qbittorrent-3.3.15/src/icons/fileicon.svg --- qbittorrent-4.1.3/src/icons/fileicon.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/fileicon.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ad.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ad.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ad.svg qbittorrent-3.3.15/src/icons/flags/ad.svg --- qbittorrent-4.1.3/src/icons/flags/ad.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ad.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,151 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ae.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ae.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ae.svg qbittorrent-3.3.15/src/icons/flags/ae.svg --- qbittorrent-4.1.3/src/icons/flags/ae.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ae.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/af.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/af.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/af.svg qbittorrent-3.3.15/src/icons/flags/af.svg --- qbittorrent-4.1.3/src/icons/flags/af.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/af.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ag.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ag.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ag.svg qbittorrent-3.3.15/src/icons/flags/ag.svg --- qbittorrent-4.1.3/src/icons/flags/ag.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ag.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ai.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ai.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ai.svg qbittorrent-3.3.15/src/icons/flags/ai.svg --- qbittorrent-4.1.3/src/icons/flags/ai.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ai.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,767 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/al.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/al.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/al.svg qbittorrent-3.3.15/src/icons/flags/al.svg --- qbittorrent-4.1.3/src/icons/flags/al.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/al.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/am.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/am.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/am.svg qbittorrent-3.3.15/src/icons/flags/am.svg --- qbittorrent-4.1.3/src/icons/flags/am.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/am.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/an.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/an.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ao.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ao.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ao.svg qbittorrent-3.3.15/src/icons/flags/ao.svg --- qbittorrent-4.1.3/src/icons/flags/ao.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ao.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/flags/aq.svg qbittorrent-3.3.15/src/icons/flags/aq.svg --- qbittorrent-4.1.3/src/icons/flags/aq.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/aq.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ar.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ar.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ar.svg qbittorrent-3.3.15/src/icons/flags/ar.svg --- qbittorrent-4.1.3/src/icons/flags/ar.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ar.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/as.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/as.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/as.svg qbittorrent-3.3.15/src/icons/flags/as.svg --- qbittorrent-4.1.3/src/icons/flags/as.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/as.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/at.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/at.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/at.svg qbittorrent-3.3.15/src/icons/flags/at.svg --- qbittorrent-4.1.3/src/icons/flags/at.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/at.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/au.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/au.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/au.svg qbittorrent-3.3.15/src/icons/flags/au.svg --- qbittorrent-4.1.3/src/icons/flags/au.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/au.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/aw.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/aw.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/aw.svg qbittorrent-3.3.15/src/icons/flags/aw.svg --- qbittorrent-4.1.3/src/icons/flags/aw.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/aw.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,186 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ax.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ax.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ax.svg qbittorrent-3.3.15/src/icons/flags/ax.svg --- qbittorrent-4.1.3/src/icons/flags/ax.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ax.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/az.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/az.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/az.svg qbittorrent-3.3.15/src/icons/flags/az.svg --- qbittorrent-4.1.3/src/icons/flags/az.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/az.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ba.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ba.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ba.svg qbittorrent-3.3.15/src/icons/flags/ba.svg --- qbittorrent-4.1.3/src/icons/flags/ba.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ba.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/bb.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/bb.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/bb.svg qbittorrent-3.3.15/src/icons/flags/bb.svg --- qbittorrent-4.1.3/src/icons/flags/bb.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/bb.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/bd.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/bd.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/bd.svg qbittorrent-3.3.15/src/icons/flags/bd.svg --- qbittorrent-4.1.3/src/icons/flags/bd.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/bd.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/be.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/be.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/be.svg qbittorrent-3.3.15/src/icons/flags/be.svg --- qbittorrent-4.1.3/src/icons/flags/be.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/be.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/bf.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/bf.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/bf.svg qbittorrent-3.3.15/src/icons/flags/bf.svg --- qbittorrent-4.1.3/src/icons/flags/bf.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/bf.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/bg.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/bg.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/bg.svg qbittorrent-3.3.15/src/icons/flags/bg.svg --- qbittorrent-4.1.3/src/icons/flags/bg.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/bg.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/bh.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/bh.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/bh.svg qbittorrent-3.3.15/src/icons/flags/bh.svg --- qbittorrent-4.1.3/src/icons/flags/bh.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/bh.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/bi.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/bi.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/bi.svg qbittorrent-3.3.15/src/icons/flags/bi.svg --- qbittorrent-4.1.3/src/icons/flags/bi.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/bi.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/bj.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/bj.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/bj.svg qbittorrent-3.3.15/src/icons/flags/bj.svg --- qbittorrent-4.1.3/src/icons/flags/bj.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/bj.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/flags/bl.svg qbittorrent-3.3.15/src/icons/flags/bl.svg --- qbittorrent-4.1.3/src/icons/flags/bl.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/bl.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/bm.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/bm.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/bm.svg qbittorrent-3.3.15/src/icons/flags/bm.svg --- qbittorrent-4.1.3/src/icons/flags/bm.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/bm.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/bn.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/bn.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/bn.svg qbittorrent-3.3.15/src/icons/flags/bn.svg --- qbittorrent-4.1.3/src/icons/flags/bn.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/bn.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/bo.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/bo.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/bo.svg qbittorrent-3.3.15/src/icons/flags/bo.svg --- qbittorrent-4.1.3/src/icons/flags/bo.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/bo.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,686 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/flags/bq.svg qbittorrent-3.3.15/src/icons/flags/bq.svg --- qbittorrent-4.1.3/src/icons/flags/bq.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/bq.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/br.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/br.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/br.svg qbittorrent-3.3.15/src/icons/flags/br.svg --- qbittorrent-4.1.3/src/icons/flags/br.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/br.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/bs.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/bs.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/bs.svg qbittorrent-3.3.15/src/icons/flags/bs.svg --- qbittorrent-4.1.3/src/icons/flags/bs.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/bs.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/bt.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/bt.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/bt.svg qbittorrent-3.3.15/src/icons/flags/bt.svg --- qbittorrent-4.1.3/src/icons/flags/bt.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/bt.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/bv.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/bv.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/bv.svg qbittorrent-3.3.15/src/icons/flags/bv.svg --- qbittorrent-4.1.3/src/icons/flags/bv.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/bv.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/bw.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/bw.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/bw.svg qbittorrent-3.3.15/src/icons/flags/bw.svg --- qbittorrent-4.1.3/src/icons/flags/bw.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/bw.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/by.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/by.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/by.svg qbittorrent-3.3.15/src/icons/flags/by.svg --- qbittorrent-4.1.3/src/icons/flags/by.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/by.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/bz.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/bz.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/bz.svg qbittorrent-3.3.15/src/icons/flags/bz.svg --- qbittorrent-4.1.3/src/icons/flags/bz.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/bz.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,146 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ca.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ca.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ca.svg qbittorrent-3.3.15/src/icons/flags/ca.svg --- qbittorrent-4.1.3/src/icons/flags/ca.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ca.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/cc.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/cc.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/cc.svg qbittorrent-3.3.15/src/icons/flags/cc.svg --- qbittorrent-4.1.3/src/icons/flags/cc.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/cc.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/cd.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/cd.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/cd.svg qbittorrent-3.3.15/src/icons/flags/cd.svg --- qbittorrent-4.1.3/src/icons/flags/cd.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/cd.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/cf.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/cf.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/cf.svg qbittorrent-3.3.15/src/icons/flags/cf.svg --- qbittorrent-4.1.3/src/icons/flags/cf.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/cf.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/cg.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/cg.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/cg.svg qbittorrent-3.3.15/src/icons/flags/cg.svg --- qbittorrent-4.1.3/src/icons/flags/cg.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/cg.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ch.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ch.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ch.svg qbittorrent-3.3.15/src/icons/flags/ch.svg --- qbittorrent-4.1.3/src/icons/flags/ch.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ch.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ci.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ci.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ci.svg qbittorrent-3.3.15/src/icons/flags/ci.svg --- qbittorrent-4.1.3/src/icons/flags/ci.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ci.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ck.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ck.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ck.svg qbittorrent-3.3.15/src/icons/flags/ck.svg --- qbittorrent-4.1.3/src/icons/flags/ck.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ck.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/cl.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/cl.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/cl.svg qbittorrent-3.3.15/src/icons/flags/cl.svg --- qbittorrent-4.1.3/src/icons/flags/cl.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/cl.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/cm.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/cm.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/cm.svg qbittorrent-3.3.15/src/icons/flags/cm.svg --- qbittorrent-4.1.3/src/icons/flags/cm.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/cm.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/cn.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/cn.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/cn.svg qbittorrent-3.3.15/src/icons/flags/cn.svg --- qbittorrent-4.1.3/src/icons/flags/cn.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/cn.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/co.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/co.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/co.svg qbittorrent-3.3.15/src/icons/flags/co.svg --- qbittorrent-4.1.3/src/icons/flags/co.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/co.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/cr.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/cr.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/cr.svg qbittorrent-3.3.15/src/icons/flags/cr.svg --- qbittorrent-4.1.3/src/icons/flags/cr.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/cr.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/cs.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/cs.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/cu.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/cu.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/cu.svg qbittorrent-3.3.15/src/icons/flags/cu.svg --- qbittorrent-4.1.3/src/icons/flags/cu.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/cu.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/cv.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/cv.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/cv.svg qbittorrent-3.3.15/src/icons/flags/cv.svg --- qbittorrent-4.1.3/src/icons/flags/cv.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/cv.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/flags/cw.svg qbittorrent-3.3.15/src/icons/flags/cw.svg --- qbittorrent-4.1.3/src/icons/flags/cw.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/cw.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/cx.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/cx.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/cx.svg qbittorrent-3.3.15/src/icons/flags/cx.svg --- qbittorrent-4.1.3/src/icons/flags/cx.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/cx.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/cy.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/cy.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/cy.svg qbittorrent-3.3.15/src/icons/flags/cy.svg --- qbittorrent-4.1.3/src/icons/flags/cy.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/cy.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/cz.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/cz.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/cz.svg qbittorrent-3.3.15/src/icons/flags/cz.svg --- qbittorrent-4.1.3/src/icons/flags/cz.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/cz.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/de.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/de.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/de.svg qbittorrent-3.3.15/src/icons/flags/de.svg --- qbittorrent-4.1.3/src/icons/flags/de.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/de.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/dj.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/dj.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/dj.svg qbittorrent-3.3.15/src/icons/flags/dj.svg --- qbittorrent-4.1.3/src/icons/flags/dj.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/dj.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/dk.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/dk.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/dk.svg qbittorrent-3.3.15/src/icons/flags/dk.svg --- qbittorrent-4.1.3/src/icons/flags/dk.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/dk.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/dm.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/dm.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/dm.svg qbittorrent-3.3.15/src/icons/flags/dm.svg --- qbittorrent-4.1.3/src/icons/flags/dm.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/dm.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,152 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/do.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/do.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/do.svg qbittorrent-3.3.15/src/icons/flags/do.svg --- qbittorrent-4.1.3/src/icons/flags/do.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/do.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6745 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/dz.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/dz.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/dz.svg qbittorrent-3.3.15/src/icons/flags/dz.svg --- qbittorrent-4.1.3/src/icons/flags/dz.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/dz.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ec.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ec.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ec.svg qbittorrent-3.3.15/src/icons/flags/ec.svg --- qbittorrent-4.1.3/src/icons/flags/ec.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ec.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,141 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ee.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ee.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ee.svg qbittorrent-3.3.15/src/icons/flags/ee.svg --- qbittorrent-4.1.3/src/icons/flags/ee.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ee.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/eg.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/eg.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/eg.svg qbittorrent-3.3.15/src/icons/flags/eg.svg --- qbittorrent-4.1.3/src/icons/flags/eg.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/eg.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/eh.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/eh.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/eh.svg qbittorrent-3.3.15/src/icons/flags/eh.svg --- qbittorrent-4.1.3/src/icons/flags/eh.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/eh.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/er.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/er.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/er.svg qbittorrent-3.3.15/src/icons/flags/er.svg --- qbittorrent-4.1.3/src/icons/flags/er.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/er.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/es.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/es.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/es.svg qbittorrent-3.3.15/src/icons/flags/es.svg --- qbittorrent-4.1.3/src/icons/flags/es.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/es.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,581 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/et.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/et.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/et.svg qbittorrent-3.3.15/src/icons/flags/et.svg --- qbittorrent-4.1.3/src/icons/flags/et.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/et.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/fi.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/fi.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/fi.svg qbittorrent-3.3.15/src/icons/flags/fi.svg --- qbittorrent-4.1.3/src/icons/flags/fi.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/fi.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/fj.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/fj.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/fj.svg qbittorrent-3.3.15/src/icons/flags/fj.svg --- qbittorrent-4.1.3/src/icons/flags/fj.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/fj.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/fk.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/fk.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/fk.svg qbittorrent-3.3.15/src/icons/flags/fk.svg --- qbittorrent-4.1.3/src/icons/flags/fk.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/fk.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/fm.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/fm.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/fm.svg qbittorrent-3.3.15/src/icons/flags/fm.svg --- qbittorrent-4.1.3/src/icons/flags/fm.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/fm.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/fo.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/fo.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/fo.svg qbittorrent-3.3.15/src/icons/flags/fo.svg --- qbittorrent-4.1.3/src/icons/flags/fo.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/fo.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/fr.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/fr.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/fr.svg qbittorrent-3.3.15/src/icons/flags/fr.svg --- qbittorrent-4.1.3/src/icons/flags/fr.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/fr.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ga.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ga.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ga.svg qbittorrent-3.3.15/src/icons/flags/ga.svg --- qbittorrent-4.1.3/src/icons/flags/ga.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ga.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/gb.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/gb.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/gb.svg qbittorrent-3.3.15/src/icons/flags/gb.svg --- qbittorrent-4.1.3/src/icons/flags/gb.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/gb.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/gd.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/gd.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/gd.svg qbittorrent-3.3.15/src/icons/flags/gd.svg --- qbittorrent-4.1.3/src/icons/flags/gd.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/gd.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ge.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ge.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ge.svg qbittorrent-3.3.15/src/icons/flags/ge.svg --- qbittorrent-4.1.3/src/icons/flags/ge.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ge.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/gf.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/gf.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/gf.svg qbittorrent-3.3.15/src/icons/flags/gf.svg --- qbittorrent-4.1.3/src/icons/flags/gf.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/gf.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - - - diff -Nru qbittorrent-4.1.3/src/icons/flags/gg.svg qbittorrent-3.3.15/src/icons/flags/gg.svg --- qbittorrent-4.1.3/src/icons/flags/gg.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/gg.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/gh.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/gh.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/gh.svg qbittorrent-3.3.15/src/icons/flags/gh.svg --- qbittorrent-4.1.3/src/icons/flags/gh.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/gh.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/gi.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/gi.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/gi.svg qbittorrent-3.3.15/src/icons/flags/gi.svg --- qbittorrent-4.1.3/src/icons/flags/gi.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/gi.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/gl.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/gl.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/gl.svg qbittorrent-3.3.15/src/icons/flags/gl.svg --- qbittorrent-4.1.3/src/icons/flags/gl.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/gl.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/gm.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/gm.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/gm.svg qbittorrent-3.3.15/src/icons/flags/gm.svg --- qbittorrent-4.1.3/src/icons/flags/gm.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/gm.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/gn.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/gn.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/gn.svg qbittorrent-3.3.15/src/icons/flags/gn.svg --- qbittorrent-4.1.3/src/icons/flags/gn.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/gn.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/gp.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/gp.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/gp.svg qbittorrent-3.3.15/src/icons/flags/gp.svg --- qbittorrent-4.1.3/src/icons/flags/gp.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/gp.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/gq.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/gq.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/gq.svg qbittorrent-3.3.15/src/icons/flags/gq.svg --- qbittorrent-4.1.3/src/icons/flags/gq.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/gq.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/gr.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/gr.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/gr.svg qbittorrent-3.3.15/src/icons/flags/gr.svg --- qbittorrent-4.1.3/src/icons/flags/gr.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/gr.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/gs.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/gs.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/gs.svg qbittorrent-3.3.15/src/icons/flags/gs.svg --- qbittorrent-4.1.3/src/icons/flags/gs.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/gs.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,205 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - L - - - E - - - O - - - T - - - E - - - R - - - R - - - R - - - R - - - R - - - E - - - O - - - O - - - A - - - A - - - A - - - M - - - P - - - P - - - P - - - I - - - T - - - T - - - M - - - G - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/gt.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/gt.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/gt.svg qbittorrent-3.3.15/src/icons/flags/gt.svg --- qbittorrent-4.1.3/src/icons/flags/gt.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/gt.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,204 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/gu.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/gu.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/gu.svg qbittorrent-3.3.15/src/icons/flags/gu.svg --- qbittorrent-4.1.3/src/icons/flags/gu.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/gu.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ - - - - - - - - - - - G - - - U - - - A - - - M - - - - - - - - G - - - U - - - A - - - M - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/gw.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/gw.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/gw.svg qbittorrent-3.3.15/src/icons/flags/gw.svg --- qbittorrent-4.1.3/src/icons/flags/gw.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/gw.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/gy.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/gy.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/gy.svg qbittorrent-3.3.15/src/icons/flags/gy.svg --- qbittorrent-4.1.3/src/icons/flags/gy.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/gy.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/hk.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/hk.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/hk.svg qbittorrent-3.3.15/src/icons/flags/hk.svg --- qbittorrent-4.1.3/src/icons/flags/hk.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/hk.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/hm.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/hm.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/hm.svg qbittorrent-3.3.15/src/icons/flags/hm.svg --- qbittorrent-4.1.3/src/icons/flags/hm.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/hm.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/hn.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/hn.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/hn.svg qbittorrent-3.3.15/src/icons/flags/hn.svg --- qbittorrent-4.1.3/src/icons/flags/hn.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/hn.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/hr.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/hr.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/hr.svg qbittorrent-3.3.15/src/icons/flags/hr.svg --- qbittorrent-4.1.3/src/icons/flags/hr.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/hr.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ht.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ht.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ht.svg qbittorrent-3.3.15/src/icons/flags/ht.svg --- qbittorrent-4.1.3/src/icons/flags/ht.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ht.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/hu.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/hu.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/hu.svg qbittorrent-3.3.15/src/icons/flags/hu.svg --- qbittorrent-4.1.3/src/icons/flags/hu.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/hu.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/flags/icons-set-readme.txt qbittorrent-3.3.15/src/icons/flags/icons-set-readme.txt --- qbittorrent-4.1.3/src/icons/flags/icons-set-readme.txt 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/icons-set-readme.txt 2017-08-03 20:30:10.000000000 +0000 @@ -1,23 +1,9 @@ -flag-icon-css - https://github.com/lipis/flag-icon-css +Flag icons - http://www.famfamfam.com -The MIT License (MIT) +These icons are public domain, and as such are free for any use (attribution appreciated but not required). -Copyright (c) 2013 Panayiotis Lipiridis +Note that these flags are named using the ISO3166-1 alpha-2 country codes where appropriate. A list of codes can be found at http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: +If you find these icons useful, please donate via paypal to mjames@gmail.com (or click the donate button available at http://www.famfamfam.com/lab/icons/silk) -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file +Contact: mjames@gmail.com \ No newline at end of file Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/id.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/id.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/id.svg qbittorrent-3.3.15/src/icons/flags/id.svg --- qbittorrent-4.1.3/src/icons/flags/id.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/id.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ie.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ie.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ie.svg qbittorrent-3.3.15/src/icons/flags/ie.svg --- qbittorrent-4.1.3/src/icons/flags/ie.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ie.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/il.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/il.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/il.svg qbittorrent-3.3.15/src/icons/flags/il.svg --- qbittorrent-4.1.3/src/icons/flags/il.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/il.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/flags/im.svg qbittorrent-3.3.15/src/icons/flags/im.svg --- qbittorrent-4.1.3/src/icons/flags/im.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/im.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/in.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/in.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/in.svg qbittorrent-3.3.15/src/icons/flags/in.svg --- qbittorrent-4.1.3/src/icons/flags/in.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/in.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/io.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/io.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/io.svg qbittorrent-3.3.15/src/icons/flags/io.svg --- qbittorrent-4.1.3/src/icons/flags/io.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/io.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,138 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/iq.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/iq.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/iq.svg qbittorrent-3.3.15/src/icons/flags/iq.svg --- qbittorrent-4.1.3/src/icons/flags/iq.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/iq.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ir.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ir.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ir.svg qbittorrent-3.3.15/src/icons/flags/ir.svg --- qbittorrent-4.1.3/src/icons/flags/ir.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ir.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,219 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/is.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/is.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/is.svg qbittorrent-3.3.15/src/icons/flags/is.svg --- qbittorrent-4.1.3/src/icons/flags/is.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/is.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/it.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/it.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/it.svg qbittorrent-3.3.15/src/icons/flags/it.svg --- qbittorrent-4.1.3/src/icons/flags/it.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/it.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/flags/je.svg qbittorrent-3.3.15/src/icons/flags/je.svg --- qbittorrent-4.1.3/src/icons/flags/je.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/je.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/jm.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/jm.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/jm.svg qbittorrent-3.3.15/src/icons/flags/jm.svg --- qbittorrent-4.1.3/src/icons/flags/jm.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/jm.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/jo.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/jo.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/jo.svg qbittorrent-3.3.15/src/icons/flags/jo.svg --- qbittorrent-4.1.3/src/icons/flags/jo.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/jo.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/jp.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/jp.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/jp.svg qbittorrent-3.3.15/src/icons/flags/jp.svg --- qbittorrent-4.1.3/src/icons/flags/jp.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/jp.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ke.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ke.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ke.svg qbittorrent-3.3.15/src/icons/flags/ke.svg --- qbittorrent-4.1.3/src/icons/flags/ke.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ke.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/kg.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/kg.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/kg.svg qbittorrent-3.3.15/src/icons/flags/kg.svg --- qbittorrent-4.1.3/src/icons/flags/kg.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/kg.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/kh.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/kh.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/kh.svg qbittorrent-3.3.15/src/icons/flags/kh.svg --- qbittorrent-4.1.3/src/icons/flags/kh.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/kh.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ki.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ki.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ki.svg qbittorrent-3.3.15/src/icons/flags/ki.svg --- qbittorrent-4.1.3/src/icons/flags/ki.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ki.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/km.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/km.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/km.svg qbittorrent-3.3.15/src/icons/flags/km.svg --- qbittorrent-4.1.3/src/icons/flags/km.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/km.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/kn.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/kn.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/kn.svg qbittorrent-3.3.15/src/icons/flags/kn.svg --- qbittorrent-4.1.3/src/icons/flags/kn.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/kn.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/kp.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/kp.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/kp.svg qbittorrent-3.3.15/src/icons/flags/kp.svg --- qbittorrent-4.1.3/src/icons/flags/kp.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/kp.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/kr.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/kr.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/kr.svg qbittorrent-3.3.15/src/icons/flags/kr.svg --- qbittorrent-4.1.3/src/icons/flags/kr.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/kr.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/kw.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/kw.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/kw.svg qbittorrent-3.3.15/src/icons/flags/kw.svg --- qbittorrent-4.1.3/src/icons/flags/kw.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/kw.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ky.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ky.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ky.svg qbittorrent-3.3.15/src/icons/flags/ky.svg --- qbittorrent-4.1.3/src/icons/flags/ky.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ky.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/kz.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/kz.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/kz.svg qbittorrent-3.3.15/src/icons/flags/kz.svg --- qbittorrent-4.1.3/src/icons/flags/kz.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/kz.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/la.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/la.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/la.svg qbittorrent-3.3.15/src/icons/flags/la.svg --- qbittorrent-4.1.3/src/icons/flags/la.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/la.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/lb.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/lb.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/lb.svg qbittorrent-3.3.15/src/icons/flags/lb.svg --- qbittorrent-4.1.3/src/icons/flags/lb.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/lb.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/lc.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/lc.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/lc.svg qbittorrent-3.3.15/src/icons/flags/lc.svg --- qbittorrent-4.1.3/src/icons/flags/lc.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/lc.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/li.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/li.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/li.svg qbittorrent-3.3.15/src/icons/flags/li.svg --- qbittorrent-4.1.3/src/icons/flags/li.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/li.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/lk.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/lk.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/lk.svg qbittorrent-3.3.15/src/icons/flags/lk.svg --- qbittorrent-4.1.3/src/icons/flags/lk.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/lk.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/lr.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/lr.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/lr.svg qbittorrent-3.3.15/src/icons/flags/lr.svg --- qbittorrent-4.1.3/src/icons/flags/lr.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/lr.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ls.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ls.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ls.svg qbittorrent-3.3.15/src/icons/flags/ls.svg --- qbittorrent-4.1.3/src/icons/flags/ls.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ls.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/lt.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/lt.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/lt.svg qbittorrent-3.3.15/src/icons/flags/lt.svg --- qbittorrent-4.1.3/src/icons/flags/lt.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/lt.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/lu.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/lu.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/lu.svg qbittorrent-3.3.15/src/icons/flags/lu.svg --- qbittorrent-4.1.3/src/icons/flags/lu.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/lu.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/lv.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/lv.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/lv.svg qbittorrent-3.3.15/src/icons/flags/lv.svg --- qbittorrent-4.1.3/src/icons/flags/lv.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/lv.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ly.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ly.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ly.svg qbittorrent-3.3.15/src/icons/flags/ly.svg --- qbittorrent-4.1.3/src/icons/flags/ly.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ly.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ma.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ma.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ma.svg qbittorrent-3.3.15/src/icons/flags/ma.svg --- qbittorrent-4.1.3/src/icons/flags/ma.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ma.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/mc.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/mc.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/mc.svg qbittorrent-3.3.15/src/icons/flags/mc.svg --- qbittorrent-4.1.3/src/icons/flags/mc.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/mc.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/md.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/md.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/md.svg qbittorrent-3.3.15/src/icons/flags/md.svg --- qbittorrent-4.1.3/src/icons/flags/md.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/md.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/me.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/me.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/me.svg qbittorrent-3.3.15/src/icons/flags/me.svg --- qbittorrent-4.1.3/src/icons/flags/me.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/me.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,118 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/flags/mf.svg qbittorrent-3.3.15/src/icons/flags/mf.svg --- qbittorrent-4.1.3/src/icons/flags/mf.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/mf.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/mg.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/mg.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/mg.svg qbittorrent-3.3.15/src/icons/flags/mg.svg --- qbittorrent-4.1.3/src/icons/flags/mg.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/mg.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/mh.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/mh.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/mh.svg qbittorrent-3.3.15/src/icons/flags/mh.svg --- qbittorrent-4.1.3/src/icons/flags/mh.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/mh.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/mk.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/mk.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/mk.svg qbittorrent-3.3.15/src/icons/flags/mk.svg --- qbittorrent-4.1.3/src/icons/flags/mk.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/mk.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ml.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ml.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ml.svg qbittorrent-3.3.15/src/icons/flags/ml.svg --- qbittorrent-4.1.3/src/icons/flags/ml.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ml.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/mm.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/mm.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/mm.svg qbittorrent-3.3.15/src/icons/flags/mm.svg --- qbittorrent-4.1.3/src/icons/flags/mm.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/mm.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/mn.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/mn.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/mn.svg qbittorrent-3.3.15/src/icons/flags/mn.svg --- qbittorrent-4.1.3/src/icons/flags/mn.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/mn.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/mo.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/mo.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/mo.svg qbittorrent-3.3.15/src/icons/flags/mo.svg --- qbittorrent-4.1.3/src/icons/flags/mo.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/mo.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/mp.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/mp.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/mp.svg qbittorrent-3.3.15/src/icons/flags/mp.svg --- qbittorrent-4.1.3/src/icons/flags/mp.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/mp.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,86 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/mq.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/mq.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/mq.svg qbittorrent-3.3.15/src/icons/flags/mq.svg --- qbittorrent-4.1.3/src/icons/flags/mq.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/mq.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/mr.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/mr.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/mr.svg qbittorrent-3.3.15/src/icons/flags/mr.svg --- qbittorrent-4.1.3/src/icons/flags/mr.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/mr.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ms.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ms.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ms.svg qbittorrent-3.3.15/src/icons/flags/ms.svg --- qbittorrent-4.1.3/src/icons/flags/ms.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ms.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/mt.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/mt.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/mt.svg qbittorrent-3.3.15/src/icons/flags/mt.svg --- qbittorrent-4.1.3/src/icons/flags/mt.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/mt.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/mu.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/mu.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/mu.svg qbittorrent-3.3.15/src/icons/flags/mu.svg --- qbittorrent-4.1.3/src/icons/flags/mu.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/mu.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/mv.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/mv.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/mv.svg qbittorrent-3.3.15/src/icons/flags/mv.svg --- qbittorrent-4.1.3/src/icons/flags/mv.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/mv.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/mw.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/mw.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/mw.svg qbittorrent-3.3.15/src/icons/flags/mw.svg --- qbittorrent-4.1.3/src/icons/flags/mw.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/mw.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/mx.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/mx.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/mx.svg qbittorrent-3.3.15/src/icons/flags/mx.svg --- qbittorrent-4.1.3/src/icons/flags/mx.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/mx.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,385 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/my.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/my.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/my.svg qbittorrent-3.3.15/src/icons/flags/my.svg --- qbittorrent-4.1.3/src/icons/flags/my.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/my.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/mz.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/mz.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/mz.svg qbittorrent-3.3.15/src/icons/flags/mz.svg --- qbittorrent-4.1.3/src/icons/flags/mz.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/mz.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/na.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/na.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/na.svg qbittorrent-3.3.15/src/icons/flags/na.svg --- qbittorrent-4.1.3/src/icons/flags/na.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/na.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/nc.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/nc.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/nc.svg qbittorrent-3.3.15/src/icons/flags/nc.svg --- qbittorrent-4.1.3/src/icons/flags/nc.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/nc.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ne.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ne.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ne.svg qbittorrent-3.3.15/src/icons/flags/ne.svg --- qbittorrent-4.1.3/src/icons/flags/ne.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ne.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/nf.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/nf.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/nf.svg qbittorrent-3.3.15/src/icons/flags/nf.svg --- qbittorrent-4.1.3/src/icons/flags/nf.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/nf.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ng.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ng.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ng.svg qbittorrent-3.3.15/src/icons/flags/ng.svg --- qbittorrent-4.1.3/src/icons/flags/ng.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ng.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ni.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ni.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ni.svg qbittorrent-3.3.15/src/icons/flags/ni.svg --- qbittorrent-4.1.3/src/icons/flags/ni.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ni.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/nl.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/nl.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/nl.svg qbittorrent-3.3.15/src/icons/flags/nl.svg --- qbittorrent-4.1.3/src/icons/flags/nl.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/nl.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/no.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/no.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/no.svg qbittorrent-3.3.15/src/icons/flags/no.svg --- qbittorrent-4.1.3/src/icons/flags/no.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/no.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/np.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/np.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/np.svg qbittorrent-3.3.15/src/icons/flags/np.svg --- qbittorrent-4.1.3/src/icons/flags/np.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/np.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/nr.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/nr.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/nr.svg qbittorrent-3.3.15/src/icons/flags/nr.svg --- qbittorrent-4.1.3/src/icons/flags/nr.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/nr.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,12 +0,0 @@ - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/nu.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/nu.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/nu.svg qbittorrent-3.3.15/src/icons/flags/nu.svg --- qbittorrent-4.1.3/src/icons/flags/nu.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/nu.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/nz.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/nz.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/nz.svg qbittorrent-3.3.15/src/icons/flags/nz.svg --- qbittorrent-4.1.3/src/icons/flags/nz.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/nz.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/om.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/om.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/om.svg qbittorrent-3.3.15/src/icons/flags/om.svg --- qbittorrent-4.1.3/src/icons/flags/om.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/om.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/pa.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/pa.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/pa.svg qbittorrent-3.3.15/src/icons/flags/pa.svg --- qbittorrent-4.1.3/src/icons/flags/pa.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/pa.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/pe.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/pe.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/pe.svg qbittorrent-3.3.15/src/icons/flags/pe.svg --- qbittorrent-4.1.3/src/icons/flags/pe.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/pe.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,244 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/pf.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/pf.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/pf.svg qbittorrent-3.3.15/src/icons/flags/pf.svg --- qbittorrent-4.1.3/src/icons/flags/pf.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/pf.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/pg.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/pg.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/pg.svg qbittorrent-3.3.15/src/icons/flags/pg.svg --- qbittorrent-4.1.3/src/icons/flags/pg.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/pg.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ph.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ph.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ph.svg qbittorrent-3.3.15/src/icons/flags/ph.svg --- qbittorrent-4.1.3/src/icons/flags/ph.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ph.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/pk.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/pk.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/pk.svg qbittorrent-3.3.15/src/icons/flags/pk.svg --- qbittorrent-4.1.3/src/icons/flags/pk.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/pk.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/pl.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/pl.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/pl.svg qbittorrent-3.3.15/src/icons/flags/pl.svg --- qbittorrent-4.1.3/src/icons/flags/pl.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/pl.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/pm.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/pm.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/pm.svg qbittorrent-3.3.15/src/icons/flags/pm.svg --- qbittorrent-4.1.3/src/icons/flags/pm.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/pm.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/pn.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/pn.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/pn.svg qbittorrent-3.3.15/src/icons/flags/pn.svg --- qbittorrent-4.1.3/src/icons/flags/pn.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/pn.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/pr.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/pr.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/pr.svg qbittorrent-3.3.15/src/icons/flags/pr.svg --- qbittorrent-4.1.3/src/icons/flags/pr.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/pr.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ps.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ps.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ps.svg qbittorrent-3.3.15/src/icons/flags/ps.svg --- qbittorrent-4.1.3/src/icons/flags/ps.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ps.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/pt.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/pt.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/pt.svg qbittorrent-3.3.15/src/icons/flags/pt.svg --- qbittorrent-4.1.3/src/icons/flags/pt.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/pt.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/pw.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/pw.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/pw.svg qbittorrent-3.3.15/src/icons/flags/pw.svg --- qbittorrent-4.1.3/src/icons/flags/pw.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/pw.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/py.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/py.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/py.svg qbittorrent-3.3.15/src/icons/flags/py.svg --- qbittorrent-4.1.3/src/icons/flags/py.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/py.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,157 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/qa.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/qa.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/qa.svg qbittorrent-3.3.15/src/icons/flags/qa.svg --- qbittorrent-4.1.3/src/icons/flags/qa.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/qa.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/re.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/re.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/re.svg qbittorrent-3.3.15/src/icons/flags/re.svg --- qbittorrent-4.1.3/src/icons/flags/re.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/re.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ro.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ro.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ro.svg qbittorrent-3.3.15/src/icons/flags/ro.svg --- qbittorrent-4.1.3/src/icons/flags/ro.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ro.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/rs.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/rs.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/rs.svg qbittorrent-3.3.15/src/icons/flags/rs.svg --- qbittorrent-4.1.3/src/icons/flags/rs.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/rs.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,292 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ru.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ru.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ru.svg qbittorrent-3.3.15/src/icons/flags/ru.svg --- qbittorrent-4.1.3/src/icons/flags/ru.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ru.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/rw.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/rw.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/rw.svg qbittorrent-3.3.15/src/icons/flags/rw.svg --- qbittorrent-4.1.3/src/icons/flags/rw.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/rw.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/sa.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/sa.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/sa.svg qbittorrent-3.3.15/src/icons/flags/sa.svg --- qbittorrent-4.1.3/src/icons/flags/sa.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/sa.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/sb.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/sb.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/sb.svg qbittorrent-3.3.15/src/icons/flags/sb.svg --- qbittorrent-4.1.3/src/icons/flags/sb.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/sb.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/sc.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/sc.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/sc.svg qbittorrent-3.3.15/src/icons/flags/sc.svg --- qbittorrent-4.1.3/src/icons/flags/sc.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/sc.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/sd.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/sd.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/sd.svg qbittorrent-3.3.15/src/icons/flags/sd.svg --- qbittorrent-4.1.3/src/icons/flags/sd.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/sd.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/se.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/se.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/se.svg qbittorrent-3.3.15/src/icons/flags/se.svg --- qbittorrent-4.1.3/src/icons/flags/se.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/se.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/sg.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/sg.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/sg.svg qbittorrent-3.3.15/src/icons/flags/sg.svg --- qbittorrent-4.1.3/src/icons/flags/sg.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/sg.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/sh.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/sh.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/sh.svg qbittorrent-3.3.15/src/icons/flags/sh.svg --- qbittorrent-4.1.3/src/icons/flags/sh.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/sh.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/si.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/si.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/si.svg qbittorrent-3.3.15/src/icons/flags/si.svg --- qbittorrent-4.1.3/src/icons/flags/si.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/si.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/sj.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/sj.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/sj.svg qbittorrent-3.3.15/src/icons/flags/sj.svg --- qbittorrent-4.1.3/src/icons/flags/sj.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/sj.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/sk.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/sk.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/sk.svg qbittorrent-3.3.15/src/icons/flags/sk.svg --- qbittorrent-4.1.3/src/icons/flags/sk.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/sk.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/sl.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/sl.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/sl.svg qbittorrent-3.3.15/src/icons/flags/sl.svg --- qbittorrent-4.1.3/src/icons/flags/sl.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/sl.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/sm.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/sm.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/sm.svg qbittorrent-3.3.15/src/icons/flags/sm.svg --- qbittorrent-4.1.3/src/icons/flags/sm.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/sm.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - L - - - I - - - B - - - E - - - R - - - T - - - A - - - S - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/sn.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/sn.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/sn.svg qbittorrent-3.3.15/src/icons/flags/sn.svg --- qbittorrent-4.1.3/src/icons/flags/sn.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/sn.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/so.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/so.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/so.svg qbittorrent-3.3.15/src/icons/flags/so.svg --- qbittorrent-4.1.3/src/icons/flags/so.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/so.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/sr.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/sr.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/sr.svg qbittorrent-3.3.15/src/icons/flags/sr.svg --- qbittorrent-4.1.3/src/icons/flags/sr.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/sr.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/flags/ss.svg qbittorrent-3.3.15/src/icons/flags/ss.svg --- qbittorrent-4.1.3/src/icons/flags/ss.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ss.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/st.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/st.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/st.svg qbittorrent-3.3.15/src/icons/flags/st.svg --- qbittorrent-4.1.3/src/icons/flags/st.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/st.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/sv.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/sv.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/sv.svg qbittorrent-3.3.15/src/icons/flags/sv.svg --- qbittorrent-4.1.3/src/icons/flags/sv.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/sv.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,598 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/flags/sx.svg qbittorrent-3.3.15/src/icons/flags/sx.svg --- qbittorrent-4.1.3/src/icons/flags/sx.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/sx.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/sy.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/sy.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/sy.svg qbittorrent-3.3.15/src/icons/flags/sy.svg --- qbittorrent-4.1.3/src/icons/flags/sy.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/sy.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/sz.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/sz.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/sz.svg qbittorrent-3.3.15/src/icons/flags/sz.svg --- qbittorrent-4.1.3/src/icons/flags/sz.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/sz.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/tc.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/tc.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/tc.svg qbittorrent-3.3.15/src/icons/flags/tc.svg --- qbittorrent-4.1.3/src/icons/flags/tc.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/tc.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/td.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/td.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/td.svg qbittorrent-3.3.15/src/icons/flags/td.svg --- qbittorrent-4.1.3/src/icons/flags/td.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/td.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/tf.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/tf.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/tf.svg qbittorrent-3.3.15/src/icons/flags/tf.svg --- qbittorrent-4.1.3/src/icons/flags/tf.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/tf.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/tg.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/tg.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/tg.svg qbittorrent-3.3.15/src/icons/flags/tg.svg --- qbittorrent-4.1.3/src/icons/flags/tg.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/tg.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/th.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/th.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/th.svg qbittorrent-3.3.15/src/icons/flags/th.svg --- qbittorrent-4.1.3/src/icons/flags/th.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/th.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/tj.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/tj.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/tj.svg qbittorrent-3.3.15/src/icons/flags/tj.svg --- qbittorrent-4.1.3/src/icons/flags/tj.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/tj.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/tk.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/tk.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/tk.svg qbittorrent-3.3.15/src/icons/flags/tk.svg --- qbittorrent-4.1.3/src/icons/flags/tk.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/tk.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/tl.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/tl.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/tl.svg qbittorrent-3.3.15/src/icons/flags/tl.svg --- qbittorrent-4.1.3/src/icons/flags/tl.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/tl.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/tm.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/tm.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/tm.svg qbittorrent-3.3.15/src/icons/flags/tm.svg --- qbittorrent-4.1.3/src/icons/flags/tm.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/tm.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,210 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/tn.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/tn.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/tn.svg qbittorrent-3.3.15/src/icons/flags/tn.svg --- qbittorrent-4.1.3/src/icons/flags/tn.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/tn.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/to.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/to.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/to.svg qbittorrent-3.3.15/src/icons/flags/to.svg --- qbittorrent-4.1.3/src/icons/flags/to.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/to.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/tr.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/tr.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/tr.svg qbittorrent-3.3.15/src/icons/flags/tr.svg --- qbittorrent-4.1.3/src/icons/flags/tr.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/tr.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/tt.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/tt.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/tt.svg qbittorrent-3.3.15/src/icons/flags/tt.svg --- qbittorrent-4.1.3/src/icons/flags/tt.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/tt.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/tv.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/tv.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/tv.svg qbittorrent-3.3.15/src/icons/flags/tv.svg --- qbittorrent-4.1.3/src/icons/flags/tv.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/tv.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/tw.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/tw.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/tw.svg qbittorrent-3.3.15/src/icons/flags/tw.svg --- qbittorrent-4.1.3/src/icons/flags/tw.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/tw.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/tz.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/tz.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/tz.svg qbittorrent-3.3.15/src/icons/flags/tz.svg --- qbittorrent-4.1.3/src/icons/flags/tz.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/tz.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ua.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ua.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ua.svg qbittorrent-3.3.15/src/icons/flags/ua.svg --- qbittorrent-4.1.3/src/icons/flags/ua.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ua.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ug.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ug.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ug.svg qbittorrent-3.3.15/src/icons/flags/ug.svg --- qbittorrent-4.1.3/src/icons/flags/ug.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ug.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/um.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/um.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/um.svg qbittorrent-3.3.15/src/icons/flags/um.svg --- qbittorrent-4.1.3/src/icons/flags/um.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/um.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/us.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/us.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/us.svg qbittorrent-3.3.15/src/icons/flags/us.svg --- qbittorrent-4.1.3/src/icons/flags/us.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/us.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/uy.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/uy.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/uy.svg qbittorrent-3.3.15/src/icons/flags/uy.svg --- qbittorrent-4.1.3/src/icons/flags/uy.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/uy.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/uz.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/uz.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/uz.svg qbittorrent-3.3.15/src/icons/flags/uz.svg --- qbittorrent-4.1.3/src/icons/flags/uz.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/uz.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/va.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/va.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/va.svg qbittorrent-3.3.15/src/icons/flags/va.svg --- qbittorrent-4.1.3/src/icons/flags/va.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/va.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,483 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/vc.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/vc.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/vc.svg qbittorrent-3.3.15/src/icons/flags/vc.svg --- qbittorrent-4.1.3/src/icons/flags/vc.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/vc.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ve.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ve.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ve.svg qbittorrent-3.3.15/src/icons/flags/ve.svg --- qbittorrent-4.1.3/src/icons/flags/ve.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ve.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/vg.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/vg.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/vg.svg qbittorrent-3.3.15/src/icons/flags/vg.svg --- qbittorrent-4.1.3/src/icons/flags/vg.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/vg.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/vi.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/vi.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/vi.svg qbittorrent-3.3.15/src/icons/flags/vi.svg --- qbittorrent-4.1.3/src/icons/flags/vi.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/vi.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/vn.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/vn.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/vn.svg qbittorrent-3.3.15/src/icons/flags/vn.svg --- qbittorrent-4.1.3/src/icons/flags/vn.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/vn.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/vu.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/vu.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/vu.svg qbittorrent-3.3.15/src/icons/flags/vu.svg --- qbittorrent-4.1.3/src/icons/flags/vu.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/vu.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/wf.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/wf.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/wf.svg qbittorrent-3.3.15/src/icons/flags/wf.svg --- qbittorrent-4.1.3/src/icons/flags/wf.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/wf.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ws.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ws.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ws.svg qbittorrent-3.3.15/src/icons/flags/ws.svg --- qbittorrent-4.1.3/src/icons/flags/ws.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ws.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/ye.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/ye.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/ye.svg qbittorrent-3.3.15/src/icons/flags/ye.svg --- qbittorrent-4.1.3/src/icons/flags/ye.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/ye.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/yt.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/yt.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/yt.svg qbittorrent-3.3.15/src/icons/flags/yt.svg --- qbittorrent-4.1.3/src/icons/flags/yt.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/yt.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/za.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/za.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/za.svg qbittorrent-3.3.15/src/icons/flags/za.svg --- qbittorrent-4.1.3/src/icons/flags/za.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/za.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/zm.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/zm.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/zm.svg qbittorrent-3.3.15/src/icons/flags/zm.svg --- qbittorrent-4.1.3/src/icons/flags/zm.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/zm.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/flags/zw.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/flags/zw.png differ diff -Nru qbittorrent-4.1.3/src/icons/flags/zw.svg qbittorrent-3.3.15/src/icons/flags/zw.svg --- qbittorrent-4.1.3/src/icons/flags/zw.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/flags/zw.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/icons.qrc qbittorrent-3.3.15/src/icons/icons.qrc --- qbittorrent-4.1.3/src/icons/icons.qrc 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/icons.qrc 1970-01-01 00:00:00.000000000 +0000 @@ -1,386 +0,0 @@ - - - 3-state-checkbox.gif - flags/ad.svg - flags/ae.svg - flags/af.svg - flags/ag.svg - flags/ai.svg - flags/al.svg - flags/am.svg - flags/ao.svg - flags/aq.svg - flags/ar.svg - flags/as.svg - flags/at.svg - flags/au.svg - flags/aw.svg - flags/ax.svg - flags/az.svg - flags/ba.svg - flags/bb.svg - flags/bd.svg - flags/be.svg - flags/bf.svg - flags/bg.svg - flags/bh.svg - flags/bi.svg - flags/bj.svg - flags/bl.svg - flags/bm.svg - flags/bn.svg - flags/bo.svg - flags/bq.svg - flags/br.svg - flags/bs.svg - flags/bt.svg - flags/bv.svg - flags/bw.svg - flags/by.svg - flags/bz.svg - flags/ca.svg - flags/cc.svg - flags/cd.svg - flags/cf.svg - flags/cg.svg - flags/ch.svg - flags/ci.svg - flags/ck.svg - flags/cl.svg - flags/cm.svg - flags/cn.svg - flags/co.svg - flags/cr.svg - flags/cu.svg - flags/cv.svg - flags/cw.svg - flags/cx.svg - flags/cy.svg - flags/cz.svg - flags/de.svg - flags/dj.svg - flags/dk.svg - flags/dm.svg - flags/do.svg - flags/dz.svg - flags/ec.svg - flags/ee.svg - flags/eg.svg - flags/eh.svg - flags/er.svg - flags/es.svg - flags/et.svg - flags/fi.svg - flags/fj.svg - flags/fk.svg - flags/fm.svg - flags/fo.svg - flags/fr.svg - flags/ga.svg - flags/gb.svg - flags/gd.svg - flags/ge.svg - flags/gf.svg - flags/gg.svg - flags/gh.svg - flags/gi.svg - flags/gl.svg - flags/gm.svg - flags/gn.svg - flags/gp.svg - flags/gq.svg - flags/gr.svg - flags/gs.svg - flags/gt.svg - flags/gu.svg - flags/gw.svg - flags/gy.svg - flags/hk.svg - flags/hm.svg - flags/hn.svg - flags/hr.svg - flags/ht.svg - flags/hu.svg - flags/id.svg - flags/ie.svg - flags/il.svg - flags/im.svg - flags/in.svg - flags/io.svg - flags/iq.svg - flags/ir.svg - flags/is.svg - flags/it.svg - flags/je.svg - flags/jm.svg - flags/jo.svg - flags/jp.svg - flags/ke.svg - flags/kg.svg - flags/kh.svg - flags/ki.svg - flags/km.svg - flags/kn.svg - flags/kp.svg - flags/kr.svg - flags/kw.svg - flags/ky.svg - flags/kz.svg - flags/la.svg - flags/lb.svg - flags/lc.svg - flags/li.svg - flags/lk.svg - flags/lr.svg - flags/ls.svg - flags/lt.svg - flags/lu.svg - flags/lv.svg - flags/ly.svg - flags/ma.svg - flags/mc.svg - flags/md.svg - flags/me.svg - flags/mg.svg - flags/mh.svg - flags/mk.svg - flags/ml.svg - flags/mm.svg - flags/mn.svg - flags/mo.svg - flags/mp.svg - flags/mq.svg - flags/mr.svg - flags/ms.svg - flags/mt.svg - flags/mu.svg - flags/mv.svg - flags/mw.svg - flags/mx.svg - flags/my.svg - flags/mz.svg - flags/na.svg - flags/nc.svg - flags/ne.svg - flags/nf.svg - flags/ng.svg - flags/ni.svg - flags/nl.svg - flags/no.svg - flags/np.svg - flags/nr.svg - flags/nu.svg - flags/nz.svg - flags/om.svg - flags/pa.svg - flags/pe.svg - flags/pf.svg - flags/pg.svg - flags/ph.svg - flags/pk.svg - flags/pl.svg - flags/pm.svg - flags/pn.svg - flags/pr.svg - flags/ps.svg - flags/pt.svg - flags/pw.svg - flags/py.svg - flags/qa.svg - flags/re.svg - flags/ro.svg - flags/rs.svg - flags/ru.svg - flags/rw.svg - flags/sa.svg - flags/sb.svg - flags/sc.svg - flags/sd.svg - flags/se.svg - flags/sg.svg - flags/sh.svg - flags/si.svg - flags/sj.svg - flags/sk.svg - flags/sl.svg - flags/sm.svg - flags/sn.svg - flags/so.svg - flags/sr.svg - flags/ss.svg - flags/st.svg - flags/sv.svg - flags/sx.svg - flags/sy.svg - flags/sz.svg - flags/tc.svg - flags/td.svg - flags/tf.svg - flags/tg.svg - flags/th.svg - flags/tj.svg - flags/tk.svg - flags/tl.svg - flags/tm.svg - flags/tn.svg - flags/to.svg - flags/tr.svg - flags/tt.svg - flags/tv.svg - flags/tw.svg - flags/tz.svg - flags/ua.svg - flags/ug.svg - flags/um.svg - flags/us.svg - flags/uy.svg - flags/uz.svg - flags/va.svg - flags/vc.svg - flags/ve.svg - flags/vg.svg - flags/vi.svg - flags/vn.svg - flags/vu.svg - flags/wf.svg - flags/ws.svg - flags/ye.svg - flags/yt.svg - flags/za.svg - flags/zm.svg - flags/zw.svg - L.gif - loading.png - qbt-theme/application-exit.svg - qbt-theme/application-rss+xml.svg - qbt-theme/application-x-mswinurl.svg - qbt-theme/checked.svg - qbt-theme/configure.svg - qbt-theme/dialog-cancel.svg - qbt-theme/dialog-information.svg - qbt-theme/dialog-warning.svg - qbt-theme/document-edit-verify.svg - qbt-theme/document-edit.svg - qbt-theme/document-encrypt.svg - qbt-theme/document-import.svg - qbt-theme/document-new.svg - qbt-theme/document-properties.svg - qbt-theme/document-save.svg - qbt-theme/download.svg - qbt-theme/edit-clear-history.svg - qbt-theme/edit-clear.svg - qbt-theme/edit-copy.svg - qbt-theme/edit-cut.svg - qbt-theme/edit-delete.svg - qbt-theme/edit-find-user.svg - qbt-theme/edit-find.svg - qbt-theme/edit-paste.svg - qbt-theme/edit-rename.svg - qbt-theme/folder-documents.svg - qbt-theme/folder-download.svg - qbt-theme/folder-new.svg - qbt-theme/folder-remote.svg - qbt-theme/gear.svg - qbt-theme/gear32.svg - qbt-theme/go-bottom.svg - qbt-theme/go-down.svg - qbt-theme/go-top.svg - qbt-theme/go-up.svg - qbt-theme/help-about.svg - qbt-theme/help-contents.svg - qbt-theme/inode-directory.svg - qbt-theme/insert-link.svg - qbt-theme/kt-magnet.png - qbt-theme/kt-set-max-download-speed.png - qbt-theme/kt-set-max-upload-speed.png - qbt-theme/list-add.svg - qbt-theme/list-remove.svg - qbt-theme/mail-folder-inbox.svg - qbt-theme/mail-mark-read.svg - qbt-theme/media-playback-pause.svg - qbt-theme/media-playback-start.svg - qbt-theme/media-seek-forward.svg - qbt-theme/network-server.svg - qbt-theme/network-wired.svg - qbt-theme/object-locked.svg - qbt-theme/office-chart-line.svg - qbt-theme/preferences-desktop.svg - qbt-theme/preferences-other.svg - qbt-theme/preferences-system-network.svg - qbt-theme/preferences-web-browser-cookies.svg - qbt-theme/rss-config.png - qbt-theme/security-high.svg - qbt-theme/security-low.svg - qbt-theme/services.svg - qbt-theme/speedometer.svg - qbt-theme/system-log-out.svg - qbt-theme/tab-close.svg - qbt-theme/task-attention.svg - qbt-theme/task-complete.png - qbt-theme/task-ongoing.png - qbt-theme/task-reject.png - qbt-theme/text-plain.svg - qbt-theme/tools-report-bug.svg - qbt-theme/unavailable.svg - qbt-theme/user-group-delete.svg - qbt-theme/user-group-new.svg - qbt-theme/view-calendar-journal.svg - qbt-theme/view-categories.svg - qbt-theme/view-filter.svg - qbt-theme/view-preview.svg - qbt-theme/view-refresh.svg - qbt-theme/view-statistics.svg - qbt-theme/wallet-open.svg - qbt-theme/webui.svg - skin/arrow-right.gif - skin/bg-dropdown.gif - skin/bg-handle-horizontal.gif - skin/bg-header.gif - skin/bg-panel-header.gif - skin/checking.svg - skin/collapse-expand.gif - skin/completed.svg - skin/connected.svg - skin/disconnected.svg - skin/dock-tabs.gif - skin/download.svg - skin/downloading.svg - skin/error.svg - skin/filteractive.svg - skin/filterall.svg - skin/filterinactive.svg - skin/firewalled.svg - skin/handle-icon-horizontal.gif - skin/handle-icon.gif - skin/knob.gif - skin/logo-blank.gif - skin/logo.gif - skin/logo2.gif - skin/mascot.png - skin/paused.svg - skin/qbittorrent-tray.svg - skin/qbittorrent-tray-dark.svg - skin/qbittorrent-tray-light.svg - skin/qbittorrent32.png - skin/queued.svg - skin/ratio.svg - skin/resumed.svg - skin/seeding.svg - skin/slider-area.gif - skin/spacer.gif - skin/spinner-placeholder.gif - skin/spinner.gif - skin/splash.png - skin/stalledDL.svg - skin/stalledUP.svg - skin/tabs.gif - skin/toolbox-divider.gif - skin/toolbox-divider2.gif - skin/uploading.svg - slow.png - slow_off.png - sphere.png - sphere2.png - url.png - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/magnet.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/magnet.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/application-exit.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/application-exit.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/application-rss+xml.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/application-rss+xml.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/application-x-mswinurl.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/application-x-mswinurl.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/checked.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/checked.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/chronometer.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/chronometer.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/dialog-cancel.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/dialog-cancel.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/dialog-information.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/dialog-information.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/dialog-warning.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/dialog-warning.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/document-edit.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/document-edit.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/document-edit-verify.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/document-edit-verify.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/document-encrypt.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/document-encrypt.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/document-import.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/document-import.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/document-new.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/document-new.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/document-properties.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/document-properties.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/document-save.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/document-save.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/download.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/download.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/edit-clear-history.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/edit-clear-history.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/edit-clear.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/edit-clear.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/edit-copy.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/edit-copy.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/edit-cut.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/edit-cut.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/edit-delete.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/edit-delete.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/edit-find.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/edit-find.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/edit-find-user.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/edit-find-user.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/edit-paste.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/edit-paste.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/edit-rename.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/edit-rename.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/folder-documents.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/folder-documents.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/folder-new.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/folder-new.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/folder-remote.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/folder-remote.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/gear32.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/gear32.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/gear.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/gear.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/go-bottom.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/go-bottom.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/go-down.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/go-down.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/go-top.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/go-top.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/go-up.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/go-up.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/help-about.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/help-about.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/help-contents.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/help-contents.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/inode-directory.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/inode-directory.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/insert-link.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/insert-link.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/list-add.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/list-add.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/list-remove.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/list-remove.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/mail-folder-inbox.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/mail-folder-inbox.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/mail-mark-read.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/mail-mark-read.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/media-playback-pause.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/media-playback-pause.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/media-playback-start.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/media-playback-start.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/media-seek-forward.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/media-seek-forward.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/network-server.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/network-server.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/network-wired.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/network-wired.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/object-locked.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/object-locked.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/office-chart-line.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/office-chart-line.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/preferences-desktop.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/preferences-desktop.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/preferences-other.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/preferences-other.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/preferences-system-network.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/preferences-system-network.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/preferences-system.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/preferences-system.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/preferences-web-browser-cookies.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/preferences-web-browser-cookies.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/security-high.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/security-high.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/security-low.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/security-low.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/services.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/services.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/system-log-out.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/system-log-out.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/tab-close.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/tab-close.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/task-attention.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/task-attention.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/task-complete.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/task-complete.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/task-ongoing.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/task-ongoing.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/task-reject.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/task-reject.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/text-plain.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/text-plain.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/tools-report-bug.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/tools-report-bug.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/unavailable.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/unavailable.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/user-group-delete.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/user-group-delete.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/user-group-new.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/user-group-new.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/view-calendar-journal.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/view-calendar-journal.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/view-categories.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/view-categories.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/view-filter.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/view-filter.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/view-preview.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/view-preview.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/view-refresh.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/view-refresh.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/view-statistics.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/view-statistics.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/wallet-open.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/wallet-open.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/oxygen/webui.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/oxygen/webui.png differ diff -Nru qbittorrent-4.1.3/src/icons/qbittorrent.desktop qbittorrent-3.3.15/src/icons/qbittorrent.desktop --- qbittorrent-4.1.3/src/icons/qbittorrent.desktop 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbittorrent.desktop 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,190 @@ +[Desktop Entry] +Categories=Network;FileTransfer;P2P;Qt; +Exec=qbittorrent %U +GenericName=BitTorrent client +Comment=Download and share files over BitTorrent +Icon=qbittorrent +MimeType=application/x-bittorrent;x-scheme-handler/magnet; +Name=qBittorrent +Terminal=false +Type=Application +StartupNotify=false +StartupWMClass=qbittorrent +Keywords=bittorrent;torrent;magnet;download;p2p; + +# Translations +Comment[oc]=Telecargar e partejar de fichièrs amb BitTorrent +GenericName[oc]=Client BitTorrent +Name[oc]=qBittorrent +Comment[af]=Aflaai en deel lêers oor BitTorrent +GenericName[af]=BitTorrent kliënt +Name[af]=qBittorrent +Comment[ar]=نزّل وشارك الملفات عبر كيوبت‎تورنت +GenericName[ar]=عميل بت‎تورنت +Name[ar]=كيوبت‎تورنت +Comment[be]=Сцягванне і раздача файлаў праз пратакол BitTorrent +GenericName[be]=BitTorrent-кліент +Name[be]=qBittorrent +Comment[bg]=Сваляне и споделяне на файлове чрез BitTorrent +GenericName[bg]=BitTorrent клиент +Name[bg]=qBittorrent +Comment[bn]=বিটটরেন্টে ফাইল ডাউনলোড এবং শেয়ার করুন +GenericName[bn]=বিটটরেন্ট ক্লায়েন্ট +Name[bn]=কিউবি্টটরেন্ট +Comment[bs]=Preuzmi i dijeli datoteke preko BitTorrent-a +GenericName[bs]=BitTorrent klijent +Name[bs]=qBittorrent +Comment[ca]=Baixeu i compartiu fitxers mitjançant BitTorrent +GenericName[ca]=Client de BitTorrent +Name[ca]=qBittorrent +Comment[cs]=Stahování a sdílení souborů přes síť BitTorrent +GenericName[cs]=BitTorrent klient +Name[cs]=qBittorrent +Comment[da]=Download og del filer over BitTorrent +GenericName[da]=BitTorrent klient +Name[da]=qBittorrent +Comment[de]=Über BitTorrent Dateien herunterladen und teilen +GenericName[de]=BitTorrent Client +Name[de]=qBittorrent +Comment[el]=Κάντε λήψη και ανταλάξτε αρχεία μέσω BitTorrent +GenericName[el]=Πελάτης BitTorrent +Name[el]=qBittorrent +Comment[en_GB]=Download and share files over BitTorrent +GenericName[en_GB]=BitTorrent client +Name[en_GB]=qBittorrent +Comment[es]=Descargue y comparta archivos por BitTorrent +GenericName[es]=Cliente BitTorrent +Name[es]=qBittorrent +Comment[eu]=Jeitsi eta elkarbanatu agiriak BitTorrent-en +GenericName[eu]=BitTorrent bezeroa +Name[eu]=qBittorrent +Comment[fa]=دانلود و به اشتراک گذاری فایل های بوسیله بیت تورنت +GenericName[fa]=بیت تورنت نسخه کلاینت +Name[fa]=کیو بیت تورنت +Comment[fi]=Lataa ja jaa tiedostoja BitTorrentia käyttäen +GenericName[fi]=BitTorrent-asiakasohjelma +Name[fi]=qBittorrent +Comment[fr]=Télécharger et partager des fichiers avec BitTorrent +GenericName[fr]=Client BitTorrent +Name[fr]=qBittorrent +Comment[gl]=Descargar e compartir ficheiros co protocolo BitTorrent +GenericName[gl]=Cliente BitTorrent +Name[gl]=qBittorrent +Comment[gu]=બિટ્ટોરેંટ પર ફાઈલો ડાઉનલોડ અને શેર કરો +GenericName[gu]=બિટ્ટોરેંટ ક્લાયન્ટ +Name[gu]=ક્યૂ-બિટ્ટોરેંટ +Comment[he]=הורד ושתף קבצים על גבי ביטורנט +GenericName[he]=לקוח ביטורנט +Name[he]=qBittorrent +Comment[hr]=Preuzmite i dijelite datoteke putem BitTorrenta +GenericName[hr]=BitTorrent klijent +Name[hr]=qBittorrent +Comment[hu]=Fájlok letöltése és megosztása a BitTorrent hálózaton keresztül +GenericName[hu]=BitTorrent kliens +Name[hu]=qBittorrent +Comment[id]=Unduh dan berbagi berkas melalui BitTorrent +GenericName[id]=Klien BitTorrent +Name[id]=qBittorrent +Comment[is]=Sækja og deila skrám yfir BitTorrent +GenericName[is]=BitTorrent biðlarar +Name[is]=qBittorrent +Comment[it]=Client BitTorrent per il download di file via internet +GenericName[it]=Client BitTorrent +Name[it]=qBittorrent +Comment[ja]=BitTorrent でファイルをダウンロードおよび共有します +GenericName[ja]=BitTorrent クライアント +Name[ja]=qBittorrent +Comment[ka]=ჩამოტვირთე და გააზიარე ფაილები Bittorrent-ის საშუალებით +GenericName[ka]=BitTorrent კლიენტი +Name[ka]=qBittorrent +Comment[ko]=비트토런트를 통해 파일을 다운로드하고 공유합니다 +GenericName[ko]=비트토런트 클라이언트 +Name[ko]=큐빗토런트 +Comment[zh]=通过 BitTorrent 下载和分享文件 +GenericName[zh]=BitTorrent 客户端 +Name[zh]=qBittorrent +Comment[lt]=Atsisiųskite bei dalinkitės failais BitTorrent tinkle +GenericName[lt]=BitTorrent klientas +Name[lt]=qBittorrent +Comment[nb]=Last ned og del filer over BitTorrent +GenericName[nb]=BitTorrent-klient +Name[nb]=qBittorrent +Comment[nqo]=ߞߐߕߐ߯ߘߐ ߟߎ߬ ߟߊߖߌ߰ ߞߊ߬ ߓߊ߲߫ ߞߵߊ߬ߟߎ߬ ߘߐߕߟߊ߫ ߓߌߙߏߙߍ߲ߕ ߞߊ߲߬ +GenericName[nqo]=ߓߌߙߏߙߍ߲ߕ ߕߣߐ߬ߓߐ߬ߟߊ +Name[nqo]=ߞߎ߳ߓߌߕߏߙߍ߲ߕ +Comment[nl]=Bestanden downloaden en delen via BitTorrent +GenericName[nl]=BitTorrent-cliënt +Name[nl]=qBittorrent +Comment[pl]=Pobieraj i dziel się plikami przez BitTorrent +GenericName[pl]=Klient BitTorrent +Name[pl]=qBittorrent +Comment[pt]=Transferir e partilhar ficheiros por BitTorrent +GenericName[pt]=Cliente BitTorrent +Name[pt]=qBittorrent +Comment[pt_BR]=Baixe e compartilhe arquivos por BitTorrent +GenericName[pt_BR]=Cliente BitTorrent +Name[pt_BR]=qBittorrent +Comment[ro]=Descărcați și partajați fișiere prin BitTorrent +GenericName[ro]=Client BitTorrent +Name[ro]=qBittorrent +Comment[ru]=Скачивайте и делитесь файлами с помощью BitTorrent +GenericName[ru]=BitTorrent-клиент +Name[ru]=qBittorrent +Comment[sk]=Sťahovanie a zdieľanie súborov prostredníctvom siete BitTorrent +GenericName[sk]=Klient siete BitTorrent +Name[sk]=qBittorrent +Comment[sl]=Prenesite in delite datoteke preko BitTorrenta +GenericName[sl]=BitTorrent odjemalec +Name[sl]=qBittorrent +GenericName[sr]=BitTorrent-клијент +Comment[sr@latin]=Preuzimanje i deljenje fajlova preko BitTorrent-a +GenericName[sr@latin]=BitTorrent klijent +Name[sr@latin]=qBittorrent +Comment[sv]=Hämta och dela filer över BitTorrent +GenericName[sv]=BitTorrent-klient +Name[sv]=qBittorrent +Comment[uz@Latn]=BitTorrent orqali fayllarni yuklab olish va baham ko‘rish +GenericName[uz@Latn]=BitTorrent mijozi +Name[uz@Latn]=qBittorrent +Comment[te]=క్యు బిట్ టొరెంట్ తో ఫైల్స్ దిగుమతి చేసుకోండి , పంచుకోండి +GenericName[te]=క్యు బిట్ టొరెంట్ క్లయింట్ +Name[te]=క్యు బిట్ టొరెంట్ +Comment[hi_IN]= अपनी फाइलें BitTorrent के माध्यम से डाउनलोड आैर साॅझा करें +GenericName[hi_IN]=BitTorrent उपभोक्ता +Name[hi_IN]=qBittorrent +Comment[tr]=Dosyaları BitTorrent üzerinden indirin ve paylaşın +GenericName[tr]=BitTorrent istemcisi +Name[tr]=qBittorrent +Comment[uk]=Завантажувати і обмінюватися файлами через BitTorrent +GenericName[uk]=BitTorrent-клієнт +Name[uk]=qBittorrent +Comment[vi]=Tải về và chia sẻ các tập tin thông qua BitTorrent +GenericName[vi]=Máy trạm dạng BitTorrent +Name[vi]=qBittorrent +Comment[zh_HK]=經由BitTorrent下載並分享檔案 +GenericName[zh_HK]=BitTorrent用戶端 +Name[zh_HK]=qBittorrent +Comment[zh_TW]=經由 BitTorrent 下載並分享檔案 +GenericName[zh_TW]=BitTorrent 客戶端 +Name[zh_TW]=qBittorrent +Comment[lv_LV]=Lejupielādēt un koplietot failus ar BitTorrent +GenericName[lv_LV]=BitTorrent klients +Name[lv_LV]=qBittorrent +Comment[ms_MY]=Muat turun dan kongsi fail melalui BitTorrent +GenericName[ms_MY]=Klien BitTorrent +Name[ms_MY]=qBittorrent +Comment[eo]=Elŝutu kaj kunhavigu dosierojn per BitTorrent +GenericName[eo]=BitTorrent-kliento +Name[eo]=qBittorrent +Comment[mn_MN]=BitTorrent ашиглан файлуудыг татаж түгээх +GenericName[mn_MN]=BitTorrent үйлчлүүлэгч +Name[mn_MN]=qBittorrent +Comment[ne_NP]=फाइलहरू डाउनलोड गर्नुहोस् र BitTorrent मा साझा गर्नुहोस् +GenericName[ne_NP]=BitTorrent क्लाइन्ट +Name[ne_NP]=qBittorrent +Comment[en_AU]=Download and share files over BitTorrent +GenericName[en_AU]=BitTorrent client +Name[en_AU]=qBittorrent +Comment[th]=ดาว์นโหลดและแชร์ไฟล์ด้วยบิททอเร้น +GenericName[th]=โปรแกรมบิททอเร้น +Name[th]=qBittorrent Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/qbittorrent_file.ico and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/qbittorrent_file.ico differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/qbittorrent.ico and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/qbittorrent.ico differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/qbittorrent.png differ diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/application-exit.svg qbittorrent-3.3.15/src/icons/qbt-theme/application-exit.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/application-exit.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/application-exit.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/application-rss+xml.svg qbittorrent-3.3.15/src/icons/qbt-theme/application-rss+xml.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/application-rss+xml.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/application-rss+xml.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/application-x-mswinurl.svg qbittorrent-3.3.15/src/icons/qbt-theme/application-x-mswinurl.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/application-x-mswinurl.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/application-x-mswinurl.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/build-icons/Gruntfile.js qbittorrent-3.3.15/src/icons/qbt-theme/build-icons/Gruntfile.js --- qbittorrent-4.1.3/src/icons/qbt-theme/build-icons/Gruntfile.js 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/build-icons/Gruntfile.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -module.exports = function(grunt) { - - grunt.initConfig({ - svg2png: { - all: { - options:{ - size: 256 - }, - files: [ - { - src: ['icons/*.svg'] - } - ] - } - } - }); - - grunt.loadNpmTasks('grunt-svg2png'); - - grunt.registerTask('default', ['svg2png']); - -} \ No newline at end of file diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/build-icons/package.json qbittorrent-3.3.15/src/icons/qbt-theme/build-icons/package.json --- qbittorrent-4.1.3/src/icons/qbt-theme/build-icons/package.json 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/build-icons/package.json 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -{ - "name": "build-icons", - "version": "1.0.0", - "description": "Convert svg icons to png", - "main": "index.js", - "dependencies": {}, - "devDependencies": { - "grunt": "^0.4.5", - "grunt-svg2png": "git+https://git@github.com/bertyhell/grunt-svg2png.git" - }, - "author": "Bert Verhelst", - "license": "ISC" -} diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/build-icons/readme.md qbittorrent-3.3.15/src/icons/qbt-theme/build-icons/readme.md --- qbittorrent-4.1.3/src/icons/qbt-theme/build-icons/readme.md 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/build-icons/readme.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -Convert SVG icons to PNG ------------------------- - -install npm - -Execute: -``` -npm install -``` - -Convert icons by running: -``` -grunt -``` \ No newline at end of file diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/checked.svg qbittorrent-3.3.15/src/icons/qbt-theme/checked.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/checked.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/checked.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/configure.svg qbittorrent-3.3.15/src/icons/qbt-theme/configure.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/configure.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/configure.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/dialog-cancel.svg qbittorrent-3.3.15/src/icons/qbt-theme/dialog-cancel.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/dialog-cancel.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/dialog-cancel.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/dialog-information.svg qbittorrent-3.3.15/src/icons/qbt-theme/dialog-information.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/dialog-information.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/dialog-information.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/dialog-warning.svg qbittorrent-3.3.15/src/icons/qbt-theme/dialog-warning.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/dialog-warning.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/dialog-warning.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/document-edit.svg qbittorrent-3.3.15/src/icons/qbt-theme/document-edit.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/document-edit.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/document-edit.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/document-edit-verify.svg qbittorrent-3.3.15/src/icons/qbt-theme/document-edit-verify.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/document-edit-verify.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/document-edit-verify.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/document-encrypt.svg qbittorrent-3.3.15/src/icons/qbt-theme/document-encrypt.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/document-encrypt.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/document-encrypt.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/document-import.svg qbittorrent-3.3.15/src/icons/qbt-theme/document-import.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/document-import.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/document-import.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/document-new.svg qbittorrent-3.3.15/src/icons/qbt-theme/document-new.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/document-new.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/document-new.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/document-properties.svg qbittorrent-3.3.15/src/icons/qbt-theme/document-properties.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/document-properties.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/document-properties.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/document-save.svg qbittorrent-3.3.15/src/icons/qbt-theme/document-save.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/document-save.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/document-save.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/download.svg qbittorrent-3.3.15/src/icons/qbt-theme/download.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/download.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/download.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/edit-clear-history.svg qbittorrent-3.3.15/src/icons/qbt-theme/edit-clear-history.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/edit-clear-history.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/edit-clear-history.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ - - - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/edit-clear.svg qbittorrent-3.3.15/src/icons/qbt-theme/edit-clear.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/edit-clear.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/edit-clear.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/edit-copy.svg qbittorrent-3.3.15/src/icons/qbt-theme/edit-copy.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/edit-copy.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/edit-copy.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/edit-cut.svg qbittorrent-3.3.15/src/icons/qbt-theme/edit-cut.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/edit-cut.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/edit-cut.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/edit-delete.svg qbittorrent-3.3.15/src/icons/qbt-theme/edit-delete.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/edit-delete.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/edit-delete.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/edit-find.svg qbittorrent-3.3.15/src/icons/qbt-theme/edit-find.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/edit-find.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/edit-find.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/edit-find-user.svg qbittorrent-3.3.15/src/icons/qbt-theme/edit-find-user.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/edit-find-user.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/edit-find-user.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ - - - - - - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/edit-paste.svg qbittorrent-3.3.15/src/icons/qbt-theme/edit-paste.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/edit-paste.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/edit-paste.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/edit-rename.svg qbittorrent-3.3.15/src/icons/qbt-theme/edit-rename.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/edit-rename.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/edit-rename.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/folder-documents.svg qbittorrent-3.3.15/src/icons/qbt-theme/folder-documents.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/folder-documents.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/folder-documents.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/folder-download.svg qbittorrent-3.3.15/src/icons/qbt-theme/folder-download.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/folder-download.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/folder-download.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/folder-new.svg qbittorrent-3.3.15/src/icons/qbt-theme/folder-new.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/folder-new.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/folder-new.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/folder-remote.svg qbittorrent-3.3.15/src/icons/qbt-theme/folder-remote.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/folder-remote.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/folder-remote.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ - - - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/gear32.svg qbittorrent-3.3.15/src/icons/qbt-theme/gear32.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/gear32.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/gear32.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/gear.svg qbittorrent-3.3.15/src/icons/qbt-theme/gear.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/gear.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/gear.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/go-bottom.svg qbittorrent-3.3.15/src/icons/qbt-theme/go-bottom.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/go-bottom.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/go-bottom.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/go-down.svg qbittorrent-3.3.15/src/icons/qbt-theme/go-down.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/go-down.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/go-down.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/go-top.svg qbittorrent-3.3.15/src/icons/qbt-theme/go-top.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/go-top.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/go-top.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/go-up.svg qbittorrent-3.3.15/src/icons/qbt-theme/go-up.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/go-up.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/go-up.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/help-about.svg qbittorrent-3.3.15/src/icons/qbt-theme/help-about.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/help-about.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/help-about.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/help-contents.svg qbittorrent-3.3.15/src/icons/qbt-theme/help-contents.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/help-contents.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/help-contents.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/inode-directory.svg qbittorrent-3.3.15/src/icons/qbt-theme/inode-directory.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/inode-directory.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/inode-directory.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/insert-link.svg qbittorrent-3.3.15/src/icons/qbt-theme/insert-link.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/insert-link.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/insert-link.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/qbt-theme/kt-magnet.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/qbt-theme/kt-magnet.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/qbt-theme/kt-set-max-download-speed.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/qbt-theme/kt-set-max-download-speed.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/qbt-theme/kt-set-max-upload-speed.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/qbt-theme/kt-set-max-upload-speed.png differ diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/list-add.svg qbittorrent-3.3.15/src/icons/qbt-theme/list-add.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/list-add.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/list-add.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/list-remove.svg qbittorrent-3.3.15/src/icons/qbt-theme/list-remove.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/list-remove.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/list-remove.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/mail-folder-inbox.svg qbittorrent-3.3.15/src/icons/qbt-theme/mail-folder-inbox.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/mail-folder-inbox.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/mail-folder-inbox.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/mail-mark-read.svg qbittorrent-3.3.15/src/icons/qbt-theme/mail-mark-read.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/mail-mark-read.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/mail-mark-read.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/media-playback-pause.svg qbittorrent-3.3.15/src/icons/qbt-theme/media-playback-pause.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/media-playback-pause.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/media-playback-pause.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/media-playback-start.svg qbittorrent-3.3.15/src/icons/qbt-theme/media-playback-start.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/media-playback-start.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/media-playback-start.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/media-seek-forward.svg qbittorrent-3.3.15/src/icons/qbt-theme/media-seek-forward.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/media-seek-forward.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/media-seek-forward.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/network-server.svg qbittorrent-3.3.15/src/icons/qbt-theme/network-server.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/network-server.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/network-server.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ - - - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/network-wired.svg qbittorrent-3.3.15/src/icons/qbt-theme/network-wired.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/network-wired.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/network-wired.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/object-locked.svg qbittorrent-3.3.15/src/icons/qbt-theme/object-locked.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/object-locked.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/object-locked.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/office-chart-line.svg qbittorrent-3.3.15/src/icons/qbt-theme/office-chart-line.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/office-chart-line.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/office-chart-line.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/preferences-desktop.svg qbittorrent-3.3.15/src/icons/qbt-theme/preferences-desktop.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/preferences-desktop.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/preferences-desktop.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/preferences-other.svg qbittorrent-3.3.15/src/icons/qbt-theme/preferences-other.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/preferences-other.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/preferences-other.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/preferences-system-network.svg qbittorrent-3.3.15/src/icons/qbt-theme/preferences-system-network.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/preferences-system-network.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/preferences-system-network.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/preferences-web-browser-cookies.svg qbittorrent-3.3.15/src/icons/qbt-theme/preferences-web-browser-cookies.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/preferences-web-browser-cookies.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/preferences-web-browser-cookies.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/README.md qbittorrent-3.3.15/src/icons/qbt-theme/README.md --- qbittorrent-4.1.3/src/icons/qbt-theme/README.md 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/README.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -qBittorrent Theme Icons ------------------------------------------- -Initial `qbt-theme` icons created by Bert Verhelst (). - -Icons are based on the `Font-Awesome` icon-set: [link](http://fontawesome.io/icons/). - -If you need to add an icon that qBittorrent does not already use, you can take an icon from the SVG fork of `Font-Awesome`: [link](https://github.com/encharm/Font-Awesome-SVG-PNG). Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/qbt-theme/rss-config.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/qbt-theme/rss-config.png differ diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/security-high.svg qbittorrent-3.3.15/src/icons/qbt-theme/security-high.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/security-high.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/security-high.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/security-low.svg qbittorrent-3.3.15/src/icons/qbt-theme/security-low.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/security-low.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/security-low.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/services.svg qbittorrent-3.3.15/src/icons/qbt-theme/services.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/services.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/services.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/speedometer.svg qbittorrent-3.3.15/src/icons/qbt-theme/speedometer.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/speedometer.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/speedometer.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/system-log-out.svg qbittorrent-3.3.15/src/icons/qbt-theme/system-log-out.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/system-log-out.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/system-log-out.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/tab-close.svg qbittorrent-3.3.15/src/icons/qbt-theme/tab-close.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/tab-close.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/tab-close.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/task-attention.svg qbittorrent-3.3.15/src/icons/qbt-theme/task-attention.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/task-attention.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/task-attention.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/qbt-theme/task-complete.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/qbt-theme/task-complete.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/qbt-theme/task-ongoing.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/qbt-theme/task-ongoing.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/qbt-theme/task-reject.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/qbt-theme/task-reject.png differ diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/text-plain.svg qbittorrent-3.3.15/src/icons/qbt-theme/text-plain.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/text-plain.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/text-plain.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/tools-report-bug.svg qbittorrent-3.3.15/src/icons/qbt-theme/tools-report-bug.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/tools-report-bug.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/tools-report-bug.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/unavailable.svg qbittorrent-3.3.15/src/icons/qbt-theme/unavailable.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/unavailable.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/unavailable.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/user-group-delete.svg qbittorrent-3.3.15/src/icons/qbt-theme/user-group-delete.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/user-group-delete.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/user-group-delete.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/user-group-new.svg qbittorrent-3.3.15/src/icons/qbt-theme/user-group-new.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/user-group-new.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/user-group-new.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ - - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/view-calendar-journal.svg qbittorrent-3.3.15/src/icons/qbt-theme/view-calendar-journal.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/view-calendar-journal.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/view-calendar-journal.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/view-categories.svg qbittorrent-3.3.15/src/icons/qbt-theme/view-categories.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/view-categories.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/view-categories.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/view-filter.svg qbittorrent-3.3.15/src/icons/qbt-theme/view-filter.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/view-filter.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/view-filter.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/view-preview.svg qbittorrent-3.3.15/src/icons/qbt-theme/view-preview.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/view-preview.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/view-preview.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/view-refresh.svg qbittorrent-3.3.15/src/icons/qbt-theme/view-refresh.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/view-refresh.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/view-refresh.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/view-statistics.svg qbittorrent-3.3.15/src/icons/qbt-theme/view-statistics.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/view-statistics.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/view-statistics.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/wallet-open.svg qbittorrent-3.3.15/src/icons/qbt-theme/wallet-open.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/wallet-open.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/wallet-open.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - diff -Nru qbittorrent-4.1.3/src/icons/qbt-theme/webui.svg qbittorrent-3.3.15/src/icons/qbt-theme/webui.svg --- qbittorrent-4.1.3/src/icons/qbt-theme/webui.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/qbt-theme/webui.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ - - - - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/skin/build-icons/Gruntfile.js qbittorrent-3.3.15/src/icons/skin/build-icons/Gruntfile.js --- qbittorrent-4.1.3/src/icons/skin/build-icons/Gruntfile.js 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/build-icons/Gruntfile.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -module.exports = function(grunt) { - - grunt.initConfig({ - svg2png: { - all: { - options:{ - size: 256 - }, - files: [ - { - src: ['icons/*.svg'] - } - ] - } - } - }); - - grunt.loadNpmTasks('grunt-svg2png'); - - grunt.registerTask('default', ['svg2png']); - -} \ No newline at end of file diff -Nru qbittorrent-4.1.3/src/icons/skin/build-icons/package.json qbittorrent-3.3.15/src/icons/skin/build-icons/package.json --- qbittorrent-4.1.3/src/icons/skin/build-icons/package.json 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/build-icons/package.json 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -{ - "name": "build-icons", - "version": "1.0.0", - "description": "Convert svg icons to png", - "main": "index.js", - "dependencies": {}, - "devDependencies": { - "grunt": "^0.4.5", - "grunt-svg2png": "git+https://git@github.com/bertyhell/grunt-svg2png.git" - }, - "author": "Bert Verhelst", - "license": "ISC" -} diff -Nru qbittorrent-4.1.3/src/icons/skin/build-icons/readme.md qbittorrent-3.3.15/src/icons/skin/build-icons/readme.md --- qbittorrent-4.1.3/src/icons/skin/build-icons/readme.md 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/build-icons/readme.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -Convert SVG icons to PNG ------------------------- - -install npm - -Execute: -``` -npm install -``` - -Convert icons by running: -``` -grunt -``` \ No newline at end of file Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/checking.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/checking.png differ diff -Nru qbittorrent-4.1.3/src/icons/skin/checking.svg qbittorrent-3.3.15/src/icons/skin/checking.svg --- qbittorrent-4.1.3/src/icons/skin/checking.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/checking.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/completed.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/completed.png differ diff -Nru qbittorrent-4.1.3/src/icons/skin/completed.svg qbittorrent-3.3.15/src/icons/skin/completed.svg --- qbittorrent-4.1.3/src/icons/skin/completed.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/completed.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/connected.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/connected.png differ diff -Nru qbittorrent-4.1.3/src/icons/skin/connected.svg qbittorrent-3.3.15/src/icons/skin/connected.svg --- qbittorrent-4.1.3/src/icons/skin/connected.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/connected.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/disconnected.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/disconnected.png differ diff -Nru qbittorrent-4.1.3/src/icons/skin/disconnected.svg qbittorrent-3.3.15/src/icons/skin/disconnected.svg --- qbittorrent-4.1.3/src/icons/skin/disconnected.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/disconnected.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/downloading.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/downloading.png differ diff -Nru qbittorrent-4.1.3/src/icons/skin/downloading.svg qbittorrent-3.3.15/src/icons/skin/downloading.svg --- qbittorrent-4.1.3/src/icons/skin/downloading.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/downloading.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/downloadLimit.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/downloadLimit.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/download.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/download.png differ diff -Nru qbittorrent-4.1.3/src/icons/skin/download.svg qbittorrent-3.3.15/src/icons/skin/download.svg --- qbittorrent-4.1.3/src/icons/skin/download.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/download.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/error.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/error.png differ diff -Nru qbittorrent-4.1.3/src/icons/skin/error.svg qbittorrent-3.3.15/src/icons/skin/error.svg --- qbittorrent-4.1.3/src/icons/skin/error.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/error.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/filteractive.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/filteractive.png differ diff -Nru qbittorrent-4.1.3/src/icons/skin/filteractive.svg qbittorrent-3.3.15/src/icons/skin/filteractive.svg --- qbittorrent-4.1.3/src/icons/skin/filteractive.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/filteractive.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/filterall.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/filterall.png differ diff -Nru qbittorrent-4.1.3/src/icons/skin/filterall.svg qbittorrent-3.3.15/src/icons/skin/filterall.svg --- qbittorrent-4.1.3/src/icons/skin/filterall.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/filterall.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/filterinactive.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/filterinactive.png differ diff -Nru qbittorrent-4.1.3/src/icons/skin/filterinactive.svg qbittorrent-3.3.15/src/icons/skin/filterinactive.svg --- qbittorrent-4.1.3/src/icons/skin/filterinactive.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/filterinactive.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/firewalled.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/firewalled.png differ diff -Nru qbittorrent-4.1.3/src/icons/skin/firewalled.svg qbittorrent-3.3.15/src/icons/skin/firewalled.svg --- qbittorrent-4.1.3/src/icons/skin/firewalled.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/firewalled.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/paused.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/paused.png differ diff -Nru qbittorrent-4.1.3/src/icons/skin/paused.svg qbittorrent-3.3.15/src/icons/skin/paused.svg --- qbittorrent-4.1.3/src/icons/skin/paused.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/paused.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/qbittorrent16.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/qbittorrent16.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/qbittorrent22.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/qbittorrent22.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/qbittorrent32.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/qbittorrent32.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/qbittorrent_mono_dark.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/qbittorrent_mono_dark.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/qbittorrent_mono_light.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/qbittorrent_mono_light.png differ diff -Nru qbittorrent-4.1.3/src/icons/skin/qbittorrent_mono.svg qbittorrent-3.3.15/src/icons/skin/qbittorrent_mono.svg --- qbittorrent-4.1.3/src/icons/skin/qbittorrent_mono.svg 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/qbittorrent_mono.svg 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,83 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff -Nru qbittorrent-4.1.3/src/icons/skin/qbittorrent-tray-dark.svg qbittorrent-3.3.15/src/icons/skin/qbittorrent-tray-dark.svg --- qbittorrent-4.1.3/src/icons/skin/qbittorrent-tray-dark.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/qbittorrent-tray-dark.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/skin/qbittorrent-tray-light.svg qbittorrent-3.3.15/src/icons/skin/qbittorrent-tray-light.svg --- qbittorrent-4.1.3/src/icons/skin/qbittorrent-tray-light.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/qbittorrent-tray-light.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/skin/qbittorrent-tray.svg qbittorrent-3.3.15/src/icons/skin/qbittorrent-tray.svg --- qbittorrent-4.1.3/src/icons/skin/qbittorrent-tray.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/qbittorrent-tray.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ - - - qbittorrent-new-light - - - - - - - - - - - - - diff -Nru qbittorrent-4.1.3/src/icons/skin/qbittorrent-tray-with-font.svg qbittorrent-3.3.15/src/icons/skin/qbittorrent-tray-with-font.svg --- qbittorrent-4.1.3/src/icons/skin/qbittorrent-tray-with-font.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/qbittorrent-tray-with-font.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ - - - qbittorrent-new-light - - - - - - - - - - - b - - - q - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/queued.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/queued.png differ diff -Nru qbittorrent-4.1.3/src/icons/skin/queued.svg qbittorrent-3.3.15/src/icons/skin/queued.svg --- qbittorrent-4.1.3/src/icons/skin/queued.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/queued.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/ratio.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/ratio.png differ diff -Nru qbittorrent-4.1.3/src/icons/skin/ratio.svg qbittorrent-3.3.15/src/icons/skin/ratio.svg --- qbittorrent-4.1.3/src/icons/skin/ratio.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/ratio.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ - - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/resumed.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/resumed.png differ diff -Nru qbittorrent-4.1.3/src/icons/skin/resumed.svg qbittorrent-3.3.15/src/icons/skin/resumed.svg --- qbittorrent-4.1.3/src/icons/skin/resumed.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/resumed.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/seeding.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/seeding.png differ diff -Nru qbittorrent-4.1.3/src/icons/skin/seeding.svg qbittorrent-3.3.15/src/icons/skin/seeding.svg --- qbittorrent-4.1.3/src/icons/skin/seeding.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/seeding.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/splash.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/splash.png differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/stalledDL.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/stalledDL.png differ diff -Nru qbittorrent-4.1.3/src/icons/skin/stalledDL.svg qbittorrent-3.3.15/src/icons/skin/stalledDL.svg --- qbittorrent-4.1.3/src/icons/skin/stalledDL.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/stalledDL.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/stalledUP.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/stalledUP.png differ diff -Nru qbittorrent-4.1.3/src/icons/skin/stalledUP.svg qbittorrent-3.3.15/src/icons/skin/stalledUP.svg --- qbittorrent-4.1.3/src/icons/skin/stalledUP.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/stalledUP.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/uploading.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/uploading.png differ diff -Nru qbittorrent-4.1.3/src/icons/skin/uploading.svg qbittorrent-3.3.15/src/icons/skin/uploading.svg --- qbittorrent-4.1.3/src/icons/skin/uploading.svg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/skin/uploading.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ - - - Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/icons/skin/uploadLimit.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/icons/skin/uploadLimit.png differ diff -Nru qbittorrent-4.1.3/src/icons/.svgo.yml qbittorrent-3.3.15/src/icons/.svgo.yml --- qbittorrent-4.1.3/src/icons/.svgo.yml 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/icons/.svgo.yml 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ -# config file for [SVGO](https://github.com/svg/svgo) -# SVGO: Node.js tool for optimizing SVG files -# svgo --config= - -multipass: true -js2svg: - pretty: true - indent: ' ' diff -Nru qbittorrent-4.1.3/src/icons.qrc qbittorrent-3.3.15/src/icons.qrc --- qbittorrent-4.1.3/src/icons.qrc 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/icons.qrc 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,379 @@ + + + icons/qbittorrent.png + icons/3-state-checkbox.gif + icons/L.gif + icons/loading.png + icons/magnet.png + icons/slow.png + icons/slow_off.png + icons/sphere.png + icons/sphere2.png + icons/url.png + icons/flags/ad.png + icons/flags/ae.png + icons/flags/af.png + icons/flags/ag.png + icons/flags/ai.png + icons/flags/al.png + icons/flags/am.png + icons/flags/an.png + icons/flags/ao.png + icons/flags/ar.png + icons/flags/as.png + icons/flags/at.png + icons/flags/au.png + icons/flags/aw.png + icons/flags/ax.png + icons/flags/az.png + icons/flags/ba.png + icons/flags/bb.png + icons/flags/bd.png + icons/flags/be.png + icons/flags/bf.png + icons/flags/bg.png + icons/flags/bh.png + icons/flags/bi.png + icons/flags/bj.png + icons/flags/bm.png + icons/flags/bn.png + icons/flags/bo.png + icons/flags/br.png + icons/flags/bs.png + icons/flags/bt.png + icons/flags/bv.png + icons/flags/bw.png + icons/flags/by.png + icons/flags/bz.png + icons/flags/ca.png + icons/flags/cc.png + icons/flags/cd.png + icons/flags/cf.png + icons/flags/cg.png + icons/flags/ch.png + icons/flags/ci.png + icons/flags/ck.png + icons/flags/cl.png + icons/flags/cm.png + icons/flags/cn.png + icons/flags/co.png + icons/flags/cr.png + icons/flags/cs.png + icons/flags/cu.png + icons/flags/cv.png + icons/flags/cx.png + icons/flags/cy.png + icons/flags/cz.png + icons/flags/de.png + icons/flags/dj.png + icons/flags/dk.png + icons/flags/dm.png + icons/flags/do.png + icons/flags/dz.png + icons/flags/ec.png + icons/flags/ee.png + icons/flags/eg.png + icons/flags/eh.png + icons/flags/er.png + icons/flags/es.png + icons/flags/et.png + icons/flags/fi.png + icons/flags/fj.png + icons/flags/fk.png + icons/flags/fm.png + icons/flags/fo.png + icons/flags/fr.png + icons/flags/ga.png + icons/flags/gb.png + icons/flags/gd.png + icons/flags/ge.png + icons/flags/gf.png + icons/flags/gh.png + icons/flags/gi.png + icons/flags/gl.png + icons/flags/gm.png + icons/flags/gn.png + icons/flags/gp.png + icons/flags/gq.png + icons/flags/gr.png + icons/flags/gs.png + icons/flags/gt.png + icons/flags/gu.png + icons/flags/gw.png + icons/flags/gy.png + icons/flags/hk.png + icons/flags/hm.png + icons/flags/hn.png + icons/flags/hr.png + icons/flags/ht.png + icons/flags/hu.png + icons/flags/id.png + icons/flags/ie.png + icons/flags/il.png + icons/flags/in.png + icons/flags/io.png + icons/flags/iq.png + icons/flags/ir.png + icons/flags/is.png + icons/flags/it.png + icons/flags/jm.png + icons/flags/jo.png + icons/flags/jp.png + icons/flags/ke.png + icons/flags/kg.png + icons/flags/kh.png + icons/flags/ki.png + icons/flags/km.png + icons/flags/kn.png + icons/flags/kp.png + icons/flags/kr.png + icons/flags/kw.png + icons/flags/ky.png + icons/flags/kz.png + icons/flags/la.png + icons/flags/lb.png + icons/flags/lc.png + icons/flags/li.png + icons/flags/lk.png + icons/flags/lr.png + icons/flags/ls.png + icons/flags/lt.png + icons/flags/lu.png + icons/flags/lv.png + icons/flags/ly.png + icons/flags/ma.png + icons/flags/mc.png + icons/flags/md.png + icons/flags/me.png + icons/flags/mg.png + icons/flags/mh.png + icons/flags/mk.png + icons/flags/ml.png + icons/flags/mm.png + icons/flags/mn.png + icons/flags/mo.png + icons/flags/mp.png + icons/flags/mq.png + icons/flags/mr.png + icons/flags/ms.png + icons/flags/mt.png + icons/flags/mu.png + icons/flags/mv.png + icons/flags/mw.png + icons/flags/mx.png + icons/flags/my.png + icons/flags/mz.png + icons/flags/na.png + icons/flags/nc.png + icons/flags/ne.png + icons/flags/nf.png + icons/flags/ng.png + icons/flags/ni.png + icons/flags/nl.png + icons/flags/no.png + icons/flags/np.png + icons/flags/nr.png + icons/flags/nu.png + icons/flags/nz.png + icons/flags/om.png + icons/flags/pa.png + icons/flags/pe.png + icons/flags/pf.png + icons/flags/pg.png + icons/flags/ph.png + icons/flags/pk.png + icons/flags/pl.png + icons/flags/pm.png + icons/flags/pn.png + icons/flags/pr.png + icons/flags/ps.png + icons/flags/pt.png + icons/flags/pw.png + icons/flags/py.png + icons/flags/qa.png + icons/flags/re.png + icons/flags/ro.png + icons/flags/rs.png + icons/flags/ru.png + icons/flags/rw.png + icons/flags/sa.png + icons/flags/sb.png + icons/flags/sc.png + icons/flags/sd.png + icons/flags/se.png + icons/flags/sg.png + icons/flags/sh.png + icons/flags/si.png + icons/flags/sj.png + icons/flags/sk.png + icons/flags/sl.png + icons/flags/sm.png + icons/flags/sn.png + icons/flags/so.png + icons/flags/sr.png + icons/flags/st.png + icons/flags/sv.png + icons/flags/sy.png + icons/flags/sz.png + icons/flags/tc.png + icons/flags/td.png + icons/flags/tf.png + icons/flags/tg.png + icons/flags/th.png + icons/flags/tj.png + icons/flags/tk.png + icons/flags/tl.png + icons/flags/tm.png + icons/flags/tn.png + icons/flags/to.png + icons/flags/tr.png + icons/flags/tt.png + icons/flags/tv.png + icons/flags/tw.png + icons/flags/tz.png + icons/flags/ua.png + icons/flags/ug.png + icons/flags/um.png + icons/flags/us.png + icons/flags/uy.png + icons/flags/uz.png + icons/flags/va.png + icons/flags/vc.png + icons/flags/ve.png + icons/flags/vg.png + icons/flags/vi.png + icons/flags/vn.png + icons/flags/vu.png + icons/flags/wf.png + icons/flags/ws.png + icons/flags/ye.png + icons/flags/yt.png + icons/flags/za.png + icons/flags/zm.png + icons/flags/zw.png + icons/oxygen/application-exit.png + icons/oxygen/application-rss+xml.png + icons/oxygen/application-x-mswinurl.png + icons/oxygen/chronometer.png + icons/oxygen/dialog-cancel.png + icons/oxygen/dialog-information.png + icons/oxygen/dialog-warning.png + icons/oxygen/document-edit-verify.png + icons/oxygen/document-edit.png + icons/oxygen/document-encrypt.png + icons/oxygen/document-import.png + icons/oxygen/document-new.png + icons/oxygen/document-properties.png + icons/oxygen/document-save.png + icons/oxygen/download.png + icons/oxygen/edit-clear-history.png + icons/oxygen/edit-clear.png + icons/oxygen/edit-copy.png + icons/oxygen/edit-cut.png + icons/oxygen/edit-delete.png + icons/oxygen/edit-find-user.png + icons/oxygen/edit-find.png + icons/oxygen/edit-paste.png + icons/oxygen/edit-rename.png + icons/oxygen/folder-documents.png + icons/oxygen/folder-new.png + icons/oxygen/folder-remote.png + icons/oxygen/gear.png + icons/oxygen/gear32.png + icons/oxygen/go-down.png + icons/oxygen/go-up.png + icons/oxygen/help-about.png + icons/oxygen/help-contents.png + icons/oxygen/inode-directory.png + icons/oxygen/insert-link.png + icons/oxygen/list-add.png + icons/oxygen/list-remove.png + icons/oxygen/mail-folder-inbox.png + icons/oxygen/mail-mark-read.png + icons/oxygen/media-playback-pause.png + icons/oxygen/media-playback-start.png + icons/oxygen/media-seek-forward.png + icons/oxygen/network-server.png + icons/oxygen/network-wired.png + icons/oxygen/object-locked.png + icons/oxygen/preferences-desktop.png + icons/oxygen/preferences-other.png + icons/oxygen/preferences-system-network.png + icons/oxygen/preferences-system.png + icons/oxygen/preferences-web-browser-cookies.png + icons/oxygen/security-high.png + icons/oxygen/security-low.png + icons/oxygen/services.png + icons/oxygen/tab-close.png + icons/oxygen/task-attention.png + icons/oxygen/task-complete.png + icons/oxygen/task-ongoing.png + icons/oxygen/task-reject.png + icons/oxygen/text-plain.png + icons/oxygen/tools-report-bug.png + icons/oxygen/unavailable.png + icons/oxygen/user-group-delete.png + icons/oxygen/user-group-new.png + icons/oxygen/view-calendar-journal.png + icons/oxygen/view-categories.png + icons/oxygen/view-filter.png + icons/oxygen/view-preview.png + icons/oxygen/view-refresh.png + icons/oxygen/view-statistics.png + icons/oxygen/wallet-open.png + icons/oxygen/webui.png + icons/skin/arrow-right.gif + icons/skin/bg-dropdown.gif + icons/skin/bg-handle-horizontal.gif + icons/skin/bg-header.gif + icons/skin/bg-panel-header.gif + icons/skin/checking.png + icons/skin/collapse-expand.gif + icons/skin/connected.png + icons/skin/disconnected.png + icons/skin/dock-tabs.gif + icons/skin/download.png + icons/skin/downloading.png + icons/skin/error.png + icons/skin/filteractive.png + icons/skin/filterall.png + icons/skin/filterinactive.png + icons/skin/firewalled.png + icons/skin/handle-icon-horizontal.gif + icons/skin/handle-icon.gif + icons/skin/knob.gif + icons/skin/logo-blank.gif + icons/skin/logo.gif + icons/skin/logo2.gif + icons/skin/mascot.png + icons/skin/paused.png + icons/skin/qbittorrent16.png + icons/skin/qbittorrent22.png + icons/skin/qbittorrent32.png + icons/skin/qbittorrent_mono_dark.png + icons/skin/qbittorrent_mono_light.png + icons/skin/queued.png + icons/skin/ratio.png + icons/skin/seeding.png + icons/skin/slider-area.gif + icons/skin/spacer.gif + icons/skin/spinner-placeholder.gif + icons/skin/spinner.gif + icons/skin/splash.png + icons/skin/stalledDL.png + icons/skin/stalledUP.png + icons/skin/tabs.gif + icons/skin/toolbox-divider.gif + icons/skin/toolbox-divider2.gif + icons/skin/resumed.png + icons/skin/uploading.png + icons/skin/completed.png + icons/oxygen/system-log-out.png + icons/oxygen/go-bottom.png + icons/oxygen/go-top.png + icons/oxygen/checked.png + icons/oxygen/office-chart-line.png + icons/skin/downloadLimit.png + icons/skin/uploadLimit.png + + diff -Nru qbittorrent-4.1.3/src/lang/lang.pri qbittorrent-3.3.15/src/lang/lang.pri --- qbittorrent-4.1.3/src/lang/lang.pri 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/lang.pri 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -TS_FILES += $$files(qbittorrent_*.ts) - -# need to use full path, otherwise running -# `lupdate` will generate *.ts files in project root directory -for(file, TS_FILES) { - TRANSLATIONS += "$${PWD}/$${file}" -} - -isEmpty(QMAKE_LRELEASE) { - win32:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\\lrelease.exe - else:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease - unix { - equals(QT_MAJOR_VERSION, 5) { - !exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease-qt5 } - } - } else { - !exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease } - } -} - -message("Building translations") -TS_FILES_NOEXT = $$replace(TS_FILES, ".ts", "") -for(file, TS_FILES_NOEXT) { - message("Processing $${file}") - system("$$QMAKE_LRELEASE -silent $${file}.ts -qm $${file}.qm") - !exists("$${file}.qm"):error("Building translations failed, cannot continue") -} diff -Nru qbittorrent-4.1.3/src/lang/lang.qrc qbittorrent-3.3.15/src/lang/lang.qrc --- qbittorrent-4.1.3/src/lang/lang.qrc 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/lang.qrc 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ - - - qbittorrent_ar.qm - qbittorrent_be.qm - qbittorrent_bg.qm - qbittorrent_ca.qm - qbittorrent_cs.qm - qbittorrent_da.qm - qbittorrent_de.qm - qbittorrent_el.qm - qbittorrent_en.qm - qbittorrent_en_AU.qm - qbittorrent_en_GB.qm - qbittorrent_eo.qm - qbittorrent_es.qm - qbittorrent_eu.qm - qbittorrent_fi.qm - qbittorrent_fr.qm - qbittorrent_gl.qm - qbittorrent_he.qm - qbittorrent_hi_IN.qm - qbittorrent_hr.qm - qbittorrent_hu.qm - qbittorrent_hy.qm - qbittorrent_id.qm - qbittorrent_is.qm - qbittorrent_it.qm - qbittorrent_ja.qm - qbittorrent_ka.qm - qbittorrent_ko.qm - qbittorrent_lt.qm - qbittorrent_lv_LV.qm - qbittorrent_ms_MY.qm - qbittorrent_nb.qm - qbittorrent_nl.qm - qbittorrent_oc.qm - qbittorrent_pl.qm - qbittorrent_pt_BR.qm - qbittorrent_pt_PT.qm - qbittorrent_ro.qm - qbittorrent_ru.qm - qbittorrent_sk.qm - qbittorrent_sl.qm - qbittorrent_sr.qm - qbittorrent_sv.qm - qbittorrent_tr.qm - qbittorrent_uk.qm - qbittorrent_uz@Latn.qm - qbittorrent_vi.qm - qbittorrent_zh.qm - qbittorrent_zh_HK.qm - qbittorrent_zh_TW.qm - - diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_ar.ts qbittorrent-3.3.15/src/lang/qbittorrent_ar.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_ar.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_ar.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - + عن البرنامج - + About - + عن - + Author - + المؤلف - - Current maintainer + + + Nationality: - - Greece - اليونان - - - - - Nationality: - + + + Name: + ‫الاسم: - - + + E-mail: - + البريد الإلكتروني: - - - Name: - + + Greece + اليونان - - Original author - + + Current maintainer + مسؤول الصيانة الحالي - - France - فرنسا + + Original author + المؤلف الاصلي - + Special Thanks - + Translators - - License - - - - + Libraries - + المكتبات - + qBittorrent was built with the following libraries: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - - - - - Forum: - + + France + فرنسا - - Bug Tracker: - + + License + الترخيص @@ -112,312 +87,306 @@ Save at - حفظ في + + + + + Browse... + تصفح... - + + Set as default save path + اجعله مسار الحفظ الرئيسي + + + Never show again لا تعرض مرة أخرى - + Torrent settings إعدادات التورنت - + Set as default category - تعيين كفئة رئيسية + - + Category: - الفئة: + - + Start torrent بدء التورنت - + Torrent information - معلومات التورنت + - + Skip hash check تخطي التحقق من البيانات - + Size: الحجم: - + Hash: - هاش: + - + Comment: التعليق: - + Date: التاريخ: Torrent Management Mode: - نمط إدارة التورنت: + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - الوضع التلقائي يعني أن العديد من خصائص التورنت (مسار الحفظ مثلاً) سيتم تحديده عن طريق الفئة المحددة له. + Manual - يدوي + Automatic - تلقائي - - - - Remember last used save path - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - في حالة الاختيار, ملف التورنت لن يتم حذفه بغض النظر عن إعدادات التنزيل. + - + Do not delete .torrent file - لا تقم بحذف الملف بامتداد torrent. - - - - Create subfolder - إنشاء مجلد فرعي - - - - Download in sequential order - تنزيل بترتيب تسلسلي - - - - Download first and last pieces first - + Normal عادي - + High مرتفع - + Maximum أقصى أهمية - + Do not download لا تنزّل - - - + + + I/O Error خطأ إدخال/إخراج - + Invalid torrent ملف تورنت خاطئ - - Renaming - إعادة التسمية - - - - - Rename error - خطأ في إعادة التسمية + + + + + Already in download list + موجود في قائمة التنزيل بالفعل - - The name is empty or contains forbidden characters, please choose a different one. - - - - + Not Available This comment is unavailable غير متاح - + Not Available This date is unavailable غير متاح - + Not available غير متوفر - + Invalid magnet link رابط مغناطيسي خاطئ - + The torrent file '%1' does not exist. - ملف التورنت '%1' غير موجود. + - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. - لا يمكن قراءة ملف التورنت '%1'. على الأرجح أن الصلاحيات اللازمة غير متوفرة لديك. + - + Failed to load the torrent: %1. Error: %2 Don't remove the ' ' characters. They insert a newline. - فشل في تحميل التورنت: %1 -خطأ: %2 + + + + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + + + + + Torrent is already in download list. Trackers were merged. + التورنت موجود بالفعل في قائمة التنزيل. ستُدمج المتتبعات. + + + + + Cannot add torrent + لا يمكن إضافة التورينت - + + Cannot add this torrent. Perhaps it is already in adding state. + لا يمكن إضافة هذا التورنت. ربما لأنه في حالة الإضافة + + + This magnet link was not recognized لا يمكن التعرف على هذا الرابط المغناطيسي - + + Magnet link is already in download list. Trackers were merged. + الرابط المغناطيسي موجود بالفعل في قائمة التنزيل. ستُدمج المتتبعات. + + + + Cannot add this torrent. Perhaps it is already in adding. + لا يمكن إضافة هذا التورنت. ربما لأنه في حالة الإضافة. + + + Magnet link رابط مغناطيسي - + Retrieving metadata... يجلب البيانات الوصفية... - + Not Available This size is unavailable. غير متاح - + Free space on disk: %1 - المساحة الخالية من القرص: %1 + - + + Choose save path اختر مسار الحفظ - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - + + Rename the file + إعادة تسمية الملف - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + + New name: + الاسم الجديد: - - Magnet link is already queued for processing. - + + + The file could not be renamed + لا يمكن إعادة تسمية الملف - - New name: - الاسم الجديد: + + This file name contains forbidden characters, please choose a different one. + اسم هذا الملف يحتوي على أحرف محظورة الاستخدام في التسمية. من فضلك اختر اسماٌ آخر. - - + + This name is already in use in this folder. Please use a different name. هذا الاسم مستخدم بالفعل في هذا المجلد. من فضلك اختر اسما آخر. - + The folder could not be renamed لا يمكن إعادة تسمية المجلد - + Rename... إعادة التسمية... - + Priority الأولوية - + Invalid metadata بيانات وصفية خاطئة - + Parsing metadata... يحلّل البيانات الوصفية... - + Metadata retrieval complete اكتمل جلب البيانات الوصفية - + Download Error خطأ في التنزيل @@ -425,312 +394,198 @@ AdvancedSettings - + + Disk write cache size + كمية الذاكرة المخصصة للكتابة + + + MiB م.ب - + Outgoing ports (Min) [0: Disabled] منافذ الخروج (الأدنى) [0: معطلة] - + Outgoing ports (Max) [0: Disabled] منافذ الخروج (الأقصى) [0: معطلة] - + Recheck torrents on completion إعادة تأكيد البيانات بعد اكتمال التنزيل - + Transfer list refresh interval المدة بين اعادة تحديث الصفحة - + ms milliseconds ملي ثانية - + Setting الخيار - + Value Value set for this setting القيمة - - - (disabled) - (مُعطّل) - - - + (auto) (آلي) - - min - minutes - - - - + All addresses - جميع العناوين + - + qBittorrent Section - قسم qBittorrent + - - + + Open documentation - فتح التعليمات - - - - libtorrent Section - قسم libtorrent - - - - Asynchronous I/O threads - - Disk cache + + libtorrent Section - + s seconds ث - + Disk cache expiry interval مدة بقاء الذاكرة المؤقتة للقرص - + Enable OS cache مكّن النظام من خاصية الـcache - - Guided read cache - - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - - - - - - KiB - كيلوبايت - - - - Send buffer watermark - - - - - Send buffer low watermark - - - - - Send buffer watermark factor - - - - - Prefer TCP - - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address - + + m + minutes + د - + Resolve peer countries (GeoIP) اظهار أعلام الدول للقرناء - + Resolve peer host names اظهار اسم الجهاز للقرين - + Strict super seeding الرفع القوي المخصص - + Network Interface (requires restart) واجهة الشبكة (تتطلب إعادة تشغيل) - + Optional IP Address to bind to (requires restart) - عنوان آي بي الاختياري الذي سيتم استخدامه (يتطلب إعادة التشغيل) + - + Listen on IPv6 address (requires restart) استخدام عنوان الـIPV6 (يحتاج إلى إعادة تشغيل ) - + Display notifications - تنبيهات العرض - - - - Display notifications for added torrents - عرض تنبيهات اضافة التورنت. - - - - Download tracker's favicon - تنزيل ايقونة التراكر - - - - Save path history length - - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - - - - - Round-robin - - - - - Fastest upload - - Anti-leech + + Display notifications for added torrents - - Upload choking algorithm + + Download tracker's favicon - + Confirm torrent recheck تأكيد إعادة التحقق من التورنت - - Confirm removal of all tags - - - - - Always announce to all trackers in a tier - + Exchange trackers with other peers + تبادل المتتبعين مع القرناء الآخرين - - Always announce to all tiers - + + Always announce to all trackers + الإعلان دائما لجميع المتتبعين - + Any interface i.e. Any network interface أي واجهة - + Save resume data interval How often the fastresume file is saved. حفظ فترة استئناف البيانات - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - - - - + Maximum number of half-open connections [0: Unlimited] أكبر عدد من الاتصالات النصف مفتوحة [0: غير محدودة] - + IP Address to report to trackers (requires restart) العنوان الذي يتم اعلانه للمتتبع (يتطلب اعادة التشغيل) - + Enable embedded tracker تمكين المتتبع الداخلي - + Embedded tracker port منفذ المتتبع الداخلي - + Check for software updates البحث عن التحديثات - + Use system icon theme استخدام مظهر أيقونات النظام @@ -738,120 +593,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started - تم تشغيل qBittorrent %1 + - + Torrent: %1, running external program, command: %2 - - Torrent name: %1 - اسم التورنت: %1 - - - - Torrent size: %1 - حجم التورنت: %1 - - - - Save path: %1 - مسار الحفظ: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - تم تنزيل التورنت في %1. - - - - Thank you for using qBittorrent. - شكرا لاستخدامك كيو بت تورنت. - - - - [qBittorrent] '%1' has finished downloading + + Torrent: %1, run external program command too long (length > %2), execution failed. - + Torrent: %1, sending mail notification - + Information معلومات - - To control qBittorrent, access the Web UI at %1 - + + To control qBittorrent, access the Web UI at http://localhost:%1 + للتحكم في كيوبت‎تورنت، ادخل على واجهة استخدام الويب من المتصفح من خلال العنوان التالي: http://localhost:%1 - + The Web UI administrator user name is: %1 اسم المستخدم المسؤول لواجهة الويب هو: %1 - + The Web UI administrator password is still the default one: %1 كلمة السر للمستخدم المسؤول لواجهة الويب ما تزال الكلمة الافتراضية: %1 - + This is a security risk, please consider changing your password from program preferences. هذا خطر أمني، برجاء الأخذ بالاعتبار تغيير كلمة السر من تفضيلات البرنامج. - + Saving torrent progress... حفظ تقدم التورنت... - - - Portable mode and explicit profile directory options are mutually exclusive - - - - - Portable mode implies relative fastresume - - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: مكان الحفظ: @@ -861,816 +657,668 @@ منزّل RSS... - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - + + Enable Automated RSS Downloader + تفعيل مُنزّل RSS الآلي - + Download Rules قواعد التنزيل - + Rule Definition تعريف القاعدة - + Use Regular Expressions استخدام التعبيرات المعتادة - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - - - - + Must Contain: يجب أن تحتوي: - + Must Not Contain: يجب ألا تحتوي: - + Episode Filter: - + Assign Category: - + Save to a Different Directory حفظ إلى مجلد مختلف - + Ignore Subsequent Matches for (0 to Disable) ... X days - + Disabled - + معطّل - + days أيام - + Add Paused: إضافة المُلبث: - + Use global settings استخدام الإعدادات العامة - + Always دائما - + Never أبدا - + Apply Rule to Feeds: تطبيق القاعدة على التغذيات: - + Matching RSS Articles - + &Import... ا&ستيراد... - + &Export... ت&صدير... - + Matches articles based on episode filter. - + Example: مثال: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match - + Episode filter rules: - + Season number is a mandatory non-zero value - + Filter must end with semicolon - + Three range types for episodes are supported: - + Single number: <b>1x25;</b> matches episode 25 of season one - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one - + Episode number is a mandatory positive value - - Rules - - - - - Rules (legacy) - - - - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - + Last Match: %1 days ago - + Last Match: Unknown - آخر مطابقة: غير معروفة + - + New rule name اسم قاعدة جديد - + Please type the name of the new download rule. يرجى كتابة اسم قاعدة التنزيل الجديدة. - - + + Rule name conflict تعارض في اسم القاعدة - - + + A rule with this name already exists, please choose another name. تعارض في اسم القاعدة اختر اسم اخر. - + Are you sure you want to remove the download rule named '%1'? هل أنت متأكد من رغبتك في إزالة قاعدة التنزيل المسمّاة "%1"؟ - + Are you sure you want to remove the selected download rules? Are you sure you want to remove the selected download rules? - + Rule deletion confirmation تأكيد حذف القاعدة - + Destination directory المجلد المستهدف - + Invalid action - + حركة خاطئة - + The list is empty, there is nothing to export. - + القائمة فارغة، ولا يوجد شيء لتصديره. - - Export RSS rules - + + Where would you like to save the list? + أين ترغب أن تحفظ القائمة؟ - - + + Rules list (*.rssrules) + قائمة القواعد (*.rssrules) + + + I/O Error - + خطأ إدخال/إخراج - - Failed to create the destination file. Reason: %1 - + + Failed to create the destination file + خطأ في انشاء الملف - - Import RSS rules - + + Please point to the RSS download rules file + Please point to the RSS download rules file - - Failed to open the file. Reason: %1 - + + Rules list + قائمة القواعد - + Import Error - + خطأ في الاستيراد - - Failed to import the selected rules file. Reason: %1 - + + Failed to import the selected rules file + فشل في استيراد ملف القواعد المختار - + Add new rule... اضافة قاعدة جديدة... - + Delete rule حذف القاعدة - + Rename rule... تغيير تسمية القاعدة... - + Delete selected rules حذف القواعد المختارة - - Clear downloaded episodes... - - - - + Rule renaming تغيير تسمية القاعدة - + Please type the new rule name اكتب اسم القاعدة الجديدة - - Clear downloaded episodes - - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - - - - - - Position %1: %2 - + + Regex mode: use Perl-like regular expressions + Regex mode: use Perl-like regular expressions - + Wildcard mode: you can use - + ? to match any single character - + * to match zero or more of any characters - + Whitespaces count as AND operators (all words, any order) - + | is used as OR operator - + If word order is important use * instead of whitespace. - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - + will match all articles. - + will exclude all articles. - - - BanListOptionsDialog - - - List of banned IP addresses - - - - - Ban IP - - - - Delete - حذف - - - - - Warning - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> - - The entered IP address is invalid. - - - - - The entered IP is already banned. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support - - Could not get GUID of configured network interface. Binding to IP %1 - - - - + Embedded Tracker [ON] المتتبع الداخلي [يعمل] - + Failed to start the embedded tracker! فشل محاولة تشغيل المتتبع الداخلي! - + Embedded Tracker [OFF] المتتبع الداخلي [متوقف] - + + '%1' reached the maximum ratio you set. Removing... + + + + + '%1' reached the maximum ratio you set. Pausing... + + + + System network status changed to %1 e.g: System network status changed to ONLINE - + ONLINE متصل - + OFFLINE غير متصل - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. - - + Encryption support [%1] - - + FORCED - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - - - - - + Anonymous mode [%1] - + Unable to decode '%1' torrent file. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' - + Queue positions were corrected in %1 resume files - + Couldn't save '%1.torrent' لا يمكن حفظ '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - - - - + because %1 is disabled. this peer was blocked because uTP is disabled. - + because %1 is disabled. this peer was blocked because TCP is disabled. - + URL seed lookup failed for URL: '%1', message: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... يجري تنزيل "%1"، يرجى الانتظار... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 - + The network interface defined is invalid: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 - - Peer ID: - - - - - HTTP User-Agent is '%1' - - - - - + DHT support [%1] - - - - - - - - - + + + + ON - - - - - - - - - + + + + OFF - - + Local Peer Discovery support [%1] - - PeX support [%1] - - - - - '%1' reached the maximum ratio you set. Removed. - - - - - '%1' reached the maximum ratio you set. Paused. - - - - - '%1' reached the maximum seeding time you set. Removed. - - - - - '%1' reached the maximum seeding time you set. Paused. - - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface - + Tracker '%1' was added to torrent '%2' - + Tracker '%1' was deleted from torrent '%2' - + URL seed '%1' was added to torrent '%2' - + URL seed '%1' was removed from torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Error: Failed to parse the provided IP filter. - - '%1' restored. - 'torrent name' restored. + + Couldn't add torrent. Reason: %1 - - Couldn't add torrent. Reason: %1 + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) - + '%1' added to download list. 'torrent name' was added to download list. - + An I/O error occurred, '%1' paused. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 - + due to IP filter. this peer was blocked due to ip filter. - + due to port filter. this peer was blocked due to port filter. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. - + because it has a low port. this peer was blocked because it has a low port. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 - + External IP: %1 e.g. External IP: 192.168.0.1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + File sizes mismatch for torrent '%1', pausing it. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... @@ -1678,17 +1326,17 @@ CategoryFilterModel - + Categories - الفئات + - + All - الكل + الكل - + Uncategorized @@ -1703,38 +1351,71 @@ Add subcategory... - إضافة تصنيف فرعي... - - - - Edit category... - + Remove category - + Remove unused categories - + Resume torrents استئناف التورنتات - + Pause torrents إلباث التورنتات - + Delete torrents حذف التورنتات + + + New Category + + + + + Category: + + + + + Invalid category name + + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + CookiesDialog @@ -1773,106 +1454,58 @@ - DeletionConfirmationDialog - - - Deletion confirmation - - - - - Remember choice - - - - - Also delete the files on the hard disk - - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + هل أنت متأكد من رغبتك في حذف '%1' من قائمة النقل؟ - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - - - - - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - التحميل - - - - No URL entered - - - - - Please type at least one URL. - + هل أنت متأكد من رغبتك في حذف هذه التورنتات الـ %1 من قائمة النقل؟ DownloadedPiecesBar - + White: Missing pieces الأبيض: قطع ناقصة - + Green: Partial pieces الأخضر: قطع جزئية - + Blue: Completed pieces الأزرق: قطع اكتمل تنزيلها - ExecutionLogWidget + ExecutionLog - + General - عام + عام - + Blocked IPs - + الاي بي المحجوب - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> was banned x.y.z.w was banned @@ -1881,112 +1514,41 @@ FeedListWidget - + RSS feeds RSS feeds - - - Unread (%1) - + + Unread + غير مقروء FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - - - - - &Browse... - Launch file dialog button text (full) - - - - - Choose a file - Caption for file open/save dialog - - - - - Choose a folder - Caption for directory open dialog - - - - - Any file + + An error occured while trying to open the log file. Logging to file is disabled. FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - - - - - - - IP filter line %1 is malformed. - - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - - - - - - IP filter exception thrown for line %1. Exception is: %2 - - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. + + + + I/O Error: Could not open ip filter file in read mode. - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. @@ -1994,395 +1556,472 @@ GeoIPDatabase - - + + Unsupported database file size. - + Metadata error: '%1' entry not found. خطأ في البيانات الوصفية: لم يُعثر على المُدخلة '%1'. - + Metadata error: '%1' entry has invalid type. خطأ في البيانات الوصفية: المُدخلة '%1' هي نوع غير صالح. - + Unsupported database version: %1.%2 - + Unsupported IP version: %1 - + Unsupported record size: %1 - + Invalid database type: %1 - + Database corrupted: no data section found. - Http::Connection - - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - - + HttpServer - - Bad Http request, closing socket. IP: %s - + + File + ملف - - - HttpServer - Exit qBittorrent - + Edit + تعديل - - Only one link per line + + Help + مساعدة + + + + Exit qBittorrent + + + + + Only one link per line رابط واحد لكل سطر - + + Download + تنزيل + + + Global upload rate limit must be greater than 0 or disabled. مُعدل حد الرفع العام يجب أن يكون أكبر من 0 أو معطل. - + Global download rate limit must be greater than 0 or disabled. مُعدل حد التنزيل العام يجب أن يكون أكبر من 0 أو معطل. - + Alternative upload rate limit must be greater than 0 or disabled. مُعدل حد الرفع البديل يجب أن يكون أكبر من 0 أو معطل. - + Alternative download rate limit must be greater than 0 or disabled. مُعدل حد التنزيل البديل يجب أن يكون أكبر من 0 أو معطل. - + Maximum active downloads must be greater than -1. - + Maximum active uploads must be greater than -1. - + Maximum active torrents must be greater than -1. - + Maximum number of connections limit must be greater than 0 or disabled. أقصى عدد من الاتصالات يجب أن يكون أكبر من 0 أو معطل. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. أقصى عدد من الاتصالات لكل تورنت يجب أن يكون أكبر من 0 أو معطل. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. أقصى عدد من مقاطع الرفع لكل تورنت يجب أن يكون أكبر من 0 أو معطل. - + Unable to save program preferences, qBittorrent is probably unreachable. لا يمكن حفظ تفضيلات البرنامج, والسبب على الأرجح هو عدم إمكانية الوصول إلى البرنامج. - - IRC: #qbittorrent on Freenode - - - - - Invalid category name: -Please do not use any special characters in the category name. - - - - - Unknown - غير معروف - - - - Hard Disk - - - - - Share ratio limit must be between 0 and 9998. - - - - - Seeding time limit must be between 0 and 525600 minutes. - + + Language + اللغة - + The port used for incoming connections must be between 1 and 65535. - + The port used for the Web UI must be between 1 and 65535. - + Unable to log in, qBittorrent is probably unreachable. - + Invalid Username or Password. اسم مستخدم أو كلمة سر غير صحيحة. - - Username - - - - + Password كلمة السر - + Login ولوج - + + Upload Failed! + فشل الرفع! + + + Original authors المؤلفين الأصليين - + + Upload limit: + حد الرفع: + + + + Download limit: + حد التنزيل: + + + Apply تطبيق - + Add إضافة - + + Category: + + + + Upload Torrents Upload torrent files to qBittorent using WebUI - + + All + الكل + + + + Downloading + التنزيل + + + + Seeding + البذر + + + + Completed + المكتمل + + + + Resumed + المُستأنف + + + + Paused + المُلبث + + + + Active + النشط + + + + Inactive + الغير نشط + + + Save files to location: حفظ الملفات إلى المجلد: - + Cookie: - + Type folder here - + + Run an external program on torrent completion + + + + + Enable bandwidth management (uTP) + + + + + Apply rate limit to uTP connections + + + + + Alternative Global Rate Limits + + + + More information - معلومات أكثر + - + Information about certificates - + Save Files to - - Set location + + Watch Folder - - Limit upload rate + + Default Folder - - Limit download rate + + from + from time1 to time2 - - Rename torrent + + to + from time1 to time2 - - Unable to create category + + Other... + Save Files to: Watch Folder / Default Folder / Other... - - Other... - Save Files to: Watch Folder / Default Folder / Other... + + Every day + Schedule the use of alternative rate limits on ... - + + Week days + Schedule the use of alternative rate limits on ... + + + + + Week ends + Schedule the use of alternative rate limits on ... + + + + Monday Schedule the use of alternative rate limits on ... - الاثنين + - + Tuesday Schedule the use of alternative rate limits on ... - الثلاثاء + - + Wednesday Schedule the use of alternative rate limits on ... - الأربعاء + - + Thursday Schedule the use of alternative rate limits on ... - الخميس + - + Friday Schedule the use of alternative rate limits on ... - الجمعة + - + Saturday Schedule the use of alternative rate limits on ... - السبت + - + Sunday Schedule the use of alternative rate limits on ... - الأحد + - + + Downloaded + Is the file downloaded or not? + تم تنزيله + + + Logout خروج - + + Download from URLs + + + + Download Torrents from their URLs or Magnet links - + Upload local torrent رفع تورنت محلي - + Are you sure you want to delete the selected torrents from the transfer list? هل أنت متأكد من رغبتك في حذف التورنتات المختارة من قائمة النقل؟ - + Save حفظ - + qBittorrent client is not reachable تعذّر الوصول إلى عميل كيوبت‎تورنت - - qBittorrent has been shutdown. - تم اغلاق البرنامج - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - + + HTTP Server + خادم HTTP - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - + + The following parameters are supported: + العوامل الآتية هي المدعومة: - - Add subnet - + + Torrent path + مسار التورنت - - Delete - حذف + + Torrent name + اسم التورنت - - Error - خطأ + + qBittorrent has been shutdown. + تم اغلاق البرنامج + + + LineEdit - - The entered subnet is invalid. - + + Clear the text + مسح النص LogListWidget - + Copy نسخ - + Clear مسح @@ -2415,550 +2054,491 @@ عند انت&هاء التنزيلات - + &View &عرض - + &Options... &خيارات... - + &Resume ا&ستئناف - + Torrent &Creator مُ&نشيء التورنت - + Set Upload Limit... تعيين حد الرفع... - + Set Download Limit... تعيين حد التنزيل... - + Set Global Download Limit... تعيين حد التنزيل العام... - + Set Global Upload Limit... تعيين حد الرفع العام... - + Minimum Priority أقل أولوية - + Top Priority أعلى أولوية - + Decrease Priority خفض الأولوية - + Increase Priority زيادة الأولوية - - + + Alternative Speed Limits حدود السرعات البديلة - + &Top Toolbar شريط الأدوات ال&علوي - + Display Top Toolbar عرض شريط الأدوات العلوي - - Status &Bar - - - - + S&peed in Title Bar ال&سرعة في شريط العنوان - + Show Transfer Speed in Title Bar عرض السرعة في شريط العنوان - + &RSS Reader &قارئ RSS - + Search &Engine مُ&حرك البحث - + L&ock qBittorrent &قفل واجهة البرنامج - + Do&nate! ت&برع! - - Close Window - - - - + R&esume All اس&تئناف الكل - + Manage Cookies... - + Manage stored network cookies - + Normal Messages - رسالات عادية + - + Information Messages - رسالات معلومة + - + Warning Messages - رسالات تحذيرية + - + Critical Messages - رسالات حرجة + - + &Log ال&سجل - + &Exit qBittorrent إ&غلاق البرنامج - + &Suspend System ت&عليق النظام - + &Hibernate System إ&لباث النظام - + S&hutdown System إ&طفاء تشغيل الجهاز - + &Disabled ت&عطيل - + &Statistics الإ&حصائات - + Check for Updates البحث عن تحديثات - + Check for Program Updates التحقق من وجود تحديثات للتطبيق - + &About &عن - + &Pause إ&لباث - + &Delete &حذف - + P&ause All إل&باث الكل - + &Add Torrent File... إ&ضافة ملف تورنت... - + Open فتح - + E&xit &خروج - + Open URL فتح الرابط - + &Documentation الت&عليمات - + Lock أوصد - - - + + + Show أظهر - + Check for program updates التحقق من وجود تحديثات للتطبيق - + Add Torrent &Link... إضافة &رابط تورنت... - + If you like qBittorrent, please donate! إذا أعجبك كيوبت‎تورنت، رجاءً تبرع! - - + Execution Log السجل - + Clear the password إزالة كلمة السر - + Filter torrent list... تصفية قائمة التورنت... - + &Set Password ت&عيين كلمة سر - - Preferences - - - - + &Clear Password &مسح كلمة السر - + Transfers النقل - - - qBittorrent is minimized to tray - + + Torrent file association + الإرتباط بملف التورنت - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - - Torrent file association - الإرتباط بملف التورنت - - - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? كيوبت‎تورنت ليس التطبيق الافتراضي لفتح ملفات التورنت والروابط الممغنطة. هل ترغب بربط كيوبت‎تورنت بملفات التورنت والروابط الممغنطة ؟ - + Icons Only أيقونات فقط - + Text Only نص فقط - + Text Alongside Icons النص بجانب الأيقونات - + Text Under Icons النص أسفل الأيقونات - + Follow System Style اتباع شكل النظام - - - + + + UI lock password كلمة سر قفل الواجهة - - - + + + Please type the UI lock password: اكتب كلمة سر قفل الواجهة: - + The password should contain at least 3 characters يجب أن لا تقل كلمة السر عن ثلاثة أحرف - + Password update تحديث كلمة السر - + The UI lock password has been successfully updated تم تحديث كلمة سر قفل الواجهة - + Are you sure you want to clear the password? هل ترغب حقا في إزالة كلمة السر؟ - - Use regular expressions - - - - + Search البحث - + Transfers (%1) النقل (%1) - + Error خطأ - + Failed to add torrent: %1 فشل في إضافة التورنت: %1 - + Torrent added - + '%1' was added. e.g: xxx.avi was added. - + Download completion انتهاء التنزيل - + I/O Error i.e: Input/Output Error خطأ في الإخراج/الإدخال - + Recursive download confirmation تأكيد متكرر للتنزيل - + Yes نعم - + No لا - + Never أبدا - + Global Upload Speed Limit حدود سرعة الرفع العامة - + Global Download Speed Limit حدود سرعة التنزيل العامة - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - - - - - Are you sure you want to quit qBittorrent? - - - - + &No &لا - + &Yes &نعم - + &Always Yes نعم &دائما - - %1/s - s is a shorthand for seconds - - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - + qBittorrent Update Available يوجد تحديث متاح - + + A new version is available. +Do you want to download %1? + + + + Already Using the Latest qBittorrent Version أنت تستخدم الإصدارة الأخيرة - + Undetermined Python version - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2966,155 +2546,151 @@ - + The torrent '%1' contains torrent files, do you want to proceed with their download? - + Couldn't download file at URL '%1', reason: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - - + + Couldn't determine your Python version (%1). Search engine disabled. + + + + + Missing Python Interpreter - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? - + Python is required to use the search engine but it does not seem to be installed. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. - + &Check for Updates - &فحص وجود تحديثات + - + Checking for Updates... - يتفقد وجود تحديثات... + - + Already checking for program updates in the background يتحقق من وجود تحديثات للتطبيق في الخلفية - + Python found in '%1' - + Download error خطأ في التنزيل - + Python setup could not be downloaded, reason: %1. Please install it manually. - - + + Invalid password كلمة سرّ خاطئة - - - + + RSS (%1) - + URL download error - + The password is invalid كلمة السرّ خاطئة - - + + DL speed: %1 e.g: Download speed: 10 KiB/s سرعة التنزيل: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s سرعة الرفع: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [تنزيل: %1, رفع: %2] كيوبت‎تورنت %3 - + Hide إخفاء - + Exiting qBittorrent إغلاق البرنامج - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + بعض الملفات تنقل حاليا. +هل أنت متأكد أنك ترغب في إغلاق البرنامج؟ + + + Open Torrent Files فتح ملف تورنت - + Torrent Files ملفات التورنت - + Options were saved successfully. تم حفظ الخيارات بنجاح. @@ -3122,52 +2698,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. - + Dynamic DNS error: hostname supplied does not exist under specified account. - + Dynamic DNS error: Invalid username/password. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. - + Dynamic DNS error: supplied domain name is invalid. - + Dynamic DNS error: supplied username is too short. - + Dynamic DNS error: supplied password is too short. @@ -3175,1413 +2751,1303 @@ Net::DownloadHandler - + I/O Error - + The file size is %1. It exceeds the download limit of %2. - + Unexpected redirect to magnet URI. إعادة توجيه غير متوقعة لرابط ممغنط. - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. - - + + Couldn't load GeoIP database. Reason: %1 - + Venezuela, Bolivarian Republic of - + Viet Nam - - + + N/A غير موجود - + Andorra أندورا - + United Arab Emirates الإمارات العربية المتحدة - + Afghanistan أفغانستان - + Antigua and Barbuda أنتيغوا وبربودا - + Anguilla أنغيلا - + Albania ألبانيا - + Armenia أرمينيا - + Angola أنغولا - + Antarctica القارة القطبية الجنوبية - + Argentina الأرجنتين - + American Samoa ساموا الأمريكية - + Austria النمسا - + Australia أستراليا - + Aruba أروبا - + Azerbaijan أذربيجان - + Bosnia and Herzegovina البوسنة والهرسك - + Barbados بربادوس - + Bangladesh بنغلاديش - + Belgium بلجيكا - + Burkina Faso بوركينا فاسو - + Bulgaria بلغاريا - + Bahrain البحرين - + Burundi بوروندي - + Benin بنين - + Bermuda برمودا - + Brunei Darussalam بروناي دار السلام - + Brazil البرازيل - + Bahamas جزر البهاما - + Bhutan بوتان - + Bouvet Island جزيرة بوفيت - + Botswana بوتسوانا - + Belarus روسيا البيضاء - + Belize بليز - + Canada كندا - + Cocos (Keeling) Islands جزر كوكوس (كيلينغ) - + Congo, The Democratic Republic of the الكونغو، جمهورية الكونغو الديمقراطية - + Central African Republic جمهورية أفريقيا الوسطى - + Congo الكونغو - + Switzerland سويسرا - + Cook Islands جزر كوك - + Chile تشيلي - + Cameroon الكاميرون - + China الصين - + Colombia كولومبيا - + Costa Rica كوستاريكا - + Cuba كوبا - + Cape Verde الرأس الأخضر - + Curacao - + Christmas Island جزيرة الكريسماس - + Cyprus قبرص - + Czech Republic جمهورية التشيك - + Germany ألمانيا - + Djibouti جيبوتي - + Denmark الدنمارك - + Dominica دومينيكا - + Dominican Republic جمهورية الدومنيكان - + Algeria الجزائر - + Ecuador الإكوادور - + Estonia استونيا - + Egypt مصر - + Western Sahara الصحراء الغربية - + Eritrea إريتريا - + Spain إسبانيا - + Ethiopia أثيوبيا - + Finland فنلندا - + Fiji فيجي - + Falkland Islands (Malvinas) جزر فوكلاند (مالفيناس) - + Micronesia, Federated States of ولايات ميكرونيزيا الموحدة من - + Faroe Islands جزر فارو - + France فرنسا - + Gabon الغابون - + United Kingdom المملكة المتحدة - + Grenada غرينادا - + Georgia جورجيا - + French Guiana غيانا الفرنسية - + Ghana غانا - + Gibraltar جبل طارق - + Greenland جرين لاند - + Gambia غامبيا - + Guinea غينيا - + Guadeloupe غوادلوب - + Equatorial Guinea غينيا الإستوائية - + Greece اليونان - + South Georgia and the South Sandwich Islands جورجيا الجنوبية وجزر ساندويتش الجنوبية - + Guatemala غواتيمالا - + Guam غوام - + Guinea-Bissau غينيا بيساو - + Guyana غيانا - + Hong Kong هونج كونج - + Heard Island and McDonald Islands جزيرة هيرد وجزر ماكدونالد - + Honduras هندوراس - + Croatia كرواتيا - + Haiti هايتي - + Hungary هنغاريا - + Indonesia أندونيسيا - + Ireland أيرلندا - + Israel فلسطين - + India الهند - + British Indian Ocean Territory إقليم المحيط الهندي البريطاني - + Iraq العراق - + Iran, Islamic Republic of جمهورية إيران الإسلامية - + Iceland أيسلندا - + Italy إيطاليا - + Jamaica جامايكا - + Jordan الأردن - + Japan اليابان - + Kenya كينيا - + Kyrgyzstan قيرغيزستان - + Cambodia كمبوديا - + Kiribati كيريباس - + Comoros جزر القمر - + Saint Kitts and Nevis سانت كيتس ونيفيس - + Korea, Democratic People's Republic of جمهورية كوريا الشعبية الديمقراطية - + Korea, Republic of جمهورية كوريا - + Kuwait الكويت - + Cayman Islands جزر كايمان - + Kazakhstan كازاخستان - + Lao People's Democratic Republic جمهورية لاو الديمقراطية الشعبية - + Lebanon لبنان - + Saint Lucia سانت لوسيا - + Liechtenstein ليشتنشتاين - + Sri Lanka سيريلانكا - + Liberia ليبيريا - + Lesotho ليسوتو - + Lithuania ليتوانيا - + Luxembourg لوكسمبورغ - + Latvia لاتفيا - + Morocco المغرب - + Monaco موناكو - + Moldova, Republic of جمهورية مولدوفا - + Madagascar مدغشقر - + Marshall Islands جزر مارشال - + Mali مالي - + Myanmar ميانمار - + Mongolia منغوليا - + Northern Mariana Islands جزر مريانا الشمالية - + Martinique مارتينيك - + Mauritania موريتانيا - + Montserrat مونتسيرات - + Malta مالطا - + Mauritius موريشيوس - + Maldives جزر المالديف - + Malawi ملاوي - + Mexico المكسيك - + Malaysia ماليزيا - + Mozambique موزمبيق - + Namibia ناميبيا - + New Caledonia كاليدونيا الجديدة - + Niger النيجر - + Norfolk Island جزيرة نورفولك - + Nigeria نيجيريا - + Nicaragua نيكاراغوا - + Netherlands هولندا - + Norway النرويج - + Nepal نيبال - + Nauru ناورو - + Niue نيوي - + New Zealand نيوزيلندا - + Oman عمان - + Panama بناما - + Peru بيرو - + French Polynesia بولينيزيا الفرنسية - + Papua New Guinea بابوا غينيا الجديدة - + Philippines الفلبين - + Pakistan باكستان - + Poland بولندا - + Saint Pierre and Miquelon سان بيار وميكلون - + Puerto Rico بورتوريكو - + Portugal البرتغال - + Palau بالاو - + Paraguay باراغواي - + Qatar قطر - + Reunion ريوينيون - + Romania رومانيا - + Russian Federation الفيدرالية الروسية - + Rwanda رواندا - + Saudi Arabia المملكة العربية السعودية - + Solomon Islands جزر سليمان - + Seychelles سيشيل - + Sudan السودان - + Sweden السويد - + Singapore سنغافورة - + Slovenia سلوفينيا - + Svalbard and Jan Mayen سفالبارد وجان مايان - + Slovakia سلوفاكيا - + Sierra Leone سيراليون - + San Marino سان مارينو - + Senegal السنغال - + Somalia الصومال - + Suriname سورينام - + Sao Tome and Principe ساو تومي وبرينسيبي - + El Salvador السلفادور - + Syrian Arab Republic الجمهورية العربية السورية - + Swaziland سوازيلاند - + Turks and Caicos Islands جزر تركس وكايكوس - + Chad تشاد - + French Southern Territories الأقاليم الفرنسية الجنوبية - + Togo توغو - + Thailand تايلاند - + Tajikistan طاجيكستان - + Tokelau توكيلاو - + Turkmenistan تركمانستان - + Tunisia تونس - + Tonga تونغا - - Could not decompress GeoIP database file. - - - - + Timor-Leste تيمور الشرقية - + Bolivia, Plurinational State of - + Bonaire, Sint Eustatius and Saba - + Cote d'Ivoire - + Libya - + Saint Martin (French part) - + Macedonia, The Former Yugoslav Republic of - + Macao - + Pitcairn - + Palestine, State of - + Saint Helena, Ascension and Tristan da Cunha - + South Sudan - + Sint Maarten (Dutch part) - + Turkey تركيا - + Trinidad and Tobago ترينداد وتوباغو - + Tuvalu توفالو - + Taiwan تايوان - + Tanzania, United Republic of جمهورية تنزانيا المتحدة - + Ukraine أوكرانيا - + Uganda أوغندا - + United States Minor Outlying Islands - + United States الولايات المتحدة - + Uruguay أوروغواي - + Uzbekistan أوزبكستان - + Holy See (Vatican City State) الكرسي الرسولي (دولة الفاتيكان) - + Saint Vincent and the Grenadines سانت فنسنت وجزر غرينادين - + Virgin Islands, British جزر العذراء البريطانية - + Virgin Islands, U.S. جزر فيرجن الأمريكية. - + Vanuatu فانواتو - + Wallis and Futuna واليس وفوتونا - + Samoa ساموا - + Yemen اليمن - + Mayotte مايوت - + Serbia صربيا - + South Africa جنوب أفريقيا - + Zambia زامبيا - + Montenegro الجبل الأسود - + Zimbabwe زيمبابوي - + Aland Islands جزر آلاند - + Guernsey غيرنسي - + Isle of Man جزيرة مان - + Jersey جيرسي - + Saint Barthelemy سانت بارتيليمي - + + Could not uncompress GeoIP database file. + + + + Couldn't save downloaded GeoIP database file. - + Successfully updated GeoIP database. - + Couldn't download GeoIP database file. Reason: %1 @@ -4589,12 +4055,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] - + UPnP / NAT-PMP support [OFF] @@ -4602,7 +4068,7 @@ Net::Smtp - + Email Notification Error: @@ -4610,1273 +4076,1077 @@ OptionsDialog - + Options - خيارات + - + Behavior - + Downloads التنزيلات - + Connection الاتصال - + Speed السرعة - + BitTorrent - - RSS - - - - + Web UI - واجهة الويب + - + Advanced - متقدم + - + Language - اللغة + اللغة - + User Interface Language: - + (Requires restart) - + Transfer List - + Confirm when deleting torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. - + Hide zero and infinity values - + Always - دائما + دائما - + Paused torrents only - + Action on double-click - + Downloading torrents: - - + + Start / Stop Torrent - - + + Open destination folder فتح المجلد الحاوي - - + + No action - + Completed torrents: - + Desktop - سطح الكتب + - + Start qBittorrent on Windows start up - + Show splash screen on start up - + Start qBittorrent minimized - + Confirmation on exit when torrents are active - + Confirmation on auto-exit when downloads finish - - KiB - كيلوبايت + + Show qBittorrent in notification area + - - Email notification &upon download completion + + Minimize qBittorrent to notification area - - Run e&xternal program on torrent completion + + Close qBittorrent to notification area + i.e: The systray tray icon will still be visible when closing the main window. - - IP Fi&ltering + + Tray icon style: - - Schedule &the use of alternative rate limits - + + Normal + عادي - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + + Monochrome (Dark theme) - - &Torrent Queueing + + Monochrome (Light theme) - - Seed torrents until their seeding time reaches + + File association - - A&utomatically add these trackers to new downloads: + + Use qBittorrent for .torrent files - - RSS Reader + + Use qBittorrent for magnet links - - Enable fetching RSS feeds + + Power Management - - Feeds refresh interval: + + Inhibit system sleep when torrents are active - - Maximum number of articles per feed: + + Log file - - - min - minutes + + Save path: - - RSS Torrent Auto Downloader + + Backup the log file after: - - Enable auto downloading of RSS torrents + + MB - - Edit auto downloading rules... + + Delete backup logs older than: - - Web User Interface (Remote control) + + days + Delete backup logs older than 10 months - - IP address: + + months + Delete backup logs older than 10 months - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. + + years + Delete backup logs older than 10 years - - Server domains: + + When adding a torrent - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. + + Display torrent content and some options - - &Use HTTPS instead of HTTP + + Bring torrent dialog to the front - - Bypass authentication for clients on localhost + + Do not start the download automatically + The torrent will be added to download list in pause state - - Bypass authentication for clients in whitelisted IP subnets + + Should the .torrent file be deleted after adding it - - IP subnet whitelist... + + Delete .torrent files afterwards - - Upda&te my dynamic domain name + + Also delete .torrent files whose addition was cancelled - - Minimize qBittorrent to notification area + + Also when addition is cancelled - - Close qBittorrent to notification area - i.e: The systray tray icon will still be visible when closing the main window. + + Warning! Data loss possible! - - Tray icon style: + + Saving Management - - Normal - عادي + + Default Torrent Management Mode: + - - Monochrome (Dark theme) + + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - - Monochrome (Light theme) + + Manual - - File association + + Automatic - - Use qBittorrent for .torrent files + + When Torrent Category changed: - - Use qBittorrent for magnet links + + Relocate torrent - - Power Management - إدارة الطاقة + + Switch torrent to Manual Mode + - - Save path: - مسار الحفظ: + + When Default Save Path changed: + - - Backup the log file after: + + + Relocate affected torrents - - Delete backup logs older than: + + + Switch affected torrents to Manual Mode - - days - Delete backup logs older than 10 months - أيام + + When Category changed: + - - months - Delete backup logs older than 10 months - شهور + + Use Subcategories + - - years - Delete backup logs older than 10 years - أعوام + + Default Save Path: + - - When adding a torrent + + Keep incomplete torrents in: - - Bring torrent dialog to the front + + Copy .torrent files to: - - Do not start the download automatically - The torrent will be added to download list in pause state + + Copy .torrent files for finished downloads to: - - Should the .torrent file be deleted after adding it + + Pre-allocate disk space for all files - - Also delete .torrent files whose addition was cancelled + + Append .!qB extension to incomplete files - - Also when addition is cancelled + + Automatically add torrents from: - - Warning! Data loss possible! + + Add entry - - Saving Management + + Remove entry - - Default Torrent Management Mode: + + Email notification upon download completion - - Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category + + Destination email: - - Manual - يدوي - - - - Automatic - آلي - - - - When Torrent Category changed: - - - - - Relocate torrent - - - - - Switch torrent to Manual Mode - - - - - When Default Save Path changed: - - - - - - Relocate affected torrents - - - - - - Switch affected torrents to Manual Mode - - - - - When Category changed: - - - - - Use Subcategories - - - - - Default Save Path: - - - - - Keep incomplete torrents in: - - - - - Copy .torrent files to: - - - - - Show &qBittorrent in notification area - - - - - &Log file - - - - - Display &torrent content and some options - - - - - Create subfolder for torrents with multiple files - إنشاء مجلد فرعي للتورنتات متعددة الملفات - - - - De&lete .torrent files afterwards - - - - - Copy .torrent files for finished downloads to: - - - - - Pre-allocate disk space for all files - - - - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding - - - - - Append .!qB extension to incomplete files - - - - - Enable recursive download dialog - - - - - Automatically add torrents from: - - - - - Add entry - - - - - Remove entry - - - - + SMTP server: - + This server requires a secure connection (SSL) - - + + + Authentication - - - - + + + + Username: - اسم المستخدم: + اسم المستخدم: - - - - + + + + Password: - كلمة المرور: + كلمة السرّ: - - Enabled protocol: + + Run external program on torrent completion - - TCP and μTP - - - - + Listening Port - + Port used for incoming connections: - + Random - عشوائي + - + Use UPnP / NAT-PMP port forwarding from my router - + Use different port on each startup - + Connections Limits - + Maximum number of connections per torrent: - + Global maximum number of connections: - + Maximum number of upload slots per torrent: - + Global maximum number of upload slots: - + Proxy Server - + Type: - النوع: + - + (None) - + SOCKS4 - + SOCKS5 - + HTTP - + Host: - - + + Port: - المنفذ: + - + Otherwise, the proxy server is only used for tracker connections - + Use proxy for peer connections - + Disable connections not supported by proxies - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - + Use proxy only for torrents - - A&uthentication + + Info: The password is saved unencrypted - - Info: The password is saved unencrypted + + IP Filtering - + Filter path (.dat, .p2p, .p2b): - + Reload the filter - - Manually banned IP addresses... - - - - + Apply to trackers - + Global Rate Limits - - - - - - - KiB/s + + + Upload: - - - Upload: - الرفع: + + + + + KiB/s + ك.ب/ث - - + + Download: - التنزيل: + - + Alternative Rate Limits - - + + Schedule the use of alternative rate limits + + + + From: from (time1 to time2) - من: + - - + To: time1 to time2 - إلى: + - + When: - عندما: + - + Every day - كل يوم + - + Weekdays - نهاية اليوم + - + Weekends - نهاية الأسبوع + - + Rate Limits Settings - + Apply rate limit to peers on LAN - + Apply rate limit to transport overhead - - + + + Enable µTP protocol + + + + Apply rate limit to µTP protocol - + Privacy - الخصوصية + - + Enable DHT (decentralized network) to find more peers - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers - + Look for peers on your local network - + Enable Local Peer Discovery to find more peers - + Encryption mode: - + Prefer encryption - + Require encryption - + Disable encryption - + Enable when using a proxy or a VPN connection - + Enable anonymous mode - - Maximum active downloads: - - - - - Maximum active uploads: - - - - - Maximum active torrents: + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - Do not count slow torrents in these limits + + Torrent Queueing - - Upload rate threshold: + + Maximum active downloads: - - Download rate threshold: + + Maximum active uploads: - - sec - seconds + + Maximum active torrents: - - Torrent inactivity timer: + + Do not count slow torrents in these limits - + Share Ratio Limiting - + Seed torrents until their ratio reaches - + then - ثم + - + Pause them - + Remove them - - RSS Smart Episode Filters + + Automatically add these trackers to new downloads: - - Use UPnP / NAT-PMP to forward the port from my router + + Enable Web User Interface (Remote control) - - Certificate: + + Use UPnP / NAT-PMP to forward the port from my router - - Import SSL Certificate + + Use HTTPS instead of HTTP - - Key: - المفتاح: + + Certificate: + - - Import SSL Key + + Import SSL Certificate - - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> + + Key: - - Use alternative Web UI + + Import SSL Key - - Files location: + + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - - Enable clickjacking protection + + Bypass authentication for localhost - - Enable Cross-Site Request Forgery (CSRF) protection + + Update my dynamic domain name - + Service: - الخدمة: + - + Register - + Domain name: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): - + %N: Torrent name - + %L: Category - - %G: Tags (seperated by comma) - - - - + %F: Content path (same as root path for multifile torrent) - + %R: Root path (first torrent subdirectory path) - + %D: Save path - + %C: Number of files - + %Z: Torrent size (bytes) - + %T: Current tracker - + %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor - + Folder is already being monitored: - + Folder does not exist: - الملف غير موجود: + - + Folder is not readable: - + Adding entry failed - - - - + + Choose export directory - - - + + + + + + Choose a save directory - + Choose an IP filter file - + All supported filters - + SSL Certificate - + + SSL Key + + + + Parsing error - + Failed to parse the provided IP filter - + Successfully refreshed - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Invalid key - + This is not a valid SSL key. - + Invalid certificate - - Preferences - - - - - Import SSL certificate - - - - + This is not a valid SSL certificate. - - Import SSL key - - - - - SSL key - - - - + Time Error - + The start time and the end time can't be the same. - - + + Length Error - + The Web UI username must be at least 3 characters long. - + The Web UI password must be at least 6 characters long. @@ -5884,72 +5154,72 @@ PeerInfo - - Interested(local) and Choked(peer) + + interested(local) and choked(peer) - + interested(local) and unchoked(peer) - + interested(peer) and choked(local) - + interested(peer) and unchoked(local) - + optimistic unchoke - + peer snubbed - + incoming connection - + not interested(local) and unchoked(peer) - + not interested(peer) and unchoked(local) - + peer from PEX - + peer from DHT - + encrypted traffic - + encrypted handshake - + peer from LSD @@ -5957,180 +5227,165 @@ PeerListWidget - + IP اي بي - + Port المنفذ - + Flags أعلام - + Connection الاتصال - + Client i.e.: Client application العميل - + Progress i.e: % downloaded التقدم - + Down Speed i.e: Download speed سرعة التنزيل - + Up Speed i.e: Upload speed سرعة الرفع - + Downloaded i.e: total data downloaded تم تنزيله - + Uploaded i.e: total data uploaded تم رفعه - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. - + Files i.e. files that are being downloaded right now - الملفات + - + Column visibility وضوح الصفوف - + Add a new peer... إضافة قرين جديد... - - + + Ban peer permanently حظر القرين نهائيا - + Manually adding peer '%1'... - + The peer '%1' could not be added to this torrent. - + Manually banning peer '%1'... - - + + Peer addition إضافة القرناء - + Country - الدولة + - + Copy IP:port - + Some peers could not be added. Check the Log for details. - + The peers were added to this torrent. - + Are you sure you want to ban permanently the selected peers? هل أنت متأكد من رغبتك في حظر القرناء المختارين نهائيًا؟ - + &Yes &نعم - + &No &لا - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - + PeersAdditionDlg - + No peer entered - + Please type at least one peer. - + Invalid peer - + The peer '%1' is invalid. @@ -6138,12 +5393,12 @@ PieceAvailabilityBar - + White: Unavailable pieces الأبيض: قطع غير متوفرة - + Blue: Available pieces الأزرق: قطع متوفرة @@ -6151,336 +5406,288 @@ PiecesBar - + Files in this piece: - + File in this piece - + File in these pieces - - Wait until metadata become available to see detailed information - - - - + Hold Shift key for detailed information - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Installed search plugins: - + Name الاسم - + Version - + Url - - + + Enabled - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Check for updates - + Close - + Uninstall - - - + + + Yes نعم - - - - + + + + No لا - + Uninstall warning - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Uninstall success - + All selected plugins were uninstalled successfully - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - - - - - + + New search engine plugin URL - - + + URL: - + Invalid link - + The link doesn't seem to point to a search engine plugin. - + Select search plugins - + qBittorrent search plugin - + + + + Search plugin update + + + + All your plugins are already up to date. - + Sorry, couldn't check for plugin updates. %1 - + + + Search plugin install - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + + + + Couldn't install "%1" search engine plugin. %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + + + + Couldn't update "%1" search engine plugin. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Search plugin source: - + Local file - + Web link - PowerManagement + PreviewSelect - - qBittorrent is active - + + Name + الاسم - - - PreviewSelectDialog - - Preview - - - - - Name - الاسم - - - + Size - الحجم + الحجم - + Progress - + الحالة - - + + Preview impossible - + لايمكن الاستعراض - - + + Sorry, we can't preview this file - - - - - Private::FileLineEdit - - - '%1' does not exist - - - - - '%1' does not point to a directory - - - - - '%1' does not point to a file - - - - - Does not have read permission in '%1' - - - - - Does not have write permission in '%1' - + نأسف لكن لا يمكن استعراض الملف PropListDelegate - + Not downloaded لم ينزل - - + + Normal Normal (priority) عادي - - N/A - غير موجود - - - + Do not download Do not download (priority) لا تنزّل - - + + High High (priority) مرتفع - + Mixed Mixed (priorities مختلط - - + + Maximum Maximum (priority) أقصى أهمية @@ -6489,32 +5696,32 @@ PropTabBar - + General عام - + Trackers المتتبعات - + Peers القرناء - + HTTP Sources مصادر HTTP - + Content المحتوى - + Speed السرعة @@ -6608,22 +5815,22 @@ التعليق: - + Select All اختيار الكل - + Select None اختيار لا شئ - + Normal عادي - + High مرتفع @@ -6683,165 +5890,165 @@ مسار الحفظ: - + Maximum أقصى أهمية + - Do not download لا تنزّل - + Never أبدا - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (لديك %3) - - + + %1 (%2 this session) %1 (%2 هذه الجلسة) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (بذرت لـ %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 كحد أقصى) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (من إجمالي %2) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (بمعدّل %2) - + Open فتح - + Open Containing Folder فتح المجلد الحاوي - + Rename... تغيير التسمية... - + Priority الأولوية - + New Web seed رابط للقرين عبر الويب - + Remove Web seed ازالة رابط القرين عبر الويب - + Copy Web seed URL نسخ رابط القرين عبر الويب - + Edit Web seed URL تعديل رابط القرين عبر الويب - + + Rename the file + تغيير تسمية الملف + + + New name: الاسم الجديد: - - + + + The file could not be renamed + لا يمكن تغيير تسمية الملف + + + + This file name contains forbidden characters, please choose a different one. + هذا الاسم يحتوي أحرف ممنوع استخدامها في التسمية، رجاءً اختر واحدا مختلفا. + + + + This name is already in use in this folder. Please use a different name. هذا الاسم مستخدم بالفعل في هذا المجلد، رجاءً استخدم اسما مختلفا. - + The folder could not be renamed لا يمكن تغيير تسمية المجلد - + qBittorrent كيوبت‎تورنت - + Filter files... تصفية الملفات... - - Renaming - إعادة التسمية - - - - - Rename error - خطأ في إعادة التسمية - - - - The name is empty or contains forbidden characters, please choose a different one. - - - - + New URL seed New HTTP source رابط ذذبذر الجديد - + New URL seed: رابط البذر الجديد: - - + + This URL seed is already in the list. رابط البذر هذا موجود بالفعل في القائمة. - + Web seed editing تعديل القرين عبر الويب - + Web seed URL: رابط القرين عبر الويب: @@ -6849,585 +6056,551 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + تم حظر عنوان الآي بي الخاص بك بعد الكثير محاولات الاستيثاق الفاشلة. + + + + Error: '%1' is not a valid torrent file. + + خطأ: '%1' ليس ملف تورنت صالح. + + + + + Error: Could not add torrent to session. + خطأ: تعذّر إضافة التورنت للجلسة. + + + + I/O Error: Could not create temporary file. + + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. - - + + %1 must be the single command line parameter. - + + %1 must specify the correct port (1 to 65535). + + + + You cannot use %1: qBittorrent is already running for this user. لا يمكنك استخدام %1: كيوبت‎تورنت يعمل حاليا على هذا المستخدم. - + Usage: الاستخدام: - + Options: خيارات: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - + + Displays program version + عرض إصدارة البرنامج - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - + + Displays this help message + عرض قائمة المساعدة هذه - - Expected integer number in environment variable '%1', but got '%2' + + Changes the Web UI port (current: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - + + Disable splash screen + تعطيل شاشة البداية - - Expected %1 in environment variable '%2', but got '%3' + + Run in daemon-mode (background) - - port + + Downloads the torrents passed by the user - - %1 must specify a valid port (1 to 65535). - + + Help + مساعدة - - Display program version and exit + + Run application with -h option to read about command line parameters. - - Display this help message and exit + + Bad command line - - Change the Web UI port + + Bad command line: - - Disable splash screen - تعطيل شاشة البداية + + Legal Notice + إشعار قانوني - - Run in daemon-mode (background) - + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + يعتمد هذا البرنامج على تقنية المشاركة، وعند تشغيل أي تورنت ستكون البيانات متاحة للآخرين ليسقبلوها منك. أي محتوى تشاركه سيكون على مسؤليتك الخاصة. + +لن تظهر المزيد من التنبيهات. - - dir - Use appropriate short form or abbreviation of "directory" - + + Press %1 key to accept and continue... + اضغط مفتاح "%1" للقبول والمتابعة... - - Store configuration files in <dir> - + + Legal notice + إشعار قانوني - - - name - + + Cancel + إلغاء - - Store configuration files in directories qBittorrent_<name> - + + I Agree + أوافق - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - + + Torrent name: %1 + اسم التورنت: %1 - - files or URLs - + + Torrent size: %1 + حجم التورنت: %1 - - Download the torrents passed by the user - + + Save path: %1 + مسار الحفظ: %1 - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + تم تنزيل التورنت في %1. - - Options when adding new torrents: - + + Thank you for using qBittorrent. + شكرا لاستخدامك كيوبت‎تورنت. - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - + + [qBittorrent] '%1' has finished downloading + [كيوبت‎تورنت] انتهى تنزيل "%1" - - path + + The remote host name was not found (invalid hostname) - - Torrent save path - + + The operation was canceled + تم إلغاء العملية - - Add torrents as started or paused + + The remote server closed the connection prematurely, before the entire reply was received and processed + الخادم اغلق الاتصال نهائيا, قبل إنهاء ومعالجة الطلب + + + + The connection to the remote server timed out - - Skip hash check - تخطي التحقق من البيانات + + SSL/TLS handshake failed + - - Assign torrents to category. If the category doesn't exist, it will be created. + + The remote server refused the connection - - Download files in sequential order + + The connection to the proxy server was refused - - Download first and last pieces first + + The proxy server closed the connection prematurely - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: + + The proxy host name was not found - - Command line parameters take precedence over environment variables + + The connection to the proxy timed out or the proxy did not reply in time to the request sent - - Help - مساعدة + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + - - Run application with -h option to read about command line parameters. + + The access to the remote content was denied (401) - - Bad command line + + The operation requested on the remote content is not permitted - - Bad command line: + + The remote content was not found at the server (404) - - Legal Notice - إشعار قانوني + + The remote server requires authentication to serve the content but the credentials provided were not accepted + - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + + The Network Access API cannot honor the request because the protocol is not known - - No further notices will be issued. + + The requested operation is invalid for this protocol - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - يعتمد هذا البرنامج على تقنية المشاركة، وعند تشغيل أي تورنت ستكون البيانات متاحة للآخرين ليسقبلوها منك. أي محتوى تشاركه سيكون على مسؤليتك الخاصة. - -لن تظهر المزيد من التنبيهات. + + An unknown network-related error was detected + - - Press %1 key to accept and continue... - اضغط مفتاح "%1" للقبول والمتابعة... + + An unknown proxy-related error was detected + - - Legal notice - إشعار قانوني + + An unknown error related to the remote content was detected + - - Cancel - إلغاء + + A breakdown in protocol was detected + - - I Agree - أوافق + + Unknown error + خطأ مجهول - - + + Upgrade ترقية - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] لقد قمت بالتحديث من إصدارة قديمة تحتفظ بأشياء مختلفة. ينبغي عليك الترحيل إلى نظام الحفظ الجديد. لن يكون بإمكانك إستخدام إصدارة أقدم من 3.3.0 مجددا. هل ترغب بالمتابعة؟ [نعم/لا] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. لقد قمت بالتحديث من إصدارة قديمة تحتفظ بأشياء مختلفة. ينبغي عليك الترحيل إلى نظام الحفظ الجديد. لن يكون بإمكانك استخدام إصدارة أقدم من 3.3.0 مجددا. هل ترغب بالمتابعة؟ - + Couldn't migrate torrent with hash: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 + + Detected unclean program exit. Using fallback file to restore settings. - + An access error occurred while trying to write the configuration file. - + A format error occurred while trying to write the configuration file. - - - An unknown error occurred while trying to write the configuration file. - - - RSS::AutoDownloader + RSS - - - Invalid data format. - + + Search + البحث - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - + + New subscription + اشتراك جديد - - Invalid data format - + + + + Mark items read + اعتبرها مقروءة - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - + + Update all + تحديث الكل - - Couldn't load RSS AutoDownloader rules. Reason: %1 - + + RSS Downloader... + RSS Downloader... - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - + + Settings... + الخيارات... - - RSS feed at '%1' updated. Added %2 new articles. - + + Torrents: (double-click to download) + التورنتات: (انقر مزدوجا للتنزيل) - - Failed to parse RSS feed at '%1'. Reason: %2 - + + + Delete + حذف - - Couldn't read RSS Session data from %1. Error: %2 - + + Rename... + تغيير التسمية... - - Couldn't parse RSS Session data. Error: %1 - + + Rename + تغيير التسمية - - Couldn't load RSS Session data. Invalid data format. - + + + Update + تحديث - - Couldn't load RSS article '%1#%2'. Invalid data format. - + + New subscription... + اشتراك جديد... - - - RSS::Private::Parser - - Invalid RSS feed. - + + + Update all feeds + تحديث الكل - - %1 (line: %2, column: %3, offset: %4). - + + Download torrent + تنزيل التورنت - - - RSS::Session - - RSS feed with given URL already exists: %1. - + + Open news URL + فتح الرابط - - Cannot move root folder. - + + Copy feed URL + نسخ feed URL - - - Item doesn't exist: %1. - + + New folder... + مجلد جديد... - - Cannot delete root folder. - + + Refresh RSS streams + تحديث RSS streams + + + RSSImp - - Incorrect RSS Item path: %1. - + + Stream URL: + رابط الدفق: - - RSS item with given path already exists: %1. + + Please type a RSS stream URL - - Parent folder doesn't exist: %1. - - - - - RSSWidget - - - Search - البحث - - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - - - - - New subscription - - - - - - - Mark items read - - - - - Refresh RSS streams - - - - - Update all - - - - - RSS Downloader... - - - - - Torrents: (double-click to download) + + This RSS feed is already in the list. - - - Delete - حذف - - - - Rename... - - - - - Rename - تغيير التسمية - - - - - Update - + + Please choose a folder name + اختر اسما للمجلد - - New subscription... - + + Folder name: + اسم المجلد: - - - Update all feeds - + + New folder + مجلد جديد - - Download torrent + + Deletion confirmation - - Open news URL - + + Are you sure you want to delete the selected RSS feeds? + هل أنت متأكد من رغبتك في حذف تغذية RSS المختارة؟ - - Copy feed URL - + + Please choose a new name for this RSS feed + من فضلك اختر اسما جديدا لتغذية RSS هذه - - New folder... - + + New feed name: + اسم التغذية الجديد: - - Please choose a folder name - + + Name already in use + الاسم مستخدم مسبقا - - Folder name: - + + This name is already used by another item, please choose another one. + هذا الاسم مستخدم بالفعل، من فضلك اختر اسما آخر. - - New folder - + + Date: + التاريخ: - - Please type a RSS feed URL - + + Author: + المؤلف: - - Feed URL: - + + Unread + غير مقروء + + + Rss::Feed - - Deletion confirmation + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... - - Are you sure you want to delete the selected RSS feeds? + + Automatically downloading '%1' torrent from '%2' RSS feed... + + + Rss::Private::Parser - - Please choose a new name for this RSS feed + + Invalid RSS feed. + + + RssSettingsDlg - - New feed name: - + + RSS Reader Settings + خيارات قارئ RSS - - Rename failed - + + RSS feeds refresh interval: + المدة بين اعادة تحديث المقالات: - - Date: + + min - - Author: - + + Maximum number of articles per feed: + اكبر كمية من المقالات الممكنة: ScanFoldersDelegate - + Select save location @@ -7435,273 +6608,267 @@ ScanFoldersModel - + Monitored Folder - + Override Save Location - + Monitored folder - + Default save location - + Browse... - استعرض... + تصفح... - SearchJobWidget + SearchEngine - - Form + + Unknown search engine plugin file format. - - Results(xxx) + + A more recent version of this plugin is already installed. - - Search in: + + + Plugin is not supported. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + + Update server is temporarily unavailable. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + + + Failed to download the plugin file. %1 - - Seeds: - البذور: + + An incorrect update info received. + - - <html><head/><body><p>Minimal number of seeds</p></body></html> + + All categories - - - to + + Movies - - <html><head/><body><p>Maximal number of seeds</p></body></html> + + TV shows - - - + + Music - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + + Games - - Size: - الحجم: + + Anime + - - <html><head/><body><p>Minimal torrent size</p></body></html> + + Software - - <html><head/><body><p>Maximal torrent size</p></body></html> + + Pictures + + + + + Books + + + SearchListDelegate + + + + Unknown + مجهول + + + + SearchTab - + Name i.e: file name - الاسم + الاسم - + Size i.e: file size - الحجم + الحجم - + Seeders i.e: Number of full sources - + الباذرون - + Leechers i.e: Number of partial sources - + محمل - + Search engine - - - - - Filter search results... - + محرك البحث - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Torrent names only - + Everywhere - - Use regular expressions - - - - + Searching... - + Search has finished - اكتمل البحث + - + Search aborted - + An error occurred during search... - + Search returned no results - + Column visibility وضوح الصفوف - - - SearchPluginManager - - - Unknown search engine plugin file format. - - - - - A more recent version of this plugin is already installed. - - - - - Plugin is not supported. + + Form - - All categories + + Results(xxx) - - Movies + + Search in: - - TV shows + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - - Music + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - - Games - + + Seeds: + البذور: - - Anime + + <html><head/><body><p>Minimal number of seeds</p></body></html> - - Software + + + to - - Pictures + + <html><head/><body><p>Maximal number of seeds</p></body></html> - - - Books + + + + - - Update server is temporarily unavailable. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - - - Failed to download the plugin file. %1 - + + Size: + الحجم: - - An incorrect update info received. + + <html><head/><body><p>Minimal torrent size</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> @@ -7710,197 +6877,185 @@ - - - - + + + Search - البحث - - - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - + البحث - + Download - التحميل + تنزيل - + Go to description page - + Copy description page URL - + Search plugins... - + A phrase to search for. - + Spaces in a search term may be protected by double quotes. - + Example: Search phrase example - المثال: + - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - + All plugins - جميع الملحقات + - + Only enabled - + Select... - اختر... + - - - + + + Search Engine - + Please install Python to use the Search Engine. - + Empty search pattern - + Please type a search pattern first - + Stop - أوقف + - + Search has finished - اكتمل البحث + - + Search has failed - فشلت عملية البحث + - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + E&xit Now - + Exit confirmation - + إغلاق التأكيد - + The computer is going to shutdown. - + &Shutdown Now - - Shutdown confirmation - - - - + The computer is going to enter suspend mode. - + &Suspend Now - + Suspend confirmation - + The computer is going to enter hibernation mode. - + &Hibernate Now - + Hibernate confirmation - + You can cancel the action within %1 seconds. + + + Shutdown confirmation + تأكيد الإطفاء + SpeedLimitDialog - + KiB/s ك.ب/ث @@ -7908,52 +7063,52 @@ SpeedPlotView - + Total Upload إجمالي الرفع - + Total Download إجمالي التنزيل - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - + DHT Download - + Tracker Upload - + Tracker Download @@ -7961,95 +7116,87 @@ SpeedWidget - + Period: الفترة: - + 1 Minute دقيقة واحدة - + 5 Minutes 5 دقائق - + 30 Minutes 30 دقيقة - + 6 Hours 6 ساعات - + Select Graphs اختر الرسوم البانية - + Total Upload إجمالي الرفع - + Total Download إجمالي التنزيل - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - + DHT Download - + Tracker Upload - + Tracker Download - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8062,49 +7209,49 @@ إحصائيات المستخدم - - Cache statistics - إحصائيات المخبأة + + Total peer connections: + إجمالي اتصالات القرناء: - - Read cache hits: - + + Global ratio: + النسبة العامة: - - Average time in queue: - + + Alltime download: + إجمالي ما تم تنزيله كل الوقت: - - Connected peers: - + + Alltime upload: + إجمالي ما تم رفعه كل الوقت: - - All-time share ratio: - + + Total waste (this session): + إجمالي الضائع (هذه الجلسة): - - All-time download: - + + Cache statistics + إحصائيات المخبأة - - Session waste: + + Read cache hits: - - All-time upload: + + Average time in queue: - Total buffer size: - + Total buffers size: + إجمالي حجم التخزين المؤقت: @@ -8132,7 +7279,12 @@ إجمالي حجم الاصطفاف: - + + OK + حسنا + + + %1 ms 18 milliseconds @@ -8141,27 +7293,32 @@ StatusBar - + Connection status: حالة الاتصال: - + No direct connections. This may indicate network configuration problems. لا اتصالات مباشرة. قد يشير هذا إلى وجود مشاكل في إعداد الشبكة. - + DHT: %1 nodes DHT: %1 nodes - - qBittorrent needs to be restarted! - + + qBittorrent needs to be restarted + يحتاج كيوبت‎تورنت إلى إعادة تشغيل + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + تم تحديث كيوبت‎تورنت للتو ويحتاج إلى إعادة تشغيل لتصبح التغييرات فعالة. @@ -8180,1563 +7337,1309 @@ متصل - + Click to switch to alternative speed limits انقر للتبديل إلى حدود السرعات البديلة - + Click to switch to regular speed limits انقر للتبديل إلى حدود السرعات العادية - + + Manual change of rate limits mode. The scheduler is disabled. + + + + Global Download Speed Limit حد سرعة التنزيل العامة - + Global Upload Speed Limit حد سرعة الرفع العامة - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - الكل (0) + الكل (0) - + Downloading (0) - + ينزل (0) - + Seeding (0) - + يبذر (0) - + Completed (0) - + مُكتمل (0) - + Resumed (0) - + مُستأنف (0) - + Paused (0) - + مُلبث (0) - + Active (0) - + نشط (0) - + Inactive (0) - + غير نشط (0) - + Errored (0) - + All (%1) - الكل (%1) + الكل (%1) - + Downloading (%1) - + ينزل (%1) - + Seeding (%1) - + يبذر (%1) - + Completed (%1) - + مكتمل (%1) - + Paused (%1) - + مُلبث (%1) - + Resumed (%1) - + مُستأنف (%1) - + Active (%1) - + نشط (%1) - + Inactive (%1) - + غير نشط (%1) - + Errored (%1) - TagFilterModel + TorrentContentModel - - Tags - + + Name + الاسم - - All - الكل + + Size + الحجم - - Untagged - + + Progress + التقدّم - - - TagFilterWidget - - Add tag... + + Download Priority - - Remove tag - + + Remaining + المتبقي + + + TorrentCreatorDlg - - Remove unused tags - + + Select a folder to add to the torrent + اختر مجلد لإضافة التورنت - - Resume torrents - استئناف التورنتات + + Select a file to add to the torrent + إختر ملف لإضافة التورنت - - Pause torrents - إلباث التورنتات + + No input path set + مكان الحفظ غير مدخل - - Delete torrents - حذف التورنتات + + Please type an input path first + الرجاء ادخال مكان الحفظ اولا - - New Tag - + + Select destination torrent file + إختر ملف التورنت المستهدف - - Tag: - + + Torrent Files (*.torrent) + ملفات التورنت (torrent.*) - - Invalid tag name - + + Torrent was created successfully: %1 + %1 is the path of the torrent + تم انشاء التورنت بنجاح: %1 - - Tag name '%1' is invalid - + + + + Torrent creation + انشاء تورنت - - Tag exists - + + Torrent creation was unsuccessful, reason: %1 + فشل انشاء التورنت, السبب:%1 - - Tag name already exists. - + + Created torrent file is invalid. It won't be added to download list. + خطأ في إنشاء ملف التورنت, لن يضاف الى قائمة التنزيل. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - + + Name + i.e: torrent name + الاسم - - Name: - + + Size + i.e: torrent size + الحجم - - Save path: - مسار الحفظ: + + Done + % Done + اكتمل - - Choose save path - اختر مسار الحفظ + + Status + Torrent status (e.g. downloading, seeding, paused) + الحالة - - New Category - + + Seeds + i.e. full sources (often untranslated) + البذور - - Invalid category name - + + Peers + i.e. partial sources (often untranslated) + القرناء - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - + + Down Speed + i.e: Download speed + سرعة التنزيل - - Category creation error - + + Up Speed + i.e: Upload speed + سرعة الرفع - - Category with the given name already exists. -Please choose a different name and try again. - + + Ratio + Share ratio + النسبة - - - TorrentContentModel - - Name - الاسم + + ETA + i.e: Estimated Time of Arrival / Time left + الوقت المتبقي - - Size - الحجم + + Category + - - Progress - التقدّم + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + تاريخ الإضافة - - Download Priority - + + Completed On + Torrent was completed on 01/01/2010 08:00 + تاريخ الاكتمال - - Remaining - + + Tracker + المتتبع - - Availability - + + Down Limit + i.e: Download limit + حد التنزيل - - - TorrentCreatorDialog - - Torrent Creator - + + Up Limit + i.e: Upload limit + حد الرفع - - Select file/folder to share - + + Downloaded + Amount of data downloaded (e.g. in MB) + تم تنزيله - - Path: - + + Uploaded + Amount of data uploaded (e.g. in MB) + تم رفعه - - [Drag and drop area] - + + Session Download + Amount of data downloaded since program open (e.g. in MB) + تنزيل الجلسة - - - Select file - + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + رفع الجلسة - - - Select folder - + + Remaining + Amount of data left to download (e.g. in MB) + المتبقي - - Settings - + + Time Active + Time (duration) the torrent is active (not paused) + فترة النشاط - - Piece size: - + + Save path + Torrent save path + مسار الحفظ - - Auto - + + Completed + Amount of data completed (e.g. in MB) + المكتمل - - 16 KiB - + + Ratio Limit + Upload share ratio limit + نسبة المشاركة - - 32 KiB + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole - - 64 KiB - + + Last Activity + Time passed since a chunk was downloaded/uploaded + آخر نشاط - - 128 KiB - + + Total Size + i.e. Size including unwanted data + إجمالي الحجم + + + TrackerFiltersList - - 256 KiB - + + All (0) + this is for the tracker filter + الكل (0) - - 512 KiB - + + Trackerless (0) + بدون متتبعات (0) - - 1 MiB - + + Error (0) + خطأ (0) - - 2 MiB - + + Warning (0) + تحذير (0) - - 4 MiB - + + + Trackerless (%1) + بدون متتبعات (%1) - - 8 MiB - + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - 16 MiB - + + + Error (%1) + خطأ (%1) - - 32 MiB - + + + Warning (%1) + تحذير (%1) - - Calculate number of pieces: - + + Resume torrents + استئناف التورنتات - - Private torrent (Won't distribute on DHT network) - + + Pause torrents + إلباث التورنتات - - Start seeding immediately - + + Delete torrents + حذف التورنتات - - Ignore share ratio limits for this torrent - + + + All (%1) + this is for the tracker filter + الكل (%1) + + + TrackerList - - Optimize alignment - + + URL + الرابط - - Fields - + + Status + الحالة - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + + Received - - Web seed URLs: - + + Seeds + البذور - - Tracker URLs: - + + Peers + القرناء - - Comments: - + + Downloaded + تم تنزيله - - Source: - + + Message + الرسالة - - Progress: - التقدم: - - - - Create Torrent - - - - - - - Torrent creation failed - - - - - Reason: Path to file/folder is not readable. - - - - - Select where to save the new torrent - - - - - Torrent Files (*.torrent) - - - - - Reason: %1 - - - - - Reason: Created torrent is invalid. It won't be added to download list. - - - - - Torrent creator - - - - - Torrent created: - - - - - TorrentInfo - - - File size exceeds max limit %1 - - - - - Torrent file read error: %1 - - - - - Torrent file read error: size mismatch - - - - - TorrentsController - - - Not contacted yet - - - - - Updating... - - - - - Working - - - - - Not working - - - - - Error: '%1' is not a valid torrent file. - - - - - - - - Torrent queueing must be enabled - - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - - Cannot make save path - - - - - Cannot write to directory - - - - - WebUI Set location: moving "%1", from "%2" to "%3" - - - - - Incorrect torrent name - - - - - - Incorrect category name - - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - الكل (0) - - - - Trackerless (0) - بدون متتبعات (0) - - - - Error (0) - خطأ (0) - - - - Warning (0) - تحذير (0) - - - - - Trackerless (%1) - بدون متتبعات (%1) - - - - - Error (%1) - خطأ (%1) - - - - - Warning (%1) - تحذير (%1) - - - - Resume torrents - استئناف التورنتات - - - - Pause torrents - إلباث التورنتات - - - - Delete torrents - حذف التورنتات - - - - - All (%1) - this is for the tracker filter - الكل (%1) - - - - TrackerListWidget - - - + + Working - + يعمل - + Disabled - + معطّل - + This torrent is private - + هذا التورنت خاص - + Updating... - + يحدّث... - + Not working - + لا يعمل - + Not contacted yet - + لم يتصل بعد - - - - - - - N/A - غير موجود + + Tracker URL: + رابط المتتبع: - + Tracker editing - - - - - Tracker URL: - + تعديل المتتبع - - + + Tracker editing failed - + خطأ في تعديل المتتبع - + The tracker URL entered is invalid. - + رابط المتتبع خاطئ. - + The tracker URL already exists. - + رابط المتتبع موجود مسبقا. - + Add a new tracker... - + إضافة متتبع جديد... - - Remove tracker - - - - + Copy tracker URL - + Edit selected tracker URL - + تعديل رابط المتتبع - + Force reannounce to selected trackers - + إعادة إعلان إجبارية للمتتبعات المُختارة - + Force reannounce to all trackers - - - - - URL - - - - - Status - الحالة - - - - Received - - - - - Seeds - - - - - Peers - القرناء - - - - Downloaded - تم تنزيله + إعادة إعلان إجبارية لجميع المتتبعات - - Message - - - - - Column visibility - وضوح الصفوف + + Remove tracker + إزالة المتتبع - TrackerLoginDialog - - - - Tracker authentication - - - - - Tracker: - - - - - Login - ولوج - + TrackersAdditionDlg - - Username: - اسم المستخدم: - - - - Password: - كلمة المرور: + + Trackers addition dialog + نافذة إضافة المتتبعات - - Log in - + + List of trackers to add (one per line): + قائمة المتتبعات التي ستضاف (واحد في السطر): - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + لائحة الروابط المتوافقة مع µTorrent: - - List of trackers to add (one per line): - + + I/O Error + خطأ إخراج/إدخال - - µTorrent compatible list URL: - + + Error while trying to open the downloaded file. + خطأ أثناء تجربة فتح الملف الذي تم تنزيله. - + No change - + لا تغير - + No additional trackers were found. - + لم يُعثر على متتبعات إضافية. - + Download error - خطأ في التنزيل + خطأ تنزيل - + The trackers list could not be downloaded, reason: %1 - + لا يمكن تنزيل قائمة المتتبعات، والسبب: %1 TransferListDelegate - + Downloading ينزل - + Downloading metadata used when loading a magnet link ينزّل البيانات الوصفية - + Allocating qBittorrent is allocating the files on disk التخصيص - + Paused ملبث - + Queued i.e. torrent is queued ينتظر - + Seeding Torrent is complete and in upload-only mode يبذُر - + Stalled Torrent is waiting for download to begin عالق - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] ينزل - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] يبذر - + Checking Torrent local data is being checked يفحص - + Queued for checking i.e. torrent is queued for hash checking - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - + Completed مكتمل - - Moving - Torrent local data are being moved/relocated - - - - - Missing Files - ملفات مفقودة - - - - Errored - torrent status, the torrent has an error - - - - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - %1 (بذرت لـ %2) - - - - %1 ago - e.g.: 1h 20m ago - قبل %1 - - - - TransferListFiltersWidget - - - Status - الحالة - - - - Categories - الفئات - - - - Tags - - - - - Trackers - المتتبعات - - - - TransferListModel - - - Name - i.e: torrent name - الاسم - - - - Size - i.e: torrent size - الحجم - - - - Done - % Done - - - - - Status - Torrent status (e.g. downloading, seeding, paused) - الحالة - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - القرناء - - - - Down Speed - i.e: Download speed - سرعة التنزيل - - - - Up Speed - i.e: Upload speed - سرعة الرفع - - - - Ratio - Share ratio - - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - الفئة - - - - Tags - - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - تم تنزيله - - - - Uploaded - Amount of data uploaded (e.g. in MB) - تم رفعه - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - - - - - Time Active - Time (duration) the torrent is active (not paused) - - - - - Save path - Torrent save path + + Missing Files + ملفات مفقودة + + + + Errored + torrent status, the torrent has an error - - Completed - Amount of data completed (e.g. in MB) - مكتمل + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) + %1 (بذرت لـ %2) - - Ratio Limit - Upload share ratio limit - + + %1 ago + e.g.: 1h 20m ago + قبل %1 + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + الحالة - - Last Activity - Time passed since a chunk was downloaded/uploaded + + Categories - - Total Size - i.e. Size including unwanted data - + + Trackers + المتتبعات TransferListWidget - + Column visibility وضوح الصفوف - + Choose save path اختر مسار الحفظ - + Torrent Download Speed Limiting حد سرعة التنزيل للتورنت - + Torrent Upload Speed Limiting حد الرفع للتورنت - + Recheck confirmation اعادة التأكد - + Are you sure you want to recheck the selected torrent(s)? هل أنت متأكد من رغبتك في اعادة التأكد من الملفات المختارة؟ - + Rename تغيير التسمية - + New name: الاسم الجديد: - + Resume Resume/start the torrent استئناف - + Force Resume Force Resume/start the torrent استئناف إجباري - + Pause Pause the torrent إلباث - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - - - - - Add Tags - - - - - Remove All Tags - - - - - Remove all tags from selected torrents? + + New Category - - Comma-separated tags: + + Category: - - Invalid tag + + Invalid category name - - Tag name: '%1' is invalid + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. - + Delete Delete the torrent حذف - + Preview file... استعراض الملف... - + Limit share ratio... حد نسبة المشاركة... - + Limit upload rate... حد الرفع... - + Limit download rate... حد التنزيل... - + Open destination folder فتح المجلد الحاوي - + Move up i.e. move up in the queue رفع الاهمية - + Move down i.e. Move down in the queue خفض الأهمية - + Move to top i.e. Move to top of the queue الرفع للاعلى - + Move to bottom i.e. Move to bottom of the queue الخفض لاسفل - + Set location... تغيير المكان... - - Force reannounce - - - - + Copy name نسخ الاسم - - Copy hash - - - - + Download first and last pieces first - + Automatic Torrent Management - إدارة ذاتية للتورنت + - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - الوضع التلقائي يعني أن العديد من خصائص التورنت (مسار الحفظ مثلاً) سيتم تحديده عن طريق الفئة المحددة له. + - + Category - الفئة + - + New... New category... - جديد... + - + Reset Reset category - - Tags - - - - - Add... - Add / assign multiple tags... - - - - - Remove All - Remove all tags - - - - + Priority الأولوية - + Force recheck اعادة الفحص - + Copy magnet link نسخ الرابط الممغنط - + Super seeding mode نمط البذر الخارق - + Rename... تغيير التسمية... - + Download in sequential order تنزيل بترتيب تسلسلي - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + حد نسبة التنزيل والرفع للتورنت - - Use global share limit - + + Use global ratio limit + استخدام نسبة المشاركة العامة - - - + + + buttonGroup + buttonGroup + + + + Set no ratio limit + عدم استخدام نسبة المشاركة + + + + Set ratio limit to + نسبة المشاركة + + + + WebApplication + + + Incorrect category name + + + WebUI + + + The Web UI is listening on port %1 + واجهة مستخدم الويب تستمع على المنفذ %1 + - - Set no share limit + + Web UI Error - Unable to bind Web UI to port %1 + + + about - - Set share limit to + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - ratio + + Copyright %1 2006-2016 The qBittorrent project - - minutes + + Home Page: - - No share limit method selected + + Forum: - - Please select a limit method first + + Bug Tracker: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 + + Add Peers + إضافة قرناء + + + + List of peers to add (one per line): - - Python not detected + + Format: IPv4:port / [IPv6]:port - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - + + + Tracker authentication + توثيق المتتبع - - Symlinks inside alternative UI folder are forbidden. - + + Tracker: + المتتبع: - - Exceeded the maximum allowed file size (%1)! - + + Login + الولوج - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - + + Username: + اسم المستخدم: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - + + Password: + كلمة السرّ: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - + + Log in + الولوج - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - + + Cancel + إلغاء - WebUI + confirmDeletionDlg - - Web UI: HTTPS setup successful - + + Deletion confirmation - qBittorrent + تأكيد الحذف - كيوبت‎تورنت - - Web UI: HTTPS setup failed, fallback to HTTP - + + Remember choice + تذكّر الاختيار - - Web UI: Now listening on IP: %1, port: %2 - + + Also delete the files on the hard disk + حذف الملفات من القرص الصلب أيضا + + + confirmShutdownDlg - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 + + Don't show again + createTorrentDialog + + + Cancel + إلغاء + + + + Torrent Creation Tool + أداة إنشاء التورنت + + + + Torrent file creation + إنشاء ملف تورنت + + + + Add file + إضافة ملف + + + + Add folder + إضافة مجلد + + + + File or folder to add to the torrent: + الملف أو المجلد الذي سيضاف للتورنت: + + + + Tracker URLs: + روابط المتتبعات: + + + + Web seeds urls: + روابط وِب البذور: + + + + Comment: + التعليق: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + استخدم سطر فارغ للفصل بين المتتبعين المختلفين. + + + + Piece size: + حجم القطعة: + + + + 16 KiB + 16 ك.بايت + + + + 32 KiB + 32 ك.بايت + + + + 64 KiB + 64 ك.بايت + + + + 128 KiB + 128 ك.بايت + + + + 256 KiB + 256 ك.بايت + + + + 512 KiB + 512 ك.بايت + + + + 1 MiB + 1 م.بايت + + + + 2 MiB + 2 م.بايت + + + + 4 MiB + 4 م.بايت + + + + 8 MiB + 8 م.بايت + + + + 16 MiB + 16 م.بايت + + + + Auto + آلي + + + + Private (won't be distributed on DHT network if enabled) + خاص (لن تتوزع في شبكة DHT إذا تفعل الخيار) + + + + Start seeding after creation + بدء البذر بعد الإنشاء + + + + Ignore share ratio limits for this torrent + تجاهل حدود نسبة المشاركة لهذا التورنت + + + + Create and save... + إنشاء وحفظ... + + + + Progress: + الحالة: + + + + downloadFromURL + + + Add torrent links + إضافة روابط تورنت + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + واحد لكل سطر (يدعم: روابط ، HTTP، والروابط المغناطيسية، ومعلومات التحقق) + + + + Download + تنزيل + + + + Cancel + إلغاء + + + + Download from urls + تنزيل من الروابط + + + + No URL entered + الرابط غير موجود + + + + Please type at least one URL. + يرجى إدخال رابط واحد على الأقل. + + + + errorDialog + + + Crash info + معلومات العطل + + + fsutils - + + + + + Downloads التنزيلات @@ -9744,100 +8647,140 @@ misc - + B bytes ب - + KiB kibibytes (1024 bytes) ك.ب - + MiB mebibytes (1024 kibibytes) م.ب - + GiB gibibytes (1024 mibibytes) ج.ب - + TiB tebibytes (1024 gibibytes) ت.ب - + PiB pebibytes (1024 tebibytes) - + EiB exbibytes (1024 pebibytes) - + + Python not detected + + + + + Python version: %1 + إصدارة بايثون: %1 + + + /s per second - + %1h %2m e.g: 3hours 5minutes %1س %2د - + %1d %2h e.g: 2days 10hours %1ي %2س - + Unknown Unknown (size) غير معروف - + qBittorrent will shutdown the computer now because all downloads are complete. سيتم إطفاء تشغيل الحاسوب الآن لأن جميع التنزيلات اكتملت. - + < 1m < 1 minute < د - + %1m e.g: 10minutes %1د + + + Working + يعمل + + + + Updating... + يحدّث... + + + + Not working + لا يعمل + + + + Not contacted yet + لم يتصل بعد + preview - + Preview selection معاينة الاختيار - + The following files support previewing, please select one of them: الملفات التالية تدعم المعاينة، من فضلك اختر أحدها: + + + Preview + الإستعراض + + + + Cancel + إلغاء + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_be.ts qbittorrent-3.3.15/src/lang/qbittorrent_be.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_be.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_be.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - + Пра qBittorrent - + About - + Пра праграму - + Author - + Аўтар - - Current maintainer + + + Nationality: - - Greece - Грэцыя - - - - - Nationality: - + + + Name: + Імя: - - + + E-mail: - + Электронная пошта: - - - Name: - Назва: + + Greece + Грэцыя - - Original author - + + Current maintainer + Дзейны дагляднік - - France - Францыя + + Original author + Першапачатковы аўтар - + Special Thanks - + Translators - - License - - - - + Libraries - + Бібліятэкі - + qBittorrent was built with the following libraries: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - - - - - Forum: - + + France + Францыя - - Bug Tracker: - + + License + Ліцэнзія @@ -112,625 +87,505 @@ Save at - Захаваць у + + + + + Browse... + Агляд... - + + Set as default save path + Прызначыць стандартным шляхам захавання + + + Never show again Больш ніколі не паказваць - + Torrent settings Настáўленні торэнта - + Set as default category - Задаць як катэгорію па змаўчанні + - + Category: - Катэгорыя: + - + Start torrent Пачаць перадачу - + Torrent information - Torrent інфармацыя + - + Skip hash check Прапусціць праверку хэшу - + Size: Памер: - + Hash: - Хэш: + - + Comment: Каментар: - + Date: - Дата: + Дата: Torrent Management Mode: - Рэжым кіравання торэнтамі: + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - Аўтаматычны рэжым азначае, што розныя уласцівасці торэнта(напр. шлях захавання) будуць вырашацца адпаведнай катэгорыяй + Manual - Ручны + Automatic - Аўта - - - - Remember last used save path - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - Калі адзначана, то торэнт-файл не будзе выдалены, незалежна ад наладаў "Спамповак" у акне параметраў + - + Do not delete .torrent file - Не выдаляць торэнт-файл - - - - Create subfolder - Стварыць укладзеную папку - - - - Download in sequential order - Спампоўваць паслядоўна - - - - Download first and last pieces first - Спампоўваць з першай і апошняй часткі + - + Normal Звычайны - + High Высокі - + Maximum Максімальны - + Do not download - Не спампоўваць + Не сцягваць - - - + + + I/O Error Памылка ўводу/вываду - + Invalid torrent Памылковы торэнт - - Renaming - Пераназыванне - - - - - Rename error - Памылка пераназывання - - - - The name is empty or contains forbidden characters, please choose a different one. - Пустое імя або яно змяшчае забароненыя сімвалы, калі ласка, выберыце іншае. + + + + + Already in download list + Ужо ў спісе сцягванняў - + Not Available This comment is unavailable Не даступны - + Not Available This date is unavailable Не даступна - + Not available Не даступна - + Invalid magnet link Памылковая Magnet-спасылка - + The torrent file '%1' does not exist. - Торэнт-файл '%1' не існуе. + - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. - Немагчыма прачытаць торэнт-файл '%1' з дыску. Магчыма, вам не хапае правоў для гэтага. + - + Failed to load the torrent: %1. Error: %2 Don't remove the ' ' characters. They insert a newline. - Не атрымалась загрузіць торэнт:%1 -Памылка: %2 + + + + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + + + + + Torrent is already in download list. Trackers were merged. + Торэнт ужо ў спісе сцягванняў. Трэкеры былі аб'яднаны. - + + + Cannot add torrent + Нельга дадаць торэнт + + + + Cannot add this torrent. Perhaps it is already in adding state. + Нельга дадаць гэты торэнт. Мабыць, ён ужо ў стане дадавання. + + + This magnet link was not recognized Magnet-спасылка не пазнана - + + Magnet link is already in download list. Trackers were merged. + Magnet-спасылка ўжо ў спісе сцягванняў. Трэкеры былі аб'яднаны. + + + + Cannot add this torrent. Perhaps it is already in adding. + Нельга дадаць гэты торэнт. Мабыць, ён ужо дадаецца. + + + Magnet link Magnet-спасылка - + Retrieving metadata... Атрыманне метазвестак... - + Not Available This size is unavailable. Не даступны - + Free space on disk: %1 - Вольнае месца на дыску: %1 + - + + Choose save path Пазначце шлях захавання - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - + + Rename the file + Пераназваць файл - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + + New name: + Новая назва: - - Magnet link is already queued for processing. - + + + The file could not be renamed + Немагчыма пераназваць файл - - New name: - Новая назва: + + This file name contains forbidden characters, please choose a different one. + Назва файла змяшчае недазволеныя сімвалы. Калі ласка, дайце іншую назву. - - + + This name is already in use in this folder. Please use a different name. Гэтая назва ўжо выкарыстоўваецца ў каталогу. Калі ласка, дайце іншую назву. - + The folder could not be renamed Немагчыма пераназваць каталог - + Rename... Пераназваць... - + Priority Прыярытэт - + Invalid metadata Хібныя метазвесткі - + Parsing metadata... Ідзе разбор метазвестак... - + Metadata retrieval complete Атрыманне метазвестак скончана - + Download Error - Памылка спампоўкі + Памылка сцягвання AdvancedSettings - + + Disk write cache size + Памер кэшу на дыску + + + MiB МіБ - + Outgoing ports (Min) [0: Disabled] Выходныя порты (Мін.) [0: Адключана] - + Outgoing ports (Max) [0: Disabled] Выходныя порты (Макс.) [0: Адключана] - + Recheck torrents on completion - Пераправерыць торэнт напрыканцы спампоўвання + Пераправерыць торэнт напрыканцы сцягвання - + Transfer list refresh interval Інтэрвал абнаўлення спісу перадач - + ms milliseconds мс - + Setting Параметр - + Value Value set for this setting Значэнне - - - (disabled) - (адключана) - - - + (auto) (аўта) - - min - minutes - хв - - - + All addresses - Усе адрасы + - + qBittorrent Section - Раздзел qBittorrent + - - + + Open documentation - Адкрыць дакументацыю + - + libtorrent Section - Раздзел libtorrent - - - - Asynchronous I/O threads - - Disk cache - Кэш дыска - - - + s seconds - с + с - + Disk cache expiry interval Інтэрвал ачысткі дыскавага кэшу - + Enable OS cache Уключыць кэш OS - - Guided read cache - Кіраваны кэш чытання - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - Адпраўляць прапановы частак раздачы - - - - - KiB - КіБ - - - - Send buffer watermark - Адправіць вадзяны знак буфера - - - - Send buffer low watermark - Адправіць нізкі вадзяны знак буфера - - - - Send buffer watermark factor - Адправіць фактар вадзянога знака буфера - - - - Prefer TCP - - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address - Дазволіць некалькі злучэнняў з аднаго IP-адраса + + m + minutes + хв - + Resolve peer countries (GeoIP) Вызначыць краіну піра (GeoIP) - + Resolve peer host names Вызначыць назву хоста піра - + Strict super seeding Толькі супер-раздача - + Network Interface (requires restart) Сеткавы інтэрфейс (патрэбны перазапуск) - + Optional IP Address to bind to (requires restart) - IP-адрас для прывязкі (патрабуецца перазапуск) + - + Listen on IPv6 address (requires restart) Слухаць IPv6-адрасы (патрэбны перазапуск) - + Display notifications - Паказваць апавяшчэнні - - - - Display notifications for added torrents - Паказваць апавяшчэнні для даданых торэнтаў - - - - Download tracker's favicon - Загружаць значкі трэкераў - - - - Save path history length - Даўжыня гісторыі шляха захавання - - - - Fixed slots - - - - - Upload rate based - - Upload slots behavior - Паводзіны слотаў раздачы - - - - Round-robin - - - - - Fastest upload + + Display notifications for added torrents - - Anti-leech + + Download tracker's favicon - - Upload choking algorithm - Алгарытм прыглушэння раздачы - - - + Confirm torrent recheck Пацвярджаць пераправерку торэнта - - Confirm removal of all tags - Пацвярджаць выдаленне ўсіх тэгаў - - - - Always announce to all trackers in a tier - + Exchange trackers with other peers + Абменьвацца трэкерамі з іншымі пірамі - - Always announce to all tiers - + + Always announce to all trackers + Заўсёды абвяшчаць ўсе трэкеры - + Any interface i.e. Any network interface Любы інтэрфейс - + Save resume data interval How often the fastresume file is saved. Інтэрвал захавання файлаў хуткага аднаўлення (fastresume) - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - Алгарытм змешанага %1-TCP рэжыму - - - + Maximum number of half-open connections [0: Unlimited] Макс. колькасць паўадкрытых злучэнняў [0: неабмежавана] - + IP Address to report to trackers (requires restart) Паведамляць трэкерам гэты IP адрас (патрэбны перазапуск) - + Enable embedded tracker Задзейнічаць убудаваны трэкер - + Embedded tracker port Порт убудаванага трэкеру - + Check for software updates Праверыць абнаўленні - + Use system icon theme Выкарыстоўваць сістэмныя значкі @@ -738,959 +593,760 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 запушчаны - + Torrent: %1, running external program, command: %2 - Торэнт: %1, запуск вонкавай праграмы, каманда: %2 - - - - Torrent name: %1 - Імя торэнта: %1 - - - - Torrent size: %1 - Памер торэнта: %1 - - - - Save path: %1 - Шлях захавання: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Торэнт быў спампаваны за %1. - - - - Thank you for using qBittorrent. - Дзякуй за выкарыстанне qBittorrent. + - - [qBittorrent] '%1' has finished downloading - [qBittorrent] спампоўка «%1» завершана + + Torrent: %1, run external program command too long (length > %2), execution failed. + - + Torrent: %1, sending mail notification - Торэнт: %1, адпраўка апавяшчэння на пошту + - + Information Інфармацыя - - To control qBittorrent, access the Web UI at %1 - + + To control qBittorrent, access the Web UI at http://localhost:%1 + Для кіравання qBittorrent даступны web-інтэрфейс па адрасе: http://localhost:%1 - + The Web UI administrator user name is: %1 Імя адміністратара web-інтэрфейсу: %1 - + The Web UI administrator password is still the default one: %1 Пароль на адміністратара web-інтэрфейсу дагэтуль стандартны: %1 - + This is a security risk, please consider changing your password from program preferences. Гэта небяспечна. Калі ласка, змяніце ваш пароль у настáўленнях праграмы. - + Saving torrent progress... Захаванне стану торэнта... - - - Portable mode and explicit profile directory options are mutually exclusive - Партатыўны рэжым і асобны шлях профілю ўзаемавыключальны - - - - Portable mode implies relative fastresume - Партатыўны рэжым мае на ўвазе адноснае хуткае аднаўленне - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Захаваць у: RSS Downloader - Спампоўшчык RSS + Сцягвальнік RSS - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - Аўтазагрузка RSS торэнтаў зараз адключана! Вы можаце ўключыць гэта ў наладах праграмы. + + Enable Automated RSS Downloader + Уключыць аўтаматычны сцягвальнік RSS - + Download Rules - Правілы спампоўвання + Правілы сцягвання - + Rule Definition Апісанне правіла - + Use Regular Expressions Выкарыстоўваць рэгулярныя выразы - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - - - - + Must Contain: Мусіць змяшчаць: - + Must Not Contain: Мусіць не змяшчаць: - + Episode Filter: Фільтр эпізодаў: - + Assign Category: - Прызначыць катэгорыю: + - + Save to a Different Directory Захаваць у іншы каталог - + Ignore Subsequent Matches for (0 to Disable) ... X days Ігнараваць наступныя супадзенні цягам (0 - адключана) - + Disabled - Адключаны + Адключаны - + days дзён - + Add Paused: Ці дадаваць спыненым: - + Use global settings Паводле агульных настáўленняў - + Always Заўсёды - + Never Ніколі - + Apply Rule to Feeds: Ужыць правіла да стужак: - + Matching RSS Articles Распазнаныя RSS-загалоўкі - + &Import... &Імпарт... - + &Export... &Экспарт... - + Matches articles based on episode filter. Распазнае артыкулы паводле фільтру эпізодаў. - + Example: Прыклад: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match распазнае 2, 5, з 8 па 15, 30 і далейшыя эпізоды першага сезону - + Episode filter rules: Правілы фільтру эпізодаў: - + Season number is a mandatory non-zero value Нумар сезону ёсць абавязковым ненулявым значэннем - + Episode number is a mandatory non-zero value + Нумар эпізоду ёсць абавязковым ненулявым значэннем + + + Filter must end with semicolon Фільтр мусіць канчацца кропкай з коскай - + Three range types for episodes are supported: Падтрымліваюцца тры тыпы дыяпазонаў эпізодаў: - + Single number: <b>1x25;</b> matches episode 25 of season one Адзіночны нумар: <b>1x25;</b> распазнае 25-ы эпізод першага сезону - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Звычайны дыяпазон: <b>1x25-40;</b> распазнае эпізоды з 25-га па 40-ы першага сезону - - Episode number is a mandatory positive value - Нумар эпізоду з'яўляецца абавязковым ненулявым значэннем - - - - Rules - Правілы + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Бясконцы дыяпазон: <b>1x25-;</b> распазнае эпізоды з 25-га і далей першага сезону - - Rules (legacy) - Правілы (састарэлыя) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - + Last Match: %1 days ago Апошні вынік: %1 дзён таму - + Last Match: Unknown Апошні вынік: невядома - + New rule name Новая назва правіла - + Please type the name of the new download rule. - Калі ласка, дайце назву новаму правілу спампоўкі. + Калі ласка, дайце назву новаму правілу сцягвання. - - + + Rule name conflict Супярэчнасць назваў правілаў - - + + A rule with this name already exists, please choose another name. Правіла з такой назвай ужо існуе, калі ласка, дайце іншую назву. - + Are you sure you want to remove the download rule named '%1'? - Сапраўды жадаеце выдаліць правіла спампоўкі '%1'? + Сапраўды жадаеце выдаліць правіла сцягвання '%1'? - + Are you sure you want to remove the selected download rules? - Сапраўды жадаеце выдаліць вылучаныя правілы спампоўкі? + Сапраўды жадаеце выдаліць вылучаныя правілы сцягвання? - + Rule deletion confirmation Пацверджанне выдалення правіла - + Destination directory Каталог прызначэння - + Invalid action - + Недапушчальнае дзеянне - + The list is empty, there is nothing to export. - + Спіс пусты, няма што экспартаваць. - - Export RSS rules - + + Where would you like to save the list? + Куды вы жадаеце захаваць спіс? - - - I/O Error + + Rules list (*.rssrules) + Спіс правілаў (*.rssrules) + + + + I/O Error Памылка ўводу/вываду - - Failed to create the destination file. Reason: %1 - + + Failed to create the destination file + Не выйшла стварыць файл прызначэння - - Import RSS rules - + + Please point to the RSS download rules file + Пазначце файл з правіламі сцягвання RSS - - Failed to open the file. Reason: %1 - + + Rules list + Спіс правілаў - + Import Error Памылка імпарту - - Failed to import the selected rules file. Reason: %1 - + + Failed to import the selected rules file + Пазначаны файл правілаў чамусьці не імпартуецца - + Add new rule... Дадаць новае правіла... - + Delete rule Выдаліць правіла - + Rename rule... Пераназваць правіла... - + Delete selected rules Выдаліць вылучаныя правілы - - Clear downloaded episodes... - - - - + Rule renaming Пераназыванне правіла - + Please type the new rule name Дайце назву новаму правілу - - Clear downloaded episodes - - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - - - - - - Position %1: %2 - + + Regex mode: use Perl-like regular expressions + Рэжым Regex: выкарыстоўваць рэгулярныя выразы як у Perl - + Wildcard mode: you can use - + ? to match any single character - + * to match zero or more of any characters - + Whitespaces count as AND operators (all words, any order) - + | is used as OR operator - + If word order is important use * instead of whitespace. - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - + will match all articles. - + will exclude all articles. - - - BanListOptionsDialog - - - List of banned IP addresses - - - - Ban IP - - - - - Delete - Выдаліць - - - - - Warning - - - - - The entered IP address is invalid. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Рэжым шаблонаў: вы можаце выкарыстоўваць<ul><li>? каб акрэсліць любы адзін сімвал</li><li>* каб акрэсліць некалькі (ці ніводнага) любых сімвалаў</li><li>Прагальныя знакі лічацца аператарамі І</li></ul> - - The entered IP is already banned. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Рэжым шаблонаў: вы можаце выкарыстоўваць<ul><li>? каб акрэсліць любы адзін сімвал</li><li>* каб акрэсліць некалькі (ці ніводнага) любых сімвалаў</li><li>| каб ужыць аператар ЦІ</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support Змяненне стану PeX патрабуе перазапуску - - Could not get GUID of configured network interface. Binding to IP %1 - Не ўдалося атрымаць GUID сканфігураванага сеткавага інтэрфесу. Прывязка да IP %1 - - - + Embedded Tracker [ON] Убудаваны трэкер [Укл] - + Failed to start the embedded tracker! Не выйшла запусціць убудаваны трэкер! - + Embedded Tracker [OFF] Убудаваны трэкер [Адкл] - + + '%1' reached the maximum ratio you set. Removing... + Стасунак '%1' дасягнуў зададзенага максімума. Выдаленне... + + + + '%1' reached the maximum ratio you set. Pausing... + Стасунак '%1' дасягнуў зададзенага максімума. Спыненне... + + + System network status changed to %1 e.g: System network status changed to ONLINE Стан сеткі сістэмы змяніўся на %1 - + ONLINE У СЕТЦЫ - + OFFLINE ПА-ЗА СЕТКАЙ - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding Настáўленні сеткі %1 змяніліся, абнаўленне прывязкі сеансу - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. - Сканфігураваны сеткавы інтэрфейс %1 памылковы. + - - + Encryption support [%1] - Падтрымка шыфравання [%1] + - - + FORCED - ПРЫМУСОВА - - - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 — недапушчальны IP адрас, ён адхілены ў працэсе дадання да спісу забароненых адрасоў. + - - + Anonymous mode [%1] - Ананімны рэжым [%1] + - + Unable to decode '%1' torrent file. Не выйшла дэкадаваць торэнт-файл '%1'. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' - У торэнт '%2' убудавана рэкурсіўная спампоўка файла '%1' + У торэнт '%2' убудавана рэкурсіўнае сцягванне файла '%1' - + Queue positions were corrected in %1 resume files - Пазіцыі ў чарзе былі адкарэктаваны ў %1 файлах аднаўлення + - + Couldn't save '%1.torrent' Не выйшла захаваць '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - «%1» быў выдалены са спісу торэнтаў. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - «%1» быў выдалены са спісу торэнтаў і дыску. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - «%1» быў выдалены са спісу торэнтаў, але файлы не выдалены. Памылка : %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. бо %1 адключаны. - + because %1 is disabled. this peer was blocked because TCP is disabled. бо %1 адключаны. - + URL seed lookup failed for URL: '%1', message: %2 Не знайшлося сіда па адрасе: '%1', паведамленне: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. - qBittorrent не здолеў праслухаць порт %2/%3 на інтэрфесе %1. Прычына: %4. + + + + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' выдалены са спісу перадач і цвёрдага дыску. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' выдалены са спісу перадач. - + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... - Спампаванне '%1', чакайце... + Сцягваецца '%1', чакайце... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent спрабуе праслухоўваць любы порт інтэрфейсу: %1 - + The network interface defined is invalid: %1 Вызначаны сеткавы інтэрфэйс недапушчальны: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent спрабуе праслухоўваць інтэрфейс %1, порт: %2 - - Peer ID: - - - - - HTTP User-Agent is '%1' - - - - - + DHT support [%1] - Падтрымка DHT [%1] + - - - - - - - - - + + + + ON - УКЛ + - - - - - - - - - + + + + OFF - ВЫКЛ + - - + Local Peer Discovery support [%1] - Выяўленне лакальных піраў [%1] - - - - PeX support [%1] - - '%1' reached the maximum ratio you set. Removed. - «%1» дасягнуў максімальнага пазначанага стасунку. Выдалены. - - - - '%1' reached the maximum ratio you set. Paused. - «%1» дасягнуў максімальнага пазначанага стасунку. Прыпынены. - - - - '%1' reached the maximum seeding time you set. Removed. - «%1» дасягнуў максімальнага пазначанага часу. Выдалены. - - - - '%1' reached the maximum seeding time you set. Paused. - «%1» дасягнуў максімальнага пазначанага часу. Прыпынены. - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent не знайшоў лакальны %1-адрас для праслухоўвання - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent не здолеў праслухоўваць любы порт інтэрфейсу %1 з прычыны: %2. - + Tracker '%1' was added to torrent '%2' Трэкер '%1' дададзены да торэнта '%2' - + Tracker '%1' was deleted from torrent '%2' Трэкер '%1' выдалены з торэнта '%2' - + URL seed '%1' was added to torrent '%2' Адрас сіда '%1' дададзены да торэнта '%2' - + URL seed '%1' was removed from torrent '%2' Адрас сіда '%1' выдалены з торэнта '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Не выйшла узнавіць торэнт '%1'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number IP-фільтр паспяхова прачытаны: ужыта %1 правілаў. - + Error: Failed to parse the provided IP filter. Памылка: не выйшла прачытаць пададзены IP-фільтр. - - '%1' restored. - 'torrent name' restored. - - - - + Couldn't add torrent. Reason: %1 Не выйшла дадаць торэнт з прычыны: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' узноўлены (хуткае ўзнаўленне) + + + '%1' added to download list. 'torrent name' was added to download list. - '%1' даданы да спісу спамповак. + '%1' дададзены да спісу сцягванняў. - + An I/O error occurred, '%1' paused. %2 Памылка ўводу/вываду. '%1' спынены. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: не выйшла перанакіраваць порты, паведамленне: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: перанакіраванне партоў паспяхова адбылося, паведамленне: %1 - + due to IP filter. this peer was blocked due to ip filter. паводле IP-фільтра. - + due to port filter. this peer was blocked due to port filter. паводле порт-фільтра. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. паводле абмежаванняў змяшанага рэжыму i2p. - + because it has a low port. this peer was blocked because it has a low port. бо ён меў малы нумар парта. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent паспяхова праслухоўваецца на інтэрфэйсе %1, порт: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 Вонкавы IP: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - няўдалае стварэнне новага торэнта - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + Не выйшла перанесці торэнт '%1' з прычыны: %2 - + File sizes mismatch for torrent '%1', pausing it. - + Разыходжанне памераў файлаў торэнта '%1', торэнт спынены. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - + Хуткае аднаўленне змесціва торэнта '%1' не выйшла з прычыны %2, новая праверка... CategoryFilterModel - + Categories - Катэгорыі + - + All - Усе + Усе - + Uncategorized - Без катэгорыі + @@ -1698,42 +1354,75 @@ Add category... - Дадаць катэгорыю... + Add subcategory... - Дадаць падкатэгорыю... + - Edit category... - Рэдагаваць катэгорыю... - - - Remove category - Выдаліць катэгорыю + - + Remove unused categories - Выдаліць нявыкарыстаныя катэгорыі + - + Resume torrents - Узнавіць торэнты + Узнавіць торэнты - + Pause torrents - Спыніць торэнты + Спыніць торэнты - + Delete torrents - Выдаліць торэнты + Выдаліць торэнты + + + + New Category + + + + + Category: + + + + + Invalid category name + + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + @@ -1741,7 +1430,7 @@ Manage Cookies - Кіраванне Cookies + @@ -1749,244 +1438,125 @@ Domain - Дамен + Path - Шлях + Name - Назва + Назва Value - Значэнне + Значэнне Expiration Date - Дата сканчэння тэрміну + - DeletionConfirmationDialog - - - Deletion confirmation - Пацверджанне выдалення - - - - Remember choice - - - - - Also delete the files on the hard disk - - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Сапраўды жадаеце выдаліць "%1" са спісу перадач? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - - - - - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - Сцягнуць - - - - No URL entered - - - - - Please type at least one URL. - + Сапраўды жадаеце выдаліць гэтыя %1 торэнтаў са спісу перадач? DownloadedPiecesBar - + White: Missing pieces Белы: адсутныя кавалкі - + Green: Partial pieces Зялёны: частковыя кавалкі - + Blue: Completed pieces Сіні: сцягнутыя кавалкі - ExecutionLogWidget + ExecutionLog - + General - Агульныя звесткі + Галоўнае - + Blocked IPs - + Заблакаваныя IP - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> заблакаваны %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - + <font color='red'>%1</font> забанены FeedListWidget - + RSS feeds RSS-стужкі - - - Unread (%1) - + + Unread + Не прачытана FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - - - - - &Browse... - Launch file dialog button text (full) - - - - - Choose a file - Caption for file open/save dialog - - - - - Choose a folder - Caption for directory open dialog - - - - - Any file + + An error occured while trying to open the log file. Logging to file is disabled. FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - - - - - - - IP filter line %1 is malformed. - - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - - - - - - IP filter exception thrown for line %1. Exception is: %2 - - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - + + + + I/O Error: Could not open ip filter file in read mode. + Памылка ўводу/вываду: не выйшла адкрыць файл ip-фільтра ў рэжыме чытання. - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. Памылка разбору: Файл фільтра не ёсць валідным файлам PeerGuardian P2B. @@ -1994,396 +1564,472 @@ GeoIPDatabase - - + + Unsupported database file size. Такі памер файла базы даных не падтрымліваецца. - + Metadata error: '%1' entry not found. Памылка метазвестак: запіс '%1' не знойдзены. - + Metadata error: '%1' entry has invalid type. Памылка метазвестак: запіс '%1' мае некарэктны тып. - + Unsupported database version: %1.%2 Версія базы даных не падтрымліваецца: %1.%2 - + Unsupported IP version: %1 Версія IP не падтрымліваецца: %1 - + Unsupported record size: %1 Памер запісу не падтрымліваецца: %1 - + Invalid database type: %1 Недапушчальны тып базы даных: %1 - + Database corrupted: no data section found. База даных пашкоджана: не знойдзена раздзелу даных. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - + + File + Файл - - Bad Http request, closing socket. IP: %s - + + Edit + Змяніць - - - HttpServer - - Exit qBittorrent - Выйсці з qBittorrent + + Help + Даведка - + + Exit qBittorrent + + + + Only one link per line Адна спасылка на радок - + + Download + Сцягнуць + + + Global upload rate limit must be greater than 0 or disabled. Агульнае абмежаванне хуткасці раздачы мусіць быць болей за 0 або адключана. - + Global download rate limit must be greater than 0 or disabled. - Агульнае абмежаванне хуткасці спампоўкі мусіць быць болей за 0 або адключана. + Агульнае абмежаванне хуткасці сцягвання мусіць быць болей за 0 або адключана. - + Alternative upload rate limit must be greater than 0 or disabled. Альтэрнатыўнае абмежаванне хуткасці раздачы мусіць быць болей за 0 або адключана. - + Alternative download rate limit must be greater than 0 or disabled. - Альтэрнатыўнае абмежаванне хуткасці спампоўкі мусіць быць болей за 0 або адключана. + Агульнае абмежаванне хуткасці сцягвання мусіць быць болей за 0 або адключана. - + Maximum active downloads must be greater than -1. - Максімум актыўных спамповак мусіць быць болей за -1. + Максімум актыўных сцягванняў мусіць быць болей за -1. - + Maximum active uploads must be greater than -1. Максімум актыўных раздач мусіць быць болей за -1. - + Maximum active torrents must be greater than -1. Максімум актыўных торэнтаў мусіць быць болей за -1. - + Maximum number of connections limit must be greater than 0 or disabled. Максімальная колькасць злучэнняў мусіць быць болей за 0 або адключана. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Максімальная колькасць злучэнняў на торэнт мусіць быць болей за 0 або адключана. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Максімальная колькасць слотаў раздачы на торэнт мусіць быць болей за 0 або адключана. - + Unable to save program preferences, qBittorrent is probably unreachable. Не выйшла захаваць настáўленні. Магчыма, qBittorrent недасяжны. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent на Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - Недапушчальная назва катэгорыі: -Не выкарыстоўвайце спецыяльныя сімвалы ў назвекатэгорыі. - - - - Unknown - Невядомы - - - - Hard Disk - Цвёрды дыск - - - - Share ratio limit must be between 0 and 9998. - Стасунак раздачы мусіць быць паміж 0 і 9998. - - - - Seeding time limit must be between 0 and 525600 minutes. - Абмежаванне часу раздачы мусіць быць ад 0 да 525600 хвілін. + + Language + Мова - + The port used for incoming connections must be between 1 and 65535. Порт для ўваходных злучэнняў мусіць быць паміж 1 і 65535. - + The port used for the Web UI must be between 1 and 65535. Порт для вэб-інтэрфейсу мусіць быць паміж 1 і 65535. - + Unable to log in, qBittorrent is probably unreachable. Немагчыма ўвайсці. Выглядае, што qBittorrent недасяжны. - + Invalid Username or Password. Нядзейсныя імя карыстальніка ці пароль. - - Username - Імя карыстальніка - - - + Password Пароль - + Login Логін - + + Upload Failed! + Зацягнуць не выйшла! + + + Original authors Першапачатковыя аўтары - + + Upload limit: + Абмежаванне раздачы: + + + + Download limit: + Абмежаванне сцягвання: + + + Apply Ужыць - + Add Дадаць - + + Category: + + + + Upload Torrents Upload torrent files to qBittorent using WebUI - Раздаваць торэнты + - + + All + Усе + + + + Downloading + Сцягваецца + + + + Seeding + Раздаецца + + + + Completed + Скончана + + + + Resumed + Узноўлены + + + + Paused + Спынены + + + + Active + Актыўныя + + + + Inactive + Неактыўныя + + + Save files to location: Захоўваць файлы сюды: - + Cookie: Кукі: - + Type folder here - Пазначце папку тут + - + + Run an external program on torrent completion + + + + + Enable bandwidth management (uTP) + + + + + Apply rate limit to uTP connections + + + + + Alternative Global Rate Limits + + + + More information - Дадатковая інфармацыя + - + Information about certificates - Інфармацыя пра сертыфікаты + - + Save Files to - Захоўваць файлы ў - - - - Set location - Перамясціць + - - Limit upload rate - Абмежаванне хуткасці раздачы + + Watch Folder + - - Limit download rate - Абмежаванне хуткасці спампавання + + Default Folder + - - Rename torrent - Перайменаваць торэнт + + from + from time1 to time2 + - - Unable to create category + + to + from time1 to time2 - + Other... Save Files to: Watch Folder / Default Folder / Other... - Іншае... + - + + Every day + Schedule the use of alternative rate limits on ... + + + + + Week days + Schedule the use of alternative rate limits on ... + + + + + Week ends + Schedule the use of alternative rate limits on ... + + + + Monday Schedule the use of alternative rate limits on ... - Панядзелак + - + Tuesday Schedule the use of alternative rate limits on ... - Аўторак + - + Wednesday Schedule the use of alternative rate limits on ... - Серада + - + Thursday Schedule the use of alternative rate limits on ... - Чацвер + - + Friday Schedule the use of alternative rate limits on ... - Пятніца + - + Saturday Schedule the use of alternative rate limits on ... - Субота + - + Sunday Schedule the use of alternative rate limits on ... - Нядзеля + - + + Downloaded + Is the file downloaded or not? + Сцягнуты + + + Logout Выйсці - + + Download from URLs + + + + Download Torrents from their URLs or Magnet links - Спампоўваць торэнты па іх адрасах або magnet-спасылках + - + Upload local torrent Зацягнуць лакальны торэнт - + Are you sure you want to delete the selected torrents from the transfer list? Выдаліць вылучаныя торэнты са спісу перадач? - + Save Захаваць - + qBittorrent client is not reachable Кліент qBittorrent недасяжны - - qBittorrent has been shutdown. - qBittorrent быў закрыты. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Спіс дазволеных падсетак + + HTTP Server + HTTP-сервер - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Узор: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Падтрымліваюцца наступныя параметры: - - Add subnet - Дадаць падсетку + + Torrent path + Шлях торэнта - - Delete - Выдаліць + + Torrent name + Назва торэнта - - Error - Памылка + + qBittorrent has been shutdown. + qBittorrent быў закрыты. + + + LineEdit - - The entered subnet is invalid. - Уведзеная падсетка недапушчальна. + + Clear the text + Ачысціць тэкст LogListWidget - + Copy Капіяваць - + Clear Ачысціць @@ -2398,7 +2044,7 @@ &Tools - &Сэрвіс + &Начынне @@ -2413,553 +2059,495 @@ On Downloads &Done - Па сканчэнні &спампавання + Па сканчэнні &сцягванняў - + &View &Выгляд - + &Options... &Настáўленні... - + &Resume &Узнавціь - + Torrent &Creator Стварыць &торэнт - + Set Upload Limit... Абмежаваць раздачу... - + Set Download Limit... - Абмежаваць спампаванне... + Абмежаваць сцягванне... - + Set Global Download Limit... - Абмежаваць агульнае спампаванне... + Абмежаваць агульнае сцягванне... - + Set Global Upload Limit... Абмежаваць агульную раздачу... - + Minimum Priority Найнізкі пр-тэт - + Top Priority Найвысокі пр-тэт - + Decrease Priority Зменшыць пр-тэт - + Increase Priority Павялічыць пр-тэт - - + + Alternative Speed Limits Альтэрнатыўныя абмежаванні хуткасці - + &Top Toolbar Верхняя &панэль - + Display Top Toolbar Паказаць верхнюю панэль - - Status &Bar - Панэль &статуса - - - + S&peed in Title Bar Х&уткасць у загалоўку - + Show Transfer Speed in Title Bar Паказваць хуткасць перадачы ў загалоўку акна - + &RSS Reader Чытанне &RSS - + Search &Engine &Пошук - + L&ock qBittorrent З&амкнуць qBittorrent - + Do&nate! Ах&вяраваць! - - Close Window - Закрыць акно - - - + R&esume All У&знавіць усё - + Manage Cookies... - Кіраванне cookies... + - + Manage stored network cookies - + Normal Messages - Звычайныя паведамленні + - + Information Messages - Інфармацыйныя паведамленні + - + Warning Messages - Папярэджанні + - + Critical Messages - + &Log &Лог - + &Exit qBittorrent &Выйсці з qBittorrent - + &Suspend System &Прыпыніць камп'ютар - + &Hibernate System &Усыпіць камп'ютар - + S&hutdown System А&дключыць камп'ютар - + &Disabled &Адключана - + &Statistics &Статыстыка - + Check for Updates Праверыць на абнаўленні - + Check for Program Updates Праверыць, ці ёсць абнаўленні праграмы - + &About &Пра qBittorrent - + &Pause &Спыніць - + &Delete &Выдаліць - + P&ause All С&пыніць усё - + &Add Torrent File... &Дадаць торэнт-файл... - + Open Адкрыць - + E&xit В&ыйсці - + Open URL Адкрыць URL - + &Documentation &Дакументацыя - + Lock Замкнуць - - - + + + Show Паказаць - + Check for program updates Праверыць на існасць абнаўленняў праграмы - + Add Torrent &Link... Дадаць &спасылку на торэнт... - + If you like qBittorrent, please donate! Калі вам падабаецца qBittorrent, калі ласка, зрабіце ахвяраванне! - - + Execution Log Лог выканання - + Clear the password Прыбраць пароль - + Filter torrent list... Фільтраваць спіс торэнтаў... - + &Set Password &Задаць пароль - - Preferences - Налады - - - + &Clear Password &Прыбраць пароль - + Transfers Перадачы - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Асацыяцыя Torrent-файлаў - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent не выстаўлены прадвызначанай праграмай для адкрыцця Torrent-файлаў і Magnet-спасылак. Ці жадаеце асацыяваць qBittorrent з Torrent-файламі і Magnet-спасылкамі? - + Icons Only Толькі значкі - + Text Only Толькі тэкст - + Text Alongside Icons Тэкст поруч са значкамі - + Text Under Icons Тэкст пад значкамі - + Follow System Style Паводле сістэмнага стылю - - - + + + UI lock password Пароль замыкання інтэрфейсу - - - + + + Please type the UI lock password: Увядзіце пароль, каб замкнуць інтэрфейс: - + The password should contain at least 3 characters Пароль павінен змяшчаць прынамсі 3 сімвалы - + Password update Абнавіць пароль - + The UI lock password has been successfully updated Пароль замыкання інтэрфейсу паспяхова абноўлены - + Are you sure you want to clear the password? Сапраўды жадаеце прыбраць пароль? - - Use regular expressions - - - - + Search Пошук - + Transfers (%1) Перадачы (%1) - + Error Памылка - + Failed to add torrent: %1 Не выйшла дадаць торэнт: %1 - + Torrent added - + '%1' was added. e.g: xxx.avi was added. - + Download completion - Сканчэнне спампавання + Сканчэнне сцягванняў - + I/O Error i.e: Input/Output Error Памылка ўводу/вываду - + Recursive download confirmation - Пацверджанне рэкурсіўнага спампавання + Пацверджанне рэкурсіўнага сцягвання - + Yes Так - + No Не - + Never Ніколі - + Global Upload Speed Limit Агульнае абмежаванне хуткасці раздачы - + Global Download Speed Limit - Агульнае абмежаванне хуткасці спампавання - - - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - + Агульнае абмежаванне хуткасці сцягвання - - Are you sure you want to quit qBittorrent? - - - - + &No &Не - + &Yes &Так - + &Always Yes &Заўсёды Так - - %1/s - s is a shorthand for seconds - - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter Стары Python-інтэпрэтатар - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - + qBittorrent Update Available Ёсць абнаўленне для qBittorrent - + + A new version is available. +Do you want to download %1? + Ёсць новая версія. +Жадаеце сцягнуць %1? + + + Already Using the Latest qBittorrent Version Выкарыстоўваецца апошняя версія qBittorrent - + Undetermined Python version Версія Python не вызначана - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. - Спампаванне '%1' скончана. + Сцягванне '%1' скончана. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2968,158 +2556,154 @@ Прычына: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? - Торэнт '%1' змяшчае торэнт-файлы, жадаеце пачаць спампаванне іх змесціва? + Торэнт '%1' змяшчае торэнт-файлы, жадаеце пачаць сцягванне іх змесціва? - + Couldn't download file at URL '%1', reason: %2. Не выйшла сцягнуць файл па адрасе '%1' з прычыны: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - - + + Couldn't determine your Python version (%1). Search engine disabled. + Не выйшла вызначыць версію вашага Python (%1). Пашукавік адключаны. + + + + Missing Python Interpreter Няма інтэрпрэтатара Python - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Для выкарыстання пашукавіка патрабуецца Python, але выглядае, што ён не ўсталяваны. Жадаеце ўсталяваць? - + Python is required to use the search engine but it does not seem to be installed. Для выкарыстання пашукавіка патрабуецца Python, але выглядае, што ён не ўсталяваны. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. Няма абнаўленняў. Вы ўжо карыстаецеся апошняй версіяй. - + &Check for Updates &Праверыць на абнаўленні - + Checking for Updates... Праверка на абнаўленні... - + Already checking for program updates in the background У фоне ўжо ідзе праверка на абнаўленні праграмы - + Python found in '%1' Python знойдзены ў '%1' - + Download error - Памылка спампавання + Памылка сцягвання - + Python setup could not be downloaded, reason: %1. Please install it manually. Усталёўнік Python не можа быць сцягнуты з прычыны: %1. Усталюйце яго ўласнаручна. - - + + Invalid password Памылковы пароль - - - + + RSS (%1) RSS (%1) - + URL download error - Памылка пры спампаванні па URL + Памылка пры сцягванні па URL - + The password is invalid Уведзены пароль памылковы - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Сцягв: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Разд: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [Сц: %1, Разд: %2] qBittorrent %3 - + Hide Схаваць - + Exiting qBittorrent Сканчэнне працы qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Некаторыя торэнты цяпер актыўныя. +Сапраўды жадаеце закрыць qBittorrent? + + + Open Torrent Files Пазначце Torrent-файлы - + Torrent Files Torrent-файлы - + Options were saved successfully. Настáўленні паспяхова захаваныя. @@ -3127,52 +2711,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. Ваш дынамічны DNS адрас паспяхова абноўлены. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Памылка дынамічнага DNS: служба часова недаступная. Паўторная спроба праз 30 хвілін. - + Dynamic DNS error: hostname supplied does not exist under specified account. Памылка дынамічнага DNS: дадзеная назва хоста не існуе ў вызначаным уліковым запісе. - + Dynamic DNS error: Invalid username/password. Памылка дынамічнага DNS: Нядзейснае імя карыстальніка ці пароль. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Памылка дынамічнага DNS: qBittorrent заблакаваны гэтай службай. Калі ласка, паведаміце пра гэта на http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Памылка дынамічнага DNS: служба вяртае %1. Калі ласка, паведаміце пра гэта на http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Памылка дынамічнага DNS: вашае імя карыстальніка было заблакавана праз злоўжыванні. - + Dynamic DNS error: supplied domain name is invalid. Памылка дынамічнага DNS: дадзеная назва дамену несапраўдная. - + Dynamic DNS error: supplied username is too short. Памылка дынамічнага DNS: гэтае імя карыстальніка занадта кароткае. - + Dynamic DNS error: supplied password is too short. Памылка дынамічнага DNS: дадзены пароль занадта кароткі. @@ -3180,1413 +2764,1303 @@ Net::DownloadHandler - + I/O Error Памылка ўводу/вываду - + The file size is %1. It exceeds the download limit of %2. - Памер файла: %1. Гэта перавышае абмежаванне спампавання %2. + Памер файла: %1. Гэта перавышае абмежаванне сцягвання %2. - + Unexpected redirect to magnet URI. Нечаканае перанакіраванне на Magnet-спасылку. - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. База даных GeoIP загружана. Тып: %1. Час пабудовы: %2. - - + + Couldn't load GeoIP database. Reason: %1 Не выйшла загрузіць базу даных GeoIP з прычыны: %1 - + Venezuela, Bolivarian Republic of Венесуэла, Баліварыянская Рэспубліка - + Viet Nam В'етнам - - + + N/A Н/Д - + Andorra Андора - + United Arab Emirates Аб'яднаныя Арабскія Эміраты - + Afghanistan Афганістан - + Antigua and Barbuda Антыгуа і Барбуда - + Anguilla Ангілья - + Albania Албанія - + Armenia Арменія - + Angola Ангола - + Antarctica Антарктыда - + Argentina Аргенціна - + American Samoa Амерыканскае Самоа - + Austria Аўстрыя - + Australia Аўстралія - + Aruba Аруба - + Azerbaijan Азербайджан - + Bosnia and Herzegovina Боснія і Герцагавіна - + Barbados Барбадас - + Bangladesh Бангладэш - + Belgium Бельгія - + Burkina Faso Буркіна-Фасо - + Bulgaria Балгарыя - + Bahrain Бахрэйн - + Burundi Бурундзі - + Benin Бенін - + Bermuda Бэрмудзкія выспы - + Brunei Darussalam Бруней-Даруссалам - + Brazil Бразілія - + Bahamas Багамскія выспы - + Bhutan Бутан - + Bouvet Island Востраў Буве - + Botswana Батсвана - + Belarus Беларусь - + Belize Беліз - + Canada Канада - + Cocos (Keeling) Islands Какосавыя (Кілінг) выспы - + Congo, The Democratic Republic of the Конга, Дэмакратычная Рэспубліка - + Central African Republic Цэнтральная Афрыканская Рэспубліка - + Congo Конга - + Switzerland Швейцарыя - + Cook Islands Выспы Кука - + Chile Чылі - + Cameroon Камерун - + China Кітай - + Colombia Калумбія - + Costa Rica Коста-Рыка - + Cuba Куба - + Cape Verde Каба-Вэрдэ - + Curacao Кюрасаа - + Christmas Island Выспа Раства - + Cyprus Кіпр - + Czech Republic - Чэшская Рэспубліка + Чэская Рэспубліка - + Germany Германія - + Djibouti Джыбуці - + Denmark Данія - + Dominica Дамініка - + Dominican Republic Дамініканская Рэспубліка - + Algeria Алжыр - + Ecuador Эквадор - + Estonia Эстонія - + Egypt Егіпет - + Western Sahara Заходняя Сахара - + Eritrea Эрытрэя - + Spain Іспанія - + Ethiopia Эфіопія - + Finland Фінляндыя - + Fiji Фіджы - + Falkland Islands (Malvinas) Фалкленскія выспы (Мальдзівы) - + Micronesia, Federated States of Мікранезія, Фэдэратыўныя Штаты - + Faroe Islands Фарэрскія выспы - + France Францыя - + Gabon Габон - + United Kingdom Злучанае Каралеўства - + Grenada Грэнада - + Georgia Грузія - + French Guiana Французская Гвіяна - + Ghana Гана - + Gibraltar Гібралтар - + Greenland Грэнландыя - + Gambia Гамбія - + Guinea Гвінея - + Guadeloupe Гвадэлупа - + Equatorial Guinea Экватарыяльная Гвінея - + Greece Грэцыя - + South Georgia and the South Sandwich Islands Паўднёвая Джорджыя і Паўднёвыя Сандвічавы выспы - + Guatemala Гватэмала - + Guam Гуам - + Guinea-Bissau Гвінея-Бісаў - + Guyana Гаяна - + Hong Kong Ганконг - + Heard Island and McDonald Islands Выспа Херд і выспы Макдональд - + Honduras Гандурас - + Croatia Харватыя - + Haiti Гаіці - + Hungary Венгрыя - + Indonesia Інданезія - + Ireland Ірландыя - + Israel Ізраіль - + India Індыя - + British Indian Ocean Territory Брытанская тэрыторыя Індыйскага акіяна - + Iraq Ірак - + Iran, Islamic Republic of Іран, Ісламская Рэспубліка - + Iceland Ісландыя - + Italy Італія - + Jamaica Ямайка - + Jordan Іарданія - + Japan Японія - + Kenya Кенія - + Kyrgyzstan Кіргізія - + Cambodia Камбоджа - + Kiribati Кірыбаці - + Comoros Каморскія выспы - + Saint Kitts and Nevis Сэнт-Кітс і Нэвіс - + Korea, Democratic People's Republic of Карэйская Народна-Дэмакратычная Рэспубліка - + Korea, Republic of Карэя, Рэспубліка - + Kuwait Кувейт - + Cayman Islands Кайманавы выспы - + Kazakhstan Казахстан - + Lao People's Democratic Republic Лаоская Народна-Дэмакратычная Рэспубліка - + Lebanon Ліван - + Saint Lucia Сэнт-Люсія - + Liechtenstein Ліхтэнштэйн - + Sri Lanka Шры Ланка - + Liberia Ліберыя - + Lesotho Лесота - + Lithuania Літва - + Luxembourg Люксембург - + Latvia Латвія - + Morocco Марока - + Monaco Манака - + Moldova, Republic of Малдова, Рэспубліка - + Madagascar Мадагаскар - + Marshall Islands Маршалавы выспы - + Mali Малі - + Myanmar М'янма - + Mongolia Манголія - + Northern Mariana Islands Паўночныя Марыянскія выспы - + Martinique Марцініка - + Mauritania Маўрытанія - + Montserrat Мантсерат - + Malta Мальта - + Mauritius Маўрыкій - + Maldives Мальдывы - + Malawi Малаві - + Mexico Мексіка - + Malaysia Малайзія - + Mozambique Мазамбік - + Namibia Намібія - + New Caledonia Новая Каледонія - + Niger Нігер - + Norfolk Island Выспа Норфалк - + Nigeria Нігерыя - + Nicaragua Нікарагуа - + Netherlands Нідэрланды - + Norway Нарвегія - + Nepal Непал - + Nauru Науру - + Niue Ніуе - + New Zealand Новая Зеландыя - + Oman Аман - + Panama Панама - + Peru Перу - + French Polynesia Французская Палінезія - + Papua New Guinea Папуа-Новая Гвінея - + Philippines Філіпіны - + Pakistan Пакістан - + Poland Польшча - + Saint Pierre and Miquelon Сен-П'ер і Мікелон - + Puerto Rico Пуэрта-Рыка - + Portugal Партугалія - + Palau Палаў - + Paraguay Парагвай - + Qatar Катар - + Reunion Уз'яднанне - + Romania Румынія - + Russian Federation Расійская Федэрацыя - + Rwanda Руанда - + Saudi Arabia Сірыя - + Solomon Islands Саламонавы выспы - + Seychelles Сейшэльскія выспы - + Sudan Судан - + Sweden Швецыя - + Singapore Сінгапур - + Slovenia Славенія - + Svalbard and Jan Mayen Шпіцбэрген і Ян-Майен - + Slovakia Славакія - + Sierra Leone Сьера-Леонэ - + San Marino Сан-Марына - + Senegal Сенегал - + Somalia Самалі - + Suriname Сурынам - + Sao Tome and Principe Сан-Томе і Прынсэп - + El Salvador Сальвадор - + Syrian Arab Republic Сірыйская Арабская Рэспубліка - + Swaziland Свазіленд - + Turks and Caicos Islands Цёркс і Кайкас - + Chad Чад - + French Southern Territories Французскія Паўднёвыя тэрыторыі - + Togo Таго - + Thailand Тайланд - + Tajikistan Таджыкістан - + Tokelau Такелаў - + Turkmenistan Туркменістан - + Tunisia Туніс - + Tonga Тонга - - Could not decompress GeoIP database file. - Не атрымалася распакаваць файл базы дадзеных GeoIP. - - - + Timor-Leste Тымор-Лешці - + Bolivia, Plurinational State of Балівія, Шматнацыянальная Дзяржава - + Bonaire, Sint Eustatius and Saba Банайрэ, Сінт-Эстаціус і Саба - + Cote d'Ivoire Кот-д'Івуар - + Libya Лівія - + Saint Martin (French part) Святога Марціна, выспа (французская частка) - + Macedonia, The Former Yugoslav Republic of Македонія, Былая Югаслаўская Рэспубліка - + Macao Макаа - + Pitcairn Піткэрн, выспы - + Palestine, State of Палестына - + Saint Helena, Ascension and Tristan da Cunha Выспы Святой Алены, Ушэсця і Трыстан-да-Кунья - + South Sudan Паўднёвы Судан - + Sint Maarten (Dutch part) Святога Марціна, выспа (нідэрландская частка) - + Turkey Турцыя - + Trinidad and Tobago Трынідад і Табага - + Tuvalu Тувалу - + Taiwan Тайвань - + Tanzania, United Republic of Танзанія, Аб'яднаная Рэспубліка - + Ukraine Украіна - + Uganda Уганда - + United States Minor Outlying Islands Знешнія малыя выспы ЗША - + United States ЗША - + Uruguay Уругвай - + Uzbekistan Узбекістан - + Holy See (Vatican City State) Святы Пасад (Дзяржава-горад Ватыкан) - + Saint Vincent and the Grenadines Сэнт-Вінсэнт і Грэнадыны - + Virgin Islands, British Віргінскія выспы, Брытанскія - + Virgin Islands, U.S. Віргінскія выспы, ЗША - + Vanuatu Вануату - + Wallis and Futuna Уоліс і Футуна - + Samoa Самоа - + Yemen Емен - + Mayotte Маёта - + Serbia Сербія - + South Africa Паўднёвая Афрыка - + Zambia Замбія - + Montenegro Чарнагорыя - + Zimbabwe Зімбабвэ - + Aland Islands Аландскія выспы - + Guernsey Выспа Гернсі - + Isle of Man Выспа Мэн - + Jersey Джэрсі - + Saint Barthelemy Сен-Бартэльмі - + + Could not uncompress GeoIP database file. + Не выйшла распакаваць файл з базай даных GeoIP. + + + Couldn't save downloaded GeoIP database file. Не выйшла захаваць сцягнуты файл з базай даных GeoIP. - + Successfully updated GeoIP database. База звестак GeoIP паспяхова абноўлена. - + Couldn't download GeoIP database file. Reason: %1 Не выйшла сцягнуць файл з базай даных GeoIP з прычыны: %1 @@ -4594,12 +4068,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] Падтрымка UPnP / NAT-PMP [Укл] - + UPnP / NAT-PMP support [OFF] Падтрымка UPnP / NAT-PMP [Адкл] @@ -4607,7 +4081,7 @@ Net::Smtp - + Email Notification Error: Памылка паведамлення на email: @@ -4615,1348 +4089,1150 @@ OptionsDialog - + Options - Параметры + - + Behavior - Паводзіны + - + Downloads - Спампоўкі + Сцягванні - + Connection - Злучэнне + Злучэнне - + Speed - Хуткасць + Хуткасць - + BitTorrent - BitTorrent - - - - RSS - RSS + - + Web UI - Веб-інтэрфейс + - + Advanced - Пашыраныя + - + Language - Мова + Мова - + User Interface Language: - Мова інтерфейса: + - + (Requires restart) - (Патрабуецца перазапуск) + - + Transfer List - Спіс торэнтаў + - + Confirm when deleting torrents - Пацвярджаць выдаленне торэнтаў + - + Use alternating row colors In transfer list, one every two rows will have grey background. - Выкарыстоўваць чаргаванне колеру радкоў + - + Hide zero and infinity values - Хаваць нулявыя і бясконцыя значэнні + - + Always - Заўсёды + Заўсёды - + Paused torrents only - Толькі для спыненых + - + Action on double-click - Дзеянне пры падвоеным націску + - + Downloading torrents: - Торэнты якія спампоўваюцца: + - - + + Start / Stop Torrent - Запусціць / Спыніць торэнт + - - + + Open destination folder - Адкрыць каталог прызначэння + Адкрыць каталог прызначэння - - + + No action - Няма дзеяння + - + Completed torrents: - Завершаныя торэнты: + - + Desktop - Працоўны стол + - + Start qBittorrent on Windows start up - Запушчаць qBittorrent разам з Windows + - + Show splash screen on start up - Паказаць застаўку пры запуску + - + Start qBittorrent minimized - Запушчаць qBittorrent згорнутым + - + Confirmation on exit when torrents are active - Пацвярджаць выхад пры наяўнасці актыўных торэнтаў + - + Confirmation on auto-exit when downloads finish - Пацвярджаць аўтавыхад па сканчэнні спампаванняў + - - KiB - КіБ + + Show qBittorrent in notification area + - - Email notification &upon download completion - Апавяшчэнне па электроннай пошце пасля &завяршэння спампавання + + Minimize qBittorrent to notification area + - - Run e&xternal program on torrent completion - Запусціць &знешнюю праграму па сканчэнні спампавання торэнта + + Close qBittorrent to notification area + i.e: The systray tray icon will still be visible when closing the main window. + - - IP Fi&ltering - &Фільтрацыя па IP + + Tray icon style: + - - Schedule &the use of alternative rate limits - &Запланаваць выкарыстанне альтэрнатыўных абмежаванняў хуткасці + + Normal + Звычайны - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + + Monochrome (Dark theme) - - &Torrent Queueing - &Чарговасць торэнтаў + + Monochrome (Light theme) + - - Seed torrents until their seeding time reaches - Раздаваць торэнты пакуль іхні час раздачы не дасягне + + File association + - - A&utomatically add these trackers to new downloads: - Аўта&матычна дадаваць гэтыя трэкеры да новых спамповак: + + Use qBittorrent for .torrent files + - - RSS Reader - RSS-менеджэр + + Use qBittorrent for magnet links + - - Enable fetching RSS feeds - Уключыць атрыманне RSS-каналаў + + Power Management + - - Feeds refresh interval: - Інтэрвал абнаўлення каналаў: + + Inhibit system sleep when torrents are active + - - Maximum number of articles per feed: - Максімальная колькасць артыкулаў на канал: + + Log file + - - - min - minutes - хв + + Save path: + - - RSS Torrent Auto Downloader - Аўтаспампаванне торэнтаў з RSS + + Backup the log file after: + - - Enable auto downloading of RSS torrents - Уключыць аўтаспампаванне торэнтаў з RSS + + MB + - - Edit auto downloading rules... - Рэдагаваць правілы аўтаспампавання... + + Delete backup logs older than: + - - Web User Interface (Remote control) - Веб-інтэрфейс (Аддаленае кіраванне) + + days + Delete backup logs older than 10 months + - - IP address: - IP-адрас: + + months + Delete backup logs older than 10 months + - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - IP-адрас да якога будзе прывязаны вэб-інтэрфейс. -Пазначце IPv4 або IPv6-адрас. Вы можаце пазначыць «0.0.0.0» для любога IPv4-адраса, -«::» для любога IPv6-адраса, або «*» для абодвух IPv4 и IPv6. + + years + Delete backup logs older than 10 years + - - Server domains: - Домены сервера: + + When adding a torrent + - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. + + Display torrent content and some options - - &Use HTTPS instead of HTTP - &Выкарыстоўваць HTTPS замест HTTP + + Bring torrent dialog to the front + - - Bypass authentication for clients on localhost - Мінаваць аўтэнтыфікацыю кліентаў для localhost + + Do not start the download automatically + The torrent will be added to download list in pause state + - - Bypass authentication for clients in whitelisted IP subnets - Мінаваць аўтэнтыфікацыю кліентаў для дазволеных падсетак + + Should the .torrent file be deleted after adding it + - - IP subnet whitelist... - Дазволеныя падсеткі... + + Delete .torrent files afterwards + - - Upda&te my dynamic domain name - А&бнаўляць мой дынамічны DNS + + Also delete .torrent files whose addition was cancelled + - - Minimize qBittorrent to notification area - Згарнуць qBittorrent у вобласць апавяшчэнняў + + Also when addition is cancelled + - - Close qBittorrent to notification area - i.e: The systray tray icon will still be visible when closing the main window. - Закрываць qBittorrent у вобласць апавяшчэнняў + + Warning! Data loss possible! + - - Tray icon style: - Стыль значка ў трэі: + + Saving Management + - - Normal - Звычайны + + Default Torrent Management Mode: + - - Monochrome (Dark theme) - Манахромны (Цёмная тэма) + + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category + - - Monochrome (Light theme) - Манахромны (Светлая тэма) + + Manual + - - File association - Суаднесенні файлаў + + Automatic + - - Use qBittorrent for .torrent files - Выкарыстоўваць qBittorrent для торрент-файлаў + + When Torrent Category changed: + - - Use qBittorrent for magnet links - Выкарыстоўваць qBittorrent для магнет-спасылак + + Relocate torrent + - - Power Management - Кіраванне сілкаваннем + + Switch torrent to Manual Mode + - - Save path: - Шлях захавання: - - - - Backup the log file after: - Ствараць рэзервоваю копію пасля: - - - - Delete backup logs older than: - Выдаляць рэзервовыя копіі старэйшыя за: - - - - days - Delete backup logs older than 10 months - дні/дзён - - - - months - Delete backup logs older than 10 months - месяц/месяцы - - - - years - Delete backup logs older than 10 years - год/гады - - - - When adding a torrent - Пры даданні торэнта - - - - Bring torrent dialog to the front - Паказваць дыялог дадання торэнта па-над іншымі вокнамі - - - - Do not start the download automatically - The torrent will be added to download list in pause state - Не пачынаць спампаванне аўтаматычна - - - - Should the .torrent file be deleted after adding it - Выдаляць торэнт-файл пасля паспяховага дадавання ў чаргу - - - - Also delete .torrent files whose addition was cancelled - Таксама выдаляць .torrent файлы даданне якіх было скасавана - - - - Also when addition is cancelled - Таксама калі даданне скасавана - - - - Warning! Data loss possible! - Папярэджанне! Магчыма страта дадзеных! - - - - Saving Management - Кіраванне захаваннем - - - - Default Torrent Management Mode: - Рэжым кіравання торэнтамі па змаўчанні: - - - - Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - Аўтаматычны рэжым азначае, што розныя уласцівасці торэнту (напр. шлях захавання) будзе вызначацца адпаведнай катэгорыяй - - - - Manual - Ручны - - - - Automatic - Аўтаматычны - - - - When Torrent Category changed: - Пры змене катэгорыі торэнта: - - - - Relocate torrent - Перамясціць торэнт - - - - Switch torrent to Manual Mode - Пераключыць торэнт у Ручны рэжым - - - + When Default Save Path changed: - Пры змене шляху захавання: + - - + + Relocate affected torrents - Перамясціць закранутыя торэнты + - - + + Switch affected torrents to Manual Mode - Пераключыць закранутыя торэнты ў Ручны рэжым + - + When Category changed: - Пры змене катэгорыі: + - + Use Subcategories - Выкарыстоўваць падкатэгорыі + - + Default Save Path: - Шлях захавання па змаўчанні: + - + Keep incomplete torrents in: - Захоўваць незавершаныя торэнты ў: + - + Copy .torrent files to: - Капіяваць .torrent файлы ў: - - - - Show &qBittorrent in notification area - Паказваць &qBittorrent у вобласці апавяшчэнняў - - - - &Log file - &Лог-файл - - - - Display &torrent content and some options - Адлюстроўваць змесціва &торэнта і некаторыя параметры - - - - Create subfolder for torrents with multiple files - Стварыць падпапку для торэнтаў з мноствам файлаў - - - - De&lete .torrent files afterwards - Выда&ляць .torrent файлы пазней + - + Copy .torrent files for finished downloads to: - Капіяваць .torrent файлы скончаных спамповак ў: + - + Pre-allocate disk space for all files - Папярэдне рэзерваваць месца для ўсіх файлаў - - - - Inhibit system sleep when torrents are downloading - - Inhibit system sleep when torrents are seeding + + Append .!qB extension to incomplete files - - Append .!qB extension to incomplete files - Далучаць пашыренне .!qB да незавершаных файлаў + + Automatically add torrents from: + - - Enable recursive download dialog + + Add entry - - Automatically add torrents from: - Аўтаматычна дадаваць торэнты з: + + Remove entry + - - Add entry - Дадаць запіс + + Email notification upon download completion + - - Remove entry - Выдаліць запіс + + Destination email: + - + SMTP server: - SMTP-сервер: + - + This server requires a secure connection (SSL) - Гэты сервер патрабуе бяспечнага злучэння (SSL) + - - + + + Authentication - Аўтэнтыфікацыя + - - - - + + + + Username: - Імя карыстальніка: + Імя карыстальніка: - - - - + + + + Password: - Пароль: - - - - Enabled protocol: - Ключаны пратакол: + Пароль: - - TCP and μTP - TCP і μTP + + Run external program on torrent completion + - + Listening Port - Праслухоўваемы порт + - + Port used for incoming connections: - Порт для ўваходных злучэнняў: + - + Random - Выпадковы + - + Use UPnP / NAT-PMP port forwarding from my router - Выкарыстоўваць UPnP / NAT-PMP майго маршрутызатара + - + Use different port on each startup - Выкарыстоўваць выпадковы порт пры запуску + - + Connections Limits - Абмежаванні злучэнняў + - + Maximum number of connections per torrent: - Максімальная колькасцьзлучэнняў на торэнт: + - + Global maximum number of connections: - Максімальная колькасць злучэнняў: + - + Maximum number of upload slots per torrent: - Максімальная колькасць слотаў аддачы на торэнт: + - + Global maximum number of upload slots: - Максімальная колькасць слотаў раздач: + - + Proxy Server - Проксі-сервер + - + Type: - Тып: + - + (None) - (Няма) + - + SOCKS4 - SOCKS4 + - + SOCKS5 - Сервер SOCKS5 + - + HTTP - HTTP + - + Host: - Хост: + - - + + Port: - Порт: + - + Otherwise, the proxy server is only used for tracker connections - Інакш проксі-сервер выкарыстоўваецца толькі для злучэнняў з трэкерамі + - + Use proxy for peer connections - Выкарыстоўваць проксі для злучэння з пірамі + - + Disable connections not supported by proxies - Адключыць злученні непадтрымоўваныя проксі-серверам - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - RSS-каналы, пашукавікі, абнаўленні праграмы і іншае, што не адносіцца да перадачы торэнтаў (напрыклад, абмен пірами), будуць выкарыстоўваць прамое злучэнне + - + Use proxy only for torrents - Выкарыстоўваць проксі толькі для торэнтаў + - - A&uthentication - &Аўтэнтыфікацыя + + Info: The password is saved unencrypted + - - Info: The password is saved unencrypted - Інфармацыя: пароль будзе захаваны ў незашыфраваным выглядзе + + IP Filtering + - + Filter path (.dat, .p2p, .p2b): - Шлях да фільтраў (.dat, .p2p, .p2b): + - + Reload the filter - Перазагрузіць фільтр - - - - Manually banned IP addresses... - Адрасы IP, забароненыя ўручную… + - + Apply to trackers - Прымяніць да трэкераў + - + Global Rate Limits - Глабальныя абмежаванні хуткасці + - - - - - - - KiB/s + + + Upload: - - - Upload: - Аддача: + + + + + KiB/s + КіБ/с - - + + Download: - Спампаванне: + - + Alternative Rate Limits - Іншыя абмежаванні хуткасці + + + + + Schedule the use of alternative rate limits + - - + From: from (time1 to time2) - З: + - - + To: time1 to time2 - Да: + - + When: - Калі: + - + Every day - Кожны дзень + - + Weekdays - Будні + - + Weekends - Выхадныя + - + Rate Limits Settings - Налады абмежавання хуткасці + - + Apply rate limit to peers on LAN - Прымяніць абмежаванне хуткасці да лакальных піраў LAN + - + Apply rate limit to transport overhead - Прымяніць абмежаванне хуткасці да службовага трафіку + - - + + + Enable µTP protocol + + + + Apply rate limit to µTP protocol - Прымяніць абмежаванне хуткасці да пратаколу µTP + - + Privacy - Канфідэнцыяльнасць + - + Enable DHT (decentralized network) to find more peers - Уключыць DHT (дэцэнтралізаваную сетку), каб знайсці больш піраў + - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - Абмен пірамі з сумяшчальны кліентами Bittorrent (µTorrent, Vuze, …) + - + Enable Peer Exchange (PeX) to find more peers - Уключыць абмен пірамі (PeX), каб знайсці больш піраў + - + Look for peers on your local network - Шукаць піры ў лакальнай сетцы + - + Enable Local Peer Discovery to find more peers - Уключыць выяўленне лакальных піраў, каб знайсці больш піраў + - + Encryption mode: - Рэжым шыфравання: + - + Prefer encryption - Аддаваць перавагу шыфраванню + - + Require encryption - Патрабаваць шыфраванне + - + Disable encryption - Адключыць шыфраванне + - + Enable when using a proxy or a VPN connection - Уключыць, калі выкарыстоўваюцца злучэнні проксі альбо VPN + - + Enable anonymous mode - Уключыць ананімны рэжым - - - - Maximum active downloads: - Максімальная колькасць актыўных спамповак: - - - - Maximum active uploads: - Максімальная колькасць актыўных раздач: + - - Maximum active torrents: - Максімальная колькасць актыўных торэнтаў: + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + - - Do not count slow torrents in these limits - Не ўлічваць колькасць павольных торэнтаў ў гэтых абмежаваннях + + Torrent Queueing + - - Upload rate threshold: + + Maximum active downloads: - - Download rate threshold: + + Maximum active uploads: - - sec - seconds + + Maximum active torrents: - - Torrent inactivity timer: + + Do not count slow torrents in these limits - + Share Ratio Limiting - Абмежаванне каэфіціента раздачы + - + Seed torrents until their ratio reaches - Раздаваць торэнты пакуль іхні каэфіціент раздачы не дасягне + - + then - затым + - + Pause them - Спыніць + - + Remove them - Выдаліць іх + - - RSS Smart Episode Filters + + Automatically add these trackers to new downloads: - + + Enable Web User Interface (Remote control) + + + + Use UPnP / NAT-PMP to forward the port from my router - Выкарыстоўваць UPnP / NAT-PMP для перанакіравання порта ад майго маршрутызатара + - + + Use HTTPS instead of HTTP + + + + Certificate: - Сертыфікат: + - + Import SSL Certificate - Імпартаваць сертыфікат SSL + - + Key: - Ключ: + - + Import SSL Key - Імпартаваць ключ SSL - - - - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Інфармацыя аб сертыфікатах</a> - - - - Use alternative Web UI - - Files location: + + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - - Enable clickjacking protection + + Bypass authentication for localhost - - Enable Cross-Site Request Forgery (CSRF) protection + + Update my dynamic domain name - + Service: - Сэрвіс: + - + Register - Рэгістрацыя + - + Domain name: - Даменнае імя: + - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - Пасля ўключэння гэтага параметру вы можаце <strong>незваротна страціць</strong> свае torrent-файлы! + - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): - Падтрымліваемыя параметры (з улікам рэгістру) + - + %N: Torrent name - %N: Імя торэнта + - + %L: Category - %L: Катэгорыя - - - - %G: Tags (seperated by comma) - + %F: Content path (same as root path for multifile torrent) - %F: Папка змесціва (тая ж, што і карэнная папка для шматфайлавых торэнтаў) + - + %R: Root path (first torrent subdirectory path) - % R: Карэнная папка (галоўны шлях для падкаталага торэнта) + - + %D: Save path - %D: Шлях захавання + - + %C: Number of files - %C: Колькасць файлаў + - + %Z: Torrent size (bytes) - %Z: Памер торэнта (байты) + - + %T: Current tracker - %T: Бягучы трэкер + - + %I: Info hash - %I: Хэш-сума + - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - Падказка: уключыце параметр у двукоссі каб пазбегнуць абразання на прабелах (напр. "%N") - - - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - + Select folder to monitor - Выбраць папку для наглядання + - + Folder is already being monitored: - Папка ўжо наглядаецца + - + Folder does not exist: - Папка не існуе + - + Folder is not readable: - Папка не можа быць прачытана: + - + Adding entry failed - Няўдалае даданне запісу + - - - - + + Choose export directory - Выберыце каталог для экспарту + - - - + + + + + + Choose a save directory - Выберыце каталог для захавання + - + Choose an IP filter file - Выберыце файл IP фільтраў + - + All supported filters - Усе падтрымліваемыя фільтры + - + SSL Certificate - SSL сертыфікат + + + + + SSL Key + - + Parsing error - Памылка разбору + - + Failed to parse the provided IP filter - Не атрымалася разабраць прадстаўлены IP-фільтр + - + Successfully refreshed - Паспяхова абноўлена + - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - IP-фільтр паспяхова прачытаны: ужыта %1 правілаў. + IP-фільтр паспяхова прачытаны: ужыта %1 правілаў. - + Invalid key - Недапушчальны ключ + - + This is not a valid SSL key. - Гэта несапраўдны ключ SSL. + - + Invalid certificate - Недапушчальны сертыфікат + - - Preferences - Налады + + This is not a valid SSL certificate. + - - Import SSL certificate - Імпартаваць SSL сертыфікат + + Time Error + - - This is not a valid SSL certificate. - Гэта недапушчальны SSL сертыфікат. - - - - Import SSL key - Імпартаваць SSL ключ - - - - SSL key - SSL ключ - - - - Time Error - Памылка часу - - - + The start time and the end time can't be the same. - Час пачатку і завяршэння не можа быць аднолькавым. + - - + + Length Error - Памылка памеру + - + The Web UI username must be at least 3 characters long. - Імя карыстальніка вэб-інтэрфейсу павінна быць не меншым за 3 знакі. + - + The Web UI password must be at least 6 characters long. - Пароль карыстальніка вэб-інтэрфейсу павінны быць не меньшым за 6 знакаў. + PeerInfo - - Interested(local) and Choked(peer) - + + interested(local) and choked(peer) + зацікаўлены (лакальны) і заглухшы (пір) - + interested(local) and unchoked(peer) зацікаўлены (лакальны) і ажыўшы (пір) - + interested(peer) and choked(local) зацікаўлены (пір) і заглухшы (лакальны) - + interested(peer) and unchoked(local) зацікаўлены (пір) і ажыўшы (лакальны) - + optimistic unchoke аптымістычнае ажыўленне - + peer snubbed грэблівы пір - + incoming connection уваходнае злучэнне - + not interested(local) and unchoked(peer) незацікаўлены (лакальны) і ажыўшы (пір) - + not interested(peer) and unchoked(local) незацікаўлены (пір) і ажыўшы (лакальны) - + peer from PEX пір з PEX - + peer from DHT пір з DHT - + encrypted traffic шыфраваны трафік - + encrypted handshake шыфраванае рукапацісканне - + peer from LSD пір з LSD @@ -5964,193 +5240,178 @@ PeerListWidget - + IP IP - + Port Порт - + Flags Сцяжкі - + Connection Злучэнне - + Client i.e.: Client application Кліент - + Progress i.e: % downloaded Рух - + Down Speed i.e: Download speed - Хуткасць спампавання + Хуткасць сцягвання - + Up Speed i.e: Upload speed Хуткасць раздачы - + Downloaded i.e: total data downloaded Сцягнута - + Uploaded i.e: total data uploaded Раздадзена - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Рэлевантнасць - + Files i.e. files that are being downloaded right now Файлы - + Column visibility - Адлюстраванне калонак + Адлюстраванне калонак - + Add a new peer... Дадаць новы пір... - - + + Ban peer permanently Заблакаваць пір назаўсёды - + Manually adding peer '%1'... Ручное даданне піра '%1'... - + The peer '%1' could not be added to this torrent. Пір '%1' не можа быць дадзены да гэтага торэнта. - + Manually banning peer '%1'... Ручное блакаванне піра '%1'... - - + + Peer addition Даданне піра - + Country - Краіна + - + Copy IP:port - Капіяваць IP:порт + - + Some peers could not be added. Check the Log for details. Некаторыя піры нельга дадаць. Глядзіце лог па падрабязнасці. - + The peers were added to this torrent. Піры дададзены да торэнта. - + Are you sure you want to ban permanently the selected peers? Сапраўды жадаеце заблакаваць вылучаныя піры назаўсёды? - + &Yes &Так - + &No &Не - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - + PeersAdditionDlg - + No peer entered - + Пір не ўведзены - + Please type at least one peer. - + Упішыце прынамсі аднаго піра. - + Invalid peer - + Хібны пір - + The peer '%1' is invalid. - + Пір '%1' нядзейсны. PieceAvailabilityBar - + White: Unavailable pieces Белы: Недаступныя кавалкі - + Blue: Available pieces Сіні: Даступныя кавалкі @@ -6158,336 +5419,289 @@ PiecesBar - + Files in this piece: - Файлы ў гэтай частцы: + - + File in this piece - Файл ў гэтай частцы + - + File in these pieces - Файл ў гэтых частках - - - - Wait until metadata become available to see detailed information - Пачакайце даступнасці метададзеных, каб убачыць інфармацыю + - + Hold Shift key for detailed information - Утрымлівайце Shift для больш падрабязнай інфармацыі + - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Пошукавыя плагіны - + Installed search plugins: - + Усталяваныя пошукавыя плагіны: - + Name - Назва + Назва - + Version - + Версія - + Url - + Адрас - - + + Enabled - - - - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - + Уключаны - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Тут можна знайсці новыя пошукавыя плагіны: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Усталяваць новы - + Check for updates - + Праверыць абнаўленні - + Close - + Закрыць - + Uninstall - + Выдаліць - - - + + + Yes - Так + Так - - - - + + + + No - Не + Не - + Uninstall warning - + Папярэджанне пра выдаленне - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Некаторыя плагіны нельга выдаліць, бо яны - частка qBittorrent. Можна выдаліць толькі дададзеныя вамі. +Гэтыя плагіны будуць адключаныя. - + Uninstall success - + Выдалена - + All selected plugins were uninstalled successfully - - - - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - + Усе вылучаныя плагіны паспяхова выдалены - - + + New search engine plugin URL - + URL новага пошукавага плагіна - - + + URL: - + Адрас: - + Invalid link - + Памылковая спасылка - + The link doesn't seem to point to a search engine plugin. - + Гэтая спасылка не вядзе да пошукавага плагіна. - + Select search plugins - + Пазначце пошукавыя плагіны - + qBittorrent search plugin - + Пошукавы плагін qBittorrent + + + + + + Search plugin update + Абнаўленне пошукавага плагіна - + All your plugins are already up to date. - + Усе вашыя плагіны ўжо і так апошніх версій. - + Sorry, couldn't check for plugin updates. %1 - + Выбачце, не выйшла праверыць абнаўленні плагіна. %1 - + + + Search plugin install - + Усталяванне пошукавага плагіна + + + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + Пошукавы плагін "%1" паспяхова ўсталяваны. - + Couldn't install "%1" search engine plugin. %2 - + Немагчыма ўсталяваць пошукавы плагін "%1". %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + Пошукавы плагін "%1" паспяхова абноўлены. + + + Couldn't update "%1" search engine plugin. %2 - + Немагчыма абнавіць пошукавы плагін "%1". %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Крыніца плагіна - + Search plugin source: - + Крыніца пошукавага плагіна: - + Local file - + Лакальны файл - + Web link - - - - - PowerManagement - - - qBittorrent is active - + Web-спасылка - PreviewSelectDialog + PreviewSelect - - Preview - Папярэдні прагляд - - - + Name Назва - + Size Памер - + Progress - Ход выканання + Рух - - + + Preview impossible - Папярэдні прагляд немагчымы + Перадпрагляд немагчымы - - + + Sorry, we can't preview this file - Шкада. Папярэдні прагляд гэтага файла немагчымы - - - - Private::FileLineEdit - - - '%1' does not exist - «%1» не існуе - - - - '%1' does not point to a directory - «%1» не паказвае на каталог - - - - '%1' does not point to a file - «%1» не паказвае на файл - - - - Does not have read permission in '%1' - Бракуе правоў на чытанне ў «%1» - - - - Does not have write permission in '%1' - Бракуе правоў на запіс ў «%1» + Выбачайце, перадпрагляд гэтага файла немагчымы PropListDelegate - + Not downloaded - Не спампоўваць + Не сцягваць - - + + Normal Normal (priority) Звычайны - - N/A - Н/Д - - - + Do not download Do not download (priority) - Не спампоўваць + Не сцягваць - - + + High High (priority) Высокі - + Mixed Mixed (priorities Змешаны - - + + Maximum Maximum (priority) Максімальны @@ -6496,32 +5710,32 @@ PropTabBar - + General Агульныя звесткі - + Trackers Трэкеры - + Peers Піры - + HTTP Sources HTTP-крыніцы - + Content Змесціва - + Speed Хуткасць @@ -6572,7 +5786,7 @@ Download Speed: - Хуткасць спампавання: + Хуткасць сцягвання: @@ -6587,7 +5801,7 @@ Download Limit: - Абмежаванне спампавання: + Абмежаванне сцягвання: @@ -6615,22 +5829,22 @@ Каментар: - + Select All Вылучыць усё - + Select None Зняць усё - + Normal Звычайны - + High Высокі @@ -6690,165 +5904,165 @@ Шлях захавання: - + Maximum Максімальны + - Do not download - Не спампоўваць + Не сцягваць - + Never Ніколі - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (з іх ёсць %3) - - + + %1 (%2 this session) %1 (%2 гэтая сесія) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (раздаецца %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (макс. %2) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (усяго %2) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (сяр. %2) - + Open Адкрыць - + Open Containing Folder Адкрыць змяшчальны каталог - + Rename... Пераназваць... - + Priority Прыярытэт - + New Web seed Новы Web-сід - + Remove Web seed Выдаліць Web-сід - + Copy Web seed URL Капіяваць адрас Web-раздачы - + Edit Web seed URL Змяніць адрас Web-раздачы - + + Rename the file + Пераназваць файл + + + New name: Новая назва: - - + + + The file could not be renamed + Немагчыма пераназваць файл + + + + This file name contains forbidden characters, please choose a different one. + Назва файла змяшчае недазволеныя сімвалы. Калі ласка, дайце іншую назву. + + + + This name is already in use in this folder. Please use a different name. Гэтая назва ўжо ёсць ў каталогу. Калі ласка, дайце іншую назву. - + The folder could not be renamed Немагчыма пераназваць каталог - + qBittorrent qBittorrent - + Filter files... Фільтраваць файлы... - - Renaming - Перайменаванне - - - - - Rename error - Памылка перайменавання - - - - The name is empty or contains forbidden characters, please choose a different one. - Імя пустое або змяшчае забароненыя сімвалы, калі ласка, выберыце іншае. - - - + New URL seed New HTTP source Новы URL раздачы - + New URL seed: URL новага сіда: - - + + This URL seed is already in the list. URL гэтага сіда ўжо ў спісе. - + Web seed editing Рэдагаванне Web-раздачы - + Web seed URL: Адрас Web-раздачы: @@ -6856,859 +6070,818 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + Ваш IP-адрас быў заблакаваны пасля занадта шматлікіх няўдалых спробаў аўтэнтыфікацыі. + + + + Error: '%1' is not a valid torrent file. + + Памылка: '%1' гэта нядзейсны торэнт-файл. + + + + Error: Could not add torrent to session. + Памылка: Не выйшла дадаць торэнт да сесіі. + + + + I/O Error: Could not create temporary file. + Памылка ўводу/вываду: не выходзіць стварыць часовы файл. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 - невядомы параметр загаднага радка. - - + + %1 must be the single command line parameter. %1 мусіць быць адзіным параметрам загаднага радка. - + + %1 must specify the correct port (1 to 65535). + %1 мусіць задаваць карэктны порт (з 1 да 65535). + + + You cannot use %1: qBittorrent is already running for this user. Нельга выкарыстаць %1: qBittorrent ужо выконваецца для гэтага карыстальніка. - + Usage: Выкарыстанне: - + Options: Параметры: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - Параметр «%1» павінен прытрымлівацца сінтаксісу «%1=%2» + + Displays program version + Паказаць версію праграмы - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - Параметр «%1» павінен прытрымлівацца сінтаксісу «%1=%2» + + Displays this help message + Паказаць гэтую даведку - - Expected integer number in environment variable '%1', but got '%2' - Чаканы цэлы лік у пераменнай асяроддзя − «%1», але атрымана «%2» + + Changes the Web UI port (current: %1) + Змяняе порт вэб-інтэрфейсу (дзейны: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - Параметр «%1» павінен прытрымлівацца сінтаксісу «%1=%2» + + Disable splash screen + Адключыць застаўку - - Expected %1 in environment variable '%2', but got '%3' - Чакалася «%1» у пераменнай асяроддзя «%2», але атрымана «%3» + + Run in daemon-mode (background) + Працаваць у рэжыме дэмана (у фоне) - - port - порт + + Downloads the torrents passed by the user + Сцягнуць торэнты, якія пазначыў карыстальнік - - %1 must specify a valid port (1 to 65535). - %1 неабходна ўказаць сапраўдны порт (з 1 да 65535). + + Help + Даведка - - Display program version and exit - Паказваць версію праграмы і выйсце + + Run application with -h option to read about command line parameters. + Запусціце праграму з параметрам -h, каб атрымаць даведку па параметрах загаднага радка - - Display this help message and exit - Паказваць гэтую даведку і выйсце + + Bad command line + Хібны загадны радок - - Change the Web UI port - Змяніць порт вэб-інтэфейсу + + Bad command line: + Хібны загадны радок: - - Disable splash screen - Адключыць застаўку + + Legal Notice + Афіцыйная перасцярога - - Run in daemon-mode (background) - Працаваць у рэжыме дэмана (у фоне) + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + qBittorrent - праграма для абмену файламі. Пасля запуску торэнта яго змесціва стане даступным іншым удзельнікам для раздачы. Любым змесцівам вы дзеліцеся пад вашу асабістую адказнасць. + +Ніякіх дадатковых перасцярог паказвацца не будзе. - - dir - Use appropriate short form or abbreviation of "directory" - папка + + Press %1 key to accept and continue... + Націсніце %1 каб пагадзіцца і працягнуць... - - Store configuration files in <dir> - Захоўваць файлы канфігурацыі ў <dir> + + Legal notice + Афіцыйная перасцярога - - - name - назва + + Cancel + Скасаваць - - Store configuration files in directories qBittorrent_<name> - Захоўваць файлы канфігурацыі ў папках qBittorrent_<name> + + I Agree + Я згодны(ая) - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - + + Torrent name: %1 + Назва торэнта: %1 - - files or URLs - файлы або спасылкі + + Torrent size: %1 + Памер торэнта: %1 - - Download the torrents passed by the user - Спампоўваць торэнты, прынятыя карыстальнікам + + Save path: %1 + Шлях захавання: %1 - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Пазначце, ці адкрываецца дыялогавае акно «Дадаць новы торэнт» пры даданні торэнта. + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Торэнт быў сцягнуты за %1. - - Options when adding new torrents: - Параметры пры даданні новых торэнтаў: + + Thank you for using qBittorrent. + Дзякуй за карыстанне qBittorrent. - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Спалучэнне клавіш для %1 + + [qBittorrent] '%1' has finished downloading + [qBittorrent] Сцягванне '%1' скончана - - path - шлях + + The remote host name was not found (invalid hostname) + Адлеглы хост не знойдзены (памылковая назва хоста) - - Torrent save path - Шлях захавання торэнтаў + + The operation was canceled + Аперацыя была скасавана - - Add torrents as started or paused - Дадаваць торэнты як запушчаныя або прыпыненыя + + The remote server closed the connection prematurely, before the entire reply was received and processed + Адлеглы сервер закрыў злучэнне перад тым, як увесь адказ быў атрыманы і апрацаваны - - Skip hash check - Прапусціць праверку хэша + + The connection to the remote server timed out + Тэрмін чакання злучэння з адлеглым серверам скончыўся - - Assign torrents to category. If the category doesn't exist, it will be created. - Прызначаць торэнтам катэгорыі. Калі катэгорыя не існуе, яна будзе створана. + + SSL/TLS handshake failed + Рукапацісканне SSL/TLS не выйшла - - Download files in sequential order - Спампоўваць файлы ў паслядоўнасці + + The remote server refused the connection + Адлеглы сервер адмовіў у злучэнні - - Download first and last pieces first - Спампоўваць з першай і апошняй часткі + + The connection to the proxy server was refused + У злучэнні з проксі-серверам адмоўлена - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - + + The proxy server closed the connection prematurely + Проксі-сервер заўчасна закрыў злучэнне - - Command line parameters take precedence over environment variables - Параметры каманднага радка маюць прыярытэт над пераменнымі ясяроддзя + + The proxy host name was not found + Назва проксі-сервера не знойдзена - - Help - Даведка + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Тэрмін чакання злучэння з проксі-серверам скончыўся, ці ён своечасова не адказаў на запыт - - Run application with -h option to read about command line parameters. - Запусціце праграму з параметрам -h, каб атрымаць даведку па параметрах загаднага радка + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Проксі-сервер патрабуе аўтэнтыфікацыю, але не прыняў пазначаныя ўліковыя звесткі - - Bad command line - Хібны загадны радок + + The access to the remote content was denied (401) + Доступ да адлеглага змесціва забаронены (401) - - Bad command line: - Хібны загадны радок: + + The operation requested on the remote content is not permitted + Дзеянне, якое запытвала адлеглае змесціва, забаронена - - Legal Notice - Афіцыйная перасцярога + + The remote content was not found at the server (404) + Адлеглага змесціва не знойдзена на гэтым серверы (404) - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Адлеглы сервер патрабуе аўтэнтыфікацыі для доступа да змесціва, але прадастаўленныя ўліковыя звесткі не прыняў - - No further notices will be issued. - + + The Network Access API cannot honor the request because the protocol is not known + API сеткавага доступу не можа выканаць запыт праз невядомасць пратаколу - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - qBittorrent - праграма для абмену файламі. Пасля запуску торэнта яго змесціва стане даступным іншым удзельнікам для раздачы. Любым змесцівам вы дзеліцеся пад вашу асабістую адказнасць. - -Ніякіх дадатковых перасцярог паказвацца не будзе. + + The requested operation is invalid for this protocol + Запатрабаванае дзеянне не падтрымліваецца гэтым пратаколам - - Press %1 key to accept and continue... - Націсніце %1 каб пагадзіцца і працягнуць... + + An unknown network-related error was detected + Узнікла невядомая сеткавая памылка - - Legal notice - Афіцыйная перасцярога + + An unknown proxy-related error was detected + Узнікла невядомая памылка проксі-сервера - - Cancel - Скасаваць + + An unknown error related to the remote content was detected + Узнікла невядомая памылка адлеглага змесціва - - I Agree - Я згодны(ая) + + A breakdown in protocol was detected + Паўстала памылка ў пратаколе - - + + Unknown error + Невядомая памылка + + + + Upgrade Абнавіць - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] Вы абнаўляецеся з надта старой версіі, якая захоўвае звесткі па-іншаму. Вы мусіць міграваць на новую сістэму захоўвання. Вы не зможаце ізноў выкарыстоўваць версію, старэйшую за 3.3.0. Працягваць? [y/n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. Вы абнаўляецеся з надта старой версіі, якая захоўвае звесткі па-іншаму. Вы мусіць міграваць на новую сістэму захоўвання. Калі працягнеце, то не зможаце ізноў выкарыстоўваць версію, старэйшую за 3.3.0. - + Couldn't migrate torrent with hash: %1 Нельга міграваць торэнт з хэшам %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 Немагчыма міграваць торэнт. Недапушчальная для хуткага ўзнаўлення назва файла: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 + + Detected unclean program exit. Using fallback file to restore settings. - + An access error occurred while trying to write the configuration file. - Адбылася памылка доступу пры спробе запісаць файл канфігурацыі. - - - - A format error occurred while trying to write the configuration file. - Адбылася памылка фармату пры спробе запісаць файл канфігурацыі. - - - - An unknown error occurred while trying to write the configuration file. - - - - - RSS::AutoDownloader - - - - Invalid data format. - Памылковы фармат дадзеных. - - - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - - - - - Invalid data format - - - - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - - - - - Couldn't load RSS AutoDownloader rules. Reason: %1 - - - - - RSS::Feed - - - Failed to download RSS feed at '%1'. Reason: %2 - - - - - RSS feed at '%1' updated. Added %2 new articles. - - - - - Failed to parse RSS feed at '%1'. Reason: %2 - - - - - Couldn't read RSS Session data from %1. Error: %2 - - - - - Couldn't parse RSS Session data. Error: %1 - - - - - Couldn't load RSS Session data. Invalid data format. - - Couldn't load RSS article '%1#%2'. Invalid data format. + + A format error occurred while trying to write the configuration file. - RSS::Private::Parser - - - Invalid RSS feed. - Памылковы RSS-канал. - - - - %1 (line: %2, column: %3, offset: %4). - %1 (лінія: %2, слупок: %3, зрух: %4). - - - - RSS::Session - - - RSS feed with given URL already exists: %1. - RSS канал з зададзеным URL ужо існуе: %1. - - - - Cannot move root folder. - Немагчыма перамясціць у карэнную папку. - - - - - Item doesn't exist: %1. - Элемент не існуе: %1. - - - - Cannot delete root folder. - Немагчыма выдаліць карэнную папку. - - - - Incorrect RSS Item path: %1. - Няправільны шлях RSS элемента: %1. - - - - RSS item with given path already exists: %1. - RSS элемент з такім шляхам ужо існуе: %1. - - - - Parent folder doesn't exist: %1. - Бацькоўская папка не існуе: %1. - - - - RSSWidget + RSS - + Search Пошук - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - Загрузка RSS зараз адключана! Вы можаце ўключыць гэта ў наладах праграмы. - - - + New subscription - Новая подпіска + Новая падпіска - - - + + + Mark items read - Пазначыць элементы як прачытаныя - - - - Refresh RSS streams - Абнавіць RSS плыні + Пазначыць элементы прачытанымі - + Update all Абнавіць усё - + RSS Downloader... - Спампоўшчык RSS... + Сцягвальнік RSS... + + + + Settings... + Настáўленні... - + Torrents: (double-click to download) - Торэнты: (падвоены націск для спампавання) + Торэнты: (падвойны пстрык каб сцягнуць) - - + + Delete Выдаліць - + Rename... Пераназваць... - + Rename Пераназваць - - + + Update Абнавіць - + New subscription... Новая падпіска... - - + + Update all feeds - Абнавіць усе каналы + Абнавіць усе стужкі - + Download torrent Сцягнуць торэнт - + Open news URL - Адкрыць спасылку навін + Адкрыць URL навін - + Copy feed URL - Капіяваць спасылку канала + Капіяваць URL стужкі - + New folder... - Новая папка... + Новы каталог... - - Please choose a folder name - Выберыце назву папкі + + Refresh RSS streams + Абнавіць RSS-плыні + + + RSSImp - - Folder name: - Імя папцы: + + Stream URL: + Адрас плыні: - - New folder - Новая папка + + Please type a RSS stream URL + Увядзіце URL RSS-плыні + + + + This RSS feed is already in the list. + Гэтая RSS-стужка ўжо ў спісе. + + + + Please choose a folder name + Калі ласка, дайце каталогу назву - - Please type a RSS feed URL - Увядзіце адрас RSS канала + + Folder name: + Назва каталогу: - - Feed URL: - Адрас канала: + + New folder + Новы каталог - + Deletion confirmation Пацверджанне выдалення - + Are you sure you want to delete the selected RSS feeds? - Сапраўды жадаеце выдаліць вылучаныя RSS каналы? + Сапраўды жадаеце выдаліць гэтыя RSS-стужкі? - + Please choose a new name for this RSS feed - Выберыце новую назву для гэтага RSS канала + Дайце новую назву гэтай RSS-стужцы - + New feed name: - Новае імя канала: + Новая назва стужкі: - - Rename failed - Памылка перайменавання + + Name already in use + Гэткая назва ўжо ёсць - + + This name is already used by another item, please choose another one. + Гэтую назву ўжо мае іншы элемент. Калі ласка, пазначце іншую. + + + Date: Дата: - + Author: Аўтар: + + + Unread + Не прачытана + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + Не выйшла аўтаматычна сцягнуць "%1" з RSS-стужкі "%2", бо яна не змяшчае торэнта ці магнет-спасылкі... + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + Аўтаматычна сцягнуць торэнт "%1" з RSS-стужкі "%2"... + + + + Rss::Private::Parser + + + Invalid RSS feed. + Нядзейсны RSS канал. + + + + RssSettingsDlg + + + RSS Reader Settings + Настáўленні чытання RSS + + + + RSS feeds refresh interval: + Інтэрвал абнаўлення RSS-стужак: + + + + min + + + + + Maximum number of articles per feed: + Максімум артыкулаў на стужку: + ScanFoldersDelegate - + Select save location - Выберыце месца захавання + ScanFoldersModel - + Monitored Folder - Папка што наглядаецца + - + Override Save Location - Перавызначыць месца захавання + - + Monitored folder - Папка што наглядаецца + - + Default save location - Месца захавання па змаўчанні + - + Browse... - Агляд... + Агляд... - SearchJobWidget + SearchEngine - - Form + + Unknown search engine plugin file format. - - Results(xxx) + + A more recent version of this plugin is already installed. - - Search in: + + + Plugin is not supported. + Плагін не падтрымліваецца. + + + + Update server is temporarily unavailable. %1 - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + + + Failed to download the plugin file. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + + An incorrect update info received. - - Seeds: - Сіды: + + All categories + Усе катэгорыі - - <html><head/><body><p>Minimal number of seeds</p></body></html> - + + Movies + Кіно - - - to - + + TV shows + Тэлеперадачы - - <html><head/><body><p>Maximal number of seeds</p></body></html> - + + Music + Музыка - - - - + + Games + Гульні - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + + Anime + Анімэ - - Size: - Памер: + + Software + Софт - - <html><head/><body><p>Minimal torrent size</p></body></html> - + + Pictures + Выявы - - <html><head/><body><p>Maximal torrent size</p></body></html> - + + Books + Кнігі + + + + SearchListDelegate + + + + Unknown + Невядома + + + SearchTab - + Name i.e: file name - Назва + Назва - + Size i.e: file size - Памер + Памер - + Seeders i.e: Number of full sources - + Раздаюць - + Leechers i.e: Number of partial sources - + Сцягваюць - + Search engine - - - - - Filter search results... - + Пашукавік - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Torrent names only - + Everywhere - - Use regular expressions - - - - + Searching... - + Search has finished Пошук скончаны - + Search aborted - + An error occurred during search... - + Search returned no results - + Column visibility Адлюстраванне калонак - - - SearchPluginManager - - Unknown search engine plugin file format. + + Form - - A more recent version of this plugin is already installed. + + Results(xxx) - - - Plugin is not supported. + + Search in: - - All categories + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - - Movies + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - - TV shows - + + Seeds: + Сіды: - - Music + + <html><head/><body><p>Minimal number of seeds</p></body></html> - - Games + + + to - - Anime + + <html><head/><body><p>Maximal number of seeds</p></body></html> - - - Software + + + + - - Pictures + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - - Books - + + Size: + Памер: - - Update server is temporarily unavailable. %1 - - - - - - Failed to download the plugin file. %1 - - - - - An incorrect update info received. + + <html><head/><body><p>Minimal torrent size</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> @@ -7717,198 +6890,185 @@ - - - - + + + Search Пошук - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - Адсутнічаюць усталяваныя пошукавыя плагіны -Націсніце "Пошукавыя плагіны..." у ніжняй правай частцы акна для усталявання. - - - + Download Сцягнуць - + Go to description page Перайсці да старонкі з апісаннем - + Copy description page URL Капіяваць адрас старонкі з апісаннем - + Search plugins... Пошукавыя плагіны... - + A phrase to search for. - Фраза для пошуку. + - + Spaces in a search term may be protected by double quotes. - Прабелы ў пошукавым запыце могуць быць абаронены двукоссямі. + - + Example: Search phrase example - Узор: + - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - <b>foo bar</b>: пошук для <b>foo</b> і <b>bar</b> + - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - <b>&quot;foo bar&quot;</b>: пошук для <b>foo bar</b> + - + All plugins Усе плагіны - + Only enabled - Толькі ўключаныя + - + Select... - Выберыце… + - - - + + + Search Engine Пашукавік - + Please install Python to use the Search Engine. Каб скарыстацца пашукавіком, усталюйце Python. - + Empty search pattern Спустошыць шаблон пошуку - + Please type a search pattern first Спачатку ўвядзіце шаблон пошуку - + Stop Стоп - + Search has finished Пошук скончаны - + Search has failed Памылка пошуку - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + E&xit Now - + Exit confirmation - + Пацверджанне выхаду - + The computer is going to shutdown. - + &Shutdown Now - - Shutdown confirmation - - - - + The computer is going to enter suspend mode. - + &Suspend Now - + Suspend confirmation - + The computer is going to enter hibernation mode. - + &Hibernate Now - + Hibernate confirmation - + You can cancel the action within %1 seconds. + + + Shutdown confirmation + Пацверджанне адключэння + SpeedLimitDialog - + KiB/s КіБ/с @@ -7916,52 +7076,52 @@ SpeedPlotView - + Total Upload Усяго раздадзена - + Total Download Усяго сцягнута - + Payload Upload Раздадзена карыснага - + Payload Download Сцягнута карыснага - + Overhead Upload Раздадзена службовага трафіку - + Overhead Download Сцягнута службовага трафіку - + DHT Upload Раздадзена DHT - + DHT Download Сцягнута DHT - + Tracker Upload Раздадзена трэкерам - + Tracker Download Сцягнута трэкерам @@ -7969,95 +7129,87 @@ SpeedWidget - + Period: Перыяд: - + 1 Minute 1 хвіліна - + 5 Minutes 5 хвілін - + 30 Minutes 30 хвілін - + 6 Hours 6 гадзін - + Select Graphs Выбраць графікі - + Total Upload Усяго раздадзена - + Total Download Усяго сцягнута - + Payload Upload Раздадзена карыснага - + Payload Download Сцягнута карыснага - + Overhead Upload Раздадзена службовага трафіку - + Overhead Download Сцягнута службовага трафіку - + DHT Upload Раздадзена DHT - + DHT Download Сцягнута DHT - + Tracker Upload Раздадзена трэкерам - + Tracker Download Сцягнута трэкерам - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8070,49 +7222,49 @@ Статыстыка карыстальніка - - Cache statistics - Статыстыка кэшу + + Total peer connections: + Злучэнняў з пірамі, агульна: - - Read cache hits: - Трапленняў у кэш чытання: + + Global ratio: + Глабальны стасунак: - - Average time in queue: - Сярэдні час прастою ў чарзе: + + Alltime download: + Сцягнута за ўвесь час: - - Connected peers: - + + Alltime upload: + Зацягнута за ўвесь час: - - All-time share ratio: - + + Total waste (this session): + Згублена, агульна (за гэтую сесію): - - All-time download: - + + Cache statistics + Статыстыка кэшу - - Session waste: + + Read cache hits: - - All-time upload: + + Average time in queue: - Total buffer size: - + Total buffers size: + Агульны памер буфераў: @@ -8140,36 +7292,46 @@ Агульны памер чаргі: - + + OK + Добра + + + %1 ms 18 milliseconds - %1 мс + StatusBar - + Connection status: Стан злучэння: - + No direct connections. This may indicate network configuration problems. Няма прамых злучэнняў. Гэта можа сведчыць аб праблемах канфігурацыі сеткі. - + DHT: %1 nodes DHT: %1 вузлоў - - qBittorrent needs to be restarted! - qBittorrent неабходна перазапусціць! + + qBittorrent needs to be restarted + Трэба перазапусціць qBittorrent + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent толькі што абнавіўся і патрабуе перазапуску для таго, каб змены выявіліся. @@ -8188,1667 +7350,1450 @@ У сетцы - + Click to switch to alternative speed limits Пстрыкніце для пераключэння на альтэрнатыўныя абмежаванні хуткасці - + Click to switch to regular speed limits Пстрыкніце для пераключэння на звычайныя абмежаванні хуткасці - + + Manual change of rate limits mode. The scheduler is disabled. + Самастойнае пераключэнне рэжыму абмежаванняў хуткасці. Планавальнік адключаны. + + + Global Download Speed Limit - Агульнае абмежаванне хуткасці спампавання + Агульнае абмежаванне хуткасці сцягвання - + Global Upload Speed Limit Агульнае абмежаванне хуткасці раздачы - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - Усе (0) + Усе (0) - + Downloading (0) - + Сцягваюцца (0) - + Seeding (0) - + Раздаюцца (0) - + Completed (0) - + Скончаныя (0) - + Resumed (0) - + Узноўленыя (0) - + Paused (0) - + Спыненыя (0) - + Active (0) - + Актыўныя (0) - + Inactive (0) - + Неактыўныя (0) - + Errored (0) - + З памылкамі (0) - + All (%1) - Усе (%1) + Усе (%1) - + Downloading (%1) - + Сцягваюцца (%1) - + Seeding (%1) - + Раздаюцца (%1) - + Completed (%1) - + Скончаныя (%1) - + Paused (%1) - + Спыненыя (%1) - + Resumed (%1) - + Узноўленыя (%1) - + Active (%1) - + Актыўныя (%1) - + Inactive (%1) - + Неактыўныя (%1) - + Errored (%1) - + З памылкамі (%1) - TagFilterModel + TorrentContentModel - - Tags - Тэгі + + Name + Назва - - All - Усе + + Size + Памер - - Untagged - Без тэгаў + + Progress + Рух - - - TagFilterWidget - - Add tag... - Дадаць тэг... + + Download Priority + Прыярытэт сцягвання - - Remove tag - Выдаліць тэг + + Remaining + Засталося + + + TorrentCreatorDlg - - Remove unused tags - Выдаліць нявыкарыстаныя тэгі + + Select a folder to add to the torrent + Пазначце каталог для дадання ў торэнт - - Resume torrents - Узнавіць торэнты + + Select a file to add to the torrent + Пазначце файл для дадання ў торэнт - - Pause torrents - Спыніць торэнты + + No input path set + Не пазначаны ўваходны шлях - - Delete torrents - Выдаліць торэнты + + Please type an input path first + Спачатку ўвядзіце ўваходны шлях - - New Tag - Новы тэг + + Select destination torrent file + Запішыце Torrent-файл - - Tag: - Тэг: + + Torrent Files (*.torrent) + Торэнт-файлы (*.torrent) - - Invalid tag name - Няправільная назва тэга + + Torrent was created successfully: %1 + %1 is the path of the torrent + Торэнт паспяхова створаны: %1 - - Tag name '%1' is invalid - Недапушчальная назва тэга «%1» + + + + Torrent creation + Cтварэнне торэнта - - Tag exists - Тэг існуе + + Torrent creation was unsuccessful, reason: %1 + Не выйшла стварыць торэнт з прычыны: %1 - - Tag name already exists. - Назва тэга ўжо існуе. + + Created torrent file is invalid. It won't be added to download list. + Створаны Torrent-файл пашкоджаны. Ён не будзе дададзены да спісу сцягванняў. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Уласцівасці катэгорыі торэнта + + Name + i.e: torrent name + Назва - - Name: - Назва: + + Size + i.e: torrent size + Памер - - Save path: - Шлях захавання: + + Done + % Done + Рух - - Choose save path - Пазначце шлях захавання + + Status + Torrent status (e.g. downloading, seeding, paused) + Стан - - New Category - Новая катэгорыя + + Seeds + i.e. full sources (often untranslated) + Сіды - - Invalid category name - Недапушчальная назва катэгорыі + + Peers + i.e. partial sources (often untranslated) + Піры - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - Назва катэгорыі не можа змяшчаць «\». -Назва катэгорыі не можа пачынацца і скончвацца з «/». -Назва катэгорыі не можа змяшчаць «//». + + Down Speed + i.e: Download speed + Хуткасць сцягв. - - Category creation error - Памылка стварэння катэгорыі + + Up Speed + i.e: Upload speed + Хуткасць разд. - - Category with the given name already exists. -Please choose a different name and try again. - Катэгорыя з такой назвай ужо існуе. -Выберыце іншую назву і паспрабуйце яшчэ. + + Ratio + Share ratio + Стасунак - - - TorrentContentModel - - Name - Назва + + ETA + i.e: Estimated Time of Arrival / Time left + Часу засталося - - Size - Памер + + Category + - - Progress - Рух + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Дададзены - - Download Priority - Прыярытэт спампоўкі + + Completed On + Torrent was completed on 01/01/2010 08:00 + Скончаны - - Remaining - Засталося + + Tracker + Трэкер - - Availability - Даступнасць + + Down Limit + i.e: Download limit + Абмеж. сцягв. - - - TorrentCreatorDialog - - Torrent Creator - + + Up Limit + i.e: Upload limit + Абмеж. разд. - - Select file/folder to share - + + Downloaded + Amount of data downloaded (e.g. in MB) + Сцягнута - - Path: - + + Uploaded + Amount of data uploaded (e.g. in MB) + Раздадзена - - [Drag and drop area] - + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Сцягнута за сеанс - - - Select file - + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Раздадзена за сеанс - - - Select folder - + + Remaining + Amount of data left to download (e.g. in MB) + Засталося - - Settings - + + Time Active + Time (duration) the torrent is active (not paused) + Час актыўнасці - - Piece size: - + + Save path + Torrent save path + Шлях захавання - - Auto - + + Completed + Amount of data completed (e.g. in MB) + Выканана - - 16 KiB - + + Ratio Limit + Upload share ratio limit + Абмежаванне стасунку - - 32 KiB - + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Апошняя поўная прысутнасць - - 64 KiB - + + Last Activity + Time passed since a chunk was downloaded/uploaded + Апошняя актыўнасць - - 128 KiB - + + Total Size + i.e. Size including unwanted data + Поўны памер + + + TrackerFiltersList - - 256 KiB - + + All (0) + this is for the tracker filter + Усе (0) - - 512 KiB - - - - - 1 MiB - - - - - 2 MiB - - - - - 4 MiB - - - - - 8 MiB - - - - - 16 MiB - - - - - 32 MiB - - - - - Calculate number of pieces: - - - - - Private torrent (Won't distribute on DHT network) - - - - - Start seeding immediately - - - - - Ignore share ratio limits for this torrent - - - - - Optimize alignment - - - - - Fields - - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - - - - Web seed URLs: - - - - - Tracker URLs: - - - - - Comments: - - - - - Source: - - - - - Progress: - Рух: - - - - Create Torrent - - - - - - - Torrent creation failed - - - - - Reason: Path to file/folder is not readable. - - - - - Select where to save the new torrent - - - - - Torrent Files (*.torrent) - - - - - Reason: %1 - - - - - Reason: Created torrent is invalid. It won't be added to download list. - - - - - Torrent creator - - - - - Torrent created: - - - - - TorrentInfo - - - File size exceeds max limit %1 - - - - - Torrent file read error: %1 - - - - - Torrent file read error: size mismatch - - - - - TorrentsController - - - Not contacted yet - - - - - Updating... - - - - - Working - - - - - Not working - - - - - Error: '%1' is not a valid torrent file. - - - - - - - - Torrent queueing must be enabled - - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - - Cannot make save path - - - - - Cannot write to directory - - - - - WebUI Set location: moving "%1", from "%2" to "%3" - - - - - Incorrect torrent name - - - - - - Incorrect category name - - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - Усе (0) - - - + Trackerless (0) Без трэкера (0) - + Error (0) З памылкамі (0) - + Warning (0) З папярэджаннямі (0) - - + + Trackerless (%1) Без трэкера (%1) - - + %1 (%2) + openbittorrent.com (10) + %1 (%2) + + + + Error (%1) З памылкамі (%1) - - + + Warning (%1) З папярэджаннямі (%1) - + Resume torrents Узнавіць торэнты - + Pause torrents Спыніць торэнты - + Delete torrents Выдаліць торэнты - - + + All (%1) this is for the tracker filter Усе (%1) - TrackerListWidget - - - - Working - - - - - Disabled - Адключаны - + TrackerList - - This torrent is private - + + URL + Спасылка - - Updating... - + + Status + Стан - - Not working + + Received - - Not contacted yet - + + Seeds + Сіды - - - - - - - N/A - Н/Д + + Peers + Піры - - Tracker editing + + Downloaded - - Tracker URL: - + + Message + Паведамленне - - - Tracker editing failed - + + + Working + Працуе - - The tracker URL entered is invalid. - + + Disabled + Адключаны - - The tracker URL already exists. - + + This torrent is private + Гэта прыватны торэнт - - Add a new tracker... - + + Updating... + Абнаўляецца... - - Remove tracker - + + Not working + Не працуе - - Copy tracker URL - + + Not contacted yet + Пакуль не злучыўся - - Edit selected tracker URL - + + Tracker URL: + URL трэкера: - - Force reannounce to selected trackers - + + Tracker editing + Рэдавагаванне трэкера - - Force reannounce to all trackers - + + + Tracker editing failed + Не выйшла змяніць трэкер - - URL - + + The tracker URL entered is invalid. + З уведзеным URL трэкера нешта не так. - - Status - Стан + + The tracker URL already exists. + Такі URL трэкера ўжо ёсць. - - Received - + + Add a new tracker... + Дадаць новы трэкер... - - Seeds - + + Copy tracker URL + Капіяваць URL трэкера - - Peers - Піры + + Edit selected tracker URL + Змяніць вылучаны URL трэкера - - Downloaded - Сцягнута + + Force reannounce to selected trackers + Пераабвясціць вылучаным трэкерам проста зараз - - Message - + + Force reannounce to all trackers + Пераабвясціць усім трэкерам проста зараз - - Column visibility - Адлюстраванне калонак + + Remove tracker + Выдаліць трэкер - TrackerLoginDialog - - - - Tracker authentication - - - - - Tracker: - - + TrackersAdditionDlg - - Login - Логін - - - - Username: - Імя карыстальніка: - - - - Password: - Пароль: + + Trackers addition dialog + Акенца дадання трэкера - - Log in - + + List of trackers to add (one per line): + Спіс трэкераў для дадання (па аднаму на радок): - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + Адрас сумяшчальнага з µTorrent спісу: - - List of trackers to add (one per line): - + + I/O Error + Памылка ўводу/вываду - - µTorrent compatible list URL: - + + Error while trying to open the downloaded file. + Памылка пры спробе адкрыць сцягнуты файл. - + No change - + Нічога не змянілася - + No additional trackers were found. - + Дадатковых трэкераў не знойдзена. - + Download error - Памылка спампавання + Памылка сцягвання - + The trackers list could not be downloaded, reason: %1 - + Немагчыма сцягнуць спіс трэкераў з прычыны: %1 TransferListDelegate - + Downloading - Спампоўваецца + Сцягваецца - + Downloading metadata used when loading a magnet link - Спампаванне метазвестак + Сцягванне метазвестак - + Allocating qBittorrent is allocating the files on disk Размяшчэнне - + Paused Спынены - + Queued i.e. torrent is queued У чарзе - + Seeding Torrent is complete and in upload-only mode Раздаецца - + Stalled Torrent is waiting for download to begin Чакае - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. - [F] Спампоўваецца + [F] Сцягваецца - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] Раздаецца - + Checking Torrent local data is being checked Правяраецца - + Queued for checking i.e. torrent is queued for hash checking У чарзе на праверку - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Праверка resume-звестак - + Completed Скончаны - - Moving - Torrent local data are being moved/relocated - - - - + Missing Files Няма файлаў - - Errored - torrent status, the torrent has an error - З памылкамі - - - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - %1 (раздаецца цягам %2) - - - - %1 ago - e.g.: 1h 20m ago - %1 таму - - - - TransferListFiltersWidget - - - Status - Стан - - - - Categories - Катэгорыі - - - - Tags - Тэгі - - - - Trackers - Трэкеры - - - - TransferListModel - - - Name - i.e: torrent name - Назва - - - - Size - i.e: torrent size - Памер - - - - Done - % Done - - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Стан - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - Піры - - - - Down Speed - i.e: Download speed - Хуткасць спампавання - - - - Up Speed - i.e: Upload speed - Хуткасць раздачы - - - - Ratio - Share ratio - - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - Катэгорыя - - - - Tags - Тэгі - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Сцягнута - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Раздадзена - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - Засталося - - - - Time Active - Time (duration) the torrent is active (not paused) - - - - - Save path - Torrent save path - + + Errored + torrent status, the torrent has an error + З памылкамі - - Completed - Amount of data completed (e.g. in MB) - Скончаны + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) + %1 (раздаецца цягам %2) - - Ratio Limit - Upload share ratio limit - + + %1 ago + e.g.: 1h 20m ago + %1 таму + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + Стан - - Last Activity - Time passed since a chunk was downloaded/uploaded + + Categories - - Total Size - i.e. Size including unwanted data - + + Trackers + Трэкеры TransferListWidget - + Column visibility Адлюстраванне калонак - + Choose save path Пазначце шлях захавання - + Torrent Download Speed Limiting - Абмежаванне хуткасці спампавання торэнта + Абмежаванне хуткасці сцягвання торэнта - + Torrent Upload Speed Limiting Абмежаванне хуткасці раздачы торэнта - + Recheck confirmation Пацверджанне пераправеркі - + Are you sure you want to recheck the selected torrent(s)? Сапраўды жадаеце пераправерыць вылучаныя торэнты? - + Rename Пераназваць - + New name: Новая назва: - + Resume Resume/start the torrent Узнавіць - + Force Resume Force Resume/start the torrent Узнавіць прымусова - + Pause Pause the torrent Спыніць - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" + + New Category - - Add Tags - Дадаць тэгі - - - - Remove All Tags - Выдаліць усе тэгі - - - - Remove all tags from selected torrents? - Выдаліць усе тэгі для выбранага торэнта? - - - - Comma-separated tags: - Тэгі, падзеленыя коскай: + + Category: + - - Invalid tag - Недапушчальны тэг + + Invalid category name + - - Tag name: '%1' is invalid - Імя тэга: %1' недапушчальна + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + - + Delete Delete the torrent Выдаліць - + Preview file... Перадпрагляд файла... - + Limit share ratio... Абмежаваць стасунак раздачы... - + Limit upload rate... Абмежаваць хуткасць раздачы... - + Limit download rate... - Абмежаваць хуткасць спампавання... + Абмежаваць хуткасць сцягвання... - + Open destination folder Адкрыць каталог прызначэння - + Move up i.e. move up in the queue Угору - + Move down i.e. Move down in the queue Долу - + Move to top i.e. Move to top of the queue У самы верх - + Move to bottom i.e. Move to bottom of the queue У самы ніз - + Set location... Перанесці змесціва... - - Force reannounce - - - - + Copy name Капіяваць назву - - Copy hash - Капіяваць хэш - - - + Download first and last pieces first - Спампоўваць з першай і апошняй часткі + - + Automatic Torrent Management - Аўтаматычнае кіраванне + - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - Аўтаматычны рэжым азначае, што розныя ўласцівасці торэнта(напр. шлях захавання) будуць вырашацца адпаведнай катэгорыяй + - + Category - Катэгорыя + - + New... New category... - Новая... + - + Reset Reset category - Скінуць - - - - Tags - Тэгі - - - - Add... - Add / assign multiple tags... - Дадаць... - - - - Remove All - Remove all tags - Выдаліць усё + - + Priority Прыярытэт - + Force recheck Праверыць прымусова - + Copy magnet link Капіяваць Magnet-спасылку - + Super seeding mode Рэжым супер-раздачы - + Rename... Пераназваць... - + Download in sequential order - Спампоўваць паслядоўна + Сцягваць паслядоўна - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + Абмежаванне стасунку раздача/сцягванне торэнта - - Use global share limit - + + Use global ratio limit + Выкарыстоўваць агульнае абмежаванне стасунку - - - + + + buttonGroup - + група кнопак + + + + Set no ratio limit + Зняць абмежаванне стасунку + + + + Set ratio limit to + Абмежаваць стасунак як + + + WebApplication - - Set no share limit + + Incorrect category name + + + WebUI + + + The Web UI is listening on port %1 + Web-інтэрфейс праслухоўвае порт %1 + + + + Web UI Error - Unable to bind Web UI to port %1 + Памылка Web-інтэрфейсу - не выйшла прывязаць яго да парта %1 + + + + about - - Set share limit to + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - ratio + + Copyright %1 2006-2016 The qBittorrent project - - minutes + + Home Page: - - No share limit method selected + + Forum: - - Please select a limit method first + + Bug Tracker: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - + + Add Peers + Дадаць піраў - - Python not detected - + + List of peers to add (one per line): + Спіс піраў на даданне (па адным на радок): + + + + Format: IPv4:port / [IPv6]:port + Фармат: IPv4:порт / [IPv6]:порт - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - + + + Tracker authentication + Аўтэнтыфікацыя трэкера - - Symlinks inside alternative UI folder are forbidden. - + + Tracker: + Трэкер: - - Exceeded the maximum allowed file size (%1)! - + + Login + Логін - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - + + Username: + Імя карыстальніка: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - + + Password: + Пароль: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - + + Log in + Уваход - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' + + Cancel + Скасаваць + + + + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + Пацверджанне выдалення - qBittorrent + + + + Remember choice + Запомніць выбар + + + + Also delete the files on the hard disk + Таксама выдаліць файлы з дыску + + + + confirmShutdownDlg + + + Don't show again - WebUI + createTorrentDialog + + + Cancel + Скасаваць + + + + Torrent Creation Tool + Cтварэнне Torrent'а + + + + Torrent file creation + Cтварэнне Torrent-файла + + + + Add file + Дадаць файл + + + + Add folder + Дадаць каталог + + + + File or folder to add to the torrent: + Файл ці каталог для дадання ў торэнт: + + + + Tracker URLs: + URL'ы трэкера: + + + + Web seeds urls: + URL'ы Web-раздач: + + + + Comment: + Каментар: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Групы трэкераў можна падзяляць пустым радком. + + + + Piece size: + Памер кавалка: + + + + 16 KiB + 16 КіБ + + + + 32 KiB + 32 КіБ + + + + 64 KiB + 64 КіБ + + + + 128 KiB + 128 КіБ + + + + 256 KiB + 256 КіБ + + + + 512 KiB + 512 КіБ + + + + 1 MiB + 1 МіБ + + + + 2 MiB + 2 МіБ + + + + 4 MiB + 4 МіБ + + + + 8 MiB + 8 МіБ + + + + 16 MiB + 16 МіБ + + + + Auto + Аўта + + + + Private (won't be distributed on DHT network if enabled) + Прыватны (не будзе распаўсюджвацца праз сетку DHT, калі яна ўключана) + + + + Start seeding after creation + Адразу пачаць раздаваць + + + + Ignore share ratio limits for this torrent + Ігнараваць абмежаванне стасунку гэтага торэнта + + + + Create and save... + Стварыць і захаваць... + + + + Progress: + Рух: + + + + downloadFromURL + + + Add torrent links + Дадайце спасылкі на торэнт + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Адзін на радок (падтрымліваюцца HTTP-спысылкі, Magnet-спасылкі і хэшы) + + + + Download + Сцягнуць + + + + Cancel + Скасаваць + - - Web UI: HTTPS setup successful - Вэб-інтэрфейс: наладка HTTPS паспяхова + + Download from urls + Сцягванне па URL'ах - - Web UI: HTTPS setup failed, fallback to HTTP - Вэб-інтэрфейс: памылка наладкі HTTPS, пераход да HTTP + + No URL entered + Не стае URL - - Web UI: Now listening on IP: %1, port: %2 - Вэб-інтэрфейс: цяпер праслухоўвае IP:%1, порт:%2 + + Please type at least one URL. + Увядзіце прынамсі адзін URL. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Вэб-інтэрфейс: немагчыма прывязаць IP: %1, порт: %2. Прычына: %3 + + Crash info + Інфармацыя пра крах fsutils - + + + + + Downloads - Спампоўкі + Сцягванні misc - + B bytes Б - + KiB kibibytes (1024 bytes) КіБ - + MiB mebibytes (1024 kibibytes) МіБ - + GiB gibibytes (1024 mibibytes) ГіБ - + TiB tebibytes (1024 gibibytes) ТіБ - + PiB pebibytes (1024 tebibytes) - ПіБ + - + EiB exbibytes (1024 pebibytes) - ЭіБ + - + + Python not detected + Python не знойдзены + + + + Python version: %1 + Версія Python: %1 + + + /s per second - + %1h %2m e.g: 3hours 5minutes %1г %2хв - + %1d %2h e.g: 2days 10hours %1дз %2г - + Unknown Unknown (size) Невядомы - + qBittorrent will shutdown the computer now because all downloads are complete. - Зараз qBittorrent адключыць камп'ютар, бо ўсе спампоўкі скончаны. + Зараз qBittorrent адключыць камп'ютар, бо ўсе сцягванні скончаны. - + < 1m < 1 minute < 1хв - + %1m e.g: 10minutes %1хв + + + Working + Працуе + + + + Updating... + Абнаўляецца... + + + + Not working + Не працуе + + + + Not contacted yet + Яшчэ не злучыўся + preview - + Preview selection Выбар перадпрагляду - + The following files support previewing, please select one of them: Наступныя файлы падтрымліваюць перадпрагляд, пазначце адзін з іх: + + + Preview + Перадпрагляд + + + + Cancel + Скасаваць + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_bg.ts qbittorrent-3.3.15/src/lang/qbittorrent_bg.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_bg.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_bg.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - + Относно qBittorrent - + About - + Относно - + Author - - - - - Current maintainer - + Автор - - Greece - Гърция + + + Nationality: + Националност: - - - Nationality: - + + + Name: + Име: - - + + E-mail: - + E-mail: - - - Name: - Име: + + Greece + Гърция - - Original author - + + Current maintainer + Настоящ разработчик - - France - Франция + + Original author + Оригинален автор - + Special Thanks - + Специални Благодарности - + Translators Преводачи - - License - Лиценз - - - + Libraries - + Библиотеки - + qBittorrent was built with the following libraries: - - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - + qBittorrent е направен със следните библиотеки: - - Home Page: - Домашна страница: - - - - Forum: - Форум: + + France + Франция - - Bug Tracker: - + + License + Лиценз @@ -115,57 +90,67 @@ Съхрани на - + + Browse... + Преглед... + + + + Set as default save path + Определи като път за съхраняване по подразбиране + + + Never show again Не показвай никога повече - + Torrent settings Настройки на торента - + Set as default category Задаване като категория по подразбиране - + Category: Категория: - + Start torrent Стартирай торента - + Torrent information Торент информация - + Skip hash check Прескочи проверката на парчетата - + Size: Размер: - + Hash: Отпечатък: - + Comment: Коментар: - + Date: Дата: @@ -190,117 +175,89 @@ Автоматично - - Remember last used save path - - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog Когато е отметнато, .torrent файлът не ще бъде изтрит независимо от настройките, който са на страницата "Сваляне" в диалога на настройките - + Do not delete .torrent file Без изтриване на .torrent файла - - Create subfolder - Създаване на поддиректория - - - - Download in sequential order - Сваляне по азбучен ред - - - - Download first and last pieces first - Сваляне първо на първото и последното парче - - - + Normal Нормален - + High Висок - + Maximum Максимален - + Do not download Не сваляй - - - + + + I/O Error Грешка на Вход/Изход - + Invalid torrent Невалиден торент - - Renaming - Преименуване - - - - - Rename error - Грешка при преименуване + + + + + Already in download list + Вече е в списъка за сваляне - - The name is empty or contains forbidden characters, please choose a different one. - Името е празно или съдържа непозволени символи, моля изберете различно име. - - - + Not Available This comment is unavailable Не е налично - + Not Available This date is unavailable Не е налично - + Not available Не е наличен - + Invalid magnet link Невалидна магнитна връзка - + The torrent file '%1' does not exist. Торент файла '%1' не съществува. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. Торент файлът '%1' не може да бъде прочетен от диска. Вероятно няматe достатъчно права. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ Грешка: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Торента е вече в списъка за сваляне. Тракерите не бяха обединени, защото той е поверителен торент. + + + + Torrent is already in download list. Trackers were merged. + Торентът е вече в списъка за сваляне. Тракерите бяха обединени. + + + + + Cannot add torrent + Не може да се добави торент + + + + Cannot add this torrent. Perhaps it is already in adding state. + Не може да се добави този торент. Може би вече е в стадий на добавяне. + + + This magnet link was not recognized Тази магнитна връзка не се разпознава - + + Magnet link is already in download list. Trackers were merged. + Магнитният линк вече е в списъка за сваляне. Тракерите бяха обединени. + + + + Cannot add this torrent. Perhaps it is already in adding. + Не може да се добави този торент. Може би вече е в стадий на добавяне. + + + Magnet link Магнитна връзка - + Retrieving metadata... Извличане на метаданни... - + Not Available This size is unavailable. Не е наличен - + Free space on disk: %1 Свободно дисково пространство: %1 - + + Choose save path Избери път за съхранение - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - + + Rename the file + Преименувай файла - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + + New name: + Ново име: - - Magnet link is already queued for processing. - + + + The file could not be renamed + Файлът не може да се преименува - - New name: - Ново име: + + This file name contains forbidden characters, please choose a different one. + Името на файла съдържа забранени символи, моля изберете различно име. - - + + This name is already in use in this folder. Please use a different name. Това име вече съществува в тази папка. Моля, ползвайте различно име. - + The folder could not be renamed Папката не може да се преименува - + Rename... Преименувай... - + Priority Предимство - + Invalid metadata Не валидни метаданни - + Parsing metadata... Проверка на метаданните... - + Metadata retrieval complete Извличането на метаданни завърши - + Download Error Грешка при сваляне @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Размер на записан дисков кеш + + + MiB МБ - + Outgoing ports (Min) [0: Disabled] Изходен порт (Мин) [0: Изключен] - + Outgoing ports (Max) [0: Disabled] Изходен порт (Макс) [0: Изключен] - + Recheck torrents on completion Провери торентите при завършване - + Transfer list refresh interval Интервал на обновяване на списъка за трансфер - + ms milliseconds мс - + Setting Настройка - + Value Value set for this setting Стойност - - - (disabled) - (изключено) - - - + (auto) (автоматично) - - min - minutes - мин - - - + All addresses Всички адреси - + qBittorrent Section qBittorrent Раздел - - + + Open documentation Отваряне на докумнтация - + libtorrent Section libtorrent Раздел - - Asynchronous I/O threads - - - - - Disk cache - Дисков кеш - - - + s seconds с - + Disk cache expiry interval Продължителност на дисковия кеш - + Enable OS cache Включи кеширане от ОС - - Guided read cache - Напътстван кеш на четенето - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - Изпращане на съвети за частите на качване - - - - - KiB -  KiB - - - - Send buffer watermark - Изпращане на буферен воден знак - - - - Send buffer low watermark - Изпращане на нисък буферен воден знак - - - - Send buffer watermark factor - Изпращане на фактор на буферния воден знак - - - - Prefer TCP - - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address - Позволяване на множество връзки от един и същи IP адрес + + m + minutes + м - + Resolve peer countries (GeoIP) Намиране на държавата на участниците (GeoIP) - + Resolve peer host names Намиране името на хоста на участниците - + Strict super seeding Стриктен режим на супер-даване - + Network Interface (requires restart) Интерфейс на Мрежата (изисква рестарт) - + Optional IP Address to bind to (requires restart) Опционален IP Адрес за свързване (изисква рестартиране) - + Listen on IPv6 address (requires restart) Четене на IPv6 адреса (изисква рестартиране) - + Display notifications Екранни уведомления - + Display notifications for added torrents Екранни уведомления за добавени торенти. - + Download tracker's favicon Сваляне на логото на тракера - - Save path history length - Брой запазени последно използвани местоположения. - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - Поведение на слотовете за качване - - - - Round-robin - - - - - Fastest upload - - - - - Anti-leech - - - - - Upload choking algorithm - Задушаващ алгоритъм за качване - - - + Confirm torrent recheck Потвърждаване на проверка на торент - - Confirm removal of all tags - Потвърдете изтриването на всички тагове - - - - Always announce to all trackers in a tier - Винаги анонсирай до всички тракери в реда + Exchange trackers with other peers + Обмен на тракери с други участници - - Always announce to all tiers - Винаги анонсирай до всички тракер-редове + + Always announce to all trackers + Винаги предлагай на всички тракери - + Any interface i.e. Any network interface Произволен интерфейс - + Save resume data interval How often the fastresume file is saved. Интервал на запис на данните за продължаване. - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - %1-TCP алгоритъм смесен режим - - - + Maximum number of half-open connections [0: Unlimited] Максимален брой полуотворени връзки [0: Без ограничение] - + IP Address to report to trackers (requires restart) IP адрес за информиране на тракери (изисква рестарт) - + Enable embedded tracker Включи вградения тракер - + Embedded tracker port Вграден порт на тракер - + Check for software updates Провери за обновяване на програмата - + Use system icon theme Ползвай темата на системната икона @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 стартиран - + Torrent: %1, running external program, command: %2 Торент: %1, изпълнение на въшна програмата, команда: %2 - - Torrent name: %1 - Име но торент: %1 - - - - Torrent size: %1 - Размер на торент: %1 - - - - Save path: %1 - Местоположение за запис: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Торента бе свален в %1. - - - - Thank you for using qBittorrent. - Благодарим Ви за ползването на qBittorrent. - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' завърши свалянето + + Torrent: %1, run external program command too long (length > %2), execution failed. + Торент: %1, изпълнение на външна програма команда е прекалено дълго (продължителност > %2), изпълнението е неуспешно. - + Torrent: %1, sending mail notification Торент: %1, изпращане на уведомление по имейл. - + Information Информация - - To control qBittorrent, access the Web UI at %1 - + + To control qBittorrent, access the Web UI at http://localhost:%1 + За контролиране на qBittorrent, посетете Web UI на адрес http://localhost:%1 - + The Web UI administrator user name is: %1 Администраторското потребителско име на Web UI е: %1 - + The Web UI administrator password is still the default one: %1 Администраторската парола на Web UI е все още тази по подразбиране: %1 - + This is a security risk, please consider changing your password from program preferences. Това е риск в сигурността, моля обмислете смяната на вашата парола в програмните настройки. - + Saving torrent progress... Прогрес на записване на торент... - - - Portable mode and explicit profile directory options are mutually exclusive - Настройките съвместим режим и изрична профилна директория са взаимно изключващи се - - - - Portable mode implies relative fastresume - Съвместим режим предполага сравнително бързопродължаване - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Съхрани в: @@ -861,879 +658,846 @@ RSS Сваляч... - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - Автоматичното сваляне на RSS торенти е сега изключено! Може да го включите в програмните настройки. + + Enable Automated RSS Downloader + Включи автоматичния RSS Сваляч - + Download Rules Правила за Сваляне - + Rule Definition Дефиниция на Правилото - + Use Regular Expressions Използване на Регулярни Изрази - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - - - - + Must Contain: Трябва Да Съдържа: - + Must Not Contain: Трябва Да Не Съдържа: - + Episode Filter: Филтър за Епизод: - + Assign Category: Прикачване Категория: - + Save to a Different Directory Съхрани в Друга Директория - + Ignore Subsequent Matches for (0 to Disable) ... X days Игнориране на Последващи Съвпадения за (0 за деактивиране) - + Disabled - Изключено + Изключено - + days дни - + Add Paused: Добави поставените на пауза: - + Use global settings Използвай общите настройки - + Always Винаги - + Never Никога - + Apply Rule to Feeds: Прилагане на Правила към Каналите: - + Matching RSS Articles Съответстващи RSS Статии - + &Import... &Импортиране... - + &Export... &Експортиране... - + Matches articles based on episode filter. Намерени статии, базирани на епизодичен филтър. - + Example: Пример: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match ще търси резултати 2, 5, 8 през 15, 30 и повече епизода на първи сезон - + Episode filter rules: Правила на епизодния филтър: - + Season number is a mandatory non-zero value Номерът на сезона трябва да бъде със стойност, различна от нула - + Episode number is a mandatory non-zero value + Номерът на епизода е задължително да няма стойност нула + + + Filter must end with semicolon Филтърът трябва да завършва с точка и запетая - + Three range types for episodes are supported: Три типа диапазони за епизоди се поддържат: - + Single number: <b>1x25;</b> matches episode 25 of season one Едно число: <b>1x25;</b> съответства на епизод 25 на първи сезон - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Нормален диапазон: <b>1x25-40;</b> съответства на епизоди 25 до 40 на първи сезон - - Episode number is a mandatory positive value - Номерът на е епизода е задължително да е с позитивна стойност - - - - Rules - Правила + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Безкраен диапазон: <b>1x25-;</b> съответства епизодите от 25 до края на първи сезон - - Rules (legacy) - Правила (остар.) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Безкраен диапазон: <b>1x25-;</b> съответства на епизодите от 25 до края на първи сезон и всички епизоди следващите сезони + - + Last Match: %1 days ago Последно Съвпадение: преди %1 дни - + Last Match: Unknown Последно Съвпадение: Неизвестно - + New rule name Име на ново правила - + Please type the name of the new download rule. Моля, въведете името на новото правило за сваляне. - - + + Rule name conflict Конфликт в имената на правилата - - + + A rule with this name already exists, please choose another name. Правило с това име вече съществува, моля изберете друго име. - + Are you sure you want to remove the download rule named '%1'? Сигурни ли сте че искате да изтриете правилото с име '%1'? - + Are you sure you want to remove the selected download rules? Сигурни ли сте че искате да изтриете избраните правила? - + Rule deletion confirmation Потвърждение за изтриване на правилото - + Destination directory Директория цел - + Invalid action Невалидно действие - + The list is empty, there is nothing to export. - Списъкът е празен, няма какво да се експортира. + Списъка е празен, няма какво да се експортира. - - Export RSS rules - Изнеси RSS правила + + Where would you like to save the list? + Къде искате да се съхрани списъка? - - + + Rules list (*.rssrules) + Листа с правила (*.rssrules) + + + I/O Error В/И Грешка - - Failed to create the destination file. Reason: %1 - Неуспешно създаване на файл. Причина: %1 + + Failed to create the destination file + Неуспешно създавене на файла-получател - - Import RSS rules - Внасяне на RSS правила + + Please point to the RSS download rules file + Моля посочете файла с правила за сваляне на RSS - - Failed to open the file. Reason: %1 - Неуспешно зареждане на файл. Причина: %1 + + Rules list + Списък с правила - + Import Error - Грешка при внасяне + Грешка при внос - - Failed to import the selected rules file. Reason: %1 - Неуспешно внасяне на избрания файл с правила. Причина: %1 + + Failed to import the selected rules file + Неуспешно внасяне на избрания файл с правила - + Add new rule... Добави ново правило... - + Delete rule Изтрий правилото - + Rename rule... Преименувай правилото... - + Delete selected rules Изтрий избраните правила - - Clear downloaded episodes... - - - - + Rule renaming Преименуване на правилото - + Please type the new rule name Моля напишете името на новото правило - - Clear downloaded episodes - + + Regex mode: use Perl-like regular expressions + Режим регулярни изрази: ползвайте подобни на Perl регулярни изрази - - Are you sure you want to clear the list of downloaded episodes for the selected rule? + + Wildcard mode: you can use - - Regex mode: use Perl-compatible regular expressions - Режим регулярни изрази: използвайте Perl-съвместими регулярни изрази + + ? to match any single character + - - - Position %1: %2 - Позиция %1: %2 + + * to match zero or more of any characters + - - Wildcard mode: you can use - Режим на заместващи символи: можете да изпозвате + + Whitespaces count as AND operators (all words, any order) + - - ? to match any single character - ? за съвпадане на един, какъвто и да е символ - - - - * to match zero or more of any characters - * за съвпадане на нула или повече каквито и да са символи - - - - Whitespaces count as AND operators (all words, any order) - Приеми празно пространствените символи като И оператори (всички думи, в независимо какъв ред) - - - + | is used as OR operator - | се използва за ИЛИ оператор + - + If word order is important use * instead of whitespace. - Ако поредността на думите е важна, използвайте * вместо пауза. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Израз с празна %1 клауза (пр.: %2) - - - - will match all articles. - ще съответства на всички артикули. - - - - will exclude all articles. - ще изключи всички артикули. - - - - BanListOptionsDialog - - - List of banned IP addresses - - Ban IP - - - - - Delete + + will match all articles. - - - Warning + + will exclude all articles. - - The entered IP address is invalid. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Режим Жокер: можете да ползвате<ul><li>? за заместване на всеки единичен знак</li><li>* за заместване от нула до много различни знаци</li><li>Паузите се броят като оператор AND</li></ul> - - The entered IP is already banned. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Режим Жокер: можете да ползвате<ul><li>? за заместване на всеки отделен знак</li><li>* за заместване на нула или много знаци</li><li>| се ползва като OR оператор</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support Рестартиране е наложително при включване/изключване на PeX поддръжката. - - Could not get GUID of configured network interface. Binding to IP %1 - Не може получи GUID на конфигуриран мрежов интерфейс. Обвързване с IP %1 - - - + Embedded Tracker [ON] Вграден Тракер [ВКЛ] - + Failed to start the embedded tracker! Неуспешен старт на вградения тракер! - + Embedded Tracker [OFF] Вграден Тракер [ИЗКЛ] - + + '%1' reached the maximum ratio you set. Removing... + '%1' достигна зададеното от вас максимално съотношение. Изтриване... + + + + '%1' reached the maximum ratio you set. Pausing... + '%1' достигна максималната зададена от вас скорост. Поставяне в пауза... + + + System network status changed to %1 e.g: System network status changed to ONLINE Състоянието на мрежата на системата се промени на %1 - + ONLINE ОНЛАЙН - + OFFLINE ОФЛАЙН - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding Мрежовата конфигурация на %1 е била променена, опресняване на сесийното обвързване - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. Конфигурирания адрес на мрежовия интерфейс %1 е навалиден. - - + Encryption support [%1] Поддръжка кодиране [%1] - - + FORCED Принудително - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 не е валиден IP адрес и беше отхвърлен, поради прилагането на листа с блокирани адреси. - - - - + Anonymous mode [%1] Анонимен режим [%1] - + Unable to decode '%1' torrent file. Не възможност да се декодира '%1' торент файла. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Рекурсивно сваляне на файл '%1' вграден в торент '%2' - + Queue positions were corrected in %1 resume files - Позициите на опашката бяха оправени в %1 възобновяващи файлове + - + Couldn't save '%1.torrent' Не може да се запише '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' бе премахнат от списъка за прехвърляне. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' бе премахнат от списъка за прехвърляне и от твърдия диск. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '%1' бе премахнат от списъка за прехвърляне, но файловете не могат да се изтрият. Грешка: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. защото %1 е деактивиран. - + because %1 is disabled. this peer was blocked because TCP is disabled. защото %1 е деактивиран. - + URL seed lookup failed for URL: '%1', message: %2 Търсенето на URL споделяне бе неуспешно: '%1', съобщение: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent не успя да слуша на интерфейс %1 порт: %2/%3. Причина: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' бе премахнат от списъка за прехвърляне и от твърдия диск. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' бе премахнат от списъка за прехвърляне. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Сваляне на '%1', моля изчакайте... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent се опитва да слуша на всеки интерфейсен порт: %1 - + The network interface defined is invalid: %1 Дефинираният мрежови интерфейс е невалиден: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent се опитва да слуша на интерфейс %1 порт %2 - - Peer ID: - - - - - HTTP User-Agent is '%1' - - - - - + DHT support [%1] DHT поддръжка [%1] - - - - - - - - - + + + + ON Включено - - - - - - - - - + + + + OFF Изключено - - + Local Peer Discovery support [%1] Поддръжка на Откриване на Локални пиъри [%1] - - PeX support [%1] - - - - - '%1' reached the maximum ratio you set. Removed. - '%1' достигна зададеното от вас максимално съотношение. Изтрит. - - - - '%1' reached the maximum ratio you set. Paused. - '%1' достигна зададеното от вас максимално съотношение. Поставен в пауза. - - - - '%1' reached the maximum seeding time you set. Removed. - '%1' достигна максималното зададено от вас време на споделяне. Изтрит. - - - - '%1' reached the maximum seeding time you set. Paused. - '%1' достигна максималното зададено от вас време на споделяне. Поставен в пауза. + Restart is required to toggle Tracker Exchange support + Рестартиране е наложително при включване/изключване на поддръжката на Обмен на Тракери. - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent не намери %1 локален адрес, на който да слуша - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent не успя да слуша на всеки интерфейсен порт: %1. Причина: %2. - + Tracker '%1' was added to torrent '%2' Тракер '%1' бе добавен към торент '%2' - + Tracker '%1' was deleted from torrent '%2' Тракер '%1' бе изтрит от торент '%2' - + URL seed '%1' was added to torrent '%2' URL споделяне '%1' бе добавено към торент '%2' - + URL seed '%1' was removed from torrent '%2' URL споделяне '%1' бе изтрито от торент '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Невъзможност за продължаване на торент '%1'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Успешно обработване на дадения IP филтър: %1 правила бяха приложени. - + Error: Failed to parse the provided IP filter. Грешка: Неуспешно обработване на дадения IP филтър. - - '%1' restored. - 'torrent name' restored. - - - - + Couldn't add torrent. Reason: %1 Не може да се добави торента. Причина: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' продължен. (бързо продължаване) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' добавен в списъка за сваляне. - + An I/O error occurred, '%1' paused. %2 В/И грешка възникна, '%1' е в пауза. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Неуспешно пренасочване на портовете, съобщение: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Пренасочването на портовете е успешно, съобщение: %1 - + due to IP filter. this peer was blocked due to ip filter. поради IP филтър. - + due to port filter. this peer was blocked due to port filter. поради портов филтър. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. поради ограничения на i2p смесен режим. - + because it has a low port. this peer was blocked because it has a low port. защото има порт с ниска стойност. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent успешно слуша на интерфейс %1 порт: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 Външно IP: %1 - BitTorrent::TorrentCreatorThread + BitTorrent::TorrentHandle + + + Could not move torrent: '%1'. Reason: %2 + Не може да се премести торент: '%1'. Причина: %2 + - - create new torrent file failed - създаването на нов торент файл неуспешно + + File sizes mismatch for torrent '%1', pausing it. + Размера на файла не съвпада за торент '%1', поставя се в пауза. + + + + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... + Данните за бързо продължаване бяха отхвърлени за торент '%1'. Причина: %2. Проверка отново... - BitTorrent::TorrentHandle + CategoryFilterModel - - Download first and last piece first: %1, torrent: '%2' - + + Categories + Категории - - On - + + All + Всички - - Off + + Uncategorized + + + CategoryFilterWidget + + + Add category... + Добавяне категория... + - - Successfully moved torrent: %1. New path: %2 + + Add subcategory... - - Could not move torrent: '%1'. Reason: %2 + + Remove category + Премахване категория + + + + Remove unused categories + Изтриване на неизползваните категории + + + + Resume torrents - - File sizes mismatch for torrent '%1', pausing it. + + Pause torrents + Пауза на торентите + + + + Delete torrents - - Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... + + New Category + Нова категория + + + + Category: + Категория: + + + + Invalid category name + Невалидно име на категория + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. - - - CategoryFilterModel - - Categories - Категории + + + Category exists + - - All - Всички + + Category name already exists. + - - Uncategorized - Некатегоризирани + + Subcategory name already exists in selected category. + - CategoryFilterWidget + CategoryFiltersList - - Add category... - Добавяне категория... + All (0) + this is for the category filter + Всички (0) - - Add subcategory... - Добавяне подкатегория... + Uncategorized (0) + Некатегоризирани (0) - - Edit category... - Редактиране на категория... + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Некатегоризирани (%1) + + + Add category... + Добавяне категория... - Remove category - Премахване категория + Премахване категория - Remove unused categories - Изтриване на неизползваните категории + Изтриване на неизползваните категории - Resume torrents - Продължаване на торентите + Продължаване на торентите - Pause torrents - Пауза на торентите + Пауза на торентите - Delete torrents - Изтриване на торентите + Изтриване на торентите + + + New Category + Нова категория + + + Category: + Категория: + + + Invalid category name + Невалидно име на категория + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Името на категория не трябва да съдържа '\'. +Името на категория не трябва да започва/завършва с '/'. +Името на категория не трябва съдържа '//' последователност. + + + All (%1) + this is for the category filter + Всички (%1) @@ -1773,220 +1537,101 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Потвърждение за изтриване - - - - Remember choice - - - - - Also delete the files on the hard disk - - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Сигурни ли сте, че искате да изтриете '%1' от списъка за трансфер? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - - - - - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - Сваляне - - - - No URL entered - - - - - Please type at least one URL. - + Сигурни ли сте, че искате да изтриете тези %1 торенти от списъка за трансфер? DownloadedPiecesBar - + White: Missing pieces Бяло: Липсващи части - + Green: Partial pieces Зелено: Непълни части - + Blue: Completed pieces Синьо: Приключени части - ExecutionLogWidget + ExecutionLog - + General - Общи + Общи - + Blocked IPs - + Блокирани IP - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> бе блокиран %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - + <font color='red'>%1</font> беше отхвърлен FeedListWidget - + RSS feeds RSS канали - - - Unread (%1) - Непрочетени (%1) + + Unread + Непрочетен FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - - - - - &Browse... - Launch file dialog button text (full) - - - - - Choose a file - Caption for file open/save dialog - - - - - Choose a folder - Caption for directory open dialog - - - - - Any file - + + An error occured while trying to open the log file. Logging to file is disabled. + Грешка възникна при опита за отваряне на лог файла. Логването към файл е деактивирано. FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - В/И Грешка: Не може да се отвори файл на IP филтър в режим за четене. - - - - - - IP filter line %1 is malformed. - Ред %1 на IP филтъра е неправилен. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - Ред %1 на IP филтъра е неправилен. Началото на IP диапазон е неправилно. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - Ред %1 на IP филтъра е неправилен. Края на IP диапазон е неправилен. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - Ред %1 на IP филтъра е неправилен. Едното IP е IPv4 и другото е IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - Възражение за ред %1 на IP филтъра е направено. Възражението е: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - %1 допълнителни грешки в анализирането на IP филтъра. + + + + I/O Error: Could not open ip filter file in read mode. + В/И Грешка: Не може да се отвори файл на ip филтър в режим за четене. - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. Грешка при обработване: Файлът на филтъра не е валиден PeerGuardian P2B файл. @@ -1994,396 +1639,472 @@ GeoIPDatabase - - + + Unsupported database file size. Неподдържан размер за файл на базата данни. - + Metadata error: '%1' entry not found. Грешка в метаинформацията: '%1' елемент не е намерен. - + Metadata error: '%1' entry has invalid type. Грешка в метаинформацията: '%1' елемент има невалиден тип. - + Unsupported database version: %1.%2 Неподдържана версия на базата данни: %1.%2 - + Unsupported IP version: %1 Неподдържана IP версия: %1 - + Unsupported record size: %1 Неподдържан размер на запис: %1 - + Invalid database type: %1 Невалиден тип на базата данни: %1 - + Database corrupted: no data section found. Базата данни е развалена: няма намерена информационна секция. - Http::Connection - - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - - + HttpServer - - Bad Http request, closing socket. IP: %s - + + File + Файл - - - HttpServer - Exit qBittorrent - Изход от qBittorrent + Edit + Редактирай - - Only one link per line + + Help + Помощ + + + + Exit qBittorrent + Изход от qBittorrent + + + + Only one link per line Само един линк на реда - + + Download + Свали + + + Global upload rate limit must be greater than 0 or disabled. Глобалното ограничение за скорост на качване трябва да е по-голямо от 0 или изключено. - + Global download rate limit must be greater than 0 or disabled. Глобалното ограничение за скорост на сваляне трябва да е по-голямо от 0 или изключено. - + Alternative upload rate limit must be greater than 0 or disabled. Алтернативното ограничение за скорост на качване трябва да е по-голямо от 0 или изключено. - + Alternative download rate limit must be greater than 0 or disabled. Алтернативното ограничение за скорост на сваляне трябва да е по-голямо от 0 или изключено. - + Maximum active downloads must be greater than -1. Максимумът за активни сваляния трябва да бъде по-голям от -1. - + Maximum active uploads must be greater than -1. Максимумът за активни качвания трябва да бъде по-голям от -1. - + Maximum active torrents must be greater than -1. Максимумът за активни торенти трябва да бъде по-голям от -1. - + Maximum number of connections limit must be greater than 0 or disabled. Ограничението за максимален брой връзки трябва да е по-голямо от 0 или изключено. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Ограничението за максимален брой връзки на торент трябва да е по-голямо от 0 или изключено. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Ограничението за максимален брой слотове на торент трябва да е по-голямо от 0 или изключено. - + Unable to save program preferences, qBittorrent is probably unreachable. Не мога да съхраня предпочитанията за програмата, qBittorrent е вероятно недостъпен. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent на Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - Невалидно име на категория: -Моля не използвайте никакви специални символи в името на категорията. - - - - Unknown - Неизвестен - - - - Hard Disk - Твърд диск - - - - Share ratio limit must be between 0 and 9998. - Ограничението на съотношението на споделяне трябва да бъде между 0 и 9998. - - - - Seeding time limit must be between 0 and 525600 minutes. - Ограничението за време на споделяне трябва да бъде между 0 и 525600 минути. + + Language + Език - + The port used for incoming connections must be between 1 and 65535. Портът, който се използва за входящи връзки трябва да бъде между 1 и 65535. - + The port used for the Web UI must be between 1 and 65535. Портът, който се използва за Web UI трябва да бъде между 1 и 65535. - + Unable to log in, qBittorrent is probably unreachable. Невъзможност за логване, qBittorrent вероятно е недостъпен. - + Invalid Username or Password. Невалидно потребителско име или парола. - - Username - Потребителско име - - - + Password Парола - + Login Вход - + + Upload Failed! + Качването е неуспешно! + + + Original authors Оригинален автори - + + Upload limit: + Ограничение на качване: + + + + Download limit: + Ограничение на сваляне: + + + Apply Прилагане - + Add Добавяне - + + Category: + Категория: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Качване на Торенти - + + All + Всички + + + + Downloading + Свалящи се + + + + Seeding + Споделящи се + + + + Completed + Завършени + + + + Resumed + Продължени + + + + Paused + В Пауза + + + + Active + Активни + + + + Inactive + Неактивни + + + Save files to location: Съхрани файловете на място: - + Cookie: Бисквитка: - + Type folder here Напишете директория тук - + + Run an external program on torrent completion + Изпълняване на външна програма при завършване на торент + + + + Enable bandwidth management (uTP) + Активиране на управление на трафика (uTP) + + + + Apply rate limit to uTP connections + Прилагане на пределна скорост за uTP връзки + + + + Alternative Global Rate Limits + Алтернативни Глобални Пределни Скорости + + + More information Повече информация - + Information about certificates Информация за сертификатите - + Save Files to Запис на Файлове в - - Set location - Задаване на местоположение - - - - Limit upload rate - Ограничение на процента качване + + Watch Folder + Наблюдение на Директория - - Limit download rate - Ограничение на процента на сваляне + + Default Folder + Директория по Подразбиране - - Rename torrent - Преименуване на торент + + from + from time1 to time2 + от - - Unable to create category - + + to + from time1 to time2 + към - + Other... Save Files to: Watch Folder / Default Folder / Other... Други... - + + Every day + Schedule the use of alternative rate limits on ... + Всеки ден + + + + Week days + Schedule the use of alternative rate limits on ... + Работни дни + + + + Week ends + Schedule the use of alternative rate limits on ... + Почивни дни + + + Monday Schedule the use of alternative rate limits on ... Понеделник - + Tuesday Schedule the use of alternative rate limits on ... Вторник - + Wednesday Schedule the use of alternative rate limits on ... Сряда - + Thursday Schedule the use of alternative rate limits on ... Четвъртък - + Friday Schedule the use of alternative rate limits on ... Петък - + Saturday Schedule the use of alternative rate limits on ... Събота - + Sunday Schedule the use of alternative rate limits on ... Неделя - + + Downloaded + Is the file downloaded or not? + Свалени + + + Logout Излизане - + + Download from URLs + Сваляне от URL-ове + + + Download Torrents from their URLs or Magnet links Сваляне на Торенти от техните URL-ове или Magnet линкове - + Upload local torrent Качване на локален торент - + Are you sure you want to delete the selected torrents from the transfer list? Сигурни ли сте, че искате да изтриете избраните торенти от списъка за трансфер? - + Save Съхрани - + qBittorrent client is not reachable qBittorrent клиента е недостъпен - - qBittorrent has been shutdown. - qBittorrent се изключва. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Списък на позволените IP подмрежи + + HTTP Server + Сървър HTTP - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Пример: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Поддържат се следните параметри: - - Add subnet - Добави подмрежа + + Torrent path + Торент път - - Delete - Изтрий + + Torrent name + Торент име - - Error - Грешка + + qBittorrent has been shutdown. + qBittorrent се изключва. + + + LineEdit - - The entered subnet is invalid. - Въведената подмрежа е невалидна. + + Clear the text + Изтрий текста LogListWidget - + Copy Копирай - + Clear Изчистване @@ -2416,551 +2137,493 @@ При &Приключване на Свалянията: - + &View &Оглед - + &Options... &Опции... - + &Resume &Пауза - + Torrent &Creator Торент &Създател - + Set Upload Limit... Определяне на Лимит за Качване... - + Set Download Limit... Определяне на Лимит за Сваляне... - + Set Global Download Limit... Определяне на Глобален Лимит за Сваляне... - + Set Global Upload Limit... Определяне на Глобален Лимит за Качване... - + Minimum Priority Минимален Приоритет - + Top Priority Най-висок Приоритет - + Decrease Priority Намаляване на Приоритета - + Increase Priority Увеличаване на Приоритета - - + + Alternative Speed Limits Алтернативни Лимити за Скорост - + &Top Toolbar &Горна Лента с Инструменти - + Display Top Toolbar Показване на Горна Лента с Инструменти - - Status &Bar - Статус &Лента - - - + S&peed in Title Bar С&корост в Заглавната Лента - + Show Transfer Speed in Title Bar Показване на Скорост на Трансфер в Заглавната Лента - + &RSS Reader &RSS Четец - + Search &Engine Програма за &Търсене - + L&ock qBittorrent З&аключи qBittorrent - + Do&nate! Да&ри! - - Close Window - Затвори прозореца - - - + R&esume All П&ауза Всички - + Manage Cookies... Управление на Бисквитките... - + Manage stored network cookies Управление на запазените мрежови бисквитки - + Normal Messages Нормални Съобщения - + Information Messages Информационни Съобщения - + Warning Messages Предупредителни Съобщения - + Critical Messages Критични Съобщения - + &Log &Журнал - + &Exit qBittorrent &Изход от qBittorrent - + &Suspend System &Приспиване на Системата - + &Hibernate System &Хибернация на Системата - + S&hutdown System И&зклюване на Системата - + &Disabled &Деактивиран - + &Statistics &Статистики - + Check for Updates Проверка за Обновления - + Check for Program Updates Проверка за Обновяване на Програмата - + &About &Относно - + &Pause &Пауза - + &Delete &Изтрий - + P&ause All П&ауза Всички - + &Add Torrent File... &Добавяне Торент Файл... - + Open Отваряне - + E&xit И&зход - + Open URL Отваряне URL - + &Documentation &Документация - + Lock Заключване - - - + + + Show Покажи - + Check for program updates Проверка за обновления на програмата - + Add Torrent &Link... Добавяне &Линк на Торент - + If you like qBittorrent, please donate! Ако ви харесва qBittorrent, моля дарете! - - + Execution Log Изпълнение на Запис - + Clear the password Изчистване на паролата - + Filter torrent list... Филтриране на торент от списъка... - + &Set Password &Задаване на Парола - - Preferences - Предпочитания - - - + &Clear Password &Изчистване на Парола - + Transfers Трансфери - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Свързване на торент файла - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent не е вашето приложение по подразбиране за отваряне на файлове торент или Магнитни връзки. Искате ли да свържете qBittorrent към файлове торент и Магнитни връзки? - + Icons Only Само Икони - + Text Only Само Текст - + Text Alongside Icons Текст Успоредно с Икони - + Text Under Icons Текст Под Икони - + Follow System Style Следване на Стила на Системата - - - + + + UI lock password Парола за потребителски интерфейс - - - + + + Please type the UI lock password: Моля въведете парола за заключване на потребителския интерфейс: - + The password should contain at least 3 characters Паролата трябва да съдържа поне 3 символа - + Password update Обновяване на парола - + The UI lock password has been successfully updated Паролата за заключване на потребителския интерфейс бе успешно обновена - + Are you sure you want to clear the password? Наистина ли искате да изчистите паролата? - - Use regular expressions - - - - + Search Търси - + Transfers (%1) Трансфери (%1) - + Error Грешка - + Failed to add torrent: %1 Неуспешно добавяне на торент: %1 - + Torrent added Торентът е довен - + '%1' was added. e.g: xxx.avi was added. '%1' беше добавен. - + Download completion Завършва свалянето - + I/O Error i.e: Input/Output Error В/И Грешка - + Recursive download confirmation Допълнително потвърждение за сваляне - + Yes Да - + No Не - + Never Никога - + Global Upload Speed Limit Общ лимит Скорост на качване - + Global Download Speed Limit Общ лимит Скорост на сваляне - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent току-що бе обновен и има нужда от рестарт, за да влязат в сила промените. - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - Няколко файлове в момента се прехвърлят. - - - - Are you sure you want to quit qBittorrent? - Сигурни ли сте, че искате на излезете от qBittorent? - - - + &No &Не - + &Yes &Да - + &Always Yes &Винаги Да - - %1/s - s is a shorthand for seconds - %1/с - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter Стар Python Интерпретатор - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. Вашата версия (%1) на Python е стара. Моля обновете до последната версия, за да могат търсачките да работят. Задължителен минимум: 2.7.9 / 3.3.0. - + qBittorrent Update Available Обновление на qBittorrent е Налично - + + A new version is available. +Do you want to download %1? + Нова версия е налична. +Искате ли да свалите %1? + + + Already Using the Latest qBittorrent Version Вече се Използва Последната Версия на qBittorrent - + Undetermined Python version Неопределена версия на Python - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. '%1' завърши свалянето. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2969,158 +2632,153 @@ Причина: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? Торентът '%'1 съдържа торент файлове, искате ли да продължите с тяхното сваляне? - + Couldn't download file at URL '%1', reason: %2. Не може да се свали файл на URL '%1', причина: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin Python намерен в %1: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + Не може да се определи вашата версия (%1) на Python. Търсачката е деактивирана. + + + + Missing Python Interpreter Липсващ интерпретатор на Python - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Python е необходим за употребата на търсачката, но изглежда не е инсталиран. Искате ли да го инсталирате сега? - + Python is required to use the search engine but it does not seem to be installed. Python е необходим за употребата на търсачката, но изглежда не е инсталиран. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. Няма обновления. Вече използвате последната версия. - + &Check for Updates &Проверка за Обновление - + Checking for Updates... Проверяване за Обновление... - + Already checking for program updates in the background Проверката за обновления на програмата вече е извършена - + Python found in '%1' Python намерен в '%1' - + Download error Грешка при сваляне - + Python setup could not be downloaded, reason: %1. Please install it manually. Инсталаторът на Python не може да се свали, причина: %1. Моля инсталирайте го ръчно. - - + + Invalid password Невалидна парола - - - + + RSS (%1) RSS (%1) - + URL download error URL грешка при сваляне - + The password is invalid Невалидна парола - - + + DL speed: %1 e.g: Download speed: 10 KiB/s СВ скорост: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s КЧ скорост: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [С: %1, К: %2] qBittorrent %3 - + Hide Скрий - + Exiting qBittorrent Напускам qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Някои файлове се прехвърлят. Сигурни ли сте че искате да напуснете qBittorrent? + + + Open Torrent Files Отвори Торент Файлове - + Torrent Files Торент Файлове - + Options were saved successfully. Опциите бяха съхранени успешно. @@ -3128,52 +2786,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. Вашата динамична DNS бе успешно обновена. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Грешка от Динамичната DNS: Услугата е временно недостъпна, повторен опит след 30 минути. - + Dynamic DNS error: hostname supplied does not exist under specified account. Грешка от Динамичната DNS: името на хоста не съществува в определената регистрация. - + Dynamic DNS error: Invalid username/password. Грешка от Динамичната DNS: Невалидно потребителско име/парола. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Грешка от Динамичната DNS: qBittorrent е в черния списък на услугата, моля съобщете за бъг на http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Грешка от Динамичната DNS: %1 бе отговорено за тази услуга, моля съобщете за бъг на http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Грешка от Динамичната DNS: Вашето потребителско име е било блокирано заради злоупотреба. - + Dynamic DNS error: supplied domain name is invalid. Грешка от Динамичната DNS: зададеното домейн име е невалидно. - + Dynamic DNS error: supplied username is too short. Грешка от Динамичната DNS: зададеното потребителско име е твърде късо. - + Dynamic DNS error: supplied password is too short. Грешка от Динамичната DNS: зададената парола е твърде къса. @@ -3181,1413 +2839,1303 @@ Net::DownloadHandler - + I/O Error В/И Грешка - + The file size is %1. It exceeds the download limit of %2. Размерът на файла е %1. Той надвишава лимита от %2 за сваляне . - + Unexpected redirect to magnet URI. Неочаквано пренасочване към магнитен URI. - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. GeoIP базата данни е заредена. Тип: %1. Време на изграждане: %2. - - + + Couldn't load GeoIP database. Reason: %1 Не може да се зареди GeoIP базата данни. Причина: %1 - + Venezuela, Bolivarian Republic of Боливарска република Венесуела - + Viet Nam Виетнам - - + + N/A Няма - + Andorra Андора - + United Arab Emirates Обединени Арабски Емирства - + Afghanistan Афганистан - + Antigua and Barbuda Антигуа и Барбуда - + Anguilla Ангуила - + Albania Албания - + Armenia Армения - + Angola Ангола - + Antarctica Антарктида - + Argentina Аржентина - + American Samoa Американска Самоа - + Austria Австрия - + Australia Австралия - + Aruba Аруба - + Azerbaijan Азербайджан - + Bosnia and Herzegovina Босна и Херцеговина - + Barbados Барбадос - + Bangladesh Бангладеш - + Belgium Белгия - + Burkina Faso Буркина Фасо - + Bulgaria България - + Bahrain Бахрейн - + Burundi Бурунди - + Benin Бенин - + Bermuda Бермудски острови - + Brunei Darussalam Бруней - + Brazil Бразилия - + Bahamas Бахамски острови - + Bhutan Бутан - + Bouvet Island Остров Буве - + Botswana Ботсвана - + Belarus Беларус - + Belize Белиз - + Canada Канада - + Cocos (Keeling) Islands Кокосови (Килинг) острови - + Congo, The Democratic Republic of the Демократична Република Конго - + Central African Republic Централна Африканска Република - + Congo Конго - + Switzerland Швейцария - + Cook Islands Острови Кук - + Chile Чили - + Cameroon Камерун - + China Китай - + Colombia Колумбия - + Costa Rica Коста Рика - + Cuba Куба - + Cape Verde Кабо Верде - + Curacao Кюрасао - + Christmas Island Остров Рождество - + Cyprus Кипър - + Czech Republic Чешка Република - + Germany Германия - + Djibouti Джибути - + Denmark Дания - + Dominica Доминика - + Dominican Republic Доминиканска Република - + Algeria Алжир - + Ecuador Еквадор - + Estonia Естония - + Egypt Египет - + Western Sahara Западна Сахара - + Eritrea Еритрея - + Spain Испания - + Ethiopia Етиопия - + Finland Финландия - + Fiji Фиджи - + Falkland Islands (Malvinas) Фолкландски (Малвинкси) острови - + Micronesia, Federated States of Федерални щати на Микронезия - + Faroe Islands Фарьорски острови - + France Франция - + Gabon Габон - + United Kingdom Великобритания - + Grenada Гренада - + Georgia Грузия - + French Guiana Френска Гвиана - + Ghana Гана - + Gibraltar Гибралтар - + Greenland Гренландия - + Gambia Гамбия - + Guinea Гвинея - + Guadeloupe Гваделупа - + Equatorial Guinea Екваториална Гвинея - + Greece Гърция - + South Georgia and the South Sandwich Islands Южна Джорджия и Южни Сандвичеви острови - + Guatemala Гватемала - + Guam Гуам - + Guinea-Bissau Гвинея-Бисау - + Guyana Гвиана - + Hong Kong Хонконг - + Heard Island and McDonald Islands Острови Хърд и Макдоналд - + Honduras Хондурас - + Croatia Хърватия - + Haiti Хайти - + Hungary Унгария - + Indonesia Индонезия - + Ireland Ирландия - + Israel Израел - + India Индия - + British Indian Ocean Territory Британска индоокеанска територия - + Iraq Ирак - + Iran, Islamic Republic of Ислямска Република Иран - + Iceland Исландия - + Italy Италия - + Jamaica Ямайка - + Jordan Йордан - + Japan Япония - + Kenya Кения - + Kyrgyzstan Киргизстан - + Cambodia Камбоджа - + Kiribati Кирибати - + Comoros Коморски острови - + Saint Kitts and Nevis Сейнт Китс и Невис - + Korea, Democratic People's Republic of Демократична Република Кореа - + Korea, Republic of Република Кореа - + Kuwait Кувейт - + Cayman Islands Кайманови острови - + Kazakhstan Казахстан - + Lao People's Democratic Republic Народнодемократична Република Лаос - + Lebanon Ливан - + Saint Lucia Сейнт Лусия - + Liechtenstein Лихтенщайн - + Sri Lanka Шри Ланка - + Liberia Либерия - + Lesotho Лесото - + Lithuania Литва - + Luxembourg Люксембург - + Latvia Латвия - + Morocco Мароко - + Monaco Монако - + Moldova, Republic of Република Молдова - + Madagascar Мадагаскар - + Marshall Islands Маршалови острови - + Mali Мали - + Myanmar Мианмар - + Mongolia Монголия - + Northern Mariana Islands Северни Мариански острови - + Martinique Мартиника - + Mauritania Мавритания - + Montserrat Монсерат - + Malta Малта - + Mauritius Мавриций - + Maldives Малдиви - + Malawi Малави - + Mexico Мексико - + Malaysia Малайзия - + Mozambique Мозамбик - + Namibia Намибия - + New Caledonia Нова Каледония - + Niger Нигер - + Norfolk Island Остров Норфолк - + Nigeria Нигерия - + Nicaragua Никарагуа - + Netherlands Нидерландия - + Norway Норвегия - + Nepal Непал - + Nauru Науру - + Niue Ниуе - + New Zealand Нова Зеландия - + Oman Оман - + Panama Панама - + Peru Перу - + French Polynesia Френска Полинезия - + Papua New Guinea Папуа Нова Гвинея - + Philippines Филипини - + Pakistan Пакистан - + Poland Полша - + Saint Pierre and Miquelon Сен Пиер и Микелон - + Puerto Rico Пуерто Рико - + Portugal Португалия - + Palau Палау - + Paraguay Парагвай - + Qatar Катар - + Reunion Реюнион - + Romania Румъния - + Russian Federation Русия - + Rwanda Руанда - + Saudi Arabia Саудитска Арабия - + Solomon Islands Соломонови острови - + Seychelles Сейшели - + Sudan Судан - + Sweden Швеция - + Singapore Сингапур - + Slovenia Словения - + Svalbard and Jan Mayen Свалбард и Ян Майен - + Slovakia Словакия - + Sierra Leone Сиера Леоне - + San Marino Сан Марино - + Senegal Сенегал - + Somalia Сомалия - + Suriname Суринам - + Sao Tome and Principe Сао Томе и Принсипи - + El Salvador Салвадор - + Syrian Arab Republic Република Сирия - + Swaziland Свазиленд - + Turks and Caicos Islands Търкс и Кайкос - + Chad Чад - + French Southern Territories Френски южни и антарктически територии - + Togo Того - + Thailand Тайланд - + Tajikistan Таджикистан - + Tokelau Токелау - + Turkmenistan Туркменистан - + Tunisia Тунис - + Tonga Тонга - - Could not decompress GeoIP database file. - Не може да се декомпресира файла на GeoIP базата данни. - - - + Timor-Leste Източен Тимор - + Bolivia, Plurinational State of Многонационална държава Боливия - + Bonaire, Sint Eustatius and Saba Бонер, Сейнт Естасиус и Саба - + Cote d'Ivoire Кот д'Ивоар - + Libya Либия - + Saint Martin (French part) Сен Мартен (Френска част) - + Macedonia, The Former Yugoslav Republic of Македония - + Macao Макао - + Pitcairn Питкерн - + Palestine, State of Палестина - + Saint Helena, Ascension and Tristan da Cunha Света Елена, Възнесение и Тристан да Куня - + South Sudan Южен Судан - + Sint Maarten (Dutch part) Синт Мартен (Нидерландска част) - + Turkey Турция - + Trinidad and Tobago Тринидад и Тобаго - + Tuvalu Тувалу - + Taiwan Тайван - + Tanzania, United Republic of Обединена Република Танзания - + Ukraine Украйна - + Uganda Уганда - + United States Minor Outlying Islands Малки далечни острови на САЩ - + United States Съединени американски щати - + Uruguay Уругвай - + Uzbekistan Узбекистан - + Holy See (Vatican City State) Светия Престол (Ватиканска Град Държава) - + Saint Vincent and the Grenadines Сейнт Винсент и Гренадини - + Virgin Islands, British Британски Вирджински острови - + Virgin Islands, U.S. Американски Вирджински острови - + Vanuatu Вануату - + Wallis and Futuna Уолис и Футуна - + Samoa Самоа - + Yemen Йемен - + Mayotte Майот - + Serbia Сърбия - + South Africa Южна Африка - + Zambia Замбия - + Montenegro Черна гора - + Zimbabwe Зимбабве - + Aland Islands Оландски острови - + Guernsey Гърнзи - + Isle of Man Остров Ман - + Jersey Джърси - + Saint Barthelemy Сен Бартелми - + + Could not uncompress GeoIP database file. + Не може да се декомпресира файла на GeoIP базата данни. + + + Couldn't save downloaded GeoIP database file. Не може да се запази сваленият файл на GeoIP базата данни. - + Successfully updated GeoIP database. Успешно е обновена GeoIP базата данни. - + Couldn't download GeoIP database file. Reason: %1 Не може да се свали файлът на GeoIP базата данни. Причина: %1 @@ -4595,12 +4143,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] UPnP / NAT-PMP поддръжка [ВКЛ] - + UPnP / NAT-PMP support [OFF] UPnP / NAT-PMP поддръжка [ИЗКЛ] @@ -4608,7 +4156,7 @@ Net::Smtp - + Email Notification Error: Грешка при известяването по e-mail: @@ -4616,1275 +4164,1077 @@ OptionsDialog - + Options Настройки - + Behavior Поведение - + Downloads Сваляния - + Connection Връзка - + Speed Скорост - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI Уеб ПИ - + Advanced Разширени - + Language Език - + User Interface Language: Език на Потребителския Интерфейс: - + (Requires restart) (Изисква рестартиране) - + Transfer List Трансферен Списък - + Confirm when deleting torrents Потвърждаване при изтриването на торенти - + Use alternating row colors In transfer list, one every two rows will have grey background. Ползвай различно оцветени редове - + Hide zero and infinity values Скриване на нулата и безкрайните стойности - + Always Винаги - + Paused torrents only Само торентите в пауза - + Action on double-click Действие при двойно щракване - + Downloading torrents: Сваляне на торенти: - - + + Start / Stop Torrent Пускане / Спиране Торент - - + + Open destination folder Отваряне на съдържащата директория - - + + No action Без действие - + Completed torrents: Завършени торенти: - + Desktop Десктоп - + Start qBittorrent on Windows start up Стартирай qBittorrent със стартирането на Windows - + Show splash screen on start up Покажи начален екран при стартиране - + Start qBittorrent minimized Стартирай qBittorrent минимизиран - + Confirmation on exit when torrents are active Потвърждаване при изход, когато има активни торенти. - + Confirmation on auto-exit when downloads finish Потвърждение при авто-изход, когато свалящите се приключат - - KiB - КБ - - - - Email notification &upon download completion - Уведомяване с имейл &при завършване на свалянето - - - - Run e&xternal program on torrent completion - Изпълняване на в&ъншна програма при завършване на торент - - - - IP Fi&ltering - IP Фи&лтриране - - - - Schedule &the use of alternative rate limits - График на &използването на алтернативни пределни скорости - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - - - - &Torrent Queueing - &Нареждане на Oпашка на Торенти + + Show qBittorrent in notification area + Показване на qBittorrent в зоната за уведомяване - - Seed torrents until their seeding time reaches - Споделяне на торентите, докато тяхното време на споделяне не достигне - - - - A&utomatically add these trackers to new downloads: - Автоматично добавяне на тези тракери към нови сваляния: - - - - RSS Reader - RSS Четец - - - - Enable fetching RSS feeds - Включване получаването от RSS канали. - - - - Feeds refresh interval: - Интервал за опресняване на каналите: - - - - Maximum number of articles per feed: - Максимален брой на статии за канал: - - - - - min - minutes - мин - - - - RSS Torrent Auto Downloader - RSS Торентов Авто Сваляч - - - - Enable auto downloading of RSS torrents - Включване на автоматичното сваляне на RSS торенти - - - - Edit auto downloading rules... - Редактиране на правилата за автоматично сваляне... - - - - Web User Interface (Remote control) - Потребителски Уеб Интерфейс (Отдалечен контрол) - - - - IP address: - IP адрес: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - IP адрес, с който Уеб ПИ ще се обвърже. -Задайте IPv4 или IPv6 адрес. Можете да зададете "0.0.0.0" за всеки IPv4 адрес, -"::" за всеки IPv6 адрес, или "*" за двата IPv4 или IPv6. - - - - Server domains: - Сървърни домейни: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - Списък с разрешени за филтриране стойности на HTTP хост хедъри. За защита срещу атака "ДНС повторно свързване" въведете тук домейните използвани от Уеб ПИ сървъра. Използвайте ';' за разделител. Може да се използва и заместител '*'. - - - - &Use HTTPS instead of HTTP - &Използване на HTTPS вместо HTTP - - - - Bypass authentication for clients on localhost - Заобиколи удостоверяването на клиенти от localhost - - - - Bypass authentication for clients in whitelisted IP subnets - Заобиколи удостоверяването на клиенти от позволените IP подмрежи - - - - IP subnet whitelist... - Позволени IP подмрежи... - - - - Upda&te my dynamic domain name - Обнови моето динамично име на домейн - - - + Minimize qBittorrent to notification area Минимизиране на qBittorrent в зоната за уведомяване - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. Затваряне на qBittorrent в зоната за уведомяване - + Tray icon style: Стил на иконата в лентата: - + Normal Нормален - + Monochrome (Dark theme) Едноцветно (Тъмна тема) - + Monochrome (Light theme) Едноцветно (Светла тема) - + File association Файлови асоциации - + Use qBittorrent for .torrent files Използване на qBittorrent за торент файлове - + Use qBittorrent for magnet links Използване на qBittorrent за магнитни връзки - + Power Management Управление на Енергията - + + Inhibit system sleep when torrents are active + Попречи на системата да заспи когато има активни торенти + + + + Log file + Лог файл + + + Save path: Местоположение за запис: - + Backup the log file after: Резервно копие на лог файла след: - + + MB + МБ + + + Delete backup logs older than: Изтриване на резервните копия на лог файловете по-стари от: - + days Delete backup logs older than 10 months дни - + months Delete backup logs older than 10 months месеци - + years Delete backup logs older than 10 years години - + When adding a torrent При добавяне на торент - + + Display torrent content and some options + Показване съдържание на торента и някои опции + + + Bring torrent dialog to the front Изнасяне на диалога за добавяне на торент най-отпред - + Do not start the download automatically The torrent will be added to download list in pause state Не стартирай свалянето автоматично - + Should the .torrent file be deleted after adding it Да бъде ли изтриван .torrent файлът след добавянето му - + + Delete .torrent files afterwards + Изтриване на .torrent файловете след това + + + Also delete .torrent files whose addition was cancelled Също изтриване на .torrent файловете, чието добавяне е било отказано - + Also when addition is cancelled Също, когато добавянето е отказано - + Warning! Data loss possible! Предупреждение! Загуба на информация е възможна! - + Saving Management Управление на Съхранението - + Default Torrent Management Mode: Торентов Режим на Управление по подразбиране: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category Автоматичен режим значи, че различни настройки на торент (н. пр. местоположение) ще бъдат решени от асоциираната категория - + Manual Ръчно - + Automatic Автоматично - + When Torrent Category changed: Когато Категорията на Торента се промени: - + Relocate torrent Преместване на торента - + Switch torrent to Manual Mode Превключване на торента към Ръчен Режим - + When Default Save Path changed: Когато Местоположението за Запис по Подразбиране се промени: - - + + Relocate affected torrents Преместване на засегнатите торенти - - + + Switch affected torrents to Manual Mode Превключване на засегнатите торенти в Ръчен Режим - + When Category changed: Когато Категорията се промени: - + Use Subcategories Използване на Под-категории - + Default Save Path: Местоположение за Запис по подразбиране: - + Keep incomplete torrents in: Запазване на незавършени торенти в: - + Copy .torrent files to: Копирай .торент файловете в: - - Show &qBittorrent in notification area - Показване на &qBittorrent в зоната за уведомяване - - - - &Log file - &Лог файл - - - - Display &torrent content and some options - Показване съдържание на &торента и някои опции - - - - Create subfolder for torrents with multiple files - Създаване на поддиректория за торенти с множество файлове - - - - De&lete .torrent files afterwards - Из&триване на .torrent файловете след това - - - + Copy .torrent files for finished downloads to: Копирай .torrent файловете от приключилите изтегляния в: - + Pre-allocate disk space for all files Преразпредели дисково пространство за всички файлове - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding - - - - + Append .!qB extension to incomplete files Добави .!qB разширение към незавършени файлове - - Enable recursive download dialog - - - - + Automatically add torrents from: Автоматично добави торенти от: - + Add entry Добавяне запис - + Remove entry Изтриване запис - + + Email notification upon download completion + Уведомяване с имейл при завършване на свалянето + + + + Destination email: + Имейл получател: + + + SMTP server: SMTP сървър: - + This server requires a secure connection (SSL) Този сървър изисква защитена връзка (SSL) - - + + + Authentication Удостоверяване - - - - + + + + Username: Име на потребителя: - - - - + + + + Password: Парола: - - Enabled protocol: - Активиране на протокол: - - - - TCP and μTP - TCP и μTP + + Run external program on torrent completion + Изпълняване на външна програма при завършване на торент - + Listening Port Порт за слушане - + Port used for incoming connections: Порт ползван за входящи връзки: - + Random Приблизително - + Use UPnP / NAT-PMP port forwarding from my router Използване на UPnP / NAT-PMP порт за препращане от моя рутер - + Use different port on each startup Използване на различен порт при всяко стартиране - + Connections Limits Ограничения на Връзките - + Maximum number of connections per torrent: Максимален брой връзки на торент: - + Global maximum number of connections: Общ максимален брой на връзки: - + Maximum number of upload slots per torrent: Максимален брой слотове за качване на торент: - + Global maximum number of upload slots: Глобален максимален брой слотове за качване: - + Proxy Server Прокси Сървър - + Type: Тип: - + (None) (Без) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Хост: - - + + Port: Порт: - + Otherwise, the proxy server is only used for tracker connections В противен случай, прокси сървъра се използва само за връзки с тракера - + Use proxy for peer connections Използвайте прокси за свързване между участниците - + Disable connections not supported by proxies Деактивиране на връзките, които не се поддържат от проксита. - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection RSS канали, търсачка, софтуерни обновления или всичко друго освен торент трансфери и свързаните с тях операции (като обмяна на участници) ще използва директна връзка - + Use proxy only for torrents Използване на прокси само за торентите - - A&uthentication - У&достоверяване - - - + Info: The password is saved unencrypted Информация: Паролата е запазена некриптирана - + + IP Filtering + IP Филтриране + + + Filter path (.dat, .p2p, .p2b): Филтър път (.dat, .p2p, .p2b): - + Reload the filter Зареди повторно филтъра - - Manually banned IP addresses... - Ръчно блокирани IP адреси... - - - + Apply to trackers Прилагане към тракери - + Global Rate Limits Общи Пределни Скорости - - - - - - - KiB/s - - - - - + + Upload: Качване: - - + + + + + KiB/s + KiB/с + + + + Download: Сваляне: - + Alternative Rate Limits Алтернативни Пределни Скорости - - + + Schedule the use of alternative rate limits + График на използване на алтернативни пределни скорости + + + From: from (time1 to time2) От: - - + To: time1 to time2 До: - + When: Когато: - + Every day Всеки ден - + Weekdays Дни през седмицата - + Weekends Почивни дни - + Rate Limits Settings Настройки на Пределни Скорости - + Apply rate limit to peers on LAN Прилагане на пределна скорост за участници от локалната мрежа - + Apply rate limit to transport overhead Прилагане на пределна скорост за пренатоварено пренасяне - - + + + Enable µTP protocol + Активиране на µTP протокол + + + Apply rate limit to µTP protocol Прилагане на пределна скорост за µTP протокола - + Privacy Дискретност - + Enable DHT (decentralized network) to find more peers Активиране на DHT (децентрализирана мрежа) за намиране на повече участници - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Обмени участници със съвместими Bittorrent клиенти (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers Активиране на Обмяна на Участници (PeX) за намиране на повече участници - + Look for peers on your local network Търси участници в твоята локална мрежа - + Enable Local Peer Discovery to find more peers Включи Откриване на Локални Участници за намиране на повече връзки - + Encryption mode: Режим на кодиране: - + Prefer encryption Предпочитане на кодиране - + Require encryption Изискване на кодиране - + Disable encryption Изключване на кодиране - + Enable when using a proxy or a VPN connection Активиране при използване на прокси или VPN връзка - + Enable anonymous mode Включи анонимен режим - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Повече информация</a>) + + + + Torrent Queueing + Серия Торенти + + + Maximum active downloads: Максимум активни сваляния: - + Maximum active uploads: Максимум активни качвания: - + Maximum active torrents: Максимум активни торенти: - + Do not count slow torrents in these limits Не изчислявай бавни торенти в тези лимити - - Upload rate threshold: - - - - - Download rate threshold: - - - - - sec - seconds - - - - - Torrent inactivity timer: - - - - + Share Ratio Limiting Ограничаване Съотношението на Споделяне - + Seed torrents until their ratio reaches Споделяне на торенти, докато съотношението им достигне - + then тогава - + Pause them Сложи ги в пауза - + Remove them Изтрий ги - - RSS Smart Episode Filters - + + Automatically add these trackers to new downloads: + Автоматично добавяне на тези тракери към нови сваляния: - + + Enable Web User Interface (Remote control) + Включи Интерфейс на Web Потребител (Отдалечен контрол) + + + Use UPnP / NAT-PMP to forward the port from my router Изпозване на UPnP / NAT-PMP за препращане порта от моя рутер - + + Use HTTPS instead of HTTP + Използване на HTTPS вместо HTTP + + + Certificate: Сертификат: - + Import SSL Certificate Импорт на SSL Сертификат - + Key: Ключ: - + Import SSL Key Импорт на SSL Ключ - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Информация за сертификати</a> - - Use alternative Web UI - + + Bypass authentication for localhost + Заобиколи удостоверяването за localhost - - Files location: - + + Update my dynamic domain name + Обнови моето динамично домейн име - - Enable clickjacking protection - - - - - Enable Cross-Site Request Forgery (CSRF) protection - - - - + Service: Услуга: - + Register Регистър - + Domain name: Домейн име: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! Чрез активиране на тези опции, можете <strong>безвъзвратно да загубите</strong> вашите .torrent файлове! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well Когато тези опции са активирани, qBittorent ще <strong>изтрие</strong> .torrent файловете след като са били успешно (първата опция) или не (втората опция) добавени към тяхната опашка за сваляне. Това ще бъде приложенот <strong>не само</strong> върху файловете отворени чрез &ldquo;Добави торент&rdquo; действието в менюто, но и също така върху тези отворени чрез <strong>асоцииране по файлов тип</strong>. - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog Ако активирате втората опция (&ldquo;Също, когато добавянето е отказна&rdquo;) .torrent файлът <strong>ще бъде изтрит</strong> дори ако натиснете &ldquo;<strong>Отказ</strong>&rdquo; в диалога &ldquo;Добавяне торент&rdquo; - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): Поддържани параметри (чувствителност към регистъра) - + %N: Torrent name %N: Име на торент - + %L: Category %L: Категория - - %G: Tags (seperated by comma) - - - - + %F: Content path (same as root path for multifile torrent) %F: Местоположение на съдържанието (същото като местоположението на основната директория за торент с множество файлове) - + %R: Root path (first torrent subdirectory path) %R: Местоположение на основната директория (местоположението на първата поддиректория за торент) - + %D: Save path %D: Местоположение за запис - + %C: Number of files %C: Брой на файловете - + %Z: Torrent size (bytes) %Z: Размер на торента (байтове) - + %T: Current tracker %T: Сегашен тракер - + %I: Info hash %I: Информационен отпечатък - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") Подсказка: Обградете параметър с кавички за предотвратяваме орязването на текста при пауза (пр., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor Избиране на директория за наблюдение - + Folder is already being monitored: Директорията вече се наблюдава: - + Folder does not exist: Директорията не съществува: - + Folder is not readable: Директорията е нечетима: - + Adding entry failed Добавянето на запис е неуспешно - - - - + + Choose export directory Избиране на директория за експорт - - - + + + + + + Choose a save directory Избиране на директория за запис - + Choose an IP filter file Избиране файл на IP филтър - + All supported filters Всички подържани филтри - + SSL Certificate SSL Сертификат - + + SSL Key + SSL Ключ + + + Parsing error Грешка при обработване - + Failed to parse the provided IP filter Неуспешно обработване на дадения IP филтър - + Successfully refreshed Успешно обновен - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Успешно обработване на дадения IP филтър: %1 правила бяха приложени. - + Invalid key Невалиден ключ - + This is not a valid SSL key. Това е невалиден SSL ключ. - + Invalid certificate Невалиден сертификат - - Preferences - Предпочитания - - - - Import SSL certificate - Импорт на SSL Сертификат - - - + This is not a valid SSL certificate. Това не е валиден SSL сертификат. - - Import SSL key - Импорт на SSL Ключ - - - - SSL key - SSL ключ - - - + Time Error Времева грешка - + The start time and the end time can't be the same. Времето на стартиране и приключване не може да бъде едно и също. - - + + Length Error Дължинна Грешка - + The Web UI username must be at least 3 characters long. Потребителското име на Web UI трябва да е поне от 3 символа. - + The Web UI password must be at least 6 characters long. Паролата на Web UI трябва да е поне от 6 символа. @@ -5892,72 +5242,72 @@ PeerInfo - - Interested(local) and Choked(peer) - Заинтересуван (клиент) и Запушен (Участник) + + interested(local) and choked(peer) + заинтересуван (клиент) и запушен (участник) - + interested(local) and unchoked(peer) заинтересуван (клиент) и незапушен (участник) - + interested(peer) and choked(local) заинтересуван (участник) и запушен (клиент) - + interested(peer) and unchoked(local) заинтересуван (участник) и незапушен (клиент) - + optimistic unchoke оптимистично отпушване - + peer snubbed неактивен участник - + incoming connection входяща връзка - + not interested(local) and unchoked(peer) незаинтересуван (клиент) и незапушен (участник) - + not interested(peer) and unchoked(local) незаинтересуван (участник) и незапушен (клиент) - + peer from PEX участник от PEX - + peer from DHT участник от DHT - + encrypted traffic кодиран трафик - + encrypted handshake криптирано уговаряне - + peer from LSD участник от LSD @@ -5965,193 +5315,178 @@ PeerListWidget - + IP IP - + Port Порт - + Flags Флагове - + Connection Връзка - + Client i.e.: Client application Клиент - + Progress i.e: % downloaded Изпълнение - + Down Speed i.e: Download speed Скорост на сваляне - + Up Speed i.e: Upload speed Скорост на качване - + Downloaded i.e: total data downloaded Свалени - + Uploaded i.e: total data uploaded Качени - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Уместност - + Files i.e. files that are being downloaded right now Файлове - + Column visibility Видимост на колона - + Add a new peer... Добави нов участник... - - + + Ban peer permanently Блокиране на участника за постоянно - + Manually adding peer '%1'... Ръчно добавяне на участник '%1'... - + The peer '%1' could not be added to this torrent. Участникът '%1' не може да бъден добавен към този торент. - + Manually banning peer '%1'... Ръчно блокиране на участник '%1'... - - + + Peer addition Добавяне на участник - + Country Страна - + Copy IP:port Копирай IP:порт - + Some peers could not be added. Check the Log for details. Някои участници не можаха да се добавят. Проверете Журнала за детайли. - + The peers were added to this torrent. Участниците бяха добавени към този торент. - + Are you sure you want to ban permanently the selected peers? Сигурни ли сте че искате да блокирате за постоянно избраните участници? - + &Yes &Да - + &No &Не - PeersAdditionDialog - - - Add Peers - - + PeersAdditionDlg - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - - - + No peer entered - + Няма въведен участник - + Please type at least one peer. - + Моля въведете поне един участник. - + Invalid peer - + Невалиден участник - + The peer '%1' is invalid. - + Участникът '%1' е невалиден. PieceAvailabilityBar - + White: Unavailable pieces Бяло: Неналични части - + Blue: Available pieces Синьо: Налични части @@ -6159,336 +5494,293 @@ PiecesBar - + Files in this piece: Файлове в това парче: - + File in this piece Файл в това парче: - + File in these pieces Файл в тези парчета - - Wait until metadata become available to see detailed information - Изчакайте, докато мета информацията стане налична, за да видите подробна информация - - - + Hold Shift key for detailed information Задържете клавиша Shift за подробна информация - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Добавки за търсене - + Installed search plugins: - + Инсталирани добавки за търсене: - + Name - Име + Име - + Version - + Версия - + Url - + Url - - + + Enabled - - - - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - + Активирано - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Може да вземете нови добавки за търсене оттук: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Инсталиране нова - + Check for updates - + Проверка за обновления - + Close - + Затваряне - + Uninstall - + Деинсталиране - - - + + + Yes - Да + Да - - - - + + + + No - Не + Не - + Uninstall warning - + Предупреждение при деинсталиране - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Някои добавки не могат да бъдат деинсталирани, защото за вградени в qBittorrent. Само тези, които вие самите сте добавили могат да бъдат деинсталирани. +Тези добавки бяха деактивирани. - + Uninstall success - + Успешно деинсталиране - + All selected plugins were uninstalled successfully - - - - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - + Всички избрани добавки бяха успешно деинсталирани - - + + New search engine plugin URL - + Нов URL за добавки на търсачката - - + + URL: - + URL: - + Invalid link - + Невалиден линк - + The link doesn't seem to point to a search engine plugin. - + Изглежда, че линкът не води към добавка за търсене. - + Select search plugins - + Избери добавки за търсене - + qBittorrent search plugin - + qBittorrent добавка за търсене + + + + + + Search plugin update + Обновяване на добавката за търсене - + All your plugins are already up to date. - + Всички ваши добавки са вече обновени. - + Sorry, couldn't check for plugin updates. %1 - + Извинявайте, не може да се провери за обновления на добавката. %1 - + + + Search plugin install - + Инсталиране на добавка за търсене - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + "%1" добавката за търсене бе успешно инсталирана. + + + Couldn't install "%1" search engine plugin. %2 - + Не може да се инсталира "%1" добавка за търсене. %2 + + + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + "%1" добавката за търсене бе успешно обновена. - + Couldn't update "%1" search engine plugin. %2 - + Не може да се обнови "%1" добавката за търсене. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Код на добавката - + Search plugin source: - + Код на добавката за търсене: - + Local file - + Локален файл - + Web link - - - - - PowerManagement - - - qBittorrent is active - + Web линк - PreviewSelectDialog - - - Preview - Преглед - + PreviewSelect - + Name Име - + Size Размер - + Progress - Напредък + Изпълнение - - + + Preview impossible - Прегледът е невъзможен + Оглед невъзможен - - + + Sorry, we can't preview this file - За съжаление, не можем да направим преглед този файл. - - - - Private::FileLineEdit - - - '%1' does not exist - '%1' не съществува - - - - '%1' does not point to a directory - '%1' не сочи към директория - - - - '%1' does not point to a file - '%1' не сочи към файл - - - - Does not have read permission in '%1' - Няма права за четене в '%1' - - - - Does not have write permission in '%1' - Няма права за писане в '%1' + Съжалявам, не можем да огледаме този файл PropListDelegate - + Not downloaded Не свалени - - + + Normal Normal (priority) Нормален - - N/A - Няма - - - + Do not download Do not download (priority) - Не сваляй + Не сваляй - - + + High High (priority) Висок - + N/A + Няма + + + Mixed Mixed (priorities Смесени - - + + Maximum Maximum (priority) Максимален @@ -6497,32 +5789,32 @@ PropTabBar - + General Общи - + Trackers Тракери - + Peers Участници - + HTTP Sources HTTP Източници - + Content Съдържание - + Speed Скорост @@ -6616,22 +5908,22 @@ Коментар: - + Select All Избери всички - + Select None Не избирай - + Normal Нормален - + High Висок @@ -6691,165 +5983,165 @@ Местоположение за Запис: - + Maximum Максимален + - Do not download Не сваляй - + Never Никога - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (средно %3) - - + + %1 (%2 this session) %1 (%2 тази сесия) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (споделян за %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 макс.) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 общо) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 средно) - + Open Отваряне - + Open Containing Folder Отваряне на Съдържащата Директория - + Rename... Преименувай... - + Priority Предимство - + New Web seed Ново Web споделяне - + Remove Web seed Изтриване на Web споделяне - + Copy Web seed URL Копиране URL на Web споделяне - + Edit Web seed URL Редактиране URL на Web споделяне - + + Rename the file + Преименувай файла + + + New name: Ново име: - - + + + The file could not be renamed + Файла не може да се преименува + + + + This file name contains forbidden characters, please choose a different one. + Името на файла съдържа забранени символи, моля изберете различно име. + + + + This name is already in use in this folder. Please use a different name. Това име вече съществува в тази папка. Моля, ползвайте различно име. - + The folder could not be renamed Папката не може да се преименува - + qBittorrent qBittorrent - + Filter files... Филтриране на файловете... - - Renaming - Преименуване - - - - - Rename error - Грешка при преименуване - - - - The name is empty or contains forbidden characters, please choose a different one. - Името е празно или съдържа непозволени символи, моля изберете различно име. - - - + New URL seed New HTTP source Ново URL споделяне - + New URL seed: Ново URL споделяне: - - + + This URL seed is already in the list. Това URL споделяне е вече в списъка. - + Web seed editing Редактиране на Web споделяне - + Web seed URL: URL на Web споделяне: @@ -6857,230 +6149,117 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + Вашия IP адрес беше блокиран след многократни неуспешни опити за удостоверяване. + + + + Error: '%1' is not a valid torrent file. + + Грешка: '%1' не е валиден торент файл. + + + + + Error: Could not add torrent to session. + Грешка: Не може да се добави торент към сесията. + + + + I/O Error: Could not create temporary file. + В/И Грешка: Не може да се създаде временен файл. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 е непознат параметър на командния ред. - - + + %1 must be the single command line parameter. %1 трябва да бъде единствен параметър на командния ред. - + + %1 must specify the correct port (1 to 65535). + %1 трябва да определя правилния порт (1 до 65535). + + + You cannot use %1: qBittorrent is already running for this user. Не можете да използвате %1: qBittorrent вече работи за този потребител. - + Usage: Ползване: - + Options: Настройки: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - Параметър '%1' трябва да следва синтаксиса '%1=%2' - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - Параметър '%1' трябва да следва синтаксиса '%1=%2' - - - - Expected integer number in environment variable '%1', but got '%2' - Очаква се цяло число в променливата от средата '%1', но се получи '%2' - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - Параметър '%1' трябва да следва синтаксиса '%1=%2' - - - - Expected %1 in environment variable '%2', but got '%3' - Очаква се %1 променливата от средата '%2', но се получи '%3' + + Displays program version + Показване на версията на програмата - - port - порт + + Displays this help message + Показване на това помощно съобщение - - %1 must specify a valid port (1 to 65535). - %1 трябва да задава валиден порт (1 до 65535) + + Changes the Web UI port (current: %1) + Променя порта на Web UI (сегашен: %1) - - Display program version and exit - Показване на версията на програмата и изход - - - - Display this help message and exit - Показване на това помощно съобщение и изход - - - - Change the Web UI port - Променяне на порта на Уеб ПИ - - - + Disable splash screen Деактивиране на начален екран - + Run in daemon-mode (background) Стартиране в режим на услуга (фонов процес) - - dir - Use appropriate short form or abbreviation of "directory" - dir - - - - Store configuration files in <dir> - Съхранение на конфигурационните файлове в <dir> - - - - - name - име - - - - Store configuration files in directories qBittorrent_<name> - Съхранение на конфигурационните файлове в директории qBittorent_<name> - - - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Намеса във файловете за бързо подновяване на ЛибТорент и редактиране директориите като относителни към директорията на профила - - - - files or URLs - файлове или URL-и - - - - Download the torrents passed by the user + + Downloads the torrents passed by the user Сваля торентите дадени от потребителя. - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Определяне дали диалога 'Добавяне на Нов Торент' се отваря, когато се добави торент. - - - - Options when adding new torrents: - Опции, когато се добавят нови торенти: - - - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Кратък път за %1 - - - - path - път - - - - Torrent save path - Път на запис на торент - - - - Add torrents as started or paused - Добавяне на торентите стартирани или в пауза. - - - - Skip hash check - Пропускане на проверката на контролната сума - - - - Assign torrents to category. If the category doesn't exist, it will be created. - Свързване на торенти към категория. Ако категорията не съществува ще бъде създадена. - - - - Download files in sequential order - Сваляне в последователен ред - - - - Download first and last pieces first - Сваляне първо на първото и последното парче - - - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - Стойности могат да бъдат въведени и като променливи на средата. За опция с име 'parameter-name' променливата на средата би била 'QBT_PARAMETER_NAME' (всичко с главни букви и '_' вместо '-'). За отбелязване на флагове задайте променливата като '1' или 'TRUE'. Например за скриване на началния екран при стартиране: - - - - Command line parameters take precedence over environment variables - Параметрите от командния ред са приоритетни пред променливите от средата - - - + Help Помощ - + Run application with -h option to read about command line parameters. Стартирайте програмата с параметър -h, за да получите информация за параметрите на командния ред. - + Bad command line Некоректен команден ред - + Bad command line: Некоректен команден ред: - + Legal Notice Юридическа бележка - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - - - - - No further notices will be issued. - - - - + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. No further notices will be issued. @@ -7089,353 +6268,432 @@ Последващи предупреждения няма да бъдат правени. - + Press %1 key to accept and continue... Натиснете клавиш %1, че приемате и за продължение... - + Legal notice Юридическа бележка - + Cancel Отказване - + I Agree Съгласен съм - - - Upgrade - Обновяване + + Torrent name: %1 + Име но торент: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - Обновихте по-стара версия, която записва нещата различно. Трябва да преминете към по-новата записваща система. Не ще можете да използвате по-стара версия от v.3.3.0 отново. Продължаване? [да/не] + + Torrent size: %1 + Размер на торент: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - Обновихте по-стара версия, която записва нещата различно. Трябва да преминете към по-новата записваща система. Ако продължите, не ще можете да използвате по-стара версия от v.3.3.0 отново. + + Save path: %1 + Местоположение за запис: %1 - - Couldn't migrate torrent with hash: %1 - Не може да се мигрира торент с отпечатък: %1 + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Торентът бе свален за %1. - - Couldn't migrate torrent. Invalid fastresume file name: %1 - Не може да се мигрира торента. Невалидно име на файла за бързо продължаване: %1 + + Thank you for using qBittorrent. + Благодарим Ви за ползването на qBittorrent. - - Detected unclean program exit. Using fallback file to restore settings: %1 - + + [qBittorrent] '%1' has finished downloading + [qBittorrent] '%1' завърши свалянето - - An access error occurred while trying to write the configuration file. - Грешка за достъп възникна при опита за запис на конфигурационния файл. + + The remote host name was not found (invalid hostname) + Името на отдалечения хост не бе намерено (невалидно име на хост) - - A format error occurred while trying to write the configuration file. - Форматна грешка възникна при опита за запис на конфигурационния файл. + + The operation was canceled + Операцията бе прекъсната - - An unknown error occurred while trying to write the configuration file. - + + The remote server closed the connection prematurely, before the entire reply was received and processed + Отдалечения сървър затвори връзката преждевременно, преди пълният отговор да е получен и обработен - - - RSS::AutoDownloader - - - Invalid data format. - Невалиден формат на данни. + + The connection to the remote server timed out + Времето за връзка към отдалечения сървър изтече - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - + + SSL/TLS handshake failed + Неуспешно SSL/TLS уговаряне - - Invalid data format - + + The remote server refused the connection + Отдалеченият сървър отхвърли връзката - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - + + The connection to the proxy server was refused + Връзката с прокси сървъра бе отхвърлена - - Couldn't load RSS AutoDownloader rules. Reason: %1 - + + The proxy server closed the connection prematurely + Прокси сървърът затвори връзката преждевременно - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - + + The proxy host name was not found + Името на прокси хоста не бе намерено - - RSS feed at '%1' updated. Added %2 new articles. - + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Времето за връзка с проксито изтече или проксито не отговори своевременно на изпратеното запитване - - Failed to parse RSS feed at '%1'. Reason: %2 - + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Проксито изисква удостоверяване, за да уважи запитването, но не прие никакви предложени акредитации - - Couldn't read RSS Session data from %1. Error: %2 - + + The access to the remote content was denied (401) + Достъпът до отдалеченото съдържание бе отказан (401) - - Couldn't parse RSS Session data. Error: %1 - + + The operation requested on the remote content is not permitted + Изискваната операция върху отдалеченото съдържание не е позволена - - Couldn't load RSS Session data. Invalid data format. - + + The remote content was not found at the server (404) + Отдалеченото съдържание не бе намерено на сървъра (404) - - Couldn't load RSS article '%1#%2'. Invalid data format. - + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Отдалеченият сървър изисква удостоверяване, за да предостави съдържанието, но дадените акредитации не бяха приети - - - RSS::Private::Parser - - Invalid RSS feed. - Невалиден RSS канал. + + The Network Access API cannot honor the request because the protocol is not known + API-то за мрежов достъп не може да уважи запитването, защото протокола е непознат. - - %1 (line: %2, column: %3, offset: %4). - %1 (ред: %2, колона: %3, отместване: %4). + + The requested operation is invalid for this protocol + Изискваната операция е невалидна за този протокол + + + + An unknown network-related error was detected + Непозната свързана с мрежата грешка бе установена + + + + An unknown proxy-related error was detected + Непозната свързана с проксито грешка бе установена + + + + An unknown error related to the remote content was detected + Непозната свързана със отдалеченото съдържание грешка бе установена + + + + A breakdown in protocol was detected + Повреда в протокола бе установена + + + + Unknown error + Непозната грешка + + + + + Upgrade + Обновяване - - - RSS::Session - - RSS feed with given URL already exists: %1. - RSS канала със зададения URL вече съществува: %1 + + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] + Обновихте по-стара версия, която записва нещата различно. Трябва да преминете към по-новата записваща система. Не ще можете да използвате по-стара версия от v.3.3.0 отново. Продължаване? [да/не] - - Cannot move root folder. - Не може да се премести коренната директория. + + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. + Обновихте по-стара версия, която записва нещата различно. Трябва да преминете към по-новата записваща система. Ако продължите, не ще можете да използвате по-стара версия от v.3.3.0 отново. - - - Item doesn't exist: %1. - Елементът не съществува: %1 + + Couldn't migrate torrent with hash: %1 + Не може да се мигрира торент с отпечатък: %1 - - Cannot delete root folder. - Не може да се изтрие коренната директория. + + Couldn't migrate torrent. Invalid fastresume file name: %1 + Не може да се мигрира торента. Невалидно име на файла за бързо продължаване: %1 - - Incorrect RSS Item path: %1. - Неправилен път на RSS артикул: %1. + + Detected unclean program exit. Using fallback file to restore settings. + Открит е некоректен изход от програмата. За възстановяване на настройките се използва резервен файл. - - RSS item with given path already exists: %1. - RSS артикул със зададения път вече съществува: %1. + + An access error occurred while trying to write the configuration file. + Грешка за достъп възникна при опита за запис на конфигурационния файл. - - Parent folder doesn't exist: %1. - Родителската папка не съществува: %1. + + A format error occurred while trying to write the configuration file. + Форматна грешка възникна при опита за запис на конфигурационния файл. - RSSWidget + RSS - + Search - Търсене - - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - Получаването от RSS канали е изключено сега! Можете да го включите в програмните настройки. + Търси - + New subscription Нов абонамент - - - + + + Mark items read - Отбелязване на елементите като прочетени - - - - Refresh RSS streams - Опресняване на RSS потоците + Четене на маркираните - + Update all Обнови всички - + RSS Downloader... - RSS Сваляч... + RSS сваляч... + + + + Settings... + Настройки... - + Torrents: (double-click to download) Торенти: (двойно кликване за сваляне) - - + + Delete - Изтриване + Изтрий - + Rename... - Преименуване... + Преименувай... - + Rename - Преименуване + Преименувай - - + + Update Обновяване - + New subscription... Нов абонамент... - - + + Update all feeds - Обновяване на всички канали + Обнови всички канали - + Download torrent - Сваляне на торент + Торент сваляне - + Open news URL - Отваряне на URL за новини + Отваря URL за новини - + Copy feed URL - Копиране URL на канал + Копира URL на канал - + New folder... Нова папка... - + + Refresh RSS streams + Обнови потоците RSS + + + + RSSImp + + + Stream URL: + Поток URL: + + + + Please type a RSS stream URL + Моля въведете URL на RSS поток + + + + This RSS feed is already in the list. + Този RSS канал е вече в списъка. + + + Please choose a folder name Моля изберете име на папка - + Folder name: Име на папка: - + New folder Нова папка - - Please type a RSS feed URL - Моля въведете URL на RSS канал - - - - Feed URL: - URL на канал: - - - + Deletion confirmation Потвърждение за изтриване - + Are you sure you want to delete the selected RSS feeds? Сигурни ли сте, че искате да изтриете избраните RSS канали? - + Please choose a new name for this RSS feed Моля изберете ново име за този RSS канал - + New feed name: Име на нов канал: - - Rename failed - Преименуването неуспешно + + Name already in use + Името вече се ползва + + + + This name is already used by another item, please choose another one. + Това име се ползва от друг елемент, моля изберете друго. - + Date: - Дата: + Дата: - + Author: - Автор: + Автор: + + + + Unread + Непрочетен + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + Автоматичното сваляне на '%1' от '%2' RSS канал е неуспешно, защото не съдържа торент или магнитен линк... + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + Автоматично сваляне на '%1' торент от '%2' RSS канал... + + + + Rss::Private::Parser + + + Invalid RSS feed. + Невалиден RSS канал. + + + + RssSettingsDlg + + + RSS Reader Settings + RSS четец настройки + + + + RSS feeds refresh interval: + Интервал на обновяване на RSS feeds: + + + + min + мин + + + + Maximum number of articles per feed: + Максимум статии на feed: ScanFoldersDelegate - + Select save location Избиране на място на запис @@ -7443,274 +6701,268 @@ ScanFoldersModel - + Monitored Folder Наблюдавана Директория - + Override Save Location Преопределяне на Място на Запис - + Monitored folder Наблюдавана директория - + Default save location Местоположение за запис по подразбиране - + Browse... Преглед... - SearchJobWidget + SearchEngine - - Form - + + Unknown search engine plugin file format. + Непознат формат на файла за добавката за търсене. - - Results(xxx) - + + A more recent version of this plugin is already installed. + По-нова версия на тази добавка е вече инсталирана. - - Search in: - + + + Plugin is not supported. + Добавката не се поддържа. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - + + Update server is temporarily unavailable. %1 + Сървърът за обновления е временно недостъпен. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - + + + Failed to download the plugin file. %1 + Неуспешно сваляне на файла на добавката. %1 - - Seeds: - Споделящи: + + An incorrect update info received. + Неправилна информация за обновление е получена. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - + + All categories + Всички категории - - - to - + + Movies + Филми - - <html><head/><body><p>Maximal number of seeds</p></body></html> - + + TV shows + TV шоута - - - - + + Music + Музика - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + + Games + Игри - - Size: - Размер: + + Anime + Анимация - - <html><head/><body><p>Minimal torrent size</p></body></html> - + + Software + Софтуер - - <html><head/><body><p>Maximal torrent size</p></body></html> - + + Pictures + Снимки - + + Books + Книги + + + + SearchListDelegate + + + + Unknown + Неизвестни + + + + SearchTab + + Name i.e: file name - Име + Име - + Size i.e: file size - Размер + Размер - + Seeders i.e: Number of full sources - + Даващи - + Leechers i.e: Number of partial sources - + Вземащи - + Search engine - - - - - Filter search results... - + Програма за търсене - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Резултати (показва <i>%1</i> от <i>%2</i>): - + Torrent names only - + Само имена на торентите - + Everywhere - - - - - Use regular expressions - + Навсякъде - + Searching... - + Търсене... - + Search has finished - Търсенето завърши + Търсенето приключи - + Search aborted - + Търсенето е прекъснато - + An error occurred during search... - + Грешка възникна при търсене... - + Search returned no results - + Търсенето не даде резултати - + Column visibility Видимост на колона - - - SearchPluginManager - - Unknown search engine plugin file format. - + + Form + Форма - - A more recent version of this plugin is already installed. - + + Results(xxx) + Резултати(xxx) - - - Plugin is not supported. - + + Search in: + Търсене в: - - All categories - + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Някой търсачки търсят в описанието на торента и също в имената на файловете в торента. Дали подобни резултати ще бъдат показвани в листа по-долу се контролира от този режим.</p><p><span style=" font-weight:600;">Навсякъде </span>деактивира филтрирането и показва всичко отговорено от търсачките.</p><p><span style=" font-weight:600;">Само имена на торенти</span>показва само торенти, чиито имена съвпадат с заявката за търсене..</p></body></html> - - Movies - + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Задаване на минимален и максимален позволен брой на сиидъри</p></body></html> - - TV shows - + + Seeds: + Сиидове: - - Music - - - - - Games - - - - - Anime - + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Минимален брой на сиидове - - Software - + + + to + към - - Pictures - + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Максимален брой сиидове</p></body></html> - - - Books - + + + + + - - Update server is temporarily unavailable. %1 - + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Задаване на минимален и максимален позволен размер на торент</p></body></html> - - - Failed to download the plugin file. %1 - + + Size: + Размер: - - An incorrect update info received. - + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Минимален размер на торент</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Максимален размер на торент @@ -7718,198 +6970,185 @@ - - - - + + + Search Търсене - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - Няма никакви инсталирани добавки за търсене. -Кликнете бутона "Търсене на добавки..." в долния десен ъгъл на прозореца, за да инсталирате някоя. - - - + Download Сваляне - + Go to description page Отиди на страницата с описанието - + Copy description page URL Копиране на URL на страницата с описанието - + Search plugins... Търсене на добавки... - + A phrase to search for. Фраза за търсене. - + Spaces in a search term may be protected by double quotes. Паузите в фразата за търсене могат да бъдат предпазени с двойни кавички. - + Example: Search phrase example Пример: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>: търси за <b>foo</b> и <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: търси за - + All plugins Всички добавки - + Only enabled Само активиран - + Select... Избор... - - - + + + Search Engine Търсачка - + Please install Python to use the Search Engine. Моля инсталирайте Python, за да ползвате Търсачката. - + Empty search pattern Празен шаблон за търсене - + Please type a search pattern first Моля въведете първо шаблон за търсене - + Stop Спиране - + Search has finished Търсенето завърши - + Search has failed Търсенето бе неуспешно - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + qBittorrent сега ще излезне. - + E&xit Now - + И&зход Сега - + Exit confirmation - + Потвърждение за изход - + The computer is going to shutdown. - + Компютъра ще бъде изключен. - + &Shutdown Now - - - - - Shutdown confirmation - + &Изключване Сега - + The computer is going to enter suspend mode. - + Компютъра ще бъде поставен в режим на сън. - + &Suspend Now - + &Заспиване Сега - + Suspend confirmation - + Потвърждение за заспиване - + The computer is going to enter hibernation mode. - + Компютъра ще бъде поставен в режим на хибернация. - + &Hibernate Now - + &Хибернация Сега - + Hibernate confirmation - + Потвърждение за хибернация - + You can cancel the action within %1 seconds. - + Можете да откажете действието в %1 секунди. + + + + Shutdown confirmation + Потвърждение за загасяване SpeedLimitDialog - + KiB/s KiB/с @@ -7917,52 +7156,52 @@ SpeedPlotView - + Total Upload Общо Качени - + Total Download Общо Свалени - + Payload Upload Полезни данни Качени - + Payload Download Полезни данни Свалени - + Overhead Upload Служебни данни Качени - + Overhead Download Служебни данни Свалени - + DHT Upload DHT Качване - + DHT Download DHT Сваляне - + Tracker Upload Качване чрез Тракер - + Tracker Download Сваляне чрез Тракер @@ -7970,95 +7209,87 @@ SpeedWidget - + Period: Период: - + 1 Minute 1 Минута - + 5 Minutes 5 Минути - + 30 Minutes 30 Минути - + 6 Hours 6 Часа - + Select Graphs Избиране на Графики - + Total Upload Общо Качени - + Total Download Общо Свалени - + Payload Upload Полезни данни Качени - + Payload Download Полезни данни Свалени - + Overhead Upload Служебни данни Качени - + Overhead Download Служебни данни Свалени - + DHT Upload DHT Качване - + DHT Download DHT Сваляне - + Tracker Upload Качване чрез Тракер - + Tracker Download Сваляне чрез Тракер - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8071,49 +7302,49 @@ Потребителски статистики - - Cache statistics - Статистика на кеша + + Total peer connections: + Общ брой взаимни връзки: - - Read cache hits: - Прочитане на кешираните попадения: + + Global ratio: + Глобален коефициент: - - Average time in queue: - Осреднено време на опашка: + + Alltime download: + Свалени за цялото време: - - Connected peers: - + + Alltime upload: + Качени за цялото време: - - All-time share ratio: - + + Total waste (this session): + Общо пропиляване (тази сесия): - - All-time download: - + + Cache statistics + Статистика на кеша - - Session waste: - + + Read cache hits: + Прочитане на кешираните попадения: - - All-time upload: - + + Average time in queue: + Осреднено време на опашка: - Total buffer size: - + Total buffers size: + Общ размер на буфера: @@ -8141,7 +7372,12 @@ Общ размер на опашката: - + + OK + ОК + + + %1 ms 18 milliseconds %1 мс @@ -8150,29 +7386,34 @@ StatusBar - + Connection status: Състояние на връзката: - + No direct connections. This may indicate network configuration problems. Няма директни връзки. Това може да е от проблеми в мрежовата настройка. - + DHT: %1 nodes DHT: %1 възли - - qBittorrent needs to be restarted! + + qBittorrent needs to be restarted qBittorrent се нуждае от рестарт + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent току-що бе обновен и има нужда от рестарт за да работят промените. + + Connection Status: @@ -8189,1566 +7430,1311 @@ Онлайн - + Click to switch to alternative speed limits Натисни за смяна към други ограничения за скорост - + Click to switch to regular speed limits Натисни за смяна към стандартни ограничения за скорост - + + Manual change of rate limits mode. The scheduler is disabled. + Ръчна промяна на режима на ограниченията на скорост. Планировчикът е деактивиран. + + + Global Download Speed Limit Общ лимит Скорост на сваляне - + Global Upload Speed Limit Общ лимит Скорост на качване - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - Всички (0) + Всички (0) - + Downloading (0) - + Свалящи се (0) - + Seeding (0) - + Споделящи се (0) - + Completed (0) - + Приключени (0) - + Resumed (0) - + Продължени (0) - + Paused (0) - + В Пауза (0) - + Active (0) - + Активни (0) - + Inactive (0) - + Неактивни (0) - + Errored (0) - + С грешки (0) - + All (%1) - Всички (%1) + Всички (%1) - + Downloading (%1) - + Свалящи се (%1) - + Seeding (%1) - + Споделящи се (%1) - + Completed (%1) - + Приключени (%1) - + Paused (%1) - + В Пауза (%1) - + Resumed (%1) - + Продължени (%1) - + Active (%1) - + Активни (%1) - + Inactive (%1) - + Неактивни (%1) - + Errored (%1) - + С грешки (%1) - TagFilterModel + TorrentContentModel - - Tags - Етикети + + Name + Име - - All - Всички + + Size + Размер - - Untagged - Без етикет + + Progress + Изпълнение - - - TagFilterWidget - - Add tag... - Добави етикет... + + Download Priority + Приоритет на Сваляне - - Remove tag - Изтриване на етикет + + Remaining + Остават + + + TorrentCreatorDlg - - Remove unused tags - Изтриване на неизползвани етикети + + Select a folder to add to the torrent + Изберете папка за добавяне към торента - - Resume torrents - Продължаване на торенти + + Select a file to add to the torrent + Изберете файл за добавяне към торента - - Pause torrents - Пауза на торентите + + No input path set + Не е избран входящ път - - Delete torrents - Изтриване на торенти + + Please type an input path first + Моля първо напишете входящ път - - New Tag - Нов Етикет + + Select destination torrent file + Избери торент файл получател - - Tag: - Етикет: + + Torrent Files (*.torrent) + Торент файлове (*.torrent) - - Invalid tag name - Невалидно име на етикет + + Torrent was created successfully: %1 + %1 is the path of the torrent + Торентът бе създаден успешно: %1 - - Tag name '%1' is invalid - Името на етикета '%1' е невалидно + + + + Torrent creation + Създаване на Торент - - Tag exists - Етикетът вече съществува + + Torrent creation was unsuccessful, reason: %1 + Създаване на торент неуспешно, причина: %1 - - Tag name already exists. - Името на етикета вече съществува. + + Created torrent file is invalid. It won't be added to download list. + Създаденият торент файл е невалиден. Няма да бъде добавен в листа за сваляне. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Свойства на Torrent Категория + + Name + i.e: torrent name + Име - - Name: - Име: + + Size + i.e: torrent size + Размер - - Save path: - Местоположение за запис: + + Done + % Done + Готово - - Choose save path - Избери път за съхранение + + Status + Torrent status (e.g. downloading, seeding, paused) + Състояние - - New Category - Нова Категория + + Seeds + i.e. full sources (often untranslated) + Споделящи - - Invalid category name - Невалидно име на категория + + Peers + i.e. partial sources (often untranslated) + Участници - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - Името на категория не трябва да съдържа '\'. -Името на категория не трябва да започва/завършва с '/'. -Името на категория не трябва съдържа '//' последователност. + + Down Speed + i.e: Download speed + Скорост Сваляне - - Category creation error - Грешка при създаване на категория + + Up Speed + i.e: Upload speed + Скорост на качване - - Category with the given name already exists. -Please choose a different name and try again. - Правило с това име вече съществува. -Моля изберете друго име и опитайте отново. + + Ratio + Share ratio + Съотношение - - - TorrentContentModel - - Name - Име + + ETA + i.e: Estimated Time of Arrival / Time left + Оставащо време - - Size - Размер + + Category + Категория - - Progress - Изпълнение + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Добавен на - - Download Priority - Приоритет на Сваляне + + Completed On + Torrent was completed on 01/01/2010 08:00 + Завършен на - - Remaining - Остават + + Tracker + Тракер - - Availability - Наличност + + Down Limit + i.e: Download limit + Лимит сваляне - - - TorrentCreatorDialog - - Torrent Creator - + + Up Limit + i.e: Upload limit + Лимит качване - - Select file/folder to share - + + Downloaded + Amount of data downloaded (e.g. in MB) + Свалени - - Path: - + + Uploaded + Amount of data uploaded (e.g. in MB) + Качени - - [Drag and drop area] - + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Сваляне в Сесията - - - Select file - + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Качване в Сесията - - - Select folder - + + Remaining + Amount of data left to download (e.g. in MB) + Оставащо - - Settings - + + Time Active + Time (duration) the torrent is active (not paused) + Време активен - - Piece size: - + + Save path + Torrent save path + Запазване на пътя - - Auto - - - - - 16 KiB - - - - - 32 KiB - - - - - 64 KiB - - - - - 128 KiB - - - - - 256 KiB - - - - - 512 KiB - - - - - 1 MiB - - - - - 2 MiB - - - - - 4 MiB - - - - - 8 MiB - - - - - 16 MiB - - - - - 32 MiB - - - - - Calculate number of pieces: - - - - - Private torrent (Won't distribute on DHT network) - - - - - Start seeding immediately - Започни незабавно споделяне - - - - Ignore share ratio limits for this torrent - - - - - Optimize alignment - - - - - Fields - - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - - - - Web seed URLs: - - - - - Tracker URLs: - - - - - Comments: - - - - - Source: - - - - - Progress: - Напредък: - - - - Create Torrent - - - - - - - Torrent creation failed - - - - - Reason: Path to file/folder is not readable. - - - - - Select where to save the new torrent - - - - - Torrent Files (*.torrent) - - - - - Reason: %1 - - - - - Reason: Created torrent is invalid. It won't be added to download list. - - - - - Torrent creator - - - - - Torrent created: - - - - - TorrentInfo - - - File size exceeds max limit %1 - - - - - Torrent file read error: %1 - - - - - Torrent file read error: size mismatch - - - - - TorrentsController - - - Not contacted yet - - - - - Updating... - - - - - Working - - - - - Not working - - - - - Error: '%1' is not a valid torrent file. - - - - - - - - Torrent queueing must be enabled - - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - - Cannot make save path - + + Completed + Amount of data completed (e.g. in MB) + Приключено - - Cannot write to directory - + + Ratio Limit + Upload share ratio limit + Ограничение на Коефицента - - WebUI Set location: moving "%1", from "%2" to "%3" - + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Последно приключен - - Incorrect torrent name - + + Last Activity + Time passed since a chunk was downloaded/uploaded + Последна активност - - - Incorrect category name - + + Total Size + i.e. Size including unwanted data + Пълен размер TrackerFiltersList - + All (0) this is for the tracker filter Всички (0) - + Trackerless (0) Без тракери (0) - + Error (0) Грешки (0) - + Warning (0) Предупреждения (0) - - + + Trackerless (%1) Без тракери (%1) - - + %1 (%2) + openbittorrent.com (10) + %1 (%2) + + + + Error (%1) Грешка (%1) - - + + Warning (%1) Внимание (%1) - + Resume torrents Продължи торентите - + Pause torrents Пауза на торентите - + Delete torrents Изтрий торентите - - + + All (%1) this is for the tracker filter Всички (%1) - TrackerListWidget - - - - Working - - - - - Disabled - Изключено - + TrackerList - - This torrent is private - + + URL + URL - - Updating... - + + Status + Състояние - - Not working + + Received - - Not contacted yet - + + Seeds + Споделящи - - - - - - - N/A - Няма + + Peers + Участници - - Tracker editing - + + Downloaded + Свалени - - Tracker URL: - + + Message + Съобщение - - - Tracker editing failed - + + + Working + Работи - - The tracker URL entered is invalid. - + + Disabled + Изключено - - The tracker URL already exists. - + + This torrent is private + Този торент е личен - - Add a new tracker... - + + Updating... + Обновяване... - - Remove tracker - + + Not working + Не работи - - Copy tracker URL - + + Not contacted yet + Още не е свързан - - Edit selected tracker URL - + + Tracker URL: + URL адрес на тракера: - - Force reannounce to selected trackers - + + Tracker editing + Редактиране на тракера - - Force reannounce to all trackers - + + + Tracker editing failed + Редактирането на тракера е неуспешно - - URL - + + The tracker URL entered is invalid. + Въведеният URL адрес на тракер е невалиден. - - Status - Състояние + + The tracker URL already exists. + URL адреса на тракера вече съществува. - - Received - + + Add a new tracker... + Добави нов тракер... - - Seeds - + + Copy tracker URL + Копиране на URL на тракер - - Peers - Участници + + Edit selected tracker URL + Редактиране на избрания URL на тракера - - Downloaded - Свалени + + Force reannounce to selected trackers + Принудително повторно анонсиране към избраните тракери - - Message - + + Force reannounce to all trackers + Принудително анонсиране към всички тракери - - Column visibility - Видимост на колона + + Remove tracker + Премахни тракер - TrackerLoginDialog - - - - Tracker authentication - - - - - Tracker: - - + TrackersAdditionDlg - - Login - Вход - - - - Username: - Име на потребителя: - - - - Password: - Парола: + + Trackers addition dialog + Допълнителен диалог на тракери - - Log in - + + List of trackers to add (one per line): + Списък тракери за добавяне (по един на ред): - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + URL на съвместима с µTorrent листа: - - List of trackers to add (one per line): - + + I/O Error + Грешка на Вход/Изход - - µTorrent compatible list URL: - + + Error while trying to open the downloaded file. + Грешка при опит за отваряне на сваления файл. - + No change - + Без промяна - + No additional trackers were found. - + Допълнителни тракери не бяха намерени. - + Download error - Грешка при сваляне + Грешка при сваляне - + The trackers list could not be downloaded, reason: %1 - + Листата на тракера не може да бъде свалена, причина: %1 TransferListDelegate - + Downloading Сваляне - + Downloading metadata used when loading a magnet link Сваляне на метаданните - + Allocating qBittorrent is allocating the files on disk Заделяне - + Paused Пауза - + Queued i.e. torrent is queued Прикачен - + Seeding Torrent is complete and in upload-only mode Споделяне - + Stalled Torrent is waiting for download to begin Отложен - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] Сваляне - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] Споделяне - + Checking Torrent local data is being checked Проверка - + Queued for checking i.e. torrent is queued for hash checking Поставен на опашка за проверка - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Проверка на данните за продължаване - + Completed Завършено - - - Moving - Torrent local data are being moved/relocated - - - - - Missing Files - Липсващи Файлове - - - - Errored - torrent status, the torrent has an error - С грешки - - - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - %1 (споделян за %2) - - - - %1 ago - e.g.: 1h 20m ago - %1 по- рано - - - - TransferListFiltersWidget - - - Status - Състояние - - - - Categories - Категории - - - - Tags - Етикети - - - - Trackers - Тракери - - - - TransferListModel - - - Name - i.e: torrent name - Име - - - - Size - i.e: torrent size - Размер - - - - Done - % Done - - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Състояние - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - Участници - - - - Down Speed - i.e: Download speed - Скорост на сваляне - - - - Up Speed - i.e: Upload speed - Скорост на качване - - - - Ratio - Share ratio - - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - Категория - - - - Tags - Етикети - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Свалени - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Качени - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - Остават - - - - Time Active - Time (duration) the torrent is active (not paused) - + + + Missing Files + Липсващи Файлове - - Save path - Torrent save path - + + Errored + torrent status, the torrent has an error + С грешки - - Completed - Amount of data completed (e.g. in MB) - Завършено + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) + %1 (споделян за %2) - - Ratio Limit - Upload share ratio limit - + + %1 ago + e.g.: 1h 20m ago + %1 по- рано + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + Състояние - - Last Activity - Time passed since a chunk was downloaded/uploaded - + + Categories + Категории - - Total Size - i.e. Size including unwanted data - + + Trackers + Тракери TransferListWidget - + Column visibility Видимост на колона - + Choose save path Избери път за съхранение - + Torrent Download Speed Limiting Ограничаване Скорост на сваляне - + Torrent Upload Speed Limiting Ограничаване Скорост на качване - + Recheck confirmation Потвърждение за повторна проверка - + Are you sure you want to recheck the selected torrent(s)? Сигурни ли сте, че искате повторно да проверите избрания торент(и)? - + Rename Преименувай - + New name: Ново име: - + Resume Resume/start the torrent Продължи - + Force Resume Force Resume/start the torrent Насилствено Продължение - + Pause Pause the torrent Пауза - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Задаване на местоположение: "%1", от "%2" до "%3" - - - - Add Tags - Добави Етикети - - - - Remove All Tags - Изтрий Всички Етикети - - - - Remove all tags from selected torrents? - Изтриване на всички етикети от избраните торенти? + + New Category + Нова категория - - Comma-separated tags: - Етикети разделени чрез запетаи: + + Category: + Категория: - - Invalid tag - Невалиден етикет + + Invalid category name + Невалидно име на категория - - Tag name: '%1' is invalid - Името на етикета '%1' е невалидно + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Името на категория не трябва да съдържа '\'. +Името на категория не трябва да започва/завършва с '/'. +Името на категория не трябва съдържа '//' последователнст. - + Delete Delete the torrent Изтрий - + Preview file... Огледай файла... - + Limit share ratio... Ограничение на съотношението за споделяне... - + Limit upload rate... Ограничи процент качване... - + Limit download rate... Ограничи процент сваляне... - + Open destination folder Отвори папка получател - + Move up i.e. move up in the queue Нагоре в листата - + Move down i.e. Move down in the queue Надолу в листата - + Move to top i.e. Move to top of the queue На върха на листата - + Move to bottom i.e. Move to bottom of the queue На дъното на листата - + Set location... Определи място... - - Force reannounce - Принудително реанонсиране - - - + Copy name Копиране на име - - Copy hash - Копиране на контролната сума - - - + Download first and last pieces first Сваляне първо на първото и последното парче - + Automatic Torrent Management Автоматичен Торентов Режим на Управаление - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category Автоматичен режим значи, че различни настройки на торент (н. пр. местоположение) ще бъдат решени от асоциираната категория - + Category Категория - + New... New category... Нов... - + Reset Reset category Нулиране - - Tags - Етикети - - - - Add... - Add / assign multiple tags... - Добавяне... - - - - Remove All - Remove all tags - Изтриване Всички - - - + Priority Предимство - + Force recheck Включени проверки за промени - + Copy magnet link Копирай връзка magnet - + Super seeding mode Режим на супер-даване - + Rename... Преименувай... - + Download in sequential order Сваляне по азбучен ред - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + Ограничение на съотношението Сваляне/Качване на торента - - Use global share limit - + + Use global ratio limit + Ползвай стандартното ограничение - - - + + + buttonGroup - + група Бутони - - Set no share limit - + + Set no ratio limit + Не определяй ограничение - - Set share limit to - + + Set ratio limit to + Определи ограничение на + + + WebApplication - - ratio - + + Incorrect category name + Невалидно име на категория + + + WebUI - - minutes - + + The Web UI is listening on port %1 + Web UI слуша на порт %1 - - No share limit method selected - + + Web UI Error - Unable to bind Web UI to port %1 + Web UI грешка - Не може да се обвърже Web UI с порта %1 + + + about - - Please select a limit method first - + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Разширен BitTorrent клиент написан на C++, базиран на Qt toolkit и libtorrent-rasterbar. + + + + Copyright %1 2006-2016 The qBittorrent project + Авторски права %1 2006-2015 The qBittorrent project + + + + Home Page: + Първоначална страница: + + + + Forum: + Форум: + + + + Bug Tracker: + Докладване на грешки: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - + + Add Peers + Добавяне на Участници - - Python not detected - + + List of peers to add (one per line): + Списък от участници (по един на ред): + + + + Format: IPv4:port / [IPv6]:port + Формат: IPv4:порт / [IPv6]:порт - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - + + + Tracker authentication + Удостоверяване на тракера - - Symlinks inside alternative UI folder are forbidden. - + + Tracker: + Тракер: - - Exceeded the maximum allowed file size (%1)! - + + Login + Вход - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - + + Username: + Име на потребителя: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - + + Password: + Парола: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - + + Log in + Влизане - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - + + Cancel + Прекъсни - WebUI + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + Потвърждение за изтриване -- qBittorrent + + + + Remember choice + Запомни избора + + + + Also delete the files on the hard disk + Също изтрий файловете от твърдия диск + + + + confirmShutdownDlg + + + Don't show again + Не показвай отново + + + + createTorrentDialog + + + Cancel + Прекъсни + + + + Torrent Creation Tool + Инструмент за Създаване на Торент + + + + Torrent file creation + Създаване на Торент файл + + + + Add file + Добави файл + + + + Add folder + Добави папка + + + + File or folder to add to the torrent: + Файл или папка за добавяне към торента: + + + + Tracker URLs: + Тракери URL: + + + + Web seeds urls: + Web даващи URL: + + + + Comment: + Коментар: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Можете да разделите тракер комплекти / групи с празен ред. + + + + Piece size: + Размер на част: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 КБ + + + + 64 KiB + 64 КБ + + + + 128 KiB + 128 КБ + + + + 256 KiB + 256 КБ + + + + 512 KiB + 512 КБ + + + + 1 MiB + 1 МБ + + + + 2 MiB + 2 МБ + + + + 4 MiB + 4 МБ + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + Автоматично + + + + Private (won't be distributed on DHT network if enabled) + Лично (няма да бъде разпространено по мрежа DHT ако е включено) + + + + Start seeding after creation + Започни даване след образуване + + + + Ignore share ratio limits for this torrent + Игнориране на коефициента на споделяне за този торент + + + + Create and save... + Създай и съхрани... + + + + Progress: + Изпълнение: + + + + downloadFromURL + + + Add torrent links + Добави връзки торент + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + По един на ред (поддържат се HTTP връзки, магнитни линкове и инфо-хешове) + + + + Download + Свали + + + + Cancel + Прекъсни + - - Web UI: HTTPS setup successful - Уеб ПИ: установяването на HTTPS е успешно + + Download from urls + Свали от url-ове - - Web UI: HTTPS setup failed, fallback to HTTP - Уеб ПИ: установяването на HTTPS се провали, прибягване към HTTP + + No URL entered + Невъведен URL - - Web UI: Now listening on IP: %1, port: %2 - Уеб ПИ: Очаква връзка на IP: %1, порт: %2 + + Please type at least one URL. + Моля въведете поне един URL. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Уеб ПИ: Не може да се закачи на IP: %1, порт: %2. Причина: %3 + + Crash info + Информация за сривове fsutils - + + + + + Downloads Сваляния @@ -9756,100 +8742,140 @@ misc - + B bytes Б - + KiB kibibytes (1024 bytes) КБ - + MiB mebibytes (1024 kibibytes) МБ - + GiB gibibytes (1024 mibibytes) ГБ - + TiB tebibytes (1024 gibibytes) ТБ - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + Python не е намерен. + + + + Python version: %1 + Python версия: %1 + + + /s per second - + %1h %2m e.g: 3hours 5minutes %1ч%2мин - + %1d %2h e.g: 2days 10hours %1д%2ч - + Unknown Unknown (size) Неизвестен - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent ще угаси компютъра, защото всички сваляния са завършени. - + < 1m < 1 minute < 1мин - + %1m e.g: 10minutes %1мин + + + Working + Работи + + + + Updating... + Обновяване... + + + + Not working + Не работи + + + + Not contacted yet + Още не е свързан + preview - + Preview selection Оглед на избраното - + The following files support previewing, please select one of them: Следните файлове поддържат предварителен преглед, моля, изберете един от тях: + + + Preview + Оглед + + + + Cancel + Прекъсни + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_ca.ts qbittorrent-3.3.15/src/lang/qbittorrent_ca.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_ca.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_ca.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - Quant a qBittorrent + Quant al qBittorrent - + About Quant a - + Author Autor - - Current maintainer - Mantenidor actual - - - - Greece - Grècia - - - - + + Nationality: Nacionalitat: - - + + + Name: + Nom: + + + + E-mail: Correu electrònic: - - - Name: - Nom: + + Greece + Grècia - - Original author - Autor original + + Current maintainer + Mantenidor actual - - France - França + + Original author + Autor original - + Special Thanks Agraïments especials - + Translators Traductors - - License - Llicència - - - + Libraries Biblioteques - + qBittorrent was built with the following libraries: El qBittorrent s'ha construït amb les biblioteques següents: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - Un client BitTorrent avançat programat en C++, basat en el joc d'eines Qt i libtorrent-rasterbar. - - - - Copyright %1 2006-2018 The qBittorrent project - Copyright %1 2006-2018, El projecte qBittorrent - - - - Home Page: - Pàgina principal: - - - - Forum: - Fòrum: + + France + França - - Bug Tracker: - Rastrejador d'errors: + + License + Llicència @@ -115,69 +90,79 @@ Desa a - + + Browse... + Navega... + + + + Set as default save path + Defineix com a camí per defecte de desat + + + Never show again No ho tornis a mostrar - + Torrent settings Configuració del torrent - + Set as default category Estableix com a categoria predeterminada - + Category: Categoria: - + Start torrent Inicia el torrent - + Torrent information Informació del torrent - + Skip hash check Omet la comprovació del resum (hash) - + Size: Mida: - + Hash: Resum: - + Comment: Comentari: - + Date: Data: Torrent Management Mode: - Mode de gestió de torrents + Mode de Gestió dels Torrents Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - El mode automàtic significa que diverses propietats dels torrents (p. ex. camins de desament) es decidiran segons la categoria associada. + El Mode Automàtic significa que diverses propietats dels torrent (p.ex. camins de desat) es configuraran segons la categoria associada. @@ -190,234 +175,219 @@ Automàtic - - Remember last used save path - Recorda l'últim camí de desament usat - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - Si està marcat, el fitxer .torrent no se suprimirà malgrat els paràmetres de la pàgina «Baixades» al diàleg d'opcions. + Si està marcat, el fitxer .torrent no s'esborrarà malgrat els paràmetres de la pàgina "Baixades" al diàleg d'opcions. - + Do not delete .torrent file - No suprimeix el fitxer .torrent - - - - Create subfolder - Crea una subcarpeta - - - - Download in sequential order - Baixa en ordre seqüencial - - - - Download first and last pieces first - Baixa primer el primer i l'últim tros. + No esborreu el fitxer -torrent - + Normal Normal - + High Alta - + Maximum Màxima - + Do not download No ho baixis - - - + + + I/O Error - Error d'entrada / sortida + Error d'entrada-sortida - + Invalid torrent - Torrent no vàlid - - - - Renaming - Canvi de nom + Torrent invàlid - - - Rename error - Error de canvi de nom + + + + + Already in download list + Ja és a la llista de baixades - - The name is empty or contains forbidden characters, please choose a different one. - El nom està buit o conté caràcters prohibits. Si us plau, trieu-ne un altre de diferent. - - - + Not Available This comment is unavailable No disponible - + Not Available This date is unavailable No disponible - + Not available No disponible - + Invalid magnet link - Enllaç magnètic no vàlid + Enllaç magnet invàlid. - + The torrent file '%1' does not exist. - No existeix el fitxer de torrent «%1». + No existeix el fitxer torrent '%1'. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. No s'ha pogut llegir el fitxer torrent '%1' des del disc. És possible que no teniu suficients permissos. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' ' characters. They insert a newline. - No ha estat possible carregar el torrent: %1 + No ha estat possible carregar el Torrent: %1 Error: %2 - - This magnet link was not recognized - Aquest enllaç magnètic no s'ha reconegut. + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + El torrent ja és a la llista de baixades. Els rastrejadors no s'han fusionat perquè és un torrent privat. - - Magnet link - Enllaç magnètic + + Torrent is already in download list. Trackers were merged. + El torrent ja és a la llista de baixades. S'han fusionat els rastrejadors. - - Retrieving metadata... - Rebent les metadades... + + + Cannot add torrent + No es pot afegir el torrent - - Not Available - This size is unavailable. - No disponible + + Cannot add this torrent. Perhaps it is already in adding state. + No s'ha pogut afegir aquest torrent. Potser està en estat d'addició. - - Free space on disk: %1 - Espai lliure al disc: %1 + + This magnet link was not recognized + Aquest enllaç magnet no s'ha reconegut. - - Choose save path - Trieu el camí de desament + + Magnet link is already in download list. Trackers were merged. + El torrent ja és a la llista de baixades. S'han fusionat els rastrejadors. + + + + Cannot add this torrent. Perhaps it is already in adding. + No s'ha pogut afegir aquest torrent. Potser ja s'està afegint. - - - - - - - Torrent is already present - El torrent ja hi és. + + Magnet link + Enllaç magnet - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - El torrent "%1" ja és a la llista de transferècia. Els rastrejadors no s'han fusionat perquè és un torrent privat. + + Retrieving metadata... + S'estan rebent les metadades... - - Torrent '%1' is already in the transfer list. Trackers have been merged. - El torrent "%1" ja és a la llista de transferència. Els rastrejadors s'han fusionat. + + Not Available + This size is unavailable. + No disponible - - Torrent is already queued for processing. - El torrent ja és a la cua per processar. + + Free space on disk: %1 + Espai lliure en el disc: %1 - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - L'enllaç magnètic "%1" ja és a la llista de transferència. Els rastrejadors s'han fusionat. + + + Choose save path + Seleccioneu camí de desat - - Magnet link is already queued for processing. - L'enllaç magnètic ja és a la cua per processar + + Rename the file + Canvia el nom del fitxer - + New name: Nom nou: - - + + + The file could not be renamed + No es pot canviar el nom del fitxer + + + + This file name contains forbidden characters, please choose a different one. + Aquest nom de fitxer conté caràcters no admesos, escolliu un de diferent. + + + + This name is already in use in this folder. Please use a different name. - Aquest nom ja s'usa en aquesta carpeta. Utilitzeu-ne un de diferent. + Aquest nom ja és en ús en aquesta carpeta. Utilitzeu-ne un de diferent. - + The folder could not be renamed No es pot canviar el nom de la carpeta - + Rename... - Canvia'n el nom... + Canvia el nom... - + Priority Prioritat - + Invalid metadata Metadades no vàlides - + Parsing metadata... - Analitzant les metadades... + S'estan analitzant les metadades... - + Metadata retrieval complete S'ha completat la recuperació de metadades - + Download Error Error de baixada @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Mida de la memòria cau d'escriptura del disc + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] - Ports de sortida (Min.) [0: desactivat] + Ports de sortida (Min) [0: Desactivat] - + Outgoing ports (Max) [0: Disabled] - Ports de sortida (Màx.) [0: desactivat] + Ports de sortida (Max) [0: Desactivat] - + Recheck torrents on completion Verifica el torrents completats - + Transfer list refresh interval Interval d'actualització de la llista de transferència - + ms milliseconds ms - + Setting Configuració - + Value Value set for this setting Valor - - - (disabled) - (inhabilitat) - - - + (auto) - (automàtic) - - - - min - minutes - min + (auto) - + All addresses - Totes les adreces + Adreces. - + qBittorrent Section - Secció de qBittorrent + Secció qBittorrent - - + + Open documentation Obre la documentació - + libtorrent Section - Secció de libtorrent - - - - Asynchronous I/O threads - Fils d'E/S asincrònics - - - - Disk cache - Cau del disc + Secció libtorrent - + s seconds s - + Disk cache expiry interval Interval d'expiració de la memòria cau del disc - + Enable OS cache - Habilita la memòria cau del sistema operatiu. - - - - Guided read cache - Lectura de cau guiada - - - - Coalesce reads & writes - Fusiona les lectures i escriptures + Habilita memòria cau del sistema operatiu - - Send upload piece suggestions - Envia suggeriments de càrrega de trossos - - - - - KiB - KiB - - - - Send buffer watermark - Envia la marca d'aigua de la memòria intermèdia - - - - Send buffer low watermark - Envia la marca d'aigua feble de la memòria intermèdia - - - - Send buffer watermark factor - Envia el factor la marca d'aigua de la memòria intermèdia - - - - Prefer TCP - Prefereix TCP - - - - Peer proportional (throttles TCP) - Proporcional als clients (acceleració de TCP) - - - - Allow multiple connections from the same IP address - Permet connexions múltiples des de la mateixa adreça IP + + m + minutes + m - + Resolve peer countries (GeoIP) - Resol els països dels clients (GeoIP) + Resol els països en xarxa de punt a punt (GeoIP) - + Resolve peer host names - Resol els noms d'amfitrió dels clients + Resol els noms d'hostes en xarxa de punt a punt - + Strict super seeding - Supersembra estricta + Sembra super estricta - + Network Interface (requires restart) - Interfície de xarxa (requereix reiniciar) + Interfície de xarxa (requereix reinici) - + Optional IP Address to bind to (requires restart) - Adreça IP opcional per vincular (requereix un reinici) + - + Listen on IPv6 address (requires restart) Contacta en adreça IPv6 (requereix reinici) - + Display notifications - Mostra notificacions + Mostreu notificacions - + Display notifications for added torrents - Mostra notificacions per als torrents afegits + Mostreu notificacions per als torrents afegits - + Download tracker's favicon - Baixa la icona de web del rastrejador - - - - Save path history length - Llargada de l'historial de camins de desament - - - - Fixed slots - Ranures fixes - - - - Upload rate based - Segons la taxa de pujada - - - - Upload slots behavior - Comportament de les ranures de pujada - - - - Round-robin - Algoritme Round-robin - - - - Fastest upload - La pujada més ràpida - - - - Anti-leech - Antisangoneres - - - - Upload choking algorithm - Algorisme d'ofec de pujada + - + Confirm torrent recheck Confirma la comprovació del torrent - - Confirm removal of all tags - Confirmació de supressió de totes les etiquetes - - - - Always announce to all trackers in a tier - Sempre anuncia a tots els rastrejadors en un nivell + Exchange trackers with other peers + Intercanvia els rastrejadors amb altres punts de la xarxa - - Always announce to all tiers - Sempre anuncia a tots els nivells + + Always announce to all trackers + Comunica sempre amb tots els rastrejadors - + Any interface i.e. Any network interface Qualsevol interfície - + Save resume data interval How often the fastresume file is saved. Desa l'interval de represa de dades - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - Algorisme de mode mesclat %1-TCP - - - + Maximum number of half-open connections [0: Unlimited] - Nombre màxim de connexions mig obertes [0: il·limitades] + Nombre màxim de connexions mig-obertes [0: il·limitades] - + IP Address to report to trackers (requires restart) - Adreça IP per notificar als rastrejadors (requereix reinici) + Adreça IP per a notificar als rastrejadors (requereix reinici) - + Enable embedded tracker Habilita el rastrejador integrat - + Embedded tracker port Port d'integració del rastrejador - + Check for software updates Cerca actualitzacions del programari - + Use system icon theme Utilitza les icones del tema del sistema @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 iniciat - + Torrent: %1, running external program, command: %2 - Torrent: %1, s'executa un programa extern, ordre: %2 - - - - Torrent name: %1 - Nom del torrent: %1 - - - - Torrent size: %1 - Mida del torrent: %1 - - - - Save path: %1 - Camí de desament: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - El torrent s'ha baixat: %1. - - - - Thank you for using qBittorrent. - Gràcies per utilitzar el qBittorrent. + - - [qBittorrent] '%1' has finished downloading - [qBittorrent] "%1" ha acabat de baixar. + + Torrent: %1, run external program command too long (length > %2), execution failed. + - + Torrent: %1, sending mail notification Torrent: %1, enviant notificació per e-mail - + Information Informació - - To control qBittorrent, access the Web UI at %1 - Per a controlar el qBittorrent, accediu a la interfície web a %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + Per a controlar el qBittorrent, accediu a la interfície web a http://localhost:%1 - + The Web UI administrator user name is: %1 El nom d'usuari de l'administrador de la interfície web és: %1 - + The Web UI administrator password is still the default one: %1 La contrasenya de l'administrador de la interfície web encara és l'original: %1 - + This is a security risk, please consider changing your password from program preferences. Això és un risc de seguretat, considereu canviar la vostra contrasenya a la configuració del programa. - + Saving torrent progress... - Desant el progrés del torrent... - - - - Portable mode and explicit profile directory options are mutually exclusive - El mode portable i les opcions explícites de perfil de directori són mútuament excloents. - - - - Portable mode implies relative fastresume - El mode portable implica una represa ràpida relativa. - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - Ha fallat l'entrada a l'API web. Raó: la IP s'ha prohibit. IP: %1. Nom d'usari: %2 - - - - Your IP address has been banned after too many failed authentication attempts. - La vostra adreça IP ha estat bandejada després de massa intents d'autenticació fallits - - - - WebAPI login success. IP: %1 - Entrada correcta a l'API web. IP: %1 - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - Ha fallat l'entrada a l'API web. Raó: credencials no vàlides. Compte d'intents: %1. IP: %2. Nom d'usari: %3 + S'està desant el progrés del torrent... AutomatedRssDownloader - + Save to: Desa a: @@ -861,837 +658,696 @@ Baixades per RSS - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - Ara la baixada de torrents RSS està inhabilitada! Podeu habilitar-la als paràmetres de l'aplicació. + + Enable Automated RSS Downloader + Habilita les baixades per RSS automatizades - + Download Rules Regles de baixada - + Rule Definition Definició de la regla - + Use Regular Expressions Utilitza expressions regulars - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - El filtre d'episodis intel·ligent comprovarà el número d'episodi per a evitar de baixar-ne duplicats. -Admet els formats: S01E01, 1x1, 2017.01.01 i 01.01.2017 (també es reconeix - com a separador en els formats de data) - - - - Use Smart Episode Filter - Usa el filtre d'episodi intel·ligent - - - + Must Contain: Ha de contenir: - + Must Not Contain: No ha de contenir: - + Episode Filter: Filtra l'episodi: - + Assign Category: Assigna la categoria: - + Save to a Different Directory Desa en un directori diferent - + Ignore Subsequent Matches for (0 to Disable) ... X days Ignora les coincidències subseqüents durant (0 per a desactivar) - + Disabled - Inhabilitat + Deshabilitat - + days dies - + Add Paused: - Afegeix en pausa: + Afegeix pausada: - + Use global settings Utilitza la configuració global - + Always Sempre - + Never Mai - + Apply Rule to Feeds: - Aplica la regla als canals: + Aplica la regla de canals: - + Matching RSS Articles - Coincidència d'articles RSS + Coincidència de canals RSS - + &Import... &Importació... - + &Export... &Exportació... - + Matches articles based on episode filter. Emparella articles basant-se en el filtre d'episodis. - + Example: Exemple: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match emparellarà 2, 5 i 8 a través del 15 i 30 i els propers episodis de la primera temporada - + Episode filter rules: Regles del filtre d'episodis: - + Season number is a mandatory non-zero value - El número de temporada ha de ser un valor diferent de zero. + El número de temporada ha de ser un valor diferent de zero + + + Episode number is a mandatory non-zero value + El número d'episodi ha de ser un valor diferent de zero - + Filter must end with semicolon - El filtre ha d'acabar en punt i coma. + El filtre ha d'acabar en punt i coma - + Three range types for episodes are supported: - S'admeten tres tipus d'intervals per als episodis: + S'admeten tres tipus de rangs d'episodis: - + Single number: <b>1x25;</b> matches episode 25 of season one - Un únic número: <b>1x25;<b> emparella l'episodi 25 de la temporada u. + Un únic número: <b>1x25;<b> emparella l'episodi 25 de la temporada u - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one - Interval normal: <b>1x25-40;<b> emparella de l'episodi 25 al 40 de la primera temporada. - - - - Episode number is a mandatory positive value - El número d'episodi ha de ser un valor positiu. + Interval normal: <b>1x25-40;<b> emparella de l'episodi 25 al 40 de la primera temporada - - Rules - Regles + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Interval infinit: <b>1x25-;</b> emparella l'episodi 25 i els propers de la primera temporada - - Rules (legacy) - Regles (llegat) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Interval infinit: <b>1x25-;</b> emparella 25 episodis i més enllà de la primera temporada, i tots els episodis de les darreres temporades. + - + Last Match: %1 days ago Darrer aparellament: fa %1 dies - + Last Match: Unknown Darrer aparellaent: desconegut - + New rule name Nom de la nova regla - + Please type the name of the new download rule. Escriviu el nom de la nova regla de baixada. - - + + Rule name conflict Conflicte amb el nom de la regla - - + + A rule with this name already exists, please choose another name. Ja existeix una regla amb aquest nom, trieu-ne un altre. - + Are you sure you want to remove the download rule named '%1'? - Segur que voleu suprimir la regla de baixada anomenada «%1»? + Esteu segur que voleu suprimir la regla de baixada anomenada «%1»? - + Are you sure you want to remove the selected download rules? - Segur que voleu suprimir les regles de baixada seleccionades? + Esteu segur que voleu suprimir les regles de baixada seleccionades? - + Rule deletion confirmation Confirmació de supressió de la regla - + Destination directory Directori de destinació - + Invalid action Acció no vàlida - + The list is empty, there is nothing to export. La llista està buida, no hi ha res per exportar. - - Export RSS rules - Exporta regles d'RSS + + Where would you like to save the list? + On voleu desar la llista? - - + + Rules list (*.rssrules) + Llista de regles (*.rssrules) + + + I/O Error - Error d'entrada / sortida + Error d'entrada-sortida - - Failed to create the destination file. Reason: %1 - Ha fallat crear el fitxer de destinació. Raó: %1. + + Failed to create the destination file + No s'ha pogut crear el fitxer de destinació - - Import RSS rules - Importa regles d'RSS + + Please point to the RSS download rules file + Seleccioneu el fitxer de regles de baixada de canals RSS - - Failed to open the file. Reason: %1 - Ha fallat obrir el fitxer. Raó: %1 + + Rules list + Llista de regles - + Import Error - Error d'importació + Error al importar - - Failed to import the selected rules file. Reason: %1 - Ha fallat importar el fitxer de regles seleccionat. Raó: %1. + + Failed to import the selected rules file + No s'ha pogut importar el fitxer de la regla seleccionada - + Add new rule... Afegeix una regla nova... - + Delete rule Suprimeix la regla - + Rename rule... Canvia el nom de la regla... - + Delete selected rules Suprimeix les regles seleccionades - - Clear downloaded episodes... - Neteja els episodis baixats... - - - + Rule renaming Canvi de nom de la regla - + Please type the new rule name - Escriviu el nou nom de la regla - - - - Clear downloaded episodes - Neteja els episodis baixats - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - Segur que voleu netejar la llista d'episodis baixats per a la regla seleccionada? - - - - Regex mode: use Perl-compatible regular expressions - Mode d'expressió regular: usa expressions regulars compatibles amb Perl + Escriviu el nom de la regla nova - - - Position %1: %2 - Posició: %1: %2 + + Regex mode: use Perl-like regular expressions + Mode d'expr. regulars: utilitza expressions regulars del tipus Perl - + Wildcard mode: you can use - Mode de comodí: podeu usar + - + ? to match any single character - ? per substituir qualsevol caràcter simple + - + * to match zero or more of any characters - * per substituir o bé res o bé qualsevol altre nombre de caràcters. + - + Whitespaces count as AND operators (all words, any order) - Els espais en blanc compten com a operadors I (totes les paraules, en qualsevol ordre) + - + | is used as OR operator - | s'usa com a operador OR + - + If word order is important use * instead of whitespace. - Si l'ordre de paraules és important, useu * en comptes de l'espai en blanc. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Una expressió amb una subordinada %1 buida (p. e. %2) + - + will match all articles. - coincidirà amb tots els articles. + - + will exclude all articles. - exclourà tots els articles. - - - - BanListOptionsDialog - - - List of banned IP addresses - Llistat d'adreces IP prohibides - - - - Ban IP - Prohibeix la IP - - - - Delete - Suprimeix - - - - - Warning - Avís + - - The entered IP address is invalid. - La adreça IP introduïda no és vàlida. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Ús de comodins: es pot usar<ul><li>? perquè coincideixi amb qualsevol caràcter individual</li><li>* per fer coincidir zero o més dels caràcters</li><li> com Espais en blanc i</li></ul> per al operadore AND - - The entered IP is already banned. - L'adreça IP que heu introduït ja estava prohibida. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Ús de comodins: es pot usar<ul><li>? perquè coincideixi amb qualsevol caràcter individual</li><li>* per fer coincidir zero o més dels caràcters</li><li> com Espais en blanc i</li></ul> per al operadore OR BitTorrent::Session - + Restart is required to toggle PeX support És necessari reiniciar per activar suport PeX - - Could not get GUID of configured network interface. Binding to IP %1 - No s'ha pogut obtenir el GUID de la interfície de xarxa configurada. Es vincula a la IP %1. - - - + Embedded Tracker [ON] - Rastrejador integrat [activat] + Rastrejador integrat [Encès] - + Failed to start the embedded tracker! - Error en iniciar el rastrejador integrat! + Error en iniciar el rastrejador integratt! - + Embedded Tracker [OFF] - Rastrejador integrat [apagat] + Rastrejador integrat [Apagat] - + + '%1' reached the maximum ratio you set. Removing... + «%1» ha assolit el ràtio màxim establert. S'està suprimint... + + + + '%1' reached the maximum ratio you set. Pausing... + %1 ha assolit el ràtio màxim establert. Pausant... + + + System network status changed to %1 e.g: System network status changed to ONLINE Estat de la xarxa del sistema canviat a %1 - + ONLINE EN LÍNIA - + OFFLINE FORA DE LÍNIA - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding - S'ha canviat la configuració de xarxa de %1, es reinicia la vinculació de la sessió. + S'ha canviat la configuració de xarxa de %1, reinicieu la vinculació de la sessió - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. L'adreça %1 de la interfície de la xarxa configurada no és vàlida. - - + Encryption support [%1] - Suport per al xifratge [%1] + - - + FORCED - FORÇAT + - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 no és una adreça IP vàlida i s'ha rebutjat en intentar aplicar-la al llistat d'adreces prohibides. + + Anonymous mode [%1] + - - - Anonymous mode [%1] - Mode anònim [%1] - - - + Unable to decode '%1' torrent file. - No s'han pogut descodificar «%1» fitxers de torrent. + No s'han pogut descodificar «%1» fitxer torrent. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Baixada recursiva del fitxer «%1» integrat al torrent «%2» - + Queue positions were corrected in %1 resume files - Les posicions de la cua s'han corregit en %1 fitxers de represa + - + Couldn't save '%1.torrent' No s'ha pogut desar «%1.torrent» - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - "%1" s'ha suprimit de la llista de transferència. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - "%1" s'ha suprimit de la llista de transferència i del disc. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - "%1" s'ha suprimit de la llista de transferència però no se n'han pogut suprimir els fitxers. Error: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. - perquè %1 està inhabilitat. + perquè %1 es troba inhabilitat. - + because %1 is disabled. this peer was blocked because TCP is disabled. - perquè %1 està inhabilitat. + perquè %1 es troba inhabilitat. - + URL seed lookup failed for URL: '%1', message: %2 - Ha fallat la cerca d'URL de llavor per a l'URL: %1, missatge: %2 + Ha fallat la cerca de llavor per a la URL: %1, missatge: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. El qBittorrent no ha pogut escoltar el port %2%3 de la interfície %1. Raó: %4 - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + S'ha suprimit «%1» de la llista de transferència i del disc. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + S'ha suprimit «%1» de la llista de transferència. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... - Baixant «%1»; espereu, si us plau... + S'està baixant «%1», espereu... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 - El qBittorrent està intentant contactar amb algun port d'interfície: %1 + El qBittorrent està intentant contactar a algun port interfície: %1 - + The network interface defined is invalid: %1 La interfície de la xarxa definida no és vàlida:%1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 - El qBittorrent està intentant contactar amb la interfície %1 del port: %2 - - - - Peer ID: - Identitat del client: - - - - HTTP User-Agent is '%1' - L'agent d'usuari d'HTTP és "%1" + El qBittorrent està intentant contactar a l'interfície %1 del port: %2 - - + DHT support [%1] - Suport de DHT [%1] + - - - - - - - - - + + + + ON - + - - - - - - - - - + + + + OFF - NO + - - + Local Peer Discovery support [%1] - Suport local de descobriment de clients [%1] - - - - PeX support [%1] - Suport per a PeX [%1] - - - - '%1' reached the maximum ratio you set. Removed. - "%1" ha assolit a la ràtio màxima que heu establert. Suprimit. - - - - '%1' reached the maximum ratio you set. Paused. - "%1" ha assolit a la ràtio màxima que heu establert. Pausat. - - - - '%1' reached the maximum seeding time you set. Removed. - "%1" ha assolit el temps de sembra màxim que heu establert. Suprimit. - - - - '%1' reached the maximum seeding time you set. Paused. - "%1" ha assolit el temps de sembra màxim que heu establert. Pausat. + - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on - El qBittorrent no ha trobat una adreça local %1 per a contactar-hi + ElqBittorrent no ha trobat una adreça local %1 per a contactar - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface - El qBittorrent ha fallat en intentar contactar amb algun port d'interfície: %1. Raó: %2 + qBittorrent ha fallat en intentar contactar a algun port interfície: %1. Raó: %2 - + Tracker '%1' was added to torrent '%2' S'ha afegit el rastrejador «%1» al torrent «%2» - + Tracker '%1' was deleted from torrent '%2' S'ha suprimit el rastrejador «%1» del torrent «%2» - + URL seed '%1' was added to torrent '%2' - S'ha afegit l'URL de llavor «%1» al torrent «%2» + S'ha afegit la llavor URL «%1» al torrent «%2» - + URL seed '%1' was removed from torrent '%2' - S'ha suprimit l'URL de llavor «%1» del torrent «%2» + S'ha suprimit la llavor URL «%1» del torrent «%2» - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Impossible reprendre el torrent «%1». - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - S'ha analitzat satisfactòriament el filtre IP: s'han aplicat %1 regles. + Analitzat satisfactòriament el filtre IP: s'han aplicat %1 regles. - + Error: Failed to parse the provided IP filter. Error: Ha fallat l'anàlisi del filtre IP proporcionat. - - '%1' restored. - 'torrent name' restored. - "%1" restaurat. + + Couldn't add torrent. Reason: %1 + No s'ha pogut afegir el torrent: '%1'. Raó: %2 - - Couldn't add torrent. Reason: %1 - No s'ha pogut afegir el torrent: "%1". Raó: %2 + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + «%1» reprès. (represa ràpida) - + '%1' added to download list. 'torrent name' was added to download list. '%1' afegit a la llista de baixades. - + An I/O error occurred, '%1' paused. %2 - S'ha produït un error d'entrada / sortida, "%1" en pausa. %2 + S'ha produït un error d'entrada-sortida, '%1' pausat. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Ha fallat el mapatge del port, missatge: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Mapatge del port reeixit, missatge: %1 - + due to IP filter. this peer was blocked due to ip filter. - a causa del filtre IP. + degut al filtre IP. - + due to port filter. this peer was blocked due to port filter. - a causa del filtre de ports. + degut al filtre de ports. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. - a causa de restriccions de mode mixtes i2p. + degut a restriccions mixtes i2p. - + because it has a low port. this peer was blocked because it has a low port. perquè te un port baix. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 - El qBittorrent està contactant satisfactòriament amb la interfície %1 del port: %2%3 + El qBittorrent està contactant satisfactòriament en la interfície %1 del port: %2%3 - + External IP: %1 e.g. External IP: 192.168.0.1 IP externa: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - ha fallat la creació del nou fitxer torrent - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - Baixa primer el primer i l'últim tros: %1, torrent: %2 - - - - On - Activat - - - - Off - Desactivat - - - - Successfully moved torrent: %1. New path: %2 - Torrent mogut correctament: %1. Camí nou: %2 - - - + Could not move torrent: '%1'. Reason: %2 - No s'ha pogut moure el torrent: %1. Raó: %2 + No s'ha pogut moure el torrent: '%1'. Raó: %2 - + File sizes mismatch for torrent '%1', pausing it. - No hi ha coincidència de mides de fitxer per al torrent %1. Es posa en pausa. + La mida del fitxer no coincideix amb el torrent «%1», es posa en pausa. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - S'han rebutjat les dades per a la represa ràpida del torrent %1. Raó: %2. Es comprova de nou... + S'han negat les dades per a la represa ràpida del torrent «%1». Raó: %2. S'està comprovant de nou... CategoryFilterModel - + Categories - Categories + Categories - + All - Totes + Tots - + Uncategorized - Sense categoria + @@ -1699,42 +1355,147 @@ Add category... - Afegeix una categoria... + Afegeix una categoria... Add subcategory... - Afegeix una subcategoria... + - Edit category... - Edita la categoria... + Remove category + Suprimeix la categoria + + + + Remove unused categories + Suprimeix categories no utilitzades + + + + Resume torrents + Reprèn els torrents + + + + Pause torrents + Pausa els torrents + + + + Delete torrents + Suprimeix els torrents + + + + New Category + Categoria nova + + + + Category: + Categoria: + + + + Invalid category name + El nom de la categoria no és vàlid + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + El nom de la categoria no ha d'incluore'\' +El nom de la categoria no ha començar ni acabar amb '/' +El nom de la categoria no ha d'incloure la seqüència '//' + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Tots (0) + + + Uncategorized (0) + Sense categoria (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Sense categoria (%1) + + + Add category... + Afegeix una categoria... - Remove category - Suprimeix la categoria + Suprimeix la categoria - Remove unused categories - Suprimeix les categories no utilitzades + Suprimeix categories no utilitzades - Resume torrents - Reprèn els torrents + Reprèn els torrents - Pause torrents - Pausa els torrents + Pausa els torrents - Delete torrents - Suprimeix els torrents + Suprimeix els torrents + + + New Category + Categoria nova + + + Category: + Categoria: + + + Invalid category name + El nom de la categoria no és vàlid + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + El nom de la categoria no ha d'incluore'\' +El nom de la categoria no ha començar ni acabar amb '/' +El nom de la categoria no ha d'incloure la seqüència '//' + + + All (%1) + this is for the category filter + Tots (%1) @@ -1742,7 +1503,7 @@ Manage Cookies - Gestió de galetes + Gestió de Galetes @@ -1774,617 +1535,574 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Confirmació de supressió - - - - Remember choice - Recorda sempre aquesta tria - - - - Also delete the files on the hard disk - Suprimeix també els fitxers del disc dur - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - Segur que voleu suprimir «%1» de la llista de transferència? + Esteu segur que voleu suprimir «%1» de la llista de transferència? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - Segur que voleu suprimir aquests %1 torrents de la llista de transferència? - - - - DownloadFromURLDialog - - - Download from URLs - Baixa des d'URLs - - - - Add torrent links - Afegeix enllaços de torrent - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - Un enllaç per línia (es permeten enllaços d'HTTP, enllaços magnètics i informació de funcions resum (hash)) - - - - Download - Baixa - - - - No URL entered - No s'ha escrit cap URL. - - - - Please type at least one URL. - Si us plau, escriviu almenys un URL. + Esteu segur que voleu suprimir aquests %1 torrents de la llista de transferència? DownloadedPiecesBar - + White: Missing pieces - Blanc: trossos que falten + Blanc: manquen parts - + Green: Partial pieces - Verd: trossos parcials + Verd: parts parcials - + Blue: Completed pieces - Blau: trossos completats + Blau: parts completades - ExecutionLogWidget + ExecutionLog - + General General - + Blocked IPs - IP bloquejades + IPs bloquejades - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - <font color='red'>%1</font> s'ha blocat %2 + <font color='red'>%1</font> ha estat blocat %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - <font color='red'>%1</font> s'ha prohibit + <font color='red'>%1</font> ha estat bandejat FeedListWidget - + RSS feeds Canals RSS - - - Unread (%1) - Sense llegir (%1) + + Unread + No llegits FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - S'ha produït un error en intentar obrir el fitxer de registre. S'ha desactivat el fitxer de registre. - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - &Navega... - - - - Choose a file - Caption for file open/save dialog - Trieu un fitxer - - - - Choose a folder - Caption for directory open dialog - Trieu una carpeta - - - - Any file - Qualsevol fitxer + + An error occured while trying to open the log file. Logging to file is disabled. + Error en intentar obrir el fitxer de diari. L'enregistrament al fitxer està desactivat. FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - Error d'entrada / sortida: no s'ha pogut obrir el fitxer de filtres IP en mode de lectura. - - - - - - IP filter line %1 is malformed. - La línia %1 de filtre de la IP està malformada. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - La línia %1 de filtre de la IP està malformada. La IP de l'inici de l'interval està malformada. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - La línia %1 de filtre de la IP està malformada. La IP del final de l'interval està malformada. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - La línia %1 de filtre de la IP està malformada. Una IP és IPv4 i l'altra és IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - S'ha produït l'excepció de filtre IP a la línia %1. L'excepció és %2 + + + + I/O Error: Could not open ip filter file in read mode. + Error d'entrada-sortida: No s'ha pogut obrir el fitxer de filtres IP en mode lectura. - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - Hi ha hagut %1 errors d'anàlisi de filtre IP extra. - - - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. - Error d'anàlisi: el fitxer de filtre no és un fitxer de PeerGuardian P2B vàlid. + Error d'anàlisi: el fitxer de filtre no és un fitxer PeerGuardian P2B vàlid. GeoIPDatabase - - + + Unsupported database file size. La mida del fitxer de base de dades no és suportada. - + Metadata error: '%1' entry not found. Error de metadades: «%1» entrades no trobades. - + Metadata error: '%1' entry has invalid type. - Error de metadades: «%1» entrades tenen una escriptura no vàlida. + Error de metadades: «%1» entrades tenen una escriptura invàlida. - + Unsupported database version: %1.%2 Versió de base de dades no suportada: %1.%2 - + Unsupported IP version: %1 Versió IP no suportada: %1 - + Unsupported record size: %1 Mida de registre no suportada: %1 - + Invalid database type: %1 - Tipus de base de dades no vàlida: %1 + Entrada de base de dades invàlida: %1 - + Database corrupted: no data section found. Base de dades corrupta: no s'ha trobat secció de dades. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - La mida de la petició http excedeix el límit. Es tanca la connexió. Límit: %ld, IP:%s + + File + Fitxer - - Bad Http request, closing socket. IP: %s - Petició http errònia, es tanca la connexió. IP:%s + + Edit + Edita - - - HttpServer - + + Help + Ajuda + + + Exit qBittorrent Surt del qBittorrent - + Only one link per line Només un enllaç per línia - + + Download + Baixa + + + Global upload rate limit must be greater than 0 or disabled. El límit de pujada ha de ser major que 0 o estar inhabilitat. - + Global download rate limit must be greater than 0 or disabled. El límit de baixada ha de ser major que 0 o estar inhabilitat. - + Alternative upload rate limit must be greater than 0 or disabled. El límit de pujada alternatiu ha de ser major que 0 o estar inhabilitat. - + Alternative download rate limit must be greater than 0 or disabled. El límit de baixada alternativa ha de ser major que 0 o estar inhabilitat. - + Maximum active downloads must be greater than -1. El màxim de baixades actives ha de ser major de -1. - + Maximum active uploads must be greater than -1. El màxim de pujades actives ha de ser major de -1. - + Maximum active torrents must be greater than -1. El màxim de torrents actius ha de ser major de -1. - + Maximum number of connections limit must be greater than 0 or disabled. El nombre màxim del limiti de connexions ha de ser major que 0 o estar inhabilitat. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. El nombre màxim del limit de connexions per torrent ha de ser major que 0 o estar inhabilitat. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. El nombre màxim de pujades de ranures per torrent ha de ser major que 0 o estar inhabilitat. - + Unable to save program preferences, qBittorrent is probably unreachable. No es poden desar les preferències del programa, probablement el qBittorrent no és accessible. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent a Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - Nom de categoria no vàlid: -Si us plau, no useu caràcters especials al nom de la categoria. - - - - Unknown - Desconegut - - - - Hard Disk - Disc dur - - - - Share ratio limit must be between 0 and 9998. - El límit de la ràtio de compartició ha de ser entre 0 i 9998. - - - - Seeding time limit must be between 0 and 525600 minutes. - El límit de la sembra ha de ser entre 0 i 525600 minuts. + + Language + Idioma - + The port used for incoming connections must be between 1 and 65535. El port utilitzat per a connexions entrants ha de ser major de 1024 i menor de 65535. - + The port used for the Web UI must be between 1 and 65535. El port utilitzat per a la interfície d'usuari web ha de ser major de 1024 i menor de 65535. - + Unable to log in, qBittorrent is probably unreachable. No ha estat possible iniciar sessió, el qBittorrent deu estar il·localitzable en aquests moments. - + Invalid Username or Password. Nom d'usuari o contrasenya incorrectes. - - Username - Nom d'usuari - - - + Password Contrasenya - + Login Inicia sessió - + + Upload Failed! + Pujada fallida! + + + Original authors Autors originals - + + Upload limit: + Límit de pujada: + + + + Download limit: + Límit de baixada: + + + Apply Aplica - + Add Afegeix - + + Category: + Categoria: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Puja torrents - + + All + Tots + + + + Downloading + Baixant + + + + Seeding + Sembrant + + + + Completed + Completats + + + + Resumed + Represos + + + + Paused + Pausats + + + + Active + Actius + + + + Inactive + Inactius + + + Save files to location: Desa els fitxers a la ubicació: - + Cookie: Cookie: - + Type folder here Escriviu la carpeta aquí - + + Run an external program on torrent completion + Executar un programa extern en completar el torrent + + + + Enable bandwidth management (uTP) + Habilitar l'administració d'ample de banda (UTP) + + + + Apply rate limit to uTP connections + Aplicar límit de velocitat a les connexions UTP + + + + Alternative Global Rate Limits + Límits taxa mundial alternatius + + + More information Més informació - + Information about certificates Informació sobre certificats - + Save Files to Desa els fitxes a - - Set location - Estableix la ubicació - - - - Limit upload rate - Limita la taxa de pujada + + Watch Folder + Cerca fitxers .torrents - - Limit download rate - Limita la taxa de baixada + + Default Folder + Carpeta predeterminada - - Rename torrent - Canvia de nom el torrent + + from + from time1 to time2 + des - - Unable to create category - + + to + from time1 to time2 + a - + Other... Save Files to: Watch Folder / Default Folder / Other... Altres ... - + + Every day + Schedule the use of alternative rate limits on ... + Cada dia + + + + Week days + Schedule the use of alternative rate limits on ... + Dies de la setmana + + + + Week ends + Schedule the use of alternative rate limits on ... + Els caps de setmana + + + Monday Schedule the use of alternative rate limits on ... Dilluns - + Tuesday Schedule the use of alternative rate limits on ... Dimarts - + Wednesday Schedule the use of alternative rate limits on ... Dimecres - + Thursday Schedule the use of alternative rate limits on ... Dijous - + Friday Schedule the use of alternative rate limits on ... Divendres - + Saturday Schedule the use of alternative rate limits on ... Dissabte - + Sunday Schedule the use of alternative rate limits on ... Diumenge - + + Downloaded + Is the file downloaded or not? + Baixat + + + Logout Tanca la sessió - + + Download from URLs + Baixa des d'URL + + + Download Torrents from their URLs or Magnet links - Baixa torrents des dels URL o enllaços magnètics + Baixa torrents des de els URL o enllaços magnet - + Upload local torrent Puja torrent locals - + Are you sure you want to delete the selected torrents from the transfer list? - Segur que voleu suprimir els torrent seleccionats de la llista de transferències? + Esteu segur que voleu suprimir els torrent seleccionats de la llista de transferències? - + Save Desa - + qBittorrent client is not reachable El client qBittorrent no és accessible - - qBittorrent has been shutdown. - El qBittorrent s'ha apagat. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Llista de subxarxes IP en llista blanca + + HTTP Server + Servidor HTTP - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Exemple: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Els següents paràmetres són compatibles: - - Add subnet - Afegeix una subxarxa + + Torrent path + Camí del torrent - - Delete - Suprimeix + + Torrent name + Nom del torrent - - Error - Error + + qBittorrent has been shutdown. + El qBittorrent s'ha apagat. + + + LineEdit - - The entered subnet is invalid. - La subxarxa introduïda no és vàlida + + Clear the text + Neteja el text LogListWidget - + Copy Copia - + Clear Neteja @@ -2414,714 +2132,652 @@ On Downloads &Done - En acabar les baixa&des... + A Baixades &Fet - + &View - &Visualitza + &Mostra - + &Options... &Opcions... - + &Resume &Reprèn - + Torrent &Creator &Creador de torrents - + Set Upload Limit... Establiu límit de pujada... - + Set Download Limit... Establiu límit de baixada... - + Set Global Download Limit... Establiu límit de baixada global... - + Set Global Upload Limit... Establiu límit de pujada global... - + Minimum Priority Prioritat mínima - + Top Priority Prioritat màxima - + Decrease Priority - Disminueix-ne la prioritat + Disminuir prioritat - + Increase Priority - Incrementa'n la prioritat + Incrementar prioritat - - + + Alternative Speed Limits Límits de velocitat alternativa - + &Top Toolbar Barra d'eines &superior - + Display Top Toolbar Mostra barra d'eines superior - - Status &Bar - &Barra d'estat - - - + S&peed in Title Bar Mostra v&elocitat a la barra de títol - + Show Transfer Speed in Title Bar Mostra velocitat de transferència a la barra de títol - + &RSS Reader Lector &RSS - + Search &Engine &Motor de cerca - + L&ock qBittorrent B&loca el qBittorrent - + Do&nate! - Feu una do&nació! - - - - Close Window - Tanca la finestra + Do&neu - + R&esume All - R&eprèn-ho tot + R&eprende Tot - + Manage Cookies... Gestió de galetes... - + Manage stored network cookies - Gestió de galetes de xarxa emmagatzemades + Gestió de galetes de xarxa magatzemades. - + Normal Messages Missatges normals - + Information Messages Missatges informatius - + Warning Messages Missatges d'advertència - + Critical Messages Missatges crítics - + &Log &Registre - + &Exit qBittorrent &Tanca el qBittorrent - + &Suspend System &Suspèn el sistema - + &Hibernate System &Hiberna el sistema - + S&hutdown System A&paga el sistema - + &Disabled &Inhabilitat - + &Statistics &Estadístiques - + Check for Updates Cerca actualitzacions - + Check for Program Updates Cerca actualitzacions del programa - + &About &Quant a - + &Pause &Pausa - + &Delete &Suprimeix - + P&ause All - Pausa-ho tot + P&ausa totes - + &Add Torrent File... - &Afegeix un fitxer de torrent... + &Afegeix un fitxer torrent... - + Open Obre - + E&xit T&anca - + Open URL - Obre un URL + Obre l'URL - + &Documentation &Documentació - + Lock Bloca - - - + + + Show Mostra - + Check for program updates Cerca actualitzacions del programa - + Add Torrent &Link... - Afegeix un &enllaç de torrent... + Afegeix l'&enllaç torrent... - + If you like qBittorrent, please donate! Si us agrada el qBittorrent, feu una donació! - - + Execution Log Execució Log - + Clear the password Neteja la contrasenya - + Filter torrent list... Filtra la llista de torrents... - + &Set Password &Estableix contrasenya - - Preferences - Preferències - - - + &Clear Password &Neteja la contrasenya - + Transfers Transferint - - - qBittorrent is minimized to tray - El qBittorrent està minimitzat a la safata. - - - - - - This behavior can be changed in the settings. You won't be reminded again. - Aquest comportament es pot canviar a la configuració. No se us tornarà a recordar. - - - + Torrent file association Associació de fitxers torrent - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? - El qBittorrent no és l'aplicació predeterminada per obrir fitxers torrent o enllaços magnètics. -Voleu que el qBittorrent sigui el programa predeterminat per gestionar aquests fitxers? + El qBittorrent no és l'aplicació predeterminada per a obrir fitxers torrent o enllaços magnet. +¿Voleu que el qBittorrent sigui el programa predeterminat per a gestionar aquests fitxers? - + Icons Only Només icones - + Text Only Només text - + Text Alongside Icons Text al costat de les icones - + Text Under Icons Text sota les icones - + Follow System Style - Segueix l'estil del sistema + Seguir l'estil del sistema - - - + + + UI lock password Contrasenya de bloqueig - - - + + + Please type the UI lock password: Escriviu la contrasenya de bloqueig: - + The password should contain at least 3 characters Com a mínim la contrasenya ha de tenir 3 caràcters - + Password update Actualització de contrasenya - + The UI lock password has been successfully updated La contrasenya de bloqueig del qBittorrent s'ha actualitzat correctament - + Are you sure you want to clear the password? - Segur que voleu netejar la contrasenya? - - - - Use regular expressions - Usa expressions regulars + Esteu segurs que voleu netejar la contrasenya? - + Search Cerca - + Transfers (%1) Transferències (%1) - + Error Error - + Failed to add torrent: %1 No ha estat possible afegir el torrent: %1 - + Torrent added Torrent afegit - + '%1' was added. e.g: xxx.avi was added. S'ha afegit '%1'. - + Download completion Baixada completada - + I/O Error i.e: Input/Output Error - Error d'entrada / sortida + Error d'entrada-sortida - + Recursive download confirmation Confirmació de baixades recursives - + Yes - + No No - + Never Mai - + Global Upload Speed Limit Velocitat límit global de pujada - + Global Download Speed Limit Velocitat límit global de baixada - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - El qBittorrent s'ha actualitzat i s'ha de reiniciar perquè els canvis tinguin efecte. - - - - qBittorrent is closed to tray - El qBittorrent està tancat a la safata. - - - - Some files are currently transferring. - Ara es transfereixen alguns fitxers. - - - - Are you sure you want to quit qBittorrent? - Segur que voleu sortir del qBittorrent? - - - + &No &No - + &Yes &Sí - + &Always Yes &Sempre sí - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - No s'ha pogut determinar la vostra versió de Python. Motor de cerca inhabilitat. - - - + Old Python Interpreter Intèrpret de Python antic - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. La vostra versió de Python (%1) no està actualitzada. Actualitzeu a la darrera versió per que funcionin els motors de cerca. Versió mínima requerida: 2.7.9/3.3.0. - + qBittorrent Update Available Actualització del qBittorrent disponible - + + A new version is available. +Do you want to download %1? + Hi ha una versió nova disponible. +Voleu baixar la versió %1? + + + Already Using the Latest qBittorrent Version Ja feu servir la darrera versió del qBittorrent - + Undetermined Python version Versió de Python no determinada - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. «%1» ha acabat de baixar. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. Reason: disk is full. - S'ha produït un error d'entrada / sortida al torrent «%1». + S'ha produït un error d'entrada-sortida al torrent «%1». Raó: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? El torrent «%1» conté fitxers torrent, voleu seguir endavant amb la baixada? - + Couldn't download file at URL '%1', reason: %2. No s'ha pogut baixar el fitxer en l'URL «%1», raó: %2 - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - S'ha trobat Python a %1: %2 + - - + + Couldn't determine your Python version (%1). Search engine disabled. + No s'ha pogut determinar la vostra versió de Python (%1). Motor de cerca inhabilitat. + + + + Missing Python Interpreter Falta intèrpret Python - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Es requereix Python per a fer servir el motor de cerca i sembla que no el teniu instal·lat. Voleu instal·lar-lo ara? - + Python is required to use the search engine but it does not seem to be installed. Es requereix Python per a fer servir el motor de cerca i sembla que no el teniu instal·lat. - - A new version is available. - Hi ha disponible una nova versió. - - - - Do you want to download %1? - Voleu baixar %1? - - - - Open changelog... - Obre el registre de canvis... - - - + No updates available. You are already using the latest version. No hi ha actualitzacions disponibles. Esteu fent servir la darrera versió. - + &Check for Updates &Cerca actualitzacions - + Checking for Updates... Cercant actualitzacions... - + Already checking for program updates in the background - Ja se cerquen actualitzacions en segon terme. + Ja s'estan cercant actualitzacions en segon terme - + Python found in '%1' Python ha trobat en %1 - + Download error Error de baixada - + Python setup could not be downloaded, reason: %1. Please install it manually. No ha estat possible baixar l'instal·lador de Python, raó: 51. Instal·leu-lo manualment. - - + + Invalid password Contrasenya no vàlida - - - + + RSS (%1) RSS (%1) - + URL download error error al baixar l'URL - + The password is invalid - La contrasenya no és vàlida. + La contrasenya no és vàlida - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Velocitat de baixada: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Velocitat de pujada: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [B: %1, P: %2] qBittorrent %3 - + Hide Amaga - + Exiting qBittorrent - Se surt del qBittorrent + S'està sortint del qBittorrent + + + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Alguns fitxers encara s'estan transferint. +Esteu segur que voleu tancar el qBittorrent? - + Open Torrent Files - Obre fitxers de torrent + Obre els fitxers torrent - + Torrent Files Fitxers torrent - + Options were saved successfully. Opcions desades correctament. @@ -3129,52 +2785,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. S'ha actualitzat correctament el vostre DNS dinàmic. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Error de DNS dinàmica: El servei no està disponible temporalment, nou reintent en 30 minuts. - + Dynamic DNS error: hostname supplied does not exist under specified account. Error de DNS dinàmica: el nom d'amfitrió proporcionat no existeix en el compte especificat. - + Dynamic DNS error: Invalid username/password. Error DNS dinàmica: nom d'usuari/contrasenya no vàlides. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Error de DNS dinàmica: el qBittorrent ha estat inclòs en la llista negra, informeu d'això a http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Error de DNS dinàmica: %1 ha estat rebutjat pel servei. Informeu d'aquest error a http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Error de DNS dinàmica: El seu nom d'usuari ha estat blocat degut a un abús. - + Dynamic DNS error: supplied domain name is invalid. Error de DNS dinàmica: el nom d'usuari subministrat és massa curt. - + Dynamic DNS error: supplied username is too short. Error de DNS dinàmica: el nom d'usuari proporcionat és massa curt. - + Dynamic DNS error: supplied password is too short. Error de DNS dinàmica: el nom d'usuari subministrat és massa curt. @@ -3182,1413 +2838,1303 @@ Net::DownloadHandler - + I/O Error - Error d'entrada / sortida + Error d'entrada-sortida - + The file size is %1. It exceeds the download limit of %2. La mida d'aquest fitxer és de %1. Això excedeix el límit de baixada de %2. - + Unexpected redirect to magnet URI. - Redirecció no esperada a un URL magnètic. + Redirecció a un URL magnet no esperada. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - El nom d'amfitrió remot no s'ha trobat (nom d'amfitrió no vàlid). + + + GeoIP database loaded. Type: %1. Build time: %2. + Base de dades GeoIP carregada. Tipus: %1. Temps de compilació: %2. - - The operation was canceled - S'ha cancel·lat l'operació. + + + Couldn't load GeoIP database. Reason: %1 + No s'ha pogut carregar la base de dades GeoIP. Raó: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - El servidor remot ha tancat la connexió prematurament, abans que tota la resposta fos rebuda i processada. + + Venezuela, Bolivarian Republic of + Veneçuela, República Bolivariana de - - The connection to the remote server timed out - S'ha esgotat el temps d'espera de la connexió al servidor remot. + + Viet Nam + Viet Nam - - SSL/TLS handshake failed - Ha fallat l'encaixada d'SSL / TLS + + + N/A + No disponible - - The remote server refused the connection - El servidor remot ha rebutjat la connexió. + + Andorra + Andorra - - The connection to the proxy server was refused - S'ha rebutjat la connexió amb el servidor intermediari. + + United Arab Emirates + Emirats Àrabs Units - - The proxy server closed the connection prematurely - El servidor intermediari ha tancat la connexió prematurament. + + Afghanistan + Afganistan - - The proxy host name was not found - No s'ha trobat el nom d'amfitrió del servidor intermediari. + + Antigua and Barbuda + Antigua i Barbuda - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - La connexió amb el servidor intermediari s'ha esgotat, o el servidor no ha respost a temps a la sol·licitud enviada. + + Anguilla + Anguilla - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - El servidor intermediari requereix autenticació per atendre la sol·licitud, però no ha acceptat les credencials ofertes. + + Albania + Albània - - The access to the remote content was denied (401) - L'accés al contingut remot s'ha denegat (401). + + Armenia + Armènia - - The operation requested on the remote content is not permitted - L'operació sol·licitada al contingut remot no és permesa. - - - - The remote content was not found at the server (404) - El contingut remot no es troba al servidor (404). - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - El servidor remot requereix autenticació per servir el contingut, però les credencials proporcionades no s'han acceptat. - - - - The Network Access API cannot honor the request because the protocol is not known - L'accés a la xarxa de l'API no pot atendre la sol·licitud perquè el protocol és desconegut. - - - - The requested operation is invalid for this protocol - L'operació sol·licitada no és vàlida per a aquest protocol. - - - - An unknown network-related error was detected - S'ha detectat un error desconegut relacionat amb la xarxa. - - - - An unknown proxy-related error was detected - S'ha detectat un error desconegut relacionat amb el servidor intermediari. - - - - An unknown error related to the remote content was detected - S'ha detectat un error desconegut relacionat amb el contingut remot. - - - - A breakdown in protocol was detected - S'ha detectat una fallada al protocol. - - - - Unknown error - Error desconegut - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - Base de dades GeoIP carregada. Tipus: %1. Temps de compilació: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - No s'ha pogut carregar la base de dades GeoIP. Raó: %1 - - - - Venezuela, Bolivarian Republic of - Veneçuela, República Bolivariana de - - - - Viet Nam - Viet Nam - - - - - N/A - No disponible - - - - Andorra - Andorra - - - - United Arab Emirates - Emirats Àrabs Units - - - - Afghanistan - Afganistan - - - - Antigua and Barbuda - Antigua i Barbuda - - - - Anguilla - Anguilla - - - - Albania - Albània + + Angola + Angola - Armenia - Armènia - - - - Angola - Angola - - - Antarctica Antàrtica - + Argentina Argentina - + American Samoa Samoa Nord-americana - + Austria Àustria - + Australia Austràlia - + Aruba Aruba - + Azerbaijan Azerbaidjan - + Bosnia and Herzegovina Bòsnia i Hercegovina - + Barbados Barbados - + Bangladesh Bangladeix - + Belgium Bèlgica - + Burkina Faso Burkina Faso - + Bulgaria Bulgària - + Bahrain Bahrain - + Burundi Burundi - + Benin Benín - + Bermuda Bermuda - + Brunei Darussalam Brunei - + Brazil Brasil - + Bahamas Bahames - + Bhutan Bhutan - + Bouvet Island Bouvet - + Botswana Botswana - + Belarus Bielorússia - + Belize Belize - + Canada Canadà - + Cocos (Keeling) Islands Illes Cocos (Keeling) - + Congo, The Democratic Republic of the Congo, República Democràtica del - + Central African Republic República Centreafricana - + Congo Congo - + Switzerland Suïssa - + Cook Islands Illes Cook - + Chile Xile - + Cameroon Camerun - + China Xina - + Colombia Colòmbia - + Costa Rica Costa Rica - + Cuba Cuba - + Cape Verde Cap Verd - + Curacao Curaçao - + Christmas Island Illa Christmas - + Cyprus Xipre - + Czech Republic República Txeca - + Germany Alemanya - + Djibouti Djibouti - + Denmark Dinamarca - + Dominica Dominica - + Dominican Republic República Dominicana - + Algeria Algèria - + Ecuador Equador - + Estonia Estònia - + Egypt Egipte - + Western Sahara Sahara Occidental - + Eritrea Eritrea - + Spain Espanya - + Ethiopia Etiòpia - + Finland Finlàndia - + Fiji Fiji - + Falkland Islands (Malvinas) Illes Malvines (Falkland) - + Micronesia, Federated States of Micronèsia - + Faroe Islands Illes Fèroe - + France França - + Gabon Gabon - + United Kingdom Regne Unit - + Grenada Grenada - + Georgia Geòrgia - + French Guiana Guaiana Francesa - + Ghana Ghana - + Gibraltar Gibraltar - + Greenland Groenlàndia - + Gambia Gàmbia - + Guinea Guinea - + Guadeloupe Guadalupe (França) - + Equatorial Guinea Guinea Equatorial - + Greece Grècia - + South Georgia and the South Sandwich Islands Illes Geòrgia del Sud i Sandwich del Sud - + Guatemala Guatemala - + Guam Guam - + Guinea-Bissau Guinea Bissau - + Guyana Guyana - + Hong Kong Hong Kong - + Heard Island and McDonald Islands Illes Heard i McDonald - + Honduras Hondures - + Croatia Croàcia - + Haiti Haití - + Hungary Hongria - + Indonesia Indonèsia - + Ireland Irlanda - + Israel Israel - + India Índia - + British Indian Ocean Territory Territori Britànic de l'Oceà Índic - + Iraq Irak - + Iran, Islamic Republic of Iran - + Iceland Islàndia - + Italy Itàlia - + Jamaica Jamaica - + Jordan Jordània - + Japan Japó - + Kenya Kènia - + Kyrgyzstan Kirguizistan - + Cambodia Cambodja - + Kiribati Kiribati - + Comoros Comores - + Saint Kitts and Nevis Saint Christopher i Nevis - + Korea, Democratic People's Republic of Corea del Nord - + Korea, Republic of Corea del Sud - + Kuwait Kuwait - + Cayman Islands Illes Caiman - + Kazakhstan Kazakhstan - + Lao People's Democratic Republic Laos - + Lebanon Líban - + Saint Lucia Saint Lucia - + Liechtenstein Liechtenstein - + Sri Lanka Sri Lanka - + Liberia Libèria - + Lesotho Lesotho - + Lithuania Lituània - + Luxembourg Luxemburg - + Latvia Letònia - + Morocco Marroc - + Monaco Mònaco - + Moldova, Republic of Moldàvia - + Madagascar Madagascar - + Marshall Islands Illes Marshall - + Mali Mali - + Myanmar Myanmar - + Mongolia Mongòlia - + Northern Mariana Islands Illes Mariannes Septentrionals - + Martinique Martinica - + Mauritania Mauritània - + Montserrat Montserrat - + Malta Malta - + Mauritius Maurici - + Maldives Maldives - + Malawi Malawi - + Mexico Mèxic - + Malaysia Malàsia - + Mozambique Moçambic - + Namibia Namíbia - + New Caledonia Nova Caledònia - + Niger Níger - + Norfolk Island Illa Norfolk - + Nigeria Nigèria - + Nicaragua Nicaragua - + Netherlands Països Baixos - + Norway Noruega - + Nepal Nepal - + Nauru Nauru - + Niue Niue - + New Zealand Nova Zelanda - + Oman Oman - + Panama Panamà - + Peru Perú - + French Polynesia Polinèsia Francesa - + Papua New Guinea Papua Nova Guinea - + Philippines Filipines - + Pakistan Pakistan - + Poland Polònia - + Saint Pierre and Miquelon Saint-Pierre i Miquelon - + Puerto Rico Puerto Rico - + Portugal Portugal - + Palau Palau - + Paraguay Paraguai - + Qatar Qatar - + Reunion Reunió - + Romania Romania - + Russian Federation Federació Russa - + Rwanda Rwanda - + Saudi Arabia Aràbia Saudí - + Solomon Islands Illes Solomon - + Seychelles Seychelles - + Sudan Sudan - + Sweden Suècia - + Singapore Singapur - + Slovenia Eslovènia - + Svalbard and Jan Mayen Svalbard i Jan mayen - + Slovakia Eslovàquia - + Sierra Leone Sierra Leone - + San Marino San Marino - + Senegal Senegal - + Somalia Somàlia - + Suriname Surinam - + Sao Tome and Principe São Tomé i Príncipe - + El Salvador El Salvador - + Syrian Arab Republic República Àrab Siriana - + Swaziland Swazilàndia - + Turks and Caicos Islands Illes Turks i Caicos - + Chad Txad - + French Southern Territories Terres Australs i Antàrtiques Franceses - + Togo Togo - + Thailand Tailàndia - + Tajikistan Tadjikistan - + Tokelau Tokelau - + Turkmenistan Turkmenistan - + Tunisia Tuníssia - + Tonga Tonga - - Could not decompress GeoIP database file. - No s'ha pogut descomprimir el fitxer de base de dades GeoIP. - - - + Timor-Leste Timor Oriental - + Bolivia, Plurinational State of Bolívia, Estat Plurinacional de - + Bonaire, Sint Eustatius and Saba Bonaire, Sint Eustatius i Saba - + Cote d'Ivoire Costa d'Ivori - + Libya Líbia - + Saint Martin (French part) Sant Martí (part francesa) - + Macedonia, The Former Yugoslav Republic of Macedònia, Antiga República Iugoslava de - + Macao Macao - + Pitcairn Pitcairn - + Palestine, State of Palestina, Estat de - + Saint Helena, Ascension and Tristan da Cunha Santa Elena, Ascensió i Tristan da Cunha - + South Sudan Sudan del Sud - + Sint Maarten (Dutch part) Sant Martí (part holandesa) - + Turkey Turquia - + Trinidad and Tobago Trinitat i Tobago - + Tuvalu Tuvalu - + Taiwan Taiwan - + Tanzania, United Republic of Tanzània - + Ukraine Ucraïna - + Uganda Uganda - + United States Minor Outlying Islands Illes Perifèriques Menors dels EUA - + United States Estats Units - + Uruguay Uruguai - + Uzbekistan Uzbekistan - + Holy See (Vatican City State) Ciutat del Vaticà - + Saint Vincent and the Grenadines Saint Vincent i les Grenadines - + Virgin Islands, British Illes Verges Britàniques - + Virgin Islands, U.S. Illes Verges Nord-americanes - + Vanuatu Vanuatu - + Wallis and Futuna Wallis i Futuna - + Samoa Samoa - + Yemen Iemen - + Mayotte Mayotte - + Serbia Sèrbia - + South Africa Sud Àfrica - + Zambia Zàmbia - + Montenegro Montenegro - + Zimbabwe Zimbabwe - + Aland Islands Illes Åland - + Guernsey Guernsey - + Isle of Man Illa de Man - + Jersey Jersey - + Saint Barthelemy Saint-Barthélemy - + + Could not uncompress GeoIP database file. + No ha estat possible descomprimir el fitxer de base de dades GeoIP. + + + Couldn't save downloaded GeoIP database file. No ha estat possible desar el fitxer de base de dades GeoIP baixat. - + Successfully updated GeoIP database. Base de dades GeoIP actualitzada correctament. - + Couldn't download GeoIP database file. Reason: %1 No s'ha pogut baixar la base de dades GeoIP. Raó: %1 @@ -4596,12 +4142,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] Suport UPnP / NAT-PMP [Encès] - + UPnP / NAT-PMP support [OFF] Suport UPnP / NAT-PMP [Apagat] @@ -4609,7 +4155,7 @@ Net::Smtp - + Email Notification Error: Error de notificació de correu electrònic: @@ -4617,1884 +4163,1622 @@ OptionsDialog - + Options Opcions - + Behavior Comportament - + Downloads Baixades - + Connection Connexió - + Speed Velocitat - + BitTorrent Bittorrent - - RSS - RSS - - - + Web UI - Interfície web + IU Web - + Advanced Avançat - + Language - Llengua + Idioma - + User Interface Language: - Llengua de la interfície d'usuari: + Llenguatge de la interfície d'usuari: - + (Requires restart) (Requereix reiniciar el qBittorrent) - + Transfer List - Llista de transferència + Llista de Transferència - + Confirm when deleting torrents - Demana confirmació per suprimir torrents + Confirma quan elimini Torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. - Usa colors alterns a les files de la llista + Usar colors alterns en la llista de Transferència - + Hide zero and infinity values - Amaga els valors zero i infinit + Amagueu els valors zero i infinit - + Always Sempre - + Paused torrents only Només els torrents pausats - + Action on double-click - Acció a fer amb un doble click + Acció a realitzar amb un Doble-click - + Downloading torrents: - Torrents de baixada: + Torrents en baixada: - - + + Start / Stop Torrent Iniciar / Aturar Torrent - - + + Open destination folder - Obre la carpeta de destinació + Obrir carpeta destí - - + + No action Sense acció - + Completed torrents: - Torrents completats: + Torrents Completats: - + Desktop Escriptori - + Start qBittorrent on Windows start up - Inicia el qBittorrent durant l'arrencada de Windows + Inicia qBittorrent en l'arrencada de Windows - + Show splash screen on start up - Mostra la pantalla de benvinguda en iniciar + Mostra pantalla de benvinguda en iniciar - + Start qBittorrent minimized Inicia el qBittorrent minimitzat - + Confirmation on exit when torrents are active - Confirma el tancament quan hi hagi torrents actius. + Confirma tancada quan hi hagi Torrents actius - + Confirmation on auto-exit when downloads finish - Confirma el tancament automàtic quan les baixades acabin. - - - - KiB - KiB - - - - Email notification &upon download completion - Notificació per corre&u electrònic de l'acabament de les descàrregues - - - - Run e&xternal program on torrent completion - Executa un programa e&xtern en acabar el torrent. - - - - IP Fi&ltering - Fi&ltratge d'IP - - - - Schedule &the use of alternative rate limits - Programació de l'ús de lími&ts de taxa alternatius - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Més informació</a>) - - - - &Torrent Queueing - Cua de &torrents - - - - Seed torrents until their seeding time reaches - Sembra torrents fins que s'esgoti el seu temps de sembra. - - - - A&utomatically add these trackers to new downloads: - Afegeix a&utomàticament aquests rastrejadors a les baixades noves: - - - - RSS Reader - Lector RSS - - - - Enable fetching RSS feeds - Habilita l'obtenció de canals RSS - - - - Feeds refresh interval: - Interval d'actualització dels canals: - - - - Maximum number of articles per feed: - Nombre màxim d'articles per canal: - - - - - min - minutes - min. - - - - RSS Torrent Auto Downloader - Descarregador automàtic de torrents RSS - - - - Enable auto downloading of RSS torrents - Habilita baixades automàtiques de torrents RSS - - - - Edit auto downloading rules... - Edita les regles de baixada automàtica... - - - - Web User Interface (Remote control) - Interfície d'usuari web (control remot) - - - - IP address: - Adreça IP: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - Adreça IP amb què es vincularà la interfície web. -Especifiqueu una adreça IPv4 o IPv6. Podeu especificar "0.0.0.0" per a qualsevol adreça IPv4, -"::" per a qualsevol adreça IPv6 o bé "*" per a IPv4 i IPv6. - - - - Server domains: - Dominis de servidor: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - Llista blanca per a filtrar els valors de la capçalera de l'amfitrió HTTP. -Per tal de defensar-se contra atacs de revinculació de DNS, hauríeu -d'introduir noms de domini utilitzats pel servidor d'interfície d'usuari web. - -Useu ";" per separar les entrades. Podeu usar el comodí "*". - - - - &Use HTTPS instead of HTTP - &Usa HTTPS en lloc d'HTTP - - - - Bypass authentication for clients on localhost - Evita l'autenticació per als clients en l'amfitrió local - - - - Bypass authentication for clients in whitelisted IP subnets - Evita l'autenticació per als clients en subxarxes en la llista blanca - - - - IP subnet whitelist... - Llista blanca de subxarxes IP... + Confirma tancada automàtica quan hi hagi Torrents actius - - Upda&te my dynamic domain name - Actuali&tza el meu nom de domini dinàmic + + Show qBittorrent in notification area + Mostra qBittorrent en l'àrea de notificació - + Minimize qBittorrent to notification area - Minimitza el qBittorrent a l'àrea de notificació. + Minimitzar qBittorrent en l'àrea de notificació - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. - Tanca el qBittorrent a l'àrea de notificació. + En tancar qBittorrent deixeu actiu en l'àrea de notificació - + Tray icon style: - Estil de la icona al plafó: + Estil de la icona al panell: - + Normal Normal - + Monochrome (Dark theme) Monochrome (Tema obscur) - + Monochrome (Light theme) Monochrome (Tema clar) - + File association Associació de fitxers - + Use qBittorrent for .torrent files Utilitzeu qBittorrent per obrir fitxers .torrent - + Use qBittorrent for magnet links - Usa qBittorrent per a enllaços magnètics + Utilitzeu qBittorrent per enllaços imantats - + Power Management Gestió de la bateria - + + Inhibit system sleep when torrents are active + Inhibiu la suspensió del sistema si hi ha torrents actius. + + + + Log file + Fitxer de registre + + + Save path: - Camí de desament: + Camí de desat: - + Backup the log file after: Feu una còpia del registre desprès de: - + + MB + MB + + + Delete backup logs older than: - Suprimeix registres de còpia de seguretat més antics de... + Elimineu còpies de registres més antics que: - + days Delete backup logs older than 10 months dies - + months Delete backup logs older than 10 months mesos - + years Delete backup logs older than 10 years anys - + When adding a torrent En afegir un torrent - + + Display torrent content and some options + Mostreu el contingut del Torrent i opcions + + + Bring torrent dialog to the front - Porteu el diàleg del torrent al davant + Porteu el diàleg del Torrent al davant - + Do not start the download automatically The torrent will be added to download list in pause state - No iniciïs la baixada de forma automàtica + No inicieu la descàrrega de forma automàtica - + Should the .torrent file be deleted after adding it - S'hauria de suprimir el fitxer de torrent després d'afegir-lo? + S'hauria d'eliminar el fitxer torrent desprès d'afegir-lo? + + + + Delete .torrent files afterwards + Esborreu els fitxers torrent desprès. - + Also delete .torrent files whose addition was cancelled - Suprimeix també els fitxers .torrent dels quals n'hàgiu cancel·lat l'addició. + Esborreu també els fitxers torrent de què hàgeu cancel·lat l'addició. - + Also when addition is cancelled També quan hagi estat cancel·lada l'addició. - + Warning! Data loss possible! Atenció! Es poden perdre dades! - + Saving Management - Gestió del desament + Gestió del desat - + Default Torrent Management Mode: - Mode de Gestió dels torrents predeterminat: + Mode de Gestió dels Torrents per definició: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - El mode automàtic significa que diverses propietats dels torrents (p. ex. camins de desament) es decidiran segons la categoria associada. + El Mode Automàtic significa que diverses propietats dels torrent (p.ex. camins de desat) es configuraran segons la categoria associada. - + Manual Manual - + Automatic Automàtic - + When Torrent Category changed: En canviar la categoria del torrent: - + Relocate torrent Realltogeu el torrent - + Switch torrent to Manual Mode Canvieu el torrent a Mode Manual - + When Default Save Path changed: - Quan es canvia el camí de desament per defecte: + En canviar el camí de desat per definició: - - + + Relocate affected torrents Reallotgeu els torrents afectats. - - + + Switch affected torrents to Manual Mode Canvieu els torrents afectats a Mode Manual. - + When Category changed: En canviar la categoria - + Use Subcategories - Usa subcategories + Utilitzeu les subcategories - + Default Save Path: - Camí de desament per defecte: + Camí de desat per definició - + Keep incomplete torrents in: - Manté els torrents incomplets a: + Mantenir Torrents incomplets a: - + Copy .torrent files to: Copieu els fitxers torrent a: - - Show &qBittorrent in notification area - Mostra el &qBittorrent a l'àrea de notificació. - - - - &Log file - Fit&xer de registre - - - - Display &torrent content and some options - Mostra el contingut del &torrent i algunes opcions - - - - Create subfolder for torrents with multiple files - Crea una subcarpeta per als torrents amb fitxers múltiples. - - - - De&lete .torrent files afterwards - Su&primeix els fitxers .torrent després. - - - + Copy .torrent files for finished downloads to: - Copia els fitxers .torrent de les baixades acabades a: + Copieu fitxers .torrent de les baixades finalitzades a: - + Pre-allocate disk space for all files - Preassigna espai al disc per a tots els fitxers - - - - Inhibit system sleep when torrents are downloading - Inhibeix la suspensió del sistema quan es baixin torrents. - - - - Inhibit system sleep when torrents are seeding - Inhibeix la suspensió del sistema quan els torrents sembrin. + Pre-assignar espai al disc per a tots els arxius - + Append .!qB extension to incomplete files - Afegeix l'extensió .!qB a fitxers incomplets - - - - Enable recursive download dialog - Habilita el diàleg de baixada recursiva. + - + Automatically add torrents from: - Afegeix torrents automàticament des de: + - + Add entry - Afegeix una entrada + - + Remove entry - Suprimeix l'entrada + + + + + Email notification upon download completion + - + + Destination email: + + + + SMTP server: - Servidor SMTP: + - + This server requires a secure connection (SSL) - El servidor requereix una connexió segura (SSL) + - - + + + Authentication - Autentificació + - - - - + + + + Username: - Nom d'usuari: + Usuari: - - - - + + + + Password: - Contrasenya: - - - - Enabled protocol: - Protocol habilitat: + Contrasenya: - - TCP and μTP - TCP i μTP + + Run external program on torrent completion + - + Listening Port - Port d'escolta + - + Port used for incoming connections: - Port utilitzat per a connexions entrants: + - + Random - Aleatori + - + Use UPnP / NAT-PMP port forwarding from my router - Utilitza UPnP / NAT-PMP reenviament de ports del router + - + Use different port on each startup - Usa un pot diferent a cada inici + - + Connections Limits - Límits de connexió + - + Maximum number of connections per torrent: - Nombre màxim de connexions per torrent: + - + Global maximum number of connections: - Nombre global màxim de connexions: + - + Maximum number of upload slots per torrent: - Nombre màxim de ranures de pujada per torrent: + - + Global maximum number of upload slots: - Nombre global màxim de ranures de pujada: + - + Proxy Server - Servidor intermediaria + - + Type: - Tipus: + - + (None) - (Cap) + - + SOCKS4 - SOCKS4 + - + SOCKS5 - SOCKS5 + - + HTTP - HTTP + - + Host: - Amfitrió: + - - + + Port: - Port: + - + Otherwise, the proxy server is only used for tracker connections - Per contra, el servidor intermediari s'utilitzarà només per les connexions tracker + - + Use proxy for peer connections - Usa un servidor intermediari per a connexions d'igual a igual. + - + Disable connections not supported by proxies - Inhabilita les connexions no admeses per servidors intermediaris - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Més informació</a>) + - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - Els canals RSS, motors de cerca, actualitzacions de programari o altres coses que no siguin transferències de torrent i operacions relacionades (com ara intercanvis de clients) faran servir una connexió directa. + - + Use proxy only for torrents - Utilitza el servidor intermediari només per als torrents + - - A&uthentication - A&utenticació + + Info: The password is saved unencrypted + - - Info: The password is saved unencrypted - Informació: la contrasenya es desa sense xifrar + + IP Filtering + - + Filter path (.dat, .p2p, .p2b): - Camí del filtre (.dat, .p2p, .p2b): + - + Reload the filter - Actualitza el filtre - - - - Manually banned IP addresses... - Adreces IP prohibides manualment... + - + Apply to trackers - Aplica als rastrejadors + - + Global Rate Limits - Límits de velocitat globals + - - - - - - - KiB/s - KiB/s + + + Upload: + - - - Upload: - Pujada: + + + + + KiB/s + KiB/s - - + + Download: - Baixada: + - + Alternative Rate Limits - Límits de velocitat alternatius + - - + + Schedule the use of alternative rate limits + + + + From: from (time1 to time2) - Des de: + - - + To: time1 to time2 - A: + - + When: - Quan: + - + Every day - Cada dia + Cada dia - + Weekdays - De dilluns a divendres + - + Weekends - Caps de setmana + - + Rate Limits Settings - Paràmetres dels límits de velocitat + - + Apply rate limit to peers on LAN - Aplica el límit de velocitat als clients amb LAN + - + Apply rate limit to transport overhead - Aplica un límit de velocitat a la sobrecàrrega de transport + - - + + + Enable µTP protocol + + + + Apply rate limit to µTP protocol - Aplica un límit de velocitat al protocol µTP + - + Privacy - Privacitat + - + Enable DHT (decentralized network) to find more peers - Activa DHT (xarxa descentralitzada) per trobar més clients + - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - Intercanvia clients amb gestors compatibles amb Bittorrent (µTorrent, Vuze...) + - + Enable Peer Exchange (PeX) to find more peers - Habilita l'intercanvi de clients (PeX) per trobar-ne més. + - + Look for peers on your local network - Cerca clients a la xarxa local + - + Enable Local Peer Discovery to find more peers - Habilita el descobriment de clients locals per trobar-ne més. + - + Encryption mode: - Mode de xifratge: + - + Prefer encryption - Preferència de xifratge + - + Require encryption - Requereix xifratge + - + Disable encryption - Inhabilita el xifratge + - + Enable when using a proxy or a VPN connection - Habilita quan utilitzi un servidor intermediari o una connexió VPN + - + Enable anonymous mode - Habilita el mode anònim + + + + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + - + + Torrent Queueing + + + + Maximum active downloads: - Màxim de baixades actives: + - + Maximum active uploads: - Màxim de pujades actives: + - + Maximum active torrents: - Màxim de torrent actius: + - + Do not count slow torrents in these limits - No comptis els torrents lents fora d'aquests límits + - - Upload rate threshold: - Llindar de la taxa de pujada: + + Share Ratio Limiting + - - Download rate threshold: - Llindar de la taxa de baixada: + + Seed torrents until their ratio reaches + - - sec - seconds - s - - - - Torrent inactivity timer: - Temporitzador d'inactivitat del torrent: - - - - Share Ratio Limiting - Limitació de ràtio de compartició - - - - Seed torrents until their ratio reaches - Sembra els torrents fins que la ràtio arribi a - - - + then - després + - + Pause them - Pausa-ho + - + Remove them - Suprimeix-ho + + + + + Automatically add these trackers to new downloads: + - - RSS Smart Episode Filters - Filtres d'episodis inte·ligents RSS + + Enable Web User Interface (Remote control) + - + Use UPnP / NAT-PMP to forward the port from my router - Utilitza UPnP / NAT-PMP per reenviar el port des de l'encaminador + + + + + Use HTTPS instead of HTTP + - + Certificate: - Certificat: + - + Import SSL Certificate - Importa el certificat SSl + - + Key: - Clau: + - + Import SSL Key - Importa la clau SSL + - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Informació sobre els certificats</a> - - - - Use alternative Web UI - Usa una interfície web alternativa - - - - Files location: - Ubicació dels fitxers: + - - Enable clickjacking protection - Habilita la protecció de segrest de clic. + + Bypass authentication for localhost + - - Enable Cross-Site Request Forgery (CSRF) protection - Habilita protecció de la falsificació de peticions de llocs creuats (CSRF). + + Update my dynamic domain name + - + Service: - Servei: + - + Register - Registre + - + Domain name: - Nom de domini: + - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - Si s'habiliten aquestes opcions, podeu <strong>perdre irrevocablement</strong> els vostres fitxers .torrent! + - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - Quan aquestes opcions estan habilitades, el qBittorent <strong>suprimirà</strong> fitxers .torrent després que s'hagin afegit correctament (la primera opció) o no (la segona) a la seva cua de baixada. Això s'aplicarà <strong>no només</strong> als fitxers oberts oberts a través de l'acció de menú &ldquo;Afegeix un torrent&rdquo; sinó també als oberts a través de l'<strong>associació de tipus de fitxer</strong>. + - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - Si habiliteu la segona opció (&ldquo;També quan l'addició es cancel·la&rdquo;) el fitxer .torrent <strong>se suprimirà</strong> fins i tot si premeu &ldquo;<strong>Cancel·la</strong>&rdquo; dins el diàleg &ldquo;Afegeix un torrent&rdquo;. - - - - Choose Alternative UI files location - Trieu una ubicació alternativa per als fitxers d'interfície d'usuari + - + Supported parameters (case sensitive): - Paràmetres admesos (sensible a majúscules): + - + %N: Torrent name - %N: nom del torrent + - + %L: Category - %L: categoria - - - - %G: Tags (seperated by comma) - %G: Etiquetes (separades per comes) + - + %F: Content path (same as root path for multifile torrent) - %F: Camí del contingut (igual que el camí d'arrel per a torrents de fitxers múltiples) + - + %R: Root path (first torrent subdirectory path) - %R: camí d'arrel (camí del subdirectori del primer torrent) + - + %D: Save path - %D: camí de desament + - + %C: Number of files - %C: nombre de fitxers + - + %Z: Torrent size (bytes) - %Z mida del torrent (bytes) + - + %T: Current tracker - %T: rastrejador actual + - + %I: Info hash - %I: informació del resum + - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - Tip: emmarqueu el paràmetre amb cometes per evitar que el text es talli a l'espai en blanc (p.e., "%N") - - - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - Es considerarà que un torrent és lent si les taxes de baixada i pujada es mantenen per sota d'aquests valors durant els segons del «Temporitzador d'inactivitat del torrent». + - + Select folder to monitor - Seleccioneu una carpeta per monitorar. + - + Folder is already being monitored: - La carpeta ja es monitora: + - + Folder does not exist: - La carpeta no existeix: + - + Folder is not readable: - La carpeta no es pot llegir: + - + Adding entry failed - No s'ha pogut afegir l'entrada + - - - - + + Choose export directory - Trieu un directori d'exportació + - - - + + + + + + Choose a save directory - Trieu un directori de desament + - + Choose an IP filter file - Trieu un fitxer de filtre IP + - + All supported filters - Tots els filtres suportats + - + SSL Certificate - Certificat SSL + + + + + SSL Key + - + Parsing error - Error d'anàlisi + - + Failed to parse the provided IP filter - No s'ha pogut analitzar el filtratge IP + - + Successfully refreshed - Actualitzat amb èxit + - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - S'ha analitzat satisfactòriament el filtre IP proporcionat: s'han aplicat %1 regles. + Analitzat satisfactòriament el filtre IP: s'han aplicat %1 regles. - + Invalid key - Clau no vàlida + - + This is not a valid SSL key. - Aquesta no és una clau SSL vàlida. + - + Invalid certificate - Certificat no vàlid - - - - Preferences - Preferències - - - - Import SSL certificate - Importa un certificat SSL + - + This is not a valid SSL certificate. - Aquest no és un certificat SSL vàlid. - - - - Import SSL key - Importa una clau SSL - - - - SSL key - Clau SSL + - + Time Error - Error de temps + - + The start time and the end time can't be the same. - Els temps d'inici i d'acabament no poden ser els mateixos. + - - + + Length Error - Error de longitud + - + The Web UI username must be at least 3 characters long. - El nom d'usuari de la interfície web ha de tenir almenys 3 caràcters. + - + The Web UI password must be at least 6 characters long. - La contrasenya de la interfície web ha de tenir almenys 6 caràcters. + PeerInfo - - Interested(local) and Choked(peer) - Interessats (local) i muts (clients) + + interested(local) and choked(peer) + - + interested(local) and unchoked(peer) - interessats (local) i no muts (clients) + - + interested(peer) and choked(local) - interessats (clients) i muts (local) + - + interested(peer) and unchoked(local) - interessats (clients) i no muts (local) + - + optimistic unchoke - no mut optimista + - + peer snubbed - client rebutjat + - + incoming connection connexió d'entrada - + not interested(local) and unchoked(peer) - no interessats (local) i no muts (clients) + - + not interested(peer) and unchoked(local) - no interessats (clients) i no muts (local) + - + peer from PEX - client de PEX + parell de PEX - + peer from DHT - client de DHT + parell de DHT - + encrypted traffic trànsit xifrat - + encrypted handshake salutació xifrada - + peer from LSD - client d'LSD + parell de LSD PeerListWidget - + IP IP - + Port Port - + Flags Banderes - + Connection Connexió - + Client i.e.: Client application Client - + Progress i.e: % downloaded Progrés - + Down Speed i.e: Download speed - Vel. de baixada + Vel. baixada - + Up Speed i.e: Upload speed Velocitat de pujada - + Downloaded i.e: total data downloaded Baixat - + Uploaded i.e: total data uploaded Pujat - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Rellevància - + Files i.e. files that are being downloaded right now Fitxers - + Column visibility Visibilitat de les columnes - + Add a new peer... - Afegeix un client nou... + Afegeix un parell nou... - - + + Ban peer permanently - Prohibeix el client permanentment + Prohibició permanent de Parells - + Manually adding peer '%1'... - S'afegeix manualment el client «%1»... + S'està afegint manualment el parell «%1»... - + The peer '%1' could not be added to this torrent. - No s'ha pogut afegir el client «%1» a aquest torrent. + No s'ha pogut afegir el parell «%1» a aquest torrent. - + Manually banning peer '%1'... - Es prohibeix manualment el client «%1»... + S'està bandejant manualment el parell «%1»... - - + + Peer addition - Addició de clients + Incorporació de parells - + Country País - + Copy IP:port - Copia IP:port + - + Some peers could not be added. Check the Log for details. - No s'han pogut afegir alguns clients. Reviseu el registre per a més detalls. + No s'han pogut afegir alguns parells. Reviseu el registre per a més detalls. - + The peers were added to this torrent. - S'han afegit els clients al torrent. + S'han afegit els parells al torrent. - + Are you sure you want to ban permanently the selected peers? - Segur que voleu prohibir permanentment els clients seleccionats? + Esteu segur que voleu bandejar permanentment els parells seleccionats? - + &Yes &Sí - + &No &No - PeersAdditionDialog - - - Add Peers - Afegeix clients - - - - List of peers to add (one IP per line): - Llista de clients per afegir (una IP per línia): - - - - Format: IPv4:port / [IPv6]:port - Format: IPv4:port / [IPv6]:port - + PeersAdditionDlg - + No peer entered - No s'ha introduït cap client. + No s'ha entrat cap parell - + Please type at least one peer. - Si us plau, escriviu com a mínim un client. + Escriviu almenys un parell. - + Invalid peer - Client no vàlid + Parell invàlid - + The peer '%1' is invalid. - El client «%1» no és vàlid. + El parell «%1» no és vàlid. PieceAvailabilityBar - + White: Unavailable pieces - Blanc: trossos no disponibles + Blanc: parts no disponibles - + Blue: Available pieces - Blau: trossos disponibles + Blau: parts disponibles PiecesBar - + Files in this piece: - Fitxers en aquest tros: + - + File in this piece - Fitxer en aquest tros + - + File in these pieces - Fitxer en aquests trossos - - - - Wait until metadata become available to see detailed information - Espera fins que les metadades estiguin disponibles per veure'n la informació detallada. + - + Hold Shift key for detailed information - Mantingueu premuda la tecla de majúscules per veure'n la informació detallada + - PluginSelectDialog + PluginSelectDlg - + Search plugins Connectors de cerca - + Installed search plugins: Connectors de cerca instal·lats: - + Name Nom - + Version Versió - + Url URL - - + + Enabled Habilitat - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - Avís: assegureu-vos que compliu les lleis de dret de còpia del vostre país quan baixeu torrents des de qualsevol d'aquests motors de cerca. - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - Podeu obtenir nous connectors de motors de cerca aquí: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + - + Install a new one Instal·la'n un de nou - + Check for updates - Comprova si hi ha actualitzacions + Cerca actualitzacions - + Close Tanca - + Uninstall Desinstal·la - - - + + + Yes - - - - + + + + No No - + Uninstall warning - Avís de desinstal·lació + Alerta de desinstal·lació - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - Alguns connectors no s'han pogut desinstal·lar perquè estan inclosos al qBittorrent. Només es poden desinstal·lar els que heu afegit. -Aquests connectors s'han inhabilitat. + - + Uninstall success Desinstal·lació correcta - + All selected plugins were uninstalled successfully - Tots els connectors seleccionats s'han desinstal·lat correctament. + Tots els connectors seleccionats s'han instal·lat correctament - - - - - Search plugin update - Actualització del connector de cerca - - - - Plugins installed or updated: %1 - Connectors instal·lats o actualitzats: %1 - - - - + + New search engine plugin URL - URL del nou connector de motor de cerca + - - + + URL: URL: - + Invalid link - Enllaç no vàlid + Enllaç invàlid - + The link doesn't seem to point to a search engine plugin. - L'enllaç no sembla apuntar a un connector de motor de cerca. + L'enllaç no sembla portar a un connector de motor de cerca. - + Select search plugins Seleccioneu els connectors de cerca - + qBittorrent search plugin Connector de cerca del qBittorrent - + + + + Search plugin update + Actualització del connector de recerca + + + All your plugins are already up to date. - Tots els connectors ja estan actualitzats. + - + Sorry, couldn't check for plugin updates. %1 No s'han pogut comprovar les actualitzacions del connector. %1 - + + + Search plugin install Instal·lació del connector de cerca - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + + + + Couldn't install "%1" search engine plugin. %2 - No s'ha pogut instal·lar el connector de motor de cerca "%1". %2 + + + + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + - + Couldn't update "%1" search engine plugin. %2 - No s'ha pogut actualitzar el connector de motor de cerca "%1". %2 + - PluginSourceDialog + PluginSourceDlg - + Plugin source - Font del connector + - + Search plugin source: - Font del connector de cerca: + Font del connector de recerca: - + Local file Fitxer local - + Web link Enllaç web - PowerManagement - - - qBittorrent is active - El qBittorrent està actiu. - - - - PreviewSelectDialog - - - Preview - Vista prèvia - + PreviewSelect - + Name Nom - + Size Mida - + Progress Progrés - - + + Preview impossible - Vista prèvia impossible + Impossible vista prèvia - - + + Sorry, we can't preview this file - No es pot mostrar una vista prèvia d'aquest fitxer - - - - Private::FileLineEdit - - - '%1' does not exist - "%1" no existeix. - - - - '%1' does not point to a directory - "%1" no apunta a un directori. - - - - '%1' does not point to a file - "%1" no apunta a un fitxer. - - - - Does not have read permission in '%1' - No té permís de lectura a "%1". - - - - Does not have write permission in '%1' - No té permís de lectura a "%1". + No es pot realitzar una vista prèvia d'aquest fitxer PropListDelegate - + Not downloaded No baixat - - + + Normal Normal (priority) Normal - - N/A - N/D - - - + Do not download Do not download (priority) - No ho baixis + - - + + High High (priority) Alt - + N/A + N/D + + + Mixed Mixed (priorities Mixt - - + + Maximum Maximum (priority) Màxim @@ -6503,32 +5787,32 @@ PropTabBar - + General General - + Trackers Rastrejadors - + Peers - Clients + Parells - + HTTP Sources Fonts HTTP - + Content Contingut - + Speed Velocitat @@ -6589,7 +5873,7 @@ Peers: - Clients: + Parells: @@ -6622,22 +5906,22 @@ Comentari: - + Select All - Selecciona-ho tot + Selecciona Totes - + Select None Treure Seleccions - + Normal Normal - + High Alt @@ -6649,7 +5933,7 @@ Reannounce In: - Reanuncia: + Comunica en: @@ -6664,7 +5948,7 @@ Pieces: - Trossos: + Parts: @@ -6694,168 +5978,168 @@ Save Path: - Camí de desament: + Ruta de desada: - + Maximum Màxim + - Do not download No baixis - + Never Mai - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (té %3) - - + + %1 (%2 this session) %1 (%2 en aquesta sessió) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - %1 (sembrat durant %2) + %1 (sembrat per %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 màxim) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 total) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 de mitjana) - + Open Obre - + Open Containing Folder Obre la carpeta contenidora - + Rename... Canvia el nom... - + Priority Prioritat - + New Web seed Llavor web nova - + Remove Web seed Suprimeix la llavor web - + Copy Web seed URL - Copia l'URL de la llavor web + Copia URL de la llavor web - + Edit Web seed URL - Edita l'URL de la llavor web + Edita URL de la llavor web + + + + Rename the file + Canvia el nom del fitxer torrent - + New name: Nom nou: - - + + + The file could not be renamed + No es pot canviar el nom del fitxer + + + + This file name contains forbidden characters, please choose a different one. + El nom introduït conté caràcters prohibits, indiqueu-ne un altre. + + + + This name is already in use in this folder. Please use a different name. Aquest nom ja està en ús. Indiqueu un nom diferent. - + The folder could not be renamed No es pot canviar el nom de la carpeta - + qBittorrent qBittorrent - + Filter files... Filtra els fitxers... - - Renaming - Canvi de nom - - - - - Rename error - Error de canvi de nom - - - - The name is empty or contains forbidden characters, please choose a different one. - El nom està buit o conté caràcters prohibits. Si us plau, trieu-ne un altre de diferent. - - - + New URL seed New HTTP source - Llavor d'URL nova + Llavor URL nova - + New URL seed: - Llavor d'URL nova: + Llavor URL nova: - - + + This URL seed is already in the list. - Aquesta llavor d'URL ja és a la llista. + Aquesta llavor URL ja es troba en la llista. - + Web seed editing Edició de la llavor web - + Web seed URL: URL de la llavor web: @@ -6863,860 +6147,820 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + La vostra adreça IP ha estat bandejada després de masses intents d'autentificació fallits. + + + + Error: '%1' is not a valid torrent file. + + Error: «%1» no és un fitxer torrent vàlid. + + + + + Error: Could not add torrent to session. + Error: no s'ha pogut afegir el torrent a la sessió. + + + + I/O Error: Could not create temporary file. + Error d'entrada-sortida: No s'ha pogut crear un fitxer temporal. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 és un parametre de comanda de línia no conegut. - - + + %1 must be the single command line parameter. %1 ha de ser un sol paràmetre de comanda de línia. - + + %1 must specify the correct port (1 to 65535). + %1 ha d'especificar el port correcte (d'1 a 65535). + + + You cannot use %1: qBittorrent is already running for this user. - No podeu usar %1: el qBittorrent ja s'executa per a aquest usuari. + No podeu utilitzar %1: el qBittorrent ja s'està executant per a aquest usuari. - + Usage: Utilització: - + Options: Opcions: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - El paràmetre "%1" ha de seguir la sintaxi "%1=%2" + + Displays program version + Mostra la versió del programa - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - El paràmetre "%1" ha de seguir la sintaxi "%1=%2" + + Displays this help message + Mostra aquest missatge d'ajuda - - Expected integer number in environment variable '%1', but got '%2' - S'esperava un número enter a la variable d'entorn "%1", però s'ha obtingut "%2". + + Changes the Web UI port (current: %1) + Canvia el port de la interfície web (actual: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - El paràmetre "%1" ha de seguir la sintaxi "%1=%2" + + Disable splash screen + Desactiva finestra de benvinguda - - Expected %1 in environment variable '%2', but got '%3' - S'esperava %1 a la variable d'entorn "%2", però s'ha obtingut "%3". + + Run in daemon-mode (background) + Executa en mode dimoni (segon terme) - - port - port + + Downloads the torrents passed by the user + Baixa els torrents passats per l'usuari - - %1 must specify a valid port (1 to 65535). - %1 ha d'especificar un port vàlid (d'1 a 65535). + + Help + Ajuda - - Display program version and exit - Mostra la versió del programa i surt. + + Run application with -h option to read about command line parameters. + Executa l'aplicació amb l'opció -h per a llegir quant als paràmetres de comandes de línia. - - Display this help message and exit - Mostra aquest missatge d'ajuda i surt. + + Bad command line + Comanda de línia errònia - - Change the Web UI port - Canvia el port de la interfície web. + + Bad command line: + Comanda de línia errònia: - - Disable splash screen - Desactiva finestra de benvinguda + + Legal Notice + Notes legals - - Run in daemon-mode (background) - Executa en mode dimoni (segon terme) + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + El qBittorrent és un programa per a compartir fitxers. Quan s'executa un torrent, les dades d'aquest es fan disponibles als altres. Qualsevol contingut que compartiu serà sobre la vostra responsabilitat. + +No es mostraran més avisos. - - dir - Use appropriate short form or abbreviation of "directory" - dir + + Press %1 key to accept and continue... + Premeu la tecla %1 per a acceptar i continuar... - - Store configuration files in <dir> - Desa els fitxers de configuració a <dir> + + Legal notice + Notes legals - - - name - nom + + Cancel + Cancel·la - - Store configuration files in directories qBittorrent_<name> - Desa els fitxers de configuració en directoris qBittorrent_<name> + + I Agree + Estic d'acord - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Entreu als fitxers de represa ràpida de libtorrent i feu els camins dels fitxers relatius al directori del perfil. + + Torrent name: %1 + Nom del torrent: %1 - - files or URLs - fitxers o URLs + + Torrent size: %1 + Mida del torrent: %1 - - Download the torrents passed by the user - Baixa els Torrents passats per l'usuari. + + Save path: %1 + Ruta de desada: %1 - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Especifica si el diàleg "Afegeix un torrent nou" s'obre quan s'afegeixi un torrent. + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + El torrent s'ha baixat a %1. - - Options when adding new torrents: - Opcions en afegir torrents nous: + + Thank you for using qBittorrent. + Gràcies per fer servir el qBittorrent. - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Drecera per a %1 + + [qBittorrent] '%1' has finished downloading + [qBittorrent] '%1' s'han finalitzat les baixades - - path - camí + + The remote host name was not found (invalid hostname) + El nom host no s'ha trobat (nom host no vàlid) - - Torrent save path - Camí de desament del torrent + + The operation was canceled + S'ha cancel·lat l'operació - - Add torrents as started or paused - Afegeix torrents com a iniciats o pausats + + The remote server closed the connection prematurely, before the entire reply was received and processed + El servidor remot ha tancat la connexió abans de temps, abans quela resposta fos rebuda i processada - - Skip hash check - Omet la comprovació del resum (hash) + + The connection to the remote server timed out + Temps d'espera esgotat per a la connexió amb el servidor remot - - Assign torrents to category. If the category doesn't exist, it will be created. - Assignació de torrents a una categoria. Si la categoria no existeix, es crearà. + + SSL/TLS handshake failed + Salutació SSL/TSL fallida - - Download files in sequential order - Baixa fitxers en ordre seqüencial + + The remote server refused the connection + El servidor remot ha rebutjat la connexió - - Download first and last pieces first - Baixa primer el primer i l'últim tros. + + The connection to the proxy server was refused + S'ha rebutjat la connexió amb el servidor intermediari - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - Els valors de les opcions es poden proporcionar a través de variables d'entorn. Per a l'opció anomenada "parameter-name", el nom de la variable d'entorn és "QBT_PARAMETER_NAME" (en majúscules, "-" reemplaçat per "_"). Per passar valors d'indicadors, establiu la variable a "1" o "TRUE". Per exemple, per inhabilitar la pantalla de benvinguda: + + The proxy server closed the connection prematurely + El servidor intermediari ha tancat la connexió abans de temps - - Command line parameters take precedence over environment variables - Els paràmetres de la línia d'ordres tenen prioritat per davant de les variables d'entorn. + + The proxy host name was not found + El nom del servidor intermediari no s'ha trobat - - Help - Ajuda + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + La connexió amb el servidor intermediari s'ha esgotat, o el servidor no ha respost a temps a la sol·licitud enviada - - Run application with -h option to read about command line parameters. - Executa l'aplicació amb l'opció -h per a llegir quant als paràmetres de comandes de línia. + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + El servidor intermediari requereix autenticació per a atendre la sol·licitud, però no ha acceptat les credencials ofertes - - Bad command line - Comanda de línia errònia + + The access to the remote content was denied (401) + S'ha rebutjat l'accés al contingut remot (401) - - Bad command line: - Comanda de línia errònia: + + The operation requested on the remote content is not permitted + L'operació sol·licitada en el contingut remot no és permesa - - Legal Notice - Notes legals + + The remote content was not found at the server (404) + El contingut remot no es troba al servidor (404) - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - qBittorrent és un programa de compartició de fitxers. Si feu servir un torrent, les dades estaran disponibles a altres mitjançant la pujada. Qualsevol contingut que compartiu és responsabilitat vostra. + + The remote server requires authentication to serve the content but the credentials provided were not accepted + El servidor remot requereix autenticació per servir el contingut, però les credencials proporcionades no són correctes - - No further notices will be issued. - No es publicaran més avisos. + + The Network Access API cannot honor the request because the protocol is not known + L'accés a la xarxa de l'API no pot complir amb la sol·licitud perquè el protocol és desconegut - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - El qBittorrent és un programa per a compartir fitxers. Quan s'executa un torrent, les dades d'aquest es fan disponibles als altres. Qualsevol contingut que compartiu serà sobre la vostra responsabilitat. - -No es mostraran més avisos. + + The requested operation is invalid for this protocol + L'operació sol·licitada no és vàlida per a aquest protocol - - Press %1 key to accept and continue... - Premeu la tecla %1 per a acceptar i continuar... + + An unknown network-related error was detected + Error de xarxa desconegut - - Legal notice - Notes legals + + An unknown proxy-related error was detected + Error de servidor intermediari desconegut - - Cancel - Cancel·la + + An unknown error related to the remote content was detected + Error de contingut remot desconegut - - I Agree - Hi estic d'acord + + A breakdown in protocol was detected + S'ha detectat una error en el protocol - - + + Unknown error + Error desconegut + + + + Upgrade Actualitza - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - Heu actualitzat des d'una versió antiga que desava les coses de manera diferent. Heu de migrar al nou sistema de desament i no podreu tornar a fer servir una versió més antiga de 3.3.0. Voleu continuar? [s/n] + Heu actualitzat des d'una versió antiga que desava les coses de manera diferent. Heu de migrar al nou sistema de desada i no podreu tornar a fer servir una versió més antiga de 3.3.0. Voleu continuar? - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. Heu actualitzat des d'una versió antiga que desava les coses de manera diferent. Heu de migrar al nou sistema de desada. Si continueu, no podreu tornar a fer servir una versió més antiga de la 3.3.0. - + Couldn't migrate torrent with hash: %1 No s'ha pogut migrar el torrent amb la funció resum (hash): %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 - No s'ha pogut migrar el torrent. Nom del fitxer de represa ràpida no vàlid: %1 + No s'ha pogut migrar el torrent. Nom del fitxer de represa ràpida invàlid: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 - S'ha detectat un tancament del programa incorrecte. S'usarà el fitxer de recuperació per restaurar-ne la configuració: %1 + + Detected unclean program exit. Using fallback file to restore settings. + - + An access error occurred while trying to write the configuration file. - Hi ha hagut un error en intentar escriure el fitxer de configuració. + - + A format error occurred while trying to write the configuration file. - Hi ha hagut un error de format en intentar escriure al fitxer de configuració. - - - - An unknown error occurred while trying to write the configuration file. - Hi ha hagut un error desconegut mentre s'intentava escriure el fitxer de configuració. - - - - RSS::AutoDownloader - - - - Invalid data format. - Format de dades no vàlid. - - - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - No s'han pogut desar les dades del Descarregador automàtic d'RSS a %1: Error: %2 - - - - Invalid data format - Format de dades no vàlid - - - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - No s'han pogut llegir les regles del Descarregador automàtic d'RSS de %1: Error: %2 - - - - Couldn't load RSS AutoDownloader rules. Reason: %1 - No s'han pogut carregar les regles del Descarregador automàtic d'RSS. Raó: %1 - - - - RSS::Feed - - - Failed to download RSS feed at '%1'. Reason: %2 - Ha fallat baixar el canal RSS a "%1". Raó: %2 - - - - RSS feed at '%1' updated. Added %2 new articles. - S'ha actualitzat el canal RSS %1. S'han afegit %2 articles nous. - - - - Failed to parse RSS feed at '%1'. Reason: %2 - Ha fallat analitzar el canal RSS a "1%". Raó: %2 - - - - Couldn't read RSS Session data from %1. Error: %2 - No s'han pogut llegir les dades de la sessió RSS de %1. Error: %2 - - - - Couldn't parse RSS Session data. Error: %1 - No s'han pogut analitzar les dades de la sessió RSS. Error: %1 - - - - Couldn't load RSS Session data. Invalid data format. - No s'han pogut carregar les dades de la sessió RSS. Format de dades no vàlid. - - - - Couldn't load RSS article '%1#%2'. Invalid data format. - No s'ha pogut carregar l'article RSS "%1#%2". Format de dades no vàlid. - - - - RSS::Private::Parser - - - Invalid RSS feed. - Canal RSS no vàlid. - - - - %1 (line: %2, column: %3, offset: %4). - %1 (línia: %2, columna: %3, desplaçament: %4). - - - - RSS::Session - - - RSS feed with given URL already exists: %1. - El canal RSS amb l'URL proporcionat ja existeix: %1. - - - - Cannot move root folder. - No es pot moure la carpeta d'arrel. - - - - - Item doesn't exist: %1. - No existeix l'element %1. - - - - Cannot delete root folder. - No es pot suprimir la carpeta d'arrel. - - - - Incorrect RSS Item path: %1. - Camí a l'element RSS incorrecte: %1. - - - - RSS item with given path already exists: %1. - L'element RSS amb el camí proporcionat ja existeix: %1. - - - - Parent folder doesn't exist: %1. - No existeix la carpeta mare %1. + - RSSWidget + RSS - + Search Cerca - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - Ara la baixada de torrents RSS està inhabilitada! Podeu habilitar-la als paràmetres de l'aplicació. - - - + New subscription Subscripció nova - - - + + + Mark items read - Marca els elements llegits + Marcar per llegir - - Refresh RSS streams - Actualitza els canals RSS - - - + Update all Actualitza-ho tot - + RSS Downloader... - Descarregador RSS... + Baixades RSS... - + + Settings... + Configuració... + + + Torrents: (double-click to download) - Torrents: (doble clic per a baixar-los) + Torrents: (doble clic per a baixar) - - + + Delete Suprimeix - + Rename... - Canvia'n el nom... + Canvia el nom... - + Rename - Canvia'n el nom + Canvia el nom - - + + Update Actualitza - + New subscription... - Subscripció nova... + subscripció nova... - - + + Update all feeds - Actualitza tots els canals + Actualitzar tots els Canals - + Download torrent Baixa el torrent - + Open news URL - Obre l'URL de notícies + Obre l'URL de novetats - + Copy feed URL - Copia l'URL del canal + Copia el canal URL - + New folder... Carpeta nova... - + + Refresh RSS streams + Actualitza els canals RSS + + + + RSSImp + + + Stream URL: + URL del Canal: + + + + Please type a RSS stream URL + Escriviu una URL d'un canal RSS + + + + This RSS feed is already in the list. + Aquesta font RSS ja és a la llista. + + + Please choose a folder name - Si us plau, trieu un nom de carpeta. + Indiqueu un nom per a la carpeta - + Folder name: Nom de la carpeta: - + New folder Carpeta nova - - Please type a RSS feed URL - Si us plau, escriviu l'URL d'un canal RSS. - - - - Feed URL: - URL del canal: - - - + Deletion confirmation Confirmació de supressió - + Are you sure you want to delete the selected RSS feeds? - Segur que voleu suprimir els canals RSS seleccionats? + Esteu segurs que voleu suprimir les fonts RSS seleccionades? - + Please choose a new name for this RSS feed - Si us plau, trieu un nom nou per a aquest canal RSS. + Indiqueu un nou nom per al Canal RSS - + New feed name: Nom del canal nou: - - Rename failed - El canvi de nom ha fallat. + + Name already in use + Aquest nom ja es troba en ús - + + This name is already used by another item, please choose another one. + Aquest nom ja s'està usant, indiqueu-ne un altre. + + + Date: Data: - + Author: Autor: + + + Unread + No llegits + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + + + + + Rss::Private::Parser + + + Invalid RSS feed. + Canal RSS invàlid. + + + + RssSettingsDlg + + + RSS Reader Settings + Ajustaments Lector RSS + + + + RSS feeds refresh interval: + Interval d'actualització de Canals RSS: + + + + min + + + + + Maximum number of articles per feed: + Nombre màxim d'articles per canal: + ScanFoldersDelegate - + Select save location - Seleccioneu la ubicació de desament + ScanFoldersModel - + Monitored Folder - Carpeta monitorada + - + Override Save Location - Salta't la ubicació de desament + - + Monitored folder - Carpeta monitorada + - + Default save location - Ubicació de desament per defecte + - + Browse... - Explora... + Navega... - SearchJobWidget + SearchEngine - - Form - Formulari + + Unknown search engine plugin file format. + Format de fitxer desconegut del connector de motor de cerca. - - Results(xxx) - Resultats (xxx) + + A more recent version of this plugin is already installed. + - - Search in: - Cerca a: + + + Plugin is not supported. + El connector no està suportat. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - <html><head/><body><p>Alguns motors de cerca també fan cerques en descripcions de torrents i també als noms de fitxers de torrent. Si els resultats d'aquesta cerca es mostren o no a la llista de sota ho controla aquest mode.</p><p><span style=" font-weight:600;">Arreu</span> inhabilita el filtratge i mostra tot el que han trobat els motors de cerca.</p><p><span style=" font-weight:600;">Només noms de torrents</span> mostra només els torrents el nom dels quals coincideix amb els termes de la consulta.</p></body></html> + + Update server is temporarily unavailable. %1 + - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - <html><head/><body><p>Estableix un nombre mínim i màxim de sembradors permesos. </p></body></html> + + + Failed to download the plugin file. %1 + No s'ha pogut baixar el connector del fitxer. %1 - - Seeds: - Llavors: + + An incorrect update info received. + S'ha rebut informació d'actualització incorrecta. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - <html><head/><body><p>Nombre mínim de llavors</p></body></html> + + All categories + Totes les categories - - - to - a + + Movies + Pel·lícules - - <html><head/><body><p>Maximal number of seeds</p></body></html> - <html><head/><body><p>Nombre màxim de llavors</p></body></html> + + TV shows + Programes de TV - - - - + + Music + Música - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - <html><head/><body><p>Estableix una mida mínima i màxima de torrent permesa. </p></body></html> + + Games + Jocs - - Size: - Mida: + + Anime + - - <html><head/><body><p>Minimal torrent size</p></body></html> - <html><head/><body><p>Mida mínima de torrent</p></body></html> + + Software + Programari - - <html><head/><body><p>Maximal torrent size</p></body></html> - <html><head/><body><p>Mida màxima de torrent</p></body></html> + + Pictures + Imatges - - Name - i.e: file name - Nom + + Books + Llibres + + + SearchListDelegate - + + + Unknown + Desconegut + + + + SearchTab + + + Name + i.e: file name + Nom + + + Size i.e: file size Mida - + Seeders i.e: Number of full sources - Sembradors + Llavors - + Leechers i.e: Number of partial sources - Sangoneres + Leechers - + Search engine Motor de cerca - - Filter search results... - Filtra els resultats de la cerca... - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - Resultats (se'n mostren <i>%1</i> d'un total de <i>%2</i>): + - + Torrent names only - Només noms de torrents + - + Everywhere - Arreu - - - - Use regular expressions - Usa expressions regulars + - + Searching... - Cercant.. + - + Search has finished - La cerca s'ha acabat. + La cerca ha finalitzat - + Search aborted - Cerca avortada + - + An error occurred during search... - S'ha produït un error durant la cerca... + - + Search returned no results - La cerca no ha trobat cap resultat. + - + Column visibility - Visibilitat de les columnes - - - - SearchPluginManager - - - Unknown search engine plugin file format. - El format de fitxer del connector de motor de cerca és desconegut. - - - - A more recent version of this plugin is already installed. - Ja hi ha instal·lada una versió més recent d'aquest connector. + - - - Plugin is not supported. - El connector no està suportat. + + Form + - - All categories - Totes les categories + + Results(xxx) + - - Movies - Pel·lícules + + Search in: + - - TV shows - Programes de TV + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + - - Music - Música + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + - - Games - Jocs + + Seeds: + Llavors: - - Anime - Anime + + <html><head/><body><p>Minimal number of seeds</p></body></html> + - - Software - Programari + + + to + a - - Pictures - Imatges + + <html><head/><body><p>Maximal number of seeds</p></body></html> + - - - Books - Llibres + + + + + - - Update server is temporarily unavailable. %1 - El servidor d'actualitzacions és temporalment fora de servei. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + - - - Failed to download the plugin file. %1 - No s'ha pogut baixar el fitxer del connector: %1 + + Size: + Mida: - - An incorrect update info received. - S'ha rebut un informació d'actualització incorrecta. + + <html><head/><body><p>Minimal torrent size</p></body></html> + - - Search plugin '%1' contains invalid version string ('%2') - El connector de cerca «%1» conté una cadena de versió no vàlida («%2») + + <html><head/><body><p>Maximal torrent size</p></body></html> + @@ -7724,198 +6968,185 @@ - - - - + + + Search Cerca - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - No hi ha connectors de cerca instal·lats. -Cliqueu al botó "Connectors de cerca..." del cantó de baix a la dreta de la finestra per instal·lar-ne. - - - + Download Baixa - + Go to description page Vés a la pàgina de descripció - + Copy description page URL - Copia l'URL de la pàgina de descripció + - + Search plugins... Cerca connectors... - + A phrase to search for. - Una frase per cercar.. + - + Spaces in a search term may be protected by double quotes. - Els espais als termes de cerca es poden protegir amb cometes dobles. + - + Example: Search phrase example - Exemple: + - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - <b>foo bar</b>: cerca <b>foo</b> i <b>bar</b> + - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - <b>&quot;foo bar&quot;</b>: cerca <b>foo bar</b> + - + All plugins Tots els connectors - + Only enabled - Només habilitat + - + Select... - Selecció... + - - - + + + Search Engine Motor de cerca - + Please install Python to use the Search Engine. - Instal·leu Python per fer servir el motor de cerca. + - + Empty search pattern Patró de recerca buit - + Please type a search pattern first Escriviu primer un patró de cerca - + Stop Atura't - + Search has finished - La cerca s'ha acabat. + La cerca ha finalitzat - + Search has failed La cerca ha fallat - ShutdownConfirmDialog - - - Don't show again - No ho tornis a mostrar. - + ShutdownConfirmDlg - + qBittorrent will now exit. - El qBittorrent es tancarà ara. + - + E&xit Now - S&urt ara + - + Exit confirmation Confirmació de sortida - + The computer is going to shutdown. - L'ordinador s'aturarà. + - + &Shutdown Now - &Atura't ara - - - - Shutdown confirmation - Confirmació de tancament + - + The computer is going to enter suspend mode. - L'ordinador entrarà en mode de suspensió. + - + &Suspend Now - &Suspèn el sistema ara + - + Suspend confirmation - Confirmació de suspensió + - + The computer is going to enter hibernation mode. - L'ordinador entrarà en mode d'hibernació. + - + &Hibernate Now - &Hiberna ara + - + Hibernate confirmation - Confirmació d'hibernació + - + You can cancel the action within %1 seconds. - Podeu cancel·lar aquesta acció durant %1 segons. + + + + + Shutdown confirmation + Tanca la confirmació SpeedLimitDialog - + KiB/s KiB/s @@ -7923,52 +7154,52 @@ SpeedPlotView - + Total Upload Total pujat - + Total Download Total baixat - + Payload Upload Càrrega de pujada - + Payload Download Càrrega de baixada - + Overhead Upload - Sobrecàrrega de pujada + Pujada per damunt - + Overhead Download - Sobrecàrrega de baixada + Baixada per damunt - + DHT Upload Pujada DHT - + DHT Download Baixada DHT - + Tracker Upload Pujada del rastrejador - + Tracker Download Baixada del rastrejador @@ -7976,95 +7207,87 @@ SpeedWidget - + Period: Període: - + 1 Minute 1 minut - + 5 Minutes 5 minuts - + 30 Minutes 30 minuts - + 6 Hours 6 hores - + Select Graphs Seleccioneu gràfics - + Total Upload Total pujat - + Total Download Total baixat - + Payload Upload Càrrega de pujada - + Payload Download Càrrega de baixada - + Overhead Upload Pujada per damunt - + Overhead Download - Sobrecàrrega de baixada + Baixada per damunt - + DHT Upload Pujada DHT - + DHT Download Baixada DHT - + Tracker Upload Pujada del rastrejador - + Tracker Download Baixada del rastrejador - StacktraceDialog - - - Crash info - Informació de la fallada - - - StatsDialog @@ -8077,49 +7300,49 @@ Estadístiques d'usuari - - Cache statistics - Estadístiques de memòria cau + + Total peer connections: + Connexions de parells totals: - - Read cache hits: - Resultats de lectura de la memòria cau: + + Global ratio: + Ràtio global: - - Average time in queue: - Mitjana de temps a la cua: + + Alltime download: + Temps total baixat: - - Connected peers: - Clients connectats: + + Alltime upload: + Temps total pujat: - - All-time share ratio: - Ràtio de compartició de sempre: + + Total waste (this session): + Despesa total (aquesta sessió): - - All-time download: - Baixada de sempre: + + Cache statistics + Estadístiques de memòria cau - - Session waste: - Sessió malgastada: + + Read cache hits: + - - All-time upload: - Pujada de sempre: + + Average time in queue: + - Total buffer size: - Mida total de la memòria intermèdia: + Total buffers size: + Mida total de la memòria intermèdia (buffer): @@ -8129,7 +7352,7 @@ Queued I/O jobs: - Ordres d'entrada / sortida a la cua: + Ordres d'entrada-sortida en cua: @@ -8144,39 +7367,49 @@ Total queued size: - Mida total a la cua: + Mida total en cua: + + + + OK + D'acord - + %1 ms 18 milliseconds - %1 ms + StatusBar - + Connection status: Estat de la connexió: - + No direct connections. This may indicate network configuration problems. No hi ha connexions directes. Això pot indicar problemes en la configuració de la xarxa. - + DHT: %1 nodes DHT: %1 nodes - - qBittorrent needs to be restarted! - El qBittorrent s'ha de reiniciar! + + qBittorrent needs to be restarted + Cal reiniciar el qBittorrent + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + S'ha actualitzat el qBittorrent i cal que el reinicieu perquè els canvis siguin efectius. @@ -8195,1570 +7428,1311 @@ En línea - + Click to switch to alternative speed limits Cliqueu per canviar als límits de velocitat alternativa - + Click to switch to regular speed limits Cliqueu per canviar als límits de velocitat normal - + + Manual change of rate limits mode. The scheduler is disabled. + Canvi manual del ràtio de límits. L'horari és desactivat. + + + Global Download Speed Limit Velocitat del límit global de baixada - + Global Upload Speed Limit Velocitat límit global de pujada - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter Tots (0) - + Downloading (0) Baixant (0) - + Seeding (0) Sembrant (0) - + Completed (0) Completats (0) - + Resumed (0) Represos (0) - + Paused (0) - En pausa (0) + Pausats (0) - + Active (0) Actius (0) - + Inactive (0) Inactius (0) - + Errored (0) Amb errors (0) - + All (%1) Tots (%1) - + Downloading (%1) Baixant (%1) - + Seeding (%1) Sembrant (%1) - + Completed (%1) Completats (%1) - + Paused (%1) - En pausa (%1) + Pausats (%1) - + Resumed (%1) Represos (%1) - + Active (%1) Actius (%1) - + Inactive (%1) Inactius (%1) - + Errored (%1) Amb errors (%1) - TagFilterModel - - - Tags - Etiquetes - - - - All - Tot - - - - Untagged - Sense etiquetar - - - - TagFilterWidget - - - Add tag... - Afegeix una etiqueta... - - - - Remove tag - Suprimeix l'etiqueta - - - - Remove unused tags - Suprimeix les etiquetes no usades - - - - Resume torrents - Reprèn els torrents - + TorrentContentModel - - Pause torrents - Pausa els torrents + + Name + Nom - - Delete torrents - Suprimeix els torrents + + Size + Mida - - New Tag - Etiqueta nova + + Progress + Progrés - - Tag: - Etiqueta: + + Download Priority + Prioritat de baixada - - Invalid tag name - Nom d'etiqueta no vàlid + + Remaining + Restant + + + TorrentCreatorDlg - - Tag name '%1' is invalid - El nom d'etiqueta "%1" no és vàlid. + + Select a folder to add to the torrent + Seleccioneu una carpeta per a afegir el Torrent - - Tag exists - L'etiqueta ja existeix. + + Select a file to add to the torrent + Seleccioneu un fitxer per a afegir al torrent - - Tag name already exists. - El nom d'etiqueta ja existeix. + + No input path set + Sense ruta d'entrada establerta - - - TorrentCategoryDialog - - Torrent Category Properties - Propietats de les categories del torrent + + Please type an input path first + Escriviu primer una ruta d'entrada - - Name: - Nom: + + Select destination torrent file + Seleccioneu una destinació per al fitxer torrent - - Save path: - Camí de desament: + + Torrent Files (*.torrent) + Fitxers torrent (*.torrent) - - Choose save path - Seleccioneu un camí de desament + + Torrent was created successfully: %1 + %1 is the path of the torrent + El torrent s'ha creat amb èxit: %1 - - New Category - Categoria nova + + + + Torrent creation + Creació de torrent - - Invalid category name - El nom de la categoria no és vàlid + + Torrent creation was unsuccessful, reason: %1 + La creació del torrent no ha finalitzat correctament, raó: %1 - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - El nom de la categoria no pot incluore "\". -El nom de la categoria no pot començar ni acabar amb "/". -El nom de la categoria no pot incloure la seqüència "//". - - - - Category creation error - Error de creació de la categoria - - - - Category with the given name already exists. -Please choose a different name and try again. - Ja existeix una categoria amb aquest nom. -Si us plau, trieu-ne un altre i torneu-ho a provar. + + Created torrent file is invalid. It won't be added to download list. + La creació del fitxer torrent no és vàlida. No s'afegirà a la llista de baixades. - TorrentContentModel + TorrentModel - + Name + i.e: torrent name Nom - + Size + i.e: torrent size Mida - - Progress + + Done + % Done Progrés - - Download Priority - Prioritat de baixada + + Status + Torrent status (e.g. downloading, seeding, paused) + Estat - - Remaining - Restant + + Seeds + i.e. full sources (often untranslated) + Llavors - - Availability - Disponibilitat + + Peers + i.e. partial sources (often untranslated) + Parells - - - TorrentCreatorDialog - - Torrent Creator - Creador del torrent + + Down Speed + i.e: Download speed + Vel. baixada - - Select file/folder to share - Seleccioneu un fitxer o una carpeta per compartir. + + Up Speed + i.e: Upload speed + Vel. pujada - - Path: - Camí: + + Ratio + Share ratio + Ratio - - [Drag and drop area] - [Àrea per arrossegar-hi i deixar-hi anar elements.] + + ETA + i.e: Estimated Time of Arrival / Time left + Temps estimat - - - Select file - Seleccioneu un fitxer + + Category + Categoria - - - Select folder - Seleccioneu una carpeta - - - - Settings - Configuració - - - - Piece size: - Mida del tros: - - - - Auto - Auto - - - - 16 KiB - 16 KiB - - - - 32 KiB - 32 KiB - - - - 64 KiB - 64 KiB - - - - 128 KiB - 128 KiB - - - - 256 KiB - 256 KiB - - - - 512 KiB - 512 KiB - - - - 1 MiB - 1 MiB - - - - 2 MiB - 2 MiB - - - - 4 MiB - 4 MiB - - - - 8 MiB - 8 MiB - - - - 16 MiB - 16 MiB - - - - 32 MiB - 32 MiB - - - - Calculate number of pieces: - Càlcul del nombre de trossos: - - - - Private torrent (Won't distribute on DHT network) - Torrent privat (no es distribuirà per xarxa DHT) - - - - Start seeding immediately - Inicia la sembra immediatament - - - - Ignore share ratio limits for this torrent - Ignora els límits de ràtio de compartició per a aquest torrent. - - - - Optimize alignment - Optimitza l'alineació - - - - Fields - Camps - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - Podeu separar els nivells de rastrejadors o grups amb una línia en blanc. - - - - Web seed URLs: - URLs de llavor web: - - - - Tracker URLs: - URLs de rastrejador: - - - - Comments: - Comentaris: - - - - Source: - Font: - - - - Progress: - Progrés: - - - - Create Torrent - Crea un torrent - - - - - - Torrent creation failed - Ha fallat la creació del torrent. - - - - Reason: Path to file/folder is not readable. - Raó: el camí al fitxer o la carpeta no és llegible. - - - - Select where to save the new torrent - Seleccioneu on desar el torrent nou. - - - - Torrent Files (*.torrent) - Fitxers torrent (*.torrent) - - - - Reason: %1 - Raó: %1 - - - - Reason: Created torrent is invalid. It won't be added to download list. - Raó: el torrent creat no és vàlid. No s'afegirà a la llista de baixades. - - - - Torrent creator - Creador del torrent - - - - Torrent created: - Creació del torrent: - - - - TorrentInfo - - - File size exceeds max limit %1 - La mida del fitxer excedeix el límit màxim: %1 - - - - Torrent file read error: %1 - Error de lectura del fitxer torrent: %1 - - - - Torrent file read error: size mismatch - Error de lectura del fitxer torrent: la mida no coincideix. + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Afegit el - - - TorrentsController - - Not contacted yet - Encara no s'hi ha contactat + + Completed On + Torrent was completed on 01/01/2010 08:00 + Completat a - - Updating... - Actualitzant... + + Tracker + Rastrejador - - Working - S'hi està treballant + + Down Limit + i.e: Download limit + Límit baixada - - Not working - No s'hi està treballant + + Up Limit + i.e: Upload limit + Límit pujada - - Error: '%1' is not a valid torrent file. - Error: «%1« no és un fitxer torrent vàlid. + + Downloaded + Amount of data downloaded (e.g. in MB) + Baixats - - - - - Torrent queueing must be enabled - Cal que habiliteu la cua d'operacions dels torrent + + Uploaded + Amount of data uploaded (e.g. in MB) + Pujats - - Save path cannot be empty - + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Baixades durant la sessió - - - Category cannot be empty - + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Pujades durant la sessió - - Unable to create category - + + Remaining + Amount of data left to download (e.g. in MB) + Restants - - Unable to edit category - + + Time Active + Time (duration) the torrent is active (not paused) + Temps actiu - Save path is empty - El camí de desament és buit. + + Save path + Torrent save path + Desa el camí - - Cannot make save path - No es pot fer el camí de desament. + + Completed + Amount of data completed (e.g. in MB) + Completat - - Cannot write to directory - No es pot escriure al directori. + + Ratio Limit + Upload share ratio limit + Límit del ràtio - - WebUI Set location: moving "%1", from "%2" to "%3" - Ubicació del perfil d'interfície web: es mou «%1», de «%2» a «%3» + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Últim cop vist complet - - Incorrect torrent name - Nom de torrent incorrecte + + Last Activity + Time passed since a chunk was downloaded/uploaded + Darrera activitat - - - Incorrect category name - Nom de categoria incorrecte + + Total Size + i.e. Size including unwanted data + Mida total TrackerFiltersList - + All (0) this is for the tracker filter Tots (0) - + Trackerless (0) Sense rastrejadors (0) - + Error (0) - Errors (0) + Error (0) - + Warning (0) - Advertències (0) + Advertència (0) - - + + Trackerless (%1) Sense rastrejadors (%1) - - + %1 (%2) + openbittorrent.com (10) + %1 (%2) + + + + Error (%1) - Errors (%1) + Error (%1) - - + + Warning (%1) - Advertències (%1) + Advertència (%1) - + Resume torrents Reprèn els torrents - + Pause torrents Pausa els torrents - + Delete torrents Suprimeix els torrents - - + + All (%1) this is for the tracker filter Tots (%1) - TrackerListWidget + TrackerList - - + + URL + URL + + + + Status + Estat + + + + Received + + + + + Seeds + Llavors + + + + Peers + Parells + + + + Downloaded + + + + + Message + Missatge + + + + Working - Funciona + Treballant - + Disabled - Inhabilitat + Deshabilitat - + This torrent is private - Aquest torrent és privat. + Aquest torrent és privat - + Updating... Actualitzant... - + Not working - No funciona + Aturat - + Not contacted yet - Encara no s'hi ha contactat. + Encara sense connexió - - - - - - - N/A - + + Tracker URL: + URL del rastrejador: - + Tracker editing Edició del rastrejador - - Tracker URL: - URL del rastrejador: - - - - + + Tracker editing failed - Ha fallat l'edició del rastrejador. + Edició del rastrejador fallada - + The tracker URL entered is invalid. - L'URL del rastrejador introduït no és vàlid. + L'URL entrada del rastrejador és invàlida. - + The tracker URL already exists. L'URL del rastrejador ja existeix. - + Add a new tracker... Afegeix un rastrejador nou... - - Remove tracker - Suprimeix el rastrejador - - - + Copy tracker URL - Copia l'URL del rastrejador + Copia la URL del rastrejador - + Edit selected tracker URL Edita l'URL del rastrejador seleccionat - + Force reannounce to selected trackers - Força el reanunci als rastrejadors seleccionats + Força el reanunci dels rastrejadors seleccionats - + Force reannounce to all trackers - Forca el reanunci a tots els rastrejadors - - - - URL - URL - - - - Status - Estat - - - - Received - Rebut - - - - Seeds - Llavors - - - - Peers - Clients - - - - Downloaded - Baixats - - - - Message - Missatge - - - - Column visibility - Visibilitat de les columnes - - - - TrackerLoginDialog - - - - Tracker authentication - Autenticació del rastrejador - - - - Tracker: - Rastrejador: - - - - Login - Entrada - - - - Username: - Nom d'usuari: - - - - Password: - Contrasenya: + Forca el reanunci per a tots els rastrejadors - - Log in - Entra + + Remove tracker + Suprimeix el rastrejador - TrackersAdditionDialog + TrackersAdditionDlg - + Trackers addition dialog Diàleg per a afegir rastrejadors - + List of trackers to add (one per line): - Llista de rastrejadors per afegir (un per línia): + Llista de rastrejadors a afegir (un per línia): - - + + µTorrent compatible list URL: Llista d'URL de µTorrent compatibles: - + + I/O Error + Error d'entrada-sortida + + + + Error while trying to open the downloaded file. + Error en intentar obrir el fitxer baixat. + + + No change Sense canvis - + No additional trackers were found. No s'ha trobat cap rastrejador addicional. - + Download error Error de baixada - + The trackers list could not be downloaded, reason: %1 - No s'ha pogut baixar la llista de rastrejadors. Raó: %1 + No s'ha pogut baixar la llista de rastrejadors Raó: %1 TransferListDelegate - + Downloading - Baixant + S'està baixant - + Downloading metadata used when loading a magnet link Baixant metadades - + Allocating qBittorrent is allocating the files on disk Distribuint - + Paused Pausat - + Queued i.e. torrent is queued - A la cua + A cua - + Seeding Torrent is complete and in upload-only mode - Sembra + Sembrando - + Stalled Torrent is waiting for download to begin Detinguda - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] Baixant - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. - Sembrant [F]  + [F] Sembrant - + Checking Torrent local data is being checked Verificant - + Queued for checking i.e. torrent is queued for hash checking - A la cua per comprovar + En cua per a comprovació - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - Comprovant les dades de represa + S'estan comprovant les dades de represa - + Completed Completat - - Moving - Torrent local data are being moved/relocated - Moure - - - + Missing Files Fitxers absents - + Errored torrent status, the torrent has an error Amb errors - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - %1 (sembrat durant %2) - - - - %1 ago - e.g.: 1h 20m ago - fa %1 - - - - TransferListFiltersWidget - - - Status - Estat - - - - Categories - Categories - - - - Tags - Etiquetes - - - - Trackers - Rastrejadors - - - - TransferListModel - - - Name - i.e: torrent name - Nom - - - - Size - i.e: torrent size - Mida - - - - Done - % Done - Fet - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Estat - - - - Seeds - i.e. full sources (often untranslated) - Llavors - - - - Peers - i.e. partial sources (often untranslated) - Clients - - - - Down Speed - i.e: Download speed - Vel. de baixada - - - - Up Speed - i.e: Upload speed - Vel. de pujada - - - - Ratio - Share ratio - Ràtio - - - - ETA - i.e: Estimated Time of Arrival / Time left - Temps estimat - - - - Category - Categoria - - - - Tags - Etiquetes - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - Afegit el - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - Completat el - - - - Tracker - Rastrejador - - - - Down Limit - i.e: Download limit - Límit de baixada - - - - Up Limit - i.e: Upload limit - Límit de pujada - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Baixat - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Pujat - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - Baixada de la sessió - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - Pujada de la sessió - - - - Remaining - Amount of data left to download (e.g. in MB) - Restant - - - - Time Active - Time (duration) the torrent is active (not paused) - Temps d'activitat - - - - Save path - Torrent save path - Camí de desament - - - - Completed - Amount of data completed (e.g. in MB) - Completat - - - - Ratio Limit - Upload share ratio limit - Límit de ràtio + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) + %1 (sembrat per %2) - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - Últim cop vist complet + + %1 ago + e.g.: 1h 20m ago + fa %1 + + + TransferListFiltersWidget - - Last Activity - Time passed since a chunk was downloaded/uploaded - Darrera activitat + + Status + Estat - - Total Size - i.e. Size including unwanted data - Mida total + + Categories + Categories + + + + Trackers + Rastrejadors TransferListWidget - + Column visibility Visibilitat de columnes - + Choose save path - Trieu un camí de desament + Seleccioneu un camí de desada - + Torrent Download Speed Limiting Límit de velocitat de baixada de torrents - + Torrent Upload Speed Limiting Límit de velocitat de pujada de torrents - + Recheck confirmation Ratifica la confirmació - + Are you sure you want to recheck the selected torrent(s)? - Segur que voleu tornar a comprovar els torrents seleccionats? + Esteu segur que voleu tornar a comprovar els torrents seleccionats? - + Rename Canvia el nom - + New name: Nou nom: - + Resume Resume/start the torrent Reprèn - + Force Resume Force Resume/start the torrent Força la represa - + Pause Pause the torrent Pausa - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Estableix la ubicació: es mou «%1», de «%2» a «%3» - - - - Add Tags - Afegeix etiquetes - - - - Remove All Tags - Suprimeix totes les etiquetes - - - - Remove all tags from selected torrents? - Voleu suprimir totes les etiquetes dels torrents seleccionats? + + New Category + Categoria nova - - Comma-separated tags: - Etiquetes separades per comes: + + Category: + Categoria: - - Invalid tag - Etiqueta no vàlida + + Invalid category name + El nom de la categoria no és vàlid - - Tag name: '%1' is invalid - El nom d'etiqueta "%1" no és vàlid. + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + El nom de la categoria no ha d'incluore'\' +El nom de la categoria no ha començar ni acabar amb '/' +El nom de la categoria no ha d'incloure la seqüència '//' - + Delete Delete the torrent Suprimeix - + Preview file... Previsualitza el fitxer... - + Limit share ratio... - Límit de ràtio de compartició... + Límit de ràtio de compartició ... - + Limit upload rate... Taxa límit de pujada... - + Limit download rate... Taxa límit de baixada... - + Open destination folder Obre la carpeta de destinació - + Move up i.e. move up in the queue - Mou amunt + Moure amunt - + Move down i.e. Move down in the queue - Mou avall + Moure avall - + Move to top i.e. Move to top of the queue - Mou al capdamunt + Moure al principi - + Move to bottom i.e. Move to bottom of the queue - Mou al capdavall + Moure al final - + Set location... Estableix una destinació... - - Force reannounce - Força el reanunci - - - + Copy name Copia el nom - - Copy hash - Copia'n l'etiqueta - - - + Download first and last pieces first - Baixa primer el primer i l'últim tros. + Baixa primer les primeres i últimes parts - + Automatic Torrent Management - Gestió automàtica dels torrents + - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - El mode automàtic significa que diverses propietats dels torrents (p. ex. els camins de desament) es decidiran segons la categoria associada. + El Mode Automàtic significa que diverses propietats dels torrent (p.ex. camins de desat) es configuraran segons la categoria associada. - + Category Categoria - + New... New category... Nou... - + Reset Reset category - Restableix - - - - Tags - Etiquetes - - - - Add... - Add / assign multiple tags... - Afegeix... - - - - Remove All - Remove all tags - Suprimeix-ho tot + Reinicialitza - + Priority Prioritat - + Force recheck Força la verificació - + Copy magnet link - Copia l'enllaç magnètic + Copia l'enllaç magnet - + Super seeding mode - Mode de supersembra + Mode de SuperSembra - + Rename... Canvia el nom... - + Download in sequential order Baixa en ordre seqüencial - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - Limitació de ràtio de pujada / baixada + Limitació del ràtio de pujada/baixada - - Use global share limit - Usa el límit de compartició global. + + Use global ratio limit + Utilitza límit de ràtio global - - - + + + buttonGroup - Grup de botons + buttonGroup + + + + Set no ratio limit + Sense límits de ràtio + + + + Set ratio limit to + Limita la ràtio a + + + + WebApplication + + + Incorrect category name + + + + + WebUI + + + The Web UI is listening on port %1 + La interfície web està contactant al port %1 - - Set no share limit - No estableixis límit de compartició. + + Web UI Error - Unable to bind Web UI to port %1 + Error de la interfície web - Impossible ancorar la interfície al port %1 + + + about - - Set share limit to - Estableix el límit de compartició a + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + - - ratio - ràtio + + Copyright %1 2006-2016 The qBittorrent project + Copyright %1 2006-2016 The qBittorrent project - - minutes - minuts + + Home Page: + Pàgina principal: - - No share limit method selected - No s'ha seleccionat cap mètode de límit de compartició. + + Forum: + Fòrum: - - Please select a limit method first - Si us plau, seleccioneu primer un mètode de límit. + + Bug Tracker: + - Utils::ForeignApps + addPeersDialog + + + Add Peers + Afegeix parells: + - - Python detected, version: %1 - Python detectat, versió: %1 + + List of peers to add (one per line): + Llista de parells a afegir (un per línia): - - Python not detected - Python no detectat + + Format: IPv4:port / [IPv6]:port + Format: IPv4:port / [IPv6]:port - WebApplication + authentication + + + + Tracker authentication + Autentificació del rastrejador + + + + Tracker: + Rastrejador: + + + + Login + Inicia sessió + - - Unacceptable file type, only regular file is allowed. - El tipus de fitxer no és acceptable, només s'admeten fitxers normals. + + Username: + Usuari: - - Symlinks inside alternative UI folder are forbidden. - No es permeten els enllaços simbòlics a les carpetes d'interfície d'usuari alternativa. + + Password: + Contrasenya: - - Exceeded the maximum allowed file size (%1)! - S'ha superat la mida de fitxer màxima permesa (%1)! + + Log in + Connecta - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - Interfície web: la capçalera d'origen i l'origen de destinació no coincideixen! IP d'origen: «%1». Capçalera d'origen «%2». Origen de destinació: «%3» + + Cancel + Cancel·la + + + confirmDeletionDlg - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - Interfície web: la capçalera de referència i l'origen de destinació no coincideixen! IP d'origen: «%1». Capçalera de referència «%2». Origen de destinació: «%3» + + Deletion confirmation - qBittorrent + Confirmació de supressió - qBittorrent - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - Interfície web: capçalera d'amfitrió, el port no coincideix. IP origen de la petició: «%1». Port del servidor: «%2». Capçalera d'amfitrió rebuda: «%3» + + Remember choice + Recorda sempre aquesta elecció - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - Interfície web: capçalera d'amfitrió no vàlida. IP origen de la petició: «%1». Capçalera d'amfitrió rebuda: «%2» + + Also delete the files on the hard disk + Suprimeix també el fitxer del disc dur - WebUI + confirmShutdownDlg + + + Don't show again + + + + + createTorrentDialog + + + Cancel + Cancel·la + + + + Torrent Creation Tool + Eina de creació de torrents + + + + Torrent file creation + Creació d'un fitxer torrent + + + + Add file + Afegeix un fitxer + + + + Add folder + Afegeix una carpeta + + + + File or folder to add to the torrent: + Fitxer o carpeta a afegir al torrent: + + + + Tracker URLs: + URL del rastrejador: + + + + Web seeds urls: + Llavors web urls: + + + + Comment: + Comentari: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Podeu separar grups de rastrejadors amb una línia en blanc. + + + + Piece size: + Mida de la part: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + Auto + + + + Private (won't be distributed on DHT network if enabled) + Privat (no es distribuirà per xarxa DHT si s'habilita) + + + + Start seeding after creation + Començar amb la sembra després de la creació + + + + Ignore share ratio limits for this torrent + Ignora el límit del ràtio de compartició per a aquest torrent + + + + Create and save... + Crea i desa... + + + + Progress: + Progrés: + + + + downloadFromURL + + + Add torrent links + Afegeix enllaços torrent + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Un per línia (enllaços HTTP, enllaços magnet i informació de funcions resum (hash) permeses) + + + + Download + Baixa + + + + Cancel + Cancel·la + - - Web UI: HTTPS setup successful - Interfície web: configuració d'HTTPS correcta. + + Download from urls + Baixa des dels URL - - Web UI: HTTPS setup failed, fallback to HTTP - Interfície web: ha fallat la configuració d'HTTPS, es torna a HTTP. + + No URL entered + No s'ha escrit cap URL - - Web UI: Now listening on IP: %1, port: %2 - Interfície web: ara s'escolta la IP %1, port %2. + + Please type at least one URL. + Escriviu almenys un URL. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Interfície web: no es pot vincular a la IP %1, port %2. Raó: %3 + + Crash info + Informació de la caiguda fsutils - + + + + + Downloads Baixades @@ -9766,100 +8740,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) - PiB + - + EiB exbibytes (1024 pebibytes) - EiB + + + + + Python not detected + Python no detectat + + + + Python version: %1 + Versió de Python: %1 - + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1h %2m - + %1d %2h e.g: 2days 10hours %1d %2h - + Unknown Unknown (size) Desconegut - + qBittorrent will shutdown the computer now because all downloads are complete. - El qBittorrent tancarà l'ordinador ara, perquè s'han completat totes les baixades. + El qBittorrent tancarà l'equip ara, perquè totes les baixades s'han completat. - + < 1m < 1 minute <1m - + %1m e.g: 10minutes %1m + + + Working + Operatiu + + + + Updating... + Actualitzant... + + + + Not working + No operatiu + + + + Not contacted yet + Encara no connectat + preview - + Preview selection Selecció de vista prèvia - + The following files support previewing, please select one of them: Els següents fitxers permeten previsualització, seleccioneu-ne algun: + + + Preview + Vista prèvia + + + + Cancel + Cancel·la + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_cs.ts qbittorrent-3.3.15/src/lang/qbittorrent_cs.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_cs.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_cs.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - O qBittorrent + O aplikaci qBittorrent - + About - O + O aplikaci - + Author Autor - - Current maintainer - Aktuální správce - - - - Greece - Řecko + + + Nationality: + - - - Nationality: - Národnost: + + + Name: + Jméno: - - + + E-mail: E-mail: - - - Name: - Jméno: + + Greece + Řecko - - Original author - Původní autor + + Current maintainer + Současný správce - - France - Francie + + Original author + Původní autor - + Special Thanks - Zvláštní poděkování + Speciální poděkování - + Translators Překladatelé - - License - Licence - - - + Libraries Knihovny - + qBittorrent was built with the following libraries: - qBittorrent byl vytvořen s následujícími knihovnami: - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - Pokročilý BitTorrent klient naprogramovaný v jazyce C ++, založený na Qt toolkit a libtorrent-rasterbar. - - - - Copyright %1 2006-2018 The qBittorrent project - Copyright %1 2006-2018 The qBittorrent projekt - - - - Home Page: - Domovská stránka: + qBittorrent využívá těchto knihoven: - - Forum: - Forum: + + France + Francie - - Bug Tracker: - Sledování chyb: + + License + Licence @@ -115,69 +90,79 @@ Uložit jako - + + Browse... + Procházet... + + + + Set as default save path + Nastavit jako výchozí cestu pro uložení + + + Never show again Už nikdy nezobrazovat - + Torrent settings Nastavení torrentu - + Set as default category Nastavit jako výchozí kategorii - + Category: Kategorie: - + Start torrent Spustit torrent - + Torrent information Info o torrentu - + Skip hash check - Přeskočit kontrolu hashe + Přeskočit kontrolu haše - + Size: Velikost: - + Hash: - Hash: + - + Comment: Komentář: - + Date: Datum: Torrent Management Mode: - Režim správy torrentu: + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - Automatický mód znamená, že různé vlastnosti torrentu (např. cesta uložení) budou přiřazeny podle příslušné kategorie + @@ -190,117 +175,89 @@ Automatický - - Remember last used save path - Zapamatovat si naposledy použitou cestu - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - Pokud je zaškrtnuto, torrent soubor nebude smazán, navzdory nastavení v sekci "stahování" a dialogovém okně možnosti + - + Do not delete .torrent file - Nemazat soubor .torrent - - - - Create subfolder - Vytvořit podsložku - - - - Download in sequential order - Stáhnout v sekvenčním pořadí + Nemazat soubor.torrent - - Download first and last pieces first - Nejprve si stáhněte první a poslední části - - - + Normal Normální - + High Vysoká - + Maximum Maximální - + Do not download Nestahovat - - - + + + I/O Error Chyba I/O - + Invalid torrent Neplatný torrent - - Renaming - Přejmenování - - - - - Rename error - Chyba přejmenování - - - - The name is empty or contains forbidden characters, please choose a different one. - Název je prázdný, nebo obsahuje nepodporované znaky. Prosím, zvolte jiný. + + + + + Already in download list + Torrent je již v seznamu ke stažení - + Not Available This comment is unavailable Není k dispozici - + Not Available This date is unavailable Není k dispozici - + Not available Není k dispozici - + Invalid magnet link - Neplatný magnet link + Neplatný magnet odkaz - + The torrent file '%1' does not exist. Torrent '%1' neexistuje - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. - Torrent '%1' nemůže být přečten z disku. Pravděpodobně na to nemáte dostatečná práva. + Torrent '%1' nemůže být přečten z disku. Pravděpodobně na to nemáte určitá práva. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ Error: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + + + + + Torrent is already in download list. Trackers were merged. + Torrent je již v seznamu ke stažení. Trackery byly sloučeny. + + + + + Cannot add torrent + Nelze přidat torrent + + + + Cannot add this torrent. Perhaps it is already in adding state. + Nelze přidat tento torrent. Zřejmě se již jednou přidává. + + + This magnet link was not recognized - Tento magnet link nebyl rozpoznán + Tento magnet odkaz nebyl rozpoznán + + + + Magnet link is already in download list. Trackers were merged. + Magnet je již v seznamu ke stažení. Trackery byly sloučeny. + + + + Cannot add this torrent. Perhaps it is already in adding. + Nelze přidat tento torrent. Zřejmě se již jednou přidává. - + Magnet link - Magnet link + Magnet odkaz - + Retrieving metadata... - Získávám metadata... + Načítám metadata... - + Not Available This size is unavailable. Není k dispozici - + Free space on disk: %1 Volné místo na disku: %1 - + + Choose save path Vyberte cestu pro uložení - - - - - - - Torrent is already present - Torrent už je přidán - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - Torrent '%1' již existuje v seznamu pro stažení. Trackery nebyly sloučeny, protože je torrent soukromý. - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - Torrent '%1' už existuje v seznamu přenosů. Trackery byly sloučeny. - - - - Torrent is already queued for processing. - Torrent je již zařazen do fronty pro zpracování. + + Rename the file + Přejmenovat soubor - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - Magnet link '%1' už existuje v seznamu přenosů. Trackery byly sloučeny. + + New name: + Nový název: - - Magnet link is already queued for processing. - Magnet odkaz je již zařazen do fronty pro zpracování. + + + The file could not be renamed + Soubor nelze přejmenovat - - New name: - Nový název: + + This file name contains forbidden characters, please choose a different one. + Název souboru obsahuje nepovolené znaky, zvolte prosím jiný. - - + + This name is already in use in this folder. Please use a different name. Tento název je již v tomto adresáři použit. Vyberte prosím jiný název. - + The folder could not be renamed - Složka nelze přejmenovat + Adresář nelze přejmenovat - + Rename... Přejmenovat... - + Priority Priorita - + Invalid metadata Neplatná metadata - + Parsing metadata... - Parsování metadat... + Analýza metadat... - + Metadata retrieval complete Načítání metadat dokončeno - + Download Error Chyba stahování @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Velikost diskové cache pro zápis + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Odchozí porty (Min) [0: Vypnuto] - + Outgoing ports (Max) [0: Disabled] Odchozí porty (Max) [0: Vypnuto] - + Recheck torrents on completion Při dokončení překontrolovat torrenty - + Transfer list refresh interval Interval obnovování seznamu přenosů - + ms milliseconds ms - + Setting Nastavení - + Value Value set for this setting Hodnota - - - (disabled) - (vypnuto) - - - + (auto) (auto) - - min - minutes - min - - - + All addresses - Všechny adresy + - + qBittorrent Section - Sekce qBittorrentu + - - + + Open documentation - Otevřít dokumentaci + - + libtorrent Section - Sekce libtorrentu - - - - Asynchronous I/O threads - Asynchronní I/O vlákna - - - - Disk cache - Disková cache + - + s seconds s - + Disk cache expiry interval Interval vypršení diskové cache - + Enable OS cache Zapnout vyrovnávací paměť systému - - Guided read cache - Řízená cache pro čtení - - - - Coalesce reads & writes - Sloučení čtecích & zapisovacích operací - - - - Send upload piece suggestions - Doporučení pro odeslání částí uploadu - - - - - KiB - KiB - - - - Send buffer watermark - Odeslat watermark bufferu - - - - Send buffer low watermark - Odeslat buffer-low watermark - - - - Send buffer watermark factor - Odeslat buffer watermark faktor - - - - Prefer TCP - Upřednostnit TCP - - - - Peer proportional (throttles TCP) - Peer proportional (omezit TCP) - - - - Allow multiple connections from the same IP address - Povolit více spojení ze stejné IP adresy + + m + minutes + m - + Resolve peer countries (GeoIP) Zjišťovat zemi původu protějšků (GeoIP) - + Resolve peer host names - Zjišťovat síťové názvy protějšků + Zjišťovat názvy počítačů protějšků - + Strict super seeding Striktní super seeding - + Network Interface (requires restart) Síťové rozhraní (vyžaduje restart) - + Optional IP Address to bind to (requires restart) - Volitelná přidružená IP adresa (vyžaduje restart) + - + Listen on IPv6 address (requires restart) Naslouchat na adrese IPv6 (vyžaduje restart) - + Display notifications - Zobrazit notifikace + - + Display notifications for added torrents - Zobrazit oznámení o přidaných torrentech + - + Download tracker's favicon - Stáhnout logo trackeru - - - - Save path history length - Uložit délku historie cesty - - - - Fixed slots - Fixed slots - - - - Upload rate based - Upload rate based - - - - Upload slots behavior - Chování upload slotů - - - - Round-robin - Poměrné rozdělení - - - - Fastest upload - Nejrychlejší upload - - - - Anti-leech - Priorita pro začínající a končící leechery - - - - Upload choking algorithm - Škrtící algoritmus pro upload + - + Confirm torrent recheck Potvrdit překontrolování torrentu - - Confirm removal of all tags - Potvrdit odebrání všech štítků + Exchange trackers with other peers + Vyměňovat trackery s ostatními protějšky - - Always announce to all trackers in a tier - Vždy oznamovat všem trackerům ve třídě + + Always announce to all trackers + Vždy oznamovat všem trackerům - - Always announce to all tiers - Vždy oznamovat všem třídám - - - + Any interface i.e. Any network interface Jakékoli rozhraní - + Save resume data interval How often the fastresume file is saved. - Interval uložení dat obnovení - - - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - %1-TCP mixed mode algoritmus + Interval uložení rychlého obnovení - + Maximum number of half-open connections [0: Unlimited] Maximální počet napůl otevřených spojení [0: Neomezeno] - + IP Address to report to trackers (requires restart) IP adresa hlášená trackerům (vyžaduje restart) - + Enable embedded tracker Povolit vestavěný tracker - + Embedded tracker port Port vestavěného trackeru - + Check for software updates Zkontrolovat aktualizace - + Use system icon theme Použít systémový motiv ikon @@ -738,940 +594,740 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 byl spuštěn - + Torrent: %1, running external program, command: %2 - Torrent: %1, spuštěn externí program, příkaz: %2 - - - - Torrent name: %1 - Název torrentu: %1 - - - - Torrent size: %1 - Velikost torrentu: %1 - - - - Save path: %1 - Cesta pro uložení: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Torrent byl stažen do %1. - - - - Thank you for using qBittorrent. - Děkujeme, že používáte qBittorrent. + - - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' dokončil stahování + + Torrent: %1, run external program command too long (length > %2), execution failed. + - + Torrent: %1, sending mail notification - Torrent: %1, odeslání emailového oznámení + - + Information Informace - - To control qBittorrent, access the Web UI at %1 - Pro ovládání qBittorrentu otevřete webové rozhraní na %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + Pro ovládání qBittorrentu navštivte webové rozhraní na http://localhost:%1 - + The Web UI administrator user name is: %1 Uživatelské jméno administrátora webového rozhraní je: %1 - + The Web UI administrator password is still the default one: %1 - Heslo správce webového rozhraní uživatele je stále výchozí: %1 + Heslo administrátora webového rozhraní je stále to výchozí: %1 - + This is a security risk, please consider changing your password from program preferences. - Toto je bezpečnostní riziko, zvažte prosím změnu hesla v nastavení programu. + Toto je bezpečnostní riziko, zvažte prosím změnu helsa v nastavení programu. - + Saving torrent progress... Průběh ukládání torrentu... - - - Portable mode and explicit profile directory options are mutually exclusive - Přenosný mód a volba výslovného určení adresáře profilu se vzájemně vylučují - - - - Portable mode implies relative fastresume - Přenosný mód předpokládá relativní fastresume - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - WebAPI neúspěšné přihlášení. Důvod: IP je zakázána, IP: %1, uživatel: %2 - - - - Your IP address has been banned after too many failed authentication attempts. - Vaše IP adresa byla zablokována, z důvodu mnoha neúspěšných pokusů o autentizaci. - - - - WebAPI login success. IP: %1 - WebAPI úspěšné přihlášení. IP: %1 - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - WebAPI neúspěšné přihlášení. Důvod: neplatné údaje, počet pokusů: %1, IP: %2, uživatel: %3 - AutomatedRssDownloader - + Save to: Uložit do: RSS Downloader - Stahování RSS + Stahování z RSS - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - Autostahování RSS torrentů je nyní vypnuté! Můžete ho zapnout v nastavení aplikace. + + Enable Automated RSS Downloader + Povolit automatizované stahování z RSS - + Download Rules Pravidla stahování - + Rule Definition Definice pravidla - + Use Regular Expressions Používat regulární výrazy - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - Inteligentní filtr epizod zkontroluje číslo epizody, aby předešel stahování duplicity. -Podporuje formáty: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Datumový formát také podporuje pomlčku "-" jako oddělovač) - - - - Use Smart Episode Filter - Použijte inteligentní filtr epizod - - - + Must Contain: Musí obsahovat: - + Must Not Contain: Nesmí obsahovat: - + Episode Filter: Filtr epizod: - + Assign Category: - Přiřadit kategorii: + - + Save to a Different Directory Uložit do jiného adresáře - + Ignore Subsequent Matches for (0 to Disable) ... X days Ignorovat následné shody po dobu (0 pro vypnutí) - + Disabled - Vypnuto + Vypnuto - + days dnů - + Add Paused: Přidat pozastaveně: - + Use global settings Použít globální nastavení - + Always Vždy - + Never Nikdy - + Apply Rule to Feeds: Použít pravidlo na kanály: - + Matching RSS Articles Odpovídající RSS články - + &Import... &Import... - + &Export... &Export... - + Matches articles based on episode filter. Články odpovídající filtru epizod. - + Example: Příklad: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match odpovídá 2, 5, 8 až 15, 30 a dalším epizodám první sezóny - + Episode filter rules: Pravidla filtru epizod: - + Season number is a mandatory non-zero value Číslo sezóny je povinná nenulová hodnota - + Episode number is a mandatory non-zero value + Číslo epizody je povinná nenulová hodnota + + + Filter must end with semicolon Filtr musí být ukončen středníkem - + Three range types for episodes are supported: Jsou podporovány tři typy rozsahu pro epizody: - + Single number: <b>1x25;</b> matches episode 25 of season one Jedno číslo: <b>1x25;</b> odpovídá epizodě 25 první sezóny - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Rozsah: <b>1x25-40;</b> odpovídá epizodám 25 až 40 první sezóny - - Episode number is a mandatory positive value - Číslo epizody je povinná kladná hodnota - - - - Rules - Pravidla + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Neomezený rozsah: <b>1x25-;</b> odpovídá epizodě 25 a dalším epizodám první sezóny - - Rules (legacy) - Pravidla (původní) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Neukončený rozsah: <b>1x25-;</b> zahrnuje epizody 25 a výše z první sezóny a všechny epizody pozdějších sérií + - + Last Match: %1 days ago Poslední shoda: %1 dny nazpět - + Last Match: Unknown Poslední shoda: Neznámá - + New rule name Nový název pravidla - + Please type the name of the new download rule. - Napište název nového pravidla stahování. + Napište název nového pravidla stahování, prosím. - - + + Rule name conflict Název pravidla koliduje - - + + A rule with this name already exists, please choose another name. - Pravidlo s tímto názvem již existuje, vyberte jiný název, prosím. + Pravidlo s tímto názvem již existuje, vyberte prosím název jiný. - + Are you sure you want to remove the download rule named '%1'? Opravdu chcete odstranit pravidlo s názvem '%1'? - + Are you sure you want to remove the selected download rules? Opravdu chcete odstranit označená pravidla? - + Rule deletion confirmation Potvrdit smazání pravidla - + Destination directory Cílový adresář - + Invalid action Neplatná akce - + The list is empty, there is nothing to export. - Seznam je prázdný, nic není k exportu. + Seznam je prázdný, není co exportovat. - - Export RSS rules - Export RSS pravidel + + Where would you like to save the list? + Kam chcete seznam uložit? - - + + Rules list (*.rssrules) + Seznam pravidel (*.rssrules) + + + I/O Error - Chyba I/O + Chyba I/O - - Failed to create the destination file. Reason: %1 - Nepodařilo se vytvořit cílový soubor. Důvod: % 1 + + Failed to create the destination file + Nezdařilo se vytvořit cílový soubor - - Import RSS rules - Import RSS pravidel + + Please point to the RSS download rules file + Odkažte na soubor s pravidly stahování RSS, prosím - - Failed to open the file. Reason: %1 - Soubor se nepodařilo otevřít. Důvod: % 1 + + Rules list + Seznam pravidel - + Import Error - Chyba importu + Import selhal - - Failed to import the selected rules file. Reason: %1 - Nepodařilo se importovat vybraný soubor pravidel. Důvod: % 1 + + Failed to import the selected rules file + Import vybraného seznamu pravidel se nezdařil - + Add new rule... Přidat nové pravidlo... - + Delete rule Smazat pravidlo - + Rename rule... Přejmenovat pravidlo... - + Delete selected rules Smazat označená pravidla - - Clear downloaded episodes... - Odstranit stažené epizody... - - - + Rule renaming Přejmenování pravidla - + Please type the new rule name Napište název nového pravidla, prosím - - Clear downloaded episodes - Odstranit stažené epizody - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - Opravdu chcete vymazat seznam stažených epizod pro vybrané pravidlo? - - - - Regex mode: use Perl-compatible regular expressions - Regex mód: použijte regulární výraz komatibilní s Perlem - - - - - Position %1: %2 - Pozice %1: %2 + + Regex mode: use Perl-like regular expressions + Regex mód: použijte Perl syntaxi pro regulární výrazy - + Wildcard mode: you can use - Mód zástupných znaků: můžete použít + - + ? to match any single character - ? pro shodu s libovolným jediným znakem + - + * to match zero or more of any characters - * pro shodu se žádným nebo více jakýmikoliv znaky + - + Whitespaces count as AND operators (all words, any order) - Mezera slouží jako operátor AND (všechna slova v jakémkoliv pořadí) + - + | is used as OR operator - | slouží jako operátor OR + - + If word order is important use * instead of whitespace. - Je-li důležité pořadí slov, použijte * místo mezery. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Výraz s prázdným %1 obsahem (např. %2) + - + will match all articles. - zahrne všechny položky. + - + will exclude all articles. - vyloučí všechny položky. + - - - BanListOptionsDialog - - List of banned IP addresses - Seznam zakázaných IP adres + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Zástupné znaky: lze použít<ul><li>? který odpovídá libovolnému jednomu znaku</li><li>* který odpovídá žádnému nebo více libovolným znakům</li><li>Mezery se počítají jako operátor AND</li></ul> - - Ban IP - Ban IP + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Zástupné znaky: lze použít<ul><li>? který odpovídá libovolnému jednomu znaku</li><li>* který odpovídá žádnému nebo více libovolným znakům</li><li>| odpovídá operátoru OR</li></ul> + + + BitTorrent::Session - - Delete - Vymazat + + Restart is required to toggle PeX support + Kvůli přepnutí podpory PEX je nutný restart - - - Warning - Varování - - - - The entered IP address is invalid. - Vložená IP adresa je neplatná. - - - - The entered IP is already banned. - Vložená IP adresa je již zakázaná. - - - - BitTorrent::Session - - - Restart is required to toggle PeX support - Kvůli přepnutí podpory PEX je nutný restart - - - - Could not get GUID of configured network interface. Binding to IP %1 - Nebylo možné získat GUID nastaveného síťového rozhraní. Přiřazeno k IP %1 - - - + Embedded Tracker [ON] Vestavěný tracker [ZAP] - + Failed to start the embedded tracker! Start vestavěného trackeru selhal! - + Embedded Tracker [OFF] Vestavěný tracker [VYP] - + + '%1' reached the maximum ratio you set. Removing... + '%1' dosáhl maximálního nastaveného poměru sdílení. Odebírám... + + + + '%1' reached the maximum ratio you set. Pausing... + '%1' dosáhl maximálního nastaveného poměru sdílení. Pozastavuji... + + + System network status changed to %1 e.g: System network status changed to ONLINE Systémový stav sítě změněn na %1 - + ONLINE ONLINE - + OFFLINE OFFLINE - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding Nastavení sítě %1 bylo změněno, obnovuji spojení - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. - Adresa síťového rozhraní %1 není platná + - - + Encryption support [%1] - Podpora šífrování [%1] + - - + FORCED - VYNUCENO - - - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 je neplatná IP adresa a vložení do seznamu zakázaných adres bylo zamítnuto. + - - + Anonymous mode [%1] - Anonymní režim [%1] + - + Unable to decode '%1' torrent file. Nelze dekódovat soubor torrentu '%1'. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Rekurzivní stahování souboru '%1' vloženého v torrentu '%2' - + Queue positions were corrected in %1 resume files - Pozice fronty byly opraveny v %1 souborech pro obnovení + - + Couldn't save '%1.torrent' Nelze uložit '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' byl odstraněn ze seznamu přenosů. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' byl odstraněn ze seznamu přenosů a smazán z disku. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '%1' byl odstraněn ze seznamu přenosů, ale soubory nemohly být smazány. Chyba: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. protože %1 je vypnuto. - + because %1 is disabled. this peer was blocked because TCP is disabled. protože %1 je vypnuto. - + URL seed lookup failed for URL: '%1', message: %2 Vyhledání URL sdílení selhalo pro URL: '%1', zpráva: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. - qBitorrent sell v naslouchání na rozhraní %1 port: %2/%3. Důvod: %4. + + + + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' byl odstraněn ze seznamu i z pevného disku. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' byl odstraněn ze seznamu přenosů. - + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Stahuji '%1', prosím čekejte... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent se pokouší naslouchat na jakémkoli rozhraní, portu: %1 - + The network interface defined is invalid: %1 - Vybrané síťové rozhraní je neplatné: %1 + Nastavené síťové rozhraní je neplatné: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent se pokouší naslouchat na rozhraní %1, portu: %2 - - Peer ID: - ID Peera: - - - - HTTP User-Agent is '%1' - Verze webového prohlížeče je '%1' - - - - + DHT support [%1] - Podpora DHT [%1] + - - - - - - - - - + + + + ON - ZAPNUTO + - - - - - - - - - + + + + OFF - VYPNUTO + - - + Local Peer Discovery support [%1] - Podpora hledání místních protějšků [%1] - - - - PeX support [%1] - Podpora PeX [%1] - - - - '%1' reached the maximum ratio you set. Removed. - '%1' dosáhl nastaveného maximálního ratia. Odebrán. - - - - '%1' reached the maximum ratio you set. Paused. - '%1' dosáhl nastaveného maximálního ratia. Pozastaven. - - - - '%1' reached the maximum seeding time you set. Removed. - '%1' dosáhl nastavené maximální doby seedu. Odebrán. - - - - '%1' reached the maximum seeding time you set. Paused. - '%1' dosáhl nastavené maximální doby seedu. Pozastaven. + - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent nenalezl místní adresu %1 na které by měl naslouchat - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent selhal naslouchat na rozhraní %1. Důvod: %2. - + Tracker '%1' was added to torrent '%2' Tracker '%1' byl přidán do torrentu '%2' - + Tracker '%1' was deleted from torrent '%2' Tracker '%1' byl odebrán z torrentu '%2' - + URL seed '%1' was added to torrent '%2' URL zdroj '%1' byl přidán do torrentu '%2' - + URL seed '%1' was removed from torrent '%2' URL zdroj '%1' byl odebrán z torrentu '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Nelze obnovit torrent '%1'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number IP filter byl úspěšně zpracován: bylo aplikováno %1 pravidel. - + Error: Failed to parse the provided IP filter. Chyba: Nepovedlo se zpracovat poskytnutý IP filtr. - - '%1' restored. - 'torrent name' restored. - '%1' obnovena. - - - + Couldn't add torrent. Reason: %1 Nelze přidat torrent. Důvod: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' obnoven. (rychlé obnovení) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' přidán do seznamu stahování. - + An I/O error occurred, '%1' paused. %2 Došlo k chybě I/O, '%1' je pozastaven. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Namapování portů selhalo, zpráva: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Namapování portů bylo úspěšné, zpráva: %1 - + due to IP filter. this peer was blocked due to ip filter. kvůli IP filtru. - + due to port filter. this peer was blocked due to port filter. kvůli port filtru. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. kvůli omezením i2p mixed módu. - + because it has a low port. this peer was blocked because it has a low port. kvůli nízkému portu. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent naslouchá na rozhraní %1, portu: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 Externí IP: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - vytvoření nového torrentu selhalo - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - Stáhnout nejprve první a poslední část: %1, torrent: '%2' - - - - On - Zapnuto - - - - Off - Vypnuto - - - - Successfully moved torrent: %1. New path: %2 - Úspěšně přesunut torrent: %1. Nová cesta: %2 - - - + Could not move torrent: '%1'. Reason: %2 Nelze přesunout torrent: '%1'. Důvod: %2 - + File sizes mismatch for torrent '%1', pausing it. Nesouhlasí velikost souborů u torrentu '%1', pozastavuji. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... Rychlé obnovení torrentu '%1' bylo odmítnuto z důvodu: %2. Zkouším znovu... @@ -1679,19 +1335,19 @@ CategoryFilterModel - + Categories - Kategorie + - + All - Vše + Vše - + Uncategorized - Nezařazeno + @@ -1699,42 +1355,75 @@ Add category... - Přidat kategorii... + Add subcategory... - Přidat podkategorii + - Edit category... - Upravit kategorie... - - - Remove category - Odstranit kategorii + - + Remove unused categories - Odstranit nevyužité kategorie + - + Resume torrents - Obnovit torrenty + Obnovit torrenty - + Pause torrents - Pozastavit torrenty + Pozastavit torrenty - + Delete torrents - Smazat torrenty + Smazat torrenty + + + + New Category + + + + + Category: + Kategorie: + + + + Invalid category name + + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + @@ -1742,7 +1431,7 @@ Manage Cookies - Spravovat cookies + @@ -1750,244 +1439,125 @@ Domain - Doména + Path - Cesta + Name - Název + Název Value - Hodnota + Hodnota Expiration Date - Expirace + - DeletionConfirmationDialog - - - Deletion confirmation - Potvrzení smazání - - - - Remember choice - Zapamatovat volbu - - - - Also delete the files on the hard disk - Smazat také soubory z pevného disku - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? Opravdu chcete smazat '%1' ze seznamu přenosů? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - Opravdu chcete smazat tyto %1 torrenty ze seznamu přenosů? - - - - DownloadFromURLDialog - - - Download from URLs - Stahovat z URL - - - - Add torrent links - Přidat odkazy torrentů - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - Jeden odkaz na řádek (jsou podporovány odkazy HTTP, Magnet linky odkazy a info-hashes ) - - - - Download - Stahování - - - - No URL entered - Nebylo vloženo žádné URL - - - - Please type at least one URL. - Prosím napište alespoň jedno URL. + Opravdu chcete smazat %1 torrenty ze seznamu přenosů? DownloadedPiecesBar - + White: Missing pieces Bílé: Chybějící díly - + Green: Partial pieces Zelené: Částečné díly - + Blue: Completed pieces Modré: Celé díly - ExecutionLogWidget + ExecutionLog - + General Obecné - + Blocked IPs Blokované IP - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked <font color='red'>%1</font> byl zablokován %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - <font color='red'>%1</font> byl zakázán + <font color='red'>%1</font> byl zakázán (ban) FeedListWidget - + RSS feeds RSS kanály - - - Unread (%1) - Nezobrazeno (%1) + + Unread + Nepřečtené FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - Vyskytla se chyba při pokusu otevřít log soubor. Zaznamenávání do souboru je vypnuto. - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - Vyhledat... - - - - Choose a file - Caption for file open/save dialog - Zvolit soubor - - - - Choose a folder - Caption for directory open dialog - Zvolit adresář - - - - Any file - Jakýkoliv soubor + + An error occured while trying to open the log file. Logging to file is disabled. + FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - Chyba I/O: Nelze otevřít IP filtr v režimu pro čtení. - - - - - - IP filter line %1 is malformed. - Řádka %1 IP filtru je chybná. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - Řádka %1 IP filtru je chybná. Počáteční IP z rozsahu je chybná. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - Řádka %1 IP filtru je chybná. Koncová IP z rozsahu je chybná. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - Řádka %1 IP filtru je chybná. Jenda IP adresa je IPv4 a další je IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - Nastala výjimka IP filtru pro linku %1. Výjimka je: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - Došlo k chybě při analýze IP filtru% 1. + + + + I/O Error: Could not open ip filter file in read mode. + I/O Chyba: Nelze otevřít soubor s IP filtrem pro čtení. - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. Chyba parsování: soubor s filtrem není validní PeerGuardian P2B soubor. @@ -1995,396 +1565,472 @@ GeoIPDatabase - - + + Unsupported database file size. Nepodporovaná velikost databázového souboru. - + Metadata error: '%1' entry not found. Chyba metadat: '%1' nenalezeno. - + Metadata error: '%1' entry has invalid type. - Chyba metadat: '%1' je neplatný. + Chyba metadat: '%1' není validní. - + Unsupported database version: %1.%2 Nepodporovaná verze databáze: %1.%2 - + Unsupported IP version: %1 Nepodporovaná verze IP: %1 - + Unsupported record size: %1 Nepodporovaná velikost záznamu: %1 - + Invalid database type: %1 Neplatný typ databáze: %1 - + Database corrupted: no data section found. Databáze poškozena: data nenalezena. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - Požadavek Http překračuje limit velikosti, zavírám socket. Limit: %ld, IP: %s + + File + Soubor - - Bad Http request, closing socket. IP: %s - Vadný Http požadavek, zavírám socket. IP: %s + + Edit + Úpravy - - - HttpServer - + + Help + Nápověda + + + Exit qBittorrent Ukončit qBittorrent - + Only one link per line Pouze jeden odkaz na řádek - + + Download + Stahování + + + Global upload rate limit must be greater than 0 or disabled. Globální limit odesílání musí být větší než 0 nebo vypnut. - + Global download rate limit must be greater than 0 or disabled. Globální limit stahování musí být větší než 0 nebo vypnut. - + Alternative upload rate limit must be greater than 0 or disabled. Alternativní limit odesílání musí být větší než 0 nebo vypnut. - + Alternative download rate limit must be greater than 0 or disabled. Alternativní limit stahování musí být větší než 0 nebo vypnut. - + Maximum active downloads must be greater than -1. Maximum aktivních stahování musí být větší než -1. - + Maximum active uploads must be greater than -1. Maximum aktivních odesílání musí být větší než -1. - + Maximum active torrents must be greater than -1. Maximum aktivních torrentů musí být větší než -1. - + Maximum number of connections limit must be greater than 0 or disabled. Maximální počet spojení musí být větší než 0 nebo vypnut. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Maximální počet spojení na torrent musí být větší než 0 nebo vypnut. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Limit maximálního počtu slotů na torrent musí být větší než 0 nebo vypnut. - + Unable to save program preferences, qBittorrent is probably unreachable. Nelze uložit nastavení programu, qBittorrent klient je pravděpodobně nedostupný. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent na Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - Neplatný název kategorie: -Nepoužívejte žádné speciální znaky ani diakritiku v názvu kategorie. - - - - Unknown - Neznámý - - - - Hard Disk - Pevný disk - - - - Share ratio limit must be between 0 and 9998. - Limit ratia musí být v rozsahu od 0 do 9998. - - - - Seeding time limit must be between 0 and 525600 minutes. - Doba seedování musí být v rozsahu od 0 do 525600 minut. + + Language + Jazyk - + The port used for incoming connections must be between 1 and 65535. Port příchozích spojení musí být mezi 1 a 65535. - + The port used for the Web UI must be between 1 and 65535. Port webového rozhraní musí být mezi 1 a 65535. - + Unable to log in, qBittorrent is probably unreachable. Nelze se přihlásit, qBittorrent je pravděpodobně nedostupný - + Invalid Username or Password. Neplatné jméno nebo heslo - - Username - Uživatelské jméno - - - + Password Heslo - + Login Přihlášení - + + Upload Failed! + Nahrávání selhalo! + + + Original authors Původní autoři - + + Upload limit: + Omezení odesílání: + + + + Download limit: + Omezení stahování: + + + Apply Použít - + Add Přidat - + + Category: + Kategorie: + + + Upload Torrents Upload torrent files to qBittorent using WebUI - Nahrát torrenty + - + + All + Vše + + + + Downloading + Stahuji + + + + Seeding + Sdílím + + + + Completed + Dokončeno + + + + Resumed + Obnoveno + + + + Paused + Pozastaveno + + + + Active + Aktivní + + + + Inactive + Neaktivní + + + Save files to location: Ukládat soubory do umístění: - + Cookie: Cookie: - + Type folder here Zadejte název adresáře - + + Run an external program on torrent completion + Po dokončení torrentu spustit externí program + + + + Enable bandwidth management (uTP) + Zapnout řízení šířky pásma (uTP) + + + + Apply rate limit to uTP connections + Použít omezení rychlosti pro uTP připojení + + + + Alternative Global Rate Limits + Alternativní celkové limity rychlosti + + + More information Více informací - + Information about certificates Informace o certifikátech - + Save Files to Uložit soubory do - - Set location - Nastavit umístění - - - - Limit upload rate - Omezit rychlost odesílání + + Watch Folder + Sledovaný adresář - - Limit download rate - Omezit rychlost stahování + + Default Folder + Výchozí adresář - - Rename torrent - Přejmenovat torrent + + from + from time1 to time2 + od - - Unable to create category - + + to + from time1 to time2 + do - + Other... Save Files to: Watch Folder / Default Folder / Other... Jiná... - + + Every day + Schedule the use of alternative rate limits on ... + Každý den + + + + Week days + Schedule the use of alternative rate limits on ... + Pracovní dny + + + + Week ends + Schedule the use of alternative rate limits on ... + Víkendy + + + Monday Schedule the use of alternative rate limits on ... Pondělí - + Tuesday Schedule the use of alternative rate limits on ... Úterý - + Wednesday Schedule the use of alternative rate limits on ... Středa - + Thursday Schedule the use of alternative rate limits on ... Čtvrtek - + Friday Schedule the use of alternative rate limits on ... Pátek - + Saturday Schedule the use of alternative rate limits on ... Sobota - + Sunday Schedule the use of alternative rate limits on ... Neděle - + + Downloaded + Is the file downloaded or not? + Staženo + + + Logout Odhlásit - + + Download from URLs + + + + Download Torrents from their URLs or Magnet links - Stahovat torrenty z jejich URL nebo Magnet linku + - + Upload local torrent Nahrát lokální torrent - + Are you sure you want to delete the selected torrents from the transfer list? Opravdu chcete smazat vybrané torrenty ze seznamu přenosů? - + Save Uložit - + qBittorrent client is not reachable Klient qBittorrent není dostupný - - qBittorrent has been shutdown. - qBittorrent byl ukončen. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Seznam povolených IP podsítí + + HTTP Server + HTTP Server - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Příklad: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Podporovány jsou následující parametry: - - Add subnet - Přidat podsíť + + Torrent path + Cesta k torrentu - - Delete - Smazat + + Torrent name + Název torrentu - - Error - Chyba + + qBittorrent has been shutdown. + qBittorrent byl ukončen. + + + LineEdit - - The entered subnet is invalid. - Zadaná podsíť je neplatná + + Clear the text + Vymazat text LogListWidget - + Copy Kopírovat - + Clear Vymazat @@ -2417,551 +2063,492 @@ Při &dokončení stahování - + &View &Zobrazit - + &Options... &Možnosti... - + &Resume &Obnovit - + Torrent &Creator &Vytvoření torrentu - + Set Upload Limit... Nastavit limit odesílání... - + Set Download Limit... Nastavit limit stahování... - + Set Global Download Limit... Nastavit celkový limit stahování... - + Set Global Upload Limit... Nastavit celkový limit odesílání... - + Minimum Priority Minimální priorita - + Top Priority Top priorita - + Decrease Priority Snížit prioritu - + Increase Priority Zvýšit prioritu - - + + Alternative Speed Limits Alternativní limity rychlosti - + &Top Toolbar Horní panel nás&trojů - + Display Top Toolbar Zobrazit horní panel nástrojů - - Status &Bar - Stavová lišta - - - + S&peed in Title Bar R&ychlost v záhlaví okna - + Show Transfer Speed in Title Bar Zobrazit aktuální rychlost v záhlaví okna - + &RSS Reader &RSS čtečka - + Search &Engine Vyhl&edávač - + L&ock qBittorrent Zamkn&out qBittorrent - + Do&nate! Darujte! - - Close Window - Zavřít okno - - - + R&esume All Obnovit vš&e - + Manage Cookies... - Spravovat cookies... + - + Manage stored network cookies - Spravovat uložené síťové cookies + - + Normal Messages - Normální sdělení + - + Information Messages - Informační sdělení + - + Warning Messages - Varovná sdělení + - + Critical Messages - Kritická sdělení + - + &Log &Log - + &Exit qBittorrent Ukončit qBittorr&ent - + &Suspend System U&spat počítač - + &Hibernate System &Režim spánku - + S&hutdown System &Vypnout počítač - + &Disabled &Zakázáno - + &Statistics &Statistika - + Check for Updates Zkontrolovat aktualizace - + Check for Program Updates Zkontrolovat aktualizace programu - + &About O &aplikaci - + &Pause Po&zastavit - + &Delete Smaza&t - + P&ause All Pozastavit vš&e - + &Add Torrent File... Přid&at torrent soubor... - + Open Otevřít - + E&xit &Konec - + Open URL Otevřít URL - + &Documentation &Dokumentace - + Lock Zamknout - - - + + + Show Ukázat - + Check for program updates Zkontrolovat aktualizace programu - + Add Torrent &Link... - Přidat torrent link... + Přidat torrent odka&z... - + If you like qBittorrent, please donate! Pokud se Vám qBittorrent líbí, prosím přispějte! - - + Execution Log Záznamy programu (Log) - + Clear the password Vymazat heslo - + Filter torrent list... Filtrovat seznam torrentů... - + &Set Password Na&stavit heslo - - Preferences - Předvolby - - - + &Clear Password Vyma&zat heslo - + Transfers Přenosy - - - qBittorrent is minimized to tray - qBittorrent je minimalizován do lišty - - - - - - This behavior can be changed in the settings. You won't be reminded again. - Toto chování může být změněno v nastavení. Nebudete znovu upozorněni. - - - + Torrent file association Asociace souboru .torrent - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? - qBittorrent není výchozí aplikací pro otevírání souborů .torrent ani Magnet linků. -Chcete asociovat qBittorrent se soubory .torrent a Magnet linky? + qBittorrent není výchozí aplikací pro otevírání souborů .torrent ani Magnet odkazů. +Chcete asociovat qBittorrent se soubory .torrent a Magnet odkazy? - + Icons Only Jen ikony - + Text Only Jen text - + Text Alongside Icons Text vedle ikon - + Text Under Icons Text pod ikonama - + Follow System Style Jako systémový styl - - - + + + UI lock password Heslo pro zamknutí UI - - - + + + Please type the UI lock password: Zadejte prosím heslo pro zamknutí UI: - + The password should contain at least 3 characters Heslo musí obsahovat nejméně 3 znaky - + Password update Změna hesla - + The UI lock password has been successfully updated Heslo pro zamknutí UI bylo úspěšně změněno - + Are you sure you want to clear the password? Opravdu chcete vymazat heslo? - - Use regular expressions - Používejte regulární výrazy - - - + Search Hledat - + Transfers (%1) Přenosy (%1) - + Error Chyba - + Failed to add torrent: %1 Selhalo načtení torrentu: %1 - + Torrent added - Torrent přidán + - + '%1' was added. e.g: xxx.avi was added. - '%1' byl přidán. + - + Download completion Kompletace stahování - + I/O Error i.e: Input/Output Error Chyba I/O - + Recursive download confirmation Potvrzení rekurzivního stahování - + Yes Ano - + No Ne - + Never Nikdy - + Global Upload Speed Limit Celkový limit rychlosti odesílání - + Global Download Speed Limit Celkový limit rychlosti stahování - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent byl právě aktualizován a vyžaduje restart, aby se změny provedly. - - - - qBittorrent is closed to tray - qBittorrent je zavřen do lišty - - - - Some files are currently transferring. - Některé soubory jsou právě přenášeny. - - - - Are you sure you want to quit qBittorrent? - Určitě chcete ukončit qBittorrent? - - - + &No &Ne - + &Yes &Ano - + &Always Yes Vžd&y - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - Nelze zjistit verzi Pythonu. Vyhledávač vypnut. - - - + Old Python Interpreter Starý překladač jazyka Python - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - Vaše verze Pythonu %1 je zastaralá. Pro zprovoznění vyhledávačů aktualizujte na nejnovější verzi. -Minimální požadavky: 2.7.9 / 3.3.0. + - + qBittorrent Update Available qBittorrent aktualizace k dispozici - + + A new version is available. +Do you want to download %1? + Je k dispozici nová verze. +Chcete stáhnout %1? + + + Already Using the Latest qBittorrent Version Již používáte nejnovější verzi qBittorrentu - + Undetermined Python version Nezjištěná verze Pythonu - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. Stahování '%1' bylo dokončeno. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2970,158 +2557,154 @@ Důvod: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? Torrent '%1' obsahuje soubory .torrent, chcete je také stáhnout? - + Couldn't download file at URL '%1', reason: %2. Nelze stáhnout soubor z URL: '%1', důvod: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - Python byl nalezen v %1: %2 + - - + + Couldn't determine your Python version (%1). Search engine disabled. + Nelze zjistit verzi Pythonu (%1). Vyhledávač vypnut. + + + + Missing Python Interpreter Chybí překladač jazyka Python - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Pro použití vyhledávačů je vyžadován Python, ten ale není nainstalován. Chcete jej nyní nainstalovat? - + Python is required to use the search engine but it does not seem to be installed. Pro použití vyhledávačů je vyžadován Python, ten ale není nainstalován. - - A new version is available. - Je k dispozici nová verze. - - - - Do you want to download %1? - Přejete si stáhnout %1? - - - - Open changelog... - Otevřít seznam změn... - - - + No updates available. You are already using the latest version. Nejsou žádné aktualizace. Již používáte nejnovější verzi. - + &Check for Updates Zkontrolovat aktualiza&ce - + Checking for Updates... Kontrolování aktualizací... - + Already checking for program updates in the background Kontrola aktualizací programu již probíha na pozadí - + Python found in '%1' Python nalezen v '%1' - + Download error Chyba stahování - + Python setup could not be downloaded, reason: %1. Please install it manually. Instalační soubor Pythonu nelze stáhnout, důvod: %1. Nainstalujte jej prosím ručně. - - + + Invalid password Neplatné heslo - - - + + RSS (%1) RSS (%1) - + URL download error Chyba stahování URL - + The password is invalid Heslo je neplatné - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Rychlost stahování: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Rychlost odesílání: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [S: %1, O: %2] qBittorrent %3 - + Hide Skrýt - + Exiting qBittorrent Ukončování qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Některé soubory se právě přenášejí. +Opravdu chcete ukončit qBittorrent? + + + Open Torrent Files Otevřít torrent soubory - + Torrent Files Torrent soubory - + Options were saved successfully. Nastavení bylo úspěšně uloženo. @@ -3129,52 +2712,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. Vašedynamická DNS byla úspěšně aktualizována. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Chyba dynamické DNS: Služba je dočasně nedostupná, akce bude opakována za 30 minut. - + Dynamic DNS error: hostname supplied does not exist under specified account. Chyba dynamické DNS: poskytnutý název hostitele pod tímto účtem neexistuje. - + Dynamic DNS error: Invalid username/password. - Chyba dynamické DNS: neplatné jméno/heslo. + Chyba dynamické DNS: Chybné jméno/heslo. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Chyba dynamické DNS: qBittorrent je na černé listině této služby, nahlašte prosím chybu na http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Chyba dynamické DNS: služba odpověděla %1, nahlašte prosím chybu na http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Chyba dynamické DNS: Vaše přihlašovací jméno bylo zablokováno v důsledku zneužití. - + Dynamic DNS error: supplied domain name is invalid. - Chyba dynamické DNS: poskytnutý doménový název je neplatný. + Chyba dynamické DNS: poskytnuté doménové jméno je neplatné. - + Dynamic DNS error: supplied username is too short. Chyba dynamické DNS: poskytnuté přihlašovací jméno je příliš krátké. - + Dynamic DNS error: supplied password is too short. Chyba dynamické DNS: poskytnuté heslo je příliš krátké. @@ -3182,1413 +2765,1303 @@ Net::DownloadHandler - + I/O Error Chyba I/O - + The file size is %1. It exceeds the download limit of %2. Velikost souboru je %1. Přesahuje limit pro stažení %2. - + Unexpected redirect to magnet URI. Neočekávané přesměrování na magnet URI. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - Název vzdáleného hostitele nebyl nalezen (neplatný název hostitele) + + + GeoIP database loaded. Type: %1. Build time: %2. + GeoIP databáze načtena. Typ: %1. Čas sestavení: %2. - - The operation was canceled - Operace byla zrušena + + + Couldn't load GeoIP database. Reason: %1 + Nelze načíst GeoIP databáze. Důvod: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - Vzdálený server předčasně ukončil připojení, než byla přijata a zpracována celá odpověď + + Venezuela, Bolivarian Republic of + Venezuela, Bolívarovská republika - - The connection to the remote server timed out - Spojení se vzdáleným serverem vypršelo + + Viet Nam + Vietnam - - SSL/TLS handshake failed - SSL/TLS handshake selhal + + + N/A + N/A - - The remote server refused the connection - Vzdálený server odmítl připojení + + Andorra + Andorra - - The connection to the proxy server was refused - Připojení k proxy serveru bylo odmítnuto - - - - The proxy server closed the connection prematurely - Proxy server předčasně ukončil připojení - - - - The proxy host name was not found - Název hostitele proxy serveru nebyl nalezen - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - Připojení k zastavenému proxy serveru vypršelo nebo proxy server neodpověděla včas na odeslaný požadavek - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - Proxy vyžaduje ověření, ale neakceptovala žádné z nabízených přihlašovacích údajů - - - - The access to the remote content was denied (401) - Přístup ke vzdálenému obsahu byl odepřen (401) - - - - The operation requested on the remote content is not permitted - Požadovaná operace na vzdáleném obsahu není dovolena - - - - The remote content was not found at the server (404) - Vzdálený obsah nebyl na serveru nalezen (404) - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - Vzdálený server vyžaduje ověření k poskytnutí obsahu, ale neakceptoval žádné z nabízených přihlašovacích údajů - - - - The Network Access API cannot honor the request because the protocol is not known - API pro připojení k síti nemohlo akceptovat požadavek z důvodu neznámého protokolu - - - - The requested operation is invalid for this protocol - Požadovaná operace je pro tento protokol neplatná - - - - An unknown network-related error was detected - Byla detekována neznámá chyba sítě - - - - An unknown proxy-related error was detected - Byla detekována neznámá chyba související s proxy - - - - An unknown error related to the remote content was detected - Detekována neznámá chyba vzdáleného obsahu - - - - A breakdown in protocol was detected - Byla detekována porucha v protokolu - - - - Unknown error - Neznámá chyba - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - GeoIP databáze načtena. Typ: %1. Čas sestavení: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - Nelze načíst GeoIP databáze. Důvod: %1 - - - - Venezuela, Bolivarian Republic of - Venezuela, Bolívarovská republika - - - - Viet Nam - Vietnam - - - - - N/A - N/A + + United Arab Emirates + Spojené arabské emiráty - Andorra - Andorra - - - - United Arab Emirates - Spojené arabské emiráty - - - Afghanistan Afghánistán - + Antigua and Barbuda Antigua a Barbuda - + Anguilla Anguilla - + Albania Albánie - + Armenia Arménie - + Angola Angola - + Antarctica Antarktida - + Argentina Argentina - + American Samoa Americká Samoa - + Austria Rakousko - + Australia Austrálie - + Aruba Aruba - + Azerbaijan Ázerbájdžán - + Bosnia and Herzegovina Bosna a Hercegovina - + Barbados Barbados - + Bangladesh Bangladéš - + Belgium Belgie - + Burkina Faso Burkina Faso - + Bulgaria Bulharsko - + Bahrain Bahrajn - + Burundi Burundi - + Benin Benin - + Bermuda Bermudy - + Brunei Darussalam Brunej - + Brazil Brazílie - + Bahamas Bahamy - + Bhutan Bhútán - + Bouvet Island Bouvetův ostrov - + Botswana Botswana - + Belarus Bělorusko - + Belize Belize - + Canada Kanada - + Cocos (Keeling) Islands Kokosové ostrovy - + Congo, The Democratic Republic of the Kongo, Demokratická republika - + Central African Republic Středoafrická republika - + Congo Kongo - + Switzerland Švýcarsko - + Cook Islands Cookovy ostrovy - + Chile Chile - + Cameroon Kamerun - + China Čína - + Colombia Kolumbie - + Costa Rica Kostarika - + Cuba Kuba - + Cape Verde Kapverdy - + Curacao Curaçao - + Christmas Island Vánoční ostrov - + Cyprus Kypr - + Czech Republic Česká republika - + Germany Německo - + Djibouti Džibutsko - + Denmark Dánsko - + Dominica Dominika - + Dominican Republic Dominikánská republika - + Algeria Alžírsko - + Ecuador Ekvádor - + Estonia Estonsko - + Egypt Egypt - + Western Sahara Západní Sahara - + Eritrea Eritrea - + Spain Španělsko - + Ethiopia Etiopie - + Finland Finsko - + Fiji Fidži - + Falkland Islands (Malvinas) Falklandy, Malvíny - + Micronesia, Federated States of Federativní státy Mikronésie - + Faroe Islands Faerské ostrovy - + France Francie - + Gabon Gabon - + United Kingdom Spojené království - + Grenada Grenada - + Georgia Gruzie - + French Guiana Francouzská Guyana - + Ghana Ghana - + Gibraltar Gibraltar - + Greenland Grónsko - + Gambia Gambie - + Guinea Guinea - + Guadeloupe Guadeloupe - + Equatorial Guinea Rovníková Guinea - + Greece Řecko - + South Georgia and the South Sandwich Islands Jižní Georgie a Jižní Sandwichovy ostrovy - + Guatemala Guatemala - + Guam Guam - + Guinea-Bissau Guinea-Bissau - + Guyana Guyana - + Hong Kong Hongkong - + Heard Island and McDonald Islands Heardův ostrov a McDonaldovy ostrovy - + Honduras Honduras - + Croatia Chorvatsko - + Haiti Haiti - + Hungary Maďarsko - + Indonesia Indonésie - + Ireland Irsko - + Israel Izrael - + India Indie - + British Indian Ocean Territory Britské indickooceánské území - + Iraq Irák - + Iran, Islamic Republic of Írán - + Iceland Island - + Italy Itálie - + Jamaica Jamajka - + Jordan Jordánsko - + Japan Japonsko - + Kenya Keňa - + Kyrgyzstan Kyrgyzstán - + Cambodia Kambodža - + Kiribati Kiribati - + Comoros Komory - + Saint Kitts and Nevis Svatý Kryštof a Nevis - + Korea, Democratic People's Republic of Korejská lidově demokratická republika - + Korea, Republic of Korea - + Kuwait Kuvajt - + Cayman Islands Kajmanské ostrovy - + Kazakhstan Kazachstán - + Lao People's Democratic Republic Laos - + Lebanon Libanon - + Saint Lucia Svatá Lucie - + Liechtenstein Lichtenštejnsko - + Sri Lanka Srí Lanka - + Liberia Libérie - + Lesotho Lesotho - + Lithuania Litva - + Luxembourg Lucembursko - + Latvia Lotyšsko - + Morocco Maroko - + Monaco Monako - + Moldova, Republic of Moldavsko - + Madagascar Madagaskar - + Marshall Islands Marshallovy ostrovy - + Mali Mali - + Myanmar Myanmar, Barma - + Mongolia Mongolsko - + Northern Mariana Islands Severní Mariany - + Martinique Martinik - + Mauritania Mauritánie - + Montserrat Montserrat - + Malta Malta - + Mauritius Mauricius - + Maldives Maledivy - + Malawi Malawi - + Mexico Mexiko - + Malaysia Malajsie - + Mozambique Mosambik - + Namibia Namibie - + New Caledonia Nová Kaledonie - + Niger Niger - + Norfolk Island Norfolk - + Nigeria Nigérie - + Nicaragua Nikaragua - + Netherlands Nizozemsko - + Norway Norsko - + Nepal Nepál - + Nauru Nauru - + Niue Niue - + New Zealand Nový Zéland - + Oman Omán - + Panama Panama - + Peru Peru - + French Polynesia Francouzská Polynésie - + Papua New Guinea Papua-Nová Guinea - + Philippines Filipíny - + Pakistan Pákistán - + Poland Polsko - + Saint Pierre and Miquelon Saint-Pierre a Miquelon - + Puerto Rico Portoriko - + Portugal Portugalsko - + Palau Palau - + Paraguay Paraguay - + Qatar Katar - + Reunion Réunion - + Romania Rumunsko - + Russian Federation Rusko - + Rwanda Rwanda - + Saudi Arabia Saúdská Arábie - + Solomon Islands Šalamounovy ostrovy - + Seychelles Seychely - + Sudan Súdán - + Sweden Švédsko - + Singapore Singapur - + Slovenia Slovinsko - + Svalbard and Jan Mayen Špicberky a Jan Mayen - + Slovakia Slovensko - + Sierra Leone Sierra Leone - + San Marino San Marino - + Senegal Senegal - + Somalia Somálsko - + Suriname Surinam - + Sao Tome and Principe Svatý Tomáš a Princův ostrov - + El Salvador Salvador - + Syrian Arab Republic Sýrie - + Swaziland Svazijsko - + Turks and Caicos Islands Turks a Caicos - + Chad Čad - + French Southern Territories Francouzská jižní a antarktická území - + Togo Togo - + Thailand Thajsko - + Tajikistan Tádžikistán - + Tokelau Tokelau - + Turkmenistan Turkmenistán - + Tunisia Tunisko - + Tonga Tonga - - Could not decompress GeoIP database file. - Nebylo možné rozbalit soubor databáze GeoIP. - - - + Timor-Leste Východní Timor - + Bolivia, Plurinational State of Bolívie - + Bonaire, Sint Eustatius and Saba Karibské Nizozemsko - + Cote d'Ivoire Pobřeží slonoviny - + Libya Libye - + Saint Martin (French part) Svatý Martin (francouzská část) - + Macedonia, The Former Yugoslav Republic of Makedonie - + Macao Macao - + Pitcairn Pitcairnovy ostrovy - + Palestine, State of Palestina - + Saint Helena, Ascension and Tristan da Cunha Svatá Helena, Ascension a Tristan da Cunha - + South Sudan Jižní Súdán - + Sint Maarten (Dutch part) Svatý Martin (nizozemská část) - + Turkey Turecko - + Trinidad and Tobago Trinidad a Tobago - + Tuvalu Tuvalu - + Taiwan Taiwan, Čínská republika (ROC) - + Tanzania, United Republic of Tanzanie - + Ukraine Ukrajina - + Uganda Uganda - + United States Minor Outlying Islands Menší odlehlé ostrovy Spojených států amerických - + United States Spojené státy americké - + Uruguay Uruguay - + Uzbekistan Uzbekistán - + Holy See (Vatican City State) Svatý stolec (Vatikán) - + Saint Vincent and the Grenadines Svatý Vincenc a Grenadiny - + Virgin Islands, British Britské Panenské ostrovy - + Virgin Islands, U.S. Americké Panenské ostrovy - + Vanuatu Vanuatu - + Wallis and Futuna Wallis a Futuna - + Samoa Samoa - + Yemen Jemen - + Mayotte Mayotte - + Serbia Srbsko - + South Africa Jihoafrická republika - + Zambia Zambie - + Montenegro Černá Hora - + Zimbabwe Zimbabwe - + Aland Islands Ålandy - + Guernsey Guernsey - + Isle of Man Ostrov Man - + Jersey Jersey - + Saint Barthelemy Svatý Bartoloměj - + + Could not uncompress GeoIP database file. + Nelze rozbalit soubor GeoIP databáze. + + + Couldn't save downloaded GeoIP database file. Stažená GeoIP databáze nelze uložit. - + Successfully updated GeoIP database. GeoIP databáze aktualizována. - + Couldn't download GeoIP database file. Reason: %1 Nelze stáhnout GeoIP databázi. Důvod: %1 @@ -4596,12 +4069,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] Podpora UPnP / NAT-PMP [ZAP] - + UPnP / NAT-PMP support [OFF] Podpora UPnP / NAT-PMP [VYP] @@ -4609,7 +4082,7 @@ Net::Smtp - + Email Notification Error: Chyba upozornění e-mailem: @@ -4617,1352 +4090,1150 @@ OptionsDialog - + Options - Možnosti + - + Behavior - Vlastnosti + - + Downloads - Stahování + Stahování - + Connection - Připojení + Připojení - + Speed - Rychlost + Rychlost - + BitTorrent - BitTorrent - - - - RSS - RSS + - + Web UI - Web UI + - + Advanced - Pokročilé + - + Language - Jazyk + Jazyk - + User Interface Language: - Jazyk uživatelského rozhraní: + - + (Requires restart) - (Vyžaduje restart) + - + Transfer List - Seznam přenosů + - + Confirm when deleting torrents - Potvrdit smazání torrentu + - + Use alternating row colors In transfer list, one every two rows will have grey background. - Použít střídající se barvu řádků + - + Hide zero and infinity values - Skrýt nulové a nekonečné hodnoty + - + Always - Vždy + Vždy - + Paused torrents only - Pouze pozastavené torrenty + - + Action on double-click - Akce po dvojkliku + - + Downloading torrents: - Stahování torrentů: + - - + + Start / Stop Torrent - Spustit / Zastavit torrent + - - + + Open destination folder - Otevřít cílový adresář + Otevřít cílový adresář - - + + No action - Žádná akce + - + Completed torrents: - Dokončené torrenty: + - + Desktop - Plocha + - + Start qBittorrent on Windows start up - Spustit qBittorrent po spuštění Windows + - + Show splash screen on start up - Zobrazit úvodní obrazovku při startu + - + Start qBittorrent minimized - Spustit qBittorrent minimalizovaně + - + Confirmation on exit when torrents are active - Potvrzení při ukončení, jsou-li torrenty aktivní + - + Confirmation on auto-exit when downloads finish - Potvrzení při automatickém ukončení, jsou-li torrenty dokončeny - - - - KiB - KiB - - - - Email notification &upon download completion - Upozornění emailem při dokončení stahování - - - - Run e&xternal program on torrent completion - Spustit externí program při dokončení stažení torrentu - - - - IP Fi&ltering - Filtrování IP - - - - Schedule &the use of alternative rate limits - Plánovat použití alternativních omezení rychlosti - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Více informací</a>) - - - - &Torrent Queueing - Řazení torrentů do fronty - - - - Seed torrents until their seeding time reaches - Odesílat torrenty dokud není dosaženo jejich časového limitu - - - - A&utomatically add these trackers to new downloads: - Automaticky přidat tyto trackery k novým stahováním: - - - - RSS Reader - RSS čtečka - - - - Enable fetching RSS feeds - Zapnout načítání RSS feedů - - - - Feeds refresh interval: - Interval obnovení feedů: - - - - Maximum number of articles per feed: - Maximální počet článků na feed: - - - - - min - minutes - min - - - - RSS Torrent Auto Downloader - Automatické RSS stahování torrentů - - - - Enable auto downloading of RSS torrents - Zapnout automatické RSS stahování torrentů - - - - Edit auto downloading rules... - Upravit pravidla automatického stahování... - - - - Web User Interface (Remote control) - Webové uživatelské rozhraní (vzdálená správa) - - - - IP address: - IP adresa: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - IP adresa ke které bude Web UI přiřazeno. -Zvolte IPv4 nebo IPv6 adresu. Můžete zadat "0.0.0.0" pro jakoukoliv IPv4 adresu, -"::" pro jakoukoliv IPv6 adresu, nebo "*" pro jakékoliv IPv4 nebo IPv6 adresy. - - - - Server domains: - Domény serveru: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - Seznam povolených pro filtrování hodnot HTTP hlaviček hostitele. -Pro obranu proti DNS rebinding útokům -best měli vložit doménové názvy použité pro WebUI server. - -Použijte ';' pro oddělení více položek. Můžete použít masku '*'. - - - - &Use HTTPS instead of HTTP - Použít HTTPS místo HTTP - - - - Bypass authentication for clients on localhost - Přeskočit ověření klientů na místní síti - - - - Bypass authentication for clients in whitelisted IP subnets - Přeskočit ověření klientů na seznamu povolených IP podsítí - - - - IP subnet whitelist... - Seznam povolených IP podsítí... + - - Upda&te my dynamic domain name - Aktualizovat můj dynamické doménový název (DDNS) + + Show qBittorrent in notification area + - + Minimize qBittorrent to notification area - Minimalizovat qBittorrent do oznamovací oblasti + - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. - Zavírat qBittorrent do oznamovací oblasti + - + Tray icon style: - Styl ikony v oznamovací oblasti: + - + Normal - Normální + Normální - + Monochrome (Dark theme) - Monochromatický (Tmavý motiv) + - + Monochrome (Light theme) - Monochromatický (Světlý motiv) + - + File association - Asociace souborů + - + Use qBittorrent for .torrent files - Použít qBittorent pro soubory .torrent + - + Use qBittorrent for magnet links - Použít qBittorent pro Magnet linky + - + Power Management - Správa napájení + + + + + Inhibit system sleep when torrents are active + + + + + Log file + - + Save path: - Uložit do: + - + Backup the log file after: - Zálohovat log soubor po: + - + + MB + + + + Delete backup logs older than: - Smazat log soubor starší než: + - + days Delete backup logs older than 10 months - dnů + - + months Delete backup logs older than 10 months - měsíců + - + years Delete backup logs older than 10 years - roky + - + When adding a torrent - Při přidání torrentu + + + + + Display torrent content and some options + - + Bring torrent dialog to the front - Dialog torrentu do popředí + - + Do not start the download automatically The torrent will be added to download list in pause state - Nespouštět stahování automaticky + - + Should the .torrent file be deleted after adding it - Má být .torrent soubor po přidání smazán + + + + + Delete .torrent files afterwards + - + Also delete .torrent files whose addition was cancelled - Smazat i .torrent soubory, jejichž přidání bylo zrušeno + - + Also when addition is cancelled - Také pokud bylo přidání zrušeno + - + Warning! Data loss possible! - Varování! Možnost ztráty dat! + - + Saving Management - Uložení nastavení + - + Default Torrent Management Mode: - Výchozí režim správy torrentu: + - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - Automatický mód znamená, že různé vlastnosti torrentu (např. cesta pro uložení) se budou řídit podle příslušné kategorie + - + Manual - Manuální + Manuální - + Automatic - Automatický + Automatický - + When Torrent Category changed: - Když je kategorie torrentu změněna: + - + Relocate torrent - Přemístit torrent + - + Switch torrent to Manual Mode - přepnout torrent do ručního módu + - + When Default Save Path changed: - Při změně výchozí cesty pro uložení: + - - + + Relocate affected torrents - Přemístit dotčené torrenty + - - + + Switch affected torrents to Manual Mode - Přepnout dotčené torrenty do ručního módu + - + When Category changed: - Při změně kategorie: + - + Use Subcategories - Použít podkategorie + - + Default Save Path: - Výchozí cesta pro uložení: + - + Keep incomplete torrents in: - Ponechat nedokončené torrenty v: + - + Copy .torrent files to: - Kopírovat .torrent soubory do: - - - - Show &qBittorrent in notification area - Zobrazit qBittorrent v oznamovací oblasti - - - - &Log file - Soubor logů - - - - Display &torrent content and some options - Zobrazit obsah torrentu a některé volby - - - - Create subfolder for torrents with multiple files - Vytvořit podadresář pro torrent s více soubory - - - - De&lete .torrent files afterwards - Později smazat .torrent soubory + - + Copy .torrent files for finished downloads to: - Kopírovat .torrent soubory dokončených stahování do: + - + Pre-allocate disk space for all files - Předem vyhradit místo na disku pro všechny soubory - - - - Inhibit system sleep when torrents are downloading - Zakázat uspání počítače při stahování torrentů - - - - Inhibit system sleep when torrents are seeding - Zakázat uspání počítače při odesílání torrentů + - + Append .!qB extension to incomplete files - Přidat příponu .!qB k nedokončeným souborům - - - - Enable recursive download dialog - Zapnout dialog rekurzivního downloadu + - + Automatically add torrents from: - Automaticky přidávat .torrent soubory z: + - + Add entry - Přidat položku + - + Remove entry - Odstranit položku + + + + + Email notification upon download completion + + + + + Destination email: + - + SMTP server: - SMTP server: + - + This server requires a secure connection (SSL) - Tento server vyžaduje zabezpečené připojení (SSL) + - - + + + Authentication - Ověření + - - - - + + + + Username: - Uživatelské jméno: + Uživatelské jméno: - - - - + + + + Password: - Heslo: - - - - Enabled protocol: - Zapnout protokol: + Heslo: - - TCP and μTP - TCP a μTP + + Run external program on torrent completion + - + Listening Port - Naslouchací port + - + Port used for incoming connections: - Port použitý pro příchozí spojení: + - + Random - Náhodný + - + Use UPnP / NAT-PMP port forwarding from my router - Použít přesměrování portů UPnP / NAT-PMP z mého routeru + - + Use different port on each startup - Při každém spuštění použít náhodné porty + - + Connections Limits - Limit spojení + - + Maximum number of connections per torrent: - Maximální počet spojení na torrent: + - + Global maximum number of connections: - Celkový maximální počet spojení: + - + Maximum number of upload slots per torrent: - Maximální počet odesílacích slotů na torrent: + - + Global maximum number of upload slots: - Celkový maximální počet odesílacích slotů: + - + Proxy Server - Proxy server + - + Type: - Typ: + - + (None) - (žádný) + - + SOCKS4 - SOCKS4 + - + SOCKS5 - SOCKS5 + - + HTTP - HTTP + - + Host: - Host: + - - + + Port: - Port: + - + Otherwise, the proxy server is only used for tracker connections - V opačném případě je proxy server použit pouze pro připojení k trackeru + - + Use proxy for peer connections - Použít proxy pro připojení k protějškům + - + Disable connections not supported by proxies - Zakázat připojení nepodporovaná připojením proxy - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Více informací</a>) + - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - RSS zdroje, vyhledávací nástroje, updaty software nebo cokoliv jiného než torrentové přenosy a související operace (jako výměny informací mezi protějšky) použijí přímé připojení + - + Use proxy only for torrents - Použít proxy pouze pro torrenty + - - A&uthentication - Ověření + + Info: The password is saved unencrypted + - - Info: The password is saved unencrypted - Info: Heslo je uloženo nešifrované + + IP Filtering + - + Filter path (.dat, .p2p, .p2b): - Cesta k filtru (.dat, .p2p, .p2b): + - + Reload the filter - Znovunačíst filtr - - - - Manually banned IP addresses... - Seznam ručně zakázaných IP adres... + - + Apply to trackers - Použít pro trackery + - + Global Rate Limits - Celkové limity rychlosti + - - - - - - - KiB/s - KiB/s + + + Upload: + - - - Upload: - Odesílání: + + + + + KiB/s + KiB/s - - + + Download: - Stahování: + - + Alternative Rate Limits - Alternativní limity rychlosti + - - + + Schedule the use of alternative rate limits + + + + From: from (time1 to time2) - Od: + - - + To: time1 to time2 - Do: + - + When: - Kdy: + - + Every day - Každý den + Každý den - + Weekdays - Pracovní dny + - + Weekends - Víkendy + - + Rate Limits Settings - Nastavení poměru sdílení + - + Apply rate limit to peers on LAN - Omezit poměr sdílení protějškům na LAN + - + Apply rate limit to transport overhead - Použít limity rychlosti pro režijní provoz + - - + + + Enable µTP protocol + + + + Apply rate limit to µTP protocol - Použít omezení rychlosti pro uTP připojení + - + Privacy - Soukromí + - + Enable DHT (decentralized network) to find more peers - Zapnout DHT síť (decentralizovaná síť) k nalezení většího počtu protějšků + - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - Vyměňovat protějšky s kompatibilními klienty Bittorrent (µTorrent, Vuze, ...) + - + Enable Peer Exchange (PeX) to find more peers - Zapnout Peer Exchange (PeX) k nalezení většího počtu protějšků + - + Look for peers on your local network - Hledat protějšky na lokální síti + - + Enable Local Peer Discovery to find more peers - Zapnout místní vyhledávání k nalezení většího počtu protějšků + - + Encryption mode: - Režim šifrování: + - + Prefer encryption - Upřednostnit šifrování + - + Require encryption - Vyžadovat šifrování + - + Disable encryption - Vypnout šifrování + - + Enable when using a proxy or a VPN connection - Povolit při použití proxy nebo VPN připojení + - + Enable anonymous mode - Povolit anonymní režim - - - - Maximum active downloads: - Max. počet aktivních stahování: - - - - Maximum active uploads: - Max. počet aktivních odesílání: + - - Maximum active torrents: - Maximální počet aktivních torrentů: + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + - - Do not count slow torrents in these limits - Nezapočítávat pomalé torrenty do těchto limitů + + Torrent Queueing + - - Upload rate threshold: - Práh rychlosti odesílání: + + Maximum active downloads: + - - Download rate threshold: - Práh rychlosti stahování: + + Maximum active uploads: + - - sec - seconds - sec + + Maximum active torrents: + - - Torrent inactivity timer: - Časovač nečinnosti torrentu: + + Do not count slow torrents in these limits + - + Share Ratio Limiting - Omezení ratia + - + Seed torrents until their ratio reaches - Sdílet torrenty dokud ratio nedosáhne + - + then - potom + - + Pause them - Pozastavit je + - + Remove them - Odstranit je + + + + + Automatically add these trackers to new downloads: + - - RSS Smart Episode Filters - RSS inteligentní filtry epizod + + Enable Web User Interface (Remote control) + - + Use UPnP / NAT-PMP to forward the port from my router - Použít UPnP / NAT-PMP k přesměrování portu z mého routeru + - + + Use HTTPS instead of HTTP + + + + Certificate: - Certifikát: + - + Import SSL Certificate - Importovat SSL certifikát + - + Key: - Klíč: + - + Import SSL Key - Importovat SSL klíč + - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Informace o certifikátech</a> - - - - Use alternative Web UI - Použít alternativní Web UI - - - - Files location: - Umístění souborů: + - - Enable clickjacking protection - Aktivujte ochranu clickjacking + + Bypass authentication for localhost + - - Enable Cross-Site Request Forgery (CSRF) protection - Zapnout ochranu Cross-Site Request Forgery (CSRF) + + Update my dynamic domain name + - + Service: - Služba: + - + Register - Registrovat + - + Domain name: - Doména: + - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - Zapnutím těchto voleb můžete <strong>nevratně ztratit</strong> vaše .torrent soubory! + - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - Pokud jsou tyto volby zapnuty, qBittorrent <strong>smaže</strong> .torrent soubory poté, co byly úspěšně (první možnost) nebo neúspěšně (druhá možnost) přidány do fronty pro stažení. Toto nastane <strong>nejen</strong> u souborů otevřených pomocí volby menu &ldquo;Přidat torrent&rdquo;, ale také u souborů otevřených pomocí <strong>souborové asociace</strong> + - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - Pokud zapnete druhou volbu (&ldquo;Také, když je přidán zrušeno&rdquo;) .torrent soubor <strong>bude smazán</strong> i když stisknete &ldquo;<strong>Zrušit</strong>&rdquo; v dialogu &ldquo;Přidat torrent&rdquo; - - - - Choose Alternative UI files location - Vybrat umístění souborů Alternativního UI + - + Supported parameters (case sensitive): - Podporované parametry (citlivé na velikost znaků): + - + %N: Torrent name - %N: Název torrentu + - + %L: Category - %L: Kategorie - - - - %G: Tags (seperated by comma) - %G: Štítky (oddělené čárkou) + - + %F: Content path (same as root path for multifile torrent) - %F: Umístění obsahu (stejné jako zdrojová cesta u vícesouborového torrentu) + - + %R: Root path (first torrent subdirectory path) - %R: Zdrojová cesta (první podadresář torrentu) + - + %D: Save path - %D: Cesta pro uložení + - + %C: Number of files - %C: Počet souborů + - + %Z: Torrent size (bytes) - %Z: Velikost torrentu (v bytech) + - + %T: Current tracker - %T: Současný tracker + - + %I: Info hash - %I: Info hash + - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - Tip: Ohraničit parametr uvozovkami, aby nedošlo k odstřižení textu za mezerou (např. "%N") - - - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - Torrent bude uznán pomalým jestliže rychlosti stahování a odesílání zůstanou pod těmito hodnotami "Časovače nečinnosti torrentu" v sekundách + - + Select folder to monitor - Vyberte sledovaný adresář + - + Folder is already being monitored: - Adresář je již sledován: + - + Folder does not exist: - Adresář neexistuje: + - + Folder is not readable: - Adresář nelze přečíst: + - + Adding entry failed - Přidání položky selhalo + - - - - + + Choose export directory - Vyberte adresář pro export + - - - + + + + + + Choose a save directory - Vyberte adresář pro ukládání + - + Choose an IP filter file - Vyberte soubor s IP filtry + - + All supported filters - Všechny podporované filtry + - + SSL Certificate - SSL certifikát + + + + + SSL Key + - + Parsing error - Chyba zpracování + - + Failed to parse the provided IP filter - Nepovedlo se zpracovat poskytnutý IP filtr + - + Successfully refreshed - Úspěšně obnoveno + - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - IP filter byl úspěšně zpracován: bylo aplikováno %1 pravidel. + IP filter byl úspěšně zpracován: bylo aplikováno %1 pravidel. - + Invalid key - Neplatný klíč + - + This is not a valid SSL key. - Toto není platný SSL klíč. + - + Invalid certificate - Neplatný certifikát - - - - Preferences - Předvolby - - - - Import SSL certificate - Importovat SSL certifikát + - + This is not a valid SSL certificate. - Toto není platný SSL certifikát. - - - - Import SSL key - Importovat SSL klíč - - - - SSL key - SSL klíč + - + Time Error - Chyba času + - + The start time and the end time can't be the same. - Časy zahájení a ukončení nemohou být stejné. + - - + + Length Error - Chyba délky + - + The Web UI username must be at least 3 characters long. - Uživatelské jméno pro webové rozhraní musí být nejméně 3 znaky dlouhé. + - + The Web UI password must be at least 6 characters long. - Heslo pro webové rozhraní musí být nejméně 6 znaků dlouhé. + PeerInfo - - Interested(local) and Choked(peer) - Zájemci(místní) a Přiškrcení(protějšek) + + interested(local) and choked(peer) + zájem(místní) a přiškrcený(protějšek) - + interested(local) and unchoked(peer) zájem(místní) a uvolněný(protějšek) - + interested(peer) and choked(local) zájem(protějšek) a přiškrcený(místní) - + interested(peer) and unchoked(local) zájem(protějšek) a uvolněný(místní) - + optimistic unchoke optimisticky uvolněný - + peer snubbed lokálně zasekaný - + incoming connection příchozí spojení - + not interested(local) and unchoked(peer) nezájem(místní) a uvolněný(protějšek) - + not interested(peer) and unchoked(local) nezájem(protějšek) a uvolněný(místní) - + peer from PEX protějšek z PEX - + peer from DHT protějšek z DHT - + encrypted traffic šifrovaný přenos - + encrypted handshake šifrovaný handshake - + peer from LSD lokální protějšek (z LSD) @@ -5970,180 +5241,165 @@ PeerListWidget - + IP IP - + Port Port - + Flags Vlajky - + Connection Připojení - + Client i.e.: Client application Klient - + Progress i.e: % downloaded Průběh - + Down Speed i.e: Download speed Rychlost stahování - + Up Speed i.e: Upload speed Rychlost odesílání - + Downloaded i.e: total data downloaded Staženo - + Uploaded i.e: total data uploaded Odesláno - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Důležitost - + Files i.e. files that are being downloaded right now Soubory - + Column visibility - Viditelnost sloupců + Zobrazení sloupců - + Add a new peer... Přidat nový protějšek... - - + + Ban peer permanently Natrvalo zakázat protějšek - + Manually adding peer '%1'... Ruční přidání protějšku '%1'... - + The peer '%1' could not be added to this torrent. Protějšek '%1' nemohl být přidán do tohoto torrentu. - + Manually banning peer '%1'... Ručně zakázat protějšek '%1'... - - + + Peer addition Přidání protějšku - + Country - Země + - + Copy IP:port - Kopírovat IP:port + - + Some peers could not be added. Check the Log for details. Některé protějšky nemohly být přidány. Více detailů najdete v logu. - + The peers were added to this torrent. Protějšky byly přidány do tohoto torrentu. - + Are you sure you want to ban permanently the selected peers? Opravdu chcete natrvalo zakázat označené protějšky? - + &Yes &Ano - + &No &Ne - PeersAdditionDialog + PeersAdditionDlg - - Add Peers - Přidání protějšků - - - - List of peers to add (one IP per line): - Seznam protějšků pro přidání (jedna IP na řádek): - - - - Format: IPv4:port / [IPv6]:port - Formát: IPv4:port / [IPv6]:port - - - + No peer entered Protějšek nezadán - + Please type at least one peer. Prosím zadejte alespoň jeden protějšek. - + Invalid peer Neplatný protějšek - + The peer '%1' is invalid. Protějšek '%1' je neplatný. @@ -6151,12 +5407,12 @@ PieceAvailabilityBar - + White: Unavailable pieces Bílé: Nedostupné díly - + Blue: Available pieces Modré: Dostupné díly @@ -6164,337 +5420,290 @@ PiecesBar - + Files in this piece: - Soubory v této části: + - + File in this piece - Soubor v této části + - + File in these pieces - Soubor v těchto částech - - - - Wait until metadata become available to see detailed information - Vyčkejte než bude možné zobrazit metadata pro detailnější informace + - + Hold Shift key for detailed information - Držte klávesu Shift pro detailní informace + - PluginSelectDialog + PluginSelectDlg - + Search plugins Pluginy pro vyhledávání - + Installed search plugins: - Nainstalované vyhledávací pluginy: + Nainstalované vyhledávače: - + Name Název - + Version Verze - + Url URL - - + + Enabled Zapnuto - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - Varování: Ujistěte se, že dodržujete zákony Vaší země o ochraně duševního vlastnictví když stahujete torrenty z kteréhokoliv z těchto vyhledávačů. - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - Nové vyhledávací pluginy můžete získat zde: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Nové vyhledávače můžete získat zde: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one Nainstalovat nový - + Check for updates Zkontrolovat aktualizace - + Close Zavřít - + Uninstall Odinstalovat - - - + + + Yes Ano - - - - + + + + No Ne - + Uninstall warning - Upozornění na odinstalaci + Upozornění na odstranění - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - Některé pluginy nelze odstranit, protože jsou součástí qBittorrent. Můžete odstranit pouze ty, které jste sami přidali. -Tyto pluginy byly vypnuty. + Některé zásuvné moduly nelze odstranit, protože jsou součástí qBittorrent. +Můžete odstranit pouze moduly, které jste sami přidali. +Moduly byly alespoň vypnuty. - + Uninstall success - Odinstalace úspěšná + Odstranění bylo úspěšné - + All selected plugins were uninstalled successfully - Všechny vybrané pluginy byly úspěšně odinstalovány - - - - - - - Search plugin update - Aktualizovat vyhledávací plugin + Vybrané zásuvné moduly byly úspěšně odstraněny - - Plugins installed or updated: %1 - Plugin instalován nebo aktualizován: %1 - - - - + + New search engine plugin URL - URL nového vyhledávacího pluginu + URL nového vyhledávacího modulu - - + + URL: URL: - + Invalid link Neplatný odkaz - + The link doesn't seem to point to a search engine plugin. - Odkaz zřejmě neodkazuje na plugin vyhledávače. + Odkaz zřejmě neodkazuje na zásuvný modul vyhledávače. - + Select search plugins - Vybrat vyhledávací pluginy + Vybrat vyhledávače - + qBittorrent search plugin - qBittorrent pluginy pro vyhledávání + qBittorrent - vyhledávače + + + + + + Search plugin update + Aktualizovat vyhledávač - + All your plugins are already up to date. - Všechny pluginy jsou aktuální. + Všechny zásuvné moduly jsou aktuální. - + Sorry, couldn't check for plugin updates. %1 Nelze zkontrolovat aktualizace pluginů. %1 - + + + Search plugin install - Nainstalovat vyhledávací pluginy + Nainstalovat vyhledávač + + + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + Vyhledávač "%1" byl úspěšně nainstalován. - + Couldn't install "%1" search engine plugin. %2 - Nelze nainstalovat "%1" vyhledávací plugin. %2 + Nelze nainstalovat plugin vyhledávače "%1". %2 + + + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + Vyhledávač "%1" byl úspěšně aktualizován. - + Couldn't update "%1" search engine plugin. %2 - Nelze aktualizovat "%1" vyhledávací plugin. %2 + Nelze aktualizovat plugin vyhledávače "%1". %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - Zdroj pluginu + Zdroj zásuvného modulu - + Search plugin source: - Zdroj vyhledávacího pluginu: + - + Local file Místní soubor - + Web link Webový odkaz - PowerManagement - - - qBittorrent is active - qBittorrent je aktivní - - - - PreviewSelectDialog - - - Preview - Náhled - + PreviewSelect - + Name Název - + Size Velikost - + Progress Průběh - - + + Preview impossible Náhled není možný - - + + Sorry, we can't preview this file - Je nám líto, nemůžeme zobrazit náhled tohoto souboru + Je nám líto, nelze zobrazit náhled tohoto souboru - Private::FileLineEdit + PropListDelegate - - '%1' does not exist - '%1' neexistuje + + Not downloaded + Nestaženo - - '%1' does not point to a directory - '%1' není adresář + + + Normal + Normal (priority) + Normální - - '%1' does not point to a file - '%1' není soubor + + Do not download + Do not download (priority) + Nestahovat - - Does not have read permission in '%1' - Není oprávnění ke čtení pro '%1' - - - - Does not have write permission in '%1' - Není oprávnění k zápisu pro '%1' - - - - PropListDelegate - - - Not downloaded - Nestaženo - - - + - Normal - Normal (priority) - Normální - - - - N/A - není k dispozici - - - - Do not download - Do not download (priority) - Nestahovat - - - - High High (priority) Vysoká - + Mixed Mixed (priorities Mix - - + + Maximum Maximum (priority) Maximální @@ -6503,32 +5712,32 @@ PropTabBar - + General Obecné - + Trackers Trackery - + Peers Protějšky - + HTTP Sources HTTP zdroje - + Content Obsah - + Speed Rychlost @@ -6622,22 +5831,22 @@ Komentář: - + Select All Vybrat vše - + Select None Zrušit výběr - + Normal Normální - + High Vysoká @@ -6697,165 +5906,165 @@ Uložit do: - + Maximum Maximální + - Do not download Nestahovat - + Never Nikdy - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) - %1 x %2 (má %3) + - - + + %1 (%2 this session) %1 (%2 toto sezení) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (sdíleno %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 max) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 celkem) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 prům.) - + Open Otevřít - + Open Containing Folder Otevřít cílový adresář - + Rename... Přejmenovat... - + Priority Priorita - + New Web seed Nový webový seed - + Remove Web seed Odstranit webový seed - + Copy Web seed URL Kopírovat URL webového zdroje - + Edit Web seed URL Upravit URL webového zdroje - + + Rename the file + Přejmenovat soubor + + + New name: Nový název: - - + + + The file could not be renamed + Soubor nelze přejmenovat + + + + This file name contains forbidden characters, please choose a different one. + Název souboru obsahuje nepovolené znaky, zvolte prosím jiný. + + + + This name is already in use in this folder. Please use a different name. Tento název je již v tomto adresáři použit. Vyberte prosím jiný název. - + The folder could not be renamed Adresář nelze přejmenovat - + qBittorrent qBittorrent - + Filter files... Filtrovat soubory... - - Renaming - Přejmenování - - - - - Rename error - Chyba přejmenování - - - - The name is empty or contains forbidden characters, please choose a different one. - Název je prázdný nebo obsahuje nepovolené znaky, prosím zvolte jiný. - - - + New URL seed New HTTP source Nový URL zdroj - + New URL seed: Nový URL zdroj: - - + + This URL seed is already in the list. Tento URL zdroj už v seznamu existuje. - + Web seed editing Úpravy webového zdroje - + Web seed URL: URL webového zdroje: @@ -6863,230 +6072,117 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + Vaše IP adresa byla zablokována kvůli vysokém počtu neúspěšných pokusů o přihlášení. + + + + Error: '%1' is not a valid torrent file. + + Chyba: '%1' není platný torrent soubor. + + + + + Error: Could not add torrent to session. + Chyba: Torrent nelze přidat do sezení. + + + + I/O Error: Could not create temporary file. + I/O Chyba: Nelze vytvořit dočasný soubor. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 je neznámý parametr příkazové řádky. - - + + %1 must be the single command line parameter. %1 musí být jediný parametr příkazové řádky. - + + %1 must specify the correct port (1 to 65535). + %1 musí odpovídat správnému portu (1 do 65535). + + + You cannot use %1: qBittorrent is already running for this user. Nemůžete použít %1: qBittorrent pro tohoto uživatele již beží. - + Usage: Používání: - + Options: Možnosti: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - Parametr '%1' musí dodržovat syntaxi '%1=%2' - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - Parametr '%1' musí dodržovat syntaxi '%1=%2' - - - - Expected integer number in environment variable '%1', but got '%2' - V proměnné předpokládáno celé číslo '%1', ale obdrženo '%2' - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - Parametr '%1' musí dodržovat syntaxi '%1=%2' + + Displays program version + Zobrazí verzi programu - - Expected %1 in environment variable '%2', but got '%3' - Předpokládáno %1 v proměnné '%2', ale obdrženo '%3' + + Displays this help message + Zobrazí tuto nápovědu - - port - port + + Changes the Web UI port (current: %1) + Změní port webového rozhraní (nyní: %1) - - %1 must specify a valid port (1 to 65535). - %1 musí určovat správný port (od 1 do 65535). - - - - Display program version and exit - Zobrazit verzi programu a skončit - - - - Display this help message and exit - Zobrazit nápovědu a skončit - - - - Change the Web UI port - Změnit port Web UI - - - + Disable splash screen Zakáže úvodní obrazovku - + Run in daemon-mode (background) Spustit na pozadí - - dir - Use appropriate short form or abbreviation of "directory" - adr - - - - Store configuration files in <dir> - Uložit soubory konfigurace do <dir> - - - - - name - název - - - - Store configuration files in directories qBittorrent_<name> - Uložit soubory konfigurace v adresářích qBittorrent_ <name> - - - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Vniknout do souborů libtorrent fastresume a vztáhnout cesty k souborům podle adresáře profilu - - - - files or URLs - soubory nebo URL odkazy - - - - Download the torrents passed by the user - Stáhnout soubory přidané uživatelem - - - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Určit, zda se otevře dialog "Přidat nový torrent" když je torrent přidáván. - - - - Options when adding new torrents: - Volby při přidávání torrentů: - - - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Zkratka pro %1 - - - - path - cesta - - - - Torrent save path - Cesta uložení torrentu - - - - Add torrents as started or paused - Přidat torrenty jako spuštěné nebo pozastavené + + Downloads the torrents passed by the user + Stáhne torrenty zadané uživatelem - - Skip hash check - Přeskočit kontrolu hashe - - - - Assign torrents to category. If the category doesn't exist, it will be created. - Přiřadit torrenty do kategorie. Když kategorie neexistuje, bude vytvořena. - - - - Download files in sequential order - Stahovat soubory v sekvenčním pořadí - - - - Download first and last pieces first - Stáhnout nejprve první a poslední část - - - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - Hodnoty předvoleb mohou být zadány pomocí proměnných. Pro volt nazvanou 'parameter-name', je proměnná prostředí 'QBT_PARAMETER_NAME' (velkými písmeny, znak '-' je nahrazen znakem '_'). Pro předání stavové hodnoty nastavte proměnnou na '1' nebo 'TRUE'. Příklad vypnutí úvodní obrazovky: - - - - Command line parameters take precedence over environment variables - Parametry příkazového řádku mají přednost před parametry proměnných prostředí - - - + Help Nápověda - + Run application with -h option to read about command line parameters. Spusťte aplikaci s parametrem -h pro nápovědu příkazové řádky - + Bad command line Nesprávný příkaz z příkazové řádky - + Bad command line: Nesprávný příkaz z příkazové řádky: - + Legal Notice Právní podmínky - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - qBittorrent je program pro sdílení souborů. Když spustíte torrent, jeho data bud zpřístupněna ostatním k uploadu. Sdílení jakéhokoliv obsahu je Vaše výhradní zodpovědnost. - - - - No further notices will be issued. - Žádná další upozornění nebudou zobrazena. - - - + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. No further notices will be issued. @@ -7095,628 +6191,701 @@ Další upozornění již nebudou zobrazena. - + Press %1 key to accept and continue... Stisknutím klávesy %1 souhlasíte a pokračujete... - + Legal notice Právní podmínky - + Cancel Zrušit - + I Agree Souhlasím - - - Upgrade - Upgrade + + Torrent name: %1 + Název torrentu: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - Provedli jute update ze starší verze, která ukládá odlišně. Musíte přejít k novému ukládacímu systému. Potom už nebudete moci použít verzi starší než v3.3.0. Pokračovat? [a/n] + + Torrent size: %1 + Velikost torrentu: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - Provedli jste update ze starší verze, která ukládá odlišně. Musíte přejít k novému ukládacímu systému. Potom už nebudete moci použít verzi starší než v3.3.0. + + Save path: %1 + Cesta pro uložení: %1 - - Couldn't migrate torrent with hash: %1 - Nelze migrovat torrent s hashem: %1 + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Torrent byl stažen za %1. - - Couldn't migrate torrent. Invalid fastresume file name: %1 - Torrent nelze migrovat. Neplatný fastresume název: %1 + + Thank you for using qBittorrent. + Děkujeme Vám za používání qBittorrentu. - - Detected unclean program exit. Using fallback file to restore settings: %1 - Detekováno nesprávné ukončení programu. Pro obnovení nastavení je použita dříve uložená verze: %1 + + [qBittorrent] '%1' has finished downloading + [qBittorrent] Stahování '%1' bylo dokončeno - - An access error occurred while trying to write the configuration file. - Vyskytla se chyba při pokusu o zápis do konfiguračního souboru. + + The remote host name was not found (invalid hostname) + Vzdálený server nebyl nalezen (neplatný název hostitele) - - A format error occurred while trying to write the configuration file. - Vyskytla se chyba formátu při pokusu o zápis do konfiguračního souboru. + + The operation was canceled + Operace byla zrušena - - An unknown error occurred while trying to write the configuration file. - Vyskytla se neznámá chyba během pokusu o zápis do konfiguračního souboru. + + The remote server closed the connection prematurely, before the entire reply was received and processed + Vzdálený server předčasně ukončil připojení, dříve než byla celá odpověď přijata a zpracována - - - RSS::AutoDownloader - - - Invalid data format. - Neplatný formát dat. + + The connection to the remote server timed out + Připojení k vzdálenému serveru vypršelo - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - Nelze uložit data AutoDownloaderu RSS v %1. Chyba: %2 + + SSL/TLS handshake failed + SSL/TLS handshake selhalo - - Invalid data format - Neplatný formát dat + + The remote server refused the connection + Vzdálený server odmítl připojení - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - Nelze číst pravidla RSS AutoDownloader od %1. Chyba: %2 + + The connection to the proxy server was refused + Připojení k proxy serveru bylo odmítnuto - - Couldn't load RSS AutoDownloader rules. Reason: %1 - Nelze načíst pravidla RSS AutoDownloader. Příčina: % 1 + + The proxy server closed the connection prematurely + Proxy server předčasně ukončil připojení + + + + The proxy host name was not found + Název proxy serveru nebyl nalezen - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - Selhalo stažení RSS feedu u '%1'. Příčina '%2' + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Připojení k proxy serveru vypršelo nebo proxy dostatečně rychle neodpověděla na zaslaný požadavek - - RSS feed at '%1' updated. Added %2 new articles. - RSS feed u '%1' úspěšně aktualizován. Přidány %2 nové články. + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Proxy vyžaduje ověření, ale neakceptovala žádné z nabízených přihlašovacích údajů - - Failed to parse RSS feed at '%1'. Reason: %2 - Selhalo zpracování RSS feedu u '%1'. Příčina '%2' + + The access to the remote content was denied (401) + Přístup ke vzdálenému obsahu byl odepřen (401) - - Couldn't read RSS Session data from %1. Error: %2 - Nebylo možno načíst data RSS relace z %1. Chyba: %2 + + The operation requested on the remote content is not permitted + Požadovaná operace na vzdáleném obsahu není dovolena - - Couldn't parse RSS Session data. Error: %1 - Nebylo možno zpracovat data RSS relace. Chyba: %1 + + The remote content was not found at the server (404) + Vzdálený obsah nebyl na serveru nalezen (404) - - Couldn't load RSS Session data. Invalid data format. - Nebylo možno získat data RSS relace. Neplatný formát dat. + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Vzdálený server vyžaduje přihlášení, ale neakceptoval žádné z nabízených přihlašovacích údajů - - Couldn't load RSS article '%1#%2'. Invalid data format. - Nebylo možno získat RSS článek '%1#%2'. Neplatný formát dat. + + The Network Access API cannot honor the request because the protocol is not known + API pro připojení k síti nemohlo akceptovat požadavek z důvodu neznámého protokolu - - - RSS::Private::Parser - - Invalid RSS feed. - Neplatný RSS feed. + + The requested operation is invalid for this protocol + Požadovaná operace není pro tento protokol platná - - %1 (line: %2, column: %3, offset: %4). - %1 (řádek: %2, sloupec: %3, offset: %4). + + An unknown network-related error was detected + Byla detekována neznámá chyba sítě + + + + An unknown proxy-related error was detected + Byla detekována neznámá chyba související s proxy + + + + An unknown error related to the remote content was detected + Byla detekována neznámá chyba související se vzdáleným obsahem + + + + A breakdown in protocol was detected + Byla detekována chyba v protokolu + + + + Unknown error + Neznámá chyba - - - RSS::Session - - RSS feed with given URL already exists: %1. - RSS feed se zadanou URL už už existuje: %1. + + + Upgrade + + + + + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] + - - Cannot move root folder. - Nelze přesunout kořenový adresář. + + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. + - - - Item doesn't exist: %1. - Položka neexistuje: %1. + + Couldn't migrate torrent with hash: %1 + Nelze migrovat torrent s hashem: %1 - - Cannot delete root folder. - Nelze smazat kořenový adresář. + + Couldn't migrate torrent. Invalid fastresume file name: %1 + Torrent nelze migrovat. Neplatný fastresume název: %1 - - Incorrect RSS Item path: %1. - Nesprávná cesta položky RSS: %1. + + Detected unclean program exit. Using fallback file to restore settings. + - - RSS item with given path already exists: %1. - žka RSS se zadanou cestou neexistuje: %1. + + An access error occurred while trying to write the configuration file. + - - Parent folder doesn't exist: %1. - Nadřazený adresář neexistuje: %1. + + A format error occurred while trying to write the configuration file. + - RSSWidget + RSS - + Search Hledat - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - Získávání RSS feedů je nyní vypnuto! Můžete ho zapnout v nastavení aplikace. - - - + New subscription - Nový odběr + Nové přihlášení k odběru - - - + + + Mark items read - Označ jako přečtené. + Označit jako přečtené - - Refresh RSS streams - Obnovit RSS proudy - - - + Update all Aktualizovat vše - + RSS Downloader... - RSS stahovač... + Stahování z RSS... + + + + Settings... + Nastavení... - + Torrents: (double-click to download) - Torrenty: (dvojklik ke stažení) + Torrenty: (dvojklik pro stažení) - - + + Delete Smazat - + Rename... Přejmenovat... - + Rename Přejmenovat - - + + Update - Aktualizace + Aktualizovat - + New subscription... - Nový odběr... + Nové přihlášení k odběru... - - + + Update all feeds - Aktualizovat všechny feedy + Aktualizovat všechny kanály - + Download torrent Stáhnout torrent - + Open news URL - Otevřít odkaz zpráv + Otevřít URL s novinkami - + Copy feed URL - Kopírovat odkaz feedů + Kopírovat URL kanálu - + New folder... - Nová složka... + Nový adresář... - - Please choose a folder name - Vyberte název složky + + Refresh RSS streams + Obnovit RSS kanály + + + RSSImp - - Folder name: - Název složky: + + Stream URL: + URL kanálu: - - New folder - Nová složka + + Please type a RSS stream URL + Prosím napište URL RSS kanálu + + + + This RSS feed is already in the list. + Tento RSS kanál už v seznamu existuje. + + + + Please choose a folder name + Prosím vyberte název adresáře - - Please type a RSS feed URL - Prosím vložte odkaz RSS feedu + + Folder name: + Název adresáře: - - Feed URL: - Odkaz feedu + + New folder + Nový adresář - + Deletion confirmation - Smazat potvrzení + Potvrzení o smazání - + Are you sure you want to delete the selected RSS feeds? - Určitě chcete smazar označené RSS feedy? + Opravdu chcete smazat vybrané RSS kanály? - + Please choose a new name for this RSS feed - Zvolte název pro tento RSS feed, prosím + Prosím vyberte nový název pro tento RSS kanál - + New feed name: - Nový název feedu: + Název nového kanálu: + + + + Name already in use + Název je již používán - - Rename failed - Přejmenovaní neuspěšné + + This name is already used by another item, please choose another one. + Tento název je již používán, vyberte prosím jiný. - + Date: - Datum: + Datum: - + Author: - Autor + Autor: + + + + Unread + Nepřečtené - ScanFoldersDelegate + Rss::Feed - - Select save location - Vybrat umístění pro uložení + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + Automatické stažení '%1' z RSS kanálu '%2' selhalo, protože neobsahuje torrent nebo magnet odkaz + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + Automaticky stahovat '%1' torrent z RSS kanálu '%2'... + + + + Rss::Private::Parser + + + Invalid RSS feed. + Neplatný RSS kanál. + + + + RssSettingsDlg + + + RSS Reader Settings + Nastavení RSS čtečky + + + + RSS feeds refresh interval: + Interval obnovování RSS kanálů: + + + + min + + + + + Maximum number of articles per feed: + Maximální počet článků na kanál: + + + + ScanFoldersDelegate + + + Select save location + ScanFoldersModel - + Monitored Folder - Sledovaný adresář + - + Override Save Location - Přepsat umístění pro uložení + - + Monitored folder - Sledovaný adresář + - + Default save location - Výchozí umístění pro uložení: + - + Browse... - Procházet... + Procházet... - SearchJobWidget + SearchEngine - - Form - Formulář + + Unknown search engine plugin file format. + Neznámý formát souboru pluginu vyhledávače. - - Results(xxx) - Výsledky(xxx) + + A more recent version of this plugin is already installed. + V systému je již nainstalována novější verze tohoto pluginu. - - Search in: - Hledat v: + + + Plugin is not supported. + Plugin nepodporován. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - <html><head/><body><p>Některé vyhledávací enginy hledají v popisu torrentu a také v názvech souborů v torrentu. Zda budou takové výsledky zobrazeny v seznamu je ovládáno tímto režimem.</p><p><span style=" font-weight:600;">Všude </span>vypne filtrování a zobrazí všechny výsledky vyhledávácích enginů.</p><p><span style=" font-weight:600;">Pouze název torrentu</span> zobrazí pouze torrenty, jejichž název odpovídá hledanému dotazu.</p></body></html> + + Update server is temporarily unavailable. %1 + Server s aktualizacemi je dočasně nedostupný. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - <html><head/><body><p>Nastavte minimální a maximální povolený počet seederů</p></body></html> + + + Failed to download the plugin file. %1 + Selhalo stažení plugin souboru. %1 - - Seeds: - Seedy: + + An incorrect update info received. + Byly obdrženy nesprávné aktualizační informace. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - <html><head/><body><p>Minimální počet seederů</p></body></html> + + All categories + Všechny kategorie - - - to - do + + Movies + Filmy - - <html><head/><body><p>Maximal number of seeds</p></body></html> - <html><head/><body><p>Maximální počet seederů</p></body></html> + + TV shows + TV seriály - - - - + + Music + Hudba - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - <html><head/><body><p>Nastavte minimální a maximální povolenou velikost torrentu</p></body></html> + + Games + Hry - - Size: - Velikost: + + Anime + Anime - - <html><head/><body><p>Minimal torrent size</p></body></html> - <html><head/><body><p>Minimální velikost torrentu</p></body></html> + + Software + Software - - <html><head/><body><p>Maximal torrent size</p></body></html> - <html><head/><body><p>Maximální velikost torrentu</p></body></html> + + Pictures + Obrázky + + + + Books + Knihy + + + + SearchListDelegate + + + + Unknown + Neznámé + + + SearchTab - + Name i.e: file name Název - + Size i.e: file size Velikost - + Seeders i.e: Number of full sources Seedeři - + Leechers i.e: Number of partial sources Leecheři - + Search engine Vyhledávač - - Filter search results... - Filtrovat výsledky hledání... - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - Výsledky (zobrazuje <i>%1</i> z <i>%2</i>): + - + Torrent names only - Pouze názvy torrentů + - + Everywhere - Všude - - - - Use regular expressions - Používejte regulární výrazy + - + Searching... - Hledání... + - + Search has finished - Hledání dokončeno + Hledání ukončeno - + Search aborted - Hledání zrušeno + - + An error occurred during search... - Během hledání nastala chyba... + - + Search returned no results - Nebyly nalezeny žádné výsledky + - + Column visibility - Viditelnost sloupců - - - - SearchPluginManager - - - Unknown search engine plugin file format. - Neznámý formát souboru pluginu vyhledávače. - - - - A more recent version of this plugin is already installed. - V systému je již nainstalována novější verze tohoto pluginu. + Zobrazení sloupců - - - Plugin is not supported. - Plugin není podporován. + + Form + - - All categories - Všechny kategorie + + Results(xxx) + - - Movies - Filmy + + Search in: + - - TV shows - TV seriály + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + - - Music - Hudba + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + - - Games - Hry + + Seeds: + Zdroje: - - Anime - Anime + + <html><head/><body><p>Minimal number of seeds</p></body></html> + - - Software - Software + + + to + do - - Pictures - Obrázky + + <html><head/><body><p>Maximal number of seeds</p></body></html> + - - - Books - Knihy + + + + + - - Update server is temporarily unavailable. %1 - Server s aktualizacemi je dočasně nedostupný. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + - - - Failed to download the plugin file. %1 - Selhalo stažení plugin souboru. %1 + + Size: + Velikost: - - An incorrect update info received. - Byly obdrženy nesprávné aktualizační informace. + + <html><head/><body><p>Minimal torrent size</p></body></html> + - - Search plugin '%1' contains invalid version string ('%2') - Vyhledávací plugin '%1' obsahuje neplatný řetezec verze ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> + @@ -7724,198 +6893,185 @@ - - - - + + + Search Hledat - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - Žádné vyhledávací pluginy nejsou nainstalovány. -Klikněte na tlačítko "Vyhledávácí pluginy..." dole vpravo v okně, abyste nějaké nainstalovali. - - - + Download Stáhnout - + Go to description page Přejít na stránku s popisem - + Copy description page URL Kopírovat URL stránky s popisem - + Search plugins... - Pluginy pro vyhledávání + - + A phrase to search for. - Fráze k vyhledání + - + Spaces in a search term may be protected by double quotes. - Mezery v hledaném výrazu moho být chráněny uvozovkami. + - + Example: Search phrase example - Příklad: + - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - <b>foo bar</b>: vyhledat <b>foo</b> a <b>bar</b> + - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - <b>&quot;foo bar&quot;</b>: vyhledat <b>foo bar</b> + - + All plugins Všechny pluginy - + Only enabled - Pouze zapnuté + - + Select... - Vybrat... + - - - + + + Search Engine Vyhledávač - + Please install Python to use the Search Engine. Pro použití vyhledávače nainstalujte Python. - + Empty search pattern Prázdný hledaný řetězec - + Please type a search pattern first Nejdříve napište hledaný řetězec - + Stop Zastavit - + Search has finished Hledání ukončeno - + Search has failed Hledání selhalo - ShutdownConfirmDialog - - - Don't show again - Znovu nezobrazovat - + ShutdownConfirmDlg - + qBittorrent will now exit. - qBittorrent se nyní ukončí. + - + E&xit Now - &Ukončit nyní + - + Exit confirmation Potvrdit vypnutí - + The computer is going to shutdown. - Počítač se vypíná. + - + &Shutdown Now - &Vypnout nyní - - - - Shutdown confirmation - Potvrdit vypnutí + - + The computer is going to enter suspend mode. - Počítač přechází do režimu spánku. + - + &Suspend Now - &Uspat nyní. + - + Suspend confirmation - Potvrzení uspání + - + The computer is going to enter hibernation mode. - Počítač přechází do režimu hibernace. + - + &Hibernate Now - &Přejít do hibernace nyní + - + Hibernate confirmation - Potvrzení hibernace + - + You can cancel the action within %1 seconds. - Můžete zrušit akci během %1 sekund. + + + + + Shutdown confirmation + Potvrdit vypnutí SpeedLimitDialog - + KiB/s KiB/s @@ -7923,145 +7079,137 @@ SpeedPlotView - + Total Upload Odesláno celkem - + Total Download Staženo celkem - + Payload Upload - Odeslání užitečných dat + - + Payload Download - Stažení užitečných dat + - + Overhead Upload - Odeslání režie + - + Overhead Download - Stažení režie + - + DHT Upload - Odeslání DHT + - + DHT Download - Stažení DHT + - + Tracker Upload - Odeslání tracker + - + Tracker Download - Stažení tracker + SpeedWidget - + Period: - Období: + - + 1 Minute 1 minuta - + 5 Minutes 5 minut - + 30 Minutes 30 minut - + 6 Hours 6 hodin - + Select Graphs - Vybrat grafy + - + Total Upload Celkově odesláno - + Total Download Staženo celkem - + Payload Upload - Odeslání užitečných dat + - + Payload Download - Stažení užitečných dat + - + Overhead Upload - Odeslání režie + - + Overhead Download - Stažení režie + - + DHT Upload - Odeslání DHT + - + DHT Download - Stažení DHT + - + Tracker Upload - Nahrání trackeru + - + Tracker Download - Stáhnutí trackeru - - - - StacktraceDialog - - - Crash info - Info o havárii + @@ -8077,48 +7225,48 @@ Statistiky uživatele - - Cache statistics - Statistiky vyrovnávací paměti + + Total peer connections: + Celkový počet připojení k protějškům: - - Read cache hits: - Přístupy do cache pro čtení: + + Global ratio: + Celkový poměr: - - Average time in queue: - Průměrná doba ve frontě: + + Alltime download: + Celkově staženo: - - Connected peers: - Připojení peerové: + + Alltime upload: + Celkově odesláno: - - All-time share ratio: - Celkový poměr sdílení: + + Total waste (this session): + Celkově zahozeno (tato relace): - - All-time download: - Celkově staženo: + + Cache statistics + Statistiky vyrovnávací paměti - - Session waste: - Zahozeno od spuštění: + + Read cache hits: + - - All-time upload: - Celkově odesláno: + + Average time in queue: + - Total buffer size: + Total buffers size: Celková velikost vyrovnávací paměti: @@ -8134,12 +7282,12 @@ Write cache overload: - Přeplnění cache pro zápis: + Přetížení keš pro zápis: Read cache overload: - Přetížení cache pro čtení: + Přetížení keš pro čtení: @@ -8147,36 +7295,46 @@ Celková velikost fronty: - + + OK + OK + + + %1 ms 18 milliseconds - %1 ms + StatusBar - + Connection status: Stav připojení: - + No direct connections. This may indicate network configuration problems. Žádná přímá spojení. To může značit problémy s nastavením sítě. - + DHT: %1 nodes DHT: %1 uzlů - - qBittorrent needs to be restarted! - Je nutné restartovat qBittorrent! + + qBittorrent needs to be restarted + Je nutné restartovat qBittorrent + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent byl právě aktualizován a kvůli provedení změn je nutné jej restartovat. @@ -8195,883 +7353,616 @@ Online - + Click to switch to alternative speed limits Kliknutí přepne na alternativní limity rychlosti - + Click to switch to regular speed limits Kliknutím přepnete na normální limity rychlosti - + + Manual change of rate limits mode. The scheduler is disabled. + Manuální nastavení limitu rychlosti. Plánovač je zakázán. + + + Global Download Speed Limit Celkový limit rychlosti stahování - + Global Upload Speed Limit Celkový limit rychlosti odesílání - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter Vše (0) - + Downloading (0) Stahuji (0) - + Seeding (0) Sdílím (0) - + Completed (0) Dokončeno (0) - + Resumed (0) Obnoveno (0) - + Paused (0) Pozastaveno (0) - + Active (0) Aktivní (0) - + Inactive (0) Neaktivní (0) - + Errored (0) S chybou (0) - + All (%1) Vše (%1) - + Downloading (%1) Stahuji (%1) - + Seeding (%1) - Seeduji (%1) + Sdílím (%1) - + Completed (%1) Dokončeno (%1) - + Paused (%1) Pozastaveno (%1) - + Resumed (%1) Obnoveno (%1) - + Active (%1) Aktivní (%1) - + Inactive (%1) Neaktivní (%1) - + Errored (%1) S chybou (%1) - TagFilterModel + TorrentContentModel - - Tags - Štítky + + Name + Název - - All - Vše + + Size + Velikost - - Untagged - Neoznačeno + + Progress + Průběh - - - TagFilterWidget - - Add tag... - Přidat štítek... + + Download Priority + - - Remove tag - Odebrat štítek + + Remaining + Zbývající + + + TorrentCreatorDlg - - Remove unused tags - Odebrat nepoužité štítky + + Select a folder to add to the torrent + Vyberte adresář pro přidání do torrentu - - Resume torrents - Pokračování torrentů + + Select a file to add to the torrent + Vyberte soubor pro přidání do torrentu - - Pause torrents - Pozastavení torrentů + + No input path set + Nebyla zadána vstupní cesta - - Delete torrents - Smazat torrenty + + Please type an input path first + Nejdříve prosím zadejte vstupní cestu - - New Tag - Nový štítek + + Select destination torrent file + Vybrat cílový torrent soubor - - Tag: - Štítek: + + Torrent Files (*.torrent) + - - Invalid tag name - Neplatný název štítku + + Torrent was created successfully: %1 + %1 is the path of the torrent + Torrent byl úspěšně vytvořen: %1 - - Tag name '%1' is invalid - Název štítku "%1" je neplatný + + + + Torrent creation + Vytvoření torrentu - - Tag exists - Štítek existuje + + Torrent creation was unsuccessful, reason: %1 + Vytvoření torrentu selhalo, důvod: %1 - - Tag name already exists. - Název štítku již existuje. + + Created torrent file is invalid. It won't be added to download list. + Vytvořený torrent soubor je špatný. Nebude přidán do seznamu stahování. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Vlastnosti kategorie torrentů + + Name + i.e: torrent name + Název - - Name: - Název: + + Size + i.e: torrent size + Velikost - - Save path: - Uložit do: + + Done + % Done + Hotovo - - Choose save path - Vyberte cestu pro uložení + + Status + Torrent status (e.g. downloading, seeding, paused) + Status - - New Category - Nová kategorie + + Seeds + i.e. full sources (often untranslated) + Zdroje - - Invalid category name - Neplatný název kategorie + + Peers + i.e. partial sources (often untranslated) + Protějšky - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - Název kategorie nemůže obsahovat znak '\'. -Název kategorie nemůže začínat/končit znakem '/'. -Název kategorie nemůže obsahovat sekvenci znaků '//'. + + Down Speed + i.e: Download speed + Rychlost stahování - - Category creation error - Problém s vytvořením kategorie + + Up Speed + i.e: Upload speed + Rychlost odesílání - - Category with the given name already exists. -Please choose a different name and try again. - Název kategorie již existuje. -Prosím zvolte jiný název kategorie a zkuste to znovu. + + Ratio + Share ratio + Poměr - - - TorrentContentModel - - Name - Název + + ETA + i.e: Estimated Time of Arrival / Time left + Odh. čas - - Size - Velikost + + Category + - - Progress - Průběh + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Přidán - - Download Priority - Priorita stahování + + Completed On + Torrent was completed on 01/01/2010 08:00 + Dokončen - - Remaining - Zbývající + + Tracker + Tracker - - Availability - Dostupnost + + Down Limit + i.e: Download limit + Limit stahování - - - TorrentCreatorDialog - - Torrent Creator - Autor torrentu + + Up Limit + i.e: Upload limit + Limit odesílání - - Select file/folder to share - Vyberte adresář/soubor ke sdílení + + Downloaded + Amount of data downloaded (e.g. in MB) + Staženo - - Path: - Cesta: + + Uploaded + Amount of data uploaded (e.g. in MB) + Odesláno - - [Drag and drop area] - [Sem přetáhněte soubory] + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Staženo po spuštění - - - Select file - Vyber soubor + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Odesláno po spuštění - - - Select folder - Vyber adresář + + Remaining + Amount of data left to download (e.g. in MB) + Zbývající - - Settings - Nastavení + + Time Active + Time (duration) the torrent is active (not paused) + Aktivní po dobu - - Piece size: - Velikost části: + + Save path + Torrent save path + Cesta pro uložení - - Auto - Auto + + Completed + Amount of data completed (e.g. in MB) + Dokončeno - - 16 KiB - 16 KiB + + Ratio Limit + Upload share ratio limit + Omezení poměru sdílení - - 32 KiB - 32 KiB + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Poslední komplet zdroj - - 64 KiB - 64 KiB + + Last Activity + Time passed since a chunk was downloaded/uploaded + Poslední aktivita - - 128 KiB - 128 KiB + + Total Size + i.e. Size including unwanted data + Celková velikost + + + TrackerFiltersList - - 256 KiB - 256 KiB + + All (0) + this is for the tracker filter + Vše (0) - - 512 KiB - 512 KiB + + Trackerless (0) + Bez trackeru (0) - - 1 MiB - 1 MiB + + Error (0) + Chyby (0) - - 2 MiB - 2 MiB + + Warning (0) + Varování (0) - - 4 MiB - 4 MiB + + + Trackerless (%1) + Bez trackeru (%1) - - 8 MiB - 8 MiB + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - 16 MiB - 16 MiB + + + Error (%1) + Chyby (%1) - - 32 MiB - 32 MiB + + + Warning (%1) + Varování (%1) - - Calculate number of pieces: - Výpočet počtu částí: + + Resume torrents + Obnovit torrenty - - Private torrent (Won't distribute on DHT network) - Soukromý torrent (nebude šířen na DHT síti) + + Pause torrents + Pozastavit torrenty - - Start seeding immediately - Začít seedovat ihned + + Delete torrents + Smazat torrenty - - Ignore share ratio limits for this torrent - Ignorovat limity ratia pro tento torent + + + All (%1) + this is for the tracker filter + Vše (%1) + + + TrackerList - - Optimize alignment - Optimalizovat řazení souborů + + URL + URL - - Fields - Pole + + Status + Status - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - Skupiny nebo třídy trackerů můžete oddělit prázdnou řádkou. + + Received + - - Web seed URLs: - URL odkazy pro webseed: + + Seeds + Zdroje - - Tracker URLs: - URL trackeru: + + Peers + Protějšky - - Comments: - Komentáře: + + Downloaded + Staženo - - Source: - Zdroj: + + Message + Zpráva - - Progress: - Průběh: + + + Working + Funkční - - Create Torrent - Vytvořit Torrent + + Disabled + Vypnuto - - - - Torrent creation failed - Vytvoření torentu selhalo + + This torrent is private + Tento torrent je soukromý - - Reason: Path to file/folder is not readable. - Důvod: Cesta k adresáři/složce není čitelná. + + Updating... + Aktualizuji... - - Select where to save the new torrent - Vyberte adresář pro přidání do torrentu + + Not working + Nefunkční - - Torrent Files (*.torrent) - Torrent soubory (*.torrent) + + Not contacted yet + Dosud nekontaktován - - Reason: %1 - Důvod: %1 + + Tracker URL: + URL trackeru: - - Reason: Created torrent is invalid. It won't be added to download list. - Důvod: Vytvořený torrent je špatný. Nebude přidán do seznamu stahování. + + Tracker editing + Upravit tracker - - Torrent creator - Autor torrentu + + + Tracker editing failed + Úprava trackeru selhala - - Torrent created: - Torrent vytvořen: + + The tracker URL entered is invalid. + Zadaná URL trackeru není platná. - - - TorrentInfo - - File size exceeds max limit %1 - Velikost souboru překračuje maximální limit %1 + + The tracker URL already exists. + Tato URL trackeru již existuje. - - Torrent file read error: %1 - Chyba při čtení torrent souboru: %1 + + Add a new tracker... + Přidat nový tracker... - - Torrent file read error: size mismatch - Chyba při čtení torrent souboru: nesouhlasí velikost + + Copy tracker URL + Kopírovat URL trackeru - - - TorrentsController - - Not contacted yet - Dosud nekontaktován + + Edit selected tracker URL + Upravit označenou URL trackeru - - Updating... - Aktualizuji... + + Force reannounce to selected trackers + Vynutit oznámení vybraným trackerům - - Working - Funkční - - - - Not working - Nefunkční - - - - Error: '%1' is not a valid torrent file. - Chyba: '%1' není platný torrent soubor. - - - - - - - Torrent queueing must be enabled - Řazení torrentů musí být povoleno - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - Save path is empty - Cesta pro uložení je prázdná - - - - Cannot make save path - Nelze vytvořit cestu pro uložení - - - - Cannot write to directory - Nelze zapisovat do adresáře - - - - WebUI Set location: moving "%1", from "%2" to "%3" - WebUI Nastavit cestu: přesunout "%1", z "%2" do "%3" - - - - Incorrect torrent name - Nesprávný název torrentu - - - - - Incorrect category name - Nesprávný název kategorie - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - Vše (0) - - - - Trackerless (0) - Bez trackeru (0) - - - - Error (0) - Chyby (0) - - - - Warning (0) - Varování (0) - - - - - Trackerless (%1) - Bez trackeru (%1) - - - - - Error (%1) - Chyby (%1) - - - - - Warning (%1) - Varování (%1) - - - - Resume torrents - Obnovit torrenty - - - - Pause torrents - Pozastavit torrenty - - - - Delete torrents - Smazat torrenty - - - - - All (%1) - this is for the tracker filter - Vše (%1) - - - - TrackerListWidget - - - - Working - Funkční - - - - Disabled - Vypnuto - - - - This torrent is private - Tento torrent je soukromý - - - - Updating... - Aktualizuji... - - - - Not working - Nefunkční - - - - Not contacted yet - Dosud nekontaktován - - - - - - - - - N/A - - - - - Tracker editing - Upravit tracker - - - - Tracker URL: - URL trackeru: - - - - - Tracker editing failed - Úprava trackeru selhala - - - - The tracker URL entered is invalid. - Zadaná URL trackeru není platná. - - - - The tracker URL already exists. - Tato URL trackeru již existuje. - - - - Add a new tracker... - Přidat nový tracker... - - - - Remove tracker - Odstranit tracker - - - - Copy tracker URL - Kopírovat URL trackeru - - - - Edit selected tracker URL - Upravit vybranou URL trackeru - - - - Force reannounce to selected trackers - Vynutit oznámení vybraným trackerům - - - + Force reannounce to all trackers Vynutit oznámení všem trackerům - - URL - URL - - - - Status - Stav - - - - Received - Přijato - - - - Seeds - Zdroje - - - - Peers - Protějšky - - - - Downloaded - Staženo - - - - Message - Zpráva - - - - Column visibility - Zobrazení sloupců - - - - TrackerLoginDialog - - - - Tracker authentication - Ověření trackeru - - - - Tracker: - Tracker: - - - - Login - Přihlášení - - - - Username: - Uživatelské jméno: - - - - Password: - Heslo: - - - - Log in - Přihlásit se + + Remove tracker + Odstranit tracker - TrackersAdditionDialog + TrackersAdditionDlg - + Trackers addition dialog - Dialog pro přidání trackerů + Dialog pro přidání trackeru - + List of trackers to add (one per line): Seznam trackerů pro přidání (jeden na řádek): - - + + µTorrent compatible list URL: Seznam URL kompatibilní s µTorrent: - + + I/O Error + Chyba I/O + + + + Error while trying to open the downloaded file. + Chyba při pokusu o otevření staženého souboru. + + + No change Žádná změna - + No additional trackers were found. Nebyly nalezeny žádné další trackery. - + Download error Chyba stahování - + The trackers list could not be downloaded, reason: %1 Seznam trackerů nemohl být stažen, důvod: %1 @@ -9079,105 +7970,99 @@ TransferListDelegate - + Downloading Stahuji - + Downloading metadata used when loading a magnet link Stahuji metadata - + Allocating qBittorrent is allocating the files on disk Přiděluji místo - + Paused Pozastaveno - + Queued i.e. torrent is queued Zařazeno do fronty - + Seeding Torrent is complete and in upload-only mode Sdílím - + Stalled Torrent is waiting for download to begin Pozastaveno - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] Stahuji - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] Sdílím - + Checking Torrent local data is being checked Kontroluji - + Queued for checking i.e. torrent is queued for hash checking Ve frontě na kontrolu - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - Kontrola dat pro obnovení + - + Completed Dokončeno - - Moving - Torrent local data are being moved/relocated - Přesouvám - - - + Missing Files Chybějící soubory - + Errored torrent status, the torrent has an error S chybou - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (sdíleno %2) - + %1 ago e.g.: 1h 20m ago před %1 @@ -9186,579 +8071,591 @@ TransferListFiltersWidget - - Status - Stav - - - - Categories - Kategorie - - - - Tags - Štítky - - - - Trackers - Trackery - - - - TransferListModel - - - Name - i.e: torrent name - Název - - - - Size - i.e: torrent size - Velikost - - - - Done - % Done - Hotovo - - - + Status - Torrent status (e.g. downloading, seeding, paused) - Stav - - - - Seeds - i.e. full sources (often untranslated) - Seedy - - - - Peers - i.e. partial sources (often untranslated) - Protějšky - - - - Down Speed - i.e: Download speed - Rychlost stahování - - - - Up Speed - i.e: Upload speed - Rychlost odesílání - - - - Ratio - Share ratio - Ratio - - - - ETA - i.e: Estimated Time of Arrival / Time left - Odh. čas - - - - Category - Kategorie - - - - Tags - Štítky - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - Přidáno - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - Dokončeno - - - - Tracker - Tracker - - - - Down Limit - i.e: Download limit - Limit stahování - - - - Up Limit - i.e: Upload limit - Limit odesílaní - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Staženo - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Odesláno - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - Staženo od spuštění - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - Odesláno od spuštění - - - - Remaining - Amount of data left to download (e.g. in MB) - Zbývající - - - - Time Active - Time (duration) the torrent is active (not paused) - Aktivní po dobu - - - - Save path - Torrent save path - Cesta pro uložení - - - - Completed - Amount of data completed (e.g. in MB) - Dokončeno - - - - Ratio Limit - Upload share ratio limit - Omezení ratia - - - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - Kompletní zdroj naposledy - - - - Last Activity - Time passed since a chunk was downloaded/uploaded - Poslední aktivita + Status - - Total Size - i.e. Size including unwanted data - Celková velikost + + Categories + + + + + Trackers + Trackery TransferListWidget - + Column visibility Zobrazení sloupců - + Choose save path Vyberte cestu pro uložení - + Torrent Download Speed Limiting Limit rychlosti stahování torrentu - + Torrent Upload Speed Limiting Limit rychlosti odesílání torrentu - + Recheck confirmation Zkontrolovat potvrzení - + Are you sure you want to recheck the selected torrent(s)? Opravdu chcete znovu zkontrolovat označené torrenty? - + Rename Přejmenovat - + New name: Nový název: - + Resume Resume/start the torrent Obnovit - + Force Resume Force Resume/start the torrent Vynutit obnovení - + Pause Pause the torrent Pozastavit - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Nastavit umístění: přesunout "%1", z "%2" do "%3" - - - - Add Tags - Přidat Štítek - - - - Remove All Tags - Odstranit všechny Štítky - - - - Remove all tags from selected torrents? - Smazat všechny štítky z označených torrentů? + + New Category + - - Comma-separated tags: - Čárkou oddelěné štítky: + + Category: + Kategorie: - - Invalid tag - Neplatný štítek + + Invalid category name + - - Tag name: '%1' is invalid - Název štítku: '%1' je neplatný + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + - + Delete Delete the torrent Smazat - + Preview file... Náhled souboru... - + Limit share ratio... - Omezit ratio... + Omezit poměr sdílení... - + Limit upload rate... Omezit rychlost odesílání... - + Limit download rate... Omezit rychlost stahování... - + Open destination folder Otevřít cílový adresář - + Move up i.e. move up in the queue Přesunout nahoru - + Move down i.e. Move down in the queue Přesunout dolů - + Move to top i.e. Move to top of the queue Přesunout na začátek - + Move to bottom i.e. Move to bottom of the queue Přesunout na konec - + Set location... Nastavit umístění... - - Force reannounce - Vynutit oznámení - - - + Copy name - Kopírovat název - - - - Copy hash - Zkopírovat hash + Kopírovat jméno - + Download first and last pieces first - Stáhnout nejdříve první a poslední část + - + Automatic Torrent Management - Automatická správa torrentu + - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - Automatický mód znamená, že různé vlastnosti torrentu (např. cesta pro uložení) se budou řídit podle příslušné kategorie + - + Category - Kategorie + - + New... New category... - Nový... + - + Reset Reset category - Resetovat - - - - Tags - Štítky - - - - Add... - Add / assign multiple tags... - Přidat... - - - - Remove All - Remove all tags - Odstranit vše + - + Priority Priorita - + Force recheck Vynutit překontrolování - + Copy magnet link - Kopírovat Magnet link + Kopírovat Magnet odkaz - + Super seeding mode Mód super sdílení - + Rename... Přejmenovat... - + Download in sequential order Stahovat postupně - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - Omezení ratia pro odesílání/stahování torrentu + Omezení poměru odesílání/stahování torrentu - - Use global share limit - Nastavení globálního limitu sdílení + + Use global ratio limit + Použít globální omezení poměru - - - + + + buttonGroup buttonGroup - - Set no share limit - Nastavit sdílení bez limitu + + Set no ratio limit + Nastavit poměr bez omezení + + + + Set ratio limit to + Nastavit omezení poměru na + + + + WebApplication + + + Incorrect category name + + + + + WebUI + + + The Web UI is listening on port %1 + Webové rozhraní naslouchá na portu %1 + + + + Web UI Error - Unable to bind Web UI to port %1 + Chyba webového rozhraní - Nelze připojit Web UI na port %1 + + + about - - Set share limit to - Nastavit limit sdílení na + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + - - ratio - ratio + + Copyright %1 2006-2016 The qBittorrent project + - - minutes - minuty + + Home Page: + - - No share limit method selected - Nevybrána žádná metoda omezování sdílení + + Forum: + - - Please select a limit method first - Nejdříve, prosím, vyberte způsob omezování sdílení + + Bug Tracker: + - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - Python detekován, verze: %1 + + Add Peers + - - Python not detected - Python nebyl nalezen + + List of peers to add (one per line): + + + + + Format: IPv4:port / [IPv6]:port + Formát: IPv4:port / [IPv6]:port - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - Nepřijatelný typ souboru, pouze správnésoubory jsou povoleny. + + + Tracker authentication + Ověření trackeru - - Symlinks inside alternative UI folder are forbidden. - Symbolické linky jsou v alternativním UI zakázány. + + Tracker: + Tracker: - - Exceeded the maximum allowed file size (%1)! - Byla překročena maximální povolená velikost souboru (%1)! + + Login + Přihlášení - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - WebUI: Zdrojové záhlaví a cílový původ nesouhlasí! Zdrojová IP: '%1'. Původní záhlaví: '%2'. Cílový zdroj: '%3' + + Username: + Uživatelské jméno: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - WebUI: Záhlaví refereru a cílový původ nesouhlasí! Zdrojová IP: '%1'. Původní záhlaví: '%2'. Cílový zdroj: '%3' + + Password: + Heslo: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - WebUI: Neplatné záhlaví hostitele, nesoulad portů. Požadavek zdroje IP: '%1'. Serverový port: '%2'. Obdrženo záhlaví hostitele: '%3' + + Log in + Přihlásit se - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - WebUI: Neplatné záhlaví hostitele. Požadavek zdroje IP: '%1'. Obdrženo záhlaví hostitele: '%2' + + Cancel + Zrušit - WebUI + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + Potvrzení o smazání - qBittorrent + + + + Remember choice + Zapamatovat volbu + + + + Also delete the files on the hard disk + Smazat soubory také z pevného disku + + + + confirmShutdownDlg + + + Don't show again + + + + + createTorrentDialog + + + Cancel + Zrušit + + + + Torrent Creation Tool + Nástroj pro vytváření torrentů + + + + Torrent file creation + Vytvořit soubor torrentu + + + + Add file + Přidat soubor + + + + Add folder + Přidat adresář + + + + File or folder to add to the torrent: + Soubor nebo adresář pro přidání do torrentu: + + + + Tracker URLs: + URL trackeru: + + + + Web seeds urls: + URL webových zdrojů: + - - Web UI: HTTPS setup successful - Webové rozhraní: HTTPS nastaveno úspěšně + + Comment: + Komentář: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Skupiny trackerů můžete oddělit prázdným řádkem. + + + + Piece size: + Velikost části: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + Auto + + + + Private (won't be distributed on DHT network if enabled) + Soukromý (je-li zapnuto, nebude šířen na síti DHT) + + + + Start seeding after creation + Po vytvoření začít sdílet + + + + Ignore share ratio limits for this torrent + Ignorovat poměr sdílení pro tento torrent + + + + Create and save... + Vytvořit a uložit... + + + + Progress: + Průběh: + + + + downloadFromURL + + + Add torrent links + Přidat odkazy torrentů + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Jeden na řádek (podporované jsou HTTP, Magnet odkazy a info-haše) + + + + Download + Stahovat + + + + Cancel + Zrušit + + + + Download from urls + Stahovat z URL - - Web UI: HTTPS setup failed, fallback to HTTP - Web UI: Nastavení HTTPS selhalo, přecházím zpět na HTTP + + No URL entered + Nebylo vloženo žádné URL - - Web UI: Now listening on IP: %1, port: %2 - Webové rozhraní naslouchá na IP: %1, portu: %2 + + Please type at least one URL. + Prosím napište alespoň jedno URL. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Webové rozhraní: Nelze vázat na IP: % 1, port: % 2. Důvod: % 3 + + Crash info + Info o pádu fsutils - + + + + + Downloads Stahování @@ -9766,100 +8663,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) - PiB + - + EiB exbibytes (1024 pebibytes) - EiB + + + + + Python not detected + + + + + Python version: %1 + Verze Pythonu: %1 - + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1h %2m - + %1d %2h e.g: 2days 10hours %1d %2h - + Unknown Unknown (size) Neznámá - + qBittorrent will shutdown the computer now because all downloads are complete. - Jsou staženy všechny torrenty, qBittorrent nyní vypne počítač. + Protože jsou staženy všechny torrenty, qBittorrent nyní vypne počítač. - + < 1m < 1 minute < 1m - + %1m e.g: 10minutes %1m + + + Working + Funkční + + + + Updating... + Aktualizuji... + + + + Not working + Nefunkční + + + + Not contacted yet + Dosud nekontaktován + preview - + Preview selection Výběr náhledu - + The following files support previewing, please select one of them: Následující soubory podporují náhled, vyberte prosím jeden z nich: + + + Preview + Náhled + + + + Cancel + Zrušit + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_da.ts qbittorrent-3.3.15/src/lang/qbittorrent_da.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_da.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_da.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent Om qBittorrent - + About Om - + Author - Forfatter + Skaber - - Current maintainer - Nuværende vedligeholder + + + Nationality: + Nationalitet: - - Greece - Grækenland + + + Name: + Navn: - - - Nationality: - Nationalitet: + + + E-mail: + E-post: - - - E-mail: - E-mail: + + Greece + Grækenland - - - Name: - Navn: + + Current maintainer + Nuværende vedligeholder - + Original author Oprindelig forfatter - - France - Frankrig - - - + Special Thanks Særlig tak til - + Translators Oversættere - - License - Licens - - - + Libraries Biblioteker - + qBittorrent was built with the following libraries: - qBittorrent blev bygget med følgende biblioteker: - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - En avanceret BitTorrent-klient, programmeret in C++, baseret på Qt toolkit og libtorrent-rasterbar. - - - - Copyright %1 2006-2018 The qBittorrent project - Ophavsret %1 2006-2018 qBittorrent-projektet - - - - Home Page: - Hjemmeside: + Denne version af qBittorrent var bygget af følgende biblioteker: - - Forum: - Forum: + + France + Frankrig - - Bug Tracker: - Fejltracker: + + License + Licens @@ -115,74 +90,84 @@ Gem i - + + Browse... + Gennemse ... + + + + Set as default save path + Sæt som standard sti + + + Never show again Vis aldrig igen - + Torrent settings - Torrent-indstillinger + Torrent indstillinger - + Set as default category - Sæt som standardkategori + Sæt som standard sti - + Category: Kategori: - + Start torrent Start torrent - + Torrent information - Torrent-information + Torrent Information - + Skip hash check - Spring hashtjek over + Spring hash tjek over - + Size: Størrelse: - + Hash: Hash: - + Comment: Kommentar: - + Date: Dato: Torrent Management Mode: - Tilstand for torrent-håndtering: + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - Automatisk tilstand betyder at diverse torrent-egenskaber (f.eks. gemmesti) vil blive besluttet af den tilknyttede kategori + Manual - Manuelt + Manuel @@ -190,1508 +175,1172 @@ Automatisk - - Remember last used save path - Husk sidste anvendte gemmesti - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - Når den er tilvalgt, så slettes .torrent-filen ikke, ligegyldigt hvad indstillingen på "Download"-siden er sat til i indstillinger-dialogen + - + Do not delete .torrent file - Slet ikke .torrent-filen - - - - Create subfolder - Opret undermappe - - - - Download in sequential order - Download i rækkefølge + Slet ikke .torrent fil - - Download first and last pieces first - Start med at downloade første og sidste stykker - - - + Normal Normal - + High Høj - + Maximum - Højeste + Højest - + Do not download - Download ikke + Hent ikke - - - + + + I/O Error - I/O-fejl + I/O Fejl - + Invalid torrent Ugyldig torrent - - Renaming - Omdøbning - - - - - Rename error - Fejl ved omdøbning - - - - The name is empty or contains forbidden characters, please choose a different one. - Navnet er tomt eller indeholder forbudte tegn. Vælg venligst et andet. + + + + + Already in download list + Allerede i download listen - + Not Available This comment is unavailable Ikke tilgængelig - + Not Available This date is unavailable Ikke tilgængelig - + Not available Ikke tilgængelig - + Invalid magnet link - Ugyldigt magnet-link + Ugyldig magnet link - + The torrent file '%1' does not exist. - Torrent-filen '%1' findes ikke. + Torrent filen '%1' eksistere ikke. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. - Torrent-filen '%1' kan ikke læses fra disken. Du har muligvis ikke tilstrækkeligt med tilladelser. + Torrent filen '%1' kan ikke læses fra disken. Du har muligvis ikke de korrekte tilladelser. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' ' characters. They insert a newline. - Kunne ikke indlæse torrenten: %1. + Kunne ikke indlæse torrent: %1. Fejl: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torrent er allerede i download listen. Trackere blev ikke flettet fordi det er en privat torrent. + + + + Torrent is already in download list. Trackers were merged. + Torrent er allerede i download listen. Trackere blev flettet. + + + + + Cannot add torrent + Kan ikke tilføje torrent + + + + Cannot add this torrent. Perhaps it is already in adding state. + Kan ikke tilføje torrent. Den er måske i tilføjelses stadiet. + + + This magnet link was not recognized - Dette magnet-link blev ikke genkendt + Dette magnet link blev ikke genkendt + + + + Magnet link is already in download list. Trackers were merged. + Magnet link er allerede i download listen. Trackere blev flettet. + + + + Cannot add this torrent. Perhaps it is already in adding. + Kan ikke tilføje torrent. Den er måske i tilføjelses stadiet. - + Magnet link - Magnet-link + Magnet link - + Retrieving metadata... Modtager metadata... - + Not Available This size is unavailable. Ikke tilgængelig - + Free space on disk: %1 - Ledig plads på disk: %1 + Fri plads på disk: %1 - + + Choose save path - Vælg gemmesti - - - - - - - - - Torrent is already present - Torrent findes allerede - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - + Vælg destinationen - - Torrent is already queued for processing. - + + Rename the file + Omdøb filen - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + + New name: + Nyt navn: - - Magnet link is already queued for processing. - + + + The file could not be renamed + Filen kunne ikke omdøbes - - New name: - Nyt navn: + + This file name contains forbidden characters, please choose a different one. + Filnavnet indeholder forbudte tegn, vælg venligst nogle andre. - - + + This name is already in use in this folder. Please use a different name. - Navnet bruges allerede i denne mappe. Brug venligst et andet navn. + Navnet for denne mappe er allerede i brug. Vælg venligst et andet. - + The folder could not be renamed Mappen kunne ikke omdøbes - + Rename... Omdøb... - + Priority Prioritet - + Invalid metadata Ugyldig metadata - + Parsing metadata... - Fortolker metadata... + Behandler metadata... - + Metadata retrieval complete - Modtagelse af metadata er færdig + Metadata modtaget - + Download Error - Fejl ved download + Download Fejl AdvancedSettings - + + Disk write cache size + Disk skrivnings cache størrelse + + + MiB - MiB + MiB - + Outgoing ports (Min) [0: Disabled] - Udgående porte (Min.) [0: Deaktiveret] + Udgående port (Min) [0: Deaktiveret] - + Outgoing ports (Max) [0: Disabled] - Udgående porte (Maks.) [0: Deaktiveret] + Udgående port (Maks) [0: Deaktiveret] - + Recheck torrents on completion - Gentjek torrents når de er færdige + Tjek igen når torrent er færdig - + Transfer list refresh interval - Opdateringsinterval for overførselsliste + Overførelseslistens opdaterings interval - + ms milliseconds - ms + ms - + Setting Indstilling - + Value Value set for this setting Værdi - - - (disabled) - (deaktiveret) - - - + (auto) - (automatisk) - - - - min - minutes - min + (auto) - + All addresses - Alle adresser + All addresser - + qBittorrent Section - qBittorrent-sektion + qBittorrent Sektion - - + + Open documentation - Åbn dokumentation + Åben dokumentation - + libtorrent Section - libtorrent-sektion - - - - Asynchronous I/O threads - Asynkrone I/O-tråde - - - - Disk cache - Diskmellemlager + libtorrent Sektion - + s seconds - s + s - + Disk cache expiry interval - Udløbsinterval for diskmellemlager + Disk cache udløbs interval - + Enable OS cache - Aktivér OS-mellemlager - - - - Guided read cache - Guidet læsemellemlager - - - - Coalesce reads & writes - Coalesce-læsninger og -skrivninger - - - - Send upload piece suggestions - Send forslag for upload-styk - - - - - KiB - KiB - - - - Send buffer watermark - Send vandmærke for buffer - - - - Send buffer low watermark - Send vandmærke for lav buffer - - - - Send buffer watermark factor - Send vandmærkefaktor for buffer - - - - Prefer TCP - Foretræk TCP + Aktivere OS cache - - Peer proportional (throttles TCP) - Modpartsproportionel (drosler TCP) - - - - Allow multiple connections from the same IP address - Tillad flere forbindelser fra den samme IP-adresse + + m + minutes + m - + Resolve peer countries (GeoIP) - Oversæt modparters lande (GeoIP) + Oversæt peer lande (GeoIP) - + Resolve peer host names - Oversæt modparters værtsnavne + Oversæt peer host navn - + Strict super seeding - Streng super seeding + Super seeding tilstand - + Network Interface (requires restart) - Netværksgrænseflade (kræver genstart) + Netværks grænseflade (genstart kræves) - + Optional IP Address to bind to (requires restart) - Valgfri IP-adresse som der skal bindes til (kræver genstart) + Bind til alternativ IP addresse (genstart kræves) - + Listen on IPv6 address (requires restart) - Lyt på IPv6-adresse (kræver genstart) + Lyt efter IPv6 adresser (genstart kræves) - + Display notifications - Vis notifikationer + Notifikationer - + Display notifications for added torrents - Vis notifikationer for tilføjede torrents + Notifikationer for tilføjet torrents - + Download tracker's favicon - Download trackerens favicon - - - - Save path history length - Historiklængde for gemmesti - - - - Fixed slots - Fastgjorte pladser - - - - Upload rate based - Baseret på uploadhastighed - - - - Upload slots behavior - Opførsel for uploadpladser - - - - Round-robin - Round-robin - - - - Fastest upload - Hurtigste upload - - - - Anti-leech - Anti-leech - - - - Upload choking algorithm - Upload choking-algoritme + - + Confirm torrent recheck - Bekræft gentjek af torrent + Bekræft torrent gen-tjek. - - Confirm removal of all tags - Bekræft fjernelse af alle mærkater + Exchange trackers with other peers + Udveksle trackere med andre peers - - Always announce to all trackers in a tier - Annoncér altid til alle trackere i en tier + + Always announce to all trackers + Annoncere altid til alle trackere - - Always announce to all tiers - Annoncér altid til alle tiers - - - + Any interface i.e. Any network interface - Vilkårlig grænseflade + Alle grænseflader - + Save resume data interval How often the fastresume file is saved. - Gemmeinterval for genoptagelsesdata - - - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - %1-TCP blandet-tilstand-algoritme + - + Maximum number of half-open connections [0: Unlimited] - Maksimum antal halvt åbne forbindelser [0: Ubegrænset] + Maksimum antal af halvt åbne forbindelser [0: Ubegrænset] - + IP Address to report to trackers (requires restart) - IP-adresse der reporteres til tracker (kræver genstart) + IP Addresse der reporteres til tracker (genstart kræves) - + Enable embedded tracker - Aktivér indlejret tracker + Aktiver indlejret tracker - + Embedded tracker port - Indlejret tracker-port + Indlejret tracker port - + Check for software updates - Søg efter softwareopdateringer + Tjek for program opdateringer - + Use system icon theme - Brug systemets ikontema + Brug system ikon tema Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 startet - + Torrent: %1, running external program, command: %2 - Torrent: %1, kører eksternt program, kommando: %2 - - - - Torrent name: %1 - Torrentnavn: %1 - - - - Torrent size: %1 - Torrentstørrelse: %1 - - - - Save path: %1 - Gemmesti: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Torrenten blev downloadet på %1. - - - - Thank you for using qBittorrent. - Tak fordi du bruger qBittorrent. + Torrent: %1, køre eksternt program, kommando: %2 - - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' er færdig med at downloade + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrent: %1, kør eksternt program kommando for langt (length > %2), kunne ikke starte. - + Torrent: %1, sending mail notification - Torrent: %1, sender notifikation via e-mail + Torrent: %1, sender e-post notifikation - + Information Information - - To control qBittorrent, access the Web UI at %1 - Styr qBittorrent, ved at tilgå webgrænsefladen på %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + Kontrollere qBittorrent, tilgå Web UI via http://localhost:%1 - + The Web UI administrator user name is: %1 - Webgrænsefladens administratorens brugernavn er: %1 + Web UI administrator brugernavnet er. %1 - + The Web UI administrator password is still the default one: %1 - Webgrænsefladens administratorens adgangskode er stadig den som er standard: %1 + Web UI administrator adgangskoden er stadig standardkoden: %1 - + This is a security risk, please consider changing your password from program preferences. - Dette er en sikkerhedsrisiko, overvej venligst at skifte adgangskoden via programpræferencerne. + Dette er en sikkerhedsrisiko, overvej venligst at skifte adgangskoden via program indstillingerne. - + Saving torrent progress... - Gemmer torrentforløb... - - - - Portable mode and explicit profile directory options are mutually exclusive - Transportabeltilstand og eksplicitte valgmuligheder for profilmappe er gensidigt eksplicitte - - - - Portable mode implies relative fastresume - Transportabeltilstand indebærer relativ hurtig genoptagelse - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - Din IP-adresse er blevet udelukket efter for mange mislykkede godkendelsesforsøg. - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - + Gemmer torrent stadiet... AutomatedRssDownloader - + Save to: Gem i: RSS Downloader - RSS-downloader + RSS Downloader - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - Automatisk download af RSS-torrents er nu deaktiveret! Du kan aktivere det i programindstillingerne. + + Enable Automated RSS Downloader + Aktivere automatisk RSS downloader - + Download Rules - Downloadregler + Download regler - + Rule Definition - Regeldefinition + Regl Definition - + Use Regular Expressions Brug regulære udtryk - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - Smart episodefilter tjekker episodenummeret for at hindre download af duplikater. -Understøtter formaterne: S01E01, 1x1, 2017.01.01 og 01.01.2017 (datoformater understøtter også - som en separator) - - - - Use Smart Episode Filter - Brug smart episodefilter - - - + Must Contain: Skal indeholde: - + Must Not Contain: - Skal ikke indeholde: + Må ikke indeholde: - + Episode Filter: - Episodefilter: + Episode Filter: - + Assign Category: - Tildel kategori: + Tildel Kategori: - + Save to a Different Directory - Gem i en anden mappe + Alternativ gem lokation - + Ignore Subsequent Matches for (0 to Disable) ... X days - Ignorer efterfølgende match for (0 for at deaktivere) + - + Disabled - Deaktiveret + Frakoblet - + days - dage + dage - + Add Paused: - Tilføj sat på pause: + Tilføj pauset: - + Use global settings Brug globale indstillinger - + Always Altid - + Never Aldrig - + Apply Rule to Feeds: - Anvend regel på feeds: + Anvend regler på feeds: - + Matching RSS Articles - Matchende RSS-artikler + Matchende RSS elsementer - + &Import... - &Importér... + &Import... - + &Export... - &Eksportér... + &Eksport... - + Matches articles based on episode filter. - Matcher artikler baseret på episodefilter. + - + Example: - Eksempel: + Eksempel: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match - matcher episode 2, 5, 8 op til 15, 30 og videre for sæson 1 + - + Episode filter rules: - Regler for episodefilter: + Episode filter regler: - + Season number is a mandatory non-zero value - Sæsonnummer er en obligatorisk ikke-nul-værdi + - + Filter must end with semicolon - Filter skal slutte med semikolon + Filter skal ende med semikolon - + Three range types for episodes are supported: - Der understøttes tre områdetyper for episoder: + - + Single number: <b>1x25;</b> matches episode 25 of season one - Ét nummer: <b>1x25;</b> matcher episode 25 for sæson 1 + - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one - Normalt område: <b>1x25-40;</b> matcher episode 25 til 40 for sæson 1 + - + Episode number is a mandatory positive value - Episodenummer er en obligatorisk positiv værdi - - - - Rules - Regler - - - - Rules (legacy) - Regler (udgået) + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Uendeligt område: <b>1x25-;</b> matcher episode 25 og op for sæson 1 og alle episoder for senere sæsoner + - + Last Match: %1 days ago - Sidste match: %1 dage siden + Sidste Match: %1 dage siden. - + Last Match: Unknown - Sidste match: Ukendt + Sidst Match: Ukendt - + New rule name - Nyt regelnavn + Ny regl navn - + Please type the name of the new download rule. - Skriv venligst navnet på den nye downloadregel. + Skriv navnet på den nye download regl. - - + + Rule name conflict - Konflikt for regelnavn + Regl navn konflikt - - + + A rule with this name already exists, please choose another name. - Der findes allerede en regel med dette navn, vælg venligst et andet navn. + En regl med dette navn eksistere allerede, vælg et andet. - + Are you sure you want to remove the download rule named '%1'? - Er du sikker på, at du vil fjerne downloadreglen med navnet '%1'? + Er du sikker på at du vil fjerne download reglen %1? - + Are you sure you want to remove the selected download rules? - Er du sikker på, at du vil fjerne de valgte downloadregler? + Er du sikker på at du vil fjerne de valgte download regler? - + Rule deletion confirmation - Bekræftelse for sletning af regel + Regl sletning bekræftelse - + Destination directory - Destinationsmappe + Destinations mappe - + Invalid action Ugyldig handling - + The list is empty, there is nothing to export. - Listen er tom. Der er intet at eksportere. + Listen er tom, der er ikke noget at eksportere. - - Export RSS rules - Eksportér RSS-regler + + Where would you like to save the list? + Hvor vil du gemme listen? - - + + Rules list (*.rssrules) + Regl list (*.rssrules) + + + I/O Error - I/O-fejl + I/O Fejl - - Failed to create the destination file. Reason: %1 - Kunne ikke oprette destinationsfilen. Årsag: %1 + + Failed to create the destination file + Kunne ikke oprette destinationsfilen - - Import RSS rules - Importér RSS-regler + + Please point to the RSS download rules file + Navigere til RSS download regler filen - - Failed to open the file. Reason: %1 - Kunne ikke åbne filen. Årsag: %1 + + Rules list + Regl liste - + Import Error - Fejl ved import + Import Fejl - - Failed to import the selected rules file. Reason: %1 - Kunne ikke importere den valgte regelfil. Årsag: %1 + + Failed to import the selected rules file + Kunne ikke importere valgte regl fil - + Add new rule... - Tilføj ny regel... + Tilføj ny regl... - + Delete rule - Slet regel + Slet regl - + Rename rule... - Omdøb regel... + Omdøb regl... - + Delete selected rules Slet valgte regler - - Clear downloaded episodes... - Ryd downloadede episoder... - - - + Rule renaming - Omdøbning af regel + Omdøb regl - + Please type the new rule name - Skriv venligst det nye regelnavn - - - - Clear downloaded episodes - Ryd downloadede episoder + Skriv det nye regl navn - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - Er du sikker på, at du vil rydde listen over downloadede episoder for den valgte regel? + + Regex mode: use Perl-like regular expressions + Regex modus: brug Perl-like regelmæssige udtryk - - Regex mode: use Perl-compatible regular expressions - Regulært udtryk-tilstand: brug Perl-kompatible regulære udtryk - - - - - Position %1: %2 - Placering %1: %2 - - - + Wildcard mode: you can use - Jokertegnstilstand: du kan bruge + - + ? to match any single character - ? for at matche ét tegn + - + * to match zero or more of any characters - * for at matche nul eller flere tegn + - + Whitespaces count as AND operators (all words, any order) - Blanktegn tæller som OG-operatører (alle ord, vilkårlig rækkefølge) + - + | is used as OR operator - | bruges som en ELLER-operatør + - + If word order is important use * instead of whitespace. - Hvis rækkefølgen på ord er vigtig, så brug * i stedet for blanktegn. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Et udtryk med et tomt %1-klausul (f.eks. %2) + - + will match all articles. - vil matche alle artikler. + - + will exclude all articles. - vil ekskludere alle artikler. + - - - BanListOptionsDialog - - List of banned IP addresses - Liste med udelukkede IP-adresser + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Wildcard-tilstand: Du kan bruge <ul> <li>? til at matche et enkelt tegn </ li> <li> * at matche nul eller flere af ethvert tegn </ li> <li> blanke tæller som og operatørerne </ li> </ ul> - - Ban IP - Udeluk IP + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Wildcard-tilstand: Du kan bruge <ul> <li>? til at matche et enkelt tegn </ li> <li> * at matche nul eller flere tegn </ li> <li> | bruges som OR operator </ li> </ ul> + + + BitTorrent::Session - - Delete - Slet + + Restart is required to toggle PeX support + Genstart kræves for at aktivere PeX support - - - Warning - Advarsel + + Embedded Tracker [ON] + Indlejret Tracker [TIL] - - The entered IP address is invalid. - Den indtastede IP-adresse er ugyldig. + + Failed to start the embedded tracker! + Kunne ikke starte den indlejret tracker! - - The entered IP is already banned. - Den indtastede IP er allerede udelukket. - - - - BitTorrent::Session - - - Restart is required to toggle PeX support - Genstart kræves for at slå understøttelse af PeX til/fra - - - - Could not get GUID of configured network interface. Binding to IP %1 - Kunne ikke få GUID af konfigureret netværksgrænseflade. Binder til IP %1 - - - - Embedded Tracker [ON] - Indlejret tracker [TIL] + + Embedded Tracker [OFF] + Indlejret Tracker [FRA] - - Failed to start the embedded tracker! - Kunne ikke starte den indlejret tracker! + + '%1' reached the maximum ratio you set. Removing... + '%1' nåede den maksimale ratio du har sat. Fjerner... - - Embedded Tracker [OFF] - Indlejret tracker [FRA] + + '%1' reached the maximum ratio you set. Pausing... + '%1' nåede den maksimale ratio du har sat. Pauser... - + System network status changed to %1 e.g: System network status changed to ONLINE - Systemets netværksstatus ændret til %1 + Systemets netværks status ændret til %1 - + ONLINE ONLINE - + OFFLINE OFFLINE - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding - Netværkskonfiguration af %1 er blevet ændret, genopfrisker sessionsbinding + - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. - Konfigureret netværksgrænsefladeadresse %1 er ikke gyldig. + - - + Encryption support [%1] - Understøttelse af kryptering [%1] + Krypteringsunderstøttelse [%1] - - + FORCED - TVUNGET - - - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 er ikke en gyldig IP-adresse og blev afvist under anvendelse af listen over udelukkede adresser. + - - + Anonymous mode [%1] - Anonym tilstand [%1] + - + Unable to decode '%1' torrent file. - Kan ikke dekode '%1' torrent-fil. + Kan ikke dekode %1 torrent fil. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' - Rekursiv download af filen '%1' indlejret i torrent '%2' + Rekursiv download af filen %1 indlejret i torrent %2 - + Queue positions were corrected in %1 resume files - Køplaceringer blev rettet i %1 resume-filer + - + Couldn't save '%1.torrent' Kunne ikke gemme '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' blev fjernet fra overførselslisten. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' blev fjernet fra overførselslisten og harddisken. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '%1' blev fjernet fra overførselslisten men filerne kunne ikke slettes. Fejl: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. - fordi %1 er deaktiveret. + Fordi %1 er deaktiveret. - + because %1 is disabled. this peer was blocked because TCP is disabled. - fordi %1 er deaktiveret. + Fordi %1 er deaktiveret. - + URL seed lookup failed for URL: '%1', message: %2 - Opslaf af URL-seed mislykkedes for URL: '%1', meddelelse: %2 + Url seed lookup fejlede for url: %1, besked: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. - qBittorrent kunne ikke lytte på grænseflade %1 port: %2/%3. Årsag: %4. + qBittorrent fejl i lytning på grænseflade %1 port: %2/%3. +Årsag: %4 + + + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' blev fjernet fra listen og harddisken. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' blev fjernet fra listen. - + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... - Downloader '%1', vent venligst... + Henter %1', vent venligst... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 - qBittorrent forsøger at lytte på en vilkårlig grænsefladeport: %1 + - + The network interface defined is invalid: %1 - Den angivne netværksgrænseflade er ugyldig: %1 + Den valgte netværksgrænseflade er ugyldig: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent forsøger at lytte på grænseflade %1 port: %2 - - Peer ID: - Modparts-ID: - - - - HTTP User-Agent is '%1' - HTTP User-Agent er '%1' - - - - + DHT support [%1] - Understøttelse af DHT [%1] + DHT-understøttelse [%1] - - - - - - - - - + + + + ON - TIL + - - - - - - - - - + + + + OFF - FRA + - - + Local Peer Discovery support [%1] - Understøttelse af lokal modpartsopdagelse [%1] - - - - PeX support [%1] - Understøttelse af PeX [%1] - - - - '%1' reached the maximum ratio you set. Removed. - '%1' nåede det maksimale forhold som du har sat. Fjernet. + Understøttelse af lokal modpartsregistrering [%1] - - '%1' reached the maximum ratio you set. Paused. - '%1' nåede det maksimale forhold som du har sat. Sat på pause. - - - - '%1' reached the maximum seeding time you set. Removed. - '%1' nåede den maksimale seedingtid som du har sat. Fjernet. - - - - '%1' reached the maximum seeding time you set. Paused. - '%1' nåede den maksimale seedingtid som du har sat. Sat på pause. - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on - qBittorrent fandt ikke en lokal %1-adresse at lytte på + qBittorrent fandt ikke en %1 lokal adresse at lytte på - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface - qBittorrent kunne ikke lytte på vilkårlig grænsefladeport: %1. Årsag: %2. + - + Tracker '%1' was added to torrent '%2' Tracker '%1' blev tilføjet til torrent '%2' - + Tracker '%1' was deleted from torrent '%2' Tracker '%1' blev slettet fra torrent '%2' - + URL seed '%1' was added to torrent '%2' - URL-seed '%1' blev tilføjet til torrent '%2' + URL seed '%1' blev tilføjet til torrent '%2' - + URL seed '%1' was removed from torrent '%2' - URL-seed '%1' blev fjernet fra torrent '%2' + URL seed '%1' blev fjernet fra torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. - Kan ikke genoptage torrent '%1'. + Kunne ikke starte torrent '%1'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - Behandling af angivne IP-filter lykkedes: %1 regler blev anvendt. + - + Error: Failed to parse the provided IP filter. - Fejl: Kunne ikke behandle det angivne IP-filter. - - - - '%1' restored. - 'torrent name' restored. - '%1' gendannet. + - + Couldn't add torrent. Reason: %1 Kunne ikke tilføje torrent. Årsag: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' fortsat. (hurtig fortsættelse) + + + '%1' added to download list. 'torrent name' was added to download list. - '%1' tilføjet til downloadlisten. + '%1' tilføjet til download listen. - + An I/O error occurred, '%1' paused. %2 - En I/O-fejl er opstået, '%1' sat på pause. %2 + En I/O fejl er opstået, '%1' pauset. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 - UPnP/NAT-PMP: Fejl ved kortlægning af port, meddelelse: %1 + UPnP/NAT-PMP: Port mapping fejlede, besked: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 - UPnP/NAT-PMP: Kortlægning af port lykkedes, meddelelse: %1 + UPnP/NAT-PMP: Port mapping lykkedes, besked: %1 - + due to IP filter. this peer was blocked due to ip filter. - pga. IP-filter. + - + due to port filter. this peer was blocked due to port filter. - pga. port-filter. + - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. - pga. restriktioner i i2p blandet-tilstand. + - + because it has a low port. this peer was blocked because it has a low port. - fordi den har en lav port. + Fordi porten er lav. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 - qBittorrent lytter på grænseflade %1 port: %2/%3 + qBittorrent lytter succesfuldt på grænseflade %1 port: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 Ekstern IP: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - oprettelse af torrent-fil mislykkedes - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - Start med at downloade første og sidste stykker: %1, torrent: '%2' - - - - On - Tændt - - - - Off - Slukket - - - - Successfully moved torrent: %1. New path: %2 - Flyttede torrent: %1. Ny sti: %2 - - - + Could not move torrent: '%1'. Reason: %2 Kunne ikke flytte torrent: '%1'. Årsag: %2 - + File sizes mismatch for torrent '%1', pausing it. - Filstørrelser matcher ikke for torrent '%1', pauser den. + Filstørrelse mismatch for torrent %1, pauser den. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - Hurtig genoptagelsesdata blev afvist for torrent '%1'. Årsag: %2. Tjekker igen... + Hurtig genoptag blev nægtet for torrent '%1'. Årsag: %2. Tjekker igen... CategoryFilterModel - + Categories - Kategorier + Kategorier - + All - Alle + Alle - + Uncategorized - Ukategoriseret + @@ -1699,42 +1348,139 @@ Add category... - Tilføj kategori... + Tilføj kategori... Add subcategory... - Tilføj underkategori... + - Edit category... - Rediger kategori... + Remove category + Fjern kategori + + + + Remove unused categories + Fjern ubrugte kategorier + + + + Resume torrents + Genoptag torrents + + + + Pause torrents + Pause torrents + + + + Delete torrents + Slet torrents + + + + New Category + + + + + Category: + Kategori: + + + + Invalid category name + Ugyldig kategori navn + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Kategorinavn må ikke indeholde »\«. +Kategorinavn må ikke starte/slutte med »/«. +Kategorinavn må ikke indeholde »//«-sekvens. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Alle (0) + + + Uncategorized (0) + Ukategoriseret (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Ukategoriseret (%1) + + + Add category... + Tilføj kategori... - Remove category - Fjern kategori + Fjern kategori - Remove unused categories - Fjern ubrugte kategorier + Fjern ubrugte kategorier - Resume torrents - Genoptag torrents + Genoptag torrents - Pause torrents - Sæt torrents på pause + Pause torrents - Delete torrents - Slet torrents + Slet torrents + + + New Category + Ny Kategori + + + Category: + Kategori: + + + Invalid category name + Ugyldig kategori navn + + + All (%1) + this is for the category filter + Alle (%1) @@ -1742,7 +1488,7 @@ Manage Cookies - Håndter cookies + Administrer cookies... @@ -1774,617 +1520,574 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Bekræftelse for sletning - - - - Remember choice - Husk valg - - - - Also delete the files on the hard disk - Slet også filerne på harddisken - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - Er du sikker på, at du vil slette '%1' fra overførselslisten? + Er du sikker på at du vil slette "%1" fra overførelseslisten? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - Er du sikker på, at du vil slette disse %1 torrents fra overførselslisten? - - - - DownloadFromURLDialog - - - Download from URLs - Download fra URL'er - - - - Add torrent links - Tilføj torrent-links - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - Ét link pr. linje (understøtter HTTP-links, magnet-links og info-hashes) - - - - Download - Download - - - - No URL entered - Der er ikke indtastet nogen URL - - - - Please type at least one URL. - Skriv venligst mindst én URL. + Er du sikker på du vil slette disse %1 torrents fra overførelseslisten? DownloadedPiecesBar - + White: Missing pieces - Hvid: Manglende stykker + - + Green: Partial pieces - Grøn: Delvise stykker + - + Blue: Completed pieces - Blå: Komplette stykker + - ExecutionLogWidget + ExecutionLog - + General - Generelt + Generalt - + Blocked IPs - Blokerede IP'er + Blokeret IP'er - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked <font color='red'>%1</font> blev blokeret %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - + <font color='red'>%1</font> blev bannet FeedListWidget - + RSS feeds - RSS-feeds + RSS feeds - - - Unread (%1) - Ulæst (%1) + + Unread + Ulæst FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - Der opstod en fejl ved forsøg på at åbne logfilen. Logning til fil er deaktiveret. - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - &Gennemse... - - - - Choose a file - Caption for file open/save dialog - Vælg en fil - - - - Choose a folder - Caption for directory open dialog - Vælg en mappe - - - - Any file - Alle filer + + An error occured while trying to open the log file. Logging to file is disabled. + Der opstod en fejl under forsøg på at åbne logfilen. Logning til filen er deaktiveret. FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - I/O-fejl: Kunne ikke åbne IP-filterfil i læsetilstand. - - - - - - IP filter line %1 is malformed. - IP-filterets linje %1 er udformeret forkert. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - IP-filterets linje %1 er udformeret forkert. Områdets start-IP er udformeret forkert. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - IP-filterets linje %1 er udformeret forkert. Områdets slut-IP er udformeret forkert. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - IP-filterets linje %1 er udformeret forkert. En IP er IPv4 og den anden er IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - IP-filter-undtagelse smidt for linje %1. Undtagelsen er: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - %1 ekstra IP-filter fortolkningsfejl opstod. + + + + I/O Error: Could not open ip filter file in read mode. + I/O-fejl: Kunne ikke åbne ip-filterfilen i læse-tilstand. - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. - Fejl ved fortolkning: Filterfilen er ikke en gyldig PeerGuardian P2B-fil. + Fortolkningsfejl: Filterfilen er ikke en gyldig PeerGuardian P2B-fil. GeoIPDatabase - - + + Unsupported database file size. - Databasens filstørrelse understøttes ikke. + Filstørrelsen for databasen er ikke understøttet. - + Metadata error: '%1' entry not found. - Fejl ved metadata: '%1'-elementet blev ikke fundet. + Metadata-fejl: »%1«-elementet blev ikke fundet. - + Metadata error: '%1' entry has invalid type. - Fejl ved metadata: '%1'-elementet har ugyldig type. + Metadata-fejl: »%1«-elementet har ugyldig type. - + Unsupported database version: %1.%2 - Databaseversionen understøttes ikke: %1.%2 + Databaseversionen er ikke understøttet: %1.%2 - + Unsupported IP version: %1 - IP-version understøttes ikke: %1 + IP-version er ikke understøttet: %1 - + Unsupported record size: %1 - Record-størrelse understøttes ikke: %1 + Elementstørrelse er ikke understøttet: %1 - + Invalid database type: %1 Ugyldig databasetype: %1 - + Database corrupted: no data section found. Databasen er ødelagt: intet dataafsnit blev fundet. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - Http-forespørgselsstørrelse overstiger begrænsning. Lukke sokkel. Grænse: %ld, IP: %s + + File + Fil - - Bad Http request, closing socket. IP: %s - Dårlig Http-anmodning, lukker sokkel. IP: %s + + Edit + Rediger - - - HttpServer - + + Help + Hjælp + + + Exit qBittorrent - Afslut qBittorrent + Luk qBittorrent - + Only one link per line - Kun ét link pr. linje + Kun et link per linje - + + Download + Download + + + Global upload rate limit must be greater than 0 or disabled. - Global grænse for uploadhastighed skal være større end 0 eller deaktiveret. + Global uploadhastighed skal være større end 0 eller deaktiveret. - + Global download rate limit must be greater than 0 or disabled. - Global grænse for downloadhastighed skal være større end 0 eller deaktiveret. + Global downloadhastighed skal være større end 0 eller deaktiveret. - + Alternative upload rate limit must be greater than 0 or disabled. - Alternativ grænse for uploadhastighed skal være større end 0 eller deaktiveret. + Alternativ uploadhastighed skal være større end 0 eller deaktiveret. - + Alternative download rate limit must be greater than 0 or disabled. - Alternativ grænse for downloadhastighed skal være større end 0 eller deaktiveret. + Alternativ downloadhastighed skal være større end 0 eller deaktiveret. - + Maximum active downloads must be greater than -1. Maksimum aktive downloads skal være større end -1. - + Maximum active uploads must be greater than -1. Maksimum aktive uploads skal være større end -1. - + Maximum active torrents must be greater than -1. Maksimum aktive torrents skal være større end -1. - + Maximum number of connections limit must be greater than 0 or disabled. - Grænsen for det maksimale antal forbindelser skal være større end 0 eller deaktiveret. + Grænsen for det maksimale antal forbindelser skal være større end 0 eller slået fra. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. - Grænsen for det maksimale antal forbindelser pr. torrent skal være større end 0 eller deaktiveret. + Grænsen for det maksimale antal forbindelser per torrent skal være større end 0 eller slået fra. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. - Grænsen for det maksimale antal uploadpladser pr. torrent skal være større end 0 eller deaktiveret. + Grænsen for det maksimale antal upload slots per torrent skal være større end 0 eller slået fra. - + Unable to save program preferences, qBittorrent is probably unreachable. - Kan ikke gemme programpræferencer, qBittorrent er formodentligt ikke til at få kontakt med. + Kunne ikke gemme program indstillinger, qBittorrent kan sikkert ikke nåes. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent på Freenode + + Language + Sprog - - Invalid category name: -Please do not use any special characters in the category name. - Ugyldigt kategorinavn: -Brug venligst ikke nogen specialtegn i kategorinavnet. - - - - Unknown - Ukendt - - - - Hard Disk - Harddisk - - - - Share ratio limit must be between 0 and 9998. - Grænsen for deleforhold skal være mellem 0 og 9998. - - - - Seeding time limit must be between 0 and 525600 minutes. - Grænsen for seedingtid skal være mellem 0 og 525600 minutter. - - - + The port used for incoming connections must be between 1 and 65535. - Porten der bruges til indgående forbindelser skal være mellem 1 og 65535. + Porten til indgående forbindelser skal være mellem 1 og 65535. - + The port used for the Web UI must be between 1 and 65535. - Porten der bruges til webgrænsefladen skal være mellem 1 og 65535. + Porten der bruges til Web UI skal være mellem 1 og 65535. - + Unable to log in, qBittorrent is probably unreachable. - Kan ikke logge ind, qBittorrent er formodentligt ikke til at få kontakt med. + Kan ikke logge ind, qBittorent kan sandsynligvis ikke nås. - + Invalid Username or Password. - Ugyldigt brugernavn eller adgangskode. + Ugyldig brugernavn og adgangskode. - - Username - Brugernavn - - - + Password - Adgangskode + Adgangskode: - + Login Login - + + Upload Failed! + Overførsel mislykkedes! + + + Original authors - Oprindelige forfattere + Oprindelig forfatter - + + Upload limit: + Send-begrænsning: + + + + Download limit: + Hent-begrænsning: + + + Apply Anvend - + Add Tilføj - + + Category: + Kategori: + + + Upload Torrents Upload torrent files to qBittorent using WebUI - Upload torrents + Overfør Torrenter - + + All + Alle + + + + Downloading + Downloader + + + + Seeding + Seeder + + + + Completed + Færdig + + + + Resumed + Genoptag + + + + Paused + Pauset + + + + Active + Aktive + + + + Inactive + Inaktive + + + Save files to location: - Gem filer i: + Gem .torrents i: - + Cookie: Cookie: - + Type folder here Skriv mappe her - + + Run an external program on torrent completion + Kør et program når en torrent er færdig + + + + Enable bandwidth management (uTP) + Aktiver båndbreddehåndtering (uTP) + + + + Apply rate limit to uTP connections + Hastighedsbegrænsning for uTP forbindelser + + + + Alternative Global Rate Limits + Alternative Globale hastighedsbegrænsninger + + + More information Mere information - + Information about certificates Information om certifikater - + Save Files to Gem filer i - - Set location - Sæt placering - - - - Limit upload rate - Begræns uploadhastighed + + Watch Folder + Overvåg mappe - - Limit download rate - Begræns downloadhastighed + + Default Folder + Standard mappe - - Rename torrent - Omdøb torrent + + from + from time1 to time2 + Fra - - Unable to create category - + + to + from time1 to time2 + til - + Other... Save Files to: Watch Folder / Default Folder / Other... Andet... - + + Every day + Schedule the use of alternative rate limits on ... + Hver dag + + + + Week days + Schedule the use of alternative rate limits on ... + Hverdage + + + + Week ends + Schedule the use of alternative rate limits on ... + Weekend + + + Monday Schedule the use of alternative rate limits on ... Mandag - + Tuesday Schedule the use of alternative rate limits on ... Tirsdag - + Wednesday Schedule the use of alternative rate limits on ... Onsdag - + Thursday Schedule the use of alternative rate limits on ... Torsdag - + Friday Schedule the use of alternative rate limits on ... Fredag - + Saturday Schedule the use of alternative rate limits on ... Lørdag - + Sunday Schedule the use of alternative rate limits on ... Søndag - + + Downloaded + Is the file downloaded or not? + Hentet + + + Logout Log ud - + + Download from URLs + Hent fra URL(er) + + + Download Torrents from their URLs or Magnet links - Download torrents fra deres URL'er eller Magnet-links + Hent torrenter fra deres adresser eller Magnethenvisninger - + Upload local torrent - Upload lokal torrent + Overfør lokal torrent - + Are you sure you want to delete the selected torrents from the transfer list? - Er du sikker på, at du vil slette de valgte torrents fra overførselslisten? + Er du sikker på, at du ønsker at slette de valgte torrenter fra overførselslisten? - + Save Gem - + qBittorrent client is not reachable - qBittorrent-klienten kan ikke kontaktes - - - - qBittorrent has been shutdown. - qBittorrent er blevet lukket ned. + qBittorrent klienten kunne ikke nås - - - IPSubnetWhitelistOptionsDialog - - List of whitelisted IP subnets - Liste over hvidlistede IP-undernet + + HTTP Server + HTTP Server - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Eksempel: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Følgende parametre er understøttet: - - Add subnet - Tilføj undernet + + Torrent path + Torrent sti - - Delete - Slet + + Torrent name + Torrent navn - - Error - Fejl + + qBittorrent has been shutdown. + qBittorrent er blevet afsluttet. + + + LineEdit - - The entered subnet is invalid. - Det indtastede undernet er ugyldigt. + + Clear the text + Ryd teksten LogListWidget - + Copy - Kopiér + Kopier - + Clear Ryd @@ -2414,714 +2117,652 @@ On Downloads &Done - Når downloads er &færdige + - + &View &Vis - + &Options... &Indstillinger... - + &Resume &Genoptag - + Torrent &Creator - Torrent&opretter + - + Set Upload Limit... - Sæt grænse for upload... + Sæt upload begrænsning... - + Set Download Limit... - Sæt grænse for download... + Sæt download begrænsning... - + Set Global Download Limit... - Sæt global grænse for download... + Sæt global download begrænsning... - + Set Global Upload Limit... - Sæt global grænse for upload... + Sæt global upload begrænsning... - + Minimum Priority - Laveste prioritet + Minimum prioritet - + Top Priority - Højeste prioritet + Topprioritet - + Decrease Priority - Lavere prioritet + Sænk prioritet - + Increase Priority - Højere prioritet + Øg prioritet - - + + Alternative Speed Limits - Alternative grænser for hastighed + Alternative hastighedsgrænser - + &Top Toolbar &Øverste værktøjslinje - + Display Top Toolbar Vis øverste værktøjslinje - - Status &Bar - Status&linje - - - + S&peed in Title Bar &Hastighed i titellinjen - + Show Transfer Speed in Title Bar Vis overførselshastighed i titellinjen - + &RSS Reader - &RSS-læser + &RSS læser - + Search &Engine Søge&motor - + L&ock qBittorrent L&ås qBittorrent - + Do&nate! - Do&nér! - - - - Close Window - Luk vindue + &Doner! - + R&esume All - G&enoptag alle + G&enoptag Alle - + Manage Cookies... - Håndter cookies... + Håndter cookier ... - + Manage stored network cookies - Håndter opbevarede netværkscookies + Håndter lagrede netværkscookier - + Normal Messages - Normale meddelelser + Normale beskeder - + Information Messages - Informationsmeddelelser + Informationsbeskeder - + Warning Messages - Advarselsmeddelelser + Advarselsbeskeder - + Critical Messages - Kritiske meddelelser + Kritiske beskeder - + &Log &Log - + &Exit qBittorrent - &Afslut qBittorrent + &Luk qBittorrent - + &Suspend System - &Hviletilstand + &Sæt system i dvale - + &Hibernate System - &Dvaletilstand + Sæt system i &hvile - + S&hutdown System - &Luk ned + &Luk system ned - + &Disabled &Deaktiveret - + &Statistics - &Statistik + &Statestikker - + Check for Updates - Søg efter opdateringer + Tjek for opdateringer - + Check for Program Updates - Søg efter programopdateringer + Tjek for program opdateringer - + &About &Om - + &Pause - Sæt på &pause + &Pause - + &Delete &Slet - + P&ause All - Sæt alle på p&ause + P&ause Alle - + &Add Torrent File... - &Tilføj torrent-fil... + &Tilføj torrent fil... - + Open - Åbn + Åben - + E&xit - &Afslut + L&uk - + Open URL - Åbn URL + Åbn adresse - + &Documentation &Dokumentation - + Lock Lås - - - + + + Show Vis - + Check for program updates - Søg efter programopdateringer + Tjek for program opdateringer - + Add Torrent &Link... - Tilføj torrent-&link... + Tilføj Torrent&henvisning ... - + If you like qBittorrent, please donate! - Hvis du kan lide qBittorrent, så donér venligst! + Hvis du kan lide qBittorrent, donér venligst! - - + Execution Log - Eksekveringslog + Eksekveret Log - + Clear the password - Ryd adgangskoden + Ryd adgangskode - + Filter torrent list... - Filtrér torrentliste... + Filtrer torrentliste ... - + &Set Password &Set adgangskode - - Preferences - Præferencer - - - + &Clear Password &Ryd adgangskode - + Transfers - Overførsler + Overførelser - - - qBittorrent is minimized to tray - qBittorrent er minimeret til bakke - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association - Filtilknytning for torrent + Torrent fil tilknyttelse - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? - qBittorrent er ikke standardprogrammet til åbning af torrent-filer eller magnet-links. -Vil du tilknytte qBittorrent til torrent-filer og magnet-links? + qBittorrent er ikke standard programmet til åbning af torrent filer eller magnet links. +Vil du tilknytte qBittorrent til torrent filer og Magnet links? - + Icons Only Kun ikoner - + Text Only Kun tekst - + Text Alongside Icons Tekst ved siden af ikoner - + Text Under Icons Tekst under ikoner - + Follow System Style - Følg systemets stil + Følg systemstil - - - + + + UI lock password - Brugerfladens låseadgangskode + Brugerflade låsekode - - - + + + Please type the UI lock password: - Skriv venligst brugerfladens låseadgangskode: + Indtast brugerfladens låsekode: - + The password should contain at least 3 characters - Adgangskoden skal indeholde mindst 3 tegn + Adgangskoden bør indeholde mindst 3 bogstaver - + Password update - Opdatering af adgangskode + Opdater adgangskode - + The UI lock password has been successfully updated - Brugerfladens låseadgangskode er blevet opdateret + Brugerfladens låsekode blev opdateret - + Are you sure you want to clear the password? - Er du sikker på, at du vil rydde adgangskoden? - - - - Use regular expressions - + Er du sikker på at du vil rydde adgangskoden? - + Search Søg - + Transfers (%1) - Overførsler (%1) + Overførelser (%1) - + Error Fejl - + Failed to add torrent: %1 Kunne ikke tilføje torrent: %1 - + Torrent added Torrent tilføjet - + '%1' was added. e.g: xxx.avi was added. - '%1' blev tilføjet. + »%1« blev tilføjet. - + Download completion - Download er færdig + Download færdig - + I/O Error i.e: Input/Output Error - I/O-fejl + I/O Fejl - + Recursive download confirmation - Bekræftelse for rekursiv download + Rekursiv download bekræftet - + Yes Ja - + No Nej - + Never Aldrig - + Global Upload Speed Limit - Global grænse for uploadhastighed + Global Upload hastighedsbegrænsning - + Global Download Speed Limit - Global grænse for downloadhastighed - - - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent er lige blevet opdateret og skal genstartes før ændringerne træder i kraft. - - - - qBittorrent is closed to tray - + Global Download hastighedsbegrænsning - - Some files are currently transferring. - Nogle filer er ved at blive overført. - - - - Are you sure you want to quit qBittorrent? - Er du sikker på, at du vil afslutte qBittorrent? - - - + &No &Nej - + &Yes &Ja - + &Always Yes - &Altid ja - - - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - + &Altid Ja - + Old Python Interpreter - Gammel Python-fortolker + Gammel Pythonfortolker - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - Din Python-version (%1) er forældet. Opgrader venligst til seneste version så søgemotorerne kan virke. -Minimumskrav: 2.7.9/3.3.0. + Din Pythonversion (%1) er forældet. Opgrader venligst til seneste version så søgemotorerne fungerer. +Den ældste anvendelige version er: 2.7.9 / 3.3.0. - + qBittorrent Update Available - Der findes en opdatering til qBittorrent + qBittorrent-opdatering er tilgængelig + + + + A new version is available. +Do you want to download %1? + En ny version er tilgængelig. +Vil du hente den %1? - + Already Using the Latest qBittorrent Version - Bruger allerede den seneste qBittorrent-version + Bruger Allerede den Seneste qBittorrent Version - + Undetermined Python version - Kunne ikke fastslå Python-version + Pythonversion kunne ikke afklares - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. - '%1' er færdig med at downloade. + %1 er færdig med at hente. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. Reason: disk is full. - En I/O-fejl er opstået for torrenten '%1'. - Årsag: %2 + En I/O fejl er opstået for denne torrent %1 +Årsag: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? - Torrenten '%1' indeholder torrent-filer, vil du fortsætte deres download? + Torrenten %1 indeholder torrent filer, vil du foresætte med deres download? - + Couldn't download file at URL '%1', reason: %2. - Kunne ikke downloade filen fra URL'en '%1', årsag: %2. + Kunne ikke downloade filen via URL %1, årsag: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - Python fundet i %1: %2 + Python fundet i %1:%2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + Kunne ikke afklare din Pythonversion (%1). Søgemotor er deaktiveret. + + + + Missing Python Interpreter - Manglende Python-fortolker + Mangler Python fortolker - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? - Python kræves for at bruge søgemotoren, men lader ikke til at være installeret. + Python er krævet for at bruge søgemotoren, men lader ikke til at være installeret. Vil du installere den nu? - + Python is required to use the search engine but it does not seem to be installed. - Python kræves for at bruge søgemotoren, men lader ikke til at være installeret. - - - - A new version is available. - Der findes en ny version. - - - - Do you want to download %1? - Vil du downloade %1? - - - - Open changelog... - Åbn ændringslog... + Python er krævet for at bruge søgemotoren, men lader ikke til at være installeret. - + No updates available. You are already using the latest version. - Der findes ingen opdateringer. + Ingen opdateringer er tilgængelige. Du bruger allerede den seneste version. - + &Check for Updates - &Søg efter opdateringer + &Kontroller om der er opdateringer - + Checking for Updates... - Søger efter opdateringer... + Kontrollerer om der er opdateringer ... - + Already checking for program updates in the background - Søger allerede efter programopdateringer i baggrunden + Tjekker allerede for program opdateringer i baggrunden - + Python found in '%1' - Python fundet i '%1' + Python fundet i »%1« - + Download error - Fejl ved download + Download fejl - + Python setup could not be downloaded, reason: %1. Please install it manually. - Python-opsætning kunne ikke downloades, årsag: %1. -Installer den venligst manuelt. + Python kunne ikke hentes pga: %1. +Installer venligst manuelt. - - + + Invalid password Ugyldig adgangskode - - - + + RSS (%1) RSS (%1) - + URL download error - Fejl ved URL-download + URL-overførselsfejl - + The password is invalid Adgangskoden er ugyldig - - + + DL speed: %1 e.g: Download speed: 10 KiB/s - Downloadhastighed: %1 + Henter: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s - Uploadhastighed: %1 + Sender: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version - [D: %1/s, U: %2/s] qBittorrent %3 + [H: %1/s, S: %2/s] qBittorrent %3 - + Hide Skjul - + Exiting qBittorrent - Afslutter qBittorrent + Luk qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Der er igangværende overførelser. +Er du sikker på at du vil afslutte qBittorrent? + + + Open Torrent Files - Åbn torrent-filer + Åben Torrent Filer - + Torrent Files - Torrent-filer + Torrent Filer - + Options were saved successfully. Indstillinger blev gemt. @@ -3129,3405 +2770,3036 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. - Din dynamiske DNS blev opdateret. + Din dynamiske DNS blev opdateret successfuldt. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. - Fejl med dynamisk DNS: Tjenesten er midlertidig utilgængelig, der prøves igen om 30 minutter. + Dynamiske DNS fejl: Servicen er midlertidig utilgængelig, der prøves igen om 30 minutter. - + Dynamic DNS error: hostname supplied does not exist under specified account. - Fejl med dynamisk DNS: angivne værtsnavn findes ikke på denne konto. + Dynamiske DNS fejl: Indtastet hostnavn eksistere ikke på denne konto. - + Dynamic DNS error: Invalid username/password. - Fejl med dynamisk DNS: Ugyldig brugernavn/adgangskode. + Dynamiske DNS fejl: Ugyldig brugernavn/adgangskode. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. - Fejl med dynamisk DNS: qBittorrent blev sortlistet af tjenesten. Rapportér venligst en fejl på http://bugs.qbittorrent.org. + Dynamiske DNS fejl: qBittorrent blev sortlistet af servicen, rapportere en fejl på http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. - Fejl med dynamisk DNS: %1 blev returneret af tjenesten. Rapportér venligst en fejl på http://bugs.qbittorrent.org. + Dynamiske DNS fejl: %1 blev returneret af servicen, rapportere en fejl på http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. - Fejl med dynamisk DNS: Dit brugernavn blev blokeret pga. misbrug. + Dynamiske DNS fejl: Dit brugernavn blev blokeret pga. misbrug. - + Dynamic DNS error: supplied domain name is invalid. - Fejl med dynamisk DNS: angivne domænenavn er ugyldigt. + Dynamiske DNS fejl: Ugyldigt domænenavn. - + Dynamic DNS error: supplied username is too short. - Fejl med dynamisk DNS: angivne brugernavn er for kort. + Dynamisk DNS-fejl: angivet brugernavn er for kort. - + Dynamic DNS error: supplied password is too short. - Fejl med dynamisk DNS: angivne adgangskode er for kort. + Dynamisk DNS-fejl: angivet adgangskode er for kort. Net::DownloadHandler - + I/O Error - I/O-fejl + I/O Fejl - + The file size is %1. It exceeds the download limit of %2. - Filstørrelsen er %1. Den overstiger grænsen for download af %2. + Filstørrelsen er %1. Den er større end begrænsningen på %2. - + Unexpected redirect to magnet URI. Uventet videresendelse til magnet-URI. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - + + + GeoIP database loaded. Type: %1. Build time: %2. + GeoIP-database indlæst. Tast: %1. Kompileringstid: %2. - - The operation was canceled - Handlingen blev annulleret + + + Couldn't load GeoIP database. Reason: %1 + Kunne ikke indlæse GeoIP-databasefilen. Årsag: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - + + Venezuela, Bolivarian Republic of + Venezuela, Bolivariske Republik - - The connection to the remote server timed out - + + Viet Nam + Vietnam - - SSL/TLS handshake failed - SSL/TLS-håndtryk mislykkedes + + + N/A + N/A - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - Ukendt fejl - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - GeoIP-database indlæst. Type: %1. Byggetidspunkt: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - Kunne ikke indlæse GeoIP-database. Årsag: %1 - - - - Venezuela, Bolivarian Republic of - Venezuela, Bolivariske Republik - - - - Viet Nam - Vietnam - - - - - N/A - - - - - + Andorra Andorra - + United Arab Emirates Forenede Arabiske Emirater - + Afghanistan Afghanistan - + Antigua and Barbuda Antigua og Barbuda - + Anguilla Anguilla - + Albania Albanien - + Armenia Armenien - + Angola Angola - + Antarctica Antarktis - + Argentina Argentina - + American Samoa Amerikansk Samoa - + Austria Østrig - + Australia Australien - + Aruba Aruba - + Azerbaijan Aserbajdsjan - + Bosnia and Herzegovina Bosnien-Hercegovina - + Barbados Barbados - + Bangladesh Bangladesh - + Belgium Belgien - + Burkina Faso Burkina Faso - + Bulgaria Bulgarien - + Bahrain Bahrain - + Burundi Burundi - + Benin Benin - + Bermuda Bermuda - + Brunei Darussalam Brunei - + Brazil - Brasilien + Brazilien - + Bahamas Bahamas - + Bhutan Bhutan - + Bouvet Island Bouvetøen - + Botswana Botswana - + Belarus Hviderusland - + Belize Belize - + Canada Canada - + Cocos (Keeling) Islands Cocosøerne (Keelingøerne) - + Congo, The Democratic Republic of the Den Demokratiske Republik Congo - + Central African Republic Centralafrikanske Republik - + Congo Congo - + Switzerland Schweiz - + Cook Islands Cookøerne - + Chile Chile - + Cameroon Cameroun - + China Kina - + Colombia - Colombia + Colombien - + Costa Rica Costa Rica - + Cuba Cuba - + Cape Verde Kap Verde - + Curacao Curacao - + Christmas Island Juleøen - + Cyprus Cypern - + Czech Republic Tjekkiet - + Germany Tyskland - + Djibouti Djibouti - + Denmark Danmark - + Dominica Dominica - + Dominican Republic Dominikanske republik - + Algeria Algeriet - + Ecuador Ecuador - + Estonia Estland - + Egypt Egypten - + Western Sahara Vestsahara - + Eritrea Eritrea - + Spain Spanien - + Ethiopia Etiopien - + Finland Finland - + Fiji Fiji - + Falkland Islands (Malvinas) Falklandsøerne (Malvinas) - + Micronesia, Federated States of Mikronesiske Stater - + Faroe Islands Færøerne - + France Frankrig - + Gabon Gabon - + United Kingdom England - + Grenada Grenada - + Georgia Georgien - + French Guiana Fransk Guiana - + Ghana Ghana - + Gibraltar Gibraltar - + Greenland Grønland - + Gambia Gambia - + Guinea Guinea - + Guadeloupe Guadeloupe - + Equatorial Guinea Ækvatorial Guinea - + Greece Grækenland - + South Georgia and the South Sandwich Islands South Georgia og De Sydlige Sandwichøer - + Guatemala Guatemala - + Guam Guam - + Guinea-Bissau Guinea-Bissau - + Guyana Guyana - + Hong Kong Hong Kong - + Heard Island and McDonald Islands Heard- og McDonald-øerne - + Honduras Honduras - + Croatia Kroatien - + Haiti Haiti - + Hungary Ungarn - + Indonesia Indonesien - + Ireland Irland - + Israel Israel - + India Indien - + British Indian Ocean Territory - Det britiske territoriet i Det Indiske Ocean + Det britiske territoriet i Indiahavet - + Iraq Irak - + Iran, Islamic Republic of Iran, Den Islamiske Republik - + Iceland Island - + Italy Italien - + Jamaica Jamaica - + Jordan Jordan - + Japan Japan - + Kenya Kenya - + Kyrgyzstan Kirgisistan - + Cambodia Cambodia - + Kiribati Kiribati - + Comoros Comorerne - + Saint Kitts and Nevis Saint Kitts og Nevis - + Korea, Democratic People's Republic of Korea, Demokratiske Folkerepublik - + Korea, Republic of Korea, Republik - + Kuwait Kuwait - + Cayman Islands - Caymanøerne + Caymanøyene - + Kazakhstan Kazakhstan - + Lao People's Democratic Republic Laos Demokratiske Folkerepublik - + Lebanon Lebanon - + Saint Lucia Saint Lucia - + Liechtenstein Liechtenstein - + Sri Lanka Sri Lanka - + Liberia Liberia - + Lesotho Lesotho - + Lithuania Litauen - + Luxembourg Luxembourg - + Latvia Letland - + Morocco Morocco - + Monaco Monaco - + Moldova, Republic of Moldova, Republikken - + Madagascar Madagascar - + Marshall Islands Marshalløerne - + Mali Mali - + Myanmar Myanmar - + Mongolia Mongoliet - + Northern Mariana Islands Nordmarianerne - + Martinique Martinique - + Mauritania Mauretanien - + Montserrat Montserrat - + Malta Malta - + Mauritius Mauritius - + Maldives Maldiverne - + Malawi Malawi - + Mexico Mexico - + Malaysia Malaysia - + Mozambique Mozambique - + Namibia Namibia - + New Caledonia Ny Kaledonien - + Niger Niger - + Norfolk Island Norfolk Island - + Nigeria Nigeria - + Nicaragua Nicaragua - + Netherlands Holland - + Norway Norge - + Nepal Nepal - + Nauru Nauru - + Niue Niue - + New Zealand New Zealand - + Oman Oman - + Panama Panama - + Peru Peru - + French Polynesia Fransk Polynesien - + Papua New Guinea Papua Ny Guinea - + Philippines Filippinerne - + Pakistan Pakistan - + Poland Polen - + Saint Pierre and Miquelon Saint Pierre og Miquelon - + Puerto Rico Puerto Rico - + Portugal Portugal - + Palau Palau - + Paraguay Paraguay - + Qatar Qatar - + Reunion - Genforening + - + Romania Rumænien - + Russian Federation Den Russiske Føderation - + Rwanda Rwanda - + Saudi Arabia Saudi Arabien - + Solomon Islands Salomonøerne - + Seychelles Seychellerne - + Sudan Sudan - + Sweden Sverige - + Singapore Singapore - + Slovenia Slovenien - + Svalbard and Jan Mayen Svalbard og Jan Mayen - + Slovakia Slovakiet - + Sierra Leone Sierra Leone - + San Marino San Marino - + Senegal Senegal - + Somalia Somalia - + Suriname - Surinam + Suriname - + Sao Tome and Principe Sao Tome og Principe - + El Salvador El Salvador - + Syrian Arab Republic Syriske Arabiske Republik - + Swaziland Swaziland - + Turks and Caicos Islands Turks- og Caicosøerne - + Chad Chad - + French Southern Territories Franske Sydlige Territorier - + Togo Togo - + Thailand - Thailand + Tailand - + Tajikistan Tadsjikistan - + Tokelau Tokelau - + Turkmenistan Turkmenistan - + Tunisia Tunesien - + Tonga Tonga - - Could not decompress GeoIP database file. - Kunne ikke udpakke GeoIP-databasefil. - - - + Timor-Leste Timor-Leste - + Bolivia, Plurinational State of Bolivia, Flernationale Stat - + Bonaire, Sint Eustatius and Saba Bonaire , Sint Eustatius og Saba - + Cote d'Ivoire Cote d'Ivoire - + Libya Libyen - + Saint Martin (French part) - Saint Martin (fransk del) + Saint Martin ( fransk del ) - + Macedonia, The Former Yugoslav Republic of Makedonien, Den Tidligere Jugoslaviske Republik - + Macao Macao - + Pitcairn Pitcairn - + Palestine, State of Palæstina - + Saint Helena, Ascension and Tristan da Cunha Saint Helena , Ascension og Tristan da Cunha - + South Sudan Sydsudan - + Sint Maarten (Dutch part) - Sint Maarten (hollandske del) + Sint Maarten ( hollandske del ) - + Turkey Tyrkiet - + Trinidad and Tobago Trinidad og Tobago - + Tuvalu Tuvalu - + Taiwan Taiwan - + Tanzania, United Republic of Tanzania - + Ukraine Ukraine - + Uganda Uganda - + United States Minor Outlying Islands Mindre Amerikanske Oversøiske Øer - + United States Forenede stater - + Uruguay Uruguay - + Uzbekistan Uzbekistan - + Holy See (Vatican City State) - Pavestolen (Vatikanstaten) + Pavestolen ( Vatikanstaten ) - + Saint Vincent and the Grenadines Saint Vincent og Grenadinerne - + Virgin Islands, British - Jomfruøerne, britiske + Jomfruøerne , britiske - + Virgin Islands, U.S. Virgin Islands, U.S. - + Vanuatu Vanuatu - + Wallis and Futuna Wallis og Futuna - + Samoa Samoa - + Yemen Yemen - + Mayotte Mayotte - + Serbia Serbien - + South Africa Sydafrika - + Zambia Zambia - + Montenegro Montenegro - + Zimbabwe Zimbabwe - + Aland Islands Ålandsøerne - + Guernsey Guernsey - + Isle of Man Isle of Man - + Jersey Jersey - + Saint Barthelemy Saint Barthelemy - + + Could not uncompress GeoIP database file. + Kunne ikke udpakke GeoIP-databasefilen. + + + Couldn't save downloaded GeoIP database file. - Kunne ikke gemme downloadet GeoIP-databasefil. + Kunne ikke gemme hentede GeoIP-databasefil. - + Successfully updated GeoIP database. - GeoIP-databasen blev opdateret. + Det lykkedes at opdatere GeoIP-databasen. - + Couldn't download GeoIP database file. Reason: %1 - Kunne ikke downloade GeoIP-databasefilen. Årsag: %1 + Kunne ikke hente GeoIP-databasefilen. Årsag: %1 Net::PortForwarder - + UPnP / NAT-PMP support [ON] - Understøttelse af UPnP/NAT-PMP [TIL] + UPnP / NAT-PMP support [TIL] - + UPnP / NAT-PMP support [OFF] - Understøttelse af UPnP/NAT-PMP [FRA] + UPnP / NAT-PMP support [FRA] Net::Smtp - + Email Notification Error: - Fejl ved notifikation via e-mail: + Påmindelsesfejl for e-post: OptionsDialog - + Options Indstillinger - + Behavior Opførsel - + Downloads Downloads - + Connection Forbindelse - + Speed Hastighed - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI - Webgrænseflade + Web UI - + Advanced - Avanceret + Advanceret - + Language Sprog - + User Interface Language: Brugerfladens sprog: - + (Requires restart) - (kræver genstart) + (Genstart kræves) - + Transfer List - Overførselsliste + Overførelses List - + Confirm when deleting torrents Bekræft ved sletning af torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. - Brug alternative farver for rækker + Brug alternative række farver - + Hide zero and infinity values - Skjul nul og uendelige værdier + Skjul nul værdier og uendelige værdier - + Always Altid - + Paused torrents only - Kun torrents som er sat på pause + Kun pauset torrents - + Action on double-click - Handling ved dobbeltklik + Handling ved dobbelt klik - + Downloading torrents: - Downloader torrents: + Henter torrents: - - + + Start / Stop Torrent - Start/stop torrent + Start /Stop Torrent - - + + Open destination folder - Åbn destinationsmappe + Åben destinationsmappe - - + + No action Ingen handling - + Completed torrents: Færdige torrents: - + Desktop Skrivebord - + Start qBittorrent on Windows start up - Start qBittorrent når Windows starter + Start qBittorrent med Windows - + Show splash screen on start up - Vis splash-skærm ved opstart + Vis splash logo ved start - + Start qBittorrent minimized Start qBittorrent minimeret - + Confirmation on exit when torrents are active - Bekræftelse ved afslutning når der er aktive torrents + Bekræft lukning når der er aktive torrents - + Confirmation on auto-exit when downloads finish - Bekræftelse ved automatisk afslutning når downloads er færdige - - - - KiB - KiB - - - - Email notification &upon download completion - &Notifikation via e-mail når download er færdig - - - - Run e&xternal program on torrent completion - Kør &eksternt program når torrent er færdig - - - - IP Fi&ltering - IP-fi&ltrering - - - - Schedule &the use of alternative rate limits - Planlæg brugen af &alternative grænser for hastighed - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Mere information</a>) - - - - &Torrent Queueing - &Torrent sat i kø - - - - Seed torrents until their seeding time reaches - Seed torrents indtil deres seedingtid nås - - - - A&utomatically add these trackers to new downloads: - Tilføj &automatisk disse trackere til nye downloads: - - - - RSS Reader - RSS-læser - - - - Enable fetching RSS feeds - Aktivér hentning af RSS-feeds - - - - Feeds refresh interval: - Interval for genopfriskning af feeds: - - - - Maximum number of articles per feed: - Maksimum antal artikler pr. feed: - - - - - min - minutes - min - - - - RSS Torrent Auto Downloader - Automatisk download af RSS-torrent - - - - Enable auto downloading of RSS torrents - Aktivér automatisk download af RSS-torrents - - - - Edit auto downloading rules... - Rediger regler for automatisk download... - - - - Web User Interface (Remote control) - Webgrænseflade (fjernstyring) - - - - IP address: - IP-adresse: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - IP-adresse som webgrænsefladen vil binde til. -Angiv en IPv4- eller IPv6-adresse. Du kan angive "0.0.0.0" til enhver IPv4-adresse, -"::" til enhver IPv6-adresse eller "*" til både IPv4 og IPv6. - - - - Server domains: - Serverdomæner: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - Hvidliste til filtrering af HTTP host-headerværdier. -For at afværge DNS-genbindingsangreb, -bør du putte domænenavne i som bruges af webgrænsefladens server. - -Brug ';' til af adskille flere indtastninger. Jokertegnet '*' kan bruges. - - - - &Use HTTPS instead of HTTP - &Brug HTTPS i stedet for HTTP - - - - Bypass authentication for clients on localhost - Tilsidesæt godkendelse for klienter på localhost - - - - Bypass authentication for clients in whitelisted IP subnets - Tilsidesæt godkendelse for klienter i hvidlistede IP-undernet - - - - IP subnet whitelist... - IP-undernet-hvidliste... + - - Upda&te my dynamic domain name - Opdater mit &dynamiske domænenavn + + Show qBittorrent in notification area + Vis qBittorrent på processlinjen - + Minimize qBittorrent to notification area - Minimer qBittorrent til notifikationsområdet + Minimere qBittorrent til processlinjen - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. - Luk qBittorrent til notifikationsområdet + Luk qBittorrent til processlinjen - + Tray icon style: - Stil for bakkeikon: + Ikon stil på processlinjen: - + Normal Normal - + Monochrome (Dark theme) Monokrom (Mørkt tema) - + Monochrome (Light theme) Monokrom (Lyst tema) - + File association - Filtilknytning + Fil tilknytning - + Use qBittorrent for .torrent files - Brug qBittorrent til .torrent-filer + Brug qBittorrent til .torrent filer - + Use qBittorrent for magnet links - Brug qBittorrent til magnet-links + Brug qBittorrent til magnet links - + Power Management Strømstyring - + + Inhibit system sleep when torrents are active + Forhindre dvale når der er aktive torrents + + + + Log file + Log fil + + + Save path: - Gemmesti: + Gem i: - + Backup the log file after: - Sikkerhedskopiér logfilen efter: + + + + + MB + MB - + Delete backup logs older than: - Slet sikkerhedskopieret logge som er ældre end: + - + days Delete backup logs older than 10 months dage - + months Delete backup logs older than 10 months - måneder + Måneder - + years Delete backup logs older than 10 years år - + When adding a torrent - Når en torrent tilføjes + Når torrent tilføjes - + + Display torrent content and some options + Vis torrent indhold og nogle indstillinger + + + Bring torrent dialog to the front - Bring torrent-dialogen forrest + Bring torrent dialogen til fronten - + Do not start the download automatically The torrent will be added to download list in pause state Start ikke download automatisk - + Should the .torrent file be deleted after adding it - Skal .torrent-filen slettes efter den er blevet tilføjet + Skal .torrent filen slettes efter den er tilføejet + + + + Delete .torrent files afterwards + - + Also delete .torrent files whose addition was cancelled - Slet også .torrent-filer som fik deres tilføjelse annulleret + - + Also when addition is cancelled - Også når tilføjelse annulleres + - + Warning! Data loss possible! - Advarsel! Data kan gå tabt! + - + Saving Management - Gemmehåndtering + - + Default Torrent Management Mode: - Standardtilstand for torrent-håndtering: + - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - Automatisk tilstand betyder at diverse torrent-egenskaber (f.eks. gemmesti) vil blive besluttet af den tilknyttede kategori + - + Manual - Manuelt + Manuel - + Automatic Automatisk - + When Torrent Category changed: - Når torrentkategori ændres: + - + Relocate torrent - Flyt torrent til en anden placering + Relokere torrent - + Switch torrent to Manual Mode - Skift torrent til manuel tilstand + - + When Default Save Path changed: - Når standardgemmesti ændres: + - - + + Relocate affected torrents - Flyt påvirkede torrents til en anden placering + - - + + Switch affected torrents to Manual Mode - Skift påvirkede torrents til manuel tilstand + - + When Category changed: - Når kategori ændres: + - + Use Subcategories - Brug underkategorier + - + Default Save Path: - Standardgemmesti: + Sæt som standard sti - + Keep incomplete torrents in: Behold ufærdige torrents i: - + Copy .torrent files to: - Kopiér .torrent-filer til: - - - - Show &qBittorrent in notification area - Vis &qBittorrent i notifikationsområdet + Kopier .torrent filer til: - - &Log file - &Logfil - - - - Display &torrent content and some options - Vis &torrent-indhold og nogle valgmuligheder - - - - Create subfolder for torrents with multiple files - Opret undermappe til torrents med mere end én fil - - - - De&lete .torrent files afterwards - &Slet .torrent-filer bagefter - - - + Copy .torrent files for finished downloads to: - Kopiér færdige .torrent downloads til: + Kopier færdige .torrent downloads til: - + Pre-allocate disk space for all files Præ-allokér alle filer - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding - + + Append .!qB extension to incomplete files + Tilføj .!qB til ukomplette filer - - Append .!qB extension to incomplete files - Tilføj .!qB-endelse til slutningen af ufærdige filer + + Automatically add torrents from: + Automatisk tilføj torrents fra: - - Enable recursive download dialog + + Add entry - - Automatically add torrents from: - Tilføj automatisk torrents fra: + + Remove entry + - - Add entry - Tilføj element + + Email notification upon download completion + E-post notification ved download færdig - - Remove entry - Fjern element + + Destination email: + - + SMTP server: - SMTP-server: + SMTP server: - + This server requires a secure connection (SSL) Denne server kræver en sikker forbindelse (SSL) - - + + + Authentication - Godkendelse + Identifikation - - - - + + + + Username: Brugernavn: - - - - + + + + Password: Adgangskode: - - Enabled protocol: - Aktiveret protokol: - - - - TCP and μTP - TCP og μTP + + Run external program on torrent completion + Kør et program når en torrent er færdig - + Listening Port - Lyttende port + - + Port used for incoming connections: - Port der bruges til indgående forbindelser: + Port for indgående forbindelser: - + Random Tilfældig - + Use UPnP / NAT-PMP port forwarding from my router - Brug UPnP/NAT-PMP port-viderestilling fra min router + Brug UPnP / NAT PMP port viderstilling fra min router - + Use different port on each startup - Brug en anden port ved hver opstart + Brug tilfældig port ved programstart - + Connections Limits - Grænser for forbindelser + Forbindelsesbegrænsninger - + Maximum number of connections per torrent: - Maksimum antal forbindelser pr. torrent: + Maks antal forbindelser per torrent: - + Global maximum number of connections: - Global maksimum antal forbindelser: + Global maks antal forbindelser: - + Maximum number of upload slots per torrent: - Maksimum antal uploadpladser pr. torrent: + Maks antal upload pladser per torrent: - + Global maximum number of upload slots: - Global maksimum antal uploadpladser: + Global maks antal upload forbindelser: - + Proxy Server - Proxy-server + Proxy Server - + Type: Type: - + (None) (Ingen) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: - Vært: + Host: - - + + Port: Port: - + Otherwise, the proxy server is only used for tracker connections - Ellers bruges proxy-serveren kun til tracker-forbindelser + - + Use proxy for peer connections - Brug proxy til modpartsforbindelser + Brug proxy til peer forbindelser - + Disable connections not supported by proxies - Deaktivér forbindelser som ikke understøttes af proxier - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Mere information</a>) + Deaktivere forbindelser ikke supporteret af proxier. - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - RSS-feeds, søgemotor softwareopdateringer og alt andet end torrent-overførsler og relaterede handlinger (såsom modpartsudvekslinger) vil bruge en direkte forbindelse + - + Use proxy only for torrents - Brug kun proxy til torrents + - - A&uthentication - &Godkendelse + + Info: The password is saved unencrypted + - - Info: The password is saved unencrypted - Info: Adgangskoden gemmes ukrypteret + + IP Filtering + IP Filtrering - + Filter path (.dat, .p2p, .p2b): - Filtrér sti (.dat, .p2p, .p2b): + Filter sti (.dat, .p2p, .p2b): - + Reload the filter - Genindlæs filteret - - - - Manually banned IP addresses... - Manuelt udelukkede IP-adresser... + Genindlæs filter - + Apply to trackers - Anvend på trackere + - + Global Rate Limits - Globale grænser for hastighed + Global hastighedsbegrænsninger - - - - - - - KiB/s - KiB/s + + + Upload: + Sendehastighed: - - - Upload: - Upload: + + + + + KiB/s + KiB/s - - + + Download: - Download: + Modtagehastighed: - + Alternative Rate Limits - Alternative grænser for hastighed + Alternativ hastighedsbegrænsninger - - + + Schedule the use of alternative rate limits + Planlæg alternative hastighedsbegrænsning + + + From: from (time1 to time2) Fra: - - + To: time1 to time2 Til: - + When: Når: - + Every day Hver dag - + Weekdays Hverdage - + Weekends Weekender - + Rate Limits Settings - Indstillinger for grænser for hastighed + - + Apply rate limit to peers on LAN - Anvend grænse for hastighed til modparter på LAN + - + Apply rate limit to transport overhead - Anvend grænse for hastighed til transport-overhead + Begrænsninger gælder også transportdata (overhead) - - + + + Enable µTP protocol + + + + Apply rate limit to µTP protocol - Anvend grænse for hastighed til µTP-protokol + - + Privacy - Privatliv + Privat - + Enable DHT (decentralized network) to find more peers - Aktivér DHT (decentraliseret netværk) for at finde flere modparter + Aktiver DHT (decentraliseret netværk) netværk for at finde flere peers - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - Udveksel modparter med kompatible Bittorrent-klienter (µTorrent, Vuze, ...) + Udveksel peers med kompatible Bittorrent klienter (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers - Aktivér modpartsudveksling (PeX) for at finde flere modparter + Aktivere Peer Udveksling (PeX) for at finde flere peers - + Look for peers on your local network - Søg efter modparter på dit lokale netværk + Søg efter peers på lokalt netværk - + Enable Local Peer Discovery to find more peers - Aktivér lokal modpartsopdagelse for at finde flere modparter + Aktiver søgning efter peers på det lokale netværk - + Encryption mode: - Krypteringstilstand: + Krypterings tilstand: - + Prefer encryption Foretræk kryptering - + Require encryption Kræv kryptering - + Disable encryption - Deaktivér kryptering + Ingen kryptering - + Enable when using a proxy or a VPN connection - Aktivér når der bruges en proxy eller en VPN-forbindelse + Aktivere når der bruges proxy eller VPN forbindelse - + Enable anonymous mode - Aktivér anonym tilstand - - - - Maximum active downloads: - Maksimum aktive downloads: + Aktiver anonym tilstand - - Maximum active uploads: - Maksimum aktive uploads: - - - - Maximum active torrents: - Maksimum aktive torrents: + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Mere information</a>) - - Do not count slow torrents in these limits - Tæl ikke langsomme torrents med i disse grænser + + Torrent Queueing + Torrent Kø - - Upload rate threshold: - Grænse for uploadrate: + + Maximum active downloads: + Maks antal downloads: - - Download rate threshold: - Grænse for downloadrate: + + Maximum active uploads: + Maks antal uploads: - - sec - seconds - sek. + + Maximum active torrents: + Maks antal aktive torrents: - - Torrent inactivity timer: - Timer for torrent inaktivitet: + + Do not count slow torrents in these limits + Tæl ikke langsomme torrents med i disse begrænsninger - + Share Ratio Limiting - Begrænsning af deleforhold + Begræns deleforhold - + Seed torrents until their ratio reaches - Seed torrents indtil deres forhold er nået + Seed torrents indtil deleforhold er - + then og så - + Pause them - Sæt dem på pause + Pause dem - + Remove them Fjern dem - - RSS Smart Episode Filters - RSS smart episodefiltre + + Automatically add these trackers to new downloads: + + + + + Enable Web User Interface (Remote control) + Aktiver Web brugerflade (Fjernkontrol) - + Use UPnP / NAT-PMP to forward the port from my router - Brug UPnP/NAT-PMP til at viderestille porten fra min router + Brug UPnP / NAT-PMP tol viderstilling af port fra min router + + + + Use HTTPS instead of HTTP + Brug HTTPS istedetfor HTTP - + Certificate: Certifikat: - + Import SSL Certificate - Importér SSL-certifikat + Importer SSL Certifikat - + Key: Nøgle: - + Import SSL Key - Importér SSL-nøgle + Importer SSL Nøgle - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information om certifikater</a> - - Use alternative Web UI - Brug alternativ webgrænseflade - - - - Files location: - Filplacering: - - - - Enable clickjacking protection - + + Bypass authentication for localhost + Omgå autentificering for lokalhost - - Enable Cross-Site Request Forgery (CSRF) protection - + + Update my dynamic domain name + Opdater mit dynamiske domænenavn - + Service: - Tjeneste: + Service: - + Register Registrer - + Domain name: Domænenavn: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - Ved at aktivere disse valgmuligheder kan du <strong>uigenkaldeligt miste</strong> dine .torrent-filer! + - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - Når disse valgmuligheder er aktiveret, så vil qBittorent <strong>slette</strong> .torrent-filer efter det lykkedes at tilføje dem (den første valgmulighed) eller ej (den anden valgmulighed) til sin downloadkø. Dette vil <strong>ikke kun</strong> blive anvendt på filerne som er åbnet via menuhandlingen &ldquo;Tilføj torrent&rdquo; men også til dem der er blevet åbnet via <strong>filtypetilknytning</strong> + - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - Hvis du aktiverer den anden valgmulighed (&ldquo;Også når tilføjelse annulleres&rdquo;), <strong>så slettes .torrent-filen</strong>, selv hvis du trykker på &ldquo;<strong>Annuller</strong>&rdquo; i &ldquo;Tilføj torrent&rdquo;-dialogen - - - - Choose Alternative UI files location - Vælg alternativ placering til brugefladefiler + - + Supported parameters (case sensitive): - Understøttede parametre (forskel på store og små bogstaver): + - + %N: Torrent name - %N: Torrentnavn + %N: Torrent navn - + %L: Category - %L: Kategori + %L: Kategori: - - %G: Tags (seperated by comma) - %G: Mærkatet (separeret af komma) - - - + %F: Content path (same as root path for multifile torrent) - %F: Indholdssti (samme som rodsti til torrent med flere filer) + - + %R: Root path (first torrent subdirectory path) - %R: Rodsti (første torrent-undermappesti) + - + %D: Save path - %D: Gemmesti + %D: Gem i - + %C: Number of files %C: Antal filer - + %Z: Torrent size (bytes) - %Z: Torrentstørrelse (bytes) + %Z: Torrent størrelse (bytes) - + %T: Current tracker %T: Nuværende tracker - + %I: Info hash - %I: Infohash + %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - Tip: Omslut parameter med citationstegn så teksten ikke bliver afkortet af blanktegn (f.eks. "%N") - - - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - En torrent betrages som værende langsom hvis dens download- og uploadhastighed forbliver under disse værdier for "Timer for torrent inaktivitet" sekunder + - + Select folder to monitor - Vælg mappe som skal overvåges + Vælg mappe at overvåge - + Folder is already being monitored: - Mappen overvåges allerede: + Mappe bliver allerede overvåget. - + Folder does not exist: - Mappen findes ikke: + Mappen eksistere ikke. - + Folder is not readable: - Mappen kan ikke læses: + Mappen kan ikke læses. - + Adding entry failed - Tilføjelse af element mislykkedes + - - - - + + Choose export directory - Vælg eksportmappe + Vælg eksport mappe - - - + + + + + + Choose a save directory - Vælg en gemmemappe + Vælg en standard mappe - + Choose an IP filter file - Vælg en IP-filterfil + Vælg en ip filter fil - + All supported filters - Alle understøttede filtre + - + SSL Certificate - SSL-certifikat + SSL Certifikat - + + SSL Key + SSL nøgle + + + Parsing error - Fejl ved fortolkning + Fortolkningsfejl - + Failed to parse the provided IP filter - Kunne ikke behandle det angivne IP-filter + Kunne ikke fortolke det angivne IP-filter - + Successfully refreshed - Genopfrisket + - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - Behandling af det angivne IP-filter lykkedes: %1 regler blev anvendt. + - + Invalid key Ugyldig nøgle - + This is not a valid SSL key. - Dette er ikke en gyldig SSL-nøgle. + Dette er ikke en gyldig SSL nøgle. - + Invalid certificate Ugyldigt certifikat - - Preferences - Præferencer - - - - Import SSL certificate - Importér SSL-certifikat - - - + This is not a valid SSL certificate. - Dette er ikke et gyldigt SSL-certifikat. - - - - Import SSL key - Importér SSL-nøgle - - - - SSL key - SSL-nøgle + - + Time Error - Fejl ved tid + Tid Fejl - + The start time and the end time can't be the same. - Start- og slut-tiden må ikke være det samme. + Start og slut tiden kan ikke være ens. - - + + Length Error - Fejl ved længde + Længdefejl - + The Web UI username must be at least 3 characters long. - Webgrænsefladens brugernavn skal være mindst 3 tegn langt. + Web UI brugernavnet skal være mindst 3 karakter langt. - + The Web UI password must be at least 6 characters long. - Webgrænsefladens adgangskode skal være mindst 6 tegn langt. + Web UI adgangskoden skal være mindst 3 karakter langt. PeerInfo - - Interested(local) and Choked(peer) - Interested(local) og choked(peer) + + interested(local) and choked(peer) + - + interested(local) and unchoked(peer) - interested(local) og unchoked(peer) + - + interested(peer) and choked(local) - interested(peer) og choked(local) + - + interested(peer) and unchoked(local) - interested(peer) og unchoked(local) + - + optimistic unchoke - optimistisk unchoke + - + peer snubbed - modpart afbrudt + Peer afbrudt - + incoming connection - indgående forbindelse + Indgående forbindelse - + not interested(local) and unchoked(peer) - not interested(local) og unchoked(peer) + - + not interested(peer) and unchoked(local) - not interested(peer) og unchoked(local) + - + peer from PEX - modpart fra PEX + peer fra PEX - + peer from DHT - modpart fra DHT + peer fra DHT - + encrypted traffic krypteret trafik - + encrypted handshake krypteret håndtryk - + peer from LSD - modpart fra LSD + peer fra LSD PeerListWidget - + IP IP - + Port Port - + Flags - Flag + Flags - + Connection Forbindelse - + Client i.e.: Client application Klient - + Progress i.e: % downloaded - Forløb + Fremgang - + Down Speed i.e: Download speed - Downloadhastighed + Hast. ned - + Up Speed i.e: Upload speed - Uploadhastighed + Hast. op - + Downloaded i.e: total data downloaded - Downloadet + Modtaget - + Uploaded i.e: total data uploaded - Uploadet + Sendt - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Relevans - + Files i.e. files that are being downloaded right now Filer - + Column visibility - Synlighed for kolonne + Kolonnesynlighed - + Add a new peer... - Tilføj en ny modpart... + Tilføj ny peer... - - + + Ban peer permanently - Udeluk modpart permanent + Bandlys peer permanent - + Manually adding peer '%1'... - Tilføjer modpart '%1' manuelt... + Tilføjer manuelt modpart »%1« ... - + The peer '%1' could not be added to this torrent. - Modparten '%1' kunne ikke tilføjes til denne torrent. + Modparten »%1« kunne ikke tilføjes til denne torrent. - + Manually banning peer '%1'... - Udelukket modpart '%1' manuelt... + Banlyser peer %1 manuelt... - - + + Peer addition - Tilføjelse af modpart + Tilføjelse af peer - + Country - Land + Land: - + Copy IP:port - Kopiér IP:port + Kopiere IP:port - + Some peers could not be added. Check the Log for details. - Nogle modparter kunne ikke tilføjes. Tjek loggen for detaljer. + Nogle modparter kunne ikke tilføjes. Kontroller loggen for detaljer. - + The peers were added to this torrent. Modparterne blev tilføjet til denne torrent. - + Are you sure you want to ban permanently the selected peers? - Er du sikker på, at du vil udelukke de valgte modparter permanent? + Er du sikker på at du vil bandlyse de valgte peers permanent? - + &Yes &Ja - + &No &Nej - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - Format: IPv4:port/[IPv6]:port - + PeersAdditionDlg - + No peer entered - Der er ikke indtastet nogen modpart + Ingen modpart indtastet - + Please type at least one peer. - Skriv venligst mindst én modpart. + Tast mindst en modpart. - + Invalid peer Ugyldig modpart - + The peer '%1' is invalid. - + Modparten »%1« er ugyldig. PieceAvailabilityBar - + White: Unavailable pieces - Hvis: Utilgængelige stykker + Hvis: Utilgængelige dele - + Blue: Available pieces - Blå: Tilgængelige stykker + Blå: Tilgængelige dele PiecesBar - + Files in this piece: - Filer i dette stykke: + - + File in this piece - Fil i dette stykke + - + File in these pieces - Fil i disse stykker - - - - Wait until metadata become available to see detailed information - Vent med at se detaljeret information før metadata bliver tilgængelig + - + Hold Shift key for detailed information Hold Skift-tasten nede for detaljeret information - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Søge plugins - + Installed search plugins: - + Installerede søgeudvidelsesmoduler: - + Name Navn - + Version Version - + Url Url - - + + Enabled - Aktiveret - - - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - + Slået til - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Du kan finde nye søgetjenester her: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one Installer en ny - + Check for updates - Søg efter opdateringer + Tjek for opdateringer - + Close Luk - + Uninstall Afinstaller - - - + + + Yes Ja - - - - + + + + No Nej - + Uninstall warning - Advarsel om afinstallation + Afindstallations advarsel - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Visse plugins kunne ikke afindstalleres fordi de er indkluderet i qBittorrent +Du kan kun afindstallere dem du selv har indstalleret +Disse plugins blev dog koble fra. - + Uninstall success - Afinstallationen lykkedes + Afindstallationen lykkedes - + All selected plugins were uninstalled successfully - - - - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - + Afindstallationen af alle valgte plugins lykkedes - - + + New search engine plugin URL - + Ny søgemaskine plugin URL - - + + URL: URL: - + Invalid link Ugyldigt link - + The link doesn't seem to point to a search engine plugin. - + Dette link lader ikke til at henvise til et søgemaskine plugin. - + Select search plugins - + Vælg søge plugin - + qBittorrent search plugin - + qBittorrent søge plugins + + + + + + Search plugin update + Søge plugin opdatering - + All your plugins are already up to date. - + Alle dine plugins er af nyeste udgave. - + Sorry, couldn't check for plugin updates. %1 - + Beklager, kunne ikke kontrollere for opdateringer til udvidelsesmoduler: %1 - + + + Search plugin install - + Søge plugin indstallation - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + Indstallationen af %1 søgemaskine plugin lykkedes. + + + Couldn't install "%1" search engine plugin. %2 - + Kunne ikke installere »%1«-søgemotorudvidelsesmodulet. %2 + + + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + %1 søgemaskine plugin blev opdateret. - + Couldn't update "%1" search engine plugin. %2 - + Kunne ikke opdatere »%1«-søgemotorudvidelsesmodulet. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Plugin kilde - + Search plugin source: - + Kilde for søgeudvidelsesmodulet: - + Local file - + Lokal fil - + Web link - - - - - PowerManagement - - - qBittorrent is active - + Web link - PreviewSelectDialog - - - Preview - Forhåndsvis - + PreviewSelect - + Name Navn - + Size Størrelse - + Progress - Forløb + Fremgang - - + + Preview impossible - Forhåndsvisning ikke muligt + Smugkig ikke muligt - - + + Sorry, we can't preview this file - Beklager, vi kan ikke forhåndsvise denne fil - - - - Private::FileLineEdit - - - '%1' does not exist - '%1' findes ikke - - - - '%1' does not point to a directory - '%1' henviser ikke til en mappe - - - - '%1' does not point to a file - '%1' henviser ikke til en fil - - - - Does not have read permission in '%1' - Har ikke læsetilladelse i '%1' - - - - Does not have write permission in '%1' - Har ikke skrivetilladelse i '%1' + Beklager, denne fil kan ikke smugkigges PropListDelegate - + Not downloaded - Ikke downloadet + Ikke hentet - - + + Normal Normal (priority) Normal - - N/A - - - - - + Do not download Do not download (priority) - Download ikke + Hent ikke - - + + High High (priority) Høj - + N/A + N/A + + + Mixed Mixed (priorities - Blandet + Mikset - - + + Maximum Maximum (priority) - Højeste + Højest PropTabBar - + General - Generelt + Generel - + Trackers Trackere - + Peers - Modparter + Peers - + HTTP Sources - HTTP-kilder + HTTP Kilder - + Content Indhold - + Speed Hastighed @@ -6537,7 +5809,7 @@ Downloaded: - Downloadet: + Hentet: @@ -6547,7 +5819,7 @@ Progress: - Forløb: + Fremgang: @@ -6568,7 +5840,7 @@ Uploaded: - Uploadet: + Sendt: @@ -6578,27 +5850,27 @@ Download Speed: - Downloadhastighed: + Modtagehastighed: Upload Speed: - Uploadhastighed: + Sendehastighed: Peers: - Modparter: + Peers: Download Limit: - Downloadgrænse: + Hent-begrænsning: Upload Limit: - Uploadgrænse: + Send-begrænsning: @@ -6621,49 +5893,49 @@ Kommentar: - + Select All - Vælg alt + Vælg Alt - + Select None - Vælg intet + Vælg Intet - + Normal Normal - + High Høj Share Ratio: - Deleforhold: + Delingsforhold: Reannounce In: - Genannoncer om: + Opdatere om: Last Seen Complete: - Sidst set færdige: + Sidst set færdig: Total Size: - Samlet størrelse: + Total størrelse: Pieces: - Stykker: + @@ -6688,759 +5960,725 @@ Torrent Hash: - Torrent-hash: + Torrent hash: Save Path: - Gemmesti: + Gem i: - + Maximum - Højeste + Maksimum + - Do not download - Download ikke + Hent ikke - + Never Aldrig - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (har %3) - - + + %1 (%2 this session) %1 (%2 denne session) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - %1 (seedet i %2) + %1 (seeded i %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) - %1 (%2 maks.) + %1 (%2 maks) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) - %1 (%2 i alt) + %1 (%2 total) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 gns.) - + Open - Åbn + Åben - + Open Containing Folder - Åbn indeholdende mappe + Åben Destinationsmappe - + Rename... Omdøb... - + Priority Prioritet - + New Web seed - Nyt webseed + Ny Web seed - + Remove Web seed - Fjern webseed + Fjern Web seed - + Copy Web seed URL - Kopiér webseed-URL + Kopier Web seed URL - + Edit Web seed URL - Rediger webseed-URL + Rediger Web seed URL - + + Rename the file + Omdøb fil + + + New name: Nyt navn: - - + + + The file could not be renamed + Filen kunne ikke omdøbes + + + + This file name contains forbidden characters, please choose a different one. + Filnavnet indeholder forbudte tegn, vælg venligst nogle andre. + + + + This name is already in use in this folder. Please use a different name. - Navnet bruges allerede i denne mappe. Brug venligst et andet navn. + Navnet for denne mappe er allerede i brug. Vælg venligst et andet. - + The folder could not be renamed Mappen kunne ikke omdøbes - + qBittorrent qBittorrent - + Filter files... - Filterfiler... - - - - Renaming - Omdøbning - - - - - Rename error - Fejl ved omdøbning - - - - The name is empty or contains forbidden characters, please choose a different one. - Navnet er tomt eller indeholder forbudte tegn. Vælg venligst et andet. + Filter filer... - + New URL seed New HTTP source - Nyt URL-seed + Ny URL seed - + New URL seed: - Nyt URL-seed: + Ny URL seed: - - + + This URL seed is already in the list. - Dette URL-seed er allerede i listen. + Denne adresseseed er allerede i listen. - + Web seed editing - Redigering af webseed + Web seed redigering - + Web seed URL: - Webseed-URL: + Web seed URL: QObject - + + Your IP address has been banned after too many failed authentication attempts. + Din IP addresse blev blokeret efter for mange mislykket forsøg. + + + + Error: '%1' is not a valid torrent file. + + Fejl: »%1« er ikke en gyldig torrentfil. + + + + + Error: Could not add torrent to session. + Fejl: Kunne ikke tilføje torrent til session. + + + + I/O Error: Could not create temporary file. + I/O-fejl: Kunne ikke oprette midlertidig fil. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. - %1 er en ukendt kommandolinjeparameter. + %1 er en ukendt parameter for kommandolinjen. - - + + %1 must be the single command line parameter. - %1 skal være en enkelt kommandolinjeparameter. + + + + + %1 must specify the correct port (1 to 65535). + - + You cannot use %1: qBittorrent is already running for this user. - Du kan ikke bruge %1: qBittorrent kører allerede for denne bruger. + - + Usage: - Anvendelse: + Brug: - + Options: - Tilvalg: + Indstillinger: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - Parameteren '%1' skal følge syntaksen '%1=%2' + + Displays program version + Vis program version - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - Parameteren '%1' skal følge syntaksen '%1=%2' + + Displays this help message + Vis denne hjælpe besked - - Expected integer number in environment variable '%1', but got '%2' - Ventede heltalsnummer i miljøvariablen '%1', men fik '%2' + + Changes the Web UI port (current: %1) + Skift webui porten (nuværende: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - Parameteren '%1' skal følge syntaksen '%1=%2' + + Disable splash screen + Deaktivere start logo - - Expected %1 in environment variable '%2', but got '%3' - Ventede %1 i miljøvariablen '%2', men fik '%3' + + Run in daemon-mode (background) + - - port - port + + Downloads the torrents passed by the user + - - %1 must specify a valid port (1 to 65535). - %1 skal angive en gyldig port (1 til 65535). + + Help + Hjælp - - Display program version and exit - Vis programversion og afslut + + Run application with -h option to read about command line parameters. + - - Display this help message and exit - Vis denne hjælpemeddelelse og afslut + + Bad command line + Ugyldig kommandolinje - - Change the Web UI port - Skift webgrænsefladeporten + + Bad command line: + Ugyldig kommandolinje: - - Disable splash screen - Deaktivér splash-skærm + + Legal Notice + Juridisk Meddelelse - - Run in daemon-mode (background) - Kør i dæmon-tilstand (i baggrunden) + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + qBittorrent er et fil delings program. Når du køre en torrent, vil dataen blive tilgængelig til andre gennem upload. Du har alene ansvaret for indholdet du deler. + +Ingen yderlige notits vil blive givet. - - dir - Use appropriate short form or abbreviation of "directory" - mappe + + Press %1 key to accept and continue... + Tryk %1 for at acceptere og forsætte ... - - Store configuration files in <dir> - Opbevar konfigurationsfiler i <dir> + + Legal notice + Juridisk Meddelelse - - - name - navn + + Cancel + Annuller - - Store configuration files in directories qBittorrent_<name> - Opbevar konfigurationsfiler i mapper ved navn qBittorrent_<navn> + + I Agree + Jeg Acceptere - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Hack ind i libtorrent fastresume-filer og gør filstierne relative til profilmappen + + Torrent name: %1 + Torrent navn: %1 - - files or URLs - filer eller URL'er + + Torrent size: %1 + Torrent størrelse: %1 - - Download the torrents passed by the user - Download torrents som brugeren har givet + + Save path: %1 + Gem i: %1 - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Angiv om "Tilføj ny torrent"-dialogen åbnes når der tilføjes en torrent. + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Torrent blev hentet på %1. - - Options when adding new torrents: - Tilvalg når der tilføjes nye torrents: + + Thank you for using qBittorrent. + Tak fordi du bruger qBittorrent. - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Genvej for %1 + + [qBittorrent] '%1' has finished downloading + [qBittorrent] %1 er færdighentet - - path - sti + + The remote host name was not found (invalid hostname) + Fjern hostnavnet blev ikke fundet (ugyldig hostnavn) - - Torrent save path - Gemmesti til torrent + + The operation was canceled + Handlingen blev annulleret - - Add torrents as started or paused - Tilføj torrents som startet eller sat på pause + + The remote server closed the connection prematurely, before the entire reply was received and processed + Den eksterne server lukkede forbindelsen for tidligt, før hele svaret blev modtaget og behandlet - - Skip hash check - Spring hashtjek over + + The connection to the remote server timed out + Forbindelsen til fjern serveren timed ud - - Assign torrents to category. If the category doesn't exist, it will be created. - Tildel torrents til kategori. Hvis kategorien ikke findes, så oprettes den. + + SSL/TLS handshake failed + SSL/TLS håndtryk mislykkedes - - Download files in sequential order - Download filer i fortløbende rækkefølge + + The remote server refused the connection + Fjern serveren nægtede forbindelsen - - Download first and last pieces first - Start med at downloade første og sidste stykker + + The connection to the proxy server was refused + Forbindelse til proxy serveren blev nægtet - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - Tilvalgsværdier kan gives via miljøvariabler. For tilvalg ved navn 'parameterens-navn', er miljøvariablens navn 'QBT_PARAMETERENS_NAVN' (med store bogstaver, '-' erstattes med '_'). Sæt variablen til '1' eller 'TRUE', for at videregive flag-værdier. F.eks. for at deaktivere splash-skærmen: + + The proxy server closed the connection prematurely + Proxy serveren lukkede forbindelsen for tidligt - - Command line parameters take precedence over environment variables - Kommandolinjeparametre har forrang over miljøvariabler + + The proxy host name was not found + Proxy hostnavn blev ikke fundet - - Help - Hjælp + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Forbindelsen til proxyen timed ud eller proxyen svarede ikke i tide - - Run application with -h option to read about command line parameters. - Kør programmet med tilvalget -h for at læse om kommandolinjeparametre. + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Proxyen kræver godkendelse for at kunne efterfølge forespørgelsen men accepterede ikke de indtastede oplysninger - - Bad command line - Ugyldig kommandolinje + + The access to the remote content was denied (401) + Adgang til fjernindhold var nægtet (401) - - Bad command line: - Ugyldig kommandolinje: + + The operation requested on the remote content is not permitted + Handlingen der bliver efterspurgt på det eksterne indhold er ikke tilladt - - Legal Notice - Juridisk notits + + The remote content was not found at the server (404) + Eksternt indhold blev ikke fundet på serveren (404) - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - qBittorrent er et fildelingsprogram. Når du kører en torrent, vil dens data blive gjort tilgængelig til andre via upload. Du har alene ansvaret for det indhold du deler. + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Denne server kræve autentificering for at vise indholdet, men de indtastede legitimationsoplysninger blev ikke godkendt - - No further notices will be issued. - Der udstedes ingen yderligere notitser. + + The Network Access API cannot honor the request because the protocol is not known + Network Access API kan ikke udføre forespørgslen fordi protokollen ikke kan genkendes - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - qBittorrent er et fildelingsprogram. Når du kører en torrent, vil dens data blive gjort tilgængelig til andre via upload. Du har alene ansvaret for det indhold du deler. - -Der udstedes ingen yderlige notitser. + + The requested operation is invalid for this protocol + Den anmodede handling er ugyldig for denne protokol - - Press %1 key to accept and continue... - Tryk på %1 for at acceptere og forsætte... + + An unknown network-related error was detected + En ukendt netværksrelateret fejl blev fundet - - Legal notice - Juridisk notits + + An unknown proxy-related error was detected + En ukendt proxyrelateret fejl blev fundet - - Cancel - Annuller + + An unknown error related to the remote content was detected + En ukendt fejl relateret til indholdet blev fundet - - I Agree - Jeg accepterer + + A breakdown in protocol was detected + Et nedbrud i protokollen blev fundet - - + + Unknown error + Ukendt fejl + + + + Upgrade Opgrader - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - Du opdaterede fra en gammel version, som gemte ting anderledes. Du skal migrere til det nye lagringssystem. Du vil ikke være i stand til at bruge en ældre version end v3.3.0 igen. Fortsæt? [j/n] + Du opdaterede fra en ældre version, som gemte ting anderledes. Du skal migrere til det nye lagringssystem. Du kan ikke bruge en ældre version end v3.3.0 igen. Fortsæt? [j/n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - Du opdaterede fra en gammel version, som gemte ting anderledes. Du skal migrere til det nye lagringssystem. Hvis du fortsætter, så vil du ikke være i stand til at bruge en ældre version end v3.3.0 igen. + Du opdaterede fra en ældre version, som gemte ting anderledes. Du skal migrere til det nye lagringssystem. Hvis du fortsætter, vil du ikke være i stand til at bruge en ældre version end v3.3.0 igen. - + Couldn't migrate torrent with hash: %1 Kunne ikke migrere torrent med hash: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 - Kunne ikke migrere torrent. Ugyldigt fastresume-filnavn: %1 + - - Detected unclean program exit. Using fallback file to restore settings: %1 - Registrerede uren programafslutning. Bruger fallback-fil til at gendanne indstillinger: %1 + + Detected unclean program exit. Using fallback file to restore settings. + - + An access error occurred while trying to write the configuration file. Der opstod en adgangsfejl under forsøg på at skrive konfigurationsfilen. - + A format error occurred while trying to write the configuration file. Der opstod en formatfejl under forsøg på at skrive konfigurationsfilen. - - - An unknown error occurred while trying to write the configuration file. - Der opstod en ukendt fejl ved forsøg på at skrive konfigurationsfilen. - - - - RSS::AutoDownloader - - - - Invalid data format. - Ugyldigt dataformat. - - - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - Kunne ikke gemme RSS AutoDownloader-data i %1. Fejl: %2 - - - - Invalid data format - Ugyldigt dataformat - - - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - Kunne ikke læse RSS AutoDownloader-regler fra %1. Fejl: %2 - - - - Couldn't load RSS AutoDownloader rules. Reason: %1 - Kunne ikke læse RSS AutoDownloader-regler. Årsag: %1 - - - - RSS::Feed - - - Failed to download RSS feed at '%1'. Reason: %2 - Kunne ikke downloade RSS-feed på '%1'. Årsag: %2 - - - - RSS feed at '%1' updated. Added %2 new articles. - RSS-feed på '%1' opdateret. Tilføjede %2 nye artikler. - - - - Failed to parse RSS feed at '%1'. Reason: %2 - Kunne ikke behandle RSS-feed på '%1'. Årsag: %2 - - - - Couldn't read RSS Session data from %1. Error: %2 - Kunne ikke læse RSS-sessionsdata fra %1. Fejl: %2 - - - - Couldn't parse RSS Session data. Error: %1 - Kunne ikke behandle RSS-sessionsdata. Fejl: %1 - - - - Couldn't load RSS Session data. Invalid data format. - Kunne ikke indlæse RSS-sessionsdata. Ugyldigt dataformat. - - - - Couldn't load RSS article '%1#%2'. Invalid data format. - Kunne ikke indlæse RSS-artikel '%1#%2'. Ugyldigt dataformat. - - - - RSS::Private::Parser - - - Invalid RSS feed. - Ugyldigt RSS-feed. - - - - %1 (line: %2, column: %3, offset: %4). - %1 (linje: %2, kolonne: %3, forskydning: %4). - - - - RSS::Session - - - RSS feed with given URL already exists: %1. - RSS-feed med angivne URL findes allerede: %1. - - - - Cannot move root folder. - Kan ikke flytte rodmappe. - - - - - Item doesn't exist: %1. - Element findes ikke: %1. - - - - Cannot delete root folder. - Kan ikke slette rodmappe. - - - - Incorrect RSS Item path: %1. - Ukorrekt RSS-elementsti: %1. - - - - RSS item with given path already exists: %1. - RSS-element med angivne sti findes allerede: %1. - - - - Parent folder doesn't exist: %1. - Forældermappe findes ikke: %1. - - RSSWidget + RSS - + Search Søg - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - Hentning af RSS-feeds er nu deaktiveret. Du kan aktivere det i programindstillingerne. - - - + New subscription - Nyt abonnement + Ny abonnement - - - + + + Mark items read - Mærk elementer som læst - - - - Refresh RSS streams - Genopfrisk RSS-strømme + Maker som læst - + Update all Opdater alle - + RSS Downloader... - RSS-downloader... + RSS Downloader... - + + Settings... + Indstillinger... + + + Torrents: (double-click to download) - Torrents: (dobbeltklik for at downloade) + Torrenter: (dobbeltklik for at hente) - - + + Delete Slet - + Rename... Omdøb... - + Rename Omdøb - - + + Update Opdater - + New subscription... - Nyt abonnement... + Ny abonnement... - - + + Update all feeds Opdater alle feeds - + Download torrent - Download torrent + Hent torrent - + Open news URL - Åbn nyheds-URL + Åben nyheds URL - + Copy feed URL - Kopiér URL for feed + Kopier feed URL - + New folder... Ny mappe... - + + Refresh RSS streams + Opdater RSS streams + + + + RSSImp + + + Stream URL: + Stream URL: + + + + Please type a RSS stream URL + + + + + This RSS feed is already in the list. + RSS-nyhedskilden er allerede i listen. + + + Please choose a folder name Vælg venligst et mappenavn - + Folder name: Mappenavn: - + New folder Ny mappe - - Please type a RSS feed URL - Skriv venligst en URL for RSS-feed - - - - Feed URL: - URL for feed: - - - + Deletion confirmation - Bekræftelse for sletning + Slet-bekræftelse - + Are you sure you want to delete the selected RSS feeds? - Er du sikker på, at du vil slette de valgte RSS-feeds? + Er du sikker på, at du ønsker at slette de valgte RSS-nyhedskilder? - + Please choose a new name for this RSS feed - Vælg venligst et nyt navn til dette RSS-feed + Vælg venligst et nyt navn til denne RSS feed - + New feed name: - Nyt feednavn: + Nyt feed navn: + + + + Name already in use + Navn allerede i brug - - Rename failed - Omdøbning mislykkedes + + This name is already used by another item, please choose another one. + Dette navn er allerede i brug et andet sted, vælg venligst et andet navn. - + Date: - Dato: + Dato: - + Author: Forfatter: + + + Unread + Ulæst + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + + + + + Rss::Private::Parser + + + Invalid RSS feed. + Ugyldig RSS-nyhedskilde. + + + + RssSettingsDlg + + + RSS Reader Settings + RSS Læser Indstillinger + + + + RSS feeds refresh interval: + RSS feed opdaterings interval: + + + + min + min + + + + Maximum number of articles per feed: + Maks antal emner per feed: + ScanFoldersDelegate - + Select save location Vælg placering at gemme @@ -7448,274 +6686,268 @@ ScanFoldersModel - + Monitored Folder Overvåget mappe - + Override Save Location - Tilsidesæt placering at gemme + Overskriv placering at gemme - + Monitored folder Overvåget mappe - + Default save location Standardplacering at gemme - + Browse... - Gennemse... + Gennemse ... - SearchJobWidget + SearchEngine - - Form - + + Unknown search engine plugin file format. + Ukendt filformat for søgemotorudvidelsesmodul. - - Results(xxx) - + + A more recent version of this plugin is already installed. + En nyere version af dette udvidelsesmodul er allerede installeret. - - Search in: - + + + Plugin is not supported. + Udvidelsesmodul er ikke understøttet. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - + + Update server is temporarily unavailable. %1 + Opdateringsserver er midlertidig utilgængelig: %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - + + + Failed to download the plugin file. %1 + Kunne ikke hente udvidelsesmodulfilen. %1 - - Seeds: - Seeds: + + An incorrect update info received. + En forkert opdateringsinformation blev modtaget. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - + + All categories + Alle kategorier - - - to - + + Movies + Film - - <html><head/><body><p>Maximal number of seeds</p></body></html> - + + TV shows + Tv-serier - - - - + + Music + Musik - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + + Games + Spil - - Size: - Størrelse: + + Anime + Tegneserier - - <html><head/><body><p>Minimal torrent size</p></body></html> - + + Software + Programmer - - <html><head/><body><p>Maximal torrent size</p></body></html> - + + Pictures + Billeder + + + + Books + Bøger + + + + SearchListDelegate + + + + Unknown + Ukendt + + + SearchTab - + Name i.e: file name - Navn + Navn - + Size i.e: file size - Størrelse + Størrelse - + Seeders i.e: Number of full sources - + Seedere - + Leechers i.e: Number of partial sources - + Leechere - + Search engine - - - - - Filter search results... - + Søgemaskine - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Resultater (viser <i>%1</i> ud af <i>%2</i>): - + Torrent names only - + Kun torrentnavne - + Everywhere - + Overalt - - Use regular expressions - - - - + Searching... - + Søger ... - + Search has finished - Søgningen er færdig + Søgningen er færdig - + Search aborted - + Søgning afbrudt - + An error occurred during search... - + Der opstod en fejl under søgningen ... - + Search returned no results - + Søgningen gav intet resultat - + Column visibility - Synlighed for kolonne - - - - SearchPluginManager - - - Unknown search engine plugin file format. - Ukendt filformat for søgemotor-plugin. - - - - A more recent version of this plugin is already installed. - En nyere version af dette plugin er allerede installeret. + - - - Plugin is not supported. - Plugin understøttes ikke. + + Form + Formular - - All categories - Alle kategorier + + Results(xxx) + Resultater(xxx) - - Movies - Film + + Search in: + Søg i: - - TV shows - TV-shows + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + - - Music - Musik + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + - - Games - Spil + + Seeds: + Seeds: - - Anime - Anime + + <html><head/><body><p>Minimal number of seeds</p></body></html> + - - Software - Software + + + to + til - - Pictures - Billeder + + <html><head/><body><p>Maximal number of seeds</p></body></html> + - - - Books - Bøger + + + + + - - Update server is temporarily unavailable. %1 - Opdateringsserveren er midlertidig utilgængelig. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + - - - Failed to download the plugin file. %1 - Kunne ikke download plugin-filen. %1 + + Size: + Størrelse: - - An incorrect update info received. - En ukorrekt opdateringsinformation blev modtaget. + + <html><head/><body><p>Minimal torrent size</p></body></html> + - - Search plugin '%1' contains invalid version string ('%2') - Søge-pluginet '%1' indeholder ugyldig versionsstreng ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> + @@ -7723,343 +6955,322 @@ - - - - + + + Search Søg - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - Der er ikke installeret nogen søge-plugins. -Klik på "Søg efter plugins..."-knappen nederst til højre i vinduet, for at installere nogen. - - - + Download - Download + Hent - + Go to description page - Gå til beskrivelsessiden + Gå til beskrivelsesiden - + Copy description page URL - Kopiér URL for beskrivelsessidens + Kopier adressen for beskrivelsessiden - + Search plugins... - Søge-plugins... + Søgeudvidelsesmoduler ... - + A phrase to search for. - Søg efter en frase. + Søg efter denne frase. - + Spaces in a search term may be protected by double quotes. - Mellemrum i søgetermner kan beskyttes med dobbelte anførselstegn. + Mellemrum i søgninger kan beskyttes med dobbelte anførselstegn. - + Example: Search phrase example Eksempel: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - <b>foo bar</b>: søg efter <b>foo</b> og <b>bar</b> + <b>foo bar</b>: søg efter <b>foo</b> og <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: søg efter <b>foo bar</b> - + All plugins - Alle plugins + Alle udvidelsesmoduler - + Only enabled Kun aktiverede - + Select... - Vælg... + Vælg ... - - - + + + Search Engine Søgemotor - + Please install Python to use the Search Engine. Installer venligst Python for at bruge søgemotoren. - + Empty search pattern - Tomt søgemønster + Tomt søgekriterie - + Please type a search pattern first - Skriv venligst først et søgemønster + Indtast venligst et søgekriterie først - + Stop Stop - + Search has finished Søgningen er færdig - + Search has failed Søgningen mislykkedes - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + qbittorrent vil nu afslutte. - + E&xit Now - + &Afslut nu - + Exit confirmation - + Luk bekræftelse - + The computer is going to shutdown. - + Computeren lukker ned. - + &Shutdown Now - - - - - Shutdown confirmation - + &Luk ned nu - + The computer is going to enter suspend mode. - + Computeren går i dvale. - + &Suspend Now - + &Gå i dvale nu - + Suspend confirmation - + Dvale-bekræftelse - + The computer is going to enter hibernation mode. - + &Hibernate Now - + Hibernate confirmation - + You can cancel the action within %1 seconds. - + Du kan afbryde handlingen om %1 sekunder. + + + + Shutdown confirmation + Luk bekræftelse SpeedLimitDialog - + KiB/s - KiB/s + KB/s SpeedPlotView - + Total Upload - Samlet upload + Samlet sendt - + Total Download - Samlet download + Samlet hentet - + Payload Upload - Nyttelast upload + - + Payload Download - Nyttelast download + - + Overhead Upload - Overhead upload + - + Overhead Download - Overhead download + - + DHT Upload - DHT upload + - + DHT Download - DHT download + - + Tracker Upload - Tracker upload + - + Tracker Download - Tracker download + SpeedWidget - + Period: Periode: - + 1 Minute 1 minut - + 5 Minutes 5 minutter - + 30 Minutes 30 minutter - + 6 Hours 6 timer - + Select Graphs Vælg grafer - + Total Upload - Samlet upload + Samlet sendt - + Total Download - Samlet download + Samlet hentet - + Payload Upload - Nyttelast upload + - + Payload Download - Nyttelast download + - + Overhead Upload - Overhead upload + - + Overhead Download - Overhead download + - + DHT Upload - DHT upload + - + DHT Download - DHT download + - + Tracker Upload - Tracker upload + - + Tracker Download - Tracker download - - - - StacktraceDialog - - - Crash info @@ -8073,120 +7284,130 @@ User statistics - Brugerstatistik + Bruger statistik - - Cache statistics - Mellemlagerstatistik + + Total peer connections: + Antal peer forbindelser: - - Read cache hits: - Læsemellemlagerets træffere: + + Global ratio: + Globale deleforhold: - - Average time in queue: - Gennemsnitlig tid i kø: + + Alltime download: + Totalt hentet: - - Connected peers: - Tilsluttede modparter: + + Alltime upload: + Totalt sendt: - - All-time share ratio: - Delingsforhold igennem tiden: + + Total waste (this session): + Spildt (denne session): - - All-time download: - Download igennem tiden: + + Cache statistics + Cache statistik - - Session waste: - Sessionsspild: + + Read cache hits: + - - All-time upload: - Upload igennem tiden: + + Average time in queue: + - Total buffer size: - Samlet bufferstørrelse: + Total buffers size: + Total buffer størrelse: Performance statistics - Ydelsesstatistik + Ydelses statistik Queued I/O jobs: - I/O-jobs i kø: + I/O opgaver i kø: Write cache overload: - Overbelastet skrivemellemlager: + Overbelastet skrive cache: Read cache overload: - Overbelastet læsemellemlager: + Overbelastet læse cache: Total queued size: - Samlet størrelse i kø: + Total kø størrelse: - + + OK + OK + + + %1 ms 18 milliseconds - %1 ms + StatusBar - + Connection status: - Forbindelsesstatus: + Forbindelses status: - + No direct connections. This may indicate network configuration problems. - Ingen direkte forbindelser. Dette kan indikere problemer med at konfigurere netværket. + Ingen direkte forbindelser. Dette kan indikere et problem med konfigurationen af netværket. - + DHT: %1 nodes - DHT: %1 knudepunkter + DHT: %1 noder + + + + qBittorrent needs to be restarted + qBittorrent skal genstartes - - qBittorrent needs to be restarted! - qBittorrent skal genstartes! + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent blev opdateret og skal genstartes for at ændringerne kan træde i kraft. Connection Status: - Forbindelsesstatus: + Forbindelses Status: Offline. This usually means that qBittorrent failed to listen on the selected port for incoming connections. - Offline. Dette betyder typisk at qBittorrent ikke kunne lytte efter indgående forbindelser på den valgte port. + Offline. Dette betyder typisk at qBittorrent fejlede i at lytte på den valgte port efter indgående forbindelser. @@ -8194,879 +7415,616 @@ Online - + Click to switch to alternative speed limits - Klik for at skifte til alternative grænser for hastighed + Klik for at skifte til alternative hastighedsbegrænsninger - + Click to switch to regular speed limits - Klik for at skifte til normale grænser for hastighed + Klik for at skifte til normale hastighedsbegrænsninger + + + + Manual change of rate limits mode. The scheduler is disabled. + Manuel ændre hastighedsbegrænsninger. Planlægning er deaktiveret. - + Global Download Speed Limit - Global grænse for downloadhastighed + Global begrænsning af modtagehastighed - + Global Upload Speed Limit - Global grænse for uploadhastighed + Global begrænsning af sendehastighed - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter Alle (0) - + Downloading (0) - + Seeding (0) - + Completed (0) - + Resumed (0) - + Paused (0) - + Active (0) - + Aktive (0) - + Inactive (0) - + Inaktive (0) - + Errored (0) - + Fejlramte (0) - + All (%1) - Alle (%1) + Alle (%1) - + Downloading (%1) - + Henter (%1) - + Seeding (%1) - + Completed (%1) - + Færdige (%1) - + Paused (%1) - + På pause (%1) - + Resumed (%1) - + Active (%1) - + Aktive (%1) - + Inactive (%1) - + Inaktive (%1) - + Errored (%1) - + Fejlramte (%1) - TagFilterModel + TorrentContentModel - - Tags - Mærkater + + Name + Navn - - All - Alle + + Size + Størrelse - - Untagged - Uden mærkat + + Progress + Fremgang - - - TagFilterWidget - - Add tag... - Tilføj mærkat... + + Download Priority + - - Remove tag - Fjern mærkat + + Remaining + Tilbage + + + TorrentCreatorDlg - - Remove unused tags - Fjern ubrugte mærkater + + Select a folder to add to the torrent + Vælg en mappe der skal tilføjes til denne torrent - - Resume torrents - Genoptag torrents + + Select a file to add to the torrent + Vælg en fil der skal tilføjes til denne torrent - - Pause torrents - Sæt torrents på pause + + No input path set + Der er ikke sat nogen sti til input - - Delete torrents - Slet torrents + + Please type an input path first + Indtast venligst en input sti først - - New Tag - Nyt mærkat + + Select destination torrent file + Vælg destinations torrent fil - - Tag: - Mærkat: + + Torrent Files (*.torrent) + Torrentfiler (*.torrent) - - Invalid tag name - Ugyldigt mærkatnavn + + Torrent was created successfully: %1 + %1 is the path of the torrent + Torrent blev oprettet: %1 - - Tag name '%1' is invalid - Mærkatnavnet '%1' er ugyldigt + + + + Torrent creation + Torrent oprettelse - - Tag exists - Mærkatet findes + + Torrent creation was unsuccessful, reason: %1 + Oprettelse af torrent lykkedes ikke, begrundelse: %1 - - Tag name already exists. - Mærkatnavnet findes allerede. + + Created torrent file is invalid. It won't be added to download list. + Den oprettede torrent fil er ugyldig. Den vil ikke blive tilføjet til download listen. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Egenskaber for torrentkategori + + Name + i.e: torrent name + Navn - - Name: - Navn: + + Size + i.e: torrent size + Størrelse - - Save path: - Gemmesti: + + Done + % Done + Færdig - - Choose save path - Vælg gemmesti + + Status + Torrent status (e.g. downloading, seeding, paused) + Status - - New Category - Ny kategori + + Seeds + i.e. full sources (often untranslated) + Seeds - - Invalid category name - Ugyldigt kategorinavn + + Peers + i.e. partial sources (often untranslated) + Peers - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - Kategorinavn må ikke indeholde '\'. -Kategorinavn må ikke begynde/slutte med '/'. -Kategorinavn må ikke indeholde '//'-sekvens. + + Down Speed + i.e: Download speed + Hast. ned - - Category creation error - Fejl ved oprettelse af kategori + + Up Speed + i.e: Upload speed + Hast. op - - Category with the given name already exists. -Please choose a different name and try again. - Der findes allerede en kategori med det angivne navn. -Vælg venligst et andet navn og prøv igen. + + Ratio + Share ratio + Delingsforhold - - - TorrentContentModel - - Name - Navn + + ETA + i.e: Estimated Time of Arrival / Time left + ETA - - Size - Størrelse + + Category + Kategori - - Progress - Forløb + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Tilføjet den - - Download Priority - Downloadprioritet + + Completed On + Torrent was completed on 01/01/2010 08:00 + Færdig den - - Remaining - Tilbage + + Tracker + Tracker - - Availability - Tilgængelighed + + Down Limit + i.e: Download limit + Begræns hast. ned - - - TorrentCreatorDialog - - Torrent Creator - + + Up Limit + i.e: Upload limit + Begræns hast. op - - Select file/folder to share - + + Downloaded + Amount of data downloaded (e.g. in MB) + Modtaget - - Path: - + + Uploaded + Amount of data uploaded (e.g. in MB) + Sendt - - [Drag and drop area] + + Session Download + Amount of data downloaded since program open (e.g. in MB) - - - Select file + + Session Upload + Amount of data uploaded since program open (e.g. in MB) - - - Select folder - + + Remaining + Amount of data left to download (e.g. in MB) + Tilbage - - Settings - + + Time Active + Time (duration) the torrent is active (not paused) + Tid Brugt - - Piece size: - + + Save path + Torrent save path + Gem i - - Auto - + + Completed + Amount of data completed (e.g. in MB) + Færdig - - 16 KiB + + Ratio Limit + Upload share ratio limit - - 32 KiB + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole - - 64 KiB - + + Last Activity + Time passed since a chunk was downloaded/uploaded + Sidste Aktivitet - - 128 KiB - + + Total Size + i.e. Size including unwanted data + Samlet størrelse + + + TrackerFiltersList - - 256 KiB - + + All (0) + this is for the tracker filter + Alle (0) - - 512 KiB + + Trackerless (0) - - 1 MiB - + + Error (0) + Fejl (0) - - 2 MiB - + + Warning (0) + Advarsel (0) - - 4 MiB + + + Trackerless (%1) - - 8 MiB - + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - 16 MiB - + + + Error (%1) + Fejl (%1) - - 32 MiB - + + + Warning (%1) + Advarsel (%1) - - Calculate number of pieces: - - - - - Private torrent (Won't distribute on DHT network) - - - - - Start seeding immediately - - - - - Ignore share ratio limits for this torrent - - - - - Optimize alignment - - - - - Fields - - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - - - - Web seed URLs: - - - - - Tracker URLs: - - - - - Comments: - - - - - Source: - - - - - Progress: - Forløb: - - - - Create Torrent - - - - - - - Torrent creation failed - - - - - Reason: Path to file/folder is not readable. - - - - - Select where to save the new torrent - - - - - Torrent Files (*.torrent) - - - - - Reason: %1 - - - - - Reason: Created torrent is invalid. It won't be added to download list. - - - - - Torrent creator - - - - - Torrent created: - + + Resume torrents + Genoptag torrents - - - TorrentInfo - - File size exceeds max limit %1 - Filstørrelsen overstiger maks. grænse %1 + + Pause torrents + Pause torrents - - Torrent file read error: %1 - + + Delete torrents + Slet torrents - - Torrent file read error: size mismatch - + + + All (%1) + this is for the tracker filter + Alle (%1) - TorrentsController - - - Not contacted yet - Ikke kontaktet endnu - - - - Updating... - Opdaterer... - - - - Working - Arbejder - - - - Not working - Arbejder ikke - - - - Error: '%1' is not a valid torrent file. - Fejl: '%1' er ikke en gyldig torrent-fil. - + TrackerList - - - - - Torrent queueing must be enabled - Torrent-forespørgsel må ikke være aktiveret - - - - Save path cannot be empty - + + URL + URL - - - Category cannot be empty - + + Status + Status - - Unable to create category + + Received - - Unable to edit category - + + Seeds + Seeds - - Cannot make save path - + + Peers + Peers - - Cannot write to directory + + Downloaded - - WebUI Set location: moving "%1", from "%2" to "%3" - Webgrænseflade sæt placering: flytter "%1", fra "%2" til "%3" - - - - Incorrect torrent name - Ukorrekt torrentnavn - - - - - Incorrect category name - Ukorrekt kategorinavn - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - Alle (0) - - - - Trackerless (0) - Trackerløs (0) - - - - Error (0) - Fejl (0) - - - - Warning (0) - Advarsel (0) - - - - - Trackerless (%1) - Trackerløs (%1) - - - - - Error (%1) - Fejl (%1) - - - - - Warning (%1) - Advarsel (%1) - - - - Resume torrents - Genoptag torrents - - - - Pause torrents - Sæt torrents på pause - - - - Delete torrents - Slet torrents - - - - - All (%1) - this is for the tracker filter - Alle (%1) + + Message + Besked - - - TrackerListWidget - - + + Working - Arbejder + Arbejder - + Disabled - Deaktiveret + Frakoblet - + This torrent is private - + Denne torrent er privat - + Updating... - Opdaterer... + Opdaterer... - + Not working - Arbejder ikke + Arbejder ikke - + Not contacted yet - Ikke kontaktet endnu + Ikke kontaktet endnu - - - - - - - N/A - - + + Tracker URL: + Tracker URL: - + Tracker editing - - - - - Tracker URL: - + Tracker redigering - - + + Tracker editing failed - + Tracker redigering fejlede - + The tracker URL entered is invalid. - + Indtastet tracker URL er ugyldig. - + The tracker URL already exists. - + Tracker URL eksistere allerede. - + Add a new tracker... - + Tilføj ny tracker... - - Remove tracker - - - - + Copy tracker URL - + Kopier tracker URL - + Edit selected tracker URL - + Rediger valgte tracker URL - + Force reannounce to selected trackers - + Tvinger tracker opdatering til valgte trackere - + Force reannounce to all trackers - - - - - URL - + Opdatér tracker - - Status - Status - - - - Received - - - - - Seeds - - - - - Peers - Modparter - - - - Downloaded - Downloadet - - - - Message - - - - - Column visibility - Synlighed for kolonne + + Remove tracker + Slet tracker - TrackerLoginDialog - - - - Tracker authentication - - - - - Tracker: - - - - - Login - Login - - - - Username: - Brugernavn: - + TrackersAdditionDlg - - Password: - Adgangskode: + + Trackers addition dialog + Tilføjelse af ny tracker - - Log in - + + List of trackers to add (one per line): + Liste med trackere der skal tilføjes (en per linje): - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + µTorrent kompatible list URL - - List of trackers to add (one per line): - + + I/O Error + I/O Fejl - - µTorrent compatible list URL: - + + Error while trying to open the downloaded file. + Fejl i forsøg på at åbne den hentet fil. - + No change - + Ingen ændring - + No additional trackers were found. - + Ingen ekstra trackere blev fundet. - + Download error - Fejl ved download + Download fejl - + The trackers list could not be downloaded, reason: %1 @@ -9074,686 +8032,694 @@ TransferListDelegate - + Downloading Downloader - + Downloading metadata used when loading a magnet link - Downloader metadata + Henter metadata - + Allocating qBittorrent is allocating the files on disk - Allokerer + Allokere - + Paused - Sat på pause + Pauset - + Queued i.e. torrent is queued Sat i kø - + Seeding Torrent is complete and in upload-only mode Seeder - + Stalled Torrent is waiting for download to begin Gået i stå - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] Downloader - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] Seeder - + Checking Torrent local data is being checked Tjekker - + Queued for checking i.e. torrent is queued for hash checking - Sat i kø til tjek - - - - Checking resume data - used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - Tjekker genoptagelsesdata - - - - Completed - Færdige - - - - Moving - Torrent local data are being moved/relocated - Flytter - - - - Missing Files - Manglende filer - - - - Errored - torrent status, the torrent has an error - Fejlramte - - - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - %1 (seedet i %2) - - - - %1 ago - e.g.: 1h 20m ago - %1 siden - - - - TransferListFiltersWidget - - - Status - Status - - - - Categories - Kategorier - - - - Tags - Mærkater - - - - Trackers - Trackere - - - - TransferListModel - - - Name - i.e: torrent name - Navn - - - - Size - i.e: torrent size - Størrelse - - - - Done - % Done - - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Status - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - Modparter - - - - Down Speed - i.e: Download speed - Downloadhastighed - - - - Up Speed - i.e: Upload speed - Uploadhastighed - - - - Ratio - Share ratio - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - Kategori - - - - Tags - Mærkater - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Downloadet - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Uploadet - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) + + Checking resume data + used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - - Remaining - Amount of data left to download (e.g. in MB) - Tilbage + + Completed + Færdig - - Time Active - Time (duration) the torrent is active (not paused) - + + Missing Files + Mangler filer - - Save path - Torrent save path - + + Errored + torrent status, the torrent has an error + Fejlramt - - Completed - Amount of data completed (e.g. in MB) - Færdige + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) + %1 (seeded i %2) - - Ratio Limit - Upload share ratio limit - + + %1 ago + e.g.: 1h 20m ago + %1 siden + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + Status - - Last Activity - Time passed since a chunk was downloaded/uploaded - + + Categories + Kategorier - - Total Size - i.e. Size including unwanted data - + + Trackers + Trackere TransferListWidget - + Column visibility - Synlighed for kolonne + Kolonne synlighed - + Choose save path - Vælg gemmesti + Vælg hvor du vil gemme - + Torrent Download Speed Limiting - Begrænsning af hastighed ved download af torrent + Begrænsning af Torrent Download Hastighed - + Torrent Upload Speed Limiting - Begrænsning af hastighed ved upload af torrent + Begrænsning af Torrent Upload Hastighed - + Recheck confirmation - Bekræftelse for gentjek + Efterkontrollér iinformation - + Are you sure you want to recheck the selected torrent(s)? - Er du sikker på, at du vil gentjekke den valgte torrent(s)? + Er du sikker på at du vil efterkontrollér den valgte torrent(s)? - + Rename Omdøb - + New name: Nyt navn: - + Resume Resume/start the torrent Genoptag - + Force Resume Force Resume/start the torrent - Tving genoptag + Fremtving genoptag - + Pause Pause the torrent - Sæt på pause - - - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Sæt placering: flytter "%1", fra "%2" til "%3" - - - - Add Tags - Tilføj mærkater - - - - Remove All Tags - Fjern alle mærkater + Pause - - Remove all tags from selected torrents? - Fjern alle mærkater fra valgte torrents? + + New Category + Ny kategori - - Comma-separated tags: - Kommasepareret mærkater: + + Category: + Kategori: - - Invalid tag - Ugyldigt mærkat + + Invalid category name + Ugyldig kategori navn - - Tag name: '%1' is invalid - Mærkatnavnet '%1' er ugyldigt + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Kategorinavn må ikke indeholde »\«. +Kategorinavn må ikke starte/slutte med »/«. +Kategorinavn må ikke indeholde »//«-sekvens. - + Delete Delete the torrent Slet - + Preview file... - Forhåndsvis fil... + Smugkik... - + Limit share ratio... - Begræns deleforhold... + Begræns delingsforhold... - + Limit upload rate... - Begræns uploadhastighed... + Begræns hastighed op... - + Limit download rate... - Begræns downloadhastighed... + Begræns hastighed ned... - + Open destination folder - Åbn destinationsmappe + Åben destinationsmappe - + Move up i.e. move up in the queue Flyt op - + Move down i.e. Move down in the queue Flyt ned - + Move to top i.e. Move to top of the queue Flyt til toppen - + Move to bottom i.e. Move to bottom of the queue Flyt til bunden - + Set location... - Sæt placering... - - - - Force reannounce - Tving genannoncer + Sæt lokation... - + Copy name - Kopiér navn + Kopier navn - - Copy hash - Kopiér hash - - - + Download first and last pieces first - Start med at downloade første og sidste stykker + - + Automatic Torrent Management - Automatisk torrent-håndtering + - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - Automatisk tilstand betyder at diverse torrent-egenskaber (f.eks. gemmesti) vil blive besluttet af den tilknyttede kategori + - + Category Kategori - + New... New category... Ny... - + Reset Reset category Nulstil - - Tags - Mærkater - - - - Add... - Add / assign multiple tags... - Tilføj... - - - - Remove All - Remove all tags - Fjern alle - - - + Priority Prioritet - + Force recheck - Tving gentjek + Tvungen tjek - + Copy magnet link - Kopiér magnet-link + Kopier magnet link - + Super seeding mode - Super seeding-tilstand + Super seeding tilstand - + Rename... Omdøb... - + Download in sequential order - Download i fortløbende rækkefølge + Downlad i rækkefølge - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + Torrent Op/Ned Begrænsninger For Delingsforhold - - Use global share limit - + + Use global ratio limit + Brug globale begrænsninger for delingsforhold - - - + + + buttonGroup - - Set no share limit - + + Set no ratio limit + Sæt ingen begrænsninger + + + + Set ratio limit to + Sæt begrænsninger til + + + WebApplication - - Set share limit to + + Incorrect category name + + + WebUI - - ratio + + The Web UI is listening on port %1 - - minutes + + Web UI Error - Unable to bind Web UI to port %1 + + + about - - No share limit method selected + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - Please select a limit method first + + Copyright %1 2006-2016 The qBittorrent project + + + Home Page: + Hjemmeside: + + + + Forum: + Forum: + + + + Bug Tracker: + Bug Tracker: + - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - + + Add Peers + Tilføj modparter - - Python not detected - + + List of peers to add (one per line): + Modpartliste til tilføjelse (en per linje): + + + + Format: IPv4:port / [IPv6]:port + Format: IPv4:port / [IPv6]:port - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - Uacceptabel filtype. Kun almindelig fil er tilladt. + + + Tracker authentication + Godkendelse af tracker - - Symlinks inside alternative UI folder are forbidden. - Symlinks i alternativ brugerflademappe er forbudt. + + Tracker: + Tracker: - - Exceeded the maximum allowed file size (%1)! - Den maksimale filstørrelse er oversteget (%1)! + + Login + Login - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - Webgrænseflade: Origin-header og target-oprindelse matcher ikke! Kilde-IP: '%1'. Origin-header: '%2'. Target-oprindelse: '%3' + + Username: + Brugernavn: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - Webgrænseflade: Referer-header og target-oprindelse matcher ikke! Kilde-IP: '%1'. Referer-header: '%2'. Target-oprindelse: '%3' + + Password: + Kodeord: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - Webgrænseflade: Ugyldig host-header, port matcher ikke. Anmodningens kilde-IP: '%1'. Serverport: '%2'. Modtog host-header: '%3' + + Log in + Log på - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - Webgrænseflade: Ugyldig host-header. Anmodningens kilde-IP: '%1'. Modtog host-header: '%2' + + Cancel + Annuller - WebUI + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + Bekræft sletning - qBittorrent + + + + Remember choice + Husk valg + + + + Also delete the files on the hard disk + Slet også filerne på diskdrevet + + + + confirmShutdownDlg + + + Don't show again + Vis ikke igen + + + + createTorrentDialog - - Web UI: HTTPS setup successful - Webgrænseflade: HTTPS-opsætning lykkedes + + Cancel + Annuller + + + + Torrent Creation Tool + Værktøj: Opret torrent + + + + Torrent file creation + Torrent fil oprettelse + + + + Add file + Tilføj fil + + + + Add folder + Tilføj mappe + + + + File or folder to add to the torrent: + Fil eller mappe der skal tilføjes til denne torrent: + + + + Tracker URLs: + Tracker URLs: + + + + Web seeds urls: + + + + + Comment: + Kommentar: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + + + + + Piece size: + Delstørrelse: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + Auto + + + + Private (won't be distributed on DHT network if enabled) + Privat (vil ikke blive distribueret på DHT netværket hvis dette er slået til) + + + + Start seeding after creation + Start seed efter oprettelse + + + + Ignore share ratio limits for this torrent + Ignorer regler for delingsforhold for denne torrent + + + + Create and save... + Opret og gem... + + + + Progress: + Fremgang: + + + + downloadFromURL + + + Add torrent links + Tilføj torrent links + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + En per linje (HTTP links, Magnet links og info-hashes er supporteret) + + + + Download + Hent - - Web UI: HTTPS setup failed, fallback to HTTP - Webgrænseflade: HTTPS-opsætning mislykkedes, falder tilbage til HTTP + + Cancel + Annuller + + + + Download from urls + Hent fra url(er) + + + + No URL entered + Der er ikke indtastet nogen URL - - Web UI: Now listening on IP: %1, port: %2 - Webgrænseflade: Lytter nu på IP: %1, port: %2 + + Please type at least one URL. + Indtast venligst mindst en URL. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Webgrænseflade: Kan ikke binde til IP: %1, port: %2. Årsag: %3 + + Crash info + Crash info fsutils - + + + + + Downloads Downloads @@ -9761,100 +8727,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) - KiB + KB - + MiB mebibytes (1024 kibibytes) - MiB + MB - + GiB gibibytes (1024 mibibytes) - GiB + GB - + TiB tebibytes (1024 gibibytes) - TiB + TB - + PiB pebibytes (1024 tebibytes) - PiB + - + EiB exbibytes (1024 pebibytes) - EiB + + + + + Python not detected + Python blev ikke fundet + + + + Python version: %1 + Pythonversion: %1 - + /s per second /s - + %1h %2m e.g: 3hours 5minutes - %1 t %2 m + %1h %2m - + %1d %2h e.g: 2days 10hours - %1 d %2 t + %1d %2h - + Unknown Unknown (size) Ukendt - + qBittorrent will shutdown the computer now because all downloads are complete. - qBittorrent vil nu lukke computeren da alle downloads er færdige. + qBittorrent lukker nu komputeren fordi alle downloads er færdige. - + < 1m < 1 minute < 1 m - + %1m e.g: 10minutes - %1 m + %1m + + + + Working + Arbejder + + + + Updating... + Opdatere... + + + + Not working + Virker ikke + + + + Not contacted yet + Ingen kontakt endnu preview - + Preview selection - Forhåndsvis valgte + Smugkig valgte - + The following files support previewing, please select one of them: - Følgende filer understøtter forhåndsvisning, vælg venligst en af dem: + Følgende filer understøtter smugkik, vælg en af dem: + + + + Preview + Smugkig + + + + Cancel + Annuller diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_de.ts qbittorrent-3.3.15/src/lang/qbittorrent_de.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_de.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_de.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent Über qBittorrent - + About Über - + Author Autor - - Current maintainer - Derzeitiger Betreuer - - - - Greece - Griechenland - - - - + + Nationality: Nationalität: - - + + + Name: + Name: + + + + E-mail: E-Mail: - - - Name: - Name: + + Greece + Griechenland - - Original author - Ursprünglicher Entwickler + + Current maintainer + Derzeitiger Betreuer - - France - Frankreich + + Original author + Ursprünglicher Entwickler - + Special Thanks Besonderen Dank - + Translators Übersetzer - - License - Lizenz - - - + Libraries Bibliotheken - + qBittorrent was built with the following libraries: - qBittorrent wurde unter Verwendung folgender Bibliotheken erstellt: - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - Ein fortschrittlicher BitTorrent-Client erstellt in C++ und basierend auf dem Qt Toolkit sowie libtorrent-rasterbar. - - - - Copyright %1 2006-2018 The qBittorrent project - Copyright %1 2006-2018 - Das qBittorrent-Projekt - - - - Home Page: - Webseite: + qBittorrent wurde mit folgenden Bibliotheken erstellt: - - Forum: - Forum: + + France + Frankreich - - Bug Tracker: - Bugtracker: + + License + Lizenz @@ -115,57 +90,67 @@ Speichern in - + + Browse... + Durchsuchen ... + + + + Set as default save path + Als Standardspeicherpfad festlegen + + + Never show again - Nicht wieder anzeigen + Nie wieder anzeigen - + Torrent settings Torrent-Einstellungen - + Set as default category Als Standard-Kategorie festlegen - + Category: Kategorie: - + Start torrent Torrent starten - + Torrent information Torrent-Information - + Skip hash check Prüfsummenkontrolle überspringen - + Size: Größe: - + Hash: Hash: - + Comment: Kommentar: - + Date: Datum: @@ -190,117 +175,89 @@ Automatisch - - Remember last used save path - Behalte letzten Speicherpfad - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog Wenn ausgewählt, wird die .torrent-Datei unabhängig von den Einstellungen auf der 'Download'-Seite NICHT gelöscht. - + Do not delete .torrent file .torrent-Datei nicht löschen - - Create subfolder - Erstelle Unterordner - - - - Download in sequential order - Der Reihe nach downloaden - - - - Download first and last pieces first - Erstes und letztes Teil zuerst laden - - - + Normal Normal - + High Hoch - + Maximum Maximum - + Do not download Nicht herunterladen - - - + + + I/O Error - I/O-Fehler + I/O Fehler - + Invalid torrent Ungültiger Torrent - - Renaming - Umbenennen - - - - - Rename error - Fehler beim Umbenennen - - - - The name is empty or contains forbidden characters, please choose a different one. - Kein Name eingegeben oder der Name enthält ungültige Zeichen - bitte anderen Namen wählen. + + + + + Already in download list + Bereits in der Downloadliste - + Not Available This comment is unavailable Nicht verfügbar - + Not Available This date is unavailable Nicht verfügbar - + Not available Nicht verfügbar - + Invalid magnet link Ungültiger Magnet-Link - + The torrent file '%1' does not exist. Die Torrent-Datei '%1' existiert nicht. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. Die Torrent-Datei '%1' konnte nicht von der Festplatte gelesen werden, eventuell wegen fehlender Systemrechte. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ Grund: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torrent befindet sich bereits in der Downloadliste. Tracker wurden nicht zusammengeführt, da es sich um einen privaten Torrent handelt. + + + + Torrent is already in download list. Trackers were merged. + Torrent befindet sich bereits in der Downloadliste. Tracker wurden zusammengeführt. + + + + + Cannot add torrent + Torrent konnte nicht hinzugefügt werden + + + + Cannot add this torrent. Perhaps it is already in adding state. + Torrent konnte nicht hinzugefügt werden. Vielleicht wird er gerade hinzugefügt. + + + This magnet link was not recognized Dieser Magnet-Link wurde nicht erkannt - + + Magnet link is already in download list. Trackers were merged. + Magnet-Link befindet sich bereits in der Downloadliste. Tracker wurden zusammengeführt. + + + + Cannot add this torrent. Perhaps it is already in adding. + Dieser Torrent konnte nicht hinzugefügt werden. Vielleicht wird er gerade hinzugefügt. + + + Magnet link Magnet-Link - + Retrieving metadata... Frage Metadaten ab ... - + Not Available This size is unavailable. Nicht verfügbar - + Free space on disk: %1 Freier Platz auf der Festplatte: %1 - + + Choose save path - Speicherort wählen - - - - - - - - - Torrent is already present - Dieser Torrent ist bereits vorhanden - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - Torrent '%1' befindet sich bereits in der Liste der Downloads. Tracker wurden nicht zusammengeführt, da es sich um einen privaten Torrent handelt. - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - Torrent '%1' befindet sich bereits in der Liste der Downloads. Tracker wurden zusammengeführt. + Speicherpfad auswählen - - Torrent is already queued for processing. - Dieser Torrent befindet sich bereits in der Warteschlange. + + Rename the file + Datei umbenennen - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - Magnet-Link '%1' befindet sich bereits in der Download-Liste. Tracker wurden zusammengeführt. + + New name: + Neuer Name: - - Magnet link is already queued for processing. - Dieser Magnet-Link befindet sich bereits in der Warteschlange. + + + The file could not be renamed + Die Datei konnte nicht umbenannt werden - - New name: - Neuer Name: + + This file name contains forbidden characters, please choose a different one. + Der Dateiname enthält ungültige Zeichen - bitte einen anderen Namen wählen. - - + + This name is already in use in this folder. Please use a different name. Der Dateiname wird in diesem Verzeichnis bereits verwendet - bitte einen anderen Namen wählen. - + The folder could not be renamed Das Verzeichnis konnte nicht umbenannt werden - + Rename... Umbenennen ... - + Priority Priorität - + Invalid metadata Ungültige Metadaten - + Parsing metadata... Analysiere Metadaten ... - + Metadata retrieval complete - Abfrage der Metadaten komplett + Abfrage Metadaten komplett - + Download Error Downloadfehler @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Größe des Plattencache zum Schreiben + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Ausgehende Ports (Min) [0: Deaktiviert] - + Outgoing ports (Max) [0: Disabled] Ausgehende Ports (Max) [0: Deaktiviert] - + Recheck torrents on completion Torrents nach Abschluss der Übertragung erneut prüfen - + Transfer list refresh interval Intervall zum Auffrischen der Transfer-Liste - + ms milliseconds ms - + Setting Einstellung - + Value Value set for this setting Wert - - - (disabled) - (deaktiviert) - - - + (auto) (automatisch) - - min - minutes - Min. - - - + All addresses Alle Adressen - + qBittorrent Section qBittorrent-Abschnitt - - + + Open documentation Dokumentation öffnen - + libtorrent Section libtorrent-Abschnitt - - Asynchronous I/O threads - Asynchrone E/A-Threads - - - - Disk cache - Festplattencache - - - + s seconds s - + Disk cache expiry interval Ablauf-Intervall für Disk-Cache - + Enable OS cache Systemcache aktivieren - - Guided read cache - Gesteuerter Lese-Cache - - - - Coalesce reads & writes - Verbundene Schreib- u. Lesezugriffe - - - - Send upload piece suggestions - Sende Empfehlungen für Upload-Teil - - - - - KiB - KiB - - - - Send buffer watermark - Schwellenwert für Sendepuffer - - - - Send buffer low watermark - Schwellenwert für niedrigen Sendepuffer - - - - Send buffer watermark factor - Faktor für Schwellenwert bei Sendepuffer - - - - Prefer TCP - TCP bevorzugen - - - - Peer proportional (throttles TCP) - Gleichmässig f. Peers (drosselt TCP) - - - - Allow multiple connections from the same IP address - Erlaube Mehrfachverbindungen von der gleichen IP-Adresse + + m + minutes + m - + Resolve peer countries (GeoIP) Herkunftsländer der Peers auflösen (GeoIP) - + Resolve peer host names Hostnamen der Peers auflösen - + Strict super seeding Striktes Super Seeding - + Network Interface (requires restart) Netzwerk Interface (Neustart benötigt) - + Optional IP Address to bind to (requires restart) Optionale IP-Adresse zum Verwenden (erfordert Neustart) - + Listen on IPv6 address (requires restart) Auf IPv6-Adressen lauschen (Neustart benötigt) - + Display notifications Benachrichtigungen anzeigen - + Display notifications for added torrents Benachrichtigungen für hinzugefügte Torrents anzeigen - + Download tracker's favicon Das Tracker-Favicon herunterladen - - Save path history length - Länge der Speicherpfad-Historie - - - - Fixed slots - Feste Slots - - - - Upload rate based - Basierend auf Uploadrate - - - - Upload slots behavior - Verhalten f. Upload-Slots - - - - Round-robin - Ringverteilung - - - - Fastest upload - Schnellster Upload - - - - Anti-leech - Gegen Sauger - - - - Upload choking algorithm - Regel f. Upload-Drosselung - - - + Confirm torrent recheck Überprüfung des Torrents bestätigen - - Confirm removal of all tags - Wirklich alle Tags entfernen? + Exchange trackers with other peers + Tracker mit anderen Peers austauschen - - Always announce to all trackers in a tier - Immer bei allen Trackern einer Ebene anmelden + + Always announce to all trackers + Immer bei allen Trackern anmelden - - Always announce to all tiers - Immer bei allen Ebenen anmelden - - - + Any interface i.e. Any network interface Beliebiges Interface - + Save resume data interval How often the fastresume file is saved. Speicherintervall für Fortsetzungsdaten - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - %1-TCP Algorithmus f. gemischten Modus - - - + Maximum number of half-open connections [0: Unlimited] Maximale Anzahl halboffener Verbindungen [0: Unbegrenzt] - + IP Address to report to trackers (requires restart) Diese IP Adresse bei Trackern angeben (Neustart benötigt) - + Enable embedded tracker Eingebetteten Tracker aktivieren - + Embedded tracker port Port des eingebetteten Trackers - + Check for software updates Auf Softwareaktualisierungen prüfen - + Use system icon theme Systemsymbolthema verwenden @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 gestartet - + Torrent: %1, running external program, command: %2 Torrent: %1, externes Programm wird ausgeführt, Befehl: %2 - - Torrent name: %1 - Name des Torrent: %1 - - - - Torrent size: %1 - Größe des Torrent: %1 - - - - Save path: %1 - Speicherpfad: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Der Torrent wurde in %1 heruntergeladen. - - - - Thank you for using qBittorrent. - Danke für die Benutzung von qBittorrent. - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' wurde vollständig heruntergeladen + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrent: %1, Befehl zur Ausführung vom externen Programm ist zu lang (Länge > %2), Ausführung fehlgeschlagen. - + Torrent: %1, sending mail notification Torrent: %1, Mailnachricht wird versendet - + Information Informationen - - To control qBittorrent, access the Web UI at %1 - Um qBittorrent zu steuern benutze das Webinterface unter %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + Sie können qBittorrent mit dem Webinterface unter http://localhost:%1 steuern - + The Web UI administrator user name is: %1 Benutzername des Webinterface-Administrators: %1 - + The Web UI administrator password is still the default one: %1 Das Passwort des Webinterface-Administrators ist immer noch die Standardeinstellung: %1 - + This is a security risk, please consider changing your password from program preferences. Dies ist eine Sicherheitslücke - bitte das Passwort über die Programmeinstellungen ändern. - + Saving torrent progress... Torrent-Fortschritt wird gespeichert - - - Portable mode and explicit profile directory options are mutually exclusive - Die Optionen für portable Installation und explizite Profilordner schließen sich gegenseitig aus - - - - Portable mode implies relative fastresume - Die portable Installation bedeutet eine relative Fortsetzungsdatei - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - WebAPI fehlerhafter Login. Grund: IP wurde gebannt, IP: %1, Benutzername: %2 - - - - Your IP address has been banned after too many failed authentication attempts. - Ihre IP Adresse wurde nach zu vielen fehlerhaften Authentisierungversuchen gebannt. - - - - WebAPI login success. IP: %1 - WebAPI erfolgreicher Login. IP: %1 - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - WebAPI fehlerhafter Login. Grund: ungültige Anmeldeinformationen, Zugriffsversuche: %1, IP: %2, Benutzername: %3 - AutomatedRssDownloader - + Save to: Speichern in: @@ -861,817 +658,680 @@ RSS Downloader - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - Das automatische Herunterladen von RSS-Torrents ist jetzt deaktiviert! Es kann in den Einstellungen wieder aktiviert werden. + + Enable Automated RSS Downloader + Automatisierten RSS Downloader aktivieren - + Download Rules Downloadregeln - + Rule Definition Regeldefinition - + Use Regular Expressions Reguläre Ausdrücke verwenden - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - Der Smart-Folgenfilter überprüft die Folgennummer um das doppelte Herunterladen zu vermeiden. -Er unterstützt die Formate: S01E01, 1x1, 2017.01.01 und 01.01.2017 (Datums-Formate werden auch unterstützt, allerdings als Trennung) - - - - Use Smart Episode Filter - Verwende den Smart-Folgenfilter - - - + Must Contain: Enthält: - + Must Not Contain: Enthält nicht: - + Episode Filter: Folgenfilter: - + Assign Category: Kategorie zuweisen: - + Save to a Different Directory In ein anderes Verzeichnis speichern - + Ignore Subsequent Matches for (0 to Disable) ... X days Ignoriere nachfolgende Übereinstimmungen für (0 zum Deaktivieren) - + Disabled - Deaktiviert + Deaktiviert - + days Tage - + Add Paused: Pausiert hinzufügen: - + Use global settings Globale Einstellungen verwenden - + Always Immer - + Never Nie - + Apply Rule to Feeds: Regeln auf Feeds anwenden: - + Matching RSS Articles Übereinstimmende RSS Artikel - + &Import... &Importieren... - + &Export... &Exportieren... - + Matches articles based on episode filter. Wählt Artikel gemäß Folgenfilter aus. - + Example: Beispiel: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match passt zu 2, 5, 8 bis 15, 30 und kommenden Folgen von Staffel eins - + Episode filter rules: Folgenfilterregeln: - + Season number is a mandatory non-zero value - Staffel-Nummer ist zwingend ein Wert ungleich Null + Staffel-Nummer ist zwingend eine Ganzzahl größer Null + + + Episode number is a mandatory non-zero value + Folgen-Nummer ist zwingend eine Zahl über Null - + Filter must end with semicolon Filter müssen mit einem Strichpunkt enden - + Three range types for episodes are supported: Drei Bereichstypen für Folgen werden unterstützt: - + Single number: <b>1x25;</b> matches episode 25 of season one Einzeln: <b>1x25;</b> passt zur Folge 25 von Staffel eins - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Bereich: <b>1x25-40;</b> passt zu den Folgen 25 bis 40 von Staffel eins - - Episode number is a mandatory positive value - Folgen-Nummer ist zwingend ein positiver Wert - - - - Rules - Regeln + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Endlos: <b>1x25-;</b> passt zu allen Folgen beginnend mit 25 von Staffel eins - - Rules (legacy) - Regeln (Historie) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Endloser Bereich: <b>1x25-;</b> passt zu 25 Folgen und allen folgenden Folgen von Staffel eins sowie aller folgenden Folgen weiterer Staffeln + - + Last Match: %1 days ago Letzte Übereinstimmung: vor %1 Tagen - + Last Match: Unknown Letzte Übereinstimmung: Unbekannt - + New rule name Name der neuen Regel - + Please type the name of the new download rule. Bitte einen neuen Namen für die Downloadregel eingeben. - - + + Rule name conflict Regelnamenskonflikt - - + + A rule with this name already exists, please choose another name. Eine Regel mit diesem Namen existiert bereits bitte einen anderen Namen wählen. - + Are you sure you want to remove the download rule named '%1'? Soll die Downloadregel '%1' wirklich entfernt werden? - + Are you sure you want to remove the selected download rules? Sollen die ausgewählten Downloadregeln wirklich entfernt werden? - + Rule deletion confirmation Regellöschung bestätigen - + Destination directory Zielverzeichnis - + Invalid action Ungültige Aktion - + The list is empty, there is nothing to export. Die Liste ist leer, es gibt nichts zu exportieren. - - Export RSS rules - RSS-Regeln exportieren + + Where would you like to save the list? + Wohin soll die Liste gespeichert werden? - - + + Rules list (*.rssrules) + Regelliste (*.rssrules) + + + I/O Error - I/O Fehler + E/A-Fehler - - Failed to create the destination file. Reason: %1 - Fehler beim Erstellen der Zieldatei. Grund: %1 + + Failed to create the destination file + Fehler beim Erstellen der Zieldatei - - Import RSS rules - RSS-Regeln importieren + + Please point to the RSS download rules file + Bitte die RSS-Downloadregeldatei angeben - - Failed to open the file. Reason: %1 - Fehler beim Öffnen der Datei. Grund: %1 + + Rules list + Regelliste - + Import Error Fehler beim Import - - Failed to import the selected rules file. Reason: %1 - Import der ausgewählten Regeldatei fehlgeschlagen. Grund: %1 + + Failed to import the selected rules file + Import der ausgewählten Regeldatei fehlgeschlagen - + Add new rule... Neue Regel hinzufügen ... - + Delete rule Regel löschen - + Rename rule... Regel umbenennen ... - + Delete selected rules Ausgewählte Regeln löschen - - Clear downloaded episodes... - Entferne bereits heruntergeladene Folgen... - - - + Rule renaming Regelumbenennung - + Please type the new rule name Bitte einen neuen Namen für die Regel eingeben - - Clear downloaded episodes - Entferne bereits heruntergeladene Folgen - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - Soll wirklich die Liste mit heruntergeladenen Folgen für die gewählte Regel entfernt werden? - - - - Regex mode: use Perl-compatible regular expressions - Regex-Modus: Perl-kompatible reguläre Ausdrücke verwenden - - - - - Position %1: %2 - Position %1: %2 + + Regex mode: use Perl-like regular expressions + Regex-Modus: Perl-artige Reguläre Ausdrücke verwenden - + Wildcard mode: you can use - Platzhaltermodus: Sie können Folgendes verwenden + - + ? to match any single character - ? um mit irgendeinem Zeichen übereinzustimmen + - + * to match zero or more of any characters - * um mit keinem oder irgendwelchen Zeichen übereinzustimmen + - + Whitespaces count as AND operators (all words, any order) - Leerzeichen zählen als AND-Operatoren (alle Wörter, beliebige Reihenfolge) + - + | is used as OR operator - | wird als ODER-Operator verwendet + - + If word order is important use * instead of whitespace. - Wenn die Wortreihenfolge wichtig ist * anstelle von Leerzeichen verwenden + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Ein Ausdruck mit einer leeren Klausel %1 (z.B. %2) + - + will match all articles. - wird mit allen Artikeln übereinstimmen. + - + will exclude all articles. - wird alle Artikel ausschließen. - - - - BanListOptionsDialog - - - List of banned IP addresses - Liste der gebannten IP-Adressen - - - - Ban IP - IP bannen - - - - Delete - Löschen - - - - - Warning - Warnung + - - The entered IP address is invalid. - Die eingegebene IP-Adresse ist ungültig. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Platzhalter-Modus: Es können folgende Platzhalter verwendet werden<ul><li>? um ein einzelnes Zeichen zu matchen</li><li>* um keine oder mehrere Zeichen zu matchen</li><li>Leerzeichen werden als UND-Operator gewertet</li></ul> - - The entered IP is already banned. - Die eingegebene IP-Adresse ist bereits gebannt. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Platzhalter-Modus: Es können folgende Platzhalter verwendet werden<ul><li>? um ein einzelnes Zeichen zu matchen</li><li>* um keine oder mehrere Zeichen zu matchen</li><li>| wird als ODER-Operator gewertet</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support Neustart erforderlich, um PeX-Unterstützung umzuschalten - - Could not get GUID of configured network interface. Binding to IP %1 - Konnte GUID der eingestellten Netzwerkadresse nicht erhalten. Stelle IP auf %1 - - - + Embedded Tracker [ON] Eingebetteter Tracker [EIN] - + Failed to start the embedded tracker! Starten des eingebetteten Trackers fehlgeschlagen! - + Embedded Tracker [OFF] Eingebetteter Tracker [AUS] - - System network status changed to %1 - e.g: System network status changed to ONLINE + + '%1' reached the maximum ratio you set. Removing... + '%1' hat das festgelegte maximale Verhältnis erreicht. Wird entfernt ... + + + + '%1' reached the maximum ratio you set. Pausing... + '%1' hat das festgelegte maximale Verhältnis erreicht. Wird angehalten ... + + + + System network status changed to %1 + e.g: System network status changed to ONLINE Systemnetzwerkstatus auf %1 geändert - + ONLINE ONLINE - + OFFLINE OFFLINE - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding Die Netzwerk-Konfiguration von %1 hat sich geändert die Sitzungsbindung wird erneuert - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. Die eingestellte Netzwerkadresse %1 ist ungültig. - - + Encryption support [%1] Verschlüsselungsunterstützung [%1] - - + FORCED ERZWUNGEN - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 ist keine gültige IP-Adresse und konnte nicht zu den gebannten Adressen hinzugefügt werden. - - - - + Anonymous mode [%1] Anonymer Modus [%1] - + Unable to decode '%1' torrent file. '%1' Torrentdatei konnte nicht dekodiert werden. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Rekursiver Download von Datei '%1', eingebettet in Torrent '%2' - + Queue positions were corrected in %1 resume files - Die Positionen innerhalb der Warteschlange wurde in %1 Fortsetzungsdateien korrigiert + - + Couldn't save '%1.torrent' '%1.torrent' konnte nicht gespeichert werden - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' wurde von der Übertragungsliste entfernt. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' wurde von der Übertragungsliste und von der Festplatte entfernt. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '%1' wurde von der Übertragungsliste aber die Dateien konten nicht gelöscht werden. Fehler: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. weil %1 deaktiviert ist. - + because %1 is disabled. this peer was blocked because TCP is disabled. weil %1 deaktiviert ist. - + URL seed lookup failed for URL: '%1', message: %2 URL-Überprüfung für die Seed-URL '%1' ist fehlgeschlagen; Grund: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent konnte nicht auf Interface %1 Port %2/%3 lauschen. Grund: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' wurde von der Transferliste und von der Festplatte entfernt. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' wurde von der Übertragungsliste entfernt. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Herunterladen von '%1' – bitte warten ... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent versucht auf Port %1 eines beliebigen Netzwerkadapters zu lauschen: %1 - + The network interface defined is invalid: %1 Der angegebene Netzwerkadapter ist ungültig: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent versucht auf Netzwerkadapter %1 Port %2 zu lauschen - - Peer ID: - Peer-ID: - - - - HTTP User-Agent is '%1' - HTTP Benutzer-Agent ist '%1' - - - - + DHT support [%1] DHT-Unterstützung [%1] - - - - - - - - - + + + + ON EIN - - - - - - - - - + + + + OFF AUS - - + Local Peer Discovery support [%1] Lokale Peers (LPD) finden [%1] - - PeX support [%1] - PeX-Unterstützung [%1] + Restart is required to toggle Tracker Exchange support + Ein Neustart ist erforderlich um die Unterstützung für den Trackeraustausch mit anderen Peers umzuschalten - - '%1' reached the maximum ratio you set. Removed. - '%1' hat das festgelegte maximale Verhältnis erreicht. Wird entfernt ... - - - - '%1' reached the maximum ratio you set. Paused. - '%1' hat das festgelegte maximale Verhältnis erreicht. Wird angehalten ... - - - - '%1' reached the maximum seeding time you set. Removed. - '%1' hat die festgelegte maximale Seedzeit erreicht. Wird entfernt ... - - - - '%1' reached the maximum seeding time you set. Paused. - '%1' hat die festgelegte maximale Seedzeit erreicht. Wird angehalten ... - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent konnte keine lokale %1-Adresse zum Lauschen finden - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent konnte nicht auf Port %1 eines beliebigen Netzwerkadapters lauschen. Grund: %2. - + Tracker '%1' was added to torrent '%2' Tracker '%1' wurde dem Torrent '%2' hinzugefügt - + Tracker '%1' was deleted from torrent '%2' Tracker '%1' wurde vom Torrent '%2' entfernt - + URL seed '%1' was added to torrent '%2' URL Seed '%1' wurde dem Torrent '%2' hinzugefügt - + URL seed '%1' was removed from torrent '%2' URL-Seed '%1' wurde vom Torrent '%2' entfernt - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Torrent %1 konnte nicht fortgesetzt werden. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Der IP-Filter wurde erfolgreich analysiert. Es wurden %1 Regeln angewendet. - + Error: Failed to parse the provided IP filter. Fehler: IP-Filter konnte nicht analysiert werden. - - '%1' restored. - 'torrent name' restored. - '%1' wiederhergestellt. - - - + Couldn't add torrent. Reason: %1 Der Torrent konnte nicht hinzugefügt werden. Grund: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' fortgesetzt. (Schnelles Fortsetzen) + + + '%1' added to download list. 'torrent name' was added to download list. - '%1' zur Liste der Downloads hinzugefügt. + '%1' der Downloadliste hinzugefügt. - + An I/O error occurred, '%1' paused. %2 Ein E/A-Fehler ist aufgetreten, '%1' angehalten. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Fehler beim Portmapping, Meldung: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Portmapping erfolgreich, Meldung: %1 - + due to IP filter. this peer was blocked due to ip filter. wegen IP-Filter. - + due to port filter. this peer was blocked due to port filter. wegen Port-Filter. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. auf Grund von Beschränkungen für den gemischten i2p-Modus. - + because it has a low port. this peer was blocked because it has a low port. weil der Port niedrig ist. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent lauscht erfolgreich auf Netzwerkadapter %1 Port %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 Externe IP: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - Erstellung der neuen Torrent-Datei fehlgeschlagen - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - Erste und letzte Teile zuerst laden: %1, Torrent: '%2' - - - - On - Ein - - - - Off - Aus - - - - Successfully moved torrent: %1. New path: %2 - Torrent %1 wurde erfolgreich verschoben. Neuer Pfad: %2 - - - + Could not move torrent: '%1'. Reason: %2 - Kann Torrent: '%1' nicht verschieben. Grund: %2 + Torrent '%1' konnte nicht verschoben werden. Grund: %2 - + File sizes mismatch for torrent '%1', pausing it. Dateigrößen des Torrent '%1' stimmen nicht überein, wird angehalten. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... Fortsetzungsdaten des Torrent '%1' wurden zurückgewiesen. Grund: '%2'. Prüfe erneut ... @@ -1679,19 +1339,19 @@ CategoryFilterModel - + Categories - Kategorien + Kategorien - + All - Alle + Alle - + Uncategorized - Ohne Kategorie + @@ -1699,42 +1359,147 @@ Add category... - Kategorie hinzufügen ... + Kategorie hinzufügen ... Add subcategory... - Unterkategorie hinzufügen ... + - Edit category... - Kategorie ändern ... + Remove category + Kategorie entfernen + + + + Remove unused categories + Unbenutzte Kategorien entfernen + + + + Resume torrents + Torrents fortsetzen + + + + Pause torrents + Torrents pausieren + + + + Delete torrents + Torrents löschen + + + + New Category + Neue Kategorie + + + + Category: + Kategorie: + + + + Invalid category name + Ungültiger Kategoriename + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Der Kategoriename darf '\' nicht enthalten. +Der Kategoriename darf nicht mit '/' beginnen oder enden. +Der Kategoriename darf die Zeichenkette '//' nicht enthalten. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Alle (0) + + + Uncategorized (0) + Ohne Kategorie (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Ohne Kategorie (%1) + + + Add category... + Kategorie hinzufügen ... - Remove category - Kategorie entfernen + Kategorie entfernen - Remove unused categories - Unbenutzte Kategorien entfernen + Unbenutzte Kategorien entfernen - Resume torrents - Torrents fortsetzen + Torrents fortsetzen - Pause torrents - Torrents pausieren + Torrents pausieren - Delete torrents - Torrents löschen + Torrents löschen + + + New Category + Neue Kategorie + + + Category: + Kategorie: + + + Invalid category name + Ungültiger Kategoriename + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Der Kategoriename darf '\' nicht enthalten. +Der Kategoriename darf nicht mit '/' beginnen oder enden. +Der Kategoriename darf die Zeichenkette '//' nicht enthalten. + + + All (%1) + this is for the category filter + Alle (%1) @@ -1774,106 +1539,58 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Löschen bestätigen - - - - Remember choice - Auswahl merken - - - - Also delete the files on the hard disk - Dateien auch von der Festplatte löschen - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? Soll '%1' wirklich aus der Transfer-Liste entfernt werden? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? Sollen diese %1 Torrents wirklich aus der Transfer-Liste entfernt werden? - DownloadFromURLDialog - - - Download from URLs - Von URLs laden - - - - Add torrent links - Torrent-Links hinzufügen - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - Ein Link pro Zeile (HTTP-Links, Magnet-Links und Info-Hashes werden unterstützt) - - - - Download - Herunterladen - - - - No URL entered - Keine URL eingegeben - - - - Please type at least one URL. - Bitte geben Sie mindestens eine URL an. - - - DownloadedPiecesBar - + White: Missing pieces Weiß: Fehlende Teile - + Green: Partial pieces Grün: Teilstücke - + Blue: Completed pieces Blau: Vollständige Teile - ExecutionLogWidget + ExecutionLog - + General Allgemein - + Blocked IPs Geblockte IPs - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked <font color='red'>%1</font> wurde geblockt %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned <font color='red'>%1</font> wurde gebannt @@ -1882,112 +1599,41 @@ FeedListWidget - + RSS feeds RSS-Feeds - - - Unread (%1) - Ungelesen (%1) + + Unread + Ungelesen FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - Fehler beim Versuch die Log-Datei zu öffnen. Protokollierung in die Log-Datei ist nicht möglich. - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - &Durchsuchen ... - - - - Choose a file - Caption for file open/save dialog - Datei wählen - - - - Choose a folder - Caption for directory open dialog - Verzeichnis wählen - - - - Any file - Jede Datei + + An error occured while trying to open the log file. Logging to file is disabled. + Beim Versuch die Protokolldatei zu öffnen ist ein Fehler aufgetreten. Die Protokollierung wird deaktiviert. FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. + + + + I/O Error: Could not open ip filter file in read mode. E/A-Fehler: Konnte IP-Filterdatei nicht im Lesemodus öffnen. - - - - IP filter line %1 is malformed. - IP-Filter in Zeile %1 hat falsches Format. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - IP-Filter in Zeile %1 hat falsches Format. Die Anfangs-IP des Bereichs hat falsches Format. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - IP-Filter in Zeile %1 hat falsches Format. Die End-IP des Bereichs hat falsches Format. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - IP-Filter in Zeile %1 hat falsches Format. Eine IP ist IPv4, die andere IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - IP-Filter Ausnahmefehler in Zeile %1. Ausnahme ist: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - %1 zusätzliche IP-Filter Analysefehler aufgetreten. - - - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. Syntax-Fehler: Die Filterdatei ist keine gültige PeerGuardian P2B-Datei. @@ -1995,395 +1641,472 @@ GeoIPDatabase - - + + Unsupported database file size. Nicht unterstützte Dateigröße der Datenbank. - + Metadata error: '%1' entry not found. Fehler in Metadaten: '%1'-Eintrag nicht gefunden. - + Metadata error: '%1' entry has invalid type. Fehler in Metadaten: '%1'-Eintrag ist ein ungültiger Typ. - + Unsupported database version: %1.%2 Nicht unterstützte Version der Datenbank: %1.%2 - + Unsupported IP version: %1 Nicht unterstützte IP-Version: %1 - + Unsupported record size: %1 Nicht unterstützte Speichergröße: %1 - + Invalid database type: %1 Ungültiger Datenbanktyp: %1 - + Database corrupted: no data section found. Fehlerhafte Datenbank: Kein Datenabschnitt gefunden. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - Die Http-Anforderung übersteigt Limit, schließe Socket. Grenze: %ld, IP: %s + + File + Datei - - Bad Http request, closing socket. IP: %s - Falsche Http-Anforderung, schließe Socket. IP: %s + + Edit + Bearbeiten - - - HttpServer - + + Help + Hilfe + + + Exit qBittorrent qBittorrent beenden - + Only one link per line Nur ein Link pro Zeile - + + Download + Herunterladen + + + Global upload rate limit must be greater than 0 or disabled. Die globale Begrenzung der Uploadrate muss größer als 0 sein oder deaktiviert werden. - + Global download rate limit must be greater than 0 or disabled. Die globale Begrenzung der Downloadrate muss größer als 0 sein oder deaktiviert werden. - + Alternative upload rate limit must be greater than 0 or disabled. Die alternative Begrenzung der Uploadrate muss größer als 0 sein oder deaktiviert werden. - + Alternative download rate limit must be greater than 0 or disabled. Die alternative Begrenzung der Downloadrate muss größer als 0 sein oder deaktiviert werden. - + Maximum active downloads must be greater than -1. Die Anzahl der maximal aktiven Downloads muss mindestens 0 sein. - + Maximum active uploads must be greater than -1. Die Anzahl der maximal aktiven Uploads muss mindestens 0 sein. - + Maximum active torrents must be greater than -1. Die Anzahl der maximal aktiven Torrents muss mindestens 0 sein. - + Maximum number of connections limit must be greater than 0 or disabled. Maximale Anzahl der Verbindungen muss größer als 0 sein oder deaktiviert werden. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Maximale Anzahl der Verbindungen pro Torrent muss größer als 0 sein oder deaktiviert werden. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Maximale Anzahle der Upload-Slots muss größer als 0 sein oder deaktiviert werden. - + Unable to save program preferences, qBittorrent is probably unreachable. Programmeinstellungen konnten nicht gespeichert werden – qBittorrent ist vermutlich nicht erreichbar. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent auf Freenode + + Language + Sprache - - Invalid category name: -Please do not use any special characters in the category name. - Bitte keine Sonderzeichen im Kategorienamen verwenden. + + The port used for incoming connections must be between 1 and 65535. + Der Port für eingehende Verbindungen muss zwischen 1 und 65535 liegen. - - Unknown - Unbekannt + + The port used for the Web UI must be between 1 and 65535. + Der Port für das Webinterface muss zwischen 1 und 65535 liegen. - - Hard Disk - Festplatte + + Unable to log in, qBittorrent is probably unreachable. + Fehler beim Einloggen – vermutlich ist qBittorrent nicht erreichbar. - - Share ratio limit must be between 0 and 9998. - Das Shareverhältnis muss zwischen 0 und 9998 sein. - - - - Seeding time limit must be between 0 and 525600 minutes. - Die Grenze für die Seedzeit muss zwischen 0 und 525600 Minuten liegen. - - - - The port used for incoming connections must be between 1 and 65535. - Der Port für eingehende Verbindungen muss zwischen 1 und 65535 liegen. - - - - The port used for the Web UI must be between 1 and 65535. - Der Port für das Webinterface muss zwischen 1 und 65535 liegen. - - - - Unable to log in, qBittorrent is probably unreachable. - Fehler beim Einloggen – vermutlich ist qBittorrent nicht erreichbar. - - - + Invalid Username or Password. Ungültiger Benutzername oder Passwort. - - Username - Benutzername - - - + Password Passwort - + Login Anmelden - + + Upload Failed! + Hochladen fehlgeschlagen! + + + Original authors Ursprüngliche Entwickler - + + Upload limit: + Grenze für Upload: + + + + Download limit: + Grenze für Download: + + + Apply Anwenden - + Add Hinzufügen - + + Category: + Kategorie: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Torrents hochladen - + + All + Alle + + + + Downloading + Herunterladen + + + + Seeding + Seede + + + + Completed + Abgeschlossen + + + + Resumed + Fortgesetzt + + + + Paused + Pausiert + + + + Active + Aktiv + + + + Inactive + Inaktiv + + + Save files to location: Datei(en) hierhin speichern: - + Cookie: Cookie: - + Type folder here Verzeichnisnamen eingeben - + + Run an external program on torrent completion + Externes Programm ausführen wenn Torrent fertiggestellt ist + + + + Enable bandwidth management (uTP) + Bandbreitenverwaltung aktivieren (uTP) + + + + Apply rate limit to uTP connections + Verhältnisbegrenzung für uTP-Verbindungen verwenden + + + + Alternative Global Rate Limits + Alternative globale Verhältnisbegrenzung + + + More information Mehr Informationen - + Information about certificates Information über Zertifikate - + Save Files to Dateien speichern in - - Set location - Speicherort setzen - - - - Limit upload rate - Uploadrate begrenzen + + Watch Folder + Überwache Verzeichnis - - Limit download rate - Downloadrate begrenzen + + Default Folder + Standard-Verzeichnis - - Rename torrent - Torrent umbenennen + + from + from time1 to time2 + von - - Unable to create category - + + to + from time1 to time2 + bis - + Other... Save Files to: Watch Folder / Default Folder / Other... Andere ... - + + Every day + Schedule the use of alternative rate limits on ... + Jeden Tag + + + + Week days + Schedule the use of alternative rate limits on ... + Wochentags + + + + Week ends + Schedule the use of alternative rate limits on ... + Wochenende + + + Monday Schedule the use of alternative rate limits on ... Montag - + Tuesday Schedule the use of alternative rate limits on ... Dienstag - + Wednesday Schedule the use of alternative rate limits on ... Mittwoch - + Thursday Schedule the use of alternative rate limits on ... Donnerstag - + Friday Schedule the use of alternative rate limits on ... Freitag - + Saturday Schedule the use of alternative rate limits on ... Samstag - + Sunday Schedule the use of alternative rate limits on ... Sonntag - + + Downloaded + Is the file downloaded or not? + Heruntergeladen + + + Logout Abmelden - + + Download from URLs + Von URLs laden + + + Download Torrents from their URLs or Magnet links Torrents von URL oder Magnet-Link herunterladen - + Upload local torrent Lokalen Torrent hochladen - + Are you sure you want to delete the selected torrents from the transfer list? Sollen die die ausgewählten Torrents wirklich aus der Transfer-Liste gelöscht werden? - + Save Speichern - + qBittorrent client is not reachable qBittorrent-Programm ist nicht erreichbar - - qBittorrent has been shutdown. - qBittorrent wurde beendet. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Liste der erlaubten IP-Subnets + + HTTP Server + HTTP-Server - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Beispiel: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Folgende Parameter werden unterstützt: - - Add subnet - Subnet hinzufügen + + Torrent path + Torrent-Pfad - - Delete - Löschen + + Torrent name + Torrent-Name - - Error - Fehler + + qBittorrent has been shutdown. + qBittorrent wurde beendet. + + + LineEdit - - The entered subnet is invalid. - Das eingegebene Subnet ist ungültig. + + Clear the text + Text löschen LogListWidget - + Copy Kopieren - + Clear Leeren @@ -2416,550 +2139,492 @@ Wenn &Downloads abgeschlossen sind - + &View &Ansicht - + &Options... &Optionen ... - + &Resume Fo&rtsetzen - + Torrent &Creator &Torrent-Ersteller - + Set Upload Limit... Upload-Limit festlegen - + Set Download Limit... Download-Limit festlegen - + Set Global Download Limit... Globales Download-Limit festlegen - + Set Global Upload Limit... Globales Upload-Limit festlegen - + Minimum Priority Niedrigste Priorität - + Top Priority Höchste Priorität - + Decrease Priority Priorität verringern - + Increase Priority Priorität erhöhen - - + + Alternative Speed Limits Alternative Geschwindigkeitsbegrenzungen - + &Top Toolbar Obere Werkzeugleis&te - + Display Top Toolbar Obere Werkzeugleiste anzeigen - - Status &Bar - Status &Bar - - - + S&peed in Title Bar &Geschwindigkeit in der Titelleiste - + Show Transfer Speed in Title Bar Übertragungsgeschwindigkeit in der Titelleiste anzeigen - + &RSS Reader &RSS Reader - + Search &Engine Suchmaschin&e - + L&ock qBittorrent qBitt&orrent sperren - + Do&nate! E&ntwicklung unterstützen! - - Close Window - Fenster schließen - - - + R&esume All Alle forts&etzen - + Manage Cookies... Cookies verwalten ... - + Manage stored network cookies Gespeicherte Netzwerk-Cookies verwalten ... - + Normal Messages Normale Meldungen - + Information Messages Informations-Meldungen - + Warning Messages Warnmeldungen - + Critical Messages Kritische Meldungen - + &Log Protoko&ll - + &Exit qBittorrent qBittorrent b&eenden - + &Suspend System &Standbymodus - + &Hibernate System &Ruhezustand - + S&hutdown System System &herunterfahren - + &Disabled &Deaktiviert - + &Statistics &Statistiken - + Check for Updates Auf Aktualisierungen prüfen - + Check for Program Updates Auf Programmaktualisierungen prüfen - + &About &Über - + &Pause &Pausieren - + &Delete &Löschen - + P&ause All A&lle anhalten - + &Add Torrent File... Torrent-D&atei hinzufügen... - + Open Öffnen - + E&xit &Beenden - + Open URL URL öffnen - + &Documentation &Dokumentation - + Lock Sperren - - - + + + Show Anzeigen - + Check for program updates Auf Programm-Updates prüfen - + Add Torrent &Link... Torrent-&Link hinzufügen... - + If you like qBittorrent, please donate! Bitte unterstützen Sie qBittorrent wenn es Ihnen gefällt! - - + Execution Log Ausführungs-Log - + Clear the password Passwort löschen - + Filter torrent list... Torrent-Liste filtern ... - + &Set Password Passwort fe&stlegen - - Preferences - Einstellungen - - - + &Clear Password Passwort lös&chen - + Transfers Übertragungen - - - qBittorrent is minimized to tray - qBittorrent wurde in die Statusleiste minimiert - - - - - - This behavior can be changed in the settings. You won't be reminded again. - Dieses Verhalten kann in den Einstellungen geändert werden. Es folgt kein weiterer Hinweis. - - - + Torrent file association Verknüpfung mit Torrent-Dateien - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent ist nicht die Standardapplikation um Torrent-Dateien oder Magnet-Links zu öffnen. Sollen Torrent-Dateien und Magnet-Links immer mit qBittorent geöffnet werden? - + Icons Only Nur Icons - + Text Only Nur Text - + Text Alongside Icons Text neben Symbolen - + Text Under Icons Text unter Symbolen - + Follow System Style - Dem Systemstil folgen + Systemstil folgen - - - + + + UI lock password Passwort zum Entsperren - - - + + + Please type the UI lock password: Bitte das Passwort für den gesperrten qBittorrent-Bildschirm eingeben: - + The password should contain at least 3 characters Das Passwort sollte aus mindestens drei Zeichen bestehen - + Password update Passwort aktualisieren - + The UI lock password has been successfully updated Das Passwort zum Sperren des qBittorrent-Bildschirms wurde erfolgreich aktualisiert - + Are you sure you want to clear the password? Soll das Passwort wirklich gelöscht werden? - - Use regular expressions - Reguläre Ausdrücke verwenden - - - + Search Suche - + Transfers (%1) Übertragungen (%1) - + Error Fehler - + Failed to add torrent: %1 Konnte Torrent nicht hinzufügen: %1 - + Torrent added Torrent hinzugefügt - + '%1' was added. e.g: xxx.avi was added. '%1' wurde hinzugefügt. - + Download completion Download beendet - + I/O Error i.e: Input/Output Error E/A-Fehler - + Recursive download confirmation Rekursiven Download bestätigen - + Yes Ja - + No Nein - + Never Niemals - + Global Upload Speed Limit Globale Begrenzung der Uploadgeschwindigkeit - + Global Download Speed Limit Globale Begrenzung der Downloadgeschwindigkeit - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent wurde soeben aktualisiert. Änderungen werden erst nach einem Neustart aktiv. - - - - qBittorrent is closed to tray - qBittorrent wurde in die Statusleiste geschlossen - - - - Some files are currently transferring. - Momentan werden Dateien übertragen. - - - - Are you sure you want to quit qBittorrent? - Sind Sie sicher, dass sie qBittorrent beenden möchten? - - - + &No &Nein - + &Yes &Ja - + &Always Yes &Immer ja - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - Konnte Python-Version nicht feststellen. Suchmaschine wurde deaktiviert. - - - + Old Python Interpreter Veralteter Python-Interpreter - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. Die installierte Version von Python (%1) ist veraltet. Für die Funktion der Suchmaschine muss mindestens auf die Version 2.7.9 / 3.3.0 aktualisiert werden. - + qBittorrent Update Available Aktualisierung von qBittorrent verfügbar - + + A new version is available. +Do you want to download %1? + Eine neue Version ist verfügbar. +Auf Version %1 aktualisieren? + + + Already Using the Latest qBittorrent Version - qBittorrent ist aktuell! + qBittorrent ist auf Letztstand! - + Undetermined Python version Unbekannte Version von Python - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. '%1' wurde heruntergeladen. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2968,158 +2633,154 @@ Ursache: '%2' - + The torrent '%1' contains torrent files, do you want to proceed with their download? Der Torrent '%1' enthält weitere Torrent Dateien. Sollen diese auch heruntergeladen werden? - + Couldn't download file at URL '%1', reason: %2. Konnte Datei von URL '%1' nicht laden. Grund: '%2'. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin Python gefunden in %1: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + Konnte Python-Version nicht feststellen (%1). Suchmaschine wurde deaktiviert. + + + + Missing Python Interpreter Fehlender Python-Interpreter - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Python wird benötigt um die Suchmaschine benutzen zu können, scheint aber nicht installiert zu sein. Soll Python jetzt installiert werden? - + Python is required to use the search engine but it does not seem to be installed. Python wird benötigt um die Suchmaschine benutzen zu können, scheint aber nicht installiert zu sein. - - A new version is available. - Eine neue Version ist verfügbar. - - - - Do you want to download %1? - Soll %1 heruntergeladen werden? - - - - Open changelog... - Öffne Änderungsindex ... - - - + No updates available. You are already using the latest version. - Keine Aktualisierung verfügbar, die -neueste Version ist bereits installiert. + Es ist keine Aktualisierung verfügbar da +bereits die neueste Version verwendet wird. - + &Check for Updates Auf Aktualisierungen prüfen - + Checking for Updates... Prüfe auf Aktualisierungen ... - + Already checking for program updates in the background Überprüfung auf Programm-Aktualisierungen läuft bereits im Hintergrund - + Python found in '%1' Python in '%1' gefunden - + Download error Downloadfehler - + Python setup could not be downloaded, reason: %1. Please install it manually. Python konnte nicht heruntergeladen werden; Grund: %1. Bitte manuell installieren. - - + + Invalid password Ungültiges Passwort - - - + + RSS (%1) RSS (%1) - + URL download error Fehler beim Laden der URL - + The password is invalid Das Passwort ist ungültig - - + + DL speed: %1 e.g: Download speed: 10 KiB/s DL-Geschw.: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s UL-Geschw.: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [D: %1, U: %2] qBittorrent %3 - + Hide Ausblenden - + Exiting qBittorrent Beende qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Zur Zeit werden Dateien übertragen. +Soll qBittorrent wirklich beendet werden? + + + Open Torrent Files Öffne Torrent-Dateien - + Torrent Files Torrent-Dateien - + Options were saved successfully. Einstellungen wurden erfolgreich gespeichert. @@ -3127,52 +2788,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. Der dynamische DNS-Eintrag wurde erfolgreich aktualisiert. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Dynamischer DNS Fehler: Der Dienst ist vorübergehend nicht erreichbar. Ein neuer Versuch wird in 30 Minuten gestartet. - + Dynamic DNS error: hostname supplied does not exist under specified account. Dynamischer DNS Fehler: Der Hostname existiert nicht für den angegebenen Account. - + Dynamic DNS error: Invalid username/password. Dynamischer DNS Fehler: Ungültiger Benutzername/Passwort. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Dynamischer DNS Fehler: qBittorrent wurde durch den Dienst geblacklisted. Bitte melden sie einen Bug unter http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Dynamischer DNS Fehler: Der Dienst hat %1 zurückgegeben. Bitte diesen Bug unter http://bugs.qbittorrent.org melden. - + Dynamic DNS error: Your username was blocked due to abuse. Dynamischer DNS Fehler: Der Benutzername wurde wegen Missbrauch geblockt. - + Dynamic DNS error: supplied domain name is invalid. Dynamischer DNS Fehler: Angegebener Domainname ist ungültig. - + Dynamic DNS error: supplied username is too short. Dynamischer DNS Fehler: Angegebener Benutzername ist zu kurz. - + Dynamic DNS error: supplied password is too short. Dynamischer DNS Fehler: Angegebenes Passwort ist zu kurz. @@ -3180,1413 +2841,1303 @@ Net::DownloadHandler - + I/O Error E/A-Fehler - + The file size is %1. It exceeds the download limit of %2. Die Dateigröße beträgt %1. Sie überschreitet das Download-Limit von %2. - + Unexpected redirect to magnet URI. Unerwartete Weiterleitung zu Magnet-URI. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - Der Hostname konnte nicht gefunden werden (ungültiger Hostname) + + + GeoIP database loaded. Type: %1. Build time: %2. + GeoIP-Datenbank geladen. Typ: %1. Erstellungsdatum: %2. - - The operation was canceled - Der Vorgang wurde abgebrochen + + + Couldn't load GeoIP database. Reason: %1 + Konnte GeoIP-Datenbank nicht laden. Grund: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - Der Remote-Server hat die Verbindung beendet bevor die gesamte Antwort empfangen und verarbeitet werden konnte + + Venezuela, Bolivarian Republic of + Venezuela, Bolivarische Republik - - The connection to the remote server timed out - Die Verbindung zum Remote-Server ist abgelaufen + + Viet Nam + Vietnam - - SSL/TLS handshake failed - SSL/TLS Handshake fehlgeschlagen + + + N/A + N/V - - The remote server refused the connection - Der Remote-Server hat die Verbindung verweigert - - - - The connection to the proxy server was refused - Die Verbindung zum Proxy-Server wurde verweigert - - - - The proxy server closed the connection prematurely - Der Proxy-Server hat die Verbindung vorzeitig beendet - - - - The proxy host name was not found - Der Proxy-Hostname wurde nicht gefunden - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - Zeitüberschreitung beim Verbindungsaufbau mit dem Proxy oder der Proxy hat nicht in angemessener Zeit auf die Anfrage reagiert - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - Der Proxy benötigt Authentifizierung hat jedoch keine der angebotenen Zugangsdaten akzeptiert - - - - The access to the remote content was denied (401) - Der Zugriff auf den Inhalt wurde verweigert (401) - - - - The operation requested on the remote content is not permitted - Die angeforderte Operation auf rechnerferne Inhalte ist nicht gestattet - - - - The remote content was not found at the server (404) - Die rechnerfernen Inhalte wurde auf dem Server nicht gefunden (404) - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - Der Remote-Server benötigt Authentifizierung hat jedoch keine der angebotenen Zugangsdaten akzeptiert - - - - The Network Access API cannot honor the request because the protocol is not known - Die Network-Access-API konnte die Anfrage nicht bearbeiten wegen unbekanntem Protokoll. - - - - The requested operation is invalid for this protocol - Der angeforderte Vorgang ist für dieses Protokoll ungültig - - - - An unknown network-related error was detected - Ein unbekannter Netzwerk-Fehler ist aufgetreten - - - - An unknown proxy-related error was detected - Ein unbekannter Proxy-Fehler ist aufgetreten - - - - An unknown error related to the remote content was detected - Unbekannter Fehler in Zusammenhang mit dem Inhalt ist aufgetreten - - - - A breakdown in protocol was detected - Es ist eine Störung im Protokoll aufgetreten - - - - Unknown error - Unbekannter Fehler - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - GeoIP-Datenbank geladen. Typ: %1. Erstellungsdatum: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - Konnte GeoIP-Datenbank nicht laden. Grund: %1 - - - - Venezuela, Bolivarian Republic of - Venezuela, Bolivarische Republik - - - - Viet Nam - Vietnam - - - - - N/A - N/V - - - + Andorra Andorra - + United Arab Emirates Vereinigte Arabische Emirate - + Afghanistan Afghanistan - + Antigua and Barbuda Antigua und Barbuda - + Anguilla Anguilla - + Albania Albanien - + Armenia Armenien - + Angola Angola - + Antarctica Antarktika - + Argentina Argentinien - + American Samoa Amerikanisch-Samoa - + Austria Österreich - + Australia Australien - + Aruba Aruba - + Azerbaijan Aserbaidschan - + Bosnia and Herzegovina Bosnien und Herzegowina - + Barbados Barbados - + Bangladesh Bangladesch - + Belgium Belgien - + Burkina Faso Burkina Faso - + Bulgaria Bulgarien - + Bahrain Bahrain - + Burundi Burundi - + Benin Benin - + Bermuda Bermuda - + Brunei Darussalam Brunei - + Brazil Brasilien - + Bahamas Bahamas - + Bhutan Bhutan - + Bouvet Island Bouvetinsel - + Botswana Botswana - + Belarus Weißrussland - + Belize Belize - + Canada Kanada - + Cocos (Keeling) Islands Kokos-Inseln (Keeling-Inseln) - + Congo, The Democratic Republic of the Kongo - + Central African Republic Zentralafrikanische Republik - + Congo Kongo - + Switzerland Schweiz - + Cook Islands Cookinseln - + Chile Chile - + Cameroon Kamerun - + China China - + Colombia Kolumbien - + Costa Rica Costa Rica - + Cuba Kuba - + Cape Verde Kap Verde - + Curacao Curacao - + Christmas Island Weihnachtsinsel - + Cyprus Zypern - + Czech Republic Tschechien - + Germany Deutschland - + Djibouti Dschibuti - + Denmark Dänemark - + Dominica Dominica - + Dominican Republic Dominikanische Republik - + Algeria Algerien - + Ecuador Ecuador - + Estonia Estland - + Egypt Ägypten - + Western Sahara Westsahara - + Eritrea Eritrea - + Spain Spanien - + Ethiopia Äthiopien - + Finland Finnland - + Fiji Fidschi - + Falkland Islands (Malvinas) Falkland-Inseln - + Micronesia, Federated States of Mikronesien - + Faroe Islands Färöer-Inseln - + France Frankreich - + Gabon Gabun - + United Kingdom Vereinigtes Königreich - + Grenada Grenada - + Georgia Georgien - + French Guiana Französisch-Guayana - + Ghana Ghana - + Gibraltar Gibraltar - + Greenland Grönland - + Gambia Gambia - + Guinea Guinea - + Guadeloupe Guadeloupe - + Equatorial Guinea Äquatorialguinea - + Greece Griechenland - + South Georgia and the South Sandwich Islands Südgeorgien und die Südlichen Sandwichinseln - + Guatemala Guatemala - + Guam Guam - + Guinea-Bissau Guinea-Bissau - + Guyana Guyana - + Hong Kong Hongkong - + Heard Island and McDonald Islands Heard und die McDonaldinseln - + Honduras Honduras - + Croatia Kroatien - + Haiti Haiti - + Hungary Ungarn - + Indonesia Indonesien - + Ireland Irland - + Israel Israel - + India Indien - + British Indian Ocean Territory Das Britische Territorium im Indischen Ozean - + Iraq Irak - + Iran, Islamic Republic of Iran, Islamische Republik - + Iceland Island - + Italy Italien - + Jamaica Jamaika - + Jordan Jordanien - + Japan Japan - + Kenya Kenia - + Kyrgyzstan Kirgisistan - + Cambodia Kambodscha - + Kiribati Kiribati - + Comoros Komoren - + Saint Kitts and Nevis St. Kitts und Nevis - + Korea, Democratic People's Republic of Korea, Demokratische Volksrepublik - + Korea, Republic of Korea, Republik - + Kuwait Kuwait - + Cayman Islands Kaimaninseln - + Kazakhstan Kasachstan - + Lao People's Democratic Republic Laos - + Lebanon Libanon - + Saint Lucia St. Lucia - + Liechtenstein Liechtenstein - + Sri Lanka Sri Lanka - + Liberia Liberia - + Lesotho Lesotho - + Lithuania Litauen - + Luxembourg Luxemburg - + Latvia Lettland - + Morocco Marokko - + Monaco Monaco - + Moldova, Republic of Moldawien, Republik - + Madagascar Madagaskar - + Marshall Islands Marshallinseln - + Mali Mali - + Myanmar Myanmar - + Mongolia Mongolei - + Northern Mariana Islands Nördliche Marianen - + Martinique Martinique - + Mauritania Mauretanien - + Montserrat Montserrat - + Malta Malta - + Mauritius Mauritius - + Maldives Malediven - + Malawi Malawi - + Mexico Mexiko - + Malaysia Malaysia - + Mozambique Mosambik - + Namibia Namibia - + New Caledonia Neukaledonien - + Niger Niger - + Norfolk Island Norfolkinsel - + Nigeria Nigeria - + Nicaragua Nicaragua - + Netherlands Niederlande - + Norway Norwegen - + Nepal Nepal - + Nauru Nauru - + Niue Niue - + New Zealand Neuseeland - + Oman Oman - + Panama Panama - + Peru Peru - + French Polynesia Französisch-Polynesien - + Papua New Guinea Papua-Neuguinea - + Philippines Philippinen - + Pakistan Pakistan - + Poland Polen - + Saint Pierre and Miquelon Saint-Pierre und Miquelon - + Puerto Rico Puerto Rico - + Portugal Portugal - + Palau Palau - + Paraguay Paraguay - + Qatar Katar - + Reunion La Réunion - + Romania Rumänien - + Russian Federation Russische Föderation - + Rwanda Ruanda - + Saudi Arabia Saudi-Arabien - + Solomon Islands Salomonen - + Seychelles Seychellen - + Sudan Sudan - + Sweden Schweden - + Singapore Singapur - + Slovenia Slowenien - + Svalbard and Jan Mayen Spitzbergen (Inselgruppe) - + Slovakia Slowakei - + Sierra Leone Sierra Leone - + San Marino San Marino - + Senegal Senegal - + Somalia Somalia - + Suriname Suriname - + Sao Tome and Principe São Tomé und Príncipe - + El Salvador El Salvador - + Syrian Arab Republic Arabische Republik Syrien - + Swaziland Swasiland - + Turks and Caicos Islands Turks- und Caicosinseln - + Chad Tschad - + French Southern Territories Französische Süd- und Antarktisgebiete - + Togo Togo - + Thailand Thailand - + Tajikistan Tadschikistan - + Tokelau Tokelau - + Turkmenistan Turkmenistan - + Tunisia Tunesien - + Tonga Tonga - - Could not decompress GeoIP database file. - Konnte GeoIP-Datenbank nicht entpacken. + + Timor-Leste + Osttimor - - Timor-Leste - Osttimor - - - + Bolivia, Plurinational State of Bolivien, Plurinationaler Staat - + Bonaire, Sint Eustatius and Saba Besondere Gemeinden (Niederlande) - + Cote d'Ivoire Elfenbeinküste - + Libya Libyen - + Saint Martin (French part) Saint-Martin (französischer Teil) - + Macedonia, The Former Yugoslav Republic of Mazedonien, ehemalige jugoslawische Republik - + Macao Macau - + Pitcairn Pitcairn - + Palestine, State of Palästina - + Saint Helena, Ascension and Tristan da Cunha St. Helena, Ascension und Tristan da Cunha - + South Sudan Südsudan - + Sint Maarten (Dutch part) Sint Maarten (niederländischer Teil) - + Turkey Türkei - + Trinidad and Tobago Trinidad und Tobago - + Tuvalu Tuvalu - + Taiwan Taiwan - + Tanzania, United Republic of Tansania - + Ukraine Ukraine - + Uganda Uganda - + United States Minor Outlying Islands Kleinere Inselbesitzungen der Vereinigten Staaten - + United States Vereinigte Staaten - + Uruguay Uruguay - + Uzbekistan Usbekistan - + Holy See (Vatican City State) Heiliger Stuhl (Staat der Vatikanstadt) - + Saint Vincent and the Grenadines St. Vincent und die Grenadinen - + Virgin Islands, British Britische Jungferninseln - + Virgin Islands, U.S. Amerikanische Jungferninseln - + Vanuatu Vanuatu - + Wallis and Futuna Wallis und Futuna - + Samoa Samoa - + Yemen Jemen - + Mayotte Mayotte - + Serbia Serbien - + South Africa Südafrika - + Zambia Sambia - + Montenegro Montenegro - + Zimbabwe Simbabwe - + Aland Islands Åland - + Guernsey Britische Kanalinseln - + Isle of Man Insel Man - + Jersey Jersey - + Saint Barthelemy Saint-Barthélemy - + + Could not uncompress GeoIP database file. + Konnte GeoIP-Datenbank nicht entpacken. + + + Couldn't save downloaded GeoIP database file. Konnte die heruntergeladene GeoIP-Datenbank nicht speichern. - + Successfully updated GeoIP database. Die GeoIP-Datenbank wurde erfolgreich aktualisiert. - + Couldn't download GeoIP database file. Reason: %1 Konnte GeoIP-Datenbank nicht herunterladen. Grund: %1 @@ -4594,12 +4145,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] UPnP / NAT-PMP Unterstützung [EIN] - + UPnP / NAT-PMP support [OFF] UPnP / NAT-PMP Unterstützung [AUS] @@ -4607,7 +4158,7 @@ Net::Smtp - + Email Notification Error: E-Mail-Benachrichtigungsfehler: @@ -4615,1281 +4166,1077 @@ OptionsDialog - + Options Optionen - + Behavior Verhalten - + Downloads Downloads - + Connection Verbindung - + Speed Geschwindigkeit - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI Weboberfläche - + Advanced Erweitert - + Language Sprache - + User Interface Language: Benutzeroberflächensprache: - + (Requires restart) (Neustart benötigt) - + Transfer List Übertragungsliste - + Confirm when deleting torrents Löschen von Torrents bestätigen - + Use alternating row colors In transfer list, one every two rows will have grey background. Abwechselnde Reihenfarben verwenden - + Hide zero and infinity values Werte mit Null und Unendlich verbergen - + Always Immer - + Paused torrents only Nur pausierte Torrents - + Action on double-click Aktion bei Doppelklick - + Downloading torrents: Herunterladende Torrents: - - + + Start / Stop Torrent Torrent starten / stoppen - - + + Open destination folder Zielordner öffnen - - + + No action Keine Aktion - + Completed torrents: Abgeschlossene Torrents: - + Desktop Desktop - + Start qBittorrent on Windows start up qBittorrent beim Systemstart starten - + Show splash screen on start up Beim Start von qBittorrent das Logo anzeigen - + Start qBittorrent minimized qBittorrent minimiert starten - + Confirmation on exit when torrents are active Beenden bestätigen, wenn noch Torrents aktiv sind - + Confirmation on auto-exit when downloads finish Beenden bestätigen, wenn die Downloads abgeschlossen sind - - KiB - KiB - - - - Email notification &upon download completion - Benachrichtigen, wenn der Download &fertig ist - - - - Run e&xternal program on torrent completion - E&xternes Programm aufrufen, wenn der Torrent fertig ist - - - - IP Fi&ltering - IP-&Filterung - - - - Schedule &the use of alternative rate limits - Benutzung von al&ternativen Verhältnisbegrenzungen verwenden - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Mehr Information</a>) - - - - &Torrent Queueing - Warteschlange für &Torrents - - - - Seed torrents until their seeding time reaches - Torrents seeden, bis deren Seedverhältnis erreicht wurde - - - - A&utomatically add these trackers to new downloads: - Diese Tracker a&utomatisch zu neuen Downloads hinzufügen: - - - - RSS Reader - RSS-Reader - - - - Enable fetching RSS feeds - Aktiviere RSS-Feeds - - - - Feeds refresh interval: - Aktualisierungsintervall für RSS-Feeds: - - - - Maximum number of articles per feed: - Maximale Anzahl der Artikel pro Feed: - - - - - min - minutes - Min. - - - - RSS Torrent Auto Downloader - RSS-Torrent Automatik-Downloader - - - - Enable auto downloading of RSS torrents - Aktiviere automatisches Herunterladen von RSS-Torrents - - - - Edit auto downloading rules... - Regeln für automatisches Herunterladen ändern ... + + Show qBittorrent in notification area + qBittorrent im Benachrichtigungsbereich anzeigen - - Web User Interface (Remote control) - Webuser-Interface (Fernbedienung) - - - - IP address: - IP-Adresse: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - IP-Adresse an die das WebUI gebunden wird. -Eingabe einer IPv4 oder IPv6-Adresse. Es kann "0.0.0.0" für jede IPv4-Adresse, -"::" für jede IPv6-Adresse, oder "*" für IPv4 und IPv6 eingegeben werden. - - - - Server domains: - Server Domains: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - Liste der erlaubten HTTP-Host Header-Felder. -Um sich vor DNS-Rebinding-Attacken zu schützen, -sollten hier Domain-Namen eingetragen weden, -die vom WebUI-Server verwendet werden. - -Verwende ';' um mehrere Einträge zu trennen. -Platzhalter '*' kann verwendet werden. - - - - &Use HTTPS instead of HTTP - HTTPS anstatt von HTTP ben&utzen - - - - Bypass authentication for clients on localhost - Authentifizierung für Clients auf dem Localhost umgehen - - - - Bypass authentication for clients in whitelisted IP subnets - Authentifizierung für Clients auf der Liste der erlaubten IP-Subnets umgehen - - - - IP subnet whitelist... - Erlaubte IP-Subnets ... - - - - Upda&te my dynamic domain name - Dynamischen Domainnamen akt&ualisieren - - - + Minimize qBittorrent to notification area qBittorrent in den Benachrichtigungsbereich minimieren - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. qBittorrent in den Benachrichtigungsbereich schließen - + Tray icon style: Tray Icon Stil: - + Normal Normal - + Monochrome (Dark theme) Monochrome (Dark Theme) - + Monochrome (Light theme) Monochrome (Light Theme) - + File association Dateizuordnung - + Use qBittorrent for .torrent files qBittorrent für .torrent Dateien verwenden - + Use qBittorrent for magnet links qBittorrent für Magnet Links verwenden - + Power Management Energieverwaltung - + + Inhibit system sleep when torrents are active + Schlafmodus verhindern, wenn noch Torrents aktiv sind + + + + Log file + Protokolldatei + + + Save path: Speicherpfad: - + Backup the log file after: Sichere die Protokolldatei nach: - + + MB + MB + + + Delete backup logs older than: Lösche Sicherungen älter als: - + days Delete backup logs older than 10 months Tage - + months Delete backup logs older than 10 months Monate - + years Delete backup logs older than 10 years Jahre - + When adding a torrent Sobald ein Torrent hinzugefügt wird - + + Display torrent content and some options + Zeige Inhalt des Torrent und einige Optionen + + + Bring torrent dialog to the front Aktiviere das Dialogfenster - + Do not start the download automatically The torrent will be added to download list in pause state Download nicht automatisch starten - + Should the .torrent file be deleted after adding it Soll die .torrent-Datei nach dem Hinzufügen gelöscht werden - + + Delete .torrent files afterwards + .torrent-Dateien anschliessend löschen + + + Also delete .torrent files whose addition was cancelled .torrent-Dateien auch löschen wenn das Hinzufügen abgebrochen wurde - + Also when addition is cancelled Auch wenn das Hinzufügen abgebrochen wurde - + Warning! Data loss possible! Achtung! Datenverlust ist möglich! - + Saving Management Speicherverwaltung - + Default Torrent Management Mode: Vorgabe-Modus für das Torrent-Management: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category Automatischer Modus bedeutet, daß diverse Torrent-Eigenschaften (z.B. der Speicherpfad) durch die gewählte Kategorie vorgegeben werden. - + Manual Manuell - + Automatic Automatisch - + When Torrent Category changed: Wenn die Torrent-Kategorie geändert wird: - + Relocate torrent Torrent verschieben - + Switch torrent to Manual Mode Wechsle den Torrent in den manuellen Modus - + When Default Save Path changed: Wenn sich der Standardspeicherpfad ändert: - - + + Relocate affected torrents Betroffene Torrents verschieben - - + + Switch affected torrents to Manual Mode Wechsle betroffene Torrents in den manuellen Modus - + When Category changed: Wenn sich die Kategorie ändert: - + Use Subcategories Unterkategorien verwenden - + Default Save Path: Standardspeicherpfad: - + Keep incomplete torrents in: Unvollständige Torrents speichern in: - + Copy .torrent files to: .torrent Dateien kopieren nach: - - Show &qBittorrent in notification area - &qBittorrent im Benachrichtigungsbereich anzeigen - - - - &Log file - &Logdatei - - - - Display &torrent content and some options - Zeige Inhalt des &Torrent und einige Optionen - - - - Create subfolder for torrents with multiple files - Unterordner für Torrents anlegen, die aus mehreren Dateien bestehen - - - - De&lete .torrent files afterwards - .torrent-Dateien ansch&ließend löschen - - - + Copy .torrent files for finished downloads to: Kopiere die .torrent Dateien von beendeten Downloads nach: - + Pre-allocate disk space for all files Allen Dateien Speicherplatz im Vorhinein zuweisen - - Inhibit system sleep when torrents are downloading - Schlafmodus verhindern solange Torrents noch herunterladen - - - - Inhibit system sleep when torrents are seeding - Schlafmodus verhindern solange Torrents noch uploaden - - - + Append .!qB extension to incomplete files .!qB Erweiterung für unvollständige Dateien verwenden - - Enable recursive download dialog - Rekursiven Download-Dialog erlauben - - - + Automatically add torrents from: .torrent-Dateien aus diesem Verzeichnis automatisch hinzufügen: - + Add entry Eintrag hinzufügen - + Remove entry Eintrag entfernen - + + Email notification upon download completion + E-Mail-Benachrichtigung wenn Download vollständig ist + + + + Destination email: + Zieladresse: + + + SMTP server: SMTP-Server: - + This server requires a secure connection (SSL) Dieser Server benötigt eine sichere Verbindung (SSL) - - + + + Authentication Authentifizierung - - - - + + + + Username: Benutzername: - - - - + + + + Password: Passwort: - - Enabled protocol: - Aktiviertes Protokoll: + + Run external program on torrent completion + Externes Programm ausführen wenn Torrent vollständig ist - - TCP and μTP - TCP und μTP - - - + Listening Port Port auf dem gelauscht wird - + Port used for incoming connections: Port für eingehende Verbindungen: - + Random Zufällig - + Use UPnP / NAT-PMP port forwarding from my router UPnP / NAT-PMP Portweiterleitung des Routers verwenden - + Use different port on each startup Bei jedem Anwendungsstart einen anderen Port verwenden - + Connections Limits Verbindungsbeschränkungen - + Maximum number of connections per torrent: Maximale Anzahl der Verbindungen pro Torrent: - + Global maximum number of connections: Maximale globale Anzahl der Verbindungen: - + Maximum number of upload slots per torrent: Maximale Anzahl Upload-Slots pro Torrent: - + Global maximum number of upload slots: Maximale globale Anzahl von Upload-Slots: - + Proxy Server Proxy-Server - + Type: Typ: - + (None) (Keiner) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Host: - - + + Port: Port: - + Otherwise, the proxy server is only used for tracker connections Andererseits wird der Proxyserver nur für Tracker-Verbindungen verwendet - + Use proxy for peer connections Proxy für Peer-Verbindungen verwenden - + Disable connections not supported by proxies Deaktiviere Verbindungen die nicht von Proxys unterstützt werden - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Mehr Information</a>) - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection RSS-Feeds, Suchmaschinen, Software-Updates und alles Sonstige als Torrents selber und die damit verbundene Übertragungen (z.B. Peeraustausch) werden eine direkte Verbindung verwenden - + Use proxy only for torrents Proxy nur für Torrents verwenden - - A&uthentication - A&uthentifizierung - - - + Info: The password is saved unencrypted Info: Das Passwort wird unverschlüsselt gespeichert! - + + IP Filtering + IP-Filterung + + + Filter path (.dat, .p2p, .p2b): Filterpfad (.dat, .p2p, .p2b): - + Reload the filter Filter neu laden - - Manually banned IP addresses... - Manuell gebannte IP-Adressen... - - - + Apply to trackers Zu Trackern hinzufügen - + Global Rate Limits Globale Verhältnisbegrenzung - - - - - - - KiB/s - KiB/s - - - - + + Upload: Hochladen: - - + + + + + KiB/s + KiB/s + + + + Download: Herunterladen: - + Alternative Rate Limits Alternative Verhältnisbegrenzungen - - + + Schedule the use of alternative rate limits + Benutzung von alternativen Verhältnisbegrenzungen einteilen + + + From: from (time1 to time2) Von: - - + To: time1 to time2 An: - + When: Wann: - + Every day Jeden Tag - + Weekdays Wochentage - + Weekends Wochenenden - + Rate Limits Settings Einstellungen für Verhältnisbegrenzungen - + Apply rate limit to peers on LAN Verhältnisbegrenzung auch für Peers im LAN verwenden - + Apply rate limit to transport overhead Verhältnisbegrenzung auf Transport Overhead anwenden - - + + + Enable µTP protocol + µTP-Protokoll aktivieren + + + Apply rate limit to µTP protocol Verhältnisbegrenzung für das µTP-Protokoll verwenden - + Privacy Privatsphäre - + Enable DHT (decentralized network) to find more peers DHT (dezentralisiertes Netzwerk) aktivieren, um mehr Peers zu finden - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Peers mit kompatiblen Bittorrent-Programmen austauschen (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers Peer Exchange (PeX) aktivieren, um mehr Peers zu finden - + Look for peers on your local network - Nach Peers im lokalen Netzwerk suchen + Nach Peers im lokalen Netzwek suchen - + Enable Local Peer Discovery to find more peers Lokale Peer Auffindung (LPD) aktivieren um mehr Peers zu finden - + Encryption mode: Verschlüsselungsmodus: - + Prefer encryption Verschlüsselung bevorzugen - + Require encryption Verschlüsselung verlangen - + Disable encryption Verschlüsselung deaktivieren - + Enable when using a proxy or a VPN connection Aktiviere wenn ein Proxy oder ein VPN in Benutzung ist - + Enable anonymous mode Anonymen Modus aktivieren - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Weitere Informationen hier auf Englisch</a>) + + + + Torrent Queueing + Warteschlange für Torrents + + + Maximum active downloads: Maximal aktive Downloads: - + Maximum active uploads: Maximal aktive Uploads: - + Maximum active torrents: Maximal aktive Torrents: - + Do not count slow torrents in these limits Bei diesen Begrenzungen langsame Torrents nicht mit einbeziehen - - Upload rate threshold: - UL-Schwellenwert: - - - - Download rate threshold: - DL-Schwellenwert: - - - - sec - seconds - Sek. - - - - Torrent inactivity timer: - Timer für Torrent-Inaktivität: - - - + Share Ratio Limiting Shareverhältnis-Begrenzung - + Seed torrents until their ratio reaches Torrents seeden, bis dieses Verhältnis erreicht wurde - + then dann - + Pause them Anhalten - + Remove them Entfernen - - RSS Smart Episode Filters - RSS Smart-Folgenfilter + + Automatically add these trackers to new downloads: + Diese Tracker automatisch zu neuen Downloads hinzufügen: + + + + Enable Web User Interface (Remote control) + Webuser-Interface einschalten (Fernbedienung) - + Use UPnP / NAT-PMP to forward the port from my router UPnP / NAT-PMP um den Port des Routers weiterzuleiten - + + Use HTTPS instead of HTTP + HTTPS anstatt von HTTP verwenden + + + Certificate: Zertifikat: - + Import SSL Certificate SSL-Zertifikat importieren - + Key: Schlüssel: - + Import SSL Key SSL-Schlüssel importieren - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Informationen über Zertifikate</a> - - Use alternative Web UI - Verwende alternatives Web-UI - - - - Files location: - Speicherort der Dateien: - - - - Enable clickjacking protection - Clickjacking-Schutz aktivieren + + Bypass authentication for localhost + Authentifizierung für Localhost umgehen - - Enable Cross-Site Request Forgery (CSRF) protection - CSRF-Schutz aktivieren (Cross-Site Request Forgery) + + Update my dynamic domain name + Dynamischen Domainnamen aktualisieren - + Service: Dienst: - + Register Registrieren - + Domain name: Domainname: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! Mit dem Aktivieren dieser Optionen können die .torrent-Dateien <strong>unwiederbringlich verloren gehen!</strong> - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well Wenn diese Optionen aktiviert werden, wird qBittorrent .torrent-Dateien <strong>löschen</strong> nachdem sie (1. Möglichkeit) erfolgreich oder (2. Möglichkeit) nicht in die Download-Warteschlange hinzugefügt wurden. Dies betrifft <strong>nicht nur</strong> Dateien die über das &ldquo;Torrent hinzufügen&rdquo;-Menü sondern auch jene die über die <strong>Dateityp-Zuordnung</strong> geöffnet werden. - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog Wenn die 2. Möglichkeit aktiviert wird (&ldquo;Auch wenn das Hinzufügen abgebrochen wurde&rdquo;) wird die .torrent-Datei <strong>unwiederbringlich gelöscht</strong> selbst wenn &ldquo;<strong>Abbrechen</strong>&rdquo; im &ldquo;Torrent hinzufügen&rdquo;-Menü gedrückt wird. - - Choose Alternative UI files location - Wähle Dateispeicherort für alternatives UI - - - + Supported parameters (case sensitive): Unterstützte Parameter (Groß-/Kleinschreibung beachten): - + %N: Torrent name %N: Torrentname - + %L: Category %L: Kategorie - - %G: Tags (seperated by comma) - %G: Label (getrennt durch Komma) - - - + %F: Content path (same as root path for multifile torrent) %F: Inhaltspfad (gleich wie der Hauptpfad für Mehrdateien-Torrent) - + %R: Root path (first torrent subdirectory path) %R: Hauptpfad (erster Pfad für das Torrent-Unterverzeichnis) - + %D: Save path %D: Speicherpfad - + %C: Number of files %C: Anzahl der Dateien - + %Z: Torrent size (bytes) %Z: Torrentgröße (Byte) - + %T: Current tracker %T: aktueller Tracker - + %I: Info hash %I: Info-Hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") Tipp: Setze Parameter zwischen Anführungszeichen damit Text bei Leerzeichen nicht abgeschnitten wird (z.B. "%N"). - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - Ein Torrent wird als langsam eingestuft, wenn die DL- und UL-Rate unterhalb der Zeitgrenze des "Timer für Torrent-Inaktivität" bleiben - - - + Select folder to monitor Ein Verzeichnis zum Beobachten auswählen - + Folder is already being monitored: Verzeichnis wird bereits beobachtet: - + Folder does not exist: Verzeichnis existiert nicht: - + Folder is not readable: Verzeichnis kann nicht gelesen werden: - + Adding entry failed Hinzufügen des Eintrags fehlgeschlagen - - - - + + Choose export directory Export-Verzeichnis wählen - - - + + + + + + Choose a save directory - Verzeichnis zum Speichern wählen + Verzeichnis zum Speichern auswählen - + Choose an IP filter file IP-Filter-Datei wählen - + All supported filters Alle unterstützten Filter - + SSL Certificate SSL-Zertifikat - + + SSL Key + SSL-Schlüssel + + + Parsing error Fehler beim Analysieren - + Failed to parse the provided IP filter Fehler beim Analysieren der IP-Filter - + Successfully refreshed Erfolgreich aktualisiert - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Der IP-Filter wurde erfolgreich analysiert. Es wurden %1 Regeln angewendet. - + Invalid key Ungültiger Schlüssel - + This is not a valid SSL key. Dies ist kein gültiger SSL-Schlüssel. - + Invalid certificate Ungültiges Zertifikat - - Preferences - Einstellungen - - - - Import SSL certificate - SSL-Zertifikat importieren - - - + This is not a valid SSL certificate. Dies ist kein gültiges SSL-Zertifikat. - - Import SSL key - SSL-Schlüssel importieren - - - - SSL key - SSL-Schlüssel - - - + Time Error Zeitfehler - + The start time and the end time can't be the same. Die Startzeit und die Endzeit können nicht gleich sein. - - + + Length Error Längenfehler - + The Web UI username must be at least 3 characters long. Der Benutzername für das Webinterface muss mindestens 3 Zeichen lang sein. - + The Web UI password must be at least 6 characters long. Das Passwort für das Webinterface muss mindestens 6 Zeichen lang sein. @@ -5897,72 +5244,72 @@ PeerInfo - - Interested(local) and Choked(peer) + + interested(local) and choked(peer) Interessiert (Lokal) und verstopft (Peer) - + interested(local) and unchoked(peer) Interessiert (Lokal) und frei verfügbar (Peer) - + interested(peer) and choked(local) Interessiert (Peer) und verstopft (Lokal) - + interested(peer) and unchoked(local) Interessiert (Peer) und frei verfügbar (Lokal) - + optimistic unchoke Optimistische Freigabe - + peer snubbed Peer abgewiesen - + incoming connection eingehende Verbindung - + not interested(local) and unchoked(peer) Nicht interessiert (Lokal) und frei verfügbar (Peer) - + not interested(peer) and unchoked(local) Nicht interessiert (Peer) und frei verfügbar (Lokal) - + peer from PEX Peer von PEX - + peer from DHT Peer von DHT - + encrypted traffic verschlüsselter Datenverkehr - + encrypted handshake verschlüsselter Handshake - + peer from LSD Peer von LSD @@ -5970,180 +5317,165 @@ PeerListWidget - + IP IP - + Port Port - + Flags Flags - + Connection Verbindung - + Client i.e.: Client application Programm - + Progress i.e: % downloaded Fortschritt - + Down Speed i.e: Download speed DL-Rate - + Up Speed i.e: Upload speed UL-Rate - + Downloaded i.e: total data downloaded Runtergeladen - + Uploaded i.e: total data uploaded Hochgeladen - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Relevanz - + Files i.e. files that are being downloaded right now Dateien - + Column visibility Sichtbarkeit der Spalten - + Add a new peer... Füge einen neuen Peer hinzu ... - - + + Ban peer permanently Peer dauerhaft bannen - + Manually adding peer '%1'... Peer '%1' von Hand hinzufügen ... - + The peer '%1' could not be added to this torrent. Der Peer '%1' konnte diesem Torrent nicht hinzugefügt werden. - + Manually banning peer '%1'... Peer '%1' von Hand bannen ... - - + + Peer addition Peer hinzufügen - + Country Land - + Copy IP:port IP:port kopieren - + Some peers could not be added. Check the Log for details. Einige Peers konnten nicht hinzugefügt werden. Bitte das Log für weitere Details überprüfen. - + The peers were added to this torrent. Die Peers wurden diesem Torrent hinzugefügt. - + Are you sure you want to ban permanently the selected peers? Sollen die ausgewählten Peers wirklich dauerhaft gebannt werden? - + &Yes &Ja - + &No &Nein - PeersAdditionDialog - - - Add Peers - Peers hinzufügen - + PeersAdditionDlg - - List of peers to add (one IP per line): - Liste der hinzuzufügenden Peers (pro Zeile eine IP): - - - - Format: IPv4:port / [IPv6]:port - Format: IPv4:Port / [IPv6]:Port - - - + No peer entered - Kein Peer eingegeben + Kein Peer vorhanden - + Please type at least one peer. Bitte mindestens einen Peer angeben. - + Invalid peer - Ungültiger Peer + Ungültiger Peer. - + The peer '%1' is invalid. Der Peer '%1' ist ungültig. @@ -6151,12 +5483,12 @@ PieceAvailabilityBar - + White: Unavailable pieces Weiß: Nicht verfügbare Teile - + Blue: Available pieces Blau: Verfügbare Teile @@ -6164,338 +5496,294 @@ PiecesBar - + Files in this piece: Dateien in diesem Teil: - + File in this piece Datei in diesem Teil: - + File in these pieces Datei in diesen Teilen: - - Wait until metadata become available to see detailed information - Warte auf Metadaten für mehr Informationen - - - + Hold Shift key for detailed information Drücke die Shift-Taste für genauere Informationen - PluginSelectDialog + PluginSelectDlg - + Search plugins - Such-Plugins + Suchplugins - + Installed search plugins: - Installierte Such-Plugins: + Installierte Suchplugins: - + Name Name - + Version Version - + Url URL - - + + Enabled Aktiviert - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - Warnung: Achten Sie darauf, die Urheberrechtsgesetze Ihres Landes zu befolgen, wenn Sie von einer dieser Suchmaschinen Torrents herunterladen. - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> Neue Suchmaschinen-Plugins können hier heruntergeladen werden: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - Installiere neues Plugin + Intalliere eine Neue - + Check for updates - Auf Aktualisierungen prüfen + Auf Updates prüfen - + Close Schließen - + Uninstall Deinstallieren - - - + + + Yes Ja - - - - + + + + No Nein - + Uninstall warning Deinstallations-Warnung - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. Einige Plugins konnten nicht deinstalliert werden, da sie ein fester Bestandteil von qBittorrent sind. Nur Plugins, die auch selber installiert wurden können auch wieder entfernt werden. -Diese Plugins wurden jetzt aber deaktiviert. +Die Plugins wurden jedoch deaktiviert. - + Uninstall success Deinstallation erfolgreich - + All selected plugins were uninstalled successfully Alle ausgewählten Plugins wurden erfolgreich deinstalliert - - - - - Search plugin update - Update für Such-Plugins - - - - Plugins installed or updated: %1 - Installierte oder aktualisierte Plugins: %1 - - - - + + New search engine plugin URL Neue Suchmaschinen-Plugin-URL - - + + URL: URL: - + Invalid link Ungültiger Link - + The link doesn't seem to point to a search engine plugin. - Der Link scheint nicht auf ein Suchmaschinen-Plugin zu verweisen. + Der Link scheint nicht auf ein Suchmaschinen Plugin zu verweisen. - + Select search plugins - Wähle Such-Plugins + Wähle Suchplugins - + qBittorrent search plugin - qBittorrent Such-Plugin + qBittorrent Suchplugin - + + + + Search plugin update + Such-Plugin update + + + All your plugins are already up to date. Alle Plugins sind auf dem neuesten Stand. - + Sorry, couldn't check for plugin updates. %1 Konnte nicht nach Plugin-Updates suchen. %1 - + + + Search plugin install - Such-Plugin installieren + Suchplugin installieren + + + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + "%1" Suchmaschinen-Plugin wurde erfolgreich installiert. - + Couldn't install "%1" search engine plugin. %2 Konnte das Suchmaschinen-Plugin "%1" nicht installieren. %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + '%1' Suchmaschinen-Plugin wurde erfolgreich aktualisiert. + + + Couldn't update "%1" search engine plugin. %2 Konnte Suchmaschinen-Plugin "%1" nicht aktualisieren. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - Plugin-Quelle + Plugin Quelle - + Search plugin source: - Such-Plugin Quelle: + Such Plugin Quelle: - + Local file Lokale Datei - + Web link - Web-Link - - - - PowerManagement - - - qBittorrent is active - qBittorrent ist aktiv + Web Link - PreviewSelectDialog - - - Preview - Vorschau - + PreviewSelect - + Name Name - + Size Größe - + Progress Fortschritt - - + + Preview impossible Vorschau nicht möglich - - + + Sorry, we can't preview this file Es kann leider keine Vorschau für diese Datei erstellt werden - Private::FileLineEdit - - - '%1' does not exist - '%1' existiert nicht - - - - '%1' does not point to a directory - '%1' ist kein Zielverzeichnis - - - - '%1' does not point to a file - '%1' ist keine Zieldatei - - - - Does not have read permission in '%1' - Keine Leseberechtigung für '%1' - - - - Does not have write permission in '%1' - Keine Schreibberechtigung für '%1' - - - PropListDelegate - + Not downloaded Nicht heruntergeladen - - + + Normal Normal (priority) Normal - - N/A - N/V - - - + Do not download Do not download (priority) - Nicht herunterladen + Nicht herunterladen - - + + High High (priority) Hoch - + N/A + N/V + + + Mixed Mixed (priorities Gemischt - - + + Maximum Maximum (priority) Maximum @@ -6504,32 +5792,32 @@ PropTabBar - + General Allgemein - + Trackers Tracker - + Peers Peers - + HTTP Sources - HTTP-Quellen + HTTP Quellen - + Content Inhalt - + Speed Geschwindigkeit @@ -6623,22 +5911,22 @@ Kommentar: - + Select All Alle Wählen - + Select None Keine Wählen - + Normal Normal - + High Hoch @@ -6698,165 +5986,165 @@ Speicherpfad: - + Maximum Maximum + - Do not download Nicht herunterladen - + Never Niemals - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (%3 fertig) - - + + %1 (%2 this session) %1 (%2 diese Sitzung) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) '%1' (geseedet seit '%2') - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 max.) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 gesamt) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 durchschn.) - + Open Öffnen - + Open Containing Folder Öffne Verzeichnis - + Rename... Umbenennen ... - + Priority Priorität - + New Web seed Neuer Webseed - + Remove Web seed Webseed entfernen - + Copy Web seed URL Webseed-URL kopieren - + Edit Web seed URL Webseed-URL editieren - + + Rename the file + Datei umbenennen + + + New name: Neuer Name: - - + + + The file could not be renamed + Die Datei konnte nicht umbenannt werden + + + + This file name contains forbidden characters, please choose a different one. + Der Dateiname enthält ungültige Zeichen - bitte einen anderen Dateinamen wählen. + + + + This name is already in use in this folder. Please use a different name. Der Dateiname wird in diesem Verzeichnis bereits verwendet - bitte einen anderen Dateinamen wählen. - + The folder could not be renamed Das Verzeichnis konnte nicht umbenannt werden - + qBittorrent qBittorrent - + Filter files... Dateien filtern ... - - Renaming - Beim Umbenennen - - - - - Rename error - Fehler beim Umbenennen - - - - The name is empty or contains forbidden characters, please choose a different one. - Kein Name eingegeben oder der Name enthält ungültige Zeichen - bitte anderen Namen wählen. - - - + New URL seed New HTTP source Neuer URL Seed - + New URL seed: Neuer URL Seed: - - + + This URL seed is already in the list. Dieser URL Seed befindet sich bereits in der Liste. - + Web seed editing Webseed-URL editieren - + Web seed URL: Webseed-URL: @@ -6864,586 +6152,552 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + Die IP-Adresse wurde wegen zu vieler Authentifizierungsversuche gebannt. + + + + Error: '%1' is not a valid torrent file. + + Fehler: '%1' ist keine gültige Torrent-Datei. + + + + + Error: Could not add torrent to session. + Fehler: Konnte Torrent in dieser Sitzung nicht hinzufügen. + + + + I/O Error: Could not create temporary file. + I/O-Fehler: Konnte temporäre Datei nicht erstellen. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 ist ein unbekannter Kommandozeilen-Parameter. - - + + %1 must be the single command line parameter. %1 muss der einzige Kommandozeilen-Parameter sein. - + + %1 must specify the correct port (1 to 65535). + %1 muss den richtigen Port (zwischen 1 und 65535) angeben. + + + You cannot use %1: qBittorrent is already running for this user. %1 kann nicht verwendet werden. qBittorrent läuft für diesen Benutzer bereits. - + Usage: Verwendung: - + Options: Optionen: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - Parameter '%1' benötigt folgende Syntax: '%1=%2' + + Displays program version + Zeigt die Programm-Version - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - Parameter '%1' benötigt folgende Syntax: '%1=%2' + + Displays this help message + Zeigt diese Hilfsausgabe - - Expected integer number in environment variable '%1', but got '%2' - Erwarte Ganzzahl in Umgebungsvariable '%1', bekam jedoch '%2' + + Changes the Web UI port (current: %1) + Ändert den Webinterface Port (momentan: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - Parameter '%1' benötigt folgende Syntax: '%1=%2' + + Disable splash screen + Deaktiviere Splash Screen - - Expected %1 in environment variable '%2', but got '%3' - Erwartete %1 in Umgebungsvariable '%2', bekam jedoch '%3' + + Run in daemon-mode (background) + Laufe im Hintergrund als Dienst - - port - Port + + Downloads the torrents passed by the user + Lädt die vom Benutzer übergebenen Torrents herunter - - %1 must specify a valid port (1 to 65535). - %1 muss einen gültigen Port (zwischen 1 und 65535) angeben. + + Help + Hilfe - - Display program version and exit - Zeige die Programmversion und beende. + + Run application with -h option to read about command line parameters. + Programm mit -h starten um Info über Kommandozeilen-Parameter zu erhalten. - - Display this help message and exit - Zeige diese Hilfe und beende. + + Bad command line + Falsche Kommandozeile - - Change the Web UI port - Ändere den Webinterface-Port + + Bad command line: + Falsche Kommandozeile: - - Disable splash screen - Deaktiviere Splash Screen + + Legal Notice + Rechtshinweis - - Run in daemon-mode (background) - Laufe im Hintergrund als Dienst + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + qBittorrent ist ein Filesharing Programm. Sobald ein Torrent im Programm läuft wird der Inhalt auch anderen durch Upload zur Verfügung gestellt. + +Selbstverständlich geschieht dieses Teilen jeglicher Inhalte auf eigene Verantwortung und es erfolgt auch kein weiterer Hinweis diesbezüglich. - - dir - Use appropriate short form or abbreviation of "directory" - Verz. + + Press %1 key to accept and continue... + Zum Bestätigen und Fortfahren bitte %1-Taste drücken ... - - Store configuration files in <dir> - Konfigurationsdateien in <dir> speichern + + Legal notice + Rechtshinweis - - - name - Name + + Cancel + Abbrechen - - Store configuration files in directories qBittorrent_<name> - Konfigurationsdateien in Verzeichnis qBittorrent_<name> speichern + + I Agree + Ich stimme zu - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Modifiziere die libtorrent-Fortsetzungsdateien und mache die Pfade relativ zum Profilverzeichnis + + Torrent name: %1 + Torrent-Name: %1 - - files or URLs - Dateien oder URLs + + Torrent size: %1 + Torrent-Größe: %1 - - Download the torrents passed by the user - Lade die vom Benutzer angebenen Torrents herunter + + Save path: %1 + Speicherpfad: %1 - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Lege fest ob der "Neuen Torrent hinzufügen"-Dialog beim Hinzufügen eines Torrents startet. + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Der Torrent wurde in %1 heruntergeladen. - - Options when adding new torrents: - Sobald ein Torrent hinzugefügt wird: + + Thank you for using qBittorrent. + Danke für die Benutzung von qBittorrent. - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Shortcut für %1 + + [qBittorrent] '%1' has finished downloading + [qBittorrent] '%1' wurde vollständig heruntergeladen - - path - Pfad + + The remote host name was not found (invalid hostname) + Der Hostname konnte nicht gefunden werden (ungültiger Hostname) - - Torrent save path - Speicherpfad für Torrent + + The operation was canceled + Der Vorgang wurde abgebrochen - - Add torrents as started or paused - Neue Torrents starten oder pausieren + + The remote server closed the connection prematurely, before the entire reply was received and processed + Der Server hat die Verbindung beendet bevor die gesamte Antwort empfangen und verarbeitet werden konnte - - Skip hash check - Prüfsummenkontrolle überspringen + + The connection to the remote server timed out + Zeitüberschreitung beim Verbinden mit dem Server - - Assign torrents to category. If the category doesn't exist, it will be created. - Weise Torrents Kategorien zu. Wenn die Kategorie nicht existiert wird sie erstellt. + + SSL/TLS handshake failed + SSL/TLS Handshake fehlgeschlagen - - Download files in sequential order - Der Reihe nach downloaden + + The remote server refused the connection + Der Server hat die Verbindung verweigert - - Download first and last pieces first - Erste und letzte Teile zuerst laden + + The connection to the proxy server was refused + Die Verbindung zum Proxy-Server wurde verweigert - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - Optionswerte können von Umgebungsvariablen geliefert werden. Für eine Option mit dem Namen 'parameter-name' lautet der Name "QBT_PARAMETER_NAME' (in Großbuchstaben, '-' ersetzt durch '_'). Um die Werte zu akzeptieren, die Variable auf '1' oder 'WAHR' setzen. Z.B. um den Startbildschirm zu deaktivieren: + + The proxy server closed the connection prematurely + Der Proxy-Server hat die Verbindung vorzeitig beendet - - Command line parameters take precedence over environment variables - Kommandozeilenparameter haben Vorrang vor Umgebungsvariablen + + The proxy host name was not found + Der Proxy-Hostname wurde nicht gefunden - - Help - Hilfe + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Zeitüberschreitung beim Verbindungsaufbau mit dem Proxy oder der Proxy hat nicht in angemessener Zeit auf die Anfrage reagiert - - Run application with -h option to read about command line parameters. - Programm mit -h starten um Info über Kommandozeilen-Parameter zu erhalten. + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Der Proxy benötigt Authentifizierung hat jedoch keine der angebotenen Zugangsdaten akzeptiert - - Bad command line - Falsche Kommandozeile + + The access to the remote content was denied (401) + Der Zugriff auf den Inhalt wurde verweigert (401) - - Bad command line: - Falsche Kommandozeile: + + The operation requested on the remote content is not permitted + Der angeforderte Vorgang auf rechnerferne Inhalte ist nicht gestattet - - Legal Notice - Rechtshinweis + + The remote content was not found at the server (404) + Die rechnerfernen Inhalte wurden auf dem Server nicht gefunden (404) - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - qBittorrent ist ein Filesharing Programm. Sobald ein Torrent im Programm läuft wird der Inhalt auch anderen durch Upload zur Verfügung gestellt. Das Teilen jeglicher Inhalte geschieht auf eigene Verantwortung. + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Der Server verlangt Authentifizierung, aber die angebotenen Zugangsdaten wurden nicht akzeptiert - - No further notices will be issued. - Es werden keine weiteren Meldungen ausgegeben. + + The Network Access API cannot honor the request because the protocol is not known + Die Network-Access-API konnte die Anfrage nicht bearbeiten da Protokoll unbekannt. - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - qBittorrent ist ein Filesharing Programm. Sobald ein Torrent im Programm läuft wird der Inhalt auch anderen durch Upload zur Verfügung gestellt. - -Selbstverständlich geschieht dieses Teilen jeglicher Inhalte auf eigene Verantwortung und es erfolgt auch kein weiterer Hinweis diesbezüglich. + + The requested operation is invalid for this protocol + Der angeforderte Vorgang ist für dieses Protokoll ungültig - - Press %1 key to accept and continue... - Zum Bestätigen und Fortfahren bitte %1-Taste drücken ... + + An unknown network-related error was detected + Ein unbekannter Netzwerk-Fehler ist aufgetreten - - Legal notice - Rechtshinweis + + An unknown proxy-related error was detected + Ein unbekannter Proxy-Fehler ist aufgetreten - - Cancel - Abbrechen + + An unknown error related to the remote content was detected + Unbekannter Fehler in Zusammenhang mit dem Inhalt ist aufgetreten - - I Agree - Ich stimme zu + + A breakdown in protocol was detected + Es ist eine Störung im Protokoll aufgetreten - - + + Unknown error + Unbekannter Fehler + + + + Upgrade Aktualisieren - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] Es wurde von einer älteren Version aktualisiert die eine andere Speicherart verwendete, daher muss die Speicherungsart aktualisiert werden. Es kann aber danach keine ältere Version als 3.3.0 mehr verwendet werden. Soll jetzt wirklich aktualisiert werden? [y/n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. Es wurde von einer älteren Version aktualisiert die eine andere Speicherart verwendete, daher muss die Speicherungsart aktualisiert werden. Es kann aber danach keine ältere Version als 3.3.0 mehr verwendet werden. - + Couldn't migrate torrent with hash: %1 Konnte den Torrent mit hash %1 nicht migrieren. - + Couldn't migrate torrent. Invalid fastresume file name: %1 Konnte den Torrent nicht migrieren. Ungültiger Name der Fortsetzungsdatei: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 + + Detected unclean program exit. Using fallback file to restore settings. Es wurde ein fehlerhaftes Beenden von qBittorrent festgestellt. -Daher wird eine Sicherungsdatei zur Wiederherstellung der Einstellungen verwendet: %1 +Es wird eine Sicherungsdatei zur Wiederherstellung der Einstellungen verwendet. - + An access error occurred while trying to write the configuration file. Es ist ein Zugriffsfehler beim Schreiben der Sicherungsdatei aufgetreten. - + A format error occurred while trying to write the configuration file. Es ist ein Formatfehler beim Schreiben der Sicherungsdatei aufgetreten. - - - An unknown error occurred while trying to write the configuration file. - Es ist ein unbekannter Fehler beim Schreiben der Sicherungsdatei aufgetreten. - - RSS::AutoDownloader + RSS - - - Invalid data format. - Ungültiges Datenformat. + + Search + Suche - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - Konnte Daten des RSS-AutoDownloader nicht in %1 speichern. Fehler: %2 + + New subscription + Neues Abonnement - - Invalid data format - Ungültiges Datenformat + + + + Mark items read + Markiere Einträge als gelesen - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - Konnte Regeln des RSS-AutoDownloader nicht von %1 lesen. Fehler: %2 + + Update all + Alle aktualisieren - - Couldn't load RSS AutoDownloader rules. Reason: %1 - Konnte Regeln des RSS-AutoDownloader nicht laden. Grund: %1 + + RSS Downloader... + RSS Downloader ... - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - Konnte RSS-Feed von '%1' nicht herunterladen. Grund: '%2' + + Settings... + Einstellungen ... - - RSS feed at '%1' updated. Added %2 new articles. - RSS-Feed von '%1' wurde aktualisiert. %2 neue Einträge wurden hinzugefügt. + + Torrents: (double-click to download) + Torrents: (Doppel-Klick zum Runterladen) - - Failed to parse RSS feed at '%1'. Reason: %2 - Konnte RSS-Feed von '%1' nicht analysieren. Grund: %2 - - - - Couldn't read RSS Session data from %1. Error: %2 - Konnte Daten der RSS-Sitzung von %1 nicht lesen. Fehler: %2 - - - - Couldn't parse RSS Session data. Error: %1 - Konnte Daten der RSS-Sitzung nicht lesen. Fehler: %1 - - - - Couldn't load RSS Session data. Invalid data format. - Konnte Daten der RSS-Sitzung nicht laden. Ungültiges Datenformat. - - - - Couldn't load RSS article '%1#%2'. Invalid data format. - Konnte RSS-Eintrag '%1#%2' nicht laden. Ungültiges Datenformat. - - - - RSS::Private::Parser - - - Invalid RSS feed. - Ungültiger RSS-Feed. - - - - %1 (line: %2, column: %3, offset: %4). - %1 (Zeile: %2, Spalte: %3, Offset: %4). - - - - RSS::Session - - - RSS feed with given URL already exists: %1. - Der RSS-Feed besteht schon: %1. - - - - Cannot move root folder. - Wurzelverzeichnis kann nicht verschoben werden. - - - - - Item doesn't exist: %1. - Das existiert nicht: %1. - - - - Cannot delete root folder. - Wurzelverzeichnis kann nicht gelöscht werden. - - - - Incorrect RSS Item path: %1. - Falscher RSS-Item-Pfad: %1. - - - - RSS item with given path already exists: %1. - Der RSS-Feed besteht schon: %1. - - - - Parent folder doesn't exist: %1. - Verzeichnis existiert nicht: %1. - - - - RSSWidget - - - Search - Suche - - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - Das Herunterladen von RSS-Feeds ist jetzt deaktiviert! Es kann in den Einstellungen wieder aktiviert werden. - - - - New subscription - Neues Abonnement - - - - - - Mark items read - Markiere Einträge als gelesen - - - - Refresh RSS streams - Aktualisiere RSS Streams - - - - Update all - Alle aktualisieren - - - - RSS Downloader... - RSS Downloader ... - - - - Torrents: (double-click to download) - Torrents: (Doppelklicken zum Herunterladen) - - - - + + Delete Löschen - + Rename... Umbenennen ... - + Rename Umbenennen - - + + Update Aktualisieren - + New subscription... Neues Abonnement ... - - + + Update all feeds Alle Feeds aktualisieren - + Download torrent Lade Torrent - + Open news URL Öffne News-URL - + Copy feed URL Kopiere Feed-URL - + New folder... Neuer Ordner ... - + + Refresh RSS streams + Aktualisiere RSS Streams + + + + RSSImp + + + Stream URL: + Stream URL: + + + + Please type a RSS stream URL + Bitte eine RSS Stream Adresse eingeben + + + + This RSS feed is already in the list. + Dieser RSS-Feed ist bereits in der Liste. + + + Please choose a folder name Bitte einen Verzeichnisnamen wählen - + Folder name: Verzeichnisname: - + New folder Neues Verzeichnis - - Please type a RSS feed URL - Bitte eine RSS-Stream-Adresse eingeben - - - - Feed URL: - Feed-URL: - - - + Deletion confirmation Löschbestätigung - + Are you sure you want to delete the selected RSS feeds? Sind Sie sicher, dass Sie die ausgewählten RSS-Feeds löschen möchten? - + Please choose a new name for this RSS feed Bitte einen neuen Namen für diesen RSS-Feed wählen - + New feed name: Neuer Feed-Name: - - Rename failed - Umbenennen fehlgeschlagen + + Name already in use + Name wird bereits verwendet + + + + This name is already used by another item, please choose another one. + Dieser Name wird bereits von einem anderen Eintrag verwendet - bitte einen anderen Namen wählen. - + Date: Datum: - + Author: Autor: + + + Unread + Ungelesen + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + Automatischer Download von '%1' vom RSS-Feed '%2' ist fehlgeschlagen weil er keinen Torrent oder Magnet-Link enthält ... + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + Lade Torrent '%1' automatisch von RSS-Feed '%2' ... + + + + Rss::Private::Parser + + + Invalid RSS feed. + Ungültiger RSS-Feed. + + + + RssSettingsDlg + + + RSS Reader Settings + Einstellungen für RSS Reader + + + + RSS feeds refresh interval: + Aktualisierungsintervall für RSS Feeds: + + + + min + Min. + + + + Maximum number of articles per feed: + Maximale Anzahl der Artikel pro Feed: + ScanFoldersDelegate - + Select save location Wähle Speicherort @@ -7451,274 +6705,268 @@ ScanFoldersModel - + Monitored Folder Beobachtetes Verzeichnis - + Override Save Location Anderer Speicherort - + Monitored folder Beobachtetes Verzeichnis - + Default save location Standardspeicherort - + Browse... Durchsuchen ... - SearchJobWidget + SearchEngine - - Form - Format + + Unknown search engine plugin file format. + Unbekanntes Dateiformat des Suchmaschinen-Plugins. - - Results(xxx) - Ergebnisse (xxx) + + A more recent version of this plugin is already installed. + Eine neuere Version dieses Plugins ist bereits installiert. - - Search in: - Suche in: + + + Plugin is not supported. + Plugin wird nicht unterstützt. + + + + Update server is temporarily unavailable. %1 + Update-Server vorübergehend nicht erreichbar. %1 - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - <html><head/><body><p>Manche Suchmaschinen suchen sowohl in der Torrentbeschreibung als auch im Torrentnamen. Die Anzeige solcher Ergebnisse in der unteren Liste kann hier eingestellt werden.</p><p><span style=" font-weight:600;">Überall </span>verhindert einen Filter und zeigt Alles an was von den Suchmaschinen zurückgegeben wird.</p><p><span style=" font-weight:600;">Nur Torrent-Namen</span> zeigt nur Torrents an, die dem Suchergebnis entsprechen.</p></body></html> + + + Failed to download the plugin file. %1 + Fehler beim Herunterladen der Plugin-Datei. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - <html><head/><body><p>Minimale u. Maximale Anzahl von Seeds einstellen</p></body></html> + + An incorrect update info received. + Ungültige Aktualisierungsinformation erhalten. - - Seeds: - Seeds: + + All categories + Alle Kategorien - - <html><head/><body><p>Minimal number of seeds</p></body></html> - <html><head/><body><p>Minimale Anzahl von Seeds</p></body></html> + + Movies + Filme - - - to - bis + + TV shows + TV-Sendungen - - <html><head/><body><p>Maximal number of seeds</p></body></html> - <html><head/><body><p>Maximale Anzahl von Seeds</p></body></html> + + Music + Musik - - - - + + Games + Spiele - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - <html><head/><body><p>Minimale u. Maximale Torrentgrösse einstellen</p></body></html> + + Anime + Anime - - Size: - Größe: + + Software + Software - - <html><head/><body><p>Minimal torrent size</p></body></html> - <html><head/><body><p>Minimale Torrentgrösse</p></body></html> + + Pictures + Bilder - - <html><head/><body><p>Maximal torrent size</p></body></html> - <html><head/><body><p>Maximale Torrentgrösse</p></body></html> + + Books + Bücher + + + + SearchListDelegate + + + + Unknown + Unbekannt + + + SearchTab - + Name i.e: file name - Name + Dateiname - + Size i.e: file size - Größe + Dateigröße - + Seeders i.e: Number of full sources Seeder - + Leechers i.e: Number of partial sources Leecher - + Search engine Suchmaschine - - Filter search results... - Dateien filtern ... - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results Ergebnisse (zeige <i>%1</i> von <i>%2</i>): - + Torrent names only Nur Torrent-Namen - + Everywhere Überall - - Use regular expressions - Reguläre Ausdrücke verwenden - - - + Searching... Suche ... - + Search has finished Suche abgeschlossen - + Search aborted Suche abgebrochen - + An error occurred during search... Während der Suche ist ein Fehler aufgetreten ... - + Search returned no results Suche lieferte keine Ergebnisse - + Column visibility - Spaltensichtbarkeit - - - - SearchPluginManager - - - Unknown search engine plugin file format. - Unbekanntes Dateiformat des Suchmaschinen-Plugins. - - - - A more recent version of this plugin is already installed. - Eine neuere Version dieses Plugins ist bereits installiert. + Sichtbarkeit der Spalten - - - Plugin is not supported. - Plugin wird nicht unterstützt. + + Form + Format - - All categories - Alle Kategorien + + Results(xxx) + Ergebnisse (xxx) - - Movies - Filme + + Search in: + Suche in: - - TV shows - TV-Sendungen + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Manche Suchmaschinene suchen sowohl in der Torrentbeschreibung als auch im Torrentnamen. Die Anzeige solcher Ergebnisse in der unteren Liste kann hier eingestellt werden.</p><p><span style=" font-weight:600;">Überall </span>verhindert einen Filter und zeigt Alles an was von der Suchmaschinen zurückgegeben wird.</p><p><span style=" font-weight:600;">Nur Torrent-Namen</span> zeigt nur Torrents an, die dem Suchergebnis entsprechen.</p></body></html> - - Music - Musik + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Minimale u. Maximale Anzahl von Seeds einstellen</p></body></html> - - Games - Spiele + + Seeds: + Seeds: - - Anime - Anime + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Minimale Anzahl von Seeds</p></body></html> - - Software - Software + + + to + bis - - Pictures - Bilder + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Maximale Anzahl von Seeds</p></body></html> - - - Books - Bücher + + + + + - - Update server is temporarily unavailable. %1 - Update-Server vorübergehend nicht erreichbar. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Minimale u. Maximale Torrentgrösse einstellen</p></body></html> - - - Failed to download the plugin file. %1 - Fehler beim Herunterladen der Plugin-Datei. %1 + + Size: + Größe: - - An incorrect update info received. - Ungültige Aktualisierungsinformation erhalten. + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Minimale Torrentgrösse</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - Das Such-Plugin '%1' enthält ungültige Versions-Zeichenkette ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Maximale Torrentgrösse</p></body></html> @@ -7726,198 +6974,185 @@ - - - - + + + Search Suche - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - Es sind keine Such-Plugins installiert. -Wähle den "Such-Plugins ..."-Knopf unten rechts aus um welche zu installieren. - - - + Download Download - + Go to description page Zur Beschreibungsseite wechseln - + Copy description page URL Kopiere Beschreibungsseiten-URL - + Search plugins... - Such-Plugins ... + Suchplugins ... - + A phrase to search for. Suchphrase. - + Spaces in a search term may be protected by double quotes. Leerzeichen innerhalb von Suchausdrücken in Anführungszeichen setzen. - + Example: Search phrase example Beispiel: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>schnur los</b>: suche nach <b>schnur</b> und <b>los</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;schnur los&quot;</b>: suche nach <b>schnur los</b> - + All plugins Alle Plugins - + Only enabled Nur aktivierte - + Select... Wählen ... - - - + + + Search Engine Suchmaschine - + Please install Python to use the Search Engine. Python bitte installieren um die Suchmaschine benützen zu können. - + Empty search pattern Leere Suchanfrage - + Please type a search pattern first Bitte zuerst eine Suchanfrage eingeben - + Stop Stopp - + Search has finished Suche abgeschlossen - + Search has failed Suche fehlgeschlagen - ShutdownConfirmDialog + ShutdownConfirmDlg - - Don't show again - Nicht wieder anzeigen - - - + qBittorrent will now exit. qBittorrent wird jetzt beendet. - + E&xit Now Jetzt &beenden - + Exit confirmation - Beenden bestätigen + Beendigungsbestätigung - + The computer is going to shutdown. Der PC wird jetzt heruntergefahren. - + &Shutdown Now Jetzt &herunterfahren - - Shutdown confirmation - Herunterfahren bestätigen - - - + The computer is going to enter suspend mode. Der PC wird jetzt in den Engergiesparmodus versetzt. - + &Suspend Now &Energiesparmodus jetzt aktivieren - + Suspend confirmation - Energiesparmodus bestätigen + Bestätigung für Energiesparmodus - + The computer is going to enter hibernation mode. Der PC wird jetzt in den Ruhezustand versetzt. - + &Hibernate Now &Ruhezustand jetzt aktivieren - + Hibernate confirmation - Ruhezustand bestätigen + Bestätigung für Ruhezustand - + You can cancel the action within %1 seconds. Du kannst die Aktion binnen %1 Sekunden abbrechen. + + + Shutdown confirmation + Herunterfahren bestätigen + SpeedLimitDialog - + KiB/s KiB/s @@ -7925,52 +7160,52 @@ SpeedPlotView - + Total Upload Gesamter Upload - + Total Download Gesamter Download - + Payload Upload Nutzerdaten Upload - + Payload Download Nutzerdaten Download - + Overhead Upload Verwaltungsdaten-Upload - + Overhead Download Verwaltungsdaten-Download - + DHT Upload DHT-Upload - + DHT Download DHT-Download - + Tracker Upload Tracker Upload - + Tracker Download Tracker Download @@ -7978,95 +7213,87 @@ SpeedWidget - + Period: Dauer: - + 1 Minute 1 Minute - + 5 Minutes 5 Minuten - + 30 Minutes 30 Minuten - + 6 Hours 6 Stunden - + Select Graphs Grafik auswählen - + Total Upload Gesamter Upload - + Total Download Gesamter Download - + Payload Upload Nutzerdaten Upload - + Payload Download Nutzerdaten Download - + Overhead Upload Verwaltungsdaten-Upload - + Overhead Download Verwaltungsdaten-Download - + DHT Upload DHT-Upload - + DHT Download DHT-Download - + Tracker Upload Tracker Upload - + Tracker Download Tracker Download - StacktraceDialog - - - Crash info - Absturz-Informationen - - - StatsDialog @@ -8079,49 +7306,49 @@ Benutzer-Statistiken - - Cache statistics - Statistik für Zwischenspeicher + + Total peer connections: + Anzahl der Peer-Verbindungen: - - Read cache hits: - Zugriffe Lesepuffer: + + Global ratio: + Globales Verhältnis: - - Average time in queue: - Durchschnittliche Zeit in Warteschlange: + + Alltime download: + Gesamter Download: - - Connected peers: - Verbundene Peers: + + Alltime upload: + Gesamter Upload: - - All-time share ratio: - Gesamte Share-Rate: + + Total waste (this session): + Verworfen (in dieser Sitzung): - - All-time download: - Gesamter DL: + + Cache statistics + Statistik für Zwischenspeicher - - Session waste: - Abfall in dieser Sitzung: + + Read cache hits: + Zugriffe Lesepuffer: - - All-time upload: - Gesamter UL: + + Average time in queue: + Durchschnittliche Zeit in Warteschlange: - Total buffer size: - Gesamte Buffergröße: + Total buffers size: + Gesamte Puffergröße: @@ -8149,7 +7376,12 @@ Gesamte Warteschlangengröße: - + + OK + OK + + + %1 ms 18 milliseconds %1 ms @@ -8158,27 +7390,32 @@ StatusBar - + Connection status: Verbindungs-Status: - + No direct connections. This may indicate network configuration problems. Keine direkten Verbindungen. Möglicherweise gibt es Probleme mit der Netzwerkkonfiguration. - + DHT: %1 nodes DHT: %1 Knoten - - qBittorrent needs to be restarted! - qBittorrent benötigt einen Neustart! + + qBittorrent needs to be restarted + qBittorrent benötigt Neustart + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent wurde soeben aktualisiert. Änderungen werden erst nach einem Neustart aktiv. @@ -8197,882 +7434,616 @@ Online - + Click to switch to alternative speed limits Klicken um zu den alternativen Geschwindigkeitsbegrenzungen zu wechseln - + Click to switch to regular speed limits Klick um zu den regulären Geschwindigkeitsbegrenzungen zu wechseln - + + Manual change of rate limits mode. The scheduler is disabled. + Manueller Wechsel der Verhältnisbegrenzung. Steuerprogramm ist deaktiviert. + + + Global Download Speed Limit Begrenzung der globalen DL-Rate - + Global Upload Speed Limit Begrenzung der globalen UL-Rate - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter Alle (0) - + Downloading (0) Beim Herunterladen (0) - + Seeding (0) Seede (0) - + Completed (0) Abgeschlossen (0) - + Resumed (0) Fortgesetzt (0) - + Paused (0) Pausiert (0) - + Active (0) Aktiv (0) - + Inactive (0) Inaktiv (0) - + Errored (0) Fehlerhaft (0) - + All (%1) Alle (%1) - + Downloading (%1) Beim Herunterladen (%1) - + Seeding (%1) Seede (%1) - + Completed (%1) Abgeschlossen (%1) - + Paused (%1) Pausiert (%1) - + Resumed (%1) Fortgesetzt (%1) - + Active (%1) Aktiv (%1) - + Inactive (%1) Inaktiv (%1) - + Errored (%1) Fehlerhaft (%1) - TagFilterModel + TorrentContentModel - - Tags - Label + + Name + Name - - All - Alle + + Size + Größe - - Untagged - Ohne Label + + Progress + Fortschritt - - - TagFilterWidget - - Add tag... - Label hinzufügen ... + + Download Priority + Download-Priorität - - Remove tag - Label entfernen + + Remaining + Verbleibend + + + TorrentCreatorDlg - - Remove unused tags - Unbenutzte Label entfernen + + Select a folder to add to the torrent + Einen Ordner auswählen um ihn dem Torrent hinzuzufügen - - Resume torrents - Torrents fortsetzen + + Select a file to add to the torrent + Eine Datei auswählen um sie dem Torrent hinzuzufügen - - Pause torrents - Torrents pausieren + + No input path set + Kein Eingabepfad gesetzt - - Delete torrents - Torrents löschen + + Please type an input path first + Bitte zuerst einen Eingabepfad angeben - - New Tag - Neues Label + + Select destination torrent file + Torrent-Datei als Ziel auswählen - - Tag: - Label: + + Torrent Files (*.torrent) + Torrent-Dateien (*.torrent) - - Invalid tag name - Ungültiger Labelname + + Torrent was created successfully: %1 + %1 is the path of the torrent + Torrent wurde erfolgreich erstellt: %1 - - Tag name '%1' is invalid - Labelname '%1' ist ungültig + + + + Torrent creation + Erstellung des Torrent - - Tag exists - Label existiert + + Torrent creation was unsuccessful, reason: %1 + Erstellung des Torrent war nicht erfolgreich. Grund: %1 - - Tag name already exists. - Labelname existiert bereits. + + Created torrent file is invalid. It won't be added to download list. + Die erstellte Torrent-Datei ist ungültig. Sie wird nicht der Downloadliste hinzugefügt. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Eigenschaften der Torrent-Kategorie + + Name + i.e: torrent name + Name - - Name: - Name: + + Size + i.e: torrent size + Größe - - Save path: - Speicherpfad: + + Done + % Done + Fertig - - Choose save path - Speicherort wählen + + Status + Torrent status (e.g. downloading, seeding, paused) + Status - - New Category - Neue Kategorie + + Seeds + i.e. full sources (often untranslated) + Seeds - - Invalid category name - Ungültiger Kategoriename + + Peers + i.e. partial sources (often untranslated) + Peers - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - Der Kategoriename darf '\' nicht enthalten. -Der Kategoriename darf nicht mit '/' beginnen oder enden. -Der Kategoriename darf die Zeichenkette '//' nicht enthalten. + + Down Speed + i.e: Download speed + DL-Geschw. - - Category creation error - Fehler bei der Kategorieerstellung + + Up Speed + i.e: Upload speed + UL-Geschw. - - Category with the given name already exists. -Please choose a different name and try again. - Eine Kategorie mit diesem Namen existiert bereits - bitte einen anderen Namen wählen. + + Ratio + Share ratio + Verhältnis - - - TorrentContentModel - - Name - Name + + ETA + i.e: Estimated Time of Arrival / Time left + Fertig in - - Size - Größe + + Category + Kategorie - - Progress - Fortschritt + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Hinzugefügt am - - Download Priority - Download-Priorität + + Completed On + Torrent was completed on 01/01/2010 08:00 + Abgeschlossen am - - Remaining - Verbleibend + + Tracker + Tracker - - Availability - Verfügbarkeit + + Down Limit + i.e: Download limit + DL-Begrenzung - - - TorrentCreatorDialog - - Torrent Creator - Torrent-Ersteller + + Up Limit + i.e: Upload limit + UL-Begrenzung - - Select file/folder to share - Wähle Datei/Verzeichnis zum Tausch + + Downloaded + Amount of data downloaded (e.g. in MB) + Heruntergeladen - - Path: - Pfad: + + Uploaded + Amount of data uploaded (e.g. in MB) + Hochgeladen - - [Drag and drop area] - (Drag & Drop-Bereich) + + Session Download + Amount of data downloaded since program open (e.g. in MB) + DL in dieser Sitzung - - - Select file - Wähle Datei + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + UL in dieser Sitzung - - - Select folder - Wähle Verzeichnis + + Remaining + Amount of data left to download (e.g. in MB) + Verbleibend - - Settings - Einstellungen + + Time Active + Time (duration) the torrent is active (not paused) + Aktiv seit - - Piece size: - Größe der Teile: + + Save path + Torrent save path + Speicherpfad - - Auto - Automatisch + + Completed + Amount of data completed (e.g. in MB) + Abgeschlossen - - 16 KiB - 16 KiB + + Ratio Limit + Upload share ratio limit + Ratio Limit - - 32 KiB - 32 KiB + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Letzter Seeder (100%) gesehen - - 64 KiB - 64 KiB + + Last Activity + Time passed since a chunk was downloaded/uploaded + Letzte Aktivität - - 128 KiB - 128 KiB + + Total Size + i.e. Size including unwanted data + Gesamtgröße + + + TrackerFiltersList - - 256 KiB - 256 KiB + + All (0) + this is for the tracker filter + Alle (0) - - 512 KiB - 512 KiB + + Trackerless (0) + Ohne Tracker (0) - - 1 MiB - 1 MiB + + Error (0) + Fehler (0) - - 2 MiB - 2 MiB + + Warning (0) + Warnung (0) - - 4 MiB - 4 MiB + + + Trackerless (%1) + Ohne Tracker (%1) - - 8 MiB - 8 MiB + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - 16 MiB - 16 MiB + + + Error (%1) + Fehler (%1) - - 32 MiB - 32 MiB + + + Warning (%1) + Warnung (%1) - - Calculate number of pieces: - Berechne Anzahl Teile: + + Resume torrents + Torrents fortsetzen - - Private torrent (Won't distribute on DHT network) - Privat (wird nicht an das DHT-Netzwerk verteilt) + + Pause torrents + Torrents pausieren - - Start seeding immediately - Beginne Seeden sofort - - - - Ignore share ratio limits for this torrent - Ignoriere das Shareverhältnis-Limit für diese Torrent - - - - Optimize alignment - Optimiere Ausrichtung - - - - Fields - Felder - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - Die Trackergruppen können mit leeren Zeilen getrennt werden. - - - - Web seed URLs: - Webseed-URLs: - - - - Tracker URLs: - Tracker-URLs: - - - - Comments: - Kommentare: - - - - Source: - Quelle: - - - - Progress: - Fortschritt: - - - - Create Torrent - Torrent erstellen - - - - - - Torrent creation failed - Torrent-Erstellung gescheitert - - - - Reason: Path to file/folder is not readable. - Grund: Verzeichnis kann nicht gelesen werden. - - - - Select where to save the new torrent - Auswählen wohin der neue Torrent gespeichert werden soll - - - - Torrent Files (*.torrent) - Torrent-Dateien (*.torrent) - - - - Reason: %1 - Grund: %1 - - - - Reason: Created torrent is invalid. It won't be added to download list. - Grund: Die erstellte Torrent-Datei ist ungültig. Sie wird der Downloadliste nicht hinzugefügt. - - - - Torrent creator - Torrent-Ersteller - - - - Torrent created: - Torrent-Erstellung: - - - - TorrentInfo - - - File size exceeds max limit %1 - Die Dateigröße übersteigt das max. Limit von %1 - - - - Torrent file read error: %1 - Fehler beim Lesen der Torrent-Datei: %1 + + Delete torrents + Torrents löschen - - Torrent file read error: size mismatch - Fehler beim Lesen der Torrent-Datei: Größe stimmt nicht überein + + + All (%1) + this is for the tracker filter + Alle (%1) - TorrentsController - - - Not contacted yet - Noch nicht kontaktiert - - - - Updating... - Aktualisiere ... - - - - Working - Arbeitet - - - - Not working - Arbeitet nicht - + TrackerList - - Error: '%1' is not a valid torrent file. - Fehler: '%1' ist keine gültige Torrent-Datei. + + URL + URL - - - - - Torrent queueing must be enabled - Warteschlange für Torrents muss aktiviert sein + + Status + Status - - Save path cannot be empty + + Received - - - Category cannot be empty - + + Seeds + Seeds - - Unable to create category - + + Peers + Peers - - Unable to edit category + + Downloaded - Save path is empty - Speicherpfad ist leer - - - - Cannot make save path - Kann Speicherpfad nicht erstellen - - - - Cannot write to directory - Kann nicht in Verzeichnis schreiben - - - - WebUI Set location: moving "%1", from "%2" to "%3" - WebUI-Speicherort festlegen: "%1" wird von "%2" nach "%3" verschoben - - - - Incorrect torrent name - Ungültiger Torrent-Name - - - - - Incorrect category name - Ungültiger Kategoriename - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - Alle (0) - - - - Trackerless (0) - Ohne Tracker (0) - - - - Error (0) - Fehler (0) - - - - Warning (0) - Warnung (0) - - - - - Trackerless (%1) - Ohne Tracker (%1) - - - - - Error (%1) - Fehler (%1) - - - - - Warning (%1) - Warnung (%1) - - - - Resume torrents - Torrents fortsetzen - - - - Pause torrents - Torrents pausieren - - - - Delete torrents - Torrents löschen - - - - - All (%1) - this is for the tracker filter - Alle (%1) + + Message + Meldung - - - TrackerListWidget - - + + Working Arbeitet - + Disabled Deaktiviert - + This torrent is private Dieser Torrent ist privat - + Updating... Aktualisiere ... - + Not working Arbeitet nicht - + Not contacted yet Noch nicht kontaktiert - - - - - - - N/A - N/V + + Tracker URL: + Tracker-URL: - + Tracker editing Tracker editieren - - Tracker URL: - Tracker-URL: - - - - + + Tracker editing failed Tracker editieren fehlgeschlagen - + The tracker URL entered is invalid. Die eingegebene Tracker-URL ist ungültig. - + The tracker URL already exists. Die Tracker-URL existiert bereits. - + Add a new tracker... Neuen Tracker hinzufügen ... - - Remove tracker - Tracker entfernen - - - + Copy tracker URL Tracker-URL kopieren - + Edit selected tracker URL Ausgewählte Tracker-URL editieren - + Force reannounce to selected trackers Erzwinge erneute Anmeldung bei den gewählten Trackern - + Force reannounce to all trackers Erzwinge erneute Anmeldung bei allen Trackern - - URL - URL - - - - Status - Status - - - - Received - Empfangen - - - - Seeds - Seeds - - - - Peers - Peers - - - - Downloaded - Heruntergeladen - - - - Message - Meldung - - - - Column visibility - Spaltensichtbarkeit - - - - TrackerLoginDialog - - - - Tracker authentication - Tracker-Authentifizierung - - - - Tracker: - Tracker: - - - - Login - Login - - - - Username: - Benutzername: - - - - Password: - Passwort: - - - - Log in - Anmelden + + Remove tracker + Tracker entfernen - TrackersAdditionDialog + TrackersAdditionDlg - + Trackers addition dialog Dialog zum Hinzufügen eines Trackers - + List of trackers to add (one per line): Liste der hinzuzufügenden Tracker (einer pro Zeile): - - + + µTorrent compatible list URL: - µTorrent kompatible Listen-URL: + µTorrent kompatible Listen URL: + + + + I/O Error + I/O Fehler + + + + Error while trying to open the downloaded file. + Beim Versuch die heruntergeladenen Datei zu öffnen ist ein Fehler aufgetreten. - + No change - Keine Änderung + Keine Veränderung - + No additional trackers were found. Es wurden keine zusätzlichen Tracker gefunden. - + Download error Downloadfehler - + The trackers list could not be downloaded, reason: %1 Die Trackerliste konnte nicht geladen werden. Grund: %1 @@ -9080,105 +8051,99 @@ TransferListDelegate - + Downloading Lade - + Downloading metadata used when loading a magnet link Lade Metadaten - + Allocating qBittorrent is allocating the files on disk Weise zu - + Paused Angehalten - + Queued i.e. torrent is queued Eingereiht - + Seeding Torrent is complete and in upload-only mode Seede - + Stalled Torrent is waiting for download to begin Angehalten - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] Herunterladen - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] Seede - + Checking Torrent local data is being checked Überprüfe - + Queued for checking i.e. torrent is queued for hash checking Warten auf Überprüfung des Torrents - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Überprüfe Fortsetzungsdaten - + Completed Abgeschlossen - - Moving - Torrent local data are being moved/relocated - Verschiebe - - - + Missing Files Fehlende Dateien - + Errored torrent status, the torrent has an error Fehlerhaft - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (geseeded seit %2) - + %1 ago e.g.: 1h 20m ago vor %1 @@ -9186,580 +8151,594 @@ TransferListFiltersWidget - - - Status - Status - - - - Categories - Kategorien - - - - Tags - Label - - - - Trackers - Tracker - - - - TransferListModel - - - Name - i.e: torrent name - Name - - - - Size - i.e: torrent size - Größe - - - - Done - % Done - Fertig - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Status - - - - Seeds - i.e. full sources (often untranslated) - Seeds - - - - Peers - i.e. partial sources (often untranslated) - Peers - - - - Down Speed - i.e: Download speed - DL-Geschw. - - - - Up Speed - i.e: Upload speed - UL-Geschw. - - - - Ratio - Share ratio - Verhältnis - - - - ETA - i.e: Estimated Time of Arrival / Time left - Fertig in - - - - Category - Kategorie - - - - Tags - Label - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - Hinzugefügt am - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - Abgeschlossen am - - - - Tracker - Tracker - - - - Down Limit - i.e: Download limit - DL-Begrenzung - - - - Up Limit - i.e: Upload limit - UL-Begrenzung - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Runtergeladen - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Hochgeladen - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - DL in dieser Sitzung - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - UL in dieser Sitzung - - - - Remaining - Amount of data left to download (e.g. in MB) - Verbleibend - - - - Time Active - Time (duration) the torrent is active (not paused) - Aktiv seit - - - - Save path - Torrent save path - Speicherpfad - - - - Completed - Amount of data completed (e.g. in MB) - Abgeschlossen - - - - Ratio Limit - Upload share ratio limit - Verhältnis Limit - - - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - Letzter Seeder (100%) gesehen + + + Status + Status - - Last Activity - Time passed since a chunk was downloaded/uploaded - Letzte Aktivität + + Categories + Kategorien - - Total Size - i.e. Size including unwanted data - Gesamtgröße + + Trackers + Tracker TransferListWidget - + Column visibility Sichtbarkeit der Spalten - + Choose save path - Speicherort wählen + Speicherort auswählen - + Torrent Download Speed Limiting Begrenzung der Torrent-DL-Rate - + Torrent Upload Speed Limiting Begrenzung der Torrent-UL-Rate - + Recheck confirmation Überprüfe Bestätigung - + Are you sure you want to recheck the selected torrent(s)? Sollen die gewählten Torrents wirklich nochmals überprüft werden? - + Rename Umbenennen - + New name: Neuer Name: - + Resume Resume/start the torrent Fortsetzen - + Force Resume Force Resume/start the torrent Fortsetzen erzwingen - + Pause Pause the torrent Anhalten - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Speicherort festlegen: "%1" wird von "%2" nach "%3" verschoben - - - - Add Tags - Label hinzufügen - - - - Remove All Tags - Alle Label entfernen - - - - Remove all tags from selected torrents? - Wirklich alle Tags von den gewählten Torrents entfernen? + + New Category + Neue Kategorie - - Comma-separated tags: - Labels, mit Komma getrennt: + + Category: + Kategorie: - - Invalid tag - Ungültiger Labelname + + Invalid category name + Ungültiger Kategoriename - - Tag name: '%1' is invalid - Labelname '%1' ist ungültig + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Der Kategoriename darf '\' nicht enthalten. +Der Kategoriename darf nicht mit '/' beginnen oder enden. +Der Kategoriename darf die Zeichenkette '//' nicht enthalten. - + Delete Delete the torrent Löschen - + Preview file... Dateivorschau ... - + Limit share ratio... Shareverhältnis begrenzen ... - + Limit upload rate... Uploadrate begrenzen ... - + Limit download rate... Downloadrate begrenzen ... - + Open destination folder Zielverzeichnis öffnen - + Move up i.e. move up in the queue Nach oben bewegen - + Move down i.e. Move down in the queue Nach unten bewegen - + Move to top i.e. Move to top of the queue An den Anfang - + Move to bottom i.e. Move to bottom of the queue An das Ende - + Set location... Speicherort setzen ... - - Force reannounce - Erzwinge erneute Anmeldung - - - + Copy name Namen kopieren - - Copy hash - Prüfsumme kopieren - - - + Download first and last pieces first Erste und letzte Teile zuerst laden - + Automatic Torrent Management Automatisches Torrent-Management - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category Automatischer Modus bedeutet, daß diverse Torrent-Eigenschaften (z.B. der Speicherpfad) durch die gewählte Kategorie vorgegeben werden. - + Category Kategorie - + New... New category... Neu ... - + Reset Reset category Zurücksetzen - - Tags - Label - - - - Add... - Add / assign multiple tags... - Hinzufügen ... - - - - Remove All - Remove all tags - Alle entfernen - - - + Priority Priorität - + Force recheck Erzwinge erneute Überprüfung - + Copy magnet link Kopiere Magnet-Link - + Super seeding mode Super-Seeding-Modus - + Rename... Umbenennen ... - + Download in sequential order Der Reihe nach downloaden - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - Begrenzung des Torrent UL/DL-Verhältnisses + Begrenzung des Torrent Upload/Download Verhältnisses - - Use global share limit + + Use global ratio limit Globale Begrenzung für das Verhältnis verwenden - - - + + + buttonGroup Schaltegruppe - - Set no share limit + + Set no ratio limit Keine Begrenzung für das Verhältnis verwenden - - Set share limit to + + Set ratio limit to Begrenzung für das Verhältnis setzen + + + WebApplication - - ratio - Verhältnis + + Incorrect category name + Ungültiger Kategoriename + + + + WebUI + + + The Web UI is listening on port %1 + Das Webinterface lauscht auf Port %1 + + + + Web UI Error - Unable to bind Web UI to port %1 + Fehler im Webinterface - Es konnte nicht an Port %1 gebunden werden + + + + about + + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Ein fortschrittliches BitTorrent Programm erstellt in C++ und basierend auf dem Qt Toolkit sowie libtorrent-rasterbar. + + + + Copyright %1 2006-2016 The qBittorrent project + Copyright %1 2006-2016 - Das qBittorrent Projekt - - minutes - Minuten + + Home Page: + Webseite: - - No share limit method selected - Keine Methode für die Verhältnis-Begrenzung gewählt + + Forum: + Forum: - - Please select a limit method first - Bitte zuerst eine Begrenzungsmethode auswählen + + Bug Tracker: + Bugtracker: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - Python gefunden, Version: %1 + + Add Peers + Peers hinzufügen - - Python not detected - Python nicht gefunden + + List of peers to add (one per line): + Liste der hinzuzufügenden Peers (einer pro Zeile): + + + + Format: IPv4:port / [IPv6]:port + Format: IPv4:Port / [IPv6]:Port - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - Dateityp wird nicht akzeptiert - es sind nur gültige Dateitypen erlaubt. + + + Tracker authentication + Tracker Authentifizierung - - Symlinks inside alternative UI folder are forbidden. - Symbolische Verknüpfungen (Symlinks) innerhalb von Verzeichnissen für alternative UI sind nicht erlaubt. + + Tracker: + Tracker: - - Exceeded the maximum allowed file size (%1)! - Max. erlaubte Dateigröße wurde überschritten (%1)! + + Login + Login - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - WebUI: Ursprungs-Header & -Ziel stimmen nicht überein! Quell-IP: '%1'. Ursprungs-Header: '%2'. Ziel-Ursprung: '%3' + + Username: + Benutzername: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - WebUI: Referenz-Header & -Ziel stimmen nicht überein! Quell-IP: '%1'. Referenz-Header: '%2'. Ziel-Ursprung: '%3' + + Password: + Passwort: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - WebUI: Ungültiger Host-Header, Ports stimmen nicht überein. Angefragte Quell-IP: '%1'. Server-Port: '%2'. Empfangener Host-Header: '%3' + + Log in + Anmelden - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - WebUI: Ungültiger Host-Header. Angefragte Quell-IP: '%1'. Empfangener Host-Header: '%2' + + Cancel + Abbrechen - WebUI + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + Löschen bestätigen - qBittorrent + + + + Remember choice + Auswahl merken + + + + Also delete the files on the hard disk + Dateien auch von der Festplatte löschen + + + + confirmShutdownDlg + + + Don't show again + Nicht wieder anzeigen + + + + createTorrentDialog + + + Cancel + Abbrechen + + + + Torrent Creation Tool + Torrent-Erstellungswerkzeug + + + + Torrent file creation + Torrent-Dateierstellung + + + + Add file + Datei hinzufügen + + + + Add folder + Verzeichnis hinzufügen + + + + File or folder to add to the torrent: + Datei oder Verzeichnis die dem Torrent hinzugefügt werden: + + + + Tracker URLs: + Tracker-URLs: + + + + Web seeds urls: + Web Seeds URLs: + - - Web UI: HTTPS setup successful - Webinterface: HTTPS-Setup erfolgreich + + Comment: + Kommentar: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Die Trackergruppen können mit leeren Zeilen getrennt werden. + + + + Piece size: + Größe der Teile: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + Automatisch + + + + Private (won't be distributed on DHT network if enabled) + Privat (wird nicht an das DHT Netzwerk verteilt wenn aktiviert) + + + + Start seeding after creation + Beginne Seeden gleich nach Erstellung + + + + Ignore share ratio limits for this torrent + Ignoriere Shareverhältnisse für diesen Torrent + + + + Create and save... + Erstellen und speichern ... + + + + Progress: + Fortschritt: + + + + downloadFromURL + + + Add torrent links + Torrent-Links hinzufügen + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Einer pro Zeile (HTTP-Links, Magnet-Links und Info-Hashes werden unterstützt) - - Web UI: HTTPS setup failed, fallback to HTTP - Webinterface: HTTPS-Setup fehlgeschlagen - HTTP wird verwendet + + Download + Herunterladen + + + + Cancel + Abbrechen + + + + Download from urls + Von URLs laden + + + + No URL entered + Keine URL eingegeben - - Web UI: Now listening on IP: %1, port: %2 - Das Webinterface lauscht auf IP: %1, Port %2 + + Please type at least one URL. + Bitte mindestens eine URL angeben. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Webinterface kann nicht an IP: %1, Port %2 gebunden werden. Grund: %3 + + Crash info + Absturz-Informationen fsutils - + + + + + Downloads Downloads @@ -9767,100 +8746,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + Python nicht gefunden + + + + Python version: %1 + Python-Version: %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1h %2m - + %1d %2h e.g: 2days 10hours %1 T %2 h - + Unknown Unknown (size) Unbekannt - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent wird den Computer jetzt herunterfahren, da alle Downloads vollständig sind. - + < 1m < 1 minute < 1 Min - + %1m e.g: 10minutes %1 Min + + + Working + Arbeitet + + + + Updating... + Aktualisiere ... + + + + Not working + Arbeitet nicht + + + + Not contacted yet + Noch nicht kontaktiert + preview - + Preview selection Vorschau Auswahl - + The following files support previewing, please select one of them: Die folgenden Dateien unterstützen eine Vorschau - bitte eine Datei auswählen: + + + Preview + Vorschau + + + + Cancel + Abbrechen + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_el.ts qbittorrent-3.3.15/src/lang/qbittorrent_el.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_el.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_el.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - Σχετικά με το qBittorent + Σχετικά με το qBittorrent - + About Σχετικά - + Author Δημιουργός - - Current maintainer - Τρέχων συντηρητής + + + Nationality: + Εθνικότητα: - - Greece - Ελλάδα + + + Name: + Όνομα: - - - Nationality: - Εθνικότητα: + + + E-mail: + Διεύθυνση ηλ. ταχυδρομείου: - - - E-mail: - Διεύθυνση E-mail: + + Greece + Ελλάδα - - - Name: - Όνομα: + + Current maintainer + Τρέχων συντηρητής - + Original author Αρχικός δημιουργός - - France - Γαλλία - - - + Special Thanks Ειδικές Ευχαριστίες - + Translators Μεταφραστές - - License - Άδεια - - - + Libraries Βιβλιοθήκες - + qBittorrent was built with the following libraries: Το qBittorrent φτιάχτηκε με τις ακόλουθες βιβλιοθήκες: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - Προχωρημένο πρόγραμμα BitTorrent προγραμματισμένο σε C++, βασισμένο στην εργαλειοθήκη Qt και στο libtorrent-rasterbar. - - - - Copyright %1 2006-2018 The qBittorrent project - Πνευματική Ιδιοκτησία %1 2006-2018 Το εγχείρημα qBittorrent - - - - Home Page: - Αρχική Σελίδα: - - - - Forum: - Φόρουμ: + + France + Γαλλία - - Bug Tracker: - Ιχνηλάτης Σφαλμάτων: + + License + Άδεια @@ -115,57 +90,67 @@ Αποθήκευση σε - + + Browse... + Αναζήτηση… + + + + Set as default save path + Ορισμός ως προκαθορισμένη διαδρομή αποθήκευσης + + + Never show again Να μην εμφανιστεί ξανά - + Torrent settings Ρυθμίσεις torrent - + Set as default category Ορισμός ως προεπιλεγμένη κατηγορία - + Category: Κατηγορία: - + Start torrent Έναρξη torrent - + Torrent information Πληροφορίες torrent - + Skip hash check Παράλειψη ελέγχου hash - + Size: Μέγεθος: - + Hash: Hash: - + Comment: Σχόλιο: - + Date: Ημερομηνία: @@ -177,12 +162,12 @@ Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - Η αυτόματη λειτουργία σημαίνει ότι διάφορες ιδιότητες του torrent (π.χ. θέση αποθήκευσης) θα καθοριστούν από την συσχετισμένη κατηγορία. + Manual - Χειροκίνητα + Χειροποίητα @@ -190,234 +175,218 @@ Αυτόματα - - Remember last used save path - Απομνημόνευσε το τελευταία χρησιμοποιημένη διαδρομή αποθήκευσης - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - Όταν είναι επιλεγμένο, το αρχείο .torrent δεν θα διαγραφεί παρά τις ρυθμίσεις στη σελίδα «Λήψεις» του παραθύρου διαλόγου επιλογών + - + Do not delete .torrent file Μη διαγράψεις το αρχείο torrent - - Create subfolder - Δημιουργία υποφακέλου - - - - Download in sequential order - Λήψη σε διαδοχική σειρά - - - - Download first and last pieces first - Λήψη πρώτων και τελευταίων κομματιών πρώτα - - - + Normal Κανονική - + High Υψηλή - + Maximum Μέγιστη - + Do not download Να μην γίνει λήψη - - - + + + I/O Error Σφάλμα I/O - + Invalid torrent Μη έγκυρο torrent - - Renaming - Μετονομασία - - - - - Rename error - Σφάλμα μετονομασίας - - - - The name is empty or contains forbidden characters, please choose a different one. - Το όνομα είναι κενό ή περιέχει απαγορευμένους χαρακτήρες, παρακαλώ επιλέξτε διαφορετικό όνομα. + + + + + Already in download list + Ήδη στη λίστα λήψεων - + Not Available This comment is unavailable Μη Διαθέσιμο - + Not Available This date is unavailable Μη Διαθέσιμο - + Not available Μη διαθέσιμο - + Invalid magnet link Μη έγκυρος σύνδεσμος magnet - + The torrent file '%1' does not exist. Το αρχείο torrent '%1' δεν υπάρχει - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. - Το αρχείο torrent '%1' δεν μπορεί να διαβαστεί από τον δίσκο. Πιθανώς να μην έχετε αρκετά δικαιώματα. + - + Failed to load the torrent: %1. Error: %2 Don't remove the ' ' characters. They insert a newline. - Αποτυχία φόρτωσης του torrent: %1. -Σφάλμα: %2 + + + + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Το torrent είναι ήδη στην λίστα λήψεων. Οι ιχνηλάτες δεν συγχωνεύτηκαν γιατί είναι ιδιωτικό torrent. + + + + Torrent is already in download list. Trackers were merged. + Το torrent υπάρχει ήδη στη λίστα λήψεων. Οι ιχνηλάτες συγχωνεύθηκαν. + + + + + Cannot add torrent + Αδυναμία προσθήκης τόρεντ + + + + Cannot add this torrent. Perhaps it is already in adding state. + Δεν μπορείτε να προσθέσετε αυτό το torrent. Ίσως να είναι ήδη σε κατάσταση προσθήκης. - + This magnet link was not recognized Αυτός ο σύνδεσμος magnet δεν αναγνωρίστηκε - + + Magnet link is already in download list. Trackers were merged. + Ο σύνδεσμος magnet είναι ήδη στη λίστα λήψεων. Οι ιχνηλάτες συγχωνεύθηκαν. + + + + Cannot add this torrent. Perhaps it is already in adding. + Δεν μπορείτε να προσθέσετε αυτό το torrent. Ίσως να είναι ήδη σε κατάσταση προσθήκης. + + + Magnet link Σύνδεσμος magnet - + Retrieving metadata... Ανάκτηση μεταδεδομένων… - + Not Available This size is unavailable. Μη Διαθέσιμο - + Free space on disk: %1 Ελεύθερος χώρος στον δίσκο: %1 - + + Choose save path Επιλέξτε την διαδρομή αποθήκευσης - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - + + Rename the file + Μετονομασία αρχείου - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + + New name: + Νέο όνομα: - - Magnet link is already queued for processing. - + + + The file could not be renamed + Αυτό το αρχείο δεν ήταν δυνατό να μετονομαστεί - - New name: - Νέο όνομα: + + This file name contains forbidden characters, please choose a different one. + Αυτό το όνομα αρχείου περιέχει απαγορευμένους χαρακτήρες, παρακαλώ επιλέξτε ένα διαφορετικό. - - + + This name is already in use in this folder. Please use a different name. Αυτό το όνομα ήδη χρησιμοποιείται σε αυτόν τον φάκελο. Παρακαλώ επιλέξτε ένα διαφορετικό όνομα. - + The folder could not be renamed Ο φάκελος δεν ήταν δυνατό να μετονομαστεί - + Rename... Μετονομασία… - + Priority Προτεραιότητα - + Invalid metadata Μη έγκυρα μεταδεδομένα - + Parsing metadata... Ανάλυση μεταδεδομένων… - + Metadata retrieval complete Ανάκτηση μεταδεδομένων ολοκληρώθηκε - + Download Error Σφάλμα Λήψης @@ -425,312 +394,198 @@ AdvancedSettings - + + Disk write cache size + Μέγεθος προσωρινής μνήμης εγγραφής στο δίσκο + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Εξερχόμενες θύρες (Ελάχ) [0: Απενεργοποιημένες] - + Outgoing ports (Max) [0: Disabled] Εξερχόμενες θύρες (Μέγ) [0: Απενεργοποιημένες] - + Recheck torrents on completion Επανέλεγχος των torrent στην ολοκλήρωση - + Transfer list refresh interval Ρυθμός ανανέωσης λίστας μεταφορών - + ms milliseconds ms - + Setting Ρύθμιση - + Value Value set for this setting Τιμή - - - (disabled) - (απενεργοποιημένο) - - - + (auto) (αυτόματο) - - min - minutes - λεπ - - - + All addresses Όλες οι διευθύνσεις - + qBittorrent Section Τμήμα qBittorrent - - + + Open documentation Άνοιγμα τεκμηρίωσης - + libtorrent Section Τμήμα libtorrent - - Asynchronous I/O threads - - - - - Disk cache - Μνήμη cache του δίσκου - - - + s seconds δ - + Disk cache expiry interval Διάστημα λήξης προσωρινής μνήμης δίσκου - + Enable OS cache Ενεργοποίηση προσωρινής μνήμης λειτουργικού συστήματος - - Guided read cache - Καθοδηγούμενη cache ανάγνωσης - - - - Coalesce reads & writes - Ένωση reads & writes - - - - Send upload piece suggestions - Στείλτε προτάσεις ανεβάσματος κομματιών - - - - - KiB - KiB - - - - Send buffer watermark - Αποστολή κενού υδατογραφήματος - - - - Send buffer low watermark - Αποστολή χαμηλού υδατογραφήματος - - - - Send buffer watermark factor - Αποστολή κενού παράγοντα υδατογραφήματος - - - - Prefer TCP - Προτίμηση TCP - - - - Peer proportional (throttles TCP) - Αναλογικάα ομότιμα (επιταχύνει το TCP) - - - - Allow multiple connections from the same IP address - Να επιτρέπονται πολλαπλές συνδέσεις από την ίδια διεύθυνση IP + + m + minutes + λ - + Resolve peer countries (GeoIP) Επίλυση χωρών διασυνδέσεων (GeoIP) - + Resolve peer host names Επίλυση ονομάτων φορέων διασυνδέσεων - + Strict super seeding Αυστηρός σούπερ διαμοιρασμός - + Network Interface (requires restart) Διεπαφή Δικτύου (απαιτεί επανεκκίνηση) - + Optional IP Address to bind to (requires restart) - Προαιρετική Διεύθυνση IP για δέσμευση (απαιτεί επανεκκίνηση) + - + Listen on IPv6 address (requires restart) Ακρόαση για IPv6 διεύθυνση (απαιτεί επανεκκίνηση) - + Display notifications - Εμφάνιση ειδοποιήσεων + Εμφάνισε ειδοποιήσεις - + Display notifications for added torrents Εμφάνισε ειδοποιήσεις για τα προστιθέμενα torrents - + Download tracker's favicon - Λήψη favicon του ιχνηλάτη - - - - Save path history length - Μέγεθος ιστορικού διαδρομών αποθήκευσης - - - - Fixed slots - Σταθερά slots - - - - Upload rate based - Βάση ταχύτητας μεταφόρτωσης - - - - Upload slots behavior - Συμπεριφορά θέσεων αποστολής - - - - Round-robin - Round-robin - - - - Fastest upload - Γρηγορότερο ανέβασμα - - - - Anti-leech - Anti-leech - - - - Upload choking algorithm - Μεταφόρτωση αμβλυμένου αλγόριθμου + - + Confirm torrent recheck Επιβεβαίωση επανελέγχου torrent - - Confirm removal of all tags - Επιβεβαίωση αφαίρεσης όλων των ετικετών - - - - Always announce to all trackers in a tier - Πάντα ανακοίνωση προς όλους τους ιχνηλάτες σε ένα επίπεδο + Exchange trackers with other peers + Ανταλλαγή ιχνηλατών με άλλες διασυνδέσεις - - Always announce to all tiers - Πάντα ανακοίνωση σε όλα τα επίπεδα + + Always announce to all trackers + Πάντα ανακοίνωση προς όλους τους ιχνηλάτες - + Any interface i.e. Any network interface Οποιαδήποτε διεπαφή - + Save resume data interval How often the fastresume file is saved. Αποθήκευση διαστήματος συνέχισης δεδομένων - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - %1-TCP μεικτής λειτουργίας αλγόριθμος - - - + Maximum number of half-open connections [0: Unlimited] Μέγιστος αριθμός μισάνοιχτων συνδέσεων [0: Απεριόριστο] - + IP Address to report to trackers (requires restart) Διεύθυνση IP που ανακοινώνεται στους ιχνηλάτες (απαιτεί επανεκκίνηση) - + Enable embedded tracker Ενεργοποίηση ενσωματωμένου ιχνηλάτη - + Embedded tracker port Θύρα ενσωματωμένου ιχνηλάτη - + Check for software updates Έλεγχος για ενημερώσεις λογισμικού - + Use system icon theme Χρήση θέματος εικονιδίων συστήματος @@ -738,120 +593,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started To qBittorrent %1 ξεκίνησε - + Torrent: %1, running external program, command: %2 - Torrent: %1, εκτέλεση εξωτερικού προγράμματος, εντολή: %2 - - - - Torrent name: %1 - Όνομα torrent: %1 - - - - Torrent size: %1 - Μέγεθος torrent: %1 - - - - Save path: %1 - Τοποθεσία αποθήκευσης: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Το torrent λήφθηκε σε %1. - - - - Thank you for using qBittorrent. - Σας ευχαριστούμε που χρησιμοποιείτε το qBittorrent. + - - [qBittorrent] '%1' has finished downloading - [qBittorrent] Η λήψη του '%1' ολοκληρώθηκε. + + Torrent: %1, run external program command too long (length > %2), execution failed. + - + Torrent: %1, sending mail notification - Torrent: %1, αποστολή ειδοποίησης μέσω email + - + Information Πληροφορίες - - To control qBittorrent, access the Web UI at %1 - Για να χειριστείτε το qBittorent, επισκεφτείτε το Περιβάλλον Χρήστη Ιστού - Web UI στο %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + Για να χειριστείτε το qBittorent, επισκεφτείτε το UI Ιστού στο http://localhost:%1 - + The Web UI administrator user name is: %1 Το όνομα χρήστη του διαχειριστή στο UI Ιστού είναι: %1 - + The Web UI administrator password is still the default one: %1 Ο κωδικός πρόσβασης του διαχειριστή στο UI Ιστού είναι ακόμη ο προεπιλεγμένος: %1 - + This is a security risk, please consider changing your password from program preferences. Αυτό είναι κίνδυνος για την ασφάλεια, παρακαλούμε λάβετε υπ' όψιν να αλλάξετε τον κωδικό πρόσβασής σας από τις προτιμήσεις του προγράμματος. - + Saving torrent progress... Αποθήκευση προόδου torrent… - - - Portable mode and explicit profile directory options are mutually exclusive - Η φορητή λειτουργία και οι επιλογές ρητού καταλόγου προφίλ αλληλοαποκλείονται - - - - Portable mode implies relative fastresume - Η φορητή λειτουργία προϋποθέτει σχετικά γρήγορη συνέχεια - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - Η IP διεύθυνσή σας έχει αποκλειστεί μετά από πολλές αποτυχημένες προσπάθειες ταυτοποίησης. - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Αποθήκευση σε: @@ -861,817 +657,676 @@ Λήπτης RSS - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - Η αυτόματη λήψη των RSS torrent είναι τώρα απενεργοποιημένη! Μπορείτε να την ενεργοποιήσετε στις ρυθμίσεις εφαρμογής. + + Enable Automated RSS Downloader + Ενεργοποίηση Αυτοματοποιημένου RSS Λήπτη - + Download Rules Κανόνες Λήψης - + Rule Definition Ορισμός Κανόνα - + Use Regular Expressions Χρήση Κανονικών Εκφράσεων - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - Το Φίλτρο Smart Episode θα ελέγξει τον αριθμό επισοδείου για να αποτρέψει το κατέβασμα αντιγράφων. -Υποστηρίζει τις μορφές: S01E01, 1x1, 2017.01.01 και 01.01.2017 (Οι μορφές ημερομηνίας επίσης υποστηρίζουν "-" ως διαχωριστικό) - - - - Use Smart Episode Filter - Χρήση φίλτρου Έξυπνου Επισοδείου - - - + Must Contain: Να Περιέχει: - + Must Not Contain: Να Μην Περιέχει: - + Episode Filter: Φίλτρο Επεισοδίου: - + Assign Category: Ορισμός Κατηγορίας: - + Save to a Different Directory Αποθήκευση σε διαφορετικό κατάλογο - + Ignore Subsequent Matches for (0 to Disable) ... X days Παράβλεψη μεταγενέστερων αντιστοιχιών για (0 για απενεργοποίηση) - + Disabled - Απενεργοποιημένο + Απενεργοποιημένο - + days ημέρες - + Add Paused: Προσθήκη Σε Παύση: - + Use global settings Χρησιμοποιήστε τις γενικές ρυθμίσεις - + Always Πάντα - + Never Ποτέ - + Apply Rule to Feeds: Εφαρμογή κανόνα στις τροφοδοσίες: - + Matching RSS Articles Άρθρα RSS που Αντιστοιχούν - + &Import... Ε&ισαγωγή... - + &Export... &Εξαγωγή… - + Matches articles based on episode filter. Αντιστοιχεί άρθρα βασισμένα στο φίλτρο επεισοδίου. - + Example: Παράδειγμα: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match θα αντιστοιχίσει τα 2, 5, 8 έως 15, 30 και μετέπειτα επεισόδια της πρώτης σεζόν. - + Episode filter rules: Κανόνες φίλτρου επεισοδίου: - + Season number is a mandatory non-zero value Ο αριθμός της σεζόν είναι υποχρεωτική μή μηδενική τιμή - + Episode number is a mandatory non-zero value + Ο αριθμός επεισοδίου είναι υποχρεωτική μη μηδενική τιμή + + + Filter must end with semicolon Το φίλτρο πρέπει να τελειώνει με άνω τελεία - + Three range types for episodes are supported: Υποστηρίζονται τρεις τύποι εύρους για επεισόδια: - + Single number: <b>1x25;</b> matches episode 25 of season one Μονός αριθμός: <b>1x25;</b> αντιστοιχεί το επεισόδιο 25 της πρώτης σεζόν - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Κανονικό εύρος: <b>1x25-40;</b> αντιστοιχεί τα επεισόδια 25 έως 40 της πρώτης σεζόν - - Episode number is a mandatory positive value - Ο αριθμός επεισοδίου είναι μια υποχρεωτική θετική τιμή. - - - - Rules - Κανόνες + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Άπειρο εύρος: <b>1x25-;</b> αντιστοιχεί τα επεισόδια 25 και προς τα πάνω της πρώτης σεζόν - - Rules (legacy) - Κανόνες (παλιοί) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Άπειρο εύρος: <b>1x25-;</b> ταιριάζει σε επεισόδια 25 και πάνω της πρώτης σεζόν, και όλα τα επεισόδια από μετέπειτα σεζόν + - + Last Match: %1 days ago Τελευταία Αντιστοιχία: πριν από %1 ημέρες - + Last Match: Unknown Τελευταία Αντιστοιχία: Άγνωστο - + New rule name Όνομα νέου κανόνα - + Please type the name of the new download rule. Παρακαλώ πληκτρολογήστε το όνομα του νέου κανόνα λήψης. - - + + Rule name conflict Διένεξη ονόματος κανόνα - - + + A rule with this name already exists, please choose another name. Ένας κανόνας με αυτό το όνομα υπάρχει ήδη, παρακαλώ επιλέξτε ένα άλλο όνομα. - + Are you sure you want to remove the download rule named '%1'? Είστε σίγουροι πως θέλετε να αφαιρέσετε τον κανόνα λήψης με όνομα '%1'; - + Are you sure you want to remove the selected download rules? Είστε βέβαιοι ότι θέλετε να αφαιρέσετε τους επιλεγμένους κανόνες λήψης; - + Rule deletion confirmation Επιβεβαίωση διαγραφής κανόνα - + Destination directory Κατάλογος προορισμού - + Invalid action Μη έγκυρη ενέργεια - + The list is empty, there is nothing to export. Η λίστα είναι άδεια, δεν υπάρχει τίποτα προς εξαγωγή. - - Export RSS rules - Εξαγωγή κανόνων RSS + + Where would you like to save the list? + Πού θα θέλατε να αποθηκεύσετε τη λίστα; - - + + Rules list (*.rssrules) + Λίστα κανόνων (*.rssrules) + + + I/O Error - Σφάλμα I/O + Σφάλμα Ι/Ο - - Failed to create the destination file. Reason: %1 - Αποτυχία δημιουργίας του αρχείου προορισμού. Εξαιτίας: %1 + + Failed to create the destination file + Αποτυχία δημιουργίας αρχείου προορισμού - - Import RSS rules - Εισαγωγή κανόνων RSS + + Please point to the RSS download rules file + Παρακαλούμε επιλέξτε το αρχείο κανόνων λήψης RSS - - Failed to open the file. Reason: %1 - Αποτυχία ανοίγματος του αρχείου. Εξαιτίας: %1 + + Rules list + Λίστα κανόνων - + Import Error Σφάλμα Εισαγωγής - - Failed to import the selected rules file. Reason: %1 - Αποτυχία εισαγωγής του επιλεγμένου αρχείου κανόνων. Εξαιτίας: %1 + + Failed to import the selected rules file + Αποτυχία εισαγωγής του επιλεγμένου αρχείου κανόνων - + Add new rule... Προσθήκη νέου κανόνα… - + Delete rule Διαγραφή κανόνα - + Rename rule... Μετονομασία κανόνα… - + Delete selected rules Διαγραφή επιλεγμένων κανόνων - - Clear downloaded episodes... - Καθαρισμός κατεβασμένων επισοδείων... - - - + Rule renaming Μετονομασία κανόνα - + Please type the new rule name Παρακαλώ πληκτρολογήστε το νέο όνομα κανόνα - - Clear downloaded episodes - Καθαρισμός κατεβασμένων επισοδείων - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - Είστε βέβαιοι ότι θέλετε να καθαρίσετε την λίστα κατεβασμένων επισοδείων για τον επιλεγμένο κανόνα λήψης; - - - - Regex mode: use Perl-compatible regular expressions - Λειτουργία regex: χρησιμοποιήστε συμβατές-με-Perl κανονικές εκφράσεις - - - - - Position %1: %2 - Θέση %1: %2 + + Regex mode: use Perl-like regular expressions + Λειτουργία Regex: χρήση κανονικών εκφράσεων παρόμοιων της Perl - + Wildcard mode: you can use - Λειτουργία μπαλαντέρ: μπορείτε να χρησιμοποιήσετε + - + ? to match any single character - ? για να ταιριάξετε οποιοδήποτε μεμονωμένο χαρακτήρα + - + * to match zero or more of any characters - * για να ταιριάξετε κανέναν ή περισσότερους από οποιουσδήποτε χαρακτήρες + - + Whitespaces count as AND operators (all words, any order) - Τα κενά μετράνε ως τελεστές AND (όλες οι λέξεις, οποιαδήποτε σειρά) + - + | is used as OR operator - Το | χρησιμοποιείται ως τελεστής OR + - + If word order is important use * instead of whitespace. - Αν η σειρά των λέξεων παίζει ρόλο χρησιμοποιείστε * αντί για κενό. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Μια έκφραση με ένα κενό %1 όρο (e.g. %2) + - + will match all articles. - θα ταιριάξει όλα τα άρθρα. + - + will exclude all articles. - θα εξαιρέσει όλα τα άρθρα. + - - - BanListOptionsDialog - - List of banned IP addresses - - - - - Ban IP - - - - - Delete - Διαγραφή - - - - - Warning - Προειδοποίηση - - - - The entered IP address is invalid. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Λειτουργία wildcard: μπορείτε να χρησιμοποιήσετε<ul><li>? για να ταιριάξετε οποιοδήποτε μεμονωμένο χαρακτήρα</li><li>* για να ταιριάξετε μηδέν ή περισσότερους από οποιουσδήποτε χαρακτήρες</li><li>Τα κενά διαστήματα μετρούν ως AND χειριστές</li></ul> - - The entered IP is already banned. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Λειτουργία wildcard: μπορείτε να χρησιμοποιήσετε<ul><li>? για να ταιριάξετε οποιοδήποτε μεμονωμένο χαρακτήρα</li><li>* για να ταιριάξετε μηδέν ή περισσότερους από οποιουσδήποτε χαρακτήρες</li><li>το | χρησιμοποιείται ως OR χειριστής</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support Απαιτείται επανεκκίνηση για την εναλλαγή υποστήριξης PeX - - Could not get GUID of configured network interface. Binding to IP %1 - Δεν μπόρεσε να ληφθεί η GUID ρύθμιση διασύνδεσης δικτύου. Σύνδεση με IP %1 - - - + Embedded Tracker [ON] Ενσωματωμένος Ιχνηλάτης [ΝΑΙ] - + Failed to start the embedded tracker! Αποτυχία έναρξης του ενσωματωμένου ιχνηλάτη! - + Embedded Tracker [OFF] Ενσωματωμένος Ιχνηλάτης [ΟΧΙ] - + + '%1' reached the maximum ratio you set. Removing... + Το '%1' έφτασε τη μέγιστη αναλογία που θέσατε. Αφαίρεση... + + + + '%1' reached the maximum ratio you set. Pausing... + Το '%1' έφτασε τη μέγιστη αναλογία που θέσατε. Γίνεται παύση... + + + System network status changed to %1 e.g: System network status changed to ONLINE Η κατάσταση δικτύου του συστήματος άλλαξε σε %1 - + ONLINE ΣΕ ΣΥΝΔΕΣΗ - + OFFLINE ΕΚΤΟΣ ΣΥΝΔΕΣΗΣ - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding Η διαμόρφωση δικτύου του %1 άλλαξε, γίνεται ανανέωση δεσμών συνεδρίας - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. - Η διεύθυνση της διαμορφωμένης διεπαφής δικτύου %1 δεν είναι έγκυρη. + - - + Encryption support [%1] - Υποστήριξη κρυπτογράφησης [%1] + - - + FORCED - ΕΞΑΝΑΓΚΑΣΜΕΝΟ - - - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - Το %1 δεν είναι έγκυρη IP διεύθυνση και απορρίφθηκε κατά την εφαρμογή της λίστας των αποκλεισμένων διευθύνσεων. + - - + Anonymous mode [%1] - Ανώνυμη λειτουργία [%1] + - + Unable to decode '%1' torrent file. Αδυναμία αποκωδικοποίησης του '%1' αρχείου torrent. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Αναδρομική λήψη του αρχείου '%1' ενσωματωμένου στο torrent '%2' - + Queue positions were corrected in %1 resume files - Οι θέσεις σε ουρά διορθώθηκαν σε %1 αρχεία συνέχισης + - + Couldn't save '%1.torrent' Δεν ήταν δυνατή η αποθήκευση του '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - Το '%1' αφαιρέθηκε από την λίστα μεταφορών. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - To '%1' αφαιρέθηκε από την λίστα μεταφορών και τον σκληρό δίσκο. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - Το '%1' αφαιρέθηκε από την λίστα μεταφορών αλλά τα αρχεία δεν ήταν δυνατό να διαγραφούν. Σφάλμα: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. γιατί το %1 είναι απενεργοποιημένο. - + because %1 is disabled. this peer was blocked because TCP is disabled. γιατί το %1 είναι απενεργοποιημένο. - + URL seed lookup failed for URL: '%1', message: %2 Αποτυχία επαλήθευσης URL διαμοιραστή για το URL: '%1', μήνυμα: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. Το qBittorrent απέτυχε να λειτουργήσει στην διεπαφή %1 θύρα: %2/%3. Αιτία: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + To '%1' αφαιρέθηκε από την λίστα μεταφορών και τον σκληρό δίσκο. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + Το '%1' αφαιρέθηκε από την λίστα μεταφορών. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Λήψη «%1», παρακαλώ περιμένεται… - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 Το qBittorrent προσπαθεί να λειτουργήσει σε οποιαδήποτε θύρα διεπαφής: %1 - + The network interface defined is invalid: %1 Η δικτυακή διεπαφή που έχει οριστεί δεν είναι έγκυρη: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 Το qBittorent προσπαθεί να λειτουργήσει στην διεπαφή: %1 θύρα: %2 - - Peer ID: - Αναγνωριστικό Διασύνδεσης: - - - - HTTP User-Agent is '%1' - O HTTP User-Agent είναι '%1' - - - - + DHT support [%1] - Υποστήριξη DHT [%1] + - - - - - - - - - + + + + ON - ON + Ενεργοποίηση - - - - - - - - - + + + + OFF - OFF + Σβήσιμο - - + Local Peer Discovery support [%1] - Υποστήριξη Τοπικού Εντοπισμού Ομότιμων χρηστών [%1] - - - - PeX support [%1] - Υποστηρίξη PeX [%1] - - - - '%1' reached the maximum ratio you set. Removed. - Το '%1' έφτασε τη μέγιστη αναλογία που θέσατε. Αφαιρέθηκε. - - - - '%1' reached the maximum ratio you set. Paused. - Το '%1' έφτασε τη μέγιστη αναλογία που θέσατε. Σε παύση. - - - - '%1' reached the maximum seeding time you set. Removed. - Το '%1' έφτασε τη μέγιστη ώρα διαμοιρασμού που θέσατε. Αφαιρέθηκε. - - - - '%1' reached the maximum seeding time you set. Paused. - Το '%1' έφτασε τη μέγιστη ώρα διαμοιρασμού που θέσατε. Σε παύση. + - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on Το qBittorrent δεν βρήκε μια %1 τοπική διεύθυνση για να λειτουργήσει - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface Το qBittorent απέτυχε στην λειτουργία οποιασδήποτε θύρας διεπαφής: %1. Αιτία: %2 - + Tracker '%1' was added to torrent '%2' Ο ιχνηλάτης '%1' προστέθηκε στο torrent '%2' - + Tracker '%1' was deleted from torrent '%2' Ο ιχνηλάτης '%1' διαγράφηκε από το torrent '%2' - + URL seed '%1' was added to torrent '%2' Το URL διαμοιραστή '%1' προστέθηκε στο torrent '%2' - + URL seed '%1' was removed from torrent '%2' Το URL διαμοιραστή '%1' αφαιρέθηκε από το torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Δεν είναι δυνατή η συνέχιση του torrent '%1'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Επιτυχής ανάλυση του παρεχόμενου IP φίλτρου: εφαρμόστηκαν %1 κανόνες. - + Error: Failed to parse the provided IP filter. Σφάλμα: Αποτυχία ανάλυσης του παρεχόμενου φίλτρου IP. - - '%1' restored. - 'torrent name' restored. - - - - + Couldn't add torrent. Reason: %1 Δεν ήταν δυνατή η προσθήκη torrent. Αιτία: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + Το '%1' είναι σε συνέχιση. (γρήγορη συνέχιση) + + + '%1' added to download list. 'torrent name' was added to download list. Το '%1' προστέθηκε στη λίστα λήψεων. - + An I/O error occurred, '%1' paused. %2 Προέκυψε ένα σφάλμα Ι/Ο, το '%1' τέθηκε σε παύση. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Αποτυχία αντιστοίχισης θυρών, μήνυμα: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Επιτυχία αντιστοίχισης θυρών, μήνυμα: %1 - + due to IP filter. this peer was blocked due to ip filter. λόγω φίλτρου IP. - + due to port filter. this peer was blocked due to port filter. λόγω φίλτρου θύρας. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. λόγω περιορισμών i2p μικτής λειτουργίας. - + because it has a low port. this peer was blocked because it has a low port. γιατί έχει χαμηλή θύρα. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 Το qBittorrent χρησιμοποιεί επιτυχώς τη διεπαφή %1 θύρα: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 Εξωτερική IP: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - η δημιουργία νέου αρχείου torrent απέτυχε - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - Λήψη πρώτου και τελευταίου κομματιού πρώτα: %1, torrent: '%2' - - - - On - Ενεργοποιημένο - - - - Off - Απενεργοποιημένο - - - - Successfully moved torrent: %1. New path: %2 - Επιτυχής μετακίνηση του torrent: %1. Nέα διαδρομή: %2 - - - + Could not move torrent: '%1'. Reason: %2 Δεν ήταν δυνατό να μετακινηθεί το torrent %1'. Αιτία: %2 - + File sizes mismatch for torrent '%1', pausing it. Αναντιστοιχία μεγεθών των αρχείων για το torrent '%1', γίνεται παύση. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... Η γρήγορη συνέχιση δεδομένων απορρίφθηκε για το torrent '%1'. Αιτία: %2. Γίνεται επανέλεγχος... @@ -1679,19 +1334,19 @@ CategoryFilterModel - + Categories - Κατηγορίες + Κατηγορίες - + All - Όλα + Όλα - + Uncategorized - Χωρίς κατηγορία + @@ -1699,42 +1354,147 @@ Add category... - Προσθήκη κατηγορίας... + Προσθήκη κατηγορίας... Add subcategory... - Προσθήκη υποκατηγορίας... + - Edit category... - Επεξεργασία κατηγορίας... + Remove category + Αφαίρεση κατηγορίας + + + + Remove unused categories + Αφαίρεση αχρησιμοποίητων κατηγοριών + + + + Resume torrents + + + + + Pause torrents + + + + + Delete torrents + + + + + New Category + Νέα Κατηγορία + + + + Category: + Κατηγορία: + + + + Invalid category name + Μη έγκυρο όνομα κατηγορίας + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Το όνομα της κατηγορίας δεν θα πρέπει να περιέχει '\'. +Το όνομα της κατηγορίας δεν θα πρέπει να ξεκινά/τελειώνει με '/'. +Το όνομα της κατηγορίας δεν θα πρέπει να περιέχει αλληλουχία '//'. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Όλα (0) + + + Uncategorized (0) + Χωρίς κατηγορία (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Χωρίς κατηγορία (%1) + + + Add category... + Προσθήκη κατηγορίας... - Remove category - Αφαίρεση κατηγορίας + Αφαίρεση κατηγορίας - Remove unused categories - Αφαίρεση αχρησιμοποίητων κατηγοριών + Αφαίρεση αχρησιμοποίητων κατηγοριών - Resume torrents - Συνέχιση torrents + Συνέχιση torrents - Pause torrents - Παύση torrents + Παύση torrents - Delete torrents - Διαγραφή torrents + Διαγραφή torrents + + + New Category + Νέα Κατηγορία + + + Category: + Κατηγορία: + + + Invalid category name + Μη έγκυρο όνομα κατηγορίας + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Το όνομα της κατηγορίας δεν θα πρέπει να περιέχει '\'. +Το όνομα της κατηγορίας δεν θα πρέπει να ξεκινά/τελειώνει με '/'. +Το όνομα της κατηγορίας δεν θα πρέπει να περιέχει αλληλουχία '//'. + + + All (%1) + this is for the category filter + Όλα (%1) @@ -1774,220 +1534,101 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Επιβεβαίωση διαγραφής - - - - Remember choice - - - - - Also delete the files on the hard disk - - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Είστε σίγουροι πως θέλετε να διαγράψετε το '%1' από τη λίστα μεταφορών; - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - - - - - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - Λήψη - - - - No URL entered - - - - - Please type at least one URL. - + Είστε σίγουροι πως θέλετε να διαγράψετε αυτά τα "%1" torrents από τη λίστα μεταφορών; DownloadedPiecesBar - + White: Missing pieces Λευκό: Κομμάτια που λείπουν - + Green: Partial pieces Πράσινο: Μερικά κομμάτια - + Blue: Completed pieces Μπλε: Ολοκληρωμένα κομμάτια - ExecutionLogWidget + ExecutionLog - + General - Γενικά + Γενικά - + Blocked IPs - + Αποκλεισμένες IP - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + Το <font color='red'>%1</font> έχει αποκλειστεί %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - + Το <font color='red'>%1</font> έχει απαγορευτεί FeedListWidget - + RSS feeds Τροφοδοσίες RSS - - - Unread (%1) - Μη αναγνωσμένα (%1) + + Unread + Μη αναγνωσμένα FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - Σφάλμα κατά την προσπάθεια ανοίγματος του αρχείου καταγραφής. Η εγγραφή καταγραφών στο αρχείο είναι απενεργοποιημένη. - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - &Αναζήτηση... - - - - Choose a file - Caption for file open/save dialog - Επιλέξτε ένα αρχείο - - - - Choose a folder - Caption for directory open dialog - Επιλέξτε έναν φάκελο - - - - Any file - Οποιοδήποτε αρχείο + + An error occured while trying to open the log file. Logging to file is disabled. + Σφάλμα κατά την προσπάθεια ανοίγματος του αρχείου καταγραφής. Η εγγραφή καταγραφών σε αρχείο είναι απενεργοποιημένη. FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - Σφάλμα I/O: Δεν ήταν δυνατό το άνοιγμα του αρχείου φιλτραρίσματος IP σε λειτουργία ανάγνωσης. - - - - - - IP filter line %1 is malformed. - Η γραμμή %1 στο αρχείο φιλτραρίσματος IP έχει εσφαλμένη μορφή. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - Η γραμμή %1 στο αρχείο φιλτραρίσματος IP έχει εσφαλμένη μορφή. Η ενακτήρια IP της περιοχής έχει εσφαλμένη μορφή. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - Η γραμμή %1 στο αρχείο φιλτραρίσματος IP έχει εσφαλμένη μορφή. Η τελική IP της περιοχής έχει εσφαλμένη μορφή. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - Η γραμμή %1 στο αρχείο φιλτραρίσματος IP έχει εσφαλμένη μορφή. Η μία IP είναι IPv4 και η άλλη είναι IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - Υπάρχει σφάλμα στο αρχείο φιλτραρίσματος IP στη γραμμή %1. Το σφάλμα είναι: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - Ανιχνεύθηκαν επιπλέον %1 σφάλματα κατά την ανάλυση του αρχείου φιλτραρίσματος IP. + + + + I/O Error: Could not open ip filter file in read mode. + Σφάλμα I/O: Δεν ήταν δυνατό το άνοιγμα αρχείου φίλτρων IP σε λειτουργία ανάγνωσης. - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. Σφάλμα Ανάλυσης: Το αρχείο φίλτρου δεν είναι ένα έγκυρο αρχείο PeerGuardian P2B. @@ -1995,396 +1636,472 @@ GeoIPDatabase - - + + Unsupported database file size. Μη υποστηριζόμενο μέγεθος αρχείου βάσης δεδομένων. - + Metadata error: '%1' entry not found. Σφάλμα μεταδεδομένων: η καταχώρηση '%1' δεν βρέθηκε. - + Metadata error: '%1' entry has invalid type. Σφάλμα μεταδεδομένων: η καταχώρηση '%1' έχει μη έγκυρο τύπο. - + Unsupported database version: %1.%2 Μη υποστηριζόμενη έκδοση βάσης δεδομένων: %1.%2 - + Unsupported IP version: %1 Μη υποστηριζόμενη έκδοση IP: %1 - + Unsupported record size: %1 Μη υποστηριζόμενο μέγεθος εγγραφής: %1 - + Invalid database type: %1 Μη υποστηριζόμενος τύπος βάσης δεδομένων: %1 - + Database corrupted: no data section found. Κατεστραμμένη βάση δεδομένων: δεν βρέθηκε τμήμα δεδομένων. - Http::Connection + HttpServer + + + File + Αρχείο + - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - Το μέγεθος του αιτήματος HTTP υπερβαίνει το όριο, κλείσιμο socket. Όριο %Id, IP: %s + + Edit + Επεξεργασία - - Bad Http request, closing socket. IP: %s - Αποτυχία αίτηματος HTTPS, κλείσιμο socket. IP: %s + + Help + Βοήθεια - - - HttpServer - + Exit qBittorrent Έξοδος qBittorrent - + Only one link per line Μόνο ένας σύνδεσμος ανά γραμμή - + + Download + Λήψη + + + Global upload rate limit must be greater than 0 or disabled. Το όριο του γενικού ρυθμού αποστολής πρέπει να είναι μεγαλύτερο από 0 ή απενεργοποιημένο. - + Global download rate limit must be greater than 0 or disabled. Το όριο του γενικού ρυθμού λήψης πρέπει να είναι μεγαλύτερο από 0 ή απενεργοποιημένο. - + Alternative upload rate limit must be greater than 0 or disabled. Το όριο του εναλλακτικού ρυθμού αποστολής πρέπει να είναι μεγαλύτερο από 0 ή απενεργοποιημένο. - + Alternative download rate limit must be greater than 0 or disabled. Το όριο του εναλλακτικού ρυθμού λήψης πρέπει να είναι μεγαλύτερο από 0 ή απενεργοποιημένο. - + Maximum active downloads must be greater than -1. Οι μέγιστη ενεργές λήψεις θα πρέπει να είναι μεγαλύτερες από -1. - + Maximum active uploads must be greater than -1. Οι μέγιστη ενεργές αποστολές θα πρέπει να είναι μεγαλύτερες από -1. - + Maximum active torrents must be greater than -1. Τα μέγιστα ενεργά torrents θα πρέπει να είναι μεγαλύτερα από -1. - + Maximum number of connections limit must be greater than 0 or disabled. Το όριο μέγιστου αριθμού συνδέσεων πρέπει να είναι μεγαλύτερο από 0 ή απενεργοποιημένο. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Το όριο μέγιστου αριθμού συνδέσεων ανά torrent πρέπει να είναι μεγαλύτερο από 0 ή απενεργοποιημένο. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. - Το όριο μέγιστου αριθμού θέσεων αποστολής ανά torrent πρέπει να είναι μεγαλύτερο από 0 ή απενεργοποιημένο. + Το όριο μέγιστου αριθμού θυρίδων αποστολής ανά torrent πρέπει να είναι μεγαλύτερο από 0 ή απενεργοποιημένο. - + Unable to save program preferences, qBittorrent is probably unreachable. Δεν είναι δυνατή η αποθήκευση των προτιμήσεων του προγράμματος, το qBittorrent είναι πιθανώς απρόσιτο. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent στο Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - Μη έγκυρο όνομα κατηγορίας: -Παρακαλώ μην χρησιμοποιείτε ειδικούς χαρακτήρες στο όνομα της κατηγορίας. - - - - Unknown - Άγνωστο - - - - Hard Disk - Σκληρός δίσκος - - - - Share ratio limit must be between 0 and 9998. - Το κοινό όριο αναλογίας πρέπει να είναι μεταξύ 0 και 9998. - - - - Seeding time limit must be between 0 and 525600 minutes. - Το χρονικό όριο διαμοιρασμού πρέπει να είναι μεταξύ 0 και 525600 λεπτών. + + Language + Γλώσσα - + The port used for incoming connections must be between 1 and 65535. Η θύρα που χρησιμοποιείται για εισερχόμενες συνδέσεις θα πρέπει να είναι μεταξύ 1 και 65535. - + The port used for the Web UI must be between 1 and 65535. Η θύρα που χρησιμοποιείται για το UI Ιστού θα πρέπει να είναι μεταξύ 1 και 65535. - + Unable to log in, qBittorrent is probably unreachable. Αδυναμία σύνδεσης, το qBittorrent είναι πιθανώς απρόσιτο. - + Invalid Username or Password. Μη έγκυρο Όνομα Χρήστη ή Κωδικός Πρόσβασης. - - Username - Όνομα χρήστη - - - + Password Κωδικός Πρόσβασης - + Login Σύνδεση - + + Upload Failed! + Αποτυχία Αποστολής! + + + Original authors Αρχικοί δημιουργοί - + + Upload limit: + Όριο αποστολής: + + + + Download limit: + Όριο λήψης: + + + Apply Εφαρμογή - + Add Προσθήκη - + + Category: + Κατηγορία: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Μεταφόρτωση Torrents - + + All + Όλα + + + + Downloading + Γίνεται λήψη + + + + Seeding + Γίνεται Διαμοιρασμός + + + + Completed + Ολοκληρωμένα + + + + Resumed + Σε Συνέχιση + + + + Paused + Σε Παύση + + + + Active + Ενεργά + + + + Inactive + Ανενεργά + + + Save files to location: Αποθήκευση αρχείων στην τοποθεσία: - + Cookie: Cookie: - + Type folder here Πληκτρολογήστε την πλήρες διαδρομή του φακέλου εδώ - + + Run an external program on torrent completion + Εκτέλεση εξωτερικού προγράμματος με την ολοκλήρωση του torrent + + + + Enable bandwidth management (uTP) + Ενεργοποίηση διαχείρισης εύρους ζώνης (uTP) + + + + Apply rate limit to uTP connections + Εφαρμογή ορίου ρυθμού σε uTP συνδέσεις + + + + Alternative Global Rate Limits + Εναλλακτικά Όρια Γενικού Ρυθμού + + + More information Περισσότερες πληροφορίες - + Information about certificates Πληροφορίες σχετικά με τα πιστοποιητικά - + Save Files to Αποθήκευση αρχείων σε: - - Set location - Ορισμός θέσης - - - - Limit upload rate - Όριο ταχύτητας αποστολής... + + Watch Folder + Φάκελος Παρακολούθησης - - Limit download rate - Όριο ταχύτητας λήψης... + + Default Folder + Προεπιλεγμένος φάκελος - - Rename torrent - Μετονομασία του torrent + + from + from time1 to time2 + από - - Unable to create category - + + to + from time1 to time2 + έως - + Other... Save Files to: Watch Folder / Default Folder / Other... Άλλο... - + + Every day + Schedule the use of alternative rate limits on ... + Κάθε μέρα + + + + Week days + Schedule the use of alternative rate limits on ... + Εργάσιμες μέρες + + + + Week ends + Schedule the use of alternative rate limits on ... + Σαββατοκύριακα + + + Monday Schedule the use of alternative rate limits on ... Δευτέρα - + Tuesday Schedule the use of alternative rate limits on ... Τρίτη - + Wednesday Schedule the use of alternative rate limits on ... Τετάρτη - + Thursday Schedule the use of alternative rate limits on ... Πέμπτη - + Friday Schedule the use of alternative rate limits on ... Παρασκευή - + Saturday Schedule the use of alternative rate limits on ... Σάββατο - + Sunday Schedule the use of alternative rate limits on ... Κυριακή - + + Downloaded + Is the file downloaded or not? + Έγινε Λήψη + + + Logout Αποσύνδεση - + + Download from URLs + Λήψη από URLs + + + Download Torrents from their URLs or Magnet links Λήψη Torrents από τα URL ή τους συνδέσμους Magnet τους - + Upload local torrent Μεταφόρτωση τοπικού torrent - + Are you sure you want to delete the selected torrents from the transfer list? Είστε σίγουρος ότι θέλετε να διαγράψετε τα επιλεγμένα torrent από την λίστα μεταφοράς? - + Save Αποθήκευση - + qBittorrent client is not reachable Ο πελάτης qBittorrent δεν είναι προσβάσιμος - - qBittorrent has been shutdown. - Το qBittorrent τερματίστηκε. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Λίστα των επιτρεπόμενων IP υποδικτύων + + HTTP Server + Διακομιστής HTTP - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Παράδειγμα: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Υποστηρίζονται οι ακόλουθες παράμετροι: - - Add subnet - Προσθήκη υποδικτύου + + Torrent path + Διαδρομή torrent - - Delete - Διαγραφή + + Torrent name + Όνομα torrent - - Error - Σφάλμα + + qBittorrent has been shutdown. + Το qBittorrent τερματίστηκε. + + + LineEdit - - The entered subnet is invalid. - Το εισηγμένο υποδίκτυο δεν είναι έγκυρο. + + Clear the text + Εκκαθάριση κειμένου LogListWidget - + Copy Αντιγραφή - + Clear Εκκαθάριση @@ -2417,551 +2134,492 @@ Στην Ολοκλήρωση των &Λήψεων - + &View &Προβολή - + &Options... &Επιλογές… - + &Resume &Συνέχιση - + Torrent &Creator &Δημιουργός Torrent - + Set Upload Limit... Ορισμός Ορίου Αποστολής... - + Set Download Limit... Ορισμός Ορίου Λήψης... - + Set Global Download Limit... Ορισμός Γενικού Ορίου Λήψης... - + Set Global Upload Limit... Ορισμός Γενικού Ορίου Αποστολής... - + Minimum Priority Ελάχιστη Προτεραιότητα - + Top Priority Μέγιστη προτεραιότητα - + Decrease Priority Μείωση προτεραιότητας - + Increase Priority Αύξηση προτεραιότητας - - + + Alternative Speed Limits Εναλλακτικά Όρια Ταχύτητας - + &Top Toolbar Κορυφαία &Γραμμή εργαλείων - + Display Top Toolbar Εμφάνιση Κορυφαίας Γραμμής εργαλείων - - Status &Bar - Γραμμή κατάστασης - - - + S&peed in Title Bar &Ταχύτητα στην Γραμμή Τίτλου - + Show Transfer Speed in Title Bar Εμφάνιση Ταχύτητας Μεταφοράς στην Γραμμή Τίτλου - + &RSS Reader &Αναγνώστης RSS - + Search &Engine &Μηχανή Αναζήτησης - + L&ock qBittorrent &Κλείδωμα qBittorrent - + Do&nate! &Δωρεά! - - Close Window - Κλείσιμο Παραθύρου - - - + R&esume All Σ&υνέχιση Όλων - + Manage Cookies... Διαχείριση Cookies... - + Manage stored network cookies Διαχείριση αποθηκευμένων cookies δικτύου - + Normal Messages Κανονικά Μηνύματα - + Information Messages Μηνύματα Πληροφοριών - + Warning Messages Μηνύματα Προειδοποίησης - + Critical Messages Κρίσιμα Μηνύματα - + &Log Αρ&χείο - + &Exit qBittorrent Έ&ξοδος qBittorrent - + &Suspend System Α&ναστολή Συστήματος - + &Hibernate System Α&δρανοποίηση Συστήματος - + S&hutdown System &Τερματισμός Συστήματος - + &Disabled &Απενεργοποιημένο - + &Statistics &Στατιστικά - + Check for Updates Έλεγχος για ενημερώσεις - + Check for Program Updates Έλεγχος για ενημερώσεις του προγράμματος - + &About &Σχετικά - + &Pause &Παύση - + &Delete &Διαγραφή - + P&ause All Π&αύση Όλων - + &Add Torrent File... Προσθήκη &Αρχείου Torrent… - + Open Άνοιγμα - + E&xit Έ&ξοδος - + Open URL Άνοιγμα URL - + &Documentation &Τεκμηρίωση - + Lock Κλείδωμα - - - + + + Show Εμφάνιση - + Check for program updates Έλεγχος για ενημερώσεις προγράμματος - + Add Torrent &Link... Προσθήκη &Σύνδεσμου Torrent… - + If you like qBittorrent, please donate! Αν σας αρέσει το qBittorrentq, παρακαλώ κάντε μια δωρεά! - - + Execution Log Αρχείο καταγραφής εκτελεσθέντων - + Clear the password Καθαρισμός του κωδικού πρόσβασης - + Filter torrent list... Φίλτρο λίστας torrent… - + &Set Password &Ορίστε κωδικό πρόσβασης - - Preferences - Προτιμήσεις - - - + &Clear Password &Καθαρισμός του κωδικού πρόσβασης - + Transfers Μεταφορές - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Συσχετισμός αρχείων torrent - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? Το qBittorrent δεν είναι η προεπιλεγμένη εφαρμογή για το άνοιγμα αρχείων torrent και συνδέσμων Magnet. Θέλετε να συσχετίσετε το qBittorrent με τα αρχεία torrent και συνδέσμους Magnet; - + Icons Only Μόνο Εικονίδια - + Text Only Μόνο Κείμενο - + Text Alongside Icons Κείμενο Δίπλα στα Εικονίδια - + Text Under Icons Κείμενο Κάτω από τα Εικονίδια - + Follow System Style Ακολούθηση Στυλ Συστήματος - - - + + + UI lock password Κωδικός κλειδώματος UI Ιστού - - - + + + Please type the UI lock password: Παρακαλώ πληκτρολογήστε τον κωδικό κλειδώματος του UI Ιστού: - + The password should contain at least 3 characters Ο κωδικός πρόσβασης πρέπει να περιέχει τουλάχιστον 3 χαρακτήρες - + Password update Ενημέρωση κωδικού πρόσβασης - + The UI lock password has been successfully updated Ο κωδικός κλειδώματος του UI Ιστού ενημερώθηκε επιτυχώς - + Are you sure you want to clear the password? Είστε σίγουροι πως θέλετε να εκκαθαρίσετε τον κωδικό; - - Use regular expressions - - - - + Search Αναζήτηση - + Transfers (%1) Μεταφορές (%1) - + Error Σφάλμα - + Failed to add torrent: %1 Αποτυχία προσθήκης του torrent: %1 - + Torrent added Το Torrent προστέθηκε - + '%1' was added. e.g: xxx.avi was added. - Το '%1' προστέθηκε. + '%1' προστέθηκε - + Download completion Ολοκλήρωση λήψης - + I/O Error i.e: Input/Output Error Σφάλμα I/O - + Recursive download confirmation Επιβεβαίωση αναδρομικής λήψης - + Yes Ναι - + No Όχι - + Never Ποτέ - + Global Upload Speed Limit Γενικό Όριο Ταχύτητας Αποστολής - + Global Download Speed Limit Γενικό Όριο Ταχύτητας Λήψης - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - Το qBittorrent μόλις ενημερώθηκε και χρειάζεται επανεκκίνηση για να ισχύσουν οι αλλαγές. - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - Μερικά αρχεία μεταφέρονται αυτή τη στιγμή. - - - - Are you sure you want to quit qBittorrent? - Είστε σίγουροι ότι θέλετε να κλείσετε το qBittorrent? - - - + &No &Όχι - + &Yes &Ναι - + &Always Yes &Πάντα Ναί - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter Παλιός Διερμηνέας Python - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - Η έκδοσή σας Python (%1) είναι απαρχαιωμένη. Παρακαλώ αναβαθμίστε στην τελευταία έκδοση για να λειτουργήσουν οι μηχανές αναζήτησης. -Ελάχιστη απαίτηση: 2.7.9 / 3.3.0. + - + qBittorrent Update Available Διαθέσιμη Ενημέρωση του qBittorrent - + + A new version is available. +Do you want to download %1? + Μια νέα έκδοση είναι διαθέσιμη. +Θέλετε να την κατεβάσετε %1? + + + Already Using the Latest qBittorrent Version Χρησιμοποιείτε Ήδη την Τελευταία Έκδοση qBittorrent - + Undetermined Python version Απροσδιόριστη έκδοση Python - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. Η λήψη του '%1' ολοκληρώθηκε. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2971,158 +2629,154 @@ - + The torrent '%1' contains torrent files, do you want to proceed with their download? Το torrent '%1' περιέχει αρχεία torrent, θέλετε να συνεχίσετε με την λήψη τους; - + Couldn't download file at URL '%1', reason: %2. Αδυναμία λήψης αρχείου από το URL: '%1', Αιτία: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - Βρέθηκε Python σε %1: %2 + - - + + Couldn't determine your Python version (%1). Search engine disabled. + Αδυναμία προσδιορισμού της έκδοσης της Python σας (%1). Η μηχανή αναζήτησης είναι απενεργοποιημένη. + + + + Missing Python Interpreter Έλλειψη Διερμηνέα Python - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Το Python απαιτείται για τη χρήση της μηχανής αναζήτησης αλλά δεν φαίνεται να είναι εγκατεστημένο. Θέλετε να το εγκαταστήσετε τώρα; - + Python is required to use the search engine but it does not seem to be installed. Το Python απαιτείται για τη χρήση της μηχανής αναζήτησης αλλά δεν φαίνεται να είναι εγκατεστημένο. - - A new version is available. - Μια νέα έκδοση είναι διαθέσιμη - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. Δεν υπάρχουν διαθέσιμες ενημερώσεις. Χρησιμοποιείτε ήδη την πιο πρόσφατη έκδοση. - + &Check for Updates &Έλεγχος για ενημερώσεις - + Checking for Updates... Αναζήτηση για ενημερώσεις… - + Already checking for program updates in the background Γίνεται ήδη έλεγχος για ενημερώσεις προγράμματος στο παρασκήνιο - + Python found in '%1' Βρέθηκε Python στο '%1' - + Download error Σφάλμα λήψης - + Python setup could not be downloaded, reason: %1. Please install it manually. Η εγκατάσταση του Python δε μπορεί να ληφθεί, αιτία: %1. Παρακαλούμε εγκαταστήστε το χειροκίνητα. - - + + Invalid password Μη έγκυρος κωδικός πρόσβασης - - - + + RSS (%1) RSS (%1) - + URL download error Σφάλμα λήψης URL - + The password is invalid Αυτός ο κωδικός πρόσβασης δεν είναι έγκυρος - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Ταχύτητα ΛΨ: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Ταχύτητα ΑΠ: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [Λ: %1, Α: %2] qBittorrent %3 - + Hide Απόκρυψη - + Exiting qBittorrent Γίνεται έξοδος του qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Μερικά αρχεία μεταφέρονται αυτή τη στιγμή. +Είστε σίγουροι ότι θέλετε να κλείσετε το qBittorrent? + + + Open Torrent Files Άνοιγμα Αρχείων torrent - + Torrent Files Αρχεία Torrent - + Options were saved successfully. Οι επιλογές αποθηκεύτηκαν επιτυχώς. @@ -3130,52 +2784,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. Το δυναμικό DNS σας ανανεώθηκε επιτυχώς. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Σφάλμα δυναμικού DNS: Η υπηρεσία είναι προσωρινά μη διαθέσιμη, θα γίνει επανάληψη σε 30 λεπτά. - + Dynamic DNS error: hostname supplied does not exist under specified account. Σφάλμα δυναμικού DNS: το παρεχόμενο όνομα φορέα δεν υπάρχει στον συγκεκριμένο λογαριασμό. - + Dynamic DNS error: Invalid username/password. Σφάλμα δυναμικού DNS: Μη έγκυρο όνομα χρήστη/κωδικός πρόσβασης. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Σφάλμα δυναμικού DNS: Το qBittorrent έχει μπει σε λίστα ανεπιθύμητων από την υπηρεσία, παρακαλώ αναφέρετε το σφάλμα στο http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Σφάλμα δυναμικού DNS: επεστράφη %1 από την υπηρεσία, παρακαλώ αναφέρετε το σφάλμα στο http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Σφάλμα δυναμικού DNS: Το όνομα χρήστη σας έχει αποκλειστεί λόγω κατάχρησης. - + Dynamic DNS error: supplied domain name is invalid. Σφάλμα δυναμικού DNS: το παρεχόμενο όνομα τομέα δεν είναι έγκυρο. - + Dynamic DNS error: supplied username is too short. Σφάλμα δυναμικού DNS: το παρεχόμενο όνομα χρήστη είναι πολύ μικρό. - + Dynamic DNS error: supplied password is too short. Σφάλμα δυναμικού DNS: ο παρεχόμενος κωδικός πρόσβασης είναι πολύ μικρός. @@ -3183,1413 +2837,1303 @@ Net::DownloadHandler - + I/O Error Σφάλμα Ι/Ο - + The file size is %1. It exceeds the download limit of %2. Το μέγεθος αρχείου είναι %1. Υπερβαίνει το όριο λήψης %2. - + Unexpected redirect to magnet URI. Μη αναμενόμενη ανακατεύθυνση σε magnet URI. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - + + + GeoIP database loaded. Type: %1. Build time: %2. + Η βάση δεδομένων GeoIP φορτώθηκε. Τύπος: %1. Χρόνος Δημιουργίας: %2. - - The operation was canceled - + + + Couldn't load GeoIP database. Reason: %1 + Δεν ήταν δυνατή η φόρτωση της βάσης δεδομένων GeoIP. Αιτία: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - Η βάση δεδομένων GeoIP φορτώθηκε. Τύπος: %1. Χρόνος Δημιουργίας: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - Δεν ήταν δυνατή η φόρτωση της βάσης δεδομένων GeoIP. Αιτία: %1 - - - + Venezuela, Bolivarian Republic of Βενεζουέλα, Μπολιβαριανή Δημοκρατία της - + Viet Nam Βιετνάμ - - + + N/A Δ/Υ - + Andorra Ανδόρρα - + United Arab Emirates Ηνωμένα Αραβικά Εμιράτα - + Afghanistan Αφγανιστάν - + Antigua and Barbuda Αντίγκουα και Μπαρμπούντα - + Anguilla Αγκίλα - + Albania Αλβανία - + Armenia Αρμενία - + Angola Αγκόλα - + Antarctica Ανταρκτική - + Argentina Αργεντινή - + American Samoa Αμερικανικές Σαμόα - + Austria Αυστρία - + Australia Αυστραλία - + Aruba Αρούμπα - + Azerbaijan Αζερμπαϊτζάν - + Bosnia and Herzegovina Βοσνία και Ερζεγοβίνη - + Barbados Μπαρμπάντος - + Bangladesh Μπαγκλαντές - + Belgium Βέλγιο - + Burkina Faso Μπουρκίνα Φάσο - + Bulgaria Βουλγαρία - + Bahrain Μπαχρέιν - + Burundi Μπουρούντι - + Benin Μπενίν - + Bermuda Βερμούδες - + Brunei Darussalam Μπρούνει Νταρουσαλλέμ - + Brazil Βραζιλία - + Bahamas Μπαχάμες - + Bhutan Μπουτάν - + Bouvet Island Νήσος Μπουβέ - + Botswana Μποτσουάνα - + Belarus Λευκορωσία - + Belize Μπελίζ - + Canada Καναδάς - + Cocos (Keeling) Islands Νήσοι Κόκος (Κήλινγκ) - + Congo, The Democratic Republic of the Κονγκό, Λαϊκή Δημοκρατία του - + Central African Republic Κεντροαφρικανική Δημοκρατία - + Congo Κονγκό - + Switzerland Ελβετία - + Cook Islands Νήσοι Κουκ - + Chile Χιλή - + Cameroon Καμερούν - + China Κίνα - + Colombia Κολομβία - + Costa Rica Κόστα Ρίκα - + Cuba Κούβα - + Cape Verde Πράσινο Ακρωτήριο - + Curacao Κουρασάο - + Christmas Island Νήσος των Χριστουγέννων - + Cyprus Κύπρος - + Czech Republic Τσεχία - + Germany Γερμανία - + Djibouti Τζιμπουτί - + Denmark Δανία - + Dominica Δομίνικα - + Dominican Republic Δομινικανή Δημοκρατία - + Algeria Αλγερία - + Ecuador Ισημερινός - + Estonia Εσθονία - + Egypt Αίγυπτος - + Western Sahara Δυτική Σαχάρα - + Eritrea Ερυθραία - + Spain Ισπανία - + Ethiopia Αιθιοπία - + Finland Φιλανδία - + Fiji Φίτζι - + Falkland Islands (Malvinas) Νήσοι Φώκλαντ (Μαλβίνας) - + Micronesia, Federated States of Μικρονησία, Ομόσπονδες Πολιτείες της - + Faroe Islands Νήσοι Φερόες - + France Γαλλία - + Gabon Γκαμπόν - + United Kingdom Ηνωμένο Βασίλειο - + Grenada Γρενάδα - + Georgia Γεωργία - + French Guiana Γαλλική Γουιάνα - + Ghana Γκάνα - + Gibraltar Γιβραλτάρ - + Greenland Γροιλανδία - + Gambia Γκάμπια - + Guinea Γουινέα - + Guadeloupe Γουαδελούπη - + Equatorial Guinea Ισημερινή Γουινέα - + Greece Ελλάδα - + South Georgia and the South Sandwich Islands Νήσοι Νότια Γεωργία και Νότιες Σάντουιτς - + Guatemala Γουατεμάλα - + Guam Γκουάμ - + Guinea-Bissau Γουινέα-Μπισάου - + Guyana Γουιάνα - + Hong Kong Χονγκ Κονγκ - + Heard Island and McDonald Islands Νήσοι Χερντ και Μακντόναλντ - + Honduras Ονδούρα - + Croatia Κροατία - + Haiti Αϊτή - + Hungary Ουγγαρία - + Indonesia Ινδονησία - + Ireland Ιρλανδία - + Israel Ισραήλ - + India Ινδία - + British Indian Ocean Territory Βρετανικό Έδαφος του Ινδικού Ωκεανού - + Iraq Ιράκ - + Iran, Islamic Republic of Ιράν, Ισλαμική Δημοκρατία του - + Iceland Ισλανδία - + Italy Ιταλία - + Jamaica Τζαμάικα - + Jordan Ιορδανία - + Japan Ιαπωνία - + Kenya Κένυα - + Kyrgyzstan Κιργιζία - + Cambodia Καμπότζη - + Kiribati Κιριμπάτι - + Comoros Κομόρες - + Saint Kitts and Nevis Άγιος Χριστόφορος και Νέβις - + Korea, Democratic People's Republic of Κορέα, Λαοκρατική Δημοκρατία της - + Korea, Republic of Κορέα, Δημοκρατία της - + Kuwait Κουβέιτ - + Cayman Islands Νήσοι Κέιμαν - + Kazakhstan Καζακστάν - + Lao People's Democratic Republic Λαική Δημοκρατία του Λάος - + Lebanon Λίβανος - + Saint Lucia Αγία Λουκία - + Liechtenstein Λιχτενστάιν - + Sri Lanka Σρι Λάνκα - + Liberia Λιβερία - + Lesotho Λεσότο - + Lithuania Λιθουανία - + Luxembourg Λουξεμβούργο - + Latvia Λεττονία - + Morocco Μαρόκο - + Monaco Μονακό - + Moldova, Republic of Μολδαβία, Δημοκρατία της - + Madagascar Μαδαγασκάρη - + Marshall Islands Νήσοι Μάρσαλ - + Mali Μάλι - + Myanmar Μιανμάρ - + Mongolia Μογγολία - + Northern Mariana Islands Νήσοι Βόρειας Μαριάνας - + Martinique Μαρτινίκα - + Mauritania Μαυριτανία - + Montserrat Μοντσεράτ - + Malta Μάλτα - + Mauritius Μαυρίκιος - + Maldives Μαλδίβες - + Malawi Μαλάουι - + Mexico Μεξικό - + Malaysia Μαλαισία - + Mozambique Μοζαμβίκη - + Namibia Ναμίμπια - + New Caledonia Νέα Καληδονία - + Niger Νίγηρας - + Norfolk Island Νήσος Νόρφολκ - + Nigeria Νιγηρία - + Nicaragua Νικαράγουα - + Netherlands Κάτω Χώρες - + Norway Νορβηγία - + Nepal Νεπάλ - + Nauru Ναουρού - + Niue Νιούε - + New Zealand Νέα Ζηλανδία - + Oman Ομάν - + Panama Παναμάς - + Peru Περού - + French Polynesia Γαλλική Πολυνησία - + Papua New Guinea Παπούα Νέα Γουινέα - + Philippines Φιλιππίνες - + Pakistan Πακιστάν - + Poland Πολωνία - + Saint Pierre and Miquelon Άγιος Πέτρος και Μικελόν - + Puerto Rico Πουέρτο Ρίκο - + Portugal Πορτογαλία - + Palau Παλάου - + Paraguay Παραγουάη - + Qatar Κατάρ - + Reunion Ρεϊνιόν - + Romania Ρουμανία - + Russian Federation Ρωσική Ομοσπονδία - + Rwanda Ρουάντα - + Saudi Arabia Σαουδική Αραβία - + Solomon Islands Νήσοι Σολομώντος - + Seychelles Σεϋχέλλες - + Sudan Σουδάν - + Sweden Σουηδία - + Singapore Σιγκαπούρη - + Slovenia Σλοβενία - + Svalbard and Jan Mayen Νήσοι Σβάλμπαρντ και Γιαν Μαγιέν - + Slovakia Σλοβακία - + Sierra Leone Σιέρρα Λεόνε - + San Marino Άγιος Μαρίνος - + Senegal Σενεγάλη - + Somalia Σομαλία - + Suriname Σουρινάμ - + Sao Tome and Principe Σάο Τομέ και Πρίνσιπε - + El Salvador Ελ Σαλβαδόρ - + Syrian Arab Republic Αραβική Δημοκρατία της Συρίας - + Swaziland Σουαζιλάνδη - + Turks and Caicos Islands Νήσοι Τερκς και Κάικος - + Chad Τσαντ - + French Southern Territories Γαλλικά Νότια Εδάφη - + Togo Τόγκο - + Thailand Ταϊλάνδη - + Tajikistan Τατζικιστάν - + Tokelau Τοκελάου - + Turkmenistan Τουρκμενιστάν - + Tunisia Τυνησία - + Tonga Τόνγκα - - Could not decompress GeoIP database file. - Δεν ήταν δυνατή η αποσυμπίεση του αρχείου βάσης δεδομένων GeoIP. - - - + Timor-Leste Τιμόρ, Ανατολικό - + Bolivia, Plurinational State of Βολιβία, Πολυεθνική Πολιτεία της - + Bonaire, Sint Eustatius and Saba Μποναίρ, Άγιος Ευστράτιος και Σάμπα - + Cote d'Ivoire Ακτή Ελεφαντοστού - + Libya Λιβύη - + Saint Martin (French part) Άγιος Μαρτίνος (Γαλλικό τμήμα) - + Macedonia, The Former Yugoslav Republic of Μακεδονία, πρώην Γιουγκοσλαβική Δημοκρατία της - + Macao Μακάο - + Pitcairn Πίτκαιρν - + Palestine, State of Παλαιστίνη, Πολιτεία της - + Saint Helena, Ascension and Tristan da Cunha Αγία Ελένη, Ασενσιόν και Τριστάν ντα Κούνια - + South Sudan Νότιο Σουδάν - + Sint Maarten (Dutch part) Άγιος Μαρτίνος (Ολλανδικό τμήμα) - + Turkey Τουρκία - + Trinidad and Tobago Τρινιδάδ και Τομπάγκο - + Tuvalu Τουβαλού - + Taiwan Ταϊβάν - + Tanzania, United Republic of Τανζανία, Ενωμένη Δημοκρατία της - + Ukraine Ουκρανία - + Uganda Ουγκάντα - + United States Minor Outlying Islands Απομακρυσμένες Νησίδες των Ηνωμένων Πολιτειών - + United States Ηνωμένες Πολιτείες Αμερικής - + Uruguay Ουρουγουάη - + Uzbekistan Ουζμπεκιστάν - + Holy See (Vatican City State) Αγία Έδρα (Πόλη-Κράτος Βατικανού) - + Saint Vincent and the Grenadines Άγιος Βικέντιος και Γρεναδίνες - + Virgin Islands, British Παρθένοι Νήσοι, Βρετανικές - + Virgin Islands, U.S. Παρθένες Νήσοι, Η.Π.Α. - + Vanuatu Βανουάτου - + Wallis and Futuna Ουαλίς και Φουτουνά - + Samoa Σαμόα - + Yemen Υεμένη - + Mayotte Μαγιότ - + Serbia Σερβία - + South Africa Νότια Αφρική - + Zambia Ζάμπια - + Montenegro Μαυροβούνιο - + Zimbabwe Ζιμπάμπουε - + Aland Islands Νήσοι Ώλαντ - + Guernsey Γκέρνσεϊ - + Isle of Man Νήσος Μαν - + Jersey Τζέρσεϊ - + Saint Barthelemy Άγιος Βαρθολομαίος - + + Could not uncompress GeoIP database file. + Δεν ήταν δυνατή η αποσυμπίεση του αρχείου βάσης δεδομένων GeoIP. + + + Couldn't save downloaded GeoIP database file. Δεν ήταν δυνατή η αποθήκευση του λαμβανόμενου αρχείου βάσης δεδομένων GeoIP. - + Successfully updated GeoIP database. Επιτυχής ενημέρωση βάσης δεδομένων GeoIP. - + Couldn't download GeoIP database file. Reason: %1 Δεν ήταν δυνατή η λήψη του αρχείου βάσης δεδομένων GeoIP. Αιτία: %1 @@ -4597,12 +4141,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] Υποστήριξη UpnP / NAT-PMP [NAI] - + UPnP / NAT-PMP support [OFF] Υποστήριξη UpnP / NAT-PMP [ΟΧΙ] @@ -4610,7 +4154,7 @@ Net::Smtp - + Email Notification Error: Σφάλμα Ειδοποίησης email: @@ -4618,1356 +4162,1150 @@ OptionsDialog - + Options - Επιλογές + Ρυθμίσεις - + Behavior - Συμπεριφορά + - + Downloads Λήψεις - + Connection Σύνδεση - + Speed Ταχύτητα - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI - Διεπαφή Χρήστη Ιστού + - + Advanced Για προχωρημένους - + Language Γλώσσα - + User Interface Language: - Διεπαφή Χρήστη Γλώσσας: + - + (Requires restart) (Απαιτεί επανεκκίνηση) - + Transfer List Λίστα Μεταφοράς - + Confirm when deleting torrents Επιβεβαίωση κατά την διαγραφή των torrent - + Use alternating row colors In transfer list, one every two rows will have grey background. - Χρήση εναλλασσόμενων χρωμάτων σειράς + - + Hide zero and infinity values - Απόκρυψη μηδενικών και άπειρων τιμών + Κρύψε τις μηδενικές και τις άπειρες τιμές - + Always Πάντα - + Paused torrents only - Μόνο torrents σε παύση + Μόνο διακοπτόμενα torrents - + Action on double-click - Ενέργεια στο διπλό κλικ + Λειτουργία με διπλό κλίκ - + Downloading torrents: - Λήψη torrents: + Λήψη torrents - - + + Start / Stop Torrent Εκκίνηση / Παύση Torrent - - + + Open destination folder - Άνοιγμα φακέλου προορισμού + Άνοιγμα προορισμού φακέλου - - + + No action Καμία ενέργεια - + Completed torrents: Ολοκληρωμένα torrents: - + Desktop Επιφάνεια εργασίας - + Start qBittorrent on Windows start up - Έναρξη του qBittorrent κατά την εκκίνηση των Windows + Να ξεκινά το qBittorrent κατά την εκκίνηση των Windows - + Show splash screen on start up - Εμφάνιση οθόνης εκκίνησης κατά την έναρξη + - + Start qBittorrent minimized - Έναρξη του qBittorrent ελαχιστοποιημένο + Να ξεκινά το qBittorrent ελαχιστοποιημένο - + Confirmation on exit when torrents are active - Επιβεβαίωση στην έξοδο όταν υπάρχουν ενεργά torrents + Επιβεβαίωση κατά την έξοδο όταν τα torrents είναι ενεργά - + Confirmation on auto-exit when downloads finish Επιβεβαίωση για αυτόματη έξοδο όταν οι λήψεις έχουν ολοκληρωθεί - - KiB - KiB - - - - Email notification &upon download completion - Ειδοποίηση ηλεκτρονικού ταχυδρομείου με την ολοκλήρωση της λήψης - - - - Run e&xternal program on torrent completion - Εκτέλεση εξωτερικού προγράμματος μετά την ολοκλήρωση ενός torrent - - - - IP Fi&ltering - Φιλτράρισμα IP - - - - Schedule &the use of alternative rate limits - Προγραμματισμός χρήσης εναλλακτικών ορίων ρυθμού - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Περισσότερες πληροφορίες</a>) - - - - &Torrent Queueing - Torrent στην Ουρά - - - - Seed torrents until their seeding time reaches - Διαμοιρασμός των torrent μέχρι το χρονικό όριο - - - - A&utomatically add these trackers to new downloads: - Α&υτόματη προσθήκη αυτών των ιχνηλατών σε νέες λήψεις: - - - - RSS Reader - Αναγνώστης RSS - - - - Enable fetching RSS feeds - Ενεργοποίηση λήψης τροφοδοσιών RSS + + Show qBittorrent in notification area + Δείξε το qBittorrent στο πλαίσιο των ενημερώσεων - - Feeds refresh interval: - Χρονικό διάστημα ανανέωσης παρόχων: - - - - Maximum number of articles per feed: - Μέγιστος αριθμός άρθρων ανά τροφοδοσία: - - - - - min - minutes - λεπ - - - - RSS Torrent Auto Downloader - Αυτόματη Λήψη RSS Torrent - - - - Enable auto downloading of RSS torrents - Ενεργοποίηση της αυτόματης λήψης των RSS torrent - - - - Edit auto downloading rules... - Επεξεργασία των ρυθμίσεων αυτόματης λήψης... - - - - Web User Interface (Remote control) - Διαδικτυακό Περιβάλλον Χρήστη (Απομακρυσμένη διαχείριση) - - - - IP address: - Διεύθυνση IP: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - -Η διεύθυνση IP του διαδικτυακού περιβάλλοντος χρήστη. -Καθορίστε μια διεύθυνση IPv4 ή IPv6. Μπορείτε να ορίσετε "0.0.0.0" για οποιαδήποτε διεύθυνση IPv4, -"::" για οποιαδήποτε διεύθυνση IPv6 ή "*" για IPv4 και IPv6. - - - - Server domains: - Τομείς διακομιστή: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - Λευκή λίστα για φιλτράρισμα της HTTP επικεφαλίδας του υποδοχέα. -Προκειμένου να υπερασπιστείτε DNS επιθεσεις, -θα πρέπει να θέσετε ονόματα τομέα που χρησιμοποιούνται από τον διακομιστή WebUI. - -Χρήση ';' για διαίρεση πολλαπλών καταχωρίσεων. Μπορείτε να χρησιμοποιήσετε μπαλαντέρ '*'. - - - - &Use HTTPS instead of HTTP - &Χρήση HTTPS αντί για HTTP - - - - Bypass authentication for clients on localhost - Παράκαμψη πιστοποίησης για υπολογιστές-πελάτες σε localhost - - - - Bypass authentication for clients in whitelisted IP subnets - Παράκαμψη πιστοποίησης για υπολογιστές-πελάτες σε υποδίκτυα στη λίστα επιτρεπόμενων IP - - - - IP subnet whitelist... - Λίστα επιτρεπόμενων IP υποδικτύων - - - - Upda&te my dynamic domain name - &Ενημέρωση του δυναμικού ονόματος τομέα μου - - - + Minimize qBittorrent to notification area - Ελαχιστοποίηση του qBittorrent στην περιοχή ειδοποιήσεων + Ελαχιστοποίησε το qBittorrent στο πλαίσιο των ενημερώσεων - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. - Κλείσιμο του qBittorrent στην περιοχή ειδοποιήσεων + Κλείσε το qBittorrent στο πλαίσιο των ενημερώσεων - + Tray icon style: - Στυλ εικονιδίου γραμμής εργασιών: + - + Normal Κανονικό - + Monochrome (Dark theme) Μονόχρωμο (Σκοτεινό θέμα) - + Monochrome (Light theme) Μονόχρωμο (Φωτεινό θέμα) - + File association - Συσχετισμός αρχείων + - + Use qBittorrent for .torrent files Χρήση qBittorrent για τα αρχεία torrent - + Use qBittorrent for magnet links - Χρήση του qBittorrent για συνδέσμους magnet + Χρησιμοποίησε το qBittorrent για magnet διευθύνσεις - + Power Management - Διαχείριση Ενέργειας + + + + + Inhibit system sleep when torrents are active + - + + Log file + + + + Save path: - Διαδρομή αποθήκευσης: + - + Backup the log file after: - Αντίγραφο ασφαλείας του αρχείου καταγραφής μετά από: + + + + + MB + - + Delete backup logs older than: - Διαγραφή αντιγράφων ασφαλείας αρχείου καταγραφής παλαιότερα από: + - + days Delete backup logs older than 10 months ημέρες - + months Delete backup logs older than 10 months μήνες - + years Delete backup logs older than 10 years Χρόνια - + When adding a torrent - Όταν προστίθεται ένα torrent + + + + + Display torrent content and some options + Εμφάνισε το περιεχόμενο του torrent και κάποιες επιλογές - + Bring torrent dialog to the front - Μεταφορά διαλόγου torrent στο προσκήνιο + - + Do not start the download automatically The torrent will be added to download list in pause state Να μη ξεκινάει η λήψη αυτόματα - + Should the .torrent file be deleted after adding it - Αν πρέπει να διαγραφεί το αρχείο .torrent αφού προστεθεί + + + + + Delete .torrent files afterwards + Διέγραψε τα αρχεία .torrent έπειτα - + Also delete .torrent files whose addition was cancelled - Επίσης διαγραφή αρχείων .torrent των οποίων η προσθήκη ακυρώθηκε + - + Also when addition is cancelled - Επίσης όταν ακυρώνεται η προσθήκη + - + Warning! Data loss possible! - Προειδοποίηση! Πιθανή απώλεια δεδομένων! + Προειδοποίηση! Τα δεδομένα σας μπορεί να χαθούν! - + Saving Management - Διαχείριση Αποθήκευσης + - + Default Torrent Management Mode: - Προεπιλεγμένη Λειτουργία Διαχείρισης Torrent: + - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - Η αυτόματη λειτουργία σημαίνει ότι διάφορες ιδιότητες του torrent (π.χ. θέση αποθήκευσης) θα καθοριστούν από την συσχετισμένη κατηγορία. + Ο αυτόματος τρόπος σημαίνει ότι ποικίλες ιδιότητες του torrent (π.χ. θέση αποθήκευσης) θα καθοριστούν από την σχετική κατηγορία - + Manual Χειροποίητα - + Automatic Αυτόματα - + When Torrent Category changed: Όταν επιλεχθεί η Κατηγορία Torrent: - + Relocate torrent - Μετεγκατάσταση torrent + - + Switch torrent to Manual Mode - Εναλλαγή του torrent σε Χειροκίνητη Λειτουργία + - + When Default Save Path changed: - Όταν αλλάξει η Προεπιλεγμένη Διαδρομή Αποθήκευσης: + - - + + Relocate affected torrents - Μετεγκατάσταση επηρεασμένων torrents + - - + + Switch affected torrents to Manual Mode - Εναλλαγή επηρεασμένων torrents σε Χειροκίνητη Λειτουργία + - + When Category changed: - Όταν αλλάξει η Κατηγορία: + Όταν αλλάξει η κατηγορία: - + Use Subcategories - Χρήση Υποκατηγοριών + Χρήση υποκατηγοριών - + Default Save Path: - Προεπιλεγμένη Διαδρομή Αποθήκευσης: + Προεπιλεγμένη διαδρομή αποθήκευσης: - + Keep incomplete torrents in: - Διατήρηση μη ολοκληρωμένων torrent στο: + - + Copy .torrent files to: - Αντιγραφή αρχείων .torrent στο: - - - - Show &qBittorrent in notification area - Εμφάνιση του &qBittorrent στην περιοχή ειδοποιήσεων - - - - &Log file - Αρχείο καταγραφής - - - - Display &torrent content and some options - Εμφάνιση περιεχομένων torrent και επιλογών - - - - Create subfolder for torrents with multiple files - Δημιουργία υποφακέλου για torrents με πολλά αρχεία - - - - De&lete .torrent files afterwards - Διαγραφή αρχείων .torrent μετά + Αντιγραφή των αρχείων torrent στο: - + Copy .torrent files for finished downloads to: - Αντιγραφή αρχείων .torrent για ολοκληρωμένες λήψεις στο: - - - - Pre-allocate disk space for all files - Προ-εντοπισμός χώρου στο δίσκο για όλα τα αρχεία - - - - Inhibit system sleep when torrents are downloading - - Inhibit system sleep when torrents are seeding + + Pre-allocate disk space for all files - + Append .!qB extension to incomplete files - Προσάρτηση επέκτασης .!qB σε μη ολοκληρωμένα αρχεία - - - - Enable recursive download dialog - + Automatically add torrents from: - Αυτόματη προσθήκη torrent από: + - + Add entry Προσθήκη καταχώρησης - + Remove entry Διαγραφή καταχώρησης - + + Email notification upon download completion + + + + + Destination email: + Προορισμός email: + + + SMTP server: Διακομιστής SMTP: - + This server requires a secure connection (SSL) - Αυτός ο διακομιστής απαιτεί ασφαλή σύνδεση (SSL) + - - + + + Authentication - Έλεγχος Ταυτότητας + - - - - + + + + Username: Όνομα χρήστη: - - - - + + + + Password: Κωδικός: - - Enabled protocol: - Ενεργό πρωτόκολλο - - - - TCP and μTP - TCP και μTP + + Run external program on torrent completion + - + Listening Port - Θύρα ακρόασης + - + Port used for incoming connections: - Θύρα που χρησιμοποιείται για εισερχόμενες συνδέσεις: + - + Random - Τυχαία + Τυχαίο - + Use UPnP / NAT-PMP port forwarding from my router - Χρήση προώθησης UPnP / NAT - PMP θυρών από τον δρομολογητή μου + - + Use different port on each startup - Χρήση διαφορετικής θύρας σε κάθε εκκίνηση + - + Connections Limits - Όρια Συνδέσεων + - + Maximum number of connections per torrent: Μέγιστος αριθμός συνδέσεων ανά torrent - + Global maximum number of connections: - Μέγιστος συνολικός αριθμός συνδέσεων: + - + Maximum number of upload slots per torrent: - Μέγιστος αριθμός θέσεων αποστολής ανά torrent: + - + Global maximum number of upload slots: - Γενικός μέγιστος αριθμός θέσεων αποστολής: + - + Proxy Server - Διακομιστής Μεσολάβησης + Διακομιστής Proxy - + Type: Τύπος: - + (None) (Κανένα) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: - Εξυπηρετητής: + - - + + Port: - Θύρα: + - + Otherwise, the proxy server is only used for tracker connections - Διαφορετικά, ο διακομιστής μεσολάβησης χρησιμοποιείται μόνο για συνδέσεις ιχνηλατών + - + Use proxy for peer connections - Χρήση μεσολαβητή για συνδέσεις ομότιμων + - + Disable connections not supported by proxies - Απενεργοποίηση συνδέσεων που δεν υποστηρίζονται από διακομιστές μεσολάβησης - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Περισσότερες πληροφορίες</a>) + - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - Οι τροφοδοσίες RSS, η μηχανή αναζήτησης, οι ενημερώσεις λογισμικού ή οτιδήποτε άλλο εκτός από μεταφορές torrent και συναφείς δραστηριότητες (όπως οι ανταλλαγές διασυνδέσεων) θα χρησιμοποιούν απευθείας σύνδεση + - + Use proxy only for torrents - Χρήση μεσολαβητή μόνο για torrents + - - A&uthentication - Πιστοποίηση + + Info: The password is saved unencrypted + - - Info: The password is saved unencrypted - Πληροφορία: Ο κωδικός πρόσβασης έχει αποθηκευθεί μη κρυπτογραφημένος + + IP Filtering + Φιλτράρισμα διεύθυνσης IP - + Filter path (.dat, .p2p, .p2b): - Διαδρομή φίλτρου (.dat, .p2p, .p2b): + - + Reload the filter - Επαναφόρτωση του φίλτρου - - - - Manually banned IP addresses... - Χειροκίνητα αποκλεισμένες IP διευθύνσεις... + - + Apply to trackers - Εφαρμογή στους ιχνηλάτες + Εφαρμογή ανιχνευτών - + Global Rate Limits - Γενικά Όρια Ρυθμού - - - - - - - - - KiB/s - KiB/s + - - + + Upload: - Αποστολή: + Μεταφόρτωση - - - Download: + + + + + KiB/s + KiB/s + + + + + Download: Λήψη - + Alternative Rate Limits - Εναλλακτικά Όρια Ρυθμού + + + + + Schedule the use of alternative rate limits + - - + From: from (time1 to time2) Από: - - + To: time1 to time2 Προς: - + When: Πότε: - + Every day Κάθε μέρα - + Weekdays Καθημερινές - + Weekends Σαββατοκύριακα - + Rate Limits Settings - Ρυθμίσεις Ορίων Ρυθμού + - + Apply rate limit to peers on LAN - Εφαρμογή ορίου ρυθμού σε διασυνδέσεις στο LAN + - + Apply rate limit to transport overhead - Εφαρμογή ορίων ρυθμού στο κόστος μεταφοράς + - - + + + Enable µTP protocol + Ενεργοποίηση πρωτοκόλλου µTP + + + Apply rate limit to µTP protocol - Εφαρμογή ορίων ρυθμού στο uTP πρωτόκολλο + - + Privacy Ιδιωτικότητα - + Enable DHT (decentralized network) to find more peers - Ενεργοποίηση DHT (αποκεντροποιημένο δίκτυο) για την εύρεση περισσοτέρων διασυνδέσεων + - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - Ανταλλαγή διασυνδέσεων με συμβατούς πελάτες Bittorrent (μTorrent, Vuze, ...) + - + Enable Peer Exchange (PeX) to find more peers Ενεργοποίηση Ανταλλαγής Ομότιμων (PeX) για εύρεση περισσότερων ομότιμων χρηστών - + Look for peers on your local network - Αναζήτηση για διασυνδέσεις στο τοπικό σας δίκτυο + - + Enable Local Peer Discovery to find more peers - Ενεργοποίηση Ανακάλυψης Τοπικών Διασυνδέσεων για την εύρεση περισσοτέρων διασυνδέσεων + - + Encryption mode: - Λειτουργία κρυπτογράφησης: + - + Prefer encryption - Προτίμηση κρυπτογράφησης + - + Require encryption - Απαίτηση κρυπτογράφησης + - + Disable encryption - Απενεργοποίηση κρυπτογράφησης + - + Enable when using a proxy or a VPN connection - Ενεργοποίηση όταν χρησιμοποιείτε μεσολαβητή ή μια VPN σύνδεση + - + Enable anonymous mode - Ενεργοποίηση ανώνυμης λειτουργίας - - - - Maximum active downloads: - Μέγιστες ενεργές λήψεις: - - - - Maximum active uploads: - Μέγιστες ενεργές αποστολές: + - - Maximum active torrents: - Μέγιστα ενεργά torrents: + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + - - Do not count slow torrents in these limits - Μη υπολογισμός αργών torrent σε αυτά τα όρια + + Torrent Queueing + - - Upload rate threshold: - Όριο ποσοστόυ μεταφόρτωσης: + + Maximum active downloads: + Ανώτατο όριο ενεργών λήψεων: - - Download rate threshold: - Όριο ποσοστού λήψης: + + Maximum active uploads: + Ανώτατο όριο μεταφορτ - - sec - seconds - sec + + Maximum active torrents: + Ανώτατο όριο ενεργών torrents: - - Torrent inactivity timer: - Χρονόμετρο αδράνειας torrent: + + Do not count slow torrents in these limits + - + Share Ratio Limiting - Περιορισμός Αναλογίας Διαμοιρασμού + - + Seed torrents until their ratio reaches - Διαμοιρασμός των torrent μέχρι η αναλογία τους να φτάσει + - + then - τότε + - + Pause them Παύση επιλεγμένων - + Remove them Αφαίρεση επιλεγμένων - - RSS Smart Episode Filters - Φίλτρα RSS Smart Episode + + Automatically add these trackers to new downloads: + Αυτόματη προσθήκη αυτών των ανιχνευτών για νέες λήψεις - + + Enable Web User Interface (Remote control) + + + + Use UPnP / NAT-PMP to forward the port from my router - Χρήση UPnP / NAT - PMP για προώθηση της θύρας από τον δρομολογητή μου + - + + Use HTTPS instead of HTTP + Χρήση HTTPS αντί του HTTP + + + Certificate: - Πιστοποιητικό: + - + Import SSL Certificate - Εισαγωγή Πιστοποιητικού SSL + - + Key: Κλειδί: - + Import SSL Key - Εισαγωγή Κλειδιού SSL + - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Πληροφορίες σχετικά με τα πιστοποιητικά</a> - - - - Use alternative Web UI - Χρήση εναλλακτικού Web UI - - - - Files location: - Τοποθεσία αρχείων: + - - Enable clickjacking protection + + Bypass authentication for localhost - - Enable Cross-Site Request Forgery (CSRF) protection + + Update my dynamic domain name - + Service: Υπηρεσία: - + Register Εγγραφή - + Domain name: - Όνομα τομέα: + - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - Με την ενεργοποίηση αυτών των επιλογών, μπορεί να <strong>χάσετε αμετάκλητα</strong> τα .torrent αρχεία σας! + - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - Όταν αυτές οι επιλογές είναι ενεργοποιημένες, το qBittorent θα <strong>διαγράψει</strong> τα .torrent αρχεία αφού προστεθούν επιτυχώς (η πρώτη επιλογή) ή όχι (η δεύτερη επιλογή) στην ουρά αναμονής λήψεων. Αυτό θα εφαρμοστεί <strong>όχι μόνο</strong> σε αρχεία που ανοίχτηκαν μέσω του μενού &ldquo;Προσθήκη αρχείου torrent&rdquo; αλλά και σε αυτά που ανοίχτηκαν μέσω <strong>συσχέτισης τύπων αρχείων</strong> + - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - Αν ενεργοποιήσετε την δεύτερη επιλογή (&ldquo;Επίσης όταν η προσθήκη ακυρωθεί&rdquo;) το .torrent αρχείο <strong>θα διαγραφεί</strong> ακόμη και αν πατήσετε &ldquo;<strong>Ακύρωση</strong>&rdquo; στον διάλογο &ldquo;Προσθήκη αρχείου torrent&rdquo; - - - - Choose Alternative UI files location - Επίλεξτε εναλλακτική τοποθεσία UI αρχείων + - + Supported parameters (case sensitive): - Υποστηριζόμενοι παράμετροι (διάκριση πεζών): + - + %N: Torrent name %N: Όνομα Torrent - + %L: Category %L: Κατηγορία - - %G: Tags (seperated by comma) - %G: Ετικέτες (διαχωρισμένες με κόμμα) - - - + %F: Content path (same as root path for multifile torrent) - %F: Διαδρομή περιεχομένου (ίδια με την ριζική διαδρομή για torrent πολλαπλών αρχείων) + - + %R: Root path (first torrent subdirectory path) - %R: Ριζική διαδρομή (πρώτη διαδρομή υποκαταλόγου torrent) + - + %D: Save path - %D: Διαδρομή αποθήκευσης + - + %C: Number of files - %C: Αριθμός των αρχείων + - + %Z: Torrent size (bytes) - %Z: Μέγεθος torrent (bytes) + - + %T: Current tracker - %T: Τρέχων ιχνηλάτης + - + %I: Info hash - %I: Πληροφορίες hash + - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - Συμβουλή: Ενθυλακώστε την παράμετρο με εισαγωγικά για να αποφύγετε την αποκοπή του κειμένου στον κενό χώρο (π.χ., "%Ν") - - - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - Ένα torrent θεωρείται αργό αν οι αναλογίες κατεβάσματος και μεταφόρτωσης μένουν κάτω απο αυτές τις τιμές για δευτερόλεπτα όσα του χρονόμετρου αδράνειας torrent + - + Select folder to monitor - Επιλέξτε ένα φάκελο προς παρακολούθηση + - + Folder is already being monitored: - Αυτός ο φάκελος παρακολουθείται ήδη: + - + Folder does not exist: Ο φάκελος δεν υπάρχει: - + Folder is not readable: - Ο φάκελος δεν είναι αναγνώσιμος: + - + Adding entry failed - Η προσθήκη καταχώρησης απέτυχε + - - - - + + Choose export directory - Επιλέξτε κατάλογο εξαγωγής + - - - + + + + + + Choose a save directory - Επιλέξτε κατάλογο αποθήκευσης + - + Choose an IP filter file - Επιλέξτε ένα αρχείο φίλτρου IP + - + All supported filters Όλα τα υποστηριζόμενα φίλτρα - + SSL Certificate - Πιστοποιητικό SSL + + + + + SSL Key + Κλειδί SSL - + Parsing error - Σφάλμα ανάλυσης + - + Failed to parse the provided IP filter - Αποτυχία ανάλυσης του παρεχόμενου φίλτρου IP + - + Successfully refreshed - Επιτυχής ανανέωση + - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - Επιτυχής ανάλυση του παρεχόμενου φίλτρου IP: Εφαρμόστηκαν %1 κανόνες. + Επιτυχής ανάλυση του παρεχόμενου IP φίλτρου: εφαρμόστηκαν %1 κανόνες. - + Invalid key - Μη έγκυρο κλειδί + - + This is not a valid SSL key. - Αυτό δεν είναι ένα έγκυρο κλειδί SSL. + - + Invalid certificate - Μη έγκυρο πιστοποιητικό - - - - Preferences - Προτιμήσεις - - - - Import SSL certificate - Εισαγωγή Πιστοποιητικού SSL + - + This is not a valid SSL certificate. - Αυτό δεν είναι ένα έγκυρο πιστοποιητικό SSL. - - - - Import SSL key - Εισαγωγή Κλειδιού SSL - - - - SSL key - Κλειδί SSL + - + Time Error - Σφάλμα Ώρας + - + The start time and the end time can't be the same. - Η ώρα έναρξης και η ώρα λήξης δεν μπορούν να είναι ίδιες. + - - + + Length Error - Σφάλμα Μήκους + - + The Web UI username must be at least 3 characters long. - Το όνομα χρήστη του Περιβάλλοντος Χρήστη Ιστού πρέπει να έχει μήκος τουλάχιστον 3 χαρακτήρες. + - + The Web UI password must be at least 6 characters long. - Ο κωδικός πρόσβασης του Περιβάλλοντος Χρήστη Ιστού πρέπει να έχει μήκος τουλάχιστον 6 χαρακτήρες. + PeerInfo - - Interested(local) and Choked(peer) + + interested(local) and choked(peer) interested(τοπικά) και choked(διασύνδεση) - + interested(local) and unchoked(peer) interested(τοπικά) και unchoked(διασύνδεση) - + interested(peer) and choked(local) interested(διασύνδεση) και choked(τοπικά) - + interested(peer) and unchoked(local) interested(διασύνδεση) και unchoked(τοπικά) - + optimistic unchoke optimistic unchoke - + peer snubbed snubbed διασύνδεση - + incoming connection Εισερχόμενη σύνδεση - + not interested(local) and unchoked(peer) not interested(τοπικά) και unchoked(διασύνδεση) - + not interested(peer) and unchoked(local) not interested(διασύνδεση) και unchoked(τοπικά) - + peer from PEX διασύνδεση απο PEX - + peer from DHT διασύνδεση απο DHT - + encrypted traffic κρυπτογραφημένη κίνηση - + encrypted handshake κρυπτογραφημένη χειραψία - + peer from LSD διασύνδεση απο LSD @@ -5975,193 +5313,178 @@ PeerListWidget - + IP IP - + Port Θύρα - + Flags Σημάνσεις - + Connection Σύνδεση - + Client i.e.: Client application Πελάτης - + Progress i.e: % downloaded Πρόοδος - + Down Speed i.e: Download speed Ταχύτητα Λήψης - + Up Speed i.e: Upload speed Ταχύτητα Αποστολής - + Downloaded i.e: total data downloaded Ληφθέντα - + Uploaded i.e: total data uploaded Απεσταλμένα - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Συνάφεια - + Files i.e. files that are being downloaded right now Αρχεία - + Column visibility Ορατότητα στήλης - + Add a new peer... Προσθήκη νέας διασύνδεσης... - - + + Ban peer permanently Μόνιμος αποκλεισμός διασύνδεσης - + Manually adding peer '%1'... Χειροκίνητη προσθήκη διασύνδεσης '%1'... - + The peer '%1' could not be added to this torrent. Η διασύνδεση '%1' δεν ήταν δυνατό να προστεθεί σε αυτό το torrent. - + Manually banning peer '%1'... Χειροκίνητος αποκλεισμός διασύνδεσης '%1'... - - + + Peer addition Προσθήκη διασύνδεσης - + Country Χώρα - + Copy IP:port - Αντιγραφή IP:θύρα + - + Some peers could not be added. Check the Log for details. Μερικές διασυνδέσεις δεν ήταν δυνατό να προστεθούν. Ελέγξτε το Αρχείο Καταγραφής για λεπτομέρειες. - + The peers were added to this torrent. Οι διασυνδέσεις προστέθηκαν σε αυτό το torrent. - + Are you sure you want to ban permanently the selected peers? Είστε σίγουροι ότι θέλετε να αποκλείσετε μόνιμα τις επιλεγμένες διασυνδέσεις; - + &Yes &Ναι - + &No &Όχι - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - + PeersAdditionDlg - - Format: IPv4:port / [IPv6]:port - - - - + No peer entered - + Δεν έχετε εισάγει διασύνδεση - + Please type at least one peer. - + Παρακαλώ πληκτρολογήστε τουλάχιστον μία διασύνδεση. - + Invalid peer - + Μη έγκυρη διασύνδεση - + The peer '%1' is invalid. - + Η διασύνδεση '%1' δεν είναι έγκυρη. PieceAvailabilityBar - + White: Unavailable pieces Λευκό: Μη διαθέσιμο κομμάτια - + Blue: Available pieces Μπλε: Διαθέσιμα κομμάτια @@ -6169,336 +5492,293 @@ PiecesBar - + Files in this piece: - Αρχεία σε αυτό το κομμάτι: + - + File in this piece - Αρχείο σε αυτό το κομμάτι + - + File in these pieces - Αρχείο σε αυτά τα κομμάτια - - - - Wait until metadata become available to see detailed information - Περιμένετε έως ότου τα μεταδεδομένα να γίνουν διαθέσιμα για να δείτε αναλυτικές πληροφορίες + - + Hold Shift key for detailed information - Κρατήστε πατημένο το πλήκτρο Shift για λεπτομερείς πληροφορίες + - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Πρόσθετα αναζήτησης - + Installed search plugins: - + Εγκατεστημένα πρόσθετα αναζήτησης: - + Name - Όνομα + Όνομα - + Version - + Έκδοση - + Url - + URL - - + + Enabled - - - - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - + Ενεργοποιημένο - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Μπορείτε να βρείτε νέα πρόσθετα μηχανών αναζήτησης <a href="http://plugins.qbittorrent.org">εδώ</a>. - + Install a new one - + Εγκαταστήστε ένα νέο - + Check for updates - + Έλεγχος για ενημερώσεις - + Close - + Κλείσιμο - + Uninstall - + Απεγκατάσταση - - - + + + Yes - Ναι + Ναι - - - - + + + + No - Όχι + Όχι - + Uninstall warning - + Προειδοποίηση απεγκατάστασης - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Μερικά πρόσθετα δεν μπόρεσαν να απεγκατασταθούν γιατί συμπεριλαμβάνονται στο qBittorrent. Μόνο αυτά που προσθέσατε μόνοι σας μπορούν να απεγκατασταθούν. +Αυτά τα πρόσθετα απενεργοποιήθηκαν. - + Uninstall success - + Επιτυχής απεγκατάσταση - + All selected plugins were uninstalled successfully - - - - - - - - Search plugin update - + Όλα τα επιλεγμένα πρόσθετα απεγκαταστάθηκαν επιτυχώς - - Plugins installed or updated: %1 - - - - - + + New search engine plugin URL - + Νέο URL πρόσθετου μηχανής αναζήτησης - - + + URL: - + URL: - + Invalid link - + Άκυρος σύνδεσμος - + The link doesn't seem to point to a search engine plugin. - + Ο σύνδεσμος δεν φαίνεται να οδηγεί σε πρόσθετο μηχανής αναζήτησης. - + Select search plugins - + Επιλέξτε πρόσθετα αναζήτησης - + qBittorrent search plugin - + Πρόσθετο αναζήτησης του qBittorrent + + + + + + Search plugin update + Ενημέρωση πρόσθετου αναζήτησης - + All your plugins are already up to date. - + Όλα τα πρόσθετά σας είναι ήδη ενημερωμένα. - + Sorry, couldn't check for plugin updates. %1 - + Λυπούμαστε, δεν ήταν δυνατός ο έλεγχος για ενημερώσεις πρόσθετων. %1 - + + + Search plugin install - + Εγκατάσταση πρόσθετου αναζήτησης + + + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + Το πρόσθετο μηχανής αναζήτησης "%1" εγκαταστάθηκε επιτυχώς. - + Couldn't install "%1" search engine plugin. %2 - + Δεν ήταν δυνατή η εγκατάσταση του πρόσθετου μηχανής αναζήτησης "%1". %2 + + + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + Το πρόσθετο μηχανής αναζήτησης "%1" ενημερώθηκε επιτυχώς. - + Couldn't update "%1" search engine plugin. %2 - + Δεν ήταν δυνατή η ενημέρωση του πρόσθετου μηχανής αναζήτησης "%1". %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Πηγή πρόσθετου - + Search plugin source: - + Πηγή πρόσθετου αναζήτησης: - + Local file - + Τοπικό αρχείο - + Web link - - - - - PowerManagement - - - qBittorrent is active - + Σύνδεσμος Ιστού - PreviewSelectDialog - - - Preview - Προεπισκόπηση - + PreviewSelect - + Name Όνομα - + Size Μέγεθος - + Progress Πρόοδος - - + + Preview impossible - Αδύνατη προεπισκόπηση + Αδυναμία προεπισκόπησης - - + + Sorry, we can't preview this file - Συγγνώμη, δε μπορεί να γίνει προεπισκόπηση του αρχείου - - - - Private::FileLineEdit - - - '%1' does not exist - Το '%1' δεν υπάρχει - - - - '%1' does not point to a directory - Το '%1' δεν αντιστοιχεί σε φάκελο - - - - '%1' does not point to a file - Το '%1' δεν αντιστοιχεί σε αρχείο - - - - Does not have read permission in '%1' - Δεν έχετε δικαιώματα ανάγνωσης στο '%1' - - - - Does not have write permission in '%1' - Δεν έχετε δικαίωμα σύνταξης στο '%1' + Λυπούμαστε, δεν μπορεί να προεπισκοπηθεί αυτό το αρχείο PropListDelegate - + Not downloaded Δεν έγινε λήψη - - + + Normal Normal (priority) Κανονική - - N/A - N/A - - - + Do not download Do not download (priority) - Να μη γίνει λήψη + Να μην γίνει λήψη - - + + High High (priority) Υψηλή - + N/A + Δ/Υ + + + Mixed Mixed (priorities Μεικτές - - + + Maximum Maximum (priority) Μέγιστη @@ -6507,32 +5787,32 @@ PropTabBar - + General Γενικά - + Trackers Ιχνηλάτες - + Peers Διασυνδέσεις - + HTTP Sources Πηγές HTTP - + Content Περιεχόμενο - + Speed Ταχύτητα @@ -6626,22 +5906,22 @@ Σχόλιο: - + Select All Επιλογή Όλων - + Select None Καμία επιλογή - + Normal Κανονική - + High Υψηλή @@ -6701,165 +5981,165 @@ Διαδρομή Αποθήκευσης: - + Maximum Μέγιστη + - Do not download Να μην γίνει λήψη - + Never Ποτέ - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (έχω %3) - - + + %1 (%2 this session) %1 (%2 αυτή τη συνεδρία) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (διαμοιράστηκε για %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 μέγιστο) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 σύνολο) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 μ.ο.) - + Open Άνοιγμα - + Open Containing Folder Άνοιγμα Θέσης Φακέλου - + Rename... Μετονομασία… - + Priority Προτεραιότητα - + New Web seed Νέος διαμοιραστής Ιστού - + Remove Web seed Αφαίρεση διαμοιραστή Ιστού - + Copy Web seed URL Αντιγραφή URL διαμοιραστή Ιστού - + Edit Web seed URL Επεξεργασία URL διαμοιραστή Ιστού - + + Rename the file + Μετονομασία αρχείου + + + New name: Νέο όνομα: - - + + + The file could not be renamed + Αυτό το αρχείο δεν ήταν δυνατό να μετονομαστεί + + + + This file name contains forbidden characters, please choose a different one. + Αυτό το όνομα αρχείου περιέχει απαγορευμένους χαρακτήρες, παρακαλώ επιλέξτε ένα διαφορετικό. + + + + This name is already in use in this folder. Please use a different name. Αυτό το όνομα ήδη χρησιμοποιείται σε αυτόν τον φάκελο. Παρακαλώ επιλέξτε ένα άλλο. - + The folder could not be renamed Αυτός ο φάκελος δεν ήταν δυνατό να μετονομαστεί - + qBittorrent qBittorrent - + Filter files... Φίλτρο αρχείων… - - Renaming - Μετονομασία - - - - - Rename error - Σφάλμα μετονομασίας - - - - The name is empty or contains forbidden characters, please choose a different one. - Το όνομα είναι κενό ή περιέχει απαγορευμένους χαρακτήρες, παρακαλώ διαλέξτε διαφορετικό όνομα. - - - + New URL seed New HTTP source Νέο URL διαμοιραστή - + New URL seed: Νέο URL διαμοιραστή: - - + + This URL seed is already in the list. Αυτό το URL διαμοιραστή είναι ήδη στη λίστα. - + Web seed editing Επεξεργασία διαμοιραστή Ιστού - + Web seed URL: URL διαμοιραστή Ιστού: @@ -6867,230 +6147,117 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + Η IP σας διεύθυνση έχει απαγορευτεί μετά από πάρα πολλές αποτυχημένες προσπάθειες ελέγχου ταυτότητας. + + + + Error: '%1' is not a valid torrent file. + + Σφάλμα: το «%1» δεν είναι έγκυρο αρχείο torrent. + + + + + Error: Could not add torrent to session. + Σφάλμα: Δεν ήταν δυνατό να προστεθεί το torrent στην συνεδρία. + + + + I/O Error: Could not create temporary file. + Σφάλμα I/O: Δεν ήταν δυνατή η δημιουργία προσωρινού αρχείου. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. Το %1 είναι μια άγνωστη παράμετρος γραμμής εντολών. - - + + %1 must be the single command line parameter. Το %1 πρέπει να είναι ενιαία παράμετρος γραμμής εντολών. - + + %1 must specify the correct port (1 to 65535). + Το %1 πρέπει να προσδιορίζει τη σωστή θύρα (1 έως 65535). + + + You cannot use %1: qBittorrent is already running for this user. Δεν μπορείτε να χρησιμοποιήσετε το %1: το qBittorrent τρέχει ήδη για αυτόν τον χρήστη. - + Usage: Χρήση: - + Options: Επιλογές: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - Η παράμετρος '%1' πρέπει να ακολουθεί τη σύνταξη '%1=%2' - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - Η παράμετρος '%1' πρέπει να ακολουθεί τη σύνταξη '%1=%2' - - - - Expected integer number in environment variable '%1', but got '%2' - Αναμένεται ακέραιος αριθμός στη μεταβλητή περιβάλλοντος '%1', αλλά πήρε '%2' - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - Η παράμετρος '%1' πρέπει να ακολουθεί τη σύνταξη '%1=%2' - - - - Expected %1 in environment variable '%2', but got '%3' - Αναμένεται %1 στη μεταβλητή περιβάλλοντος '%2', αλλά πήρε '%3' - - - - port - θύρα - - - - %1 must specify a valid port (1 to 65535). - Το %1 πρέπει να προσδιορίζει μια έγκυρη θύρα (1 έως 65535). - - - - Display program version and exit - Εμφάνισε την έκδοση προγράμματος και έξοδο + + Displays program version + Εμφανίζει την έκδοση προγράμματος - - Display this help message and exit - Εμφάνιση αυτού του μηνύματος βοήθειας και έξοδο + + Displays this help message + Εμφανίζει αυτό το μήνυμα βοηθείας - - Change the Web UI port - Αλλαγή της θύρας του UI Ιστού + + Changes the Web UI port (current: %1) + Αλλάζει τη θύρα του UI Ιστού (τρέχων: %1) - + Disable splash screen Απενεργοποίηση οθόνης εκκίνησης - + Run in daemon-mode (background) Εκτέλεση σε λειτουργία daemon (παρασκήνιο) - - dir - Use appropriate short form or abbreviation of "directory" - dir - - - - Store configuration files in <dir> - Αποθήκευση αρχείων ρύθμισης παραμέτρων στο <dir> - - - - - name - όνομα - - - - Store configuration files in directories qBittorrent_<name> - Αποθήκευση αρχείων ρύθμισης παραμέτρων σε καταλόγους qBittorrent_<name> - - - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Ρωγμή σε libtorrent γρήγορα συνεχιζόμενα αρχεία και διαδρομές αρχείων σε σχέση με τον κατάλογο του προφίλ. - - - - files or URLs - αρχεία ή διευθύνσεις URL - - - - Download the torrents passed by the user - Λήψη των τόρεντ που δόθηκαν απο τον χρήστη - - - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Καθορίστε εάν το παράθυρο διαλόγου «Προσθήκη νέων Torrent» θα ανοίγει όταν προσθέτετε ένα torrent. - - - - Options when adding new torrents: - Επιλογές όταν προστίθενται νέα torrents: - - - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Συντόμευση για %1 - - - - path - διαδρομή - - - - Torrent save path - Διαδρομή αποθήκευσης Torrent - - - - Add torrents as started or paused - Προσθήκη τόρεντ, κατά την έναρξη η την παύση - - - - Skip hash check - Παράλειψη ελέγχου hash - - - - Assign torrents to category. If the category doesn't exist, it will be created. - Αντιστοιχίστε torrents σε κατηγορία. Αν η κατηγορία δεν υπάρχει, θα δημιουργηθεί. - - - - Download files in sequential order - Λήψη των αρχείων σε διαδοχική σειρά - - - - Download first and last pieces first - Λήψη πρώτων και τελευταίων κομματιών πρώτα - - - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - Επιλογή τιμών μπορεί να παραχθεί μέσω των μεταβλητών περιβάλλοντος. Για την επιλογή με την ονομασία "όνομα παραμέτρου", η μεταβλητή περιβάλλοντος με το όνομα "QBT_PARAMETER_NAME" (σε κεφαλαία, '-' και να αντικατασταθεί με '_'). Για μεταβίβαση επισήμανσης τιμών, ορίστε την μεταβλητή " 1 " η "ΑΛΉΘΕΙΑ". Για παράδειγμα, για απενεργοποιήση της οθόνης εκκίνησης: - - - - Command line parameters take precedence over environment variables - Οι παράμετροι της γραμμής εντολών υπερισχύουν έναντι των μεταβλητών περιβάλλοντος + + Downloads the torrents passed by the user + Κάνει λήψη των torrents που δόθηκαν απο τον χρήστη - + Help Βοήθεια - + Run application with -h option to read about command line parameters. Εκτελέστε την εφαρμογή με την επιλογή -h για να διαβάσετε σχετικά με τις παραμέτρους της γραμμής εντολών. - + Bad command line Μη έγκυρη γραμμή εντολών - + Bad command line: Μη έγκυρη γραμμή εντολών: - + Legal Notice Νομική Σημείωση - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - Το qBittorrent είναι ένα πρόγραμμα ανταλλαγής αρχείων. Όταν τρέχετε ένα torrent, τα δεδομένα του γίνονται διαθέσιμα σε άλλους μέσω της αποστολής. Οποιοδήποτε περιεχόμενο μοιράζεστε είναι αποκλειστικά δική σας ευθύνη. - - - - No further notices will be issued. - Δεν θα υπάρξουν περαιτέρω προειδοποιήσεις. - - - + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. No further notices will be issued. @@ -7099,628 +6266,701 @@ Δεν θα εκδοθούν περαιτέρω ανακοινώσεις. - + Press %1 key to accept and continue... Πατήστε το πλήκτρο %1 για αποδοχή και συνέχεια… - + Legal notice Νομική Σημείωση - + Cancel Άκυρο - + I Agree Συμφωνώ - - - Upgrade - Αναβάθμιση + + Torrent name: %1 + Όνομα torrent: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - Αναβαθμίσατε από μια παλιότερη έκδοση που αποθήκευε τα πράγματα διαφορετικά. Θα πρέπει να μεταπηδήσετε στο νέο σύστημα αποθήκευσης. Δεν θα μπορείτε να χρησιμοποιήσετε παλιότερη έκδοση από την v3.3.0 ξανά. Συνέχεια; [ν/ο] + + Torrent size: %1 + Μέγεθος torrent: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - Αναβαθμίσατε από μια παλιότερη έκδοση που αποθήκευε τα πράγματα διαφορετικά. Θα πρέπει να μεταπηδήσετε στο νέο σύστημα αποθήκευσης. Άν συνεχίσετε, δεν θα μπορείτε να χρησιμοποιήσετε παλιότερη έκδοση από την v3.3.0 ξανά. + + Save path: %1 + Διαδρομή αποθήκευσης: %1 - - Couldn't migrate torrent with hash: %1 - Δεν ήταν δυνατή η μεταπήδηση του torrent με hash: %1 + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Το torrent λήφθηκε σε %1. - - Couldn't migrate torrent. Invalid fastresume file name: %1 - Δεν ήταν δυνατή η μεταπήδηση του torrent. Μη έγκυρο όνομα αρχείου fastresume: %1 + + Thank you for using qBittorrent. + Ευχαριστούμε που χρησιμοποιείτε το qBittorrent. - - Detected unclean program exit. Using fallback file to restore settings: %1 - Εντοπίστηκε μη καθαρή έξοδος του προγράμματος. Χρήση εφεδρικού αρχείου για επαναφορά ρυθμίσεων: %1 + + [qBittorrent] '%1' has finished downloading + [qBittorrent] Η λήψη του '%1' ολοκληρώθηκε. - - An access error occurred while trying to write the configuration file. - Παρουσιάστηκε σφάλμα πρόσβασης κατά την προσπάθεια εγγραφής του αρχείου διαμόρφωσης. + + The remote host name was not found (invalid hostname) + Το απομακρυσμένο όνομα φορέα δεν βρέθηκε (μη έγκυρο όνομα φορέα) - - A format error occurred while trying to write the configuration file. - Παρουσιάστηκε σφάλμα μορφοποίησης κατά την προσπάθεια εγγραφής του αρχείου διαμόρφωσης. + + The operation was canceled + Η λειτουργία ακυρώθηκε - - An unknown error occurred while trying to write the configuration file. - Παρουσιάστηκε σφάλμα μορφοποίησης κατά την προσπάθεια εγγραφής του αρχείου διαμόρφωσης. + + The remote server closed the connection prematurely, before the entire reply was received and processed + Ο απομακρυσμένος διακομιστής διέκοψε την σύνδεση πρόωρα, προτού η πλήρης απάντηση ληφθεί και επεξεργασθεί + + + + The connection to the remote server timed out + Η σύνδεση με τον απομακρυσμένο διακομιστή εξάντλησε το χρονικό περιθώριο - - - RSS::AutoDownloader - - - Invalid data format. - Μη έγκυρη μορφή δεδομένων. + + SSL/TLS handshake failed + Αποτυχία SSL/TLS χειραψίας + + + + The remote server refused the connection + Ο απομακρυσμένος διακομιστής αρνήθηκε τη σύνδεση - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - Δεν ήταν δυνατή η αποθήκευση των δεδομένων της Αυτόματης Λήψης RSS στο %1. Σφάλμα: %2 + + The connection to the proxy server was refused + Η σύνδεση στον διακομιστή μεσολάβησης αρνήθηκε - - Invalid data format - Μη έγκυρη μορφή δεδομένων + + The proxy server closed the connection prematurely + Ο διακομιστής μεσολάβησης έκλεισε την σύνδεση πρόωρα - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - Δεν ήταν δυνατή η ανάγνωση των κανόνων Αυτόματης Λήψης RSS από το %1. Σφάλμα: %2 + + The proxy host name was not found + Το όνομα φορέα του μεσολαβητή δεν βρέθηκε - - Couldn't load RSS AutoDownloader rules. Reason: %1 - Δεν ήταν δυνατή η φόρτωση των κανόνων της Αυτόματης Λήψης RSS. Αιτία: %1 + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Η σύνδεση στον μεσολαβητή εξάντλησε το χρονικό περιθώριο ή ο μεσολαβητής δεν αποκρίθηκε εγκαίρως στο σταλθέν αίτημα - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - Αποτυχία λήψης RSS ροής στο '%1'. Εξαιτίας: %2 + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Ο μεσολαβητής απαιτεί έλεγχο ταυτότητας για να τιμήσει το αίτημα αλλά δεν δέχθηκε όσα διαπιστευτήρια προσφέρθηκαν - - RSS feed at '%1' updated. Added %2 new articles. - Η τροφοδοσία RSS στο '%1' ενημερώθηκε. Προστέθηκαν %2 νέα άρθρα. + + The access to the remote content was denied (401) + Η πρόσβαση στο απομακρυσμένο περιεχόμενο αρνήθηκε (401) - - Failed to parse RSS feed at '%1'. Reason: %2 - Αποτυχία ανάλυσης της ροής RSS στο '%1'. Αιτία: %2 + + The operation requested on the remote content is not permitted + Η λειτουργία που ζητήθηκε στο απομακρυσμένο περιεχόμενο δεν επιτρέπεται - - Couldn't read RSS Session data from %1. Error: %2 - Δεν ήταν δυνατή η ανάγνωση των δεδομένων της συνόδου RSS από %1. Σφάλμα: %2 + + The remote content was not found at the server (404) + Το απομακρυσμένο περιεχόμενο δεν βρέθηκε στον διακομιστή (404) - - Couldn't parse RSS Session data. Error: %1 - Δεν ήταν δυνατή η ανάλυση των δεδομένων της συνόδου RSS. Σφάλμα: %1 + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Ο απομακρυσμένος διακομιστής απαιτεί έλεγχο ταυτότητας για να παρέχει το περιεχόμενο, αλλά τα διαπιστευτήρια που δόθηκαν δεν έγιναν δεκτά - - Couldn't load RSS Session data. Invalid data format. - Δεν ήταν δυνατή η φόρτωση των δεδομένων της συνόδου RSS. Μη έγκυρη μορφή δεδομένων. + + The Network Access API cannot honor the request because the protocol is not known + Το API Πρόσβασης Δικτύου δεν μπόρεσε να τιμήσει το αίτημα επειδή το πρωτόκολλο είναι άγνωστο - - Couldn't load RSS article '%1#%2'. Invalid data format. - Δεν ήταν δυνατή η φόρτωση των δεδομένων του άρθρου RSS '%1#%2'. Μη έγκυρη μορφή δεδομένων. + + The requested operation is invalid for this protocol + Η λειτουργία που ζητήθηκε δεν είναι έγκυρη για αυτό το πρωτόκολλο - - - RSS::Private::Parser - - Invalid RSS feed. - Μη έγκυρη τροφοδοσία RSS. + + An unknown network-related error was detected + Εντοπίστηκε ένα άγνωστο σφάλμα σχετιζόμενο με το δίκτυο - - %1 (line: %2, column: %3, offset: %4). - %1 (γραμμή: %2, στήλη: %3, μετατόπιση: %4). + + An unknown proxy-related error was detected + Εντοπίστηκε ένα άγνωστο σφάλμα σχετιζόμενο με τον μεσολαβητή + + + + An unknown error related to the remote content was detected + Εντοπίστηκε ένα άγνωστο σφάλμα σχετιζόμενο με το απομακρυσμένο περιεχόμενο + + + + A breakdown in protocol was detected + Εντοπίστηκε μια κατάρρευση στο πρωτόκολλο - - - RSS::Session - - RSS feed with given URL already exists: %1. - Ροή RSS με την δοσμένη διεύθυνση URL υπάρχει ήδη: %1. + + Unknown error + Άγνωστο σφάλμα + + + + + Upgrade + Αναβάθμιση + + + + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] + Αναβαθμίσατε από μια παλιότερη έκδοση που αποθήκευε τα πράγματα διαφορετικά. Θα πρέπει να μεταπηδήσετε στο νέο σύστημα αποθήκευσης. Δεν θα μπορείτε να χρησιμοποιήσετε παλιότερη έκδοση από την v3.3.0 ξανά. Συνέχεια; [ν/ο] - - Cannot move root folder. - Δεν γίνεται να μετακινηθεί ο ριζικός κατάλογος + + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. + Αναβαθμίσατε από μια παλιότερη έκδοση που αποθήκευε τα πράγματα διαφορετικά. Θα πρέπει να μεταπηδήσετε στο νέο σύστημα αποθήκευσης. Άν συνεχίσετε, δεν θα μπορείτε να χρησιμοποιήσετε παλιότερη έκδοση από την v3.3.0 ξανά. - - - Item doesn't exist: %1. - Το στοιχείο δεν υπάρχει: %1. + + Couldn't migrate torrent with hash: %1 + Δεν ήταν δυνατή η μεταπήδηση του torrent με hash: %1 - - Cannot delete root folder. - Δεν γίνεται να διαγραφεί ο ριζικός κατάλογος + + Couldn't migrate torrent. Invalid fastresume file name: %1 + Δεν ήταν δυνατή η μεταπήδηση του torrent. Μη έγκυρο όνομα αρχείου fastresume: %1 - - Incorrect RSS Item path: %1. - Εσφαλμένη διαδρομή του στοιχείου RSS: %1. + + Detected unclean program exit. Using fallback file to restore settings. + - - RSS item with given path already exists: %1. - Το στοιχείο RSS με την δοσμένη διαδρομή υπάρχει ήδη: %1. + + An access error occurred while trying to write the configuration file. + - - Parent folder doesn't exist: %1. - Δεν υπάρχει ο γονικός φάκελος: %1. + + A format error occurred while trying to write the configuration file. + - RSSWidget + RSS - + Search Αναζήτηση - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - Η λήψη των ροών RSS είναι τώρα απενεργοποιημένη! Μπορείτε να την ενεργοποιήσετε στις ρυθμίσεις εφαρμογής. - - - + New subscription Νέα συνδρομή - - - + + + Mark items read Επισήμανση αντικειμένων ως διαβασμένα - - Refresh RSS streams - Ανανέωση ροών RSS - - - + Update all Ενημέρωση όλων - + RSS Downloader... - Λήπτης RSS... + Λήπτης RSS… - + + Settings... + Ρυθμίσεις… + + + Torrents: (double-click to download) Torrents: (διπλό κλικ για λήψη) - - + + Delete Διαγραφή - + Rename... - Μετονομασία... + Μετονομασία… - + Rename Μετονομασία - - + + Update Ενημέρωση - + New subscription... - Νέα συνδρομή... + Νέα συνδρομή… - - + + Update all feeds - Ενημέρωση όλων των αποστολών + Ενημέρωση όλων των τροφοδοσιών - + Download torrent Λήψη torrent - + Open news URL Άνοιγμα URL ειδήσεων - + Copy feed URL Αντιγραφή URL τροφοδοσίας - + New folder... - Νέος φάκελος + Νέος φάκελος… - + + Refresh RSS streams + Ανανέωση ροών RSS + + + + RSSImp + + + Stream URL: + URL ροής: + + + + Please type a RSS stream URL + Παρακαλώ πληκτρολογήστε ένα URL ροής RSS + + + + This RSS feed is already in the list. + Αυτή η τροφοδοσία RSS είναι ήδη στη λίστα. + + + Please choose a folder name Παρακαλώ επιλέξτε ένα όνομα φακέλου - + Folder name: Όνομα φακέλου: - + New folder Νέος φάκελος - - Please type a RSS feed URL - Παρακαλώ πληκτρολογήστε ένα URL RSS - - - - Feed URL: - URL RSS: - - - + Deletion confirmation Επιβεβαίωση διαγραφής - + Are you sure you want to delete the selected RSS feeds? Είστε σίγουροι ότι θέλετε να διαγράψετε τις επιλεγμένες τροφοδοσίες RSS; - + Please choose a new name for this RSS feed Παρακαλώ επιλέξτε ένα νέο όνομα για αυτή την τροφοδοσία RSS - + New feed name: Νέο όνομα τροφοδοσίας: - - Rename failed - Η μετονομασία απέτυχε + + Name already in use + Το όνομα χρησιμοποιείται ήδη - + + This name is already used by another item, please choose another one. + Αυτό το όνομα χρησιμοποιείται ήδη από ένα άλλο αντικείμενο, παρακαλώ επιλέξτε ένα άλλο. + + + Date: - Ημερομηνία: + Ημερομηνία: - + Author: - Συγγραφέας: + Συγγραφέας: + + + + Unread + Μη Αναγνωσμένα - ScanFoldersDelegate + Rss::Feed - - Select save location - Επιλογή τοποθεσίας αποθήκευσης + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + Η αυτόματη λήψη του '%1' από την τροφοδοσία RSS '%2' απέτυχε γιατί δεν περιέχει ένα torrent ή έναν σύνδεσμο magnet... + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + Γίνεται αυτόματη λήψη του torrent '%1' από την τροφοδοσία RSS '%2'... - ScanFoldersModel + Rss::Private::Parser - - Monitored Folder - Φάκελος υπό Παρακολούθηση + + Invalid RSS feed. + Μη έγκυρη τροφοδοσία RSS. + + + RssSettingsDlg - - Override Save Location - Παράκαμψη Τοποθεσίας Αποθήκευσης + + RSS Reader Settings + Ρυθμίσεις Αναγνώστη RSS - - Monitored folder - Φάκελος υπό παρακολούθηση + + RSS feeds refresh interval: + Μεσοδιάστημα ανανέωσης τροφοδοσιών RSS: - - Default save location - Προεπιλεγμένη τοποθεσία αποθήκευσης + + min + λεπτά - - Browse... - Περιήγηση... + + Maximum number of articles per feed: + Μέγιστος αριθμός άρθρων ανά τροφοδοσία: - SearchJobWidget + ScanFoldersDelegate - - Form - + + Select save location + Επιλογή αποθήκευσης τοποθεσίας + + + ScanFoldersModel - - Results(xxx) + + Monitored Folder - - Search in: + + Override Save Location - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + + Monitored folder - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - + + Default save location + Προεπιλεγμένη αποθήκευση τοποθεσίας - - Seeds: - Διαμοιραστές: + + Browse... + Περιήγηση... + + + SearchEngine - - <html><head/><body><p>Minimal number of seeds</p></body></html> - + + Unknown search engine plugin file format. + Άγνωστη μορφή αρχείου πρόσθετου μηχανής αναζήτησης. - - - to - + + A more recent version of this plugin is already installed. + Μια πιο πρόσφατη έκδοση αυτού του πρόσθετου έχει ήδη εγκατασταθεί. - - <html><head/><body><p>Maximal number of seeds</p></body></html> - + + + Plugin is not supported. + Το πρόσθετο δεν υποστηρίζεται. - - - - + + Update server is temporarily unavailable. %1 + Ο διακομιστής ενημερώσεων είναι προσωρινά μη διαθέσιμος. %1 - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + + + Failed to download the plugin file. %1 + Αποτυχία λήψης αρχείου πρόσθετου. %1 - - Size: - Μέγεθος: + + An incorrect update info received. + Λήφθηκε λανθασμένη πληροφορία ενημέρωσης. - - <html><head/><body><p>Minimal torrent size</p></body></html> - + + All categories + Όλες οι κατηγορίες - - <html><head/><body><p>Maximal torrent size</p></body></html> - + + Movies + Ταινίες + + + + TV shows + Τηλεοπτικές σειρές + + + + Music + Μουσική + + + + Games + Παιχνίδια + + + + Anime + Ανιμέ + + + + Software + Λογισμικό + + + + Pictures + Εικόνες + + + + Books + Βιβλία + + + + SearchListDelegate + + + + Unknown + Άγνωστο + + + SearchTab - + Name i.e: file name - Όνομα + Όνομα - + Size i.e: file size - Μέγεθος + Μέγεθος - + Seeders i.e: Number of full sources - + Διαμοιραστές - + Leechers i.e: Number of partial sources - + Αποδέκτες - + Search engine - - - - - Filter search results... - + Μηχανή αναζήτησης - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Αποτελέσματα (εμφανίζονται <i>%1</i> από <i>%2</i>): - + Torrent names only - + Μόνο ονόματα torrents - + Everywhere - - - - - Use regular expressions - + Παντού - + Searching... - + Γίνεται αναζήτηση… - + Search has finished - Η αναζήτηση ολοκληρώθηκε + Η αναζήτηση ολοκληρώθηκε - + Search aborted - + Η αναζήτηση ματαιώθηκε - + An error occurred during search... - + Παρουσιάστηκε σφάλμα κατά τη διάρκεια της αναζήτησης... - + Search returned no results - + Η αναζήτηση δεν επέστρεψε κάποιο αποτέλεσμα - + Column visibility Ορατότητα στήλης - - - SearchPluginManager - - - Unknown search engine plugin file format. - Άγνωστη μορφή αρχείου πρόσθετου μηχανής αναζήτησης. - - - - A more recent version of this plugin is already installed. - Μια πιο πρόσφατη έκδοση αυτού του plugin έχει ήδη εγκατασταθεί. - - - - Plugin is not supported. - Το plugin δεν υποστηρίζεται. + + Form + Μορφή - - All categories - Όλες οι κατηγορίες + + Results(xxx) + Αποτελέσματα(xxx) - - Movies - Ταινίες + + Search in: + Αναζήτηση για: - - TV shows - Τηλεοπτικές σειρές + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Μερικές μηχανές αναζήτησης ψάχνουν στην περιγραφή του torrent αλλά και σε ονόματα αρχείων torrent επίσης. Κατά πόσο αυτά τα αποτελέσματα θα εμφανίζονται στην παρακάτω λίστα ελέγχεται από αυτή την κατάσταση.</p><p><span style=" font-weight:600;">Το Παντού </span>απενεργοποιεί το φιλτράρισμα και εμφανίζει τα πάντα απ ότι επιστρέφεται από τις μηχανές αναζήτησης.</p><p><span style=" font-weight:600;">Το Μόνο ονόματα Torrent</span> εμφανίζει μόνο torrents των οποίων τα ονόματα αντιστοιχούν το ερώτημα αναζήτησης.</p></body></html> - - Music - Μουσική + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Ορίστε ελάχιστο και μέγιστο επιτρεπόμενο αριθμό διαμοιραστών</p></body></html> - - Games - Παιχνίδια + + Seeds: + Διαμοιραστές: - - Anime - Άνιμε + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Ελάχιστος αριθμός διαμοιραστών</p></body></html> - - Software - Λογισμικό + + + to + έως - - Pictures - Εικόνες + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Μέγιστος αριθμός διαμοιραστών</p></body></html> - - - Books - Βιβλία + + + + + - - Update server is temporarily unavailable. %1 - Ο διακομιστής ενημερώσεων είναι προσωρινά μη διαθέσιμος. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Ορίστε ελάχιστο και μέγιστο επιτρεπόμενο μέγεθος ενός torrent</p></body></html> - - - Failed to download the plugin file. %1 - Αποτυχία μεταφόρτωσης του αρχείου plugin. %1 + + Size: + Μέγεθος: - - An incorrect update info received. - Λήφθηκε λανθασμένη πληροφορία ενημέρωσης. + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Ελάχιστο μέγεθος torrent</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - Το πρόσθετο αναζήτησης '%1' περιέχει μη έγκυρη συμβολοσειρά έκδοσης ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Μέγιστο μέγεθος torrent</p></body></html> @@ -7728,198 +6968,185 @@ - - - - + + + Search Αναζήτηση - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - Δεν υπάρχουν εγκατεστημένα πρόσθετα αναζήτησης. -Κάντε κλικ στο κουμπί "Πρόσθετα αναζήτησης.." κάτω δεξιά για να εγκαταστήσετε μερικά. - - - + Download Λήψη - + Go to description page Μετάβαση στη σελίδα περιγραφής - + Copy description page URL Αντιγραφή URL σελίδας περιγραφής - + Search plugins... Αναζήτηση προσθέτων… - + A phrase to search for. Μια φράση προς αναζήτηση. - + Spaces in a search term may be protected by double quotes. Τα κενά σε έναν όρο αναζήτησης μπορούν να προστατευθούν με διπλά εισαγωγικά. - + Example: Search phrase example Παράδειγμα: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>: αναζήτηση για <b>foo</b> και <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: αναζήτηση για <b>foo bar</b> - + All plugins Όλα τα πρόσθετα - + Only enabled Μόνο ενεργοποιημένο - + Select... Επιλογή... - - - + + + Search Engine Μηχανή Αναζήτησης - + Please install Python to use the Search Engine. Παρακαλώ εγκαταστήστε το Python για να χρησιμοποιήσετε την Μηχανή Αναζήτησης. - + Empty search pattern Κενό πρότυπο αναζήτησης - + Please type a search pattern first Παρακαλώ πληκτρολογήστε ένα πρότυπο αναζήτησης πρώτα - + Stop Διακοπή - + Search has finished Η αναζήτηση ολοκληρώθηκε - + Search has failed Η αναζήτηση απέτυχε - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + Το qBittorrent θα πραγματοποιήσει έξοδο. - + E&xit Now - + Έ&ξοδος Τώρα - + Exit confirmation - + Επιβεβαίωση εξόδου - + The computer is going to shutdown. - + Η λειτουργία του υπολογιστή θα τερματιστεί. - + &Shutdown Now - - - - - Shutdown confirmation - + &Τερματισμός Τώρα - + The computer is going to enter suspend mode. - + Η λειτουργία του υπολογιστή θα ανασταλεί. - + &Suspend Now - + Α&ναστολή Τώρα - + Suspend confirmation - + Επιβεβαίωση αναστολής - + The computer is going to enter hibernation mode. - + Η λειτουργία του υπολογιστή θα αδρανοποιηθεί. - + &Hibernate Now - + Α&δρανοποίηση Τώρα - + Hibernate confirmation - + Επιβεβαίωση αδρανοποίησης - + You can cancel the action within %1 seconds. - + Μπορείτε να ακυρώσετε την ενέργεια μέσα σε %1 δευτερόλεπτα. + + + + Shutdown confirmation + Επιβεβαίωση τερματισμού SpeedLimitDialog - + KiB/s KiB/δ @@ -7927,52 +7154,52 @@ SpeedPlotView - + Total Upload Συνολική Αποστολή - + Total Download Συνολική Λήψη - + Payload Upload Payload Αποστολής - + Payload Download Payload Λήψης - + Overhead Upload Overhead Αποστολής - + Overhead Download Overhead Λήψης - + DHT Upload Αποστολή DHT - + DHT Download Λήψη DHT - + Tracker Upload Αποστολή Ιχνηλάτη - + Tracker Download Λήψη Ιχνηλάτη @@ -7980,95 +7207,87 @@ SpeedWidget - + Period: Περίοδος: - + 1 Minute 1 Λεπτό - + 5 Minutes 5 Λεπτά - + 30 Minutes 30 Λεπτά - + 6 Hours 6 Ώρες - + Select Graphs Επιλέξτε Γραφήματα - + Total Upload Συνολική Αποστολή - + Total Download Συνολική Λήψη - + Payload Upload Payload Αποστολής - + Payload Download Payload Λήψης - + Overhead Upload Overhead Αποστολής - + Overhead Download Overhead Λήψης - + DHT Upload Αποστολή DHT - + DHT Download Λήψη DHT - + Tracker Upload Αποστολή Ιχνηλάτη - + Tracker Download Λήψη Ιχνηλάτη - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8081,49 +7300,49 @@ Στατιστικά χρήστη - - Cache statistics - Στατιστικά προσωρινής μνήμης + + Total peer connections: + Συνολικές συνδέσεις αποδεκτών: - - Read cache hits: - Συμβάντα ανάγνωσης προσωρινής μνήμης: + + Global ratio: + Γενική αναλογία: - - Average time in queue: - Μέσος χρόνος σε ουρά: + + Alltime download: + Συνολικά ληφθέντα: - - Connected peers: - Συνδεδεμένοι χρήστες: + + Alltime upload: + Συνολικά απεσταλμένα: - - All-time share ratio: - Αναλογία συνολικού διαμοιρασμού: + + Total waste (this session): + Σύνολο χαμένων (τρέχουσα συνεδρία): - - All-time download: - Συνολικά κατεβασμένα: + + Cache statistics + Στατιστικά προσωρινής μνήμης - - Session waste: - Σπατάλη συνεδρίας: + + Read cache hits: + - - All-time upload: - Συνολικά απεσταλμένα: + + Average time in queue: + - Total buffer size: - Συνολικό μέγεθος buffer: + Total buffers size: + Συνολικό μέγεθος ενδιάμεσης μνήμης: @@ -8151,36 +7370,46 @@ Συνολικό μέγεθος σε ουρά: - + + OK + Εντάξει + + + %1 ms 18 milliseconds - %1 μδ + StatusBar - + Connection status: Κατάσταση σύνδεσης: - + No direct connections. This may indicate network configuration problems. Χωρίς απευθείας συνδέσεις. Αυτό μπορεί να αποτελεί ένδειξη προβλημάτων των παραμέτρων του δικτύου. - + DHT: %1 nodes DHT: %1 κόμβοι - - qBittorrent needs to be restarted! - Το qBittorrent χρειάζεται επανεκκίνηση! + + qBittorrent needs to be restarted + Το qBittorrent χρειάζεται επανεκκίνηση + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + Το qBittorrent μόλις ενημερώθηκε και χρειάζεται επανεκκίνηση για να ισχύσουν οι αλλαγές. @@ -8199,1566 +7428,1311 @@ Σε σύνδεση - + Click to switch to alternative speed limits Κλικ για αλλαγή σε εναλλακτικά όρια ταχύτητας - + Click to switch to regular speed limits Κλικ για αλλαγή σε κανονικά όρια ταχύτητας - + + Manual change of rate limits mode. The scheduler is disabled. + Χειροκίνητη αλλαγή σε λειτουργία ορίων ρυθμού. Το χρονοδιάγραμμα είναι απενεργοποιημένο. + + + Global Download Speed Limit Γενικό Όριο Ταχύτητας Λήψης - + Global Upload Speed Limit Γενικό Όριο Ταχύτητας Αποστολής - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - Όλα (0) + Όλα (0) - + Downloading (0) - + Γίνεται Λήψη (0) - + Seeding (0) - + Γίνεται Διαμοιρασμός (0) - + Completed (0) - + Ολοκληρωμένα (0) - + Resumed (0) - + Σε Συνέχιση (0) - + Paused (0) - + Σε Παύση (0) - + Active (0) - + Ενεργά (0) - + Inactive (0) - + Ανενεργά (0) - + Errored (0) - + Με Σφάλμα (0) - + All (%1) - Όλα (%1) + Όλα (%1) - + Downloading (%1) - + Γίνεται Λήψη (%1) - + Seeding (%1) - + Γίνεται Διαμοιρασμός (%1) - + Completed (%1) - + Ολοκληρωμένα (%1) - + Paused (%1) - + Σε Παύση (%1) - + Resumed (%1) - + Σε Συνέχιση (%1) - + Active (%1) - + Ενεργά (%1) - + Inactive (%1) - + Ανενεργά (%1) - + Errored (%1) - + Με Σφάλμα (%1) - TagFilterModel + TorrentContentModel - - Tags - Ετικέτες + + Name + Όνομα - - All - Όλα + + Size + Μέγεθος - - Untagged - Χωρίς ετικέτα + + Progress + Πρόοδος - - - TagFilterWidget - - Add tag... - Προσθήκη ετικέτας... + + Download Priority + Προτεραιότητα Λήψης - - Remove tag - Αφαίρεση ετικέτας - - - - Remove unused tags - Αφαίρεση αχρησιμοποίητων ετικετών - - - - Resume torrents - Συνέχιση torrents - - - - Pause torrents - Παύση torrents - - - - Delete torrents - Διαγραφή torrents - - - - New Tag - Νέα ετικέτα - - - - Tag: - Ετικέτα - - - - Invalid tag name - Άκυρο όνομα ετικέτας + + Remaining + Απομένουν + + + TorrentCreatorDlg - - Tag name '%1' is invalid - Το όνομα ετικέτας '%1' δεν είναι έγκυρο. + + Select a folder to add to the torrent + Επιλέξτε ένα φάκελο για να προσθέσετε στο torrent - - Tag exists - Η ετικέτα υπάρχει + + Select a file to add to the torrent + Επιλέξτε ένα αρχείο για να προσθέσετε στο torrent - - Tag name already exists. - Το όνομα της ετικέτας υπάρχει ήδη + + No input path set + Δεν έχει καθοριστεί τοποθεσία εισόδου - - - TorrentCategoryDialog - - Torrent Category Properties - Ιδιότητες κατηγορίας Torrent + + Please type an input path first + Παρακαλώ πληκτρολογήστε μία τοποθεσία εισόδου πρώτα - - Name: - Όνομα: + + Select destination torrent file + Επιλέξτε προορισμό αρχείου torrent - - Save path: - Αποθήκευση διαδρομής: + + Torrent Files (*.torrent) + Αρχεία Torrent (*.torrent) - - Choose save path - Επιλέξτε τοποθεσία αποθήκευσης + + Torrent was created successfully: %1 + %1 is the path of the torrent + Το torrent δημιουργήθηκε επιτυχώς: %1 - - New Category - Νέα κατηγορία + + + + Torrent creation + Δημιουργία torrent - - Invalid category name - Μη έγκυρο όνομα κατηγορίας + + Torrent creation was unsuccessful, reason: %1 + Αποτυχία δημιουργίας torrent, αιτία: %1 - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - Το όνομα της κατηγορίας δεν μπορεί να περιέχει '\'. -Το όνομα της κατηγορίας δεν μπορεί να ξεκινά/τελειώνει με '/'. -Το όνομα της κατηγορίας δεν μπορεί να περιέχει αλληλουχία '//'. - - - - Category creation error - Σφάλμα κατά τη δημιουργία κατηγορίας - - - - Category with the given name already exists. -Please choose a different name and try again. - Κατηγορία με το δοσμένο όνομα υπάρχει ήδη. -Παρακαλώ επιλέξτε ένα διαφορετικό όνομα και προσπαθήστε ξανά. + + Created torrent file is invalid. It won't be added to download list. + Το αρχείο torrent που δημιουργήσατε είναι άκυρο. Δε θα προστεθεί στη λίστα λήψεων. - TorrentContentModel + TorrentModel - + Name + i.e: torrent name Όνομα - + Size + i.e: torrent size Μέγεθος - - Progress - Πρόοδος - - - - Download Priority - Προτεραιότητα Λήψης - - - - Remaining - Απομένουν - - - - Availability - Διαθεσιμότητα - - - - TorrentCreatorDialog - - - Torrent Creator - - - - - Select file/folder to share - - - - - Path: - - - - - [Drag and drop area] - [Περιοχή μεταφοράς και απόθεσης] - - - - - Select file - Επιλέξτε αρχείο - - - - - Select folder - - - - - Settings - Ρυθμίσεις - - - - Piece size: - - - - - Auto - - - - - 16 KiB - 16 KiB - - - - 32 KiB - 32 KiB - - - - 64 KiB - 64 KiB - - - - 128 KiB - 128 KiB - - - - 256 KiB - 128 KiB {256 ?} - - - - 512 KiB - 128 KiB {512 ?} - - - - 1 MiB - - - - - 2 MiB - - - - - 4 MiB - - - - - 8 MiB - - - - - 16 MiB - - - - - 32 MiB - - - - - Calculate number of pieces: - - - - - Private torrent (Won't distribute on DHT network) - - - - - Start seeding immediately - - - - - Ignore share ratio limits for this torrent - - - - - Optimize alignment - - - - - Fields - - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - - - - Web seed URLs: - - - - - Tracker URLs: - - - - - Comments: - - - - - Source: - - - - - Progress: - Πρόοδος: - - - - Create Torrent - + + Done + % Done + Ολοκληρώθηκε - - - - Torrent creation failed - + + Status + Torrent status (e.g. downloading, seeding, paused) + Κατάσταση - - Reason: Path to file/folder is not readable. - + + Seeds + i.e. full sources (often untranslated) + Διαμοιραστές - - Select where to save the new torrent - + + Peers + i.e. partial sources (often untranslated) + Αποδέκτες - - Torrent Files (*.torrent) - + + Down Speed + i.e: Download speed + Ταχύτητα Λήψης - - Reason: %1 - + + Up Speed + i.e: Upload speed + Ταχύτητα Αποστολής - - Reason: Created torrent is invalid. It won't be added to download list. - + + Ratio + Share ratio + Αναλογία - - Torrent creator - + + ETA + i.e: Estimated Time of Arrival / Time left + ΕΤΑ - - Torrent created: - - - - - TorrentInfo - - - File size exceeds max limit %1 - Το αρχείο υπερβαίνει το μέγιστο όριο %1 + + Category + Κατηγορία - - Torrent file read error: %1 - + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Προστέθηκε στις - - Torrent file read error: size mismatch - + + Completed On + Torrent was completed on 01/01/2010 08:00 + Ολοκληρώθηκε στις - - - TorrentsController - - Not contacted yet - Χωρίς επικοινωνία ακόμα + + Tracker + Ιχνηλάτης - - Updating... - Ενημέρωση… + + Down Limit + i.e: Download limit + Όριο Λήψης - - Working - Σε λειτουργία + + Up Limit + i.e: Upload limit + Όριο Αποστολής - - Not working - Δεν λειτουργεί + + Downloaded + Amount of data downloaded (e.g. in MB) + Ληφθέντα - - Error: '%1' is not a valid torrent file. - Σφάλμα: το '%1' δεν είναι έγκυρο αρχείο torrent. + + Uploaded + Amount of data uploaded (e.g. in MB) + Απεσταλμένα - - - - - Torrent queueing must be enabled - Το torrent queueing gπρέπει να είναι ενεργοποιημένο + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Λήψεις Συνεδρίας - - Save path cannot be empty - + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Αποστολές Συνεδρίας - - - Category cannot be empty - + + Remaining + Amount of data left to download (e.g. in MB) + Απομένουν - - Unable to create category - + + Time Active + Time (duration) the torrent is active (not paused) + Χρόνος εν Ενεργεία - - Unable to edit category - + + Save path + Torrent save path + Διαδρομή αποθήκευσης - - Cannot make save path - + + Completed + Amount of data completed (e.g. in MB) + Ολοκληρωμένα - - Cannot write to directory - + + Ratio Limit + Upload share ratio limit + Όριο Αναλογίας - - WebUI Set location: moving "%1", from "%2" to "%3" - Ρύθμιση τοποθεσίας WebUI: μεταφορά "%1", από "%2" σε "%3" + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Τελευταία Φορά Ολοκλήρωσης - - Incorrect torrent name - Λανθασμένο όνομα torrent + + Last Activity + Time passed since a chunk was downloaded/uploaded + Τελευταία Δραστηριότητα - - - Incorrect category name - Λανθασμένο όνομα κατηγορίας + + Total Size + i.e. Size including unwanted data + Συνολικό Μέγεθος TrackerFiltersList - + All (0) this is for the tracker filter Όλα (0) - + Trackerless (0) Χωρίς Ιχνηλάτη (0) - + Error (0) Σφάλμα (0) - + Warning (0) Προειδοποίηση (0) - - + + Trackerless (%1) Χωρίς Ιχνηλάτη (%1) - - + %1 (%2) + openbittorrent.com (10) + %1 (%2) + + + + Error (%1) Σφάλμα (%1) - - + + Warning (%1) Προειδοποίηση (%1) - + Resume torrents Συνέχιση των torrents - + Pause torrents Παύση των torrents - + Delete torrents Διαγραφή των torrents - - + + All (%1) this is for the tracker filter Όλα (%1) - TrackerListWidget + TrackerList - - - Working - Σε λειτουργία + + URL + URL - - Disabled - Απενεργοποιημένο + + Status + Κατάσταση - - This torrent is private + + Received - - Updating... - Ενημέρωση… - - - - Not working - Δεν λειτουργεί - - - - Not contacted yet - Χωρίς επικοινωνία ακόμα + + Seeds + Διαμοιραστές - - - - - - - N/A - + + Peers + Αποδέκτες - - Tracker editing + + Downloaded - - Tracker URL: - + + Message + Μήνυμα - - - Tracker editing failed - + + + Working + Σε λειτουργία - - The tracker URL entered is invalid. - + + Disabled + Απενεργοποιημένο - - The tracker URL already exists. - + + This torrent is private + Αυτό το torrent είναι ιδιωτικό - - Add a new tracker... - + + Updating... + Ενημέρωση… - - Remove tracker - + + Not working + Δεν λειτουργεί - - Copy tracker URL - + + Not contacted yet + Χωρίς επικοινωνία ακόμα - - Edit selected tracker URL - + + Tracker URL: + URL ιχνηλάτη: - - Force reannounce to selected trackers - + + Tracker editing + Επεξεργασία Ιχνηλατών - - Force reannounce to all trackers - + + + Tracker editing failed + Αποτυχία επεξεργασίας Ιχνηλατών - - URL - + + The tracker URL entered is invalid. + Το URL ιχνηλάτη που δόθηκε είναι άκυρο. - - Status - Κατάσταση + + The tracker URL already exists. + Το URL ιχνηλάτη υπάρχει ήδη. - - Received - + + Add a new tracker... + Προσθήκη νέου ιχνηλάτη… - - Seeds - + + Copy tracker URL + Αντιγραφή URL ιχνηλάτη - - Peers - Διασυνδέσεις + + Edit selected tracker URL + Επεξεργασία URL του επιλεγμένου ιχνηλάτη - - Downloaded - Ληφθέντα + + Force reannounce to selected trackers + Εξαναγκαστική επανανακοίνωση στους επιλεγμένους ιχνηλάτες - - Message - + + Force reannounce to all trackers + Εξαναγκαστική επανανακοίνωση σε όλους τους ιχνηλάτες - - Column visibility - Ορατότητα στήλης + + Remove tracker + Αφαίρεση ιχνηλάτη - TrackerLoginDialog - - - - Tracker authentication - - - - - Tracker: - - - - - Login - Σύνδεση - - - - Username: - Όνομα χρήστη: - + TrackersAdditionDlg - - Password: - Κωδικός: + + Trackers addition dialog + Παράθυρο διαλόγου προσθήκης ιχνηλατών - - Log in - + + List of trackers to add (one per line): + Λίστα ιχνηλατών προς προσθήκη (ένας ανά σειρά): - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + URL λίστας συμβατό με το µTorrent: - - List of trackers to add (one per line): - + + I/O Error + Σφάλμα I/O - - µTorrent compatible list URL: - + + Error while trying to open the downloaded file. + Σφάλμα κατά την προσπάθεια ανοίγματος του ληφθέντος αρχείου. - + No change - + Καμία αλλαγή - + No additional trackers were found. - + Δε βρέθηκαν πρόσθετοι ιχνηλάτες. - + Download error - Σφάλμα λήψης + Σφάλμα λήψης - + The trackers list could not be downloaded, reason: %1 - + Η λίστα ιχνηλατών δεν ήταν δυνατό να ληφθεί, αιτία: %1 TransferListDelegate - + Downloading Γίνεται λήψη - + Downloading metadata used when loading a magnet link Γίνεται λήψη μεταδεδομένων - + Allocating qBittorrent is allocating the files on disk Γίνεται εντοπισμός - + Paused Σε Παύση - + Queued i.e. torrent is queued Σε Ουρά - + Seeding Torrent is complete and in upload-only mode Γίνεται Διαμοιρασμός - + Stalled Torrent is waiting for download to begin Σε Στάση - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [Ε] Γίνεται Λήψη - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [Ε] Γίνεται Διαμοιρασμός - + Checking Torrent local data is being checked Γίνεται Έλεγχος - + Queued for checking i.e. torrent is queued for hash checking Σε ουρά για έλεγχο - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Έλεγχος δεδομένων συνέχισης - + Completed Ολοκληρωμένο - - Moving - Torrent local data are being moved/relocated - Μετακίνηση - - - + Missing Files Λείπουν Αρχεία - - Errored - torrent status, the torrent has an error - Με Σφάλμα - - - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - %1 (διαμοιράστηκε για %2) - - - - %1 ago - e.g.: 1h 20m ago - %1 πριν - - - - TransferListFiltersWidget - - - Status - Κατάσταση - - - - Categories - Κατηγορίες - - - - Tags - Ετικέτες - - - - Trackers - Ιχνηλάτες - - - - TransferListModel - - - Name - i.e: torrent name - Όνομα - - - - Size - i.e: torrent size - Μέγεθος - - - - Done - % Done - - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Κατάσταση - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - Διασυνδέσεις - - - - Down Speed - i.e: Download speed - Ταχύτητα Λήψης - - - - Up Speed - i.e: Upload speed - Ταχύτητα Αποστολής - - - - Ratio - Share ratio - - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - Κατηγορία - - - - Tags - Ετικέτες - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Ληφθέντα - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Απεσταλμένα - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - Απομένουν - - - - Time Active - Time (duration) the torrent is active (not paused) - - - - - Save path - Torrent save path - - - - - Completed - Amount of data completed (e.g. in MB) - Ολοκληρωμένο + + Errored + torrent status, the torrent has an error + Με Σφάλμα - - Ratio Limit - Upload share ratio limit - + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) + %1 (διαμοιράστηκε για %2) - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + %1 ago + e.g.: 1h 20m ago + %1 πριν + + + TransferListFiltersWidget - - Last Activity - Time passed since a chunk was downloaded/uploaded - + + Status + Κατάσταση - - Total Size - i.e. Size including unwanted data - + + Categories + Κατηγορίες + + + + Trackers + Ιχνηλάτες TransferListWidget - + Column visibility Ορατότητα στήλης - + Choose save path Επιλέξτε διαδρομή αποθήκευσης - + Torrent Download Speed Limiting Περιορισμός Ταχύτητας Λήψης torrent - + Torrent Upload Speed Limiting Περιορισμός Ταχύτητας Αποστολής torrent - + Recheck confirmation Επιβεβαίωση επανέλεγχου - + Are you sure you want to recheck the selected torrent(s)? Είστε σίγουροι πως θέλετε να επανελέγξετε τα επιλεγμένα torrent(s); - + Rename Μετονομασία - + New name: Νέο όνομα: - + Resume Resume/start the torrent Συνέχιση - + Force Resume Force Resume/start the torrent Εξαναγκαστική Συνέχιση - + Pause Pause the torrent Παύση - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Ρύθμιση τοποθεσίας: μεταφορά «%1», από «%2» σε «%3» - - - - Add Tags - Προσθήκη ετικετών - - - - Remove All Tags - Αφαίρεση όλων των ετικετών - - - - Remove all tags from selected torrents? - Αφαίρεση όλων των ετικετών από τα επιλεγμένα torrent; + + New Category + Νέα Κατηγορία - - Comma-separated tags: - Ετικέτες χωρισμένες με κόμμα: + + Category: + Κατηγορία: - - Invalid tag - Μη έγκυρη ετικέτα + + Invalid category name + Μη έγκυρο όνομα κατηγορίας - - Tag name: '%1' is invalid - Το όνομα ετικέτας '%1' δεν είναι έγκυρο. + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Το όνομα της κατηγορίας δεν θα πρέπει να περιέχει '\'. +Το όνομα της κατηγορίας δεν θα πρέπει να ξεκινά/τελειώνει με '/'. +Το όνομα της κατηγορίας δεν θα πρέπει να περιέχει αλληλουχία '//'. - + Delete Delete the torrent Διαγραφή - + Preview file... Προεπισκόπηση αρχείου… - + Limit share ratio... Περιορισμός αναλογίας διαμοιρασμού… - + Limit upload rate... Περιορισμός αναλογίας αποστολής… - + Limit download rate... Περιορισμός αναλογίας λήψης… - + Open destination folder Άνοιγμα φακέλου προορισμού - + Move up i.e. move up in the queue Μετακίνηση επάνω - + Move down i.e. Move down in the queue Μετακίνηση κάτω - + Move to top i.e. Move to top of the queue Μετακίνηση στην κορυφή - + Move to bottom i.e. Move to bottom of the queue Μετακίνηση στο τέλος - + Set location... Ρύθμιση τοποθεσίας… - - Force reannounce - Εξαναγκαστική επανανακοίνωση - - - + Copy name Αντιγραφή ονόματος - - Copy hash - Αντιγραφή hash - - - + Download first and last pieces first Λήψη πρώτων και τελευταίων κομματιών πρώτα - + Automatic Torrent Management Αυτόματη Διαχείριση Torrent - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - Η αυτόματη λειτουργία σημαίνει ότι διάφορες ιδιότητες του torrent (π.χ. θέση αποθήκευσης) θα καθοριστούν από την συσχετισμένη κατηγορία. + - + Category Κατηγορία - + New... New category... Νέα... - + Reset Reset category Επαναφορά - - Tags - Ετικέτες - - - - Add... - Add / assign multiple tags... - Προσθήκη... - - - - Remove All - Remove all tags - Κατάργηση όλων - - - + Priority Προτεραιότητα - + Force recheck Εξαναγκαστικός επανέλεγχος - + Copy magnet link Αντιγραφή συνδέσμου magnet - + Super seeding mode Λειτουργία ενισχυμένου διαμοιρασμού - + Rename... Μετονομασία… - + Download in sequential order Λήψη σε διαδοχική σειρά - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + Περιορισμός αναλογίας Αποστολής/Λήψης torrent - - Use global share limit - + + Use global ratio limit + Χρήση ορίου γενικής αναλογίας - - - + + + buttonGroup - + buttonGroup - - Set no share limit - + + Set no ratio limit + Χωρίς όριο αναλογίας - - Set share limit to - + + Set ratio limit to + Ρύθμιση ορίου αναλογίας σε + + + WebApplication - - ratio - + + Incorrect category name + Εσφαλμένο όνομα κατηγορίας + + + + WebUI + + + The Web UI is listening on port %1 + Το UI Ιστού χρησιμοποιεί την θύρα %1 - - minutes - + + Web UI Error - Unable to bind Web UI to port %1 + Σφάλμα UI Ιστού - Αδυναμία δέσμευσης του UI Ιστού στη θύρα %1 + + + about - - No share limit method selected - + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Ένας προηγμένος BitTorrent πελάτης προγραμματισμένος σε C++, βασισμένος στην εργαλειοθήκη Qt και στο libtorrent-rasterbar. - - Please select a limit method first - + + Copyright %1 2006-2016 The qBittorrent project + Πνευματική Ιδιοκτησία %1 2006-2016 Το εγχείρημα qBittorrent + + + + Home Page: + Αρχική Σελίδα: + + + + Forum: + Φόρουμ: + + + + Bug Tracker: + Ιχνηλάτης Σφαλμάτων: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - + + Add Peers + Προσθήκη Διασυνδέσεων - - Python not detected - + + List of peers to add (one per line): + Λίστα διασυνδέσεων προς προσθήκη (μία ανά σειρά): + + + + Format: IPv4:port / [IPv6]:port + Μορφή: IPv4:θύρα / [IPv6]:θύρα - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - Μη αποδεκτός τύπος αρχείου, μόνο κανονικό αρχείο επιτρέπεται. + + + Tracker authentication + Έλεγχος ταυτότητας ιχνηλάτη - - Symlinks inside alternative UI folder are forbidden. - Symlinks μέσα σε εναλλακτικό φάκελο UI απαγορέυονται. + + Tracker: + Ιχνηλάτης: - - Exceeded the maximum allowed file size (%1)! - Υπέρβαση του μέγιστου επιτρεπόμενου μεγέθους αρχείου (%1)! + + Login + Σύνδεση - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - WebUI: Αναντιστοιχία προέλευσης επικεφαλίδας & στόχου προέλευσης! Πηγή IP: '%1'. Πηγή επικεφαλίδας: '%2'. Πηγή στόχου: '%3' + + Username: + Όνομα χρήστη: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - WebUI: Αναντιστοιχία αναφερόμενης επικεφαλίδας & στόχου προέλευσης! Πηγή IP: '%1'. Αναφερόμενη επικεφαλίδα: '%2'. Πηγή στόχου: '%3' + + Password: + Κωδικός Πρόσβασης: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - WebUI: Λανθασμένη επικεφαλίδα host, αναντιστοιχία θυρών. IP προέλευσης αιτήματος: '%1'. Θύρα εξυπηρετητή: '%2'. Επικεφαλίδα ληφθέντος host: '%3' + + Log in + Είσοδος - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - WebUI: Λανθασμένη επικεφαλίδα host, αναντιστοιχία θυρών. IP προέλευσης αιτήματος: '%1'. Θύρα εξυπηρετητή: '%2'. Επικεφαλίδα ληφθέντος host: '%3' + + Cancel + Ακύρωση - WebUI + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + Επιβεβαίωση διαγραφής - qBittorrent + + + + Remember choice + Απομνημόνευση επιλογής + + + + Also delete the files on the hard disk + Να διαγραφούν επίσης τα αρχεία στο σκληρό δίσκο + + + + confirmShutdownDlg + + + Don't show again + Να μην εμφανιστεί ξανά + + + + createTorrentDialog + + + Cancel + Ακύρωση + + + + Torrent Creation Tool + Εργαλείο Δημιουργίας torrent + + + + Torrent file creation + Δημιουργία αρχείου torrent + + + + Add file + Προσθήκη αρχείου + + + + Add folder + Προσθήκη φακέλου + + + + File or folder to add to the torrent: + Αρχείο ή φάκελος για να προστεθεί στο torrent: + + + + Tracker URLs: + URLs Ιχνηλατών: + + + + Web seeds urls: + Urls διαμοιραστών ιστού: + + + + Comment: + Σχόλιο: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Μπορείτε να διαχωρίσετε τα επίπεδα / ομάδες ιχνηλατών με μια κενή γραμμή. + + + + Piece size: + Μέγεθος κομματιού: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + - - Web UI: HTTPS setup successful - Web UI: Διαμόρφωση https επιτυχής + + Auto + Αυτόματα + + + + Private (won't be distributed on DHT network if enabled) + Ιδιωτικό (αν ενεργοποιηθεί, δε θα διανεμηθεί σε δίκτυο DHT) + + + + Start seeding after creation + Εκκίνηση διαμοιρασμού μετά τη δημιουργία + + + + Ignore share ratio limits for this torrent + Παράβλεψη ορίων αναλογίας διαμοιρασμού για αυτό το torrent + + + + Create and save... + Δημιουργία και αποθήκευση… + + + + Progress: + Πρόοδος: + + + + downloadFromURL + + + Add torrent links + Προσθήκη συνδέσμων torrent + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Ένα ανά γραμμή (υποστηρίζονται HTTP σύνδεσμοι, σύνδεσμοι Magnet και info-hashes) + + + + Download + Λήψη + + + + Cancel + Άκυρο + + + + Download from urls + Λήψη από URLs - - Web UI: HTTPS setup failed, fallback to HTTP - Web UI: Διαμόρφωση https ανεπιτυχής, ενεργοποίηση του http + + No URL entered + Δεν έχετε εισάγει URL - - Web UI: Now listening on IP: %1, port: %2 - Web UI: Το Περιβάλλον Χρήστη Ιστού ακούει στο IP: %1, θύρα %2 + + Please type at least one URL. + Παρακαλώ πληκτρολογήστε τουλάχιστον ένα URL. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Web UI: Αδυναμία δέσμευσης στο IP: %1, θύρα: %2. Λόγος: %3 + + Crash info + Πληροφορίες κατάρρευσης fsutils - + + + + + Downloads Λήψεις @@ -9766,100 +8740,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + Δεν ανιχνεύθηκε Python + + + + Python version: %1 + Έκδοση Python: %1 + + + /s per second - + %1h %2m e.g: 3hours 5minutes %1ώ %2λ - + %1d %2h e.g: 2days 10hours %1μ %2ώ - + Unknown Unknown (size) Άγνωστο - + qBittorrent will shutdown the computer now because all downloads are complete. Το qBittorrent θα απενεργοποιήσει τον υπολογιστή τώρα καθώς έχουν ολοκληρωθεί όλες οι λήψεις. - + < 1m < 1 minute < 1λ - + %1m e.g: 10minutes %1λ + + + Working + Λειτουργεί + + + + Updating... + Ενημερώνεται… + + + + Not working + Δεν λειτουργεί + + + + Not contacted yet + Χωρίς επικοινωνία ακόμα + preview - + Preview selection Προεπισκόπηση επιλογής - + The following files support previewing, please select one of them: Τα ακόλουθα αρχεία υποστηρίζουν προεπισκόπηση, παρακαλώ επιλέξτε ένα από αυτά: + + + Preview + Προεπισκόπηση + + + + Cancel + Άκυρο + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_en_AU.ts qbittorrent-3.3.15/src/lang/qbittorrent_en_AU.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_en_AU.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_en_AU.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,156 +1,88 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - About qBittorrent + About qBittorrent - + About - About + About - + Author - Author - - - - Current maintainer - Current maintainer - - - - Greece - Greece + Author - - + + Nationality: - - + + + Name: + Name: + + + + E-mail: - E-mail: + E-mail: - - - Name: - Name: + + Greece + Greece - - Original author - Original author + + Current maintainer + Current maintainer - - France - France + + Original author + Original author - + Special Thanks - + Translators - - License - - - - + Libraries - Libraries + Libraries - + qBittorrent was built with the following libraries: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - - - - - Forum: - + + France + France - - Bug Tracker: + + License - AboutDlg - - About qBittorrent - About qBittorrent - - - About - About - - - Author - Author - - - Name: - Name: - - - E-mail: - E-mail: - - - Greece - Greece - - - Current maintainer - Current maintainer - - - Original author - Original author - - - Libraries - Libraries - - - France - France - - - AddNewTorrentDialog @@ -158,61 +90,67 @@ + + Browse... + + + + Set as default save path - Set as default save path + Set as default save path - + Never show again Never show again - + Torrent settings Torrent settings - + Set as default category - + Category: - + Start torrent Start torrent - + Torrent information - + Skip hash check Skip hash check - + Size: Size: - + Hash: - + Comment: Comment: - + Date: Date: @@ -237,121 +175,89 @@ - - Remember last used save path - - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - + Do not delete .torrent file - - Create subfolder - - - - - Download in sequential order - Download in sequential order - - - - Download first and last pieces first - - - - + Normal Normal - + High High - + Maximum Maximum - + Do not download Do not download - - - + + + I/O Error I/O Error - + Invalid torrent Invalid torrent + + + + Already in download list - Already in download list - - - - Renaming - - - - - - Rename error - + Already in download list - - The name is empty or contains forbidden characters, please choose a different one. - - - - + Not Available This comment is unavailable - + Not Available This date is unavailable - + Not available Not available - + Invalid magnet link Invalid magnet link - + The torrent file '%1' does not exist. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -359,127 +265,128 @@ - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + + + + + Torrent is already in download list. Trackers were merged. + + + + + + Cannot add torrent + + + + + Cannot add this torrent. Perhaps it is already in adding state. + + + + This magnet link was not recognized This magnet link was not recognised - + + Magnet link is already in download list. Trackers were merged. + + + + + Cannot add this torrent. Perhaps it is already in adding. + + + + Magnet link Magnet link - + Retrieving metadata... Retrieving metadata... - + Not Available This size is unavailable. - + Free space on disk: %1 - + + Choose save path Choose save path + Rename the file - Rename the file + Rename the file - + New name: New name: + + The file could not be renamed - The file could not be renamed + The file could not be renamed + This file name contains forbidden characters, please choose a different one. - This file name contains forbidden characters, please choose a different one. - - - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - - - - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + This file name contains forbidden characters, please choose a different one. - - Magnet link is already queued for processing. - - - - - + + This name is already in use in this folder. Please use a different name. This name is already in use in this folder. Please use a different name. - + The folder could not be renamed The folder could not be renamed - + Rename... Rename... - + Priority Priority - + Invalid metadata - + Parsing metadata... Parsing metadata... - + Metadata retrieval complete Metadata retrieval complete - + Download Error @@ -487,320 +394,198 @@ AdvancedSettings + Disk write cache size - Disk write cache size + Disk write cache size - + MiB MiB - + Outgoing ports (Min) [0: Disabled] Outgoing ports (Min) [0: Disabled] - + Outgoing ports (Max) [0: Disabled] Outgoing ports (Max) [0: Disabled] - + Recheck torrents on completion Recheck torrents on completion - + Transfer list refresh interval Transfer list refresh interval - + ms milliseconds ms - + Setting Setting - + Value Value set for this setting Value - - - (disabled) - - - - + (auto) (auto) - - min - minutes - - - - + All addresses - + qBittorrent Section - - + + Open documentation - + libtorrent Section - - Asynchronous I/O threads - - - - - Disk cache - - - - + s seconds s - + Disk cache expiry interval Disk cache expiry interval - + Enable OS cache - - Guided read cache - - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - - - - - - KiB - - - - - Send buffer watermark - - - - - Send buffer low watermark - - - - - Send buffer watermark factor - - - - - Prefer TCP - - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address + + m + minutes - + Resolve peer countries (GeoIP) Resolve peer countries (GeoIP) - + Resolve peer host names Resolve peer host names - + Strict super seeding Strict super seeding - + Network Interface (requires restart) Network Interface (requires restart) - + Optional IP Address to bind to (requires restart) - + Listen on IPv6 address (requires restart) - + Display notifications - + Display notifications for added torrents - + Download tracker's favicon - - Save path history length - - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - - - - - Round-robin - - - - - Fastest upload - - - - - Anti-leech - - - - - Upload choking algorithm - - - - + Confirm torrent recheck - - Confirm removal of all tags - - - - - Always announce to all trackers in a tier - - - - - Always announce to all tiers - + Exchange trackers with other peers + Exchange trackers with other peers + Always announce to all trackers - Always announce to all trackers + Always announce to all trackers - + Any interface i.e. Any network interface Any interface - + Save resume data interval How often the fastresume file is saved. - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - - - - + Maximum number of half-open connections [0: Unlimited] - + IP Address to report to trackers (requires restart) IP Address to report to trackers (requires restart) - + Enable embedded tracker Enable embedded tracker - + Embedded tracker port Embedded tracker port - + Check for software updates Check for software updates - + Use system icon theme Use system icon theme @@ -808,970 +593,732 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started - + Torrent: %1, running external program, command: %2 - - Torrent name: %1 - - - - - Torrent size: %1 - - - - - Save path: %1 - - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - - - - - Thank you for using qBittorrent. - - - - - [qBittorrent] '%1' has finished downloading + + Torrent: %1, run external program command too long (length > %2), execution failed. - + Torrent: %1, sending mail notification - + Information Information - - To control qBittorrent, access the Web UI at %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 - + The Web UI administrator user name is: %1 - + The Web UI administrator password is still the default one: %1 - + This is a security risk, please consider changing your password from program preferences. - + Saving torrent progress... + + + AutomatedRssDownloader + + + Save to: + Save to: + - - Portable mode and explicit profile directory options are mutually exclusive + + RSS Downloader - - Portable mode implies relative fastresume + + Enable Automated RSS Downloader - - - AuthController - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 + + Download Rules - - Your IP address has been banned after too many failed authentication attempts. + + Rule Definition - - WebAPI login success. IP: %1 + + Use Regular Expressions - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - - - - AutomatedRssDownloader - - - Save to: - Save to: - - - - RSS Downloader - - - - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - - - - - Download Rules - - - - - Rule Definition - - - - - Use Regular Expressions - - - - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - - - - - Must Contain: + + Must Contain: - + Must Not Contain: - + Episode Filter: - + Assign Category: - + Save to a Different Directory - + Ignore Subsequent Matches for (0 to Disable) ... X days - + Disabled Disabled - + days - + Add Paused: - + Use global settings - + Always - + Never Never - + Apply Rule to Feeds: - + Matching RSS Articles - + &Import... - + &Export... - + Matches articles based on episode filter. - + Example: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match - + Episode filter rules: - + Season number is a mandatory non-zero value - + Filter must end with semicolon - + Three range types for episodes are supported: - + Single number: <b>1x25;</b> matches episode 25 of season one - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one - + Episode number is a mandatory positive value - - Rules - - - - - Rules (legacy) - - - - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - + Last Match: %1 days ago - + Last Match: Unknown - + New rule name New rule name - + Please type the name of the new download rule. Please type the name of the new download rule. - - + + Rule name conflict Rule name conflict - - + + A rule with this name already exists, please choose another name. A rule with this name already exists, please choose another name. - + Are you sure you want to remove the download rule named '%1'? - + Are you sure you want to remove the selected download rules? Are you sure you want to remove the selected download rules? - + Rule deletion confirmation Rule deletion confirmation - + Destination directory Destination directory - + Invalid action - Invalid action + Invalid action - + The list is empty, there is nothing to export. - The list is empty, there is nothing to export. - - - - Export RSS rules - - - - - Failed to create the destination file. Reason: %1 - - - - - Import RSS rules - - - - - Failed to open the file. Reason: %1 - - - - - Failed to import the selected rules file. Reason: %1 - + The list is empty, there is nothing to export. + Where would you like to save the list? - Where would you like to save the list? + Where would you like to save the list? + Rules list (*.rssrules) - Rules list (*.rssrules) + Rules list (*.rssrules) - - + I/O Error - I/O Error + I/O Error + Failed to create the destination file - Failed to create the destination file + Failed to create the destination file + Please point to the RSS download rules file - Please point to the RSS download rules file + Please point to the RSS download rules file - + + Rules list + + + + Import Error - Import Error + Import Error + Failed to import the selected rules file - Failed to import the selected rules file + Failed to import the selected rules file - + Add new rule... Add new rule... - + Delete rule Delete rule - + Rename rule... Rename rule... - + Delete selected rules Delete selected rules - - Clear downloaded episodes... - - - - + Rule renaming Rule renaming - + Please type the new rule name Please type the new rule name - - Clear downloaded episodes - - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - - - - - - Position %1: %2 - - - + Regex mode: use Perl-like regular expressions - Regex mode: use Perl-like regular expressions + Regex mode: use Perl-like regular expressions - + Wildcard mode: you can use - + ? to match any single character - + * to match zero or more of any characters - + Whitespaces count as AND operators (all words, any order) - + | is used as OR operator - + If word order is important use * instead of whitespace. - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - + will match all articles. - + will exclude all articles. - - - BanListOptions - - Delete - Delete - - - - BanListOptionsDialog - - - List of banned IP addresses - - - - - Ban IP - - - - - Delete - Delete - - - - Warning - - - - - The entered IP address is invalid. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>White-spaces count as AND operators</li></ul> - - The entered IP is already banned. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support - - Could not get GUID of configured network interface. Binding to IP %1 - - - - + Embedded Tracker [ON] - + Failed to start the embedded tracker! - + Embedded Tracker [OFF] - + + '%1' reached the maximum ratio you set. Removing... + + + + + '%1' reached the maximum ratio you set. Pausing... + + + + System network status changed to %1 e.g: System network status changed to ONLINE - + ONLINE - + OFFLINE - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. - - + Encryption support [%1] - - + FORCED - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - - - - - + Anonymous mode [%1] - + Unable to decode '%1' torrent file. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' - + Queue positions were corrected in %1 resume files - + Couldn't save '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - - - - + because %1 is disabled. this peer was blocked because uTP is disabled. - + because %1 is disabled. this peer was blocked because TCP is disabled. - + URL seed lookup failed for URL: '%1', message: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 - + The network interface defined is invalid: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 - - Peer ID: - - - - - HTTP User-Agent is '%1' - - - - - + DHT support [%1] - - - - - - - - - + + + + ON - - - - - - - - - + + + + OFF - - + Local Peer Discovery support [%1] - - PeX support [%1] - - - - - '%1' reached the maximum ratio you set. Removed. - - - - - '%1' reached the maximum ratio you set. Paused. - - - - - '%1' reached the maximum seeding time you set. Removed. - - - - - '%1' reached the maximum seeding time you set. Paused. - - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface - + Tracker '%1' was added to torrent '%2' - + Tracker '%1' was deleted from torrent '%2' - + URL seed '%1' was added to torrent '%2' - + URL seed '%1' was removed from torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Error: Failed to parse the provided IP filter. - - '%1' restored. - 'torrent name' restored. + + Couldn't add torrent. Reason: %1 - - Couldn't add torrent. Reason: %1 + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) - + '%1' added to download list. 'torrent name' was added to download list. - + An I/O error occurred, '%1' paused. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 - + due to IP filter. this peer was blocked due to ip filter. - + due to port filter. this peer was blocked due to port filter. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. - + because it has a low port. this peer was blocked because it has a low port. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 - + External IP: %1 e.g. External IP: 192.168.0.1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + File sizes mismatch for torrent '%1', pausing it. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... @@ -1779,17 +1326,17 @@ CategoryFilterModel - + Categories - + All - + Uncategorized @@ -1808,34 +1355,67 @@ - Edit category... - - - - Remove category - + Remove unused categories - + Resume torrents - + Pause torrents - + Delete torrents + + + New Category + + + + + Category: + + + + + Invalid category name + + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + CookiesDialog @@ -1874,82 +1454,34 @@ - DeletionConfirmationDialog - - - Deletion confirmation - - + DeletionConfirmationDlg - - Remember choice - Remember choice - - - - Also delete the files on the hard disk - Also delete the files on the hard disk - - - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - Add torrent links - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - Download - - - - No URL entered - No URL entered - - - - Please type at least one URL. - Please type at least one URL. - - - DownloadedPiecesBar - + White: Missing pieces - + Green: Partial pieces - + Blue: Completed pieces @@ -1957,34 +1489,23 @@ ExecutionLog + General - General + General + Blocked IPs - Blocked IPs - - - - ExecutionLogWidget - - - General - General + Blocked IPs - - Blocked IPs - Blocked IPs - - - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> was banned x.y.z.w was banned @@ -1993,116 +1514,41 @@ FeedListWidget - + RSS feeds RSS feeds - - - Unread (%1) - - - + Unread - Unread + Unread FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - - - - - &Browse... - Launch file dialog button text (full) - - - - - Choose a file - Caption for file open/save dialog - - - - - Choose a folder - Caption for directory open dialog - - - - - Any file + + An error occured while trying to open the log file. Logging to file is disabled. FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - - - - - - - IP filter line %1 is malformed. - - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - - - - - - IP filter exception thrown for line %1. Exception is: %2 - - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. + + + + I/O Error: Could not open ip filter file in read mode. - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. @@ -2110,455 +1556,472 @@ GeoIPDatabase - - + + Unsupported database file size. - + Metadata error: '%1' entry not found. - + Metadata error: '%1' entry has invalid type. - + Unsupported database version: %1.%2 - + Unsupported IP version: %1 - + Unsupported record size: %1 - + Invalid database type: %1 - + Database corrupted: no data section found. - Http::Connection - - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - - - - - Bad Http request, closing socket. IP: %s - - - - HttpServer + File - File + File + Edit - Edit + Edit + Help - Help + Help - + Exit qBittorrent - + Only one link per line Only one link per line + Download - Download + Download - + Global upload rate limit must be greater than 0 or disabled. - + Global download rate limit must be greater than 0 or disabled. - + Alternative upload rate limit must be greater than 0 or disabled. - + Alternative download rate limit must be greater than 0 or disabled. - + Maximum active downloads must be greater than -1. - + Maximum active uploads must be greater than -1. - + Maximum active torrents must be greater than -1. - + Maximum number of connections limit must be greater than 0 or disabled. Maximum number of connections limit must be greater than 0 or disabled. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Maximum number of connections per torrent limit must be greater than 0 or disabled. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Maximum number of upload slots per torrent limit must be greater than 0 or disabled. - + Unable to save program preferences, qBittorrent is probably unreachable. Unable to save program preferences, qBittorrent is probably unreachable. - - IRC: #qbittorrent on Freenode - + + Language + Language - - Invalid category name: -Please do not use any special characters in the category name. + + The port used for incoming connections must be between 1 and 65535. - - Unknown - Unknown + + The port used for the Web UI must be between 1 and 65535. + - - Hard Disk + + Unable to log in, qBittorrent is probably unreachable. - - Share ratio limit must be between 0 and 9998. + + Invalid Username or Password. - - Seeding time limit must be between 0 and 525600 minutes. + + Password - Language - Language + + Login + Login - - The port used for incoming connections must be between 1 and 65535. + + Upload Failed! - - The port used for the Web UI must be between 1 and 65535. + + Original authors - - Unable to log in, qBittorrent is probably unreachable. + + Upload limit: - - Invalid Username or Password. + + Download limit: - - Username + + Apply - - Password + + Add - - Login - Login + + Category: + - - Original authors + + Upload Torrents + Upload torrent files to qBittorent using WebUI - - Apply + + All - - Add + + Downloading + Downloading + + + + Seeding + Seeding + + + + Completed - - Upload Torrents - Upload torrent files to qBittorent using WebUI + + Resumed - Downloading - Downloading + + Paused + Paused - Seeding - Seeding + + Active + - Paused - Paused + + Inactive + - + Save files to location: - + Cookie: - + Type folder here - + + Run an external program on torrent completion + + + + + Enable bandwidth management (uTP) + + + + + Apply rate limit to uTP connections + + + + + Alternative Global Rate Limits + + + + More information - + Information about certificates - + Save Files to - - Set location + + Watch Folder - - Limit upload rate + + Default Folder - - Limit download rate + + from + from time1 to time2 - - Rename torrent + + to + from time1 to time2 - - Unable to create category + + Other... + Save Files to: Watch Folder / Default Folder / Other... - - Other... - Save Files to: Watch Folder / Default Folder / Other... + + Every day + Schedule the use of alternative rate limits on ... - + + Week days + Schedule the use of alternative rate limits on ... + + + + + Week ends + Schedule the use of alternative rate limits on ... + + + + Monday Schedule the use of alternative rate limits on ... - + Tuesday Schedule the use of alternative rate limits on ... - + Wednesday Schedule the use of alternative rate limits on ... - + Thursday Schedule the use of alternative rate limits on ... - + Friday Schedule the use of alternative rate limits on ... - + Saturday Schedule the use of alternative rate limits on ... - + Sunday Schedule the use of alternative rate limits on ... + Downloaded Is the file downloaded or not? - Downloaded + Downloaded - + Logout - + + Download from URLs + + + + Download Torrents from their URLs or Magnet links - + Upload local torrent - + Are you sure you want to delete the selected torrents from the transfer list? - + Save Save - + qBittorrent client is not reachable qBittorrent client is not reachable + HTTP Server - HTTP Server + HTTP Server + The following parameters are supported: - The following parameters are supported: + The following parameters are supported: + Torrent path - Torrent path + Torrent path + Torrent name - Torrent name + Torrent name - + qBittorrent has been shutdown. qBittorrent has been shutdown. - IPSubnetWhitelistOptionsDialog + LineEdit - - List of whitelisted IP subnets - + + Clear the text + Clear the text + + + LogListWidget - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - + + Copy + Copy - - Add subnet - - - - - Delete - Delete - - - - Error - - - - - The entered subnet is invalid. - - - - - LineEdit - - Clear the text - Clear the text - - - - LogListWidget - - Copy - Copy - - - Clear Clear @@ -2591,550 +2054,491 @@ - + &View &View - + &Options... &Options... - + &Resume &Resume - + Torrent &Creator - + Set Upload Limit... - + Set Download Limit... - + Set Global Download Limit... - + Set Global Upload Limit... - + Minimum Priority - + Top Priority - + Decrease Priority - + Increase Priority - - + + Alternative Speed Limits - + &Top Toolbar - + Display Top Toolbar - - Status &Bar - - - - + S&peed in Title Bar - + Show Transfer Speed in Title Bar - + &RSS Reader - + Search &Engine - + L&ock qBittorrent - + Do&nate! - - Close Window - - - - + R&esume All R&esume All - + Manage Cookies... - + Manage stored network cookies - + Normal Messages - + Information Messages - + Warning Messages - + Critical Messages - + &Log - + &Exit qBittorrent - + &Suspend System - + &Hibernate System - + S&hutdown System - + &Disabled - + &Statistics - + Check for Updates - + Check for Program Updates - + &About &About - + &Pause &Pause - + &Delete &Delete - + P&ause All P&ause All - + &Add Torrent File... - + Open - + E&xit - + Open URL - + &Documentation &Documentation - + Lock - - - + + + Show Show - + Check for program updates - + Add Torrent &Link... - + If you like qBittorrent, please donate! If you like qBittorrent, please donate! - - + Execution Log Execution Log - + Clear the password Clear the password - + Filter torrent list... - + &Set Password - - Preferences - - - - + &Clear Password - + Transfers Transfers - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Torrent file association - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? - + Icons Only - + Text Only - + Text Alongside Icons - + Text Under Icons - + Follow System Style - - - + + + UI lock password UI lock password - - - + + + Please type the UI lock password: Please type the UI lock password: - + The password should contain at least 3 characters The password should contain at least 3 characters - + Password update Password update - + The UI lock password has been successfully updated The UI lock password has been successfully updated - + Are you sure you want to clear the password? Are you sure you want to clear the password? - - Use regular expressions - - - - + Search Search - + Transfers (%1) Transfers (%1) - + Error - + Failed to add torrent: %1 - + Torrent added - + '%1' was added. e.g: xxx.avi was added. - + Download completion Download completion - + I/O Error i.e: Input/Output Error I/O Error - + Recursive download confirmation Recursive download confirmation - + Yes Yes - + No No - + Never Never - + Global Upload Speed Limit Global Upload Speed Limit - + Global Download Speed Limit Global Download Speed Limit - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent was just updated and needs to be restarted for the changes to be effective. - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - - - - - Are you sure you want to quit qBittorrent? - - - - + &No &No - + &Yes &Yes - + &Always Yes - - %1/s - s is a shorthand for seconds - - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - + qBittorrent Update Available - + + A new version is available. +Do you want to download %1? + + + + Already Using the Latest qBittorrent Version - + Undetermined Python version - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -3142,165 +2546,151 @@ - + The torrent '%1' contains torrent files, do you want to proceed with their download? - + Couldn't download file at URL '%1', reason: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - - + + Couldn't determine your Python version (%1). Search engine disabled. + + + + + Missing Python Interpreter - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? - + Python is required to use the search engine but it does not seem to be installed. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. - + &Check for Updates - Manual change of rate limits mode. The scheduler is disabled. - Manual change of rate limits mode. The scheduler is disabled. - - - + Checking for Updates... - + Already checking for program updates in the background - + Python found in '%1' - + Download error Download error - + Python setup could not be downloaded, reason: %1. Please install it manually. - - + + Invalid password Invalid password - - - + + RSS (%1) - + URL download error - + The password is invalid The password is invalid - - + + DL speed: %1 e.g: Download speed: 10 KiB/s - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version - + Hide Hide - + Exiting qBittorrent Exiting qBittorrent + Some files are currently transferring. Are you sure you want to quit qBittorrent? - Some files are currently transferring. + Some files are currently transferring. Are you sure you want to quit qBittorrent? - + Open Torrent Files Open Torrent Files - + Torrent Files Torrent Files - + Options were saved successfully. Options were saved successfully. @@ -3308,52 +2698,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. - + Dynamic DNS error: hostname supplied does not exist under specified account. - + Dynamic DNS error: Invalid username/password. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. - + Dynamic DNS error: supplied domain name is invalid. - + Dynamic DNS error: supplied username is too short. - + Dynamic DNS error: supplied password is too short. @@ -3361,1413 +2751,1303 @@ Net::DownloadHandler - + I/O Error I/O Error - + The file size is %1. It exceeds the download limit of %2. - + Unexpected redirect to magnet URI. - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. - - + + Couldn't load GeoIP database. Reason: %1 - + Venezuela, Bolivarian Republic of - + Viet Nam - - + + N/A - + Andorra - + United Arab Emirates - + Afghanistan - + Antigua and Barbuda - + Anguilla - + Albania - + Armenia - + Angola - + Antarctica - + Argentina - + American Samoa - + Austria - + Australia - + Aruba - + Azerbaijan - + Bosnia and Herzegovina - + Barbados - + Bangladesh - + Belgium - + Burkina Faso - + Bulgaria - + Bahrain - + Burundi - + Benin - + Bermuda - + Brunei Darussalam - + Brazil - + Bahamas - + Bhutan - + Bouvet Island - + Botswana - + Belarus - + Belize - + Canada - + Cocos (Keeling) Islands - + Congo, The Democratic Republic of the - + Central African Republic - + Congo - + Switzerland - + Cook Islands - + Chile - + Cameroon - + China - + Colombia - + Costa Rica - + Cuba - + Cape Verde - + Curacao - + Christmas Island - + Cyprus - + Czech Republic - + Germany - + Djibouti - + Denmark - + Dominica - + Dominican Republic - + Algeria - + Ecuador - + Estonia - + Egypt - + Western Sahara - + Eritrea - + Spain - + Ethiopia - + Finland - + Fiji - + Falkland Islands (Malvinas) - + Micronesia, Federated States of - + Faroe Islands - + France France - + Gabon - + United Kingdom - + Grenada - + Georgia - + French Guiana - + Ghana - + Gibraltar - + Greenland - + Gambia - + Guinea - + Guadeloupe - + Equatorial Guinea - + Greece Greece - + South Georgia and the South Sandwich Islands - + Guatemala - + Guam - + Guinea-Bissau - + Guyana - + Hong Kong - + Heard Island and McDonald Islands - + Honduras - + Croatia - + Haiti - + Hungary - + Indonesia - + Ireland - + Israel - + India - + British Indian Ocean Territory - + Iraq - + Iran, Islamic Republic of - + Iceland - + Italy - + Jamaica - + Jordan - + Japan - + Kenya - + Kyrgyzstan - + Cambodia - + Kiribati - + Comoros - + Saint Kitts and Nevis - + Korea, Democratic People's Republic of - + Korea, Republic of - + Kuwait - + Cayman Islands - + Kazakhstan - + Lao People's Democratic Republic - + Lebanon - + Saint Lucia - + Liechtenstein - + Sri Lanka - + Liberia - + Lesotho - + Lithuania - + Luxembourg - + Latvia - + Morocco - + Monaco - + Moldova, Republic of - + Madagascar - + Marshall Islands - + Mali - + Myanmar - + Mongolia - + Northern Mariana Islands - + Martinique - + Mauritania - + Montserrat - + Malta - + Mauritius - + Maldives - + Malawi - + Mexico - + Malaysia - + Mozambique - + Namibia - + New Caledonia - + Niger - + Norfolk Island - + Nigeria - + Nicaragua - + Netherlands - + Norway - + Nepal - + Nauru - + Niue - + New Zealand - + Oman - + Panama - + Peru - + French Polynesia - + Papua New Guinea - + Philippines - + Pakistan - + Poland - + Saint Pierre and Miquelon - + Puerto Rico - + Portugal - + Palau - + Paraguay - + Qatar - + Reunion - + Romania - + Russian Federation - + Rwanda - + Saudi Arabia - + Solomon Islands - + Seychelles - + Sudan - + Sweden - + Singapore - + Slovenia - + Svalbard and Jan Mayen - + Slovakia - + Sierra Leone - + San Marino - + Senegal - + Somalia - + Suriname - + Sao Tome and Principe - + El Salvador - + Syrian Arab Republic - + Swaziland - + Turks and Caicos Islands - + Chad - + French Southern Territories - + Togo - + Thailand - + Tajikistan - + Tokelau - + Turkmenistan - + Tunisia - + Tonga - - Could not decompress GeoIP database file. - - - - + Timor-Leste - + Bolivia, Plurinational State of - + Bonaire, Sint Eustatius and Saba - + Cote d'Ivoire - + Libya - + Saint Martin (French part) - + Macedonia, The Former Yugoslav Republic of - + Macao - + Pitcairn - + Palestine, State of - + Saint Helena, Ascension and Tristan da Cunha - + South Sudan - + Sint Maarten (Dutch part) - + Turkey - + Trinidad and Tobago - + Tuvalu - + Taiwan - + Tanzania, United Republic of - + Ukraine - + Uganda - + United States Minor Outlying Islands - + United States - + Uruguay - + Uzbekistan - + Holy See (Vatican City State) - + Saint Vincent and the Grenadines - + Virgin Islands, British - + Virgin Islands, U.S. - + Vanuatu - + Wallis and Futuna - + Samoa - + Yemen - + Mayotte - + Serbia - + South Africa - + Zambia - + Montenegro - + Zimbabwe - + Aland Islands - + Guernsey - + Isle of Man - + Jersey - + Saint Barthelemy - + + Could not uncompress GeoIP database file. + + + + Couldn't save downloaded GeoIP database file. - + Successfully updated GeoIP database. - + Couldn't download GeoIP database file. Reason: %1 @@ -4775,12 +4055,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] - + UPnP / NAT-PMP support [OFF] @@ -4788,7 +4068,7 @@ Net::Smtp - + Email Notification Error: @@ -4796,1277 +4076,1077 @@ OptionsDialog - + Options - + Behavior - + Downloads Downloads - + Connection Connection - + Speed - + BitTorrent - - RSS - - - - + Web UI - + Advanced - + Language Language - + User Interface Language: - + (Requires restart) - + Transfer List - + Confirm when deleting torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. - + Hide zero and infinity values - + Always - + Paused torrents only - + Action on double-click - + Downloading torrents: - - + + Start / Stop Torrent - - + + Open destination folder Open destination folder - - + + No action - + Completed torrents: - + Desktop - + Start qBittorrent on Windows start up - + Show splash screen on start up - + Start qBittorrent minimized - + Confirmation on exit when torrents are active - + Confirmation on auto-exit when downloads finish - - KiB + + Show qBittorrent in notification area - - Email notification &upon download completion + + Minimize qBittorrent to notification area - - Run e&xternal program on torrent completion + + Close qBittorrent to notification area + i.e: The systray tray icon will still be visible when closing the main window. - - IP Fi&ltering + + Tray icon style: - - Schedule &the use of alternative rate limits - + + Normal + Normal - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + + Monochrome (Dark theme) - - &Torrent Queueing + + Monochrome (Light theme) - - Seed torrents until their seeding time reaches + + File association - - A&utomatically add these trackers to new downloads: + + Use qBittorrent for .torrent files - - RSS Reader + + Use qBittorrent for magnet links - - Enable fetching RSS feeds + + Power Management - - Feeds refresh interval: + + Inhibit system sleep when torrents are active - - Maximum number of articles per feed: - Maximum number of articles per feed: + + Log file + - - - min - minutes + + Save path: - - RSS Torrent Auto Downloader + + Backup the log file after: - - Enable auto downloading of RSS torrents + + MB - - Edit auto downloading rules... + + Delete backup logs older than: - - Web User Interface (Remote control) + + days + Delete backup logs older than 10 months - - IP address: + + months + Delete backup logs older than 10 months - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. + + years + Delete backup logs older than 10 years - - Server domains: + + When adding a torrent - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. + + Display torrent content and some options - - &Use HTTPS instead of HTTP + + Bring torrent dialog to the front - - Bypass authentication for clients on localhost + + Do not start the download automatically + The torrent will be added to download list in pause state - - Bypass authentication for clients in whitelisted IP subnets + + Should the .torrent file be deleted after adding it - - IP subnet whitelist... + + Delete .torrent files afterwards - - Upda&te my dynamic domain name + + Also delete .torrent files whose addition was cancelled - - Minimize qBittorrent to notification area + + Also when addition is cancelled - - Close qBittorrent to notification area - i.e: The systray tray icon will still be visible when closing the main window. + + Warning! Data loss possible! - - Tray icon style: + + Saving Management - - Normal - Normal + + Default Torrent Management Mode: + - - Monochrome (Dark theme) + + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - - Monochrome (Light theme) + + Manual - - File association + + Automatic - - Use qBittorrent for .torrent files + + When Torrent Category changed: - - Use qBittorrent for magnet links + + Relocate torrent - - Power Management + + Switch torrent to Manual Mode - - Save path: + + When Default Save Path changed: - - Backup the log file after: + + + Relocate affected torrents - - Delete backup logs older than: + + + Switch affected torrents to Manual Mode - - days - Delete backup logs older than 10 months + + When Category changed: - - months - Delete backup logs older than 10 months + + Use Subcategories - - years - Delete backup logs older than 10 years - - - - - When adding a torrent - - - - - Bring torrent dialog to the front - - - - - Do not start the download automatically - The torrent will be added to download list in pause state - - - - - Should the .torrent file be deleted after adding it - - - - - Also delete .torrent files whose addition was cancelled - - - - - Also when addition is cancelled - - - - - Warning! Data loss possible! - - - - - Saving Management - - - - - Default Torrent Management Mode: - - - - - Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - - - - - Manual - - - - - Automatic - - - - - When Torrent Category changed: - - - - - Relocate torrent - - - - - Switch torrent to Manual Mode - - - - - When Default Save Path changed: - - - - - - Relocate affected torrents - - - - - - Switch affected torrents to Manual Mode - - - - - When Category changed: - - - - - Use Subcategories - - - - + Default Save Path: - + Keep incomplete torrents in: - + Copy .torrent files to: - - Show &qBittorrent in notification area - - - - - &Log file - - - - - Display &torrent content and some options - - - - - Create subfolder for torrents with multiple files - - - - - De&lete .torrent files afterwards - - - - + Copy .torrent files for finished downloads to: - + Pre-allocate disk space for all files - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding + + Append .!qB extension to incomplete files - - Append .!qB extension to incomplete files + + Automatically add torrents from: - - Enable recursive download dialog + + Add entry - - Automatically add torrents from: + + Remove entry - - Add entry + + Email notification upon download completion - - Remove entry + + Destination email: - + SMTP server: - + This server requires a secure connection (SSL) - - + + + Authentication - - - - + + + + Username: Username: - - - - + + + + Password: Password: - - Enabled protocol: + + Run external program on torrent completion - - TCP and μTP - - - - + Listening Port - + Port used for incoming connections: - + Random - + Use UPnP / NAT-PMP port forwarding from my router - + Use different port on each startup - + Connections Limits - + Maximum number of connections per torrent: - + Global maximum number of connections: - + Maximum number of upload slots per torrent: - + Global maximum number of upload slots: - + Proxy Server - + Type: - + (None) - + SOCKS4 - + SOCKS5 - + HTTP - + Host: - - + + Port: - + Otherwise, the proxy server is only used for tracker connections - + Use proxy for peer connections - + Disable connections not supported by proxies - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - + Use proxy only for torrents - - A&uthentication + + Info: The password is saved unencrypted - - Info: The password is saved unencrypted + + IP Filtering - + Filter path (.dat, .p2p, .p2b): - + Reload the filter - - Manually banned IP addresses... - - - - + Apply to trackers - + Global Rate Limits - - - - - - - KiB/s - - - - - + + Upload: + + + + KiB/s - KiB/s + KiB/s - - + + Download: - + Alternative Rate Limits - - + + Schedule the use of alternative rate limits + + + + From: from (time1 to time2) - - + To: time1 to time2 - + When: - + Every day - + Weekdays - + Weekends - + Rate Limits Settings - + Apply rate limit to peers on LAN - + Apply rate limit to transport overhead - - + + + Enable µTP protocol + + + + Apply rate limit to µTP protocol - + Privacy - + Enable DHT (decentralized network) to find more peers - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers - + Look for peers on your local network - + Enable Local Peer Discovery to find more peers - + Encryption mode: - + Prefer encryption - + Require encryption - + Disable encryption - + Enable when using a proxy or a VPN connection - + Enable anonymous mode - - Maximum active downloads: - - - - - Maximum active uploads: - - - - - Maximum active torrents: + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - Do not count slow torrents in these limits + + Torrent Queueing - - Upload rate threshold: + + Maximum active downloads: - - Download rate threshold: + + Maximum active uploads: - - sec - seconds + + Maximum active torrents: - - Torrent inactivity timer: + + Do not count slow torrents in these limits - + Share Ratio Limiting - + Seed torrents until their ratio reaches - + then - + Pause them - + Remove them - - RSS Smart Episode Filters + + Automatically add these trackers to new downloads: - - Use UPnP / NAT-PMP to forward the port from my router + + Enable Web User Interface (Remote control) - - Certificate: + + Use UPnP / NAT-PMP to forward the port from my router - - Import SSL Certificate + + Use HTTPS instead of HTTP - - Key: + + Certificate: - - Import SSL Key + + Import SSL Certificate - - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> + + Key: - - Use alternative Web UI + + Import SSL Key - - Files location: + + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - - Enable clickjacking protection + + Bypass authentication for localhost - - Enable Cross-Site Request Forgery (CSRF) protection + + Update my dynamic domain name - + Service: - + Register - + Domain name: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): - + %N: Torrent name - + %L: Category - - %G: Tags (seperated by comma) - - - - + %F: Content path (same as root path for multifile torrent) - + %R: Root path (first torrent subdirectory path) - + %D: Save path - + %C: Number of files - + %Z: Torrent size (bytes) - + %T: Current tracker - + %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor - + Folder is already being monitored: - + Folder does not exist: - + Folder is not readable: - + Adding entry failed - - - - + + Choose export directory - - - + + + + + + Choose a save directory - + Choose an IP filter file - + All supported filters - + SSL Certificate - + + SSL Key + + + + Parsing error - + Failed to parse the provided IP filter - + Successfully refreshed - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Invalid key - + This is not a valid SSL key. - + Invalid certificate - - Preferences - - - - - Import SSL certificate - - - - + This is not a valid SSL certificate. - - Import SSL key - - - - - SSL key - - - - + Time Error - + The start time and the end time can't be the same. - - + + Length Error - + The Web UI username must be at least 3 characters long. - + The Web UI password must be at least 6 characters long. @@ -6074,72 +5154,72 @@ PeerInfo - - Interested(local) and Choked(peer) + + interested(local) and choked(peer) - + interested(local) and unchoked(peer) - + interested(peer) and choked(local) - + interested(peer) and unchoked(local) - + optimistic unchoke - + peer snubbed - + incoming connection - + not interested(local) and unchoked(peer) - + not interested(peer) and unchoked(local) - + peer from PEX - + peer from DHT - + encrypted traffic - + encrypted handshake - + peer from LSD @@ -6147,180 +5227,165 @@ PeerListWidget - + IP IP - + Port - + Flags Flags - + Connection Connection - + Client i.e.: Client application Client - + Progress i.e: % downloaded Progress - + Down Speed i.e: Download speed Down Speed - + Up Speed i.e: Upload speed Up Speed - + Downloaded i.e: total data downloaded Downloaded - + Uploaded i.e: total data uploaded Uploaded - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. - + Files i.e. files that are being downloaded right now - + Column visibility Column visibility - + Add a new peer... Add a new peer... - - + + Ban peer permanently Ban peer permanently - + Manually adding peer '%1'... - + The peer '%1' could not be added to this torrent. - + Manually banning peer '%1'... - - + + Peer addition Peer addition - + Country - + Copy IP:port - + Some peers could not be added. Check the Log for details. - + The peers were added to this torrent. - + Are you sure you want to ban permanently the selected peers? Are you sure you want to ban permanently the selected peers? - + &Yes &Yes - + &No &No - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - + PeersAdditionDlg - + No peer entered - + Please type at least one peer. - + Invalid peer - + The peer '%1' is invalid. @@ -6328,12 +5393,12 @@ PieceAvailabilityBar - + White: Unavailable pieces - + Blue: Available pieces @@ -6341,374 +5406,288 @@ PiecesBar - + Files in this piece: - + File in this piece - + File in these pieces - - Wait until metadata become available to see detailed information - - - - + Hold Shift key for detailed information - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Installed search plugins: - + Name Name - + Version - + Url - - + + Enabled - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Check for updates - + Close - + Uninstall - - - + + + Yes Yes - - - - + + + + No No - + Uninstall warning - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Uninstall success - + All selected plugins were uninstalled successfully - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - - - - - + + New search engine plugin URL - - + + URL: - + Invalid link - + The link doesn't seem to point to a search engine plugin. - + Select search plugins - + qBittorrent search plugin - + + + + Search plugin update + + + + All your plugins are already up to date. - + Sorry, couldn't check for plugin updates. %1 - + + + Search plugin install - - Couldn't install "%1" search engine plugin. %2 + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine - - Couldn't update "%1" search engine plugin. %2 + + Couldn't install "%1" search engine plugin. %2 - - - PluginSelectDlg - - Name - Name - - Yes - Yes + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + - No - No + + Couldn't update "%1" search engine plugin. %2 + - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Search plugin source: - + Local file - + Web link - PowerManagement + PreviewSelect - - qBittorrent is active - - - - - PreviewSelect - - Name - Name - - - Size - Size - - - Progress - Progress - - - Preview impossible - Preview impossible - - - Sorry, we can't preview this file - Sorry, we can't preview this file - - - - PreviewSelectDialog - - - Preview - Preview - - - + Name - Name + Name - + Size - Size + Size - + Progress - Progress + Progress - - + + Preview impossible - Preview impossible + Preview impossible - - + + Sorry, we can't preview this file - Sorry, we can't preview this file - - - - Private::FileLineEdit - - - '%1' does not exist - - - - - '%1' does not point to a directory - - - - - '%1' does not point to a file - - - - - Does not have read permission in '%1' - - - - - Does not have write permission in '%1' - + Sorry, we can't preview this file PropListDelegate - + Not downloaded Not downloaded - - + + Normal Normal (priority) Normal - - N/A - - - - + Do not download Do not download (priority) Do not download - - + + High High (priority) High - + Mixed Mixed (priorities Mixed - - + + Maximum Maximum (priority) Maximum @@ -6717,32 +5696,32 @@ PropTabBar - + General General - + Trackers Trackers - + Peers Peers - + HTTP Sources HTTP Sources - + Content Content - + Speed @@ -6836,22 +5815,22 @@ Comment: - + Select All Select All - + Select None Select None - + Normal Normal - + High High @@ -6911,177 +5890,165 @@ - + Maximum Maximum + - Do not download Do not download - + Never Never - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) - - + + %1 (%2 this session) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) - + Open - + Open Containing Folder - + Rename... Rename... - + Priority Priority - + New Web seed New Web seed - + Remove Web seed Remove Web seed - + Copy Web seed URL Copy Web seed URL - + Edit Web seed URL Edit Web seed URL + Rename the file - Rename the file + Rename the file - + New name: New name: + + The file could not be renamed - The file could not be renamed + The file could not be renamed + This file name contains forbidden characters, please choose a different one. - This file name contains forbidden characters, please choose a different one. + This file name contains forbidden characters, please choose a different one. - - + + This name is already in use in this folder. Please use a different name. This name is already in use in this folder. Please use a different name. - + The folder could not be renamed The folder could not be renamed - + qBittorrent qBittorrent - + Filter files... - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - - - - + New URL seed New HTTP source - + New URL seed: - - + + This URL seed is already in the list. - + Web seed editing Web seed editing - + Web seed URL: Web seed URL: @@ -7089,1291 +6056,1056 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + + + + + Error: '%1' is not a valid torrent file. + + + + + + Error: Could not add torrent to session. + + + + + I/O Error: Could not create temporary file. + + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. - - + + %1 must be the single command line parameter. - + + %1 must specify the correct port (1 to 65535). + + + + You cannot use %1: qBittorrent is already running for this user. - + Usage: - + Options: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' + + Displays program version - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' + + Displays this help message - - Expected integer number in environment variable '%1', but got '%2' + + Changes the Web UI port (current: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' + + Disable splash screen - - Expected %1 in environment variable '%2', but got '%3' + + Run in daemon-mode (background) - - port + + Downloads the torrents passed by the user - - %1 must specify a valid port (1 to 65535). - + + Help + Help - - Display program version and exit + + Run application with -h option to read about command line parameters. - - Display this help message and exit + + Bad command line - - Change the Web UI port + + Bad command line: - - Disable splash screen + + Legal Notice - - Run in daemon-mode (background) + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. - - dir - Use appropriate short form or abbreviation of "directory" + + Press %1 key to accept and continue... - - Store configuration files in <dir> + + Legal notice - - - name + + Cancel + Cancel + + + + I Agree - - Store configuration files in directories qBittorrent_<name> + + Torrent name: %1 - - Hack into libtorrent fastresume files and make file paths relative to the profile directory + + Torrent size: %1 - - files or URLs + + Save path: %1 - - Download the torrents passed by the user + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. + + Thank you for using qBittorrent. - - Options when adding new torrents: + + [qBittorrent] '%1' has finished downloading - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume + + The remote host name was not found (invalid hostname) - - path + + The operation was canceled - - Torrent save path + + The remote server closed the connection prematurely, before the entire reply was received and processed - - Add torrents as started or paused + + The connection to the remote server timed out - - Skip hash check - Skip hash check + + SSL/TLS handshake failed + - - Assign torrents to category. If the category doesn't exist, it will be created. + + The remote server refused the connection - - Download files in sequential order + + The connection to the proxy server was refused - - Download first and last pieces first + + The proxy server closed the connection prematurely - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: + + The proxy host name was not found - - Command line parameters take precedence over environment variables + + The connection to the proxy timed out or the proxy did not reply in time to the request sent - - Help - Help + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + - - Run application with -h option to read about command line parameters. + + The access to the remote content was denied (401) - - Bad command line + + The operation requested on the remote content is not permitted - - Bad command line: + + The remote content was not found at the server (404) - - Legal Notice + + The remote server requires authentication to serve the content but the credentials provided were not accepted - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + + The Network Access API cannot honor the request because the protocol is not known - - No further notices will be issued. + + The requested operation is invalid for this protocol - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. + + An unknown network-related error was detected - - Press %1 key to accept and continue... + + An unknown proxy-related error was detected - - Legal notice + + An unknown error related to the remote content was detected - - Cancel - Cancel + + A breakdown in protocol was detected + - - I Agree + + Unknown error - - + + Upgrade - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - + Couldn't migrate torrent with hash: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 + + Detected unclean program exit. Using fallback file to restore settings. - + An access error occurred while trying to write the configuration file. - + A format error occurred while trying to write the configuration file. - - - An unknown error occurred while trying to write the configuration file. - - RSS + Search - Search + Search + New subscription - New subscription + New subscription + + + Mark items read - Mark items read + Mark items read + Update all - Update all + Update all + RSS Downloader... - RSS Downloader... + RSS Downloader... + Settings... - Settings... + Settings... + + Torrents: (double-click to download) + + + + + Delete - Delete + Delete + Rename... - Rename... + Rename... + Rename - Rename + Rename + + Update - Update + Update + New subscription... - New subscription... + New subscription... + + Update all feeds - Update all feeds + Update all feeds + Download torrent - Download torrent + Download torrent + Open news URL - Open news URL + Open news URL + Copy feed URL - Copy feed URL + Copy feed URL + New folder... - New folder... + New folder... + Refresh RSS streams - Refresh RSS streams + Refresh RSS streams - RSS::AutoDownloader + RSSImp - - - Invalid data format. - + + Stream URL: + Stream URL: - - Couldn't save RSS AutoDownloader data in %1. Error: %2 + + Please type a RSS stream URL - - Invalid data format + + This RSS feed is already in the list. - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - + + Please choose a folder name + Please choose a folder name - - Couldn't load RSS AutoDownloader rules. Reason: %1 - + + Folder name: + Folder name: - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - + + New folder + New folder - - RSS feed at '%1' updated. Added %2 new articles. + + Deletion confirmation - - Failed to parse RSS feed at '%1'. Reason: %2 + + Are you sure you want to delete the selected RSS feeds? - - Couldn't read RSS Session data from %1. Error: %2 - + + Please choose a new name for this RSS feed + Please choose a new name for this RSS feed - - Couldn't parse RSS Session data. Error: %1 - + + New feed name: + New feed name: - - Couldn't load RSS Session data. Invalid data format. - + + Name already in use + Name already in use - - Couldn't load RSS article '%1#%2'. Invalid data format. - + + This name is already used by another item, please choose another one. + This name is already used by another item, please choose another one. - - - RSS::Private::Parser - - Invalid RSS feed. - + + Date: + Date: - - %1 (line: %2, column: %3, offset: %4). - + + Author: + Author: + + + + Unread + Unread - RSS::Session + Rss::Feed - - RSS feed with given URL already exists: %1. + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... - - Cannot move root folder. + + Automatically downloading '%1' torrent from '%2' RSS feed... + + + Rss::Private::Parser - - - Item doesn't exist: %1. + + Invalid RSS feed. + + + RssSettingsDlg - - Cannot delete root folder. - + + RSS Reader Settings + RSS Reader Settings - - Incorrect RSS Item path: %1. - + + RSS feeds refresh interval: + RSS feeds refresh interval: - - RSS item with given path already exists: %1. + + min - - Parent folder doesn't exist: %1. + + Maximum number of articles per feed: + Maximum number of articles per feed: + + + + ScanFoldersDelegate + + + Select save location - RSSImp + ScanFoldersModel - Stream URL: - Stream URL: + + Monitored Folder + - Please choose a folder name - Please choose a folder name + + Override Save Location + - Folder name: - Folder name: + + Monitored folder + - New folder - New folder + + Default save location + - Please choose a new name for this RSS feed - Please choose a new name for this RSS feed - - - New feed name: - New feed name: - - - Name already in use - Name already in use - - - This name is already used by another item, please choose another one. - This name is already used by another item, please choose another one. - - - Date: - Date: - - - Author: - Author: - - - Unread - Unread + + Browse... + - RSSWidget - - - Search - Search - + SearchEngine - - Fetching of RSS feeds is disabled now! You can enable it in application settings. + + Unknown search engine plugin file format. - - New subscription - New subscription - - - - - - Mark items read - Mark items read - - - - Refresh RSS streams - Refresh RSS streams - - - - Update all - Update all - - - - RSS Downloader... - RSS Downloader... - - - - Torrents: (double-click to download) + + A more recent version of this plugin is already installed. - - - Delete - Delete - - - - Rename... - Rename... - - - - Rename - Rename - - - - - Update - Update - - - - New subscription... - New subscription... + + + Plugin is not supported. + - - - Update all feeds - Update all feeds + + Update server is temporarily unavailable. %1 + - - Download torrent - Download torrent + + + Failed to download the plugin file. %1 + - - Open news URL - Open news URL + + An incorrect update info received. + - - Copy feed URL - Copy feed URL + + All categories + - - New folder... - New folder... + + Movies + - - Please choose a folder name - Please choose a folder name + + TV shows + - - Folder name: - Folder name: + + Music + - - New folder - New folder + + Games + - - Please type a RSS feed URL + + Anime - - Feed URL: + + Software - - Deletion confirmation + + Pictures - - Are you sure you want to delete the selected RSS feeds? + + Books + + + SearchListDelegate - - Please choose a new name for this RSS feed - Please choose a new name for this RSS feed + + + Unknown + Unknown + + + SearchTab - - New feed name: - New feed name: + + Name + i.e: file name + Name - - Rename failed - + + Size + i.e: file size + Size - - Date: - Date: + + Seeders + i.e: Number of full sources + Seeders - - Author: - Author: + + Leechers + i.e: Number of partial sources + Leechers - - - RssSettingsDlg - RSS Reader Settings - RSS Reader Settings + + Search engine + Search engine - RSS feeds refresh interval: - RSS feeds refresh interval: + + Results (showing <i>%1</i> out of <i>%2</i>): + i.e: Search results + - Maximum number of articles per feed: - Maximum number of articles per feed: + + Torrent names only + - - - ScanFoldersDelegate - - Select save location + + Everywhere - - - ScanFoldersModel - - Monitored Folder + + Searching... - - Override Save Location + + Search has finished - - Monitored folder + + Search aborted - - Default save location + + An error occurred during search... - - Browse... + + Search returned no results - - - SearchJobWidget - + + Column visibility + Column visibility + + + Form - + Results(xxx) - + Search in: - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - + Seeds: - + <html><head/><body><p>Minimal number of seeds</p></body></html> - - + + to - + <html><head/><body><p>Maximal number of seeds</p></body></html> - - - + + + - + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + Size: Size: - + <html><head/><body><p>Minimal torrent size</p></body></html> - + <html><head/><body><p>Maximal torrent size</p></body></html> + + + SearchWidget - - Name - i.e: file name - Name + + + + + + Search + Search - - Size - i.e: file size - Size + + Download + Download - - Seeders - i.e: Number of full sources - Seeders + + Go to description page + - - Leechers - i.e: Number of partial sources - Leechers + + Copy description page URL + - - Search engine - Search engine + + Search plugins... + - - Filter search results... + + A phrase to search for. - - Results (showing <i>%1</i> out of <i>%2</i>): - i.e: Search results + + Spaces in a search term may be protected by double quotes. - - Torrent names only + + Example: + Search phrase example - - Everywhere + + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> + Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - - Use regular expressions + + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> + Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - - Searching... + + All plugins - - Search has finished + + Only enabled - - Search aborted + + Select... - - An error occurred during search... + + + + Search Engine - - Search returned no results + + Please install Python to use the Search Engine. - - Column visibility - Column visibility + + Empty search pattern + - - - SearchListDelegate - Unknown - Unknown + + Please type a search pattern first + - - - SearchPluginManager - - Unknown search engine plugin file format. + + Stop - - A more recent version of this plugin is already installed. + + Search has finished - - - Plugin is not supported. + + Search has failed + + + ShutdownConfirmDlg - - All categories + + qBittorrent will now exit. - - Movies + + E&xit Now - - TV shows + + Exit confirmation - - Music + + The computer is going to shutdown. - - Games + + &Shutdown Now - - Anime + + The computer is going to enter suspend mode. - - Software + + &Suspend Now - - Pictures + + Suspend confirmation - - Books + + The computer is going to enter hibernation mode. - - Update server is temporarily unavailable. %1 + + &Hibernate Now - - - Failed to download the plugin file. %1 + + Hibernate confirmation - - An incorrect update info received. + + You can cancel the action within %1 seconds. - - Search plugin '%1' contains invalid version string ('%2') - + + Shutdown confirmation + Shutdown confirmation - SearchTab + SpeedLimitDialog - Name - i.e: file name - Name + + KiB/s + KiB/s + + + SpeedPlotView - Size - i.e: file size - Size - - - Seeders - i.e: Number of full sources - Seeders - - - Leechers - i.e: Number of partial sources - Leechers - - - Search engine - Search engine - - - Column visibility - Column visibility - - - Size: - Size: - - - - SearchWidget - - - - - - - - Search - Search - - - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - - - Download - Download - - - - Go to description page - - - - - Copy description page URL - - - - - Search plugins... - - - - - A phrase to search for. - - - - - Spaces in a search term may be protected by double quotes. - - - - - Example: - Search phrase example - - - - - <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> - Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - - - - - <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> - Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - - - - - All plugins - - - - - Only enabled - - - - - Select... - - - - - - - Search Engine - - - - - Please install Python to use the Search Engine. - - - - - Empty search pattern - - - - - Please type a search pattern first - - - - - Stop - - - - - Search has finished - - - - - Search has failed - - - - - ShutdownConfirmDialog - - - Don't show again - - - - - qBittorrent will now exit. - - - - - E&xit Now - - - - - Exit confirmation - - - - - The computer is going to shutdown. - - - - - &Shutdown Now - - - - - Shutdown confirmation - Shutdown confirmation - - - - The computer is going to enter suspend mode. - - - - - &Suspend Now - - - - - Suspend confirmation - - - - - The computer is going to enter hibernation mode. - - - - - &Hibernate Now - - - - - Hibernate confirmation - - - - - You can cancel the action within %1 seconds. - - - - - ShutdownConfirmDlg - - Shutdown confirmation - Shutdown confirmation - - - - SpeedLimitDialog - - - KiB/s - KiB/s - - - - SpeedPlotView - - + Total Upload - + Total Download - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - + DHT Download - + Tracker Upload - + Tracker Download @@ -8381,95 +7113,87 @@ SpeedWidget - + Period: - + 1 Minute - + 5 Minutes - + 30 Minutes - + 6 Hours - + Select Graphs - + Total Upload - + Total Download - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - + DHT Download - + Tracker Upload - + Tracker Download - StacktraceDialog - - - Crash info - Crash info - - - StatsDialog @@ -8482,48 +7206,48 @@ - - Cache statistics + + Total peer connections: - - Read cache hits: + + Global ratio: - - Average time in queue: + + Alltime download: - - Connected peers: + + Alltime upload: - - All-time share ratio: + + Total waste (this session): - - All-time download: + + Cache statistics - - Session waste: + + Read cache hits: - - All-time upload: + + Average time in queue: - Total buffer size: + Total buffers size: @@ -8552,7 +7276,12 @@ - + + OK + + + + %1 ms 18 milliseconds @@ -8561,35 +7290,32 @@ StatusBar - + Connection status: Connection status: - + No direct connections. This may indicate network configuration problems. No direct connections. This may indicate network configuration problems. - + DHT: %1 nodes DHT: %1 nodes + qBittorrent needs to be restarted - qBittorrent needs to be restarted + qBittorrent needs to be restarted + qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent was just updated and needs to be restarted for the changes to be effective. - - - - qBittorrent needs to be restarted! - + qBittorrent was just updated and needs to be restarted for the changes to be effective. @@ -8608,872 +7334,437 @@ Online - + Click to switch to alternative speed limits Click to switch to alternative speed limits - + Click to switch to regular speed limits Click to switch to regular speed limits + Manual change of rate limits mode. The scheduler is disabled. - Manual change of rate limits mode. The scheduler is disabled. + Manual change of rate limits mode. The scheduler is disabled. - + Global Download Speed Limit Global Download Speed Limit - + Global Upload Speed Limit Global Upload Speed Limit - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - + Downloading (0) - + Seeding (0) - + Completed (0) - + Resumed (0) - + Paused (0) - + Active (0) - + Inactive (0) - + Errored (0) - + All (%1) - + Downloading (%1) - + Seeding (%1) - + Completed (%1) - - Paused (%1) - - - - - Resumed (%1) - - - - - Active (%1) - - - - - Inactive (%1) - - - - - Errored (%1) - - - - - TagFilterModel - - - Tags - - - - - All - - - - - Untagged - - - - - TagFilterWidget - - - Add tag... - - - - - Remove tag - - - - - Remove unused tags - - - - - Resume torrents - - - - - Pause torrents - - - - - Delete torrents - - - - - New Tag - - - - - Tag: - - - - - Invalid tag name - - - - - Tag name '%1' is invalid - - - - - Tag exists - - - - - Tag name already exists. - - - - - TorrentCategoryDialog - - - Torrent Category Properties - - - - - Name: - Name: - - - - Save path: - - - - - Choose save path - Choose save path - - - - New Category - - - - - Invalid category name - - - - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - - - - - Category creation error - - - - - Category with the given name already exists. -Please choose a different name and try again. - - - - - TorrentContentModel - - - Name - Name - - - - Size - Size - - - - Progress - Progress - - - - Download Priority - - - - - Remaining - - - - - Availability - - - - - TorrentCreatorDialog - - - Torrent Creator - - - - - Select file/folder to share - - - - - Path: - - - - - [Drag and drop area] - - - - - - Select file - - - - - - Select folder - - - - - Settings - - - - - Piece size: - Piece size: - - - - Auto - Auto - - - - 16 KiB - 512 KiB {16 ?} - - - - 32 KiB - 32 KiB - - - - 64 KiB - 64 KiB - - - - 128 KiB - 128 KiB - - - - 256 KiB - 256 KiB - - - - 512 KiB - 512 KiB - - - - 1 MiB - 1 MiB - - - - 2 MiB - 2 MiB - - - - 4 MiB - 4 MiB - - - - 8 MiB - 4 MiB {8 ?} - - - - 16 MiB - 4 MiB {16 ?} - - - - 32 MiB - 4 MiB {16 ?} {32 ?} - - - - Calculate number of pieces: - - - - - Private torrent (Won't distribute on DHT network) - - - - - Start seeding immediately - - - - - Ignore share ratio limits for this torrent - Ignore share ratio limits for this torrent - - - - Optimize alignment - - - - - Fields - - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - You can separate tracker tiers / groups with an empty line. - - - - Web seed URLs: - - - - - Tracker URLs: - Tracker URLs: - - - - Comments: - - - - - Source: - - - - - Progress: - Progress: - - - - Create Torrent - - - - - - - Torrent creation failed - - - - - Reason: Path to file/folder is not readable. - - - - - Select where to save the new torrent - - - - - Torrent Files (*.torrent) - - - - - Reason: %1 - - - - - Reason: Created torrent is invalid. It won't be added to download list. - - - - - Torrent creator - - - - - Torrent created: - - - - - TorrentCreatorDlg - - Select a folder to add to the torrent - Select a folder to add to the torrent - - - Select a file to add to the torrent - Select a file to add to the torrent - - - No input path set - No input path set - - - Please type an input path first - Please type an input path first - - - Select destination torrent file - Select destination torrent file - - - Torrent creation - Torrent creation - - - Torrent creation was unsuccessful, reason: %1 - Torrent creation was unsuccessful, reason: %1 - - - Created torrent file is invalid. It won't be added to download list. - Created torrent file is invalid. It won't be added to download list. - - - Piece size: - Piece size: - - - Auto - Auto - - - 16 KiB - 512 KiB {16 ?} - - - 32 KiB - 32 KiB + + Paused (%1) + - 64 KiB - 64 KiB + + Resumed (%1) + - 128 KiB - 128 KiB + + Active (%1) + - 256 KiB - 256 KiB + + Inactive (%1) + - 512 KiB - 512 KiB + + Errored (%1) + + + + TorrentContentModel - 1 MiB - 1 MiB + + Name + Name - 2 MiB - 2 MiB + + Size + Size - 4 MiB - 4 MiB + + Progress + Progress - 8 MiB - 4 MiB {8 ?} + + Download Priority + - 16 MiB - 4 MiB {16 ?} + + Remaining + + + + TorrentCreatorDlg - 32 MiB - 4 MiB {16 ?} {32 ?} + + Select a folder to add to the torrent + Select a folder to add to the torrent - Ignore share ratio limits for this torrent - Ignore share ratio limits for this torrent + + Select a file to add to the torrent + Select a file to add to the torrent - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - You can separate tracker tiers / groups with an empty line. + + No input path set + No input path set - Tracker URLs: - Tracker URLs: + + Please type an input path first + Please type an input path first - Progress: - Progress: + + Select destination torrent file + Select destination torrent file - - - TorrentInfo - - File size exceeds max limit %1 + + Torrent Files (*.torrent) - - Torrent file read error: %1 + + Torrent was created successfully: %1 + %1 is the path of the torrent - - Torrent file read error: size mismatch - + + + + Torrent creation + Torrent creation + + + + Torrent creation was unsuccessful, reason: %1 + Torrent creation was unsuccessful, reason: %1 + + + + Created torrent file is invalid. It won't be added to download list. + Created torrent file is invalid. It won't be added to download list. TorrentModel + Name i.e: torrent name - Name + Name + Size i.e: torrent size - Size + Size + Done % Done - Done + Done + Status Torrent status (e.g. downloading, seeding, paused) - Status + Status + Seeds i.e. full sources (often untranslated) - Seeds + Seeds + Peers i.e. partial sources (often untranslated) - Peers + Peers + Down Speed i.e: Download speed - Down Speed + Down Speed + Up Speed i.e: Upload speed - Up Speed + Up Speed + Ratio Share ratio - Ratio + Ratio + ETA i.e: Estimated Time of Arrival / Time left - ETA + ETA + + + + Category + + Added On Torrent was added to transfer list on 01/01/2010 08:00 - Added On + Added On + Completed On Torrent was completed on 01/01/2010 08:00 - Completed On + Completed On + Tracker - Tracker + Tracker + Down Limit i.e: Download limit - Down Limit + Down Limit + Up Limit i.e: Upload limit - Up Limit + Up Limit + Downloaded Amount of data downloaded (e.g. in MB) - Downloaded + Downloaded + Uploaded Amount of data uploaded (e.g. in MB) - Uploaded - - - Time Active - Time (duration) the torrent is active (not paused) - Time Active - - - Save path - Torrent save path - Save path - - - - TorrentsController - - - Not contacted yet - Not contacted yet - - - - Updating... - Updating... - - - - Working - Working - - - - Not working - Not working - - - - Error: '%1' is not a valid torrent file. - + Uploaded - - - - - Torrent queueing must be enabled + + Session Download + Amount of data downloaded since program open (e.g. in MB) - - Save path cannot be empty + + Session Upload + Amount of data uploaded since program open (e.g. in MB) - - - Category cannot be empty + + Remaining + Amount of data left to download (e.g. in MB) - - Unable to create category - + + Time Active + Time (duration) the torrent is active (not paused) + Time Active - - Unable to edit category - + + Save path + Torrent save path + Save path - - Cannot make save path + + Completed + Amount of data completed (e.g. in MB) - - Cannot write to directory + + Ratio Limit + Upload share ratio limit - - WebUI Set location: moving "%1", from "%2" to "%3" + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole - - Incorrect torrent name + + Last Activity + Time passed since a chunk was downloaded/uploaded - - - Incorrect category name + + Total Size + i.e. Size including unwanted data TrackerFiltersList - + All (0) this is for the tracker filter - + Trackerless (0) - + Error (0) - + Warning (0) - - + + Trackerless (%1) - - + + Error (%1) - - + + Warning (%1) - + Resume torrents - + Pause torrents - + Delete torrents - - + + All (%1) this is for the tracker filter @@ -9482,447 +7773,272 @@ TrackerList + URL - URL + URL + Status - Status + Status + + + + Received + + Seeds - Seeds + Seeds + Peers - Peers + Peers + Downloaded - Downloaded + Downloaded + Message - Message + Message + + Working - Working + Working + Disabled - Disabled + Disabled + This torrent is private - This torrent is private + This torrent is private + Updating... - Updating... + Updating... + Not working - Not working + Not working + Not contacted yet - Not contacted yet + Not contacted yet + Tracker URL: - Tracker URL: - - - Tracker editing - Tracker editing - - - Tracker editing failed - Tracker editing failed - - - The tracker URL entered is invalid. - The tracker URL entered is invalid. - - - The tracker URL already exists. - The tracker URL already exists. - - - Add a new tracker... - Add a new tracker... - - - Edit selected tracker URL - Edit selected tracker URL - - - Force reannounce to all trackers - Force reannounce to all trackers - - - Column visibility - Column visibility - - - Remove tracker - Remove tracker - - - - TrackerListWidget - - - - Working - Working - - - - Disabled - Disabled - - - - This torrent is private - This torrent is private - - - - Updating... - Updating... - - - - Not working - Not working + Tracker URL: - - Not contacted yet - Not contacted yet - - - - - - - - - N/A - - - - + Tracker editing - Tracker editing - - - - Tracker URL: - Tracker URL: + Tracker editing - - + + Tracker editing failed - Tracker editing failed + Tracker editing failed - + The tracker URL entered is invalid. - The tracker URL entered is invalid. + The tracker URL entered is invalid. - + The tracker URL already exists. - The tracker URL already exists. - - - - Add a new tracker... - Add a new tracker... - - - - Remove tracker - Remove tracker - - - - Copy tracker URL - - - - - Edit selected tracker URL - Edit selected tracker URL - - - - Force reannounce to selected trackers - - - - - Force reannounce to all trackers - Force reannounce to all trackers - - - - URL - URL - - - - Status - Status - - - - Received - - - - - Seeds - Seeds - - - - Peers - Peers - - - - Downloaded - Downloaded - - - - Message - Message - - - - Column visibility - Column visibility - - - - TrackerLoginDialog - - - - Tracker authentication - Tracker authentication - - - - Tracker: - Tracker: - - - - Login - Login - - - - Username: - Username: - - - - Password: - Password: - - - - Log in - Log in - - - - TrackersAdditionDialog - - - Trackers addition dialog - Trackers addition dialogue + The tracker URL already exists. - - List of trackers to add (one per line): - List of trackers to add (one per line): + + Add a new tracker... + Add a new tracker... - - µTorrent compatible list URL: - µTorrent compatible list URL: + + Copy tracker URL + - - No change - No change + + Edit selected tracker URL + Edit selected tracker URL - - No additional trackers were found. - No additional trackers were found. + + Force reannounce to selected trackers + - - Download error - Download error + + Force reannounce to all trackers + Force reannounce to all trackers - - The trackers list could not be downloaded, reason: %1 - The trackers list could not be downloaded, reason: %1 + + Remove tracker + Remove tracker TrackersAdditionDlg + Trackers addition dialog - Trackers addition dialogue + Trackers addition dialogue + List of trackers to add (one per line): - List of trackers to add (one per line): + List of trackers to add (one per line): - + + µTorrent compatible list URL: - µTorrent compatible list URL: + µTorrent compatible list URL: + I/O Error - I/O Error + I/O Error + Error while trying to open the downloaded file. - Error while trying to open the downloaded file. + Error while trying to open the downloaded file. + No change - No change + No change + No additional trackers were found. - No additional trackers were found. + No additional trackers were found. + Download error - Download error + Download error + The trackers list could not be downloaded, reason: %1 - The trackers list could not be downloaded, reason: %1 + The trackers list could not be downloaded, reason: %1 TransferListDelegate - + Downloading Downloading - + Downloading metadata used when loading a magnet link Downloading metadata - + Allocating qBittorrent is allocating the files on disk Allocating - + Paused Paused - + Queued i.e. torrent is queued Queued - + Seeding Torrent is complete and in upload-only mode Seeding - + Stalled Torrent is waiting for download to begin Stalled - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. - + Checking Torrent local data is being checked Checking - + Queued for checking i.e. torrent is queued for hash checking - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - + Completed - - Moving - Torrent local data are being moved/relocated - - - - + Missing Files - + Errored torrent status, the torrent has an error - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - + %1 ago e.g.: 1h 20m ago @@ -9931,802 +8047,591 @@ TransferListFiltersWidget - + Status Status - + Categories - - Tags - - - - + Trackers Trackers - TransferListModel - - - Name - i.e: torrent name - Name - - - - Size - i.e: torrent size - Size - - - - Done - % Done - Done - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Status - - - - Seeds - i.e. full sources (often untranslated) - Seeds - - - - Peers - i.e. partial sources (often untranslated) - Peers - - - - Down Speed - i.e: Download speed - Down Speed - - - - Up Speed - i.e: Upload speed - Up Speed - - - - Ratio - Share ratio - Ratio - - - - ETA - i.e: Estimated Time of Arrival / Time left - ETA - - - - Category - - - - - Tags - - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - Added On - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - Completed On - - - - Tracker - Tracker - - - - Down Limit - i.e: Download limit - Down Limit - - - - Up Limit - i.e: Upload limit - Up Limit - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Downloaded - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Uploaded - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - - - - - Time Active - Time (duration) the torrent is active (not paused) - Time Active - - - - Save path - Torrent save path - Save path - - - - Completed - Amount of data completed (e.g. in MB) - - - - - Ratio Limit - Upload share ratio limit - - - - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - - - - - Last Activity - Time passed since a chunk was downloaded/uploaded - - - - - Total Size - i.e. Size including unwanted data - - - - TransferListWidget - + Column visibility Column visibility - + Choose save path Choose save path - + Torrent Download Speed Limiting Torrent Download Speed Limiting - + Torrent Upload Speed Limiting Torrent Upload Speed Limiting - + Recheck confirmation Recheck confirmation - + Are you sure you want to recheck the selected torrent(s)? Are you sure you want to recheck the selected torrent(s)? - + Rename Rename - + New name: New name: - + Resume Resume/start the torrent Resume - + Force Resume Force Resume/start the torrent - + Pause Pause the torrent Pause - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - - - - - Add Tags - - - - - Remove All Tags - - - - - Remove all tags from selected torrents? + + New Category - - Comma-separated tags: + + Category: - - Invalid tag + + Invalid category name - - Tag name: '%1' is invalid + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. - + Delete Delete the torrent Delete - + Preview file... Preview file... - + Limit share ratio... Limit share ratio... - + Limit upload rate... Limit upload rate... - + Limit download rate... Limit download rate... - + Open destination folder Open destination folder - + Move up i.e. move up in the queue Move up - + Move down i.e. Move down in the queue Move down - + Move to top i.e. Move to top of the queue Move to top - + Move to bottom i.e. Move to bottom of the queue Move to bottom - + Set location... Set location... - - Force reannounce - - - - + Copy name - - Copy hash - - - - + Download first and last pieces first - + Automatic Torrent Management - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - + Category - + New... New category... - + Reset Reset category - - Tags - - - - - Add... - Add / assign multiple tags... - - - - - Remove All - Remove all tags - - - - + Priority Priority - + Force recheck Force recheck - + Copy magnet link Copy magnet link - + Super seeding mode Super seeding mode - + Rename... Rename... - + Download in sequential order Download in sequential order - UpDownRatioDialog - - - Torrent Upload/Download Ratio Limiting - Torrent Upload/Download Ratio Limiting - - - - Use global share limit - - - - - - - buttonGroup - buttonGroup - - - - Set no share limit - - - - - Set share limit to - - - - - ratio - - - - - minutes - - - - - No share limit method selected - - - - - Please select a limit method first - - - - UpDownRatioDlg + Torrent Upload/Download Ratio Limiting - Torrent Upload/Download Ratio Limiting + Torrent Upload/Download Ratio Limiting + Use global ratio limit - Use global ratio limit + Use global ratio limit + + + buttonGroup - buttonGroup + buttonGroup + Set no ratio limit - Set no ratio limit + Set no ratio limit + Set ratio limit to - Set ratio limit to + Set ratio limit to - Utils::ForeignApps - - - Python detected, version: %1 - - + WebApplication - - Python not detected + + Incorrect category name - WebApplication + WebUI - - Unacceptable file type, only regular file is allowed. + + The Web UI is listening on port %1 - - Symlinks inside alternative UI folder are forbidden. + + Web UI Error - Unable to bind Web UI to port %1 + + + about - - Exceeded the maximum allowed file size (%1)! + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' + + Copyright %1 2006-2016 The qBittorrent project - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' + + Home Page: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' + + Forum: - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' + + Bug Tracker: - WebUI - - - Web UI: HTTPS setup successful - - + addPeersDialog - - Web UI: HTTPS setup failed, fallback to HTTP + + Add Peers - - Web UI: Now listening on IP: %1, port: %2 + + List of peers to add (one per line): - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 + + Format: IPv4:port / [IPv6]:port authentication + + Tracker authentication - Tracker authentication + Tracker authentication + Tracker: - Tracker: + Tracker: + Login - Login + Login + Username: - Username: + Username: + Password: - Password: + Password: + Log in - Log in + Log in + Cancel - Cancel + Cancel confirmDeletionDlg + Deletion confirmation - qBittorrent - Deletion confirmation - qBittorrent + Deletion confirmation - qBittorrent + Remember choice - Remember choice + Remember choice + Also delete the files on the hard disk - Also delete the files on the hard disk + Also delete the files on the hard disk + + + + confirmShutdownDlg + + + Don't show again + createTorrentDialog + Cancel - Cancel + Cancel + Torrent Creation Tool - Torrent Creation Tool + Torrent Creation Tool + Torrent file creation - Torrent file creation + Torrent file creation + Add file - Add file + Add file + Add folder - Add folder + Add folder + File or folder to add to the torrent: - File or folder to add to the torrent: + File or folder to add to the torrent: + Tracker URLs: - Tracker URLs: + Tracker URLs: + Web seeds urls: - Web seeds URLs: + Web seeds URLs: + Comment: - Comment: + Comment: + You can separate tracker tiers / groups with an empty line. A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - You can separate tracker tiers / groups with an empty line. + You can separate tracker tiers / groups with an empty line. + Piece size: - Piece size: + Piece size: + 16 KiB - 512 KiB {16 ?} + 512 KiB {16 ?} + 32 KiB - 32 KiB + 32 KiB + 64 KiB - 64 KiB + 64 KiB + 128 KiB - 128 KiB + 128 KiB + 256 KiB - 256 KiB + 256 KiB + 512 KiB - 512 KiB + 512 KiB + 1 MiB - 1 MiB + 1 MiB + 2 MiB - 2 MiB + 2 MiB + 4 MiB - 4 MiB + 4 MiB + 8 MiB - 4 MiB {8 ?} + 4 MiB {8 ?} + 16 MiB - 4 MiB {16 ?} + 4 MiB {16 ?} + Auto - Auto + Auto + Private (won't be distributed on DHT network if enabled) - Private (won't be distributed on DHT network if enabled) + Private (won't be distributed on DHT network if enabled) + Start seeding after creation - Start seeding after creation + Start seeding after creation + Ignore share ratio limits for this torrent - Ignore share ratio limits for this torrent + Ignore share ratio limits for this torrent + Create and save... - Create and save... + Create and save... + Progress: - Progress: + Progress: downloadFromURL + Add torrent links - Add torrent links + Add torrent links + One per line (HTTP links, Magnet links and info-hashes are supported) - One per line (HTTP links, Magnet links and info-hashes are supported) + One per line (HTTP links, Magnet links and info-hashes are supported) + Download - Download + Download + Cancel - Cancel + Cancel + Download from urls - Download from URLs + Download from URLs + No URL entered - No URL entered + No URL entered + Please type at least one URL. - Please type at least one URL. + Please type at least one URL. errorDialog + Crash info - Crash info + Crash info fsutils - + + + + + Downloads Downloads @@ -10734,131 +8639,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) - + EiB exbibytes (1024 pebibytes) - + + Python not detected + + + + + Python version: %1 + + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1h %2m - + %1d %2h e.g: 2days 10hours %1d %2h - + Unknown Unknown (size) Unknown - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent will shutdown the computer now because all downloads are complete. - + < 1m < 1 minute < 1m - + %1m e.g: 10minutes %1m + Working - Working + Working + Updating... - Updating... + Updating... + Not working - Not working + Not working + Not contacted yet - Not contacted yet + Not contacted yet preview - + Preview selection Preview selection - + The following files support previewing, please select one of them: The following files support previewing, please select one of them: + Preview - Preview + Preview + Cancel - Cancel - - - - trackerLogin - - Log in - Log in + Cancel diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_en_GB.ts qbittorrent-3.3.15/src/lang/qbittorrent_en_GB.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_en_GB.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_en_GB.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,173 +1,85 @@ - - - AboutDialog - - - About qBittorrent - About qBittorrent - - - - About - About - - - - Author - Author - - - - Current maintainer - Current maintainer - - - - Greece - Greece - - - - - Nationality: - Nationality: - - - - - E-mail: - E-mail: - - - - - Name: - Name: - - - - Original author - Original author - - - - France - France - - - - Special Thanks - Special Thanks - - - - Translators - Translators - - - - License - Licence - - - - Libraries - Libraries - - - - qBittorrent was built with the following libraries: - qBittorrent was built with the following libraries: - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - - - - - Forum: - - - - - Bug Tracker: - - - + AboutDlg + About qBittorrent - About qBittorrent + About qBittorrent + About - About + About + Author - Author + Author + + Nationality: - Nationality: + Nationality: + + Name: - Name: + Name: + + E-mail: - E-mail: + E-mail: + Greece - Greece + Greece + Current maintainer - Current maintainer + Current maintainer + Original author - Original author + Original author + Special Thanks - Special Thanks + Special Thanks + Translators - Translators + Translators + Libraries - Libraries + Libraries + qBittorrent was built with the following libraries: - qBittorrent was built with the following libraries: + qBittorrent was built with the following libraries: + France - France + France + License - Licence + Licence @@ -178,65 +90,67 @@ Save at + Browse... - Browse... + Browse... + Set as default save path - Set as default save path + Set as default save path - + Never show again Never show again - + Torrent settings Torrent settings - + Set as default category Set as default category - + Category: Category: - + Start torrent Start torrent - + Torrent information Torrent information - + Skip hash check Skip hash check - + Size: Size: - + Hash: Hash: - + Comment: Comment: - + Date: Date: @@ -261,121 +175,89 @@ - - Remember last used save path - - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - + Do not delete .torrent file - - Create subfolder - - - - - Download in sequential order - Download in sequential order - - - - Download first and last pieces first - - - - + Normal Normal - + High High - + Maximum Maximum - + Do not download Do not download - - - + + + I/O Error I/O Error - + Invalid torrent Invalid torrent + + + + Already in download list - Already in download list - - - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - + Already in download list - + Not Available This comment is unavailable Not Available - + Not Available This date is unavailable Not Available - + Not available Not available - + Invalid magnet link Invalid magnet link - + The torrent file '%1' does not exist. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -383,151 +265,128 @@ + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. - Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torrent is already in download list. Trackers were merged. - Torrent is already in download list. Trackers were merged. + Torrent is already in download list. Trackers were merged. + + Cannot add torrent - Cannot add torrent + Cannot add torrent + Cannot add this torrent. Perhaps it is already in adding state. - Cannot add this torrent. Perhaps it is already in adding state. + Cannot add this torrent. Perhaps it is already in adding state. - + This magnet link was not recognized This magnet link was not recognised + Magnet link is already in download list. Trackers were merged. - Magnet link is already in download list. Trackers were merged. + Magnet link is already in download list. Trackers were merged. + Cannot add this torrent. Perhaps it is already in adding. - Cannot add this torrent. Perhaps it is already in adding. + Cannot add this torrent. Perhaps it is already in adding. - + Magnet link Magnet link - + Retrieving metadata... Retrieving metadata... - + Not Available This size is unavailable. Not Available - + Free space on disk: %1 Free space on disk: %1 - + + Choose save path Choose save path + Rename the file - Rename the file + Rename the file - + New name: New name: + + The file could not be renamed - The file could not be renamed + The file could not be renamed + This file name contains forbidden characters, please choose a different one. - This file name contains forbidden characters, please choose a different one. + This file name contains forbidden characters, please choose a different one. - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - - - - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - - - - - Magnet link is already queued for processing. - - - - - + + This name is already in use in this folder. Please use a different name. This name is already in use in this folder. Please use a different name. - + The folder could not be renamed The folder could not be renamed - + Rename... Rename... - + Priority Priority - + Invalid metadata Invalid metadata - + Parsing metadata... Parsing metadata... - + Metadata retrieval complete Metadata retrieval complete - + Download Error Download Error @@ -535,325 +394,198 @@ AdvancedSettings + Disk write cache size - Disk write cache size + Disk write cache size - + MiB MiB - + Outgoing ports (Min) [0: Disabled] Outgoing ports (Min) [0: Disabled] - + Outgoing ports (Max) [0: Disabled] Outgoing ports (Max) [0: Disabled] - + Recheck torrents on completion Recheck torrents on completion - + Transfer list refresh interval Transfer list refresh interval - + ms milliseconds ms - + Setting Setting - + Value Value set for this setting Value - - - (disabled) - - - - + (auto) (auto) - - min - minutes - - - - + All addresses - + qBittorrent Section qBittorrent Section - - + + Open documentation Open documentation - + libtorrent Section libtorrent Section - - Asynchronous I/O threads - - - - - Disk cache - - - - + s seconds s - + Disk cache expiry interval Disk cache expiry interval - + Enable OS cache Enable OS cache - - Guided read cache - - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - - - - - - KiB - - - - - Send buffer watermark - - - - - Send buffer low watermark - - - - - Send buffer watermark factor - - - + m minutes - m - - - - Prefer TCP - - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address - + m - + Resolve peer countries (GeoIP) Resolve peer countries (GeoIP) - + Resolve peer host names Resolve peer host names - + Strict super seeding Strict super seeding - + Network Interface (requires restart) Network Interface (requires restart) - + Optional IP Address to bind to (requires restart) - + Listen on IPv6 address (requires restart) Listen on IPv6 address (requires restart) - + Display notifications - + Display notifications for added torrents - + Download tracker's favicon - - Save path history length - - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - - - - - Round-robin - - - - - Fastest upload - - - - - Anti-leech - - - - - Upload choking algorithm - - - - + Confirm torrent recheck Confirm torrent recheck - - Confirm removal of all tags - - - - - Always announce to all trackers in a tier - - - - - Always announce to all tiers - + Exchange trackers with other peers + Exchange trackers with other peers + Always announce to all trackers - Always announce to all trackers + Always announce to all trackers - + Any interface i.e. Any network interface Any interface - + Save resume data interval How often the fastresume file is saved. Save resume data interval - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - - - - + Maximum number of half-open connections [0: Unlimited] Maximum number of half-open connections [0: Unlimited] - + IP Address to report to trackers (requires restart) IP Address to report to trackers (requires restart) - + Enable embedded tracker Enable embedded tracker - + Embedded tracker port Embedded tracker port - + Check for software updates Check for software updates - + Use system icon theme Use system icon theme @@ -861,124 +593,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 started - + Torrent: %1, running external program, command: %2 - - Torrent name: %1 - - - - - Torrent size: %1 - - - - - Save path: %1 - - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - - - - - Thank you for using qBittorrent. - - - - - [qBittorrent] '%1' has finished downloading + + Torrent: %1, run external program command too long (length > %2), execution failed. - + Torrent: %1, sending mail notification - + Information Information - - To control qBittorrent, access the Web UI at %1 - - - + To control qBittorrent, access the Web UI at http://localhost:%1 - To control qBittorrent, access the Web UI at http://localhost:%1 + To control qBittorrent, access the Web UI at http://localhost:%1 - + The Web UI administrator user name is: %1 The Web UI administrator user name is: %1 - + The Web UI administrator password is still the default one: %1 The Web UI administrator password is still the default one: %1 - + This is a security risk, please consider changing your password from program preferences. This is a security risk, please consider changing your password from program preferences. - + Saving torrent progress... Saving torrent progress... - - - Portable mode and explicit profile directory options are mutually exclusive - - - - - Portable mode implies relative fastresume - - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Save to: @@ -988,847 +657,668 @@ - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. + + Enable Automated RSS Downloader - + Download Rules - + Rule Definition - + Use Regular Expressions - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - - - - + Must Contain: - + Must Not Contain: - + Episode Filter: - + Assign Category: - + Save to a Different Directory - + Ignore Subsequent Matches for (0 to Disable) ... X days - + Disabled Disabled - + days - + Add Paused: - + Use global settings - + Always - + Never Never - + Apply Rule to Feeds: - + Matching RSS Articles - + &Import... - + &Export... - + Matches articles based on episode filter. - + Example: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match - + Episode filter rules: - + Season number is a mandatory non-zero value - + Filter must end with semicolon - + Three range types for episodes are supported: - + Single number: <b>1x25;</b> matches episode 25 of season one - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one - + Episode number is a mandatory positive value - - Rules + + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - - Rules (legacy) + + Last Match: %1 days ago - - Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons + + Last Match: Unknown - - Last Match: %1 days ago - - - - - Last Match: Unknown - - - - + New rule name New rule name - + Please type the name of the new download rule. Please type the name of the new download rule. - - + + Rule name conflict Rule name conflict - - + + A rule with this name already exists, please choose another name. A rule with this name already exists, please choose another name. - + Are you sure you want to remove the download rule named '%1'? - + Are you sure you want to remove the selected download rules? Are you sure you want to remove the selected download rules? - + Rule deletion confirmation Rule deletion confirmation - + Destination directory Destination directory - + Invalid action - Invalid action + Invalid action - + The list is empty, there is nothing to export. - The list is empty, there is nothing to export. - - - - Export RSS rules - - - - - Failed to create the destination file. Reason: %1 - - - - - Import RSS rules - - - - - Failed to open the file. Reason: %1 - - - - - Failed to import the selected rules file. Reason: %1 - + The list is empty, there is nothing to export. + Where would you like to save the list? - Where would you like to save the list? + Where would you like to save the list? + Rules list (*.rssrules) - Rules list (*.rssrules) + Rules list (*.rssrules) - - + I/O Error - I/O Error + I/O Error + Failed to create the destination file - Failed to create the destination file + Failed to create the destination file + Please point to the RSS download rules file - Please point to the RSS download rules file + Please point to the RSS download rules file - + + Rules list + + + + Import Error - Import Error + Import Error + Failed to import the selected rules file - Failed to import the selected rules file + Failed to import the selected rules file - + Add new rule... Add new rule... - + Delete rule Delete rule - + Rename rule... Rename rule... - + Delete selected rules Delete selected rules - - Clear downloaded episodes... - - - - + Rule renaming Rule renaming - + Please type the new rule name Please type the new rule name - - Clear downloaded episodes - - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - - - - - - Position %1: %2 - - - + Regex mode: use Perl-like regular expressions - Regex mode: use Perl-like regular expressions + Regex mode: use Perl-like regular expressions - + Wildcard mode: you can use - + ? to match any single character - + * to match zero or more of any characters - + Whitespaces count as AND operators (all words, any order) - + | is used as OR operator - + If word order is important use * instead of whitespace. - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - + will match all articles. - + will exclude all articles. - - - BanListOptions - - Delete - Delete - - - - BanListOptionsDialog - - - List of banned IP addresses - - - - - Ban IP - - - - - Delete - Delete - - - - - Warning - - - - The entered IP address is invalid. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>White-spaces count as AND operators</li></ul> - - The entered IP is already banned. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support - - Could not get GUID of configured network interface. Binding to IP %1 - - - - + Embedded Tracker [ON] - + Failed to start the embedded tracker! - + Embedded Tracker [OFF] - + + '%1' reached the maximum ratio you set. Removing... + + + + + '%1' reached the maximum ratio you set. Pausing... + + + + System network status changed to %1 e.g: System network status changed to ONLINE - + ONLINE - + OFFLINE - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. - - + Encryption support [%1] - - + FORCED - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - - - - - + Anonymous mode [%1] - + Unable to decode '%1' torrent file. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' - + Queue positions were corrected in %1 resume files - + Couldn't save '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - - - - + because %1 is disabled. this peer was blocked because uTP is disabled. - + because %1 is disabled. this peer was blocked because TCP is disabled. - + URL seed lookup failed for URL: '%1', message: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 - + The network interface defined is invalid: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 - - Peer ID: - - - - - HTTP User-Agent is '%1' - - - - - + DHT support [%1] - - - - - - - - - + + + + ON - - - - - - - - - + + + + OFF - - + Local Peer Discovery support [%1] - - PeX support [%1] - - - - - '%1' reached the maximum ratio you set. Removed. - - - - - '%1' reached the maximum ratio you set. Paused. - - - - - '%1' reached the maximum seeding time you set. Removed. - - - - - '%1' reached the maximum seeding time you set. Paused. - - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface - + Tracker '%1' was added to torrent '%2' - + Tracker '%1' was deleted from torrent '%2' - + URL seed '%1' was added to torrent '%2' - + URL seed '%1' was removed from torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Error: Failed to parse the provided IP filter. - - '%1' restored. - 'torrent name' restored. + + Couldn't add torrent. Reason: %1 - - Couldn't add torrent. Reason: %1 + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) - + '%1' added to download list. 'torrent name' was added to download list. - + An I/O error occurred, '%1' paused. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 - + due to IP filter. this peer was blocked due to ip filter. - + due to port filter. this peer was blocked due to port filter. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. - + because it has a low port. this peer was blocked because it has a low port. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 - + External IP: %1 e.g. External IP: 192.168.0.1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + File sizes mismatch for torrent '%1', pausing it. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... @@ -1836,17 +1326,17 @@ CategoryFilterModel - + Categories - + All - + Uncategorized @@ -1865,37 +1355,66 @@ - Edit category... - - - - Remove category - + Remove unused categories - + Resume torrents - + Pause torrents - + Delete torrents + + New Category + + + + Category: - Category: + Category: + + + + Invalid category name + + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + @@ -1935,82 +1454,34 @@ - DeletionConfirmationDialog + DeletionConfirmationDlg - - Deletion confirmation - - - - - Remember choice - Remember choice - - - - Also delete the files on the hard disk - Also delete the files on the hard disk - - - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - Add torrent links - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - Download - - - - No URL entered - No URL entered - - - - Please type at least one URL. - Please type at least one URL. - - - DownloadedPiecesBar - + White: Missing pieces - + Green: Partial pieces - + Blue: Completed pieces @@ -2018,34 +1489,23 @@ ExecutionLog + General - General - - - Blocked IPs - Blocked IPs - - - - ExecutionLogWidget - - - General - General + General - + Blocked IPs - Blocked IPs + Blocked IPs - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> was banned x.y.z.w was banned @@ -2054,576 +1514,514 @@ FeedListWidget - + RSS feeds RSS feeds - - - Unread (%1) - - - + Unread - Unread + Unread FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. + + An error occured while trying to open the log file. Logging to file is disabled. - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - - - - - &Browse... - Launch file dialog button text (full) - - - - - Choose a file - Caption for file open/save dialog - - + FilterParserThread - - Choose a folder - Caption for directory open dialog + + + + I/O Error: Could not open ip filter file in read mode. - - Any file + + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. - FilterParserThread + GeoIPDatabase - - - - I/O Error: Could not open IP filter file in read mode. + + + Unsupported database file size. - - - - IP filter line %1 is malformed. + + Metadata error: '%1' entry not found. - - - IP filter line %1 is malformed. Start IP of the range is malformed. + + Metadata error: '%1' entry has invalid type. - - - IP filter line %1 is malformed. End IP of the range is malformed. + + Unsupported database version: %1.%2 - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! + + Unsupported IP version: %1 - - - IP filter exception thrown for line %1. Exception is: %2 + + Unsupported record size: %1 - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. + + Invalid database type: %1 - - - - - - - - Parsing Error: The filter file is not a valid PeerGuardian P2B file. + + Database corrupted: no data section found. - GeoIPDatabase + HttpServer - - - Unsupported database file size. - + + File + File - - Metadata error: '%1' entry not found. - - - - - Metadata error: '%1' entry has invalid type. - - - - - Unsupported database version: %1.%2 - - - - - Unsupported IP version: %1 - - - - - Unsupported record size: %1 - - - - - Invalid database type: %1 - - - - - Database corrupted: no data section found. - - - - - Http::Connection - - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - - - - - Bad Http request, closing socket. IP: %s - - - - - HttpServer - - File - File - - - Edit - Edit + + Edit + Edit + Help - Help + Help - + Exit qBittorrent - + Only one link per line Only one link per line + Download - Download + Download - + Global upload rate limit must be greater than 0 or disabled. - + Global download rate limit must be greater than 0 or disabled. - + Alternative upload rate limit must be greater than 0 or disabled. - + Alternative download rate limit must be greater than 0 or disabled. - + Maximum active downloads must be greater than -1. - + Maximum active uploads must be greater than -1. - + Maximum active torrents must be greater than -1. - + Maximum number of connections limit must be greater than 0 or disabled. Maximum number of connections limit must be greater than 0 or disabled. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Maximum number of connections per torrent limit must be greater than 0 or disabled. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Maximum number of upload slots per torrent limit must be greater than 0 or disabled. - + Unable to save program preferences, qBittorrent is probably unreachable. Unable to save program preferences, qBittorrent is probably unreachable. - - IRC: #qbittorrent on Freenode - + + Language + Language - - Invalid category name: -Please do not use any special characters in the category name. + + The port used for incoming connections must be between 1 and 65535. - - Unknown - Unknown + + The port used for the Web UI must be between 1 and 65535. + - - Hard Disk + + Unable to log in, qBittorrent is probably unreachable. - - Share ratio limit must be between 0 and 9998. + + Invalid Username or Password. - - Seeding time limit must be between 0 and 525600 minutes. + + Password - Language - Language + + Login + Login - - The port used for incoming connections must be between 1 and 65535. + + Upload Failed! - - The port used for the Web UI must be between 1 and 65535. + + Original authors - - Unable to log in, qBittorrent is probably unreachable. + + Upload limit: - - Invalid Username or Password. + + Download limit: - - Username + + Apply - - Password + + Add - - Login - Login + + Category: + Category: - - Original authors + + Upload Torrents + Upload torrent files to qBittorent using WebUI - - Apply + + All - - Add - + + Downloading + Downloading - Category: - Category: + + Seeding + Seeding - - Upload Torrents - Upload torrent files to qBittorent using WebUI + + Completed - Downloading - Downloading + + Resumed + - Seeding - Seeding + + Paused + Paused - Paused - Paused + + Active + - + + Inactive + + + + Save files to location: - + Cookie: - + Type folder here - + + Run an external program on torrent completion + + + + + Enable bandwidth management (uTP) + + + + + Apply rate limit to uTP connections + + + + + Alternative Global Rate Limits + + + + More information - + Information about certificates - + Save Files to - - Set location + + Watch Folder - - Limit upload rate + + Default Folder - - Limit download rate + + from + from time1 to time2 - - Rename torrent + + to + from time1 to time2 - - Unable to create category + + Other... + Save Files to: Watch Folder / Default Folder / Other... - - Other... - Save Files to: Watch Folder / Default Folder / Other... + + Every day + Schedule the use of alternative rate limits on ... - + + Week days + Schedule the use of alternative rate limits on ... + + + + + Week ends + Schedule the use of alternative rate limits on ... + + + + Monday Schedule the use of alternative rate limits on ... - + Tuesday Schedule the use of alternative rate limits on ... - + Wednesday Schedule the use of alternative rate limits on ... - + Thursday Schedule the use of alternative rate limits on ... - + Friday Schedule the use of alternative rate limits on ... - + Saturday Schedule the use of alternative rate limits on ... - + Sunday Schedule the use of alternative rate limits on ... + Downloaded Is the file downloaded or not? - Downloaded + Downloaded - + Logout - + + Download from URLs + + + + Download Torrents from their URLs or Magnet links - + Upload local torrent - + Are you sure you want to delete the selected torrents from the transfer list? - + Save Save - + qBittorrent client is not reachable qBittorrent client is not reachable + HTTP Server - HTTP Server + HTTP Server + The following parameters are supported: - The following parameters are supported: + The following parameters are supported: + Torrent path - Torrent path + Torrent path + Torrent name - Torrent name + Torrent name - + qBittorrent has been shutdown. qBittorrent has been shutdown. - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - - - - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - - - - - Add subnet - - - - - Delete - Delete - - - - Error - - - - - The entered subnet is invalid. - - - - LineEdit + Clear the text - Clear the text + Clear the text LogListWidget - + Copy Copy - + Clear Clear @@ -2656,550 +2054,491 @@ - + &View &View - + &Options... &Options... - + &Resume &Resume - + Torrent &Creator - + Set Upload Limit... - + Set Download Limit... - + Set Global Download Limit... - + Set Global Upload Limit... - + Minimum Priority - + Top Priority - + Decrease Priority - + Increase Priority - - + + Alternative Speed Limits - + &Top Toolbar - + Display Top Toolbar - - Status &Bar - - - - + S&peed in Title Bar - + Show Transfer Speed in Title Bar - + &RSS Reader - + Search &Engine - + L&ock qBittorrent - + Do&nate! - - Close Window - - - - + R&esume All R&esume All - + Manage Cookies... - + Manage stored network cookies - + Normal Messages - + Information Messages - + Warning Messages - + Critical Messages - + &Log - + &Exit qBittorrent - + &Suspend System - + &Hibernate System - + S&hutdown System - + &Disabled - + &Statistics - + Check for Updates - + Check for Program Updates - + &About &About - + &Pause &Pause - + &Delete &Delete - + P&ause All P&ause All - + &Add Torrent File... - + Open - + E&xit - + Open URL - + &Documentation &Documentation - + Lock - - - + + + Show Show - + Check for program updates - + Add Torrent &Link... - + If you like qBittorrent, please donate! If you like qBittorrent, please donate! - - + Execution Log Execution Log - + Clear the password Clear the password - + Filter torrent list... - + &Set Password - - Preferences - - - - + &Clear Password - + Transfers Transfers - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Torrent file association - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? - + Icons Only - + Text Only - + Text Alongside Icons - + Text Under Icons - + Follow System Style - - - + + + UI lock password UI lock password - - - + + + Please type the UI lock password: Please type the UI lock password: - + The password should contain at least 3 characters The password should contain at least 3 characters - + Password update Password update - + The UI lock password has been successfully updated The UI lock password has been successfully updated - + Are you sure you want to clear the password? Are you sure you want to clear the password? - - Use regular expressions - - - - + Search Search - + Transfers (%1) Transfers (%1) - + Error - + Failed to add torrent: %1 - + Torrent added - + '%1' was added. e.g: xxx.avi was added. - + Download completion Download completion - + I/O Error i.e: Input/Output Error I/O Error - + Recursive download confirmation Recursive download confirmation - + Yes Yes - + No No - + Never Never - + Global Upload Speed Limit Global Upload Speed Limit - + Global Download Speed Limit Global Download Speed Limit - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent was just updated and needs to be restarted for the changes to be effective. - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - - - - - Are you sure you want to quit qBittorrent? - - - - + &No &No - + &Yes &Yes - + &Always Yes - - %1/s - s is a shorthand for seconds - - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - + qBittorrent Update Available - + + A new version is available. +Do you want to download %1? + + + + Already Using the Latest qBittorrent Version - + Undetermined Python version - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -3207,165 +2546,151 @@ - + The torrent '%1' contains torrent files, do you want to proceed with their download? - + Couldn't download file at URL '%1', reason: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - - + + Couldn't determine your Python version (%1). Search engine disabled. + + + + + Missing Python Interpreter - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? - + Python is required to use the search engine but it does not seem to be installed. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. - + &Check for Updates - Manual change of rate limits mode. The scheduler is disabled. - Manual change of rate limits mode. The scheduler is disabled. - - - + Checking for Updates... - + Already checking for program updates in the background - + Python found in '%1' - + Download error Download error - + Python setup could not be downloaded, reason: %1. Please install it manually. - - + + Invalid password Invalid password - - - + + RSS (%1) - + URL download error - + The password is invalid The password is invalid - - + + DL speed: %1 e.g: Download speed: 10 KiB/s - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version - + Hide Hide - + Exiting qBittorrent Exiting qBittorrent + Some files are currently transferring. Are you sure you want to quit qBittorrent? - Some files are currently transferring. + Some files are currently transferring. Are you sure you want to quit qBittorrent? - + Open Torrent Files Open Torrent Files - + Torrent Files Torrent Files - + Options were saved successfully. Options were saved successfully. @@ -3373,52 +2698,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. - + Dynamic DNS error: hostname supplied does not exist under specified account. - + Dynamic DNS error: Invalid username/password. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. - + Dynamic DNS error: supplied domain name is invalid. - + Dynamic DNS error: supplied username is too short. - + Dynamic DNS error: supplied password is too short. @@ -3426,1413 +2751,1303 @@ Net::DownloadHandler - + I/O Error I/O Error - + The file size is %1. It exceeds the download limit of %2. - + Unexpected redirect to magnet URI. - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. - - + + Couldn't load GeoIP database. Reason: %1 - + Venezuela, Bolivarian Republic of - + Viet Nam - - + + N/A - + Andorra - + United Arab Emirates - + Afghanistan - + Antigua and Barbuda - + Anguilla - + Albania - + Armenia - + Angola - + Antarctica - + Argentina - + American Samoa - + Austria - + Australia - + Aruba - + Azerbaijan - + Bosnia and Herzegovina - + Barbados - + Bangladesh - + Belgium - + Burkina Faso - + Bulgaria - + Bahrain - + Burundi - + Benin - + Bermuda - + Brunei Darussalam - + Brazil - + Bahamas - + Bhutan - + Bouvet Island - + Botswana - + Belarus - + Belize - + Canada - + Cocos (Keeling) Islands - + Congo, The Democratic Republic of the - + Central African Republic - + Congo - + Switzerland - + Cook Islands - + Chile - + Cameroon - + China - + Colombia - + Costa Rica - + Cuba - + Cape Verde - + Curacao - + Christmas Island - + Cyprus - + Czech Republic - + Germany - + Djibouti - + Denmark - + Dominica - + Dominican Republic - + Algeria - + Ecuador - + Estonia - + Egypt - + Western Sahara - + Eritrea - + Spain - + Ethiopia - + Finland - + Fiji - + Falkland Islands (Malvinas) - + Micronesia, Federated States of - + Faroe Islands - + France France - + Gabon - + United Kingdom - + Grenada - + Georgia - + French Guiana - + Ghana - + Gibraltar - + Greenland - + Gambia - + Guinea - + Guadeloupe - + Equatorial Guinea - + Greece Greece - + South Georgia and the South Sandwich Islands - + Guatemala - + Guam - + Guinea-Bissau - + Guyana - + Hong Kong - + Heard Island and McDonald Islands - + Honduras - + Croatia - + Haiti - + Hungary - + Indonesia - + Ireland - + Israel - + India - + British Indian Ocean Territory - + Iraq - + Iran, Islamic Republic of - + Iceland - + Italy - + Jamaica - + Jordan - + Japan - + Kenya - + Kyrgyzstan - + Cambodia - + Kiribati - + Comoros - + Saint Kitts and Nevis - + Korea, Democratic People's Republic of - + Korea, Republic of - + Kuwait - + Cayman Islands - + Kazakhstan - + Lao People's Democratic Republic - + Lebanon - + Saint Lucia - + Liechtenstein - + Sri Lanka - + Liberia - + Lesotho - + Lithuania - + Luxembourg - + Latvia - + Morocco - + Monaco - + Moldova, Republic of - + Madagascar - + Marshall Islands - + Mali - + Myanmar - + Mongolia - + Northern Mariana Islands - + Martinique - + Mauritania - + Montserrat - + Malta - + Mauritius - + Maldives - + Malawi - + Mexico - + Malaysia - + Mozambique - + Namibia - + New Caledonia - + Niger - + Norfolk Island - + Nigeria - + Nicaragua - + Netherlands - + Norway - + Nepal - + Nauru - + Niue - + New Zealand - + Oman - + Panama - + Peru - + French Polynesia - + Papua New Guinea - + Philippines - + Pakistan - + Poland - + Saint Pierre and Miquelon - + Puerto Rico - + Portugal - + Palau - + Paraguay - + Qatar - + Reunion - + Romania - + Russian Federation - + Rwanda - + Saudi Arabia - + Solomon Islands - + Seychelles - + Sudan - + Sweden - + Singapore - + Slovenia - + Svalbard and Jan Mayen - + Slovakia - + Sierra Leone - + San Marino - + Senegal - + Somalia - + Suriname - + Sao Tome and Principe - + El Salvador - + Syrian Arab Republic - + Swaziland - + Turks and Caicos Islands - + Chad - + French Southern Territories - + Togo - + Thailand - + Tajikistan - + Tokelau - + Turkmenistan - + Tunisia - + Tonga - - Could not decompress GeoIP database file. - - - - + Timor-Leste - + Bolivia, Plurinational State of - + Bonaire, Sint Eustatius and Saba - + Cote d'Ivoire - + Libya - + Saint Martin (French part) - + Macedonia, The Former Yugoslav Republic of - + Macao - + Pitcairn - + Palestine, State of - + Saint Helena, Ascension and Tristan da Cunha - + South Sudan - + Sint Maarten (Dutch part) - + Turkey - + Trinidad and Tobago - + Tuvalu - + Taiwan - + Tanzania, United Republic of - + Ukraine - + Uganda - + United States Minor Outlying Islands - + United States - + Uruguay - + Uzbekistan - + Holy See (Vatican City State) - + Saint Vincent and the Grenadines - + Virgin Islands, British - + Virgin Islands, U.S. - + Vanuatu - + Wallis and Futuna - + Samoa - + Yemen - + Mayotte - + Serbia - + South Africa - + Zambia - + Montenegro - + Zimbabwe - + Aland Islands - + Guernsey - + Isle of Man - + Jersey - + Saint Barthelemy - + + Could not uncompress GeoIP database file. + + + + Couldn't save downloaded GeoIP database file. - + Successfully updated GeoIP database. - + Couldn't download GeoIP database file. Reason: %1 @@ -4840,12 +4055,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] - + UPnP / NAT-PMP support [OFF] @@ -4853,7 +4068,7 @@ Net::Smtp - + Email Notification Error: @@ -4861,1277 +4076,1077 @@ OptionsDialog - + Options - + Behavior - + Downloads Downloads - + Connection Connection - + Speed - + BitTorrent - - RSS - - - - + Web UI - + Advanced - + Language Language - + User Interface Language: - + (Requires restart) - + Transfer List - + Confirm when deleting torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. - + Hide zero and infinity values - + Always - + Paused torrents only - + Action on double-click - + Downloading torrents: - - + + Start / Stop Torrent - - + + Open destination folder Open destination folder - - + + No action - + Completed torrents: - + Desktop - + Start qBittorrent on Windows start up - + Show splash screen on start up - + Start qBittorrent minimized - + Confirmation on exit when torrents are active - + Confirmation on auto-exit when downloads finish - - KiB + + Show qBittorrent in notification area - - Email notification &upon download completion + + Minimize qBittorrent to notification area - - Run e&xternal program on torrent completion + + Close qBittorrent to notification area + i.e: The systray tray icon will still be visible when closing the main window. - - IP Fi&ltering + + Tray icon style: - - Schedule &the use of alternative rate limits - + + Normal + Normal - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + + Monochrome (Dark theme) - - &Torrent Queueing + + Monochrome (Light theme) - - Seed torrents until their seeding time reaches + + File association - - A&utomatically add these trackers to new downloads: + + Use qBittorrent for .torrent files - - RSS Reader + + Use qBittorrent for magnet links - - Enable fetching RSS feeds + + Power Management - - Feeds refresh interval: + + Inhibit system sleep when torrents are active - - Maximum number of articles per feed: - Maximum number of articles per feed: + + Log file + - - - min - minutes + + Save path: - - RSS Torrent Auto Downloader + + Backup the log file after: - - Enable auto downloading of RSS torrents + + MB - - Edit auto downloading rules... + + Delete backup logs older than: - - Web User Interface (Remote control) + + days + Delete backup logs older than 10 months - - IP address: + + months + Delete backup logs older than 10 months - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. + + years + Delete backup logs older than 10 years - - Server domains: + + When adding a torrent - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. + + Display torrent content and some options - - &Use HTTPS instead of HTTP + + Bring torrent dialog to the front - - Bypass authentication for clients on localhost + + Do not start the download automatically + The torrent will be added to download list in pause state - - Bypass authentication for clients in whitelisted IP subnets + + Should the .torrent file be deleted after adding it - - IP subnet whitelist... + + Delete .torrent files afterwards - - Upda&te my dynamic domain name + + Also delete .torrent files whose addition was cancelled - - Minimize qBittorrent to notification area + + Also when addition is cancelled - - Close qBittorrent to notification area - i.e: The systray tray icon will still be visible when closing the main window. + + Warning! Data loss possible! - - Tray icon style: + + Saving Management - - Normal - Normal + + Default Torrent Management Mode: + - - Monochrome (Dark theme) + + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - - Monochrome (Light theme) + + Manual - - File association + + Automatic - - Use qBittorrent for .torrent files + + When Torrent Category changed: - - Use qBittorrent for magnet links + + Relocate torrent - - Power Management + + Switch torrent to Manual Mode - - Save path: + + When Default Save Path changed: - - Backup the log file after: + + + Relocate affected torrents - - Delete backup logs older than: + + + Switch affected torrents to Manual Mode - - days - Delete backup logs older than 10 months + + When Category changed: - - months - Delete backup logs older than 10 months + + Use Subcategories - - years - Delete backup logs older than 10 years + + Default Save Path: - - When adding a torrent + + Keep incomplete torrents in: - - Bring torrent dialog to the front + + Copy .torrent files to: - - Do not start the download automatically - The torrent will be added to download list in pause state + + Copy .torrent files for finished downloads to: - - Should the .torrent file be deleted after adding it + + Pre-allocate disk space for all files - - Also delete .torrent files whose addition was cancelled + + Append .!qB extension to incomplete files - - Also when addition is cancelled + + Automatically add torrents from: - - Warning! Data loss possible! + + Add entry - - Saving Management + + Remove entry - - Default Torrent Management Mode: + + Email notification upon download completion - - Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category + + Destination email: - - Manual + + SMTP server: - - Automatic + + This server requires a secure connection (SSL) - - When Torrent Category changed: + + + + Authentication - - Relocate torrent - - - - - Switch torrent to Manual Mode - - - - - When Default Save Path changed: - - - - - - Relocate affected torrents - - - - - - Switch affected torrents to Manual Mode - - - - - When Category changed: - - - - - Use Subcategories - - - - - Default Save Path: - - - - - Keep incomplete torrents in: - - - - - Copy .torrent files to: - - - - - Show &qBittorrent in notification area - - - - - &Log file - - - - - Display &torrent content and some options - - - - - Create subfolder for torrents with multiple files - - - - - De&lete .torrent files afterwards - - - - - Copy .torrent files for finished downloads to: - - - - - Pre-allocate disk space for all files - - - - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding - - - - - Append .!qB extension to incomplete files - - - - - Enable recursive download dialog - - - - - Automatically add torrents from: - - - - - Add entry - - - - - Remove entry - - - - - SMTP server: - - - - - This server requires a secure connection (SSL) - - - - - - Authentication - - - - - - - + + + + Username: Username: - - - - + + + + Password: Password: - - Enabled protocol: + + Run external program on torrent completion - - TCP and μTP - - - - + Listening Port - + Port used for incoming connections: - + Random - + Use UPnP / NAT-PMP port forwarding from my router - + Use different port on each startup - + Connections Limits - + Maximum number of connections per torrent: - + Global maximum number of connections: - + Maximum number of upload slots per torrent: - + Global maximum number of upload slots: - + Proxy Server - + Type: - + (None) - + SOCKS4 - + SOCKS5 - + HTTP - + Host: - - + + Port: - + Otherwise, the proxy server is only used for tracker connections - + Use proxy for peer connections - + Disable connections not supported by proxies - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - + Use proxy only for torrents - - A&uthentication + + Info: The password is saved unencrypted - - Info: The password is saved unencrypted + + IP Filtering - + Filter path (.dat, .p2p, .p2b): - + Reload the filter - - Manually banned IP addresses... - - - - + Apply to trackers - + Global Rate Limits - - - - - - - KiB/s - - - - - + + Upload: + + + + KiB/s - KiB/s + KiB/s - - + + Download: - + Alternative Rate Limits - - + + Schedule the use of alternative rate limits + + + + From: from (time1 to time2) - - + To: time1 to time2 - + When: - + Every day - + Weekdays - + Weekends - + Rate Limits Settings - + Apply rate limit to peers on LAN - + Apply rate limit to transport overhead - - + + + Enable µTP protocol + + + + Apply rate limit to µTP protocol - + Privacy - + Enable DHT (decentralized network) to find more peers - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers - + Look for peers on your local network - + Enable Local Peer Discovery to find more peers - + Encryption mode: - + Prefer encryption - + Require encryption - + Disable encryption - + Enable when using a proxy or a VPN connection - + Enable anonymous mode - - Maximum active downloads: - - - - - Maximum active uploads: - - - - - Maximum active torrents: + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - Do not count slow torrents in these limits + + Torrent Queueing - - Upload rate threshold: + + Maximum active downloads: - - Download rate threshold: + + Maximum active uploads: - - sec - seconds + + Maximum active torrents: - - Torrent inactivity timer: + + Do not count slow torrents in these limits - + Share Ratio Limiting - + Seed torrents until their ratio reaches - + then - + Pause them - + Remove them - - RSS Smart Episode Filters + + Automatically add these trackers to new downloads: - - Use UPnP / NAT-PMP to forward the port from my router + + Enable Web User Interface (Remote control) - - Certificate: + + Use UPnP / NAT-PMP to forward the port from my router - - Import SSL Certificate + + Use HTTPS instead of HTTP - - Key: + + Certificate: - - Import SSL Key + + Import SSL Certificate - - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> + + Key: - - Use alternative Web UI + + Import SSL Key - - Files location: + + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - - Enable clickjacking protection + + Bypass authentication for localhost - - Enable Cross-Site Request Forgery (CSRF) protection + + Update my dynamic domain name - + Service: - + Register - + Domain name: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): - + %N: Torrent name - + %L: Category - - %G: Tags (seperated by comma) - - - - + %F: Content path (same as root path for multifile torrent) - + %R: Root path (first torrent subdirectory path) - + %D: Save path - + %C: Number of files - + %Z: Torrent size (bytes) - + %T: Current tracker - + %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor - + Folder is already being monitored: - + Folder does not exist: - + Folder is not readable: - + Adding entry failed - - - - + + Choose export directory - - - + + + + + + Choose a save directory - + Choose an IP filter file - + All supported filters - + SSL Certificate - + + SSL Key + + + + Parsing error - + Failed to parse the provided IP filter - + Successfully refreshed - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Invalid key - + This is not a valid SSL key. - + Invalid certificate - - Preferences - - - - - Import SSL certificate - - - - + This is not a valid SSL certificate. - - Import SSL key - - - - - SSL key - - - - + Time Error - + The start time and the end time can't be the same. - - + + Length Error - + The Web UI username must be at least 3 characters long. - + The Web UI password must be at least 6 characters long. @@ -6139,72 +5154,72 @@ PeerInfo - - Interested(local) and Choked(peer) + + interested(local) and choked(peer) - + interested(local) and unchoked(peer) - + interested(peer) and choked(local) - + interested(peer) and unchoked(local) - + optimistic unchoke - + peer snubbed - + incoming connection - + not interested(local) and unchoked(peer) - + not interested(peer) and unchoked(local) - + peer from PEX - + peer from DHT - + encrypted traffic - + encrypted handshake - + peer from LSD @@ -6212,180 +5227,165 @@ PeerListWidget - + IP IP - + Port - + Flags Flags - + Connection Connection - + Client i.e.: Client application Client - + Progress i.e: % downloaded Progress - + Down Speed i.e: Download speed Down Speed - + Up Speed i.e: Upload speed Up Speed - + Downloaded i.e: total data downloaded Downloaded - + Uploaded i.e: total data uploaded Uploaded - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. - + Files i.e. files that are being downloaded right now - + Column visibility Column visibility - + Add a new peer... Add a new peer... - - + + Ban peer permanently Ban peer permanently - + Manually adding peer '%1'... - + The peer '%1' could not be added to this torrent. - + Manually banning peer '%1'... - - + + Peer addition Peer addition - + Country - + Copy IP:port - + Some peers could not be added. Check the Log for details. - + The peers were added to this torrent. - + Are you sure you want to ban permanently the selected peers? Are you sure you want to ban permanently the selected peers? - + &Yes &Yes - + &No &No - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - + PeersAdditionDlg - + No peer entered - + Please type at least one peer. - + Invalid peer - + The peer '%1' is invalid. @@ -6393,12 +5393,12 @@ PieceAvailabilityBar - + White: Unavailable pieces - + Blue: Available pieces @@ -6406,374 +5406,288 @@ PiecesBar - + Files in this piece: - + File in this piece - + File in these pieces - - Wait until metadata become available to see detailed information - - - - + Hold Shift key for detailed information - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Installed search plugins: - + Name Name - + Version - + Url - - + + Enabled - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Check for updates - + Close - + Uninstall - - - + + + Yes Yes - - - - + + + + No No - + Uninstall warning - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Uninstall success - + All selected plugins were uninstalled successfully - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - - - - - + + New search engine plugin URL - - + + URL: - + Invalid link - + The link doesn't seem to point to a search engine plugin. - + Select search plugins - + qBittorrent search plugin - + + + + Search plugin update + + + + All your plugins are already up to date. - + Sorry, couldn't check for plugin updates. %1 - + + + Search plugin install - - Couldn't install "%1" search engine plugin. %2 + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine - - Couldn't update "%1" search engine plugin. %2 + + Couldn't install "%1" search engine plugin. %2 - - - PluginSelectDlg - - Name - Name - - Yes - Yes + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + - No - No + + Couldn't update "%1" search engine plugin. %2 + - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Search plugin source: - + Local file - + Web link - PowerManagement - - - qBittorrent is active - - - - PreviewSelect + Name - Name + Name + Size - Size + Size + Progress - Progress + Progress + + Preview impossible - Preview impossible + Preview impossible + + Sorry, we can't preview this file - Sorry, we can't preview this file + Sorry, we can't preview this file - PreviewSelectDialog + PropListDelegate - - Preview - Preview + + Not downloaded + Not downloaded - - Name - Name - - - - Size - Size - - - - Progress - Progress - - - - - Preview impossible - Preview impossible - - - - - Sorry, we can't preview this file - Sorry, we can't preview this file - - - - Private::FileLineEdit - - - '%1' does not exist - - - - - '%1' does not point to a directory - - - - - '%1' does not point to a file - - - - - Does not have read permission in '%1' - - - - - Does not have write permission in '%1' - - - - - PropListDelegate - - - Not downloaded - Not downloaded - - - - + + Normal Normal (priority) Normal - - N/A - - - - + Do not download Do not download (priority) Do not download - - + + High High (priority) High - + Mixed Mixed (priorities Mixed - - + + Maximum Maximum (priority) Maximum @@ -6782,32 +5696,32 @@ PropTabBar - + General General - + Trackers Trackers - + Peers Peers - + HTTP Sources HTTP Sources - + Content Content - + Speed @@ -6901,22 +5815,22 @@ Comment: - + Select All Select All - + Select None Select None - + Normal Normal - + High High @@ -6976,177 +5890,165 @@ - + Maximum Maximum + - Do not download Do not download - + Never Never - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) - - + + %1 (%2 this session) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) - + Open - + Open Containing Folder - + Rename... Rename... - + Priority Priority - + New Web seed New Web seed - + Remove Web seed Remove Web seed - + Copy Web seed URL Copy Web seed URL - + Edit Web seed URL Edit Web seed URL + Rename the file - Rename the file + Rename the file - + New name: New name: + + The file could not be renamed - The file could not be renamed + The file could not be renamed + This file name contains forbidden characters, please choose a different one. - This file name contains forbidden characters, please choose a different one. + This file name contains forbidden characters, please choose a different one. - - + + This name is already in use in this folder. Please use a different name. This name is already in use in this folder. Please use a different name. - + The folder could not be renamed The folder could not be renamed - + qBittorrent qBittorrent - + Filter files... - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - - - - + New URL seed New HTTP source - + New URL seed: - - + + This URL seed is already in the list. - + Web seed editing Web seed editing - + Web seed URL: Web seed URL: @@ -7154,2391 +6056,1715 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + + + + + Error: '%1' is not a valid torrent file. + + + + + + Error: Could not add torrent to session. + + + + + I/O Error: Could not create temporary file. + + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. - - + + %1 must be the single command line parameter. - + + %1 must specify the correct port (1 to 65535). + + + + You cannot use %1: qBittorrent is already running for this user. - + Usage: - + Options: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' + + Displays program version - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' + + Displays this help message - - Expected integer number in environment variable '%1', but got '%2' + + Changes the Web UI port (current: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' + + Disable splash screen - - Expected %1 in environment variable '%2', but got '%3' + + Run in daemon-mode (background) - - port + + Downloads the torrents passed by the user - - %1 must specify a valid port (1 to 65535). - + + Help + Help - - Display program version and exit + + Run application with -h option to read about command line parameters. - - Display this help message and exit + + Bad command line - - Change the Web UI port + + Bad command line: - - Disable splash screen + + Legal Notice - - Run in daemon-mode (background) + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. - - dir - Use appropriate short form or abbreviation of "directory" + + Press %1 key to accept and continue... - - Store configuration files in <dir> + + Legal notice - - - name + + Cancel + Cancel + + + + I Agree - - Store configuration files in directories qBittorrent_<name> + + Torrent name: %1 - - Hack into libtorrent fastresume files and make file paths relative to the profile directory + + Torrent size: %1 - - files or URLs + + Save path: %1 - - Download the torrents passed by the user + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. + + Thank you for using qBittorrent. - - Options when adding new torrents: + + [qBittorrent] '%1' has finished downloading - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume + + The remote host name was not found (invalid hostname) - - path + + The operation was canceled - - Torrent save path + + The remote server closed the connection prematurely, before the entire reply was received and processed - - Add torrents as started or paused + + The connection to the remote server timed out - - Skip hash check - Skip hash check + + SSL/TLS handshake failed + - - Assign torrents to category. If the category doesn't exist, it will be created. + + The remote server refused the connection - - Download files in sequential order + + The connection to the proxy server was refused - - Download first and last pieces first + + The proxy server closed the connection prematurely - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: + + The proxy host name was not found - - Command line parameters take precedence over environment variables + + The connection to the proxy timed out or the proxy did not reply in time to the request sent - - Help - Help + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + - - Run application with -h option to read about command line parameters. + + The access to the remote content was denied (401) - - Bad command line + + The operation requested on the remote content is not permitted - - Bad command line: + + The remote content was not found at the server (404) - - Legal Notice + + The remote server requires authentication to serve the content but the credentials provided were not accepted - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + + The Network Access API cannot honor the request because the protocol is not known - - No further notices will be issued. + + The requested operation is invalid for this protocol - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. + + An unknown network-related error was detected - - Press %1 key to accept and continue... + + An unknown proxy-related error was detected - - Legal notice + + An unknown error related to the remote content was detected - - Cancel - Cancel + + A breakdown in protocol was detected + - - I Agree + + Unknown error - - + + Upgrade - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - + Couldn't migrate torrent with hash: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 + + Detected unclean program exit. Using fallback file to restore settings. - + An access error occurred while trying to write the configuration file. - + A format error occurred while trying to write the configuration file. - - - An unknown error occurred while trying to write the configuration file. - - RSS + Search - Search + Search + New subscription - New subscription + New subscription + + + Mark items read - Mark items read + Mark items read + Update all - Update all + Update all + RSS Downloader... - RSS Downloader... + RSS Downloader... + Settings... - Settings... + Settings... + + Torrents: (double-click to download) + + + + + Delete - Delete + Delete + Rename... - Rename... + Rename... + Rename - Rename + Rename + + Update - Update + Update + New subscription... - New subscription... + New subscription... + + Update all feeds - Update all feeds + Update all feeds + Download torrent - Download torrent + Download torrent + Open news URL - Open news URL + Open news URL + Copy feed URL - Copy feed URL + Copy feed URL + New folder... - New folder... + New folder... + Refresh RSS streams - Refresh RSS streams + Refresh RSS streams - RSS::AutoDownloader + RSSImp - - - Invalid data format. - + + Stream URL: + Stream URL: - - Couldn't save RSS AutoDownloader data in %1. Error: %2 + + Please type a RSS stream URL - - Invalid data format + + This RSS feed is already in the list. - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - + + Please choose a folder name + Please choose a folder name - - Couldn't load RSS AutoDownloader rules. Reason: %1 - + + Folder name: + Folder name: - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - + + New folder + New folder - - RSS feed at '%1' updated. Added %2 new articles. + + Deletion confirmation - - Failed to parse RSS feed at '%1'. Reason: %2 + + Are you sure you want to delete the selected RSS feeds? - - Couldn't read RSS Session data from %1. Error: %2 - + + Please choose a new name for this RSS feed + Please choose a new name for this RSS feed - - Couldn't parse RSS Session data. Error: %1 - + + New feed name: + New feed name: - - Couldn't load RSS Session data. Invalid data format. - + + Name already in use + Name already in use - - Couldn't load RSS article '%1#%2'. Invalid data format. - + + This name is already used by another item, please choose another one. + This name is already used by another item, please choose another one. - - - RSS::Private::Parser - - Invalid RSS feed. - + + Date: + Date: - - %1 (line: %2, column: %3, offset: %4). - + + Author: + Author: + + + + Unread + Unread - RSS::Session + Rss::Feed - - RSS feed with given URL already exists: %1. + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... - - Cannot move root folder. + + Automatically downloading '%1' torrent from '%2' RSS feed... + + + Rss::Private::Parser - - - Item doesn't exist: %1. + + Invalid RSS feed. + + + RssSettingsDlg - - Cannot delete root folder. - + + RSS Reader Settings + RSS Reader Settings - - Incorrect RSS Item path: %1. - + + RSS feeds refresh interval: + RSS feeds refresh interval: - - RSS item with given path already exists: %1. + + min - - Parent folder doesn't exist: %1. + + Maximum number of articles per feed: + Maximum number of articles per feed: + + + + ScanFoldersDelegate + + + Select save location - RSSImp + ScanFoldersModel - Stream URL: - Stream URL: + + Monitored Folder + - Please choose a folder name - Please choose a folder name + + Override Save Location + - Folder name: - Folder name: + + Monitored folder + - New folder - New folder + + Default save location + - Please choose a new name for this RSS feed - Please choose a new name for this RSS feed + + Browse... + Browse... + + + SearchEngine - New feed name: - New feed name: + + Unknown search engine plugin file format. + - Name already in use - Name already in use - - - This name is already used by another item, please choose another one. - This name is already used by another item, please choose another one. - - - Date: - Date: - - - Author: - Author: - - - Unread - Unread - - - - RSSWidget - - - Search - Search - - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. + + A more recent version of this plugin is already installed. - - New subscription - New subscription - - - - - - Mark items read - Mark items read - - - - Refresh RSS streams - Refresh RSS streams - - - - Update all - Update all - - - - RSS Downloader... - RSS Downloader... - - - - Torrents: (double-click to download) + + + Plugin is not supported. - - - Delete - Delete - - - - Rename... - Rename... - - - - Rename - Rename - - - - - Update - Update - - - - New subscription... - New subscription... + + Update server is temporarily unavailable. %1 + - - - Update all feeds - Update all feeds + + + Failed to download the plugin file. %1 + - - Download torrent - Download torrent + + An incorrect update info received. + - - Open news URL - Open news URL + + All categories + - - Copy feed URL - Copy feed URL + + Movies + - - New folder... - New folder... + + TV shows + - - Please choose a folder name - Please choose a folder name + + Music + - - Folder name: - Folder name: + + Games + - - New folder - New folder + + Anime + - - Please type a RSS feed URL + + Software - - Feed URL: + + Pictures - - Deletion confirmation + + Books + + + SearchListDelegate - - Are you sure you want to delete the selected RSS feeds? - + + + Unknown + Unknown + + + SearchTab - - Please choose a new name for this RSS feed - Please choose a new name for this RSS feed + + Name + i.e: file name + Name - - New feed name: - New feed name: + + Size + i.e: file size + Size - - Rename failed - + + Seeders + i.e: Number of full sources + Seeders - - Date: - Date: + + Leechers + i.e: Number of partial sources + Leechers - - Author: - Author: + + Search engine + Search engine - - - RssSettingsDlg - RSS Reader Settings - RSS Reader Settings + + Results (showing <i>%1</i> out of <i>%2</i>): + i.e: Search results + - RSS feeds refresh interval: - RSS feeds refresh interval: + + Torrent names only + - Maximum number of articles per feed: - Maximum number of articles per feed: + + Everywhere + - - - ScanFoldersDelegate - - Select save location + + Searching... - - - ScanFoldersModel - - Monitored Folder + + Search has finished - - Override Save Location + + Search aborted - - Monitored folder + + An error occurred during search... - - Default save location + + Search returned no results - - Browse... - Browse... + + Column visibility + Column visibility - - - SearchJobWidget - + Form - + Results(xxx) - + Search in: - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - + Seeds: - + <html><head/><body><p>Minimal number of seeds</p></body></html> - - + + to - + <html><head/><body><p>Maximal number of seeds</p></body></html> - - - + + + - + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + Size: Size: - + <html><head/><body><p>Minimal torrent size</p></body></html> - + <html><head/><body><p>Maximal torrent size</p></body></html> + + + SearchWidget - - Name - i.e: file name - Name - - - - Size - i.e: file size - Size - - - - Seeders - i.e: Number of full sources - Seeders - - - - Leechers - i.e: Number of partial sources - Leechers - - - - Search engine - Search engine - - - - Filter search results... - - - - - Results (showing <i>%1</i> out of <i>%2</i>): - i.e: Search results - - - - - Torrent names only - - - - - Everywhere - - - - - Use regular expressions - - - - - Searching... - - - - - Search has finished - + + + + + + Search + Search - - Search aborted - + + Download + Download - - An error occurred during search... + + Go to description page - - Search returned no results + + Copy description page URL - - Column visibility - Column visibility - - - - SearchListDelegate - - Unknown - Unknown - - - - SearchPluginManager - - - Unknown search engine plugin file format. + + Search plugins... - - A more recent version of this plugin is already installed. + + A phrase to search for. - - - Plugin is not supported. + + Spaces in a search term may be protected by double quotes. - - All categories + + Example: + Search phrase example - - Movies + + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> + Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - - TV shows + + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> + Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - - Music + + All plugins - - Games + + Only enabled - - Anime + + Select... - - Software + + + + Search Engine - - Pictures + + Please install Python to use the Search Engine. - - Books + + Empty search pattern - - Update server is temporarily unavailable. %1 + + Please type a search pattern first - - - Failed to download the plugin file. %1 + + Stop - - An incorrect update info received. + + Search has finished - - Search plugin '%1' contains invalid version string ('%2') - - - - - SearchTab - - Name - i.e: file name - Name - - - Size - i.e: file size - Size - - - Seeders - i.e: Number of full sources - Seeders - - - Leechers - i.e: Number of partial sources - Leechers - - - Search engine - Search engine - - - Column visibility - Column visibility - - - Size: - Size: - - - - SearchWidget - - - - - - - - Search - Search - - - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - - - Download - Download - - - - Go to description page - - - - - Copy description page URL - - - - - Search plugins... - - - - - A phrase to search for. - - - - - Spaces in a search term may be protected by double quotes. - - - - - Example: - Search phrase example - - - - - <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> - Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - - - - - <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> - Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - - - - - All plugins - - - - - Only enabled - - - - - Select... - - - - - - - Search Engine - - - - - Please install Python to use the Search Engine. - - - - - Empty search pattern - - - - - Please type a search pattern first - - - - - Stop - - - - - Search has finished - - - - - Search has failed - - - - - ShutdownConfirmDialog - - - Don't show again - - - - - qBittorrent will now exit. - - - - - E&xit Now - - - - - Exit confirmation - - - - - The computer is going to shutdown. - - - - - &Shutdown Now - - - - - Shutdown confirmation - Shutdown confirmation - - - - The computer is going to enter suspend mode. - - - - - &Suspend Now - - - - - Suspend confirmation - - - - - The computer is going to enter hibernation mode. - - - - - &Hibernate Now - - - - - Hibernate confirmation - - - - - You can cancel the action within %1 seconds. + + Search has failed ShutdownConfirmDlg - Shutdown confirmation - Shutdown confirmation - - - - SpeedLimitDialog - - - KiB/s - KiB/s - - - - SpeedPlotView - - - Total Upload - - - - - Total Download - - - - - Payload Upload - - - - - Payload Download - - - - - Overhead Upload - - - - - Overhead Download - - - - - DHT Upload - - - - - DHT Download - - - - - Tracker Upload - - - - - Tracker Download - - - - - SpeedWidget - - - Period: - - - - - 1 Minute - - - - - 5 Minutes - - - - - 30 Minutes - - - - - 6 Hours - - - - - Select Graphs - - - - - Total Upload - - - - - Total Download - - - - - Payload Upload - - - - - Payload Download - - - - - Overhead Upload - - - - - Overhead Download - - - - - DHT Upload - - - - - DHT Download - - - - - Tracker Upload - - - - - Tracker Download - - - - - StacktraceDialog - - - Crash info - Crash info - - - - StatsDialog - - - Statistics - - - - - User statistics - - - - - Cache statistics - - - - - Read cache hits: - - - - - Average time in queue: - - - - - Connected peers: - - - - - All-time share ratio: - - - - - All-time download: - - - - - Session waste: - - - - - All-time upload: - - - - - Total buffer size: - - - - - Performance statistics - - - - - Queued I/O jobs: - - - - - Write cache overload: - - - - - Read cache overload: - - - - - Total queued size: - - - - - %1 ms - 18 milliseconds - - - - - StatusBar - - - - Connection status: - Connection status: - - - - - No direct connections. This may indicate network configuration problems. - No direct connections. This may indicate network configuration problems. - - - - - DHT: %1 nodes - DHT: %1 nodes - - - qBittorrent needs to be restarted - qBittorrent needs to be restarted - - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent was just updated and needs to be restarted for the changes to be effective. - - - - qBittorrent needs to be restarted! - - - - - - Connection Status: - Connection Status: - - - - Offline. This usually means that qBittorrent failed to listen on the selected port for incoming connections. - Offline. This usually means that qBittorrent failed to listen on the selected port for incoming connections. - - - - Online - Online - - - - Click to switch to alternative speed limits - Click to switch to alternative speed limits - - - - Click to switch to regular speed limits - Click to switch to regular speed limits - - - Manual change of rate limits mode. The scheduler is disabled. - Manual change of rate limits mode. The scheduler is disabled. - - - - Global Download Speed Limit - Global Download Speed Limit - - - - Global Upload Speed Limit - Global Upload Speed Limit - - - - StatusFilterWidget - - - All (0) - this is for the status filter - - - - - Downloading (0) - - - - - Seeding (0) - - - - - Completed (0) - - - - - Resumed (0) - - - - - Paused (0) - - - - - Active (0) - - - - - Inactive (0) + + qBittorrent will now exit. - - Errored (0) + + E&xit Now - - All (%1) + + Exit confirmation - - Downloading (%1) + + The computer is going to shutdown. - - Seeding (%1) + + &Shutdown Now - - Completed (%1) + + The computer is going to enter suspend mode. - - Paused (%1) + + &Suspend Now - - Resumed (%1) + + Suspend confirmation - - Active (%1) + + The computer is going to enter hibernation mode. - - Inactive (%1) + + &Hibernate Now - - Errored (%1) + + Hibernate confirmation - - - TagFilterModel - - Tags + + You can cancel the action within %1 seconds. - - All - + + Shutdown confirmation + Shutdown confirmation + + + SpeedLimitDialog - - Untagged - + + KiB/s + KiB/s - TagFilterWidget + SpeedPlotView - - Add tag... + + Total Upload - - Remove tag + + Total Download - - Remove unused tags + + Payload Upload - - Resume torrents + + Payload Download - - Pause torrents + + Overhead Upload - - Delete torrents + + Overhead Download - - New Tag + + DHT Upload - - Tag: + + DHT Download - - Invalid tag name + + Tracker Upload - - Tag name '%1' is invalid + + Tracker Download + + + SpeedWidget - - Tag exists + + Period: - - Tag name already exists. + + 1 Minute - - - TorrentCategoryDialog - - Torrent Category Properties + + 5 Minutes - - Name: - Name: - - - - Save path: + + 30 Minutes - - Choose save path - Choose save path + + 6 Hours + - - New Category + + Select Graphs - - Invalid category name + + Total Upload - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. + + Total Download - - Category creation error + + Payload Upload - - Category with the given name already exists. -Please choose a different name and try again. + + Payload Download - - - TorrentContentModel - - Name - Name + + Overhead Upload + - - Size - Size + + Overhead Download + - - Progress - Progress + + DHT Upload + - - Download Priority + + DHT Download - - Remaining + + Tracker Upload - - Availability + + Tracker Download - TorrentCreatorDialog + StatsDialog - - Torrent Creator + + Statistics - - Select file/folder to share + + User statistics - - Path: + + Total peer connections: - - [Drag and drop area] + + Global ratio: - - - Select file + + Alltime download: - - - Select folder + + Alltime upload: - - Settings + + Total waste (this session): - - Piece size: - Piece size: + + Cache statistics + - - Auto - Auto + + Read cache hits: + - - 16 KiB - 512 KiB {16 ?} + + Average time in queue: + - - 32 KiB - 32 KiB + + Total buffers size: + - - 64 KiB - 64 KiB + + Performance statistics + - - 128 KiB - 128 KiB + + Queued I/O jobs: + - - 256 KiB - 256 KiB + + Write cache overload: + - - 512 KiB - 512 KiB + + Read cache overload: + - - 1 MiB - 1 MiB + + Total queued size: + - - 2 MiB - 2 MiB + + OK + - - 4 MiB - 4 MiB + + %1 ms + 18 milliseconds + + + + StatusBar - - 8 MiB - 4 MiB {8 ?} + + + Connection status: + Connection status: - - 16 MiB - 4 MiB {16 ?} + + + No direct connections. This may indicate network configuration problems. + No direct connections. This may indicate network configuration problems. - - 32 MiB - 4 MiB {16 ?} {32 ?} + + + DHT: %1 nodes + DHT: %1 nodes - - Calculate number of pieces: - + + qBittorrent needs to be restarted + qBittorrent needs to be restarted - - Private torrent (Won't distribute on DHT network) - + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent was just updated and needs to be restarted for the changes to be effective. - - Start seeding immediately - + + + Connection Status: + Connection Status: - - Ignore share ratio limits for this torrent - Ignore share ratio limits for this torrent + + Offline. This usually means that qBittorrent failed to listen on the selected port for incoming connections. + Offline. This usually means that qBittorrent failed to listen on the selected port for incoming connections. - - Optimize alignment - + + Online + Online - - Fields - + + Click to switch to alternative speed limits + Click to switch to alternative speed limits - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - You can separate tracker tiers / groups with an empty line. + + Click to switch to regular speed limits + Click to switch to regular speed limits - - Web seed URLs: - + + Manual change of rate limits mode. The scheduler is disabled. + Manual change of rate limits mode. The scheduler is disabled. - - Tracker URLs: - Tracker URLs: + + Global Download Speed Limit + Global Download Speed Limit - - Comments: - + + Global Upload Speed Limit + Global Upload Speed Limit + + + StatusFiltersWidget - - Source: + + All (0) + this is for the status filter - - Progress: - Progress: - - - - Create Torrent + + Downloading (0) - - - - Torrent creation failed + + Seeding (0) - - Reason: Path to file/folder is not readable. + + Completed (0) - - Select where to save the new torrent + + Resumed (0) - - Torrent Files (*.torrent) + + Paused (0) - - Reason: %1 + + Active (0) - - Reason: Created torrent is invalid. It won't be added to download list. + + Inactive (0) - - Torrent creator + + Errored (0) - - Torrent created: + + All (%1) - - - TorrentCreatorDlg - - Select a folder to add to the torrent - Select a folder to add to the torrent - - - Select a file to add to the torrent - Select a file to add to the torrent - - - No input path set - No input path set - - - Please type an input path first - Please type an input path first - - - Select destination torrent file - Select destination torrent file - - - Torrent creation - Torrent creation - - - Torrent creation was unsuccessful, reason: %1 - Torrent creation was unsuccessful, reason: %1 - - Created torrent file is invalid. It won't be added to download list. - Created torrent file is invalid. It won't be added to download list. - - - Piece size: - Piece size: + + Downloading (%1) + - Auto - Auto + + Seeding (%1) + - 16 KiB - 512 KiB {16 ?} + + Completed (%1) + - 32 KiB - 32 KiB + + Paused (%1) + - 64 KiB - 64 KiB + + Resumed (%1) + - 128 KiB - 128 KiB + + Active (%1) + - 256 KiB - 256 KiB + + Inactive (%1) + - 512 KiB - 512 KiB + + Errored (%1) + + + + TorrentContentModel - 1 MiB - 1 MiB + + Name + Name - 2 MiB - 2 MiB + + Size + Size - 4 MiB - 4 MiB + + Progress + Progress - 8 MiB - 4 MiB {8 ?} + + Download Priority + - 16 MiB - 4 MiB {16 ?} + + Remaining + + + + TorrentCreatorDlg - 32 MiB - 4 MiB {16 ?} {32 ?} + + Select a folder to add to the torrent + Select a folder to add to the torrent - Ignore share ratio limits for this torrent - Ignore share ratio limits for this torrent + + Select a file to add to the torrent + Select a file to add to the torrent - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - You can separate tracker tiers / groups with an empty line. + + No input path set + No input path set - Tracker URLs: - Tracker URLs: + + Please type an input path first + Please type an input path first - Progress: - Progress: + + Select destination torrent file + Select destination torrent file - - - TorrentInfo - - File size exceeds max limit %1 + + Torrent Files (*.torrent) - - Torrent file read error: %1 + + Torrent was created successfully: %1 + %1 is the path of the torrent - - Torrent file read error: size mismatch - + + + + Torrent creation + Torrent creation + + + + Torrent creation was unsuccessful, reason: %1 + Torrent creation was unsuccessful, reason: %1 + + + + Created torrent file is invalid. It won't be added to download list. + Created torrent file is invalid. It won't be added to download list. TorrentModel + Name i.e: torrent name - Name + Name + Size i.e: torrent size - Size + Size + Done % Done - Done + Done + Status Torrent status (e.g. downloading, seeding, paused) - Status + Status + Seeds i.e. full sources (often untranslated) - Seeds + Seeds + Peers i.e. partial sources (often untranslated) - Peers + Peers + Down Speed i.e: Download speed - Down Speed + Down Speed + Up Speed i.e: Upload speed - Up Speed + Up Speed + Ratio Share ratio - Ratio + Ratio + ETA i.e: Estimated Time of Arrival / Time left - ETA + ETA + + + + Category + + Added On Torrent was added to transfer list on 01/01/2010 08:00 - Added On + Added On + Completed On Torrent was completed on 01/01/2010 08:00 - Completed On + Completed On + Tracker - Tracker + Tracker + Down Limit i.e: Download limit - Down Limit + Down Limit + Up Limit i.e: Upload limit - Up Limit + Up Limit + Downloaded Amount of data downloaded (e.g. in MB) - Downloaded + Downloaded + Uploaded Amount of data uploaded (e.g. in MB) - Uploaded - - - Time Active - Time (duration) the torrent is active (not paused) - Time Active - - - Save path - Torrent save path - Save path - - - - TorrentsController - - - Not contacted yet - Not contacted yet - - - - Updating... - Updating... - - - - Working - Working - - - - Not working - Not working - - - - Error: '%1' is not a valid torrent file. - + Uploaded - - - - - Torrent queueing must be enabled + + Session Download + Amount of data downloaded since program open (e.g. in MB) - - Save path cannot be empty + + Session Upload + Amount of data uploaded since program open (e.g. in MB) - - - Category cannot be empty + + Remaining + Amount of data left to download (e.g. in MB) - - Unable to create category - + + Time Active + Time (duration) the torrent is active (not paused) + Time Active - - Unable to edit category - + + Save path + Torrent save path + Save path - - Cannot make save path + + Completed + Amount of data completed (e.g. in MB) - - Cannot write to directory + + Ratio Limit + Upload share ratio limit - - WebUI Set location: moving "%1", from "%2" to "%3" + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole - - Incorrect torrent name + + Last Activity + Time passed since a chunk was downloaded/uploaded - - - Incorrect category name + + Total Size + i.e. Size including unwanted data TrackerFiltersList - + All (0) this is for the tracker filter - + Trackerless (0) - + Error (0) - + Warning (0) - - + + Trackerless (%1) - - + + Error (%1) - - + + Warning (%1) - + Resume torrents - + Pause torrents - + Delete torrents - - + + All (%1) this is for the tracker filter @@ -9547,447 +7773,272 @@ TrackerList + URL - URL + URL + Status - Status + Status + + + + Received + + Seeds - Seeds + Seeds + Peers - Peers + Peers + Downloaded - Downloaded + Downloaded + Message - Message + Message + + Working - Working + Working + Disabled - Disabled + Disabled + This torrent is private - This torrent is private + This torrent is private + Updating... - Updating... + Updating... + Not working - Not working + Not working + Not contacted yet - Not contacted yet + Not contacted yet + Tracker URL: - Tracker URL: - - - Tracker editing - Tracker editing - - - Tracker editing failed - Tracker editing failed - - - The tracker URL entered is invalid. - The tracker URL entered is invalid. - - - The tracker URL already exists. - The tracker URL already exists. - - - Add a new tracker... - Add a new tracker... - - - Edit selected tracker URL - Edit selected tracker URL - - - Force reannounce to all trackers - Force reannounce to all trackers - - - Column visibility - Column visibility - - - Remove tracker - Remove tracker - - - - TrackerListWidget - - - - Working - Working - - - - Disabled - Disabled - - - - This torrent is private - This torrent is private - - - - Updating... - Updating... - - - - Not working - Not working + Tracker URL: - - Not contacted yet - Not contacted yet - - - - - - - - - N/A - - - - + Tracker editing - Tracker editing - - - - Tracker URL: - Tracker URL: + Tracker editing - - + + Tracker editing failed - Tracker editing failed + Tracker editing failed - + The tracker URL entered is invalid. - The tracker URL entered is invalid. + The tracker URL entered is invalid. - + The tracker URL already exists. - The tracker URL already exists. + The tracker URL already exists. - + Add a new tracker... - Add a new tracker... - - - - Remove tracker - Remove tracker - - - - Copy tracker URL - - - - - Edit selected tracker URL - Edit selected tracker URL - - - - Force reannounce to selected trackers - + Add a new tracker... - - Force reannounce to all trackers - Force reannounce to all trackers - - - - URL - URL - - - - Status - Status - - - - Received - - - - - Seeds - Seeds - - - - Peers - Peers - - - - Downloaded - Downloaded - - - - Message - Message - - - - Column visibility - Column visibility - - - - TrackerLoginDialog - - - - Tracker authentication - Tracker authentication - - - - Tracker: - Tracker: - - - - Login - Login - - - - Username: - Username: - - - - Password: - Password: - - - - Log in - Log in - - - - TrackersAdditionDialog - - - Trackers addition dialog - Trackers addition dialogue - - - - List of trackers to add (one per line): - List of trackers to add (one per line): - - - - µTorrent compatible list URL: - µTorrent compatible list URL: + + Copy tracker URL + - - No change - No change + + Edit selected tracker URL + Edit selected tracker URL - - No additional trackers were found. - No additional trackers were found. + + Force reannounce to selected trackers + - - Download error - Download error + + Force reannounce to all trackers + Force reannounce to all trackers - - The trackers list could not be downloaded, reason: %1 - The trackers list could not be downloaded, reason: %1 + + Remove tracker + Remove tracker TrackersAdditionDlg + Trackers addition dialog - Trackers addition dialogue + Trackers addition dialogue + List of trackers to add (one per line): - List of trackers to add (one per line): + List of trackers to add (one per line): - + + µTorrent compatible list URL: - µTorrent compatible list URL: + µTorrent compatible list URL: + I/O Error - I/O Error + I/O Error + Error while trying to open the downloaded file. - Error while trying to open the downloaded file. + Error while trying to open the downloaded file. + No change - No change + No change + No additional trackers were found. - No additional trackers were found. + No additional trackers were found. + Download error - Download error + Download error + The trackers list could not be downloaded, reason: %1 - The trackers list could not be downloaded, reason: %1 + The trackers list could not be downloaded, reason: %1 TransferListDelegate - + Downloading Downloading - + Downloading metadata used when loading a magnet link Downloading metadata - + Allocating qBittorrent is allocating the files on disk Allocating - + Paused Paused - + Queued i.e. torrent is queued Queued - + Seeding Torrent is complete and in upload-only mode Seeding - + Stalled Torrent is waiting for download to begin Stalled - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. - + Checking Torrent local data is being checked Checking - + Queued for checking i.e. torrent is queued for hash checking - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - + Completed - - Moving - Torrent local data are being moved/relocated - - - - + Missing Files - + Errored torrent status, the torrent has an error - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - + %1 ago e.g.: 1h 20m ago @@ -9996,806 +8047,591 @@ TransferListFiltersWidget - + Status Status - + Categories - - Tags - - - - + Trackers Trackers - TransferListModel - - - Name - i.e: torrent name - Name - - - - Size - i.e: torrent size - Size - - - - Done - % Done - Done - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Status - - - - Seeds - i.e. full sources (often untranslated) - Seeds - - - - Peers - i.e. partial sources (often untranslated) - Peers - - - - Down Speed - i.e: Download speed - Down Speed - - - - Up Speed - i.e: Upload speed - Up Speed - - - - Ratio - Share ratio - Ratio - - - - ETA - i.e: Estimated Time of Arrival / Time left - ETA - - - - Category - - - - - Tags - - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - Added On - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - Completed On - - - - Tracker - Tracker - - - - Down Limit - i.e: Download limit - Down Limit - - - - Up Limit - i.e: Upload limit - Up Limit - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Downloaded - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Uploaded - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - - - - - Time Active - Time (duration) the torrent is active (not paused) - Time Active - - - - Save path - Torrent save path - Save path - - - - Completed - Amount of data completed (e.g. in MB) - - - - - Ratio Limit - Upload share ratio limit - - - - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - - - - - Last Activity - Time passed since a chunk was downloaded/uploaded - - - - - Total Size - i.e. Size including unwanted data - - - - TransferListWidget - + Column visibility Column visibility - + Choose save path Choose save path - + Torrent Download Speed Limiting Torrent Download Speed Limiting - + Torrent Upload Speed Limiting Torrent Upload Speed Limiting - + Recheck confirmation Recheck confirmation - + Are you sure you want to recheck the selected torrent(s)? Are you sure you want to recheck the selected torrent(s)? - + Rename Rename - + New name: New name: - + Resume Resume/start the torrent Resume - + Force Resume Force Resume/start the torrent - + Pause Pause the torrent Pause - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" + + New Category + Category: - Category: - - - - Add Tags - - - - - Remove All Tags - - - - - Remove all tags from selected torrents? - - - - - Comma-separated tags: - + Category: - - Invalid tag + + Invalid category name - - Tag name: '%1' is invalid + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. - + Delete Delete the torrent Delete - + Preview file... Preview file... - + Limit share ratio... Limit share ratio... - + Limit upload rate... Limit upload rate... - + Limit download rate... Limit download rate... - + Open destination folder Open destination folder - + Move up i.e. move up in the queue Move up - + Move down i.e. Move down in the queue Move down - + Move to top i.e. Move to top of the queue Move to top - + Move to bottom i.e. Move to bottom of the queue Move to bottom - + Set location... Set location... - - Force reannounce - - - - + Copy name - - Copy hash - - - - + Download first and last pieces first - + Automatic Torrent Management - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - + Category - + New... New category... - + Reset Reset category - - Tags - - - - - Add... - Add / assign multiple tags... - - - - - Remove All - Remove all tags - - - - + Priority Priority - + Force recheck Force recheck - + Copy magnet link Copy magnet link - + Super seeding mode Super seeding mode - + Rename... Rename... - + Download in sequential order Download in sequential order - UpDownRatioDialog - - - Torrent Upload/Download Ratio Limiting - Torrent Upload/Download Ratio Limiting - - - - Use global share limit - - - - - - - buttonGroup - buttonGroup - - - - Set no share limit - - - - - Set share limit to - - - - - ratio - - - - - minutes - - - - - No share limit method selected - - - - - Please select a limit method first - - - - UpDownRatioDlg + Torrent Upload/Download Ratio Limiting - Torrent Upload/Download Ratio Limiting + Torrent Upload/Download Ratio Limiting + Use global ratio limit - Use global ratio limit + Use global ratio limit + + + buttonGroup - buttonGroup + buttonGroup + Set no ratio limit - Set no ratio limit + Set no ratio limit + Set ratio limit to - Set ratio limit to + Set ratio limit to - Utils::ForeignApps - - - Python detected, version: %1 - - + WebApplication - - Python not detected + + Incorrect category name - WebApplication + WebUI - - Unacceptable file type, only regular file is allowed. + + The Web UI is listening on port %1 - - Symlinks inside alternative UI folder are forbidden. + + Web UI Error - Unable to bind Web UI to port %1 + + + about - - Exceeded the maximum allowed file size (%1)! + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' + + Copyright %1 2006-2016 The qBittorrent project - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' + + Home Page: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' + + Forum: - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' + + Bug Tracker: - WebUI - - - Web UI: HTTPS setup successful - - + addPeersDialog - - Web UI: HTTPS setup failed, fallback to HTTP + + Add Peers - - Web UI: Now listening on IP: %1, port: %2 + + List of peers to add (one per line): - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 + + Format: IPv4:port / [IPv6]:port authentication + + Tracker authentication - Tracker authentication + Tracker authentication + Tracker: - Tracker: + Tracker: + Login - Login + Login + Username: - Username: + Username: + Password: - Password: + Password: + Log in - Log in + Log in + Cancel - Cancel + Cancel confirmDeletionDlg + Deletion confirmation - qBittorrent - Deletion confirmation - qBittorrent + Deletion confirmation - qBittorrent + Remember choice - Remember choice + Remember choice + Also delete the files on the hard disk - Also delete the files on the hard disk + Also delete the files on the hard disk + + + + confirmShutdownDlg + + + Don't show again + createTorrentDialog + Cancel - Cancel + Cancel + Torrent Creation Tool - Torrent Creation Tool + Torrent Creation Tool + Torrent file creation - Torrent file creation + Torrent file creation + Add file - Add file + Add file + Add folder - Add folder + Add folder + File or folder to add to the torrent: - File or folder to add to the torrent: + File or folder to add to the torrent: + Tracker URLs: - Tracker URLs: + Tracker URLs: + Web seeds urls: - Web seeds URLs: + Web seeds URLs: + Comment: - Comment: + Comment: + You can separate tracker tiers / groups with an empty line. A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - You can separate tracker tiers / groups with an empty line. + You can separate tracker tiers / groups with an empty line. + Piece size: - Piece size: + Piece size: + 16 KiB - 512 KiB {16 ?} + 512 KiB {16 ?} + 32 KiB - 32 KiB + 32 KiB + 64 KiB - 64 KiB + 64 KiB + 128 KiB - 128 KiB + 128 KiB + 256 KiB - 256 KiB + 256 KiB + 512 KiB - 512 KiB + 512 KiB + 1 MiB - 1 MiB + 1 MiB + 2 MiB - 2 MiB + 2 MiB + 4 MiB - 4 MiB + 4 MiB + 8 MiB - 4 MiB {8 ?} + 4 MiB {8 ?} + 16 MiB - 4 MiB {16 ?} + 4 MiB {16 ?} + Auto - Auto + Auto + Private (won't be distributed on DHT network if enabled) - Private (won't be distributed on DHT network if enabled) + Private (won't be distributed on DHT network if enabled) + Start seeding after creation - Start seeding after creation + Start seeding after creation + Ignore share ratio limits for this torrent - Ignore share ratio limits for this torrent + Ignore share ratio limits for this torrent + Create and save... - Create and save... + Create and save... + Progress: - Progress: + Progress: downloadFromURL + Add torrent links - Add torrent links + Add torrent links + One per line (HTTP links, Magnet links and info-hashes are supported) - One per line (HTTP links, Magnet links and info-hashes are supported) + One per line (HTTP links, Magnet links and info-hashes are supported) + Download - Download + Download + Cancel - Cancel + Cancel + Download from urls - Download from URLs + Download from URLs + No URL entered - No URL entered + No URL entered + Please type at least one URL. - Please type at least one URL. + Please type at least one URL. errorDialog + Crash info - Crash info + Crash info fsutils - + + + + + Downloads Downloads @@ -10803,131 +8639,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) - + EiB exbibytes (1024 pebibytes) - + + Python not detected + + + + + Python version: %1 + + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1h %2m - + %1d %2h e.g: 2days 10hours %1d %2h - + Unknown Unknown (size) Unknown - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent will shutdown the computer now because all downloads are complete. - + < 1m < 1 minute < 1m - + %1m e.g: 10minutes %1m + Working - Working + Working + Updating... - Updating... + Updating... + Not working - Not working + Not working + Not contacted yet - Not contacted yet + Not contacted yet preview - + Preview selection Preview selection - + The following files support previewing, please select one of them: The following files support previewing, please select one of them: + Preview - Preview + Preview + Cancel - Cancel - - - - trackerLogin - - Log in - Log in + Cancel diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_en.ts qbittorrent-3.3.15/src/lang/qbittorrent_en.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_en.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_en.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,171 +1,156 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - + About - + Author - - Current maintainer - - - - - Greece + + + Nationality: - - - Nationality: + + + Name: - - + + E-mail: - - - Name: + + Greece - - Original author + + Current maintainer - - France + + Original author - + Special Thanks - + Translators - - License - - - - + Libraries - + qBittorrent was built with the following libraries: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project + + France - - Home Page: + + License + + + AddNewTorrentDialog - - Forum: + + Save at - - Bug Tracker: + + Browse... - - - AddNewTorrentDialog - - Save at + + Set as default save path - + Never show again - + Torrent settings - + Set as default category - + Category: - + Start torrent - + Torrent information - + Skip hash check - + Size: - + Hash: - + Comment: - + Date: @@ -190,117 +175,89 @@ - - Remember last used save path - - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - + Do not delete .torrent file - - Create subfolder - - - - - Download in sequential order - - - - - Download first and last pieces first - - - - + Normal - + High - + Maximum - + Do not download - - - + + + I/O Error - + Invalid torrent - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. + + + + + Already in download list - + Not Available This comment is unavailable - + Not Available This date is unavailable - + Not available - + Invalid magnet link - + The torrent file '%1' does not exist. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -308,115 +265,128 @@ - - This magnet link was not recognized + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. - - Magnet link + + Torrent is already in download list. Trackers were merged. - - Retrieving metadata... + + + Cannot add torrent - - Not Available - This size is unavailable. + + Cannot add this torrent. Perhaps it is already in adding state. - - Free space on disk: %1 + + This magnet link was not recognized - - Choose save path + + Magnet link is already in download list. Trackers were merged. + + + + + Cannot add this torrent. Perhaps it is already in adding. - - - - - - - Torrent is already present + + Magnet link - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. + + Retrieving metadata... - - Torrent '%1' is already in the transfer list. Trackers have been merged. + + Not Available + This size is unavailable. - - Torrent is already queued for processing. + + Free space on disk: %1 - - Magnet link '%1' is already in the transfer list. Trackers have been merged. + + + Choose save path - - Magnet link is already queued for processing. + + Rename the file - + New name: - - + + + The file could not be renamed + + + + + This file name contains forbidden characters, please choose a different one. + + + + + This name is already in use in this folder. Please use a different name. - + The folder could not be renamed - + Rename... - + Priority - + Invalid metadata - + Parsing metadata... - + Metadata retrieval complete - + Download Error @@ -424,312 +394,194 @@ AdvancedSettings - + + Disk write cache size + + + + MiB - + Outgoing ports (Min) [0: Disabled] - + Outgoing ports (Max) [0: Disabled] - + Recheck torrents on completion - + Transfer list refresh interval - + ms milliseconds - + Setting - + Value Value set for this setting - - - (disabled) - - - - + (auto) - - min - minutes - - - - + All addresses - + qBittorrent Section - - + + Open documentation - + libtorrent Section - - Asynchronous I/O threads - - - - - Disk cache - - - - + s seconds - + Disk cache expiry interval - + Enable OS cache - - Guided read cache - - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - - - - - - KiB - - - - - Send buffer watermark - - - - - Send buffer low watermark - - - - - Send buffer watermark factor - - - - - Prefer TCP - - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address + + m + minutes - + Resolve peer countries (GeoIP) - + Resolve peer host names - + Strict super seeding - + Network Interface (requires restart) - + Optional IP Address to bind to (requires restart) - + Listen on IPv6 address (requires restart) - + Display notifications - + Display notifications for added torrents - + Download tracker's favicon - - Save path history length - - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - - - - - Round-robin - - - - - Fastest upload - - - - - Anti-leech - - - - - Upload choking algorithm - - - - + Confirm torrent recheck - - Confirm removal of all tags - - - - - Always announce to all trackers in a tier - - - - - Always announce to all tiers + + Always announce to all trackers - + Any interface i.e. Any network interface - + Save resume data interval How often the fastresume file is saved. - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - - - - + Maximum number of half-open connections [0: Unlimited] - + IP Address to report to trackers (requires restart) - + Enable embedded tracker - + Embedded tracker port - + Check for software updates - + Use system icon theme @@ -737,120 +589,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started - + Torrent: %1, running external program, command: %2 - - Torrent name: %1 - - - - - Torrent size: %1 - - - - - Save path: %1 - - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - - - - - Thank you for using qBittorrent. - - - - - [qBittorrent] '%1' has finished downloading + + Torrent: %1, run external program command too long (length > %2), execution failed. - + Torrent: %1, sending mail notification - + Information - - To control qBittorrent, access the Web UI at %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 - + The Web UI administrator user name is: %1 - + The Web UI administrator password is still the default one: %1 - + This is a security risk, please consider changing your password from program preferences. - + Saving torrent progress... - - - Portable mode and explicit profile directory options are mutually exclusive - - - - - Portable mode implies relative fastresume - - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: @@ -860,816 +653,660 @@ - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. + + Enable Automated RSS Downloader - + Download Rules - + Rule Definition - + Use Regular Expressions - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - - - - + Must Contain: - + Must Not Contain: - + Episode Filter: - + Assign Category: - + Save to a Different Directory - + Ignore Subsequent Matches for (0 to Disable) ... X days - + Disabled - + days - + Add Paused: - + Use global settings - + Always - + Never - + Apply Rule to Feeds: - + Matching RSS Articles - + &Import... - + &Export... - + Matches articles based on episode filter. - + Example: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match - + Episode filter rules: - + Season number is a mandatory non-zero value - + Filter must end with semicolon - + Three range types for episodes are supported: - + Single number: <b>1x25;</b> matches episode 25 of season one - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one - + Episode number is a mandatory positive value - - Rules - - - - - Rules (legacy) - - - - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - + Last Match: %1 days ago - + Last Match: Unknown - + New rule name - + Please type the name of the new download rule. - - + + Rule name conflict - - + + A rule with this name already exists, please choose another name. - + Are you sure you want to remove the download rule named '%1'? - + Are you sure you want to remove the selected download rules? - + Rule deletion confirmation - + Destination directory - + Invalid action - + The list is empty, there is nothing to export. - - Export RSS rules + + Where would you like to save the list? - - + + Rules list (*.rssrules) + + + + I/O Error - - Failed to create the destination file. Reason: %1 + + Failed to create the destination file - - Import RSS rules + + Please point to the RSS download rules file - - Failed to open the file. Reason: %1 + + Rules list - + Import Error - - Failed to import the selected rules file. Reason: %1 + + Failed to import the selected rules file - + Add new rule... - + Delete rule - + Rename rule... - + Delete selected rules - - Clear downloaded episodes... - - - - + Rule renaming - + Please type the new rule name - - Clear downloaded episodes - - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - - - - - - Position %1: %2 + + Regex mode: use Perl-like regular expressions - + Wildcard mode: you can use - + ? to match any single character - + * to match zero or more of any characters - + Whitespaces count as AND operators (all words, any order) - + | is used as OR operator - + If word order is important use * instead of whitespace. - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - + will match all articles. - + will exclude all articles. - BanListOptionsDialog - - - List of banned IP addresses - - - - - Ban IP - - - - - Delete - - - - - - Warning - - - - - The entered IP address is invalid. - - + BitTorrent::Session - - The entered IP is already banned. + + Restart is required to toggle PeX support - - - BitTorrent::Session - - Restart is required to toggle PeX support + + Embedded Tracker [ON] - - Could not get GUID of configured network interface. Binding to IP %1 + + Failed to start the embedded tracker! - - Embedded Tracker [ON] + + Embedded Tracker [OFF] - - Failed to start the embedded tracker! + + '%1' reached the maximum ratio you set. Removing... - - Embedded Tracker [OFF] + + '%1' reached the maximum ratio you set. Pausing... - + System network status changed to %1 e.g: System network status changed to ONLINE - + ONLINE - + OFFLINE - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. - - + Encryption support [%1] - - + FORCED - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - - - - - + Anonymous mode [%1] - + Unable to decode '%1' torrent file. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' - + Queue positions were corrected in %1 resume files - + Couldn't save '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - - - - + because %1 is disabled. this peer was blocked because uTP is disabled. - + because %1 is disabled. this peer was blocked because TCP is disabled. - + URL seed lookup failed for URL: '%1', message: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 - + The network interface defined is invalid: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 - - Peer ID: - - - - - HTTP User-Agent is '%1' - - - - - + DHT support [%1] - - - - - - - - - + + + + ON - - - - - - - - - + + + + OFF - - + Local Peer Discovery support [%1] - - PeX support [%1] - - - - - '%1' reached the maximum ratio you set. Removed. - - - - - '%1' reached the maximum ratio you set. Paused. - - - - - '%1' reached the maximum seeding time you set. Removed. - - - - - '%1' reached the maximum seeding time you set. Paused. - - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface - + Tracker '%1' was added to torrent '%2' - + Tracker '%1' was deleted from torrent '%2' - + URL seed '%1' was added to torrent '%2' - + URL seed '%1' was removed from torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Error: Failed to parse the provided IP filter. - - '%1' restored. - 'torrent name' restored. + + Couldn't add torrent. Reason: %1 - - Couldn't add torrent. Reason: %1 + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) - + '%1' added to download list. 'torrent name' was added to download list. - + An I/O error occurred, '%1' paused. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 - + due to IP filter. this peer was blocked due to ip filter. - + due to port filter. this peer was blocked due to port filter. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. - + because it has a low port. this peer was blocked because it has a low port. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 - + External IP: %1 e.g. External IP: 192.168.0.1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + File sizes mismatch for torrent '%1', pausing it. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... @@ -1677,17 +1314,17 @@ CategoryFilterModel - + Categories - + All - + Uncategorized @@ -1706,34 +1343,67 @@ - Edit category... - - - - Remove category - + Remove unused categories - + Resume torrents - + Pause torrents - + Delete torrents + + + New Category + + + + + Category: + + + + + Invalid category name + + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + CookiesDialog @@ -1772,106 +1442,58 @@ - DeletionConfirmationDialog - - - Deletion confirmation - - - - - Remember choice - - - - - Also delete the files on the hard disk - - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - - - - - No URL entered - - - - - Please type at least one URL. - - - - DownloadedPiecesBar - + White: Missing pieces - + Green: Partial pieces - + Blue: Completed pieces - ExecutionLogWidget + ExecutionLog - + General - + Blocked IPs - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> was banned x.y.z.w was banned @@ -1880,112 +1502,41 @@ FeedListWidget - + RSS feeds - - - Unread (%1) + + Unread FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - - - - - &Browse... - Launch file dialog button text (full) - - - - - Choose a file - Caption for file open/save dialog - - - - - Choose a folder - Caption for directory open dialog - - - - - Any file + + An error occured while trying to open the log file. Logging to file is disabled. FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - - - - - - - IP filter line %1 is malformed. - - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - - - - - - IP filter exception thrown for line %1. Exception is: %2 - - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. + + + + I/O Error: Could not open ip filter file in read mode. - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. @@ -1993,395 +1544,472 @@ GeoIPDatabase - - + + Unsupported database file size. - + Metadata error: '%1' entry not found. - + Metadata error: '%1' entry has invalid type. - + Unsupported database version: %1.%2 - + Unsupported IP version: %1 - + Unsupported record size: %1 - + Invalid database type: %1 - + Database corrupted: no data section found. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s + + File - - Bad Http request, closing socket. IP: %s + + Edit - - - HttpServer - + + Help + + + + Exit qBittorrent - + Only one link per line - + + Download + + + + Global upload rate limit must be greater than 0 or disabled. - + Global download rate limit must be greater than 0 or disabled. - + Alternative upload rate limit must be greater than 0 or disabled. - + Alternative download rate limit must be greater than 0 or disabled. - + Maximum active downloads must be greater than -1. - + Maximum active uploads must be greater than -1. - + Maximum active torrents must be greater than -1. - + Maximum number of connections limit must be greater than 0 or disabled. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. - + Unable to save program preferences, qBittorrent is probably unreachable. - - IRC: #qbittorrent on Freenode + + Language - - Invalid category name: -Please do not use any special characters in the category name. + + The port used for incoming connections must be between 1 and 65535. - - Unknown + + The port used for the Web UI must be between 1 and 65535. - - Hard Disk + + Unable to log in, qBittorrent is probably unreachable. - - Share ratio limit must be between 0 and 9998. + + Invalid Username or Password. - - Seeding time limit must be between 0 and 525600 minutes. + + Password - - The port used for incoming connections must be between 1 and 65535. + + Login - - The port used for the Web UI must be between 1 and 65535. + + Upload Failed! - - Unable to log in, qBittorrent is probably unreachable. + + Original authors - - Invalid Username or Password. + + Upload limit: - - Username + + Download limit: - - Password + + Apply - - Login + + Add - - Original authors + + Category: - - Apply + + Upload Torrents + Upload torrent files to qBittorent using WebUI - - Add + + All - - Upload Torrents - Upload torrent files to qBittorent using WebUI + + Downloading - + + Seeding + + + + + Completed + + + + + Resumed + + + + + Paused + + + + + Active + + + + + Inactive + + + + Save files to location: - + Cookie: - + Type folder here - + + Run an external program on torrent completion + + + + + Enable bandwidth management (uTP) + + + + + Apply rate limit to uTP connections + + + + + Alternative Global Rate Limits + + + + More information - + Information about certificates - + Save Files to - - Set location + + Watch Folder - - Limit upload rate + + Default Folder - - Limit download rate + + from + from time1 to time2 - - Rename torrent + + to + from time1 to time2 - - Unable to create category + + Other... + Save Files to: Watch Folder / Default Folder / Other... - - Other... - Save Files to: Watch Folder / Default Folder / Other... + + Every day + Schedule the use of alternative rate limits on ... - + + Week days + Schedule the use of alternative rate limits on ... + + + + + Week ends + Schedule the use of alternative rate limits on ... + + + + Monday Schedule the use of alternative rate limits on ... - + Tuesday Schedule the use of alternative rate limits on ... - + Wednesday Schedule the use of alternative rate limits on ... - + Thursday Schedule the use of alternative rate limits on ... - + Friday Schedule the use of alternative rate limits on ... - + Saturday Schedule the use of alternative rate limits on ... - + Sunday Schedule the use of alternative rate limits on ... - + + Downloaded + Is the file downloaded or not? + + + + Logout - + + Download from URLs + + + + Download Torrents from their URLs or Magnet links - + Upload local torrent - + Are you sure you want to delete the selected torrents from the transfer list? - + Save - + qBittorrent client is not reachable - - qBittorrent has been shutdown. - - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets + + HTTP Server - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: - - Add subnet + + Torrent path - - Delete + + Torrent name - - Error + + qBittorrent has been shutdown. + + + LineEdit - - The entered subnet is invalid. + + Clear the text LogListWidget - + Copy - + Clear @@ -2414,549 +2042,490 @@ - + &View - + &Options... - + &Resume - + Torrent &Creator - + Set Upload Limit... - + Set Download Limit... - + Set Global Download Limit... - + Set Global Upload Limit... - + Minimum Priority - + Top Priority - + Decrease Priority - + Increase Priority - - + + Alternative Speed Limits - + &Top Toolbar - + Display Top Toolbar - - Status &Bar - - - - + S&peed in Title Bar - + Show Transfer Speed in Title Bar - + &RSS Reader - + Search &Engine - + L&ock qBittorrent - + Do&nate! - - Close Window - - - - + R&esume All - + Manage Cookies... - + Manage stored network cookies - + Normal Messages - + Information Messages - + Warning Messages - + Critical Messages - + &Log - + &Exit qBittorrent - + &Suspend System - + &Hibernate System - + S&hutdown System - + &Disabled - + &Statistics - + Check for Updates - + Check for Program Updates - + &About - + &Pause - + &Delete - + P&ause All - + &Add Torrent File... - + Open - + E&xit - + Open URL - + &Documentation - + Lock - - - + + + Show - + Check for program updates - + Add Torrent &Link... - + If you like qBittorrent, please donate! - - + Execution Log - + Clear the password - + Filter torrent list... - + &Set Password - - Preferences - - - - + &Clear Password - + Transfers - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? - + Icons Only - + Text Only - + Text Alongside Icons - + Text Under Icons - + Follow System Style - - - + + + UI lock password - - - + + + Please type the UI lock password: - + The password should contain at least 3 characters - + Password update - + The UI lock password has been successfully updated - + Are you sure you want to clear the password? - - Use regular expressions - - - - + Search - + Transfers (%1) - + Error - + Failed to add torrent: %1 - + Torrent added - + '%1' was added. e.g: xxx.avi was added. - + Download completion - + I/O Error i.e: Input/Output Error - + Recursive download confirmation - + Yes - + No - + Never - + Global Upload Speed Limit - + Global Download Speed Limit - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - - - - - Are you sure you want to quit qBittorrent? - - - - + &No - + &Yes - + &Always Yes - - %1/s - s is a shorthand for seconds - - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - + qBittorrent Update Available - + + A new version is available. +Do you want to download %1? + + + + Already Using the Latest qBittorrent Version - + Undetermined Python version - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2964,155 +2533,150 @@ - + The torrent '%1' contains torrent files, do you want to proceed with their download? - + Couldn't download file at URL '%1', reason: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - - + + Couldn't determine your Python version (%1). Search engine disabled. + + + + + Missing Python Interpreter - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? - + Python is required to use the search engine but it does not seem to be installed. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. - + &Check for Updates - + Checking for Updates... - + Already checking for program updates in the background - + Python found in '%1' - + Download error - + Python setup could not be downloaded, reason: %1. Please install it manually. - - + + Invalid password - - - + + RSS (%1) - + URL download error - + The password is invalid - - + + DL speed: %1 e.g: Download speed: 10 KiB/s - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version - + Hide - + Exiting qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + + + + Open Torrent Files - + Torrent Files - + Options were saved successfully. @@ -3120,52 +2684,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. - + Dynamic DNS error: hostname supplied does not exist under specified account. - + Dynamic DNS error: Invalid username/password. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. - + Dynamic DNS error: supplied domain name is invalid. - + Dynamic DNS error: supplied username is too short. - + Dynamic DNS error: supplied password is too short. @@ -3173,1413 +2737,1303 @@ Net::DownloadHandler - + I/O Error - + The file size is %1. It exceeds the download limit of %2. - + Unexpected redirect to magnet URI. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) + + + GeoIP database loaded. Type: %1. Build time: %2. - - The operation was canceled + + + Couldn't load GeoIP database. Reason: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed + + Venezuela, Bolivarian Republic of - - The connection to the remote server timed out + + Viet Nam - - SSL/TLS handshake failed + + + N/A - - The remote server refused the connection + + Andorra - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - - - - - - Couldn't load GeoIP database. Reason: %1 - - - - - Venezuela, Bolivarian Republic of - - - - - Viet Nam - - - - - - N/A + + United Arab Emirates - Andorra - - - - - United Arab Emirates - - - - Afghanistan - + Antigua and Barbuda - + Anguilla - + Albania - + Armenia - + Angola - + Antarctica - + Argentina - + American Samoa - + Austria - + Australia - + Aruba - + Azerbaijan - + Bosnia and Herzegovina - + Barbados - + Bangladesh - + Belgium - + Burkina Faso - + Bulgaria - + Bahrain - + Burundi - + Benin - + Bermuda - + Brunei Darussalam - + Brazil - + Bahamas - + Bhutan - + Bouvet Island - + Botswana - + Belarus - + Belize - + Canada - + Cocos (Keeling) Islands - + Congo, The Democratic Republic of the - + Central African Republic - + Congo - + Switzerland - + Cook Islands - + Chile - + Cameroon - + China - + Colombia - + Costa Rica - + Cuba - + Cape Verde - + Curacao - + Christmas Island - + Cyprus - + Czech Republic - + Germany - + Djibouti - + Denmark - + Dominica - + Dominican Republic - + Algeria - + Ecuador - + Estonia - + Egypt - + Western Sahara - + Eritrea - + Spain - + Ethiopia - + Finland - + Fiji - + Falkland Islands (Malvinas) - + Micronesia, Federated States of - + Faroe Islands - + France - + Gabon - + United Kingdom - + Grenada - + Georgia - + French Guiana - + Ghana - + Gibraltar - + Greenland - + Gambia - + Guinea - + Guadeloupe - + Equatorial Guinea - + Greece - + South Georgia and the South Sandwich Islands - + Guatemala - + Guam - + Guinea-Bissau - + Guyana - + Hong Kong - + Heard Island and McDonald Islands - + Honduras - + Croatia - + Haiti - + Hungary - + Indonesia - + Ireland - + Israel - + India - + British Indian Ocean Territory - + Iraq - + Iran, Islamic Republic of - + Iceland - + Italy - + Jamaica - + Jordan - + Japan - + Kenya - + Kyrgyzstan - + Cambodia - + Kiribati - + Comoros - + Saint Kitts and Nevis - + Korea, Democratic People's Republic of - + Korea, Republic of - + Kuwait - + Cayman Islands - + Kazakhstan - + Lao People's Democratic Republic - + Lebanon - + Saint Lucia - + Liechtenstein - + Sri Lanka - + Liberia - + Lesotho - + Lithuania - + Luxembourg - + Latvia - + Morocco - + Monaco - + Moldova, Republic of - + Madagascar - + Marshall Islands - + Mali - + Myanmar - + Mongolia - + Northern Mariana Islands - + Martinique - + Mauritania - + Montserrat - + Malta - + Mauritius - + Maldives - + Malawi - + Mexico - + Malaysia - + Mozambique - + Namibia - + New Caledonia - + Niger - + Norfolk Island - + Nigeria - + Nicaragua - + Netherlands - + Norway - + Nepal - + Nauru - + Niue - + New Zealand - + Oman - + Panama - + Peru - + French Polynesia - + Papua New Guinea - + Philippines - + Pakistan - + Poland - + Saint Pierre and Miquelon - + Puerto Rico - + Portugal - + Palau - + Paraguay - + Qatar - + Reunion - + Romania - + Russian Federation - + Rwanda - + Saudi Arabia - + Solomon Islands - + Seychelles - + Sudan - + Sweden - + Singapore - + Slovenia - + Svalbard and Jan Mayen - + Slovakia - + Sierra Leone - + San Marino - + Senegal - + Somalia - + Suriname - + Sao Tome and Principe - + El Salvador - + Syrian Arab Republic - + Swaziland - + Turks and Caicos Islands - + Chad - + French Southern Territories - + Togo - + Thailand - + Tajikistan - + Tokelau - + Turkmenistan - + Tunisia - + Tonga - - Could not decompress GeoIP database file. - - - - + Timor-Leste - + Bolivia, Plurinational State of - + Bonaire, Sint Eustatius and Saba - + Cote d'Ivoire - + Libya - + Saint Martin (French part) - + Macedonia, The Former Yugoslav Republic of - + Macao - + Pitcairn - + Palestine, State of - + Saint Helena, Ascension and Tristan da Cunha - + South Sudan - + Sint Maarten (Dutch part) - + Turkey - + Trinidad and Tobago - + Tuvalu - + Taiwan - + Tanzania, United Republic of - + Ukraine - + Uganda - + United States Minor Outlying Islands - + United States - + Uruguay - + Uzbekistan - + Holy See (Vatican City State) - + Saint Vincent and the Grenadines - + Virgin Islands, British - + Virgin Islands, U.S. - + Vanuatu - + Wallis and Futuna - + Samoa - + Yemen - + Mayotte - + Serbia - + South Africa - + Zambia - + Montenegro - + Zimbabwe - + Aland Islands - + Guernsey - + Isle of Man - + Jersey - + Saint Barthelemy - + + Could not uncompress GeoIP database file. + + + + Couldn't save downloaded GeoIP database file. - + Successfully updated GeoIP database. - + Couldn't download GeoIP database file. Reason: %1 @@ -4587,12 +4041,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] - + UPnP / NAT-PMP support [OFF] @@ -4600,7 +4054,7 @@ Net::Smtp - + Email Notification Error: @@ -4608,1273 +4062,1077 @@ OptionsDialog - + Options - + Behavior - + Downloads - + Connection - + Speed - + BitTorrent - - RSS - - - - + Web UI - + Advanced - + Language - + User Interface Language: - + (Requires restart) - + Transfer List - + Confirm when deleting torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. - + Hide zero and infinity values - + Always - + Paused torrents only - + Action on double-click - + Downloading torrents: - - + + Start / Stop Torrent - - + + Open destination folder - - + + No action - + Completed torrents: - + Desktop - + Start qBittorrent on Windows start up - + Show splash screen on start up - + Start qBittorrent minimized - + Confirmation on exit when torrents are active - + Confirmation on auto-exit when downloads finish - - KiB - - - - - Email notification &upon download completion - - - - - Run e&xternal program on torrent completion - - - - - IP Fi&ltering - - - - - Schedule &the use of alternative rate limits - - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - - - - &Torrent Queueing - - - - - Seed torrents until their seeding time reaches - - - - - A&utomatically add these trackers to new downloads: - - - - - RSS Reader - - - - - Enable fetching RSS feeds - - - - - Feeds refresh interval: - - - - - Maximum number of articles per feed: - - - - - - min - minutes - - - - - RSS Torrent Auto Downloader - - - - - Enable auto downloading of RSS torrents - - - - - Edit auto downloading rules... - - - - - Web User Interface (Remote control) - - - - - IP address: - - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - - - - - Server domains: - - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - - - - - &Use HTTPS instead of HTTP - - - - - Bypass authentication for clients on localhost - - - - - Bypass authentication for clients in whitelisted IP subnets + + Show qBittorrent in notification area - - IP subnet whitelist... - - - - - Upda&te my dynamic domain name - - - - + Minimize qBittorrent to notification area - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. - + Tray icon style: - + Normal - + Monochrome (Dark theme) - + Monochrome (Light theme) - + File association - + Use qBittorrent for .torrent files - + Use qBittorrent for magnet links - + Power Management - + + Inhibit system sleep when torrents are active + + + + + Log file + + + + Save path: - + Backup the log file after: - + + MB + + + + Delete backup logs older than: - + days Delete backup logs older than 10 months - + months Delete backup logs older than 10 months - + years Delete backup logs older than 10 years - + When adding a torrent - + + Display torrent content and some options + + + + Bring torrent dialog to the front - + Do not start the download automatically The torrent will be added to download list in pause state - + Should the .torrent file be deleted after adding it - + + Delete .torrent files afterwards + + + + Also delete .torrent files whose addition was cancelled - + Also when addition is cancelled - + Warning! Data loss possible! - + Saving Management - + Default Torrent Management Mode: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - + Manual - + Automatic - + When Torrent Category changed: - + Relocate torrent - + Switch torrent to Manual Mode - + When Default Save Path changed: - - + + Relocate affected torrents - - + + Switch affected torrents to Manual Mode - + When Category changed: - - Use Subcategories - - - - - Default Save Path: - - - - - Keep incomplete torrents in: - - - - - Copy .torrent files to: - - - - - Show &qBittorrent in notification area - - - - - &Log file + + Use Subcategories - - Display &torrent content and some options + + Default Save Path: - - Create subfolder for torrents with multiple files + + Keep incomplete torrents in: - - De&lete .torrent files afterwards + + Copy .torrent files to: - + Copy .torrent files for finished downloads to: - + Pre-allocate disk space for all files - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding + + Append .!qB extension to incomplete files - - Append .!qB extension to incomplete files + + Automatically add torrents from: - - Enable recursive download dialog + + Add entry - - Automatically add torrents from: + + Remove entry - - Add entry + + Email notification upon download completion - - Remove entry + + Destination email: - + SMTP server: - + This server requires a secure connection (SSL) - - + + + Authentication - - - - + + + + Username: - - - - + + + + Password: - - Enabled protocol: - - - - - TCP and μTP + + Run external program on torrent completion - + Listening Port - + Port used for incoming connections: - + Random - + Use UPnP / NAT-PMP port forwarding from my router - + Use different port on each startup - + Connections Limits - + Maximum number of connections per torrent: - + Global maximum number of connections: - + Maximum number of upload slots per torrent: - + Global maximum number of upload slots: - + Proxy Server - + Type: - + (None) - + SOCKS4 - + SOCKS5 - + HTTP - + Host: - - + + Port: - + Otherwise, the proxy server is only used for tracker connections - + Use proxy for peer connections - + Disable connections not supported by proxies - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - + Use proxy only for torrents - - A&uthentication + + Info: The password is saved unencrypted - - Info: The password is saved unencrypted + + IP Filtering - + Filter path (.dat, .p2p, .p2b): - + Reload the filter - - Manually banned IP addresses... - - - - + Apply to trackers - + Global Rate Limits - - - - - - - KiB/s + + + Upload: - - - Upload: + + + + + KiB/s - - + + Download: - + Alternative Rate Limits - - + + Schedule the use of alternative rate limits + + + + From: from (time1 to time2) - - + To: time1 to time2 - + When: - + Every day - + Weekdays - + Weekends - + Rate Limits Settings - + Apply rate limit to peers on LAN - + Apply rate limit to transport overhead - - + + + Enable µTP protocol + + + + Apply rate limit to µTP protocol - + Privacy - + Enable DHT (decentralized network) to find more peers - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers - + Look for peers on your local network - + Enable Local Peer Discovery to find more peers - + Encryption mode: - + Prefer encryption - + Require encryption - + Disable encryption - + Enable when using a proxy or a VPN connection - + Enable anonymous mode - - Maximum active downloads: - - - - - Maximum active uploads: - - - - - Maximum active torrents: + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - Do not count slow torrents in these limits + + Torrent Queueing - - Upload rate threshold: + + Maximum active downloads: - - Download rate threshold: + + Maximum active uploads: - - sec - seconds + + Maximum active torrents: - - Torrent inactivity timer: + + Do not count slow torrents in these limits - + Share Ratio Limiting - + Seed torrents until their ratio reaches - + then - + Pause them - + Remove them - - RSS Smart Episode Filters + + Automatically add these trackers to new downloads: - - Use UPnP / NAT-PMP to forward the port from my router + + Enable Web User Interface (Remote control) - - Certificate: + + Use UPnP / NAT-PMP to forward the port from my router - - Import SSL Certificate + + Use HTTPS instead of HTTP - - Key: + + Certificate: - - Import SSL Key + + Import SSL Certificate - - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> + + Key: - - Use alternative Web UI + + Import SSL Key - - Files location: + + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - - Enable clickjacking protection + + Bypass authentication for localhost - - Enable Cross-Site Request Forgery (CSRF) protection + + Update my dynamic domain name - + Service: - + Register - + Domain name: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): - + %N: Torrent name - + %L: Category - - %G: Tags (seperated by comma) - - - - + %F: Content path (same as root path for multifile torrent) - + %R: Root path (first torrent subdirectory path) - + %D: Save path - + %C: Number of files - + %Z: Torrent size (bytes) - + %T: Current tracker - + %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor - + Folder is already being monitored: - + Folder does not exist: - + Folder is not readable: - + Adding entry failed - - - - + + Choose export directory - - - + + + + + + Choose a save directory - + Choose an IP filter file - + All supported filters - + SSL Certificate - + + SSL Key + + + + Parsing error - + Failed to parse the provided IP filter - + Successfully refreshed - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Invalid key - + This is not a valid SSL key. - + Invalid certificate - - Preferences - - - - - Import SSL certificate - - - - + This is not a valid SSL certificate. - - Import SSL key - - - - - SSL key - - - - + Time Error - + The start time and the end time can't be the same. - - + + Length Error - + The Web UI username must be at least 3 characters long. - + The Web UI password must be at least 6 characters long. @@ -5882,72 +5140,72 @@ PeerInfo - - Interested(local) and Choked(peer) + + interested(local) and choked(peer) - + interested(local) and unchoked(peer) - + interested(peer) and choked(local) - + interested(peer) and unchoked(local) - + optimistic unchoke - + peer snubbed - + incoming connection - + not interested(local) and unchoked(peer) - + not interested(peer) and unchoked(local) - + peer from PEX - + peer from DHT - + encrypted traffic - + encrypted handshake - + peer from LSD @@ -5955,180 +5213,165 @@ PeerListWidget - + IP - + Port - + Flags - + Connection - + Client i.e.: Client application - + Progress i.e: % downloaded - + Down Speed i.e: Download speed - + Up Speed i.e: Upload speed - + Downloaded i.e: total data downloaded - + Uploaded i.e: total data uploaded - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. - + Files i.e. files that are being downloaded right now - + Column visibility - + Add a new peer... - - + + Ban peer permanently - + Manually adding peer '%1'... - + The peer '%1' could not be added to this torrent. - + Manually banning peer '%1'... - - + + Peer addition - + Country - + Copy IP:port - + Some peers could not be added. Check the Log for details. - + The peers were added to this torrent. - + Are you sure you want to ban permanently the selected peers? - + &Yes - + &No - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - + PeersAdditionDlg - - Format: IPv4:port / [IPv6]:port - - - - + No peer entered - + Please type at least one peer. - + Invalid peer - + The peer '%1' is invalid. @@ -6136,12 +5379,12 @@ PieceAvailabilityBar - + White: Unavailable pieces - + Blue: Available pieces @@ -6149,336 +5392,288 @@ PiecesBar - + Files in this piece: - + File in this piece - + File in these pieces - - Wait until metadata become available to see detailed information - - - - + Hold Shift key for detailed information - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Installed search plugins: - + Name - + Version - + Url - - + + Enabled - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Check for updates - + Close - + Uninstall - - - + + + Yes - - - - + + + + No - + Uninstall warning - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Uninstall success - + All selected plugins were uninstalled successfully - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - - - - - + + New search engine plugin URL - - + + URL: - + Invalid link - + The link doesn't seem to point to a search engine plugin. - + Select search plugins - + qBittorrent search plugin - + + + + Search plugin update + + + + All your plugins are already up to date. - + Sorry, couldn't check for plugin updates. %1 - + + + Search plugin install - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + + + + Couldn't install "%1" search engine plugin. %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + + + + Couldn't update "%1" search engine plugin. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Search plugin source: - + Local file - + Web link - PowerManagement - - - qBittorrent is active - - - - - PreviewSelectDialog + PreviewSelect - - Preview - - - - + Name - + Size - + Progress - - + + Preview impossible - - + + Sorry, we can't preview this file - Private::FileLineEdit - - - '%1' does not exist - - - - - '%1' does not point to a directory - - - - - '%1' does not point to a file - - - - - Does not have read permission in '%1' - - - - - Does not have write permission in '%1' - - - - PropListDelegate - + Not downloaded - - + + Normal Normal (priority) - - N/A - - - - + Do not download Do not download (priority) - - + + High High (priority) - + Mixed Mixed (priorities - - + + Maximum Maximum (priority) @@ -6487,32 +5682,32 @@ PropTabBar - + General - + Trackers - + Peers - + HTTP Sources - + Content - + Speed @@ -6606,22 +5801,22 @@ - + Select All - + Select None - + Normal - + High @@ -6681,165 +5876,165 @@ - + Maximum + - Do not download - + Never - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) - - + + %1 (%2 this session) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) - + Open - + Open Containing Folder - + Rename... - + Priority - + New Web seed - + Remove Web seed - + Copy Web seed URL - + Edit Web seed URL - - New name: + + Rename the file - - - This name is already in use in this folder. Please use a different name. + + New name: - - The folder could not be renamed + + + The file could not be renamed - - qBittorrent + + This file name contains forbidden characters, please choose a different one. - - Filter files... + + + This name is already in use in this folder. Please use a different name. - - Renaming + + The folder could not be renamed - - - Rename error + + qBittorrent - - The name is empty or contains forbidden characters, please choose a different one. + + Filter files... - + New URL seed New HTTP source - + New URL seed: - - + + This URL seed is already in the list. - + Web seed editing - + Web seed URL: @@ -6847,583 +6042,548 @@ QObject - - %1 is an unknown command line parameter. - --random-parameter is an unknown command line parameter. - - - - - - %1 must be the single command line parameter. - - - - - You cannot use %1: qBittorrent is already running for this user. - - - - - Usage: - - - - - Options: - - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - - - - - Expected integer number in environment variable '%1', but got '%2' - - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - - - - - Expected %1 in environment variable '%2', but got '%3' - - - - - port - - - - - %1 must specify a valid port (1 to 65535). - - - - - Display program version and exit - - - - - Display this help message and exit - - - - - Change the Web UI port - - - - - Disable splash screen - - - - - Run in daemon-mode (background) + + Your IP address has been banned after too many failed authentication attempts. - - dir - Use appropriate short form or abbreviation of "directory" + + Error: '%1' is not a valid torrent file. + - - Store configuration files in <dir> + + Error: Could not add torrent to session. - - - name + + I/O Error: Could not create temporary file. - - Store configuration files in directories qBittorrent_<name> + + %1 is an unknown command line parameter. + --random-parameter is an unknown command line parameter. - - Hack into libtorrent fastresume files and make file paths relative to the profile directory + + + %1 must be the single command line parameter. - - files or URLs + + %1 must specify the correct port (1 to 65535). - - Download the torrents passed by the user + + You cannot use %1: qBittorrent is already running for this user. - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. + + Usage: - - Options when adding new torrents: + + Options: - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume + + Displays program version - - path + + Displays this help message - - Torrent save path + + Changes the Web UI port (current: %1) - - Add torrents as started or paused + + Disable splash screen - - Skip hash check + + Run in daemon-mode (background) - - Assign torrents to category. If the category doesn't exist, it will be created. + + Downloads the torrents passed by the user - - Download files in sequential order + + Help - - Download first and last pieces first + + Run application with -h option to read about command line parameters. - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: + + Bad command line - - Command line parameters take precedence over environment variables + + Bad command line: - - Help + + Legal Notice - - Run application with -h option to read about command line parameters. + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. - - Bad command line + + Press %1 key to accept and continue... - - Bad command line: + + Legal notice - - Legal Notice + + Cancel - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + + I Agree - - No further notices will be issued. + + Torrent name: %1 - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. + + Torrent size: %1 - - Press %1 key to accept and continue... + + Save path: %1 - - Legal notice + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds - - Cancel + + Thank you for using qBittorrent. - - I Agree + + [qBittorrent] '%1' has finished downloading - - - Upgrade + + The remote host name was not found (invalid hostname) - - You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] + + The operation was canceled - - You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. + + The remote server closed the connection prematurely, before the entire reply was received and processed - - Couldn't migrate torrent with hash: %1 + + The connection to the remote server timed out - - Couldn't migrate torrent. Invalid fastresume file name: %1 + + SSL/TLS handshake failed - - Detected unclean program exit. Using fallback file to restore settings: %1 + + The remote server refused the connection - - An access error occurred while trying to write the configuration file. + + The connection to the proxy server was refused - - A format error occurred while trying to write the configuration file. + + The proxy server closed the connection prematurely - - An unknown error occurred while trying to write the configuration file. + + The proxy host name was not found - - - RSS::AutoDownloader - - - Invalid data format. + + The connection to the proxy timed out or the proxy did not reply in time to the request sent - - Couldn't save RSS AutoDownloader data in %1. Error: %2 + + The proxy requires authentication in order to honor the request but did not accept any credentials offered - - Invalid data format + + The access to the remote content was denied (401) - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 + + The operation requested on the remote content is not permitted - - Couldn't load RSS AutoDownloader rules. Reason: %1 + + The remote content was not found at the server (404) - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 + + The remote server requires authentication to serve the content but the credentials provided were not accepted - - RSS feed at '%1' updated. Added %2 new articles. + + The Network Access API cannot honor the request because the protocol is not known - - Failed to parse RSS feed at '%1'. Reason: %2 + + The requested operation is invalid for this protocol - - Couldn't read RSS Session data from %1. Error: %2 + + An unknown network-related error was detected - - Couldn't parse RSS Session data. Error: %1 + + An unknown proxy-related error was detected - - Couldn't load RSS Session data. Invalid data format. + + An unknown error related to the remote content was detected - - Couldn't load RSS article '%1#%2'. Invalid data format. + + A breakdown in protocol was detected - - - RSS::Private::Parser - - Invalid RSS feed. + + Unknown error - - %1 (line: %2, column: %3, offset: %4). + + + Upgrade - - - RSS::Session - - RSS feed with given URL already exists: %1. + + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - - Cannot move root folder. + + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - - - Item doesn't exist: %1. + + Couldn't migrate torrent with hash: %1 - - Cannot delete root folder. + + Couldn't migrate torrent. Invalid fastresume file name: %1 - - Incorrect RSS Item path: %1. + + Detected unclean program exit. Using fallback file to restore settings. - - RSS item with given path already exists: %1. + + An access error occurred while trying to write the configuration file. - - Parent folder doesn't exist: %1. + + A format error occurred while trying to write the configuration file. - RSSWidget + RSS - + Search - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - - - - + New subscription - - - + + + Mark items read - - Refresh RSS streams + + Update all - - Update all + + RSS Downloader... - - RSS Downloader... + + Settings... - + Torrents: (double-click to download) - - + + Delete - + Rename... - + Rename - - + + Update - + New subscription... - - + + Update all feeds - + Download torrent - + Open news URL - + Copy feed URL - + New folder... - - Please choose a folder name + + Refresh RSS streams + + + RSSImp - - Folder name: + + Stream URL: - - New folder + + Please type a RSS stream URL + + + + + This RSS feed is already in the list. - - Please type a RSS feed URL + + Please choose a folder name + + + + + Folder name: - - Feed URL: + + New folder - + Deletion confirmation - + Are you sure you want to delete the selected RSS feeds? - + Please choose a new name for this RSS feed - + New feed name: - - Rename failed + + Name already in use + + + + + This name is already used by another item, please choose another one. - + Date: - + Author: + + + Unread + + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + + + + + Rss::Private::Parser + + + Invalid RSS feed. + + + + + RssSettingsDlg + + + RSS Reader Settings + + + + + RSS feeds refresh interval: + + + + + min + + + + + Maximum number of articles per feed: + + ScanFoldersDelegate - + Select save location @@ -7431,273 +6591,267 @@ ScanFoldersModel - + Monitored Folder - + Override Save Location - + Monitored folder - + Default save location - + Browse... - SearchJobWidget + SearchEngine - - Form + + Unknown search engine plugin file format. - - Results(xxx) + + A more recent version of this plugin is already installed. - - Search in: + + + Plugin is not supported. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + + Update server is temporarily unavailable. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + + + Failed to download the plugin file. %1 - - Seeds: + + An incorrect update info received. - - <html><head/><body><p>Minimal number of seeds</p></body></html> + + All categories - - - to + + Movies - - <html><head/><body><p>Maximal number of seeds</p></body></html> + + TV shows - - - + + Music - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + + Games - - Size: + + Anime - - <html><head/><body><p>Minimal torrent size</p></body></html> + + Software - - <html><head/><body><p>Maximal torrent size</p></body></html> + + Pictures + + + + + Books + + + + + SearchListDelegate + + + + Unknown + + + SearchTab - + Name i.e: file name - + Size i.e: file size - + Seeders i.e: Number of full sources - + Leechers i.e: Number of partial sources - + Search engine - - Filter search results... - - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Torrent names only - + Everywhere - - Use regular expressions - - - - + Searching... - + Search has finished - + Search aborted - + An error occurred during search... - + Search returned no results - + Column visibility - - - SearchPluginManager - - - Unknown search engine plugin file format. - - - - - A more recent version of this plugin is already installed. - - - - - Plugin is not supported. + + Form - - All categories + + Results(xxx) - - Movies + + Search in: - - TV shows + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - - Music + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - - Games + + Seeds: - - Anime + + <html><head/><body><p>Minimal number of seeds</p></body></html> - - Software + + + to - - Pictures + + <html><head/><body><p>Maximal number of seeds</p></body></html> - - - Books + + + + - - Update server is temporarily unavailable. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - - - Failed to download the plugin file. %1 + + Size: - - An incorrect update info received. + + <html><head/><body><p>Minimal torrent size</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> @@ -7706,197 +6860,185 @@ - - - - + + + Search - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - - + Download - + Go to description page - + Copy description page URL - + Search plugins... - + A phrase to search for. - + Spaces in a search term may be protected by double quotes. - + Example: Search phrase example - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - + All plugins - + Only enabled - + Select... - - - + + + Search Engine - + Please install Python to use the Search Engine. - + Empty search pattern - + Please type a search pattern first - + Stop - + Search has finished - + Search has failed - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + E&xit Now - + Exit confirmation - + The computer is going to shutdown. - + &Shutdown Now - - Shutdown confirmation - - - - + The computer is going to enter suspend mode. - + &Suspend Now - + Suspend confirmation - + The computer is going to enter hibernation mode. - + &Hibernate Now - + Hibernate confirmation - + You can cancel the action within %1 seconds. + + + Shutdown confirmation + + SpeedLimitDialog - + KiB/s @@ -7904,52 +7046,52 @@ SpeedPlotView - + Total Upload - + Total Download - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - + DHT Download - + Tracker Upload - + Tracker Download @@ -7957,95 +7099,87 @@ SpeedWidget - + Period: - + 1 Minute - + 5 Minutes - + 30 Minutes - + 6 Hours - + Select Graphs - + Total Upload - + Total Download - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - + DHT Download - + Tracker Upload - + Tracker Download - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8058,48 +7192,48 @@ - - Cache statistics + + Total peer connections: - - Read cache hits: + + Global ratio: - - Average time in queue: + + Alltime download: - - Connected peers: + + Alltime upload: - - All-time share ratio: + + Total waste (this session): - - All-time download: + + Cache statistics - - Session waste: + + Read cache hits: - - All-time upload: + + Average time in queue: - Total buffer size: + Total buffers size: @@ -8128,7 +7262,12 @@ - + + OK + + + + %1 ms 18 milliseconds @@ -8137,915 +7276,655 @@ StatusBar - + Connection status: - + No direct connections. This may indicate network configuration problems. - + - DHT: %1 nodes - - - - - qBittorrent needs to be restarted! - - - - - - Connection Status: - - - - - Offline. This usually means that qBittorrent failed to listen on the selected port for incoming connections. - - - - - Online - - - - - Click to switch to alternative speed limits - - - - - Click to switch to regular speed limits - - - - - Global Download Speed Limit - - - - - Global Upload Speed Limit - - - - - StatusFilterWidget - - - All (0) - this is for the status filter - - - - - Downloading (0) - - - - - Seeding (0) - - - - - Completed (0) - - - - - Resumed (0) - - - - - Paused (0) - - - - - Active (0) - - - - - Inactive (0) - - - - - Errored (0) - - - - - All (%1) - - - - - Downloading (%1) - - - - - Seeding (%1) - - - - - Completed (%1) - - - - - Paused (%1) - - - - - Resumed (%1) - - - - - Active (%1) - - - - - Inactive (%1) - - - - - Errored (%1) - - - - - TagFilterModel - - - Tags - - - - - All - - - - - Untagged - - - - - TagFilterWidget - - - Add tag... - - - - - Remove tag - - - - - Remove unused tags - - - - - Resume torrents - - - - - Pause torrents - - - - - Delete torrents - - - - - New Tag - - - - - Tag: - - - - - Invalid tag name - - - - - Tag name '%1' is invalid - - - - - Tag exists - - - - - Tag name already exists. - - - - - TorrentCategoryDialog - - - Torrent Category Properties - - - - - Name: - - - - - Save path: - - - - - Choose save path - - - - - New Category + DHT: %1 nodes - - Invalid category name + + qBittorrent needs to be restarted - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. + + qBittorrent was just updated and needs to be restarted for the changes to be effective. - - Category creation error + + + Connection Status: - - Category with the given name already exists. -Please choose a different name and try again. + + Offline. This usually means that qBittorrent failed to listen on the selected port for incoming connections. - - - TorrentContentModel - - Name + + Online - - Size + + Click to switch to alternative speed limits - - Progress + + Click to switch to regular speed limits - - Download Priority + + Manual change of rate limits mode. The scheduler is disabled. - - Remaining + + Global Download Speed Limit - - Availability + + Global Upload Speed Limit - TorrentCreatorDialog + StatusFiltersWidget - - Torrent Creator + + All (0) + this is for the status filter - - Select file/folder to share + + Downloading (0) - - Path: + + Seeding (0) - - [Drag and drop area] + + Completed (0) - - - Select file + + Resumed (0) - - - Select folder + + Paused (0) - - Settings + + Active (0) - - Piece size: + + Inactive (0) - - Auto + + Errored (0) - - 16 KiB + + All (%1) - - 32 KiB + + Downloading (%1) - - 64 KiB + + Seeding (%1) - - 128 KiB + + Completed (%1) - - 256 KiB + + Paused (%1) - - 512 KiB + + Resumed (%1) - - 1 MiB + + Active (%1) - - 2 MiB + + Inactive (%1) - - 4 MiB + + Errored (%1) + + + TorrentContentModel - - 8 MiB + + Name - - 16 MiB + + Size + + + + + Progress - - 32 MiB + + Download Priority - - Calculate number of pieces: + + Remaining + + + TorrentCreatorDlg - - Private torrent (Won't distribute on DHT network) + + Select a folder to add to the torrent - - Start seeding immediately + + Select a file to add to the torrent - - Ignore share ratio limits for this torrent + + No input path set - - Optimize alignment + + Please type an input path first - - Fields + + Select destination torrent file - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + + Torrent Files (*.torrent) - - Web seed URLs: + + Torrent was created successfully: %1 + %1 is the path of the torrent - - Tracker URLs: + + + + Torrent creation - - Comments: + + Torrent creation was unsuccessful, reason: %1 - - Source: + + Created torrent file is invalid. It won't be added to download list. + + + TorrentModel - - Progress: + + Name + i.e: torrent name - - Create Torrent + + Size + i.e: torrent size - - - - Torrent creation failed + + Done + % Done - - Reason: Path to file/folder is not readable. + + Status + Torrent status (e.g. downloading, seeding, paused) - - Select where to save the new torrent + + Seeds + i.e. full sources (often untranslated) - - Torrent Files (*.torrent) + + Peers + i.e. partial sources (often untranslated) - - Reason: %1 + + Down Speed + i.e: Download speed - - Reason: Created torrent is invalid. It won't be added to download list. + + Up Speed + i.e: Upload speed - - Torrent creator + + Ratio + Share ratio - - Torrent created: + + ETA + i.e: Estimated Time of Arrival / Time left - - - TorrentInfo - - File size exceeds max limit %1 + + Category - - Torrent file read error: %1 + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 - - Torrent file read error: size mismatch + + Completed On + Torrent was completed on 01/01/2010 08:00 - - - TorrentsController - - Not contacted yet + + Tracker - - Updating... + + Down Limit + i.e: Download limit - - Working + + Up Limit + i.e: Upload limit - - Not working + + Downloaded + Amount of data downloaded (e.g. in MB) - - Error: '%1' is not a valid torrent file. + + Uploaded + Amount of data uploaded (e.g. in MB) - - - - - Torrent queueing must be enabled + + Session Download + Amount of data downloaded since program open (e.g. in MB) - - Save path cannot be empty + + Session Upload + Amount of data uploaded since program open (e.g. in MB) - - - Category cannot be empty + + Remaining + Amount of data left to download (e.g. in MB) - - Unable to create category + + Time Active + Time (duration) the torrent is active (not paused) - - Unable to edit category + + Save path + Torrent save path - - Cannot make save path + + Completed + Amount of data completed (e.g. in MB) - - Cannot write to directory + + Ratio Limit + Upload share ratio limit - - WebUI Set location: moving "%1", from "%2" to "%3" + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole - - Incorrect torrent name + + Last Activity + Time passed since a chunk was downloaded/uploaded - - - Incorrect category name + + Total Size + i.e. Size including unwanted data TrackerFiltersList - + All (0) this is for the tracker filter - + Trackerless (0) - + Error (0) - + Warning (0) - - + + Trackerless (%1) - - + + Error (%1) - - + + Warning (%1) - + Resume torrents - + Pause torrents - + Delete torrents - - + + All (%1) this is for the tracker filter - TrackerListWidget - - - - Working - - - - - Disabled - - + TrackerList - - This torrent is private + + URL - - Updating... + + Status - - Not working + + Received - - Not contacted yet + + Seeds - - - - - - - N/A + + Peers - - Tracker editing + + Downloaded - - Tracker URL: + + Message - - - Tracker editing failed + + + Working - - The tracker URL entered is invalid. + + Disabled - - The tracker URL already exists. + + This torrent is private - - Add a new tracker... + + Updating... - - Remove tracker + + Not working - - Copy tracker URL + + Not contacted yet - - Edit selected tracker URL + + Tracker URL: - - Force reannounce to selected trackers + + Tracker editing - - Force reannounce to all trackers + + + Tracker editing failed - - URL + + The tracker URL entered is invalid. - - Status + + The tracker URL already exists. - - Received + + Add a new tracker... - - Seeds + + Copy tracker URL - - Peers + + Edit selected tracker URL - - Downloaded + + Force reannounce to selected trackers - - Message + + Force reannounce to all trackers - - Column visibility + + Remove tracker - TrackerLoginDialog - - - - Tracker authentication - - - - - Tracker: - - - - - Login - - - - - Username: - - + TrackersAdditionDlg - - Password: + + Trackers addition dialog - - Log in + + List of trackers to add (one per line): - - - TrackersAdditionDialog - - - Trackers addition dialog + + + µTorrent compatible list URL: - - List of trackers to add (one per line): + + I/O Error - - µTorrent compatible list URL: + + Error while trying to open the downloaded file. - + No change - + No additional trackers were found. - + Download error - + The trackers list could not be downloaded, reason: %1 @@ -9053,105 +7932,99 @@ TransferListDelegate - + Downloading - + Downloading metadata used when loading a magnet link - + Allocating qBittorrent is allocating the files on disk - + Paused - + Queued i.e. torrent is queued - + Seeding Torrent is complete and in upload-only mode - + Stalled Torrent is waiting for download to begin - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. - + Checking Torrent local data is being checked - + Queued for checking i.e. torrent is queued for hash checking - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - + Completed - - Moving - Torrent local data are being moved/relocated - - - - + Missing Files - + Errored torrent status, the torrent has an error - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - + %1 ago e.g.: 1h 20m ago @@ -9160,579 +8033,591 @@ TransferListFiltersWidget - + Status - + Categories - - Tags - - - - + Trackers - TransferListModel + TransferListWidget - - Name - i.e: torrent name + + Column visibility - - Size - i.e: torrent size + + Choose save path + + + + + Torrent Download Speed Limiting + + + + + Torrent Upload Speed Limiting + + + + + Recheck confirmation + + + + + Are you sure you want to recheck the selected torrent(s)? - - Done - % Done + + Rename - - Status - Torrent status (e.g. downloading, seeding, paused) + + New name: - - Seeds - i.e. full sources (often untranslated) + + Resume + Resume/start the torrent - - Peers - i.e. partial sources (often untranslated) + + Force Resume + Force Resume/start the torrent - - Down Speed - i.e: Download speed + + Pause + Pause the torrent - - Up Speed - i.e: Upload speed + + New Category - - Ratio - Share ratio + + Category: - - ETA - i.e: Estimated Time of Arrival / Time left + + Invalid category name - - Category + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. - - Tags + + Delete + Delete the torrent - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 + + Preview file... - - Completed On - Torrent was completed on 01/01/2010 08:00 + + Limit share ratio... - - Tracker + + Limit upload rate... - - Down Limit - i.e: Download limit + + Limit download rate... - - Up Limit - i.e: Upload limit + + Open destination folder - - Downloaded - Amount of data downloaded (e.g. in MB) + + Move up + i.e. move up in the queue - - Uploaded - Amount of data uploaded (e.g. in MB) + + Move down + i.e. Move down in the queue - - Session Download - Amount of data downloaded since program open (e.g. in MB) + + Move to top + i.e. Move to top of the queue - - Session Upload - Amount of data uploaded since program open (e.g. in MB) + + Move to bottom + i.e. Move to bottom of the queue - - Remaining - Amount of data left to download (e.g. in MB) + + Set location... - - Time Active - Time (duration) the torrent is active (not paused) + + Copy name - - Save path - Torrent save path + + Download first and last pieces first - - Completed - Amount of data completed (e.g. in MB) + + Automatic Torrent Management - - Ratio Limit - Upload share ratio limit + + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole + + Category - - Last Activity - Time passed since a chunk was downloaded/uploaded + + New... + New category... - - Total Size - i.e. Size including unwanted data + + Reset + Reset category - - - TransferListWidget - - Column visibility + + Priority - - Choose save path + + Force recheck - - Torrent Download Speed Limiting + + Copy magnet link - - Torrent Upload Speed Limiting + + Super seeding mode - - Recheck confirmation + + Rename... - - Are you sure you want to recheck the selected torrent(s)? + + Download in sequential order + + + UpDownRatioDlg - - Rename + + Torrent Upload/Download Ratio Limiting - - New name: + + Use global ratio limit - - Resume - Resume/start the torrent + + + + buttonGroup - - Force Resume - Force Resume/start the torrent + + Set no ratio limit - - Pause - Pause the torrent + + Set ratio limit to + + + WebApplication - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" + + Incorrect category name + + + WebUI - - Add Tags + + The Web UI is listening on port %1 - - Remove All Tags + + Web UI Error - Unable to bind Web UI to port %1 + + + about - - Remove all tags from selected torrents? + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - Comma-separated tags: + + Copyright %1 2006-2016 The qBittorrent project - - Invalid tag + + Home Page: - - Tag name: '%1' is invalid + + Forum: - - Delete - Delete the torrent + + Bug Tracker: + + + addPeersDialog - - Preview file... + + Add Peers - - Limit share ratio... + + List of peers to add (one per line): - - Limit upload rate... + + Format: IPv4:port / [IPv6]:port + + + authentication - - Limit download rate... + + + Tracker authentication - - Open destination folder + + Tracker: - - Move up - i.e. move up in the queue + + Login - - Move down - i.e. Move down in the queue + + Username: - - Move to top - i.e. Move to top of the queue + + Password: - - Move to bottom - i.e. Move to bottom of the queue + + Log in - - Set location... + + Cancel + + + confirmDeletionDlg - - Force reannounce + + Deletion confirmation - qBittorrent - - Copy name + + Remember choice - - Copy hash + + Also delete the files on the hard disk + + + confirmShutdownDlg - - Download first and last pieces first + + Don't show again + + + createTorrentDialog - - Automatic Torrent Management + + Cancel - - Automatic mode means that various torrent properties(eg save path) will be decided by the associated category + + Torrent Creation Tool - - Category + + Torrent file creation - - New... - New category... + + Add file - - Reset - Reset category + + Add folder - - Tags + + File or folder to add to the torrent: - - Add... - Add / assign multiple tags... + + Tracker URLs: - - Remove All - Remove all tags + + Web seeds urls: - - Priority + + Comment: - - Force recheck + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - Copy magnet link + + Piece size: - - Super seeding mode + + 16 KiB - - Rename... + + 32 KiB - - Download in sequential order + + 64 KiB - - - UpDownRatioDialog - - Torrent Upload/Download Ratio Limiting + + 128 KiB - - Use global share limit + + 256 KiB - - - - buttonGroup + + 512 KiB - - Set no share limit + + 1 MiB - - Set share limit to + + 2 MiB - - ratio + + 4 MiB - - minutes + + 8 MiB - - No share limit method selected + + 16 MiB - - Please select a limit method first + + Auto - - - Utils::ForeignApps - - Python detected, version: %1 + + Private (won't be distributed on DHT network if enabled) - - Python not detected + + Start seeding after creation - - - WebApplication - - Unacceptable file type, only regular file is allowed. + + Ignore share ratio limits for this torrent - - Symlinks inside alternative UI folder are forbidden. + + Create and save... - - Exceeded the maximum allowed file size (%1)! + + Progress: + + + downloadFromURL - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' + + Add torrent links - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' + + One per line (HTTP links, Magnet links and info-hashes are supported) - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' + + Download - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' + + Cancel - - - WebUI - - Web UI: HTTPS setup successful + + Download from urls - - Web UI: HTTPS setup failed, fallback to HTTP + + No URL entered - - Web UI: Now listening on IP: %1, port: %2 + + Please type at least one URL. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 + + Crash info fsutils - + + + + + Downloads @@ -9740,100 +8625,140 @@ misc - + B bytes - + KiB kibibytes (1024 bytes) - + MiB mebibytes (1024 kibibytes) - + GiB gibibytes (1024 mibibytes) - + TiB tebibytes (1024 gibibytes) - + PiB pebibytes (1024 tebibytes) - + EiB exbibytes (1024 pebibytes) - + + Python not detected + + + + + Python version: %1 + + + + /s per second - + %1h %2m e.g: 3hours 5minutes - + %1d %2h e.g: 2days 10hours - + Unknown Unknown (size) - + qBittorrent will shutdown the computer now because all downloads are complete. - + < 1m < 1 minute - + %1m e.g: 10minutes + + + Working + + + + + Updating... + + + + + Not working + + + + + Not contacted yet + + preview - + Preview selection - + The following files support previewing, please select one of them: + + + Preview + + + + + Cancel + + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_eo.ts qbittorrent-3.3.15/src/lang/qbittorrent_eo.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_eo.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_eo.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - + Pri qBittorrent - + About - + Pri - + Author - + Aŭtoro - - Current maintainer + + + Nationality: - - Greece - Grekujo - - - - - Nationality: - + + + Name: + Nomo: - - + + E-mail: - + Retpoŝtadreso: - - - Name: - + + Greece + Grekujo - - Original author - + + Current maintainer + Aktuala prizorganto - - France - Francujo + + Original author + Originala aŭtoro - + Special Thanks - + Translators - - License - - - - + Libraries - + Bibliotekoj - + qBittorrent was built with the following libraries: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - - - - - Forum: - + + France + Francujo - - Bug Tracker: - + + License + Permesilo @@ -115,57 +90,67 @@ - + + Browse... + Folii... + + + + Set as default save path + Agordi kiel la defaŭlta dosierindiko por konservi + + + Never show again Neniam remontru - + Torrent settings Torentaj agordoj - + Set as default category - + Category: - + Start torrent Komenci la torenton - + Torrent information - + Skip hash check Preterpasi la haketan kontrolon - + Size: Grando: - + Hash: - + Comment: Komento: - + Date: Dato: @@ -190,117 +175,89 @@ - - Remember last used save path - - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - + Do not delete .torrent file - - Create subfolder - - - - - Download in sequential order - Elŝuti en sinsekva ordo - - - - Download first and last pieces first - - - - + Normal Norma - + High Alta - + Maximum Maksimuma - + Do not download Ne elŝutu - - - + + + I/O Error Eneliga eraro - + Invalid torrent Malvalida torento - - Renaming - - - - - - Rename error - + + + + + Already in download list + Jam en la elŝuta listo - - The name is empty or contains forbidden characters, please choose a different one. - - - - + Not Available This comment is unavailable Ne Disponeblas - + Not Available This date is unavailable Ne Disponeblas - + Not available Ne disponeblas - + Invalid magnet link Malvalida magnet-ligilo - + The torrent file '%1' does not exist. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -308,115 +265,128 @@ - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + + + + + Torrent is already in download list. Trackers were merged. + La torento jam estas en la elŝuta listo. La spuriloj kunfandiĝis. + + + + + Cannot add torrent + Ne eblas aldoni la torenton + + + + Cannot add this torrent. Perhaps it is already in adding state. + Ne eblas aldoni ĉi tiun torenton. Ĝi eble jam estas en la aldonata stato. + + + This magnet link was not recognized Ĉi tiu magnet-ligilo ne estis rekonata - + + Magnet link is already in download list. Trackers were merged. + La magnet-ligilo jam estas en la elŝuta listo. La spuriloj kunfandiĝis. + + + + Cannot add this torrent. Perhaps it is already in adding. + Ne eblas aldoni ĉi tiun torenton. Ĝi eble jam estas aldonata. + + + Magnet link Magnet-ligilo - + Retrieving metadata... Ricevante metadatenojn... - + Not Available This size is unavailable. Ne disponeblas - + Free space on disk: %1 - + + Choose save path Elektu la dosierindikon por konservi - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - + + Rename the file + Renomu la dosieron - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + + New name: + Nova nomo: - - Magnet link is already queued for processing. - + + + The file could not be renamed + La dosiero ne eblis renomiĝi - - New name: - Nova nomo: + + This file name contains forbidden characters, please choose a different one. + La dosiernomo enhavas malpermesitajn signojn, bonvolu elekti alian. - - + + This name is already in use in this folder. Please use a different name. La nomo jam estas uzata en ĉi tiu dosierujo. Bonvolu uzi alian nomon. - + The folder could not be renamed La dosierujo ne eblis renomiĝi - + Rename... Renomi... - + Priority Prioritato - + Invalid metadata Malvalidaj metadatenoj - + Parsing metadata... Sintakse analizante metadatenojn... - + Metadata retrieval complete La ricevo de metadatenoj finiĝis - + Download Error Elŝuta eraro @@ -424,312 +394,198 @@ AdvancedSettings - + + Disk write cache size + Grando de la diska skriba kaŝmemoro + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Elirantaj pordoj (minimume) [0: Malebligita] - + Outgoing ports (Max) [0: Disabled] Elirantaj pordoj (maksimume) [0: Malebligita] - + Recheck torrents on completion Rekontroli torentojn post fino - + Transfer list refresh interval Intervalo inter aktualigoj de la transmetlisto - + ms milliseconds ms - + Setting Agordo - + Value Value set for this setting Valoro - - - (disabled) - - - - + (auto) (aŭtomata) - - min - minutes - - - - + All addresses - + qBittorrent Section - - + + Open documentation - + libtorrent Section - - Asynchronous I/O threads - - - - - Disk cache - - - - + s seconds s - + Disk cache expiry interval Intervalo por senvalidigado de la diska kaŝmemoro - + Enable OS cache Ebligi operaciuman kaŝmemoron - - Guided read cache - - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - - - - - - KiB - - - - - Send buffer watermark - - - - - Send buffer low watermark - - - - - Send buffer watermark factor - - - - - Prefer TCP - - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address - + + m + minutes + m - + Resolve peer countries (GeoIP) - + Resolve peer host names - + Strict super seeding Strikte superfondsendi - + Network Interface (requires restart) Retinterfaco (nepras relanĉi) - + Optional IP Address to bind to (requires restart) - + Listen on IPv6 address (requires restart) Aŭdu per adreso IPv6 (nepras relanĉi) - + Display notifications - + Display notifications for added torrents - + Download tracker's favicon - - Save path history length - - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - - - - - Round-robin - - - - - Fastest upload - - - - - Anti-leech - - - - - Upload choking algorithm - - - - + Confirm torrent recheck Konfirmi rekontrolon de la torento - - Confirm removal of all tags - - - - - Always announce to all trackers in a tier - + Exchange trackers with other peers + Interŝanĝi spurilojn kun aliaj samtavolanoj - - Always announce to all tiers - + + Always announce to all trackers + Ĉiam konekti al ĉiuj spuriloj - + Any interface i.e. Any network interface Iu ajn interfaco - + Save resume data interval How often the fastresume file is saved. Intervalo inter konservoj de reaktivigaj datenoj - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - - - - + Maximum number of half-open connections [0: Unlimited] Maksimuma nombro da duon-malfermitaj konektoj [0: Senlime] - + IP Address to report to trackers (requires restart) - + Enable embedded tracker Ebligu enigitan spurilon - + Embedded tracker port Enigita spurila pordo - + Check for software updates Kontroli programaran ĝisdatigadon - + Use system icon theme Uzi sisteman bildsimbolaron @@ -737,120 +593,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 lanĉiĝis - + Torrent: %1, running external program, command: %2 - - Torrent name: %1 - - - - - Torrent size: %1 - - - - - Save path: %1 - - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - - - - - Thank you for using qBittorrent. - - - - - [qBittorrent] '%1' has finished downloading + + Torrent: %1, run external program command too long (length > %2), execution failed. - + Torrent: %1, sending mail notification - + Information Informoj - - To control qBittorrent, access the Web UI at %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 - + The Web UI administrator user name is: %1 - + The Web UI administrator password is still the default one: %1 - + This is a security risk, please consider changing your password from program preferences. - + Saving torrent progress... Konservante la torentan progreson... - - - Portable mode and explicit profile directory options are mutually exclusive - - - - - Portable mode implies relative fastresume - - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Konservu en: @@ -860,816 +657,664 @@ RSS-elŝutilo - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. + + Enable Automated RSS Downloader - + Download Rules Elŝutaj reguloj - + Rule Definition Difino de regulo - + Use Regular Expressions Uzi regulajn esprimojn - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - - - - + Must Contain: Nepras enhavi: - + Must Not Contain: Nepras ne enhavi: - + Episode Filter: Epizodfiltrilo: - + Assign Category: - + Save to a Different Directory Konservi en alian dosierujon - + Ignore Subsequent Matches for (0 to Disable) ... X days - + Disabled - + Malebligita - + days tagoj - + Add Paused: Aldoni Paŭzinte: - + Use global settings Uzi la mallokan agordon - + Always Ĉiam - + Never Neniam - + Apply Rule to Feeds: Apliki regulon al fluoj: - + Matching RSS Articles - + &Import... &Enporti... - + &Export... E&lporti... - + Matches articles based on episode filter. - + Example: Ekzemplo: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match - + Episode filter rules: Epizodfiltrilaj reguloj: - + Season number is a mandatory non-zero value - + Episode number is a mandatory non-zero value + Epizodnombro estas nepra nenula valoro + + + Filter must end with semicolon - + Three range types for episodes are supported: - + Single number: <b>1x25;</b> matches episode 25 of season one - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one - + Episode number is a mandatory positive value - - Rules - - - - - Rules (legacy) - - - - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - + Last Match: %1 days ago Lasta kongruo: antaŭ %1 tagoj - + Last Match: Unknown Lasta kongruo: Nekonata - + New rule name Nova regulnomo - + Please type the name of the new download rule. Bonvolu tajpi la nomon de la nova elŝutregulo. - - + + Rule name conflict Regulnoma konflikto - - + + A rule with this name already exists, please choose another name. Regulo kun tiu nomo jam ekzistas, bonvolu elekti alian nomon. - + Are you sure you want to remove the download rule named '%1'? Ĉu vi certas, ke vi volas forigi la elŝutregulon, kies nomo estas '%1'? - + Are you sure you want to remove the selected download rules? Ĉu vi certas, ke vi volas forigi la elektitajn elŝutregulojn? - + Rule deletion confirmation Regul-foriga konfirmado - + Destination directory Celdosierujo - + Invalid action - + Malvalida ago - + The list is empty, there is nothing to export. - + La listo malplenas, estas nenio por elporti. - - Export RSS rules - + + Where would you like to save the list? + Kie vi volas konservi la liston? - - + + Rules list (*.rssrules) + Listo da reguloj (*.rssrules) + + + I/O Error - Eneliga eraro + Eneliga eraro - - Failed to create the destination file. Reason: %1 - + + Failed to create the destination file + Ne eblis krei la celdosieron - - Import RSS rules + + Please point to the RSS download rules file - - Failed to open the file. Reason: %1 - + + Rules list + Listo da reguloj - + Import Error - + Enporta eraro - - Failed to import the selected rules file. Reason: %1 + + Failed to import the selected rules file - + Add new rule... Aldoni novan regulon... - + Delete rule Forigi la regulon - + Rename rule... Renomi la regulon... - + Delete selected rules Forigi elektitajn regulojn - - Clear downloaded episodes... - - - - + Rule renaming Regul-renomado - + Please type the new rule name Bonvolu tajpi la novan regulnomon - - Clear downloaded episodes + + Regex mode: use Perl-like regular expressions - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - - - - - - Position %1: %2 - - - - + Wildcard mode: you can use - + ? to match any single character - + * to match zero or more of any characters - + Whitespaces count as AND operators (all words, any order) - + | is used as OR operator - + If word order is important use * instead of whitespace. - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - + will match all articles. - + will exclude all articles. - BanListOptionsDialog - - - List of banned IP addresses - - - - - Ban IP - - - - - Delete - Forigi - - - - - Warning - - - - - The entered IP address is invalid. - - - - - The entered IP is already banned. - - - - BitTorrent::Session - + Restart is required to toggle PeX support - - Could not get GUID of configured network interface. Binding to IP %1 - - - - + Embedded Tracker [ON] Enigita spurilo [ŜALTITA] - + Failed to start the embedded tracker! - + Embedded Tracker [OFF] Enigita spurilo [MALŜALTITA] - + + '%1' reached the maximum ratio you set. Removing... + + + + + '%1' reached the maximum ratio you set. Pausing... + + + + System network status changed to %1 e.g: System network status changed to ONLINE - + ONLINE KONEKTITA - + OFFLINE MALKONEKTITA - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. - - + Encryption support [%1] - - + FORCED - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - - - - - + Anonymous mode [%1] - + Unable to decode '%1' torrent file. Ne eblas malkodi la torentdosieron '%1' - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' - + Queue positions were corrected in %1 resume files - + Couldn't save '%1.torrent' Ne eblis konservi dosieron '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - - - - + because %1 is disabled. this peer was blocked because uTP is disabled. ĉar %1 estas malebligita. - + because %1 is disabled. this peer was blocked because TCP is disabled. ĉar %1 estas malebligita. - + URL seed lookup failed for URL: '%1', message: %2 URL-fonta elserĉo malsukcesis kun la URL-adreso: '%1', mesaĝo: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' estis forigita de la transmetlisto kaj diskilo. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' foriĝis de la transmetlisto. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... '%1' estas elŝutata, bonvolu atendi... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 - + The network interface defined is invalid: %1 La difinita reta interfaco malvalidas: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent provantas aŭskulti per interfaco %1 pordo: %2 - - Peer ID: - - - - - HTTP User-Agent is '%1' - - - - - + DHT support [%1] - - - - - - - - - + + + + ON - - - - - - - - - + + + + OFF - - + Local Peer Discovery support [%1] - - PeX support [%1] - - - - - '%1' reached the maximum ratio you set. Removed. - - - - - '%1' reached the maximum ratio you set. Paused. - - - - - '%1' reached the maximum seeding time you set. Removed. - - - - - '%1' reached the maximum seeding time you set. Paused. - - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent ne trovis lokan adreson de %1 por aŭskulti - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent ne eblis aŭskulti per iu ajn interfaco pordo: %1. Kialo: %2 - + Tracker '%1' was added to torrent '%2' Spurilo '%1' aldoniĝis al la torento '%2' - + Tracker '%1' was deleted from torrent '%2' Spurilo '%1' foriĝis de la torento '%2' - + URL seed '%1' was added to torrent '%2' URL-fonto '%1' aldoniĝis al la torento '%2' - + URL seed '%1' was removed from torrent '%2' URL-fonto '%1' foriĝis de torento '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Ne eblas reaktivigi la torenton '%1'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Error: Failed to parse the provided IP filter. - - '%1' restored. - 'torrent name' restored. - - - - + Couldn't add torrent. Reason: %1 Ne eblis aldoni la torenton. Kial: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' reaktiviĝis. (rapida reaktiviĝo) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' aldoniĝis al la elŝutlisto. - + An I/O error occurred, '%1' paused. %2 Eneliga eraro okazis, '%1' paŭzis. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 - + due to IP filter. this peer was blocked due to ip filter. pro IP-filtrilo. - + due to port filter. this peer was blocked due to port filter. pro porda filtrilo. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. - + because it has a low port. this peer was blocked because it has a low port. ĉar ĝi havas malaltan pordon. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent sukcese aŭskultantas per interfaco %1 pordo: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 Ekstera IP-adreso: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + Ne eblis movigi la torenton: '%1'. Kial: %2 - + File sizes mismatch for torrent '%1', pausing it. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... @@ -1677,17 +1322,17 @@ CategoryFilterModel - + Categories - + All - + Ĉio - + Uncategorized @@ -1706,34 +1351,67 @@ - Edit category... - - - - Remove category - + Remove unused categories - + Resume torrents Reaktivigi la torentojn - + Pause torrents Paŭzigi la torentojn - + Delete torrents Forigi la torentojn + + + New Category + + + + + Category: + + + + + Invalid category name + + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + CookiesDialog @@ -1772,220 +1450,101 @@ - DeletionConfirmationDialog - - - Deletion confirmation - - - - - Remember choice - - - - - Also delete the files on the hard disk - - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Ĉu vi certas, ke vi volas '%1' foriĝi de la transmetlisto? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - - - - - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - Elŝuti - - - - No URL entered - - - - - Please type at least one URL. - + Ĉu vi certas, ke vi volas forigi tiujn %1 torentojn de la transmetlisto? DownloadedPiecesBar - + White: Missing pieces Blankaj: Mankaj pecoj - + Green: Partial pieces Verdak: Partaj pecoj - + Blue: Completed pieces Bluaj: Finitaj pecoj - ExecutionLogWidget + ExecutionLog - + General - Ĝenerala + Ĝenerala - + Blocked IPs - + Blokitaj IP-adresoj - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> blokiĝis %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - + <font color='red'>%1</font> forbariĝis FeedListWidget - + RSS feeds RSS-fluoj - - - Unread (%1) - + + Unread + Nelegita FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - - - - - &Browse... - Launch file dialog button text (full) - - - - - Choose a file - Caption for file open/save dialog - - - - - Choose a folder - Caption for directory open dialog - - - - - Any file + + An error occured while trying to open the log file. Logging to file is disabled. FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - - - - - - - IP filter line %1 is malformed. - - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - - - - - - IP filter exception thrown for line %1. Exception is: %2 + + + + I/O Error: Could not open ip filter file in read mode. - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - - - - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. @@ -1993,395 +1552,472 @@ GeoIPDatabase - - + + Unsupported database file size. Nesubtenata databank-dosiergrando. - + Metadata error: '%1' entry not found. Metadatena eraro: elemento '%1' ne troviĝis. - + Metadata error: '%1' entry has invalid type. Metadatena eraro: elemento '%1' havas malvalidan tipon. - + Unsupported database version: %1.%2 Nesubtenata datenbank-versio: %1.%2 - + Unsupported IP version: %1 Nesubtenata IP-versio: %1 - + Unsupported record size: %1 - + Invalid database type: %1 Malvalida datenbanktipo: %1 - + Database corrupted: no data section found. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - + + File + Dosiero - - Bad Http request, closing socket. IP: %s - + + Edit + Redakti - - - HttpServer - + + Help + Helpo + + + Exit qBittorrent Ĉesigi la qBittorrent-klienton - + Only one link per line Nur po unu ligilo por linio - - Global upload rate limit must be greater than 0 or disabled. - La malloka alŝutrapidlimo nepras esti aŭ pli ol 0 aŭ malebligita. + + Download + Elŝuti - + + Global upload rate limit must be greater than 0 or disabled. + La malloka alŝutrapidlimo nepras esti aŭ pli ol 0 aŭ malebligita. + + + Global download rate limit must be greater than 0 or disabled. La malloka elŝutrapidlimo nepras esti aŭ pli ol 0 aŭ malebligita. - + Alternative upload rate limit must be greater than 0 or disabled. La alternativa alŝutrapidlimo nepras esti aŭ pli ol 0 aŭ malebligita. - + Alternative download rate limit must be greater than 0 or disabled. La alternativa elŝutrapidlimo nepras esti aŭ pli ol 0 aŭ malebligita. - + Maximum active downloads must be greater than -1. La maksimumo de aktivaj elŝutoj nepras esti pli ol -1. - + Maximum active uploads must be greater than -1. La maksimumo de aktivaj alŝutoj nepras esti pli ol -1. - + Maximum active torrents must be greater than -1. La maksimumo de aktivaj torentoj nepras esti pli ol -1. - + Maximum number of connections limit must be greater than 0 or disabled. La maksimuma limo de la nombro da konektoj nepras esti aŭ pli ol 0 aŭ malebligita. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. La maksimuma limo de la nombro da konektoj por torento nepras esti aŭ pli ol 0 aŭ malebligita. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. - + Unable to save program preferences, qBittorrent is probably unreachable. - - IRC: #qbittorrent on Freenode - - - - - Invalid category name: -Please do not use any special characters in the category name. - - - - - Unknown - Nekonata - - - - Hard Disk - - - - - Share ratio limit must be between 0 and 9998. - - - - - Seeding time limit must be between 0 and 525600 minutes. - + + Language + Lingvo - + The port used for incoming connections must be between 1 and 65535. - + The port used for the Web UI must be between 1 and 65535. - + Unable to log in, qBittorrent is probably unreachable. Ne eblis ensaluti, qBittorrent eblas esti neatingebla. - + Invalid Username or Password. Malvalida uzantnomo aŭ pasvorto. - - Username - - - - + Password Pasvorto - + Login Ensaluti - + + Upload Failed! + Alŝuto malsukcesis! + + + Original authors Originalaj aŭtoroj - + + Upload limit: + Alŝutlimo: + + + + Download limit: + Elŝutlimo: + + + Apply Apliki - + Add Aldoni - + + Category: + + + + Upload Torrents Upload torrent files to qBittorent using WebUI - + + All + Ĉio + + + + Downloading + Elŝutante + + + + Seeding + Fontsendanta + + + + Completed + Finita + + + + Resumed + Reaktiviĝita + + + + Paused + Paŭzinta + + + + Active + Aktiva + + + + Inactive + Malaktiva + + + Save files to location: Konservi dosierojn al la loko: - + Cookie: Kuketo: - + Type folder here - + + Run an external program on torrent completion + + + + + Enable bandwidth management (uTP) + + + + + Apply rate limit to uTP connections + + + + + Alternative Global Rate Limits + + + + More information Pli informoj - + Information about certificates - + Save Files to Konservi dosierojn en - - Set location - - - - - Limit upload rate + + Watch Folder - - Limit download rate - + + Default Folder + Defaŭlta dosierujo - - Rename torrent - + + from + from time1 to time2 + de - - Unable to create category - + + to + from time1 to time2 + al - + Other... Save Files to: Watch Folder / Default Folder / Other... Alia... - + + Every day + Schedule the use of alternative rate limits on ... + Ĉiutage + + + + Week days + Schedule the use of alternative rate limits on ... + Laborsemajnoj + + + + Week ends + Schedule the use of alternative rate limits on ... + Semajnfinoj + + + Monday Schedule the use of alternative rate limits on ... Lundo - + Tuesday Schedule the use of alternative rate limits on ... Mardo - + Wednesday Schedule the use of alternative rate limits on ... Merkredo - + Thursday Schedule the use of alternative rate limits on ... Ĵaŭdo - + Friday Schedule the use of alternative rate limits on ... Vendredo - + Saturday Schedule the use of alternative rate limits on ... Sabato - + Sunday Schedule the use of alternative rate limits on ... Dimanĉo - + + Downloaded + Is the file downloaded or not? + Elŝutita + + + Logout Elsaluti - + + Download from URLs + + + + Download Torrents from their URLs or Magnet links - + Upload local torrent Alŝuti lokan torenton - + Are you sure you want to delete the selected torrents from the transfer list? Ĉu vi certas, ke vi volas forigi la elektitajn torentojn de la transmetlisto? - + Save Konservi - + qBittorrent client is not reachable La qBittorrent-kliento ne atingiĝeblas. - - qBittorrent has been shutdown. - - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - + + HTTP Server + TTT-servilo - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - + + The following parameters are supported: + La jenaj parametroj estas subtenataj: - - Add subnet - + + Torrent path + Torentindiko - - Delete - Forigi + + Torrent name + Nomo de la torento - - Error - Eraro + + qBittorrent has been shutdown. + + + + LineEdit - - The entered subnet is invalid. - + + Clear the text + Vakigi la tekston LogListWidget - + Copy Kopii - + Clear Vakigi @@ -2414,549 +2050,490 @@ - + &View &Vido - + &Options... &Opcioj - + &Resume &Reaktivigi - + Torrent &Creator Torent&kreilo - + Set Upload Limit... Agordi Alŝutlimon... - + Set Download Limit... Agordi Elŝutlimon... - + Set Global Download Limit... Agordi Mallokan Elŝutlimon... - + Set Global Upload Limit... Agordi Mallokan Alŝutlimon... - + Minimum Priority Minimuma Prioritato - + Top Priority Plejalta Prioritato - + Decrease Priority Malpliigi prioritaton - + Increase Priority Pliigi prioritaton - - + + Alternative Speed Limits Alternativaj rapidlimoj - + &Top Toolbar - + Display Top Toolbar - - Status &Bar - - - - + S&peed in Title Bar - + Show Transfer Speed in Title Bar - + &RSS Reader &RSS-legilo - + Search &Engine &Serĉilo - + L&ock qBittorrent Ŝl&osi la qBittorrent-klienton - + Do&nate! Do&nacu! - - Close Window - - - - + R&esume All R&eaktivigu Ĉion - + Manage Cookies... - + Manage stored network cookies - + Normal Messages - + Information Messages - + Warning Messages - + Critical Messages - + &Log &Protokolo - + &Exit qBittorrent Ĉ&esigi la qBittorrent-klienton - + &Suspend System &Haltetigi la sistemon - + &Hibernate System &Diskodormigi la sistemon - + S&hutdown System Mal&ŝalti la sistemon - + &Disabled &Malebligita - + &Statistics &Statistikoj - + Check for Updates Kontroli ĝisdatigadon - + Check for Program Updates Kontroli programaran ĝisdatigadon - + &About &Pri - + &Pause &Paŭzigu - + &Delete &Forigu - + P&ause All &Paŭzigu Ĉion - + &Add Torrent File... Aldonu Torent&dosieron... - + Open Malfermu - + E&xit &Ĉesu - + Open URL Malfermu URL-adreson - + &Documentation &Dokumentado - + Lock Ŝlosu - - - + + + Show Montru - + Check for program updates Kontroli programaran ĝisdatigadon - + Add Torrent &Link... Aldonu Torent&ligilon... - + If you like qBittorrent, please donate! Se qBittorrent plaĉas al vi, bonvolu donaci! - - + Execution Log - + Clear the password Vakigi la pasvorton - + Filter torrent list... Filtri la torentliston... - + &Set Password &Agordi pasvorton - - Preferences - - - - + &Clear Password &Vakigi la pasvorton - + Transfers Transmetoj - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Torentdosiera asocio - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? - + Icons Only Nur bildsimboloj - + Text Only Nur Teksto - + Text Alongside Icons Teksto apud bildsimboloj - + Text Under Icons Teksto sub bildsimboloj - + Follow System Style Uzi la sisteman stilon - - - + + + UI lock password UI-ŝlosa pasvorto - - - + + + Please type the UI lock password: Bonvolu tajpi la UI-ŝlosilan pasvorton: - + The password should contain at least 3 characters La pasvorto devus enhavi almenaŭ 3 signojn - + Password update Pasvortĝisdatigado - + The UI lock password has been successfully updated La UI-ŝlosa pasvorto sukcese ĝisdatiĝis - + Are you sure you want to clear the password? Ĉu vi certas, ke vi volas vakigi la pasvorton? - - Use regular expressions - - - - + Search Serĉu - + Transfers (%1) Transmetoj (%1) - + Error Eraro - + Failed to add torrent: %1 Ne eblis aldoni la torenton: %1 - + Torrent added - + '%1' was added. e.g: xxx.avi was added. - + Download completion Elŝutfino - + I/O Error i.e: Input/Output Error Eneliga eraro - + Recursive download confirmation - + Yes Jes - + No Ne - + Never Neniam - + Global Upload Speed Limit Malloka Alŝutrapidlimo - + Global Download Speed Limit Malloka Elŝutrapidlimo - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - - - - - Are you sure you want to quit qBittorrent? - - - - + &No &Ne - + &Yes &Jes - + &Always Yes &Ĉiam Jes - - %1/s - s is a shorthand for seconds - + + Old Python Interpreter + Malnova Pitona interpretilo - - Couldn't determine your Python version. Search engine disabled. - - - - - Old Python Interpreter - Malnova Pitona interpretilo - - - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - + qBittorrent Update Available Ĝisdatigo por qBittorrent disponeblas - + + A new version is available. +Do you want to download %1? + + + + Already Using the Latest qBittorrent Version La lasta versio de qBittorrent jam estas uzata - + Undetermined Python version Pitona versio ne estas determinita - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. '%1' finiĝis elŝuton. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2965,157 +2542,153 @@ Kial: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? La torento '%1' enhavas torentdosierojn. Ĉu vi volas ilin elŝuti? - + Couldn't download file at URL '%1', reason: %2. Ne eblis elŝuti dosieron ĉe URL '%1', kialo: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - - + + Couldn't determine your Python version (%1). Search engine disabled. + + + + + Missing Python Interpreter Manka Pitona interpretilo - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Pitono estas bezona por uzi la serĉilon, sed ŝajnas, ke ĝi ne estas instalita. Ĉu vi volas instali ĝin nun? - + Python is required to use the search engine but it does not seem to be installed. Pitono estas bezona por uzi la serĉilon, sed ŝajnas, ke ĝi ne estas instalita. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. Neniu ĝisdatigo disponeblas. Vi jam uzas la aktualan version. - + &Check for Updates &Kontroli ĝisdatigadon - + Checking for Updates... Kontrolante ĝisdatigadon... - + Already checking for program updates in the background Jam kontrolante programan ĝisdatigon fone - + Python found in '%1' Pitono trovita en '%1' - + Download error Elŝuta eraro - + Python setup could not be downloaded, reason: %1. Please install it manually. - - + + Invalid password Malvalida pasvorto - - - + + RSS (%1) RSS (%1) - + URL download error URL-elŝuta eraro - + The password is invalid La pasvorto malvalidas - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Elŝutrapido: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Alŝutrapido: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [E: %1, A: %2] qBittorrent %3 - + Hide Kaŝi - + Exiting qBittorrent qBittorrent ĉesantas - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Kelkaj dosieroj transmetantas. +Ĉu vi certas, ke vi volas ĉesigi la qBittorrent-klienton? + + + Open Torrent Files Malfermi Torentdosierojn - + Torrent Files Torentdosieroj - + Options were saved successfully. Opcioj konserviĝis sukcese. @@ -3123,52 +2696,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. Via dinamika domajna nomsistemo ĝisdatiĝis sukcese. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Dinamika domajna nomsistema eraro: la servo ne disponeblas dumtempe. Reprovonte post 30 minutoj. - + Dynamic DNS error: hostname supplied does not exist under specified account. Dinamika domajna nomsistema eraro: la registrita gastignomo ne ekzistas per la specifita konto. - + Dynamic DNS error: Invalid username/password. Dinamika domajna nomsistema eraro: malvalida uzantnomo/pasvorto. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Dinamika domajna nomsistema eraro: qBittorrent listiĝis je nigra listo de la servo, bonvolu raporti cimon ĉe http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Dinamika domajna nomsistema eraro: %1 reportiĝis de la servo, bonvolu raporti cimon ĉe http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Dinamika domajna nomsistema eraro: via uzantnomo blokiĝis pro misuzado. - + Dynamic DNS error: supplied domain name is invalid. Dinamika domajna nomsistema eraro: la registrita domajna nomo malvalidas. - + Dynamic DNS error: supplied username is too short. Dinamika domajna nomsistema eraro: la registrita uzantnomo tro mallongas. - + Dynamic DNS error: supplied password is too short. Dinamika domajna nomsistema eraro: la registrita pasvorto tro mallongas. @@ -3176,1413 +2749,1303 @@ Net::DownloadHandler - + I/O Error Eneliga eraro - + The file size is %1. It exceeds the download limit of %2. La dosiergrando estas %1. Tiom estas pli ol la elŝutlimo %2. - + Unexpected redirect to magnet URI. - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. - - + + Couldn't load GeoIP database. Reason: %1 - + Venezuela, Bolivarian Republic of Venezuelo, Bolivara Respubliko - + Viet Nam Vjetnamujo - - + + N/A N/A - + Andorra Andoro - + United Arab Emirates Unuiĝintaj Arabaj Emirlandoj - + Afghanistan Afganujo - + Antigua and Barbuda Antigvo kaj Barbudo - + Anguilla Angvilo - + Albania Albanujo - + Armenia Armenujo - + Angola Angolo - + Antarctica Antarkto - + Argentina Argentino - + American Samoa Usona Samoo - + Austria Aŭstrujo - + Australia Aŭstralio - + Aruba Arubo - + Azerbaijan Azerbajĝano - + Bosnia and Herzegovina Bosnujo kaj Hercegovino - + Barbados Barbado - + Bangladesh Bangladeŝo - + Belgium Belgujo - + Burkina Faso Burkino - + Bulgaria Bulgarujo - + Bahrain Barejno - + Burundi Burundo - + Benin Benino - + Bermuda Bermudo - + Brunei Darussalam Brunejo - + Brazil Brazilo - + Bahamas Bahamoj - + Bhutan Butano - + Bouvet Island Buvet-Insulo - + Botswana Bocvano - + Belarus Belorusujo - + Belize Belizo - + Canada Kanado - + Cocos (Keeling) Islands Kokosa Insulo - + Congo, The Democratic Republic of the Kongo Kinŝasa - + Central African Republic Centr-Afriko - + Congo Kongo Brazavila - + Switzerland Svislando - + Cook Islands Kukinsuloj - + Chile Ĉilio - + Cameroon Kameruno - + China Ĉinujo - + Colombia Kolombio - + Costa Rica Kostariko - + Cuba Kubo - + Cape Verde Kaboverdo - + Curacao Kuracao - + Christmas Island Kristnaskinsulo - + Cyprus Kipro - + Czech Republic Ĉeĥujo - + Germany Germanujo - + Djibouti Ĝibutio - + Denmark Danujo - + Dominica Dominiko - + Dominican Republic Domingo - + Algeria Alĝerio - + Ecuador Ekvadoro - + Estonia Estonujo - + Egypt Egiptujo - + Western Sahara Okcidenta Saharo - + Eritrea Eritreo - + Spain Hispanujo - + Ethiopia Etiopujo - + Finland Finnlando - + Fiji Fiĝioj - + Falkland Islands (Malvinas) Falklandoj - + Micronesia, Federated States of Federaciaj Ŝtatoj de Mikronezio - + Faroe Islands Ferooj - + France Francujo - + Gabon Gabono - + United Kingdom Britujo - + Grenada Grenado - + Georgia Kartvelujo - + French Guiana Franca Gviano - + Ghana Ganao - + Gibraltar Ĝibraltaro - + Greenland Gronlando - + Gambia Gambio - + Guinea Gvineo - + Guadeloupe Gvadelupo - + Equatorial Guinea Ekvatora Gvineo - + Greece Grekujo - + South Georgia and the South Sandwich Islands Sud-Georgio kaj Sud-Sandviĉinsuloj - + Guatemala Gvatemalo - + Guam Gvamo - + Guinea-Bissau Gvineo Bisaŭa - + Guyana Gujano - + Hong Kong Honkongo - + Heard Island and McDonald Islands Insulo Herdo kaj insuloj Makdonaldaj - + Honduras Honduro - + Croatia Kroatujo - + Haiti Haitio - + Hungary Hungarujo - + Indonesia Indonezio - + Ireland Irlando - + Israel Israelo - + India Barato - + British Indian Ocean Territory Brita Hindoceana Teritorio - + Iraq Irako - + Iran, Islamic Republic of Irano - + Iceland Islando - + Italy Italujo - + Jamaica Jamajko - + Jordan Jordanio - + Japan Japanujo - + Kenya Kenjo - + Kyrgyzstan Kirgizujo - + Cambodia Kamboĝo - + Kiribati Kiribato - + Comoros Komoroj - + Saint Kitts and Nevis Sankta Kristofo kaj Neviso - + Korea, Democratic People's Republic of Korea Demokratia Popola Respubliko - + Korea, Republic of Korea Respubliko - + Kuwait Kuvajto - + Cayman Islands Kajmana Insularo - + Kazakhstan Kazaĥujo - + Lao People's Democratic Republic Laoso - + Lebanon Libano - + Saint Lucia Sankta Lucio - + Liechtenstein Liĥtenŝtejno - + Sri Lanka Srilanko - + Liberia Liberio - + Lesotho Lesoto - + Lithuania Litovujo - + Luxembourg Luksemburgo - + Latvia Latvujo - + Morocco Maroko - + Monaco Monako - + Moldova, Republic of Moldavujo - + Madagascar Madagaskaro - + Marshall Islands Marŝaloj - + Mali Malio - + Myanmar Birmo - + Mongolia Mongolujo - + Northern Mariana Islands Nord-Marianoj - + Martinique Martiniko - + Mauritania Maŭritanio - + Montserrat Moncerato - + Malta Malto - + Mauritius Maŭricio - + Maldives Maldivoj - + Malawi Malavio - + Mexico Meksiko - + Malaysia Malajzio - + Mozambique Mozambiko - + Namibia Namibio - + New Caledonia Nov-Kaledonio - + Niger Niĝero - + Norfolk Island Norfolkinsulo - + Nigeria Niĝerio - + Nicaragua Nikaragvo - + Netherlands Nederlando - + Norway Norvegujo - + Nepal Nepalo - + Nauru Nauro - + Niue Niuo - + New Zealand Nov-Zelando - + Oman Omano - + Panama Panamo - + Peru Peruo - + French Polynesia Franca Polinezio - + Papua New Guinea Papuo-Nov-Gvineo - + Philippines Filipinoj - + Pakistan Pakistano - + Poland Pollando - + Saint Pierre and Miquelon Sankta Petro kaj Mikelono - + Puerto Rico Portoriko - + Portugal Portugalujo - + Palau Palaŭo - + Paraguay Paragvajo - + Qatar Kataro - + Reunion Reunio - + Romania Rumanujo - + Russian Federation Rusujo - + Rwanda Ruando - + Saudi Arabia Saŭda Arabujo - + Solomon Islands Salomonoj - + Seychelles Sejŝeloj - + Sudan Sudano - + Sweden Svedujo - + Singapore Singapuro - + Slovenia Slovenujo - + Svalbard and Jan Mayen Svalbardo kaj Janmajeno - + Slovakia Slovakujo - + Sierra Leone Sieraleono - + San Marino Sanmarino - + Senegal Senegalo - + Somalia Somalujo - + Suriname Surinamo - + Sao Tome and Principe Sankta Tomaso kaj Principeo - + El Salvador Salvadoro - + Syrian Arab Republic Siria Araba Respubliko - + Swaziland Svazilando - + Turks and Caicos Islands Turkoj kaj Kajkoj - + Chad Ĉado - + French Southern Territories Francaj Sudaj kaj Antarktaj Teritorioj - + Togo Togo - + Thailand Tajlando - + Tajikistan Taĝikujo - + Tokelau Tokelao - + Turkmenistan Turkmenujo - + Tunisia Tunizio - + Tonga Tongo - - Could not decompress GeoIP database file. - - - - + Timor-Leste Orienta Timoro - + Bolivia, Plurinational State of Bolivia Respubliko - + Bonaire, Sint Eustatius and Saba Bonaire, Sint Eustatius kaj Saba - + Cote d'Ivoire Ebur-Bordo - + Libya Libio - + Saint Martin (French part) Saint-Martin (Franca) - + Macedonia, The Former Yugoslav Republic of Makedonujo, Iama Jugoslavia Respubliko - + Macao Makao - + Pitcairn Pitkarno - + Palestine, State of Palestino, Ŝtato - + Saint Helena, Ascension and Tristan da Cunha Sankta Heleno, Ascension kaj Tristan da Cunha - + South Sudan Sud-Sudano - + Sint Maarten (Dutch part) Sint-Maarten (Nederlanda) - + Turkey Turkujo - + Trinidad and Tobago Trinidado kaj Tobago - + Tuvalu Tuvalo - + Taiwan Tajvano - + Tanzania, United Republic of Tanzania Respubliko - + Ukraine Ukrainujo - + Uganda Ugando - + United States Minor Outlying Islands Usonaj Malgrandaj Insuloj - + United States Usono - + Uruguay Urugvajo - + Uzbekistan Uzbekujo - + Holy See (Vatican City State) Vatikano - + Saint Vincent and the Grenadines Sankta Vincento kaj Grenadinoj - + Virgin Islands, British Britaj Virgulininsuloj - + Virgin Islands, U.S. Usonaj Virgulininsuloj - + Vanuatu Vanuatuo - + Wallis and Futuna Valiso kaj Futuno - + Samoa Samoo - + Yemen Jemeno - + Mayotte Majoto - + Serbia Serbujo - + South Africa Sud-Afriko - + Zambia Zambio - + Montenegro Montenegro - + Zimbabwe Zimbabvo - + Aland Islands Alando - + Guernsey Gvernsejo - + Isle of Man Manksinsulo - + Jersey Ĵersejo - + Saint Barthelemy Sankta Bartolomeo - + + Could not uncompress GeoIP database file. + + + + Couldn't save downloaded GeoIP database file. - + Successfully updated GeoIP database. - + Couldn't download GeoIP database file. Reason: %1 @@ -4590,12 +4053,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] - + UPnP / NAT-PMP support [OFF] @@ -4603,7 +4066,7 @@ Net::Smtp - + Email Notification Error: Retpoŝt-atentiga eraro: @@ -4611,1273 +4074,1077 @@ OptionsDialog - + Options - + Behavior - + Downloads Elŝutoj - + Connection Konekto - + Speed Rapido - + BitTorrent - - RSS - - - - + Web UI - + Advanced - + Language - + Lingvo - + User Interface Language: - + (Requires restart) - + Transfer List - + Confirm when deleting torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. - + Hide zero and infinity values - + Always Ĉiam - + Paused torrents only - + Action on double-click - + Downloading torrents: - - + + Start / Stop Torrent - - + + Open destination folder Malfermi la celdosierujon - - + + No action - + Completed torrents: - + Desktop - + Start qBittorrent on Windows start up - + Show splash screen on start up - + Start qBittorrent minimized - + Confirmation on exit when torrents are active - + Confirmation on auto-exit when downloads finish - - KiB - - - - - Email notification &upon download completion - - - - - Run e&xternal program on torrent completion - - - - - IP Fi&ltering - - - - - Schedule &the use of alternative rate limits - - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - - - - &Torrent Queueing - - - - - Seed torrents until their seeding time reaches - - - - - A&utomatically add these trackers to new downloads: - - - - - RSS Reader - - - - - Enable fetching RSS feeds - - - - - Feeds refresh interval: - - - - - Maximum number of articles per feed: - - - - - - min - minutes - - - - - RSS Torrent Auto Downloader - - - - - Enable auto downloading of RSS torrents - - - - - Edit auto downloading rules... - - - - - Web User Interface (Remote control) - - - - - IP address: - - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - - - - - Server domains: - - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - - - - - &Use HTTPS instead of HTTP - - - - - Bypass authentication for clients on localhost - - - - - Bypass authentication for clients in whitelisted IP subnets - - - - - IP subnet whitelist... - - - - - Upda&te my dynamic domain name + + Show qBittorrent in notification area - + Minimize qBittorrent to notification area - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. - + Tray icon style: - + Normal Norma - + Monochrome (Dark theme) - + Monochrome (Light theme) - + File association - + Use qBittorrent for .torrent files - + Use qBittorrent for magnet links - + Power Management - + + Inhibit system sleep when torrents are active + + + + + Log file + + + + Save path: - + Backup the log file after: - + + MB + + + + Delete backup logs older than: - + days Delete backup logs older than 10 months - + months Delete backup logs older than 10 months - + years Delete backup logs older than 10 years - + When adding a torrent - + + Display torrent content and some options + + + + Bring torrent dialog to the front - + Do not start the download automatically The torrent will be added to download list in pause state - + Should the .torrent file be deleted after adding it - + + Delete .torrent files afterwards + + + + Also delete .torrent files whose addition was cancelled - + Also when addition is cancelled - + Warning! Data loss possible! - + Saving Management - + Default Torrent Management Mode: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - + Manual - + Automatic - + When Torrent Category changed: - + Relocate torrent - + Switch torrent to Manual Mode - + When Default Save Path changed: - - + + Relocate affected torrents - - + + Switch affected torrents to Manual Mode - + When Category changed: - + Use Subcategories - + Default Save Path: - + Keep incomplete torrents in: - + Copy .torrent files to: - - Show &qBittorrent in notification area + + Copy .torrent files for finished downloads to: - - &Log file + + Pre-allocate disk space for all files - - Display &torrent content and some options + + Append .!qB extension to incomplete files - - Create subfolder for torrents with multiple files + + Automatically add torrents from: - - De&lete .torrent files afterwards + + Add entry - - Copy .torrent files for finished downloads to: + + Remove entry - - Pre-allocate disk space for all files + + Email notification upon download completion - - Inhibit system sleep when torrents are downloading + + Destination email: - - Inhibit system sleep when torrents are seeding + + SMTP server: - - Append .!qB extension to incomplete files + + This server requires a secure connection (SSL) - - Enable recursive download dialog + + + + Authentication - - Automatically add torrents from: - + + + + + Username: + Uzantnomo: - - Add entry - + + + + + Password: + Pasvorto: - - Remove entry + + Run external program on torrent completion - - SMTP server: + + Listening Port - - This server requires a secure connection (SSL) + + Port used for incoming connections: - - - Authentication + + Random - - - - - Username: + + Use UPnP / NAT-PMP port forwarding from my router - - - - - Password: - - - - - Enabled protocol: - - - - - TCP and μTP - - - - - Listening Port - - - - - Port used for incoming connections: - - - - - Random - - - - - Use UPnP / NAT-PMP port forwarding from my router - - - - + Use different port on each startup - + Connections Limits - + Maximum number of connections per torrent: - + Global maximum number of connections: - + Maximum number of upload slots per torrent: - + Global maximum number of upload slots: - + Proxy Server - + Type: - + (None) - + SOCKS4 - + SOCKS5 - + HTTP - + Host: - - + + Port: - + Otherwise, the proxy server is only used for tracker connections - + Use proxy for peer connections - + Disable connections not supported by proxies - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - + Use proxy only for torrents - - A&uthentication + + Info: The password is saved unencrypted - - Info: The password is saved unencrypted + + IP Filtering - + Filter path (.dat, .p2p, .p2b): - + Reload the filter - - Manually banned IP addresses... - - - - + Apply to trackers - + Global Rate Limits - - - - - - - KiB/s + + + Upload: - - - Upload: - + + + + + KiB/s + KiB/s - - + + Download: - + Alternative Rate Limits - - + + Schedule the use of alternative rate limits + + + + From: from (time1 to time2) - - + To: time1 to time2 - + When: - + Every day - + Ĉiutage - + Weekdays - + Weekends - + Rate Limits Settings - + Apply rate limit to peers on LAN - + Apply rate limit to transport overhead - - + + + Enable µTP protocol + + + + Apply rate limit to µTP protocol - + Privacy - + Enable DHT (decentralized network) to find more peers - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers - + Look for peers on your local network - + Enable Local Peer Discovery to find more peers - + Encryption mode: - + Prefer encryption - + Require encryption - + Disable encryption - + Enable when using a proxy or a VPN connection - + Enable anonymous mode - - Maximum active downloads: - - - - - Maximum active uploads: - - - - - Maximum active torrents: + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - Do not count slow torrents in these limits + + Torrent Queueing - - Upload rate threshold: + + Maximum active downloads: - - Download rate threshold: + + Maximum active uploads: - - sec - seconds + + Maximum active torrents: - - Torrent inactivity timer: + + Do not count slow torrents in these limits - + Share Ratio Limiting - + Seed torrents until their ratio reaches - + then - + Pause them - + Remove them - - RSS Smart Episode Filters + + Automatically add these trackers to new downloads: - - Use UPnP / NAT-PMP to forward the port from my router + + Enable Web User Interface (Remote control) - - Certificate: + + Use UPnP / NAT-PMP to forward the port from my router - - Import SSL Certificate + + Use HTTPS instead of HTTP - - Key: + + Certificate: - - Import SSL Key + + Import SSL Certificate - - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> + + Key: - - Use alternative Web UI + + Import SSL Key - - Files location: + + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - - Enable clickjacking protection + + Bypass authentication for localhost - - Enable Cross-Site Request Forgery (CSRF) protection + + Update my dynamic domain name - + Service: - + Register - + Domain name: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): - + %N: Torrent name - + %L: Category - - %G: Tags (seperated by comma) - - - - + %F: Content path (same as root path for multifile torrent) - + %R: Root path (first torrent subdirectory path) - + %D: Save path - + %C: Number of files - + %Z: Torrent size (bytes) - + %T: Current tracker - + %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor - + Folder is already being monitored: - + Folder does not exist: - + Folder is not readable: - + Adding entry failed - - - - + + Choose export directory - - - + + + + + + Choose a save directory - + Choose an IP filter file - + All supported filters - + SSL Certificate - + + SSL Key + + + + Parsing error - + Failed to parse the provided IP filter - + Successfully refreshed - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Invalid key - + This is not a valid SSL key. - + Invalid certificate - - Preferences - - - - - Import SSL certificate - - - - + This is not a valid SSL certificate. - - Import SSL key - - - - - SSL key - - - - + Time Error - + The start time and the end time can't be the same. - - + + Length Error - + The Web UI username must be at least 3 characters long. - + The Web UI password must be at least 6 characters long. @@ -5885,72 +5152,72 @@ PeerInfo - - Interested(local) and Choked(peer) + + interested(local) and choked(peer) - + interested(local) and unchoked(peer) - + interested(peer) and choked(local) - + interested(peer) and unchoked(local) - + optimistic unchoke - + peer snubbed - + incoming connection - + not interested(local) and unchoked(peer) - + not interested(peer) and unchoked(local) - + peer from PEX samtavolano de PEX - + peer from DHT samtavolano de DHT - + encrypted traffic ĉifrita trafiko - + encrypted handshake ĉifrita kvitanco - + peer from LSD samtavolano de LSD @@ -5958,193 +5225,178 @@ PeerListWidget - + IP IP-adreso - + Port Pordo - + Flags Flagoj - + Connection Konekto - + Client i.e.: Client application Kliento - + Progress i.e: % downloaded Progreso - + Down Speed i.e: Download speed Elŝutrapido - + Up Speed i.e: Upload speed Alŝutrapido - + Downloaded i.e: total data downloaded Elŝutis - + Uploaded i.e: total data uploaded Alŝutis - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Rilateco - + Files i.e. files that are being downloaded right now Dosieroj - + Column visibility - + Add a new peer... Aldoni novan samtavolano... - - + + Ban peer permanently Forbari la samtavolanon daŭre - + Manually adding peer '%1'... Permane aldonante la samtavolanon '%1'... - + The peer '%1' could not be added to this torrent. La samtavolano '%1' ne eblis aldoniĝi al la torento. - + Manually banning peer '%1'... Permane forbarante la samtavolanon '%1'... - - + + Peer addition Aldono de samtavolano - + Country - + Copy IP:port - + Some peers could not be added. Check the Log for details. Kelkaj samtavolanoj ne eblis aldoniĝi. Kontroli la Protokolon por detaloj. - + The peers were added to this torrent. La samtavolanoj aldoniĝis al la torento. - + Are you sure you want to ban permanently the selected peers? Ĉu vi certas, ke vi volas forbari daŭre la elektitajn samtavolanojn? - + &Yes &Jes - + &No &Ne - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - + PeersAdditionDlg - + No peer entered - + Neniu samtavolano eniĝis - + Please type at least one peer. - + Bonvolu tajpi almenaŭ unu samtavolanon. - + Invalid peer - + Malvalida samtavolano - + The peer '%1' is invalid. - + La samtavolano '%1' malvalidas. PieceAvailabilityBar - + White: Unavailable pieces Blanko: Maldisponeblaj pecoj - + Blue: Available pieces Bluo: Disponeblaj pecoj @@ -6152,336 +5404,288 @@ PiecesBar - + Files in this piece: - + File in this piece - + File in these pieces - - Wait until metadata become available to see detailed information - - - - + Hold Shift key for detailed information - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Serĉilaj kromprogramoj - + Installed search plugins: - + Instalitaj serĉilaj kromprogramoj: - + Name - Nomo + Nomo - + Version - + Versio - + Url - + URL-adreso - - + + Enabled - - - - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - + Ebligita - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Vi povas akiri novajn serĉilajn kromprogramojn ĉi tie: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Instali novan - + Check for updates - + Kontroli ĝisdatigadon - + Close - + Fermi - + Uninstall - + Malinstali - - - + + + Yes - Jes + Jes - - - - + + + + No - Ne + Ne - + Uninstall warning - + Averto de malinstalado - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Uninstall success - + Malinstalo sukcesis - + All selected plugins were uninstalled successfully - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - - - - - + + New search engine plugin URL - - + + URL: - + URL-adreso: - + Invalid link - + Malvalida ligilo - + The link doesn't seem to point to a search engine plugin. - + Select search plugins - + Elektu serĉilajn kromprogramojn - + qBittorrent search plugin - + serĉila kromprogramo de qBittorrent + + + + + + Search plugin update + Serĉila kromprograma ĝisdatigado - + All your plugins are already up to date. - + Ĉiuj viaj kromprogramoj jam estas ĝisdataj. - + Sorry, couldn't check for plugin updates. %1 - + + + Search plugin install + Serĉila kromprograma instalado + + + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine - + Couldn't install "%1" search engine plugin. %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + + + + Couldn't update "%1" search engine plugin. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Search plugin source: - + Local file - + Loka dosiero - + Web link - - - - - PowerManagement - - - qBittorrent is active - + TTT-ligilo - PreviewSelectDialog - - - Preview - - + PreviewSelect - + Name - Nomo + Nomo - + Size - Grando + Grando - + Progress - Progreso + Progreso - - + + Preview impossible - + Antaŭrigardo maleblas - - + + Sorry, we can't preview this file - - - - - Private::FileLineEdit - - - '%1' does not exist - - - - - '%1' does not point to a directory - - - - - '%1' does not point to a file - - - - - Does not have read permission in '%1' - - - - - Does not have write permission in '%1' - + Bedaŭrinde, ni neeblas antaŭrigardi la dosieron PropListDelegate - + Not downloaded Ne elŝutita - - + + Normal Normal (priority) Norma - - N/A - N/A - - - + Do not download Do not download (priority) - - + + High High (priority) Alta - + Mixed Mixed (priorities Miksita - - + + Maximum Maximum (priority) Maksimuma @@ -6490,32 +5694,32 @@ PropTabBar - + General Ĝenerala - + Trackers Spuriloj - + Peers Samtavolanoj - + HTTP Sources HTTP-fontoj - + Content Enhavo - + Speed Rapido @@ -6609,22 +5813,22 @@ Komento: - + Select All Elekti cion - + Select None Elekti nenion - + Normal Norma - + High Alta @@ -6684,165 +5888,165 @@ Konserva Dosierindiko: - + Maximum Maksimuma + - Do not download Ne elŝuti - + Never Neniam - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (havas %3) - - + + %1 (%2 this session) %1 (%2 ĉi tiu seanco) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (fontsendis dum %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 maks.) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 tute) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 mez.) - + Open Malfermi - + Open Containing Folder Malfermi la Enhavantan Dosierujon - + Rename... Renomi... - + Priority Prioritato - + New Web seed Nova TTT-fonto - + Remove Web seed Forigi TTT-fonton - + Copy Web seed URL Kopii URL-adreson de TTT-fonto - + Edit Web seed URL Redakti URL-adreson de TTT-fonto - + + Rename the file + Renomi la dosieron + + + New name: Nova nomo: - - + + + The file could not be renamed + La dosiero ne eblis renomiĝi + + + + This file name contains forbidden characters, please choose a different one. + La dosiernomo enhavas malpermesitajn signojn, bonvolu elekti alian. + + + + This name is already in use in this folder. Please use a different name. La nomo jam estas uzata en ĉi tiu dosierujo. Bonvolu uzi alian nomon. - + The folder could not be renamed La dosierujo ne eblis renomiĝi - + qBittorrent qBittorrent - + Filter files... Filtri dosierojn... - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - - - - + New URL seed New HTTP source Nova URL-fonto - + New URL seed: Nova URL-fonto: - - + + This URL seed is already in the list. Tiu URL-fonto jam estas en la listo. - + Web seed editing TTT-fonta redaktado - + Web seed URL: URL-adreso de la TTT-fonto: @@ -6850,857 +6054,817 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + + + + + Error: '%1' is not a valid torrent file. + + Eraro: '%1' ne estas valida torentdosiero. + + + + + Error: Could not add torrent to session. + Eraro: Ne eblis aldoni la torenton al la seanco. + + + + I/O Error: Could not create temporary file. + Eneliga Eraro: Ne eblis krei provizoran dosieron. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 estas nekonata komandlinia parametro. - - + + %1 must be the single command line parameter. %1 nepras esti la sola komandlinia parametro. - + + %1 must specify the correct port (1 to 65535). + %1 nepras specifi la ĝustan pordon (de 1 al 65535). + + + You cannot use %1: qBittorrent is already running for this user. %1 ne povas uziĝi de vi: qBittorrent jam funkciantas por ĉi tiu uzanto. - + Usage: Uzo: - + Options: Opcioj: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - - - - - Expected integer number in environment variable '%1', but got '%2' - - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - - - - - Expected %1 in environment variable '%2', but got '%3' - - - - - port - - - - - %1 must specify a valid port (1 to 65535). - - - - - Display program version and exit - + + Displays program version + Vidigas la version de la programaro - - Display this help message and exit - + + Displays this help message + Vidigas ĉi tiun helpmesaĝon - - Change the Web UI port - + + Changes the Web UI port (current: %1) + Ŝanĝas la TTT-UI-pordon (aktuale: %1) - + Disable splash screen Malebligi salutŝildon - + Run in daemon-mode (background) Lanĉi per demonreĝimo (fone) - - dir - Use appropriate short form or abbreviation of "directory" - - - - - Store configuration files in <dir> - - - - - - name - - - - - Store configuration files in directories qBittorrent_<name> - - - - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - - - - - files or URLs - - - - - Download the torrents passed by the user - - - - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - - - - - Options when adding new torrents: - - - - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - - - - - path - - - - - Torrent save path - - - - - Add torrents as started or paused - - - - - Skip hash check - Preterpasi la haketan kontrolon - - - - Assign torrents to category. If the category doesn't exist, it will be created. - - - - - Download files in sequential order - - - - - Download first and last pieces first - - - - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - - - - - Command line parameters take precedence over environment variables - + + Downloads the torrents passed by the user + Elŝutas la torentojn, kiuj estas aprobitaj de la uzanto - + Help Helpo - + Run application with -h option to read about command line parameters. Lanĉu la aplikaĵon kun la opcion -h por legi pri komandliniaj parametroj. - + Bad command line Malvalida komandlinio - + Bad command line: Malvalida komandlinio: - + Legal Notice Leĝa Noto - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - - - - - No further notices will be issued. - - - - + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. No further notices will be issued. - + Press %1 key to accept and continue... Premu la %1-klavon por akcepti kaj daŭrigi... - + Legal notice Leĝa noto - + Cancel Nuligi - + I Agree Mi Konsentas - - - Upgrade - Aktualigo + + Torrent name: %1 + Nomo de la torento: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - + + Torrent size: %1 + Grando de la torento: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - + + Save path: %1 + Konserva dosierindiko: %1 - - Couldn't migrate torrent with hash: %1 - Ne eblis migrigi torenton kun hakedo: %1 + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + La torento elŝutiĝis en %1. - - Couldn't migrate torrent. Invalid fastresume file name: %1 - Ne eblis migrigi torenton. Malvalida dosiernomo por rapide reaktiviĝi: %1 + + Thank you for using qBittorrent. + Dankon pro uzi la qBittorrent-klienton. - - Detected unclean program exit. Using fallback file to restore settings: %1 - + + [qBittorrent] '%1' has finished downloading + [qBittorrent] '%1' finiĝis elŝuti - - An access error occurred while trying to write the configuration file. - + + The remote host name was not found (invalid hostname) + La nomo de la malloka gastigo ne troviĝis (malvalida gastiga nomo) - - A format error occurred while trying to write the configuration file. - + + The operation was canceled + La operacio malfariĝis - - An unknown error occurred while trying to write the configuration file. + + The remote server closed the connection prematurely, before the entire reply was received and processed - - - RSS::AutoDownloader - - - Invalid data format. - + + The connection to the remote server timed out + La konekto al la malloka servilo eltempiĝis. - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - + + SSL/TLS handshake failed + SSL-/TSL-kvitanco malsukcesis - - Invalid data format - + + The remote server refused the connection + La malloka servilo rifuzis la konekton - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - + + The connection to the proxy server was refused + La konekto al la prokurilo rifuziĝis + + + + The proxy server closed the connection prematurely + La prokurilo fermis la konekton antaŭtempe + + + + The proxy host name was not found + La nomo de la prokurila gastigo ne troviĝis - - Couldn't load RSS AutoDownloader rules. Reason: %1 + + The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 + + The proxy requires authentication in order to honor the request but did not accept any credentials offered - - RSS feed at '%1' updated. Added %2 new articles. + + The access to the remote content was denied (401) - - Failed to parse RSS feed at '%1'. Reason: %2 + + The operation requested on the remote content is not permitted - - Couldn't read RSS Session data from %1. Error: %2 + + The remote content was not found at the server (404) - - Couldn't parse RSS Session data. Error: %1 + + The remote server requires authentication to serve the content but the credentials provided were not accepted - - Couldn't load RSS Session data. Invalid data format. + + The Network Access API cannot honor the request because the protocol is not known - - Couldn't load RSS article '%1#%2'. Invalid data format. + + The requested operation is invalid for this protocol - - - RSS::Private::Parser - - Invalid RSS feed. + + An unknown network-related error was detected - - %1 (line: %2, column: %3, offset: %4). + + An unknown proxy-related error was detected - - - RSS::Session - - RSS feed with given URL already exists: %1. + + An unknown error related to the remote content was detected - - Cannot move root folder. + + A breakdown in protocol was detected - - - Item doesn't exist: %1. + + Unknown error + Nekonata eraro + + + + + Upgrade + Aktualigo + + + + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - - Cannot delete root folder. + + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - - Incorrect RSS Item path: %1. + + Couldn't migrate torrent with hash: %1 + Ne eblis migrigi torenton kun hakedo: %1 + + + + Couldn't migrate torrent. Invalid fastresume file name: %1 + Ne eblis migrigi torenton. Malvalida dosiernomo por rapide reaktiviĝi: %1 + + + + Detected unclean program exit. Using fallback file to restore settings. - - RSS item with given path already exists: %1. + + An access error occurred while trying to write the configuration file. - - Parent folder doesn't exist: %1. + + A format error occurred while trying to write the configuration file. - RSSWidget + RSS - + Search - - - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - + Serĉi - + New subscription - + Nova abono - - - + + + Mark items read - - - - - Refresh RSS streams - + Marki elementojn kiel legitaj - + Update all - + Ĝisdatigi ĉion - + RSS Downloader... - + RSS-elŝutilo... + + + + Settings... + Agordoj... - + Torrents: (double-click to download) - + Torentoj: (duoble alklaki por elŝuti) - - + + Delete - Forigi + Forigi - + Rename... - Renomi... + Renomi... - + Rename - Renomi... + Renomi... - - + + Update - + Ĝisdatigi - + New subscription... - + Nova abono... - - + + Update all feeds - + Ĝisdatigi ĉiujn fluojn - + Download torrent - + Elŝuti la torenton - + Open news URL - + Malfermi novaĵan URL-adreson - + Copy feed URL - + Kopii la URL-adreson de la fluo - + New folder... - + Nova dosierujo... - - Please choose a folder name - + + Refresh RSS streams + Aktualigi RSS-fluojn + + + RSSImp - - Folder name: - + + Stream URL: + Flua URL-adreso: - - New folder - + + Please type a RSS stream URL + Bonvolu tajpi URL-adreson por RSS-fluo - - Please type a RSS feed URL - + + This RSS feed is already in the list. + Tiu RSS-fluo jam estas en la listo. - - Feed URL: - + + Please choose a folder name + Bonvolu elekti dosierujo-nomon + + + + Folder name: + Dosierujo-nomo: + + + + New folder + Nova dosierujo - + Deletion confirmation - + Foriga konfirmado - + Are you sure you want to delete the selected RSS feeds? - + Ĉu vi certas, ke vi volas forigi la elektitajn RSS-fluojn? - + Please choose a new name for this RSS feed - + Bonvolu elekti novan nomon por tiu RSS-fluo - + New feed name: - + Nova flunomo: - - Rename failed - + + Name already in use + Nomo jam estas uzata + + + + This name is already used by another item, please choose another one. + Tiu nomo jam estas uzata de alia elemento, bonvolu elekti alian. - + Date: - + Dato: - + Author: - + Aŭtoro: - - - ScanFoldersDelegate - - Select save location - + + Unread + Nelegita - ScanFoldersModel + Rss::Feed - - Monitored Folder + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... - - Override Save Location + + Automatically downloading '%1' torrent from '%2' RSS feed... + + + Rss::Private::Parser - - Monitored folder + + Invalid RSS feed. + + + RssSettingsDlg - - Default save location - + + RSS Reader Settings + RSS-legilaj Agordoj - - Browse... + + RSS feeds refresh interval: + Intervalo inter aktualigoj de RSS-fluoj + + + + min + + + Maximum number of articles per feed: + Maksimuma nombro da artikoloj por fluo: + - SearchJobWidget + ScanFoldersDelegate - - Form + + Select save location + + + ScanFoldersModel - - Results(xxx) + + Monitored Folder - - Search in: + + Override Save Location - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + + Monitored folder - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + + Default save location - - Seeds: - Fontsendantoj: + + Browse... + Folii... + + + SearchEngine - - <html><head/><body><p>Minimal number of seeds</p></body></html> + + Unknown search engine plugin file format. - - - to + + A more recent version of this plugin is already installed. - - <html><head/><body><p>Maximal number of seeds</p></body></html> + + + Plugin is not supported. + Kromprogramo ne subtenatas. + + + + Update server is temporarily unavailable. %1 - - - + + + Failed to download the plugin file. %1 - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + + An incorrect update info received. - - Size: - Grando: + + All categories + Ĉiuj kategorioj - - <html><head/><body><p>Minimal torrent size</p></body></html> - + + Movies + Filmoj - - <html><head/><body><p>Maximal torrent size</p></body></html> - + + TV shows + Televidserioj + + + + Music + Muziko + + + + Games + Ludoj + + + + Anime + Animeo - + + Software + Programaroj + + + + Pictures + Bildoj + + + + Books + Libroj + + + + SearchListDelegate + + + + Unknown + Nekonata + + + + SearchTab + + Name i.e: file name - Nomo + Nomo - + Size i.e: file size - Grando + Grando - + Seeders i.e: Number of full sources - + Fontoj - + Leechers i.e: Number of partial sources - + Ricevantoj - + Search engine - - - - - Filter search results... - + Serĉilo - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Torrent names only - + Everywhere - - Use regular expressions - - - - + Searching... - + Search has finished Serĉo finiĝis - + Search aborted - + An error occurred during search... - + Search returned no results - + Column visibility - - - SearchPluginManager - - - Unknown search engine plugin file format. - - - - - A more recent version of this plugin is already installed. - - - - - Plugin is not supported. + + Form - - All categories + + Results(xxx) - - Movies + + Search in: - - TV shows + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - - Music + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - - Games - + + Seeds: + Fontsendantoj: - - Anime + + <html><head/><body><p>Minimal number of seeds</p></body></html> - - Software - + + + to + al - - Pictures + + <html><head/><body><p>Maximal number of seeds</p></body></html> - - - Books + + + + - - Update server is temporarily unavailable. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - - - Failed to download the plugin file. %1 - + + Size: + Grando: - - An incorrect update info received. + + <html><head/><body><p>Minimal torrent size</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> @@ -7709,197 +6873,185 @@ - - - - + + + Search Serĉi - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - - + Download Elŝuti - + Go to description page Iri al la priskribpaĝo - + Copy description page URL Kopii la URL-adreson de la priskribpaĝo - + Search plugins... Serĉilaj kromprogramoj... - + A phrase to search for. - + Spaces in a search term may be protected by double quotes. - + Example: Search phrase example - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - + All plugins Ĉiuj kromprogramoj - + Only enabled - + Select... - - - + + + Search Engine Serĉilo - + Please install Python to use the Search Engine. Bonvolu instali Pitonon por uzi la Serĉilon. - + Empty search pattern Malplena serĉa ŝablono - + Please type a search pattern first Bonvolu tajpi serĉan ŝablonon unue - + Stop Halti - + Search has finished Serĉo finiĝis - + Search has failed Serĉo malsukcesis - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + E&xit Now - + Exit confirmation - + Ĉesa konfirmado - + The computer is going to shutdown. - + &Shutdown Now - - Shutdown confirmation - - - - + The computer is going to enter suspend mode. - + &Suspend Now - + Suspend confirmation - + The computer is going to enter hibernation mode. - + &Hibernate Now - + Hibernate confirmation - + You can cancel the action within %1 seconds. + + + Shutdown confirmation + Malŝalta konfirmado + SpeedLimitDialog - + KiB/s KiB/s @@ -7907,52 +7059,52 @@ SpeedPlotView - + Total Upload Tuta Alŝutrapido - + Total Download Tuta Elŝutrapido - + Payload Upload Utilŝarĝa alŝutrapido - + Payload Download Utilŝarĝa elŝutrapido - + Overhead Upload Superŝarĝa alŝutrapido - + Overhead Download Superŝarĝa elŝutrapido - + DHT Upload DHT-alŝutrapido - + DHT Download DHT-elŝutrapido - + Tracker Upload Spurila Alŝuto - + Tracker Download Spurila Elŝuto @@ -7960,95 +7112,87 @@ SpeedWidget - + Period: Daŭro: - + 1 Minute 1 minuto - + 5 Minutes 5 minutoj - + 30 Minutes 30 minutoj - + 6 Hours 6 horoj - + Select Graphs Elekti grafeojn - + Total Upload Tuta alŝutrapido - + Total Download Tuta elŝutrapido - + Payload Upload Utilŝarĝa alŝutrapido - + Payload Download Utilŝarĝa elŝutrapido - + Overhead Upload Superŝarĝa alŝutrapido - + Overhead Download Superŝarĝa elŝutrapido - + DHT Upload DHT-alŝutrapido - + DHT Download DHT-elŝutrapido - + Tracker Upload Spurila Alŝuto - + Tracker Download Spurila Elŝuto - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8061,49 +7205,49 @@ Uzantaj statistikoj - - Cache statistics - Kaŝmemoraj statistikoj + + Total peer connections: + Totala nombro da samtavolaj konektoj: - - Read cache hits: - + + Global ratio: + Malloka proporcio: - - Average time in queue: - + + Alltime download: + Ĉiama elŝutkvanto: - - Connected peers: - + + Alltime upload: + Ĉiama alŝutkvanto: - - All-time share ratio: - + + Total waste (this session): + Senefika tuto (ĉi tiu seanco): - - All-time download: - + + Cache statistics + Kaŝmemoraj statistikoj - - Session waste: + + Read cache hits: - - All-time upload: + + Average time in queue: - Total buffer size: - + Total buffers size: + Tuta bufrogrando: @@ -8131,7 +7275,12 @@ Tuta enviciĝit-grando: - + + OK + Bone + + + %1 ms 18 milliseconds @@ -8140,27 +7289,32 @@ StatusBar - + Connection status: Konekta stato: - + No direct connections. This may indicate network configuration problems. - + DHT: %1 nodes DHT: %1 nodoj - - qBittorrent needs to be restarted! - + + qBittorrent needs to be restarted + qBittorrent devas relanĉiĝi + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent ĵus ĝisdatiĝis kaj devas relanĉiĝi por la ŝanĝoj efiki. @@ -8179,876 +7333,616 @@ Konektite - + Click to switch to alternative speed limits - + Click to switch to regular speed limits - + + Manual change of rate limits mode. The scheduler is disabled. + + + + Global Download Speed Limit Malloka elŝutrapidlimo - + Global Upload Speed Limit Malloka alŝutrapidlimo - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - + Ĉio (0) - + Downloading (0) - + Elŝutante (0) - + Seeding (0) - + Fontsendanta (0) - + Completed (0) - + Finite (0) - + Resumed (0) - + Reaktiviĝita (0) - + Paused (0) - + Paŭzinta (0) - + Active (0) - + Aktiva (0) - + Inactive (0) - + Malaktiva (0) - + Errored (0) - + Erarinta (0) - + All (%1) - Ĉio (%1) + Ĉio (%1) - + Downloading (%1) - + Elŝutante (%1) - + Seeding (%1) - + Fontsendanta (%1) - + Completed (%1) - + Finite (%1) - + Paused (%1) - + Paŭzinta (%1) - + Resumed (%1) - + Reaktiviĝita (%1) - + Active (%1) - + Aktiva (%1) - + Inactive (%1) - + Malaktiva (%1) - + Errored (%1) - + Erarinta (%1) - TagFilterModel + TorrentContentModel - - Tags - + + Name + Nomo - - All - + + Size + Grando - - Untagged - + + Progress + Progreso - - - TagFilterWidget - - Add tag... - + + Download Priority + Elŝut-prioritato - - Remove tag - - - - - Remove unused tags - - - - - Resume torrents - Reaktivigi la torentojn - - - - Pause torrents - Paŭzigi la torentojn - - - - Delete torrents - Forigi la torentojn - - - - New Tag - - - - - Tag: - - - - - Invalid tag name - - - - - Tag name '%1' is invalid - - - - - Tag exists - - - - - Tag name already exists. - + + Remaining + Restanta - TorrentCategoryDialog + TorrentCreatorDlg - - Torrent Category Properties - + + Select a folder to add to the torrent + Elektu dosierujon por aldoni al la torento - - Name: - + + Select a file to add to the torrent + Elektu dosieron por aldoni al la torento - - Save path: + + No input path set - - Choose save path + + Please type an input path first - - New Category - + + Select destination torrent file + Elektu celitan torentodosieron - - Invalid category name - + + Torrent Files (*.torrent) + Torentdosieroj (*.torrent) - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - + + Torrent was created successfully: %1 + %1 is the path of the torrent + La torento kreiĝis sukcese: %1 - - Category creation error - + + + + Torrent creation + Torentkreado - - Category with the given name already exists. -Please choose a different name and try again. - + + Torrent creation was unsuccessful, reason: %1 + Torentkreado malsukcesis, kialo: %1 + + + + Created torrent file is invalid. It won't be added to download list. + La kreita torentdosiero malvalidas. Ĝi ne aldoniĝos al la elŝutlisto. - TorrentContentModel + TorrentModel - + Name + i.e: torrent name Nomo - + Size + i.e: torrent size Grando - - Progress - Progreso - - - - Download Priority - Elŝut-prioritato - - - - Remaining - - - - - Availability - - - - - TorrentCreatorDialog - - - Torrent Creator - - - - - Select file/folder to share - - - - - Path: - - - - - [Drag and drop area] - - - - - - Select file - - - - - - Select folder - - - - - Settings - - - - - Piece size: - - - - - Auto - - - - - 16 KiB - - - - - 32 KiB - - - - - 64 KiB - - - - - 128 KiB - - - - - 256 KiB - - - - - 512 KiB - - - - - 1 MiB - - - - - 2 MiB - - - - - 4 MiB - - - - - 8 MiB - - - - - 16 MiB - - - - - 32 MiB - - - - - Calculate number of pieces: - - - - - Private torrent (Won't distribute on DHT network) - - - - - Start seeding immediately - - - - - Ignore share ratio limits for this torrent - - - - - Optimize alignment - - - - - Fields - - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - - - - Web seed URLs: - - - - - Tracker URLs: - - - - - Comments: - - - - - Source: - - - - - Progress: - Progreso: - - - - Create Torrent - - - - - - - Torrent creation failed - + + Done + % Done + Finita - - Reason: Path to file/folder is not readable. - + + Status + Torrent status (e.g. downloading, seeding, paused) + Stato - - Select where to save the new torrent - + + Seeds + i.e. full sources (often untranslated) + Fontoj - - Torrent Files (*.torrent) - + + Peers + i.e. partial sources (often untranslated) + Samtavolanoj - - Reason: %1 - + + Down Speed + i.e: Download speed + Elŝutrapido - - Reason: Created torrent is invalid. It won't be added to download list. - + + Up Speed + i.e: Upload speed + Alŝutrapido - - Torrent creator - + + Ratio + Share ratio + Proporcio - - Torrent created: - + + ETA + i.e: Estimated Time of Arrival / Time left + ETA - - - TorrentInfo - - File size exceeds max limit %1 + + Category - - Torrent file read error: %1 - + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Aldonita je - - Torrent file read error: size mismatch - + + Completed On + Torrent was completed on 01/01/2010 08:00 + Finita je - - - TorrentsController - - Not contacted yet - + + Tracker + Spurilo - - Updating... - + + Down Limit + i.e: Download limit + Elŝutlimo - - Working - + + Up Limit + i.e: Upload limit + Alŝutlimo - - Not working - + + Downloaded + Amount of data downloaded (e.g. in MB) + Elŝutita - - Error: '%1' is not a valid torrent file. - + + Uploaded + Amount of data uploaded (e.g. in MB) + Alŝutita - - - - - Torrent queueing must be enabled - + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Elŝutita ĉi-seance - - Save path cannot be empty - + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Alŝutita ĉi-seance - - - Category cannot be empty - + + Remaining + Amount of data left to download (e.g. in MB) + Restanta - - Unable to create category - + + Time Active + Time (duration) the torrent is active (not paused) + Aktiva tempo - - Unable to edit category - + + Save path + Torrent save path + Konserva dosierindiko - - Cannot make save path - + + Completed + Amount of data completed (e.g. in MB) + Finita - - Cannot write to directory - + + Ratio Limit + Upload share ratio limit + Proporci-limo - - WebUI Set location: moving "%1", from "%2" to "%3" - + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Laste trovita plene - - Incorrect torrent name - + + Last Activity + Time passed since a chunk was downloaded/uploaded + Lasta ago - - - Incorrect category name - + + Total Size + i.e. Size including unwanted data + Tuta grando TrackerFiltersList - + All (0) this is for the tracker filter - + Ĉio (0) - + Trackerless (0) Senspurila (0) - + Error (0) Eraro (0) - + Warning (0) Averto (0) - - + + Trackerless (%1) Senspurila (%1) - - + %1 (%2) + openbittorrent.com (10) + %1 (%2) + + + + Error (%1) Eraro (%1) - - + + Warning (%1) Averto (%1) - + Resume torrents Reaktivigi la torentojn - + Pause torrents Paŭzigi la torentojn - + Delete torrents Forigi la torentojn - - + + All (%1) this is for the tracker filter Ĉio (%1) - TrackerListWidget + TrackerList - - - Working - + + URL + URL - - Disabled - + + Status + Stato - - This torrent is private + + Received - - Updating... - + + Seeds + Fontoj - - Not working - + + Peers + Samtavolanoj - - Not contacted yet + + Downloaded - - - - - - - N/A - N/A + + Message + Mesaĝo - - Tracker editing - + + + Working + Funkciante - - Tracker URL: - + + Disabled + Malebligita - - - Tracker editing failed - + + This torrent is private + Ĉi tiu torento estas privata - - The tracker URL entered is invalid. - + + Updating... + Ĝisdatiĝante... - - The tracker URL already exists. - + + Not working + Nefunkciante - - Add a new tracker... - + + Not contacted yet + Ne jam kontaktiĝis - - Remove tracker - + + Tracker URL: + Spurila URL-adreso: - - Copy tracker URL - + + Tracker editing + Spuril-redaktado - - Edit selected tracker URL - + + + Tracker editing failed + Spuril-redaktado malsukcesis - - Force reannounce to selected trackers - + + The tracker URL entered is invalid. + Malvalidas la spurila URL-adreso, kiun vi enigis. - - Force reannounce to all trackers - + + The tracker URL already exists. + Tiu spurila URL-adreso jam ekzistas. - - URL - + + Add a new tracker... + Aldoni novan spurilon... - - Status - Stato + + Copy tracker URL + Kopii la spurilan URL-adreson: - - Received - + + Edit selected tracker URL + Redakti la elektitan spurilan URL-adreson - - Seeds + + Force reannounce to selected trackers - - Peers - Samtavolanoj - - - - Downloaded - Elŝutis - - - - Message + + Force reannounce to all trackers - - Column visibility - + + Remove tracker + Forigi la spurilon - TrackerLoginDialog - - - - Tracker authentication - - + TrackersAdditionDlg - - Tracker: - - - - - Login - Ensaluti - - - - Username: - - - - - Password: + + Trackers addition dialog - - Log in - + + List of trackers to add (one per line): + Listo da spuriloj por aldoni (po unu por linio): - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + URL-adreso de listo, kiu kongruas kun µTorrent: - - List of trackers to add (one per line): - + + I/O Error + Eneliga Eraro - - µTorrent compatible list URL: + + Error while trying to open the downloaded file. - + No change - + Neniu ŝanĝo - + No additional trackers were found. - + Download error - Elŝuta eraro + Elŝuta eraro - + The trackers list could not be downloaded, reason: %1 @@ -9056,686 +7950,692 @@ TransferListDelegate - + Downloading Elŝutante - + Downloading metadata used when loading a magnet link Elŝutanta metadatenojn - + Allocating qBittorrent is allocating the files on disk - + Paused Paŭzinta - + Queued i.e. torrent is queued Enviciĝita - + Seeding Torrent is complete and in upload-only mode Fontsendanta - + Stalled Torrent is waiting for download to begin Haltigita - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] Elŝutanta - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] Fontsendanta - + Checking Torrent local data is being checked Kontrolate - + Queued for checking i.e. torrent is queued for hash checking Enviciĝita por kontrolado - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Kontrolante reaktivigajn datenojn - - - Completed - Finita - - - - Moving - Torrent local data are being moved/relocated - - - - - Missing Files - Mankantaj Dosieroj - - - - Errored - torrent status, the torrent has an error - Erarinta - - - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - %1 (fontsendis dum %2) - - - - %1 ago - e.g.: 1h 20m ago - antaŭ %1 - - - - TransferListFiltersWidget - - - Status - Stato - - - - Categories - - - - - Tags - - - - - Trackers - Spuriloj - - - - TransferListModel - - - Name - i.e: torrent name - Nomo - - - - Size - i.e: torrent size - Grando - - - - Done - % Done - - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Stato - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - Samtavolanoj - - - - Down Speed - i.e: Download speed - Elŝutrapido - - - - Up Speed - i.e: Upload speed - Alŝutrapido - - - - Ratio - Share ratio - - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - - - - - Tags - - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Elŝutis - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Alŝutis - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - + + + Completed + Finita - - Time Active - Time (duration) the torrent is active (not paused) - + + Missing Files + Mankantaj Dosieroj - - Save path - Torrent save path - + + Errored + torrent status, the torrent has an error + Erarinta - - Completed - Amount of data completed (e.g. in MB) - Finita + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) + %1 (fontsendis dum %2) - - Ratio Limit - Upload share ratio limit - + + %1 ago + e.g.: 1h 20m ago + antaŭ %1 + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + Stato - - Last Activity - Time passed since a chunk was downloaded/uploaded + + Categories - - Total Size - i.e. Size including unwanted data - + + Trackers + Spuriloj TransferListWidget - + Column visibility - + Choose save path Elektu la konservan dosierindikon - + Torrent Download Speed Limiting - + Torrent Upload Speed Limiting - + Recheck confirmation - + Are you sure you want to recheck the selected torrent(s)? Ĉu vi certas, ke vi volas rekontroli la elektita(j)n torento(j)n? - + Rename Renomi... - + New name: Nova nomo: - + Resume Resume/start the torrent Reaktivigi - + Force Resume Force Resume/start the torrent Trude reaktivigi - + Pause Pause the torrent Paŭzigi - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - - - - - Add Tags - - - - - Remove All Tags - - - - - Remove all tags from selected torrents? + + New Category - - Comma-separated tags: + + Category: - - Invalid tag + + Invalid category name - - Tag name: '%1' is invalid + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. - + Delete Delete the torrent Forigi - + Preview file... Antaŭrigardi la dosieron... - + Limit share ratio... Limigi kunhavan proporcion... - + Limit upload rate... Limigi alŝutrapidon... - + Limit download rate... Limigi elŝutrapidon... - + Open destination folder Malfermi la celdosierujon - + Move up i.e. move up in the queue Movi supren - + Move down i.e. Move down in the queue Movi malsupren - + Move to top i.e. Move to top of the queue Movi al la supro - + Move to bottom i.e. Move to bottom of the queue Movi al la malsupro - + Set location... Agordi lokon... - - Force reannounce - - - - + Copy name Kopii la nomon - - Copy hash - - - - + Download first and last pieces first - + Automatic Torrent Management - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - + Category - + New... New category... - + Reset Reset category - - Tags - - - - - Add... - Add / assign multiple tags... - - - - - Remove All - Remove all tags - - - - + Priority Prioritato - + Force recheck Trude rekontroli - + Copy magnet link Kopii la magnet-ligilon - + Super seeding mode Superfontsendanta reĝimo - + Rename... Renomi... - + Download in sequential order Elŝuti en sinsekva ordo - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + Limitado de torenta alŝut-elŝut-proporcio - - Use global share limit - + + Use global ratio limit + Uzi la mallokan proporci-limon - - - + + + buttonGroup + butongrupo + + + + Set no ratio limit + Agordi neniun proporci-limon + + + + Set ratio limit to + Agordi la proporci-limon al + + + + WebApplication + + + Incorrect category name + + + + + WebUI + + + The Web UI is listening on port %1 - - Set no share limit + + Web UI Error - Unable to bind Web UI to port %1 + + + about - - Set share limit to + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - ratio + + Copyright %1 2006-2016 The qBittorrent project - - minutes + + Home Page: - - No share limit method selected + + Forum: - - Please select a limit method first + + Bug Tracker: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - + + Add Peers + Aldonu Samtavolanojn - - Python not detected - + + List of peers to add (one per line): + Listo da samtavolanoj por aldoni (po unu por linio): + + + + Format: IPv4:port / [IPv6]:port + Aranĝo: IPv4:pordo / [IPv6]:pordo - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - + + + Tracker authentication + Spuril-aŭtentigado - - Symlinks inside alternative UI folder are forbidden. - + + Tracker: + Spurilo: - - Exceeded the maximum allowed file size (%1)! - + + Login + Ensaluti + + + + Username: + Uzantnomo: + + + + Password: + Pasvorto: + + + + Log in + Ensaluti + + + + Cancel + Nuligi + + + + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + Foriga konfirmado - qBittorrent - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' + + Remember choice + Memori elekton + + + + Also delete the files on the hard disk + Forigi ankaŭ la dosierojn el la diskilo + + + + confirmShutdownDlg + + + Don't show again + + + createTorrentDialog + + + Cancel + Nuligi + + + + Torrent Creation Tool + Torentkreilo + + + + Torrent file creation + Torentdosierkreado + + + + Add file + Aldoni dosieron + + + + Add folder + Aldoni dosierujon + + + + File or folder to add to the torrent: + Dosiero aŭ dosierujo por aldoni al la torento: + + + + Tracker URLs: + Spurilaj URL-adresoj: + + + + Web seeds urls: + URL-adresoj de TTT-fontoj: + + + + Comment: + Komento: + - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' + + Piece size: + Pecogrando: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + Aŭtomate + + + + Private (won't be distributed on DHT network if enabled) - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' + + Start seeding after creation + Ekfontsendi post kreado + + + + Ignore share ratio limits for this torrent + + + Create and save... + Krei kaj konservu... + + + + Progress: + Progreso: + - WebUI + downloadFromURL - - Web UI: HTTPS setup successful - + + Add torrent links + Aldoni torentligilojn - - Web UI: HTTPS setup failed, fallback to HTTP + + One per line (HTTP links, Magnet links and info-hashes are supported) - - Web UI: Now listening on IP: %1, port: %2 - + + Download + Elŝuti + + + + Cancel + Nuligi + + + + Download from urls + Elŝuti de URL-adresoj - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 + + No URL entered + Neniu URL-adreso eniĝis + + + + Please type at least one URL. + Bonvolu tajpi almenaŭ unu URL-adreson. + + + + errorDialog + + + Crash info fsutils - + + + + + Downloads Elŝutoj @@ -9743,100 +8643,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) - + EiB exbibytes (1024 pebibytes) - + + Python not detected + Pitono netrovita + + + + Python version: %1 + Pitona versio: %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1h %2m - + %1d %2h e.g: 2days 10hours %1t %2h - + Unknown Unknown (size) Nekonata - + qBittorrent will shutdown the computer now because all downloads are complete. - + < 1m < 1 minute < 1m - + %1m e.g: 10minutes %1m + + + Working + Funkciante + + + + Updating... + Ĝisdatiĝante... + + + + Not working + Nefunkciante + + + + Not contacted yet + Ne jam kontaktiĝis + preview - + Preview selection Antaŭrigarda elekto - + The following files support previewing, please select one of them: La jenaj dosieroj subteni antaŭrigardadon, bonvolu elekti unu el ili: + + + Preview + Antaŭrigardu + + + + Cancel + Nuligu + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_es.ts qbittorrent-3.3.15/src/lang/qbittorrent_es.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_es.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_es.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent Acerca de qBittorrent - + About Acerca de - + Author Autor - - Current maintainer - Encargado actual - - - - Greece - Grecia - - - - + + Nationality: Nacionalidad: - - + + + Name: + Nombre: + + + + E-mail: E-mail: - - - Name: - Nombre: + + Greece + Grecia - - Original author - Autor original + + Current maintainer + Encargado actual - - France - Francia + + Original author + Autor original - + Special Thanks Agradecimientos especiales - + Translators Traductores - - License - Licencia - - - + Libraries - Librerías + Bibliotecas - + qBittorrent was built with the following libraries: qBittorrent fue compilado con las siguientes librerías: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - Un cliente BitTorrent avanzado programado en C++, basado en el toolkit Qt y en libtorrent-rasterbar. - - - - Copyright %1 2006-2018 The qBittorrent project - Copyright %1 2006-2018 El proyecto qBittorrent - - - - Home Page: - Página Web: - - - - Forum: - Foro: + + France + Francia - - Bug Tracker: - Bug Tracker: + + License + Licencia @@ -115,57 +90,67 @@ Guardar en - + + Browse... + Examinar... + + + + Set as default save path + Establecer como ubicación predeterminada + + + Never show again No volver a mostrar - + Torrent settings Propiedades del torrent - + Set as default category Establecer como categoría predeterminada - + Category: Categoría: - + Start torrent Iniciar torrent - + Torrent information Información del torrent - + Skip hash check No comprobar hash - + Size: Tamaño: - + Hash: Hash: - + Comment: Comentario: - + Date: Fecha: @@ -190,118 +175,90 @@ Automático - - Remember last used save path - Recordar la ultima ubicación - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog Al activarse, el archivo .torrent no sera borrado, no importa cual sea la configuración de "Descargas" de las opciones. - + Do not delete .torrent file No eliminar el archivo .torrent - - Create subfolder - Crear subcarpeta - - - - Download in sequential order - Descargar en orden secuencial - - - - Download first and last pieces first - Comenzar por las primeras y últimas partes - - - + Normal Normal - + High Alta - + Maximum Máxima - + Do not download No descargar - - - + + + I/O Error Error de I/O - + Invalid torrent Torrent inválido - - Renaming - Renombrando - - - - - Rename error - Error al renombrar - - - - The name is empty or contains forbidden characters, please choose a different one. - El nombre está vacío o contiene caracteres prohibidos, por favor, elija uno diferente. + + + + + Already in download list + Ya está en la lista de descargas - + Not Available This comment is unavailable No disponible - + Not Available This date is unavailable No disponible - + Not available No disponible - + Invalid magnet link Enlace magnet inválido - + The torrent file '%1' does not exist. El archivo torrent '%1' no existe. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. El archivo torrent '%1' no puede ser leído del disco. Probablemente no tengas permisos suficientes. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -310,118 +267,128 @@ Error: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + El torrent ya está en la lista de descargas. Los Trackers no fueron fusionados porque el torrent es privado. + + + + Torrent is already in download list. Trackers were merged. + El torrent ya está en la lista de descargas. Los Trackers fueron fusionados. + + + + + Cannot add torrent + No se pudo agregar el torrent + + + + Cannot add this torrent. Perhaps it is already in adding state. + No se pudo agregar este torrent. Tal vez ya se esté agregando. + + + This magnet link was not recognized Este enlace magnet no pudo ser reconocido - + + Magnet link is already in download list. Trackers were merged. + El enlace magnet ya está en la lista de descargas. Los Trackers fueron fusionados. + + + + Cannot add this torrent. Perhaps it is already in adding. + No se pudo agregar este torrent. Tal vez ya se esté agregando. + + + Magnet link Enlace magnet - + Retrieving metadata... Recibiendo metadatos... - + Not Available This size is unavailable. No disponible - + Free space on disk: %1 Espacio libre en disco: %1 - + + Choose save path Elegir ruta - - - - - - - Torrent is already present - El torrent ya está presente - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - El torrent '%1' ya está en la lista de transferencias. -Los Trackers no fueron fusionados porque el torrent es privado. - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - El torrent '%1' ya está en la lista de transferencias. -Los Trackers fueron fusionados. - - - - Torrent is already queued for processing. - El torrent ya está en la cola de procesado. + + Rename the file + Renombrar archivo - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - El enlace magnet '%1' ya está en la lista de transferencias. -Los Trackers fueron fusionados. + + New name: + Nuevo nombre: - - Magnet link is already queued for processing. - El enlace magnet ya está en la cola de procesado. + + + The file could not be renamed + No se pudo renombrar el archivo - - New name: - Nuevo nombre: + + This file name contains forbidden characters, please choose a different one. + Este nombre contiene caracteres prohibidos, por favor, elija uno diferente. - - + + This name is already in use in this folder. Please use a different name. Este nombre ya está en uso. Por favor, use un nombre diferente. - + The folder could not be renamed La carpeta no se pudo renombrar - + Rename... Renombrar... - + Priority Prioridad - + Invalid metadata Metadatos inválidos - + Parsing metadata... Analizando metadatos... - + Metadata retrieval complete Recepción de metadatos completa - + Download Error Error de descarga @@ -429,312 +396,198 @@ AdvancedSettings - + + Disk write cache size + Tamaño de la caché de escritura + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Puertos de salida (Min) [0: Desactivado] - + Outgoing ports (Max) [0: Disabled] Puertos de salida (Máx) [0: Desactivado] - + Recheck torrents on completion Verificar torrents completados - + Transfer list refresh interval Intervalo de actualización de la lista de transferencias - + ms milliseconds ms - + Setting Ajustes - + Value Value set for this setting Valor - - - (disabled) - (deshabilitado) - - - + (auto) (auto) - - min - minutes - min - - - + All addresses Todas las direcciones - + qBittorrent Section Sección de qBittorrent - - + + Open documentation Abrir documentación - + libtorrent Section Sección de libtorrent - - Asynchronous I/O threads - - - - - Disk cache - Caché de disco - - - + s seconds s - + Disk cache expiry interval Intervalo de expiración de la caché de disco - + Enable OS cache Activar caché del S.O. - - Guided read cache - Cache de lectura guiado - - - - Coalesce reads & writes - Combinar lecturas y escrituras - - - - Send upload piece suggestions - Enviar sugerencias de piezas a subir - - - - - KiB - KiB - - - - Send buffer watermark - Enviar buffer watermark - - - - Send buffer low watermark - Enviar buffer lowmark - - - - Send buffer watermark factor - Enviar buffer watermark factor - - - - Prefer TCP - Preferir TCP - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address - Permitir múltiples conexiones de la misma dirección IP + + m + minutes + m - + Resolve peer countries (GeoIP) Resolver países de los pares (GeoIP) - + Resolve peer host names Resolver nombres de host de los pares - + Strict super seeding Super-Siembra - + Network Interface (requires restart) Interfaz de red (es necesario reiniciar) - + Optional IP Address to bind to (requires restart) Dirección IP opcional a escuchar (es necesario reiniciar) - + Listen on IPv6 address (requires restart) Escuchar en la dirección IPv6 (es necesario reiniciar) - + Display notifications Mostrar notificaciones - + Display notifications for added torrents Mostrar notificaciones para torrents agregados - + Download tracker's favicon Descargar favicon del tracker - - Save path history length - Tamaño del historial de rutas de guardado - - - - Fixed slots - Puestos fijos - - - - Upload rate based - Basado en la vel. de subida - - - - Upload slots behavior - Comportamiento de los puestos de subida - - - - Round-robin - - - - - Fastest upload - Subida mas rápida - - - - Anti-leech - - - - - Upload choking algorithm - Algoritmo de bloqueo de subidas - - - + Confirm torrent recheck Confirmar la verificación del torrent - - Confirm removal of all tags - Confirmar la eliminación de todas las etiquetas - - - - Always announce to all trackers in a tier - Siempre anunciar a todos los trackers del nivel + Exchange trackers with other peers + Intercambio de trackers con otros pares - - Always announce to all tiers - Siempre anunciar a todos los niveles + + Always announce to all trackers + Siempre anunciar a todos los trackers - + Any interface i.e. Any network interface Cualquier interfaz - + Save resume data interval How often the fastresume file is saved. Intervalo entre el guardado de datos de reanudación - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - Algoritmo de modo mixto %1-TCP - - - + Maximum number of half-open connections [0: Unlimited] Número máximo de conexiones semi-abiertas [0: Sin límite] - + IP Address to report to trackers (requires restart) Dirección IP para informar a los trackers (es necesario reiniciar) - + Enable embedded tracker Activar tracker integrado - + Embedded tracker port Puerto del tracker integrado - + Check for software updates Comprobar actualizaciones - + Use system icon theme Usar iconos del tema actual @@ -742,120 +595,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 iniciado - + Torrent: %1, running external program, command: %2 Torrent: %1, ejecutando programa externo , comando: %2 - - Torrent name: %1 - Nombre del torrent: %1 - - - - Torrent size: %1 - Tamaño del torrent: %1 - - - - Save path: %1 - Guardar en: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - El torrernt se descargó en %1. - - - - Thank you for using qBittorrent. - Gracias por utilizar qBittorrent. - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' ha terminado de descargarse + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrent: %1, Comando de programa demasiado largo (longitud > %2), falló la ejecución. - + Torrent: %1, sending mail notification Torrent: %1, enviando correo de notificación - + Information Información - - To control qBittorrent, access the Web UI at %1 - Para controlar qBittorrent, accede a la interfaz web en %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + Para controlar qBittorrent, accede a la interfaz Web en http://localhost:%1 - + The Web UI administrator user name is: %1 El nombre de usuario del administrador de la interfaz Web es: %1 - + The Web UI administrator password is still the default one: %1 La contraseña del administrador de la interfaz Web sigue siendo por defecto: %1 - + This is a security risk, please consider changing your password from program preferences. Esto es un riesgo de seguridad, por favor considere cambiar su contraseña en las preferencias del programa. - + Saving torrent progress... Guardando progreso del torrent... - - - Portable mode and explicit profile directory options are mutually exclusive - Las opciones de Modo portátil y ruta de perfil son mutuamente excluyentes - - - - Portable mode implies relative fastresume - El modo portátil implica continuación rápida relativa - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - Tu dirección IP ha sido bloqueada después múltiples intentos de autenticación fallidos. - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Guardar en: @@ -865,818 +659,680 @@ Descargador RSS - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - La auto-descarga por canales RSS esta Desactivada. Puedes habilitarla en las opciones. + + Enable Automated RSS Downloader + Activar el Descargador RSS Automático. - + Download Rules Reglas de descarga - + Rule Definition Definición de reglas - + Use Regular Expressions Usar expresiones regulares - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - El filtro inteligente de episodios verificará el número de episodio para prevenir descargar duplicados. -Soporta los formatos: S01E01, 1x1, 2017.01.01 and 01.01.2017 -(Los formatos de fecha también soportan - como separador) - - - - Use Smart Episode Filter - Usar Filtro Inteligente de Episodios - - - + Must Contain: Debe contener: - + Must Not Contain: No debe contener: - + Episode Filter: Filtro de episodios: - + Assign Category: Asignar categoría: - + Save to a Different Directory Guardar en una ruta diferente - + Ignore Subsequent Matches for (0 to Disable) ... X days Ignorar coincidencias posteriores a (0 para deshabilitar) - + Disabled - Deshabilitado + Deshabilitado - + days días - + Add Paused: Agregar pausado: - + Use global settings Usar preferencias globales - + Always Siempre - + Never Nunca - + Apply Rule to Feeds: Aplicar regla a los canales: - + Matching RSS Articles Coincidencias de artículos RSS - + &Import... &Importar... - + &Export... &Exportar... - + Matches articles based on episode filter. Filtrar artículos en base al filtro de episodios. - + Example: Ejemplo: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match coincidirá con los episodios 2, 5, del 8 al 15, y del 30 en adelante de la temporada uno - + Episode filter rules: Reglas del filtro de episodios: - + Season number is a mandatory non-zero value El número de temporada debe ser distinto de cero - + Episode number is a mandatory non-zero value + El número de episodio debe ser distinto de cero + + + Filter must end with semicolon El filtro debe finalizar con punto y coma (;) - + Three range types for episodes are supported: Son soportados tres tipos de rango de episodios: - + Single number: <b>1x25;</b> matches episode 25 of season one Un número: <b>1x25;</b> coincidirá con el episodio 25 de la temporada uno - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Un rango: <b>1x25-40;</b> coincidirá con los episodios del 25 al 40 de la temporada uno - - Episode number is a mandatory positive value - El número de episodio debe ser un valor positivo - - - - Rules - Reglas + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Rango infinito: <b>1x25-;</b> coincidirá con los episodios del 25 en adelante de la temporada uno - - Rules (legacy) - Reglas (antiguas) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Rango infinito: <b>1x25-;</b> coincidirá con los episodios del 25 en adelante de la temporada uno, y todos los episodios de las temporadas siguientes + - + Last Match: %1 days ago Última coincidencia: %1 días atrás - + Last Match: Unknown Última coincidencia: Desconocida - + New rule name Nombre de la regla - + Please type the name of the new download rule. Por favor, escriba el nombre de la nueva regla de descarga. - - + + Rule name conflict Conflicto con el nombre de la regla - - + + A rule with this name already exists, please choose another name. Ya existena una regla con este nombre, por favor, elija otro nombre. - + Are you sure you want to remove the download rule named '%1'? ¿Está seguro de querer eliminar la regla de descarga llamada '%1'? - + Are you sure you want to remove the selected download rules? ¿Está seguro que desea eliminar las reglas de descarga seleccionadas? - + Rule deletion confirmation Confirmar la eliminación de la regla - + Destination directory Ruta de destino - + Invalid action Acción no válida - + The list is empty, there is nothing to export. La lista está vacía, no hay nada para exportar. - - Export RSS rules - Exportar reglas RSS + + Where would you like to save the list? + ¿Dónde le gustaría guardar la lista? - - + + Rules list (*.rssrules) + Lista de reglas (*.rssrules) + + + I/O Error Error de I/O - - Failed to create the destination file. Reason: %1 - No se pudo crear el archivo de destino. Razón: %1 + + Failed to create the destination file + Error al crear el archivo de destino - - Import RSS rules - Importar reglas RSS + + Please point to the RSS download rules file + Por favor, seleccione el archivo de reglas de descarga de canales RSS - - Failed to open the file. Reason: %1 - Fallo al abrir el archivo. Razón: %1 + + Rules list + Lista de reglas - + Import Error Error al importar - - Failed to import the selected rules file. Reason: %1 - No se pudo importar el archivo de reglas seleccionado. Razón: %1 + + Failed to import the selected rules file + Error al importar el archivo de reglas seleccionado - + Add new rule... Agregar nueva regla... - + Delete rule Eliminar regla - + Rename rule... Renombrar regla... - + Delete selected rules Eliminar reglas seleccionadas - - Clear downloaded episodes... - Limpiar episodios descargados... - - - + Rule renaming Renombrando regla - + Please type the new rule name Por favor, escriba el nombre de la nueva regla - - Clear downloaded episodes - Limpiar episodios descargados - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - ¿Está seguro que desea limpiar la lista de episodios descargados de la regla seleccionada? - - - - Regex mode: use Perl-compatible regular expressions - Modo Regex: usar expresiones regulares compatibles con Perl - - - - - Position %1: %2 - Posición %1: %2 + + Regex mode: use Perl-like regular expressions + Modo Regex: usar expresiones regulares como en Perl - + Wildcard mode: you can use - Modo comodín: puedes usar + - + ? to match any single character - ? para coincidir cualquier carácter + - + * to match zero or more of any characters - * para coincidir cero o más de cualquier carácter + - + Whitespaces count as AND operators (all words, any order) - Los espacios cuentan como operadores AND (todas las palabras, cualquier orden) + - + | is used as OR operator - | es usado como operador OR + - + If word order is important use * instead of whitespace. - Si el orden de las palabras es importante use * en vez de espacios. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Una expresión con una cláusula %1 vacía (p.ej. %2) + - + will match all articles. - coincidirá con todos los artículos. + - + will exclude all articles. - excluirá todos los artículos. + - - - BanListOptionsDialog - - List of banned IP addresses - Lista de direcciones IP prohibidas + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Uso de comodines: se puede usar<ul><li>? para hacer coincidir cualquier carácter individual</li><li>* para hacer coincidir cero o más caracteres</li><li>Los espacios en blanco cuentan como operadores AND</li></ul> - - Ban IP - Prohibir IP + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Uso de comodines: se puede usar<ul><li>? para hacer coincidir cualquier carácter individual</li><li>* para hacer coincidir cero o más caracteres</li><li>| es usado como operador OR</li></ul> + + + BitTorrent::Session - - Delete - Eliminar + + Restart is required to toggle PeX support + Es necesario reiniciar para cambiar el soporte PeX - - - Warning - Advertencia - - - - The entered IP address is invalid. - La dirección IP introducida no es válida. - - - - The entered IP is already banned. - La dirección IP introducida ya está prohibida. - - - - BitTorrent::Session - - - Restart is required to toggle PeX support - Es necesario reiniciar para cambiar el soporte PeX - - - - Could not get GUID of configured network interface. Binding to IP %1 - No se pudo obtener GUID de la interfaz de red configurada. Enlazando a la IP %1 - - - + Embedded Tracker [ON] Tracker integrado [Activado] - + Failed to start the embedded tracker! Error al iniciar el tracker integrado - + Embedded Tracker [OFF] Tracker integrado [Desactivado] - + + '%1' reached the maximum ratio you set. Removing... + '%1' alcanzó el ratio máximo establecido. Eliminandolo... + + + + '%1' reached the maximum ratio you set. Pausing... + '%1' alcanzó el ratio máximo establecido. Pausandolo... + + + System network status changed to %1 e.g: System network status changed to ONLINE El estado de la red del equipo cambió a %1 - + ONLINE EN LÍNEA - + OFFLINE FUERA DE LÍNEA - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding La configuración de red de %1 ha cambiado, refrescando la sesión - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. La interfaz de red configurada %1 no es válida - - + Encryption support [%1] Cifrado [%1] - - + FORCED FORZADO - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 no es una dirección IP válida y ha sido rechazada al aplicar la lista de direcciones prohibidas. - - - - + Anonymous mode [%1] Modo Anónimo [%1] - + Unable to decode '%1' torrent file. No se pudo decodificar el torrent '%1'. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Descarga recursiva del archivo '%1' incluido en el torrent '%2' - + Queue positions were corrected in %1 resume files - Las posiciones de cola fueron corregidas en %1 archivos de continuación + - + Couldn't save '%1.torrent' No se pudo guardar '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' Fue eliminado de la lista de transferencias. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' Fue eliminado de la lista de transferencias y del disco. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '%1' Fue eliminado de la lista de transferencias pero los archivos no pudieron ser eliminados. Error: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. porque %1 está deshabilitado. - + because %1 is disabled. this peer was blocked because TCP is disabled. porque %1 está deshabilitado. - + URL seed lookup failed for URL: '%1', message: %2 Falló la búsqueda de la semilla Url: '%1', mensaje: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent falló al escuchar en la interfaz %1 puerto: %2/%3. Razón: %4 - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' Fue eliminado de la lista de transferencias y del disco. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' Fue eliminado de la lista de transferencias. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Descargando '%1', por favor espere... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent está tratando de escuchar en cualquier interfaz, puerto: %1 - + The network interface defined is invalid: %1 La interfaz de red definida no es válida: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent está tratando de escuchar en la interfaz %1 puerto: %2 - - Peer ID: - ID del Par: - - - - HTTP User-Agent is '%1' - El User-Agent HTTP es '%1' - - - - + DHT support [%1] DHT [%1] - - - - - - - - - + + + + ON Activado - - - - - - - - - + + + + OFF Desactivado - - + Local Peer Discovery support [%1] Buscar pares locales [%1] - - PeX support [%1] - Soporte PeX [%1] - - - - '%1' reached the maximum ratio you set. Removed. - '%1' alcanzó el ratio máximo establecido. Eliminado. - - - - '%1' reached the maximum ratio you set. Paused. - '%1' alcanzó el ratio máximo establecido. Pausado. + Restart is required to toggle Tracker Exchange support + Es necesario reiniciar para cambiar el soporte de intercambio de Trackers - - '%1' reached the maximum seeding time you set. Removed. - '%1' alcanzó el ratio máximo establecido. Eliminado... - - - - '%1' reached the maximum seeding time you set. Paused. - '%1' alcanzó el ratio máximo establecido. Pausado. - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent no encuentra una dirección local %1 para escuchar - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent falló tratando de escuchar en cualquier interfaz, Puerto: %1. Razón: %2 - + Tracker '%1' was added to torrent '%2' El tracker '%1' se agregó al torrent '%2' - + Tracker '%1' was deleted from torrent '%2' El tracker '%1' se eliminó del torrent '%2' - + URL seed '%1' was added to torrent '%2' La semilla URL '%1' se agregó al torrent '%2' - + URL seed '%1' was removed from torrent '%2' La semilla URL '%1' se eliminó del torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. No se pudo continuar el torrent '%1'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Filtro IP analizado correctamente: %1 reglas aplicadas. - + Error: Failed to parse the provided IP filter. Error: Falló el análisis del filtro IP. - - '%1' restored. - 'torrent name' restored. - '%1' restaurado. - - - + Couldn't add torrent. Reason: %1 No se pudo agregar el torrent. Razón: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' continuado. (continuación rápida) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' agregado a la lista de descargas. - + An I/O error occurred, '%1' paused. %2 Ocurrió un error de I/O, '%1' pausado. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Falló el mapeo del puerto, mensaje: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Puerto mapeado correctamente, mensaje: %1 - + due to IP filter. this peer was blocked due to ip filter. por el filtro IP. - + due to port filter. this peer was blocked due to port filter. por el filtro de puertos. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. por restricciones del modo mixto i2p. - + because it has a low port. this peer was blocked because it has a low port. por tener un puerto bajo. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent está escuchando en la interfaz %1 puerto: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 IP Externa: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - fallo al crear el archivo torrent - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - Priorizar la primera y la última parte: %1, torrent: '%2' - - - - On - Activado - - - - Off - Desactivado - - - - Successfully moved torrent: %1. New path: %2 - El Torrent: %1. Fue movido correctamente a: %2 - - - + Could not move torrent: '%1'. Reason: %2 No se pudo mover el torrent: '%1'. Razón: %2 - + File sizes mismatch for torrent '%1', pausing it. El tamaño de archivo no coincide con el torrent '%1', pausandolo. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... Continuación rápida rechazada para el torrent: '%1', Razón %2. Verificando de nuevo... @@ -1684,19 +1340,19 @@ CategoryFilterModel - + Categories - Categorías + Categorías - + All - Todos + Todos - + Uncategorized - Sin categorizar + @@ -1704,42 +1360,145 @@ Add category... - Agregar categoría... + Agregar categoría... Add subcategory... - Agregar subcategoría... + - Edit category... - Editar categoría... + Remove category + Eliminar categoría + + + + Remove unused categories + Eliminar categorías sin utilizar + + + + Resume torrents + Reanudar torrents + + + + Pause torrents + Pausar torrents + + + + Delete torrents + Eliminar torrents + + + + New Category + Nueva categoría + + + + Category: + Categoría: + + + + Invalid category name + Nombre de la categoría no válido + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Todos (0) + + + Uncategorized (0) + Sin categorizar (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Sin categorizar (%1) + + + Add category... + Agregar categoría... - Remove category - Eliminar categoría + Eliminar categoría - Remove unused categories - Eliminar categorías sin utilizar + Eliminar categorías sin utilizar - Resume torrents - Continuar torrents + Reanudar torrents - Pause torrents - Pausar torrents + Pausar torrents - Delete torrents - Eliminar torrents + Eliminar torrents + + + New Category + Nueva categoría + + + Category: + Categoría: + + + Invalid category name + Nombre de la categoría no válido + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + El nombre de la categoría no debe contener '\' +El nombre de la categoría no debe contener '//' +El nombre de la categoría no debe comenzar o terminar con '/'. + + + All (%1) + this is for the category filter + Todos (%1) @@ -1779,220 +1538,101 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Confirmar eliminación - - - - Remember choice - Recordar esta elección - - - - Also delete the files on the hard disk - También eliminar los archivos del disco - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? ¿Seguro que desea eliminar '%1' de la lista de transferencias? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? ¿Seguro que desea eliminar estos %1 torrents de la lista de transferencias? - DownloadFromURLDialog - - - Download from URLs - Descargar de URLs - - - - Add torrent links - Agregar enlaces torrent - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - Un enlace por línea (pueden ser enlaces HTTP, enlaces magnet o info-hashes) - - - - Download - Descargar - - - - No URL entered - No ha escrito ninguna URL - - - - Please type at least one URL. - Por favor escriba al menos una URL. - - - DownloadedPiecesBar - + White: Missing pieces Blanco: Piezas faltantes - + Green: Partial pieces Verde: Piezas descargadas parcialmente - + Blue: Completed pieces Azul: Piezas completadas - ExecutionLogWidget + ExecutionLog - + General General - + Blocked IPs IPs bloqueadas - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked <font color='red'>%1</font> fue bloqueado %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - <font color='red'>%1</font> fue prohibido + <font color='red'>%1</font> fue baneado FeedListWidget - + RSS feeds Canales RSS - - - Unread (%1) - No leídos (%1) + + Unread + No leídos FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. + + An error occured while trying to open the log file. Logging to file is disabled. Ocurrió un error de tratando de escribir el archivo de Logs. El archivo de logs está deshabilitado. - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - &Examinar... - - - - Choose a file - Caption for file open/save dialog - Elija un archivo - - - - Choose a folder - Caption for directory open dialog - Elija una carpeta - - - - Any file - Cualquier archivo - - - FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. + + + + I/O Error: Could not open ip filter file in read mode. Error de I/O: No se pudo abrir el archivo de filtros IP en modo lectura. - - - - IP filter line %1 is malformed. - La linea %1 del filtro IP no es correcta. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - La linea %1 del filtro IP no es correcta. La IP inicial del rango no es valida. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - La linea %1 del filtro IP no es correcta. La IP final del rango no es valida. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - La linea %1 del filtro IP no es correcta. Una IP es IPv4 y la otra IPv6 - - - - - IP filter exception thrown for line %1. Exception is: %2 - Excepción del filtro IP para la linea %1. Razón: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - %1 errores extra ocurridos al analizar el filtro IP. - - - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. Error de análisis: El archivo de filtros no es un P2B valido de PeerGuardian. @@ -2000,396 +1640,472 @@ GeoIPDatabase - - + + Unsupported database file size. El tamaño del archivo de base de datos no es soportado. - + Metadata error: '%1' entry not found. Error de metadatos: no se encontró la entrada '%1'. - + Metadata error: '%1' entry has invalid type. Error de metadatos: la entrada '%1' tiene un tipo invalido. - + Unsupported database version: %1.%2 Versión de base de datos no soportada: %1.%2 - + Unsupported IP version: %1 Versión de IP no soportada: %1 - + Unsupported record size: %1 Tamaño del registro no soportado: %1 - + Invalid database type: %1 Tipo de base de datos invalido: %1 - + Database corrupted: no data section found. Base de datos corrupta: no se encontró la sección de datos. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - + + File + Archivo - - Bad Http request, closing socket. IP: %s - + + Edit + Editar - - - HttpServer - + + Help + Ayuda + + + Exit qBittorrent Salir de qBittorrent - + Only one link per line Solamente un enlace por línea - + + Download + Descargar + + + Global upload rate limit must be greater than 0 or disabled. El límite de la tasa de subida debe ser mayor que 0 o estar inhabilitado. - + Global download rate limit must be greater than 0 or disabled. El límite de la tasa de descarga debe ser mayor que 0 o estar inhabilitado. - + Alternative upload rate limit must be greater than 0 or disabled. El límite alternativo de la tasa de subida debe ser mayor que 0 o estar inhabilitado. - + Alternative download rate limit must be greater than 0 or disabled. El límite alternativo de la tasa de descarga debe ser mayor que 0 o estar inhabilitado. - + Maximum active downloads must be greater than -1. El número máximo de descargas activas debe ser mayor que -1. - + Maximum active uploads must be greater than -1. El número máximo de subidas activas debe ser mayor que -1. - + Maximum active torrents must be greater than -1. El número máximo de torrents activos debe ser mayor que -1. - + Maximum number of connections limit must be greater than 0 or disabled. El número máximo del limite de conexiones debe ser mayor que 0 o estar inhabilitado. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. El número máximo del limite de conexiones por torrent debe ser mayor que 0 o estar inhabilitado. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. El número máximo de puestos de subida por torrent debe ser mayor que 0 o estar inhabilitado. - + Unable to save program preferences, qBittorrent is probably unreachable. Error al guardar las preferencias del programa, imposible conectar a qBittorrent. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent en Freenode + + Language + Idioma - - Invalid category name: -Please do not use any special characters in the category name. - Nombre de categoría invalido: -Por favor no use caracteres especiales para el nombre de la categoría. + + The port used for incoming connections must be between 1 and 65535. + El puerto utilizado para conexiones entrantes debe estar comprendido entre 1 y 65535. - - Unknown - Desconocido - - - - Hard Disk - Disco duro - - - - Share ratio limit must be between 0 and 9998. - El limite de ratio debe estar entre 0 y 9998 - - - - Seeding time limit must be between 0 and 525600 minutes. - El limite de tiempo de sembrado debe estar entre 0 y 525600 minutos. - - - - The port used for incoming connections must be between 1 and 65535. - El puerto utilizado para conexiones entrantes debe estar comprendido entre 1 y 65535. - - - + The port used for the Web UI must be between 1 and 65535. El puerto utilizado para la interfaz Web debe estar comprendido entre 1 y 65535. - + Unable to log in, qBittorrent is probably unreachable. Error al iniciar sesión, imposible conectar a qBittorrent. - + Invalid Username or Password. Nombre de usuario o contraseña inválidos. - - Username - Nombre de usuario - - - + Password Contraseña - + Login Iniciar sesión - + + Upload Failed! + Error al subir! + + + Original authors Autores originales - + + Upload limit: + Límite de subida: + + + + Download limit: + Límite de descarga: + + + Apply Aplicar - + Add Agregar - + + Category: + Categoría: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Subir Torrents - + + All + Todos + + + + Downloading + Descargando + + + + Seeding + Sembrando + + + + Completed + Completado + + + + Resumed + Reanudados + + + + Paused + Pausados + + + + Active + Activos + + + + Inactive + Inactivos + + + Save files to location: Guardar los archivos en: - + Cookie: Cookie: - + Type folder here Escribir carpeta aquí - + + Run an external program on torrent completion + Ejecutar un programa externo al completar el torrent + + + + Enable bandwidth management (uTP) + Habilitar gestión de ancho de banda (µTP) + + + + Apply rate limit to uTP connections + Aplicar límite para conexiones µTP + + + + Alternative Global Rate Limits + Limites de velocidad alternativos + + + More information Más Información - + Information about certificates Información sobre certificados - + Save Files to Guardar los archivos en: - - Set location - Establecer destino - - - - Limit upload rate - Tasa límite de subida + + Watch Folder + Carpeta vigilada - - Limit download rate - Tasa límite de bajada... + + Default Folder + Carpeta predeterminada - - Rename torrent - Renombrar torrent + + from + from time1 to time2 + Desde las - - Unable to create category - + + to + from time1 to time2 + hasta - + Other... Save Files to: Watch Folder / Default Folder / Other... Otro... - + + Every day + Schedule the use of alternative rate limits on ... + Todos los días + + + + Week days + Schedule the use of alternative rate limits on ... + Días laborales + + + + Week ends + Schedule the use of alternative rate limits on ... + Fines de semana + + + Monday Schedule the use of alternative rate limits on ... Lunes - + Tuesday Schedule the use of alternative rate limits on ... Martes - + Wednesday Schedule the use of alternative rate limits on ... Miércoles - + Thursday Schedule the use of alternative rate limits on ... Jueves - + Friday Schedule the use of alternative rate limits on ... Viernes - + Saturday Schedule the use of alternative rate limits on ... Sábado - + Sunday Schedule the use of alternative rate limits on ... Domingo - + + Downloaded + Is the file downloaded or not? + Bajado + + + Logout Salir - + + Download from URLs + Descargar de URLs + + + Download Torrents from their URLs or Magnet links Descargar torrents desde sus URL o enlaces magnet - + Upload local torrent Subir torrent local - + Are you sure you want to delete the selected torrents from the transfer list? ¿Seguro que desea eliminar los torrents seleccionados de la lista de transferencias? - + Save Guardar - + qBittorrent client is not reachable Imposible conectar a qBittorrent - - qBittorrent has been shutdown. - qBittorrent se ha cerrado. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Lista blanca de subredes + + HTTP Server + Servidor HTTP - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Ejemplo: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Están soportados los siguientes parámetros: - - Add subnet - Agregar subred + + Torrent path + Ruta del torrent - - Delete - Eliminar + + Torrent name + Nombre del torrent - - Error - Error + + qBittorrent has been shutdown. + qBittorrent se ha cerrado. + + + LineEdit - - The entered subnet is invalid. - La subred introducida es inválida + + Clear the text + Borrar texto LogListWidget - + Copy Copiar - + Clear Limpiar @@ -2422,552 +2138,492 @@ Al finalizar las &descargas - + &View &Ver - + &Options... &Opciones... - + &Resume - &Continuar + &Reanudar - + Torrent &Creator &Crear torrent - + Set Upload Limit... Establecer límite de subida... - + Set Download Limit... Establecer límite de descarga... - + Set Global Download Limit... Límite global de descarga... - + Set Global Upload Limit... Límite global de subida... - + Minimum Priority Mínima prioridad - + Top Priority Máxima prioridad - + Decrease Priority Disminuir prioridad - + Increase Priority Incrementar prioridad - - + + Alternative Speed Limits Límites de velocidad alternativos - + &Top Toolbar &Barra de herramientas - + Display Top Toolbar Mostrar barra de herramientas - - Status &Bar - Barra de estado - - - + S&peed in Title Bar &Velocidad en la barra de título - + Show Transfer Speed in Title Bar Mostrar Velocidad de Transferencia en la Barra de Título - + &RSS Reader Lector &RSS - + Search &Engine Motor de Búsqu&eda - + L&ock qBittorrent Bl&oquear qBittorrent - + Do&nate! Do&nar! - - Close Window - Cerrar ventana - - - + R&esume All R&eanudar todos - + Manage Cookies... Administrar Cookies... - + Manage stored network cookies Administrar cookies de red almacenadas - + Normal Messages Mensajes Normales - + Information Messages Mensajes de Información - + Warning Messages Mensajes de advertencias - + Critical Messages Mensajes Críticos - + &Log &Log - + &Exit qBittorrent Salir de &qBittorrent - + &Suspend System &Suspender Equipo - + &Hibernate System &Hibernar Equipo - + S&hutdown System &Apagar Equipo - + &Disabled &Deshabilitado - + &Statistics E&stadísticas - + Check for Updates Buscar actualizaciones - + Check for Program Updates Buscar actualizaciones del programa - + &About &Acerca de - + &Pause &Pausar - + &Delete &Eliminar - + P&ause All Pa&usar todos - + &Add Torrent File... &Agregar archivo torrent... - + Open Abrir - + E&xit &Salir - + Open URL Abrir URL - + &Documentation &Documentación - + Lock Bloquear - - - + + + Show Mostrar - + Check for program updates Buscar actualizaciones del programa - + Add Torrent &Link... Agregar &enlace torrent... - + If you like qBittorrent, please donate! Si le gusta qBittorrent, por favor realice una donación! - - + Execution Log Log - + Clear the password Borrar la contraseña - + Filter torrent list... Filtrar lista de torrents... - + &Set Password &Establecer Contraseña - - Preferences - Preferencias - - - + &Clear Password Limpiar C&ontraseña - + Transfers Transferencias - - - qBittorrent is minimized to tray - qBittorrent está minimizado en la bandeja - - - - - - This behavior can be changed in the settings. You won't be reminded again. - Este comportamiento puede ser cambiado en las opciones. -No se le recordará nuevamente. - - - + Torrent file association Asociación de archivos torrent - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent no es la aplicación por defecto para abrir archivos torrent o enlaces magnet. ¿Quiere que qBittorrent sea el programa por defecto para gestionar estos archivos? - + Icons Only Solo iconos - + Text Only Solo texto - + Text Alongside Icons Texto al lado de los iconos - + Text Under Icons Texto debajo de los iconos - + Follow System Style Usar estilo del equipo - - - + + + UI lock password Contraseña de bloqueo - - - + + + Please type the UI lock password: Por favor, escriba la contraseña de bloqueo: - + The password should contain at least 3 characters La contraseña debe tener como mínimo 3 caracteres - + Password update Actualizar contraseña - + The UI lock password has been successfully updated La contraseña de bloqueo de qBittorrent se ha actualizado correctamente - + Are you sure you want to clear the password? ¿Seguro que desea borrar la contraseña? - - Use regular expressions - Usar expresiones regulares - - - + Search Buscar - + Transfers (%1) Transferencias (%1) - + Error Error - + Failed to add torrent: %1 Error al agregar torrent: %1 - + Torrent added Torrent agregado - + '%1' was added. e.g: xxx.avi was added. '%1' fue agregado. - + Download completion Descarga completada - + I/O Error i.e: Input/Output Error Error de I/O - + Recursive download confirmation Confirmación de descargas recursivas - + Yes - + No No - + Never Nunca - + Global Upload Speed Limit Límite de velocidad de subida global - + Global Download Speed Limit Límite de velocidad de descarga global - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent ha sido actualizado y debe ser reiniciado para que los cambios sean efectivos. - - - - qBittorrent is closed to tray - qBittorrent está cerrado en la bandeja - - - - Some files are currently transferring. - Algunos archivos aún están transfiriéndose. - - - - Are you sure you want to quit qBittorrent? - ¿Está seguro de que quiere cerrar qBittorrent? - - - + &No &No - + &Yes &Sí - + &Always Yes S&iempre sí - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - No se pudo determinar su versión de Python. -Motor de búsqueda deshabilitado. - - - + Old Python Interpreter Intérprete de Python antiguo - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. Su versión de Python (%1) está desactualizada. Por favor actualizela a la ultima versión para poder utilizar el motor de búsqueda. La versión mínima es: 2.7.9/3.3.0. - + qBittorrent Update Available Actualización de qBittorrent disponible - + + A new version is available. +Do you want to download %1? + Hay una nueva versión disponible. +¿Desea descargar %1? + + + Already Using the Latest qBittorrent Version - qBittorrent está actualizado + Ya está utilizando la versión mas reciente de qBittorrent - + Undetermined Python version Versión de Python indeterminada - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. '%1' se ha descargado. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2976,158 +2632,154 @@ Razón: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? Este torrent '%1' contiene archivos torrent, ¿Desea seguir adelante con su descarga? - + Couldn't download file at URL '%1', reason: %2. No se pudo descargar el archivo desde la URL: '%1', razón: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin Python encontrado en %1: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + No se pudo determinar su versión de Python (%1). Motor de búsqueda deshabilitado. + + + + Missing Python Interpreter Falta el intérprete de Python - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Python es necesario para utilizar el motor de búsqueda pero no parece que esté instalado. ¿Desea instalarlo ahora? - + Python is required to use the search engine but it does not seem to be installed. Python es necesario para utilizar el motor de búsqueda pero no parece que esté instalado. - - A new version is available. - Hay una nueva versión disponible. - - - - Do you want to download %1? - ¿Desea descargar %1? - - - - Open changelog... - Abrir el registro de cambios... - - - + No updates available. You are already using the latest version. No hay actualizaciones disponibles. Ya está utilizando la versión mas reciente. - + &Check for Updates &Buscar actualizaciones - + Checking for Updates... Buscando actualizaciones... - + Already checking for program updates in the background Ya se están buscando actualizaciones del programa en segundo plano - + Python found in '%1' Python encontrado en '%1' - + Download error Error de descarga - + Python setup could not be downloaded, reason: %1. Please install it manually. La instalación de Python no se pudo realizar, la razón: %1. Por favor, instálelo de forma manual. - - + + Invalid password Contraseña no válida - - - + + RSS (%1) RSS (%1) - + URL download error Error descargando de URL - + The password is invalid La contraseña no es válida - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Vel. descarga: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Vel. subida: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [B: %1, S: %2] qBittorrent %3 - + Hide Ocultar - + Exiting qBittorrent Cerrando qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Algunos archivos aún están transfiriéndose. +¿Está seguro de querer cerrar qBittorrent? + + + Open Torrent Files Abrir archivos torrent - + Torrent Files Archivos torrent - + Options were saved successfully. Opciones guardadas correctamente. @@ -3135,52 +2787,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. El DNS dinámico se actualizó correctamente. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Error del DNS dinámico: El servicio no está disponible temporalmente, nuevo reintento en 30 minutos. - + Dynamic DNS error: hostname supplied does not exist under specified account. Error del DNS dinámico: El nombre de host proporcionado no existe en la cuenta especificada. - + Dynamic DNS error: Invalid username/password. Error del DNS dinámico: El nombre de usuario/contraseña no es válido. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Error del DNS dinámico: qBittorrent ha sido incluido en la Lista Negra por el servicio, por favor, informar de ésto en http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Error del DNS dinámico: %1 fue rechazado por el servicio, por favor, informe de este error en http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Error del DNS dinámico: Su nombre de usuario fue bloqueado debido a excesos. - + Dynamic DNS error: supplied domain name is invalid. Error del DNS dinámico: El nombre de dominio proporcionado no válido. - + Dynamic DNS error: supplied username is too short. Error del DNS dinámico: El nombre de usuario proporcionado es demasiado corto. - + Dynamic DNS error: supplied password is too short. Error del DNS dinámico: La contraseña proporcionada demasiado corta. @@ -3188,1413 +2840,1303 @@ Net::DownloadHandler - + I/O Error Error de I/O - + The file size is %1. It exceeds the download limit of %2. El tamaño de archivo es %1. Excede el limite de descarga de %2. - + Unexpected redirect to magnet URI. Redirección inesperada hacia un enlace magnet. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - El nombre de host remoto no se ha encontrado (nombre de host no válido) + + + GeoIP database loaded. Type: %1. Build time: %2. + Base de datos GeoIP cargada. Tipo: %1. Creada el: %2. - - The operation was canceled - La operación fue cancelada + + + Couldn't load GeoIP database. Reason: %1 + No se pudo cargar la base de datos GeoIP. Razon: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - El servidor remoto cerró la conexión prematuramente, antes de que se recibiera y procesara toda la respuesta + + Venezuela, Bolivarian Republic of + Venezuela - - The connection to the remote server timed out - La conexión con el servidor remoto ha agotado el tiempo de espera + + Viet Nam + Vietnam - - SSL/TLS handshake failed - Handshake SSL/TLS fallido - - - - The remote server refused the connection - El servidor remoto rechazó la conexión - - - - The connection to the proxy server was refused - La conexión con el servidor proxy fué rechazada - - - - The proxy server closed the connection prematurely - El servidor proxy cerró la conexión antes de tiempo - - - - The proxy host name was not found - No se encontró el nombre del servidor proxy - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - La conexión con el servidor proxy ha agotado el tiempo de espera o el proxy no respondió a tiempo a la solicitud enviada - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - El proxy requiere autenticación para poder atender la solicitud, pero no aceptó las credenciales proporcionadas - - - - The access to the remote content was denied (401) - El acceso al contenido remoto ha sido rechazado (401) - - - - The operation requested on the remote content is not permitted - La operación solicitada sobre el contenido remoto no está permitida - - - - The remote content was not found at the server (404) - El contenido remoto no se encontró en el servidor (404) - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - El servidor remoto requiere autenticación para servir el contenido, pero no se aceptaron las credenciales proporcionadas - - - - The Network Access API cannot honor the request because the protocol is not known - La API de acceso a la red no puede cumplir con la solicitud debido a que el protocolo es desconocido - - - - The requested operation is invalid for this protocol - La operación solicitada no es válida para este protocolo - - - - An unknown network-related error was detected - Se ha detectado un error desconocido relacionado con la red - - - - An unknown proxy-related error was detected - Se ha detectado un error desconocido relacionado con el proxy - - - - An unknown error related to the remote content was detected - Se ha detectado un error desconocido relacionado con el contenido remoto - - - - A breakdown in protocol was detected - Se ha detectado una ruptura en el protocolo - - - - Unknown error - Error desconocido - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - Base de datos GeoIP cargada. Tipo: %1. Creada el: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - No se pudo cargar la base de datos GeoIP. Razon: %1 - - - - Venezuela, Bolivarian Republic of - Venezuela - - - - Viet Nam - Vietnam - - - - + + N/A N/A - + Andorra Andorra - + United Arab Emirates Emiratos Árabes Unidos - + Afghanistan Afganistán - + Antigua and Barbuda Antigua y Barbuda - + Anguilla Anguila - + Albania Albania - + Armenia Armenia - + Angola Angola - + Antarctica Antártida - + Argentina Argentina - + American Samoa Samoa Americana - + Austria Austria - + Australia Australia - + Aruba Aruba - + Azerbaijan Azerbaiyán - + Bosnia and Herzegovina Bosnia y Herzegovina - + Barbados Barbados - + Bangladesh Bangladés - + Belgium Bélgica - + Burkina Faso Burkina Faso - + Bulgaria Bulgaria - + Bahrain Baréin - + Burundi Burundi - + Benin Benín - + Bermuda Bermudas - + Brunei Darussalam Brunéi Darussalam - + Brazil Brasil - + Bahamas Bahamas - + Bhutan Bután - + Bouvet Island Isla Bouvet - + Botswana Botsuana - + Belarus Bielorrusia - + Belize Belice - + Canada Canadá - + Cocos (Keeling) Islands Islas Cocos (Keeling) - + Congo, The Democratic Republic of the República Democrática del Congo - + Central African Republic República Centroafricana - + Congo Congo - + Switzerland Suiza - + Cook Islands Islas Cook - + Chile Chile - + Cameroon Camerún - + China China - + Colombia Colombia - + Costa Rica Costa Rica - + Cuba Cuba - + Cape Verde Cabo Verde - + Curacao Curazao - + Christmas Island Isla de Navidad - + Cyprus Chipre - + Czech Republic República Checa - + Germany Alemania - + Djibouti Yibuti - + Denmark Dinamarca - + Dominica Dominica - + Dominican Republic República Dominicana - + Algeria Argelia - + Ecuador Ecuador - + Estonia Estonia - + Egypt Egipto - + Western Sahara Sahara Occidental - + Eritrea Eritrea - + Spain España - + Ethiopia Etiopía - + Finland Finlandia - + Fiji Fiyi - + Falkland Islands (Malvinas) Islas Malvinas (Falkland) - + Micronesia, Federated States of Estados Federados de Micronesia - + Faroe Islands Islas Feroe - + France Francia - + Gabon Gabón - + United Kingdom Reino Unido - + Grenada Granada - + Georgia Georgia - + French Guiana Guayana Francesa - + Ghana Ghana - + Gibraltar Gibraltar - + Greenland Groenlandia - + Gambia Gambia - + Guinea Guinea - + Guadeloupe Guadalupe - + Equatorial Guinea Guinea Ecuatorial - + Greece Grecia - + South Georgia and the South Sandwich Islands Islas Georgias del Sur y Sandwich del Sur - + Guatemala Guatemala - + Guam Guam - + Guinea-Bissau Guinea-Bisáu - + Guyana Guyana - + Hong Kong Hong Kong - + Heard Island and McDonald Islands Islas Heard y McDonald - + Honduras Honduras - + Croatia Croacia - + Haiti Haití - + Hungary Hungría - + Indonesia Indonesia - + Ireland Irlanda - + Israel Israel - + India India - + British Indian Ocean Territory Territorio Británico del Océano Índico - + Iraq Irak - + Iran, Islamic Republic of Irán - + Iceland Islandia - + Italy Italia - + Jamaica Jamaica - + Jordan Jordania - + Japan Japón - + Kenya Kenya - + Kyrgyzstan Kirguistán - + Cambodia Camboya - + Kiribati Kiribati - + Comoros Comoras - + Saint Kitts and Nevis San Cristóbal y Nieves - + Korea, Democratic People's Republic of Corea del Norte - + Korea, Republic of Corea del Sur - + Kuwait Kuwait - + Cayman Islands Islas Caimán - + Kazakhstan Kazajistán - + Lao People's Democratic Republic Laos - + Lebanon Líbano - + Saint Lucia Santa Lucía - + Liechtenstein Liechtenstein - + Sri Lanka Sri Lanka - + Liberia Liberia - + Lesotho Lesoto - + Lithuania Lituania - + Luxembourg Luxemburgo - + Latvia Letonia - + Morocco Marruecos - + Monaco Mónaco - + Moldova, Republic of Moldavia - + Madagascar Madagascar - + Marshall Islands Islas Marshall - + Mali Malí - + Myanmar Birmania - + Mongolia Mongolia - + Northern Mariana Islands Islas Marianas del Norte - + Martinique Martinica - + Mauritania Mauritania - + Montserrat Montserrat - + Malta Malta - + Mauritius Mauricio - + Maldives Maldivas - + Malawi Malaui - + Mexico México - + Malaysia Malasia - + Mozambique Mozambique - + Namibia Namibia - + New Caledonia Nueva Caledonia - + Niger Níger - + Norfolk Island Isla Norfolk - + Nigeria Nigeria - + Nicaragua Nicaragua - + Netherlands Países Bajos - + Norway Noruega - + Nepal Nepal - + Nauru Nauru - + Niue Niue - + New Zealand Nueva Zelanda - + Oman Omán - + Panama Panamá - + Peru Perú - + French Polynesia Polinesia Francesa - + Papua New Guinea Papúa Nueva Guinea - + Philippines Filipinas - + Pakistan Pakistán - + Poland Polonia - + Saint Pierre and Miquelon San Pedro y Miquelón - + Puerto Rico Puerto Rico - + Portugal Portugal - + Palau Palaos - + Paraguay Paraguay - + Qatar Catar - + Reunion Reunión - + Romania Rumanía - + Russian Federation Rusia - + Rwanda Ruanda - + Saudi Arabia Arabia Saudita - + Solomon Islands Islas Salomón - + Seychelles Seychelles - + Sudan Sudán - + Sweden Suecia - + Singapore Singapur - + Slovenia Eslovenia - + Svalbard and Jan Mayen Svalbard y Jan Mayen - + Slovakia Eslovaquia - + Sierra Leone Sierra Leona - + San Marino San Marino - + Senegal Senegal - + Somalia Somalia - + Suriname Surinam - + Sao Tome and Principe Santo Tomé y Príncipe - + El Salvador El Salvador - + Syrian Arab Republic Siria - + Swaziland Suazilandia - + Turks and Caicos Islands Islas Turcas y Caicos - + Chad Chad - + French Southern Territories Tierras Australes y Antárticas Francesas - + Togo Togo - + Thailand Tailandia - + Tajikistan Tayikistán - + Tokelau Tokelau - + Turkmenistan Turkmenistán - + Tunisia Túnez - + Tonga Tonga - - Could not decompress GeoIP database file. - No se pudo descomprimir el archivo de base de datos GeoIP. - - - + Timor-Leste Timor Oriental - + Bolivia, Plurinational State of Bolivia - + Bonaire, Sint Eustatius and Saba Bonaire - + Cote d'Ivoire Costa de Marfil - + Libya Libia - + Saint Martin (French part) San Martín (Parte Francesa) - + Macedonia, The Former Yugoslav Republic of Macedonia - + Macao Macao - + Pitcairn Islas Pitcairn - + Palestine, State of Palestina - + Saint Helena, Ascension and Tristan da Cunha Santa Elena, Ascensión y Tristán de Acuña - + South Sudan Sudán del Sur - + Sint Maarten (Dutch part) Sint Maarten (Parte neerlandesa) - + Turkey Turquía - + Trinidad and Tobago Trinidad y Tobago - + Tuvalu Tuvalu - + Taiwan Taiwán - + Tanzania, United Republic of Tanzania - + Ukraine Ucrania - + Uganda Uganda - + United States Minor Outlying Islands Islas Ultramarinas Menores de Estados Unidos - + United States Estados Unidos - + Uruguay Uruguay - + Uzbekistan Uzbekistán - + Holy See (Vatican City State) Santa Sede (Estado de la ciudad del Vaticano) - + Saint Vincent and the Grenadines San Vicente y las Granadinas - + Virgin Islands, British Islas Vírgenes Británicas - + Virgin Islands, U.S. Islas Vírgenes de los Estados Unidos - + Vanuatu Vanuatu - + Wallis and Futuna Wallis y Futuna - + Samoa Samoa - + Yemen Yemen - + Mayotte Mayotte - + Serbia Serbia - + South Africa Sudáfrica - + Zambia Zambia - + Montenegro Montenegro - + Zimbabwe Zimbabue - + Aland Islands Åland - + Guernsey Guernsey - + Isle of Man Isla de Man - + Jersey Jersey - + Saint Barthelemy San Bartolomé - + + Could not uncompress GeoIP database file. + No se pudo descomprimir el archivo de base de datos GeoIP. + + + Couldn't save downloaded GeoIP database file. No se pudo guardar la base de datos GeoIP descargada. - + Successfully updated GeoIP database. Base de datos GeoIP actualizada correctamente. - + Couldn't download GeoIP database file. Reason: %1 No se pudo descargar la base de datos GeoIP. Razon: %1 @@ -4602,12 +4144,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] Soporte UPnP / NAT-PMP [Activado] - + UPnP / NAT-PMP support [OFF] Soporte UPnP / NAT-PMP [Desactivado] @@ -4615,7 +4157,7 @@ Net::Smtp - + Email Notification Error: Error en la notificación por E-mail: @@ -4623,1281 +4165,1077 @@ OptionsDialog - + Options Opciones - + Behavior Comportamiento - + Downloads Descargas - + Connection Conexión - + Speed Velocidad - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI Interfaz Web - + Advanced Avanzado - + Language Idioma - + User Interface Language: Idioma de la interfaz: - + (Requires restart) (Es necesario reiniciar qBittorrent) - + Transfer List Lista de transferencias - + Confirm when deleting torrents Confirmar al eliminar torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. Alternar colores en la lista de transferencias - + Hide zero and infinity values Ocultar los valores cero e infinito - + Always Siempre - + Paused torrents only Solo torrents pausados - + Action on double-click Acción a realizar con un doble-click - + Downloading torrents: Torrents descargando: - - + + Start / Stop Torrent Iniciar / Parar torrent - - + + Open destination folder Abrir carpeta de destino - - + + No action Sin acción - + Completed torrents: Torrents completados: - + Desktop Escritorio - + Start qBittorrent on Windows start up Iniciar qBittorrent cuando arranque Windows - + Show splash screen on start up Mostrar pantalla de bienvenida al iniciar - + Start qBittorrent minimized Iniciar qBittorrent minimizado - + Confirmation on exit when torrents are active Confirmación al salir mientras haya torrents activos - + Confirmation on auto-exit when downloads finish Confirmar la salida automática cuando las descargas finalicen - - KiB - KiB - - - - Email notification &upon download completion - Notificarme por correo electrónico de la finalización de las descargas - - - - Run e&xternal program on torrent completion - Ejecutar un programa externo al completar el torrent - - - - IP Fi&ltering - Filtrado IP - - - - Schedule &the use of alternative rate limits - Programar el uso de límites alternativos - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Más información</a>) - - - - &Torrent Queueing - Torrents en cola - - - - Seed torrents until their seeding time reaches - Sembrar torrents hasta que su tiempo de siembra alcance - - - - A&utomatically add these trackers to new downloads: - Agregar automáticamente estos trackers a las descargas: - - - - RSS Reader - Lector RSS - - - - Enable fetching RSS feeds - Habilitar búsqueda por canales RSS - - - - Feeds refresh interval: - Intervalo de actualización de canales RSS: - - - - Maximum number of articles per feed: - Número máximo de artículos por canal: - - - - - min - minutes - min - - - - RSS Torrent Auto Downloader - Descargador RSS - - - - Enable auto downloading of RSS torrents - Habilitar auto descarga de torrents RSS - - - - Edit auto downloading rules... - Editar reglas de auto descarga... - - - - Web User Interface (Remote control) - interfaz Web (Control remoto) - - - - IP address: - Direcciones IP: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - Dirección IP que la interfaz Web escuchará. -Especifique una dirección IPv4 o IPv6. -"0.0.0.0" para cualquier dirección IPv4. -"::" para cualquier dirección IPv6. -"*" para cualquier dirección IPv4 O IPv6 - - - - Server domains: - Dominios de servidor: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - Lista blanca para filtrar valores de cabeceras de hosts HTTP. -Para defenderse de ataques DNS rebinding, -no debería utilizar nombres de dominio utilizados por el servidor de la interfaz Web. - -Use ';' para dividir múltiples entradas. Puede usar el comodin '*'. - - - - &Use HTTPS instead of HTTP - &Usar HTTPS en lugar de HTTP - - - - Bypass authentication for clients on localhost - Eludir la autenticación para clientes en localhost - - - - Bypass authentication for clients in whitelisted IP subnets - Eludir la autenticación para clientes en la lista blanca de subredes IP - - - - IP subnet whitelist... - Lista blanca de subredes IP... - - - - Upda&te my dynamic domain name - Actualizar mi nombre de dominio dinámico + + Show qBittorrent in notification area + Mostrar qBittorrent en el área de notificación - + Minimize qBittorrent to notification area Minimizar qBittorrent en el area de notificación - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. Cerrar qBittorrent al area de notificación - + Tray icon style: Estilo del icono del area de notificación: - + Normal Normal - + Monochrome (Dark theme) Monocromo (tema oscuro) - + Monochrome (Light theme) Monocromo (tema claro) - + File association Asociación de archivos - + Use qBittorrent for .torrent files Usar qBittorrent para los archivos .torrent - + Use qBittorrent for magnet links Usar qBittorrent para los enlaces magnet - + Power Management Administración de energía - + + Inhibit system sleep when torrents are active + Inhabilitar la suspensión del equipo cuando queden torrents activos + + + + Log file + Archivo de logs + + + Save path: Ruta Destino - + Backup the log file after: Respaldar el archivo de logs después de: - + + MB + MB + + + Delete backup logs older than: Eliminar logs de más antiguos que: - + days Delete backup logs older than 10 months días - + months Delete backup logs older than 10 months meses - + years Delete backup logs older than 10 years años - + When adding a torrent Al agregar un torrent - + + Display torrent content and some options + Mostrar el contenido del torrent y opciones + + + Bring torrent dialog to the front Traer el diálogo del torrent al frente - + Do not start the download automatically The torrent will be added to download list in pause state No iniciar las descargas de forma automática - + Should the .torrent file be deleted after adding it Debería el archivo .torrent ser borrado después de ser agregado. - + + Delete .torrent files afterwards + Después eliminar el archivo .torrent + + + Also delete .torrent files whose addition was cancelled También eliminar archivos .torrent si su agregado fue cancelado. - + Also when addition is cancelled También cuando su agregado es cancelado. - + Warning! Data loss possible! ¡Peligro! Perdida de datos posible. - + Saving Management Administración de guardado - + Default Torrent Management Mode: Administración de Torrents predeterminada: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category El moto automático hace que varias propiedades del torrent (por ej: la ruta de guardado) sean decididas por la categoría asociada. - + Manual Manual - + Automatic Automático - + When Torrent Category changed: Cuando cambia la categoría del torrent: - + Relocate torrent Reubicar torrent - + Switch torrent to Manual Mode Cambiar torrent a modo manual - + When Default Save Path changed: Cuando la ubicación de guardado predeterminada cambia: - - + + Relocate affected torrents Reubicar los torrents afectados - - + + Switch affected torrents to Manual Mode Cambiar los torrents afectados a modo manual - + When Category changed: Cuando cambia la categoría: - + Use Subcategories Usar subcategorias: - + Default Save Path: Ubicación de guardado predeterminada: - + Keep incomplete torrents in: Mantener torrents incompletos en: - + Copy .torrent files to: Copiar archivos .torrent en: - - Show &qBittorrent in notification area - Mostrar &qBittorrent en el área de notificación - - - - &Log file - Archivo de &logs - - - - Display &torrent content and some options - Mostrar el contenido del Torrent y opciones - - - - Create subfolder for torrents with multiple files - Crear una sub-carpeta para torrentes con múltiples archivos - - - - De&lete .torrent files afterwards - Después eliminar el archivo .torrent - - - + Copy .torrent files for finished downloads to: Copiar archivos .torrent de descargas finalizadas a: - + Pre-allocate disk space for all files Pre-asignar espacio en el disco para todos los archivos - - Inhibit system sleep when torrents are downloading - Inhabilitar la suspensión del equipo cuando queden torrents descargando - - - - Inhibit system sleep when torrents are seeding - Inhabilitar la suspensión del equipo cuando queden torrents sembrando - - - + Append .!qB extension to incomplete files Agregar la extensión .!qB a los archivos incompletos - - Enable recursive download dialog - Activar la ventana de confirmación de descargas recursivas - - - + Automatically add torrents from: Agregar automáticamente los torrents de: - + Add entry Agregar entrada - + Remove entry Eliminar entrada - + + Email notification upon download completion + Notificar por correo electrónico de la finalización de las descargas + + + + Destination email: + Dirección de correo electrónico: + + + SMTP server: Servidor SMTP: - + This server requires a secure connection (SSL) El servidor requiere una conexión segura (SSL) - - + + + Authentication Autenticación - - - - + + + + Username: Nombre de usuario: - - - - + + + + Password: Contraseña: - - Enabled protocol: - Protocolo Activado: - - - - TCP and μTP - TCP y μTP + + Run external program on torrent completion + Ejecutar un programa externo al completar el torrent - + Listening Port Puerto de escucha - + Port used for incoming connections: Puerto utilizado para conexiones entrantes: - + Random Aleatorio - + Use UPnP / NAT-PMP port forwarding from my router Usar reenvío de puertos UPnP / NAT-PMP de mi router - + Use different port on each startup Usar un puerto diferente en cada inicio - + Connections Limits Límites de conexión - + Maximum number of connections per torrent: Máximo de conexiones por torrent: - + Global maximum number of connections: Máximo de conexiones totales: - + Maximum number of upload slots per torrent: Máximo de puestos de subida por torrent: - + Global maximum number of upload slots: Máximo total de puestos de subida: - + Proxy Server Servidor proxy - + Type: Tipo: - + (None) (Ninguno) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Host: - - + + Port: Puerto: - + Otherwise, the proxy server is only used for tracker connections Sino, el servidor proxy se utilizará solamente para las conexiones al tracker - + Use proxy for peer connections Usar proxy para las conexiones a los pares - + Disable connections not supported by proxies Deshabilitar conexiones no soportadas por los proxis - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Más información</a>) - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection Canales RSS, motores de búsqueda. actualizaciones del software o cualquier otra cosa que no sean transferencias de torrents y operaciones relacionadas (como intercambio de pares) usarán una conexión directa - + Use proxy only for torrents Usar proxy solo para torrents - - A&uthentication - Autenticación - - - + Info: The password is saved unencrypted Info: La contraseña se guarda sin cifrar - + + IP Filtering + Filtrado IP + + + Filter path (.dat, .p2p, .p2b): Ruta del filtro (.dat, .p2p, .p2b): - + Reload the filter Actualizar el filtro - - Manually banned IP addresses... - Direcciones IP prohibidas manualmente... - - - + Apply to trackers Aplicar a los trackers - + Global Rate Limits Limites globales de velocidad - - - - - - - KiB/s - KiB/s - - - - + + Upload: Subida: - - + + + + + KiB/s + KiB/s + + + + Download: Bajada: - + Alternative Rate Limits Límites de velocidad alternativos - - + + Schedule the use of alternative rate limits + Programar el uso de límites alternativos + + + From: from (time1 to time2) Desde las: - - + To: time1 to time2 Hasta: - + When: Cuándo: - + Every day Todos los días - + Weekdays Días laborales - + Weekends Fines de semana - + Rate Limits Settings Configuración de los limites - + Apply rate limit to peers on LAN Aplicar el límite a los pares en LAN - + Apply rate limit to transport overhead Aplicar límite para el exceso de transporte (Overhead) - - + + + Enable µTP protocol + Activar protocolo µTP + + + Apply rate limit to µTP protocol Aplicar límite para conexiones µTP - + Privacy Privacidad - + Enable DHT (decentralized network) to find more peers Activar DHT (red descentralizada) para encontrar más pares - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Intercambiar pares con clientes Bittorrent compatibles (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers Habilitar intercambio de pares (PeX) para encontrar más pares - + Look for peers on your local network Buscar pares en su red local - + Enable Local Peer Discovery to find more peers Habilitar busqueda local de pares para encontrar más pares - + Encryption mode: Modo de cifrado: - + Prefer encryption Preferir cifrado - + Require encryption Exigir cifrado - + Disable encryption Deshabilitar cifrado - + Enable when using a proxy or a VPN connection Habilitar cuando se use un proxy o un VPN - + Enable anonymous mode Activar modo anónimo - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Más información</a>) + + + + Torrent Queueing + Torrents en cola + + + Maximum active downloads: Máximo de descargas activas: - + Maximum active uploads: Máximo de subidas activas: - + Maximum active torrents: Máximo de torrents activos: - + Do not count slow torrents in these limits No contar torrents lentos en estos límites - - Upload rate threshold: - Umbral de vel. de subida: - - - - Download rate threshold: - Umbral de vel. de descarga: - - - - sec - seconds - seg - - - - Torrent inactivity timer: - Temporizador de inactividad de Torrent: - - - + Share Ratio Limiting Limite de ratio de compartición - + Seed torrents until their ratio reaches Sembrar torrents hasta que su ratio sea - + then luego - + Pause them Pausarlos - + Remove them Eliminarlos - - RSS Smart Episode Filters - Filtro Inteligente de Episodios por RSS + + Automatically add these trackers to new downloads: + Agregar automáticamente estos trackers a las descargas: + + + + Enable Web User Interface (Remote control) + Habilitar interfaz Web (Control remoto) - + Use UPnP / NAT-PMP to forward the port from my router Usar UPnP / NAT-PMP para redirigir el puerto de mi router - + + Use HTTPS instead of HTTP + Usar HTTPS en lugar de HTTP + + + Certificate: Certificado: - + Import SSL Certificate Importar certificado SSL - + Key: Clave: - + Import SSL Key Importar clave SSL - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Información acerca de los certificados</a> - - Use alternative Web UI - Usar la Interfaz de Usuario Web alternativa - - - - Files location: - Ubicación de archivos: - - - - Enable clickjacking protection - Activar protección de clickjacking + + Bypass authentication for localhost + Eludir la autenticación para localhost - - Enable Cross-Site Request Forgery (CSRF) protection - Activar protección CSRF (Cross-site Request Forgery) + + Update my dynamic domain name + Actualizar mi nombre de dominio dinámico - + Service: Servicio: - + Register Registro - + Domain name: Nombre de dominio: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! Al activar estas opciones, puedes <strong>perder permanentemente</strong> tus archivos .torrent - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well Cuando estas opciones estén habilitadas, qBittorrent <strong>eliminará</strong> los archivos .torrent después de ser exitosamente (la primera opción) o no (la segunda opción) agregado a la lista de descargas. Esto aplicará <strong>no solo</strong> a los archivos abiertos por &ldquo;Abrir torrent&rdquo; del menú, sino a aquellos abiertos por su asociación de <strong>tipo de archivo</strong> también. - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog Si habilitas la segunda opción (&ldquo;También cuando la agregado es cancelado&rdquo;) el archivo .torrent <strong> será borrado </strong> incluso si elijes &ldquo;<strong>Cancelar</strong>&rdquo; en la ventana de &ldquo;Agregar torrent&rdquo; - - Choose Alternative UI files location - Elegir ubicación de archivos de la Interfaz de Usuario alternativa - - - + Supported parameters (case sensitive): Parámetros soportados (sensible a mayúsculas): - + %N: Torrent name %N: Nombre del torrent - + %L: Category %L: Categoría - - %G: Tags (seperated by comma) - %G: Etiquetas (separadas por coma) - - - + %F: Content path (same as root path for multifile torrent) %F: Ruta del contenido (misma ruta que la raíz para torrents muilti-archivo) - + %R: Root path (first torrent subdirectory path) %R: Ruta Raíz (primer subdirectorio del torrent) - + %D: Save path %D: Ruta de destino - + %C: Number of files %C: Cantidad de archivos - + %Z: Torrent size (bytes) %Z: Tamaño del torrent (bytes) - + %T: Current tracker %T: Tracker actual - + %I: Info hash %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") Consejo: Encapsula el parámetro con comillas para evitar que el texto sea cortado en un espacio (ej: "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - Un torrent se considerará lento si la velocidad de descarga y subida se mantienen debajo de estos valores por el tiempo indicado en el "Temporizador de inactividad de Torrent" - - - + Select folder to monitor Seleccione una carpeta para monitorear - + Folder is already being monitored: Esta carpeta ya está monitoreada: - + Folder does not exist: La carpeta no existe: - + Folder is not readable: La carpeta no es legible: - + Adding entry failed Fallo al agregar entrada - - - - + + Choose export directory Selecciona una ruta de exportación - - - + + + + + + Choose a save directory Seleccione una ruta para guardar - + Choose an IP filter file Seleccione un archivo de filtro IP - + All supported filters Todos los filtros soportados - + SSL Certificate Certificado SSL - + + SSL Key + Clave SSL + + + Parsing error Error de análisis - + Failed to parse the provided IP filter No se ha podido analizar el filtro IP proporcionado - + Successfully refreshed Actualizado correctamente - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Filtro IP analizado correctamente: %1 reglas fueron aplicadas. - + Invalid key Clave no válida - + This is not a valid SSL key. Esta no es una clave SSL válida. - + Invalid certificate Certificado no válido - - Preferences - Preferencias - - - - Import SSL certificate - Importar certificado SSL - - - + This is not a valid SSL certificate. Este no es un Certificado SSL válido. - - Import SSL key - Importar clave SSL - - - - SSL key - Clave SSL - - - + Time Error Error de tiempo - + The start time and the end time can't be the same. Los tiempos de inicio y finalización no pueden ser iguales. - - + + Length Error Error de longitud - + The Web UI username must be at least 3 characters long. El nombre de usuario de la interfaz Web debe ser de al menos 3 caracteres. - + The Web UI password must be at least 6 characters long. La contraseña de Interfaz de Usuario Web debe ser de al menos 6 caracteres. @@ -5905,72 +5243,72 @@ PeerInfo - - Interested(local) and Choked(peer) - interesado(local) y ahogado(par) + + interested(local) and choked(peer) + interesado(local) y bloqueado(par) - + interested(local) and unchoked(peer) interesado(local) y no bloqueado(par) - + interested(peer) and choked(local) interesado(par) y bloqueado(local) - + interested(peer) and unchoked(local) interesado(par) y no bloqueado(local) - + optimistic unchoke desbloqueo optimista - + peer snubbed par descartado - + incoming connection Conexión entrante - + not interested(local) and unchoked(peer) no interesado(local) y no bloqueado(par) - + not interested(peer) and unchoked(local) no interesado(par) y no bloqueado(local) - + peer from PEX par de PEX - + peer from DHT par de DHT - + encrypted traffic trafico cifrado - + encrypted handshake negociación cifrada - + peer from LSD par de LSD @@ -5978,180 +5316,165 @@ PeerListWidget - + IP IP - + Port Puerto - + Flags Banderas - + Connection Conexión - + Client i.e.: Client application Cliente - + Progress i.e: % downloaded Progreso - + Down Speed i.e: Download speed Vel. Descarga - + Up Speed i.e: Upload speed Vel. Subida - + Downloaded i.e: total data downloaded - Descargado + Bajado - + Uploaded i.e: total data uploaded Subido - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Importancia - + Files i.e. files that are being downloaded right now Archivos - + Column visibility Visibilidad de columnas - + Add a new peer... Agregar nuevo par... - - + + Ban peer permanently Prohibir este par permanentemente - + Manually adding peer '%1'... Agregando manualmente el par '%1'... - + The peer '%1' could not be added to this torrent. El par no se pudo agregar al torrent. - + Manually banning peer '%1'... Prohibiendo manualmente al par '%1'... - - + + Peer addition Agregar par - + Country País: - + Copy IP:port Copiar IP:puerto - + Some peers could not be added. Check the Log for details. Algunos pares no pudieron agregarse. Revisa el log para obtener más detalles. - + The peers were added to this torrent. Los pares se agregaron a este torrent. - + Are you sure you want to ban permanently the selected peers? ¿Seguro que desea prohibir permanentemente los pares seleccionados? - + &Yes &Sí - + &No &No - PeersAdditionDialog - - - Add Peers - Agregar pares - - - - List of peers to add (one IP per line): - Lista de pares a agregar (una IP por línea): - - - - Format: IPv4:port / [IPv6]:port - Formato: IPv4:puerto / [IPv6]:puerto - + PeersAdditionDlg - + No peer entered No se ha introducido ningún par - + Please type at least one peer. Por favor introduce al menos un par. - + Invalid peer Par invalido - + The peer '%1' is invalid. El par '%1' es invalido. @@ -6159,12 +5482,12 @@ PieceAvailabilityBar - + White: Unavailable pieces Blanco: Piezas no disponibles - + Blue: Available pieces Azul: Piezas disponibles @@ -6172,337 +5495,293 @@ PiecesBar - + Files in this piece: Archivos en esta pieza: - + File in this piece Archivo en esta pieza - + File in these pieces Archivo en estas piezas - - Wait until metadata become available to see detailed information - Espere hasta que los metadatos estén disponibles para ver la información detallada. - - - + Hold Shift key for detailed information Mantén Shift para información detallada - PluginSelectDialog + PluginSelectDlg - + Search plugins Plugins de búsqueda - + Installed search plugins: Plugins de búsqueda instalados: - + Name Nombre - + Version Versión - + Url URL - - + + Enabled Habilitado - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - Advertencia: Asegúrese de cumplir con las leyes de copyright de su país cuando descarga torrents de estos motores de búsqueda. - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - Puedes obtener nuevos motores de búsqueda aquí: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Puedes obtener nuevos plugins de búsqueda aquí: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one Instalar uno nuevo - + Check for updates Buscar actualizaciones - + Close Cerrar - + Uninstall Desinstalar - - - + + + Yes - - - - + + + + No No - + Uninstall warning Advertencia de desinstalación - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - Algunos plugins no pudieron ser desinstalados porque están incluidos en qBittorrent. Solamente pueden ser desinstalados los que han sido agregados por ti. + Algunos plugins no pudieron ser desinstalados porque vienen incluidos en qBittorrent. Solamente pueden desinstalarse los que han sido agregados por ti. En su lugar, esos plugins fueron deshabilitados. - + Uninstall success Desinstalación correcta - + All selected plugins were uninstalled successfully Todos los plugins seleccionados fueron desinstalados correctamente - - - - - Search plugin update - Actualización de los plugins de búsqueda - - - - Plugins installed or updated: %1 - Plugins instalados o actualizados: %1 - - - - + + New search engine plugin URL URL del nuevo plugin de motor de búsqueda - - + + URL: URL: - + Invalid link Enlace inválido - + The link doesn't seem to point to a search engine plugin. El enlace no parece contener un plugin de búsqueda. - + Select search plugins Seleccione los plugins de búsqueda - + qBittorrent search plugin Plugin de búsqueda de qBittorrent - + + + + Search plugin update + Actualización de los plugins de búsqueda + + + All your plugins are already up to date. Todos los plugins ya están actualizados. - + Sorry, couldn't check for plugin updates. %1 No se pudo buscar actualizaciones de plugins. %1 - + + + Search plugin install Instalar plugin de búsqueda - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + El plugin de motor de búsqueda "%1" fue instalado correctamente. + + + Couldn't install "%1" search engine plugin. %2 No se pudo instalar el plugin de motor de búsqueda "%1". %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + El plugin de motor de búsqueda "%1" fue actualizado correctamente. + + + Couldn't update "%1" search engine plugin. %2 No se pudo actualizar el plugin de motor de búsqueda "%1". %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source Fuente del plugin - + Search plugin source: Fuente del plugin de búsqueda: - + Local file Archivo local - + Web link Enlace web - PowerManagement - - - qBittorrent is active - qBittorrent está activo - - - - PreviewSelectDialog - - - Preview - Previsualizar - + PreviewSelect - + Name Nombre - + Size Tamaño - + Progress Progreso - - + + Preview impossible Imposible previsualizar - - + + Sorry, we can't preview this file No se pudo previsualizar este archivo - Private::FileLineEdit - - - '%1' does not exist - '%1' no existe - - - - '%1' does not point to a directory - '%1' no apunta a un directorio - - - - '%1' does not point to a file - '%1' no apunta a un archivo - - - - Does not have read permission in '%1' - No tiene permiso de lectura en '%1' - - - - Does not have write permission in '%1' - No tiene permiso de escritura en '%1' - - - PropListDelegate - + Not downloaded No descargado - - + + Normal Normal (priority) Normal - - N/A - N/A - - - + Do not download Do not download (priority) - No descargar + No descargar - - + + High High (priority) Alta - + N/A + N/A + + + Mixed Mixed (priorities Mixta - - + + Maximum Maximum (priority) Máxima @@ -6511,32 +5790,32 @@ PropTabBar - + General General - + Trackers Trackers - + Peers Pares - + HTTP Sources Fuentes HTTP - + Content Contenido - + Speed Velocidad @@ -6630,22 +5909,22 @@ Comentario: - + Select All Seleccionar todo - + Select None Seleccionar ninguno - + Normal Normal - + High Alta @@ -6705,165 +5984,165 @@ Ruta de destino: - + Maximum Máxima + - Do not download No descargar - + Never Nunca - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (tienes %3) - - + + %1 (%2 this session) %1 (%2 en esta sesión) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (sembrado durante %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 máx) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 total) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 prom.) - + Open Abrir - + Open Containing Folder Abrir carpeta de destino - + Rename... Renombrar... - + Priority Prioridad - + New Web seed Nueva semilla Web - + Remove Web seed Eliminar semilla Web - + Copy Web seed URL Copiar URL de la semilla Web - + Edit Web seed URL Editar URL de la semilla Web - + + Rename the file + Renombrar archivo + + + New name: Nuevo nombre: - - + + + The file could not be renamed + No se pudo renombrar el archivo + + + + This file name contains forbidden characters, please choose a different one. + El nombre introducido contiene caracteres prohibidos, por favor elija otro. + + + + This name is already in use in this folder. Please use a different name. Este nombre ya está en uso. Por favor, use un nombre diferente. - + The folder could not be renamed La carpeta no se pudo renombrar - + qBittorrent qBittorrent - + Filter files... Filtrar archivos... - - Renaming - Renombrando - - - - - Rename error - Error al renombrar - - - - The name is empty or contains forbidden characters, please choose a different one. - El nombre está vacío o contiene caracteres prohibidos, por favor, elija uno diferente - - - + New URL seed New HTTP source Nueva semilla URL - + New URL seed: Nueva semilla URL: - - + + This URL seed is already in the list. Esta semilla URL ya está en la lista. - + Web seed editing Editando semilla Web - + Web seed URL: URL de la semilla Web: @@ -6871,230 +6150,117 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + Su dirección IP ha sido bloqueada debido a demasiados intentos fallados de autenticación. + + + + Error: '%1' is not a valid torrent file. + + Error: '%1' no es un archivo torrent valido. + + + + + Error: Could not add torrent to session. + Error: No se pudo agregar el torrent a la sesión. + + + + I/O Error: Could not create temporary file. + Error de I/O: No se pudo crear un archivo temporal. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 es un parámetro de la línea de comandos desconocido. - - + + %1 must be the single command line parameter. %1 debe ser el único parámetro de la línea de comandos. - + + %1 must specify the correct port (1 to 65535). + %1 debe especificar el puerto correcto (entre 1 y 65535). + + + You cannot use %1: qBittorrent is already running for this user. No puedes usar %1: qBittorrent ya se está ejecutando para este usuario. - + Usage: Uso: - + Options: Opciones: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - El parámetro '%1' debe seguir la sintaxis '%1=%2' - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - El parámetro '%1' debe seguir la sintaxis '%1=%2' - - - - Expected integer number in environment variable '%1', but got '%2' - Esperado un número entero en la variable del entorno '%1', pero se obtuvo '%2' - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - El parámetro '%1' debe seguir la sintaxis '%1=%2' - - - - Expected %1 in environment variable '%2', but got '%3' - Esperado %1 en la variable del entorno '%2', pero se obtuvo '%3' - - - - port - puerto - - - - %1 must specify a valid port (1 to 65535). - %1 debe especificar un puerto válido (entre 1 y 65535). - - - - Display program version and exit - Muestra la versión del programa y sale + + Displays program version + Muestra la versión del programa - - Display this help message and exit - Muestra este mensaje de ayuda y sale + + Displays this help message + Muestra este mensaje de ayuda - - Change the Web UI port - Cambia el puerto de la interfaz Web + + Changes the Web UI port (current: %1) + Cambia el puerto de la interfaz Web (actual: %1) - + Disable splash screen Desactivar pantalla de inicio - + Run in daemon-mode (background) Ejecutar en modo servicio (segundo plano) - - dir - Use appropriate short form or abbreviation of "directory" - ruta - - - - Store configuration files in <dir> - Guardar archivos de configuración en <dir> - - - - - name - nombre - - - - Store configuration files in directories qBittorrent_<name> - Guardar archivos de configuración en direcciones qBittorrent_<name> - - - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Modificar los archivos de continuación rápida de libtorrent y hacer las rutas relativas a la ruta del perfil. - - - - files or URLs - archivos o URLs - - - - Download the torrents passed by the user + + Downloads the torrents passed by the user Descarga los torrents pasados por el usuario - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Especifica si el dialogo de "Agregar torrent" se abre al agregar un torrent. - - - - Options when adding new torrents: - Opciones cuando agregue nuevos torrents: - - - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Atajo para %1 - - - - path - ruta - - - - Torrent save path - Ruta de destino del Torrent - - - - Add torrents as started or paused - Agregar torrents iniciados o pausados - - - - Skip hash check - No comprobar hash - - - - Assign torrents to category. If the category doesn't exist, it will be created. - Asignar torrents a la categoría. Si la categoría no existe, será creada. - - - - Download files in sequential order - Descargar archivos en orden secuencial - - - - Download first and last pieces first - Comenzar por las primeras y últimas partes - - - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - Valores opcionales pueden ser provistos por variables del entorno. Para la opción llamada 'parameter-name', la variable del entorno se llama 'QBT_PARAMETER_NAME' (en mayúsculas y '-' es reemplazado por '_'). Para pasar valores de bandera, defina la variable como '1' o 'TRUE'. Por Ej: para desactivar la pantalla de inicio: - - - - Command line parameters take precedence over environment variables - Los parámetros de linea de comandos tienen prioridad sobre las variables del entorno - - - + Help Ayuda - + Run application with -h option to read about command line parameters. Ejecuta la aplicación con la opción -h para obtener información sobre los parámetros de la línea de comandos. - + Bad command line Parámetros de la línea de comandos incorrectos - + Bad command line: Parámetros de la línea de comandos incorrectos: - + Legal Notice Aviso legal - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - qBittorrent es un programa para compartir archivos. Cuando se descarga un torrent, los datos del mismo se pondrán a disposición de los demás usuarios por medio de las subidas. Cualquier contenido que usted comparta, lo hace bajo su propia responsabilidad. - - - - No further notices will be issued. - No se le volverá a notificar sobre esto. - - - + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. No further notices will be issued. @@ -7103,353 +6269,432 @@ No se le volverá a notificar sobre esto. - + Press %1 key to accept and continue... Pulse la tecla %1 para aceptar y continuar... - + Legal notice Aviso legal - + Cancel Cancelar - + I Agree Estoy de acuerdo - - - Upgrade - Actualizar + + Torrent name: %1 + Nombre del torrent: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - Actualizaste desde una versión anterior que guardaba las cosas de forma diferente. Debes migrar al nuevo sistema de guardado. Si continuas, no podrás volver a usar una versión anterior a v3.3.0. ¿Continuar? [y/n] + + Torrent size: %1 + Tamaño del torrent: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - Actualizaste desde una versión anterior que guardaba las cosas de forma diferente. Debes migrar al nuevo sistema de guardado. Si continuas, no podrás volver a usar una versión anterior a v3.3.0. + + Save path: %1 + Guardar en: %1 - - Couldn't migrate torrent with hash: %1 - No se pudo migrar el torrent con el hash: %1 + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + El torrernt se descargó en %1. - - Couldn't migrate torrent. Invalid fastresume file name: %1 - No se pudo migrar el torrent. Nombre del archivo de continuación rapida invalido: %1 + + Thank you for using qBittorrent. + Gracias por utilizar qBittorrent. - - Detected unclean program exit. Using fallback file to restore settings: %1 - Se ha detectado un cierre inesperado. Usando el archivo de respaldo para restaurar la configuración: %1 + + [qBittorrent] '%1' has finished downloading + [qBittorrent] '%1' ha terminado de descargarse - - An access error occurred while trying to write the configuration file. - Ocurrió un error de acceso tratando de escribir el archivo de configuración. + + The remote host name was not found (invalid hostname) + El nombre de host remoto no se ha encontrado (nombre de host no válido) - - A format error occurred while trying to write the configuration file. - Ocurrió un error de formato tratando de escribir el archivo de configuración. + + The operation was canceled + La operación fue cancelada - - An unknown error occurred while trying to write the configuration file. - Ocurrió un error de formato tratando de escribir el archivo de configuración. + + The remote server closed the connection prematurely, before the entire reply was received and processed + El servidor remoto cerró la conexión prematuramente, antes de que se recibiera y procesara toda la respuesta - - - RSS::AutoDownloader - - - Invalid data format. - Formato de datos inválido. + + The connection to the remote server timed out + La conexión con el servidor remoto ha agotado el tiempo de espera - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - No se guardaron las reglas del descargador RSS en %1. Error: %2 + + SSL/TLS handshake failed + Handshake SSL/TLS fallido - - Invalid data format - Formato de datos inválido. + + The remote server refused the connection + El servidor remoto rechazó la conexión - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - No se pudo leer las reglas del descargador RSS de %1. Error: %2 + + The connection to the proxy server was refused + La conexión con el servidor proxy fué rechazada - - Couldn't load RSS AutoDownloader rules. Reason: %1 - No se cargaron las reglas del descargador RSS Razón: %1 + + The proxy server closed the connection prematurely + El servidor proxy cerró la conexión antes de tiempo - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - No se pudo descargar el feed RSS: '%1', razón: %2. + + The proxy host name was not found + No se encontró el nombre del servidor proxy - - RSS feed at '%1' updated. Added %2 new articles. - Actualizado Feed RSS en '%1'. Agregados %2 nuevos artículos. + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + La conexión con el servidor proxy ha agotado el tiempo de espera o el proxy no respondió a tiempo a la solicitud enviada - - Failed to parse RSS feed at '%1'. Reason: %2 - No se pudo analizar el feed RSS: '%1', razón: %2. + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + El proxy requiere autenticación para poder atender la solicitud, pero no aceptó las credenciales proporcionadas - - Couldn't read RSS Session data from %1. Error: %2 - No se pudieron leer los datos de sesión RSS de %1. Error: %2 + + The access to the remote content was denied (401) + El acceso al contenido remoto ha sido rechazado (401) - - Couldn't parse RSS Session data. Error: %1 - No se pudieron leer los datos de sesión RSS. Error: %1 - + + The operation requested on the remote content is not permitted + La operación solicitada en el contenido remoto no está permitida + - - Couldn't load RSS Session data. Invalid data format. - No se pudieron leer los datos de sesión RSS. Formato inválido. + + The remote content was not found at the server (404) + El contenido remoto no se encontró en el servidor (404) - - Couldn't load RSS article '%1#%2'. Invalid data format. - No se pudieron cargar los artículos RSS '%1#%2'. Formato inválido. + + The remote server requires authentication to serve the content but the credentials provided were not accepted + El servidor remoto requiere autenticación para servir el contenido, pero no se aceptaron las credenciales proporcionadas - - - RSS::Private::Parser - - Invalid RSS feed. - Canal RSS inválido. + + The Network Access API cannot honor the request because the protocol is not known + La API de acceso a la red no pudo cumplir con la solicitud debido a que el protocolo es desconocido + + + + The requested operation is invalid for this protocol + La operación solicitada no es válida para este protocolo - - %1 (line: %2, column: %3, offset: %4). - %1 (linea: %2, columna: %3, margen: %4). + + An unknown network-related error was detected + Se ha detectado un error desconocido relacionado con la red + + + + An unknown proxy-related error was detected + Se ha detectado un error desconocido relacionado con el proxy + + + + An unknown error related to the remote content was detected + Se ha detectado un error desconocido relacionado con el contenido remoto + + + + A breakdown in protocol was detected + Se ha detectado una ruptura en el protocolo + + + + Unknown error + Error desconocido + + + + + Upgrade + Actualizar - - - RSS::Session - - RSS feed with given URL already exists: %1. - El canal RSS con la URL dada ya existe: %1. + + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] + Actualizaste desde una versión anterior que guardaba las cosas de forma diferente. Debes migrar al nuevo sistema de guardado. Si continuas, no podrás volver a usar una versión anterior a v3.3.0. ¿Continuar? [y/n] - - Cannot move root folder. - No se puede mover la carpeta raíz. + + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. + Actualizaste desde una versión anterior que guardaba las cosas de forma diferente. Debes migrar al nuevo sistema de guardado. Si continuas, no podrás volver a usar una versión anterior a v3.3.0. - - - Item doesn't exist: %1. - El item no existe: %1. + + Couldn't migrate torrent with hash: %1 + No se pudo migrar el torrent con el hash: %1 - - Cannot delete root folder. - No se puede eliminar la carpeta raíz. + + Couldn't migrate torrent. Invalid fastresume file name: %1 + No se pudo migrar el torrent. Nombre del archivo de continuación rapida invalido: %1 - - Incorrect RSS Item path: %1. - Elemento RSS incorrecto Ruta : %1. + + Detected unclean program exit. Using fallback file to restore settings. + Se ha detectado un cierre inesperado. Usando el archivo de respaldo para restaurar la configuración. - - RSS item with given path already exists: %1. - El canal RSS con la ruta dada ya existe: %1. + + An access error occurred while trying to write the configuration file. + Ocurrió un error de acceso tratando de escribir el archivo de configuración. - - Parent folder doesn't exist: %1. - La carpeta no existe: %1. + + A format error occurred while trying to write the configuration file. + Ocurrió un error de formato tratando de escribir el archivo de configuración. - RSSWidget + RSS - + Search Buscar - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - La busqueda por canales RSS esta desactivada. Puedes habilitarla en las opciones. - - - + New subscription - Nueva suscripción + Nueva subscripción - - - + + + Mark items read Marcar como leídos - - Refresh RSS streams - Actualizar los Canales RSS - - - + Update all Actualizar todo - + RSS Downloader... Descargador RSS... - + + Settings... + Configuración... + + + Torrents: (double-click to download) Torrents: (doble-click para descargar) - - + + Delete Eliminar - + Rename... Renombrar... - + Rename Renombrar - - + + Update Actualizar - + New subscription... Nueva suscripción... - - + + Update all feeds Actualizar todos los canales - + Download torrent Descargar torrent - + Open news URL Abrir URL - + Copy feed URL Copiar URL del canal - + New folder... Nueva carpeta... - + + Refresh RSS streams + Actualizar canales RSS + + + + RSSImp + + + Stream URL: + URL del canal: + + + + Please type a RSS stream URL + Por favor escribe una URL de un Canal RSS + + + + This RSS feed is already in the list. + Esta fuente de RSS ya está en la lista. + + + Please choose a folder name Por favor elija un nombre para la carpeta - + Folder name: Nombre de la carpeta: - + New folder Nueva carpeta - - Please type a RSS feed URL - Por favor escribe una URL de un Canal RSS - - - - Feed URL: - URL del canal: - - - + Deletion confirmation Confirmar eliminación - + Are you sure you want to delete the selected RSS feeds? - ¿Esta seguro que desea eliminar los canales RSS seleccionados? + ¿Esta seguro de querer eliminar los canales RSS seleccionados? - + Please choose a new name for this RSS feed Por favor, elija un nuevo nombre para el canal RSS - + New feed name: Nombre del nuevo canal: - - Rename failed - Renombrado fallido + + Name already in use + Ese nombre ya está en uso - + + This name is already used by another item, please choose another one. + Ese nombre ya está siendo usado por otro elemento, por favor, elija otro. + + + Date: Fecha: - + Author: Autor: + + + Unread + No leídos + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + La descarga automática de '%1' desde el canal RSS '%2' falló debido a que no contiene un torrent o un enlace magnet... + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + Descargando automáticamente el torrent '%1' desde el canal RSS '%2'... + + + + Rss::Private::Parser + + + Invalid RSS feed. + Canal RSS inválido. + + + + RssSettingsDlg + + + RSS Reader Settings + Ajustes del lector RSS + + + + RSS feeds refresh interval: + Intervalo de actualización de canales RSS: + + + + min + min + + + + Maximum number of articles per feed: + Número máximo de artículos por canal: + ScanFoldersDelegate - + Select save location Seleccione la ubicación de guardado @@ -7457,473 +6702,454 @@ ScanFoldersModel - + Monitored Folder Carpeta Monitoreada - + Override Save Location Cambiar ubicación de guardado - + Monitored folder Carpeta Monitoreada - + Default save location Ubicación de guardado predeterminada - + Browse... Examinar... - SearchJobWidget + SearchEngine - - Form - Formulario + + Unknown search engine plugin file format. + Formato de plugin de motor de búsqueda desconocido. - - Results(xxx) - Resultados(xxx) + + A more recent version of this plugin is already installed. + Una versión más reciente del plugin ya está instalada. - - Search in: - Buscar en: + + + Plugin is not supported. + Plugin no soportado. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - <html><head/><body><p>Algunos motores de búsqueda, buscan en la descripción del torrent y también en los nombres de archivo. Este modo controla si esos resultados son o no mostrados.</p><p><span style=" font-weight:600;">Todo </span>deshabilita el filtrado y muestra todo lo devuelto por los motores de búsqueda.</p><p><span style=" font-weight:600;">Solo nombres de torrent</span> muestra solo los torrents cuyo nombre coincide con los términos de búsqueda.</p></body></html> + + Update server is temporarily unavailable. %1 + El servidor de actualizaciones no está disponible temporalmente. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - <html><head/><body><p>Establece el número mínimo y máximo de sembradores permitidos</p></body></html> + + + Failed to download the plugin file. %1 + Error al descargar el plugin. %1 - - Seeds: - Semillas: + + An incorrect update info received. + La información de actualización recibida es incorrecta. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - <html><head/><body><p>Número mínimo de semillas</p></body></html> + + All categories + Todas las categorías - - - to - a + + Movies + Películas - - <html><head/><body><p>Maximal number of seeds</p></body></html> - <html><head/><body><p>Máximo numero de semillas</p></body></html> + + TV shows + Programas de TV - - - - + + Music + Música - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - <html><head/><body><p>Establecer los tamaños mínimos y máximos permitidos de un torrent</p></body></html> + + Games + Juegos - - Size: - Tamaño: + + Anime + Anime - - <html><head/><body><p>Minimal torrent size</p></body></html> - <html><head/><body><p>Tamaño mínimo del torrent</p></body></html> + + Software + Software - - <html><head/><body><p>Maximal torrent size</p></body></html> - <html><head/><body><p>Tamaño máximo del torrent</p></body></html> + + Pictures + Imágenes + + + + Books + Libros + + + + SearchListDelegate + + + + Unknown + Desconocido + + + SearchTab - + Name i.e: file name Nombre - + Size i.e: file size Tamaño - + Seeders i.e: Number of full sources Semillas - + Leechers i.e: Number of partial sources Pares - + Search engine Motor de búsqueda - - Filter search results... - Filtrar archivos... - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results Resultados (mostrando <i>%1</i> de <i>%2</i>): - + Torrent names only Solo nombres de Torrent - + Everywhere En todas partes - - Use regular expressions - Usar expresiones regulares - - - + Searching... Buscando... - + Search has finished La búsqueda ha finalizado - + Search aborted Búsqueda abortada - + An error occurred during search... Ha ocurrido un error durante la búsqueda... - + Search returned no results La búsqueda no ha devuelto resultados - + Column visibility - Visibilidad de columnas + Visibilidad de columnas - - - SearchPluginManager - - Unknown search engine plugin file format. - Formato de plugin de motor de búsqueda desconocido. + + Form + Formulario - - A more recent version of this plugin is already installed. - Una versión más reciente del plugin ya está instalada. + + Results(xxx) + Resultados(xxx) - - - Plugin is not supported. - Plugin no soportado. + + Search in: + Buscar en: - - All categories - Todas + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Algunos motores de búsqueda, buscan en la descripción del torrent y también en los nombres de archivo. Este modo controla si esos resultados son o no mostrados.</p><p><span style=" font-weight:600;">Todo </span>deshabilita el filtrado y muestra todo lo devuelto por los motores de búsqueda.</p><p><span style=" font-weight:600;">Solo nombres de torrent</span> muestra solo los torrents cuyo nombre coincide con los términos de búsqueda.</p></body></html> - - Movies - Películas + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Establece el número mínimo y máximo de sembradores permitidos</p></body></html> - - TV shows - Programas de TV + + Seeds: + Semillas: - - Music - Música + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Número mínimo de semillas</p></body></html> - - Games - Juegos + + + to + a - - Anime - Anime + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Máximo numero de semillas</p></body></html> - - - Software - Software + + + + + - - Pictures - Imágenes + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Establecer los tamaños mínimos y máximos permitidos de un torrent</p></body></html> - - Books - Libros + + Size: + Tamaño: - - Update server is temporarily unavailable. %1 - El servidor de actualizaciones no está disponible temporalmente. %1 + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Tamaño mínimo del torrent</p></body></html> - - - Failed to download the plugin file. %1 - Error al descargar el plugin. %1 + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Tamaño máximo del torrent</p></body></html> - - - An incorrect update info received. - La información de actualización recibida es incorrecta. - - - - Search plugin '%1' contains invalid version string ('%2') - El plugin de búsqueda '%1' contiene una cadena de versión invalida ('%2') - - - - SearchWidget + + + SearchWidget - - - - + + + Search Buscar - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - No hay plugins de búsqueda instalados. -Presione el boton "Plugins de búsqueda..." ubicado abajo a la derecha para instalar algunos. - - - + Download Descargar - + Go to description page Ir a la página de la descripción - + Copy description page URL Copiar URL de la descripción - + Search plugins... Plugins de búsqueda... - + A phrase to search for. Una frase a buscar. - + Spaces in a search term may be protected by double quotes. Los espacios de una búsqueda pueden ser protegidos por comillas dobles. - + Example: Search phrase example Ejemplo: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>: buscar <b>foo</b> y <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: buscar <b>foo bar</b> - + All plugins Todos los motores - + Only enabled Solo habilitados - + Select... Seleccionar... - - - + + + Search Engine Motor de búsqueda - + Please install Python to use the Search Engine. Por favor, instala Python para usar el motor de búsqueda. - + Empty search pattern Patrón de búsqueda vacío - + Please type a search pattern first Por favor, escriba un patrón de búsqueda primero - + Stop Detener - + Search has finished La búsqueda ha terminado - + Search has failed La búsqueda ha fallado - ShutdownConfirmDialog - - - Don't show again - No volver a mostrar - + ShutdownConfirmDlg - + qBittorrent will now exit. qBittorrent se cerrará ahora. - + E&xit Now &Salir ahora - + Exit confirmation Confirmar salida - + The computer is going to shutdown. El equipo se apagará. - + &Shutdown Now &Apagar ahora - - Shutdown confirmation - Confirmar al cerrar - - - + The computer is going to enter suspend mode. El equipo entrará en modo suspensión. - + &Suspend Now &Suspender Ahora - + Suspend confirmation Confirmar Suspensión - + The computer is going to enter hibernation mode. El equipo entrará en modo hibernación. - + &Hibernate Now &Hibernar Ahora - + Hibernate confirmation Confirmar Hibernación - + You can cancel the action within %1 seconds. Puedes cancelar la acción durante %1 segundos. + + + Shutdown confirmation + Confirmar al cerrar + SpeedLimitDialog - + KiB/s KiB/s @@ -7931,52 +7157,52 @@ SpeedPlotView - + Total Upload Subida total - + Total Download Descarga total - + Payload Upload Subida útil - + Payload Download Descarga útil - + Overhead Upload Subida exceso - + Overhead Download Descarga exceso - + DHT Upload Subida DHT - + DHT Download Descarga DHT - + Tracker Upload Subida tracker - + Tracker Download Descarga tracker @@ -7984,95 +7210,87 @@ SpeedWidget - + Period: Periodo: - + 1 Minute 1 minuto - + 5 Minutes 5 minutos - + 30 Minutes 30 minutos - + 6 Hours 6 horas - + Select Graphs Seleccionar gráficas - + Total Upload Subida total - + Total Download Descarga total - + Payload Upload Subida útil - + Payload Download Descarga útil - + Overhead Upload Subida exceso - + Overhead Download Descarga exceso - + DHT Upload Subida DHT - + DHT Download Descarga DHT - + Tracker Upload Subida tracker - + Tracker Download Descarga tracker - StacktraceDialog - - - Crash info - Información del problema - - - StatsDialog @@ -8085,49 +7303,49 @@ Estadísticas del usuario - - Cache statistics - Estadísticas de la caché + + Total peer connections: + Total de pares conectados: - - Read cache hits: - Uso de la caché de lectura: + + Global ratio: + Ratio global: - - Average time in queue: - Tiempo promedio en cola: + + Alltime download: + Total descargado: - - Connected peers: - Pares conectados: + + Alltime upload: + Total subido: - - All-time share ratio: - Ratio de comparticíon: + + Total waste (this session): + Desperdiciado (esta sesión): - - All-time download: - Total bajado: + + Cache statistics + Estadísticas de la caché - - Session waste: - Desperdicio de sesión: + + Read cache hits: + Uso de la caché de lectura: - - All-time upload: - Total subido: + + Average time in queue: + Tiempo promedio en cola: - Total buffer size: - Tamaño total del buffer: + Total buffers size: + Tamaño total de los buffers: @@ -8155,7 +7373,12 @@ Tamaño total de cola: - + + OK + Aceptar + + + %1 ms 18 milliseconds %1 ms @@ -8164,29 +7387,34 @@ StatusBar - + Connection status: Estado de la conexión: - + No direct connections. This may indicate network configuration problems. No hay conexiones directas. Esto puede indicar problemas en la configuración de red. - + DHT: %1 nodes DHT: %1 nodos - - qBittorrent needs to be restarted! + + qBittorrent needs to be restarted Es necesario reiniciar qBittorrent + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent ha sido actualizado y debe ser reiniciado para que los cambios sean efectivos. + + Connection Status: @@ -8203,991 +7431,716 @@ En línea - + Click to switch to alternative speed limits Click para cambiar a los límites de velocidad alternativos - + Click to switch to regular speed limits Click para cambiar a los límites de velocidad normales - + + Manual change of rate limits mode. The scheduler is disabled. + Cambio de límites en modo manual. El programador está deshabilitado. + + + Global Download Speed Limit Máxima velocidad global de descarga - + Global Upload Speed Limit Máxima velocidad global de subida - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter Todos (0) - + Downloading (0) Descargando (0) - + Seeding (0) Sembrando (0) - + Completed (0) Completados (0) - + Resumed (0) Reanudados (0) - + Paused (0) Pausados (0) - + Active (0) Activos (0) - + Inactive (0) Inactivos (0) - + Errored (0) Con errores (0) - + All (%1) Todos (%1) - + Downloading (%1) Descargando (%1) - + Seeding (%1) Sembrando (%1) - + Completed (%1) Completados (%1) - + Paused (%1) Pausados (%1) - + Resumed (%1) - Continuados (%1) + Reanudados (%1) - + Active (%1) Activos (%1) - + Inactive (%1) Inactivos (%1) - + Errored (%1) Con errores (%1) - TagFilterModel + TorrentContentModel - - Tags - Etiquetas + + Name + Nombre - - All - Todos + + Size + Tamaño - - Untagged - Sin etiquetar + + Progress + Progreso - - - TagFilterWidget - - Add tag... - Añadir etiqueta... + + Download Priority + Prioridad de descarga - - Remove tag - Eliminar etiqueta + + Remaining + Restante + + + TorrentCreatorDlg - - Remove unused tags - Eliminar etiquetas sin usar + + Select a folder to add to the torrent + Seleccione una carpeta para agregar al torrent - - Resume torrents - Reanudar torrents + + Select a file to add to the torrent + Seleccione un archivo para agregar al torrent - - Pause torrents - Pausar torrents + + No input path set + No se ha establecido la ruta de entrada - - Delete torrents - Eliminar torrents + + Please type an input path first + Por favor escriba primero una ruta de entrada - - New Tag - Nueva etiqueta + + Select destination torrent file + Seleccione el torrent de destino - - Tag: - Etiqueta: + + Torrent Files (*.torrent) + Archivos Torrent (*.torrent) - - Invalid tag name - Nombre de etiqueta no válido + + Torrent was created successfully: %1 + %1 is the path of the torrent + El torrent se creó correctamente: %1 - - Tag name '%1' is invalid - El nombre de la etiqueta '%1' no es válido + + + + Torrent creation + Crear nuevo torrent - - Tag exists - La etiqueta existe + + Torrent creation was unsuccessful, reason: %1 + La creación del torrent no ha fallado, razón: %1 - - Tag name already exists. - El nombre de la etiqueta ya existe. + + Created torrent file is invalid. It won't be added to download list. + El torrent creado no es válido. No se agregará a la lista de descargas. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Propiedades de las categorías de torrents + + Name + i.e: torrent name + Nombre - - Name: - Nombre: + + Size + i.e: torrent size + Tamaño - - Save path: - Ruta de destino: + + Done + % Done + Progreso - - Choose save path - Elegir ruta de destino + + Status + Torrent status (e.g. downloading, seeding, paused) + Estado - - New Category - Nueva categoría + + Seeds + i.e. full sources (often untranslated) + Semillas - - Invalid category name - Nombre de la categoría no válido + + Peers + i.e. partial sources (often untranslated) + Pares - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - El nombre de la categoría no debe contener '\' -El nombre de la categoría no debe contener '//' -El nombre de la categoría no debe comenzar o terminar con '/'. - + + Down Speed + i.e: Download speed + Vel. descarga - - Category creation error - Error al crear la categoría + + Up Speed + i.e: Upload speed + Vel. Subida - - Category with the given name already exists. -Please choose a different name and try again. - Ya existe una categoría con este nombre. -Por favor, elija otro nombre. + + Ratio + Share ratio + Ratio - - - TorrentContentModel - - Name - Nombre + + ETA + i.e: Estimated Time of Arrival / Time left + Tiempo Restante - - Size - Tamaño + + Category + Categoría - - Progress - Progreso + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Agregado - - Download Priority - Prioridad de descarga + + Completed On + Torrent was completed on 01/01/2010 08:00 + Completado - - Remaining - Restante + + Tracker + Tracker - - Availability - Disponibilidad + + Down Limit + i.e: Download limit + Límite descarga - - - TorrentCreatorDialog - - Torrent Creator - Crear torrent + + Up Limit + i.e: Upload limit + Límite Subida - - Select file/folder to share - Seleccionar archivo/carpeta a compartir + + Downloaded + Amount of data downloaded (e.g. in MB) + Descargado - - Path: - Ruta: + + Uploaded + Amount of data uploaded (e.g. in MB) + Subido - - [Drag and drop area] - [Área para arrastrar y soltar] + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Desc. Sesión - - - Select file - Seleccionar archivo + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Sub. Sesión - - - Select folder - Seleccionar carpeta + + Remaining + Amount of data left to download (e.g. in MB) + Restante - - Settings - Ajustes + + Time Active + Time (duration) the torrent is active (not paused) + Tiempo Activo - - Piece size: - Tamaño de la pieza: + + Save path + Torrent save path + Ruta Destino - - Auto - Auto + + Completed + Amount of data completed (e.g. in MB) + Completado - - 16 KiB - 16 KiB + + Ratio Limit + Upload share ratio limit + Límite de ratio - - 32 KiB - 32 KiB + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Visto Completo - - 64 KiB - 64 KiB + + Last Activity + Time passed since a chunk was downloaded/uploaded + Última Actividad - - 128 KiB - 128 KiB + + Total Size + i.e. Size including unwanted data + Tamaño Total + + + TrackerFiltersList - - 256 KiB - 256 KiB + + All (0) + this is for the tracker filter + Todos (0) - - 512 KiB - 512 KiB + + Trackerless (0) + Sin tracker (0) - - 1 MiB - 1 MiB + + Error (0) + Error (0) - - 2 MiB - 2 MiB + + Warning (0) + Advertencia (0) - - 4 MiB - 4 MiB - - - - 8 MiB - 8 MiB - - - - 16 MiB - 16 MiB - - - - 32 MiB - 32 MiB - - - - Calculate number of pieces: - Calcular el número de piezas: - - - - Private torrent (Won't distribute on DHT network) - Privado (no se distribuirá por la red DHT) - - - - Start seeding immediately - Comenzar la siembra inmediatamente - - - - Ignore share ratio limits for this torrent - Ignorar los límites de ratio para este torrent - - - - Optimize alignment - Optimizar alineación - - - - Fields - Campos - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - Puedes separar los grupos de trackers con una linea vacía. - - - - Web seed URLs: - URLs de las semillas Web: - - - - Tracker URLs: - Tracker URLs: - - - - Comments: - Comentarios: - - - - Source: - Origen: - - - - Progress: - Progreso: - - - - Create Torrent - Crear Torrent - - - - - - Torrent creation failed - Fallo al crear torrent - - - - Reason: Path to file/folder is not readable. - Razón: La ruta del archivo/carpeta no es legible. - - - - Select where to save the new torrent - Seleccione donde guardar el nuevo torrent - - - - Torrent Files (*.torrent) - Archivos Torrent (*.torrent) + + + Trackerless (%1) + Sin tracker (%1) - - Reason: %1 - Razón: %1 + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - Reason: Created torrent is invalid. It won't be added to download list. - Razón: El torrent creado no es válido. No se agregará a la lista de descargas. + + + Error (%1) + Error (%1) - - Torrent creator - Crear &Torrent + + + Warning (%1) + Advertencia (%1) - - Torrent created: - Torrent creado: + + Resume torrents + Reanudar torrents - - - TorrentInfo - - File size exceeds max limit %1 - El tamaño de archivo excede el límite máximo %1 + + Pause torrents + Pausar torrents - - Torrent file read error: %1 - Error de lectura del archivo Torrent: %1 + + Delete torrents + Eliminar torrents - - Torrent file read error: size mismatch - Error de lectura del archivo Torrent: el tamaño no coincide + + + All (%1) + this is for the tracker filter + Todos (%1) - TorrentsController + TrackerList - - Not contacted yet - Aún no contactado - - - - Updating... - Actualizando... - - - - Working - Trabajando - - - - Not working - No Funciona - - - - Error: '%1' is not a valid torrent file. - Error: '%1' no es un archivo torrent valido. - + + URL + URL - - - - - Torrent queueing must be enabled - Debe activar la cola de torrents + + Status + Estado - - Save path cannot be empty + + Received - - - Category cannot be empty - + + Seeds + Semillas - - Unable to create category - + + Peers + Pares - - Unable to edit category + + Downloaded - Save path is empty - Ruta de destino vacía - - - - Cannot make save path - No se puede crear la ruta de destino - - - - Cannot write to directory - No se puede escribir en el directorio - - - - WebUI Set location: moving "%1", from "%2" to "%3" - Establecer ubicación: moviendo "%1", de "%2" a "%3" - - - - Incorrect torrent name - Nombre del torrent incorrecto - - - - - Incorrect category name - Nombre de la categoría incorrecto - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - Todos (0) - - - - Trackerless (0) - Sin tracker (0) - - - - Error (0) - Error (0) - - - - Warning (0) - Advertencia (0) - - - - - Trackerless (%1) - Sin tracker (%1) - - - - - Error (%1) - Error (%1) - - - - - Warning (%1) - Advertencia (%1) - - - - Resume torrents - Continuar torrents - - - - Pause torrents - Pausar torrents - - - - Delete torrents - Eliminar torrents - - - - - All (%1) - this is for the tracker filter - Todos (%1) + + Message + Mensaje - - - TrackerListWidget - - + + Working Trabajando - + Disabled Deshabilitado - + This torrent is private Este torrent es privado - + Updating... Actualizando... - + Not working No funciona - + Not contacted yet - Aún no contactado + Todavía no contactado - - - - - - - N/A - N/A + + Tracker URL: + URL del tracker: - + Tracker editing Editando tracker - - Tracker URL: - URL del tracker: - - - - + + Tracker editing failed Falló la edición del tracker - + The tracker URL entered is invalid. La URL del tracker es inválida. - + The tracker URL already exists. La URL del tracker ya existe. - + Add a new tracker... Agregar nuevo tracker... - - Remove tracker - Eliminar tracker - - - + Copy tracker URL Copiar URL del tracker - + Edit selected tracker URL Editar el tracker seleccionado - + Force reannounce to selected trackers Forzar recomunicación con los trackers seleccionados - + Force reannounce to all trackers Forzar recomunicación con todos los trackers - - URL - URL - - - - Status - Estado - - - - Received - Recibido - - - - Seeds - Semillas - - - - Peers - Pares - - - - Downloaded - Descargado - - - - Message - Mensaje - - - - Column visibility - Visibilidad de columnas - - - - TrackerLoginDialog - - - - Tracker authentication - Autenticación del tracker - - - - Tracker: - Tracker: - - - - Login - Iniciar sesión - - - - Username: - Nombre de usuario: - - - - Password: - Contraseña: - - - - Log in - Conectar + + Remove tracker + Eliminar tracker - TrackersAdditionDialog + TrackersAdditionDlg - + Trackers addition dialog Diálogo para agregar trackers - + List of trackers to add (one per line): Lista de trackers a agregar (uno por línea): - - + + µTorrent compatible list URL: Lista de URL compatible con μTorrent: - + + I/O Error + Error de I/O + + + + Error while trying to open the downloaded file. + Error al intentar abrir el archivo descargado. + + + No change Sin cambios - + No additional trackers were found. No se encontró ningún tracker adicional. - + Download error Error de descarga - + The trackers list could not be downloaded, reason: %1 - La lista de Trackers no pudo ser descargada. Razón: %1 + La lista de trackers no pudo ser descargada. Razón: %1 TransferListDelegate - + Downloading Descargando - + Downloading metadata used when loading a magnet link Descargando metadatos - + Allocating qBittorrent is allocating the files on disk Reservando espacio - + Paused Pausado - + Queued i.e. torrent is queued En cola - + Seeding Torrent is complete and in upload-only mode Sembrando - + Stalled Torrent is waiting for download to begin Detenido - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] Descargando - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] Sembrando - + Checking Torrent local data is being checked Verificando - + Queued for checking i.e. torrent is queued for hash checking En cola para verificación - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - Comprobando datos de continuación + Verificando datos de reanudación - + Completed Completado - - Moving - Torrent local data are being moved/relocated - Moviendo - - - + Missing Files Faltan archivos - + Errored torrent status, the torrent has an error Con errores - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (sembrado durante %2) - + %1 ago e.g.: 1h 20m ago hace %1 @@ -9196,579 +8149,594 @@ TransferListFiltersWidget - + Status Estado - - Categories - Categorías - - - - Tags - Etiquetas - - - - Trackers - Trackers - - - - TransferListModel - - - Name - i.e: torrent name - Nombre - - - - Size - i.e: torrent size - Tamaño - - - - Done - % Done - Progreso - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Estado - - - - Seeds - i.e. full sources (often untranslated) - Semillas - - - - Peers - i.e. partial sources (often untranslated) - Pares - - - - Down Speed - i.e: Download speed - Vel. Bajada - - - - Up Speed - i.e: Upload speed - Vel. Subida - - - - Ratio - Share ratio - Ratio - - - - ETA - i.e: Estimated Time of Arrival / Time left - Tiempo Restante - - - - Category - Categoría - - - - Tags - Etiquetas - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - Añadido el - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - Completado - - - - Tracker - Tracker - - - - Down Limit - i.e: Download limit - Límite de bajada - - - - Up Limit - i.e: Upload limit - Límite de subida - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Bajado - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Subido - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - Desc. Sesión - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - Sub. Sesión - - - - Remaining - Amount of data left to download (e.g. in MB) - Restante - - - - Time Active - Time (duration) the torrent is active (not paused) - Tiempo Activo - - - - Save path - Torrent save path - Ruta de destino - - - - Completed - Amount of data completed (e.g. in MB) - Completado - - - - Ratio Limit - Upload share ratio limit - Limite de Ratio - - - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - Ultima vez visto completo - - - - Last Activity - Time passed since a chunk was downloaded/uploaded - Última Actividad + + Categories + Categorías - - Total Size - i.e. Size including unwanted data - Tamaño Total + + Trackers + Trackers TransferListWidget - + Column visibility Visibilidad de columnas - + Choose save path Seleccione una ruta de destino - + Torrent Download Speed Limiting Límite de velocidad de descarga del torrent - + Torrent Upload Speed Limiting Límite de velocidad de subida del torrent - + Recheck confirmation Confirmación de comprobación - + Are you sure you want to recheck the selected torrent(s)? ¿Esta seguro que desea comprobar los torrents seleccionados? - + Rename Renombrar - + New name: Nuevo nombre: - + Resume Resume/start the torrent - Continuar + Reanudar - + Force Resume Force Resume/start the torrent - Forzar continuación + Forzar reanudación - + Pause Pause the torrent Pausar - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Establecer ubicación: moviendo "%1", de "%2" a "%3" - - - - Add Tags - Añadir etiquetas - - - - Remove All Tags - Eliminar todas las etiquetas - - - - Remove all tags from selected torrents? - ¿Eliminar todas las etiquetas de los torrents seleccionados? + + New Category + Nueva categoría - - Comma-separated tags: - Etiquetas separadas por comas: + + Category: + Categoría: - - Invalid tag - Etiqueta no válida + + Invalid category name + Nombre de la categoría no válido - - Tag name: '%1' is invalid - El nombre de la etiqueta: '%1' no es válido + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + El nombre de la categoría no debe contener '\' +El nombre de la categoría no debe contener '//' +El nombre de la categoría no debe comenzar o terminar con '/'. + - + Delete Delete the torrent Eliminar - + Preview file... Previsualizar archivo... - + Limit share ratio... Límitar ratio de compartición... - + Limit upload rate... Tasa límite de subida... - + Limit download rate... Tasa límite de descarga... - + Open destination folder Abrir carpeta de destino - + Move up i.e. move up in the queue Mover arriba - + Move down i.e. Move down in the queue Mover abajo - + Move to top i.e. Move to top of the queue Mover al principio - + Move to bottom i.e. Move to bottom of the queue Mover al final - + Set location... Establecer destino... - - Force reannounce - Forzar recomunicación - - - + Copy name Copiar nombre - - Copy hash - Copiar hash - - - + Download first and last pieces first Descargar antes primeras y últimas partes - + Automatic Torrent Management Administración automática de torrents - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category El moto automático hace que varias propiedades del torrent (por ej: la ruta de guardado) sean decididas por la categoría asociada. - + Category Categoría - + New... New category... Nueva... - + Reset Reset category Descategorizar - - Tags - Etiquetas - - - - Add... - Add / assign multiple tags... - Añadir... - - - - Remove All - Remove all tags - Eliminar Todo - - - + Priority Prioridad - + Force recheck Forzar verificación de archivo - + Copy magnet link Copiar enlace magnet - + Super seeding mode Modo supersiembra - + Rename... Renombrar... - + Download in sequential order Descargar en orden secuencial - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting Límites de ratio de subida/descarga - - Use global share limit + + Use global ratio limit Usar límite de ratio global - - - + + + buttonGroup - + buttonGroup - - Set no share limit + + Set no ratio limit Sin límites de ratio - - Set share limit to + + Set ratio limit to Establecer límite de ratio en + + + WebApplication + + + Incorrect category name + Nombre de la categoría incorrecto + + + + WebUI + + + The Web UI is listening on port %1 + La interfaz Web está escuchando en el puerto %1 + + + + Web UI Error - Unable to bind Web UI to port %1 + Error de la interfaz de Usuario Web - No se puede enlazar al puerto %1 + + + + about + + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Un cliente BitTorrent avanzado programado en C++, basado en el toolkit Qt y en libtorrent-rasterbar. + - - ratio - ratio + + Copyright %1 2006-2016 The qBittorrent project + Copyright ©2006-2016 El proyecto qBittorrent - - minutes - minutos + + Home Page: + Página Web: - - No share limit method selected - No ha seleccionado un método para limitar el ratio + + Forum: + Foro: - - Please select a limit method first - Por favor primero selecione un método para limitar el ratio + + Bug Tracker: + Bug Tracker: - Utils::ForeignApps + addPeersDialog + + + Add Peers + Agregar pares + - - Python detected, version: %1 - Python detectado, versión: %1 + + List of peers to add (one per line): + Lista de pares a agregar (uno por línea): - - Python not detected - Python no detectado + + Format: IPv4:port / [IPv6]:port + Formato: IPv4:puerto / [IPv6]:puerto - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - Tipo de archivo no aceptable, solo se aceptan de tipo regular. + + + Tracker authentication + Autenticación del tracker - - Symlinks inside alternative UI folder are forbidden. - Los enlaces simbólicos dentro de la carpeta de la interfaz alternativa están prohibidos. + + Tracker: + Tracker: - - Exceeded the maximum allowed file size (%1)! - Ha excedido el máximo tamaño de archivo permitido (%1)! + + Login + Iniciar sesión - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - + + Username: + Usuario: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - + + Password: + Contraseña: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - + + Log in + Conectar - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - + + Cancel + Cancelar - WebUI + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + Confirmar borrado - qBittorrent + + + + Remember choice + Recordar siempre esta elección + + + + Also delete the files on the hard disk + Eliminar también los archivos del disco duro + + + + confirmShutdownDlg + + + Don't show again + No volver a mostrar + + + + createTorrentDialog + + + Cancel + Cancelar + + + + Torrent Creation Tool + Herramienta de creación de torrents + + + + Torrent file creation + Creación de un nuevo archivo torrent + + + + Add file + Nuevo archivo + + + + Add folder + Nueva carpeta + + + + File or folder to add to the torrent: + Archivo o carpeta a agregar al torrent: + + + + Tracker URLs: + Tracker URLs: + - - Web UI: HTTPS setup successful - interfaz de Usuario Web: conexión HTTPS exitosa + + Web seeds urls: + Semillas Web URLs: - - Web UI: HTTPS setup failed, fallback to HTTP - interfaz de Usuario Web: conexión HTTPS fallida, volviendo a HTTP + + Comment: + Comentario: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Puedes separar los grupos de trackers con una linea vacía. + + + + Piece size: + Tamaño de la pieza: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + Auto + + + + Private (won't be distributed on DHT network if enabled) + Privado (no se distribuirá por la red DHT si se marca) + + + + Start seeding after creation + Comenzar la siembra después de la creación + + + + Ignore share ratio limits for this torrent + Ignorar los límites de ratio para este torrent + + + + Create and save... + Crear y guardar... + + + + Progress: + Progreso: + + + + downloadFromURL + + + Add torrent links + Agregar enlace torrent + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Solo uno por línea (pueden ser enlaces HTTP, enlaces magnet o info-hashes) + + + + Download + Descargar + + + + Cancel + Cancelar + + + + Download from urls + Descargar de URLs + + + + No URL entered + No se ha introducido ninguna URL - - Web UI: Now listening on IP: %1, port: %2 - La interfaz Web está escuchando IP: %1, puerto %2 + + Please type at least one URL. + Por favor introduce al menos una URL. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Error de la interfaz de Usuario Web - No se puede enlazar la IP %1 Puerto %2 Razón %3 + + Crash info + Información del problema fsutils - + + + + + Downloads Descargas @@ -9776,100 +8744,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + Python no detectado + + + + Python version: %1 + Versión de Python: %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1h %2m - + %1d %2h e.g: 2days 10hours %1d %2h - + Unknown Unknown (size) Desconocido - + qBittorrent will shutdown the computer now because all downloads are complete. Todas las descargas se han completado. qBittorrent apagará el equipo ahora. - + < 1m < 1 minute <1m - + %1m e.g: 10minutes %1m + + + Working + Trabajando + + + + Updating... + Actualizando... + + + + Not working + No funciona + + + + Not contacted yet + Aún no contactado + preview - + Preview selection Previsualizar selección - + The following files support previewing, please select one of them: Los siguientes archivos pueden previzualizarse, por favor seleccione uno de ellos: + + + Preview + Previsualizar + + + + Cancel + Cancelar + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_eu.ts qbittorrent-3.3.15/src/lang/qbittorrent_eu.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_eu.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_eu.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent qBittorrent buruz - + About Honi buruz - + Author Egilea - - Current maintainer - Oraingo mantentzailea - - - - Greece - Grezia - - - - + + Nationality: Naziotasuna: - - + + + Name: + Izena: + + + + E-mail: Post@: - - - Name: - Izena: + + Greece + Grezia - - Original author - Jatorrizko egilea + + Current maintainer + Oraingo mantentzailea - - France - Frantzia + + Original author + Jatorrizko egilea - + Special Thanks Esker Bereziak - + Translators Itzultzaileak - - License - Baimena - - - + Libraries Liburutegiak - + qBittorrent was built with the following libraries: - qBittorrent hurrengo liburutegiekin eraiki da: - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - BitTorrent bezero aurreratua C++-rekin programatua, Qt toolkit-ean eta libtorrent-rasterbar-en ohinarrituta. + qBittorrent bertsio hau hurrengo liburutegiekin eraiki da: - - Copyright %1 2006-2018 The qBittorrent project - Copyrighta %1 2006-2018 qBittorrent egitasmoa - - - - Home Page: - Etxeko Orrialdea: - - - - Forum: - Eztabaidagunea: + + France + Frantzia - - Bug Tracker: - + + License + Baimena @@ -115,57 +90,67 @@ Gordeta - + + Browse... + Bilatu... + + + + Set as default save path + Ezarri berezko gordetze helburu bezala + + + Never show again Ez erakutsi berriro - + Torrent settings Torrent ezarpenak - + Set as default category Ezarri berezko kategoria bezala - + Category: Kategoria: - + Start torrent Hasi torrenta - + Torrent information Torrentaren argibideak - + Skip hash check Jauzi hash egiaztapena - + Size: Neurria: - + Hash: Hasha: - + Comment: Aipamena: - + Date: Eguna: @@ -190,117 +175,89 @@ Berezgaitasunezkoa - - Remember last used save path - Gogoratu erabilitako azken gordetze helburua - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog Hautatuz gero, .torrent agiria ez da ezabatuko "Jeisiera" orrialdeko aukerak elkarrizketak horrela adierazita ere. - + Do not delete .torrent file Ez ezabatu .torrent agiria - - Create subfolder - Sortu azpiagiritegia - - - - Download in sequential order - Jeitsi hurrenkera sekuentzialean - - - - Download first and last pieces first - Jeitsi lehen eta azken atalak lehenik - - - + Normal Arrunta - + High Handia - + Maximum Gehiena - + Do not download Ez jeitsi - - - + + + I/O Error S/I Akatsa - + Invalid torrent Torrent baliogabea - - Renaming - Gelditzen da - - - - - Rename error - Berrizendatze akatsa + + + + + Already in download list + Jadanik jeisketa zerrendan - - The name is empty or contains forbidden characters, please choose a different one. - Izena hutsik dago edo hizki galaraziak ditu, mesedez hautatu beste bat. - - - + Not Available This comment is unavailable Ez dago Eskuragarri - + Not Available This date is unavailable Ez dago Eskuragarri - + Not available Eskuraezina - + Invalid magnet link Magnet lotura baliogabea - + The torrent file '%1' does not exist. '%1' torrent agiria ez dago. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. '%1' torrent agiria ezin da irakurri diskatik. Zihurrenik ez duzu nahikoa baimen. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ Akatsa: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torrenta jadanik jeisketa zerrendan dago. Aztarnariak ezin dira batu torrent pribatu bat delako. + + + + Torrent is already in download list. Trackers were merged. + Torrenta jadanik jeisketa zerrendan dago. Aztarnariak batu dira. + + + + + Cannot add torrent + Ezin da torrenta gehitu + + + + Cannot add this torrent. Perhaps it is already in adding state. + Ezin da torrent hau gehitu. Badaiteke jadanik gehituta egoeran egotea. + + + This magnet link was not recognized Magnet lotura hau ez da ezagutu - + + Magnet link is already in download list. Trackers were merged. + Torrenta jadanik jeisketa zerrendan dago. Aztarnariak batu dira. + + + + Cannot add this torrent. Perhaps it is already in adding. + Ezin da torrent hau gehitu. Badaiteke jadanik gehituta egotea. + + + Magnet link Magnet lotura - + Retrieving metadata... Metadatuak eskuratzen... - + Not Available This size is unavailable. Ez dago Eskuragarri - + Free space on disk: %1 Diskako toki askea: %1 - + + Choose save path Hautatu gordetze helburua - - - - - - - Torrent is already present - Torrenta badago jadanik - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - '%1' torrenta jadanik eskualdaketa zerrendan dago. Aztarnariak ez dira batu torrent pribatu bat delako. + + Rename the file + Berrizendatu agiria - - Torrent '%1' is already in the transfer list. Trackers have been merged. - '%1' torrenta jadanik eskualdaketa zerrendan dago. Aztarnariak batu dira. - - - - Torrent is already queued for processing. - Torrenta jadanik prozesatzeko lerrokatuta dago - - - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - '%1' magnet lotura jadanik eskualdaketa zerrendan dago. Aztarnariak batu dira. + + New name: + Izen berria: - - Magnet link is already queued for processing. - Magnet lotura jadanik prozesatzeko lerrokatuta dago. + + + The file could not be renamed + Agiria ezin da berrizendatu - - New name: - Izen berria: + + This file name contains forbidden characters, please choose a different one. + Agiri honek hizki galaraziak ditu, mesedez hautatu beste bat. - - + + This name is already in use in this folder. Please use a different name. Izen hau jadanik erabilia da agiritegi honetan. Mesedez erabili beste bat. - + The folder could not be renamed Agiritegia ezin da berrizendatu - + Rename... Berrizendatu... - + Priority Lehentasuna - + Invalid metadata Metadatu baliogabeak - + Parsing metadata... Metadatuak aztertzen... - + Metadata retrieval complete Metadatu eskurapena osatuta - + Download Error Jeisketa Akatsa @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Diska idazketa katxe neurria + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Irteera atakak (Gutx) [0:Ezgaituta] - + Outgoing ports (Max) [0: Disabled] Irteera atakak (Geh) [0:Ezgaituta] - + Recheck torrents on completion Berregiaztatu torrentak osatutakoan - + Transfer list refresh interval Eskualdaketa zerrendaren berritze epea - + ms milliseconds sm - + Setting Ezarpena - + Value Value set for this setting Balioa - - - (disabled) - (ezgaituta) - - - + (auto) (berez) - - min - minutes - min - - - + All addresses Helbide guztiak - + qBittorrent Section qBittorrent Atala - - + + Open documentation Ireki agiritza - + libtorrent Section libtorrent Atala - - Asynchronous I/O threads - S/I hari asinkronoak - - - - Disk cache - Diska katxea - - - + s seconds seg - + Disk cache expiry interval Diska katxe muga tartea - + Enable OS cache Gaitu SE katxea - - Guided read cache - Gidatutako irakurketa katxea - - - - Coalesce reads & writes - Batu irakur eta idatzi - - - - Send upload piece suggestions - Bidali igoera atal iradokizunak - - - - - KiB - KiB - - - - Send buffer watermark - Bidali buffer urmarka - - - - Send buffer low watermark - Bidali buffer apal urmarka - - - - Send buffer watermark factor - Bidali buffer urmarka ezaugarria - - - - Prefer TCP - Hobetsi TCP - - - - Peer proportional (throttles TCP) - Hartzailekiko proporzionala (dohitua TCP) - - - - Allow multiple connections from the same IP address - Ahalbide elkarketa ugari IP helbide berdinetik + + m + minutes + m - + Resolve peer countries (GeoIP) Erabaki hartzaile herrialdeak (GeoIP) - + Resolve peer host names Erabaki hartzaile hostalari izenak - + Strict super seeding Gain emaritza zorrotza - + Network Interface (requires restart) Sare Interfazea (berrabiaraztea beharrezkoa) - + Optional IP Address to bind to (requires restart) IP Helbidea aztarnariei jakinarazteko (berrabiaraztea beharrezkoa) - + Listen on IPv6 address (requires restart) Aditu IPv6 helbidetan (beharrezkoa berrabiaraztea) - + Display notifications Erakutsi jakinarazpenak - + Display notifications for added torrents Erakutsi jakinarazpenak gehitutako torrententzat - + Download tracker's favicon - Jeitsi aztarnariaren ikurra - - - - Save path history length - Gordetze helburu historiaren luzera - - - - Fixed slots - Slot finkoak - - - - Upload rate based - Igoera maila ohinarrituz - - - - Upload slots behavior - Igoera sloten jokabidea - - - - Round-robin - Round-robin - - - - Fastest upload - Igoera azkarrena - - - - Anti-leech - Izain-aurkakoa - - - - Upload choking algorithm - Igoera choking algoritmoa + - + Confirm torrent recheck Baieztatu torrentaren berregiaztapena - - Confirm removal of all tags - Baieztatu etiketa guztiak kentzea + Exchange trackers with other peers + Aldatu aztarnariak beste hartzaileekin - - Always announce to all trackers in a tier - Betik iragarri maila bateko aztarnari guztietara + + Always announce to all trackers + Betik iragarri aztarnari guztietara - - Always announce to all tiers - Betik iragarri maila guztietara - - - + Any interface i.e. Any network interface Edozein interfaze - + Save resume data interval How often the fastresume file is saved. Gorde berregite datu tartea - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - %1-TCP algoritmo modu nahasia - - - + Maximum number of half-open connections [0: Unlimited] Gehienezko elkarketa erdi-ireki zenbatekoa [0: Mugagabe] - + IP Address to report to trackers (requires restart) IP Helbidea aztarnariei jakinarazteko (berrabiaraztea beharrezkoa) - + Enable embedded tracker Gaitu barneratutako aztarnaria - + Embedded tracker port Barneratutako aztarnari ataka - + Check for software updates Egiaztatu software eguneraketak - + Use system icon theme Erabili sistemaren ikur azalgaia @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 abiatuta - + Torrent: %1, running external program, command: %2 Torrenta: %1, kanpoko programa ekiten, agindua: %2 - - Torrent name: %1 - Torrentaren izena: %1 - - - - Torrent size: %1 - Torrentaren neurria: %1 - - - - Save path: %1 - Gordetze helburua: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Torrenta %1-ra jeitsi da. - - - - Thank you for using qBittorrent. - Mila esker qBittorrent erabiltzeagaitik. - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' jeitsiera amaitu da + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrenta: %1, kanpoko programa agindu luzeegia ekiten (luzera > %2), exekuzio hutsegitea. - + Torrent: %1, sending mail notification Torrenta: %1, post@ jakinarapena bidaltzen - + Information Argibideak - - To control qBittorrent, access the Web UI at %1 - qBittorrent agintzeko, sartu Web EI-ra hemen %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + qBittorrent agintzeko, sartu Web EI-ra, http://localhost:%1 - + The Web UI administrator user name is: %1 Web EI administrari erabiltzaile izena da: %1 - + The Web UI administrator password is still the default one: %1 Web EI adminstrari sarhitza berezkoa da: %1 - + This is a security risk, please consider changing your password from program preferences. Hau segurtasun arrisku bat da, mesedez kontuan izan zure sarhitza aldatzea programaren hobespenetan. - + Saving torrent progress... Torrent garapena gordetzen... - - - Portable mode and explicit profile directory options are mutually exclusive - Modu eramangarria eta profilaren zuzenbide esplizitoaren aukerek elkar baztertzen dute - - - - Portable mode implies relative fastresume - Modu eramangarriak berrekite-azkar erlatiboa dakar - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - WebAPI saio hasiera hutsegitea: Zergaitia: IP-a eragotzia izan da, IP: %1, erabiltzaile-izena: %2 - - - - Your IP address has been banned after too many failed authentication attempts. - Zure IP helbidea eragotzia izan da egiaztapen saiakera hutsegite askoren ondoren. - - - - WebAPI login success. IP: %1 - WebAPI saio hasiera ongi. IP-a: %1 - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Gorde hemen: @@ -861,837 +658,696 @@ RSS Jeistzailea - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - RSS torrent berez jeitsiera ezgaituta dago orain! Aplikazioaren ezarpenetan gaitu dezakezu. + + Enable Automated RSS Downloader + Gaitu berezgaitasunezko RSS Jeistzailea - + Download Rules Jeisketa Arauak - + Rule Definition Arau Adiera - + Use Regular Expressions Erabili Adierazpen Arruntak - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - Atal Adimentsu Iragazkiak atal zenbakia egiaztatuko du bikoiztuak jeistea saiheseko. -Sostengatutako heuskarriak: S01E01, 1x1, 2017.01.01 eta 01.01.2017 (Data heuskarriek - ere sostengatzen dute banantzaile bezala) - - - - Use Smart Episode Filter - Erabili Atal Iragazki Adimentsua: - - - + Must Contain: Izan behar du: - + Must Not Contain: Ez du izan behar: - + Episode Filter: Atal Iragazkia: - + Assign Category: Esleitu Kategoria: - + Save to a Different Directory Gorde Beste Zuzenbide batean - + Ignore Subsequent Matches for (0 to Disable) ... X days Ezikusi Hurrengo Bat-etortzeak honetarako (0 Ezgaitzeko) - + Disabled - Ezgaituta + Ezgaituta - + days egun - + Add Paused: Gehitu Pausatuta: - + Use global settings Erabili ezarpen orokorrak - + Always Betik - + Never Inoiz ez - + Apply Rule to Feeds: Ezarri Arauak Harpidetzei: - + Matching RSS Articles Bat datozen RSS Gaiak - + &Import... I&nportatu... - + &Export... E&sportatu... - + Matches articles based on episode filter. Atal iragazkian ohinarritutako artikulu bat-etortzeak. - + Example: Adibidea: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match bat-etorriko dira 2, 5, 8 -> 15, 30 bitartez eta bat denboraldiko hurrengo atalak - + Episode filter rules: Atal iragazki arauak: - + Season number is a mandatory non-zero value Denboraldi zenbakia ezin da huts balioa izan - + Episode number is a mandatory non-zero value + Atal zenbakia ezin da huts balioa izan + + + Filter must end with semicolon Iragazkia puntu eta kakotxaz amaitu behar da - + Three range types for episodes are supported: Hiru eremu mota sostengatzen dira atalentzat: - + Single number: <b>1x25;</b> matches episode 25 of season one Zenbaki soila: <b>1x25;</b> lehen denboraldiko 25. atala da - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Eremu arrunta: <b>1x25-40;</b> lehen denboraldiko 25 eta 40.-a arteko atalak dira - - Episode number is a mandatory positive value - Atal zenbakia balio positiboa izan behar da - - - - Rules - Arauak + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Eremu mugagabea: <b>1x25-;</b> lehen denboraldiko 25. atala eta aurreranzkoak dira - - Rules (legacy) - Arauak (ondorena) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Eremu mugagabea: <b>1x25-;</b> lehen denboraldiko 25. atala eta aurreranzkoak, eta ondorengo denboraldietako atal guztiak bat datoz + - + Last Match: %1 days ago Azken Bat-etortzea: duela %1 egun - + Last Match: Unknown Azken Bat-etortzea: Ezezaguna - + New rule name Arau izen berria - + Please type the name of the new download rule. Mesedez idatzi jeisketa arau berriaren izena. - - + + Rule name conflict Arau izen gatazka - - + + A rule with this name already exists, please choose another name. Jadanik badago izen hau duen arau bat, mesedez hautatu beste izen bat. - + Are you sure you want to remove the download rule named '%1'? Zihur zaude %1 izeneko jeisketa araua kentzea nahi duzula? - + Are you sure you want to remove the selected download rules? Zihur zaude hautatutako jeisketa arauak kentzea nahi dituzula? - + Rule deletion confirmation Arau ezabapen baieztapena - + Destination directory Helmuga zuzenbidea - + Invalid action Ekintza baliogabea - + The list is empty, there is nothing to export. Zerrenda hutsik dago, ez dago ezer esportatzeko. - - Export RSS rules - Esportatu RSS arauak + + Where would you like to save the list? + Non nahi duzu gordetzea zerrenda? - - + + Rules list (*.rssrules) + Arau zerrenda (*.rssrules) + + + I/O Error S/I Akatsa - - Failed to create the destination file. Reason: %1 - Hutsegitea helmuga agiria sortzerakoan. Zergaitia: %1 + + Failed to create the destination file + Hutsegitea helmuga agiria sortzerakoan - - Import RSS rules - Inportatu RSS arauak + + Please point to the RSS download rules file + Mesedez adierazi RSS jeisketa arau agiria - - Failed to open the file. Reason: %1 - Hutsegitea agiria irekitzerakoan. Zergaitia: %1 + + Rules list + Arau zerrenda - + Import Error - Inportatze Akatsa + Inportazio Akatsa - - Failed to import the selected rules file. Reason: %1 - Hutsegitea hautaturiko araua agiria inportatzerakoan. Zergaitia: %1 + + Failed to import the selected rules file + Hutsegitea hautatutako arau agiria inportatzerakoan - + Add new rule... Gehitu arau berria... - + Delete rule Ezabatu araua - + Rename rule... Berrizendatu araua... - + Delete selected rules Ezabatu hautatutako arauak - - Clear downloaded episodes... - Garbitu jeitsitako atalak... - - - + Rule renaming Arau berrizendapena - + Please type the new rule name Mesedez idatzi arau izen berria - - Clear downloaded episodes - Garbitu jeitsitako atalak - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - Zihur zaude hautatutako araurako jeitsitako atalen zerrenda garbitu nahi dituzula? - - - - Regex mode: use Perl-compatible regular expressions + + Regex mode: use Perl-like regular expressions Regex modua: erabili Perl-bezalako adierazpen arruntak - - - Position %1: %2 - Kokapena %1: %2 - - - + Wildcard mode: you can use - Ordezhizki modua: erabili ditzakezu + - + ? to match any single character - ? edozein hizki soil bat etortzeko + - + * to match zero or more of any characters - * edozein hizkiko zero edo gehiago bat etortzeko + - + Whitespaces count as AND operators (all words, any order) - Zuriuneak ETA aldagaia bezala zenbatzen da (hitz gutziak, edozein hurrenkera) + - + | is used as OR operator - | EDO aldagai bezala erabiltzen da + - + If word order is important use * instead of whitespace. - Hitz hurrenkera garrantzitsua bada erabili * zuriunearen ordez. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - %1 esaldi hutsa duen adierazpen bat (adib. %2) + - + will match all articles. - bat etorriko da artikulo guztiekin. + - + will exclude all articles. - artikulo guztiak baztertuko ditu. - - - - BanListOptionsDialog - - - List of banned IP addresses - Eragotzitako IP helbideen zerrenda - - - - Ban IP - Eragotzi IP-a - - - - Delete - Ezabatu - - - - - Warning - Kontuz + - - The entered IP address is invalid. - Sartutako IP-a baliogabea da. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Ordez-hizki modua: erabili dezakezu<ul><li>? hizkirri bakarrarekin berdintzeko</li><li>* huts edo gehiago edozein hizkirrirekin berdintzeko</li><li>Zuriuneak AND eragile bezala zenbatzen dira</li></ul> - - The entered IP is already banned. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Ordez-hizki modua: erabili dezakezu<ul><li>? hizkirri bakarrarekin berdintzeko</li><li>* huts edo gehiago edozein hizkirrirekin berdintzeko</li><li>| OR eragile bezala erabiltzen da</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support Berrabiaraztea beharrezkoa HaX sostengua aldatzeko - - Could not get GUID of configured network interface. Binding to IP %1 - Ezin da itxuratutako sare interfazearen GUID-a lortu. IP %1-ra lotzen - - - + Embedded Tracker [ON] Barneratutako Aztarnaria [BAI] - + Failed to start the embedded tracker! Hutsegitea barneratutako aztarnaria abiaraztean! - + Embedded Tracker [OFF] Barneratutako Aztarnaria [EZ] - - System network status changed to %1 - e.g: System network status changed to ONLINE + + '%1' reached the maximum ratio you set. Removing... + %1 ezarri duzun gehienezko maila erdietsita. Kentzen... + + + + '%1' reached the maximum ratio you set. Pausing... + %1 ezarri duzun gehienezko maila erdietsita. Pausatzen... + + + + System network status changed to %1 + e.g: System network status changed to ONLINE Sistemaren sare egoera %1-ra aldatu da - + ONLINE ONLINE - + OFFLINE LINEAZ-KANPO - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding %1-ren sare itxurapena aldatu egin da, saio lotura berritzen - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. Itxuratutako %1 sare interfaze helbidea ez da baliozkoa. - - + Encryption support [%1] - Enkriptaketa sostengua [%1] + - - + FORCED - BEHARTUTA - - - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 ez da baliozko IP helbide bat eta eragotzia izan da eragotzitako helbideen zerrenda ezarriz. + - - + Anonymous mode [%1] - Izengabe modua [%1] + - + Unable to decode '%1' torrent file. Ezinezkoa '%1' torrent agiria dekodeatzea. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' '%1' agiriaren jeisketa mugagabea '%2' torrentean barneratuta - + Queue positions were corrected in %1 resume files - Lerroko kokapenak %1 berrekite agiritan zuzendu dira + - + Couldn't save '%1.torrent' Ezinezkoa '%1.torrent' gordetzea - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' kendu egin da eskualdaketa zerrendatik. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' kendu egin da eskualdaketa zerrendatik eta diska gogorretik. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '%1' kendu eginda eskualdaketa zerrendatik baina agiriak ezin izan dira ezabatu. Akatsa: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. %1 ezgaituta dagoelako. - + because %1 is disabled. this peer was blocked because TCP is disabled. %1 ezgaituta dagoelako. - + URL seed lookup failed for URL: '%1', message: %2 Url emaritza bigizta hutsegitea url honetan: '%1', mezua: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent-ek huts egin du aditzean %1 interfazean, ataka: %2/%3. Zergaitia: %4 - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' eskualdaketa zerrendatik eta diska gogorretik kendu da. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' eskualdaketa zerrendatik kendu da. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... '%1' jeisten, mesedez itxaron... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent interfazearen edozein atakan aditzen saiatzen ari da: %1 - + The network interface defined is invalid: %1 Zehaztutako sare interfazea baliogabea da: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent aditzen saiatzen ari da %1 interfazean, ataka: %2 - - Peer ID: - Hartzaile ID-a: - - - - HTTP User-Agent is '%1' - HTTP Erabiltzaile-Ordezkaria da, '%1' - - - - + DHT support [%1] - DHT sostengua [%1] + - - - - - - - - - + + + + ON - BAI + - - - - - - - - - + + + + OFF - EZ + - - + Local Peer Discovery support [%1] - Tokiko Hartzaile Aurkikuntza sostengua [%1] - - - - PeX support [%1] - PeX sostengua [%1] - - - - '%1' reached the maximum ratio you set. Removed. - %1 ezarri duzun gehienezko maila erdietsi du. Kenduta. - - - - '%1' reached the maximum ratio you set. Paused. - %1 ezarri duzun gehienezko maila erdietsi du. Pausatuta... - - - - '%1' reached the maximum seeding time you set. Removed. - %1 ezarri duzun gehienezko emaritza denbora erdietsita. Kenduta. - - - - '%1' reached the maximum seeding time you set. Paused. - %1 ezarri duzun gehienezko emaritza denbora erdietsita. Pausatuta. + - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent-ek ez du %1 tokiko helbide bat aurkitu aditzeko - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent-ek huts egin du edozein interfaze atakan aditzerakoan: %1. Zergaitia: %2 - + Tracker '%1' was added to torrent '%2' '%1' aztarnaria '%2' torrentera gehitu da. - + Tracker '%1' was deleted from torrent '%2' '%1' aztarnaria '%2' torrentetik kendu da - + URL seed '%1' was added to torrent '%2' '%1' emaritza URL-a '%2' torrentera gehitu da - + URL seed '%1' was removed from torrent '%2' '%1' aztarnaria '%2' torrentetik kendu da - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Ezinezkoa %1 torrenta berrekitea. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Emandako IP iragazkia ongi aztertu da: %1 araua ezarri dira. - + Error: Failed to parse the provided IP filter. Akatsa: Hutsegitea emandako IP iragazkia aztertzerakoan. - - '%1' restored. - 'torrent name' restored. - '%1' leheneratuta. - - - + Couldn't add torrent. Reason: %1 Ezinezkoa torrenta gehitzea. Zergaitia: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' berrekinda. (berrekite azkarra) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' jeisketa zerrendara gehituta. - + An I/O error occurred, '%1' paused. %2 S/I akats bat gertatu da, '%1' pausatuta. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Ataka mapaketa hutsegitea, mezua: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Ataka mapaketa ongi burutu da, mezua: %1 - + due to IP filter. this peer was blocked due to ip filter. IP iragazkiagaitik. - + due to port filter. this peer was blocked due to port filter. ataka iragazkiagaitik. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. i2p modu nahasi murrizpenengaitik. - + because it has a low port. this peer was blocked because it has a low port. ataka apala delako. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent ongi aditzen ari da %1 interfazean, ataka: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 Kanpoko IP-a: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - hutsegitea torrent agiri berria sortzean - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - Jeitsi lehen eta azken atalak lehenik: %1, torrenta: '%2' - - - - On - Bai - - - - Off - Ez - - - - Successfully moved torrent: %1. New path: %2 - Torrenta ongi mugitu da: %1. Helburu berria: %2 - - - + Could not move torrent: '%1'. Reason: %2 - Ezin da torrenta mugitu: '%1'. Zergaitia: %2 + Ezinezkoa torrenta mugitzea: '%1'. Zergaitia: %2 - + File sizes mismatch for torrent '%1', pausing it. - Agiri neurriak ez datoz bat '%1' torrentarentzat, pausatzen. + Agiri neurriak ez datoz bat '%1' torrentarekin, pausatzen. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - Berrekite azkar datuak baztertuak izan dira '%1' torrentarentzat. Zergaitia %2. Berriro egiaztatzen... + Berrekite azkarreko datuak baztertuak izan dira '%1' torrentean. Zergaitia: %2. Berriro egiaztatzen... CategoryFilterModel - + Categories - Kategoriak + Kategoriak - + All - Guztiak + Denak - + Uncategorized - Kategoriagabea + @@ -1699,42 +1355,147 @@ Add category... - Gehitu kategoria... + Gehitu kategoria... Add subcategory... - Gehitu azpikategoria... + - Edit category... - Editatu kategoria... + Remove category + Kendu kategoria + + + + Remove unused categories + Kendu erabiligabeko kategoriak + + + + Resume torrents + Berrekin torrentak + + + + Pause torrents + Pausatu torrentak + + + + Delete torrents + Ezabatu torrentak + + + + New Category + Kategoria Berria + + + + Category: + Kategoria: + + + + Invalid category name + Kategoria izen baliogabea + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Kategoria izenak ezin du '\' izan. +Kategoria izenak ez da hasi/amaitu behar '/'-rekin. +Kategoria izenak ezin du '//' sekuentzia izan. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Denak (0) + + + Uncategorized (0) + Kategoriagabe (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Kategoriagabea (%1) + + + Add category... + Gehitu kategoria... - Remove category - Kendu kategoria + Kendu kategoria - Remove unused categories - Kendu erabiligabeko kategoriak + Kendu erabiligabeko kategoriak - Resume torrents - Berrekin torrentak + Berrekin torrentak - Pause torrents - Pausatu torrentak + Pausatu torrentak - Delete torrents - Ezabatu torrentak + Ezabatu torrentak + + + New Category + Kategoria Berria + + + Category: + Kategoria: + + + Invalid category name + Kategoria izen baliogabea + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Kategoria izenak ezin du '\' izan. +Kategoria izenak ez da hasi/amaitu behar '/'-rekin. +Kategoria izenak ezin du '//' sekuentzia izan. + + + All (%1) + this is for the category filter + Denak (%1) @@ -1774,106 +1535,58 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Ezabapen baieztapena - - - - Remember choice - Gogoratu aukera - + DeletionConfirmationDlg - - Also delete the files on the hard disk - Ezabatu agiriak diska gogorrean ere - - - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? Zihur zaude '%1' eskualdaketa zerrendatik ezabatzea nahi duzula? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? Zihur zaude %1 torrent hauek eskualdaketa zerrendatik ezabatzea nahi dituzula? - DownloadFromURLDialog - - - Download from URLs - Jeitsi URL-tatik - - - - Add torrent links - - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - Lotura bat lerroko (HTTP loturak, Magnet loturak eta info-hashak daude sostengatuta) - - - - Download - Jeitsi - - - - No URL entered - Ez da URL-rik sartu - - - - Please type at least one URL. - Mesedez idatzi URL bat gutxinez. - - - DownloadedPiecesBar - + White: Missing pieces Zuria: Ez dauden atalak - + Green: Partial pieces Orlegia: Zatizkako atalak - + Blue: Completed pieces Urdina: Osatutako atalak - ExecutionLogWidget + ExecutionLog - + General - Orokorra + Orokorra - + Blocked IPs - Blokeatutako IP-ak + Eragotzitako IP-ak - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - <font color='red'>%1</font> bloketatua izan da %2 + <font color='red'>%1</font> blokeatua izan da %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned <font color='red'>%1</font> eragotzia izan da @@ -1882,112 +1595,41 @@ FeedListWidget - + RSS feeds RSS harpidetzak - - - Unread (%1) - Irakurrigabe (%1) + + Unread + Irakurri gabeak FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. + + An error occured while trying to open the log file. Logging to file is disabled. Akats bat gertatu da ohar agiria irekitzen saiatzerakoan. Agirira oharreratzea ezgaituta dago. - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - &Bilatu... - - - - Choose a file - Caption for file open/save dialog - Hautatu agiri bat - - - - Choose a folder - Caption for directory open dialog - Hautatu agiritegi bat - - - - Any file - Edozein agiri - - - FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. + + + + I/O Error: Could not open ip filter file in read mode. S/I Akatsa: Ezin da ip iragazki agiria ireki irakurtzeko moduan. - - - - IP filter line %1 is malformed. - IP iragazkia %1 lerroan gaizkieratua dago. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - IP iragazkia %1 lerroan gaizkieratua dago. Mailaren IP hasiera gaizkieratua dago. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - %1 IP iragazki lerroa gaizkieratua dago. Mailaren IP amaiera gaizkieratua dago. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - %1 IP iragazki lerroa gaizkieratua dago. IP bat IPv4 da eta bestea IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - IP iragazki salbuespena %1 lerroarentzat. Salbuespena da: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - %1 estra IP iragazki azterketa akatsak gertatu dira. - - - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. Aztertze Akatsa: Iragazki agiria ez da baliozko PeerGuardian P2B agiria. @@ -1995,396 +1637,472 @@ GeoIPDatabase - - + + Unsupported database file size. Datubase agiri neurri sostengatu gabea. - + Metadata error: '%1' entry not found. Metadatu akatsa: '%1' sarrera ez da aurkitu. - + Metadata error: '%1' entry has invalid type. Metadatu akatsa: '%1' sarrera mota baliogabekoa da. - + Unsupported database version: %1.%2 Datubase bertsio sostengatu gabea: %1.%2 - + Unsupported IP version: %1 IP bertsio sostengatu gabea: %1 - + Unsupported record size: %1 Erregistro neurri sostengatu gabea: %1 - + Invalid database type: %1 Datubase mota baliogabea: %1 - + Database corrupted: no data section found. Datubasea hondatuta: ez da datu atalik aurkitu. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - Http eskabide neurriak muga gainditzen du, ahoa itxitzen. Muga: %ld, IP-a: %s + + File + Agiria - - Bad Http request, closing socket. IP: %s - Http eskabide gaitza, ahoa itxitzen. IP-a: %s + + Edit + Editatu - - - HttpServer - + + Help + Laguntza + + + Exit qBittorrent Irten qBittorrent-etik - + Only one link per line Lotura bakar bat lerroko - + + Download + Jeitsi + + + Global upload rate limit must be greater than 0 or disabled. Igoera neurri muga 0 baino handiagoa edo ezgaituta izan behar da. - + Global download rate limit must be greater than 0 or disabled. Jeisketa neurri muga 0 baino handiagoa edo ezgaituta izan behar da. - + Alternative upload rate limit must be greater than 0 or disabled. Aukerazko igoera neurri muga 0 baino handiagoa edo ezgaituta izan behar da. - + Alternative download rate limit must be greater than 0 or disabled. Aukerazko jeisketa neurri muga 0 baino handiagoa edo ezgaituta izan behar da. - + Maximum active downloads must be greater than -1. Gehienezko jeisketa eraginda -1 baino handiagoa izan behar da. - + Maximum active uploads must be greater than -1. Gehienezko igoera eraginda -1 baino handiagoa izan behar da. - + Maximum active torrents must be greater than -1. Gehienezko torrent eraginda -1 baino handiagoa izan behar da. - + Maximum number of connections limit must be greater than 0 or disabled. Gehienezko elkarketa zenbateko muga 0 baino handiagoa edo ezgaituta izan behar da. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Gehienezko elkarketa zenbatekoa torrent bakoitzeko muga 0 baino handiagoa edo ezgaituta izan behar da. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Gehienezko igoera aho zenbatekoa torrent bakoitzeko muga 0 baino handiagoa edo ezgaituta izan behar da. - + Unable to save program preferences, qBittorrent is probably unreachable. Ezinezkoa programa hobespenak gordetzea, qBittorrent zihurrenik erdietsiezina da. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent Freenode-an - - - - Invalid category name: -Please do not use any special characters in the category name. - Kategoria izen baliogabea: -Mesedez ez erabili hizki berezirik kategoriaren izenean. + + Language + Hizkuntza - - Unknown - Ezezaguna + + The port used for incoming connections must be between 1 and 65535. + Barrurako elkarketetarako erabilitzeko ataka 1 eta 65535 artekoa izan behar da. - - Hard Disk - Diska Gogorra - - - - Share ratio limit must be between 0 and 9998. - Elkarbanatze maila muga 0 eta 9998 artekoa izan behar da. - - - - Seeding time limit must be between 0 and 525600 minutes. - Emaritza denbora muga 0 eta 525600 minutu artekoa izan behar da. - - - - The port used for incoming connections must be between 1 and 65535. - Barrurako elkarketetarako erabilitzeko ataka 1 eta 65535 artekoa izan behar da. - - - + The port used for the Web UI must be between 1 and 65535. Web EI-ak erabiltzeko ataka 1024 eta 65535 artekoa izan behar da. - + Unable to log in, qBittorrent is probably unreachable. Ezinezkoa saioa hastea, qBittorrent zihurrenik eskuraezina dago. - + Invalid Username or Password. Erabiltzaile-izen edo Sarhitz baliogabea. - - Username - Erabiltzaile-izena - - - + Password Sarhitza - + Login Hasi Saioa - + + Upload Failed! + Igoera Hutsegitea! + + + Original authors Jatorrizko egileak - + + Upload limit: + Igoera muga: + + + + Download limit: + Jeisketa muga: + + + Apply Ezarri - + Add Gehitu - + + Category: + Kategoria: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Igo Torrentak - + + All + Denak + + + + Downloading + Jeisten + + + + Seeding + Emaritzan + + + + Completed + Osatuta + + + + Resumed + Berrekin + + + + Paused + Pausatuta + + + + Active + Ekinean + + + + Inactive + Jardungabe + + + Save files to location: Gorde agiriak kokaleku honetan: - + Cookie: Cookiea: - + Type folder here Idatzi agiritegia hemen - + + Run an external program on torrent completion + Ekin kanpoko programa batean torrenta osatutakoan + + + + Enable bandwidth management (uTP) + Gaitu bandazabalera kudeaketa (uTP) + + + + Apply rate limit to uTP connections + Ezarri neurri muga uTP elkarketei + + + + Alternative Global Rate Limits + Aukerazko Neurri Muga Orokorrak + + + More information Argibide gehiago - + Information about certificates Egiaztagiriei buruzko argibideak - + Save Files to Gorde Agiriak honela - - Set location - Ezarri kokalekua - - - - Limit upload rate - Mugatu igoera neurria + + Watch Folder + Begiratutako Agiritegia - - Limit download rate - Mugatu jeisketa neurria + + Default Folder + Berezko Agiritegia - - Rename torrent - Berrizendatu torrenta + + from + from time1 to time2 + hemendik - - Unable to create category - + + to + from time1 to time2 + hona - + Other... Save Files to: Watch Folder / Default Folder / Other... Besterik... - + + Every day + Schedule the use of alternative rate limits on ... + Egunero + + + + Week days + Schedule the use of alternative rate limits on ... + Asteko egunetan + + + + Week ends + Schedule the use of alternative rate limits on ... + Asteburuetan + + + Monday Schedule the use of alternative rate limits on ... Astelehena - + Tuesday Schedule the use of alternative rate limits on ... Asteartea - + Wednesday Schedule the use of alternative rate limits on ... Asteazkena - + Thursday Schedule the use of alternative rate limits on ... Osteguna - + Friday Schedule the use of alternative rate limits on ... Ostirala - + Saturday Schedule the use of alternative rate limits on ... Larunbata - + Sunday Schedule the use of alternative rate limits on ... Igandea - + + Downloaded + Is the file downloaded or not? + Jeitsita + + + Logout Amaitu saioa - + + Download from URLs + Jeitsi URL-tatik + + + Download Torrents from their URLs or Magnet links Jeitsi Torrentak beren URL edo Magnet loturatik - + Upload local torrent Igo tokiko torrenta - + Are you sure you want to delete the selected torrents from the transfer list? Zihur zaude hautaturiko torrentak ezabatzea nahi dituzula eskualdaketa zerrendatik? - + Save Gorde - + qBittorrent client is not reachable qBittorrent bezeroa erdietsiezina da - - qBittorrent has been shutdown. - qBittorrent itzali egin da. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Zerrenda-zuriko IP azpisare zerrenda + + HTTP Server + HTTP Zerbitzaria - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Adibidea: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Hurrengo parametroak sostengatzen dira: - - Add subnet - Gehitu azpisarea + + Torrent path + Torrentaren helburua - - Delete - Ezabatu + + Torrent name + Torrentaren izena - - Error - Akatsa + + qBittorrent has been shutdown. + qBittorrent itzali egin da. + + + LineEdit - - The entered subnet is invalid. - Sartutako azpisarea baliogabea da. + + Clear the text + Garbitu idazkia LogListWidget - + Copy Kopiatu - + Clear Garbitu @@ -2417,551 +2135,493 @@ &Burututako Jeisketetan - + &View &Ikusi - + &Options... A&ukerak... - + &Resume &Berrekin - + Torrent &Creator Torrent &Sortzailea - + Set Upload Limit... Ezarri Igoera Muga... - + Set Download Limit... Ezarri Jeisketa Muga... - + Set Global Download Limit... Ezarri Jeisketa Muga Orokorra... - + Set Global Upload Limit... Ezarri Igoera Muga Orokorra... - + Minimum Priority Lehentasun Gutxiena - + Top Priority Lehentasun Gehiena - + Decrease Priority Gutxitu Lehentasuna - + Increase Priority Handitu Lehentasuna - - + + Alternative Speed Limits Aukerazko Abiadura Mugak - + &Top Toolbar Goiko &Tresnabarra - + Display Top Toolbar Erakutsi Goiko Tresnabarra - - Status &Bar - Egoera &Barra - - - + S&peed in Title Bar &Abiadura Izenaren Barran - + Show Transfer Speed in Title Bar Erakutsi Eskualdaketa Abiadura Izenaren Barran - + &RSS Reader &RSS Irakurlea - + Search &Engine Bilaketa &Gailua - + L&ock qBittorrent &Blokeatu qBittorrent - + Do&nate! E&man Dirulaguntza! - - Close Window - Itxi Leihoa - - - + R&esume All Berrekin &Denak - + Manage Cookies... Kudeatu Cookieak... - + Manage stored network cookies Kudeatu biltegiratutako sare cookieak - + Normal Messages Mezu Arruntak - + Information Messages Argibide Mezuak - + Warning Messages Kontuz Mezuak - + Critical Messages Larrialdi Mezuak - + &Log &Oharra - + &Exit qBittorrent I&rten qBittorrent-etik - + &Suspend System &Egoneratu Sistema - + &Hibernate System &Neguratu Sistema - + S&hutdown System &Itzali Sistema - + &Disabled E&zgaituta - + &Statistics E&statistikak - + Check for Updates Egiaztatu Eguneraketarik dagoen - + Check for Program Updates Egiaztatu Programaren Eguneraketarik dagoen - + &About &Honi buruz - + &Pause &Pausatu - + &Delete &Ezabatu - + P&ause All P&asatu Denak - + &Add Torrent File... Gehitu Torrent &Agiria... - + Open Ireki - + E&xit I&rten - + Open URL Ireki URL-a - + &Documentation &Agiritza - + Lock Blokeatu - - - + + + Show Erakutsi - + Check for program updates Egiaztatu programaren eguneraketak - + Add Torrent &Link... Gehitu Torrent &Lotura... - + If you like qBittorrent, please donate! qBittorrent gogoko baduzu, mesedez eman dirulaguntza! - - + Execution Log Ekintza Oharra - + Clear the password Garbitu sarhitza - + Filter torrent list... Iragazi torrent zerrenda... - + &Set Password Ezarri &Sarhitza - - Preferences - Hobespenak - - - + &Clear Password &Garbitu Sarhitza - + Transfers Eskualdaketak - - - qBittorrent is minimized to tray - qBittorrent erretilura txikiendu da - - - - - - This behavior can be changed in the settings. You won't be reminded again. - Jokabide hau ezarpenetan aldatu daiteke. Ez zaizu berriro gogoratuko. - - - + Torrent file association Torrent agiri elkarketa - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent ez da berezko aplikazioa torrent agiriak edo Magnet loturak irekitzeko. Nahi duzu qBittorrent elkartzea torrent agiriekin eta Magnet loturekin? - + Icons Only Ikurrak Bakarrik - + Text Only Idazkia Bakarrik - + Text Alongside Icons Idazkia Ikurren Alboan - + Text Under Icons Idazkia Ikurren Azpian - + Follow System Style Jarraitu Sistemaren Estiloa - - - + + + UI lock password EI blokeatze sarhitza - - - + + + Please type the UI lock password: Mesedez idatzi EI blokeatze sarhitza: - + The password should contain at least 3 characters Sarhitzak 3 hizkirri izan behar ditu gutxienez - + Password update Sarhitz eguneraketa - + The UI lock password has been successfully updated EI blokeatze sarhitza ongi eguneratu da - + Are you sure you want to clear the password? Zihur zaude sarhitza garbitzea nahi duzula? - - Use regular expressions - Erabili adierazpen arruntak - - - + Search Bilatu - + Transfers (%1) Eskualdaketak (%1) - + Error Akatsa - + Failed to add torrent: %1 Hutsegitea torrenta gehitzerakoan: %1 - + Torrent added Torrenta gehituta - + '%1' was added. e.g: xxx.avi was added. '%1' gehituta. - + Download completion Jeisketa osaketa - + I/O Error i.e: Input/Output Error S/I Akatsa - + Recursive download confirmation Jeisketa mugagabearen baieztapena - + Yes Bai - + No Ez - + Never Inoiz ez - + Global Upload Speed Limit Igoera Abiadura Muga Orokorra - + Global Download Speed Limit Jeisketa Abiadura Muga Orokorra - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent eguneratua izan da eta berrabiarazpena behar du aldaketek eragina izateko. - - - - qBittorrent is closed to tray - qBittorrent erretilura itxi da - - - - Some files are currently transferring. - Zenbait agiri eskualdatzen ari dira une honetan. - - - - Are you sure you want to quit qBittorrent? - Zihur zaude qBittorrent uztea nahi duzula? - - - + &No &Ez - + &Yes &Bai - + &Always Yes & Betik Bai - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - Ezin da zure Python bertsioa zehaztu. Bilaketa gailua ezgaituta. - - - + Old Python Interpreter Python Interpretea zaharra - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. Zure Python bertsioa (%1) zaharkitua dago. Mesedez eguneratu azken bertsiora bilaketa gailuek lan egin ahal izateko. Beharrezko gutxiena: 2.7.9/3.3.0. - + qBittorrent Update Available qBittorrent Eguneraketa Eskuragarri - + + A new version is available. +Do you want to download %1? + Bertsio berri bat eskuragarri dago. +Nahi duzu %1 jeistea? + + + Already Using the Latest qBittorrent Version Jadanik Azken qBittorrent Bertsioa Erabiltzen - + Undetermined Python version Python bertsioa zehaztugabea - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. '%1'-k amaitu du jeisketa. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2970,158 +2630,154 @@ Zergaitia: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? '%1' torrentak torrent agiriak ditu, beren jeisketa burutzea nahi duzu? - + Couldn't download file at URL '%1', reason: %2. Ezinezkoa agiria jeistea URL-tik: '%1', zergaitia: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - Python aurkitu da hemen: %1: %2 + - - + + Couldn't determine your Python version (%1). Search engine disabled. + Ezin da zure Python bertsioa (%1) zehaztu. Bilaketa gailua ezgaituta. + + + + Missing Python Interpreter Ez dago Python Interpretea - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Python beharrezkoa da bilaketa gailua erabiltzeko baina ez dirudi ezarrita dagoenik. Orain ezartzea nahi duzu? - + Python is required to use the search engine but it does not seem to be installed. Python beharrezkoa da bilaketa gailua erabiltzeko baina ez dirudi ezarrita dagoenik. - - A new version is available. - Bertsio berri bat eskuragarri - - - - Do you want to download %1? - Nahi duzu %1 jeistea? - - - - Open changelog... - Ireki aldaketa-oharra.. - - - + No updates available. You are already using the latest version. Ez dago eguneraketarik eskuragarri. Jadanik azken bertsioa ari zara erabiltzen. - + &Check for Updates &Egiaztatu Eguneraketak - + Checking for Updates... Eguneraketak Egiaztatzen.. - + Already checking for program updates in the background Jadanik programaren eguneraketa egiaztatzen barrenean - + Python found in '%1' Python aurkitu da hemen: '%1' - + Download error Jeisketa akatsa - + Python setup could not be downloaded, reason: %1. Please install it manually. Python ezartzailea ezin da jeitsi, zergaitia: %1. Mesedez ezarri eskuz. - - + + Invalid password Sarhitz baliogabea - - - + + RSS (%1) RSS (%1) - + URL download error URL jeisketa akatsa - + The password is invalid Sarhitza baliogabea da - - + + DL speed: %1 e.g: Download speed: 10 KiB/s JE abiadura: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s IG abiadura: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [J: %1, I: %2] qBittorrent %3 - + Hide Ezkutatu - + Exiting qBittorrent qBittorrentetik irtetzen - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Agiri batzuk orain eskualdatzen daude. +Zihur zaude qBittorrent uztea nahi duzula? + + + Open Torrent Files Ireki Torrent Agiriak - + Torrent Files Torrent Agiriak - + Options were saved successfully. Aukerak ongi gorde dira. @@ -3129,52 +2785,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. Zure DNS dinamikoa ongi eguneratu da. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. DNS dinamiko akatsa: Zerbitzua aldibatez eskuraezina da, berriro saiatuko da 30 minutu barru. - + Dynamic DNS error: hostname supplied does not exist under specified account. DNS dinamiko akatsa: Emandako hostalari-izena ez dago adierazitako kontuan. - + Dynamic DNS error: Invalid username/password. DNS dinamiko akatsa: Erabiltzaile-izen/sarhitz baliogabea. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. DNS dinamiko akatsa: qBittorrent zerbitzuaren zerrenda-beltzean dago, mesedez jakinarazi matxura http://bugs.qbittorrent.org helbidean. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. DNS dinamiko akatsa: %1 itzuli du zerbitzuak, mesedez jakinarazi matxura http://bugs.qbittorrent.org helbidean. - + Dynamic DNS error: Your username was blocked due to abuse. DNS dinamiko akatsa: Zure erabiltzaile-izena blokeatua izan da gehiegikeriagaitik. - + Dynamic DNS error: supplied domain name is invalid. DNS dinamiko akatsa: Emandako domeinu izena baliogabea da. - + Dynamic DNS error: supplied username is too short. DNS dinamiko akatsa: Emandako erabiltzaile-izena laburregia da. - + Dynamic DNS error: supplied password is too short. DNS dinamiko akatsa: Emandako sarhitza laburregia da. @@ -3182,1413 +2838,1303 @@ Net::DownloadHandler - + I/O Error S/I Akatsa - + The file size is %1. It exceeds the download limit of %2. Agiriaren neurria %1 da. %2 jeisketa muga gainditzen du. - + Unexpected redirect to magnet URI. Ustekabeko berzuzentzea magnet URI-ra. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - Hurruneko hostalari izena ez da aurkitu (hostalari-izen baliogabea) + + + GeoIP database loaded. Type: %1. Build time: %2. + GeoIP datubasea gertatuta. Mota: %1. Eraiketa eguna: %2. - - The operation was canceled - Eragiketa ezeztatua izan da + + + Couldn't load GeoIP database. Reason: %1 + Ezin da GeoIP datubasea gertatu. Zergaitia: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - Hurruneko zerbitzariak elkarketa azkarregi itxi du, erantzuna osorik jaso eta prozesatu aurretik + + Venezuela, Bolivarian Republic of + Venezuela, Bolibariar Herkalderria - - The connection to the remote server timed out - Hurruneko zerbitzariarekiko elkarketa denboraz kanpo + + Viet Nam + Vietnam - - SSL/TLS handshake failed - SLL/TLS eskuemate hutsegitea + + + N/A + E/G - - The remote server refused the connection - Hurruneko zerbitzariak elkarketa baztertu du - - - - The connection to the proxy server was refused - Proxy zerbitzariarekiko elkarketa baztertua izan da - - - - The proxy server closed the connection prematurely - Proxy zerbitzariak elkarketa azkarregi itxi du - - - - The proxy host name was not found - Proxy hostalari izena ez da aurkitu - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - Proxyarekiko elkarketa denboraz kanpo edo proxyak ez dio garaiz erantzun bidalitako eskabideari - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - Proxyak egiaztapena behar du eskabidea burutzeko baina ez du onartu eskainitako nortasunik - - - - The access to the remote content was denied (401) - Hurruneko edukirako sarbidea ukatua izan da (401) - - - - The operation requested on the remote content is not permitted - Hurruneko edukian eskatutako eragiketa ez dago baimenduta - - - - The remote content was not found at the server (404) - Hurruneko edukia ez da aurkitu zerbitzarian (404) - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - Hurruneko zerbitzariak egiaztapena behar du edukia zerbitzatzeko baina ez du onartu emandako nortasunik - - - - The Network Access API cannot honor the request because the protocol is not known - Sare Sarbide API-k ezin du eskabidea burutu protokoloa ez delako ezaguna - - - - The requested operation is invalid for this protocol - Eskatutako eragiketa baliogabea da protokolo honentzat - - - - An unknown network-related error was detected - Sareari-buruzko akats ezezagun bat atzeman da - - - - An unknown proxy-related error was detected - Proxyari-buruzko akats ezezagun bat atzeman da - - - - An unknown error related to the remote content was detected - Hurruneko edukiari buruzko akats ezezagun bat atzeman da - - - - A breakdown in protocol was detected - Protokolo matxura bat atzeman da - - - - Unknown error - Akats ezezaguna - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - GeoIP datubasea gertatuta. Mota: %1. Eraiketa eguna: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - Ezin da GeoIP datubasea gertatu. Zergaitia: %1 - - - - Venezuela, Bolivarian Republic of - Venezuela, Bolibariar Herkalderria - - - - Viet Nam - Vietnam - - - - - N/A - E/G - - - + Andorra Andorra - + United Arab Emirates Arabiar Emirrerri Batuak - + Afghanistan Afganistan - + Antigua and Barbuda Antigua eta Barbuda - + Anguilla Angila - + Albania Albania - + Armenia Armenia - + Angola Angola - + Antarctica Antartika - + Argentina Argentina - + American Samoa Amerikar Samoa - + Austria Austria - + Australia Australia - + Aruba Aruba - + Azerbaijan Azerbaijan - + Bosnia and Herzegovina Bosnia eta Herzegovina - + Barbados Barbados - + Bangladesh Bangladesh - + Belgium Belgika - + Burkina Faso Burkina Faso - + Bulgaria Bulgaria - + Bahrain Bahrain - + Burundi Burundi - + Benin Benin - + Bermuda Bermuda - + Brunei Darussalam Brunei Darussalam - + Brazil Brazil - + Bahamas Bahamak - + Bhutan Butan - + Bouvet Island Bouvet Uhartea - + Botswana Botswana - + Belarus Belaerrusia - + Belize Belize - + Canada Kanada - + Cocos (Keeling) Islands Cocos (Keeling) Uharteak - + Congo, The Democratic Republic of the Kongoa, Herriaginte Herkalderria - + Central African Republic Ertafrikako Herkalderria - + Congo Kongoa - + Switzerland Suitza - + Cook Islands Cook Uharteak - + Chile Txile - + Cameroon Kamerun - + China Txina - + Colombia Colombia - + Costa Rica Costa Rica - + Cuba Kuba - + Cape Verde Lurmutur Berdea - + Curacao Curacao - + Christmas Island Christmas Uhartea - + Cyprus Zipre - + Czech Republic Txekiar Herkalderria - + Germany Alemania - + Djibouti Djibouti - + Denmark Danimarka - + Dominica Dominika - + Dominican Republic Dominikar Herkalderria - + Algeria Aljeria - + Ecuador Ekuador - + Estonia Estonia - + Egypt Egipto - + Western Sahara Sahara Mendebaldea - + Eritrea Eritrea - + Spain Espainia - + Ethiopia Etiopia - + Finland Finlandia - + Fiji Fiji - + Falkland Islands (Malvinas) Malvina Uharteak - + Micronesia, Federated States of Mikronesia, Estatu Federatuak - + Faroe Islands Faroe Uharteak - + France Frantzia - + Gabon Gabon - + United Kingdom Erresuma Batua - + Grenada Granada - + Georgia Georgia - + French Guiana Frantziar Guiana - + Ghana Ghana - + Gibraltar Gibraltar - + Greenland Groenlandia - + Gambia Gambia - + Guinea Ginea - + Guadeloupe Guadalupe - + Equatorial Guinea Ekuatore Ginea - + Greece Grezia - + South Georgia and the South Sandwich Islands Hego Georgia eta Hego Sandwich Uharteak - + Guatemala Guatemala - + Guam Guam - + Guinea-Bissau Ginea-Bissau - + Guyana Guyana - + Hong Kong Hong Kong - + Heard Island and McDonald Islands Heard Uhartea McDonald Uharteak - + Honduras Honduras - + Croatia Kroazia - + Haiti Haiti - + Hungary Hungaria - + Indonesia Indonesia - + Ireland Irlanda - + Israel Israel - + India India - + British Indian Ocean Territory Britainiar Indiatako Itsasoko Lurraldea - + Iraq Irak - + Iran, Islamic Republic of Iran, Islamiar Herkalderria - + Iceland Islandia - + Italy Italia - + Jamaica Jamaika - + Jordan Jordania - + Japan Japonia - + Kenya Kenia - + Kyrgyzstan Kyrgyzstan - + Cambodia Kanbodia - + Kiribati Kiribati - + Comoros Comoros - + Saint Kitts and Nevis Saint Kitts eta Nevis - + Korea, Democratic People's Republic of Korea, Herriagintezko Herriaren Herkalderria - + Korea, Republic of Korea, Herkalderria - + Kuwait Kuwait - + Cayman Islands Kaiman Uharteak - + Kazakhstan Kazakhstan - + Lao People's Democratic Republic Laoseko Herriaren Herriagintezko Herkalderria - + Lebanon Libanoa - + Saint Lucia Santa Luzia - + Liechtenstein Liechtenstein - + Sri Lanka Sri Lanka - + Liberia Liberia - + Lesotho Lesotho - + Lithuania Lituania - + Luxembourg Luxenburgo - + Latvia Letonia - + Morocco Maroko - + Monaco Monako - + Moldova, Republic of Moldavia, Herkalderria - + Madagascar Madagaskar - + Marshall Islands Marshall Uharteak - + Mali Mali - + Myanmar Myanmar - + Mongolia Mongolia - + Northern Mariana Islands Iparraldeko Mariana Uharteak - + Martinique Martinika - + Mauritania Mauritania - + Montserrat Montserrat - + Malta Malta - + Mauritius Maurizio - + Maldives Maldivak - + Malawi Malawi - + Mexico Mexiko - + Malaysia Malaisia - + Mozambique Mozanbike - + Namibia Namibia - + New Caledonia Kaledonia Berria - + Niger Niger - + Norfolk Island Norfolk Uhartea - + Nigeria Nigeria - + Nicaragua Nicaragua - + Netherlands Herbehereak - + Norway Norbegia - + Nepal Nepal - + Nauru Nauru - + Niue Niue - + New Zealand Zeelanda Berria - + Oman Oman - + Panama Panama - + Peru Peruq - + French Polynesia Frantziar Polinesia - + Papua New Guinea Papua Ginea Berria - + Philippines Filipinak - + Pakistan Pakistan - + Poland Polonia - + Saint Pierre and Miquelon Saint Pierre eta Mikelon - + Puerto Rico Puerto Rico - + Portugal Portugal - + Palau Palau - + Paraguay Paraguay - + Qatar Katar - + Reunion Reunion - + Romania Errumania - + Russian Federation Errusiar Federazioa - + Rwanda Ruanda - + Saudi Arabia Saudi Arabia - + Solomon Islands Solomon Uharteak - + Seychelles Seychelles - + Sudan Sudan - + Sweden Suedia - + Singapore Singapur - + Slovenia Eslobenia - + Svalbard and Jan Mayen Svalbard eta Jan Mayen - + Slovakia Eslobakia - + Sierra Leone Sierra Leona - + San Marino San Marino - + Senegal Senegal - + Somalia Somalia - + Suriname Suriname - + Sao Tome and Principe Sao Tome eta Principe - + El Salvador El Salvador - + Syrian Arab Republic Siriako Arabiar Herkalderria - + Swaziland Swazilandia - + Turks and Caicos Islands Dordokak eta Caicos Uharteak - + Chad Txad - + French Southern Territories Frantziar Hegoaldeko Lurraldeak - + Togo Togo - + Thailand Thailandia - + Tajikistan Tajikistan - + Tokelau Tokelau - + Turkmenistan Turkmenistan - + Tunisia Tunizia - + Tonga Tonga - - Could not decompress GeoIP database file. - Ezin da GeoIP datubase agiri deskonprimitu. - - - + Timor-Leste Timor-Ekialdea - + Bolivia, Plurinational State of Bolivia, Nazioanitzeko Estatua - + Bonaire, Sint Eustatius and Saba Bonaire, Sint Eustatius eta Saba - + Cote d'Ivoire Boli Kosta - + Libya Libia - + Saint Martin (French part) Saint Martin (Frantziar aldea) - + Macedonia, The Former Yugoslav Republic of Mazedonia, Yugoslaviar Herkalderria Ohia - + Macao Macao - + Pitcairn Pitcairn - + Palestine, State of Palestina, Estatua - + Saint Helena, Ascension and Tristan da Cunha Saint Helena, Ascension eta Tristan da Cunha - + South Sudan Hego Sudan - + Sint Maarten (Dutch part) Sint Maarten (Herbeherear aldea) - + Turkey Turkia - + Trinidad and Tobago Trinidad eta Tobago - + Tuvalu Tuvalu - + Taiwan Taiwan - + Tanzania, United Republic of Tantzania, Herkalderri Batua - + Ukraine Ukrainia - + Uganda Uganda - + United States Minor Outlying Islands Estatu Batuetako Itsasoz Haraindiko Uharteak - + United States Estatu Batuak - + Uruguay Uruguay - + Uzbekistan Uzbekistan - + Holy See (Vatican City State) Hiri Santua (Vaticanoa Hiri Estatua) - + Saint Vincent and the Grenadines Saint Vincent eta Granadinak - + Virgin Islands, British Virgin Uharteak, Britainiarrak - + Virgin Islands, U.S. Virgin Uharteak, AEB - + Vanuatu Vanuatu - + Wallis and Futuna Wallis eta Futuna - + Samoa Samoa - + Yemen Yemen - + Mayotte Mayotte - + Serbia Serbia - + South Africa Hego Afrika - + Zambia Zambia - + Montenegro Montenegro - + Zimbabwe Zimbabwe - + Aland Islands Aland Uharteak - + Guernsey Guernsey - + Isle of Man Man Uhartea - + Jersey Jersey - + Saint Barthelemy Saint Bartolome - + + Could not uncompress GeoIP database file. + Ezin da GeoIP datubase agiria deskonprimitu. + + + Couldn't save downloaded GeoIP database file. Ezin da jeitsitako GeoIP datubase agiria gorde. - + Successfully updated GeoIP database. GeoIP datubasea ongi eguneratu da. - + Couldn't download GeoIP database file. Reason: %1 Ezin da GeoIP datubase agiria jeitsi. Zergaitia: %1 @@ -4596,12 +4142,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] UPnP / NAT-PMP sostengua [BAI] - + UPnP / NAT-PMP support [OFF] UPnP / NAT-PMP sostengua [EZ] @@ -4609,7 +4155,7 @@ Net::Smtp - + Email Notification Error: Post@ Jakinarazpen Akatsa: @@ -4617,1279 +4163,1077 @@ OptionsDialog - + Options Aukerak - + Behavior Jokabidea - + Downloads Jeitsierak - + Connection Elkarketa - + Speed Abiadura - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI Web EI - + Advanced Aurreratua - + Language Hizkuntza - + User Interface Language: Erabiltzaile Interfaze Hizkuntza: - + (Requires restart) (Berrabiaraztea beharrezkoa) - + Transfer List Eskualdaketa Zerrenda - + Confirm when deleting torrents Baieztatu torrenten ezabapena - + Use alternating row colors In transfer list, one every two rows will have grey background. Erabili lerro margo ezberdinak - + Hide zero and infinity values Ezkutatu huts eta mugagabeko balioak - + Always Betik - + Paused torrents only Pausatutako torrentak bakarrik - + Action on double-click Klik-bikoitzaren ekintza - + Downloading torrents: Torrentak jeisterakoan: - - + + Start / Stop Torrent Hasi / Gelditu Torrenta - - + + Open destination folder Ireki helmuga agiritegia - - + + No action Ekintzarik ez - + Completed torrents: Osatutako torrentak: - + Desktop Mahaigaina - + Start qBittorrent on Windows start up Hasi qBittorrent Windows hasterakoan - + Show splash screen on start up Erakutsi logoa abiarazterakoan - + Start qBittorrent minimized Hasi qBittorrent txikienduta - + Confirmation on exit when torrents are active Baieztapena irtetzerakoan torrentak ekinean daudenean - + Confirmation on auto-exit when downloads finish Baieztapena berez-irtetzean jeitsierak amaitutakoan - - KiB - KiB - - - - Email notification &upon download completion - &Post@ jakinarazpena jeitsiera osatutakoan - - - - Run e&xternal program on torrent completion - Ekin &kanpoko programa torrenta osatutakoan - - - - IP Fi&ltering - IP I&ragazketa - - - - Schedule &the use of alternative rate limits - Egitarautu a&ukerazko neurri muga erabilpena - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Argibide gehiago</a>) - - - - &Torrent Queueing - &Torrent Lerrokapena - - - - Seed torrents until their seeding time reaches - Emaritu torrentak beren emaritza denbora erdietsi arte - - - - A&utomatically add these trackers to new downloads: - &Berezgaitasunez gehitu aztarnari hauek jeitsiera berriei: - - - - RSS Reader - RSS Irakurlea - - - - Enable fetching RSS feeds - Gaitu RSS jarioak lortzea - - - - Feeds refresh interval: - Jarioen berritze epea: - - - - Maximum number of articles per feed: - Gehienezko idazlan harpidetza bakoitzeko: - - - - - min - minutes - min - - - - RSS Torrent Auto Downloader - RSS Torrent Berez Jeistzailea - - - - Enable auto downloading of RSS torrents - Gaitu RSS torrenten berez jeistea - - - - Edit auto downloading rules... - Editatu berez jeiste arauak... - - - - Web User Interface (Remote control) - Web Erabiltzaile Interfazea (Hurruneko agintea) + + Show qBittorrent in notification area + Erakutsi qBittorrent jakinarazpen eremuan - - IP address: - IP helbidea: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - Web EI lotuko den IP helbidea. -Adierazi IPv4 edo IPv6 helbide bat. "0.0.0.0" adierazi dezakezu edozein IPv4 helbiderentzat, -"::" edozein IPv6 helbiderentzat, edo "*" bientzat IPv4 et IPv6. - - - - Server domains: - Zerbitzari domeinuak: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - Zerrenda-zuria HTTP Hostalari idazburu balioak iragazteko. -DNS berrelkartze erasoen aurka babesteko, -WebEI zerbitzariak erabiltzen dituen domeinu izenetan jarri behar duzu. - -Erabili ';' sarrera ugari banantzeko. '*' ordez-hizkia erabili daiteke. - - - - &Use HTTPS instead of HTTP - Erabili &HTTPS, HTTP-ren ordez - - - - Bypass authentication for clients on localhost - Igaropen egiaztapena tokiko-hostalariko berezoentzat - - - - Bypass authentication for clients in whitelisted IP subnets - Igaropen egiaztapena IP azpisare zerrenda-zuriko berezoentzat - - - - IP subnet whitelist... - IP azpisare zerrenda-zuria... - - - - Upda&te my dynamic domain name - Eg&uneratu nire domeinu dinamikoaren izena - - - + Minimize qBittorrent to notification area Txikiendu qBittorrent jakinarazpen eremura - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. Itxi qBittorrent jakinarazpen eremura - + Tray icon style: Erretilu ikur estiloa: - + Normal Arrunta - + Monochrome (Dark theme) Margobakarra (Azalgai iluna) - + Monochrome (Light theme) Margobakarra (Azalgai argia) - + File association Agiri elkarketa - + Use qBittorrent for .torrent files Erabili qBittorrent .torrent agirientzat - + Use qBittorrent for magnet links Erabili qBittorrent magnet loturentzat - + Power Management Indar Kudeaketa - + + Inhibit system sleep when torrents are active + Eragotzi sistemaren lotaratzea torrentak ekinean daudenean + + + + Log file + Ohar agiria + + + Save path: Gordetze helburua: - + Backup the log file after: Babeskopiatu ohar agiria ondoren: - + + MB + MB + + + Delete backup logs older than: Ezabatu zaharragoak diren babeskopia oharrak: - + days Delete backup logs older than 10 months egun - + months Delete backup logs older than 10 months hilabete - + years Delete backup logs older than 10 years urte - + When adding a torrent Torrent bat gehitzerakoan - + + Display torrent content and some options + Erakutsi torrent edukia eta aukera batzuk + + + Bring torrent dialog to the front Ekarri torrent elkarrizketa aurrealdera - + Do not start the download automatically The torrent will be added to download list in pause state Ez hasi jeisketa berezgaitasunez - + Should the .torrent file be deleted after adding it .torrent agiria ezabatu egin behar da gehitu ondoren - + + Delete .torrent files afterwards + Ezabatu .torrent agiriak edonola + + + Also delete .torrent files whose addition was cancelled Ezabatu gehitzea ezeztatu diren .torrent agiriak ere - + Also when addition is cancelled Baita gehitzea ezeztatutakoan - + Warning! Data loss possible! Kontuz! Datuak galdu daitezke! - + Saving Management Gordetze Kudeaketa - + Default Torrent Management Mode: Berezko Torrent Kudeaketa Modua: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category Berezgaitasunezko moduak esanahi du torrent ezaugarri ugari (adib. gordetze helburua) elkartutako kategoriaren arabera erabakiko direla - + Manual Eskuzkoa - + Automatic Berezgaitasunezkoa - + When Torrent Category changed: Torrent Kategoria aldatzen denean: - + Relocate torrent Berkokatu torrenta - + Switch torrent to Manual Mode Aldatu torrenta Eskuzko Modura - + When Default Save Path changed: Berezko Gordetze Helburua aldatzen denean: - - + + Relocate affected torrents Berkokatu eragindako torrentak - - + + Switch affected torrents to Manual Mode Aldatu eragindako torrentak Eskuzko Modura - + When Category changed: Kategoria aldatzen denean: - + Use Subcategories Erabili Azpikategoriak - + Default Save Path: Berezko Gordetze Helbura: - + Keep incomplete torrents in: Gorde osatugabeko torrentak hemen: - + Copy .torrent files to: Kopiatu .torrent agiriak hona: - - Show &qBittorrent in notification area - Erakutsi &qBittorrent jakinarazpen eremuan - - - - &Log file - &Ohar agiria - - - - Display &torrent content and some options - Erakutsi &torrent edukia eta aukera batzuk - - - - Create subfolder for torrents with multiple files - Sortu azpiagiritegia agiri ugari duten torrententzat - - - - De&lete .torrent files afterwards - E&zabatu .torrent agiriak edonola - - - + Copy .torrent files for finished downloads to: Kopiatu amaitutako jeisketa .torrent agiriak hona: - + Pre-allocate disk space for all files Aurre-esleitu diska tokia agiri guztientzat - - Inhibit system sleep when torrents are downloading - Eragotzi sistemaren lotaratzea torrentak jeisten daudenean - - - - Inhibit system sleep when torrents are seeding - Eragotzi sistemaren lotaratzea torrentak emaritzan daudenean - - - + Append .!qB extension to incomplete files Gehitu .!qB luzapena osatugabeko agiriei - - Enable recursive download dialog - Gaitu jeisketa mugagabearen elkarrizketa - - - + Automatically add torrents from: Berezgaitasunez gehitu torrentak hemendik: - + Add entry Gehitu sarrera - + Remove entry Kendu sarrera - + + Email notification upon download completion + Post@ jakinarazpena jeitsiera osatutakoan + + + + Destination email: + Helmuga post@: + + + SMTP server: SMTP zerbitzaria: - + This server requires a secure connection (SSL) Zerbitzari honek elkarketa segurua behar du (SSL) - - + + + Authentication Egiaztapena - - - - + + + + Username: Erabiltzaile-izena: - - - - + + + + Password: Sarhitza: - - Enabled protocol: - Gaitutako protokoloa: - - - - TCP and μTP - TCP eta μTP + + Run external program on torrent completion + Ekin kanpoko programa bat torrenta osatutakoan - + Listening Port Aditze Ataka - + Port used for incoming connections: Barrurako elkarketentzako ataka: - + Random Zorizkoa - + Use UPnP / NAT-PMP port forwarding from my router Erabili UPnP / NAT-PMP ataka nire bideratzailetik bidaltzeko - + Use different port on each startup Erabili ataka ezberdina abiarazte bakoitzean - + Connections Limits Elkarketa Mugak - + Maximum number of connections per torrent: Gehienezko elkarketa zenbatekoa torrent bakoitzeko: - + Global maximum number of connections: Gehienezko elkarketa zenbatekoa orotara: - + Maximum number of upload slots per torrent: Gehienezko igoera aho zenbatekoa torrent bakoitzeko: - + Global maximum number of upload slots: Gehienezko Igoera aho orokor zenbatekoa: - + Proxy Server Proxy Zerbitzaria - + Type: Mota: - + (None) (Bat ere ez) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Hostalaria: - - + + Port: Ataka: - + Otherwise, the proxy server is only used for tracker connections Bestela, proxya zerbitzaria aztarnari elkarketetarako bakarrik erabiltzen da - + Use proxy for peer connections Erabili proxya hartzaile elkarketetarako - + Disable connections not supported by proxies Ezgaitu proxiek sostengatzen ez dituzten elkarketak - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Argibide gehiago</a>) - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection RSS jarioak, bilaketa gailua, software eguneraketa edo torrent eskualdaketa eta loturiko eragiketak (hartzaile elkarraldaketak) ez diren bestelako gauzak zuzeneko elkarketa erabiliko dute - + Use proxy only for torrents Erabili proxya torrententzat bakarrik - - A&uthentication - E&giaztapena - - - + Info: The password is saved unencrypted Argibidea: Sarhitza enkriptatu gabe gordetzen da - + + IP Filtering + IP Iragazpena + + + Filter path (.dat, .p2p, .p2b): Iragazki helburua (.dat, .p2p, .p2b): - + Reload the filter Birgertatu iragazkia - - Manually banned IP addresses... - Eskuzko IP helbide eragoztea... - - - + Apply to trackers Ezarri aztarnariei - + Global Rate Limits Neurri Muga Orokorrak - - - - - - - KiB/s - KiB/s - - - - + + Upload: Igoera: - - + + + + + KiB/s + KiB/s + + + + Download: Jeitsiera: - + Alternative Rate Limits Aukerazko Neurri Mugak - - + + Schedule the use of alternative rate limits + Egitarautu aukerazko neurri muga erabilpena + + + From: from (time1 to time2) Hemendik: - - + To: time1 to time2 Hona: - + When: Noiz: - + Every day Egunero - + Weekdays Lanegunak - + Weekends Asteburuak - + Rate Limits Settings Neurri Muga Ezarpenak - + Apply rate limit to peers on LAN Ezarri neurri muga LAN-eko hartzaileei - + Apply rate limit to transport overhead Ezarri neurri muga burugain garraioari - - + + + Enable µTP protocol + Gaitu µTP protokoloa + + + Apply rate limit to µTP protocol Ezarri neurri muga µTP protokoloari - + Privacy Pribatutatasuna - + Enable DHT (decentralized network) to find more peers Gaitu DHT (zentralizatugabeko sarea) hartzaile gehiago bilatzeko - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Aldatu hartzaileak Bittorrent bezero bateragarriekin (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers Gaitu Hartzaile Aldaketa (PeX) hartzaile gehiago bilatzeko - + Look for peers on your local network Bilatu hartzaileak zure tokiko sarean - + Enable Local Peer Discovery to find more peers Gaitu Tokiko Hartzaile Aurkikuntza hartzaile gehiago bilatzeko - + Encryption mode: Enkriptaketa modua: - + Prefer encryption Hobetsi enkriptaketa - + Require encryption Enkriptaketa beharrezkoa - + Disable encryption Ezgaitu enkriptaketa - + Enable when using a proxy or a VPN connection Gaitu proxy bat edo VPN elkarketa bat erabiltzerakoan. - + Enable anonymous mode Gaitu izengabeko modua - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Argibide gehiago</a>) + + + + Torrent Queueing + Torrent Lerrokapena + + + Maximum active downloads: Gehienezko jeitsiera eraginda: - + Maximum active uploads: Gehienezko igoera eraginda: - + Maximum active torrents: Gehienezko torrent eraginda: - + Do not count slow torrents in these limits Ez zenbatu torrent geldoak muga hauetan - - Upload rate threshold: - Igoera neurri mugapena: - - - - Download rate threshold: - Jeitsiera neurri mugapena: - - - - sec - seconds - seg - - - - Torrent inactivity timer: - Torrentaren jardungabe denboragailua: - - - + Share Ratio Limiting Elkarbanatze Maila Mugapena - + Seed torrents until their ratio reaches Emaritu torrentak beren maila erdietsi arte - + then orduan - + Pause them Pausatu - + Remove them Kendu - - RSS Smart Episode Filters - RSS Atal Iragazki Adimentsuak + + Automatically add these trackers to new downloads: + Berezgaitasunez gehitu aztarnari hauek jeitsiera berriei: + + + + Enable Web User Interface (Remote control) + Gaitu Web Erabiltzaile Interfazea (Hurruneko Agintea) - + Use UPnP / NAT-PMP to forward the port from my router Erabili UPnP / NAT-PMP ataka nire bideratzailetik bidaltzeko - + + Use HTTPS instead of HTTP + Erabili HTTPS, HTTP-ren ordez + + + Certificate: Egiaztagiria: - + Import SSL Certificate Inportatu SSL Egiaztagiria - + Key: Giltza: - + Import SSL Key Inportatu SSL Giltza - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Egiaztagiriei buruzko argibideak</a> - - Use alternative Web UI - Erabili aukerazko Web EI - - - - Files location: - Agirien kokalekua: - - - - Enable clickjacking protection - Gaitu clickjacking babesa + + Bypass authentication for localhost + Igarotze egiaztapena tokiko-hostalariarentzat - - Enable Cross-Site Request Forgery (CSRF) protection - Gaitu Cross-Site Request Forgery (CSRF) babesa + + Update my dynamic domain name + Eguneratu nire domeinu dinamikoaren izena - + Service: Zerbitzua: - + Register Izena eman - + Domain name: Domeinu izena: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! Aukera hauek gaituz, <strong>atzerabiderik gabe galdu</strong> ditzakezu zure .torrent agiriak! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well Aukera hauek gaitzen direnean, qBittorent-ek .torrent agiriak <strong>ezabatuko</strong> ditu beren jeitsiera lerrora ongi (lehen aukera) edo ez (bigarren aukera) gehitutakoan. Hau <strong>ez da bakarrik</strong> &ldquo;Gehitu torrenta&rdquo; menu ekintzaren bidez irekitako agirietan ezarriko, baita <strong>agiri mota elkarketa</strong> bidez irekitakoetan ere. - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog Bigarren aukera gaitzen baduzu (&ldquo;Baita gehitzea ezeztatutakoan&rdquo;) .torrent agiria <strong>ezabatu egingo da</strong> baita &ldquo;<strong>Ezeztatu</strong>&rdquo; sakatzen baduzu ere &ldquo;Gehitu torrenta&rdquo; elkarrizketan - - Choose Alternative UI files location - Hautatu EI agiri kokaleku alternatiboa - - - + Supported parameters (case sensitive): Sostengatutako parametroak (hizki xehe-larriak bereiziz) - + %N: Torrent name %N: Torrentaren izena - + %L: Category %L: Kategoria - - %G: Tags (seperated by comma) - %G: Etiketak (kakotxaz bananduta) - - - + %F: Content path (same as root path for multifile torrent) %F: Eduki helburua (torrent anitzerako erro helburua bezala) - + %R: Root path (first torrent subdirectory path) %R: Erro helburua (lehen torrent azpizuzenbide helburua) - + %D: Save path %D: Gordetze helburua - + %C: Number of files %C: Agiri zenbatekoa - + %Z: Torrent size (bytes) %Z: Torrentaren neurria (byte) - + %T: Current tracker %T: Oraingo aztarnaria - + %I: Info hash %I: Info hasha - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") Aholkua: Enkapsulatu parametroa adartxo artean idazkia zuriune batekin ebakia izatea saihesteko (adib., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - Torrent bat astirotzat hartuko da bere jeitsiera eta igoera neurriak balio hauen azpitik badaude "Torrent jardungabe denboragailu" segunduz - - - + Select folder to monitor Hautatu monitorizatzeko agiritegia - + Folder is already being monitored: Agiritegia jadanik monitorizatua dago: - + Folder does not exist: Agiritegia ez dago: - + Folder is not readable: Agiritegia ez da irakurgarria: - + Adding entry failed Hutsegitea sarrera gehitzean - - - - + + Choose export directory Hautatu esportatzeko zuzenbidea - - - + + + + + + Choose a save directory Hautatu gordetzeko zuzenbide bat - + Choose an IP filter file Hautatu IP iragazki agiri bat - + All supported filters Sostengatutako iragazki guztiak - + SSL Certificate SSL Egiaztagiria - + + SSL Key + SSL Giltza + + + Parsing error Azterketa akatsa - + Failed to parse the provided IP filter Hutsegitea emandako IP iragazkia aztertzerakoan - + Successfully refreshed Ongi berrituta - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Emandako IP iragazkia ongi aztertu da: %1 araua ezarri dira. - + Invalid key Giltza baliogabea - + This is not a valid SSL key. Hau ez da baliozko SSL giltza bat. - + Invalid certificate Egiaztagiri baliogabea - - Preferences - Hobespenak - - - - Import SSL certificate - Inportatu SSL egiaztagiria - - - + This is not a valid SSL certificate. Hau ez da baliozko SSL egiaztagiri bat. - - Import SSL key - Inportatu SSL giltza - - - - SSL key - SSL giltza - - - + Time Error Ordu Akatsa - + The start time and the end time can't be the same. Hasiera ordua eta amaiera ordua ezin dira berdinak izan. - - + + Length Error Luzera Akatsa - + The Web UI username must be at least 3 characters long. Web EI erabiltzaile-izenak gutxienez 3 hizkirriko luzera izan behar du. - + The Web UI password must be at least 6 characters long. Web EI sarhitzak gutxienez 6 hizkirriko luzera izan behar du. @@ -5897,72 +5241,72 @@ PeerInfo - - Interested(local) and Choked(peer) - Interested(tokikoa) eta Choked(hartzailea) + + interested(local) and choked(peer) + interesatuta (tokikoa) eta itota (hartzailea) - + interested(local) and unchoked(peer) interesatuta (tokikoa) eta itogabe (hartzailea) - + interested(peer) and choked(local) interesatuta (hartzailea) eta itota (tokikoa) - + interested(peer) and unchoked(local) interesatuta (hartzailea) eta itogabe (tokikoa) - + optimistic unchoke itogabe baikorra - + peer snubbed hartzailea baztertuta - + incoming connection barrurako elkarketa - + not interested(local) and unchoked(peer) ez interesatuta (tokikoa) eta itogabe (hartzailea) - + not interested(peer) and unchoked(local) ez interesatuta (hartzailea) eta itogabe (tokikoa) - + peer from PEX PEX-tiko hartzailea - + peer from DHT DHT-tiko hartzailea - + encrypted traffic trafiko enkriptatua - + encrypted handshake eskuemate enkriptatua - + peer from LSD LSD-tiko hartzailea @@ -5970,180 +5314,165 @@ PeerListWidget - + IP IP-a - + Port Ataka - + Flags Ikurrak - + Connection Elkarketa - + Client i.e.: Client application Bezeroa - + Progress i.e: % downloaded Garapena - + Down Speed i.e: Download speed Jeisketa Abiadura - + Up Speed i.e: Upload speed Igoera Abiadura - + Downloaded i.e: total data downloaded Jeitsita - + Uploaded i.e: total data uploaded Igota - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Garrantzia - + Files i.e. files that are being downloaded right now Agiriak - + Column visibility Zutabe ikusgarritasuna - + Add a new peer... Gehitu hartzaile berri bat... - - + + Ban peer permanently Eragotzi hartzailea mugagabe - + Manually adding peer '%1'... Eskuzko hartzaile gehitzea '%1'... - + The peer '%1' could not be added to this torrent. '%1' hartzailea ezin da torrent honetara gehitu. - + Manually banning peer '%1'... Eskuzko hartzaile eragoztea '%1'... - - + + Peer addition Hartzaile gehiketa - + Country Herrialdea - + Copy IP:port Kopiatu IP:ataka - + Some peers could not be added. Check the Log for details. Zenbait hartzailea ezin dira gehitu. Egiaztatu Oharra xehetasunetarako. - + The peers were added to this torrent. Hartzaileak torrent honetara gehitu dira. - + Are you sure you want to ban permanently the selected peers? Zihur zaude mugagabe eragoztea nahi dituzula hautatutako hartzaileak? - + &Yes &Bai - + &No &Ez - PeersAdditionDialog - - - Add Peers - Gehitu Hartzaileak - - - - List of peers to add (one IP per line): - Gehitzeko hartzaileen zerrenda (IP bat lerroko): - - - - Format: IPv4:port / [IPv6]:port - Heuskarria: IPv4:ataka / [IPv6]:ataka - + PeersAdditionDlg - + No peer entered Ez da hartzailerik sartu - + Please type at least one peer. Mesedez idatzi hartzaile bat gutxinez. - + Invalid peer Hartzaile baliogabea - + The peer '%1' is invalid. '%1' hartzailea baliogabea da. @@ -6151,12 +5480,12 @@ PieceAvailabilityBar - + White: Unavailable pieces Zuria: Atal eskuraezinak - + Blue: Available pieces Urdina: Atal eskuragarriak @@ -6164,337 +5493,293 @@ PiecesBar - + Files in this piece: Atal honetako agiriak: - + File in this piece Atal honetako agiriak - + File in these pieces Atal hauetako agiriak - - Wait until metadata become available to see detailed information - Itxaron metadatuak eskuragarri egon arte argibide xehetuak ikusteko - - - + Hold Shift key for detailed information Sakatu Aldatu tekla argibide xeheak ikusteko - PluginSelectDialog + PluginSelectDlg - + Search plugins Bilatu pluginak - + Installed search plugins: - Ezarritako bilaketa pluginak: + Ezarritako pluginen bilaketa: - + Name Izena - + Version Bertsioa - + Url Url-a - - + + Enabled Gaituta - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - Kontuz: Zihurtatu zure herrialdeko kopia-eskubide legeak betetzen dituzula torrentak jeisterakoan bilaketa gailu hauen bidez. - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> Bilaketa gailu plugin berriak lortu ditzakezu hemen: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one Ezarri berri bat - + Check for updates Egiaztatu eguneraketarik dagoen - + Close Itxi - + Uninstall Kendu - - - + + + Yes Bai - - - - + + + + No Ez - + Uninstall warning - Kentze ohartarazpena + Kentze oharra - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. Zenbait plugin ezin dira kendu qBittorrenten barnekoak direlako. Zeuk gehitutakoak bakarrik kendu daitezke. Plugin hauek ezgaituta daude. - + Uninstall success Kentzea eginda - + All selected plugins were uninstalled successfully Hautatutako plugin guztiak ongi kendu dira - - - - - Search plugin update - Bilaketa plugin eguneraketa - - - - Plugins installed or updated: %1 - Plugin ezarrita edo eguneratuta: %1 - - - - + + New search engine plugin URL Bilaketa gailu plugin URL berria - - + + URL: URL-a: - + Invalid link Lotura baliogabea - + The link doesn't seem to point to a search engine plugin. Loturak ez dirudi bilaketa gailu plugin batera zuzentzen duenik. - + Select search plugins Hautatu bilaketa pluginak - + qBittorrent search plugin qBittorrent bilaketa plugina - + + + + Search plugin update + Bilaketa plugin eguneraketa + + + All your plugins are already up to date. Zure plugin guztiak jadanik eguneratuta daude. - + Sorry, couldn't check for plugin updates. %1 Barkatu, ezin da pluginare eguneraketarik dagoen egiaztatu. %1 - + + + Search plugin install Bilaketa plugin ezarpena - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + "%1" bilaketa gailu plugina ongi ezarri da. + + + Couldn't install "%1" search engine plugin. %2 Ezinezkoa "%1" bilaketa gailu plugina ezartzea. %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + %1 bilaketa gailu plugina ongi eguneratu da. + + + Couldn't update "%1" search engine plugin. %2 Ezinezkoa "%1" bilaketa gailu plugina eguneratzea. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source Pluginaren iturburua - + Search plugin source: Bilatu pluginaren iturburua: - + Local file Tokiko agiria - + Web link Web lotura - PowerManagement - - - qBittorrent is active - qBittorrent ekinean dago - - - - PreviewSelectDialog - - - Preview - Aurreikuspena - + PreviewSelect - + Name Izena - + Size Neurria - + Progress Garapena - - + + Preview impossible Aurreikuspena ezinezkoa - - + + Sorry, we can't preview this file - Barkatu, ezin dugu agiri honen aurreikuspenik egin - - - - Private::FileLineEdit - - - '%1' does not exist - '%1' ez dago - - - - '%1' does not point to a directory - '%1' ez darama zuzenbide batera - - - - '%1' does not point to a file - '%1' ez darama agiri batera - - - - Does not have read permission in '%1' - Ez du irakur baimenik hemen: '%1' - - - - Does not have write permission in '%1' - Ez du idaz baimenik hemen: '%1' + Barkatu, ezin dugu agiri hau aurreikusi PropListDelegate - + Not downloaded Jeitsi gabe - - + + Normal Normal (priority) Arrunta - - N/A - E/G - - - + Do not download Do not download (priority) - Ez jeitsi + Ez jeitsi - - + + High High (priority) Handia - + N/A + E/G + + + Mixed Mixed (priorities Nahastua - - + + Maximum Maximum (priority) Gehiena @@ -6503,32 +5788,32 @@ PropTabBar - + General Orokorra - + Trackers Aztarnariak - + Peers Hartzaileak - + HTTP Sources HTTP Iturburuak - + Content Edukia - + Speed Abiadura @@ -6622,22 +5907,22 @@ Aipamena: - + Select All Hautatu Denak - + Select None Ez Hautatu Ezer - + Normal Arrunta - + High Handia @@ -6697,165 +5982,165 @@ Gordetze Helburua: - + Maximum Gehiena + - Do not download Ez jeitsi - + Never Inoiz ez - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (ditu %3) - - + + %1 (%2 this session) %1 (%2 saio honetan) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (emarituta %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 geh) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 guztira) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 bat.-best.) - + Open Ireki - + Open Containing Folder Ireki Edukiaren Agiritegia - + Rename... Berrizendatu... - + Priority Lehentasuna - + New Web seed Web emaritza berria - + Remove Web seed Kendu Web emaritza - + Copy Web seed URL Kopiatu Web emaritza URL-a - + Edit Web seed URL Editatu Web emaritza URL-a - + + Rename the file + Berrizendatu agiri hau + + + New name: Izen berria: - - + + + The file could not be renamed + Agiria ezin da berrizendatu + + + + This file name contains forbidden characters, please choose a different one. + Agiri honek hizki galaraziak ditu, mesedez hautatu beste bat. + + + + This name is already in use in this folder. Please use a different name. Izen hau jadanik erabilia da agiritegi honetan. Mesedez erabili beste bat. - + The folder could not be renamed Agiritegia ezin da berrizendatu - + qBittorrent qBittorrent - + Filter files... Iragazi agiriak... - - Renaming - Berrizendatzen - - - - - Rename error - Berrizendatze akatsa - - - - The name is empty or contains forbidden characters, please choose a different one. - Agiri hau hutsik dago edo hizki galaraziak ditu, mesedez hautatu beste bat. - - - + New URL seed New HTTP source URL emaritza berria - + New URL seed: URL emaritza berria: - - + + This URL seed is already in the list. URL emaritza hau jadanik zerrendan dago. - + Web seed editing Web emaritza editatzen - + Web seed URL: Web emaritza URL-a: @@ -6863,584 +6148,551 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + Zure IP helbidea eragotzia izan da egiaztapen saiakera hutsegite askoren ondoren. + + + + Error: '%1' is not a valid torrent file. + + Akatsa: '%1' ez da baliozko torrent agiria. + + + + + + Error: Could not add torrent to session. + Akatsa: Ezin da torrenta saiora gehitu. + + + + I/O Error: Could not create temporary file. + S/I Akatsa: Ezin da aldibaterako agiria sortu. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 agindu lerro parametro ezezaguna da. - - + + %1 must be the single command line parameter. %1 agindu lerro parametro soila izan behar da. - + + %1 must specify the correct port (1 to 65535). + %1-k ataka zuzena adierazi behar du (1 eta 65535 artean). + + + You cannot use %1: qBittorrent is already running for this user. Ezin duzu %1 erabili: qBittorrent jadanik ekinean dago erabiltzaile honentzat. - + Usage: Erabilpena: - + Options: Aukerak: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - '%1' parametroak '%1=%2' joskera jarraitu behar du + + Displays program version + Programaren bertsioa erakusten du + + + + Displays this help message + Laguntza mezu hau erakusten du - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - '%1' parametroak '%1=%2' joskera jarraitu behar du + + Changes the Web UI port (current: %1) + Web EI ataka aldatzen du (oraingoa: %1) - - Expected integer number in environment variable '%1', but got '%2' - Zenbaki osoa itxaroten zen '%1' inguru aldagaian, baina lortu da '%2' + + Disable splash screen + Ezgaitu ongi etorri ikusleihoa - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - '%1' parametroak '%1=%2' joskera jarraitu behar du + + Run in daemon-mode (background) + Ekin daemon-moduan (barrenean) - - Expected %1 in environment variable '%2', but got '%3' - %1 itxaroten zen '%2' inguru aldagaian, baina lortu da '%3' + + Downloads the torrents passed by the user + Erabiltzaileak pasatutako torrentak jeisten ditu - - port - ataka + + Help + Laguntza - - %1 must specify a valid port (1 to 65535). - %1-k baliozko ataka adierazi behar du (1 eta 65535 artean). + + Run application with -h option to read about command line parameters. + Ekin aplikazioa -h aukerarekin agindu lerro parametroei buruz irakurtzeko. - - Display program version and exit - Erakutsi programaren bertsioa eta irten + + Bad command line + Agindu lerro okerra - - Display this help message and exit - Erakutsi laguntza mezu hau eta irten + + Bad command line: + Agindu lerro okerra: - - Change the Web UI port - Aldatu Web EI ataka + + Legal Notice + Legezko Jakinarazpena - - Disable splash screen - Ezgaitu ongi etorri ikusleihoa + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + qBittorrent agiri elkarbanatze programa bat da. Torrent bati ekiten diozunean, datu hauek eskuragarriak izango dira besteentzako igoeraren bidez. Elkarbanatzen duzun edozein eduki zure erantzunkizunekoa da. +Ez dira jakinarazpen gehiago egingo. - - Run in daemon-mode (background) - Ekin daemon-moduan (barrenean) + + Press %1 key to accept and continue... + Sakatu %1 tekla onartu eta jarraitzeko... - - dir - Use appropriate short form or abbreviation of "directory" - zuz + + Legal notice + Legezko Jakinarazpena - - Store configuration files in <dir> - Biltegiratu itxurapen agiriak hemen: <dir> + + Cancel + Ezeztatu - - - name - izena + + I Agree + Onartzen dut - - Store configuration files in directories qBittorrent_<name> - Biltegiratu itxurapen agiriak qBittorrent zuzenbideetan_<name> + + Torrent name: %1 + Torrent izena: %1 - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Hackeatu libtorrent berrekite-azkarra agirietan eta egin helburuak erlatiboak profilaren zuzenbidearekiko + + Torrent size: %1 + Torrent neurria: %1 - - files or URLs - agirak edo URL-ak + + Save path: %1 + Gordetze helburua: %1 - - Download the torrents passed by the user - Jeitsi rabiltzaileak pasatutako torrentak + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Torrentaren jeiste denbora, %1. - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Torrent bat gehitzerakoan "Gehitu Torrent Berria" elkarrizketak zer irekitzen duen adierazten du + + Thank you for using qBittorrent. + Mila esker qBittorrent erabiltzeagaitik. - - Options when adding new torrents: - Aukerak torrent berriak gehitzerakoan: + + [qBittorrent] '%1' has finished downloading + [qBittorrent] '%1' jeisketa amaitu du - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - %1 lasterbidea + + The remote host name was not found (invalid hostname) + Hurruneko hostalari izena ez da aurkitu (hostalari-izen baliogabea) - - path - helburua + + The operation was canceled + Eragiketa ezeztatua izan da - - Torrent save path - Torrenta gordetzeko helburua + + The remote server closed the connection prematurely, before the entire reply was received and processed + Hurruneko zerbitzariak elkarketa azkarregi itxi du, erantzuna osorik jaso eta prozesatu aurretik - - Add torrents as started or paused - Gehitu torrentak hasita edo pausatuta bezala + + The connection to the remote server timed out + Hurruneko zerbitzariarekiko elkarketa denboraz kanpo - - Skip hash check - Jausi hash egiaztapena + + SSL/TLS handshake failed + SLL/TLS eskuemate hutsegitea - - Assign torrents to category. If the category doesn't exist, it will be created. - Esleitu torrentak kategoriari. Kategoria ez badago, sortu egin daiteke. + + The remote server refused the connection + Hurruneko zerbitzariak elkarketa baztertu du - - Download files in sequential order - Jeitsi agiriak hurrenkera sekuentzialean + + The connection to the proxy server was refused + Proxy zerbitzariarekiko elkarketa baztertua izan da - - Download first and last pieces first - Jeitsi lehen eta azken atalak lehenik + + The proxy server closed the connection prematurely + Proxy zerbitzariak elkarketa azkarregi itxi du - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - Aukera balioak inguru aldagaien bidez eman daitezke. 'parameter-name' izeneko aukerarentzat, inguru aldagaiaren izena da 'QBT_PARAMETER_NAME' (hizki larriz, '-' ordeztuz '_'-rekin). Igaropen ikur balioentzat, ezarri aldagaia '1' edo 'TRUE' egoeran. Adibidez, hasierako ikusleihoa ezgaitzeko: + + The proxy host name was not found + Proxy hostalari izena ez da aurkitu - - Command line parameters take precedence over environment variables - Agindu lerro parametroek lehentasuna dute inguru aldagaiekiko + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Proxyarekiko elkarketa denboraz kanpo edo proxyak ez dio garaiz erantzun bidalitako eskabideari - - Help - Laguntza + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Proxyak egiaztapena behar du eskabidea burutzeko baina ez du onartu eskainitako nortasunik - - Run application with -h option to read about command line parameters. - Ekin aplikazioa -h aukerarekin agindu lerro parametroei buruz irakurtzeko. + + The access to the remote content was denied (401) + Hurruneko edukirako sarbidea ukatua izan da (401) - - Bad command line - Agindu lerro okerra + + The operation requested on the remote content is not permitted + Hurruneko edukian eskatutako eragiketa ez dago baimenduta - - Bad command line: - Agindu lerro okerra: + + The remote content was not found at the server (404) + Hurruneko edukia ez da aurkitu zerbitzarian (404) - - Legal Notice - Legezko Jakinarazpena + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Hurruneko zerbitzariak egiaztapena behar du edukia zerbitzatzeko baina ez du onartu emandako nortasunik - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - qBittorrent agiri elkarbanatze programa bat da. Torrent bati ekiten diozunean, datu hauek eskuragarriak izango dira besteentzako igoeraren bidez. Elkarbanatzen duzun edozein eduki zure erantzunkizunekoa da. + + The Network Access API cannot honor the request because the protocol is not known + Sare Sarbide API-k ezin du eskabidea burutu protokoloa ez delako ezaguna - - No further notices will be issued. - Ez da berri gehiago jaulkiko. + + The requested operation is invalid for this protocol + Eskatutako eragiketa baliogabea da protokolo honentzat - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - qBittorrent agiri elkarbanatze programa bat da. Torrent bati ekiten diozunean, datu hauek eskuragarriak izango dira besteentzako igoeraren bidez. Elkarbanatzen duzun edozein eduki zure erantzunkizunekoa da. -Ez dira jakinarazpen gehiago egingo. + + An unknown network-related error was detected + Sareari-buruzko akats ezezagun bat atzeman da - - Press %1 key to accept and continue... - Sakatu %1 tekla onartu eta jarraitzeko... + + An unknown proxy-related error was detected + Proxyari-buruzko akats ezezagun bat atzeman da - - Legal notice - Legezko Jakinarazpena + + An unknown error related to the remote content was detected + Hurruneko edukiari buruzko akats ezezagun bat atzeman da - - Cancel - Ezeztatu + + A breakdown in protocol was detected + Protokolo matxura bat atzeman da - - I Agree - Onartzen dut + + Unknown error + Akats ezezaguna - - + + Upgrade Eguneratu - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] Gauzak beste modu batean gordetzen dituen bertsio zahar batetik eguneratu zara. Gordetze sistema berrira migratu behar duzu. Ezingo duzu v3.3.0 baino zaharragoa den bertsiorik erabili ahalko berriro. Jarriatu? [y/n]. - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. Gauzak beste modu batean gordetzen dituen bertsio zahar batetik eguneratu zara. Gordetze sistema berrira migratu behar duzu. Jarraitzen baduzu, ezingo duzu v3.3.0 baino zaharragoa den bertsiorik erabili ahalko berriro. - + Couldn't migrate torrent with hash: %1 Ezinezkoa torrenta migratzea, hasha: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 Ezinezkoa torrenta migratzea. Berrekite-azkar agiri izen baliogabea: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 - Programatik irtetze ezgarbia atzeman da. Atzera egitea erabiltzen ezarpenak leheneratzeko: %1 + + Detected unclean program exit. Using fallback file to restore settings. + Programatik irtetze ez garbia atzemanda. Atzerabide agiria erabiltzen ezarpenak leheneratzeko. - + An access error occurred while trying to write the configuration file. Sarbide akats bat gertatu da itxurapen agiria idazten saiatzerakoan. - + A format error occurred while trying to write the configuration file. Heuskarri akats bat gertatu da itxurapen agiria idazten saiatzerakoan. - - - An unknown error occurred while trying to write the configuration file. - Akats ezezagun bat gertatu da itxurapen agirian idazten saiatzerakoan. - - RSS::AutoDownloader + RSS - - - Invalid data format. - Datu heuskarri baliogabea + + Search + Bilaketa - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - Ezin dira RSS Berez-Jeistzaile datuak gorde hemen: %1. Akatsa: %2 + + New subscription + Harpidetza berria - - Invalid data format - Datu heuskarri baliogabea + + + + Mark items read + Markatu gaiak irakurritzat - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - Ezin da RSS Berez-Jeistzailea arauak irakurri hemendik: %1. Akatsa: %2 + + Update all + Eguneratu denak - - Couldn't load RSS AutoDownloader rules. Reason: %1 - Ezin da RSS Berez-Jeistzailea arauak gertatu. Zergaitia: %1 + + RSS Downloader... + RSS Jeistzailea... - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - Hutsegitea RSS jarioa '%1'-ra jeistean. Zergaitia: %2 + + Settings... + Ezarpenak... - - RSS feed at '%1' updated. Added %2 new articles. - RSS jarioa '%1' eguneratuta. Gehituta %2 artikulu berri. + + Torrents: (double-click to download) + Torrentak: (klik-bikoitza jeisteko) - - Failed to parse RSS feed at '%1'. Reason: %2 - Hutsegitea RSS jarioa aztertzean '%1'. Zergaitia: %2 + + + Delete + Ezabatu - - Couldn't read RSS Session data from %1. Error: %2 - Ezinezkoa RSS Saio datuak irakurtzea hemendik: %1. Akatsa: %2` - - - - Couldn't parse RSS Session data. Error: %1 - Ezinezkoa RSS Saio datuak aztertzea. Akatsa: %1 - - - - Couldn't load RSS Session data. Invalid data format. - Ezinezkoa RSS Saio datuak gertatzea. Datu heuskarri baliogabea. - - - - Couldn't load RSS article '%1#%2'. Invalid data format. - Ezinezkoa '%1#%2' RSS artikuloa gertatzea. Datu heuskarri baliogabea. - - - - RSS::Private::Parser - - - Invalid RSS feed. - RSS harpidetza baliogabea. - - - - %1 (line: %2, column: %3, offset: %4). - %1 (lerroa: %2, zutabea: %3, oreka: %4). - - - - RSS::Session - - - RSS feed with given URL already exists: %1. - Jadanik badago emandako URL-arekin RSS harpidetza bat: %1 - - - - Cannot move root folder. - Ezin da erro agiritegia mugitu. - - - - - Item doesn't exist: %1. - Gaia ez dago: %1 - - - - Cannot delete root folder. - Ezin da erro agiritegia ezabatu. - - - - Incorrect RSS Item path: %1. - RSS gai helburu okerra: %1. - - - - RSS item with given path already exists: %1. - Jadanik badago RSS gaia emandako helburuarekin: %1 - - - - Parent folder doesn't exist: %1. - Gaineko agiritegia ez dago: %1 - - - - RSSWidget - - - Search - Bilatu - - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - RSS jarioak lortzea ezgaituta dago orain! Aplikazioaren ezarpenetan gaitu dezakezu. - - - - New subscription - Harpidetza berria - - - - - - Mark items read - Markatu gaiak irakurritzat - - - - Refresh RSS streams - Berritu RSS jarioak - - - - Update all - Eguneratu denak - - - - RSS Downloader... - RSS Jeistzailea... - - - - Torrents: (double-click to download) - Torrentak: (klik-bikoitza jeisteko) - - - - - Delete - Ezabatu - - - + Rename... Berrizendatu... - + Rename Berrizendatu - - + + Update Eguneratu - + New subscription... Harpidetza berria... - - + + Update all feeds - Eguneratu jario guztiak + Eguneratu harpidetza guztiak - + Download torrent Jeitsi torrenta - + Open news URL Ireki URL berriak - + Copy feed URL Kopiatu harpidetza URL-a - + New folder... Agiritegi berria... - + + Refresh RSS streams + Berritu RSS jarioak + + + + RSSImp + + + Stream URL: + Jario URL-a: + + + + Please type a RSS stream URL + Mesedez idatzi RSS jario URL bat + + + + This RSS feed is already in the list. + RSS harpidetza hau jadanik zerrendan dago. + + + Please choose a folder name Mesedez hautatu agiritegi izen bat - + Folder name: Agiritegi izena: - + New folder Agiritegi berria - - Please type a RSS feed URL - Mesedez idatzi RSS jario URL bat - - - - Feed URL: - Kopiatu harpidetza URL-a - - - + Deletion confirmation - Ezabatze baieztapena + Ezabapen baieztapena - + Are you sure you want to delete the selected RSS feeds? Zihur zaude hautaturiko RSS jarioak ezabatzea nahi dituzula? - + Please choose a new name for this RSS feed Mesedez hautatu izen berri bat RSS harpidetza honentzat - + New feed name: Harpidetza berriaren izena: - - Rename failed - Berrizendatze hutsegitea + + Name already in use + Izena jadanik erabilia da + + + + This name is already used by another item, please choose another one. + Izen hau jadanik beste gai batek darabil, mesedez hautatu beste bat. - + Date: - Eguna: + Eguna: - + Author: Egilea: + + + Unread + Irakurri gabea + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + Hutsegitea '%1' torrenta %2 RSS harpidetzatik berezgaitasunez jeistean ez duelako torrent bat edo magnet lotura bat... + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + '%1' torrenta berezgaitasunez jeisten %2 RSS harpidetzatik... + + + + Rss::Private::Parser + + + Invalid RSS feed. + Baliogabeko RSS harpidetza. + + + + RssSettingsDlg + + + RSS Reader Settings + RSS Irakurgailu Ezarpenak + + + + RSS feeds refresh interval: + RSS harpidetza berritze epea: + + + + min + min + + + + Maximum number of articles per feed: + Gehienezko idazlan harpidetza bakoitzeko: + ScanFoldersDelegate - + Select save location Hautatu gordetze kokalekua @@ -7448,274 +6700,268 @@ ScanFoldersModel - + Monitored Folder Monitorizatutako Agiritegia - + Override Save Location Ezeztatu Gordetze Kokalekua - + Monitored folder Monitorizatutako agiritegia - + Default save location Berezko gordetze kokalekua - + Browse... Bilatu... - SearchJobWidget + SearchEngine - - Form - Galdekizuna + + Unknown search engine plugin file format. + Bilaketa gailu plugin agiri heuskarri ezezaguna. - - Results(xxx) - Emaitzak (xxx) + + A more recent version of this plugin is already installed. + Jadanik ezarrita dago bilaketa plugin honen bertsio berriago bat. - - Search in: - Bilatu hemen: + + + Plugin is not supported. + Plugina ez dago sostengatua - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - <html><head/><body><p>Zenbait bilaketa gailuk torrentaren azalpenean eta torrentaren izenean ere bilatzen dute. Horrela azpiko zerrendan erakutsiko diren emaitzak honela agintzen dira.</p><p><span style=" font-weight:600;">Edonon </span>-ek iragazketa ezgaitu eta bilaketa gailuek itzulitako emaitz guztiak erakusten ditu.</p><p><span style=" font-weight:600;">Torrentaren izenak bakarrik</span>-ek bilaketa eskaerarekin bat datozen torrent izenak bakarrik erakusten ditu.</p></body></html> + + Update server is temporarily unavailable. %1 + Eguneraketa zerbitzaria aldibatez eskuraezina dago. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - <html><head/><body><p>Ezarri ahalbidetutako gutxienezko eta gehienezko emaritza zenbatekoa</p></body></html> + + + Failed to download the plugin file. %1 + Hutsegitea plugin agiria jeisterakoan. %1 - - Seeds: - Emaritzak: + + An incorrect update info received. + Eguneraketa argibide okerrak jaso dira. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - <html><head/><body><p>Gutxinezko emaritza zenbatekoa</p></body></html> + + All categories + Kategoria guztiak - - - to - hona + + Movies + Filmak - - <html><head/><body><p>Maximal number of seeds</p></body></html> - <html><head/><body><p>Gehienezko emaritza zenbatekoa</p></body></html> + + TV shows + Telesailak - - - - + + Music + Musika - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - <html><head/><body><p>Ezarri torrent baten ahalbidetutako gutxienezko eta gehienezko neurria</p></body></html> + + Games + Jolasak - - Size: - Neurria: + + Anime + Animazioa - - <html><head/><body><p>Minimal torrent size</p></body></html> - <html><head/><body><p>Gutxienezko torrent neurria</p></body></html> + + Software + Softwarea - - <html><head/><body><p>Maximal torrent size</p></body></html> - <html><head/><body><p>Gehienezko torrent neurria</p></body></html> + + Pictures + Argazkiak + + + + Books + Liburuak + + + + SearchListDelegate + + + + Unknown + Ezezaguna + + + SearchTab - + Name i.e: file name Izena - + Size i.e: file size Neurria - + Seeders i.e: Number of full sources Emaleak - + Leechers i.e: Number of partial sources Izainak - + Search engine Bilaketa gailua - - Filter search results... - Iragazi bilaketa emaitzak... - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results Emaitzak (erakusten <i>%1</i> -> <i>%2</i>-tik): - + Torrent names only Torrentaren izena bakarrik - + Everywhere Edonon - - Use regular expressions - Erabili adierazpen arruntak - - - + Searching... Bilatzen... - + Search has finished Bilaketa amaitu da - + Search aborted Bilaketa utzita - + An error occurred during search... - Akats bat gertatu da bilaketan... + Akats bat gertatu da bilaketan zehar... - + Search returned no results Bilaketak ez du emaitzik itzuli - + Column visibility - Zutabe ikusgarritasuna - - - - SearchPluginManager - - - Unknown search engine plugin file format. - Bilaketa gailu plugin agiri heuskarri ezezaguna. - - - - A more recent version of this plugin is already installed. - Jadanik ezarrita dago plugin honen bertsio berriago bat. + Zutabe ikusgarritasuna - - - Plugin is not supported. - Plugina ez dago sostengatua + + Form + Galdekizuna - - All categories - Kategoria guztiak + + Results(xxx) + Emaitzak (xxx) - - Movies - Filmak + + Search in: + Bilatu hemen: - - TV shows - Telesailak + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Zenbait bilaketa gailuk torrentaren azalpenean eta torrentaren izenean ere bilatzen dute. Horrela azpiko zerrendan erakutsiko diren emaitzak honela agintzen dira.</p><p><span style=" font-weight:600;">Edonon </span>-ek iragazketa ezgaitu eta bilaketa gailuek itzulitako emaitz guztiak erakusten ditu.</p><p><span style=" font-weight:600;">Torrentaren izenak bakarrik</span>-ek bilaketa eskaerarekin bat datozen torrent izenak bakarrik erakusten ditu.</p></body></html> - - Music - Musika + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Ezarri ahalbidetutako gutxienezko eta gehienezko emaritza zenbatekoa</p></body></html> - - Games - Jokoak + + Seeds: + Emaritzak: - - Anime - Animazioa + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Gutxinezko emaritza zenbatekoa</p></body></html> - - Software - Softwarea + + + to + hona - - Pictures - Argazkiak + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Gehienezko emaritza zenbatekoa</p></body></html> - - - Books - Liburuak + + + + + - - Update server is temporarily unavailable. %1 - Eguneraketa zerbitzaria aldibatez eskuraezina dago. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Ezarri torrent baten ahalbidetutako gutxienezko eta gehienezko neurria</p></body></html> - - - Failed to download the plugin file. %1 - Hutsegitea plugin agiria jeisterakoan. %1 + + Size: + Neurria: - - An incorrect update info received. - Eguneraketa argibide okerrak jaso dira. + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Gutxienezko torrent neurria</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - '%1' bilaketa pluginak bertsio kate baliogabea du ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Gehienezko torrent neurria</p></body></html> @@ -7723,198 +6969,185 @@ - - - - + + + Search Bilaketa - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - Ez dago bilaketa pluginik ezarrita -Klikatu "Bilatu pluginak..." botoia leihoaren behe eskuinean zenbait ezartzeko. - - - + Download Jeitsi - + Go to description page Joan azalpen orrialdera - + Copy description page URL Kopiatu azalpen orrialdearen URL-a - + Search plugins... Bilatu pluginak... - + A phrase to search for. Bilatzeko esaldi bat. - + Spaces in a search term may be protected by double quotes. Bilaketa hitzen arteko tarteak adartxo bikoitzekin babestu daitezke. - + Example: Search phrase example Adibidea: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>joan etorri</b>: bilatu <b>joan</b> eta <b>etorri</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;joan etorri&quot;</b>: bilatu <b>joan etorri</b> - + All plugins Plugin guztiak - + Only enabled Gaituak bakarrik - + Select... Hautatu... - - - + + + Search Engine Bilaketa Gailua - + Please install Python to use the Search Engine. Mesedez ezarri Python Bilaketa Gailua erabiltzeko. - + Empty search pattern Bilaketa eredua hutsik - + Please type a search pattern first Mesedez idatzi bilaketa eredua lehenik - + Stop Gelditu - + Search has finished Bilaketa amaitu da - + Search has failed Bilaketak huts egin du - ShutdownConfirmDialog - - - Don't show again - Ez erakutsi orain - + ShutdownConfirmDlg - + qBittorrent will now exit. qBittorrent orain irten egingo da. - + E&xit Now I&rten Orain - + Exit confirmation Irteera baieztapena - + The computer is going to shutdown. Ordenagailua itzaltzear dago. - + &Shutdown Now It&zali Orain - - Shutdown confirmation - Itzaltze baieztapena - - - + The computer is going to enter suspend mode. Ordenagailua egonean moduan sartzear dago. - + &Suspend Now Ego&neratu Orain - + Suspend confirmation Egoneratze baieztapena - + The computer is going to enter hibernation mode. Ordenagailua neguratze moduan sartzear dago. - + &Hibernate Now Neg&uratu Orain - + Hibernate confirmation Neguratze baieztapena - + You can cancel the action within %1 seconds. Ekintza ezezatu dezakezu %1 segundu igaro arte. + + + Shutdown confirmation + Itzaltze baieztapena + SpeedLimitDialog - + KiB/s KiB/s @@ -7922,52 +7155,52 @@ SpeedPlotView - + Total Upload Igoera Guztira - + Total Download Jeitsiera Guztira - + Payload Upload Zama Igoera - + Payload Download Zama Jeisketa - + Overhead Upload Burugain Igoera - + Overhead Download Burugain Jeisketa - + DHT Upload DHT Igoera - + DHT Download DHT Jeisketa - + Tracker Upload Aztarnariak Igota - + Tracker Download Aztarnariak Jeitsita @@ -7975,95 +7208,87 @@ SpeedWidget - + Period: Epea: - + 1 Minute 1 Minutu - + 5 Minutes 5 Minutu - + 30 Minutes 30 Minutu - + 6 Hours 6 Ordu - + Select Graphs Hautatu Grafikoak - + Total Upload Igoera Guztira - + Total Download Jeitsiera Guztira - + Payload Upload Zama Igoera - + Payload Download Zama Jeisketa - + Overhead Upload Burugain Igoera - + Overhead Download Burugain Jeisketa - + DHT Upload DHT Igoera - + DHT Download DHT Jeisketa - + Tracker Upload Aztarnariak Igota - + Tracker Download Aztarnariak Jeitsita - StacktraceDialog - - - Crash info - Matxura argibideak - - - StatsDialog @@ -8076,48 +7301,48 @@ Erabiltzaile estatistikak - - Cache statistics - Katxe estatistikak + + Total peer connections: + Hartzaile elkarketa guztira: - - Read cache hits: - Irakurri katxe arrakastasuak: + + Global ratio: + Maila orokorra: - - Average time in queue: - Bataz-besteko denbora lerroan: + + Alltime download: + Jeitsita orotara: - - Connected peers: - Elkartutako hartzaileak: + + Alltime upload: + Igota orotara: - - All-time share ratio: - Elkarbanatze maila orotara: + + Total waste (this session): + Galduta guztira (saio honetan): - - All-time download: - Jeitsiera orotara: + + Cache statistics + Katxe estatistikak - - Session waste: - Saio hondakina: + + Read cache hits: + Irakurri katxe arrakastasuak: - - All-time upload: - Igoera orotara: + + Average time in queue: + Bataz-besteko denbora lerroan: - Total buffer size: + Total buffers size: Buffer neurria guztira: @@ -8146,7 +7371,12 @@ Lerrokatutako neurria guztira: - + + OK + Ongi + + + %1 ms 18 milliseconds %1 sm @@ -8155,27 +7385,32 @@ StatusBar - + Connection status: Elkarketa egoera: - + No direct connections. This may indicate network configuration problems. Ez dago zuzeneko elkarketarik. Honek adierazi dezake sare itxurapen arazoak daudela. - + DHT: %1 nodes DHT: %1 elkargune - - qBittorrent needs to be restarted! - qBittorrentek berrabiaraztea behar du! + + qBittorrent needs to be restarted + qBittorrentek berrabiarazpena behar du + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent eguneratua izan da eta berrabiarazpena behar du aldaketek eragina izateko. @@ -8194,987 +7429,716 @@ Online - + Click to switch to alternative speed limits Klikatu beste abiadura muga batera aldatzeko - + Click to switch to regular speed limits Klikatu abiadura muga arruntera aldatzeko - + + Manual change of rate limits mode. The scheduler is disabled. + Eskuzko maila muga modu aldaketa. Egitarautzailea ezgaituta dago. + + + Global Download Speed Limit Jeisketa Abiadura Muga Orokorra - + Global Upload Speed Limit Igoera Abiadura Muga Orokorra - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter Denak (0) - + Downloading (0) Jeisten (0) - + Seeding (0) Emaritzan (0) - + Completed (0) Osatuta (0) - + Resumed (0) Berrekinda (0) - + Paused (0) Pausatuta (0) - + Active (0) Jardunean (0) - + Inactive (0) Jardungabe (0) - + Errored (0) Akastuna (0) - + All (%1) Denak (%1) - + Downloading (%1) Jeisten (%1) - + Seeding (%1) Emaritzan (%1) - + Completed (%1) Osatuta (%1) - + Paused (%1) Pausatuta (%1) - + Resumed (%1) Berrekinda (%1) - + Active (%1) Jardunean (%1) - + Inactive (%1) Jardungabe (%1) - + Errored (%1) Akastuna (%1) - TagFilterModel + TorrentContentModel - - Tags - Etiketak + + Name + Izena - - All - Guztiak + + Size + Neurria - - Untagged - Etiketagabea + + Progress + Garapena - - - TagFilterWidget - - Add tag... - Gehitu etiketa... + + Download Priority + Jeitsiera Lehentasuna - - Remove tag - Kendu kategoria + + Remaining + Gelditzen da + + + TorrentCreatorDlg - - Remove unused tags - Kendu erabili gabeko etiketak + + Select a folder to add to the torrent + Hautatu torrentera gehitzeko agiritegi bat - - Resume torrents - Berrekin torrentak + + Select a file to add to the torrent + Hautatu torrentera gehitzeko agiri bat - - Pause torrents - Pausatu torrentak + + No input path set + Ez da ezarri sarrera helbururik - - Delete torrents - Ezabatu torrentak + + Please type an input path first + Mesedez idatzi lehenik sarrera helburu bat - - New Tag - Etiketa Berria + + Select destination torrent file + Hautatu helmuga torrent agira - - Tag: - Etiketa: + + Torrent Files (*.torrent) + Torrent Agiriak (*.torrent) - - Invalid tag name - Etiketa izen baliogabea + + Torrent was created successfully: %1 + %1 is the path of the torrent + Torrenta ongi sortu da: %1 - - Tag name '%1' is invalid - '%1' etiketa izena baliogabea da + + + + Torrent creation + Torrent sortzea - - Tag exists - Etiketa badago + + Torrent creation was unsuccessful, reason: %1 + Torrenta sortzea ez da egin, zergaitia: %1 - - Tag name already exists. - Etiketa izena badago jadanik. + + Created torrent file is invalid. It won't be added to download list. + Sortutako torrent agiria baliogabea da. Ez da jeisketa zerrendara gehitu. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Torrent Kategoriaren Ezaugarriak + + Name + i.e: torrent name + Izena - - Name: - Izena: + + Size + i.e: torrent size + Neurria - - Save path: - Gordetze helburua: + + Done + % Done + Eginda - - Choose save path - Hautatu gordetze helburua + + Status + Torrent status (e.g. downloading, seeding, paused) + Egoera - - New Category - Katagoria Berria + + Seeds + i.e. full sources (often untranslated) + Emaritzak - - Invalid category name - Kategoria izen baliogabea + + Peers + i.e. partial sources (often untranslated) + Hartzaileak - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - Kategoria izenak ezin du '\' izan. -Kategoria izena ezin da '/'-rekin hasi/amaitu. -Kategoria izenak ezin du '//' sekuentzia izan. + + Down Speed + i.e: Download speed + Jeisketa Abiadura - - Category creation error - Kategoria sortze akatsa + + Up Speed + i.e: Upload speed + Igoera Abiadura - - Category with the given name already exists. -Please choose a different name and try again. - Jadanik badago emandako izena duen kategoria. -Mesedez hautatu beste izen bat eta saiatu berriro. + + Ratio + Share ratio + Maila - - - TorrentContentModel - - Name - Izena + + ETA + i.e: Estimated Time of Arrival / Time left + UED - - Size - Neurria + + Category + Kategoria - - Progress - Garapena + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Gehituta - - Download Priority - Jeitsiera Lehentasuna + + Completed On + Torrent was completed on 01/01/2010 08:00 + Osatuta - - Remaining - Gelditzen da + + Tracker + Aztarnaria - - Availability - Eskuragarritasuna + + Down Limit + i.e: Download limit + Jeisketa Muga - - - TorrentCreatorDialog - - Torrent Creator - Torrent Sortzailea + + Up Limit + i.e: Upload limit + Igoera Muga - - Select file/folder to share - Hautatu elkarbanatzeko agiri/tagiritegia + + Downloaded + Amount of data downloaded (e.g. in MB) + Jeitsita - - Path: - Helburua: + + Uploaded + Amount of data uploaded (e.g. in MB) + Igota - - [Drag and drop area] - [Arrastatu eta askatu eremua] + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Saio Jeisketa - - - Select file - Hautatu agiria + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Saio Igoera - - - Select folder - Hautatu agiritegia + + Remaining + Amount of data left to download (e.g. in MB) + Gelditzen da - - Settings - Ezarpenak + + Time Active + Time (duration) the torrent is active (not paused) + Denbora Ekinean - - Piece size: - Atal neurria: + + Save path + Torrent save path + Gordetze helburua - - Auto - Berez + + Completed + Amount of data completed (e.g. in MB) + Osatuta - - 16 KiB - 16 KiB + + Ratio Limit + Upload share ratio limit + Maila Muga - - 32 KiB - 32 KiB + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Azken Ikusaldia Osorik - - 64 KiB - 64 KiB + + Last Activity + Time passed since a chunk was downloaded/uploaded + Azken Jarduera - - 128 KiB - 128 KiB + + Total Size + i.e. Size including unwanted data + Neurria Guztira + + + TrackerFiltersList - - 256 KiB - 256 KiB + + All (0) + this is for the tracker filter + Denak (0) - - 512 KiB - 512 KiB + + Trackerless (0) + Aztarnarigabe (0) - - 1 MiB - 1 MiB + + Error (0) + Akatsa (0) - - 2 MiB - 2 MiB + + Warning (0) + Kontuz (0) - - 4 MiB - 4 MiB + + + Trackerless (%1) + Aztarnarigabe (%1) - - 8 MiB - 8 MiB + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - 16 MiB - 16 MiB + + + Error (%1) + Akatsa (%1) - - 32 MiB - 32 MiB + + + Warning (%1) + Kontuz (%1) - - Calculate number of pieces: - Kalkulatu atal kopurua: + + Resume torrents + Berrekin torrentak - - Private torrent (Won't distribute on DHT network) - Torrent pribatua (Ez da DHT sarean banatzen) + + Pause torrents + Pausatu torrentak - - Start seeding immediately - Hasi emaritza berehala + + Delete torrents + Ezabatu torrentak - - Ignore share ratio limits for this torrent - Ezikusi elkarbanatze maila mugak torrent honentzat + + + All (%1) + this is for the tracker filter + Denak (%1) + + + TrackerList - - Optimize alignment - Hoberendu lerrokapena + + URL + URL-a - - Fields - Eremuak + + Status + Egoera - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - Lerro huts batekin banandu ditzakezu aztarnari mailak / taldeak. - - - - Web seed URLs: - Web emaritza URL-ak: - - - - Tracker URLs: - Aztarnari URL-ak: - - - - Comments: - Aipamenak: - - - - Source: - Iturburua: - - - - Progress: - Garapena: - - - - Create Torrent - - - - - - - Torrent creation failed - - - - - Reason: Path to file/folder is not readable. - - - - - Select where to save the new torrent - - - - - Torrent Files (*.torrent) - - - - - Reason: %1 - - - - - Reason: Created torrent is invalid. It won't be added to download list. - - - - - Torrent creator - - - - - Torrent created: + + Received - - - TorrentInfo - - - File size exceeds max limit %1 - Agiri neurriak geh muga %1 gainditzen du - - - Torrent file read error: %1 - + + Seeds + Emaritzak - - Torrent file read error: size mismatch - + + Peers + Hartzaileak - - - TorrentsController - - Not contacted yet - Harremandu gabe oraindik + + Downloaded + Jeitsita - - Updating... - Eguneratzen... + + Message + Mezua - + + Working Lanean - - Not working - Lan gabe - - - - Error: '%1' is not a valid torrent file. - Akatsa: '%1' ez da baliozko torrent agiria. - - - - - - - - - Torrent queueing must be enabled - Torrent lerrokapena gaituta egon behar da - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - - Cannot make save path - - - - - Cannot write to directory - - - - - WebUI Set location: moving "%1", from "%2" to "%3" - WebEI Ezarpen kokalekua: mugitzen "%1", hemendik "%2" hona "%3" - - - - Incorrect torrent name - Torrent izen okerra - - - - - Incorrect category name - Kategoria izen okerra - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - Denak (0) - - - - Trackerless (0) - Aztarnarigabe (0) - - - - Error (0) - Akatsa (0) - - - - Warning (0) - Kontuz (0) - - - - - Trackerless (%1) - Aztarnarigabe (%1) - - - - - Error (%1) - Akatsa (%1) - - - - - Warning (%1) - Kontuz (%1) - - - - Resume torrents - Berrekin torrentak - - - - Pause torrents - Pausatu torrentak - - - - Delete torrents - Ezabatu torrentak - - - - - All (%1) - this is for the tracker filter - Denak (%1) - - - - TrackerListWidget - - - - Working - Lanean - - - + Disabled - Ezgaituta + Ezgaituta - + This torrent is private - + Torrent hau pribatua da - + Updating... - Eguneratzen... + Eguneratzen... - + Not working - Lan gabe + Lan gabe - + Not contacted yet - Harremandu gabe oraindik + Harremandu gabe oraindik - - - - - - - N/A - E/G + + Tracker URL: + Aztarnari URL-a: - + Tracker editing - - - - - Tracker URL: - + Aztarnari edizioa - - + + Tracker editing failed - + Aztarnari edizio hutsegitea - + The tracker URL entered is invalid. - + Sartutako aztarnari URL-a baliogabea da. - + The tracker URL already exists. - + Aztarnari URL-a jadanik badago. - + Add a new tracker... - - - - - Remove tracker - + Gehitu aztarnari berri bat... - + Copy tracker URL - + Kopiatu aztarnari URL-a - + Edit selected tracker URL - + Editatu hautaturiko aztarnari URL-a - + Force reannounce to selected trackers - + Behartu hautaturiko aztarnarien ber-iragarpena - + Force reannounce to all trackers - + Behartu aztarnari guztien ber-iragarpena - - URL - - - - - Status - Egoera - - - - Received - - - - - Seeds - - - - - Peers - Hartzaileak - - - - Downloaded - Jeitsita - - - - Message - - - - - Column visibility - Zutabe ikusgarritasuna + + Remove tracker + Kendu aztarnaria - TrackerLoginDialog - - - - Tracker authentication - - - - - Tracker: - - - - - Login - Hasi Saioa - - - - Username: - Erabiltzaile-izena: - + TrackersAdditionDlg - - Password: - Sarhitza: + + Trackers addition dialog + Aztarnari gehitze elkarrizketa - - Log in - + + List of trackers to add (one per line): + Gehitzeko aztarnarien zerrenda (bat lerroko): - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + µTorrentekin bateragarria den zerrenda URL-a: - - List of trackers to add (one per line): - + + I/O Error + S/I Akatsa - - µTorrent compatible list URL: - + + Error while trying to open the downloaded file. + Akatsa jeitsitako agiria irekitzen saiatzerakoan. - + No change - + Aldaketarik ez - + No additional trackers were found. - + Ez da aztarnari gehigarririk aurkitu. - + Download error - Jeisketa akatsa + Jeisketa akatsa - + The trackers list could not be downloaded, reason: %1 - + Aztarnari zerrenda ezin da jeitsi, zergaitia: %1 TransferListDelegate - + Downloading Jeisten - + Downloading metadata used when loading a magnet link Metadatuak jeisten - + Allocating qBittorrent is allocating the files on disk Esleitzen - + Paused Pausatuta - + Queued i.e. torrent is queued Lerrokatuta - + Seeding Torrent is complete and in upload-only mode Emaritzan - + Stalled Torrent is waiting for download to begin Geldituta - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [B] Jeisten - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [B] Emaritzen - + Checking Torrent local data is being checked Egiaztapena - + Queued for checking i.e. torrent is queued for hash checking Egiaztapenerako lerrokatuta - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Datu berrekitea egiaztatzen - + Completed Osatuta - - Moving - Torrent local data are being moved/relocated - Mugitzen - - - + Missing Files Ez dauden Agiriak - + Errored torrent status, the torrent has an error Akastuna - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (emarituta %2) - + %1 ago e.g.: 1h 20m ago duela %1 @@ -9183,579 +8147,593 @@ TransferListFiltersWidget - + Status - Egoera - - - - Categories - Kategoriak - - - - Tags - Etiketak - - - - Trackers - Aztarnariak - - - - TransferListModel - - - Name - i.e: torrent name - Izena - - - - Size - i.e: torrent size - Neurria - - - - Done - % Done - - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Egoera - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - Hartzaileak - - - - Down Speed - i.e: Download speed - Jeisketa Abiadura - - - - Up Speed - i.e: Upload speed - Igoera Abiadura - - - - Ratio - Share ratio - - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - Kategoria - - - - Tags - Etiketak - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Jeitsita - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Igota - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - Gelditzen da - - - - Time Active - Time (duration) the torrent is active (not paused) - - - - - Save path - Torrent save path - - - - - Completed - Amount of data completed (e.g. in MB) - Osatuta - - - - Ratio Limit - Upload share ratio limit - - - - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + Egoera - - Last Activity - Time passed since a chunk was downloaded/uploaded - + + Categories + Kategoriak - - Total Size - i.e. Size including unwanted data - + + Trackers + Aztarnariak TransferListWidget - + Column visibility Zutabe ikusgarritasuna - + Choose save path Hautatu gordetzeko helburua - + Torrent Download Speed Limiting Torrent Jeisketa Abiadura Muga - + Torrent Upload Speed Limiting Torrent Igoera Abiadura Muga - + Recheck confirmation Berregiaztatu baieztapena - + Are you sure you want to recheck the selected torrent(s)? Zihur zaude hautaturiko torrenta(k) berregiaztatzea nahi d(it)uzula? - + Rename Berrizendatu - + New name: Izen berria: - + Resume Resume/start the torrent Berrekin - + Force Resume Force Resume/start the torrent Behartu Berrekitea - + Pause Pause the torrent Pausatu - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Ezarri kokapena: "%1" mugitzen, "%2"-tik "%3"-ra - - - - Add Tags - Gehitu Etiketak - - - - Remove All Tags - Kendu Etiketa Guztiak - - - - Remove all tags from selected torrents? - Kendu etiketa guztiak hautatutako torrentetatik? + + New Category + Kategoria Berria - - Comma-separated tags: - Kakotxaz-banandutako etiketak: + + Category: + Kategoria: - - Invalid tag - Etiketa baliogabea + + Invalid category name + Kategoria izen baliogabea - - Tag name: '%1' is invalid - Etiketa izena: '%1' baliogabea da + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Kategoria izenak ezin du '\' izan. +Kategoria izenak ez da hasi/amaitu behar '/'-rekin. +Kategoria izenak ezin du '//' sekuentzia izan. - + Delete Delete the torrent Ezabatu - + Preview file... Agiri aurreikuspena... - + Limit share ratio... Mugatu elkarbanatze maila... - + Limit upload rate... Mugatu igoera neurria... - + Limit download rate... Mugatu jeisketa neurria... - + Open destination folder Ireki helmuga agiritegia - + Move up i.e. move up in the queue Mugitu gora - + Move down i.e. Move down in the queue Mugitu behera - + Move to top i.e. Move to top of the queue Mugitu goren - + Move to bottom i.e. Move to bottom of the queue Mugitu beheren - + Set location... Ezarri kokalekua... - - Force reannounce - Behartu berriragarpena - - - + Copy name Kopiatu izena - - Copy hash - Kopiatu hasha - - - + Download first and last pieces first Jeitsi lehen eta azken atalak lehenik - + Automatic Torrent Management Berezgaitasunezko Torrent Kudeaketa - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category Berezgaitasunezko moduak esanahi du torrent ezaugarri ugari (adib. gordetze helburua) elkartutako kategoriaren arabera erabakiko direla - + Category Kategoria - + New... New category... Berria... - + Reset Reset category Berrezarri - - Tags - Etiketak - - - - Add... - Add / assign multiple tags... - Gehitu... - - - - Remove All - Remove all tags - Kendu Guztiak - - - + Priority Lehentasuna - + Force recheck Behartu berregiaztapena - + Copy magnet link Kopiatu magnet lotura - + Super seeding mode Gain emaritza modua - + Rename... Berrizendatu... - + Download in sequential order Jeitsi sekuentzialki - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + Torrent Igoera/Jeisketa Maila Muga - - Use global share limit - + + Use global ratio limit + Erabili maila muga orokorra - - - + + + buttonGroup - + botoi-Multzoa - - Set no share limit - + + Set no ratio limit + Ezarri maila mugarik gabe - - Set share limit to - + + Set ratio limit to + Ezarri maila muga honela + + + + WebApplication + + + Incorrect category name + Kategoria izen okerra + + + WebUI - - ratio - maila + + The Web UI is listening on port %1 + Web EI %1 atakan ari da aditzen - - minutes - minutu + + Web UI Error - Unable to bind Web UI to port %1 + Web EI Akatsa - Ezinezkoa Web EI %1 atakara lotzea + + + about - - No share limit method selected - + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + BitTorrent bezero aurreratua C++-rekin programatua, Qt toolkit-ean eta libtorrent-rasterbar-en ohinarrituta. - - Please select a limit method first - + + Copyright %1 2006-2016 The qBittorrent project + Copyrighta %1 2006-2016 qBittorrent egitasmoa + + + + Home Page: + Etxeko Orrialdea: + + + + Forum: + Eztabaidagunea: + + + + Bug Tracker: + Akats Aztarnaria: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - + + Add Peers + Gehitu Hartzaileak - - Python not detected - + + List of peers to add (one per line): + Gehitzeko hartzaileen zerrenda (bat lerroko): + + + + Format: IPv4:port / [IPv6]:port + Heuskarria: IPv4:ataka / [IPv6]:ataka - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - Agiri mota onartezina, ohiko agiriak bakarrik ahalbidetzen dira. + + + Tracker authentication + Aztarnari egiaztapena - - Symlinks inside alternative UI folder are forbidden. - Symloturak EI alternatiboaren agiritegiaren barne eragotzita daude. + + Tracker: + Aztarnaria: - - Exceeded the maximum allowed file size (%1)! - Ahalbidetutako gehienezko neurria gaindituta (%1)! + + Login + Hasi Saioa - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - WebEI: Jatorri idazburua eta Etiketa jatorria ez datoz bat! Iturburu IP-a: '%1'. Jatorri idazburua: '%2'. Xede jatorria: '%3' + + Username: + Erabiltzaile-izena: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - WebEI: Jatorri idazburua eta Etiketa jatorria ez datoz bat! Iturburu IP-a: '%1'. Jatorri idazburua: '%2'. Xede jatorria: '%3' + + Password: + Sarhitza: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - WebEI: Hostalari idazburu baliogabea, ataka ez dator bat! Eskera Iturburu IP-a: '%1'. Zerbitzari ataka: '%2'. Jasotako Hostalar idazburua: '%3'. + + Log in + Hasi saioa - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - WebEI: Hostalari idazburu baliogabea. Eskaturiko iturburu IP-a: '%1'. Jasotako Hostalari idazburua: '%2' + + Cancel + Ezeztatu - WebUI + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + Ezabapen baieztapena - qBittorrent + + + + Remember choice + Gogoratu aukera + + + + Also delete the files on the hard disk + Ezabatu agiriak diska gogorrean ere + + + + confirmShutdownDlg + + + Don't show again + Ez erakutsi orain + + + + createTorrentDialog + + + Cancel + Ezeztatu + + + + Torrent Creation Tool + Torrent Sortze Tresna + + + + Torrent file creation + Torrent agiri sortzea + + + + Add file + Gehitu agiria + + + + Add folder + Gehitu agiritegia + + + + File or folder to add to the torrent: + Torrentera gehitzeko agiria edo agiritegia: + + + + Tracker URLs: + Aztarnari URL-ak: + + + + Web seeds urls: + Web emaritza url-ak: + + + + Comment: + Aipamena: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Lerro huts batekin banandu ditzakezu aztarnari mailak / taldeak. + + + + Piece size: + Atal neurria: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + Berez + + + + Private (won't be distributed on DHT network if enabled) + Pribatua (ez da DHT sarean banatzen gaituta badago) + - - Web UI: HTTPS setup successful - Web EI: HTTPS ezarpena ongi egin da + + Start seeding after creation + Hasi emaritza sortu ondoren - - Web UI: HTTPS setup failed, fallback to HTTP - Web EI: HTTPS ezarpen hutsegitea, HTTP-ra itzultzen + + Ignore share ratio limits for this torrent + Ezikusi elkarbanatze maila mugak torrent honentzat + + + + Create and save... + Sortu eta gorde... + + + + Progress: + Garapena: + + + + downloadFromURL + + + Add torrent links + Gehitu torrent loturak + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Bat lerroko (HTTP loturak, Magnet loturak eta info-hashak sostengatuta) + + + + Download + Jeitsi + + + + Cancel + Ezeztatu + + + + Download from urls + Jeitsi url-tatik + + + + No URL entered + Ez da URL-rik sartu - - Web UI: Now listening on IP: %1, port: %2 - Web EI: Orain aditzen IP-an: %1, ataka: %2 + + Please type at least one URL. + Mesedez idatzi URL bat gutxinez. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Web EI: Ezinezkoa IP-ra lotzea: %1, ataka: %2. Zergaitia: %3 + + Crash info + Matxura argibideak fsutils - + + + + + Downloads Jeisketak @@ -9763,100 +8741,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + Python ez da atzeman + + + + Python version: %1 + Python bertsioa: %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1o %2m - + %1d %2h e.g: 2days 10hours %1e %2o - + Unknown Unknown (size) Ezezaguna - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent-ek orain ordenagailua itzaliko du jeisketa guztiak osatu direlako. - + < 1m < 1 minute < 1m - + %1m e.g: 10minutes %1m + + + Working + Lanean + + + + Updating... + Eguneratzen... + + + + Not working + Lan gabe + + + + Not contacted yet + Harremandu gabe oraindik + preview - + Preview selection Aurreikuspen hautapena - + The following files support previewing, please select one of them: Hurrengo agiriek aurreikuspena sostengatzen dute, mesedez hautatu bat: + + + Preview + Aurreikuspena + + + + Cancel + Ezeztatu + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_fi.ts qbittorrent-3.3.15/src/lang/qbittorrent_fi.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_fi.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_fi.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - + Tietoja qBittorrentista - + About - + Yleistä - + Author - - - - - Current maintainer - + Tekijä - - Greece - Kreikka + + + Nationality: + Kansallisuus - - - Nationality: - + + + Name: + Nimi: - - + + E-mail: - + Sähköposti: - - - Name: - Nimi: + + Greece + Kreikka - - Original author - + + Current maintainer + Nykyinen ylläpitäjä - - France - Ranska + + Original author + Alkuperäinen kehittäjä - + Special Thanks - + Erityiskiitokset - + Translators - + Suomentajat - - License - - - - + Libraries - + Kirjastot - + qBittorrent was built with the following libraries: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - - - - - Forum: - + + France + Ranska - - Bug Tracker: - + + License + Lisenssi @@ -115,64 +90,74 @@ Tallennuskohde - + + Browse... + Selaa... + + + + Set as default save path + Aseta tallennuksen oletussijainniksi + + + Never show again Älä näytä tätä uudelleen - + Torrent settings Torrentin asetukset - + Set as default category Aseta oletuskategoriaksi - + Category: Kategoria: - + Start torrent Aloita torrent - + Torrent information Torrentin tiedot - + Skip hash check Ohita tarkistussumman laskeminen - + Size: Koko: - + Hash: Tarkistussumma: - + Comment: Kommentti: - + Date: Päiväys: Torrent Management Mode: - Torrentien Hallintatila: + @@ -182,242 +167,226 @@ Manual - Manuaalinen + Automatic - Automaattinen - - - - Remember last used save path - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - Kun valittu, .torrent-tiedostoa ei poisteta "Lataukset"-sivun asetuksista huolimatta + - + Do not delete .torrent file - Älä poista .torrent-tiedostoa - - - - Create subfolder - Luo alikansio - - - - Download in sequential order - Lataa järjestyksessä - - - - Download first and last pieces first - Lataa ensin ensimmäinen ja viimeinen osa + - + Normal Normaali - + High Korkea - + Maximum Suurin - + Do not download Älä lataa - - - + + + I/O Error I/O-virhe - + Invalid torrent Virheellinen torrent - - Renaming - Nimetään uudelleen - - - - - Rename error - Virhe nimettäessä uudelleen + + + + + Already in download list + On jo latausluettelossa - - The name is empty or contains forbidden characters, please choose a different one. - Nimi on tyhjä tai se sisältää kiellettyjä merkkejä, valitse toinen. - - - + Not Available This comment is unavailable Ei saatavilla - + Not Available This date is unavailable Ei saatavilla - + Not available Ei saatavilla - + Invalid magnet link Virheellinen magnet-linkki - + The torrent file '%1' does not exist. - Torrent-tiedostoa '%1' ei ole olemassa. + - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. - Torrent-tiedostoa ei voida lukea levyltä. Sinulta voi puuttua käyttöoikeuksia. + - + Failed to load the torrent: %1. Error: %2 Don't remove the ' ' characters. They insert a newline. - Torrentin lataaminen epäonnistui: %1 -Virhe: %2 + - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torrent on jo latauslistalla. Seurantapalvelimia ei yhdistetty, koska kyseessä on yksityinen torrent. + + + + Torrent is already in download list. Trackers were merged. + Torrent on jo latauslistalla. Seurantapalvelimet yhdistettiin. + + + + + Cannot add torrent + Torrenttia ei voida lisätä + + + + Cannot add this torrent. Perhaps it is already in adding state. + Torrenttia ei voida lisätä. Tämä voi johtua siitä että sitä ollaan jo lisäämässä. + + + This magnet link was not recognized Tätä magnet-linkkiä ei tunnistettu - + + Magnet link is already in download list. Trackers were merged. + Magnet-linkki on jo latauslistalla. Seurantapalvelimet yhdistettiin. + + + + Cannot add this torrent. Perhaps it is already in adding. + Torrenttia ei voida lisätä. Tämä voi johtua siitä että sitä ollaan jo lisäämässä. + + + Magnet link Magnet-linkki - + Retrieving metadata... Noudetaan metatietoja... - + Not Available This size is unavailable. Ei saatavilla - + Free space on disk: %1 Vapaata tilaa levyllä: %1 - + + Choose save path - Valitse tallennussijainti - - - - - - - - - Torrent is already present - + Valitse tallennuskansio - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - + + Rename the file + Nimeä tiedosto uudelleen - - Torrent is already queued for processing. - - - - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + + New name: + Uusi nimi: - - Magnet link is already queued for processing. - + + + The file could not be renamed + Tiedostoa ei voitu nimetä uudelleen - - New name: - Uusi nimi: + + This file name contains forbidden characters, please choose a different one. + Tämä tiedostonimi sisältää kiellettyjä merkkejä, valitse toinen tiedostonimi. - - + + This name is already in use in this folder. Please use a different name. Tämä nimi on jo käytössä tässä kansiossa. Käytä toista nimeä. - + The folder could not be renamed Kansiota ei voitu nimetä uudelleen - + Rename... Nimeä uudelleen... - + Priority Tärkeysaste - + Invalid metadata - Virheellinen metadata + - + Parsing metadata... Jäsennetään metatietoja... - + Metadata retrieval complete Metatietojen noutaminen valmis - + Download Error Latausvirhe @@ -425,312 +394,198 @@ AdvancedSettings - + + Disk write cache size + Levykirjoituksen välimuistin koko + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Uloslähtevät portit (minimi) [0: ei käytössä] - + Outgoing ports (Max) [0: Disabled] Uloslähtevät portit (maksimi) [0: ei käytössä] - + Recheck torrents on completion Tarkista torrentit uudelleen niiden valmistuttua - + Transfer list refresh interval Siirtolistan päivitystiheys - + ms milliseconds ms - + Setting Asetus - + Value Value set for this setting Arvo - - - (disabled) - (ei käytössä) - - - + (auto) (autom.) - - min - minutes - min - - - + All addresses - Kaikki osoitteet + - + qBittorrent Section qBittorrentin asetukset - - + + Open documentation Avaa dokumentaatio - + libtorrent Section libtorrentin asetukset - - Asynchronous I/O threads - - - - - Disk cache - Levyn välimuisti - - - + s seconds s - + Disk cache expiry interval - Levyn välimuistin päättymisväli - - - - Enable OS cache - Ota käyttöön käyttöjärjestelmän välimuisti - - - - Guided read cache - Opastettu lukuvälimuisti - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - - - - - - KiB - KiB - - - - Send buffer watermark - - - - - Send buffer low watermark - - - - - Send buffer watermark factor - - - - - Prefer TCP - - Peer proportional (throttles TCP) + + Enable OS cache - - Allow multiple connections from the same IP address - Salli useita yhteyksiä samasta IP-osoitteesta + + m + minutes + min - + Resolve peer countries (GeoIP) Selvitä käyttäjien kotimaat (GeoIP) - + Resolve peer host names Selvitä käyttäjien isäntänimet - + Strict super seeding Tiukka super seed - + Network Interface (requires restart) Verkkoliitäntä (vaatii uudelleenkäynnistyksen) - + Optional IP Address to bind to (requires restart) - Valinnainen IP-osoite, johon sidotaan (vaatii uudelleenkäynnistyksen) + - + Listen on IPv6 address (requires restart) Kuuntele IPv6-osoitetta (vaatii uudelleenkäynnistyksen) - + Display notifications - Näytä ilmoitukset - - - - Display notifications for added torrents - Näytä ilmoitukset lisätyille torrenteille - - - - Download tracker's favicon - Lataa Seurantapalvelimen favicon - - - - Save path history length - - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - Lähetyspaikkojen käyttäytyminen - - - - Round-robin - - Fastest upload + + Display notifications for added torrents - - Anti-leech + + Download tracker's favicon - - Upload choking algorithm - Lähetyksen kuristusalgoritmi - - - + Confirm torrent recheck Vahvista torrentin uudelleentarkistus - - Confirm removal of all tags - Vahvista kaikkien tunnisteiden poistaminen - - - - Always announce to all trackers in a tier - + Exchange trackers with other peers + Vaihda seurantapalvelimia muiden käyttäjien kanssa - - Always announce to all tiers + + Always announce to all trackers - + Any interface i.e. Any network interface Mikä tahansa liitäntä - + Save resume data interval How often the fastresume file is saved. - Tallenna jatkamistietojen aikaväli - - - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - + Maximum number of half-open connections [0: Unlimited] - Puoliavointen yhteyksien enimmäismäärä [0: Rajoittamaton] + - + IP Address to report to trackers (requires restart) Seurantapalvelimille raportoitava IP-osoite (vaatii uudelleenkäynnistyksen) - + Enable embedded tracker - Ota käyttöön upotettu seurantapalvelin + - + Embedded tracker port - Upotetun seurantapalvelimen portti + - + Check for software updates Tarkista ohjelmistopäivitykset - + Use system icon theme Käytä järjestelmän kuvaketeemaa @@ -738,120 +593,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started - qBittorrent %1 käynnistyi + - + Torrent: %1, running external program, command: %2 - - Torrent name: %1 - Torrentin nimi: %1 - - - - Torrent size: %1 - Torrentin koko: %1 - - - - Save path: %1 - Tallennuskohde: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Torrentin lataus kesti %1. - - - - Thank you for using qBittorrent. - Kiitos kun käytit qBittorrentia. - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] %1 on valmistunut + + Torrent: %1, run external program command too long (length > %2), execution failed. + - + Torrent: %1, sending mail notification - Torrentti: %1, lähetetään sähköposti-ilmoitus + - + Information - Tiedot + Tiedot - - To control qBittorrent, access the Web UI at %1 - + + To control qBittorrent, access the Web UI at http://localhost:%1 + Ohjaa qBittorrentia selainkäyttöliittymän kautta osoitteessa http://localhost:%1 - + The Web UI administrator user name is: %1 Selainkäyttöliittymän ylläpitäjän käyttäjätunnus on: %1 - + The Web UI administrator password is still the default one: %1 Selainkäyttöliittymän ylläpitäjän salasana on edelleen oletus: %1 - + This is a security risk, please consider changing your password from program preferences. Tämä on turvallisuusriski. Kannattaa harkita salasanan vaihtamista ohjelman asetuksista. - + Saving torrent progress... Tallennetaan torrentin edistymistä... - - - Portable mode and explicit profile directory options are mutually exclusive - - - - - Portable mode implies relative fastresume - - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - IP-osoitteesi on hylätty liian monen epäonnistuneen tunnistautumisyrityksen vuoksi. - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Tallenna kohteeseen: @@ -861,816 +657,660 @@ RSS-lataaja - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - RSS-torrenttien automaattinen lataus on nyt poistettu käytöstä! Voit ottaa sen käyttöön sovellusasetuksista. + + Enable Automated RSS Downloader + Käytä automaattista RSS-lataajaa - + Download Rules Lataussäännöt - + Rule Definition - Säännön määrittäminen + - + Use Regular Expressions - Käytä säännöllisiä lausekkeita - - - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - Use Smart Episode Filter - Käytä älykästä jaksosuodatinta - - - + Must Contain: - Täytyy sisältää: + Sisältää: - + Must Not Contain: Ei saa sisältää: - + Episode Filter: - Jaksosuodatin: + - + Assign Category: - Määritä kategoria: + - + Save to a Different Directory - Tallenna toiseen hakemistoon + - + Ignore Subsequent Matches for (0 to Disable) ... X days - Ohita myöhemmät osumat (0: Ei käytössä) + - + Disabled - Ei käytössä + Ei käytössä - + days - päivää + päivää - + Add Paused: - Lisää Keskeytetty; + - + Use global settings Käytä yleisiä asetuksia - + Always Aina - + Never - Ei koskaan + Ei koskaan - + Apply Rule to Feeds: - Käytä sääntöä syötteisiin: + - + Matching RSS Articles - Vastaavat RSS-artikkelit + - + &Import... - &Tuo... + - + &Export... - &Vie... + - + Matches articles based on episode filter. - + Example: Esimerkki: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match - + Episode filter rules: - Jaksosuodatin säännöt: + - + Season number is a mandatory non-zero value - Tuotantokauden numero on oltava enemmän kuin nolla + - + Filter must end with semicolon - Suodattimen on päätyttävä puolipisteeseen + - + Three range types for episodes are supported: - + Single number: <b>1x25;</b> matches episode 25 of season one - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one - + Episode number is a mandatory positive value - Jakson numero on oltava positiivinen arvo - - - - Rules - - - - - Rules (legacy) - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - + Last Match: %1 days ago - + Last Match: Unknown - + New rule name Uuden säännön nimi - + Please type the name of the new download rule. Anna uuden lataussäännön nimi. - - + + Rule name conflict Ristiriita säännön nimessä - - + + A rule with this name already exists, please choose another name. Samalla nimellä oleva sääntö on jo olemassa, valitse toinen nimi. - + Are you sure you want to remove the download rule named '%1'? - Haluatko varmasti poistaa lataussäännön '%1'? + - + Are you sure you want to remove the selected download rules? Haluatko varmasti poistaa valitut lataussäännöt? - + Rule deletion confirmation Säännön poistamisen vahvistus - + Destination directory Kohdekansio - + Invalid action - + Virheellinen toiminto - + The list is empty, there is nothing to export. - + Luettelo on tyhjä, ei mitään vietävää. - - Export RSS rules - Vie RSS säännöt + + Where would you like to save the list? + Mihin haluat tallentaa luettelon? - - + + Rules list (*.rssrules) + Sääntöluettelo (*.rssrules) + + + I/O Error I/O-virhe - - Failed to create the destination file. Reason: %1 - + + Failed to create the destination file + Kohdetiedoston luominen epäonnistui - - Import RSS rules - Tuo RSS säännöt + + Please point to the RSS download rules file + - - Failed to open the file. Reason: %1 + + Rules list - + Import Error Tuontivirhe - - Failed to import the selected rules file. Reason: %1 - Valitun sääntöluettelon tuonti epäonnistui. Syy: %1 + + Failed to import the selected rules file + Valitun sääntöluettelon tuonti epäonnistui - + Add new rule... Lisää uusi sääntö... - + Delete rule Poista sääntö - + Rename rule... Nimeä sääntö uudelleen... - + Delete selected rules Poista valitut säännöt - - Clear downloaded episodes... - - - - + Rule renaming Säännön nimeäminen uudelleen - + Please type the new rule name Anna uuden säännön nimi - - Clear downloaded episodes - Tyhjennä ladatut jaksot - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - Regex-tila: käytä Perl-yhteensopivia säännöllisiä lausekkeita - - - - - Position %1: %2 - Sijainti %1: %2 + + Regex mode: use Perl-like regular expressions + Regex-tila: käytä Perlin kaltaisia säännöllisiä lausekkeita - + Wildcard mode: you can use - Jokerimerkkitila: voit käyttää + - + ? to match any single character - ? vastaamaan mitä tahansa yksittäistä merkkiä + - + * to match zero or more of any characters - * vastaamaan nolla tai enemmän mitä tahansa merkkiä + - + Whitespaces count as AND operators (all words, any order) - + | is used as OR operator - | käytetään OR-operaattorina + - + If word order is important use * instead of whitespace. - Jos sanajärjestys on tärkeä, käytä * välilyönnin sijaan. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - + will match all articles. - + will exclude all articles. - Sulkee pois kaikki artikkelit. + - BanListOptionsDialog - - - List of banned IP addresses - - + BitTorrent::Session - - Ban IP + + Restart is required to toggle PeX support - - Delete - Poista - - - - - Warning + + Embedded Tracker [ON] - - The entered IP address is invalid. + + Failed to start the embedded tracker! - - The entered IP is already banned. + + Embedded Tracker [OFF] - - - BitTorrent::Session - - Restart is required to toggle PeX support + + '%1' reached the maximum ratio you set. Removing... - - Could not get GUID of configured network interface. Binding to IP %1 + + '%1' reached the maximum ratio you set. Pausing... - - Embedded Tracker [ON] - Upotettu Seurantapalvelin [PÄÄLLÄ] - - - - Failed to start the embedded tracker! - Upotetun seurantapalvelimen käynnistäminen epäonnistui! - - - - Embedded Tracker [OFF] - Upotettu Seurantapalvelin [POIS PÄÄLTÄ] - - - + System network status changed to %1 e.g: System network status changed to ONLINE - + ONLINE - VERKKOYHTEYDESSÄ + - + OFFLINE - EI VERKKOYHTEYDESSÄ + - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. - - + Encryption support [%1] - Salaustuki [%1] + - - + FORCED - PAKOTETTU - - - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - - + Anonymous mode [%1] - Anonyymitila [%1] + - + Unable to decode '%1' torrent file. - Torrent-tiedostoa '%1' ei onnistuttu purkamaan. + - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' - Tiedoston '%1' rekursiivinen lataus, joka on upotettu torrenttiin '%2' + - + Queue positions were corrected in %1 resume files - Jonoasemat korjattiin %1 jatketuissa tiedostoissa + - + Couldn't save '%1.torrent' Torrenttia '%1.torrent' ei voitu tallentaa - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - - - - + because %1 is disabled. this peer was blocked because uTP is disabled. koska %1 ei ole käytössä. - + because %1 is disabled. this peer was blocked because TCP is disabled. koska %1 ei ole käytössä. - + URL seed lookup failed for URL: '%1', message: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' poistettiin listalta ja kiintolevyltä. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... - Ladataan '%1', odota hetki... + - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 - qBittorrent yrittää kuunnella missä tahansa verkkoliitännässä porttia: %1 + - + The network interface defined is invalid: %1 - Määritetty verkkoliitäntä on virheellinen: %1 + - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 - qBittorrent yrittää kuunnella verkkoliitännän %1 porttia: %2 - - - - Peer ID: - - HTTP User-Agent is '%1' - HTTP-käyttäjäagentti on '% 1' - - - - + DHT support [%1] - DHT-tuki [%1] + - - - - - - - - - + + + + ON - PÄÄLLÄ - - - - - - - - - - - - OFF - POIS PÄÄLTÄ - - - - - Local Peer Discovery support [%1] - Paikallisten käyttäjien haku tuki [%1] - - - - PeX support [%1] - - '%1' reached the maximum ratio you set. Removed. - '%1' saavutti asettamasi enimmäissuhteen. Poistettu. - - - - '%1' reached the maximum ratio you set. Paused. - '%1' saavutti asettamasi enimmäissuhteen. Keskeytetty. - - - - '%1' reached the maximum seeding time you set. Removed. + + + + + OFF - - '%1' reached the maximum seeding time you set. Paused. + + Local Peer Discovery support [%1] - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface - + Tracker '%1' was added to torrent '%2' - + Tracker '%1' was deleted from torrent '%2' - + URL seed '%1' was added to torrent '%2' - + URL seed '%1' was removed from torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. - Torrenttia '%1' ei onnistuttu jatkamaan. + - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - Annetun IP-suodattimen jäsentäminen onnistui: Käytettiin sääntöjä %1. + - + Error: Failed to parse the provided IP filter. - Virhe: Annetun IP-suodattimen jäsentäminen epäonnistui. + - - '%1' restored. - 'torrent name' restored. + + Couldn't add torrent. Reason: %1 - - Couldn't add torrent. Reason: %1 + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) - + '%1' added to download list. 'torrent name' was added to download list. - '%1' lisättiin latausluetteloon. + - + An I/O error occurred, '%1' paused. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 - + due to IP filter. this peer was blocked due to ip filter. - + due to port filter. this peer was blocked due to port filter. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. - + because it has a low port. this peer was blocked because it has a low port. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 - + External IP: %1 e.g. External IP: 192.168.0.1 - Ulkoinen IP-osoite: %1 - - - - BitTorrent::TorrentCreatorThread - - - create new torrent file failed BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + File sizes mismatch for torrent '%1', pausing it. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... @@ -1678,19 +1318,19 @@ CategoryFilterModel - + Categories - Kategoriat + Kategoriat - + All - Kaikki + Kaikki - + Uncategorized - Luokittelemattomia + @@ -1698,295 +1338,281 @@ Add category... - Lisää kategoria... + Lisää kategoria... Add subcategory... - Lisää alakategoria... + - Edit category... - Muokkaa kategoriaa... - - - Remove category - Poista kategoria + Poista kategoria - + Remove unused categories - Poista käyttämättömät kategoriat + Poista käyttämättömät kategoriat - + Resume torrents - Jatka torrentteja + Jatka torrentteja - + Pause torrents - Keskeytä torrentit + Pysäytä torrentit - + Delete torrents - Poista torrentit - - - - CookiesDialog - - - Manage Cookies - Evästeiden Hallinta - - - - CookiesModel - - - Domain - Verkkotunnus - - - - Path - Polku - - - - Name - Nimi + Poista torrentit - - Value - Arvo + + New Category + Uusi kategoria - - Expiration Date - Vanhenemispäivä + + Category: + Kategoria: - - - DeletionConfirmationDialog - - Deletion confirmation - Poistamisen vahvistus + + Invalid category name + - - Remember choice - + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Kategorian nimessä ei saa olla merkkiä '\'. +Kategorian nimi ei saa alkaa/päättyä merkillä '/'. +Kategorian nimessä ei saa olla merkkijonoa '//'. - - Also delete the files on the hard disk + + + Category exists - - Are you sure you want to delete '%1' from the transfer list? - Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? + + Category name already exists. - - Are you sure you want to delete these %1 torrents from the transfer list? - Are you sure you want to delete these 5 torrents from the transfer list? + + Subcategory name already exists in selected category. - DownloadFromURLDialog + CategoryFiltersList - - Download from URLs - + All (0) + this is for the category filter + Kaikki (0) - - Add torrent links - + Uncategorized (0) + Luokittelematon (0) - - One link per line (HTTP links, Magnet links and info-hashes are supported) - + %1 (%2) + category_name (10) + %1 (%2) - - Download - Lataa + Uncategorized (%1) + Luokittelematon (%1) - - No URL entered - + Add category... + Lisää kategoria... - - Please type at least one URL. - + Remove category + Poista kategoria - - - DownloadedPiecesBar - - White: Missing pieces - Valkoinen: Puuttuvat osat + Remove unused categories + Poista käyttämättömät kategoriat - - Green: Partial pieces - Vihreä: Osittaiset osat + Resume torrents + Jatka torrentteja - - Blue: Completed pieces - Sininen: Valmistuneet osat + Pause torrents + Pysäytä torrentit - - - ExecutionLogWidget - - General - Yleiset + Delete torrents + Poista torrentit - - Blocked IPs - + New Category + Uusi kategoria - - <font color='red'>%1</font> was blocked %2 - x.y.z.w was blocked - + Category: + Kategoria: - - <font color='red'>%1</font> was banned - x.y.z.w was banned - + Invalid category name + Virheellinen kategorianimi - - - FeedListWidget - - RSS feeds - RSS-syötteet + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Kategorian nimessä ei saa olla merkkiä '\'. +Kategorian nimi ei saa alkaa/päättyä merkillä '/'. +Kategorian nimessä ei saa olla merkkijonoa '//'. - - - Unread (%1) - Lukematon (%1) + All (%1) + this is for the category filter + Kaikki (%1) - FileLogger + CookiesDialog - - An error occurred while trying to open the log file. Logging to file is disabled. - Lokitiedostoa avatessa tapahtui virhe. Lokitiedostoon kirjaaminen on poissa käytöstä. + + Manage Cookies + Evästeiden hallinta - FileSystemPathEdit + CookiesModel - - ... - Launch file dialog button text (brief) - ... + + Domain + - - &Browse... - Launch file dialog button text (full) - &Selaa... + + Path + - - Choose a file - Caption for file open/save dialog - Valitse tiedosto + + Name + Nimi - - Choose a folder - Caption for directory open dialog - Valitse kansio + + Value + Arvo - - Any file + + Expiration Date - FilterParserThread + DeletionConfirmationDlg - - - - I/O Error: Could not open IP filter file in read mode. - + + Are you sure you want to delete '%1' from the transfer list? + Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? + Haluatko varmasti poistaa torrentin '%1'? - - - - IP filter line %1 is malformed. - + + Are you sure you want to delete these %1 torrents from the transfer list? + Are you sure you want to delete these 5 torrents from the transfer list? + Haluatko varmasti poistaa nämä %1 torrentit? + + + DownloadedPiecesBar - - - IP filter line %1 is malformed. Start IP of the range is malformed. + + White: Missing pieces - - - IP filter line %1 is malformed. End IP of the range is malformed. + + Green: Partial pieces - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! + + Blue: Completed pieces + + + ExecutionLog + + + General + Yleinen + + + + Blocked IPs + Estetyt IP-osoitteet + + + + <font color='red'>%1</font> was blocked %2 + x.y.z.w was blocked + <font color='red'>%1</font> estettiin %2 + - - - IP filter exception thrown for line %1. Exception is: %2 + + <font color='red'>%1</font> was banned + x.y.z.w was banned + + + FeedListWidget + + + RSS feeds + RSS-syötteet + + + + Unread + Lukematon + + + + FileLogger + + + An error occured while trying to open the log file. Logging to file is disabled. + Lokitiedostoa avatessa tapahtui virhe. Lokitiedostoon kirjaaminen on poissa käytöstä. + + + + FilterParserThread - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. + + + + I/O Error: Could not open ip filter file in read mode. - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. @@ -1994,396 +1620,472 @@ GeoIPDatabase - - + + Unsupported database file size. - Ei-tuettu tietokannan tiedostokoko. + - + Metadata error: '%1' entry not found. - + Metadata error: '%1' entry has invalid type. - + Unsupported database version: %1.%2 - Ei-tuettu tietokannan versio: %1.%2 + - + Unsupported IP version: %1 - Ei-tuettu IP-osoitteen versio: %1 + - + Unsupported record size: %1 - Ei.tuettu tietueen koko: %1 + - + Invalid database type: %1 - + Database corrupted: no data section found. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - + + File + Tiedosto - - Bad Http request, closing socket. IP: %s - + + Edit + Muokkaa - - - HttpServer - + + Help + Opaste + + + Exit qBittorrent Sulje qBittorrent - + Only one link per line Vain yksi linkki riville - + + Download + Lataa + + + Global upload rate limit must be greater than 0 or disabled. Yleisen lähetysnopeusrajoituksen täytyy olla suurempi kuin 0, tai poissa käytöstä. - + Global download rate limit must be greater than 0 or disabled. Yleisen latausnopeusrajoituksen täytyy olla suurempi kuin 0, tai poissa käytöstä. - + Alternative upload rate limit must be greater than 0 or disabled. - Vaihtoehtoisen lähetyksen rajan pitää olla suurempi kuin 0, tai poissa käytöstä. + - + Alternative download rate limit must be greater than 0 or disabled. - Vaihtoehtoisen latauksen rajan pitää olla suurempi kuin 0, tai poissa käytöstä. + - + Maximum active downloads must be greater than -1. - Aktiivisten latauksien enimmäismäärä pitää olla suurempi kuin -1 + - + Maximum active uploads must be greater than -1. - Aktiivisten jakojen enimmäismäärä pitää olla suurempi kuin -1 + - + Maximum active torrents must be greater than -1. - Aktiiivisten torrenttien enimmäismäärä pitää olla suurempi kuin -1 + - + Maximum number of connections limit must be greater than 0 or disabled. Yhteyksien enimmäismäärän pitää olla suurempi kuin 0 tai poistettu käytöstä. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Yhteyksien torrenttikohtaisen maksimimäärän pitää olla suurempi kuin 0 tai poistettu käytöstä. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Lähetyslohkojen torrenttikohtaisen enimmäismäärän pitää olla suurempi kuin 0 tai poistettu käytöstä. - + Unable to save program preferences, qBittorrent is probably unreachable. Asetuksia ei voitu tallentaa, qBittorrenttiin ei todennäköisesti saada yhteyttä. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent Freenode-verkossa - - - - Invalid category name: -Please do not use any special characters in the category name. - Virheellinen kategorian nimi: -Älä käytä erikoismerkkejä kategorian nimessä. - - - - Unknown - Tuntematon - - - - Hard Disk - Kiintolevy - - - - Share ratio limit must be between 0 and 9998. - Jakosuhteen raja pitää olla 0 ja 9998 välillä. - - - - Seeding time limit must be between 0 and 525600 minutes. - + + Language + Kieli - + The port used for incoming connections must be between 1 and 65535. - Sisääntuleville yhteyksille tarkoitetun portin numero pitää olla väliltä 1-65535. + - + The port used for the Web UI must be between 1 and 65535. - Web-käyttöliittymälle tarkoitetun portin numero pitää olla väliltä 1-65535. + - + Unable to log in, qBittorrent is probably unreachable. Kirjautuminen epäonnistui, qBittorrent ei luultavasti ole tavoitettavissa. - + Invalid Username or Password. Virheellinen käyttäjätunnus tai salasana. - - Username - Käyttäjänimi - - - + Password Salasana - + Login Kirjaudu - + + Upload Failed! + + + + Original authors - Alkuperäiset tekijät + - + + Upload limit: + + + + + Download limit: + + + + Apply Toteuta - + Add Lisää - + + Category: + Kategoria: + + + Upload Torrents Upload torrent files to qBittorent using WebUI - Lähetä torrentit + - + + All + Kaikki + + + + Downloading + Ladataan + + + + Seeding + Jaetaan + + + + Completed + Valmistunut + + + + Resumed + Jatkettu + + + + Paused + Pysäytetty + + + + Active + Aktiiviset + + + + Inactive + Toimettomat + + + Save files to location: Latauskansio: - + Cookie: - Eväste: + - + Type folder here - Kirjoita kansio tähän + - + + Run an external program on torrent completion + + + + + Enable bandwidth management (uTP) + + + + + Apply rate limit to uTP connections + + + + + Alternative Global Rate Limits + Vaihtoehtoiset yleiset nopeusrajoitukset + + + More information - Lisää tietoa + - + Information about certificates Tietoa varmenteista - + Save Files to - - Set location - Aseta kohde - - - - Limit upload rate - Rajoita lähetysnopeutta + + Watch Folder + - - Limit download rate - Rajoita latausnopeutta + + Default Folder + - - Rename torrent - Nimeä uudelleen torrent + + from + from time1 to time2 + - - Unable to create category + + to + from time1 to time2 - + Other... Save Files to: Watch Folder / Default Folder / Other... - Muu... + - + + Every day + Schedule the use of alternative rate limits on ... + + + + + Week days + Schedule the use of alternative rate limits on ... + Arkisin + + + + Week ends + Schedule the use of alternative rate limits on ... + Viikonloppuisin + + + Monday Schedule the use of alternative rate limits on ... Maanantai - + Tuesday Schedule the use of alternative rate limits on ... Tiistai - + Wednesday Schedule the use of alternative rate limits on ... - Keskiviikko + - + Thursday Schedule the use of alternative rate limits on ... Torstai - + Friday Schedule the use of alternative rate limits on ... Perjantai - + Saturday Schedule the use of alternative rate limits on ... Lauantai - + Sunday Schedule the use of alternative rate limits on ... Sunnuntai - + + Downloaded + Is the file downloaded or not? + Ladattu + + + Logout Kirjaudu ulos - + + Download from URLs + + + + Download Torrents from their URLs or Magnet links - Lataa torrentteja niiden URL-osoitteista tai Magnet-linkeistä + - + Upload local torrent - + Are you sure you want to delete the selected torrents from the transfer list? Haluatko varmasti poistaa valitut torrentit? - + Save Tallenna - + qBittorrent client is not reachable qBittorrent ei vastaa - - qBittorrent has been shutdown. - qBittorrent on sammutettu. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - + + HTTP Server + HTTP-palvelin - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Esimerkki: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Seuraavat parametrit ovat tuettuja: - - Add subnet - Lisää aliverkko + + Torrent path + Torrentin polku - - Delete - Poista + + Torrent name + Torrentin nimi - - Error - Virhe + + qBittorrent has been shutdown. + qBittorrent on sammutettu. + + + LineEdit - - The entered subnet is invalid. - + + Clear the text + Tyhjennä teksti LogListWidget - + Copy Kopioi - + Clear Tyhjennä @@ -2416,710 +2118,646 @@ Latausten &valmistuttua... - + &View &Näytä - + &Options... &Asetukset... - + &Resume &Jatka - + Torrent &Creator Luo uusi &torrent... - + Set Upload Limit... - Aseta lähetysraja... + - + Set Download Limit... - Aseta latausraja... + - + Set Global Download Limit... Aseta yleinen latausrajoitus... - + Set Global Upload Limit... Aseta yleinen lähetysrajoitus... - + Minimum Priority Matalin tärkeysaste - + Top Priority Korkein tärkeysaste - + Decrease Priority Laske tärkeysastetta - + Increase Priority Nosta tärkeysastetta - - + + Alternative Speed Limits Vaihtoehtoiset nopeusrajoitukset - + &Top Toolbar &Työkalupalkki - + Display Top Toolbar Näytä työkalupalkki - - Status &Bar - Tila&palkki - - - + S&peed in Title Bar No&peudet otsikkorivillä - + Show Transfer Speed in Title Bar Näytä siirtonopeudet otsikkorivillä - + &RSS Reader - &RSS-lukija + - + Search &Engine Haku&kone - + L&ock qBittorrent L&ukitse qBittorrent - + Do&nate! La&hjoita! - - Close Window - Sulje ikkuna - - - + R&esume All J&atka kaikkia - + Manage Cookies... - Evästeiden Hallinta... + Evästeiden hallinta... - + Manage stored network cookies - Hallinnoi tallennettuja verkkoevästeitä + - + Normal Messages Normaalit viestit - + Information Messages Tiedotusviestit - + Warning Messages Varoitusviestit - + Critical Messages Kriittiset viestit - + &Log &Loki - + &Exit qBittorrent &Sulje qBittorrent - + &Suspend System &Aseta tietokone lepotilaan - + &Hibernate System &Aseta tietokone horrostilaan - + S&hutdown System - &Sammuta tietokone + S&ammuta tietokone - + &Disabled &Älä tee mitään - + &Statistics &Tilastot - + Check for Updates Tarkista päivitykset - + Check for Program Updates Tarkista ohjelmapäivitykset - + &About &Tietoja - + &Pause - &Keskeytä + &Pysäytä - + &Delete &Poista - + P&ause All Py&säytä kaikki - + &Add Torrent File... &Lisää torrent... - + Open Avaa - + E&xit Lo&peta - + Open URL Avaa osoite - + &Documentation &Dokumentaatio - + Lock Lukitse - - - + + + Show Näytä - + Check for program updates Tarkista ohjelmapäivitykset - + Add Torrent &Link... Avaa torrent &osoitteesta... - + If you like qBittorrent, please donate! Jos pidät qBittorrentista, lahjoita! - - + Execution Log Suoritusloki - + Clear the password Poista salasana - + Filter torrent list... - Suodata torrent-luettelo... + - + &Set Password &Aseta salasana - - Preferences - Asetukset - - - + &Clear Password &Poista salasana - + Transfers Siirrot - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Torrent-tiedostojen liittäminen - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent ei ole torrent-tiedostojen ja magnet-linkkien oletussovellus. Haluatko asettaa qBittorrentin torrent-tiedostojen ja magnet-linkkien oletussovellukseksi? - + Icons Only Vain kuvakkeet - + Text Only Vain teksti - + Text Alongside Icons Teksti kuvakkeiden vieressä - + Text Under Icons Teksti kuvakkeiden alla - + Follow System Style Seuraa järjestelmän tyyliä - - - + + + UI lock password Käyttöliittymän lukitussalasana - - - + + + Please type the UI lock password: Anna käyttöliittymän lukitussalasana: - + The password should contain at least 3 characters Salasanassa pitää olla vähintään kolme merkkiä - + Password update Salasanan päivitys - + The UI lock password has been successfully updated Käyttöliittymän lukitussalasana päivitettiin onnistuneesti - + Are you sure you want to clear the password? Haluatko varmasti poistaa salasanan? - - Use regular expressions - - - - + Search Etsi - + Transfers (%1) Siirrot (%1) - + Error - Virhe + - + Failed to add torrent: %1 - Torrentin lisääminen epäonnistui: %1 + - + Torrent added - Torrent lisätty + - + '%1' was added. e.g: xxx.avi was added. - '%1' lisättiin. + - + Download completion Latauksen valmistuminen - + I/O Error i.e: Input/Output Error I/O-virhe - + Recursive download confirmation - Rekursiivisen latauksen vahvistus + Rekursiivinen latausvahvistus - + Yes Kyllä - + No Ei - + Never Ei koskaan - + Global Upload Speed Limit Yleinen lähetysnopeusrajoitus - + Global Download Speed Limit Yleinen latausnopeusrajoitus - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent päivitettiin juuri ja se on käynnistettävä uudelleen, jotta muutokset tulisivat voimaan. - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - Joitain tiedostosiirtoja on vielä meneillään. - - - - Are you sure you want to quit qBittorrent? - Haluatko varmasti lopettaa qBittorrentin? - - - + &No &Ei - + &Yes &Kyllä - + &Always Yes &Automaattisesti kyllä - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter - Vanha Python-tulkki + - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - Käytät vanhentunutta Python-versiota %1. Päivitä Python uusimpaan versioon, saadaksesi hakukoneet toimimaan. -Vähimmäisvaatimus: 2.7.9/3.3.0. + - + qBittorrent Update Available qBittorrentin päivitys saatavilla - + + A new version is available. +Do you want to download %1? + Uusi versio saatavilla. +Haluatko ladata %1? + + + Already Using the Latest qBittorrent Version Käytät jo uusinta qBittorentin versiota - + Undetermined Python version - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. - '%1' lataus on päättynyt. + - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. Reason: disk is full. - Torrent %1 kohtasi I/O-virheen. - Syy: %2 + - + The torrent '%1' contains torrent files, do you want to proceed with their download? - Torrentti '%1' sisältää torrent-tiedostoja, haluatko jatkaa niiden lataamista? + - + Couldn't download file at URL '%1', reason: %2. - Tiedoston lataaminen epäonnistui URL-osoitteesta: %1, syy: %2. + - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - - + + Couldn't determine your Python version (%1). Search engine disabled. + Käyttämääsi Pythonin versiota (%1) ei voitu määrittää. Hakukone on poissa käytöstä. + + + + Missing Python Interpreter - Python-tulkki puuttuu + - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Käyttääksesi hakukonetta, sinun täytyy asentaa Python. Haluatko asentaa sen nyt? - + Python is required to use the search engine but it does not seem to be installed. Käyttääksesi hakukonetta, sinun täytyy asentaa Python. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. Päivityksiä ei ole saatavilla. Käytät jo uusinta versiota. - + &Check for Updates &Tarkista päivitykset - + Checking for Updates... Tarkistetaan päivityksiä... - + Already checking for program updates in the background Ohjelmapäivityksiä tarkistetaan jo taustalla - + Python found in '%1' - + Download error Lataamisvirhe - + Python setup could not be downloaded, reason: %1. Please install it manually. Python-asennuksen lataaminen epäonnistui, syy: %1. Python täytyy asentaa manuaalisesti. - - + + Invalid password Virheellinen salasana - - - + + RSS (%1) RSS (%1) - + URL download error - Osoitteen latausvirhe + - + The password is invalid Salasana on virheellinen - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Latausnopeus: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Lähetysnopeus: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [Lataus: %1, Lähetys: %2] qBittorrent %3 - + Hide Piilota - + Exiting qBittorrent Suljetaan qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Joitain tiedostosiirtoja on vielä meneillään. +Haluatko varmasti sulkea qBittorrentin? + + + Open Torrent Files Avaa torrent-tiedostot - + Torrent Files Torrent-tiedostot - + Options were saved successfully. Asetukset tallennettiin onnistuneesti. @@ -3127,1466 +2765,1356 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. - Dynamic DNS -tietosi päivitettiin onnistuneesti. + - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. - + Dynamic DNS error: hostname supplied does not exist under specified account. - + Dynamic DNS error: Invalid username/password. - Dynamic DNS -virhe: virheellinen käyttäjätunnus tai salasana. + - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. - Dynaaminen DNS-virhe: qBittorrent on asetettu palvelun mustalle listalle, ilmoita virheestä osoitteessa http://bugs.qbittorrent.org. + - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. - + Dynamic DNS error: supplied domain name is invalid. - + Dynamic DNS error: supplied username is too short. - Dynamic DNS -virhe: annettu käyttäjätunnus on liian lyhyt. + - + Dynamic DNS error: supplied password is too short. - Dynamic DNS -virhe: annettu salasana on liian lyhyt. + Net::DownloadHandler - + I/O Error I/O-virhe - + The file size is %1. It exceeds the download limit of %2. - + Unexpected redirect to magnet URI. - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. - - + + Couldn't load GeoIP database. Reason: %1 GeoIP-tietokantaa ei voitu ladata. Syy: %1 - + Venezuela, Bolivarian Republic of Venezuelan bolivariaaninen tasavalta - + Viet Nam Vietnam - - + + N/A Ei saatavilla - + Andorra Andorra - + United Arab Emirates Yhdistyneet arabiemiirikunnat - + Afghanistan Afganistan - + Antigua and Barbuda Antigua ja Barbuda - + Anguilla Anguilla - + Albania Albania - + Armenia Armenia - + Angola Angola - + Antarctica Etelämanner - + Argentina Argentiina - + American Samoa Amerikan Samoa - + Austria Itävalta - + Australia Australia - + Aruba Aruba - + Azerbaijan Azerbaidžan - + Bosnia and Herzegovina Bosnia ja Hertsegovina - + Barbados Barbados - + Bangladesh Bangladesh - + Belgium Belgia - + Burkina Faso Burkina Faso - + Bulgaria Bulgaria - + Bahrain Bahrain - + Burundi Burundi - + Benin Benin - + Bermuda Bermuda - + Brunei Darussalam Brunei Darussalam - + Brazil Brasilia - + Bahamas Bahama - + Bhutan Bhutan - + Bouvet Island Bouvet'nsaari - + Botswana Botswana - + Belarus Valko-Venäjä - + Belize Belize - + Canada Kanada - + Cocos (Keeling) Islands Kookossaaret (Keelingsaaret) - + Congo, The Democratic Republic of the Kongon demokraattinen tasavalta - + Central African Republic Keski-Afrikan tasavalta - + Congo Kongon tasavalta - + Switzerland Sveitsi - + Cook Islands Cookinsaaret - + Chile Chile - + Cameroon Kamerun - + China Kiina - + Colombia Kolumbia - + Costa Rica Costa Rica - + Cuba Kuuba - + Cape Verde Kap Verde - + Curacao Curaçao - + Christmas Island Joulusaari - + Cyprus Kypros - + Czech Republic Tšekin tasavalta - + Germany Saksa - + Djibouti Djibouti - + Denmark Tanska - + Dominica Dominica - + Dominican Republic Dominikaaninen tasavalta - + Algeria Algeria - + Ecuador Ecuador - + Estonia Viro - + Egypt Egypti - + Western Sahara Länsi-Sahara - + Eritrea Eritrea - + Spain Espanja - + Ethiopia Etiopia - + Finland Suomi - + Fiji Fidži - + Falkland Islands (Malvinas) Falklandinsaaret - + Micronesia, Federated States of Mikronesian liittovaltio - + Faroe Islands Färsaaret - + France Ranska - + Gabon Gabon - + United Kingdom Iso-Britannia - + Grenada Grenada - + Georgia Georgia - + French Guiana Ranskan Guayana - + Ghana Ghana - + Gibraltar Gibraltar - + Greenland Grönlanti - + Gambia Gambia - + Guinea Guinea - + Guadeloupe Guadeloupe - + Equatorial Guinea Päiväntasaajan Guinea - + Greece Kreikka - + South Georgia and the South Sandwich Islands Etelä-Georgia ja Eteläiset Sandwichsaaret - + Guatemala Guatemala - + Guam Guam - + Guinea-Bissau Guinea-Bissau - + Guyana Guyana - + Hong Kong Hongkong - + Heard Island and McDonald Islands Heard ja McDonaldinsaaret - + Honduras Honduras - + Croatia Kroatia - + Haiti Haiti - + Hungary Unkari - + Indonesia Indonesia - + Ireland Irlanti - + Israel Israel - + India Intia - + British Indian Ocean Territory Brittiläinen Intian valtameren alue - + Iraq Irak - + Iran, Islamic Republic of Iran - + Iceland Islanti - + Italy Italia - + Jamaica Jamaika - + Jordan Jordania - + Japan Japani - + Kenya Kenia - + Kyrgyzstan Kirgisia - + Cambodia Kambodža - + Kiribati Kiribati - + Comoros Komorit - + Saint Kitts and Nevis Saint Kitts ja Nevis - + Korea, Democratic People's Republic of Pohjois-Korea - + Korea, Republic of Etelä-Korea - + Kuwait Kuwait - + Cayman Islands Caymansaaret - + Kazakhstan Kazakstan - + Lao People's Democratic Republic Laos - + Lebanon Libanon - + Saint Lucia Saint Lucia - + Liechtenstein Liechtenstein - + Sri Lanka Sri Lanka - + Liberia Liberia - + Lesotho Lesotho - + Lithuania Liettua - + Luxembourg Luxemburg - + Latvia Latvia - + Morocco Marokko - + Monaco Monaco - + Moldova, Republic of Moldova - + Madagascar Madagaskar - + Marshall Islands Marshallinsaaret - + Mali Mali - + Myanmar Myanmar - + Mongolia Mongolia - + Northern Mariana Islands Pohjois-Mariaanit - + Martinique Martinique - + Mauritania Mauritania - + Montserrat Montserrat - + Malta Malta - + Mauritius Mauritius - + Maldives Malediivit - + Malawi Malawi - + Mexico Meksiko - + Malaysia Malesia - + Mozambique Mosambik - + Namibia Namibia - + New Caledonia Uusi-Kaledonia - + Niger Niger - + Norfolk Island Norfolkinsaari - + Nigeria Nigeria - + Nicaragua Nicaragua - + Netherlands Alankomaat (Hollanti) - + Norway Norja - + Nepal Nepal - + Nauru Nauru - + Niue Niue - + New Zealand Uusi-Seelanti - + Oman Oman - + Panama Panama - + Peru Peru - + French Polynesia Ranskan Polynesia - + Papua New Guinea Papua-Uusi-Guinea - + Philippines Filippiinit - + Pakistan Pakistan - + Poland Puola - + Saint Pierre and Miquelon Saint-Pierre ja Miquelon - + Puerto Rico Puerto Rico - + Portugal Portugali - + Palau Palau - + Paraguay Paraguay - + Qatar Qatar - + Reunion Réunion - + Romania Romania - + Russian Federation Venäjä - + Rwanda Ruanda - + Saudi Arabia Saudi-Arabia - + Solomon Islands Salomonsaaret - + Seychelles Seychellit - + Sudan Sudan - + Sweden Ruotsi - + Singapore Singapore - + Slovenia Slovenia - + Svalbard and Jan Mayen Huippuvuoret ja Jan Mayen - + Slovakia Slovakia - + Sierra Leone Sierra Leone - + San Marino San Marino - + Senegal Senegal - + Somalia Somalia - + Suriname Suriname - + Sao Tome and Principe São Tomé ja Príncipe - + El Salvador El Salvador - + Syrian Arab Republic Syyria - + Swaziland Swazimaa - + Turks and Caicos Islands Turks- ja Caicossaaret - + Chad Tšad - + French Southern Territories Ranskan eteläiset ja antarktiset alueet - + Togo Togo - + Thailand Thaimaa - + Tajikistan Tadžikistan - + Tokelau Tokelau - + Turkmenistan Turkmenistan - + Tunisia Tunisia - + Tonga Tonga - - Could not decompress GeoIP database file. - GeoIP-tietokantatiedoston purku epäonnistui. - - - + Timor-Leste Itä-Timor - + Bolivia, Plurinational State of Bolivia - + Bonaire, Sint Eustatius and Saba Bonaire, Sint Eustatius ja Saba - + Cote d'Ivoire Norsunluurannikko - + Libya Libya - + Saint Martin (French part) Saint-Martin (Ranska) - + Macedonia, The Former Yugoslav Republic of Makedonia - + Macao Macao - + Pitcairn Pitcairn - + Palestine, State of Palestiinalaisalue - + Saint Helena, Ascension and Tristan da Cunha Saint Helena, Ascension ja Tristan da Cunha - + South Sudan Etelä-Sudan - + Sint Maarten (Dutch part) Sint Maarten (Alankomaat) - + Turkey Turkki - + Trinidad and Tobago Trinidad ja Tobago - + Tuvalu Tuvalu - + Taiwan Taiwan - + Tanzania, United Republic of Tansanian yhdistynyt tasavalta - + Ukraine Ukraina - + Uganda Uganda - + United States Minor Outlying Islands Yhdysvaltain pienet erillissaaret - + United States Yhdysvallat - + Uruguay Uruguay - + Uzbekistan Uzbekistan - + Holy See (Vatican City State) Pyhä istuin (Vatikaanivaltio) - + Saint Vincent and the Grenadines Saint Vincent ja Grenadiinit - + Virgin Islands, British Brittiläiset Neitsytsaaret - + Virgin Islands, U.S. Yhdysvaltain Neitsytsaaret - + Vanuatu Vanuatu - + Wallis and Futuna Wallis ja Futuna - + Samoa Samoa - + Yemen Yemen - + Mayotte Mayotte - + Serbia Serbia - + South Africa Etelä-Afrikka - + Zambia Sambia - + Montenegro Montenegro - + Zimbabwe Zimbabwe - + Aland Islands Ahvenanmaa - + Guernsey Guernsey - + Isle of Man Mansaari - + Jersey Jersey - + Saint Barthelemy Saint-Barthélemy - + + Could not uncompress GeoIP database file. + GeoIP-tietokantatiedoston purku epäonnistui. + + + Couldn't save downloaded GeoIP database file. Ladattua GeoIP-tietokantatiedostoa ei voitu tallentaa. - + Successfully updated GeoIP database. GeoIP-tietokanta päivitetty onnistuneesti. - + Couldn't download GeoIP database file. Reason: %1 GeoIP-tietokantatiedostoa ei voitu ladata. Syy: %1 @@ -4594,12 +4122,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] UPnP-/ NAT-PMP-tuki [PÄÄLLÄ] - + UPnP / NAT-PMP support [OFF] UPnP-/ NAT-PMP-tuki [POIS PÄÄLTÄ] @@ -4607,1885 +4135,1627 @@ Net::Smtp - + Email Notification Error: - Sähköposti-ilmoitusvirhe; + OptionsDialog - + Options - Asetukset + - + Behavior - Toiminta + - + Downloads - Lataukset + Lataukset - + Connection - Yhteys + Yhteys - + Speed - Nopeus + Nopeus - + BitTorrent - BitTorrent - - - - RSS - RSS + - + Web UI - Web-käyttöliittymä + - + Advanced - Lisäasetukset + - + Language - Kieli + Kieli - + User Interface Language: Käyttöliittymän kieli: - + (Requires restart) (Vaatii uudelleenkäynnistyksen) - + Transfer List - Siirtoluettelo + - + Confirm when deleting torrents - Vahvista torrentin poisto + - + Use alternating row colors In transfer list, one every two rows will have grey background. - Käytä vaihtelevia rivivärejä + - + Hide zero and infinity values - Piilota nolla- ja äärettömyysarvot + - + Always - Aina + Aina - + Paused torrents only - Vain keskeytetyissä torrenteissa + - + Action on double-click - Toiminta tuplanapsautuksella + - + Downloading torrents: - Torrentteja ladatessa: + - - + + Start / Stop Torrent - Aloita / pysäytä torrent + - - + + Open destination folder - Avaa kohdekansio + Avaa kohdekansio - - + + No action - Ei toimintoa + - + Completed torrents: - Valmistuneet torrentit: + - + Desktop - Työpöytä + - + Start qBittorrent on Windows start up - Käynnistä qBittorrent Windowsin käynnistyessä + - + Show splash screen on start up - Näytä aloituskuva käynnistettäessä + - + Start qBittorrent minimized - Käynnistä qBittorrent pienennettynä + - + Confirmation on exit when torrents are active - Vahvista lopettaminen torrentien ollessa aktiivisena + - + Confirmation on auto-exit when downloads finish - Vahvista automaattinen lopetus kun lataukset ovat valmiita - - - - KiB - KiB + - - Email notification &upon download completion - Sähköposti-ilmoitus latauksen valmistuttua + + Show qBittorrent in notification area + - - Run e&xternal program on torrent completion - Suorita erillinen ohjelma torrentien valmistuessa + + Minimize qBittorrent to notification area + - - IP Fi&ltering - IP-suodatus - - - - Schedule &the use of alternative rate limits - Aseta aikataulu vaihtoehtoisille nopeusrajoituksille - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Lisätietoja</a>) - - - - &Torrent Queueing - Torrentien jonotus - - - - Seed torrents until their seeding time reaches - Jatka torrenttien jakamista kunnes jakosuhde saavuttaa - - - - A&utomatically add these trackers to new downloads: - Lisää nämä seurantapalvelimet automaattisesti uusiin latauksiin: - - - - RSS Reader - RSS-lukija - - - - Enable fetching RSS feeds - Ota käyttöön RSS-syötteiden haku - - - - Feeds refresh interval: - RSS-syötteen päivitystiheys: - - - - Maximum number of articles per feed: - Artikkeleiden enimmäismäärä syötettä kohden: - - - - - min - minutes - min - - - - RSS Torrent Auto Downloader - RSS Torrenttien Automaattinen Lataaja - - - - Enable auto downloading of RSS torrents - Ota käyttöön RSS-torrenttien automaattinen lataus - - - - Edit auto downloading rules... - Muokkaa automaattisten latausten sääntöjä... - - - - Web User Interface (Remote control) - Web-käyttöliittymä (Etäohjaus) - - - - IP address: - IP osoite: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - - - - - Server domains: - Palvelimen verkkotunnukset: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - - - - - &Use HTTPS instead of HTTP - Käytä HTTPS:ää HTTP:n sijaan - - - - Bypass authentication for clients on localhost - - - - - Bypass authentication for clients in whitelisted IP subnets - - - - - IP subnet whitelist... - - - - - Upda&te my dynamic domain name - Päivitä dynaamisen verkkotunnukseni nimi - - - - Minimize qBittorrent to notification area - Pienennä qBittorrent ilmoitusalueelle - - - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. - Sulje qBittorrent ilmoitusalueelle + - + Tray icon style: - Ilmaisinalueen kuvakkeen tyyli: + - + Normal - Normaali + Normaali - + Monochrome (Dark theme) - Harmaasävy (Tumma teema) + - + Monochrome (Light theme) - Harmaasävy (Vaalea teema) + - + File association - + Use qBittorrent for .torrent files - Käytä qBittorrenttia .torrent-tiedostoihin + - + Use qBittorrent for magnet links - Käytä qBittorrenttia magnet-linkkeihin + - + Power Management - Virranhallinta + + + + + Inhibit system sleep when torrents are active + + + + + Log file + - + Save path: - Tallennussijainti: + - + Backup the log file after: - Ota lokista varmuuskopio, kun sen koko ylittää: + + + + + MB + - + Delete backup logs older than: - Poista varmuuskopiot, jotka ovat vanhempia kuin: + - + days Delete backup logs older than 10 months - päivää + - + months Delete backup logs older than 10 months - kuukautta + - + years Delete backup logs older than 10 years - vuotta + - + When adding a torrent - Kun lisätään torrent-tiedostoa + + + + + Display torrent content and some options + - + Bring torrent dialog to the front - Tuo torrent-ikkuna päällimmäiseksi + - + Do not start the download automatically The torrent will be added to download list in pause state - Älä aloita lataamista automaattisesti + - + Should the .torrent file be deleted after adding it - Poistetaanko torrent-tiedosto sen lisäämisen jälkeen + + + + + Delete .torrent files afterwards + - + Also delete .torrent files whose addition was cancelled - Poista myös torrent-tiedostot, joiden lisääminen peruutettiin + - + Also when addition is cancelled - Myös silloin, kun lisäys peruutetaan + - + Warning! Data loss possible! - Varoitus! Tietojen menetys on mahdollista! + - + Saving Management - Tallennuksen Hallinta + - + Default Torrent Management Mode: - Oletus torrentien hallintatila + - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - + Manual - Manuaalinen + - + Automatic - Automaattinen + - + When Torrent Category changed: - Kun torrentin kategoria muutetaan: + - + Relocate torrent - Uudelleensijoita torrentti + - + Switch torrent to Manual Mode - Vaihda torrent Manuaaliseen Tilaan + - + When Default Save Path changed: - Kun tallennuksen oletussijainti muutetaan: + - - + + Relocate affected torrents - Uudelleensijoita vaikuttuneet torrentti + - - + + Switch affected torrents to Manual Mode - Vaihda vaikuttuneet torrentit Manuaaliseen Tilaan + - + When Category changed: - Kun kategoria muutetaan: + - + Use Subcategories - Käytä Alikategorioita + - + Default Save Path: - Tallennuksen oletussijainti: + - + Keep incomplete torrents in: - Säilytä keskeneräiset torrentit kohteeseen: + - + Copy .torrent files to: - Kopioi .torrent-tiedostot kohteeseen: - - - - Show &qBittorrent in notification area - Näytä &qBittorrent ilmoitusalueella - - - - &Log file - &Lokitiedosto - - - - Display &torrent content and some options - Näytä &torrentin sisältö ja joitakin valintoja - - - - Create subfolder for torrents with multiple files - Luo alikansio useita tiedostoja sisältäville torrentille - - - - De&lete .torrent files afterwards - Poista .torrent-tiedostot &lisäämisen jälkeen + - + Copy .torrent files for finished downloads to: - Kopioi valmistuneiden latausten .torrent-tiedostot kohteeseen: + - + Pre-allocate disk space for all files - Varaa kaikille tiedostoille levytila ennakkoon - - - - Inhibit system sleep when torrents are downloading - - Inhibit system sleep when torrents are seeding + + Append .!qB extension to incomplete files - - Append .!qB extension to incomplete files - Lisää .!qB pääte keskeneräisille tiedostoille + + Automatically add torrents from: + - - Enable recursive download dialog + + Add entry - - Automatically add torrents from: - Lisää torrentit automaattisesti kohteesta: + + Remove entry + - - Add entry - Lisää merkintä + + Email notification upon download completion + - - Remove entry - Poista merkintä + + Destination email: + - + SMTP server: - SMTP-palvelin: + - + This server requires a secure connection (SSL) - Tämä palvelin vaatii suojatun yhteyden (SSL) + - - + + + Authentication - Tunnistautuminen + - - - - + + + + Username: - Käyttäjänimi: + Käyttäjätunnus: - - - - + + + + Password: - Salasana: - - - - Enabled protocol: - Käytössä oleva protokolla: + Salasana: - - TCP and μTP - TCP ja μTP + + Run external program on torrent completion + - + Listening Port - Kuunteluportti + - + Port used for incoming connections: - Portti sisääntuleville yhteyksille: + - + Random - Satunnainen + - + Use UPnP / NAT-PMP port forwarding from my router - Käytä UPnP-/NAT-PMP-portinohjausta reitittimeltä + - + Use different port on each startup - Käytä eri porttia joka käynnistyksen yhteydessä + - + Connections Limits - Yhteyksien rajat + - + Maximum number of connections per torrent: - Yhteyksien enimmäismäärä torrenttia kohden: + - + Global maximum number of connections: - Kaikkien yhteyksien enimmäismäärä: + - + Maximum number of upload slots per torrent: - Lähetyspaikkojen enimmäismäärä torrentia kohden: + - + Global maximum number of upload slots: - Kaikkien lähetyspaikkojen enimmäismäärä: + - + Proxy Server - Välityspalvelin + - + Type: - Tyyppi: + - + (None) - (Ei mikään) + - + SOCKS4 - SOCKS4 + - + SOCKS5 - SOCKS5 + - + HTTP - HTTP + - + Host: - Isäntä: + - - + + Port: - Portti: + - + Otherwise, the proxy server is only used for tracker connections - Muussa tapauksessa välityspalvelinta käytetään vain seurantapalvelimen yhteyksiin + - + Use proxy for peer connections - Käytä välityspalvelinta vertaisyhteyksille - - - - Disable connections not supported by proxies - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) + + Disable connections not supported by proxies - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - + Use proxy only for torrents - Käytä välityspalvelinta vain torrenteille + - - A&uthentication - T&unnistautuminen + + Info: The password is saved unencrypted + - - Info: The password is saved unencrypted - Tärkeää: Salasana tallennetaan salaamattomana + + IP Filtering + - + Filter path (.dat, .p2p, .p2b): - Suodatustiedoston sijainti (.dat, .p2p, p2b): + - + Reload the filter - Lataa suodatin uudelleen - - - - Manually banned IP addresses... - Manuaalisesti kielletyt IP-osoitteet... + - + Apply to trackers - + Global Rate Limits - Yleiset nopeusrajoitukset + - - - - - - - KiB/s - KiB/s + + + Upload: + - - - Upload: - Lähetys: + + + + + KiB/s + KiB/s - - + + Download: - Lataus: + - + Alternative Rate Limits - Vaihtoehtoiset nopeusrajoitukset + + + + + Schedule the use of alternative rate limits + - - + From: from (time1 to time2) - Alkaen: + - - + To: time1 to time2 - Loppuu: + - + When: - Ajankohta: + - + Every day - Joka päivä + - + Weekdays - Arkisin + - + Weekends - Viikonloppuisin + - + Rate Limits Settings - Nopeusrajoitusasetukset + - + Apply rate limit to peers on LAN - + Apply rate limit to transport overhead - - + + + Enable µTP protocol + + + + Apply rate limit to µTP protocol - Käytä nopeusrajoitusta µTP-protokollaan + - + Privacy - Yksityisyys + - + Enable DHT (decentralized network) to find more peers - Käytä DHT:tä (hajautettua verkkoa) useampien käyttäjien löytämiseen + - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - Vaihta käyttäjätietoja yhteensopivien Bittorrent-asiakkaiden (µTorrent, Vuze, ...) kanssa + - + Enable Peer Exchange (PeX) to find more peers - Käytä PeX:tä löytääksesi enemmän käyttäjiä + - + Look for peers on your local network - Etsi käyttäjiä paikallisverkostasi + - + Enable Local Peer Discovery to find more peers - Käytä paikallista hakua löytääksesi enemmän käyttäjiä (LPD) + - + Encryption mode: - Salaustila: + - + Prefer encryption - Suosi salausta + - + Require encryption - Vaadi salaus + - + Disable encryption - Ei salausta + - + Enable when using a proxy or a VPN connection - Ota käyttöön välityspalvelinta tai VPN-yhteyttä käytettäessä + - + Enable anonymous mode - Käytä anonyymitilaa - - - - Maximum active downloads: - Aktiivisia latauksia enintään: - - - - Maximum active uploads: - Aktiivisia lähetettäviä torrentteja enintään: + - - Maximum active torrents: - Aktiivisia torrentteja enintään: + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + - - Do not count slow torrents in these limits - Älä laske hitaita torrenteja näihin rajoituksiin + + Torrent Queueing + - - Upload rate threshold: + + Maximum active downloads: - - Download rate threshold: + + Maximum active uploads: - - sec - seconds + + Maximum active torrents: - - Torrent inactivity timer: + + Do not count slow torrents in these limits - + Share Ratio Limiting - Jakosuhteen rajoittaminen + - + Seed torrents until their ratio reaches - Jatka torrenttien jakamista kunnes jakosuhde saavuttaa + - + then - sitten + - + Pause them - Keskeytä ne + - + Remove them - Poista ne + + + + + Automatically add these trackers to new downloads: + - - RSS Smart Episode Filters - Älykkäät RSS jaksosuodattimet + + Enable Web User Interface (Remote control) + - + Use UPnP / NAT-PMP to forward the port from my router - + + Use HTTPS instead of HTTP + + + + Certificate: - Varmenne: + - + Import SSL Certificate - Tuo SSL-varmenne + - + Key: - Avain: + - + Import SSL Key - Tuo SSL-avain - - - - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Tietoa varmenteista</a> - - - - Use alternative Web UI - - Files location: + + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - - Enable clickjacking protection + + Bypass authentication for localhost - - Enable Cross-Site Request Forgery (CSRF) protection + + Update my dynamic domain name - + Service: - Palvelu: + - + Register - + Domain name: - Verkkotunnuksen nimi: + - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - Ottamalla nämä asetukset käyttöön, voit <strong>peruuttamattomasti menettää</strong> torrent-tiedostosi! + - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): - Tuetut parametrit (kirjainkoolla on merkitystä): + - + %N: Torrent name - %N: Torrentin nimi + - + %L: Category - %L: Kategoria - - - - %G: Tags (seperated by comma) - + %F: Content path (same as root path for multifile torrent) - + %R: Root path (first torrent subdirectory path) - %R: Juuripolku (ensimmäinen torrent-alihakemiston polku) + - + %D: Save path - %D: Tallennussijainti + - + %C: Number of files - %C: Tiedostojen määrä + - + %Z: Torrent size (bytes) - %Z: Torrenin koko (tavua) + - + %T: Current tracker - %T: Nykyinen seurantapalvelin + - + %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor - Valitse valvottava kansio + - + Folder is already being monitored: - Kansiota valvotaan jo: + - + Folder does not exist: - Kansiota ei ole. + - + Folder is not readable: - Kansio ei ole luettavissa: + - + Adding entry failed - Merkinnän llsääminen epäonnistui + - - - - + + Choose export directory - Valitse vientihakemisto + - - - + + + + + + Choose a save directory - Valitse tallennushakemisto + - + Choose an IP filter file - Valitse IP-suodatintiedosto + - + All supported filters - Kaikki tuetut suodattimet + - + SSL Certificate - SSL-varmenne + + + + + SSL Key + - + Parsing error - Jäsennysvirhe + - + Failed to parse the provided IP filter - Annetun IP-suodattimen jäsentäminen epäonnistui + - + Successfully refreshed - Päivitetty onnistuneesti + - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - Annetun IP-suodattimen jäsentäminen onnistui: Käytettiin sääntöjä %1. + - + Invalid key - Virheellinen avain + - + This is not a valid SSL key. - Tämä ei ole kelvollinen SSL-avain. + - + Invalid certificate - Virheellinen varmenne - - - - Preferences - Asetukset - - - - Import SSL certificate - Tuo SSL-varmenne + - + This is not a valid SSL certificate. - Tämä ei ole kelvollinen SSL-varmenne. - - - - Import SSL key - Tuo SSL-avain - - - - SSL key - SSL-avain + - + Time Error - Aikavirhe + - + The start time and the end time can't be the same. - Aloitus- ja päättymisaika eivät voi olla samoja. + - - + + Length Error - Pituusvirhe + - + The Web UI username must be at least 3 characters long. - Web-käyttöliittymän käyttäjätunnuksen pitää olla vähintään 3 merkkiä pitkä. + - + The Web UI password must be at least 6 characters long. - Web-käyttöliittymän salasanan pitää olla vähintään 6 merkkiä pitkä. + PeerInfo - - Interested(local) and Choked(peer) + + interested(local) and choked(peer) - + interested(local) and unchoked(peer) - + interested(peer) and choked(local) - + interested(peer) and unchoked(local) - + optimistic unchoke - + peer snubbed - + incoming connection - saapuva yhteys + - + not interested(local) and unchoked(peer) - + not interested(peer) and unchoked(local) - + peer from PEX - asiakas PEX:istä + - + peer from DHT - asiakas DHT:stä + - + encrypted traffic - salattu liikenne + - + encrypted handshake - salattu kättely + - + peer from LSD - asiakas LSD:stä + PeerListWidget - + IP IP - + Port Portti - + Flags Liput - + Connection Yhteys - + Client i.e.: Client application Asiakassovellus - + Progress i.e: % downloaded Edistyminen - + Down Speed i.e: Download speed Latausnopeus - + Up Speed i.e: Upload speed Lähetysnopeus - + Downloaded i.e: total data downloaded Ladattu - + Uploaded i.e: total data uploaded Lähetetty - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. - Merkityksellisyys + - + Files i.e. files that are being downloaded right now - Tiedostot + - + Column visibility - Sarakkeen näkyvyys + Sarakkeen näkyvyys - + Add a new peer... Lisää uusi asiakas... - - + + Ban peer permanently Estä käyttäjä pysyvästi - + Manually adding peer '%1'... - Lisätään käsin asiakas %1... + - + The peer '%1' could not be added to this torrent. - Asiakasta '%1' ei voitu lisätä tähän torrenttiin. + - + Manually banning peer '%1'... - Poistetaan käsin asiakas %1... + - - + + Peer addition - Asiakkaan lisäys + - + Country Maa - + Copy IP:port - Kopioi IP:portti + - + Some peers could not be added. Check the Log for details. Joitakin käyttäjiä ei voitu lisätä. Katso lokista lisätietoja. - + The peers were added to this torrent. - Asiakkaat lisättiin tähän torrenttiin. + - + Are you sure you want to ban permanently the selected peers? Haluatko varmasti estää valitut käyttäjät pysyvästi? - + &Yes &Kyllä - + &No &Ei - PeersAdditionDialog - - - Add Peers - - + PeersAdditionDlg - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - - - + No peer entered - + Yhtään käyttäjää ei ole lisätty - + Please type at least one peer. - + Invalid peer - + Epäkelpo käyttäjä - + The peer '%1' is invalid. - + Käyttäjä '%1' on epäkelpo. PieceAvailabilityBar - + White: Unavailable pieces - Valkoinen: Ei saatavilla olevat osat + - + Blue: Available pieces - Sininen: Saatavilla olevat osat + PiecesBar - + Files in this piece: - Tässä osassa olevat tiedostot: + - + File in this piece - Tässä osassa oleva tiedosto + - + File in these pieces - Näissä osissa oleva tiedosto - - - - Wait until metadata become available to see detailed information - + Hold Shift key for detailed information - Pidä Vaihto-näppäintä pohjassa saadaksesi yksityiskohtaista tietoa + - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Installed search plugins: - + Asennetut hakuliitännäiset: - + Name Nimi - + Version - + Url - - + + Enabled - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Voit ladata uusia hakukoneliitännäisiä täältä: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Check for updates - + Tarkista päivitykset - + Close - + Uninstall - - - + + + Yes Kyllä - - - - + + + + No Ei - + Uninstall warning - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Joitain liitännäisiä ei voitu poistaa, koska ne kuuluvat qBittorrentiin. Ainoastaan itse asennetut liitännäiset voidaan poistaa. +Valitut alkuperäisliitännäiset ovat poistettu käytöstä. - + Uninstall success - + All selected plugins were uninstalled successfully - - - - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - + Kaikki valitut liitännäiset poistettiin onnistuneesti - - + + New search engine plugin URL - - + + URL: - + Invalid link - + The link doesn't seem to point to a search engine plugin. - + Select search plugins - + qBittorrent search plugin - + + + + Search plugin update + + + + All your plugins are already up to date. - + Sorry, couldn't check for plugin updates. %1 - + + + Search plugin install - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + "%1" hakukoneliitännäinen asennettiin onnistuneesti. + + + Couldn't install "%1" search engine plugin. %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + + + + Couldn't update "%1" search engine plugin. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Search plugin source: - + Local file - + Web link - PowerManagement - - - qBittorrent is active - - - - - PreviewSelectDialog - - - Preview - Esikatsele - + PreviewSelect - + Name Nimi - + Size Koko - + Progress - Edistyminen + Edistyminen - - + + Preview impossible Esikatselu ei onnistu - - + + Sorry, we can't preview this file Valitettavasti tätä tiedostoa ei voi esikatsella - Private::FileLineEdit - - - '%1' does not exist - - - - - '%1' does not point to a directory - - - - - '%1' does not point to a file - - - - - Does not have read permission in '%1' - - - - - Does not have write permission in '%1' - - - - PropListDelegate - + Not downloaded Ei ladattu - - + + Normal Normal (priority) Normaali - - N/A - Ei saatavilla - - - + Do not download Do not download (priority) - Älä lataa + Älä lataa - - + + High High (priority) Korkea - + Mixed Mixed (priorities - Sekalainen + - - + + Maximum Maximum (priority) Korkein @@ -6494,32 +5764,32 @@ PropTabBar - + General Yleiset - + Trackers Seurantapalvelimet - + Peers Lataajat - + HTTP Sources HTTP-lähteet - + Content Sisältö - + Speed Nopeus @@ -6539,7 +5809,7 @@ Progress: - Edistyminen: + Edistyminen: @@ -6550,7 +5820,7 @@ Time Active: Time (duration) the torrent is active (not paused) - Aikaa aktiivisena: + @@ -6565,7 +5835,7 @@ Seeds: - Jakajia: + @@ -6580,17 +5850,17 @@ Peers: - Lataajia: + Download Limit: - Latausraja: + Upload Limit: - Lähetysraja: + @@ -6613,69 +5883,69 @@ Kommentti: - + Select All Valitse kaikki - + Select None Poista valinnat - + Normal Normaali - + High Korkea Share Ratio: - Jakosuhde: + Reannounce In: - Julkaise uudelleen: + Last Seen Complete: - Viimeksi Nähty Valmistuneen: + Total Size: - Koko yhteensä: + Pieces: - Osia: + Created By: - Luonut: + Added On: - Lisätty: + Completed On: - Valmistunut: + Created On: - Luotu: + @@ -6685,168 +5955,168 @@ Save Path: - Tallennussijainti: + Tallennuskohde: - + Maximum Korkein + - Do not download Älä lataa - + Never - Ei koskaan + Ei koskaan - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) - - + + %1 (%2 this session) - %1 (tässä istunnossa %2) + - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) - %1 (enintään %2) + - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) - %1 (%2 yhteensä) + - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) - %1 (keskimäärin %2) + - + Open Avaa - + Open Containing Folder Avaa sisältävä kansio - + Rename... Nimeä uudelleen... - + Priority Tärkeysaste - + New Web seed - + Remove Web seed - + Copy Web seed URL - + Edit Web seed URL - + + Rename the file + Nimeä tiedosto uudelleen + + + New name: Uusi nimi: - - + + + The file could not be renamed + Tiedostoa ei voitu nimetä uudelleen + + + + This file name contains forbidden characters, please choose a different one. + Tiedostonimi sisältää kiellettyjä merkkejä, valitse toinen. + + + + This name is already in use in this folder. Please use a different name. Nimi on jo käytössä tässä kansiossa. Käytä toista nimeä. - + The folder could not be renamed Kansiota ei voitu nimetä uudelleen - + qBittorrent qBittorrent - + Filter files... - Suodata tiedostot... - - - - Renaming - Nimetään uudelleen - - - - - Rename error - Virhe nimettäessä uudelleen - - - - The name is empty or contains forbidden characters, please choose a different one. - Nimi on tyhjä tai se sisältää kiellettyjä merkkejä, valitse toinen. + - + New URL seed New HTTP source - + New URL seed: - - + + This URL seed is already in the list. - + Web seed editing - + Web seed URL: @@ -6854,860 +6124,817 @@ QObject - - %1 is an unknown command line parameter. - --random-parameter is an unknown command line parameter. - - - - - - %1 must be the single command line parameter. + + Your IP address has been banned after too many failed authentication attempts. - - You cannot use %1: qBittorrent is already running for this user. - Et voi käyttää %1: qBittorrent on jo käynnissä tälle käyttäjälle. - - - - Usage: - Käyttö: + + Error: '%1' is not a valid torrent file. + + Virhe: '%1' ei ole kelvollinen torrent-tiedosto. + - - Options: - Valinnat: + + Error: Could not add torrent to session. + - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - + + I/O Error: Could not create temporary file. + I/O-virhe: väliaikaistiedoston luominen epäonnistui. - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' + + %1 is an unknown command line parameter. + --random-parameter is an unknown command line parameter. - - Expected integer number in environment variable '%1', but got '%2' + + + %1 must be the single command line parameter. - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' + + %1 must specify the correct port (1 to 65535). - - Expected %1 in environment variable '%2', but got '%3' + + You cannot use %1: qBittorrent is already running for this user. - - port - portti + + Usage: + Käyttö: - - %1 must specify a valid port (1 to 65535). - + + Options: + Valinnat: - - Display program version and exit - Näytä ohjelman versio ja poistu + + Displays program version + Näyttää ohjelman version - - Display this help message and exit - Näytä tämä ohjeviesti ja poistu + + Displays this help message + Näyttää tämän ohjeviestin - - Change the Web UI port - Muuta Web-käyttöliittymän porttia + + Changes the Web UI port (current: %1) + - + Disable splash screen - Poista aloituskuva käytöstä + - + Run in daemon-mode (background) - Suorita daemon-tilassa (taustalla) - - - - dir - Use appropriate short form or abbreviation of "directory" - kansio + - - Store configuration files in <dir> + + Downloads the torrents passed by the user - - - name - nimi + + Help + Ohje - - Store configuration files in directories qBittorrent_<name> + + Run application with -h option to read about command line parameters. - - Hack into libtorrent fastresume files and make file paths relative to the profile directory + + Bad command line - - files or URLs - tiedostoja tai URL-osoitteita + + Bad command line: + - - Download the torrents passed by the user + + Legal Notice - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. - - Options when adding new torrents: - + + Press %1 key to accept and continue... + Paina %1 hyväksyäksesi ja jatkaaksesi... - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume + + Legal notice - - path - sijainti - - - - Torrent save path - Torrentin tallennussijainti + + Cancel + Peruuta - - Add torrents as started or paused - Lisää torrent aloitettuna tai keskeytettynä + + I Agree + Hyväksyn - - Skip hash check - Ohita tarkistussumman laskeminen + + Torrent name: %1 + Torrentin nimi: %1 - - Assign torrents to category. If the category doesn't exist, it will be created. - + + Torrent size: %1 + Torrentin koko: %1 - - Download files in sequential order - Lataa tiedostot järjestyksessä + + Save path: %1 + Tallennuskohde: %1 - - Download first and last pieces first - Lataa ensin ensimmäinen ja viimeinen osa + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Torrent ladattiin ajassa %1. - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - + + Thank you for using qBittorrent. + Kiitos kun käytät qBittorrentia. - - Command line parameters take precedence over environment variables + + [qBittorrent] '%1' has finished downloading - - Help - Ohje - - - - Run application with -h option to read about command line parameters. + + The remote host name was not found (invalid hostname) - - Bad command line + + The operation was canceled - - Bad command line: + + The remote server closed the connection prematurely, before the entire reply was received and processed - - Legal Notice - Oikeudellinen Huomautus - - - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + + The connection to the remote server timed out - - No further notices will be issued. + + SSL/TLS handshake failed - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - qBittorrent on tiedostonjako-ohjelma. Kun torrent on aktiivisena, sen tiedot ovat muiden saatavilla. Olet vastuussa kaikesta jakamastasi. - -Muita varoituksia ei anneta. - - - - Press %1 key to accept and continue... - Paina %1 hyväksyäksesi ja jatkaaksesi... - - - - Legal notice - Oikeudellinen huomautus - - - - Cancel - Peruuta - - - - I Agree - Hyväksyn - - - - - Upgrade - Päivitä - - - - You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] + + The remote server refused the connection - - You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. + + The connection to the proxy server was refused - - Couldn't migrate torrent with hash: %1 - Ei voitu siirtää torrenttia tarkistussummalla: %1 - - - - Couldn't migrate torrent. Invalid fastresume file name: %1 + + The proxy server closed the connection prematurely - - Detected unclean program exit. Using fallback file to restore settings: %1 + + The proxy host name was not found - - An access error occurred while trying to write the configuration file. + + The connection to the proxy timed out or the proxy did not reply in time to the request sent - - A format error occurred while trying to write the configuration file. + + The proxy requires authentication in order to honor the request but did not accept any credentials offered - - An unknown error occurred while trying to write the configuration file. + + The access to the remote content was denied (401) - - - RSS::AutoDownloader - - - Invalid data format. + + The operation requested on the remote content is not permitted - - Couldn't save RSS AutoDownloader data in %1. Error: %2 + + The remote content was not found at the server (404) - - Invalid data format + + The remote server requires authentication to serve the content but the credentials provided were not accepted - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 + + The Network Access API cannot honor the request because the protocol is not known - - Couldn't load RSS AutoDownloader rules. Reason: %1 + + The requested operation is invalid for this protocol - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 + + An unknown network-related error was detected - - RSS feed at '%1' updated. Added %2 new articles. + + An unknown proxy-related error was detected - - Failed to parse RSS feed at '%1'. Reason: %2 + + An unknown error related to the remote content was detected - - Couldn't read RSS Session data from %1. Error: %2 + + A breakdown in protocol was detected - - Couldn't parse RSS Session data. Error: %1 - + + Unknown error + Tuntematon virhe - - Couldn't load RSS Session data. Invalid data format. + + + Upgrade - - Couldn't load RSS article '%1#%2'. Invalid data format. + + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - - - RSS::Private::Parser - - - Invalid RSS feed. - Virheellinen RSS-syöte. - - - %1 (line: %2, column: %3, offset: %4). + + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - - - RSS::Session - - - RSS feed with given URL already exists: %1. - Annetulla URL-osoitteella on jo olemassa RSS-syöte: %1. - - - - Cannot move root folder. + + Couldn't migrate torrent with hash: %1 - - - Item doesn't exist: %1. + + Couldn't migrate torrent. Invalid fastresume file name: %1 - - Cannot delete root folder. + + Detected unclean program exit. Using fallback file to restore settings. - - Incorrect RSS Item path: %1. - Väärä RSS-kohteen polku: %1. - - - - RSS item with given path already exists: %1. + + An access error occurred while trying to write the configuration file. - - Parent folder doesn't exist: %1. + + A format error occurred while trying to write the configuration file. - RSSWidget + RSS - + Search Etsi - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - RSS-syötteiden haku on nyt poistettu käytöstä! Voit ottaa sen käyttöön sovellusasetuksista. - - - + New subscription Uusi tilaus - - - + + + Mark items read - Merkitse kohteet luetuiksi + Merkitse lukemattomaksi - - Refresh RSS streams - - - - + Update all Päivitä kaikki - + RSS Downloader... RSS-lataaja... - + + Settings... + Asetukset... + + + Torrents: (double-click to download) Torrentit: (tuplaklikkaa ladataksesi) - - + + Delete Poista - + Rename... Nimeä uudelleen... - + Rename Nimeä uudelleen - - + + Update Päivitä - + New subscription... Uusi tilaus... - - + + Update all feeds - Päivitä kaikki syötteet + Päivitä syötteet - + Download torrent Lataa torrentti - + Open news URL - + Avaa uusi URL - + Copy feed URL Kopioi syötteen osoite - + New folder... Uusi kansio... - + + Refresh RSS streams + Päivitä syötteet + + + + RSSImp + + + Stream URL: + Syötteen osoite: + + + + Please type a RSS stream URL + + + + + This RSS feed is already in the list. + RSS-syöte on jo listalla. + + + Please choose a folder name Valitse kansion nimi - + Folder name: Kansion nimi: - + New folder Uusi kansio - - Please type a RSS feed URL - Anna RSS-syötteen verkko-osoite. - - - - Feed URL: - Syötteen osoite: - - - + Deletion confirmation - Poistamisen vahvistus + Poistovahvistus - + Are you sure you want to delete the selected RSS feeds? Haluatko varmasti poistaa valitut RSS-syötteet? - + Please choose a new name for this RSS feed Valitse uusi nimi tälle RSS-syötteelle - + New feed name: Uusi syötteen nimi: - - Rename failed - Uudelleennimeäminen epäonnistui + + Name already in use + Nimi on jo käytössä + + + + This name is already used by another item, please choose another one. + Tämä nimi on jo käytössä, valitse toinen. - + Date: - Päiväys: + Päivä: - + Author: Tekijä: + + + Unread + Lukematon + - ScanFoldersDelegate + Rss::Feed - - Select save location - Valitse tallennussijainti + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + - ScanFoldersModel + Rss::Private::Parser - - Monitored Folder - Valvottu Kansio + + Invalid RSS feed. + Virheellinen RSS-syöte. + + + RssSettingsDlg - - Override Save Location - + + RSS Reader Settings + RSS-lukijan asetukset - - Monitored folder - Valvottu kansio + + RSS feeds refresh interval: + RSS-syötteen päivitystiheys: - - Default save location - Oletus tallennussijainti + + min + - - Browse... - Selaa... + + Maximum number of articles per feed: + Artikkeleiden enimmäismäärä syötettä kohden: - SearchJobWidget + ScanFoldersDelegate - - Form + + Select save location + + + ScanFoldersModel - - Results(xxx) + + Monitored Folder - - Search in: + + Override Save Location - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + + Monitored folder - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + + Default save location - - Seeds: - Jakajia: - - - - <html><head/><body><p>Minimal number of seeds</p></body></html> - + + Browse... + Selaa... + + + SearchEngine - - - to + + Unknown search engine plugin file format. - - <html><head/><body><p>Maximal number of seeds</p></body></html> - + + A more recent version of this plugin is already installed. + Liitännäisestä on jo asennettu uudempi versio. - - - - + + + Plugin is not supported. + Liitännäinen ei ole tuettu. - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + + Update server is temporarily unavailable. %1 + Päivityspalvelimeen ei saada juuri nyt yhteyttä. %1 - - Size: - Koko: + + + Failed to download the plugin file. %1 + Liitännäistiedoston lataus epäonnistui. %1 - - <html><head/><body><p>Minimal torrent size</p></body></html> + + An incorrect update info received. - - <html><head/><body><p>Maximal torrent size</p></body></html> - + + All categories + Kaikki kategoriat - - Name - i.e: file name - Nimi + + Movies + Elokuvat - - Size - i.e: file size - Koko + + TV shows + TV-ohjelmat - - Seeders - i.e: Number of full sources - + + Music + Musiikki - + + Games + Pelit + + + + Anime + Anime + + + + Software + Ohjelmat + + + + Pictures + Kuvat + + + + Books + Kirjat + + + + SearchListDelegate + + + + Unknown + Tuntematon + + + + SearchTab + + + Name + i.e: file name + Nimi + + + + Size + i.e: file size + Koko + + + + Seeders + i.e: Number of full sources + Jakajia + + + Leechers i.e: Number of partial sources - + Lataajia - + Search engine - - - - - Filter search results... - + Hakukone - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Torrent names only - + Everywhere - - Use regular expressions - - - - + Searching... - + Search has finished Haku valmis - + Search aborted - + An error occurred during search... - + Search returned no results - + Column visibility Sarakkeen näkyvyys - - - SearchPluginManager - - Unknown search engine plugin file format. + + Form - - A more recent version of this plugin is already installed. + + Results(xxx) - - - Plugin is not supported. + + Search in: - - All categories - Kaikki kategoriat - - - - Movies - Elokuvat - - - - TV shows - TV-ohjelmat + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + - - Music - Musiikki + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + - - Games - Pelit + + Seeds: + - - Anime - Anime + + <html><head/><body><p>Minimal number of seeds</p></body></html> + - - Software - Ohjelmat + + + to + - - Pictures - Kuvat + + <html><head/><body><p>Maximal number of seeds</p></body></html> + - - - Books - Kirjat + + + + + - - Update server is temporarily unavailable. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - - - Failed to download the plugin file. %1 - + + Size: + Koko: - - An incorrect update info received. + + <html><head/><body><p>Minimal torrent size</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> @@ -7716,197 +6943,185 @@ - - - - + + + Search Etsi - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - - + Download Lataa - + Go to description page - Siirry kuvaussivulle + - + Copy description page URL - Kopioi kuvaussivuston osoite + - + Search plugins... Hakuliitännäiset - + A phrase to search for. - Haku fraasi. + - + Spaces in a search term may be protected by double quotes. - + Example: Search phrase example - Esimerkki: + - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - + All plugins Kaikki liitännäiset - + Only enabled - Vain käytössä olevat + - + Select... - Valitse... + - - - + + + Search Engine Hakukone - + Please install Python to use the Search Engine. Asenna Python käyttääksesi hakukonetta. - + Empty search pattern - Tyhjä hakulauseke + - + Please type a search pattern first - Kirjoita ensin hakulauseke + - + Stop Pysäytä - + Search has finished Haku valmis - + Search has failed Haku epäonnistui - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + qBittorrent sulkeutuu - + E&xit Now - + Exit confirmation - + Lopetusvahvistus - + The computer is going to shutdown. - + Tietokone sammutetaan. - + &Shutdown Now - - - - - Shutdown confirmation - + &Sammuta nyt - + The computer is going to enter suspend mode. - + Tietokone siirtyy lepotilaan. - + &Suspend Now - + &Aseta lepotilaan nyt - + Suspend confirmation - + Lepotilaan siirtymisen vahvistus - + The computer is going to enter hibernation mode. - + Tietokone siirtyy horrostilaan. - + &Hibernate Now - + &Aseta horrostilaan nyt - + Hibernate confirmation - + Horrostilaan siirtymisen vahvistus - + You can cancel the action within %1 seconds. - + Voit perua toiminnon %1 sekunnin sisällä. + + + + Shutdown confirmation + Sammutuksen vahvistus SpeedLimitDialog - + KiB/s KiB/s @@ -7914,52 +7129,52 @@ SpeedPlotView - + Total Upload - Lähetys Yhteensä + - + Total Download - Lataus Yhteensä + - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - DHT Lähetys + - + DHT Download - DHT Lataus + - + Tracker Upload - + Tracker Download @@ -7967,95 +7182,87 @@ SpeedWidget - + Period: - Ajanjakso: + - + 1 Minute 1 minuutti - + 5 Minutes 5 minuuttia - + 30 Minutes 30 minuuttia - + 6 Hours 6 tuntia - + Select Graphs - Valitse Kaaviot + - + Total Upload - Lähetys Yhteensä + - + Total Download - Lataus Yhteensä + - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - DHT Lähetys + - + DHT Download - DHT Lataus + - + Tracker Upload - + Tracker Download - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8068,48 +7275,48 @@ Käyttäjätilastot - - Cache statistics - Välimuistitilastot + + Total peer connections: + - - Read cache hits: - Luetut välimuistin osumat: + + Global ratio: + Yleinen jakosuhde: - - Average time in queue: - Keskimääräinen aika jonossa: + + Alltime download: + Yhteensä ladattu: - - Connected peers: - + + Alltime upload: + Yhteensä lähetetty: - - All-time share ratio: + + Total waste (this session): - - All-time download: + + Cache statistics - - Session waste: + + Read cache hits: - - All-time upload: + + Average time in queue: - Total buffer size: + Total buffers size: @@ -8125,49 +7332,59 @@ Write cache overload: - Kirjoitusvälimuistin ylikuormitus: + Read cache overload: - Lukuvälimuistin ylikuormitus: + Total queued size: - Jonotettu koko yhteensä: + + + + + OK + OK - + %1 ms 18 milliseconds - %1 ms + StatusBar - + Connection status: Yhteyden tila: - + No direct connections. This may indicate network configuration problems. Ei suoria yhteyksiä. Tämä voi olla merkki verkko-ongelmista. - + DHT: %1 nodes DHT: %1 solmua - - qBittorrent needs to be restarted! - qBittorrent pitää käynnistää uudelleen! + + qBittorrent needs to be restarted + qBittorrent pitää käynnistää uudelleen + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent päivitettiin juuri, ja on käynnistettävä uudelleen jotta muutokset tulisivat voimaan. @@ -8186,1564 +7403,1311 @@ Verkkoyhteydessä - + Click to switch to alternative speed limits Napsauta vaihtaaksesi vaihtoehtoisiin nopeusrajoituksiin - + Click to switch to regular speed limits Napsauta vaihtaaksesi tavallisiin nopeusrajoituksiin - + + Manual change of rate limits mode. The scheduler is disabled. + + + + Global Download Speed Limit Yleinen latausnopeusrajoitus - + Global Upload Speed Limit Yleinen lähetysnopeusrajoitus - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - Kaikki (0) + Kaikki (0) - + Downloading (0) - + Ladataan (0) - + Seeding (0) - + Jakaa (0) - + Completed (0) - + Valmiina (0) - + Resumed (0) - + Jatkettu (0) - + Paused (0) - + Pysäytetty (0) - + Active (0) - + Aktiivisena (0) - + Inactive (0) - + Ei aktiivisena (0) - + Errored (0) - + All (%1) - Kaikki (%1) + Kaikki (%1) - + Downloading (%1) - + Ladataan (%1) - + Seeding (%1) - + Jakaa (%1) - + Completed (%1) - + Valmiina (%1) - + Paused (%1) - + Pysäytetty (%1) - + Resumed (%1) - + Jatkettu (%1) - + Active (%1) - + Aktiivisena (%1) - + Inactive (%1) - + Ei aktiivisena (%1) - + Errored (%1) - TagFilterModel + TorrentContentModel - - Tags - Tunnisteet + + Name + Nimi - - All - Kaikki + + Size + Koko - - Untagged - Tunnisteettomat + + Progress + Edistyminen - - - TagFilterWidget - - Add tag... - Lisää tunniste... + + Download Priority + Latauksen tärkeysaste - - Remove tag - Poista tunniste + + Remaining + Jäljellä + + + TorrentCreatorDlg - - Remove unused tags - Poista käyttämättömät tunnisteet + + Select a folder to add to the torrent + Valitse torrentiin lisättävä kansio - - Resume torrents - Jatka torrentteja + + Select a file to add to the torrent + Valitse torrentiin lisättävä tiedosto - - Pause torrents - Keskeytä torrentit + + No input path set + - - Delete torrents - Poista torrentit + + Please type an input path first + - - New Tag - Uusi tunniste + + Select destination torrent file + Valitse kohde-torrent-tiedosto - - Tag: - Tunniste: + + Torrent Files (*.torrent) + - - Invalid tag name - Virheellinen tunniste nimi + + Torrent was created successfully: %1 + %1 is the path of the torrent + - - Tag name '%1' is invalid - Tunnisteen nimi '%1' ei kelpaa + + + + Torrent creation + Torrentin luonti - - Tag exists - Tunniste on olemassa + + Torrent creation was unsuccessful, reason: %1 + Torrentin luominen epäonnistui, syy: %1 - - Tag name already exists. - Tunnisteen nimi on jo olemassa + + Created torrent file is invalid. It won't be added to download list. + Luotu torrent-tiedosto on virheellinen, sitä ei lisätä latausluetteloon. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - + + Name + i.e: torrent name + Nimi - - Name: - Nimi: + + Size + i.e: torrent size + Koko - - Save path: - Tallennussijainti: + + Done + % Done + Valmis - - Choose save path - Valitse tallennussijainti + + Status + Torrent status (e.g. downloading, seeding, paused) + Tila - - New Category - Uusi kategoria + + Seeds + i.e. full sources (often untranslated) + Jakajia - - Invalid category name - Virheellinen kategorian nimi + + Peers + i.e. partial sources (often untranslated) + Lataajia - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - + + Down Speed + i.e: Download speed + Latausnopeus - - Category creation error - Kategorian luomisvirhe + + Up Speed + i.e: Upload speed + Lähetysnopeus - - Category with the given name already exists. -Please choose a different name and try again. - Tämän niminen kategoria on jo olemassa. -Valitse toinen nimi ja yritä uudelleen. + + Ratio + Share ratio + Jakosuhde - - - TorrentContentModel - - Name - Nimi + + ETA + i.e: Estimated Time of Arrival / Time left + Aika - - Size - Koko + + Category + Kategoria - - Progress - Edistyminen + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Lisätty - - Download Priority - Latauksen tärkeysaste + + Completed On + Torrent was completed on 01/01/2010 08:00 + Valmistunut - - Remaining - Jäljellä + + Tracker + Seurantapalvelin - - Availability - Saatavuus + + Down Limit + i.e: Download limit + Latausraja - - - TorrentCreatorDialog - - Torrent Creator - + + Up Limit + i.e: Upload limit + Lähetysraja - - Select file/folder to share - + + Downloaded + Amount of data downloaded (e.g. in MB) + Ladattu - - Path: - + + Uploaded + Amount of data uploaded (e.g. in MB) + Lähetetty - - [Drag and drop area] + + Session Download + Amount of data downloaded since program open (e.g. in MB) - - - Select file + + Session Upload + Amount of data uploaded since program open (e.g. in MB) - - - Select folder - + + Remaining + Amount of data left to download (e.g. in MB) + Jäljellä - - Settings - + + Time Active + Time (duration) the torrent is active (not paused) + Aikaa aktiivisena - - Piece size: - + + Save path + Torrent save path + Tallennussijainti - - Auto - + + Completed + Amount of data completed (e.g. in MB) + Valmistunut - - 16 KiB + + Ratio Limit + Upload share ratio limit - - 32 KiB + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole - - 64 KiB + + Last Activity + Time passed since a chunk was downloaded/uploaded - - 128 KiB - + + Total Size + i.e. Size including unwanted data + Koko yhteensä + + + TrackerFiltersList - - 256 KiB - + + All (0) + this is for the tracker filter + Kaikki (0) - - 512 KiB - + + Trackerless (0) + Ei seurantapalvelinta (0) - - 1 MiB - + + Error (0) + Virhe (0) - - 2 MiB - + + Warning (0) + Varoitus (0) - - 4 MiB - + + + Trackerless (%1) + Ei seurantapalvelinta (%1) - - 8 MiB - + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - 16 MiB - + + + Error (%1) + Virhe (%1) - - 32 MiB - + + + Warning (%1) + Varoitus (%1) - - Calculate number of pieces: - + + Resume torrents + Jatka torrentteja - - Private torrent (Won't distribute on DHT network) - + + Pause torrents + Pysäytä torrentit - - Start seeding immediately - + + Delete torrents + Poista torrentit - - Ignore share ratio limits for this torrent - + + + All (%1) + this is for the tracker filter + Kaikki (%1) + + + TrackerList - - Optimize alignment - + + URL + Verkko-osoite - - Fields - + + Status + Tila - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + + Received - - Web seed URLs: - + + Seeds + Jakajia - - Tracker URLs: - + + Peers + Käyttäjät - - Comments: - + + Downloaded + Ladattu - - Source: - + + Message + Viesti - - Progress: - Edistyminen: + + + Working + Toiminnassa - - Create Torrent - + + Disabled + Ei käytössä - - - - Torrent creation failed - + + This torrent is private + Torrentti on yksityinen - - Reason: Path to file/folder is not readable. - + + Updating... + Päivitetään... - - Select where to save the new torrent - + + Not working + Ei toiminnassa - - Torrent Files (*.torrent) - + + Not contacted yet + Ei ole vielä yhteyttä - - Reason: %1 - + + Tracker URL: + Seurantapalvelimen osoite: - - Reason: Created torrent is invalid. It won't be added to download list. - + + Tracker editing + Seurantapalvelimen muokkaus - - Torrent creator - + + + Tracker editing failed + Seurantapalvelimen muokkaaminen epäonnistui - - Torrent created: - + + The tracker URL entered is invalid. + Annettu seurantapalvelimen osoite on virheellinen. - - - TorrentInfo - - File size exceeds max limit %1 - + + The tracker URL already exists. + Seurantapalvelimen osoite on jo olemassa. + + + + Add a new tracker... + Lisää uusi seurantapalvelin... - - Torrent file read error: %1 + + Copy tracker URL - - Torrent file read error: size mismatch + + Edit selected tracker URL + Muokkaa valitun seurantapalvelimen osoitetta + + + + Force reannounce to selected trackers - - - TorrentsController - - Not contacted yet + + Force reannounce to all trackers - - Updating... - Päivitetään... + + Remove tracker + Poista seurantapalvelin + + + TrackersAdditionDlg - - Working - Toiminnassa + + Trackers addition dialog + Seurantapalvelimien lisäys - - Not working - Ei toiminnassa + + List of trackers to add (one per line): + Lisättävien seurantapalvelimien lista (yksi per rivi): + + + + µTorrent compatible list URL: + µTorrent-yhteensopivan listan osoite: - - Error: '%1' is not a valid torrent file. - + + I/O Error + I/O-virhe - - - - - Torrent queueing must be enabled - + + Error while trying to open the downloaded file. + Virhe avattaessa ladattua tiedostoa. - - Save path cannot be empty - + + No change + Ei muutosta - - - Category cannot be empty - + + No additional trackers were found. + Lisää seurantapalvelimia ei löytynyt. - - Unable to create category - + + Download error + Latausvirhe - - Unable to edit category - + + The trackers list could not be downloaded, reason: %1 + Seurantapalvelinlistaa ei voitu ladata, syy: %1 + + + TransferListDelegate - - Cannot make save path - + + Downloading + Ladataan - - Cannot write to directory - + + Downloading metadata + used when loading a magnet link + Ladataan metadataa - - WebUI Set location: moving "%1", from "%2" to "%3" + + Allocating + qBittorrent is allocating the files on disk - - Incorrect torrent name - + + Paused + Pysäytetty - - - Incorrect category name - Väärä kategorian nimi - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - Kaikki (0) - - - - Trackerless (0) - Ei seurantapalvelinta (0) - - - - Error (0) - Virhe (0) - - - - Warning (0) - Varoitus (0) - - - - - Trackerless (%1) - Ei seurantapalvelinta (%1) - - - - - Error (%1) - Virhe (%1) - - - - - Warning (%1) - Varoitus (%1) - - - - Resume torrents - Jatka torrentteja - - - - Pause torrents - Keskeytä torrentit - - - - Delete torrents - Poista torrentit - - - - - All (%1) - this is for the tracker filter - Kaikki (%1) - - - - TrackerListWidget - - - - Working - Toiminnassa - - - - Disabled - Ei käytössä - - - - This torrent is private - - - - - Updating... - Päivitetään... - - - - Not working - Ei toiminnassa - - - - Not contacted yet - - - - - - - - - - N/A - Ei saatavilla - - - - Tracker editing - - - - - Tracker URL: - - - - - - Tracker editing failed - - - - - The tracker URL entered is invalid. - - - - - The tracker URL already exists. - - - - - Add a new tracker... - - - - - Remove tracker - - - - - Copy tracker URL - - - - - Edit selected tracker URL - - - - - Force reannounce to selected trackers - - - - - Force reannounce to all trackers - - - - - URL - - - - - Status - Tila - - - - Received - - - - - Seeds - - - - - Peers - Lataajat - - - - Downloaded - Ladattu - - - - Message - - - - - Column visibility - Sarakkeen näkyvyys - - - - TrackerLoginDialog - - - - Tracker authentication - - - - - Tracker: - - - - - Login - Kirjaudu - - - - Username: - Käyttäjänimi: - - - - Password: - Salasana: - - - - Log in - - - - - TrackersAdditionDialog - - - Trackers addition dialog - - - - - List of trackers to add (one per line): - - - - - µTorrent compatible list URL: - - - - - No change - - - - - No additional trackers were found. - - - - - Download error - Lataamisvirhe - - - - The trackers list could not be downloaded, reason: %1 - - - - - TransferListDelegate - - - Downloading - Ladataan - - - - Downloading metadata - used when loading a magnet link - Ladataan metadataa - - - - Allocating - qBittorrent is allocating the files on disk - Varataan - - - - Paused - Keskeytetty - - - + Queued i.e. torrent is queued Jonossa - + Seeding Torrent is complete and in upload-only mode Jaetaan - + Stalled Torrent is waiting for download to begin Pysähtynyt - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [P] Lataa - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [P] Jakaa - + Checking Torrent local data is being checked Tarkastetaan - + Queued for checking i.e. torrent is queued for hash checking - Jonottaa tarkistusta - - - - Checking resume data - used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - - - - - Completed - Valmistunut - - - - Moving - Torrent local data are being moved/relocated - - - - - Missing Files - Puuttuvia Tiedostoja - - - - Errored - torrent status, the torrent has an error - Virheelliset - - - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - - - - - %1 ago - e.g.: 1h 20m ago - %1 sitten - - - - TransferListFiltersWidget - - - Status - Tila - - - - Categories - Kategoriat - - - - Tags - Tunnisteet - - - - Trackers - Seurantapalvelimet - - - - TransferListModel - - - Name - i.e: torrent name - Nimi - - - - Size - i.e: torrent size - Koko - - - - Done - % Done - - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Tila - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - Lataajat - - - - Down Speed - i.e: Download speed - Latausnopeus - - - - Up Speed - i.e: Upload speed - Lähetysnopeus - - - - Ratio - Share ratio - - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - Kategoria - - - - Tags - Tunnisteet - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Ladattu - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Lähetetty - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - Jäljellä - - - - Time Active - Time (duration) the torrent is active (not paused) - - - - - Save path - Torrent save path + + Checking resume data + used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - + Completed - Amount of data completed (e.g. in MB) Valmistunut - - Ratio Limit - Upload share ratio limit + + Missing Files - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole + + Errored + torrent status, the torrent has an error - - Last Activity - Time passed since a chunk was downloaded/uploaded + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) - - Total Size - i.e. Size including unwanted data - + + %1 ago + e.g.: 1h 20m ago + %1 sitten + + + + TransferListFiltersWidget + + + Status + Tila + + + + Categories + Kategoriat + + + + Trackers + Seurantapalvelimet TransferListWidget - + Column visibility Sarakkeen näkyvyys - + Choose save path - Valitse tallennussijainti + Valitse tallennuskansio - + Torrent Download Speed Limiting Torrentin latausnopeuden rajoitus - + Torrent Upload Speed Limiting Torrentin lähetysnopeuden rajoitus - + Recheck confirmation Uudelleentarkistuksen vahvistus - + Are you sure you want to recheck the selected torrent(s)? Haluatko varmasti tarkistaa uudelleen valitut torrentit? - + Rename Nimeä uudelleen - + New name: Uusi nimi: - + Resume Resume/start the torrent Jatka - + Force Resume Force Resume/start the torrent Pakota jatkaminen - + Pause Pause the torrent - Keskeytä - - - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - - - - - Add Tags - Lisää Tunnisteita - - - - Remove All Tags - Poista Kaikki Tunnisteet + Pysäytä - - Remove all tags from selected torrents? - Poistetaanko kaikki tunnisteet valitusta torrentista? + + New Category + Uusi kategoria - - Comma-separated tags: - Pilkulla erotetut tunnisteet: + + Category: + Kategoria: - - Invalid tag - Virheellinen tunniste + + Invalid category name + Virheellinen kategorian nimi - - Tag name: '%1' is invalid - Tunnisteen nimi '%1' ei kelpaa + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Kategorian nimessä ei saa olla merkkiä '\'. +Kategorian nimi ei saa alkaa/päättyä merkillä '/'. +Kategorian nimessä ei saa olla merkkijonoa '//'. - + Delete Delete the torrent Poista - + Preview file... Esikatsele... - + Limit share ratio... Rajoita jakosuhde... - + Limit upload rate... Rajoita lähetysnopeus... - + Limit download rate... Rajoita latausnopeus... - + Open destination folder Avaa kohdekansio - + Move up i.e. move up in the queue Siirrä ylös jonossa - + Move down i.e. Move down in the queue Siirrä alas jonossa - + Move to top i.e. Move to top of the queue Siirrä jonon kärkeen - + Move to bottom i.e. Move to bottom of the queue Siirrä jonon viimeiseksi - + Set location... Aseta kohdekansio... - - Force reannounce - - - - + Copy name Kopioi nimi - - Copy hash - Kopioi tarkistussumma - - - + Download first and last pieces first - Lataa ensin ensimmäinen ja viimeinen osa + - + Automatic Torrent Management - Automaattinen torrentien hallintatila + - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - + Category Kategoria - + New... New category... Uusi... - + Reset Reset category - Palauta - - - - Tags - Tunnisteet - - - - Add... - Add / assign multiple tags... - Lisää... - - - - Remove All - Remove all tags - Poista kaikki + - + Priority Tärkeysaste - + Force recheck Pakota uudelleentarkistus - + Copy magnet link Kopioi Magnet-osoite - + Super seeding mode super seed -tila - + Rename... Nimeä uudelleen... - + Download in sequential order Lataa järjestyksessä - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - - Use global share limit - + + Use global ratio limit + Käytä yleistä jakosuhteen rajoitusta - - - + + + buttonGroup - - Set no share limit + + Set no ratio limit + Rajaton + + + + Set ratio limit to + + + WebApplication - - Set share limit to + + Incorrect category name + + + WebUI - - ratio + + The Web UI is listening on port %1 - - minutes + + Web UI Error - Unable to bind Web UI to port %1 + + + about - - No share limit method selected + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - Please select a limit method first + + Copyright %1 2006-2016 The qBittorrent project + Copyright %1 2006-2016 The qBittorrent project + + + + Home Page: + Kotisivu: + + + + Forum: + Foorumi: + + + + Bug Tracker: - Utils::ForeignApps + addPeersDialog + + + Add Peers + Lisää käyttäjiä + - - Python detected, version: %1 + + List of peers to add (one per line): - - Python not detected + + Format: IPv4:port / [IPv6]:port - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - + + + Tracker authentication + Seurantapalvelimen todennus - - Symlinks inside alternative UI folder are forbidden. - + + Tracker: + Seurantapalvelin: - - Exceeded the maximum allowed file size (%1)! - + + Login + Sisäänkirjautuminen - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - + + Username: + Käyttäjätunnus: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - + + Password: + Salasana: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - + + Log in + Kirjaudu sisään - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - + + Cancel + Peruuta - WebUI + confirmDeletionDlg - - Web UI: HTTPS setup successful - Web-käyttöliittymä: HTTPS-määritys onnistui + + Deletion confirmation - qBittorrent + Poistovahvistus - qBittorrent - - Web UI: HTTPS setup failed, fallback to HTTP - + + Remember choice + Muista valinta + + + + Also delete the files on the hard disk + Poista tiedostot myös kiintolevyltä + + + + confirmShutdownDlg + + + Don't show again + Älä näytä uudelleen + + + + createTorrentDialog + + + Cancel + Peruuta + + + + Torrent Creation Tool + Luo uusi torrent - - Web UI: Now listening on IP: %1, port: %2 + + Torrent file creation + Torrent-tiedoston luominen + + + + Add file + Lisää tiedosto + + + + Add folder + Lisää kansio + + + + File or folder to add to the torrent: + Torrentiin lisättävä tiedosto tai kansio: + + + + Tracker URLs: + Seurantapalvelimien osoitteet: + + + + Web seeds urls: + Weblähteet: + + + + Comment: + Kommentti: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 + + Piece size: + Osakoko: + + + + 16 KiB + 512 KiB {16 ?} + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + Automaattinen + + + + Private (won't be distributed on DHT network if enabled) + Yksityinen (ei jaeta DHT-verkossa) + + + + Start seeding after creation + Aloita torrentin jakaminen luomisen jälkeen + + + + Ignore share ratio limits for this torrent + Älä huomioi jakorajoituksia tämän torrentin kohdalla + + + + Create and save... + Luo ja tallenna... + + + + Progress: + Edistyminen: + + + + downloadFromURL + + + Add torrent links + Lisää torrent-linkkejä + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + + + Download + Lataa + + + + Cancel + Peruuta + + + + Download from urls + Lataa verkko-osoitteista + + + + No URL entered + Et antanut verkko-osoitetta + + + + Please type at least one URL. + Anna vähintään yksi verkko-osoite. + + + + errorDialog + + + Crash info + Kaatumistiedot + fsutils - + + + + + Downloads Lataukset @@ -9751,100 +8715,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) - PiB + - + EiB exbibytes (1024 pebibytes) - EiB + + + + + Python not detected + Pythonia ei havaittu + + + + Python version: %1 + Pythonin versio: %1 - + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1 h %2 min - + %1d %2h e.g: 2days 10hours %1 d %2 h - + Unknown Unknown (size) Tuntematon - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent sammuttaa tietokoneen nyt, koska kaikki lataukset ovat valmistuneet. - + < 1m < 1 minute alle minuutti - + %1m e.g: 10minutes %1 min + + + Working + Toiminnassa + + + + Updating... + Päivitetään... + + + + Not working + Ei toiminnassa + + + + Not contacted yet + Ei yhteyttä vielä + preview - + Preview selection Esikatsele valinta - + The following files support previewing, please select one of them: Seuraavat tiedostot tukevat esikatselua, valitse yksi niistä: + + + Preview + Esikatsele + + + + Cancel + Peruuta + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_fr.ts qbittorrent-3.3.15/src/lang/qbittorrent_fr.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_fr.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_fr.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent À propos de qBittorrent - + About À propos - + Author Auteur - - Current maintainer - Mainteneur actuel - - - - Greece - Grèce - - - - + + Nationality: Nationalité : - - + + + Name: + Nom : + + + + E-mail: - + Courriel : - - - Name: - Nom : + + Greece + Grèce - - Original author - + + Current maintainer + Mainteneur actuel - - France - France + + Original author + Auteur original - + Special Thanks Remerciements - + Translators Traducteurs - - License - Licence - - - + Libraries Bibliothèques - + qBittorrent was built with the following libraries: - - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - + qBittorrent a été compilé avec les bibliothèques suivantes : - - Forum: - + + France + France - - Bug Tracker: - + + License + Licence @@ -115,57 +90,67 @@ Sauvegarder sous - + + Browse... + Parcourir... + + + + Set as default save path + Utiliser comme dossier de sauvegarde par défaut + + + Never show again Ne plus afficher - + Torrent settings Paramètres du torrent - + Set as default category Définir comme catégorie par défaut - + Category: Catégorie : - + Start torrent Démarrer le torrent - + Torrent information Informations sur le torrent - + Skip hash check Ne pas vérifier les données du torrent - + Size: Taille : - + Hash: Hash : - + Comment: Commentaire : - + Date: Date : @@ -177,7 +162,7 @@ Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - Le mode automatique signifie que certaines propriétés du torrent (ex: le dossier d'enregistrement) seront décidées via la catégorie associée + Le mode automatique signifie que certaines propriétés du torrent (ex: le dossier d'enregistrement) seront décidés via la catégorie associée @@ -190,117 +175,89 @@ Automatique - - Remember last used save path - - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog Quand coché, le fichier .torrent ne sera pas supprimé malgré les paramètres de la page "Téléchargements" des options. - + Do not delete .torrent file - Ne pas supprimer le fichier .torrent - - - - Create subfolder - Créer un sous-dossier - - - - Download in sequential order - Téléchargement séquentiel - - - - Download first and last pieces first - Télécharger premières et dernières pièces en premier + ne pas supprimer le fichier .torrent - + Normal Normale - + High Haute - + Maximum Maximale - + Do not download Ne pas télécharger - - - + + + I/O Error Erreur E/S - + Invalid torrent Torrent invalide - - Renaming - Renommage - - - - - Rename error - Erreur de renommage + + + + + Already in download list + Déjà présent dans la liste des téléchargements - - The name is empty or contains forbidden characters, please choose a different one. - Ce nom est vide ou contient des caractères interdits, veuillez en choisir un autre. - - - + Not Available This comment is unavailable Non disponible - + Not Available This date is unavailable Non disponible - + Not available Non disponible - + Invalid magnet link Lien magnet invalide - + The torrent file '%1' does not exist. Le torrent '%1' n'existe pas. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. Le torrent '%1' ne peut pas être lu sur le disque. Vous n'avez probablement pas les permissions requises. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ Erreur : %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Le torrent est déjà dans la liste de téléchargement. Les trackers n'ont pas été fusionnés car c'est un torrent privé. + + + + Torrent is already in download list. Trackers were merged. + Le torrent est déjà dans la liste de téléchargement. Les trackers ont été fusionnés. + + + + + Cannot add torrent + Impossible d'ajouter le torrent + + + + Cannot add this torrent. Perhaps it is already in adding state. + Impossible d'ajouter ce torrent. Peut-être est-il déjà en cours d'ajout. + + + This magnet link was not recognized Ce lien magnet n'a pas été reconnu - + + Magnet link is already in download list. Trackers were merged. + Le lien magnet est déjà dans la liste des téléchargements. Les trackers ont été fusionnés. + + + + Cannot add this torrent. Perhaps it is already in adding. + Impossible d'ajouter ce torrent. Peut-être est-il déjà en cours d'ajout. + + + Magnet link Lien magnet - + Retrieving metadata... Récupération des métadonnées… - + Not Available This size is unavailable. Non disponible - + Free space on disk: %1 - Espace libre sur le disque : %1 + Espace libre dans le disque : %1 - + + Choose save path Choisir un répertoire de destination - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - + + Rename the file + Renommer le fichier - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + + New name: + Nouveau nom : - - Magnet link is already queued for processing. - + + + The file could not be renamed + Le fichier n'a pas pu être renommé - - New name: - Nouveau nom : + + This file name contains forbidden characters, please choose a different one. + Ce nom de fichier contient des caractères interdits, veuillez en choisir un autre. - - + + This name is already in use in this folder. Please use a different name. Ce nom de fichier est déjà utilisé dans ce dossier. Veuillez utiliser un autre nom. - + The folder could not be renamed Le dossier n'a pas pu être renommé - + Rename... Renommer… - + Priority Priorité - + Invalid metadata Metadata invalides. - + Parsing metadata... Analyse syntaxique des métadonnées... - + Metadata retrieval complete Récuperation des métadonnées terminée - + Download Error Erreur de téléchargement @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Taille du cache disque + + + MiB Mio - + Outgoing ports (Min) [0: Disabled] Ports sortants (min) [0: désactivé] - + Outgoing ports (Max) [0: Disabled] Ports sortants (max) [0: désactivé] - + Recheck torrents on completion Revérifier les torrents lorsqu'ils sont terminés - + Transfer list refresh interval Intervalle d'actualisation de la liste de transfert - + ms milliseconds ms - + Setting Paramètre - + Value Value set for this setting Valeur - - - (disabled) - (désactivé) - - - + (auto) (automatique) - - min - minutes - min - - - + All addresses Toutes les adresses - + qBittorrent Section Section qBittorrent - - + + Open documentation Ouvrir documentation - + libtorrent Section Section libtorrent - - Asynchronous I/O threads - - - - - Disk cache - Cache disque - - - + s seconds s - + Disk cache expiry interval Intervalle de l'expiration du cache disque - + Enable OS cache Activer le cache du système d’exploitation - - Guided read cache - Cache disque guidé - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - Envoyer des suggestions de morceaux de téléversement - - - - - KiB - Kio - - - - Send buffer watermark - - - - - Send buffer low watermark - - - - - Send buffer watermark factor - - - - - Prefer TCP - - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address - Permettre des connexions multiples depuis la même adresse IP + + m + minutes + m - + Resolve peer countries (GeoIP) Afficher le pays des pairs (GeoIP) - + Resolve peer host names Afficher le nom d'hôte des pairs - + Strict super seeding Super-partage strict - + Network Interface (requires restart) Interface réseau (redémarrage requis) - + Optional IP Address to bind to (requires restart) Adresse IP optionnelle à laquelle se relier (Redémarrage requis) - + Listen on IPv6 address (requires restart) Écouter sur l’adresse IPv6 (redémarrage requis) - + Display notifications Afficher les notifications - + Display notifications for added torrents Afficher les notifications pour les torrents ajoutés - + Download tracker's favicon Télécharger les favicon des trackers - - Save path history length - - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - Comportement des créneaux de téléversement - - - - Round-robin - - - - - Fastest upload - - - - - Anti-leech - - - - - Upload choking algorithm - - - - + Confirm torrent recheck Confirmer la revérification du torrent - - Confirm removal of all tags - - - - - Always announce to all trackers in a tier - + Exchange trackers with other peers + Échanger les trackers avec d'autres pairs - - Always announce to all tiers - + + Always announce to all trackers + Toujours contacter tous les trackers - + Any interface i.e. Any network interface N'importe quelle interface - + Save resume data interval How often the fastresume file is saved. Intervalle de sauvegarde des données de reprise - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - - - - + Maximum number of half-open connections [0: Unlimited] - Nombre maximum de connexions à moitié ouvertes [0 : Illimité] + Nombre maximum de connexions à moitié ouvertes [0 : Illimité] - + IP Address to report to trackers (requires restart) Adresse IP annoncée aux trackers (Redémarrage requis) - + Enable embedded tracker Activer le tracker intégré - + Embedded tracker port Port du tracker intégré - + Check for software updates Vérifier les mises à jour du logiciel - + Use system icon theme Utiliser le thème d'icônes du système @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 démarré. - + Torrent: %1, running external program, command: %2 Torrent : %1, programme externe en cours d'exécution, commande : %2 - - Torrent name: %1 - - - - - Torrent size: %1 - - - - - Save path: %1 - - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - - - - - Thank you for using qBittorrent. - - - - - [qBittorrent] '%1' has finished downloading - + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrent : %1, la commande d'exécution du programme externe est trop longue (taille > %2), exécution échouée. - + Torrent: %1, sending mail notification - Torrent : %1, envoi de l'email de notification + Torrent : %1, envoie de l'email de notification - + Information Information - - To control qBittorrent, access the Web UI at %1 - + + To control qBittorrent, access the Web UI at http://localhost:%1 + Pour contrôler qBittorrent, accédez à l'interface web via http://localhost:%1 - + The Web UI administrator user name is: %1 Le nom d'utilisateur de l'administrateur de l'interface web est : %1 - + The Web UI administrator password is still the default one: %1 Le mot de passe de l'administrateur de l'interface web est toujours celui par défaut : %1 - + This is a security risk, please consider changing your password from program preferences. Ceci peut être dangereux, veuillez penser à changer votre mot de passe dans les options. - + Saving torrent progress... Sauvegarde de l'avancement du torrent. - - - Portable mode and explicit profile directory options are mutually exclusive - - - - - Portable mode implies relative fastresume - - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Sauvegarder sous : @@ -861,836 +658,700 @@ Gestionnaire de téléchargement RSS - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - Le téléchargement automatique des torrents par flux RSS est actuellement désactivé ! Vous pouvez l'activer depuis les paramètres de l'application. + + Enable Automated RSS Downloader + Activer le téléchargement auto de flux RSS - + Download Rules Règles pour le téléchargement - + Rule Definition Définition d'une règle - + Use Regular Expressions Utiliser les expressions régulières - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - - - - + Must Contain: Doit contenir : - + Must Not Contain: Ne doit pas contenir : - + Episode Filter: - Filtre d'épisode : + Filtre d'épisode : - + Assign Category: Assigner catégorie : - + Save to a Different Directory Enregistrer dans un dossier différent - + Ignore Subsequent Matches for (0 to Disable) ... X days Ignorer les correspondances ultérieures pour (0 pour désactiver) - + Disabled - Désactivé + Désactivé - + days jours - + Add Paused: - Ajouter en pause : + Ajouter en pause : - + Use global settings Utiliser la configuration globale - + Always Toujours - + Never Jamais - + Apply Rule to Feeds: Appliquer la règle aux flux : - + Matching RSS Articles Articles RSS correspondants - + &Import... &Importer... - + &Export... &Exporter... - + Matches articles based on episode filter. Articles correspondants basés sur le filtrage épisode - + Example: - Exemple : + Exemple : - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match correspondra aux épisodes 2, 5, 8 et 15-30 et supérieurs de la saison 1 - + Episode filter rules: - Règles de filtrage d'épisodes : + Règles de filtrage d'épisodes : - + Season number is a mandatory non-zero value Le numéro de saison est une valeur obligatoire différente de zéro - + Episode number is a mandatory non-zero value + Le numéro d'épisode est une valeur obligatoire différente de zéro + + + Filter must end with semicolon Le filtre doit se terminer avec un point-virgule - + Three range types for episodes are supported: - Trois types d'intervalles d'épisodes sont pris en charge : + Trois types d'intervalles d'épisodes sont pris en charge : - + Single number: <b>1x25;</b> matches episode 25 of season one - Nombre simple : <b>1×25;</b> correspond à l'épisode 25 de la saison 1 + Nombre simple : <b>1×25;</b> correspond à l'épisode 25 de la saison 1 - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one - Intervalle standard : <b>1×25-40;</b> correspond aux épisodes 25 à 40 de la saison 1 - - - - Episode number is a mandatory positive value - Le numéro d'épisode est une valeur obligatoire positive + Intervalle standard : <b>1×25-40;</b> correspond aux épisodes 25 à 40 de la saison 1 - - Rules - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Intervalle infinie : <b>1×25-;</b> correspond aux épisodes 25 et suivants de la saison 1 - - Rules (legacy) + + Episode number is a mandatory positive value - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Intervalle infini : <b>1x25-;</b> correspond aux épisodes 25 et suivants de la saison 1, et tous les épisodes des saisons postérieures + - + Last Match: %1 days ago - Dernière correspondance : il y a %1 jours + Dernière correspondance : il y a %1 jours - + Last Match: Unknown - Dernière correspondance : inconnu + Dernière correspondance : inconnu - + New rule name Nouveau nom pour la règle - + Please type the name of the new download rule. Veuillez entrer le nom de la nouvelle règle de téléchargement. - - + + Rule name conflict Conflit dans les noms de règle - - + + A rule with this name already exists, please choose another name. Une règle avec ce nom existe déjà, veuillez en choisir un autre. - + Are you sure you want to remove the download rule named '%1'? Êtes vous certain de vouloir supprimer la règle de téléchargement '%1' - + Are you sure you want to remove the selected download rules? Voulez-vous vraiment supprimer les règles sélectionnées ? - + Rule deletion confirmation Confirmation de la suppression - + Destination directory Répertoire de destination - + Invalid action - + Action invalide - + The list is empty, there is nothing to export. - + La liste est vide, il n'y a rien à exporter. - - Export RSS rules - + + Where would you like to save the list? + Où désirez-vous sauvegarder cette liste ? - - + + Rules list (*.rssrules) + Liste de règles (*.rssrules) + + + I/O Error - + Erreur E/S - - Failed to create the destination file. Reason: %1 - + + Failed to create the destination file + Impossible de créer le fichier de destination - - Import RSS rules - + + Please point to the RSS download rules file + Veuillez indiquer le fichier contenant les règles de téléchargement RSS - - Failed to open the file. Reason: %1 - + + Rules list + Liste des règles - + Import Error - + Erreur lors de l'importation - - Failed to import the selected rules file. Reason: %1 - + + Failed to import the selected rules file + Impossible d'importer le fichier de règles sélectionné - + Add new rule... Ajouter une nouvelle règle… - + Delete rule Supprimer la règle - + Rename rule... Renommer la règle… - + Delete selected rules Supprimer les règles sélectionnées - - Clear downloaded episodes... - - - - + Rule renaming Renommage de la règle - + Please type the new rule name Veuillez enter le nouveau nom pour la règle - - Clear downloaded episodes - - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - Mode regex : utiliser des expressions régulières compatibles à celles de Perl - - - - - Position %1: %2 - Position %1: %2 + + Regex mode: use Perl-like regular expressions + Mode regex : utiliser des expressions régulières similaires à celles de Perl - + Wildcard mode: you can use - Mode caractère de remplacement : vous pouvez utiliser + - + ? to match any single character - ? pour correspondre à n'importe quel caractère + - + * to match zero or more of any characters - * pour correspondre à zéro caractère ou davantage + - + Whitespaces count as AND operators (all words, any order) - Les caractères espace comptent comme des opérateurs ET (tous les mots, dans n'importe quel ordre) + - + | is used as OR operator - | est utilisé comme opérateur OU + - + If word order is important use * instead of whitespace. - Si l'ordre des mots est important, utilisez * au lieu de d'un caractère espace. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Une expression avec une clause vide %1 (par exemple %2) - - - - will match all articles. - va correspondre à tous les articles. - - - - will exclude all articles. - va exclure tous les articles. - - - - BanListOptionsDialog - - - List of banned IP addresses - - Ban IP + + will match all articles. - - Delete - Supprimer - - - - - Warning + + will exclude all articles. - - The entered IP address is invalid. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Mode simplifié : vous pouvez utiliser<ul><li>? pour remplacer n'importe quel caractère</li><li>* pour remplacer zéro ou plusieurs caractères</li><li>Les espaces sont considérés équivalent à des opérateurs ET</li></ul> - - The entered IP is already banned. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Mode simplifié : vous pouvez utiliser<ul><li>? pour remplacer n'importe quel caractère</li><li>* pour remplacer zéro ou plusieurs caractères</li><li>| est utilisé comme opérateur OU</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support Un redémarrage est nécessaire pour changer le support PeX - - Could not get GUID of configured network interface. Binding to IP %1 - - - - + Embedded Tracker [ON] Tracker intégré [ACTIVÉ] - + Failed to start the embedded tracker! - Impossible de démarrer le tracker intégré ! + Impossible de démarrer le tracker intégré ! - + Embedded Tracker [OFF] Tracker intégré [DÉSACTIVÉ] - + + '%1' reached the maximum ratio you set. Removing... + '%1' a atteint le ratio maximum que vous avez défini. Suppression... + + + + '%1' reached the maximum ratio you set. Pausing... + '%1' a atteint le ratio maximum que vous avez défini. Mise en pause... + + + System network status changed to %1 e.g: System network status changed to ONLINE Statut réseau du système changé en %1 - + ONLINE EN LIGNE - + OFFLINE HORS LIGNE - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding La configuration réseau de %1 a changé, rafraîchissement de la session - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. L'adresse %1 de l'interface réseau configurée est invalide. - - + Encryption support [%1] Support de cryptage [%1] - - + FORCED FORCE - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 n'est pas une adresse IP valide et a été refusée lors l'application de la liste d'adresses IP bannies. - - - - + Anonymous mode [%1] Mode anonyme [%1] - + Unable to decode '%1' torrent file. Impossible de décoder le fichier torrent '%1' - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Téléchargement récursif du fichier '%1' au sein du torrent '%2' - + Queue positions were corrected in %1 resume files - Les positions de file d'attente ont été corrigées dans %1 fichiers de résumé + - + Couldn't save '%1.torrent' Impossible de sauvegarder '%1.torrent" - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' a été retiré de la liste de transferts. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' a été retiré de la liste de transferts et du disque dur. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - - - - + because %1 is disabled. this peer was blocked because uTP is disabled. parce que '%1' est désactivé - + because %1 is disabled. this peer was blocked because TCP is disabled. parce que '%1' est désactivé - + URL seed lookup failed for URL: '%1', message: %2 Le contact de la source URL a échoué pour l'URL : '%1', message : %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent ne parvient pas à écouter sur le port %2/%3 de l'interface %1. Motif : %4 - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' a été supprimé de la liste de transferts et du disque. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' a été supprimé de la liste de transferts. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Téléchargement de '%1', veuillez patienter... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent tente d'écouter un port d'interface : %1 - + The network interface defined is invalid: %1 L'interface réseau définie est invalide : %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent tente d'écouter sur le port %2 de l'interface %1 - - Peer ID: - - - - - HTTP User-Agent is '%1' - - - - - + DHT support [%1] Prise en charge du DHT [%1] - - - - - - - - - + + + + ON ACTIVÉE - - - - - - - - - + + + + OFF DÉSACTIVÉE - - + Local Peer Discovery support [%1] écouverte de pairs sur le réseau local [%1] - - PeX support [%1] - - - - - '%1' reached the maximum ratio you set. Removed. - '%1' a atteint le ratio maximum que vous avez défini. Retiré. - - - - '%1' reached the maximum ratio you set. Paused. - '%1' a atteint le ratio maximum que vous avez défini. Mis en pause. - - - - '%1' reached the maximum seeding time you set. Removed. - '%1' a atteint le temps de partage maximum que vous avez défini. Supprimé. - - - - '%1' reached the maximum seeding time you set. Paused. - '%1' a atteint le temps de partage maximum que vous avez défini. Mis en pause. + Restart is required to toggle Tracker Exchange support + Un redémarrage est nécessaire pour changer le support Tracker Exchange - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent n’a pas trouvé d'adresse locale %1 sur laquelle écouter - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent n'a pas réussi à écouter sur un port d'interface : %1. Motif : %2 - + Tracker '%1' was added to torrent '%2' Tracker '%1' ajouté au torrent '%2' - + Tracker '%1' was deleted from torrent '%2' Tracker '%1' retiré du torrent '%2' - + URL seed '%1' was added to torrent '%2' URL de partage '%1' ajoutée au torrent '%2' - + URL seed '%1' was removed from torrent '%2' URL de partage '%1' retirée du torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Impossible de résumer le torrent "%1". - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Le filtre IP a été correctement chargé : %1 règles ont été appliquées. - + Error: Failed to parse the provided IP filter. Erreur : impossible d'analyser le filtre IP fourni. - - '%1' restored. - 'torrent name' restored. - - - - + Couldn't add torrent. Reason: %1 Impossible d'ajouter le torrent. Motif : %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' a été relancé. (relancement rapide) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' ajouté à la liste de téléchargement. - + An I/O error occurred, '%1' paused. %2 Une erreur E/S s'est produite, '%1' a été mis en pause. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP : impossible de rediriger le port, message : %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP : la redirection du port a réussi, message : %1 - + due to IP filter. this peer was blocked due to ip filter. à cause du filtrage IP. - + due to port filter. this peer was blocked due to port filter. à cause du filtrage de ports. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. à cause des restrictions du mode mixte d'i2p. - + because it has a low port. this peer was blocked because it has a low port. parce que son numéro de port est trop bas. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent écoute correctement sur le port %2/%3 de l'interface %1 - + External IP: %1 e.g. External IP: 192.168.0.1 IP externe : %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + Le torrent '%1' n'a pas pu être déplacé. Motif : %2 - + File sizes mismatch for torrent '%1', pausing it. - + Les tailles de fichiers ne correspondent pas pour le torrent %1, mise en pause. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - + La relance rapide du torrent %1 a été rejetée. Motif : %2. Revérification... CategoryFilterModel - + Categories - Catégories + Catégories - + All - Toutes + Tous - + Uncategorized - Non catégorisé + @@ -1698,42 +1359,147 @@ Add category... - Ajouter catégorie ... + Ajouter catégorie... Add subcategory... - Ajouter sous catégorie ... + - Edit category... - Éditer catégorie ... + Remove category + Supprimer catégorie + + + + Remove unused categories + Supprimer les catégories inutilisées + + + + Resume torrents + Démarrer les torrents + + + + Pause torrents + Mettre en pause les torrents + + + + Delete torrents + Supprimer les torrents + + + + New Category + Nouvelle Catégorie + + + + Category: + Catégorie : + + + + Invalid category name + Nom de catégorie invalide + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Nom de catégorie ne doit pas contenir '\'. +Nom de catégorie ne doit pas commencer/finir avec '/'. +Nom de catégorie ne doit pas contenir la séquence '//'. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Toutes (0) + + + Uncategorized (0) + Sans catégorie (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Sans catégorie (%1) + + + Add category... + Ajouter catégorie... - Remove category - Retirer catégorie + Supprimer catégorie - Remove unused categories - Retirer catégories inutilisées + Supprimer les catégories inutilisées - Resume torrents - Relancer torrents + Démarrer les torrents - Pause torrents - Mettre en pause les torrents + Mettre en pause les torrents - Delete torrents - Supprimer torrents + Supprimer les torrents + + + New Category + Nouvelle Catégorie + + + Category: + Catégorie : + + + Invalid category name + Nom de catégorie invalide + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Nom de catégorie ne doit pas contenir '\'. +Nom de catégorie ne doit pas commencer/finir avec '/'. +Nom de catégorie ne doit pas contenir la séquence '//'. + + + All (%1) + this is for the category filter + Toutes (%1) @@ -1773,617 +1539,574 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Confirmation de la suppression - - - - Remember choice - - - - - Also delete the files on the hard disk - - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Voulez-vous vraiment supprimer '%1' de la liste des transferts ? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - - - - - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - Télécharger - - - - No URL entered - - - - - Please type at least one URL. - + Voulez-vous vraiment supprimer ces %1 torrents de la liste des transferts ? DownloadedPiecesBar - + White: Missing pieces Blanc : morceaux manquants - + Green: Partial pieces Vert : morceaux partiels - + Blue: Completed pieces Bleu : morceaux complets - ExecutionLogWidget + ExecutionLog - + General - Général + Général - + Blocked IPs - + Adresses IP bloquées - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> a été bloqué %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - + <font color='red'>%1</font> a été banni FeedListWidget - + RSS feeds Flux RSS - - - Unread (%1) - Non lu (%1) + + Unread + Non lu FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - + + An error occured while trying to open the log file. Logging to file is disabled. + Une erreur s'est produite lors de la tentative d'ouvrir le fichier Log. L'accès au fichier est désactivé. - FileSystemPathEdit + FilterParserThread - - ... - Launch file dialog button text (brief) - + + + + I/O Error: Could not open ip filter file in read mode. + Erreur d'entrée/sortie : impossible d'ouvrir le fichier de filtrage IP en lecture. - - &Browse... - Launch file dialog button text (full) - + + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. + Erreur d'analyse : le fichier de filtrage n'est pas un fichier P2B PeerGuardian valide. + + + GeoIPDatabase - - Choose a file - Caption for file open/save dialog - + + + Unsupported database file size. + Taille du ficher de base de données non supporté. - - Choose a folder - Caption for directory open dialog - + + Metadata error: '%1' entry not found. + Erreur des métadonnées : '%1' non trouvé. - - Any file - + + Metadata error: '%1' entry has invalid type. + Erreur des métadonnées : le type de '%1' est invalide. - - - FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - + + Unsupported database version: %1.%2 + Version de base de données non supportée : %1.%2 - - - - IP filter line %1 is malformed. - La ligne de filtre IP %1 est mal formée. + + Unsupported IP version: %1 + Version IP non supportée : %1 - - - IP filter line %1 is malformed. Start IP of the range is malformed. - + + Unsupported record size: %1 + Taille du registre non supportée : %1 - - - IP filter line %1 is malformed. End IP of the range is malformed. - + + Invalid database type: %1 + Type de base de données invalide : %1 - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - - - - - - IP filter exception thrown for line %1. Exception is: %2 - - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - - - - - - - - - - - Parsing Error: The filter file is not a valid PeerGuardian P2B file. - Erreur d'analyse : le fichier de filtrage n'est pas un fichier P2B PeerGuardian valide. - - - - GeoIPDatabase - - - - Unsupported database file size. - Taille du ficher de base de données non supporté. - - - - Metadata error: '%1' entry not found. - Erreur des métadonnées : '%1' non trouvé. - - - - Metadata error: '%1' entry has invalid type. - Erreur des métadonnées : le type de '%1' est invalide. - - - - Unsupported database version: %1.%2 - Version de base de données non supportée : %1.%2 - - - - Unsupported IP version: %1 - Version IP non supportée : %1 - - - - Unsupported record size: %1 - Taille du registre non supportée : %1 - - - - Invalid database type: %1 - Type de base de données invalide : %1 - - - + Database corrupted: no data section found. Base de données corrompue : section data introuvable. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - + + File + Fichier - - Bad Http request, closing socket. IP: %s - + + Edit + Édition - - - HttpServer - + + Help + Aide + + + Exit qBittorrent Quitter qBittorrent - + Only one link per line Un seul lien par ligne - + + Download + Télécharger + + + Global upload rate limit must be greater than 0 or disabled. La limite globale pour la vitesse d'envoi doit être supérieure à 0 ou désactivée. - + Global download rate limit must be greater than 0 or disabled. La limite globale pour la vitesse de réception doit être supérieure à 0 ou désactivée. - + Alternative upload rate limit must be greater than 0 or disabled. La limite alternative pour la vitesse d'envoi doit être supérieure à 0 ou désactivée. - + Alternative download rate limit must be greater than 0 or disabled. La limite alternative pour la vitesse de réception doit être supérieure à 0 ou désactivée. - + Maximum active downloads must be greater than -1. Le nombre maximum de téléchargements actifs doit être supérieur à -1. - + Maximum active uploads must be greater than -1. Le nombre maximum d'envois actifs doit être supérieur à -1. - + Maximum active torrents must be greater than -1. Le nombre maximum de torrents actifs doit être supérieur à -1. - + Maximum number of connections limit must be greater than 0 or disabled. Le nombre maximum de connexions doit être supérieur à 0 ou désactivé. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Le nombre maximum de connexions par torrent doit être supérieur à 0 ou désactivé. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Le nombre maximum de slots d'envoi par torrent doit être supérieur à 0 ou désactivé. - + Unable to save program preferences, qBittorrent is probably unreachable. Impossible de sauvegarder les préférences, qBittorrent est probablement injoignable. - - IRC: #qbittorrent on Freenode - IRC : #qbittorrent sur Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - Nom de catégorie invalide : -Veuillez ne pas utiliser de caractères spéciaux dans le nom de catégorie. - - - - Unknown - Inconnu - - - - Hard Disk - Disque dur - - - - Share ratio limit must be between 0 and 9998. - - - - - Seeding time limit must be between 0 and 525600 minutes. - + + Language + Langue - + The port used for incoming connections must be between 1 and 65535. Le port utilisé pour les connexions entrantes doit être compris entre 1 et 65535. - + The port used for the Web UI must be between 1 and 65535. Le port utilisé pour l'interface Web doit être compris entre 1024 et 65535. - + Unable to log in, qBittorrent is probably unreachable. Impossible de se connecter, qBittorrent est probablement inaccessible. - + Invalid Username or Password. Nom d'utilisateur ou mot de passe invalide. - - Username - Nom d'utilisateur - - - + Password Mot de passe - + Login Identifiant - + + Upload Failed! + Le transfert a échoué ! + + + Original authors Auteurs originaux - + + Upload limit: + Limite d'envoi : + + + + Download limit: + Limite de téléchargement : + + + Apply Appliquer - + Add Ajouter - + + Category: + Catégorie : + + + Upload Torrents Upload torrent files to qBittorent using WebUI Téléverser des torrents - + + All + Tous + + + + Downloading + En téléchargement + + + + Seeding + En partage + + + + Completed + Complétés + + + + Resumed + Continués + + + + Paused + En pause + + + + Active + Actifs + + + + Inactive + Inactifs + + + Save files to location: - Sauvegarder les fichiers dans : + Sauvegarder les fichiers dans : - + Cookie: - Cookie : + Cookie : - + Type folder here Entrez le dossier ici - + + Run an external program on torrent completion + Lancer un programme externe lorsqu'un torrent est complété + + + + Enable bandwidth management (uTP) + Activer la gestion de bande passante (uTP) + + + + Apply rate limit to uTP connections + Appliquer les limites de vitesse aux connexions uTP + + + + Alternative Global Rate Limits + Limites de vitesse globales alternatives + + + More information Plus d'informations - + Information about certificates Information sur les certificats - + Save Files to Sauvegarder les fichiers dans - - Set location - - - - - Limit upload rate - + + Watch Folder + Surveiller le dossier - - Limit download rate - + + Default Folder + Dossier par défaut - - Rename torrent - + + from + from time1 to time2 + de - - Unable to create category - + + to + from time1 to time2 + à - + Other... Save Files to: Watch Folder / Default Folder / Other... Autre... - + + Every day + Schedule the use of alternative rate limits on ... + Tous les jours + + + + Week days + Schedule the use of alternative rate limits on ... + Jours ouvrables + + + + Week ends + Schedule the use of alternative rate limits on ... + Week ends + + + Monday Schedule the use of alternative rate limits on ... Lundi - + Tuesday Schedule the use of alternative rate limits on ... Mardi - + Wednesday Schedule the use of alternative rate limits on ... Mercredi - + Thursday Schedule the use of alternative rate limits on ... Jeudi - + Friday Schedule the use of alternative rate limits on ... Vendredi - + Saturday Schedule the use of alternative rate limits on ... Samedi - + Sunday Schedule the use of alternative rate limits on ... Dimanche - + + Downloaded + Is the file downloaded or not? + Téléchargé + + + Logout Se déconnecter - + + Download from URLs + Télécharger depuis des URLs + + + Download Torrents from their URLs or Magnet links Télécharger les torrents depuis leurs URLs ou liens Magnet - + Upload local torrent Transférer un torrent local - + Are you sure you want to delete the selected torrents from the transfer list? Voulez-vous vraiment supprimer les torrents sélectionnés de la liste de transfert ? - + Save Sauvegarder - + qBittorrent client is not reachable Le logiciel qBittorrent n'est pas accessible - - qBittorrent has been shutdown. - qBittorrent a été arrêté. + + HTTP Server + Serveur HTTP - - - IPSubnetWhitelistOptionsDialog - - List of whitelisted IP subnets - - - - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - + + The following parameters are supported: + Les paramètres suivants sont pris en charge : - - Add subnet - + + Torrent path + Chemin du torrent - - Delete - Supprimer + + Torrent name + Nom du torrent - - Error - Erreur + + qBittorrent has been shutdown. + qBittorrent a été arrêté. + + + LineEdit - - The entered subnet is invalid. - + + Clear the text + Effacer le texte LogListWidget - + Copy Copier - + Clear Effacer @@ -2416,710 +2139,648 @@ Action lorsque les téléchargements sont &terminés - + &View A&ffichage - + &Options... &Options... - + &Resume &Démarrer - + Torrent &Creator &Créateur de torrent - + Set Upload Limit... Définir la limite d'envoi... - + Set Download Limit... Définir la limite de téléchargement... - + Set Global Download Limit... Définir la limite de téléchargement globale... - + Set Global Upload Limit... Définir la limite d'envoi globale... - + Minimum Priority Priorité minimale - + Top Priority Priorité maximale - + Decrease Priority Diminuer la priorité - + Increase Priority Augmenter la priorité - - + + Alternative Speed Limits Limites de vitesse alternatives - + &Top Toolbar Barre d'ou&tils - + Display Top Toolbar Afficher la barre d'outils - - Status &Bar - - - - + S&peed in Title Bar &Vitesse dans le titre de la fenêtre - + Show Transfer Speed in Title Bar Afficher la vitesse dans le titre de la fenêtre - + &RSS Reader Lecteur &RSS - + Search &Engine &Moteur de recherche - + L&ock qBittorrent &Verrouiller qBittorrent - + Do&nate! - Faire un do&n ! - - - - Close Window - + Faire un do&n ! - + R&esume All Tout Dé&marrer - + Manage Cookies... Gérer les Cookies... - + Manage stored network cookies Gérer les cookies réseau stockées - + Normal Messages Messages normaux - + Information Messages Messages d'information - + Warning Messages Messages d'avertissement - + Critical Messages Messages critiques - + &Log &Journal - + &Exit qBittorrent &Quitter qBittorrent - + &Suspend System &Mettre en veille le système - + &Hibernate System &Mettre en veille prolongée le système - + S&hutdown System É&teindre le système - + &Disabled &Désactivé - + &Statistics &Statistiques - + Check for Updates Vérifier les mises à jour - + Check for Program Updates Vérifier les mises à jour du programm - + &About &À propos - + &Pause Mettre en &pause - + &Delete &Supprimer - + P&ause All Tout &mettre en pause - + &Add Torrent File... &Ajouter un fichier torrent… - + Open Ouvrir - + E&xit &Quitter - + Open URL Ouvrir URL - + &Documentation &Documentation - + Lock Verrouiller - - - + + + Show Afficher - + Check for program updates Vérifier la disponibilité de mises à jour du logiciel - + Add Torrent &Link... Ajouter &lien vers un torrent… - + If you like qBittorrent, please donate! Si vous aimez qBittorrent, faites un don ! - - + Execution Log Journal d'exécution - + Clear the password Effacer le mot de passe - + Filter torrent list... Filtrer la liste des torrents… - + &Set Password &Définir le mot de pass - - Preferences - Préférences - - - + &Clear Password &Supprimer le mot de pass - + Transfers Transferts - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Association aux fichiers torrent - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent n'est pas l'application par défaut utilisée pour ouvrir les fichiers torrent ou les liens magnet. -Voulez-vous associer qBittorrent aux fichiers torrent et liens magnet ? +Voulez-vous associer qBittorrent aux fichiers torrent et liens magnet ? - + Icons Only Icônes seulement - + Text Only Texte seulement - + Text Alongside Icons Texte à côté des Icônes - + Text Under Icons Texte sous les Icônes - + Follow System Style Suivre le style du système - - - + + + UI lock password Mot de passe de verrouillage - - - + + + Please type the UI lock password: Veuillez entrer le mot de passe de verrouillage : - + The password should contain at least 3 characters The mot de passe doit contenir au moins 3 caractères - + Password update Mise à jour du mot de passe - + The UI lock password has been successfully updated Le mot de passe de verrouillage a été mis à jour - + Are you sure you want to clear the password? - Êtes vous sûr de vouloir effacer le mot de passe ? - - - - Use regular expressions - + Êtes vous sûr de vouloir effacer le mot de passe ? - + Search Recherche - + Transfers (%1) Transferts (%1) - + Error Erreur - + Failed to add torrent: %1 - Échec de l'ajout du torrent : %1 + Échec de l'ajout du torrent : %1 - + Torrent added Torrent ajouté - + '%1' was added. e.g: xxx.avi was added. '%1' a été ajouté. - + Download completion Fin du téléchargement - + I/O Error i.e: Input/Output Error Erreur E/S - + Recursive download confirmation Confirmation pour téléchargement récursif - + Yes Oui - + No Non - + Never Jamais - + Global Upload Speed Limit Limite globale de la vitesse d'envoi - + Global Download Speed Limit Limite globale de la vitesse de réception - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent vient d'être mis à jour et doit être redémarré pour que les changements soient pris en compte. - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - Certains fichiers sont en cours de transfert. - - - - Are you sure you want to quit qBittorrent? - Êtes-vous sûr de vouloir quitter qBittorrent ? - - - + &No &Non - + &Yes &Oui - + &Always Yes &Oui, toujours - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter Ancien interpréteur Python - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - Votre version de Python (%1) n'est pas à jour. Veuillez mettre à jour pour que les moteurs de recherche fonctionnent. Versions requises : 2.7.9/3.3.0. + Votre version de Python (%1) n'est pas à jour. Veuillez mettre à jour pour que les moteurs de recherche fonctionnent. Versions requises : 2.7.9/3.3.0. - + qBittorrent Update Available Mise à jour de qBittorrent disponible - + + A new version is available. +Do you want to download %1? + Une nouvelle version est disponible. +Souhaitez-vous télécharger %1 ? + + + Already Using the Latest qBittorrent Version Vous utilisez déjà la dernière version de qBittorrent - + Undetermined Python version Version de Python indéterminée - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. - Le téléchargement de « %1 » est terminé. + Le téléchargement de « %1 » est terminé. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. Reason: disk is full. - Une erreur d'entrée/sortie est survenue sur le torrent « %1 ». -Raison : %2 + Une erreur d'entrée/sortie est survenue sur le torrent « %1 ». +Raison : %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? - Le torrent « %1 » contient des fichiers torrent, voulez-vous procéder en les téléchargeant ? + Le torrent « %1 » contient des fichiers torrent, voulez-vous procéder en les téléchargeant ? - + Couldn't download file at URL '%1', reason: %2. - Impossible de télécharger le fichier à l'adresse « %1 », raison : %2. + Impossible de télécharger le fichier à l'adresse « %1 », raison : %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin Python trouvé dans %1: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + Impossible de déterminer votre version de Python (%1). Moteur de recherche désactivé. + + + + Missing Python Interpreter L’interpréteur Python est absent - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Python est nécessaire afin d'utiliser le moteur de recherche mais il ne semble pas être installé. -Voulez-vous l'installer maintenant ? +Voulez-vous l'installer maintenant ? - + Python is required to use the search engine but it does not seem to be installed. Python est nécessaire afin d'utiliser le moteur de recherche mais il ne semble pas être installé. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. Pas de mises à jour disponibles. Vous utilisez déjà la dernière version. - + &Check for Updates - &Vérifier les mises à jour + &Vérifier les mises à jou - + Checking for Updates... Vérification des mises à jour… - + Already checking for program updates in the background Recherche de mises à jour déjà en cours en tâche de fond - + Python found in '%1' - Python trouvé dans « %1 » + Python trouvé dans « %1 » - + Download error Erreur de téléchargement - + Python setup could not be downloaded, reason: %1. Please install it manually. L’installateur Python ne peut pas être téléchargé pour la raison suivante : %1. Veuillez l’installer manuellement. - - + + Invalid password Mot de passe invalide - - - + + RSS (%1) RSS (%1) - + URL download error Erreur de téléchargement URL - + The password is invalid Le mot de passe fourni est invalide - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Vitesse de réception : %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Vitesse d'envoi : %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version - [R : %1, E : %2] qBittorrent %3 + [R : %1, E : %2] qBittorrent %3 - + Hide Cacher - + Exiting qBittorrent Fermeture de qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Certains fichiers sont en cours de transfert. +Êtes-vous sûr de vouloir quitter qBittorrent ? + + + Open Torrent Files Ouvrir fichiers torrent - + Torrent Files Fichiers torrent - + Options were saved successfully. Préférences sauvegardées avec succès. @@ -3127,1479 +2788,1369 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. Votre DNS dynamique a été mis à jour avec succès. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. - Erreur de DNS dynamique : Le service est temporairement indisponible, un nouvel essai sera fait dans 30 minutes. + Erreur de DNS dynamique : Le service est temporairement indisponible, un nouvel essai sera fait dans 30 minutes. - + Dynamic DNS error: hostname supplied does not exist under specified account. - Erreur de DNS dynamique : Le nom d'hôte fourni n'existe pas pour le compte spécifié. + Erreur de DNS dynamique : Le nom d'hôte fourni n'existe pas pour le compte spécifié. - + Dynamic DNS error: Invalid username/password. - Erreur de DNS dynamique : Nom d'utilisateur ou mot de passe invalide. + Erreur de DNS dynamique : Nom d'utilisateur ou mot de passe invalide. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. - Erreur de DNS dynamique : qBittorrent a été blacklisté par le service, veuillez rapporter un bogue sur http://bugs.qbittorrent.org. + Erreur de DNS dynamique : qBittorrent a été blacklisté par le service, veuillez rapporter un bogue sur http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. - Erreur de DNS dynamique : %1 a été retourné par le service, veuillez rapporter un bogue sur http://bugs.qbittorrent.org. + Erreur de DNS dynamique : %1 a été retourné par le service, veuillez rapporter un bogue sur http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. - Erreur de DNS dynamique : Votre nom d'utilisateur a été bloqué pour faute d'abus. + Erreur de DNS dynamique : Votre nom d'utilisateur a été bloqué pour faute d'abus. - + Dynamic DNS error: supplied domain name is invalid. - Erreur de DNS dynamique : Le nom de domaine fourni est invalide. + Erreur de DNS dynamique : Le nom de domaine fourni est invalide. - + Dynamic DNS error: supplied username is too short. - Erreur de DNS dynamique : Le nom d'utilisateur fourni est trop court. + Erreur de DNS dynamique : Le nom d'utilisateur fourni est trop court. - + Dynamic DNS error: supplied password is too short. - Erreur de DNS dynamique : Le mot de passe fourni est trop court. + Erreur de DNS dynamique : Le mot de passe fourni est trop court. Net::DownloadHandler - + I/O Error Erreur d'entrée/sortie - + The file size is %1. It exceeds the download limit of %2. La taille du fichier est %1. Cela excède la limite de téléchargement de %2. - + Unexpected redirect to magnet URI. Redirection non attendue vers une URL magnet. - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. - Base de données GeoIP chargée. Type : %1. Durée de construction : %2 + Base de données GeoIP chargée. Type : %1. Durée de construction : %2 - - + + Couldn't load GeoIP database. Reason: %1 - Impossible de charger la base de données GeoIP. Raison : %1 + Impossible de charger la base de données GeoIP. Raison : %1 - + Venezuela, Bolivarian Republic of Venezuela, République bolivarienne du - + Viet Nam Viêt Nam - - + + N/A N/A - + Andorra Andorre - + United Arab Emirates Émirats Arabes Unis - + Afghanistan Afghanistan - + Antigua and Barbuda Antigua-et-Barbuda - + Anguilla Anguilla - + Albania Albanie - + Armenia Arménie - + Angola Angola - + Antarctica Antarctique - + Argentina Argentine - + American Samoa Samoa Américaines - + Austria Autriche - + Australia Australie - + Aruba Aruba - + Azerbaijan Azerbaïdjan - + Bosnia and Herzegovina Bosnie Herzégovine - + Barbados Barbade - + Bangladesh Bangladesh - + Belgium Belgique - + Burkina Faso Burkina Faso - + Bulgaria Bulgarie - + Bahrain Bahreïn - + Burundi Burundi - + Benin Bénin - + Bermuda Bermudes - + Brunei Darussalam Brunei - + Brazil Brésil - + Bahamas Bahamas - + Bhutan Bhoutan - + Bouvet Island Île Bouvet - + Botswana Botswana - + Belarus Biélorussie - + Belize Bélize - + Canada Canada - + Cocos (Keeling) Islands Îles Cocos (anciennement Keeling) - + Congo, The Democratic Republic of the République Démocratique du Congo - + Central African Republic République d'Afrique Centrale - + Congo Congo - + Switzerland Suiss - + Cook Islands Îles Cook - + Chile Chili - + Cameroon Cameroun - + China Chine - + Colombia Colombie - + Costa Rica Costa Rica - + Cuba Cuba - + Cape Verde Cap-Vert - + Curacao Curaçao - + Christmas Island Île Christmas - + Cyprus Chypre - + Czech Republic République Tchèque - + Germany Allemagne - + Djibouti Djibouti - + Denmark Danemark - + Dominica Dominique - + Dominican Republic République dominicaine - + Algeria Algérie - + Ecuador Equateur - + Estonia Estonie - + Egypt Égypte - + Western Sahara Sahara occidental - + Eritrea Érythrée - + Spain Espagn - + Ethiopia Éthiopie - + Finland Finlande - + Fiji Fidji - + Falkland Islands (Malvinas) Îles Malouines (Falkland) - + Micronesia, Federated States of Micronésie - + Faroe Islands Îles Féroé - + France France - + Gabon Gabon - + United Kingdom Royaume-uni - + Grenada Grenade - + Georgia Géorgie - + French Guiana Guinée française - + Ghana Ghana - + Gibraltar Gibraltar - + Greenland Groënland - + Gambia Gambie - + Guinea Guinée - + Guadeloupe Guadeloupe - + Equatorial Guinea Guinée équatoriale - + Greece Grèce - + South Georgia and the South Sandwich Islands Géorgie du Sud-et-les Îles Sandwich du Sud - + Guatemala Guatemala - + Guam Guam - + Guinea-Bissau Guinée-Bissau - + Guyana Guyane - + Hong Kong Hong Kong - + Heard Island and McDonald Islands Îles Heard-et-MacDonald - + Honduras Honduras - + Croatia Croatie - + Haiti Haïti - + Hungary Hongrie - + Indonesia Indonésie - + Ireland Irlande - + Israel Israël - + India Inde - + British Indian Ocean Territory Territoire britannique de l'océan Indien - + Iraq Irak - + Iran, Islamic Republic of République islamique d'Iran - + Iceland Islande - + Italy Italie - + Jamaica Jamaïque - + Jordan Jordanie - + Japan Japon - + Kenya Kenya - + Kyrgyzstan Kirghizstan - + Cambodia Cambodge - + Kiribati Kiribati - + Comoros Comores - + Saint Kitts and Nevis Saint-Christophe-et-Niévès - + Korea, Democratic People's Republic of Corée du Nord - + Korea, Republic of Corée du Sud - + Kuwait Koweït - + Cayman Islands Îles Caïmans - + Kazakhstan Kazakhstan - + Lao People's Democratic Republic Laos - + Lebanon Liban - + Saint Lucia Sainte-Lucie - + Liechtenstein Liechtenstein - + Sri Lanka Sri Lanka - + Liberia Liberia - + Lesotho Lesotho - + Lithuania Lituanie - + Luxembourg Luxembourg - + Latvia Lettonie - + Morocco Maroc - + Monaco Monaco - + Moldova, Republic of Moldavie - + Madagascar Madagascar - + Marshall Islands Îles Marshall - + Mali Mali - + Myanmar Birmanie - + Mongolia Mongolie - + Northern Mariana Islands Îles Mariannes du Nord - + Martinique Martinique - + Mauritania Mauritanie - + Montserrat Montserrat - + Malta Malte - + Mauritius Maurice - + Maldives Maldives - + Malawi Malawi - + Mexico Mexique - + Malaysia Malaisie - + Mozambique Mozambique - + Namibia Namibie - + New Caledonia Nouvelle-Calédonie - + Niger Niger - + Norfolk Island Île Norfolk - + Nigeria Nigeria - + Nicaragua Nicaragua - + Netherlands Pays-Bas - + Norway Norvège - + Nepal Népal - + Nauru Nauru - + Niue Niue - + New Zealand Nouvelle-Zélande - + Oman Oman - + Panama Panama - + Peru Pérou - + French Polynesia Polynésie française - + Papua New Guinea Papouasie - Nouvelle-Guinée - + Philippines Philippines - + Pakistan Pakistan - + Poland Pologne - + Saint Pierre and Miquelon Saint Pierre et Miquelon - + Puerto Rico Puerto Rico - + Portugal Portugal - + Palau Palau - + Paraguay Paraguay - + Qatar Qatar - + Reunion Réunion - + Romania Roumanie - + Russian Federation Russie - + Rwanda Rwanda - + Saudi Arabia Arabie Saoudite - + Solomon Islands Îles Salomon - + Seychelles Seychelles - + Sudan Soudan - + Sweden Suède - + Singapore Singapour - + Slovenia Slovénie - + Svalbard and Jan Mayen Svalbard et Jan Mayen - + Slovakia Slovaquie - + Sierra Leone Sierra Leone - + San Marino Saint-Marin - + Senegal Sénégal - + Somalia Somalie - + Suriname Suriname - + Sao Tome and Principe Sao Tomé-et-Principe - + El Salvador El Salvador - + Syrian Arab Republic Syrie - + Swaziland Swaziland - + Turks and Caicos Islands Îles Turques-et-Caïques - + Chad Tchad - + French Southern Territories Terres australes françaises - + Togo Togo - + Thailand Thaïlande - + Tajikistan Tadjikistan - + Tokelau Tokelau - + Turkmenistan Turkménistan - + Tunisia Tunisie - + Tonga Tonga - - Could not decompress GeoIP database file. - Impossible de décompresser le fichier de base de données GeoIP. - - - + Timor-Leste Timor Oriental - + Bolivia, Plurinational State of Bolivie - + Bonaire, Sint Eustatius and Saba Pays-Bas caribéens - Bonaire, St Eustatius, Saba - + Cote d'Ivoire Côte d'Ivoire - + Libya Libye - + Saint Martin (French part) Saint-Martin (France) - + Macedonia, The Former Yugoslav Republic of Macédoine - + Macao Macao - + Pitcairn Îles Pitcairn - + Palestine, State of Palestine, État de - + Saint Helena, Ascension and Tristan da Cunha Sainte-Hélène, Ascension et Tristan da Cunha - + South Sudan Soudan du Sud - + Sint Maarten (Dutch part) Saint-Martin (Pays-bas) - + Turkey Turquie - + Trinidad and Tobago Trinidad et Tobago - + Tuvalu Tuvalu - + Taiwan Taiwan - + Tanzania, United Republic of Tanzanie - + Ukraine Ukraine - + Uganda Ouganda - + United States Minor Outlying Islands Îles mineures éloignées des États-Unis - + United States États-Unis - + Uruguay Uruguay - + Uzbekistan Ouzbékistan - + Holy See (Vatican City State) Vatican - + Saint Vincent and the Grenadines Saint-Vincent-et-les-Grenadines - + Virgin Islands, British Îles Vierges, Royaume-Uni - + Virgin Islands, U.S. Îles Vierges, États-Unis - + Vanuatu Vanuatu - + Wallis and Futuna Wallis et Futuna - + Samoa Samoa - + Yemen Yémen - + Mayotte Mayotte - + Serbia Serbie - + South Africa Afrique du Sud - + Zambia Zambie - + Montenegro Monténégro - + Zimbabwe Zimbabwe - + Aland Islands Åland - + Guernsey Bailliage de Guernesey - + Isle of Man Île de Man - + Jersey Jersey - + Saint Barthelemy Saint-Barthélemy - + + Could not uncompress GeoIP database file. + Impossible de décompresser le fichier de base de données GeoIP. + + + Couldn't save downloaded GeoIP database file. Impossible d'enregistrer le fichier de base de données GeoIP téléchargé. - + Successfully updated GeoIP database. Mise à jour de la base de données GeoIP réalisée avec succès. - + Couldn't download GeoIP database file. Reason: %1 - Impossible de télécharger le fichier de base de données GeoIP. Raison : %1 + Impossible de télécharger le fichier de base de données GeoIP. Raison : %1 Net::PortForwarder - + UPnP / NAT-PMP support [ON] Prise en charge de l'UPnP / NAT-PMP [ACTIVÉE] - + UPnP / NAT-PMP support [OFF] Prise en charge de l'UPnP / NAT-PMP [DÉSACTIVÉE] @@ -4607,7 +4158,7 @@ Net::Smtp - + Email Notification Error: Erreur de notification e-mail : @@ -4615,1273 +4166,1077 @@ OptionsDialog - + Options Options - + Behavior Comportement - + Downloads Téléchargements - + Connection Connexion - + Speed Vitesse - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI Interface web - + Advanced Avancé - + Language Langue - + User Interface Language: Langue de l'interface utilisateur : - + (Requires restart) (Redémarrage nécessaire) - + Transfer List Liste des transferts - + Confirm when deleting torrents Confirmer la suppression des torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. Alterner la couleur des lignes - + Hide zero and infinity values Cacher les valeurs zéro et infini - + Always Toujours - + Paused torrents only Seulement les torrents en pause - + Action on double-click Action du double-clic - + Downloading torrents: Torrents en téléchargement: - - + + Start / Stop Torrent - Démarrer / Arrêter le torrent + Démarrer / Arrêter torrent - - + + Open destination folder Ouvrir le répertoire de destination - - + + No action Aucune action - + Completed torrents: Torrents téléchargés: - + Desktop Bureau - + Start qBittorrent on Windows start up Démarrer qBittorrent au démarrage de windows - + Show splash screen on start up Afficher l'écran de démarrage - + Start qBittorrent minimized Démarrer qBittorrent en mode réduit - + Confirmation on exit when torrents are active Confirmer la fermeture lorsque des torrents sont actifs - + Confirmation on auto-exit when downloads finish Confirmation de l'auto-extinction à la fin des téléchargements - - KiB - Kio - - - - Email notification &upon download completion - - - - - Run e&xternal program on torrent completion - Lancer un programme e&xterne à la fin d'un téléchargement - - - - IP Fi&ltering - Fi&ltrage IP - - - - Schedule &the use of alternative rate limits - - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - - - - &Torrent Queueing - Priorisation des &torrents - - - - Seed torrents until their seeding time reaches - - - - - A&utomatically add these trackers to new downloads: - Ajo&uter automatiquement ces trackers aux nouveaux téléchargements : - - - - RSS Reader - Lecteur RSS - - - - Enable fetching RSS feeds - Active la réception de flux RSS - - - - Feeds refresh interval: - Intervalle de rafraîchissement des flux : - - - - Maximum number of articles per feed: - Nombre maximum d'articles par flux : - - - - - min - minutes - min - - - - RSS Torrent Auto Downloader - - - - - Enable auto downloading of RSS torrents - Active le téléchargement automatique des torrents par RSS - - - - Edit auto downloading rules... - Éditer les règles de téléchargement automatique... - - - - Web User Interface (Remote control) - Interface Web de l'utilisateur (contrôle distant) - - - - IP address: - - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - - - - - Server domains: - - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - - - - - &Use HTTPS instead of HTTP - &Utiliser HTTPS au lieu de HTTP - - - - Bypass authentication for clients on localhost - - - - - Bypass authentication for clients in whitelisted IP subnets - - - - - IP subnet whitelist... - - - - - Upda&te my dynamic domain name - Met&tre à jour mon nom de domaine dynamique + + Show qBittorrent in notification area + Afficher l'icône de qBittorrent dans la zone de notification - + Minimize qBittorrent to notification area Réduire qBittorrent dans la zone de notification - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. Conserver dans la zone de notification à la fermeture - + Tray icon style: Style de l'icône : - + Normal Normal - + Monochrome (Dark theme) Monochrome (thème foncé) - + Monochrome (Light theme) Monochrome (thème clair) - + File association Association des fichiers - + Use qBittorrent for .torrent files Utiliser qBittorrent pour les fichiers .torrent - + Use qBittorrent for magnet links Utiliser qBittorrent pour les liens magnet - + Power Management Gestion d'alimentation - + + Inhibit system sleep when torrents are active + Empêcher la mise en veille lorsque des torrents sont actifs + + + + Log file + Fichier de Log + + + Save path: Chemin de sauvegarde : - + Backup the log file after: Sauvegarder le Log après : - + + MB + Mio + + + Delete backup logs older than: Supprimer les Logs âgés plus de : - + days Delete backup logs older than 10 months jours - + months Delete backup logs older than 10 months mois - + years Delete backup logs older than 10 years années - + When adding a torrent À l'ajout d'un torrent - + + Display torrent content and some options + Afficher le contenu du torrent et quelques paramètres + + + Bring torrent dialog to the front Mettre la boite de dialogue du torrent en avant-plan - + Do not start the download automatically The torrent will be added to download list in pause state Ne pas démarrer le téléchargement automatiquement - + Should the .torrent file be deleted after adding it Faut-il supprimer le .torrent après l'avoir ajouté - + + Delete .torrent files afterwards + Supprimer les fichers .torrent par la suite + + + Also delete .torrent files whose addition was cancelled Supprimer également les fichiers .torrent dont l'ajout a été annulé - + Also when addition is cancelled Aussi quand l'ajout est annulé - + Warning! Data loss possible! Attention ! Perte de donnée possible ! - + Saving Management Gestion de Sauvegarde - + Default Torrent Management Mode: Mode de gestion de torrent par défaut : - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category Le mode automatique signifie que certaines propriétés du torrent (ex: le dossier d'enregistrement) seront décidés via la catégorie associée - + Manual Manuel - + Automatic Automatique - + When Torrent Category changed: Lorsque la catégorie du Torrent a changé : - + Relocate torrent Relocaliser le torrent - + Switch torrent to Manual Mode Basculer le torrent en mode manuel - + When Default Save Path changed: Lorsque le chemin de sauvegarde par défaut a changé : - - + + Relocate affected torrents Relocaliser les torrents affectés - - + + Switch affected torrents to Manual Mode Basculer les torrents affectés en mode manuel - + When Category changed: Lorsque la catégorie a changé : - + Use Subcategories Utiliser les sous-catégories - + Default Save Path: Chemin de sauvegarde par défaut : - + Keep incomplete torrents in: - Conserver les torrents incomplets dans : + Conserver les torrents incomplets dans : - + Copy .torrent files to: Copier les fichiers .torrent dans : - - Show &qBittorrent in notification area - Afficher l'icône de &qBittorrent dans la zone de notification - - - - &Log file - Fichier de &Log - - - - Display &torrent content and some options - Afficher le contenu du &torrent et quelques options - - - - Create subfolder for torrents with multiple files - Créer un sous-dossier pour les torrents ayant de multiples fichiers - - - - De&lete .torrent files afterwards - Supprimer &les fichiers .torrent par la suite - - - + Copy .torrent files for finished downloads to: Copier les fichiers .torrent des téléchargements terminés dans : - + Pre-allocate disk space for all files Pré-allouer l'espace disque pour tous les fichiers - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding - - - - + Append .!qB extension to incomplete files Ajouter l'extension .!qB aux noms des fichiers incomplets - - Enable recursive download dialog - - - - + Automatically add torrents from: Ajouter automatiquement les torrents présents dans : - + Add entry Ajouter une entrée - + Remove entry Supprimer une entrée - + + Email notification upon download completion + Notification par courriel de fin de téléchargement + + + + Destination email: + Courriel de destination : + + + SMTP server: Serveur SMTP : - + This server requires a secure connection (SSL) Ce serveur nécessite une connexion sécurisée (SSL) - - + + + Authentication Authentification - - - - + + + + Username: Nom d'utilisateur : - - - - + + + + Password: Mot de passe : - - Enabled protocol: - Protocole permis : - - - - TCP and μTP - TCP et μTP + + Run external program on torrent completion + Lancer un programme externe lorsqu'un torrent est complété - + Listening Port Port d'écoute - + Port used for incoming connections: Port pour les connexions entrantes : - + Random Aléatoire - + Use UPnP / NAT-PMP port forwarding from my router Utiliser la redirection de port sur mon routeur via UPnP / NAT-PMP - + Use different port on each startup Utiliser un port différent à chaque démarrage - + Connections Limits Limites de connexions - + Maximum number of connections per torrent: Nombre maximum de connexions par torrent : - + Global maximum number of connections: Nombre maximum global de connexions : - + Maximum number of upload slots per torrent: Nombre maximum d'emplacements d'envoi par torrent : - + Global maximum number of upload slots: Nombre maximum global d'emplacements d'envoi : - + Proxy Server Serveur mandataire (proxy) - + Type: Type : - + (None) (Aucun) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Hôte : - - + + Port: Port : - + Otherwise, the proxy server is only used for tracker connections Dans le cas contraire, le proxy sera uniquement utilisé pour contacter les trackers - + Use proxy for peer connections Utiliser le serveur mandataire pour se connecter aux utilisateurs (pairs) - + Disable connections not supported by proxies Les connexions désactivées ne sont pas supportées par les proxys. - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection Les flux RSS, le moteur de recherche, les mises à jour du logiciel et tout autre chose sauf les transferts de torrents et opérations liées (comme les échanges de pairs) utiliseront une connexion directe - + Use proxy only for torrents Utiliser le proxy seulement pour les torrents - - A&uthentication - A&uthentication + + Info: The password is saved unencrypted + Information : le mot de passe est sauvegardé en clair - - Info: The password is saved unencrypted - Information : le mot de passe est sauvegardé en clair + + IP Filtering + Filtrage IP - + Filter path (.dat, .p2p, .p2b): Chemin du filtre (.dat, .p2p, .p2b) : - + Reload the filter Recharger le filtre - - Manually banned IP addresses... - Adresses IP bannies manuellement... - - - + Apply to trackers Appliquer aux trackers - + Global Rate Limits Limites de vitesse globales - - - - - - - KiB/s - - - - - + + Upload: Envoi : - - + + + + + KiB/s + Kio/s + + + + Download: Réception : - + Alternative Rate Limits Limites de vitesse alternatives - - + + Schedule the use of alternative rate limits + Planifier l'utilisation des vitesses limites alternatives + + + From: from (time1 to time2) - Depuis : + Depuis : - - + To: time1 to time2 - Vers : + Vers : - + When: Quand : - + Every day Tous les jours - + Weekdays Jours ouvrés - + Weekends Week-ends - + Rate Limits Settings Paramètres des limites de vitesse - + Apply rate limit to peers on LAN Appliquer les limites de vitesse sur le réseau local - + Apply rate limit to transport overhead Appliquer les limites de vitesse au surplus généré par le protocole - - + + + Enable µTP protocol + Activer le protocole µTP + + + Apply rate limit to µTP protocol Appliquer les limites de vitesse au protocole µTP - + Privacy Vie privée - + Enable DHT (decentralized network) to find more peers Activer le DHT (réseau décentralisé) pour trouver plus de pairs - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Échanger des pairs avec les applications compatibles (µTorrent, Vuze, …) - + Enable Peer Exchange (PeX) to find more peers Activer l'échange de pairs (PeX) avec les autres utilisateurs - + Look for peers on your local network Rechercher des pairs sur votre réseau local - + Enable Local Peer Discovery to find more peers Activer la découverte de sources sur le réseau local - + Encryption mode: Mode de cryptage: - + Prefer encryption Chiffrement préféré - + Require encryption Chiffrement requis - + Disable encryption Chiffrement désactivé - + Enable when using a proxy or a VPN connection Activez quand vous utilisez une connexion par proxy ou par VPN - + Enable anonymous mode Activer le mode anonyme - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Plus d'informations</a>) + + + + Torrent Queueing + Torrent Queueing + + + Maximum active downloads: Nombre maximum de téléchargements actifs : - + Maximum active uploads: Nombre maximum d'envois actifs : - + Maximum active torrents: Nombre maximum de torrents actifs : - + Do not count slow torrents in these limits Ne pas compter les torrents lents dans ces limites - - Upload rate threshold: - - - - - Download rate threshold: - - - - - sec - seconds - - - - - Torrent inactivity timer: - - - - + Share Ratio Limiting Limitation du ratio de partage - + Seed torrents until their ratio reaches Partager les torrents jusqu'à un ratio de - + then puis - + Pause them Les mettre en pause - + Remove them Les supprimer - - RSS Smart Episode Filters - + + Automatically add these trackers to new downloads: + Ajouter automatiquement ces trackers aux nouveaux téléchargements : - + + Enable Web User Interface (Remote control) + Activer l'interface web (contrôle distant) + + + Use UPnP / NAT-PMP to forward the port from my router Utiliser la redirection de port sur mon routeur via UPnP / NAT-PMP - + + Use HTTPS instead of HTTP + Utiliser HTTPS au lieu de HTTP + + + Certificate: Certificat : - + Import SSL Certificate Importer un certificat SSL - + Key: Clé : - + Import SSL Key Importer une clé SSL - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information sur les certificats</a> - - Use alternative Web UI - - - - - Files location: - + + Bypass authentication for localhost + Contourner l'authentification pour localhost - - Enable clickjacking protection - - - - - Enable Cross-Site Request Forgery (CSRF) protection - + + Update my dynamic domain name + Mettre à jour mon nom de domaine dynamique - + Service: Service : - + Register Créer un compte - + Domain name: Nom de domaine : - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! En activant ces options, vous pouvez <strong>perdre à tout jamais</strong> vos fichiers .torrent ! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well Lorsque ces options sont actives, qBittorrent va <strong>supprimer</strong> les fichiers .torrent après qu'ils aient été ajoutés à la file de téléchargement avec succès (première option) ou non (seconde option). Ceci sera activé <strong>non seulement</strong> aux fichiers ouverts via l'action du menu &ldquo;Ajouter un torrent&rdquo; mais également à ceux ouverts via <strong>l'association de types de fichiers</strong> - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog Si vous activez la seconde option (&ldquo;également lorsque l'ajout est annulé&rdquo;) le fichier .torrent <strong>sera supprimé</strong> même si vous pressez &ldquo;<strong>Annuler</strong>&rdquo; dans la boîte de dialogue &ldquo;Ajouter un torrent&rdquo; - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): - Paramètres supportés (sensible à la casse) : + Paramètres supportés (sensible à la casse) : - + %N: Torrent name - %N : Nom du torrent + %N : Nom du torrent - + %L: Category - %L : Catégorie - - - - %G: Tags (seperated by comma) - + %L : Catégorie - + %F: Content path (same as root path for multifile torrent) - %F : Chemin vers le contenu (même chemin que le chemin racine pour les torrents composés de plusieurs fichiers) + %F : Chemin vers le contenu (même chemin que le chemin racine pour les torrents composés de plusieurs fichiers) - + %R: Root path (first torrent subdirectory path) %R: Root path (first torrent subdirectory path) - + %D: Save path %D: Save path - + %C: Number of files - %C : Nombre de fichiers + %C : Nombre de fichiers - + %Z: Torrent size (bytes) - %Z : Taille du torrent (en octets) + %Z : Taille du torrent (en octets) - + %T: Current tracker - %T : Tracker actuel + %T : Tracker actuel - + %I: Info hash - %I : Hachage d'information + %I : Hachage d'information - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") Encapsuler le paramètre entre guillemets pour éviter que le texte soit coupé en espace blanc (ex., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor Sélectionner un dossier à surveiller - + Folder is already being monitored: Ce dossier est déjà surveillé : - + Folder does not exist: Ce dossier n'existe pas : - + Folder is not readable: Ce dossier n'est pas accessible en lecture : - + Adding entry failed Impossible d'ajouter l'entrée - - - - + + Choose export directory Choisir un dossier pour l'export - - - + + + + + + Choose a save directory Choisir un répertoire de sauvegarde - + Choose an IP filter file Choisissez un filtre d'adresses IP - + All supported filters Tous les filtres supportés - + SSL Certificate Certificat SSL - + + SSL Key + Clé SSL + + + Parsing error Erreur de traitement - + Failed to parse the provided IP filter Impossible de charger le filtre IP fourni - + Successfully refreshed Correctement rechargé - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Le filtre IP a été correctement chargé : %1 règles ont été appliquées. - + Invalid key Clé invalide - + This is not a valid SSL key. Ceci n'est pas une clé SSL valide. - + Invalid certificate Certificat invalide - - Preferences - Préférences - - - - Import SSL certificate - Importer un certificat SSL - - - + This is not a valid SSL certificate. Ceci n'est pas un certificat SSL valide. - - Import SSL key - Importer une clé SSL - - - - SSL key - Clé SSL - - - + Time Error Erreur de temps - + The start time and the end time can't be the same. Les heures de début et de fin ne peuvent être les mêmes. - - + + Length Error Erreur de longueur - + The Web UI username must be at least 3 characters long. Le nom d'utilisateur pour l'interface Web doit être au moins de 3 caractères de long. - + The Web UI password must be at least 6 characters long. Le mot de passe pour l'interface Web doit être au moins de 6 caractères de long. @@ -5889,72 +5244,72 @@ PeerInfo - - Interested(local) and Choked(peer) - + + interested(local) and choked(peer) + intéressé (local) et engorgé (pair) - + interested(local) and unchoked(peer) intéressé (local) et non engorgé (pair) - + interested(peer) and choked(local) intéressé (pair) et engorgé (local) - + interested(peer) and unchoked(local) intéressé (pair) et non engorgé (local) - + optimistic unchoke non-étranglement optimiste - + peer snubbed pair évité - + incoming connection connexion entrante - + not interested(local) and unchoked(peer) non intéressé (local) et non engorgé (pair) - + not interested(peer) and unchoked(local) non intéressé (pair) et non engorgé (local) - + peer from PEX pair issu de PEX - + peer from DHT pair issu du DHT - + encrypted traffic trafic chiffré - + encrypted handshake poignée de main chiffrée - + peer from LSD pair issu de LSD @@ -5962,530 +5317,472 @@ PeerListWidget - + IP IP - + Port Port - + Flags Indicateurs - + Connection Connexion - + Client i.e.: Client application Logiciel - + Progress i.e: % downloaded Progression - + Down Speed i.e: Download speed Vitesse DL - + Up Speed i.e: Upload speed Vitesse UP - + Downloaded i.e: total data downloaded Téléchargé - + Uploaded i.e: total data uploaded Envoyé - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Pertinence - + Files i.e. files that are being downloaded right now Fichiers - + Column visibility Visibilité de colonne - + Add a new peer... Ajouter un nouveau pair… - - + + Ban peer permanently Bloquer le pair indéfiniment - + Manually adding peer '%1'... - Ajout manuel du pair « %1 »… + Ajout manuel du pair « %1 »… - + The peer '%1' could not be added to this torrent. - Le pair « %1 » n'a pas pu être ajouté à ce torrent. + Le pair « %1 » n'a pas pu être ajouté à ce torrent. - + Manually banning peer '%1'... - Bannissement manuel du pair « %1 »… + Bannissement manuel du pair « %1 »… - - + + Peer addition Ajout d'un pair - + Country Pays - + Copy IP:port Copier l'IP:port - + Some peers could not be added. Check the Log for details. Certains pairs n'ont pas pu être ajoutés. Consultez le Journal pour plus d'information. - + The peers were added to this torrent. Les pairs ont été ajoutés à ce torrent. - + Are you sure you want to ban permanently the selected peers? Êtes-vous sûr de vouloir bloquer les pairs sélectionnés ? - + &Yes &Oui - + &No &Non - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - + PeersAdditionDlg - + No peer entered - + Pas de pair entré - + Please type at least one peer. - + Veuillez entrer au moins un pair. - + Invalid peer - + Pair invalide - + The peer '%1' is invalid. - + Le pair « %1 » est invalide. PieceAvailabilityBar - + White: Unavailable pieces - Blanc : morceaux non disponibles + Blanc : morceaux non disponibles - + Blue: Available pieces - Bleu : morceaux disponibles + Bleu : morceaux disponibles PiecesBar - + Files in this piece: Fichiers dans cette pièce : - + File in this piece Ficher dans cette pièce : - + File in these pieces Ficher dans ces pièces - - Wait until metadata become available to see detailed information - Attendre jusqu'à ce que les métadonnée deviennent disponibles afin de voir les informations détaillées - - - + Hold Shift key for detailed information Maintenez la touche Maj. pour les informations détaillées - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Greffons de recherche - + Installed search plugins: - + Greffons de recherche installés : - + Name - Nom + Nom - + Version - + Version - + Url - + URL - - + + Enabled - - - - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - + Activé - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + D’avantage de greffons de recherche ici : <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Installer un nouveau - + Check for updates - + Rechercher des mises à jour - + Close - + Fermer - + Uninstall - + Désinstaller - - - + + + Yes - Oui + Oui - - - - + + + + No - Non + Non - + Uninstall warning - + Avertissement de désinstallation - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Certains greffons n'ont pas pu être désinstallés car ils sont inclus dans qBittorrent. Seuls ceux que vous avez vous-même ajoutés peuvent être désinstallés. +Les greffons en question ont été désactivés. - + Uninstall success - + Désinstallation réussie - + All selected plugins were uninstalled successfully - + Tous les greffons sélectionnés ont été désinstallés avec succès - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - - - - - + + New search engine plugin URL - + Adresse du nouveau greffon de recherche - - + + URL: - + URL: - + Invalid link - + Lien invalide - + The link doesn't seem to point to a search engine plugin. - + Le lien ne semble pas pointer vers un greffon de moteur de recherche. - + Select search plugins - + Sélectionnez les greffons de recherche - + qBittorrent search plugin - + Greffons de recherche qBittorrent + + + + + + Search plugin update + Mise à jour du greffon de recherche - + All your plugins are already up to date. - + Tous vos greffons sont déjà à jour. - + Sorry, couldn't check for plugin updates. %1 - + Désolé, impossible de vérifier les mises à jour du greffon. %1 - + + + Search plugin install - + Installation d'un greffon de recherche + + + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + Le greffon "%1" a été installé avec succès. - + Couldn't install "%1" search engine plugin. %2 - + Impossible d'installer le greffon "%1". %2 + + + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + Le greffon "%1" a été mis à jour avec succès. - + Couldn't update "%1" search engine plugin. %2 - + Impossible de mettre à jour le greffon "%1". %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Source du greffon - + Search plugin source: - + Source du greffon de recherche : - + Local file - + Fichier local - + Web link - - - - - PowerManagement - - - qBittorrent is active - + Lien web - PreviewSelectDialog - - - Preview - Prévisualiser - + PreviewSelect - + Name Nom - + Size Taille - + Progress Progression - - + + Preview impossible Prévisualisation impossible - - + + Sorry, we can't preview this file Désolé, il est impossible de prévisualiser ce fichier - Private::FileLineEdit - - - '%1' does not exist - '%1' n'existe pas - - - - '%1' does not point to a directory - '%1' ne pointe pas vers un répertoire - - - - '%1' does not point to a file - '%1' ne pointe pas vers un fichier - - - - Does not have read permission in '%1' - N'a pas la permission de lire dans '%1' - - - - Does not have write permission in '%1' - N'a pas la permission d'écrire dans '%1' - - - PropListDelegate - + Not downloaded Non téléchargé - - + + Normal Normal (priority) Normale - - N/A - N/D - - - + Do not download Do not download (priority) - Ne pas télécharger + Ne pas télécharger - - + + High High (priority) Haute - + N/A + N/D + + + Mixed Mixed (priorities Mixtes - - + + Maximum Maximum (priority) Maximale @@ -6494,32 +5791,32 @@ PropTabBar - + General Général - + Trackers Trackers - + Peers Pairs - + HTTP Sources Sources HTTP - + Content Contenu - + Speed Vitesse @@ -6539,7 +5836,7 @@ Progress: - Progression : + Progression : @@ -6550,12 +5847,12 @@ Time Active: Time (duration) the torrent is active (not paused) - Actif pendant : + Actif pendant : ETA: - Temps restant : + Temps restant : @@ -6565,32 +5862,32 @@ Seeds: - Sources : + Sources : Download Speed: - Vitesse de téléchargement : + Vitesse de téléchargement : Upload Speed: - Vitesse d'émission : + Vitesse d'émission : Peers: - Pairs : + Pairs : Download Limit: - Limite de téléchargement : + Limite de téléchargement : Upload Limit: - Limite d'envoi : + Limite d'envoi : @@ -6613,240 +5910,240 @@ Commentaire : - + Select All Tout sélectionner - + Select None Ne rien sélectionner - + Normal Normale - + High Haute Share Ratio: - Ratio de partage : + Ratio de partage : Reannounce In: - Annoncer dans : + Annoncer dans : Last Seen Complete: - Dernière fois vu complet : + Dernière fois vu complet : Total Size: - Taille totale : + Taille totale : Pieces: - Morceaux : + Morceaux : Created By: - Créé par : + Créé par : Added On: - Ajouté le : + Ajouté le : Completed On: - Complété le : + Complété le : Created On: - Créé le : + Créé le : Torrent Hash: - Hachage du torrent : + Hachage du torrent : Save Path: - Chemin de sauvegarde : + Chemin de sauvegarde : - + Maximum Maximale + - Do not download Ne pas télécharger - + Never Jamais - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 × %2 (a %3) - - + + %1 (%2 this session) %1 (%2 cette session) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (partagé pendant %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 maximum) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 total) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 en moyenne) - + Open Ouvrir - + Open Containing Folder Ouvrir le dossier parent - + Rename... Renommer… - + Priority Priorité - + New Web seed Nouvelle source web - + Remove Web seed Supprimer la source web - + Copy Web seed URL Copier l'URL de la source web - + Edit Web seed URL Modifier l'URL de la source web - + + Rename the file + Renommer le fichier + + + New name: Nouveau nom : - - + + + The file could not be renamed + Le fichier n'a pas pu être renommé + + + + This file name contains forbidden characters, please choose a different one. + Ce nom de fichier contient des caractères interdits, veuillez en choisir un autre. + + + + This name is already in use in this folder. Please use a different name. Ce nom est déjà utilisé au sein de ce dossier. Veuillez choisir un nom différent. - + The folder could not be renamed Le dossier n'a pas pu être renommé - + qBittorrent qBittorrent - + Filter files... Filtrer les fichiers… - - Renaming - Renommage - - - - - Rename error - Erreur de renomage - - - - The name is empty or contains forbidden characters, please choose a different one. - Ce nom est vide ou contient des caractères interdits, veuillez en choisir un autre. - - - + New URL seed New HTTP source Nouvelle source URL - + New URL seed: - Nouvelle source URL : + Nouvelle source URL : - - + + This URL seed is already in the list. Cette source URL est déjà sur la liste. - + Web seed editing Modification de la source web - + Web seed URL: URL de la source web : @@ -6854,230 +6151,117 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + Votre adresse IP a été bannie après un nombre excessif de tentatives d'authentification échouées. + + + + Error: '%1' is not a valid torrent file. + + Erreur : « %1 » n'est pas un fichier torrent valide. + + + + + Error: Could not add torrent to session. + Erreur lors de l'ajout du torrent à la session. + + + + I/O Error: Could not create temporary file. + Erreur d'entrée/sortie : le fichier temporaire n'a pas pu être créé. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 est un paramètre de ligne de commande inconnu. - - + + %1 must be the single command line parameter. %1 doit être le paramètre de ligne de commande unique. - + + %1 must specify the correct port (1 to 65535). + %1 doit spécifier le port correct (1 à 65535). + + + You cannot use %1: qBittorrent is already running for this user. Vous ne pouvez pas utiliser% 1: qBittorrent est déjà en cours d'exécution pour cet utilisateur. - + Usage: Utilisation : - + Options: Options - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - Le paramètre '%1' doit suivre la syntaxe '%1=%2' + + Displays program version + Afficher la version du programme - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - Le paramètre '%1' doit suivre la syntaxe '%1=%2' + + Displays this help message + Afficher ce message d'aide - - Expected integer number in environment variable '%1', but got '%2' - + + Changes the Web UI port (current: %1) + Change le port de l'interface Web (actuellement : %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - Le paramètre '%1' doit suivre la syntaxe '%1=%2' - - - - Expected %1 in environment variable '%2', but got '%3' - Attendu %1 dans la variable d'environnement '%2', but obtenu '%3' - - - - port - port - - - - %1 must specify a valid port (1 to 65535). - %1 doit spécifier un port valide (1 à 65535). - - - - Display program version and exit - Afficher la version du programme et quitter - - - - Display this help message and exit - Afficher ce message d'aide et quitter - - - - Change the Web UI port - Change le port de l'interface Web - - - + Disable splash screen Désactiver l'écran de démarrage - + Run in daemon-mode (background) Exécuter en tâche de fond - - dir - Use appropriate short form or abbreviation of "directory" - - - - - Store configuration files in <dir> - Sauvegarde les fichiers de configuration dans <dir> - - - - - name - nom - - - - Store configuration files in directories qBittorrent_<name> - Sauvegarde les fichiers de configuration dans les répertoires qBittorrent_<name> - - - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Hacke les fichiers fastresume de libtorrent, et rend les chemins des fichiers relatifs au répertoire du profil - - - - files or URLs - fichiers ou URLs - - - - Download the torrents passed by the user + + Downloads the torrents passed by the user Télécharger les torrents transmis par l'utilisateur - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - - - - - Options when adding new torrents: - Options lors de l'ajout d'un nouveau torrent : - - - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - - - - - path - chemin - - - - Torrent save path - Chemin d'enregistrement du torrent - - - - Add torrents as started or paused - Ajouter les torrents comme démarrés ou mis en pause - - - - Skip hash check - Ne pas vérifier le hash du torrent - - - - Assign torrents to category. If the category doesn't exist, it will be created. - - - - - Download files in sequential order - - - - - Download first and last pieces first - Télécharger premières et dernières pièces en premier - - - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - - - - - Command line parameters take precedence over environment variables - - - - + Help Aide - + Run application with -h option to read about command line parameters. Exécuter le programme avec l'option -h pour afficher les paramètres de ligne de commande. - + Bad command line Mauvaise ligne de commande - + Bad command line: Mauvaise ligne de commande : - + Legal Notice Information légale - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - - - - - No further notices will be issued. - - - - + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. No further notices will be issued. @@ -7086,353 +6270,432 @@ Ce message d'avertissement ne sera plus affiché. - + Press %1 key to accept and continue... Appuyez sur la touche %1 pour accepter et continuer… - + Legal notice Information légale - + Cancel Annuler - + I Agree J'accepte - - - Upgrade - Mettre à jour + + Torrent name: %1 + Nom du torrent : %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - Vous venez de mettre à jour depuis une ancienne version qui sauvegardait les paramètres d'une manière différente. Vous devez migrer vers le nouveau système de sauvegarde. Vous ne pourrez plus utiliser une version plus ancienne que la v3.3.0. Continuer ? [y/n] + + Torrent size: %1 + Taille du torrent : %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - Vous venez de mettre à jour depuis une ancienne version qui sauvegardait les paramètres d'une manière différente. Vous devez migrer vers le nouveau système de sauvegarde. Si vous continuez, vous ne pourrez plus utiliser une version plus ancienne que la v3.3.0. + + Save path: %1 + Chemin de sauvegarde : %1 - - Couldn't migrate torrent with hash: %1 - Impossible de migrer le torrent avec le hachage : %1 + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Le torrent a été téléchargé dans %1. - - Couldn't migrate torrent. Invalid fastresume file name: %1 - Impossible de migrer le torrent. Nom de fichier fastresume invalide : %1 + + Thank you for using qBittorrent. + Merci d'utiliser qBittorrent. - - Detected unclean program exit. Using fallback file to restore settings: %1 - + + [qBittorrent] '%1' has finished downloading + [qBittorrent] Le téléchargement de « %1 » est terminé. - - An access error occurred while trying to write the configuration file. - Une erreur d'accès s'est produite en tentant d'écrire le fichier de configuration. + + The remote host name was not found (invalid hostname) + Hôte distant introuvable (nom d'hôte invalide) - - A format error occurred while trying to write the configuration file. - Une erreur de format s'est produite en tentant d'écrire le fichier de configuration. + + The operation was canceled + L'opération a été annulée - - An unknown error occurred while trying to write the configuration file. - + + The remote server closed the connection prematurely, before the entire reply was received and processed + Le serveur distant a interrompu la connexion prématurément, avant la réception complète de la réponse - - - RSS::AutoDownloader - - - Invalid data format. - + + The connection to the remote server timed out + Délai de connexion au serveur distant expiré - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - + + SSL/TLS handshake failed + Poignée de main SSL/TLS échouée - - Invalid data format - + + The remote server refused the connection + Le serveur distant a refusé la connexion - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - + + The connection to the proxy server was refused + La connexion au serveur proxy a été refusée - - Couldn't load RSS AutoDownloader rules. Reason: %1 - + + The proxy server closed the connection prematurely + Le serveur proxy a fermé la connexion prématurément - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - + + The proxy host name was not found + Le nom d'hôte du proxy n'a pas été trouvé - - RSS feed at '%1' updated. Added %2 new articles. - + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Délai de connexion au serveur mandataire expiré ou le serveur n'a pas répondu à temps à la requête - - Failed to parse RSS feed at '%1'. Reason: %2 - + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Le proxy requiert une authentification afin de répondre à la requête, mais n'accepte aucun des identifiants spécifiés - - Couldn't read RSS Session data from %1. Error: %2 - + + The access to the remote content was denied (401) + L'accès au contenu distant a été refusé (401) - - Couldn't parse RSS Session data. Error: %1 - + + The operation requested on the remote content is not permitted + L'opération demandée sur le contenu distant n'est pas autorisée - - Couldn't load RSS Session data. Invalid data format. - + + The remote content was not found at the server (404) + Le contenu distant n'a pas été trouvé sur le serveur (404) - - Couldn't load RSS article '%1#%2'. Invalid data format. - + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Le serveur distant demande une authentification avant de distribuer le contenu, mais les identifiants fournis n'ont pas été acceptés - - - RSS::Private::Parser - - Invalid RSS feed. - Flux RSS non valide. + + The Network Access API cannot honor the request because the protocol is not known + L'API d'Accès Réseau ne peut pas traiter la requête parce que le protocole est inconnu - - %1 (line: %2, column: %3, offset: %4). - + + The requested operation is invalid for this protocol + L'opération demandée est invalide pour ce protocole + + + + An unknown network-related error was detected + Une erreur inconnue relative au réseau a été détectée - - - RSS::Session - - RSS feed with given URL already exists: %1. - Le flux RSS avec le chemin donné existe déjà : %1. + + An unknown proxy-related error was detected + Une erreur inconnue relative au serveur mandataire a été détectée - - Cannot move root folder. - Ne peut pas déplacer le dossier racine. + + An unknown error related to the remote content was detected + Une erreur inconnue relative au contenu distant a été détectée - - - Item doesn't exist: %1. - + + A breakdown in protocol was detected + Une rupture de protocole a été détectée - - Cannot delete root folder. - Ne peut pas supprimer le dossier racine. + + Unknown error + Erreur inconnue - - Incorrect RSS Item path: %1. - Chemin d'article RSS Incorrect : %1. + + + Upgrade + Mettre à jour - - RSS item with given path already exists: %1. - L'article RSS avec le chemin donné existe déjà : %1. + + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] + Vous venez de mettre à jour depuis une ancienne version qui sauvegardait les paramètres d'une manière différente. Vous devez migrer vers le nouveau système de sauvegarde. Vous ne pourrez plus utiliser une version plus ancienne que la v3.3.0. Continuer ? [y/n] - - Parent folder doesn't exist: %1. - + + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. + Vous venez de mettre à jour depuis une ancienne version qui sauvegardait les paramètres d'une manière différente. Vous devez migrer vers le nouveau système de sauvegarde. Si vous continuez, vous ne pourrez plus utiliser une version plus ancienne que la v3.3.0. + + + + Couldn't migrate torrent with hash: %1 + Impossible de migrer le torrent avec le hachage : %1 + + + + Couldn't migrate torrent. Invalid fastresume file name: %1 + Impossible de migrer le torrent. Nom de fichier fastresume invalide : %1 + + + + Detected unclean program exit. Using fallback file to restore settings. + Fermeture inattendue du programme détectée. Le fichier de sauvegarde va être utilisé pour restaurer les paramètres. + + + + An access error occurred while trying to write the configuration file. + Une erreur d'accès s'est produite en tentant d'écrire le fichier de configuration. + + + + A format error occurred while trying to write the configuration file. + Une erreur de format s'est produite en tentant d'écrire le fichier de configuration. - RSSWidget + RSS - + Search Rechercher - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - La récupération automatique des flux RSS est actuellement désactivée ! Vous pouvez l'activer depuis les paramètres de l'application. - - - + New subscription Nouvelle souscription - - - + + + Mark items read Marquer comme lu - - Refresh RSS streams - Rafraîchir les flux RSS - - - + Update all Tout mettre à jour - + RSS Downloader... Téléchargeur de RSS… - + + Settings... + Paramètres… + + + Torrents: (double-click to download) - Torrents : (double-clic pour télécharger) + Torrents : (double-clic pour télécharger) - - + + Delete Supprimer - + Rename... Renommer… - + Rename Renommer - - + + Update Mettre à jour - + New subscription... Nouvelle souscription… - - + + Update all feeds - Mettre à jour tous les flux + Tout mettre à jour - + Download torrent Télécharger le torrent - + Open news URL - + Ouvrir l'URL de l'article - + Copy feed URL Copier l'URL du flux - + New folder... Nouveau dossier… - + + Refresh RSS streams + Rafraîchir les flux RSS + + + + RSSImp + + + Stream URL: + URL du flux : + + + + Please type a RSS stream URL + Veuillez entrer l'adresse d'un flux RSS + + + + This RSS feed is already in the list. + Ce flux RSS est déjà dans la liste. + + + Please choose a folder name - Veuillez choisir un nouveau nom de dossier + Veuillez indiquer un nom de dossier - + Folder name: Nom du dossier : - + New folder Nouveau dossier - - Please type a RSS feed URL - Veuillez entrer une URL de flux RSS - - - - Feed URL: - URL du flux : - - - + Deletion confirmation - Confirmation de la suppression + Confirmation de suppression - + Are you sure you want to delete the selected RSS feeds? - Voulez-vous vraiment supprimer les flux RSS sélectionnés ? + Voulez-vous vraiment supprimer les flux RSS sélectionnés ? - + Please choose a new name for this RSS feed Veuillez choisir un nouveau nom pour ce flux RSS - + New feed name: Nouveau nom du flux : - - Rename failed - Échec du renommage + + Name already in use + Nom déjà utilisé + + + + This name is already used by another item, please choose another one. + Ce nom est déjà utilisé par un autre élément, veuillez en choisir un autre. - + Date: Date : - + Author: Auteur : + + + Unread + Non lu + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + Le téléchargement automatique de '%1' à partir du flux RSS '%2' a échoué parce qu'il ne contient pas un lien vers un torrent ou un magnet... + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + Téléchargement automatique du torrent '%1' depuis le flux RSS '%2'… + + + + Rss::Private::Parser + + + Invalid RSS feed. + Flux RSS non valide. + + + + RssSettingsDlg + + + RSS Reader Settings + Paramètres du lecteur RSS + + + + RSS feeds refresh interval: + Intervalle de rafraîchissement des flux RSS : + + + + min + min + + + + Maximum number of articles per feed: + Numbre maximum d'articles par flux : + ScanFoldersDelegate - + Select save location Sélectionner un emplacement de sauvegarde @@ -7440,274 +6703,268 @@ ScanFoldersModel - + Monitored Folder Répertoire surveillé - + Override Save Location Remplacer l'emplacement de sauvegarde - + Monitored folder Répertoire surveillé - + Default save location Emplacement de sauvegarde par défaut - + Browse... Parcourir... - SearchJobWidget + SearchEngine - - Form - + + Unknown search engine plugin file format. + Format de fichiers du greffon de recherche inconnu. - - Results(xxx) - + + A more recent version of this plugin is already installed. + Une version plus récente de ce greffon est déjà installée. - - Search in: - + + + Plugin is not supported. + Le greffon n'est pas supporté. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - + + Update server is temporarily unavailable. %1 + Désolé, le serveur de mise à jour est temporairement indisponible. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - + + + Failed to download the plugin file. %1 + Impossible de télécharger le greffon. %1 - - Seeds: - Sources : + + An incorrect update info received. + Une information erronée a été reçue concernant la mise à jour. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - + + All categories + Toutes catégories - - - to - + + Movies + Films - - <html><head/><body><p>Maximal number of seeds</p></body></html> - + + TV shows + Séries TV - - - - + + Music + Musique - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + + Games + Jeux - - Size: - Taille : + + Anime + Anime - - <html><head/><body><p>Minimal torrent size</p></body></html> - + + Software + Logiciels - - <html><head/><body><p>Maximal torrent size</p></body></html> - + + Pictures + Photos + + + + Books + Livres + + + + SearchListDelegate + + + + Unknown + Inconnu + + + SearchTab - + Name i.e: file name - Nom + Nom - + Size i.e: file size - Taille + Taille - + Seeders i.e: Number of full sources - + Sources complètes - + Leechers i.e: Number of partial sources - + Sources partielles - + Search engine - - - - - Filter search results... - + Moteur de recherche - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Résultats (affichage <i>%1</i> de <i>%2</i>) : - + Torrent names only - + Noms de torrent seulement - + Everywhere - - - - - Use regular expressions - + Partout - + Searching... - + Recherche... - + Search has finished - Recherche terminée + Recherche terminée - + Search aborted - + Recherche interrompue - + An error occurred during search... - + Une erreur s'est produite durant la recherche.. - + Search returned no results - + La recherche n'a retourné aucun résultat - + Column visibility - - - SearchPluginManager - - - Unknown search engine plugin file format. - - - - - A more recent version of this plugin is already installed. - - - - - Plugin is not supported. - + + Form + Formulaire - - All categories - + + Results(xxx) + Résultats(xxx) - - Movies - + + Search in: + Rechercher dans : - - TV shows - + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Certains moteurs de recherche cherchent dans la description du torrent et aussi dans les noms de fichier du torrent. Soit ces résultats seront affichés dans la liste ci-dessous est contrôlée par ce mode.</p><p><span style=" font-weight:600;">Partout </span>désactive le filtrage et montre tout ce qui est retourné par les moteurs de recherche.</p><p><span style=" font-weight:600;">Noms de torrent seulement</span> ne montre que les torrents dont les noms correspondent à la requête de recherche.</p></body></html> - - Music - + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Définir un nombre minimal et maximal autorisé de sources</p></body></html> - - Games - + + Seeds: + Sources : - - Anime - + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Nombre minimal de sources</p></body></html> - - Software - + + + to + à - - Pictures - + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Nombre maximal de sources</p></body></html> - - - Books - + + + + + - - Update server is temporarily unavailable. %1 - + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Définir la taille minimale et maximale autorisée d'un torrent</p></body></html> - - - Failed to download the plugin file. %1 - + + Size: + Taille : - - An incorrect update info received. - + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Taille minimale du torrent</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Taille maximale du torrent</p></body></html> @@ -7715,197 +6972,185 @@ - - - - + + + Search Recherche - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - - + Download Télécharger - + Go to description page Aller à la page de description - + Copy description page URL Copier l'URL de la page de description - + Search plugins... Greffons de recherche... - + A phrase to search for. Une phrase à rechercher - + Spaces in a search term may be protected by double quotes. Les espaces dans un terme de recherche peuvent être protégés par des guillemets. - + Example: Search phrase example Exemple : - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>: recherche <b>foo</b> et <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: recherche <b>foo bar</b> - + All plugins Tous les greffons - + Only enabled Uniquement activé(s) - + Select... Choisir... - - - + + + Search Engine Moteur de recherche - + Please install Python to use the Search Engine. Veuillez installer Python afin d'utiliser le moteur de recherche. - + Empty search pattern Motif de recherche vide - + Please type a search pattern first Veuillez entrer un motif de recherche - + Stop Arrêter - + Search has finished Recherche terminée - + Search has failed La recherche a échoué - ShutdownConfirmDialog + ShutdownConfirmDlg - - Don't show again - - - - + qBittorrent will now exit. - + qBittorrent va fermer maintenant. - + E&xit Now - + &Quitter maintenant - + Exit confirmation - + Confirmation de fermeture - + The computer is going to shutdown. - + L'ordinateur va s’éteindre - + &Shutdown Now - - - - - Shutdown confirmation - + &Éteindre maintenant - + The computer is going to enter suspend mode. - + L'ordinateur va entrer en mode veille - + &Suspend Now - + &Mettre en veille maintenant - + Suspend confirmation - + Confirmation de mise en veille - + The computer is going to enter hibernation mode. - + L'ordinateur va entrer en veille prolongée - + &Hibernate Now - + &Mettre en veille prolongée maintenant - + Hibernate confirmation - + Confirmation de veille prolongée - + You can cancel the action within %1 seconds. - + Vous pouvez annuler cette action dans %1 secondes. + + + + Shutdown confirmation + Confirmation de l'extinction SpeedLimitDialog - + KiB/s Kio/s @@ -7913,52 +7158,52 @@ SpeedPlotView - + Total Upload Envoi (total) - + Total Download Téléchargement (total) - + Payload Upload Envoi (charge utile) - + Payload Download Téléchargement (charge utile) - + Overhead Upload Envoi (surplus) - + Overhead Download Téléchargement (surplus) - + DHT Upload Envoi (DHT) - + DHT Download Téléchargement (DHT) - + Tracker Upload Envoi (tracker) - + Tracker Download Téléchargement (tracker) @@ -7966,95 +7211,87 @@ SpeedWidget - + Period: - Période : + Période : - + 1 Minute 1 minute - + 5 Minutes 5 minutes - + 30 Minutes 30 minutes - + 6 Hours 6 heures - + Select Graphs Sélectionner les graphiques - + Total Upload Envoi (total) - + Total Download Téléchargement (total) - + Payload Upload Envoi (charge utile) - + Payload Download Téléchargement (charge utile) - + Overhead Upload Envoi (surplus) - + Overhead Download Téléchargement (surplus) - + DHT Upload Envoi (DHT) - + DHT Download Téléchargement (DHT) - + Tracker Upload Envoi (tracker) - + Tracker Download Téléchargement (tracker) - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8067,49 +7304,49 @@ Statistiques utilisateur - - Cache statistics - Statistiques du tampon + + Total peer connections: + Nombre total de connexions aux pairs : - - Read cache hits: - Succès de tampon en lecture : + + Global ratio: + Ratio global : - - Average time in queue: - Temps moyen passé en file d'attente : + + Alltime download: + Téléchargé depuis la première utilisation : - - Connected peers: - + + Alltime upload: + Envoyé depuis la première utilisation : - - All-time share ratio: - + + Total waste (this session): + Total gaspillé (durant cette session) : - - All-time download: - + + Cache statistics + Statistiques du tampon - - Session waste: - + + Read cache hits: + Succès de tampon en lecture : - - All-time upload: - + + Average time in queue: + Temps moyen passé en file d'attente : - Total buffer size: - + Total buffers size: + Taille totale des buffers : @@ -8137,7 +7374,12 @@ Taille totale des fichiers en file d'attente : - + + OK + OK + + + %1 ms 18 milliseconds %1ms @@ -8146,27 +7388,32 @@ StatusBar - + Connection status: Statut de la connexion : - + No direct connections. This may indicate network configuration problems. Aucune connexion directe. Ceci peut être signe d'une mauvaise configuration réseau. - + DHT: %1 nodes DHT : %1 nœuds - - qBittorrent needs to be restarted! - + + qBittorrent needs to be restarted + qBittorrent doit être redémarré + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent vient d'être mis à jour et doit être redémarré pour que les changements soient pris en compte. @@ -8185,1563 +7432,1311 @@ Connecté - + Click to switch to alternative speed limits Cliquez ici pour utiliser les limites de vitesse alternatives - + Click to switch to regular speed limits Cliquez ici pour utiliser les limites de vitesse normales - + + Manual change of rate limits mode. The scheduler is disabled. + Mode de changement manuel des limites de taux. Le planificateur est désactivé. + + + Global Download Speed Limit Limite globale de la vitesse de réception - + Global Upload Speed Limit Limite globale de la vitesse d'envoi - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - Tous (0) + Tous (0) - + Downloading (0) - + En Téléchargement (0) - + Seeding (0) - + En Partage (0) - + Completed (0) - + Terminés (0) - + Resumed (0) - + Démarrés (0) - + Paused (0) - + En Pause (0) - + Active (0) - + Actifs (0) - + Inactive (0) - + Inactifs (0) - + Errored (0) - + Erreur (0) - + All (%1) - Tous (%1) + Tous (%1) - + Downloading (%1) - + En Téléchargement (%1) - + Seeding (%1) - + En Partage (%1) - + Completed (%1) - + Terminés (%1) - + Paused (%1) - + En Pause (%1) - + Resumed (%1) - + Démarrés (%1) - + Active (%1) - + Actifs (%1) - + Inactive (%1) - + Inactifs (%1) - + Errored (%1) - + Erreur (%1) - TagFilterModel + TorrentContentModel - - Tags - + + Name + Nom - - All - Toutes + + Size + Taille - - Untagged - + + Progress + Progression + + + + Download Priority + Priorité de téléchargement + + + + Remaining + Restant - TagFilterWidget + TorrentCreatorDlg - - Add tag... - + + Select a folder to add to the torrent + Sélectionner un dossier à ajouter au torrent - - Remove tag - + + Select a file to add to the torrent + Sélectionner un fichier à ajouter au torrent - - Remove unused tags - + + No input path set + Aucun fichier inclu - - Resume torrents - Relancer les torrents + + Please type an input path first + Veuillez sélectionner un fichier ou un dossier à inclure d'abord - - Pause torrents - Mettre en pause les torrents + + Select destination torrent file + Sélectionner le torrent à créer - - Delete torrents - Supprimer les torrents + + Torrent Files (*.torrent) + Fichiers torrent (*.torrent) - - New Tag - + + Torrent was created successfully: %1 + %1 is the path of the torrent + Torrent créé avec succès : %1 - - Tag: - + + + + Torrent creation + Création d'un torrent - - Invalid tag name - + + Torrent creation was unsuccessful, reason: %1 + La création du torrent a échoué, raison : %1 - - Tag name '%1' is invalid - - - - - Tag exists - - - - - Tag name already exists. - + + Created torrent file is invalid. It won't be added to download list. + Le torrent créé est invalide. Il ne sera pas ajouté à la liste des téléchargements. - TorrentCategoryDialog - - - Torrent Category Properties - - - - - Name: - Nom : - - - - Save path: - Répertoire de sauvegarde : - - - - Choose save path - - + TorrentModel - - New Category - Nouvelle catégorie - - - - Invalid category name - Nom de catégorie invalide - - - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - - - - - Category creation error - Erreur de création de catégorie - - - - Category with the given name already exists. -Please choose a different name and try again. - - - - - TorrentContentModel - - + Name + i.e: torrent name Nom - + Size + i.e: torrent size Taille - - Progress + + Done + % Done Progression - - Download Priority - Priorité de téléchargement - - - - Remaining - Restant - - - - Availability - Disponibilité : - - - - TorrentCreatorDialog - - - Torrent Creator - - - - - Select file/folder to share - - - - - Path: - - - - - [Drag and drop area] - - - - - - Select file - - - - - - Select folder - - - - - Settings - - - - - Piece size: - - - - - Auto - - - - - 16 KiB - - - - - 32 KiB - - - - - 64 KiB - - - - - 128 KiB - - - - - 256 KiB - - - - - 512 KiB - - - - - 1 MiB - - - - - 2 MiB - - - - - 4 MiB - - - - - 8 MiB - - - - - 16 MiB - - - - - 32 MiB - - - - - Calculate number of pieces: - - - - - Private torrent (Won't distribute on DHT network) - - - - - Start seeding immediately - - - - - Ignore share ratio limits for this torrent - - - - - Optimize alignment - - - - - Fields - - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - - - - Web seed URLs: - - - - - Tracker URLs: - - - - - Comments: - - - - - Source: - - - - - Progress: - Progression : - - - - Create Torrent - - - - - - - Torrent creation failed - - - - - Reason: Path to file/folder is not readable. - + + Status + Torrent status (e.g. downloading, seeding, paused) + Statut - - Select where to save the new torrent - + + Seeds + i.e. full sources (often untranslated) + Sources - - Torrent Files (*.torrent) - + + Peers + i.e. partial sources (often untranslated) + Pairs - - Reason: %1 - + + Down Speed + i.e: Download speed + Vitesse DL - - Reason: Created torrent is invalid. It won't be added to download list. - + + Up Speed + i.e: Upload speed + Vitesse UP - - Torrent creator - + + Ratio + Share ratio + Ratio - - Torrent created: - + + ETA + i.e: Estimated Time of Arrival / Time left + Temps restant - - - TorrentInfo - - File size exceeds max limit %1 - + + Category + Catégorie - - Torrent file read error: %1 - + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Ajouté le - - Torrent file read error: size mismatch - + + Completed On + Torrent was completed on 01/01/2010 08:00 + Terminé le - - - TorrentsController - - Not contacted yet - + + Tracker + Tracker - - Updating... - + + Down Limit + i.e: Download limit + Limite réception - - Working - + + Up Limit + i.e: Upload limit + Limite envoi - - Not working - + + Downloaded + Amount of data downloaded (e.g. in MB) + Téléchargé - - Error: '%1' is not a valid torrent file. - + + Uploaded + Amount of data uploaded (e.g. in MB) + Envoyé - - - - - Torrent queueing must be enabled - + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Téléchargement de la session - - Save path cannot be empty - + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Émission de la session - - - Category cannot be empty - + + Remaining + Amount of data left to download (e.g. in MB) + Restant - - Unable to create category - + + Time Active + Time (duration) the torrent is active (not paused) + Actif pendant - - Unable to edit category - + + Save path + Torrent save path + Chemin de sauvegarde - - Cannot make save path - + + Completed + Amount of data completed (e.g. in MB) + Terminé - - Cannot write to directory - + + Ratio Limit + Upload share ratio limit + Limite de ratio - - WebUI Set location: moving "%1", from "%2" to "%3" - + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Dernière fois vu complet - - Incorrect torrent name - + + Last Activity + Time passed since a chunk was downloaded/uploaded + Dernière activité - - - Incorrect category name - + + Total Size + i.e. Size including unwanted data + Taille totale TrackerFiltersList - + All (0) this is for the tracker filter Tous (0) - + Trackerless (0) Sans tracker (0) - + Error (0) Erreur (0) - + Warning (0) Alerte (0) - - + + Trackerless (%1) Sans tracker (%1) - - - Error (%1) - Erreur (%1) - - - - - Warning (%1) - Alerte (%1) - - - - Resume torrents - Démarrer les torrents - - - - Pause torrents - Mettre en pause les torrents - - - - Delete torrents - Supprimer les torrents - - - - - All (%1) - this is for the tracker filter - Tous (%1) + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - - TrackerListWidget - - - Working - - - - - Disabled - Désactivé - - - - This torrent is private - + + + Error (%1) + Erreur (%1) - - Updating... - + + + Warning (%1) + Alerte (%1) - - Not working - + + Resume torrents + Démarrer les torrents - - Not contacted yet - + + Pause torrents + Mettre en pause les torrents - - - - - - - N/A - + + Delete torrents + Supprimer les torrents - - Tracker editing - + + + All (%1) + this is for the tracker filter + Tous (%1) + + + TrackerList - - Tracker URL: - + + URL + URL - - - Tracker editing failed - + + Status + Statut - - The tracker URL entered is invalid. + + Received - - The tracker URL already exists. - + + Seeds + Sources - - Add a new tracker... - + + Peers + Pairs - - Remove tracker - + + Downloaded + Téléchargé - - Copy tracker URL - + + Message + Message - - Edit selected tracker URL - + + + Working + Fonctionne - - Force reannounce to selected trackers - + + Disabled + Désactivé - - Force reannounce to all trackers - + + This torrent is private + Ce torrent est privé - - URL - + + Updating... + Mise à jour… - - Status - Statut + + Not working + Ne fonctionne pas - - Received - + + Not contacted yet + Pas encore contacté - - Seeds - + + Tracker URL: + URL du tracker : - - Peers - Pairs + + Tracker editing + Modification du tracker - - Downloaded - Téléchargé + + + Tracker editing failed + Échec de la modification du tracker - - Message - + + The tracker URL entered is invalid. + L'URL du tracker fourni est invalide. - - Column visibility - + + The tracker URL already exists. + L'URL du tracker existe déjà. - - - TrackerLoginDialog - - - Tracker authentication - + + Add a new tracker... + Ajouter un nouveau tracker… - - Tracker: - + + Copy tracker URL + Copier l'URL du tracker - - Login - Identifiant + + Edit selected tracker URL + Modifier l'URL du tracker sélectionné - - Username: - Nom d'utilisateur : + + Force reannounce to selected trackers + Forcer une nouvelle annonce aux trackers sélectionnés - - Password: - Mot de passe : + + Force reannounce to all trackers + Forcer une nouvelle annonce à tous les trackers - - Log in - + + Remove tracker + Supprimer le tracker - TrackersAdditionDialog + TrackersAdditionDlg - + Trackers addition dialog - + Fenêtre d'ajout de trackers - + List of trackers to add (one per line): - + Liste des trackers à ajouter (un par ligne) : - - + + µTorrent compatible list URL: - + URL de la liste compatible avec µTorrent : + + + + I/O Error + Erreur E/S + + + + Error while trying to open the downloaded file. + Erreur à l'ouverture du fichier téléchargé. - + No change - + Aucun changement - + No additional trackers were found. - + Aucun tracker supplémentaire n'est disponible. - + Download error - Erreur de téléchargement + Erreur de téléchargement - + The trackers list could not be downloaded, reason: %1 - + La liste de trackers n'a pas pu être téléchargée, raison : %1 TransferListDelegate - + Downloading En téléchargement - + Downloading metadata used when loading a magnet link Téléchargement des métadonnées - + Allocating qBittorrent is allocating the files on disk Attribution - + Paused En pause - + Queued i.e. torrent is queued En file d'attente - + Seeding Torrent is complete and in upload-only mode En partage - + Stalled Torrent is waiting for download to begin En attente - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] Téléchargement - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] Émission - + Checking Torrent local data is being checked Vérification - + Queued for checking i.e. torrent is queued for hash checking Vérification planifiée - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Vérification des données de relancement - + Completed Terminé - - Moving - Torrent local data are being moved/relocated - - - - + Missing Files Fichiers manquants - + Errored torrent status, the torrent has an error Erreur - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (partagé pendant %2) - - - %1 ago - e.g.: 1h 20m ago - il y a %1 - - - - TransferListFiltersWidget - - - Status - Statut - - - - Categories - Catégories - - - - Tags - - - - - Trackers - Trackers - - - - TransferListModel - - - Name - i.e: torrent name - Nom - - - - Size - i.e: torrent size - Taille - - - - Done - % Done - - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Statut - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - Pairs - - - - Down Speed - i.e: Download speed - Vitesse DL - - - - Up Speed - i.e: Upload speed - Vitesse UP - - - - Ratio - Share ratio - - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - Catégorie - - - - Tags - - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Téléchargé - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Envoyé - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - Restant - - - - Time Active - Time (duration) the torrent is active (not paused) - - - - - Save path - Torrent save path - - - - - Completed - Amount of data completed (e.g. in MB) - Terminé - - - - Ratio Limit - Upload share ratio limit - + + + %1 ago + e.g.: 1h 20m ago + il y a %1 + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + Statut - - Last Activity - Time passed since a chunk was downloaded/uploaded - + + Categories + Catégories - - Total Size - i.e. Size including unwanted data - + + Trackers + Trackers TransferListWidget - + Column visibility Visibilité des colonnes - + Choose save path Choix du répertoire de destination - + Torrent Download Speed Limiting Limitation de la vitesse de réception - + Torrent Upload Speed Limiting Limitation de la vitesse d'émission - + Recheck confirmation Revérifier la confirmation - + Are you sure you want to recheck the selected torrent(s)? Êtes-vous sur de vouloir revérifier le ou les torrent(s) sélectionné(s) ? - + Rename Renommer - + New name: Nouveau nom : - + Resume Resume/start the torrent Démarrer - + Force Resume Force Resume/start the torrent Forcer la reprise - + Pause Pause the torrent Mettre en pause - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - - - - - Add Tags - - - - - Remove All Tags - - - - - Remove all tags from selected torrents? - + + New Category + Nouvelle Catégorie - - Comma-separated tags: - + + Category: + Catégorie : - - Invalid tag - Tag invalide + + Invalid category name + Nom de catégorie invalide - - Tag name: '%1' is invalid - + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Nom de catégorie ne doit pas contenir '\'. +Nom de catégorie ne doit pas commencer/finir avec '/'. +Nom de catégorie ne doit pas contenir la séquence '//'. - + Delete Delete the torrent Supprimer - + Preview file... Prévisualiser le fichier… - + Limit share ratio... Limiter le ratio de partage… - + Limit upload rate... Limiter la vitesse d'envoi… - + Limit download rate... Limiter la vitesse de réception… - + Open destination folder Ouvrir le répertoire de destination - + Move up i.e. move up in the queue Déplacer vers le haut - + Move down i.e. Move down in the queue Déplacer vers le bas - + Move to top i.e. Move to top of the queue Déplacer tout en haut - + Move to bottom i.e. Move to bottom of the queue Déplacer tout en bas - + Set location... Chemin de sauvegarde… - - Force reannounce - - - - + Copy name Copier nom - - Copy hash - Copier le hash - - - + Download first and last pieces first Télécharger premières et dernières pièces en premier - + Automatic Torrent Management Gestion de torrent automatique - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category Le mode automatique signifie que certaines propriétés du torrent (ex: le dossier d'enregistrement) seront décidés via la catégorie associée - + Category Catégorie - + New... New category... Nouvelle… - + Reset Reset category Réinitialiser - - Tags - - - - - Add... - Add / assign multiple tags... - Ajouter... - - - - Remove All - Remove all tags - Supprimer tout - - - + Priority Priorité - + Force recheck Forcer une revérification - + Copy magnet link Copier le lien magnet - + Super seeding mode Mode de super-partage - + Rename... Renommer… - + Download in sequential order Téléchargement séquentiel - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + Limitation du ratio de partage - - Use global share limit - + + Use global ratio limit + Utiliser la limite globale - - - + + + buttonGroup - + buttonGroup - - Set no share limit - + + Set no ratio limit + Ne pas limiter le ratio - - Set share limit to - + + Set ratio limit to + Limiter le ratio à + + + WebApplication - - ratio - + + Incorrect category name + Nom de catégorie incorrect + + + WebUI - - minutes - + + The Web UI is listening on port %1 + L'interface web est associée au port %1 - - No share limit method selected - + + Web UI Error - Unable to bind Web UI to port %1 + Erreur de l'interface Web – Impossible d'assigner l'interface Web au port %1 + + + + about + + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Un client avancé BitTorrent programmé en C++, basé sur l'outil Qt et libtorrent-rasterbar. - - Please select a limit method first - + + Copyright %1 2006-2016 The qBittorrent project + Copyright %1 2006-2016 Le projet qBittorrent + + + + Home Page: + Page d'accueil : + + + + Forum: + Forum : + + + + Bug Tracker: + Suivi de Bogues : - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - + + Add Peers + Ajouter des pairs - - Python not detected - + + List of peers to add (one per line): + Liste des pairs à ajouter (un par ligne) : + + + + Format: IPv4:port / [IPv6]:port + Format : IPv4:port / [IPv6]:port - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - + + + Tracker authentication + Authentification du tracker - - Symlinks inside alternative UI folder are forbidden. - + + Tracker: + Tracker : - - Exceeded the maximum allowed file size (%1)! - + + Login + Authentification - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - + + Username: + Nom d'utilisateur : - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - + + Password: + Mot de passe : - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - + + Log in + S'authentifier - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - + + Cancel + Annuler - WebUI + confirmDeletionDlg - - Web UI: HTTPS setup successful - + + Deletion confirmation - qBittorrent + Confirmation de la suppression – qBittorrent - - Web UI: HTTPS setup failed, fallback to HTTP - + + Remember choice + Se souvenir du choix - - Web UI: Now listening on IP: %1, port: %2 - + + Also delete the files on the hard disk + Supprimer également les fichiers sur le disque + + + confirmShutdownDlg - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - + + Don't show again + Ne plus afficher + + + + createTorrentDialog + + + Cancel + Annuler + + + + Torrent Creation Tool + Utilitaire de création de torrent + + + + Torrent file creation + Création d'un fichier torrent + + + + Add file + Ajouter un fichier + + + + Add folder + Ajouter un dossier + + + + File or folder to add to the torrent: + Fichier ou dossier à ajouter au torrent : + + + + Tracker URLs: + URL des trackers : + + + + Web seeds urls: + URL des sources web : + + + + Comment: + Commentaire : + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Vous pouvez séparer les niveaux / groupes du tracker par une ligne vide. + + + + Piece size: + Taille des morceaux : + + + + 16 KiB + 16 Kio + + + + 32 KiB + 32 Kio + + + + 64 KiB + 64 Kio + + + + 128 KiB + 128 Kio + + + + 256 KiB + 256 Kio + + + + 512 KiB + 512 Kio + + + + 1 MiB + 1 Mio + + + + 2 MiB + 2 Mio + + + + 4 MiB + 4 Mio + + + + 8 MiB + 8 Mio + + + + 16 MiB + 16 Mio + + + + Auto + Automatique + + + + Private (won't be distributed on DHT network if enabled) + Privé (ne sera pas distribué sur le réseau DHT si activé) + + + + Start seeding after creation + Commencer le partage directement + + + + Ignore share ratio limits for this torrent + Ignorer les limites du ratio de partage pour ce torrent + + + + Create and save... + Créer et sauvegarder… + + + + Progress: + Progression : + + + + downloadFromURL + + + Add torrent links + Ajout de liens vers des torrents + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Un par ligne (les liens HTTP, liens magnet et info-hachages sont supportés) + + + + Download + Télécharger + + + + Cancel + Annuler + + + + Download from urls + Téléchargement depuis des URL + + + + No URL entered + Aucune URL entrée + + + + Please type at least one URL. + Veuillez entrer au moins une URL. + + + + errorDialog + + + Crash info + Information de plantage fsutils - + + + + + Downloads Téléchargements @@ -9749,100 +8744,140 @@ misc - + B bytes Oct - + KiB kibibytes (1024 bytes) Kio - + MiB mebibytes (1024 kibibytes) Mio - + GiB gibibytes (1024 mibibytes) Gio - + TiB tebibytes (1024 gibibytes) Tio - + PiB pebibytes (1024 tebibytes) Pio - + EiB exbibytes (1024 pebibytes) Eio - + + Python not detected + Python non détecté + + + + Python version: %1 + Version de Python : %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1h %2m - + %1d %2h e.g: 2days 10hours %1j %2h - + Unknown Unknown (size) Inconnue - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent va maintenant éteindre l'ordinateur car tous les téléchargements sont terminés. - + < 1m < 1 minute < 1min - + %1m e.g: 10minutes %1min + + + Working + Fonctionne + + + + Updating... + Mise à jour… + + + + Not working + Ne fonctionne pas + + + + Not contacted yet + Pas encore contacté + preview - + Preview selection Sélection du fichier à prévisualiser - + The following files support previewing, please select one of them: Les fichiers suivants prennent en charge la prévisualisation, sélectionnez-en un : + + + Preview + Prévisualiser + + + + Cancel + Annuler + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_gl.ts qbittorrent-3.3.15/src/lang/qbittorrent_gl.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_gl.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_gl.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent Sobre qBittorrent - + About Sobre - + Author Autor - - Current maintainer - Mantedor actual - - - - Greece - Grecia - - - - + + Nationality: Nacionalidade: - - + + + Name: + Nome: + + + + E-mail: Correo-e: - - - Name: - Nome: + + Greece + Grecia - - Original author - Autor orixinal + + Current maintainer + Mantedor actual - - France - Francia + + Original author + Autor orixinal - + Special Thanks Grazas especiais a - + Translators Tradutores - - License - Licenza - - - + Libraries Bibliotecas - + qBittorrent was built with the following libraries: qBittorrent construiuse coas seguintes bibliotecas: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - Un cliente BitTorrent avanzado, programado en C++, baseado en QT toolkit e libtorrent-rasterbar. - - - - Copyright %1 2006-2018 The qBittorrent project - Dereitos de autor ©2006-2018 The qBittorrent project - - - - Home Page: - Páxina web: - - - - Forum: - Foro: + + France + Francia - - Bug Tracker: - Seguimento de fallos: + + License + Licenza @@ -115,57 +90,67 @@ Gardar como - + + Browse... + Explorar... + + + + Set as default save path + Estabelecer como ruta predefinida para gardar + + + Never show again Non mostrar de novo - + Torrent settings Opcións torrent - + Set as default category Estabelecer como categoría predeterminada - + Category: Categoría: - + Start torrent Iniciar o torrent - + Torrent information Información do torrent - + Skip hash check Saltar a comprobación hash - + Size: Tamaño: - + Hash: Hash: - + Comment: Comentario: - + Date: Data: @@ -190,117 +175,89 @@ Automático - - Remember last used save path - Lembrar a última ruta usada para gardar - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog Se está marcado, o ficheiro .torrent non se eliminará a pesar dos axustes na páxina «Descargas» do diálogo de opcións - + Do not delete .torrent file Non eliminar o ficheiro .torrent - - Create subfolder - Crear subcartafol - - - - Download in sequential order - Descargar en orde secuencial - - - - Download first and last pieces first - Descargar primeiro os anacos inicial e final - - - + Normal Normal - + High Alta - + Maximum Máxima - + Do not download Non descargar - - - + + + I/O Error Erro de E/S - + Invalid torrent Torrent incorrecto - - Renaming - Renomeando - - - - - Rename error - Produciuse un erro ao cambiar o nome - - - - The name is empty or contains forbidden characters, please choose a different one. - O nome do ficheiro está baleiro ou contén caracteres prohibidos, escolla un nome diferente. + + + + + Already in download list + Xa está na lista de descargas. - + Not Available This comment is unavailable Non dispoñíbel - + Not Available This date is unavailable Non dispoñíbel - + Not available Non dispoñíbel - + Invalid magnet link Ligazón magnet incorrecta - + The torrent file '%1' does not exist. O ficheiro torrent «%1» non existe. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. Non é posíbel ler do disco o ficheiro torrent «%1». Probabelmente non ten permisos dabondo. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ Erro: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + O torrent xa está na lista de descargas. Non se combinaron os localizadores porque é un torrent privado. + + + + Torrent is already in download list. Trackers were merged. + O torrent xa está na lista de descargas. Mesturáronse os localizadores. + + + + + Cannot add torrent + Non é posíbel engadir o torrent + + + + Cannot add this torrent. Perhaps it is already in adding state. + Non é posíbel engadir este torrent. Quizais xa está noutro estado de engadir. + + + This magnet link was not recognized Non se recoñeceu esta ligazón magnet - + + Magnet link is already in download list. Trackers were merged. + A ligazón magnet xa está na lista de descargas. Mesturáronse os localizadores. + + + + Cannot add this torrent. Perhaps it is already in adding. + Non foi posíbel engadir este torrent. Quizais xa se estea engadindo. + + + Magnet link Ligazón magnet - + Retrieving metadata... Recuperando os metadatos... - + Not Available This size is unavailable. Non dispoñíbel - + Free space on disk: %1 Espazo libre no disco: %1 - + + Choose save path Seleccionar a ruta onde gardar - - - - - - - Torrent is already present - O torrent xa existe - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - O torrent «%1» xa está na lista de transferencias. Non se combinaron os localizadores porque é un torrent privado. - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - O torrent «%1» xa está na lista de transferencias. Combináronse os localizadores. - - - - Torrent is already queued for processing. - O torrent xa está na cola para ser procesado. + + Rename the file + Cambiar o nome do ficheiro - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - A ligazón magnet «%1» xa está na lista de transferencias. Combináronse os localizadores. + + New name: + Nome novo: - - Magnet link is already queued for processing. - A ligazón magnet xa está na cola para ser procesada. + + + The file could not be renamed + Non foi posíbel cambiar o nome do ficheiro - - New name: - Nome novo: + + This file name contains forbidden characters, please choose a different one. + Este nome de ficheiro contén caracteres prohibidos, escolla un nome diferente. - - + + This name is already in use in this folder. Please use a different name. Este nome de ficheiro xa existe neste cartafol. Use un nome diferente. - + The folder could not be renamed Non foi posíbel cambiar o nome do cartafol - + Rename... Cambiar o nome... - + Priority Prioridade - + Invalid metadata Metadatos incorrectos - + Parsing metadata... Analizando os metadatos... - + Metadata retrieval complete Completouse a recuperación dos metadatos - + Download Error Erro de descarga @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Tamaño da caché de escritura no disco + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Portos de saída (mín.) [0: Desactivado] - + Outgoing ports (Max) [0: Disabled] Portos de saída (máx.) [0: Desactivado] - + Recheck torrents on completion Volver comprobar os torrents ao rematar - + Transfer list refresh interval Intervalo de actualización da lista de transferencias - + ms milliseconds ms - + Setting Configuración - + Value Value set for this setting Valor - - - (disabled) - (desactivado) - - - + (auto) (auto) - - min - minutes - min. - - - + All addresses Todos os enderezos - + qBittorrent Section Sección qBittorrent - - + + Open documentation Abrir a documentación - + libtorrent Section Sección libtorrent - - Asynchronous I/O threads - Supbrocesos de E/S asíncronos - - - - Disk cache - Caché do disco - - - + s seconds s - + Disk cache expiry interval Intervalo de caducidade da caché do disco - + Enable OS cache Activar a caché do SO - - Guided read cache - Caché de lectura guiada - - - - Coalesce reads & writes - Fusionar lecturas e escrituras - - - - Send upload piece suggestions - Enviar suxestións de anacos para subida - - - - - KiB - KiB - - - - Send buffer watermark - Nivel do búfer de envío - - - - Send buffer low watermark - Nivel baixo do búfer de envío - - - - Send buffer watermark factor - Factor do nivel do búfer de envío - - - - Prefer TCP - Preferir TCP - - - - Peer proportional (throttles TCP) - Par proporcional (compensa a velocidade do TCP) - - - - Allow multiple connections from the same IP address - Permitir múltiples conexións desde a mesma IP + + m + minutes + m - + Resolve peer countries (GeoIP) Mostrar os países dos pares (Geoip) - + Resolve peer host names Mostrar os servidores dos pares - + Strict super seeding Super sementeira estrita - + Network Interface (requires restart) Interface de rede (necesita reiniciar) - + Optional IP Address to bind to (requires restart) Enderezo IP opcional ao que ligar (require reiniciar) - + Listen on IPv6 address (requires restart) Escoitar no enderezo IPv6 (precisa reiniciar) - + Display notifications Mostrar as notificacións - + Display notifications for added torrents Mostrar as notificacións dos torrents engadidos - + Download tracker's favicon Descargar iconas dos localizadores - - Save path history length - Gardar o tamaño do historial de rutas - - - - Fixed slots - Slots fixos - - - - Upload rate based - Baseado na velocidade de envío - - - - Upload slots behavior - Comportamento dos slots de envío - - - - Round-robin - Round-robin - - - - Fastest upload - Envío máis rápido - - - - Anti-leech - Anti-samesugas - - - - Upload choking algorithm - Algoritmo de rexeitamento de envíos - - - + Confirm torrent recheck Confirmar nova comprobación do torrent - - Confirm removal of all tags - Confirmar a eliminación de todas as etiquetas - - - - Always announce to all trackers in a tier - Anunciar sempre a todos os localizadores dun nivel + Exchange trackers with other peers + Intercambio de localizadores con outros pares - - Always announce to all tiers - Anunciar sempre a todos os niveis + + Always announce to all trackers + Anunciar sempre a todos os localizadores - + Any interface i.e. Any network interface Calquera interface - + Save resume data interval How often the fastresume file is saved. Gardar o intervalo de datos para continuar - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - Algoritmo modo mixto %1-TCP - - - + Maximum number of half-open connections [0: Unlimited] Número máximo de conexións semi-abertas [0: Ilimitado] - + IP Address to report to trackers (requires restart) Enderezo IP que enviar aos localizadores (necesita reiniciar) - + Enable embedded tracker Activar o localizador integrado - + Embedded tracker port Porto do localizador integrado - + Check for software updates Comprobar se hai actualizacións - + Use system icon theme Usar o tema das iconas do sistema @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started Iniciouse o qBittorrent %1 - + Torrent: %1, running external program, command: %2 Torrent: %1, executando un programa externo, orde: %2 - - Torrent name: %1 - Nome do torrent: %1 - - - - Torrent size: %1 - Tamaño do torrent: %1 - - - - Save path: %1 - Ruta onde gardar: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - O torrent descargouse en %1. - - - - Thank you for using qBittorrent. - Grazas por usar o qBittorrent. - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] rematou a descarga de %1 + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrent: %1, executou unha orde moi longa para un programa externo (lonxitude > %2), fallou a execución. - + Torrent: %1, sending mail notification Torrent: %1, enviando notificación por correo electrónico - + Information Información - - To control qBittorrent, access the Web UI at %1 - Para controlar o qBittorrent acceda á interface web en %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + Para controlar o qBittorrent acceda á interface web en http://localhost:%1 - + The Web UI administrator user name is: %1 O usuario do administrador da interface web é: %1 - + The Web UI administrator password is still the default one: %1 O contrasinal do administrador da interface web é aínda o predefinido: %1 - + This is a security risk, please consider changing your password from program preferences. Isto é un risco de seguranza, debería cambiar o seu contrasinal nas preferencias do programa. - + Saving torrent progress... Gardando o progreso do torrent... - - - Portable mode and explicit profile directory options are mutually exclusive - As opcións de modo Portátil e o Cartafol do perfil explícito exclúense mutuamente - - - - Portable mode implies relative fastresume - O modo portátil implica resumos rápidos relativos - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - Produciuse un fallo no inicio de sesión da WebAPI. Razón: o IP foi bloqueado, IP: %1, nome do usuario: %2 - - - - Your IP address has been banned after too many failed authentication attempts. - A súa IP foi bloqueada despois de varios fallos de autenticación. - - - - WebAPI login success. IP: %1 - A sesión iniciouse correctamente na WebAPI. IP: %1 - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - Produciuse un fallo no inicio de sesión da WebAPI. Razón: credenciais incorrectas, número de intentos: %1, IP: %2, nome do usuario: %3 - AutomatedRssDownloader - + Save to: Gardar en: @@ -861,837 +658,700 @@ Xestor de descargas RSS - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - A descarga automática de torrents por RSS está desactivada. Pode activala nos axustes do aplicativo. + + Enable Automated RSS Downloader + Activar o xestor de descargas RSS automático - + Download Rules Regras de descarga - + Rule Definition Definición da regra - + Use Regular Expressions Usar expresións regulares - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - O filtro intelixente de episodios comprobará o número do episodio para evitar descargalo dúas veces. -Compatíbel cos formatos: S01E01, 1x1, 2017.01.01 e 01.01.2017 (os formatos da data tamén aceptan «-» como separador) - - - - Use Smart Episode Filter - Usar filtro intelixente de episodios - - - + Must Contain: Debe conter: - + Must Not Contain: Non debe conter: - + Episode Filter: Filtro de episodios: - + Assign Category: Asignar categoría: - + Save to a Different Directory Gardar nun cartafol diferente - + Ignore Subsequent Matches for (0 to Disable) ... X days Ignorar resultados seguintes para (0 para desactivar) - + Disabled - Desactivado + Desactivado - + days días - + Add Paused: Engadir como detidos: - + Use global settings Usar os axustes globais - + Always Sempre - + Never Nunca - + Apply Rule to Feeds: Aplicar a regra ás fontes: - + Matching RSS Articles Artigos RSS coincidentes - + &Import... &Importar... - + &Export... &Exportar... - + Matches articles based on episode filter. Resultados co filtro de episodios. - + Example: Exemplo: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match son os episodios 2, 5 e 8 até o 15, e do 30 en adiante da primeira tempada - + Episode filter rules: Regras do filtro de episodios: - + Season number is a mandatory non-zero value O número da tempada non pode ser cero - + Episode number is a mandatory non-zero value + O número de episodio non pode ser cero + + + Filter must end with semicolon O filtro debe rematar con punto e coma - + Three range types for episodes are supported: Acéptanse tres tipos de intervalo para os episodios: - + Single number: <b>1x25;</b> matches episode 25 of season one Número simple: <b>1x25;</b> é o episodio 25 da primeira tempada - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Intervalo normal: <b>1x25-40;</b> son os episodios 25 ao 40 da primeira tempada - - Episode number is a mandatory positive value - O número de episodio debe ser un número positivo - - - - Rules - Regras + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Intervalo infinito: <b>1x25-;</b> son os episodios do 25 en diante da primeira tempada - - Rules (legacy) - Regras (herdadas) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Intervalo infinito: <b>1x25-;</b> son os episodios do 25 en diante da primeira tempada e todos os episodios das tempadas seguintes + - + Last Match: %1 days ago Último resultado: hai %1 días - + Last Match: Unknown Último resultado: descoñecido - + New rule name Nome da regra nova - + Please type the name of the new download rule. Escriba o nome da regra de descarga nova. - - + + Rule name conflict Conflito co nome da regra - - + + A rule with this name already exists, please choose another name. Xa existe unha regra con este nome. Escolla un diferente. - + Are you sure you want to remove the download rule named '%1'? - Confirma a eliminación da regra de descarga chamada %1? + Está seguro que desexa eliminar a regra de descarga chamada %1? - + Are you sure you want to remove the selected download rules? - Confirma a eliminación das regras de descarga seleccionadas? + Está seguro que desexa eliminar as regras de descarga seleccionadas? - + Rule deletion confirmation Confirmación de eliminación da regra - + Destination directory Cartafol de destino - + Invalid action - Acción non válida + A acción non é válida - + The list is empty, there is nothing to export. A lista está baleira, non hai nada que exportar. - - Export RSS rules - Exportar regras do RSS + + Where would you like to save the list? + Onde desexa gardar a lista? - - + + Rules list (*.rssrules) + Lista de regras (*.rssrules) + + + I/O Error Erro de E/S - - Failed to create the destination file. Reason: %1 - Produciuse un fallo creando o ficheiro de destino. Razón: %1 + + Failed to create the destination file + Produciuse un fallo ao crear o cartafol de destino - - Import RSS rules - Importar regras do RSS + + Please point to the RSS download rules file + Indique o ficheiro de regras de descarga RSS - - Failed to open the file. Reason: %1 - Produciuse un fallo abrindo o ficheiro. Razón: %1 + + Rules list + Lista de regras - + Import Error Erro de importación - - Failed to import the selected rules file. Reason: %1 - Produciuse un fallo ao importar o ficheiro de regras seleccionado. Razón: %1 + + Failed to import the selected rules file + Produciuse un fallo ao importar o ficheiro de regras seleccionado - + Add new rule... Engadir unha regra nova... - + Delete rule Eliminar a regra - + Rename rule... Cambiar o nome da regra... - + Delete selected rules Eliminar as regras seleccionadas - - Clear downloaded episodes... - Limpar episodios descargados... - - - + Rule renaming Cambio do nome da regra - + Please type the new rule name Escriba o nome da regra nova - - Clear downloaded episodes - Limpar episodios descargados - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - Confirma o borrado da lista de episodios descargados pola regra seleccionada? - - - - Regex mode: use Perl-compatible regular expressions - Modo Regex: usar expresións regulares compatíbeis con Perl - - - - - Position %1: %2 - Posición %1: %2 + + Regex mode: use Perl-like regular expressions + Modo Regex: usa Perl como expresións regulares - + Wildcard mode: you can use - Modo comodín: pode usar + - + ? to match any single character - ? para substituír calquera carácter + - + * to match zero or more of any characters - * para substituír cero ou máis caracteres calquera + - + Whitespaces count as AND operators (all words, any order) - Os espazos en branco contan como operadores AND (todas as palabras, en calquera orde) + - + | is used as OR operator - | úsase como operador OR + - + If word order is important use * instead of whitespace. - Se a orde das palabras importa, use * no canto dun espazo en branco. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Unha expresión cunha condición baleira %1 (p.e.: %2) + - + will match all articles. - incluirá todos os artigos. + - + will exclude all articles. - excluirá todos os artigos. - - - - BanListOptionsDialog - - - List of banned IP addresses - Lista de enderezos IP bloqueados - - - - Ban IP - Bloquear IP - - - - Delete - Eliminar - - - - - Warning - Aviso + - - The entered IP address is invalid. - O enderezo IP introducido no é correcto. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Modo comodín: pode usar<ul><li>? para substituír calquera caracter</li><li>* para substituír o cero ou máis dun caracter</li><li>Espazos en branco úsanse como operador AND</li></ul> - - The entered IP is already banned. - A IP introducida xa está bloqueada. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Modo comodín: pode usar<ul><li>? para substituír calquera caracter</li><li>* para substituír o cero ou máis dun caracter</li><li>| úsase como operador OR</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support É necesario reiniciar para cambiar o soporte PeX - - Could not get GUID of configured network interface. Binding to IP %1 - Non foi posíbel obter o GUID da interface de rede configurada. Ligando á IP %1 - - - + Embedded Tracker [ON] Localizador integrado [ACTIVADO] - + Failed to start the embedded tracker! Produciuse un fallo ao iniciar o localizador integrado! - + Embedded Tracker [OFF] Localizador integrado [APAGADO] - + + '%1' reached the maximum ratio you set. Removing... + %1 alcanzou a taxa máxima estabelecida. Eliminando... + + + + '%1' reached the maximum ratio you set. Pausing... + %1 alcanzou a taxa máxima estabelecida. Detendo... + + + System network status changed to %1 e.g: System network status changed to ONLINE O estado da rede do sistema cambiou a %1 - + ONLINE EN LIÑA - + OFFLINE FÓRA DE LIÑA - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding A configuración da rede de %1 cambiou, actualizando as vinculacións da sesión - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. O enderezo %1 da rede configurada no é correcto. - - + Encryption support [%1] Compatibilidade co cifrado [%1] - - + FORCED FORZADO - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 non é un enderezo IP correcto e foi rexeitado cando se lle aplicaba a lista de enderezos bloqueados. - - - - + Anonymous mode [%1] Modo anónimo [%1] - + Unable to decode '%1' torrent file. Non foi posíbel decodificar o ficheiro torrent %1. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Descarga recursiva do ficheiro %1 integrado no torrent %2 - + Queue positions were corrected in %1 resume files - Modificáronse as posicións na cola de %1 ficheiros de continuación + - + Couldn't save '%1.torrent' Non foi posíbel gardar %1.torrent - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - «%1» eliminouse da lista de transferencias. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - «%1» eliminouse da lista de transferencias e do disco duro. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - «%1» eliminouse da lista de transferencias pero non foi posíbel eliminar os ficheiros. Erro: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. porque o %1 está desactivado. - + because %1 is disabled. this peer was blocked because TCP is disabled. porque o %1 está desactivado. - + URL seed lookup failed for URL: '%1', message: %2 Fallou a busca da semente na URL: %1, mensaxe: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent fallou ao escoitar na interface %1 porto: %2/%3. Razón: %4 - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' eliminouse da lista de transferencias e do disco duro. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' eliminouse da lista de transferencias. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Descargando '%1', espere... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent está tentando escoitar en todos os portos da interface: %1 - + The network interface defined is invalid: %1 A interface indicada para a rede non é válida: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent está tentando escoitar na interface %1 porto: %2 - - Peer ID: - ID do par: - - - - HTTP User-Agent is '%1' - O axente do usuario HTTP é %1 - - - - + DHT support [%1] Compatibilidade con DHT [%1] - - - - - - - - - + + + + ON ACTIVADO - - - - - - - - - + + + + OFF DESACTIVADO - - + Local Peer Discovery support [%1] Compatibilidade coa busca de pares locais LPH [%1] - - PeX support [%1] - Compatibilidade PeX [%1] - - - - '%1' reached the maximum ratio you set. Removed. - «%1» alcanzou a taxa máxima estabelecida. Retirado. + Restart is required to toggle Tracker Exchange support + É necesario reiniciar para cambiar a compatibilidade co intercambio de localizadores - - '%1' reached the maximum ratio you set. Paused. - «%1» alcanzou a taxa máxima estabelecida. Detido. - - - - '%1' reached the maximum seeding time you set. Removed. - «%1» alcanzou o tempo de semente máximo estabelecido. Retirado. - - - - '%1' reached the maximum seeding time you set. Paused. - «%1» alcanzou o tempo de semente máximo estabelecido. Detido. - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent non atopou un enderezo local %1 no que escoitar - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent fallou ao escoitar en cada porto da interface: %1. Razón: %2. - + Tracker '%1' was added to torrent '%2' Engadiuse o localizador «%1» ao torrent «%2» - + Tracker '%1' was deleted from torrent '%2' Eliminouse o localizador «%1» do torrent «%2» - + URL seed '%1' was added to torrent '%2' A semente da URL «%1» engadiuse ao torrent «%2» - + URL seed '%1' was removed from torrent '%2' A semente da URL «%1» eliminouse do torrent «%2» - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Non é posíbel continuar o torrent «%1». - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Analizouse correctamente o filtro IP indicado: aplicáronse %1 regras. - + Error: Failed to parse the provided IP filter. Erro: produciuse un fallo ao analizar o filtro IP indicado. - - '%1' restored. - 'torrent name' restored. - «%1» foi restabelecido. - - - + Couldn't add torrent. Reason: %1 Non foi posíbel engadir o torrent. Razón: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + Retomouse '%1' (continuación rápida) + + + '%1' added to download list. 'torrent name' was added to download list. Engadiuse %1 á lista de descargas. - + An I/O error occurred, '%1' paused. %2 Produciuse un erro de E/S, '%1' pausado. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: produciuse un fallo no mapeado dos portos, mensaxe: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: o mapeado dos portos foi correcto, mensaxe: %1 - + due to IP filter. this peer was blocked due to ip filter. debido ao filtro IP. - + due to port filter. this peer was blocked due to port filter. debido ao filtro de portos. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. debido ás restricións do modo mixto i2P. - + because it has a low port. this peer was blocked because it has a low port. porque ten un porto baixo. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent escoita correctamente no porto da interface %1 porto: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 IP externa: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - fallou a creación dun novo ficheiro torrent - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - Descargar primeiro os anacos inicial e final: %1, torrent: «%2» - - - - On - Activado - - - - Off - Desactivado - - - - Successfully moved torrent: %1. New path: %2 - O torrent foi movido correctamente %1. Nova ruta: %2 - - - + Could not move torrent: '%1'. Reason: %2 Non foi posíbel mover o torrent: «%1». Razón: %2 - + File sizes mismatch for torrent '%1', pausing it. Os tamaños dos ficheiros non coinciden co torrent %1 , deténdoo. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - Os datos para a continuación rápida do torrent «%1» foron rexeitados. Razón: %2, Comprobando de novo... + Os datos para a continuación rápida do torrent %1 foron rexeitados. Razón: %2, Comprobando de novo... CategoryFilterModel - + Categories - Categorías + Categorías - + All - Todo + Todos - + Uncategorized - Sen categoría + @@ -1699,42 +1359,147 @@ Add category... - Engadir categoría... + Engadir categoría... Add subcategory... - Engadir subcategoría... + - Edit category... - Editar categoría... + Remove category + Eliminar categoría + + + + Remove unused categories + Eliminar as categorías sen usar + + + + Resume torrents + Continuar os torrents + + + + Pause torrents + Deter os torrents + + + + Delete torrents + Eliminar os torrents + + + + New Category + Nova categoría + + + + Category: + Categoría: + + + + Invalid category name + Nome incorrecto para categoría + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + O nome da categoría non debe conter «\». +O nome da categoría non debe comezar/rematar con «/» +O nome da categoría non debe conter a secuencia «//». + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Todos (0) + + + Uncategorized (0) + Sen categoría (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Sen categoría (%1) + + + Add category... + Engadir categoría... - Remove category - Eliminar categoría + Eliminar categoría - Remove unused categories - Eliminar as categorías sen usar + Eliminar as categorías sen usar - Resume torrents - Continuar os torrents + Continuar os torrents - Pause torrents - Deter os torrents + Deter os torrents - Delete torrents - Eliminar os torrents + Eliminar os torrents + + + New Category + Nova categoría + + + Category: + Categoría: + + + Invalid category name + Nome incorrecto para categoría + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + O nome da categoría non debe conter «\». +O nome da categoría non debe comezar/rematar con «/» +O nome da categoría non debe conter a secuencia «//». + + + All (%1) + this is for the category filter + Todos (%1) @@ -1774,106 +1539,58 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Confirmación da eliminación - - - - Remember choice - Lembrar a elección - - - - Also delete the files on the hard disk - Eliminar tamén os ficheiros do disco duro - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - Confirma a eliminación de «%1» da lista de transferencias? + Está seguro que desexa eliminar «%1» da lista de transferencias? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? Está seguro que desexa eliminar estes %1 torrents da lista de transferencias? - DownloadFromURLDialog - - - Download from URLs - Descargar desde URL - - - - Add torrent links - Engadir ligazóns torrent - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - Unha ligazón por liña (acepta ligazóns HTTP, magnet e info-hashes) - - - - Download - Descargar - - - - No URL entered - Non se introduciu ningún URL - - - - Please type at least one URL. - Escriba polo menos un URL. - - - DownloadedPiecesBar - + White: Missing pieces Branco: faltan anacos - + Green: Partial pieces Verde: anacos parciais - + Blue: Completed pieces Azul: anacos completos - ExecutionLogWidget + ExecutionLog - + General Xeral - + Blocked IPs IPs bloqueadas - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked <font color='red'>%1</font> foi bloqueado %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned <font color='red'>%1</font> foi bloqueado @@ -1882,112 +1599,41 @@ FeedListWidget - + RSS feeds Fontes RSS - - - Unread (%1) - Sen ler (%1) + + Unread + Sen ler FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. + + An error occured while trying to open the log file. Logging to file is disabled. Produciuse un erro de apertura do ficheiro do rexistro. O rexistro nun ficheiro está desactivado. - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - &Explorar... - - - - Choose a file - Caption for file open/save dialog - Seleccionar un ficheiro - - - - Choose a folder - Caption for directory open dialog - Seleccionar un cartafol - - - - Any file - Calquera ficheiro - - - FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. + + + + I/O Error: Could not open ip filter file in read mode. Erro de E/S: Non foi posíbel abrir o ficheiro de filtros de ip en modo lectura. - - - - IP filter line %1 is malformed. - A liña co filtro de IP %1 está mal construída. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - A liña %1 co filtro de IP está mal construída. A IP de inicio de rango está mal construída. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - A liña %1 co filtro de IP está mal construída. A IP de remate de rango está mal construída. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - A liña %1 co filtro de IP está mal construída. Unha IP é IPv4 e a outra é IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - Produciuse unha excepción para o filtro de IP na liña %1. A excepción é: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - Producíronse %1 erros adicionais na análise do filtro de IP. - - - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. Erro de análise: o ficheiro de filtros non é un ficheiro Peer Guardian P2B correcto. @@ -1995,396 +1641,472 @@ GeoIPDatabase - - + + Unsupported database file size. Tamaño do ficheiro da base de datos non aceptado - + Metadata error: '%1' entry not found. Erro nos metadatos: non se atopou a entrada «%1». - + Metadata error: '%1' entry has invalid type. Erro nos metadatos: a entrada «%1» ten un tipo incorrecto. - + Unsupported database version: %1.%2 Versión da base de datos non aceptada: %1.%2 - + Unsupported IP version: %1 Versión de IP non aceptada: %1 - + Unsupported record size: %1 Tamaño de rexistro no aceptado: %1 - + Invalid database type: %1 Tipo de base de datos incorrecta: %1 - + Database corrupted: no data section found. Base de datos corrompida: non se atopou a sección dos datos. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - O tamaño da petición http excede o límite, péchase o socket. Límite: %ld, IP: %s + + File + Ficheiro - - Bad Http request, closing socket. IP: %s - Mala petición Http, péchase o socket. IP: %s + + Edit + Editar - - - HttpServer - + + Help + Axuda + + + Exit qBittorrent Saír do qBittorrent - + Only one link per line Só unha ligazón por liña - + + Download + Descargar + + + Global upload rate limit must be greater than 0 or disabled. O límite da velocidade global de envío debe ser superior a 0 ou non funcionará. - + Global download rate limit must be greater than 0 or disabled. O límite da velocidade global de descarga debe ser ser superior a 0 ou non funcionará. - + Alternative upload rate limit must be greater than 0 or disabled. O límite alternativo da velocidade de envío debe ser superior a 0 ou non funcionará. - + Alternative download rate limit must be greater than 0 or disabled. O límite alternativo da velocidade de descarga debe ser superior a 0 ou non funcionará. - + Maximum active downloads must be greater than -1. As descargas activas máximas deben ser superiores a -1. - + Maximum active uploads must be greater than -1. Os envíos activos máximos deben ser superiores a -1. - + Maximum active torrents must be greater than -1. Os torrents activos máximos deben ser superiores a -1. - + Maximum number of connections limit must be greater than 0 or disabled. O límite do número máximo de conexións ten que ser superior a 0 ou debe desactivalo. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. O límite do número máximo de conexións por torrent ten que ser superior a 0 ou debe desactivalo. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. O límite do número máximo de slots de envío por torrent ten que ser superior a 0 ou debe desactivalo. - + Unable to save program preferences, qBittorrent is probably unreachable. Non foi posíbel gardar as preferencias do programa, probabelmente o qBittorrent estea inaccesíbel. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent en Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - Nome de categoría incorrecto: -Non use caracteres especiais no nome da categoría. - - - - Unknown - Descoñecido - - - - Hard Disk - Disco ríxido - - - - Share ratio limit must be between 0 and 9998. - O límite da taxa de compartición debe estar entre 0 e 9998. - - - - Seeding time limit must be between 0 and 525600 minutes. - O límite do tempo de sementeira debe estar entre 0 e 525600 minutos. + + Language + Idioma - + The port used for incoming connections must be between 1 and 65535. O porto usado para as conexións entrantes debe estar entre 1 e 65535. - + The port used for the Web UI must be between 1 and 65535. O porto usado para a interface web debe estar entre 1 e 65535. - + Unable to log in, qBittorrent is probably unreachable. Non é posíbel iniciar sesión. Probabelmente o qBittorrent non está accesíbel. - + Invalid Username or Password. O usuario ou o contrasinal son incorrectos. - - Username - Nome do usuario - - - + Password Contrasinal - + Login Iniciar sesión - + + Upload Failed! + Fallou o envío. + + + Original authors Autores orixinais - + + Upload limit: + Límite do envío: + + + + Download limit: + Límite da descarga: + + + Apply Aplicar - + Add Engadir - + + Category: + Categoría: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Enviar torrents - + + All + Todos + + + + Downloading + Descargando + + + + Seeding + Sementando + + + + Completed + Completado + + + + Resumed + Continuados + + + + Paused + Detido + + + + Active + Activos + + + + Inactive + Inactivos + + + Save files to location: Gardar os ficheiros na localización: - + Cookie: Cookie: - + Type folder here Escribir o cartafol aquí - + + Run an external program on torrent completion + Executar un programa externo ao rematar o torrent + + + + Enable bandwidth management (uTP) + Activar a xestión do largo de banda (uTP) + + + + Apply rate limit to uTP connections + Aplicar o límite de velocidade ás conexións uTP + + + + Alternative Global Rate Limits + Límites alternativos globais de velocidade + + + More information Máis información - + Information about certificates Información dos certificados - + Save Files to Gardar ficheiros en - - Set location - Estabelecer a localización - - - - Limit upload rate - Límite da velocidade de envío + + Watch Folder + Vixiar cartafol - - Limit download rate - Límite da velocidade de descarga + + Default Folder + Cartafol predeterminado - - Rename torrent - Renomear torrent + + from + from time1 to time2 + de - - Unable to create category - + + to + from time1 to time2 + a - + Other... Save Files to: Watch Folder / Default Folder / Other... Outra... - + + Every day + Schedule the use of alternative rate limits on ... + Todos os días + + + + Week days + Schedule the use of alternative rate limits on ... + Días de entresemana + + + + Week ends + Schedule the use of alternative rate limits on ... + Fins de semana + + + Monday Schedule the use of alternative rate limits on ... Luns - + Tuesday Schedule the use of alternative rate limits on ... Martes - + Wednesday Schedule the use of alternative rate limits on ... Mércores - + Thursday Schedule the use of alternative rate limits on ... Xoves - + Friday Schedule the use of alternative rate limits on ... Venres - + Saturday Schedule the use of alternative rate limits on ... Sábado - + Sunday Schedule the use of alternative rate limits on ... Domingo - + + Downloaded + Is the file downloaded or not? + Descargado + + + Logout Saír da sesión - + + Download from URLs + Descargar desde URL + + + Download Torrents from their URLs or Magnet links Descargar os torrents desde as URL ou ligazóns Magnet - + Upload local torrent Enviar torrent local - + Are you sure you want to delete the selected torrents from the transfer list? - Confirma a eliminación dos torrents seleccionados da lista de transferencias? + Está seguro que desexa eliminar os torrents seleccionados da lista de transferencias? - + Save Gardar - + qBittorrent client is not reachable O cliente qBittorrent non está accesíbel - - qBittorrent has been shutdown. - O qBittorrent foi pechado. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Lista de subredes con IP incluídas na lista branca + + HTTP Server + Servidor HTTP - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Exemplo: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Os seguintes parámetros son compatíbeis: - - Add subnet - Engadir subrede + + Torrent path + Ruta ao torrent - - Delete - Eliminar + + Torrent name + Nome do torrent - - Error - Erro + + qBittorrent has been shutdown. + O qBittorrent foi pechado. + + + LineEdit - - The entered subnet is invalid. - A subrede introducida non é válida. + + Clear the text + Borrar o texto LogListWidget - + Copy Copiar - + Clear Limpar @@ -2417,550 +2139,492 @@ Ao rematar as &descargas - + &View &Ver - + &Options... &Opcións... - + &Resume Continua&r - + Torrent &Creator &Creador de torrents - + Set Upload Limit... Estabelecer o límite de envío... - + Set Download Limit... Estabelecer o límite de descarga... - + Set Global Download Limit... Estabelecer o límite global de descarga... - + Set Global Upload Limit... Estabelecer o límite global de envío... - + Minimum Priority Prioridade mínima - + Top Priority Prioridade máxima - + Decrease Priority Disminuír a prioridade - + Increase Priority Aumentar a prioridade - - + + Alternative Speed Limits Límites alternativos de velocidade - + &Top Toolbar Barra &superior - + Display Top Toolbar Mostrar a barra superior - - Status &Bar - &Barra de estado - - - + S&peed in Title Bar &Velocidade na barra do título - + Show Transfer Speed in Title Bar Mostrar a velocidade de transferencia na barra do título - + &RSS Reader Lector &RSS - + Search &Engine - &Buscador + Motor de &busca - + L&ock qBittorrent Bl&oquear o qBittorrent - + Do&nate! D&oar! - - Close Window - Pechar xanela - - - + R&esume All Co&ntinuar todo - + Manage Cookies... Xestión das cookies... - + Manage stored network cookies Xestionar as cookies de rede gardadas - + Normal Messages Mensaxes ordinarias - + Information Messages Mensaxes informativas - + Warning Messages Mensaxes de aviso - + Critical Messages Mensaxes críticas - + &Log &Rexistro - + &Exit qBittorrent Saír do qBittorr&ent - + &Suspend System &Suspender o sistema - + &Hibernate System &Hibernar o sistema - + S&hutdown System Pe&char o sistema - + &Disabled &Desactivado - + &Statistics E&stadísticas - + Check for Updates Buscar actualizacións - + Check for Program Updates Buscar actualizacións do programa - + &About &Sobre - + &Pause &Deter - + &Delete &Borrar - + P&ause All P&ausar todo - + &Add Torrent File... Eng&adir un ficheiro torrent... - + Open Abrir - + E&xit &Saír - + Open URL Abrir URL - + &Documentation &Documentación - + Lock Bloquear - - - + + + Show Mostrar - + Check for program updates Buscar actualizacións do programa - + Add Torrent &Link... Engadir &ligazón torrent... - + If you like qBittorrent, please donate! Se lle gusta o qBittorrent, por favor faga unha doazón! - - + Execution Log Rexistro de execución - + Clear the password Limpar o contrasinal - + Filter torrent list... Filtrar a lista de torrents... - + &Set Password E&stabelecer o contrasinal - - Preferences - Preferencias - - - + &Clear Password &Limpar o contrasinal - + Transfers Transferencias - - - qBittorrent is minimized to tray - O qBittorrent está minimizado na bandexa - - - - - - This behavior can be changed in the settings. You won't be reminded again. - Pode cambiar este comportamento nos axustes. Non será avisado de novo. - - - + Torrent file association Asociación cos ficheiros torrent - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent non é o aplicativo predefinido para abrir os ficheiros torrent nin as ligazóns Magnet Desexa asociar o qBittorrent aos ficheiros torrent e ás ligazóns Magnet? - + Icons Only Só iconas - + Text Only Só texto - + Text Alongside Icons Texto e iconas - + Text Under Icons Texto debaixo das iconas - + Follow System Style Seguir o estilo do sistema - - - + + + UI lock password Contrasinal de bloqueo da interface - - - + + + Please type the UI lock password: Escriba un contrasinal para bloquear a interface: - + The password should contain at least 3 characters O contrasinal debe conter cando menos 3 caracteres - + Password update Actualizar o contrasinal - + The UI lock password has been successfully updated O contrasinal de bloqueo da interface actualizouse correctamente - + Are you sure you want to clear the password? - Confirma o borrado do contrasinal? + Está seguro de limpar o contrasinal? - - Use regular expressions - Usar expresións regulares - - - + Search Buscar - + Transfers (%1) Transferencias (%1) - + Error Erro - + Failed to add torrent: %1 Produciuse un fallo ao engadir o torrent: %1 - + Torrent added Engadiuse o torrent - + '%1' was added. e.g: xxx.avi was added. Engadiuse «%1». - + Download completion FInalización da descarga - + I/O Error i.e: Input/Output Error Erro de E/S - + Recursive download confirmation Confirmación de descarga recursiva - + Yes Si - + No Non - + Never Nunca - + Global Upload Speed Limit Límite global de velocidade de envío - + Global Download Speed Limit Límite global de velocidade de descarga - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - O qBittorrent foi actualizado e necesita reiniciarse para que os cambios sexan efectivos. - - - - qBittorrent is closed to tray - O qBittorrent está pechado na bandexa - - - - Some files are currently transferring. - Neste momento estanse transferindo algúns ficheiros. - - - - Are you sure you want to quit qBittorrent? - Confirma que desexa saír do qBittorrent? - - - + &No &Non - + &Yes &Si - + &Always Yes &Sempre si - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - Non foi posíbel determinar a súa versión de Python. Desactivouse o motor de busca. - - - + Old Python Interpreter Intérprete antigo de Python - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. A súa versión de Python (%1) non está actualizada. Anove á última versión para que os motores de busca funcionen. Requirimento mínimo: 2.7.0/3.3.0. - + qBittorrent Update Available Hai dipoñíbel unha actualización do qBittorrent - + + A new version is available. +Do you want to download %1? + Hai dispoñíbel unha nova versión. +Desexa descargar %1? + + + Already Using the Latest qBittorrent Version Xa usa a última versión do qBittorrent - + Undetermined Python version Versión indeterminada de Python - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. Finalizou a descarga de %1. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2969,158 +2633,154 @@ Razón: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? O torrent %1 contén ficheiros torrent, desexa continuar coa descarga? - + Couldn't download file at URL '%1', reason: %2. Non foi posíbel descargar o ficheiro desde a URL: %1, razón: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin Atopouse Python en %1: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + Non foi posíbel determinar a súa versión de Python (%1). Desactivouse o motor de busca. + + + + Missing Python Interpreter Falta o intérprete de Python - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Precísase Python para usar o motor de busca pero non parece que estea instalado. Desexa instalalo agora? - + Python is required to use the search engine but it does not seem to be installed. Precísase Python para usar o motor de busca pero non parece que estea instalado. - - A new version is available. - Hai dispoñíbel unha nova versión. - - - - Do you want to download %1? - Desexa descargar %1? - - - - Open changelog... - Abrir o rexistro de cambios... - - - + No updates available. You are already using the latest version. Non hai actualizacións dispoñíbeis. Xa usa a última versión. - + &Check for Updates Buscar a&ctualizacións - + Checking for Updates... Buscando actualizacións... - + Already checking for program updates in the background Xa se están buscando actualizacións do programa en segundo plano - + Python found in '%1' Atopouse Python en %1 - + Download error Erro de descarga - + Python setup could not be downloaded, reason: %1. Please install it manually. Non foi posíbel descargar a configuración de Python, razón:%1. Instálea manualmente. - - + + Invalid password Contrasinal incorrecto - - - + + RSS (%1) RSS (%1) - + URL download error Erro na descarga desde a URL - + The password is invalid O contrasinal é incorrecto - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Vel. de descarga: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Vel. de envío: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [D: %1, E: %2] qBittorrent %3 - + Hide Ocultar - + Exiting qBittorrent Saíndo do qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Estanse transferindo algúns ficheiros. +Está seguro que desexa saír do qBittorrent? + + + Open Torrent Files Abrir os ficheiros torrent - + Torrent Files Ficheiros torrent - + Options were saved successfully. Os axustes gardáronse correctamente. @@ -3128,52 +2788,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. O DNS dinámico actualizouse correctamente. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Erro de DNS dinámico: o servizo non está dispoñíbel temporalmente, intentarase de novo dentro de 30 minutos. - + Dynamic DNS error: hostname supplied does not exist under specified account. Erro de DNS dinámico: o nome do servidor indicado non existe nesta conta específica. - + Dynamic DNS error: Invalid username/password. Erro de DNS dinámico: nome do usuario/contrasinal incorrectos. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Erro de DNS dinámico: o qBittorrent está na lista negra deste servizo, por favor informe deste erro en http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Erro de DNS dinámico: o servizo devolveu %1 , por favor informe deste erro en http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Erro de DNS dinámico: o nome do usuario foi bloqueado por un abuso. - + Dynamic DNS error: supplied domain name is invalid. Erro de DNS dinámico: o nome do dominio indicado non é correcto. - + Dynamic DNS error: supplied username is too short. Erro de DNS dinámico: o nome do dominio indicado é curto de máis. - + Dynamic DNS error: supplied password is too short. Erro de DNS dinámico: o contrasinal indicado é curto de máis. @@ -3181,1413 +2841,1303 @@ Net::DownloadHandler - + I/O Error Erro de E/S - + The file size is %1. It exceeds the download limit of %2. O tamaño do ficheiro é %1. Supera o límite de descarga de %2. - + Unexpected redirect to magnet URI. Redireccionamento inesperado a un URI magnet. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - Non se encontrou o nome do servidor remoto (nome incorrecto) + + + GeoIP database loaded. Type: %1. Build time: %2. + Cargouse a base de datos de GeoIP. TIpo: %1. Tempo de construción: %2. - - The operation was canceled - Cancelouse a operación + + + Couldn't load GeoIP database. Reason: %1 + Non foi posíbel cargar a base de datos de GeoIP. Razón: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - O servidor remoto pechou a conexión prematuramente, antes de que se recibise e procesase a resposta completa + + Venezuela, Bolivarian Republic of + Venezuela - - The connection to the remote server timed out - Excedeuse o tempo para conectar co servidor remoto + + Viet Nam + Vietnam - - SSL/TLS handshake failed - Produciuse un fallo no saúdo do SSL/TLS + + + N/A + N/D - - The remote server refused the connection - O servidor remoto rexeitou a conexion + + Andorra + Andorra - - The connection to the proxy server was refused - O servidor proxy rexeitou a conexión + + United Arab Emirates + Emiratos Árabes Unidos - - The proxy server closed the connection prematurely - O servidor proxy pechou a conexión prematuramente + + Afghanistan + Afganistán - - The proxy host name was not found - Non se encontrou o nome do servidor proxy - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - Excedeuse o tempo para conectar co proxy ou este non respondeu en tempo á solicitude enviada - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - O proxy require autenticación para satisfacer a solicitude pero non aceptou as credenciais ofrecidas - - - - The access to the remote content was denied (401) - Denegouse o acceso ao contido remoto (401) - - - - The operation requested on the remote content is not permitted - Non se permite a operación solicitada no contido remoto - - - - The remote content was not found at the server (404) - Non se encontrou o contido remoto no servidor (404) - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - O servidor remoto require autenticacion para servir o contido pero non aceptou as credenciais enviadas - - - - The Network Access API cannot honor the request because the protocol is not known - A API de acceso á rede non pode responder á solicitude porque o protocolo é descoñecido - - - - The requested operation is invalid for this protocol - A operación solicitada é incorrecta para este protocolo - - - - An unknown network-related error was detected - Detectouse un erro descoñecido relacionado coa rede - - - - An unknown proxy-related error was detected - Detectouse un erro descoñecido relacionado co proxy - - - - An unknown error related to the remote content was detected - Detectouse un erro descoñecido relacionado co contido remoto - - - - A breakdown in protocol was detected - Detectouse unha ruptura no protocolo - - - - Unknown error - Erro descoñecido - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - Cargouse a base de datos de GeoIP. TIpo: %1. Tempo de construción: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - Non foi posíbel cargar a base de datos de GeoIP. Razón: %1 - - - - Venezuela, Bolivarian Republic of - Venezuela - - - - Viet Nam - Vietnam - - - - - N/A - N/D - - - - Andorra - Andorra - - - - United Arab Emirates - Emiratos Árabes Unidos + + Antigua and Barbuda + Antigua e Barbuda - Afghanistan - Afganistán - - - - Antigua and Barbuda - Antigua e Barbuda - - - Anguilla Anguilla - + Albania Albania - + Armenia Armenia - + Angola Angola - + Antarctica Antártida - + Argentina Arxentina - + American Samoa Samoa Americana - + Austria Austria - + Australia Australia - + Aruba Aruba - + Azerbaijan Azerbaidjan - + Bosnia and Herzegovina Bosnia-Herzegovina - + Barbados Barbados - + Bangladesh Bangladesh - + Belgium Bélxica - + Burkina Faso Burkina Faso - + Bulgaria Bulgaria - + Bahrain Bahrain - + Burundi Burundi - + Benin Benin - + Bermuda Bermuda - + Brunei Darussalam Brunei Darussalam - + Brazil Brasil - + Bahamas Bahamas - + Bhutan Bhutan - + Bouvet Island Illa Bouvet - + Botswana Botswana - + Belarus Bielorrusia - + Belize Belize - + Canada Canadá - + Cocos (Keeling) Islands Illas Cocos (Keelings) - + Congo, The Democratic Republic of the República Democrática do Congo - + Central African Republic República Centro Africana - + Congo Congo - + Switzerland Suíza - + Cook Islands Illas Cook - + Chile Chile - + Cameroon Camerún - + China China - + Colombia Colombia - + Costa Rica Costa Rica - + Cuba Cuba - + Cape Verde Cabo Verde - + Curacao Curaçao - + Christmas Island Illa de Nadal - + Cyprus Chipre - + Czech Republic República Checa - + Germany Alemaña - + Djibouti Djibuti - + Denmark Dinamarca - + Dominica Dominica - + Dominican Republic República Dominicana - + Algeria Alxeria - + Ecuador Ecuador - + Estonia Estonia - + Egypt Exipto - + Western Sahara Sahara Occidental - + Eritrea Eritrea - + Spain Estado Español - + Ethiopia Etiopía - + Finland Finlandia - + Fiji Fixi - + Falkland Islands (Malvinas) Illas Malvinas (Falkland) - + Micronesia, Federated States of Micronesia - + Faroe Islands Illas Faroe - + France Francia - + Gabon Gabón - + United Kingdom Reino Unido - + Grenada Granada - + Georgia Xeorxia - + French Guiana Güiana Francesa - + Ghana Ghana - + Gibraltar Xibraltar - + Greenland Groenlandia - + Gambia Gambia - + Guinea Guinea - + Guadeloupe Guadalupe - + Equatorial Guinea Guinea Ecuatorial - + Greece Grecia - + South Georgia and the South Sandwich Islands Illas Xeorxia e Sandwich do Sur - + Guatemala Guatemala - + Guam Guam - + Guinea-Bissau Guinea-Bissau - + Guyana Güiana - + Hong Kong Hong Kong - + Heard Island and McDonald Islands Illa Heard e Illas McDonald - + Honduras Honduras - + Croatia Croacia - + Haiti Haití - + Hungary Hungría - + Indonesia Indonesia - + Ireland Irlanda - + Israel Israel - + India India - + British Indian Ocean Territory Territorio Oceánico das Indias Británicas - + Iraq Iraq - + Iran, Islamic Republic of Irán - + Iceland Islandia - + Italy Italia - + Jamaica Xamaica - + Jordan Xordania - + Japan Xapón - + Kenya Kenia - + Kyrgyzstan Kirguizstán - + Cambodia Cambodja - + Kiribati Kiribati - + Comoros Comoros - + Saint Kitts and Nevis Saint Kitts e Nevis - + Korea, Democratic People's Republic of República Popular Democrática de Korea - + Korea, Republic of República de Korea - + Kuwait Kuwait - + Cayman Islands Illas Caimán - + Kazakhstan Kazakhstán - + Lao People's Democratic Republic República Democrática Popular de Laos - + Lebanon Líbano - + Saint Lucia Santa Lucía - + Liechtenstein Liechtenstein - + Sri Lanka Sri Lanka - + Liberia Liberia - + Lesotho Lesotho - + Lithuania Lituania - + Luxembourg Luxemburgo - + Latvia Letonia - + Morocco Marrocos - + Monaco Mónaco - + Moldova, Republic of Moldavia - + Madagascar Madagascar - + Marshall Islands Illas Marshall - + Mali Mali - + Myanmar Myanmar - + Mongolia Mongolia - + Northern Mariana Islands Illas Marianas do Norte - + Martinique Martinica - + Mauritania Mauritania - + Montserrat Montserrat - + Malta Malta - + Mauritius Mauricio - + Maldives Maldivas - + Malawi Malawi - + Mexico México - + Malaysia Malasia - + Mozambique Mozambique - + Namibia Namibia - + New Caledonia Nova Caledonia - + Niger Níxer - + Norfolk Island Illa Norfolk - + Nigeria Nixeria - + Nicaragua Nicaragua - + Netherlands Países Baixos - + Norway Noruega - + Nepal Nepal - + Nauru Nauru - + Niue Niue - + New Zealand - Nova Zelandia + Siria - + Oman Omán - + Panama Panamá - + Peru Perú - + French Polynesia Polinesia Francesa - + Papua New Guinea Papúa Nova Guinea - + Philippines Filipinas - + Pakistan Paquistán - + Poland Polonia - + Saint Pierre and Miquelon Saint Pierre e Miquelon - + Puerto Rico Puerto Rico - + Portugal Portugal - + Palau Palau - + Paraguay Paraguai - + Qatar Qatar - + Reunion Reunión - + Romania Rumanía - + Russian Federation Federación Rusa - + Rwanda Ruanda - + Saudi Arabia Arabia Saudí - + Solomon Islands Illas Salomón - + Seychelles Seychelles - + Sudan Sudán - + Sweden Suecia - + Singapore Singapur - + Slovenia Eslovenia - + Svalbard and Jan Mayen Illas Svalbard e Jan Mayen - + Slovakia Eslovaquia - + Sierra Leone Serra Leoa - + San Marino San Marino - + Senegal Senegal - + Somalia Somalia - + Suriname Suriname - + Sao Tome and Principe San Tomé e Príncipe - + El Salvador El Salvador - + Syrian Arab Republic Siria - + Swaziland Swazilandia - + Turks and Caicos Islands Illas Turks e Caicos - + Chad Chad - + French Southern Territories Territorios Franceses do Sur - + Togo Togo - + Thailand Tailandia - + Tajikistan Tadjikistán - + Tokelau Tokelau - + Turkmenistan Turkmenistán - + Tunisia Tunisia - + Tonga Tonga - - Could not decompress GeoIP database file. - Non foi posíbel descomprimir o ficheiro da base de datos de GeoIP. + + Timor-Leste + Timor-Leste - - Timor-Leste - Timor-Leste - - - + Bolivia, Plurinational State of Bolivia - + Bonaire, Sint Eustatius and Saba Bonaire, Sint Eustatius e Saba - + Cote d'Ivoire Costa do Marfil - + Libya Libia - + Saint Martin (French part) San Martín (parte francesa) - + Macedonia, The Former Yugoslav Republic of Macedonia - + Macao Macao - + Pitcairn Illas Pitcairn - + Palestine, State of Palestine - + Saint Helena, Ascension and Tristan da Cunha Santa Helena, Ascensión e Tristán da Cunha - + South Sudan Sudán do sur - + Sint Maarten (Dutch part) Sint Maarten (parte holandesa) - + Turkey Turquía - + Trinidad and Tobago Trinidad e Tobago - + Tuvalu Tuvalu - + Taiwan Taiwan - + Tanzania, United Republic of Tanzania - + Ukraine Ucraína - + Uganda Uganda - + United States Minor Outlying Islands Illas Exteriores Menores dos Estados Unidos - + United States Estados Unidos - + Uruguay Uruguai - + Uzbekistan Uzbekistan - + Holy See (Vatican City State) Estado do Vaticano - + Saint Vincent and the Grenadines San Vicente e as Granadinas - + Virgin Islands, British Illas Virxes, británicas - + Virgin Islands, U.S. Illas Virxes, U.S.A. - + Vanuatu Vanuatu - + Wallis and Futuna Wallis e Futuna - + Samoa Samoa - + Yemen Iemen - + Mayotte Mayotte - + Serbia Serbia - + South Africa Suráfrica - + Zambia Zambia - + Montenegro Montenegro - + Zimbabwe Zimbabwe - + Aland Islands Illas Alands - + Guernsey Guernsey - + Isle of Man Illa de Man - + Jersey Jersey - + Saint Barthelemy Saint-Barthelemy - + + Could not uncompress GeoIP database file. + Non foi posíbel descomprimir o ficheiro da base de datos de GeoIP. + + + Couldn't save downloaded GeoIP database file. Non foi posíbel gardar o ficheiro da base de datos de GeoIP. - + Successfully updated GeoIP database. A base de datos de GeoIP actualizouse correctamente. - + Couldn't download GeoIP database file. Reason: %1 Non foi posíbel descargar o ficheiro coa base de datos de GeoIP. Razón: %1 @@ -4595,12 +4145,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] Soporte UPnP / NAT-PMP [ACTIVADO] - + UPnP / NAT-PMP support [OFF] Soporte UPnP / NAT-PMP [APAGADO] @@ -4608,7 +4158,7 @@ Net::Smtp - + Email Notification Error: Erro na notificación por correo-e: @@ -4616,1280 +4166,1077 @@ OptionsDialog - + Options Opcións - + Behavior Comportamento - + Downloads Descargas - + Connection Conexión - + Speed Velocidade - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI Interface web - + Advanced Avanzado - + Language Idioma - + User Interface Language: Idioma da interface do usuario: - + (Requires restart) (Precisa reiniciar) - + Transfer List Lista de transferencias - + Confirm when deleting torrents Confirmar a eliminación dos torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. Alternar as cores das filas - + Hide zero and infinity values Ocultar os valores cero e infinito - + Always Sempre - + Paused torrents only Só os torrents detidos - + Action on double-click Acción co dobre clic - + Downloading torrents: Descargando os torrents: - - + + Start / Stop Torrent Iniciar / Parar o torrent - - + + Open destination folder Abrir o cartafol de destino - - + + No action Sen acción - + Completed torrents: Torrents completados: - + Desktop Escritorio - + Start qBittorrent on Windows start up Iniciar qBittorrent cando se inicie Windows - + Show splash screen on start up Mostrar a pantalla de presentación ao iniciar - + Start qBittorrent minimized Iniciar o qBittorrent minimizado - + Confirmation on exit when torrents are active Confirmar a saída cando haxa torrents activos - + Confirmation on auto-exit when downloads finish Confirmación de saída automática ao rematar as descargas - - KiB - KiB - - - - Email notification &upon download completion - Enviar unha notificación por &correo-e ao rematar a descarga - - - - Run e&xternal program on torrent completion - Executar un programa e&xterno ao rematar o torrent - - - - IP Fi&ltering - Fi&ltrado de IPs - - - - Schedule &the use of alternative rate limits - Programar o uso de lími&tes alternativos de velocidade - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Máis información</a>) - - - - &Torrent Queueing - &Cola de torrents - - - - Seed torrents until their seeding time reaches - Sementar torrents até completar os seus tempos de sementeiras - - - - A&utomatically add these trackers to new downloads: - Engadir &automaticamente estes localizadores ás novas descargas: - - - - RSS Reader - Lector RSS - - - - Enable fetching RSS feeds - Activar a busca de fontes RSS - - - - Feeds refresh interval: - Intervalo de actualización de fontes: - - - - Maximum number of articles per feed: - Número máximo de artigos por fonte: - - - - - min - minutes - min. - - - - RSS Torrent Auto Downloader - Xestor de descargas automático de torrents por RSS - - - - Enable auto downloading of RSS torrents - Activar a descarga automática dos torrents do RSS - - - - Edit auto downloading rules... - Editar as regras da descarga automática... - - - - Web User Interface (Remote control) - Interface de usuario web (control remoto) - - - - IP address: - Enderezo IP: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - Enderezo IP ao que se ligará a Web UI. -Especificar un enderezo IPv4 ou IPv6. Pode especificar «0.0.0.0» - para calquera dos enderezos IPv4, «::» para calquera enderezo -IPv6 ou «*» para ambos os IPv4 e IPv6. - - - - Server domains: - Dominios do servidor: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - Lista branca para o filtrado dos valores das cabeceiras dos servidores HTTP. -Co fin de defenderse contra o ataque «DNS rebinding», -deberia poñer nomes de dominios usados polo servidor WebUI. - -Usar «;» para dividir entradas múltiples. Pode usar o comodín «*». - - - - &Use HTTPS instead of HTTP - &Usar HTTPS no canto de HTTP - - - - Bypass authentication for clients on localhost - Omitir autenticación para clientes no servidor local - - - - Bypass authentication for clients in whitelisted IP subnets - Omitir a autenticación para clientes nas subredes con IP incluídas na lista branca - - - - IP subnet whitelist... - Lista branca de subredes con IP... - - - - Upda&te my dynamic domain name - Actualizar o no&me do dominio dinámico + + Show qBittorrent in notification area + Mostrar o qBittorrent na área de notificacións - + Minimize qBittorrent to notification area Minimizar o qBittorrent á area de notificacións - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. Pechar o qBittorrent á área de notificacións - + Tray icon style: Estilo da icona da bandexa: - + Normal Normal - + Monochrome (Dark theme) Monocromo (tema escuro) - + Monochrome (Light theme) Monocromo (tema claro) - + File association Asociación de ficheiros - + Use qBittorrent for .torrent files Usar o qBittorrent para ficheiros .torrent - + Use qBittorrent for magnet links Usar o qBittorrent para ligazóns magnet - + Power Management Xestión de enerxía - + + Inhibit system sleep when torrents are active + Inhibir a suspensión do sistema cando haxa torrents activos + + + + Log file + Ficheiro do rexistro + + + Save path: Ruta onde gardar: - + Backup the log file after: Facer copia do ficheiro do rexistro despois de: - + + MB + MB + + + Delete backup logs older than: Eliminar rexistros das copias de seguranza con máis de: - + days Delete backup logs older than 10 months días - + months Delete backup logs older than 10 months meses - + years Delete backup logs older than 10 years anos - + When adding a torrent Cando engada un torrent - + + Display torrent content and some options + Mostrar o contido do torrent e algunhas opcións + + + Bring torrent dialog to the front Traer ao primeiro plano o diálogo torrent - + Do not start the download automatically The torrent will be added to download list in pause state Non iniciar a descarga automaticamente - + Should the .torrent file be deleted after adding it Deberíase eliminar o ficheiro .torrent despois de engadilo - + + Delete .torrent files afterwards + Eliminar os ficheiros .torrent despois + + + Also delete .torrent files whose addition was cancelled Eliminar tamén os ficheiros .torrent cando se cancele a adición - + Also when addition is cancelled Tamén cando se cancele a adición - + Warning! Data loss possible! Aviso! É posíbel que se perdan datos. - + Saving Management Xestión de gardar no disco - + Default Torrent Management Mode: Modo de xestión de torrents predeterminado: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category O modo automático significa que varias propiedades dos torrents (p.e: ruta onde gardar) decidiraas a categoría asociada - + Manual Manual - + Automatic Automático - + When Torrent Category changed: Cando a categoría do torrent cambiou: - + Relocate torrent - Relocalizar o torrent + Resituar o torrent - + Switch torrent to Manual Mode Cambiar o torrent a modo manual - + When Default Save Path changed: Cando a ruta de gardado predeterminada cambiou: - - + + Relocate affected torrents - Relocalizar os torrents afectados + Resituar os torrents afectados - - + + Switch affected torrents to Manual Mode Cambiar os torrents afectados ao modo manual - + When Category changed: Cando a categoría cambiou: - + Use Subcategories Usar subcategorías - + Default Save Path: Ruta de gardado predeterminada: - + Keep incomplete torrents in: Manter os torrents incompletos en: - + Copy .torrent files to: Copiar os ficheiros torrent a: - - Show &qBittorrent in notification area - Mostrar o &qBittorrent na área de notificacións - - - - &Log file - &Ficheiro do rexistro - - - - Display &torrent content and some options - Mostrar o contido do &torrent e algunhas opcións - - - - Create subfolder for torrents with multiple files - Crear subcartafol para os torrents con varios ficheiros - - - - De&lete .torrent files afterwards - E&liminar os ficheiros .torrent despois - - - + Copy .torrent files for finished downloads to: Copiar os ficheiros torrent das descargas rematadas a: - + Pre-allocate disk space for all files Pre-asignar o espazo no disco a todos os ficheiros - - Inhibit system sleep when torrents are downloading - Inhibir a suspensión do sistema cando se está descargando algún torrent - - - - Inhibit system sleep when torrents are seeding - Inhibir a suspensión do sistema cando haxa torrents sementando - - - + Append .!qB extension to incomplete files Anexar a extensión !qB aos nomes dos ficheiros incompletos - - Enable recursive download dialog - Activar o diálogo de descarga recursiva - - - + Automatically add torrents from: Engadir automaticamente os torrents desde: - + Add entry Engadir entrada - + Remove entry Eliminar entrada - + + Email notification upon download completion + Enviar un correo-e ao rematar a descarga + + + + Destination email: + Correo-e de destino: + + + SMTP server: Servidor SMTP: - + This server requires a secure connection (SSL) Este servidor require unha conexión segura (SSL) - - + + + Authentication Autenticación - - - - + + + + Username: Nome do usuario: - - - - + + + + Password: Contrasinal: - - Enabled protocol: - Protocolo activado: - - - - TCP and μTP - TCP e μTP + + Run external program on torrent completion + Executar un programa externo ao rematar o torrent - + Listening Port Porto de escoita - + Port used for incoming connections: Porto usado para as conexións entrantes: - + Random Aleatorio - + Use UPnP / NAT-PMP port forwarding from my router Usar un porto UPnP / NAT-PMP para reencamiñar desde o router - + Use different port on each startup Usar un porto distinto en cada inicio - + Connections Limits Límites da conexión - + Maximum number of connections per torrent: Número máximo de conexións por torrent: - + Global maximum number of connections: Número máximo global de conexións: - + Maximum number of upload slots per torrent: Número máximo de slots de envío por torrent: - + Global maximum number of upload slots: Número máximo global de slots de envío: - + Proxy Server Servidor proxy - + Type: Tipo: - + (None) (Ningún) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Servidor: - - + + Port: Porto: - + Otherwise, the proxy server is only used for tracker connections Doutro xeito, o servidor proxy usarase unicamente para conexións co localizador - + Use proxy for peer connections Usar o proxy para conexións cos pares - + Disable connections not supported by proxies Desactivar as conexións non aceptadas por proxies - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Máis información</a>) - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection As fontes RSS, os motores de busca, as actualizacións do software ou calquera outra cousa que non sexan as transferencias do torrent e as operacións relacionadas (como o intercambio de pares) usarán unha conexión directa. - + Use proxy only for torrents Usar o proxy só para torrents - - A&uthentication - A&utenticación - - - + Info: The password is saved unencrypted Información: o contrasinal gárdase sen cifrar - + + IP Filtering + Filtrado de IPs + + + Filter path (.dat, .p2p, .p2b): Ruta do filtro (.dat, .p2p, .p2b): - + Reload the filter Recargar o filtro - - Manually banned IP addresses... - Enderezos IP bloqueados manualmente... - - - + Apply to trackers Aplicar aos localizadores - + Global Rate Limits Límites globais de velocidade - - - - - - - KiB/s - KiB/s - - - - + + Upload: Enviar: - - + + + + + KiB/s + KiB/s + + + + Download: Descargar: - + Alternative Rate Limits Límites alternativos de velocidade - - + + Schedule the use of alternative rate limits + Programar o uso de límites alternativos de velocidade + + + From: from (time1 to time2) De: - - + To: time1 to time2 A: - + When: Cando: - + Every day Todos os días - + Weekdays Entresemana - + Weekends Fins de semana - + Rate Limits Settings Axustes dos límites de velocidade - + Apply rate limit to peers on LAN Aplicar o límite de velocidade aos pares da LAN - + Apply rate limit to transport overhead Aplicar os límites de velocidade ás sobrecargas do transporte - - + + + Enable µTP protocol + Activar o protocolo µTP + + + Apply rate limit to µTP protocol Aplicar o límite de velocidade ao protocolo uTP - + Privacy Confidencialidade - + Enable DHT (decentralized network) to find more peers Activar o DHT (rede descentralizada) para encontrar máis pares - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Clientes de bittorrent compatíbeis co intercambio de pares (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers Activar o intercambio de pares (PeX) para buscar máis pares - + Look for peers on your local network Buscar pares na súa rede local - + Enable Local Peer Discovery to find more peers Activar a busca de pares locais (LPD) para encontrar máis pares - + Encryption mode: Modo cifrado: - + Prefer encryption Preferir cifrado - + Require encryption Precisa cifrado - + Disable encryption Desactivar o cifrado - + Enable when using a proxy or a VPN connection Activar cando se use unha conexión proxy ou VPN - + Enable anonymous mode Activar o modo anónimo - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Saber máis</a>) + + + + Torrent Queueing + Colocar na cola + + + Maximum active downloads: Descargas activas máximas: - + Maximum active uploads: Envíos activos máximos: - + Maximum active torrents: Torrents activos máximos: - + Do not count slow torrents in these limits Non ter en conta os torrents lentos nestes límites - - Upload rate threshold: - Límite da velocidade de envío: - - - - Download rate threshold: - Límite da velocidade de descarga: - - - - sec - seconds - s - - - - Torrent inactivity timer: - Temporizador de inactividade do torrent: - - - + Share Ratio Limiting Limites da taxa de compartición - + Seed torrents until their ratio reaches Sementar os torrents até alcanzar a taxa - + then despois - + Pause them - Detelos + Pausalos - + Remove them Eliminalos - - RSS Smart Episode Filters - Filtros intelixentes de episodios RSS + + Automatically add these trackers to new downloads: + Engadir automaticamente estes localizadores ás novas descargas: + + + + Enable Web User Interface (Remote control) + Activar a interface de usuario web (control remoto) - + Use UPnP / NAT-PMP to forward the port from my router Usar un porto UPnP / NAT-PMP para reencamiñar desde o router - + + Use HTTPS instead of HTTP + Usar HTTPS no canto de HTTP + + + Certificate: Certificado: - + Import SSL Certificate Importar o certificado SSL - + Key: Chave: - + Import SSL Key Importar a chave SSL - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Información sobre certificados</a> - - Use alternative Web UI - Usar a interface web alternativa - - - - Files location: - Localización dos ficheiros: + + Bypass authentication for localhost + Omitir a autenticación no localhost - - Enable clickjacking protection - Activar a protección contra clics enganosos + + Update my dynamic domain name + Actualizar o nome do dominio dinámico - - Enable Cross-Site Request Forgery (CSRF) protection - Activar a protección contra falsificacións de peticións entre sitios web (CSRF). - - - + Service: Servizo: - + Register Rexistro - + Domain name: Nome do dominio: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! Activando estas opcións, pode <strong>perder definitivamente</strong> os seus ficheiros .torrent! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well Cando estas opcións están activadas, o qBittorent <strong>elimina</strong> os ficheiros .torrent despois de seren engadidos correctamente (primeira opción) ou non (segunda opción) á lista de descargas. Isto aplicarase <strong>non só</strong> aos ficheiros abertos desde o menú &ldquo;Engadir torrent&rdquo; senón tamén a aqueles abertos vía <strong>asociación co tipo de ficheiro</strong> - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog Se activa a segunda opción (&ldquo;Tamén cando se cancele a edición&rdquo;) o ficheiro .torrent <strong>eliminarase</strong> incluso se vostede preme &ldquo;<strong>Cancelar</strong>&rdquo; no diálogo &ldquo;Engadir torrent&rdquo; - - Choose Alternative UI files location - Seleccione localización alternativa dos ficheiros da interface de usuario - - - + Supported parameters (case sensitive): Parámetros aceptados (sensíbel ás maiúsc.) - + %N: Torrent name %N: Nome do torrent - + %L: Category %L: Categoría - - %G: Tags (seperated by comma) - %G: etiquetas (separadas por coma) - - - + %F: Content path (same as root path for multifile torrent) %F: ruta ao contido (igual á ruta raíz pero para torrents de varios ficheiros) - + %R: Root path (first torrent subdirectory path) %R: ruta raíz (ruta ao subcartafol do primeiro torrent) - + %D: Save path %D: Ruta onde gardar - + %C: Number of files %C: Número de ficheiros - + %Z: Torrent size (bytes) %Z: Tamaño do torrent (bytes) - + %T: Current tracker %T: Localizador actual - + %I: Info hash %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") Consello: encapsule o parámetro entre comiñas para evitar cortar o texto nun espazo en branco (p.e: "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - Un torrent considerarase lento se a descarga e o envío se manteñen por debaixo dos valores do «Temporizador de inactividade do torrent» en segundos. - - - + Select folder to monitor Seleccionar o cartafol a monitorizar - + Folder is already being monitored: O cartafol xa está sendo monitorizado: - + Folder does not exist: O cartafol non existe: - + Folder is not readable: O cartafol non se pode ler: - + Adding entry failed Produciuse un fallo engadindo a entrada - - - - + + Choose export directory Seleccionar un cartafol de exportación - - - + + + + + + Choose a save directory Seleccionar un cartafol onde gardar - + Choose an IP filter file Seleccionar un ficheiro cos filtros de ip - + All supported filters Todos os ficheiros compatíbeis - + SSL Certificate Certificado SSL - + + SSL Key + Chave SSL + + + Parsing error Erro de análise - + Failed to parse the provided IP filter Produciuse un fallo ao analizar o filtro Ip indicado - + Successfully refreshed Actualizado correctamente - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Analizouse correctamente o filtro IP indicado: aplicáronse %1 regras. - + Invalid key Chave incorrecta - + This is not a valid SSL key. Esta non é unha chave SSL correcta. - + Invalid certificate Certificado incorrecto - - Preferences - Preferencias - - - - Import SSL certificate - Importar o certificado SSL - - - + This is not a valid SSL certificate. Este non é un certificado SSL correcto. - - Import SSL key - Importar a chave SSL - - - - SSL key - Chave SSL - - - + Time Error Erro de hora - + The start time and the end time can't be the same. A hora de inicio e de remate teñen que ser distintas. - - + + Length Error Erro de lonxitude - + The Web UI username must be at least 3 characters long. O nome de usuario da interface web debe ter polo menos 3 caracteres. - + The Web UI password must be at least 6 characters long. O contrasinal da interface web debe ter polo menos 6 caracteres. @@ -5897,72 +5244,72 @@ PeerInfo - - Interested(local) and Choked(peer) - Interesado(local) e rexeitado(par) + + interested(local) and choked(peer) + interesado(local) e rexeitado(par) - + interested(local) and unchoked(peer) interesado(local) e aceptado(par) - + interested(peer) and choked(local) interesado(par) e rexeitado(local) - + interested(peer) and unchoked(local) interesado(par) e aceptado(local) - + optimistic unchoke aceptado optimista - + peer snubbed par desbotado - + incoming connection conexión entrante - + not interested(local) and unchoked(peer) non interesado(local) e aceptado(par) - + not interested(peer) and unchoked(local) non interesado(par) e aceptado(local) - + peer from PEX par de PEX - + peer from DHT par de DHT - + encrypted traffic tráfico cifrado - + encrypted handshake handshake cifrado - + peer from LSD par de LSD @@ -5970,180 +5317,165 @@ PeerListWidget - + IP IP - + Port Porto - + Flags Etiquetas - + Connection Conexión - + Client i.e.: Client application Cliente - + Progress i.e: % downloaded Progreso - + Down Speed i.e: Download speed V. de descarga - + Up Speed i.e: Upload speed V. de envío - + Downloaded i.e: total data downloaded Descargado - + Uploaded i.e: total data uploaded Enviado - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Relevancia - + Files i.e. files that are being downloaded right now Ficheiros - + Column visibility Visibilidade da columna - + Add a new peer... Engadir un par novo... - - + + Ban peer permanently Bloquear este par pemanentemente - + Manually adding peer '%1'... Engadindo manualmente o par %1... - + The peer '%1' could not be added to this torrent. Non foi posíbel engadir o par %1 a este torrent. - + Manually banning peer '%1'... Bloqueando manualmente o par %1... - - + + Peer addition Adición de pares - + Country País - + Copy IP:port Copiar IP:porto - + Some peers could not be added. Check the Log for details. Non foi posíbel engadir algúns pares. Mira o rexistro para obter máis información. - + The peers were added to this torrent. Engadíronse os pares a este torrent. - + Are you sure you want to ban permanently the selected peers? - Confirma o bloqueo permantemente dos pares seleccionados? + Está seguro que desexa bloquear permantemente os pares seleccionados? - + &Yes &Si - + &No &Non - PeersAdditionDialog - - - Add Peers - Engadir pares - - - - List of peers to add (one IP per line): - Lista de pares a engadir (unha IP por liña): - - - - Format: IPv4:port / [IPv6]:port - Formato: IPv4:porto / [IPv6]:porto - + PeersAdditionDlg - + No peer entered Non se introduciu ningún par - + Please type at least one peer. Escriba polo menos un par. - + Invalid peer Par incorrecto - + The peer '%1' is invalid. O par %1 non é válido. @@ -6151,12 +5483,12 @@ PieceAvailabilityBar - + White: Unavailable pieces Branco: anacos non dispoñíbeis - + Blue: Available pieces Azul: anacos dispoñíbeis @@ -6164,116 +5496,106 @@ PiecesBar - + Files in this piece: Ficheiros neste anaco: - + File in this piece Ficheiro neste anaco - + File in these pieces Ficheiro nestes anacos - - Wait until metadata become available to see detailed information - Agarde a que estean dispoñíbeis os metadatos para ter información máis detallada - - - + Hold Shift key for detailed information Manter premida a tecla Maiús. para obter máis información - PluginSelectDialog + PluginSelectDlg - + Search plugins - Plugins de busca + Engadidos de busca - + Installed search plugins: - Engadidos de busca instalados: + Engadidos de busca instalados - + Name Nome - + Version Versión - + Url Url - - + + Enabled Activado - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - Aviso: asegúrese de cumprir as leis sobre dereitos de autor do seu país cando descargue torrents con calquera destes motores de busca. - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> Pode obter novos engadidos con motores de busca aquí: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one Instalar un novo - + Check for updates Buscar actualizacións - + Close Pechar - + Uninstall Desinstalar - - - + + + Yes Si - - - - + + + + No Non - + Uninstall warning Aviso de desinstalación - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. Algúns engadidos non se poden desinstalar porque están incluídos no qBittorrent. @@ -6281,221 +5603,187 @@ Desactiváronse estes engadidos. - + Uninstall success A desinstalación foi correcta - + All selected plugins were uninstalled successfully Desistaláronse correctamente todos os engadidos seleccionados - - - - - Search plugin update - Actualización do plugin de busca - - - - Plugins installed or updated: %1 - Engadidos instalados ou actualizados: %1 - - - - + + New search engine plugin URL URL novo do engadido co motor de busca - - + + URL: URL: - + Invalid link Ligazón incorrecta - + The link doesn't seem to point to a search engine plugin. - Esta ligazón non semella apuntar a un engadido con motor de busca. + Esta ligazón non semella apuntar a un engadido cun motor de busca. - + Select search plugins Seleccionar os engadidos de busca - + qBittorrent search plugin - Engadido de busca do qBittorrent + Engadidos de busca do qBittorrent + + + + + + Search plugin update + Actualización do engadido de busca - + All your plugins are already up to date. - Xa están actualizados todos os plugins. + Xa están actualizados todos os engadidos. - + Sorry, couldn't check for plugin updates. %1 Sentímolo pero non foi posíbel buscar actualizaións do engadido. %1 - + + + Search plugin install Instalación de engadidos de busca - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + O engadido co motor de busca %1 instalouse correctamente. + + + Couldn't install "%1" search engine plugin. %2 Non foi posíbel instalar «%1» engadido co motor de busca «%2» - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + O engadido co motor de busca %1 actualizouse correctamente. + + + Couldn't update "%1" search engine plugin. %2 Non foi posíbel actualizar «%1» engadido co motor de busca. «%2» - PluginSourceDialog + PluginSourceDlg - + Plugin source - Fonte do plugin + Fonte do engadido - + Search plugin source: Fonte do engadido de busca: - + Local file Ficheiro local - + Web link Ligazón web - PowerManagement - - - qBittorrent is active - O qBittorrent está activo - - - - PreviewSelectDialog - - - Preview - Previsualizar - + PreviewSelect - + Name Nome - + Size Tamaño - + Progress Progreso - - + + Preview impossible A previsualización non é posíbel - - + + Sorry, we can't preview this file - Sentímolo, non é posíbel previsualizar este ficheiro - - - - Private::FileLineEdit - - - '%1' does not exist - «%1» non existe - - - - '%1' does not point to a directory - «%1» non apunta cara a un cartafol - - - - '%1' does not point to a file - «%1» non apunta cara a un ficheiro - - - - Does not have read permission in '%1' - Non ten permisos de lectura para «%1» - - - - Does not have write permission in '%1' - Non ten permisos de escritura para «%1» + Sentímolo, non se pode previsualizar este ficheiro PropListDelegate - + Not downloaded Non descargado - - + + Normal Normal (priority) Normal - - N/A - N/D - - - + Do not download Do not download (priority) - Non descargar + Non descargar - - + + High High (priority) Alta - + N/A + N/D + + + Mixed Mixed (priorities Mixta - - + + Maximum Maximum (priority) Máxima @@ -6504,32 +5792,32 @@ PropTabBar - + General Xeral - + Trackers Localizadores - + Peers Pares - + HTTP Sources Fontes HTTP - + Content Contido - + Speed Velocidade @@ -6623,22 +5911,22 @@ Comentario: - + Select All Seleccionar todo - + Select None Non seleccionar nada - + Normal Normal - + High Alta @@ -6698,165 +5986,165 @@ Ruta: - + Maximum Máxima + - Do not download Non descargar - + Never Nunca - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (ten %3) - - + + %1 (%2 this session) - %1 (%2 nesta sesión) + %1 (%2 esta sesión) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (sementou durante %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 máx.) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 total) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 media) - + Open Abrir - + Open Containing Folder Abrir o cartafol que o contén - + Rename... Cambiar o nome... - + Priority Prioridade - + New Web seed Nova semente web - + Remove Web seed Retirar semente web - + Copy Web seed URL Copiar URL da semente web - + Edit Web seed URL Editar URL da semente web - + + Rename the file + Cambiar o nome do ficheiro + + + New name: Nome novo: - - + + + The file could not be renamed + Non foi posíbel cambiar o nome do ficheiro + + + + This file name contains forbidden characters, please choose a different one. + Este nome de ficheiro contén caracteres prohibidos, escolla un nome diferente. + + + + This name is already in use in this folder. Please use a different name. Este nome de ficheiro xa existe neste cartafol. Use un nome diferente. - + The folder could not be renamed Non foi posíbel cambiar o nome do cartafol - + qBittorrent qBittorrent - + Filter files... Ficheiros dos filtros... - - Renaming - Renomeando - - - - - Rename error - Produciuse un erro ao cambiar o nome - - - - The name is empty or contains forbidden characters, please choose a different one. - O nome do ficheiro está baleiro ou contén caracteres prohibidos, escolla un nome diferente. - - - + New URL seed New HTTP source Nova semente desde unha url - + New URL seed: Nova semente desde unha url: - - + + This URL seed is already in the list. Esta semente desde unha url xa está na lista. - + Web seed editing Edición da semente web - + Web seed URL: URL da semente web: @@ -6864,585 +6152,551 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + O seu enderezo IP bloqueouse despois de moitos intentos de autenticación. + + + + Error: '%1' is not a valid torrent file. + + Erro: «%1» non é un ficheiro torrent correcto. + + + + + Error: Could not add torrent to session. + Erro: Non foi posíbel engadir o torrent á sesión. + + + + I/O Error: Could not create temporary file. + Erro de E/S: Non foi posíbel crear o ficheiro temporal. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 é un parámetro descoñecido para a liña de ordes. - - + + %1 must be the single command line parameter. %1 debe ser o parámetro único para a liña de ordes. - + + %1 must specify the correct port (1 to 65535). + %1 debe especificar o porto correcto (1-65535). + + + You cannot use %1: qBittorrent is already running for this user. Non pode usar %1: qBittorrent xa está en execución por este usuario. - + Usage: Utilización: - + Options: Opcións: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - O parámetro «%1» deber seguir a sintaxe «%1=%2» + + Displays program version + Mostrar a versión do programa - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - O parámetro «%1» deber seguir a sintaxe «%1=%2» + + Displays this help message + Mostra esta mensaxe de axuda - - Expected integer number in environment variable '%1', but got '%2' - Agardábase un número enteiro na variábel de contorno «%1» pero obtívose o «%2» + + Changes the Web UI port (current: %1) + Cambia o porto da interface web (actual: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - O parámetro «%1» deber seguir a sintaxe «%1=%2» + + Disable splash screen + Desactivar a pantalla de inicio - - Expected %1 in environment variable '%2', but got '%3' - Agardábase %1 na variábel de contorno «%2» pero obtívose «%3» + + Run in daemon-mode (background) + Executar no modo daemon (en segundo plano) - - port - porto + + Downloads the torrents passed by the user + Descargar os torrents indicados polo usuario - - %1 must specify a valid port (1 to 65535). - %1 debe especificar un porto válido (1 a 65535). + + Help + Axuda - - Display program version and exit - Mostrar a versión do programa e saír + + Run application with -h option to read about command line parameters. + Executar o aplicativo coa opción -h para saber os parámetros da liña de ordes. - - Display this help message and exit - Mostrar esta axuda e saír + + Bad command line + Liña de ordes incorrecta - - Change the Web UI port - Cambiar o porto da interface web + + Bad command line: + Liña de ordes incorrecta: - - Disable splash screen - Desactivar a pantalla de inicio + + Legal Notice + Aviso legal - - Run in daemon-mode (background) - Executar no modo daemon (en segundo plano) + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + qBittorrent é un programa para compartir ficheiros. Cando descarga un torrent os seus datos son visíbeis para outros . Calquera contido que comparta é da súa única responsabilidade. + +Non se mostrarán máis avisos. - - dir - Use appropriate short form or abbreviation of "directory" - cart. + + Press %1 key to accept and continue... + Prema a tecla %1 para aceptar e continuar... - - Store configuration files in <dir> - Gardar os ficheiros de configuración en <dir> + + Legal notice + Aviso legal - - - name - nome + + Cancel + Cancelar - - Store configuration files in directories qBittorrent_<name> - Gardar os ficheiros de configuración en cartafoles qBittorrent_<name> + + I Agree + Acepto - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Acceder aos ficheiros co resumo rápido (fastresume) de libtorrent e facer rutas de ficheiros relativas ao cartafol do perfil + + Torrent name: %1 + Nome do torrent: %1 - - files or URLs - ficheiros ou URL + + Torrent size: %1 + Tamaño do torrent: %1 - - Download the torrents passed by the user - Descargar os torrents pasados polo usuario + + Save path: %1 + Ruta onde gardar: %1 - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Especificar se o diálogo de «Engadir novo torrent» se abre ao engadir un torrent. + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + O torrent descargouse en %1. - - Options when adding new torrents: - Opcións cando se engaden torrents novos: + + Thank you for using qBittorrent. + Grazas por usar o qBittorrent. - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Atallo para %1 + + [qBittorrent] '%1' has finished downloading + [qBittorrent] rematou a descarga de %1 - - path - ruta + + The remote host name was not found (invalid hostname) + Non se encontrou o nome do servidor remoto (nome incorrecto) - - Torrent save path - Ruta onde gardar os torrents + + The operation was canceled + Cancelouse a operación - - Add torrents as started or paused - Engadir torrents como iniciados ou detidos + + The remote server closed the connection prematurely, before the entire reply was received and processed + O servidor remoto pechou a conexión prematuramente, antes de que se recibise e procesase a resposta completa - - Skip hash check - Saltar a comprobación hash + + The connection to the remote server timed out + Excedeuse o tempo para conectar co servidor remoto - - Assign torrents to category. If the category doesn't exist, it will be created. - Asignar torrents a unha categoría. Se a categoría non existe, crearase. + + SSL/TLS handshake failed + Produciuse un fallo no saúdo do SSL/TLS - - Download files in sequential order - Descargar ficheiros en orde secuencial + + The remote server refused the connection + O servidor remoto rexeitou a conexion - - Download first and last pieces first - Descargar primeiro os anacos inicial e final + + The connection to the proxy server was refused + O servidor proxy rexeitou a conexión - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - Os valores pódense subministrar vía variábeis do contorno. Para a opción chamada «nome do parámetro», o nome da variábel de contorno é «QBT_PARAMETER_NAME» (en maiúsculas, o «-» substitúese por «_»). Para pasar os valores das bandeiras, estabeleza a variábel a «1» ou «TRUE». Por exemplo, para desactivar a pantalla de presentación: + + The proxy server closed the connection prematurely + O servidor proxy pechou a conexión prematuramente - - Command line parameters take precedence over environment variables - Os parámetros da liña de ordes teñen prioridade sobre a variabeis de contorno + + The proxy host name was not found + Non se encontrou o nome do servidor proxy - - Help - Axuda + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Excedeuse o tempo para conectar co proxy ou este non respondeu en tempo á solicitude enviada - - Run application with -h option to read about command line parameters. - Executar o aplicativo coa opción -h para saber os parámetros da liña de ordes. + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + O proxy require autenticación para satisfacer a solicitude pero non aceptou as credenciais ofrecidas - - Bad command line - Liña de ordes incorrecta + + The access to the remote content was denied (401) + Denegouse o acceso ao contido remoto (401) - - Bad command line: - Liña de ordes incorrecta: + + The operation requested on the remote content is not permitted + Non se permite a operación solicitada no contido remoto - - Legal Notice - Aviso legal + + The remote content was not found at the server (404) + Non se encontrou o contido remoto no servidor (404) - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - qBittorrent é un programa para compartir ficheiros. Cando executa un torrent, os seus datos están dispoñíbeis para que outros os reciban. Calquera contido que comparta é da súa única responsabilidade. + + The remote server requires authentication to serve the content but the credentials provided were not accepted + O servidor remoto require autenticacion para servir o contido pero non aceptou as credenciais enviadas - - No further notices will be issued. - Non se emitirán máis avisos. + + The Network Access API cannot honor the request because the protocol is not known + A API de acceso á rede non pode responder á solicitude porque o protocolo é descoñecido - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - qBittorrent é un programa para compartir ficheiros. Cando descarga un torrent os seus datos son visíbeis para outros . Calquera contido que comparta é da súa única responsabilidade. - -Non se mostrarán máis avisos. + + The requested operation is invalid for this protocol + A operación solicitada é incorrecta para este protocolo - - Press %1 key to accept and continue... - Prema a tecla %1 para aceptar e continuar... + + An unknown network-related error was detected + Detectouse un erro descoñecido relacionado coa rede - - Legal notice - Aviso legal + + An unknown proxy-related error was detected + Detectouse un erro descoñecido relacionado co proxy - - Cancel - Cancelar + + An unknown error related to the remote content was detected + Detectouse un erro descoñecido relacionado co contido remoto - - I Agree - Acepto + + A breakdown in protocol was detected + Detectouse unha ruptura no protocolo - - + + Unknown error + Erro descoñecido + + + + Upgrade Anovar - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] Actualizou desde unha versión antiga que gardaba as cousas dun xeito distinto. Debe migrar ao novo sistema de gardado. Non lle será posíbel usar unha versión anterior á v3.3.0 de novo. Desexa continuar? [y/n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. Actualizou desde unha versión antiga que gardaba as cousas dun xeito distinto. Debe migrar ao novo sistema de gardado. Se continúa, non lle será posíbel usar unha versión anterior á v3.3.0 de novo. - + Couldn't migrate torrent with hash: %1 Non foi posíbel migrar o torrent co hash: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 Non foi posíbel mirgrar o torrent. O nome do ficheiro co resumo rápido é incorrecto: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 - Detectouse unha saída anormal do programa. Usando o ficheiro de recuperación para restabelecer os axustes: %1 + + Detected unclean program exit. Using fallback file to restore settings. + Detectouse unha saída anormal do programa. Usando o ficheiro de recuperación para restabelecer os axustes. - + An access error occurred while trying to write the configuration file. Produciuse un erro de acceso cando se tentaba escribir o ficheiro de configuración. - + A format error occurred while trying to write the configuration file. Produciuse un erro de formato cando se tentaba escribir o ficheiro de configuración. - - - An unknown error occurred while trying to write the configuration file. - Produciuse un erro descoñecido cando se tentaba escribir o ficheiro de configuración. - - RSS::AutoDownloader + RSS - - - Invalid data format. - O formato dos datos non é válido. + + Search + Buscar - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - Non foi posíbel gardar os datos do descargador automátido de RSS en %1. Erro: %2 + + New subscription + Subscrición nova - - Invalid data format - O formato dos datos non é válido + + + + Mark items read + Marcar como lidos - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - Non foi posíbel ler as regras do descargador automátido de RSS en %1. Erro: %2 - - - - Couldn't load RSS AutoDownloader rules. Reason: %1 - Non foi posíbel cargar as regras do descargador automático de RSS. Razón: %1 - - - - RSS::Feed - - - Failed to download RSS feed at '%1'. Reason: %2 - Produciuse un fallo descargando a fonte RSS en: %1. Razón: %2 - - - - RSS feed at '%1' updated. Added %2 new articles. - Actualizouse a fonte RSS de «%1». Engadidos %2 artigos novos. - - - - Failed to parse RSS feed at '%1'. Reason: %2 - Produciuse un fallo analizando a fonte RSS de «%1». Razón: %2 - - - - Couldn't read RSS Session data from %1. Error: %2 - Non foi posíbel ler os datos da sesión RSS de %1. Erro: %2 - - - - Couldn't parse RSS Session data. Error: %1 - Non foi posíbel analizar os datos da sesión RSS: %1 - - - - Couldn't load RSS Session data. Invalid data format. - Non foi posíbel cargar os datos da sesión RSS. O formato dos datos non é válido. - - - - Couldn't load RSS article '%1#%2'. Invalid data format. - Non foi posíbel cargar o artigo RSS «%1#%2». O formato dos datos non é válido. - - - - RSS::Private::Parser - - - Invalid RSS feed. - Fonte RSS incorrecta. - - - - %1 (line: %2, column: %3, offset: %4). - %1 (liña: %2, columna: %3, compensación: %4). - - - - RSS::Session - - - RSS feed with given URL already exists: %1. - Xa existe unha fonte RSS con esa URL: %1 - - - - Cannot move root folder. - Non é posíbel mover o cartafol raíz. - - - - - Item doesn't exist: %1. - O elemento non existe: %1. - - - - Cannot delete root folder. - Non é posíbel eliminar o cartafol raíz. - - - - Incorrect RSS Item path: %1. - Ruta incorrecta ao elemento do RSS: %1 - - - - RSS item with given path already exists: %1. - Xa existe un elemento RSS con esa ruta: %1 - - - - Parent folder doesn't exist: %1. - O cartafol pai non existe: %1. - - - - RSSWidget - - - Search - Buscar - - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - A busca de fontes RSS está desactivada. Pode activala nos axustes do aplicativo. - - - - New subscription - Subscrición nova - - - - - - Mark items read - Marcar como lidos - - - - Refresh RSS streams - Actualizar os fluxos RSS - - - + Update all Actualizar todos - + RSS Downloader... Xestor de descargas RSS... - + + Settings... + Axustes... + + + Torrents: (double-click to download) Torrents: (dobre clic para descargar) - - + + Delete Eliminar - + Rename... Cambiar o nome... - + Rename Cambiar o nome - - + + Update Actualizar - + New subscription... Subscrición nova... - - + + Update all feeds Actualizar todas as fontes - + Download torrent Descargar o torrent - + Open news URL - Abrir a URL das novas + Abrir a URL - + Copy feed URL Copiar a URL da fonte - + New folder... Cartafol novo... - + + Refresh RSS streams + Actualizar os fluxos RSS + + + + RSSImp + + + Stream URL: + URL de fluxo: + + + + Please type a RSS stream URL + Escriba unha url do fluxo rss + + + + This RSS feed is already in the list. + A fonte rss xa está na lista. + + + Please choose a folder name Seleccione un nome de cartafol - + Folder name: Nome do cartafol: - + New folder Cartafol novo - - Please type a RSS feed URL - Escriba unha URL de fonte RSS - - - - Feed URL: - URL da fonte: - - - + Deletion confirmation - Confirmación da eliminación + Confirmación de eliminación - + Are you sure you want to delete the selected RSS feeds? Confirma a eliminación das fontes RSS seleccionadas? - + Please choose a new name for this RSS feed Escolla un nome novo para esta fonte RSS - + New feed name: Nome novo da fonte: - - Rename failed - O cambio de nome fallou + + Name already in use + O nome xa existe + + + + This name is already used by another item, please choose another one. + Este nome xa está usado por un elemento, escolla outro. - + Date: Data: - + Author: Autor: + + + Unread + Sen ler + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + A descarga automática de «%1» desde a fonte RSS «%2» fallou porque non contén ningún torrent nin ligazón magnet. + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + Descargando automaticamente %1 torrents desde %2 fontes RSS... + + + + Rss::Private::Parser + + + Invalid RSS feed. + Fonte RSS incorrecta. + + + + RssSettingsDlg + + + RSS Reader Settings + Axustes do lector RSS + + + + RSS feeds refresh interval: + Intervalo de actualización de fontes RSS: + + + + min + min. + + + + Maximum number of articles per feed: + Número máximo de artigos por fonte: + ScanFoldersDelegate - + Select save location Seleccionar localización onde gardar @@ -7450,274 +6704,268 @@ ScanFoldersModel - + Monitored Folder Cartafol monitorizado - + Override Save Location Substituír a localización onde gardar - + Monitored folder Cartafol monitorizado - + Default save location Localización predeterminada onde gardar - + Browse... Explorar... - SearchJobWidget + SearchEngine - - Form - Formato + + Unknown search engine plugin file format. + Formato descoñecido do ficheiro co engadido do motor de busca. - - Results(xxx) - Resultados(xxx) + + A more recent version of this plugin is already installed. + Xa está instalada unha versión máis recente do engadido. - - Search in: - Buscar en: + + + Plugin is not supported. + O engadido non é compatíbel. + + + + Update server is temporarily unavailable. %1 + O servidor de actualizacións non está dispoñíbel temporalmente. %1 - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - <html><head/><body><p>Algúns motores de busca procuran na descrición dos torrents e tamén nos nomes. Este modo controla se eses resultados se mostrarán na lista inferior.</p><p><span style=" font-weight:600;">En todas partes</span>desactiva os filtros e mostra a totalidade dos resultados dos motores de busca.</p><p><span style=" font-weight:600;">Só nos nomes dos torrents</span> mostra unicamente os torrents cos nomes que coinciden coa petición.</p></body></html> + + + Failed to download the plugin file. %1 + Produciuse un fallo ao descargar o ficheiro do engadido. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - <html><head/><body><p>Estabelecer o número mínimo e máximo permitidos de sementadores</p></body></html> + + An incorrect update info received. + Recibiuse unha información incorrecta da actualización.º - - Seeds: - Sementes: + + All categories + Todas as categorías - - <html><head/><body><p>Minimal number of seeds</p></body></html> - <html><head/><body><p>Número mínimo de sementes</p></body></html> + + Movies + Películas - - - to - a + + TV shows + Programas de TV - - <html><head/><body><p>Maximal number of seeds</p></body></html> - <html><head/><body><p>Número máximo de sementes</p></body></html> + + Music + Música - - - - + + Games + Xogos - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - <html><head/><body><p>Estabelecer o tamaño máximo e mínimo permitidos para un torrent</p></body></html> + + Anime + Anime - - Size: - Tamaño: + + Software + Software - - <html><head/><body><p>Minimal torrent size</p></body></html> - <html><head/><body><p>Tamaño mínimo do torrent</p></body></html> + + Pictures + Imaxes - - <html><head/><body><p>Maximal torrent size</p></body></html> - <html><head/><body><p>Tamaño máximo do torrent</p></body></html> + + Books + Libros + + + + SearchListDelegate + + + + Unknown + Descoñecido + + + SearchTab - + Name i.e: file name Nome - + Size i.e: file size Tamaño - + Seeders i.e: Number of full sources Sementadores - + Leechers i.e: Number of partial sources Pares incompletos - + Search engine Motor de busca - - Filter search results... - Filtrar resultados da busca... - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results Resultados (mostrando <i>%1</i> de <i>%2</i>): - + Torrent names only Só nos nomes dos torrents - + Everywhere En todo - - Use regular expressions - Usar expresións regulares - - - + Searching... Buscando... - + Search has finished A busca rematou - + Search aborted Busca cancelada - + An error occurred during search... Produciuse un erro durante a busca... - + Search returned no results A busca non obtivo resultados - + Column visibility - Visibilidade da columna - - - - SearchPluginManager - - - Unknown search engine plugin file format. - Formato descoñecido do ficheiro co engadido do motor de busca. + Visibilidade da columna - - A more recent version of this plugin is already installed. - Xa está instalada unha versión máis recente do engadido. - - - - - Plugin is not supported. - O engadido non é compatíbel. + + Form + Formato - - All categories - Todas as categorías + + Results(xxx) + Resultados(xxx) - - Movies - Películas + + Search in: + Buscar en: - - TV shows - Programas de TV + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Algúns motores de busca procuran na descrición dos torrents e tamén nos nomes. Este modo controla se eses resultados se mostrarán na lista inferior.</p><p><span style=" font-weight:600;">En todo </span>desactiva os filtros e mostra a totalidade dos resultados dos motores de busca.</p><p><span style=" font-weight:600;">Só nos nomes dos torrents</span> mostra unicamente os torrents cos nomes que coinciden coa petición.</p></body></html> - - Music - Música + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Estabelecer o número mínimo e máximo permitidos de sementadores</p></body></html> - - Games - Xogos + + Seeds: + Sementes: - - Anime - Anime + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Número mínimo de sementes</p></body></html> - - Software - Software + + + to + a - - Pictures - Imaxes + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Número máximo de sementes</p></body></html> - - - Books - Libros + + + + + - - Update server is temporarily unavailable. %1 - O servidor de actualizacións non está dispoñíbel temporalmente. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Estabelecer o tamaño máximo e mínimo permitidos para un torrent</p></body></html> - - - Failed to download the plugin file. %1 - Produciuse un fallo ao descargar o ficheiro do engadido. %1 + + Size: + Tamaño: - - An incorrect update info received. - Recibiuse unha información incorrecta da actualización.º + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Tamaño mínimo do torrent</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - O engadido de busca «%1» contén unha cadea incorrecta da versión («%2») + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Tamaño máximo do torrent</p></body></html> @@ -7725,198 +6973,185 @@ - - - - + + + Search Buscar - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - Non hai engadidos de busca instalados. -Prema no botón «Engadidos de busca...» na parte inferior dereita da xanela para instalar algún. - - - + Download Descargar - + Go to description page Ir á páxina da descrición - + Copy description page URL Copiar URL da páxina coa descrición - + Search plugins... Engadidos de busca - + A phrase to search for. Unha frase que buscar. - + Spaces in a search term may be protected by double quotes. Os espazos nos termos de busca poden protexerse con comiñas. - + Example: Search phrase example Exemplo: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>: buscar <b>foo</b> e <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: buscar <b>foo bar</b> - + All plugins Todos os engadidos - + Only enabled - Activados + Localización predeterminada onde gardar - + Select... Seleccionar... - - - + + + Search Engine - Buscador + Motor de busca - + Please install Python to use the Search Engine. Instale Python para usar o motor de busca. - + Empty search pattern Patrón de busca baleiro - + Please type a search pattern first Escriba primeiro o patrón de busca - + Stop Parar - + Search has finished A busca rematou - + Search has failed A busca fallou - ShutdownConfirmDialog + ShutdownConfirmDlg - - Don't show again - Non mostrar de novo - - - + qBittorrent will now exit. O qBittorrent vai pechar. - + E&xit Now S&aír agora - + Exit confirmation Confirmación de saída - + The computer is going to shutdown. O computador vai pechar. - + &Shutdown Now &Pechar agora - - Shutdown confirmation - Confirmación de peche - - - + The computer is going to enter suspend mode. O computador vai entrar en modo suspensión. - + &Suspend Now &Suspender agora - + Suspend confirmation Confirmación da suspensión - + The computer is going to enter hibernation mode. O computador vai entrar en modo hibernación. - + &Hibernate Now &Hibernar agora - + Hibernate confirmation Confirmación de hibernación - + You can cancel the action within %1 seconds. Pode cancelar a acción antes de %1 segundos. + + + Shutdown confirmation + Confirmación de peche + SpeedLimitDialog - + KiB/s KiB/s @@ -7924,52 +7159,52 @@ SpeedPlotView - + Total Upload Total enviado - + Total Download Total descargado - + Payload Upload Envío dos datos principais - + Payload Download Descarga dos datos principais - + Overhead Upload Datos complementarios do envío - + Overhead Download Datos complementarios da descarga - + DHT Upload Envío DHT - + DHT Download Descarga DHT - + Tracker Upload Envío ao localizador - + Tracker Download Descarga do localizador @@ -7977,95 +7212,87 @@ SpeedWidget - + Period: Período: - + 1 Minute 1 minuto - + 5 Minutes 5 minutos - + 30 Minutes 30 - + 6 Hours 6 horas - + Select Graphs Seleccionar gráficos - + Total Upload Total enviado - + Total Download Total descargado - + Payload Upload Envío dos datos principais - + Payload Download Descarga dos datos principais - + Overhead Upload Datos complementarios do envío - + Overhead Download Datos complementarios da descarga - + DHT Upload Envío DHT - + DHT Download Descarga DHT - + Tracker Upload Envío ao localizador - + Tracker Download Descarga do localizador - StacktraceDialog - - - Crash info - Información do fallo - - - StatsDialog @@ -8078,49 +7305,49 @@ Estadísticas de usuario - - Cache statistics - Estadísticas da caché + + Total peer connections: + Conexións totais con pares: - - Read cache hits: - Accesos á caché de lectura: + + Global ratio: + Taxa global: - - Average time in queue: - Tempo medio na cola: + + Alltime download: + Descarga absoluta: - - Connected peers: - Pares conectados: + + Alltime upload: + Envío absoluto: - - All-time share ratio: - Taxa de compartición total: + + Total waste (this session): + Desbotado total (esta sesión): - - All-time download: - Descarga total: + + Cache statistics + Estadísticas da caché - - Session waste: - Desbotado na sesión: + + Read cache hits: + Accesos á caché de lectura: - - All-time upload: - Envío total: + + Average time in queue: + Tempo medio na cola: - Total buffer size: - Tamaño total do búfer: + Total buffers size: + Tamaño total dos búferes: @@ -8148,7 +7375,12 @@ Tamaño total da cola: - + + OK + Aceptar + + + %1 ms 18 milliseconds %1 ms @@ -8157,29 +7389,34 @@ StatusBar - + Connection status: Estado da conexión: - + No direct connections. This may indicate network configuration problems. Non hai conexións directas. Isto pode significar que hai problemas na configuración da rede. - + DHT: %1 nodes DHT: %1 nodos - - qBittorrent needs to be restarted! + + qBittorrent needs to be restarted É necesario reiniciar o qBittorrent + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + O qBittorrent foi actualizado e necesita reiniciarse para que os cambios sexan efectivos. + + Connection Status: @@ -8196,883 +7433,616 @@ Conectado - + Click to switch to alternative speed limits Prema para cambiar aos límites alternativos de velocidade - + Click to switch to regular speed limits Prema para cambiar aos límites normais de velocidade - + + Manual change of rate limits mode. The scheduler is disabled. + Cambio manual do modo de límites de velocidade. O programador está desactivado. + + + Global Download Speed Limit Límite global de velocidade de descarga - + Global Upload Speed Limit Límite global de velocidade de envío - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter Todos (0) - + Downloading (0) Descargando (0) - + Seeding (0) Sementando (0) - + Completed (0) - Completados (0) + Completado (0) - + Resumed (0) Continuado (0) - + Paused (0) - Detidos (0) + Detido (0) - + Active (0) - Activos (0) + Activo (0) - + Inactive (0) - Inactivos (0) + Inactivo (0) - + Errored (0) - Con erros (0) + Atopouse o erro (0) - + All (%1) Todos (%1) - + Downloading (%1) Descargando (%1) - + Seeding (%1) Sementando (%1) - + Completed (%1) - Completados (%1) + Completado (%1) - + Paused (%1) - Detidos (%1) + Detido (%1) - + Resumed (%1) - Comezados (%1) + Continuado (%1) - + Active (%1) - Activos (%1) + Activo (%1) - + Inactive (%1) - Inactivos (%1) + Inactivo (%1) - + Errored (%1) - Con erros (%1) + Atopouse o erro (%1) - TagFilterModel + TorrentContentModel - - Tags - Etiquetas + + Name + Nome - - All - Todos + + Size + Tamaño - - Untagged - Sen etiquetar + + Progress + Progreso - - - TagFilterWidget - - Add tag... - Engadir unha etiqueta... + + Download Priority + Prioridade da descarga - - Remove tag - Eliminar etiqueta + + Remaining + Restante + + + TorrentCreatorDlg - - Remove unused tags - Eliminar as etiquetas non usadas + + Select a folder to add to the torrent + Seleccionar un cartafol para engadir ao torrent - - Resume torrents - Continuar os torrents + + Select a file to add to the torrent + Seleccionar un ficheiro para engadir ao torrent - - Pause torrents - Deter os torrents + + No input path set + Non se estabeleceu unha ruta de entrada - - Delete torrents - Eliminar os torrents + + Please type an input path first + Escriba primeiro unha ruta de entrada - - New Tag - Etiqueta nova + + Select destination torrent file + Seleccionar o destino para o ficheiro torrent - - Tag: - Etiqueta: + + Torrent Files (*.torrent) + Ficheiros torrent (*.torrent) - - Invalid tag name - O nome da etiqueta non é correcto + + Torrent was created successfully: %1 + %1 is the path of the torrent + O torrent creouse correctamente: %1 - - Tag name '%1' is invalid - O nome da etiqueta «%1» non é válido + + + + Torrent creation + Crear un torrent - - Tag exists - A etiqueta xa existe + + Torrent creation was unsuccessful, reason: %1 + A creación do torrent fallou, razón:%1 - - Tag name already exists. - O nome da etiqueta xa existe. + + Created torrent file is invalid. It won't be added to download list. + O ficheiro torrent creado non é válido. Non será engadido á lista de descargas. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Propiedades da categoría dos torrents + + Name + i.e: torrent name + Nome - - Name: - Nome: + + Size + i.e: torrent size + Tamaño - - Save path: - Ruta onde gardar: + + Done + % Done + Feito - - Choose save path - Seleccionar a ruta onde gardar + + Status + Torrent status (e.g. downloading, seeding, paused) + Estado - - New Category - Nova categoría + + Seeds + i.e. full sources (often untranslated) + Sementes - - Invalid category name - Nome incorrecto para categoría + + Peers + i.e. partial sources (often untranslated) + Pares - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - O nome da categoría non debe conter «\». -O nome da categoría non debe comezar/rematar con «/» -O nome da categoría non debe conter a secuencia «//». + + Down Speed + i.e: Download speed + Vel. de descarga - - Category creation error - Produciuse en erro creando a categoría + + Up Speed + i.e: Upload speed + Vel. de envío - - Category with the given name already exists. -Please choose a different name and try again. - Xa existe unha categoría co nome inidicado. -Seleccione un nome diferente e ténteo de novo. + + Ratio + Share ratio + Taxa - - - TorrentContentModel - - Name - Nome + + ETA + i.e: Estimated Time of Arrival / Time left + Tempo restante - - Size - Tamaño + + Category + Categoría - - Progress - Progreso + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Engadido o - - Download Priority - Prioridade da descarga + + Completed On + Torrent was completed on 01/01/2010 08:00 + Completado o - - Remaining - Restante + + Tracker + Localizador - - Availability - Dispoñíbilidade + + Down Limit + i.e: Download limit + Límite de descarga - - - TorrentCreatorDialog - - Torrent Creator - Creador de torrents + + Up Limit + i.e: Upload limit + Límite de envío - - Select file/folder to share - Seleccionar o ficheiro/cartafol a compartir + + Downloaded + Amount of data downloaded (e.g. in MB) + Descargado - - Path: - Ruta: + + Uploaded + Amount of data uploaded (e.g. in MB) + Enviado - - [Drag and drop area] - [Área para arrastrar e soltar] + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Desc. na sesión - - - Select file - Seleccionar ficheiro + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Env. na sesión - - - Select folder - Seleccionar cartafol + + Remaining + Amount of data left to download (e.g. in MB) + Restante - - Settings - Axustes + + Time Active + Time (duration) the torrent is active (not paused) + Tempo en activo - - Piece size: - Tamaño do anaco: + + Save path + Torrent save path + Ruta onde gardar - - Auto - Automático + + Completed + Amount of data completed (e.g. in MB) + Completado - - 16 KiB - 16 KiB + + Ratio Limit + Upload share ratio limit + Límite da taxa - - 32 KiB - 32 KiB + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Visto completo por última vez - - 64 KiB - 64 KiB + + Last Activity + Time passed since a chunk was downloaded/uploaded + Última actividade - - 128 KiB - 128 KiB + + Total Size + i.e. Size including unwanted data + Tamaño total + + + TrackerFiltersList - - 256 KiB - 256 KiB + + All (0) + this is for the tracker filter + Todos (0) - - 512 KiB - 512 KiB + + Trackerless (0) + Sen localizador (0) - - 1 MiB - 1 MiB + + Error (0) + Erro (0) - - 2 MiB - 2 MiB + + Warning (0) + Aviso (0) - - 4 MiB - 4 MiB + + + Trackerless (%1) + Sen localizador (%1) - - 8 MiB - 8 MiB + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - 16 MiB - 16 MiB + + + Error (%1) + Erro (%1) - - 32 MiB - 32 MiB + + + Warning (%1) + Aviso (%1) - - Calculate number of pieces: - Calcular o número de anacos: - - - - Private torrent (Won't distribute on DHT network) - Torrent privado (non se distribuirá na rede DHT) - - - - Start seeding immediately - Iniciar a semente inmediatamente - - - - Ignore share ratio limits for this torrent - Ignorar os límites da taxa de compartición para este torrent - - - - Optimize alignment - Optimizar aliñamento - - - - Fields - Campos - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - Pode separar os grupos / tiers de localizadores cunha liña en branco. - - - - Web seed URLs: - URLs da semente web: - - - - Tracker URLs: - URLs do localizador: - - - - Comments: - Comentarios: - - - - Source: - Fonte: - - - - Progress: - Progreso: - - - - Create Torrent - Crear torrent - - - - - - Torrent creation failed - Produciuse un fallo na creación do torrent - - - - Reason: Path to file/folder is not readable. - Razón: non é posíbel ler a ruta ao cartafol/ficheiro. - - - - Select where to save the new torrent - Seleccionar onde gardar o torrent novo - - - - Torrent Files (*.torrent) - Ficheiros torrent (*.torrent) - - - - Reason: %1 - Razón: %1 - - - - Reason: Created torrent is invalid. It won't be added to download list. - Razón: o ficheiro torrent creado non é válido. Non será engadido á lista de descargas. - - - - Torrent creator - Creador de torrents - - - - Torrent created: - Creouse o torrent: + + Resume torrents + Continuar os torrents - - - TorrentInfo - - File size exceeds max limit %1 - O tamaño do ficheiro excede o límite máximo %1 + + Pause torrents + Deter os torrents - - Torrent file read error: %1 - Erro de lectura do ficheiro torrent: %1 + + Delete torrents + Eliminar os torrents - - Torrent file read error: size mismatch - Erro de lectura do ficheiro torrent: o tamaño no coincide + + + All (%1) + this is for the tracker filter + Todos (%1) - TorrentsController - - - Not contacted yet - Aínda sen contactar - - - - Updating... - Actualizando... - - - - Working - Funcionando - - - - Not working - Non funcionando - - - - Error: '%1' is not a valid torrent file. - Erro: «%1» non é un ficheiro torrent correcto. - - - - - - - Torrent queueing must be enabled - A cola de torrents debe estar activada - - - - Save path cannot be empty - - + TrackerList - - - Category cannot be empty - + + URL + URL - - Unable to create category - + + Status + Estado - - Unable to edit category + + Received - Save path is empty - A ruta de gardado está baleira - - - - Cannot make save path - Non é posíbel facer unha ruta de gardado - - - - Cannot write to directory - Non é posíbel escribir no cartafol - - - - WebUI Set location: moving "%1", from "%2" to "%3" - Localización da interface web: movendo «%1» de «%2» a «%3» - - - - Incorrect torrent name - Nome incorrecto de torrent - - - - - Incorrect category name - Nome incorrecto de categoría - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - Todos (0) - - - - Trackerless (0) - Sen localizador (0) - - - - Error (0) - Erro (0) - - - - Warning (0) - Aviso (0) - - - - - Trackerless (%1) - Sen localizador (%1) - - - - - Error (%1) - Erro (%1) - - - - - Warning (%1) - Aviso (%1) - - - - Resume torrents - Continuar os torrents + + Seeds + Sementes - - Pause torrents - Deter os torrents + + Peers + Pares - - Delete torrents - Eliminar os torrents + + Downloaded + Descargado - - - All (%1) - this is for the tracker filter - Todos (%1) + + Message + Mensaxe - - - TrackerListWidget - - + + Working Funcionando - + Disabled Desactivado - + This torrent is private Este torrent é privado - + Updating... Actualizando... - + Not working Inactivo - + Not contacted yet - Aínda sen contactar + Aínda sen conexión - - - - - - - N/A - N/D + + Tracker URL: + URL do localizador: - + Tracker editing Edición do localizador - - Tracker URL: - URL do localizador: - - - - + + Tracker editing failed Fallou a edición do localizador - + The tracker URL entered is invalid. A URL introducida para o localizador non é correcta. - + The tracker URL already exists. A URL do localizador xa existe. - + Add a new tracker... Engadir un novo localizador... - - Remove tracker - Eliminar o localizador - - - + Copy tracker URL - Copiar url dos localizadores + Copiar a url do localizador - + Edit selected tracker URL Editar a URL do localizador seleccionado - + Force reannounce to selected trackers Forzar outro anuncio nos localizadores seleccionados - + Force reannounce to all trackers Forzar outro anuncio en todos os localizadores - - URL - URL - - - - Status - Estado - - - - Received - Recibido - - - - Seeds - Sementes - - - - Peers - Pares - - - - Downloaded - Descargado - - - - Message - Mensaxe - - - - Column visibility - Visibilidade da columna - - - - TrackerLoginDialog - - - - Tracker authentication - Autenticación do localizador - - - - Tracker: - Localizador: - - - - Login - Iniciar sesión - - - - Username: - Nome do usuario: - - - - Password: - Contrasinal: - - - - Log in - Iniciar sesión + + Remove tracker + Eliminar o localizador - TrackersAdditionDialog + TrackersAdditionDlg - + Trackers addition dialog Diálogo de adición de localizadores - + List of trackers to add (one per line): Lista de localizadores a engadir (un por liña): - - + + µTorrent compatible list URL: URL da lista compatíbel con µTorrent: - + + I/O Error + Erro de E/S + + + + Error while trying to open the downloaded file. + Produciuse un erro mentres se tentaba abrir o ficheiro descargado. + + + No change Sen cambios - + No additional trackers were found. - Non se encontraron localizadores adicionais. + Non se encontraron localizadores novos. - + Download error Erro de descarga - + The trackers list could not be downloaded, reason: %1 Non foi posíbel descargar a lista de localizadores, razón: %1 @@ -9080,105 +8050,99 @@ TransferListDelegate - + Downloading Descargando - + Downloading metadata used when loading a magnet link Descargando os metadatos - + Allocating qBittorrent is allocating the files on disk Asignando - + Paused Detido - + Queued i.e. torrent is queued Na cola - + Seeding Torrent is complete and in upload-only mode Sementando - + Stalled Torrent is waiting for download to begin Á espera - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] Descargando - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] Sementando - + Checking Torrent local data is being checked Comprobando - + Queued for checking i.e. torrent is queued for hash checking Na cola de comprobación - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Comprobando os datos para continuar - + Completed Completados - - Moving - Torrent local data are being moved/relocated - Movendo - - - + Missing Files Ficheiros que faltan - + Errored torrent status, the torrent has an error - Con erros + Atopouse un erro - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (sementado durante %2) - + %1 ago e.g.: 1h 20m ago Hai %1 @@ -9186,580 +8150,594 @@ TransferListFiltersWidget - - - Status - Estado - - - - Categories - Categorías - - - - Tags - Etiquetas - - - - Trackers - Localizadores - - - - TransferListModel - - - Name - i.e: torrent name - Nome - - - - Size - i.e: torrent size - Tamaño - - - - Done - % Done - Feito - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Estado - - - - Seeds - i.e. full sources (often untranslated) - Sementes - - - - Peers - i.e. partial sources (often untranslated) - Pares - - - - Down Speed - i.e: Download speed - Vel. de descarga - - - - Up Speed - i.e: Upload speed - Vel. de envío - - - - Ratio - Share ratio - Taxa - - - - ETA - i.e: Estimated Time of Arrival / Time left - Tempo restante - - - - Category - Categoría - - - - Tags - Etiquetas - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - Engadido o - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - Completado o - - - - Tracker - Localizador - - - - Down Limit - i.e: Download limit - Límite de descarga - - - - Up Limit - i.e: Upload limit - Límite de envío - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Descargado - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Enviado - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - Desc. na sesión - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - Env. na sesión - - - - Remaining - Amount of data left to download (e.g. in MB) - Restante - - - - Time Active - Time (duration) the torrent is active (not paused) - Tempo en activo - - - - Save path - Torrent save path - Gardar a ruta - - - - Completed - Amount of data completed (e.g. in MB) - Completado - - - - Ratio Limit - Upload share ratio limit - Límite da taxa - - - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - Visto completo por última vez + + + Status + Estado - - Last Activity - Time passed since a chunk was downloaded/uploaded - Última actividade + + Categories + Categorías - - Total Size - i.e. Size including unwanted data - Tamaño total + + Trackers + Localizadores TransferListWidget - + Column visibility Visibilidade da columna - + Choose save path Seleccionar unha ruta onde gardar - + Torrent Download Speed Limiting Límites da velocidade de descarga do torrent - + Torrent Upload Speed Limiting Límites da velocidade de envío do torrent - + Recheck confirmation Confirmación da nova comprobación - + Are you sure you want to recheck the selected torrent(s)? - Desexa unha nova comprobación dos torrents seleccionados? + Está seguro que desexa comprobar de novo os torrents seleccionados? - + Rename Cambiar o nome - + New name: Nome novo: - + Resume Resume/start the torrent Continuar - + Force Resume Force Resume/start the torrent Forzar continuación - + Pause Pause the torrent Deter - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Estabelecer localización: movendo «%1» de «%2» a «%3» - - - - Add Tags - Engadir etiquetas - - - - Remove All Tags - Eliminar todas as etiquetas - - - - Remove all tags from selected torrents? - Desexa eliminar todas as etiquetas dos torrents seleccionados? + + New Category + Nova categoría - - Comma-separated tags: - Etiquetas separadas por comas: + + Category: + Categoría: - - Invalid tag - Etiqueta incorrecta + + Invalid category name + Nome incorrecto para categoría - - Tag name: '%1' is invalid - O nome da etiqueta: «%1» non é válido + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + O nome da categoría non debe conter «\». +O nome da categoría non debe comezar/rematar con «/» +O nome da categoría non debe conter a secuencia «//». - + Delete Delete the torrent Eliminar - + Preview file... Previsualizar o ficheiro... - + Limit share ratio... Límite da taxa de compartición... - + Limit upload rate... Límite da velocidade de envío... - + Limit download rate... Límite da velocidade de descarga... - + Open destination folder Abrir o cartafol de destino - + Move up i.e. move up in the queue Mover arriba - + Move down i.e. Move down in the queue Mover abaixo - + Move to top i.e. Move to top of the queue Mover ao principio - + Move to bottom i.e. Move to bottom of the queue Mover ao final - + Set location... Estabelecer a localización... - - Force reannounce - Forzar outro anuncio - - - + Copy name Copiar o nome - - Copy hash - Copiar «hash» - - - + Download first and last pieces first Descargar primeiro os anacos inicial e final - + Automatic Torrent Management Xestión automática dos torrents - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category O modo automático significa que varias propiedades dos torrents (p.e: ruta onde gardar) decidiraas a categoría asociada - + Category Categoría - + New... New category... Nova... - + Reset Reset category Restabelecer - - Tags - Etiquetas - - - - Add... - Add / assign multiple tags... - Engadir... - - - - Remove All - Remove all tags - Eliminar todas - - - + Priority Prioridade - + Force recheck Forzar outra comprobación - + Copy magnet link Copiar a ligazón magnet - + Super seeding mode Modo super-sementeira - + Rename... Cambiar o nome... - + Download in sequential order Descargar en orde secuencial - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting Límites da taxa de Envío/Descarga do torrent - - Use global share limit - Usar o límite global de compartición + + Use global ratio limit + Usar o límite da taxa global - - - + + + buttonGroup buttonGroup - - Set no share limit - Non estabelecer límite de compartición + + Set no ratio limit + Non estabelecer límite na taxa + + + + Set ratio limit to + Estabelecer o límite da taxa en + + + + WebApplication + + + Incorrect category name + Nome incorrecto para categoría + + + + WebUI + + + The Web UI is listening on port %1 + A interface web está escoitando no porto %1 + + + + Web UI Error - Unable to bind Web UI to port %1 + Erro na interface de usuario web - Non é posíbel conectar a interface web ao porto %1 + + + about - - Set share limit to - Estabelecer o límite de compartición en + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Cliente BitTorrent avanzado programado en C++, baseado no QT toolkit e no libtorrent-rasterbar. - - ratio - taxa + + Copyright %1 2006-2016 The qBittorrent project + Dereitos de autor ©2006-2016 The qBittorrent project - - minutes - minutos + + Home Page: + Páxina web: - - No share limit method selected - Non seleccionou un método para limitar a compartición + + Forum: + Foro: - - Please select a limit method first - Seleccione primeiro un método para os límites + + Bug Tracker: + Seguimento de fallos: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - Detectouse Python, versión: %1 + + Add Peers + Engadir pares - - Python not detected - Non se detectou Python + + List of peers to add (one per line): + Lista de pares a engadir (un por liña): + + + + Format: IPv4:port / [IPv6]:port + Formato: IPv4:porto / [IPv6]:porto - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - Tipo de ficheiro non permitido, só se permite o ficheiro normal. + + + Tracker authentication + Autenticación do localizador - - Symlinks inside alternative UI folder are forbidden. - As ligazóns simbólicas están prohibidas dentro do cartafol da interface de usuario alternativa. + + Tracker: + Localizador: - - Exceeded the maximum allowed file size (%1)! - Excedeuse o tamaño máximo de ficheiro permitido (%1) + + Login + Iniciar sesión - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - Interface web: a cabeceira da orixe e do destino non coinciden. IP da orixe: «%1». Cabeceira da orixe: «%2». Orixe do destino: «%3» + + Username: + Nome do usuario: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - Interface web: a cabeceira do referente e a orixe do destino non coinciden. IP da orixe: «%1». Cabeceira do referente: «%2». Orixe do destino: «%3» + + Password: + Contrasinal: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - Interface web: a cabeceira do servidor e o porto non coinciden. IP da orixe da petición: «%1». Porto do servidor: «%2». Cabeceira do servidor: «%3» + + Log in + Iniciar sesión - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - Interface web: A cabeceira do servidor non é válida. IP da orixe da petición: «%1». Cabeceira recibida do servidor: «%2» + + Cancel + Cancelar - WebUI + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + Confirmación de eliminación - 'qBittorrent + + + + Remember choice + Lembrar a elección + + + + Also delete the files on the hard disk + Eliminar tamén os ficheiros do disco duro + + + + confirmShutdownDlg + + + Don't show again + Non mostrar de novo + + + + createTorrentDialog + + + Cancel + Cancelar + + + + Torrent Creation Tool + Ferramenta para a creación de torrents + + + + Torrent file creation + Crear un ficheiro torrent + + + + Add file + Engadir un ficheiro + + + + Add folder + Engadir un cartafol + + + + File or folder to add to the torrent: + Ficheiro ou cartafol para engadir ao torrent: + + + + Tracker URLs: + URLs do localizador: + + + + Web seeds urls: + URLs das sementes web: + + + + Comment: + Comentario: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Pode separar os grupos / tiers de localizadores cunha liña en branco. + + + + Piece size: + Tamaño do anaco: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + Automático + + + + Private (won't be distributed on DHT network if enabled) + Privado (se está activado non se distribuirá na rede DHT) + - - Web UI: HTTPS setup successful - Interface web: o HTTPS configurouse correctamente + + Start seeding after creation + Iniciar a sementeira despois da creación - - Web UI: HTTPS setup failed, fallback to HTTP - Interface web: produciuse un fallo na configuración do HTTPS, vólvese ao HTTP + + Ignore share ratio limits for this torrent + Ignorar os límites da taxa de compartición para este torrent + + + + Create and save... + Crear e gardar... + + + + Progress: + Progreso: + + + + downloadFromURL + + + Add torrent links + Engadir ligazóns torrent + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Unha por liña (acepta ligazóns HTTP, magnet e info-hash) - - Web UI: Now listening on IP: %1, port: %2 - Interface web: agora está escoitando na IP: %1, porto %2 + + Download + Descargar + + + + Cancel + Cancelar + + + + Download from urls + Descargar desde urls - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Interface web: non é posíbel ligar á IP: %1, porto: %2. Razón: %3 + + No URL entered + Non se introduciu ningunha URL + + + + Please type at least one URL. + Escriba polo menos unha URL. + + + + errorDialog + + + Crash info + Información do fallo fsutils - + + + + + Downloads Descargas @@ -9767,100 +8745,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + Non se detectou Python + + + + Python version: %1 + Versión de Python: %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1h %2m - + %1d %2h e.g: 2days 10hours %1d %2h - + Unknown Unknown (size) Descoñecido - + qBittorrent will shutdown the computer now because all downloads are complete. O qBittorrent vai apagar o computador porque remataron todas as descargas. - + < 1m < 1 minute < 1 m - + %1m e.g: 10minutes %1 m + + + Working + Funcionando + + + + Updating... + Actualizando... + + + + Not working + Inactivo + + + + Not contacted yet + Aínda sen contactar + preview - + Preview selection Previsualizar a selección - + The following files support previewing, please select one of them: Os seguintes ficheiros admiten vista previa, seleccione un deles: + + + Preview + Previsualizar + + + + Cancel + Cancelar + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_he.ts qbittorrent-3.3.15/src/lang/qbittorrent_he.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_he.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_he.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent אודות qBittorrent - + About אודות - + Author מחבר - - Current maintainer - מתחזק נוכחי + + + Nationality: + לאום: - - Greece - יוון + + + Name: + שם: - - - Nationality: - לאום: + + + E-mail: + דואר אלקטרוני: - - - E-mail: - דוא"ל: + + Greece + יוון - - - Name: - שם: + + Current maintainer + מתחזק נוכחי - + Original author מחבר מקורי - - France - צרפת - - - + Special Thanks תודות מיוחדות - + Translators מתרגמים - - License - רשיון - - - + Libraries - סיפריות + ספריות - + qBittorrent was built with the following libraries: - qBittorrent נבנה עם הסיפריות הבאות: - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - לקוח BitTorrent מתקדם המתוכנת ב־C++, מבוסס על ערכת כלים Qt ו־libtorrent-rasterbar. - - - - Copyright %1 2006-2018 The qBittorrent project - זכויות יוצרים %1 2006-2018 מיזם qBittorrent - - - - Home Page: - דף הבית: + qBittorrent נבנה עם הספריות הבאות: - - Forum: - קבוצת דיון: + + France + צרפת - - Bug Tracker: - גשש תקלים: + + License + רשיון @@ -112,60 +87,70 @@ Save at - שמור ב + נתיב שמירה + + + + Browse... + עיון... + + + + Set as default save path + קבע כברירת מחדל של נתיב השמירה - + Never show again - אל תראה שוב אף פעם + אל תציג שוב אף פעם - + Torrent settings הגדרות טורנט - + Set as default category - הגדר כמדור ברירת מחדל + קבע כמדור ברירת מחדל - + Category: מדור: - + Start torrent התחל טורנט - + Torrent information מידע על טורנט - + Skip hash check דלג על בדיקת גיבוב - + Size: גודל: - + Hash: גיבוב: - + Comment: הערה: - + Date: תאריך: @@ -177,7 +162,7 @@ Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - מצב אוטומטי אומר שמאפייני טורנט שונים (לדוגמה, נתיב שמירה) יוחלטו ע"י המדור המשויך + מצב אוטומטי אומר שמאפייני טורנט שונים (לדוגמה, נתיב שמירה) יוחלטו ע"י השיוך למדור @@ -190,117 +175,89 @@ אוטומטי - - Remember last used save path - זכור נתיב שמירה אחרון שהיה בשימוש - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - כאשר מסומן, קובץ הטורנט לא יימחק למרות ההגדרות בדף ההורדה של דו־שיח האפשרויות. + כאשר מסומן, קובץ הטורנט לא יימחק למרות הקביעות בדף ה"הורדה" של דו-שיח האפשרויות. - + Do not delete .torrent file אל תמחק קובץ טורנט - - Create subfolder - צור תיקיית משנה - - - - Download in sequential order - הורד בסדר עוקב - - - - Download first and last pieces first - הורד חתיכה ראשונה ואחרונה תחילה - - - + Normal רגיל - + High גבוה - + Maximum מרבי - + Do not download אל תוריד - - - + + + I/O Error - שגיאת ק/פ + שגיאת קלט-פלט - + Invalid torrent - טורנט לא תקף + טורנט לא תקין - - Renaming - שינוי שם - - - - - Rename error - שגיאת שינוי שם - - - - The name is empty or contains forbidden characters, please choose a different one. - השם ריק או מכיל תוים אסורים, אנא בחר שם שונה. + + + + + Already in download list + קיים כבר ברשימת ההורדות - + Not Available This comment is unavailable לא זמין - + Not Available This date is unavailable לא זמין - + Not available לא זמין - + Invalid magnet link - קישור מגנט לא תקף + קישור מגנט לא תקין - + The torrent file '%1' does not exist. קובץ הטורנט '%1' אינו קיים. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. קובץ הטורנט '%1' אינו יכול להיקרא מהדיסק. כנראה שאין לך מספיק הרשאות. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ שגיאה: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + הטורנט כבר ברשימת ההורדות. גששים לא מוזגו מאחר שזה טורנט פרטי. + + + + Torrent is already in download list. Trackers were merged. + טורנט כבר ברשימת ההורדות. גששים מוזגו. + + + + + Cannot add torrent + לא ניתן להוסיף טורנט + + + + Cannot add this torrent. Perhaps it is already in adding state. + לא ניתן להוסיף טורנט זה. אולי הוא כבר במצב הוספה. + + + This magnet link was not recognized קישור מגנט זה לא זוהה - + + Magnet link is already in download list. Trackers were merged. + קישור מגנט קיים כבר ברשימת ההורדות. גששים מוזגו. + + + + Cannot add this torrent. Perhaps it is already in adding. + לא ניתן להוסיף טורנט זה. אולי הוא כבר בהוספה. + + + Magnet link קישור מגנט - + Retrieving metadata... - מאחזר מטא־נתונים... + מאחזר מטא-נתונים... - + Not Available This size is unavailable. לא זמין - + Free space on disk: %1 - שטח פנוי בכונן: %1 + שטח פנוי בדיסק: %1 - + + Choose save path - בחירת נתיב שמירה - - - - - - - - - Torrent is already present - טורנט נוכח כבר + בחר נתיב שמירה - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - הטורנט '%1' קיים כבר ברשימת ההעברות. גששים לא התמזגו מפני שזה טורנט פרטי. + + Rename the file + שינוי שם הקובץ - - Torrent '%1' is already in the transfer list. Trackers have been merged. - הטורנט '%1' קיים כבר ברשימת ההעברות. גששים התמזגו. - - - - Torrent is already queued for processing. - הטורנט נמצא בתור כבר עבור עיבוד. - - - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - קישור המגנט '%1' קיים כבר ברשימת ההעברות. גששים התמזגו. + + New name: + שם חדש: - - Magnet link is already queued for processing. - קישור המגנט נמצא בתור כבר עבור עיבוד. + + + The file could not be renamed + לא ניתן היה לשנות את שם הקובץ - - New name: - שם חדש: + + This file name contains forbidden characters, please choose a different one. + שם קובץ זה מכיל תוים אסורים, אנא בחר שם שונה. - - + + This name is already in use in this folder. Please use a different name. שם קובץ זה נמצא כבר בשימוש בתיקייה זו. אנא בחר שם שונה. - + The folder could not be renamed - לא היה ניתן לשנות את שם התיקייה + לא ניתן היה לשנות את שם התיקייה - + Rename... שנה שם... - + Priority עדיפות - + Invalid metadata - מטא־נתונים לא תקפים + מטה-נתונים בלתי תקינים - + Parsing metadata... - מאבחן מטא־נתונים... + מאבחן מטה-נתונים... - + Metadata retrieval complete - אחזור מטא־נתונים הושלם + אחזור מטה-נתונים הושלם - + Download Error שגיאת הורדה @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + גודל מטמון לכתיבה בדיסק + + + MiB מ"ב - + Outgoing ports (Min) [0: Disabled] פתחות יוצאות (מיזער) [0: מושבת] - + Outgoing ports (Max) [0: Disabled] פתחות יוצאות (מרב) [0: מושבת] - + Recheck torrents on completion בדוק שוב טורנטים בעת השלמה - + Transfer list refresh interval - מרווח רענון רשימת העברות + מרווח לרענון רשימת העברה - + ms milliseconds מילי שנייה - + Setting - הגדרה + קביעה - + Value Value set for this setting ערך - - - (disabled) - (מושבת) - - - + (auto) (אוטומטי) - - min - minutes - דק' - - - + All addresses כל הכתובות - + qBittorrent Section פלג qBittorrent - - + + Open documentation פתח תיעוד - + libtorrent Section פלג libtorrent - - Asynchronous I/O threads - תהליכוני ק/פ אי־סינכרוניים - - - - Disk cache - מטמון דיסק - - - + s seconds ש' - + Disk cache expiry interval מרווח תפוגת מטמון דיסק - + Enable OS cache אפשר מטמון מערכת הפעלה - - Guided read cache - מטמון קריאה מודרכת - - - - Coalesce reads & writes - לכד קריאות וכתיבות - - - - Send upload piece suggestions - שלח הצעות של חתיכות העלאה - - - - - KiB - ק"ב - - - - Send buffer watermark - שלח סימן מים של חוצץ - - - - Send buffer low watermark - שלח סימן מים נמוך של חוצץ - - - - Send buffer watermark factor - שלח גורם סימן מים של חוצץ - - - - Prefer TCP - העדף TCP - - - - Peer proportional (throttles TCP) - יַחֲסִי עמית (משנקי TCP) - - - - Allow multiple connections from the same IP address - אפשר חיבורים רבים מאותה כתובת IP + + m + minutes + דק' - + Resolve peer countries (GeoIP) פתור מדינות עמיתים (GeoIP) - + Resolve peer host names פתור שמות מארחי עמיתים - + Strict super seeding - זריעה קפדנית־על + זריעה קפדנית-על - + Network Interface (requires restart) ממשק רשת (דורש הפעלה מחדש) - + Optional IP Address to bind to (requires restart) - כתובת IP רשותית לחבור אליה (דורש הפעלה מחדש) + לא חובה - קישור לכתובת IP (דורש הפעלה מחדש) - + Listen on IPv6 address (requires restart) האזן בכתובת IPv6 (דורש הפעלה מחדש) - + Display notifications הצג התראות - + Display notifications for added torrents הצג התראות עבור טורנטים שהתווספו - + Download tracker's favicon - הורד צלמית מועדפים של גשש - - - - Save path history length - אורך היסטורית שמירת נתיבים - - - - Fixed slots - חריצים מקובעים - - - - Upload rate based - מבוסס קצב העלאה - - - - Upload slots behavior - העלה התנהגות חריצים - - - - Round-robin - סבב־רובין + הורד צלמית מועדפים של הגשש - - Fastest upload - העלאה הכי מהירה - - - - Anti-leech - נגד־עלוקה - - - - Upload choking algorithm - העלה אלגוריתם מחנק - - - + Confirm torrent recheck אשר בדיקה מחדש של טורנט - - Confirm removal of all tags - אשר הסרת כל התגיות - - - - Always announce to all trackers in a tier - הכרז תמיד לכל הגששים בנדבך + Exchange trackers with other peers + החלף גששים עם עמיתים אחרים - - Always announce to all tiers - הכרז תמיד לכל הנדבכים + + Always announce to all trackers + הודע תמיד לכל הגששים - + Any interface i.e. Any network interface כל ממשק שהוא - + Save resume data interval How often the fastresume file is saved. מרווח שמירת נתוני המשכה - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - אלגוריתם של מצב מעורבב %1-TCP - - - + Maximum number of half-open connections [0: Unlimited] - מספר מרבי של חיבורים פתוחים למחצה [0: בלתי מוגבל] + מספר מרבי של חיבורים חצי-פתוחים [0: בלתי מוגבל] - + IP Address to report to trackers (requires restart) כתובת IP לדיווח לגששים (דורש הפעלה מחדש) - + Enable embedded tracker אפשר גשש מוטמע - + Embedded tracker port - פתחת גשש מוטמע + פתחה לגשש מוטמע - + Check for software updates בדוק אחר עדכוני תוכנה - + Use system icon theme השתמש בערכת נושא צלמיות של המערכת @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 הותחל - + Torrent: %1, running external program, command: %2 - טורנט: %1, מריץ תוכנית חיצונית, פקודה: %2 - - - - Torrent name: %1 - שם טורנט: %1 - - - - Torrent size: %1 - גודל טורנט: %1 - - - - Save path: %1 - נתיב שמירה: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - הטורנט ירד תוך %1 - - - - Thank you for using qBittorrent. - תודה על השימוש ב־qBittorrent. + טורנט: %1, מריץ תכנית חיצונית, פקודה: %2 - - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' סיים לרדת + + Torrent: %1, run external program command too long (length > %2), execution failed. + טורנט: %1, פקודת הרצה של תכנית חיצונית ארוכה מדי (אורך > %2), ביצוע נכשל. - + Torrent: %1, sending mail notification טורנט: %1, שולח התראת דוא"ל - + Information מידע - - To control qBittorrent, access the Web UI at %1 - כדי לשלוט ב־qBittorrent, השג גישה לממשק הרשת ב־%1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + כדי לשלוט על qBittorrent, גש לממשק משתמש הרשת בכתובת http://localhost:%1 - + The Web UI administrator user name is: %1 - שם המשתמש של מינהלן ממשק־משתמש הרשת הוא: %1 + שם המשתמש של מנהל ממשק משתמש הרשת הוא: %1 - + The Web UI administrator password is still the default one: %1 - סיסמת מינהלן ממשק משתמש הרשת היא עדין ברירת המחדל: %1 + סיסמת מנהל ממשק משתמש הרשת היא עדין ברירת המחדל: %1 - + This is a security risk, please consider changing your password from program preferences. - זה סיכון ביטחוני, אנא שקול לשנות את הסיסמה שלך מהעדפות התוכנית. + זה סיכון ביטחוני, אנא שקול לשנות את הסיסמה שלך מהעדפות התכנית. - + Saving torrent progress... שומר התקדמות טורנט... - - - Portable mode and explicit profile directory options are mutually exclusive - מצב נייד ואפשרויות סיפריית פרופיל מפורש הם הדדיים בלעדיים - - - - Portable mode implies relative fastresume - מצב נייד מרמז על fastresume קשור - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - כישלון התחברות WebAPI. סיבה: IP הוחרם, IP: %1, שם משתמש: %2 - - - - Your IP address has been banned after too many failed authentication attempts. - כתובת ה־IP שלך הוחרמה לאחר יותר מדי ניסיונות אימות כושלים. - - - - WebAPI login success. IP: %1 - הצלחת התחברות WebAPI. כתובת IP היא: %1 - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - כישלון התחברות WebAPI. סיבה: תעודות לא תקפות, ספירת ניסיונות: %1, IP: %2, שם משתמש: %3 - AutomatedRssDownloader - + Save to: שמירה אל: @@ -861,837 +658,700 @@ מורידן RSS - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - הורדה אוטומטית של טורנטי RSS מושבתת כעת! אתה יכול לאפשר אותה בהגדרות היישום. + + Enable Automated RSS Downloader + אפשר מורידן RSS ממוכן - + Download Rules - כלליי הורדה + כללי הורדה - + Rule Definition הגדרת כלל - + Use Regular Expressions השתמש בביטויים רגילים - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - מסנן פרקים חכם יבדוק את מספר הפרק כדי למנוע הורדת כפילויות. -תומך בתסדירים: S01E01, 1x1, 2017.01.01 ו־01.01.2017 (תסדירי תאריך גם נתמכים - בתור מפריד) - - - - Use Smart Episode Filter - השתמש במסנן פרקים חכם - - - + Must Contain: חייב להכיל: - + Must Not Contain: חייב שלא להכיל: - + Episode Filter: מסנן פרקים: - + Assign Category: הקצה מדור: - + Save to a Different Directory - שמור בסיפרייה שונה + שמור בספרייה שונה - + Ignore Subsequent Matches for (0 to Disable) ... X days התעלם מהתאמות שבאות אחרי עבור (0 להשבתה) - + Disabled - מושבת + מושבת - + days ימים - + Add Paused: - הוסף מושהים: + לחיצות מטמון קריאה: - + Use global settings - השתמש בהגדרות עולמיות + השתמש בקביעות כלליות - + Always תמיד - + Never אף פעם - + Apply Rule to Feeds: החל כלל להזנות: - + Matching RSS Articles מאמרי RSS תואמים - + &Import... &ייבא... - + &Export... &ייצא... - + Matches articles based on episode filter. - מתאים מאמרים על סמך מסנן פרקים. + מתאים מאמרים בהתבסס על מסנן פרקים. - + Example: דוגמה: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match - יתאים את פרקים 2, 5, 8 עד 15, 30 והלאה של עונה ראשונה + יתאים 2, 5, 8 עד 15, 30 והפרקים הבאים של עונה ראשונה - + Episode filter rules: - כלליי מסנן פרקים: + כללי מסנן פרקים: - + Season number is a mandatory non-zero value מספר עונה הוא ערך בלתי אפסי הכרחי - + Episode number is a mandatory non-zero value + מספר פרק הוא ערך בלתי אפסי הכרחי + + + Filter must end with semicolon מסנן חייב להסתיים בנקודה ופסיק - + Three range types for episodes are supported: שלושה סוגי טווח לפרקים נתמכים: - + Single number: <b>1x25;</b> matches episode 25 of season one - מספר יחיד: <b>1x25;</b> מתאים פרק 25 של עונה ראשונה + מספר יחיד: <b>1x25;</b> מתאים לפרק 25 של עונה ראשונה - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one - טווח רגיל: <b>1x25-40;</b> מתאים פרקים 25 עד 40 של עונה ראשונה - - - - Episode number is a mandatory positive value - מספר פרק הוא ערך חיובי הכרחי + טווח רגיל: <b>1x25-40;</b> מתאים לפרקים 25 עד 40 של עונה ראשונה - - Rules - כללים + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + טווח אינסופי: <b>1x25-;</b> מתאים לפרקים 25 ומעלה של עונה ראשונה - - Rules (legacy) - כללים (מורשת) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - טווח אינסופי: <b>1x25-;</b> מתאים פרקים 25 ומעלה של עונה ראשונה, וכל הפרקים של העונות הבאות + - + Last Match: %1 days ago התאמה אחרונה: לפני %1 ימים - + Last Match: Unknown התאמה אחרונה: בלתי ידוע - + New rule name שם של כלל חדש - + Please type the name of the new download rule. אנא הקלד את שמו של כלל ההורדה החדש. - - + + Rule name conflict סתירת שם כלל - - + + A rule with this name already exists, please choose another name. כלל עם שם זה כבר קיים, אנא בחר שם אחר. - + Are you sure you want to remove the download rule named '%1'? - האם אתה בטוח שאתה רוצה למחוק את כלל ההורדה בשם '%1'? + האם אתה בטוח שברצונך למחוק את כלל ההורדה בשם '%1'? - + Are you sure you want to remove the selected download rules? - האם אתה בטוח שאתה רוצה להסיר את כללי ההורדה הנבחרים? + האם אתה בטוח שברצונך להסיר את כללי ההורדה שנבחרו? - + Rule deletion confirmation - אישור מחיקת כלל + אישור מחיקת כללים - + Destination directory - סיפריית יעד + ספריית יעד - + Invalid action - פעולה לא תקפה + פעולה בלתי תקינה - + The list is empty, there is nothing to export. - הרשימה ריקה, אין מה לייצא. + הרשימה ריקה, אין שום דבר לייצא. - - Export RSS rules - ייצא כלליי RSS + + Where would you like to save the list? + היכן ברצונך לשמור את הרשימה? - - + + Rules list (*.rssrules) + רשימת כללים (*.rssrules) + + + I/O Error שגיאת ק/פ - - Failed to create the destination file. Reason: %1 - נכשל ביצירת קובץ היעד. סיבה: %1 + + Failed to create the destination file + נכשל ביצירת קובץ היעד - - Import RSS rules - ייבא כלליי RSS + + Please point to the RSS download rules file + אנא הצבע על קובץ כללי ההורדה של RSS - - Failed to open the file. Reason: %1 - נכשל בפתיחת הקובץ. סיבה: %1 + + Rules list + רשימת כללים - + Import Error - שגיאת יבוא + שגיאת ייבוא - - Failed to import the selected rules file. Reason: %1 - נכשל ביבוא קובץ הכללים הנבחר. סיבה: %1 + + Failed to import the selected rules file + נכשל בייבוא קובץ הכללים שנבחר - + Add new rule... הוסף כלל חדש... - + Delete rule מחק כלל - + Rename rule... - שנה שם כלל... + שנה שם כלל - + Delete selected rules - מחק כללים נבחרים - - - - Clear downloaded episodes... - נקה פרקים שירדו... + מחק כללים שנבחרו - + Rule renaming שינוי שם כלל - + Please type the new rule name - אנא הקלד את השם החדש של הכלל - - - - Clear downloaded episodes - נקה פרקים שירדו - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - האם אתה בטוח שאתה רוצה לנקות את רשימת הפרקים שירדו עבור הכלל הנבחר? - - - - Regex mode: use Perl-compatible regular expressions - מצב Regex: השתמש בביטויים מתוקננים תואמי Perl + אנא הקלד את השם החדש לכלל - - - Position %1: %2 - מיקום %1: %2 + + Regex mode: use Perl-like regular expressions + מצב Regex: השתמש בביטוי Perl-like רגיל - + Wildcard mode: you can use - מצב תו כללי: אתה יכול להשתמש ב + - + ? to match any single character - ? כדי להתאים תו יחיד כלשהו + - + * to match zero or more of any characters - * כדי להתאים אפס או יותר מתווים כלשהם + - + Whitespaces count as AND operators (all words, any order) - רווחים לבנים נחשבים כמתפעלי AND (כל המילים, כל סדר שהוא) + - + | is used as OR operator - | משמש כמתפעל OR + - + If word order is important use * instead of whitespace. - אם סדר מילים חשוב, השתמש ב־* במקום רווח לבן. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - ביטוי עם סעיף %1 ריק (לדוגמה %2) + - + will match all articles. - יתאים את כל המאמרים. + - + will exclude all articles. - ישלול את כל המאמרים. - - - - BanListOptionsDialog - - - List of banned IP addresses - רשימת כתובות IP מוחרמות - - - - Ban IP - החרם IP - - - - Delete - מחק - - - - - Warning - אזהרה + - - The entered IP address is invalid. - כתובת ה־IP שהוכנסה אינה תקפה. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + מצב ג'וקר: באפשרותכם להשתמש ב <ul><li>? בכדי להתאים כל תו בודד שהוא</li><li>* בכדי להתאים 0 או יותר תוים</li><li> מרווחים נחשבים כאופרטור AND<ul><li> - - The entered IP is already banned. - ה־IP שהוכנס מוחרם כבר. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + מצב ג'וקר: באפשרותכם להשתמש ב <ul><li>? בכדי להתאים כל תו בודד שהוא</li><li>* בכדי להתאים 0 או יותר תוים</li><li> | נחשב כאופרטור OR<ul><li> BitTorrent::Session - + Restart is required to toggle PeX support דרושה הפעלה מחדש כדי לעורר תמיכת PeX - - Could not get GUID of configured network interface. Binding to IP %1 - לא היה ניתן להשיג GUID של ממשק רשת מוגדר. מקשר אל IP %1 - - - + Embedded Tracker [ON] גשש מוטמע [מופעל] - + Failed to start the embedded tracker! נכשל בהתחלת הגשש המוטמע! - + Embedded Tracker [OFF] גשש מוטמע [כבוי] - - System network status changed to %1 + + '%1' reached the maximum ratio you set. Removing... + '%1' הגיע ליחס המרבי שקבעת. מסיר... + + + + '%1' reached the maximum ratio you set. Pausing... + '%1' הגיע ליחס המרבי שקבעת. משהה... + + + + System network status changed to %1 e.g: System network status changed to ONLINE מצב הרשת של המערכת שונה אל %1 - + ONLINE מחובר - + OFFLINE מנותק - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding - תצורת רשת של %1 השתנתה, מרענן קשירת שיחים + תצורת רשת של %1 השתנתה, מרענן את החיבור - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. כתובת ממשק הרשת שהוגדרה %1 בלתי תקינה. - - + Encryption support [%1] תמיכה בהצפנה [%1] - - + FORCED מאולץ - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 אינו כתובת IP תקפה ונדחה בעת החלת רשימת הכתובות המוחרמות. - - - - + Anonymous mode [%1] מצב אלמוני [%1] - + Unable to decode '%1' torrent file. - לא היה ניתן לפענח את קובץ הטורנט '%1'. + לא ניתן לפענח את קובץ הטורנט '%1'. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' הורדה נסיגתית של הקובץ '%1' הוטמעה בטורנט '%2' - + Queue positions were corrected in %1 resume files - מיקומי תור תוקנו ב־%1 קבצי המשכה + - + Couldn't save '%1.torrent' - לא היה ניתן לשמור את '%1.torrent' - - - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' הוסר מרשימת ההעברות. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' הוסר מרשימת ההעברות ומהכונן הקשיח. + לא ניתן היה לשמור את '%1.torrent' - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '%1' הוסר מרשימת ההעברות אבל הקבצים לא יכלו להימחק. שגיאה: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. כי %1 מושבת. - + because %1 is disabled. this peer was blocked because TCP is disabled. כי %1 מושבת. - + URL seed lookup failed for URL: '%1', message: %2 חיפוש זורע כתובת נכשל עבור הכתובת: '%1', הודעה: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent נכשל בהאזנה על ממשק %1 פתחה: %2/%3. סיבה: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' הוסר מרשימת ההעברות ומהכונן הקשיח. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' הוסר מרשימת ההעברות. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... מוריד את '%1', אנא המתן... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent מנסה להאזין על כל פתחת ממשק שהיא: %1 - + The network interface defined is invalid: %1 - ממשק הרשת שהוגדר אינו תקף: %1 + ממשק הרשת שהוגדר בלתי תקין: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent מנסה להאזין על ממשק %1 פתחה: %2 - - Peer ID: - זהות עמית: - - - - HTTP User-Agent is '%1' - סוכן־משתמש HTTP הוא '%1' - - - - + DHT support [%1] - תמיכה ב־DHT [%1] + תמיכה ב-DHT [%1] - - - - - - - - - + + + + ON מופעל - - - - - - - - - + + + + OFF כבוי - - + Local Peer Discovery support [%1] תמיכה בגילוי עמיתים מקומיים [%1] - - PeX support [%1] - תמיכת PeX [%1] - - - - '%1' reached the maximum ratio you set. Removed. - '%1' הגיע ליחס המרבי שהגדרת. הוסר. - - - - '%1' reached the maximum ratio you set. Paused. - '%1' הגיע ליחס המרבי שהגדרת. הושהה. - - - - '%1' reached the maximum seeding time you set. Removed. - '%1' הגיע לזמן הזריעה המרבי שהגדרת. הוסר. - - - - '%1' reached the maximum seeding time you set. Paused. - '%1' הגיע לזמן הזריעה המרבי שהגדרת. הושהה. + Restart is required to toggle Tracker Exchange support + דרושה הפעלה מחדש כדי לעורר תמיכה בהחלפת גששים - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent לא מצא כתובת מקומית %1 להאזין עליה - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent נכשל להאזין על כל פתחת ממשק שהיא %1. סיבה: %2. - + Tracker '%1' was added to torrent '%2' הגשש '%1' התווסף לטורנט '%2' - + Tracker '%1' was deleted from torrent '%2' הגשש '%1' נמחק מהטורנט '%2' - + URL seed '%1' was added to torrent '%2' זורע הכתובת '%1' התווסף לטורנט '%2' - + URL seed '%1' was removed from torrent '%2' זורע הכתובת '%1' הוסר מהטורנט '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. - לא היה ניתן להמשיך את הטורנט '%1'. + לא ניתן להמשיך את הטורנט '%1'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - מסנן ה־IP שסופק אובחן בהצלחה: %1 כללים הוחלו. + מסנן ה-IP שסופק אובחן בהצלחה: %1 כללים הוחלו. - + Error: Failed to parse the provided IP filter. - שגיאה: נכשל באבחון מסנן ה־IP שסופק. - - - - '%1' restored. - 'torrent name' restored. - '%1' שוחזר. + שגיאה: נכשל באבחון מסנן ה-IP שסופק. - + Couldn't add torrent. Reason: %1 לא ניתן היה להוסיף טורנט. סיבה: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' הומשך. (המשכה מהירה) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' התווסף לרשימת ההורדות. - + An I/O error occurred, '%1' paused. %2 שגיאת ק/פ התרחשה, '%1' הושהה. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: מיפוי פתחות נכשל, הודעה: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: מיפוי פתחות הצליח, הודעה: %1 - + due to IP filter. this peer was blocked due to ip filter. עקב מסנן IP. - + due to port filter. this peer was blocked due to port filter. - עקב מסנן פתחות. + עקב מסנן פתחה. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. עקב מגבלות מצב מעורבב i2p. - + because it has a low port. this peer was blocked because it has a low port. כי יש לו פתחה נמוכה. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent מאזין בהצלחה על ממשק %1 פתחה: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 - IP חיצוני: %1 - - - - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - יצירת קובץ חדש של טורנט נכשלה + כתובת IP חיצונית: %1 BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - הורד חתיכה ראשונה ואחרונה תחילה: %1, טורנט: '%2' - - - - On - פעיל - - - - Off - כבוי - - - - Successfully moved torrent: %1. New path: %2 - טורנט הועבר בהצלחה: %1. נתיב חדש: %2 - - - + Could not move torrent: '%1'. Reason: %2 - לא היה ניתן להעביר את הטורנט '%1'. סיבה: %2 + לא ניתן היה להזיז את טורנט: '%1'. סיבה: %2 - + File sizes mismatch for torrent '%1', pausing it. - גודל קובץ אינו תואם לטורנט: '%1', משהה אותו. + גדלי הקבצים אינם תואמים לטורנט '%1', משהה את זה. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - נתוני המשכה מהירה נדחו עבור הטורנט: '%1'. סיבה: %2. בודק שוב... + המשכת נתונים מהירה נדחתה עבור טורנט '%1'. סיבה: %2. בודק שוב... CategoryFilterModel - + Categories - מדורים + מדורים - + All - הכל + הכל - + Uncategorized - בלתי ממודר + @@ -1699,42 +1359,147 @@ Add category... - הוסף מדור... + הוסף מדור... Add subcategory... - הוסף תת־מדור... + - Edit category... - ערוך מדור... + Remove category + הסר מדור + + + + Remove unused categories + הסר מדורים שאינם בשימוש + + + + Resume torrents + המשך טורנטים + + + + Pause torrents + השהה טורנטים + + + + Delete torrents + מחק טורנטים + + + + New Category + מדור חדש + + + + Category: + מדור: + + + + Invalid category name + שם בלתי תקין של מדור + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + שם מדור חייב שלא להכיל '\'. +שם מדור חייב שלא להתחיל/להסתיים עם '/'. +שם מדור חייב שלא להכיל רצף '//'. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + הכל (0) + + + Uncategorized (0) + בלתי ממודר (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + בלתי ממודר (%1) + + + Add category... + הוסף מדור... - Remove category - הסר מדור + הסר מדור - Remove unused categories - הסר מדורים שאינם בשימוש + הסר מדורים שאינם בשימוש - Resume torrents - המשך טורנטים + המשך טורנטים - Pause torrents - השהה טורנטים + השהה טורנטים - Delete torrents - מחק טורנטים + מחק טורנטים + + + New Category + מדור חדש + + + Category: + מדור: + + + Invalid category name + שם בלתי תקין של מדור + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + שם מדור חייב שלא להכיל '\'. +שם מדור חייב שלא להתחיל/להסתיים עם '/'. +שם מדור חייב שלא להכיל רצף '//'. + + + All (%1) + this is for the category filter + הכל (%1) @@ -1774,106 +1539,58 @@ - DeletionConfirmationDialog - - - Deletion confirmation - אישור מחיקה - - - - Remember choice - זכור בחירה - - - - Also delete the files on the hard disk - מחק את הקבצים גם מהכונן הקשיח - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - האם אתה בטוח שאתה רוצה למחוק את '%1' מרשימת ההעברות? + האם אתה בטוח שברצונך למחוק את '%1' מרשימת ההעברות? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - האם אתה בטוח שאתה רוצה למחוק את %1 טורנטים אלו מרשימת ההעברות? - - - - DownloadFromURLDialog - - - Download from URLs - הורד מכתובות - - - - Add torrent links - הוסף קישורי טורנט - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - קישור אחד לשורה (קישורי HTTP, קישורי מגנט ומידע־גיבובים נתמכים). - - - - Download - הורד - - - - No URL entered - לא הוכנסה כתובת - - - - Please type at least one URL. - אנא הקלד לפחת כתובת אחת. + האם אתה בטוח שברצונך למחוק את %1 הטורנטים האלו מרשימת ההעברות? DownloadedPiecesBar - + White: Missing pieces לבן: חתיכות חסרות - + Green: Partial pieces ירוק: חתיכות חלקיות - + Blue: Completed pieces כחול: חתיכות שלמות - ExecutionLogWidget + ExecutionLog - + General כללי - + Blocked IPs כתובות IP חסומות - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked <font color='red'>%1</font> נחסם %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned <font color='red'>%1</font> הוחרם @@ -1882,112 +1599,41 @@ FeedListWidget - + RSS feeds - הזנות RSS + הזנת RSS - - - Unread (%1) - לא נקראו (%1) + + Unread + לא נקרא FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - שגיאה התרחשה בעת ניסיון לפתוח את קובץ היומן. כתיבה בקובץ היומן מושבתת. - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - &עיין... - - - - Choose a file - Caption for file open/save dialog - בחר קובץ - - - - Choose a folder - Caption for directory open dialog - בחר תיקייה - - - - Any file - כל קובץ שהוא + + An error occured while trying to open the log file. Logging to file is disabled. + שגיאה התרחשה בזמן ניסיון לפתוח את קובץ יומן האירועים. רישום בקובץ יומן האירועים מבוטל. FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. + + + + I/O Error: Could not open ip filter file in read mode. שגיאת ק/פ: לא ניתן היה לפתוח קובץ מסנן IP במצב קריאה. - - - - IP filter line %1 is malformed. - שורת מסנן IP בשם %1 מעוותת. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - שורת מסנן IP בשם %1 מעוותת. IP התחלה של הטווח מעוות. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - שורת מסנן IP בשם %1 מעוותת. IP סוף של הטווח מעוות. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - שורת מסנן IP בשם %1 מעוותת. IP אחד הוא IPv4 והשני הוא IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - חריגת מסנן IP נזרקה עבור שורה %1. החריגה היא: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - %1 שגיאות ניתוח נוספות של מסנן IP התרחשו. - - - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. שגיאת אבחון: קובץ המסנן אינו קובץ PeerGuardian P2B תקין. @@ -1995,396 +1641,472 @@ GeoIPDatabase - - + + Unsupported database file size. - גודל בלתי נתמך של קובץ מסד־נתונים. + גודל בלתי נתמך של קובץ מסד-נתונים. - + Metadata error: '%1' entry not found. - שגיאת מטא־נתונים: הכניסה '%1' לא נמצאה. + שגיאת מטה-נתונים: הכניסה '%1' לא נמצאה. - + Metadata error: '%1' entry has invalid type. - שגיאת מטא־נתונים: לכניסה '%1' יש סוג לא תקף. + שגיאת מטה-נתונים: לכניסה '%1' יש סוג בלתי תקין. - + Unsupported database version: %1.%2 - גרסת מסד־נתונים בלתי נתמכת: %1.%2 + גרסת מסד-נתונים בלתי נתמכת: %1.%2 - + Unsupported IP version: %1 גרסת IP בלתי נתמכת: %1 - + Unsupported record size: %1 גודל רשומה בלתי נתמך: %1 - + Invalid database type: %1 - סוג לא תקף של מסד־נתונים: %1 + סוג בלתי תקין של מסד-נתונים: %1 - + Database corrupted: no data section found. - מסד־נתונים פגום: לא נמצא פלג נתונים + מסד-נתונים פגום: לא נמצא פלג נתונים - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - גודל בקשת HTTP חרגה את המגבלה, סוגר תושבת. הגבלה: %ld, כתובת IP: %s + + File + קובץ - - Bad Http request, closing socket. IP: %s - בקשת HTTP גרועה, סוגר תושבת. IP: %s + + Edit + עריכה - - - HttpServer - + + Help + עזרה + + + Exit qBittorrent - צא מ־qBittorrent + צא מ-qBittorrent - + Only one link per line קישור אחד בלבד לכל שורה - + + Download + הורדה + + + Global upload rate limit must be greater than 0 or disabled. - מגבלה עולמית של קצב העלאה חייבת להיות גדולה מ־0 או מושבתת. + מגבלת קצב העלאה כללית חייבת להיות גדולה מ-0 או מושבתת. - + Global download rate limit must be greater than 0 or disabled. - מגבלה עולמית של קצב הורדה חייבת להיות גדולה מ־0 או מושבתת. + מגבלת קצב הורדה כללית חייבת להיות גדולה מ-0 או מושבתת. - + Alternative upload rate limit must be greater than 0 or disabled. - מגבלת קצב חלופי של העלאה חייבת להיות גדולה מ־0 או מושבתת. + מגבלת קצב העלאה חלופית חייבת להיות גדולה מ-0 או מושבתת. - + Alternative download rate limit must be greater than 0 or disabled. - מגבלת קצב חלופי של הורדה חייבת להיות גדולה מ־0 או מושבתת. + מגבלת קצב הורדה חלופית חייבת להיות גדולה מ-0 או מושבתת. - + Maximum active downloads must be greater than -1. - הורדות פעילות מרביות חייבות להיות גדולות מן -1. + הורדות פעילות מרביות חייבות להיות גדולות מ-(-1). - + Maximum active uploads must be greater than -1. - העלאות פעילות מרביות חייבות להיות גדולות מן -1. + העלאות פעילות מרביות חייבות להיות גדולות מ-(-1). - + Maximum active torrents must be greater than -1. - טורנטים פעילים מרביים חייבים להיות גדולים מן -1. + טורנטים פעילים מרביים חייבים להיות גדולים מ-(-1). - + Maximum number of connections limit must be greater than 0 or disabled. - מספר מרבי של מגבלת חיבורים חייב להיות גדול מ־0 או מושבת. + מספר מרבי של מגבלת חיבורים חייב להיות גדול מ-0 או מושבת. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. - מספר מרבי של מגבלת חיבורים לכל טורנט חייב להיות גדול מ־0 או מושבת. + מספר מרבי של מגבלת חיבורים לכל טורנט חייב להיות גדול מ-0 או מושבת. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. - מספר מרבי של מגבלת חריצי העלאה לכל טורנט חייב להיות גדול מ־0 או מושבת. + מספר מרבי של מגבלת חריצי העלאה לכל טורנט חייב להיות גדול מ-0 או מושבת. - + Unable to save program preferences, qBittorrent is probably unreachable. - לא היה ניתן לשמור את העדפות התוכנית, qBittorrent כנראה בלתי נגיש. + לא ניתן לשמור את העדפות התכנית, qBittorrent כנראה בלתי נגיש. - - IRC: #qbittorrent on Freenode - IRC: ערוץ #qbittorrent על Freenode + + Language + שפה - - Invalid category name: -Please do not use any special characters in the category name. - שם לא תקף של מדור: -אנא אל תשתמש בתווים מיוחדים כלשהם בשם המדור. + + The port used for incoming connections must be between 1 and 65535. + הפתחה המשמשת לחיבורים נכנסים חייבת להיות בין 1 ל-65535. - - Unknown - לא ידוע + + The port used for the Web UI must be between 1 and 65535. + הפתחה המשמשת לממשק משתמש הרשת חייבת להיות בין 1 ל-65535. - - Hard Disk - כונן קשיח + + Unable to log in, qBittorrent is probably unreachable. + לא ניתן היה להיכנס, qBittorrent כנראה בלתי נגיש. - - Share ratio limit must be between 0 and 9998. - מגבלת יחס שיתוף חייבת להיות בין 0 לבין 9998. + + Invalid Username or Password. + שם משתמש או סיסמה בלתי תקינים. - - Seeding time limit must be between 0 and 525600 minutes. - מגבלת זמן זריעה חייבת להיות בין 0 לבין 525600 דקות. + + Password + סיסמה - - The port used for incoming connections must be between 1 and 65535. - הפתחה המשמשת לחיבורים נכנסים חייבת להיות בין 1 לבין 65535. - - - - The port used for the Web UI must be between 1 and 65535. - הפתחה המשמשת לממשק משתמש הרשת חייבת להיות בין 1 לבין 65535. - - - - Unable to log in, qBittorrent is probably unreachable. - לא היה ניתן להיכנס, qBittorrent כנראה בלתי נגיש. - - - - Invalid Username or Password. - שם משתמש או סיסמה לא תקפים. + + Login + היכנס - - Username - שם משתמש + + Upload Failed! + ההעלאה נכשלה! - - Password - סיסמה + + Original authors + מחברים מקוריים - - Login - היכנס + + Upload limit: + מגבלת העלאה: - - Original authors - מחברים מקוריים + + Download limit: + מגבלת הורדה: - + Apply החל - + Add הוסף - + + Category: + מדור: + + + Upload Torrents Upload torrent files to qBittorent using WebUI העלה טורנטים - + + All + הכל + + + + Downloading + מוריד + + + + Seeding + זורע + + + + Completed + הושלם + + + + Resumed + מומשך + + + + Paused + מושהה + + + + Active + פעיל + + + + Inactive + בלתי פעיל + + + Save files to location: שמור קבצים במיקום: - + Cookie: עוגייה: - + Type folder here הקלד תיקייה כאן - + + Run an external program on torrent completion + הרץ תכנית חיצונית בהשלמת טורנט + + + + Enable bandwidth management (uTP) + אפשר ניהול רוחב-פס (uTP) + + + + Apply rate limit to uTP connections + החל מגבלת קצב לחיבורי uTP + + + + Alternative Global Rate Limits + מגבלות קצב כללי חלופי + + + More information עוד מידע - + Information about certificates מידע על אישורים - + Save Files to שמור קבצים ב - - Set location - הגדר מיקום - - - - Limit upload rate - הגבל קצב העלאה + + Watch Folder + תיקיית מעקב - - Limit download rate - הגבל קצב הורדה + + Default Folder + תיקיית ברירת מחדל - - Rename torrent - שנה שם טורנט + + from + from time1 to time2 + מ - - Unable to create category - + + to + from time1 to time2 + אל - + Other... Save Files to: Watch Folder / Default Folder / Other... אחר... - + + Every day + Schedule the use of alternative rate limits on ... + כל יום + + + + Week days + Schedule the use of alternative rate limits on ... + ימות השבוע + + + + Week ends + Schedule the use of alternative rate limits on ... + סופי-שבוע + + + Monday Schedule the use of alternative rate limits on ... יום שני - + Tuesday Schedule the use of alternative rate limits on ... יום שלישי - + Wednesday Schedule the use of alternative rate limits on ... יום רביעי - + Thursday Schedule the use of alternative rate limits on ... יום חמישי - + Friday Schedule the use of alternative rate limits on ... יום שישי - + Saturday Schedule the use of alternative rate limits on ... שבת - + Sunday Schedule the use of alternative rate limits on ... יום ראשון - + + Downloaded + Is the file downloaded or not? + ירד + + + Logout התנתק - + + Download from URLs + הורד מכתובות + + + Download Torrents from their URLs or Magnet links הורד טורנטים מהכתובות או מקישורי המגנט שלהם - + Upload local torrent העלה טורנט מקומי - + Are you sure you want to delete the selected torrents from the transfer list? - האם אתה בטוח שאתה רוצה למחוק את הטורנטים הנבחרים מרשימת ההעברות? + האם אתה בטוח שברצונך למחוק את הטורנטים שנבחרו מרשימת ההעברות? - + Save שמירה - + qBittorrent client is not reachable לקוח qBittorrent בלתי נגיש - - qBittorrent has been shutdown. - qBittorrent כובה. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - רשימת תת־רשתות IP שברשימה הלבנה + + HTTP Server + שרת HTTP - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - דוגמה: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + המשתנים הבאים נתמכים: - - Add subnet - הוסף תת־רשת + + Torrent path + נתיב טורנט - - Delete - מחק + + Torrent name + שם טורנט - - Error - שגיאה + + qBittorrent has been shutdown. + qBittorrent כובה. + + + LineEdit - - The entered subnet is invalid. - התת־רשת שהוכנסה אינה תקפה. + + Clear the text + נקה את המלל LogListWidget - + Copy העתק - + Clear נקה @@ -2417,550 +2139,492 @@ ב&סיום ההורדות - + &View &תצוגה - + &Options... &אפשרויות... - + &Resume &המשך - + Torrent &Creator יו&צר הטורנטים - + Set Upload Limit... - הגדר מגבלת העלאה... + קבע מגבלת העלאה... - + Set Download Limit... - הגדר מגבלת הורדה... + קבע מגבלת הורדה... - + Set Global Download Limit... - הגדר מגבלה עולמית של הורדה... + קבע מגבלה כללית של הורדה... - + Set Global Upload Limit... - הגדר מגבלה עולמית של העלאה... + קבע מגבלה כללית של העלאה... - + Minimum Priority עדיפות מזערית - + Top Priority עדיפות עליונה - + Decrease Priority הפחת עדיפות - + Increase Priority הגבר עדיפות - - + + Alternative Speed Limits מגבלות מהירות חלופית - + &Top Toolbar &סרגל כלים עליון - + Display Top Toolbar הצג סרגל כלים עליון - - Status &Bar - שורת מיצב - - - + S&peed in Title Bar מ&הירות בשורת הכותרת - + Show Transfer Speed in Title Bar - הראה מהירות העברה בשורת הכותרת + הצג מהירות העברה בשורת הכותרת - + &RSS Reader קורא &RSS - + Search &Engine &מנוע חיפוש - + L&ock qBittorrent &נעל את qBittorrent - + Do&nate! ת&רום! - - Close Window - סגור חלון - - - + R&esume All ה&משך הכל - + Manage Cookies... נהל עוגיות... - + Manage stored network cookies נהל עוגיות רשת מאוחסנות - + Normal Messages הודעות רגילות - + Information Messages הודעות מידע - + Warning Messages הודעות אזהרה - + Critical Messages הודעות חשובות - + &Log &יומן אירועים - + &Exit qBittorrent - &צא מ־qBittorrent + &צא מ-qBittorrent - + &Suspend System &השעה מערכת - + &Hibernate System &חרוף מערכת - + S&hutdown System &כבה מערכת - + &Disabled &מושבת - + &Statistics &סטטיסטיקה - + Check for Updates בדוק אחר עדכונים - + Check for Program Updates - בדוק אחר עדכוני תוכנית + בדוק אחר עדכוני תכנית - + &About &אודות - + &Pause ה&שהה - + &Delete &מחק - + P&ause All השהה ה&כל - + &Add Torrent File... הוסף קובץ &טורנט... - + Open פתח - + E&xit י&ציאה - + Open URL פתח כתובת - + &Documentation - &תיעוד + &מסמכים - + Lock נעל - - - + + + Show - הראה + הצג - + Check for program updates - בדוק אחר עדכוני תוכנית + בדוק אחר עדכוני תכנית - + Add Torrent &Link... הוסף &קישור טורנט... - + If you like qBittorrent, please donate! אם אתה אוהב את qBittorrent, אנא תרום! - - + Execution Log דוח ביצוע - + Clear the password נקה את הסיסמה - + Filter torrent list... סנן רשימת טורנטים... - + &Set Password - &הגדר סיסמה - - - - Preferences - העדפות + &קבע סיסמה - + &Clear Password &נקה סיסמה - + Transfers העברות - - - qBittorrent is minimized to tray - qBittorrent ממוזער למגש - - - - - - This behavior can be changed in the settings. You won't be reminded again. - התנהגות זו יכולה להשתנות דרך ההגדרות. לא תתוזכר שוב. - - - + Torrent file association - שיוך קבצי טורנט + שיוך קובץ טורנט - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? - qBittorrent אינו יישום ברירת המחדל לפתיחה של קבצי טורנט או קישורי מגנט. האם אתה רוצה לשייך את qBittorrent אל קבצי טורנט וקישורי מגנט? + qBittorrent אינו מוגדר כתוכנית ברירת המחדל לפתיחת קבצי טורנט או קישורים מגנטיים. האם להפוך את qBittorrent לתוכנה שפותחת קבצי טורנט וקישורים מגנטיים? - + Icons Only צלמיות בלבד - + Text Only מלל בלבד - + Text Alongside Icons מלל לצד צלמיות - + Text Under Icons מלל מתחת לצלמיות - + Follow System Style עקוב אחר סגנון מערכת - - - + + + UI lock password סיסמת נעילת UI - - - + + + Please type the UI lock password: - אנא הקלד את סיסמת נעילת ה־UI: + אנא הקלד את סיסמת נעילת ה-UI: - + The password should contain at least 3 characters הסיסמה חייבת להכיל לפחות 3 תוים - + Password update עדכון סיסמה - + The UI lock password has been successfully updated - סיסמת נעילת ה־UI עודכנה בהצלחה + סיסמת נעילת ה-UI עודכנה בהצלחה - + Are you sure you want to clear the password? - האם אתה בטוח שאתה רוצה לנקות את הסיסמה? - - - - Use regular expressions - השתמש בביטויים רגולריים + האם אתה בטוח שברצונך לנקות את הסיסמה? - + Search חיפוש - + Transfers (%1) העברות (%1) - + Error שגיאה - + Failed to add torrent: %1 נכשל בהוספת טורנט: %1 - + Torrent added טורנט התווסף - + '%1' was added. e.g: xxx.avi was added. '%1' התווסף. - + Download completion - השלמת הורדה + ההורדה הושלמה - + I/O Error i.e: Input/Output Error שגיאת ק/פ - + Recursive download confirmation אישור הורדה נסיגתית - + Yes כן - + No לא - + Never אף פעם - + Global Upload Speed Limit - מגבלה עולמית של מהירות העלאה + מגבלה כללית של מהירות העלאה - + Global Download Speed Limit - מגבלה עולמית של מהירות הורדה - - - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent עודכן כרגע וצריך להיפעל מחדש כדי שהשינויים יחולו. - - - - qBittorrent is closed to tray - qBittorrent סגור למגש - - - - Some files are currently transferring. - מספר קבצים מועברים כרגע. + מגבלה כללית של מהירות הורדה - - Are you sure you want to quit qBittorrent? - האם אתה בטוח שאתה רוצה לצאת מ־qBittorrent? - - - + &No &לא - + &Yes &כן - + &Always Yes &תמיד כן - - %1/s - s is a shorthand for seconds - %1/ש - - - - Couldn't determine your Python version. Search engine disabled. - לא ניתן היה לקבוע את גרסת פייתון שלך. מנוע חיפוש מושבת. - - - + Old Python Interpreter פרשן פייתון ישן - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. גרסת פייתון שלך (%1) אינה עדכנית. אנא שדרג לגרסה האחרונה כדי שמנועי חיפוש יעבדו. דרישה מזערית: 2.7.9 / 3.3.0. - + qBittorrent Update Available - עדכון qBittorrent זמין + עדכון qBittorent זמין + + + + A new version is available. +Do you want to download %1? + גרסה חדשה זמינה. +האם ברצונך להוריד את %1? - + Already Using the Latest qBittorrent Version אתה משתמש כבר בגרסת qBittorrent האחרונה - + Undetermined Python version גרסת פייתון לא נקבעה - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. ההורדה של %1 הסתיימה. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2969,211 +2633,207 @@ סיבה: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? - הטורנט '%1' מכיל קבצי טורנט, האם אתה רוצה להמשיך עם הורדתם? + הטורנט '%1' מכיל קבצי טורנט, האם ברצונך להמשיך עם הורדתם? - + Couldn't download file at URL '%1', reason: %2. לא ניתן היה להוריד את הקובץ בכתובת '%1', סיבה: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - פייתון נמצא ב־%1: %2 + פייתון נמצא ב-%1: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + לא ניתן היה לקבוע את גרסת פייתון שלך (%1). מנוע חיפוש מושבת. + + + + Missing Python Interpreter פרשן פייתון חסר - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? פייתון נדרש כדי להשתמש במנוע החיפוש אבל נראה שהוא אינו מותקן. -האם אתה רוצה להתקין אותו כעת? +האם ברצונך להתקין אותו כעת? - + Python is required to use the search engine but it does not seem to be installed. פייתון נדרש כדי להשתמש במנוע החיפוש אבל נראה שהוא אינו מותקן. - - A new version is available. - גרסה חדשה זמינה. - - - - Do you want to download %1? - האם אתה רוצה להוריד את %1? - - - - Open changelog... - פתח יומן שינויים... - - - + No updates available. You are already using the latest version. אין עדכונים זמינים. -אתה משתמש כבר בגרסה האחרונה. +אתה משתמש בגרסה העדכנית ביותר. - + &Check for Updates - &בדוק אחר עדכונים + &עדכן - + Checking for Updates... - בודק אחר עדכונים... + מחפש עדכונים... - + Already checking for program updates in the background - בודק כבר אחר עדכוני תוכנית ברקע + כבר מחפש עדכונים ברקע - + Python found in '%1' - פייתון נמצא ב־'%1' + פייתון נמצא ב-'%1' - + Download error שגיאת הורדה - + Python setup could not be downloaded, reason: %1. Please install it manually. - התקנת פייתון לא יכלה לרדת, סיבה: %1. -אנא התקן אותו באופן ידני. + כשלון בהורדה של קובץ ההתקנה של פייתון, סיבת הכשלון: %1. +אנא התקן אותו ידנית. - - + + Invalid password - סיסמה לא תקפה + סיסמה בלתי תקינה - - - + + RSS (%1) RSS (%1) - + URL download error שגיאה בכתובת ההורדה - + The password is invalid - הסיסמה אינה תקפה + הסיסמה בלתי תקינה - - + + DL speed: %1 e.g: Download speed: 10 KiB/s מהירות הורדה: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s מהירות העלאה: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [הור: %1, העל: %2] qBittorrent %3 - + Hide הסתר - + Exiting qBittorrent - יוצא מ־qBittorrent + יוצא מ-qBittorrent + + + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + מספר קבצים מועברים כרגע. +האם אתה בטוח שברצונך לסגור את qBittorrent? - + Open Torrent Files פתיחת קבצי טורנט - + Torrent Files קבצי טורנט - + Options were saved successfully. - אפשרויות נשמרו בהצלחה. + האפשרויות נשמרו בהצלחה. Net::DNSUpdater - + Your dynamic DNS was successfully updated. - ה־DNS הדינמי שלך עודכן בהצלחה. + ה-DNS הדינמי שלך עודכן בהצלחה. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. שגיאת DNS דינמי: השירות לא זמין באופן זמני, נסיון נוסף יתבצע בתוך 30 דקות. - + Dynamic DNS error: hostname supplied does not exist under specified account. שגיאת DNS דינמי: שם המארח שסופק לא קיים תחת החשבון שצוין. - + Dynamic DNS error: Invalid username/password. - שגיאת DNS דינמי: שם משתמש או סיסמה לא תקפים. + שגיאת DNS דינמי: שם משתמש או סיסמה בלתי תקינים. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. - שגיאת DNS דינמי: qBittorrent נחסם על ידי השירות, אנא דווח על תקל בכתובת: http://bugs.qbittorrent.org. + שגיאת DNS דינמי: qBittorrent נחסם על ידי השירות, אנא דווח על באג בכתובת: http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. שגיאת DNS דינמי: %1 הוחזר על ידי השירות, אנא דווח על באג בכתובת: http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. שגיאת DNS דינמי: שם המשתמש שלך נחסם עקב שימוש לרעה. - + Dynamic DNS error: supplied domain name is invalid. - שגיאת DNS דינמי: שם התחום שסופק לא תקף. + שגיאת DNS דינמי: שם התחום שסופק בלתי תקין. - + Dynamic DNS error: supplied username is too short. שגיאת DNS דינמי: שם המשתמש שסופק קצר מדי. - + Dynamic DNS error: supplied password is too short. שגיאת DNS דינמי: הסיסמה שסופקה קצרה מדי. @@ -3181,1426 +2841,1316 @@ Net::DownloadHandler - + I/O Error שגיאת ק/פ - + The file size is %1. It exceeds the download limit of %2. גודל הקובץ הוא %1. הוא חורג את מגבלת ההורדה של %2. - + Unexpected redirect to magnet URI. הפניה בלתי צפויה לכתובת מגנט. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - שם המארח המרוחק לא נמצא (שם מארח לא תקף) - - - - The operation was canceled - הפעולה בוטלה + + + GeoIP database loaded. Type: %1. Build time: %2. + מסד נתונים GeoIP נטען. סוג: %1. זמן בניה: %2. - - The remote server closed the connection prematurely, before the entire reply was received and processed - השרת המרוחק סגר את החיבור בטרם עת, לפני שהתגובה כולה התקבלה ועובדה + + + Couldn't load GeoIP database. Reason: %1 + לא ניתן היה לטעון מסד-נתונים GeoIP. סיבה: %1 - - The connection to the remote server timed out - לחיבור לשרת המרוחק אזל הזמן + + Venezuela, Bolivarian Republic of + ונצואלה, הרפובליקה הבוליברית של - - SSL/TLS handshake failed - לחיצת יד SSL/TLS נכשלה + + Viet Nam + וייטנאם - - The remote server refused the connection - השרת המרוחק דחה את החיבור + + + N/A + לא זמין - - The connection to the proxy server was refused - החיבור אל שרת ייפוי הכוח נדחה + + Andorra + אנדורה - - The proxy server closed the connection prematurely - שרת ייפוי הכוח סגר את החיבור בטרם עת - - - - The proxy host name was not found - שם מארח ייפוי הכוח לא נמצא - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - אזל הזמן עבור החיבור לייפוי הכוח או שיהפוי הכוח לא הגיב בזמן לבקשה שנשלחה - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - ייפוי הכוח דורש אימות על מנת לכבד את הבקשה אבל הוא לא קיבל אישורים מוצעים כלשהם - - - - The access to the remote content was denied (401) - הגישה לתוכן המרוחק נדחתה (401) - - - - The operation requested on the remote content is not permitted - הפעולה המבוקשת על התוכן המרוחק אינה מורשת - - - - The remote content was not found at the server (404) - התוכן המרוחק לא נמצא בשרת (404) - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - השרת המרוחק דורש אימות כדי להגיש את התוכן אבל האישורים שסופקו לא קובלו - - - - The Network Access API cannot honor the request because the protocol is not known - ה־API של גישת הרשת אינו יכול לכבד את הבקשה כי הפרוטוקול בלתי ידוע - - - - The requested operation is invalid for this protocol - הפעולה המבוקשת אינה תקפה עבור פרוטוקול זה - - - - An unknown network-related error was detected - שגיאה בלתי ידועה הקשורה לרשת זוהתה - - - - An unknown proxy-related error was detected - שגיאה בלתי ידועה הקשורה לייפוי כוח זוהתה - - - - An unknown error related to the remote content was detected - שגיאה בלתי ידועה הקשורה לתוכן המרוחק זוהתה - - - - A breakdown in protocol was detected - תקלה בפרוטוקול זוהתה - - - - Unknown error - שגיאה בלתי ידועה - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - מסד נתונים GeoIP נטען. סוג: %1. זמן בניה: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - לא ניתן היה לטעון מסד־נתונים GeoIP. סיבה: %1 - - - - Venezuela, Bolivarian Republic of - ונצואלה, הרפובליקה הבוליברית של - - - - Viet Nam - וייטנאם - - - - - N/A - לא זמין + + United Arab Emirates + איחוד האמירויות הערביות - Andorra - אנדורה - - - - United Arab Emirates - איחוד האמירויות הערביות - - - Afghanistan אפגניסטן - + Antigua and Barbuda אנטיגואה וברבודה - + Anguilla אנגווילה - + Albania אלבניה - + Armenia ארמניה - + Angola אנגולה - + Antarctica אנטארטיקה - + Argentina ארגנטינה - + American Samoa סמואה האמריקנית - + Austria אוסטריה - + Australia אוסטרליה - + Aruba ארובה - + Azerbaijan אזרבייג'ן - + Bosnia and Herzegovina בוסניה והרצגובינה - + Barbados ברבדוס - + Bangladesh בנגלדש - + Belgium בלגיה - + Burkina Faso בורקינה פאסו - + Bulgaria בולגריה - + Bahrain בחריין - + Burundi בורונדי - + Benin בנין - + Bermuda ברמודה - + Brunei Darussalam ברוניי - + Brazil ברזיל - + Bahamas איי בהאמה - + Bhutan בהוטן - + Bouvet Island אי בּוּבֶה - + Botswana בוצואנה - + Belarus בלארוס - + Belize בליז - + Canada קנדה - + Cocos (Keeling) Islands איי קוקוס (קילינג) - + Congo, The Democratic Republic of the קונגו, הרפובליקה הדמוקרטית של - + Central African Republic - הרפובליקה המרכז־אפריקאית + הרפובליקה המרכז-אפריקאית - + Congo קונגו - + Switzerland שוויץ - + Cook Islands איי קוק - + Chile צ'ילה - + Cameroon קמרון - + China סין - + Colombia קולומביה - + Costa Rica קוסטה ריקה - + Cuba קובה - + Cape Verde כף ורדה - + Curacao קוראסאו - + Christmas Island אי חג המולד - + Cyprus קפריסין - + Czech Republic צ'כיה - + Germany גרמניה - + Djibouti ג'יבוטי - + Denmark דנמרק - + Dominica דומיניקה - + Dominican Republic הרפובליקה הדומיניקנית - + Algeria אלג'יריה - + Ecuador אקוודור - + Estonia אסטוניה - + Egypt מצרים - + Western Sahara סהרה המערבית - + Eritrea אריתראה - + Spain ספרד - + Ethiopia אתיופיה - + Finland פינלנד - + Fiji פיג'י - + Falkland Islands (Malvinas) איי פוקלנד (מליבנאס) - + Micronesia, Federated States of מיקרונזיה, המדינות הפדרליות של - + Faroe Islands איי פארו - + France צרפת - + Gabon גבון - + United Kingdom - הממלכה המאוחדת + בריטניה - + Grenada גרנדה - + Georgia גאורגיה - + French Guiana גיאנה הצרפתית - + Ghana גאנה - + Gibraltar - גיברלטר + ג'יברלטר - + Greenland גרינלד - + Gambia גמביה - + Guinea גינאה - + Guadeloupe גוואדלופ - + Equatorial Guinea גינאה המשוונית - + Greece יוון - + South Georgia and the South Sandwich Islands איי ג'ורג'יה הדרומית ואיי סנדוויץ' הדרומיים - + Guatemala גואטמלה - + Guam גואם - + Guinea-Bissau גינאה ביסאו - + Guyana גיאנה - + Hong Kong הונג קונג - + Heard Island and McDonald Islands האי הרד ואיי מקדונלד - + Honduras הונדורס - + Croatia קרואטיה - + Haiti האיטי - + Hungary הונגריה - + Indonesia אינדונזיה - + Ireland אירלנד - + Israel ישראל - + India הודו - + British Indian Ocean Territory הטריטוריה הבריטית באוקיינוס ההודי - + Iraq - עיראק + עירק - + Iran, Islamic Republic of - איראן, הרפובליקה האיסלאמית של + איראן, הרפובליקה האסלאמית של - + Iceland איסלנד - + Italy איטליה - + Jamaica ג'מייקה - + Jordan ירדן - + Japan יפן - + Kenya קניה - + Kyrgyzstan קירגיזסטן - + Cambodia קמבודיה - + Kiribati קיריבטי - + Comoros קומורו - + Saint Kitts and Nevis סנט קיטס ונוויס - + Korea, Democratic People's Republic of קוריאה, הרפובליקה הדמוקרטית העממית של - + Korea, Republic of קוריאה, הרפובליקה של - + Kuwait כווית - + Cayman Islands איי קיימן - + Kazakhstan קזחסטן - + Lao People's Democratic Republic לאוס, הרפובליקה הדמוקרטית העממית של - + Lebanon לבנון - + Saint Lucia סנט לוסיה - + Liechtenstein ליכטנשטיין - + Sri Lanka סרי לנקה - + Liberia ליבריה - + Lesotho לסוטו - + Lithuania ליטא - + Luxembourg לוקסמבורג - + Latvia לטביה - + Morocco מרוקו - + Monaco מונקו - + Moldova, Republic of מולדובה, הרפובליקה של - + Madagascar מדגסקר - + Marshall Islands איי מרשל - + Mali מאלי - + Myanmar מיאנמר - + Mongolia מונגוליה - + Northern Mariana Islands איי מריאנה הצפוניים - + Martinique מרטיניק - + Mauritania מאוריטניה - + Montserrat מונטסראט - + Malta מאלטה - + Mauritius מאוריציוס - + Maldives האיים המלדיביים - + Malawi מלאווי - + Mexico מקסיקו - + Malaysia מלזיה - + Mozambique מוזמביק - + Namibia נמיביה - + New Caledonia קלדוניה החדשה - + Niger ניז'ר - + Norfolk Island אי נורפוק - + Nigeria ניגריה - + Nicaragua ניקרגואה - + Netherlands הולנד - + Norway נורבגיה - + Nepal נפאל - + Nauru נאורו - + Niue ניואה - + New Zealand ניו זילנד - + Oman עומאן - + Panama פנמה - + Peru פרו - + French Polynesia פולינזיה הצרפתית - + Papua New Guinea פפואה גינאה החדשה - + Philippines הפיליפינים - + Pakistan - פקיסטן + פאקיסטן - + Poland פולין - + Saint Pierre and Miquelon סן פייר ומיקלון - + Puerto Rico פורטו ריקו - + Portugal פורטוגל - + Palau פלאו - + Paraguay פרגוואי - + Qatar קטאר - + Reunion - ראוניון + איחוד - + Romania רומניה - + Russian Federation הפדרציה הרוסית - + Rwanda רואנדה - + Saudi Arabia ערב הסעודית - + Solomon Islands איי שלמה - + Seychelles איי סיישל - + Sudan סודן - + Sweden שוודיה - + Singapore סינגפור - + Slovenia סלובניה - + Svalbard and Jan Mayen סבאלברד ויאן מאיין - + Slovakia סלובקיה - + Sierra Leone סיירה לאונה - + San Marino סן מרינו - + Senegal סנגל - + Somalia סומליה - + Suriname סורינאם - + Sao Tome and Principe סאו טומה ופרינסיפה - + El Salvador אל סלוודור - + Syrian Arab Republic הרפובליקה הערבית הסורית - + Swaziland סווזילנד - + Turks and Caicos Islands איי טרקס וקייקוס - + Chad צ'אד - + French Southern Territories הארצות הדרומיות של צרפת - + Togo טוגו - + Thailand תאילנד - + Tajikistan טג'יקיסטן - + Tokelau טוקלאו - + Turkmenistan טורקמניסטן - + Tunisia תוניסיה - + Tonga טונגה - - Could not decompress GeoIP database file. - לא ניתן היה לחלץ קובץ מסד־נתונים GeoIP. - - - + Timor-Leste מזרח טימור - + Bolivia, Plurinational State of בוליביה - + Bonaire, Sint Eustatius and Saba בונייר, סנט אוסטתיוס וסאבא - + Cote d'Ivoire - קוט דיוואר + חוף השנהב - + Libya לוב - + Saint Martin (French part) סן מרטין (החלק הצרפתי) - + Macedonia, The Former Yugoslav Republic of מקדוניה, הרפובליקה היוגוסלבית לשעבר של - + Macao מקאו - + Pitcairn פיטקרן - + Palestine, State of פלסטין - + Saint Helena, Ascension and Tristan da Cunha סנט הלנה, אסנשן וטריסטן דה קונה - + South Sudan דרום סודאן - + Sint Maarten (Dutch part) סנט מארטן (החלק ההולנדי) - + Turkey טורקיה - + Trinidad and Tobago טרינידד וטובגו - + Tuvalu טובאלו - + Taiwan טייוואן - + Tanzania, United Republic of טנזניה, הרפובליקה המאוחדת של - + Ukraine אוקראינה - + Uganda אוגנדה - + United States Minor Outlying Islands איים מבודדים של ארצות הברית - + United States ארצות הברית - + Uruguay אורוגוואי - + Uzbekistan אוזבקיסטן - + Holy See (Vatican City State) הכס הקדוש (קריית הוותיקן) - + Saint Vincent and the Grenadines סנט וינסנט והגרנדינים - + Virgin Islands, British איי הבתולה, בריטיים - + Virgin Islands, U.S. איי הבתולה, ארה"ב - + Vanuatu ונואטו - + Wallis and Futuna ואליס ופוטונה - + Samoa סמואה - + Yemen תימן - + Mayotte מיוט - + Serbia סרביה - + South Africa דרום אפריקה - + Zambia זמביה - + Montenegro מונטנגרו - + Zimbabwe זימבבואה - + Aland Islands איי אולנד - + Guernsey גרנזי - + Isle of Man האי מאן - + Jersey ג'רזי - + Saint Barthelemy סן ברתלמי - + + Could not uncompress GeoIP database file. + לא ניתן היה לחלץ קובץ מסד-נתונים GeoIP. + + + Couldn't save downloaded GeoIP database file. - לא ניתן היה לשמור את קובץ מסד־הנתונים GeoIP שירד. + לא ניתן היה לשמור את קובץ מסד-נתונים GeoIP שהורד. - + Successfully updated GeoIP database. - מסד־נתונים GeoIP עודכן בהצלחה. + מסד-נתונים GeoIP עודכן בהצלחה. - + Couldn't download GeoIP database file. Reason: %1 - לא היה ניתן להוריד קובץ מסד־נתונים GeoIP. סיבה: %1 + לא ניתן היה להוריד קובץ מסד-נתונים GeoIP. סיבה: %1 Net::PortForwarder - + UPnP / NAT-PMP support [ON] תמיכת UPnP / NAT-PMP [מופעלת] - + UPnP / NAT-PMP support [OFF] תמיכת UPnP / NAT-PMP [כבויה] @@ -4608,7 +4158,7 @@ Net::Smtp - + Email Notification Error: שגיאת התראת דוא"ל: @@ -4616,1278 +4166,1077 @@ OptionsDialog - + Options אפשרויות - + Behavior התנהגות - + Downloads הורדות - + Connection חיבור - + Speed מהירות - + BitTorrent ביטורנט - - RSS - RSS - - - + Web UI - ממשק רשת + ממשק אינטרנט - + Advanced מתקדם - + Language שפה - + User Interface Language: שפת ממשק משתמש: - + (Requires restart) (דורש הפעלה מחדש) - + Transfer List רשימת העברות - + Confirm when deleting torrents אשר בעת מחיקת טורנטים - + Use alternating row colors In transfer list, one every two rows will have grey background. השתמש בצבעי שורות לסירוגין - + Hide zero and infinity values הסתר ערכים של אפס ואינסוף - + Always תמיד - + Paused torrents only טורנטים מושהים בלבד - + Action on double-click פעולה בלחיצה כפולה - + Downloading torrents: טורנטים בהורדה: - - + + Start / Stop Torrent התחל / עצור טורנט - - + + Open destination folder פתח תיקיית יעד - - + + No action ללא פעולה - + Completed torrents: טורנטים שהושלמו: - + Desktop שולחן העבודה - + Start qBittorrent on Windows start up - הפעל את qBittorrent בהזנק Windows + התחל את qBittorrent בעת אתחול Windows - + Show splash screen on start up - הראה מסך מתז בהזנק + הצג מסך מתז בעת אתחול - + Start qBittorrent minimized התחל את qBittorrent ממוזער - + Confirmation on exit when torrents are active אישור ביציאה כאשר טורנטים פעילים - + Confirmation on auto-exit when downloads finish אישור ביציאה אוטומטית בעת סיום הורדות - - KiB - ק"ב - - - - Email notification &upon download completion - שלח בדוא"ל התראה בעת השלמת הורדה - - - - Run e&xternal program on torrent completion - הרץ תוכנית &חיצונית בעת השלמת טורנט - - - - IP Fi&ltering - &סינון IP - - - - Schedule &the use of alternative rate limits - תזמן את ה&שימוש במגבלות קצב חלופי - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">עוד מידע</a>) - - - - &Torrent Queueing - תור &טורנטים - - - - Seed torrents until their seeding time reaches - זרע טורנטים עד שזמן זריעתם מגיע אל - - - - A&utomatically add these trackers to new downloads: - הוסף באופן &אוטומטי גששים אלו להורדות חדשות: - - - - RSS Reader - קורא RSS - - - - Enable fetching RSS feeds - אפשר משיכת הזנות RSS - - - - Feeds refresh interval: - מרווח רענון הזנות: - - - - Maximum number of articles per feed: - מספר מירבי של מאמרים להזנה: - - - - - min - minutes - דק' - - - - RSS Torrent Auto Downloader - מורידן אוטומטי של טורנט RSS - - - - Enable auto downloading of RSS torrents - אפשר הורדה אוטומטית של טורנטי RSS - - - - Edit auto downloading rules... - ערוך כלליי הורדה אוטומטית... - - - - Web User Interface (Remote control) - ממשק משתמש של רשת (שלט רחוק) - - - - IP address: - :כתובת IP - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - כתובת IP שממשק משתמש הרשת יקושר אליה. -ציין כתובת IPv4 או כתובת IPv6. אתה יכול לציין "0.0.0.0" עבור כתובת IPv4 כלשהי, "::" עבור כתובת IPv6 כלשהי, או "*" עבור IPv4 וגם IPv6. - - - - Server domains: - תחומי שרת: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - רשימה לבנה עבור סינון ערכי כותרת של מארח HTTP. -על מנת להגן מפני מתקפת קשירה מחדש של DNS, -אתה צריך להכניס שמות חתום הנמצאים בשימוש ע"י שרת ממשק רשת. - -השתמש ב־';' כדי לפצל כניסות רבות. ניתן להשתמש בתו כללי '*'. - - - - &Use HTTPS instead of HTTP - &השתמש ב־HTTPS במקום ב־HTTP + + Show qBittorrent in notification area + הצג את qBittorrent באזור ההתראות - - Bypass authentication for clients on localhost - עקוף אימות עבור לקוחות על localhost - - - - Bypass authentication for clients in whitelisted IP subnets - עקוף אימות עבור לקוחות אשר בתת־רשתות IP ברשימה לבנה - - - - IP subnet whitelist... - רשימה לבנה של תת־רשתות IP... - - - - Upda&te my dynamic domain name - &עדכן את השם של התחום הדינמי שלי - - - + Minimize qBittorrent to notification area מזער את qBittorrent לאזור ההתראות - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. סגור את qBittorrent לאזור ההתראות - + Tray icon style: סגנון צלמית המגש: - + Normal רגיל - + Monochrome (Dark theme) מונוכרום (ערכת נושא כהה) - + Monochrome (Light theme) מונוכרום (ערכת נושא בהירה) - + File association שיוך קובץ - + Use qBittorrent for .torrent files - השתמש ב־qBittorrent עבור קבצי torrent. + השתמש ב-qBittorrent עבור קבצי .torrent - + Use qBittorrent for magnet links - השתמש ב־qBittorrent עבור קישורי מגנט + השתמש ב-qBittorrent עבור קישורי מגנט - + Power Management ניהול צריכת חשמל - + + Inhibit system sleep when torrents are active + עכב שינת מערכת כאשר טורנטים פעילים + + + + Log file + קובץ יומן אירועים + + + Save path: נתיב שמירה: - + Backup the log file after: גבה את קובץ יומן האירועים לאחר: - + + MB + מ"ב + + + Delete backup logs older than: מחק קבצי יומן אירועים הישנים יותר מ: - + days Delete backup logs older than 10 months ימים - + months Delete backup logs older than 10 months חודשים - + years Delete backup logs older than 10 years שנים - + When adding a torrent בעת הוספת טורנט - + + Display torrent content and some options + הצג תוכן טורנט ומספר אפשרויות + + + Bring torrent dialog to the front הבא את דו שיח הטורנט לחזית - + Do not start the download automatically The torrent will be added to download list in pause state אל תתחיל את ההורדה באופן אוטומטי - + Should the .torrent file be deleted after adding it האם על קובץ הטורנט להימחק לאחר הוספתו - + + Delete .torrent files afterwards + מחק קבצי טורנט לאחר מכן + + + Also delete .torrent files whose addition was cancelled מחק גם קבצי טורנט שהוספתם בוטלה - + Also when addition is cancelled גם כאשר הוספה מבוטלת - + Warning! Data loss possible! אזהרה! אבדן נתונים אפשרי! - + Saving Management ניהול שמירה - + Default Torrent Management Mode: מצב ניהול טורנטים ברירת מחדל: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category מצב אוטומטי אומר שמאפייני טורנט שונים (לדוגמה, נתיב שמירה) יוחלטו ע"י המדור המשויך - + Manual ידני - + Automatic אוטומטי - + When Torrent Category changed: כאשר מדור טורנט השתנה: - + Relocate torrent מקם מחדש טורנט - + Switch torrent to Manual Mode החלף טורנט למצב ידני - + When Default Save Path changed: כאשר נתיב שמירה ברירת מחדל השתנה: - - + + Relocate affected torrents מקם מחדש טורנטים מושפעים - - + + Switch affected torrents to Manual Mode החלף טורנטים מושפעים למצב ידני - + When Category changed: כאשר מדור השתנה: - + Use Subcategories השתמש במדורי משנה - + Default Save Path: נתיב שמירה ברירת מחדל: - + Keep incomplete torrents in: שמור טורנטים בלתי שלמים ב: - + Copy .torrent files to: העתק קבצי .torrent אל: - - Show &qBittorrent in notification area - הראה את &qBittorrent באזור ההתראות - - - - &Log file - קובץ &יומן - - - - Display &torrent content and some options - הצג תוכן &טורנט ומספר אפשרויות - - - - Create subfolder for torrents with multiple files - צור תיקיית משנה עבור טורנטים עם קבצים רבים - - - - De&lete .torrent files afterwards - מ&חק קבצי .torrent לאחר מכן - - - + Copy .torrent files for finished downloads to: העתק קבצי torrent. עבור הורדות שהסתיימו אל: - + Pre-allocate disk space for all files הקצה מראש מקום בכונן עבור כל הקבצים - - Inhibit system sleep when torrents are downloading - עכב שינת מערכת כאשר טורנטים יורדים - - - - Inhibit system sleep when torrents are seeding - עכב שינת מערכת כאשר טורנטים זורעים - - - + Append .!qB extension to incomplete files הוסף סיומת .!qB לקבצים בלתי שלמים - - Enable recursive download dialog - אפשר דו־שיח של הורדה נסיגתית - - - + Automatically add torrents from: הוסף טורנטים באופן אוטומטי מ: - + Add entry הוסף כניסה - + Remove entry הסר כניסה - + + Email notification upon download completion + התראה בדוא"ל בעת השלמת הורדה + + + + Destination email: + דוא"ל יעד: + + + SMTP server: שרת SMTP: - + This server requires a secure connection (SSL) שרת זה דורש חיבור מאובטח (SSL) - - + + + Authentication אימות - - - - + + + + Username: שם משתמש: - - - - + + + + Password: סיסמה: - - Enabled protocol: - פרוטוקול מאופשר: - - - - TCP and μTP - TCP ו־μTP + + Run external program on torrent completion + הרץ תכנית חיצונית בעת השלמת טורנט - + Listening Port פתחת האזנה - + Port used for incoming connections: פתחה המשמשת לחיבורים נכנסים: - + Random אקראי - + Use UPnP / NAT-PMP port forwarding from my router השתמש בקידום פתחות UPnP / NAT-PMP מהנתב שלי - + Use different port on each startup - השתמש בפתחה שונה בכל הזנק + השתמש בפתחה שונה בכל אתחול - + Connections Limits מגבלות חיבורים - + Maximum number of connections per torrent: מספר מרבי של חיבורים לכל טורנט: - + Global maximum number of connections: - מספר מרבי עולמי של חיבורים: + מספר מרבי כללי של חיבורים: - + Maximum number of upload slots per torrent: מספר מרבי של חריצי העלאה לכל טורנט: - + Global maximum number of upload slots: - מספר מרבי עולמי של חריצי העלאה: + מספר מרבי כללי של חריצי העלאה: - + Proxy Server - שרת ייפוי כוח + שרת יפוי-כח - + Type: סוג: - + (None) (כלום) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP - HTTP + SOCKS5 - + Host: מארח: - - + + Port: פתחה: - + Otherwise, the proxy server is only used for tracker connections - אחרת, שרת ייפוי הכוח משמש רק לחיבורי גששים + אחרת, שרת יפוי הכח משמש רק לחיבורי גשש - + Use proxy for peer connections - השתמש בייפוי כוח עבור חיבורי עמיתים + השתמש ביפוי כח עבור חיבורי עמיתים - + Disable connections not supported by proxies - השבת חיבורים שאינם נתמכים ע"י ייפויי כוח - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">עוד מידע</a>) + השבת חיבורים שאינם נתמכים ע"י יפויי כח - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection הזנות RSS, מנוע חיפוש, עדכוני תוכנה או כל דבר אחר מלבד העברות טורנט ופעולות קשורות (כגון חילופי עמיתים) ישתמשו בחיבור ישיר - + Use proxy only for torrents - השתמש בייפוי כוח רק לטורנטים + השתמש ביפוי כח רק לטורנטים - - A&uthentication - &אימות - - - + Info: The password is saved unencrypted מידע: הסיסמה נשמרת בלתי מוצפנת - + + IP Filtering + סינון IP + + + Filter path (.dat, .p2p, .p2b): - נתיב מסנן (.dat, .p2p, .p2b): + נתיב מסנן ( .dat, .p2p, .p2b): - + Reload the filter טען מחדש את המסנן - - Manually banned IP addresses... - כתובות IP שהוחרמו באופן ידני... - - - + Apply to trackers החל על גששים - + Global Rate Limits - מגבלות קצב עולמי - - - - - - - - - KiB/s - ק"ב/ש + מגבלות קצב כללי - - + + Upload: העלאה: - - + + + + + KiB/s + ק"ב/ש + + + + Download: הורדה: - + Alternative Rate Limits מגבלות קצב חלופי - - + + Schedule the use of alternative rate limits + תזמן את השימוש במגבלות קצב חלופי + + + From: from (time1 to time2) מ: - - + To: time1 to time2 אל: - + When: מתי: - + Every day כל יום - + Weekdays ימי חול - + Weekends סופי שבוע - + Rate Limits Settings - הגדרות מגבלות קצב + קביעות מגבלות קצב - + Apply rate limit to peers on LAN - החל מגבלת קצב על עמיתים ב־LAN + החל מגבלת קצב על עמיתים ב-LAN - + Apply rate limit to transport overhead החל מגבלת קצב על תקורת תעבורה - - + + + Enable µTP protocol + אפשר פרוטוקול µTP + + + Apply rate limit to µTP protocol החל מגבלת קצב על פרוטוקול µTP - + Privacy פרטיות - + Enable DHT (decentralized network) to find more peers אפשר DHT (רשת מבוזרת) כדי למצוא יותר עמיתים - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) החלף עמיתים עם לקוחות ביטורנט תואמים (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers אפשר החלפת עמיתים (PeX) כדי למצוא יותר עמיתים - + Look for peers on your local network חפש עמיתים על הרשת המקומית שלך - + Enable Local Peer Discovery to find more peers אפשר גילוי עמיתים מקומיים כדי למצוא יותר עמיתים - + Encryption mode: מצב הצפנה: - + Prefer encryption העדף הצפנה - + Require encryption דרוש הצפנה - + Disable encryption השבת הצפנה - + Enable when using a proxy or a VPN connection - אפשר בעת שימוש בחיבור ייפוי כוח או בחיבור VPN + אפשר בעת שימוש בחיבור יפוי כח או בחיבור VPN - + Enable anonymous mode אפשר מצב אלמוני - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">מידע נוסף</a>) + + + + Torrent Queueing + תור טורנטים + + + Maximum active downloads: הורדות פעילות מרביות: - + Maximum active uploads: העלאות פעילות מרביות: - + Maximum active torrents: טורנטים פעילים מרביים: - + Do not count slow torrents in these limits אל תחשיב טורנטים איטיים במגבלות אלו - - Upload rate threshold: - סף קצב העלאה: - - - - Download rate threshold: - סף קצב הורדה: - - - - sec - seconds - שניות - - - - Torrent inactivity timer: - קוצב־זמן של אי־פעילות טורנט - - - + Share Ratio Limiting - הגבלת יחס שיתוף + מגבלת יחס שיתוף - + Seed torrents until their ratio reaches זרע טורנטים עד שיחסם מגיע אל - + then לאחר מכן - + Pause them השהה אותם - + Remove them הסר אותם - - RSS Smart Episode Filters - מסנני RSS חכמים של פרקים + + Automatically add these trackers to new downloads: + הוסף באופן אוטומטי גששים אלו להורדות חדשות: + + + + Enable Web User Interface (Remote control) + אפשר ממשק משתמש אינטרנטי (שלט רחוק) - + Use UPnP / NAT-PMP to forward the port from my router - השתמש ב־UPnP / NAT-PMP כדי להעביר הלאה את הפתחה מהנתב שלי + השתמש ב-UPnP / NAT-PMP כדי להעביר הלאה את הפתחה מהנתב שלי - + + Use HTTPS instead of HTTP + השתמש ב-HTTPS במקום ב-HTTP + + + Certificate: אישור: - + Import SSL Certificate ייבא אישור SSL - + Key: מפתח: - + Import SSL Key ייבא מפתח SSL - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>מידע אודות אישורים</a> - - - - Use alternative Web UI - השתמש בממשק רשת חלופי + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificatesמידע אודות אישורים</a> - - Files location: - מיקום קבצים: + + Bypass authentication for localhost + עקוף אימות למארח מקומי - - Enable clickjacking protection - אפשר הגנה מפני מחטף לחיצה + + Update my dynamic domain name + עדכן את שם התחום הדינמי שלי - - Enable Cross-Site Request Forgery (CSRF) protection - אפשר הגנה מפני זיוף בקשות חוצות־אתרים (CSRF) - - - + Service: - שירות: + שרות: - + Register הירשם - + Domain name: שם תחום: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! על ידי אפשור אפשרויות אלו, אתה יכול <strong>לאבד בצורה בלתי הפיכה</strong> את קבצי הטורנט שלך! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well כאשר אפשרויות אלו מאופשרות, qBittorent <strong>ימחק</strong> קבצי טורנט לאחר שהם התווספו בהצלחה (האפשרות הראשונה) או לא (האפשרות השנייה) לתור ההורדות. זה יחול <strong>לא רק</strong> על הקבצים שנפתחו דרך פעולת התפריט &ldquo;הוספת טורנט&rdquo; אלא גם על אלו שנפתחו דרך <strong>שיוך סוג קובץ</strong> - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - אם תאפשר את האפשרות השנייה (&ldquo;גם כאשר הוספה מבוטלת &rdquo;) קובץ הטורנט <strong>יימחק</strong> אפילו אם תלחץ על &ldquo;<strong>ביטול</strong>&rdquo; בדו־שיח &ldquo;הוספת טורנט&rdquo; - - - - Choose Alternative UI files location - בחר מיקום של קבצי ממשק חלופי + אם תאפשר את האפשרות השנייה (&ldquo;גם כאשר הוספה מבוטלת &rdquo;) קובץ הטורנט <strong>יימחק</strong> אפילו אם תלחץ על &ldquo;<strong>ביטול</strong>&rdquo; בדו-השיח &ldquo;הוספת טורנט&rdquo; - + Supported parameters (case sensitive): - פרמטרים נתמכים (תלוי רישיות): + משתנים נתמכים (רגישות לאותיות): - + %N: Torrent name - %N: שם טורנט + %N: שם הטורנט - + %L: Category %L: מדור - - %G: Tags (seperated by comma) - %G: תגיות (מופרדות ע"י פסיק) - - - + %F: Content path (same as root path for multifile torrent) %F: נתיב תוכן (זהה לנתיב שורש עבור טורנט מרובה קבצים) - + %R: Root path (first torrent subdirectory path) %R: נתיב שורש (תחילה נתיב תיקיית משנה של טורנט) - + %D: Save path %D: נתיב שמירה - + %C: Number of files %C: מספר קבצים - + %Z: Torrent size (bytes) %Z: גודל טורנט (בתים) - + %T: Current tracker %T: גשש נוכחי - + %I: Info hash %I: גיבוב מידע - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - עצה: תמצת פרמטר בעזרת סימני ציטוט כדי למנוע ממלל להיחתך בשטח לבן (לדוגמה, "%N") - - - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - טורנט ייחשב איטי אם הקצבים של הורדתו והעלאתו נשארים מתחת לערכים אלו עבור שניות "קוצב־זמן של אי־פעילות טורנט" + עצה: תמצת משתנה בעזרת סימני ציטוט כדי למנוע ממלל להיחתך בשטח לבן (לדוגמה, "%N") - + Select folder to monitor בחר תיקייה לניטור - + Folder is already being monitored: תיקייה כבר מנוטרת: - + Folder does not exist: תיקייה אינה קיימת: - + Folder is not readable: תיקייה אינה קריאה: - + Adding entry failed הוספת כניסה נכשלה - - - - + + Choose export directory - בחר תיקיית ייצוא + בחר ספריית ייצוא - - - + + + + + + Choose a save directory - בחירת סיפריית שמירה + בחירת תיקייה לשמירה - + Choose an IP filter file בחר קובץ מסנן IP - + All supported filters כל המסננים הנתמכים - + SSL Certificate אישור SSL - + + SSL Key + מפתח SSL + + + Parsing error שגיאת ניתוח - + Failed to parse the provided IP filter - נכשל בניתוח מסנן ה־IP שסופק. + נכשל בניתוח מסנן ה-IP שסופק. - + Successfully refreshed רוענן בהצלחה - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - ניתח בהצלחה את מסנן ה־IP שסופק: %1 כללים הוחלו. + ניתח בהצלחה את מסנן ה-IP שסופק: %1 כללים הוחלו. - + Invalid key - מפתח לא תקף + מפתח בלתי תקין - + This is not a valid SSL key. זה אינו מפתח SSL תקין. - + Invalid certificate - אישור לא תקף - - - - Preferences - העדפות - - - - Import SSL certificate - ייבא אישור SSL + אישור בלתי תקין - + This is not a valid SSL certificate. זה אינו אישור SSL תקין. - - Import SSL key - ייבא מפתח SSL - - - - SSL key - מפתח SSL - - - + Time Error שגיאת זמן - + The start time and the end time can't be the same. זמן ההתחלה וזמן הסוף אינם יכולים להיות אותו הדבר. - - + + Length Error שגיאת אורך - + The Web UI username must be at least 3 characters long. שם המשתמש של ממשק הרשת חייב להיות באורך של 3 תוים לפחות. - + The Web UI password must be at least 6 characters long. הסיסמה של ממשק הרשת חייבת להיות באורך של 6 תוים לפחות. @@ -5895,266 +5244,251 @@ PeerInfo - - Interested(local) and Choked(peer) + + interested(local) and choked(peer) מעוניין (מקומי) וחנוק (עמית) - + interested(local) and unchoked(peer) מעוניין (מקומי) ולא חנוק (עמית) - + interested(peer) and choked(local) מעוניין (עמית) וחנוק (מקומי) - + interested(peer) and unchoked(local) מעוניין (עמית) ולא חנוק (מקומי) - + optimistic unchoke לא חנוק אופטימי - + peer snubbed עמית השתחצן - + incoming connection חיבור נכנס - + not interested(local) and unchoked(peer) לא מעוניין (מקומי) ולא חנוק (עמית) - + not interested(peer) and unchoked(local) לא מעוניין (עמית) ולא חנוק (מקומי) - + peer from PEX - עמית מ־PEX + עמית מ-PEX - + peer from DHT - עמית מ־DHT + עמית מ-DHT - + encrypted traffic תעבורה מוצפנת - + encrypted handshake לחיצת יד מוצפנת - + peer from LSD - עמית מ־LSD + עמית מ-LSD PeerListWidget - + IP IP - + Port פתחה - + Flags דגלים - + Connection חיבור - + Client i.e.: Client application לקוח - + Progress i.e: % downloaded התקדמות - + Down Speed i.e: Download speed מהירות הורדה - + Up Speed i.e: Upload speed מהירות העלאה - + Downloaded i.e: total data downloaded - ירד + הורד - + Uploaded i.e: total data uploaded הועלה - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. רלוונטיות - + Files i.e. files that are being downloaded right now קבצים - + Column visibility ראות עמודות - + Add a new peer... הוסף עמית חדש... - - + + Ban peer permanently - חסום עמית לצמיתות + חסימת עמית באופן קבוע - + Manually adding peer '%1'... מוסיף באופן ידני את עמית '%1'... - + The peer '%1' could not be added to this torrent. העמית '%1' לא היה יכול להתווסף לטורנט זה. - + Manually banning peer '%1'... מחרים באופן ידני את עמית '%1'... - - + + Peer addition הוספת עמית - + Country מדינה - + Copy IP:port העתק IP:פתחה - + Some peers could not be added. Check the Log for details. מספר עמיתים לא יכלו להתווסף. אנא בדוק את יומן האירועים לפרטים. - + The peers were added to this torrent. העמיתים התווספו לטורנט זה. - + Are you sure you want to ban permanently the selected peers? - האם אתה בטוח שאתה רוצה להחרים לצמיתות את העמיתים הנבחרים? + האם אתה בטוח שברצונך להחרים באופן קבוע את העמיתים שנבחרו? - + &Yes &כן - + &No &לא - PeersAdditionDialog - - - Add Peers - הוסף עמיתים - - - - List of peers to add (one IP per line): - רשימת עמיתים להוספה (IP אחד לשורה): - - - - Format: IPv4:port / [IPv6]:port - תסדיר: IPv4:פתחה / [IPv6]:פתחה - + PeersAdditionDlg - + No peer entered לא הוכנס עמית - + Please type at least one peer. אנא הקלד לפחות עמית אחד. - + Invalid peer - עמית בלתי תקף + עמית בלתי תקין - + The peer '%1' is invalid. - העמית '%1' אינו תקף. + העמית '%1' בלתי תקין. PieceAvailabilityBar - + White: Unavailable pieces לבן: חתיכות לא זמינות - + Blue: Available pieces כחול: חתיכות זמינות @@ -6162,371 +5496,327 @@ PiecesBar - + Files in this piece: קבצים בחתיכה זו: - + File in this piece קובץ בחתיכה זו - + File in these pieces קובץ בחתיכות אלו - - Wait until metadata become available to see detailed information - המתן עד שמטא־נתונים יהפכו לזמינים כדי לראות מידע מפורט - - - + Hold Shift key for detailed information החזק את מקש Shift למידע מפורט - PluginSelectDialog + PluginSelectDlg - + Search plugins - מתקעי חיפוש + תוספי חיפוש - + Installed search plugins: - מתקעי חיפוש מותקנים: + תוספי חיפוש מותקנים: - + Name שם - + Version גרסה - + Url כתובת - - + + Enabled מאופשר - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - אזהרה: הייה בטוח להיענות לחוקי זכויות היוצרים של מדינתך בעת הורדת טורנטים מכל אחד ממנועי חיפוש אלו. - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - אתה יכול לקבל מתקעי מנוע חיפוש חדשים כאן: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + אתה יכול לקבל תוספי חיפוש חדשים כאן: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one התקן אחד חדש - + Check for updates - בדוק אחר עדכונים + חפש עדכונים - + Close סגור - + Uninstall הסר התקנה - - - + + + Yes כן - - - - + + + + No לא - + Uninstall warning אזהרת הסרת התקנה - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - מספר מתקעים לא יכלו להיות מוסרים כי הם כלולים ב־qBittorrent. רק אלו שהוספת בעצמך ניתנים להסרה. -מתקעים אלו הושבתו. + לא ניתן היה להסיר חלק מהתוספים כי הם כלולים ב-qBittorrent. רק אלו שהוספת בעצמך ניתנים להסרה. +תוספים אלו הושבתו. - + Uninstall success - הסרת התקנה הצליחה + ההסרה הצליחה - + All selected plugins were uninstalled successfully - כל המתקעים הנבחרים הוסרו בהצלחה - - - - - - - Search plugin update - עדכון מתקע חיפוש - - - - Plugins installed or updated: %1 - מתקעים הותקנו או עודכנו: %1 + כל התוספים שנבחרו הוסרו בהצלחה - - + + New search engine plugin URL - כתובת מתקע חדש של מנוע חיפוש + כתובת התוסף של מנוע חיפוש חדש - - + + URL: כתובת: - + Invalid link - קישור לא תקף + קישור בלתי תקין - + The link doesn't seem to point to a search engine plugin. - נראה שהקישור אינו מצביע על מתקע של מנוע חיפוש. + נראה שהקישור אינו מצביע על תוסף של מנוע חיפוש. - + Select search plugins - בחר מתקעי חיפוש + בחר תוספי חיפוש - + qBittorrent search plugin - מתקע חיפוש של qBittorrent + תוסף חיפוש של qBittorrent + + + + + + Search plugin update + עדכון תוסף החיפוש - + All your plugins are already up to date. - כל המתקעים שלך מעודכנים כבר. + כל התוספים שלך מעודכנים כבר. - + Sorry, couldn't check for plugin updates. %1 - סליחה, לא ניתן היה לבדוק אחר עדכוני מתקעים. %1 + סליחה, לא ניתן היה לבדוק אחר עדכוני תוספים. %1 - + + + Search plugin install - התקנת מתקע חיפוש + התקנת תוסף חיפוש + + + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + תוסף מנוע החיפוש "%1" הותקן בהצלחה. - + Couldn't install "%1" search engine plugin. %2 - לא ניתן היה להתקין את המתקע של מנוע החיפוש "%1". %2 + לא ניתן היה להתקין את תוסף מנוע החיפוש "%1". %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + תוסף מנוע החיפוש "%1" עודכן בהצלחה. + + + Couldn't update "%1" search engine plugin. %2 - לא ניתן היה לעדכן את המתקע של מנוע החיפוש "%1". %2 + לא ניתן היה לעדכן את תוסף מנוע החיפוש "%1". %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - מקור מתקע + מקור תוסף - + Search plugin source: - מקור מתקע חיפוש: + מקור תוסף חיפוש: - + Local file קובץ מקומי - + Web link - קישור רשת - - - - PowerManagement - - - qBittorrent is active - qBittorrent פעיל + קישור אינטרנט - PreviewSelectDialog - - - Preview - הצג מראש - + PreviewSelect - + Name שם - + Size גודל - + Progress התקדמות - - + + Preview impossible תצוגה מקדימה בלתי אפשרית - - + + Sorry, we can't preview this file סליחה, אנו לא יכולים להציג מראש קובץ זה - Private::FileLineEdit - - - '%1' does not exist - '%1' אינו קיים - - - - '%1' does not point to a directory - '%1' אינו מצביע על סיפרייה - - - - '%1' does not point to a file - '%1' אינו מצביע על קובץ - - - - Does not have read permission in '%1' - אין הרשאת קריאה ב־'%1' - - - - Does not have write permission in '%1' - אין הרשאת כתיבה ב־'%1' - - - PropListDelegate - + Not downloaded לא ירד - - + + Normal Normal (priority) רגיל - - N/A - לא זמין - - - + Do not download Do not download (priority) - אל תוריד + אל תוריד - - + + High High (priority) גבוה - + N/A + לא זמין + + + Mixed Mixed (priorities - מעורבב + מעורב - - + + Maximum Maximum (priority) - מירב + מרב PropTabBar - + General כללי - + Trackers גששים - + Peers עמיתים - + HTTP Sources מקורות HTTP - + Content תוכן - + Speed מהירות @@ -6620,22 +5910,22 @@ הערה: - + Select All - בחר הכל + בחירת הכל - + Select None - אל תבחר כלום + לא לבחור כלום - + Normal רגיל - + High גבוה @@ -6672,7 +5962,7 @@ Added On: - התווסף ב: + התווסף בתאריך: @@ -6695,165 +5985,165 @@ נתיב שמירה: - + Maximum - מירב + מרב + - Do not download אל תוריד - + Never אף פעם - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (יש %3) - - + + %1 (%2 this session) - %1 (%2 שיח נוכחי) + %1 (%2 בהפעלה הנוכחית) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - %1 (נזרע במשך %2) + %1 (זרוע במשך %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) - %1 (%2 מירב) + %1 (%2 מרב) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 סה"כ) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 ממוצע) - + Open פתח - + Open Containing Folder פתח תיקייה מכילה - + Rename... שנה שם... - + Priority עדיפות - + New Web seed זורע רשת חדש - + Remove Web seed הסר זורע רשת - + Copy Web seed URL העתק כתובת זורע רשת - + Edit Web seed URL ערוך כתובת זורע רשת - + + Rename the file + שנה את שם הקובץ + + + New name: שם חדש: - - + + + The file could not be renamed + לא ניתן היה לשנות את שם הקובץ + + + + This file name contains forbidden characters, please choose a different one. + שם הקובץ מכיל תוים אסורים, אנא בחר שם שונה. + + + + This name is already in use in this folder. Please use a different name. שם זה נמצא כבר בשימוש בתיקייה זו. אנא השתמש בשם שונה. - + The folder could not be renamed לא ניתן היה לשנות את שם התיקייה - + qBittorrent qBittorrent - + Filter files... סנן קבצים... - - Renaming - שינוי שם - - - - - Rename error - שגיאת שינוי שם - - - - The name is empty or contains forbidden characters, please choose a different one. - השם ריק או מכיל תוים אסורים, אנא בחר שם שונה. - - - + New URL seed New HTTP source זורע כתובת חדש - + New URL seed: זורע כתובת חדש: - - + + This URL seed is already in the list. זורע כתובת זה נמצא כבר ברשימה. - + Web seed editing עריכת זורע רשת - + Web seed URL: כתובת זורע רשת: @@ -6861,585 +6151,551 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + כתובת ה-IP שלך הוחרמה לאחר יותר מדי ניסיונות אימות כושלות. + + + + Error: '%1' is not a valid torrent file. + + שגיאה: '%1' אינו קובץ טורנט תקין. + + + + + Error: Could not add torrent to session. + שגיאה: לא ניתן היה להוסיף טורנט להפעלה הנוכחית. + + + + I/O Error: Could not create temporary file. + שגיאת ק/פ: לא ניתן היה ליצור קובץ זמני. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. - %1 הוא פרמטר בלתי ידוע של שורת הפקודה. + %1 הוא משתנה בלתי ידוע של שורת הפקודה. - - + + %1 must be the single command line parameter. - %1 חייב להיות הפרמטר היחיד של שורת הפקודה. + %1 חייב להיות המשתנה היחיד של שורת הפקודה. + + + + %1 must specify the correct port (1 to 65535). + %1 חייב לציין את הפתחה הנכונה (1 עד 65535). - + You cannot use %1: qBittorrent is already running for this user. - אינך יכול להשתמש ב־%1: התוכנית qBittorrent רצה כבר עבור משתמש זה. + אינך יכול להשתמש ב-%1: qBittorrent מורץ כבר עבור משתמש זה. - + Usage: שימוש: - + Options: אפשרויות: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - הפרמטר '%1' חייב לעקוב אחר התחביר '%1=%2' + + Displays program version + מציג גרסת תכנית - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - הפרמטר '%1' חייב לעקוב אחר התחביר '%1=%2' + + Displays this help message + מציג הודעה זו של עזרה - - Expected integer number in environment variable '%1', but got '%2' - מספר שלם צפוי במשתנה סביבה '%1', אך התקבל '%2' + + Changes the Web UI port (current: %1) + משנה את פתחת ממשק משתמש הרשת (נוכחי: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - הפרמטר '%1' חייב לעקוב אחר התחביר '%1=%2' + + Disable splash screen + השבת מסך מתז - - Expected %1 in environment variable '%2', but got '%3' - צפוי %1 במשתנה סביבה '%2', אך התקבל '%3' + + Run in daemon-mode (background) + הרץ במצב דימון (רקע) - - port - פתחה + + Downloads the torrents passed by the user + מוריד את הטורנטים שעברו ע"י המשתמש - - %1 must specify a valid port (1 to 65535). - %1 חייב לציין פתחה תקפה (1 עד 65535). + + Help + עזרה - - Display program version and exit - מציג גרסת תוכנית ויוצא + + Run application with -h option to read about command line parameters. + הרץ יישום עם אפשרות -h כדי לקרוא על משתני שורת הפקודה. - - Display this help message and exit - מציג הודעה זו של עזרה ויוצא + + Bad command line + שורת פקודה גרועה - - Change the Web UI port - שנה את פתחת ממשק הרשת + + Bad command line: + שורת פקודה גרועה: - - Disable splash screen - השבת מסך מתז + + Legal Notice + התראה משפטית - - Run in daemon-mode (background) - הרץ במצב דימון (רקע) + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + qBittorrent הוא תכנית שיתוף קבצים. כאשר אתה מריץ טורנט, נתוניו יהפכו לזמינים לאחרים על ידי העלאה. כל תוכן שאתה משתף הוא באחריותך הבלעדית. + +לא יונפקו התראות נוספות. + + + + Press %1 key to accept and continue... + לחץ על מקש %1 כדי להסכים ולהמשיך... - - dir - Use appropriate short form or abbreviation of "directory" - סיפרייה + + Legal notice + התראה משפטית - - Store configuration files in <dir> - אחסן קבצי תצורה ב<dir> + + Cancel + ביטול - - - name - שם + + I Agree + אני מסכים - - Store configuration files in directories qBittorrent_<name> - אחסן קבצי תצורה בסיפריות qBittorrent_<name> + + Torrent name: %1 + שם טורנט: %1 - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - פרוץ לתוך קבצי libtorrent fastresume והפוך נתיבי קבצים לקשורים לסיפריית הפרופיל + + Torrent size: %1 + גודל טורנט: %1 - - files or URLs - קבצים או כתובות + + Save path: %1 + נתיב שמירה: %1 - - Download the torrents passed by the user - מוריד את הטורנטים שדולגו ע"י המשתמש + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + הטורנט הורד תוך %1. - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - מציין האם הדו־שיח "הוספת טורנט חדש" נפתח בעת הוספת טורנט. + + Thank you for using qBittorrent. + תודה על השימוש ב qBittorrent. - - Options when adding new torrents: - אפשרויות בעת הוספת טורנטים חדשים: + + [qBittorrent] '%1' has finished downloading + [qBittorrent] '%1' סיים לרדת - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - קיצור דרך עבור %1 + + The remote host name was not found (invalid hostname) + שם המארח המרוחק לא נמצא (שם מארח בלתי תקין) - - path - נתיב + + The operation was canceled + הפעולה בוטלה - - Torrent save path - נתיב שמירת טורנט + + The remote server closed the connection prematurely, before the entire reply was received and processed + השרת המרוחק סגר את החיבור בטרם עת, לפני שהתגובה כולה התקבלה ועובדה - - Add torrents as started or paused - הוסף טורנטים כמותחלים או מושהים + + The connection to the remote server timed out + לחיבור לשרת המרוחק אזל הזמן - - Skip hash check - דלג על בדיקת גיבוב + + SSL/TLS handshake failed + אימות SSL/TLS נכשל - - Assign torrents to category. If the category doesn't exist, it will be created. - הקצה טורנטים למדור. אם המדור אינו קיים, הוא יווצר. + + The remote server refused the connection + השרת המרוחק דחה את החיבור - - Download files in sequential order - הורד קבצים בסדר עוקב + + The connection to the proxy server was refused + החיבור לשרת יפוי הכח סורב - - Download first and last pieces first - הורד חתיכה ראשונה ואחרונה תחילה + + The proxy server closed the connection prematurely + שרת יפוי הכח סגר את החיבור בטרם עת - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - ערכי אפשרות יכולים להיות מסופקים באמצעות משתני סביבה. לאפשרות בשם 'parameter-name', שם משתנה סביבה הוא 'QBT_PARAMETER_NAME' (ברישיות גדולה, '-' מוחלף עם '_'). כדי לחלוף על ערכי דגל, הגדר את המשתנה אל '1' או 'TRUE'. לדוגמה, כדי להשבית את מסך המתז: + + The proxy host name was not found + שם מארח יפוי הכח לא נמצא - - Command line parameters take precedence over environment variables - פרמטרי שורת פקודה לוקחים קדימות על משתני סביבה + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + לחיבור ליפוי הכח אזל הזמן או שיפוי הכח לא הגיב בזמן לבקשה שנשלחה - - Help - עזרה + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + יפוי הכח דורש אימות על מנת לכבד את הבקשה אבל לא קיבל אישורים כלשהם שהוצעו - - Run application with -h option to read about command line parameters. - הרץ יישום עם אפשרות -h כדי לקרוא על פרמטרי שורת הפקודה. + + The access to the remote content was denied (401) + הגישה לתוכן המרוחק נדחתה (401) - - Bad command line - שורת פקודה גרועה + + The operation requested on the remote content is not permitted + הפעולה המבוקשת על התוכן המרוחק אינה מורשת - - Bad command line: - שורת פקודה גרועה: + + The remote content was not found at the server (404) + התוכן המרוחק לא נמצא בשרת (404) - - Legal Notice - התראה משפטית + + The remote server requires authentication to serve the content but the credentials provided were not accepted + השרת המרוחק דורש אימות כדי להגיש את התוכן אבל האישורים שסופקו לא קובלו - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - qBittorrent הוא תוכנית שיתוף קבצים. כאשר אתה מריץ טורנט, נתוניו יהפכו לזמינים לאחרים באמצעות העלאה. כל תוכן שהוא שאתה משתף הוא באחריותך הבלעדית. + + The Network Access API cannot honor the request because the protocol is not known + ה-API של גישת הרשת אינו יכול לכבד את הבקשה כי הפרוטוקול בלתי ידוע - - No further notices will be issued. - לא יונפקו התראות נוספות. + + The requested operation is invalid for this protocol + הפעולה המבוקשת בלתי תקינה עבור פרוטוקול זה - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - qBittorrent הוא תוכנית שיתוף קבצים. כאשר אתה מריץ טורנט, נתוניו יהפכו לזמינים לאחרים על ידי העלאה. כל תוכן שאתה משתף הוא באחריותך הבלעדית. - -לא יונפקו התראות נוספות. + + An unknown network-related error was detected + שגיאה בלתי ידועה הקשורה לרשת זוהתה - - Press %1 key to accept and continue... - לחץ על מקש %1 כדי להסכים ולהמשיך... + + An unknown proxy-related error was detected + שגיאה בלתי ידועה הקשורה ליפוי כח זוהתה - - Legal notice - התראה משפטית + + An unknown error related to the remote content was detected + שגיאה בלתי ידועה הקשורה לתוכן המרוחק זוהתה - - Cancel - ביטול + + A breakdown in protocol was detected + תקלה בפרוטוקול זוהתה - - I Agree - אני מסכים + + Unknown error + שגיאה בלתי ידועה - - + + Upgrade שדרג - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - עדכנת מגרסה ישנה יותר ששמרה דברים בצורה שונה. אתה חייב להגר למערכת השמירה החדשה. לא תוכל להשתמש בגרסה הישנה יותר מ־3.3.0 שוב. להמשיך? [כ/ל] + עדכנת מגרסה ישנה יותר ששמרה דברים בצורה שונה. אתה חייב להגר למערכת השמירה החדשה. לא תוכל להשתמש בגרסה הישנה יותר מ-3.3.0 שוב. להמשיך? [כ/ל] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - עדכנת מגרסה ישנה יותר ששמרה דברים בצורה שונה. אתה חייב להגר למערכת השמירה החדשה. אם תמשיך, לא תוכל להשתמש בגרסה הישנה יותר מ־3.3.0 שוב. + עדכנת מגרסה ישנה יותר ששמרה דברים בצורה שונה. אתה חייב להגר למערכת השמירה החדשה. אם תמשיך, לא תוכל להשתמש בגרסה הישנה יותר מ-3.3.0 שוב. - + Couldn't migrate torrent with hash: %1 - לא ניתן היה להגר טורנט עם גיבוב: %1 + לא ניתן היה למזג טורנט עם גיבוב: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 - לא ניתן היה להגר טורנט. שם קובץ המשכה מהירה לא תקף: %1 + לא ניתן היה להגר טורנט. שם קובץ המשכה מהירה בלתי תקין: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 - התגלתה יציאה בלתי נקייה של תוכנית. משתמש בקובץ נסיגה כדי לשחזר הגדרות: %1 + + Detected unclean program exit. Using fallback file to restore settings. + התגלתה יציאת תכנית בלתי נקייה. משתמש בקובץ נסיגה כדי לשחזר קביעות. - + An access error occurred while trying to write the configuration file. שגיאת גישה התרחשה בעת ניסיון לכתוב את קובץ התצורה. - + A format error occurred while trying to write the configuration file. שגיאת תסדיר התרחשה בעת ניסיון לכתוב את קובץ התצורה. - - - An unknown error occurred while trying to write the configuration file. - התרחשה שגיאה בלתי ידועה בעת ניסיון לכתוב את קובץ התצורה. - - RSS::AutoDownloader + RSS - - - Invalid data format. - תסדיר נתונים לא תקף. + + Search + חיפוש - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - לא היה ניתן לשמור נתוני מורידן אוטומטי RSS ב־%1. שגיאה: %2 + + New subscription + מנוי חדש - - Invalid data format - תסדיר נתונים לא תקף + + + + Mark items read + סמן פריטים כנקראו - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - לא היה ניתן לקרוא את כלליי מורידן אוטומטי RSS מתוך %1. שגיאה: %2 + + Update all + עדכן הכל - - Couldn't load RSS AutoDownloader rules. Reason: %1 - לא היה ניתן לטעון כלליי מורידן אוטומטי RSS. סיבה: %1 + + RSS Downloader... + מוריד הRSS... - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - נכשל בהורדת הזנת RSS ב־'%1'. סיבה: %2 + + Settings... + קביעות... - - RSS feed at '%1' updated. Added %2 new articles. - הזנת RSS ב־'%1' עודכנה. התווספו %2 מאמרים חדשים. + + Torrents: (double-click to download) + טורנטים: (לחיצה כפולה כדי להוריד) - - Failed to parse RSS feed at '%1'. Reason: %2 - נכשל בניתוח הזנת RSS ב־'%1'. סיבה: %2 + + + Delete + מחק - - Couldn't read RSS Session data from %1. Error: %2 - לא היה ניתן לקרוא נתוני שיח RSS מתוך %1. שגיאה: %2 + + Rename... + שנה שם... - - Couldn't parse RSS Session data. Error: %1 - לא היה ניתן לנתח נתוני שיח RSS. שגיאה: %1 + + Rename + שינוי שם - - Couldn't load RSS Session data. Invalid data format. - לא היה ניתן לטעון נתוני שיח RSS. תסדיר נתונים לא תקף. + + + Update + עדכון - - Couldn't load RSS article '%1#%2'. Invalid data format. - לא היה ניתן לטעון מאמר RSS בשם '%1#%2'. תסדיר נתונים לא תקף. + + New subscription... + מנוי חדש... - - - RSS::Private::Parser - - Invalid RSS feed. - הזנת RSS לא תקף. + + + Update all feeds + עדכן את כל ההזנות - - %1 (line: %2, column: %3, offset: %4). - %1 (שורה: %2, עמודה: %3, קיזוז: %4). - - - - RSS::Session - - - RSS feed with given URL already exists: %1. - הזנת RSS עם הכתובת שניתנה קיימת כבר: %1. - - - - Cannot move root folder. - לא ניתן להעביר תיקיית שורש. - - - - - Item doesn't exist: %1. - פריט אינו קיים: %1. - - - - Cannot delete root folder. - לא ניתן למחוק תיקיית שורש. - - - - Incorrect RSS Item path: %1. - נתיב לא נכון של פריט RSS: %1. - - - - RSS item with given path already exists: %1. - פריט RSS עם הנתיב שניתן קיים כבר: %1. - - - - Parent folder doesn't exist: %1. - תיקיית הורה אינה קיימת: %1. - - - - RSSWidget - - - Search - חפש + + Download torrent + הורדת טורנט - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - משיכת הזנות RSS מושבתת כעת! אתה יכול לאפשר אותה בהגדרות היישום. + + Open news URL + פתיחת כתובת חדשות - - New subscription - מנוי חדש + + Copy feed URL + העתק כתובת הזנה - - - - Mark items read - סמן פריטים כנקראו + + New folder... + תיקייה חדשה... - + Refresh RSS streams רענן הזרמות RSS + + + RSSImp - - Update all - עדכן הכל - - - - RSS Downloader... - מורידן RSS... - - - - Torrents: (double-click to download) - טורנטים: (לחיצה כפולה כדי להוריד) - - - - - Delete - מחק + + Stream URL: + כתובת הזרמה: - - Rename... - שנה שם... + + Please type a RSS stream URL + אנא הקלד כתובת הזרמת RSS - - Rename - שנה שם + + This RSS feed is already in the list. + הזנת RSS זו נמצאת כבר ברשימה. - - - Update - עדכן + + Please choose a folder name + אנא בחר שם תיקייה - - New subscription... - מנוי חדש... + + Folder name: + שם תיקייה: - - - Update all feeds - עדכן את כל ההזנות + + New folder + תיקייה חדשה - - Download torrent - הורד טורנט + + Deletion confirmation + אישור מחיקה - - Open news URL - פתיחת כתובת חדשות + + Are you sure you want to delete the selected RSS feeds? + האם אתה בטוח שברצונך למחוק את הזנות ה-RSS שנבחרו? - - Copy feed URL - העתקת כתובת הזנה + + Please choose a new name for this RSS feed + אנא בחר שם חדש להזנת RSS זו - - New folder... - תיקייה חדשה... + + New feed name: + שם הזנה חדשה: - - Please choose a folder name - אנא בחר שם תיקייה + + Name already in use + השם כבר נמצא בשימוש - - Folder name: - שם תיקייה: + + This name is already used by another item, please choose another one. + שם זה נמצא כבר בשימוש על ידי פריט אחר, אנא בחר אחד אחר. - - New folder - תיקייה חדשה + + Date: + תאריך: - - Please type a RSS feed URL - אנא הקלד כתובת של הזנת RSS + + Author: + מחבר: - - Feed URL: - כתובת הזנה: + + Unread + לא נקרא + + + Rss::Feed - - Deletion confirmation - אישור מחיקה + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + הורדה אוטומטית של '%1' מהזנת RSS '%2' נכשלה כי היא ההזנה אינה מכילה טורנט או קישור מגנט... - - Are you sure you want to delete the selected RSS feeds? - האם אתה בטוח שאתה רוצה למחוק את הזנות ה־RSS הנבחרות? + + Automatically downloading '%1' torrent from '%2' RSS feed... + מוריד באופן אוטומטי את הטורנט '%1' מהזנת RSS '%2'... + + + Rss::Private::Parser - - Please choose a new name for this RSS feed - אנא בחר שם חדש להזנת RSS זו + + Invalid RSS feed. + הזנת RSS בלתי תקינה. + + + RssSettingsDlg - - New feed name: - שם הזנה חדשה: + + RSS Reader Settings + קביעות קורא RSS - - Rename failed - שינוי שם נכשל + + RSS feeds refresh interval: + מרווח זמן לרענון הזנת RSS: - - Date: - תאריך: + + min + דק' - - Author: - מחבר: + + Maximum number of articles per feed: + מספר מרבי של מאמרים להזנה: ScanFoldersDelegate - + Select save location בחירת מיקום שמירה @@ -7447,274 +6703,268 @@ ScanFoldersModel - + Monitored Folder תיקייה מנוטרת - + Override Save Location דרוס מיקום שמירה - + Monitored folder תיקייה מנוטרת - + Default save location מיקום שמירה ברירת מחדל - + Browse... עיין... - SearchJobWidget + SearchEngine - - Form - טופס + + Unknown search engine plugin file format. + סיומת לא מוכרת עבור קובץ תוסף מנוע חיפוש. - - Results(xxx) - תוצאות(xxx) + + A more recent version of this plugin is already installed. + גרסה חדשה יותר של תוסף זה כבר מותקנת. - - Search in: - חפש ב: + + + Plugin is not supported. + התוסף אינו נתמך. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - <html><head/><body><p>מספר מנועי חיפוש מחפשים בתיאור טורנטים ובשמות קובץ טורנט. אם תוצאות כאלו ייראו ברשימה למטה הן נשלטות ע"י מצב זה.</p><p><span style=" font-weight:600;">בכל מקום</span>משבית סינון ומראה כל דבר החוזר ע"י מנועי החיפוש.</p><p><span style=" font-weight:600;">שמות טורנט בלבד</span>מראה רק טורנטים ששמותיהם תואמים לשאילתת החיפוש.</p></body></html> + + Update server is temporarily unavailable. %1 + שרת העדכון אינו זמין באופן זמני. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - <html><head/><body><p>הגדר מספר מזערי ומרבי מותר של זורעים</p></body></html> + + + Failed to download the plugin file. %1 + נכשל בהורדת קובץ התוסף. %1 - - Seeds: - זורעים: + + An incorrect update info received. + מידע שגוי של עדכון התקבל. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - <html><head/><body><p>מספר מזערי של זרעים</p></body></html> + + All categories + כל המדורים - - - to - אל + + Movies + סרטים - - <html><head/><body><p>Maximal number of seeds</p></body></html> - <html><head/><body><p>מספר מרבי של זרעים</p></body></html> + + TV shows + סדרות טלוויזיה - - - - + + Music + מוזיקה - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - <html><head/><body><p>הגדר גודל מזערי ומרבי מותר של טורנט</p></body></html> + + Games + משחקים - - Size: - גודל: + + Anime + אנימה - - <html><head/><body><p>Minimal torrent size</p></body></html> - <html><head/><body><p>גודל מזערי של טורנט</p></body></html> + + Software + תוכנה - - <html><head/><body><p>Maximal torrent size</p></body></html> - <html><head/><body><p>גודל מרבי של טורנט</p></body></html> + + Pictures + תמונות + + + + Books + ספרים + + + + SearchListDelegate + + + + Unknown + בלתי ידוע + + + SearchTab - + Name i.e: file name שם - + Size i.e: file size גודל - + Seeders i.e: Number of full sources זורעים - + Leechers i.e: Number of partial sources עלוקות - + Search engine מנוע חיפוש - - Filter search results... - סנן תוצאות חיפוש... - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - תוצאות (מראה <i>%1</i> מתוך <i>%2</i>): + תוצאות (מציג <i>%1</i> מתוך <i>%2</i>): - + Torrent names only שמות טורנט בלבד - + Everywhere בכל מקום - - Use regular expressions - השתמש בביטויים רגולריים - - - + Searching... מחפש... - + Search has finished החיפוש הסתיים - + Search aborted החיפוש בוטל - + An error occurred during search... התרחשה שגיאה במהלך החיפוש... - + Search returned no results החיפוש לא הניב תוצאות - + Column visibility - ראות עמודות - - - - SearchPluginManager - - - Unknown search engine plugin file format. - תסדיר בלתי ידוע של קובץ מתקע של מנוע חיפוש. - - - - A more recent version of this plugin is already installed. - גרסה חדשה יותר של מתקע זה מותקנת כבר. + ראות עמודות - - - Plugin is not supported. - המתקע אינו נתמך. + + Form + טופס - - All categories - כל המדורים + + Results(xxx) + תוצאות(xxx) - - Movies - סרטים + + Search in: + חפש ב: - - TV shows - סדרות + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>מספר מנועי חיפוש מחפשים בתיאור טורנט וגם בשמות קבצי טורנטים. אם תוצאות אלו יוצגו ברשימה למטה או לא, זה נשלט ע"י מצב זה.</p><p><span style=" font-weight:600;">כל מקום</span> מבטל סינון ומציג כל דבר שמוחזר ע"י מנועי החיפוש.</p><p><span style=" font-weight:600;">שמות טורנטים בלבד</span> מציג רק טורנטים אשר שמותיהם תואמים לשאילתת החיפוש.</p></body></html> - - Music - מוזיקה + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>קבע מספר מזערי ומרבי מותר של זורעים</p></body></html> - - Games - משחקים + + Seeds: + זורעים: - - Anime - אנימה + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>מספר מזערי של זרעים</p></body></html> - - Software - תוכנות + + + to + אל - - Pictures - תמונות + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>מספר מרבי של זרעים</p></body></html> - - - Books - ספרים + + + + + - - Update server is temporarily unavailable. %1 - שרת העדכון אינו זמין זמנית. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>קבע גודל מזערי ומרבי מותר של טורנט</p></body></html> - - - Failed to download the plugin file. %1 - נכשל בהורדת קובץ המתקע. %1 + + Size: + גודל: - - An incorrect update info received. - התקבל מידע שגוי של עדכון. + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>גודל מזערי של טורנט</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - מתקע החיפוש '%1' מכיל מחרוזת של גרסה בלתי תקפה ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>גודל מרבי של טורנט</p></body></html> @@ -7722,198 +6972,185 @@ - - - - + + + Search חיפוש - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - אין מתקעי חיפוש כלשהם מותקנים. -לחץ על הכפתור "חפש מתקעים..." בתחתית ימין החלון כדי להתקין כמה. - - - + Download הורד - + Go to description page עבור לדף התיאור - + Copy description page URL העתק את כתובת דף התיאור - + Search plugins... - מתקעי חיפוש... + תוספי חיפוש... - + A phrase to search for. ביטוי לחפש אחריו. - + Spaces in a search term may be protected by double quotes. - רווחים במונח חיפוש יכולים להתמגן ע"י מרכאות כפולות. + רווחים במונח חיפוש עשויים להתמגן ע"י מרכאות כפולות. - + Example: Search phrase example דוגמה: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - <b>foo bar</b>: חפש אחר <b>foo</b> ו־<b>bar</b> + <b>foo bar</b>: חפש אחר <b>foo</b> ו-<b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: חפש אחר <b>foo bar</b> - + All plugins - כל המתקעים + כל התוספים - + Only enabled - רק מאופשרים + רק מאופשר - + Select... בחר... - - - + + + Search Engine מנוע חיפוש - + Please install Python to use the Search Engine. אנא התקן פייתון כדי להשתמש במנוע החיפוש. - + Empty search pattern תבנית חיפוש ריקה - + Please type a search pattern first אנא הקלד תבנית חיפוש תחילה - + Stop עצור - + Search has finished החיפוש הסתיים - + Search has failed החיפוש נכשל - ShutdownConfirmDialog + ShutdownConfirmDlg - - Don't show again - אל תראה שוב - - - + qBittorrent will now exit. qBittorrent ייצא עכשיו. - + E&xit Now &צא עכשיו - + Exit confirmation אישור יציאה - + The computer is going to shutdown. המחשב הולך להיכבות. - + &Shutdown Now &כבה עכשיו - - Shutdown confirmation - אישור כיבוי - - - + The computer is going to enter suspend mode. המחשב הולך להיכנס למצב השעיה. - + &Suspend Now &השעה עכשיו - + Suspend confirmation אישור השעיה - + The computer is going to enter hibernation mode. המחשב הולך להיכנס למצב חריפה. - + &Hibernate Now &חרוף עכשיו - + Hibernate confirmation אישור חריפה - + You can cancel the action within %1 seconds. אתה יכול לבטל את הפעולה תוך %1 שניות. + + + Shutdown confirmation + אישור כיבוי + SpeedLimitDialog - + KiB/s ק"ב/ש @@ -7921,52 +7158,52 @@ SpeedPlotView - + Total Upload העלאה כוללת - + Total Download הורדה כוללת - + Payload Upload העלאת מטען - + Payload Download הורדת מטען - + Overhead Upload העלאת תקורה - + Overhead Download הורדת תקורה - + DHT Upload העלאת DHT - + DHT Download הורדת DHT - + Tracker Upload העלאת גשש - + Tracker Download הורדת גשש @@ -7974,95 +7211,87 @@ SpeedWidget - + Period: תקופה: - + 1 Minute דקה 1 - + 5 Minutes 5 דקות - + 30 Minutes 30 דקות - + 6 Hours 6 שעות - + Select Graphs - בחר תרשימים + בחר תרשים - + Total Upload העלאה כוללת - + Total Download הורדה כוללת - + Payload Upload העלאת מטען - + Payload Download הורדת מטען - + Overhead Upload העלאת תקורה - + Overhead Download הורדת תקורה - + DHT Upload העלאת DHT - + DHT Download הורדת DHT - + Tracker Upload העלאת גשש - + Tracker Download הורדת גשש - StacktraceDialog - - - Crash info - מידע קריסה - - - StatsDialog @@ -8075,49 +7304,49 @@ סטטיסטיקת משתמש - - Cache statistics - סטטיסטיקת מטמון + + Total peer connections: + סה"כ חיבורי עמיתים: - - Read cache hits: - לחיצות מטמון קריאה: + + Global ratio: + יחס כללי: - - Average time in queue: - זמן ממוצע בתור: + + Alltime download: + הורדה בכל הזמנים: - - Connected peers: - עמיתים מחוברים: + + Alltime upload: + העלאה בכל הזמנים: - - All-time share ratio: - יחס שיתוף של כל הזמנים: + + Total waste (this session): + בזבוז כולל (הפעלה נוכחית): - - All-time download: - הורדה של כל הזמנים: + + Cache statistics + סטטיסטיקת מטמון - - Session waste: - בזבוז שיח: + + Read cache hits: + לחיצות מטמון קריאה: - - All-time upload: - העלאה של כל הזמנים: + + Average time in queue: + זמן ממוצע בתור: - Total buffer size: - סה"כ גודל מאגר: + Total buffers size: + גודל מאגרים כולל: @@ -8145,7 +7374,12 @@ גודל בתור כולל: - + + OK + אישור + + + %1 ms 18 milliseconds %1 מילי שנייה @@ -8154,922 +7388,660 @@ StatusBar - + Connection status: - מיצב חיבור: + מצב חיבור: - + No direct connections. This may indicate network configuration problems. אין חיבורים ישירים. זה עלול להעיד על בעיות בתצורת הרשת. - + DHT: %1 nodes DHT: %1 צמתים - - qBittorrent needs to be restarted! - qBittorrent צריך להיפעל מחדש! + + qBittorrent needs to be restarted + qBittorrent צריך להיפעל מחדש + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent עודכן כעת וצריך להיפעל מחדש כדי שהשינויים יחולו. Connection Status: - מיצב חיבור: + מצב חיבור: Offline. This usually means that qBittorrent failed to listen on the selected port for incoming connections. - מנותק. זה אומר בד"כ ש־qBittorrent נכשל להאזין לפתחה הנבחרת לחיבורים נכנסים. + מנותק. זה אומר בד"כ ש-qBittorrent נכשל להאזין לפתחה שנבחרה לחיבורים נכנסים. Online - מקוון + מחובר - + Click to switch to alternative speed limits לחץ כדי להחליף למגבלות מהירות חלופית - + Click to switch to regular speed limits לחץ כדי להחליף למגבלות מהירות רגילות - + + Manual change of rate limits mode. The scheduler is disabled. + שינוי ידני של מצב מגבלות קצב. המתזמן מושבת. + + + Global Download Speed Limit - מגבלה עולמית של מהירות הורדה + מגבלה כללית של מהירות הורדה - + Global Upload Speed Limit - מגבלה עולמית של מהירות העלאה + מגבלה כללית של מהירות העלאה - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter הכל (0) - + Downloading (0) מוריד (0) - + Seeding (0) זורע (0) - + Completed (0) הושלם (0) - + Resumed (0) מומשך (0) - + Paused (0) מושהה (0) - + Active (0) פעיל (0) - + Inactive (0) לא פעיל (0) - + Errored (0) נתקל בשגיאה (0) - + All (%1) הכל (%1) - + Downloading (%1) מוריד (%1) - + Seeding (%1) זורע (%1) - + Completed (%1) הושלם (%1) - + Paused (%1) מושהה (%1) - + Resumed (%1) מומשך (%1) - + Active (%1) פעיל (%1) - + Inactive (%1) לא פעיל (%1) - + Errored (%1) נתקל בשגיאה (%1) - TagFilterModel + TorrentContentModel - - Tags - תגיות + + Name + שם - - All - הכל + + Size + גודל - - Untagged - חסר־תגית + + Progress + התקדמות - - - TagFilterWidget - - Add tag... - הוסף תגית... + + Download Priority + עדיפות הורדה - - Remove tag - הסר תגית + + Remaining + נותר + + + TorrentCreatorDlg - - Remove unused tags - הסר תגיות שאינן בשימוש + + Select a folder to add to the torrent + בחירת תיקייה להוספה לטורנט - - Resume torrents - המשך טורנטים + + Select a file to add to the torrent + בחירת קובץ להוספה לטורנט - - Pause torrents - השהה טורנטים + + No input path set + לא נקבע נתיב קלט - - Delete torrents - מחק טורנטים + + Please type an input path first + אנא הקלד נתיב קלט תחילה - - New Tag - תגית חדשה + + Select destination torrent file + בחר קובץ טורנט כיעד - - Tag: - תגית: + + Torrent Files (*.torrent) + קבצי טורנט (*.torrent) - - Invalid tag name - שם תגית לא תקף + + Torrent was created successfully: %1 + %1 is the path of the torrent + טורנט נוצר בהצלחה: %1 - - Tag name '%1' is invalid - שם התגית '%1' אינו תקף + + + + Torrent creation + יצירת טורנט - - Tag exists - תגית קיימת + + Torrent creation was unsuccessful, reason: %1 + יצירת הטורנט נכשלה, סיבה: %1 - - Tag name already exists. - שם תגית קיים כבר. + + Created torrent file is invalid. It won't be added to download list. + קובץ הטורנט שנוצר בלתי תקין. הוא לא ייתווסף לרשימת ההורדות. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - מאפייני מדור טורנט + + Name + i.e: torrent name + שם - - Name: - שם: + + Size + i.e: torrent size + גודל - - Save path: - נתיב שמירה: + + Done + % Done + בוצע - - Choose save path - בחירת נתיב שמירה + + Status + Torrent status (e.g. downloading, seeding, paused) + מצב - - New Category - מדור חדש + + Seeds + i.e. full sources (often untranslated) + זורעים - - Invalid category name - שם לא תקף של מדור + + Peers + i.e. partial sources (often untranslated) + עמיתים - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - שם מדור אינו יכול להכיל '\'. -שם מדור אינו יכול להתחיל או להסתיים ב־'/'. -שם מדור אינו יכול להכיל רצף '//'. + + Down Speed + i.e: Download speed + מהירות הורדה - - Category creation error - שגיאה ביצירת מדור + + Up Speed + i.e: Upload speed + מהירות העלאה - - Category with the given name already exists. -Please choose a different name and try again. - מדור עם השם שניתן קיים כבר. -אנא בחר שם שונה ונסה שוב. + + Ratio + Share ratio + יחס - - - TorrentContentModel - - Name - שם + + ETA + i.e: Estimated Time of Arrival / Time left + זמן משוער שנותר - - Size - גודל + + Category + מדור - - Progress - התקדמות + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + התווסף בתאריך - - Download Priority - עדיפות הורדה + + Completed On + Torrent was completed on 01/01/2010 08:00 + הושלם בתאריך - - Remaining - נותר + + Tracker + גשש - - Availability - זמינות + + Down Limit + i.e: Download limit + מגבלת הורדה - - - TorrentCreatorDialog - - Torrent Creator - יוצר הטורנטים + + Up Limit + i.e: Upload limit + מגבלת העלאה - - Select file/folder to share - בחר קובץ/תיקייה לשיתוף + + Downloaded + Amount of data downloaded (e.g. in MB) + הורד - - Path: - נתיב: + + Uploaded + Amount of data uploaded (e.g. in MB) + הועלה - - [Drag and drop area] - [אזור של גרירה ושחרור] + + Session Download + Amount of data downloaded since program open (e.g. in MB) + הורדה בהפעלה הנוכחית - - - Select file - בחר קובץ + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + העלאה בהפעלה הנוכחית - - - Select folder - בחר תיקייה + + Remaining + Amount of data left to download (e.g. in MB) + נותר - - Settings - הגדרות + + Time Active + Time (duration) the torrent is active (not paused) + משך זמן פעיל - - Piece size: - גודל חתיכה: + + Save path + Torrent save path + נתיב שמירה - - Auto - אוטומטי + + Completed + Amount of data completed (e.g. in MB) + הושלמו - - 16 KiB - 16 ק"ב + + Ratio Limit + Upload share ratio limit + מגבלת יחס - - 32 KiB - 32 ק"ב + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + נראה לאחרונה שלם - - 64 KiB - 64 ק"ב + + Last Activity + Time passed since a chunk was downloaded/uploaded + פעילות אחרונה - - 128 KiB - 128 ק"ב + + Total Size + i.e. Size including unwanted data + גודל כולל + + + TrackerFiltersList - - 256 KiB - 256 ק"ב + + All (0) + this is for the tracker filter + הכל (0) - - 512 KiB - 512 ק"ב + + Trackerless (0) + חסר-גששים (0) - - 1 MiB - 1 מ"ב + + Error (0) + שגיאה (0) - - 2 MiB - 2 מ"ב + + Warning (0) + אזהרה (0) - - 4 MiB - 4 מ"ב + + + Trackerless (%1) + חסר-גששים (%1) - - 8 MiB - 8 מ"ב + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - 16 MiB - 16 מ"ב + + + Error (%1) + שגיאה (%1) - - 32 MiB - 32 מ"ב + + + Warning (%1) + אזהרה (%1) - - Calculate number of pieces: - חשב מספר חתיכות: + + Resume torrents + המשך טורנטים - - Private torrent (Won't distribute on DHT network) - טורנט פרטי (לא יופץ על רשת DHT) + + Pause torrents + השהה טורנטים - - Start seeding immediately - התחל לזרוע באופן מיידי + + Delete torrents + מחק טורנטים - - Ignore share ratio limits for this torrent - התעלם ממגבלות יחס שיתוף עבור טורנט זה + + + All (%1) + this is for the tracker filter + הכל (%1) + + + TrackerList - - Optimize alignment - מטב יישור + + URL + כתובת - - Fields - שדות + + Status + מצב - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - אתה יכול להפריד מדרגים/קבוצות של גשש באמצעות שורה ריקה. + + Received + - - Web seed URLs: - כתובות זורעי רשת: + + Seeds + זורעים - - Tracker URLs: - כתובות גששים: + + Peers + עמיתים - - Comments: - הערות: + + Downloaded + - - Source: - מקור: + + Message + הודעה - - Progress: - התקדמות: + + + Working + עובד - - Create Torrent - צור טורנט + + Disabled + מושבת - - - - Torrent creation failed - יצירת טורנט נכשלה + + This torrent is private + טורנט זה הוא פרטי - - Reason: Path to file/folder is not readable. - סיבה: נתיב אל קובץ/תיקייה אינו קריא. + + Updating... + מעדכן... - - Select where to save the new torrent - בחר איפה לשמור את הטורנט החדש + + Not working + לא עובד - - Torrent Files (*.torrent) - קבצי טורנט (*.torrent) - - - - Reason: %1 - סיבה: %1 - - - - Reason: Created torrent is invalid. It won't be added to download list. - סיבה: קובץ הטורנט שנוצר אינו תקף. הוא לא ייתווסף לרשימת ההורדות. - - - - Torrent creator - יוצר הטורנטים - - - - Torrent created: - טורנט נוצר: - - - - TorrentInfo - - - File size exceeds max limit %1 - גודל הקובץ חורג מגבלה מרבית %1 - - - - Torrent file read error: %1 - שגיאת קריאה של קובץ טורנט: %1 - - - - Torrent file read error: size mismatch - שגיאת קריאה של קובץ טורנט: גודל אינו תואם - - - - TorrentsController - - - Not contacted yet - לא נוצר קשר עדין - - - - Updating... - מעדכן... - - - - Working - עובד - - - - Not working - לא עובד - - - - Error: '%1' is not a valid torrent file. - שגיאה: '%1' הוא אינו קובץ תקף של טורנט. - - - - - - - Torrent queueing must be enabled - תור טורנטים חייב להיות מאופשר - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - Save path is empty - נתיב השמירה ריק - - - - Cannot make save path - לא ניתן ליצור נתיב שמירה - - - - Cannot write to directory - לא ניתן לכתוב בתיקייה - - - - WebUI Set location: moving "%1", from "%2" to "%3" - קביעת מיקום של ממשק רשת: מעביר את "%1" מן "%2" אל "%3" - - - - Incorrect torrent name - שם לא נכון של טורנט - - - - - Incorrect category name - שם לא נכון של מדור - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - הכל (0) - - - - Trackerless (0) - חסר־גששים (0) - - - - Error (0) - שגיאה (0) - - - - Warning (0) - אזהרה (0) - - - - - Trackerless (%1) - חסר־גששים (%1) - - - - - Error (%1) - שגיאה (%1) - - - - - Warning (%1) - אזהרה (%1) - - - - Resume torrents - המשך טורנטים - - - - Pause torrents - השהה טורנטים - - - - Delete torrents - מחק טורנטים - - - - - All (%1) - this is for the tracker filter - הכל (%1) - - - - TrackerListWidget - - - - Working - עובד - - - - Disabled - מושבת - - - - This torrent is private - הטורנט הזה פרטי - - - - Updating... - מעדכן... - - - - Not working - לא עובד - - - + Not contacted yet - לא נוצר קשר עדין + לא מחובר עדיין - - - - - - - N/A - לא זמין + + Tracker URL: + כתובת גשש: - + Tracker editing עריכת גשש - - Tracker URL: - כתובת גשש: - - - - + + Tracker editing failed עריכת הגשש נכשלה - + The tracker URL entered is invalid. - כתובת הגשש שהוכנסה אינה תקפה. + כתובת הגשש שהוכנסה בלתי תקינה. - + The tracker URL already exists. כתובת הגשש קיימת כבר. - + Add a new tracker... הוסף גשש חדש... - - Remove tracker - הסר גשש - - - + Copy tracker URL העתק כתובת גשש - + Edit selected tracker URL - ערוך כתובת גשש נבחרת + ערוך כתובת גשש שנבחרה - + Force reannounce to selected trackers - אלץ הכרזה מחדש לגששים נבחרים + אלץ הכרזה מחדש לגששים שנבחרו - + Force reannounce to all trackers אלץ הכרזה מחדש לכל הגששים - - URL - כתובת - - - - Status - מעמד - - - - Received - התקבל - - - - Seeds - זורעים - - - - Peers - עמיתים - - - - Downloaded - ירד - - - - Message - הודעה - - - - Column visibility - ראות עמודות - - - - TrackerLoginDialog - - - - Tracker authentication - אימות גשש - - - - Tracker: - גשש: - - - - Login - התחברות - - - - Username: - שם משתמש: - - - - Password: - סיסמה: - - - - Log in - התחבר + + Remove tracker + הסר גשש - TrackersAdditionDialog + TrackersAdditionDlg - + Trackers addition dialog - דו־שיח הוספת גששים + דו שיח הוספת גששים - + List of trackers to add (one per line): רשימת גששים להוספה (אחד לשורה): - - + + µTorrent compatible list URL: - כתובת של רשימה תואמת µTorrent: + כתובת לרשימה תואמת ל-µTorrent: - + + I/O Error + שגיאת ק/פ + + + + Error while trying to open the downloaded file. + שגיאה בעת ניסיון לפתוח את הקובץ שירד. + + + No change אין שינוי - + No additional trackers were found. לא נמצאו גששים נוספים. - + Download error שגיאת הורדה - + The trackers list could not be downloaded, reason: %1 רשימת הגששים לא יכלה לרדת, סיבה: %1 @@ -9077,686 +8049,694 @@ TransferListDelegate - + Downloading מוריד - + Downloading metadata used when loading a magnet link - מוריד מטא־נתונים + מוריד מטה-נתונים - + Allocating qBittorrent is allocating the files on disk מקצה - + Paused מושהה - + Queued i.e. torrent is queued בתור - + Seeding Torrent is complete and in upload-only mode זורע - + Stalled Torrent is waiting for download to begin ממתין - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [מ] מוריד - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [מ] זורע - + Checking Torrent local data is being checked - בודק + נבדק - + Queued for checking i.e. torrent is queued for hash checking בתור לבדיקה - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. בודק נתוני המשכה - + Completed הושלם - - Moving - Torrent local data are being moved/relocated - מעביר - - - + Missing Files קבצים חסרים - + Errored torrent status, the torrent has an error נתקל בשגיאה - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (זרוע במשך %2) - - %1 ago - e.g.: 1h 20m ago - %1 קודם לכן - - - - TransferListFiltersWidget - - - Status - מיצב - - - - Categories - מדורים - - - - Tags - תגיות - - - - Trackers - גששים - - - - TransferListModel - - - Name - i.e: torrent name - שם - - - - Size - i.e: torrent size - גודל - - - - Done - % Done - בוצע - - - - Status - Torrent status (e.g. downloading, seeding, paused) - מעמד - - - - Seeds - i.e. full sources (often untranslated) - זורעים - - - - Peers - i.e. partial sources (often untranslated) - עמיתים - - - - Down Speed - i.e: Download speed - מהירות הורדה - - - - Up Speed - i.e: Upload speed - מהירות העלאה - - - - Ratio - Share ratio - יחס - - - - ETA - i.e: Estimated Time of Arrival / Time left - זמן משוער שנותר - - - - Category - מדור - - - - Tags - תגיות - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - התווסף בתאריך - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - הושלם בתאריך - - - - Tracker - גשש - - - - Down Limit - i.e: Download limit - מגבלת הורדה - - - - Up Limit - i.e: Upload limit - מגבלת העלאה - - - - Downloaded - Amount of data downloaded (e.g. in MB) - ירד - - - - Uploaded - Amount of data uploaded (e.g. in MB) - הועלה - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - הורדה בשיח - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - העלאה בשיח - - - - Remaining - Amount of data left to download (e.g. in MB) - נותר - - - - Time Active - Time (duration) the torrent is active (not paused) - משך זמן פעיל - - - - Save path - Torrent save path - נתיב שמירה - - - - Completed - Amount of data completed (e.g. in MB) - הושלם - - - - Ratio Limit - Upload share ratio limit - מגבלת יחס - - - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - נראה לאחרונה שלם + + %1 ago + e.g.: 1h 20m ago + %1 קודם לכן + + + TransferListFiltersWidget - - Last Activity - Time passed since a chunk was downloaded/uploaded - פעילות אחרונה + + Status + מצב - - Total Size - i.e. Size including unwanted data - גודל כולל + + Categories + מדורים + + + + Trackers + גששים TransferListWidget - + Column visibility ראות עמודות - + Choose save path בחירת נתיב שמירה - + Torrent Download Speed Limiting - הגבלת מהירות הורדה של טורנט + מגבלת מהירות הורדה לטורנט - + Torrent Upload Speed Limiting - הגבלת מהירות העלאה של טורנט + מגבלת מהירות העלאה לטורנט - + Recheck confirmation - אישור בדיקה מחדש + בדוק מחדש אישור - + Are you sure you want to recheck the selected torrent(s)? - האם אתה בטוח שאתה רוצה לבדוק מחדש את הטורנטים הנבחרים? + האם אתה בטוח שברצונך לבדוק מחדש את הטורנט(ים) שנבחר(ו)? - + Rename שינוי שם - + New name: שם חדש: - + Resume Resume/start the torrent - המשך + חידוש - + Force Resume Force Resume/start the torrent אלץ המשכה - + Pause Pause the torrent השהה - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - הגדרת מיקום: מעביר את "%1" מן "%2" אל "%3" - - - - Add Tags - הוסף תגיות - - - - Remove All Tags - הסר את כל התגיות - - - - Remove all tags from selected torrents? - האם להסיר את כל התגיות מהטורנטים הנבחרים? + + New Category + מדור חדש - - Comma-separated tags: - תגיות מופרדות ע"י פסיקים: + + Category: + מדור: - - Invalid tag - תגית לא תקפה + + Invalid category name + שם בלתי תקין של מדור - - Tag name: '%1' is invalid - שם התגית: '%1' אינו תקף + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + שם מדור חייב שלא להכיל '\'. +שם מדור חייב שלא להתחיל/להסתיים עם '/'. +שם מדור חייב שלא להכיל רצף '//'. - + Delete Delete the torrent מחק - + Preview file... - הצג מראש קובץ... + תצוגה מקדימה לקובץ... - + Limit share ratio... הגבל יחס שיתוף... - + Limit upload rate... הגבל קצב העלאה... - + Limit download rate... הגבל קצב הורדה... - + Open destination folder פתח תיקיית יעד - + Move up i.e. move up in the queue הזז למעלה - + Move down i.e. Move down in the queue הזז למטה - + Move to top i.e. Move to top of the queue הזז לראש - + Move to bottom i.e. Move to bottom of the queue הזז לתחתית - + Set location... - הגדר מיקום... - - - - Force reannounce - אלץ הכרזה מחדש + קבע מיקום... - + Copy name העתק שם - - Copy hash - העתק גיבוב - - - + Download first and last pieces first הורד חתיכה ראשונה ואחרונה תחילה - + Automatic Torrent Management ניהול טורנטים אוטומטי - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category מצב אוטומטי אומר שמאפייני טורנט שונים (לדוגמה, נתיב שמירה) יוחלטו ע"י המדור המשויך - + Category מדור - + New... New category... חדש... - + Reset Reset category אפס - - Tags - תגיות - - - - Add... - Add / assign multiple tags... - הוסף... - - - - Remove All - Remove all tags - הסר הכל - - - + Priority עדיפות - + Force recheck אלץ בדיקה חוזרת - + Copy magnet link העתק קישור מגנט - + Super seeding mode - מצב זריעת־על + מצב זריעת-על - + Rename... שנה שם... - + Download in sequential order הורד בסדר עוקב - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - הגבלת יחס העלאה/הורדה של טורנט + מגבלת יחס העלאה/הורדה לטורנט - - Use global share limit - השתמש במגבלת שיתוף עולמית + + Use global ratio limit + שימוש במגבלת יחס כללי - - - + + + buttonGroup buttonGroup - - Set no share limit - אל תגדיר מגבלת שיתוף + + Set no ratio limit + קבע ללא מגבלת יחס + + + + Set ratio limit to + קבע מגבלת יחס אל + + + WebApplication - - Set share limit to - הגדר מגבלת שיתוף אל + + Incorrect category name + שם מדור לא נכון + + + WebUI - - ratio - יחס + + The Web UI is listening on port %1 + ממשק משתמש הרשת מאזין על פתחה %1 + + + + Web UI Error - Unable to bind Web UI to port %1 + שגיאת ממשק משתמש רשת - לא ניתן לקשר ממשק משתמש רשת אל פתחה %1 + + + + about + + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + לקוח BitTorrent מתקדם המתוכנת ב-C++, מבוסס על ערכת כלים Qt ו-libtorrent-rasterbar. + + + + Copyright %1 2006-2016 The qBittorrent project + זכויות יוצרים %1 2006-2016 מיזם qBittorrent - - minutes - דקות + + Home Page: + דף הבית: - - No share limit method selected - לא נבחרה שיטת מגבלת שיתוף + + Forum: + קבוצת דיון: - - Please select a limit method first - אנא בחר תחילה שיטת מגבלה + + Bug Tracker: + גשש תקל: - Utils::ForeignApps + addPeersDialog + + + Add Peers + הוסף עמיתים + - - Python detected, version: %1 - פייתון זוהה, גרסה: %1 + + List of peers to add (one per line): + רשימת עמיתים להוספה (אחד לשורה): - - Python not detected - פייתון לא זוהה + + Format: IPv4:port / [IPv6]:port + תסדיר: IPv4:פתחה / [IPv6]:פתחה - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - סוג לא קביל של קובץ, רק קובץ רגיל מותר. + + + Tracker authentication + אימות גשש - - Symlinks inside alternative UI folder are forbidden. - קישורים סמליים בתוך תיקיית ממשק חלופי הם אסורים. + + Tracker: + גשש: - - Exceeded the maximum allowed file size (%1)! - חרג את הגודל המותר המרבי של קובץ (%1)! + + Login + היכנס - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - ממשק רשת: כותרת מוצא ומוצא מטרה אינם תואמים! IP מקור: '%1'. כותרת מוצא: '%2'. מוצא מטרה: '%3' + + Username: + שם משתמש: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - ממשק רשת: כותרת אזכור ומוצא מטרה אינם תואמים! IP מקור: '%1'. כותרת אזכור: '%2'. מוצא מטרה: '%3' + + Password: + סיסמה: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - ממשק רשת: כותרת מארח בלתי תקפה, פתחה בלתי תואמת. בקש IP מקור: '%1'. פתחת שרת: '%2'. התקבלה כותרת מארח: '%3' + + Log in + היכנס - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - ממשק רשת: כותרת מארח בלתי תקפה. בקש IP מקור: '%1'. התקבלה כותרת מארח: '%2' + + Cancel + ביטול - WebUI + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + אישור מחיקה - qBittorrent + + + + Remember choice + זכור בחירה + + + + Also delete the files on the hard disk + מחק גם את הקבצים מהכונן הקשיח + + + + confirmShutdownDlg + + + Don't show again + אל תציג שוב + + + + createTorrentDialog + + + Cancel + ביטול + + + + Torrent Creation Tool + כלי יצירת טורנט + + + + Torrent file creation + יצירת קובץ טורנט + + + + Add file + הוסף קובץ + + + + Add folder + הוסף תיקייה + + + + File or folder to add to the torrent: + קובץ או תיקייה להוספה לטורנט: + + + + Tracker URLs: + כתובות גששים: + - - Web UI: HTTPS setup successful - ממשק רשת: הכנת HTTPS הצליחה + + Web seeds urls: + כתובות זורעי רשת: + + + + Comment: + הערה: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + אתה יכול להפריד מדרגים/קבוצות של גשש באמצעות שורה ריקה. + + + + Piece size: + גודל חתיכה: + + + + 16 KiB + 16 ק"ב + + + + 32 KiB + 32 ק"ב + + + + 64 KiB + 64 ק"ב + + + + 128 KiB + 128 ק"ב + + + + 256 KiB + 256 ק"ב + + + + 512 KiB + 512 ק"ב + + + + 1 MiB + 1 מ"ב + + + + 2 MiB + 2 מ"ב + + + + 4 MiB + 4 מ"ב + + + + 8 MiB + 8 מ"ב + + + + 16 MiB + 16 מ"ב + + + + Auto + אוטומטי + + + + Private (won't be distributed on DHT network if enabled) + פרטי (לא יופץ על רשת DHT אם מאופשר) - - Web UI: HTTPS setup failed, fallback to HTTP - ממשק רשת: הכנת HTTPS נכשלה, החזרה אל HTTP + + Start seeding after creation + התחל זריעה לאחר יצירה - - Web UI: Now listening on IP: %1, port: %2 - ממשק רשת: מאזין כעת על IP: כתובת %1, פתחה: %2 + + Ignore share ratio limits for this torrent + התעלם ממגבלות יחס שיתוף עבור טורנט זה + + + + Create and save... + צור ושמור... + + + + Progress: + התקדמות: + + + + downloadFromURL + + + Add torrent links + הוסף קישורי טורנט + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + אחד לשורה (קישורי HTTP, קישורי מגנט ומידע-גיבובים נתמכים). + + + + Download + הורדה + + + + Cancel + ביטול + + + + Download from urls + הורדה מכתובות + + + + No URL entered + לא הוזנה כתובת + + + + Please type at least one URL. + אנא הקלד לפחת כתובת אחת. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - ממשק רשת: לא היה ניתן לקשר אל IP: כתובת %1, פתחה: %2. סיבה: %3 + + Crash info + מידע קריסה fsutils - + + + + + Downloads הורדות @@ -9764,100 +8744,140 @@ misc - + B bytes ב - + KiB kibibytes (1024 bytes) ק"ב - + MiB mebibytes (1024 kibibytes) מ"ב - + GiB gibibytes (1024 mibibytes) ג"ב - + TiB tebibytes (1024 gibibytes) ט"ב - + PiB pebibytes (1024 tebibytes) - פ"ב + PiB - + EiB exbibytes (1024 pebibytes) - ה"ב + EiB + + + + Python not detected + פייתון לא זוהה - + + Python version: %1 + גרסת פייתון: %1 + + + /s per second - + %1h %2m e.g: 3hours 5minutes - %1 ש' %2 ד' + %1 ש %2 ד - + %1d %2h e.g: 2days 10hours - %1 י' %2 ש' + %1ימים %2 ש - + Unknown Unknown (size) לא ידוע - + qBittorrent will shutdown the computer now because all downloads are complete. - qBittorrent יכבה כעת את המחשב כי כל ההורדות שלמות. + qBittorrent יכבה כעת את המחשב כי כל ההורדות הושלמו. - + < 1m < 1 minute פחות מדקה - + %1m e.g: 10minutes %1 דקות + + + Working + עובד + + + + Updating... + מעדכן... + + + + Not working + לא עובד + + + + Not contacted yet + לא מחובר עדיין + preview - + Preview selection - הצג מראש בחירה + תצוגה מקדימה של בחירה - + The following files support previewing, please select one of them: הקבצים הבאים תומכים בתצוגה מקדימה, אנא בחר אחד מהם: + + + Preview + תצוגה מקדימה + + + + Cancel + ביטול + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_hi_IN.ts qbittorrent-3.3.15/src/lang/qbittorrent_hi_IN.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_hi_IN.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_hi_IN.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,157 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - qBittorrent के बारे में + qBittorrent के बारे में - + About - बारे मेॅ + बारे मेॅ - + Author - लेखक - - - - Current maintainer - वर्तमान अनुरक्षक - - - - Greece - ग्रीस + लेखक - - + + Nationality: - - + + + Name: + नाम: + + + + E-mail: - ई-मेल: + ई-मेल: - - - Name: - नाम: + + Greece + ग्रीस - - Original author - मूल लेखक + + Current maintainer + वर्तमान अनुरक्षक - - France - फ्रांस + + Original author + मूल लेखक - + Special Thanks - + Translators - - License - अधिकार - - - + Libraries - लाईब्रेरीज + लाईब्रेरीज - + qBittorrent was built with the following libraries: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - - - - - Forum: - - - - - Bug Tracker: - - - - - AboutDlg - - About qBittorrent - qBittorrent के बारे में - - - About - बारे मेॅ - - - Author - लेखक - - - Name: - नाम: - - - E-mail: - ई-मेल: - - - Greece - ग्रीस - - - Current maintainer - वर्तमान अनुरक्षक - - - Original author - मूल लेखक - - - Libraries - लाईब्रेरीज - - + France - फ्रांस + फ्रांस + License - अधिकार + अधिकार @@ -162,61 +90,67 @@ + + Browse... + + + + Set as default save path - डिफाल्ट सेव पथ के रूप में सेट करें + डिफाल्ट सेव पथ के रूप में सेट करें - + Never show again पुन: नहीं दिखायें - + Torrent settings टाॅरेंट सेटिंग्स - + Set as default category - + Category: - + Start torrent टाॅरेंट चालू करें - + Torrent information - + Skip hash check हैश चेक छोड़ें - + Size: साईज: - + Hash: - + Comment: टिप्पणी: - + Date: तारीख: @@ -241,121 +175,89 @@ - - Remember last used save path - - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - + Do not delete .torrent file - - Create subfolder - - - - - Download in sequential order - अनुक्रमिक तरीके से डाउनलोड करें - - - - Download first and last pieces first - - - - + Normal साधारण - + High अधिक - + Maximum सर्वाधिक - + Do not download डाउनलोड नहीं करें - - - + + + I/O Error I/O त्रुटि - + Invalid torrent अमान्य टाॅरेंट + + + + Already in download list - डाउनलोड सूची में पहले से ही है - - - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - + डाउनलोड सूची में पहले से ही है - + Not Available This comment is unavailable अनुपलब्ध - + Not Available This date is unavailable अनुपलब्ध - + Not available अनुपलब्ध - + Invalid magnet link अमान्य मैगनेट लिंक - + The torrent file '%1' does not exist. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -363,127 +265,128 @@ - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + + + + + Torrent is already in download list. Trackers were merged. + + + + + + Cannot add torrent + + + + + Cannot add this torrent. Perhaps it is already in adding state. + + + + This magnet link was not recognized यह मैगनेट लिंक अभिज्ञात नहीं हुआ - + + Magnet link is already in download list. Trackers were merged. + + + + + Cannot add this torrent. Perhaps it is already in adding. + + + + Magnet link मैगनेट लिंक - + Retrieving metadata... मेटाडाटा प्राप्त हो रहा है... - + Not Available This size is unavailable. अनुपलब्ध - + Free space on disk: %1 - + + Choose save path सहेजने हेतु पथ चुनें + Rename the file - फाइल का पुन:नामकरण करें + फाइल का पुन:नामकरण करें - + New name: नया नाम: + + The file could not be renamed - इस फाइल का पुन:नामकरण नहीं हो सकता + इस फाइल का पुन:नामकरण नहीं हो सकता + This file name contains forbidden characters, please choose a different one. - इस फाइल के नाम में वर्जित वर्ण हैं, कृपया दूसरा नाम चुनें. - - - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - - - - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - - - - - Magnet link is already queued for processing. - + इस फाइल के नाम में वर्जित वर्ण हैं, कृपया दूसरा नाम चुनें. - - + + This name is already in use in this folder. Please use a different name. यह नाम पहले से ही इसी फोल्डर के प्रयोग मे है, कृपया दूसरा नाम चुनें. - + The folder could not be renamed इस फोल्डर का पुन:नामकरण नहीं हो सकता - + Rename... पुन:नामकरण... - + Priority प्राथमिकता - + Invalid metadata - + Parsing metadata... मेटाडाटा का पदभंजन हो रहा है... - + Metadata retrieval complete मेटाडाटा प्राप्ति पुर्ण - + Download Error @@ -491,325 +394,198 @@ AdvancedSettings + Disk write cache size - डिस्क लेखन कैश साइज + डिस्क लेखन कैश साइज - + MiB मेगाबाइट्स - + Outgoing ports (Min) [0: Disabled] निवर्तमान द्वार (न्यूनतम) [0: निर्योग्य] - + Outgoing ports (Max) [0: Disabled] निवर्तमान द्वार (अधिकतम) [0: निर्योग्य] - + Recheck torrents on completion टाॅरेंट्स सम्पुर्ण होने पर पुनः जाँच करें - + Transfer list refresh interval अंतरण सूची ताजा अंतराल - + ms milliseconds मिलिसेकंड्स - + Setting सेटिंग - + Value Value set for this setting मान - - - (disabled) - - - - + (auto) .(स्वत:) - - min - minutes - - - - + All addresses - + qBittorrent Section - - + + Open documentation - + libtorrent Section - - Asynchronous I/O threads - - - - - Disk cache - - - - + s seconds सेकंड्स - + Disk cache expiry interval डिस्क कैश समाप्ति अंतराल - + Enable OS cache OS कैश चालू करें - - Guided read cache - - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - - - - - - KiB - - - - - Send buffer watermark - - - - - Send buffer low watermark - - - - - Send buffer watermark factor - - - + m minutes - मिनट्स + मिनट्स - - Prefer TCP - - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address - - - - + Resolve peer countries (GeoIP) सहकर्मी के देशों को दिखायें (GeoIP) - + Resolve peer host names सहकर्मी के होस्टनेम को दिखायें - + Strict super seeding विशूद्ध सूपर सीडिंग - + Network Interface (requires restart) नेटवर्क अंतरफलक (पुनरारंभ आवश्यक) - + Optional IP Address to bind to (requires restart) - + Listen on IPv6 address (requires restart) IPv6 पते पर सुनें (पुनरारंभ आवश्यक) - + Display notifications - + Display notifications for added torrents - + Download tracker's favicon - - Save path history length - - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - - - - - Round-robin - - - - - Fastest upload - - - - - Anti-leech - - - - - Upload choking algorithm - - - - + Confirm torrent recheck - - Confirm removal of all tags - - - - - Always announce to all trackers in a tier - - - - - Always announce to all tiers - + Exchange trackers with other peers + अन्य साथियों के साथ ट्रैकर्स का विनिमय करें + Always announce to all trackers - हमेशा सभी ट्रैकर्स को सूचित करें + हमेशा सभी ट्रैकर्स को सूचित करें - + Any interface i.e. Any network interface कोई भी नेटवर्क अंतरफलक - + Save resume data interval How often the fastresume file is saved. - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - - - - + Maximum number of half-open connections [0: Unlimited] - + IP Address to report to trackers (requires restart) ट्रैकर्स को सूचित करने हेतु IP पता (पुनरारंभ आवश्यक) - + Enable embedded tracker एम्बेडेड ट्रैकर को सक्षम करें - + Embedded tracker port एम्बेडेड ट्रैकर द्वार - + Check for software updates सॉफ्टवेयर अद्यतन के लिए जाँच करें - + Use system icon theme सिस्टम आईकाॅन थीम का प्रयोग करें @@ -817,974 +593,732 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started - + Torrent: %1, running external program, command: %2 - - Torrent name: %1 - - - - - Torrent size: %1 - - - - - Save path: %1 - - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - - - - - Thank you for using qBittorrent. - - - - - [qBittorrent] '%1' has finished downloading + + Torrent: %1, run external program command too long (length > %2), execution failed. - + Torrent: %1, sending mail notification - + Information सूचना - - To control qBittorrent, access the Web UI at %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 - + The Web UI administrator user name is: %1 - + The Web UI administrator password is still the default one: %1 - + This is a security risk, please consider changing your password from program preferences. - + Saving torrent progress... + + + AutomatedRssDownloader - - Portable mode and explicit profile directory options are mutually exclusive - + + Save to: + इसमें सहेंजें: - - Portable mode implies relative fastresume + + RSS Downloader - - - AuthController - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 + + Enable Automated RSS Downloader - - Your IP address has been banned after too many failed authentication attempts. + + Download Rules - - WebAPI login success. IP: %1 + + Rule Definition - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - - - - AutomatedRssDownloader - - - Save to: - इसमें सहेंजें: - - - - RSS Downloader - - - - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - - - - - Download Rules - - - - - Rule Definition - - - - - Use Regular Expressions - - - - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter + + Use Regular Expressions - + Must Contain: - + Must Not Contain: - + Episode Filter: - + Assign Category: - + Save to a Different Directory - + Ignore Subsequent Matches for (0 to Disable) ... X days - + Disabled असक्षम - + days दिन - + Add Paused: - + Use global settings - + Always - + Never कभी नहीँ - + Apply Rule to Feeds: - + Matching RSS Articles - + &Import... - + &Export... - + Matches articles based on episode filter. - + Example: उदाहरण: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match - + Episode filter rules: - + Season number is a mandatory non-zero value - + Filter must end with semicolon - + Three range types for episodes are supported: - + Single number: <b>1x25;</b> matches episode 25 of season one - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one - + Episode number is a mandatory positive value - - Rules - - - - - Rules (legacy) - - - - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - + Last Match: %1 days ago - + Last Match: Unknown - + New rule name नये नियम का नाम - + Please type the name of the new download rule. कृपया नये नियम के नाम के लिये नाम टंकित करें. - - + + Rule name conflict नये नाम में दिक्कत - - + + A rule with this name already exists, please choose another name. एक नियम इसी नाम से पहले से ही प्रयोग मे है, कृपया दूसरा चुनें. - + Are you sure you want to remove the download rule named '%1'? - + Are you sure you want to remove the selected download rules? क्या आप निश्चित है कि आप चुने हुए डाउनलोड नियमों को रद्द करना चाहते हैं? - + Rule deletion confirmation नियम रद्द करने की पुष्टि - + Destination directory गन्तव्य डायरेक्टरी - + Invalid action - अमान्य चाल + अमान्य चाल - + The list is empty, there is nothing to export. - यह सूची खाली है, यहाँ आयात करने के लिए कुछ भी नहीं है. - - - - Export RSS rules - - - - - Failed to create the destination file. Reason: %1 - - - - - Import RSS rules - - - - - Failed to open the file. Reason: %1 - - - - - Failed to import the selected rules file. Reason: %1 - + यह सूची खाली है, यहाँ आयात करने के लिए कुछ भी नहीं है. + Where would you like to save the list? - आप सूची को कहाँ सहेजेंगें? + आप सूची को कहाँ सहेजेंगें? + Rules list (*.rssrules) - नियमो की सूची (*.rssrules) + नियमो की सूची (*.rssrules) - - + I/O Error - I/O त्रुटि + I/O त्रुटि + Failed to create the destination file - गन्तव्य पर फाइल बनाने में विफल रहा + गन्तव्य पर फाइल बनाने में विफल रहा + Please point to the RSS download rules file - कृपया RSS डाउनलोड नियमो की फाइल की तरफ इंगित करें + कृपया RSS डाउनलोड नियमो की फाइल की तरफ इंगित करें + Rules list - नियमो की सूची + नियमो की सूची - + Import Error - निर्यात त्रुटि + निर्यात त्रुटि + Failed to import the selected rules file - चुने हुए नियमो को निर्यात करने में विफल रहा + चुने हुए नियमो को निर्यात करने में विफल रहा - + Add new rule... नये नियम को जोड़े... - + Delete rule नियम रद्द करें - + Rename rule... नियम का पुन:नामकरण करें... - + Delete selected rules चुने हुए नियमो को रद्द करें - - Clear downloaded episodes... - - - - + Rule renaming नियम का पुन:नामकरण - + Please type the new rule name कृपया नये नियम का नाम टंकित करें - - Clear downloaded episodes - - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - - - - - - Position %1: %2 - - - + Regex mode: use Perl-like regular expressions - रेगुलर एक्सप्रेसन्स मोड: Perl के साथ रेगुलर एक्सप्रेसन्स का प्रयोग करें + रेगुलर एक्सप्रेसन्स मोड: Perl के साथ रेगुलर एक्सप्रेसन्स का प्रयोग करें - + Wildcard mode: you can use - + ? to match any single character - + * to match zero or more of any characters - + Whitespaces count as AND operators (all words, any order) - + | is used as OR operator - + If word order is important use * instead of whitespace. - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - + will match all articles. - + will exclude all articles. - - - BanListOptions - - Delete - रद्द करें - - - - BanListOptionsDialog - - - List of banned IP addresses - - - - - Ban IP - - - - - Delete - रद्द करें - - - - - Warning - - - - The entered IP address is invalid. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + वाइल्डकार्ड मोड: आप प्रयोग कर सकते हैं<ul><li>?कोई एक वर्णमाला मिलाने के लिए</li><li>* किसी शून्य या एक वर्णमाला मिलाने के लिए</li><li>खाली स्थान AND आपरेटर की तरह लिए गए हैं</li></ul> - - The entered IP is already banned. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + वाइल्डकार्ड मोड: आप प्रयोग कर सकते हैं<ul><li>?कोई एक वर्णमाला मिलाने के लिए</li><li>* किसी शून्य या एक वर्णमाला मिलाने के लिए</li><li>। OR आपरेटर की तरह लिया गया है</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support - - Could not get GUID of configured network interface. Binding to IP %1 - - - - + Embedded Tracker [ON] - + Failed to start the embedded tracker! - + Embedded Tracker [OFF] - + + '%1' reached the maximum ratio you set. Removing... + + + + + '%1' reached the maximum ratio you set. Pausing... + + + + System network status changed to %1 e.g: System network status changed to ONLINE - + ONLINE - + OFFLINE - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. - - + Encryption support [%1] - - + FORCED - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - - - - - + Anonymous mode [%1] - + Unable to decode '%1' torrent file. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' - + Queue positions were corrected in %1 resume files - + Couldn't save '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - - - - + because %1 is disabled. this peer was blocked because uTP is disabled. - + because %1 is disabled. this peer was blocked because TCP is disabled. - + URL seed lookup failed for URL: '%1', message: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 - + The network interface defined is invalid: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 - - Peer ID: - - - - - HTTP User-Agent is '%1' - - - - - + DHT support [%1] - - - - - - - - - + + + + ON - - - - - - - - - + + + + OFF - - + Local Peer Discovery support [%1] - - PeX support [%1] - - - - - '%1' reached the maximum ratio you set. Removed. - - - - - '%1' reached the maximum ratio you set. Paused. - - - - - '%1' reached the maximum seeding time you set. Removed. - - - - - '%1' reached the maximum seeding time you set. Paused. - - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface - + Tracker '%1' was added to torrent '%2' - + Tracker '%1' was deleted from torrent '%2' - + URL seed '%1' was added to torrent '%2' - + URL seed '%1' was removed from torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Error: Failed to parse the provided IP filter. - - '%1' restored. - 'torrent name' restored. + + Couldn't add torrent. Reason: %1 - - Couldn't add torrent. Reason: %1 + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) - + '%1' added to download list. 'torrent name' was added to download list. - + An I/O error occurred, '%1' paused. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 - + due to IP filter. this peer was blocked due to ip filter. - + due to port filter. this peer was blocked due to port filter. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. - + because it has a low port. this peer was blocked because it has a low port. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 - + External IP: %1 e.g. External IP: 192.168.0.1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + File sizes mismatch for torrent '%1', pausing it. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... @@ -1792,17 +1326,17 @@ CategoryFilterModel - + Categories - + All - + Uncategorized @@ -1821,34 +1355,67 @@ - Edit category... - - - - Remove category - + Remove unused categories - + Resume torrents - + Pause torrents - + Delete torrents + + + New Category + + + + + Category: + + + + + Invalid category name + + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + CookiesDialog @@ -1887,90 +1454,34 @@ - DeletionConfirmationDialog - - - Deletion confirmation - - - - - Remember choice - अपनी पसंद याद रखें - - - - Also delete the files on the hard disk - हार्ड डिस्क की फाइलें भी रद्द करें - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - क्या आप निश्चित है कि आप इन %1 टाॅरेंट्स को अंतरण सूची से रद्द करना चाहते हैं? - - - - DeletionConfirmationDlg - - Are you sure you want to delete these %1 torrents from the transfer list? - Are you sure you want to delete these 5 torrents from the transfer list? - क्या आप निश्चित है कि आप इन %1 टाॅरेंट्स को अंतरण सूची से रद्द करना चाहते हैं? - - - - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - टाॅरेंट लिंक्स जोड़ें - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - डाउनलोड करें - - - - No URL entered - URL प्रविष्ट नहीं हुआ - - - - Please type at least one URL. - कृपया कम से कम एक URL टंकित करें. + क्या आप निश्चित है कि आप इन %1 टाॅरेंट्स को अंतरण सूची से रद्द करना चाहते हैं? DownloadedPiecesBar - + White: Missing pieces - + Green: Partial pieces - + Blue: Completed pieces @@ -1978,34 +1489,23 @@ ExecutionLog + General - साधारण + साधारण + Blocked IPs - प्रतिबंधित आई पीज - - - - ExecutionLogWidget - - - General - साधारण - - - - Blocked IPs - प्रतिबंधित आई पीज + प्रतिबंधित आई पीज - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> was banned x.y.z.w was banned @@ -2014,116 +1514,41 @@ FeedListWidget - + RSS feeds RSS फीड्स - - - Unread (%1) - - - + Unread - अपठित + अपठित FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - - - - - &Browse... - Launch file dialog button text (full) - - - - - Choose a file - Caption for file open/save dialog - - - - - Choose a folder - Caption for directory open dialog - - - - - Any file + + An error occured while trying to open the log file. Logging to file is disabled. FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - - - - - - - IP filter line %1 is malformed. + + + + I/O Error: Could not open ip filter file in read mode. - - - IP filter line %1 is malformed. Start IP of the range is malformed. - - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - - - - - - IP filter exception thrown for line %1. Exception is: %2 - - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - - - - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. @@ -2131,455 +1556,472 @@ GeoIPDatabase - - + + Unsupported database file size. - + Metadata error: '%1' entry not found. - + Metadata error: '%1' entry has invalid type. - + Unsupported database version: %1.%2 - + Unsupported IP version: %1 - + Unsupported record size: %1 - + Invalid database type: %1 - + Database corrupted: no data section found. - Http::Connection - - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - - - - - Bad Http request, closing socket. IP: %s - - - - HttpServer + File - फाइल + फाइल + Edit - संपादन + संपादन + Help - सहायता + सहायता - + Exit qBittorrent - + Only one link per line एक पंक्ति में केवल एक लिंक + Download - डाउनलोड करें + डाउनलोड करें - + Global upload rate limit must be greater than 0 or disabled. - + Global download rate limit must be greater than 0 or disabled. - + Alternative upload rate limit must be greater than 0 or disabled. - + Alternative download rate limit must be greater than 0 or disabled. - + Maximum active downloads must be greater than -1. - + Maximum active uploads must be greater than -1. - + Maximum active torrents must be greater than -1. - + Maximum number of connections limit must be greater than 0 or disabled. कनेक्शन्स की अधिकतम संख्या 0 या disabled.से अधिक होना चाहिए. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. कनेक्शन्स की अधिकतम संख्या हर टारेंट सीमा के लिए 0 या disabled.से अधिक होना चाहिए. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. अपलोड की अधिकतम संख्या हर टारेंट सीमा के लिए 0 या disabled.से अधिक होना चाहिए. - + Unable to save program preferences, qBittorrent is probably unreachable. कार्यक्रम वरीयताओं को सहेजने में असमर्थ, qBittorrent शायद अगम्य है. - - IRC: #qbittorrent on Freenode - + + Language + भाषा - - Invalid category name: -Please do not use any special characters in the category name. + + The port used for incoming connections must be between 1 and 65535. - - Unknown - अज्ञात + + The port used for the Web UI must be between 1 and 65535. + - - Hard Disk + + Unable to log in, qBittorrent is probably unreachable. - - Share ratio limit must be between 0 and 9998. + + Invalid Username or Password. - - Seeding time limit must be between 0 and 525600 minutes. + + Password - Language - भाषा + + Login + लॉगिन - - The port used for incoming connections must be between 1 and 65535. + + Upload Failed! - - The port used for the Web UI must be between 1 and 65535. + + Original authors - - Unable to log in, qBittorrent is probably unreachable. + + Upload limit: - - Invalid Username or Password. + + Download limit: - - Username + + Apply - - Password + + Add - - Login - लॉगिन + + Category: + - - Original authors + + Upload Torrents + Upload torrent files to qBittorent using WebUI - - Apply + + All - - Add + + Downloading + डाउनलोड हो रहा है + + + + Seeding + सीडिंग + + + + Completed - - Upload Torrents - Upload torrent files to qBittorent using WebUI + + Resumed - Downloading - डाउनलोड हो रहा है + + Paused + रूका हुआ - Seeding - सीडिंग + + Active + - Paused - रूका हुआ + + Inactive + - + Save files to location: - + Cookie: - + Type folder here - + + Run an external program on torrent completion + + + + + Enable bandwidth management (uTP) + + + + + Apply rate limit to uTP connections + + + + + Alternative Global Rate Limits + + + + More information - + Information about certificates - + Save Files to - - Set location + + Watch Folder - - Limit upload rate + + Default Folder - - Limit download rate + + from + from time1 to time2 - - Rename torrent + + to + from time1 to time2 - - Unable to create category + + Other... + Save Files to: Watch Folder / Default Folder / Other... - - Other... - Save Files to: Watch Folder / Default Folder / Other... + + Every day + Schedule the use of alternative rate limits on ... - + + Week days + Schedule the use of alternative rate limits on ... + + + + + Week ends + Schedule the use of alternative rate limits on ... + + + + Monday Schedule the use of alternative rate limits on ... - + Tuesday Schedule the use of alternative rate limits on ... - + Wednesday Schedule the use of alternative rate limits on ... - + Thursday Schedule the use of alternative rate limits on ... - + Friday Schedule the use of alternative rate limits on ... - + Saturday Schedule the use of alternative rate limits on ... - + Sunday Schedule the use of alternative rate limits on ... + Downloaded Is the file downloaded or not? - डाउनलोडेड + डाउनलोडेड - + Logout - + + Download from URLs + + + + Download Torrents from their URLs or Magnet links - + Upload local torrent - + Are you sure you want to delete the selected torrents from the transfer list? - + Save सहेंजें - + qBittorrent client is not reachable qBittorrent प्रयोक्ता पहुंच योग्य नहीं है + HTTP Server - HTTP सर्वर + HTTP सर्वर + The following parameters are supported: - निम्न पैरामीटर समर्थित हैं: + निम्न पैरामीटर समर्थित हैं: + Torrent path - टाॅरेंट का पथ + टाॅरेंट का पथ + Torrent name - टाॅरेंट का नाम + टाॅरेंट का नाम - + qBittorrent has been shutdown. qBittorrent शट डाउन कर दिया गया है. - IPSubnetWhitelistOptionsDialog + LineEdit - - List of whitelisted IP subnets - + + Clear the text + टेक्स्ट रद्द करें + + + LogListWidget - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - + + Copy + प्रतिलिपि बनाए - - Add subnet - - - - - Delete - रद्द करें - - - - Error - - - - - The entered subnet is invalid. - - - - - LineEdit - - Clear the text - टेक्स्ट रद्द करें - - - - LogListWidget - - Copy - प्रतिलिपि बनाए - - - Clear साफ करें @@ -2612,549 +2054,490 @@ - + &View &देंखे - + &Options... &विकल्प... - + &Resume &प्रारम्भ - + Torrent &Creator - + Set Upload Limit... - + Set Download Limit... - + Set Global Download Limit... - + Set Global Upload Limit... - + Minimum Priority - + Top Priority - + Decrease Priority - + Increase Priority - - + + Alternative Speed Limits - + &Top Toolbar - + Display Top Toolbar - - Status &Bar - - - - + S&peed in Title Bar - + Show Transfer Speed in Title Bar - + &RSS Reader - + Search &Engine - + L&ock qBittorrent - + Do&nate! - - Close Window - - - - + R&esume All प्रा&रम्भ - + Manage Cookies... - + Manage stored network cookies - + Normal Messages - + Information Messages - + Warning Messages - + Critical Messages - + &Log - + &Exit qBittorrent - + &Suspend System - + &Hibernate System - + S&hutdown System - + &Disabled - + &Statistics - + Check for Updates - + Check for Program Updates - + &About &बारे मेॅ - + &Pause &रूकें - + &Delete &रद्द करें - + P&ause All सबको रो&कें - + &Add Torrent File... - + Open - + E&xit - + Open URL - + &Documentation &दस्तावेज़ीकरण - + Lock - - - + + + Show दिखायें - + Check for program updates कार्यक्रम अद्यतन के लिए जाँच करें - + Add Torrent &Link... - + If you like qBittorrent, please donate! यदि आप qBittorrent पसंद करते हैं, तो कृपया दान करें! - - + Execution Log क्रियान्वयन दैनिकी - + Clear the password पासवर्ड रद्द करें - + Filter torrent list... - + &Set Password - - Preferences - - - - + &Clear Password - + Transfers अंतरण - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association टाॅरेंट फाइल का संगठन - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? - + Icons Only - + Text Only - + Text Alongside Icons - + Text Under Icons - + Follow System Style - - - + + + UI lock password UI पर ताला लगाने हेतु पासवर्ड सेट करें - - - + + + Please type the UI lock password: कृपया UI ताले हेतु पासवर्ड टंकित करें: - + The password should contain at least 3 characters यह पासवर्ड कम से कम तीन वर्णमालाओं से बना होना चाहिए - + Password update पासवर्ड अद्यतन करें - + The UI lock password has been successfully updated UI ताले का पासवर्ड सफलता पुर्वक अद्यतन हो चुका है - + Are you sure you want to clear the password? क्या आप निश्चित है कि आप पासवर्ड रद्द करना चाहते हैं? - - Use regular expressions - - - - + Search खोंजे - + Transfers (%1) अंतरण (%1) - + Error - + Failed to add torrent: %1 - + Torrent added - + '%1' was added. e.g: xxx.avi was added. - + Download completion डाउनलोड समाप्त - + I/O Error i.e: Input/Output Error I/O त्रुटि - + Recursive download confirmation - + Yes हाँ - + No नहीँ - + Never कभी नहीँ - + Global Upload Speed Limit - + Global Download Speed Limit - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - - - - - Are you sure you want to quit qBittorrent? - - - - + &No &नहीँ - + &Yes &हाँ - + &Always Yes - - %1/s - s is a shorthand for seconds - - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - + qBittorrent Update Available - + + A new version is available. +Do you want to download %1? + + + + Already Using the Latest qBittorrent Version - + Undetermined Python version - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -3162,155 +2545,150 @@ - + The torrent '%1' contains torrent files, do you want to proceed with their download? - + Couldn't download file at URL '%1', reason: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - - + + Couldn't determine your Python version (%1). Search engine disabled. + + + + + Missing Python Interpreter Python Interpreter नहीं है - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? - + Python is required to use the search engine but it does not seem to be installed. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. - + &Check for Updates - + Checking for Updates... - + Already checking for program updates in the background कार्यक्रम अद्यतन की जाँच पहले से ही पृष्टभूमि में चल रही है - + Python found in '%1' - + Download error डाउनलोड त्रुटि - + Python setup could not be downloaded, reason: %1. Please install it manually. - - + + Invalid password अमान्य पासवर्ड - - - + + RSS (%1) - + URL download error - + The password is invalid यह पासवर्ड अमान्य है - - + + DL speed: %1 e.g: Download speed: 10 KiB/s - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version - + Hide छुपायें - + Exiting qBittorrent qBittorrent बंद हो रहा है - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + + + + Open Torrent Files टाॅरेंट फाइल खोलें - + Torrent Files टाॅरेंट फाइल्स - + Options were saved successfully. विकल्प सफलता पुर्वक सहेज दिये गये. @@ -3318,52 +2696,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. - + Dynamic DNS error: hostname supplied does not exist under specified account. - + Dynamic DNS error: Invalid username/password. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. - + Dynamic DNS error: supplied domain name is invalid. - + Dynamic DNS error: supplied username is too short. - + Dynamic DNS error: supplied password is too short. @@ -3371,1413 +2749,1303 @@ Net::DownloadHandler - + I/O Error I/O त्रुटि - + The file size is %1. It exceeds the download limit of %2. - + Unexpected redirect to magnet URI. - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. - - + + Couldn't load GeoIP database. Reason: %1 - + Venezuela, Bolivarian Republic of - + Viet Nam - - + + N/A - + Andorra - + United Arab Emirates - + Afghanistan - + Antigua and Barbuda - + Anguilla - + Albania - + Armenia - + Angola - + Antarctica - + Argentina - + American Samoa - + Austria - + Australia - + Aruba - + Azerbaijan - + Bosnia and Herzegovina - + Barbados - + Bangladesh - + Belgium - + Burkina Faso - + Bulgaria - + Bahrain - + Burundi - + Benin - + Bermuda - + Brunei Darussalam - + Brazil - + Bahamas - + Bhutan - + Bouvet Island - + Botswana - + Belarus - + Belize - + Canada - + Cocos (Keeling) Islands - + Congo, The Democratic Republic of the - + Central African Republic - + Congo - + Switzerland - + Cook Islands - + Chile - + Cameroon - + China - + Colombia - + Costa Rica - + Cuba - + Cape Verde - + Curacao - + Christmas Island - + Cyprus - + Czech Republic - + Germany - + Djibouti - + Denmark - + Dominica - + Dominican Republic - + Algeria - + Ecuador - + Estonia - + Egypt - + Western Sahara - + Eritrea - + Spain - + Ethiopia - + Finland - + Fiji - + Falkland Islands (Malvinas) - + Micronesia, Federated States of - + Faroe Islands - + France फ्रांस - + Gabon - + United Kingdom - + Grenada - + Georgia - + French Guiana - + Ghana - + Gibraltar - + Greenland - + Gambia - + Guinea - + Guadeloupe - + Equatorial Guinea - + Greece ग्रीस - + South Georgia and the South Sandwich Islands - + Guatemala - + Guam - + Guinea-Bissau - + Guyana - + Hong Kong - + Heard Island and McDonald Islands - + Honduras - + Croatia - + Haiti - + Hungary - + Indonesia - + Ireland - + Israel - + India - + British Indian Ocean Territory - + Iraq - + Iran, Islamic Republic of - + Iceland - + Italy - + Jamaica - + Jordan - + Japan - + Kenya - + Kyrgyzstan - + Cambodia - + Kiribati - + Comoros - + Saint Kitts and Nevis - + Korea, Democratic People's Republic of - + Korea, Republic of - + Kuwait - + Cayman Islands - + Kazakhstan - + Lao People's Democratic Republic - + Lebanon - + Saint Lucia - + Liechtenstein - + Sri Lanka - + Liberia - + Lesotho - + Lithuania - + Luxembourg - + Latvia - + Morocco - + Monaco - + Moldova, Republic of - + Madagascar - + Marshall Islands - + Mali - + Myanmar - + Mongolia - + Northern Mariana Islands - + Martinique - + Mauritania - + Montserrat - + Malta - + Mauritius - + Maldives - + Malawi - + Mexico - + Malaysia - + Mozambique - + Namibia - + New Caledonia - + Niger - + Norfolk Island - + Nigeria - + Nicaragua - + Netherlands - + Norway - + Nepal - + Nauru - + Niue - + New Zealand - + Oman - + Panama - + Peru - + French Polynesia - + Papua New Guinea - + Philippines - + Pakistan - + Poland - + Saint Pierre and Miquelon - + Puerto Rico - + Portugal - + Palau - + Paraguay - + Qatar - + Reunion - + Romania - + Russian Federation - + Rwanda - + Saudi Arabia - + Solomon Islands - + Seychelles - + Sudan - + Sweden - + Singapore - + Slovenia - + Svalbard and Jan Mayen - + Slovakia - + Sierra Leone - + San Marino - + Senegal - + Somalia - + Suriname - + Sao Tome and Principe - + El Salvador - + Syrian Arab Republic - + Swaziland - + Turks and Caicos Islands - + Chad - + French Southern Territories - + Togo - + Thailand - + Tajikistan - + Tokelau - + Turkmenistan - + Tunisia - + Tonga - - Could not decompress GeoIP database file. - - - - + Timor-Leste - + Bolivia, Plurinational State of - + Bonaire, Sint Eustatius and Saba - + Cote d'Ivoire - + Libya - + Saint Martin (French part) - + Macedonia, The Former Yugoslav Republic of - + Macao - + Pitcairn - + Palestine, State of - + Saint Helena, Ascension and Tristan da Cunha - + South Sudan - + Sint Maarten (Dutch part) - + Turkey - + Trinidad and Tobago - + Tuvalu - + Taiwan - + Tanzania, United Republic of - + Ukraine - + Uganda - + United States Minor Outlying Islands - + United States - + Uruguay - + Uzbekistan - + Holy See (Vatican City State) - + Saint Vincent and the Grenadines - + Virgin Islands, British - + Virgin Islands, U.S. - + Vanuatu - + Wallis and Futuna - + Samoa - + Yemen - + Mayotte - + Serbia - + South Africa - + Zambia - + Montenegro - + Zimbabwe - + Aland Islands - + Guernsey - + Isle of Man - + Jersey - + Saint Barthelemy - + + Could not uncompress GeoIP database file. + + + + Couldn't save downloaded GeoIP database file. - + Successfully updated GeoIP database. - + Couldn't download GeoIP database file. Reason: %1 @@ -4785,12 +4053,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] - + UPnP / NAT-PMP support [OFF] @@ -4798,7 +4066,7 @@ Net::Smtp - + Email Notification Error: @@ -4806,1277 +4074,1077 @@ OptionsDialog - + Options - + Behavior - + Downloads डाउनलोड्स - + Connection संबंध - + Speed - + BitTorrent - - RSS - - - - + Web UI - + Advanced - + Language भाषा - + User Interface Language: - + (Requires restart) - + Transfer List - + Confirm when deleting torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. - + Hide zero and infinity values - + Always - + Paused torrents only - + Action on double-click - + Downloading torrents: - - + + Start / Stop Torrent - - + + Open destination folder गन्तव्य डायरेक्टरी खोलें - - + + No action - + Completed torrents: - + Desktop - + Start qBittorrent on Windows start up - + Show splash screen on start up - + Start qBittorrent minimized - + Confirmation on exit when torrents are active - + Confirmation on auto-exit when downloads finish - - KiB + + Show qBittorrent in notification area - - Email notification &upon download completion + + Minimize qBittorrent to notification area - - Run e&xternal program on torrent completion + + Close qBittorrent to notification area + i.e: The systray tray icon will still be visible when closing the main window. - - IP Fi&ltering + + Tray icon style: - - Schedule &the use of alternative rate limits + + Normal + साधारण + + + + Monochrome (Dark theme) - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + + Monochrome (Light theme) - - &Torrent Queueing + + File association - - Seed torrents until their seeding time reaches + + Use qBittorrent for .torrent files - - A&utomatically add these trackers to new downloads: + + Use qBittorrent for magnet links - - RSS Reader + + Power Management - - Enable fetching RSS feeds + + Inhibit system sleep when torrents are active - - Feeds refresh interval: + + Log file - - Maximum number of articles per feed: - लेखों की प्रति फीड अधिकतम संख्या: + + Save path: + - - - min - minutes + + Backup the log file after: - - RSS Torrent Auto Downloader + + MB - - Enable auto downloading of RSS torrents + + Delete backup logs older than: - - Edit auto downloading rules... + + days + Delete backup logs older than 10 months - - Web User Interface (Remote control) + + months + Delete backup logs older than 10 months - - IP address: + + years + Delete backup logs older than 10 years - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. + + When adding a torrent - - Server domains: + + Display torrent content and some options - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. + + Bring torrent dialog to the front - - &Use HTTPS instead of HTTP + + Do not start the download automatically + The torrent will be added to download list in pause state - - Bypass authentication for clients on localhost + + Should the .torrent file be deleted after adding it - - Bypass authentication for clients in whitelisted IP subnets + + Delete .torrent files afterwards - - IP subnet whitelist... + + Also delete .torrent files whose addition was cancelled - - Upda&te my dynamic domain name + + Also when addition is cancelled - - Minimize qBittorrent to notification area + + Warning! Data loss possible! - - Close qBittorrent to notification area - i.e: The systray tray icon will still be visible when closing the main window. + + Saving Management - - Tray icon style: + + Default Torrent Management Mode: - - Normal - साधारण + + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category + - - Monochrome (Dark theme) + + Manual - - Monochrome (Light theme) + + Automatic - - File association + + When Torrent Category changed: - - Use qBittorrent for .torrent files + + Relocate torrent - - Use qBittorrent for magnet links + + Switch torrent to Manual Mode - - Power Management + + When Default Save Path changed: - - Save path: + + + Relocate affected torrents - - Backup the log file after: + + + Switch affected torrents to Manual Mode - - Delete backup logs older than: + + When Category changed: - - days - Delete backup logs older than 10 months - - - - - months - Delete backup logs older than 10 months - - - - - years - Delete backup logs older than 10 years - - - - - When adding a torrent - - - - - Bring torrent dialog to the front - - - - - Do not start the download automatically - The torrent will be added to download list in pause state - - - - - Should the .torrent file be deleted after adding it - - - - - Also delete .torrent files whose addition was cancelled - - - - - Also when addition is cancelled - - - - - Warning! Data loss possible! - - - - - Saving Management - - - - - Default Torrent Management Mode: - - - - - Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - - - - - Manual - - - - - Automatic - - - - - When Torrent Category changed: - - - - - Relocate torrent - - - - - Switch torrent to Manual Mode - - - - - When Default Save Path changed: - - - - - - Relocate affected torrents - - - - - - Switch affected torrents to Manual Mode - - - - - When Category changed: - - - - + Use Subcategories - + Default Save Path: - + Keep incomplete torrents in: - + Copy .torrent files to: - - Show &qBittorrent in notification area - - - - - &Log file - - - - - Display &torrent content and some options - - - - - Create subfolder for torrents with multiple files - - - - - De&lete .torrent files afterwards - - - - + Copy .torrent files for finished downloads to: - + Pre-allocate disk space for all files - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding + + Append .!qB extension to incomplete files - - Append .!qB extension to incomplete files + + Automatically add torrents from: - - Enable recursive download dialog + + Add entry - - Automatically add torrents from: + + Remove entry - - Add entry + + Email notification upon download completion - - Remove entry + + Destination email: - + SMTP server: - + This server requires a secure connection (SSL) - - + + + Authentication - - - - + + + + Username: प्रयोक्ता नाम: - - - - + + + + Password: पासवर्ड: - - Enabled protocol: - - - - - TCP and μTP + + Run external program on torrent completion - + Listening Port - + Port used for incoming connections: - + Random - + Use UPnP / NAT-PMP port forwarding from my router - + Use different port on each startup - + Connections Limits - + Maximum number of connections per torrent: - + Global maximum number of connections: - + Maximum number of upload slots per torrent: - + Global maximum number of upload slots: - + Proxy Server - + Type: - + (None) - + SOCKS4 - + SOCKS5 - + HTTP - + Host: - - + + Port: - + Otherwise, the proxy server is only used for tracker connections - + Use proxy for peer connections - + Disable connections not supported by proxies - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - + Use proxy only for torrents - - A&uthentication + + Info: The password is saved unencrypted - - Info: The password is saved unencrypted + + IP Filtering - + Filter path (.dat, .p2p, .p2b): - + Reload the filter - - Manually banned IP addresses... - - - - + Apply to trackers - + Global Rate Limits - - - - - - - KiB/s - - - - - + + Upload: + + + + KiB/s - किलोबाइट्स/सेकंड्स + किलोबाइट्स/सेकंड्स - - + + Download: - + Alternative Rate Limits - - + + Schedule the use of alternative rate limits + + + + From: from (time1 to time2) - - + To: time1 to time2 - + When: - + Every day - + Weekdays - + Weekends - + Rate Limits Settings - + Apply rate limit to peers on LAN - + Apply rate limit to transport overhead - - + + + Enable µTP protocol + + + + Apply rate limit to µTP protocol - + Privacy - + Enable DHT (decentralized network) to find more peers - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers - + Look for peers on your local network - + Enable Local Peer Discovery to find more peers - + Encryption mode: - + Prefer encryption - + Require encryption - + Disable encryption - + Enable when using a proxy or a VPN connection - + Enable anonymous mode - - Maximum active downloads: - - - - - Maximum active uploads: - - - - - Maximum active torrents: + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - Do not count slow torrents in these limits + + Torrent Queueing - - Upload rate threshold: + + Maximum active downloads: - - Download rate threshold: + + Maximum active uploads: - - sec - seconds + + Maximum active torrents: - - Torrent inactivity timer: + + Do not count slow torrents in these limits - + Share Ratio Limiting - + Seed torrents until their ratio reaches - + then - + Pause them - + Remove them - - RSS Smart Episode Filters + + Automatically add these trackers to new downloads: - - Use UPnP / NAT-PMP to forward the port from my router + + Enable Web User Interface (Remote control) - - Certificate: + + Use UPnP / NAT-PMP to forward the port from my router - - Import SSL Certificate + + Use HTTPS instead of HTTP - - Key: + + Certificate: - - Import SSL Key + + Import SSL Certificate - - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> + + Key: - - Use alternative Web UI + + Import SSL Key - - Files location: + + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - - Enable clickjacking protection + + Bypass authentication for localhost - - Enable Cross-Site Request Forgery (CSRF) protection + + Update my dynamic domain name - + Service: - + Register - + Domain name: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): - + %N: Torrent name - + %L: Category - - %G: Tags (seperated by comma) - - - - + %F: Content path (same as root path for multifile torrent) - + %R: Root path (first torrent subdirectory path) - + %D: Save path - + %C: Number of files - + %Z: Torrent size (bytes) - + %T: Current tracker - + %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor - + Folder is already being monitored: - + Folder does not exist: - + Folder is not readable: - + Adding entry failed - - - - + + Choose export directory - - - + + + + + + Choose a save directory - + Choose an IP filter file - + All supported filters - + SSL Certificate - + + SSL Key + + + + Parsing error - + Failed to parse the provided IP filter - + Successfully refreshed - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Invalid key - + This is not a valid SSL key. - + Invalid certificate - - Preferences - - - - - Import SSL certificate - - - - + This is not a valid SSL certificate. - - Import SSL key - - - - - SSL key - - - - + Time Error - + The start time and the end time can't be the same. - - + + Length Error - + The Web UI username must be at least 3 characters long. - + The Web UI password must be at least 6 characters long. @@ -6084,72 +5152,72 @@ PeerInfo - - Interested(local) and Choked(peer) + + interested(local) and choked(peer) - + interested(local) and unchoked(peer) - + interested(peer) and choked(local) - + interested(peer) and unchoked(local) - + optimistic unchoke - + peer snubbed - + incoming connection - + not interested(local) and unchoked(peer) - + not interested(peer) and unchoked(local) - + peer from PEX - + peer from DHT - + encrypted traffic - + encrypted handshake - + peer from LSD @@ -6157,180 +5225,165 @@ PeerListWidget - + IP आई पी - + Port द्वार - + Flags निशानियाँ - + Connection संबंध - + Client i.e.: Client application उपभोक्ता - + Progress i.e: % downloaded प्रगति - + Down Speed i.e: Download speed डाउनलोड गति - + Up Speed i.e: Upload speed अपलोड गति - + Downloaded i.e: total data downloaded डाउनलोडेड - + Uploaded i.e: total data uploaded अपलोडेड - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. अनुकूलता - + Files i.e. files that are being downloaded right now - + Column visibility स्तंभ दृश्यता - + Add a new peer... नया सहकर्मी जोड़े... - - + + Ban peer permanently सहकर्मी को स्थायी रुप से प्रतिबंधित करें - + Manually adding peer '%1'... - + The peer '%1' could not be added to this torrent. - + Manually banning peer '%1'... - - + + Peer addition सहकर्मी जोड़े - + Country - + Copy IP:port - + Some peers could not be added. Check the Log for details. - + The peers were added to this torrent. - + Are you sure you want to ban permanently the selected peers? क्या आप निश्चित है कि आप चयनित सहकर्मी को स्थायी रुप से प्रतिबंधित करना चाहते हैं? - + &Yes &हाँ - + &No &नहीँ - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - + PeersAdditionDlg - + No peer entered - + Please type at least one peer. - + Invalid peer - + The peer '%1' is invalid. @@ -6338,12 +5391,12 @@ PieceAvailabilityBar - + White: Unavailable pieces - + Blue: Available pieces @@ -6351,374 +5404,288 @@ PiecesBar - + Files in this piece: - + File in this piece - + File in these pieces - - Wait until metadata become available to see detailed information - - - - + Hold Shift key for detailed information - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Installed search plugins: - + Name नाम - + Version - + Url - - + + Enabled - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Check for updates - + Close - + Uninstall - - - + + + Yes हाँ - - - - + + + + No नहीँ - + Uninstall warning - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Uninstall success - + All selected plugins were uninstalled successfully - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - - - - - + + New search engine plugin URL - - + + URL: - + Invalid link - + The link doesn't seem to point to a search engine plugin. - + Select search plugins - + qBittorrent search plugin - + + + + Search plugin update + + + + All your plugins are already up to date. - + Sorry, couldn't check for plugin updates. %1 - + + + Search plugin install - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + + + + Couldn't install "%1" search engine plugin. %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + + + + Couldn't update "%1" search engine plugin. %2 - PluginSelectDlg + PluginSourceDlg - Name - नाम + + Plugin source + - Yes - हाँ - - - No - नहीँ - - - - PluginSourceDialog - - - Plugin source - - - - + Search plugin source: - + Local file - + Web link - PowerManagement - - - qBittorrent is active - - - - PreviewSelect + Name - नाम - - - Size - साईज - - - Progress - प्रगति - - - Preview impossible - पूर्वावलोकन असंभव - - - Sorry, we can't preview this file - माफ कीजिए, हम इस फाइल का पूर्वावलोकन नहीं कर सकते हैं - - - - PreviewSelectDialog - - - Preview - पूर्वावलोकन - - - - Name - नाम + नाम - + Size - साईज + साईज - + Progress - प्रगति + प्रगति - - + + Preview impossible - पूर्वावलोकन असंभव + पूर्वावलोकन असंभव - - + + Sorry, we can't preview this file - माफ कीजिए, हम इस फाइल का पूर्वावलोकन नहीं कर सकते हैं - - - - Private::FileLineEdit - - - '%1' does not exist - - - - - '%1' does not point to a directory - - - - - '%1' does not point to a file - - - - - Does not have read permission in '%1' - - - - - Does not have write permission in '%1' - + माफ कीजिए, हम इस फाइल का पूर्वावलोकन नहीं कर सकते हैं PropListDelegate - + Not downloaded डाउनलोड नहीं हुआ है - - + + Normal Normal (priority) साधारण - - N/A - - - - + Do not download Do not download (priority) डाउनलोड नहीं करें - - + + High High (priority) अधिक - + Mixed Mixed (priorities मिश्रित - - + + Maximum Maximum (priority) सर्वाधिक @@ -6727,32 +5694,32 @@ PropTabBar - + General साधारण - + Trackers ट्रैकर्स - + Peers सहकर्मी - + HTTP Sources HTTP स्रोत - + Content सामग्री - + Speed @@ -6846,22 +5813,22 @@ टिप्पणी: - + Select All सबको चुनें - + Select None किसी को न चुनें - + Normal साधारण - + High अधिक @@ -6921,177 +5888,165 @@ - + Maximum सर्वाधिक + - Do not download डाउनलोड नहीं करें - + Never कभी नहीँ - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) - - + + %1 (%2 this session) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) - + Open - + Open Containing Folder - + Rename... पुन:नामकरण... - + Priority प्राथमिकता - + New Web seed नया वेब स्रोत - + Remove Web seed वेब स्रोत को रद्द करें - + Copy Web seed URL वेब स्रोत URL की प्रतिलिपि बनायें - + Edit Web seed URL वेब स्रोत URL का संपादन करें + Rename the file - फाइल का पुन:नामकरण करें + फाइल का पुन:नामकरण करें - + New name: नया नाम: + + The file could not be renamed - इस फाइल का पुन:नामकरण नहीं हो सकता + इस फाइल का पुन:नामकरण नहीं हो सकता + This file name contains forbidden characters, please choose a different one. - इस फाइल के नाम में वर्जित वर्ण हैं, कृपया दूसरा नाम चुनें. + इस फाइल के नाम में वर्जित वर्ण हैं, कृपया दूसरा नाम चुनें. - - + + This name is already in use in this folder. Please use a different name. यह नाम पहले से ही इसी फोल्डर के प्रयोग मे है, कृपया दूसरा नाम चुनें. - + The folder could not be renamed इस फोल्डर का पुन:नामकरण नहीं हो सकता - + qBittorrent qBittorrent - + Filter files... - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - - - - + New URL seed New HTTP source - + New URL seed: - - + + This URL seed is already in the list. - + Web seed editing वेब स्रोत का संपादन - + Web seed URL: वेब स्रोत URL: @@ -7099,2384 +6054,1715 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + + + + + Error: '%1' is not a valid torrent file. + + + + + + Error: Could not add torrent to session. + + + + + I/O Error: Could not create temporary file. + + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. - - + + %1 must be the single command line parameter. - + + %1 must specify the correct port (1 to 65535). + + + + You cannot use %1: qBittorrent is already running for this user. - + Usage: - + Options: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' + + Displays program version - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' + + Displays this help message - - Expected integer number in environment variable '%1', but got '%2' + + Changes the Web UI port (current: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' + + Disable splash screen - - Expected %1 in environment variable '%2', but got '%3' + + Run in daemon-mode (background) - - port + + Downloads the torrents passed by the user - - %1 must specify a valid port (1 to 65535). - + + Help + सहायता - - Display program version and exit + + Run application with -h option to read about command line parameters. - - Display this help message and exit + + Bad command line - - Change the Web UI port + + Bad command line: - - Disable splash screen + + Legal Notice - - Run in daemon-mode (background) + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. - - dir - Use appropriate short form or abbreviation of "directory" + + Press %1 key to accept and continue... - - Store configuration files in <dir> + + Legal notice - - - name + + Cancel + रद्द करें + + + + I Agree - - Store configuration files in directories qBittorrent_<name> + + Torrent name: %1 - - Hack into libtorrent fastresume files and make file paths relative to the profile directory + + Torrent size: %1 - - files or URLs + + Save path: %1 - - Download the torrents passed by the user + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. + + Thank you for using qBittorrent. - - Options when adding new torrents: + + [qBittorrent] '%1' has finished downloading - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume + + The remote host name was not found (invalid hostname) - - path + + The operation was canceled - - Torrent save path + + The remote server closed the connection prematurely, before the entire reply was received and processed - - Add torrents as started or paused + + The connection to the remote server timed out - - Skip hash check - हैश चेक छोड़ें + + SSL/TLS handshake failed + - - Assign torrents to category. If the category doesn't exist, it will be created. + + The remote server refused the connection - - Download files in sequential order + + The connection to the proxy server was refused - - Download first and last pieces first + + The proxy server closed the connection prematurely - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: + + The proxy host name was not found - - Command line parameters take precedence over environment variables + + The connection to the proxy timed out or the proxy did not reply in time to the request sent - - Help - सहायता + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + - - Run application with -h option to read about command line parameters. + + The access to the remote content was denied (401) - - Bad command line + + The operation requested on the remote content is not permitted - - Bad command line: + + The remote content was not found at the server (404) - - Legal Notice + + The remote server requires authentication to serve the content but the credentials provided were not accepted - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + + The Network Access API cannot honor the request because the protocol is not known - - No further notices will be issued. + + The requested operation is invalid for this protocol - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. + + An unknown network-related error was detected - - Press %1 key to accept and continue... + + An unknown proxy-related error was detected - - Legal notice + + An unknown error related to the remote content was detected - - Cancel - रद्द करें + + A breakdown in protocol was detected + - - I Agree + + Unknown error - - + + Upgrade - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - + Couldn't migrate torrent with hash: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 + + Detected unclean program exit. Using fallback file to restore settings. - + An access error occurred while trying to write the configuration file. - + A format error occurred while trying to write the configuration file. - - - An unknown error occurred while trying to write the configuration file. - - RSS + Search - खोंजे + खोंजे + New subscription - नयी सदस्यता + नयी सदस्यता + + + Mark items read - सभी वस्तुओं पर पठित निशान लगायें + सभी वस्तुओं पर पठित निशान लगायें + Update all - सबको नवीनतम बनायें + सबको नवीनतम बनायें + RSS Downloader... - RSS डाउनलोडर... + RSS डाउनलोडर... + Settings... - सेटिंग्स... + सेटिंग्स... + + + + Torrents: (double-click to download) + + + Delete - रद्द करें + रद्द करें + Rename... - पुन:नामकरण... + पुन:नामकरण... + Rename - पुन:नामकरण + पुन:नामकरण + + Update - नवीनतम बनायें + नवीनतम बनायें + New subscription... - नयी सदस्यता... + नयी सदस्यता... + + Update all feeds - सभी फीड्स को नवीनतम बनायें + सभी फीड्स को नवीनतम बनायें + Download torrent - टाॅरेंट डाउनलोड करें + टाॅरेंट डाउनलोड करें + Open news URL - नया URL खोलें + नया URL खोलें + Copy feed URL - फीड URL की प्रतिलिपि बनायें + फीड URL की प्रतिलिपि बनायें + New folder... - नया फोल्डर... + नया फोल्डर... + Refresh RSS streams - RSS स्ट्रीम्स को नया करें + RSS स्ट्रीम्स को नया करें - RSS::AutoDownloader + RSSImp - - - Invalid data format. - + + Stream URL: + स्ट्रीम URL: - - Couldn't save RSS AutoDownloader data in %1. Error: %2 + + Please type a RSS stream URL - - Invalid data format + + This RSS feed is already in the list. - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - + + Please choose a folder name + कृपया फोल्डर का नाम चुनें - - Couldn't load RSS AutoDownloader rules. Reason: %1 - + + Folder name: + फोल्डर का नाम: - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - + + New folder + नया फोल्डर - - RSS feed at '%1' updated. Added %2 new articles. + + Deletion confirmation - - Failed to parse RSS feed at '%1'. Reason: %2 + + Are you sure you want to delete the selected RSS feeds? - - Couldn't read RSS Session data from %1. Error: %2 - + + Please choose a new name for this RSS feed + कृपया इस RSS फीड के लिये नया नाम चुनें - - Couldn't parse RSS Session data. Error: %1 - + + New feed name: + नया फीड नाम: - - Couldn't load RSS Session data. Invalid data format. - + + Name already in use + यह नाम पहले से ही प्रयोग में हैं - - Couldn't load RSS article '%1#%2'. Invalid data format. - + + This name is already used by another item, please choose another one. + यह नाम पहले से ही दुसरे वस्तु के प्रयोग मे है, कृपया दूसरा चुनें. - - - RSS::Private::Parser - - Invalid RSS feed. - + + Date: + तारीख: - - %1 (line: %2, column: %3, offset: %4). - + + Author: + लेखक: + + + + Unread + अपठित - RSS::Session + Rss::Feed - - RSS feed with given URL already exists: %1. + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... - - Cannot move root folder. + + Automatically downloading '%1' torrent from '%2' RSS feed... + + + Rss::Private::Parser - - - Item doesn't exist: %1. + + Invalid RSS feed. + + + RssSettingsDlg - - Cannot delete root folder. - + + RSS Reader Settings + RSS पाठक सेटिंग्स - - Incorrect RSS Item path: %1. - + + RSS feeds refresh interval: + RSS फीड्स को नया करने का अंतराल: - - RSS item with given path already exists: %1. + + min - - Parent folder doesn't exist: %1. - + + Maximum number of articles per feed: + लेखों की प्रति फीड अधिकतम संख्या: - RSSImp + ScanFoldersDelegate - Stream URL: - स्ट्रीम URL: + + Select save location + + + + ScanFoldersModel - Please choose a folder name - कृपया फोल्डर का नाम चुनें - - - Folder name: - फोल्डर का नाम: - - - New folder - नया फोल्डर - - - Please choose a new name for this RSS feed - कृपया इस RSS फीड के लिये नया नाम चुनें - - - New feed name: - नया फीड नाम: - - - Name already in use - यह नाम पहले से ही प्रयोग में हैं - - - This name is already used by another item, please choose another one. - यह नाम पहले से ही दुसरे वस्तु के प्रयोग मे है, कृपया दूसरा चुनें. - - - Date: - तारीख: - - - Author: - लेखक: - - - Unread - अपठित - - - - RSSWidget - - - Search - खोंजे - - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - - - - - New subscription - नयी सदस्यता - - - - - - Mark items read - सभी वस्तुओं पर पठित निशान लगायें - - - - Refresh RSS streams - RSS स्ट्रीम्स को नया करें - - - - Update all - सबको नवीनतम बनायें - - - - RSS Downloader... - RSS डाउनलोडर... - - - - Torrents: (double-click to download) - - - - - - Delete - रद्द करें - - - - Rename... - पुन:नामकरण... - - - - Rename - पुन:नामकरण - - - - - Update - नवीनतम बनायें - - - - New subscription... - नयी सदस्यता... - - - - - Update all feeds - सभी फीड्स को नवीनतम बनायें - - - - Download torrent - टाॅरेंट डाउनलोड करें - - - - Open news URL - नया URL खोलें - - - - Copy feed URL - फीड URL की प्रतिलिपि बनायें - - - - New folder... - नया फोल्डर... - - - - Please choose a folder name - कृपया फोल्डर का नाम चुनें - - - - Folder name: - फोल्डर का नाम: - - - - New folder - नया फोल्डर - - - - Please type a RSS feed URL - - - - - Feed URL: - - - - - Deletion confirmation - - - - - Are you sure you want to delete the selected RSS feeds? - - - - - Please choose a new name for this RSS feed - कृपया इस RSS फीड के लिये नया नाम चुनें - - - - New feed name: - नया फीड नाम: - - - - Rename failed - - - - - Date: - तारीख: - - - - Author: - लेखक: - - - - RssSettingsDlg - - RSS Reader Settings - RSS पाठक सेटिंग्स - - - RSS feeds refresh interval: - RSS फीड्स को नया करने का अंतराल: - - - Maximum number of articles per feed: - लेखों की प्रति फीड अधिकतम संख्या: - - - - ScanFoldersDelegate - - - Select save location - - - - - ScanFoldersModel - - - Monitored Folder - - - - - Override Save Location - - - - - Monitored folder - - - - - Default save location - - - - - Browse... - - - - - SearchJobWidget - - - Form - - - - - Results(xxx) - - - - - Search in: - - - - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - - - - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - - - - - Seeds: - - - - - <html><head/><body><p>Minimal number of seeds</p></body></html> - - - - - - to - - - - - <html><head/><body><p>Maximal number of seeds</p></body></html> - - - - - - - - - - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - - - - - Size: - साईज: - - - - <html><head/><body><p>Minimal torrent size</p></body></html> - - - - - <html><head/><body><p>Maximal torrent size</p></body></html> - - - - - Name - i.e: file name - नाम - - - - Size - i.e: file size - साईज - - - - Seeders - i.e: Number of full sources - सभी स्रोतो की संख्या - - - - Leechers - i.e: Number of partial sources - आंशिक स्रोतो की संख्या - - - - Search engine - खोज इंजन - - - - Filter search results... - - - - - Results (showing <i>%1</i> out of <i>%2</i>): - i.e: Search results - - - - - Torrent names only - - - - - Everywhere - - - - - Use regular expressions - - - - - Searching... - - - - - Search has finished - - - - - Search aborted - - - - - An error occurred during search... - - - - - Search returned no results - - - - - Column visibility - स्तंभ दृश्यता - - - - SearchListDelegate - - Unknown - अज्ञात - - - - SearchPluginManager - - - Unknown search engine plugin file format. - - - - - A more recent version of this plugin is already installed. - - - - - - Plugin is not supported. - - - - - All categories - - - - - Movies - - - - - TV shows - - - - - Music - - - - - Games - - - - - Anime - - - - - Software - - - - - Pictures - - - - - Books - - - - - Update server is temporarily unavailable. %1 - - - - - - Failed to download the plugin file. %1 - - - - - An incorrect update info received. - - - - - Search plugin '%1' contains invalid version string ('%2') - - - - - SearchTab - - Name - i.e: file name - नाम - - - Size - i.e: file size - साईज - - - Seeders - i.e: Number of full sources - सभी स्रोतो की संख्या - - - Leechers - i.e: Number of partial sources - आंशिक स्रोतो की संख्या - - - Search engine - खोज इंजन - - - Column visibility - स्तंभ दृश्यता - - - Size: - साईज: - - - - SearchWidget - - - - - - - - Search - खोंजे - - - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - - - Download - डाउनलोड करें - - - - Go to description page - - - - - Copy description page URL - - - - - Search plugins... - - - - - A phrase to search for. - - - - - Spaces in a search term may be protected by double quotes. - - - - - Example: - Search phrase example - - - - - <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> - Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - - - - - <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> - Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - - - - - All plugins - - - - - Only enabled - - - - - Select... - - - - - - - Search Engine - - - - - Please install Python to use the Search Engine. - - - - - Empty search pattern - - - - - Please type a search pattern first - - - - - Stop - - - - - Search has finished - - - - - Search has failed - - - - - ShutdownConfirmDialog - - - Don't show again - - - - - qBittorrent will now exit. - - - - - E&xit Now - - - - - Exit confirmation + + Monitored Folder - - The computer is going to shutdown. + + Override Save Location - - &Shutdown Now + + Monitored folder - - Shutdown confirmation - बंद करने की पु‍ष्टि - - - - The computer is going to enter suspend mode. + + Default save location - - &Suspend Now + + Browse... + + + SearchEngine - - Suspend confirmation + + Unknown search engine plugin file format. - - The computer is going to enter hibernation mode. + + A more recent version of this plugin is already installed. - - &Hibernate Now + + + Plugin is not supported. - - Hibernate confirmation + + Update server is temporarily unavailable. %1 - - You can cancel the action within %1 seconds. + + + Failed to download the plugin file. %1 - - - ShutdownConfirmDlg - - Shutdown confirmation - बंद करने की पु‍ष्टि - - - - SpeedLimitDialog - - - KiB/s - किलोबाइट्स/सेकंड्स - - - - SpeedPlotView - - Total Upload + + An incorrect update info received. - - Total Download + + All categories - - Payload Upload + + Movies - - Payload Download + + TV shows - - Overhead Upload + + Music - - Overhead Download + + Games - - DHT Upload + + Anime - - DHT Download + + Software - - Tracker Upload + + Pictures - - Tracker Download + + Books - SpeedWidget - - - Period: - - - - - 1 Minute - - + SearchListDelegate - - 5 Minutes - + + + Unknown + अज्ञात + + + SearchTab - - 30 Minutes - + + Name + i.e: file name + नाम - - 6 Hours - + + Size + i.e: file size + साईज - - Select Graphs - + + Seeders + i.e: Number of full sources + सभी स्रोतो की संख्या - - Total Upload - + + Leechers + i.e: Number of partial sources + आंशिक स्रोतो की संख्या - - Total Download - + + Search engine + खोज इंजन - - Payload Upload + + Results (showing <i>%1</i> out of <i>%2</i>): + i.e: Search results - - Payload Download + + Torrent names only - - Overhead Upload + + Everywhere - - Overhead Download + + Searching... - - DHT Upload + + Search has finished - - DHT Download + + Search aborted - - Tracker Upload + + An error occurred during search... - - Tracker Download + + Search returned no results - - - StacktraceDialog - - - Crash info - दुर्घटना की जानकारी - - - - StatsDialog - - Statistics - सांख्यिकी + + Column visibility + स्तंभ दृश्यता - - User statistics + + Form - - Cache statistics + + Results(xxx) - - Read cache hits: + + Search in: - - Average time in queue: + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - - Connected peers: + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - - All-time share ratio: + + Seeds: - - All-time download: + + <html><head/><body><p>Minimal number of seeds</p></body></html> - - Session waste: + + + to - - All-time upload: + + <html><head/><body><p>Maximal number of seeds</p></body></html> - - - Total buffer size: + + + + - - Performance statistics + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - - Queued I/O jobs: - + + Size: + साईज: - - Write cache overload: + + <html><head/><body><p>Minimal torrent size</p></body></html> - - Read cache overload: + + <html><head/><body><p>Maximal torrent size</p></body></html> + + + SearchWidget - - Total queued size: - + + + + + + Search + खोंजे - OK - ठीक है + + Download + डाउनलोड करें - - %1 ms - 18 milliseconds + + Go to description page - - - StatusBar - - - - Connection status: - कनेक्शन स्थिति: - - - - No direct connections. This may indicate network configuration problems. + + Copy description page URL - - - DHT: %1 nodes + + Search plugins... - - qBittorrent needs to be restarted! + + A phrase to search for. - - - Connection Status: - कनेक्शन स्थिति: - - - - Offline. This usually means that qBittorrent failed to listen on the selected port for incoming connections. + + Spaces in a search term may be protected by double quotes. - - Online + + Example: + Search phrase example - - Click to switch to alternative speed limits + + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> + Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - - Click to switch to regular speed limits + + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> + Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - - Global Download Speed Limit + + All plugins - - Global Upload Speed Limit + + Only enabled - - - StatusFilterWidget - - All (0) - this is for the status filter + + Select... - - Downloading (0) + + + + Search Engine - - Seeding (0) + + Please install Python to use the Search Engine. - - Completed (0) + + Empty search pattern - - Resumed (0) + + Please type a search pattern first - - Paused (0) + + Stop - - Active (0) + + Search has finished - - Inactive (0) + + Search has failed + + + ShutdownConfirmDlg - - Errored (0) + + qBittorrent will now exit. - - All (%1) + + E&xit Now - - Downloading (%1) + + Exit confirmation - - Seeding (%1) + + The computer is going to shutdown. - - Completed (%1) + + &Shutdown Now - - Paused (%1) + + The computer is going to enter suspend mode. - - Resumed (%1) + + &Suspend Now - - Active (%1) + + Suspend confirmation - - Inactive (%1) + + The computer is going to enter hibernation mode. - - Errored (%1) + + &Hibernate Now - - - TagFilterModel - - Tags + + Hibernate confirmation - - All + + You can cancel the action within %1 seconds. - - Untagged - + + Shutdown confirmation + बंद करने की पु‍ष्टि - TagFilterWidget + SpeedLimitDialog - - Add tag... - + + KiB/s + किलोबाइट्स/सेकंड्स + + + SpeedPlotView - - Remove tag + + Total Upload - - Remove unused tags + + Total Download - - Resume torrents + + Payload Upload - - Pause torrents + + Payload Download - - Delete torrents + + Overhead Upload - - New Tag + + Overhead Download - - Tag: + + DHT Upload - - Invalid tag name + + DHT Download - - Tag name '%1' is invalid + + Tracker Upload - - Tag exists + + Tracker Download + + + SpeedWidget - - Tag name already exists. + + Period: - - - TorrentCategoryDialog - - Torrent Category Properties + + 1 Minute - - Name: - नाम: + + 5 Minutes + - - Save path: + + 30 Minutes - - Choose save path - सहेजने हेतु पथ चुनें + + 6 Hours + - - New Category + + Select Graphs - - Invalid category name + + Total Upload - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. + + Total Download - - Category creation error + + Payload Upload - - Category with the given name already exists. -Please choose a different name and try again. + + Payload Download - - - TorrentContentModel - - Name - नाम + + Overhead Upload + - - Size - साईज + + Overhead Download + - - Progress - प्रगति + + DHT Upload + - - Download Priority + + DHT Download - - Remaining - बचा हुआ + + Tracker Upload + - - Availability + + Tracker Download - TorrentCreatorDialog + StatsDialog - - Torrent Creator - + + Statistics + सांख्यिकी - - Select file/folder to share + + User statistics - - Path: + + Total peer connections: - - [Drag and drop area] + + Global ratio: - - - Select file + + Alltime download: - - - Select folder + + Alltime upload: - - Settings + + Total waste (this session): - - Piece size: - टुकड़ो की साइज: - - - - Auto - स्वत + + Cache statistics + - - 16 KiB - 512 किबिबाइट्स {16 ?} + + Read cache hits: + - - 32 KiB - 32 किबिबाइट्स + + Average time in queue: + - - 64 KiB - 64 किबिबाइट्स + + Total buffers size: + - - 128 KiB - 128 किबिबाइट्स + + Performance statistics + - - 256 KiB - 256 किबिबाइट्स + + Queued I/O jobs: + - - 512 KiB - 512 किबिबाइट्स + + Write cache overload: + - - 1 MiB - 1 मेबिबाइट्स + + Read cache overload: + - - 2 MiB - 2 मेबिबाइट्स + + Total queued size: + - - 4 MiB - 4 मेबिबाइट्स + + OK + ठीक है - - 8 MiB - 4 मेबिबाइट्स {8 ?} + + %1 ms + 18 milliseconds + + + + StatusBar - - 16 MiB - 4 मेबिबाइट्स {16 ?} + + + Connection status: + कनेक्शन स्थिति: - - 32 MiB - 4 मेबिबाइट्स {16 ?} {32 ?} + + + No direct connections. This may indicate network configuration problems. + - - Calculate number of pieces: + + + DHT: %1 nodes - - Private torrent (Won't distribute on DHT network) + + qBittorrent needs to be restarted - - Start seeding immediately + + qBittorrent was just updated and needs to be restarted for the changes to be effective. - - Ignore share ratio limits for this torrent - इस टाॅरेंट के लिए शेयर अनुपात सीमा की अवहेलना करें + + + Connection Status: + कनेक्शन स्थिति: - - Optimize alignment + + Offline. This usually means that qBittorrent failed to listen on the selected port for incoming connections. - - Fields + + Online - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - आप ट्रैकर्स के समूह को एक खाली पंक्ति के साथ अलग कर सकतें हैं. - - - - Web seed URLs: + + Click to switch to alternative speed limits - - Tracker URLs: - ट्रैकर URLs: - - - - Comments: + + Click to switch to regular speed limits - - Source: + + Manual change of rate limits mode. The scheduler is disabled. - - Progress: - प्रगति: - - - - Create Torrent + + Global Download Speed Limit - - - - Torrent creation failed + + Global Upload Speed Limit + + + StatusFiltersWidget - - Reason: Path to file/folder is not readable. + + All (0) + this is for the status filter - - Select where to save the new torrent + + Downloading (0) - - Torrent Files (*.torrent) + + Seeding (0) - - Reason: %1 + + Completed (0) - - Reason: Created torrent is invalid. It won't be added to download list. + + Resumed (0) - - Torrent creator + + Paused (0) - - Torrent created: + + Active (0) - - - TorrentCreatorDlg - - Select a folder to add to the torrent - टाॅरेंट में जोड़ने के लिये एक फोल्डर चुनें - - - Select a file to add to the torrent - टाॅरेंट में जोड़ने के लिये एक फाइल चुनें - - No input path set - निवेश पथ नहीं चुना गया + + Inactive (0) + - Please type an input path first - कृपया पहले एक निवेश पथ टंकित करें + + Errored (0) + - Select destination torrent file - टाॅरेंट फाइल के लिए गन्तव्य चुनें + + All (%1) + - Torrent creation - टाॅरेंट निर्माण + + Downloading (%1) + - Torrent creation was unsuccessful, reason: %1 - टाॅरेंट निर्माण विफल रहा, वजह: %1 + + Seeding (%1) + - Piece size: - टुकड़ो की साइज: + + Completed (%1) + - Auto - स्वत + + Paused (%1) + - 16 KiB - 512 किबिबाइट्स {16 ?} + + Resumed (%1) + - 32 KiB - 32 किबिबाइट्स + + Active (%1) + - 64 KiB - 64 किबिबाइट्स + + Inactive (%1) + - 128 KiB - 128 किबिबाइट्स + + Errored (%1) + + + + TorrentContentModel - 256 KiB - 256 किबिबाइट्स + + Name + नाम - 512 KiB - 512 किबिबाइट्स + + Size + साईज - 1 MiB - 1 मेबिबाइट्स + + Progress + प्रगति - 2 MiB - 2 मेबिबाइट्स + + Download Priority + - 4 MiB - 4 मेबिबाइट्स + + Remaining + बचा हुआ + + + TorrentCreatorDlg - 8 MiB - 4 मेबिबाइट्स {8 ?} + + Select a folder to add to the torrent + टाॅरेंट में जोड़ने के लिये एक फोल्डर चुनें - 16 MiB - 4 मेबिबाइट्स {16 ?} + + Select a file to add to the torrent + टाॅरेंट में जोड़ने के लिये एक फाइल चुनें - 32 MiB - 4 मेबिबाइट्स {16 ?} {32 ?} + + No input path set + निवेश पथ नहीं चुना गया - Ignore share ratio limits for this torrent - इस टाॅरेंट के लिए शेयर अनुपात सीमा की अवहेलना करें + + Please type an input path first + कृपया पहले एक निवेश पथ टंकित करें - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - आप ट्रैकर्स के समूह को एक खाली पंक्ति के साथ अलग कर सकतें हैं. + + Select destination torrent file + टाॅरेंट फाइल के लिए गन्तव्य चुनें - Tracker URLs: - ट्रैकर URLs: + + Torrent Files (*.torrent) + - Progress: - प्रगति: + + Torrent was created successfully: %1 + %1 is the path of the torrent + - - - TorrentInfo - - File size exceeds max limit %1 - + + + + Torrent creation + टाॅरेंट निर्माण - - Torrent file read error: %1 - + + Torrent creation was unsuccessful, reason: %1 + टाॅरेंट निर्माण विफल रहा, वजह: %1 - - Torrent file read error: size mismatch + + Created torrent file is invalid. It won't be added to download list. TorrentModel + Name i.e: torrent name - नाम + नाम + Size i.e: torrent size - साईज + साईज + Done % Done - पूर्ण + पूर्ण + Status Torrent status (e.g. downloading, seeding, paused) - स्थिति + स्थिति + Seeds i.e. full sources (often untranslated) - सभी स्रोत + सभी स्रोत + Peers i.e. partial sources (often untranslated) - सहकर्मी + सहकर्मी + Down Speed i.e: Download speed - डाउनलोड गति + डाउनलोड गति + Up Speed i.e: Upload speed - अपलोड गति + अपलोड गति + Ratio Share ratio - अनुपात + अनुपात + ETA i.e: Estimated Time of Arrival / Time left - बचा हुआ समय + बचा हुआ समय + + Category + + + + Added On Torrent was added to transfer list on 01/01/2010 08:00 - जोड़ा गया + जोड़ा गया + Completed On Torrent was completed on 01/01/2010 08:00 - पूर्ण हुआ + पूर्ण हुआ + Tracker - ट्रैकर + ट्रैकर + Down Limit i.e: Download limit - डाउनलोड सीमा + डाउनलोड सीमा + Up Limit i.e: Upload limit - अपलोड सीमा + अपलोड सीमा + Downloaded Amount of data downloaded (e.g. in MB) - डाउनलोडेड + डाउनलोडेड + Uploaded Amount of data uploaded (e.g. in MB) - अपलोडेड - - - Remaining - Amount of data left to download (e.g. in MB) - बचा हुआ - - - Time Active - Time (duration) the torrent is active (not paused) - सक्रिय रहने का समय - - - Save path - Torrent save path - सहेजने हेतु पथ - - - - TorrentsController - - - Not contacted yet - अभी तक संपर्क नहीं हुआ - - - - Updating... - नवीनतम हो रहा हैं... - - - - Working - कार्यान्वित - - - - Not working - कार्यान्वित नहीँ है - - - - Error: '%1' is not a valid torrent file. - + अपलोडेड - - - - - Torrent queueing must be enabled + + Session Download + Amount of data downloaded since program open (e.g. in MB) - - Save path cannot be empty + + Session Upload + Amount of data uploaded since program open (e.g. in MB) - - - Category cannot be empty - + + Remaining + Amount of data left to download (e.g. in MB) + बचा हुआ - - Unable to create category - + + Time Active + Time (duration) the torrent is active (not paused) + सक्रिय रहने का समय - - Unable to edit category - + + Save path + Torrent save path + सहेजने हेतु पथ - - Cannot make save path + + Completed + Amount of data completed (e.g. in MB) - - Cannot write to directory + + Ratio Limit + Upload share ratio limit - - WebUI Set location: moving "%1", from "%2" to "%3" + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole - - Incorrect torrent name + + Last Activity + Time passed since a chunk was downloaded/uploaded - - - Incorrect category name + + Total Size + i.e. Size including unwanted data TrackerFiltersList - + All (0) this is for the tracker filter - + Trackerless (0) - + Error (0) - + Warning (0) - - + + Trackerless (%1) - - + + Error (%1) - - + + Warning (%1) - + Resume torrents - + Pause torrents - + Delete torrents - - + + All (%1) this is for the tracker filter @@ -9485,443 +7771,272 @@ TrackerList + URL - URL + URL + Status - स्थिति + स्थिति + + + + Received + + Seeds - सभी स्रोत + सभी स्रोत + Peers - पीयर्स + पीयर्स + Downloaded - डाउनलोडेड + डाउनलोडेड + Message - संदेश + संदेश + + Working - कार्यान्वित + कार्यान्वित + Disabled - असक्षम + असक्षम + This torrent is private - यह टाॅरेंट निजी है + यह टाॅरेंट निजी है + Updating... - नवीनतम हो रहा हैं... + नवीनतम हो रहा हैं... + Not working - कार्यान्वित नहीँ है + कार्यान्वित नहीँ है + Not contacted yet - अभी तक संपर्क नहीं हुआ + अभी तक संपर्क नहीं हुआ + Tracker URL: - ट्रैकर URL: - - - Tracker editing - ट्रैकर संपादन - - - Tracker editing failed - ट्रैकर संपादन विफल रहा - - - The tracker URL entered is invalid. - दाखिल किया गया टाॅरेंट URL अमान्य है. - - - The tracker URL already exists. - यह टाॅरेंट URL पहले से ही प्रयोग में है. - - - Add a new tracker... - नया ट्रैकर जोड़े... - - - Edit selected tracker URL - चुने हुए ट्रैकर URL का संपादन करें - - - Force reannounce to selected trackers - चयनित ट्रैकर्स को बलपुर्वक पुन: सुचित करें - - - Force reannounce to all trackers - सभी ट्रैकर्स को बलपुर्वक सूचित करें - - - Column visibility - स्तंभ दृश्यता - - - Remove tracker - ट्रैकर हटाएँ - - - - TrackerListWidget - - - - Working - कार्यान्वित - - - - Disabled - असक्षम + ट्रैकर URL: - - This torrent is private - यह टाॅरेंट निजी है - - - - Updating... - नवीनतम हो रहा हैं... - - - - Not working - कार्यान्वित नहीँ है - - - - Not contacted yet - अभी तक संपर्क नहीं हुआ - - - - - - - - - N/A - - - - + Tracker editing - ट्रैकर संपादन + ट्रैकर संपादन - - Tracker URL: - ट्रैकर URL: - - - - + + Tracker editing failed - ट्रैकर संपादन विफल रहा + ट्रैकर संपादन विफल रहा - + The tracker URL entered is invalid. - दाखिल किया गया टाॅरेंट URL अमान्य है. + दाखिल किया गया टाॅरेंट URL अमान्य है. - + The tracker URL already exists. - यह टाॅरेंट URL पहले से ही प्रयोग में है. + यह टाॅरेंट URL पहले से ही प्रयोग में है. - + Add a new tracker... - नया ट्रैकर जोड़े... - - - - Remove tracker - ट्रैकर हटाएँ + नया ट्रैकर जोड़े... - + Copy tracker URL - - Edit selected tracker URL - चुने हुए ट्रैकर URL का संपादन करें - - - - Force reannounce to selected trackers - चयनित ट्रैकर्स को बलपुर्वक पुन: सुचित करें - - - - Force reannounce to all trackers - सभी ट्रैकर्स को बलपुर्वक सूचित करें - - - - URL - URL - - - - Status - स्थिति - - - - Received - - - - - Seeds - सभी स्रोत - - - - Peers - - - - - Downloaded - डाउनलोडेड - - - - Message - संदेश - - - - Column visibility - स्तंभ दृश्यता - - - - TrackerLoginDialog - - - - Tracker authentication - ट्रैकर प्रमाणीकरण - - - - Tracker: - ट्रैकर: - - - - Login - लॉगिन - - - - Username: - प्रयोक्ता नाम: - - - - Password: - पासवर्ड: - - - - Log in - लॉगिन - - - - TrackersAdditionDialog - - - Trackers addition dialog - ट्रैकर्स जोड़ने हेतु डायलाग - - - - List of trackers to add (one per line): - जोड़ने के लिए ट्रैकर्स की सूची (प्रति पंक्ति एक): - - - - µTorrent compatible list URL: - µTorrent संगत सूची URL: - - - - No change - कोई बदलाव नहीं + + Edit selected tracker URL + चुने हुए ट्रैकर URL का संपादन करें - - No additional trackers were found. - कोई और ट्रैकर्स नहीं मिलें. + + Force reannounce to selected trackers + चयनित ट्रैकर्स को बलपुर्वक पुन: सुचित करें - - Download error - डाउनलोड त्रुटि + + Force reannounce to all trackers + सभी ट्रैकर्स को बलपुर्वक सूचित करें - - The trackers list could not be downloaded, reason: %1 - + + Remove tracker + ट्रैकर हटाएँ TrackersAdditionDlg + Trackers addition dialog - ट्रैकर्स जोड़ने हेतु डायलाग + ट्रैकर्स जोड़ने हेतु डायलाग + List of trackers to add (one per line): - जोड़ने के लिए ट्रैकर्स की सूची (प्रति पंक्ति एक): + जोड़ने के लिए ट्रैकर्स की सूची (प्रति पंक्ति एक): - + + µTorrent compatible list URL: - µTorrent संगत सूची URL: + µTorrent संगत सूची URL: + I/O Error - I/O त्रुटि + I/O त्रुटि + + + + Error while trying to open the downloaded file. + + No change - कोई बदलाव नहीं + कोई बदलाव नहीं + No additional trackers were found. - कोई और ट्रैकर्स नहीं मिलें. + कोई और ट्रैकर्स नहीं मिलें. + Download error - डाउनलोड त्रुटि + डाउनलोड त्रुटि + + + + The trackers list could not be downloaded, reason: %1 + TransferListDelegate - + Downloading डाउनलोड हो रहा है - + Downloading metadata used when loading a magnet link मेटाडाटा डाउनलोड हो रहा है - + Allocating qBittorrent is allocating the files on disk आवंटन - + Paused रूका हुआ - + Queued i.e. torrent is queued कतारबद्ध - + Seeding Torrent is complete and in upload-only mode सीडिंग - + Stalled Torrent is waiting for download to begin अवस्र्द्ध - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. - + Checking Torrent local data is being checked जाँच हो रहा है - + Queued for checking i.e. torrent is queued for hash checking - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - + Completed - - Moving - Torrent local data are being moved/relocated - - - - + Missing Files - + Errored torrent status, the torrent has an error - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - + %1 ago e.g.: 1h 20m ago @@ -9930,790 +8045,591 @@ TransferListFiltersWidget - + Status स्थिति - + Categories - - Tags - - - - + Trackers ट्रैकर्स - TransferListModel - - - Name - i.e: torrent name - नाम - - - - Size - i.e: torrent size - साईज - - - - Done - % Done - पूर्ण - - - - Status - Torrent status (e.g. downloading, seeding, paused) - स्थिति - - - - Seeds - i.e. full sources (often untranslated) - सभी स्रोत - - - - Peers - i.e. partial sources (often untranslated) - - - - - Down Speed - i.e: Download speed - डाउनलोड गति - - - - Up Speed - i.e: Upload speed - अपलोड गति - - - - Ratio - Share ratio - अनुपात - - - - ETA - i.e: Estimated Time of Arrival / Time left - बचा हुआ समय - - - - Category - - - - - Tags - - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - जोड़ा गया - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - पूर्ण हुआ - - - - Tracker - ट्रैकर - - - - Down Limit - i.e: Download limit - डाउनलोड सीमा - - - - Up Limit - i.e: Upload limit - अपलोड सीमा - - - - Downloaded - Amount of data downloaded (e.g. in MB) - डाउनलोडेड - - - - Uploaded - Amount of data uploaded (e.g. in MB) - अपलोडेड - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - बचा हुआ - - - - Time Active - Time (duration) the torrent is active (not paused) - सक्रिय रहने का समय - - - - Save path - Torrent save path - सहेजने हेतु पथ - - - - Completed - Amount of data completed (e.g. in MB) - - - - - Ratio Limit - Upload share ratio limit - - - - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - - - - - Last Activity - Time passed since a chunk was downloaded/uploaded - - - - - Total Size - i.e. Size including unwanted data - - - - TransferListWidget - + Column visibility स्तंभ दृश्यता - + Choose save path सहेजने हेतु पथ चुनें - + Torrent Download Speed Limiting टाॅरेंट डाउनलोड गति सीमा - + Torrent Upload Speed Limiting टाॅरेंट अपलोड गति सीमा - + Recheck confirmation पुन:जाँच करने की पु‍ष्टि - + Are you sure you want to recheck the selected torrent(s)? क्या आप निश्चित है कि आप चयनित टाॅरेंट्स की पुन:जाँच करना चाहते हैं? - + Rename पुन:नामकरण - + New name: नया नाम: - + Resume Resume/start the torrent पुन: आरंभ करें - + Force Resume Force Resume/start the torrent - + Pause Pause the torrent रोकें - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - - - - - Add Tags - - - - - Remove All Tags - - - - - Remove all tags from selected torrents? + + New Category - - Comma-separated tags: + + Category: - - Invalid tag + + Invalid category name - - Tag name: '%1' is invalid + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. - + Delete Delete the torrent रद्द करें - + Preview file... फाईल पूर्वावलोकन... - + Limit share ratio... शेयर अनुपात की सीमा... - + Limit upload rate... अपलोड दर की सीमा... - + Limit download rate... डाउनलोड दर की सीमा... - + Open destination folder गन्तव्य डायरेक्टरी खोलें - + Move up i.e. move up in the queue ऊपर जांए - + Move down i.e. Move down in the queue नीचे जांए - + Move to top i.e. Move to top of the queue सबसे ऊपर जांए - + Move to bottom i.e. Move to bottom of the queue सबसे नीचे जांए - + Set location... जगह निर्धारित करें... - - Force reannounce - - - - + Copy name - - Copy hash - - - - + Download first and last pieces first - + Automatic Torrent Management - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - + Category - + New... New category... - + Reset Reset category - - Tags - - - - - Add... - Add / assign multiple tags... - - - - - Remove All - Remove all tags - - - - + Priority वरीयता - + Force recheck फिरसे बलपुर्वक जांचे - + Copy magnet link मैगनेट लिंक की प्रतिलिपि बनायें - + Super seeding mode विशूद्ध सूपर सीडिंग मोड - + Rename... पुन:नामकरण... - + Download in sequential order अनुक्रमिक तरीके से डाउनलोड करें - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - - Use global share limit + + Use global ratio limit - - - + + + buttonGroup - - Set no share limit - - - - - Set share limit to - - - - - ratio - - - - - minutes - - - - - No share limit method selected - - - - - Please select a limit method first - - - - - UpDownRatioDlg - + Set no ratio limit - कोई अनुपात सीमा निर्धारित न करें + कोई अनुपात सीमा निर्धारित न करें + Set ratio limit to - निर्धारित अनुपात सीमा + निर्धारित अनुपात सीमा - Utils::ForeignApps - - - Python detected, version: %1 - - + WebApplication - - Python not detected + + Incorrect category name - WebApplication + WebUI - - Unacceptable file type, only regular file is allowed. + + The Web UI is listening on port %1 - - Symlinks inside alternative UI folder are forbidden. + + Web UI Error - Unable to bind Web UI to port %1 + + + about - - Exceeded the maximum allowed file size (%1)! + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' + + Copyright %1 2006-2016 The qBittorrent project - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' + + Home Page: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' + + Forum: - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' + + Bug Tracker: - WebUI - - - Web UI: HTTPS setup successful - - + addPeersDialog - - Web UI: HTTPS setup failed, fallback to HTTP + + Add Peers - - Web UI: Now listening on IP: %1, port: %2 + + List of peers to add (one per line): - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 + + Format: IPv4:port / [IPv6]:port authentication + + Tracker authentication - ट्रैकर प्रमाणीकरण + ट्रैकर प्रमाणीकरण + Tracker: - ट्रैकर: + ट्रैकर: + Login - लॉगिन + लॉगिन + Username: - प्रयोक्ता नाम: + प्रयोक्ता नाम: + Password: - पासवर्ड: + पासवर्ड: + Log in - लॉगिन + लॉगिन + Cancel - रद्द करें + रद्द करें confirmDeletionDlg + Deletion confirmation - qBittorrent - रद्द करनें हेतु पुष्टि करें - qBittorrent + रद्द करनें हेतु पुष्टि करें - qBittorrent + Remember choice - अपनी पसंद याद रखें + अपनी पसंद याद रखें + Also delete the files on the hard disk - हार्ड डिस्क की फाइलें भी रद्द करें + हार्ड डिस्क की फाइलें भी रद्द करें + + + + confirmShutdownDlg + + + Don't show again + createTorrentDialog + Cancel - रद्द करें + रद्द करें + Torrent Creation Tool - टाॅरेंट निर्माण उपकरण + टाॅरेंट निर्माण उपकरण + Torrent file creation - टाॅरेंट फाइल निर्माण + टाॅरेंट फाइल निर्माण + Add file - फाईल जोड़ें + फाईल जोड़ें + Add folder - फोल्डर जोड़ें + फोल्डर जोड़ें + File or folder to add to the torrent: - टाॅरेंट में जोड़ने के लिये फाइल या फोल्डर: + टाॅरेंट में जोड़ने के लिये फाइल या फोल्डर: + Tracker URLs: - ट्रैकर URLs: + ट्रैकर URLs: + Web seeds urls: - वेब सीड्स urls: + वेब सीड्स urls: + Comment: - टिप्पणी: + टिप्पणी: + You can separate tracker tiers / groups with an empty line. A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - आप ट्रैकर्स के समूह को एक खाली पंक्ति के साथ अलग कर सकतें हैं. + आप ट्रैकर्स के समूह को एक खाली पंक्ति के साथ अलग कर सकतें हैं. + Piece size: - टुकड़ो की साइज: + टुकड़ो की साइज: + 16 KiB - 512 किबिबाइट्स {16 ?} + 512 किबिबाइट्स {16 ?} + 32 KiB - 32 किबिबाइट्स + 32 किबिबाइट्स + 64 KiB - 64 किबिबाइट्स + 64 किबिबाइट्स + 128 KiB - 128 किबिबाइट्स + 128 किबिबाइट्स + 256 KiB - 256 किबिबाइट्स + 256 किबिबाइट्स + 512 KiB - 512 किबिबाइट्स + 512 किबिबाइट्स + 1 MiB - 1 मेबिबाइट्स + 1 मेबिबाइट्स + 2 MiB - 2 मेबिबाइट्स + 2 मेबिबाइट्स + 4 MiB - 4 मेबिबाइट्स + 4 मेबिबाइट्स + 8 MiB - 4 मेबिबाइट्स {8 ?} + 4 मेबिबाइट्स {8 ?} + 16 MiB - 4 मेबिबाइट्स {16 ?} + 4 मेबिबाइट्स {16 ?} + Auto - स्वत + स्वत + Private (won't be distributed on DHT network if enabled) - निजी(DHT नेटवर्क पर बाँटा नहीं जाएगा यदि सक्षम है) + निजी(DHT नेटवर्क पर बाँटा नहीं जाएगा यदि सक्षम है) + Start seeding after creation - निर्माण के बाद सीडिंग शुरू करें + निर्माण के बाद सीडिंग शुरू करें + Ignore share ratio limits for this torrent - इस टाॅरेंट के लिए शेयर अनुपात सीमा की अवहेलना करें + इस टाॅरेंट के लिए शेयर अनुपात सीमा की अवहेलना करें + Create and save... - बनाएं और सहेंजें... + बनाएं और सहेंजें... + Progress: - प्रगति: + प्रगति: downloadFromURL + Add torrent links - टाॅरेंट लिंक्स जोड़ें + टाॅरेंट लिंक्स जोड़ें + One per line (HTTP links, Magnet links and info-hashes are supported) - प्रति पंक्ति एक (HTTP लिंक्स, मैगनेट लिंक्स और इन्फो-हैशेज समर्थित हैं) + प्रति पंक्ति एक (HTTP लिंक्स, मैगनेट लिंक्स और इन्फो-हैशेज समर्थित हैं) + Download - डाउनलोड करें + डाउनलोड करें + Cancel - रद्द करें + रद्द करें + Download from urls - urls से डाउनलोड करें + urls से डाउनलोड करें + No URL entered - URL प्रविष्ट नहीं हुआ + URL प्रविष्ट नहीं हुआ + Please type at least one URL. - कृपया कम से कम एक URL टंकित करें. + कृपया कम से कम एक URL टंकित करें. errorDialog + Crash info - दुर्घटना की जानकारी + दुर्घटना की जानकारी fsutils - + + + + + Downloads डाउनलोड्स @@ -10721,131 +8637,140 @@ misc - + B bytes बाइट्स - + KiB kibibytes (1024 bytes) किबिबाइट्स - + MiB mebibytes (1024 kibibytes) मेबिबाइट्स - + GiB gibibytes (1024 mibibytes) गिबिबाइट्स - + TiB tebibytes (1024 gibibytes) टेबिबाइट्स - + PiB pebibytes (1024 tebibytes) - + EiB exbibytes (1024 pebibytes) - + + Python not detected + + + + + Python version: %1 + + + + /s per second /सेकंड - + %1h %2m e.g: 3hours 5minutes %1घण्टा %2मिनट - + %1d %2h e.g: 2days 10hours %1दिन %2घण्टा - + Unknown Unknown (size) अज्ञात - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent अब कम्प्युटर बंद करेगा क्योंकि सारे डाउनलोड्स पुर्ण हो गये है. - + < 1m < 1 minute < 1 मिनट - + %1m e.g: 10minutes %1मिनट + Working - कार्यान्वित + कार्यान्वित + Updating... - नवीनतम हो रहा हैं... + नवीनतम हो रहा हैं... + Not working - कार्यान्वित नहीँ है + कार्यान्वित नहीँ है + Not contacted yet - अभी तक संपर्क नहीं हुआ + अभी तक संपर्क नहीं हुआ preview - + Preview selection पूर्वावलोकन चयन - + The following files support previewing, please select one of them: निम्नलिखित फ़ाइलें पूर्वावलोकन समर्थन करती हैं, कृपया उनमें से एक का चयन करें: + Preview - पूर्वावलोकन + पूर्वावलोकन + Cancel - रद्द करें - - - - trackerLogin - - Log in - लॉगिन + रद्द करें diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_hr.ts qbittorrent-3.3.15/src/lang/qbittorrent_hr.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_hr.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_hr.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - + O programu qBittorrent - + About - + O programu - + Author - - - - - Current maintainer - + Autor - - Greece - Grčka + + + Nationality: + Nacionalnost: - - - Nationality: - + + + Name: + Naziv: - - + + E-mail: - + E-pošta: - - - Name: - + + Greece + Grčka - - Original author - + + Current maintainer + Trenutni održavatelj - - France - Francuska + + Original author + Začetnik projekta - + Special Thanks - + Posebno hvala - + Translators - + Prevoditelji - - License - - - - + Libraries - + Biblioteke - + qBittorrent was built with the following libraries: - - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - + qBittorrent je napravljen sa slijedećim bibliotekama. - - Forum: - + + France + Francuska - - Bug Tracker: - + + License + Licenca @@ -115,57 +90,67 @@ Spremi na - + + Browse... + Pretraži... + + + + Set as default save path + Postavi kao uobičajenu putanju spremanja + + + Never show again Ne pokazuj više - + Torrent settings Postavke torrenta - + Set as default category Namjesti na zadanu kategoriju - + Category: Kategorija: - + Start torrent Započni torrent - + Torrent information Torrent informacije - + Skip hash check Preskoči hash provjeru - + Size: Veličina: - + Hash: Hash: - + Comment: Komentar: - + Date: Datum: @@ -182,125 +167,97 @@ Manual - Ručno + Automatic - Automatski - - - - Remember last used save path - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - + Do not delete .torrent file - Nemoj izbrisati .torrent datoteku - - - - Create subfolder - Stvori podmapu - - - - Download in sequential order - Preuzmi u sekvencijskom poretku - - - - Download first and last pieces first - Preuzmi prve i zadnje dijelove prije drugih. + - + Normal Uobičajen - + High Visok - + Maximum Najviši - + Do not download Ne preuzimaj - - - + + + I/O Error I/O greška - + Invalid torrent Neispravan torrent - - Renaming - Preimenovanje - - - - - Rename error - Greška preimenovanja - - - - The name is empty or contains forbidden characters, please choose a different one. - + + + + + Already in download list + Već je na popisu preuzimanja - + Not Available This comment is unavailable Nije dostupno - + Not Available This date is unavailable Nije dostupno - + Not available Nije dostupan - + Invalid magnet link Neispravna magnet poveznica - + The torrent file '%1' does not exist. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -308,115 +265,128 @@ - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torrent datoteka je već u listi za preuzimanje. Trackeri nisu spojeni zato što je ovo privatni torrent. + + + + Torrent is already in download list. Trackers were merged. + Torrent je već u listi za preuzimanje. Trackeri su dodani. + + + + + Cannot add torrent + Nemoguće dodati torrent + + + + Cannot add this torrent. Perhaps it is already in adding state. + Nemoguće dodati ovaj torrent. Možda je već u procesu dodavanja. + + + This magnet link was not recognized Ova magnet poveznica nije prepoznata - + + Magnet link is already in download list. Trackers were merged. + Magnet poveznica je već u listi za preuzimanje. Trackeri su dodani. + + + + Cannot add this torrent. Perhaps it is already in adding. + Nemoguće dodati ovaj torrent. Možda se već dodaje. + + + Magnet link Magnet poveznica - + Retrieving metadata... Preuzimaju se metapodaci... - + Not Available This size is unavailable. Nije dostupno - + Free space on disk: %1 Slobodno mjesto na disku: %1 - + + Choose save path Izaberite putanju spremanja - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - + + Rename the file + Preimenuj datoteku - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + + New name: + Novi naziv: - - Magnet link is already queued for processing. - + + + The file could not be renamed + Datoteku nije moguće preimenovati - - New name: - Novi naziv: + + This file name contains forbidden characters, please choose a different one. + Ovaj naziv datoteke sadrži zabranjene znakove. Izaberite drugi. - - + + This name is already in use in this folder. Please use a different name. Naziv se već koristi u toj mapi. Koristite drugi naziv. - + The folder could not be renamed Mapu nije moguće preimenovati - + Rename... Preimenuj... - + Priority Prioritet - + Invalid metadata Nevažeći metapodaci - + Parsing metadata... Razrješavaju se metapodaci... - + Metadata retrieval complete Preuzimanje metapodataka dovršeno - + Download Error Greška preuzimanja @@ -424,312 +394,198 @@ AdvancedSettings - + + Disk write cache size + Veličina privremene memorije pisanja diska + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Izlazni portovi (Min.) [0: Onemogućeni] - + Outgoing ports (Max) [0: Disabled] Izlazni portovi (Maks.) [0: Omogućeni] - + Recheck torrents on completion Ponovno provjeri torrente pri dopunjavanju - + Transfer list refresh interval Interval osvježavanja popisa prijenosa - + ms milliseconds ms - + Setting Postavka - + Value Value set for this setting Vrijednost - - - (disabled) - - - - + (auto) (auto) - - min - minutes - - - - + All addresses - Sve adrese + - + qBittorrent Section qBittorrent dio - - + + Open documentation Otvori dokumentaciju - + libtorrent Section libtorrent dio - - Asynchronous I/O threads - - - - - Disk cache - - - - + s seconds s - + Disk cache expiry interval Interval isteka predmemorije diska - + Enable OS cache Omogući OS predmemoriju - - Guided read cache - - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - - - - - - KiB - - - - - Send buffer watermark - - - - - Send buffer low watermark - - - - - Send buffer watermark factor - - - - - Prefer TCP - - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address - + + m + minutes + m - + Resolve peer countries (GeoIP) Razrješi države peerova (GeoIP) - + Resolve peer host names Razrješi nazive peer hostova - + Strict super seeding Strogo superseedanje - + Network Interface (requires restart) Mrežno sučelje (zahtjeva ponovno pokretanje) - + Optional IP Address to bind to (requires restart) - + Listen on IPv6 address (requires restart) Osluškivanje IPv6 adrese (zahtjeva ponovno pokretanje) - + Display notifications - + Display notifications for added torrents - + Download tracker's favicon - - Save path history length - - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - - - - - Round-robin - - - - - Fastest upload - - - - - Anti-leech - - - - - Upload choking algorithm - - - - + Confirm torrent recheck Potvrdi ponovnu provjeru torrenta - - Confirm removal of all tags - - - - - Always announce to all trackers in a tier - + Exchange trackers with other peers + Razmjena trackera s drugim peerovima - - Always announce to all tiers - + + Always announce to all trackers + Uvijek obavijesti sve trackere - + Any interface i.e. Any network interface Bilo koje sučelje - + Save resume data interval How often the fastresume file is saved. Spremi sažetak intervala podataka - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - - - - + Maximum number of half-open connections [0: Unlimited] Maksimalan broj polu-otvorenih veza [0: Neograničeno] - + IP Address to report to trackers (requires restart) IP adresa za prijaviti trackerima (potrebno ponovno pokretanje) - + Enable embedded tracker Omogući ugrađeni tracker - + Embedded tracker port Port ugrađenog trackera - + Check for software updates Provjeri softverska ažuriranja - + Use system icon theme Koristi teme ikona sustava @@ -737,120 +593,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 pokrenut - + Torrent: %1, running external program, command: %2 - - Torrent name: %1 - - - - - Torrent size: %1 - - - - - Save path: %1 - - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - - - - - Thank you for using qBittorrent. - - - - - [qBittorrent] '%1' has finished downloading + + Torrent: %1, run external program command too long (length > %2), execution failed. - + Torrent: %1, sending mail notification - + Information Informacija - - To control qBittorrent, access the Web UI at %1 - + + To control qBittorrent, access the Web UI at http://localhost:%1 + Kako bi kontrolirali qBittorrent, pristupite web sučelju na http://localhost:%1 - + The Web UI administrator user name is: %1 Administratorsko korisničko ime na web sučelju je: %1 - + The Web UI administrator password is still the default one: %1 Adminstratorska lozinka web sučelja ostaje zadana: %1 - + This is a security risk, please consider changing your password from program preferences. To je sigurnosni rizik. Uzmite u obzir promjenu lozinke u postavkama programa. - + Saving torrent progress... Spremanje napretka torrenta... - - - Portable mode and explicit profile directory options are mutually exclusive - - - - - Portable mode implies relative fastresume - - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Spremi u: @@ -860,834 +657,696 @@ RSS preuzimatelj - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - + + Enable Automated RSS Downloader + Omogući automatski RSS preuzimatelj - + Download Rules Pravila preuzimanja - + Rule Definition Definicija pravila - + Use Regular Expressions Koristi regularne izraze - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - - - - + Must Contain: Mora sadržavati: - + Must Not Contain: Ne smije sadržavati: - + Episode Filter: Filter epizoda: - + Assign Category: Pridruži kategoriju: - + Save to a Different Directory Spremi u drugu mapu - + Ignore Subsequent Matches for (0 to Disable) ... X days Ignoriraj slijedeća podudaranja za (0 za Onemogućiti) - + Disabled - + Onemogućeno - + days dani - + Add Paused: Dodaj pauzirano: - + Use global settings Koristi globalne postavke - + Always Uvijek - + Never Nikada - + Apply Rule to Feeds: Primjeni pravilo na kanale: - + Matching RSS Articles Podudarajući RSS članci - + &Import... Uvez&i... - + &Export... Izv&ezi... - + Matches articles based on episode filter. Podudarnosti članaka su na osnovi epizodnog filtera. - + Example: Primjer: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match epizode 2, 5, 8 odgovaraju epizodama 15, 30 i sljedećim epizodama prve sezone - + Episode filter rules: Pravila za filtriranje epizoda: - + Season number is a mandatory non-zero value Broj sezone je neophodan - + Episode number is a mandatory non-zero value + Broj epizode je neophodan + + + Filter must end with semicolon Filter mora završavati točka-zarezom - + Three range types for episodes are supported: Podržane su tri vrste poretka epizoda: - + Single number: <b>1x25;</b> matches episode 25 of season one Pojedinačni broj:<b>1x25;</b> označava 25. epizodu prve sezone - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Uobičajen raspon: <b>1x25-40;</b> označava epizode od 25. do 40. prve sezone - - Episode number is a mandatory positive value - - - - - Rules - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Neograničen raspon: <b>1x25-;</b> označava epizode dalje od 25. prve sezone - - Rules (legacy) + + Episode number is a mandatory positive value - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - + Last Match: %1 days ago Posljednje podudaranje: prije %1 dan(a) - + Last Match: Unknown Posljednje podudaranje: Nepoznato - + New rule name Naziv novog pravila - + Please type the name of the new download rule. Upišite naziv novog pravila preuzimanja. - - + + Rule name conflict Konflikt naziva pravila - - + + A rule with this name already exists, please choose another name. Pravilo s tim nazivom već postoji. Izaberite drugi naziv. - + Are you sure you want to remove the download rule named '%1'? Sigurni ste da želite ukloniti pravilo preuzimanja naziva '%1'? - + Are you sure you want to remove the selected download rules? Jeste li sigurni da želite ukloniti odabrana pravila preuzimanja? - + Rule deletion confirmation Pravilo potvrđivanja brisanja - + Destination directory Odredišni direktorij - + Invalid action - + Neispravna radnja - + The list is empty, there is nothing to export. - + Popis je prazan. Nema se što izvesti. - - Export RSS rules - + + Where would you like to save the list? + Gdje želite spremiti popis? - - + + Rules list (*.rssrules) + Popis pravila (*.rssrules) + + + I/O Error - + I/O greška - - Failed to create the destination file. Reason: %1 - + + Failed to create the destination file + Nije uspjelo kreiranje odredišne datoteke - - Import RSS rules - + + Please point to the RSS download rules file + Istaknite RSS datoteku pravila preuzimanja - - Failed to open the file. Reason: %1 - + + Rules list + Popis pravila - + Import Error - + Greška prilikom uvoza - - Failed to import the selected rules file. Reason: %1 - + + Failed to import the selected rules file + Nije uspio uvoz datoteke s odabranim pravilima - + Add new rule... Dodaj novo pravilo... - + Delete rule Ukloni pravilo - + Rename rule... Preimenuj pravilo... - + Delete selected rules Ukloni odabrana pravila - - Clear downloaded episodes... - - - - + Rule renaming Preimenovanje pravila - + Please type the new rule name Upišite naziv novog pravila - - Clear downloaded episodes - - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - - - - - - Position %1: %2 - + + Regex mode: use Perl-like regular expressions + Regex način: koristi Pearl-u slične regularne izraze - + Wildcard mode: you can use - + ? to match any single character - + * to match zero or more of any characters - + Whitespaces count as AND operators (all words, any order) - + | is used as OR operator - + If word order is important use * instead of whitespace. - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - + will match all articles. - + will exclude all articles. - - - BanListOptionsDialog - - - List of banned IP addresses - - - - - Ban IP - - - - - Delete - Ukloni - - - - - Warning - - - - The entered IP address is invalid. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Wildcard način: možete koristiti<ul><li>? za podudaranje s bilo kojim pojedinim znakom</li><li>* za podudaranje s nula ili više drugih znakova</li><li>Prazna mjesta se računaju kao AND operatori</li></ul> - - The entered IP is already banned. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Wildcard način: možete koristiti<ul><li>? za podudaranje s bilo kojim pojedinim znakom</li><li>* za podudaranje s nula ili više drugih znakova</li><li>| se koristi kao OR operator</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support PeX podrška zahtjeva ponovno pokretanje - - Could not get GUID of configured network interface. Binding to IP %1 - - - - + Embedded Tracker [ON] Ugrađeni tracker [Uključeno] - + Failed to start the embedded tracker! Neuspjeh kod pokretanja ugrađenog trackera - + Embedded Tracker [OFF] Ugrađeni tracker [Isključeno] - + + '%1' reached the maximum ratio you set. Removing... + '%1' je postigao maksimalni postavljeni omjer. +Uklanjanje... + + + + '%1' reached the maximum ratio you set. Pausing... + '%1' je postigao maksimalni postavljeni omjer. +Pauziranje... + + + System network status changed to %1 e.g: System network status changed to ONLINE Sustavni mrežni status promijenjen u %1 - + ONLINE POVEZAN - + OFFLINE ODSPOJEN - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding Mrežna postavka %1 je promijenjena, osvježavanje prijave veze - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. - - + Encryption support [%1] - - + FORCED - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - - - - - + Anonymous mode [%1] - + Unable to decode '%1' torrent file. Nemoguće dekodirati '%1' torrent datoteku. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Rekurzivno preuzimanje datoteke '%1' ugrađene u torrent '%2' - + Queue positions were corrected in %1 resume files - + Couldn't save '%1.torrent' Nemoguće spremiti '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - - - - + because %1 is disabled. this peer was blocked because uTP is disabled. zato što je %1 onemogućen. - + because %1 is disabled. this peer was blocked because TCP is disabled. zato što je %1 onemogućen. - + URL seed lookup failed for URL: '%1', message: %2 URL seed traženje neuspješno za URL: '%1', poruka: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent nije uspio slušati na sučelju %1 port: %2/%3. Razlog: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' je uklonjen sa popisa prijenosa i sa tvrdog diska. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' je uklonjen sa liste prijenosa. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Preuzimanje '%1', molimo pričekajte... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent pokušava slušati na bilo kojem portu sučelja: %1 - + The network interface defined is invalid: %1 Mrežno sučelje definirano kao nevažeće: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent pokušava slušati na sučelju %1: port: %2 - - Peer ID: - - - - - HTTP User-Agent is '%1' - - - - - + DHT support [%1] - - - - - - - - - + + + + ON - - - - - - - - - + + + + OFF - - + Local Peer Discovery support [%1] - - PeX support [%1] - - - - - '%1' reached the maximum ratio you set. Removed. - - - - - '%1' reached the maximum ratio you set. Paused. - - - - - '%1' reached the maximum seeding time you set. Removed. - - - - - '%1' reached the maximum seeding time you set. Paused. - - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent nije pronašao %1 lokalnu adresu za slušanje - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent nije uspio slušati na bilo kojem portu: %1. Razlog: %2. - + Tracker '%1' was added to torrent '%2' Tracker '%1' je dodan za torrent '%2' - + Tracker '%1' was deleted from torrent '%2' Tracker '%1' je uklonjen za torrent '%2' - + URL seed '%1' was added to torrent '%2' URL seed '%1' je dodan za torrent '%2' - + URL seed '%1' was removed from torrent '%2' URL seed '%1' je uklonjen za torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Nemoguće nastaviti torrent '%1'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Uspješno analiziran osigurani IP filter: %1 pravila su primijenjena. - + Error: Failed to parse the provided IP filter. Greška: Neuspjeh analiziranja osiguranog IP filtera. - - '%1' restored. - 'torrent name' restored. - - - - + Couldn't add torrent. Reason: %1 Nemoguće dodati torrent. Razlog: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' nastavljen. (brzi nastavak) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' dodan na listu preuzimanja. - + An I/O error occurred, '%1' paused. %2 I/O greška, '%1' pauziran. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Port mapiranje neuspješno, poruka: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Port mapiranje uspješno, poruka: %1 - + due to IP filter. this peer was blocked due to ip filter. zbog IP filtera. - + due to port filter. this peer was blocked due to port filter. zbog port filtera. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. zbog i2p ograničenja miješanog načina. - + because it has a low port. this peer was blocked because it has a low port. zato što ima nizak broj porta. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent uspješno sluša na sučelju %1 porta: %2%3 - + External IP: %1 e.g. External IP: 192.168.0.1 Vanjski IP: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + Nemoguće maknuti torrent: '%1'. Razlog %2 - + File sizes mismatch for torrent '%1', pausing it. - + Neslaganje veličina datoteka za torrent '%1', pauziranje. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - + Brzi nastavak podataka je odbijen za torrent '%1'. Razlog: %2. Ponovna provjera... CategoryFilterModel - + Categories Kategorije - + All - + Sve - + Uncategorized @@ -1697,7 +1356,7 @@ Add category... - + Dodaj kategoriju... @@ -1706,34 +1365,139 @@ - Edit category... - - - - Remove category - + Ukloni kategoriju - + Remove unused categories - + Ukloni nekorištene kategorije - + Resume torrents Nastavi torrente - + Pause torrents Pauziraj torrente - + Delete torrents Ukloni torrente + + + New Category + + + + + Category: + Kategorija: + + + + Invalid category name + Neispravni naziv kategorije + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Naziv kategorije ne smije sadržavati '\'. +Naziv kategorije ne smije počinjati ili završavati sa '/'. +Naziv kategorije ne smije sadržavati '//' niz. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Sve (0) + + + Uncategorized (0) + Nekategorizirano (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Nekategorizirano (%1) + + + Add category... + Dodaj kategoriju... + + + Remove category + Ukloni kategoriju + + + Remove unused categories + Ukloni nekorištene kategorije + + + Resume torrents + Nastavi torrente + + + Pause torrents + Pauziraj torrente + + + Delete torrents + Ukloni torrente + + + New Category + Nova kategorija + + + Category: + Kategorija: + + + Invalid category name + Neispravni naziv kategorije + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Naziv kategorije ne smije sadržavati '\'. +Naziv kategorije ne smije počinjati ili završavati sa '/'. +Naziv kategorije ne smije sadržavati '//' niz. + + + All (%1) + this is for the category filter + Sve (%1) + CookiesDialog @@ -1772,616 +1536,574 @@ - DeletionConfirmationDialog - - - Deletion confirmation - - - - - Remember choice - - - - - Also delete the files on the hard disk - - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Sigurni ste da želite ukloniti '%1' za liste prijenosa? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - - - - - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - Preuzimanje - - - - No URL entered - - - - - Please type at least one URL. - + Sigurni ste da želite ukloniti ove %1 odabrane torrente s popisa prijenosa? DownloadedPiecesBar - + White: Missing pieces Bijelo: Nedostaju dijelovi - + Green: Partial pieces Zeleno: Djelomični dijelovi - + Blue: Completed pieces Plavo: Završeni dijelovi - ExecutionLogWidget + ExecutionLog - + General - Općenito + Općenito - + Blocked IPs - + Blokirani IP-ovi - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> je blokiran %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - + <font color='red'>%1</font> je zabranjen FeedListWidget - + RSS feeds RSS kanali - - - Unread (%1) - + + Unread + Nepročitano FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - + + An error occured while trying to open the log file. Logging to file is disabled. + Greška prilikom otvaranja datoteku zapisa. Bilježenje u datoteku je onemogućeno. - FileSystemPathEdit + FilterParserThread - - ... - Launch file dialog button text (brief) - + + + + I/O Error: Could not open ip filter file in read mode. + I/O greška: Nemoguće otvoriti IP filter datoteku u načinu čitanja. - - &Browse... - Launch file dialog button text (full) - + + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. + Greška analiziranja: Filter datoteka nije valjana PeerGuardian P2B datoteka. + + + GeoIPDatabase - - Choose a file - Caption for file open/save dialog - + + + Unsupported database file size. + Nepodržana veličina datoteke baze podataka. - - Choose a folder - Caption for directory open dialog - - - - - Any file - - - - - FilterParserThread - - - - - I/O Error: Could not open IP filter file in read mode. - - - - - - - IP filter line %1 is malformed. - - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - - - - - - IP filter exception thrown for line %1. Exception is: %2 - - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - - - - - - - - - - - Parsing Error: The filter file is not a valid PeerGuardian P2B file. - Greška analiziranja: Filter datoteka nije valjana PeerGuardian P2B datoteka. - - - - GeoIPDatabase - - - - Unsupported database file size. - Nepodržana veličina datoteke baze podataka. - - - + Metadata error: '%1' entry not found. Greška metapodataka: '%1' unos nije pronađen. - + Metadata error: '%1' entry has invalid type. Greška metapodataka: '%1' unos nije valjanog tipa. - + Unsupported database version: %1.%2 Nepodržana verzija baze podataka: %1.%2 - + Unsupported IP version: %1 Nepodržana IP verzija: %1 - + Unsupported record size: %1 Nepodržana veličina zapisa: %1 - + Invalid database type: %1 Nevaljan tip baze podataka: %1 - + Database corrupted: no data section found. Korumpirana baza podataka: nije pronađen podatkovni dio. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - + + File + Datoteka - - Bad Http request, closing socket. IP: %s - + + Edit + Uredi - - - HttpServer - + + Help + Pomoć + + + Exit qBittorrent Zatvorite qBittorrent - + Only one link per line Samo jedna poveznica po liniji - + + Download + Preuzmi + + + Global upload rate limit must be greater than 0 or disabled. Globalno ograničenje brzine slanja mora biti veće od 0 ili onemogućeno. - + Global download rate limit must be greater than 0 or disabled. Globalno ograničenje brzine preuzimanja mora biti veće od 0 ili onemogućeno. - + Alternative upload rate limit must be greater than 0 or disabled. Alternativno ograničenje brzine slanja mora biti veće od 0 ili onemogućeno. - + Alternative download rate limit must be greater than 0 or disabled. Alternativno ograničenje brzine preuzimanja mora biti veće od 0 ili onemogućeno. - + Maximum active downloads must be greater than -1. Maksimalan broj aktivnih preuzimanja mora biti veći od -1. - + Maximum active uploads must be greater than -1. Maksimalan broj aktivnih slanja mora biti veći od -1. - + Maximum active torrents must be greater than -1. Maksimalan broj aktivnih torrenata mora biti veći od -1. - + Maximum number of connections limit must be greater than 0 or disabled. Ograničenje najvećeg broja spajanja mora biti veći od 0 ili onemogućeno. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Ograničenje najvećeg broja spajanja po torrentu mora biti veće od 0 ili onemogućeno. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Ograničenje najvećeg broja mjesta za slanje po torrentu mora biti veći od 0 ili onemogućeno. - + Unable to save program preferences, qBittorrent is probably unreachable. Nije moguće spremiti postavke programa. qBittorrent je vjerojatno nedostupan. - - IRC: #qbittorrent on Freenode - - - - - Invalid category name: -Please do not use any special characters in the category name. - - - - - Unknown - Nije poznato - - - - Hard Disk - - - - - Share ratio limit must be between 0 and 9998. - - - - - Seeding time limit must be between 0 and 525600 minutes. - + + Language + Jezik - + The port used for incoming connections must be between 1 and 65535. Port korišten za dolazne spojeve mora biti između 1 i 65535. - + The port used for the Web UI must be between 1 and 65535. Port korišten za web sučelje mora biti između 1 i 65535. - + Unable to log in, qBittorrent is probably unreachable. Nije moguća prijava. qBittorrent je vjerojatno nedostupan. - + Invalid Username or Password. Neispravno korisničko ime ili lozinka - - Username - - - - + Password Lozinka - + Login Prijava - + + Upload Failed! + Slanje nije uspjelo! + + + Original authors Originalni autori - + + Upload limit: + Ograničenje slanja: + + + + Download limit: + Ograničenje preuzimanja: + + + Apply Primjeni - + Add Dodaj - + + Category: + Kategorija: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Prenesi torrente - + + All + Sve + + + + Downloading + Preuzimanje + + + + Seeding + Seedanje + + + + Completed + Završeno + + + + Resumed + Nastavljeno + + + + Paused + Pauzirano + + + + Active + Aktivno + + + + Inactive + Neaktivno + + + Save files to location: Spremi datoteke na lokaciju: - + Cookie: Kolačić: - + Type folder here Upišite mapu ovdje - + + Run an external program on torrent completion + Pokrenite vanjski program pri završetku torrenta + + + + Enable bandwidth management (uTP) + Omogućite upravljanje propusnosti (uTP) + + + + Apply rate limit to uTP connections + Primjenite ograničenje brzine za uTP veze + + + + Alternative Global Rate Limits + Alternativna globalna ograničenja brzine + + + More information Više informacija - + Information about certificates Informacije o certifikatima - + Save Files to Spremi datoteke u - - Set location - - - - - Limit upload rate - + + Watch Folder + Mapa za gledanje - - Limit download rate - + + Default Folder + Zadana mapa - - Rename torrent - + + from + from time1 to time2 + iz - - Unable to create category - + + to + from time1 to time2 + u - + Other... Save Files to: Watch Folder / Default Folder / Other... Drugi... - + + Every day + Schedule the use of alternative rate limits on ... + Svaki dan + + + + Week days + Schedule the use of alternative rate limits on ... + Radni dani + + + + Week ends + Schedule the use of alternative rate limits on ... + Vikend + + + Monday Schedule the use of alternative rate limits on ... Ponedjeljak - + Tuesday Schedule the use of alternative rate limits on ... Utorak - + Wednesday Schedule the use of alternative rate limits on ... Srijeda - + Thursday Schedule the use of alternative rate limits on ... Četvrtak - + Friday Schedule the use of alternative rate limits on ... Petak - + Saturday Schedule the use of alternative rate limits on ... Subota - + Sunday Schedule the use of alternative rate limits on ... Nedjelja - + + Downloaded + Is the file downloaded or not? + Preuzeto + + + Logout Odjava - + + Download from URLs + Preuzmi sa URLova + + + Download Torrents from their URLs or Magnet links Preuzmi torrente sa njegovih URLova ili Magnet linkova - + Upload local torrent Slanje lokalnog torrenta - + Are you sure you want to delete the selected torrents from the transfer list? Sigurni ste da želite ukloniti odabrane torrente sa liste prijenosa? - + Save Spremi - + qBittorrent client is not reachable qBittorrent klijent nije dostupan - - qBittorrent has been shutdown. - qBittorrent je bio ugašen. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - + + HTTP Server + HTTP poslužitelj - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - + + The following parameters are supported: + Podržani su sljedeći parametri: - - Add subnet - + + Torrent path + Putanja torrenta - - Delete - Ukloni + + Torrent name + Naziv torrenta - - Error - Greška + + qBittorrent has been shutdown. + qBittorrent je bio ugašen. + + + LineEdit - - The entered subnet is invalid. - + + Clear the text + Izbriši tekst LogListWidget - + Copy Kopiraj - + Clear Izbriši @@ -2414,550 +2136,492 @@ Ka&d preuzimanje završi - + &View Po&gled - + &Options... &Opcije... - + &Resume Nastavi - + Torrent &Creator St&varač torrenta - + Set Upload Limit... Namjesti ograničenje slanja... - + Set Download Limit... Namjesti ograničenje preuzimanja... - + Set Global Download Limit... Namjesti globalno ograničenje preuzimanja... - + Set Global Upload Limit... Namjesti globalno ograničenje slanja... - + Minimum Priority Minimalni prioritet - + Top Priority Najveći prioritet - + Decrease Priority Smanji prioritet - + Increase Priority Povećaj prioritet - - + + Alternative Speed Limits Alternativno ograničenje brzine - + &Top Toolbar Gornja alatna &traka - + Display Top Toolbar Prikaži gornju alatnu traku - - Status &Bar - - - - + S&peed in Title Bar Brzina u &naslovnoj traci - + Show Transfer Speed in Title Bar Prikaži brzinu prijenosa u naslovnoj traci - + &RSS Reader &RSS čitač - + Search &Engine Pr&etraživač - + L&ock qBittorrent Zaključaj qBitt&orrent - + Do&nate! Do&niraj! - - Close Window - - - - + R&esume All Nastavi sve - + Manage Cookies... Upravljaj kolačićima... - + Manage stored network cookies Upravljaj spremljenim mrežnim kolačićima - + Normal Messages Normalne poruke - + Information Messages Informacijske poruke - + Warning Messages Poruke upozorenja - + Critical Messages Kritične poruke - + &Log &Dnevnik - + &Exit qBittorrent Izlaz iz qBittorr&enta - + &Suspend System &Suspendiraj sustav - + &Hibernate System &Hiberniraj sustav - + S&hutdown System U&gasi sustav - + &Disabled On&emogućeno - + &Statistics &Statistika - + Check for Updates Provjeri ažuriranja - + Check for Program Updates Provjeri ažuriranje programa - + &About &O programu - + &Pause &Pauziraj - + &Delete &Ukloni - + P&ause All P&auziraj sve - + &Add Torrent File... Dod&aj torrent datoteku... - + Open Otvori - + E&xit &Izlaz - + Open URL Otvori URL - + &Documentation &Dokumentacija - + Lock Zaključaj - - - + + + Show Prikaži - + Check for program updates Provjeri ažuriranja programa - + Add Torrent &Link... Dodaj torrent &poveznicu... - + If you like qBittorrent, please donate! Ako vam se sviđa qBittorrent donirajte! - - + Execution Log Dnevnik izvršavanja - + Clear the password Izbriši lozinku - + Filter torrent list... Filtriraj popis torrenta... - + &Set Password Namje&sti lozinku - - Preferences - - - - + &Clear Password &Očisti lozinku - + Transfers Prijenosi - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Pridruživanje torrent datoteka - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent nije zadana aplikacija za otvaranje torrent datoteka ili Magnet poveznica. Želite li pridružiti qBittorrent torrent datotekama i Magnet poveznicama? - + Icons Only Samo ikone - + Text Only Samo tekst - + Text Alongside Icons Tekst uz ikone - + Text Under Icons Tekst ispod ikona - + Follow System Style Koristi stil sustava - - - + + + UI lock password Lozinka zaključavanja sučelja - - - + + + Please type the UI lock password: Upišite lozinku zaključavanja sučelja: - + The password should contain at least 3 characters Lozinka mora imati najmanje 3 znaka - + Password update Ažuriranje lozinke - + The UI lock password has been successfully updated Lozinka zaključavanja sučelja je uspješno ažurirana - + Are you sure you want to clear the password? Želite li sigurno izbrisati lozinku? - - Use regular expressions - - - - + Search Traži - + Transfers (%1) Prijenosi (%1) - + Error Greška - + Failed to add torrent: %1 Neuspjeh dodavanja torrenta: %1 - + Torrent added - + '%1' was added. e.g: xxx.avi was added. - + Download completion Preuzimanje završeno - + I/O Error i.e: Input/Output Error I/O greška - + Recursive download confirmation Potvrda rekurzivnog preuzimanja - + Yes Da - + No Ne - + Never Nikad - + Global Upload Speed Limit Globalno ograničenje brzine slanja - + Global Download Speed Limit Globalno ograničenje brzine preuzimanja - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - - - - - Are you sure you want to quit qBittorrent? - - - - + &No &Ne - + &Yes &Da - + &Always Yes Uvijek d&a - - %1/s - s is a shorthand for seconds - - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter Stari Python interpreter - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - + qBittorrent Update Available qBittorrent ažuriranje dostupno - + + A new version is available. +Do you want to download %1? + Nova verzija je dostupna. +Želite li preuzeti %1? + + + Already Using the Latest qBittorrent Version Već koristite posljednju qBittorrent verziju - + Undetermined Python version Nije utvrđena Python verzija - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. '%1' je završio preuzimanje. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2966,158 +2630,154 @@ Razlog: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? Torrent '%1' sadrži torrent datoteke, želite li i njih preuzeti? - + Couldn't download file at URL '%1', reason: %2. Nemoguće preuzeti datoteku sa URL-a '%1', razlog: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - - + + Couldn't determine your Python version (%1). Search engine disabled. + Nemoguće odrediti vašu Python verziju (%1). Pretraživači onemogućeni. + + + + Missing Python Interpreter Nedostaje Python interpreter - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Python je potreban kako bi se koristili pretraživači, ali čini se da nije instaliran. Želite li ga sada instalirati? - + Python is required to use the search engine but it does not seem to be installed. Python je potreban kako bi se koristili pretraživači, ali čini se da nije instaliran. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. Nema dostupnih ažuriranja. Već koristite posljednju verziju. - + &Check for Updates &Provjeri ažuriranja - + Checking for Updates... Provjeravanje ažuriranja... - + Already checking for program updates in the background Već se provjeravaju softverska ažuriranja u pozadini - + Python found in '%1' Python pronađen na '%1' - + Download error Greška pri preuzimanju - + Python setup could not be downloaded, reason: %1. Please install it manually. Python setup nije moguće preuzeti. Razlog: %1. Instalirajte ručno. - - + + Invalid password Neispravna lozinka - - - + + RSS (%1) RSS (%1) - + URL download error Greška URL preuzimanja - + The password is invalid Lozinka nije ispravna - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Brzina preuzimanja: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Brzina slanja: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [P: %1, S: %2] qBittorrent %3 - + Hide Sakrij - + Exiting qBittorrent Izlaz iz qBittorrenta - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Neke datoteke još se prenose. +Jeste li sigurni da želite zatvoriti qBittorrent? + + + Open Torrent Files Otvori torrent datoteke - + Torrent Files Torrent datoteke - + Options were saved successfully. Opcije su uspješno spremljene. @@ -3125,52 +2785,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. Vaš dinamični DNS je uspješno ažuriran. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Greška dinamičnog DNS-a: Servis je privremeno nedostupan, ponovni pokušaj za 30 minuta. - + Dynamic DNS error: hostname supplied does not exist under specified account. Greška dinamičnog DNS-a: isporučeni naziv računala ne postoji pod specifičnim računom. - + Dynamic DNS error: Invalid username/password. Greška dinamičnog DNS-a: Neispravno korisničko ime ili lozinka. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Greška dinamičnog DNS-a: qBittorrent je na crnoj listi servisa, molimo prijavite bug na http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Greška dinamičnog DNS-a: %1 je vraćeno od servisa, molimo prijavite bug na http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Greška dinamičnog DNS-a: Vaše korisničko ime je blokirano zbog zlouporabe servisa. - + Dynamic DNS error: supplied domain name is invalid. Greška dinamičnog DNS-a: isporučeni naziv računala je neispravan. - + Dynamic DNS error: supplied username is too short. Greška dinamičnog DNS-a: isporučeno korisničko ime je prekratko. - + Dynamic DNS error: supplied password is too short. Greška dinamičnog DNS-a: isporučena lozinka je prekratka. @@ -3178,1413 +2838,1303 @@ Net::DownloadHandler - + I/O Error Greška I/O - + The file size is %1. It exceeds the download limit of %2. Veličina datoteke je %1. Prekoračeno je ograničenje preuzimanja od %2. - + Unexpected redirect to magnet URI. Neočekivano preusmjeravanje za magnet URI. - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. GeoIP baza podataka učitana. Tip: %1. Vrijeme pravljenja: %2. - - + + Couldn't load GeoIP database. Reason: %1 Nemoguće učitati GeoIP bazu podataka. Razlog: %1 - + Venezuela, Bolivarian Republic of Venezuela, Bolivarijanska Republika - + Viet Nam Vijetnam - - + + N/A Nepoznato - + Andorra Andora - + United Arab Emirates Ujedinjeni Arapski Emirati - + Afghanistan Afganistan - + Antigua and Barbuda Antigva i Barbuda - + Anguilla Angvila - + Albania Albanija - + Armenia Armenija - + Angola Angola - + Antarctica Antartika - + Argentina Argentina - + American Samoa Američka Samoa - + Austria Austrija - + Australia Australija - + Aruba Aruba - + Azerbaijan Azerbajdžan - + Bosnia and Herzegovina Bosna i Hercegovina - + Barbados Barbados - + Bangladesh Bangladeš - + Belgium Belgija - + Burkina Faso Burkina Faso - + Bulgaria Bugarska - + Bahrain Bahrein - + Burundi Burundi - + Benin Benin - + Bermuda Bermuda - + Brunei Darussalam Brunei - + Brazil Brazil - + Bahamas Bahami - + Bhutan Butan - + Bouvet Island Otok Bouvet - + Botswana Bocvana - + Belarus Bjelorusija - + Belize Belize - + Canada Kanada - + Cocos (Keeling) Islands Kokosov otok - + Congo, The Democratic Republic of the Kongo, Demokratska Republika - + Central African Republic Centralna Afrička Republika - + Congo Kongo - + Switzerland Švicarska - + Cook Islands Cookovo Otočje - + Chile Čile - + Cameroon Kamerun - + China Kina - + Colombia Kolumbija - + Costa Rica Kostarika - + Cuba Kuba - + Cape Verde Zelenortska Republika - + Curacao Curacao - + Christmas Island Božićni Otok - + Cyprus Cipar - + Czech Republic Češka republika - + Germany Njemačka - + Djibouti Džibuti - + Denmark Danska - + Dominica Dominika - + Dominican Republic Dominikanska republika - + Algeria Alžir - + Ecuador Ekvador - + Estonia Estonija - + Egypt Egipat - + Western Sahara Zapadna Sahara - + Eritrea Eritreja - + Spain Španjolska - + Ethiopia Etiopija - + Finland Finska - + Fiji Fidži - + Falkland Islands (Malvinas) Falklandski otoci - + Micronesia, Federated States of Mikronezija, Federalne Države - + Faroe Islands Farski otoci - + France Francuska - + Gabon Gabon - + United Kingdom Ujedinjeno Kraljevstvo - + Grenada Grenada - + Georgia Gruzija - + French Guiana Francuska Gvajana - + Ghana Gana - + Gibraltar Gibraltar - + Greenland Grenland - + Gambia Gambia - + Guinea Gvineja - + Guadeloupe Gvadalupa - + Equatorial Guinea Ekvatorska Gvineja - + Greece Grčka - + South Georgia and the South Sandwich Islands Južna Georgija i otočje Južni Sandwich - + Guatemala Gvatemala - + Guam Guam - + Guinea-Bissau Gvineja Bisau - + Guyana Gvajana - + Hong Kong Hong Kong - + Heard Island and McDonald Islands Otok Heard i otočje McDonald - + Honduras Honduras - + Croatia Hrvatska - + Haiti Haiti - + Hungary Mađarska - + Indonesia Indonezija - + Ireland Irska - + Israel Izrael - + India Indija - + British Indian Ocean Territory Britanski Indijskooceanski teritorij - + Iraq Irak - + Iran, Islamic Republic of Iran, Islamska Republika - + Iceland Island - + Italy Italija - + Jamaica Jamajka - + Jordan Jordan - + Japan Japan - + Kenya Kenija - + Kyrgyzstan Kirgistan - + Cambodia Kambodža - + Kiribati Kiribati - + Comoros Komori - + Saint Kitts and Nevis Sveti Kristofor i Nevis - + Korea, Democratic People's Republic of Koreja, Demokratska Narodna Republika - + Korea, Republic of Koreja, Republika - + Kuwait Kuvajt - + Cayman Islands Kajmanski otoci - + Kazakhstan Kazahstan - + Lao People's Democratic Republic Laoska Narodna Demokratska Republika - + Lebanon Libanon - + Saint Lucia Sveta Lucija - + Liechtenstein Lihtenštajn - + Sri Lanka Šri Lanka - + Liberia Liberija - + Lesotho Lesoto - + Lithuania Litva - + Luxembourg Luksemburg - + Latvia Latvija - + Morocco Maroko - + Monaco Monako - + Moldova, Republic of Moldavija, Republika - + Madagascar Madagaskar - + Marshall Islands Maršalovi Otoci - + Mali Mali - + Myanmar Mjanmar - + Mongolia Mongolija - + Northern Mariana Islands Sjevernomarijanski otoci - + Martinique Martinik - + Mauritania Mauritanija - + Montserrat Montserrat - + Malta Malta - + Mauritius Mauricijus - + Maldives Maldivi - + Malawi Malavi - + Mexico Meksiko - + Malaysia Malezija - + Mozambique Mozambik - + Namibia Namibija - + New Caledonia Nova Kaledonija - + Niger Niger - + Norfolk Island Otok Norfolk - + Nigeria Nigerija - + Nicaragua Nikaragva - + Netherlands Nizozemska - + Norway Norveška - + Nepal Nepal - + Nauru Nauru - + Niue Niue - + New Zealand Novi Zeland - + Oman Oman - + Panama Panama - + Peru Peru - + French Polynesia Francuska Polinezija - + Papua New Guinea Papua Nova Gvineja - + Philippines Filipini - + Pakistan Pakistan - + Poland Poljska - + Saint Pierre and Miquelon Sveti Petar i Mikelon - + Puerto Rico Portoriko - + Portugal Portugal - + Palau Palau - + Paraguay Paragvaj - + Qatar Katar - + Reunion Reunion - + Romania Rumunjska - + Russian Federation Ruska Federacija - + Rwanda Ruanda - + Saudi Arabia Saudijska Arabija - + Solomon Islands Salomonski Otoci - + Seychelles Sejšeli - + Sudan Sudan - + Sweden Švedska - + Singapore Singapur - + Slovenia Slovenija - + Svalbard and Jan Mayen Svalbard i Jan Mayen - + Slovakia Slovačka - + Sierra Leone Sijera Leone - + San Marino San Marino - + Senegal Senegal - + Somalia Somalija - + Suriname Surinam - + Sao Tome and Principe Sveti Toma i Princip - + El Salvador Salvador - + Syrian Arab Republic Sirijska Arapska Republika - + Swaziland Svazi - + Turks and Caicos Islands Otoci Turks i Caicos - + Chad Čad - + French Southern Territories Francuski Južni Teritoriji - + Togo Togo - + Thailand Tajland - + Tajikistan Tadžikistan - + Tokelau Tokelau - + Turkmenistan Turkmenistan - + Tunisia Tunis - + Tonga Tonga - - Could not decompress GeoIP database file. - - - - + Timor-Leste Istočni Timor - + Bolivia, Plurinational State of Bolivija, Višenacionalna Država - + Bonaire, Sint Eustatius and Saba Bonaire, Sint Eustatius i Saba - + Cote d'Ivoire Obala Bjelokosti - + Libya Libija - + Saint Martin (French part) Sveti Martin (Francuski dio) - + Macedonia, The Former Yugoslav Republic of Makedonija, Bivša Jugoslavenska Republika - + Macao Makao - + Pitcairn Pitcairnovo Otočje - + Palestine, State of Palestina, Država - + Saint Helena, Ascension and Tristan da Cunha Sveta Helena, Ascension i Tristan da Cunha - + South Sudan Južni Sudan - + Sint Maarten (Dutch part) Sveti Martin (Nizozemski dio) - + Turkey Turska - + Trinidad and Tobago Trinidad i Tobago - + Tuvalu Tuvalu - + Taiwan Tajvan - + Tanzania, United Republic of Tanzanija, Ujedinjena Republika - + Ukraine Ukrajina - + Uganda Uganda - + United States Minor Outlying Islands Mali udaljeni otoci SAD-a - + United States Ujedinjene Države - + Uruguay Urugvaj - + Uzbekistan Uzbekistan - + Holy See (Vatican City State) Sveta Stolica (Vatikanski Grad) - + Saint Vincent and the Grenadines Sveti Vincent i Grenadini - + Virgin Islands, British Djevičanski otoci, Britanski - + Virgin Islands, U.S. Djevičanski otoci, Američki - + Vanuatu Vanuatu - + Wallis and Futuna Wallis i Futuna - + Samoa Samoa - + Yemen Jemen - + Mayotte Mayotte - + Serbia Srbija - + South Africa Južna Afrika, Republika - + Zambia Zambija - + Montenegro Crna Gora - + Zimbabwe Zimbabve - + Aland Islands Alandski otoci - + Guernsey Guernsey - + Isle of Man Otok Man - + Jersey Jersey - + Saint Barthelemy Sveti Bartolomej - + + Could not uncompress GeoIP database file. + Nemoguće otpakirati datoteku GeoIP baze podataka. + + + Couldn't save downloaded GeoIP database file. Nemoguće spremiti preuzetu datoteku GeoIP baze podataka. - + Successfully updated GeoIP database. Uspješno ažurirana GeoIP baza podataka. - + Couldn't download GeoIP database file. Reason: %1 Nemoguće preuzeti datoteku GeoIP baze podataka. Razlog: %1 @@ -4592,12 +4142,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] UPnP / NAT-PMP podrška [Uključeno] - + UPnP / NAT-PMP support [OFF] UPnP / NAT-PMP podrška [Isključeno] @@ -4605,7 +4155,7 @@ Net::Smtp - + Email Notification Error: Greška obavijesti e-pošte: @@ -4613,1273 +4163,1077 @@ OptionsDialog - + Options - + Behavior - + Downloads Preuzimanja - + Connection Spajanje - + Speed Brzina - + BitTorrent - - RSS - - - - + Web UI - + Advanced - + Language - + Jezik - + User Interface Language: - + (Requires restart) - + Transfer List - + Confirm when deleting torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. - + Hide zero and infinity values - + Always Uvijek - + Paused torrents only - + Action on double-click - + Downloading torrents: - - + + Start / Stop Torrent - - + + Open destination folder Otvori odredišnu mapu - - + + No action - + Completed torrents: - + Desktop - + Start qBittorrent on Windows start up - + Show splash screen on start up - + Start qBittorrent minimized - + Confirmation on exit when torrents are active - + Confirmation on auto-exit when downloads finish - - KiB + + Show qBittorrent in notification area - - Email notification &upon download completion + + Minimize qBittorrent to notification area - - Run e&xternal program on torrent completion + + Close qBittorrent to notification area + i.e: The systray tray icon will still be visible when closing the main window. - - IP Fi&ltering + + Tray icon style: - - Schedule &the use of alternative rate limits - + + Normal + Uobičajen - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + + Monochrome (Dark theme) - - &Torrent Queueing + + Monochrome (Light theme) - - Seed torrents until their seeding time reaches + + File association - - A&utomatically add these trackers to new downloads: + + Use qBittorrent for .torrent files - - RSS Reader + + Use qBittorrent for magnet links - - Enable fetching RSS feeds + + Power Management - - Feeds refresh interval: + + Inhibit system sleep when torrents are active - - Maximum number of articles per feed: + + Log file - - - min - minutes + + Save path: - - RSS Torrent Auto Downloader + + Backup the log file after: - - Enable auto downloading of RSS torrents + + MB - - Edit auto downloading rules... + + Delete backup logs older than: - - Web User Interface (Remote control) + + days + Delete backup logs older than 10 months - - IP address: + + months + Delete backup logs older than 10 months - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. + + years + Delete backup logs older than 10 years - - Server domains: + + When adding a torrent - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. + + Display torrent content and some options - - &Use HTTPS instead of HTTP + + Bring torrent dialog to the front - - Bypass authentication for clients on localhost + + Do not start the download automatically + The torrent will be added to download list in pause state - - Bypass authentication for clients in whitelisted IP subnets + + Should the .torrent file be deleted after adding it - - IP subnet whitelist... + + Delete .torrent files afterwards - - Upda&te my dynamic domain name + + Also delete .torrent files whose addition was cancelled - - Minimize qBittorrent to notification area + + Also when addition is cancelled - - Close qBittorrent to notification area - i.e: The systray tray icon will still be visible when closing the main window. + + Warning! Data loss possible! - - Tray icon style: + + Saving Management - - Normal - Uobičajen + + Default Torrent Management Mode: + - - Monochrome (Dark theme) + + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - - Monochrome (Light theme) + + Manual - - File association + + Automatic - - Use qBittorrent for .torrent files + + When Torrent Category changed: - - Use qBittorrent for magnet links + + Relocate torrent - - Power Management + + Switch torrent to Manual Mode - - Save path: + + When Default Save Path changed: - - Backup the log file after: + + + Relocate affected torrents - - Delete backup logs older than: + + + Switch affected torrents to Manual Mode - - days - Delete backup logs older than 10 months + + When Category changed: - - months - Delete backup logs older than 10 months + + Use Subcategories - - years - Delete backup logs older than 10 years + + Default Save Path: - - When adding a torrent + + Keep incomplete torrents in: - - Bring torrent dialog to the front + + Copy .torrent files to: - - Do not start the download automatically - The torrent will be added to download list in pause state - - - - - Should the .torrent file be deleted after adding it - - - - - Also delete .torrent files whose addition was cancelled - - - - - Also when addition is cancelled - - - - - Warning! Data loss possible! - - - - - Saving Management - - - - - Default Torrent Management Mode: - - - - - Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - - - - - Manual - Ručno - - - - Automatic - Automatski - - - - When Torrent Category changed: - - - - - Relocate torrent - - - - - Switch torrent to Manual Mode - - - - - When Default Save Path changed: - - - - - - Relocate affected torrents - - - - - - Switch affected torrents to Manual Mode - - - - - When Category changed: - - - - - Use Subcategories - - - - - Default Save Path: - - - - - Keep incomplete torrents in: - - - - - Copy .torrent files to: - - - - - Show &qBittorrent in notification area - - - - - &Log file - - - - - Display &torrent content and some options - - - - - Create subfolder for torrents with multiple files - - - - - De&lete .torrent files afterwards - - - - + Copy .torrent files for finished downloads to: - + Pre-allocate disk space for all files - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding + + Append .!qB extension to incomplete files - - Append .!qB extension to incomplete files + + Automatically add torrents from: - - Enable recursive download dialog + + Add entry - - Automatically add torrents from: + + Remove entry - - Add entry + + Email notification upon download completion - - Remove entry + + Destination email: - + SMTP server: - + This server requires a secure connection (SSL) - - + + + Authentication - - - - + + + + Username: - + Korisničko ime: - - - - + + + + Password: - - - - - Enabled protocol: - + Lozinka: - - TCP and μTP + + Run external program on torrent completion - + Listening Port - + Port used for incoming connections: - + Random - + Use UPnP / NAT-PMP port forwarding from my router - + Use different port on each startup - + Connections Limits - + Maximum number of connections per torrent: - + Global maximum number of connections: - + Maximum number of upload slots per torrent: - + Global maximum number of upload slots: - + Proxy Server - + Type: - + (None) - + SOCKS4 - + SOCKS5 - + HTTP - + Host: - - + + Port: - + Otherwise, the proxy server is only used for tracker connections - + Use proxy for peer connections - + Disable connections not supported by proxies - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - + Use proxy only for torrents - - A&uthentication + + Info: The password is saved unencrypted - - Info: The password is saved unencrypted + + IP Filtering - + Filter path (.dat, .p2p, .p2b): - + Reload the filter - - Manually banned IP addresses... - - - - + Apply to trackers - + Global Rate Limits - - - - - - - KiB/s + + + Upload: - - - Upload: - + + + + + KiB/s + KiB/s - - + + Download: - + Alternative Rate Limits - - + + Schedule the use of alternative rate limits + + + + From: from (time1 to time2) - - + To: time1 to time2 - + When: - + Every day - + Svaki dan - + Weekdays - + Weekends - + Rate Limits Settings - + Apply rate limit to peers on LAN - + Apply rate limit to transport overhead - - + + + Enable µTP protocol + + + + Apply rate limit to µTP protocol - + Privacy - + Enable DHT (decentralized network) to find more peers - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers - + Look for peers on your local network - + Enable Local Peer Discovery to find more peers - + Encryption mode: - + Prefer encryption - + Require encryption - + Disable encryption - + Enable when using a proxy or a VPN connection - + Enable anonymous mode - - Maximum active downloads: - - - - - Maximum active uploads: - - - - - Maximum active torrents: + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - Do not count slow torrents in these limits + + Torrent Queueing - - Upload rate threshold: + + Maximum active downloads: - - Download rate threshold: + + Maximum active uploads: - - sec - seconds + + Maximum active torrents: - - Torrent inactivity timer: + + Do not count slow torrents in these limits - + Share Ratio Limiting - + Seed torrents until their ratio reaches - + then - + Pause them - + Remove them - - RSS Smart Episode Filters + + Automatically add these trackers to new downloads: - - Use UPnP / NAT-PMP to forward the port from my router + + Enable Web User Interface (Remote control) - - Certificate: + + Use UPnP / NAT-PMP to forward the port from my router - - Import SSL Certificate + + Use HTTPS instead of HTTP - - Key: + + Certificate: - - Import SSL Key + + Import SSL Certificate - - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> + + Key: - - Use alternative Web UI + + Import SSL Key - - Files location: + + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - - Enable clickjacking protection + + Bypass authentication for localhost - - Enable Cross-Site Request Forgery (CSRF) protection + + Update my dynamic domain name - + Service: - + Register - + Domain name: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): - + %N: Torrent name - + %L: Category - - %G: Tags (seperated by comma) - - - - + %F: Content path (same as root path for multifile torrent) - + %R: Root path (first torrent subdirectory path) - + %D: Save path - + %C: Number of files - + %Z: Torrent size (bytes) - + %T: Current tracker - + %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor - + Folder is already being monitored: - + Folder does not exist: - + Folder is not readable: - + Adding entry failed - - - - + + Choose export directory - - - + + + + + + Choose a save directory - + Choose an IP filter file - + All supported filters - + SSL Certificate - + + SSL Key + + + + Parsing error - + Failed to parse the provided IP filter - + Successfully refreshed - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Uspješno analiziran osigurani IP filter: %1 pravila su primijenjena. - + Invalid key - + This is not a valid SSL key. - + Invalid certificate - - Preferences - - - - - Import SSL certificate - - - - + This is not a valid SSL certificate. - - Import SSL key - - - - - SSL key - - - - + Time Error - + The start time and the end time can't be the same. - - + + Length Error - + The Web UI username must be at least 3 characters long. - + The Web UI password must be at least 6 characters long. @@ -5887,72 +5241,72 @@ PeerInfo - - Interested(local) and Choked(peer) - + + interested(local) and choked(peer) + zainteresiran(lokalni) i zagušen(peer) - + interested(local) and unchoked(peer) zainteresiran(lokalni) i nezagušen(peer) - + interested(peer) and choked(local) zainteresiran(peer) i zagušen(lokalni) - + interested(peer) and unchoked(local) zainteresiran(peer) i nezagušen(lokalni) - + optimistic unchoke optimistično nezagušenje - + peer snubbed peer odbijen - + incoming connection dolazeći spoj - + not interested(local) and unchoked(peer) nezainteresiran(lokalni) i nezagušen(peer) - + not interested(peer) and unchoked(local) nezainteresiran(peer) i nezagušen(lokalni) - + peer from PEX peer iz PEX-a - + peer from DHT peer iz DHT-a - + encrypted traffic šifrirani promet - + encrypted handshake šifrirano rukovanje - + peer from LSD peer iz LSD-a @@ -5960,193 +5314,178 @@ PeerListWidget - + IP IP - + Port Port - + Flags Zastave - + Connection Spajanje - + Client i.e.: Client application Klijent - + Progress i.e: % downloaded Napredak - + Down Speed i.e: Download speed Brzina preuzimanja - + Up Speed i.e: Upload speed Brzina slanja - + Downloaded i.e: total data downloaded Preuzeto - + Uploaded i.e: total data uploaded Poslano - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Relevantnost - + Files i.e. files that are being downloaded right now Datoteke - + Column visibility Vidljivost stupaca - + Add a new peer... Dodaj novi peer... - - + + Ban peer permanently Trajno isključi peer - + Manually adding peer '%1'... Ručno dodavanje peera '%1'... - + The peer '%1' could not be added to this torrent. Peer '%1' nije moguće dodati za ovaj torrent. - + Manually banning peer '%1'... Ručna zabrana peera '%1'... - - + + Peer addition Dodavanje peerova - + Country Zemlja - + Copy IP:port - + Some peers could not be added. Check the Log for details. Neki peerovi nisu dodani. Pogledajte Dnevnik za detalje. - + The peers were added to this torrent. Peerovi su dodani ovom torrentu. - + Are you sure you want to ban permanently the selected peers? Jeste li sigurni da želite trajno isključiti odabrane peerove? - + &Yes &Da - + &No &Ne - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - + PeersAdditionDlg - + No peer entered - + Nije unešen peer - + Please type at least one peer. - + Molim napišite barem jedan peer. - + Invalid peer - + Nevaljan peer - + The peer '%1' is invalid. - + Peer '%1' je nevaljan PieceAvailabilityBar - + White: Unavailable pieces Bijelo: Nedostupni dijelovi - + Blue: Available pieces Plavo: Dostupni dijelovi @@ -6154,336 +5493,293 @@ PiecesBar - + Files in this piece: - + File in this piece - + File in these pieces - - Wait until metadata become available to see detailed information - - - - + Hold Shift key for detailed information - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Dodaci za traženje - + Installed search plugins: - + Instalirani dodaci za pretraživanje: - + Name - Naziv + Naziv - + Version - + Verzija - + Url - + Url - - + + Enabled - - - - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - + Omogućeno - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Možete nabaviti nove dodatke za pretraživanje ovdje: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Instalirajte novi - + Check for updates - + Provjerite ažuriranja - + Close - + Zatvori - + Uninstall - + Uklonite - - - + + + Yes - Da + Da - - - - + + + + No - Ne + Ne - + Uninstall warning - + Upozorenje uklanjanja - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Neki dodaci nisu uklonjeni zato što su uključeni u qBittorrent. Možete ukloniti samo one koje ste sami dodali. +Ti dodaci su onemogućeni. - + Uninstall success - + Uspješno uklonjeno - + All selected plugins were uninstalled successfully - + Svi odabrani dodaci su uklonjeni uspješno - - - - - Search plugin update - + + + New search engine plugin URL + Novi URL dodatka za pretraživanje - - Plugins installed or updated: %1 - + + + URL: + URL: - - - New search engine plugin URL - - - - - - URL: - - - - + Invalid link - + Nevaljana poveznica - + The link doesn't seem to point to a search engine plugin. - + Čini se da poveznica ne povezuje sa dodatkom za pretraživanje. - + Select search plugins - + Odaberite dodatke za pretraživanje - + qBittorrent search plugin - + qBittorrent dodatak za pretraživanje + + + + + + Search plugin update + Ažuriranje dodataka za pretraživanje - + All your plugins are already up to date. - + Svi vaši dodaci su već ažurirani. - + Sorry, couldn't check for plugin updates. %1 - + Oprostite, nemoguće provjeriti ažuriranje dodataka. %1 - + + + Search plugin install - + Instalacija dodataka za pretraživanje - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + "%1" dodatak za pretraživanje je uspješno instaliran. + + + Couldn't install "%1" search engine plugin. %2 - + Nemoguće instalirati "%1" dodatak za pretraživanje. %2 + + + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + "%1" dodatak za pretraživanje je uspješno ažuriran. - + Couldn't update "%1" search engine plugin. %2 - + Nemoguće ažurirati "%1" dodatak za pretraživanje. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Izvor dodatka - + Search plugin source: - + Pretražite izvor dodatka: - + Local file - + Lokalna datoteka - + Web link - - - - - PowerManagement - - - qBittorrent is active - + Mrežna poveznica - PreviewSelectDialog - - - Preview - - + PreviewSelect - + Name - Naziv + Naziv - + Size - Veličina + Veličina - + Progress - Napredak + Napredak - - + + Preview impossible - + Pregled nije moguć - - + + Sorry, we can't preview this file - - - - - Private::FileLineEdit - - - '%1' does not exist - - - - - '%1' does not point to a directory - - - - - '%1' does not point to a file - - - - - Does not have read permission in '%1' - - - - - Does not have write permission in '%1' - + Oprostite, nije moguće pregledati datoteku PropListDelegate - + Not downloaded Nije preuzeto - - + + Normal Normal (priority) Uobičajen - - N/A - Nepoznato - - - + Do not download Do not download (priority) Ne preuzimaj - - + + High High (priority) Visok - + N/A + N/A + + + Mixed Mixed (priorities Miješani - - + + Maximum Maximum (priority) Najviši @@ -6492,32 +5788,32 @@ PropTabBar - + General Općenito - + Trackers Trackeri - + Peers Peerovi - + HTTP Sources HTTP izvori - + Content Sadržaj - + Speed Brzina @@ -6611,22 +5907,22 @@ Komentar: - + Select All Odaberi sve - + Select None Ne odaberi ništa - + Normal Uobičajen - + High Visok @@ -6686,165 +5982,165 @@ Putanja spremanja: - + Maximum Najviši + - Do not download Ne preuzimaj - + Never Nikada - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (ima %3) - - + + %1 (%2 this session) %1 (%2 ove sesije) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (seedano za %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 max) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 ukupno) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 prosj.) - + Open Otvori - + Open Containing Folder Otvori mapu u kojoj se nalazi - + Rename... Preimenuj... - + Priority Prioritet - + New Web seed Novi web seed - + Remove Web seed Ukloni web seed - + Copy Web seed URL Kopiraj URL web seeda - + Edit Web seed URL Uredi URL web seeda - + + Rename the file + Preimenuj ovu datoteku + + + New name: Novi naziv: - - + + + The file could not be renamed + Datoteka se ne može preimenovati + + + + This file name contains forbidden characters, please choose a different one. + Ovaj naziv datoteke sadrži zabranjene znakove. Izaberite drugi. + + + + This name is already in use in this folder. Please use a different name. Ovaj naziv već se koristi u toj mapi. Koristite drugi. - + The folder could not be renamed Mapa se ne može preimenovati - + qBittorrent qBittorrent - + Filter files... Filtriraj datoteke... - - Renaming - Preimenovanje - - - - - Rename error - Greška preimenovanja - - - - The name is empty or contains forbidden characters, please choose a different one. - - - - + New URL seed New HTTP source Novi seed URL - + New URL seed: Novi seed URL: - - + + This URL seed is already in the list. Ovaj URL seed je već u listi. - + Web seed editing Uređivanje web seeda - + Web seed URL: URL web seeda: @@ -6852,585 +6148,551 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + Vaša IP adresa je zabranjena nakon previše neuspješnih pokušaja autentifikacije. + + + + Error: '%1' is not a valid torrent file. + + Greška: '%1' nije valjana torrent datoteka. + + + + + Error: Could not add torrent to session. + Greška: Nemoguće dodati torrent u sesiju. + + + + I/O Error: Could not create temporary file. + I/O Greška: Nemoguće napraviti privremenu datoteku. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 je nepoznat parametar naredbenog retka. - - + + %1 must be the single command line parameter. %1 mora biti jedinstven parametar naredbenog retka. - + + %1 must specify the correct port (1 to 65535). + %1 mora navesti ispravan port (1 do 65535). + + + You cannot use %1: qBittorrent is already running for this user. Nemoguće koristiti %1: qBittorrent je već pokrenut za ovog korisnika. - + Usage: Upotreba: - + Options: Postavke: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - + + Displays program version + Prikazuje verziju programa - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - + + Displays this help message + Prikazuje ovu poruku pomoći - - Expected integer number in environment variable '%1', but got '%2' - + + Changes the Web UI port (current: %1) + Mijenja port web sučelja (trenutno: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - + + Disable splash screen + Onemogući najavni ekran - - Expected %1 in environment variable '%2', but got '%3' - + + Run in daemon-mode (background) + Pokreni u pozadinskom načinu - - port - + + Downloads the torrents passed by the user + Preuzima torrente koje je korisnik dodao - - %1 must specify a valid port (1 to 65535). - + + Help + Pomoć - - Display program version and exit - + + Run application with -h option to read about command line parameters. + Pokreni aplikaciju sa -h argumentom kako bi pročitali o parametrima naredbenog retka. - - Display this help message and exit - + + Bad command line + Loš naredbeni redak - - Change the Web UI port - + + Bad command line: + Loš naredbeni redak: - - Disable splash screen - Onemogući najavni ekran + + Legal Notice + Pravna obavijest - - Run in daemon-mode (background) - Pokreni u pozadinskom načinu + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + qBittorrent je program za dijeljenje datoteka. Kada koristite torrent, njegovi podaci će biti dostupni drugima zbog slanja. Sav sadržaj koji dijelite je na vašu osobnu odgovornost. + +Više neće biti obavijesti o ovome. - - dir - Use appropriate short form or abbreviation of "directory" - + + Press %1 key to accept and continue... + Pritisnite %1 tipku da prihvatite i nastavite... - - Store configuration files in <dir> - + + Legal notice + Pravna obavijest - - - name - + + Cancel + Odustani - - Store configuration files in directories qBittorrent_<name> - + + I Agree + Slažem se - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - + + Torrent name: %1 + Naziv torrenta: %1 - - files or URLs - + + Torrent size: %1 + Veličina torrenta: %1 - - Download the torrents passed by the user - + + Save path: %1 + Putanja spremanja: %1 - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Torrent je preuzet u %1. - - Options when adding new torrents: - + + Thank you for using qBittorrent. + Hvala Vam što koristite qBittorrent. - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - + + [qBittorrent] '%1' has finished downloading + [qBittorrent] '%1' je završio s preuzimanjem - - path - + + The remote host name was not found (invalid hostname) + Udaljeni naziv računala nije pronađen (nevaljani naziv računala) - - Torrent save path - + + The operation was canceled + Operacija je prekinuta - - Add torrents as started or paused - + + The remote server closed the connection prematurely, before the entire reply was received and processed + Udaljeni poslužitelj je zatvorio vezu prerano, prije nego je cijeli odgovor primljen i obrađen - - Skip hash check - Preskoči hash provjeru + + The connection to the remote server timed out + Veza sa udaljenim poslužiteljom je istekla - - Assign torrents to category. If the category doesn't exist, it will be created. - + + SSL/TLS handshake failed + SSL/TLS rukovanje nije uspjelo - - Download files in sequential order - + + The remote server refused the connection + Udaljeni poslužitelj je odbio vezu - - Download first and last pieces first - Preuzmi prve i zadnje dijelove prije drugih. + + The connection to the proxy server was refused + Veza za proxy poslužiteljom je odbijena - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - + + The proxy server closed the connection prematurely + Proxy poslužitelj je zatvorio vezu prerano - - Command line parameters take precedence over environment variables - + + The proxy host name was not found + Proxy naziv računala nije pronađen - - Help - Pomoć + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Veza sa proxyjem je istekla ili proxy nije odgovorio na vrijeme za poslani zahjev - - Run application with -h option to read about command line parameters. - Pokreni aplikaciju sa -h argumentom kako bi pročitali o parametrima naredbenog retka. + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Proxy zahtjeva autentifikaciju kako bi se ispoštovao zahtjev ali nije prihvatio ponuđene vjerodajnice. - - Bad command line - Loš naredbeni redak + + The access to the remote content was denied (401) + Pristup udaljenom sadržaju je odbijen (401) - - Bad command line: - Loš naredbeni redak: + + The operation requested on the remote content is not permitted + Operacija tražena na udaljenom sadržaju nije dopuštena - - Legal Notice - Pravna obavijest + + The remote content was not found at the server (404) + Udaljeni sadržaj nije pronađen na poslužitelju (404) - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Udaljeni poslužitelj zahtjeva autentifikaciju kako bi poslužio sadržaj ali dane vjerodajnice nisu prihvaćene - - No further notices will be issued. - + + The Network Access API cannot honor the request because the protocol is not known + Mrežni API pristup ne može ispoštovati zahtjev zato što je protokol nepoznat - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - qBittorrent je program za dijeljenje datoteka. Kada koristite torrent, njegovi podaci će biti dostupni drugima zbog slanja. Sav sadržaj koji dijelite je na vašu osobnu odgovornost. - -Više neće biti obavijesti o ovome. + + The requested operation is invalid for this protocol + Zahtjevana operacija ne odgovara za ovaj protokol - - Press %1 key to accept and continue... - Pritisnite %1 tipku da prihvatite i nastavite... + + An unknown network-related error was detected + Nepoznata mrežna greška se dogodila - - Legal notice - Pravna obavijest + + An unknown proxy-related error was detected + Nepoznata proxy greška se dogodila - - Cancel - Odustani + + An unknown error related to the remote content was detected + Nepoznata greška u vezi sa udaljenim sadržajem se dogodila - - I Agree - Slažem se + + A breakdown in protocol was detected + Slom protokola se dogodio - - + + Unknown error + Nepoznata greška + + + + Upgrade Nadogradnja - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] Ažurirali ste sa starije verzije koja je spremala stvari drukčije. Morate migrirati u novi sustav spremanja. Nećete biti u mogućnosti koristiti stariju verziju od v3.3.0 opet. Nastavite? [d/n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. Ažurirali ste sa starije verzije koja je spremala stvari drukčije. Morate migrirati u novi sustav spremanja. Nećete biti u mogućnosti koristiti stariju verziju od v3.3.0 opet. - + Couldn't migrate torrent with hash: %1 Nemoguće migrirati torrent sa hash-om: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 Nemoguće migrirati torrent. Nevaljani naziv datoteke brzog nastavka: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 + + Detected unclean program exit. Using fallback file to restore settings. - + An access error occurred while trying to write the configuration file. - + A format error occurred while trying to write the configuration file. - - - An unknown error occurred while trying to write the configuration file. - - - RSS::AutoDownloader + RSS - - - Invalid data format. - + + Search + Traži - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - + + New subscription + Nova preplata - - Invalid data format - + + + + Mark items read + Označi stavke kao pročitane - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - + + Update all + Ažuriraj sve - - Couldn't load RSS AutoDownloader rules. Reason: %1 - - - - - RSS::Feed - - - Failed to download RSS feed at '%1'. Reason: %2 - - - - - RSS feed at '%1' updated. Added %2 new articles. - - - - - Failed to parse RSS feed at '%1'. Reason: %2 - + + RSS Downloader... + RSS preuzimatelj - - Couldn't read RSS Session data from %1. Error: %2 - + + Settings... + Postavke... - - Couldn't parse RSS Session data. Error: %1 - + + Torrents: (double-click to download) + Torrenti: (dupli klik za preuzimanje) - - Couldn't load RSS Session data. Invalid data format. - + + + Delete + Ukloni - - Couldn't load RSS article '%1#%2'. Invalid data format. - + + Rename... + Preimenuj... - - - RSS::Private::Parser - - Invalid RSS feed. - + + Rename + Preimenuj - - %1 (line: %2, column: %3, offset: %4). - + + + Update + Ažuriraj - - - RSS::Session - - RSS feed with given URL already exists: %1. - + + New subscription... + Nova pretplata... - - Cannot move root folder. - + + + Update all feeds + Ažuriraj sve kanale - - - Item doesn't exist: %1. - + + Download torrent + Preuzmi torrent - - Cannot delete root folder. - + + Open news URL + Otvori URL vijesti - - Incorrect RSS Item path: %1. - + + Copy feed URL + Kopiraj URL kanala - - RSS item with given path already exists: %1. - + + New folder... + Nova mapa... - - Parent folder doesn't exist: %1. - + + Refresh RSS streams + Osvježi RSS tok - RSSWidget - - - Search - Traži - - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - - - - - New subscription - - - - - - - Mark items read - - - - - Refresh RSS streams - - - - - Update all - - - - - RSS Downloader... - - - - - Torrents: (double-click to download) - - + RSSImp - - - Delete - Ukloni + + Stream URL: + URL stream: - - Rename... - Preimenuj... + + Please type a RSS stream URL + Molimo upišite URL RSS kanala - - Rename - Preimenovanje + + This RSS feed is already in the list. + RSS kanal je već u listi. - - - Update - + + Please choose a folder name + Izaberite naziv mape - - New subscription... - + + Folder name: + Naziv mape: - - - Update all feeds - + + New folder + Nova mapa - - Download torrent - + + Deletion confirmation + Potvrda brisanja - - Open news URL - + + Are you sure you want to delete the selected RSS feeds? + Sigurno želite ukloniti odabrani RSS kanal? - - Copy feed URL - + + Please choose a new name for this RSS feed + Izaberite novi naziv za taj RSS kanal - - New folder... - + + New feed name: + Novi naziv kanala: - - Please choose a folder name - + + Name already in use + Naziv se već koristi - - Folder name: - + + This name is already used by another item, please choose another one. + Taj naziv već koristi neka druga stavka. Izaberite drugi. - - New folder - + + Date: + Datum: - - Please type a RSS feed URL - + + Author: + Autor: - - Feed URL: - + + Unread + Nepročitano + + + Rss::Feed - - Deletion confirmation - + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + Automatsko preuzimanje '%1' iz '%2' RSS kanala nije uspjelo zato što ne sadrži torrent ili magnet poveznicu... - - Are you sure you want to delete the selected RSS feeds? - + + Automatically downloading '%1' torrent from '%2' RSS feed... + Automatsko preuzimanje '%1' torrenta iz '%2' RSS kanala... + + + Rss::Private::Parser - - Please choose a new name for this RSS feed - + + Invalid RSS feed. + Nevaljan RSS kanal. + + + RssSettingsDlg - - New feed name: - + + RSS Reader Settings + Postavke RSS čitača - - Rename failed - + + RSS feeds refresh interval: + Interval osvježavanja RSS kanala: - - Date: - + + min + min - - Author: - + + Maximum number of articles per feed: + Najveći broj članaka po kanalu: ScanFoldersDelegate - + Select save location @@ -7438,472 +6700,454 @@ ScanFoldersModel - + Monitored Folder - + Override Save Location - + Monitored folder - + Default save location - + Browse... - + Pretraži... - SearchJobWidget + SearchEngine - - Form - + + Unknown search engine plugin file format. + Nepoznat format datoteke dodatka za pretraživanje - - Results(xxx) - + + A more recent version of this plugin is already installed. + Novija verzija ovog dodatka je već instalirana. - - Search in: - + + + Plugin is not supported. + Dodatak nije podržan. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - + + Update server is temporarily unavailable. %1 + Poslužitelj za ažuriranje je privremeno nedostupan. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - + + + Failed to download the plugin file. %1 + Neuspjeh u preuzimanju datoteke dodatka. %1 - - Seeds: - Seederi: + + An incorrect update info received. + Krive informacije o ažuriranju primljene. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - + + All categories + Sve kategorije - - - to - + + Movies + Filmovi - - <html><head/><body><p>Maximal number of seeds</p></body></html> - + + TV shows + TV serije - - - - + + Music + Glazba - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + + Games + Igre - - Size: - Veličina: + + Anime + Anime - - <html><head/><body><p>Minimal torrent size</p></body></html> - + + Software + Softver - - <html><head/><body><p>Maximal torrent size</p></body></html> - + + Pictures + Slike + + + + Books + Knjige + + + + SearchListDelegate + + + + Unknown + Nepoznato + + + SearchTab - + Name i.e: file name - Naziv + Naziv - + Size i.e: file size - Veličina + Veličina - + Seeders i.e: Number of full sources - + Seederi - + Leechers i.e: Number of partial sources - + Leecheri - + Search engine - - - - - Filter search results... - + Tražilica - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Rezultati (prikazano <i>%1</i> od <i>%2</i>): - + Torrent names only - + Samo nazivi torrenta - + Everywhere - + Sve - - Use regular expressions - - - - + Searching... - + Traženje... - + Search has finished - Pretraga je završila + Pretraga je završila - + Search aborted - + Pretraga prekinuta - + An error occurred during search... - + Greška prilikom pretrage... - + Search returned no results - + Pretraga nije našla rezultate - + Column visibility - - - SearchPluginManager - - Unknown search engine plugin file format. - + + Form + Oblik - - A more recent version of this plugin is already installed. - + + Results(xxx) + Rezultati(xxx) - - - Plugin is not supported. - + + Search in: + Traži u: - - All categories - + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Neki pretraživači traže također u opisu i nazivu torrenta. Hoće li takvi rezultati biti prikazani u listi ispod je pod kontrolom ovog načina.</p><p><span style=" font-weight:600;">Sve </span>onemogućuje filtriranje i prikazuje sve rezultate od pretraživača.</p><p><span style=" font-weight:600;">Samo nazivi torrenta</span> prikazuje samo torrente kojima naziv odgovara terminu pretrage.</p></body></html> - - Movies - + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Namjesti minimalni i maksimalni broj seedera</p></body></html> - - TV shows - + + Seeds: + Seederi: - - Music - + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Minimalni broj seedera</p></body></html> - - Games - + + + to + u - - Anime - + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Maksimalni broj seedera</p></body></html> - - - Software - + + + + + - - Pictures - + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Namjesti minimalnu i maksimalnu dozvoljenu veličinu torrenta</p></body></html> - - Books - + + Size: + Veličina: - - Update server is temporarily unavailable. %1 - + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Minimalna veličina torrenta</p></body></html> - - - Failed to download the plugin file. %1 - + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Maksimalna veličina torrenta</p></body></html> - - - An incorrect update info received. - - - - - Search plugin '%1' contains invalid version string ('%2') - - - - - SearchWidget + + + SearchWidget - - - - + + + Search Traži - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - - + Download Preuzimanje - + Go to description page Idi na opisnu stranicu - + Copy description page URL Kopiraj URL opisne stranice - + Search plugins... Dodaci za pretraživanje... - + A phrase to search for. Izraz za pretraživanje. - + Spaces in a search term may be protected by double quotes. Razmaci u izrazu pretraživanja mogu biti zaštićeni sa duplim navodnicima. - + Example: Search phrase example Primjer: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>: traži <b>foo</b> i <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: traži <b>foo bar</b> - + All plugins Svi dodaci - + Only enabled - + Select... - - - + + + Search Engine Dodaci za pretraživanje - + Please install Python to use the Search Engine. Molimo instalirajte Python kako bi koristili Pretraživače - + Empty search pattern Prazan obrazac za pretraživanje - + Please type a search pattern first Prvo upišite obrazac za pretraživanje - + Stop Zaustavi - + Search has finished Pretraga je završila - + Search has failed Pretraga nije uspjela - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + qBittorrent će sada izaći. - + E&xit Now - + I&zađi sad - + Exit confirmation - + Potvrda o izlasku - + The computer is going to shutdown. - + Računalo će se ugasiti. - + &Shutdown Now - - - - - Shutdown confirmation - + Uga&si odmah - + The computer is going to enter suspend mode. - + Računalo će otići u način mirovanja. - + &Suspend Now - + Način &mirovanja odmah - + Suspend confirmation - + Potvrda načina mirovanja - + The computer is going to enter hibernation mode. - + Računalo će otići u način hibernacije. - + &Hibernate Now - + &Hiberniraj odmah - + Hibernate confirmation - + Potvrda načina hibernacije - + You can cancel the action within %1 seconds. - + Možete otkazati akciju za %1 sekundi. + + + + Shutdown confirmation + Potvrda isključivanja SpeedLimitDialog - + KiB/s KiB/s @@ -7911,52 +7155,52 @@ SpeedPlotView - + Total Upload Ukupno poslano - + Total Download Ukupno preuzeto - + Payload Upload Teret poslanog - + Payload Download Teret preuzetog - + Overhead Upload Dodatno poslano - + Overhead Download Dodatno preuzeto - + DHT Upload DHT slanje - + DHT Download DHT preuzimanje - + Tracker Upload Tracker slanje - + Tracker Download Tracker preuzimanje @@ -7964,95 +7208,87 @@ SpeedWidget - + Period: Razdoblje: - + 1 Minute 1 minuta - + 5 Minutes 5 minuta - + 30 Minutes 30 minuta - + 6 Hours 6 sati - + Select Graphs Odaberi grafove - + Total Upload Ukupno poslano - + Total Download Ukupno preuzeto - + Payload Upload Teret poslanog - + Payload Download Teret preuzetog - + Overhead Upload Dodatno poslano - + Overhead Download Dodatno preuzeto - + DHT Upload DHT poslano - + DHT Download DHT preuzimanje - + Tracker Upload Tracker slanje - + Tracker Download Tracker preuzimanje - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8065,49 +7301,49 @@ Korisničke statistike - - Cache statistics - Statistika predmemorije + + Total peer connections: + Ukupno peer veza: - - Read cache hits: - + + Global ratio: + Globalni omjer: - - Average time in queue: - + + Alltime download: + Sveukupno preuzimanje: - - Connected peers: - + + Alltime upload: + Apsolutno poslano: - - All-time share ratio: - + + Total waste (this session): + Ukupni gubitak (ova sesija): - - All-time download: - + + Cache statistics + Statistika predmemorije - - Session waste: + + Read cache hits: - - All-time upload: + + Average time in queue: - Total buffer size: - + Total buffers size: + Ukupna veličina međumemorije: @@ -8135,7 +7371,12 @@ Ukupna veličina čekanja u redu: - + + OK + U redu + + + %1 ms 18 milliseconds @@ -8144,27 +7385,32 @@ StatusBar - + Connection status: Status veze: - + No direct connections. This may indicate network configuration problems. Nema izravnih spajanja. Ovo može značiti probleme u postavkama mreže. - + DHT: %1 nodes DHT: %1 čvorova - - qBittorrent needs to be restarted! - + + qBittorrent needs to be restarted + qBittorrent treba ponovno pokrenuti + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent je upravo ažuriran i treba ga ponovno pokrenuti kako bi promjene postale učinkovite. @@ -8183,1563 +7429,1311 @@ Spojeno - + Click to switch to alternative speed limits Kliknite za prelazak na alternativna ograničenja brzine - + Click to switch to regular speed limits Kliknite za prelazak na uobičajena ograničenja brzine - + + Manual change of rate limits mode. The scheduler is disabled. + Ručna promjena načina ograničenja brzine. Planer je onemogućen. + + + Global Download Speed Limit Globalno ograničenje brzine preuzimanja - + Global Upload Speed Limit Globalno ograničenje brzine slanja - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - Sve (0) + Sve (0) - + Downloading (0) - + Preuzimanje (0) - + Seeding (0) - + Seedanje (0) - + Completed (0) - + Završeno (0) - + Resumed (0) - + Nastavljeno (0) - + Paused (0) - + Pauzirano (0) - + Active (0) - + Aktivno (0) - + Inactive (0) - + Neaktivno (0) - + Errored (0) - + S greškom (0) - + All (%1) - Sve (%1) + Sve (%1) - + Downloading (%1) - + Preuzimanje (%1) - + Seeding (%1) - + Seedanje (%1) - + Completed (%1) - + Završeno (%1) - + Paused (%1) - + Pauzirano (%1) - + Resumed (%1) - + Nastavljeno (%1) - + Active (%1) - + Aktivno (%1) - + Inactive (%1) - + Neaktivno (%1) - + Errored (%1) - + S greškom (%1) - TagFilterModel + TorrentContentModel - - Tags - + + Name + Naziv - - All - + + Size + Veličina - - Untagged - + + Progress + Napredak - - - TagFilterWidget - - Add tag... - + + Download Priority + Prioritet preuzimanja - - Remove tag - + + Remaining + Preostaje + + + TorrentCreatorDlg - - Remove unused tags - + + Select a folder to add to the torrent + Izaberite mapu koja će biti dodana torrentu - - Resume torrents - Nastavi torrente + + Select a file to add to the torrent + Izaberite datoteku koja će biti dodana torrentu - - Pause torrents - Pauziraj torrente + + No input path set + Nije zadana ulazna putanja - - Delete torrents - Ukloni torrente + + Please type an input path first + Upišite prvo ulaznu putanju - - New Tag - + + Select destination torrent file + Izabrite odredišnu torrent datoteku - - Tag: - + + Torrent Files (*.torrent) + Torrent datoteke (*.torrent) - - Invalid tag name - + + Torrent was created successfully: %1 + %1 is the path of the torrent + Torrent je uspješno napravljen: %1 - - Tag name '%1' is invalid - + + + + Torrent creation + Kreiranje torrenta - - Tag exists - + + Torrent creation was unsuccessful, reason: %1 + Kreiranje torrenta nije uspjelo. Razlog: %1 - - Tag name already exists. - + + Created torrent file is invalid. It won't be added to download list. + Kreirana torrent datoteka nije ispravna. Neće biti dodana na popis preuzimanja. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - + + Name + i.e: torrent name + Naziv - - Name: - + + Size + i.e: torrent size + Veličina - - Save path: - + + Done + % Done + Napredak - - Choose save path - + + Status + Torrent status (e.g. downloading, seeding, paused) + Status - - New Category - + + Seeds + i.e. full sources (often untranslated) + Seedovi - - Invalid category name - + + Peers + i.e. partial sources (often untranslated) + Peerovi - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - + + Down Speed + i.e: Download speed + Brzina preuzimanja - - Category creation error - + + Up Speed + i.e: Upload speed + Brzina slanja - - Category with the given name already exists. -Please choose a different name and try again. - + + Ratio + Share ratio + Omjer - - - TorrentContentModel - - Name - Naziv + + ETA + i.e: Estimated Time of Arrival / Time left + Preostalo vrijeme - - Size - Veličina + + Category + Kategorija - - Progress - Napredak + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Dodano - - Download Priority - Prioritet preuzimanja + + Completed On + Torrent was completed on 01/01/2010 08:00 + Dovršeno - - Remaining - Preostaje + + Tracker + Tracker - - Availability - + + Down Limit + i.e: Download limit + Ograničenje preuzimanja - - - TorrentCreatorDialog - - Torrent Creator - + + Up Limit + i.e: Upload limit + Ograničenje slanja - - Select file/folder to share - + + Downloaded + Amount of data downloaded (e.g. in MB) + Preuzeto - - Path: - + + Uploaded + Amount of data uploaded (e.g. in MB) + Poslano - - [Drag and drop area] - + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Preuzmanje u sesiji - - - Select file - + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Slanje u sesiji - - - Select folder - + + Remaining + Amount of data left to download (e.g. in MB) + Preostalo - - Settings - + + Time Active + Time (duration) the torrent is active (not paused) + Vrijeme aktivnosti - - Piece size: - + + Save path + Torrent save path + Putanja za spremanje - - Auto - + + Completed + Amount of data completed (e.g. in MB) + Završeno - - 16 KiB - - - - - 32 KiB - - - - - 64 KiB - - - - - 128 KiB - - - - - 256 KiB - - - - - 512 KiB - - - - - 1 MiB - - - - - 2 MiB - - - - - 4 MiB - - - - - 8 MiB - - - - - 16 MiB - - - - - 32 MiB - - - - - Calculate number of pieces: - - - - - Private torrent (Won't distribute on DHT network) - - - - - Start seeding immediately - - - - - Ignore share ratio limits for this torrent - - - - - Optimize alignment - - - - - Fields - - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - - - - Web seed URLs: - - - - - Tracker URLs: - - - - - Comments: - - - - - Source: - - - - - Progress: - Napredak: - - - - Create Torrent - - - - - - - Torrent creation failed - - - - - Reason: Path to file/folder is not readable. - - - - - Select where to save the new torrent - - - - - Torrent Files (*.torrent) - - - - - Reason: %1 - - - - - Reason: Created torrent is invalid. It won't be added to download list. - - - - - Torrent creator - - - - - Torrent created: - - - - - TorrentInfo - - - File size exceeds max limit %1 - - - - - Torrent file read error: %1 - - - - - Torrent file read error: size mismatch - - - - - TorrentsController - - - Not contacted yet - - - - - Updating... - - - - - Working - - - - - Not working - - - - - Error: '%1' is not a valid torrent file. - - - - - - - - Torrent queueing must be enabled - - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - - Cannot make save path - - - - - Cannot write to directory - + + Ratio Limit + Upload share ratio limit + Ograničenje omjera - - WebUI Set location: moving "%1", from "%2" to "%3" - + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Zadnje viđen završeni - - Incorrect torrent name - + + Last Activity + Time passed since a chunk was downloaded/uploaded + Posljednja aktivnost - - - Incorrect category name - + + Total Size + i.e. Size including unwanted data + Ukupna veličina TrackerFiltersList - + All (0) this is for the tracker filter Sve (0) - + Trackerless (0) Bez trackera (0) - + Error (0) Greška (0) - + Warning (0) Upozorenje (0) - - + + Trackerless (%1) Bez trackera (%1) - - + %1 (%2) + openbittorrent.com (10) + %1 (%2) + + + + Error (%1) Greška (%1) - - + + Warning (%1) Upozorenje (%1) - + Resume torrents Nastavi torrente - + Pause torrents Pauziraj torrente - + Delete torrents Ukloni torrente - - + + All (%1) this is for the tracker filter Sve (%1) - TrackerListWidget + TrackerList - - - Working - - - - - Disabled - - - - - This torrent is private - + + URL + URL - - Updating... - + + Status + Status - - Not working + + Received - - Not contacted yet - + + Seeds + Seedovi - - - - - - - N/A - Nepoznato + + Peers + Peerovi - - Tracker editing - + + Downloaded + Preuzeto - - Tracker URL: - + + Message + Poruka - - - Tracker editing failed - + + + Working + Radi - - The tracker URL entered is invalid. - + + Disabled + Onemogućeno - - The tracker URL already exists. - + + This torrent is private + Ovaj torrent je privatan - - Add a new tracker... - + + Updating... + Ažuriranje... - - Remove tracker - + + Not working + Ne radi - - Copy tracker URL - + + Not contacted yet + Još nije kontaktirano - - Edit selected tracker URL - + + Tracker URL: + URL trackera: - - Force reannounce to selected trackers - + + Tracker editing + Uređivanje trackera - - Force reannounce to all trackers - + + + Tracker editing failed + Uređivanje trackera neuspješno - - URL - + + The tracker URL entered is invalid. + Uneseni URL trackera nije ispravan. - - Status - Status + + The tracker URL already exists. + URL trackera već postoji. - - Received - + + Add a new tracker... + Dodaj novi tracker... - - Seeds - + + Copy tracker URL + Kopiraj URL trackera - - Peers - Peerovi + + Edit selected tracker URL + Uredi URL odabranog trackera - - Downloaded - Preuzeto + + Force reannounce to selected trackers + Prisili ponovnu najavu na sljedećim trackerima - - Message - + + Force reannounce to all trackers + Prisili ponovnu najavu na svim trackerima - - Column visibility - + + Remove tracker + Ukloni tracker - TrackerLoginDialog - - - - Tracker authentication - - + TrackersAdditionDlg - - Tracker: - - - - - Login - Prijava - - - - Username: - - - - - Password: - + + Trackers addition dialog + Dijalog dodavanja trackera - - Log in - + + List of trackers to add (one per line): + Popis trackera za dodati (jedan po liniji): - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + Popis URL-ova kompatibilan s µTorrentom: - - List of trackers to add (one per line): - + + I/O Error + I/O greška - - µTorrent compatible list URL: - + + Error while trying to open the downloaded file. + Greška prilikom pokušaja otvaranja preuzete datoteke. - + No change - + Bez promjene - + No additional trackers were found. - + Nisu pronađeni dodatni trackeri. - + Download error - Greška pri preuzimanju + Greška prilikom preuzimanja - + The trackers list could not be downloaded, reason: %1 - + Popis trackera nije moguće preuzeti. Razlog: %1 TransferListDelegate - + Downloading Preuzimanje - + Downloading metadata used when loading a magnet link Preuzimanje metapodataka - + Allocating qBittorrent is allocating the files on disk Dodjeljivanje - + Paused Pauzirano - + Queued i.e. torrent is queued Na čekanju - + Seeding Torrent is complete and in upload-only mode Seedanje - + Stalled Torrent is waiting for download to begin Zastoj - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] Preuzimanje - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] Seedanje - + Checking Torrent local data is being checked Provjeravanje - + Queued for checking i.e. torrent is queued for hash checking U redu za provjeru - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Provjera podataka za nastavak - + Completed Završeno - - Moving - Torrent local data are being moved/relocated - - - - + Missing Files Nedostajuće datoteke - + Errored torrent status, the torrent has an error S greškom - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - %1 (seedano za %2) - - - - %1 ago - e.g.: 1h 20m ago - prije %1 - - - - TransferListFiltersWidget - - - Status - Status - - - - Categories - Kategorije - - - - Tags - - - - - Trackers - Trackeri - - - - TransferListModel - - - Name - i.e: torrent name - Naziv - - - - Size - i.e: torrent size - Veličina - - - - Done - % Done - - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Status - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - Peerovi - - - - Down Speed - i.e: Download speed - Brzina preuzimanja - - - - Up Speed - i.e: Upload speed - Brzina slanja - - - - Ratio - Share ratio - - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - Kategorija - - - - Tags - - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Preuzeto - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Poslano - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - Preostaje - - - - Time Active - Time (duration) the torrent is active (not paused) - - - - - Save path - Torrent save path - - - - - Completed - Amount of data completed (e.g. in MB) - Završeno + %1 (seedano za %2) - - Ratio Limit - Upload share ratio limit - + + %1 ago + e.g.: 1h 20m ago + prije %1 + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + Status - - Last Activity - Time passed since a chunk was downloaded/uploaded - + + Categories + Kategorije - - Total Size - i.e. Size including unwanted data - + + Trackers + Trackeri TransferListWidget - + Column visibility Vidljivost stupca - + Choose save path Izaberi putanju spremanja - + Torrent Download Speed Limiting Ograničenje brzine preuzimanja torrenta - + Torrent Upload Speed Limiting Ograničenje brzine slanja torrenta - + Recheck confirmation Ponovno provjeri potvrđivanje - + Are you sure you want to recheck the selected torrent(s)? Jeste li sigurni da želite ponovno provjeriti odabrani/e torrent(e)? - + Rename Preimenovanje - + New name: Novi naziv: - + Resume Resume/start the torrent Nastavi - + Force Resume Force Resume/start the torrent Prisili nastavak - + Pause Pause the torrent Pauziraj - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - - - - - Add Tags - - - - - Remove All Tags - - - - - Remove all tags from selected torrents? - + + New Category + Nove kategorije - - Comma-separated tags: - + + Category: + Kategorija: - - Invalid tag - + + Invalid category name + Neispravni naziv kategorije - - Tag name: '%1' is invalid - + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Naziv kategorije ne smije sadržavati '\'. +Naziv kategorije ne smije počinjati ili završavati sa '/'. +Naziv kategorije ne smije sadržavati '//' niz. - + Delete Delete the torrent Ukloni - + Preview file... Pregledaj datoteke - + Limit share ratio... Ograničenje omjera djeljenja - + Limit upload rate... Ograničeni brzinu slanja... - + Limit download rate... Ograniči brzinu preuzimanja... - + Open destination folder Otvori odredišnu mapu - + Move up i.e. move up in the queue Pomakni gore - + Move down i.e. Move down in the queue Pomakni dolje - + Move to top i.e. Move to top of the queue Na vrh - + Move to bottom i.e. Move to bottom of the queue Na dno - + Set location... Postavi mjesto... - - Force reannounce - - - - + Copy name Kopiraj naziv - - Copy hash - - - - + Download first and last pieces first Preuzmi prve i zadnje dijelove prije drugih. - + Automatic Torrent Management - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - + Category Kategorija - + New... New category... Novo... - + Reset Reset category Poništi - - Tags - - - - - Add... - Add / assign multiple tags... - - - - - Remove All - Remove all tags - - - - + Priority Prioritet - + Force recheck Prisili ponovnu provjeru - + Copy magnet link Kopiraj magnet poveznicu - + Super seeding mode Način superseedanja - + Rename... Preimenuj... - + Download in sequential order Preuzmi u sekvencijskom poretku - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + Ograniči omjer slanja/preuzimanja torrenta - - Use global share limit - + + Use global ratio limit + Koristi globalno ograničenje omjera - - - + + + buttonGroup - + buttonGroup - - Set no share limit - + + Set no ratio limit + Ne podešavaj ograničenje omjera - - Set share limit to - + + Set ratio limit to + Podesi ograničenje omjera na + + + WebApplication - - ratio + + Incorrect category name + + + WebUI + + + The Web UI is listening on port %1 + Web sučelje sluša na portu %1 + - - minutes - + + Web UI Error - Unable to bind Web UI to port %1 + Greška web sučelja - Nemoguće povezati web sučelje sa portom %1 + + + about - - No share limit method selected - + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Napredni BitTorrent klijent programiran u C++, baziran na Qt programskom alatu i libtorrent-rasterbar. - - Please select a limit method first - + + Copyright %1 2006-2016 The qBittorrent project + Sva prava pridržava %1 2006-2016 qBittorrent projekt + + + + Home Page: + Web stranica: + + + + Forum: + Forum: + + + + Bug Tracker: + Praćenje grešaka: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - + + Add Peers + Dodaj peerove - - Python not detected - + + List of peers to add (one per line): + Lista peerova za dodavanje (jedan po liniji): + + + + Format: IPv4:port / [IPv6]:port + Format: IPv4:port / [IPv6]:port - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - + + + Tracker authentication + Ovjera trackera - - Symlinks inside alternative UI folder are forbidden. - + + Tracker: + Tracker: - - Exceeded the maximum allowed file size (%1)! - + + Login + Prijava - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - + + Username: + Korisničko ime: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - + + Password: + Lozinka: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - + + Log in + Prijavi se - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - + + Cancel + Odustani - WebUI + confirmDeletionDlg - - Web UI: HTTPS setup successful - + + Deletion confirmation - qBittorrent + Potvrda brisanja - qBittorrent - - Web UI: HTTPS setup failed, fallback to HTTP - + + Remember choice + Zapamti izbor - - Web UI: Now listening on IP: %1, port: %2 - + + Also delete the files on the hard disk + Također ukloni datoteke i na čvrstom disku + + + + confirmShutdownDlg + + + Don't show again + Ne pokazuj više + + + createTorrentDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - + + Cancel + Odustani + + + + Torrent Creation Tool + Alat za kreiranje torrenta + + + + Torrent file creation + Kreiranje torrent datoteke + + + + Add file + Dodaj datoteku + + + + Add folder + Dodaj mapu + + + + File or folder to add to the torrent: + Datoteka ili mapa za dodati u torrent: + + + + Tracker URLs: + URL-ovi trackera: + + + + Web seeds urls: + URL-ovi web seedova: + + + + Comment: + Komentar: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Možete odvojiti grupe trackera praznom linijom. + + + + Piece size: + Veličina djelića: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + Auto + + + + Private (won't be distributed on DHT network if enabled) + Privatno (neće biti distribuirano na DHT mreži ako je omogućeno) + + + + Start seeding after creation + Započni seedanje nakon kreiranja + + + + Ignore share ratio limits for this torrent + Ignoriraj omjer dijeljenja za ovaj torrent + + + + Create and save... + Kreiraj i spremi... + + + + Progress: + Napredak: + + + + downloadFromURL + + + Add torrent links + Dodaj poveznice torrenta + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Jedno po retku (podržani su HTTP i magnet poveznice te info-hashevi) + + + + Download + Preuzmi + + + + Cancel + Odustani + + + + Download from urls + Preuzmi s URL-ova + + + + No URL entered + Nije unesen URL + + + + Please type at least one URL. + Upišite bar jedan URL. + + + + errorDialog + + + Crash info + Informacija o rušenju fsutils - + + + + + Downloads Preuzimanja @@ -9747,100 +8741,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + Python nije detektiran + + + + Python version: %1 + Python verzija: %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1s %2m - + %1d %2h e.g: 2days 10hours %1d %2s - + Unknown Unknown (size) Nije poznato - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent će sada isključiti računalo jer su sva preuzimanja završila. - + < 1m < 1 minute < 1m - + %1m e.g: 10minutes %1m + + + Working + Radi + + + + Updating... + Ažuriranje... + + + + Not working + Ne radi + + + + Not contacted yet + Još nije kontaktirano + preview - + Preview selection Pregledaj odabir - + The following files support previewing, please select one of them: Sljedeće datoteke podržavaju pregled, izaberite jednu od njih: + + + Preview + Pregledaj + + + + Cancel + Odustani + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_hu.ts qbittorrent-3.3.15/src/lang/qbittorrent_hu.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_hu.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_hu.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - + A qBittorrent névjegye - + About - + Névjegy - + Author - - - - - Current maintainer - + Szerző - - Greece - Görögország + + + Nationality: + Állampolgárság: - - - Nationality: - + + + Name: + Név: - - + + E-mail: - + E-mail: - - - Name: - Név: + + Greece + Görögország - - Original author - + + Current maintainer + Jelenlegi karbantartó - - France - Franciaország + + Original author + Eredeti szerző - fejlesztő - + Special Thanks - + Külön köszönet - + Translators - + Fordítók - - License - - - - + Libraries - + Könyvtárak - + qBittorrent was built with the following libraries: - - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - + A qBittorrent a következő könyvtárak felhasználásával került kiadásra: - - Forum: - + + France + Franciaország - - Bug Tracker: - + + License + Licenc @@ -115,57 +90,67 @@ Mentés helye - + + Browse... + Keresés... + + + + Set as default save path + Beállít alapértelmezett mentési útvonalnak + + + Never show again Ne mutasd újra - + Torrent settings Torrent beállítások - + Set as default category Beállítás alapértelmezett kategóriának - + Category: Kategória: - + Start torrent Torrent indítása - + Torrent information Torrent információk - + Skip hash check Újraellenőrzés kihagyása - + Size: Méret: - + Hash: Hash: - + Comment: Megjegyzés: - + Date: Dátum: @@ -190,117 +175,89 @@ Automatikus - - Remember last used save path - Az utoljára használt mentési útvonal megjegyzése - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - Ha be van jelölve, akkor a .torrent fájl akkor sem lesz törölve, ha a „Letöltések” oldalon lévő beállítás más mond. + - + Do not delete .torrent file Ne törölje a .torrent fájlt - - Create subfolder - Almappa létrehozása - - - - Download in sequential order - Letöltés sorrendben - - - - Download first and last pieces first - - - - + Normal Normál - + High Magas - + Maximum Maximum - + Do not download Mellőzés - - - + + + I/O Error I/O Hiba - + Invalid torrent Érvénytelen torrent - - Renaming - Átnevezés - - - - - Rename error - Átnevezési hiba - - - - The name is empty or contains forbidden characters, please choose a different one. - A név üres vagy tiltott karaktereket tartalmaz, válasszon másikat. + + + + + Already in download list + Már a letöltési listában van - + Not Available This comment is unavailable Nem elérhető - + Not Available This date is unavailable Nem elérhető - + Not available Nem elérhető - + Invalid magnet link Érvénytelen magnet link - + The torrent file '%1' does not exist. A '%1' torrent fájl nem létezik. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. A '%1' torrent fájl nem olvasható a lemezről. Elképzelhető, hogy nem rendelkezik a megfelelő jogosultsággal. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ Hiba: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + A torrent már szerepel a letöltések között. A követők nem kerültek egyesítésre, mert ez egy privát torrent. + + + + Torrent is already in download list. Trackers were merged. + A torrent már szerepel a letöltések között. A követők egyesítésre kerültek. + + + + + Cannot add torrent + Torrentet nem lehet hozzáadni + + + + Cannot add this torrent. Perhaps it is already in adding state. + Nem lehet hozzáadni ezt a torrentet. Talán már hozzáadási állapotban van. + + + This magnet link was not recognized A magnet linket nem sikerült felismerni - + + Magnet link is already in download list. Trackers were merged. + A magnet link már szerepel a letöltések között. A trackerek egyesítésre kerültek. + + + + Cannot add this torrent. Perhaps it is already in adding. + Nem lehet hozzáadni ezt a torrentet. Talán már hozzáadásban van. + + + Magnet link Magnet link - + Retrieving metadata... Metadata letöltése... - + Not Available This size is unavailable. Nem elérhető - + Free space on disk: %1 Szabad terület a lemezen: %1 - + + Choose save path Mentési útvonal választása - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - + + Rename the file + Fájl átnevezése - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + + New name: + Új név: - - Magnet link is already queued for processing. - + + + The file could not be renamed + Nem sikerült átnevezni a fájlt - - New name: - Új név: + + This file name contains forbidden characters, please choose a different one. + Ez a fájlnév tiltott karaktereket tartalmaz, kérlek válassz egy másikat. - - + + This name is already in use in this folder. Please use a different name. Ez a név már használatban van ebben a mappában. Kérlek válassz másik nevet. - + The folder could not be renamed Nem sikerült átnevezni a mappát - + Rename... Átnevezés... - + Priority Priorítás - + Invalid metadata Érvénytelen metadata - + Parsing metadata... Metadata értelmezése... - + Metadata retrieval complete Metadata sikeresen letöltve - + Download Error Letöltési hiba @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Lemez írási gyorsítótár mérete + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Kimenő portok (Min) [0: Letiltva] - + Outgoing ports (Max) [0: Disabled] Kimenő portok (Max) [0: Letiltva] - + Recheck torrents on completion Torrentek újraellenőrzése a letöltésük végeztével - + Transfer list refresh interval Átviteli lista frissítésének időköze - + ms milliseconds ms - + Setting Beállítások - + Value Value set for this setting Érték - - - (disabled) - (kikapcsolva) - - - + (auto) (auto) - - min - minutes - perc - - - + All addresses Összes cím - + qBittorrent Section qBittorrent beállítások - - + + Open documentation Dokumentáció megnyitása - + libtorrent Section libtorrent beállítások - - Asynchronous I/O threads - - - - - Disk cache - Lemez gyorsítótár - - - + s seconds s - + Disk cache expiry interval Merevlemez gyorsítótár lejáratának ideje - + Enable OS cache OS cache engedélyezése - - Guided read cache - Irányított olvasási gyorsítótár - - - - Coalesce reads & writes - Olvasások & írások egyesítése - - - - Send upload piece suggestions - Feltöltési darab javaslatok küldése - - - - - KiB - KiB - - - - Send buffer watermark - Buffer watermark küldése - - - - Send buffer low watermark - Buffer low watermark küldése - - - - Send buffer watermark factor - Buffer watermark factor küldése - - - - Prefer TCP - TCP előnyben részesítése - - - - Peer proportional (throttles TCP) - Partner arányos (TCP-t visszafogja) - - - - Allow multiple connections from the same IP address - Több kapcsolat engedélyezése ugyanarról az IP-címről + + m + minutes + m - + Resolve peer countries (GeoIP) Ügyfelek országának megjelenítése - + Resolve peer host names Host nevek feloldása - + Strict super seeding Szigorú szuper seed - + Network Interface (requires restart) Háltózati csatoló (újraindítást igényel) - + Optional IP Address to bind to (requires restart) - Választható IP-cím, amelyhez az alkalmazás kötődjön (újraindítás szükséges) + - + Listen on IPv6 address (requires restart) Figyelés IPv6 címen (újraindítást igényel) - + Display notifications Értesítések megjelenítése - + Display notifications for added torrents Értesítések megjelenítése a hozzáadott torrentekről - + Download tracker's favicon Tracker favicon letöltése - - Save path history length - Útvonalelőzmények hosszának mentése - - - - Fixed slots - Rögzített szálak / slotok - - - - Upload rate based - Feltöltési arány alapján - - - - Upload slots behavior - Feltöltési foglalat viselkedése - - - - Round-robin - Round-robin - - - - Fastest upload - Leggyorsabb feltöltés - - - - Anti-leech - Anti-leech - - - - Upload choking algorithm - Feltöltéskorlátozási algoritmus - - - + Confirm torrent recheck Újraellenőrzés megerősítése - - Confirm removal of all tags - Összes címke eltávolításának megerősítése - - - - Always announce to all trackers in a tier - Mindig jelentsen az egy szinten lévő összes tracker felé + Exchange trackers with other peers + Trackerek megosztása a többi klienssel - - Always announce to all tiers - Mindig jelentsen az összes szintnek + + Always announce to all trackers + Mindig jelentsen az összes tracker felé - + Any interface i.e. Any network interface Bármely csatoló - + Save resume data interval How often the fastresume file is saved. Folytatási adatfájl mentésének intervalluma - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - %1-TCP kevert-mód algoritmus - - - + Maximum number of half-open connections [0: Unlimited] Félig nyitott kapcsolatok maximális száma [0: Korlátlan] - + IP Address to report to trackers (requires restart) Trackernek lejelentett IP cím (újraindítást igényel) - + Enable embedded tracker Beépített tracker bekapcsolása - + Embedded tracker port Beépített tracker portja - + Check for software updates Frissítések keresése - + Use system icon theme Renszer ikon téma használata @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 elindult - + Torrent: %1, running external program, command: %2 Torrent: %1, külső program futtatása, parancs: %2 - - Torrent name: %1 - Torrent név: %1 - - - - Torrent size: %1 - Torrent méret: %1 - - - - Save path: %1 - Mentés helye: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - A torrent már le lett töltve ide: %1. - - - - Thank you for using qBittorrent. - Köszönjük, hogy a qBittorentet használja. - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' befejezte a letöltést + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrent: %1, külső program futtatási parancs túl hosszú (hossz > %2), végrehajtás sikertelen. - + Torrent: %1, sending mail notification Torrent: %1, értesítő levél küldése - + Information Információ - - To control qBittorrent, access the Web UI at %1 - A qBittorrent irányításához nyissa meg a webes felületet itt: %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + A qBittorrent vezérléséhez, nyisd meg ezt a címet: http://localhost:%1 - + The Web UI administrator user name is: %1 Web UI adminisztrátor felhasználó neve: %1 - + The Web UI administrator password is still the default one: %1 Web UI adminisztrátor jelszó még az alapértelmezett: %1 - + This is a security risk, please consider changing your password from program preferences. Ez biztonsági kockázatot jelent. Kérlek változtass jelszót a program beállításinál. - + Saving torrent progress... Torrent állapotának mentése... - - - Portable mode and explicit profile directory options are mutually exclusive - A hordozható mód, és a konkrétan megadott profilkönyvtár kölcsönösen kizárják egymást - - - - Portable mode implies relative fastresume - A hordozható mód relatív gyors-folytatást von maga után - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - Az IP-címe tiltásra került a túl gyakori hibás hitelesítési próbálkozások miatt. - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Mentés helye: @@ -861,836 +658,700 @@ RSS Letöltő - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - Az RSS torrentek letöltése jelenleg tiltott. Az alkalmazásbeállításokban engedélyezheti. + + Enable Automated RSS Downloader + Automatizált RSS Letöltő engedélyezése - + Download Rules Szabályok listája - + Rule Definition Szabály meghatározása - + Use Regular Expressions Reguláris Kifejezések használata - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - Okos Epizódszűrő használata - - - + Must Contain: Tartalmaznia Kell: - + Must Not Contain: Nem Tartalmazhatja: - + Episode Filter: Epizód szűrő: - + Assign Category: - Kategória megadása: + Kategória kijelölése: - + Save to a Different Directory Külön könyvtárba mentés - + Ignore Subsequent Matches for (0 to Disable) ... X days Ezt követő egyezések figyelmen kívül hagyása (0 a letiltáshoz): - + Disabled - Kikapcsolva + Tilt - + days nap - + Add Paused: Hozzáad szüneteltetve: - + Use global settings Globális beállítások használata - + Always Mindig - + Never Soha - + Apply Rule to Feeds: Szabály Alkalmazása a Csatornákra: - + Matching RSS Articles Egyező RSS Cikkek - + &Import... &Importálás... - + &Export... &Exportálás... - + Matches articles based on episode filter. Epizód szűrő alapján társítja a találatokat. - + Example: Példa: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match az első évad 2., 5., 8.-15., és a 30.- részeire fog szűrni - + Episode filter rules: Epizód szűrő szabályok: - + Season number is a mandatory non-zero value Évad szám egy kötelező nem-nulla érték - + Episode number is a mandatory non-zero value + Epizód szám egy kötelező nem-nulla érték + + + Filter must end with semicolon Szűrőnek pontosvesszővel kell végződnie - + Three range types for episodes are supported: Epizódok esetén három tartomány típus támogatott: - + Single number: <b>1x25;</b> matches episode 25 of season one Egy szám: <b>1x25;</b> az első évad 25. epizódjának felel meg - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Normál tartomány: <b>1x25-40;</b> az első évad 25-40. epizódjának felel meg - - Episode number is a mandatory positive value - Az epizódszám egy kötelező pozitív érték - - - - Rules - Szabályok + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Korlátlan tartomány: <b>1x25-;</b> az első évad 25. epizódjától kezdve minden rész - - Rules (legacy) - Szabályok (régi) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Korlátlan tartomány: <b>1x25-;</b> az első évad 25. epizódjától kezdve minden rész, és minden epizód a későbbi évadokban + - + Last Match: %1 days ago Utolsó egyezés: %1 nappal ezelőtt - + Last Match: Unknown Utolsó egyezés: Ismeretlen - + New rule name Új szabály neve - + Please type the name of the new download rule. Kérlek add meg az új letöltési szabály nevét. - - + + Rule name conflict Szabály név ütközés - - + + A rule with this name already exists, please choose another name. Már van ilyen szabály név. Kérlek válassz másikat. - + Are you sure you want to remove the download rule named '%1'? Biztosan el akarod távolítani a '%1' nevű szabályt ? - + Are you sure you want to remove the selected download rules? Biztosan eltávolítod a kiválasztott szabályokat? - + Rule deletion confirmation Szabály törlés megerősítése - + Destination directory Célmappa - + Invalid action - Érvénytelen művelet + Érvénytelen esemény - + The list is empty, there is nothing to export. - A lista üres, nincs mit exportálni. + A lista üres. Nincs mit exportálni. - - Export RSS rules - RSS szabályok exportálása + + Where would you like to save the list? + Hová szeretnéd menteni a listát? - - + + Rules list (*.rssrules) + Szabály lista (*.rssrules) + + + I/O Error I/O Hiba - - Failed to create the destination file. Reason: %1 - Cél fájlt nem sikerült létrehozni. Indok: %1 + + Failed to create the destination file + Fájl létrehozása sikertelen - - Import RSS rules - RSS szabályok importálása + + Please point to the RSS download rules file + Kérlek nyisd meg az RSS letöltési szabályokat tartalmazó fájlt - - Failed to open the file. Reason: %1 - Fájl megnyitása sikertelen. Oka: %1 + + Rules list + Szabály lista - + Import Error Import Hiba - - Failed to import the selected rules file. Reason: %1 - Hiba a kiválasztott szabály fájl importálásakor. Indok: %1 + + Failed to import the selected rules file + Nem sikerült importálni a kiválasztott fájlt - + Add new rule... Új szabály felvétele... - + Delete rule Szabály törlése - + Rename rule... Szabály átnevezése... - + Delete selected rules Kiválasztott szabályok törlése - - Clear downloaded episodes... - Letöltött epizódok törlése… - - - + Rule renaming Szabály átnevezése - + Please type the new rule name Kérlek add meg a szabály új nevét - - Clear downloaded episodes - Letöltött epizódok törlése + + Regex mode: use Perl-like regular expressions + Regex mód: Perl-szerű reguláris kifejezések használata - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - Regex mód: Perl-kompatibilis reguláris kifejezések használata - - - - - Position %1: %2 - Pozíció %1: %2 - - - + Wildcard mode: you can use - Helyettesítő karakter mód, ezeket használhatja: + - + ? to match any single character - ? – egy tetszőleges karakterre illeszkedik + - + * to match zero or more of any characters - * – nulla vagy több tetszőleges karakterre illeszkedik + - + Whitespaces count as AND operators (all words, any order) - Az üres karakterek ÉS operátorként működnek (minden szó, bármilyen sorrendben) + - + | is used as OR operator - | a VAGY operátorként működik + - + If word order is important use * instead of whitespace. - Ha a szósorrend fontos, akkor használjon *-ot üres karakter helyett + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Egy üres %1 tagmondattal rendelkező kifejezés (pl. %2) + - + will match all articles. - minden elemre illeszkedni fog. + - + will exclude all articles. - minden elemet ki fog hagyni. - - - - BanListOptionsDialog - - - List of banned IP addresses - - Ban IP - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Helyettesítő-jel mód: használhatod a <ul><li>? karaktert hogy egy darab karaktert feleltess meg</li><li>* karaktert hogy nulla vagy több karaktert feleltess meg</li><li>A szóközök ÉS operátornak felelnek meg</li></ul> - - Delete - Törlés + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Helyettesítő-jel mód: használhatod a <ul><li>? karaktert hogy egy darab karaktert feleltess meg</li><li>* karaktert hogy nulla vagy több karaktert feleltess meg</li><li>A | karakter pedig a VAGY operátornak felelnek meg</li></ul> + + + BitTorrent::Session - - - Warning - - - - - The entered IP address is invalid. - - - - - The entered IP is already banned. - - - - - BitTorrent::Session - - + Restart is required to toggle PeX support A PeX támogatás átkapcsolásához újra kell indítani a programot. - - Could not get GUID of configured network interface. Binding to IP %1 - Nem sikerült lekérni a hálózati csatoló GUID azonosítóját. Csatolás IP-hez: %1 - - - + Embedded Tracker [ON] Beágyazott tracker [BE] - + Failed to start the embedded tracker! Beágyazott tracker indítása sikertelen! - + Embedded Tracker [OFF] Beágyazott tracker [KI] - + + '%1' reached the maximum ratio you set. Removing... + '%1' elérte a maximális megengedett arányt. Eltávolítás... + + + + '%1' reached the maximum ratio you set. Pausing... + '%1' elérte a maximáls megengedett arányt. Szüneteltetés... + + + System network status changed to %1 e.g: System network status changed to ONLINE Rendszer hálózat állapota megváltozott erre: %1 - + ONLINE ONLINE - + OFFLINE OFFLINE - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding %1 hálózati konfigurációja megváltozott, munkamenet-kötés frissítése - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. A hálózati csatoló beállított címe érvénytelen: %1. - - + Encryption support [%1] Titkosítás támogatás [%1] - - + FORCED KÉNYSZERÍTETT - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - A(z) „%1” nem egy érvényes IP-cím, és elutasításra került a tiltott címek alkalmazásakor. - - - - + Anonymous mode [%1] Névtelen mód [%1] - + Unable to decode '%1' torrent file. Nem sikerült dekódolni a '%1' torrent fájlt. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Fájl ismételt letöltése '%1' beágyazva a torrentbe '%2' - + Queue positions were corrected in %1 resume files - A sorban elfoglalt pozíciók ki lettek javítva %1 folytatási fájlban + - + Couldn't save '%1.torrent' '%1.torrent'-et nem lehetett elmenteni - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - „%1” eltávolítva az átviteli listáról. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' eltávolítva az átviteli listából és a merevlemezről. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '%1' eltávolítva az átviteli listából, de a file-ok nem törölhetők. Hiba: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. mert a %1 ki van kapcsolva. - + because %1 is disabled. this peer was blocked because TCP is disabled. mert a %1 ki van kapcsolva. - + URL seed lookup failed for URL: '%1', message: %2 URL forrás meghatározása sikertelen: '%1', hibaüzenet: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. A qBittorrentnek nem sikerült a(z) %1 csatoló %2/%3 portján figyelnie. Indok: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' eltávolítva az átviteli listáról és a merevlemezről. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' eltávolítva az átviteli listáról. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... '%1' letöltése, kérlek várj... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 A qBittorrent próbálja a TCP/%1 portot használni - minden interfészen - + The network interface defined is invalid: %1 - A megadott hálózati csatoló érvénytelen: %1 + A megadott hálózati csatoló hasznavehetetlen: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 A qBittorrent próbálja TCP/%2 portot használni a %1 interfészen - - Peer ID: - Peer azonosító: - - - - HTTP User-Agent is '%1' - HTTP User-Agent a következő: '%1' - - - - + DHT support [%1] DHT támogatás [%1] - - - - - - - - - + + + + ON BE - - - - - - - - - + + + + OFF KI - - + Local Peer Discovery support [%1] Helyi peer felfedezés támogatás [%1] - - PeX support [%1] - PeX támogatás [%1] - - - - '%1' reached the maximum ratio you set. Removed. - '%1' elérte az általad beállított maximális arányt. Eltávolítva. - - - - '%1' reached the maximum ratio you set. Paused. - '%1' elérte az általad beállított maximális arányt. Megállítva. - - - - '%1' reached the maximum seeding time you set. Removed. - '%1' elérte a beállított maximális seedelési időt. Eltávolítva. - - - - '%1' reached the maximum seeding time you set. Paused. - %1' elérte a beállított maximális seedelési időt. Leállítva. + Restart is required to toggle Tracker Exchange support + Újraindítás szükséges a Tracker Exchange támogatás átkapcsolásához - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on Nem található a %1 helyi cím a figyeléshez - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface Nem sikerült felhasználni egyik %1 interfész portot sem. Indok: %2 - + Tracker '%1' was added to torrent '%2' '%1' tracker hozzá lett adva a(z) '%2' torrenthez - + Tracker '%1' was deleted from torrent '%2' - '%1' tracker törölve lett a(z) '%2' torrentből + '%1' URL seed törölve a(z) '%2' torrentből. - + URL seed '%1' was added to torrent '%2' '%1' URL seed hozzáadva a(z) '%2' torrenthez. - + URL seed '%1' was removed from torrent '%2' '%1' URL seed eltávolítva a(z) '%2' torrentből. - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Nem lehet folytatni a(z) '%1' torrentet. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number A következő IP szűrő sikeresen feldolgozva: %1 szabály alkalmazva. - + Error: Failed to parse the provided IP filter. - Hiba: Hiba az IP szűrő fájl feldolgozásakor. + Hiba: az IP szűrő megnyitása sikertelen. - - '%1' restored. - 'torrent name' restored. - - - - + Couldn't add torrent. Reason: %1 Nem lehet torrentet hozzáadni. Ok: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' folytatva. (gyors folytatás) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' felvéve a letöltési listára. - + An I/O error occurred, '%1' paused. %2 I/O hiba történt, '%1' szüneteltetve. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Port lefoglalása sikertelen, hibaüzenet: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Port lefoglalása sikeres, hibaüzenet: %1 - + due to IP filter. this peer was blocked due to ip filter. IP szűrő miatt. - + due to port filter. this peer was blocked due to port filter. port szűrő miatt. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. i2p kevert mód korlátozás miatt. - + because it has a low port. this peer was blocked because it has a low port. mert alacsony porttal rendelkezik. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 A qBittorrent sikeresen használatba vette a %2/%3 portot - a %1 interfészen - + External IP: %1 e.g. External IP: 192.168.0.1 Külső IP: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - új torrent fájl létrehozása sikertelen - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - Első és utolsó szelet letöltése először: %1, torrent: '%2' - - - - On - Be - - - - Off - Ki - - - - Successfully moved torrent: %1. New path: %2 - A torrent sikeresen átmozgatva: %1. Új útvonal: %2 - - - + Could not move torrent: '%1'. Reason: %2 - Ez a torrent nem helyezhető át: „%1”. Ok: %2 + Nem sikerült áthelyezni a torrentet: '%1'. Indok: %2 - + File sizes mismatch for torrent '%1', pausing it. - A fájlméret nem egyezik ennél a torrentnél: „%1”, szüneteltetés. + Fájl méret nem megfelelő ennél a torrentnél: '%1', szüneteltetés. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - + Gyors folytatás adat elutasítva ennél a torrentnél: '%1'. Oka: '%2'. Újraellenőrzés... CategoryFilterModel - + Categories - Kategóriák + Kategóriák - + All - Összes + Összes - + Uncategorized - Nem kategorizált + @@ -1698,42 +1359,147 @@ Add category... - Kategória hozzáadása… + Kategória hozzáadása… Add subcategory... - Alkategória hozzáadása… + - Edit category... - Kategória szerkesztése… + Remove category + Kategória eltávolítása + + + + Remove unused categories + Nem használt kategóriák eltávolítása + + + + Resume torrents + Torrentek folytatása + + + + Pause torrents + Torrentek szüneteltetése + + + + Delete torrents + Torrentek törlése + + + + New Category + Új kategória + + + + Category: + Kategória: + + + + Invalid category name + Érvénytelen kategórianév + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + A kategórianév nem tartalmazhat „\” karaktert. +A kategórianév nem kezdődhet/végződhet „/” karakterrel. +A kategórianév nem tartalmazhatja a „//” karaktersorozatot. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Összes (0) + + + Uncategorized (0) + Nem kategorizált (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Nem kategorizált (%1) + + + Add category... + Kategória hozzáadása… - Remove category - Kategória eltávolítása + Kategória eltávolítása - Remove unused categories - Nem használt kategóriák eltávolítása + Nem használt kategóriák eltávolítása - Resume torrents - Torrentek folytatása + Torrentek folytatása - Pause torrents - Torrentek megállítása + Torrentek szüneteltetése - Delete torrents - Torrentek törlése + Torrentek törlése + + + New Category + Új kategória + + + Category: + Kategória: + + + Invalid category name + Érvénytelen kategórianév + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + A kategórianév nem tartalmazhat „\” karaktert. +A kategórianév nem kezdődhet/végződhet „/” karakterrel. +A kategórianév nem tartalmazhatja a „//” karaktersorozatot. + + + All (%1) + this is for the category filter + Összes (%1) @@ -1773,220 +1539,101 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Törlés megerősítése - - - - Remember choice - - + DeletionConfirmationDlg - - Also delete the files on the hard disk - - - - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Biztosan törölni akarod a(z) '%1'-t az átviteli listából? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - - - - - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - Letöltése - - - - No URL entered - - - - - Please type at least one URL. - + Biztosan törölni akarod a következő %1 torrentet a listából? DownloadedPiecesBar - + White: Missing pieces Fehér: Hiányzó darabok - + Green: Partial pieces Zöld: Részleges darabok - + Blue: Completed pieces Kék: Befejezett darabok - ExecutionLogWidget + ExecutionLog - + General - Általános + Általános - + Blocked IPs - + Blokkolt IP címek - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> blokkolásra került %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - + <font color='red'>%1</font> kitiltásra került FeedListWidget - + RSS feeds RSS források - - - Unread (%1) - Olvasatlan (%1) + + Unread + Olvasatlan FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. + + An error occured while trying to open the log file. Logging to file is disabled. Hiba történt a naplófájl megnyitásakor. A fájlba naplózás letiltásra került. - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - - - - - &Browse... - Launch file dialog button text (full) - &Tallózás… - - - - Choose a file - Caption for file open/save dialog - Válasszon fájlt - - - - Choose a folder - Caption for directory open dialog - Válasszon mappát - - - - Any file - Bármely fájl - - - FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - I/O hiba: Nem sikerült olvasásra megnyitni az IP-szűrő fájlt. + + + + I/O Error: Could not open ip filter file in read mode. + I/O Hiba: Nem sikerült olvasásra megnyitni az ip szűrő fájlt. - - - - IP filter line %1 is malformed. - A(z) %1. IP-szűrő sor rosszul formázott. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - A(z) %1. IP-szűrő sor rosszul formázott. Az IP-tartomány kezdete rosszul formázott. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - A(z) %1. IP-szűrő sor rosszul formázott. Az IP-tartomány vége rosszul formázott. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - A(z) %1. IP-szűrő sor rosszul formázott. Az egyik vége IPv4, a másik pedig IPv6 cím! - - - - - IP filter exception thrown for line %1. Exception is: %2 - IP-szűrő kivétel dobódott a(z) %1. sorban. A kivétel: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - - - - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. Feldolgozás hiba: A szűrő fájl nem egy érvényes PeerGuardian P2B fájl. @@ -1994,396 +1641,472 @@ GeoIPDatabase - - + + Unsupported database file size. Nem támogatott adatbázis fájl méret. - + Metadata error: '%1' entry not found. Metaadat hiba: '%1' bejegyzés nem található. - + Metadata error: '%1' entry has invalid type. Metaadat hiba: '%1' bejegyzésnek érvénytelen típusa van. - + Unsupported database version: %1.%2 Nem támogatott adatbázis verzió: %1.%2 - + Unsupported IP version: %1 Nem támogatott IP verzió: %1 - + Unsupported record size: %1 Nem támogatott rekord méret: %1 - + Invalid database type: %1 Érvénytelen adatbázis típus: %1 - + Database corrupted: no data section found. Adatbázis sérült: nem található adat szakasz. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - A HTTP kérésméret túllépte a korlátot, a foglalat lezárása. Korlát: %ld, IP: %s + + File + Fájl - - Bad Http request, closing socket. IP: %s - Hibás HTTP kérés, a foglalat lezárása. IP: %s + + Edit + Szerkesztés - - - HttpServer - + + Help + Súgó + + + Exit qBittorrent qBittorrent bezárása - + Only one link per line Soronként csak egy linket - + + Download + Letöltés + + + Global upload rate limit must be greater than 0 or disabled. Letöltési korlátnak 0-nál nagyobbnak, vagy kikapcsoltnak kell lennie. - + Global download rate limit must be greater than 0 or disabled. Letöltési korlátnak 0-nál nagyobbnak, vagy kikapcsoltnak kell lennie. - + Alternative upload rate limit must be greater than 0 or disabled. A feltöltési korlátnak 0-nál nagyobbnak, vagy kikapcsoltnak kell lennie. - + Alternative download rate limit must be greater than 0 or disabled. A feltöltési korlátnak 0-nál nagyobbnak, vagy kikapcsoltnak kell lennie. - + Maximum active downloads must be greater than -1. - Maximum aktív letöltéseknek nagyobbnak kell lennie, mint -1. + A maximum aktív letöltéseknek nagyobbnak kell lenni, mint -1. - + Maximum active uploads must be greater than -1. - Maximum aktív feltöltéseknek nagyobbnak kell lennie, mint -1. + A maximum aktív feltöltéseknek nagyobbnak kell lenni, mint -1. - + Maximum active torrents must be greater than -1. A maximum aktív torrenteknek nagyobbnak kell lenni, mint -1. - + Maximum number of connections limit must be greater than 0 or disabled. A maximális kapcsolatok számának 0-nál nagyobbnak, vagy kikapcsoltnak kell lennie. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. A maximális kapcsolatok számának torrentenként 0-nál nagyobbnak, vagy kikapcsoltnak kell lennie. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. A maximális feltöltési szálak korlátnak torrentenként 0-nál nagyobbnak, vagy kikapcsoltnak kell lennie. - + Unable to save program preferences, qBittorrent is probably unreachable. Nem sikerült menteni a beállításokat. A qBittorrent valószínüleg nem elérhető. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent a Freenode-on - - - - Invalid category name: -Please do not use any special characters in the category name. - Érvénytelen kategórianév: -Ne használjon különleges karaktereket a kategórianévben. + + Language + Nyelv - - Unknown - Ismeretlen - - - - Hard Disk - Merevlemez - - - - Share ratio limit must be between 0 and 9998. - A megosztási arány 0 és 9998 között kell legyen. - - - - Seeding time limit must be between 0 and 525600 minutes. - A megosztási időkorlát 0 és 525600 perc között kell legyen. - - - + The port used for incoming connections must be between 1 and 65535. A bejövő kapcsolatokhoz használt portnak 1024 és 65535 közé kell esnie. - + The port used for the Web UI must be between 1 and 65535. A Web UI-hoz használt portnak 1024 és 65535 közé kell esnie. - + Unable to log in, qBittorrent is probably unreachable. Nem sikerült bejelentkezni, qBittorrent talán elérhetetlen. - + Invalid Username or Password. Érvénytelen felhasználónév vagy jelszó. - - Username - Felhasználónév - - - + Password Jelszó - + Login Bejelentkezés - + + Upload Failed! + Feltöltés sikertelen! + + + Original authors Eredeti szerzők - fejlesztők - + + Upload limit: + Feltöltési korlát: + + + + Download limit: + Letöltési korlát: + + + Apply Alkalmaz - + Add Hozzáad - + + Category: + Kategória: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Torrentek feltöltése - + + All + Összes + + + + Downloading + Letöltés + + + + Seeding + Seedelés + + + + Completed + Befejeződött + + + + Resumed + Folytatva + + + + Paused + Szüneteltetve + + + + Active + Aktív + + + + Inactive + Inaktív + + + Save files to location: Letöltés helye: - + Cookie: Süti: - + Type folder here Ide írja be a könyvtár nevét - + + Run an external program on torrent completion + Külső program futtatása a torrent befejezésekor + + + + Enable bandwidth management (uTP) + Sávszélesség menedzsment (uTP) engedélyezése + + + + Apply rate limit to uTP connections + Korlátok alkalmazása uTP kapcsolatokra is + + + + Alternative Global Rate Limits + Alternatív Globális Sebességkorlátok + + + More information - További információ + További információk - + Information about certificates Információk a tanúsítványokról - + Save Files to Fájlok mentési helye: - - Set location - Hely megadása - - - - Limit upload rate - Feltöltési arány korlátozása + + Watch Folder + Könyvtár figyelése - - Limit download rate - Letöltési arány korlátozása + + Default Folder + Alapértelmezett mappa - - Rename torrent - Torrent átnevezése + + from + from time1 to time2 + Ettől: - - Unable to create category - + + to + from time1 to time2 + Eddig: - + Other... Save Files to: Watch Folder / Default Folder / Other... Egyéb... - + + Every day + Schedule the use of alternative rate limits on ... + Minden nap + + + + Week days + Schedule the use of alternative rate limits on ... + Hétköznapok + + + + Week ends + Schedule the use of alternative rate limits on ... + Hétvégék + + + Monday Schedule the use of alternative rate limits on ... Hétfő - + Tuesday Schedule the use of alternative rate limits on ... Kedd - + Wednesday Schedule the use of alternative rate limits on ... Szerda - + Thursday Schedule the use of alternative rate limits on ... Csütörtök - + Friday Schedule the use of alternative rate limits on ... Péntek - + Saturday Schedule the use of alternative rate limits on ... Szombat - + Sunday Schedule the use of alternative rate limits on ... Vasárnap - + + Downloaded + Is the file downloaded or not? + Letöltve + + + Logout Kijelentkezés - + + Download from URLs + Letöltés URL-ekről + + + Download Torrents from their URLs or Magnet links Torrent letöltése URL-ről vagy Magnet linkről - + Upload local torrent Helyi torrent feltöltése - + Are you sure you want to delete the selected torrents from the transfer list? Egészen biztos, hogy törlöd az átviteli listáról? - + Save Mentés - + qBittorrent client is not reachable A qBittorent kliens nem elérhető - - qBittorrent has been shutdown. - A qBittorrent leállításra került. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Fehérlistán lévő IP alhálózatok + + HTTP Server + HTTP Szerver - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Példa: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + A következő paraméterek támogatottak: - - Add subnet - Alhálózat hozzáadása + + Torrent path + Torrent útvonal - - Delete - Törlés + + Torrent name + Torrent név - - Error - Hiba + + qBittorrent has been shutdown. + A qBittorrent leállításra került. + + + LineEdit - - The entered subnet is invalid. - A megadott alhálózat érvénytelen. + + Clear the text + Szöveg törlése LogListWidget - + Copy Másolás - + Clear Töröl @@ -2416,709 +2139,646 @@ A letöltések &végeztével - + &View &Nézet - + &Options... Beállítás&ok... - + &Resume &Folytatás - + Torrent &Creator Torrent &készítő - + Set Upload Limit... Feltöltési korlát megadása... - + Set Download Limit... Letöltési korlát megadása... - + Set Global Download Limit... Globális letöltési korlát megadása... - + Set Global Upload Limit... Globális feltöltési korlát megadása... - + Minimum Priority Minimum priorítás - + Top Priority Top priorítás - + Decrease Priority Prioritás csökkentése - + Increase Priority Prioritás növelése - - + + Alternative Speed Limits Alternatív sebességkorlátok - + &Top Toolbar - Felső &panel + Felső &eszköz panel - + Display Top Toolbar Felső eszköztár megjelenítése - - Status &Bar - Állapot&sor - - - + S&peed in Title Bar - &Sebesség a címsorban + &Sebesség a címsoron - + Show Transfer Speed in Title Bar Átviteli sebesség mutatása a címsorban - + &RSS Reader &RSS olvasó - + Search &Engine - Kereső&motor + Keresőmotor - + L&ock qBittorrent - qBittorrent &lezárása + qBittorrent zárolása - + Do&nate! - Projekt támogatása! - - - - Close Window - Ablak bezárása + Adomány! - + R&esume All Összes &folytatása - + Manage Cookies... Sütik kezelése… - + Manage stored network cookies Tárolt hálózati sütik kezelése - + Normal Messages Normál üzenetek - + Information Messages Információs üzenetek - + Warning Messages Figyelmeztető üzenetek - + Critical Messages Kritikus üzenetek - + &Log &Napló - + &Exit qBittorrent &qBittorrent bezárása - + &Suspend System - Számítógép &altatása + &Számítógép felfüggesztése - + &Hibernate System - Számítógép &hibernálása + &Rendszer hibernálása - + S&hutdown System - Számítógép &leállítása + Számítógép leállítása - + &Disabled &Kikapcsolva - + &Statistics &Statisztika - + Check for Updates Frissítések ellenőrzése - + Check for Program Updates - Frissítések keresése program indításakor + Frissítések keresése indításkor - + &About &Névjegy - + &Pause &Szünet - + &Delete &Törlés - + P&ause All Összes le&állítása - + &Add Torrent File... Torrent hozzá&adása... - + Open Megnyitás - + E&xit - &Kilépés + Kilépés - + Open URL URL megnyitása - + &Documentation &Dokumentáció - + Lock Zárolás - - - + + + Show Mutat - + Check for program updates Frissítések keresése indításkor - + Add Torrent &Link... Torrent &Link Hozzáadása... - + If you like qBittorrent, please donate! Ha kedveled a qBittorrentet, kélek támogasd! - - + Execution Log Napló - + Clear the password Jelszó törlése - + Filter torrent list... Torrent lista szűrése... - + &Set Password &Jelszó beállítása - - Preferences - Beállítások - - - + &Clear Password &Jelszó törlése - + Transfers Átvitelek - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Torrent fájl társítás - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? A qBittorrent nem az alapértelmezett .torrent vagy Magnet link kezelő alkalmazás. Szeretnéd alapértelmezetté tenni? - + Icons Only Csak ikonok - + Text Only Csak szöveg - + Text Alongside Icons Szöveg az ikonok mellett - + Text Under Icons Szöveg az ikonok alatt - + Follow System Style Rendszer kinézetének követése - - - + + + UI lock password UI jelszó - - - + + + Please type the UI lock password: Kérlek add meg az UI jelszavát: - + The password should contain at least 3 characters A jelszónak legalább 3 karaktert kell tartalmaznia - + Password update Jelszó frissítés - + The UI lock password has been successfully updated Az UI jelszó sikeresen frissítve - + Are you sure you want to clear the password? Biztosan ki akarod törölni a jelszót? - - Use regular expressions - - - - + Search Keresés - + Transfers (%1) Átvitelek (%1) - + Error Hiba - + Failed to add torrent: %1 Torrent hozzáadása nem sikerült: %1 - + Torrent added Torrent hozzáadva - + '%1' was added. e.g: xxx.avi was added. „%1” hozzáadva. - + Download completion Elkészült letöltés - + I/O Error i.e: Input/Output Error I/O Hiba - + Recursive download confirmation Letöltés ismételt megerősítése - + Yes Igen - + No Nem - + Never Soha - + Global Upload Speed Limit Teljes feltöltési sebesség korlát - + Global Download Speed Limit Teljes letöltési sebesség korlát - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - A qBittorrent frissült, és újra kell indítani a változások életbe lépéséhez. - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - Néhány fájl átvitele folyamatban van. - - - - Are you sure you want to quit qBittorrent? - Biztosan ki akar lépni a qBittorrentből? - - - + &No &Nem - + &Yes &Igen - + &Always Yes &Mindig igen - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter - Régi Python Interpreter + Elavult Python bővítmény - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. A telepített Python verzió (%1) elavult. A legújabb verzió szükséges a keresőmotorok működéséhez. Minimális követelmény: 2.7.9 / 3.3.0. - + qBittorrent Update Available Elérhető qBittorrent frissítés - + + A new version is available. +Do you want to download %1? + Egy új verzió érhető el. +Frissítés a %1 verzióra? + + + Already Using the Latest qBittorrent Version Már a legújabb verziót használod - + Undetermined Python version Ismeretlen Python verzió - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. '%1' befejezte a letöltést. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. Reason: disk is full. - I/O hiba történt ennél a torrentnél '%1'. -Indok: '%2' + I/O hiba történt ennél a torrentnél '%1'. Oka: '%2' - + The torrent '%1' contains torrent files, do you want to proceed with their download? A '%1' torrent .torrent fájlokat is tartalmaz. Szeretnéd folytatni a letöltést? - + Couldn't download file at URL '%1', reason: %2. - Nem sikerült a fájlt letölteni az URL címről: '%1', indok: %2. + Nem sikerült letölteni URL címről: '%1', mert: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin Python észlelve itt %1: %2javascript:; - - + + Couldn't determine your Python version (%1). Search engine disabled. + Nem lehet megállapítani a Python verzióját (%1). A keresőmező ki lett kapcsolva. + + + + Missing Python Interpreter Hiányzó Python Interpreter - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? A kereső használatához Python szükséges, de úgy tűnik nincs telepítve. Szeretnéd most telepíteni? - + Python is required to use the search engine but it does not seem to be installed. A keresőhöz Python szükséges, de nincs installálva. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. Nincs elérhető frissítés. A legfrissebb verziót használod. - + &Check for Updates - &Frissítések keresése + &Frissítések ellenőrzése - + Checking for Updates... Frissítések keresése... - + Already checking for program updates in the background A frissítések keresése már fut a háttérben - + Python found in '%1' - Python megtalálva: '%1' + Python verzió: %1 - + Download error Letöltési hiba - + Python setup could not be downloaded, reason: %1. Please install it manually. A Python telepítőt nem sikerült letölteni, mivel: %1. Kérlek telepítsd fel kézzel. - - + + Invalid password Érvénytelen jelszó - - - + + RSS (%1) RSS (%1) - + URL download error URL letöltés hiba - + The password is invalid A jelszó érvénytelen - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Letöltési sebsesség: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Feltöltési sebesség: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [L: %1/s, F: %2/s] qBittorrent %3 - + Hide Elrejt - + Exiting qBittorrent qBittorrent bezárása - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Néhány átvitel még folyamatban van. +Biztos, hogy bezárod a qBittorrentet? + + + Open Torrent Files Torrent Fájl Megnyitása - + Torrent Files Torrent Fájlok - + Options were saved successfully. Beállítások sikeresen elmentve. @@ -3126,1466 +2786,1356 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. A dinamikus DNS sikeresen frissítve. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Dinamikus DNS hiba: A szolgáltatás jelenleg nem elérhető. Újbóli próbálkozás 30 perc múlva. - + Dynamic DNS error: hostname supplied does not exist under specified account. Dinamikus DNS hiba: a hostnév nem található a megadott felhasználói fióknál. - + Dynamic DNS error: Invalid username/password. Dinamikus DNS hiba: Érvénytelen felhasználónév/jelszó. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Dinamikus DNS hiba: a qBittorrent feketelistára került a szolgáltató által, kérem jelezze ezt a http://bugs.qbittorrent.org címen. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Dinamikus DNS hiba: %1 választ küldött a kiszolgáló, kérem jelezze ezt a http://bugs.qbittorrent.org címen. - + Dynamic DNS error: Your username was blocked due to abuse. Dinamikus DNS hiba: A felhasználónév letiltásra került visszaélés miatt. - + Dynamic DNS error: supplied domain name is invalid. - Dinamikus DNS hiba: Érvénytelen a megadott domain név. + Dinamikus DNS hiba: a megadott kiszolgálónév érvénytelen. - + Dynamic DNS error: supplied username is too short. - Dinamikus DNS hiba: A megadott felhasználónév túl rövid. + Dinamikus DNS hiba: a megadott felhasználónév túl rövid. - + Dynamic DNS error: supplied password is too short. - Dinamikus DNS hiba: A megadott jelszó túl rövid. + Dinamikus DNS hiba: a megadott jelszó túl rövid. Net::DownloadHandler - + I/O Error I/O Hiba - + The file size is %1. It exceeds the download limit of %2. A fájl mérete %1. Ez meghaladja a(z) %2 letöltési korlátját. - + Unexpected redirect to magnet URI. Váratlan átirányítás magnet URI-ra. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - + + + GeoIP database loaded. Type: %1. Build time: %2. + GeoIP adatbázis betöltve. Típus: %1. Létrehozás ideje: %2. - - The operation was canceled - + + + Couldn't load GeoIP database. Reason: %1 + GeoIP adatbázist nem lehet betölteni. Ok: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - + + Venezuela, Bolivarian Republic of + Venezuelai Bolivári Köztársaság - - The connection to the remote server timed out - + + Viet Nam + Vietnam - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - GeoIP adatbázis betöltve. Típus: %1. Létrehozás ideje: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - GeoIP adatbázist nem lehet betölteni. Ok: %1 - - - - Venezuela, Bolivarian Republic of - Venezuelai Bolivári Köztársaság - - - - Viet Nam - Vietnam - - - - + + N/A N/A - + Andorra Andorra - + United Arab Emirates Egyesült Arab Emírségek - + Afghanistan Afganisztán - + Antigua and Barbuda Antigua és Barbuda - + Anguilla Anguilla - + Albania Albánia - + Armenia Örményország - + Angola Angola - + Antarctica Antarktisz - + Argentina Argentína - + American Samoa Amerikai Szamoa - + Austria Ausztria - + Australia Ausztrália - + Aruba Aruba - + Azerbaijan Azerbajdzsán - + Bosnia and Herzegovina Bosznia-Hercegovina - + Barbados Barbados - + Bangladesh Banglades - + Belgium Belgium - + Burkina Faso Burkina Faso - + Bulgaria Bulgária - + Bahrain Bahrain - + Burundi Burundi - + Benin Benin - + Bermuda Bermuda - + Brunei Darussalam Brunei Szultanátus - + Brazil Brazília - + Bahamas Bahama-szigetek - + Bhutan Bhután - + Bouvet Island Bouvet-sziget - + Botswana Botswana - + Belarus Belorusszia - + Belize Belize - + Canada Kanada - + Cocos (Keeling) Islands Kókusz (Keeling)-szigetek - + Congo, The Democratic Republic of the Kongói Demokratikus Köztársaság - + Central African Republic Közép-Afrikai Köztársaság - + Congo Kongó - + Switzerland Svájc - + Cook Islands Cook-szigetek - + Chile Chile - + Cameroon Kamerun - + China Kína - + Colombia Kolumbia - + Costa Rica Costa Rica - + Cuba Kuba - + Cape Verde Zöld-foki Köztársaság - + Curacao Curaçao - + Christmas Island Karácsony-sziget - + Cyprus Ciprus - + Czech Republic Cseh Köztársaság - + Germany Németország - + Djibouti Dzsibuti - + Denmark Dánia - + Dominica Dominika - + Dominican Republic Dominikai Köztársaság - + Algeria Algéria - + Ecuador Ecuador - + Estonia Észtország - + Egypt Egyiptom - + Western Sahara Nyugat-Szahara - + Eritrea Eritrea - + Spain Spanyolország - + Ethiopia Etiópia - + Finland Finnország - + Fiji Fidzsi-szigetek - + Falkland Islands (Malvinas) Falkland-szigetek - + Micronesia, Federated States of Mikronéziai Szövetségi Államok - + Faroe Islands Feröer-szigetek - + France Franciaország - + Gabon Gabon - + United Kingdom Egyesült Királyság - + Grenada Grenada - + Georgia Grúzia - + French Guiana Francia Guyana - + Ghana Ghána - + Gibraltar Gibraltár - + Greenland Grönland - + Gambia Gambia - + Guinea Guinea - + Guadeloupe Guadeloupe - + Equatorial Guinea Egyenlítői-Guinea - + Greece Görögország - + South Georgia and the South Sandwich Islands Déli-Georgia és Déli-Sandwich-szigetek - + Guatemala Guatemala - + Guam Guam - + Guinea-Bissau Bissau-Guinea - + Guyana Guyana - + Hong Kong Hong Kong - + Heard Island and McDonald Islands Heard-sziget és McDonald-szigetek - + Honduras Honduras - + Croatia Horvátország - + Haiti Haiti - + Hungary Magyarország - + Indonesia Indonézia - + Ireland Írország - + Israel Izrael - + India India - + British Indian Ocean Territory Brit Indiai-óceáni Terület - + Iraq Irak - + Iran, Islamic Republic of Iráni Iszlám Köztársaság - + Iceland Izland - + Italy Olaszország - + Jamaica Jamaica - + Jordan Jordánia - + Japan Japán - + Kenya Kenya - + Kyrgyzstan Kirgizisztán - + Cambodia Kambodzsa - + Kiribati Kiribati - + Comoros Comore-szigetek - + Saint Kitts and Nevis Saint Kitts és Nevis - + Korea, Democratic People's Republic of Koreai Népi Demokratikus Köztársaság - + Korea, Republic of Dél-Korea - + Kuwait Kuvait - + Cayman Islands Kajmán-szigetek - + Kazakhstan Kazahsztán - + Lao People's Democratic Republic Laoszi Népi Demokratikus Köztársaság - + Lebanon Libanon - + Saint Lucia Saint Lucia - + Liechtenstein Liechtenstein - + Sri Lanka Sri Lanka - + Liberia Libéria - + Lesotho Lesotho - + Lithuania Litvánia - + Luxembourg Luxemburg - + Latvia Lettország - + Morocco Marokkó - + Monaco Monaco - + Moldova, Republic of Moldovai Köztársaság - + Madagascar Madagaszkár - + Marshall Islands Marshall-szigetek - + Mali Mali - + Myanmar Mianmar - + Mongolia Mongólia - + Northern Mariana Islands Északi-Mariana-szigetek - + Martinique Martinique - + Mauritania Mauritánia - + Montserrat Montserrat - + Malta Málta - + Mauritius Mauritius - + Maldives Maldív-szigetek - + Malawi Malawi - + Mexico Mexikó - + Malaysia Malajzia - + Mozambique Mozambik - + Namibia Namíbia - + New Caledonia Új-Kaledónia - + Niger Niger - + Norfolk Island Norfolk-sziget - + Nigeria Nigéria - + Nicaragua Nicaragua - + Netherlands Hollandia - + Norway Norvégia - + Nepal Nepál - + Nauru Nauru - + Niue Niue - + New Zealand Új-Zéland - + Oman Omán - + Panama Panama - + Peru Peru - + French Polynesia Francia Polinézia - + Papua New Guinea Pápua Új-Guinea - + Philippines Fülöp-szigetek - + Pakistan Pakisztán - + Poland Lengyelország - + Saint Pierre and Miquelon Saint-Pierre és Miquelon - + Puerto Rico Puerto Rico - + Portugal Portugália - + Palau Palau - + Paraguay Paraguay - + Qatar Katar - + Reunion Réunion - + Romania Románia - + Russian Federation Orosz Föderáció - + Rwanda Ruanda - + Saudi Arabia Szaud-Arábia - + Solomon Islands Salamon-szigetek - + Seychelles Seychelle-szigetek - + Sudan Szudán - + Sweden Svédország - + Singapore Szingapúr - + Slovenia Szlovénia - + Svalbard and Jan Mayen Svalbard és Jan Mayen - + Slovakia Szlovákia - + Sierra Leone Sierra Leone - + San Marino San Marino - + Senegal Szenegál - + Somalia Szomália - + Suriname Suriname - + Sao Tome and Principe São Tomé és Príncipe - + El Salvador El Salvador - + Syrian Arab Republic Szíriai Arab Köztársaság - + Swaziland Szváziföld - + Turks and Caicos Islands Turks- és Caicos-szigetek - + Chad Csád - + French Southern Territories Francia déli és antarktiszi területek - + Togo Togo - + Thailand Thaiföld - + Tajikistan Tádzsikisztán - + Tokelau Tokelau-szigetek - + Turkmenistan Türkmenisztán - + Tunisia Tunézia - + Tonga Tonga - - Could not decompress GeoIP database file. - Nem lehet kibontani GeoIP adatbázis fájlt. - - - + Timor-Leste Kelet-Timor - + Bolivia, Plurinational State of Bolíviai Többnemzetiségű Állam - + Bonaire, Sint Eustatius and Saba Bonaire, Sint Eustatius és Saba - + Cote d'Ivoire Elefántcsontpart - + Libya Líbia - + Saint Martin (French part) Szent Márton-sziget (Francia rész) - + Macedonia, The Former Yugoslav Republic of Macedónia Volt Jugoszláv Köztársaság - + Macao Makaó - + Pitcairn Pitcairn-szigetek - + Palestine, State of Palesztina - + Saint Helena, Ascension and Tristan da Cunha Szent Ilona, Ascension és Tristan da Cunha - + South Sudan Dél-Szudán - + Sint Maarten (Dutch part) Sint Maarten (Holland rész) - + Turkey Törökország - + Trinidad and Tobago Trinidad és Tobago - + Tuvalu Tuvalu - + Taiwan Tajvan - + Tanzania, United Republic of Tanzániai Egyesült Köztársaság - + Ukraine Ukrajna - + Uganda Uganda - + United States Minor Outlying Islands Amerikai Csendes-óceáni-szigetek - + United States Egyesült Államok - + Uruguay Uruguay - + Uzbekistan Üzbegisztán - + Holy See (Vatican City State) Apostoli Szentszék - + Saint Vincent and the Grenadines Saint Vincent és a Grenadine-szigetek - + Virgin Islands, British Brit Virgin-szigetek - + Virgin Islands, U.S. Amerikai Virgin-szigetek - + Vanuatu Vanuatu - + Wallis and Futuna Wallis és Futuna - + Samoa Szamoa - + Yemen Jemen - + Mayotte Mayotte - + Serbia Szerbia - + South Africa Dél-afrikai Köztársaság - + Zambia Zambia - + Montenegro Montenegro - + Zimbabwe Zimbabwe - + Aland Islands Åland-szigetek - + Guernsey Guernsey-sziget - + Isle of Man Man-sziget - + Jersey Jersey - + Saint Barthelemy Saint-Barthélemy - + + Could not uncompress GeoIP database file. + Nem lehet kibontani GeoIP adatbázis fájlt. + + + Couldn't save downloaded GeoIP database file. Nem lehet menteni a letöltött GeoIP adatbázis fájlt. - + Successfully updated GeoIP database. GeoIP adatbázis sikeresen frissítve. - + Couldn't download GeoIP database file. Reason: %1 Nem lehet letölteni GeoIP adatbázis fájlt. Ok: %1 @@ -4593,20 +4143,20 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] - UPnP / NAT-PMP támogatás [BE] + UPnP / NAT-PMP támogatás [ON] - + UPnP / NAT-PMP support [OFF] - UPnP / NAT-PMP támogatás [KI] + UPnP / NAT-PMP támogatás [OFF] Net::Smtp - + Email Notification Error: Email értesítés hiba: @@ -4614,1277 +4164,1077 @@ OptionsDialog - + Options Beállítások - + Behavior Viselkedés - + Downloads Letöltések - + Connection Kapcsolat - + Speed Sebesség - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI Webes felület - + Advanced Speciális - + Language Nyelv - + User Interface Language: Felület nyelve: - + (Requires restart) (Újraindítást igényel) - + Transfer List Átviteli lista - + Confirm when deleting torrents Torrentek törlésének megerősítése - + Use alternating row colors In transfer list, one every two rows will have grey background. Váltakozó sorszínezés használata - + Hide zero and infinity values Nulla és végtelen értékek elrejtése - + Always Mindig - + Paused torrents only Csak szüneteltetett torrentek esetén - + Action on double-click Dupla kattintás esetén - + Downloading torrents: Aktív letöltéseknél: - - + + Start / Stop Torrent Torrent elindítása / megállítása - - + + Open destination folder Célkönyvtár megnyitása - - + + No action Nincs művelet - + Completed torrents: Letöltött torrenteknél: - + Desktop Asztal - + Start qBittorrent on Windows start up A qBittorrent indítása a rendszer indulásakor - + Show splash screen on start up Indítókép megjelenítése - + Start qBittorrent minimized A qBittorrent indítása a háttérben - + Confirmation on exit when torrents are active Megerősítés kérése kilépéskor, aktív torrentek esetén - + Confirmation on auto-exit when downloads finish Megerősítés kérése automatikus kilépéskor, amikor a letöltések befejeződnek - - KiB - KiB - - - - Email notification &upon download completion - E-mail értesítés a letöltés &végén - - - - Run e&xternal program on torrent completion - Külső &program indítása a letöltés végén - - - - IP Fi&ltering - &IP-szűrés - - - - Schedule &the use of alternative rate limits - Alternatív sebesség&korlátok ütemezése - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">További információ</a>) - - - - &Torrent Queueing - &Torrent ütemezés - - - - Seed torrents until their seeding time reaches - Torrent megosztása a megosztási idői lejártáig - - - - A&utomatically add these trackers to new downloads: - Ezen trackerek a&utomatikus hozzáadása az új letöltésekhez: - - - - RSS Reader - RSS olvasó - - - - Enable fetching RSS feeds - RSS csatornák lekérdezésének engedélyezése - - - - Feeds refresh interval: - Csatornák frissítési időköze: - - - - Maximum number of articles per feed: - A csatornánkénti cikkek legnagyobb száma: - - - - - min - minutes - perc - - - - RSS Torrent Auto Downloader - Automata RSS torrent letöltő - - - - Enable auto downloading of RSS torrents - Az RSS torrentek automatikus letöltésének engedélyezése - - - - Edit auto downloading rules... - Automatikus letöltési szabályok szerkesztése… - - - - Web User Interface (Remote control) - Webes felhasználói felület (Távoli elérés) - - - - IP address: - IP-cím: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - - - - - Server domains: - Kiszolgáló domainek: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - Fehérlista a HTTP Host fejléc értékek szűrésére. -A DNS újrakötési támadások ellen, -írja be a WebUI kiszolgáló domain neveit. - -Használja a „;” karaktert az elválasztásra, ha több is van. A „*” helyettesítő karakter is használható. - - - - &Use HTTPS instead of HTTP - &HTTPS használata HTTP helyett - - - - Bypass authentication for clients on localhost - Hitelesítés mellőzése a helyi gépen lévő klienseknél - - - - Bypass authentication for clients in whitelisted IP subnets - Hitelesítés mellőzése a fehérlistára tett IP alhálózatokban lévő klienseknél - - - - IP subnet whitelist... - IP alhálózat fehérlista… - - - - Upda&te my dynamic domain name - &Dinamikus domain név frissítése + + Show qBittorrent in notification area + A qBittorrent megjelenítése az értesítési területen - + Minimize qBittorrent to notification area A qBittorrent értesítési területre helyezése minimalizáláskor - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. A qBittorrent értesítési területre helyezése bezáráskor - + Tray icon style: Tálcaikon stílusa: - + Normal Normál - + Monochrome (Dark theme) Monokróm (Sötét téma) - + Monochrome (Light theme) Monokróm (Világos téma) - + File association Fájl társítás - + Use qBittorrent for .torrent files A qBittorrent használata a .torrent fájlokhoz - + Use qBittorrent for magnet links A qBittorrent használata a magnet linkekhez - + Power Management Energiagazdálkodás - + + Inhibit system sleep when torrents are active + Az alvó üzemmód letiltása aktív torrentek esetén + + + + Log file + Naplófájl + + + Save path: Mentés helye: - + Backup the log file after: Naplófájl biztonsági mentése ennyi után: - + + MB + MB + + + Delete backup logs older than: Naplófájlok biztonsági mentéseinek törlése ennyi után: - + days Delete backup logs older than 10 months nap - + months Delete backup logs older than 10 months hónap - + years Delete backup logs older than 10 years év - + When adding a torrent Torrent hozzáadásakor - + + Display torrent content and some options + Torrent részleteinek és néhány beállításának megjelenítése + + + Bring torrent dialog to the front Torrent párbeszédablak előrehozása - + Do not start the download automatically The torrent will be added to download list in pause state Ne induljon el a letöltés automatikusan - + Should the .torrent file be deleted after adding it Törlésre kerüljön-e a .torrent fájl a hozzáadása után - + + Delete .torrent files afterwards + A .torrent fájlok törlése utána + + + Also delete .torrent files whose addition was cancelled Azon .torrent fájlok is törlődjenek, amelyek hozzáadása meg lett szakítva - + Also when addition is cancelled Akkor is, ha meg lett szakítva a hozzáadás - + Warning! Data loss possible! Figyelmeztetés! Adatvesztés lehetséges! - + Saving Management Mentéskezelés - + Default Torrent Management Mode: Alapértelmezett torrentkezelési mód: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category Az automatikus mód azt jelenti, hogy a különböző torrenttulajdonságok (pl. a mentési útvonal) a hozzátartozó kategória alapján kerülnek eldöntésre - + Manual Kézi - + Automatic Automatikus - + When Torrent Category changed: Amikor a torrent kategória megváltozik: - + Relocate torrent Torrent áthelyezése - + Switch torrent to Manual Mode Torrent kézi módba váltása - + When Default Save Path changed: Amikor az alapértelmezett mentési útvonal megváltozik: - - + + Relocate affected torrents Érintett torrentek áthelyezése - - + + Switch affected torrents to Manual Mode Érintett torrentek kézi módba váltása - + When Category changed: Amikor a kategória megváltozik: - + Use Subcategories Alkategóriák használata - + Default Save Path: Alapértelmezett mentési útvonal: - + Keep incomplete torrents in: Átmeneti fájlok helye: - + Copy .torrent files to: .torrent fájlok másolása ide: - - Show &qBittorrent in notification area - A &qBittorrent megjelenítése az értesítési területen - - - - &Log file - &Naplófájl - - - - Display &torrent content and some options - &Torrent tartalom és néhány beállítás megjelenítése - - - - Create subfolder for torrents with multiple files - Almappa készítése a több fájllal rendelkező torrentekhez - - - - De&lete .torrent files afterwards - A .torrent fájlok &törlése utána - - - + Copy .torrent files for finished downloads to: Elkészült letöltések .torrent fájlainak másolása a következő helyre: - + Pre-allocate disk space for all files Fájlok helyének lefoglalása előre - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding - - - - + Append .!qB extension to incomplete files .!qB kiterjesztés használata félkész fájloknál - - Enable recursive download dialog - - - - + Automatically add torrents from: Torrentek hozzáadása innen: - + Add entry Bejegyzés hozzáadása - + Remove entry Bejegyzés eltávolítása - + + Email notification upon download completion + E-mail értesítés a letöltés végén + + + + Destination email: + Cél e-mail: + + + SMTP server: SMTP-kiszolgáló: - + This server requires a secure connection (SSL) Ez a kiszolgáló biztonságos kapcsolatot (SSL) igényel - - + + + Authentication Hitelesítés - - - - + + + + Username: Felhasználónév: - - - - + + + + Password: Jelszó: - - Enabled protocol: - Protokoll engedélyezve: - - - - TCP and μTP - TCP és μTP + + Run external program on torrent completion + Külső program futtatása a torrent befejezésekor - + Listening Port Figyelő port - + Port used for incoming connections: Port a bejövő kapcsolatokhoz: - + Random Véletlenszerű - + Use UPnP / NAT-PMP port forwarding from my router UPnP / NAT-PMP használata a portok átirányítására - + Use different port on each startup Különböző port használata minden indításnál - + Connections Limits Kapcsolati korlátok - + Maximum number of connections per torrent: Kapcsolatok maximális száma torrentenként: - + Global maximum number of connections: Kapcsolatok maximális száma: - + Maximum number of upload slots per torrent: Feltöltési szálak száma torrentenként: - + Global maximum number of upload slots: Feltöltési szálak maximális száma: - + Proxy Server Proxy kiszolgáló - + Type: Típus: - + (None) (Nincs) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Gazdagép: - - + + Port: Port: - + Otherwise, the proxy server is only used for tracker connections Különben a proxy csak a követő kapcsolatok során kerül használatra - + Use proxy for peer connections Proxy használata az ügyfélkapcsolatokhoz - + Disable connections not supported by proxies A proxik által nem támogatott kapcsolatok tiltása - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">További információ</a>) - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection RSS csatornák, keresőmotor, szoftver frissítések vagy bármi, ami más mint a torrent átvitelek és azzal összefüggő műveletek (mint például az ügyfélcsere) közvetlen kapcsolatot fog használni - + Use proxy only for torrents Csak a torrentekhez használjon proxyt - - A&uthentication - &Hitelesítés - - - + Info: The password is saved unencrypted Infó: A jelszó titkosítás nélkül kerül elmentésre - + + IP Filtering + IP-szűrés + + + Filter path (.dat, .p2p, .p2b): Szűrő útvonala (.dat, .p2p, .p2b): - + Reload the filter Szűrő újratöltése - - Manually banned IP addresses... - Kézzel tiltott IP-címek… - - - + Apply to trackers Alkalmazás a követőkre - + Global Rate Limits Globális sebességkorlátok - - - - - - - KiB/s - KiB/s - - - - + + Upload: Feltöltés: - - + + + + + KiB/s + KiB/s + + + + Download: Letöltés: - + Alternative Rate Limits Alternatív sebességkorlátok - - + + Schedule the use of alternative rate limits + Alternatív sebességkorlátok ütemezése + + + From: from (time1 to time2) Ettől: - - + To: time1 to time2 Eddig: - + When: Ekkor: - + Every day Minden nap - + Weekdays Hétköznapokon - + Weekends Hétvégéken - + Rate Limits Settings Sebességkorlátok beállítása - + Apply rate limit to peers on LAN Korlátok alkalmazása a LAN kapcsolatokra is - + Apply rate limit to transport overhead Korlátok alkalmazása az átviteli többletre is - - + + + Enable µTP protocol + µTP protokoll engedélyezése + + + Apply rate limit to µTP protocol Korlátok alkalmazása µTP protokollra is - + Privacy Magánszféra - + Enable DHT (decentralized network) to find more peers DHT (decentralizált hálózat) engedélyezése, hogy több ügyfélt találjon - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Ügyfélcsere használata a kompatibilis kliensekkel (µTorrent, Vuze, …) - + Enable Peer Exchange (PeX) to find more peers Ügyfélcsere (PeX) engedélyezése, hogy több ügyfelet találjon - + Look for peers on your local network Ügyfelek keresése a helyi hálózaton - + Enable Local Peer Discovery to find more peers Helyi ügyfelek felkutatásának (LPD) engedélyezése, hogy több ügyfelet találjon - + Encryption mode: Titkosítás módja: - + Prefer encryption Titkosítás előnyben részesítése - + Require encryption Titkosítás megkövetelése - + Disable encryption Titkosítás kikapcsolása - + Enable when using a proxy or a VPN connection Bekapcsolás proxy vagy VPN kapcsolat esetén - + Enable anonymous mode Névtelen mód engedélyezése - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">További információk</a>) + + + + Torrent Queueing + Torrent ütemezés + + + Maximum active downloads: Aktív letöltések maximális száma: - + Maximum active uploads: Aktív feltöltések maximális száma: - + Maximum active torrents: Torrentek maximális száma: - + Do not count slow torrents in these limits A lassú torrentek figyelmen kívül hagyása a korlátoknál - - Upload rate threshold: - Feltöltési aránykorlát: - - - - Download rate threshold: - Letöltési aránykorlát: - - - - sec - seconds - mp - - - - Torrent inactivity timer: - Torrent inaktivitási időzítő: - - - + Share Ratio Limiting Megosztási arány korlátozása - + Seed torrents until their ratio reaches Torrentek megosztása eddig az arányig - + then aztán - + Pause them Szüneteltetés - + Remove them Eltávolítás - - RSS Smart Episode Filters - RSS okos epizódszűrők + + Automatically add these trackers to new downloads: + Ezen trackerek automatikus hozzáadása az új letöltésekhez: + + + + Enable Web User Interface (Remote control) + Webes felület engedélyezése (Távoli elérés) - + Use UPnP / NAT-PMP to forward the port from my router UPnP / NAT-PMP használata a portok átirányítására - + + Use HTTPS instead of HTTP + HTTPS használata HTTP helyett + + + Certificate: Tanúsítvány: - + Import SSL Certificate SSL tanusítvány importálása - + Key: Kulcs: - + Import SSL Key SSL kulcs importálása - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Információk a tanúsítványokról</a> - - Use alternative Web UI - Alternatív webes UI használata - - - - Files location: - Fájlok helye: - - - - Enable clickjacking protection - + + Bypass authentication for localhost + Hitelesítés mellőzése helyi gép esetén - - Enable Cross-Site Request Forgery (CSRF) protection - + + Update my dynamic domain name + Dinamikus domain név frissítése - + Service: Szolgáltatás: - + Register Regisztráció - + Domain name: Domain név: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! Ezeket a beállításokat bekapcsolva, <strong>véglegesen elveszítheti</strong> a .torrent fájljait! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - Ha ezek a beállítások be vannak kapcsolva, akkor a qBittorrent <strong>törli</strong> a .torrent fájlokat, ha sikeresen (első lehetőség) vagy sikertelenül (második lehetőség) a letöltési sorba kerültek. Ez <strong>nem csak</strong> a &ldquo;Torrent hozzáadása&rdquo; menüművelen, hanem a <strong>fájltípus társításon</strong>keresztül megnyitott fájlokra is érvényes + - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - Ha engedélyezi a második lehetőséget (&ldquo;Akkor is, ha meg lett szakítva a hozzáadás&rdquo;), akkor a .torrent fájl <strong>törölve lesz</strong>, akkor is ha a &ldquo;<strong>Mégse</strong>&rdquo; gombot nyomja meg a &ldquo;Torrent hozzáadása&rdquo; párbeszédablakon - - - - Choose Alternative UI files location - Válassz alternatív lokációt a felhasználói felület fájljainak + - + Supported parameters (case sensitive): Támogatott paraméterek (kis- és nagybetű érzékeny): - + %N: Torrent name %N: Torrent neve - + %L: Category %L: Kategória - - %G: Tags (seperated by comma) - %G: Címkék (vesszővel elválasztva) - - - + %F: Content path (same as root path for multifile torrent) %F: Tartalom útvonala (többfájlok torrenteknél ugyanaz mint a gyökér útvonal) - + %R: Root path (first torrent subdirectory path) %R: Gyökér útvonala (első torrent alkönyvtár útvonala) - + %D: Save path %D: Mentés útvonala - + %C: Number of files %C: Fájlok száma - + %Z: Torrent size (bytes) %Z: Torrent mérete (bájtok) - + %T: Current tracker - %T: Jelenlegi tracker + %T: Jelenlegi követő - + %I: Info hash %I: Hash információ - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") Tipp: Tegye a paramétereket idézőjelbe, hogy elkerülje azt, hogy az üres karaktereknél kettévágásra kerüljenek (például "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor Válassz egy megfigyelni kívánt könyvtárat - + Folder is already being monitored: A könyvtár már megfigyelés alatt van: - + Folder does not exist: A könyvtár nem létezik: - + Folder is not readable: A könyvtár nem olvasható: - + Adding entry failed Bejegyzés hozzáadása sikertelen - - - - + + Choose export directory Export könyvtár kiválasztása - - - + + + + + + Choose a save directory Mentési könyvtár választása - + Choose an IP filter file Válassz egy IP-szűrő fájlt - + All supported filters Minden támogatott szűrő - + SSL Certificate SSL tanúsítvány - + + SSL Key + SSL kulcs + + + Parsing error Feldolgozási hiba - + Failed to parse the provided IP filter Megadott IP szűrő feldogozása sikertelen - + Successfully refreshed Sikeresen frissítve - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number A következő IP szűrő sikeresen feldolgozva: %1 szabály alkalmazva. - + Invalid key Érvénytelen kulcs - + This is not a valid SSL key. Ez egy érvénytelen SSL kulcs. - + Invalid certificate Érvénytelen tanúsítvány - - Preferences - Beállítások - - - - Import SSL certificate - SSL tanúsítvány importálása - - - + This is not a valid SSL certificate. Ez egy érvénytelen SSL tanúsítvány. - - Import SSL key - SSL kulcs importálása - - - - SSL key - SSL kulcs - - - + Time Error Idő hiba - + The start time and the end time can't be the same. A kezdés és befejezés ideje nem lehet ugyanaz. - - + + Length Error Hossz hiba - + The Web UI username must be at least 3 characters long. A webes felület felhasználónevének legalább 3 karakter hosszúnak kell lennie. - + The Web UI password must be at least 6 characters long. A webes felület jelszavának legalább 6 karakter hosszúnak kell lennie. @@ -5892,72 +5242,72 @@ PeerInfo - - Interested(local) and Choked(peer) - Érdekelt (helyi) és elfojtott (partner) + + interested(local) and choked(peer) + érdekelt(helyi) és elfojtott(peer) - + interested(local) and unchoked(peer) érdekelt(helyi) és nem elfojtott(peer) - + interested(peer) and choked(local) érdekelt(peer) és elfojtott(helyi) - + interested(peer) and unchoked(local) érdekelt(helyi) és nem elfojtott(helyi) - + optimistic unchoke optimista elfojtás - + peer snubbed ügyfél félretéve - + incoming connection bejövő kapcsolat - + not interested(local) and unchoked(peer) nem érdekelt(helyi) és nem elfojtott(peer) - + not interested(peer) and unchoked(local) nem érdekelt(peer) és nem elfojtott(helyi) - + peer from PEX ügyfél PEX hálózatból - + peer from DHT ügyfél DHT hálózatból - + encrypted traffic titkosított forgalom - + encrypted handshake titkosított kézfogás - + peer from LSD ügyfél LSD hálózatból @@ -5965,193 +5315,178 @@ PeerListWidget - + IP IP - + Port Port - + Flags Flags - + Connection Kapcsolat - + Client i.e.: Client application Kliens - + Progress i.e: % downloaded Folyamat - + Down Speed i.e: Download speed Letöltési sebesség - + Up Speed i.e: Upload speed Feltöltési sebesség - + Downloaded i.e: total data downloaded Letöltve - + Uploaded i.e: total data uploaded Feltöltve - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Relevancia - + Files i.e. files that are being downloaded right now Fájlok - + Column visibility Oszlop láthatósága - + Add a new peer... Új ügyfél hozzáadása... - - + + Ban peer permanently Ügyfél kitiltása végleg - + Manually adding peer '%1'... Ügyfél kitiltva '%1'... - + The peer '%1' could not be added to this torrent. Az ügyfélt '%1' nem lehet hozzáadni ehhez a torenthez. - + Manually banning peer '%1'... Ügyfél kitiltva '%1'... - - + + Peer addition Ügyfél hozzáadása - + Country Ország - + Copy IP:port IP:port másolása - + Some peers could not be added. Check the Log for details. Néhány ügyfelet nem lehet hozzáadni. Ellenőrizd a naplót a részletekért. - + The peers were added to this torrent. Ügyfelek hozzáadva ehhez a torrenthez. - + Are you sure you want to ban permanently the selected peers? Biztos vagy benne, hogy végleg kitiltod a kiválaszott ügyfelet? - + &Yes &Igen - + &No &Nem - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - + PeersAdditionDlg - + No peer entered - + Nem lépett be peer - + Please type at least one peer. - + Kérlek adj meg legalább egy ügyfelet. - + Invalid peer - + Érvénytelen ügyfél - + The peer '%1' is invalid. - + A(z) „%1” ügyfél érvénytelen. PieceAvailabilityBar - + White: Unavailable pieces Fehér: Nem elérhető szeletek - + Blue: Available pieces Kék: Elérhető szeletek @@ -6159,336 +5494,293 @@ PiecesBar - + Files in this piece: Fájlok ebben a szeletben - + File in this piece Fájl ebben a szeletben - + File in these pieces Fájl ezekben a szeletekben - - Wait until metadata become available to see detailed information - - - - + Hold Shift key for detailed information Részletes információkért tartsa lenyomva a Shift billentyűt - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Kereső modulok - + Installed search plugins: - + Telepített kereső modulok: - + Name - Név + Név - + Version - + Verzió - + Url - + Url - - + + Enabled - - - - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - + Engedélyezve - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + További keresőmotor kiegészítőket itt tölthet le: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Új telepítése - + Check for updates - + Frissítések keresése - + Close - + Bezárás - + Uninstall - + Eltávolítás - - - + + + Yes - Igen + Igen - - - - + + + + No - Nem + Nem - + Uninstall warning - + Eltávolítás figyelmeztetés - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Néhány kiegészítőt nem lehet eltávolítani, mert a qBittorrent része. Csak azok távolíthatóak el, amelyeket saját kezűleg telepített. +Ezek a kiegészítők letiltásra kerültek. - + Uninstall success - + Sikeresen eltávolítva - + All selected plugins were uninstalled successfully - - - - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - + Minden kijelölt modul eltávolításra került. - - + + New search engine plugin URL - + Új kereső modul URL címe - - + + URL: - + URL: - + Invalid link - + Érvénytelen link - + The link doesn't seem to point to a search engine plugin. - + Úgy tűnik, a hivatkozás nem egy keresőmotor kiegészítőre mutat. - + Select search plugins - + Kereső modulok kiválasztása - + qBittorrent search plugin - + qBittorrent kereső modul - + + + + Search plugin update + Kereső modul frissítése + + + All your plugins are already up to date. - + Az összes modul naprakész. - + Sorry, couldn't check for plugin updates. %1 - + Nem sikerült lekérni a modul frissítéseket. %1 - + + + Search plugin install - + Kereső modul telepítése + + + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + "%1" kereső modul telepítésre került. - + Couldn't install "%1" search engine plugin. %2 - + Nem sikerült a "%1" kereső modult telepíteni. %2 + + + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + A(z) „%1” keresőmotor kiegészítő sikeresen frissítve. - + Couldn't update "%1" search engine plugin. %2 - + A(z) „%1” keresőmotor kiegészítő frissítése nem sikerült. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Modul forrás - + Search plugin source: - + Kereső modul forrása: - + Local file - + Helyi fájl - + Web link - + Webcím - PowerManagement + PreviewSelect - - qBittorrent is active - - - - - PreviewSelectDialog - - - Preview - Előnézet - - - + Name Név - + Size Méret - + Progress - Folyamat + Állapot - - + + Preview impossible - Az előnézet lehetetlen + Bemutató hiba - - + + Sorry, we can't preview this file - Sajnáljuk, nincs előnézet ehhez a fájlhoz - - - - Private::FileLineEdit - - - '%1' does not exist - A(z) „%1” nem létezik - - - - '%1' does not point to a directory - A(z) „%1” nem egy könyvtárra mutat - - - - '%1' does not point to a file - A(z) „%1” nem egy fájlra mutat - - - - Does not have read permission in '%1' - Nincs olvasási jogosultság ezen: „%1” - - - - Does not have write permission in '%1' - Nincs írási jogosultság ezen: „%1” + Nincs előzetes az ilyen fájlhoz. Bocs PropListDelegate - + Not downloaded Mellőzve - - + + Normal Normal (priority) Átlagos - - N/A - - - - + Do not download Do not download (priority) - Ne töltse le + Mellőzés - - + + High High (priority) Magas - + N/A + N/A + + + Mixed Mixed (priorities Kevert - - + + Maximum Maximum (priority) Maximális @@ -6497,32 +5789,32 @@ PropTabBar - + General Általános - + Trackers Trackerek - + Peers Ügyfelek - + HTTP Sources HTTP Források - + Content Tartalom - + Speed Sebesség @@ -6616,22 +5908,22 @@ Megjegyzés: - + Select All Összes kiválasztása - + Select None Egyiket sem - + Normal Normál - + High Magas @@ -6691,165 +5983,165 @@ Mentés útvonala: - + Maximum Maximális + - Do not download Mellőzés - + Never Soha - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (van %3) - - + + %1 (%2 this session) %1 (%2 ez a munkamenet) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (seedelve eddig: %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (maximum %2) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (összes %2) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (átlag %2) - + Open Megnyitás - + Open Containing Folder Tartalmazó mappa megnyitása - + Rename... Átnevezés... - + Priority Elsőbbség - + New Web seed Új Web seed - + Remove Web seed Web seed eltávolítása - + Copy Web seed URL Web seed URL másolása - + Edit Web seed URL Web seed URL szerkesztése - + + Rename the file + Fájl átnevezése + + + New name: Új név: - - + + + The file could not be renamed + A fájlt nem lehet átnevezni + + + + This file name contains forbidden characters, please choose a different one. + Ez a név tiltott karaktereket tartalmaz, kérlek válassz másik nevet. + + + + This name is already in use in this folder. Please use a different name. Ilyen nevű fájl már van a könyvtárban. Kérlek válassz másik nevet. - + The folder could not be renamed A könyvtárat nem lehet átnevezni - + qBittorrent qBittorrent - + Filter files... Fájlok szűrése... - - Renaming - Átnevezés - - - - - Rename error - Átnevezési hiba - - - - The name is empty or contains forbidden characters, please choose a different one. - A név üres vagy tiltott karaktereket tartalmaz, válasszon másikat. - - - + New URL seed New HTTP source Új URL seed: - + New URL seed: Új URL seed: - - + + This URL seed is already in the list. Ez az URL seed már a listában van. - + Web seed editing Web seed szerkesztés - + Web seed URL: Web seed URL: @@ -6857,230 +6149,117 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + Az IP címe tiltásra került a túl gyakori hibás hitelesítési kérelmek miatt. + + + + Error: '%1' is not a valid torrent file. + + Hiba: '%1' nem érvényes torrent fájl. + + + + + Error: Could not add torrent to session. + Hiba: Nem lehet hozzáadni torrentet a munkamenethez. + + + + I/O Error: Could not create temporary file. + I/O Hiba: Nem sikerült létrehozni az ideiglenes fájlt. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. A %1 egy ismeretlen parancssori paraméter. - - + + %1 must be the single command line parameter. %1 egyedüli parancssori paraméter lehet csak. - + + %1 must specify the correct port (1 to 65535). + A %1 helyes portot kell konfiguráljon (1 és 65535 között). + + + You cannot use %1: qBittorrent is already running for this user. Nem lehet használni %1: a qBittorrent már fut ennél a felhasználónál. - + Usage: Használat: - + Options: Beállítások: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - Paraméter '%1'-nek a következő szintaxist kell követnie '%1=%2' - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - Paraméter '%1'-nek a következő szintaxist kell követnie '%1=%2' - - - - Expected integer number in environment variable '%1', but got '%2' - - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - Paraméter '%1'-nek a következő szintaxist kell követnie '%1=%2' - - - - Expected %1 in environment variable '%2', but got '%3' - - - - - port - port - - - - %1 must specify a valid port (1 to 65535). - %1 érvényes portot kell megadnia (1 és 65535 között). - - - - Display program version and exit - Program verzió megjelenítése és kilépés + + Displays program version + Program verzió megjelenítése - - Display this help message and exit - Ezen súgó üzenet megjelenítése és kilépés + + Displays this help message + Ezen súgó üzenet megjelenítése - - Change the Web UI port - Web UI port módosítása + + Changes the Web UI port (current: %1) + Web UI port megváltozatása (aktuális: %1) - + Disable splash screen Induló képernyő letiltása - + Run in daemon-mode (background) daemon-mode -ban való futtatás (háttérben) - - dir - Use appropriate short form or abbreviation of "directory" - könyvtár - - - - Store configuration files in <dir> - A konfigurációs fájlok tárolása itt: <könyvtár> - - - - - name - név - - - - Store configuration files in directories qBittorrent_<name> - A konfigurációs fájlok tárolása a qBittorrent_<név> könyvtárakban - - - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - - - - - files or URLs - fájlok vagy URL-ek - - - - Download the torrents passed by the user + + Downloads the torrents passed by the user A felhasználó által engedélyezett torrentek letöltése - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - - - - - Options when adding new torrents: - Beállítások az új torrentek hozzáadásakor - - - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Gyorsbillentyű ehhez: %1 - - - - path - útvonal - - - - Torrent save path - Torrent mentési útvonal - - - - Add torrents as started or paused - Torrentek hozzáadása elindítva vagy szüneteltetve - - - - Skip hash check - Újraellenőrzés kihagyása - - - - Assign torrents to category. If the category doesn't exist, it will be created. - Torrentek kategóriákba rendezése. Ha a kategória nem létezik, akkor létre fog jönni. - - - - Download files in sequential order - Fájlok letöltése sorrendben - - - - Download first and last pieces first - Első és utolsó szeletek letöltése először - - - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - - - - - Command line parameters take precedence over environment variables - A parancssori paraméterek elsőbbséget élveznek a környezeti változókkal szemben - - - + Help Súgó - + Run application with -h option to read about command line parameters. Az alkalmazást a -h paraméterrel indítva ismerkedhet meg a parancssori paraméterekkel. - + Bad command line Rossz parancs - + Bad command line: Rossz parancs sor: - + Legal Notice Jogi figyelmeztetés - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - A qBittorrent egy fájlmegosztó program. Amikor egy torrentet futtatsz, a benne lévő adatok a te feltöltésed által lesznek elérhetőek mások számára. Minden tartalom amit megosztasz, csakis a te felelősséged. - - - - No further notices will be issued. - Ez az üzenet többször nem fog megjelenni. - - - + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. No further notices will be issued. @@ -7089,353 +6268,432 @@ Vélhetően tisztában vagy ezzel, így többé nem kapsz figyelmeztetést. - + Press %1 key to accept and continue... Nyomja meg a %1 billentyűt az elfogadás és folytatáshoz... - + Legal notice Jogi figyelmeztetés - + Cancel Mégsem - + I Agree Elfogadom - - - Upgrade - Frissítés + + Torrent name: %1 + Torrent neve: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - Egy régebbi verzióról frissítettél, ami eltérően mentett dolgokat. Át kell térned az új mentési rendszerre. Nem fogsz tudni v3.3.0-nál régebbi verziót használni újra. Folytatod? [i/n] + + Torrent size: %1 + Torrent mérete: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - Egy régebbi verzióról frissítettél, ami eltérően mentett dolgokat. Át kell térned az új mentési rendszerre. Ha folytatod, nem fogsz tudni v3.3.0-nál régebbi verziót használni újra. + + Save path: %1 + Mentés helye: %1 - - Couldn't migrate torrent with hash: %1 - Nem lehet költöztetni torrentet ezzel a hashhel: %1 + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + A torrent letöltve %1 alatt. - - Couldn't migrate torrent. Invalid fastresume file name: %1 - Nem lehet költöztetni torrentet. Érvénytelen gyorsfolytatási fájl név: %1 + + Thank you for using qBittorrent. + Köszönjük, hogy a qBittorentet használod. - - Detected unclean program exit. Using fallback file to restore settings: %1 - + + [qBittorrent] '%1' has finished downloading + [qBittorrent] %1 letöltése befejeződött - - An access error occurred while trying to write the configuration file. - Hozzáférési hiba történt a konfigurációs fájl írási kísérletekor. + + The remote host name was not found (invalid hostname) + A távoli kiszolgálónév nem található (érvénytelen hosztnév) - - A format error occurred while trying to write the configuration file. - Formázási hiba történt a konfigurációs fájl írási kísérletekor. + + The operation was canceled + A művelet megszakítva - - An unknown error occurred while trying to write the configuration file. - + + The remote server closed the connection prematurely, before the entire reply was received and processed + A távoli szerver lezárta a kapcsolatot a teljes válasz elküldése és feldolgozása előtt - - - RSS::AutoDownloader - - - Invalid data format. - Érvénytelen adatformátum. + + The connection to the remote server timed out + Időtúllépés a szervehez való kapcsolódás közben - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - Az RSS automatikus letöltő adatai nem menthetők ide: %1. Hiba: %2 + + SSL/TLS handshake failed + SSL/TLS kapcsolódás sikertelen - - Invalid data format - Érvénytelen adatformátum + + The remote server refused the connection + A szerver visszautasította a kapcsolódást - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - + + The connection to the proxy server was refused + Kapcsolódás a proxy szerverhez sikertelen - - Couldn't load RSS AutoDownloader rules. Reason: %1 - + + The proxy server closed the connection prematurely + A proxy szerver idő előtt bontotta a kapcsolatot - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - + + The proxy host name was not found + Proxy szerver név ismeretlen - - RSS feed at '%1' updated. Added %2 new articles. - + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Időtúllépés a proxy szerverhez való kapcsolódáskor, vagy a szerver nem továbbította a kérést időben - - Failed to parse RSS feed at '%1'. Reason: %2 - Nem sikerült a következő RSS csatorna olvasása '%1'. Indok: %2 + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + A proxy szerver hitelesítést kíván, de nem fogadta el a megadott belépési adatokat - - Couldn't read RSS Session data from %1. Error: %2 - + + The access to the remote content was denied (401) + Csatlakozás a távoli tartalomhoz megtagadva (401) - - Couldn't parse RSS Session data. Error: %1 - + + The operation requested on the remote content is not permitted + A kért művelet nem engedélyezett a távoli eszközön - - Couldn't load RSS Session data. Invalid data format. - + + The remote content was not found at the server (404) + A távoli tartalom nem található a szeveren (404) - - Couldn't load RSS article '%1#%2'. Invalid data format. - + + The remote server requires authentication to serve the content but the credentials provided were not accepted + A szerver hitelesítést kíván, de nem fogadja el a megadott igazolást - - - RSS::Private::Parser - - Invalid RSS feed. - Érvénytelen RSS csatorna. + + The Network Access API cannot honor the request because the protocol is not known + A Network Access API nem teljesíti a kérést, mivel a protokoll ismeretlen - - %1 (line: %2, column: %3, offset: %4). - + + The requested operation is invalid for this protocol + A kért művelet ismeretlen ebben a protokollban + + + + An unknown network-related error was detected + Ismeretlen hálózati hiba történt - - - RSS::Session - - RSS feed with given URL already exists: %1. - Már létezik RSS csatorna a megadott URL-lel: %1. + + An unknown proxy-related error was detected + Ismeretlen proxy hiba történt - - Cannot move root folder. - A gyökérkönyvtár nem mozgatható. + + An unknown error related to the remote content was detected + Ismeretlen hiba a távoli tartalomban - - - Item doesn't exist: %1. - Elem nem létezik: %1. + + A breakdown in protocol was detected + Hiba a protokollban - - Cannot delete root folder. - A gyökérkönyvtár nem törölhető. + + Unknown error + Ismeretlen hiba - - Incorrect RSS Item path: %1. - + + + Upgrade + Frissítés - - RSS item with given path already exists: %1. - + + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] + Egy régebbi verzióról frissítettél, ami eltérően mentett dolgokat. Át kell térned az új mentési rendszerre. Nem fogsz tudni v3.3.0-nál régebbi verziót használni újra. Folytatod? [i/n] - - Parent folder doesn't exist: %1. - Szülő könyvtár nem létezik: %1. + + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. + Egy régebbi verzióról frissítettél, ami eltérően mentett dolgokat. Át kell térned az új mentési rendszerre. Ha folytatod, nem fogsz tudni v3.3.0-nál régebbi verziót használni újra. + + + + Couldn't migrate torrent with hash: %1 + Nem lehet költöztetni torrentet ezzel a hashhel: %1 + + + + Couldn't migrate torrent. Invalid fastresume file name: %1 + Nem lehet költöztetni torrentet. Érvénytelen gyorsfolytatási fájl név: %1 + + + + Detected unclean program exit. Using fallback file to restore settings. + Nem rendes kilépés történt a programból. Az elmentett beállítások visszatöltésre kerülnek. + + + + An access error occurred while trying to write the configuration file. + Hozzáférési hiba történt a konfigurációs fájl írási kísérletekor. + + + + A format error occurred while trying to write the configuration file. + Formázási hiba történt a konfigurációs fájl írási kísérletekor. - RSSWidget + RSS - + Search Keresés - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - - - - + New subscription Új feliratkozás - - - + + + Mark items read Elemek olvasottnak jelölése - - Refresh RSS streams - RSS csatornák frissítése - - - + Update all Összes frissítése - + RSS Downloader... - RSS letöltő… + RSS letöltő... + + + + Settings... + Beállítások... - + Torrents: (double-click to download) - Torrentek: (dupla kattintás a letöltéshez) + Torrent: (duplaklikk a letöltéshez) - - + + Delete Törlés - + Rename... - Átnevezés… + Átnevezés... - + Rename Átnevezés - - + + Update Frissítés - + New subscription... - Új feliratkozás… + Új feliratkozás... - - + + Update all feeds Összes csatorna frissítése - + Download torrent Torrent letöltése - + Open news URL - Hír URL megnyitása + Új URL megnyitása - + Copy feed URL Csatorna URL másolása - + New folder... - Új mappa… + Új könyvtár... - - Please choose a folder name - Válasszon mappanevet + + Refresh RSS streams + RSS csatornák frissítése + + + RSSImp - - Folder name: - Mappanév: + + Stream URL: + Folyam URL: - - New folder - Új mappa + + Please type a RSS stream URL + Ez a hírcsatorna már fel van véve. + + + + This RSS feed is already in the list. + Ez az RSS csatorna már a listában van. + + + + Please choose a folder name + Kérem válasszon könyvtár nevet - - Please type a RSS feed URL - Írja be az RSS csatorna URL-ét. + + Folder name: + Könyvtár név: - - Feed URL: - Csatorna URL: + + New folder + Új könyvtár - + Deletion confirmation Törlés megerősítése - + Are you sure you want to delete the selected RSS feeds? - Biztosan törli a kiválasztott RSS csatornákat? + Biztosan törölni akarod a kiválasztott RSS csatornát? - + Please choose a new name for this RSS feed - Válasszon új nevet ehhez az RSS csatornához + Válassz új nevet ennek az RSS csatornának - + New feed name: - Új csatornanév: + Új forrás neve: - - Rename failed - Átnevezés sikertelen + + Name already in use + A név már foglalt - + + This name is already used by another item, please choose another one. + Ez a név már foglalt, kérlek válassz másikat. + + + Date: - Dátum: + Dátum: - + Author: - Szerző: + Szerző: + + + + Unread + Olvasatlan + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + A(z) „%1” automatikus letöltése a(z) „%2” RSS csatornából sikertelen, mert nem tartalmaz torrentet vagy mágneslinket… + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + A(z) „%1” torrent automatikus letöltése a(z) „%2” RSS csatornából… + + + + Rss::Private::Parser + + + Invalid RSS feed. + Érvénytelen RSS forrás. + + + + RssSettingsDlg + + + RSS Reader Settings + RSS olvasó beállításai + + + + RSS feeds refresh interval: + RSS csatornák firssítésének időköze: + + + + min + perc + + + + Maximum number of articles per feed: + Hírek maximális száma csatornánként: ScanFoldersDelegate - + Select save location Válasszon mentési helyet @@ -7443,274 +6701,268 @@ ScanFoldersModel - + Monitored Folder Megfigyelt mappa - + Override Save Location Mentési hely felülírása - + Monitored folder Megfigyelt mappa - + Default save location Alapértelmezett mentési hely - + Browse... Keresés… - SearchJobWidget + SearchEngine - - Form - + + Unknown search engine plugin file format. + Ismeretlen keresőmotor kiegészítő fájlformátum. - - Results(xxx) - + + A more recent version of this plugin is already installed. + A kiegészítő egy frissebb verziója már telepítve van. - - Search in: - + + + Plugin is not supported. + A kiegészítő nem támogatott. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - + + Update server is temporarily unavailable. %1 + A frissítési kiszolgáló ideiglenesen nem elérhető. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - + + + Failed to download the plugin file. %1 + Nem sikerült a kiegészítő fájl letöltése. %1 - - Seeds: - Feltöltők + + An incorrect update info received. + Érvénytelen frissítési információ fogadva. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - + + All categories + Összes kategória - - - to - + + Movies + Filmek - - <html><head/><body><p>Maximal number of seeds</p></body></html> - + + TV shows + TV műsorok - - - - + + Music + Zene - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + + Games + Játékok - - Size: - Méret: + + Anime + Anime - - <html><head/><body><p>Minimal torrent size</p></body></html> - + + Software + Szoftver - - <html><head/><body><p>Maximal torrent size</p></body></html> - + + Pictures + Képek + + + + Books + Könyvek + + + SearchListDelegate + + + + Unknown + Ismeretlen + + + + SearchTab - + Name i.e: file name - Név + Név - + Size i.e: file size - Méret + Méret - + Seeders i.e: Number of full sources - + Feltöltők - + Leechers i.e: Number of partial sources - + Peerek - + Search engine - - - - - Filter search results... - + Kereső oldal - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Eredmény (<i>%1</i> / <i>%2</i> megjelenítése) - + Torrent names only - + Csak torrentnevekben - + Everywhere - + Mindenhol - - Use regular expressions - - - - + Searching... - + Keresés… - + Search has finished - A keresés befejeződött + A keresés befejeződött - + Search aborted - + Keresés megszakítva - + An error occurred during search... - + Hiba történt a keresés közben… - + Search returned no results - + A keresés nem hozott eredményt - + Column visibility - - - SearchPluginManager - - Unknown search engine plugin file format. - + + Form + Űrlap - - A more recent version of this plugin is already installed. - Ennek a pluginnak egy frissebb verziója már installálva van. + + Results(xxx) + Eredmény(xxx) - - - Plugin is not supported. - A kiegészítő nem támogatott. + + Search in: + Keresés itt: - - All categories - Összes kategória + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Néhány keresőmotor a torrent leírásában és a torrentnevekben is keres. Hogy megjelennek-e az ilyen találatok, az ettől a módtól függ.</p><p><span style=" font-weight:600;">Mindenhol</span> letiltja a szűrést, és mindent megjelenít, amit a keresőmotor visszaad.</p><p><span style=" font-weight:600;">Csak torrentnevekben</span> csak azokat a torrenteket jeleníti meg, amelyek neve illeszkedik a keresésre.</p></body></html> - - Movies - Filmek + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Beállítja a feltöltők legkisebb és legnagyobb megengedett számát</p></body></html> - - TV shows - TV műsorok + + Seeds: + Feltöltők: - - Music - Zenék + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Feltöltők legkisebb száma</p></body></html> - - Games - Játékok + + + to + - - - Anime - Animék + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Feltöltők legnagyobb száma</p></body></html> - - - Software - Szoftverek + + + + + - - Pictures - Képek + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Beállítja a torrentek legkisebb és legnagyobb megengedett méretét</p></body></html> - - Books - Könyvek + + Size: + Méret: - - Update server is temporarily unavailable. %1 - A frissítési kiszolgáló ideiglenesen nem érhető el. %1 - - - - - Failed to download the plugin file. %1 - Nem sikerült letölteni a plugin fájlt. %1 - - - - An incorrect update info received. - Érvénytelen frissítési információ fogadva. + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Legkisebb torrentméret</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Legnagyobb torrentméret</p></body></html> @@ -7718,197 +6970,185 @@ - - - - + + + Search Keresés - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - - + Download Letöltése - + Go to description page Adatlap megnyitása - + Copy description page URL Leírás oldal URL másolása - + Search plugins... Modulok keresése… - + A phrase to search for. Keresendő kifejezés. - + Spaces in a search term may be protected by double quotes. A keresési kifejezésben lévő szóközök idézőjelekkel tarthatóak meg. - + Example: Search phrase example Példa: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>: keresés erre: <b>foo</b> és <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: keresés erre: <b>foo bar</b> - + All plugins Minden modul - + Only enabled Csak az engedélyezettek - + Select... Kiválasztás… - - - + + + Search Engine Keresőmotor - + Please install Python to use the Search Engine. A keresőmotor használatához telepítsd a Pythont. - + Empty search pattern Üres keresési minta - + Please type a search pattern first Kérjük, előbb adj meg egy keresési mintát - + Stop Leállítás - + Search has finished A keresés befejeződött - + Search has failed A keresés sikertelen - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + A qBittorrent most kilép. - + E&xit Now - + &Kilépés azonnal - + Exit confirmation - + Kilépés megerősítése - + The computer is going to shutdown. - + A számítógép leáll. - + &Shutdown Now - - - - - Shutdown confirmation - + &Leállítás azonnal - + The computer is going to enter suspend mode. - + A számítógép felfüggesztésre kerül. - + &Suspend Now - + &Felfüggesztés azonnal - + Suspend confirmation - + Felfüggesztés megerősítése - + The computer is going to enter hibernation mode. - + A számítógép hibernálásra kerül. - + &Hibernate Now - + &Hibernálás azonnal - + Hibernate confirmation - + Hibernálás megerősítése - + You can cancel the action within %1 seconds. - + %1 másodpercen belül még megszakíthatod a műveletet. + + + + Shutdown confirmation + Leállítás megerősítése SpeedLimitDialog - + KiB/s KiB/s @@ -7916,52 +7156,52 @@ SpeedPlotView - + Total Upload Összes Feltöltés - + Total Download Összes Letöltés - + Payload Upload Hasznos Feltöltés - + Payload Download Hasznos Letöltés - + Overhead Upload Többlet Feltöltés - + Overhead Download Többlet Letöltés - + DHT Upload DHT Feltöltés - + DHT Download DHT Letöltés - + Tracker Upload Tracker Feltöltés - + Tracker Download Tracker Letöltés @@ -7969,95 +7209,87 @@ SpeedWidget - + Period: Időszak: - + 1 Minute 1 perc - + 5 Minutes 5 perc - + 30 Minutes 30 perc - + 6 Hours 6 óra - + Select Graphs Grafikonok kiválasztása - + Total Upload Összes feltöltés - + Total Download Összes letöltés - + Payload Upload Hasznos Feltöltés - + Payload Download Hasznos Letöltés - + Overhead Upload Többlet Feltöltés - + Overhead Download Többlet Letöltés - + DHT Upload DHT feltöltés - + DHT Download DHT letöltés - + Tracker Upload Tracker Feltöltés - + Tracker Download Tracker letöltés - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8070,49 +7302,49 @@ Felhasználói statisztikák - - Cache statistics - Cache statisztika + + Total peer connections: + Összes peer-kapcsolatok száma: - - Read cache hits: - Olvasási gyorsítótár találatok: + + Global ratio: + Globális megosztási arány: - - Average time in queue: - Átlagos idő a várakozási sorban: + + Alltime download: + Mindenkori letöltés: - - Connected peers: - Kapcsolódott partnerek: + + Alltime upload: + Mindenkori feltöltés: - - All-time share ratio: - Összesített megosztási arány: + + Total waste (this session): + Összes elpazarolt (legutóbbi indítás óta): - - All-time download: - Összesített letöltés: + + Cache statistics + Cache statisztika - - Session waste: - Munkamenet selejtje: + + Read cache hits: + Olvasási gyorsítótár találatok: - - All-time upload: - Összesített feltöltés + + Average time in queue: + Átlagos idő a várakozási sorban: - Total buffer size: - Teljes pufferméret: + Total buffers size: + Teljes buffer mérete: @@ -8140,7 +7372,12 @@ Összes sorban várakozó mérete: - + + OK + OK + + + %1 ms 18 milliseconds %1 ms @@ -8149,27 +7386,32 @@ StatusBar - + Connection status: Kapcsolat állapota: - + No direct connections. This may indicate network configuration problems. Nincsenek kapcsolatok. Ez lehet hálózat beállítási hiba miatt is. - + DHT: %1 nodes DHT: %1 csomó - - qBittorrent needs to be restarted! - A qBittorrentet újra kell indítani! + + qBittorrent needs to be restarted + qBittorrent újraindítást igényel + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + A qBittorrent frissült új verzióra. Most újraindítást igényel a változások életbe lépéséhez. @@ -8188,1564 +7430,1311 @@ Online - + Click to switch to alternative speed limits Alternatív sebesség korlát bekapcsolásához kattints ide - + Click to switch to regular speed limits Általános sebesség korlát bekapcsolásához kattints ide - + + Manual change of rate limits mode. The scheduler is disabled. + Átviteli sebességek kézi változtatása. Az ütemező kikapcsolva. + + + Global Download Speed Limit Teljes letöltési sebesség korlát - + Global Upload Speed Limit Teljes feltöltési sebesség korlát - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - Összes (0) + Összes (0) - + Downloading (0) - + Letöltés (0) - + Seeding (0) - + Seed (0) - + Completed (0) - + Elkészült (0) - + Resumed (0) - + Folytatott (0) - + Paused (0) - + Szüneteltetve (0) - + Active (0) - + Aktív (0) - + Inactive (0) - + Inaktív (0) - + Errored (0) - + Hibás (0) - + All (%1) - Minden (%1) + Összes (%1) - + Downloading (%1) - + Letöltés (%1) - + Seeding (%1) - + Seed (%1) - + Completed (%1) - + Elkészült (%1) - + Paused (%1) - + Szüneteltetve (%1) - + Resumed (%1) - + Folytatott (%1) - + Active (%1) - + Aktív (%1) - + Inactive (%1) - + Inaktív (%1) - + Errored (%1) - + Hibás (%1) - TagFilterModel + TorrentContentModel - - Tags - Címkék + + Name + Név - - All - Összes + + Size + Méret - - Untagged - Címkézetlen + + Progress + Állapot - - - TagFilterWidget - - Add tag... - Címke hozzáadása… + + Download Priority + Letöltési prioritás - - Remove tag - Címke eltávolítása + + Remaining + Hátramaradt + + + TorrentCreatorDlg - - Remove unused tags - Nem használt címkék eltávolítása + + Select a folder to add to the torrent + Válaszd ki a torrenthez hozzáadandó könyvtárat - - Resume torrents - Torrentek folytatása + + Select a file to add to the torrent + Válaszd ki a torrenthez hozzáadandó fájlt - - Pause torrents - Torrentek szüneteltetése + + No input path set + Nincs bemeneti elérési út megadva - - Delete torrents - Torrentek törlése + + Please type an input path first + Kérlek adj meg előbb egy bemeneti elérési utat - - New Tag - Új címke + + Select destination torrent file + Cél torrent fájl kiválasztása - - Tag: - Címke: + + Torrent Files (*.torrent) + Torrent fájlok (*.torrent) - - Invalid tag name - Érvénytelen címkenév + + Torrent was created successfully: %1 + %1 is the path of the torrent + Torrent sikeresen létrehozva: %1 - - Tag name '%1' is invalid - A(z) „%1” címkenév érvénytelen + + + + Torrent creation + Torrent létrehozása - - Tag exists - A címke létezik + + Torrent creation was unsuccessful, reason: %1 + Torrent készítése sikertelen, indok: %1 - - Tag name already exists. - A címkenév már létezik. + + Created torrent file is invalid. It won't be added to download list. + Az elkészült torrent fájl érvénytelen. Nem lesz hozzáadva az átviteli listához. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Torrent kategória tulajdonságai + + Name + i.e: torrent name + Név - - Name: - Név: + + Size + i.e: torrent size + Méret - - Save path: - Mentési útvonal: + + Done + % Done + Elkészült - - Choose save path - Válasszon mentési útvonalat + + Status + Torrent status (e.g. downloading, seeding, paused) + Állapot - - New Category - Új kategória + + Seeds + i.e. full sources (often untranslated) + Feltöltők - - Invalid category name - Érvénytelen kategórianév + + Peers + i.e. partial sources (often untranslated) + Peerek - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - + + Down Speed + i.e: Download speed + Letöltési sebesség - - Category creation error - Kategória létrehozási hiba + + Up Speed + i.e: Upload speed + Feltöltési sebesség - - Category with the given name already exists. -Please choose a different name and try again. - Már van ilyen nevű kategória. -Válasszon egy másik nevet, és próbálja újra. + + Ratio + Share ratio + Arány - - - TorrentContentModel - - Name - Név + + ETA + i.e: Estimated Time of Arrival / Time left + Idő - - Size - Méret + + Category + Kategória - - Progress - Állapot + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Hozáadva - - Download Priority - Letöltési prioritás + + Completed On + Torrent was completed on 01/01/2010 08:00 + Elkészült - - Remaining - Hátramaradt + + Tracker + Tracker - - Availability - Elérhetőség + + Down Limit + i.e: Download limit + Letöltés limit - - - TorrentCreatorDialog - - Torrent Creator - + + Up Limit + i.e: Upload limit + Feltöltés limit - - Select file/folder to share - + + Downloaded + Amount of data downloaded (e.g. in MB) + Letöltve - - Path: - + + Uploaded + Amount of data uploaded (e.g. in MB) + Feltöltve - - [Drag and drop area] - + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Munkamenet alatt letöltve - - - Select file - + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Munkamenet alatt feltöltve - - - Select folder - + + Remaining + Amount of data left to download (e.g. in MB) + Hátramaradt - - Settings - + + Time Active + Time (duration) the torrent is active (not paused) + Aktív idő - - Piece size: - + + Save path + Torrent save path + Mentés útvonala - - Auto - + + Completed + Amount of data completed (e.g. in MB) + Elkészült - - 16 KiB - + + Ratio Limit + Upload share ratio limit + Arány Korlát - - 32 KiB - + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Legutóbb befejezettként látva - - 64 KiB - + + Last Activity + Time passed since a chunk was downloaded/uploaded + Utolsó aktivítás - - 128 KiB - - - - - 256 KiB - - - - - 512 KiB - - - - - 1 MiB - - - - - 2 MiB - - - - - 4 MiB - - - - - 8 MiB - - - - - 16 MiB - - - - - 32 MiB - - - - - Calculate number of pieces: - - - - - Private torrent (Won't distribute on DHT network) - - - - - Start seeding immediately - - - - - Ignore share ratio limits for this torrent - - - - - Optimize alignment - - - - - Fields - - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - - - - Web seed URLs: - - - - - Tracker URLs: - - - - - Comments: - - - - - Source: - - - - - Progress: - Folyamat: - - - - Create Torrent - - - - - - - Torrent creation failed - - - - - Reason: Path to file/folder is not readable. - - - - - Select where to save the new torrent - - - - - Torrent Files (*.torrent) - - - - - Reason: %1 - - - - - Reason: Created torrent is invalid. It won't be added to download list. - - - - - Torrent creator - - - - - Torrent created: - - - - - TorrentInfo - - - File size exceeds max limit %1 - A fájlméret elérte a felső korlátot: %1 - - - - Torrent file read error: %1 - - - - - Torrent file read error: size mismatch - - - - - TorrentsController - - - Not contacted yet - Még nem kapcsolódott - - - - Updating... - Frissítés... - - - - Working - Dolgozik - - - - Not working - Nem működik - - - - Error: '%1' is not a valid torrent file. - Hiba: '%1' nem egy érvényes torrent file - - - - - - - Torrent queueing must be enabled - Torrent besorolást be kell kapcsolni - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - - Cannot make save path - - - - - Cannot write to directory - - - - - WebUI Set location: moving "%1", from "%2" to "%3" - WebUI készlet helye: „%1” áthelyezése innen: „%2”, ide: „%3” - - - - Incorrect torrent name - Érvénytelen torrentnév - - - - - Incorrect category name - Érvénytelen kategórianév + + Total Size + i.e. Size including unwanted data + Teljes méret TrackerFiltersList - + All (0) this is for the tracker filter Összes (0) - + Trackerless (0) Tracker nélkül (0) - + Error (0) Hiba (0) - + Warning (0) Figyelmeztetés (0) - - + + Trackerless (%1) Tracker nélkül (%1) - - + %1 (%2) + openbittorrent.com (10) + %1 (%2) + + + + Error (%1) Hiba (%1) - - + + Warning (%1) Figyelmeztetés (%1) - + Resume torrents Torrentek folytatása - + Pause torrents Torrentek szüneteltetése - + Delete torrents Torrentek törlése - - + + All (%1) this is for the tracker filter Minden (%1) - TrackerListWidget + TrackerList - - - Working - Dolgozik + + URL + URL - - Disabled - Kikapcsolva + + Status + Állapot - - This torrent is private + + Received - - Updating... - Frissítés... - - - - Not working - Nem működik - - - - Not contacted yet - Még nem kapcsolódott + + Seeds + Feltöltők - - - - - - - N/A - + + Peers + Ügyfelek - - Tracker editing - + + Downloaded + Letöltve - - Tracker URL: - + + Message + Üzenet - - - Tracker editing failed - + + + Working + Kapcsolódva - - The tracker URL entered is invalid. - + + Disabled + Tilt - - The tracker URL already exists. - + + This torrent is private + Ez egy privát torrent - - Add a new tracker... - + + Updating... + Frissítés... - - Remove tracker - + + Not working + Nincs kapcsolódva - - Copy tracker URL - + + Not contacted yet + Még nem kapcsolódott - - Edit selected tracker URL - + + Tracker URL: + Tracker URL: - - Force reannounce to selected trackers - + + Tracker editing + Tracker szerkesztés - - Force reannounce to all trackers - + + + Tracker editing failed + Tracker szerkesztése sikertelen - - URL - + + The tracker URL entered is invalid. + Érvénytelen a beírt tracker URL. - - Status - Állapot + + The tracker URL already exists. + Ez a tracker URL már létezik. - - Received - + + Add a new tracker... + Új tracker hozzáadása... - - Seeds - + + Copy tracker URL + Tracker URL másolása - - Peers - Ügyfelek + + Edit selected tracker URL + Kiválasztott tracker URL szerkesztése - - Downloaded - Letöltve + + Force reannounce to selected trackers + Erőltetett újrajelentés a kiválasztott trackerek felé - - Message - + + Force reannounce to all trackers + Erőltetett újrakapcsolódás minden trackerhez - - Column visibility - + + Remove tracker + Tracker eltávolítása - TrackerLoginDialog - - - - Tracker authentication - - - - - Tracker: - - - - - Login - Bejelentkezés - - - - Username: - Felhasználónév: - + TrackersAdditionDlg - - Password: - Jelszó: + + Trackers addition dialog + Tracker hozzáadása - - Log in - + + List of trackers to add (one per line): + Hozzáadandó trackerek listája (soronként egy): - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + µTorrent kompatiblis URL lista: - - List of trackers to add (one per line): - + + I/O Error + I/O Hiba - - µTorrent compatible list URL: - + + Error while trying to open the downloaded file. + Hiba történt a letöltött fájl megnyitásakor. - + No change - + Nincs változás - + No additional trackers were found. - + Nem található több tracker. - + Download error - Letöltési hiba + Letöltési hiba - + The trackers list could not be downloaded, reason: %1 - + A tracker listát nem sikerült letölteni. Indok: %1 TransferListDelegate - + Downloading Letöltés - + Downloading metadata used when loading a magnet link Metadata letöltése - + Allocating qBittorrent is allocating the files on disk Lefoglalás - + Paused Leállítva - + Queued i.e. torrent is queued Sorban áll - + Seeding Torrent is complete and in upload-only mode Seed - + Stalled Torrent is waiting for download to begin Elakadt - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] Letöltés - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] Seed - + Checking Torrent local data is being checked Ellenőrzés - + Queued for checking i.e. torrent is queued for hash checking Ellenőrzésre várakozik - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Folytatáshoz szükséges adatok ellenőrzése - + Completed Elkészült - - - Moving - Torrent local data are being moved/relocated - Áthelyezés - - - - Missing Files - Hiányzó fájlok - - - - Errored - torrent status, the torrent has an error - Hiba - - - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - %1 (seedelve %2-ig) - - - - %1 ago - e.g.: 1h 20m ago - %1 ideje - - - - TransferListFiltersWidget - - - Status - Állapot - - - - Categories - Kategóriák - - - - Tags - Címkék - - - - Trackers - Trackerek - - - - TransferListModel - - - Name - i.e: torrent name - Név - - - - Size - i.e: torrent size - Méret - - - - Done - % Done - - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Állapot - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - Ügyfelek - - - - Down Speed - i.e: Download speed - Letöltési sebesség - - - - Up Speed - i.e: Upload speed - Feltöltési sebesség - - - - Ratio - Share ratio - - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - Kategória - - - - Tags - Címkék - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Letöltve - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Feltöltve - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - Hátramaradt - - - - Time Active - Time (duration) the torrent is active (not paused) - + + + Missing Files + Hiányzó fájlok - - Save path - Torrent save path - + + Errored + torrent status, the torrent has an error + Hiba - - Completed - Amount of data completed (e.g. in MB) - Elkészült + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) + %1 (seedelve %2-ig) - - Ratio Limit - Upload share ratio limit - + + %1 ago + e.g.: 1h 20m ago + %1 ideje + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + Állapot - - Last Activity - Time passed since a chunk was downloaded/uploaded - + + Categories + Kategóriák - - Total Size - i.e. Size including unwanted data - + + Trackers + Trackerek TransferListWidget - + Column visibility Oszlop beállítások - + Choose save path Mentés helye - + Torrent Download Speed Limiting Torrent letöltés sebességkorlátozás - + Torrent Upload Speed Limiting Torrent feltöltés sebességkorlátozás - + Recheck confirmation Újraellenőrzés megerősítése - + Are you sure you want to recheck the selected torrent(s)? Biztos benne, hogy újraellenőrzi a kiválasztott torrenteket? - + Rename Átnevezés - + New name: Új név: - + Resume Resume/start the torrent Folytatás - + Force Resume Force Resume/start the torrent Erőltetett folytatás - + Pause Pause the torrent Szünet - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Hely megadva: „%1” mozgatása, innen: „%2”, ide: „%3” - - - - Add Tags - Címkék hozzáadása - - - - Remove All Tags - Összes címke eltávolítása - - - - Remove all tags from selected torrents? - Eltávolítja az összes címkét a kiválasztott torrentekről? + + New Category + Új kategória - - Comma-separated tags: - Vesszővel elválasztott címkék: + + Category: + Kategória: - - Invalid tag - Érvénytelen címke + + Invalid category name + Érvénytelen kategórianév - - Tag name: '%1' is invalid - A(z) „%1” címkenév érvénytelen + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + A kategórianév nem tartalmazhat „\” karaktert. +A kategórianév nem kezdődhet/végződhet „/” karakterrel. +A kategórianév nem tartalmazhatja a „//” karaktersorozatot. - + Delete Delete the torrent Törlés - + Preview file... Fájl előnézete... - + Limit share ratio... Megosztási arány korlát... - + Limit upload rate... Feltöltési arány korlátozása... - + Limit download rate... Letöltési arány korlátozása... - + Open destination folder Célkönyvtár megnyitása - + Move up i.e. move up in the queue Feljebb mozgat - + Move down i.e. Move down in the queue Lejjebb mozgat - + Move to top i.e. Move to top of the queue Legfelülre mozgat - + Move to bottom i.e. Move to bottom of the queue Legalúlra mozgat - + Set location... Hely megadása... - - Force reannounce - Kényszerített újraellenőrzés - - - + Copy name Név másolása - - Copy hash - Hash másolása - - - + Download first and last pieces first Első és utolsó szelet letöltése először - + Automatic Torrent Management Alapértelmezett torrentkezelés - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category Az automatikus mód azt jelenti, hogy a különböző torrenttulajdonságok (pl. a mentési útvonal) a hozzátartozó kategória alapján kerülnek eldöntésre - + Category Kategória - + New... New category... Új… - + Reset Reset category Visszaállítás - - Tags - Címkék - - - - Add... - Add / assign multiple tags... - Hozzáadás… - - - - Remove All - Remove all tags - Összes eltávolítása - - - + Priority Priorítás - + Force recheck Kényszerített újraellenőrzés - + Copy magnet link Magnet link másolása - + Super seeding mode Szuper seed üzemmód - + Rename... Átnevezés... - + Download in sequential order Letöltés sorrendben - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + Torrent fel/letöltés arány korlátozás - - Use global share limit - + + Use global ratio limit + Teljes arány limit használata - - - + + + buttonGroup - + buttonGroup - - Set no share limit - + + Set no ratio limit + Nincs arány limit - - Set share limit to - + + Set ratio limit to + Arány korlát beállítása + + + WebApplication - - ratio - + + Incorrect category name + Érvénytelen kategórianév + + + WebUI - - minutes - + + The Web UI is listening on port %1 + A Web UI ezen a porton fut: %1 - - No share limit method selected - + + Web UI Error - Unable to bind Web UI to port %1 + Webes felület hiba - port használata sikertelen: %1 + + + about - - Please select a limit method first - + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Egy kifinomult, C++-ban fejlesztett BitTorrent kliens, Qt és libtorrent-rasterbar programkönyvtárakra alapozva. + + + + Copyright %1 2006-2016 The qBittorrent project + Copyright %1 2006-2016 A qBittorrent projekt + + + + Home Page: + Weblap: + + + + Forum: + Fórum: + + + + Bug Tracker: + Hibakövető: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - + + Add Peers + Ügyfelek hozzáadása - - Python not detected - + + List of peers to add (one per line): + Hozzáadandó ügyfelek listája (soronként egy): + + + + Format: IPv4:port / [IPv6]:port + Formátum: IPv4:port / [IPv6]:port - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - Nem elfogadható fájltípus, csak szabályos fájlok fogadhatóak el. + + + Tracker authentication + Tracker hitelesítés - - Symlinks inside alternative UI folder are forbidden. - Az alternatív UI mappában lévő szimbolikus linkek tiltottak. + + Tracker: + Tracker: - - Exceeded the maximum allowed file size (%1)! - Maximum fálj méret átlépve (%1)! + + Login + Belépés - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - + + Username: + Felhasználónév: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - + + Password: + Jelszó: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - + + Log in + Bejelentkezés - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - + + Cancel + Mégse - WebUI + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + Törlés megerősítése - qBittorrent + + + + Remember choice + Válasz megjegyzése + + + + Also delete the files on the hard disk + Fájlok törlése a merevlemezről is + + + + confirmShutdownDlg - - Web UI: HTTPS setup successful - Web UI: Sikeres HTTPS beállítás + + Don't show again + Ne mutassa újra + + + + createTorrentDialog + + + Cancel + Mégse + + + + Torrent Creation Tool + Torrent készítő + + + + Torrent file creation + Torrent fájl létrehozása + + + + Add file + Fájl hozzáadása + + + + Add folder + Könyvtár hozzáadása + + + + File or folder to add to the torrent: + Fájl vagy könyvtár hozzáadása a torrenthez: + + + + Tracker URLs: + Tracker URL: + + + + Web seeds urls: + Web seed url: + + + + Comment: + Megjegyzés: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + A különböző tracker csoportok üres sorral választhatók el. + + + + Piece size: + Szelet mérete: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + Auto + + + + Private (won't be distributed on DHT network if enabled) + Zárt (nem jelenik meg a DHT hálózaton) + + + + Start seeding after creation + Seed megkezdése létrehozás után + + + + Ignore share ratio limits for this torrent + Megosztási korlátok figyelmen kívül hagyása ennél a torrentnél + + + + Create and save... + Létrehozás és mentés... + + + + Progress: + Folyamat: + + + + downloadFromURL + + + Add torrent links + Torrent linkek hozzáadása + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Egy link soronként (támogatottak a HTTP, Magnet linkek és az info-hashek) + + + + Download + Letöltés + + + + Cancel + Mégse + + + + Download from urls + Letöltés url címekről - - Web UI: HTTPS setup failed, fallback to HTTP - Web UI: HTTPS beállítás meghiúsult, visszaállás HTTP-re + + No URL entered + Nem lett URL cím megadva - - Web UI: Now listening on IP: %1, port: %2 - Web UI: Figyelés ezen az IP-n: %1, port: %2 + + Please type at least one URL. + Kérlek adj meg legalább egy url címet. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Web UI: Nem lehet ehhez az IP-hez kötődni, port: %2. Ok: %3 + + Crash info + Összeomlással kapcsolatos információ fsutils - + + + + + Downloads Letöltések @@ -9753,100 +8742,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + A Python nem található + + + + Python version: %1 + Python verzió: %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1ó %2p - + %1d %2h e.g: 2days 10hours %1nap %2ó - + Unknown Unknown (size) Ismeretlen - + qBittorrent will shutdown the computer now because all downloads are complete. A qBittorrent most leállítja a számítógépet, mert az összes letöltés elkészült. - + < 1m < 1 minute < 1perc - + %1m e.g: 10minutes %1perc + + + Working + Kapcsolódva + + + + Updating... + Frissítés... + + + + Not working + Nincs kapcsolódva + + + + Not contacted yet + Még nem kapcsolódott + preview - + Preview selection Kijelölés előnézete - + The following files support previewing, please select one of them: A következő fájlokat lehet előtekinteni, kérem válasszon egyet közülük: + + + Preview + Előnézet + + + + Cancel + Mégse + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_hy.ts qbittorrent-3.3.15/src/lang/qbittorrent_hy.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_hy.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_hy.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,145 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - qBittorrent-ի մասին + qBittorrent-ի մասին - + About - Ծրագրի մասին + Ծրագրի մասին - + Author - Հեղինակը - - - - Current maintainer - + Հեղինակը - - Greece + + + Nationality: - - - Nationality: - + + + Name: + Անունը. - - + + E-mail: - էլ. հասցե. + էլ. հասցե. - - - Name: - Անունը. + + Greece + - - Original author + + Current maintainer - - France - Ֆրանսիա + + Original author + - + Special Thanks - + Translators - - License - Լիցենզիան - - - + Libraries - ԳրադարաններՇտեմարաններ + ԳրադարաններՇտեմարաններ - + qBittorrent was built with the following libraries: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - - - - - Forum: - - - - - Bug Tracker: - - - - - AboutDlg - - About qBittorrent - qBittorrent-ի մասին - - - About - Ծրագրի մասին - - - Author - Հեղինակը - - - Name: - Անունը. - - - E-mail: - էլ. հասցե. - - - Libraries - ԳրադարաններՇտեմարաններ - - + France - Ֆրանսիա + Ֆրանսիա + License - Լիցենզիան + Լիցենզիան @@ -150,65 +90,67 @@ + Browse... - Ընտրել... + Ընտրել... + Set as default save path - Նշել որպես հիմն. ճ-հ + Նշել որպես հիմն. ճ-հ - + Never show again Այլևս չցուցադրել - + Torrent settings Torrent-ի կարգավորումներ - + Set as default category - + Category: - + Start torrent Սկսել torrent-ը - + Torrent information - + Skip hash check Բաց թողնել hash ստուգումը - + Size: Չափը. - + Hash: - + Comment: Մեկնաբանություն. - + Date: Ամսաթիվը. @@ -233,121 +175,89 @@ - - Remember last used save path - - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - + Do not delete .torrent file - - Create subfolder - - - - - Download in sequential order - Բեռնել հաջորդական կարգով - - - - Download first and last pieces first - - - - + Normal Նորմալ - + High Բարձր - + Maximum Առավ. - + Do not download Չբեռնել - - - + + + I/O Error Սխալ - + Invalid torrent Սխալ torrent + + + + Already in download list - Արդեն ներբեռնումների ցանկում է - - - - Renaming - + Արդեն ներբեռնումների ցանկում է - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - - - - + Not Available This comment is unavailable Հասանելի չէ - + Not Available This date is unavailable Հասանելի չէ - + Not available Հասանելի չէ - + Invalid magnet link Սխալ magnet հղում - + The torrent file '%1' does not exist. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -355,127 +265,128 @@ - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + + + + + Torrent is already in download list. Trackers were merged. + + + + + + Cannot add torrent + + + + + Cannot add this torrent. Perhaps it is already in adding state. + + + + This magnet link was not recognized magnet հղումը չի վերականգնվել - + + Magnet link is already in download list. Trackers were merged. + + + + + Cannot add this torrent. Perhaps it is already in adding. + + + + Magnet link Magnet հղում - + Retrieving metadata... - + Not Available This size is unavailable. Հասանելի չէ - + Free space on disk: %1 - + + Choose save path Ընտրեք պահպանելու տեղը + Rename the file - Անվանափոխել + Անվանափոխել - + New name: Նոր անուն. + + The file could not be renamed - Ֆայլը չի կարող անվանփոխվել + Ֆայլը չի կարող անվանփոխվել + This file name contains forbidden characters, please choose a different one. - Ֆայլի անունը պարունակում է արգելված նշաններ, ընտրեք այլ անուն։ - - - - - - - - - Torrent is already present - + Ֆայլի անունը պարունակում է արգելված նշաններ, ընտրեք այլ անուն։ - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - - - - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - - - - - Magnet link is already queued for processing. - - - - - + + This name is already in use in this folder. Please use a different name. Այս անունով արդեն առկա է։ Ընտրեք այլ անուն։ - + The folder could not be renamed Թղթապանակը չի կարող անվանափոխվել - + Rename... Անվանափոխել... - + Priority Առաջ-ը - + Invalid metadata - + Parsing metadata... - + Metadata retrieval complete - + Download Error @@ -483,325 +394,198 @@ AdvancedSettings + Disk write cache size - Պնակը գրելու պահեստի չափը + Պնակը գրելու պահեստի չափը - + MiB ՄԲ - + Outgoing ports (Min) [0: Disabled] Ելքի դարպասներ (Նվազ) [0. Անջատված] - + Outgoing ports (Max) [0: Disabled] Ելքի դարպասներ (Առավ) [0. Անջատված] - + Recheck torrents on completion Ավարտելուց հետո ստուգել torrent-ները - + Transfer list refresh interval Փոխանցումների ցանկի թարմացման դադարը - + ms milliseconds մվ - + Setting Կարգավորում - + Value Value set for this setting Կարգավորման նշանակ-ը - - - (disabled) - - - - + (auto) (ինքնա) - - min - minutes - - - - + All addresses - + qBittorrent Section - - + + Open documentation - + libtorrent Section - - Asynchronous I/O threads - - - - - Disk cache - - - - + s seconds վ - + Disk cache expiry interval - + Enable OS cache - - Guided read cache - - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - - - - - - KiB - - - - - Send buffer watermark - - - - - Send buffer low watermark - - - - - Send buffer watermark factor - - - + m minutes - ր - - - - Prefer TCP - + ր - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address - - - - + Resolve peer countries (GeoIP) Որոշել peer-երի երկրները (GeoIP) - + Resolve peer host names Որոշել peer-երի հոսթերի անունները - + Strict super seeding Որոշված գերփոխանցումը - + Network Interface (requires restart) Ցանցի միջներեսը (պահանջում է վերագործարկում) - + Optional IP Address to bind to (requires restart) - + Listen on IPv6 address (requires restart) - + Display notifications - + Display notifications for added torrents - + Download tracker's favicon - - Save path history length - - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - - - - - Round-robin - - - - - Fastest upload - - - - - Anti-leech - - - - - Upload choking algorithm - - - - + Confirm torrent recheck - - Confirm removal of all tags - - - - - Always announce to all trackers in a tier - - - - - Always announce to all tiers - + Exchange trackers with other peers + Փոխել ուղղորդիչները այլ peer-երով + Always announce to all trackers - Միշտ տեղեկացնել բոլոր ուղղորդիչներին + Միշտ տեղեկացնել բոլոր ուղղորդիչներին - + Any interface i.e. Any network interface Ցանկացած միջներես - + Save resume data interval How often the fastresume file is saved. - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - - - - + Maximum number of half-open connections [0: Unlimited] - + IP Address to report to trackers (requires restart) Ուղորդիչների հաշվետվության IP-ն (պահ. է վերագործարկում) - + Enable embedded tracker Միացնել ուղղորդիչի արգելումը - + Embedded tracker port Արգելված ուղղորդիչի դարպասը - + Check for software updates Ստուգել ծրագրի թարմացումները - + Use system icon theme Օգտ. համակարգային պատկերով թեման @@ -809,120 +593,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started - + Torrent: %1, running external program, command: %2 - - Torrent name: %1 - - - - - Torrent size: %1 - - - - - Save path: %1 - - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - - - - - Thank you for using qBittorrent. - - - - - [qBittorrent] '%1' has finished downloading + + Torrent: %1, run external program command too long (length > %2), execution failed. - + Torrent: %1, sending mail notification - + Information Տեղեկություն - - To control qBittorrent, access the Web UI at %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 - + The Web UI administrator user name is: %1 - + The Web UI administrator password is still the default one: %1 - + This is a security risk, please consider changing your password from program preferences. - + Saving torrent progress... Պահպանում է torrent-ը... - - - Portable mode and explicit profile directory options are mutually exclusive - - - - - Portable mode implies relative fastresume - - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Պահպանել՝ @@ -932,851 +657,668 @@ - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. + + Enable Automated RSS Downloader - + Download Rules - + Rule Definition - + Use Regular Expressions - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) + + Must Contain: - - Use Smart Episode Filter + + Must Not Contain: - - Must Contain: + + Episode Filter: - - Must Not Contain: - - - - - Episode Filter: - - - - + Assign Category: - + Save to a Different Directory - + Ignore Subsequent Matches for (0 to Disable) ... X days - + Disabled Անջատված է - + days օր - + Add Paused: - + Use global settings - + Always - + Never Երբեք - + Apply Rule to Feeds: - + Matching RSS Articles - + &Import... - + &Export... - + Matches articles based on episode filter. - + Example: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match - + Episode filter rules: - + Season number is a mandatory non-zero value - + Filter must end with semicolon - + Three range types for episodes are supported: - + Single number: <b>1x25;</b> matches episode 25 of season one - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one - + Episode number is a mandatory positive value - - Rules - - - - - Rules (legacy) - - - - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - + Last Match: %1 days ago - + Last Match: Unknown - + New rule name Նոր կանոնի անունը - + Please type the name of the new download rule. Նշեք բեռնման կանոնի անունը։ - - + + Rule name conflict Այս անունը արդեն առկա է։ - - + + A rule with this name already exists, please choose another name. Այս անունով կանոն արդեն առկա է, ընտրեք այլ անուն։ - + Are you sure you want to remove the download rule named '%1'? - + Are you sure you want to remove the selected download rules? Ջնջե՞լ ընտրված կանոնները։ - + Rule deletion confirmation Հաստատեք ջնջումը - + Destination directory Նշանակման թղթապանակը - + Invalid action - Սխալ գործողություն + Սխալ գործողություն - + The list is empty, there is nothing to export. - Ցանկը դատարկ է, ոչինչ չկա արտածելու համար։ - - - - Export RSS rules - - - - - Failed to create the destination file. Reason: %1 - - - - - Import RSS rules - - - - - Failed to open the file. Reason: %1 - - - - - Failed to import the selected rules file. Reason: %1 - + Ցանկը դատարկ է, ոչինչ չկա արտածելու համար։ + Where would you like to save the list? - Որտե՞ղ պահպանել ցանկը։ + Որտե՞ղ պահպանել ցանկը։ + Rules list (*.rssrules) - Կանոնների ցանկը (*.rssrules) + Կանոնների ցանկը (*.rssrules) - - + I/O Error - Ն/Ա սխալ + Ն/Ա սխալ + Failed to create the destination file - Հնարավոր չէ ստեղծել նշանակման ֆայլը + Հնարավոր չէ ստեղծել նշանակման ֆայլը + Please point to the RSS download rules file - Նշեք RSS բեռնման կանոնների ֆայլը + Նշեք RSS բեռնման կանոնների ֆայլը + Rules list - Կանոնների ցանկ + Կանոնների ցանկ - + Import Error - Ներմուծման սխալ + Ներմուծման սխալ + Failed to import the selected rules file - Հնարավոր չէ ներմուծել ընտրված ֆայլը + Հնարավոր չէ ներմուծել ընտրված ֆայլը - + Add new rule... Ավելացնել նոր կանոն... - + Delete rule Ջնջել կանոնը - + Rename rule... Անվանափոխել կանոնը... - + Delete selected rules Ջնջել ընտրված կանոնները - - Clear downloaded episodes... - - - - + Rule renaming Կանոնի անվանափոխում - + Please type the new rule name Նշեք կանոնի անունը - - Clear downloaded episodes - - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - - - - - - Position %1: %2 - - - + Regex mode: use Perl-like regular expressions - Regex եղանակ. օգտ. Perl՝ կանոնավոր սահ-ը + Regex եղանակ. օգտ. Perl՝ կանոնավոր սահ-ը - + Wildcard mode: you can use - + ? to match any single character - + * to match zero or more of any characters - + Whitespaces count as AND operators (all words, any order) - + | is used as OR operator - + If word order is important use * instead of whitespace. - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - + will match all articles. - + will exclude all articles. - - - BanListOptions - - Delete - Ջնջել - - - - BanListOptionsDialog - - - List of banned IP addresses - - - - - Ban IP - - - - - Delete - Ջնջել - - - - - Warning - - - - The entered IP address is invalid. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Wildcard եղանակ. կարող եք օգտագործել <ul><li>? պարզ նշանների համար</li><li>* զրո և զրոյից բարձր</li><li>Բացատներ ԵՎ օպերատորը </li></ul> - - The entered IP is already banned. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Wildcard եղանակ. կարող եք օգտագործել <ul><li>? պարզ նշանների համար</li><li>* զրո և զրոյից բարձր</li><li>| Բացատներ ԿԱՄ օպերատորը </li></ul> BitTorrent::Session - + Restart is required to toggle PeX support - - Could not get GUID of configured network interface. Binding to IP %1 - - - - + Embedded Tracker [ON] - + Failed to start the embedded tracker! - + Embedded Tracker [OFF] - + + '%1' reached the maximum ratio you set. Removing... + + + + + '%1' reached the maximum ratio you set. Pausing... + + + + System network status changed to %1 e.g: System network status changed to ONLINE - + ONLINE - + OFFLINE - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. - - + Encryption support [%1] - - + FORCED - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - - - - - + Anonymous mode [%1] - + Unable to decode '%1' torrent file. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' - + Queue positions were corrected in %1 resume files - + Couldn't save '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - - - - + because %1 is disabled. this peer was blocked because uTP is disabled. - + because %1 is disabled. this peer was blocked because TCP is disabled. - + URL seed lookup failed for URL: '%1', message: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 - + The network interface defined is invalid: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 - - Peer ID: - - - - - HTTP User-Agent is '%1' - - - - - + DHT support [%1] - - - - - - - - - + + + + ON - - - - - - - - - + + + + OFF - - + Local Peer Discovery support [%1] - - PeX support [%1] - - - - - '%1' reached the maximum ratio you set. Removed. - - - - - '%1' reached the maximum ratio you set. Paused. - - - - - '%1' reached the maximum seeding time you set. Removed. - - - - - '%1' reached the maximum seeding time you set. Paused. - - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface - + Tracker '%1' was added to torrent '%2' - + Tracker '%1' was deleted from torrent '%2' - + URL seed '%1' was added to torrent '%2' - + URL seed '%1' was removed from torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Error: Failed to parse the provided IP filter. - - '%1' restored. - 'torrent name' restored. + + Couldn't add torrent. Reason: %1 - - Couldn't add torrent. Reason: %1 + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) - + '%1' added to download list. 'torrent name' was added to download list. - + An I/O error occurred, '%1' paused. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 - + due to IP filter. this peer was blocked due to ip filter. - + due to port filter. this peer was blocked due to port filter. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. - + because it has a low port. this peer was blocked because it has a low port. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 - + External IP: %1 e.g. External IP: 192.168.0.1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + File sizes mismatch for torrent '%1', pausing it. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... @@ -1784,17 +1326,17 @@ CategoryFilterModel - + Categories - + All - + Uncategorized @@ -1813,34 +1355,67 @@ - Edit category... - - - - Remove category - + Remove unused categories - + Resume torrents - + Pause torrents - + Delete torrents + + + New Category + + + + + Category: + + + + + Invalid category name + + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + CookiesDialog @@ -1879,82 +1454,34 @@ - DeletionConfirmationDialog - - - Deletion confirmation - - - - - Remember choice - Հիշել ընտրությունը - - - - Also delete the files on the hard disk - Նաև ջնջել ֆայլերը պնակից - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - Ավելացնել torrent-ի հղումներ - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - Ներբեռնել - - - - No URL entered - Գրեք հղումներ - - - - Please type at least one URL. - Նշեք գոնե մեկ հղում։ - - - DownloadedPiecesBar - + White: Missing pieces - + Green: Partial pieces - + Blue: Completed pieces @@ -1962,39 +1489,23 @@ ExecutionLog + General - Գլխավորը - - - Blocked IPs - Կողփված IP-ներ - - - <font color='red'>%1</font> was blocked %2 - x.y.z.w was blocked - <font color='red'>%1</font>-ը արգելափակվել է %2 - - - - ExecutionLogWidget - - - General - Գլխավորը + Գլխավորը - + Blocked IPs - Կողփված IP-ներ + Կողփված IP-ներ - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - <font color='red'>%1</font>-ը արգելափակվել է %2 + <font color='red'>%1</font>-ը արգելափակվել է %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned @@ -2003,580 +1514,514 @@ FeedListWidget - + RSS feeds RSS ալիքներ - - - Unread (%1) - - - + Unread - Չկարդացած + Չկարդացած FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. + + An error occured while trying to open the log file. Logging to file is disabled. - FileSystemPathEdit + FilterParserThread - - ... - Launch file dialog button text (brief) + + + + I/O Error: Could not open ip filter file in read mode. - - &Browse... - Launch file dialog button text (full) + + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. + + + GeoIPDatabase - - Choose a file - Caption for file open/save dialog + + + Unsupported database file size. - - Choose a folder - Caption for directory open dialog + + Metadata error: '%1' entry not found. - - Any file + + Metadata error: '%1' entry has invalid type. - - - FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. + + Unsupported database version: %1.%2 - - - - IP filter line %1 is malformed. + + Unsupported IP version: %1 - - - IP filter line %1 is malformed. Start IP of the range is malformed. + + Unsupported record size: %1 - - - IP filter line %1 is malformed. End IP of the range is malformed. + + Invalid database type: %1 - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! + + Database corrupted: no data section found. + + + HttpServer - - - IP filter exception thrown for line %1. Exception is: %2 - - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - - - - - - - - - - - Parsing Error: The filter file is not a valid PeerGuardian P2B file. - - - - - GeoIPDatabase - - - - Unsupported database file size. - - - - - Metadata error: '%1' entry not found. - - - - - Metadata error: '%1' entry has invalid type. - - - - - Unsupported database version: %1.%2 - - - - - Unsupported IP version: %1 - - - - - Unsupported record size: %1 - - - - - Invalid database type: %1 - - - - - Database corrupted: no data section found. - - - - - Http::Connection - - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - - - - - Bad Http request, closing socket. IP: %s - - - - - HttpServer - + File - Ֆայլ + Ֆայլ + Edit - Խմբագրել + Խմբագրել + Help - Օգնություն + Օգնություն - + Exit qBittorrent - + Only one link per line Մեկ հղում տողի համար + Download - Ներբեռնել + Ներբեռնել - + Global upload rate limit must be greater than 0 or disabled. - + Global download rate limit must be greater than 0 or disabled. - + Alternative upload rate limit must be greater than 0 or disabled. - + Alternative download rate limit must be greater than 0 or disabled. - + Maximum active downloads must be greater than -1. - + Maximum active uploads must be greater than -1. - + Maximum active torrents must be greater than -1. - + Maximum number of connections limit must be greater than 0 or disabled. Միացումների առավ. քանակը պետք է լինի կամ բարձր 0-ից կամ անջատված։ - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Միացումների առավ. քանակը torrent-ի համար պետք է լինի կամ բարձր 0-ից կամ անջատված։ - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Վերբեռնելու սլոթների առավ. քանակը torrent-ի համար պետք է լինի կամ բարձր 0-ից կամ անջատված։ - + Unable to save program preferences, qBittorrent is probably unreachable. Հնարավոր չէ պահպանել ծրագրի կարգավորումները, qBittorrent-ը հնարավոր է անհասանելի է։ - - IRC: #qbittorrent on Freenode - - - - - Invalid category name: -Please do not use any special characters in the category name. - - - - - Unknown - Անհայտ - - - - Hard Disk - - - - - Share ratio limit must be between 0 and 9998. - - - - - Seeding time limit must be between 0 and 525600 minutes. - - - + Language - Լեզուն + Լեզուն - + The port used for incoming connections must be between 1 and 65535. - + The port used for the Web UI must be between 1 and 65535. - + Unable to log in, qBittorrent is probably unreachable. - + Invalid Username or Password. - - Username - - - - + Password - + Login Մուտքաբառը + Upload Failed! - Վերբեռնումը ձախողվեց + Վերբեռնումը ձախողվեց - + Original authors - + + Upload limit: + + + + + Download limit: + + + + Apply - + Add - + + Category: + + + + Upload Torrents Upload torrent files to qBittorent using WebUI + + All + + + + Downloading - Ներբեռնվում է + Ներբեռնվում է + Seeding - Փոխանցվում է + Փոխանցվում է + Completed - Ավարտված + Ավարտված + + + + Resumed + + Paused - Դադարի մեջ է + Դադարի մեջ է - + + Active + + + + + Inactive + + + + Save files to location: - + Cookie: - + Type folder here - + + Run an external program on torrent completion + + + + + Enable bandwidth management (uTP) + + + + + Apply rate limit to uTP connections + + + + + Alternative Global Rate Limits + + + + More information - + Information about certificates - + Save Files to - - Set location + + Watch Folder - - Limit upload rate + + Default Folder - - Limit download rate + + from + from time1 to time2 - - Rename torrent + + to + from time1 to time2 - - Unable to create category + + Other... + Save Files to: Watch Folder / Default Folder / Other... - - Other... - Save Files to: Watch Folder / Default Folder / Other... + + Every day + Schedule the use of alternative rate limits on ... - + + Week days + Schedule the use of alternative rate limits on ... + + + + + Week ends + Schedule the use of alternative rate limits on ... + + + + Monday Schedule the use of alternative rate limits on ... - + Tuesday Schedule the use of alternative rate limits on ... - + Wednesday Schedule the use of alternative rate limits on ... - + Thursday Schedule the use of alternative rate limits on ... - + Friday Schedule the use of alternative rate limits on ... - + Saturday Schedule the use of alternative rate limits on ... - + Sunday Schedule the use of alternative rate limits on ... + Downloaded Is the file downloaded or not? - Ներբեռնվել է + Ներբեռնվել է - + Logout - + + Download from URLs + + + + Download Torrents from their URLs or Magnet links - + Upload local torrent - + Are you sure you want to delete the selected torrents from the transfer list? - + Save Պահպանել - + qBittorrent client is not reachable qBittorrent ծրագիրը հասանելի չէ + HTTP Server - HTTP սպասարկիչ + HTTP սպասարկիչ + The following parameters are supported: - Աջակցվում են՝ + Աջակցվում են՝ + Torrent path - Torrent-ի ճ-ը + Torrent-ի ճ-ը + Torrent name - Torrent-ի անունը + Torrent-ի անունը - + qBittorrent has been shutdown. qBittorrent-ը անջատվել է: - IPSubnetWhitelistOptionsDialog + LineEdit - - List of whitelisted IP subnets - + + Clear the text + Մաքրել տեսքտ + + + LogListWidget - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - + + Copy + Պատճենել - - Add subnet - - - - - Delete - Ջնջել - - - - Error - - - - - The entered subnet is invalid. - - - - - LineEdit - - Clear the text - Մաքրել տեսքտ - - - - LogListWidget - - Copy - Պատճենել - - - Clear @@ -2609,550 +2054,491 @@ - + &View &Տեսքը - + &Options... &Ընտրանքներ... - + &Resume &Վերսկսել - + Torrent &Creator - + Set Upload Limit... - + Set Download Limit... - + Set Global Download Limit... - + Set Global Upload Limit... - + Minimum Priority - + Top Priority - + Decrease Priority - + Increase Priority - - + + Alternative Speed Limits - + &Top Toolbar - + Display Top Toolbar - - Status &Bar - - - - + S&peed in Title Bar - + Show Transfer Speed in Title Bar - + &RSS Reader - + Search &Engine - + L&ock qBittorrent - + Do&nate! - - Close Window - - - - + R&esume All Վ&երսկսել բոլորը - + Manage Cookies... - + Manage stored network cookies - + Normal Messages - + Information Messages - + Warning Messages - + Critical Messages - + &Log - + &Exit qBittorrent - + &Suspend System - + &Hibernate System - + S&hutdown System - + &Disabled - + &Statistics - + Check for Updates - + Check for Program Updates - + &About &Մասին - + &Pause &Դադար - + &Delete &Ջնջել - + P&ause All Դ&ադարեցնել բոլորը - + &Add Torrent File... - + Open Բացել - + E&xit - + Open URL Բացել URL - + &Documentation &Թղթաբանություն - + Lock Կողպել - - - + + + Show Ցուցադրել՛ - + Check for program updates Ստուգել ծրագրի թարմացումները - + Add Torrent &Link... - + If you like qBittorrent, please donate! Եթե qBittorrent-ը Ձեզ դուր եկավ, խնդրում ենք նվիրաբերել։ - - + Execution Log Բացառության ցանկը - + Clear the password Մաքրել գաղտնաբառը - + Filter torrent list... Զտրել torrent-ների ցանկը.... - + &Set Password - - Preferences - - - - + &Clear Password - + Transfers Փոխանցումներ - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Torrent ֆայլի ասոցիացումներ - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent-ը torrent ֆայլերի կամ Magnet հղումների համար ասոցիացված ծրագիրը չէ։ Ասոցիացնե՞լ այն տվյալ ֆայլերի համար։ - + Icons Only Միայն պատկերակները - + Text Only Միայն տեքստը - + Text Alongside Icons - + Text Under Icons - + Follow System Style - - - + + + UI lock password Ծրագրի կողփման ծածկագիրը - - - + + + Please type the UI lock password: Նշեք ծածկագիրը. - + The password should contain at least 3 characters Ծածկագիրը պետք է պարունակի գոնե 3 նիշ - + Password update Թարմացնել ծածկագիրը - + The UI lock password has been successfully updated UI-ի կողփման ծածկագիրը հաջողությամբ թարմացվեց - + Are you sure you want to clear the password? - - Use regular expressions - - - - + Search Փնտրել - + Transfers (%1) Փոխանցումներ (%1) - + Error - + Failed to add torrent: %1 - + Torrent added - + '%1' was added. e.g: xxx.avi was added. - + Download completion Բեռնումը ավարտվում է - + I/O Error i.e: Input/Output Error Ն/Ա սխալ - + Recursive download confirmation Բեռնման հաստատում - + Yes Այո - + No Ոչ - + Never Երբեք - + Global Upload Speed Limit Փոխանցման արագ-ան գլոբալ սահ-փակումներ - + Global Download Speed Limit Բեռնման արագ-ան գլոբալ սահ-փակումներ - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent-ը թարմացվել է։ Վերամեկնարկեք՝ փոփոխությունները կիրառելու համար։ - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - - - - - Are you sure you want to quit qBittorrent? - - - - + &No &Ոչ - + &Yes &Այո - + &Always Yes - - %1/s - s is a shorthand for seconds - - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - + qBittorrent Update Available - + + A new version is available. +Do you want to download %1? + + + + Already Using the Latest qBittorrent Version - + Undetermined Python version - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -3160,161 +2546,151 @@ - + The torrent '%1' contains torrent files, do you want to proceed with their download? - + Couldn't download file at URL '%1', reason: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - - + + Couldn't determine your Python version (%1). Search engine disabled. + + + + + Missing Python Interpreter - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? - + Python is required to use the search engine but it does not seem to be installed. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. - + &Check for Updates - + Checking for Updates... - + Already checking for program updates in the background - + Python found in '%1' - + Download error Ներբեռնելու սխալ - + Python setup could not be downloaded, reason: %1. Please install it manually. - - + + Invalid password Ծածկագիրը սխալ է - - - + + RSS (%1) - + URL download error - + The password is invalid Ծածկագիրը սխալ է - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Ներբեռնում՝ %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Վերբեռնում՝ %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [Ներ. %1, Վեր. %2] qBittorrent %3 - + Hide Թաքցնել - + Exiting qBittorrent Ելք qBittorrent-ից + Some files are currently transferring. Are you sure you want to quit qBittorrent? - Այս պահին որոշ ֆայլեր փախանցվում են։ + Այս պահին որոշ ֆայլեր փախանցվում են։ Այնուհանդերձ դու՞րս գալ qBittorrent-ից։ - + Open Torrent Files Բացել torrent ֆայլեր - + Torrent Files Torrent ֆայլեր - + Options were saved successfully. Ընտրանքները հաջողությամբ պահպանվեցին։ @@ -3322,52 +2698,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. - + Dynamic DNS error: hostname supplied does not exist under specified account. - + Dynamic DNS error: Invalid username/password. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. - + Dynamic DNS error: supplied domain name is invalid. - + Dynamic DNS error: supplied username is too short. - + Dynamic DNS error: supplied password is too short. @@ -3375,1413 +2751,1303 @@ Net::DownloadHandler - + I/O Error - + The file size is %1. It exceeds the download limit of %2. - + Unexpected redirect to magnet URI. - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. - - + + Couldn't load GeoIP database. Reason: %1 - + Venezuela, Bolivarian Republic of - + Viet Nam - - + + N/A - + Andorra - + United Arab Emirates - + Afghanistan - + Antigua and Barbuda - + Anguilla - + Albania - + Armenia - + Angola - + Antarctica - + Argentina - + American Samoa - + Austria - + Australia - + Aruba - + Azerbaijan - + Bosnia and Herzegovina - + Barbados - + Bangladesh - + Belgium - + Burkina Faso - + Bulgaria - + Bahrain - + Burundi - + Benin - + Bermuda - + Brunei Darussalam - + Brazil - + Bahamas - + Bhutan - + Bouvet Island - + Botswana - + Belarus - + Belize - + Canada - + Cocos (Keeling) Islands - + Congo, The Democratic Republic of the - + Central African Republic - + Congo - + Switzerland - + Cook Islands - + Chile - + Cameroon - + China - + Colombia - + Costa Rica - + Cuba - + Cape Verde - + Curacao - + Christmas Island - + Cyprus - + Czech Republic - + Germany - + Djibouti - + Denmark - + Dominica - + Dominican Republic - + Algeria - + Ecuador - + Estonia - + Egypt - + Western Sahara - + Eritrea - + Spain - + Ethiopia - + Finland - + Fiji - + Falkland Islands (Malvinas) - + Micronesia, Federated States of - + Faroe Islands - + France Ֆրանսիա - + Gabon - + United Kingdom - + Grenada - + Georgia - + French Guiana - + Ghana - + Gibraltar - + Greenland - + Gambia - + Guinea - + Guadeloupe - + Equatorial Guinea - + Greece - + South Georgia and the South Sandwich Islands - + Guatemala - + Guam - + Guinea-Bissau - + Guyana - + Hong Kong - + Heard Island and McDonald Islands - + Honduras - + Croatia - + Haiti - + Hungary - + Indonesia - + Ireland - + Israel - + India - + British Indian Ocean Territory - + Iraq - + Iran, Islamic Republic of - + Iceland - + Italy - + Jamaica - + Jordan - + Japan - + Kenya - + Kyrgyzstan - + Cambodia - + Kiribati - + Comoros - + Saint Kitts and Nevis - + Korea, Democratic People's Republic of - + Korea, Republic of - + Kuwait - + Cayman Islands - + Kazakhstan - + Lao People's Democratic Republic - + Lebanon - + Saint Lucia - + Liechtenstein - + Sri Lanka - + Liberia - + Lesotho - + Lithuania - + Luxembourg - + Latvia - + Morocco - + Monaco - + Moldova, Republic of - + Madagascar - + Marshall Islands - + Mali - + Myanmar - + Mongolia - + Northern Mariana Islands - + Martinique - + Mauritania - + Montserrat - + Malta - + Mauritius - + Maldives - + Malawi - + Mexico - + Malaysia - + Mozambique - + Namibia - + New Caledonia - + Niger - + Norfolk Island - + Nigeria - + Nicaragua - + Netherlands - + Norway - + Nepal - + Nauru - + Niue - + New Zealand - + Oman - + Panama - + Peru - + French Polynesia - + Papua New Guinea - + Philippines - + Pakistan - + Poland - + Saint Pierre and Miquelon - + Puerto Rico - + Portugal - + Palau - + Paraguay - + Qatar - + Reunion - + Romania - + Russian Federation - + Rwanda - + Saudi Arabia - + Solomon Islands - + Seychelles - + Sudan - + Sweden - + Singapore - + Slovenia - + Svalbard and Jan Mayen - + Slovakia - + Sierra Leone - + San Marino - + Senegal - + Somalia - + Suriname - + Sao Tome and Principe - + El Salvador - + Syrian Arab Republic - + Swaziland - + Turks and Caicos Islands - + Chad - + French Southern Territories - + Togo - + Thailand - + Tajikistan - + Tokelau - + Turkmenistan - + Tunisia - + Tonga - - Could not decompress GeoIP database file. - - - - + Timor-Leste - + Bolivia, Plurinational State of - + Bonaire, Sint Eustatius and Saba - + Cote d'Ivoire - + Libya - + Saint Martin (French part) - + Macedonia, The Former Yugoslav Republic of - + Macao - + Pitcairn - + Palestine, State of - + Saint Helena, Ascension and Tristan da Cunha - + South Sudan - + Sint Maarten (Dutch part) - + Turkey - + Trinidad and Tobago - + Tuvalu - + Taiwan - + Tanzania, United Republic of - + Ukraine - + Uganda - + United States Minor Outlying Islands - + United States - + Uruguay - + Uzbekistan - + Holy See (Vatican City State) - + Saint Vincent and the Grenadines - + Virgin Islands, British - + Virgin Islands, U.S. - + Vanuatu - + Wallis and Futuna - + Samoa - + Yemen - + Mayotte - + Serbia - + South Africa - + Zambia - + Montenegro - + Zimbabwe - + Aland Islands - + Guernsey - + Isle of Man - + Jersey - + Saint Barthelemy - + + Could not uncompress GeoIP database file. + + + + Couldn't save downloaded GeoIP database file. - + Successfully updated GeoIP database. - + Couldn't download GeoIP database file. Reason: %1 @@ -4789,12 +4055,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] - + UPnP / NAT-PMP support [OFF] @@ -4802,7 +4068,7 @@ Net::Smtp - + Email Notification Error: @@ -4810,1277 +4076,1077 @@ OptionsDialog - + Options - + Behavior - + Downloads Բեռնումներ - + Connection Միացումը - + Speed - + BitTorrent - - RSS - - - - + Web UI - + Advanced - + Language Լեզուն - + User Interface Language: - + (Requires restart) - + Transfer List - + Confirm when deleting torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. - + Hide zero and infinity values - + Always - + Paused torrents only - + Action on double-click - + Downloading torrents: - - + + Start / Stop Torrent - - + + Open destination folder Բացել պարունակող թղթապանակը - - + + No action - + Completed torrents: - + Desktop - + Start qBittorrent on Windows start up - + Show splash screen on start up - + Start qBittorrent minimized - + Confirmation on exit when torrents are active - + Confirmation on auto-exit when downloads finish - - KiB + + Show qBittorrent in notification area - - Email notification &upon download completion + + Minimize qBittorrent to notification area - - Run e&xternal program on torrent completion + + Close qBittorrent to notification area + i.e: The systray tray icon will still be visible when closing the main window. - - IP Fi&ltering + + Tray icon style: - - Schedule &the use of alternative rate limits - + + Normal + Նորմալ - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + + Monochrome (Dark theme) - - &Torrent Queueing + + Monochrome (Light theme) - - Seed torrents until their seeding time reaches + + File association - - A&utomatically add these trackers to new downloads: + + Use qBittorrent for .torrent files - - RSS Reader + + Use qBittorrent for magnet links - - Enable fetching RSS feeds + + Power Management - - Feeds refresh interval: + + Inhibit system sleep when torrents are active - - Maximum number of articles per feed: - Յուրաքանչյուր ալիքի համար հոդվածների առավ. ք-ը. + + Log file + - - - min - minutes + + Save path: - - RSS Torrent Auto Downloader + + Backup the log file after: - - Enable auto downloading of RSS torrents + + MB - - Edit auto downloading rules... + + Delete backup logs older than: - - Web User Interface (Remote control) + + days + Delete backup logs older than 10 months - - IP address: + + months + Delete backup logs older than 10 months - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. + + years + Delete backup logs older than 10 years - - Server domains: + + When adding a torrent - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. + + Display torrent content and some options - - &Use HTTPS instead of HTTP + + Bring torrent dialog to the front - - Bypass authentication for clients on localhost + + Do not start the download automatically + The torrent will be added to download list in pause state - - Bypass authentication for clients in whitelisted IP subnets + + Should the .torrent file be deleted after adding it - - IP subnet whitelist... + + Delete .torrent files afterwards - - Upda&te my dynamic domain name + + Also delete .torrent files whose addition was cancelled - - Minimize qBittorrent to notification area + + Also when addition is cancelled - - Close qBittorrent to notification area - i.e: The systray tray icon will still be visible when closing the main window. + + Warning! Data loss possible! - - Tray icon style: + + Saving Management - - Normal - Նորմալ + + Default Torrent Management Mode: + - - Monochrome (Dark theme) + + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - - Monochrome (Light theme) + + Manual - - File association + + Automatic - - Use qBittorrent for .torrent files + + When Torrent Category changed: - - Use qBittorrent for magnet links + + Relocate torrent - - Power Management + + Switch torrent to Manual Mode - - Save path: + + When Default Save Path changed: - - Backup the log file after: + + + Relocate affected torrents - - Delete backup logs older than: + + + Switch affected torrents to Manual Mode - - days - Delete backup logs older than 10 months + + When Category changed: - - months - Delete backup logs older than 10 months + + Use Subcategories - - years - Delete backup logs older than 10 years - - - - - When adding a torrent - - - - - Bring torrent dialog to the front - - - - - Do not start the download automatically - The torrent will be added to download list in pause state - - - - - Should the .torrent file be deleted after adding it - - - - - Also delete .torrent files whose addition was cancelled - - - - - Also when addition is cancelled - - - - - Warning! Data loss possible! - - - - - Saving Management - - - - - Default Torrent Management Mode: - - - - - Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - - - - - Manual - - - - - Automatic - - - - - When Torrent Category changed: - - - - - Relocate torrent - - - - - Switch torrent to Manual Mode - - - - - When Default Save Path changed: - - - - - - Relocate affected torrents - - - - - - Switch affected torrents to Manual Mode - - - - - When Category changed: - - - - - Use Subcategories - - - - + Default Save Path: - + Keep incomplete torrents in: - + Copy .torrent files to: - - Show &qBittorrent in notification area - - - - - &Log file - - - - - Display &torrent content and some options - - - - - Create subfolder for torrents with multiple files - - - - - De&lete .torrent files afterwards - - - - + Copy .torrent files for finished downloads to: - + Pre-allocate disk space for all files - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding + + Append .!qB extension to incomplete files - - Append .!qB extension to incomplete files + + Automatically add torrents from: - - Enable recursive download dialog + + Add entry - - Automatically add torrents from: + + Remove entry - - Add entry + + Email notification upon download completion - - Remove entry + + Destination email: - + SMTP server: - + This server requires a secure connection (SSL) - - + + + Authentication - - - - + + + + Username: Օգտվողը. - - - - + + + + Password: Ծածկագիրը. - - Enabled protocol: - - - - - TCP and μTP + + Run external program on torrent completion - + Listening Port - + Port used for incoming connections: - + Random - + Use UPnP / NAT-PMP port forwarding from my router - + Use different port on each startup - + Connections Limits - + Maximum number of connections per torrent: - + Global maximum number of connections: - + Maximum number of upload slots per torrent: - + Global maximum number of upload slots: - + Proxy Server - + Type: - + (None) - + SOCKS4 - + SOCKS5 - + HTTP - + Host: - - + + Port: - + Otherwise, the proxy server is only used for tracker connections - + Use proxy for peer connections - + Disable connections not supported by proxies - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - + Use proxy only for torrents - - A&uthentication + + Info: The password is saved unencrypted - - Info: The password is saved unencrypted + + IP Filtering - + Filter path (.dat, .p2p, .p2b): - + Reload the filter - - Manually banned IP addresses... - - - - + Apply to trackers - + Global Rate Limits - - - - - - - KiB/s - - - - - + + Upload: + + + + KiB/s - Կբիթ/վ + Կբիթ/վ - - + + Download: - + Alternative Rate Limits - - + + Schedule the use of alternative rate limits + + + + From: from (time1 to time2) - - + To: time1 to time2 - + When: - + Every day - + Weekdays - + Weekends - + Rate Limits Settings - + Apply rate limit to peers on LAN - + Apply rate limit to transport overhead - - + + + Enable µTP protocol + + + + Apply rate limit to µTP protocol - + Privacy - + Enable DHT (decentralized network) to find more peers - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers - + Look for peers on your local network - + Enable Local Peer Discovery to find more peers - + Encryption mode: - + Prefer encryption - + Require encryption - + Disable encryption - + Enable when using a proxy or a VPN connection - + Enable anonymous mode - - Maximum active downloads: - - - - - Maximum active uploads: - - - - - Maximum active torrents: + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - Do not count slow torrents in these limits + + Torrent Queueing - - Upload rate threshold: + + Maximum active downloads: - - Download rate threshold: + + Maximum active uploads: - - sec - seconds + + Maximum active torrents: - - Torrent inactivity timer: + + Do not count slow torrents in these limits - + Share Ratio Limiting - + Seed torrents until their ratio reaches - + then - + Pause them - + Remove them - - RSS Smart Episode Filters + + Automatically add these trackers to new downloads: - - Use UPnP / NAT-PMP to forward the port from my router + + Enable Web User Interface (Remote control) - - Certificate: + + Use UPnP / NAT-PMP to forward the port from my router - - Import SSL Certificate + + Use HTTPS instead of HTTP - - Key: + + Certificate: - - Import SSL Key + + Import SSL Certificate - - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> + + Key: - - Use alternative Web UI + + Import SSL Key - - Files location: + + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - - Enable clickjacking protection + + Bypass authentication for localhost - - Enable Cross-Site Request Forgery (CSRF) protection + + Update my dynamic domain name - + Service: - + Register - + Domain name: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): - + %N: Torrent name - + %L: Category - - %G: Tags (seperated by comma) - - - - + %F: Content path (same as root path for multifile torrent) - + %R: Root path (first torrent subdirectory path) - + %D: Save path - + %C: Number of files - + %Z: Torrent size (bytes) - + %T: Current tracker - + %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor - + Folder is already being monitored: - + Folder does not exist: - + Folder is not readable: - + Adding entry failed - - - - + + Choose export directory - - - + + + + + + Choose a save directory - + Choose an IP filter file - + All supported filters - + SSL Certificate - + + SSL Key + + + + Parsing error - + Failed to parse the provided IP filter - + Successfully refreshed - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Invalid key - + This is not a valid SSL key. - + Invalid certificate - - Preferences - - - - - Import SSL certificate - - - - + This is not a valid SSL certificate. - - Import SSL key - - - - - SSL key - - - - + Time Error - + The start time and the end time can't be the same. - - + + Length Error - + The Web UI username must be at least 3 characters long. - + The Web UI password must be at least 6 characters long. @@ -6088,72 +5154,72 @@ PeerInfo - - Interested(local) and Choked(peer) + + interested(local) and choked(peer) - + interested(local) and unchoked(peer) - + interested(peer) and choked(local) - + interested(peer) and unchoked(local) - + optimistic unchoke - + peer snubbed - + incoming connection - + not interested(local) and unchoked(peer) - + not interested(peer) and unchoked(local) - + peer from PEX - + peer from DHT - + encrypted traffic - + encrypted handshake - + peer from LSD @@ -6161,180 +5227,165 @@ PeerListWidget - + IP IP - + Port Դարպաս - + Flags Դրոշակներ - + Connection Միացումը - + Client i.e.: Client application Ծրագիրը - + Progress i.e: % downloaded Ընթացքը - + Down Speed i.e: Download speed Ներբեռնելու արգ-ը - + Up Speed i.e: Upload speed Վերբ. արագ-ը - + Downloaded i.e: total data downloaded Ներբեռնվել է - + Uploaded i.e: total data uploaded Վերբեռնվել է - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. - + Files i.e. files that are being downloaded right now - + Column visibility Սյուների տեսքը - + Add a new peer... Ավելացնել նոր peer… - - + + Ban peer permanently Արգելել peer-ը մեկընդմիշտ - + Manually adding peer '%1'... - + The peer '%1' could not be added to this torrent. - + Manually banning peer '%1'... - - + + Peer addition Peer-ի լրացում - + Country - + Copy IP:port - + Some peers could not be added. Check the Log for details. - + The peers were added to this torrent. - + Are you sure you want to ban permanently the selected peers? Արգելե՞լ ընտրված peer-երը։ - + &Yes &Այո - + &No &Ոչ - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - + PeersAdditionDlg - - Format: IPv4:port / [IPv6]:port - - - - + No peer entered - + Please type at least one peer. - + Invalid peer - + The peer '%1' is invalid. @@ -6342,12 +5393,12 @@ PieceAvailabilityBar - + White: Unavailable pieces - + Blue: Available pieces @@ -6355,374 +5406,288 @@ PiecesBar - + Files in this piece: - + File in this piece - + File in these pieces - - Wait until metadata become available to see detailed information - - - - + Hold Shift key for detailed information - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Installed search plugins: - + Name Անունը - + Version - + Url - - + + Enabled - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Check for updates - + Close - + Uninstall - - - + + + Yes Այո - - - - + + + + No Ոչ - + Uninstall warning - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Uninstall success - + All selected plugins were uninstalled successfully - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - - - - - + + New search engine plugin URL - - + + URL: - + Invalid link - + The link doesn't seem to point to a search engine plugin. - + Select search plugins - + qBittorrent search plugin - + + + + Search plugin update + + + + All your plugins are already up to date. - + Sorry, couldn't check for plugin updates. %1 - + + + Search plugin install - - Couldn't install "%1" search engine plugin. %2 + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine - - Couldn't update "%1" search engine plugin. %2 + + Couldn't install "%1" search engine plugin. %2 - - - PluginSelectDlg - - Name - Անունը - - Yes - Այո + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + - No - Ոչ + + Couldn't update "%1" search engine plugin. %2 + - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Search plugin source: - + Local file - + Web link - PowerManagement + PreviewSelect - - qBittorrent is active - - - - - PreviewSelect - - Name - Անունը - - - Size - Չափը - - - Progress - Ընթացքը - - - Preview impossible - Դիտումը հնարավոր չէ - - - Sorry, we can't preview this file - Հնարավոր չէ դիտել այս ֆայլը - - - - PreviewSelectDialog - - - Preview - Դիտել - - - - Name - Անունը + + Name + Անունը - + Size - Չափը + Չափը - + Progress - Ընթացքը + Ընթացքը - - + + Preview impossible - Դիտումը հնարավոր չէ + Դիտումը հնարավոր չէ - - + + Sorry, we can't preview this file - Հնարավոր չէ դիտել այս ֆայլը - - - - Private::FileLineEdit - - - '%1' does not exist - - - - - '%1' does not point to a directory - - - - - '%1' does not point to a file - - - - - Does not have read permission in '%1' - - - - - Does not have write permission in '%1' - + Հնարավոր չէ դիտել այս ֆայլը PropListDelegate - + Not downloaded Չի բեռնվելու - - + + Normal Normal (priority) Նորմալ - - N/A - - - - + Do not download Do not download (priority) Չբեռնել - - + + High High (priority) Բարձր - + Mixed Mixed (priorities Խառը - - + + Maximum Maximum (priority) Առավելագույն @@ -6731,32 +5696,32 @@ PropTabBar - + General Գլխավորը - + Trackers Ուղղորդիչներ - + Peers Peer-եր - + HTTP Sources HTTP աղբյուրներ - + Content Պարունակությունը - + Speed @@ -6850,22 +5815,22 @@ Մեկնաբանություն. - + Select All Ընտրել բոլորը - + Select None Չընտրել ոչ մեկը - + Normal Նորմալ - + High Բարձր @@ -6925,177 +5890,165 @@ - + Maximum Առավելագույնը + - Do not download Չբեռնել - + Never Երբեք - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) - - + + %1 (%2 this session) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) - + Open Բացել - + Open Containing Folder Բացել թղթապանակը - + Rename... Անվանափոխել... - + Priority Առաջնահերթություն - + New Web seed Նոր վեբ շղթա - + Remove Web seed Հեռացնել վեբ շղթան - + Copy Web seed URL Պատճենել վեբ շղթայի URL-ն - + Edit Web seed URL Խմբագրել վեբ շղթայի URL-ն + Rename the file - Անվանափոխել + Անվանափոխել - + New name: Նոր անունը. + + The file could not be renamed - Հնարավոր չէ անվանափոխել ֆայլը + Հնարավոր չէ անվանափոխել ֆայլը + This file name contains forbidden characters, please choose a different one. - Ֆայլի անունը պարունակում է արգելված նշաններ, ընտրեք այլ անուն։ + Ֆայլի անունը պարունակում է արգելված նշաններ, ընտրեք այլ անուն։ - - + + This name is already in use in this folder. Please use a different name. Այս անունը արդեն առկա է տվյալ թղթապանակում։ Նշեք այլ անուն։ - + The folder could not be renamed Թղթապանակը հնարավոր չէ անվանափոխել - + qBittorrent qBittorrent - + Filter files... Զտիչի ֆայլեր... - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - - - - + New URL seed New HTTP source - + New URL seed: - - + + This URL seed is already in the list. - + Web seed editing Վեբ շղթայի խմբագրում - + Web seed URL: Վեբ շղթայի URL. @@ -7103,1295 +6056,1056 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + + + + + Error: '%1' is not a valid torrent file. + + + + + + Error: Could not add torrent to session. + + + + + I/O Error: Could not create temporary file. + + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. - - + + %1 must be the single command line parameter. - + + %1 must specify the correct port (1 to 65535). + + + + You cannot use %1: qBittorrent is already running for this user. - + Usage: - + Options: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' + + Displays program version - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' + + Displays this help message - - Expected integer number in environment variable '%1', but got '%2' + + Changes the Web UI port (current: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' + + Disable splash screen - - Expected %1 in environment variable '%2', but got '%3' + + Run in daemon-mode (background) - - port + + Downloads the torrents passed by the user - - %1 must specify a valid port (1 to 65535). - + + Help + Օգնություն - - Display program version and exit + + Run application with -h option to read about command line parameters. - - Display this help message and exit + + Bad command line - - Change the Web UI port + + Bad command line: - - Disable splash screen + + Legal Notice - - Run in daemon-mode (background) + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. - - dir - Use appropriate short form or abbreviation of "directory" + + Press %1 key to accept and continue... - - Store configuration files in <dir> + + Legal notice - - - name - + + Cancel + Չեղարկել + + + + I Agree + Համաձայն եմ - - Store configuration files in directories qBittorrent_<name> + + Torrent name: %1 - - Hack into libtorrent fastresume files and make file paths relative to the profile directory + + Torrent size: %1 - - files or URLs + + Save path: %1 - - Download the torrents passed by the user + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. + + Thank you for using qBittorrent. - - Options when adding new torrents: + + [qBittorrent] '%1' has finished downloading - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume + + The remote host name was not found (invalid hostname) - - path + + The operation was canceled - - Torrent save path + + The remote server closed the connection prematurely, before the entire reply was received and processed - - Add torrents as started or paused + + The connection to the remote server timed out - - Skip hash check - Բաց թողնել hash ստուգումը + + SSL/TLS handshake failed + - - Assign torrents to category. If the category doesn't exist, it will be created. + + The remote server refused the connection - - Download files in sequential order + + The connection to the proxy server was refused - - Download first and last pieces first + + The proxy server closed the connection prematurely - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: + + The proxy host name was not found - - Command line parameters take precedence over environment variables + + The connection to the proxy timed out or the proxy did not reply in time to the request sent - - Help - Օգնություն + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + - - Run application with -h option to read about command line parameters. + + The access to the remote content was denied (401) - - Bad command line + + The operation requested on the remote content is not permitted - - Bad command line: + + The remote content was not found at the server (404) - - Legal Notice + + The remote server requires authentication to serve the content but the credentials provided were not accepted - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + + The Network Access API cannot honor the request because the protocol is not known - - No further notices will be issued. + + The requested operation is invalid for this protocol - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. + + An unknown network-related error was detected - - Press %1 key to accept and continue... + + An unknown proxy-related error was detected - - Legal notice + + An unknown error related to the remote content was detected - - Cancel - Չեղարկել + + A breakdown in protocol was detected + - - I Agree - Համաձայն եմ + + Unknown error + - - + + Upgrade - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - + Couldn't migrate torrent with hash: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 + + Detected unclean program exit. Using fallback file to restore settings. - + An access error occurred while trying to write the configuration file. - + A format error occurred while trying to write the configuration file. - - - An unknown error occurred while trying to write the configuration file. - - RSS + Search - Փնտրում + Փնտրում + New subscription - Նոր բաժանորդագրում + Նոր բաժանորդագրում + + + Mark items read - Նշել որպես կարդացված + Նշել որպես կարդացված + Update all - Թարմացնել բոլորը + Թարմացնել բոլորը + RSS Downloader... - RSS ներբեռնում... + RSS ներբեռնում... + Settings... - Կարգավորումներ… + Կարգավորումներ… + + + + Torrents: (double-click to download) + + + Delete - Ջնջել + Ջնջել + Rename... - Անվանափոխել… + Անվանափոխել… + Rename - Անվանափոխել + Անվանափոխել + + Update - Թարմացնել + Թարմացնել + New subscription... - Նոր բաժանորդագրում… + Նոր բաժանորդագրում… + + Update all feeds - Թարմացնել բոլորը + Թարմացնել բոլորը + Download torrent - Ներբեռնել torrent-ը + Ներբեռնել torrent-ը + Open news URL - Բացել նորության հղումը + Բացել նորության հղումը + Copy feed URL - Պատճենել ալիքի հղումը + Պատճենել ալիքի հղումը + New folder... - Նոր թղթապանակ… + Նոր թղթապանակ… + Refresh RSS streams - Թարմացնել RSS հոսքերը + Թարմացնել RSS հոսքերը - RSS::AutoDownloader + RSSImp - - - Invalid data format. - + + Stream URL: + Հոսքի հղումը. - - Couldn't save RSS AutoDownloader data in %1. Error: %2 + + Please type a RSS stream URL - - Invalid data format + + This RSS feed is already in the list. - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - + + Please choose a folder name + Ընտրեք թղթապանակի անունը - - Couldn't load RSS AutoDownloader rules. Reason: %1 - + + Folder name: + Թղթապանակի անունը. - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - + + New folder + Նոր թղթապանակ - - RSS feed at '%1' updated. Added %2 new articles. + + Deletion confirmation - - Failed to parse RSS feed at '%1'. Reason: %2 + + Are you sure you want to delete the selected RSS feeds? - - Couldn't read RSS Session data from %1. Error: %2 - + + Please choose a new name for this RSS feed + Ընտրեք RSS ալիքի անունը - - Couldn't parse RSS Session data. Error: %1 - + + New feed name: + Անունը. - - Couldn't load RSS Session data. Invalid data format. - + + Name already in use + Այս անունով արդեն առկա է - - Couldn't load RSS article '%1#%2'. Invalid data format. - + + This name is already used by another item, please choose another one. + Այս անունով արդեն առկա է, օգտագործեք այլ անուն։ - - - RSS::Private::Parser - - Invalid RSS feed. - + + Date: + Ամսաթիվը. - - %1 (line: %2, column: %3, offset: %4). - + + Author: + Հեղինակը. + + + + Unread + Չկարդացած - RSS::Session + Rss::Feed - - RSS feed with given URL already exists: %1. + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... - - Cannot move root folder. + + Automatically downloading '%1' torrent from '%2' RSS feed... + + + Rss::Private::Parser - - - Item doesn't exist: %1. + + Invalid RSS feed. + + + RssSettingsDlg + + + RSS Reader Settings + RSS կարդալու ընտրանքները + - - Cannot delete root folder. - + + RSS feeds refresh interval: + RSS ալիքները թարմացնելու ժ-ը. - - Incorrect RSS Item path: %1. + + min - - RSS item with given path already exists: %1. - + + Maximum number of articles per feed: + Յուրաքանչյուր ալիքի համար հոդվածների առավ. ք-ը. + + + ScanFoldersDelegate - - Parent folder doesn't exist: %1. + + Select save location - RSSImp + ScanFoldersModel - Stream URL: - Հոսքի հղումը. + + Monitored Folder + - Please choose a folder name - Ընտրեք թղթապանակի անունը + + Override Save Location + - Folder name: - Թղթապանակի անունը. + + Monitored folder + - New folder - Նոր թղթապանակ - - - Please choose a new name for this RSS feed - Ընտրեք RSS ալիքի անունը - - - New feed name: - Անունը. - - - Name already in use - Այս անունով արդեն առկա է - - - This name is already used by another item, please choose another one. - Այս անունով արդեն առկա է, օգտագործեք այլ անուն։ - - - Date: - Ամսաթիվը. - - - Author: - Հեղինակը. + + Default save location + - Unread - Չկարդացած + + Browse... + Ընտրել... - RSSWidget + SearchEngine - - Search + + Unknown search engine plugin file format. - - Fetching of RSS feeds is disabled now! You can enable it in application settings. + + A more recent version of this plugin is already installed. - - New subscription - Նոր բաժանորդագրում - - - - - - Mark items read - Նշել որպես կարդացված - - - - Refresh RSS streams - Թարմացնել RSS հոսքերը - - - - Update all - Թարմացնել բոլորը - - - - RSS Downloader... - RSS ներբեռնում... - - - - Torrents: (double-click to download) + + + Plugin is not supported. - - - Delete - Ջնջել - - - - Rename... + + Update server is temporarily unavailable. %1 - - Rename - Անվանափոխել - - - - - Update - Թարմացնել - - - - New subscription... - Նոր բաժանորդագրում… - - - - - Update all feeds - Թարմացնել բոլորը + + + Failed to download the plugin file. %1 + - - Download torrent - Ներբեռնել torrent-ը + + An incorrect update info received. + - - Open news URL - Բացել նորության հղումը + + All categories + - - Copy feed URL - Պատճենել ալիքի հղումը + + Movies + - - New folder... - Նոր թղթապանակ… + + TV shows + - - Please choose a folder name - Ընտրեք թղթապանակի անունը + + Music + - - Folder name: - Թղթապանակի անունը. + + Games + - - New folder - Նոր թղթապանակ + + Anime + - - Please type a RSS feed URL + + Software - - Feed URL: + + Pictures - - Deletion confirmation + + Books + + + SearchListDelegate - - Are you sure you want to delete the selected RSS feeds? - + + + Unknown + Անհայտ + + + SearchTab - - Please choose a new name for this RSS feed - Ընտրեք RSS ալիքի անունը + + Name + i.e: file name + Անունը - - New feed name: - Անունը. + + Size + i.e: file size + Չափը - - Rename failed - + + Seeders + i.e: Number of full sources + Seed-եր - - Date: - Ամսաթիվը. + + Leechers + i.e: Number of partial sources + Leech-եր - - Author: - Հեղինակը. + + Search engine + Փնտրել - - - RssSettingsDlg - RSS Reader Settings - RSS կարդալու ընտրանքները + + Results (showing <i>%1</i> out of <i>%2</i>): + i.e: Search results + - RSS feeds refresh interval: - RSS ալիքները թարմացնելու ժ-ը. + + Torrent names only + - Maximum number of articles per feed: - Յուրաքանչյուր ալիքի համար հոդվածների առավ. ք-ը. + + Everywhere + - - - ScanFoldersDelegate - - Select save location + + Searching... - - - ScanFoldersModel - - Monitored Folder + + Search has finished - - Override Save Location + + Search aborted - - Monitored folder + + An error occurred during search... - - Default save location + + Search returned no results - - Browse... - Ընտրել... + + Column visibility + Սյուների տեսքը - - - SearchJobWidget - + Form - + Results(xxx) - + Search in: - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - + Seeds: - + <html><head/><body><p>Minimal number of seeds</p></body></html> - - + + to - + <html><head/><body><p>Maximal number of seeds</p></body></html> - - - + + + - + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + Size: Չափը. - + <html><head/><body><p>Minimal torrent size</p></body></html> - + <html><head/><body><p>Maximal torrent size</p></body></html> + + + SearchWidget - - Name - i.e: file name - Անունը + + + + + + Search + - - Size - i.e: file size - Չափը + + Download + Ներբեռնել - - Seeders - i.e: Number of full sources - Seed-եր + + Go to description page + - - Leechers - i.e: Number of partial sources - Leech-եր + + Copy description page URL + - - Search engine - Փնտրել + + Search plugins... + - - Filter search results... + + A phrase to search for. - - Results (showing <i>%1</i> out of <i>%2</i>): - i.e: Search results + + Spaces in a search term may be protected by double quotes. - - Torrent names only + + Example: + Search phrase example - - Everywhere + + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> + Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - - Use regular expressions + + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> + Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - - Searching... + + All plugins - - Search has finished + + Only enabled - - Search aborted + + Select... - - An error occurred during search... + + + + Search Engine - - Search returned no results + + Please install Python to use the Search Engine. - - Column visibility - Սյուների տեսքը + + Empty search pattern + - - - SearchListDelegate - Unknown - Անհայտ + + Please type a search pattern first + - - - SearchPluginManager - - Unknown search engine plugin file format. + + Stop - - A more recent version of this plugin is already installed. + + Search has finished - - - Plugin is not supported. + + Search has failed + + + ShutdownConfirmDlg - - All categories + + qBittorrent will now exit. - - Movies + + E&xit Now - - TV shows - + + Exit confirmation + Փակել հաստատումը - - Music + + The computer is going to shutdown. - - Games + + &Shutdown Now - - Anime + + The computer is going to enter suspend mode. - - Software + + &Suspend Now - - Pictures + + Suspend confirmation - - Books + + The computer is going to enter hibernation mode. - - Update server is temporarily unavailable. %1 + + &Hibernate Now - - - Failed to download the plugin file. %1 + + Hibernate confirmation - - An incorrect update info received. + + You can cancel the action within %1 seconds. - - Search plugin '%1' contains invalid version string ('%2') - + + Shutdown confirmation + Հաստատեք անջատումը - SearchTab + SpeedLimitDialog - Name - i.e: file name - Անունը - - - Size - i.e: file size - Չափը - - - Seeders - i.e: Number of full sources - Seed-եր - - - Leechers - i.e: Number of partial sources - Leech-եր - - - Search engine - Փնտրել - - - Column visibility - Սյուների տեսքը - - - Size: - Չափը. - - - - SearchWidget - - - - - - - - Search - - - - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - - - Download - Ներբեռնել - - - - Go to description page - - - - - Copy description page URL - - - - - Search plugins... - - - - - A phrase to search for. - - - - - Spaces in a search term may be protected by double quotes. - - - - - Example: - Search phrase example - - - - - <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> - Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - - - - - <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> - Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - - - - - All plugins - - - - - Only enabled - - - - - Select... - - - - - - - Search Engine - - - - - Please install Python to use the Search Engine. - - - - - Empty search pattern - - - - - Please type a search pattern first - - - - - Stop - - - - - Search has finished - - - - - Search has failed - - - - - ShutdownConfirmDialog - - - Don't show again - - - - - qBittorrent will now exit. - - - - - E&xit Now - - - - - Exit confirmation - Փակել հաստատումը - - - - The computer is going to shutdown. - - - - - &Shutdown Now - - - - - Shutdown confirmation - Հաստատեք անջատումը - - - - The computer is going to enter suspend mode. - - - - - &Suspend Now - - - - - Suspend confirmation - - - - - The computer is going to enter hibernation mode. - - - - - &Hibernate Now - - - - - Hibernate confirmation - - - - - You can cancel the action within %1 seconds. - - - - - ShutdownConfirmDlg - - Exit confirmation - Փակել հաստատումը - - - Shutdown confirmation - Հաստատեք անջատումը - - - - SpeedLimitDialog - - - KiB/s - Կբիթ/վ + + KiB/s + Կբիթ/վ SpeedPlotView - + Total Upload - + Total Download - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - + DHT Download - + Tracker Upload - + Tracker Download @@ -8399,95 +7113,87 @@ SpeedWidget - + Period: - + 1 Minute - + 5 Minutes - + 30 Minutes - + 6 Hours - + Select Graphs - + Total Upload - + Total Download - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - + DHT Download - + Tracker Upload - + Tracker Download - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8500,56 +7206,48 @@ Օգտվողի վիճակագրութուն - Alltime download: - Բոլոր ներբեռնումները. - - - Alltime upload: - Ընդ. վերբեռնվել է՝ - - - - Cache statistics + + Total peer connections: - - Read cache hits: + + Global ratio: - - Average time in queue: - + + Alltime download: + Բոլոր ներբեռնումները. - - Connected peers: - + + Alltime upload: + Ընդ. վերբեռնվել է՝ - - All-time share ratio: + + Total waste (this session): - - All-time download: + + Cache statistics - - Session waste: + + Read cache hits: - - All-time upload: + + Average time in queue: - Total buffer size: + Total buffers size: @@ -8578,11 +7276,12 @@ + OK - Լավ + Լավ - + %1 ms 18 milliseconds @@ -8591,35 +7290,32 @@ StatusBar - + Connection status: ՄԻացման ընթացքը. - + No direct connections. This may indicate network configuration problems. Չկան ուղիղ միացումներ։ - + DHT: %1 nodes DHT. %1 հանգույց + qBittorrent needs to be restarted - Պահանջվում է ծրագրի վերագործարկում + Պահանջվում է ծրագրի վերագործարկում + qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent-ը թարմացվել է։ Վերամեկնարկեք՝ փոփոխությունները կիրառելու համար։ - - - - qBittorrent needs to be restarted! - + qBittorrent-ը թարմացվել է։ Վերամեկնարկեք՝ փոփոխությունները կիրառելու համար։ @@ -8638,2157 +7334,1304 @@ Ցանցում է - + Click to switch to alternative speed limits Սեղմեք՝ այլընտրանքային սահ-ներին անցնելու համար - + Click to switch to regular speed limits Սեղմեք՝ հիմնական սահ-ներին անցնելու համար - + + Manual change of rate limits mode. The scheduler is disabled. + + + + Global Download Speed Limit Բեռնման արագ-ան գլոբալ սահ-ում - + Global Upload Speed Limit Փոխանցման արագ-ան գլոբալ սահ-ում - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - Բոլորը (0) + Բոլորը (0) - + Downloading (0) - Ներբեռնում (0) + Ներբեռնում (0) - + Seeding (0) - Փոխանցում (0) + Փոխանցում (0) - + Completed (0) - Ավարտված (0) + Ավարտված (0) - + Resumed (0) - Վերսկսված (0) + Վերսկսված (0) - + Paused (0) - Դադարի մեջ (0) + Դադարի մեջ (0) - + Active (0) - Ակտիվ (0) + Ակտիվ (0) - + Inactive (0) - Ոչ ակտիվ (0) + Ոչ ակտիվ (0) - + Errored (0) - + All (%1) - Բոլորը (%1) + Բոլորը (%1) - + Downloading (%1) - Ներբեռնում (%1) + Ներբեռնում (%1) - + Seeding (%1) - Փոխանցում (%1) + Փոխանցում (%1) - + Completed (%1) - Ավարտված (%1) + Ավարտված (%1) - + Paused (%1) - Դադարի մեջ (%1) + Դադարի մեջ (%1) - + Resumed (%1) - Վերսկսված (%1) + Վերսկսված (%1) - + Active (%1) - Ակտիվ (%1) + Ակտիվ (%1) - + Inactive (%1) - Ոչ ակտիվ (%1) + Ոչ ակտիվ (%1) - + Errored (%1) - StatusFiltersWidget + TorrentContentModel - All (0) - this is for the status filter - Բոլորը (0) - - - Downloading (0) - Ներբեռնում (0) - - - Seeding (0) - Փոխանցում (0) - - - Completed (0) - Ավարտված (0) - - - Resumed (0) - Վերսկսված (0) + + Name + Անունը - Paused (0) - Դադարի մեջ (0) + + Size + Չափը - Active (0) - Ակտիվ (0) + + Progress + Ընթացքը - Inactive (0) - Ոչ ակտիվ (0) + + Download Priority + - All (%1) - Բոլորը (%1) + + Remaining + Մնում է + + + TorrentCreatorDlg - Downloading (%1) - Ներբեռնում (%1) + + Select a folder to add to the torrent + Ընտեք թղթապանակ՝ torrent-ում ավելացնելու համար - Seeding (%1) - Փոխանցում (%1) + + Select a file to add to the torrent + Ընտեք ֆայլ՝ torrent-ում ավելացնելու համար - Completed (%1) - Ավարտված (%1) + + No input path set + Նշված չէ ճանապարհը - Paused (%1) - Դադարի մեջ (%1) + + Please type an input path first + Նախ նշեք ճանապարհը - Resumed (%1) - Վերսկսված (%1) + + Select destination torrent file + Ընտրեք torrent ֆայլը - Active (%1) - Ակտիվ (%1) + + Torrent Files (*.torrent) + - Inactive (%1) - Ոչ ակտիվ (%1) + + Torrent was created successfully: %1 + %1 is the path of the torrent + - - - TagFilterModel - - Tags - + + + + Torrent creation + Ստեղծել Torrent - - All - + + Torrent creation was unsuccessful, reason: %1 + Torrent-ի ստեղծումը ձախողվեց, պատճառը՝ %1 - - Untagged - + + Created torrent file is invalid. It won't be added to download list. + Ստեղծված torrent ֆայլը ճիշտ չէ։ Այն չի կարող ավելացվել ներբեռնելու ցանկին։ - TagFilterWidget + TorrentModel - - Add tag... - + + Name + i.e: torrent name + Անունը - - Remove tag - + + Size + i.e: torrent size + Չափը - - Remove unused tags - + + Done + % Done + -ը բեռնվել է - - Resume torrents - + + Status + Torrent status (e.g. downloading, seeding, paused) + Վիճակը - - Pause torrents - + + Seeds + i.e. full sources (often untranslated) + Seed-եր - - Delete torrents - + + Peers + i.e. partial sources (often untranslated) + Peer-եր - - New Tag - + + Down Speed + i.e: Download speed + Ներբեռ. արագ-ը - - Tag: - + + Up Speed + i.e: Upload speed + Վեր. արագ-ը - - Invalid tag name - + + Ratio + Share ratio + Սահ-ը - - Tag name '%1' is invalid - + + ETA + i.e: Estimated Time of Arrival / Time left + Մնացել է - - Tag exists + + Category - - Tag name already exists. - + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Ավելացվել է - - - TorrentCategoryDialog - - Torrent Category Properties - + + Completed On + Torrent was completed on 01/01/2010 08:00 + Ավարտվել է - - Name: - Անունը. + + Tracker + Ուղղորդիչը - - Save path: - + + Down Limit + i.e: Download limit + Ներբեռ. սահ-ում - - Choose save path - Ընտրեք պահպանելու տեղը + + Up Limit + i.e: Upload limit + Վեր. սահ-ում - - New Category - + + Downloaded + Amount of data downloaded (e.g. in MB) + Ներբեռնվել է - - Invalid category name - + + Uploaded + Amount of data uploaded (e.g. in MB) + Վերբեռնված - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Ա/շրջանի ներբեռնում - - Category creation error - + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Աշ/շրջանի վերբեռնում - - Category with the given name already exists. -Please choose a different name and try again. - + + Remaining + Amount of data left to download (e.g. in MB) + Մնում է - - - TorrentContentModel - - Name - Անունը + + Time Active + Time (duration) the torrent is active (not paused) + Ակտիվ ժ-ը - - Size - Չափը + + Save path + Torrent save path + Պահպանելու ճ-ը - - Progress - Ընթացքը + + Completed + Amount of data completed (e.g. in MB) + Ավարտված - - Download Priority + + Ratio Limit + Upload share ratio limit - - Remaining - Մնում է - - - - Availability + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole - - - TorrentCreatorDialog - - Torrent Creator + + Last Activity + Time passed since a chunk was downloaded/uploaded - - Select file/folder to share - + + Total Size + i.e. Size including unwanted data + Ընդհանուր չափ + + + TrackerFiltersList - - Path: - + + All (0) + this is for the tracker filter + Բոլորը (0) - - [Drag and drop area] + + Trackerless (0) - - - Select file + + Error (0) - - - Select folder + + Warning (0) - - Settings + + + Trackerless (%1) - - Piece size: - Մասի չափը. - - - - Auto - Ինքնա + + + Error (%1) + Սխալ (%1) - - 16 KiB - 512 ԿԲ {16 ?} + + + Warning (%1) + Զգուշացում (%1) - - 32 KiB - 32 ԿԲ + + Resume torrents + - - 64 KiB - 64 ԿԲ + + Pause torrents + - - 128 KiB - 128 ԿԲ + + Delete torrents + - - 256 KiB - 256 ԿԲ + + + All (%1) + this is for the tracker filter + Բոլորը (%1) + + + TrackerList - - 512 KiB - 512 ԿԲ + + URL + Հղումը - - 1 MiB - 1 ՄԲ + + Status + Վիճակը - - 2 MiB - 2 ՄԲ + + Received + - - 4 MiB - 4 ՄԲ + + Seeds + Seed-եր - - 8 MiB - 4 ՄԲ {8 ?} + + Peers + Peer-եր - - 16 MiB - 4 ՄԲ {16 ?} + + Downloaded + Ներբեռնվել է - - 32 MiB - 4 ՄԲ {16 ?} {32 ?} + + Message + Հաղորդագրություն - - Calculate number of pieces: - + + + Working + Աշխատում է - - Private torrent (Won't distribute on DHT network) - + + Disabled + Անջատված է - - Start seeding immediately - + + This torrent is private + Այս torrent-ը անձնական է - - Ignore share ratio limits for this torrent - + + Updating... + Թարմացվում է… - - Optimize alignment - + + Not working + Չի աշխատում - - Fields - + + Not contacted yet + Դեռ չի միացել - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + + Tracker URL: - - Web seed URLs: + + Tracker editing - - Tracker URLs: - Ուղղորդիչի հղումները. - - - - Comments: + + + Tracker editing failed - - Source: + + The tracker URL entered is invalid. - - Progress: - Ընթացքը. - - - - Create Torrent + + The tracker URL already exists. - - - - Torrent creation failed - + + Add a new tracker... + Ավելացնել նոր ուղղորդիչ… - - Reason: Path to file/folder is not readable. + + Copy tracker URL - - Select where to save the new torrent + + Edit selected tracker URL - - Torrent Files (*.torrent) + + Force reannounce to selected trackers - - Reason: %1 + + Force reannounce to all trackers - - Reason: Created torrent is invalid. It won't be added to download list. - + + Remove tracker + Ջնջել ուղղորդիչը + + + TrackersAdditionDlg - - Torrent creator - - - - - Torrent created: - - - - - TorrentCreatorDlg - - Select a folder to add to the torrent - Ընտեք թղթապանակ՝ torrent-ում ավելացնելու համար - - - Select a file to add to the torrent - Ընտեք ֆայլ՝ torrent-ում ավելացնելու համար - - - No input path set - Նշված չէ ճանապարհը - - - Please type an input path first - Նախ նշեք ճանապարհը - - - Select destination torrent file - Ընտրեք torrent ֆայլը - - - Torrent creation - Ստեղծել Torrent - - - Torrent creation was unsuccessful, reason: %1 - Torrent-ի ստեղծումը ձախողվեց, պատճառը՝ %1 - - - Created torrent file is invalid. It won't be added to download list. - Ստեղծված torrent ֆայլը ճիշտ չէ։ Այն չի կարող ավելացվել ներբեռնելու ցանկին։ - - - Piece size: - Մասի չափը. - - - Auto - Ինքնա - - - 16 KiB - 512 ԿԲ {16 ?} - - - 32 KiB - 32 ԿԲ - - - 64 KiB - 64 ԿԲ - - - 128 KiB - 128 ԿԲ - - - 256 KiB - 256 ԿԲ - - - 512 KiB - 512 ԿԲ - - - 1 MiB - 1 ՄԲ - - - 2 MiB - 2 ՄԲ - - - 4 MiB - 4 ՄԲ - - - 8 MiB - 4 ՄԲ {8 ?} - - - 16 MiB - 4 ՄԲ {16 ?} - - - 32 MiB - 4 ՄԲ {16 ?} {32 ?} - - - Tracker URLs: - Ուղղորդիչի հղումները. - - - Progress: - Ընթացքը. - - - - TorrentInfo - - - File size exceeds max limit %1 - - - - - Torrent file read error: %1 - - - - - Torrent file read error: size mismatch - - - - - TorrentModel - - Name - i.e: torrent name - Անունը - - - Size - i.e: torrent size - Չափը - - - Done - % Done - -ը բեռնվել է - - - Status - Torrent status (e.g. downloading, seeding, paused) - Վիճակը - - - Seeds - i.e. full sources (often untranslated) - Seed-եր - - - Peers - i.e. partial sources (often untranslated) - Peer-եր - - - Down Speed - i.e: Download speed - Ներբեռ. արագ-ը - - - Up Speed - i.e: Upload speed - Վեր. արագ-ը - - - Ratio - Share ratio - Սահ-ը - - - ETA - i.e: Estimated Time of Arrival / Time left - Մնացել է - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - Ավելացվել է - - - Completed On - Torrent was completed on 01/01/2010 08:00 - Ավարտվել է - - - Tracker - Ուղղորդիչը - - - Down Limit - i.e: Download limit - Ներբեռ. սահ-ում - - - Up Limit - i.e: Upload limit - Վեր. սահ-ում - - - Downloaded - Amount of data downloaded (e.g. in MB) - Ներբեռնվել է - - - Uploaded - Amount of data uploaded (e.g. in MB) - Վերբեռնված - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - Ա/շրջանի ներբեռնում - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - Աշ/շրջանի վերբեռնում - - - Remaining - Amount of data left to download (e.g. in MB) - Մնում է - - - Time Active - Time (duration) the torrent is active (not paused) - Ակտիվ ժ-ը - - - Save path - Torrent save path - Պահպանելու ճ-ը - - - Completed - Amount of data completed (e.g. in MB) - Ավարտված - - - Total Size - i.e. Size including unwanted data - Ընդհանուր չափ - - - - TorrentsController - - - Not contacted yet - - - - - Updating... - - - - - Working - Աշխատում է - - - - Not working - Չի աշխատում - - - - Error: '%1' is not a valid torrent file. - - - - - - - - Torrent queueing must be enabled - - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - - Cannot make save path - - - - - Cannot write to directory - - - - - WebUI Set location: moving "%1", from "%2" to "%3" - - - - - Incorrect torrent name - - - - - - Incorrect category name - - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - Բոլորը (0) - - - - Trackerless (0) - - - - - Error (0) - - - - - Warning (0) - - - - - - Trackerless (%1) - - - - - - Error (%1) - Սխալ (%1) - - - - - Warning (%1) - Զգուշացում (%1) - - - - Resume torrents - - - - - Pause torrents - - - - - Delete torrents - - - - - - All (%1) - this is for the tracker filter - Բոլորը (%1) - - - - TrackerList - - URL - Հղումը - - - Status - Վիճակը - - - Seeds - Seed-եր - - - Peers - Peer-եր - - - Downloaded - Ներբեռնվել է - - - Message - Հաղորդագրություն - - - Working - Աշխատում է - - - Disabled - Անջատված է - - - This torrent is private - Այս torrent-ը անձնական է - - - Updating... - Թարմացվում է… - - - Not working - Չի աշխատում - - - Not contacted yet - Դեռ չի միացել - - - Add a new tracker... - Ավելացնել նոր ուղղորդիչ… - - - Column visibility - Սյուների տեսքը - - - Remove tracker - Ջնջել ուղղորդիչը - - - - TrackerListWidget - - - - Working - Աշխատում է - - - - Disabled - Անջատված է - - - - This torrent is private - Այս torrent-ը անձնական է - - - - Updating... - - - - - Not working - Չի աշխատում - - - - Not contacted yet - - - - - - - - - - N/A - - - - - Tracker editing - - - - - Tracker URL: - - - - - - Tracker editing failed - - - - - The tracker URL entered is invalid. - - - - - The tracker URL already exists. - - - - - Add a new tracker... - Ավելացնել նոր ուղղորդիչ… - - - - Remove tracker - Ջնջել ուղղորդիչը - - - - Copy tracker URL - - - - - Edit selected tracker URL - - - - - Force reannounce to selected trackers - - - - - Force reannounce to all trackers - - - - - URL - Հղումը - - - - Status - Վիճակը - - - - Received - - - - - Seeds - Seed-եր - - - - Peers - Peer-եր - - - - Downloaded - Ներբեռնվել է - - - - Message - Հաղորդագրություն - - - - Column visibility - Սյուների տեսքը - - - - TrackerLoginDialog - - - - Tracker authentication - Ներկայացում ուղղորդիչում - - - - Tracker: - Ուղղորդիչը. - - - - Login - Մուտքաբառը - - - - Username: - Օգտվողը. - - - - Password: - Ծածկագիրը. - - - - Log in - Մուտք - - - - TrackersAdditionDialog - - - Trackers addition dialog - Ուղղորդիչներ ավելացնելու պատուհան - - - - List of trackers to add (one per line): - Ավելացվող ուղղորդիչների ցանկը. - - - - µTorrent compatible list URL: - µTorrent-ի հետ համատեղելի հղումներ. - - - - No change - Չկա փոփոխություն - - - - No additional trackers were found. - Չեն գտնվել լրացուցիչ ուղղորդիչներ։ - - - - Download error - Ներբեռնելու սխալ - - - - The trackers list could not be downloaded, reason: %1 - Ուղղորդիչների ցանկը չի կարող ներբեռնվել, պատճառը՝ %1 - - - - TrackersAdditionDlg - + Trackers addition dialog - Ուղղորդիչներ ավելացնելու պատուհան - - - List of trackers to add (one per line): - Ավելացվող ուղղորդիչների ցանկը. - - - µTorrent compatible list URL: - µTorrent-ի հետ համատեղելի հղումներ. - - - I/O Error - Ն/Ա սխալ - - - Error while trying to open the downloaded file. - Սխալ՝ ներբեռնելու ֆայլը բացելիս։ - - - No change - Չկա փոփոխություն - - - No additional trackers were found. - Չեն գտնվել լրացուցիչ ուղղորդիչներ։ - - - Download error - Ներբեռնելու սխալ - - - The trackers list could not be downloaded, reason: %1 - Ուղղորդիչների ցանկը չի կարող ներբեռնվել, պատճառը՝ %1 - - - - TransferListDelegate - - - Downloading - Ներբեռնվում է - - - - Downloading metadata - used when loading a magnet link - Ներբեռնելու մետատվյալներ - - - - Allocating - qBittorrent is allocating the files on disk - - - - - Paused - Դադարի մեջ է - - - - Queued - i.e. torrent is queued - Հերթում է - - - - Seeding - Torrent is complete and in upload-only mode - Փոխանցվում է - - - - Stalled - Torrent is waiting for download to begin - Սպասում է - - - - [F] Downloading - used when the torrent is forced started. You probably shouldn't translate the F. - [F] Ներբեռնում է - - - - [F] Seeding - used when the torrent is forced started. You probably shouldn't translate the F. - [F] Փոխանցում - - - - Checking - Torrent local data is being checked - Ստուգվում է - - - - Queued for checking - i.e. torrent is queued for hash checking - - - - - Checking resume data - used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - - - - - Completed - Ավարտված - - - - Moving - Torrent local data are being moved/relocated - - - - - Missing Files - Բացակայող ֆայլեր - - - - Errored - torrent status, the torrent has an error - - - - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - - - - - %1 ago - e.g.: 1h 20m ago - %1 առաջ - - - - TransferListFiltersWidget - - - Status - Վիճակը - - - - Categories - - - - - Tags - - - - - Trackers - Ուղղորդիչներ - - - - TransferListModel - - - Name - i.e: torrent name - Անունը + Ուղղորդիչներ ավելացնելու պատուհան - - Size - i.e: torrent size - Չափը + + List of trackers to add (one per line): + Ավելացվող ուղղորդիչների ցանկը. - - - Done - % Done - -ը բեռնվել է + + + µTorrent compatible list URL: + µTorrent-ի հետ համատեղելի հղումներ. - - Status - Torrent status (e.g. downloading, seeding, paused) - Վիճակը + + I/O Error + Ն/Ա սխալ - - Seeds - i.e. full sources (often untranslated) - Seed-եր + + Error while trying to open the downloaded file. + Սխալ՝ ներբեռնելու ֆայլը բացելիս։ - - Peers - i.e. partial sources (often untranslated) - Peer-եր + + No change + Չկա փոփոխություն - - Down Speed - i.e: Download speed - + + No additional trackers were found. + Չեն գտնվել լրացուցիչ ուղղորդիչներ։ - - Up Speed - i.e: Upload speed - + + Download error + Ներբեռնելու սխալ - - Ratio - Share ratio - Սահ-ը + + The trackers list could not be downloaded, reason: %1 + Ուղղորդիչների ցանկը չի կարող ներբեռնվել, պատճառը՝ %1 + + + TransferListDelegate - - ETA - i.e: Estimated Time of Arrival / Time left - Մնացել է + + Downloading + Ներբեռնվում է - - Category - + + Downloading metadata + used when loading a magnet link + Ներբեռնելու մետատվյալներ - - Tags + + Allocating + qBittorrent is allocating the files on disk - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - Ավելացվել է + + Paused + Դադարի մեջ է - - Completed On - Torrent was completed on 01/01/2010 08:00 - Ավարտվել է + + Queued + i.e. torrent is queued + Հերթում է - - Tracker - Ուղղորդիչը + + Seeding + Torrent is complete and in upload-only mode + Փոխանցվում է - - Down Limit - i.e: Download limit - Ներբեռ. սահ-ում + + Stalled + Torrent is waiting for download to begin + Սպասում է - - Up Limit - i.e: Upload limit - Վեր. սահ-ում + + [F] Downloading + used when the torrent is forced started. You probably shouldn't translate the F. + [F] Ներբեռնում է - - Downloaded - Amount of data downloaded (e.g. in MB) - Ներբեռնվել է + + [F] Seeding + used when the torrent is forced started. You probably shouldn't translate the F. + [F] Փոխանցում - - Uploaded - Amount of data uploaded (e.g. in MB) - + + Checking + Torrent local data is being checked + Ստուգվում է - - Session Download - Amount of data downloaded since program open (e.g. in MB) - Ա/շրջանի ներբեռնում + + Queued for checking + i.e. torrent is queued for hash checking + - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - Աշ/շրջանի վերբեռնում + + Checking resume data + used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. + - - Remaining - Amount of data left to download (e.g. in MB) - Մնում է + + Completed + Ավարտված - - Time Active - Time (duration) the torrent is active (not paused) - Ակտիվ ժ-ը + + Missing Files + Բացակայող ֆայլեր - - Save path - Torrent save path - Պահպանելու ճ-ը + + Errored + torrent status, the torrent has an error + - - Completed - Amount of data completed (e.g. in MB) - Ավարտված + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) + - - Ratio Limit - Upload share ratio limit - + + %1 ago + e.g.: 1h 20m ago + %1 առաջ + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + Վիճակը - - Last Activity - Time passed since a chunk was downloaded/uploaded + + Categories - - Total Size - i.e. Size including unwanted data - Ընդհանուր չափ + + Trackers + Ուղղորդիչներ TransferListWidget - + Column visibility Սյուների տեսքը - + Choose save path Ընտրեք պահպանելու տեղը - + Torrent Download Speed Limiting Torrent-ների բեռնման արագ. սահ-ում - + Torrent Upload Speed Limiting Torrent-ների փոխանցման արագ. սահ-ում - + Recheck confirmation - + Are you sure you want to recheck the selected torrent(s)? - + Rename Անվանափոխել - + New name: Նոր անունը. - + Resume Resume/start the torrent Վերսկսել - + Force Resume Force Resume/start the torrent - + Pause Pause the torrent Դադար - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - - - - - Add Tags - - - - - Remove All Tags - - - - - Remove all tags from selected torrents? + + New Category - - Comma-separated tags: + + Category: - - Invalid tag + + Invalid category name - - Tag name: '%1' is invalid + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. - + Delete Delete the torrent Ջնջել - + Preview file... Նախն. դիտում… - + Limit share ratio... Արագ-ան սահ-ներ... - + Limit upload rate... Փոխանցման սահ-ը… - + Limit download rate... Բեռնման սահմանափակումը… - + Open destination folder Բացել պարունակող թղթապանակը - + Move up i.e. move up in the queue Շարժել վերև - + Move down i.e. Move down in the queue Շարժել ներքև - + Move to top i.e. Move to top of the queue Հերթում առաջ - + Move to bottom i.e. Move to bottom of the queue Հերթում հետ - + Set location... Բեռնման տեղը... - - Force reannounce - - - - + Copy name Պատճենել անունը - - Copy hash - - - - + Download first and last pieces first - + Automatic Torrent Management - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - + Category - + New... New category... - + Reset Reset category - - Tags - - - - - Add... - Add / assign multiple tags... - - - - - Remove All - Remove all tags - - - - + Priority Առաջնայնությունը - + Force recheck Ստիպ. վերստուգում - + Copy magnet link Պատճենել magnet հղումը - + Super seeding mode Գերփոխանցման եղանակ - + Rename... Անվանափոխել... - + Download in sequential order Բեռնել հաջորդական կարգով - UpDownRatioDialog - - - Torrent Upload/Download Ratio Limiting - Torrent-ի ներբեռնելու/վերբեռնելու սահ-եր - - - - Use global share limit - - - - - - - buttonGroup - Խմբի կոճակը - - - - Set no share limit - - - - - Set share limit to - - - - - ratio - - - - - minutes - - - - - No share limit method selected - - - - - Please select a limit method first - - - - UpDownRatioDlg + Torrent Upload/Download Ratio Limiting - Torrent-ի ներբեռնելու/վերբեռնելու սահ-եր + Torrent-ի ներբեռնելու/վերբեռնելու սահ-եր + Use global ratio limit - Օգտ. ընդհ. սահ-ներ + Օգտ. ընդհ. սահ-ներ + + + buttonGroup - Խմբի կոճակը + Խմբի կոճակը + Set no ratio limit - Առանց սահ-ների + Առանց սահ-ների + Set ratio limit to - Արագ-ը սահ-ել՝ + Արագ-ը սահ-ել՝ - Utils::ForeignApps - - - Python detected, version: %1 - - + WebApplication - - Python not detected + + Incorrect category name - WebApplication + WebUI - - Unacceptable file type, only regular file is allowed. + + The Web UI is listening on port %1 - - Symlinks inside alternative UI folder are forbidden. + + Web UI Error - Unable to bind Web UI to port %1 + + + about - - Exceeded the maximum allowed file size (%1)! + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' + + Copyright %1 2006-2016 The qBittorrent project - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' + + Home Page: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' + + Forum: - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' + + Bug Tracker: - WebUI - - - Web UI: HTTPS setup successful - - + addPeersDialog - - Web UI: HTTPS setup failed, fallback to HTTP + + Add Peers - - Web UI: Now listening on IP: %1, port: %2 + + List of peers to add (one per line): - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 + + Format: IPv4:port / [IPv6]:port authentication + + Tracker authentication - Ներկայացում ուղղորդիչում + Ներկայացում ուղղորդիչում + Tracker: - Ուղղորդիչը. + Ուղղորդիչը. + Login - Մուտքաբառը + Մուտքաբառը + Username: - Օգտվողը. + Օգտվողը. + Password: - Ծածկագիրը. + Ծածկագիրը. + Log in - Մուտք + Մուտք + Cancel - Չեղարկել + Չեղարկել confirmDeletionDlg + Deletion confirmation - qBittorrent - Հաստատեք ջնջումը + Հաստատեք ջնջումը + Remember choice - Հիշել ընտրությունը + Հիշել ընտրությունը + Also delete the files on the hard disk - Նաև ջնջել ֆայլերը պնակից + Նաև ջնջել ֆայլերը պնակից + + + + confirmShutdownDlg + + + Don't show again + createTorrentDialog + Cancel - Չեղարկել + Չեղարկել + Torrent Creation Tool - Torrent ստեղծելու գործիք + Torrent ստեղծելու գործիք + Torrent file creation - Torrent ֆայլի ստեղծում + Torrent ֆայլի ստեղծում + Add file - Ավելացնել ֆայլ + Ավելացնել ֆայլ + Add folder - Ավելացնել թղթապանակ + Ավելացնել թղթապանակ + File or folder to add to the torrent: - Ավելացրեք torrent-ում ֆայլեր կամ թղթապանակներ. + Ավելացրեք torrent-ում ֆայլեր կամ թղթապանակներ. + Tracker URLs: - Ուղղորդիչի հղումները. + Ուղղորդիչի հղումները. + Web seeds urls: - Փոխանցողների հղումները. + Փոխանցողների հղումները. + Comment: - Մեկնաբանություն. + Մեկնաբանություն. + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + + Piece size: - Մասի չափը. + Մասի չափը. + 16 KiB - 512 ԿԲ {16 ?} + 512 ԿԲ {16 ?} + 32 KiB - 32 ԿԲ + 32 ԿԲ + 64 KiB - 64 ԿԲ + 64 ԿԲ + 128 KiB - 128 ԿԲ + 128 ԿԲ + 256 KiB - 256 ԿԲ + 256 ԿԲ + 512 KiB - 512 ԿԲ + 512 ԿԲ + 1 MiB - 1 ՄԲ + 1 ՄԲ + 2 MiB - 2 ՄԲ + 2 ՄԲ + 4 MiB - 4 ՄԲ + 4 ՄԲ + 8 MiB - 4 ՄԲ {8 ?} + 4 ՄԲ {8 ?} + 16 MiB - 4 ՄԲ {16 ?} + 4 ՄԲ {16 ?} + Auto - Ինքնա + Ինքնա + Private (won't be distributed on DHT network if enabled) - Գաղտնի (չի տեղորոշվի DHT ցանցում եթե թույլատրված է) + Գաղտնի (չի տեղորոշվի DHT ցանցում եթե թույլատրված է) + Start seeding after creation - Ստեղծելուց հետո սկսել փոխանցումը + Ստեղծելուց հետո սկսել փոխանցումը + + + + Ignore share ratio limits for this torrent + + Create and save... - Ստեղծել կամ պահպանել… + Ստեղծել կամ պահպանել… + Progress: - Ընթացքը. + Ընթացքը. downloadFromURL + Add torrent links - Ավելացնել torrent-ի հղումներ + Ավելացնել torrent-ի հղումներ + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + + Download - Ներբեռնել + Ներբեռնել + Cancel - Չեղարկել + Չեղարկել + Download from urls - Ներբեռնել հղումներից + Ներբեռնել հղումներից + No URL entered - Գրեք հղումներ + Գրեք հղումներ + Please type at least one URL. - Նշեք գոնե մեկ հղում։ + Նշեք գոնե մեկ հղում։ + + + + errorDialog + + + Crash info + fsutils - + + + + + Downloads Բեռնումներ @@ -10796,131 +8639,140 @@ misc - + B bytes Բ - + KiB kibibytes (1024 bytes) ԿԲ - + MiB mebibytes (1024 kibibytes) ՄԲ - + GiB gibibytes (1024 mibibytes) ԳԲ - + TiB tebibytes (1024 gibibytes) ՏԲ - + PiB pebibytes (1024 tebibytes) - + EiB exbibytes (1024 pebibytes) - + + Python not detected + + + + + Python version: %1 + + + + /s per second - + %1h %2m e.g: 3hours 5minutes %1ժ %2ր - + %1d %2h e.g: 2days 10hours %1օր %2ժ - + Unknown Unknown (size) Անհայտ - + qBittorrent will shutdown the computer now because all downloads are complete. Բոլոր ներբեռնումները ավարտվել են։ Համակարգիչը անջատվում է։ - + < 1m < 1 minute « 1ր - + %1m e.g: 10minutes %1րոպե + Working - Աշխատում է + Աշխատում է + Updating... - Թարմացվում է... + Թարմացվում է... + Not working - Չի աշխատում + Չի աշխատում + Not contacted yet - Դեռ չի միացնել + Դեռ չի միացնել preview - + Preview selection Դիտել ընտրվածը - + The following files support previewing, please select one of them: + Preview - Դիտել + Դիտել + Cancel - Մերժել - - - - trackerLogin - - Log in - Մուտք + Մերժել diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_id.ts qbittorrent-3.3.15/src/lang/qbittorrent_id.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_id.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_id.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent Tentang qBittorrent - + About Tentang - + Author - Pembuat + Pengembang - - Current maintainer - Pengelola sekarang - - - - Greece - Yunani - - - - + + Nationality: Kewarganegaraan: - - + + + Name: + Nama: + + + + E-mail: Surel: - - - Name: - Nama: + + Greece + Yunani - - Original author - Pembuat asli: + + Current maintainer + Pengelola saat ini - - France - Perancis + + Original author + Pengembang asli - + Special Thanks - Terima Kasih Spesial + Terima Kasih Khusus - + Translators - Penerjemah - - - - License - Lisensi + Para Penerjemah - + Libraries Pustaka - + qBittorrent was built with the following libraries: - qBittorrent dibangun dengan pustaka berikut: - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - Klien BitTorrent lebih lanjut diprogram di C++, berdasar pada Qt toolkit dan libtorrent-rasterbar. - - - - Copyright %1 2006-2018 The qBittorrent project - Hak cipta %1 2006-2018 Proyek qBittorrent - - - - Home Page: - Laman Utama: + qBittorrent dibangun menggunakan sumber-sumber berikut: - - Forum: - Forum: + + France + Perancis - - Bug Tracker: - Pencari Bug: + + License + Lisensi @@ -115,57 +90,67 @@ Simpan di - + + Browse... + Telusuri... + + + + Set as default save path + Tetapkan sebagai jalur baku penyimpanan + + + Never show again Jangan pernah tampilkan lagi - + Torrent settings Pengaturan torrent - + Set as default category - Tetapkan sebagai kategori baku + Tetapkan sebagai kategori umum - + Category: Kategori: - + Start torrent Jalankan torrent - + Torrent information - Informasi torrent + Informasi torrent: - + Skip hash check Lewati pengecekan hash - + Size: Ukuran: - + Hash: - Hash: + Tanda: - + Comment: Komentar: - + Date: Tanggal: @@ -177,7 +162,7 @@ Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - Mode otomatis artinya berbagai properti torrent (mis jalur penyimpanan) akan ditentukan oleh kategori terkait + Mode otomatis artinya properti torrent (mis jalur penyimpanan) akan ditentukan oleh kategori terkait @@ -190,117 +175,89 @@ Otomatis - - Remember last used save path - Ingatkan tempat terakhir menyimpan - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - Jika diaktifkan, berkas .torrent tidak akan dihapus, mengabaikan pengaturan pada halaman "Unduhan" dari dialog opsi + Jika diaktifkan, berkas .torrent tidak akan dihapus, mengabaikan pengaturan pada pada dialog opsi halaman "Unduhan" - + Do not delete .torrent file - Jangan hapus berkas .torrent + Jangan hapus berkas .torrent ini - - Create subfolder - Buat subfolder - - - - Download in sequential order - Unduh dengan urutan sekuensial - - - - Download first and last pieces first - Unduh bagian awal dan akhir dahulu - - - + Normal Normal - + High Tinggi - + Maximum Maksimum - + Do not download Jangan unduh - - - + + + I/O Error Galat I/O - + Invalid torrent Torrent tidak valid - - Renaming - Berganti nama - - - - - Rename error - Ganti nama gagal + + + + + Already in download list + Telah ada di dalam daftar unduh - - The name is empty or contains forbidden characters, please choose a different one. - Nama kosong atau mengandung karakter yang dilarang, silakan pilih nama yang lainnya. - - - + Not Available This comment is unavailable Tidak Tersedia - + Not Available This date is unavailable Tidak Tersedia - + Not available Tidak tersedia - + Invalid magnet link Tautan magnet tidak valid - + The torrent file '%1' does not exist. Berkas torrent '%1' tidak ada. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. Berkas torrent '%1' tidak bisa dibaca dari diska. Mungkin Anda tidak memiliki izin yang cukup. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ Galat: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torrent teah ada di daftar unduh. Pelacak tidak dapat digabungkan karena ini adalah torrent pribadi. + + + + Torrent is already in download list. Trackers were merged. + Torrent telah ada di dalam daftar unduh. Pelacak digabungkan. + + + + + Cannot add torrent + Tidak bisa menambahkan torrent + + + + Cannot add this torrent. Perhaps it is already in adding state. + Tidak bisa menambahkan torrent ini. Sepertinya sudah ditambahkan. + + + This magnet link was not recognized Tautan magnet ini tidak dikenali - + + Magnet link is already in download list. Trackers were merged. + Tautan magnet telah ada di dalam daftar unduh. Pelacak digabungkan. + + + + Cannot add this torrent. Perhaps it is already in adding. + Tidak bisa menambahkan torrent ini. Sepertinya sedang ditambahkan. + + + Magnet link Tautan magnet - + Retrieving metadata... Mengambil metadata... - + Not Available This size is unavailable. Tidak Tersedia - + Free space on disk: %1 Ruang bebas pada diska: 1% - + + Choose save path Pilih jalur penyimpanan - - - - - - - Torrent is already present - Torrent sudah ada - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - Torrent '%1' sudah masuk di daftar transfer. Pencari tidak dapat digabung karena torrent pribadi. + + Rename the file + Ubah nama berkas - - Torrent '%1' is already in the transfer list. Trackers have been merged. - Torrent '%1' sudah masuk di daftar transfer. Pencari telah digabung. - - - - Torrent is already queued for processing. - Torrent sudah mengantrikan untuk memproses. - - - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - Link Magnet '%1' sudah masuk di daftar transfer. Pencari telah digabung. + + New name: + Nama baru: - - Magnet link is already queued for processing. - Link Magnet sudah diurutkan untuk proses. + + + The file could not be renamed + Berkas tidak bisa diubah namanya - - New name: - Nama baru: + + This file name contains forbidden characters, please choose a different one. + Nama berkas ini mengandung karakter yang dilarang, mohon pilih karakter yang berbeda. - - + + This name is already in use in this folder. Please use a different name. Nama ini telah digunakan dalam folder ini. Mohon gunakan nama yang berbeda. - + The folder could not be renamed Folder tidak bisa diubah namanya - + Rename... Ubah nama... - + Priority Prioritas - + Invalid metadata Metadata tidak valid - + Parsing metadata... Mengurai metadata... - + Metadata retrieval complete Pengambilan metadata komplet - + Download Error Galat Unduh @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Ukuran tembolok penulisan diska + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Port keluar (Min) [0: Nonaktif] - + Outgoing ports (Max) [0: Disabled] Port keluar (Max) [0: Nonaktif] - + Recheck torrents on completion Periksa ulang torrent saat selesai - + Transfer list refresh interval Selang penyegaran daftar transfer - + ms milliseconds ms - + Setting Pengaturan - + Value Value set for this setting Nilai - - - (disabled) - (nonaktif) - - - + (auto) (otomatis) - - min - minutes - men - - - + All addresses Semua alamat - + qBittorrent Section Bagian qBittorrent - - + + Open documentation Buka dokumentasi - + libtorrent Section Bagian libtorrent - - Asynchronous I/O threads - Asingkron rangkaian I/O - - - - Disk cache - Cache diska - - - + s seconds s - + Disk cache expiry interval Selang kedaluwarsa tembolok diska - + Enable OS cache Aktifkan tembolok OS - - Guided read cache - Bimbingan pembacaan cache - - - - Coalesce reads & writes - Gabungkan baca & tulis - - - - Send upload piece suggestions - Kirim saran potongan unggahan - - - - - KiB - KiB - - - - Send buffer watermark - Kirim tanda air buffer - - - - Send buffer low watermark - Kirim tanda air buffer rendah - - - - Send buffer watermark factor - Kirim tanda air buffer factor - - - - Prefer TCP - Pilih TCP - - - - Peer proportional (throttles TCP) - Proporsi sejawat (sesak TCP) - - - - Allow multiple connections from the same IP address - Izinkan banyak koneksi dari Alamat IP yang sama + + m + minutes + m - + Resolve peer countries (GeoIP) Singkap negara rekan (GeoIP) - + Resolve peer host names Singkap nama host rekan - + Strict super seeding Pembibitan super ketat - + Network Interface (requires restart) Antarmuka Jaringan (wajib memulai ulang) - + Optional IP Address to bind to (requires restart) - Alamat IP pilihan untuk mengikat (Wajib memulai ulang) + - + Listen on IPv6 address (requires restart) Mendengarkan alamat IPv6 (wajib memulai ulang) - + Display notifications Tampilkan notifikasi - + Display notifications for added torrents Tampilkan notifikasi untuk torrent yang ditambahkan - + Download tracker's favicon - Unduh favicon milik tracker - - - - Save path history length - Simpan tempat panjang riwayat - - - - Fixed slots - Slot tetap + Favicon pelacak unduhan - - Upload rate based - Laju unggah dasar - - - - Upload slots behavior - Unggah tingkah laku slot - - - - Round-robin - Usul - - - - Fastest upload - Unggah cepat - - - - Anti-leech - Anti-leech - - - - Upload choking algorithm - Unggah algoritma tersendat - - - + Confirm torrent recheck Konfirmasi pemeriksaan ulang torrent - - Confirm removal of all tags - Konfirmasi pembuangan semua tanda + Exchange trackers with other peers + Bertukar pelacak dengan rekan lainnya - - Always announce to all trackers in a tier - Selalu umumkan kepada semua traker dalam satu deretan + + Always announce to all trackers + Selalu umumkan ke semua pelacak - - Always announce to all tiers - Selalu umumkan kepada semua deretan - - - + Any interface i.e. Any network interface Antarmuka apapun - + Save resume data interval How often the fastresume file is saved. Selang penyimpanan data perlanjutan - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - Algoritma mode campuran %1-TCP - - - + Maximum number of half-open connections [0: Unlimited] Jumlah maksimum koneksi terbuka-setengah [0: Tidak terbatas] - + IP Address to report to trackers (requires restart) Alamat IP untuk melapor ke pelacak (wajib memulai ulang) - + Enable embedded tracker Aktifkan pelacak tertanam - + Embedded tracker port Port pelacak tertanam - + Check for software updates Periksa pemutakhiran program - + Use system icon theme Gunakan tema ikon sistem @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 dimulai - + Torrent: %1, running external program, command: %2 Torrent: %1, menjalankan program eksternal, perintah: %2 - - Torrent name: %1 - Nama torrent: %1 - - - - Torrent size: %1 - Ukuran torrent: %1 - - - - Save path: %1 - Jalur penyimpanan: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Torrent telah diunduh dalam %1. - - - - Thank you for using qBittorrent. - Terima kasih telah menggunakan qBittorrent. - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' telah selesai mengunduh + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrent: %1, program eksternal berjalan terlalu lama (durasi > %2), gagal mengeksekusi. - + Torrent: %1, sending mail notification Torrent: %1, mengirimkan notifikasi email - + Information Informasi - - To control qBittorrent, access the Web UI at %1 - Untuk mengontrol qBittorrent, akses Web UI di %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + Untuk mengendalikan qBittorent, akses Web UI di http://localhost:%1 - + The Web UI administrator user name is: %1 Nama pengguna administrator Web UI adalah: %1 - + The Web UI administrator password is still the default one: %1 Sandi administrator Web UI masih bawaan: %1 - + This is a security risk, please consider changing your password from program preferences. Ini adalah resiko keamanan, mohon pertimbangkan untuk mengubah sandi Anda dari preferensi program. - + Saving torrent progress... - Menyimpan progres torrent... - - - - Portable mode and explicit profile directory options are mutually exclusive - Mode portabel dan opsi profil ekslisif direktori saling ekslusif - - - - Portable mode implies relative fastresume - Mode portabel berarti sambung-cepat relatif - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - Login WebAPI gagal. Penyebab: IP telah diblokir, IP: %1, namapengguna: %2 - - - - Your IP address has been banned after too many failed authentication attempts. - Alamat IP Anda telah dicekal setelah terlalu banyak melakukan percobaan otentikasi yang gagal. - - - - WebAPI login success. IP: %1 - Login WebAPI sukses. IP: %1 - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - Login WebAPI gagal. Penyebab: kredensial tidak sah, mencoba: %1, IP: %2, namapengguna: %3 + Menyimpan kemajuan torrent... AutomatedRssDownloader - + Save to: Simpan ke: @@ -861,837 +658,696 @@ Pengunduh RSS - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - Pengunduhan otomatis RSS torrent dinonaktifkan! Anda bisa mengaktifkannya dalam pengaturan aplikasi. + + Enable Automated RSS Downloader + Aktifkan Pengunduh RSS Otomatis - + Download Rules Aturan Unduhan - + Rule Definition Definisi Aturan - + Use Regular Expressions Gunakan Ekpresi Reguler - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - Filter Episode Pintar akan mengecek nomor episode untuk mencegah unduhan duplikat. -Didukung format: S01E01, 1x1, 2017.01.01 dan 01.01.2017 (Format tanggal juga didukung- sebagai pemisah) - - - - Use Smart Episode Filter - Gunakan Smart Episode Filter - - - + Must Contain: Harus Memuat: - + Must Not Contain: Tidak Boleh Memuat: - + Episode Filter: - Filter Episode: + Penyaring Episode: - + Assign Category: Tetapkan kategori: - + Save to a Different Directory Simpan ke Direktori Berbeda - + Ignore Subsequent Matches for (0 to Disable) ... X days Abaikan Kecocokan Berturut-turut untuk (0 untuk Nonaktif) - + Disabled - Nonaktif + Nonaktif - + days hari - + Add Paused: Tambah Jeda: - + Use global settings Gunakan pengaturan global - + Always Selalu - + Never Jangan Pernah - + Apply Rule to Feeds: Terapkan Aturan ke Umpan: - + Matching RSS Articles Artikel RSS yang Cocok - + &Import... &Impor... - + &Export... &Ekspor... - + Matches articles based on episode filter. - Artikel yang cocok berdasarkan filter episode. + Artikel yang cocok berdasarkan penyaring episode. - + Example: Contoh: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match akan cocok 2, 5, 8 sampai 15, 30 dan episode seterusnya dari musim pertama - + Episode filter rules: - Aturan filter episode: + Aturan penyaring episode: - + Season number is a mandatory non-zero value Nomor musim wajib bernilai bukan nol - + Episode number is a mandatory non-zero value + Nomor episode wajib bernilai bukan nol + + + Filter must end with semicolon - Filter harus diakhiri dengan titik-koma + Penyaring harus diakhiri dengan titik koma - + Three range types for episodes are supported: Tiga jenis rentang untuk episode yang didukung: - + Single number: <b>1x25;</b> matches episode 25 of season one Nomor tunggal: <b>1x25;</ b> cocok dengan episode 25 dari musim pertama - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Rentang normal: <b>1x25-40;</b> cocok dengan episode 25 sampai 40 dari musim pertama - - Episode number is a mandatory positive value - Nomor episode ialah wajib nilai positif - - - - Rules - Aturan + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Rentang tidak terbatas: <b>1x25-;</b> cocok dengan episode 25 dan seterusnya dari musim pertama - - Rules (legacy) - Aturan (lama) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Barisan tak terbatas:<b>1x25-;</b>sesuai episode 25 dan ke atas dari sesi satu, dan semua dari episode nanti + - + Last Match: %1 days ago Cocok Terakhir: %1 hari yang lalu - + Last Match: Unknown Cocok Terakhir: Tidak Diketahui - + New rule name Nama aturan baru - + Please type the name of the new download rule. Mohon ketik nama dari aturan unduh baru. - - + + Rule name conflict Nama aturan konflik - - + + A rule with this name already exists, please choose another name. Aturan dengan nama ini telah ada, mohon pilih nama lain. - + Are you sure you want to remove the download rule named '%1'? Apakah Anda yakin ingin membuang aturan unduhan bernama '%1'? - + Are you sure you want to remove the selected download rules? Apakah Anda yakin ingin menghapus aturan unduh yang dipilih? - + Rule deletion confirmation Konfirmasi penghapusan aturan - + Destination directory Direktori tujuan - + Invalid action Tindakan tidak valid - + The list is empty, there is nothing to export. - Daftar kosong, tidak ada yang perlu diekspor. + Daftar ini kosong, tidak ada yang bisa diekspor. - - Export RSS rules - Ekspor aturan RSS + + Where would you like to save the list? + Di mana Anda ingin menyimpan daftar? - - + + Rules list (*.rssrules) + Daftar aturan (*.rssrules) + + + I/O Error Galat I/O - - Failed to create the destination file. Reason: %1 - Gagal membuat berkas tujuan. Alasan: %1 + + Failed to create the destination file + Gagal membuat berkas tujuan - - Import RSS rules - Impor aturan RSS + + Please point to the RSS download rules file + Mohon arahkan ke berkas aturan unduh RSS - - Failed to open the file. Reason: %1 - Gagal membuka berkas. Alasan: %1 + + Rules list + Daftar aturan - + Import Error - Impor Gagal + Galat Impor - - Failed to import the selected rules file. Reason: %1 - Gagal mengimpor berkas aturan yang dipilih. Alasan: %1 + + Failed to import the selected rules file + Gagal untuk mengimpor berkas aturan yang dipilih - + Add new rule... Tambah aturan baru... - + Delete rule Hapus aturan - + Rename rule... Ubah nama aturan... - + Delete selected rules Hapus aturan yang dipilih - - Clear downloaded episodes... - Kosongkan daftar episode yang diunduh... - - - + Rule renaming Menamai ulang aturan - + Please type the new rule name Mohon ketik nama aturan baru - - Clear downloaded episodes - Kosongkan daftar episode yang diunduh - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - Apakah Anda yakin ingin mengosongkan daftar episode yang diunduh untuk aturan yang dipilih? - - - - Regex mode: use Perl-compatible regular expressions - Mode regex: gunakan ekspresi reguler yang kompatibel dengan Perl - - - - - Position %1: %2 - Posisi %1: %2 + + Regex mode: use Perl-like regular expressions + Mode regex: gunakan ekspresi reguler mirip Perl - + Wildcard mode: you can use - Mode wildcard: Anda bisa menggunakan + - + ? to match any single character - ? untuk mencocokkan semua jenis karakter tunggal + - + * to match zero or more of any characters - * untuk sesuai nol atau lebih dari karakter apapun + - + Whitespaces count as AND operators (all words, any order) - Ruang putih terhitung sebagai operator DAN (semua kata, urutan apapun) + - + | is used as OR operator - | digunakan sebagai operator ATAU + - + If word order is important use * instead of whitespace. - Jika urutan kata sangat penting digunakan * daripada ruang putih. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Ekspresi dengan kekosongan %1 klausa (cth. %2) + - + will match all articles. - akan sesuai semua pasal. + - + will exclude all articles. - akan tiadakan semua pasal. - - - - BanListOptionsDialog - - - List of banned IP addresses - Daftar alamat IP diblokir - - - - Ban IP - Blokir IP - - - - Delete - Hapus - - - - - Warning - Peringatan + - - The entered IP address is invalid. - Alamat IP dimasukan tidak sah. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Mode wildcard: Anda dapat menggunakan<ul><li>? untuk mencocokkan karakter tunggal apapun</li><li>* untuk mencocokkan nol atau lebih karakter apapun</li><li>Spasi dihitung sebagai operator AND</li></ul> - - The entered IP is already banned. - Alamat IP yang dimasukan sudah diblokir. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Mode wildcard: Anda dapat menggunakan<ul><li>? untuk mencocokkan karakter tunggal apapun</li><li>* untuk mencocokkan nol atau lebih karakter apapun</li><li>| digunakan sebagai operator OR</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support Wajib memulai ulang untuk menjungkit dukungan PeX - - Could not get GUID of configured network interface. Binding to IP %1 - Tidak dapat mendapat GUID dari konfigurasi tampilan jaringan. Mengikat ke IP %1 - - - + Embedded Tracker [ON] Pelacak Tertanam [NYALA] - + Failed to start the embedded tracker! Gagal memulai pelacak tertanam! - + Embedded Tracker [OFF] Pelacak Tertanam [MATI] - + + '%1' reached the maximum ratio you set. Removing... + '%1' telah mencapai rasio maksimum yang Anda tetapkan. Membuang... + + + + '%1' reached the maximum ratio you set. Pausing... + '%1' telah mencapai rasio maksimum yang Anda tetapkan. Menangguhkan... + + + System network status changed to %1 e.g: System network status changed to ONLINE Status jaringan sistem berubah menjadi %1 - + ONLINE DARING - + OFFLINE LURING - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding Konfigurasi jaringan dari %1 telah berubah, menyegarkan jalinan sesi - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. Konfigurasi alamat antarmuka jaringan %1 tidak valid. - - + Encryption support [%1] Dukungan enkripsi [%1] - - + FORCED PAKSA - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 bukan alamat IP yang sah dan ditolak ketika menerapkan dari daftar alamat terlarang. - - - - + Anonymous mode [%1] Mode anonim [%1] - + Unable to decode '%1' torrent file. Tidak bisa mengawakode '%1' berkas torrent. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Mengunduh rekursif berkas '%1' yang tertanam di dalam torrent '%2' - + Queue positions were corrected in %1 resume files - Mengantri posisi akan diperbaiki dalam %1 sambungan berkas. + - + Couldn't save '%1.torrent' Tidak bisa menyimpan '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' telah dibuang dari daftar transfer. + + because %1 is disabled. + this peer was blocked because uTP is disabled. + karena %1 dinonaktifkan. - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' telah dibuang dari daftar transfer dan diska. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '%1' telah dibuang dari daftar transfer tetapi berkas tidak bisa dihapus. Galat: %2 - - - - because %1 is disabled. - this peer was blocked because uTP is disabled. - karena %1 dinonaktifkan. - - - + because %1 is disabled. this peer was blocked because TCP is disabled. karena %1 dinonaktifkan. - + URL seed lookup failed for URL: '%1', message: %2 Pencarian bibit URL gagal untuk URL: '%1', pesan: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent gagal mendengarkan pada antarmuka %1 port %2/53. Alasan: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' telah dibuang dari daftar transfer dan diska. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' telah dibuang dari daftar transfer. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Mengunduh '%1', mohon tunggu... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent sedang mencoba mendengarkan semua port antarmuka: %1 - + The network interface defined is invalid: %1 Antarmuka jaringan yang dijabarkan tidak valid: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent sedang mencoba mendengarkan port antarmuka %1: %2 - - Peer ID: - ID Rekan: - - - - HTTP User-Agent is '%1' - HTTP User-Agent adalah '%1' - - - - + DHT support [%1] Dukungan DHT [%1] - - - - - - - - - + + + + ON NYALA - - - - - - - - - + + + + OFF MATI - - + Local Peer Discovery support [%1] - Dukungan Pencarian Rekan Lokal [%1] - - - - PeX support [%1] - Dukungan PeX [%1] - - - - '%1' reached the maximum ratio you set. Removed. - '%1' mencapai ratio maksimal yang anda tentukan. Dihilangkan. - - - - '%1' reached the maximum ratio you set. Paused. - '%1' mencapai ratio maksimal yang anda tentukan. Ditunda. - - - - '%1' reached the maximum seeding time you set. Removed. - '%1' mencapai benih maksimal yang anda tentukan. Dihilangkan. + Dukungan Pencarian Rekanan Lokal [%1] - - '%1' reached the maximum seeding time you set. Paused. - '%1' mencapai benih maksimal yang anda tentukan. Ditunda. - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent tidak menemukan alamat lokal %1 untuk didengarkan - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent gagal mendengarkan semua port antarmuka: %1. Alasan: %2. - + Tracker '%1' was added to torrent '%2' Pelacak '%1' telah ditambahkan ke torrent '%2' - + Tracker '%1' was deleted from torrent '%2' Pelacak '%1' telah dihapus dari torrent '%2' - + URL seed '%1' was added to torrent '%2' Bibit URL '%1' telah ditambahkan ke torrent '%2' - + URL seed '%1' was removed from torrent '%2' Bibit URL '%1' telah dihapus dari torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Tidak bisa melanjutkan torrent '%1'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - Berhasil mengurai filter IP yang diberikan: %1 aturan diterapkan. + Berhasil mengurai penyaring IP yang diberikan: %1 aturan diterapkan. - + Error: Failed to parse the provided IP filter. - Galat: Gagal mengurai filter IP yang diberikan. - - - - '%1' restored. - 'torrent name' restored. - '%1' dikembalikan. + Galat: Gagal mengurai penyaring IP yang diberikan. - + Couldn't add torrent. Reason: %1 Tidak bisa menambahkan torrent. Alasan: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' dilanjutkan. (lanjut cepat) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' ditambahkan ke daftar unduh. - + An I/O error occurred, '%1' paused. %2 Sebuah galat I/O telah terjadi, '%1' ditangguhkan. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Pemetaan port gagal, pesan: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Pemetaan port sukses, pesan: %1 - + due to IP filter. this peer was blocked due to ip filter. - disebabkan oleh filter IP. + disebabkan oleh penyaring IP. - + due to port filter. this peer was blocked due to port filter. - disebabkan oleh filter port. + disebabkan oleh penyaring port. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. disebabkan oleh pembatasan mode campuran i2p. - + because it has a low port. this peer was blocked because it has a low port. karena memiliki port yang rendah. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent berhasil mendengarkan port antarmuka %1: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 IP eksternal: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - gagal membuat berkas torrent baru - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - Unduh pertama dan potongan terakhir dahulu: %1, torrent: '%2' - - - - On - Nyala - - - - Off - Mati - - - - Successfully moved torrent: %1. New path: %2 - Berhasil memindahkan torrent: %1. Tempat baru: %2 - - - + Could not move torrent: '%1'. Reason: %2 - Tidak dapat memindahkan torrent: '%1'. Penyebab: %2 + Tidak bisa memindahkan torrent: '%1'. Alasan: %2 - + File sizes mismatch for torrent '%1', pausing it. - Ukuran berkas torrent tidak sesuai '%1', Menunda. + Ukuran berkas tidak sama untuk torrent '%1', torrent ditangguhkan. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - Menyambung cepat data torrent dibatalkan '%1'. Penyebab: %2. Mencek kembali... + Data lanjut cepat ditolak untuk torrent '%1'. Alasan: %2. Memeriksa lagi... CategoryFilterModel - + Categories - Kategori + Kategori-kategori - + All - Semua + Semua - + Uncategorized - Tak Berkategori + @@ -1699,42 +1355,145 @@ Add category... - Tambah kategori... + Tambahkan kategori .... Add subcategory... - Tambah subkategori... + - Edit category... - Sunting kategori... + Remove category + Hapus kategori + + + + Remove unused categories + Buang kategori yang tidak digunakan + + + + Resume torrents + Lanjutkan torrent + + + + Pause torrents + Tangguhkan torrent + + + + Delete torrents + Hapus torrent + + + + New Category + Kategori Baru + + + + Category: + + + + + Invalid category name + Nama kategori tidak valid + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Semua + + + Uncategorized (0) + Tanpa berkategori (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Tanpa berkategori (%1) + + + Add category... + Tambahkan kategori .... - Remove category - Buang kategori + Hapus kategori - Remove unused categories - Buang kategori yang tidak digunakan + Buang kategori yang tidak digunakan - Resume torrents - Lanjutkan torrent + Lanjutkan torrent - Pause torrents - Tangguhkan torrent + Tangguhkan torrent - Delete torrents - Hapus torrent + Hapus torrent + + + New Category + Kategori Baru + + + Category: + Kategori + + + Invalid category name + Nama kategori tidak valid + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Nama kategori tidak boleh mengandung '\'. +Nama kategori tidak boleh diawali/diakhiri dengan '/'. +Nama kategori tidak boleh mengandung rangkaian '//'. + + + All (%1) + this is for the category filter + Semua (%1) @@ -1774,617 +1533,574 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Konfirmasi hapus - - - - Remember choice - Ingat pilihan - - - - Also delete the files on the hard disk - Juga hapus berkas di dalam harddisk - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - Apakah anda yakin ingin menghapus '%1' dari daftar transfer? + Apakah Anda yakin ingin menghapus '%1' dari daftar transfer? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - Apakah anda yakin ingin menghapus torrent %1 dari daftar transfer? - - - - DownloadFromURLDialog - - - Download from URLs - Unduh dari URL - - - - Add torrent links - Tambah link torrent - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - Satu link per barisan (Link HTTP, Link Magnet dan infor-hash didukung) - - - - Download - Unduh - - - - No URL entered - Tiada URL dimasukan - - - - Please type at least one URL. - Mohon masukan setidaknya satu URL + Apakah Anda yakin ingin menghapus %1 torrent ini dari daftar transfer? DownloadedPiecesBar - + White: Missing pieces Putih: Bagian hilang - + Green: Partial pieces Hijau: Bagian parsial - + Blue: Completed pieces Biru: Bagian komplet - ExecutionLogWidget + ExecutionLog - + General Umum - + Blocked IPs - IP diblokir + IP yang diblokir - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked <font color='red'>%1</font> telah diblokir %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - <font color='red'>%1</font> telah diblokir + <font color='red'>%1</font> telah dicekal FeedListWidget - + RSS feeds Umpan RSS - - - Unread (%1) - Belum Dibaca (%1) + + Unread + Belum dibaca FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - Terjadi kesalahan saat mencoba membuka berkas log. Pencatatan log ke berkas dinonaktifkan. - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - &Temukan... - - - - Choose a file - Caption for file open/save dialog - Pilih berkas - - - - Choose a folder - Caption for directory open dialog - Pilih folder - - - - Any file - Berkas apapun + + An error occured while trying to open the log file. Logging to file is disabled. + Sebuat galat terjadi ketika mencoba untuk membuka berkas catatan. Pencatatan dinonaktifkan. FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - Galat I/O: Tidak bisa membuka berkas filter IP dalam mode baca. - - - - - - IP filter line %1 is malformed. - Filter barisan IP %1 salah bentuk. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - Filter barisan IP %1 salah bentuk. Awal IP dari jajaran salah bentuk. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - Filter barisan IP %1 salah bentuk. Akhir IP dari jajaran salah bentuk. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - Filter barisan IP %1 salah bentuk. Satu IP ialah IPv4 dan yang lain IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - Filter IP pengecualian pada baris %1. Pengecualian: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - %1 IP filter ekstra uraian terjadi galat. + + + + I/O Error: Could not open ip filter file in read mode. + Galat I/O: Tidak bisa membuka berkas penyaring ip dalam mode baca-saja. - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. - Galat Mengurai: Berkas filter bukan berkas P2B PeerGuardian yang valid. + Galat Mengurai: Berkas penyaring bukan berkas P2B PeerGuardian yang valid. GeoIPDatabase - - + + Unsupported database file size. Ukuran berkas basis data tidak didukung. - + Metadata error: '%1' entry not found. Galat metadata: entri '%1' tidak ditemukan. - + Metadata error: '%1' entry has invalid type. Galat metadata: tipe entri '%1' tidak valid. - + Unsupported database version: %1.%2 Versi basis data tidak didukung: %1.%2 - + Unsupported IP version: %1 Versi IP tidak didukung: %1 - + Unsupported record size: %1 Ukuran perekaman tidak didukung: %1 - + Invalid database type: %1 Tipe basis data tidak valid: %1 - + Database corrupted: no data section found. Basis data rusak: bagian data tidak ditemukan. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - Permintaan ukuran Http melebihi batas, menutup socket. Limit: %ld, IP: %s + + File + Berkas - - Bad Http request, closing socket. IP: %s - Permintaan Http buruk, menutup socket. IP: %s + + Edit + Sunting - - - HttpServer - + + Help + Bantuan + + + Exit qBittorrent Keluar qBittorrent - + Only one link per line Hanya satu tautan per baris - + + Download + Unduh + + + Global upload rate limit must be greater than 0 or disabled. Batas laju unggah global harus lebih besar dari 0 atau nonaktif. - + Global download rate limit must be greater than 0 or disabled. Batas laju unduh global harus lebih besar dari 0 atau nonaktif. - + Alternative upload rate limit must be greater than 0 or disabled. Batas laju unggah alternatif harus lebih besar dari 0 atau nonaktif. - + Alternative download rate limit must be greater than 0 or disabled. Batas laju unduh alternatif harus lebih besar dari 0 atau nonaktif. - + Maximum active downloads must be greater than -1. Unduhan aktif maksimum harus lebih besar dari -1. - + Maximum active uploads must be greater than -1. Unggahan aktif maksimum harus lebih besar dari -1. - + Maximum active torrents must be greater than -1. Torrent aktif maksimum harus lebih besar dari -1. - + Maximum number of connections limit must be greater than 0 or disabled. Jumlah maksimum batas koneksi harus lebih besar dari 0 atau nonaktif. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Jumlah maksimum batas koneksi per torrent harus lebih besar dari 0 atau nonaktif. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Jumlah maksimum batas slot unggah per torrent harus lebih besar dari 0 atau nonaktif. - + Unable to save program preferences, qBittorrent is probably unreachable. Tidak bisa menyimpan preferensi program, qBittorrent mungkin tidak terjangkau. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent di Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - Nama kategori tidak sah: -Mohon jangan gunakan karakter spesial di nama kategori. - - - - Unknown - Tidak diketahui - - - - Hard Disk - Hard Disk - - - - Share ratio limit must be between 0 and 9998. - Batasan ratio bagi harus antara 0 dan 9998. - - - - Seeding time limit must be between 0 and 525600 minutes. - Batasan waktu seeding harus antara 0 dan 525600 menit. + + Language + Bahasa - + The port used for incoming connections must be between 1 and 65535. Port yang digunakan untuk koneksi masuk harus antara 1 dan 65535. - + The port used for the Web UI must be between 1 and 65535. Port yang digunakan untuk Web UI harus antara 1 dan 65535. - + Unable to log in, qBittorrent is probably unreachable. Tidak bisa masuk, qBittorrent mungkin tidak terjangkau. - + Invalid Username or Password. Nama Pengguna atau Sandi tidak valid. - - Username - Nama pengguna - - - + Password Sandi - + Login Masuk - + + Upload Failed! + Gagal Mengunggah! + + + Original authors Pengembang asli - + + Upload limit: + Batas unggah: + + + + Download limit: + Batas unduh: + + + Apply Terapkan - + Add Tambah - + + Category: + Kategori: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Unggah Torrent - + + All + Semua + + + + Downloading + Mengunduh + + + + Seeding + Membibit + + + + Completed + Komplet + + + + Resumed + Dilanjutkan + + + + Paused + Ditangguhkan + + + + Active + Aktif + + + + Inactive + Tidak aktif + + + Save files to location: Simpan berkas ke lokasi: - + Cookie: Kuki: - + Type folder here Tulis folder di sini - + + Run an external program on torrent completion + Jalankan program eksternal saat torrent selesai diunduh + + + + Enable bandwidth management (uTP) + Aktifkan pengelolaan bandwidth (uTP) + + + + Apply rate limit to uTP connections + Terapkan batas laju untuk koneksi uTP + + + + Alternative Global Rate Limits + Batas Laju Global Alternatif + + + More information Informasi lainnya - + Information about certificates Informasi tentang sertifikat - + Save Files to SImpan Berkas ke - - Set location - Tetapkan lokasi - - - - Limit upload rate - Batasi laju unggah + + Watch Folder + Folder Dimonitor - - Limit download rate - Batasi laju unduh + + Default Folder + Folder Bawaan - - Rename torrent - Ubah nama torrent + + from + from time1 to time2 + dari - - Unable to create category - + + to + from time1 to time2 + ke - + Other... Save Files to: Watch Folder / Default Folder / Other... Lainnya... - + + Every day + Schedule the use of alternative rate limits on ... + Setiap hari + + + + Week days + Schedule the use of alternative rate limits on ... + Hari libur + + + + Week ends + Schedule the use of alternative rate limits on ... + Akhir pekan + + + Monday Schedule the use of alternative rate limits on ... Senin - + Tuesday Schedule the use of alternative rate limits on ... Selasa - + Wednesday Schedule the use of alternative rate limits on ... Rabu - + Thursday Schedule the use of alternative rate limits on ... Kamis - + Friday Schedule the use of alternative rate limits on ... Jumat - + Saturday Schedule the use of alternative rate limits on ... Sabtu - + Sunday Schedule the use of alternative rate limits on ... Minggu - + + Downloaded + Is the file downloaded or not? + Terunduh + + + Logout Keluar - + + Download from URLs + Unduh dari URL + + + Download Torrents from their URLs or Magnet links Unduh Torrent dari URL atau tautan Magnet-nya - + Upload local torrent Unggah torrent lokal - + Are you sure you want to delete the selected torrents from the transfer list? Apakah Anda yakin ingin menghapus torrent yang dipilih dari daftar transfer? - + Save Simpan - + qBittorrent client is not reachable Klien qBittorrent tidak terjangkau - - qBittorrent has been shutdown. - qBittorrent telah dimatikan. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Daftar putih IP subnet + + HTTP Server + Server HTTP - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Contoh: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Parameter berikut didukung: - - Add subnet - Tambah subnet + + Torrent path + Jalur torrent - - Delete - Hapus + + Torrent name + Nama torrent - - Error - Galat + + qBittorrent has been shutdown. + qBittorrent telah dimatikan. + + + LineEdit - - The entered subnet is invalid. - Subnet yang dimasukkan tidak valid. + + Clear the text + Kosongkan teks LogListWidget - + Copy Salin - + Clear Kosongkan @@ -2417,550 +2133,492 @@ Saat Unduhan &Selesai - + &View &Tampilan - + &Options... &Opsi... - + &Resume &Lanjutkan - + Torrent &Creator Pem&buat Torrent - + Set Upload Limit... Tetapkan Batas Unggah... - + Set Download Limit... Tetapkan Batas Unduh... - + Set Global Download Limit... Tetapkan Batas Unduh Global... - + Set Global Upload Limit... Tetapkan Batas Unggah Global... - + Minimum Priority Prioritas Minimum - + Top Priority Prioritas Utama - + Decrease Priority Turunkan Prioritas - + Increase Priority Naikkan Prioritas - - + + Alternative Speed Limits Batas Kecepatan Alternatif - + &Top Toolbar Bilah Ala&t Atas - + Display Top Toolbar Tampilkan Bilah Alat Atas - - Status &Bar - &Bilah Status - - - + S&peed in Title Bar Ke&cepatan di Bilah Judul - + Show Transfer Speed in Title Bar Tampilkan Kecepatan Transfer di Bilah Judul - + &RSS Reader Pembaca &RSS - + Search &Engine M&esin Pencari - + L&ock qBittorrent K&unci qBittorrent - + Do&nate! Do&nasi! - - Close Window - Tutup Jendela - - - + R&esume All Lanjutkan S&emua - + Manage Cookies... Kelola Kuk... - + Manage stored network cookies Kelola kuki jaringan yang tersimpan - + Normal Messages Pesan Normal - + Information Messages Pesan Informasi - + Warning Messages Pesan Peringatan - + Critical Messages Pesan Kritis - + &Log &Log - + &Exit qBittorrent &Keluar qBittorrent - + &Suspend System &Suspensi Sistem - + &Hibernate System &Hibernasi Sistem - + S&hutdown System &Matikan Sistem - + &Disabled &Nonaktif - + &Statistics &Statistik - + Check for Updates Periksa Pemutakhiran - + Check for Program Updates Periksa Pemutakhiran Program - + &About Tent&ang - + &Pause Tang&guhkan - + &Delete &Hapus - + P&ause All Jed&a Semua - + &Add Torrent File... T&ambah Berkas Torrent... - + Open Buka - + E&xit &Keluar - + Open URL Buka URL - + &Documentation &Dokumentasi - + Lock Kunci - - - + + + Show Tampilkan - + Check for program updates Periksa pemutakhiran program - + Add Torrent &Link... Tambah &Tautan Torrent... - + If you like qBittorrent, please donate! Jika Anda suka qBittorrent, mohon menyumbang! - - + Execution Log Log Eksekusi - + Clear the password Kosongkan sandi - + Filter torrent list... - Filter daftar torrent... + Saring daftar torrent... - + &Set Password Tetapkan &Kata Sandi - - Preferences - Preferensi - - - + &Clear Password &Kosongkan Kata Sandi - + Transfers Transfer - - - qBittorrent is minimized to tray - qBittorrent dikecilkan di tray - - - - - - This behavior can be changed in the settings. You won't be reminded again. - Tindakan ini akan mengubah pengaturan. Anda takkan diingatkan lagi. - - - + Torrent file association Asosiasi berkas torrent - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent bukan aplikasi baku untuk membuka berkas torrent atau tautan magnet. Apakah Anda ingin mengasosiasikan qBittorrent dengan berkas torrent atau tautan magnet? - + Icons Only Hanya Ikon - + Text Only Hanya Teks - + Text Alongside Icons Teks di Samping Ikon - + Text Under Icons Teks di Bawah Ikon - + Follow System Style Ikuti Gaya Sistem - - - + + + UI lock password Sandi kunci UI - - - + + + Please type the UI lock password: Mohon ketik sandi kunci UI: - + The password should contain at least 3 characters Panjang sandi minimal harus 3 karakter - + Password update Sandi diperbarui - + The UI lock password has been successfully updated Sandi kunci UI telah berhasil diperbarui - + Are you sure you want to clear the password? Apakah Anda yakin ingin mengosongkan sandi? - - Use regular expressions - Gunakan ekspresi biasa - - - + Search Cari - + Transfers (%1) Transfer (%1) - + Error Galat - + Failed to add torrent: %1 Gagal menambahkan torrent: %1 - + Torrent added Torrent ditambahkan - + '%1' was added. e.g: xxx.avi was added. '%1' telah ditambahkan. - + Download completion Keselesaian unduhan - + I/O Error i.e: Input/Output Error Galat I/O - + Recursive download confirmation Konfirmasi unduh rekursif - + Yes Ya - + No Tidak - + Never Jangan Pernah - + Global Upload Speed Limit Batas Kecepatan Unggah Global - + Global Download Speed Limit Batas Kecepatan Unduh Global - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent sudah diperbaharui dan perlu dimulai-ulang untuk perubahan lagi efektif. - - - - qBittorrent is closed to tray - qBittorrent ditutup ke tray - - - - Some files are currently transferring. - Beberapa berkas saat ini ditransfer. - - - - Are you sure you want to quit qBittorrent? - Apakah anda yakin keluar dari qBittorrent? - - - + &No &Tidak - + &Yes &Ya - + &Always Yes &Selalu Ya - - %1/s - s is a shorthand for seconds - %1/d - - - - Couldn't determine your Python version. Search engine disabled. - Tidak dapat menentukan versi Python anda. Mesin pencari dinonaktifkan. - - - + Old Python Interpreter Interpreter Python Usang - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. Versi Python Anda (%1) sudah usang. Mohon mutakhirkan ke versi terakhir agar mesin pencari bisa bekerja. Kebutuhan minimum: 2.7.9/3.3.0. - + qBittorrent Update Available Tersedia Pemutakhiran qBittorrent - + + A new version is available. +Do you want to download %1? + Versi baru tersedia. +Apakah Anda ingin mengunduh %1? + + + Already Using the Latest qBittorrent Version Telah Menggunakan qBittorrent Versi Terbaru - + Undetermined Python version Versi Python tidak diketahui - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. '%1' telah selesai diunduh. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2969,158 +2627,154 @@ Alasan: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? Torrent '%1' memuat berkas torrent, apakah Anda ingin melanjutkan dengan mengunduh mereka? - + Couldn't download file at URL '%1', reason: %2. Tidak bisa mengunduh berkas pada URL '%1', alasan: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - Python ditemukan di %1: %2 + - - + + Couldn't determine your Python version (%1). Search engine disabled. + Tidak bisa menentukan versi Python Anda (%1), Mesin pencari dinonfungsikan. + + + + Missing Python Interpreter Kehilangan Interpreter Python - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Python dibutuhkan untuk dapat menggunakan mesin pencari tetapi sepertinya belum dipasang. Apakah Anda ingin memasangnya sekarang? - + Python is required to use the search engine but it does not seem to be installed. Python dibutuhkan untuk dapat menggunakan mesin pencari tetapi sepertinya belum dipasang. - - A new version is available. - Versi baru tersedia. - - - - Do you want to download %1? - Apakah anda ingin mengunduh %1? - - - - Open changelog... - Membuka logperubahan... - - - + No updates available. You are already using the latest version. Pemutakhiran tidak tersedia. Anda telah menggunakan versi terbaru. - + &Check for Updates &Periksa Pemutakhiran - + Checking for Updates... Memeriksa Pemutakhiran... - + Already checking for program updates in the background Sudah memeriksa pemutakhiran program di latar belakang - + Python found in '%1' Python ditemukan di '%1' - + Download error Galat unduh - + Python setup could not be downloaded, reason: %1. Please install it manually. Python tidak bisa diunduh, alasan: %1. Mohon pasang secara manual. - - + + Invalid password Sandi tidak valid - - - + + RSS (%1) RSS (%1) - + URL download error Galat unduh URL - + The password is invalid Sandi tidak valid - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Kecepatan DL: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Kecepatan UL: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [D: %1, U: %2] qBittorrent %3 - + Hide Sembunyikan - + Exiting qBittorrent Keluar qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Beberapa sedang dalam proses transfer. +Apakah Anda yakin ingin qBittorrent keluar? + + + Open Torrent Files Buka Berkas Torrent - + Torrent Files Berkas Torrent - + Options were saved successfully. Opsi telah disimpan dengan sukses. @@ -3128,52 +2782,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. DNS dinamis Anda telah berhasil diperbarui. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Galat DNS Dinamis: Layanan ini sementara tidak tersedia, akan dicoba ulang dalam 30 menit. - + Dynamic DNS error: hostname supplied does not exist under specified account. Galat DNS Dinamis: nama hos yang diberikan tidak ada di dalam akun yang disebutkan. - + Dynamic DNS error: Invalid username/password. Galat DNS Dinamis: nama pengguna/sandi tidak valid. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Galat DNS Dinamis: qBittorrent terdaftar hitam oleh layanan, mohon laporkan kutu di http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Galat DNS Dinamis: %1 dikembalikan oleh layanan, mohon laporkan kutu di http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Galat DNS Dinamis: Nama pengguna Anda telah diblokir karena penyalahgunaan. - + Dynamic DNS error: supplied domain name is invalid. Galat DNS Dinamis: nama domain yang diberikan tidak valid. - + Dynamic DNS error: supplied username is too short. Galat DNS Dinamis: nama pengguna yang diberikan terlalu pendek. - + Dynamic DNS error: supplied password is too short. Galat DNS Dinamis: kata sandi yang diberikan terlalu pendek. @@ -3181,1413 +2835,1303 @@ Net::DownloadHandler - + I/O Error Galat I/O - + The file size is %1. It exceeds the download limit of %2. Ukuran berkas adalah %1. Melebihi batas unduh %2. - + Unexpected redirect to magnet URI. Pengalihan tidak terduga ke URI magnet. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - Nama host remote tidak ditemukan (nama host tidak sah) + + + GeoIP database loaded. Type: %1. Build time: %2. + Basis data GeoIP dimuat. Tipe: %1. Durasi bangun: %2. - - The operation was canceled - Operasi telah dibatalkan + + + Couldn't load GeoIP database. Reason: %1 + Tidak bisa memuat basis data GeoIP. Alasan: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - Server remote menutup koneksi sebelum waktunya, sebelum seluruh balasan diterima dan diproses + + Venezuela, Bolivarian Republic of + Venezuela - - The connection to the remote server timed out - Koneksi ke server remote terputus + + Viet Nam + Vietnam - - SSL/TLS handshake failed - Salaman SSL/TLS gagal + + + N/A + T/A - - The remote server refused the connection - Server remote menolak koneksi + + Andorra + Andora - - The connection to the proxy server was refused - Koneksi ke server proxy telah ditolak + + United Arab Emirates + Uni Emirat Arab - - The proxy server closed the connection prematurely - Server proxy menutup koneksi sebelum waktunya + + Afghanistan + Afganistan - - The proxy host name was not found - Nama host proxy tidak ditemukan + + Antigua and Barbuda + Antigua dan Barbuda - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - Koneksi ke proxy terputus atau proxy tidak membalas tepat waktu saat meminta kiriman + + Anguilla + Anguilla - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - Proxy memerlukan otentifikasi untuk menerima permintaan tetapi tidak menerima kredensial apapun diminta - - - - The access to the remote content was denied (401) - Akses ke konten remotetelah ditolak (401) - - - - The operation requested on the remote content is not permitted - Operasi meminta konten remote tidak mengizinkan - - - - The remote content was not found at the server (404) - Konten remote tidak ditemukan di server (404) - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - Server remote memerlukan otentifikasi untuk menyediakan konten tetapi kredensial yang ada tidak dapat diterima - - - - The Network Access API cannot honor the request because the protocol is not known - Akses Jaringan API tidak bisa menerima permintaan karena protokol tidak diketahui - - - - The requested operation is invalid for this protocol - Operasi diminta tidak sah untuk protokol ini - - - - An unknown network-related error was detected - Galat tidak diketahui pada relasi-jaringan terdeteksi - - - - An unknown proxy-related error was detected - Galat tidak diketahui pada relasi-proxy terdeteksi - - - - An unknown error related to the remote content was detected - Galat tidak diketahui pada relasi ke konten remote terdeteksi - - - - A breakdown in protocol was detected - Gangguan pada protokol terdeteksi - - - - Unknown error - Galat tidak diketahui - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - Basis data GeoIP dimuat. Tipe: %1. Durasi bangun: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - Tidak bisa memuat basis data GeoIP. Alasan: %1 - - - - Venezuela, Bolivarian Republic of - Venezuela - - - - Viet Nam - Vietnam - - - - - N/A - T/A - - - - Andorra - Andora - - - - United Arab Emirates - Uni Emirat Arab - - - - Afghanistan - Afganistan - - - - Antigua and Barbuda - Antigua dan Barbuda + + Albania + Albania - Anguilla - Anguilla - - - - Albania - Albania - - - Armenia Armenia - + Angola Angola - + Antarctica Antartika - + Argentina Argentina - + American Samoa Samoa Amerika - + Austria Austria - + Australia Australia - + Aruba Aruba - + Azerbaijan Azerbaijan - + Bosnia and Herzegovina Bosnia dan Herzegovina - + Barbados Barbados - + Bangladesh Bangladesh - + Belgium Belgia - + Burkina Faso Burkina Faso - + Bulgaria Bulgaria - + Bahrain Bahrain - + Burundi Burundi - + Benin Benin - + Bermuda Bermuda - + Brunei Darussalam Brunei Darussalam - + Brazil Brazil - + Bahamas Bahama - + Bhutan Bhutan - + Bouvet Island Pulau Bouvet - + Botswana Botswana - + Belarus Belarusia - + Belize Belize - + Canada Kanada - + Cocos (Keeling) Islands Kepulauan Cocos (Keeling) - + Congo, The Democratic Republic of the Republik Demokratik Kongo - + Central African Republic Republik Afrika Tengah - + Congo Kongo - + Switzerland Swiss - + Cook Islands Kepulauan Cook - + Chile Chili - + Cameroon Kamerun - + China Cina - + Colombia Kolombia - + Costa Rica Kosta Rika - + Cuba Kuba - + Cape Verde Tanjung Verde - + Curacao Curacao - + Christmas Island Pulau Natal - + Cyprus Siprus - + Czech Republic Republik Ceko - + Germany Jerman - + Djibouti Djibouti - + Denmark Denmark - + Dominica Dominika - + Dominican Republic Republik Dominika - + Algeria Aljazair - + Ecuador Ekuador - + Estonia Estonia - + Egypt Mesir - + Western Sahara Sahara Barat - + Eritrea Eritrea - + Spain Spanyol - + Ethiopia Etiopia - + Finland Finlandia - + Fiji Fiji - + Falkland Islands (Malvinas) Kepulauan Falkland (Malvina) - + Micronesia, Federated States of Federasi Mikronesia - + Faroe Islands Kepulauan Faroe - + France Perancis - + Gabon Gabon - + United Kingdom Britania Raya - + Grenada Granada - + Georgia Georgia - + French Guiana Guyana Perancis - + Ghana Ghana - + Gibraltar Gibraltar - + Greenland Greenland - + Gambia Gambia - + Guinea Guinea - + Guadeloupe Guadeloupe - + Equatorial Guinea Guinea Khatulistiwa - + Greece Yunani - + South Georgia and the South Sandwich Islands Georgia Selatan dan Kepulauan Sandwich Selatan - + Guatemala Guatemala - + Guam Guam - + Guinea-Bissau Guinea-Bissau - + Guyana Guyana - + Hong Kong Hong Kong - + Heard Island and McDonald Islands Pulau Heard dan Kepulauan McDonald - + Honduras Honduras - + Croatia Kroasia - + Haiti Haiti - + Hungary Hongaria - + Indonesia Indonesia - + Ireland Irlandia - + Israel Israel - + India India - + British Indian Ocean Territory Wilayah Samudra Hindia Britania - + Iraq Irak - + Iran, Islamic Republic of Republik Islam Iran - + Iceland Islandia - + Italy Italia - + Jamaica Jamaika - + Jordan Yordania - + Japan Jepang - + Kenya Kenya - + Kyrgyzstan Kirgizstan - + Cambodia Kamboja - + Kiribati Kiribati - + Comoros Komoro - + Saint Kitts and Nevis Saint Kitts dan Nevis - + Korea, Democratic People's Republic of Korea Utara - + Korea, Republic of Korea Selatan - + Kuwait Kuwait - + Cayman Islands Kepulauan Cayman - + Kazakhstan Kazakhstan - + Lao People's Democratic Republic Republik Demokratik Rakyat Laos - + Lebanon Lebanon - + Saint Lucia Saint Lucia - + Liechtenstein Liechtenstein - + Sri Lanka Sri Lanka - + Liberia Liberia - + Lesotho Lesotho - + Lithuania Lituania - + Luxembourg Luksemburg - + Latvia Latvia - + Morocco Maroko - + Monaco Monako - + Moldova, Republic of Moldova - + Madagascar Madagaskar - + Marshall Islands Kepulauan Marshall - + Mali Mali - + Myanmar Myanmar - + Mongolia Mongolia - + Northern Mariana Islands Kepulauan Mariana Utara - + Martinique Martinik - + Mauritania Mauritania - + Montserrat Montserrat - + Malta Malta - + Mauritius Mauritius - + Maldives Maladewa - + Malawi Malawi - + Mexico Meksiko - + Malaysia Malaysia - + Mozambique Mozambik - + Namibia Namibia - + New Caledonia Kaledonia Baru - + Niger Niger - + Norfolk Island Pulau Norfolk - + Nigeria Nigeria - + Nicaragua Nikaragua - + Netherlands Belanda - + Norway Norwegia - + Nepal Nepal - + Nauru Nauru - + Niue Niue - + New Zealand Selandia Baru - + Oman Oman - + Panama Panama - + Peru Peru - + French Polynesia Polinesia Perancis - + Papua New Guinea Papua Nugini - + Philippines Filipina - + Pakistan Pakistan - + Poland Polandia - + Saint Pierre and Miquelon Saint Pierre dan Miquelon - + Puerto Rico Puerto Riko - + Portugal Portugal - + Palau Palau - + Paraguay Paraguay - + Qatar Qatar - + Reunion Reunion - + Romania Rumania - + Russian Federation Rusia - + Rwanda Rwanda - + Saudi Arabia Arab Saudi - + Solomon Islands Kepulauan Solomon - + Seychelles Seiselensa - + Sudan Sudan - + Sweden Swedia - + Singapore Singapura - + Slovenia Slovenia - + Svalbard and Jan Mayen Svalbard dan Jan Mayen - + Slovakia Slowakia - + Sierra Leone Sierra Leone - + San Marino San Marino - + Senegal Senegal - + Somalia Somalia - + Suriname Suriname - + Sao Tome and Principe Sao Tome dan Principe - + El Salvador El Salvador - + Syrian Arab Republic Suriah - + Swaziland Swaziland - + Turks and Caicos Islands Kepulauan Turks dan Caicos - + Chad Chad - + French Southern Territories Daratan Selatan dan Antarktika Perancis - + Togo Togo - + Thailand Thailand - + Tajikistan Tajikistan - + Tokelau Tokelau - + Turkmenistan Turkmenistan - + Tunisia Tunisia - + Tonga Tonga - - Could not decompress GeoIP database file. - Tidak dapat dekompres basis data GeoIP. - - - + Timor-Leste Timor-Leste - + Bolivia, Plurinational State of Bolivia - + Bonaire, Sint Eustatius and Saba Bonaire, Sint Eustatius dan Saba - + Cote d'Ivoire Pantai Gading - + Libya Libya - + Saint Martin (French part) Saint Martin (Perancis) - + Macedonia, The Former Yugoslav Republic of Republik Makedonia bekas Yugoslavia - + Macao Makau - + Pitcairn Pitcairn - + Palestine, State of Palestina - + Saint Helena, Ascension and Tristan da Cunha Saint Helena, Ascension, dan Tristan da Cunha - + South Sudan Sudan Selatan - + Sint Maarten (Dutch part) Sint Maarten (Belanda) - + Turkey Turki - + Trinidad and Tobago Trinidad dan Tobago - + Tuvalu Tuvalu - + Taiwan Taiwan - + Tanzania, United Republic of Tanzania - + Ukraine Ukraina - + Uganda Uganda - + United States Minor Outlying Islands Kepulauan Terluar Kecil Amerika Serikat - + United States Amerika Serikat - + Uruguay Uruguay - + Uzbekistan Uzbekistan - + Holy See (Vatican City State) Vatikan - + Saint Vincent and the Grenadines Saint Vincent dan Grenadine - + Virgin Islands, British Kepulauan Virgin, Inggris - + Virgin Islands, U.S. Kepulauan Virgin, Amerika Serikat - + Vanuatu Vanuatu - + Wallis and Futuna Wallis dan Futuna - + Samoa Samoa - + Yemen Yaman - + Mayotte Mayotte - + Serbia Serbia - + South Africa Afrika Selatan - + Zambia Zambia - + Montenegro Montenegro - + Zimbabwe Zimbabwe - + Aland Islands Kepulauan Aland - + Guernsey Guernsey - + Isle of Man Pulau Man - + Jersey Jersey - + Saint Barthelemy Saint Barthelemy - + + Could not uncompress GeoIP database file. + Tidak bisa mengurai berkas basis data GeoIP. + + + Couldn't save downloaded GeoIP database file. Tidak bisa menyimpan berkas basis data GeoIP yang diunduh. - + Successfully updated GeoIP database. Berhasil memperbarui basis data GeoIP. - + Couldn't download GeoIP database file. Reason: %1 Tidak bisa mengunduh berkas basis data GeoIP. Alasan: %1 @@ -4595,12 +4139,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] Dukungan UPnP / NAT-PMP [NYALA] - + UPnP / NAT-PMP support [OFF] Dukungan UPnP / NAT-PMP [MATI] @@ -4608,7 +4152,7 @@ Net::Smtp - + Email Notification Error: Galat Notifikasi Surel: @@ -4616,1352 +4160,1150 @@ OptionsDialog - + Options Opsi - + Behavior Perilaku - + Downloads Unduhan - + Connection Koneksi - + Speed Kecepatan - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI Web UI - + Advanced Tingkat Lanjut - + Language Bahasa - + User Interface Language: Bahasa Antarmuka Pengguna: - + (Requires restart) (Wajib memulai ulang) - + Transfer List Daftar Transfer - + Confirm when deleting torrents Konfirmasi ketika menghapus torrent - + Use alternating row colors In transfer list, one every two rows will have grey background. Gunakan warna baris belang - + Hide zero and infinity values Sembunyikan nilai nol dan tak terhingga - + Always Selalu - + Paused torrents only Hanya torrent yang ditangguhkan - + Action on double-click Tindakan klik ganda - + Downloading torrents: Mengunduh torrent: - - + + Start / Stop Torrent Jalankan / Hentikan Torrent - - + + Open destination folder Buka folder tujuan - - + + No action Tidak ada tindakan - + Completed torrents: Torrent komplet: - + Desktop Destop - + Start qBittorrent on Windows start up Mulai qBittorrent saat memulai Windows - + Show splash screen on start up Tampilkan layar sambutan saat memulai - + Start qBittorrent minimized Mulai qBittorrent diminimalkan - + Confirmation on exit when torrents are active Konfirmasi saat keluar ketika torrent sedang aktif - + Confirmation on auto-exit when downloads finish Konfirmasi saat keluar-otomatis ketika unduhan selesai - - KiB - KiB - - - - Email notification &upon download completion - Notifikasi surel dan di penyelesaian unduhan - - - - Run e&xternal program on torrent completion - Jalankan program diluar di penyelesaian torrent - - - - IP Fi&ltering - IP Filtering - - - - Schedule &the use of alternative rate limits - Jadwalkan penggunaan ba&tas laju alternatif - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Informasi lebih lanjut</a>) - - - - &Torrent Queueing - Antrean &Torrent - - - - Seed torrents until their seeding time reaches - Semaikan torrent hingga waktu semai sampai - - - - A&utomatically add these trackers to new downloads: - &Otomatis tambahkan tracker berikut ke unduhan baru: - - - - RSS Reader - Pembaca RSS - - - - Enable fetching RSS feeds - Aktifkan pengambilan umpan RSS - - - - Feeds refresh interval: - Interval penyegaran umpan: - - - - Maximum number of articles per feed: - Jumlah maksimum artikel per umpan: - - - - - min - minutes - min - - - - RSS Torrent Auto Downloader - RSS Torrent Unggah Otomatis - - - - Enable auto downloading of RSS torrents - Aktifkan pengunduhan otomatis RSS torrent - - - - Edit auto downloading rules... - Sunting aturan pengunduhan otomatis... - - - - Web User Interface (Remote control) - Antarmuka Pengguna Web (Pengendali jarak jauh) - - - - IP address: - Alamat IP: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - Alamat IP pada Web UI mengikat . -Tetapkan alamat IPv4 atau IPv6. Anda dapat tetapkan "0.0.0.0" untuk setiap alamat IPv4, -"::" untuk setiap alamat IPv6, atau "*" untuk keduanya IPv4 dan IPv6. - - - - Server domains: - Domain server: + + Show qBittorrent in notification area + Tampilkan qBittorrent di area notifikasi - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - Daftar putih untuk menyaring Nilai Kepala judul HTTP Host. -Untuk melindungi dari serangan balik DNS, -Anda dapat mengisi nama domain menggunakan Antarmuka Web server. - -Gunakan ';' untuk memisahkan banyak kata. Dapat menggunakan wildcard '*'. - - - - &Use HTTPS instead of HTTP - &Gunakan HTTPS daripada HTTP - - - - Bypass authentication for clients on localhost - Lewati otentikasi untuk klien pada lokalhost - - - - Bypass authentication for clients in whitelisted IP subnets - Lewati otentikasi untuk klien dalam daftar putih IP subnet - - - - IP subnet whitelist... - IP subnet daftar-putih... - - - - Upda&te my dynamic domain name - Perbahar&ui nama domain dinamik saya - - - + Minimize qBittorrent to notification area Minimalkan qBittorrent ke area notifikasi - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. Tutup qBittorrent ke area notifikasi - + Tray icon style: Gaya ikon baki: - + Normal Normal - + Monochrome (Dark theme) Monokrom (Tema gelap) - + Monochrome (Light theme) Monokrom (Tema cerah) - + File association Asosiasi berkas - + Use qBittorrent for .torrent files Gunakan qBittorrent untuk berkas .torrent - + Use qBittorrent for magnet links Gunakan qBittorrent untuk tautan magnet - + Power Management Pengelolaan Daya - + + Inhibit system sleep when torrents are active + Cegah sistem tidur ketika torrent sedang aktif + + + + Log file + Berkas catatan + + + Save path: Jalur simpan: - + Backup the log file after: Cadangkan berkas catatan setelah: - + + MB + MB + + + Delete backup logs older than: Hapus cadangan log yang lebih lama dari: - + days Delete backup logs older than 10 months hari - + months Delete backup logs older than 10 months bulan - + years Delete backup logs older than 10 years tahun - + When adding a torrent Ketika menambahkan torrent - + + Display torrent content and some options + Tampilkan isi torrent dan beberapa opsi + + + Bring torrent dialog to the front Tampilkan dialog torrent - + Do not start the download automatically The torrent will be added to download list in pause state Jangan mulai mengunduh secara otomatis - + Should the .torrent file be deleted after adding it Hapus berkas .torrent setelah ditambahkan? - + + Delete .torrent files afterwards + Kemudian hapus berkas .torrent + + + Also delete .torrent files whose addition was cancelled Juga hapus tambahan berkas .torrent yang dibatalkan - + Also when addition is cancelled - Juga ketika penambahan dibatalkan + - + Warning! Data loss possible! - Peringatan! Ada kemungkinan kehilangan data! + - + Saving Management Pengelola Penyimpanan - + Default Torrent Management Mode: Mode Baku Pengelolaan Torrent: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - Mode otomatis berarti berbagai properti torrent (misal tempat penyimpanan) akan ditentukan dengan kategori terkait + - + Manual Manual - + Automatic Otomatis - + When Torrent Category changed: Ketika Kategori Torrent diubah: - + Relocate torrent - Cari-ulang torrent + - + Switch torrent to Manual Mode - Pindahkan torrent ke Mode Manual + - + When Default Save Path changed: - Saat tempat penyimpanan biasa dirubah: + - - + + Relocate affected torrents - Cari-ulang torrent berpengaruh + - - + + Switch affected torrents to Manual Mode - Ganti torrent berpengaruh ke Mode Manual + - + When Category changed: - Saat kategori dirubah: + - + Use Subcategories - Gunakan subkategori + - + Default Save Path: - Tempat penyimpanan biasa: + - + Keep incomplete torrents in: - Biarkan torrent belum selesai di: + - + Copy .torrent files to: - Salin berkas .torrent ke: - - - - Show &qBittorrent in notification area - Tampilkan &qBittorrent di dalam area notifikasi - - - - &Log file - Berkas &Log - - - - Display &torrent content and some options - Tampilkan konten &torrent dan beberapa opsi - - - - Create subfolder for torrents with multiple files - Buat subfolder untuk torrent dengan banyak berkas - - - - De&lete .torrent files afterwards - Hap&us berkas .torrent kemudian + - + Copy .torrent files for finished downloads to: - Salin berkas .torrent untuk menyelesaikan unduhan ke: + - + Pre-allocate disk space for all files - Pre-alokasi ruang disk untuk semua berkas - - - - Inhibit system sleep when torrents are downloading - Cegah sistem tertidur saat mengunduh torrent - - - - Inhibit system sleep when torrents are seeding - Cegah sistem tertidur saat membenih torrent + - + Append .!qB extension to incomplete files - Tambahkan ekstensi .!qB ke berkas yang belum selesai - - - - Enable recursive download dialog - Izinkan dialog unduhan rekursif + - + Automatically add torrents from: - Otomatis menambahkan torrent dari: + - + Add entry - Tambah entri + - + Remove entry - Buang entri + + + + + Email notification upon download completion + + + + + Destination email: + - + SMTP server: - Server SMTP: + - + This server requires a secure connection (SSL) - Server ini membutuhkan sambungan aman (SSL) + - - + + + Authentication - Otentikasi + - - - - + + + + Username: - Nama pengguna: + Nama pengguna: - - - - + + + + Password: - Sandi: - - - - Enabled protocol: - Protokol diaktifkan: + Sandi: - - TCP and μTP - TCP dan μTP + + Run external program on torrent completion + - + Listening Port - Memperhatikan port + - + Port used for incoming connections: - Port yang digunakan untuk sambungan masuk: + - + Random - Acak + - + Use UPnP / NAT-PMP port forwarding from my router - Gunakan penerusan port UPnP / NAT-PMP dari router saya + - + Use different port on each startup - Gunakan port berbeda setiap memulai + - + Connections Limits - Batasan Sambungan + - + Maximum number of connections per torrent: - Jumlah maksimum sambungan per torrent: + - + Global maximum number of connections: - Jumlah maksimum sambungan global: + - + Maximum number of upload slots per torrent: - Jumlah maksimum slot unggah per torrent: + - + Global maximum number of upload slots: - Jumlah maksimum slot unggah global: + - + Proxy Server - Server Proksi + - + Type: - Tipe: + - + (None) - (Nihil) + - + SOCKS4 - SOCKS4 + - + SOCKS5 - SOCKS5 + - + HTTP - HTTP + - + Host: - Host: + - - + + Port: - Port: + - + Otherwise, the proxy server is only used for tracker connections - Kalau tidak, server proksi hanya digunakan untuk koneksi tracker + - + Use proxy for peer connections - Gunakan proksi untuk koneksi sejawat + - + Disable connections not supported by proxies - Koneksi dinonaktifkan tidak didukung proksi. - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Informasi lebih</a>) + - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - Masukkan RSS, Mesin pencari, perbaharuan software atau apapun selain dari transfer torrent dan operasi terhubung (seperti pertukaran sejawat) akan menggunakan koneksi langsung + - + Use proxy only for torrents - Gunakan proksi hanya untuk torrent + - - A&uthentication - &Otentikasi + + Info: The password is saved unencrypted + - - Info: The password is saved unencrypted - Info: Sandi disimpan tanpa enkripsi + + IP Filtering + - + Filter path (.dat, .p2p, .p2b): - Jalur filter (.dat, .p2p, .p2b): + - + Reload the filter - Muat ulang filter - - - - Manually banned IP addresses... - Secara manual mencekal alamat IP... + - + Apply to trackers - Terapkan ke pelacak + - + Global Rate Limits - Batas Laju Global + - - - - - - - KiB/s - KiB/s + + + Upload: + - - - Upload: - Unggah: + + + + + KiB/s + KiB/s - - + + Download: - Unduh: + - + Alternative Rate Limits - Batas Laju Alternatif + + + + + Schedule the use of alternative rate limits + - - + From: from (time1 to time2) - Dari: + - - + To: time1 to time2 - Ke: + - + When: - Kapan: + - + Every day - Setiap hari + Setiap hari - + Weekdays - Hari kerja + - + Weekends - Akhir pekan + - + Rate Limits Settings - Pengaturan Batas Laju + - + Apply rate limit to peers on LAN - Terapkan batas laju ke rekanan pada LAN + - + Apply rate limit to transport overhead - Tentukan nilai batas untuk transport diatas + - - + + + Enable µTP protocol + + + + Apply rate limit to µTP protocol - Terapkan batas laju ke protokol µTP + - + Privacy - Privasi + - + Enable DHT (decentralized network) to find more peers - Aktifkan DHT (jaringan terdesentralisasi) untuk menemukan lebih banyak rekanan + - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - Pertukaran rekanan dengan aplikasi Bittorrent yang kompatibel (µTorrent, Vuze, ...) + - + Enable Peer Exchange (PeX) to find more peers - Aktifkan Pertukaran Rekanan (PeX) untuk menemukan lebih banyak rekanan + - + Look for peers on your local network - Temukan rekanan di jaringan lokal Anda + - + Enable Local Peer Discovery to find more peers - Aktifkan Pencarian Rekan Lokal untuk menemukan lebih banyak rekanan + Aktifkan Pencarian Rekanan Lokal untuk menemukan lebih banyak rekanan - + Encryption mode: - Mode enkripsi: + - + Prefer encryption - Enkripsi opsional + - + Require encryption - Enkripsi wajib + - + Disable encryption - Enkripsi nonaktif + - + Enable when using a proxy or a VPN connection - Aktifkan saat menggunakan proksi atau koneksi VPN + - + Enable anonymous mode - Aktifkan mode anonim + - - Maximum active downloads: - Unduhan aktif maksimum: - - - - Maximum active uploads: - Unggahan aktif maksimum: - - - - Maximum active torrents: - Torrent aktif maksimum: + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + - - Do not count slow torrents in these limits - Jangan hitung torrent lambat dari limit ini + + Torrent Queueing + - - Upload rate threshold: - Nilai ambang unggah: + + Maximum active downloads: + - - Download rate threshold: - Nilai ambang unduh: + + Maximum active uploads: + - - sec - seconds - det + + Maximum active torrents: + - - Torrent inactivity timer: - Durasi torrent tanpa aktifitas: + + Do not count slow torrents in these limits + - + Share Ratio Limiting - Pembatasan Rasio Berbagi + - + Seed torrents until their ratio reaches - Bibit torrent sampai rasio tercapai + - + then - lalu + - + Pause them - Tangguhkan torrent + - + Remove them - Buang torrent + + + + + Automatically add these trackers to new downloads: + - - RSS Smart Episode Filters - RSS Filter Episode Pintar + + Enable Web User Interface (Remote control) + - + Use UPnP / NAT-PMP to forward the port from my router - Gunakan UPnP / NAT-PMP untuk meneruskan port dari router saya + - + + Use HTTPS instead of HTTP + + + + Certificate: - Sertifikat: + - + Import SSL Certificate - Impor Sertifikat SSL + - + Key: - Kunci: + - + Import SSL Key - Impor Kunci SSL + - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Informasi tentang sertifikat</a> - - - - Use alternative Web UI - Gunakan UI Web alternatif - - - - Files location: - Lokasi berkas: + - - Enable clickjacking protection - Izinkan perlindungan klikjacking + + Bypass authentication for localhost + - - Enable Cross-Site Request Forgery (CSRF) protection - Aktifkan proteksi Cross-Site Request Forgery (CSRF) + + Update my dynamic domain name + - + Service: - Layanan: + - + Register - Daftar + - + Domain name: - Nama domain: + - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - Dengan menambahkan opsi ini, anda <strong>tidak dapat ditarik kembali/hilang</strong> berkas .torrent kamu! + - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - Ketika opsi ini diaktifkan, qBittorent akan <strong>menghapus</strong>berkas .torrent setelah berhasil (opsi pertama) atau bukan (opsi kedua) ditambahkan ke dalam antrian unduh. Ini akan diterapkan <strong>tidak hanya</strong>kepada berkas pembuka via &ldquo;Tambahkan torrent&rdquo; menu aksi tetapi itu dapat dibuka via <strong>tipe berkas asosiasi</strong>pula. + - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - Jika anda mengaktifkan opsi kedua (&ldquo;Juga ketika tambahan dibatalkan&rdquo;) berkas .torrent <strong>akan dihapus</strong>meski jika anda pencet&ldquo;<strong>Batal</strong>&rdquo; didalam &ldquo;Tambahkan torrent&rdquo; dialog - - - - Choose Alternative UI files location - Pilih lokasi berkas UI Alternatif + - + Supported parameters (case sensitive): - Parameter yang didukung (sensitif besar kecil huruf): + - + %N: Torrent name - %N: Nama torrent + - + %L: Category - %L: Kategori - - - - %G: Tags (seperated by comma) - %G: Tag (dipisahkan dengan koma) + - + %F: Content path (same as root path for multifile torrent) - %F: Jalur konten (sama dengan jalur root untuk torrent multi-berkas) + - + %R: Root path (first torrent subdirectory path) - %R: Jalur root (jalur subdirektori torrent pertama) + - + %D: Save path - %D: Jalur simpan + - + %C: Number of files - %C: Jumlah berkas + - + %Z: Torrent size (bytes) - %Z: Ukuran torrent (bita) + - + %T: Current tracker - %T: Pelacak saat ini + - + %I: Info hash - %I: Info hash + - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - Tip: Merangkum parameter dengan tanda kutipan untuk menghindari teks terpotong di ruang putih (m.s., "%N") - - - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - Satu torrent akan menentukan lambat jika nilai unduh dan unggah bertahan dibawah nilai ini untuk "Timer Torrent ketidakaktifan" detik + - + Select folder to monitor - Pilih folder untuk dimonitor + - + Folder is already being monitored: - Folder telah dimonitor: + - + Folder does not exist: - Folder tidak ada: + - + Folder is not readable: - Folder tidak bisa dibaca: + - + Adding entry failed - Gagal menambahkan entri + - - - - + + Choose export directory - Pilih direktori ekspor + - - - + + + + + + Choose a save directory - Pilih direktori simpan + - + Choose an IP filter file - Pilih berkas filter IP + - + All supported filters - Semua filter yang didukung + - + SSL Certificate - Sertifikat SSL + + + + + SSL Key + - + Parsing error - Galat penguraian + - + Failed to parse the provided IP filter - Gagal mengurai filter IP yang diberikan + - + Successfully refreshed - Berhasil disegarkan + - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - Berhasil mengurai filter IP yang diberikan: %1 aturan diterapkan. + Berhasil mengurai penyaring IP yang diberikan: %1 aturan diterapkan. - + Invalid key - Kunci tidak valid + - + This is not a valid SSL key. - Ini bukan kunci SSL yang valid. + - + Invalid certificate - Sertifikat tidak valid - - - - Preferences - Preferensi - - - - Import SSL certificate - Impor sertifikat SSL + - + This is not a valid SSL certificate. - Ini bukan Sertifikat SSL yang valid. - - - - Import SSL key - Impor kunci SSL - - - - SSL key - Kunci SSL + - + Time Error - Galat Waktu + - + The start time and the end time can't be the same. - Waktu mulai dan berakhir tidak boleh sama. + - - + + Length Error - Galat Panjang + - + The Web UI username must be at least 3 characters long. - Panjang nama pengguna Web UI minimal harus 3 karakter. + - + The Web UI password must be at least 6 characters long. - Password Web UI harus setidaknya 6 karakter atau lebih. + PeerInfo - - Interested(local) and Choked(peer) - Tertarik(lokal) dan Tercekik(sejawat) + + interested(local) and choked(peer) + tertarik(lokal) dan choked(rekanan) - + interested(local) and unchoked(peer) tertarik(lokal) dan unchoked(rekanan) - + interested(peer) and choked(local) tertarik(rekanan) dan choked(lokal) - + interested(peer) and unchoked(local) tertarik(rekanan) dan unchoked(lokal) - + optimistic unchoke unchoke optimistis - + peer snubbed rekanan ditolak - + incoming connection koneksi masuk - + not interested(local) and unchoked(peer) tidak tertarik(lokal) dan unchoked(rekanan) - + not interested(peer) and unchoked(local) tidak tertarik(rekanan) dan unchoked(lokal) - + peer from PEX rekan dari PEX - + peer from DHT rekan dari DHT - + encrypted traffic lalu lintas terenkripsi - + encrypted handshake handshake dienkripsi - + peer from LSD rekan dari LSD @@ -5969,193 +5311,178 @@ PeerListWidget - + IP IP - + Port Port - + Flags Bendera - + Connection Koneksi - + Client i.e.: Client application Klien - + Progress i.e: % downloaded - Progres + Kemajuan - + Down Speed i.e: Download speed Kecepatan Unduh - + Up Speed i.e: Upload speed Kecepatan Unggah - + Downloaded i.e: total data downloaded Terunduh - + Uploaded i.e: total data uploaded Terunggah - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Relevansi - + Files i.e. files that are being downloaded right now Berkas - + Column visibility Keterlihatan kolom - + Add a new peer... Tambah rekan baru... - - + + Ban peer permanently Cekal rekan secara permanen - + Manually adding peer '%1'... Secara manual menambahkan rekan '%1'... - + The peer '%1' could not be added to this torrent. Rekan '%1' tidak bisa ditambahkan ke torrent ini. - + Manually banning peer '%1'... Secara manual mencekal rekan '%1'... - - + + Peer addition Tambahan rekan - + Country Negara - + Copy IP:port - Salin IP:port + - + Some peers could not be added. Check the Log for details. - Beberapa rekanan tidak bisa ditambahkan. Periksa Log untuk detail lebih lanjut. + Beberapa rekan tidak bisa ditambahkan. Periksa Log untuk detail lebih lanjut. - + The peers were added to this torrent. - Rekanan telah ditambahkan ke torrent ini. + Rekan telah ditambahkan ke torrent ini. - + Are you sure you want to ban permanently the selected peers? - Apakah Anda yakin ingin mencekal secara permanen rekanan yang dipilih? + Apakah Anda yakin ingin mencekal secara permanen rekan yang dipilih? - + &Yes &Ya - + &No &Tidak - PeersAdditionDialog - - - Add Peers - Tambah sejawat - - - - List of peers to add (one IP per line): - Daftar sejawat ditambahkan (satu per baris): - - - - Format: IPv4:port / [IPv6]:port - Format: IPv4:port / [IPv6]:port - + PeersAdditionDlg - + No peer entered - Tiada sejawat dimasukan + Tidak ada rekan yang dimasukkan - + Please type at least one peer. - Mohon masukan satu sejawat. + Mohon ketik paling tidak satu rekan. - + Invalid peer - Sejawat tidak sah + Rekan tidak valid - + The peer '%1' is invalid. - Sejawat '%1' tidak sah. + Rekan '%1' tidak valid. PieceAvailabilityBar - + White: Unavailable pieces Putih: Bagian tidak ada - + Blue: Available pieces Biru: Bagian yang ada @@ -6163,337 +5490,293 @@ PiecesBar - + Files in this piece: - Berkas dalam potongan ini: + - + File in this piece - Berkas dalam potongan ini + - + File in these pieces - Berkas dalam potongan ini - - - - Wait until metadata become available to see detailed information - Tunggu sampai metadata menjadi tersedia untuk melihat informasi mendetail + - + Hold Shift key for detailed information - Tahan tombol Shift untuk informasi mendetail + - PluginSelectDialog + PluginSelectDlg - + Search plugins - Cari plugin + Plugin pencarian - + Installed search plugins: - Cari plugin terpasang: + Plugin pencarian terpasang: - + Name Nama - + Version Versi - + Url - URL + Url - - + + Enabled - Aktif - - - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - Peringatan: Pastikan untuk memastikan hukum hak cipta yang berlaku di negara anda saat mengunduh torrent dari mesin pencari dibawah ini. + Diaktifkan - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - Anda dapat mendapatkan plugin mesin pencari baru disini: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Anda bisa mendapatkan mesin pencari baru di sini: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one Pasang yang baru - + Check for updates - Cek pembaruan + Periksa pemutakhiran - + Close Tutup - + Uninstall - Copot + Bongkar - - - + + + Yes Ya - - - - + + + + No Tidak - + Uninstall warning - Peringatan copot + Peringatan pembongkaran - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - Beberapa plugin tidak dapat dicopot karena termasuk dalam qBittorrent. Hanya yang ditambahkan sendiri yang dapat dicopot. -Plugin ini semua dinonaktifkan. + Beberapa plugin tidak bisa dibuang karena mereka disertakan qBittorrent secara bawaan. Hanya yang Anda tambahkan sendiri yang bisa Anda buang. +Plugin tersebut telah dinonfungsikan. - + Uninstall success - Copot sukses + Berhasil dibongkar - + All selected plugins were uninstalled successfully - Semua plugin sudah berhasil dicopot - - - - - - - Search plugin update - Cari pembaruan plugin + Semua plugin yang dipilih telah berhasil dibongkar. - - Plugins installed or updated: %1 - Plugin dipasang atau diperbarui: %1 - - - - + + New search engine plugin URL - URL pengaya mesin pencarian baru + URL plugin mesin pencarian baru - - + + URL: URL: - + Invalid link Tautan tidak valid - + The link doesn't seem to point to a search engine plugin. Tautan sepertinya tidak mengarah ke plugin mesin pencarian. - + Select search plugins Pilih plugin pencarian - + qBittorrent search plugin Plugin pencarian qBittorrent - + + + + Search plugin update + Pemutakhiran plugin pencarian + + + All your plugins are already up to date. Semua plugin Anda telah dimutakhirkan. - + Sorry, couldn't check for plugin updates. %1 Maaf, tidak bisa memeriksa pemutakhiran plugin: %1 - + + + Search plugin install Pemasangan plugin pencarian - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + Plugin mesin pencarian "%1" telah berhasil dipasang. + + + Couldn't install "%1" search engine plugin. %2 Tidak bisa memasang plugin mesin pencarian "%1". %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + Plugin mesin pencarian "%1" telah berhasil dimutakhirkan. + + + Couldn't update "%1" search engine plugin. %2 - Tidak bisa membarui plugin mesin pencarian "%1". %2 + Tidak bisa memutakhirkan plugin mesin pencarian "%1". %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source Sumber plugin - + Search plugin source: - Cari sumber plugin: + Sumber plugin pencarian: - + Local file Berkas lokal - + Web link - Tautan Web - - - - PowerManagement - - - qBittorrent is active - qBittorrent sedang aktif + Tautan web - PreviewSelectDialog - - - Preview - Pratinjau - + PreviewSelect - + Name Nama - + Size Ukuran - + Progress - Progres + Kemajuan - - + + Preview impossible - Preview tidak bisa + Mustahil pratinjau - - + + Sorry, we can't preview this file - Maaf, tidak dapat preview berkas ini - - - - Private::FileLineEdit - - - '%1' does not exist - '%1' tidak ditemukan - - - - '%1' does not point to a directory - '%1' tidak terarah ke direktori - - - - '%1' does not point to a file - '%1' tidak terarah ke berkas - - - - Does not have read permission in '%1' - Tidak memiliki izin membaca di '%1' - - - - Does not have write permission in '%1' - Tidak memiliki izin membaca di '%1' + Maaf, kami tidak bisa meninjau berkas ini PropListDelegate - + Not downloaded Tidak diunduh - - + + Normal Normal (priority) Normal - - N/A - T/A - - - + Do not download Do not download (priority) - Jangan unduh + - - + + High High (priority) Tinggi - + N/A + T/A + + + Mixed Mixed (priorities Campuran - - + + Maximum Maximum (priority) Maksimum @@ -6502,32 +5785,32 @@ PropTabBar - + General Umum - + Trackers Pelacak - + Peers - Rekanan + Rekan - + HTTP Sources Sumber HTTP - + Content Isi - + Speed Kecepatan @@ -6547,7 +5830,7 @@ Progress: - Progres: + Kemajuan: @@ -6573,7 +5856,7 @@ Seeds: - Pembibitan: + Bibit: @@ -6588,7 +5871,7 @@ Peers: - Rekanan: + Rekan: @@ -6621,22 +5904,22 @@ Komentar: - + Select All Pilih Semua - + Select None Pilih Nihil - + Normal Normal - + High Tinggi @@ -6696,165 +5979,165 @@ Jalur Simpan: - + Maximum Maksimum + - Do not download Jangan mengunduh - + Never Jangan Pernah - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (memiliki %3) - - + + %1 (%2 this session) %1 (%2 sesi ini) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (dibibit selama %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 maks) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 total) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 rerata.) - + Open Buka - + Open Containing Folder Buka Folder yang Memuat - + Rename... Ubah nama... - + Priority Prioritas - + New Web seed Bibit Web baru - + Remove Web seed Buang bibit Web - + Copy Web seed URL Salin URL bibit Web - + Edit Web seed URL Sunting URL bibit Web - + + Rename the file + Ubah nama berkas + + + New name: Nama baru: - - + + + The file could not be renamed + Berkas tidak bisa diubah namanya + + + + This file name contains forbidden characters, please choose a different one. + Nama berkas ini mengandung karakter yang dilarang, mohon pilih karakter yang berbeda. + + + + This name is already in use in this folder. Please use a different name. Nama ini telah digunakan dalam folder ini. Mohon gunakan nama yang berbeda. - + The folder could not be renamed Folder tidak bisa diubah namanya - + qBittorrent qBittorrent - + Filter files... - Filter berkas... - - - - Renaming - Rubah nama + Saring berkas... - - - Rename error - Galat rubah nama - - - - The name is empty or contains forbidden characters, please choose a different one. - Nama kosong atau mengandung karakter yang dilarang, silakan pilih nama yang lainnya. - - - + New URL seed New HTTP source Bibit URL baru - + New URL seed: Bibit URL baru: - - + + This URL seed is already in the list. Bibit URL ini telah ada di dalam daftar. - + Web seed editing Penyuntingan bibit web - + Web seed URL: URL bibit web: @@ -6862,860 +6145,820 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + Alamat IP Anda telah dicekal setelah terlalu banyak percobaan otentikasi yang gagal. + + + + Error: '%1' is not a valid torrent file. + + Galat: '%1' bukan berkas torrent yang valid. + + + + + Error: Could not add torrent to session. + Galat: Tidak bisa menambahkan torrent ke sesi. + + + + I/O Error: Could not create temporary file. + Galat I/O: Tidak bisa membuat berkas sementara. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 adalah parameter baris perintah yang tidak dikenal. - - + + %1 must be the single command line parameter. %1 harus sebagai parameter baris perintah tunggal. - + + %1 must specify the correct port (1 to 65535). + %1 harus menetapkan port yang benar (1 to 65535). + + + You cannot use %1: qBittorrent is already running for this user. Anda tidak bisa menggunakan %1: qBittorrent telah berjalan untuk pengguna ini. - + Usage: Penggunaan: - + Options: Opsi: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - Parameter '%1' harus mengikuti sintaksis '%1=%2' + + Displays program version + Tampilkan versi program - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - Parameter '%1' harus mengikuti sintaksis '%1=%2' + + Displays this help message + Tampilkan pesan bantuan ini - - Expected integer number in environment variable '%1', but got '%2' - Diharapkan bilangan bulat berada dalam lingkungan variabel '%1', tetapi dapat '%2' + + Changes the Web UI port (current: %1) + Ubah port Web UI (saat ini: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - Parameter '%1' harus mengikuti sintaksis '%1=%2' + + Disable splash screen + Nonaktifkan layar sambutan - - Expected %1 in environment variable '%2', but got '%3' - Diharapkan %1 dalam lingkungan variabel '%2', tetapi dapat '%3' + + Run in daemon-mode (background) + Jalankan dalam mode daemon (latar) - - port - port + + Downloads the torrents passed by the user + Unduh torrent yang diberikan oleh pengguna - - %1 must specify a valid port (1 to 65535). - %1 harus spesifik port benar (1 sampai 65535). + + Help + Bantuan - - Display program version and exit - Tampilkan versi program dan keluar + + Run application with -h option to read about command line parameters. + Jalankan aplikasi dengan opsi -h untuk membaca tentang parameter baris perintah. - - Display this help message and exit - Tampilkan pesan bantuan ini dan keluar + + Bad command line + Baris perintah buruk - - Change the Web UI port - Ubah port Web UI + + Bad command line: + Baris perintah buruk: - - Disable splash screen - Nonaktifkan layar sambutan + + Legal Notice + Catatan Hukum - - Run in daemon-mode (background) - Jalankan dalam mode daemon (latar) + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + qBittorrent adalah program berbagi berkas. Ketika Anda menjalankan sebuah torrent, datanya akan tersedia untuk orang lain dalam konteks pengunggahan. Konten apapun yang Anda bagi adalah sepenuhnya tanggung jawab Anda. + +Tidak ada pemberitahuan lebih lanjut yang akan dikeluarkan. - - dir - Use appropriate short form or abbreviation of "directory" - dir + + Press %1 key to accept and continue... + Tekan tombol %1 untuk menerima dan melanjutkan... - - Store configuration files in <dir> - Simpan berkas konfigurasi di dalam <dir> + + Legal notice + Catatan hukum - - - name - nama + + Cancel + Batal - - Store configuration files in directories qBittorrent_<name> - Simpan berkas konfigurasi di dalam direktori qBittorrent_<name> + + I Agree + Saya Setuju - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Retas ke dalam libtorrent sambung-cepat berkas dan buat tempat tujuan relatif ke direktori profil - + + Torrent name: %1 + Nama torrent: %1 + - - files or URLs - berkas atau URL + + Torrent size: %1 + Ukuran torrent: %1 - - Download the torrents passed by the user - Unduhan torrent dilewati oleh pengguna + + Save path: %1 + Jalur simpan: %1 - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Tentukan apakah "Buat torrent baru" dialog terbuka saat menambah torrent. + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Torrent telah diunduh di %1. - - Options when adding new torrents: - Opsi saat menambahkan torrent baru: + + Thank you for using qBittorrent. + Terima kasih telah menggunakan qBittorrent. - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Pintasan untuk %1 + + [qBittorrent] '%1' has finished downloading + [qBittorrent] '%1' telah selesai mengunduh - - path - jalur + + The remote host name was not found (invalid hostname) + Nama hos jauh tidak ditemukan (nama hos tidak valid) - - Torrent save path - Jalur simpan torrent + + The operation was canceled + Operasi telah dibatalkan - - Add torrents as started or paused - Tambahkan torrent memulai atau menunda + + The remote server closed the connection prematurely, before the entire reply was received and processed + Server jauh menutup sambungan secara prematur, sebelum semua balasan diterima dan diproses - - Skip hash check - Lewati pengecekan hash + + The connection to the remote server timed out + Sambungan ke server jauh kehabisan waktu - - Assign torrents to category. If the category doesn't exist, it will be created. - Masukkan torrent ke dalam kategori. Kategori otomatis dibuat jika tidak ada. + + SSL/TLS handshake failed + Jabat-tangan SSL/TLS gagal - - Download files in sequential order - Unduh berkas dalam urutan + + The remote server refused the connection + Server jauh menolak sambungan - - Download first and last pieces first - Unduh bagian pertama dan akhir terlebih dahulu + + The connection to the proxy server was refused + Sambungan ke server proksi telah ditolak - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - Opsi nilai mungkin berisi via lingkungan variabel. Untuk opsi bernama 'parameter-nama', lingkungan variabel nama ialah 'QBT_PARAMETER_NAMA' (dengan huruf besar, '-' diganti dengan '_'). Untuk meneruskan nilai bendera, atur variabel menjadi '1' atau 'BENAR'. Untuk contoh, untuk menonatifkan splash screen:  + + The proxy server closed the connection prematurely + Server proksi menutup sambungan secara prematur - - Command line parameters take precedence over environment variables - Perintah baris parameter akan mendahulukan lebih dari lingkungan variabel. + + The proxy host name was not found + Nama hos proksi tidak ditemukan - - Help - Bantuan + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Sambungan ke proksi kehabisan waktu atau proksi tidak membalas pada waktu permintaan dikirim - - Run application with -h option to read about command line parameters. - Jalankan aplikasi dengan opsi -h untuk membaca tentang parameter baris perintah. + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Proksi membutuhkan otentikasi dalam rangka menghormati permintaan tetapi tidak menerima kredensial apapun yang ditawarkan - - Bad command line - Baris perintah buruk + + The access to the remote content was denied (401) + Akses ke konten jauh ditolak (401) - - Bad command line: - Baris perintah buruk: + + The operation requested on the remote content is not permitted + Permintaan operasi pada konten jauh tidak diizinkan - - Legal Notice - Catatan Hukum + + The remote content was not found at the server (404) + Konten jauh tidak ditemukan di server (404) - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - qBittorrent adalah program berbagi berkas. Ketika menjalankan torrent, data akan ada dan dibagikans dengan menunggah. Konten apapun yang dibagikan adalah resiko anda sendiri. + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Server jauh membutuhkan otentikasi untuk menyediakan konten tetapi kredensial yang diberikan tidak diterima - - No further notices will be issued. - Tidak adap peringatan lanjutan yang akan diangkat. + + The Network Access API cannot honor the request because the protocol is not known + API Akses Jaringan tidak bisa menghormati permintaan karena protokol tidak dikenal - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - qBittorrent adalah program berbagi berkas. Ketika Anda menjalankan sebuah torrent, datanya akan tersedia untuk orang lain dalam konteks pengunggahan. Konten apapun yang Anda bagi adalah sepenuhnya tanggung jawab Anda. - -Tidak ada pemberitahuan lebih lanjut yang akan dikeluarkan. + + The requested operation is invalid for this protocol + Operasi yang diminta tidak valid untuk protokol ini - - Press %1 key to accept and continue... - Tekan tombol %1 untuk menerima dan melanjutkan... + + An unknown network-related error was detected + Sebuah galat tidak dikenal terkait jaringan telah terdeteksi - - Legal notice - Catatan hukum + + An unknown proxy-related error was detected + Sebuah galat tidak dikenal terkait proksi telah terdeteksi - - Cancel - Batal + + An unknown error related to the remote content was detected + Sebuah galat tidak dikenal terkait konten jauh telah terdeteksi - - I Agree - Saya Setuju + + A breakdown in protocol was detected + Sebuah gangguan dalam protokol telah terdeteksi - - + + Unknown error + Galat tidak dikenal + + + + Upgrade Tingkatkan - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] Anda memutakhirkan dari versi lama yang memiliki proses penyimpanan yang berbeda. Anda harus meningkatkannya ke sistem penyimpanan baru. Anda tidak akan bisa menggunakan versi yang lebih lama dari v3.3.0 lagi. Lanjutkan? [y/t] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. Anda memutakhirkan dari versi lama yang memiliki proses penyimpanan yang berbeda. Anda harus meningkatkannya ke sistem penyimpanan baru. Jika Anda melanjutkan, Anda tidak akan bisa menggunakan versi yang lebih lama dari v3.3.0 lagi. - + Couldn't migrate torrent with hash: %1 Tidak bisa migrasi torrent dengan hash: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 Tidak bisa migrasi torrent. Nama berkas lanjutcepat tidak valid: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 - Terdeteksi program tidak bersih keluar. Gunakan berkas mundur untuk mengembalikan pengaturan: %1 + + Detected unclean program exit. Using fallback file to restore settings. + - + An access error occurred while trying to write the configuration file. - Galat akses terjadi ketika mencoba menulis berkas konfigurasi. + - + A format error occurred while trying to write the configuration file. - Galat format terjadi ketika mencoba menulis berkas konfigurasi. - - - - An unknown error occurred while trying to write the configuration file. - Galat tidak diketahui ketika mencoba menulis berkas konfigurasi. - - - - RSS::AutoDownloader - - - - Invalid data format. - Format data tidak valid. - - - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - Tidak dapat menyimpan data RSS AutoDownloader di %1. Galat: %2 - - - - Invalid data format - Format data tidak valid - - - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - Tidak dapat membaca aturan RSS AutoDownloader di %1. Galat: %2 - - - - Couldn't load RSS AutoDownloader rules. Reason: %1 - Tidak dapat mengakses aturan RSS AutoDownloader di %1. Galat: %2 - - - - RSS::Feed - - - Failed to download RSS feed at '%1'. Reason: %2 - Gagal mengunduh RSS memasukkan di '%1'. Penyebab: %2 - - - - RSS feed at '%1' updated. Added %2 new articles. - Masukan RSS di '%1' diperbaharui. Tambahkan %2 pasal baru. - - - - Failed to parse RSS feed at '%1'. Reason: %2 - Gagal menguraikan RSS memasukkan di '%1'. Penyebab: %2 - - - - Couldn't read RSS Session data from %1. Error: %2 - Tidak dapat membaca Sesi data RSS memasukkan di '%1'. Galat: %2 - - - - Couldn't parse RSS Session data. Error: %1 - Tidak dapat menguraikan Sesi data RSS. Galat: %1 - - - - Couldn't load RSS Session data. Invalid data format. - Tidak dapat mengakses data RSS. Format tidak sah. - - - - Couldn't load RSS article '%1#%2'. Invalid data format. - Tidak dapat mengakses pasal RSS '%1#%2'. Format tidak sah. - - - - RSS::Private::Parser - - - Invalid RSS feed. - Masukkan RSS tidak sah. - - - - %1 (line: %2, column: %3, offset: %4). - %1 (baris: %2, kolom: %3, imbang: %4). - - - - RSS::Session - - - RSS feed with given URL already exists: %1. - Masukkan RSS diberikan URL sudah ada: %1. - - - - Cannot move root folder. - Tidak dapat memindah folder akar. - - - - - Item doesn't exist: %1. - Item tidak ada: %1. - - - - Cannot delete root folder. - Tidak bisa menghapus folder root - - - - Incorrect RSS Item path: %1. - Jalur item RSS tidak benar: %1. - - - - RSS item with given path already exists: %1. - Item RSS dengan jalur diberikan sudah ada: %1. - - - - Parent folder doesn't exist: %1. - Folder induk tidak ditemukan: %1. + - RSSWidget + RSS - + Search Cari - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - Mengambil masukkan RSS dinonaktifkan sekarang! Anda dapat mengaktifkan di pengaturan aplikasi. - - - + New subscription Langganan baru - - - + + + Mark items read Tandai item sudah dibaca - - Refresh RSS streams - Segarkan aliran RSS - - - + Update all Perbarui semua - + RSS Downloader... Pengunduh RSS... - + + Settings... + Pengaturan... + + + Torrents: (double-click to download) Torrent: (klik dua kali untuk mengunduh) - - + + Delete Hapus - + Rename... Ubah nama... - + Rename Ubah nama - - + + Update Perbarui - + New subscription... Langganan baru... - - + + Update all feeds Perbarui semua umpan - + Download torrent Unduh torrent - + Open news URL Buka URL berita - + Copy feed URL Salin URL umpan - + New folder... Folder baru... - + + Refresh RSS streams + Segarkan strim RSS + + + + RSSImp + + + Stream URL: + URL Strim: + + + + Please type a RSS stream URL + Mohon ketik URL strim RSS + + + + This RSS feed is already in the list. + Umpan RSS ini telah ada di dalam daftar. + + + Please choose a folder name - Silakan pilih nama folder + Mohon pilih nama folder - + Folder name: Nama folder: - + New folder Folder baru - - Please type a RSS feed URL - Silakan ketik URL umpan RSS - - - - Feed URL: - URL Umpan: - - - + Deletion confirmation Konfirmasi penghapusan - + Are you sure you want to delete the selected RSS feeds? - Anda yakin ingin menghapus masukkan terpilih RSS? + Apakah Anda yakin ingin menghapus umpan RSS yang dipilih? - + Please choose a new name for this RSS feed - Mohon tentukan nama baru untuk memasukkan RSS + Mohon pilih nama baru untuk umpan RSS ini - + New feed name: - Nama masukkan baru: + Nama umpan baru: + + + + Name already in use + Nama telah digunakan - - Rename failed - Rubah nama gagal + + This name is already used by another item, please choose another one. + Nama ini telah digunakan oleh item lainnya, mohon pilih yang lain. - + Date: Tanggal: - + Author: Penulis: + + + Unread + Belum dibaca + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + Pengunduhan otomatis '%1' dari '%2' umpan RSS gagal karena tidak mengandung tautan torrent atau magnet... + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + Secara otomatis mengunduh '%1' torrent dari '%2' umpan RSS... + + + + Rss::Private::Parser + + + Invalid RSS feed. + Umpan RSS tidak valid. + + + + RssSettingsDlg + + + RSS Reader Settings + Pengaturan Pembaca RSS + + + + RSS feeds refresh interval: + Selang penyegaran umpan RSS: + + + + min + minimal + + + + Maximum number of articles per feed: + Jumlah maksimum artikel per umpan: + ScanFoldersDelegate - + Select save location - Pilih lokasi simpan + ScanFoldersModel - + Monitored Folder - Pantau folder + - + Override Save Location - Batalkan Lokasi Menyimpan: + - + Monitored folder - Pantau folder + - + Default save location - Tempat penyimpanan biasa + - + Browse... - Telusuri... + Telusuri... - SearchJobWidget + SearchEngine - - Form - Formulir + + Unknown search engine plugin file format. + Format berkas plugin mesin pencarian tidak dikenal. - - Results(xxx) - Hasil(xxx) + + A more recent version of this plugin is already installed. + Versi yang lebih baru dari plugin mesin pencarian ini telah terpasang. - - Search in: - Cari pada: + + + Plugin is not supported. + Plugin tidak didukung. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - <html><head/><body><p>Beberapa mesin pencari ada di deskripsi torrent dan di dalam nama-nama torrent juga. Apapun hasil akan ditampilkan di daftar dibawah yang dikontrol di mode ini.</p><p><span style=" font-weight:600;">Dimana saja</span>filter dinonaktifkan dan tampilkan kembali semuanya oleh mesin pencari.</p><p><span style=" font-weight:600;">Hanya nama torrent</span>Tampilkan cuma torrent yang namanya sesuai dengan antri pencarian.</p></body></html> + + Update server is temporarily unavailable. %1 + Server pemutakhiran sementara tidak tersedia. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - <html><head/><body><p>Tetapkan jumlah minimum dan maksimum seeder yang diizinkan</p></body></html> + + + Failed to download the plugin file. %1 + Gagal mengunduh berkas plugin. %1 - - Seeds: - Benih: + + An incorrect update info received. + Menerima info pemutakhiran yang tidak benar. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - <html><head/><body><p>Jumlah minimum seed</p></body></html> + + All categories + Semua kategori - - - to - sampai + + Movies + Film - - <html><head/><body><p>Maximal number of seeds</p></body></html> - <html><head/><body><p>Jumlah maksimum seed</p></body></html> + + TV shows + Acara TV - - - - + + Music + Musik - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - <html><head/><body><p>Tetapkan ukuran minimum dan maksimum torrent yang diizinkan</p></body></html> + + Games + Permainan - - Size: - Ukuran: + + Anime + Anime - - <html><head/><body><p>Minimal torrent size</p></body></html> - <html><head/><body><p>Ukuran minimum torrent</p></body></html> + + Software + Perangkat Lunak - - <html><head/><body><p>Maximal torrent size</p></body></html> - <html><head/><body><p>Ukuran maksimal torrent</p></body></html> + + Pictures + Gambar + + + + Books + Buku + + + + SearchListDelegate + + + + Unknown + Tidak diketahui + + + SearchTab - + Name i.e: file name Nama - + Size i.e: file size Ukuran - + Seeders i.e: Number of full sources - Benih + Pembibit - + Leechers i.e: Number of partial sources - Lintah + Leecher - + Search engine Mesin pencari - - Filter search results... - Uraikan hasil pencarian - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results Hasil (menampilkan <i>%1</i> dari <i>%2</i>): - + Torrent names only Hanya nama torrent - + Everywhere - Dimana saja + Di semua tempat - - Use regular expressions - Gunakan ekspresi biasa - - - + Searching... Mencari... - + Search has finished - Pencarian sudah selesai + Pencarian telah selesai - + Search aborted Pencarian dibatalkan - + An error occurred during search... - Ada terjadi galat saat pencarian... + Sebuah galat terjadi saat pencarian... - + Search returned no results - Pencarian kembali tanpa hasil + Pencarian tidak menghasilkan apa-apa - + Column visibility - Keterlihatan Kolom - - - - SearchPluginManager - - - Unknown search engine plugin file format. - Format berkas plugin mesin pencari tidak diketahui. + Keterlihatan kolom - - A more recent version of this plugin is already installed. - Versi lebih sekarang plugin sudah terpasang. - - - - - Plugin is not supported. - Plugin tidak didukung. + + Form + Formulir - - All categories - Semua kategori + + Results(xxx) + Hasil(xxx) - - Movies - Movie + + Search in: + Cari di dalam: - - TV shows - TV show + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Beberapa mesin pencari mencari di dalam deskripsi torrent dan juga nama berkas. Dan hasil yang akan ditampilkan di bawah diatur oleh mode berikut.</p> Nonfungsikan filter <p><span style="font-weight:600;">di semua tempat</span> dan tampilkan semua hasil mesin pencari.</p> <p><span style=" font-weight:600;">Hanya nama torrent</span> hanya menampilkan hasil pencarian torrent yang namanya cocok dengan kata pencarian.</p></body></html> - - Music - Musik + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Tetapkan jumlah minimal dan maksimal pembibit yang diperbolehkan</p></body></html> - - Games - Games + + Seeds: + Bibit: - - Anime - Anime + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Jumlah minimal bibit</p></body></html> - - Software - Software + + + to + sampai - - Pictures - Gambar + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Jumlah maksimal bibit</p></body></html> - - - Books - Buku + + + + + - - Update server is temporarily unavailable. %1 - Server memperbaharui sementara tidak tersedia. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Tetapkan ukuran minimal and maksimal berkas torrent yang diperbolehkan</p></body></html> - - - Failed to download the plugin file. %1 - Gagal mengunduh berkas plugin. %1 + + Size: + Ukuran: - - An incorrect update info received. - Kesalahan info pembaharuan diterima. + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Ukuran minimal torrent</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - Mencari plugin '%1' terdapat kesalahan versi string ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Ukuran maksimal torrent</p></body></html> @@ -7723,198 +6966,185 @@ - - - - + + + Search Cari - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - Tidak ada ditemukan plugin terpasang dipencarian. -Klik tombol "Temukan plugin" tepat dibawah bagian jendela untuk memasang lebih. - - - + Download Unduh - + Go to description page Kunjungi halaman deskripsi - + Copy description page URL Salin URL halaman deskripsi - + Search plugins... Plugin pencarian... - + A phrase to search for. Kata/frasa yang akan dicari. - + Spaces in a search term may be protected by double quotes. Kata/frasa berspasi bisa dibuka dan ditutup dengan tanda petik ganda. - + Example: Search phrase example Contoh: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>: mencari <b>foo</b> dan <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: mencari <b>foo bar</b> - + All plugins Semua plugin - + Only enabled - Hanya izinkan + - + Select... - Pilih... + - - - + + + Search Engine Mesin Pencari - + Please install Python to use the Search Engine. Mohon pasang Python untuk menggunakan Mesin Pencari. - + Empty search pattern Pola pencarian kosong - + Please type a search pattern first Mohon ketik pola pencarian telebih dahulu - + Stop Hentikan - + Search has finished Pencarian telah selesai - + Search has failed Pencarian telah gagal - ShutdownConfirmDialog - - - Don't show again - Jangan pernah ditampilkan lagi - + ShutdownConfirmDlg - + qBittorrent will now exit. qBittorrent sekarang akan ditutup. - + E&xit Now &Keluar Sekarang - + Exit confirmation Konfirmasi keluar - + The computer is going to shutdown. - Komputer akan dimatikan. + Komputer akan segera dimatikan. - + &Shutdown Now - &Matikan Sekarang - - - - Shutdown confirmation - + &Dimatikan Sekarang - + The computer is going to enter suspend mode. - + Komputer akan segera masuk mode suspend. - + &Suspend Now - + &Suspend Sekarang - + Suspend confirmation - + Konfirmasi suspend - + The computer is going to enter hibernation mode. - + Komputer akan segera masuk mode hibernasi. - + &Hibernate Now &Hibernasi Sekarang - + Hibernate confirmation Konfirmasi hibernasi - + You can cancel the action within %1 seconds. - Anda bisa membatalkan tindakan dalam %1 detik. + Anda bisa membatalkan perintah ini dalam waktu &1 detik. + + + + Shutdown confirmation + Konfirmasi matikan SpeedLimitDialog - + KiB/s KiB/s @@ -7922,52 +7152,52 @@ SpeedPlotView - + Total Upload Total Unggah - + Total Download Total Unduh - + Payload Upload Muatan Unggah - + Payload Download Muatan Unduh - + Overhead Upload Beban Unggah - + Overhead Download Beban Unduh - + DHT Upload Unggahan DHT - + DHT Download Unduhan DHT - + Tracker Upload Unggahan Pelacak - + Tracker Download Unduhan Pelacak @@ -7975,95 +7205,87 @@ SpeedWidget - + Period: Periode: - + 1 Minute 1 Menit - + 5 Minutes 5 Menit - + 30 Minutes 30 Menit - + 6 Hours 6 Jam - + Select Graphs Pilih Grafik - + Total Upload Total Unggah - + Total Download Total Unduh - + Payload Upload Muatan Unggah - + Payload Download Muatan Unduh - + Overhead Upload Beban Unggah - + Overhead Download Beban Unduh - + DHT Upload Unggahan DHT - + DHT Download Unduhan DHT - + Tracker Upload Unggahan Pelacak - + Tracker Download Unduhan Pelacak - StacktraceDialog - - - Crash info - Info sendat - - - StatsDialog @@ -8076,49 +7298,49 @@ Statistik pengguna: - - Cache statistics - Statistik tembolok + + Total peer connections: + Total koneksi rekan: - - Read cache hits: - Baca cache hits: + + Global ratio: + Rasio global: - - Average time in queue: - Rata-rata waktu dalam antrian: + + Alltime download: + Unduhan sepanjang waktu: - - Connected peers: - Sejawat tersambung: + + Alltime upload: + Unggahan sepanjang waktu: - - All-time share ratio: - Ratio waktu-semua pembagian: + + Total waste (this session): + Total terbuang (sesi ini): - - All-time download: - Semua-waktu unduh: + + Cache statistics + Statistik tembolok - - Session waste: - Sesi terbuang: + + Read cache hits: + - - All-time upload: - Semua-waktu unggah: + + Average time in queue: + - Total buffer size: - Total ukuran buffer: + Total buffers size: + Total ukuran bufer: @@ -8146,36 +7368,46 @@ Total ukuran yang diantrekan: - + + OK + OK + + + %1 ms 18 milliseconds - %1 md + StatusBar - + Connection status: Status koneksi: - + No direct connections. This may indicate network configuration problems. Tidak ada koneksi langsung. Ini mungkin menunjukkan masalah konfigurasi jaringan. - + DHT: %1 nodes DHT: %1 jalinan - - qBittorrent needs to be restarted! - qBittorrent perlu dimulai ulang! + + qBittorrent needs to be restarted + qBittorrent perlu dimulai ulang + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent telah dimutakhirkan dan perlu dimulai ulang agar perubahan menjadi efektif. @@ -8194,1570 +7426,1311 @@ Daring - + Click to switch to alternative speed limits Klik untuk beralih ke batas kecepatan alternatif - + Click to switch to regular speed limits Klik untuk beralih ke batas kecepatan reguler - + + Manual change of rate limits mode. The scheduler is disabled. + Ubah manual mode batas laju. Penjadwalan dinonaktifkan. + + + Global Download Speed Limit Batas Kecepatan Unduh Global - + Global Upload Speed Limit Batas Kecepatan Unggah Global - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter Semua (0) - + Downloading (0) Mengunduh (0) - + Seeding (0) - Membenih (0) + Membibit (0) - + Completed (0) - Selesai (0) + Komplet (0) - + Resumed (0) Dilanjutkan (0) - + Paused (0) Ditangguhkan (0) - + Active (0) Aktif (0) - + Inactive (0) - Nonaktif (0) + Tidak aktif (0) - + Errored (0) Galat (0) - + All (%1) Semua (%1) - + Downloading (%1) Mengunduh (%1) - + Seeding (%1) - Membenih (%1) + Membibit (%1) - + Completed (%1) - Selesai (%1) + Komplet (%1) - + Paused (%1) Ditangguhkan (%1) - + Resumed (%1) Dilanjutkan (%1) - + Active (%1) Aktif (%1) - + Inactive (%1) - Nonaktif (%1) + Tidak aktif (%1) - + Errored (%1) Galat (%1) - TagFilterModel + TorrentContentModel - - Tags - Tag + + Name + Nama - - All - Semua + + Size + Ukuran - - Untagged - Tak Bertag + + Progress + Kemajuan - - - TagFilterWidget - - Add tag... - Tambah tag... + + Download Priority + Prioritas Unduh - - Remove tag - Buang tag + + Remaining + Sisa + + + TorrentCreatorDlg - - Remove unused tags - Buang tag yang tidak digunakan + + Select a folder to add to the torrent + Pilih folder untuk ditambahkan ke torrent - - Resume torrents - Lanjutkan torrent + + Select a file to add to the torrent + Pilih berkas untuk ditambahkan ke torrent - - Pause torrents - Tangguhkan torrent + + No input path set + Tidak ada jalur masukan yang ditetapkan - - Delete torrents - Hapus torrent + + Please type an input path first + Mohon ketik jalur masukan terlebih dahulu - - New Tag - Tag Baru + + Select destination torrent file + Pilih tujuan berkas torrent - - Tag: - Tag: + + Torrent Files (*.torrent) + Berkas Torrent (*.torrent) - - Invalid tag name - Nama tag tidak valid + + Torrent was created successfully: %1 + %1 is the path of the torrent + Torrent berhasil dibuat: %1 - - Tag name '%1' is invalid - Nama tag '%1' tidak valid + + + + Torrent creation + Pembuatan torrent - - Tag exists - Tag sudah ada + + Torrent creation was unsuccessful, reason: %1 + Pembuatan torrent tidak berhasil, alasan: %1 - - Tag name already exists. - Nama tag sudah ada. + + Created torrent file is invalid. It won't be added to download list. + Berkas torrent yang dibuat tidak valid. Torrent tidak akan ditambahkan ke daftar unduh. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Properti Kategori Torrent + + Name + i.e: torrent name + Nama - - Name: - Nama: + + Size + i.e: torrent size + Ukuran - - Save path: - Jalur simpan: + + Done + % Done + Selesai - - Choose save path - Pilih jalur simpan + + Status + Torrent status (e.g. downloading, seeding, paused) + Status - - New Category - Kategori Baru + + Seeds + i.e. full sources (often untranslated) + Bibit - - Invalid category name - Nama kategori tidak valid + + Peers + i.e. partial sources (often untranslated) + Rekan - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - Nama kategori tidak bisa mengandung '\'. -Nama kategori tidak bisa dimulai/diakhiri oleh '/'. -Nama kategori tidak bisa '//' barisan. - - - - Category creation error - Pembuatan kategori galat - - - - Category with the given name already exists. -Please choose a different name and try again. - Kategori dengan nama ini sudah ada -Mohon memilih nama lain dan coba lagi. + + Down Speed + i.e: Download speed + Kecepatan Unduh - - - TorrentContentModel - - Name - Nama + + Up Speed + i.e: Upload speed + Kecepatan Unggah - - Size - Ukuran + + Ratio + Share ratio + Rasio - - Progress - Progres + + ETA + i.e: Estimated Time of Arrival / Time left + ETA - - Download Priority - Prioritas Unduh + + Category + Kategori - - Remaining - Sisa + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Ditambahkan Pada - - Availability - Ketersediaan + + Completed On + Torrent was completed on 01/01/2010 08:00 + Komplet Pada - - - TorrentCreatorDialog - - Torrent Creator - Pembuat torrent + + Tracker + Pelacak - - Select file/folder to share - Pilih berkas/folder untuk dibagi + + Down Limit + i.e: Download limit + Batas Unduh - - Path: - Jalur: + + Up Limit + i.e: Upload limit + Batas Unggah - - [Drag and drop area] - [Area Tarik dan Letakkan] + + Downloaded + Amount of data downloaded (e.g. in MB) + Terunduh - - - Select file - Pilih Berkas + + Uploaded + Amount of data uploaded (e.g. in MB) + Diunggah - - - Select folder - Pilih folder + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Sesi Unduh - - Settings - Pengaturan + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Sesi Unggah - - Piece size: - Ukuran bagian: + + Remaining + Amount of data left to download (e.g. in MB) + Sisa - - Auto - Otomatis + + Time Active + Time (duration) the torrent is active (not paused) + Lama Aktif - - 16 KiB - 16 KiB + + Save path + Torrent save path + Jalur simpan - - 32 KiB - 32 KiB + + Completed + Amount of data completed (e.g. in MB) + Komplet - - 64 KiB - 64 KiB + + Ratio Limit + Upload share ratio limit + Batas Rasio - - 128 KiB - 128 KiB - - - - 256 KiB - 256 KiB - - - - 512 KiB - 512 KiB - - - - 1 MiB - 1 MiB - - - - 2 MiB - 2 MiB - - - - 4 MiB - 4 MiB - - - - 8 MiB - 8 MiB - - - - 16 MiB - 16 MiB - - - - 32 MiB - 32 MiB - - - - Calculate number of pieces: - Hitung banyaknya bagian: - - - - Private torrent (Won't distribute on DHT network) - Torrent pribadi (takkan mendistribusi di jaringan DHT) - - - - Start seeding immediately - Mulai benih segera - - - - Ignore share ratio limits for this torrent - Abaikan rasio bagi untuk torrent ini - - - - Optimize alignment - Optimisasi urutan - - - - Fields - Lapangan - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - Anda dapat memisah barisan pencari / grup dengan garis kosong. - - - - Web seed URLs: - URL Benih Web: - - - - Tracker URLs: - URL Pencari: - - - - Comments: - Komentar: - - - - Source: - Sumber: - - - - Progress: - Progres - - - - Create Torrent - Buat torrent - - - - - - Torrent creation failed - Pembuatan torrent gagal. - - - - Reason: Path to file/folder is not readable. - Penyebab: Jalur berkas/folder tidak terbaca. - - - - Select where to save the new torrent - Pilih dimana tempat penyimpanan torrent baru - - - - Torrent Files (*.torrent) - Berkas Torrent (*.torrent) - - - - Reason: %1 - Penyebab: %1 - - - - Reason: Created torrent is invalid. It won't be added to download list. - Penyebab: Pembuatan torrent tidak sah. Tidak akan dimasukan ke daftar unduhan. - - - - Torrent creator - Pembuat torrent - - - - Torrent created: - Torrent dibuat: - - - - TorrentInfo - - - File size exceeds max limit %1 - Ukuran berkas melebihi limit maks %1 - - - - Torrent file read error: %1 - Berkas torrent galat baca: %1 - - - - Torrent file read error: size mismatch - Berkas torrent galat baca: ukuran tidak sesuai - - - - TorrentsController - - - Not contacted yet - Belum dikontak - - - - Updating... - Memperbarui... - - - - Working - Bekerja - - - - Not working - Tidak bekerja - - - - Error: '%1' is not a valid torrent file. - Galat: '%1' bukan berkas torrent yang valid. - - - - - - - Torrent queueing must be enabled - Antrian torrent harus diaktifkan - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - Save path is empty - Jalur penyimpanan kosong - - - - Cannot make save path - Tidak bisa membuat jalur penyimpanan - - - - Cannot write to directory - Tidak bisa menulis jalur penyimpanan - - - - WebUI Set location: moving "%1", from "%2" to "%3" - Lokasi Set WebUI: memindahkan "%1", dari "%2" ke "%3" + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Komplet Terlihat Terakhir - - Incorrect torrent name - Nama torrent salah + + Last Activity + Time passed since a chunk was downloaded/uploaded + Aktivitas Terakhir - - - Incorrect category name - Kesalahan kategori nama + + Total Size + i.e. Size including unwanted data + Total Ukuran TrackerFiltersList - + All (0) this is for the tracker filter Semua (0) - + Trackerless (0) Nirpelacak (0) - + Error (0) Galat (0) - + Warning (0) Peringatan (0) - - + + Trackerless (%1) Nirpelacak (%1) - - + %1 (%2) + openbittorrent.com (10) + %1 (%2) + + + + Error (%1) Galat (%1) - - + + Warning (%1) Peringatan (%1) - + Resume torrents Lanjutkan torrent - + Pause torrents Tangguhkan torrent - + Delete torrents Hapus torrent - - + + All (%1) this is for the tracker filter Semua (%1) - TrackerListWidget + TrackerList - - + + URL + URL + + + + Status + Status + + + + Received + + + + + Seeds + Bibit + + + + Peers + Rekan + + + + Downloaded + Terunduh + + + + Message + Pesan + + + + Working - Berjalan + Bekerja - + Disabled Nonaktif - + This torrent is private - Torrent ini pribadi + Torrent ini privat - + Updating... - Membarui... + Memperbarui... - + Not working - Tak berjalan + Tidak bekerja - + Not contacted yet - Belum terhubung + Belum dihubungi - - - - - - - N/A - T/A + + Tracker URL: + URL pelacak: - + Tracker editing - Pengubahan Pencari - - - - Tracker URL: - URL Pencari: + Penyuntingan pelacak - - + + Tracker editing failed - Pengubahan pencari gagal + Penyuntingan pelacak gagal - + The tracker URL entered is invalid. - URL Pencari yang dimasukkan tidak sah. + URL pelacak yang dimasukkan tidak valid. - + The tracker URL already exists. - URL pencari sudah ada. + URL pelacak sudah ada. - + Add a new tracker... - Tambahkan pencari baru... + Tambah pelacak baru... - - Remove tracker - Hapus pencari - - - + Copy tracker URL - Salin URL pencari + Salin URL pelacak - + Edit selected tracker URL - Edit URL pencari terpilih + Sunting URL pelacak yang dipilih - + Force reannounce to selected trackers - Paksa umumkan-ulang ke pencari terpilih + Paksa umumkan ulang ke pelacak yang dipilih - + Force reannounce to all trackers - Paksa umumkan-ulang ke semua pencari - - - - URL - URL - - - - Status - Status - - - - Received - Diterima - - - - Seeds - Benih - - - - Peers - Sejawat - - - - Downloaded - Diunduh - - - - Message - Pesan + Paksa umumkan ulang ke semua pelacak - - Column visibility - Keterlihatan Kolom + + Remove tracker + Buang pelacak - TrackerLoginDialog - - - - Tracker authentication - Otentifikasi Pencari - - - - Tracker: - Pencari: - + TrackersAdditionDlg - - Login - Masuk - - - - Username: - Nama pengguna: - - - - Password: - Kata sandi + + Trackers addition dialog + Dialog penambahan pelacak - - Log in - Masuk + + List of trackers to add (one per line): + Daftar pelacak untuk ditambahkan (satu per baris): - - - TrackersAdditionDialog - - - Trackers addition dialog - Dialog pencari tambahan + + + µTorrent compatible list URL: + Daftar URL yang kompatibel dengan µTorrent: - - List of trackers to add (one per line): - Daftar pencari yang ditambahkan (satu per baris): + + I/O Error + Galat I/O - - µTorrent compatible list URL: - Daftar URL kompatibel µTorrent: + + Error while trying to open the downloaded file. + Galat ketika mencoba membuka berkas yang diunduh. - + No change - Tiada perubahan + Tidak berubah - + No additional trackers were found. - Tiada pencari tambahan yang ditemukan. + Tidak ada pelacak tambahan yang ditemukan. - + Download error - Unduhan galat + Galat unduh - + The trackers list could not be downloaded, reason: %1 - Daftar pencari tidak dapat diunduh, penyebab: %1 + Daftar pelacak tidak bisa diunduh, alasan: %1 TransferListDelegate - + Downloading Mengunduh - + Downloading metadata used when loading a magnet link Mengunduh metadata - + Allocating qBittorrent is allocating the files on disk Mengalokasikan - + Paused Ditangguhkan - + Queued i.e. torrent is queued Diantrekan - + Seeding Torrent is complete and in upload-only mode - Pembibitan + Membibit - + Stalled Torrent is waiting for download to begin Terhenti - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] Mengunduh - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. - [F] Pembibitan + [F] Membibit - + Checking Torrent local data is being checked Memeriksa - + Queued for checking i.e. torrent is queued for hash checking Diantrekan untuk diperiksa - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Memeriksa data kelanjutan - + Completed Komplet - - Moving - Torrent local data are being moved/relocated - Berjalan - - - + Missing Files Berkas Hilang - - - Errored - torrent status, the torrent has an error - Galat - - - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - %1 (dibibit selama %2) - - - - %1 ago - e.g.: 1h 20m ago - %1 yang lalu - - - - TransferListFiltersWidget - - - Status - Status - - - - Categories - Kategori-kategori - - - - Tags - Tag - - - - Trackers - Pelacak - - - - TransferListModel - - - Name - i.e: torrent name - Nama - - - - Size - i.e: torrent size - Ukuran - - - - Done - % Done - Selesai - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Status - - - - Seeds - i.e. full sources (often untranslated) - Benih - - - - Peers - i.e. partial sources (often untranslated) - Sejawat - - - - Down Speed - i.e: Download speed - Cepat Und - - - - Up Speed - i.e: Upload speed - Cepat Ung - - - - Ratio - Share ratio - Rasio - - - - ETA - i.e: Estimated Time of Arrival / Time left - WPS - - - - Category - Kategori - - - - Tags - Tags - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - Ditambahkan pada - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - Selesai dalam - - - - Tracker - Pencari - - - - Down Limit - i.e: Download limit - Limit Und - - - - Up Limit - i.e: Upload limit - Limit Ung - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Terunduh - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Terunggah - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - Sesi Unduh - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - Sesi Unggah - - - - Remaining - Amount of data left to download (e.g. in MB) - Tersisa - - - - Time Active - Time (duration) the torrent is active (not paused) - Waktu Aktif - - - - Save path - Torrent save path - Jalur Simpan + + + Errored + torrent status, the torrent has an error + Galat - - Completed - Amount of data completed (e.g. in MB) - Selesai + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) + %1 (dibibit selama %2) - - Ratio Limit - Upload share ratio limit - Rasio Limit + + %1 ago + e.g.: 1h 20m ago + %1 yang lalu + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - Terakhir Terlihat Selesai + + Status + Status - - Last Activity - Time passed since a chunk was downloaded/uploaded - Aktivitas Terakhir + + Categories + Kategori-kategori - - Total Size - i.e. Size including unwanted data - Total Ukuran + + Trackers + Pelacak TransferListWidget - + Column visibility Keterlihatan kolom - + Choose save path Pilih jalur penyimpanan - + Torrent Download Speed Limiting Pembatasan Kecepatan Unduh Torrent - + Torrent Upload Speed Limiting Pembatasan Kecepatan Unggah Torrent - + Recheck confirmation Komfirmasi pemeriksaan ulang - + Are you sure you want to recheck the selected torrent(s)? Apakah Anda yakin ingin memeriksa ulang torrent yang dipilih? - + Rename Ubah nama - + New name: Nama baru: - + Resume Resume/start the torrent Lanjutkan - + Force Resume Force Resume/start the torrent Paksa Lanjutkan - + Pause Pause the torrent Tangguhkan - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Tentukan lokasi: memindahkan "%1", dari "%2" ke "%3" - - - - Add Tags - Tambah Tag - - - - Remove All Tags - Buang Semua Tag - - - - Remove all tags from selected torrents? - Buang semua tag dari torrent yang dipilih? + + New Category + Kategori Baru - - Comma-separated tags: - Koma-pemisah tag: + + Category: + Kategori: - - Invalid tag - Kesalahan tag + + Invalid category name + Nama kategori tidak valid - - Tag name: '%1' is invalid - Nama tag: '%1' tidak valid + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Nama kategori tidak boleh mengandung '\'. +Nama kategori tidak boleh diawali/diakhiri dengan '/'. +Nama kategori tidak boleh mengandung rangkaian '//'. - + Delete Delete the torrent Hapus - + Preview file... Pratinjau berkas... - + Limit share ratio... Batasi rasio berbagi... - + Limit upload rate... Batasi rasio unggah... - + Limit download rate... Batasi laju unduh... - + Open destination folder Buka folder tujuan - + Move up i.e. move up in the queue Pindahkan ke atas - + Move down i.e. Move down in the queue Pindahkan ke bawah - + Move to top i.e. Move to top of the queue Pindahkan ke puncak - + Move to bottom i.e. Move to bottom of the queue Pindahkan ke dasar - + Set location... Tetapkan lokasi... - - Force reannounce - Paksa umumkan ulang - - - + Copy name Salin nama - - Copy hash - Salin hash - - - + Download first and last pieces first Unduh bagian-bagian pertama dan akhir terlebih dahulu - + Automatic Torrent Management - Manajemen Torrent Otomatis + - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - Mode otomatis berarti aneka properti torrent (misal tempat penyimpanan) akan diatur dengan kategori terhubung. + Mode otomatis artinya properti torrent (mis jalur penyimpanan) akan ditentukan oleh kategori terkait - + Category Kategori - + New... New category... Baru .... - + Reset Reset category Setel ulang - - Tags - Tag - - - - Add... - Add / assign multiple tags... - Tambah... - - - - Remove All - Remove all tags - Buang Semua - - - + Priority Prioritas - + Force recheck Paksa periksa ulang - + Copy magnet link Salin tautan magnet - + Super seeding mode - Mode pembibitan super + Mode membibit super - + Rename... Ubah nama... - + Download in sequential order Unduh berurutan - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - Torrent Unggah/Unduh Limit Rasio + Pembatasan Rasio Unggah/Unduh Torrent - - Use global share limit - Gunakan limit bagi dunia + + Use global ratio limit + Gunakan batas rasio global - - - + + + buttonGroup - tombolGrup + buttonGroup + + + + Set no ratio limit + Tetapkan tanpa batas rasio + + + + Set ratio limit to + Tetapkan batas rasio ke + + + + WebApplication + + + Incorrect category name + + + + + WebUI + + + The Web UI is listening on port %1 + Web UI sedang mendengarkan port %1 - - Set no share limit - Atur tiada limit bagi + + Web UI Error - Unable to bind Web UI to port %1 + Galat Web UI - Tidak bisa mengaitkan Web UI ke port %1 + + + about - - Set share limit to - Atur limit bagi ke + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Klien BitTorrent tingkat lanjut yang diprogram menggunakan C++, berbasis toolkit Qt dan libtorrent-rasterbar. - - ratio - rasio + + Copyright %1 2006-2016 The qBittorrent project + Hak Cipta %1 2006-2016 Proyek qBittorrent - - minutes - menit + + Home Page: + Halaman Beranda: - - No share limit method selected - Tiada metode limit bagi terpilih + + Forum: + Forum: - - Please select a limit method first - Mohon pilih metode limit dahulu + + Bug Tracker: + Pelacak Kutu: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - Python terdeteksi, versi: %1 + + Add Peers + Tambah Rekan - - Python not detected - Python tak terdeteksi + + List of peers to add (one per line): + Daftar rekan untuk ditambahkan (satu per baris): + + + + Format: IPv4:port / [IPv6]:port + Format: IPv4:port / [IPv6]:port - WebApplication + authentication + + + + Tracker authentication + Otentikasi pelacak + + + + Tracker: + Pelacak: + + + + Login + Masuk + - - Unacceptable file type, only regular file is allowed. - Tipe berkas tidak diterima, hanya berkas reguler diterima. + + Username: + Nama pengguna: - - Symlinks inside alternative UI folder are forbidden. - Symlinks didalam alternatif folder UI dilarang. + + Password: + Sandi: - - Exceeded the maximum allowed file size (%1)! - Melebihi ukuran berkas maksimum (%1)! + + Log in + Masuk - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - WebUI: header asal & Target asal tidak sesuai! Sumber IP: '%1'. Header asal: '%2'. Target asal: '%3 + + Cancel + Batal + + + confirmDeletionDlg - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - WebUI: Pengarah header & Target asal tidak sesuai! Sumber IP: '%1'. Pengarah header: '%2'. Target asal: '%3' + + Deletion confirmation - qBittorrent + Konfirmasi penghapusan - qBittorrent - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - WebUI: : header Host tidak sah, port tidak sesuai. Permintaan asal IP: '%1'. Server port: '%2'. Diterima Host header: '%3' + + Remember choice + Ingat pilihan - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - WebUI: header Host tidak sah. Permintaan asal IP: '%1'. Diterima header Host: '%2' + + Also delete the files on the hard disk + Juga hapus berkas pada diska - WebUI + confirmShutdownDlg + + + Don't show again + Jangan pernah ditampilkan lagi + + + + createTorrentDialog + + + Cancel + Batal + + + + Torrent Creation Tool + Perkakas Pembuatan Torrent + + + + Torrent file creation + Pembuatan berkas torrent + + + + Add file + Tambah berkas + - - Web UI: HTTPS setup successful - Web UI: Pengaturan HTTPS sukses + + Add folder + Tambah folder - - Web UI: HTTPS setup failed, fallback to HTTP - Web UI: Pengaturan HTTPS gagal, kembali ke HTTP + + File or folder to add to the torrent: + Berkas atau folder untuk ditambahkan ke torrent: - - Web UI: Now listening on IP: %1, port: %2 - Web UI: Sekarang memperhatikan di IP: %1, port %2 + + Tracker URLs: + URL pelacak: + + + + Web seeds urls: + Url bibit web: + + + + Comment: + Komentar: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Anda dapat memisahkan tingkatan / pengelompokan pelacak dengan sebuah baris kosong. + + + + Piece size: + Ukuran bagian: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + Auto + + + + Private (won't be distributed on DHT network if enabled) + Privat (tidak akan disebarluaskan di jaringan DHT jika diaktifkan) - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Web UI: Tidak dapat mengikat IP: %1, port: %2. Penyebab: %3 + + Start seeding after creation + Mulai bibit setelah dibuat + + + + Ignore share ratio limits for this torrent + Abaikan batas rasio berbagi untuk torrent ini + + + + Create and save... + Buat dan simpan... + + + + Progress: + Kemajuan: + + + + downloadFromURL + + + Add torrent links + Tambah tautan torrent + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Satu per baris (Tautan HTTP, Magnet dan info hash didukung) + + + + Download + Unduh + + + + Cancel + Batal + + + + Download from urls + Unduh dari url + + + + No URL entered + Tidak ada URL dimasukkan + + + + Please type at least one URL. + Mohon ketik paling tidak satu URL. + + + + errorDialog + + + Crash info + Info tumbukan fsutils - + + + + + Downloads Unduhan @@ -9765,100 +8738,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + Python tidak terdeteksi + + + + Python version: %1 + Versi Python: %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1j %2m - + %1d %2h e.g: 2days 10hours %1h %2j - + Unknown Unknown (size) Tidak diketahui - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent akan mematikan komputer sekarang karena semua unduhan telah komplet. - + < 1m < 1 minute < 1m - + %1m e.g: 10minutes %1m + + + Working + Bekerja + + + + Updating... + Memperbarui... + + + + Not working + Tidak bekerja + + + + Not contacted yet + Belum dihubungi + preview - + Preview selection Pemilihan pratinjau - + The following files support previewing, please select one of them: Berkas ini mendukung pratinjau, mohon pilih salah satunya: + + + Preview + Pratinjau + + + + Cancel + Batal + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_is.ts qbittorrent-3.3.15/src/lang/qbittorrent_is.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_is.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_is.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,153 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - Um qBittorrent + Um qBittorrent - + About - Um + Um - + Author - Höfundur - - - - Current maintainer - Núverandi umsjónarmaður + Höfundur - - Greece - Grikkland - - - - + + Nationality: - - + + + Name: + Nafn: + + + + E-mail: - Tölvupóstur + Tölvupóstur - - - Name: - Nafn: + + Greece + Grikkland - - Original author - Upprunalegur höfundur + + Current maintainer + Núverandi umsjónarmaður - - France - Frakkland + + Original author + Upprunalegur höfundur - + Special Thanks - + Translators - - License - Leyfi - - - + Libraries - + qBittorrent was built with the following libraries: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - - - - - Forum: - - - - - Bug Tracker: - - - - - AboutDlg - - About qBittorrent - Um qBittorrent - - - About - Um - - - Author - Höfundur - - - Name: - Nafn: - - - E-mail: - Tölvupóstur - - - Greece - Grikkland - - - Current maintainer - Núverandi umsjónarmaður - - - Original author - Upprunalegur höfundur - - + France - Frakkland + Frakkland + License - Leyfi + Leyfi @@ -158,65 +90,67 @@ + Browse... - Skoða... + Skoða... + Set as default save path - Setja sem sjálfgefna vistunar slóð + Setja sem sjálfgefna vistunar slóð - + Never show again Aldrei sýna aftur - + Torrent settings Torrent stillingar - + Set as default category - + Category: - + Start torrent Setja í gang torrent - + Torrent information - + Skip hash check - + Size: Stærð: - + Hash: - + Comment: Umsögn - + Date: Dagsetning: @@ -241,121 +175,89 @@ - - Remember last used save path - - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - + Do not delete .torrent file - - Create subfolder - - - - - Download in sequential order - - - - - Download first and last pieces first - - - - + Normal Venjulegt - + High Hár - + Maximum Hámark - + Do not download Ekki sækja - - - + + + I/O Error I/O Villa - + Invalid torrent + + + + Already in download list - Þegar á niðurhal lista - - - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - + Þegar á niðurhal lista - + Not Available This comment is unavailable Ekki í boði - + Not Available This date is unavailable Ekki í boði - + Not available Ekki í boði - + Invalid magnet link - + The torrent file '%1' does not exist. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -363,127 +265,128 @@ + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + + + + + Torrent is already in download list. Trackers were merged. + + + + + Cannot add torrent - Get ekki bætt við torrent + Get ekki bætt við torrent + + + + Cannot add this torrent. Perhaps it is already in adding state. + - + This magnet link was not recognized - + + Magnet link is already in download list. Trackers were merged. + + + + + Cannot add this torrent. Perhaps it is already in adding. + + + + Magnet link - + Retrieving metadata... - + Not Available This size is unavailable. Ekki í boði - + Free space on disk: %1 - + + Choose save path Veldu vista slóðina + Rename the file - Endurnefna skrána + Endurnefna skrána - + New name: Nýtt nafn: + + The file could not be renamed - Skráin gat ekki verið endurnefnd - - - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - + Skráin gat ekki verið endurnefnd - - Torrent is already queued for processing. + + This file name contains forbidden characters, please choose a different one. - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - - - - - Magnet link is already queued for processing. - - - - - + + This name is already in use in this folder. Please use a different name. Þetta nafn er þegar í notkun í þessari möppu. Vinsamlegast notaðu annað nafn. - + The folder could not be renamed Þessi mappa getur ekki verið endurnefnd - + Rename... Endurnefna - + Priority Forgangur - + Invalid metadata - + Parsing metadata... - + Metadata retrieval complete - + Download Error Niðurhal villa @@ -491,317 +394,194 @@ AdvancedSettings - + + Disk write cache size + + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] - + Outgoing ports (Max) [0: Disabled] - + Recheck torrents on completion - + Transfer list refresh interval - + ms milliseconds ms - + Setting Stillingar - + Value Value set for this setting Gildi - - - (disabled) - - - - + (auto) (sjálfgefið) - - min - minutes - - - - + All addresses - + qBittorrent Section - - + + Open documentation - + libtorrent Section - - Asynchronous I/O threads - - - - - Disk cache - - - - + s seconds s - + Disk cache expiry interval - + Enable OS cache - - Guided read cache - - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - - - - - - KiB - - - - - Send buffer watermark - - - - - Send buffer low watermark - - - - - Send buffer watermark factor - - - + m minutes - m - - - - Prefer TCP - - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address - + m - + Resolve peer countries (GeoIP) - + Resolve peer host names - + Strict super seeding - + Network Interface (requires restart) - + Optional IP Address to bind to (requires restart) - + Listen on IPv6 address (requires restart) - + Display notifications - + Display notifications for added torrents - + Download tracker's favicon - - Save path history length - - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - - - - - Round-robin - - - - - Fastest upload - - - - - Anti-leech - - - - - Upload choking algorithm - - - - + Confirm torrent recheck - - Confirm removal of all tags + + Always announce to all trackers - - Always announce to all trackers in a tier - - - - - Always announce to all tiers - - - - + Any interface i.e. Any network interface - + Save resume data interval How often the fastresume file is saved. - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - - - - + Maximum number of half-open connections [0: Unlimited] - + IP Address to report to trackers (requires restart) - + Enable embedded tracker - + Embedded tracker port - + Check for software updates Athuga með hugbúnaðar uppfærslu - + Use system icon theme @@ -809,120 +589,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 byrjað - + Torrent: %1, running external program, command: %2 - - Torrent name: %1 - Torrent nafn: %1 - - - - Torrent size: %1 - Torrent stærð: %1 - - - - Save path: %1 - - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - - - - - Thank you for using qBittorrent. + + Torrent: %1, run external program command too long (length > %2), execution failed. - - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' hefur lokið niðurhali - - - + Torrent: %1, sending mail notification - + Information Upplýsingar - - To control qBittorrent, access the Web UI at %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 - + The Web UI administrator user name is: %1 - + The Web UI administrator password is still the default one: %1 - + This is a security risk, please consider changing your password from program preferences. - + Saving torrent progress... Vista torrent framfarir... - - - Portable mode and explicit profile directory options are mutually exclusive - - - - - Portable mode implies relative fastresume - - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Vista í: @@ -932,827 +653,660 @@ RSS Niðurhal + Enable Automated RSS Downloader - Virkja sjálfgefna RSS niðurhal - - - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - + Virkja sjálfgefna RSS niðurhal - + Download Rules - + Rule Definition - + Use Regular Expressions - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - + + Must Contain: + Verður að innihalda: - - Use Smart Episode Filter - - - - - Must Contain: - Verður að innihalda: - - - + Must Not Contain: Má ekki innihalda: - + Episode Filter: - + Assign Category: - + Save to a Different Directory - + Ignore Subsequent Matches for (0 to Disable) ... X days - + Disabled - + days dagar - + Add Paused: - + Use global settings - + Always Alltaf - + Never Aldrei - + Apply Rule to Feeds: - + Matching RSS Articles - + &Import... &innflutningur... - + &Export... &útflutningur... - + Matches articles based on episode filter. - + Example: Dæmi: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match - + Episode filter rules: - + Season number is a mandatory non-zero value - + Filter must end with semicolon - + Three range types for episodes are supported: - + Single number: <b>1x25;</b> matches episode 25 of season one - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one - + Episode number is a mandatory positive value - - Rules - - - - - Rules (legacy) - - - - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - + Last Match: %1 days ago - + Last Match: Unknown - + New rule name - + Please type the name of the new download rule. - - + + Rule name conflict - - + + A rule with this name already exists, please choose another name. - + Are you sure you want to remove the download rule named '%1'? - + Are you sure you want to remove the selected download rules? - + Rule deletion confirmation - + Destination directory - + Invalid action - Ógild aðgerð + Ógild aðgerð - + The list is empty, there is nothing to export. - - Export RSS rules + + Where would you like to save the list? - - + + Rules list (*.rssrules) + + + + I/O Error - I/O Villa + I/O Villa - - Failed to create the destination file. Reason: %1 + + Failed to create the destination file - - Import RSS rules + + Please point to the RSS download rules file - - Failed to open the file. Reason: %1 + + Rules list - + Import Error - innflutnings Villa + innflutnings Villa - - Failed to import the selected rules file. Reason: %1 + + Failed to import the selected rules file - + Add new rule... - + Delete rule - + Rename rule... - + Delete selected rules - - Clear downloaded episodes... - - - - + Rule renaming - + Please type the new rule name - - Clear downloaded episodes - - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? + + Regex mode: use Perl-like regular expressions - - Regex mode: use Perl-compatible regular expressions - - - - - - Position %1: %2 - - - - + Wildcard mode: you can use - + ? to match any single character - + * to match zero or more of any characters - + Whitespaces count as AND operators (all words, any order) - + | is used as OR operator - + If word order is important use * instead of whitespace. - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - + will match all articles. - + will exclude all articles. - BanListOptions - - Delete - Eyða - - - - BanListOptionsDialog - - - List of banned IP addresses - - - - - Ban IP - - - - - Delete - Eyða - - - - - Warning - - - - - The entered IP address is invalid. - - + BitTorrent::Session - - The entered IP is already banned. + + Restart is required to toggle PeX support - - - BitTorrent::Session - - Restart is required to toggle PeX support + + Embedded Tracker [ON] - - Could not get GUID of configured network interface. Binding to IP %1 + + Failed to start the embedded tracker! - - Embedded Tracker [ON] + + Embedded Tracker [OFF] - - Failed to start the embedded tracker! + + '%1' reached the maximum ratio you set. Removing... - - Embedded Tracker [OFF] + + '%1' reached the maximum ratio you set. Pausing... - + System network status changed to %1 e.g: System network status changed to ONLINE - + ONLINE - + OFFLINE - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. - - + Encryption support [%1] - - + FORCED - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - - - - - + Anonymous mode [%1] - + Unable to decode '%1' torrent file. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' - + Queue positions were corrected in %1 resume files - + Couldn't save '%1.torrent' Gat ekki vistað '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - - - - + because %1 is disabled. this peer was blocked because uTP is disabled. vegna %1 er óvirk. - + because %1 is disabled. this peer was blocked because TCP is disabled. vegna %1 er óvirk. - + URL seed lookup failed for URL: '%1', message: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Sæki '%1', vinsamlegast bíðið... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 - + The network interface defined is invalid: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 - - Peer ID: - - - - - HTTP User-Agent is '%1' - - - - - + DHT support [%1] - - - - - - - - - + + + + ON - - - - - - - - - + + + + OFF - - + Local Peer Discovery support [%1] - - PeX support [%1] - - - - - '%1' reached the maximum ratio you set. Removed. - - - - - '%1' reached the maximum ratio you set. Paused. - - - - - '%1' reached the maximum seeding time you set. Removed. - - - - - '%1' reached the maximum seeding time you set. Paused. - - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface - + Tracker '%1' was added to torrent '%2' - + Tracker '%1' was deleted from torrent '%2' - + URL seed '%1' was added to torrent '%2' - + URL seed '%1' was removed from torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Error: Failed to parse the provided IP filter. - - '%1' restored. - 'torrent name' restored. - - - - + Couldn't add torrent. Reason: %1 Gat ekki bætt torrent. Ástæða: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + + + + '%1' added to download list. 'torrent name' was added to download list. '%1' bætt við niðurhals lista. - + An I/O error occurred, '%1' paused. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 - + due to IP filter. this peer was blocked due to ip filter. - + due to port filter. this peer was blocked due to port filter. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. - + because it has a low port. this peer was blocked because it has a low port. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 - + External IP: %1 e.g. External IP: 192.168.0.1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - Gat ekki fært torrent: '%1'. Ástæða: %2 + Gat ekki fært torrent: '%1'. Ástæða: %2 - + File sizes mismatch for torrent '%1', pausing it. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... @@ -1760,17 +1314,17 @@ CategoryFilterModel - + Categories - + All Allt - + Uncategorized @@ -1789,34 +1343,67 @@ - Edit category... - - - - Remove category - + Remove unused categories - + Resume torrents - + Pause torrents - + Delete torrents Eyða torrents + + + New Category + + + + + Category: + + + + + Invalid category name + + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + CookiesDialog @@ -1855,82 +1442,34 @@ - DeletionConfirmationDialog + DeletionConfirmationDlg - - Deletion confirmation - - - - - Remember choice - - - - - Also delete the files on the hard disk - Einnig eyða skrám af harðadiski - - - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - Niðurhal - - - - No URL entered - - - - - Please type at least one URL. - - - - DownloadedPiecesBar - + White: Missing pieces - + Green: Partial pieces - + Blue: Completed pieces @@ -1938,634 +1477,539 @@ ExecutionLog + General - Almennur - - - <font color='red'>%1</font> was banned - x.y.z.w was banned - <font color='red'>%1</font> var bönnuð - - - - ExecutionLogWidget - - - General - Almennur + Almennur - + Blocked IPs - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> was banned x.y.z.w was banned - <font color='red'>%1</font> var bönnuð + <font color='red'>%1</font> var bönnuð FeedListWidget - + RSS feeds - - - Unread (%1) - - - + Unread - Ólesið + Ólesið FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. + + An error occured while trying to open the log file. Logging to file is disabled. - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - - - - - &Browse... - Launch file dialog button text (full) - - - - - Choose a file - Caption for file open/save dialog - - + FilterParserThread - - Choose a folder - Caption for directory open dialog + + + + I/O Error: Could not open ip filter file in read mode. - - Any file + + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. - FilterParserThread + GeoIPDatabase - - - - I/O Error: Could not open IP filter file in read mode. + + + Unsupported database file size. - - - - IP filter line %1 is malformed. + + Metadata error: '%1' entry not found. - - - IP filter line %1 is malformed. Start IP of the range is malformed. + + Metadata error: '%1' entry has invalid type. - - - IP filter line %1 is malformed. End IP of the range is malformed. + + Unsupported database version: %1.%2 - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! + + Unsupported IP version: %1 - - - IP filter exception thrown for line %1. Exception is: %2 + + Unsupported record size: %1 - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. + + Invalid database type: %1 - - - - - - - - Parsing Error: The filter file is not a valid PeerGuardian P2B file. + + Database corrupted: no data section found. - GeoIPDatabase + HttpServer - - - Unsupported database file size. - - - - - Metadata error: '%1' entry not found. - - - - - Metadata error: '%1' entry has invalid type. - - - - - Unsupported database version: %1.%2 - - - - - Unsupported IP version: %1 - - - - - Unsupported record size: %1 - - - - - Invalid database type: %1 - - - - - Database corrupted: no data section found. - - - - - Http::Connection - - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - - - - - Bad Http request, closing socket. IP: %s - - - - - HttpServer - - File - Skrá + + File + Skrá + Edit - Breyta + Breyta + Help - Hjálp + Hjálp - + Exit qBittorrent Hætta qBittorrent - + Only one link per line Aðeins eins vefslóð í hverja línu + Download - Niðurhal + Niðurhal - + Global upload rate limit must be greater than 0 or disabled. - + Global download rate limit must be greater than 0 or disabled. - + Alternative upload rate limit must be greater than 0 or disabled. - + Alternative download rate limit must be greater than 0 or disabled. - + Maximum active downloads must be greater than -1. - + Maximum active uploads must be greater than -1. - + Maximum active torrents must be greater than -1. - + Maximum number of connections limit must be greater than 0 or disabled. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. - + Unable to save program preferences, qBittorrent is probably unreachable. - - IRC: #qbittorrent on Freenode - - - - - Invalid category name: -Please do not use any special characters in the category name. - - - - - Unknown - Óþekkt - - - - Hard Disk - - - - - Share ratio limit must be between 0 and 9998. - - - - - Seeding time limit must be between 0 and 525600 minutes. - - - + Language - Tungumál + Tungumál - + The port used for incoming connections must be between 1 and 65535. - + The port used for the Web UI must be between 1 and 65535. - + Unable to log in, qBittorrent is probably unreachable. - + Invalid Username or Password. Rangt notandanafn eða lykilorð. - - Username - - - - + Password Lykilorð - + Login Skrá inn - + + Upload Failed! + + + + Original authors Upprunalegir höfundar + Upload limit: - Upphlöðun takmörk: + Upphlöðun takmörk: + Download limit: - Niðurhals takmörk: + Niðurhals takmörk: - + Apply Virkja - + Add Bæta - - Set location + + Category: - - Limit upload rate + + Upload Torrents + Upload torrent files to qBittorent using WebUI + + All + Allt + + + + Downloading + Sæki + + - Limit download rate + Seeding - Rename torrent - + Completed + Lokið - Unable to create category + Resumed - - Upload Torrents - Upload torrent files to qBittorent using WebUI + + Paused - All - Allt - - - Downloading - Sæki + + Active + - Completed - Lokið + + Inactive + - + Save files to location: - + Cookie: - + Type folder here - + + Run an external program on torrent completion + + + + + Enable bandwidth management (uTP) + + + + + Apply rate limit to uTP connections + + + + + Alternative Global Rate Limits + + + + More information Meiri upplýsingar - + Information about certificates - + Save Files to Vista skrá til + + Watch Folder + + + + Default Folder - Sjálfgefin mappa + Sjálfgefin mappa + from from time1 to time2 - frá + frá + to from time1 to time2 - til + til - + Other... Save Files to: Watch Folder / Default Folder / Other... Annað... + Every day Schedule the use of alternative rate limits on ... - Daglega + Daglega + Week days Schedule the use of alternative rate limits on ... - Virkir dagar + Virkir dagar + Week ends Schedule the use of alternative rate limits on ... - Helgar + Helgar - + Monday Schedule the use of alternative rate limits on ... Mánudagur - + Tuesday Schedule the use of alternative rate limits on ... Þriðjudagur - + Wednesday Schedule the use of alternative rate limits on ... Miðvikudagur - + Thursday Schedule the use of alternative rate limits on ... Fimmtudagur - + Friday Schedule the use of alternative rate limits on ... Föstudagur - + Saturday Schedule the use of alternative rate limits on ... Laugardagur - + Sunday Schedule the use of alternative rate limits on ... Sunnudagur + Downloaded Is the file downloaded or not? - Sótt + Sótt - + Logout Skrá út - + + Download from URLs + + + + Download Torrents from their URLs or Magnet links - + Upload local torrent - + Are you sure you want to delete the selected torrents from the transfer list? - + Save Vista - + qBittorrent client is not reachable - Torrent name - Torrent nafn - - - - qBittorrent has been shutdown. - qBittorrent hefur verið lokað. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets + + HTTP Server - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: - - Add subnet + + Torrent path - - Delete - Eyða - - - - Error - Villa + + Torrent name + Torrent nafn - - The entered subnet is invalid. - + + qBittorrent has been shutdown. + qBittorrent hefur verið lokað. LineEdit + Clear the text - Hreinsa texta + Hreinsa texta LogListWidget - + Copy Afrita - + Clear Hreinsa @@ -2598,555 +2042,491 @@ - + &View &Sýn - + &Options... &Valkostir... - + &Resume - + Torrent &Creator - + Set Upload Limit... - + Set Download Limit... - + Set Global Download Limit... - + Set Global Upload Limit... - + Minimum Priority Lágmarks Forgangur - + Top Priority Hámarks forgang - + Decrease Priority Minnka Forgang - + Increase Priority Auka Forgang - - + + Alternative Speed Limits - + &Top Toolbar - + Display Top Toolbar - - Status &Bar - - - - + S&peed in Title Bar - + Show Transfer Speed in Title Bar - + &RSS Reader - + Search &Engine Leitar &vél - + L&ock qBittorrent - + Do&nate! - - Close Window - - - - + R&esume All - + Manage Cookies... - + Manage stored network cookies - + Normal Messages - + Information Messages - + Warning Messages - + Critical Messages - + &Log &Leiðarbók - + &Exit qBittorrent &Hætta qBittorrent - + &Suspend System - + &Hibernate System - + S&hutdown System - + &Disabled - + &Statistics &Tölfræði - + Check for Updates Athuga með uppfærslur - + Check for Program Updates - + &About &Um - + &Pause - + &Delete &Eyða - + P&ause All - + &Add Torrent File... - + Open Opna - + E&xit H&ætta - + Open URL Opna URL - + &Documentation - + Lock Læsa - - - + + + Show Sýna - + Check for program updates - + Add Torrent &Link... - + If you like qBittorrent, please donate! - - + Execution Log - + Clear the password - + Filter torrent list... - + &Set Password - - Preferences - - - - + &Clear Password - + Transfers - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? - + Icons Only - + Text Only - + Text Alongside Icons - + Text Under Icons - + Follow System Style - - - + + + UI lock password - - - + + + Please type the UI lock password: - + The password should contain at least 3 characters - + Password update - + The UI lock password has been successfully updated - + Are you sure you want to clear the password? - - Use regular expressions - - - - + Search Leita - + Transfers (%1) - + Error Villa - + Failed to add torrent: %1 - + Torrent added - + '%1' was added. e.g: xxx.avi was added. - + Download completion - + I/O Error i.e: Input/Output Error I/O Villa - + Recursive download confirmation - + Yes - + No Nei - + Never Aldrei - + Global Upload Speed Limit - + Global Download Speed Limit - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - - - - - Are you sure you want to quit qBittorrent? - - - - + &No &Nei - + &Yes &Já - + &Always Yes &Alltaf já - - %1/s - s is a shorthand for seconds - - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - + qBittorrent Update Available qBittorrent uppfærsla í boði + A new version is available. Do you want to download %1? - Ný útgáfa er í boði. + Ný útgáfa er í boði. Viltu sækja %1? - + Already Using the Latest qBittorrent Version - + Undetermined Python version - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -3154,155 +2534,150 @@ - + The torrent '%1' contains torrent files, do you want to proceed with their download? - + Couldn't download file at URL '%1', reason: %2. Gat ekki sótt torrent skrá af URL '%1', ástæða: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - - + + Couldn't determine your Python version (%1). Search engine disabled. + + + + + Missing Python Interpreter - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? - + Python is required to use the search engine but it does not seem to be installed. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. - + &Check for Updates &Athuga með uppfærslur - + Checking for Updates... Athuga með uppfærslur... - + Already checking for program updates in the background - + Python found in '%1' Python fannst í '%1' - + Download error Niðurhal villa - + Python setup could not be downloaded, reason: %1. Please install it manually. - - + + Invalid password - - - + + RSS (%1) RSS (%1) - + URL download error - + The password is invalid - - + + DL speed: %1 e.g: Download speed: 10 KiB/s - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [D: %1, U: %2] qBittorrent %3 - + Hide Fela - + Exiting qBittorrent Hætti qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + + + + Open Torrent Files - + Torrent Files - + Options were saved successfully. @@ -3310,52 +2685,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. - + Dynamic DNS error: hostname supplied does not exist under specified account. - + Dynamic DNS error: Invalid username/password. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. - + Dynamic DNS error: supplied domain name is invalid. - + Dynamic DNS error: supplied username is too short. - + Dynamic DNS error: supplied password is too short. @@ -3363,1413 +2738,1303 @@ Net::DownloadHandler - + I/O Error I/O Villa - + The file size is %1. It exceeds the download limit of %2. - + Unexpected redirect to magnet URI. - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - Óþekkt villa - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. - - + + Couldn't load GeoIP database. Reason: %1 - + Venezuela, Bolivarian Republic of Venezuela, Bolivarian lýðveldið - + Viet Nam Víetnam - - + + N/A - + Andorra Andorra - + United Arab Emirates Sameinuðu arabísku furstadæmin - + Afghanistan Afganistan - + Antigua and Barbuda Antígva og Barbúda - + Anguilla - + Albania Albanía - + Armenia Armenía - + Angola Angóla - + Antarctica Suðurskautið - + Argentina Argentína - + American Samoa - + Austria Austurríki - + Australia Ástralía - + Aruba - + Azerbaijan Aserbaídsjan - + Bosnia and Herzegovina Bosnía og Hersegóvína - + Barbados Barbados - + Bangladesh Bangladess - + Belgium Belgía - + Burkina Faso - + Bulgaria Búlgaría - + Bahrain - + Burundi - + Benin - + Bermuda - + Brunei Darussalam - + Brazil Brasilía - + Bahamas Bahamaeyjar - + Bhutan - + Bouvet Island - + Botswana - + Belarus - + Belize - + Canada - + Cocos (Keeling) Islands - + Congo, The Democratic Republic of the - + Central African Republic - + Congo - + Switzerland - + Cook Islands - + Chile - + Cameroon - + China Kína - + Colombia - + Costa Rica - + Cuba - + Cape Verde - + Curacao - + Christmas Island - + Cyprus Kýpur - + Czech Republic Tékkland - + Germany Þýskaland - + Djibouti - + Denmark Danmörk - + Dominica - + Dominican Republic Dóminíska lýðveldið - + Algeria - + Ecuador - + Estonia - + Egypt Egyptaland - + Western Sahara - + Eritrea - + Spain Spánn - + Ethiopia - + Finland - + Fiji - + Falkland Islands (Malvinas) - + Micronesia, Federated States of - + Faroe Islands Færeyjar - + France Frakkland - + Gabon - + United Kingdom Bretland - + Grenada - + Georgia - + French Guiana - + Ghana - + Gibraltar - + Greenland Grænland - + Gambia - + Guinea - + Guadeloupe - + Equatorial Guinea - + Greece Grikkland - + South Georgia and the South Sandwich Islands - + Guatemala - + Guam - + Guinea-Bissau - + Guyana - + Hong Kong Hong Kong - + Heard Island and McDonald Islands - + Honduras - + Croatia - + Haiti - + Hungary Ungverjaland - + Indonesia - + Ireland Írland - + Israel - + India - + British Indian Ocean Territory - + Iraq - + Iran, Islamic Republic of - + Iceland Ísland - + Italy Ítalía - + Jamaica - + Jordan - + Japan - + Kenya - + Kyrgyzstan - + Cambodia - + Kiribati - + Comoros - + Saint Kitts and Nevis - + Korea, Democratic People's Republic of - + Korea, Republic of - + Kuwait - + Cayman Islands - + Kazakhstan - + Lao People's Democratic Republic - + Lebanon - + Saint Lucia - + Liechtenstein - + Sri Lanka - + Liberia - + Lesotho - + Lithuania - + Luxembourg - + Latvia - + Morocco - + Monaco - + Moldova, Republic of - + Madagascar - + Marshall Islands - + Mali - + Myanmar - + Mongolia - + Northern Mariana Islands - + Martinique - + Mauritania - + Montserrat - + Malta - + Mauritius - + Maldives - + Malawi - + Mexico - + Malaysia - + Mozambique - + Namibia - + New Caledonia - + Niger - + Norfolk Island - + Nigeria - + Nicaragua - + Netherlands Holland - + Norway Noregur - + Nepal - + Nauru - + Niue - + New Zealand Nýja Sjáland - + Oman - + Panama - + Peru - + French Polynesia - + Papua New Guinea - + Philippines - + Pakistan - + Poland - + Saint Pierre and Miquelon - + Puerto Rico - + Portugal - + Palau - + Paraguay - + Qatar - + Reunion - + Romania - + Russian Federation Rússland - + Rwanda - + Saudi Arabia - + Solomon Islands - + Seychelles - + Sudan - + Sweden Svíþjóð - + Singapore - + Slovenia - + Svalbard and Jan Mayen Svalbarði og Jan Mayen - + Slovakia - + Sierra Leone - + San Marino - + Senegal - + Somalia - + Suriname - + Sao Tome and Principe - + El Salvador - + Syrian Arab Republic - + Swaziland - + Turks and Caicos Islands - + Chad - + French Southern Territories - + Togo - + Thailand Tæland - + Tajikistan - + Tokelau - + Turkmenistan - + Tunisia - + Tonga - - Could not decompress GeoIP database file. - - - - + Timor-Leste - + Bolivia, Plurinational State of - + Bonaire, Sint Eustatius and Saba - + Cote d'Ivoire - + Libya - + Saint Martin (French part) - + Macedonia, The Former Yugoslav Republic of - + Macao - + Pitcairn - + Palestine, State of - + Saint Helena, Ascension and Tristan da Cunha - + South Sudan - + Sint Maarten (Dutch part) - + Turkey - + Trinidad and Tobago - + Tuvalu - + Taiwan - + Tanzania, United Republic of - + Ukraine - + Uganda - + United States Minor Outlying Islands - + United States Bandaríkin - + Uruguay - + Uzbekistan - + Holy See (Vatican City State) - + Saint Vincent and the Grenadines - + Virgin Islands, British - + Virgin Islands, U.S. - + Vanuatu - + Wallis and Futuna - + Samoa - + Yemen - + Mayotte - + Serbia - + South Africa Suður-Afríka - + Zambia - + Montenegro - + Zimbabwe - + Aland Islands - + Guernsey - + Isle of Man - + Jersey - + Saint Barthelemy - + + Could not uncompress GeoIP database file. + + + + Couldn't save downloaded GeoIP database file. - + Successfully updated GeoIP database. - + Couldn't download GeoIP database file. Reason: %1 @@ -4777,12 +4042,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] - + UPnP / NAT-PMP support [OFF] @@ -4790,7 +4055,7 @@ Net::Smtp - + Email Notification Error: @@ -4798,1277 +4063,1077 @@ OptionsDialog - + Options - + Behavior - + Downloads - + Connection Tenging - + Speed Hraði - + BitTorrent - - RSS - - - - + Web UI - + Advanced - + Language Tungumál - + User Interface Language: - + (Requires restart) - + Transfer List - + Confirm when deleting torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. - + Hide zero and infinity values - + Always Alltaf - + Paused torrents only - + Action on double-click - + Downloading torrents: - - + + Start / Stop Torrent - - + + Open destination folder - - + + No action - + Completed torrents: - + Desktop - + Start qBittorrent on Windows start up - + Show splash screen on start up - + Start qBittorrent minimized - + Confirmation on exit when torrents are active - + Confirmation on auto-exit when downloads finish - - KiB - - - - - Email notification &upon download completion - - - - - Run e&xternal program on torrent completion - - - - - IP Fi&ltering - - - - - Schedule &the use of alternative rate limits - - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - - - - &Torrent Queueing - - - - - Seed torrents until their seeding time reaches - - - - - A&utomatically add these trackers to new downloads: - - - - - RSS Reader - - - - - Enable fetching RSS feeds - - - - - Feeds refresh interval: - - - - - Maximum number of articles per feed: - - - - - - min - minutes - - - - - RSS Torrent Auto Downloader - - - - - Enable auto downloading of RSS torrents - - - - - Edit auto downloading rules... + + Show qBittorrent in notification area - - Web User Interface (Remote control) - - - - - IP address: - - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - - - - - Server domains: - - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - - - - - &Use HTTPS instead of HTTP - - - - - Bypass authentication for clients on localhost - - - - - Bypass authentication for clients in whitelisted IP subnets - - - - - IP subnet whitelist... - - - - - Upda&te my dynamic domain name - - - - + Minimize qBittorrent to notification area - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. - + Tray icon style: - + Normal Venjulegt - + Monochrome (Dark theme) - + Monochrome (Light theme) - + File association - + Use qBittorrent for .torrent files - + Use qBittorrent for magnet links - + Power Management - + + Inhibit system sleep when torrents are active + + + + + Log file + + + + Save path: - + Backup the log file after: - + + MB + + + + Delete backup logs older than: - + days Delete backup logs older than 10 months - + months Delete backup logs older than 10 months - + years Delete backup logs older than 10 years - + When adding a torrent - + + Display torrent content and some options + + + + Bring torrent dialog to the front - + Do not start the download automatically The torrent will be added to download list in pause state - + Should the .torrent file be deleted after adding it - + + Delete .torrent files afterwards + + + + Also delete .torrent files whose addition was cancelled - + Also when addition is cancelled - + Warning! Data loss possible! - + Saving Management - + Default Torrent Management Mode: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - + Manual - + Automatic - + When Torrent Category changed: - + Relocate torrent - + Switch torrent to Manual Mode - + When Default Save Path changed: - - + + Relocate affected torrents - - + + Switch affected torrents to Manual Mode - + When Category changed: - + Use Subcategories - + Default Save Path: - + Keep incomplete torrents in: - + Copy .torrent files to: - - Show &qBittorrent in notification area + + Copy .torrent files for finished downloads to: - - &Log file + + Pre-allocate disk space for all files - - Display &torrent content and some options + + Append .!qB extension to incomplete files - - Create subfolder for torrents with multiple files + + Automatically add torrents from: - - De&lete .torrent files afterwards + + Add entry - - Copy .torrent files for finished downloads to: + + Remove entry - - Pre-allocate disk space for all files + + Email notification upon download completion - - Inhibit system sleep when torrents are downloading + + Destination email: - - Inhibit system sleep when torrents are seeding + + SMTP server: - - Append .!qB extension to incomplete files + + This server requires a secure connection (SSL) - - Enable recursive download dialog + + + + Authentication - - Automatically add torrents from: - + + + + + Username: + Notandanafn: - - Add entry - - - - - Remove entry - - - - - SMTP server: - - - - - This server requires a secure connection (SSL) - - - - - - Authentication - - - - - - - - Username: - Notandanafn: - - - - - - + + + + Password: Lykilorð: - - Enabled protocol: - - - - - TCP and μTP + + Run external program on torrent completion - + Listening Port - + Port used for incoming connections: - + Random - + Use UPnP / NAT-PMP port forwarding from my router - + Use different port on each startup - + Connections Limits - + Maximum number of connections per torrent: - + Global maximum number of connections: - + Maximum number of upload slots per torrent: - + Global maximum number of upload slots: - + Proxy Server - + Type: - + (None) - + SOCKS4 - + SOCKS5 - + HTTP - + Host: - - + + Port: - + Otherwise, the proxy server is only used for tracker connections - + Use proxy for peer connections - + Disable connections not supported by proxies - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - + Use proxy only for torrents - - A&uthentication + + Info: The password is saved unencrypted - - Info: The password is saved unencrypted + + IP Filtering - + Filter path (.dat, .p2p, .p2b): - + Reload the filter - - Manually banned IP addresses... - - - - + Apply to trackers - + Global Rate Limits - - - - - - - KiB/s - - - - - + + Upload: + + + + KiB/s - KiB/s + KiB/s - - + + Download: - + Alternative Rate Limits - - + + Schedule the use of alternative rate limits + + + + From: from (time1 to time2) - - + To: time1 to time2 - + When: - + Every day Daglega - + Weekdays - + Weekends - + Rate Limits Settings - + Apply rate limit to peers on LAN - + Apply rate limit to transport overhead - - + + + Enable µTP protocol + + + + Apply rate limit to µTP protocol - + Privacy - + Enable DHT (decentralized network) to find more peers - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers - + Look for peers on your local network - + Enable Local Peer Discovery to find more peers - + Encryption mode: - + Prefer encryption - + Require encryption - + Disable encryption - + Enable when using a proxy or a VPN connection - + Enable anonymous mode - - Maximum active downloads: - - - - - Maximum active uploads: - - - - - Maximum active torrents: + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - Do not count slow torrents in these limits + + Torrent Queueing - - Upload rate threshold: + + Maximum active downloads: - - Download rate threshold: + + Maximum active uploads: - - sec - seconds + + Maximum active torrents: - - Torrent inactivity timer: + + Do not count slow torrents in these limits - + Share Ratio Limiting - + Seed torrents until their ratio reaches - + then - + Pause them - + Remove them - - RSS Smart Episode Filters + + Automatically add these trackers to new downloads: - - Use UPnP / NAT-PMP to forward the port from my router + + Enable Web User Interface (Remote control) - - Certificate: + + Use UPnP / NAT-PMP to forward the port from my router - - Import SSL Certificate + + Use HTTPS instead of HTTP - - Key: + + Certificate: - - Import SSL Key + + Import SSL Certificate - - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> + + Key: - - Use alternative Web UI + + Import SSL Key - - Files location: + + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - - Enable clickjacking protection + + Bypass authentication for localhost - - Enable Cross-Site Request Forgery (CSRF) protection + + Update my dynamic domain name - + Service: - + Register - + Domain name: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): - + %N: Torrent name - + %L: Category - - %G: Tags (seperated by comma) - - - - + %F: Content path (same as root path for multifile torrent) - + %R: Root path (first torrent subdirectory path) - + %D: Save path - + %C: Number of files - + %Z: Torrent size (bytes) - + %T: Current tracker - + %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor - + Folder is already being monitored: - + Folder does not exist: - + Folder is not readable: - + Adding entry failed - - - - + + Choose export directory - - - + + + + + + Choose a save directory - + Choose an IP filter file - + All supported filters - + SSL Certificate - + + SSL Key + + + + Parsing error - + Failed to parse the provided IP filter - + Successfully refreshed - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Invalid key - + This is not a valid SSL key. - + Invalid certificate - - Preferences - - - - - Import SSL certificate - - - - + This is not a valid SSL certificate. - - Import SSL key - - - - - SSL key - - - - + Time Error - + The start time and the end time can't be the same. - - + + Length Error - + The Web UI username must be at least 3 characters long. - + The Web UI password must be at least 6 characters long. @@ -6076,72 +5141,72 @@ PeerInfo - - Interested(local) and Choked(peer) + + interested(local) and choked(peer) - + interested(local) and unchoked(peer) - + interested(peer) and choked(local) - + interested(peer) and unchoked(local) - + optimistic unchoke - + peer snubbed - + incoming connection - + not interested(local) and unchoked(peer) - + not interested(peer) and unchoked(local) - + peer from PEX - + peer from DHT - + encrypted traffic - + encrypted handshake - + peer from LSD @@ -6149,180 +5214,165 @@ PeerListWidget - + IP - + Port - + Flags - + Connection Tenging - + Client i.e.: Client application - + Progress i.e: % downloaded Framför - + Down Speed i.e: Download speed - + Up Speed i.e: Upload speed - + Downloaded i.e: total data downloaded Sótt - + Uploaded i.e: total data uploaded - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. - + Files i.e. files that are being downloaded right now Skrár - + Column visibility - + Add a new peer... - - + + Ban peer permanently - + Manually adding peer '%1'... - + The peer '%1' could not be added to this torrent. - + Manually banning peer '%1'... - - + + Peer addition - + Country - + Copy IP:port - + Some peers could not be added. Check the Log for details. - + The peers were added to this torrent. - + Are you sure you want to ban permanently the selected peers? - + &Yes &Já - + &No &Nei - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - + PeersAdditionDlg - + No peer entered - + Please type at least one peer. - + Invalid peer - + The peer '%1' is invalid. @@ -6330,12 +5380,12 @@ PieceAvailabilityBar - + White: Unavailable pieces - + Blue: Available pieces @@ -6343,390 +5393,288 @@ PiecesBar - + Files in this piece: - + File in this piece - + File in these pieces - - Wait until metadata become available to see detailed information - - - - + Hold Shift key for detailed information - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Installed search plugins: - + Name - Nafn + Nafn - + Version - Útgáfa + Útgáfa - + Url - Vefslóð + Vefslóð - - + + Enabled - Virkt - - - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - + Virkt - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Check for updates - Athuga með uppfærslur + Athuga með uppfærslur - + Close - Loka + Loka - + Uninstall - - - + + + Yes - + - - - - + + + + No - Nei + Nei - + Uninstall warning - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Uninstall success - + All selected plugins were uninstalled successfully - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - - - - - + + New search engine plugin URL - - + + URL: - Slóð: + Slóð: - + Invalid link - + The link doesn't seem to point to a search engine plugin. - + Select search plugins - + qBittorrent search plugin - + + + + Search plugin update + + + + All your plugins are already up to date. - + Sorry, couldn't check for plugin updates. %1 - + + + Search plugin install - - Couldn't install "%1" search engine plugin. %2 + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine - - Couldn't update "%1" search engine plugin. %2 + + Couldn't install "%1" search engine plugin. %2 - - - PluginSelectDlg - - Name - Nafn - - - Version - Útgáfa - - - Url - Vefslóð - - - Enabled - Virkt - - - Check for updates - Athuga með uppfærslur - - - Close - Loka - - - Yes - - - No - Nei + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + - URL: - Slóð: + + Couldn't update "%1" search engine plugin. %2 + - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Search plugin source: - + Local file - + Web link - PowerManagement - - - qBittorrent is active - - - - PreviewSelect + Name - Nafn - - - Size - Stærð - - - Progress - Framför - - - - PreviewSelectDialog - - - Preview - - - - - Name - Nafn + Nafn - + Size - Stærð + Stærð - + Progress - Framför + Framför - - + + Preview impossible - - + + Sorry, we can't preview this file - Private::FileLineEdit - - - '%1' does not exist - - - - - '%1' does not point to a directory - - - - - '%1' does not point to a file - - - - - Does not have read permission in '%1' - - - - - Does not have write permission in '%1' - - - - PropListDelegate - + Not downloaded Ekki sótt - - + + Normal Normal (priority) Venjulegt - - N/A - - - - + Do not download Do not download (priority) Ekki sækja - - + + High High (priority) Hár - + Mixed Mixed (priorities Blandað - - + + Maximum Maximum (priority) Hámark @@ -6735,32 +5683,32 @@ PropTabBar - + General Almennur - + Trackers - + Peers - + HTTP Sources - + Content - + Speed Hraði @@ -6854,22 +5802,22 @@ Umsögn - + Select All Velja allt - + Select None Velja ekkert - + Normal Venjulegt - + High Hár @@ -6929,1185 +5877,983 @@ - + Maximum Hámark + - Do not download Ekki sækja - + Never Aldrei - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (hafa %3) - - + + %1 (%2 this session) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 mest) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 alls) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) - + Open Opna - + Open Containing Folder - + Rename... Endurnefna - + Priority Forgangur - + New Web seed - + Remove Web seed - + Copy Web seed URL - + Edit Web seed URL + Rename the file - Endurnefna skrána + Endurnefna skrána - + New name: Nýtt nafn: + + The file could not be renamed - Skráin gat ekki verið endurnefnd + Skráin gat ekki verið endurnefnd + + + + This file name contains forbidden characters, please choose a different one. + - - + + This name is already in use in this folder. Please use a different name. Þetta nafn er þegar í notkun í þessari möppu. Vinsamlegast notaðu annað nafn. - + The folder could not be renamed Þessi mappa getur ekki verið endurnefnd - + qBittorrent qBittorrent - + Filter files... - - Renaming + + New URL seed + New HTTP source - - - Rename error + + New URL seed: - - The name is empty or contains forbidden characters, please choose a different one. + + + This URL seed is already in the list. - - New URL seed - New HTTP source + + Web seed editing - - New URL seed: + + Web seed URL: + + + QObject - - - This URL seed is already in the list. + + Your IP address has been banned after too many failed authentication attempts. - - Web seed editing + + Error: '%1' is not a valid torrent file. + - - Web seed URL: + + Error: Could not add torrent to session. + + + + + I/O Error: Could not create temporary file. - - - QObject - + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. - - + + %1 must be the single command line parameter. - + + %1 must specify the correct port (1 to 65535). + + + + You cannot use %1: qBittorrent is already running for this user. - + Usage: Notkun: - + Options: Valkostir: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' + + Displays program version - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' + + Displays this help message - - Expected integer number in environment variable '%1', but got '%2' + + Changes the Web UI port (current: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' + + Disable splash screen - - Expected %1 in environment variable '%2', but got '%3' + + Run in daemon-mode (background) - - port + + Downloads the torrents passed by the user - - %1 must specify a valid port (1 to 65535). - + + Help + Hjálp - - Display program version and exit + + Run application with -h option to read about command line parameters. - - Display this help message and exit + + Bad command line - - Change the Web UI port + + Bad command line: - - Disable splash screen + + Legal Notice - - Run in daemon-mode (background) + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. - - dir - Use appropriate short form or abbreviation of "directory" + + Press %1 key to accept and continue... - - Store configuration files in <dir> + + Legal notice - - - name - + + Cancel + Hætta við - - Store configuration files in directories qBittorrent_<name> - + + I Agree + Ég samþykki - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - + + Torrent name: %1 + Torrent nafn: %1 - - files or URLs - + + Torrent size: %1 + Torrent stærð: %1 - - Download the torrents passed by the user + + Save path: %1 - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds - - Options when adding new torrents: + + Thank you for using qBittorrent. - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - + + [qBittorrent] '%1' has finished downloading + [qBittorrent] '%1' hefur lokið niðurhali - - path + + The remote host name was not found (invalid hostname) - - Torrent save path + + The operation was canceled - - Add torrents as started or paused + + The remote server closed the connection prematurely, before the entire reply was received and processed - - Skip hash check + + The connection to the remote server timed out - - Assign torrents to category. If the category doesn't exist, it will be created. + + SSL/TLS handshake failed - - Download files in sequential order + + The remote server refused the connection - - Download first and last pieces first + + The connection to the proxy server was refused - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: + + The proxy server closed the connection prematurely - - Command line parameters take precedence over environment variables + + The proxy host name was not found - - Help - Hjálp - - - - Run application with -h option to read about command line parameters. + + The connection to the proxy timed out or the proxy did not reply in time to the request sent - - Bad command line + + The proxy requires authentication in order to honor the request but did not accept any credentials offered - - Bad command line: + + The access to the remote content was denied (401) - - Legal Notice + + The operation requested on the remote content is not permitted - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + + The remote content was not found at the server (404) - - No further notices will be issued. + + The remote server requires authentication to serve the content but the credentials provided were not accepted - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. + + The Network Access API cannot honor the request because the protocol is not known - - Press %1 key to accept and continue... + + The requested operation is invalid for this protocol - - Legal notice + + An unknown network-related error was detected - - Cancel - Hætta við - - - - I Agree - Ég samþykki - - - Torrent name: %1 - Torrent nafn: %1 + + An unknown proxy-related error was detected + - Torrent size: %1 - Torrent stærð: %1 + + An unknown error related to the remote content was detected + - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' hefur lokið niðurhali + + A breakdown in protocol was detected + + Unknown error - Óþekkt villa + Óþekkt villa - - + + Upgrade Uppfæra - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - + Couldn't migrate torrent with hash: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 + + Detected unclean program exit. Using fallback file to restore settings. - + An access error occurred while trying to write the configuration file. - + A format error occurred while trying to write the configuration file. - - - An unknown error occurred while trying to write the configuration file. - - RSS + Search - Leita + Leita + + + + New subscription + + + + + + + Mark items read + + Update all - Uppfæra allt + Uppfæra allt + + + + RSS Downloader... + + Settings... - Stillingar... + Stillingar... + + + + Torrents: (double-click to download) + + + Delete - Eyða + Eyða + Rename... - Endurnefna... + Endurnefna... + Rename - Endurnefna + Endurnefna + + Update - Uppfæra + Uppfæra + + + + New subscription... + + + + + + Update all feeds + + Download torrent - Sækja torrent + Sækja torrent + Open news URL - Opna frétta vefslóð + Opna frétta vefslóð + + + + Copy feed URL + + New folder... - Ný mappa... + Ný mappa... + + + + Refresh RSS streams + - RSS::AutoDownloader + RSSImp - - - Invalid data format. + + Stream URL: - - Couldn't save RSS AutoDownloader data in %1. Error: %2 + + Please type a RSS stream URL - - Invalid data format + + This RSS feed is already in the list. - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 + + Please choose a folder name - - Couldn't load RSS AutoDownloader rules. Reason: %1 - + + Folder name: + Möppu nafn: - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - + + New folder + Ný mappa - - RSS feed at '%1' updated. Added %2 new articles. + + Deletion confirmation - - Failed to parse RSS feed at '%1'. Reason: %2 + + Are you sure you want to delete the selected RSS feeds? - - Couldn't read RSS Session data from %1. Error: %2 + + Please choose a new name for this RSS feed - - Couldn't parse RSS Session data. Error: %1 + + New feed name: - - Couldn't load RSS Session data. Invalid data format. - + + Name already in use + Nafn þegar í notkun - - Couldn't load RSS article '%1#%2'. Invalid data format. + + This name is already used by another item, please choose another one. - - - RSS::Private::Parser - - Invalid RSS feed. - + + Date: + Dagsetning: - - %1 (line: %2, column: %3, offset: %4). - + + Author: + Höfundur: + + + + Unread + Ólesið - RSS::Session + Rss::Feed - - RSS feed with given URL already exists: %1. + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... - - Cannot move root folder. + + Automatically downloading '%1' torrent from '%2' RSS feed... + + + Rss::Private::Parser - - - Item doesn't exist: %1. + + Invalid RSS feed. + + + RssSettingsDlg - - Cannot delete root folder. + + RSS Reader Settings - - Incorrect RSS Item path: %1. + + RSS feeds refresh interval: - - RSS item with given path already exists: %1. + + min - - Parent folder doesn't exist: %1. + + Maximum number of articles per feed: - RSSImp + ScanFoldersDelegate - Folder name: - Möppu nafn: + + Select save location + + + + ScanFoldersModel - New folder - Ný mappa + + Monitored Folder + - Name already in use - Nafn þegar í notkun + + Override Save Location + - Date: - Dagsetning: + + Monitored folder + - Author: - Höfundur: + + Default save location + - Unread - Ólesið + + Browse... + Skoða... - RSSWidget - - - Search - Leita - + SearchEngine - - Fetching of RSS feeds is disabled now! You can enable it in application settings. + + Unknown search engine plugin file format. - - New subscription + + A more recent version of this plugin is already installed. - - - - Mark items read + + + Plugin is not supported. - - Refresh RSS streams + + Update server is temporarily unavailable. %1 - - Update all - Uppfæra allt + + + Failed to download the plugin file. %1 + - - RSS Downloader... + + An incorrect update info received. - - Torrents: (double-click to download) - + + All categories + Allir flokkar - - - Delete - Eyða + + Movies + Kvikmyndir - - Rename... - + + TV shows + Sjónvarpsþættir - - Rename - Endurnefna + + Music + Tónlist - - - Update - Uppfæra + + Games + Leikir - - New subscription... + + Anime - - - Update all feeds + + Software - - Download torrent - Sækja torrent + + Pictures + Myndir - - Open news URL - Opna frétta vefslóð - - - - Copy feed URL - - - - - New folder... - Ný mappa... - - - - Please choose a folder name - - - - - Folder name: - Möppu nafn: - - - - New folder - Ný mappa - - - - Please type a RSS feed URL - - - - - Feed URL: - - - - - Deletion confirmation - - - - - Are you sure you want to delete the selected RSS feeds? - - - - - Please choose a new name for this RSS feed - - - - - New feed name: - - - - - Rename failed - - - - - Date: - Dagsetning: - - - - Author: - Höfundur: - - - - ScanFoldersDelegate - - - Select save location - - - - - ScanFoldersModel - - - Monitored Folder - - - - - Override Save Location - - - - - Monitored folder - - - - - Default save location - - - - - Browse... - Skoða... + + Books + Bækur - SearchEngine - - All categories - Allir flokkar - - - Movies - Kvikmyndir - - - TV shows - Sjónvarpsþættir - - - Music - Tónlist - - - Games - Leikir - - - Pictures - Myndir - + SearchListDelegate - Books - Bækur + + + Unknown + Óþekkt - SearchJobWidget - - - Form - - - - - Results(xxx) - - - - - Search in: - - - - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - - - - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - - - - - Seeds: - - - - - <html><head/><body><p>Minimal number of seeds</p></body></html> - - - - - - to - til - - - - <html><head/><body><p>Maximal number of seeds</p></body></html> - - - - - - - - - - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - - - - - Size: - Stærð: - - - - <html><head/><body><p>Minimal torrent size</p></body></html> - - - - - <html><head/><body><p>Maximal torrent size</p></body></html> - - + SearchTab - + Name i.e: file name - Nafn + Nafn - + Size i.e: file size - Stærð + Stærð - + Seeders i.e: Number of full sources - + Leechers i.e: Number of partial sources - + Search engine - Leitarvél - - - - Filter search results... - + Leitarvél - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Torrent names only - + Everywhere - - Use regular expressions - - - - + Searching... - + Search has finished Leit lokið - + Search aborted - + An error occurred during search... - + Search returned no results - + Column visibility - - - SearchListDelegate - - Unknown - Óþekkt - - - - SearchPluginManager - - Unknown search engine plugin file format. + + Form - - A more recent version of this plugin is already installed. + + Results(xxx) - - - Plugin is not supported. + + Search in: - - All categories - Allir flokkar - - - - Movies - Kvikmyndir - - - - TV shows - Sjónvarpsþættir - - - - Music - Tónlist - - - - Games - Leikir - - - - Anime + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - - Software + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - - Pictures - Myndir - - - - Books - Bækur - - - - Update server is temporarily unavailable. %1 + + Seeds: - - - Failed to download the plugin file. %1 + + <html><head/><body><p>Minimal number of seeds</p></body></html> - - An incorrect update info received. - + + + to + til - - Search plugin '%1' contains invalid version string ('%2') + + <html><head/><body><p>Maximal number of seeds</p></body></html> - - - SearchTab - - Name - i.e: file name - Nafn - - - Size - i.e: file size - Stærð + + + + + - Search engine - Leitarvél + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + - Search has finished - Leit lokið + + Size: + Stærð: - to - til + + <html><head/><body><p>Minimal torrent size</p></body></html> + - Size: - Stærð: + + <html><head/><body><p>Maximal torrent size</p></body></html> + @@ -8115,197 +6861,185 @@ - - - - + + + Search Leita - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - - + Download Niðurhal - + Go to description page - + Copy description page URL - + Search plugins... - + A phrase to search for. - + Spaces in a search term may be protected by double quotes. - + Example: Search phrase example - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - + All plugins - + Only enabled - + Select... - - - + + + Search Engine Leitarvél - + Please install Python to use the Search Engine. - + Empty search pattern - + Please type a search pattern first - + Stop - + Search has finished Leit lokið - + Search has failed - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + E&xit Now - + Exit confirmation - + The computer is going to shutdown. - + &Shutdown Now - - Shutdown confirmation - - - - + The computer is going to enter suspend mode. - + &Suspend Now - + Suspend confirmation - + The computer is going to enter hibernation mode. - + &Hibernate Now - + Hibernate confirmation - + You can cancel the action within %1 seconds. + + + Shutdown confirmation + + SpeedLimitDialog - + KiB/s KiB/s @@ -8313,52 +7047,52 @@ SpeedPlotView - + Total Upload - + Total Download Samtals sótt - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - + DHT Download - + Tracker Upload - + Tracker Download @@ -8366,95 +7100,87 @@ SpeedWidget - + Period: - + 1 Minute 1 Mínúta - + 5 Minutes 5 Mínútur - + 30 Minutes 30 Mínútur - + 6 Hours 6 Klukkutímar - + Select Graphs - + Total Upload - + Total Download Samtals sótt - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - + DHT Download - + Tracker Upload - + Tracker Download - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8467,48 +7193,48 @@ - - Cache statistics + + Total peer connections: - - Read cache hits: + + Global ratio: - - Average time in queue: + + Alltime download: - - Connected peers: + + Alltime upload: - - All-time share ratio: + + Total waste (this session): - - All-time download: + + Cache statistics - - Session waste: + + Read cache hits: - - All-time upload: + + Average time in queue: - Total buffer size: + Total buffers size: @@ -8537,11 +7263,12 @@ + OK - Allt í lagi + Allt í lagi - + %1 ms 18 milliseconds @@ -8550,26 +7277,31 @@ StatusBar - + Connection status: - + No direct connections. This may indicate network configuration problems. - + DHT: %1 nodes - - qBittorrent needs to be restarted! + + qBittorrent needs to be restarted + + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. @@ -8589,1859 +7321,1309 @@ - + Click to switch to alternative speed limits - + Click to switch to regular speed limits - + + Manual change of rate limits mode. The scheduler is disabled. + + + + Global Download Speed Limit - + Global Upload Speed Limit - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - Allt (0) + Allt (0) - + Downloading (0) - Sæki (0) + Sæki (0) - + Seeding (0) - + Completed (0) - Lokið (0) + Lokið (0) - + Resumed (0) - + Paused (0) - + Active (0) - + Inactive (0) - + Errored (0) - Villur (0) + Villur (0) - + All (%1) - Allt (%1) + Allt (%1) - + Downloading (%1) - Sæki (%1) + Sæki (%1) - + Seeding (%1) - + Completed (%1) - Lokið (%1) + Lokið (%1) - + Paused (%1) - + Resumed (%1) - + Active (%1) - + Inactive (%1) - + Errored (%1) - Villur (%1) + Villur (%1) - StatusFiltersWidget - - All (0) - this is for the status filter - Allt (0) - + TorrentContentModel - Downloading (0) - Sæki (0) + + Name + Nafn - Completed (0) - Lokið (0) + + Size + Stærð - Errored (0) - Villur (0) + + Progress + Framför - All (%1) - Allt (%1) + + Download Priority + Niðurhal forgangur - Downloading (%1) - Sæki (%1) + + Remaining + Eftir + + + TorrentCreatorDlg - Completed (%1) - Lokið (%1) + + Select a folder to add to the torrent + - Errored (%1) - Villur (%1) + + Select a file to add to the torrent + - - - TagFilterModel - - Tags + + No input path set - - All - Allt + + Please type an input path first + - - Untagged + + Select destination torrent file - - - TagFilterWidget - - Add tag... + + Torrent Files (*.torrent) - - Remove tag + + Torrent was created successfully: %1 + %1 is the path of the torrent - - Remove unused tags + + + + Torrent creation - - Resume torrents + + Torrent creation was unsuccessful, reason: %1 - - Pause torrents + + Created torrent file is invalid. It won't be added to download list. + + + TorrentModel - - Delete torrents - Eyða torrents + + Name + i.e: torrent name + Nafn - - New Tag - + + Size + i.e: torrent size + Stærð - - Tag: - + + Done + % Done + Lokið - - Invalid tag name - + + Status + Torrent status (e.g. downloading, seeding, paused) + Staða - - Tag name '%1' is invalid + + Seeds + i.e. full sources (often untranslated) - - Tag exists + + Peers + i.e. partial sources (often untranslated) - - Tag name already exists. + + Down Speed + i.e: Download speed - - - TorrentCategoryDialog - - Torrent Category Properties + + Up Speed + i.e: Upload speed - - Name: - Nafn: + + Ratio + Share ratio + - - Save path: + + ETA + i.e: Estimated Time of Arrival / Time left - - Choose save path - Veldu vista slóðina + + Category + - - New Category + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 - - Invalid category name + + Completed On + Torrent was completed on 01/01/2010 08:00 - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. + + Tracker - - Category creation error + + Down Limit + i.e: Download limit - - Category with the given name already exists. -Please choose a different name and try again. + + Up Limit + i.e: Upload limit - - - TorrentContentModel - - Name - Nafn + + Downloaded + Amount of data downloaded (e.g. in MB) + Sótt - - Size - Stærð + + Uploaded + Amount of data uploaded (e.g. in MB) + - - Progress - Framför + + Session Download + Amount of data downloaded since program open (e.g. in MB) + - - Download Priority - Niðurhal forgangur + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + - + Remaining - Eftir + Amount of data left to download (e.g. in MB) + Eftir - - Availability + + Time Active + Time (duration) the torrent is active (not paused) - - - TorrentCreatorDialog - - Torrent Creator + + Save path + Torrent save path - - Select file/folder to share - + + Completed + Amount of data completed (e.g. in MB) + Lokið - - Path: + + Ratio Limit + Upload share ratio limit - - [Drag and drop area] + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole - - - Select file + + Last Activity + Time passed since a chunk was downloaded/uploaded - - - Select folder - + + Total Size + i.e. Size including unwanted data + Heildar stærð + + + TrackerFiltersList - - Settings - + + All (0) + this is for the tracker filter + Allt (0) - - Piece size: + + Trackerless (0) - - Auto - Sjálfgefið - - - - 16 KiB - 16 KiB + + Error (0) + Villa (0) - - 32 KiB - 32 KiB + + Warning (0) + Viðvörun (0) - - 64 KiB - 64 KiB + + + Trackerless (%1) + - - 128 KiB - 128 KiB + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - 256 KiB - 256 KiB + + + Error (%1) + Villa (%1) - - 512 KiB - 512 KiB + + + Warning (%1) + Aðvörun (%1) - - 1 MiB - 1 MiB + + Resume torrents + - - 2 MiB - 2 MiB + + Pause torrents + - - 4 MiB - 4 MiB + + Delete torrents + Eyða torrents - - 8 MiB - 8 MiB + + + All (%1) + this is for the tracker filter + Allt (%1) + + + TrackerList - - 16 MiB - 16 MiB + + URL + Vefslóð - - 32 MiB - 16 MiB {32 ?} + + Status + Staða - - Calculate number of pieces: + + Received - - Private torrent (Won't distribute on DHT network) + + Seeds - - Start seeding immediately + + Peers - - Ignore share ratio limits for this torrent - + + Downloaded + Sótt - - Optimize alignment - + + Message + Skilaboð - - Fields - + + + Working + Virkar - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + + Disabled - - Web seed URLs: + + This torrent is private - - Tracker URLs: - - - - - Comments: - - - - - Source: - - - - - Progress: - Framför: - - - - Create Torrent - - - - - - - Torrent creation failed - - - - - Reason: Path to file/folder is not readable. - - - - - Select where to save the new torrent - - - - - Torrent Files (*.torrent) - - - - - Reason: %1 - - - - - Reason: Created torrent is invalid. It won't be added to download list. - - - - - Torrent creator - - - - - Torrent created: - - - - - TorrentCreatorDlg - - Auto - Sjálfgefið - - - 16 KiB - 16 KiB - - - 32 KiB - 32 KiB - - - 64 KiB - 64 KiB - - - 128 KiB - 128 KiB - - - 256 KiB - 256 KiB - - - 512 KiB - 512 KiB - - - 1 MiB - 1 MiB - - - 2 MiB - 2 MiB - - - 4 MiB - 4 MiB - - - 8 MiB - 8 MiB - - - 16 MiB - 16 MiB - - - 32 MiB - 16 MiB {32 ?} - - - Progress: - Framför: - - - - TorrentInfo - - - File size exceeds max limit %1 - - - - - Torrent file read error: %1 - - - - - Torrent file read error: size mismatch - - - - - TorrentModel - - Name - i.e: torrent name - Nafn - - - Size - i.e: torrent size - Stærð - - - Done - % Done - Lokið - - - Status - Torrent status (e.g. downloading, seeding, paused) - Staða - - - Downloaded - Amount of data downloaded (e.g. in MB) - Sótt - - - Remaining - Amount of data left to download (e.g. in MB) - Eftir - - - Completed - Amount of data completed (e.g. in MB) - Lokið - - - Total Size - i.e. Size including unwanted data - Heildar stærð - - - - TorrentsController - - - Not contacted yet - - - - + Updating... - Uppfæri... + Uppfæri... - - Working - Virkar - - - + Not working - Virkar ekki - - - - Error: '%1' is not a valid torrent file. - - - - - - - - Torrent queueing must be enabled - - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - - Cannot make save path - - - - - Cannot write to directory - - - - - WebUI Set location: moving "%1", from "%2" to "%3" - - - - - Incorrect torrent name - + Virkar ekki - - - Incorrect category name - - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - Allt (0) - - - - Trackerless (0) - - - - - Error (0) - Villa (0) - - - - Warning (0) - Viðvörun (0) - - - - - Trackerless (%1) - - - - - - Error (%1) - Villa (%1) - - - - - Warning (%1) - Aðvörun (%1) - - - - Resume torrents - - - - - Pause torrents - - - - - Delete torrents - Eyða torrents - - - - - All (%1) - this is for the tracker filter - Allt (%1) - - - - TrackerList - - URL - Vefslóð - - - Status - Staða - - - Downloaded - Sótt - - - Message - Skilaboð - - - Working - Virkar - - - Updating... - Uppfæri... - - - Not working - Virkar ekki - - - - TrackerListWidget - - - - Working - Virkar - - - - Disabled - - - - - This torrent is private - - - - - Updating... - Uppfæri... - - - - Not working - Virkar ekki - - - + Not contacted yet - - - - - - - N/A + + Tracker URL: - + Tracker editing - - Tracker URL: - - - - - + + Tracker editing failed - + The tracker URL entered is invalid. - + The tracker URL already exists. - + Add a new tracker... - - Remove tracker - - - - + Copy tracker URL - + Edit selected tracker URL - + Force reannounce to selected trackers - + Force reannounce to all trackers - - URL - Vefslóð - - - - Status - Staða - - - - Received - - - - - Seeds - - - - - Peers - - - - - Downloaded - Sótt - - - - Message - Skilaboð - - - - Column visibility + + Remove tracker - TrackerLoginDialog + TrackersAdditionDlg - - - Tracker authentication + + Trackers addition dialog - - Tracker: + + List of trackers to add (one per line): - - - Login - Skrá inn - - - - Username: - Notandanafn: - - - - Password: - Lykilorð: - - - - Log in - Skrá inn - - - - TrackersAdditionDialog - - - Trackers addition dialog + + + µTorrent compatible list URL: - - List of trackers to add (one per line): - + + I/O Error + I/O Villa - - µTorrent compatible list URL: + + Error while trying to open the downloaded file. - + No change - Engin breyting + Engin breyting - + No additional trackers were found. - + Download error - Niðurhal villa + Niðurhal villa - + The trackers list could not be downloaded, reason: %1 - TrackersAdditionDlg - - I/O Error - I/O Villa - - - No change - Engin breyting - - - Download error - Niðurhal villa - - - TransferListDelegate - - Downloading - Sæki - - - - Downloading metadata - used when loading a magnet link - - - - - Allocating - qBittorrent is allocating the files on disk - - - - - Paused - - - - - Queued - i.e. torrent is queued - - - - - Seeding - Torrent is complete and in upload-only mode - - - - - Stalled - Torrent is waiting for download to begin - - - - [F] Downloading - used when the torrent is forced started. You probably shouldn't translate the F. - - - - - [F] Seeding - used when the torrent is forced started. You probably shouldn't translate the F. - - - - - Checking - Torrent local data is being checked - Athuga - - - - Queued for checking - i.e. torrent is queued for hash checking - - - - - Checking resume data - used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - - - - - Completed - Lokið - - - - Moving - Torrent local data are being moved/relocated - - - - - Missing Files - - - - - Errored - torrent status, the torrent has an error - Villur - - - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - - - - - %1 ago - e.g.: 1h 20m ago - %1 síðan - - - - TransferListFiltersWidget - - - Status - Staða - - - - Categories - - - - - Tags - - - - - Trackers - - - - - TransferListModel - - - Name - i.e: torrent name - Nafn - - - - Size - i.e: torrent size - Stærð - - - - Done - % Done - Lokið - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Staða - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - - - - - Down Speed - i.e: Download speed - - - - - Up Speed - i.e: Upload speed - - - - - Ratio - Share ratio - + Downloading + Sæki - - ETA - i.e: Estimated Time of Arrival / Time left + + Downloading metadata + used when loading a magnet link - - Category + + Allocating + qBittorrent is allocating the files on disk - - Tags + + Paused - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 + + Queued + i.e. torrent is queued - - Completed On - Torrent was completed on 01/01/2010 08:00 + + Seeding + Torrent is complete and in upload-only mode - - Tracker + + Stalled + Torrent is waiting for download to begin - - Down Limit - i.e: Download limit + + [F] Downloading + used when the torrent is forced started. You probably shouldn't translate the F. - - Up Limit - i.e: Upload limit + + [F] Seeding + used when the torrent is forced started. You probably shouldn't translate the F. - - Downloaded - Amount of data downloaded (e.g. in MB) - Sótt + + Checking + Torrent local data is being checked + Athuga - - Uploaded - Amount of data uploaded (e.g. in MB) + + Queued for checking + i.e. torrent is queued for hash checking - - Session Download - Amount of data downloaded since program open (e.g. in MB) + + Checking resume data + used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - + + Completed + Lokið - - Remaining - Amount of data left to download (e.g. in MB) - Eftir + + Missing Files + - - Time Active - Time (duration) the torrent is active (not paused) - + + Errored + torrent status, the torrent has an error + Villur - - Save path - Torrent save path + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) - - Completed - Amount of data completed (e.g. in MB) - Lokið + + %1 ago + e.g.: 1h 20m ago + %1 síðan + + + TransferListFiltersWidget - - Ratio Limit - Upload share ratio limit - + + Status + Staða - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole + + Categories - - Last Activity - Time passed since a chunk was downloaded/uploaded + + Trackers - - - Total Size - i.e. Size including unwanted data - Heildar stærð - TransferListWidget - + Column visibility - + Choose save path Veldu vista slóðina - + Torrent Download Speed Limiting - + Torrent Upload Speed Limiting - + Recheck confirmation - + Are you sure you want to recheck the selected torrent(s)? - + Rename Endurnefna - + New name: Nýtt nafn: - + Resume Resume/start the torrent - + Force Resume Force Resume/start the torrent - + Pause Pause the torrent - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - - - - - Add Tags - - - - - Remove All Tags - - - - - Remove all tags from selected torrents? + + New Category - - Comma-separated tags: + + Category: - - Invalid tag + + Invalid category name - - Tag name: '%1' is invalid + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. - + Delete Delete the torrent Eyða - + Preview file... - + Limit share ratio... - + Limit upload rate... - + Limit download rate... - + Open destination folder - + Move up i.e. move up in the queue Fara upp - + Move down i.e. Move down in the queue Fara niður - + Move to top i.e. Move to top of the queue Færa efst - + Move to bottom i.e. Move to bottom of the queue Færa neðst - + Set location... - - Force reannounce - - - - + Copy name Afrita nafn - - Copy hash - - - - + Download first and last pieces first - + Automatic Torrent Management - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - + Category - + New... New category... - + Reset Reset category - - Tags - - - - - Add... - Add / assign multiple tags... - - - - - Remove All - Remove all tags - - - - + Priority Forgangur - + Force recheck - + Copy magnet link Afrita magnet slóð - + Super seeding mode - + Rename... Endurnefna - + Download in sequential order - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - - Use global share limit + + Use global ratio limit - - - + + + buttonGroup - - Set no share limit - - - - - Set share limit to - - - - - ratio - - - - - minutes + + Set no ratio limit - - No share limit method selected + + Set ratio limit to + + + WebApplication - - Please select a limit method first + + Incorrect category name - Utils::ForeignApps + WebUI - - Python detected, version: %1 + + The Web UI is listening on port %1 - - Python not detected + + Web UI Error - Unable to bind Web UI to port %1 - WebApplication + about - - Unacceptable file type, only regular file is allowed. - - - - - Symlinks inside alternative UI folder are forbidden. + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - Exceeded the maximum allowed file size (%1)! + + Copyright %1 2006-2016 The qBittorrent project - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' + + Home Page: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' + + Forum: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' + + Bug Tracker: + + + addPeersDialog - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' + + Add Peers - - - WebUI - - Web UI: HTTPS setup successful + + List of peers to add (one per line): - - Web UI: HTTPS setup failed, fallback to HTTP + + Format: IPv4:port / [IPv6]:port + + + authentication - - Web UI: Now listening on IP: %1, port: %2 + + + Tracker authentication - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 + + Tracker: - - - authentication + Login - Skrá inn + Skrá inn + Username: - Notandanafn: + Notandanafn: + Password: - Lykilorð: + Lykilorð: + Log in - Skrá inn + Skrá inn + Cancel - Hætta við + Hætta við confirmDeletionDlg + + Deletion confirmation - qBittorrent + + + + + Remember choice + + + + Also delete the files on the hard disk - Einnig eyða skrám af harðadiski + Einnig eyða skrám af harðadiski + + + + confirmShutdownDlg + + + Don't show again + createTorrentDialog + Cancel - Hætta við + Hætta við + + + + Torrent Creation Tool + + + + + Torrent file creation + + Add file - Bæta við skrá + Bæta við skrá + Add folder - Bæta við möppu + Bæta við möppu + + + + File or folder to add to the torrent: + + + + + Tracker URLs: + + + Web seeds urls: + + + + Comment: - Umsögn + Umsögn + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + + + + + Piece size: + + 16 KiB - 16 KiB + 16 KiB + 32 KiB - 32 KiB + 32 KiB + 64 KiB - 64 KiB + 64 KiB + 128 KiB - 128 KiB + 128 KiB + 256 KiB - 256 KiB + 256 KiB + 512 KiB - 512 KiB + 512 KiB + 1 MiB - 1 MiB + 1 MiB + 2 MiB - 2 MiB + 2 MiB + 4 MiB - 4 MiB + 4 MiB + 8 MiB - 8 MiB + 8 MiB + 16 MiB - 16 MiB + 16 MiB + Auto - Sjálfgefið + Sjálfgefið + + + + Private (won't be distributed on DHT network if enabled) + + + + + Start seeding after creation + + + + + Ignore share ratio limits for this torrent + + + + + Create and save... + + Progress: - Framför: + Framför: downloadFromURL + + Add torrent links + + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + + + + Download - Niðurhal + Niðurhal + Cancel - Hætta við + Hætta við + + + + Download from urls + + + + + No URL entered + + + + + Please type at least one URL. + + + + + errorDialog + + + Crash info + fsutils - + + + + + Downloads @@ -10449,123 +8631,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) - + EiB exbibytes (1024 pebibytes) - + + Python not detected + + + + + Python version: %1 + + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1h %2m - + %1d %2h e.g: 2days 10hours %1d %2h - + Unknown Unknown (size) Óþekkt - + qBittorrent will shutdown the computer now because all downloads are complete. - + < 1m < 1 minute < 1m - + %1m e.g: 10minutes %1m + Working - Virkar + Virkar + Updating... - Uppfæri... + Uppfæri... + Not working - Virkar ekki + Virkar ekki + + + + Not contacted yet + preview - + Preview selection - + The following files support previewing, please select one of them: - Cancel - Hætta við + + Preview + - - - trackerLogin - Log in - Skrá inn + + Cancel + Hætta við diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_it.ts qbittorrent-3.3.15/src/lang/qbittorrent_it.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_it.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_it.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - + Informazioni su qBittorrent - + About - + Informazioni - + Author - - - - - Current maintainer - + Autore - - Greece - Grecia + + + Nationality: + Nazionalità: - - - Nationality: - + + + Name: + Nome: - - + + E-mail: - + Email: - - - Name: - Nome: + + Greece + Grecia - - Original author - + + Current maintainer + Autore attuale - - France - Francia + + Original author + Autore originario - + Special Thanks - + Ringraziamenti speciali - + Translators - - - - - License - + Traduttori - + Libraries - + Librerie - + qBittorrent was built with the following libraries: - - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - + qBittorrent è stato sviluppato con le seguenti librerie: - - Forum: - + + France + Francia - - Bug Tracker: - + + License + Licenza @@ -115,64 +90,74 @@ Salva in - + + Browse... + Naviga... + + + + Set as default save path + Imposta come percorso predefinito + + + Never show again Non mostrare più - + Torrent settings Impostazioni torrent - + Set as default category Imposta come categoria predefinita - + Category: Categoria: - + Start torrent Avvia torrent - + Torrent information Informazioni torrent - + Skip hash check Salta controllo hash - + Size: Dimensione: - + Hash: Hash: - + Comment: Commento: - + Date: Data: Torrent Management Mode: - Modalità Gestione Torrent: + Modalità Gestione Torrent @@ -190,117 +175,89 @@ Automatica - - Remember last used save path - Ricorda ultimo percorso di salvataggio - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - Se spuntato, il file .torrent non verrà cancellato nonostante l'impostazione nella pagina "Scaricamenti" della finestra opzioni + Se selezionata, il file .torrent non verrà cancellato nonostante l'impostazione nella pagina "Download" della finestra opzioni - + Do not delete .torrent file Non cancellare file .torrent - - Create subfolder - Crea sottocartella - - - - Download in sequential order - Scarica in ordine sequenziale - - - - Download first and last pieces first - Scarica la prima e l'ultima parte per prime - - - + Normal Normale - + High Alta - + Maximum Massima - + Do not download Non scaricare - - - + + + I/O Error Errore I/O - + Invalid torrent Torrent non valido - - Renaming - Rinominazione - - - - - Rename error - Errore rinominazione - - - - The name is empty or contains forbidden characters, please choose a different one. - Il nome è vuoto o contiene caratteri vietati, scegline uno diverso. + + + + + Already in download list + Elemento già nell'elenco dei trasferimenti - + Not Available This comment is unavailable Commento non disponibile - + Not Available This date is unavailable Non disponibile - + Not available Non disponibile - + Invalid magnet link Collegamento magnet non valido - + The torrent file '%1' does not exist. Il file torrent '%1' non esiste. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. Il file torrent '%1' non può essere letto dal disco. Probabilmente non hai i permessi necessari. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,428 +266,327 @@ Errore: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Il torrent è già nell'elenco dei trasferimenti. I trackers non sono stati aggiunti perché si tratta di un torrent privato. + + + + Torrent is already in download list. Trackers were merged. + Il torrent è già nell'elenco dei trasferimenti. Aggiunti eventuali nuovi tracker. + + + + + Cannot add torrent + Impossibile aggiungere il torrent + + + + Cannot add this torrent. Perhaps it is already in adding state. + Impossibile aggiungere questo torrent. Forse è già stato aggiunto. + + + This magnet link was not recognized Collegamento magnet non riconosciuto - + + Magnet link is already in download list. Trackers were merged. + Il collegamento magnet è già nell'elenco dei trasferimenti. Aggiunti eventuali nuovi tracker. + + + + Cannot add this torrent. Perhaps it is already in adding. + Impossibile aggiungere questo torrent. Forse è già stato aggiunto. + + + Magnet link Collegamento magnet - + Retrieving metadata... Recupero metadati... - + Not Available This size is unavailable. Non disponibile - + Free space on disk: %1 Spazio libero sul disco: %1 - + + Choose save path Scegli una cartella per il salvataggio - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - + + Rename the file + Rinomina file - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + + New name: + Nuovo nome: - - Magnet link is already queued for processing. - + + + The file could not be renamed + Impossibile rinominare il file - - New name: - Nuovo nome: + + This file name contains forbidden characters, please choose a different one. + Questo nome file contiene caratteri vietati, scegli un nome differente. - - + + This name is already in use in this folder. Please use a different name. Questo nome è già in uso in questa cartella, scegli un nome differente. - + The folder could not be renamed La cartella non può essere rinominata - + Rename... Rinomina... - + Priority Priorità - + Invalid metadata Metadati non validi - + Parsing metadata... Analisi metadati... - + Metadata retrieval complete Recupero metadati completato - + Download Error - Errore di scaricamento + Errore di download AdvancedSettings - + + Disk write cache size + Dimensione cache scrittura su disco + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Porte in uscita (min) [0: disattivato] - + Outgoing ports (Max) [0: Disabled] Porte in uscita (max) [0: disattivato] - + Recheck torrents on completion Ricontrolla torrent al completamento - + Transfer list refresh interval Intervallo di aggiornamento elenco trasferimenti - + ms milliseconds ms - + Setting Impostazione - + Value Value set for this setting Valore - - - (disabled) - (disattivato) - - - + (auto) (auto) - - min - minutes - min - - - + All addresses Tutti gli indirizzi - + qBittorrent Section Sezione qBittorrent - - + + Open documentation Apri documentazione - + libtorrent Section Sezione libtorrent - - Asynchronous I/O threads - - - - - Disk cache - Cache disco - - - + s seconds s - + Disk cache expiry interval Intervallo scadenza cache disco - + Enable OS cache Attiva cache del SO - - Guided read cache - Cache in lettura guidata - - - - Coalesce reads & writes - Combina letture e scritture - - - - Send upload piece suggestions - Invia suggerimenti parti per invio - - - - - KiB - KiB - - - - Send buffer watermark - Invia livello buffer - - - - Send buffer low watermark - Invia livello buffer basso - - - - Send buffer watermark factor - Invia fattore livello buffer - - - - Prefer TCP - Preferisci TCP - - - - Peer proportional (throttles TCP) - Proporzionale per nodo (soffoca TCP) - - - - Allow multiple connections from the same IP address - Permetti connessioni multiple dallo stesso indirizzo IP + + m + minutes + m - + Resolve peer countries (GeoIP) - Risolvi localizzazione nodi (GeoIP) + Risolvi localizzazione peer (GeoIP) - + Resolve peer host names - Risolvi i nomi host dei nodi + Risolvi i nomi host dei peer - + Strict super seeding - Forza super distribuzione + Forza super seeding - + Network Interface (requires restart) Interfaccia di rete (richiede il riavvio) - + Optional IP Address to bind to (requires restart) Indirizzo IP opzionale a cui associarsi (richiede il riavvio) - + Listen on IPv6 address (requires restart) Ascolta su indirizzi IPv6 (richiede il riavvio) - + Display notifications Mostra notifiche - + Display notifications for added torrents Mostra notifiche per i torrent aggiunti - + Download tracker's favicon - Scarica iconcina server traccia - - - - Save path history length - Lunghezza storico percorso di salvataggio - - - - Fixed slots - Posizioni fisse - - - - Upload rate based - Secondo velocità di invio + Scarica favicon del tracker - - Upload slots behavior - Comportamento posizioni invio - - - - Round-robin - A turno - - - - Fastest upload - Invio più veloce - - - - Anti-leech - Anti-scaricatore - - - - Upload choking algorithm - Algoritmo riduzione invio - - - + Confirm torrent recheck Conferma ricontrollo torrent - - Confirm removal of all tags - Conferma rimozione di tutte le etichette - - - - Always announce to all trackers in a tier - Annuncia sempre a tutti i server traccia in un livello + Exchange trackers with other peers + Scambia tracker con altri peer - - Always announce to all tiers - Annuncia sempre a tutti i livelli + + Always announce to all trackers + Annuncia sempre a tutti i tracker - + Any interface i.e. Any network interface Qualsiasi interfaccia - + Save resume data interval How often the fastresume file is saved. Intervallo di salvataggio dati recupero - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - Algoritmo modalità mista %1-TCP - - - + Maximum number of half-open connections [0: Unlimited] Numero massimo di connessioni semiaperte [0: Illimitato] - + IP Address to report to trackers (requires restart) - Indirizzo IP da riportare ai server traccia (richiede il riavvio) + Indirizzo IP da riportare ai tracker (richiede il riavvio) - + Enable embedded tracker - Abilita server traccia integrato + Abilita tracker incorporato - + Embedded tracker port - Porta server traccia integrato + Porta tracker incorporato - + Check for software updates Controlla gli aggiornamenti del programma - + Use system icon theme Usa tema icone di sistema @@ -738,960 +594,764 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 è stato avviato - + Torrent: %1, running external program, command: %2 Torrent: %1, esecuzione programma esterno, comando: %2 - - Torrent name: %1 - Nome torrent: %1 - - - - Torrent size: %1 - Dimensione torrent: %1 - - - - Save path: %1 - Percorso di salvataggio: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Il torrent è stato scaricato in %1. - - - - Thank you for using qBittorrent. - Grazie di usare qBittorrent. - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' è stato scaricato + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrent: %1, comando di esecuzione programma esterno troppo lungo (lunghezza > %2), esecuzione fallita. - + Torrent: %1, sending mail notification Torrent: %1, invio mail di notifica - + Information Informazioni - - To control qBittorrent, access the Web UI at %1 - Per controllare qBittorrent, accedi all'interfaccia web su %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + Per controllare qBittorrent, accedi all'interfaccia web su http://localhost:%1 - + The Web UI administrator user name is: %1 Il nome amministratore dell'interfaccia web è: %1 - + The Web UI administrator password is still the default one: %1 La password dell'interfaccia web è ancora quella predefinita: %1 - + This is a security risk, please consider changing your password from program preferences. Questo è un rischio per la sicurezza, per favore prendi in considerazione di cambiare la tua password dalle preferenze. - + Saving torrent progress... Salvataggio avazamento torrent in corso... - - - Portable mode and explicit profile directory options are mutually exclusive - Le opzioni modalità portatile e cartella profilo esplicita sono incompatibili - - - - Portable mode implies relative fastresume - La modalità portatile implica recupero veloce relativo - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - Il tuo IP è stato messo al bando dopo troppi tentativi di autenticazione non riusciti. - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Salva in: RSS Downloader - Scaricatore RSS + Gestore download RSS - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - Lo scaricamento automatico dei torrent RSS è disabilitato! Puoi abilitarlo da impostazioni applicazione. + + Enable Automated RSS Downloader + Attiva gestore download RSS automatico - + Download Rules - Regole di scaricamento + Regole di download - + Rule Definition Definizione regola - + Use Regular Expressions Usa espressioni regolari - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - Il filtro episodi intelligente controllerà il numero di episodio per prevenire lo scaricamento di duplicati. -Supporta i formati:S01E01, 1x1, 2017.01.01 e 01.01.2017 (I formati a data supportano anche - come separatore) - - - - Use Smart Episode Filter - Usa filtro episodi intelligente - - - + Must Contain: Deve contenere: - + Must Not Contain: Non deve contenere: - + Episode Filter: Filtro episodi: - + Assign Category: Assegna Categoria: - + Save to a Different Directory Salva in una cartella differente - + Ignore Subsequent Matches for (0 to Disable) ... X days Ignora occorrenze successive per (0 per disabilitare) - + Disabled - Disattivato + Disattivata - + days giorni - + Add Paused: Aggiungi in pausa: - + Use global settings Usa impostazioni globali - + Always Sempre - + Never Mai - + Apply Rule to Feeds: - Applica regola alle fonti: + Applica regola ai feed: - + Matching RSS Articles Articoli RSS corrispondenti - + &Import... &Importa... - + &Export... &Esporta... - + Matches articles based on episode filter. Seleziona gli elementi che corrispondono al filtro episodi. - + Example: Esempio: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match seleziona gli episodi 2, 5, 8 fino a 15, 30 e successivi della prima stagione - + Episode filter rules: Regola per filtrare gli episodi: - + Season number is a mandatory non-zero value Il numero della stagione non può essere pari a zero - + Episode number is a mandatory non-zero value + Il numero dell'episodio non può essere pari a zero + + + Filter must end with semicolon La regola deve terminare con un punto e virgola - + Three range types for episodes are supported: Sono supportarti tre diversi tipi di intervallo: - + Single number: <b>1x25;</b> matches episode 25 of season one Numero singolo:<b>1x25;</b> corrisponde all'episodio 25 della prima stagione - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Intervallo normale: <b>1x25-40;</b> corrisponde agli episodi dal 25 al 40 della prima stagione - - Episode number is a mandatory positive value - Il numero dell'episodio deve essere positivo - - - - Rules - Regole + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Intervallo infinito: <b>1x25-;</b> corrisponde agli episodi 25 e successivi della prima stagione - - Rules (legacy) - Regole (obsolete) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Intervallo infinito: <b>1x25-;</b> corrisponde agli episodi da 25 in su della prima stagione e a tutti gli episodi delle stagioni successive + - + Last Match: %1 days ago Ultima occorrenza: %1 giorni fa - + Last Match: Unknown Ultima occorrenza: Sconosciuto - + New rule name Nuovo nome regola - + Please type the name of the new download rule. - Inserire il nome della nuova regola di scaricamento. + Inserire il nome della nuova regola di download. - - + + Rule name conflict Conflitto nel nome della regola - - + + A rule with this name already exists, please choose another name. Una regola con questo nome esiste già, scegli un nome differente. - + Are you sure you want to remove the download rule named '%1'? - Sei sicuro di voler rimuovere la regola di scaricamento con nome '%1'? + Sei sicuro di voler rimuovere la regola di download con nome '%1'? - + Are you sure you want to remove the selected download rules? - Vuoi rimuovere la regole di scaricamento selezionata? + Vuoi rimuovere la regola di download selezionata? - + Rule deletion confirmation Conferma eliminazione della regola - + Destination directory Cartella destinazione - + Invalid action Azione non valida - + The list is empty, there is nothing to export. - La lista è vuota, non c'è niente da esportare. + L'elenco è vuoto, non c'è niente da esportare. - - Export RSS rules - Esporta regole RSS + + Where would you like to save the list? + Dove vuoi salvare l'elenco? - - + + Rules list (*.rssrules) + Elenco regole (*.rssrules) + + + I/O Error Errore I/O - - Failed to create the destination file. Reason: %1 - Impossibile creare il file destinazione.Motivo: %1 + + Failed to create the destination file + Creazione del file di destinazione non riuscita - - Import RSS rules - Importa regole RSS + + Please point to the RSS download rules file + Indica il file con le regole di download RSS - - Failed to open the file. Reason: %1 - Impossibile aprire il file. Motivo: %1 + + Rules list + Elenco regole - + Import Error Errore di importazione - - Failed to import the selected rules file. Reason: %1 - Impossibile importare il file di regole selezionato. Motivo: %1 + + Failed to import the selected rules file + Importazione del file della regola non riuscita - + Add new rule... Aggiungi nuova regola... - + Delete rule Elimina regola - + Rename rule... Rinomina regola... - + Delete selected rules Elimina regole selezionate - - Clear downloaded episodes... - Azzera episodi scaricati... - - - + Rule renaming Rinominazione regole - + Please type the new rule name Inserire il nuovo nome della regola - - Clear downloaded episodes - Azzera episodi scaricati - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - Sei sicuro di voler azzerare la lista degli episodi scaricati per la regola selezionata? + + Regex mode: use Perl-like regular expressions + Modalità regex: usa espressioni regolari in stile Perl - - Regex mode: use Perl-compatible regular expressions - Modalità regex: usa espressioni regolari Perl - - - - - Position %1: %2 - Posizione %1: %2 - - - + Wildcard mode: you can use - Modalità jolly: puoi usare + - + ? to match any single character - ? corrisponde a qualunque carattere singolo + - + * to match zero or more of any characters - * corrisponde a zero o più caratteri qualsiasi + - + Whitespaces count as AND operators (all words, any order) - Gli spazi contano come operatori AND (tutte le parole, qualsiasi ordine) + - + | is used as OR operator - | è usato come operatore OR + - + If word order is important use * instead of whitespace. - Se l'ordine delle parole è importante usa * invece di uno spazio. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Un'espressione con una clausola %1 (per esempio %2) + - + will match all articles. - corrispondenza per tutti gli articoli. + - + will exclude all articles. - esclude tutti gli articoli. - - - - BanListOptionsDialog - - - List of banned IP addresses - - Ban IP - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Modalità jolly: è possibile utilizzare <ul><li>? per un singolo carattere</li><li>* per indicare zero o più caratteri</li><li>Gli spazi vuoti contano come operatori AND</li></ul> - - Delete - Elimina + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Modalità jolly: è possibile utilizzare <ul><li>? per un singolo carattere</li><li>* per indicare zero o più caratteri</li><li>| è usato come operatore OR</li></ul> + + + BitTorrent::Session - - - Warning - + + Restart is required to toggle PeX support + È richiesto un riavvio per modificare il supporto PeX - - The entered IP address is invalid. - - - - - The entered IP is already banned. - - - - - BitTorrent::Session - - - Restart is required to toggle PeX support - È richiesto un riavvio per modificare il supporto PeX + + Embedded Tracker [ON] + Tracker incorporato [ON] - - Could not get GUID of configured network interface. Binding to IP %1 - Impossibile ottenere GUID dell'interfaccia di rete configurata. Associamento all'IP %1 + + Failed to start the embedded tracker! + Avvio del tracker integrato non riuscito! - - Embedded Tracker [ON] - Server traccia integrato [ON] + + Embedded Tracker [OFF] + Tracker integrato [OFF] - - Failed to start the embedded tracker! - Avvio del server traccia integrato non riuscito! + + '%1' reached the maximum ratio you set. Removing... + '%1' ha raggiunto il massimo rapporto impostato. Lo sto rimuovendo... - - Embedded Tracker [OFF] - Server traccia integrato [OFF] + + '%1' reached the maximum ratio you set. Pausing... + '%1' ha raggiunto il massimo rapporto impostato. Metto in pausa... - + System network status changed to %1 e.g: System network status changed to ONLINE Lo stato di rete di sistema è cambiato in %1 - + ONLINE IN LINEA - + OFFLINE NON IN LINEA - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding La configurazione di rete di %1 è cambiata, aggiornamento associazione di sessione - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. L'indirizzo %1 dell'interfaccia di rete configurata non è valido. - - + Encryption support [%1] Supporto cifratura [%1] - - + FORCED FORZATO - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 non è un indirizzo IP valido ed è stato rifiutato applicando la lista degli indirizzi al bando. - - - - + Anonymous mode [%1] Modalità anonima [%1] - + Unable to decode '%1' torrent file. Impossibile decifrare il file torrent %1. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' - Scaricamento ricorsivo del file '%1' incluso nel torrent '%2' + Download ricorsivo del file '%1' incluso nel torrent '%2' - + Queue positions were corrected in %1 resume files - Le posizioni della coda sono state corrette in %1 file di recupero + - + Couldn't save '%1.torrent' Impossibile salvare %1.torrent - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' è stato rimosso dall'elenco trasferimenti. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' è stato rimosso dall'elenco trasferimenti e dal disco fisso. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '%1' è stato rimosso dell'elenco trasferimenti ma non è stato possibbile eliminare i file. Errore: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. perché %1 è disattivato. - + because %1 is disabled. this peer was blocked because TCP is disabled. perché %1 è disattivato. - + URL seed lookup failed for URL: '%1', message: %2 - Ricerca distributori web non riuscita per l'URL: '%1', messaggio: %2 + Ricerca seed web non riuscita per l'URL: '%1', messaggio: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent non è riuscito a mettersi in ascolto sull'interfaccia %1 sulla porta: %2/%3. Motivo: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' è stato rimosso dall'elenco dei trasferimenti e dal disco fisso. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' è stato rimosso dall'elenco dei trasferimenti. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... - Scaricamento di '%1' in corso... + Download di '%1' in corso... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent sta cercando di mettersi in ascolto su ogni interfaccia sulla porta: %1 - + The network interface defined is invalid: %1 L'interfaccia di rete definita non è valida: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent sta cercando di mettersi in ascolto sull'interfaccia %1 sulla porta: %2 - - Peer ID: - ID nodo: - - - - HTTP User-Agent is '%1' - Lo User-Agent HTTP è '%1' - - - - + DHT support [%1] Supporto DHT [%1] - - - - - - - - - + + + + ON ON - - - - - - - - - + + + + OFF OFF - - + Local Peer Discovery support [%1] - Supporto Ricerca Locale Nodi [%1] - - - - PeX support [%1] - Supporto PeX [%1] - - - - '%1' reached the maximum ratio you set. Removed. - '%1' ha raggiunto il rapporto massimo impostato. Rimosso. - - - - '%1' reached the maximum ratio you set. Paused. - '%1' ha raggiunto il rapporto massimo impostato. Messo in pausa. - - - - '%1' reached the maximum seeding time you set. Removed. - '%1' ha raggiunto il tempo di condivisione massimo impostato. Rimosso. + Supporto Ricerca Locale Peer [%1] - - '%1' reached the maximum seeding time you set. Paused. - '%1' ha raggiunto il tempo di condivisione massimo impostato. Messo in pausa. + Restart is required to toggle Tracker Exchange support + È richiesto un riavvio per modificare il supporto Scambio Tracker - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent non ha trovato un indirizzo locale %1 su cui mettersi in ascolto - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent non è riuscito a mattersi in ascolto su alcuna interfaccia sulla porta: %1. Motivo: %2. - + Tracker '%1' was added to torrent '%2' - Il server traccia '%1' è stato aggiunto al torrent '%2' + Il tracker '%1' è stato aggiunto al torrent '%2' - + Tracker '%1' was deleted from torrent '%2' - Il server traccia '%1' è stato rimosso dal torrent '%2' + Il tracker '%1' è stato rimosso dal torrent '%2' - + URL seed '%1' was added to torrent '%2' - L'URL distributore '%1' è stato aggiunto al torrent '%2' + Il seed URL '%1' è stato aggiunto al torrent '%2' - + URL seed '%1' was removed from torrent '%2' - L'URL distributore '%1' è stato rimosso dal torrent '%2' + Il seed URL '%1' è stato rimosso dal torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. - Impossibile riprendere scaricamento del torrent: '%1'. + Impossibile riprendere il download del torrent: '%1'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Analisi filtro IP completata: sono state applicate %1 regole. - + Error: Failed to parse the provided IP filter. Errore: Impossibile analizzare il filtro IP. - - '%1' restored. - 'torrent name' restored. - - - - + Couldn't add torrent. Reason: %1 Impossibile aggiungere il torrent. Motivo: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' ripreso. (recupero veloce) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' aggiunto all'elenco dei trasferimenti. - + An I/O error occurred, '%1' paused. %2 Si è verificato un errore I/O, '%1' messo in pausa. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Mappatura porta non riuscita, messaggio: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Mappatura porta riuscita, messaggio: %1 - + due to IP filter. this peer was blocked due to ip filter. per via del filtro IP. - + due to port filter. this peer was blocked due to port filter. per via del filtro porta. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. per via di limitazioni nella modalità mista i2p. - + because it has a low port. this peer was blocked because it has a low port. perché ha una porta troppo bassa. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent è correttamente in ascolto sull'interfaccia %1 porta: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 IP esterno: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - creazione nuovo file torrent non riuscita - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - Scarica la prima e l'ultima parte per prime: %1. torrent: '%2' - - - - On - Acceso - - - - Off - Spento - - - - Successfully moved torrent: %1. New path: %2 - Spostamento torrent riuscito: %1. Nuovo percorso: %2 - - - + Could not move torrent: '%1'. Reason: %2 - Spostamento torrent non riuscito: '%1'. Motivo: %2 + Impossibile spostare il torrent: '%1'. Motivo: %2 - + File sizes mismatch for torrent '%1', pausing it. - Dimensioni file per il torrent '%1' non corrispondenti, lo metto in pausa. + La dimensione del file discorda con il torrent "%1", metto in pausa. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - Dati recupero veloce per il torrent '%1' respinti. Motivo: %2. Ricontrollo... + Il recupero veloce del torrent %1 è stato rifiutato. Motivo: %2. Altro tentativo in corso... CategoryFilterModel - + Categories - Categorie + Categorie - + All - Tutti + Tutti - + Uncategorized - Non categorizzati + @@ -1699,42 +1359,147 @@ Add category... - Aggiungi categoria... + Aggiungi categoria... Add subcategory... - Aggiungi sottocategoria... + - Edit category... - Modifica categoria... + Remove category + Rimuovi categoria + + + + Remove unused categories + Rimuovi categorie non usate + + + + Resume torrents + Riprendi i torrent + + + + Pause torrents + Metti in pausa i torrent + + + + Delete torrents + Elimina i torrent + + + + New Category + Nuova Categoria + + + + Category: + Categoria: + + + + Invalid category name + Nome categoria non valido + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Il nome della categoria non può contenere '\'. +Il nome della categoria non può iniziare/finire con '\'. +Il nome della categoria non può contenere una sequenza '//'. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Tutti (0) + + + Uncategorized (0) + Non categorizzati (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Non categorizzati (%1) + + + Add category... + Aggiungi categoria... - Remove category - Rimuovi categoria + Rimuovi categoria - Remove unused categories - Rimuovi categorie inutilizzate + Rimuovi categorie non usate - Resume torrents - Riprendi torrent + Riprendi i torrent - Pause torrents - Metti in pausa torrent + Metti in pausa i torrent - Delete torrents - Elimina torrent + Elimina i torrent + + + New Category + Nuova Categoria + + + Category: + Categoria: + + + Invalid category name + Nome categoria non valido + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Il nome della categoria non può contenere '\'. +Il nome della categoria non può iniziare/finire con '\'. +Il nome della categoria non può contenere una sequenza '//'. + + + All (%1) + this is for the category filter + Tutti (%1) @@ -1774,220 +1539,101 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Conferma cancellazione - - - - Remember choice - - - - - Also delete the files on the hard disk - - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Sei sicuro di voler eliminare "%1" dall'elenco di trasferimento? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - - - - - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - Scarica - - - - No URL entered - - - - - Please type at least one URL. - + Sei sicuro di voler eliminare questi %1 torrent dall'elenco dei trasferimenti? DownloadedPiecesBar - + White: Missing pieces Bianco: Parti mancanti - + Green: Partial pieces Verde: Parti non completate - + Blue: Completed pieces Blu: Parti completate - ExecutionLogWidget + ExecutionLog - + General - Generale + Generali - + Blocked IPs - + IP bloccati - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> è stato bloccato %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - + <font color='red'>%1</font> è stato messo al bando FeedListWidget - + RSS feeds - Fonti RSS + Feed RSS - - - Unread (%1) - Non letti (%1) + + Unread + Non letti FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - Errore durante l'apertura del file di registro. La tenuta registro su file è disabilitata. - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - &Sfoglia... - - - - Choose a file - Caption for file open/save dialog - Scegli un file - - - - Choose a folder - Caption for directory open dialog - Scegli una cartella - - - - Any file - Qualunque file + + An error occured while trying to open the log file. Logging to file is disabled. + Si è verificato un errore durante il tentativo di apertura del file di registro. La registrazione su file è disabilitata. FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - Errore I/O: impossibile aprire il file filtro IP in modalità lettura. - - - - - - IP filter line %1 is malformed. - La riga %1 del file filtro IP è mal definita. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - La riga %1 del file filtro IP è mal definita. L'IP iniziale dell'intervallo è mal definito. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - La riga %1 del file filtro IP è mal definita. L'IP finale dell'intervallo è mal definito. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - La riga %1 del file filtro IP è mal definita. Un IP è IPv4 e l'altro è IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - Eccezione filtro IP sollevata per la riga %1. L'eccezione è: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - Si sono verificati %1 errori di elaborazione IP extra. + + + + I/O Error: Could not open ip filter file in read mode. + Errore I/O. Impossibile aprire il file filtro IP in lettura. - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. Errore di elaborazione. Il file filtro non è un file PeerGuardian P2B valido. @@ -1995,396 +1641,472 @@ GeoIPDatabase - - + + Unsupported database file size. Dimensione file banca dati non supportata. - + Metadata error: '%1' entry not found. Errore nei metadati: voce '%1' non trovata. - + Metadata error: '%1' entry has invalid type. Errore nei metadati: la voce '%1' è di tipo non valido. - + Unsupported database version: %1.%2 Versione banca dati non supportata: %1.%2 - + Unsupported IP version: %1 Versione IP non supportata: %1 - + Unsupported record size: %1 Dimensione record non supportata: %1 - + Invalid database type: %1 Tipo banca dati non valido: %1 - + Database corrupted: no data section found. Banca dati corrotta: impossibile trovare sezione dati. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - Dimensione richiesta Http oltre il limite, chiusura socket. Limite: %ld, IP: %s + + File + File - - Bad Http request, closing socket. IP: %s - Richiesta Http non valida, chiusura socket. IP: %s + + Edit + Modifica - - - HttpServer - + + Help + Aiuto + + + Exit qBittorrent Chiudi qBittorrent - + Only one link per line Solo un collegamento per riga - + + Download + Download + + + Global upload rate limit must be greater than 0 or disabled. - Il limite globale di velocità di invio deve essere maggiore di 0 o disattivato. + Il limite globale di velocità upload deve essere maggiore di 0 o disattivato. - + Global download rate limit must be greater than 0 or disabled. - Il limite globale di velocità di scaricamento deve essere maggiore di 0 o disattivato. + Il limite globale di velocità download deve essere maggiore di 0 o disattivato. - + Alternative upload rate limit must be greater than 0 or disabled. - Il limite alternativo per l'invio deve essere maggiore di 0 o disattivato. + Il limite alternativo per l'upload deve essere maggiore di 0 o disattivato. - + Alternative download rate limit must be greater than 0 or disabled. - Il limite alternativo per lo scaricamento deve essere maggiore di 0 o disattivato. + Il limite alternativo per il download deve essere maggiore di 0 o disattivato. - + Maximum active downloads must be greater than -1. - Il numero massimo di scaricamenti attivi deve essere maggiore di -1. + Il numero massimo di download attivi deve essere maggiore di -1. - + Maximum active uploads must be greater than -1. - Il numero massimo di invii attivi deve essere maggiore di -1. + Il numero massimo di upload attivi deve essere maggiore di -1. - + Maximum active torrents must be greater than -1. Il numero massimo di torrent attivi deve essere maggiore di -1. - + Maximum number of connections limit must be greater than 0 or disabled. Il limite per il numero massimo di connessioni deve essere 0 o disattivato. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Il limite per il numero di connessioni per torrent deve essere 0 o disattivato. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. - Il numero massimo di posizioni in invio deve essere 0 o disattivato. + Il numero massimo di slot in upload deve essere 0 o disattivato. - + Unable to save program preferences, qBittorrent is probably unreachable. Impossibile salvare le preferenze, qBittorrent potrebbe essere irraggiungibile. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent su Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - Nome categoria non valido. -Non usare alcun carattere speciale nel nome della categoria. + + Language + Lingua - - Unknown - Sconosciuto + + The port used for incoming connections must be between 1 and 65535. + La porta usata per le connessioni in entrata deve essere compresa tra 1 e 65535. - - Hard Disk - Disco fisso - - - - Share ratio limit must be between 0 and 9998. - Il limite rapporto di condivisione deve essere tra 0 e 9998. - - - - Seeding time limit must be between 0 and 525600 minutes. - Il limite temporale di condivisione deve essere tra 0 e 525600 minuti. - - - - The port used for incoming connections must be between 1 and 65535. - La porta usata per le connessioni in entrata deve essere compresa tra 1 e 65535. - - - + The port used for the Web UI must be between 1 and 65535. La porta usata per l'interfaccia web deve essere compresa tra 1 e 65535. - + Unable to log in, qBittorrent is probably unreachable. Impossibile effettuare l'accesso, probabilmente qBittorrent non è raggiungibile. - + Invalid Username or Password. Username o password errati. - - Username - Nome utente - - - + Password Password - + Login Login - + + Upload Failed! + Upload non riuscito! + + + Original authors Autori originari - + + Upload limit: + Limite upload: + + + + Download limit: + Limite download: + + + Apply Applica - + Add Aggiungi - + + Category: + Categoria: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Carica Torrent - + + All + Tutti + + + + Downloading + In download + + + + Seeding + In condivisione + + + + Completed + Completati + + + + Resumed + Ripresi + + + + Paused + In pausa + + + + Active + Attivi + + + + Inactive + Inattivi + + + Save files to location: Salva file nel percorso: - + Cookie: Cookie: - + Type folder here Inserisci cartella - + + Run an external program on torrent completion + Esegui un programma esterno al completamento del torrent + + + + Enable bandwidth management (uTP) + Abilita gestione banda (uTP) + + + + Apply rate limit to uTP connections + Applica limiti di velocità alle connessioni uTP + + + + Alternative Global Rate Limits + Limiti alternativi di velocità globale + + + More information Più informazioni - + Information about certificates Informazioni sui certificati - + Save Files to Salva File in - - Set location - Imposta posizione - - - - Limit upload rate - Limita velocità di invio + + Watch Folder + Controlla Cartella - - Limit download rate - Limita velocità di scaricamento + + Default Folder + Cartella Predefinita - - Rename torrent - Rinomina torrent + + from + from time1 to time2 + da - - Unable to create category - + + to + from time1 to time2 + a - + Other... Save Files to: Watch Folder / Default Folder / Other... Altro... - + + Every day + Schedule the use of alternative rate limits on ... + Ogni giorno + + + + Week days + Schedule the use of alternative rate limits on ... + Giorni feriali + + + + Week ends + Schedule the use of alternative rate limits on ... + Fine settimana + + + Monday Schedule the use of alternative rate limits on ... Lunedì - + Tuesday Schedule the use of alternative rate limits on ... Martedì - + Wednesday Schedule the use of alternative rate limits on ... Mercoledì - + Thursday Schedule the use of alternative rate limits on ... Giovedì - + Friday Schedule the use of alternative rate limits on ... Venerdì - + Saturday Schedule the use of alternative rate limits on ... Sabato - + Sunday Schedule the use of alternative rate limits on ... Domenica - + + Downloaded + Is the file downloaded or not? + Scaricato + + + Logout Disconnessione - + + Download from URLs + Scarica da URL + + + Download Torrents from their URLs or Magnet links - Scarica torrent dal loro URL o da collegamento magnet + Scarica Torrent dal loro URL o da collegamento Magnet - + Upload local torrent Carica torrent locale - + Are you sure you want to delete the selected torrents from the transfer list? Sei sicuro di voler eliminare i torrent selezionati dall'elenco trasferimenti? - + Save Salva - + qBittorrent client is not reachable Il client qBittorrent non è raggiungibile - - qBittorrent has been shutdown. - qBittorent è stato chiuso. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Elenco delle sottoreti IP in lista bianca + + HTTP Server + Server HTTP - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Esempio: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Sono supportati i seguenti parametri: - - Add subnet - Aggiungi sottorete + + Torrent path + Percorso torrent - - Delete - Elimina + + Torrent name + Nome torrent - - Error - Errore + + qBittorrent has been shutdown. + qBittorent è stato chiuso. + + + LineEdit - - The entered subnet is invalid. - La sottorete inserita non è valida. + + Clear the text + Pulisci il testo LogListWidget - + Copy Copia - + Clear Azzera @@ -2414,553 +2136,495 @@ On Downloads &Done - &Al termine degli scaricamenti + &Al termine dei download - + &View &Visualizza - + &Options... &Opzioni... - + &Resume &Riprendi - + Torrent &Creator &Creazione di un torrent - + Set Upload Limit... - Imposta limite invio... + Imposta limite upload... - + Set Download Limit... - Imposta limite scaricamento... + Imposta limite download... - + Set Global Download Limit... - Imposta limite globale scaricamento... + Imposta limite globale download... - + Set Global Upload Limit... - Imposta limite globale invio... + Imposta limite globale upload... - + Minimum Priority Priorità minima - + Top Priority Priorità massima - + Decrease Priority Diminuisci priorità - + Increase Priority Aumenta priorità - - + + Alternative Speed Limits Limiti di velocità alternativi - + &Top Toolbar &Barra strumenti superiore - + Display Top Toolbar Mostra barra strumenti superiore - - Status &Bar - &Barra di stato - - - + S&peed in Title Bar &Velocità nella barra del titolo - + Show Transfer Speed in Title Bar Mostra velocità di trasferimento nella barra del titolo - + &RSS Reader &Lettore RSS - + Search &Engine &Motore di ricerca - + L&ock qBittorrent Blocca &qBittorrent - + Do&nate! Fai una do&nazione! - - Close Window - Chiudi finestra - - - + R&esume All R&iprendi tutti - + Manage Cookies... Gestisci Cookie... - + Manage stored network cookies Gestisci cookie di rete memorizzati - + Normal Messages Messaggi Normali - + Information Messages Messaggi Informativi - + Warning Messages Messaggi di Notifica - + Critical Messages Messaggi Critici - + &Log &Registro - + &Exit qBittorrent &Esci da qBittorrent - + &Suspend System &Sospendi - + &Hibernate System Sospendi su &disco - + S&hutdown System Spe&gni - + &Disabled &Disattivato - + &Statistics &Statistiche - + Check for Updates Controlla gli aggiornamenti - + Check for Program Updates Controlla gli aggiornamenti del programma - + &About &Informazioni - + &Pause Metti in &pausa - + &Delete &Elimina - + P&ause All Metti in p&ausa tutti - + &Add Torrent File... &Aggiungi file torrent... - + Open Apri - + E&xit &Esci - + Open URL Apri URL - + &Documentation Gui&da in linea - + Lock Blocca - - - + + + Show Visualizza - + Check for program updates Controlla gli aggiornamenti del programma - + Add Torrent &Link... Aggiungi colle&gamento torrent... - + If you like qBittorrent, please donate! Se ti piace qBittorrent, per favore fai una donazione! - - + Execution Log Registro attività - + Clear the password Azzera la password - + Filter torrent list... Filtra elenco torrent... - + &Set Password &Imposta password - - Preferences - Preferenze - - - + &Clear Password &Azzera password - + Transfers Trasferimenti - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Associazione file torrent - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent non è l'applicazione predefinita per l'apertura di file torrent o collegamenti magnet. Vuoi associare qBittorrent ai file torrent e ai collegamenti magnet? - + Icons Only Solo icone - + Text Only Solo testo - + Text Alongside Icons Testo accanto alle icone - + Text Under Icons Testo sotto le icone - + Follow System Style Segui stile di sistema - - - + + + UI lock password Password di blocco - - - + + + Please type the UI lock password: Inserire la password per il blocco di qBittorrent: - + The password should contain at least 3 characters La password deve contenere almeno 3 caratteri - + Password update Aggiornamento password - + The UI lock password has been successfully updated Aggiornamento password eseguito con successo - + Are you sure you want to clear the password? Sei sicuro di voler azzerare la password? - - Use regular expressions - - - - + Search Ricerca - + Transfers (%1) Trasferimenti (%1) - + Error Errore - + Failed to add torrent: %1 Impossibile aggiungere torrent: %1 - + Torrent added Torrent aggiunto - + '%1' was added. e.g: xxx.avi was added. '%1' è stato aggiunto. - + Download completion - Completamento scaricamento + Completamento download - + I/O Error i.e: Input/Output Error Errore I/O - + Recursive download confirmation - Conferma ricorsiva di scaricamento + Conferma ricorsiva di download - + Yes - + No No - + Never Mai - + Global Upload Speed Limit - Limite globale invio + Limite globale upload - + Global Download Speed Limit - Limite globale scaricamento - - - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent è stato appena aggiornato e bisogna riavviarlo affinché i cambiamenti siano effettivi. + Limite globale download - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - Alcuni file sono in trasferimento. - - - - Are you sure you want to quit qBittorrent? - Sei sicuro di voler uscire da qBittorrent? - - - + &No &No - + &Yes &Sì - + &Always Yes Sem&pre sì - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter Interprete Python troppo vecchio - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. La versione (%1) di Python è troppo vecchia. Aggiorna all'ultima versione o almeno 2.7.9/3.3.0 per far funzionare i motori di ricerca. - + qBittorrent Update Available È disponibile un aggiornamento per qBittorrent - + + A new version is available. +Do you want to download %1? + Nuova versione disponibile. +Vuoi scaricare %1? + + + Already Using the Latest qBittorrent Version Stai già usando l'ultima versione di qBittorrent - + Undetermined Python version Versione Python non determinata - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. %1 è stato scaricato. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2969,158 +2633,154 @@ Motivo: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? - Il torrent "%1" contiene file torrent, vuoi procedere allo scaricamento di questi file? + Il torrent "%1" contiene files torrent, vuoi procedere al download di questi file? - + Couldn't download file at URL '%1', reason: %2. Impossibile scaricare file dall'URL: %1, motivo: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin Trovato Python in %1: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + Impossibile determinare la versione di Python (%1). Motore di ricerca disattivato. + + + + Missing Python Interpreter Manca l'interprete Python - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Python è necessario per poter usare il motore di ricerca, ma non risulta installato. Vuoi installarlo ora? - + Python is required to use the search engine but it does not seem to be installed. Python è necessario per poter usare il motore di ricerca, ma non risulta installato. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. Nessun aggiornamento disponibile. Stai già usando l'ultima versione. - + &Check for Updates &Controlla gli aggiornamenti - + Checking for Updates... Controllo aggiornamenti in corso... - + Already checking for program updates in the background Controllo aggiornamenti già attivo in background - + Python found in '%1' Trovato Python in '%1' - + Download error - Errore scaricamento + Errore download - + Python setup could not be downloaded, reason: %1. Please install it manually. Il setup di Python non è stato scaricato, motivo: %1. Per favore installalo manualmente. - - + + Invalid password Password non valida - - - + + RSS (%1) RSS (%1) - + URL download error - Errore scaricamento URL + Errore download URL - + The password is invalid La password non è valida - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Velocità DL: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Velocità UP: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [D: %1, U: %2] qBittorrent %3 - + Hide Nascondi - + Exiting qBittorrent Uscire da qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Alcuni file sono ancora in trasferimento. +Chiudere qBittorrent? + + + Open Torrent Files Apri file torrent - + Torrent Files File torrent - + Options were saved successfully. Le opzioni sono state salvate. @@ -3128,52 +2788,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. Il tuo DNS dinamico è stato aggiornato con successo. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Errore DNS dinamico: Il servizio è momentaneamente indisponibile, nuovo tentativo fra 30 minuti. - + Dynamic DNS error: hostname supplied does not exist under specified account. Errore DNS dinamico: il nome host fornito non esiste per l'account indicato. - + Dynamic DNS error: Invalid username/password. Errore DNS dinamico: Nome utente/password non validi. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Errore DNS dinamico: qBittorrent è stato messo al bando dal servizio, per favore segnala un bug su http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Errore DNS dinamico: Il servizio ha risposto %1, per favore segnala un bug su http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Errore DNS dinamico: Il tuo nome utente è stato bloccato per abuso. - + Dynamic DNS error: supplied domain name is invalid. Errore DNS dinamico: il dominio indicato non è valido. - + Dynamic DNS error: supplied username is too short. Errore DNS dinamico: il nome utente specificato è troppo corto. - + Dynamic DNS error: supplied password is too short. Errore DNS dinamico: la password specificata è troppo corta. @@ -3181,1413 +2841,1303 @@ Net::DownloadHandler - + I/O Error Errore I/O - + The file size is %1. It exceeds the download limit of %2. - La dimensione del file è %1. Oltrepassa il limite scaricamento di %2. + La dimensione del file è %1. Oltrepassa il limite download di %2. - + Unexpected redirect to magnet URI. Redirezione imprevista all'URI magnet. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - + + + GeoIP database loaded. Type: %1. Build time: %2. + Banca dati GeoIP caricata. Tipo: %1. Data di creazione: %2. - - The operation was canceled - + + + Couldn't load GeoIP database. Reason: %1 + Impossibile caricare la banca dati GeoIP. Motivo: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - + + Venezuela, Bolivarian Republic of + Repubblica Bolivariana di Venezuela - - The connection to the remote server timed out - + + Viet Nam + Vietnam - - SSL/TLS handshake failed - + + + N/A + N/D - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - Banca dati GeoIP caricata. Tipo: %1. Data di creazione: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - Impossibile caricare la banca dati GeoIP. Motivo: %1 - - - - Venezuela, Bolivarian Republic of - Repubblica Bolivariana di Venezuela - - - - Viet Nam - Vietnam - - - - - N/A - N/D - - - + Andorra Andorra - + United Arab Emirates Emirati Arabi Uniti - + Afghanistan Afghanistan - + Antigua and Barbuda Antigua e Barbuda - + Anguilla Anguilla - + Albania Albania - + Armenia Armenia - + Angola Angola - + Antarctica Antartide - + Argentina Argentina - + American Samoa Samoa Americane - + Austria Austria - + Australia Australia - + Aruba Aruba - + Azerbaijan Azerbaijan - + Bosnia and Herzegovina Bosnia ed Herzegovina - + Barbados Barbados - + Bangladesh Bangladesh - + Belgium Belgio - + Burkina Faso Burkina Faso - + Bulgaria Bulgaria - + Bahrain Bahrain - + Burundi Burundi - + Benin Benin - + Bermuda Bermuda - + Brunei Darussalam Sultanato del Brunei - + Brazil Brasile - + Bahamas Bahamas - + Bhutan Butan - + Bouvet Island Isola Bouvet - + Botswana Botswana - + Belarus Bielorussia - + Belize Belize - + Canada Canada - + Cocos (Keeling) Islands Isole Cocos (Keeling) - + Congo, The Democratic Republic of the Repubblica Democratica del Congo - + Central African Republic Repubblica Centrafricana - + Congo Congo - + Switzerland Svizzera - + Cook Islands Isole Cook - + Chile Cile - + Cameroon Camerun - + China Cina - + Colombia Colombia - + Costa Rica Costa Rica - + Cuba Cuba - + Cape Verde Capo Verde - + Curacao Curaçao - + Christmas Island Isola di Natale - + Cyprus Cipro - + Czech Republic Repubblica Ceca - + Germany Germania - + Djibouti Gibuti - + Denmark Danimarca - + Dominica Dominica - + Dominican Republic Repubblica Dominicana - + Algeria Algeria - + Ecuador Ecuador - + Estonia Estonia - + Egypt Egitto - + Western Sahara Sahara Occidentale - + Eritrea Eritrea - + Spain Spagna - + Ethiopia Etiopia - + Finland Finlandia - + Fiji Fiji - + Falkland Islands (Malvinas) Isole Falkland (Malvinas) - + Micronesia, Federated States of Stati Federati di Micronesia - + Faroe Islands Isole Faroe - + France Francia - + Gabon Gabon - + United Kingdom Regno Unito - + Grenada Grenada - + Georgia Georgia - + French Guiana Guyana Francese - + Ghana Ghana - + Gibraltar Gibilterra - + Greenland Groenlandia - + Gambia Gambia - + Guinea Guinea - + Guadeloupe Guadalupe - + Equatorial Guinea Guinea Equatoriale - + Greece Grecia - + South Georgia and the South Sandwich Islands Georgia del Sud e Isole Sandwich Meridionali - + Guatemala Guatemala - + Guam Guam - + Guinea-Bissau Guinea-Bissau - + Guyana Guyana - + Hong Kong Hong Kong - + Heard Island and McDonald Islands Isole Heard e McDonald - + Honduras Honduras - + Croatia Croazia - + Haiti Haiti - + Hungary Ungheria - + Indonesia Indonesia - + Ireland Irlanda - + Israel Israele - + India India - + British Indian Ocean Territory Territorio britannico dell'Oceano Indiano - + Iraq Iraq - + Iran, Islamic Republic of Iran - + Iceland Islanda - + Italy Italia - + Jamaica Giamaica - + Jordan Giordania - + Japan Giappone - + Kenya Kenya - + Kyrgyzstan Kirgyzistan - + Cambodia Cambogia - + Kiribati Kiribati - + Comoros Comore - + Saint Kitts and Nevis Saint Kitts e Nevis - + Korea, Democratic People's Republic of Repubblica Democratica Popolare di Corea - + Korea, Republic of Repubblica di Corea - + Kuwait Kuwait - + Cayman Islands Isole Cayman - + Kazakhstan Kazakistan - + Lao People's Democratic Republic Repubblica Popolare Democratica del Laos - + Lebanon Libano - + Saint Lucia Santa Lucia - + Liechtenstein Liechtenstein - + Sri Lanka Sri Lanka - + Liberia Liberia - + Lesotho Lesotho - + Lithuania Lituania - + Luxembourg Lussemburgo - + Latvia Lettonia - + Morocco Marocco - + Monaco Monaco - + Moldova, Republic of Moldova - + Madagascar Madagascar - + Marshall Islands Isole Marshall - + Mali Mali - + Myanmar Myanmar - + Mongolia Mongolia - + Northern Mariana Islands Isole Marianne Settentrionali - + Martinique Martinica - + Mauritania Mauritania - + Montserrat Montserrat - + Malta Malta - + Mauritius Mauritius - + Maldives Maldive - + Malawi Malawi - + Mexico Messico - + Malaysia Malesia - + Mozambique Mozambico - + Namibia Namibia - + New Caledonia Nuova Caledonia - + Niger Niger - + Norfolk Island Isola Norfolk - + Nigeria Nigeria - + Nicaragua Nicaragua - + Netherlands Paesi Bassi - + Norway Norvegia - + Nepal Nepal - + Nauru Nauru - + Niue Niue - + New Zealand Nuova Zelanda - + Oman Oman - + Panama Panama - + Peru Perù - + French Polynesia Polinesia Francese - + Papua New Guinea Papua Nuova Guinea - + Philippines Filippine - + Pakistan Pakistan - + Poland Polonia - + Saint Pierre and Miquelon Saint-Pierre e Miquelon - + Puerto Rico Porto Rico - + Portugal Portogallo - + Palau Palau - + Paraguay Paraguay - + Qatar Qatar - + Reunion Riunione - + Romania Romania - + Russian Federation Russia - + Rwanda Rwanda - + Saudi Arabia Arabia Saudita - + Solomon Islands Isole Solomon - + Seychelles Seychelles - + Sudan Sudan - + Sweden Svezia - + Singapore Singapore - + Slovenia Slovenia - + Svalbard and Jan Mayen Svalbard e Jan Mayen - + Slovakia Slovacchia - + Sierra Leone Sierra Leone - + San Marino San Marino - + Senegal Senegal - + Somalia Somalia - + Suriname Suriname - + Sao Tome and Principe São Tomé e Principe - + El Salvador El Salvador - + Syrian Arab Republic Repubblica Araba di Siria - + Swaziland Swaziland - + Turks and Caicos Islands Turks e Caicos - + Chad Chad - + French Southern Territories Territori Francesi del Sud - + Togo Togo - + Thailand Thailandia - + Tajikistan Tajikistan - + Tokelau Tokelau - + Turkmenistan Turkmenistan - + Tunisia Tunisia - + Tonga Tonga - - Could not decompress GeoIP database file. - Impossibile decomprimere il file banca dati GeoIP. - - - + Timor-Leste Timor Est - + Bolivia, Plurinational State of Stato plurinazionale della Bolivia - + Bonaire, Sint Eustatius and Saba Bonaire, Sint Eustatius e Saba - + Cote d'Ivoire Costa d'Avorio - + Libya Libia - + Saint Martin (French part) Saint Martin (parte francese) - + Macedonia, The Former Yugoslav Republic of Repubblica di Macedonia - + Macao Macao - + Pitcairn Pitcairn - + Palestine, State of Stato di Palestina - + Saint Helena, Ascension and Tristan da Cunha Sant'Elena, Ascensione e Tristan da Cunha - + South Sudan Sudan del Sud - + Sint Maarten (Dutch part) Sint Maarten (parte olandese) - + Turkey Turchia - + Trinidad and Tobago Trinidad e Tobago - + Tuvalu Tuvalu - + Taiwan Taiwan - + Tanzania, United Republic of Repubblica Unita di Tanzania - + Ukraine Ucraina - + Uganda Uganda - + United States Minor Outlying Islands Isole Minori Esterne degli Stati Uniti - + United States Stati Uniti - + Uruguay Uruguay - + Uzbekistan Uzbekistan - + Holy See (Vatican City State) Santa Sede (Stato della Città del Vaticano) - + Saint Vincent and the Grenadines Saint Vincent e Grenadine - + Virgin Islands, British Isole Vergini britanniche - + Virgin Islands, U.S. Isole Vergini americane. - + Vanuatu Vanatu - + Wallis and Futuna Wallis e Futuna - + Samoa Samoa - + Yemen Yemen - + Mayotte Mayotte - + Serbia Serbia - + South Africa Sud Africa - + Zambia Zambia - + Montenegro Montenegro - + Zimbabwe Zimbabwe - + Aland Islands Isole Aland - + Guernsey Guernsey - + Isle of Man Isola di Man - + Jersey Jersey - + Saint Barthelemy Saint-Barthélemy - + + Could not uncompress GeoIP database file. + Impossibile estrarre il file banca dati GeoIP. + + + Couldn't save downloaded GeoIP database file. Impossibile salvare il file banca dati GeoIP scaricato. - + Successfully updated GeoIP database. Banca dati GeoIP aggiornata correttamente. - + Couldn't download GeoIP database file. Reason: %1 Impossibile scaricare il file banca dati GeoIP. Motivo: %1 @@ -4595,12 +4145,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] Supporto UPnP / NAT-PMP [ON] - + UPnP / NAT-PMP support [OFF] Supporto UPnP / NAT-PMP [OFF] @@ -4608,7 +4158,7 @@ Net::Smtp - + Email Notification Error: Errore nella notifica email: @@ -4616,1280 +4166,1077 @@ OptionsDialog - + Options Opzioni - + Behavior Comportamento - + Downloads - Scaricamenti + Download - + Connection Connessione - + Speed Velocità - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI Interfaccia web - + Advanced Avanzate - + Language Lingua - + User Interface Language: Lingua Interfaccia Utente: - + (Requires restart) (Richiede il riavvio) - + Transfer List Elenco Trasferimenti - + Confirm when deleting torrents Conferma eliminazione torrent - + Use alternating row colors In transfer list, one every two rows will have grey background. Usa colori di riga alternati - + Hide zero and infinity values Nascondi valori zero ed infinito - + Always Sempre - + Paused torrents only Solo torrent in pausa - + Action on double-click Azioni con il doppio clic - + Downloading torrents: Scaricamento torrent: - - + + Start / Stop Torrent Avvia / Arresta Torrent - - + + Open destination folder Apri cartella di destinazione - - + + No action Nessuna azione - + Completed torrents: Torrent completati: - + Desktop Desktop - + Start qBittorrent on Windows start up Esegui qBittorent all'avvio di Windows - + Show splash screen on start up Mostra schermata d'avvio all'esecuzione del programma - + Start qBittorrent minimized Avvia qBittorrent minimizzato - + Confirmation on exit when torrents are active Conferma uscita quando ci sono torrent attivi - + Confirmation on auto-exit when downloads finish Conferma uscita automatica a scaricamento completato - - KiB - KiB - - - - Email notification &upon download completion - &Notifica email al completamento dello scaricamento - - - - Run e&xternal program on torrent completion - Lancia programma e&sterno al completamento del torrent - - - - IP Fi&ltering - Fi&ltraggio IP - - - - Schedule &the use of alternative rate limits - Pianifica l'&uso di limiti di rapporto alternativi - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Più informazioni</a>) - - - - &Torrent Queueing - Accodamento &torrent - - - - Seed torrents until their seeding time reaches - Condividi torrent fino al raggiungimento del tempo di condivisione - - - - A&utomatically add these trackers to new downloads: - Aggiungi a&utomaticamente questi server traccia ai nuovi scaricamenti: - - - - RSS Reader - Lettore RSS - - - - Enable fetching RSS feeds - Abilita recupero fonti RSS - - - - Feeds refresh interval: - Intervallo aggiornamento fonti: - - - - Maximum number of articles per feed: - Numero massimo di articoli per fonte: - - - - - min - minutes - min - - - - RSS Torrent Auto Downloader - Scaricatore automatico torrent RSS - - - - Enable auto downloading of RSS torrents - Abilita scaricamento automatico di torrent RSS - - - - Edit auto downloading rules... - Modifica regole scaricamento automatico... + + Show qBittorrent in notification area + Mostra qBittorrent nell'area di notifica - - Web User Interface (Remote control) - Interfaccia utente web (Controllo remoto) - - - - IP address: - Indirizzo IP: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - Indirizzo IP a cui l'interfaccia web si assocerà. -Specificare un indirizzo IPv4 o IPv6. Si può usare "0.0.0.0" per qualsiasi indirizzo IPv4, -"::" per qualsiasi indirizzo IPv6, o "*" sia per IPv4 che IPv6. - - - - Server domains: - Domini server: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - Lista bianca per filtrare valori nell'intestazione host HTTP. -Per difendersi da attacchi DSN rebinding, dovresti inserire -i nomi dominio usati dal server dell'interfaccia web. - -Usa ';' per dividere voci multiple. Si può usare il carattere -jolly '*'. - - - - &Use HTTPS instead of HTTP - &Usa HTTPS invece di HTTP - - - - Bypass authentication for clients on localhost - Salta autenticazione per i client in localhost - - - - Bypass authentication for clients in whitelisted IP subnets - Salta autenticazione per i client nelle sottoreti IP in lista bianca - - - - IP subnet whitelist... - Lista bianca sottoreti IP... - - - - Upda&te my dynamic domain name - Aggio&rna il mio nome dominio dinamico - - - + Minimize qBittorrent to notification area Minimizza qBittorrent nell'area di notifica - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. Chiudi qBittorrent nell'area di notifica - + Tray icon style: Stile icona di sistema: - + Normal Normale - + Monochrome (Dark theme) Monocromatico (Tema scuro) - + Monochrome (Light theme) Monocromatico (Tema chiaro) - + File association Associazione file - + Use qBittorrent for .torrent files Usa qBittorrent per i file .torrent - + Use qBittorrent for magnet links Usa qBittorrent per i collegamenti magnet - + Power Management Opzioni Risparmio Energia - + + Inhibit system sleep when torrents are active + Inibisci sospensione del sistema quando i torrent sono attivi + + + + Log file + File di registro + + + Save path: Percorso di salvataggio: - + Backup the log file after: Fai un backup del file di registro dopo: - + + MB + MB + + + Delete backup logs older than: Elimina registri di backup più vecchi di: - + days Delete backup logs older than 10 months giorni - + months Delete backup logs older than 10 months mesi - + years Delete backup logs older than 10 years anni - + When adding a torrent All'aggiunta di un torrent - + + Display torrent content and some options + Mostra il contenuto del torrent ed alcune opzioni + + + Bring torrent dialog to the front Finestra torrent in primo piano - + Do not start the download automatically The torrent will be added to download list in pause state - Non avviare lo scaricamento automaticamente + Non avviare il download automaticamente - + Should the .torrent file be deleted after adding it Elimina file .torrent dopo averlo aggiunto - + + Delete .torrent files afterwards + Elimina file .torrent successivamente + + + Also delete .torrent files whose addition was cancelled Elimina i file .torrent anche se l'aggiunta è stata annullata - + Also when addition is cancelled Anche se l'aggiunta è annullata - + Warning! Data loss possible! Attenzione! Possibile perdita di dati! - + Saving Management Gestione Salvataggi - + Default Torrent Management Mode: Modalità Gestione Torrent Predefinita: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category Nella modalità automatica varie proprietà del torrent (per esempio il percorso di salvataggio) verranno decise in base alla categoria associata - + Manual Manuale - + Automatic Automatica - + When Torrent Category changed: Quando la Categoria del Torrent viene cambiata: - + Relocate torrent Sposta torrent - + Switch torrent to Manual Mode Imposta torrent sulla Modalità Manuale - + When Default Save Path changed: Quando il Percorso di Salvataggio Predefinito viene cambiato: - - + + Relocate affected torrents Sposta torrent interessati - - + + Switch affected torrents to Manual Mode Imposta i torrent interessati sulla Modalità Manuale - + When Category changed: Quando la Categoria viene cambiata: - + Use Subcategories Usa Sottocategorie - + Default Save Path: Percorso di Salvataggio Predefinito: - + Keep incomplete torrents in: Salva torrent incompleti in: - + Copy .torrent files to: Copia i file .torrent in: - - Show &qBittorrent in notification area - Mostra &qBittorrent nell'area di notifica - - - - &Log file - Fi&le registro - - - - Display &torrent content and some options - Mostra contenuto &torrent e alcune opzioni - - - - Create subfolder for torrents with multiple files - Crea sottocartella per i torrent con file multipli - - - - De&lete .torrent files afterwards - E&limina file .torrent alla fine - - - + Copy .torrent files for finished downloads to: - Copia i file .torrent per gli scaricamenti completati in: + Copia i file .torrent per i download completati in: - + Pre-allocate disk space for all files Prealloca lo spazio su disco per tutti i file - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding - - - - + Append .!qB extension to incomplete files Aggiungi l'estensione .!qB ai file incompleti - - Enable recursive download dialog - - - - + Automatically add torrents from: Aggiungi automaticamente i torrent da: - + Add entry Aggiungi voce - + Remove entry Rimuovi voce - + + Email notification upon download completion + Notifica email al completamento del download + + + + Destination email: + Email destinazione: + + + SMTP server: Server SMTP: - + This server requires a secure connection (SSL) Questo server richiede una connessione sicura (SSL) - - + + + Authentication Autenticazione - - - - + + + + Username: Nome utente: - - - - + + + + Password: Password: - - Enabled protocol: - Protocollo abilitato: - - - - TCP and μTP - TCP e µTP + + Run external program on torrent completion + Esegui un programma esterno a download completato - + Listening Port Porta di Ascolto - + Port used for incoming connections: Porta usata per le connessioni in entrata: - + Random Casuale - + Use UPnP / NAT-PMP port forwarding from my router Usa UPnP / NAT-PMP per aprire le porte del mio router - + Use different port on each startup Usa porte diverse ad ogni avvio - + Connections Limits Limiti Connessioni - + Maximum number of connections per torrent: Numero massimo di connessioni per torrent: - + Global maximum number of connections: Numero massimo globale di connessioni: - + Maximum number of upload slots per torrent: - Numero massimo di connessioni in invio per torrent: + Numero massimo di connessioni in upload per torrent: - + Global maximum number of upload slots: - Numero massimo globale di connessioni in invio: + Numero massimo globale di connessioni in upload: - + Proxy Server Server Proxy - + Type: Tipo: - + (None) (Nessuno) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Host: - - + + Port: Porta: - + Otherwise, the proxy server is only used for tracker connections - Altrimenti, il server proxy è usato solamente per le connessioni ai server traccia + Altrimenti, il server proxy è usato solamente per le connessioni ai tracker - + Use proxy for peer connections - Usa il proxy per le connessioni ai nodi + Usa il proxy per le connessioni ai peer - + Disable connections not supported by proxies Disabilita connessioni non supportate dai proxy - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Più informazioni</a>) - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - Fonti RSS, motori di ricerca, aggiornamenti software o qualunque altra cosa al di fuori dei trasferimenti torrent e operazioni annesse (quali scambio nodi) useranno una connessione diretta + Feed RSS, motori di ricerca, aggiornamenti software o qualunque altra cosa al di fuori dei trasferimenti torrent e operazioni annesse (quali scambio peer) useranno una connessione diretta - + Use proxy only for torrents Usa il proxy solo per i torrent - - A&uthentication - A&utenticazione - - - + Info: The password is saved unencrypted Info: La password è salvata in chiaro - + + IP Filtering + Filtraggio IP + + + Filter path (.dat, .p2p, .p2b): Percorso filtro (.dat, .p2p, p2b): - + Reload the filter Ricarica il filtro - - Manually banned IP addresses... - Indirizzi IP messi al bando manualmente... - - - + Apply to trackers - Applica ai server traccia + Applica ai tracker - + Global Rate Limits Limiti di velocità globali - - - - - - - KiB/s - KiB/s + + + Upload: + Upload: - - - Upload: - Invio: + + + + + KiB/s + KiB/s - - + + Download: - Scaricamento: + Download: - + Alternative Rate Limits Limiti di velocità alternativi - - + + Schedule the use of alternative rate limits + Pianifica l'uso dei limti di velocità alternativi + + + From: from (time1 to time2) Da: - - + To: time1 to time2 A: - + When: Quando: - + Every day Ogni giorno - + Weekdays Giorni feriali - + Weekends Fine settimana - + Rate Limits Settings Impostazioni limiti di velocità - + Apply rate limit to peers on LAN - Applica limiti di velocità ai nodi in LAN + Applica limiti di velocità ai peer in LAN - + Apply rate limit to transport overhead Applica limiti di velocità al traffico di servizio - - + + + Enable µTP protocol + Attiva protocollo µTP + + + Apply rate limit to µTP protocol Applica limiti di velocità al protocollo µTP - + Privacy Privacy - + Enable DHT (decentralized network) to find more peers - Abilita DHT (rete decentralizzata) per trovare più nodi + Abilita DHT (rete decentralizzata) per trovare più peer - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - Scambia nodi con client Bittorrent compatibili (µTorrent, Vuze, ...) + Scambia peer con client Bittorrent compatibili (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers - Abilita Scambio Nodi (PeX) per trovare più nodi + Abilita Scambio Peer (PeX) per trovare più peer - + Look for peers on your local network - Cerca nodi nella rete locale + Cerca peer nella rete locale - + Enable Local Peer Discovery to find more peers - Abilita Ricerca Locale Nodi per trovare più nodi + Abilita Ricerca Locale Peer per trovare più peer - + Encryption mode: Modalità di cifratura: - + Prefer encryption Preferisci cifratura - + Require encryption Esigi cifratura - + Disable encryption Disabilita cifratura - + Enable when using a proxy or a VPN connection Attiva quando viene usato un proxy o una connessione VPN - + Enable anonymous mode Abilita modalità anonima - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Più informazioni</a>) + + + + Torrent Queueing + Accodamento torrent + + + Maximum active downloads: - Numero massimo di scaricamenti attivi: + Numero massimo di download attivi: - + Maximum active uploads: - Numero massimo di invii attivi: + Numero massimo di upload attivi: - + Maximum active torrents: Numero massimo di torrent attivi: - + Do not count slow torrents in these limits Non contare torrent lenti in questi limiti - - Upload rate threshold: - Soglia limite di invio: - - - - Download rate threshold: - Soglia limite di scaricamento: - - - - sec - seconds - s - - - - Torrent inactivity timer: - Cronometro inattività torrent: - - - + Share Ratio Limiting Limitazione rapporto di condivisione - + Seed torrents until their ratio reaches Distribuisci i torrent finché il loro rapporto raggiunge - + then poi - + Pause them Mettili in pausa - + Remove them Rimuovili - - RSS Smart Episode Filters - Filtri episodio intelligenti RSS + + Automatically add these trackers to new downloads: + Aggiungi automaticamente questi tracker ai nuovi download: - + + Enable Web User Interface (Remote control) + Abilita interfaccia web (controllo remoto) + + + Use UPnP / NAT-PMP to forward the port from my router Usa UPnP / NAT-PMP per aprire le porte del mio router - + + Use HTTPS instead of HTTP + Usa HTTPS invece di HTTP + + + Certificate: Certificato: - + Import SSL Certificate Importa certificato SSL - + Key: Chiave: - + Import SSL Key Importa chiave SSL - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Informazioni sui certificati</a> - - Use alternative Web UI - Usa interfaccia web alternativa - - - - Files location: - Posizione file: - - - - Enable clickjacking protection - + + Bypass authentication for localhost + Aggira autenticazione per host locale - - Enable Cross-Site Request Forgery (CSRF) protection - + + Update my dynamic domain name + Aggiorna il nome del mio dominio dinamico - + Service: Servizio: - + Register Registra - + Domain name: Nome dominio: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! Abilitando queste opzioni puoi <strong>perdere irrimediabilmente</strong> i tuoi file .torrent! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - Se queste opzioni sono abilitate, qBittorrent <strong>cancellerà</strong> i file .torrent dopo che essi sono stati aggiunti con successo (la prima opzione) o no (la seconda opzione) all'elenco dei traferimenti. Questo sarà applicato <strong>non solo</strong> ai file aperti tramite &ldquo;Aggiungi torrent&rdquo;, ma anche a quelli aperti tramite <strong>associazione file</strong> + Se queste opzioni sono abilitate, qBittorrent <strong>cancellerà</strong> i file .torrent dopo che essi siano stati aggiunti con successo (la prima opzione) o no (la seconda opzione) all'elenco dei traferimenti. Questo sarà applicato <strong>non solo</strong> ai file aperti tramite &ldquo;Aggiungi torrent&rdquo;, ma anche a quelli aperti tramite <strong>associazione file</strong> - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog Se abiliti la seconda opzione (&ldquo;Anche quando l'aggiunta viene annullata&rdquo;) il file .torrent <strong>verrà cancellato</strong> anche se premi &ldquo;<strong>Annulla</strong>&rdquo; nella finestra di dialogo &ldquo;Aggiungi torrent&rdquo; - - Choose Alternative UI files location - Scegli posizione alternativa file interfaccia - - - + Supported parameters (case sensitive): Parametri supportati (maiuscole/minuscole): - + %N: Torrent name %N: Nome torrent - + %L: Category %L: Categoria - - %G: Tags (seperated by comma) - %G: Etichette (separate da virgole) - - - + %F: Content path (same as root path for multifile torrent) %F: Percorso contenuto (uguale al percorso radice per i torrent multi-file) - + %R: Root path (first torrent subdirectory path) %R: Percorso radice (primo percorso sottocartella torrent) - + %D: Save path %D: Percorso salvataggio - + %C: Number of files %C: Numero di file - + %Z: Torrent size (bytes) %Z: Dimensione torrent (byte) - + %T: Current tracker - %T: Server traccia attuale + %T: Tracker attuale - + %I: Info hash %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") Suggerimento: Incapsula i parametri con i segni di quotazione per evitare tagli del testo negli spazi bianchi (per esempio "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - Un torrent sarà considerato lento se le sue velocità di scaricamento e invio resteranno sotto questi valori per "Cronometro inattività torrent" secondi - - - + Select folder to monitor Seleziona cartella da monitorare - + Folder is already being monitored: La cartella viene già monitorata: - + Folder does not exist: La cartella non esiste: - + Folder is not readable: La cartella è illeggibile: - + Adding entry failed Aggiunta voce non riuscita - - - - + + Choose export directory Scegli cartella di esportazione - - - + + + + + + Choose a save directory Scegli una cartella di salvataggio - + Choose an IP filter file Scegli un file filtro IP - + All supported filters Tutti i filtri supportati - + SSL Certificate Certificato SSL - + + SSL Key + Chiave SSL + + + Parsing error - Errore di elaborazione + Errore di analisi - + Failed to parse the provided IP filter Impossibile analizzare il filtro IP fornito - + Successfully refreshed Aggiornato con successo - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Filtro IP analizzato con successo: sono state applicate %1 regole. - + Invalid key Chiave non valida - + This is not a valid SSL key. Questa non è una chiave SSL valida. - + Invalid certificate Certificato non valido - - Preferences - Preferenze - - - - Import SSL certificate - Importa certificato SSL - - - + This is not a valid SSL certificate. Questo non è un certificato SSL valido. - - Import SSL key - Importa chiave SSL - - - - SSL key - Chiave SSL - - - + Time Error Errore Orario - + The start time and the end time can't be the same. Gli orari di inizio e fine non possono coincidere. - - + + Length Error Errore di Lunghezza - + The Web UI username must be at least 3 characters long. Il nome utente per l'interfaccia web deve essere lungo almeno 3 caratteri. - + The Web UI password must be at least 6 characters long. La password per l'interfaccia web deve essere lunga almeno 6 caratteri. @@ -5897,266 +5244,251 @@ PeerInfo - - Interested(local) and Choked(peer) - Interessato(locale) e non servito(nodo) + + interested(local) and choked(peer) + interessato(locale) e non servito(peer) - + interested(local) and unchoked(peer) - interessato(locale) e servito(nodo) + interessato(locale) e servito(peer) - + interested(peer) and choked(local) - interessato(nodo) e non servito(locale) + interessato(peer) e non servito(locale) - + interested(peer) and unchoked(local) - interessato(nodo) e servito(locale) + interessato(peer) e servito(locale) - + optimistic unchoke servizio ottimistico - + peer snubbed - nodo ignorato + peer ignorato - + incoming connection connessione in entrata - + not interested(local) and unchoked(peer) - non interessato(locale) e servito(nodo) + non interessato(locale) e servito(peer) - + not interested(peer) and unchoked(local) - non interessato(nodo) e servito(locale) + non interessato(peer) e servito(locale) - + peer from PEX - nodo da PEX + peer da PEX - + peer from DHT - nodo da DHT + peer da DHT - + encrypted traffic traffico cifrato - + encrypted handshake negoziazione cifrata - + peer from LSD - nodo da LSD + peer da LSD PeerListWidget - + IP IP - + Port Porta - + Flags Flag - + Connection Connessione - + Client i.e.: Client application Client - + Progress i.e: % downloaded Avanzamento - + Down Speed i.e: Download speed - Velocità scaricamento + Velocità download - + Up Speed i.e: Upload speed - Velocità invio + Velocità upload - + Downloaded i.e: total data downloaded Scaricati - + Uploaded i.e: total data uploaded - Inviati + Caricati - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Rilevanza - + Files i.e. files that are being downloaded right now File - + Column visibility Visibilità colonna - + Add a new peer... - Aggiungi un nuovo nodo... + Aggiungi un nuovo peer... - - + + Ban peer permanently - Metti nodo permanentemente al bando + Metti peer permanentemente al bando - + Manually adding peer '%1'... - Aggiunta manuale del nodo %1... + Aggiunta manuale del peer %1... - + The peer '%1' could not be added to this torrent. - Non è stato possibile aggiungere il nodo '%1' a questo torrent. + Non è stato possibile aggiungere il peer '%1' a questo torrent. - + Manually banning peer '%1'... - Metto al bando manualmente il nodo %1... + Banno manualmente il peer %1... - - + + Peer addition - Aggiunta di nodo + Aggiunta di peer - + Country Paese - + Copy IP:port Copia IP:porta - + Some peers could not be added. Check the Log for details. - Impossibile aggiungere alcuni nodi. Controlla il registro per i dettagli. + Impossibile aggiungere alcuni peer. Controlla il registro per i dettagli. - + The peers were added to this torrent. - I nodi sono stati aggiunti a questo torrent. + I peer sono stati aggiunti a questo torrent. - + Are you sure you want to ban permanently the selected peers? - Vuoi mettere permanentemente al bando il nodo selezionato? + Vuoi mettere permanentemente al bando il peer selezionato? - + &Yes &Sì - + &No &No - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - + PeersAdditionDlg - - Format: IPv4:port / [IPv6]:port - - - - + No peer entered - + Nessun peer inserito - + Please type at least one peer. - + Inserisci almeno un peer. - + Invalid peer - + Peer non valido - + The peer '%1' is invalid. - + Il peer '%1' non è valido. PieceAvailabilityBar - + White: Unavailable pieces Bianco: Parti non disponibili - + Blue: Available pieces Blu: Parti disponibili @@ -6164,336 +5496,293 @@ PiecesBar - + Files in this piece: - File in questa parte: + File in questo pezzo: - + File in this piece - File in questa parte + File in questo pezzo - + File in these pieces - File in queste parti + File in questi pezzi - - Wait until metadata become available to see detailed information - Aspetta che i metadati siano disponibili per vedere informazioni dettagliate - - - + Hold Shift key for detailed information Tieni premuto il tasto Shift per informazioni dettagliate - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Plugin di ricerca - + Installed search plugins: - + Plugin di ricerca installati: - + Name - Nome + Nome - + Version - + Versione - + Url - + Indirizzo - - + + Enabled - + Attivato - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + È possibile ottenere nuovi plugin di ricerca qui: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Installane uno nuovo - + Check for updates - + Controlla gli aggiornamenti - + Close - + Chiudi - + Uninstall - + Disinstalla - - - + + + Yes - + - - - - + + + + No - No + No - + Uninstall warning - + Avviso di disinstallazione - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Alcuni plugin non hanno potuto essere disinstallati perché sono inclusi in qBittorrent. Solo quelli aggiunti da te possono essere disinstallati. +I plugin in questione sono stati invece disattivati. - + Uninstall success - + Disinstallazione riuscita - + All selected plugins were uninstalled successfully - - - - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - + Tutti i plugin selezionati sono stati disinstallati con successo - - + + New search engine plugin URL - + Indirizzo del nuovo plugin di ricerca - - + + URL: - + Indirizzo web: - + Invalid link - + Collegamento non valido - + The link doesn't seem to point to a search engine plugin. - + Il collegamento non risulta puntare ad un plugin di ricerca. - + Select search plugins - + Seleziona plugin di ricerca - + qBittorrent search plugin - + Plugin di ricerca per qBittorrent - + + + + Search plugin update + Aggiornamento plugin di ricerca + + + All your plugins are already up to date. - + Tutti i plugin sono già aggiornati. - + Sorry, couldn't check for plugin updates. %1 - + Impossibile controllare aggiornamenti dei plugin. %1 - + + + Search plugin install - + Installazione plugin di ricerca + + + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + Il plugin di ricerca "%1" è stato installato correttamente. - + Couldn't install "%1" search engine plugin. %2 - + Impossibile installare il plugin di ricerca "%1". %2 + + + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + Il plugin di ricerca "%1" è stato aggiornato correttamente. - + Couldn't update "%1" search engine plugin. %2 - + Impossibile aggiornare il plugin di ricerca "%1". %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Origine del plugin - + Search plugin source: - + Origine del plugin di ricerca: - + Local file - + File locale - + Web link - - - - - PowerManagement - - - qBittorrent is active - + Collegamento web - PreviewSelectDialog - - - Preview - Anteprima - + PreviewSelect - + Name Nome - + Size Dimensione - + Progress Avanzamento - - + + Preview impossible Anteprima impossibile - - + + Sorry, we can't preview this file - Impossibile mostrare l'anteprima di questo file - - - - Private::FileLineEdit - - - '%1' does not exist - '%1' non esiste - - - - '%1' does not point to a directory - '%1' non punta a una cartella - - - - '%1' does not point to a file - '%1' non punta a un file - - - - Does not have read permission in '%1' - Mancano i permessi di lettura in '%1' - - - - Does not have write permission in '%1' - Mancano i permessi di scrittura in '%1' + Impossibile visuallizzare l'anteprima di questo file PropListDelegate - + Not downloaded Non scaricato - - + + Normal Normal (priority) Normale - - N/A - N/D - - - + Do not download Do not download (priority) - Non scaricare + - - + + High High (priority) Alta - + N/A + N/D + + + Mixed Mixed (priorities Mista - - + + Maximum Maximum (priority) Massima @@ -6502,32 +5791,32 @@ PropTabBar - + General Generale - + Trackers - Server traccia + Tracker - + Peers - Nodi + Peer - + HTTP Sources Sorgenti HTTP - + Content Contenuto - + Speed Velocità @@ -6568,37 +5857,37 @@ Uploaded: - Inviati: + Caricati: Seeds: - Distributori: + Seed: Download Speed: - Velocità scaricamento: + Velocità download: Upload Speed: - Velocità invio: + Velocità upload: Peers: - Nodi: + Peer: Download Limit: - Limite scaricamento: + Limite download: Upload Limit: - Limite invio: + Limite upload: @@ -6621,22 +5910,22 @@ Commento: - + Select All Seleziona tutti - + Select None Deseleziona tutti - + Normal Normale - + High Alta @@ -6696,1026 +5985,985 @@ Percorso salvataggio: - + Maximum Massima + - Do not download Non scaricati - + Never Mai - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (ne hai %3) - - + + %1 (%2 this session) %1 (%2 in questa sessione) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (condiviso per %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (max %2) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 in totale) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 in media) - + Open Apri - + Open Containing Folder Apri cartella - + Rename... Rinomina... - + Priority Priorità - + New Web seed - Nuovo distributore web + Nuovo seed web - + Remove Web seed - Rimuovi distributore web + Rimuovi seed web - + Copy Web seed URL - Copia URL distributore web + Copia URL seed web - + Edit Web seed URL - Modifica URL distributore web + Modifica URL seed web - + + Rename the file + Rinomina file + + + New name: Nuovo nome: - - + + + The file could not be renamed + Impossibile rinominare il file + + + + This file name contains forbidden characters, please choose a different one. + Il nome di questo file contiene caratteri vietati, scegli un nome differente. + + + + This name is already in use in this folder. Please use a different name. Questo nome è già in uso in questa cartella, scegli un nome differente. - + The folder could not be renamed Impossibile rinominare cartella - + qBittorrent qBittorrent - + Filter files... Filtra elenco file... - - Renaming - Rinominazione - - - - - Rename error - Errore rinominazione - - - - The name is empty or contains forbidden characters, please choose a different one. - Il nome è vuoto o contiene caratteri vietati, scegline uno diverso. - - - + New URL seed New HTTP source - Nuovo URL distributore + Nuovo seed URL - + New URL seed: - Nuovo URL distributore: + Nuovo seed URL: - - + + This URL seed is already in the list. - Questo URL distributore è già nell'elenco. + Questo seed URL è già nell'elenco. - + Web seed editing - Modifica distributore web + Modifica seed web - + Web seed URL: - URL distributore web: + URL seed web: QObject - + + Your IP address has been banned after too many failed authentication attempts. + Il tuo indirizzo IP è stato messo al bando a causa dei troppi tentativi di autenticazione non riusciti. + + + + Error: '%1' is not a valid torrent file. + + Errore: "%1" non è un file torrent valido. + + + + Error: Could not add torrent to session. + Errore: impossibile aggiungere il torrent alla sessione. + + + + I/O Error: Could not create temporary file. + Errore I/O: Non è stato possibile creare il file temporaneo. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 è un parametro sconosciuto. - - + + %1 must be the single command line parameter. %1 deve essere l'unico parametro della riga di comando. - + + %1 must specify the correct port (1 to 65535). + %1 deve essere una porta valida (da 1 a 65535). + + + You cannot use %1: qBittorrent is already running for this user. Impossibile usare %1: qBittorrent è già in esecuzione per questo utente. - + Usage: Uso: - + Options: Opzioni: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - Il parametro '%1' deve seguire la sintassi '%1=%2' - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - Il parametro '%1' deve seguire la sintassi '%1=%2' - - - - Expected integer number in environment variable '%1', but got '%2' - Atteso numero intero della variabile d'ambiente '%1', ma ottenuto '%2' - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - Il parametro '%1' deve seguire la sintassi '%1=%2' - - - - Expected %1 in environment variable '%2', but got '%3' - Atteso %1 nella variabile d'ambiente '%2', ma ottenuto '%3' - - - - port - porta - - - - %1 must specify a valid port (1 to 65535). - %1 deve specificare una porta valida (1 a 65535). - - - - Display program version and exit - Mostra versione programma ed esci + + Displays program version + Mostra la versione del programma - - Display this help message and exit - Mostra questo messaggio di aiuto ed esci + + Displays this help message + Mostra questo messaggio d'aiuto - - Change the Web UI port - Cambia la porta dell'interfaccia web + + Changes the Web UI port (current: %1) + Modifica la porta dell'interfaccia web (attuale: %1) - + Disable splash screen Disattiva schermata d'avvio - + Run in daemon-mode (background) Esegui in modalità daemon (background) - - dir - Use appropriate short form or abbreviation of "directory" - dir - - - - Store configuration files in <dir> - Memorizza file di configurazione in <dir> - - - - - name - nome - - - - Store configuration files in directories qBittorrent_<name> - Memorizza file di configurazione in cartelle qBittorrent_<name> - - - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Inserisciti nei file fastresume di libtorrent e rendi i percorsi dei file relativi alla cartella del profilo - - - - files or URLs - file o URL - - - - Download the torrents passed by the user - Scarica i torrent passati dall'utente - - - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Specifica se la finestra "Aggiungi nuovo torrent" si apra quando viene aggiunto un torrent. - - - - Options when adding new torrents: - Opzioni all'aggiunta di nuovi torrent: - - - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Scorciatoia per %1 - - - - path - percorso - - - - Torrent save path - Percorso salvataggio torrent - - - - Add torrents as started or paused - Aggiungi torrent avviati o in pausa - - - - Skip hash check - Salta il controllo hash - - - - Assign torrents to category. If the category doesn't exist, it will be created. - Assegna torrent a categoria. Se la categoria non esiste, verrà creata. - - - - Download files in sequential order - Scarica file in ordine sequenziale - - - - Download first and last pieces first - Scarica la prima e l'ultima parte per prime - - - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - I valori delle opzioni possono essere passati tramite variabili d'ambiente. Per l'opzione chiamata 'parameter-name', la variable d'ambiente è 'QBT_PARAMETER_NAME' (tutte maiuscole, '-' sostituito da '_'). Per passare valori di spunta, imposta la variabile a '1' o 'TRUE'. Per esempio, per disabilitare la schermata d'avvio: - - - - Command line parameters take precedence over environment variables - I parametri della riga di comando hanno la precedenza sulle variabili d'ambiente + + Downloads the torrents passed by the user + Scarica il torrent passato dall'utente - + Help Aiuto - + Run application with -h option to read about command line parameters. Esegui l'applicazione con il parametro -h per avere informazioni sui parametri della riga di comando. - + Bad command line - Riga di comando errata + Linea di comando errata - + Bad command line: - Riga di comando errata: + Linea di comando errata: - + Legal Notice Informazioni legali - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - qBittorrent è un programma di condivisione file. Quando si esegue un torrent, i suoi dati saranno resi disponibili agli altri per mezzo di invio.Ogni contenuto tu condividi è di tua responsabilità. - - - - No further notices will be issued. - Non saranno emessi ulteriori avvisi. - - - + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. No further notices will be issued. - qBittorrent è un programma di condivisione file. Quando si esegue un torrent, i suoi dati saranno resi disponibili agli altri per mezzo di invio.Ogni contenuto tu condividi è di tua responsabilità. + qBittorrent è un programma di file sharing. Quando si esegue un torrent, i suoi dati saranno resi disponibili agli altri per mezzo di upload.Ogni contenuto tu condividi è di tua responsabilità. -Non verranno emessi ulteriori avvisi. +Non verranno emessi avvisi. - + Press %1 key to accept and continue... Premi %1 tasto per accettare e continuare... - + Legal notice Informazioni legali - + Cancel Annulla - + I Agree Accetto - - - Upgrade - Aggiorna + + Torrent name: %1 + Nome torrent: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - Hai aggiornato da una versione più vecchia che salvava i dati in maniera differente. Devi passare al nuovo sistema di salvataggio. Non ti sarà più possibile usare una versione più vecchia di v3.3.0. Continuare? [y/n] + + Torrent size: %1 + Dimensione torrent: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - Hai aggiornato da una versione più vecchia che salvava i dati in maniera differente. Devi passare al nuovo sistema di salvataggio. Se continui, non ti sarà più possibile usare una versione più vecchia di v3.3.0. + + Save path: %1 + Percorso salvataggio: %1 - - Couldn't migrate torrent with hash: %1 - Impossibile trasferire il torrent con hash: %1 + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Il torrent è stato scaricato in %1. - - Couldn't migrate torrent. Invalid fastresume file name: %1 - Impossibile trasferire il torrent. Nome del file per il recupero veloce non valido: %1 + + Thank you for using qBittorrent. + Grazie per aver usato qBittorrent. - - Detected unclean program exit. Using fallback file to restore settings: %1 - Rilevata uscita dal programma non pulita. Utilizzo file di ripiego per ripristinare le impostazioni: %1 + + [qBittorrent] '%1' has finished downloading + [qBittorrent] %1 è stato scaricato - - An access error occurred while trying to write the configuration file. - Si è verificato un errore di accesso durante il tentativo di scrittura del file di configurazione. + + The remote host name was not found (invalid hostname) + L'host remoto non è stato trovato (nome host non valido) - - A format error occurred while trying to write the configuration file. - Si è verificato un errore di formato durante il tentativo di scrittura del file di configurazione. + + The operation was canceled + L'operazione è stata annullata - - An unknown error occurred while trying to write the configuration file. - Si è verificato un errore sconosciuto durante la scrittura del file di configurazione. + + The remote server closed the connection prematurely, before the entire reply was received and processed + Il server remoto ha chiuso la connessione prematuramente, prima che l'intera risposta fosse ricevuta e processata - - - RSS::AutoDownloader - - - Invalid data format. - Formato dati non valido. + + The connection to the remote server timed out + La connessione al server remoto è scaduta - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - Impossibile salvare dati scaricatore automatico RSS su %1. Errore: %2 + + SSL/TLS handshake failed + Negoziazione SSL/TLS non riuscita - - Invalid data format - Formato dati non valido + + The remote server refused the connection + Il server remoto ha rifiutato la connessione - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - Impossibile leggere regole scaricatore automatico RSS da %1. Errore: %2 + + The connection to the proxy server was refused + La connessione al server proxy è stata rifiutata - - Couldn't load RSS AutoDownloader rules. Reason: %1 - Impossibile caricare regole scaricatore automatico RSS. Motivo: %1 + + The proxy server closed the connection prematurely + Il server proxy ha chiuso la connessione prematuramente - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - Impossibile scaricare fonte RSS da '%1'. Motivo: %2 + + The proxy host name was not found + Il nome host del proxy non è stato trovato - - RSS feed at '%1' updated. Added %2 new articles. - Fonte RSS su '%1' aggiornata. Aggiunti %2 nuovi articoli. + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + La connessione al proxy è scaduta oppure il proxy non ha risposto in tempo alla richiesta - - Failed to parse RSS feed at '%1'. Reason: %2 - Impossibile analizzare fonte RSS su '%1'. Motivo: %2 - + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Il proxy richiede l'autenticazione per onorare la richiesta ma non ha accettato le credenziali fornite + - - Couldn't read RSS Session data from %1. Error: %2 - Impossibile leggere dati di sessione RSS da %1. Errore: %2 + + The access to the remote content was denied (401) + È stato negato l'accesso ai contenuti remoti (401) - - Couldn't parse RSS Session data. Error: %1 - Impossibile analizzare dati di sessione RSS. Errore: %1 + + The operation requested on the remote content is not permitted + L'operazione richiesta sui contenuti remoti non è permessa - - Couldn't load RSS Session data. Invalid data format. - Impossibile caricare dati di sessione RSS. Formato dati non valido. + + The remote content was not found at the server (404) + I contenuti remoti non sono stati trovati sul server (404) - - Couldn't load RSS article '%1#%2'. Invalid data format. - Impossibile caricare articolo RSS '%1#%2'. Formato dati non valido. + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Il server remoto richiede autenticazione per accedere ai contenuti, ma le credenziali fornite non sono state accettate - - - RSS::Private::Parser - - Invalid RSS feed. - Fonte RSS non valida. + + The Network Access API cannot honor the request because the protocol is not known + L'API di accesso alla rete non può completare la richiesta perché il protocollo è sconosciuto - - %1 (line: %2, column: %3, offset: %4). - %1 (linea: %2, colonna: %3, scostamento: %4). + + The requested operation is invalid for this protocol + L'operazione richiesta non è valida per questo protocollo + + + + An unknown network-related error was detected + È stato rilevato un errore sconosciuto sulla rete + + + + An unknown proxy-related error was detected + È stato rilevato un errore sconosciuto sul proxy + + + + An unknown error related to the remote content was detected + È stato rilevato un errore sconosciuto sui contenuti remoti - - - RSS::Session - - RSS feed with given URL already exists: %1. - Una fonte RSS con la URL fornita è già esistente: %1. + + A breakdown in protocol was detected + È stato rilevato un malfunzionamento sul protocollo + + + + Unknown error + Errore sconosciuto + + + + + Upgrade + Aggiorna + + + + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] + Hai aggiornato da una versione più vecchia che salvava i dati in maniera differente. Devi passare al nuovo sistema di salvataggio. Non ti sarà più possibile usare una versione più vecchia di v3.3.0. Continuare? [y/n] - - Cannot move root folder. - Impossibile spostare percorso radice. + + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. + Hai aggiornato da una versione più vecchia che salvava i dati in maniera differente. Devi passare al nuovo sistema di salvataggio. Se continui, non ti sarà più possibile usare una versione più vecchia di v3.3.0. - - - Item doesn't exist: %1. - L'elemento non esiste: %1. + + Couldn't migrate torrent with hash: %1 + Impossibile trasferire il torrent con hash: %1 - - Cannot delete root folder. - Impossibile eliminare percorso radice. + + Couldn't migrate torrent. Invalid fastresume file name: %1 + Impossibile trasferire il torrent. Nome del file per il recupero veloce non valido: %1 - - Incorrect RSS Item path: %1. - Percorso elemento RSS non corretto: %1. + + Detected unclean program exit. Using fallback file to restore settings. + Rilevata uscita dal programma non pulita. Uso file di ripiego per ripristinare le impostazioni. - - RSS item with given path already exists: %1. - Un elemento RSS col percorso fornito è già esistente: %1. + + An access error occurred while trying to write the configuration file. + Si è verificato un errore di accesso durante il tentativo di scrittura del file di configurazione. - - Parent folder doesn't exist: %1. - La cartella superiore non esiste: %1. + + A format error occurred while trying to write the configuration file. + Si è verificato un errore di formato durante il tentativo di scrittura del file di configurazione. - RSSWidget + RSS - + Search Ricerca - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - Il recupero delle fonti RSS è disabilitato! Puoi abilitarlo in impostazioni applicazione. - - - + New subscription - Nuova sottoscrizione + Nuova iscrizione - - - + + + Mark items read - Marca oggetti come letti - - - - Refresh RSS streams - Aggiorna flussi RSS + Segna come letti - + Update all - Aggiorna tutto + Aggiorna tutti - + RSS Downloader... - Scaricatore RSS... + Gestore download RSS... + + + + Settings... + Impostazioni... - + Torrents: (double-click to download) Torrent: (doppio clic per scaricare) - - + + Delete Elimina - + Rename... Rinomina... - + Rename Rinomina - - + + Update Aggiorna - + New subscription... - Nuova sottoscrizione... + Nuova registrazione... - - + + Update all feeds - Aggiorna tutte le fonti + Aggiorna tutti i feed - + Download torrent Scarica torrent - + Open news URL - Apri URL novità + Apri URL delle notizie - + Copy feed URL - Copia URL fonte + Copia URL del feed - + New folder... Nuova cartella... - + + Refresh RSS streams + Aggiorna i flussi RSS + + + + RSSImp + + + Stream URL: + Indirizzo del flusso: + + + + Please type a RSS stream URL + Inserisci un URL di flusso RSS + + + + This RSS feed is already in the list. + Questa fonte RSS è già nell'elenco. + + + Please choose a folder name - Scegli un nome cartella + Scegli un nome per la cartella - + Folder name: Nome cartella: - + New folder Nuova cartella - - Please type a RSS feed URL - Inserisci una URL fonte RSS - - - - Feed URL: - URL fonte: - - - + Deletion confirmation - Conferma cancellazione + Conferma eliminazione - + Are you sure you want to delete the selected RSS feeds? - Sei sicuro di voler cancellare le fonti RSS selezionate? + Sei sicuro di voler eliminare i feed RSS selezionati? - + Please choose a new name for this RSS feed - Scegli un nuovo nome per questa fonte RSS + Scegli un nuovo nome per questo feed RSS - + New feed name: - Nuovo nome fonte: + Nuovo nome feed: + + + + Name already in use + Nome già in uso - - Rename failed - Rinominazione non riuscita + + This name is already used by another item, please choose another one. + Questo nome è già in uso da un altro elemento. Scegli un nome differente. - + Date: - Data: + Data: - + Author: - Autore: + Autore: + + + + Unread + Non letti + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + Download automatico di '%1' dal feed RSS '%2' non riuscito perché non contiene un collegamento torrent o magnet... + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + Download automatico del torrent '%1' dal feed RSS '%2'... + + + + Rss::Private::Parser + + + Invalid RSS feed. + Feed RSS non valido. + + + + RssSettingsDlg + + + RSS Reader Settings + Impostazioni lettore RSS + + + + RSS feeds refresh interval: + Intervallo aggiornamento feed RSS: + + + + min + min + + + + Maximum number of articles per feed: + Numero massimo di articoli per feed: ScanFoldersDelegate - + Select save location - Imposta percorso di salvataggio + Imposta percorso di salvataggio... ScanFoldersModel - + Monitored Folder Cartella Monitorata - + Override Save Location Aggira Posizione di Salvataggio - + Monitored folder Cartella monitorata - + Default save location Percorso di salvataggio predefinito - + Browse... Naviga... - SearchJobWidget + SearchEngine - - Form - + + Unknown search engine plugin file format. + Formato file plugin di ricerca sconosciuto. - - Results(xxx) - + + A more recent version of this plugin is already installed. + Una versione più recente di questo plugin è già installata. - - Search in: - + + + Plugin is not supported. + Il plugin non è supportato. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - + + Update server is temporarily unavailable. %1 + Il server di aggiornamento è temporaneamente indisponibile. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - + + + Failed to download the plugin file. %1 + Errore nel caricamento del file plugin. %1 - - Seeds: - Distributori: + + An incorrect update info received. + È stata ricevuta un'informazione di aggiornamento errata. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - + + All categories + Tutte le categorie - - - to - + + Movies + Film - - <html><head/><body><p>Maximal number of seeds</p></body></html> - + + TV shows + Serie TV - - - - + + Music + Musica - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + + Games + Giochi - - Size: - Dimensione: + + Anime + Animazione - - <html><head/><body><p>Minimal torrent size</p></body></html> - + + Software + Applicazioni - - <html><head/><body><p>Maximal torrent size</p></body></html> - + + Pictures + Immagini + + + + Books + Libri + + + + SearchListDelegate + + + + Unknown + Sconosciuto + + + SearchTab - + Name i.e: file name - Nome + Nome - + Size i.e: file size - Dimensione + Dimensione - + Seeders i.e: Number of full sources - + Seeders - + Leechers i.e: Number of partial sources - + Leechers - + Search engine - - - - - Filter search results... - + Motore di ricerca - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Risultati (mostrati <i>%1</i> di <i>%2</i>): - + Torrent names only - + Solo nomi torrent - + Everywhere - - - - - Use regular expressions - + Dovunque - + Searching... - + Ricerca... - + Search has finished - La ricerca è terminata + La ricerca è terminata - + Search aborted - + Ricerca interrotta - + An error occurred during search... - + Si è verificato un errore durante la ricerca... - + Search returned no results - + La ricerca non ha dato risultati - + Column visibility Visibilità colonna - - - SearchPluginManager - - - Unknown search engine plugin file format. - Formato estensione motore di ricerca sconosciuto. - - - - A more recent version of this plugin is already installed. - Una versione più recente di questa estensione è già installata. - - - - Plugin is not supported. - Estensione non supportata. + + Form + Form - - All categories - Tutte le categorie + + Results(xxx) + Risultati(xxx) - - Movies - Film + + Search in: + Cerca in: - - TV shows - Serie TV + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Alcuni motori di ricerca cercano anche nella descrizione e nel nome dei file torrent. Questa modalità controlla se questi risultati saranno mostrati nella lista sottostante. </p><p><span style=" font-weight:600;">Dovunque </span>disabilita il filtraggio e mostra tutto ciò che è stato ottenuto dal motore di ricerca.</p><p><span style=" font-weight:600;">Solo nomi dei torrent</span> mostra solo i torrent con nomi che corrispondono ai termini di ricerca.</p></body></html> - - Music - Musica + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Imposta il massimo ed il minimo numero di seed consentiti</p></body></html> - - Games - Giochi + + Seeds: + Seed: - - Anime - Animazione + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Numero minimo di seed</p></body></html> - - Software - Applicazioni + + + to + a - - Pictures - Immagini + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Numero massimo di seed</p></body></html> - - - Books - Libri + + + + + - - Update server is temporarily unavailable. %1 - Server aggiornamenti temporaneamente non disponibile. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Imposta le dimensioni massima e minima consentite per un torrent</p></body></html> - - - Failed to download the plugin file. %1 - Impossibile scaricare il file di estensione. %1 + + Size: + Dimensione: - - An incorrect update info received. - Ricevuta informazione di aggiornamento errata. + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Dimensione minima torrent</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - L'estensione di ricerca '%1' contiene stringa di versione non valida ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Dimensione massima torrent</p></body></html> @@ -7723,198 +6971,185 @@ - - - - + + + Search Cerca - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - Non ci sono estensioni di ricerca installate. -Fai clic sul pulsante "Estensioni di ricerca..." in basso a destra per installarne. - - - + Download - Scarica + Download - + Go to description page Vai alla pagina di descrizione - + Copy description page URL Copia URL pagina di descrizione - + Search plugins... - Estensioni di ricerca... + Plugin di ricerca - + A phrase to search for. Una frase da cercare. - + Spaces in a search term may be protected by double quotes. Gli spazi in un termine di ricerca possono essere conservati usando i caratteri di quotazione. - + Example: Search phrase example Esempio: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>testo esempio</b>: ricerca per <b>testo</> ed <b>esempio</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;testo esempio&quot;</b>: ricerca per <b>testo esempio</b> - + All plugins - Tutte le estensioni + Tutti i plugin - + Only enabled Solo abilitati - + Select... Seleziona... - - - + + + Search Engine Motore di Ricerca - + Please install Python to use the Search Engine. Installa Python per usare il motore di ricerca. - + Empty search pattern Campo di ricerca vuoto - + Please type a search pattern first È necessario inserire dei termini di ricerca prima - + Stop Ferma - + Search has finished La ricerca è terminata - + Search has failed La ricerca non ha avuto successo - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + qBittorrent verrà ora chiuso. - + E&xit Now - + &Esci Adesso - + Exit confirmation - + Conferma chiusura - + The computer is going to shutdown. - + Il computer sta per spegnersi. - + &Shutdown Now - + &Spegni Adesso - - Shutdown confirmation - - - - + The computer is going to enter suspend mode. - + Il computer sta per entrare in sospensione. - + &Suspend Now - + &Sospendi Adesso - + Suspend confirmation - + Conferma sospensione - + The computer is going to enter hibernation mode. - + Il computer sta per entrare in ibernazione. - + &Hibernate Now - + &Iberna Adesso - + Hibernate confirmation - + Conferma ibernazione - + You can cancel the action within %1 seconds. - + Puoi cancellare l'azione entro %1 secondi. + + + + Shutdown confirmation + Conferma lo spegnimento SpeedLimitDialog - + KiB/s KiB/s @@ -7922,145 +7157,137 @@ SpeedPlotView - + Total Upload - Invio totale + Upload totale - + Total Download - Scaricamento totale + Download totale - + Payload Upload - Invio utile + Upload utile - + Payload Download - Scaricamento utile + Download utile - + Overhead Upload - Invio di servizio + Upload di servizio - + Overhead Download - Scaricamento di servizio + Download di servizio - + DHT Upload - Invio DHT + Upload DHT - + DHT Download - Scaricamento DHT + Download DHT - + Tracker Upload - Invio al server traccia + Upload al tracker - + Tracker Download - Scaricamento dal server traccia + Download dal tracker SpeedWidget - + Period: Periodo: - + 1 Minute 1 minuto - + 5 Minutes 5 minuti - + 30 Minutes 30 minuti - + 6 Hours 6 ore - + Select Graphs Seleziona grafici - + Total Upload - Invio totale + Upload totale - + Total Download - Scaricamento totale + Download totale - + Payload Upload - Invio utile + Upload utile - + Payload Download - Scaricamento utile + Download utile - + Overhead Upload - Invio di servizio + Upload di servizio - + Overhead Download - Scaricamento di servizio + Download di servizio - + DHT Upload - Invio DHT + Upload DHT - + DHT Download - Scaricamento DHT + Download DHT - + Tracker Upload - Invio al server traccia + Upload al tracker - + Tracker Download - Scaricamento dal server traccia - - - - StacktraceDialog - - - Crash info - + Download dal tracker @@ -8076,49 +7303,49 @@ Statistiche utente - - Cache statistics - Statistiche cache + + Total peer connections: + Totale connessioni peer: - - Read cache hits: - Hit lettura cache: + + Global ratio: + Rapporto globale: - - Average time in queue: - Tempo medio in coda: + + Alltime download: + Download totale: - - Connected peers: - Nodi connessi: + + Alltime upload: + Upload totale: - - All-time share ratio: - Rapporto condivisione da sempre: + + Total waste (this session): + Totale non usato (questa sessione): - - All-time download: - Scaricamenti da sempre: + + Cache statistics + Statistiche cache - - Session waste: - Spreco sessione: + + Read cache hits: + Hit lettura cache: - - All-time upload: - Invii da sempre: + + Average time in queue: + Tempo medio in coda: - Total buffer size: - Dimensione buffer totale: + Total buffers size: + Totale dimensione buffer: @@ -8146,7 +7373,12 @@ Dimensione totale in coda: - + + OK + OK + + + %1 ms 18 milliseconds %1 ms @@ -8155,27 +7387,32 @@ StatusBar - + Connection status: Stato connessione: - + No direct connections. This may indicate network configuration problems. Nessuna connessione diretta. Questo potrebbe indicare problemi di configurazione della rete. - + DHT: %1 nodes DHT: %1 nodi - - qBittorrent needs to be restarted! - qBittorrent ha bisogno di essere riavviato! + + qBittorrent needs to be restarted + È necessario riavviare qBittorrent + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent è stato appena aggiornato e deve essere riavviato per rendere effettive le modifiche. @@ -8194,1667 +7431,1452 @@ Online - + Click to switch to alternative speed limits Clicca per passare ai limiti alternativi di velocità - + Click to switch to regular speed limits Clicca per passare ai limiti normali di velocità - + + Manual change of rate limits mode. The scheduler is disabled. + Modifica manuale dei limiti globali. La pianificazione è disattivata. + + + Global Download Speed Limit - Limite globale velocità scaricamento + Limite globale download - + Global Upload Speed Limit - Limite globale velocità invio + Limite globale upload - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - Tutti (0) + Tutti (0) - + Downloading (0) - + In download (0) - + Seeding (0) - + In condivisione (0) - + Completed (0) - + Completati (0) - + Resumed (0) - + Ripresi (0) - + Paused (0) - + In pausa (0) - + Active (0) - + Attivi (0) - + Inactive (0) - + Inattivi (0) - + Errored (0) - + Con errori (0) - + All (%1) - Tutti (%1) + Tutti (%1) - + Downloading (%1) - + In download (%1) - + Seeding (%1) - + In condivisione (%1) - + Completed (%1) - + Completati (%1) - + Paused (%1) - + In pausa (%1) - + Resumed (%1) - + Ripresi (%1) - + Active (%1) - + Attivi (%1) - + Inactive (%1) - + Inattivi (%1) - + Errored (%1) - + Con errori (%1) - TagFilterModel + TorrentContentModel - - Tags - Etichette + + Name + Nome - - All - Tutti + + Size + Dimensione - - Untagged - Senza etichetta + + Progress + Avanzamento - - - TagFilterWidget - - Add tag... - Aggiungi etichetta... + + Download Priority + Priorità Download - - Remove tag - Rimuovi etichetta + + Remaining + Rimanente + + + TorrentCreatorDlg - - Remove unused tags - Rimuovi etichette non utilizzate + + Select a folder to add to the torrent + Seleziona una cartella da aggiungere al torrent - - Resume torrents - Riprendi torrent + + Select a file to add to the torrent + Seleziona un file da aggiungere al torrent - - Pause torrents - Metti torrent in pausa + + No input path set + Nessun percorso da inserire definito - - Delete torrents - Cancella torrent + + Please type an input path first + È necessario scegliere il percorso di un file o di una cartella - - New Tag - Nuova etichetta + + Select destination torrent file + Seleziona il file torrent di destinazione - - Tag: - Etichetta: + + Torrent Files (*.torrent) + File torrent (*.torrent) - - Invalid tag name - Nome etichetta non valido + + Torrent was created successfully: %1 + %1 is the path of the torrent + Il torrent è stato creato correttamente: %1 - - Tag name '%1' is invalid - Il nome dell'etichetta '%1' non è valido + + + + Torrent creation + Creazione di un torrent - - Tag exists - Etichetta esistente + + Torrent creation was unsuccessful, reason: %1 + Creazione torrent non riuscita, motivo: %1 - - Tag name already exists. - Nome dell'etichetta già esistente. + + Created torrent file is invalid. It won't be added to download list. + Il torrent creato non è valido. Non sarà aggiunto all'elenco download. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Proprietà categoria torrent + + Name + i.e: torrent name + Nome - - Name: - Nome: + + Size + i.e: torrent size + Dimensione - - Save path: - Percorso salvataggio: + + Done + % Done + Avanzamento - - Choose save path - Scegli cartella per il salvataggio + + Status + Torrent status (e.g. downloading, seeding, paused) + Stato - - New Category - Nuova categoria + + Seeds + i.e. full sources (often untranslated) + Seed - - Invalid category name - Nome categoria non valido + + Peers + i.e. partial sources (often untranslated) + Peer - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - Il nome categoria non può contenere '\'. -Il nome categoria non può iniziare/finire con '/'. -Il nome categoria non può contenere la sequenza '//'. - - - - Category creation error - Errore creazione categoria - - - - Category with the given name already exists. -Please choose a different name and try again. - Esiste già una categoria con il nome fornito. -Scegli un nome diverso e riprova. + + Down Speed + i.e: Download speed + Velocità download - - - TorrentContentModel - - Name - Nome + + Up Speed + i.e: Upload speed + Velocità upload - - Size - Dimensione + + Ratio + Share ratio + Rapporto - - Progress - Avanzamento + + ETA + i.e: Estimated Time of Arrival / Time left + Tempo stimato - - Download Priority - Priorità scaricamento + + Category + Categoria - - Remaining - Rimanente + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Aggiunto il - - Availability - Disponibilità + + Completed On + Torrent was completed on 01/01/2010 08:00 + Completato il - - - TorrentCreatorDialog - - Torrent Creator - + + Tracker + Tracker - - Select file/folder to share - + + Down Limit + i.e: Download limit + Limite di download - - Path: - + + Up Limit + i.e: Upload limit + Limiti di upload - - [Drag and drop area] - + + Downloaded + Amount of data downloaded (e.g. in MB) + Scaricati - - - Select file - + + Uploaded + Amount of data uploaded (e.g. in MB) + Caricati - - - Select folder - + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Download sessione - - Settings - + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Upload sessione - - Piece size: - + + Remaining + Amount of data left to download (e.g. in MB) + Rimanente - - Auto - + + Time Active + Time (duration) the torrent is active (not paused) + Tempo attivo - - 16 KiB - + + Save path + Torrent save path + Percorso salvataggio - - 32 KiB - + + Completed + Amount of data completed (e.g. in MB) + Completati - - 64 KiB - + + Ratio Limit + Upload share ratio limit + Limite rapporto di condivione - - 128 KiB - + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Visto completo l'ultima volta - - 256 KiB - + + Last Activity + Time passed since a chunk was downloaded/uploaded + Ultima attività - - 512 KiB - + + Total Size + i.e. Size including unwanted data + Dimensione totale + + + TrackerFiltersList - - 1 MiB - + + All (0) + this is for the tracker filter + Tutti (0) - - 2 MiB - + + Trackerless (0) + Senza tracker (0) - - 4 MiB - + + Error (0) + Errore (0) - - 8 MiB - + + Warning (0) + Notifiche (0) - - 16 MiB - + + + Trackerless (%1) + Senza tracker (%1) - - 32 MiB - + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - Calculate number of pieces: - + + + Error (%1) + Errore (%1) - - Private torrent (Won't distribute on DHT network) - + + + Warning (%1) + Notifiche (%1) - - Start seeding immediately - + + Resume torrents + Riprendi i torrent - - Ignore share ratio limits for this torrent - + + Pause torrents + Metti in pausa i torrent - - Optimize alignment - + + Delete torrents + Elimina i torrent - - Fields - - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - - - - Web seed URLs: - - - - - Tracker URLs: - - - - - Comments: - - - - - Source: - - - - - Progress: - Avanzamento: - - - - Create Torrent - - - - - - - Torrent creation failed - - - - - Reason: Path to file/folder is not readable. - - - - - Select where to save the new torrent - - - - - Torrent Files (*.torrent) - - - - - Reason: %1 - - - - - Reason: Created torrent is invalid. It won't be added to download list. - - - - - Torrent creator - - - - - Torrent created: - - - - - TorrentInfo - - - File size exceeds max limit %1 - Dimensione del file oltre il limite massimo %1 - - - - Torrent file read error: %1 - - - - - Torrent file read error: size mismatch - + + + All (%1) + this is for the tracker filter + Tutti (%1) - TorrentsController - - - Not contacted yet - Non ancora contattato - - - - Updating... - Aggiornamento... - - - - Working - In funzione - + TrackerList - - Not working - Non in funzione - - - - Error: '%1' is not a valid torrent file. - Errore: '%1' non è un file torrent valido. - - - - - - - Torrent queueing must be enabled - L'accodamento torrent deve essere abilitato - - - - Save path cannot be empty - + + URL + URL - - - Category cannot be empty - + + Status + Stato - - Unable to create category + + Received - - Unable to edit category - + + Seeds + Seed - - Cannot make save path - + + Peers + Peer - - Cannot write to directory + + Downloaded - - WebUI Set location: moving "%1", from "%2" to "%3" - Interfaccia web imposta posizione: spostamento di "%1", da "%2" a "%3" - - - - Incorrect torrent name - Nome torrent non corretto - - - - - Incorrect category name - Nome categoria non corretto - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - Tutti (0) - - - - Trackerless (0) - Senza server traccia (0) - - - - Error (0) - Errore (0) - - - - Warning (0) - Notifiche (0) - - - - - Trackerless (%1) - Senza server traccia (%1) - - - - - Error (%1) - Errore (%1) - - - - - Warning (%1) - Notifiche (%1) - - - - Resume torrents - Riprendi i torrent - - - - Pause torrents - Metti in pausa i torrent - - - - Delete torrents - Elimina i torrent - - - - - All (%1) - this is for the tracker filter - Tutti (%1) + + Message + Messaggio - - - TrackerListWidget - - + + Working - In funzione + In funzione - + Disabled - Disattivato + Disattivata - + This torrent is private - + Questo torrent è privato - + Updating... - Aggiornamento... + In aggiornamento... - + Not working - Non in funzione + Non in funzione - + Not contacted yet - Non ancora contattato + Non ancora contattato - - - - - - - N/A - N/D + + Tracker URL: + URL tracker: - + Tracker editing - + Modifica tracker - - Tracker URL: - - - - - + + Tracker editing failed - + Modifica tracker non riuscita - + The tracker URL entered is invalid. - + L'URL inserito per il tracker non è valido. - + The tracker URL already exists. - + L'URL del tracker esiste già. - + Add a new tracker... - - - - - Remove tracker - + Aggiungi un nuovo tracker... - + Copy tracker URL - + Copia URL tracker - + Edit selected tracker URL - + Modifica URL tracker selezionata - + Force reannounce to selected trackers - + Forza riannuncio ai tracker selezionati - + Force reannounce to all trackers - - - - - URL - - - - - Status - Stato - - - - Received - - - - - Seeds - - - - - Peers - Nodi + Forza riannuncio a tutti i tracker - - Downloaded - Scaricati - - - - Message - - - - - Column visibility - Visibilità colonna + + Remove tracker + Rimuovi tracker - TrackerLoginDialog - - - - Tracker authentication - - - - - Tracker: - - - - - Login - Login - - - - Username: - Nome utente: - + TrackersAdditionDlg - - Password: - Password: + + Trackers addition dialog + Finestra per l'aggiunta dei tracker - - Log in - + + List of trackers to add (one per line): + Elenco dei tracker da aggiungere (uno per riga): - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + URL elenco compatibile µTorrent: - - List of trackers to add (one per line): - + + I/O Error + Errore I/O - - µTorrent compatible list URL: - + + Error while trying to open the downloaded file. + Errore durante il tentativo di apertura del file scaricato. - + No change - + Nessun cambiamento - + No additional trackers were found. - + Nessun tracker aggiuntivo è stato trovato. - + Download error - Errore scaricamento + Errore download - + The trackers list could not be downloaded, reason: %1 - + Non è stato possibile scaricare l'elenco dei tracker, motivo: %1 TransferListDelegate - + Downloading - In scaricamento + In download - + Downloading metadata used when loading a magnet link - Scaricamento metadati + Download metadati - + Allocating qBittorrent is allocating the files on disk Allocazione - + Paused In pausa - + Queued i.e. torrent is queued In coda - + Seeding Torrent is complete and in upload-only mode In condivisione - + Stalled Torrent is waiting for download to begin In stallo - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. - [F] In scaricamento + [F] In download - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] In condivisione - + Checking Torrent local data is being checked Controllo in corso - + Queued for checking i.e. torrent is queued for hash checking In coda per controllo - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Controllo dati per recupero - - Completed - Completato - - - - Moving - Torrent local data are being moved/relocated - Spostamento in corso - - - - Missing Files - File mancanti - - - - Errored - torrent status, the torrent has an error - Con errori - - - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - %1 (condiviso per %2) - - - - %1 ago - e.g.: 1h 20m ago - %1 fa - - - - TransferListFiltersWidget - - - Status - Stato - - - - Categories - Categorie - - - - Tags - Etichette - - - - Trackers - Server traccia - - - - TransferListModel - - - Name - i.e: torrent name - Nome - - - - Size - i.e: torrent size - Dimensione - - - - Done - % Done - - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Stato - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - Nodi - - - - Down Speed - i.e: Download speed - Velocità scaricamento - - - - Up Speed - i.e: Upload speed - Velocità invio - - - - Ratio - Share ratio - - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - Categoria - - - - Tags - Etichette - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Scaricati - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Inviati - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - Rimanente + + Completed + Completato - - Time Active - Time (duration) the torrent is active (not paused) - + + Missing Files + File mancanti - - Save path - Torrent save path - + + Errored + torrent status, the torrent has an error + Con errori - - Completed - Amount of data completed (e.g. in MB) - Completato + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) + %1 (condiviso per %2) - - Ratio Limit - Upload share ratio limit - + + %1 ago + e.g.: 1h 20m ago + %1 fa + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + Stato - - Last Activity - Time passed since a chunk was downloaded/uploaded - + + Categories + Categorie - - Total Size - i.e. Size including unwanted data - + + Trackers + Tracker TransferListWidget - + Column visibility Visibilità colonna - + Choose save path Scegli una cartella per il salvataggio - + Torrent Download Speed Limiting - Limitazione velocità scaricamento + Limitazione velocità download - + Torrent Upload Speed Limiting - Limitazione velocità invio + Limitazione velocità upload - + Recheck confirmation Conferma ricontrollo - + Are you sure you want to recheck the selected torrent(s)? Confermi di voler ricontrollare i torrent selezionati? - + Rename Rinomina - + New name: Nuovo nome: - + Resume Resume/start the torrent Riprendi - + Force Resume Force Resume/start the torrent Forza avvio - + Pause Pause the torrent Metti in pausa - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Imposta percorso: spostamento di "%1", da "%2" a "%3" - - - - Add Tags - Aggiungi etichette - - - - Remove All Tags - Rimuovi tutte le etichette - - - - Remove all tags from selected torrents? - Rimuovere tutte le etichette dai torrent selezionati? + + New Category + Nuova Categoria - - Comma-separated tags: - Etichette separate da virgola: + + Category: + Categoria: - - Invalid tag - Etichetta non valida + + Invalid category name + Nome categoria non valido - - Tag name: '%1' is invalid - Nome etichetta: '%1' non è valido + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Il nome della categoria non può contenere '\'. +Il nome della categoria non può iniziare/finire con '\'. +Il nome della categoria non può contenere una sequenza '//'. - + Delete Delete the torrent Elimina - + Preview file... Anteprima file... - + Limit share ratio... Limita rapporto di condivione... - + Limit upload rate... - Limita velocità di invio... + Limita velocità di upload... - + Limit download rate... - Limita velocità di scaricamento... + Limita velocità di download... - + Open destination folder Apri cartella di destinazione - + Move up i.e. move up in the queue Muovi in alto - + Move down i.e. Move down in the queue Muovi in basso - + Move to top i.e. Move to top of the queue Muovi in cima - + Move to bottom i.e. Move to bottom of the queue Muovi in fondo - + Set location... Imposta percorso... - - Force reannounce - Forza riannuncio - - - + Copy name Copia nome - - Copy hash - Copia hash - - - + Download first and last pieces first - Scarica la prima e l'ultima parte per prime + Scarica prima il primo e l'ultimo pezzo - + Automatic Torrent Management Gestione Torrent Automatica - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category Nella modalità automatica varie proprietà del torrent (per esempio il percorso di salvataggio) verranno decise in base alla categoria associata - + Category Categoria - + New... New category... Nuova... - + Reset Reset category Azzera - - Tags - Etichette - - - - Add... - Add / assign multiple tags... - Aggiungi... - - - - Remove All - Remove all tags - Rimuovi tutte le etichette - - - + Priority Priorità - + Force recheck Forza ricontrollo - + Copy magnet link Copia collegamento magnet - + Super seeding mode - Modalità super distribuzione + Modalità super seeding - + Rename... Rinomina... - + Download in sequential order Scarica in ordine sequenziale - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + Limitazione rapporto upload/download - - Use global share limit - + + Use global ratio limit + Usa limite globale - - - + + + buttonGroup - + pulsanteGruppo - - Set no share limit - + + Set no ratio limit + Non impostare alcun limite - - Set share limit to - + + Set ratio limit to + Imposta rapporto di condivione a + + + WebApplication - - ratio - + + Incorrect category name + Nome categoria errato + + + WebUI - - minutes - + + The Web UI is listening on port %1 + L'interfaccia web è in ascolto sulla porta %1 - - No share limit method selected - + + Web UI Error - Unable to bind Web UI to port %1 + Errore interfaccia web - Impossibile collegare l'interfaccia web alla porta %1 + + + about - - Please select a limit method first - + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Un client BitTorrent avanzato scritto in C++, basato sul toolkit Qt e libtorrent-rastebar. + + + + Copyright %1 2006-2016 The qBittorrent project + Copyright %1 2006-2016 The qBittorrent project + + + + Home Page: + Homepage: + + + + Forum: + Forum: + + + + Bug Tracker: + Bug Tracker: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - + + Add Peers + Aggiungi peer - - Python not detected - + + List of peers to add (one per line): + Elenco dei peer da aggiungere (uno per riga): + + + + Format: IPv4:port / [IPv6]:port + Formato: IPv4:porta / [IPv6]: porta - WebApplication + authentication + + + + Tracker authentication + Autenticazione del tracker + + + + Tracker: + Tracker: + + + + Login + Accesso + - - Unacceptable file type, only regular file is allowed. - Tipo file non accettabile, sono permessi solo file regolari. + + Username: + Nome utente: - - Symlinks inside alternative UI folder are forbidden. - I collegamenti simbolici in cartelle interfaccia alternative non sono permessi. + + Password: + Password: - - Exceeded the maximum allowed file size (%1)! - Massima dimensione file permessa superata (%1)! + + Log in + Log in - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - Interfaccia web: intestazione Origin e origine Target non corrispondenti! IP sorgente: '%1'. Intestazione Origin: '%2': Intestazione Target: '%3' + + Cancel + Annulla + + + confirmDeletionDlg - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - Interfaccia web: Intestazione Referer e origine Target non corrispondenti! IP sorgente: '%1'. Intestazione referer: '%2'. Origine Target: '%3' + + Deletion confirmation - qBittorrent + Conferma di eliminazione - qBittorrent - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - Interfaccia web: Intestazione Host non valida, porte non corrispondenti. Sorgente IP di richiesta: '%1'. Porta server: '%2'. Intestazione Host ricevuta: '%3' + + Remember choice + Ricorda scelta - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - Interfaccia web: Intestazione Host non valida. IP sorgente di richiesta: '%1'. Intestazione Host ricevuta: '%2' + + Also delete the files on the hard disk + Elimina anche il relativo file dal disco fisso - WebUI + confirmShutdownDlg + + + Don't show again + Non mostrare più + + + + createTorrentDialog + + + Cancel + Annulla + + + + Torrent Creation Tool + Strumento di creazione torrent + + + + Torrent file creation + Creazione file torrent + + + + Add file + Aggiungi file + + + + Add folder + Aggiungi cartella + + + + File or folder to add to the torrent: + File o cartella da aggiungere al torrent: + + + + Tracker URLs: + URL dei tracker: + + + + Web seeds urls: + URL seed web: + + + + Comment: + Commento: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Separa i gruppi di tracker (tracker tiers) con una linea vuota. + + + + Piece size: + Dimensione parte: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + Auto + + + + Private (won't be distributed on DHT network if enabled) + Privato (non sarà condiviso su rete DHT se abilitata) + + + + Start seeding after creation + Inizia a distribuire dopo la creazione + + + + Ignore share ratio limits for this torrent + Ignora limiti rapporto condivisione per questo torrent + + + + Create and save... + Crea e salva... + + + + Progress: + Avanzamento: + + + + downloadFromURL + + + Add torrent links + Aggiungi collegamento torrent + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Uno per linea (sono supportati collegamenti HTTP, collegamenti Magnet e info-hash) + - - Web UI: HTTPS setup successful - Interfaccia web: HTTPS impostato con successo + + Download + Download + + + + Cancel + Annulla + + + + Download from urls + Download da indirizzo web - - Web UI: HTTPS setup failed, fallback to HTTP - Interfaccia web: impostazione HTTPS non riuscita, ripiego su HTTP + + No URL entered + Nessun indirizzo web inserito - - Web UI: Now listening on IP: %1, port: %2 - Interfaccia web: ora in ascolto sull'IP: %1, porta: %2 + + Please type at least one URL. + Inserire almeno un indirizzo web. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Interfaccia web: impossibile associarsi all'IP: %1, porta: %2. Motivo: %3 + + Crash info + Info crash fsutils - + + + + + Downloads - Scaricamenti + Download misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + Python non rilevato + + + + Python version: %1 + Versione Python: %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1h %2m - + %1d %2h e.g: 2days 10hours %1g %2h - + Unknown Unknown (size) Sconosciuta - + qBittorrent will shutdown the computer now because all downloads are complete. - Tutti gli scaricamenti sono stati completati, qBittorrent procederà ora con l'arresto del sistema. + Tutti i download sono stati completati, qBittorrent procederà ora con l'arresto del sistema. - + < 1m < 1 minute < 1m - + %1m e.g: 10minutes %1m + + + Working + In funzione + + + + Updating... + In aggiornamento... + + + + Not working + Non in funzione + + + + Not contacted yet + Non ancora contattato + preview - + Preview selection Anteprima della selezione - + The following files support previewing, please select one of them: I seguenti file supportano l'anteprima. Scegli uno di quelli: + + + Preview + Anteprima + + + + Cancel + Annulla + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_ja.ts qbittorrent-3.3.15/src/lang/qbittorrent_ja.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_ja.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_ja.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent qBittorrent について - + About - qBittorrent について + 情報 - + Author 作者 - - Current maintainer - 現在のメンテナー - - - - Greece - ギリシャ - - - - + + Nationality: 国籍: - - + + + Name: + 名前: + + + + E-mail: - E メール: + 電子メール: - - - Name: - 氏名: + + Greece + ギリシャ - - Original author - オリジナルの作者 + + Current maintainer + 現在のメンテナー - - France - フランス + + Original author + オリジナルのメンテナー - + Special Thanks 謝辞 - + Translators - 翻訳 + 翻訳者 - - License - ライセンス - - - + Libraries ライブラリ - + qBittorrent was built with the following libraries: qBittorrent は以下のライブラリを使用してビルドされています: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - Qt ツールキットと libtorrent-rasterbar を使用して C++ で書かれた高度な BitTorrent クライアントです。 - - - - Copyright %1 2006-2018 The qBittorrent project - Copyright %1 2006-2018 The qBittorrent project - - - - Home Page: - ホームページ: - - - - Forum: - フォーラム: + + France + フランス - - Bug Tracker: - バグトラッカー: + + License + ライセンス @@ -115,57 +90,67 @@ 保存先 - + + Browse... + 参照... + + + + Set as default save path + デフォルトの保存先に設定する + + + Never show again 次回から表示しない - + Torrent settings Torrent 設定 - + Set as default category デフォルトのカテゴリにする - + Category: カテゴリ: - + Start torrent Torrent を開始する - + Torrent information Torrent 情報 - + Skip hash check ハッシュチェックを省略する - + Size: サイズ: - + Hash: ハッシュ: - + Comment: コメント: - + Date: 作成日時: @@ -190,117 +175,89 @@ 自動 - - Remember last used save path - 最後に使用した保存先 - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog チェックマークをつけると、Torrent ファイルはオプションダイアログの "ダウンロード" ページの設定にかかわらず削除されません - + Do not delete .torrent file .torrent ファイルを削除しない - - Create subfolder - サブフォルダーを作成 - - - - Download in sequential order - シーケンシャルのダウンロードする - - - - Download first and last pieces first - 最初と最後のピースを先にダウンロード - - - + Normal 通常 - + High 高い - + Maximum 最高 - + Do not download ダウンロードしない - - - + + + I/O Error I/O エラー - + Invalid torrent 無効な Torrent - - Renaming - 名前の変更 - - - - - Rename error - 変名エラー - - - - The name is empty or contains forbidden characters, please choose a different one. - 名前が入力されていないか使用できない文字が含まれています。ほかの名前を入力してください。 + + + + + Already in download list + 既存の Torrent - + Not Available This comment is unavailable 利用できません - + Not Available This date is unavailable 利用できません - + Not available 不明 - + Invalid magnet link 無効なマグネットリンク - + The torrent file '%1' does not exist. Torrent ファイル '%1' が存在しません。 - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. Torrent ファイル '%1' をディスクから読み込めません。おそらくアクセス権がありません。 - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ エラー: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torrent はすでにダウンロードリストにあります。プライベート Torrent のためトラッカーはマージされません。 + + + + Torrent is already in download list. Trackers were merged. + Torrent はすでにダウンロードリストにあります。トラッカーをマージします。 + + + + + Cannot add torrent + Torrent を追加できません + + + + Cannot add this torrent. Perhaps it is already in adding state. + Torrent を追加できません。おそらくこれは現在追加中のものです。 + + + This magnet link was not recognized このマグネットリンクは認識されませんでした - + + Magnet link is already in download list. Trackers were merged. + マグネットリストはすでにダウンロードリストにあります。トラッカーをマージします。 + + + + Cannot add this torrent. Perhaps it is already in adding. + この Torrent は追加できません。おそらくこれはすでに追加中です。 + + + Magnet link マグネットリンク - + Retrieving metadata... メタデータを回収しています... - + Not Available This size is unavailable. 利用できません - + Free space on disk: %1 ディスクの空き容量: %1 - + + Choose save path 保存先の選択 - - - - - - - Torrent is already present - Torrent はすでに存在します - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - Torrent '%1' はすでに転送リストにあります。プライベート Torrent のためトラッカーはマージされません。 - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - Torrent '%1' はすでに転送リストにあります。トラッカーはマージされます。 + + Rename the file + ファイル名の変更 - - Torrent is already queued for processing. - Torrent はすでに処理待ち状態です。 - - - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - マグネットリンク '%1' はすでに転送リストにあります。トラッカーはマージされます。 + + New name: + 新しい名前: - - Magnet link is already queued for processing. - マグネットリンクはすでに処理待ち状態です。 + + + The file could not be renamed + ファイル名を変更できませんでした - - New name: - 新しい名前: + + This file name contains forbidden characters, please choose a different one. + ファイル名に使用できない文字が含まれています。別の文字を選択してください。 - - + + This name is already in use in this folder. Please use a different name. 同じ名前のファイルがこのフォルダー内に存在します。別の名前を指定してください。 - + The folder could not be renamed フォルダー名を変更できませんでした - + Rename... 名前の変更... - + Priority 優先度 - + Invalid metadata 不正なメタデータ - + Parsing metadata... メタデータを解析しています... - + Metadata retrieval complete メタデータの回収が完了しました - + Download Error ダウンロードエラー @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + ディスク書き込みキャッシュサイズ + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] 送出側ポート (最小) [0: 無効] - + Outgoing ports (Max) [0: Disabled] 送出側ポート (最大) [0: 無効] - + Recheck torrents on completion Torrent 完了時に再チェックする - + Transfer list refresh interval 転送リストのリフレッシュ間隔 - + ms milliseconds ms - + Setting 設定 - + Value Value set for this setting - - - (disabled) - (無効) - - - + (auto) (自動) - - min - minutes - - - - + All addresses 全アドレス - + qBittorrent Section qBittorrent セクション - - + + Open documentation ドキュメントを開く - + libtorrent Section libtorrent セクション - - Asynchronous I/O threads - 非同期 I/O スレッド数 - - - - Disk cache - ディスクキャッシュ - - - + s seconds s - + Disk cache expiry interval ディスクキャッシュ有効期限 - + Enable OS cache OS のキャッシュを有効にする - - Guided read cache - 誘導読み込みキャッシュ - - - - Coalesce reads & writes - コアレス読み込み & 書き込みを有効にする - - - - Send upload piece suggestions - アップロードピースサジェッションを送信する - - - - - KiB - KiB - - - - Send buffer watermark - バッファーのウォーターマークを送信する - - - - Send buffer low watermark - バッファーの最低ウォーターマークを送信する - - - - Send buffer watermark factor - バッファーのウォーターマークファクターを送信する - - - - Prefer TCP - TCP 優先 - - - - Peer proportional (throttles TCP) - ピア比例 (TCP を調整) - - - - Allow multiple connections from the same IP address - 同一 IP アドレスからの複数接続を許可する + + m + minutes + - + Resolve peer countries (GeoIP) ピアの国籍を解決する (GeoIP) - + Resolve peer host names ピアのホスト名を解決する - + Strict super seeding 厳密なスーパーシード - + Network Interface (requires restart) ネットワークインターフェース (再起動が必要) - + Optional IP Address to bind to (requires restart) バインドする IP アドレス (再起動が必要) - + Listen on IPv6 address (requires restart) IPV6 アドレスを待ち受ける (再起動が必要) - + Display notifications 通知を行う - + Display notifications for added torrents Torrent が追加されたときに通知する - + Download tracker's favicon - トラッカーのファビコンをダウンロードする - - - - Save path history length - 保存パス履歴の長さ - - - - Fixed slots - スロット数固定 - - - - Upload rate based - アップロード速度ベース - - - - Upload slots behavior - アップロードスロットの挙動 - - - - Round-robin - ラウンドロビン - - - - Fastest upload - 最速アップロード - - - - Anti-leech - アンチリーチ + トラッカーのファビコンをダウンロード - - Upload choking algorithm - アップロードチョークアルゴリズム - - - + Confirm torrent recheck Torrent の再チェック時に確認する - - Confirm removal of all tags - すべてのタグを削除するとき確認する - - - - Always announce to all trackers in a tier - 常にティア内の全トラッカーにアナウンスする + Exchange trackers with other peers + 他のピアとトラッカー情報を交換する - - Always announce to all tiers - 常に全ティアにアナウンスする + + Always announce to all trackers + 常にすべてのトラッカーにアナウンスする - + Any interface i.e. Any network interface どれか - + Save resume data interval How often the fastresume file is saved. 再開データ保存間隔 - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - %1-TCP 混在モードアルゴリズム - - - + Maximum number of half-open connections [0: Unlimited] 最大半開接続数 [0 無制限] - + IP Address to report to trackers (requires restart) トラッカーに報告する IP アドレス (再起動が必要) - + Enable embedded tracker 埋め込みトラッカーを有効にする - + Embedded tracker port 埋め込みトラッカーポート - + Check for software updates ソフトウェアアップデートをチェックする - + Use system icon theme システムのアイコンテーマを使用する @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 を起動しました - + Torrent: %1, running external program, command: %2 Torrent: %1, 外部プログラムを実行しています。コマンド: %2 - - Torrent name: %1 - Torrent 名: %1 - - - - Torrent size: %1 - Torrent サイズ: %1 - - - - Save path: %1 - 保存パス: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Torrent は %1 にダウンロードされました。 - - - - Thank you for using qBittorrent. - qBittorrent をご利用いただきありがとうございます。 - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' のダウンロードが完了しました + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrent: %1, 実行する外部プログラムのコマンドが長すぎます (長さ > %2)。実行に失敗しました。 - + Torrent: %1, sending mail notification Torrent: %1, 通知メールを送信しています - + Information 情報 - - To control qBittorrent, access the Web UI at %1 - qBittorrent を操作するには、%1 から WebUI にアクセスしてください + + To control qBittorrent, access the Web UI at http://localhost:%1 + qBittorrent を操作するには Web UI http://localhost:%1 にアクセスしてください - + The Web UI administrator user name is: %1 Web UI 管理者ユーザー名: %1 - + The Web UI administrator password is still the default one: %1 Web UI 管理者パスワードはまだデフォルトのままです: %1 - + This is a security risk, please consider changing your password from program preferences. これはセキュリティリスクになります。プログラム設定からパスワードを変更してください。 - + Saving torrent progress... Torrent の進行状況を保存しています... - - - Portable mode and explicit profile directory options are mutually exclusive - ポータブルモードとプロファイルディレクトリの直接指定は排他関係になります - - - - Portable mode implies relative fastresume - ポータブルモードは相対的に高速再開になります - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - WebAPI ログインに失敗しました。理由: IP アドレスは BAN されています。IP: %1, ユーザー名: %2 - - - - Your IP address has been banned after too many failed authentication attempts. - 多数の認証失敗により、あなたの IP アドレスは BAN (アクセス禁止) されました。 - - - - WebAPI login success. IP: %1 - WebAPI ログインに成功しました。 IP: %1 - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - WebAPI ログインに失敗しました。理由: 不正な認証, 試行回数: %1, IP: %2, ユーザー名: %3 - AutomatedRssDownloader - + Save to: 保存先: @@ -861,837 +658,700 @@ RSS ダウンローダー - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - RSS Torrent の自動ダウンロードは現在無効になっています。アプリケーションの設定で有効にできます。 + + Enable Automated RSS Downloader + 自動 RSS ダウンローダーを有効にする - + Download Rules ダウンロードルール - + Rule Definition ルール定義 - + Use Regular Expressions 正規表現を使用する - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - スマートエピソードフィルターは重複した回のダウンロードを回避します。 -サポートする形式: S01E01, 1x1, 2017.01.01 and 01.01.2017 (- を区切り文字とした日付形式もサポート) - - - - Use Smart Episode Filter - スマートエピソードフィルターを使用する - - - + Must Contain: マッチする文字列: - + Must Not Contain: 除外する文字列: - + Episode Filter: エピソードフィルター: - + Assign Category: カテゴリの割り当て: - + Save to a Different Directory 別のディレクトリへ保存する - + Ignore Subsequent Matches for (0 to Disable) ... X days 以後の一致は無視する (0 で無効) - + Disabled - 無効 + 無効 - + days - + - + Add Paused: 追加時に開始: - + Use global settings 全体設定を利用 - + Always 常に開始 - + Never 開始しない - + Apply Rule to Feeds: フィードに適用するルール: - + Matching RSS Articles マッチする RSS 記事 - + &Import... &インポート... - + &Export... &エクスポート... - + Matches articles based on episode filter. エピソードフィルイターで記事をマッチします。 - + Example: - 例: + 例: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match - シーズン 1 の第 2 話、5 話、8 話~15 話、30 話以降にマッチします + シーズン 1 の第 2 話、5 話、8 話~15 話、30 話以降にマッチします - + Episode filter rules: - エピソードフィルターのルール: + エピソードフィルターのルール: - + Season number is a mandatory non-zero value シーズン番号は 0 以外でなければなりません - + Episode number is a mandatory non-zero value + 話数は 0 以外でなければなりません + + + Filter must end with semicolon フィルターはセミコロンで終了しなければなりません - + Three range types for episodes are supported: - 3 種類の範囲指定をサポートしています: + 3 種類の範囲指定をサポートしています: - + Single number: <b>1x25;</b> matches episode 25 of season one 単一番号: <b>1x25;</b> はシーズン 1 の第 25 話にマッチします - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one 通常の範囲指定: <b>1x25-40;</b> はシーズン 1 の第 25 話から 40 話にマッチします - - Episode number is a mandatory positive value - 第何話かは正数でなければなりません - - - - Rules - ルール + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + 無限範囲: <b>1x25-;</b> はシーズン 1 の第 25 話以降にマッチします - - Rules (legacy) - ルール (レガシー) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - 範囲の未指定: <b>1x25-;</b> は一シーズンの第25話以降と、それ以降の前シーズンにマッチします + - + Last Match: %1 days ago 最後のマッチ: %1 日前 - + Last Match: Unknown 最後のマッチ: 不明 - + New rule name 新しいルール名 - + Please type the name of the new download rule. 新しいダウンロードルールの名前を入力してください。 - - + + Rule name conflict ルール名の衝突 - - + + A rule with this name already exists, please choose another name. この名前のルールはすでに存在しています。別の名前を選んでください。 - + Are you sure you want to remove the download rule named '%1'? ダウンロードルール '%1' を削除してよろしいですか? - + Are you sure you want to remove the selected download rules? 選択したダウンロードルールを削除してよろしいですか? - + Rule deletion confirmation ルールの削除の確認 - + Destination directory 保存先ディレクトリ - + Invalid action - 不正なアクション + 不正な操作 - + The list is empty, there is nothing to export. - リストが空です。エクスポートされるものはありません。 + リストは空です。エクスポートするものはありません。 - - Export RSS rules - RSS ルールのエクスポート + + Where would you like to save the list? + どこへリストを保存しますか? - - + + Rules list (*.rssrules) + ルールリスト (*.rssrules) + + + I/O Error I/O エラー - - Failed to create the destination file. Reason: %1 - 出力ファイルの作成に失敗しました。理由: %1 + + Failed to create the destination file + 保存先ファイルの作成に失敗しました - - Import RSS rules - RSS ルールのインポート + + Please point to the RSS download rules file + RSS ダウンロードルールファイルを指定してください - - Failed to open the file. Reason: %1 - ファイルのオープンに失敗しました。理由: %1 + + Rules list + ルールリスト - + Import Error インポートエラー - - Failed to import the selected rules file. Reason: %1 - 選択したルールファイルのインポートに失敗しました。理由: %1 + + Failed to import the selected rules file + 選択したルールファイルのインポートに失敗しました - + Add new rule... 新しいルールの追加... - + Delete rule ルールの削除 - + Rename rule... ルール名の変更... - + Delete selected rules 選択したルールの削除 - - Clear downloaded episodes... - ダウンロードした回をクリア... - - - + Rule renaming ルール名の変更 - + Please type the new rule name 新しいルール名を入力してください - - Clear downloaded episodes - ダウンロードした回をクリア - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - 選択したルールのダウンロード済み回のリストをクリアしますか? + + Regex mode: use Perl-like regular expressions + 正規表現モード: Perl ライクな正規表現を使用してください - - Regex mode: use Perl-compatible regular expressions - 正規表現モード: Perl 互換の正規表現を試用します - - - - - Position %1: %2 - 位置 %1: %2 - - - + Wildcard mode: you can use - ワイルドカードモード: 以下の文字が使えます + - + ? to match any single character - ? は任意の一文字にマッチします + - + * to match zero or more of any characters - * は任意の0文字以上の文字列にマッチします + - + Whitespaces count as AND operators (all words, any order) - 空白は AND 演算子とみなされます (単語の順序は任意) + - + | is used as OR operator - | は OR 演算子として使用します + - + If word order is important use * instead of whitespace. - 単語の順序が重要ならば空白でなく * を使用してください。 + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - 空の %1 節のときの表現 (例: %2) + - + will match all articles. - 全記事にマッチします。 + - + will exclude all articles. - 全記事にマッチしません。 - - - - BanListOptionsDialog - - - List of banned IP addresses - BAN した IP アドレスのリスト - - - - Ban IP - BAN した IP - - - - Delete - 削除 - - - - - Warning - 警告 + - - The entered IP address is invalid. - 入力された IP アドレスは正しくありません。 + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + ワイルドカードモード: <ul><li>? はあらゆる 1 文字にマッチします</li><li>* は 0 個以上のあらゆる文字にマッチします</li><li>空白で区切ると AND 条件とみなされます</li></ul> - - The entered IP is already banned. - 入力した IP アドレスはすでに BAN されています。 + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + ワイルドカードモード: <ul><li>? はあらゆる 1 文字とマッチします</li><li>* は 0 個以上のあらゆる文字にマッチします</li><li>| で区切ると OR 条件とみなされます</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support PeX サポートを切り換えるには再起動が必要です - - Could not get GUID of configured network interface. Binding to IP %1 - IP %1 にバインドされたネットワークインターフェースに設定された GUID を取得できませんでした - - - + Embedded Tracker [ON] 埋め込みトラッカー [ON] - + Failed to start the embedded tracker! 埋め込みトラッカーの起動に失敗しました! - + Embedded Tracker [OFF] 埋め込みトラッカー [OFF] - + + '%1' reached the maximum ratio you set. Removing... + '%1' は共有比の上限に達しました。削除します... + + + + '%1' reached the maximum ratio you set. Pausing... + '%1' は共有比の上限に達しました。停止します... + + + System network status changed to %1 e.g: System network status changed to ONLINE システムのネットワーク状態を %1 に変更しました - + ONLINE オンライン - + OFFLINE オフライン - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding %1 のネットワーク構成が変更されました。セッションバインディングをリフレッシュします - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. 設定されたネットワークインターフェースアドレス %1 は正しくありません。 - - + Encryption support [%1] 暗号化サポート [%1] - - + FORCED 強制 - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 は不正な IP アドレスのため BAN アドレスリストの適用中に削除されました。 - - - - + Anonymous mode [%1] 匿名モード [%1] - + Unable to decode '%1' torrent file. Torrent ファイル '%1' をデコードできません。 - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Torrent '%2' に埋め込まれたファイル '%1' の再帰ダウンロード - + Queue positions were corrected in %1 resume files - 再開ファイル %1 内のキューの位置を直しました + - + Couldn't save '%1.torrent' '%1.torrent' を保存できませんでした - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' が転送リストから削除されました。 - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' が転送リストおよびストレージから削除されました。 - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '%1' が転送リストから削除されましたがファイルは削除されませんでした。エラー: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. %1 が無効になっています。 - + because %1 is disabled. this peer was blocked because TCP is disabled. %1 が無効になっています。 - + URL seed lookup failed for URL: '%1', message: %2 URL シードのルックアップに失敗しました ― URL: '%1', メッセージ: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent はインターフェース %1 ポート %2/%3 での待ち受けに失敗しました。 理由: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' を転送リストおよびストレージから削除しました。 + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' を転送リストから削除しました。 + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... '%1' をダウンロードしています。お待ちください... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent はいずれかのインターフェースでの待ち受けを試みています。ポート: %1 - + The network interface defined is invalid: %1 定義されたネットワークインターフェースは無効です: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent はインターフェース %1 ポート %2 での待ち受けを試みています - - Peer ID: - ピア ID: - - - - HTTP User-Agent is '%1' - HTTP User-Agent は '%1' - - - - + DHT support [%1] DHT サポート [%1] - - - - - - - - - + + + + ON ON - - - - - - - - - + + + + OFF OFF - - + Local Peer Discovery support [%1] ローカルピア検出 (LSD) サポート [%1] - - PeX support [%1] - PeX support [%1] - - - - '%1' reached the maximum ratio you set. Removed. - '%1' は設定された最大共有比に達しましたので削除しました。 - - - - '%1' reached the maximum ratio you set. Paused. - '%1' は設定された最大共有比に達しましたので停止しました。 - - - - '%1' reached the maximum seeding time you set. Removed. - '%1' は設定された最大シード時間に達しましたので削除しました。 - - - - '%1' reached the maximum seeding time you set. Paused. - '%1' は最大シード時間に達しましたので停止しました。 + Restart is required to toggle Tracker Exchange support + トラッカー交換サポートを切り換えるには再起動が必要です - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent は待ち受ける %1 ローカルアドレスを検出できませんでした - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent はすべてのインターフェースでの待ち受けに失敗しました。ポート: %1. 理由: %2. - + Tracker '%1' was added to torrent '%2' Torrent '%2' にトラッカー '%1' が追加されました - + Tracker '%1' was deleted from torrent '%2' Torrent '%2' からトラッカー '%1' が削除されました - + URL seed '%1' was added to torrent '%2' Torrent '%2' に URL シード '%1' が追加されました - + URL seed '%1' was removed from torrent '%2' Torrent '%2' から URL シード '%1' が削除されました - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Torrent '%1' の再開に失敗しました。 - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number IP フィルターは正常に解析されました: %1 個のルールが適用されました。 - + Error: Failed to parse the provided IP filter. エラー: IP フィルターの解析に失敗しました。 - - '%1' restored. - 'torrent name' restored. - '%1' を復元しました。 - - - + Couldn't add torrent. Reason: %1 Torrent を追加できませんでした: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' を再開しました. (高速再開) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' をダウンロードリストに追加しました。 - + An I/O error occurred, '%1' paused. %2 I/O エラーが発生しました。'%1' を停止しました。 %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: ポートマッピングに失敗しました。メッセージ: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: ポートマッピングに成功しました。メッセージ: %1 - + due to IP filter. this peer was blocked due to ip filter. IP フィルターによる。 - + due to port filter. this peer was blocked due to port filter. ポートフィルターによる。 - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. i2p 混在モード制限による。 - + because it has a low port. this peer was blocked because it has a low port. 低いポート番号による。 - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 - qBittorrent はインターフェース %1, ポート: %2/%3 での待ち受けを正常に開始しました + qBittorrent はインターフェース %1, ポート: %2/%3 での待ち受けを正常に開始しました - + External IP: %1 e.g. External IP: 192.168.0.1 外部 IP: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - 新規 Torrent ファイルの作成失敗 - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - 最初と最後のピースを先にダウンロード: %1, torrent: '%2' - - - - On - On - - - - Off - Off - - - - Successfully moved torrent: %1. New path: %2 - Torrent の移動に成功しました:: %1, 新しいパス: %2 - - - + Could not move torrent: '%1'. Reason: %2 - Torrent を移動せきませんでした: '%1'. 理由: %2 + Torrent '%1' を移動できませんでした。理由: %2 - + File sizes mismatch for torrent '%1', pausing it. - Torrent '%1'のファイルサイズが一致しません。解析しています。 + Torrent '%1' のファイルサイズにミスマッチがあります。停止します。 - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - Torrent '%1' の高速再開データが拒否されました。理由: %2。再チェックしています... + Torrent '%1' 高速再開データはリジェクトされました (理由: %2)。再チェックしています... CategoryFilterModel - + Categories - カテゴリ + カテゴリ - + All - すべて + すべて - + Uncategorized - カテゴリなし + @@ -1699,42 +1359,145 @@ Add category... - カテゴリの追加... + カテゴリの追加... Add subcategory... - サブカテゴリの追加... + - Edit category... - カテゴリの編集... + Remove category + カテゴリの削除 + + + + Remove unused categories + 未使用のカテゴリを削除 + + + + Resume torrents + Torrent の再開 + + + + Pause torrents + Torrent の停止 + + + + Delete torrents + Torrent の削除 + + + + New Category + 新規カテゴリ + + + + Category: + カテゴリ: + + + + Invalid category name + 不正なカテゴリ名 + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + すべて (0) + + + Uncategorized (0) + カテゴリなし (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + カテゴリなし (%1) + + + Add category... + カテゴリの追加... - Remove category - カテゴリの削除 + カテゴリの削除 - Remove unused categories - 未使用のカテゴリを削除 + 未使用のカテゴリを削除 - Resume torrents - Torrent の再開 + Torrent の再開 - Pause torrents - Torrent の停止 + Torrent の停止 - Delete torrents - Torrent の削除 + Torrent の削除 + + + New Category + 新規カテゴリ + + + Category: + カテゴリ: + + + Invalid category name + 不正なカテゴリ名 + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + カテゴリ名に '\' は使用できません。 +カテゴリ名の先頭および末尾に '/' は使用できません。 +カテゴリ名に連続する '//' は使用できません。 + + + All (%1) + this is for the category filter + すべて (%1) @@ -1774,220 +1537,101 @@ - DeletionConfirmationDialog - - - Deletion confirmation - 削除の確認 - - - - Remember choice - 次回から確認しない - - - - Also delete the files on the hard disk - ストレージ上のファイルも削除する - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? '%1' を転送リストから削除してよろしいですか? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - これら %1 個の Torrent を転送リストから削除してよろしいですか? - - - - DownloadFromURLDialog - - - Download from URLs - URL からダウンロード - - - - Add torrent links - Torrent リンクを追加してください - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - 1 行に 1 リンク (HTTP リンク、マグネットリンクおよび情報ハッシュをサポートしています) - - - - Download - ダウンロード - - - - No URL entered - URL が入力されていません - - - - Please type at least one URL. - 1 個以上の URL を入力してください。 + 転送リストから %1 個の Torrent を削除してよろしいですか? DownloadedPiecesBar - + White: Missing pieces 白: 不足のピース - + Green: Partial pieces 緑: 不完全なピース - + Blue: Completed pieces 青: 完了したピース - ExecutionLogWidget + ExecutionLog - + General 全般 - + Blocked IPs - ブロックした IP + ブロック IP - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - <font color='red'>%1</font> はブロックされました %2 + <font color='red'>%1</font> をブロックしました: %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - <font color='red'>%1</font> は BAN されました + <font color='red'>%1</font> をアクセス禁止にしました FeedListWidget - + RSS feeds RSS フィード - - - Unread (%1) - 未読 (%1) + + Unread + 未読 FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - ログファイルをオープンしようとしたらエラーが発生しました。ロギングは無効になります。 - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - 閲覧(&B)... - - - - Choose a file - Caption for file open/save dialog - ファイルの選択 - - - - Choose a folder - Caption for directory open dialog - フォルダーの選択 - - - - Any file - すべてのファイル + + An error occured while trying to open the log file. Logging to file is disabled. + ログファイルを開くときにエラーが発生しました。ファイルへのロギングが無効になっています。 FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - I/O エラー: IP フィルターファイルを読み込みモードで開けませんでした。 - - - - - - IP filter line %1 is malformed. - IP フィルターの行 %1 が不正です。 - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - IP フィルターの行 %1 が不正です。IP レンジの先頭が正しくありません。 - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - IP フィルターの行 %1 が不正です。IP レンジの最後が正しくありません。 - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - IP フィルターの行 %1 が不正です。IPv6 のなかに IPv4 がまぎれています! - - - - - IP filter exception thrown for line %1. Exception is: %2 - IP フィルター例外が行 %1 から送出されました。例外は: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - %1 個の IP フィルター解析エラーが発生しました。 + + + + I/O Error: Could not open ip filter file in read mode. + I/O エラー: IP フィルターを読み込みモードで開けませんでした。 - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. 解析エラー: フィルターファイルは正しい PeerGuardian P2B ファイルではありません。 @@ -1995,396 +1639,472 @@ GeoIPDatabase - - + + Unsupported database file size. 未サポートのデータベースファイルサイズです。 - + Metadata error: '%1' entry not found. メタデータエラー: '%1' エントリが見つかりません。 - + Metadata error: '%1' entry has invalid type. メタデータエラー: '%1' エントリは不正なタイプです。 - + Unsupported database version: %1.%2 未サポートのデータベースバージョン: %1.%2 - + Unsupported IP version: %1 未サポートの IP バージョン: %1 - + Unsupported record size: %1 未サポートのレコードサイズ: %1 - + Invalid database type: %1 不正なデータベースタイプ: %1 - + Database corrupted: no data section found. 破損したデータベース: データセクションが見つかりません。 - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - HTTP リクエストサイズが上限に達しました。ソケットをクローズします。上限: %ld, IP: %s + + File + ファイル - - Bad Http request, closing socket. IP: %s - 不正な HTTP リスエストです。ソケットをクローズします。IP: %s + + Edit + 編集 - - - HttpServer - + + Help + ヘルプ + + + Exit qBittorrent qBittorrent の終了 - + Only one link per line 1 行に 1 リンクを入力してください - + + Download + ダウンロード + + + Global upload rate limit must be greater than 0 or disabled. 全体のアップロード速度制限は 0 より大きいか無効にしなければなりません。 - + Global download rate limit must be greater than 0 or disabled. 全体のダウンロード速度制限は 0 より大きいか無効にしなければなりません。 - + Alternative upload rate limit must be greater than 0 or disabled. 代替アップロード速度制限は 0 より大きいか無効にしなければなりません。 - + Alternative download rate limit must be greater than 0 or disabled. 代替ダウンロード速度制限は 0 より大きいか無効にしなければなりません。 - + Maximum active downloads must be greater than -1. 最大アクティブダウンロード数は 1 より大きくしなければなりません。 - + Maximum active uploads must be greater than -1. 最大アクティブアップロード数は 1 より大きくしなければなりません。 - + Maximum active torrents must be greater than -1. 最大アクティブ Torrent 数は 1 より大きくしなければなりません。 - + Maximum number of connections limit must be greater than 0 or disabled. 最大接続数は 0 より大きいか無効でなくてはなりません。 - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Torrent ごとの最大接続数は 0 より大きいか無効でなくてはなりません。 - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. 最大アップロートスロット数は 0 より大きいか無効でなくてはなりません。 - + Unable to save program preferences, qBittorrent is probably unreachable. プログラム設定の保存ができません。qBittorrent はおそらく通信可能状態にありません。 - - IRC: #qbittorrent on Freenode - IRC: Freenode 上で #qbittorrent - - - - Invalid category name: -Please do not use any special characters in the category name. - 不正なカテゴリ名: -カテゴリ名に特殊文字は使わないでください。 - - - - Unknown - 不明 - - - - Hard Disk - ハードディスク - - - - Share ratio limit must be between 0 and 9998. - 共有比は 0 から 9998 の間でなければなりません。 - - - - Seeding time limit must be between 0 and 525600 minutes. - シード時間制限は 0 から 525600 分の間でなければなりません。 + + Language + 言語 - + The port used for incoming connections must be between 1 and 65535. 着信接続に使用するポートは 1 から 65535 の間でなくてはなりません。 - + The port used for the Web UI must be between 1 and 65535. Web UI に使用するポートは 1 から 65535 の間でなくてはなりません。 - + Unable to log in, qBittorrent is probably unreachable. ログインできません。おそらく qBittorrent から到達できません。 - + Invalid Username or Password. ユーザー名またはパスワーが正しくありません。 - - Username - ユーザー名 - - - + Password パスワード - + Login ログイン - + + Upload Failed! + アップロード失敗! + + + Original authors オリジナルの作者 - + + Upload limit: + アップロード速度制限: + + + + Download limit: + ダウンロード速度制限: + + + Apply 適用 - + Add 追加 - + + Category: + カテゴリ: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Torrent のアップロード - + + All + すべて + + + + Downloading + ダウンロード中 + + + + Seeding + シード中 + + + + Completed + 完了 + + + + Resumed + 再開 + + + + Paused + 停止 + + + + Active + 動作中 + + + + Inactive + 非動作 + + + Save files to location: ファイルの保存場所: - + Cookie: Cookie: - + Type folder here フォルダーをここに入力してください - + + Run an external program on torrent completion + Torrent 完了時に外部プログラムを実行する + + + + Enable bandwidth management (uTP) + 帯域管理 (uTP) を有効にする + + + + Apply rate limit to uTP connections + 速度制限を uTP 接続にも適用する + + + + Alternative Global Rate Limits + 全体の代替速度制限 + + + More information 詳しい情報 - + Information about certificates SSL 証明書について - + Save Files to ファイルの保存先 - - Set location - 場所の設定 - - - - Limit upload rate - アップロード速度制限 + + Watch Folder + 監視フォルダー - - Limit download rate - ダウンロード速度制限 + + Default Folder + デフォルトのフォルダー - - Rename torrent - Torrent 名の変更 + + from + from time1 to time2 + 開始 - - Unable to create category - + + to + from time1 to time2 + 終了 - + Other... Save Files to: Watch Folder / Default Folder / Other... その他... - + + Every day + Schedule the use of alternative rate limits on ... + 毎日 + + + + Week days + Schedule the use of alternative rate limits on ... + 平日 + + + + Week ends + Schedule the use of alternative rate limits on ... + 週末 + + + Monday Schedule the use of alternative rate limits on ... 月曜日 - + Tuesday Schedule the use of alternative rate limits on ... 火曜日 - + Wednesday Schedule the use of alternative rate limits on ... 水曜日 - + Thursday Schedule the use of alternative rate limits on ... 木曜日 - + Friday Schedule the use of alternative rate limits on ... 金曜日 - + Saturday Schedule the use of alternative rate limits on ... 土曜日 - + Sunday Schedule the use of alternative rate limits on ... 日曜日 - + + Downloaded + Is the file downloaded or not? + ダウンロード + + + Logout ログアウト - + + Download from URLs + URLからダウンロード + + + Download Torrents from their URLs or Magnet links Torrent を URL またはマグネットリンクからダウンロードします - + Upload local torrent ローカルの Torrent をアップロード - + Are you sure you want to delete the selected torrents from the transfer list? 選択された Torrent を転送リストから削除しますか? - + Save 保存 - + qBittorrent client is not reachable qBittorrent クライアントと通信できません - - qBittorrent has been shutdown. - qBittorrent は停止しています。 - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - ホワイトリストに登録された IP サブネットの一覧 + + HTTP Server + HTTP サーバー - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - 例: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + 以下のパラメーターがサポートされています: - - Add subnet - サブネットの追加 + + Torrent path + Torrent のパス - - Delete - 削除 + + Torrent name + Torrent の名前 - - Error - エラー + + qBittorrent has been shutdown. + qBittorrent は停止しています。 + + + LineEdit - - The entered subnet is invalid. - 入力されたサブネットは正しくありません。 + + Clear the text + テキストをクリア LogListWidget - + Copy コピー - + Clear クリア @@ -2417,551 +2137,493 @@ ダウンロード完了時(&D) - + &View 表示(&V) - + &Options... オプション(&O)... - + &Resume 再開(&R) - + Torrent &Creator Torrent クリエーター(&C) - + Set Upload Limit... アップロード速度制限の設定... - + Set Download Limit... ダウンロード速度制限の設定... - + Set Global Download Limit... 全体のダウンロード速度制限の設定... - + Set Global Upload Limit... 全体のアップロード速度制限の設定... - + Minimum Priority 最低優先度 - + Top Priority 最高優先度 - + Decrease Priority 優先度を下げる - + Increase Priority 優先度を上げる - - + + Alternative Speed Limits 代替速度制限 - + &Top Toolbar トップツールバー(&T) - + Display Top Toolbar トップツールバーを表示します - - Status &Bar - ステータスバー(&B) - - - + S&peed in Title Bar タイトルバーに速度を表示(&P) - + Show Transfer Speed in Title Bar タイトルバーに転送速度を表示します - + &RSS Reader RSS リーダー(&R) - + Search &Engine 検索エンジン(&E) - + L&ock qBittorrent qBittorrent をロック(&O) - + Do&nate! 寄付(&N)! - - Close Window - ウィンドウを閉じる - - - + R&esume All すべて再開(&E) - + Manage Cookies... Cookie の管理... - + Manage stored network cookies - 保存されている Cookie を管理します + 保存されている Cookie を管理します - + Normal Messages 一般メッセージ - + Information Messages 情報メッセージ - + Warning Messages 警告メッセージ - + Critical Messages 危機的メッセージ - + &Log ログ(&L) - + &Exit qBittorrent qBittorrent を終了(&E) - + &Suspend System システムをサスペンド(&S) - + &Hibernate System システムをハイバーネート(&H) - + S&hutdown System システムをシャットダウン(&H) - + &Disabled なにもしない(&D) - + &Statistics 統計情報(&S) - + Check for Updates 更新をチェック - + Check for Program Updates プログラムの更新情報をチェックします - + &About qBittorrent について(&A) - + &Pause 停止(&P) - + &Delete 削除(&D) - + P&ause All すべて停止(&A) - + &Add Torrent File... Torrent ファイルの追加(&A)... - + Open 開く - + E&xit 終了(&X) - + Open URL URL を開く - + &Documentation ドキュメント(&D) - + Lock ロック - - - + + + Show 表示 - + Check for program updates プログラムの更新情報をチェックします - + Add Torrent &Link... Torrent リンクの追加(&L)... - + If you like qBittorrent, please donate! qBittorrent を気に入っていただけましたか? でしたら寄付をお願いします! - - + Execution Log 実行ログ - + Clear the password パスワードのクリア - + Filter torrent list... Torrent リストをフィルター... - + &Set Password パスワードの設定(&S) - - Preferences - 設定 - - - + &Clear Password パスワードのクリア(&C) - + Transfers 転送 - - - qBittorrent is minimized to tray - qBittorrent はシステムトレイに最小化されました - - - - - - This behavior can be changed in the settings. You won't be reminded again. - この振る舞いは設定から変更できます。この通知は次回からは表示されません。 - - - + Torrent file association Torrent ファイルの関連付け - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent は Torrent ファイルやマグネットリンクを開くデフォルトアプリケーションではありません。 qBittorrent を Torrent ファイルおよびマグネットリンクに関連付けますか? - + Icons Only アイコンのみ - + Text Only 文字のみ - + Text Alongside Icons アイコンの横に文字 - + Text Under Icons アイコンの下に文字 - + Follow System Style システムの設定に従う - - - + + + UI lock password UI ロックパスワード - - - + + + Please type the UI lock password: UI ロックパスワードを入力してください: - + The password should contain at least 3 characters パスワードは 3 文字以上でなくてはなりません - + Password update パスワードの更新 - + The UI lock password has been successfully updated UI ロックパスワードは正常に更新されました - + Are you sure you want to clear the password? パスワードをクリアしてよろしいですか? - - Use regular expressions - 正規表現を使用 - - - + Search 検索 - + Transfers (%1) 転送 (%1) - + Error エラー - + Failed to add torrent: %1 Torrent の追加に失敗しました: %1 - + Torrent added Torrent が追加 - + '%1' was added. e.g: xxx.avi was added. '%1' が追加されました。 - + Download completion ダウンロード完了 - + I/O Error i.e: Input/Output Error I/O エラー - + Recursive download confirmation 再帰的ダウンロードの確認 - + Yes はい - + No いいえ - + Never すべてしない - + Global Upload Speed Limit 全体のアップロード速度上限 - + Global Download Speed Limit 全体のダウンロード速度上限 - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent はアップデートされました。それを反映するために再起動が必要です。 - - - - qBittorrent is closed to tray - qBittorrent はシステムトレイに閉じられました - - - - Some files are currently transferring. - 一部のファイルは現在転送中です。 - - - - Are you sure you want to quit qBittorrent? - qBittorrent を終了しますか? - - - + &No いいえ(&N) - + &Yes はい(&Y) - + &Always Yes 常にはい(&A) - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - Python バージョンを検出できませんでした。検索エンジンは無効になります。 - - - + Old Python Interpreter Python インタープリターが古すぎます - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. Python バージョン (%1) はサポートされていません。検索エンジンを使用するには Python をアップグレードしてください。 サポートしているバージョン: 2.7.9 / 3.3.0 以上。 - + qBittorrent Update Available 新しいバージョンの qBittorrent が利用できます - + + A new version is available. +Do you want to download %1? + 新しいバージョンが利用可能です。. +%1 をダウンロードしますか? + + + Already Using the Latest qBittorrent Version すでに最新の qBittorrent を使用しています - + Undetermined Python version Python バージョンを解決できません - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. '%1' のダウンロードが完了しました。 - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2970,158 +2632,154 @@ 理由: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? Torrent '%1' は Torrent ファイルを含んでいます。これらのダウンロードを行いますか? - + Couldn't download file at URL '%1', reason: %2. URL '%1' のファイルをダウンロードできませんでした (理由: %2)。 - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin 見つかった Python %1: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + Python のバージョンを解決できませんでした (%1)。検索エンジンを無効にしました。 + + + + Missing Python Interpreter Python インタープリターが見つかりません - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? 検索エンジンを使用するには Python が必要ですがインストールされていないようです。 いますぐインストールしますか? - + Python is required to use the search engine but it does not seem to be installed. 検索エンジンを使用するには Python が必要ですがインストールされていないようです。 - - A new version is available. - 新バージョンの qBittorrent を利用できます。 - - - - Do you want to download %1? - %1 をダウンロードしますか? - - - - Open changelog... - 変更履歴を開く... - - - + No updates available. You are already using the latest version. 更新情報がありません。 すでに最新のバージョンを使用しています。 - + &Check for Updates 更新情報のチェック(&C) - + Checking for Updates... 更新情報をチェックしています... - + Already checking for program updates in the background プログラムの更新情報をバックグラウンドでチェックしています - + Python found in '%1' Python が '%1' に見つかりました - + Download error ダウンロードエラー - + Python setup could not be downloaded, reason: %1. Please install it manually. Python セットアップをダウンロードできませんでした。理由: %1。 手動でインストールしてください。 - - + + Invalid password 不正なパスワード - - - + + RSS (%1) RSS (%1) - + URL download error URL ダウンロードエラー - + The password is invalid パスワードが正しくありません - - + + DL speed: %1 e.g: Download speed: 10 KiB/s DL 速度: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s UP 速度: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [D: %1, U: %2] qBittorrent %3 - + Hide 隠す - + Exiting qBittorrent qBittorrent の終了 - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + 現在転送中のファイルがあります。 +qBittorrent を終了しますか? + + + Open Torrent Files Torrent ファイルを開く - + Torrent Files Torrent ファイル - + Options were saved successfully. オプションは正常に保存されました。 @@ -3129,52 +2787,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. ダイナミック DNS は正常に更新されました。 - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. ダイナミック DNS エラー: サービスが一時的に利用できない状態です。30分後にリトライします。 - + Dynamic DNS error: hostname supplied does not exist under specified account. ダイナミック DNS エラー: 与えられたホスト名が指定されたアカウント下に存在しません。 - + Dynamic DNS error: Invalid username/password. ダイナミック DNS エラー: 不正なユーザー名/パスワードです。 - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. ダイナミック DNS エラー: qBittorrent はサービスのブラックリストに入っています。, バグとして http://bugs.qbittorrent.org に報告してください。 - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. ダイナミック DNS エラー: サービスから %1 が返されました。バグとして http://bugs.qbittorrent.org に報告してください。 - + Dynamic DNS error: Your username was blocked due to abuse. ダイナミック DNS エラー: あなたのユーザー名は不正利用を理由にブロックされました。 - + Dynamic DNS error: supplied domain name is invalid. ダイナミック DNS エラー: 与えられたドメイン名は無効です。 - + Dynamic DNS error: supplied username is too short. ダイナミック DNS エラー: 与えられたユーザー名は短すぎます。 - + Dynamic DNS error: supplied password is too short. ダイナミック DNS エラー: 与えられたパスワードは短すぎます。 @@ -3182,1413 +2840,1304 @@ Net::DownloadHandler - + I/O Error I/O エラー - + The file size is %1. It exceeds the download limit of %2. ファイルサイズは %1 です。これは %2 のダウンロード制限を超えます。 - + Unexpected redirect to magnet URI. 予期しないマグネット URL へのリダイレクトです。 + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - リモートホスト名が見つかりませんでした (不正なホスト名) + + + GeoIP database loaded. Type: %1. Build time: %2. + GeoIP データベースを読み込みました。タイプ: %1. ビルド日時: %2. - - The operation was canceled - 操作はキャンセルされました + + + Couldn't load GeoIP database. Reason: %1 + GeoIP データベースを読み込めませんでした。理由: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - リモートサーバーは応答全体を受信して処理される前にクローズしました + + Venezuela, Bolivarian Republic of + ベネズエラ - - The connection to the remote server timed out - リモートサーバーへの接続はタイムアウトになりました + + Viet Nam + ベトナム - - SSL/TLS handshake failed - SSL/TLS ハンドシェイクに失敗しました + + + N/A + N/A - - The remote server refused the connection - リモートサーバーは接続を拒否しました + + Andorra + アンドラ - - The connection to the proxy server was refused - プロキシサーバーへの接続に失敗しました + + United Arab Emirates + アラブ首長国連邦 - - The proxy server closed the connection prematurely - プロキシサーバーは接続をクローズしました + + Afghanistan + アフガニスタン - - The proxy host name was not found - プロキシのホスト名が見つかりませんでした + + Antigua and Barbuda + アンティグア・バーブーダ - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - プロキシへの接続はタイムアウトになったか、プロキシはリクエスト送信時間内に応答しませんでした + + Anguilla + アンギラ - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - プロキシはリクエストを受けて認証を要求しましたが、提示されたすべての認証を受け付けませんでした - - - - The access to the remote content was denied (401) - リモートコンテンツへのアクセスは拒否されました (401) - - - - The operation requested on the remote content is not permitted - リモートコンテンツへの要求操作は許可されていません - - - - The remote content was not found at the server (404) - リモートコンテンツがサーバー内に見つかりませんでした (404) - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - リモートサーバーはコンテンツを提供するための認証を要求しましたが、提示された認証は受け付けられませんでした - - - - The Network Access API cannot honor the request because the protocol is not known - 未知のプロトコルのため、ネットワークアクセス API はリクエストを受け入れることができませんでした - - - - The requested operation is invalid for this protocol - 要求された操作はこのプロトコルでは正しくありません - - - - An unknown network-related error was detected - 未知のネットワーク関連エラーが検出されました - - - - An unknown proxy-related error was detected - 未知のプロキシ関連エラーが検出されました - - - - An unknown error related to the remote content was detected - リモートコンテンツに関連する未知のエラーが検出されました - - - - A breakdown in protocol was detected - プロトコルの断絶が検出されました - - - - Unknown error - 未知のエラー - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - GeoIP データベースを読み込みました。タイプ: %1. ビルド日時: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - GeoIP データベースを読み込めませんでした。理由: %1 - - - - Venezuela, Bolivarian Republic of - ベネズエラ - - - - Viet Nam - ベトナム - - - - - N/A - N/A - - - - Andorra - アンドラ - - - - United Arab Emirates - アラブ首長国連邦 - - - - Afghanistan - アフガニスタン - - - - Antigua and Barbuda - アンティグア・バーブーダ + + Albania + アルバニア - Anguilla - アンギラ - - - - Albania - アルバニア - - - Armenia アルメニア - + Angola アンゴラ - + Antarctica 南極大陸 - + Argentina アルゼンチン - + American Samoa アメリカ領サモア - + Austria オーストリア - + Australia オーストラリア - + Aruba アルバ - + Azerbaijan アゼルバイジャン - + Bosnia and Herzegovina ボスニア・ヘルツェゴビナ - + Barbados バルバドス - + Bangladesh バングラデシュ - + Belgium ベルギー - + Burkina Faso ブルキナ・ファソ - + Bulgaria ブルガリア - + Bahrain バーレーン - + Burundi ブルンジ - + Benin ベナン - + Bermuda バーミューダ諸島 - + Brunei Darussalam ブルネイ・ダルサラーム - + Brazil ブラジル - + Bahamas バハマ - + Bhutan ブータン - + Bouvet Island ブーベ島 - + Botswana ボツワナ - + Belarus ベラルーシ - + Belize ベリーズ - + Canada カナダ - + Cocos (Keeling) Islands ココス (キーリング) 諸島 - + Congo, The Democratic Republic of the コンゴ民主共和国 - + Central African Republic 中央アフリカ - + Congo コンゴ - + Switzerland スイス - + Cook Islands クック諸島 - + Chile チリ - + Cameroon カメルーン - + China 中国 - + Colombia コロンビア - + Costa Rica コスタリカ - + Cuba キューバ - + Cape Verde カーボベルデ - + Curacao キュラソー - + Christmas Island クリスマス島 - + Cyprus キプロス - + Czech Republic チェコ - + Germany ドイツ - + Djibouti ジブチ - + Denmark デンマーク - + Dominica ドミニカ国 - + Dominican Republic ドミニカ共和国 - + Algeria アルジェリア - + Ecuador エクアドル - + Estonia エストニア - + Egypt エジプト - + Western Sahara 西サハラ - + Eritrea エリトリア - + Spain スペイン - + Ethiopia エチオピア - + Finland フィンランド - + Fiji フィジー - + Falkland Islands (Malvinas) フォークランド (マルビナス) 諸島 - + Micronesia, Federated States of ミクロネシア連邦 - + Faroe Islands フェロー諸島 - + France フランス - + Gabon ガボン - + United Kingdom イギリス - + Grenada グレナダ - + Georgia ジョージア (グルジア) - + French Guiana フランス領ギアナ - + Ghana ガーナ - + Gibraltar ジブラルタル - + Greenland グリーンランド - + Gambia ガンビア - + Guinea ギニア - + Guadeloupe グアドループ - + Equatorial Guinea 赤道ギニア - + Greece ギリシャ - + South Georgia and the South Sandwich Islands サウスジョージア・サウスサンドウィッチ諸島 - + Guatemala グアテマラ - + Guam グアム - + Guinea-Bissau ギニアビサウ - + Guyana ガイアナ - + Hong Kong 香港 - + Heard Island and McDonald Islands ハード島とマクドナルド諸島 - + Honduras ホンジュラス - + Croatia クロアチア - + Haiti ハイチ - + Hungary ハンガリー - + Indonesia インドネシア - + Ireland アイルランド - + Israel イスラエル - + India インド - + British Indian Ocean Territory イギリス領インド洋地域 - + Iraq イラク - + Iran, Islamic Republic of イラン - + Iceland アイスランド - + Italy イタリア - + Jamaica ジャマイカ - + Jordan ヨルダン - + Japan 日本 - + Kenya ケニア - + Kyrgyzstan キルギスタン - + Cambodia カンボジア - + Kiribati キリバス - + Comoros コモロ - + Saint Kitts and Nevis セントクリストファー・ネイビス - + Korea, Democratic People's Republic of 北朝鮮 - + Korea, Republic of 韓国 - + Kuwait クウェート - + Cayman Islands ケイマン諸島 - + Kazakhstan カザフスタン - + Lao People's Democratic Republic ラオス - + Lebanon レバノン - + Saint Lucia セントルシア - + Liechtenstein リヒテンシュタイン - + Sri Lanka スリランカ - + Liberia リベリア - + Lesotho レソト - + Lithuania リトアニア - + Luxembourg ルクセンブルク - + Latvia ラトビア - + Morocco モロッコ - + Monaco モナコ - + Moldova, Republic of モルドバ - + Madagascar マダガスカル - + Marshall Islands マーシャル諸島 - + Mali マリ - + Myanmar ミャンマー - + Mongolia モンゴル - + Northern Mariana Islands 北マリアナ諸島 - + Martinique マルティニーク - + Mauritania モーリタニア - + Montserrat モントセラト - + Malta マルタ - + Mauritius モーリシャス - + Maldives モルディブ - + Malawi マワリ - + Mexico メキシコ - + Malaysia マレーシア - + Mozambique モザンビーク - + Namibia ナミビア - + New Caledonia ニューカレドニア - + Niger ニジェール - + Norfolk Island ノーフォーク島 - + Nigeria ナイジェリア - + Nicaragua ニカラグア - + Netherlands オランダ - + Norway ノルウェイ - + Nepal ネパール - + Nauru ナウル - + Niue ニウエ - + New Zealand ニュージーランド - + Oman オマーン - + Panama パナマ - + Peru ペルー - + French Polynesia フランス領ポリネシア - + Papua New Guinea パプアニューギニア - + Philippines フィリピン - + Pakistan パキスタン - + Poland ポーランド - + Saint Pierre and Miquelon サンピエール島・ミクロン島 - + Puerto Rico プエルトリコ - + Portugal ポルトガル - + Palau パラウ - + Paraguay パラグアイ - + Qatar カタール - + Reunion レユニオン - + Romania ルーマニア - + Russian Federation ロシア - + Rwanda ルワンダ - + Saudi Arabia サウジアラビア - + Solomon Islands ソロモン諸島 - + Seychelles セーシェル - + Sudan スーダン - + Sweden スウェーデン - + Singapore シンガポール - + Slovenia スロベニア - + Svalbard and Jan Mayen スヴァールバル諸島およびヤンマイエン島 - + Slovakia スロバキア - + Sierra Leone シエラレオネ - + San Marino サンマリノ - + Senegal - セネガル + セネガル + - + Somalia ソマリア - + Suriname スリナム - + Sao Tome and Principe サントメ・プリンシペ - + El Salvador エルサルバドル - + Syrian Arab Republic シリア - + Swaziland スワジランド - + Turks and Caicos Islands タークス・カイコス諸島 - + Chad チャド - + French Southern Territories フランス領南方・南極地域 - + Togo トーゴ - + Thailand タイ - + Tajikistan タジキスタン - + Tokelau トケラウ - + Turkmenistan トルクメニスタン - + Tunisia チュニジア - + Tonga トンガ - - Could not decompress GeoIP database file. - GeoIP データベースファイルを展開できませんでした。 - - - + Timor-Leste 東ティモール - + Bolivia, Plurinational State of ボリビア - + Bonaire, Sint Eustatius and Saba ボネール、シント・ユースタティウスおよびサバ - + Cote d'Ivoire コートジボワール - + Libya リビア - + Saint Martin (French part) サン・マルタン - + Macedonia, The Former Yugoslav Republic of マケドニア - + Macao マカオ - + Pitcairn ピトケアン諸島 - + Palestine, State of パレスチナ - + Saint Helena, Ascension and Tristan da Cunha セント・ヘレナ - + South Sudan 南スーダン - + Sint Maarten (Dutch part) シント・マールテン - + Turkey トルコ - + Trinidad and Tobago トリニダード・トバゴ - + Tuvalu ツバル - + Taiwan 台湾 - + Tanzania, United Republic of タンザニア - + Ukraine ウクライナ - + Uganda ウガンダ - + United States Minor Outlying Islands 合衆国領有小離島 - + United States アメリカ - + Uruguay ウルグアイ - + Uzbekistan ウズベキスタン - + Holy See (Vatican City State) バチカン - + Saint Vincent and the Grenadines セントビンセント・グレナディーン - + Virgin Islands, British イギリス領ヴァージン諸島 - + Virgin Islands, U.S. アメリカ領ヴァージン諸島. - + Vanuatu バヌアツ - + Wallis and Futuna ウォリス・フツナ - + Samoa サモア - + Yemen イエメン - + Mayotte マヨット - + Serbia セルビア - + South Africa 南アフリカ - + Zambia ザンビア - + Montenegro モンテネグロ - + Zimbabwe ジンバブエ - + Aland Islands オーランド諸島 - + Guernsey ガーンジー - + Isle of Man マン島 - + Jersey ジャージー - + Saint Barthelemy サン・バルテルミー島 - + + Could not uncompress GeoIP database file. + GeoIP データベースファイルを展開できませんでした。 + + + Couldn't save downloaded GeoIP database file. ダウンロードした GeoIP データベースファイルを保存できませんでした。 - + Successfully updated GeoIP database. GeoIP データベースは正常に更新されました。 - + Couldn't download GeoIP database file. Reason: %1 GeoIP データベースファイルをダウンロードできませんでした。理由: %1 @@ -4596,12 +4145,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] UPnP / NAT-PMP サポート [ON] - + UPnP / NAT-PMP support [OFF] UPnP / NAT-PMP サポート [OFF] @@ -4609,7 +4158,7 @@ Net::Smtp - + Email Notification Error: メール通知エラー: @@ -4617,1279 +4166,1077 @@ OptionsDialog - + Options オプション - + Behavior 振る舞い - + Downloads ダウンロード - + Connection 接続 - + Speed 速度 - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI Web UI - + Advanced 詳細 - + Language 言語 - + User Interface Language: ユーザーインターフェースの言語: - + (Requires restart) (再起動が必要) - + Transfer List 転送リスト - + Confirm when deleting torrents Torrent を削除するとき確認する - + Use alternating row colors In transfer list, one every two rows will have grey background. 行の背景色を交互に変える - + Hide zero and infinity values 値がゼロまたは無限の場合表示しない - + Always 常に - + Paused torrents only 停止中の Torrent のみ - + Action on double-click ダブルクリック時の動作 - + Downloading torrents: ダウンロード中の Torrent: - - + + Start / Stop Torrent Torrent の開始/停止 - - + + Open destination folder 保存先のフォルダーを開く - - + + No action なにもしない - + Completed torrents: 完了している Torrent: - + Desktop デスクトップ - + Start qBittorrent on Windows start up Windows 起動時に qBittorrent を起動する - + Show splash screen on start up 起動時にスプラッシュスクリーンを表示する - + Start qBittorrent minimized qBittorrent を最小化して起動する - + Confirmation on exit when torrents are active 終了時に Torrent が動作中だと確認する - + Confirmation on auto-exit when downloads finish ダウンロード完了時の自動終了の確認 - - KiB - KiB - - - - Email notification &upon download completion - ダウンロード完了時にメールで通知する(&U) - - - - Run e&xternal program on torrent completion - Torrent 完了時に外部プログラムを実行する(&X) - - - - IP Fi&ltering - IP フィルタリング(&L) - - - - Schedule &the use of alternative rate limits - 代替速度制限を使用するスケジュール(&T) - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">詳細情報</a>) - - - - &Torrent Queueing - Torrent キュー(&T) - - - - Seed torrents until their seeding time reaches - 指定シード時間に達するまでシードする - - - - A&utomatically add these trackers to new downloads: - 新しいダウンロードに以下のトラッカーを自動追加する(&U): - - - - RSS Reader - RSS リーダー - - - - Enable fetching RSS feeds - RSS フィードの取得を有効にする - - - - Feeds refresh interval: - フィードの更新間隔: - - - - Maximum number of articles per feed: - フィードあたりの最大記事数: - - - - - min - minutes - - - - - RSS Torrent Auto Downloader - RSS Torrent 自動ダウンローダー - - - - Enable auto downloading of RSS torrents - RSS Torrent の自動ダウンロードを有効にする - - - - Edit auto downloading rules... - 自動ダウンロードルールの編集... - - - - Web User Interface (Remote control) - ウェブユーザーインターフェース (遠隔操作) - - - - IP address: - IP アドレス: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - WebUI にバインドする IP アドレスです。 -IPv4 または IPv6 アドレスで指定してください。"0.0.0.0" で IPv4 の全アドレス、 -"::" で IPv6 の全アドレスになります。"*" で IPv4 および IPv6 の全アドレスになります。 - - - - Server domains: - サーバードメイン: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - HTTP Host ヘッダーの値でフィルターするホワイトリストです。 -DNS リバインディング攻撃から守るために、 -WebUI サーバーで使用するドメイン名を入力してください。 - -';' で分けて複数のエントリを周力できます。ワイルドカード '*' を利用できます。 - - - - &Use HTTPS instead of HTTP - HTTP でなく HTTPS を使用する(&U) - - - - Bypass authentication for clients on localhost - ローカルホストではクライアントの認証を行わない - - - - Bypass authentication for clients in whitelisted IP subnets - ホワイトリストに登録された IP サブネットのクライアントは認証を行わない - - - - IP subnet whitelist... - IP サブネットホワイトリスト... - - - - Upda&te my dynamic domain name - ダイナミックドメイン名を更新する(&T) + + Show qBittorrent in notification area + qBittorrent を通知エリアに表示する - + Minimize qBittorrent to notification area 最小化したら qBittorrent を通知エリアへ最小化する - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. 閉じたら qBittorrent を通知エリアへ最小化する - + Tray icon style: トレイアイコンのスタイル: - + Normal 通常 - + Monochrome (Dark theme) モノクローム (暗いテーマ) - + Monochrome (Light theme) モノクローム (明るいテーマ) - + File association ファイルの関連付け - + Use qBittorrent for .torrent files .torrent ファイルに qBittorrent を使用する - + Use qBittorrent for magnet links マグネットリンクに qBittorrent を使用する - + Power Management 電源管理 - + + Inhibit system sleep when torrents are active + Torrent がアクティブの時システムをスリープさせない + + + + Log file + ログファイル + + + Save path: 保存先: - + Backup the log file after: ログが次のファイルサイズになったらバックアップする: - + + MB + MB + + + Delete backup logs older than: ログのバックアップの保存期限: - + days Delete backup logs older than 10 months - + months Delete backup logs older than 10 months - + years Delete backup logs older than 10 years - + When adding a torrent Torrent の追加時 - + + Display torrent content and some options + Torrent の内容とオプションの一部を表示する + + + Bring torrent dialog to the front Torrent ダイアログを最前面に表示する - + Do not start the download automatically The torrent will be added to download list in pause state 停止状態で追加する - + Should the .torrent file be deleted after adding it 転送リストに追加後 .torrent ファイルは削除されます - + + Delete .torrent files afterwards + 追加後に .torrent ファイルを削除する + + + Also delete .torrent files whose addition was cancelled .torrent ファイルの追加をキャンセルしたときも削除されます - + Also when addition is cancelled 追加をキャンセルしたときも削除する - + Warning! Data loss possible! 注意: データを失う可能性があります! - + Saving Management 保存管理 - + Default Torrent Management Mode: デフォルトの Torrent 管理モード: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category 自動モードでは割り当てられたカテゴリによってさまざまな Torrent プロパティ (保存先など) が自動決定されます - + Manual 手動 - + Automatic 自動 - + When Torrent Category changed: Torrent のカテゴリが変更されたとき: - + Relocate torrent Torrent を移動する - + Switch torrent to Manual Mode Torrent を手動モードに切り換える - + When Default Save Path changed: デフォルトの保存先が変更されたとき: - - + + Relocate affected torrents 影響のある Torrent を移動する - - + + Switch affected torrents to Manual Mode 影響のある Torrent を手動モードに切り換える - + When Category changed: カテゴリが変更されたとき: - + Use Subcategories サブカテゴリを使用する - + Default Save Path: デフォルトの保存先: - + Keep incomplete torrents in: 未完了の Torrent の格納先: - + Copy .torrent files to: .torrent ファイルの保存先: - - Show &qBittorrent in notification area - qBittorrent を通知エリアに表示する(&Q) - - - - &Log file - ログファイル(&L) - - - - Display &torrent content and some options - Torrent の内容と一部オプションを表示する(&T) - - - - Create subfolder for torrents with multiple files - 複数ファイルからなる Torrent にはサブフォルダーを作成する - - - - De&lete .torrent files afterwards - 追加後に .torrent ファイルを削除する(&L) - - - + Copy .torrent files for finished downloads to: ダウンロードが完了した .torrent ファイルのコピー先: - + Pre-allocate disk space for all files すべてのファイルに対して事前にディスクスペースを割り当てる - - Inhibit system sleep when torrents are downloading - Torrent がダウンロード中はシステムのスリープを抑止する - - - - Inhibit system sleep when torrents are seeding - Torrent がシード中はシステムのスリープを抑止する - - - + Append .!qB extension to incomplete files 未完了のファイル名に拡張子 .!qB を付加する - - Enable recursive download dialog - 再帰ダウンロードダイアログを有効にする - - - + Automatically add torrents from: 自動的に Torrent を追加するフォルダー: - + Add entry エントリの追加 - + Remove entry エントリの削除 - + + Email notification upon download completion + ダウンロード完了時にEメールで通知する + + + + Destination email: + 送信先Eメール: + + + SMTP server: SMTP サーバー: - + This server requires a secure connection (SSL) このサーバーではセキュアな接続 (SSL) が必要 - - + + + Authentication 認証 - - - - + + + + Username: ユーザー名: - - - - + + + + Password: パスワード: - - Enabled protocol: - 有効なプロトコル: - - - - TCP and μTP - TCP および μTP + + Run external program on torrent completion + Torrent の完了時に外部プログラムを実行する - + Listening Port 待ち受けポート - + Port used for incoming connections: 着信接続で使用するポート: - + Random ランダム - + Use UPnP / NAT-PMP port forwarding from my router ルーターからのポート転送に UPnP / NAT-PMP を使用する - + Use different port on each startup 起動時に毎回異なるポートを使用する - + Connections Limits 接続制限 - + Maximum number of connections per torrent: Torrent あたりの最大接続数: - + Global maximum number of connections: 全体の最大接続数: - + Maximum number of upload slots per torrent: Torrent あたりの最大アップロードスロット数: - + Global maximum number of upload slots: 全体の最大アップロードスロット数: - + Proxy Server プロキシサーバー - + Type: 種類: - + (None) (なし) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: ホスト: - - + + Port: ポート: - + Otherwise, the proxy server is only used for tracker connections このオプションを有効にしない場合、プロキシはトラッカーとの接続のみに使用されます - + Use proxy for peer connections ピアとの接続にプロキシを使用する - + Disable connections not supported by proxies プロキシでサポートされていない接続は無効にする - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">詳細情報</a>) - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection RSS フィード、検索エンジン、ソフトウェアアップデートやその他 Torrent の転送および関連処理 (ピア交換など) に関係しない通信ではプロキシを使用しません - + Use proxy only for torrents Torrent に対してのみプロキシを利用する - - A&uthentication - 認証(&U) - - - + Info: The password is saved unencrypted 注意: パスワードは暗号化されません - + + IP Filtering + IP フィルタリング + + + Filter path (.dat, .p2p, .p2b): フィルターパス (.dat, .p2p, .p2b): - + Reload the filter フィルターの再読み込み - - Manually banned IP addresses... - 手動で BAN した IP アドレス... - - - + Apply to trackers トラッカーにも適用する - + Global Rate Limits 全体の速度制限 - - - - - - - KiB/s - KiB/s - - - - + + Upload: アップロード: - - + + + + + KiB/s + KiB/s + + + + Download: ダウンロード: - + Alternative Rate Limits 代替速度制限 - - + + Schedule the use of alternative rate limits + 代替速度制限の使用スケジュール + + + From: from (time1 to time2) 開始: - - + To: time1 to time2 終了: - + When: 曜日: - + Every day 毎日 - + Weekdays 平日 - + Weekends 週末 - + Rate Limits Settings 速度制限設定 - + Apply rate limit to peers on LAN LAN 上のピアに対しても速度制限を適用する - + Apply rate limit to transport overhead トランスポートオーバーヘッドにも制限を適用する - - + + + Enable µTP protocol + µTP プロトコルを有効にする + + + Apply rate limit to µTP protocol 速度制限を µTP プロトコルにも適用する - + Privacy プライバシー - + Enable DHT (decentralized network) to find more peers より多くのピアを見つけるため DHT (分散ネットワーク) を有効にする - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Bittorrent 互換クライアント (µTorrent, Vuze など) とピア情報を交換します - + Enable Peer Exchange (PeX) to find more peers より多くのピアを見つけるためにピア交換 (PeX) を有効にする - + Look for peers on your local network ローカルネットワーク内のピアも探します - + Enable Local Peer Discovery to find more peers より多くのピアを見つけるためにローカルピア検出 (LSD) を有効にする - + Encryption mode: 暗号化モード: - + Prefer encryption 暗号化を許可 - + Require encryption 暗号化を強制 - + Disable encryption 暗号化しない - + Enable when using a proxy or a VPN connection プロキシまたは VPN 接続を使用する場合有効にします - + Enable anonymous mode 匿名モードを有効にする - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">もっと詳しく</a>) + + + + Torrent Queueing + Torrent キュー + + + Maximum active downloads: 最大アクティブダウンロード数: - + Maximum active uploads: 最大アクティブアップロード数: - + Maximum active torrents: 最大アクティブ Torrent 数: - + Do not count slow torrents in these limits - 遅い Torrent はカウントしない - - - - Upload rate threshold: - アップロード速度しきい値: + 遅いトレントはカウントしない - - Download rate threshold: - ダウンロード速度しきい値: - - - - sec - seconds - - - - - Torrent inactivity timer: - Torrent 非活動時間: - - - + Share Ratio Limiting 共有比上限 - + Seed torrents until their ratio reaches - 指定共有比に達するまでシードする + 指定共有比に達するまでシードする ― 共有比が - + then - 達したら + に達したとき - + Pause them 停止する - + Remove them 削除する - - RSS Smart Episode Filters - RSS スマートエピソードフィルター + + Automatically add these trackers to new downloads: + 新しいダウンロードに以下のトラッカーを自動で追加する: + + + + Enable Web User Interface (Remote control) + ウェブユーザーインターフェース (リモート制御) を有効にする - + Use UPnP / NAT-PMP to forward the port from my router ルーターからのポート転送に UPnP / NAT-PMP を使用する - + + Use HTTPS instead of HTTP + HTTP ではなく HTTPS を使用する + + + Certificate: 証明書: - + Import SSL Certificate SSL 証明書をインポート - + Key: 公開鍵: - + Import SSL Key SSL 公開鍵をインポート - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>証明書について</a> - - Use alternative Web UI - 独自の Web UI を使用する - - - - Files location: - ファイルの場所: + + Bypass authentication for localhost + localhost では認証を行わない - - Enable clickjacking protection - クリックジャッキング保護を有効にする + + Update my dynamic domain name + ダイナミックドメイン名を更新する - - Enable Cross-Site Request Forgery (CSRF) protection - クロスサイトリクエストフォージェリ (CSRF) 保護を有効にする - - - + Service: サービス: - + Register 登録 - + Domain name: ドメイン名: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! これらのオプションによる .torrent ファイルの削除は <strong>後で取り消せません</strong>! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well これらのオプションを有効にすると、qBittorent は .torrent ファイルが転送リストに正常に追加されたとき (最初のオプション) あるいはそうでなかったときも (2つめのオプション) .torrent ファイルを <strong>削除します</strong>。これにはメニューから &ldquo;Torrent を追加&rdquo; したとき<strong>のみならず</strong>、<strong>ファイルの関連付けによる追加</strong>も含まれます - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog 2つめのオプション (&ldquo;追加をキャンセルしたときも削除する&rdquo;) を有効にすると、&ldquo;Torrent の追加&rdquo; ダイアログで &ldquo;<strong>キャンセル</strong>&rdquo; ボタンを押したときも .torrent ファイルを<strong>削除します</strong> - - Choose Alternative UI files location - 独自 UI ファイルの場所の選択 - - - + Supported parameters (case sensitive): サポートパラメーター (大文字小文字を区別): - + %N: Torrent name %N: Torrent 名 - + %L: Category %L: カテゴリ - - %G: Tags (seperated by comma) - %G: タグ (コンマ区切り) - - - + %F: Content path (same as root path for multifile torrent) %F: コンテンツパス (Torrent 内ファイルのルート) - + %R: Root path (first torrent subdirectory path) %R: ルートパス (最初の Torrent のパス) - + %D: Save path %D: 保存パス - + %C: Number of files %C: ファイル数 - + %Z: Torrent size (bytes) %Z: Torrent サイズ (バイト) - + %T: Current tracker %T: 現在のトラッカー - + %I: Info hash %I: 情報ハッシュ - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") ヒント: パラメーターに空白が含まれるときはダブルクオーテーションで括ってください (例: "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - Torrent のダウンロードおよびアップロード速度が "Torrent 非活動時間" (秒) の間これらの値以下であれば、遅い Torrent とみなされます - - - + Select folder to monitor 監視フォルダーの選択 - + Folder is already being monitored: フォルダーはすでに監視されています: - + Folder does not exist: フォルダーが存在しません: - + Folder is not readable: フォルダーが読み込み不可です: - + Adding entry failed エントリ追加に失敗しました - - - - + + Choose export directory エクスポートディレクトリの選択 - - - + + + + + + Choose a save directory 保存ディレクトリの選択 - + Choose an IP filter file IP フィルターファイルの選択 - + All supported filters サポートされている全フィルター - + SSL Certificate SSL 証明書 - + + SSL Key + SSL キー + + + Parsing error 解析エラー - + Failed to parse the provided IP filter 与えられた IP フィルターの解析に失敗しました - + Successfully refreshed 正常にリフレッシュされました - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number 提供された IP フィルターは正常に解析されました: %1 個のルールが適用されました。 - + Invalid key 不正な鍵 - + This is not a valid SSL key. これは正常な SSL 鍵ではありません。 - + Invalid certificate 不正な証明書 - - Preferences - 設定 - - - - Import SSL certificate - SSL 証明書のインポート - - - + This is not a valid SSL certificate. これは正常な SSL 証明書ではありません。 - - Import SSL key - SSL キーのインポート - - - - SSL key - SSL キー - - - + Time Error 時刻エラー - + The start time and the end time can't be the same. 開始時刻と終了時刻は同じにできません。 - - + + Length Error 短すぎエラー - + The Web UI username must be at least 3 characters long. Web UI のユーザー名は 3 文字以上にしてください。 - + The Web UI password must be at least 6 characters long. Web UI のパスワードは 6 文字以上にしてください。 @@ -5897,253 +5244,238 @@ PeerInfo - - Interested(local) and Choked(peer) - インタレスト (ローカル)/チョーク(ピア) + + interested(local) and choked(peer) + d = インタレスト(ローカル)/チョーク(ピア) - + interested(local) and unchoked(peer) - Dインタレスト(ローカル)/非チョーク(ピア) + D = インタレスト(ローカル)/非チョーク(ピア) - + interested(peer) and choked(local) - インタレスト(ピア)/チョーク(ローカル) + u = インタレスト(ピア)/チョーク(ローカル) - + interested(peer) and unchoked(local) - インタレスト(ピア)/非チョーク(ローカル) + U = インタレスト(ピア)/非チョーク(ローカル) - + optimistic unchoke - 楽観的非チョーク + O = 楽観的非チョーク - + peer snubbed - ピアがスナッブ状態 + S = ピアがスナッブ状態 - + incoming connection - ピアが着信接続 + I = ピアが着信接続 - + not interested(local) and unchoked(peer) - 非インタレスト(ローカル)/非チョーク(ピア) + K = 非インタレスト(ローカル)/非チョーク(ピア) - + not interested(peer) and unchoked(local) - 非インタレスト(ピア)/非チョーク(ローカル) + ? = 非インタレスト(ピア)/非チョーク(ローカル) - + peer from PEX - PEX から取得したピア + X = PEX から取得したピア - + peer from DHT - DHT から取得したピア + H = DHT から取得したピア - + encrypted traffic - 暗号化トラフィック + E = 暗号化トラフィック - + encrypted handshake - 暗号化ハンドシェイク + e = 暗号化ハンドシェイク - + peer from LSD - LSD から取得したピア + L = LSD から取得したピア PeerListWidget - + IP IP - + Port ポート - + Flags フラグ - + Connection 接続 - + Client i.e.: Client application クライアント - + Progress i.e: % downloaded 進行状況 - + Down Speed i.e: Download speed DL 速度 - + Up Speed i.e: Upload speed UP 速度 - + Downloaded i.e: total data downloaded DL 量 - + Uploaded i.e: total data uploaded UP 量 - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. 関連性 - + Files i.e. files that are being downloaded right now ファイル - + Column visibility 表示するカラム - + Add a new peer... 新しいピアの追加... - - + + Ban peer permanently ピアを永久にアクセス禁止にする - + Manually adding peer '%1'... ピア '%1' を手動で追加しています... - + The peer '%1' could not be added to this torrent. - ピア '%1'をこの Torrent に追加できませんでした。 + ピア '%1'をこの Torrent に追加できませんでした。 - + Manually banning peer '%1'... - ピア '%1' を BANしています... + ピア '%1' をアクセス禁止にしています... - - + + Peer addition ピアの追加 - + Country - + Copy IP:port IP:ポートをコピー - + Some peers could not be added. Check the Log for details. 一部のピアは追加できませんでした。詳細はログを参照してください。 - + The peers were added to this torrent. ピアをこの Torrent に追加しました。 - + Are you sure you want to ban permanently the selected peers? - 選択したピアを永久に BAN してよろしいですか? + 選択したピアを永久にアク禁にしてよろしいですか? - + &Yes はい(&Y) - + &No いいえ(&N) - PeersAdditionDialog + PeersAdditionDlg - - Add Peers - ピアの追加 + + No peer entered + ピアが入力されていません - - List of peers to add (one IP per line): - 追加するピアのリスト (1 行に 1 IP): - - - - Format: IPv4:port / [IPv6]:port - 形式: IPv4:ポート / [IPv6]:ポート - - - - No peer entered - ピアが入力されていません - - - + Please type at least one peer. 1 個以上のピアを入力してください。 - + Invalid peer 不正なピア - + The peer '%1' is invalid. ピア '%1' は正しくありません。 @@ -6151,12 +5483,12 @@ PieceAvailabilityBar - + White: Unavailable pieces 白: 利用できないピース - + Blue: Available pieces 青: 利用可能なピース @@ -6164,337 +5496,292 @@ PiecesBar - + Files in this piece: このピースに含まれるファイル: - + File in this piece このピースに含まれるファイル - + File in these pieces これらのピースに含まれるファイル - - Wait until metadata become available to see detailed information - メタデータから詳細情報を得られるまで待っています - - - + Hold Shift key for detailed information Shift キーを押すと詳細情報を表示します - PluginSelectDialog + PluginSelectDlg - + Search plugins - 検索エンジン + 検索プラグイン - + Installed search plugins: - インストールされている検索プラグイン: + インストール済みの検索プラグイン: - + Name 名前 - + Version バージョン - + Url URL - - + + Enabled 有効 - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - 警告: これら検索エンジンから Torrent をダウンロードする際は、あなたの国の法を遵守していることを必ず確認してください。 - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - 新しい検索プラグインはここから入手できます: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + 新しい検索エンジンはこちらから入手できます: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - 新しいものをインストール + 新しいプラグインをインストール - + Check for updates - 更新をチェック + 更新のチェック - + Close 閉じる - + Uninstall アンインストール - - - + + + Yes はい - - - - + + + + No いいえ - + Uninstall warning アンインストール警告 - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - 一部のプラグインは qBittorrent 自体に含まれているためアンインストールできません。アンインストールできるのはあなた自身で追加したものだけです。 -以下のプラグインが無効になりました。 + 一部のプラグインは qBittorrent に含まれているためアンインストールできません。それらは無効になります。 - + Uninstall success アンインストール成功 - + All selected plugins were uninstalled successfully - 選択された全プラグインは正常にアンインストールされました - - - - - - - Search plugin update - 検索エンジンの更新 - - - - Plugins installed or updated: %1 - プラグインはインストールまたは更新されました: %1 + 選択されたすべてのプラグインは正常にアンインストールされました - - + + New search engine plugin URL - 新規検索エンジンプラグイン URL + 新しい検索エンジンプラグインの URL - - + + URL: URL: - + Invalid link 不正なリンク - + The link doesn't seem to point to a search engine plugin. - リンクは検索エンジンプラグインを示していないようです。 + このリンクは検索エンジンプラグインのものではないようです。 - + Select search plugins - 検索プラグインの選択 + 検索エンジンの選択 - + qBittorrent search plugin qBittorrent 検索プラグイン - + + + + Search plugin update + 検索エンジンの更新 + + + All your plugins are already up to date. - 全プラグインは最新です。 + すべてのプラグインは最新です。 - + Sorry, couldn't check for plugin updates. %1 - プラグインの更新チェックができませんでした: %1 + すみません、プラグインの更新をチェックできませんでした。 %1 - + + + Search plugin install - 検索プラグインのインストール + 検索エンジンのインストール + + + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + "%1" 検索エンジンプラグインは正常にインストールされました。 - + Couldn't install "%1" search engine plugin. %2 - "%1" 検索エンジンプラグインをインストールできませんでした。%2 + "%1" 検索エンジンプラグインをインストールできませんでした。 %2 + + + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + "%1" 検索エンジンプラグインは正常にインストールされました。 - + Couldn't update "%1" search engine plugin. %2 - "%1" 検索エンジンプラグインを更新できませんでした。%2 + "%1" 検索エンジンプラグインを更新できませんでした。 %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source プラグインのソース - + Search plugin source: 検索プラグインのソース: - + Local file ローカルファイル - + Web link ウェブリンク - PowerManagement - - - qBittorrent is active - qBittorrent は動作中です - - - - PreviewSelectDialog - - - Preview - プレビュー - + PreviewSelect - + Name 名前 - + Size サイズ - + Progress - 進捗状況 + 進行状況 - - + + Preview impossible - プレビュー不可 + プレビューできません - - + + Sorry, we can't preview this file すみません、このファイルをプレビューできません - Private::FileLineEdit - - - '%1' does not exist - '%1' は存在しません - - - - '%1' does not point to a directory - '%1' はディレクトリではありません - - - - '%1' does not point to a file - '%1' はファイルではありません - - - - Does not have read permission in '%1' - '%1' の読み込み権がありません - - - - Does not have write permission in '%1' - '%1' への書き込み権がありません - - - PropListDelegate - + Not downloaded ダウンロードしない - - + + Normal Normal (priority) 通常 - - N/A - N/A - - - + Do not download Do not download (priority) - ダウンロードしない + ダウンロードしない - - + + High High (priority) 高い - + N/A + N/A + + + Mixed Mixed (priorities 混在 - - + + Maximum Maximum (priority) 最高 @@ -6503,32 +5790,32 @@ PropTabBar - + General 全般 - + Trackers トラッカー - + Peers ピア - + HTTP Sources HTTP ソース - + Content コンテンツ - + Speed 速度 @@ -6622,22 +5909,22 @@ コメント: - + Select All すべて選択 - + Select None すべて解除 - + Normal 通常 - + High 高い @@ -6697,165 +5984,165 @@ 保存パス: - + Maximum 最高 + - Do not download ダウンロードしない - + Never なし - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (保有 %3) - - + + %1 (%2 this session) %1 (%2 このセッション) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (シード時間 %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (最大 %2) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (合計 %2) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (平均 %2) - + Open 開く - + Open Containing Folder 含まれているフォルダーを開く - + Rename... 名前の変更... - + Priority 優先度 - + New Web seed 新規ウェブシード - + Remove Web seed ウェブシードの削除 - + Copy Web seed URL ウェブシード URL のコピー - + Edit Web seed URL ウェブシード URL の編集 - + + Rename the file + ファイル名の変更 + + + New name: 新しい名前: - - + + + The file could not be renamed + ファイル名は変更できませんでした + + + + This file name contains forbidden characters, please choose a different one. + ファイル名に利用できない文字が含まれています。他の文字を使用してください。 + + + + This name is already in use in this folder. Please use a different name. この名前はこのフォルダー内ですでに使われています。別の名前をつけてください。 - + The folder could not be renamed フォルダー名を変更できませんでした - + qBittorrent qBittorrent - + Filter files... ファイルをフィルター... - - Renaming - 名前の変更 - - - - - Rename error - 変名エラー - - - - The name is empty or contains forbidden characters, please choose a different one. - 名前が入力されていないか使用できない文字が含まれています。ほかの名前を入力してください。 - - - + New URL seed New HTTP source 新規 URL シード - + New URL seed: 新規 URL シード: - - + + This URL seed is already in the list. この URL シードはすでにリストにあります。 - + Web seed editing ウェブシードの編集 - + Web seed URL: ウェブシード URL: @@ -6863,585 +6150,550 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + あなたの IP アドレスはあまりに多くの回数認証に失敗したためアクセス禁止になりました。 + + + + Error: '%1' is not a valid torrent file. + + エラー: '%1' は正常な Torrent ファイルではありません。 + + + + Error: Could not add torrent to session. + エラー: Torrent をセッションに追加できませんでした。 + + + + I/O Error: Could not create temporary file. + I/O エラー: テンポラリファイルを作成できません。 + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 は未知のコマンドラインパラメーターです。 - - + + %1 must be the single command line parameter. %1 は 1 個だけ指定できるコマンドラインパラメーターです。 - + + %1 must specify the correct port (1 to 65535). + %1 は正しいポート番号でなければなりません (1 ~ 65535)。 + + + You cannot use %1: qBittorrent is already running for this user. %1 を使用できません: qBittorrent はすでに起動しています。 - + Usage: 使用法: - + Options: オプション: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - パラメータ '%1' は '%1=%2' のような構文でなければなりません + + Displays program version + バージョンを表示して終了します - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - パラメーター '%1' は '%1=%2' のような構文でなければなりません + + Displays this help message + ヘルプメッセージを表示して終了します - - Expected integer number in environment variable '%1', but got '%2' - 環境変数 '%1' は正数であることを期待していますが '%2' が得られました + + Changes the Web UI port (current: %1) + Web UI ポートの変更 (現在 %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - パラメーター '%1' は '%1=%2' のような構文でなければなりません + + Disable splash screen + スプラッシュ・スクリーンを表示しません - - Expected %1 in environment variable '%2', but got '%3' - 環境変数 '%2' は %1 であることを期待していますが '%3; が得られました + + Run in daemon-mode (background) + デーモンモード (バックグラウンド) で起動します - - port - ポート番号 + + Downloads the torrents passed by the user + 指定された Torrent をダウンロードします - - %1 must specify a valid port (1 to 65535). - %1 には正しいポート番号 (1 to 65535) を設定してください。 + + Help + ヘルプ - - Display program version and exit - プログラムのバージョンを表示して終了する + + Run application with -h option to read about command line parameters. + -h オプションを指定して起動するとコマンドラインパラメーターを表示します。 - - Display this help message and exit - このヘルプメッセージを表示して終了する + + Bad command line + 不正なコマンドライン - - Change the Web UI port - WebUI のポート番号を変更する + + Bad command line: + 不正なコマンドライン: - - Disable splash screen - スプラッシュ・スクリーンを表示しません + + Legal Notice + 法的通知 - - Run in daemon-mode (background) - デーモンモード (バックグラウンド) で起動します + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + qBittorrent はファイル共有プログラムです。あなたが Torrent を動作させるとき、そのデータはそれがアップロードされることで他人からも利用できるようになります。いかなるコンテンツでもあなたが共有することはあなた個人の責任になります。 + +これ以上の通知は行われません。 - - dir - Use appropriate short form or abbreviation of "directory" - ディレクトリ + + Press %1 key to accept and continue... + 続行するには %1 キーを押してください... - - Store configuration files in <dir> - 設定ファイルは <dir> に保存されます + + Legal notice + 法的通知 - - - name - 名前 + + Cancel + キャンセル + + + + I Agree + 同意する - - Store configuration files in directories qBittorrent_<name> - 設定ファイルはディレクトリ qBittorrent_<name> に保存されます + + Torrent name: %1 + Torrent 名: %1 - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - libtorrent の高速再開をハックしファイルをプロファイルディレクトリへの相対パスに作成する + + Torrent size: %1 + Torrent サイズ: %1 - - files or URLs - ファイルまたは URL + + Save path: %1 + 保存先: %1 - - Download the torrents passed by the user - ユーザーから渡された Torrent をダウンロード + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + この Torrent は %1 でダウンロードされました。 - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Torrent を追加するとき "Torrent の追加" ダイアログを表示するかどうか指定してください。 + + Thank you for using qBittorrent. + qBittorrent をお使いいただきありがとうございます。 - - Options when adding new torrents: - 新規 Torrent を追加したときのオプション: + + [qBittorrent] '%1' has finished downloading + [qBittorrent] '%1' のダウンロードが完了しました - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - ショートカット %1 + + The remote host name was not found (invalid hostname) + リモートホスト名が見つかりませんでした (不正なホスト名) - - path - パス + + The operation was canceled + 操作はキャンセルされました - - Torrent save path - Torrent 保存パス + + The remote server closed the connection prematurely, before the entire reply was received and processed + リモートサーバーは応答全体を受信および処理する前に接続をクローズしました - - Add torrents as started or paused - 追加時に開始するかしないか + + The connection to the remote server timed out + リモートサーバーへの接続がタイムアウトになりました - - Skip hash check - ハッシュチェックを省略する + + SSL/TLS handshake failed + SSL/TLS ハンドシェークに失敗しました - - Assign torrents to category. If the category doesn't exist, it will be created. - Torrent にカテゴリを割り当てる。カテゴリがないときは作成する。 + + The remote server refused the connection + リモートサーバーは接続を拒否しました - - Download files in sequential order - 連番に従ってダウンロード + + The connection to the proxy server was refused + プロキシサーバーへの接続が拒否されました - - Download first and last pieces first - 先頭と最後のピースを先にダウンロード + + The proxy server closed the connection prematurely + プロキシサーバーは接続を早々にクローズしました - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - オプションの値は環境変数から取られます。オプション名 'parameter-name' の値に対応する環境変数名は 'QBT_PARAMETER_NAME' (大文字、'-' は '_' に置き換え) です。フラグ値を渡す場合は、値に '1' または 'TRUE' を指定します。スプラッシュスクリーンを表示しないようにするには: + + The proxy host name was not found + プロキシホスト名が見つかりませんでした - - Command line parameters take precedence over environment variables - コマンドラインパラメーターは環境変数より優先されます + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + プロキシへの接続がタイムアウトになったかプロキシが送信要求の時間内に応答しませんでした - - Help - ヘルプ + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + プロキシがリクエストを履行するためには認証が必要ですがどの証明書も受け付けられませんでした - - Run application with -h option to read about command line parameters. - -h オプションを指定して起動するとコマンドラインパラメーターを表示します。 + + The access to the remote content was denied (401) + リモートコンテンツへのアクセスが拒否されました (401) - - Bad command line - 不正なコマンドライン + + The operation requested on the remote content is not permitted + リモートコンテンツに要求した操作は許可されていません - - Bad command line: - 不正なコマンドライン: + + The remote content was not found at the server (404) + リモートコンテンツがサーバー上に見つかりませんでした (404) - - Legal Notice - 法的通知 + + The remote server requires authentication to serve the content but the credentials provided were not accepted + リモートサーバーがコンテンツを供給するための認証を要求しましたが提示した証明書は受け付けられませんでした - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - qBittorrent はファイル共有プログラムです。あなたが Torrent を実行するとき、そのデータはアップロードによって他の誰かが入手できるようになります。コンテンツの共有は、いかなる場合もあなた個人の責任において行ってください。 + + The Network Access API cannot honor the request because the protocol is not known + プロトコルが不明なため Network Access API は要求を履行できません - - No further notices will be issued. - この通知はこれ以降は表示されません。 + + The requested operation is invalid for this protocol + 要求された操作はこのプロトコルでは無効です - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - qBittorrent はファイル共有プログラムです。あなたが Torrent を動作させるとき、そのデータはそれがアップロードされることで他人からも利用できるようになります。いかなるコンテンツでもあなたが共有することはあなた個人の責任になります。 - -これ以上の通知は行われません。 + + An unknown network-related error was detected + 未知のネットワーク関連エラーが検出されました - - Press %1 key to accept and continue... - 続行するには %1 キーを押してください... + + An unknown proxy-related error was detected + 未知のプロキシ関連エラーが検出されました - - Legal notice - 法的通知 + + An unknown error related to the remote content was detected + リモートコンテンツに関連する未知のエラーが検出されました - - Cancel - キャンセル + + A breakdown in protocol was detected + プロトコルの遮断が検出されました - - I Agree - 同意する + + Unknown error + 未知のエラー - - + + Upgrade アップグレード - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] このアップデートでは、過去のバージョンで保存された情報をこのバージョン用に移行する必要があります。変換を行うと v3.3.0 より古いバージョンで使用することはできなくなります。アップデートしますか? [y/n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. このアップデートでは、過去のバージョンで保存された情報をこのバージョン用に移行する必要があります。変換を行うと v3.3.0 より古いバージョンで使用することはできなくなります。 - + Couldn't migrate torrent with hash: %1 Torrent を移行できませんでした。ハッシュ: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 Torrent を移行できませんでした。高速再開ファイル名が正しくありません: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 - 正常な手順を踏まないプログラム終了が検出されました。フォールバックファイルを使用して設定の復元を行います: %1 + + Detected unclean program exit. Using fallback file to restore settings. + プログラムの異常終了が検出されました。設定の復元にフォールバックファイルが使用されます。 - + An access error occurred while trying to write the configuration file. 設定ファイルへの書き込み中にアクセスエラーが発生しました。 - + A format error occurred while trying to write the configuration file. 設定ファイルへの書き込み中にフォーマットエラーが発生しました。 - - - An unknown error occurred while trying to write the configuration file. - 設定ファイルの書き込み中に未知のエラーが発生しました。 - - RSS::AutoDownloader + RSS - - - Invalid data format. - 不正なデータ形式です。 + + Search + 検索 - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - %1 の RSS 自動ダウンローダーを保存できませんでした。エラー: %2 + + New subscription + 新規購読 - - Invalid data format - 不正なデータ形式 + + + + Mark items read + 既読にする - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - %1 からの RSS 自動ダウンローダールールを読み込めませんでした。エラー: %2 + + Update all + すべて更新 - - Couldn't load RSS AutoDownloader rules. Reason: %1 - RSS 自動ダウンローダールールを読み込めませんでした。理由: %1 + + RSS Downloader... + RSS ダウンローダー... - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - '%1' の RSS フィードのダウンロードに失敗しました。理由: %2 + + Settings... + 設定... - - RSS feed at '%1' updated. Added %2 new articles. - '%1' のRSS フィードが更新されました。%2 件の新着記事が追加されました。 + + Torrents: (double-click to download) + Torrent: (ダブルクリックでダウンロード) - - Failed to parse RSS feed at '%1'. Reason: %2 - '%1' のRSS フィードの解析に失敗しました。理由: %2 + + + Delete + 削除 - - Couldn't read RSS Session data from %1. Error: %2 - %1 からの RSS フィードを読み込めませんでした。エラー: %2 + + Rename... + 名前の変更... - - Couldn't parse RSS Session data. Error: %1 - RSS セッションデータを解析できませんでした。エラー: %1 + + Rename + 名前の変更 - - Couldn't load RSS Session data. Invalid data format. - RSS セッションデータの読み込みに失敗しました。不正なデータ形式です。 + + + Update + 更新 - - Couldn't load RSS article '%1#%2'. Invalid data format. - RSS 記事 '%1#%2' を読み込めませんでした。不正なデータ形式です。 + + New subscription... + 新規購読... - - - RSS::Private::Parser - - Invalid RSS feed. - 不正な RSS フィードです。 + + + Update all feeds + すべてのフィードの更新 - - %1 (line: %2, column: %3, offset: %4). - %1 (行: %2, カラム: %3, オフセット: %4). - - - - RSS::Session - - - RSS feed with given URL already exists: %1. - 指定された URL の RSS フィードはすでに存在します: %1。 - - - - Cannot move root folder. - ルートフォルダーは移動できません。 - - - - - Item doesn't exist: %1. - アイテムが存在しません: %1. - - - - Cannot delete root folder. - ルートフォルダーは削除できません。 - - - - Incorrect RSS Item path: %1. - 不正な RSS アイテムパス: %1. - - - - RSS item with given path already exists: %1. - 指定されたパスの RSS アイテムはすでに存在します: %1. - - - - Parent folder doesn't exist: %1. - 親フォルダーが存在しません: %1. - - - - RSSWidget - - - Search - 検索 + + Download torrent + Torrent のダウンロード - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - RSS フィードの取得は現在無効になっています。設定から有効にできます。 + + Open news URL + ニュースの URL を開く - - New subscription - 新規購読 + + Copy feed URL + フィード URL を開く - - - - Mark items read - 既読にする + + New folder... + 新規フォルダー... - + Refresh RSS streams RSS ストリームの更新 + + + RSSImp - - Update all - すべて更新 - - - - RSS Downloader... - RSS ダウンローダー... - - - - Torrents: (double-click to download) - Torrent: (ダブルクリックでダウンロード) - - - - - Delete - 削除 - - - - Rename... - 名前の変更... - - - - Rename - 名前の変更 - - - - - Update - 更新 - - - - New subscription... - 新規購読... - - - - - Update all feeds - すべてのフィードの更新 - - - - Download torrent - Torrent のダウンロード - - - - Open news URL - ニュースの URL を開く + + Stream URL: + ストリームの URL: - - Copy feed URL - フィード URL を開く + + Please type a RSS stream URL + RSS ストリームの URL を入力してください - - New folder... - 新規フォルダー... + + This RSS feed is already in the list. + この RSS フィードはすでにリストにあります。 - + Please choose a folder name フォルダー名を選択してください - + Folder name: フォルダー名: - + New folder 新しいフォルダー - - Please type a RSS feed URL - RSS フィードの URL を入力してください - - - - Feed URL: - フィード URL: - - - + Deletion confirmation 削除の確認 - + Are you sure you want to delete the selected RSS feeds? 選択した RSS フィードを削除しますか? - + Please choose a new name for this RSS feed この RSS フィードの新しい名前を選択してください - + New feed name: 新しいフィード名: - - Rename failed - 名前の変更に失敗 + + Name already in use + 名前はすでに使用されています + + + + This name is already used by another item, please choose another one. + この名前はすでに別のアイテムで使用されています。他の名前を選んでください。 - + Date: 日付: - + Author: 作者: + + + Unread + 未読 + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + '%2' RSS フィードからの '%1' の自動ダウンロードに失敗しました。Torrent またはマグネットリンクが含まれていません... + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + '%2' RSS フィードからの '%1' Torrent を自動ダウンロードしています... + + + + Rss::Private::Parser + + + Invalid RSS feed. + 不正な RSS フィードです。 + + + + RssSettingsDlg + + + RSS Reader Settings + RSS リーダー設定 + + + + RSS feeds refresh interval: + RSS フィードの更新の間隔: + + + + min + + + + + Maximum number of articles per feed: + フィードあたりの最大記事数: + ScanFoldersDelegate - + Select save location 保存場所の選択 @@ -7449,274 +6701,268 @@ ScanFoldersModel - + Monitored Folder 監視フォルダー - + Override Save Location 保存先 - + Monitored folder 監視フォルダー - + Default save location デフォルトの保存先 - + Browse... 参照... - SearchJobWidget + SearchEngine - - Form - + + Unknown search engine plugin file format. + 未知の検索エンジンプラグインファイル形式です。 - - Results(xxx) - 検索結果(xxx) + + A more recent version of this plugin is already installed. + より新しいバージョンのプラグインがすでにインストールされています。 - - Search in: - 検索対象: + + + Plugin is not supported. + プラグインはサポートされていません。 - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - <html><head/><body><p>一部の検索エンジンは Torrent ファイル名のほか Torrent の説明からも検索します。いずれにしろ、以下のリストに表示される結果はこのモードで制御されます。</p><p><span style=" font-weight:600;">すべて </span>検索エンジンか返したすべての結果を表示します。</p><p><span style=" font-weight:600;">Torrent 名のみ</span>検索クエリと名前が一致した Torrent のみ表示します。</p></body></html> + + Update server is temporarily unavailable. %1 + 更新サーバーが一時的に利用できません。%1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - <html><head/><body><p>最小および最大シード数で絞り込みます</p></body></html> + + + Failed to download the plugin file. %1 + プラグインファイルのダウンロードに失敗しました。%1 - - Seeds: - シード数: + + An incorrect update info received. + 誤った更新情報を受信しました。 - - <html><head/><body><p>Minimal number of seeds</p></body></html> - <html><head/><body><p>最小シード数</p></body></html> + + All categories + すべてのカテゴリ - - - to - から + + Movies + 映画 - - <html><head/><body><p>Maximal number of seeds</p></body></html> - <html><head/><body><p>最大シード数</p></body></html> + + TV shows + TV 番組 - - - - + + Music + 音楽 - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - <html><head/><body><p>最小および最大 Torrent サイズで絞り込みます</p></body></html> + + Games + ゲーム - - Size: - サイズ: + + Anime + アニメ - - <html><head/><body><p>Minimal torrent size</p></body></html> - <html><head/><body><p>最小 Torrent サイズ</p></body></html> + + Software + ソフトウェア - - <html><head/><body><p>Maximal torrent size</p></body></html> - <html><head/><body><p>最大 Torrent サイズ</p></body></html> + + Pictures + 画像 + + + + Books + 書籍 + + + SearchListDelegate + + + + Unknown + 不明 + + + + SearchTab - + Name i.e: file name 名前 - + Size i.e: file size サイズ - + Seeders i.e: Number of full sources シーダー - + Leechers i.e: Number of partial sources リーチャー - + Search engine 検索エンジン - - Filter search results... - 検索結果をフィルター... - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - 検索結果 ( <i>%2</i> 件中 <i>%1</i> 件を表示): + 検索結果 (<i>%2</i> 件中 <i>%1</i> 件を表示): - + Torrent names only Torrent 名のみ - + Everywhere すべて - - Use regular expressions - 正規表現を使用 - - - + Searching... - 検索中... + 検索しています... - + Search has finished - 検索完了 + 検索が完了しました - + Search aborted - 検索中止 + 検索を中止しました - + An error occurred during search... - 検索中にエラーが発生... + 検索中にエラーが発生しました... - + Search returned no results 検索結果は 0 件でした - + Column visibility - 表示カラム - - - - SearchPluginManager - - - Unknown search engine plugin file format. - 未知の検索エンジンプラグインフォーマットです。 - - - - A more recent version of this plugin is already installed. - もっと新しいバージョンのこのプラグインがすでにインストールされています。 + - - - Plugin is not supported. - プラグインはサポートされていません。 + + Form + フォーム - - All categories - 全カテゴリ + + Results(xxx) + 結果(xxx) - - Movies - 映画 + + Search in: + 検索対象: - - TV shows - TV ショー + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>一部の検索エンジンは Torrent の名前とともにその説明からも検索します。このモードでどこまでの検索結果を表示するかを指定できます。</p><p><span style=" font-weight:600;">「すべて」</span> 検索エンジンが返した結果をすべて表示します。</p><p><span style=" font-weight:600;">「Torrent 名のみ」</span> 検索文字列が Torrent の名前と一致したもののみ表示します。</p></body></html> - - Music - 音楽 + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>最小および最大シード数で絞り込みます</p></body></html> - - Games - ゲーム + + Seeds: + シード数: - - Anime - アニメ + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>最小シード数</p></body></html> - - Software - ソフトウェア + + + to + から - - Pictures - 画像 + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>最大シード数</p></body></html> - - - Books - 書籍 + + + + + - - Update server is temporarily unavailable. %1 - アップデートサーバーは一時的に利用できません。%1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>最小および最大 Torrent サイズで絞り込みます</p></body></html> - - - Failed to download the plugin file. %1 - プラグインファイルのダウンロードに失敗しました。%1 + + Size: + サイズ: - - An incorrect update info received. - 誤ったアップデート情報を受信しました。 + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>最小 Torrent サイズ</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - 検索プラグイン '%1' には不正なバージョン文字列が含まれています。('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>最大 Torrent サイズ</p></body></html> @@ -7724,198 +6970,185 @@ - - - - + + + Search 検索 - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - 検索プラグインがインストールされていません。 -ウィンドウ右下の "検索プラグイン..." ボタンをクリックして何かインストールしてください。 - - - + Download ダウンロード - + Go to description page 説明ページヘ移動 - + Copy description page URL 説明ページの URL をコピー - + Search plugins... 検索プラグイン... - + A phrase to search for. 検索文字列を入力してください。 - + Spaces in a search term may be protected by double quotes. 空白を含む文字列を検索したい場合はダブルクォーテーションで括ってください。 - + Example: Search phrase example 例: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>: 文字列「<b>foo</b>」と「<b>bar</b>」を検索します - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: 文字列「<b>foo bar</b>」を検索します - + All plugins すべてのプラグイン - + Only enabled 有効なもののみ - + Select... 選択... - - - + + + Search Engine 検索エンジン - + Please install Python to use the Search Engine. 検索エンジンを使用するには Python をインストールしてください。 - + Empty search pattern 空の検索パターン - + Please type a search pattern first まず検索パターンを入力してください - + Stop 停止 - + Search has finished 検索完了 - + Search has failed 検索に失敗しました - ShutdownConfirmDialog - - - Don't show again - 次回から表示しない - + ShutdownConfirmDlg - + qBittorrent will now exit. qBittorrent を終了します。 - + E&xit Now - いま終了(&X) + いますぐ終了(&X) - + Exit confirmation 終了の確認 - + The computer is going to shutdown. - コンピューターはシャットダウンしようとしています。 + コンピューターをシャットダウンします。 - + &Shutdown Now - いまシャットダウン(&S) - - - - Shutdown confirmation - シャットダウンの確認 + いますぐシャットダウン(&S) - + The computer is going to enter suspend mode. - コンピューターはサスペンドモードに入ろうとしています。 + コンピューターをサスペンドモードにします。 - + &Suspend Now - いまサスペンド(&S) + いますぐサスペンド(&S) - + Suspend confirmation サスペンドの確認 - + The computer is going to enter hibernation mode. - コンピューターはハイバーネートモードに入ろうとしています。 + コンピューターをハイバネートモードにします。 - + &Hibernate Now - いまハイバーネート(&H) + いますぐハイバネート(&H) - + Hibernate confirmation - ハイバーネートの確認 + ハイバネートの確認 - + You can cancel the action within %1 seconds. - あと %1 秒以内ならキャンセルできます。 + キャンセルできるのはあと %1 秒までです。 + + + + Shutdown confirmation + シャットダウンの確認 SpeedLimitDialog - + KiB/s KiB/s @@ -7923,52 +7156,52 @@ SpeedPlotView - + Total Upload 総アップロード - + Total Download 総ダウンロード - + Payload Upload アップロードのペイロード - + Payload Download ダウンロードのペイロード - + Overhead Upload アップロードのオーバーヘッド - + Overhead Download ダウンロードのオーバーヘッド - + DHT Upload DHT でのアップロード - + DHT Download DHT でのダウンロード - + Tracker Upload トラッカーのアップロード - + Tracker Download トラッカーのダウンロード @@ -7976,95 +7209,87 @@ SpeedWidget - + Period: 期間: - + 1 Minute 1 分 - + 5 Minutes 5 分 - + 30 Minutes 30 分 - + 6 Hours 6 時間 - + Select Graphs グラフの選択 - + Total Upload 総アップロード - + Total Download 総ダウンロード - + Payload Upload アップロードのペイロード - + Payload Download ダウンロードのペイロード - + Overhead Upload アップロードのオーバーヘッド - + Overhead Download ダウンロードのオーバーヘッド - + DHT Upload DHT でのアップロード - + DHT Download DHT でのダウンロード - + Tracker Upload トラッカーのアップロード - + Tracker Download トラッカーのダウンロード - StacktraceDialog - - - Crash info - クラッシュ情報 - - - StatsDialog @@ -8077,49 +7302,49 @@ 利用者統計 - - Cache statistics - キャッシュ統計 + + Total peer connections: + 全接続ピア数: - - Read cache hits: - 読み込みキャッシュヒット: + + Global ratio: + 全体の共有比: - - Average time in queue: - 平均キュー待ち時間: + + Alltime download: + 総ダウンロード量: - - Connected peers: - 接続ピア数: + + Alltime upload: + 総アップロード量: - - All-time share ratio: - 総合共有比: + + Total waste (this session): + 全破棄 (このセッション): - - All-time download: - 総合ダウンロード量: + + Cache statistics + キャッシュ統計 - - Session waste: - セッション破棄: + + Read cache hits: + 読み込みキャッシュヒット: - - All-time upload: - 総合アップロード量: + + Average time in queue: + 平均キュー待ち時間: - Total buffer size: - 全バッファサイズ: + Total buffers size: + 総バッファーサイズ: @@ -8129,7 +7354,7 @@ Queued I/O jobs: - 待ち I/O ジョブ数: + 待ち I/O ジョブ数: @@ -8147,7 +7372,12 @@ 総キューサイズ: - + + OK + OK + + + %1 ms 18 milliseconds %1 ms @@ -8156,27 +7386,32 @@ StatusBar - + Connection status: 接続状態: - + No direct connections. This may indicate network configuration problems. 直接接続はありません。これはネットワーク構成に問題があることを示しているのかもしれません。 - + DHT: %1 nodes DHT: %1 ノード - - qBittorrent needs to be restarted! - qBittorrent の再起動が必要です! + + qBittorrent needs to be restarted + qBittorrent の再起動が必要です + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent はアップデートされ、それを反映するために再起動が必要です。 @@ -8195,883 +7430,616 @@ オンライン - + Click to switch to alternative speed limits クリックすると代替速度制限に切り換えます - + Click to switch to regular speed limits クリックすると通常の速度制限に切り換えます - + + Manual change of rate limits mode. The scheduler is disabled. + 手動で代替速度モードへ切り換えられました。スケジュールは無効になります。 + + + Global Download Speed Limit 全体のダウンロード速度制限 - + Global Upload Speed Limit 全体のアップロード速度制限 - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter すべて (0) - + Downloading (0) ダウンロード中 (0) - + Seeding (0) シード中 (0) - + Completed (0) 完了 (0) - + Resumed (0) 再開 (0) - + Paused (0) 停止中 (0) - + Active (0) 動作中 (0) - + Inactive (0) 非動作中 (0) - + Errored (0) エラー (0) - + All (%1) すべて (%1) - + Downloading (%1) ダウンロード中 (%1) - + Seeding (%1) シード中 (%1) - + Completed (%1) 完了 (%1) - + Paused (%1) 停止中 (%1) - + Resumed (%1) 再開 (%1) - + Active (%1) 動作中 (%1) - + Inactive (%1) 非動作中 (%1) - + Errored (%1) エラー (%1) - TagFilterModel + TorrentContentModel - - Tags - タグ + + Name + 名前 - - All - すべて + + Size + サイズ - - Untagged - タグなし + + Progress + 進行状況 - - - TagFilterWidget - - Add tag... - タグの追加... + + Download Priority + ダウンロード優先度 - - Remove tag - タグの削除 + + Remaining + 残り + + + TorrentCreatorDlg - - Remove unused tags - 未使用のタグの削除 + + Select a folder to add to the torrent + Torrent に追加するフォルダーを選択してください - - Resume torrents - Torrent の再開 + + Select a file to add to the torrent + Torrent に追加するファイルを選択してください - - Pause torrents - Torrent の停止 + + No input path set + 入力パスが設定されていません - - Delete torrents - Torrent の削除 + + Please type an input path first + まず入力パスを入力してください - - New Tag - 新規タグ + + Select destination torrent file + 作成先の Torrent ファイルを選択してください - - Tag: - タグ: + + Torrent Files (*.torrent) + Torrent ファイル (*.torrent) - - Invalid tag name - 不正なタグ名 + + Torrent was created successfully: %1 + %1 is the path of the torrent + Torrent は正常に作成されました: %1 - - Tag name '%1' is invalid - タグ名 '%1' は正しくありません + + + + Torrent creation + Torrent の作成 - - Tag exists - 既存のタグ + + Torrent creation was unsuccessful, reason: %1 + Torrent の作成に失敗しました、理由: %1 - - Tag name already exists. - タグ名はすでに存在します。 + + Created torrent file is invalid. It won't be added to download list. + 作成された Torrent ファイルは正常ではありません。これはダウンロードリストに追加されません。 - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Torrent カテゴリプロパティ + + Name + i.e: torrent name + 名前 - - Name: - 名前: + + Size + i.e: torrent size + サイズ - - Save path: - 保存パス: + + Done + % Done + 進行状況 - - Choose save path - 保存先の選択 + + Status + Torrent status (e.g. downloading, seeding, paused) + 状態 - - New Category - 新規カテゴリ + + Seeds + i.e. full sources (often untranslated) + シード - - Invalid category name - 不正なカテゴリ名 + + Peers + i.e. partial sources (often untranslated) + ピア - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - カテゴリ名に '\' を含めることはできません。 -カテゴリ名は '/' で開始または終了することはできません。 -カテゴリ名に '//' の並びを含めることはできません。 - - - - Category creation error - カテゴリ作成エラー - - - - Category with the given name already exists. -Please choose a different name and try again. - このカテゴリ名はすでに存在します。 -別の名前を指定してください。 + + Down Speed + i.e: Download speed + DL 速度 - - - TorrentContentModel - - Name - 名前 + + Up Speed + i.e: Upload speed + UP 速度 - - Size - サイズ + + Ratio + Share ratio + 共有比 - - Progress - 進行状況 + + ETA + i.e: Estimated Time of Arrival / Time left + 予想残り時間 - - Download Priority - ダウンロード優先度 + + Category + カテゴリ - - Remaining - 残り + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + 追加日時 - - Availability - 可用性 + + Completed On + Torrent was completed on 01/01/2010 08:00 + 完了日時 - - - TorrentCreatorDialog - - Torrent Creator - Torrent クリエーター + + Tracker + トラッカー - - Select file/folder to share - 共有するファイル/フォルダーを選択してください + + Down Limit + i.e: Download limit + DL 速度上限 - - Path: - パス: + + Up Limit + i.e: Upload limit + UP 速度上限 - - [Drag and drop area] - [ここにドラッグアンドドロップしてください] + + Downloaded + Amount of data downloaded (e.g. in MB) + ダウンロード量 - - - Select file - ファイルの選択 + + Uploaded + Amount of data uploaded (e.g. in MB) + アップロード 量 - - - Select folder - フォルダーの選択 + + Session Download + Amount of data downloaded since program open (e.g. in MB) + セッション内ダウンロード量 - - Settings - 設定 + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + セッション内アップロード量 - - Piece size: - ピースサイズ: + + Remaining + Amount of data left to download (e.g. in MB) + 残りダウンロード量 - - Auto - 自動 + + Time Active + Time (duration) the torrent is active (not paused) + 動作時間 - - 16 KiB - 16 KiB + + Save path + Torrent save path + 保存先 - - 32 KiB - 32 KiB + + Completed + Amount of data completed (e.g. in MB) + 完了 - - 64 KiB - 64 KiB + + Ratio Limit + Upload share ratio limit + 共有比上限 - - 128 KiB - 128 KiB + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + 最後に完了ファイルを確認した日時 - - 256 KiB - 256 KiB + + Last Activity + Time passed since a chunk was downloaded/uploaded + 最終動作 - - 512 KiB - 512 KiB + + Total Size + i.e. Size including unwanted data + 合計サイズ + + + TrackerFiltersList - - 1 MiB - 1 MiB + + All (0) + this is for the tracker filter + すべて (0) - - 2 MiB - 2 MiB + + Trackerless (0) + トラッカーなし (0) - - 4 MiB - 4 MiB + + Error (0) + エラー (0) - - 8 MiB - 8 MiB + + Warning (0) + 警告 (0) - - 16 MiB - 16 MiB + + + Trackerless (%1) + トラッカーなし (%1) - - 32 MiB - 32 MiB + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - Calculate number of pieces: - ピース数を計算: + + + Error (%1) + エラー (%1) - - Private torrent (Won't distribute on DHT network) - プライベート Torrent (DHT ネットワークには配信されません) + + + Warning (%1) + 警告 (%1) - - Start seeding immediately - すぐにシードを開始する + + Resume torrents + Torrent の再開 - - Ignore share ratio limits for this torrent - この Torrent では共有費を無視する + + Pause torrents + Torrent の停止 - - Optimize alignment - アラインメントを最適化 + + Delete torrents + Torrent の削除 - - Fields - フィールド + + + All (%1) + this is for the tracker filter + すべて (%1) + + + TrackerList - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - 空行を入れることでトラッカーをティア/グループに分けることができます。 + + URL + URL - - Web seed URLs: - ウェブシード URL: + + Status + 状態 - - Tracker URLs: - トラッカー URL: + + Received + - - Comments: - コメント: + + Seeds + シード - - Source: - ソース: - - - - Progress: - 進行状況: - - - - Create Torrent - Torrent を作成 - - - - - - Torrent creation failed - Torrent 作成失敗 - - - - Reason: Path to file/folder is not readable. - 理由: ファイル/フォルダーへのパスが読み込み不可です。 - - - - Select where to save the new torrent - 新規 Torrent の保存先を選択してください - - - - Torrent Files (*.torrent) - Torrent ファイル (*.torrent) - - - - Reason: %1 - 理由: %1 - - - - Reason: Created torrent is invalid. It won't be added to download list. - 理由: Torrent の作成に失敗しました。これはダウンロードリストには追加されません。 - - - - Torrent creator - Torrent クリエーター - - - - Torrent created: - Torrent を作成しました: - - - - TorrentInfo - - - File size exceeds max limit %1 - ファイルサイズが上限の %1 に達しました - - - - Torrent file read error: %1 - Torrent ファイル読み込みエラー: %1 - - - - Torrent file read error: size mismatch - Torrent ファイル読み込みエラー: サイズの不一致 - - - - TorrentsController - - - Not contacted yet - まだ接触していません - - - - Updating... - 更新中... - - - - Working - 動作中 - - - - Not working - 停止中 - - - - Error: '%1' is not a valid torrent file. - エラー: '%1' は正常な Torrent ファイルではありません。 - - - - - - - Torrent queueing must be enabled - Torrent キューイングを有効にしなければなりません - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - + + Peers + ピア - - Unable to edit category + + Downloaded - Save path is empty - 保存先パスが空です - - - - Cannot make save path - 保存先パスを作成できません - - - - Cannot write to directory - ディレクトリに書き込めません - - - - WebUI Set location: moving "%1", from "%2" to "%3" - WebUI の場所の設定: "%1" を "%2" からto "%3" へ移動 - - - - Incorrect torrent name - 不正な Torrent 名 - - - - - Incorrect category name - 不正なカテゴリ名 - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - すべて (0) - - - - Trackerless (0) - トラッカーなし (0) - - - - Error (0) - エラー (0) - - - - Warning (0) - 警告 (0) - - - - - Trackerless (%1) - トラッカーなし (%1) - - - - - Error (%1) - エラー (%1) - - - - - Warning (%1) - 警告 (%1) - - - - Resume torrents - Torrent の再開 - - - - Pause torrents - Torrent の停止 - - - - Delete torrents - Torrent の削除 - - - - - All (%1) - this is for the tracker filter - すべて (%1) + + Message + メッセージ - - - TrackerListWidget - - + + Working - 稼働中 + 動作中 - + Disabled 無効 - + This torrent is private この Torrent はプライベートです - + Updating... - 更新中... + 更新しています... - + Not working - 稼働していません + 非動作中 - + Not contacted yet - まだ接触していません + 未接触 - - - - - - - N/A - N/A + + Tracker URL: + トラッカー URL: - + Tracker editing - トラッカー編集中 - - - - Tracker URL: - トラッカー URL: + トラッカーの編集 - - + + Tracker editing failed - トラッカー編集失敗 + トラッカーの編集に失敗しました - + The tracker URL entered is invalid. 入力されたトラッカー URL が正しくありません。 - + The tracker URL already exists. トラッカー URL はすでに存在します。 - + Add a new tracker... - 新規トラッカーを追加... + 新しいトラッカーの追加... - - Remove tracker - トラッカーを削除 - - - + Copy tracker URL - トラッカー URL をコピー + トラッカー URL のコピー - + Edit selected tracker URL - 選択したトラッカー URL を編集 + 選択したトラッカー URL の編集 - + Force reannounce to selected trackers 選択したトラッカーに強制再アナウンス - + Force reannounce to all trackers - 全トラッカーに強制再アナウンス - - - - URL - URL - - - - Status - 状態 - - - - Received - 受信 - - - - Seeds - シード - - - - Peers - ピア - - - - Downloaded - ダウンロード - - - - Message - メッセージ - - - - Column visibility - 表示カラム - - - - TrackerLoginDialog - - - - Tracker authentication - トラッカー認証 - - - - Tracker: - トラッカー: - - - - Login - ログイン + 全トラッカーへ強制再アナウンス - - Username: - ユーザー名: - - - - Password: - パスワード: - - - - Log in - ログイン + + Remove tracker + トラッカーの削除 - TrackersAdditionDialog + TrackersAdditionDlg - + Trackers addition dialog トラッカーの追加ダイアログ - + List of trackers to add (one per line): - トラッカーのリスト (1 行に 1 トラッカー): + 追加するトラッカーを入力してください (1行に1トラッカー): - - + + µTorrent compatible list URL: µTorrent 互換リスト URL: - + + I/O Error + I/O エラー + + + + Error while trying to open the downloaded file. + ダウンロードしたファイルを開くときにエラーが発生しました。 + + + No change 変更なし - + No additional trackers were found. - 追加するトラッカーが見つかりませんでした。 + 追加されたトラッカーはありません。 - + Download error ダウンロードエラー - + The trackers list could not be downloaded, reason: %1 トラッカーリストをダウンロードできませんでした。理由: %1 @@ -9079,686 +8047,694 @@ TransferListDelegate - + Downloading ダウンロード中 - + Downloading metadata used when loading a magnet link メタデータダウンロード中 - + Allocating qBittorrent is allocating the files on disk 割り当て中 - + Paused 停止 - + Queued i.e. torrent is queued 待機中 - + Seeding Torrent is complete and in upload-only mode シード中 - + Stalled Torrent is waiting for download to begin ダウンロード待ち - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] ダウンロード中 - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] シード中 - + Checking Torrent local data is being checked チェック中 - + Queued for checking i.e. torrent is queued for hash checking チェック待ち - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. 再開データのチェック中 - + Completed 完了 - - Moving - Torrent local data are being moved/relocated - 移動中 - - - + Missing Files ファイルがありません - + Errored torrent status, the torrent has an error エラー - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - %1 (シード時間 %2) - - - - %1 ago - e.g.: 1h 20m ago - %1 前 - - - - TransferListFiltersWidget - - - Status - 状態 - - - - Categories - カテゴリ - - - - Tags - タグ - - - - Trackers - トラッカー - - - - TransferListModel - - - Name - i.e: torrent name - 名前 - - - - Size - i.e: torrent size - サイズ - - - - Done - % Done - 完了 - - - - Status - Torrent status (e.g. downloading, seeding, paused) - 状態 - - - - Seeds - i.e. full sources (often untranslated) - シード - - - - Peers - i.e. partial sources (often untranslated) - ピア - - - - Down Speed - i.e: Download speed - DL 速度 - - - - Up Speed - i.e: Upload speed - UP 速度 - - - - Ratio - Share ratio - 共有比 - - - - ETA - i.e: Estimated Time of Arrival / Time left - 予想残り時間 - - - - Category - カテゴリ - - - - Tags - タグ - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - 追加日時 - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - 完了日時 - - - - Tracker - トラッカー - - - - Down Limit - i.e: Download limit - DL 制限 - - - - Up Limit - i.e: Upload limit - UP 制限 - - - - Downloaded - Amount of data downloaded (e.g. in MB) - ダウンロード済み - - - - Uploaded - Amount of data uploaded (e.g. in MB) - アップロード済み - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - セッション内 DL 量 - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - セッション内 UP 量 - - - - Remaining - Amount of data left to download (e.g. in MB) - 残り - - - - Time Active - Time (duration) the torrent is active (not paused) - 動作時間 - - - - Save path - Torrent save path - 保存先 - - - - Completed - Amount of data completed (e.g. in MB) - 完了 + %1 (シード時間 %2) - - Ratio Limit - Upload share ratio limit - 共有比制限 + + %1 ago + e.g.: 1h 20m ago + %1 前 + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - 完了ファイルの最終確認日時 + + Status + 状態 - - Last Activity - Time passed since a chunk was downloaded/uploaded - 最終動作 + + Categories + カテゴリ - - Total Size - i.e. Size including unwanted data - 合計サイズ + + Trackers + トラッカー TransferListWidget - + Column visibility 表示カラム - + Choose save path 保存先パスの選択 - + Torrent Download Speed Limiting Torrent ダウンロード速度制限 - + Torrent Upload Speed Limiting Torrent アップロード速度制限 - + Recheck confirmation 再チェックの確認 - + Are you sure you want to recheck the selected torrent(s)? 選択した Torrent を再チェックしますか? - + Rename 名前の変更 - + New name: 新しい名前: - + Resume Resume/start the torrent 再開 - + Force Resume Force Resume/start the torrent 強制再開 - + Pause Pause the torrent 停止 - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - 保存先の設定: '%1' を '%2' から '%3' へ - - - - Add Tags - タグの追加 - - - - Remove All Tags - 全タグの削除 - - - - Remove all tags from selected torrents? - 選択した Torrent から全タグを削除しますか? + + New Category + 新規カテゴリ - - Comma-separated tags: - カンマ区切りのタグ: + + Category: + カテゴリ: - - Invalid tag - 不正なタグ + + Invalid category name + 不正なカテゴリ名 - - Tag name: '%1' is invalid - タグ名: '%1' は正しくありません + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + カテゴリ名に '\' は使用できません。 +カテゴリ名の先頭と末尾に '/' は使用できません。 +カテゴリ名に連続した '//' は使用できません。 - + Delete Delete the torrent 削除 - + Preview file... ファイルのプレビュー... - + Limit share ratio... 共有比上限... - + Limit upload rate... アップロード速度制限... - + Limit download rate... ダウンロード速度制限... - + Open destination folder 作成先のフォルダーを開く - + Move up i.e. move up in the queue 上げる - + Move down i.e. Move down in the queue 下げる - + Move to top i.e. Move to top of the queue 先頭へ - + Move to bottom i.e. Move to bottom of the queue 最後へ - + Set location... 場所の移動... - - Force reannounce - 強制再アナウンス - - - + Copy name 名前をコピー - - Copy hash - ハッシュをコピー - - - + Download first and last pieces first 先頭と最後のピースを先にダウンロード - + Automatic Torrent Management 自動 Torrent 管理 - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category 自動モードでは Torrent の様々なプロパティ (保存先など) が割り当てられたカテゴリから自動決定されます - + Category カテゴリ - + New... New category... 新規... - + Reset Reset category リセット - - Tags - タグ - - - - Add... - Add / assign multiple tags... - 追加... - - - - Remove All - Remove all tags - すべて削除 - - - + Priority 優先度 - + Force recheck 強制再チェック - + Copy magnet link マグネットリンクをコピー - + Super seeding mode スーパーシードモード - + Rename... 名前の変更... - + Download in sequential order シーケンシャルにダウンロード - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - Torrent アップロード/ダウンロード速度制限 + Torrent: アップロード量/ダウンロード量 比率制限 - - Use global share limit - 全体の共有比上限を使用 + + Use global ratio limit + 全体の共有比上限を使う - - - + + + buttonGroup - + ボタングループ - - Set no share limit - 共有比上限なし + + Set no ratio limit + 制限しない - - Set share limit to - 共有比上限を指定 + + Set ratio limit to + 共有比上限を設定する + + + WebApplication - - ratio - 共有比 + + Incorrect category name + 不正なカテゴリ名 + + + + WebUI + + + The Web UI is listening on port %1 + Web UI の待ち受けポート %1 + + + + Web UI Error - Unable to bind Web UI to port %1 + Web UI エラー - Web UI をポート %1 にバインドできません + + + + about + + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Qt ツールキットと libtorrent-rasterbar を使用し C++ で書かれた高度な BitTorrent クライアントです。 + + + + Copyright %1 2006-2016 The qBittorrent project + Copyright %1 2006-2016 The qBittorrent project - - minutes - + + Home Page: + ホームページ: - - No share limit method selected - 共有比上限の指定方法が選択されていません + + Forum: + フォーラム: - - Please select a limit method first - 共有比上限の指定方法を選択してください + + Bug Tracker: + バグトラッカー: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - Python を検出しました。バージョン: %1 + + Add Peers + ピアの追加 - - Python not detected - Python が見つかりませんでした + + List of peers to add (one per line): + 追加ピアのリスト (1行に1ピア): + + + + Format: IPv4:port / [IPv6]:port + フォーマット: IPv4:ポート / [IPv6]:ポート - WebApplication + authentication + + + + Tracker authentication + トラッカー認証 + + + + Tracker: + トラッカー: + + + + Login + ログイン + + + + Username: + ユーザー名: + - - Unacceptable file type, only regular file is allowed. - 許されないファイルタイプです。通常ファイルのみ使用できます。 + + Password: + パスワード: - - Symlinks inside alternative UI folder are forbidden. - 独自 UI フォルダー内にシンボリックリンクは使用できません。 + + Log in + ログ イン - - Exceeded the maximum allowed file size (%1)! - 利用できる最大のファイルサイズ (%1) に達しました! + + Cancel + キャンセル + + + confirmDeletionDlg - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - WebUI: オリジンヘッダーとターゲットオリジンが一致しません! ソース IP: '%1'. オリジンヘッダー: '%2'. ターゲットオリジン: '%3' + + Deletion confirmation - qBittorrent + 削除の確認 - qBittorrent - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - WebUI: リファラーヘッダーとターゲットオリジンが一致しません! ソース IP: '%1'. リファラーヘッダー: '%2'. ターゲットオリジン: '%3' + + Remember choice + 選択を記憶する - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - WebUI: 不正なホストヘッダー、ポートの不一致です。リクエストソース IP: '%1'. サーバーポート番号: '%2'. 受信ホストヘッダー: '%3' + + Also delete the files on the hard disk + ハードディスク上のファイルも削除する + + + confirmShutdownDlg - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - WebUI: 不正なホストヘッダーです。リクエストソース IP: '%1'. 受信ホストヘッダー: '%2' + + Don't show again + 次から表示しない - WebUI + createTorrentDialog + + + Cancel + キャンセル + + + + Torrent Creation Tool + Torrent 作成ツール + + + + Torrent file creation + Torrent ファイルの作成 + + + + Add file + ファイルを追加 + + + + Add folder + フォルダーを追加 + + + + File or folder to add to the torrent: + Torrent に追加するファイルまたはフォルダー: + + + + Tracker URLs: + トラッカー URL: + + + + Web seeds urls: + ウェブシード URL: + + + + Comment: + コメント: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + 空行を入れることによってトラッカーティア/グループに分けることができます。 + + + + Piece size: + ピースサイズ: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + 自動 + + + + Private (won't be distributed on DHT network if enabled) + プライベート (DHT ネットワークが有効でも使用されません) + + + + Start seeding after creation + 作成後にシードを開始する + + + + Ignore share ratio limits for this torrent + この Torrent では共有比の上限を無視する + + + + Create and save... + 作成と保存... + + + + Progress: + 進行状況: + + + + downloadFromURL - - Web UI: HTTPS setup successful - Web UI: HTTPS セットアップは正常に完了しました + + Add torrent links + Torrent リンクの追加 + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + 1 行に 1 リンク (HTTP リンク、マグネットリンク、およびインフォハッシュをサポートしています) + + + + Download + ダウンロード + + + + Cancel + キャンセル + + + + Download from urls + URL からダウンロード - - Web UI: HTTPS setup failed, fallback to HTTP - Web UI: HTTPS セットアップに失敗しました。HTTP にフォールバックします + + No URL entered + URL が入力されていません - - Web UI: Now listening on IP: %1, port: %2 - Web UI: IP: %1, ポート番号: %2 で待ち受けています + + Please type at least one URL. + 少なくとも 1 つの URL を入力してください。 + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Web UI: IP: %1, ポート番号: %2 にバインドできませんでした。理由: %3 + + Crash info + クラッシュ情報 fsutils - + + + + + Downloads ダウンロード @@ -9766,100 +8742,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + Python が見つかりませんでした + + + + Python version: %1 + Python バージョン: %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1時間 %2分 - + %1d %2h e.g: 2days 10hours %1日 %2時間 - + Unknown Unknown (size) 不明 - + qBittorrent will shutdown the computer now because all downloads are complete. すべてのダウンロードが完了したので qBittorrent はコンピューターをシャットダウンします。 - + < 1m < 1 minute < 1 分 - + %1m e.g: 10minutes %1 分 + + + Working + 動作中 + + + + Updating... + 更新しています... + + + + Not working + 非動作中 + + + + Not contacted yet + 未接触 + preview - + Preview selection 選択範囲のプレビュー - + The following files support previewing, please select one of them: 以下のファイルのプレビューをサポートしています。どれか 1 つ選んでください: + + + Preview + プレビュー + + + + Cancel + キャンセル + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_ka.ts qbittorrent-3.3.15/src/lang/qbittorrent_ka.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_ka.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_ka.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,173 +1,85 @@ - - - AboutDialog - - - About qBittorrent - qBittorrent-ის შესახებ - - - - About - შესახებ - - - - Author - ავტორი - - - - Current maintainer - მიმდინარე მომვლელი - - - - Greece - საბერძნეთი - - - - - Nationality: - ეროვნება: - - - - - E-mail: - ელ-ფოსტა: - - - - - Name: - სახელი: - - - - Original author - ნამდვილი ავტორი - - - - France - საფრანგეთი - - - - Special Thanks - განსაკუთრებული მადლობა - - - - Translators - მთარგმნელები - - - - License - ლიცენზია - - - - Libraries - ბიბლიოთეკები - - - - qBittorrent was built with the following libraries: - qBittorrent აგებულია ამ ბიბლიოთეკებით: - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - - - - - Forum: - - - - - Bug Tracker: - - - + AboutDlg + About qBittorrent - qBittorrent-ის შესახებ + qBittorrent-ის შესახებ + About - შესახებ + შესახებ + Author - ავტორი + ავტორი + + Nationality: - ეროვნება: + ეროვნება: + + Name: - სახელი: + სახელი: + + E-mail: - ელ-ფოსტა: + ელ-ფოსტა: + Greece - საბერძნეთი + საბერძნეთი + Current maintainer - მიმდინარე მომვლელი + მიმდინარე მომვლელი + Original author - ნამდვილი ავტორი + ნამდვილი ავტორი + Special Thanks - განსაკუთრებული მადლობა + განსაკუთრებული მადლობა + Translators - მთარგმნელები + მთარგმნელები + Libraries - ბიბლიოთეკები + ბიბლიოთეკები + qBittorrent was built with the following libraries: - qBittorrent აგებულია ამ ბიბლიოთეკებით: + qBittorrent აგებულია ამ ბიბლიოთეკებით: + France - საფრანგეთი + საფრანგეთი + License - ლიცენზია + ლიცენზია @@ -178,65 +90,67 @@ შენახვა აქ + Browse... - მოძიება... + მოძიება... + Set as default save path - ნაგულისხმებ შენახვის ადგილად გამოყენება + ნაგულისხმებ შენახვის ადგილად გამოყენება - + Never show again აღარასოდეს გამოტანა - + Torrent settings ტორენტის მომართვა - + Set as default category ნაგულისხმევ კატეგორიად დაყენება - + Category: კატეგორია: - + Start torrent ტორენტის დაწყება - + Torrent information ტორენტის ინფორმაცია - + Skip hash check ჰეშის შემოწმების გამოტოვება - + Size: ზომა: - + Hash: ჰეში: - + Comment: კომენტარი: - + Date: თარიღი: @@ -261,121 +175,89 @@ ავტომატური - - Remember last used save path - - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog მონიშვნის შემთხვევაში, .torrent ფაილი არ წაიშლება პარამეტრების დიალოგის "ჩამოტვირთვა" გვერდის მითითებების მიუხედავად. - + Do not delete .torrent file არ წაიშალოს .torrent ფაილი - - Create subfolder - - - - - Download in sequential order - თანმიმდევრობით ჩამოტვირთვა - - - - Download first and last pieces first - - - - + Normal ჩვეულებრივი - + High მაღალი - + Maximum უმაღლესი - + Do not download არ გადმოტვირთვა - - - + + + I/O Error I/O შეცდომა - + Invalid torrent უმართებულო ტორენტი + + + + Already in download list - უკვე ჩამოტვირთვების სიაშია - - - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - + უკვე ჩამოტვირთვების სიაშია - + Not Available This comment is unavailable ხელმიუწვდომელი - + Not Available This date is unavailable ხელმიუწვდომელი - + Not available მიუწვდომელი - + Invalid magnet link უმართებულო მაგნიტური ბმული - + The torrent file '%1' does not exist. ტორენტ ფაილი '%1' არ არსებობს. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -383,135 +265,128 @@ + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + + + + Torrent is already in download list. Trackers were merged. - ტორენტი უკვე ჩამოტვირთვების სიაშია. ტრეკერები შეერთდნენ.. + ტორენტი უკვე ჩამოტვირთვების სიაშია. ტრეკერები შეერთდნენ.. + + Cannot add torrent - ტორენტის დამატება ვერ მოხერხდა + ტორენტის დამატება ვერ მოხერხდა + + + + Cannot add this torrent. Perhaps it is already in adding state. + - + This magnet link was not recognized მოცემული მაგნიტური ბმულის ამოცნობა ვერ მოხერხდა - + + Magnet link is already in download list. Trackers were merged. + + + + + Cannot add this torrent. Perhaps it is already in adding. + + + + Magnet link მაგნიტური ბმული - + Retrieving metadata... - + Not Available This size is unavailable. ხელმიუწვდომელი - + Free space on disk: %1 - + + Choose save path აირჩიეთ შენახვის ადგილი + Rename the file - ფაილის გადარქმევა + ფაილის გადარქმევა - + New name: ახალი სახელი: + + The file could not be renamed - ფაილის გადარქმევა ვერ მოხერხდა + ფაილის გადარქმევა ვერ მოხერხდა + This file name contains forbidden characters, please choose a different one. - ფაილის სახელი შეიცავს აკრძალულ სიმბოლოებს, გთხოვთ აირჩიეთ სხვა სახელი. - - - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - + ფაილის სახელი შეიცავს აკრძალულ სიმბოლოებს, გთხოვთ აირჩიეთ სხვა სახელი. - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - - - - - Magnet link is already queued for processing. - - - - - + + This name is already in use in this folder. Please use a different name. ამ საქაღალდეში ეს სახელი უკვე გამოიყენება. გთხოვთ აირჩიეთ სხვა სახელი. - + The folder could not be renamed საქაღალდის გადარქმევა ვერ მოხერხდა - + Rename... გადარქმევა... - + Priority პრიორიტეტი - + Invalid metadata - + Parsing metadata... - + Metadata retrieval complete - + Download Error @@ -519,320 +394,198 @@ AdvancedSettings + Disk write cache size - დისკზე ჩაწერილი კეშის ზომა + დისკზე ჩაწერილი კეშის ზომა - + MiB მიბ - + Outgoing ports (Min) [0: Disabled] გამავალი პორტები (მინ) [0: გამორთული] - + Outgoing ports (Max) [0: Disabled] გამავალი პორტები (მაქს) [0: გამორთული] - + Recheck torrents on completion ტორენტების გადამოწმება დასრულებისას - + Transfer list refresh interval ტორენტების სიის განახლების ინტერვალი - + ms milliseconds მწ - + Setting პარამეტრი - + Value Value set for this setting მნიშვნელობა - - - (disabled) - - - - + (auto) - - min - minutes - - - - + All addresses - + qBittorrent Section - - + + Open documentation - + libtorrent Section - - Asynchronous I/O threads - - - - - Disk cache - - - - + s seconds - + Disk cache expiry interval - + Enable OS cache - - Guided read cache - - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - - - - - - KiB - - - - - Send buffer watermark - - - - - Send buffer low watermark - - - - - Send buffer watermark factor - - - - - Prefer TCP - - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address + + m + minutes - + Resolve peer countries (GeoIP) პირების ქვეყნების დადგენა (GeoIP) - + Resolve peer host names პირების ჰოსტის სახელის დადგენა - + Strict super seeding სუპერ სიდირების რეჟიმი - + Network Interface (requires restart) ქსელური ინტერფეისი (საჭიროებს გადატვირთვას) - + Optional IP Address to bind to (requires restart) - + Listen on IPv6 address (requires restart) - + Display notifications - + Display notifications for added torrents - + Download tracker's favicon - - Save path history length - - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - - - - - Round-robin - - - - - Fastest upload - - - - - Anti-leech - - - - - Upload choking algorithm - - - - + Confirm torrent recheck - - Confirm removal of all tags - - - - - Always announce to all trackers in a tier - - - - - Always announce to all tiers - + Exchange trackers with other peers + ტრეკერების გაცვლა სხვა პირებთან + Always announce to all trackers - ყოველთვის მოხდეს ყველა ტრეკერის შეტყობინება + ყოველთვის მოხდეს ყველა ტრეკერის შეტყობინება - + Any interface i.e. Any network interface ნებისმიერი ინტერფეისი - + Save resume data interval How often the fastresume file is saved. - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - - - - + Maximum number of half-open connections [0: Unlimited] - + IP Address to report to trackers (requires restart) ტრეკერთან დასაკავშირებელი IP მისამართი (საჭიროებს გადატვირთვას) - + Enable embedded tracker ჩაშენებული ტრეკერის ჩართვა - + Embedded tracker port ჩაშენებული ტრეკერის პორტი - + Check for software updates პროგრამის განახლებების შემოწმება - + Use system icon theme სისტემის ხატულების თემის გამოყენება @@ -840,120 +593,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started - + Torrent: %1, running external program, command: %2 - - Torrent name: %1 - - - - - Torrent size: %1 - - - - - Save path: %1 - - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - - - - - Thank you for using qBittorrent. - - - - - [qBittorrent] '%1' has finished downloading + + Torrent: %1, run external program command too long (length > %2), execution failed. - + Torrent: %1, sending mail notification - + Information ინფორმაცია - - To control qBittorrent, access the Web UI at %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 - + The Web UI administrator user name is: %1 - + The Web UI administrator password is still the default one: %1 - + This is a security risk, please consider changing your password from program preferences. - + Saving torrent progress... - - - Portable mode and explicit profile directory options are mutually exclusive - - - - - Portable mode implies relative fastresume - - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: შენახვა: @@ -963,855 +657,668 @@ - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. + + Enable Automated RSS Downloader - + Download Rules - + Rule Definition - + Use Regular Expressions - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - - - - + Must Contain: - + Must Not Contain: - + Episode Filter: - + Assign Category: კატეგორიის მინიჭება: - + Save to a Different Directory - + Ignore Subsequent Matches for (0 to Disable) ... X days - + Disabled გამორთულია - + days - + Add Paused: - + Use global settings - + Always - + Never არასოდეს - + Apply Rule to Feeds: - + Matching RSS Articles - + &Import... - + &Export... - + Matches articles based on episode filter. - + Example: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match - + Episode filter rules: - + Season number is a mandatory non-zero value - + Filter must end with semicolon - + Three range types for episodes are supported: - + Single number: <b>1x25;</b> matches episode 25 of season one - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one - + Episode number is a mandatory positive value - - Rules - - - - - Rules (legacy) - - - - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - + Last Match: %1 days ago - + Last Match: Unknown - + New rule name ახალი წესის სახელი - + Please type the name of the new download rule. - - + + Rule name conflict წესის სახელის კონფლიქტი - - + + A rule with this name already exists, please choose another name. წესი იგივე სახელით უკვე არსებობს, გთხოვთ აირჩიეთ სხვა სახელი. - + Are you sure you want to remove the download rule named '%1'? - + Are you sure you want to remove the selected download rules? დარწმუნებული ხართ რომ არჩეული ჩამოტვირთვის წესების წაშლა გსურთ? - + Rule deletion confirmation წესის წაშლის დასტური - + Destination directory დანიშნულების მდებარეობა - + Invalid action - არასწორი მოქმედება + არასწორი მოქმედება - + The list is empty, there is nothing to export. - სია ცარიელია, გამოსატანი არაფერია. - - - - Export RSS rules - - - - - Failed to create the destination file. Reason: %1 - - - - - Import RSS rules - - - - - Failed to open the file. Reason: %1 - - - - - Failed to import the selected rules file. Reason: %1 - + სია ცარიელია, გამოსატანი არაფერია. + Where would you like to save the list? - სად გსურთ სიის შენახვა? + სად გსურთ სიის შენახვა? + Rules list (*.rssrules) - წესების საი (*.rssrules) + წესების საი (*.rssrules) - - + I/O Error - I/O შეცდომა + I/O შეცდომა + Failed to create the destination file - დანიშნულების ფაილის შექმნა ვერ მოხერხდა + დანიშნულების ფაილის შექმნა ვერ მოხერხდა + Please point to the RSS download rules file - გთხოვთ მიუთითეთ RSS ჩამოტვირთვის წესის ფაილი + გთხოვთ მიუთითეთ RSS ჩამოტვირთვის წესის ფაილი + Rules list - წესების სია + წესების სია - + Import Error - შემოტანის შეცდომა + შემოტანის შეცდომა + Failed to import the selected rules file - არჩეული წესის ფაილი შემოტანა ჩაიშალა + არჩეული წესის ფაილი შემოტანა ჩაიშალა - + Add new rule... ახალი წესის დამატება... - + Delete rule წესის წაშლა - + Rename rule... წესის გადარქმევა... - + Delete selected rules არჩეული წესების წაშლა - - Clear downloaded episodes... - - - - + Rule renaming წესის გადარქმევა - + Please type the new rule name გთხოვთ ჩაწერეთ ახალი წესის სახელი - - Clear downloaded episodes - - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - - - - - - Position %1: %2 - - - + Regex mode: use Perl-like regular expressions - Regex რეჟიმის გამოყენება: გამოიყენეთ Perl-ის მსგავსი რეგულარული გამოსახულებები + Regex რეჟიმის გამოყენება: გამოიყენეთ Perl-ის მსგავსი რეგულარული გამოსახულებები - + Wildcard mode: you can use - + ? to match any single character - + * to match zero or more of any characters - + Whitespaces count as AND operators (all words, any order) - + | is used as OR operator - + If word order is important use * instead of whitespace. - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - + will match all articles. - + will exclude all articles. - - - BanListOptions - - Delete - წაშლა - - - - BanListOptionsDialog - - - List of banned IP addresses - - - - Ban IP - - - - - Delete - წაშლა - - - - - Warning - - - - - The entered IP address is invalid. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + ჩანაცვლების ნიშნის რეჟიმი: თქვენ შეგიძლიათ გამოიყენოთ <ul><li>? რათა დაამთხვიოთ ნებისმიერ ერთ სიმბოლოს</li><li>* რათა დაამთხვიოთ ნულს ან მეტ ნებისმიერ სიმბოლოს</li><li>ცარიელი ადგილი ითვლება როგორც AND ოპერატორი</li></ul> - - The entered IP is already banned. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + ჩანაცვლების ნიშნის რეჟიმი: თქვენ შეგიძლიათ გამოიყენოთ <ul><li>? რათა დაამთხვიოთ ნებისმიერ ერთ სიმბოლოს</li><li>* რათა დაამთხვიოთ ნულს ან მეტ ნებისმიერ სიმბოლოს</li><li>| გამოიყენება როგორც OR ოპერატორი</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support PeX მხარდაჭერის გადართვისთვის საჭიროა გადატვირთვა - + Embedded Tracker [ON] ჩამაგრებული ტრეკერი [ჩართ.] - + Failed to start the embedded tracker! ჩამაგრებული ტრეკერის დაწყება არ შედგა! - + Embedded Tracker [OFF] ჩამაგრებული ტრეკერი [გამორთ.] + '%1' reached the maximum ratio you set. Removing... - '%1' ტორენტმა მიაღწია თქვენს მიერ დაყენებულ მაქსიმალურ შეფარდებას. ამოღება... + '%1' ტორენტმა მიაღწია თქვენს მიერ დაყენებულ მაქსიმალურ შეფარდებას. ამოღება... + + + + '%1' reached the maximum ratio you set. Pausing... + - + System network status changed to %1 e.g: System network status changed to ONLINE - + ONLINE - + OFFLINE - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. - - + Encryption support [%1] - - + FORCED - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - - - - - + Anonymous mode [%1] - + Unable to decode '%1' torrent file. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' - + Queue positions were corrected in %1 resume files - + Couldn't save '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - - - - + because %1 is disabled. this peer was blocked because uTP is disabled. - + because %1 is disabled. this peer was blocked because TCP is disabled. - + URL seed lookup failed for URL: '%1', message: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 - + The network interface defined is invalid: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 - - Peer ID: - - - - - HTTP User-Agent is '%1' - - - - - + DHT support [%1] - - - - - - - - - + + + + ON - - - - - - - - - + + + + OFF - - + Local Peer Discovery support [%1] - - PeX support [%1] - - - - - Could not get GUID of configured network interface. Binding to IP %1 - - - - - '%1' reached the maximum ratio you set. Removed. - - - - - '%1' reached the maximum ratio you set. Paused. - - - - - '%1' reached the maximum seeding time you set. Removed. - - - - - '%1' reached the maximum seeding time you set. Paused. - - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface - + Tracker '%1' was added to torrent '%2' - + Tracker '%1' was deleted from torrent '%2' - + URL seed '%1' was added to torrent '%2' - + URL seed '%1' was removed from torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Error: Failed to parse the provided IP filter. - - '%1' restored. - 'torrent name' restored. + + Couldn't add torrent. Reason: %1 - - Couldn't add torrent. Reason: %1 + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) - + '%1' added to download list. 'torrent name' was added to download list. - + An I/O error occurred, '%1' paused. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 - + due to IP filter. this peer was blocked due to ip filter. - + due to port filter. this peer was blocked due to port filter. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. - + because it has a low port. this peer was blocked because it has a low port. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 - + External IP: %1 e.g. External IP: 192.168.0.1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + File sizes mismatch for torrent '%1', pausing it. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... @@ -1819,17 +1326,17 @@ CategoryFilterModel - + Categories - + All - + Uncategorized @@ -1839,7 +1346,7 @@ Add category... - + კატეგორიის დამატება... @@ -1848,35 +1355,81 @@ - Edit category... - - - - Remove category - + კატეგორიის ამოღება - + Remove unused categories - + Resume torrents - + Pause torrents - + Delete torrents + + New Category + ახალი კატეგორია + + + + Category: + კატეგორია: + + + + Invalid category name + კატეგორიის სახელი არასწორია + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + კატეგორიის სახელი არ უნდა შეიცავდეს '\' სიმბოლოს. +კატეგორიის სახელი არ უნდა იწყებოდეს/მთავრდებოდოს '/' სიმბოლოთი. +კატეგორიის სახელი არ უნდა შეიცავდეს '//' თანმიმდევრობას. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + Add category... + კატეგორიის დამატება... + + + Remove category + კატეგორიის ამოღება + + New Category ახალი კატეგორია @@ -1888,6 +1441,14 @@ Invalid category name კატეგორიის სახელი არასწორია + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + კატეგორიის სახელი არ უნდა შეიცავდეს '\' სიმბოლოს. +კატეგორიის სახელი არ უნდა იწყებოდეს/მთავრდებოდოს '/' სიმბოლოთი. +კატეგორიის სახელი არ უნდა შეიცავდეს '//' თანმიმდევრობას. + CookiesDialog @@ -1926,82 +1487,34 @@ - DeletionConfirmationDialog - - - Deletion confirmation - - - - - Remember choice - არჩევნის დამახსოვრება - + DeletionConfirmationDlg - - Also delete the files on the hard disk - აგრეთვე წაიშალოს ფაილები მყარ დისკზე - - - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - ტორენტის ბმულების დამატება - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - ჩამოტვირთვა - - - - No URL entered - ბმული არ არის შეყვანილი - - - - Please type at least one URL. - გთხოვთ შეიყვანეთ მინიმუმ ერთი ბმული. - - - DownloadedPiecesBar - + White: Missing pieces - + Green: Partial pieces - + Blue: Completed pieces @@ -2009,34 +1522,23 @@ ExecutionLog + General - მთავარი - - - Blocked IPs - დაბლოკილი IP-ები - - - - ExecutionLogWidget - - - General - + მთავარი - + Blocked IPs - დაბლოკილი IP-ები + დაბლოკილი IP-ები - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> was banned x.y.z.w was banned @@ -2045,586 +1547,524 @@ FeedListWidget - + RSS feeds RSS არხები - - - Unread (%1) - - - + Unread - წაუკითხავი + წაუკითხავი FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. + + An error occured while trying to open the log file. Logging to file is disabled. - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - - - - - &Browse... - Launch file dialog button text (full) - - - - - Choose a file - Caption for file open/save dialog - - + FilterParserThread - - Choose a folder - Caption for directory open dialog + + + + I/O Error: Could not open ip filter file in read mode. - - Any file + + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. - FilterParserThread + GeoIPDatabase - - - - I/O Error: Could not open IP filter file in read mode. + + + Unsupported database file size. - - - - IP filter line %1 is malformed. + + Metadata error: '%1' entry not found. - - - IP filter line %1 is malformed. Start IP of the range is malformed. + + Metadata error: '%1' entry has invalid type. - - - IP filter line %1 is malformed. End IP of the range is malformed. + + Unsupported database version: %1.%2 - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! + + Unsupported IP version: %1 - - - IP filter exception thrown for line %1. Exception is: %2 + + Unsupported record size: %1 - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. + + Invalid database type: %1 - - - - - - - - Parsing Error: The filter file is not a valid PeerGuardian P2B file. + + Database corrupted: no data section found. - GeoIPDatabase - - - - Unsupported database file size. - - - - - Metadata error: '%1' entry not found. - - - - - Metadata error: '%1' entry has invalid type. - - - - - Unsupported database version: %1.%2 - - - - - Unsupported IP version: %1 - - - - - Unsupported record size: %1 - - - - - Invalid database type: %1 - - - - - Database corrupted: no data section found. - - - - - Http::Connection - - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - - - - - Bad Http request, closing socket. IP: %s - - - - - HttpServer + HttpServer + File - ფაილი + ფაილი + Edit - რედაქტირება + რედაქტირება + Help - დახმარება + დახმარება - + Exit qBittorrent - + Only one link per line მხოლოდ ერთი ბმული თითო ხაზზე + Download - ჩამოტვირთვა + ჩამოტვირთვა - + Global upload rate limit must be greater than 0 or disabled. - + Global download rate limit must be greater than 0 or disabled. - + Alternative upload rate limit must be greater than 0 or disabled. - + Alternative download rate limit must be greater than 0 or disabled. - + Maximum active downloads must be greater than -1. - + Maximum active uploads must be greater than -1. - + Maximum active torrents must be greater than -1. - + Maximum number of connections limit must be greater than 0 or disabled. მაქსიმალური კავშირების რაოდენობის ლიმიტი უნდა იყოს 0-ზე მაღალი ან გამორთული. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. ერთი ტორენტის მაქსიმალური კავშირების რაოდენობის ლიმიტი უნდა იყოს 0-ზე მაღალი ან გამორთული. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. ერთი ტორენტის ატვირთვის სლოტების მაქსიმალური რაოდენობის ლიმიტი უნდა იყოს 0-ზე მაღალი ან გამორთული. - + Unable to save program preferences, qBittorrent is probably unreachable. პროგრამის პარამეტრების დამახსოვრეაბ ვერ მოხერხდა, სავარაუდოდ qBittorrent მიუწვდომელია. - - IRC: #qbittorrent on Freenode - + + Language + ენა - - Invalid category name: -Please do not use any special characters in the category name. + + The port used for incoming connections must be between 1 and 65535. - - Unknown - უცნობია + + The port used for the Web UI must be between 1 and 65535. + - - Hard Disk + + Unable to log in, qBittorrent is probably unreachable. - - Share ratio limit must be between 0 and 9998. + + Invalid Username or Password. - - Seeding time limit must be between 0 and 525600 minutes. + + Password - Language - ენა + + Login + შესვლა - - The port used for incoming connections must be between 1 and 65535. + + Upload Failed! - - The port used for the Web UI must be between 1 and 65535. + + Original authors - - Unable to log in, qBittorrent is probably unreachable. + + Upload limit: - - Invalid Username or Password. + + Download limit: - - Username + + Apply - - Password + + Add - - Login - შესვლა + + Category: + კატეგორია: - - Original authors + + Upload Torrents + Upload torrent files to qBittorent using WebUI - - Apply + + All - - Add - + + Downloading + იტვირთება - Category: - კატეგორია: + + Seeding + სიდირდება - - Upload Torrents - Upload torrent files to qBittorent using WebUI + + Completed - Downloading - იტვირთება + + Resumed + - Seeding - სიდირდება + + Paused + დაპაუზებულია - Paused - დაპაუზებულია + + Active + - + + Inactive + + + + Save files to location: - + Cookie: - + Type folder here - + + Run an external program on torrent completion + + + + + Enable bandwidth management (uTP) + + + + + Apply rate limit to uTP connections + + + + + Alternative Global Rate Limits + + + + More information - + Information about certificates - + Save Files to - - Set location + + Watch Folder - - Limit upload rate + + Default Folder - - Limit download rate + + from + from time1 to time2 - - Rename torrent + + to + from time1 to time2 - - Unable to create category + + Other... + Save Files to: Watch Folder / Default Folder / Other... - - Other... - Save Files to: Watch Folder / Default Folder / Other... + + Every day + Schedule the use of alternative rate limits on ... - + + Week days + Schedule the use of alternative rate limits on ... + + + + + Week ends + Schedule the use of alternative rate limits on ... + + + + Monday Schedule the use of alternative rate limits on ... - + Tuesday Schedule the use of alternative rate limits on ... - + Wednesday Schedule the use of alternative rate limits on ... - + Thursday Schedule the use of alternative rate limits on ... - + Friday Schedule the use of alternative rate limits on ... - + Saturday Schedule the use of alternative rate limits on ... - + Sunday Schedule the use of alternative rate limits on ... + Downloaded Is the file downloaded or not? - ჩამოტვირთული + ჩამოტვირთული - + Logout - + + Download from URLs + + + + Download Torrents from their URLs or Magnet links - + Upload local torrent - + Are you sure you want to delete the selected torrents from the transfer list? - + Save დამახსოვრება - + qBittorrent client is not reachable qBittorrent-ის კლიენტი მიუწვდომელია + HTTP Server - HTTP სერვერი + HTTP სერვერი + The following parameters are supported: - მხარდაჭერილია შემდეგი პარამეტრები: + მხარდაჭერილია შემდეგი პარამეტრები: + Torrent path - ტორენტის მდებარეობა + ტორენტის მდებარეობა + Torrent name - ტორენტის სახელი + ტორენტის სახელი - + qBittorrent has been shutdown. - IPSubnetWhitelistOptionsDialog + LineEdit - - List of whitelisted IP subnets - + + Clear the text + ტექსტის წაშლა + + + LogListWidget - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - + + Copy + კოპირება - - Add subnet + + Clear + + + MainWindow - - Delete - წაშლა - - - - Error - - - - - The entered subnet is invalid. - - - - - LineEdit - - Clear the text - ტექსტის წაშლა - - - - LogListWidget - - - Copy - კოპირება - - - - Clear - - - - - MainWindow - - - &Edit - &რედაქტირება + + &Edit + &რედაქტირება @@ -2647,556 +2087,492 @@ - + &View &ხედი - + &Options... &პარამეტრები... - + &Resume &გაგრძელება - + Torrent &Creator ტორენტის &შემქმნელი - + Set Upload Limit... - + Set Download Limit... - + Set Global Download Limit... - + Set Global Upload Limit... - + Minimum Priority - + Top Priority - + Decrease Priority - + Increase Priority - - + + Alternative Speed Limits - + &Top Toolbar - + Display Top Toolbar - - Status &Bar - - - - + S&peed in Title Bar - + Show Transfer Speed in Title Bar - + &RSS Reader - + Search &Engine - + L&ock qBittorrent - + Do&nate! - - Close Window - - - - + R&esume All &ყველას გაგრძელება - + Manage Cookies... - + Manage stored network cookies - + Normal Messages - + Information Messages - + Warning Messages - + Critical Messages - + &Log - + &Exit qBittorrent - + &Suspend System - + &Hibernate System - + S&hutdown System - + &Disabled - + &Statistics - + Check for Updates - + Check for Program Updates - + &About &შესახებ - + &Pause &პაუზა - + &Delete &წაშლა - + P&ause All &ყველას დაპაუ&ზება - + &Add Torrent File... - + Open - + E&xit - + Open URL - + &Documentation &დოკუმენტაცია - + Lock - - - + + + Show ჩვენება - + Check for program updates - + Add Torrent &Link... - + If you like qBittorrent, please donate! თუ qBittorrent მოგწონთ, გთხოვთ გააკეთეთ ფულადი შემოწირულობა! - - + Execution Log გაშვების ჟურნალი - + Clear the password - + Filter torrent list... - + &Set Password - - Preferences - - - - + &Clear Password - + Transfers ტრანსფერები - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association ტორენტ ფაილებთან ასოციაცია - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent არ არის ტორენტ ფაილების და მაგნიტური ბმულების გასახსნელად ნაგულისხმევი პროგრამა . გსურთ qBittorrent-ის ასოცირება ტორენტ ფაილებთან და მაგნიტურ ბმულებთან? - + Icons Only - + Text Only - + Text Alongside Icons - + Text Under Icons - + Follow System Style - - - + + + UI lock password ინტერფეისის ჩაკეტვის პაროლი - - - + + + Please type the UI lock password: გთხოვთ შეიყვანეთ ინტერფეისის ჩაკეტვის პაროლი: - + The password should contain at least 3 characters პაროლი უნდა შეიცავდეს მინიმუმ 3 სიმბოლოს - + Password update პაროლის განახლება - + The UI lock password has been successfully updated ინტერფეისის ჩაკეტვის პაროლი წარმატებით განახლდა - + Are you sure you want to clear the password? - - Use regular expressions - - - - + Search ძებნა - + Transfers (%1) ტრანსფერები (%1) - + Error - + Failed to add torrent: %1 - + Torrent added - + '%1' was added. e.g: xxx.avi was added. - + Download completion ჩამოტვირთვის დასრულება - + I/O Error i.e: Input/Output Error I/O შეცდომა - + Recursive download confirmation რეკურსიული ჩამოტვირთვის დასტური - + Yes დიახ - + No არა - + Never არასოდეს - + Global Upload Speed Limit ატვირთვის სიჩქარის საერთო ლიმიტი - + Global Download Speed Limit ჩამოტვირთვის სიჩქარის საერთო ლიმიტი - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent ახლახანს განახლდა და ცვლილებების გასააქტიურებლად საჭიროებს გადატვირთვას. - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - - - - - Are you sure you want to quit qBittorrent? - - - - + &No &არა - + &Yes &კი - + &Always Yes &ყოველთვის კი - - %1/s - s is a shorthand for seconds - - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - + qBittorrent Update Available qBittorrent განახლება ხელმისაწვდომია + A new version is available. Do you want to download %1? - ხელმისაწვდომია ახალი ვერსია. + ხელმისაწვდომია ახალი ვერსია. გსურთ %1 ვერსიის ჩამოტვირთვა? - + Already Using the Latest qBittorrent Version - + Undetermined Python version - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -3204,162 +2580,152 @@ - + The torrent '%1' contains torrent files, do you want to proceed with their download? - + Couldn't download file at URL '%1', reason: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - - + + Couldn't determine your Python version (%1). Search engine disabled. + + + + + Missing Python Interpreter - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? - + Python is required to use the search engine but it does not seem to be installed. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. განახლებები არაა ხელმისაწვდომი. თქვენ უკვე იყენებთ უახლეს ვერსიას. - + &Check for Updates - + Checking for Updates... - + Already checking for program updates in the background - + Python found in '%1' - + Download error ჩამოტვირთვის შეცდომა - + Python setup could not be downloaded, reason: %1. Please install it manually. - - + + Invalid password პაროლი არასწორია - - - + + RSS (%1) - + URL download error - + The password is invalid პაროლი არასწორია - - + + DL speed: %1 e.g: Download speed: 10 KiB/s - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version - + Hide დამალვა - + Exiting qBittorrent qBittorrent-იდან გამოსვლა + Some files are currently transferring. Are you sure you want to quit qBittorrent? - ზოგიერთი ფაილი კვლავ ტრანსფერზეა. + ზოგიერთი ფაილი კვლავ ტრანსფერზეა. დარწმუნებული ხართ რომ qBittorrent-იდან გამოსვლა გსურთ? - + Open Torrent Files ტორენტ ფაილის გახსნა - + Torrent Files ტორენტ ფაილები - + Options were saved successfully. პარამეტრები წარმატბით დამახსოვრდა. @@ -3367,52 +2733,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. - + Dynamic DNS error: hostname supplied does not exist under specified account. - + Dynamic DNS error: Invalid username/password. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. - + Dynamic DNS error: supplied domain name is invalid. - + Dynamic DNS error: supplied username is too short. - + Dynamic DNS error: supplied password is too short. @@ -3420,1413 +2786,1303 @@ Net::DownloadHandler - + I/O Error I/O შეცდომა - + The file size is %1. It exceeds the download limit of %2. - + Unexpected redirect to magnet URI. - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. - - + + Couldn't load GeoIP database. Reason: %1 - + Venezuela, Bolivarian Republic of - + Viet Nam - - + + N/A - + Andorra - + United Arab Emirates - + Afghanistan - + Antigua and Barbuda - + Anguilla - + Albania - + Armenia - + Angola - + Antarctica - + Argentina - + American Samoa - + Austria - + Australia - + Aruba - + Azerbaijan - + Bosnia and Herzegovina - + Barbados - + Bangladesh - + Belgium - + Burkina Faso - + Bulgaria - + Bahrain - + Burundi - + Benin - + Bermuda - + Brunei Darussalam - + Brazil - + Bahamas - + Bhutan - + Bouvet Island - + Botswana - + Belarus - + Belize - + Canada - + Cocos (Keeling) Islands - + Congo, The Democratic Republic of the - + Central African Republic - + Congo - + Switzerland - + Cook Islands - + Chile - + Cameroon - + China - + Colombia - + Costa Rica - + Cuba - + Cape Verde - + Curacao - + Christmas Island - + Cyprus - + Czech Republic - + Germany - + Djibouti - + Denmark - + Dominica - + Dominican Republic - + Algeria - + Ecuador - + Estonia - + Egypt - + Western Sahara - + Eritrea - + Spain - + Ethiopia - + Finland - + Fiji - + Falkland Islands (Malvinas) - + Micronesia, Federated States of - + Faroe Islands - + France საფრანგეთი - + Gabon - + United Kingdom - + Grenada - + Georgia - + French Guiana - + Ghana - + Gibraltar - + Greenland - + Gambia - + Guinea - + Guadeloupe - + Equatorial Guinea - + Greece საბერძნეთი - + South Georgia and the South Sandwich Islands - + Guatemala - + Guam - + Guinea-Bissau - + Guyana - + Hong Kong - + Heard Island and McDonald Islands - + Honduras - + Croatia - + Haiti - + Hungary - + Indonesia - + Ireland - + Israel - + India - + British Indian Ocean Territory - + Iraq - + Iran, Islamic Republic of - + Iceland - + Italy - + Jamaica - + Jordan - + Japan - + Kenya - + Kyrgyzstan - + Cambodia - + Kiribati - + Comoros - + Saint Kitts and Nevis - + Korea, Democratic People's Republic of - + Korea, Republic of - + Kuwait - + Cayman Islands - + Kazakhstan - + Lao People's Democratic Republic - + Lebanon - + Saint Lucia - + Liechtenstein - + Sri Lanka - + Liberia - + Lesotho - + Lithuania - + Luxembourg - + Latvia - + Morocco - + Monaco - + Moldova, Republic of - + Madagascar - + Marshall Islands - + Mali - + Myanmar - + Mongolia - + Northern Mariana Islands - + Martinique - + Mauritania - + Montserrat - + Malta - + Mauritius - + Maldives - + Malawi - + Mexico - + Malaysia - + Mozambique - + Namibia - + New Caledonia - + Niger - + Norfolk Island - + Nigeria - + Nicaragua - + Netherlands - + Norway - + Nepal - + Nauru - + Niue - + New Zealand - + Oman - + Panama - + Peru - + French Polynesia - + Papua New Guinea - + Philippines - + Pakistan - + Poland - + Saint Pierre and Miquelon - + Puerto Rico - + Portugal - + Palau - + Paraguay - + Qatar - + Reunion - + Romania - + Russian Federation - + Rwanda - + Saudi Arabia - + Solomon Islands - + Seychelles - + Sudan - + Sweden - + Singapore - + Slovenia - + Svalbard and Jan Mayen - + Slovakia - + Sierra Leone - + San Marino - + Senegal - + Somalia - + Suriname - + Sao Tome and Principe - + El Salvador - + Syrian Arab Republic - + Swaziland - + Turks and Caicos Islands - + Chad - + French Southern Territories - + Togo - + Thailand - + Tajikistan - + Tokelau - + Turkmenistan - + Tunisia - + Tonga - - Could not decompress GeoIP database file. - - - - + Timor-Leste - + Bolivia, Plurinational State of - + Bonaire, Sint Eustatius and Saba - + Cote d'Ivoire - + Libya - + Saint Martin (French part) - + Macedonia, The Former Yugoslav Republic of - + Macao - + Pitcairn - + Palestine, State of - + Saint Helena, Ascension and Tristan da Cunha - + South Sudan - + Sint Maarten (Dutch part) - + Turkey - + Trinidad and Tobago - + Tuvalu - + Taiwan - + Tanzania, United Republic of - + Ukraine - + Uganda - + United States Minor Outlying Islands - + United States - + Uruguay - + Uzbekistan - + Holy See (Vatican City State) - + Saint Vincent and the Grenadines - + Virgin Islands, British - + Virgin Islands, U.S. - + Vanuatu - + Wallis and Futuna - + Samoa - + Yemen - + Mayotte - + Serbia - + South Africa - + Zambia - + Montenegro - + Zimbabwe - + Aland Islands - + Guernsey - + Isle of Man - + Jersey - + Saint Barthelemy - + + Could not uncompress GeoIP database file. + + + + Couldn't save downloaded GeoIP database file. - + Successfully updated GeoIP database. - + Couldn't download GeoIP database file. Reason: %1 @@ -4834,12 +4090,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] - + UPnP / NAT-PMP support [OFF] @@ -4847,7 +4103,7 @@ Net::Smtp - + Email Notification Error: @@ -4855,1277 +4111,1077 @@ OptionsDialog - + Options - + Behavior - + Downloads - + Connection კავშირი - + Speed - + BitTorrent - - RSS - - - - + Web UI - + Advanced - + Language ენა - + User Interface Language: - + (Requires restart) - + Transfer List - + Confirm when deleting torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. - + Hide zero and infinity values - + Always - + Paused torrents only - + Action on double-click - + Downloading torrents: - - + + Start / Stop Torrent - - + + Open destination folder დანიშნულების საქაღალდის გახსნა - - + + No action - + Completed torrents: - + Desktop - + Start qBittorrent on Windows start up - + Show splash screen on start up - + Start qBittorrent minimized - + Confirmation on exit when torrents are active - + Confirmation on auto-exit when downloads finish - - KiB + + Show qBittorrent in notification area - - Email notification &upon download completion + + Minimize qBittorrent to notification area - - Run e&xternal program on torrent completion + + Close qBittorrent to notification area + i.e: The systray tray icon will still be visible when closing the main window. - - IP Fi&ltering + + Tray icon style: - - Schedule &the use of alternative rate limits - + + Normal + ჩვეულებრივი - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + + Monochrome (Dark theme) - - &Torrent Queueing + + Monochrome (Light theme) - - Seed torrents until their seeding time reaches + + File association - - A&utomatically add these trackers to new downloads: + + Use qBittorrent for .torrent files - - RSS Reader + + Use qBittorrent for magnet links - - Enable fetching RSS feeds + + Power Management - - Feeds refresh interval: + + Inhibit system sleep when torrents are active - - Maximum number of articles per feed: - სტატიების მაქს. რაოდენობა ერთი არხიდან: + + Log file + - - - min - minutes + + Save path: - - RSS Torrent Auto Downloader + + Backup the log file after: - - Enable auto downloading of RSS torrents + + MB - - Edit auto downloading rules... + + Delete backup logs older than: - - Web User Interface (Remote control) + + days + Delete backup logs older than 10 months - - IP address: + + months + Delete backup logs older than 10 months - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. + + years + Delete backup logs older than 10 years - - Server domains: + + When adding a torrent - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. + + Display torrent content and some options - - &Use HTTPS instead of HTTP + + Bring torrent dialog to the front - - Bypass authentication for clients on localhost + + Do not start the download automatically + The torrent will be added to download list in pause state - - Bypass authentication for clients in whitelisted IP subnets + + Should the .torrent file be deleted after adding it - - IP subnet whitelist... + + Delete .torrent files afterwards - - Upda&te my dynamic domain name + + Also delete .torrent files whose addition was cancelled - - Minimize qBittorrent to notification area + + Also when addition is cancelled - - Close qBittorrent to notification area - i.e: The systray tray icon will still be visible when closing the main window. + + Warning! Data loss possible! - - Tray icon style: + + Saving Management - - Normal - ჩვეულებრივი + + Default Torrent Management Mode: + - - Monochrome (Dark theme) + + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - - Monochrome (Light theme) - + + Manual + არაავტომატური - - File association - + + Automatic + ავტომატური - - Use qBittorrent for .torrent files + + When Torrent Category changed: - - Use qBittorrent for magnet links + + Relocate torrent - - Power Management + + Switch torrent to Manual Mode - - Save path: + + When Default Save Path changed: - - Backup the log file after: + + + Relocate affected torrents - - Delete backup logs older than: + + + Switch affected torrents to Manual Mode - - days - Delete backup logs older than 10 months - - - - - months - Delete backup logs older than 10 months - - - - - years - Delete backup logs older than 10 years - - - - - When adding a torrent - - - - - Bring torrent dialog to the front - - - - - Do not start the download automatically - The torrent will be added to download list in pause state - - - - - Should the .torrent file be deleted after adding it - - - - - Also delete .torrent files whose addition was cancelled - - - - - Also when addition is cancelled - - - - - Warning! Data loss possible! - - - - - Saving Management - - - - - Default Torrent Management Mode: - - - - - Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - - - - - Manual - არაავტომატური - - - - Automatic - ავტომატური - - - - When Torrent Category changed: - - - - - Relocate torrent - - - - - Switch torrent to Manual Mode - - - - - When Default Save Path changed: - - - - - - Relocate affected torrents - - - - - - Switch affected torrents to Manual Mode - - - - + When Category changed: - + Use Subcategories - + Default Save Path: - + Keep incomplete torrents in: - + Copy .torrent files to: - - Show &qBittorrent in notification area - - - - - &Log file - - - - - Display &torrent content and some options - - - - - Create subfolder for torrents with multiple files - - - - - De&lete .torrent files afterwards - - - - + Copy .torrent files for finished downloads to: - + Pre-allocate disk space for all files - - Inhibit system sleep when torrents are downloading + + Append .!qB extension to incomplete files - - Inhibit system sleep when torrents are seeding - + + Automatically add torrents from: + ტორენტების ავტომატური დამატება მდებარეობიდან: - - Append .!qB extension to incomplete files + + Add entry - - Enable recursive download dialog + + Remove entry - - Automatically add torrents from: - ტორენტების ავტომატური დამატება მდებარეობიდან: - - - - Add entry + + Email notification upon download completion - - Remove entry + + Destination email: - + SMTP server: - + This server requires a secure connection (SSL) - - + + + Authentication - - - - + + + + Username: მომხმარებლის სახელი: - - - - + + + + Password: პაროლი: - - Enabled protocol: - - - - - TCP and μTP + + Run external program on torrent completion - + Listening Port - + Port used for incoming connections: - + Random - + Use UPnP / NAT-PMP port forwarding from my router - + Use different port on each startup - + Connections Limits - + Maximum number of connections per torrent: - + Global maximum number of connections: - + Maximum number of upload slots per torrent: - + Global maximum number of upload slots: - + Proxy Server - + Type: - + (None) - + SOCKS4 - + SOCKS5 - + HTTP - + Host: - - + + Port: - + Otherwise, the proxy server is only used for tracker connections - + Use proxy for peer connections - + Disable connections not supported by proxies - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - + Use proxy only for torrents - - A&uthentication + + Info: The password is saved unencrypted - - Info: The password is saved unencrypted + + IP Filtering - + Filter path (.dat, .p2p, .p2b): - + Reload the filter - - Manually banned IP addresses... - - - - + Apply to trackers - + Global Rate Limits - - - - - - - KiB/s - - - - - + + Upload: + + + + KiB/s - კბ/წ + კბ/წ - - + + Download: - + Alternative Rate Limits - - + + Schedule the use of alternative rate limits + + + + From: from (time1 to time2) - - + To: time1 to time2 - + When: - + Every day - + Weekdays - + Weekends - + Rate Limits Settings - + Apply rate limit to peers on LAN - + Apply rate limit to transport overhead - - + + + Enable µTP protocol + + + + Apply rate limit to µTP protocol - + Privacy - + Enable DHT (decentralized network) to find more peers - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers - + Look for peers on your local network - + Enable Local Peer Discovery to find more peers - + Encryption mode: - + Prefer encryption - + Require encryption - + Disable encryption - + Enable when using a proxy or a VPN connection - + Enable anonymous mode - - Maximum active downloads: - - - - - Maximum active uploads: - - - - - Maximum active torrents: + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - Do not count slow torrents in these limits + + Torrent Queueing - - Upload rate threshold: + + Maximum active downloads: - - Download rate threshold: + + Maximum active uploads: - - sec - seconds + + Maximum active torrents: - - Torrent inactivity timer: + + Do not count slow torrents in these limits - + Share Ratio Limiting - + Seed torrents until their ratio reaches - + then - + Pause them - + Remove them - - RSS Smart Episode Filters + + Automatically add these trackers to new downloads: - - Use UPnP / NAT-PMP to forward the port from my router + + Enable Web User Interface (Remote control) - - Certificate: + + Use UPnP / NAT-PMP to forward the port from my router - - Import SSL Certificate + + Use HTTPS instead of HTTP - - Key: + + Certificate: - - Import SSL Key + + Import SSL Certificate - - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> + + Key: - - Use alternative Web UI + + Import SSL Key - - Files location: + + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - - Enable clickjacking protection + + Bypass authentication for localhost - - Enable Cross-Site Request Forgery (CSRF) protection + + Update my dynamic domain name - + Service: - + Register - + Domain name: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): - + %N: Torrent name - + %L: Category - - %G: Tags (seperated by comma) - - - - + %F: Content path (same as root path for multifile torrent) - + %R: Root path (first torrent subdirectory path) - + %D: Save path - + %C: Number of files - + %Z: Torrent size (bytes) - + %T: Current tracker - + %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor - + Folder is already being monitored: - + Folder does not exist: - + Folder is not readable: - + Adding entry failed - - - - + + Choose export directory - - - + + + + + + Choose a save directory - + Choose an IP filter file - + All supported filters - + SSL Certificate - + + SSL Key + + + + Parsing error - + Failed to parse the provided IP filter - + Successfully refreshed - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Invalid key - + This is not a valid SSL key. - + Invalid certificate - - Preferences - - - - - Import SSL certificate - - - - + This is not a valid SSL certificate. - - Import SSL key - - - - - SSL key - - - - + Time Error - + The start time and the end time can't be the same. - - + + Length Error - + The Web UI username must be at least 3 characters long. - + The Web UI password must be at least 6 characters long. @@ -6133,72 +5189,72 @@ PeerInfo - - Interested(local) and Choked(peer) + + interested(local) and choked(peer) - + interested(local) and unchoked(peer) - + interested(peer) and choked(local) - + interested(peer) and unchoked(local) - + optimistic unchoke - + peer snubbed - + incoming connection - + not interested(local) and unchoked(peer) - + not interested(peer) and unchoked(local) - + peer from PEX - + peer from DHT - + encrypted traffic - + encrypted handshake - + peer from LSD @@ -6206,180 +5262,165 @@ PeerListWidget - + IP IP - + Port - + Flags - + Connection კავშირი - + Client i.e.: Client application კლიენტი - + Progress i.e: % downloaded პროგრესი - + Down Speed i.e: Download speed ჩამოტვირთვის სიჩქარე - + Up Speed i.e: Upload speed ატვირთვის სიჩქარე - + Downloaded i.e: total data downloaded ჩამოტვირთული - + Uploaded i.e: total data uploaded ატვირთული - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. - + Files i.e. files that are being downloaded right now - + Column visibility სვეტის ხილვადობა - + Add a new peer... ახალი პირის დამატება... - - + + Ban peer permanently პირის დაბლოკვა სამუდამოდ - + Manually adding peer '%1'... - + The peer '%1' could not be added to this torrent. - + Manually banning peer '%1'... - - + + Peer addition პირის დამატება - + Country - + Copy IP:port - + Some peers could not be added. Check the Log for details. - + The peers were added to this torrent. - + Are you sure you want to ban permanently the selected peers? დარწმუნებული ხართ რომ არჩეული პირების სამუდამოდ წაშლა გსურთ? - + &Yes &დიახ - + &No &არა - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - + PeersAdditionDlg - + No peer entered - + Please type at least one peer. - + Invalid peer - + The peer '%1' is invalid. @@ -6387,12 +5428,12 @@ PieceAvailabilityBar - + White: Unavailable pieces - + Blue: Available pieces @@ -6400,374 +5441,288 @@ PiecesBar - + Files in this piece: - + File in this piece - + File in these pieces - - Wait until metadata become available to see detailed information - - - - + Hold Shift key for detailed information - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Installed search plugins: - + Name სახელი - + Version - + Url - - + + Enabled - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Check for updates - + Close - + Uninstall - - - + + + Yes - + კი - - - - + + + + No არა - + Uninstall warning - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Uninstall success - + All selected plugins were uninstalled successfully - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - - - - - + + New search engine plugin URL - - + + URL: - + Invalid link - + The link doesn't seem to point to a search engine plugin. - + Select search plugins - + qBittorrent search plugin - + + + + Search plugin update + + + + All your plugins are already up to date. - + Sorry, couldn't check for plugin updates. %1 - + + + Search plugin install - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + + + + Couldn't install "%1" search engine plugin. %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + + + + Couldn't update "%1" search engine plugin. %2 - PluginSelectDlg + PluginSourceDlg - Name - სახელი + + Plugin source + - Yes - კი + + Search plugin source: + - No - არა - - - - PluginSourceDialog - - - Plugin source - - - - - Search plugin source: - - - - + Local file - + Web link - PowerManagement - - - qBittorrent is active - - - - PreviewSelect + Name - სახელი - - - Size - ზომა - - - Progress - პროგრესი - - - Preview impossible - გადახედვა შეუძლებელია - - - Sorry, we can't preview this file - ბოდიში, ჩვენ არ შეგვიძლია ამ ფაილის გადახედვა - - - - PreviewSelectDialog - - - Preview - გადახედვა - - - - Name - სახელი + სახელი - + Size - ზომა + ზომა - + Progress - პროგრესი + პროგრესი - - + + Preview impossible - გადახედვა შეუძლებელია + გადახედვა შეუძლებელია - - + + Sorry, we can't preview this file - ბოდიში, ჩვენ არ შეგვიძლია ამ ფაილის გადახედვა - - - - Private::FileLineEdit - - - '%1' does not exist - - - - - '%1' does not point to a directory - - - - - '%1' does not point to a file - - - - - Does not have read permission in '%1' - - - - - Does not have write permission in '%1' - + ბოდიში, ჩვენ არ შეგვიძლია ამ ფაილის გადახედვა PropListDelegate - + Not downloaded არ ჩამოტვირთულა - - + + Normal Normal (priority) ჩვეულებრივი - - N/A - - - - + Do not download Do not download (priority) - - + + High High (priority) მაღალი - + Mixed Mixed (priorities არეული - - + + Maximum Maximum (priority) მაქსიმალური @@ -6776,32 +5731,32 @@ PropTabBar - + General ზოგადი - + Trackers ტრეკერები - + Peers პირები - + HTTP Sources HTTP წყაროები - + Content შიგთავსი - + Speed @@ -6895,22 +5850,22 @@ კომენტარი: - + Select All ყველას არჩევა - + Select None არჩევის მოხსნა - + Normal ჩვეულებრივი - + High მაღალი @@ -6970,177 +5925,165 @@ - + Maximum მაქსიმალური + - Do not download არ ჩამოიტვირთოს - + Never არასოდეს - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) - - + + %1 (%2 this session) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) - + Open - + Open Containing Folder - + Rename... გადარქმევა... - + Priority პრიორიტეტი - + New Web seed - + Remove Web seed - + Copy Web seed URL - + Edit Web seed URL + Rename the file - ფაილის გადარქმევა + ფაილის გადარქმევა - + New name: ახალი სახელი: + + The file could not be renamed - ფაილის გადარქმევა ვერ მოხერხდა + ფაილის გადარქმევა ვერ მოხერხდა + This file name contains forbidden characters, please choose a different one. - ფაილის სახელი შეიცავს აკრძალულ სიმბოლოებს, გთხოვთ აირჩიეთ სხვა სახელი. + ფაილის სახელი შეიცავს აკრძალულ სიმბოლოებს, გთხოვთ აირჩიეთ სხვა სახელი. - - + + This name is already in use in this folder. Please use a different name. ამ საქაღალდეში ეს სახელი უკვე გამოიყენება. გთხოვთ აირჩიეთ სხვა სახელი. - + The folder could not be renamed საქაღალდის გადარქმევა ვერ მოხერხდა - + qBittorrent qBittorrent - + Filter files... - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - - - - + New URL seed New HTTP source - + New URL seed: - - + + This URL seed is already in the list. - + Web seed editing - + Web seed URL: @@ -7148,1245 +6091,1003 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + + + + + Error: '%1' is not a valid torrent file. + + + + + + Error: Could not add torrent to session. + + + + + I/O Error: Could not create temporary file. + + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. - - + + %1 must be the single command line parameter. - + + %1 must specify the correct port (1 to 65535). + + + + You cannot use %1: qBittorrent is already running for this user. - + Usage: - + Options: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' + + Displays program version - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' + + Displays this help message - - Expected integer number in environment variable '%1', but got '%2' + + Changes the Web UI port (current: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' + + Disable splash screen - - Expected %1 in environment variable '%2', but got '%3' + + Run in daemon-mode (background) - - port + + Downloads the torrents passed by the user - - %1 must specify a valid port (1 to 65535). - + + Help + დახმარება - - Display program version and exit + + Run application with -h option to read about command line parameters. - - Display this help message and exit + + Bad command line - - Change the Web UI port + + Bad command line: - - Disable splash screen + + Legal Notice - - Run in daemon-mode (background) + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. - - dir - Use appropriate short form or abbreviation of "directory" + + Press %1 key to accept and continue... - - Store configuration files in <dir> + + Legal notice - - - name + + Cancel + გაუქმება + + + + I Agree - - Store configuration files in directories qBittorrent_<name> + + Torrent name: %1 - - Hack into libtorrent fastresume files and make file paths relative to the profile directory + + Torrent size: %1 - - files or URLs + + Save path: %1 - - Download the torrents passed by the user + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. + + Thank you for using qBittorrent. - - Options when adding new torrents: + + [qBittorrent] '%1' has finished downloading - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume + + The remote host name was not found (invalid hostname) - - path + + The operation was canceled - - Torrent save path + + The remote server closed the connection prematurely, before the entire reply was received and processed - - Add torrents as started or paused + + The connection to the remote server timed out - - Skip hash check - ჰეშის შემოწმების გამოტოვება + + SSL/TLS handshake failed + - - Assign torrents to category. If the category doesn't exist, it will be created. + + The remote server refused the connection - - Download files in sequential order + + The connection to the proxy server was refused - - Download first and last pieces first + + The proxy server closed the connection prematurely - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: + + The proxy host name was not found - - Command line parameters take precedence over environment variables + + The connection to the proxy timed out or the proxy did not reply in time to the request sent - - Help - დახმარება + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + - - Run application with -h option to read about command line parameters. + + The access to the remote content was denied (401) - - Bad command line + + The operation requested on the remote content is not permitted - - Bad command line: + + The remote content was not found at the server (404) - - Legal Notice + + The remote server requires authentication to serve the content but the credentials provided were not accepted - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + + The Network Access API cannot honor the request because the protocol is not known - - No further notices will be issued. + + The requested operation is invalid for this protocol - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. + + An unknown network-related error was detected - - Press %1 key to accept and continue... + + An unknown proxy-related error was detected - - Legal notice + + An unknown error related to the remote content was detected - - Cancel - გაუქმება + + A breakdown in protocol was detected + - - I Agree + + Unknown error - - + + Upgrade - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - + Couldn't migrate torrent with hash: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 + + Detected unclean program exit. Using fallback file to restore settings. - + An access error occurred while trying to write the configuration file. - + A format error occurred while trying to write the configuration file. - - - An unknown error occurred while trying to write the configuration file. - - RSS + Search - ძებნა + ძებნა + New subscription - ახალი ხელმოწერა + ახალი ხელმოწერა + + + Mark items read - ელემენტის წაკითხულად მონიშვნა + ელემენტის წაკითხულად მონიშვნა + Update all - ყველას განახლება + ყველას განახლება + RSS Downloader... - RSS ჩამომტვირთავი... + RSS ჩამომტვირთავი... + Settings... - პარამეტრები... + პარამეტრები... + + + + Torrents: (double-click to download) + + + Delete - წაშლა + წაშლა + Rename... - გადარქმევა... + გადარქმევა... + Rename - გადარქმევა + გადარქმევა + + Update - განახლება + განახლება + New subscription... - ახალი ხელმოწერა... + ახალი ხელმოწერა... + + Update all feeds - ყველა არხის განახლება + ყველა არხის განახლება + Download torrent - ტორენტის ჩამოტვირთვა + ტორენტის ჩამოტვირთვა + Open news URL - სიახლეების ბმულის გახსნა + სიახლეების ბმულის გახსნა + Copy feed URL - არხის ბმილის კოპირება + არხის ბმილის კოპირება + New folder... - ახალი საქაღალდე... + ახალი საქაღალდე... + Refresh RSS streams - RSS ნაკადების განახლება + RSS ნაკადების განახლება - RSS::AutoDownloader + RSSImp - - - Invalid data format. - + + Stream URL: + არხის ბმული: - - Couldn't save RSS AutoDownloader data in %1. Error: %2 + + Please type a RSS stream URL - - Invalid data format + + This RSS feed is already in the list. - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - + + Please choose a folder name + გთხოვთ აირჩიეთ საქაღალდის სახელი - - Couldn't load RSS AutoDownloader rules. Reason: %1 - + + Folder name: + საქაღალდის სახელი: - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - + + New folder + ახალი საქაღალდე - - RSS feed at '%1' updated. Added %2 new articles. + + Deletion confirmation - - Failed to parse RSS feed at '%1'. Reason: %2 + + Are you sure you want to delete the selected RSS feeds? - - Couldn't read RSS Session data from %1. Error: %2 - + + Please choose a new name for this RSS feed + გთხოვთ აირჩიეთ ახალი სახელი ამ RSS არხისთვის - - Couldn't parse RSS Session data. Error: %1 - + + New feed name: + არხის ახალი სახელი: - - Couldn't load RSS Session data. Invalid data format. - + + Name already in use + სახელი უკვე გამოიყენება - - Couldn't load RSS article '%1#%2'. Invalid data format. - + + This name is already used by another item, please choose another one. + ეს სახელი უკვე გამოიყენება სხვა ელემენტის მიერ, გთხოვთ აირჩიეთ სხვა სახელი. - - - RSS::Private::Parser - - Invalid RSS feed. - + + Date: + თარიღი: - - %1 (line: %2, column: %3, offset: %4). - + + Author: + ავტორი: + + + + Unread + წაუკითხავი - RSS::Session + Rss::Feed - - RSS feed with given URL already exists: %1. + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... - - Cannot move root folder. + + Automatically downloading '%1' torrent from '%2' RSS feed... + + + Rss::Private::Parser - - - Item doesn't exist: %1. + + Invalid RSS feed. + + + RssSettingsDlg - - Cannot delete root folder. - + + RSS Reader Settings + RSS წამკითხველის პარამეტრები - - Incorrect RSS Item path: %1. - + + RSS feeds refresh interval: + RSS არხის განახლების ინტერვალი: - - RSS item with given path already exists: %1. + + min - - Parent folder doesn't exist: %1. - + + Maximum number of articles per feed: + სტატიების მაქს. რაოდენობა ერთი არხიდან: - RSSImp + ScanFoldersDelegate - Stream URL: - არხის ბმული: - - - Please choose a folder name - გთხოვთ აირჩიეთ საქაღალდის სახელი - - - Folder name: - საქაღალდის სახელი: - - - New folder - ახალი საქაღალდე - - - Please choose a new name for this RSS feed - გთხოვთ აირჩიეთ ახალი სახელი ამ RSS არხისთვის - - - New feed name: - არხის ახალი სახელი: - - - Name already in use - სახელი უკვე გამოიყენება - - - This name is already used by another item, please choose another one. - ეს სახელი უკვე გამოიყენება სხვა ელემენტის მიერ, გთხოვთ აირჩიეთ სხვა სახელი. - - - Date: - თარიღი: - - - Author: - ავტორი: - - - Unread - წაუკითხავი + + Select save location + - RSSWidget - - - Search - ძებნა - + ScanFoldersModel - - Fetching of RSS feeds is disabled now! You can enable it in application settings. + + Monitored Folder - - New subscription - ახალი ხელმოწერა - - - - - - Mark items read - ელემენტის წაკითხულად მონიშვნა - - - - Refresh RSS streams - RSS ნაკადების განახლება - - - - Update all - ყველას განახლება - - - - RSS Downloader... - RSS ჩამომტვირთავი... + + Override Save Location + - - Torrents: (double-click to download) + + Monitored folder - - - Delete - წაშლა + + Default save location + - - Rename... - გადარქმევა... + + Browse... + მოძიება... + + + SearchEngine - - Rename - გადარქმევა + + Unknown search engine plugin file format. + - - - Update - განახლება + + A more recent version of this plugin is already installed. + - - New subscription... - ახალი ხელმოწერა... + + + Plugin is not supported. + - - - Update all feeds - ყველა არხის განახლება + + Update server is temporarily unavailable. %1 + განახლების სერვერი დროებით მიუწვდომელია. %1 - - Download torrent - ტორენტის ჩამოტვირთვა + + + Failed to download the plugin file. %1 + - - Open news URL - სიახლეების ბმულის გახსნა + + An incorrect update info received. + - - Copy feed URL - არხის ბმილის კოპირება + + All categories + - - New folder... - ახალი საქაღალდე... + + Movies + - - Please choose a folder name - გთხოვთ აირჩიეთ საქაღალდის სახელი + + TV shows + - - Folder name: - საქაღალდის სახელი: + + Music + - - New folder - ახალი საქაღალდე + + Games + - - Please type a RSS feed URL + + Anime - - Feed URL: + + Software - - Deletion confirmation + + Pictures - - Are you sure you want to delete the selected RSS feeds? + + Books + + + SearchListDelegate - - Please choose a new name for this RSS feed - გთხოვთ აირჩიეთ ახალი სახელი ამ RSS არხისთვის + + + Unknown + უცნობია + + + SearchTab - - New feed name: - არხის ახალი სახელი: + + Name + i.e: file name + სახელი - - Rename failed - + + Size + i.e: file size + ზომა - - Date: - თარიღი: + + Seeders + i.e: Number of full sources + სიდერები - - Author: - ავტორი: + + Leechers + i.e: Number of partial sources + ლიჩერები - - - RssSettingsDlg - RSS Reader Settings - RSS წამკითხველის პარამეტრები + + Search engine + საძიებო სისტემა - RSS feeds refresh interval: - RSS არხის განახლების ინტერვალი: + + Results (showing <i>%1</i> out of <i>%2</i>): + i.e: Search results + - Maximum number of articles per feed: - სტატიების მაქს. რაოდენობა ერთი არხიდან: + + Torrent names only + - - - ScanFoldersDelegate - - Select save location + + Everywhere - - - ScanFoldersModel - - Monitored Folder + + Searching... - - Override Save Location + + Search has finished - - Monitored folder + + Search aborted - - Default save location + + An error occurred during search... - - Browse... - მოძიება... + + Search returned no results + - - - SearchEngine - Update server is temporarily unavailable. %1 - განახლების სერვერი დროებით მიუწვდომელია. %1 + + Column visibility + სვეტის ხილვადობა - - - SearchJobWidget - + Form - + Results(xxx) - + Search in: - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - + Seeds: - + <html><head/><body><p>Minimal number of seeds</p></body></html> - - + + to - + <html><head/><body><p>Maximal number of seeds</p></body></html> - - - + + + - + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + Size: ზომა: - + <html><head/><body><p>Minimal torrent size</p></body></html> - + <html><head/><body><p>Maximal torrent size</p></body></html> + + + SearchWidget - - Name - i.e: file name - სახელი + + + + + + Search + ძებნა - - Size - i.e: file size - ზომა + + Download + ჩამოტვირთვა - - Seeders - i.e: Number of full sources - სიდერები + + Go to description page + - - Leechers - i.e: Number of partial sources - ლიჩერები + + Copy description page URL + - - Search engine - საძიებო სისტემა + + Search plugins... + - - Filter search results... + + A phrase to search for. - - Results (showing <i>%1</i> out of <i>%2</i>): - i.e: Search results + + Spaces in a search term may be protected by double quotes. - - Torrent names only + + Example: + Search phrase example - - Everywhere + + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> + Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - - Use regular expressions + + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> + Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - - Searching... + + All plugins - - Search has finished + + Only enabled - - Search aborted + + Select... - - An error occurred during search... + + + + Search Engine - - Search returned no results + + Please install Python to use the Search Engine. - - Column visibility - სვეტის ხილვადობა + + Empty search pattern + - - - SearchListDelegate - Unknown - უცნობია + + Please type a search pattern first + - - - SearchPluginManager - - Unknown search engine plugin file format. + + Stop - - A more recent version of this plugin is already installed. + + Search has finished - - - Plugin is not supported. + + Search has failed + + + ShutdownConfirmDlg - - All categories + + qBittorrent will now exit. - - Movies + + E&xit Now - - TV shows + + Exit confirmation - - Music + + The computer is going to shutdown. - - Games + + &Shutdown Now - - Anime + + The computer is going to enter suspend mode. - - Software + + &Suspend Now - - Pictures + + Suspend confirmation - - Books + + The computer is going to enter hibernation mode. - - Update server is temporarily unavailable. %1 - განახლების სერვერი დროებით მიუწვდომელია. %1 - - - - - Failed to download the plugin file. %1 - - - - - An incorrect update info received. - - - - - Search plugin '%1' contains invalid version string ('%2') - - - - - SearchTab - - Name - i.e: file name - სახელი - - - Size - i.e: file size - ზომა - - - Seeders - i.e: Number of full sources - სიდერები - - - Leechers - i.e: Number of partial sources - ლიჩერები - - - Search engine - საძიებო სისტემა - - - Column visibility - სვეტის ხილვადობა - - - Size: - ზომა: - - - - SearchWidget - - - - - - - - Search - ძებნა - - - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - - - Download - ჩამოტვირთვა - - - - Go to description page - - - - - Copy description page URL - - - - - Search plugins... - - - - - A phrase to search for. - - - - - Spaces in a search term may be protected by double quotes. - - - - - Example: - Search phrase example - - - - - <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> - Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - - - - - <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> - Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - - - - - All plugins - - - - - Only enabled - - - - - Select... - - - - - - - Search Engine - - - - - Please install Python to use the Search Engine. - - - - - Empty search pattern - - - - - Please type a search pattern first - - - - - Stop - - - - - Search has finished - - - - - Search has failed - - - - - ShutdownConfirmDialog - - - Don't show again - - - - - qBittorrent will now exit. - - - - - E&xit Now - - - - - Exit confirmation - - - - - The computer is going to shutdown. - - - - - &Shutdown Now - - - - - Shutdown confirmation - გათიშვის დასტური - - - - The computer is going to enter suspend mode. - - - - - &Suspend Now - - - - - Suspend confirmation - - - - - The computer is going to enter hibernation mode. - - - - + &Hibernate Now - + Hibernate confirmation - + You can cancel the action within %1 seconds. - - - ShutdownConfirmDlg + Shutdown confirmation - გათიშვის დასტური + გათიშვის დასტური SpeedLimitDialog - + KiB/s კბ/წ @@ -8394,52 +7095,52 @@ SpeedPlotView - + Total Upload - + Total Download - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - + DHT Download - + Tracker Upload - + Tracker Download @@ -8447,95 +7148,87 @@ SpeedWidget - + Period: - + 1 Minute - + 5 Minutes - + 30 Minutes - + 6 Hours - + Select Graphs - + Total Upload - + Total Download - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - + DHT Download - + Tracker Upload - + Tracker Download - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8548,48 +7241,48 @@ - - Cache statistics + + Total peer connections: - - Read cache hits: + + Global ratio: - - Average time in queue: + + Alltime download: - - Connected peers: + + Alltime upload: - - All-time share ratio: + + Total waste (this session): - - All-time download: + + Cache statistics - - Session waste: + + Read cache hits: - - All-time upload: + + Average time in queue: - Total buffer size: + Total buffers size: @@ -8618,7 +7311,12 @@ - + + OK + + + + %1 ms 18 milliseconds @@ -8627,35 +7325,32 @@ StatusBar - + Connection status: კავშირის სტატუსი: - + No direct connections. This may indicate network configuration problems. პიდაპირი კავშირები არ არის. ამას შესაძლოა იწვევდეს ქსელის კონფიგურაციის პრობლემები. - + DHT: %1 nodes DHT: %1 კვანძები + qBittorrent needs to be restarted - qBittorrent საჭიროებს გადატვირთვას + qBittorrent საჭიროებს გადატვირთვას + qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent ახლახანს განახლდა და ცვლილებების გასააქტიურებლად საჭიროებს გადატვირთვას. - - - - qBittorrent needs to be restarted! - + qBittorrent ახლახანს განახლდა და ცვლილებების გასააქტიურებლად საჭიროებს გადატვირთვას. @@ -8674,2079 +7369,1306 @@ ხაზზეა - + Click to switch to alternative speed limits დააწკაპუნეთ სიჩქარის ალტერნატიულ ლიმიტებზე გადასართველად - + Click to switch to regular speed limits დააწკაპუნეთ სიჩქარის ჩვეულებრივ ლიმიტებზე გადასართველად - + + Manual change of rate limits mode. The scheduler is disabled. + + + + Global Download Speed Limit ჩამოტვირთვის სიჩქარის საერთო ლიმიტი - + Global Upload Speed Limit ატვირთვის სიჩქარის საერთო ლიმიტი - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - + Downloading (0) - + Seeding (0) - + Completed (0) - + Resumed (0) - + Paused (0) - + Active (0) - + Inactive (0) - + Errored (0) - + All (%1) - + Downloading (%1) - + Seeding (%1) - + Completed (%1) - + Paused (%1) - + Resumed (%1) - + Active (%1) - + Inactive (%1) - + Errored (%1) - TagFilterModel + TorrentContentModel - - Tags - + + Name + სახელი - - All - + + Size + ზომა - - Untagged - + + Progress + პროგრესი - - - TagFilterWidget - - Add tag... + + Download Priority - - Remove tag - - - - - Remove unused tags - - - - - Resume torrents - - - - - Pause torrents - - - - - Delete torrents - - - - - New Tag - - - - - Tag: - - - - - Invalid tag name - - - - - Tag name '%1' is invalid - - - - - Tag exists - - - - - Tag name already exists. + + Remaining - TorrentCategoryDialog - - - Torrent Category Properties - - - - - Name: - სახელი: - + TorrentCreatorDlg - - Save path: - + + Select a folder to add to the torrent + აირჩეით ტორენტში დასამატებელი საქაღალდე - - Choose save path - + + Select a file to add to the torrent + აირჩეით ტორენტში დასამატებელი ფაილი - - New Category - ახალი კატეგორია + + No input path set + შესატანი მდებარეობა არ მითითებულა - - Invalid category name - კატეგორიის სახელი არასწორია + + Please type an input path first + გთხოვთ ჯერ მიუთითეთ შესატანი მდებარეობა - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - + + Select destination torrent file + აირჩიეთ დანიშნულების ტორენტ ფაილი - - Category creation error + + Torrent Files (*.torrent) - - Category with the given name already exists. -Please choose a different name and try again. + + Torrent was created successfully: %1 + %1 is the path of the torrent - - - TorrentContentModel - - - Name - სახელი - - - - Size - ზომა - - - - Progress - პროგრესი - - - Download Priority - + + + + Torrent creation + ტორენტის შექმნა - - Remaining - + + Torrent creation was unsuccessful, reason: %1 + ტორენტის შექმნა წარუმატებლად დასრულდა, მიზეზი: %1 - - Availability - + + Created torrent file is invalid. It won't be added to download list. + შექმნილი ტორენტ ფაილი არასწორი. მისი ჩამოტვირთვების სიაში დამატება ვერ მოხერხდა. - TorrentCreatorDialog - - - Torrent Creator - - - - - Select file/folder to share - - - - - Path: - - + TorrentModel - - [Drag and drop area] - + + Name + i.e: torrent name + სახელი - - - Select file - + + Size + i.e: torrent size + ზომა - - - Select folder - + + Done + % Done + დასრულდა - - Settings - + + Status + Torrent status (e.g. downloading, seeding, paused) + სტატუსი - - Piece size: - ნაწილის ზომა: + + Seeds + i.e. full sources (often untranslated) + სიდერები - - Auto - ავტო + + Peers + i.e. partial sources (often untranslated) + პირები - - 16 KiB - 512 კბ {16 ?} + + Down Speed + i.e: Download speed + ჩამოტვირთვის სიჩქარე - - 32 KiB - 32 კბ + + Up Speed + i.e: Upload speed + ატვირთვის სიჩქარე - - 64 KiB - 64 კბ + + Ratio + Share ratio + შეფარდება - - 128 KiB - 128 კბ + + ETA + i.e: Estimated Time of Arrival / Time left + დარჩენილი დრო - - 256 KiB - 256 კბ + + Category + კატეგორია - - 512 KiB - 512 კბ + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + დამატების თარიღი - - 1 MiB - 1 მბ + + Completed On + Torrent was completed on 01/01/2010 08:00 + დასრულების თარიღი - - 2 MiB - 2 მბ + + Tracker + ტრეკერი - - 4 MiB - 4 მბ + + Down Limit + i.e: Download limit + ჩამოტვირთვის ლიმიტი - - 8 MiB - 4 მბ {8 ?} + + Up Limit + i.e: Upload limit + ატვირთვის ლიმიტი - - 16 MiB - 4 მბ {16 ?} + + Downloaded + Amount of data downloaded (e.g. in MB) + ჩამოტვირთული - - 32 MiB - 4 მბ {16 ?} {32 ?} + + Uploaded + Amount of data uploaded (e.g. in MB) + ატვირთული - - Calculate number of pieces: + + Session Download + Amount of data downloaded since program open (e.g. in MB) - - Private torrent (Won't distribute on DHT network) + + Session Upload + Amount of data uploaded since program open (e.g. in MB) - - Start seeding immediately + + Remaining + Amount of data left to download (e.g. in MB) - - Ignore share ratio limits for this torrent - + + Time Active + Time (duration) the torrent is active (not paused) + აქტიურობის დრო - - Optimize alignment + + Save path + Torrent save path - - Fields + + Completed + Amount of data completed (e.g. in MB) - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + + Ratio Limit + Upload share ratio limit - - Web seed URLs: + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole - - Tracker URLs: - ტრეკერის ბმულები: + + Last Activity + Time passed since a chunk was downloaded/uploaded + - - Comments: + + Total Size + i.e. Size including unwanted data + + + TrackerFiltersList - - Source: + + All (0) + this is for the tracker filter - - Progress: - პროგრესი: + + Trackerless (0) + - - Create Torrent + + Error (0) - - - - Torrent creation failed + + Warning (0) - - Reason: Path to file/folder is not readable. + + + Trackerless (%1) - - Select where to save the new torrent + + + Error (%1) - - Torrent Files (*.torrent) + + + Warning (%1) - - Reason: %1 + + Resume torrents - - Reason: Created torrent is invalid. It won't be added to download list. + + Pause torrents - - Torrent creator + + Delete torrents - - Torrent created: + + + All (%1) + this is for the tracker filter - TorrentCreatorDlg + TrackerList - Select a folder to add to the torrent - აირჩეით ტორენტში დასამატებელი საქაღალდე + + URL + ბმული - Select a file to add to the torrent - აირჩეით ტორენტში დასამატებელი ფაილი + + Status + სტატუსი - No input path set - შესატანი მდებარეობა არ მითითებულა + + Received + - Please type an input path first - გთხოვთ ჯერ მიუთითეთ შესატანი მდებარეობა + + Seeds + სიდერები - Select destination torrent file - აირჩიეთ დანიშნულების ტორენტ ფაილი + + Peers + პირები - Torrent creation - ტორენტის შექმნა + + Downloaded + ჩამოტვირთული - Torrent creation was unsuccessful, reason: %1 - ტორენტის შექმნა წარუმატებლად დასრულდა, მიზეზი: %1 + + Message + შეტყობინება - Created torrent file is invalid. It won't be added to download list. - შექმნილი ტორენტ ფაილი არასწორი. მისი ჩამოტვირთვების სიაში დამატება ვერ მოხერხდა. + + + Working + მუშაობს - Piece size: - ნაწილის ზომა: + + Disabled + გამორთულია - Auto - ავტო + + This torrent is private + ეს პირადი ტორენტია - 16 KiB - 512 კბ {16 ?} + + Updating... + ნახლდება... - 32 KiB - 32 კბ + + Not working + არ მუშაობს - 64 KiB - 64 კბ + + Not contacted yet + ჯერ არ დაკავშირებულა - 128 KiB - 128 კბ + + Tracker URL: + - 256 KiB - 256 კბ + + Tracker editing + - 512 KiB - 512 კბ + + + Tracker editing failed + - 1 MiB - 1 მბ + + The tracker URL entered is invalid. + - 2 MiB - 2 მბ + + The tracker URL already exists. + - 4 MiB - 4 მბ + + Add a new tracker... + ახალი ტრეკერის დამატება... - 8 MiB - 4 მბ {8 ?} + + Copy tracker URL + - 16 MiB - 4 მბ {16 ?} + + Edit selected tracker URL + - 32 MiB - 4 მბ {16 ?} {32 ?} + + Force reannounce to selected trackers + - Tracker URLs: - ტრეკერის ბმულები: + + Force reannounce to all trackers + - Progress: - პროგრესი: - - - - TorrentInfo - - - File size exceeds max limit %1 - - - - - Torrent file read error: %1 - - - - - Torrent file read error: size mismatch - - - - - TorrentModel - - Name - i.e: torrent name - სახელი - - - Size - i.e: torrent size - ზომა - - - Done - % Done - დასრულდა - - - Status - Torrent status (e.g. downloading, seeding, paused) - სტატუსი - - - Seeds - i.e. full sources (often untranslated) - სიდერები - - - Peers - i.e. partial sources (often untranslated) - პირები - - - Down Speed - i.e: Download speed - ჩამოტვირთვის სიჩქარე - - - Up Speed - i.e: Upload speed - ატვირთვის სიჩქარე - - - Ratio - Share ratio - შეფარდება - - - ETA - i.e: Estimated Time of Arrival / Time left - დარჩენილი დრო - - - Category - კატეგორია - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - დამატების თარიღი - - - Completed On - Torrent was completed on 01/01/2010 08:00 - დასრულების თარიღი - - - Tracker - ტრეკერი - - - Down Limit - i.e: Download limit - ჩამოტვირთვის ლიმიტი - - - Up Limit - i.e: Upload limit - ატვირთვის ლიმიტი - - - Downloaded - Amount of data downloaded (e.g. in MB) - ჩამოტვირთული - - - Uploaded - Amount of data uploaded (e.g. in MB) - ატვირთული - - - Time Active - Time (duration) the torrent is active (not paused) - აქტიურობის დრო - - - - TorrentsController - - - Not contacted yet - ჯერ არ დაკავშირებულა - - - - Updating... - ნახლდება... - - - - Working - მუშაობს - - - - Not working - არ მუშაობს - - - - Error: '%1' is not a valid torrent file. - - - - - - - - Torrent queueing must be enabled - - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - - Cannot make save path - - - - - Cannot write to directory - - - - - WebUI Set location: moving "%1", from "%2" to "%3" - - - - - Incorrect torrent name - - - - - - Incorrect category name - კატეგორიის სახელი არასწორია - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - - - - - Trackerless (0) - - - - - Error (0) - - - - - Warning (0) - - - - - - Trackerless (%1) - - - - - - Error (%1) - - - - - - Warning (%1) - - - - - Resume torrents - - - - - Pause torrents - - - - - Delete torrents - - - - - - All (%1) - this is for the tracker filter - - - - - TrackerList - - URL - ბმული - - - Status - სტატუსი - - - Seeds - სიდერები - - - Peers - პირები - - - Downloaded - ჩამოტვირთული - - - Message - შეტყობინება - - - Working - მუშაობს - - - Disabled - გამორთულია - - - This torrent is private - ეს პირადი ტორენტია - - - Updating... - ნახლდება... - - - Not working - არ მუშაობს - - - Not contacted yet - ჯერ არ დაკავშირებულა - - - Add a new tracker... - ახალი ტრეკერის დამატება... - - - Column visibility - სვეტის ხილვადობა - - - Remove tracker - ტრეკერის წაშლა - - - - TrackerListWidget - - - - Working - მუშაობს - - - - Disabled - გამორთულია - - - - This torrent is private - ეს პირადი ტორენტია - - - - Updating... - ნახლდება... - - - - Not working - არ მუშაობს - - - - Not contacted yet - ჯერ არ დაკავშირებულა - - - - - - - - - N/A - - - - - Tracker editing - - - - - Tracker URL: - - - - - - Tracker editing failed - - - - - The tracker URL entered is invalid. - - - - - The tracker URL already exists. - - - - - Add a new tracker... - ახალი ტრეკერის დამატება... - - - - Remove tracker - ტრეკერის წაშლა - - - - Copy tracker URL - - - - - Edit selected tracker URL - - - - - Force reannounce to selected trackers - - - - - Force reannounce to all trackers - - - - - URL - ბმული - - - - Status - სტატუსი - - - - Received - - - - - Seeds - სიდერები - - - - Peers - პირები - - - - Downloaded - ჩამოტვირთული - - - - Message - შეტყობინება - - - - Column visibility - სვეტის ხილვადობა - - - - TrackerLoginDialog - - - - Tracker authentication - ტრეკერის ავთენტიფიკაცია - - - - Tracker: - ტრეკერი: - - - - Login - შესვლა - - - - Username: - მომხმარებლის სახელი: - - - - Password: - პაროლი: - - - - Log in - შესვლა - - - - TrackersAdditionDialog - - - Trackers addition dialog - ტრეკერის დამატების დიალოგი - - - - List of trackers to add (one per line): - დასამატებელი ტრეკერების სია (ერთი თითო ხაზზე): - - - - µTorrent compatible list URL: - µTorrent-თან თავსებადი სიის ბმული: - - - - No change - ცვლილება არ არის - - - - No additional trackers were found. - დამატებითი ტრეკერები ვერ მოიძებნა. - - - - Download error - ჩამოტვირთვის შეცდომა - - - - The trackers list could not be downloaded, reason: %1 - ტრეკერების სიის ჩამოტვირთვა ვერ მოხერხდა, მიზეზი: %1 + + Remove tracker + ტრეკერის წაშლა TrackersAdditionDlg + Trackers addition dialog - ტრეკერის დამატების დიალოგი - - - List of trackers to add (one per line): - დასამატებელი ტრეკერების სია (ერთი თითო ხაზზე): - - - µTorrent compatible list URL: - µTorrent-თან თავსებადი სიის ბმული: - - - I/O Error - I/O შეცდომა - - - Error while trying to open the downloaded file. - ჩამოტვირთული ფაილის გახსნისას დაფიქსირდა შეცდომა. - - - No change - ცვლილება არ არის - - - No additional trackers were found. - დამატებითი ტრეკერები ვერ მოიძებნა. - - - Download error - ჩამოტვირთვის შეცდომა - - - The trackers list could not be downloaded, reason: %1 - ტრეკერების სიის ჩამოტვირთვა ვერ მოხერხდა, მიზეზი: %1 - - - - TransferListDelegate - - - Downloading - იტვირთება - - - - Downloading metadata - used when loading a magnet link - - - - - Allocating - qBittorrent is allocating the files on disk - - - - - Paused - დაპაუზებულია - - - - Queued - i.e. torrent is queued - რიგშია - - - - Seeding - Torrent is complete and in upload-only mode - სიდირდება - - - - Stalled - Torrent is waiting for download to begin - გაჩერებულია - - - - [F] Downloading - used when the torrent is forced started. You probably shouldn't translate the F. - - - - - [F] Seeding - used when the torrent is forced started. You probably shouldn't translate the F. - - - - - Checking - Torrent local data is being checked - მოწმდება - - - - Queued for checking - i.e. torrent is queued for hash checking - - - - - Checking resume data - used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - - - - - Completed - - - - - Moving - Torrent local data are being moved/relocated - - - - - Missing Files - - - - - Errored - torrent status, the torrent has an error - - - - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - - - - - %1 ago - e.g.: 1h 20m ago - - - - - TransferListFiltersWidget - - - Status - სტატუსი - - - - Categories - - - - - Tags - - - - - Trackers - ტრეკერები - - - - TransferListModel - - - Name - i.e: torrent name - სახელი - - - - Size - i.e: torrent size - ზომა + ტრეკერის დამატების დიალოგი - - Done - % Done - დასრულდა + + List of trackers to add (one per line): + დასამატებელი ტრეკერების სია (ერთი თითო ხაზზე): + + + + µTorrent compatible list URL: + µTorrent-თან თავსებადი სიის ბმული: - - Status - Torrent status (e.g. downloading, seeding, paused) - სტატუსი + + I/O Error + I/O შეცდომა - - Seeds - i.e. full sources (often untranslated) - სიდერები + + Error while trying to open the downloaded file. + ჩამოტვირთული ფაილის გახსნისას დაფიქსირდა შეცდომა. - - Peers - i.e. partial sources (often untranslated) - პირები + + No change + ცვლილება არ არის - - Down Speed - i.e: Download speed - ჩამოტვირთვის სიჩქარე + + No additional trackers were found. + დამატებითი ტრეკერები ვერ მოიძებნა. - - Up Speed - i.e: Upload speed - ატვირთვის სიჩქარე + + Download error + ჩამოტვირთვის შეცდომა - - Ratio - Share ratio - შეფარდება + + The trackers list could not be downloaded, reason: %1 + ტრეკერების სიის ჩამოტვირთვა ვერ მოხერხდა, მიზეზი: %1 + + + TransferListDelegate - - ETA - i.e: Estimated Time of Arrival / Time left - დარჩენილი დრო + + Downloading + იტვირთება - - Category - კატეგორია + + Downloading metadata + used when loading a magnet link + - - Tags + + Allocating + qBittorrent is allocating the files on disk - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - დამატების თარიღი + + Paused + დაპაუზებულია - - Completed On - Torrent was completed on 01/01/2010 08:00 - დასრულების თარიღი + + Queued + i.e. torrent is queued + რიგშია - - Tracker - ტრეკერი + + Seeding + Torrent is complete and in upload-only mode + სიდირდება - - Down Limit - i.e: Download limit - ჩამოტვირთვის ლიმიტი + + Stalled + Torrent is waiting for download to begin + გაჩერებულია - - Up Limit - i.e: Upload limit - ატვირთვის ლიმიტი + + [F] Downloading + used when the torrent is forced started. You probably shouldn't translate the F. + - - Downloaded - Amount of data downloaded (e.g. in MB) - ჩამოტვირთული + + [F] Seeding + used when the torrent is forced started. You probably shouldn't translate the F. + - - Uploaded - Amount of data uploaded (e.g. in MB) - ატვირთული + + Checking + Torrent local data is being checked + მოწმდება - - Session Download - Amount of data downloaded since program open (e.g. in MB) + + Queued for checking + i.e. torrent is queued for hash checking - - Session Upload - Amount of data uploaded since program open (e.g. in MB) + + Checking resume data + used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - - Remaining - Amount of data left to download (e.g. in MB) + + Completed - - Time Active - Time (duration) the torrent is active (not paused) - აქტიურობის დრო + + Missing Files + - - Save path - Torrent save path + + Errored + torrent status, the torrent has an error - - Completed - Amount of data completed (e.g. in MB) + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) - - Ratio Limit - Upload share ratio limit + + %1 ago + e.g.: 1h 20m ago + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + სტატუსი - - Last Activity - Time passed since a chunk was downloaded/uploaded + + Categories - - Total Size - i.e. Size including unwanted data - + + Trackers + ტრეკერები TransferListWidget - + Column visibility სვეტის ხილვადობა - + Choose save path აირჩიეთ შესანახი მდებარეობა - + Torrent Download Speed Limiting ტორენტის ჩამოტვირთვის სიჩქარის ლიმიტირება - + Torrent Upload Speed Limiting ტორენტის ატვირთვის სიჩქარის ლიმიტირება - + Recheck confirmation - + Are you sure you want to recheck the selected torrent(s)? - + Rename გადარქმევა - + New name: ახალი სახელი: - + Resume Resume/start the torrent გაგრძელება - + Force Resume Force Resume/start the torrent გაგრძელების იძულება - + Pause Pause the torrent დაპაუზება - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - - - + New Category - ახალი კატეგორია + ახალი კატეგორია + Category: - კატეგორია: + კატეგორია: + Invalid category name - კატეგორიის სახელი არასწორია - - - - Add Tags - - - - - Remove All Tags - - - - - Remove all tags from selected torrents? - - - - - Comma-separated tags: - - - - - Invalid tag - + კატეგორიის სახელი არასწორია - - Tag name: '%1' is invalid - + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + კატეგორიის სახელი არ უნდა შეიცავდეს '\' სიმბოლოს. +კატეგორიის სახელი არ უნდა იწყებოდეს/მთავრდებოდოს '/' სიმბოლოთი. +კატეგორიის სახელი არ უნდა შეიცავდეს '//' თანმიმდევრობას. - + Delete Delete the torrent წაშლა - + Preview file... ფაილის გადახედვა... - + Limit share ratio... გაზიარების შეფარდების ლიმიტი... - + Limit upload rate... ატვირთვის შეფარდების ლიმიტი... - + Limit download rate... ჩამოტვირთვის შეფარდების ლიმიტი... - + Open destination folder დანიშნულების საქაღალდის გახსნა - + Move up i.e. move up in the queue მაღლა ატანა - + Move down i.e. Move down in the queue დაბლა ჩატანა - + Move to top i.e. Move to top of the queue თავში გადატანა - + Move to bottom i.e. Move to bottom of the queue ბოლოში გადატანა - + Set location... მდებაროების დაყენება... - - Force reannounce - - - - + Copy name სახელის კოპირება - - Copy hash - - - - + Download first and last pieces first - + Automatic Torrent Management ტორენტის ავტომატური მართვა - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category ავტომატური რეჟიმის დროს ტორენტის რამდენიმე თვისება (მაგ. შესანახი მდებარეობა) გადაწყდება ასოცირებული კატეგორიით. - + Category კატეგორია - + New... New category... - + Reset Reset category - - Tags - - - - - Add... - Add / assign multiple tags... - - - - - Remove All - Remove all tags - - - - + Priority პრიორიტეტი - + Force recheck ხელახლა შემოწმების იძულება - + Copy magnet link მაგნიტური ბმულის კოპირება - + Super seeding mode სუპერ სიდირების რეჟიმი - + Rename... გადარქმევა... - + Download in sequential order თანმიმდევრობით ჩამოტვირთვა - UpDownRatioDialog - - - Torrent Upload/Download Ratio Limiting - ტორენტის ატვირთვა/ჩამოტვირთვის შეფარდების ლიმიტი - - - - Use global share limit - - - - - - - buttonGroup - buttonGroup - - - - Set no share limit - - - - - Set share limit to - - - - - ratio - - - - - minutes - - - - - No share limit method selected - - - - - Please select a limit method first - - - - UpDownRatioDlg + Torrent Upload/Download Ratio Limiting - ტორენტის ატვირთვა/ჩამოტვირთვის შეფარდების ლიმიტი + ტორენტის ატვირთვა/ჩამოტვირთვის შეფარდების ლიმიტი + Use global ratio limit - შეფარდების საერთო ლიმიტის გამოყენება + შეფარდების საერთო ლიმიტის გამოყენება + + + buttonGroup - buttonGroup + buttonGroup + Set no ratio limit - შეფარდების ლიმიტის გარეშე + შეფარდების ლიმიტის გარეშე + Set ratio limit to - შეფარდების ლიმიტის დაყენება - - - - Utils::ForeignApps - - - Python detected, version: %1 - - - - - Python not detected - + შეფარდების ლიმიტის დაყენება WebApplication + Incorrect category name - კატეგორიის სახელი არასწორია + კატეგორიის სახელი არასწორია + + + WebUI - - Unacceptable file type, only regular file is allowed. + + The Web UI is listening on port %1 - - Symlinks inside alternative UI folder are forbidden. + + Web UI Error - Unable to bind Web UI to port %1 + + + about - - Exceeded the maximum allowed file size (%1)! + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' + + Copyright %1 2006-2016 The qBittorrent project - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' + + Home Page: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' + + Forum: - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' + + Bug Tracker: - WebUI - - - Web UI: HTTPS setup successful - - + addPeersDialog - - Web UI: HTTPS setup failed, fallback to HTTP + + Add Peers - - Web UI: Now listening on IP: %1, port: %2 + + List of peers to add (one per line): - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 + + Format: IPv4:port / [IPv6]:port authentication + + Tracker authentication - ტრეკერის ავთენტიფიკაცია + ტრეკერის ავთენტიფიკაცია + Tracker: - ტრეკერი: + ტრეკერი: + Login - შესვლა + შესვლა + Username: - მომხმარებლის სახელი: + მომხმარებლის სახელი: + Password: - პაროლი: + პაროლი: + Log in - შესვლა + შესვლა + Cancel - გაუქმება + გაუქმება confirmDeletionDlg + Deletion confirmation - qBittorrent - წაშლაზე დასტური - qBittorrent + წაშლაზე დასტური - qBittorrent + Remember choice - არჩევნის დამახსოვრება + არჩევნის დამახსოვრება + Also delete the files on the hard disk - აგრეთვე წაიშალოს ფაილები მყარ დისკზე + აგრეთვე წაიშალოს ფაილები მყარ დისკზე + + + + confirmShutdownDlg + + + Don't show again + createTorrentDialog + Cancel - გაუქმება + გაუქმება + Torrent Creation Tool - ტორენტის შესაქმნელი ხელსაწყო + ტორენტის შესაქმნელი ხელსაწყო + Torrent file creation - ტორენტ ფაილის შექმნა + ტორენტ ფაილის შექმნა + Add file - ფაილის დამატება + ფაილის დამატება + Add folder - საქაღალდის დამატება + საქაღალდის დამატება + File or folder to add to the torrent: - ტორენტ ფაილში დასამატებელი ფაილი ან საქაღალდე: + ტორენტ ფაილში დასამატებელი ფაილი ან საქაღალდე: + Tracker URLs: - ტრეკერის ბმულები: + ტრეკერის ბმულები: + Web seeds urls: - ვებ სიდერების ბმულები: + ვებ სიდერების ბმულები: + Comment: - კომენტარი: + კომენტარი: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + + Piece size: - ნაწილის ზომა: + ნაწილის ზომა: + 16 KiB - 512 კბ {16 ?} + 512 კბ {16 ?} + 32 KiB - 32 კბ + 32 კბ + 64 KiB - 64 კბ + 64 კბ + 128 KiB - 128 კბ + 128 კბ + 256 KiB - 256 კბ + 256 კბ + 512 KiB - 512 კბ + 512 კბ + 1 MiB - 1 მბ + 1 მბ + 2 MiB - 2 მბ + 2 მბ + 4 MiB - 4 მბ + 4 მბ + 8 MiB - 4 მბ {8 ?} + 4 მბ {8 ?} + 16 MiB - 4 მბ {16 ?} + 4 მბ {16 ?} + Auto - ავტო + ავტო + Private (won't be distributed on DHT network if enabled) - პირადი (თუ ჩართავთ არ განაწილდება DHT ქსელით) + პირადი (თუ ჩართავთ არ განაწილდება DHT ქსელით) + Start seeding after creation - სიდირების დაწყება შექმნის შემდეგ + სიდირების დაწყება შექმნის შემდეგ + + + + Ignore share ratio limits for this torrent + + Create and save... - შექმნა და დამახსოვრება... + შექმნა და დამახსოვრება... + Progress: - პროგრესი: + პროგრესი: downloadFromURL + Add torrent links - ტორენტის ბმულების დამატება + ტორენტის ბმულების დამატება + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + + Download - ჩამოტვირთვა + ჩამოტვირთვა + Cancel - გაუქმება + გაუქმება + Download from urls - ჩამოტვირთვა ბმულებიდან + ჩამოტვირთვა ბმულებიდან + No URL entered - ბმული არ არის შეყვანილი + ბმული არ არის შეყვანილი + Please type at least one URL. - გთხოვთ შეიყვანეთ მინიმუმ ერთი ბმული. + გთხოვთ შეიყვანეთ მინიმუმ ერთი ბმული. + + + + errorDialog + + + Crash info + fsutils - + + + + + Downloads @@ -10754,131 +8676,140 @@ misc - + B bytes - + KiB kibibytes (1024 bytes) კბ - + MiB mebibytes (1024 kibibytes) მბ - + GiB gibibytes (1024 mibibytes) გბ - + TiB tebibytes (1024 gibibytes) ტბ - + PiB pebibytes (1024 tebibytes) - + EiB exbibytes (1024 pebibytes) - + + Python not detected + + + + + Python version: %1 + + + + /s per second - + %1h %2m e.g: 3hours 5minutes %1ს %2წთ - + %1d %2h e.g: 2days 10hours %1დ %2ს - + Unknown Unknown (size) უცნობია - + qBittorrent will shutdown the computer now because all downloads are complete. იმის გამო რომ ყველა ჩამოტვირთვა დასრულდა, ახლა qBittorrent გამორთავს კომპიტერს. - + < 1m < 1 minute < 1წთ - + %1m e.g: 10minutes %1წთ + Working - მუშაობს + მუშაობს + Updating... - ნახლდება... + ნახლდება... + Not working - არ მუშაობს + არ მუშაობს + Not contacted yet - ჯერ არ დაკავშირებულა + ჯერ არ დაკავშირებულა preview - + Preview selection არჩეულის გადახედვა - + The following files support previewing, please select one of them: + Preview - გადახედვა + გადახედვა + Cancel - გაუქმება - - - - trackerLogin - - Log in - შესვლა + გაუქმება diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_ko.ts qbittorrent-3.3.15/src/lang/qbittorrent_ko.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_ko.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_ko.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - 큐빗 토렌트에 대하여 + 큐빗토런트 정보 - + About 정보 - + Author 제작자 - - Current maintainer - 현재 관리자 - - - - Greece - 그리스 - - - - + + Nationality: 국적: - - + + + Name: + 이름: + + + + E-mail: 이메일: - - - Name: - 이름: + + Greece + 그리스 - - Original author - 원 제작자 + + Current maintainer + 현재 관리자 - - France - 프랑스 + + Original author + 원래 제작자 - + Special Thanks 특별한 감사 - + Translators 번역자 - - License - 라이선스 - - - + Libraries 라이브러리 - + qBittorrent was built with the following libraries: 큐빗토런트는 다음 라이브러리로 만들었습니다: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - Qt 툴킷과 libtorrent-rasterbar 기반의 C++로 프로그램된 향상된 비트 토렌트 클라이언트 입니다. - - - - Copyright %1 2006-2018 The qBittorrent project - 저작권 %1 2006-2018 큐빗토런트 프로젝트 - - - - Home Page: - 홈페이지: - - - - Forum: - 포럼: + + France + 프랑스 - - Bug Tracker: - 버그 트래커: + + License + 라이센스 @@ -115,57 +90,67 @@ 저장 - + + Browse... + 찾아보기... + + + + Set as default save path + 기본 저장 경로로 설정 + + + Never show again 다시 보지 않음 - + Torrent settings 토런트 설정 - + Set as default category 기본 카테고리로 설정 - + Category: 카테고리: - + Start torrent 토런트 시작 - + Torrent information 토런트 정보 - + Skip hash check 해쉬 검사 건너뛰기 - + Size: 크기: - + Hash: 해쉬: - + Comment: 코멘트: - + Date: 날짜: @@ -190,117 +175,89 @@ 자동 - - Remember last used save path - 마지막으로 사용된 저장 경로 기억 - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog 이 옵션을 사용하면, 옵션 대화상자의 "다운로드" 페이지의 설정에 관계 없이 .torrent 파일을 삭제할 것입니다 - + Do not delete .torrent file .torrent 파일 삭제하지 않기 - - Create subfolder - 하위 폴더 만들기 - - - - Download in sequential order - 차례대로 받기 - - - - Download first and last pieces first - 첫 번째와 마지막 조각을 먼저 다운로드 - - - + Normal 보통 - + High 높음 - + Maximum 최대 - + Do not download 받지 않음 - - - + + + I/O Error I/O 오류 - + Invalid torrent 무효한 토런트 - - Renaming - 이름 바꾸기 - - - - - Rename error - 이름 바꾸기 오류 + + + + + Already in download list + 이미 다운로드 목록에 있습니다 - - The name is empty or contains forbidden characters, please choose a different one. - 이 이름은 비어 있거나 금지된 문자를 포함하고 있습니다. 다른 이름을 선택하세요. - - - + Not Available This comment is unavailable 이용 불가 - + Not Available This date is unavailable 이용 불가 - + Not available 이용 불가 - + Invalid magnet link 무효한 마그넷 링크 - + The torrent file '%1' does not exist. '%1' 토런트 파일이 없습니다. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. '%1' 토런트 파일을 디스크에서 읽을 수 없습니다. 충분한 권한이 없는 것 같습니다. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ 오류: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + 토런트가 이미 다운로드 목록에 있습니다. 비공개 토런트라서 트래커를 합치지 않았습니다. + + + + Torrent is already in download list. Trackers were merged. + 다운로드 목록에 토런트가 이미 있습니다. 트래커를 합쳤습니다. + + + + + Cannot add torrent + 토런트를 추가할 수 없습니다 + + + + Cannot add this torrent. Perhaps it is already in adding state. + 이 토런트를 추가할 수 없습니다. 이미 추가 중인 상태인 것 같습니다. + + + This magnet link was not recognized 이 마그넷 링크는 인식할 수 없습니다 - + + Magnet link is already in download list. Trackers were merged. + 다운로드 목록에 마그넷 링크가 이미 있습니다. 트래커를 합쳤습니다. + + + + Cannot add this torrent. Perhaps it is already in adding. + 이 토런트를 추가 할 수 없습니다. 이미 추가 중인 것 같습니다. + + + Magnet link 마그넷 링크 - + Retrieving metadata... 메타데이터 검색하는 중... - + Not Available This size is unavailable. 이용 불가 - + Free space on disk: %1 디스크의 여유 공간: %1 - + + Choose save path 저장 경로 선택 - - - - - - - Torrent is already present - 토렌트가 이미 존재합니다 - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - 전송 목록에 '%1' 토런트가 이미 있습니다. 비공개 토런트라서 트래커를 합치지 않았습니다. - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - 전송 목록에 '%1' 토런트가 이미 있습니다. 트래커를 합쳤습니다. - - - - Torrent is already queued for processing. - Torrent는 이미 처리 대기 중입니다. + + Rename the file + 파일 이름 변경 - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - 전송 목록에 '%1' 마그넷 링크가 이미 있습니다. 트래커를 합쳤습니다. + + New name: + 새 이름: - - Magnet link is already queued for processing. - 마그넷 링크는 이미 처리 대기 중입니다. + + + The file could not be renamed + 파일 이름을 바꿀 수 없습니다 - - New name: - 새 이름: + + This file name contains forbidden characters, please choose a different one. + 이 파일 이름은 금지된 문자를 포함하고 있습니다. 다른 이름을 선택하세요. - - + + This name is already in use in this folder. Please use a different name. 이 이름은 이미 이 폴더 안에 있습니다. 다른 이름을 사용해 주세요. - + The folder could not be renamed 폴더 이름을 바꿀 수 없습니다 - + Rename... 이름 변경... - + Priority 우선순위 - + Invalid metadata 무효한 메타데이터 - + Parsing metadata... 메타데이터 분석 중... - + Metadata retrieval complete 메타데이터 검색 완료 - + Download Error 다운로드 오류 @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + 디스크 쓰기 캐쉬 크기 + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] 나가는 포트 (최소) [0: 비활성화] - + Outgoing ports (Max) [0: Disabled] 나가는 포트 (최대) [0: 비활성화] - + Recheck torrents on completion 토런트 완료시 재검사하기 - + Transfer list refresh interval 전송 목록 새로고침 간격 - + ms milliseconds 밀리초 - + Setting 설정 - + Value Value set for this setting - - - (disabled) - (비활성화됨) - - - + (auto) (자동) - - min - minutes - - - - + All addresses 모든 주소 - + qBittorrent Section 큐빗토런트 부분 - - + + Open documentation 문서 열기 - + libtorrent Section libtorrent 부분 - - Asynchronous I/O threads - 비동기 I/O 쓰레드 - - - - Disk cache - 디스크 캐쉬 - - - + s seconds - + Disk cache expiry interval 디스크 캐쉬 만료 간격 - + Enable OS cache - 운영체제의 캐쉬 사용하기 - - - - Guided read cache - 유도 읽기 캐쉬 - - - - Coalesce reads & writes - 읽기 및 쓰기 병합 + 운영체제의 캐쉬 사용 - - Send upload piece suggestions - 업로드 조각 추천 보내기 - - - - - KiB - KiB - - - - Send buffer watermark - 전송 버퍼 워터마크 - - - - Send buffer low watermark - 전송 버퍼 낮은 워터마크 - - - - Send buffer watermark factor - 전송 버퍼 워터마크 요소 - - - - Prefer TCP - TCP 우선 - - - - Peer proportional (throttles TCP) - 피어 비례 (TCP 조절) - - - - Allow multiple connections from the same IP address - 같은 IP 주소에서 다중 접속 허용하기 + + m + minutes + - + Resolve peer countries (GeoIP) 피어 국가 분석하기 (지오IP) - + Resolve peer host names 피어 호스트 이름 분석하기 - + Strict super seeding 엄격한 수퍼 시딩 - + Network Interface (requires restart) 네트워크 인터페이스 (재시작 필요) - + Optional IP Address to bind to (requires restart) 바인드할 IP 주소 (재시작 필요) - + Listen on IPv6 address (requires restart) IPv6 주소 수신 대기 (재시작 필요) - + Display notifications 알림 표시하기 - + Display notifications for added torrents 추가된 토런트의 알림 표시하기 - + Download tracker's favicon 트래커의 파비콘 다운로드하기 - - Save path history length - 저장 경로 히스토리 길이 - - - - Fixed slots - 슬롯 고정 - - - - Upload rate based - 업로드 속도 기반 - - - - Upload slots behavior - 업로드 슬롯 동작 - - - - Round-robin - 라운드 로빈 - - - - Fastest upload - 가장 빠르게 업로드 - - - - Anti-leech - Anti-leech - - - - Upload choking algorithm - 업로드 억제 알고리즘 - - - + Confirm torrent recheck 토런트 재검사 확인하기 - - Confirm removal of all tags - 모든 태그 제거 확인하기 + Exchange trackers with other peers + 다른 피어와 트래커 교환하기 - - Always announce to all trackers in a tier - 계층 내의 모든 트래커에 항상 알리기 + + Always announce to all trackers + 모든 트래커에 항상 알리기 - - Always announce to all tiers - 모든 계층에 항상 알리기 - - - + Any interface i.e. Any network interface 모든 인터페이스 - + Save resume data interval How often the fastresume file is saved. 재시작 데이터 저장 간격 - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - %1-TCP 혼합 모드 알고리즘 - - - + Maximum number of half-open connections [0: Unlimited] 절반 개방 최대 연결 수 [0: 무제한] - + IP Address to report to trackers (requires restart) 트래커에 보고할 IP 주소 (재시작 필요) - + Enable embedded tracker 내장 트래커 사용하기 - + Embedded tracker port 내장 트래커 포트 - + Check for software updates 소프트웨어 업데이트 확인하기 - + Use system icon theme 시스템 아이콘 테마 사용 @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started 큐빗토런트 %1 을 시작했습니다 - + Torrent: %1, running external program, command: %2 토런트: %1, 외부 프로그램 실행 중, 명령어: %2 - - Torrent name: %1 - 토런트 이름: %1 - - - - Torrent size: %1 - 토런트 크기: %1 - - - - Save path: %1 - 저장 경로: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - %1에 토런트를 다운로드했습니다. - - - - Thank you for using qBittorrent. - 큐빗토런트 사용에 감사드립니다. - - - - [qBittorrent] '%1' has finished downloading - [큐빗토런트] '%1' 다운로드를 완료했습니다 + + Torrent: %1, run external program command too long (length > %2), execution failed. + 토런트: %1, 외부 프로그램 실행 명령어가 너무 길어서 (길이 > %2), 실행에 실패했습니다. - + Torrent: %1, sending mail notification 토런트: %1, 메일 알림 전송 중 - + Information 정보 - - To control qBittorrent, access the Web UI at %1 - 큐빗 토렌트를 제어하려면 %1 로 웹 사용자 인터페이스에 접속하세요 + + To control qBittorrent, access the Web UI at http://localhost:%1 + 큐빗토런트를 제어하려면 http://localhost:%1의 웹 UI에 접근하세요 - + The Web UI administrator user name is: %1 웹 UI 관리자 이름: %1 - + The Web UI administrator password is still the default one: %1 웹 UI 관리자 암호가 아직 기본값입니다: %1 - + This is a security risk, please consider changing your password from program preferences. 보안 위험 요소가 있습니다. 프로그램 환경설정에서 비밀번호 변경을 고려해 주세요. - + Saving torrent progress... 토런트 진행 상황 저장 중... - - - Portable mode and explicit profile directory options are mutually exclusive - 포터블 모드와 명시적인 프로파일 폴더 옵션은 함께 사용할 수 없습니다 - - - - Portable mode implies relative fastresume - 포터블 모드는 상대적으로 빠른 재시작을 의미합니다 - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - WebAPI 로그인에 실패했습니다. 이유: IP가 금지 되었습니다, IP: %1, 사용자 이름: %2 - - - - Your IP address has been banned after too many failed authentication attempts. - 인증 과정을 여러차례 실패 했으므로 당신의 현재 IP 주소는 추방되었습니다. - - - - WebAPI login success. IP: %1 - WebAPI 로그인 성공. IP: %1 - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - WebAPI 로그인에 실패했습니다. 이유: 잘못된 자격증명, 시도 횟수: %1, IP: %2, 사용자 이름: %3 - AutomatedRssDownloader - + Save to: 저장 위치: @@ -861,817 +658,680 @@ RSS 다운로더 - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - RSS 토런트의 자동 다운로드는 현재 비활성화되었습니다! 프로그램 설정에서 활성화 할 수 있습니다. + + Enable Automated RSS Downloader + 자동화된 RSS 다운로더 활성화 - + Download Rules 다운로드 규칙 - + Rule Definition 규칙 정의 - + Use Regular Expressions 정규 표현식 사용 - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - 스마트 에피소드 필터는 에피소드 번호를 확인하여 중복 다운로드를 방지해 줍니다. -지원되는 형식: S01E01, 1x1, 2017.01.01 그리고 01.01.2017 (날짜 형식에서 구분기호인 - 도 지원합니다.) - - - - Use Smart Episode Filter - 스마트 에피소드 필터 사용하기 - - - + Must Contain: 반드시 포함: - + Must Not Contain: 반드시 비포함: - + Episode Filter: 에피소드 필터: - + Assign Category: 카테고리 할당: - + Save to a Different Directory 다른 폴더에 저장 - + Ignore Subsequent Matches for (0 to Disable) ... X days 이후의 일치는 무시 (0은 비활성화) - + Disabled - 비활성화됨 + 비활성화됨 - + days - + Add Paused: 일시정지로 추가: - + Use global settings 전역 설정 사용 - + Always 항상 - + Never 절대 안함 - + Apply Rule to Feeds: 피드에 규칙 적용: - + Matching RSS Articles 일치하는 RSS 항목 - + &Import... 가져오기... - + &Export... 내보내기... - + Matches articles based on episode filter. 에피소드 필터에 기반한한 항목 일치하기. - + Example: 예: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match 시즌 1의 2, 5, 8 ~ 15, 30과 그 이후 에피소드가 일치할 것입니다 - + Episode filter rules: 에피소드 필터 규칙: - + Season number is a mandatory non-zero value 시즌 번호의 값은 0이 아니어야 합니다 - + Episode number is a mandatory non-zero value + 에피소드 번호의 값은 0이 아니어야 합니다 + + + Filter must end with semicolon 필터는 세미콜론으로 끝나야 합니다 - + Three range types for episodes are supported: 세 가지 범위 유형의 에피소드를 지원합니다: - + Single number: <b>1x25;</b> matches episode 25 of season one 단일 번호: <b>1x25;</b> 시즌 1의 에피소드 25와 일치합니다 - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one 일반 범위: <b>1x25-40;</b> 가 시즌 1의 에피소드 25~40과 일치합니다 - - Episode number is a mandatory positive value - 에피소드 숫자는 양수 값이어야 합니다 - - - - Rules - 규칙 + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + 무한 범위: <b>1x25-;</b> 가 시즌 1의 에피소드 25 이후와 일치합니다 - - Rules (legacy) - 규칙 (레거시) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - 무한 범위: <b>1x25-;</b> 가 시즌 1의 에피소드 25 이후, 그리고 이후 시즌의 모든 에피소드와 일치합니다 + - + Last Match: %1 days ago 최근 일치: %1 하루 전 - + Last Match: Unknown 최근 일치: 알 수 없음 - + New rule name 새 규칙 이름 - + Please type the name of the new download rule. 새로운 다운로드 규칙의 이름을 입력하세요. - - + + Rule name conflict 규칙 이름 충돌 - - + + A rule with this name already exists, please choose another name. 이 이름의 규칙이 이미 있습니다. 다른 이름을 선택하세요. - + Are you sure you want to remove the download rule named '%1'? '%1" 이름의 다운로드 규칙을 제거할까요? - + Are you sure you want to remove the selected download rules? 선택한 다운로드 규칙을 제거할까요? - + Rule deletion confirmation 규칙 삭제 확인 - + Destination directory 대상 폴더 - + Invalid action 무효한 동작 - + The list is empty, there is nothing to export. 목록이 비어서 내보낼 항목이 없습니다. - - Export RSS rules - RSS 규칙 내보내기 + + Where would you like to save the list? + 어느 위치에 목록을 저장할까요? - - + + Rules list (*.rssrules) + 규칙 목록 (*.rssrules) + + + I/O Error I/O 오류 - - Failed to create the destination file. Reason: %1 - 대상 파일 생성에 실패했습니다. 이유: %1 + + Failed to create the destination file + 대상 파일 생성에 실패했습니다 - - Import RSS rules - RSS 규칙 가져오기 + + Please point to the RSS download rules file + RSS 다운로드 규칙 파일을 지정하세요 - - Failed to open the file. Reason: %1 - 해당 파일을 여는데 실패했습니다. 이유: %1 + + Rules list + 규칙 목록 - + Import Error 가져오기 오류 - - Failed to import the selected rules file. Reason: %1 - 선택한 규칙 파일을 가져오는데 실패했습니다. 규칙: %1 + + Failed to import the selected rules file + 선택한 규칙 파일을 가져오는데 실패했습니다 - + Add new rule... 새 규칙 추가... - + Delete rule 규칙 삭제 - + Rename rule... 규칙 이름 바꾸기... - + Delete selected rules 선택한 규칙 삭제 - - Clear downloaded episodes... - 다운로드된 에피소드 정리하기... - - - + Rule renaming 규칙 이름 바꾸기 - + Please type the new rule name 새로운 규칙 이름을 입력하세요 - - Clear downloaded episodes - 다운로드된 에피소드 정리하기 - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - 선택한 규칙에 대해 다운로드 된 에피소드 목록을 지우시겠습니까? - - - - Regex mode: use Perl-compatible regular expressions - 정규식 모드: Perl 호환 정규 표현식 사용 - - - - - Position %1: %2 - 위치 %1: %2 + + Regex mode: use Perl-like regular expressions + 정규식 모드: Perl과 같은 정규 표현식 사용 - + Wildcard mode: you can use - 사용 가능한 와일드카드 모드: + - + ? to match any single character - ? = 글자 하나 + - + * to match zero or more of any characters - * = 0 이상의 모든 문자열 + - + Whitespaces count as AND operators (all words, any order) - 공백 = AND 연산자 (모든 단어, 아무 순서) + - + | is used as OR operator - | = OR 연산자용 + - + If word order is important use * instead of whitespace. - 단어 순서가 중요하다면 공백 대신 * 를 사용하세요. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - 비어 있는 %1 구절이 있는 표현식(예: %2)은 + - + will match all articles. - 모든 기사와 일치할 것입니다. + - + will exclude all articles. - 모든 기사를 제외할 것입니다. - - - - BanListOptionsDialog - - - List of banned IP addresses - 금지된 IP 주소 목록 - - - - Ban IP - IP 금지 - - - - Delete - 삭제 - - - - - Warning - 경고 + - - The entered IP address is invalid. - 입력한 IP 주소는 올바르지 않습니다. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + 와일드카드 모드: <ul><li>어떤 글자 하나와 일치하려면 ?를 </li><li>0이나 그 이상의 아무 문자와 일치하려면 *를 사용할 수 있습니다</li><li>공백은 AND 연산자로 간주합니다</li></ul> - - The entered IP is already banned. - 입력한 IP 주소는 이미 금지되었습니다. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + 와일드카드 모드: <ul><li>?어떤 글자 하나와 일치하려면 ?를</li><li>0이나 그 이상의 아무 문자와 일치하려면 *를 사용할 수 있습니다</li><li>| 은 OR 연산자로 사용합니다</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support PeX 지원을 사용하거나 끄려면 재시작이 필요합니다 - - Could not get GUID of configured network interface. Binding to IP %1 - 구성된 네트워크 인터페이스의 GUID를 얻을 수 없습니다. %1 IP에 바인딩 - - - + Embedded Tracker [ON] 내장 트래커 [켜짐] - + Failed to start the embedded tracker! 내장 트래커를 시작하는데 실패했습니다! - + Embedded Tracker [OFF] 내장 트래커 [꺼짐] - + + '%1' reached the maximum ratio you set. Removing... + '%1'이 당신이 설정한 최대 비율에 도달했습니다. 제거 중... + + + + '%1' reached the maximum ratio you set. Pausing... + '%1'이 당신이 설정한 최대 비율에 도달했습니다. 일시중지 중... + + + System network status changed to %1 e.g: System network status changed to ONLINE 시스템 네트워크 상태가 %1 로 변경되었습니다. - + ONLINE 온라인 - + OFFLINE 오프라인 - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding 세션 바인딩을 새로고침하는 %1의 네트워크 설정이 변경되었습니다 - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. 설정한 네트워크 인터페이스 주소가 잘못되었습니다: %1 - - + Encryption support [%1] 암호화 지원 [%1] - - + FORCED 강제 - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1은 유효한 IP 주소가 아니고 금지된 주소 목록에 적용이 거부되었습니다. - - - - + Anonymous mode [%1] 익명 모드 [%1] - + Unable to decode '%1' torrent file. '%1' 토런트 파일을 해독할 수 없습니다. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' 토런트 '%2'에 내장된 파일 '%1'의 반복되는 다운로드 - + Queue positions were corrected in %1 resume files - %1 재시작 파일의 대기열 위치를 바로잡았습니다 + - + Couldn't save '%1.torrent' '%1.torrent' 를 저장할 수 없습니다 - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' 을 전송 목록에서 제거했습니다. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' 을 전송 목록과 하드 디스크에서 제거했습니다. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '%1' 을 전송 목록에서 제거했지만 파일을 삭제할 수 없습니다. 오류: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. - %1 이 비활성화되었기 때문입니다. + %1 이 비활성화 되었기 때문입니다. - + because %1 is disabled. this peer was blocked because TCP is disabled. - %1 이 비활성화되었기 때문입니다. + %1 이 비활성화 되었기 때문입니다. - + URL seed lookup failed for URL: '%1', message: %2 URL의 URL 시드 검색에 실패; '%1', 메시지: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. 큐빗토런트는 인터페이스 %1 포트: %2/%3 에서 수신에 실패했습니다. 이유: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' 을 전송 목록과 하드 디스크에서 제거했습니다. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' 을 전송 목록에서 제거했습니다. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... '%1' 다운로드 중, 기다리세요... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 큐빗토런트가 어떤 인터페이스 포트에서 수신 시도 중입니다: %1 - + The network interface defined is invalid: %1 정의된 네트워크 인터페이스가 무효합니다: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 큐빗토런트가 인터페이스 %1 포트: %2 에서 수신 시도 중입니다 - - Peer ID: - 피어 ID: - - - - HTTP User-Agent is '%1' - HTTP 사용자 에이전트는 '%1' 입니다 - - - - + DHT support [%1] DHT 지원 [%1] - - - - - - - - - + + + + ON 켜짐 - - - - - - - - - + + + + OFF 꺼짐 - - + Local Peer Discovery support [%1] 로컬 피어 찾기 지원 [%1] - - PeX support [%1] - PeX 지원 [%1] - - - - '%1' reached the maximum ratio you set. Removed. - '%1'이 귀하가 설정한 최대 비율에 도달했습니다. 제거됨. - - - - '%1' reached the maximum ratio you set. Paused. - '%1'이 귀하가 설정한 최대 비율에 도달했습니다. 일시중지됨. - - - - '%1' reached the maximum seeding time you set. Removed. - '%1'이 귀하가 설정한 배포 시간에 도달했습니다. 제거됨. - - - - '%1' reached the maximum seeding time you set. Paused. - '%1'이 귀하가 설정한 배포 시간에 도달했습니다. 일시중지됨. + Restart is required to toggle Tracker Exchange support + 트래커 교환하기를 사용하거나 끄려면 재시작이 필요합니다 - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on 큐빗토런트가 수신할 로컬 주소 %1 을 찾지 못했습니다 - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface 큐빗토런트가 인터페이스 포트: %1 로 수신에 실패했습니다. 이유: %2. - + Tracker '%1' was added to torrent '%2' '%2' 토런트에 '%1' 트래커를 추가했습니다 - + Tracker '%1' was deleted from torrent '%2' '%1' 트래커를 '%2' 토런트에서 삭제했습니다 - + URL seed '%1' was added to torrent '%2' '%2' 토런트에 '%1' URL 시드를 추가했습니다 - + URL seed '%1' was removed from torrent '%2' '%2' 토런트에서 '%1' URL 시드를 삭제했습니다 - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. '%1' 토런트를 재시작할 수 없습니다. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number 제공된 IP 필터를 성공적으로 분석했습니다: %1 규칙을 적용했습니다. - + Error: Failed to parse the provided IP filter. 오류: 제공된 IP 필터 분석에 실패했습니다. - - '%1' restored. - 'torrent name' restored. - '%1' 복구됨. - - - + Couldn't add torrent. Reason: %1 토런트를 추가할 수 없습니다. 이유: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' 재시작함. (빠른 재시작) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' 을 다운로드 목록에 추가했습니다. - + An I/O error occurred, '%1' paused. %2 I/O 오류가 발생해서 '%1'을 일시중지했습니다. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: 포트 매핑 실패, 메시지: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: 포트 매핑 성공, 메시지: %1 - + due to IP filter. this peer was blocked due to ip filter. IP 필터 때문에. - + due to port filter. this peer was blocked due to port filter. 포트 필터 때문에. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. i2p 혼합 모드 제한 때문에 - + because it has a low port. this peer was blocked because it has a low port. 하위 포트를 가지고 있기 때문에. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 큐빗토런트가 인터페이스 %1 포트: %2/%3 에서 성공적으로 수신 중입니다 - + External IP: %1 e.g. External IP: 192.168.0.1 외부 IP: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - 새 토런트 파일을 만들지 못했습니다 - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - 첫 번째와 마지막 조각을 먼저 내려받기: %1, 토렌트: '%2' - - - - On - 켜기 - - - - Off - 끄기 - - - - Successfully moved torrent: %1. New path: %2 - 토렌트가 성공적으로 이동 되었습니다: %1. 새 경로: %2 - - - + Could not move torrent: '%1'. Reason: %2 - 토렌트를 이동할 수 없습니다: '%1'. 원인: %2 + '%1' 토런트를 이동할 수 없습니다. 이유: %2 - + File sizes mismatch for torrent '%1', pausing it. '%1' 토런트의 파일 크기가 불일치하여, 일시중지 중입니다. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... '%1' 토런트의 빠른 재시작 데이터를 거부했습니다. 이유: %2. 재검사 중... @@ -1679,19 +1339,19 @@ CategoryFilterModel - + Categories - 카테고리 + 카테고리 - + All - 전체 + 모두 - + Uncategorized - 카테고리 없음 + @@ -1699,42 +1359,147 @@ Add category... - 카테고리 추가... + 카테고리 추가... Add subcategory... - 하위 카테고리 추가... + - Edit category... - 카테고리 편집... + Remove category + 카테고리 제거 + + + + Remove unused categories + 사용하지 않는 카테고리 제거 + + + + Resume torrents + 토런트 재시작 + + + + Pause torrents + 토런트 일시중지 + + + + Delete torrents + 토런트 삭제 + + + + New Category + 새 카테고리 + + + + Category: + 카테고리: + + + + Invalid category name + 무효한 카테고리 이름 + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + 카테고리 이름은 '\'를 포함하면 안됩니다. +카테고리 이름은 '/'로 시작/끝나면 안됩니다. +카테고리 이름은 연속된 '//'를 포함하면 안됩니다. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + 전체 (0) + + + Uncategorized (0) + 카테고리 없음 (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + 카테고리 없음 (%1) + + + Add category... + 카테고리 추가... - Remove category - 카테고리 제거 + 카테고리 제거 - Remove unused categories - 사용하지 않는 카테고리 제거 + 사용하지 않는 카테고리 제거 - Resume torrents - 토런트 재시작 + 토런트 재시작 - Pause torrents - 토런트 일시중지 + 토런트 일시중지 - Delete torrents - 토런트 삭제 + 토런트 삭제 + + + New Category + 새 카테고리 + + + Category: + 카테고리: + + + Invalid category name + 무효한 카테고리 이름 + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + 카테고리 이름은 '\'를 포함하면 안됩니다. +카테고리 이름은 '/'로 시작/끝나면 안됩니다. +카테고리 이름은 연속된 '//'를 포함하면 안됩니다. + + + All (%1) + this is for the category filter + 전체 (%1) @@ -1774,220 +1539,101 @@ - DeletionConfirmationDialog - - - Deletion confirmation - 삭제 확인 - - - - Remember choice - 선택 기억 - - - - Also delete the files on the hard disk - 하드 디스크상의 파일도 삭제하기 - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - '%1' 을 전송 목록에서 삭제할까요? + '%1' 을 전송목록에서 삭제할까요? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - 이 %1 토런트 들을 전송 목록에서 삭제할까요? - - - - DownloadFromURLDialog - - - Download from URLs - URL에서 다운로드 - - - - Add torrent links - 토런트 링크 추가 - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - 한 줄에 하나의 링크 (HTTP 링크, 마그넷 링크와 Info-hash를 지원합니다) - - - - Download - 받기 - - - - No URL entered - 입력한 URL 없음 - - - - Please type at least one URL. - 적어도 하나의 URL을 입력해주세요. + %1 토런트를 전송 목록에서 삭제할까요? DownloadedPiecesBar - + White: Missing pieces 흰색: 없는 조각 - + Green: Partial pieces 녹색: 부분 조각 - + Blue: Completed pieces 청색: 완료 조각 - ExecutionLogWidget + ExecutionLog - + General 일반 - + Blocked IPs 차단한 IP - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - <font color='red'>%1</font> 차단됨 %2 + %2 <font color='red'>%1</font> 을 차단했습니다 - + <font color='red'>%1</font> was banned x.y.z.w was banned - <font color='red'>%1</font> 추방됨 + <font color='red'>%1</font> 을 추방했습니다 FeedListWidget - + RSS feeds RSS 피드 - - - Unread (%1) - 읽지 않음 (%1) + + Unread + 읽지 않음 FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. + + An error occured while trying to open the log file. Logging to file is disabled. 로그 파일을 여는 중에 오류가 발생했습니다. 파일에 로그쓰기를 비활성화합니다. - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - 찾아보기(&B)... - - - - Choose a file - Caption for file open/save dialog - 파일 선택 - - - - Choose a folder - Caption for directory open dialog - 폴더 선택 - - - - Any file - 모든 파일 - - - FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. + + + + I/O Error: Could not open ip filter file in read mode. I/O 오류: 읽기 모드에서는 IP 필터를 열 수 없습니다. - - - - IP filter line %1 is malformed. - IP 필터의 %1번째 줄에 오류가 있습니다. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - IP 필터의 %1 줄에 오류가 있습니다. 범위의 시작 IP가 잘못되었습니다. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - IP 필터의 %1 줄에 오류가 있습니다. 범위의 끝 IP가 잘못되었습니다. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - IP 필터의 %1번째 줄에 오류가 있습니다. 하나의 IP는 IPv4이고 다른 하나는 IPv6입니다! - - - - - IP filter exception thrown for line %1. Exception is: %2 - %1번째 줄에서 IP 필터 예외가 발생했습니다. 예외: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - %1 여분의 IP 필터 파싱 오류가 발생했습니다. - - - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. 분석 오류: 필터 파일은 유효한 피어가디언 P2B 파일이 아닙니다. @@ -1995,396 +1641,472 @@ GeoIPDatabase - - + + Unsupported database file size. 미지원 데이터베이스 파일 크기. - + Metadata error: '%1' entry not found. 메타데이터 오류: '%1' 항목을 찾을 수 없습니다. - + Metadata error: '%1' entry has invalid type. 메타데이터 오류: '%1' 항목에 무효한 형식이 있습니다. - + Unsupported database version: %1.%2 미지원 데이터베이스 버전: %1.%2 - + Unsupported IP version: %1 미지원 IP 버전: %1 - + Unsupported record size: %1 미지원 레코드 크기: %1 - + Invalid database type: %1 무효한 데이터베이스 형식: %1 - + Database corrupted: no data section found. 손상된 데이터베이스: 데이터 섹션이 없습니다. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - HTTP 요청 크기가 한계를 초과합니다. 소켓을 닫습니다. 한계: %ld, IP: %s + + File + 파일 - - Bad Http request, closing socket. IP: %s - 잘못된 Http 요청, 소켓을 닫습니다. IP: %s + + Edit + 편집 - - - HttpServer - + + Help + 도움말 + + + Exit qBittorrent 큐빗토런트 종료 - + Only one link per line 한 줄에 링크 한개씩 - + + Download + 다운로드 + + + Global upload rate limit must be greater than 0 or disabled. 전역 업로드 비율 제한은 0보다 높거나 비활성화되어야 합니다. - + Global download rate limit must be greater than 0 or disabled. 전역 다운로드 비율 제한은 0보다 높거나 비활성화되어야 합니다. - + Alternative upload rate limit must be greater than 0 or disabled. - 대체 업로드 비율 제한은 0보다 높거나 비활성화되어야 합니다. + 대체 올리기 비율 제한은 0보다 높거나 비활성화되어야 합니다. - + Alternative download rate limit must be greater than 0 or disabled. 대체 다운로드 비율 제한은 0보다 크거나 비활성화해야 합니다. - + Maximum active downloads must be greater than -1. 최대 활성 다운로드는 -1보다 커야 합니다. - + Maximum active uploads must be greater than -1. 최대 활성 업로드는 -1보다 커야 합니다. - + Maximum active torrents must be greater than -1. 최대 활성 토런트는 -1보다 커야 합니다. - + Maximum number of connections limit must be greater than 0 or disabled. 최대 연결 제한 수는 0보다 높거나 비활성화되어야 합니다. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. 토런트당 최대 연결 제한 수는 0보다 높거나 비활성화되어야 합니다. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. 토런트당 최대 업로드 슬롯 제한 수는 0보다 높거나 비활성화되어야 합니다. - + Unable to save program preferences, qBittorrent is probably unreachable. 프로그램 환경설정을 저장할 수 없습니다. 큐빗토런트에 접근이 불가능한 상태인 것 같습니다. - - IRC: #qbittorrent on Freenode - IRC: Freenode의 #qbittorrent 채널 - - - - Invalid category name: -Please do not use any special characters in the category name. - 무효한 카테고리 이름: -카테고리 설정시 특수 문자를 사용하지 마십시오. - - - - Unknown - 알 수 없음 - - - - Hard Disk - 하드 디스크 - - - - Share ratio limit must be between 0 and 9998. - 공유 비율 제한은 반드시 0에서 9998 사이여야 합니다. - - - - Seeding time limit must be between 0 and 525600 minutes. - 배포 시간 제한은 반드시 0에서 525600분 사이여야 합니다. + + Language + 언어 - + The port used for incoming connections must be between 1 and 65535. 들어오는 연결에 사용하는 포트는 1 ~ 65535 사이여야 합니다. - + The port used for the Web UI must be between 1 and 65535. 웹 UI에 사용하는 포트는 1 ~ 65535 사이여야 합니다. - + Unable to log in, qBittorrent is probably unreachable. 로그인 할 수 없습니다. 큐빗토런트에 접근할 수 없는 것 같습니다. - + Invalid Username or Password. 무효한 사용자명/비밀번호입니다. - - Username - 사용자명 - - - + Password 비밀번호 - + Login 로그인 - + + Upload Failed! + 업로드 실패! + + + Original authors 원래 제작자 - + + Upload limit: + 업로드 제한: + + + + Download limit: + 다운로드 제한: + + + Apply 적용 - + Add 추가 - + + Category: + 카테고리: + + + Upload Torrents Upload torrent files to qBittorent using WebUI 토런트 업로드 - + + All + 모두 + + + + Downloading + 받는 중 + + + + Seeding + 배포 중 + + + + Completed + 완료됨 + + + + Resumed + 재시작됨 + + + + Paused + 일시중지됨 + + + + Active + 활성 + + + + Inactive + 비활성 + + + Save files to location: 파일 저장 위치: - + Cookie: 쿠키: - + Type folder here 여기에 폴더 입력 - + + Run an external program on torrent completion + 다운로드 완료시 외부 프로그램 실행 + + + + Enable bandwidth management (uTP) + 대역폭 관리 활성화 (uTP) + + + + Apply rate limit to uTP connections + uTP 접속에 비율 제한 적용 + + + + Alternative Global Rate Limits + 대체 전역 속도 제한 + + + More information 추가 정보 - + Information about certificates 인증 정보 - + Save Files to 파일 저장: - - Set location - 설정 위치 - - - - Limit upload rate - 업로드 속도 제한 + + Watch Folder + 감시 폴더 - - Limit download rate - 다운로드 속도 제한 + + Default Folder + 기본 폴더 - - Rename torrent - 토런트 이름 변경 + + from + from time1 to time2 + 다음에서: - - Unable to create category - + + to + from time1 to time2 + 다음까지: - + Other... Save Files to: Watch Folder / Default Folder / Other... 기타... - + + Every day + Schedule the use of alternative rate limits on ... + 매일 + + + + Week days + Schedule the use of alternative rate limits on ... + 평일 + + + + Week ends + Schedule the use of alternative rate limits on ... + 주말 + + + Monday Schedule the use of alternative rate limits on ... 월요일 - + Tuesday Schedule the use of alternative rate limits on ... 화요일 - + Wednesday Schedule the use of alternative rate limits on ... 수요일 - + Thursday Schedule the use of alternative rate limits on ... 목요일 - + Friday Schedule the use of alternative rate limits on ... 금요일 - + Saturday Schedule the use of alternative rate limits on ... 토요일 - + Sunday Schedule the use of alternative rate limits on ... 일요일 - + + Downloaded + Is the file downloaded or not? + 다운로드 완료 + + + Logout 로그아웃 - + + Download from URLs + URL에서 다운로드 + + + Download Torrents from their URLs or Magnet links URL이나 마그넷 링크에서 토런트 다운로드 - + Upload local torrent 로컬 토런트 업로드 - + Are you sure you want to delete the selected torrents from the transfer list? 전송 목록에서 선택한 토런트를 삭제할까요? - + Save 저장 - + qBittorrent client is not reachable 큐빗토런트 클라이언트에 접근할 수 없습니다 - - qBittorrent has been shutdown. - 큐빗토런트를 종료했습니다. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - 허용된 IP 서브넷 목록 + + HTTP Server + HTTP 서버 - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - 예: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + 다음 매개변수를 지원합니다: - - Add subnet - 서브넷 추가 + + Torrent path + 토런트 경로 - - Delete - 삭제 + + Torrent name + 토런트 이름 - - Error - 오류 + + qBittorrent has been shutdown. + 큐빗토런트를 종료했습니다. + + + LineEdit - - The entered subnet is invalid. - 입력한 서브넷은 무효합니다. + + Clear the text + 텍스트 지우기 LogListWidget - + Copy 복사 - + Clear 지우기 @@ -2417,551 +2139,493 @@ 다운로드 완료시(&D) - + &View 보기(&V) - + &Options... 옵션(&O)... - + &Resume 재시작(&R) - + Torrent &Creator 토런트 생성기(&C) - + Set Upload Limit... 업로드 제한 설정... - + Set Download Limit... 다운로드 제한 설정... - + Set Global Download Limit... 전역 다운로드 제한 설정... - + Set Global Upload Limit... 전역 업로드 제한 설정... - + Minimum Priority - 최저 우선 순위 + 최소 우선 순위 - + Top Priority 최고 우선 순위 - + Decrease Priority 우선 순위 낮추기 - + Increase Priority 우선 순위 높이기 - - + + Alternative Speed Limits 대체 속도 제한 - + &Top Toolbar 상단 도구바(&T) - + Display Top Toolbar 상단에 도구바 표시 - - Status &Bar - 상태 표시줄(&B) - - - + S&peed in Title Bar 제목 표시줄에 속도(&P) - + Show Transfer Speed in Title Bar 제목 표시줄에 전송 속도 표시 - + &RSS Reader RSS 리더(&R) - + Search &Engine 검색 엔진(&E) - + L&ock qBittorrent 큐빗토런트 잠금(&O) - + Do&nate! 기부(&N) - - Close Window - 창 닫기 - - - + R&esume All 모두 재시작(&E) - + Manage Cookies... 쿠키 관리... - + Manage stored network cookies 저장된 네트워크 쿠키 관리 - + Normal Messages 보통 메시지 - + Information Messages 정보 메시지 - + Warning Messages 경고 메시지 - + Critical Messages 중요 메시지 - + &Log 로그(&L) - + &Exit qBittorrent 큐빗토런트 종료(&E) - + &Suspend System 시스템 절전(&S) - + &Hibernate System 시스템 최대 절전(&H) - + S&hutdown System 시스템 종료(&H) - + &Disabled 비활성화(&D) - + &Statistics 통계(&S) - + Check for Updates 업데이트 확인 - + Check for Program Updates 프로그램 업데이트 확인 - + &About 정보(&A) - + &Pause 일시중지(&P) - + &Delete 삭제(&D) - + P&ause All 모두 일시중지(&A) - + &Add Torrent File... 토런트 파일 추가(&A)... - + Open 열기 - + E&xit 종료(&X) - + Open URL URL 열기 - + &Documentation 문서(&D) - + Lock 잠금 - - - + + + Show 표시 - + Check for program updates 프로그램 업데이트 확인 - + Add Torrent &Link... 토런트 링크 추가(&L)... - + If you like qBittorrent, please donate! 큐빗토런트가 마음에 들면 기부해 주세요! - - + Execution Log 실행 기록 - + Clear the password 비밀번호 지우기 - + Filter torrent list... 토런트 목록 필터하기... - + &Set Password 비밀번호 설정(&S) - - Preferences - 환경설정 - - - + &Clear Password 비밀번호 지우기(&C) - + Transfers 전송 - - - qBittorrent is minimized to tray - 큐빗 토렌트를 최소화하여 시작 - - - - - - This behavior can be changed in the settings. You won't be reminded again. - 이 동작은 설정에서 변경할 수 있습니다. 다시 알리지 않습니다. - - - + Torrent file association 토런트 파일 연결 - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? 큐빗토런트는 토런트 파일과 마그넷 링크의 기본 프로그램이 아닙니다. -큐빗토런트를 토런트 파일과 마그넷 링크에 연결할까요? +큐빗토런트를 토런트 파일과 마그렛 링크에 연결할까요? - + Icons Only 아이콘만 - + Text Only 텍스트만 - + Text Alongside Icons 아이콘 옆에 텍스트 - + Text Under Icons 아이콘 아래 텍스트 - + Follow System Style 시스템 스타일을 따름 - - - + + + UI lock password UI 잠금 비밀번호 - - - + + + Please type the UI lock password: UI 잠금 비밀번호를 입력하세요: - + The password should contain at least 3 characters 비밀번호는 최소 세 문자 이상이어야 합니다 - + Password update 비밀번호 업데이트 - + The UI lock password has been successfully updated UI 잠금 비밀번호를 성공적으로 업데이트했습니다 - + Are you sure you want to clear the password? 비밀번호를 지울까요? - - Use regular expressions - 정규 표현식 사용 - - - + Search 검색 - + Transfers (%1) 전송 (%1) - + Error 오류 - + Failed to add torrent: %1 토런트 추가 실패: %1 - + Torrent added 추가한 토런트 - + '%1' was added. e.g: xxx.avi was added. '%1'을 추가했습니다. - + Download completion 다운로드 완료 - + I/O Error i.e: Input/Output Error I/O 오류 - + Recursive download confirmation 토런트 내의 토런트 다운로드 확인 - + Yes - + No 아니오 - + Never 절대 안함 - + Global Upload Speed Limit 전역 업로드 속도 제한 - + Global Download Speed Limit 전역 다운로드 속도 제한 - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - 큐빗토런트를 방금 업데이트했으며 변경사항을 적용하려면 프로그램을 재시작해야 합니다. - - - - qBittorrent is closed to tray - 큐빗 토렌트가 트레이로 닫힙니다 - - - - Some files are currently transferring. - 파일이 현재 전송 중입니다. - - - - Are you sure you want to quit qBittorrent? - 큐빗토런트를 종료할까요? - - - + &No 아니오(&N) - + &Yes 예(&Y) - + &Always Yes 항상 예(&A) - - %1/s - s is a shorthand for seconds - %1/초 - - - - Couldn't determine your Python version. Search engine disabled. - 파이썬 버전을 확인할 수 없습니다. 검색 엔진을 사용할 수 없습니다. - - - + Old Python Interpreter 오래된 파이썬 해석기 - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - 파이썬 버전(%1)이 오래 되었습니다. 검색 엔진이 작동하도록 하려면 최신 버전으로 업그레이드하세요. -최소 요구 사항: 2.7.9 / 3.3.0. + 파이썬 버전(%1)이 오래 되었습니다. 검색 엔진이 작동하게 하려면 최신 버전으로 업그레이드하세요. +최소 요구 사항: 2.7.0 / 3.3.0. - + qBittorrent Update Available 큐빗토런트의 새로운 버전이 나왔습니다 - + + A new version is available. +Do you want to download %1? + 새로운 버전이 있습니다. +%1을 다운로드할까요? + + + Already Using the Latest qBittorrent Version 이미 최신 버전의 큐빗토런트 사용 중 - + Undetermined Python version 알 수 없는 파이썬 버전 - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. '%1' 의 다운로드가 끝났습니다. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2970,158 +2634,154 @@ 이유: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? - '%1' 토런트에 .torrent 파일이 있습니다. 포함된 토런트 파일로 다운로드를 시작할까요? + '%1' 토런트에 .torrent 파일이 있습니다. 포함된 토런트 파일로 다운로드를 진행할까요? - + Couldn't download file at URL '%1', reason: %2. '%1' 주소에서 파일을 다운로드할 수 없습니다, 이유: %2 - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin %1에서 파이썬 발견: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + 파이썬 버전(% 1)을 확인할 수 없습니다. 검색 엔진을 비활성화합니다. + + + + Missing Python Interpreter 파이썬 해석기가 없습니다 - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? 파이썬은 검색 엔진을 사용하는 데 필요하지만 설치가 안된 것 같습니다. 지금 설치할까요? - + Python is required to use the search engine but it does not seem to be installed. 파이썬은 검색 엔진을 사용하는 데 필요하지만 설치가 안된 것 같습니다. - - A new version is available. - 새로운 버전이 있습니다. - - - - Do you want to download %1? - %1을 다운로드할까요? - - - - Open changelog... - 변경 기록 열기 ... - - - + No updates available. You are already using the latest version. 새로운 버전이 없습니다. 이미 새로운 버전을 사용 중입니다. - + &Check for Updates 업데이트 확인(&C) - + Checking for Updates... 업데이트 확인 중... - + Already checking for program updates in the background 이미 프로그램 업데이트를 백그라운드로 확인중입니다 - + Python found in '%1' '%1' 에서 파이썬 발견 - + Download error 다운로드 오류 - + Python setup could not be downloaded, reason: %1. Please install it manually. 파이썬 설치 파일을 다운로드할 수 없습니다, 이유: %1. 수동으로 설치하세요. - - + + Invalid password 무효한 비밀번호 - - - + + RSS (%1) RSS (%1) - + URL download error URL 다운로드 오류 - + The password is invalid - 비밀번호가 올바르지 않습니다 + 비밀번호가 무효합니다 - - + + DL speed: %1 e.g: Download speed: 10 KiB/s 다운 속도: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s 업 속도: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [D: %1, U: %2] 큐빗토런트 %3 - + Hide 숨김 - + Exiting qBittorrent 큐빗토런트 종료 중 - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + 현재 전송 중인 파일이 있습니다. +큐빗토런트를 종료할까요? + + + Open Torrent Files 토런트 파일 열기 - + Torrent Files 토런트 파일 - + Options were saved successfully. 옵션을 성공적으로 저장했습니다. @@ -3129,52 +2789,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. - 귀하의 동적 DNS를 성공적으로 업데이트했습니다. + 당신의 동적 DNS를 성공적으로 업데이트했습니다. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. 동적 DNS 오류: 서비스가 잠시 불가능합니다. 30분 후에 재시도할 것입니다. - + Dynamic DNS error: hostname supplied does not exist under specified account. 동적 DNS 오류: 제공받은 호스트명이 지정한 계정에 존재하지 않습니다. - + Dynamic DNS error: Invalid username/password. 동적 DNS 오류: 무효한 사용자명/비밀번호입니다. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. 동적 DNS 오류: 이 서비스는 큐빗토런트를 블랙리스트에 등록했습니다. http://bugs.qbittorrent.org에 버그를 신고해 주세요. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. 동적 DNS 오류: 서비스는 %1를 반환했습니다. http://bugs.qbittorrent.org에 버그를 신고하세요. - + Dynamic DNS error: Your username was blocked due to abuse. - 동적 DNS 오류: 오남용 때문에 귀하의 사용자명을 차단했습니다. + 동적 DNS 오류: 오남용 때문에 당신의 사용자명을 차단했습니다. - + Dynamic DNS error: supplied domain name is invalid. 동적 DNS 오류: 제공받은 도메인 이름이 무효합니다. - + Dynamic DNS error: supplied username is too short. 동적 DNS 오류: 제공받은 사용자명이 너무 짧습니다. - + Dynamic DNS error: supplied password is too short. 동적 DNS 오류: 제공받은 비밀번호가 너무 짧습니다. @@ -3182,1413 +2842,1303 @@ Net::DownloadHandler - + I/O Error I/O 오류 - + The file size is %1. It exceeds the download limit of %2. - 파일 크기는 %1 입니다. 다운로드 제한 %2를 초과했습니다. + 파일 크기는 %1 입니다. 다운로드 제한 2%를 초과했습니다. - + Unexpected redirect to magnet URI. 마그넷 URI로 예상지 않은 전송. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - 원격 호스트명을 찾을 수 없습니다 (잘못된 호스트명) + + + GeoIP database loaded. Type: %1. Build time: %2. + 지오IP 데이터베이스를 불러왔습니다. 형식: 1%. 구축 시간: %2. - - The operation was canceled - 작업을 취소했습니다 + + + Couldn't load GeoIP database. Reason: %1 + 지오IP 데이터베이스를 불러올 수 없습니다. 이유: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - 원격 서버로부터 회신을 다 받기 전에 연결이 닫혔습니다 + + Venezuela, Bolivarian Republic of + 베네수엘라 볼리바르 공화국 - - The connection to the remote server timed out - 원격 서버 연결 시간이 초과되었습니다 + + Viet Nam + 베트남 - - SSL/TLS handshake failed - SSL/TLS 핸드쉐이크에 실패했습니다 + + + N/A + 이용 불가 - - The remote server refused the connection - 원격 서버가 연결을 거부했습니다 + + Andorra + 안도라 - - The connection to the proxy server was refused - 프록시 서버가 연결을 거부했습니다 + + United Arab Emirates + 아랍에미리트 - - The proxy server closed the connection prematurely - 프록시 서버가 접속을 너무 빨리 닫았습니다 + + Afghanistan + 아프가니스탄 - - The proxy host name was not found - 프록시 호스트 이름을 찾을 수 없습니다 + + Antigua and Barbuda + 앤티가 바부다 - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - 프록시 연결 시간이 초과되었거나 프록시가 전송한 요청에 맞춰 응답하지 않습니다 - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - 프록시는 요청을 이행하기 위해 인증이 필요하지만 제공하는 어떠한 자격증명도 수락하지 않았습니다 - - - - The access to the remote content was denied (401) - 원격 컨텐츠 접속이 거부되었습니다 (401) - - - - The operation requested on the remote content is not permitted - 원격 컨텐츠에 요청한 작업은 허용되지 않습니다 - - - - The remote content was not found at the server (404) - 원격 컨텐츠를 서버에서 찾을 수 없습니다 (404) - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - 원격 서버의 컨텐츠에 접근하려면 인증이 필요하지만 제공된 자격증명은 승인되지 않았습니다 - - - - The Network Access API cannot honor the request because the protocol is not known - 프로토콜을 알 수 없기 때문에 네트워크 접근 API는 요청을 이행할 수 없습니다 - - - - The requested operation is invalid for this protocol - 요청한 동작은 이 프로토콜에 대해 무효합니다. - - - - An unknown network-related error was detected - 알 수 없는 네트워크 관련 오류를 감지했습니다 - - - - An unknown proxy-related error was detected - 알 수 없는 프록시 관련 오류를 감지했습니다 - - - - An unknown error related to the remote content was detected - 원격 컨텐츠와 관련된 알 수 없는 오류를 감지했습니다 - - - - A breakdown in protocol was detected - 프로토콜 손상을 감지했습니다 - - - - Unknown error - 알 수 없는 오류 - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - 지오IP 데이터베이스를 불러왔습니다. 형식: %1. 구축 시간: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - 지오IP 데이터베이스를 불러올 수 없습니다. 이유: %1 - - - - Venezuela, Bolivarian Republic of - 베네수엘라 볼리바르 공화국 - - - - Viet Nam - 베트남 - - - - - N/A - 이용 불가 - - - - Andorra - 안도라 - - - - United Arab Emirates - 아랍에미리트 - - - - Afghanistan - 아프가니스탄 + + Anguilla + 앵귈라 - Antigua and Barbuda - 앤티가 바부다 - - - - Anguilla - 앵귈라 - - - Albania 알바니아 - + Armenia 아르메니아 - + Angola 앙고라 - + Antarctica 남극 - + Argentina 아르헨티나 - + American Samoa 아메리칸 사모아 - + Austria 오스트리아 - + Australia 오스트레일리아 - + Aruba 아루바 - + Azerbaijan 아제르바이잔 - + Bosnia and Herzegovina 보스니아 헤르체고비나 - + Barbados 바베이도스 - + Bangladesh 방글라데시 - + Belgium 벨기에 - + Burkina Faso 부르키나파소 - + Bulgaria 불가리아 - + Bahrain 바레인 - + Burundi 부룬디 - + Benin 베냉 - + Bermuda 버뮤다 - + Brunei Darussalam 브루나이 - + Brazil 브라질 - + Bahamas 바하마 - + Bhutan 부탄 - + Bouvet Island 부베 섬 - + Botswana 보츠와나 - + Belarus 벨라루스 - + Belize 벨리즈 - + Canada 캐나다 - + Cocos (Keeling) Islands 코코스 제도 - + Congo, The Democratic Republic of the 콩고 민주 공화국 - + Central African Republic 중앙아프리카 공화국 - + Congo 콩고 - + Switzerland 스위스 - + Cook Islands 쿡 제도 - + Chile 칠레 - + Cameroon 카메룬 - + China 중국 - + Colombia 콜롬비아 - + Costa Rica 코스타리카 - + Cuba 쿠바 - + Cape Verde 카보베르데 - + Curacao 퀴라소 - + Christmas Island 크리스마스 섬 - + Cyprus 키프로스 - + Czech Republic 체코 - + Germany 독일 - + Djibouti 지부티 - + Denmark 덴마크 - + Dominica 도미니카 연방 - + Dominican Republic 도미니카 공화국 - + Algeria 알제리 - + Ecuador 에콰도르 - + Estonia 에스토니아 - + Egypt 이집트 - + Western Sahara 서사하라 - + Eritrea 에리트레아 - + Spain 스페인 - + Ethiopia 에티오피아 - + Finland 핀란드 - + Fiji 피지 - + Falkland Islands (Malvinas) 포클랜드 제도 (말비나스 군도) - + Micronesia, Federated States of 미크로네시아 연방 - + Faroe Islands 페로 제도 - + France 프랑스 - + Gabon 가봉 - + United Kingdom 영국 - + Grenada 그레나다 - + Georgia 조지아 - + French Guiana 프랑스령 기아나 - + Ghana 가나 - + Gibraltar 지브롤터 - + Greenland 그린란드 - + Gambia 감비아 - + Guinea 기니 - + Guadeloupe 과들루프 - + Equatorial Guinea 적도 기니 - + Greece 그리스 - + South Georgia and the South Sandwich Islands 사우스조지아 사우스샌드위치 제도 - + Guatemala 과테말라 - + Guam - + Guinea-Bissau 기니비사우 - + Guyana 가이아나 - + Hong Kong 홍콩 - + Heard Island and McDonald Islands 허드 맥도널드 제도 - + Honduras 온두라스 - + Croatia 크로아티아 - + Haiti 아이티 - + Hungary 헝가리 - + Indonesia 인도네시아 - + Ireland 아일랜드 섬 - + Israel 이스라엘 - + India 인도 - + British Indian Ocean Territory 영국령 인도양 지역 - + Iraq 이라크 - + Iran, Islamic Republic of 이란 - + Iceland 아이슬란드 - + Italy 이탈리아 - + Jamaica 자메이카 - + Jordan 요르단 - + Japan 일본 - + Kenya 케냐 - + Kyrgyzstan 키르기스스탄 - + Cambodia 캄보디아 - + Kiribati 키리바시 - + Comoros 코모로 - + Saint Kitts and Nevis 세인트키츠 네비스 - + Korea, Democratic People's Republic of 북한 - + Korea, Republic of 대한민국 - + Kuwait 쿠웨이트 - + Cayman Islands 케이맨 제도 - + Kazakhstan 카자흐스탄 - + Lao People's Democratic Republic 라오스 - + Lebanon 레바논 - + Saint Lucia 세인트루시아 - + Liechtenstein 리히텐슈타인 - + Sri Lanka 스리랑카 - + Liberia 라이베리아 - + Lesotho 레소토 - + Lithuania 리투아니아 - + Luxembourg 룩셈부르크 - + Latvia 라트비아 - + Morocco 모로코 - + Monaco 모나코 - + Moldova, Republic of 몰도바 - + Madagascar 마다가스카르 - + Marshall Islands 마셜 제도 - + Mali 말리 - + Myanmar 미얀마 - + Mongolia 몽골 - + Northern Mariana Islands 북마리아나 제도 - + Martinique 마르티니크 - + Mauritania 모리타니 - + Montserrat 몬세라트 - + Malta 몰타 - + Mauritius 모리셔스 - + Maldives 몰디브 - + Malawi 말라위 - + Mexico 멕시코 - + Malaysia 말레이시아 - + Mozambique 모잠비크 - + Namibia 나미비아 - + New Caledonia 누벨칼레도니 - + Niger 니제르 - + Norfolk Island 노퍽 섬 - + Nigeria 나이지리아 - + Nicaragua 니카라과 - + Netherlands 네덜란드 - + Norway 노르웨이 - + Nepal 네팔 - + Nauru 나우루 - + Niue 니우에 - + New Zealand 뉴질랜드 - + Oman 오만 - + Panama 파나마 - + Peru 페루 - + French Polynesia 프랑스령 폴리네시아 - + Papua New Guinea 파푸아 뉴기니 - + Philippines 필리핀 - + Pakistan 파키스탄 - + Poland 폴란드 - + Saint Pierre and Miquelon 생피에르 미클롱 - + Puerto Rico 푸에르토리코 - + Portugal 포르투갈 - + Palau 팔라우 - + Paraguay 파라과이 - + Qatar 카타르 - + Reunion 레위니옹 - + Romania 루마니아 - + Russian Federation 러시아 - + Rwanda 르완다 - + Saudi Arabia 사우디아라비아 - + Solomon Islands 솔로몬 제도 - + Seychelles 세이셸 - + Sudan 수단 - + Sweden 스웨덴 - + Singapore 싱가포르 - + Slovenia 슬로베니아 - + Svalbard and Jan Mayen 스발바르 얀마옌 제도 - + Slovakia 슬로바키아 - + Sierra Leone 시에라리온 - + San Marino 산마리노 - + Senegal 세네갈 - + Somalia 소말리아 - + Suriname 수리남 - + Sao Tome and Principe 상투메 프린시페 - + El Salvador 엘살바도르 - + Syrian Arab Republic 시리아 - + Swaziland 스와질란드 - + Turks and Caicos Islands 터크스 케이커스 제도 - + Chad 차드 - + French Southern Territories 프랑스령 남방 및 남극 - + Togo 토고 - + Thailand 태국 - + Tajikistan 타지키스탄 - + Tokelau 토켈라우 - + Turkmenistan 투르크메니스탄 - + Tunisia 튀니지 - + Tonga 통가 - - Could not decompress GeoIP database file. - 지오IP 데이터베이스 파일의 압축을 풀 수 없습니다. - - - + Timor-Leste 동티모르 - + Bolivia, Plurinational State of 볼리비아 다민족 공화국 - + Bonaire, Sint Eustatius and Saba 보네르, 신트외스타티위스와 사바 섬 - + Cote d'Ivoire 코트디부아르 - + Libya 리비아 - + Saint Martin (French part) 세인트 마틴 섬 (프랑스령) - + Macedonia, The Former Yugoslav Republic of 마케도니아, 구 유고슬라이바 공화국 - + Macao 마카오 - + Pitcairn 핏케언 섬 - + Palestine, State of 팔레스타인 국가 - + Saint Helena, Ascension and Tristan da Cunha 세인트 헬레나 어센션 트리스탄다쿠냐 - + South Sudan 남수단 - + Sint Maarten (Dutch part) 신트 마르턴 (네덜란드령) - + Turkey 터키 - + Trinidad and Tobago 트리니다드 토바고 - + Tuvalu 투발루 - + Taiwan 대만 - + Tanzania, United Republic of 탄자니아 - + Ukraine 우크라이나 - + Uganda 우간다 - + United States Minor Outlying Islands 미국령 군소 제도 - + United States 미국 - + Uruguay 우루과이 - + Uzbekistan 우즈베키스탄 - + Holy See (Vatican City State) 교황청 (바티칸) - + Saint Vincent and the Grenadines 세인트빈센트 그레나딘 - + Virgin Islands, British 영국령 버진아일랜드 - + Virgin Islands, U.S. 미국령 버진아일랜드 - + Vanuatu 바누아투 - + Wallis and Futuna 왈리스 퓌튀나 - + Samoa 사모아 - + Yemen 예멘 - + Mayotte 마요트 - + Serbia 세르비아 - + South Africa 남아프리카 공화국 - + Zambia 잠비아 - + Montenegro 몬테네그로 - + Zimbabwe 짐바브웨 - + Aland Islands 올란드 제도 - + Guernsey 건지 섬 - + Isle of Man 맨 섬 - + Jersey 저지 섬 - + Saint Barthelemy 생바르텔레미 - + + Could not uncompress GeoIP database file. + 지오IP 데이터베이스 파일의 압축을 풀 수 없습니다. + + + Couldn't save downloaded GeoIP database file. 다운로드한 지오IP 데이터베이스 파일을 저장할 수 없습니다. - + Successfully updated GeoIP database. 지오IP 데이터베이스를 성공적으로 업데이트했습니다. - + Couldn't download GeoIP database file. Reason: %1 지오IP 데이터베이스 파일을 다운로드할 수 없습니다. 이유: %1 @@ -4596,12 +4146,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] UPnP / NAT-PMP 지원 [켜짐] - + UPnP / NAT-PMP support [OFF] UPnP / NAT-PMP 지원 [꺼짐] @@ -4609,7 +4159,7 @@ Net::Smtp - + Email Notification Error: 이메일 알림 오류: @@ -4617,1279 +4167,1077 @@ OptionsDialog - + Options 옵션 - + Behavior 동작 - + Downloads 다운로드 - + Connection 연결 - + Speed 속도 - + BitTorrent 비트토런트 - - RSS - RSS - - - + Web UI 웹 UI - + Advanced 고급 - + Language 언어 - + User Interface Language: 사용자 인터페이스 언어: - + (Requires restart) (재시작 필요) - + Transfer List 전송 목록 - + Confirm when deleting torrents 토런트 삭제시 확인하기 - + Use alternating row colors In transfer list, one every two rows will have grey background. 가로줄 색 번갈아 사용하기 - + Hide zero and infinity values 0과 무한한 값 숨기기 - + Always 항상 - + Paused torrents only 일시중지한 토런트만 - + Action on double-click 더블 클릭 동작 - + Downloading torrents: 다운로드 중인 토런트: - - + + Start / Stop Torrent 토런트 시작/정지하기 - - + + Open destination folder 대상 폴더 열기 - - + + No action 동작 없음 - + Completed torrents: 완료된 토런트: - + Desktop 바탕화면 - + Start qBittorrent on Windows start up 윈도우 시작시 큐빗토런트 시작하기 - + Show splash screen on start up 시작시 스플래시 화면 보기 - + Start qBittorrent minimized 시작시 큐빗토런트 최소화하기 - + Confirmation on exit when torrents are active 토런트가 작동 중이면 종료할 때 확인하기 - + Confirmation on auto-exit when downloads finish 다운로드가 끝났을 때 자동 종료시 확인하기 - - KiB - KiB - - - - Email notification &upon download completion - 다운로드 완료시 이메일로 알리기 - - - - Run e&xternal program on torrent completion - 토런트 완료시 외부 프로그램 실행하기 - - - - IP Fi&ltering - IP 필터링(&l) - - - - Schedule &the use of alternative rate limits - 대체 속도 제한 사용 일정 계획 - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">추가 정보</a>) - - - - &Torrent Queueing - 토런트 대기열 - - - - Seed torrents until their seeding time reaches - 토런트 배포 시간이 - - - - A&utomatically add these trackers to new downloads: - 다음 트래커를 새 다운로드에 자동으로 추가: - - - - RSS Reader - RSS 리더 - - - - Enable fetching RSS feeds - RSS 피드 가져오기 활성화하기 - - - - Feeds refresh interval: - 피드 갱신 간격: - - - - Maximum number of articles per feed: - 피드당 최대 항목 수: - - - - - min - minutes - - - - - RSS Torrent Auto Downloader - RSS 토런트 자동 다운로더 - - - - Enable auto downloading of RSS torrents - RSS 토런트의 자동 다운로드 활성화하기 - - - - Edit auto downloading rules... - 자동 다운로드 규칙 수정... - - - - Web User Interface (Remote control) - 웹 사용자 인터페이스 (원격 제어) - - - - IP address: - IP 주소: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - 웹 UI가 바인딩할 IP 주소. -IPv4나 IPV6 주소를 지정하세요. IPv4 주소에 "0.0.0.0"을, IPV6 주소에 "::"을, -또는 IPV4 및 IPv6 모두에 대해 "*"을 지정할 수 있습니다. - - - - Server domains: - 서버 도메인: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - HTTP 호스트 헤더 값을 필터링하는 허용 목록. -DNS 리바인딩 공격을 방어하기 위해, -웹 UI 서버가 사용하는 도메인 이름을 넣어야 합니다. - -항목 구분은 ';'를 이용하세요. 와일드카드 '*'를 사용 가능. - - - - &Use HTTPS instead of HTTP - HTTP 대신에 HTTPS 사용하기 - - - - Bypass authentication for clients on localhost - 로컬호스트의 클라이언트에 대해 인증 우회하기 - - - - Bypass authentication for clients in whitelisted IP subnets - 허용된 IP 서브넷의 클라이언트에 대해 인증 우회하기 - - - - IP subnet whitelist... - IP 서브넷 허용 목록... - - - - Upda&te my dynamic domain name - 내 동적 도메인 이름 업데이트하기 + + Show qBittorrent in notification area + 알림 영역에서 큐빗토런트 보기 - + Minimize qBittorrent to notification area - 알림 영역으로 큐빗토런트 `최소화하기 + 큐빗토런트를 알림 영역으로 최소화하기 - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. - 알림 영역으로 큐빗토런트 닫기 + 큐빗토런트를 알림 영역으로 닫기 - + Tray icon style: 트레이 아이콘 스타일: - + Normal 보통 - + Monochrome (Dark theme) 모노크롬 (어두운 테마) - + Monochrome (Light theme) 모노크롬 (밝은 테마) - + File association 파일 연결 - + Use qBittorrent for .torrent files .torrent 파일에 큐빗토런트 사용하기 - + Use qBittorrent for magnet links 마그넷 링크에 큐빗토런트 사용하기 - + Power Management 전원 관리 - + + Inhibit system sleep when torrents are active + 토런트가 작동 중이면 시스템 절전 방지하기 + + + + Log file + 로그 파일 + + + Save path: 저장 경로: - + Backup the log file after: 로그 파일이 다음 크기보다 크면 백업하기: - + + MB + MB + + + Delete backup logs older than: 다음 기간보다 오래된 백업 로그 삭제하기: - + days Delete backup logs older than 10 months - + months Delete backup logs older than 10 months 개월 - + years Delete backup logs older than 10 years - + When adding a torrent 토런트 추가시 - + + Display torrent content and some options + 토런트 내용과 몇 가지 옵션 보기 + + + Bring torrent dialog to the front 토런트 대화상자를 맨 앞으로 가져오기 - + Do not start the download automatically The torrent will be added to download list in pause state 다운로드를 자동으로 시작하지 않기 - + Should the .torrent file be deleted after adding it .torrent 파일 추가 후에 삭제하기 - + + Delete .torrent files afterwards + 이후에 .torrent 파일 삭제하기 + + + Also delete .torrent files whose addition was cancelled 추가를 취소한 .torrent 파일도 삭제하기 - + Also when addition is cancelled 추가를 취소했을 때에도 - + Warning! Data loss possible! 경고! 데이터 손실이 생길 수 있습니다! - + Saving Management 저장 관리 - + Default Torrent Management Mode: 기본 토런트 관리 모드: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category 자동 모드는 관련된 카테고리로 저장 경로와 같은 다양한 토런트 속성을 결정하는 것을 의미합니다 - + Manual 수동 - + Automatic 자동 - + When Torrent Category changed: 토런트 카테고리가 바뀌었을 때: - + Relocate torrent 토런트 위치를 이동하기 - + Switch torrent to Manual Mode 토런트를 수동 모드로 전환하기 - + When Default Save Path changed: 기본 저장 경로가 바뀌었을 때: - - + + Relocate affected torrents 영향받는 토런트의 위치를 이동하기 - - + + Switch affected torrents to Manual Mode 영향받는 토런트를 수동 모드로 전환하기 - + When Category changed: 카테고리가 바뀌었을 때: - + Use Subcategories 하위 카테고리 사용하기 - + Default Save Path: 기본 저장 경로: - + Keep incomplete torrents in: - 미완료 토런트 보관하기: + 미완료 토런트 저장: - + Copy .torrent files to: - .torrent 파일 복사하기: - - - - Show &qBittorrent in notification area - 알림 영역에 큐빗토런트 아이콘 표시하기 - - - - &Log file - 로그 파일 + .torrent 파일 복사: - - Display &torrent content and some options - 토런트 내용과 몇 가지 옵션 표시하기 - - - - Create subfolder for torrents with multiple files - 여러 파일이 있는 토런트의 하위 폴더 만들기 - - - - De&lete .torrent files afterwards - 이후로 .torrent 파일 삭제하기 - - - + Copy .torrent files for finished downloads to: - 다 받은 후 .torrent 복사하기: + 다운로드가 끝난 .torrent 파일 복사: - + Pre-allocate disk space for all files 모든 파일에 디스크 공간 미리 할당하기 - - Inhibit system sleep when torrents are downloading - 토런트가 작동 중이면 시스템 절전 방지하기 - - - - Inhibit system sleep when torrents are seeding - 토런트가 시딩 중이면 시스템 절전 방지하기 - - - + Append .!qB extension to incomplete files 미완료 파일에 .!qB 확장자 덧붙이기 - - Enable recursive download dialog - 토렌트 내의 토렌트 내려받기 활성화 - - - + Automatically add torrents from: 다음 경로의 토런트 자동 추가: - + Add entry 항목 추가 - + Remove entry 항목 제거 - + + Email notification upon download completion + 다운로드 완료시 이메일로 알림 + + + + Destination email: + 이메일 수신지: + + + SMTP server: SMTP 서버: - + This server requires a secure connection (SSL) 이 서버는 보안 연결이 필요합니다 (SSL) - - + + + Authentication 인증 - - - - + + + + Username: 사용자명: - - - - + + + + Password: 비밀번호: - - Enabled protocol: - 활성화된 프로토콜: - - - - TCP and μTP - TCP 및 μTP + + Run external program on torrent completion + 토런트 완료시 외부 프로그램 실행 - + Listening Port 수신 포트 - + Port used for incoming connections: 들어오는 연결 포트: - + Random 무작위 - + Use UPnP / NAT-PMP port forwarding from my router 내 라우터에서 UPnp / NAT-PMP 포트 포워딩 사용하기 - + Use different port on each startup 시작할 때마다 다른 포트 사용하기 - + Connections Limits 연결 제한 - + Maximum number of connections per torrent: 토런트당 최대 연결 수: - + Global maximum number of connections: 전역 최대 연결 수: - + Maximum number of upload slots per torrent: 토런트당 최대 업로드 슬롯 수: - + Global maximum number of upload slots: 전역 최대 업로드 슬롯 수: - + Proxy Server 프록시 서버 - + Type: 형식: - + (None) (없음) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: 호스트: - - + + Port: 포트: - + Otherwise, the proxy server is only used for tracker connections 그 밖에, 프록시 서버는 트래커 연결에만 사용됩니다 - + Use proxy for peer connections 피어 연결에 프록시 사용하기 - + Disable connections not supported by proxies 프록시가 지원하지 않는 연결 비활성화하기 - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">추가 정보</a>) - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection RSS 피드, 검색 엔진, 소프트웨어 업데이트나 토런트 전송과 관련된 동작(피어 교환같은) 이외의 다른 어떤 것이든 직접 연결을 사용합니다 - + Use proxy only for torrents 토런트에 프록시만 사용하기 - - A&uthentication - 인증 + + Info: The password is saved unencrypted + 정보: 비밀번호를 암호화하지 않고 저장했습니다 - - Info: The password is saved unencrypted - 정보: 비밀번호는 암호화 없이 저장됩니다. + + IP Filtering + IP 필터링 - + Filter path (.dat, .p2p, .p2b): 필터 경로(.dat, .p2p, .p2b): - + Reload the filter 필터 다시 불러오기 - - Manually banned IP addresses... - 직접 금지한 IP 주소... - - - + Apply to trackers 트래커에 적용하기 - + Global Rate Limits 전역 속도 제한 - - - - - - - KiB/s - KiB/초 - - - - + + Upload: 업로드: - - + + + + + KiB/s + KiB/초 + + + + Download: 다운로드: - + Alternative Rate Limits 대체 속도 제한 - - + + Schedule the use of alternative rate limits + 대체 속도 제한 사용 예약 + + + From: from (time1 to time2) - 보낸이: + 다음에서: - - + To: time1 to time2 - 받는이: + 다음까지: - + When: 언제: - + Every day 매일 - + Weekdays 주중 - + Weekends 주말 - + Rate Limits Settings 속도 제한 설정 - + Apply rate limit to peers on LAN LAN상의 피어에 속도 제한 적용하기 - + Apply rate limit to transport overhead 전송 오버헤드에 속도 제한 적용하기 - - + + + Enable µTP protocol + μTP 프로토콜 사용하기 + + + Apply rate limit to µTP protocol μTP 프로토콜에 속도 제한 적용하기 - + Privacy 개인 정보 - + Enable DHT (decentralized network) to find more peers DHT(분산 네트워크)를 사용하여 더 많은 피어 찾기 - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) 호환 비트토런트 클라이언트(µTorrent, Vuze 등)와 피어 교환하기 - + Enable Peer Exchange (PeX) to find more peers 피어 교환(PeX)을 사용하여 더 많은 피어 찾기 - + Look for peers on your local network 로컬 네트워크상의 피어 찾기 - + Enable Local Peer Discovery to find more peers 더 많은 피어 검색을 위해 로컬 피어 찾기 활성화하기 - + Encryption mode: 암호화 모드: - + Prefer encryption 암호화 선호하기 - + Require encryption 암호화 요구하기 - + Disable encryption 암호화 끄기 - + Enable when using a proxy or a VPN connection 프록시 사용이나 VPN 연결시 사용하기 - + Enable anonymous mode 익명 모드 사용하기 - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">추가 정보</a>) + + + + Torrent Queueing + 토런트 대기열 + + + Maximum active downloads: 최대 활성 다운로드: - + Maximum active uploads: 최대 활성 업로드: - + Maximum active torrents: 최대 활성 토런트: - + Do not count slow torrents in these limits 이 제한에 느린 토런트는 셈하지 않기 - - Upload rate threshold: - 업로드 속도 임계치: - - - - Download rate threshold: - 내려받기 속도 임계치: - - - - sec - seconds - - - - - Torrent inactivity timer: - 토렌트 비활성 타이머: - - - + Share Ratio Limiting 공유 비율 제한 - + Seed torrents until their ratio reaches 토런트 배포 비율이 - + then 에 도달하면 - + Pause them 일시 중지하기 - + Remove them 제거하기 - - RSS Smart Episode Filters - RSS 스마트 에피소드 필터 + + Automatically add these trackers to new downloads: + 다음 트래커를 새 다운로드에 자동으로 추가: + + + + Enable Web User Interface (Remote control) + 웹 사용자 인터페이스 사용 (원격 제어) - + Use UPnP / NAT-PMP to forward the port from my router 내 라우터의 포트를 포워드하기 위해 UPnP / NAT-PMP 사용하기 - + + Use HTTPS instead of HTTP + HTTP 대신 HTTPS 사용 + + + Certificate: 인증서: - + Import SSL Certificate SSL 인증서 가져오기 - + Key: 키: - + Import SSL Key SSL 키 가져오기 - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>인증서 정보</a> - - Use alternative Web UI - 대체 웹UI 사용 + + Bypass authentication for localhost + 로컬 호스트 인증 우회하기 - - Files location: - 파일 위치: + + Update my dynamic domain name + 내 동적 도메인 이름 업데이트 - - Enable clickjacking protection - 클릭 재킹 보호 활성화 - - - - Enable Cross-Site Request Forgery (CSRF) protection - 크로스 사이트 요청 위조 (CSRF) 보호 활성화 - - - + Service: 서비스: - + Register 등록하기 - + Domain name: 도메인명: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! 이 옵션을 사용해서 .torrent 파일을 <strong>복구 불가능하게 제거</strong>할 수 있습니다! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well 이 옵션을 사용하면, 큐빗토런트는 .torrent 파일을 다운로드 대기열에 성공적으로 추가(첫 번째 옵션) 또는 추가에 실패(두 번째 옵션)한 후에 <strong>삭제</strong>할 것입니다. 이것은 &ldquo;토런트 추가&rdquo; 메뉴 동작으로 연 파일 뿐만 아니라 <strong>파일 형식 연결</strong>을 통해서 열린 파일에도 적용될 것입니다 - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog 두 번째 옵션(&ldquo;추가를 취소했을 때에도&rdquo;)을 사용하면 .torrent 파일은 &ldquo;토런트 추가&rdquo; 대화상자에서 &ldquo;<strong>취소</strong>&rdquo;를 눌렀을 경우에도 <strong>삭제될</strong> 것입니다 - - Choose Alternative UI files location - 대체 UI 파일 위치 선택하기 - - - + Supported parameters (case sensitive): 지원되는 변수 (대소문자 구분): - + %N: Torrent name %N: 토런트 이름 - + %L: Category %L: 카테고리 - - %G: Tags (seperated by comma) - %G: 태그 (컴마로 구분함) - - - + %F: Content path (same as root path for multifile torrent) %F: 컨텐츠 경로 (복수 파일 토런트에 대해 루트 경로와 같은) - + %R: Root path (first torrent subdirectory path) - %R: 루트 경로 (첫 번째 토런트 하위 폴더 경로) + %R: 루트 경로 (첫번째 토런트 하위 폴더 경로) - + %D: Save path %D: 저장 경로 - + %C: Number of files %C: 파일 개수 - + %Z: Torrent size (bytes) %Z: 토런트 크기 (바이트) - + %T: Current tracker %T: 현재 트래커 - + %I: Info hash %I: 정보 해쉬 - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") 팁: 텍스트가 공백에서 잘리지 않게 하려면 변수를 따옴표로 둘러싸세요 (예, "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - "토렌트 비활성 시간" 초 값 동안 다운로드 및 업로드 속도가 유지되는 경우 느린 토렌트로 간주 됩니다. - - - + Select folder to monitor 감시할 폴더 선택하기 - + Folder is already being monitored: 폴더를 이미 감시 중입니다: - + Folder does not exist: 폴더가 존재하지 않습니다: - + Folder is not readable: 폴더를 읽을 수 없습니다: - + Adding entry failed 항목 추가에 실패했습니다 - - - - + + Choose export directory 내보낼 폴더 선택 - - - + + + + + + Choose a save directory 저장 폴더 선택 - + Choose an IP filter file IP 필터 파일 선택 - + All supported filters 지원하는 모든 필터 - + SSL Certificate SSL 인증서 - + + SSL Key + SSL 키 + + + Parsing error 분석 오류 - + Failed to parse the provided IP filter 제공된 IP 필터 분석에 실패했습니다 - + Successfully refreshed 새로고침에 성공했습니다 - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number 제공된 IP 필터 분석에 성공했습니다: %1개의 규칙을 적용했습니다. - + Invalid key 무효한 키 - + This is not a valid SSL key. 유효한 SSL 키가 아닙니다. - + Invalid certificate 무효한 인증서 - - Preferences - 환경설정 - - - - Import SSL certificate - SSL 인증서 가져오기 - - - + This is not a valid SSL certificate. 유효한 SSL 인증서가 아닙니다. - - Import SSL key - SSL 키 가져오기 - - - - SSL key - SSL 키 - - - + Time Error 시간 오류 - + The start time and the end time can't be the same. 시작 시간과 종료 시간은 같을 수 없습니다. - - + + Length Error 길이 오류 - + The Web UI username must be at least 3 characters long. 웹 UI 사용자명은 최소한 세 문자 이상이어야 합니다. - + The Web UI password must be at least 6 characters long. 웹 UI 비밀번호는 최소한 여섯 문자 이상이어야 합니다. @@ -5897,72 +5245,72 @@ PeerInfo - - Interested(local) and Choked(peer) + + interested(local) and choked(peer) 관심있음(로컬), 혼잡함(피어) - + interested(local) and unchoked(peer) 관심있음(로컬), 비혼잡(피어) - + interested(peer) and choked(local) 관심있음(피어), 혼잡(로컬) - + interested(peer) and unchoked(local) 관심있음(피어), 비혼잡(로컬) - + optimistic unchoke 낙관적인 혼잡 해소 - + peer snubbed 피어 거부 - + incoming connection 들어오는 연결 - + not interested(local) and unchoked(peer) 관심없음(로컬), 비혼잡(피어) - + not interested(peer) and unchoked(local) 관심없음(피어), 비혼잡(로컬) - + peer from PEX PEX 피어 - + peer from DHT DHT 피어 - + encrypted traffic 암호화된 트래픽 - + encrypted handshake 암호화된 핸드쉐이크 - + peer from LSD LSD 피어 @@ -5970,180 +5318,165 @@ PeerListWidget - + IP IP - + Port 포트 - + Flags 플래그 - + Connection 연결 - + Client i.e.: Client application 클라이언트 - + Progress i.e: % downloaded 진행 - + Down Speed i.e: Download speed 다운 속도 - + Up Speed i.e: Upload speed 업 속도 - + Downloaded i.e: total data downloaded 받음 - + Uploaded i.e: total data uploaded 올림 - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. 관련성 - + Files i.e. files that are being downloaded right now 파일 - + Column visibility 세로줄 가시성 - + Add a new peer... 새 피어 추가... - - + + Ban peer permanently 피어 영구 추방 - + Manually adding peer '%1'... '%1' 피어 직접 추가... - + The peer '%1' could not be added to this torrent. '%1' 피어는 이 토런트에 추가할 수 없습니다. - + Manually banning peer '%1'... '%1' 피어를 직접 추방... - - + + Peer addition 피어 추가 - + Country 국가 - + Copy IP:port IP:포트 복사하기 - + Some peers could not be added. Check the Log for details. 일부 피어를 추가할 수 없습니다. 세부내역은 로그를 확인하세요. - + The peers were added to this torrent. 이 토런트에 피어를 추가했습니다. - + Are you sure you want to ban permanently the selected peers? 선택한 피어를 영구 추방할까요? - + &Yes 예(&Y) - + &No 아니오(&N) - PeersAdditionDialog - - - Add Peers - 피어 추가 - - - - List of peers to add (one IP per line): - 추가할 피어 목록 (한 줄에 한 IP): - - - - Format: IPv4:port / [IPv6]:port - 형식: IPv4:포트 / [IPv6]:포트 - + PeersAdditionDlg - + No peer entered 입력한 피어 없음 - + Please type at least one peer. 최소한 하나의 피어를 입력하세요. - + Invalid peer 무효한 피어 - + The peer '%1' is invalid. '%1' 피어는 무효합니다. @@ -6151,12 +5484,12 @@ PieceAvailabilityBar - + White: Unavailable pieces 흰색: 사용 불가 조각 - + Blue: Available pieces 청색: 사용 가능 조각 @@ -6164,337 +5497,293 @@ PiecesBar - + Files in this piece: 이 조각의 파일: - + File in this piece 이 조각의 파일 - + File in these pieces 이 조각의 파일 - - Wait until metadata become available to see detailed information - 자세한 정보를 보려면 메타데이터를 사용 가능할 때까지 기다리세요 - - - + Hold Shift key for detailed information 자세한 정보는 Shift 키를 누르세요 - PluginSelectDialog + PluginSelectDlg - + Search plugins 검색 플러그인 - + Installed search plugins: 설치한 검색 플러그인: - + Name 이름 - + Version 버전 - + Url URL - - + + Enabled 활성화됨 - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - 경고: 이러한 검색 엔진에서 토런트를 받을 때는 해당 국가의 저작권법을 준수해야 합니다. - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - 새로운 검색 엔진 플러그인을 여기에서 받을 수 있습니다: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + 새 검색 엔진 플러그인은 다음에서 얻을 수 있습니다: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one 새 플러그인 설치 - + Check for updates 업데이트 확인 - + Close 닫기 - + Uninstall 제거하기 - - - + + + Yes - - - - + + + + No 아니오 - + Uninstall warning - 프로그램 삭제 경고 + 삭제 경고 - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. 일부 플러그인은 qBittorrent에 포함되어 있기 때문에 제거할 수 없습니다. 사용자가 직접 설치한 플러그인만 제거할 수 있습니다. 이러한 플러그인은 비활성화했습니다. - + Uninstall success - 제거 완료 + 설치해제 성공 - + All selected plugins were uninstalled successfully 선택한 모든 플러그인을 성공적으로 제거했습니다 - - - - - Search plugin update - 검색 플러그인 업데이트 - - - - Plugins installed or updated: %1 - 플러그인 설치/업데이트 완료: %1 - - - - + + New search engine plugin URL 새 검색 엔진 플러그인 URL - - + + URL: URL: - + Invalid link - 잘못된 링크 + 무효한 링크 - + The link doesn't seem to point to a search engine plugin. 링크에서 검색 엔진 플러그인을 찾을 수 없습니다. - + Select search plugins 검색 플러그인 선택 - + qBittorrent search plugin - 큐빗 토렌트 검색 플러그인 + 큐빗토런트 검색 플러그인 + + + + + + Search plugin update + 검색 플러그인 업데이트 - + All your plugins are already up to date. 모든 플러그인이 최신 버젼입니다. - + Sorry, couldn't check for plugin updates. %1 플러그인 업데이트를 확인할 수 없습니다. %1 - + + + Search plugin install 검색 플러그인 설치 - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + "%1" 검색 엔진 플러그인을 성공적으로 설치했습니다. + + + Couldn't install "%1" search engine plugin. %2 "%1" 검색 엔진 플러그인을 설치할 수 없습니다. %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + "%1" 검색 엔진 플러그인을 성공적으로 업데이트했습니다. + + + Couldn't update "%1" search engine plugin. %2 "%1" 검색 엔진 플러그인을 업데이트할 수 없습니다. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source 플러그인 소스 - + Search plugin source: - 검색엔진 플러그인 소스: + 검색 플러그인 소스: - + Local file 로컬 파일 - + Web link 웹 링크 - PowerManagement - - - qBittorrent is active - 큐빗토렌트는 작동중입니다 - - - - PreviewSelectDialog - - - Preview - 미리보기 - + PreviewSelect - + Name 이름 - + Size 크기 - + Progress - 진행 + 진행상황 - - + + Preview impossible - 미리보기 불가능 + 미리보기 불가 - - + + Sorry, we can't preview this file 이 파일은 미리보기를 할 수 없습니다 - Private::FileLineEdit - - - '%1' does not exist - '%1' 는 존재하지 않습니다 - - - - '%1' does not point to a directory - '%1' 은 폴더를 가리키지 않습니다. - - - - '%1' does not point to a file - '%1' 은 파일을 가리키지 않습니다. - - - - Does not have read permission in '%1' - '%1' 에 읽기 권한이 없습니다 - - - - Does not have write permission in '%1' - '%1' 에 쓰기 권한이 없습니다 - - - PropListDelegate - + Not downloaded 받지 않음 - - + + Normal Normal (priority) 보통 - - N/A - 이용 불가 - - - + Do not download Do not download (priority) - 받지 않음 + 받지 않음 - - + + High High (priority) 높음 - + N/A + 이용 불가 + + + Mixed Mixed (priorities 혼합 - - + + Maximum Maximum (priority) 최대 @@ -6503,32 +5792,32 @@ PropTabBar - + General 일반 - + Trackers 트래커 - + Peers 피어 - + HTTP Sources HTTP 소스 - + Content 내용 - + Speed 속도 @@ -6622,22 +5911,22 @@ 코멘트: - + Select All 모두 선택 - + Select None 선택 안함 - + Normal 보통 - + High 높음 @@ -6697,165 +5986,165 @@ 저장 경로: - + Maximum 최고 + - Do not download 받지 않음 - + Never 절대 안함 - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (%3 개 있음) - - + + %1 (%2 this session) %1(%2 현재 세션) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (%2 동안 배포) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (최대 %2) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (전체 %2) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (평균 %2) - + Open 열기 - + Open Containing Folder 포함 폴더 열기 - + Rename... 이름 바꾸기... - + Priority 우선 순위 - + New Web seed 새로운 웹 시드 - + Remove Web seed 웹 시드 제거 - + Copy Web seed URL 웹 시드 URL 복사 - + Edit Web seed URL 웹 시드 URL 편집 - + + Rename the file + 파일 이름 바꾸기 + + + New name: 새 이름: - - + + + The file could not be renamed + 이 파일의 이름을 변경할 수 없습니다 + + + + This file name contains forbidden characters, please choose a different one. + 파일명에 금지된 문자가 들어 있습니다. 다른 이름을 선택하세요. + + + + This name is already in use in this folder. Please use a different name. 이 이름은 이 폴더에서 이미 사용중입니다. 다른 이름을 사용하세요. - + The folder could not be renamed 이 폴더의 이름을 변경할 수 없습니다 - + qBittorrent 큐빗토런트 - + Filter files... - 파일 필터링하기... + 파일 필터하기... - - Renaming - 이름 바꾸기 - - - - - Rename error - 이름 바꾸기 오류 - - - - The name is empty or contains forbidden characters, please choose a different one. - 이 이름은 비어 있거나 금지된 문자를 포함하고 있습니다. 다른 이름을 선택하세요. - - - + New URL seed New HTTP source 새 URL 시드 - + New URL seed: 새 URL 시드: - - + + This URL seed is already in the list. 이 URL시드는 목록에 이미 있습니다. - + Web seed editing 웹 시드 편집 - + Web seed URL: 웹 시드 URL: @@ -6863,585 +6152,552 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + 인증 시도시 너무 많이 실패해서 당신의 IP 주소는 밴을 당했습니다. + + + + Error: '%1' is not a valid torrent file. + + 오류: '%1' 은 무효한 토런트 파일입니다. + + + + + Error: Could not add torrent to session. + 오류: 토런트를 세션에 추가할 수 없습니다. + + + + I/O Error: Could not create temporary file. + I/O 오류: 임시 파일을 생성할 수 없습니다. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 은 알 수 없는 명령행 변수입니다. - - + + %1 must be the single command line parameter. %1 은 단일 명령행 변수여야 합니다. - + + %1 must specify the correct port (1 to 65535). + %1 은 올바른 포트 번호를 지정해야 합니다 (1 ~ 65535). + + + You cannot use %1: qBittorrent is already running for this user. %1 을 사용할 수 없습니다: 이 사용자의 큐빗토런트가 이미 실행 중입니다. - + Usage: 사용법: - + Options: 옵션: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - 매개 변수 '%1' 은 구문 '%1=%2' 을 따라야 합니다. + + Displays program version + 프로그램 버젼 표시 - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - 매개 변수 '%1' 은 구문 '%1=%2' 을 따라야 합니다. + + Displays this help message + 이 도움말 표시 - - Expected integer number in environment variable '%1', but got '%2' - 환경 변수 '%1'에서 예상되는 정수이나 '%2'이 있습니다 + + Changes the Web UI port (current: %1) + 웹 UI 포트 바꾸기 (현재: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - 매개 변수 '%1' 은 구문 '%1=%2' 을 따라야 합니다. + + Disable splash screen + 스플래시 화면 비활성화 - - Expected %1 in environment variable '%2', but got '%3' - 환경 변수 '%2'에서 예상되는 %1이나 '%3'이 있습니다 + + Run in daemon-mode (background) + 데몬 모드로 실행 (백그라운드) - - port - 포트 + + Downloads the torrents passed by the user + 사용자가 전달한 토런트 다운로드하기 - - %1 must specify a valid port (1 to 65535). - %1은 유효한 포트 번호이어야 합니다 (1 ~ 65535). + + Help + 도움말 - - Display program version and exit - 프로그램 버전을 표시하고 종료 + + Run application with -h option to read about command line parameters. + 명령행 변수에 대해 읽으려면 -h 옵션으로 프로그램을 실행하세요. - - Display this help message and exit - 이 도움말 메시지를 표시하고 종료 + + Bad command line + 잘못된 명령행 - - Change the Web UI port - 웹 UI 포트 바꾸기 + + Bad command line: + 잘못된 명령행: - - Disable splash screen - 스플래시 화면 비활성화 + + Legal Notice + 법적 공지 - - Run in daemon-mode (background) - 데몬 모드로 실행 (백그라운드) + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + 큐빗토런트는 파일 공유 프로그램입니다. 토런트를 실행하면, 그 데이터는 업로드를 통해 다른 사람이 이용 가능합니다. 어떠한 것을 공유하든지 전적으로 귀하의 책임입니다. + +더 이상 표시하지 않습니다. - - dir - Use appropriate short form or abbreviation of "directory" - 폴더 + + Press %1 key to accept and continue... + 승인 후 계속하려면 %1 키를 누르세요.. - - Store configuration files in <dir> - <dir>에 설정 파일 저장 + + Legal notice + 법적 공지 - - - name - 이름 + + Cancel + 취소 - - Store configuration files in directories qBittorrent_<name> - qBittorrent_<name> 폴더에 설정 파일 저장 + + I Agree + 동의합니다 - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - libtorrent fastresume 파일을 해킹하여 프로파일 폴더에 상대적인 파일 경로를 만듭니다 + + Torrent name: %1 + 토런트 이름: %1 - - files or URLs - 파일 또는 URLs + + Torrent size: %1 + 토런트 크기: %1 - - Download the torrents passed by the user - 사용자가 전달한 토런트 다운로드하기 + + Save path: %1 + 저장 경로: %1 - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - 토런트를 추가 할 때 "새 토런트 추가하기" 대화 상자를 열 것인지 여부를 지정합니다. + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + %1에 토런트를 다운로드했습니다. - - Options when adding new torrents: - 새 토런트를 추가 할 때의 옵션: + + Thank you for using qBittorrent. + 큐빗토런트 사용에 감사드립니다. - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - %1용 바로가기 + + [qBittorrent] '%1' has finished downloading + [큐빗토런트] '%1' 다운로드를 완료했습니다 - - path - 경로 + + The remote host name was not found (invalid hostname) + 원격 호스트명을 찾을 수 없습니다 (무효한 호스트명) - - Torrent save path - 토런트 저장 경로 + + The operation was canceled + 작업을 취소했습니다 - - Add torrents as started or paused - 토런트를 시작 또는 일시중지로 추가 + + The remote server closed the connection prematurely, before the entire reply was received and processed + 완전한 응답을 받고 처리하기 전에, 원격 서버는 접속을 너무 빨리 닫았습니다. - - Skip hash check - 해쉬 검사 건너뛰기 + + The connection to the remote server timed out + 원격 서버 연결 시간이 초과되었습니다 - - Assign torrents to category. If the category doesn't exist, it will be created. - 카테고리에 토런트를 지정하세오. 카테고리가 존재하지 않으면 생성될 것입니다. + + SSL/TLS handshake failed + SSL/TLS 핸드쉐이크에 실패했습니다 + - - Download files in sequential order - 파일을 차례대로 다운로드 + + The remote server refused the connection + 원격 서버가 연결을 거부했습니다 - - Download first and last pieces first - 첫 번째와 마지막 조각을 먼저 다운로드 + + The connection to the proxy server was refused + 프록시 서버가 연결을 거부했습니다 - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - 옵션 값은 환경 변수를 통해 제공될 수 있습니다. 'parameter-name' 이라는 옵션의 경우, 환경 변수 이름은 'QBT_PARAMETER_NAME' (대문자로 '-'는 '_'으로 바뀜) 입니다. 플래그 값을 전달하려면 변수를 '1' 또는 'TRUE'로 설정하세요. 예를 들어 스플래시 화면을 비활성화하려면 다음처럼 하세요: + + The proxy server closed the connection prematurely + 프록시 서버가 접속을 너무 빨리 닫았습니다 - - Command line parameters take precedence over environment variables - 명령행 매개 변수는 환경 변수보다 우선합니다 + + The proxy host name was not found + 프록시 호스트 이름을 찾을 수 없습니다 - - Help - 도움말 + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + 프록시 연결 시간이 초과되었거나 프록시가 전송한 요청에 맞춰 응답하지 않습니다 - - Run application with -h option to read about command line parameters. - 명령행 변수에 대해 읽으려면 -h 옵션으로 프로그램을 실행하세요. + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + 프록시는 요청을 이행하기 위해 인증이 필요하지만 제공된 어떤 인증서도 승인하지 않았습니된다 - - Bad command line - 잘못된 명령행 + + The access to the remote content was denied (401) + 원격 컨텐츠 접속이 거부되었습니다 (401) - - Bad command line: - 잘못된 명령행: + + The operation requested on the remote content is not permitted + 원격 컨텐츠에 요청한 작업은 허용되지 않습니다 - - Legal Notice - 법적 공지 + + The remote content was not found at the server (404) + 원격 컨텐츠를 서버에서 찾을 수 없습니다 (404) - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - 큐빗 토렌트는 파일 공유 프로그램입니다. 토렌트를 실행하면, 해당 데이터는 업로드를 통해 다른 사용자가 이용가능 하게 됩니다. 어떠한 공유 내용물이라도 전적으로 귀하의 책임입니다. + + The remote server requires authentication to serve the content but the credentials provided were not accepted + 원격 서버의 컨텐츠에 접근하려면 인증이 필요하지만 제공된 인증서는 승인되지 않았습니다 - - No further notices will be issued. - 더 이상 알리지 않습니다. + + The Network Access API cannot honor the request because the protocol is not known + 프로토콜을 알 수 없기 때문에 네트워크 접근 API는 요청을 이행할 수 없습니다 - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - 큐빗토런트는 파일 공유 프로그램입니다. 토런트를 실행하면, 그 데이터는 업로드를 통해 다른 사람이 이용 가능합니다. 어떠한 것을 공유하든지 전적으로 귀하의 책임입니다. - -더 이상 표시하지 않습니다. + + The requested operation is invalid for this protocol + 요청한 동작은 이 프로토콜에 대해 무효합니다. - - Press %1 key to accept and continue... - 승인 후 계속하려면 %1 키를 누르세요.. + + An unknown network-related error was detected + 알 수 없는 네트워크 관련 오류를 감지했습니다 - - Legal notice - 법적 공지 + + An unknown proxy-related error was detected + 알 수 없는 프록시 관련 오류를 감지했습니다 - - Cancel - 취소 + + An unknown error related to the remote content was detected + 원격 컨텐츠와 관련된 알 수 없는 오류를 감지했습니다 - - I Agree - 동의합니다 + + A breakdown in protocol was detected + 프로토콜 손상을 감지했습니다 - - + + Unknown error + 알 수 없는 오류 + + + + Upgrade 업그레이드 - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] 다른 방식으로 저장했던 이전 버전에서 업데이트했습니다. 새로운 저장 시스템으로 이전해야 합니다. 3.3.0 이전의 버전을 다시 사용할 수 없게 될 것입니다. 계속할까요? [예/아니오] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - 다른 방식으로 저장했던 이전 버전에서 업데이트했습니다. 새로운 저장 시스템으로 이전해야 합니다. 계속 진행하면, 3.3.0 이전의 버전을 다시 사용할 수 없게 됩니다. + 다른 방식으로 저장했던 이전 버전에서 업데이트했습니다. 새로운 저장 시스템으로 이전해야 합니다. 계속 진행하면, 3.3.0 이전의 버전을 다시 사용할 수 없게 될 것입니다. - + Couldn't migrate torrent with hash: %1 다음 해쉬의 토런트를 이전할 수 없습니다: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 토런트를 이전할 수 없습니다. 무효한 빠른재시작 파일 이름: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 - 비정상적인 프로그램 종료를 감지했습니다. 설정 복원을 위해 예비 파일을 사용합니다: %1 + + Detected unclean program exit. Using fallback file to restore settings. + 분명치 않은 프로그램 종료를 감지했습니다. 설정 복원을 위해 예비 파일을 사용합니다. - + An access error occurred while trying to write the configuration file. 설정 파일을 쓰려고 할 때 접근 오류가 발생했습니다. - + A format error occurred while trying to write the configuration file. 설정 파일을 쓰려고 할 때 형식 오류가 발생했습니다. - - - An unknown error occurred while trying to write the configuration file. - 설정 파일을 쓰려고 할 때 알 수 없는 오류가 발생했습니다. - - RSS::AutoDownloader + RSS - - - Invalid data format. - 무효한 데이터 형식. + + Search + 검색 - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - %1에서 RSS 자동 다운로더 데이터를 저장할 수 없습니다. 오류: %2 + + New subscription + 새 구독 - - Invalid data format - 무효한 데이터 형식 + + + + Mark items read + 읽은 것으로 표시 - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - %1에서 RSS 자동 다운로더의 규칙을 읽을 수 없습니다. 오류: %2 - - - - Couldn't load RSS AutoDownloader rules. Reason: %1 - RSS 자동 다운로더의 규칙을 불러올 수 없습니다. 오류 : %1 - - - - RSS::Feed - - - Failed to download RSS feed at '%1'. Reason: %2 - '%1'의 RSS 피드 다운로드에 실패했습니다. 이유: %2 - - - - RSS feed at '%1' updated. Added %2 new articles. - '%1'의 RSS 피드를 업데이트했습니다. %2개의 새로운 기사를 추가했습니다. - - - - Failed to parse RSS feed at '%1'. Reason: %2 - '%1'의 RSS 피드 분석에 실패했습니다. 이유: %2 - - - - Couldn't read RSS Session data from %1. Error: %2 - %1에서 RSS 세션 데이터를 읽을 수 없습니다. 오류: %2 - - - - Couldn't parse RSS Session data. Error: %1 - RSS 세션 데이터를 분석할 수 없습니다. 오류: %1 - - - - Couldn't load RSS Session data. Invalid data format. - RSS 세션 데이터를 불러올 수 없습니다. 무효한 데이터 형식. - - - - Couldn't load RSS article '%1#%2'. Invalid data format. - '%1#%2' RSS 기사를 불러올 수 없습니다. 무효한 데이터 형식. - - - - RSS::Private::Parser - - - Invalid RSS feed. - 무효한 RSS 피드. - - - - %1 (line: %2, column: %3, offset: %4). - %1 (줄: %2, 열: %3, 오프셋: %4). - - - - RSS::Session - - - RSS feed with given URL already exists: %1. - 주어진 URL이 있는 RSS 피드가 이미 존재합니다: %1. - - - - Cannot move root folder. - 루트 폴더를 이동할 수 없습니다. - - - - - Item doesn't exist: %1. - 항목이 존재하지 않습니다: %1. - - - - Cannot delete root folder. - 루트 폴더를 삭제할 수 없습니다. - - - - Incorrect RSS Item path: %1. - 잘못된 RSS 항목 경로: %1. - - - - RSS item with given path already exists: %1. - 주어진 경로가 있는 RSS 항목이 이미 존재합니다: %1. - - - - Parent folder doesn't exist: %1. - 상위 폴더가 존재하지 않습니다: %1. - - - - RSSWidget - - - Search - 검색 - - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - RSS 피드 가져오기가 현재 비활성화되었습니다! 프로그램 설정에서 활성화할 수 있습니다. - - - - New subscription - 새 구독 - - - - - - Mark items read - 읽은 것으로 표시 - - - - Refresh RSS streams - RSS 스트림 새로고침 - - - + Update all 전부 업데이트 - + RSS Downloader... RSS 다운로더... - + + Settings... + 설정... + + + Torrents: (double-click to download) - 토런트: (다운로드는 더블 클릭) + 토런트: (다운로드하려면 더블클릭) - - + + Delete 삭제 - + Rename... 이름 바꾸기... - + Rename 이름 바꾸기 - - + + Update - 업데이트 + 판올림 - + New subscription... 새 구독... - - + + Update all feeds 모든 피드 업데이트 - + Download torrent 토런트 다운로드 - + Open news URL 뉴스 URL 열기 - + Copy feed URL 피드 URL 복사 - + New folder... 새 폴더... - + + Refresh RSS streams + RSS 스트림 새로고침 + + + + RSSImp + + + Stream URL: + 스트림 URL: + + + + Please type a RSS stream URL + RSS 스트림 URL을 입력하세요 + + + + This RSS feed is already in the list. + 이 RSS 피드는 목록에 이미 있습니다. + + + Please choose a folder name 폴더 이름을 선택하세요 - + Folder name: 폴더 이름: - + New folder 새 폴더 - - Please type a RSS feed URL - RSS 피드 URL을 입력하세요 - - - - Feed URL: - 피드 URL: - - - + Deletion confirmation 삭제 확인 - + Are you sure you want to delete the selected RSS feeds? - 선택한 RSS 피드를 정말 삭제할까요? + 선택한 RSS 피드를 삭제할까요? - + Please choose a new name for this RSS feed - 이 RSS 피드에 사용할 새 이름을 선택하세요 + 이 RSS 피드에 사용할 새 이름을 입력하세요 - + New feed name: 새 피드 이름: - - Rename failed - 이름 바꾸기 실패 + + Name already in use + 이미 사용 중인 이름 + + + + This name is already used by another item, please choose another one. + 이 이름은 다른 항목에서 이미 사용하고 있습니다. 다른 이름을 선택하세요. - + Date: 날짜: - + Author: 작성자: + + + Unread + 안 읽음 + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + '%2' RSS 피드에 토런트나 마그넷 링크가 없기 때문에, 해당 RSS 피드에서 '%1'을 자동으로 다운로드하지 못했습니다... + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + '%2' RSS 피드에서 '%1' 토런트를 자동으로 다운로드하는 중... + + + + Rss::Private::Parser + + + Invalid RSS feed. + 무효한 RSS 피드. + + + + RssSettingsDlg + + + RSS Reader Settings + RSS 리더 설정 + + + + RSS feeds refresh interval: + RSS 피드 새로고침 간격: + + + + min + + + + + Maximum number of articles per feed: + 피드당 최대 항목 수: + ScanFoldersDelegate - + Select save location 저장 위치 선택하기 @@ -7449,274 +6705,268 @@ ScanFoldersModel - + Monitored Folder 감시 폴더 - + Override Save Location 저장 위치 - + Monitored folder 감시 폴더 - + Default save location 기본 저장 위치 - + Browse... 찾아보기... - SearchJobWidget + SearchEngine - - Form - 형태 + + Unknown search engine plugin file format. + 알 수 없는 검색 엔진 플러그인 파일 형식. - - Results(xxx) - 결과(xxx) + + A more recent version of this plugin is already installed. + 이 플러그인의 최신 버전이 이미 설치되어 있습니다. - - Search in: - 찾기: + + + Plugin is not supported. + 플러그인을 지원하지 않습니다. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - <html><head/><body><p>어떤 검색 엔진은 토런트 설명과 파일명도 검색합니다. 그 결과가 아래 목록에 표시될지는 이 모드로 제어합니다.</p><p><span style=" font-weight:600;">모든 곳</span> 필터를 비활성화하고 검색 엔진에서 반환하는 모든 결과를 보여줍니다.</p><p><span style=" font-weight:600;">토런트 이름만</span> 토런트 이름이 검색 질의와 일치하는 것만 보여줍니다.</p></body></html> + + Update server is temporarily unavailable. %1 + 업데이트 서버를 잠시 사용할 수 없습니다. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - <html><head/><body><p>시드의 최소와 최대 허용 수 설정</p></body></html> + + + Failed to download the plugin file. %1 + 플러그인 파일을 다운로드하지 못했습니다. %1 - - Seeds: - 시드: + + An incorrect update info received. + 잘못된 업데이트 정보를 수신했습니다. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - <html><head/><body><p>최소 시드 수</p></body></html> + + All categories + 모든 카테고리 - - - to - ~ + + Movies + 영화 - - <html><head/><body><p>Maximal number of seeds</p></body></html> - <html><head/><body><p>최대 시드 수</p></body></html> + + TV shows + TV 쇼 - - - - + + Music + 음악 - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - <html><head/><body><p>토런트의 최소와 최대 허용 크기 설정</p></body></html> + + Games + 게임 - - Size: - 크기: + + Anime + 애니 - - <html><head/><body><p>Minimal torrent size</p></body></html> - <html><head/><body><p>최소 토런트 크기</p></body></html> + + Software + 소프트웨어 - - <html><head/><body><p>Maximal torrent size</p></body></html> - <html><head/><body><p>최대 토런트 크기</p></body></html> + + Pictures + 사진 + + + + Books + + + + + SearchListDelegate + + + + Unknown + 알 수 없음 + + + SearchTab - + Name i.e: file name 이름 - + Size i.e: file size 크기 - + Seeders i.e: Number of full sources 배포자 - + Leechers i.e: Number of partial sources 공유자 - + Search engine 검색 엔진 - - Filter search results... - 필터 검색 결과... - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results 결과 ( <i>%2</i> 중 <i>%1</i> 보기): - + Torrent names only 토런트 이름만 - + Everywhere 모든 곳 - - Use regular expressions - 정규 표현식 사용 - - - + Searching... - 검색중... + 검색 중... - + Search has finished 검색 완료 - + Search aborted - 검색이 중단됨 + 검색 중단 - + An error occurred during search... - 검색 중 오류가 발생했습니다... + 검색 중 오류 발생... - + Search returned no results - 검색 결과가 없습니다 + 검색 결과가 없음 - + Column visibility - 세로줄 가시성 - - - - SearchPluginManager - - - Unknown search engine plugin file format. - 알 수 없는 검색 엔진 플러그인 파일 형식입니다. - - - - A more recent version of this plugin is already installed. - 이 플러그인의 최신 버전이 이미 설치되어 있습니다. + 세로줄 가시성 - - - Plugin is not supported. - 플러그인을 지원하지 않습니다. + + Form + 다음에서: - - All categories - 모든 분류 + + Results(xxx) + 결과(xxx) - - Movies - 영화 + + Search in: + 찾기: - - TV shows - TV 쇼 + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>어떤 검색 엔진은 토런트 설명과 파일명도 검색합니다. 그 결과가 아래 목록에 표시될지는 이 모드로 제어합니다.</p><p><span style=" font-weight:600;">모든 곳</span> 필터를 비활성화하고 검색 엔진에서 반환하는 모든 결과를 보여줍니다.</p><p><span style=" font-weight:600;">토런트 이름만</span> 토런트 이름이 검색 질의와 일치하는 것만 보여줍니다.</p></body></html> - - Music - 음악 + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>시드의 최소와 최대 허용 수 설정</p></body></html> - - Games - 게임 + + Seeds: + 시드: - - Anime - 애니 + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>최소 시드 수</p></body></html> - - Software - 소프트웨어 + + + to + 다음까지: - - Pictures - 사진 + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>최대 시드 수</p></body></html> - - - Books - + + + + + - - Update server is temporarily unavailable. %1 - 업데이트 서버를 잠시 사용할 수 없습니다. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>토런트의 최소와 최대 허용 크기 설정</p></body></html> - - - Failed to download the plugin file. %1 - 플러그인 파일을 다운로드하지 못했습니다. %1 + + Size: + 크기: - - An incorrect update info received. - 잘못된 업데이트 정보를 수신했습니다. + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>최소 토런트 크기</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - '%1' 검색 플러그인에 무효한 버전 문자열('%2')이 있습니다 + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>최대 토런트 크기</p></body></html> @@ -7724,198 +6974,185 @@ - - - - + + + Search 검색 - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - 어떠한 검색 플러그인도 설치되어 있지 않습니다. -창 오른쪽 하단의 "플러그인 검색..." 버튼을 누른 후 설치하세요. - - - + Download 다운로드 - + Go to description page 설명 페이지로 가기 - + Copy description page URL 설명 페이지 URL 복사 - + Search plugins... 검색 플러그인... - + A phrase to search for. 검색할 구절. - + Spaces in a search term may be protected by double quotes. 검색 용어의 공백은 따옴표로 보호합니다. - + Example: Search phrase example 예: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>: <b>foo</b>와 <b>bar</b> 검색 - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: <b>foo bar</b> 검색 - + All plugins 모든 플러그인 - + Only enabled 활성화된 것만 - + Select... 선택하기... - - - + + + Search Engine 검색 엔진 - + Please install Python to use the Search Engine. 검색 엔진을 사용하려면 파이썬을 설치하세요. - + Empty search pattern 검색 패턴 비우기 - + Please type a search pattern first 검색 패턴을 먼저 입력하세요 - + Stop 정지 - + Search has finished 검색을 완료했습니다 - + Search has failed 검색에 실패했습니다 - ShutdownConfirmDialog - - - Don't show again - 다시 보지 않음 - + ShutdownConfirmDlg - + qBittorrent will now exit. 지금 큐빗토런트를 종료합니다. - + E&xit Now 프로그램 종료(&X) - + Exit confirmation 종료 확인 - + The computer is going to shutdown. 컴퓨터를 종료합니다. - + &Shutdown Now 시스템 종료(&S) - - Shutdown confirmation - 시스템 종료 확인 - - - + The computer is going to enter suspend mode. 컴퓨터가 절전모드로 전환됩니다. - + &Suspend Now 절전모드(&S) - + Suspend confirmation 절전모드 확인 - + The computer is going to enter hibernation mode. 컴퓨터가 최대절전모드로 전환됩니다. - + &Hibernate Now 최대절전모드(&H) - + Hibernate confirmation 최대절전모드 확인 - + You can cancel the action within %1 seconds. %1 초 내에 동작을 취소할 수 있습니다. + + + Shutdown confirmation + 시스템 종료 확인 + SpeedLimitDialog - + KiB/s KiB/초 @@ -7923,52 +7160,52 @@ SpeedPlotView - + Total Upload 총 업로드 - + Total Download 총 다운로드 - + Payload Upload 페이로드 업로드 - + Payload Download 페이로드 다운로드 - + Overhead Upload 오버헤드 업로드 - + Overhead Download 오버헤드 다운로드 - + DHT Upload DHT 업로드 - + DHT Download DHT 다운로드 - + Tracker Upload 트래커 업로드 - + Tracker Download 트래커 다운로드 @@ -7976,95 +7213,87 @@ SpeedWidget - + Period: 기간: - + 1 Minute 1 분 - + 5 Minutes 5 분 - + 30 Minutes 30 분 - + 6 Hours 6 시간 - + Select Graphs 그래프 선택 - + Total Upload 총 업로드 - + Total Download 총 다운로드 - + Payload Upload 페이로드 업로드 - + Payload Download 페이로드 다운로드 - + Overhead Upload 오버헤드 업로드 - + Overhead Download 오버헤드 다운로드 - + DHT Upload DHT 업로드 - + DHT Download DHT 다운로드 - + Tracker Upload 트래커 업로드 - + Tracker Download 트래커 다운로드 - StacktraceDialog - - - Crash info - 충돌 정보 - - - StatsDialog @@ -8077,49 +7306,49 @@ 사용자 통계 - - Cache statistics - 캐쉬 통계 + + Total peer connections: + 총 피어 연결: - - Read cache hits: - 읽기 캐쉬 적중: + + Global ratio: + 전역 비율: - - Average time in queue: - 대기열의 평균 시간: + + Alltime download: + 역대 다운로드: - - Connected peers: - 연결된 피어: + + Alltime upload: + 역대 업로드: - - All-time share ratio: - 전체시간 공유 비율: + + Total waste (this session): + 총 버림 (이 세션): - - All-time download: - 전체시간 내리기: + + Cache statistics + 캐쉬 통계 - - Session waste: - 낭비된 세션: + + Read cache hits: + 읽기 캐쉬 적중: - - All-time upload: - 전체시간 업로드: + + Average time in queue: + 대기열의 평균 시간: - Total buffer size: - 전체 버퍼 크기: + Total buffers size: + 총 버퍼 크기: @@ -8147,7 +7376,12 @@ 총 대기열 크기: - + + OK + 확인 + + + %1 ms 18 milliseconds %1 ms @@ -8156,27 +7390,32 @@ StatusBar - + Connection status: 연결 상태: - + No direct connections. This may indicate network configuration problems. 직접 연결 없음. 네트워크 설정에 문제가 있는 것 같습니다. - + DHT: %1 nodes DHT: %1 노드 - - qBittorrent needs to be restarted! - 큐빗토런트를 재시작해야 합니다! + + qBittorrent needs to be restarted + 큐빗토런트를 다시 시작해야 합니다 + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + 큐빗토런트를 방금 업데이트했으며 변경사항을 적용하려면 프로그램을 재시작해야 합니다. @@ -8195,1570 +7434,1311 @@ 온라인 - + Click to switch to alternative speed limits 대체 속도 제한으로 바꾸려면 누르세요 - + Click to switch to regular speed limits 평상시 속도 제한으로 바꾸려면 누르세요 - + + Manual change of rate limits mode. The scheduler is disabled. + 속도 제한 모드 수동 변경. 스케줄러를 비활성화합니다. + + + Global Download Speed Limit 전역 다운로드 속도 제한 - + Global Upload Speed Limit 전역 업로드 속도 제한 - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter 전체 (0) - + Downloading (0) - 받는중 (0) + 받는 중 (0) - + Seeding (0) - 배포중 (0) + 배포 중 (0) - + Completed (0) 완료 (0) - + Resumed (0) 재시작 (0) - + Paused (0) 일시중지 (0) - + Active (0) 활성 (0) - + Inactive (0) 비활성 (0) - + Errored (0) 오류 (0) - + All (%1) 전체 (%1) - + Downloading (%1) - 받는중 (%1) + 받는 중 (%1) - + Seeding (%1) 배포 중 (%1) - + Completed (%1) 완료 (%1) - + Paused (%1) 일시중지 (%1) - + Resumed (%1) 재시작 (%1) - + Active (%1) 활성 (%1) - + Inactive (%1) 비활성 (%1) - + Errored (%1) 오류 (%1) - TagFilterModel + TorrentContentModel - - Tags - 태그 + + Name + 이름 - - All - 전체 + + Size + 크기 - - Untagged - 태그 없음 + + Progress + 진행 - - - TagFilterWidget - - Add tag... - 태그 추가... + + Download Priority + 다운로드 우선순위 - - Remove tag - 태그 제거 + + Remaining + 남음 + + + TorrentCreatorDlg - - Remove unused tags - 미사용 태그 제거 + + Select a folder to add to the torrent + 토런트를 추가할 폴더를 선택하세요 - - Resume torrents - 토런트 재시작 + + Select a file to add to the torrent + 토런트에 추가할 파일을 선택하세요 - - Pause torrents - 토런트 일시중지 + + No input path set + 입력 경로 미지정 - - Delete torrents - 토런트 삭제 + + Please type an input path first + 먼저 입력 경로를 작성하세요 - - New Tag - 새 태그 + + Select destination torrent file + 대상 토런트 파일을 선택하세요 - - Tag: - 태그: + + Torrent Files (*.torrent) + 토런트 파일 (*.torrent) - - Invalid tag name - 무효한 태그 이름 + + Torrent was created successfully: %1 + %1 is the path of the torrent + 토런트 생성에 성공했습니다: %1 - - Tag name '%1' is invalid - '%1' 태그 이름은 무효합니다. + + + + Torrent creation + 토런트 생성 - - Tag exists - 태그가 존재합니다 + + Torrent creation was unsuccessful, reason: %1 + 토런트 생성에 실패했습니다, 이유: %1 - - Tag name already exists. - 태그 이름이 이미 존재합니다. + + Created torrent file is invalid. It won't be added to download list. + 만든 토런트 파일이 무효합니다. 다운로드 목록에 추가할 수 없습니다. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - 토런트 카테고리 속성 + + Name + i.e: torrent name + 이름 - - Name: - 이름: + + Size + i.e: torrent size + 크기 - - Save path: - 저장 경로: + + Done + % Done + 완료 - - Choose save path - 저장 경로 선택 + + Status + Torrent status (e.g. downloading, seeding, paused) + 상태 - - New Category - 새 카테고리 + + Seeds + i.e. full sources (often untranslated) + 시드 - - Invalid category name - 무효한 카테고리 이름 + + Peers + i.e. partial sources (often untranslated) + 피어 - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - 카테고리 이름은 '\'를 포함할 수 없습니다. -카테고리 이름은 '/'로 시작/끝날 수 없습니다. -카테고리 이름은 연속된 '//'를 포함할 수 없습니다. - - - - Category creation error - 카테고리 생성 오류 - - - - Category with the given name already exists. -Please choose a different name and try again. - 이 이름의 카테고리가 이미 있습니다. -다른 이름을 선택하고 다시 해보세요. + + Down Speed + i.e: Download speed + 다운 속도 - - - TorrentContentModel - - Name - 이름 + + Up Speed + i.e: Upload speed + 업 속도 - - Size - 크기 + + Ratio + Share ratio + 비율 - - Progress - 진행 + + ETA + i.e: Estimated Time of Arrival / Time left + 남은 시간 - - Download Priority - 다운로드 우선순위 + + Category + 카테고리 - - Remaining - 남음 + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + 추가일 - - Availability - 가용성: + + Completed On + Torrent was completed on 01/01/2010 08:00 + 완료일 - - - TorrentCreatorDialog - - Torrent Creator - 토런트 생성기 + + Tracker + 트래커 - - Select file/folder to share - 공유할 파일/폴더 선택 + + Down Limit + i.e: Download limit + 다운 제한 - - Path: - 경로: + + Up Limit + i.e: Upload limit + 업 제한 - - [Drag and drop area] - [여기에 드래그 앤 드롭] + + Downloaded + Amount of data downloaded (e.g. in MB) + 받음 - - - Select file - 파일 선택 + + Uploaded + Amount of data uploaded (e.g. in MB) + 올림 - - - Select folder - 폴더 선택 + + Session Download + Amount of data downloaded since program open (e.g. in MB) + 세션 다운로드 - - Settings - 설정 + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + 세션 업로드 - - Piece size: - 조각 크기: + + Remaining + Amount of data left to download (e.g. in MB) + 남음 - - Auto - 자동 + + Time Active + Time (duration) the torrent is active (not paused) + 활성 시간 - - 16 KiB - 16 KiB + + Save path + Torrent save path + 저장 경로 - - 32 KiB - 32 KiB + + Completed + Amount of data completed (e.g. in MB) + 완료됨 - - 64 KiB - 64 KiB + + Ratio Limit + Upload share ratio limit + 속도 제한 - - 128 KiB - 128 KiB + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + 최근 본 완료 - - 256 KiB - 256 KiB + + Last Activity + Time passed since a chunk was downloaded/uploaded + 최근 활동 - - 512 KiB - 512 KiB + + Total Size + i.e. Size including unwanted data + 총 크기 + + + TrackerFiltersList - - 1 MiB - 1 MiB + + All (0) + this is for the tracker filter + 전체 (0) - - 2 MiB - 2 MiB + + Trackerless (0) + 트래커 없음 (0) - - 4 MiB - 4 MiB + + Error (0) + 오류 (0) - - 8 MiB - 8 MiB + + Warning (0) + 경고 (0) - - 16 MiB - 16 MiB + + + Trackerless (%1) + 트래커 없음 (%1) - - 32 MiB - 32 MiB + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - Calculate number of pieces: - 조각 개수 계산: + + + Error (%1) + 오류 (%1) - - Private torrent (Won't distribute on DHT network) - 비공개 토런트 (DHT 네트워크에 배포되지 않습니다) + + + Warning (%1) + 경고 (%1) - - Start seeding immediately - 즉시 배포 시작하기 + + Resume torrents + 토런트 재시작 - - Ignore share ratio limits for this torrent - 이 토런트에 공유 비율 제한 무시하기 + + Pause torrents + 토런트 일시중지 - - Optimize alignment - 파일 순서 정렬 + + Delete torrents + 토런트 삭제 - - Fields - 필드 + + + All (%1) + this is for the tracker filter + 전체 (%1) + + + TrackerList - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - 트랙커 티어 / 그룹을 빈 줄로 분리할 수 있습니다. - - - - Web seed URLs: - 웹 배포 URLs: - - - - Tracker URLs: - 트래커 URL: - - - - Comments: - 코멘트: - - - - Source: - 소스: - - - - Progress: - 진행률: - - - - Create Torrent - 토런트 생성 - - - - - - Torrent creation failed - 토런트 생성에 실패했습니다 - - - - Reason: Path to file/folder is not readable. - 이유: 파일/폴더의 경로를 읽을 수 없습니다. - - - - Select where to save the new torrent - 새 토런트를 저장할 위치를 선택하세요 - - - - Torrent Files (*.torrent) - 토런트 파일 (*.torrent) - - - - Reason: %1 - 이유: %1 - - - - Reason: Created torrent is invalid. It won't be added to download list. - 이유: 생성된 토런트가 무효합니다. 다운로드 목록에 추가되지 않습니다. - - - - Torrent creator - 토런트 생성기 - - - - Torrent created: - 토런트 생성 완료: - - - - TorrentInfo - - - File size exceeds max limit %1 - 파일 크기가 최대의 %1에 도달했습니다 - - - - Torrent file read error: %1 - 토렌트 파일 읽기 오류: %1 - - - - Torrent file read error: size mismatch - 토렌트 파일 읽기 오류: 크기 불일치 - - - - TorrentsController - - - Not contacted yet - 아직 연락 안됨 - - - - Updating... - 업데이트중... - - - - Working - 작동중 - - - - Not working - 작동 안함 - - - - Error: '%1' is not a valid torrent file. - 오류: '%1'은 올바른 토렌트 파일이 아닙니다. + + URL + URL - - - - - Torrent queueing must be enabled - 토렌트 대기열은 반드시 활성화 되어야 합니다 + + Status + 상태 - - Save path cannot be empty + + Received - - - Category cannot be empty - + + Seeds + 시드 - - Unable to create category - + + Peers + 피어 - - Unable to edit category + + Downloaded - Save path is empty - 저장 경로가 비어 있습니다 - - - - Cannot make save path - 저장 경로를 만들 수 없습니다 - - - - Cannot write to directory - 디렉토리에 쓸 수 없습니다 - - - - WebUI Set location: moving "%1", from "%2" to "%3" - 웹 UI 설정 위치: "%1"을 "%2"에서 "%3"으로 이동 - - - - Incorrect torrent name - 잘못된 토렌트 이름 - - - - - Incorrect category name - 잘못된 카테고리 이름 - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - 전체 (0) - - - - Trackerless (0) - 트래커 없음 (0) - - - - Error (0) - 오류 (0) - - - - Warning (0) - 경고 (0) - - - - - Trackerless (%1) - 트래커 없음 (%1) - - - - - Error (%1) - 오류 (%1) - - - - - Warning (%1) - 경고 (%1) - - - - Resume torrents - 토런트 재시작 - - - - Pause torrents - 토런트 일시중지 - - - - Delete torrents - 토런트 삭제 - - - - - All (%1) - this is for the tracker filter - 전체 (%1) + + Message + 메시지 - - - TrackerListWidget - - + + Working - 작동중 + 작동 중 - + Disabled 비활성화됨 - + This torrent is private 이 토런트는 비공개입니다 - + Updating... - 업데이트 중... + 업데이트 중.. - + Not working - 작동 안함 + 작동 안됨 - + Not contacted yet 아직 연락 안됨 - - - - - - - N/A - 이용 불가 + + Tracker URL: + 트래커 URL: - + Tracker editing - 트랙커 편집 - - - - Tracker URL: - 트래커 URL: + 트래커 편집 - - + + Tracker editing failed 트래커 편집 실패 - + The tracker URL entered is invalid. 입력한 트래커 URL이 무효합니다. - + The tracker URL already exists. 트래커 URL이 이미 존재합니다. - + Add a new tracker... 새 트래커 추가... - - Remove tracker - 트래커 제거 - - - + Copy tracker URL 트래커 URL 복사 - + Edit selected tracker URL 선택한 트래커 URL 편집 - + Force reannounce to selected trackers 선택한 트래커에 강제로 다시 알리기 - + Force reannounce to all trackers 모든 트래커에 강제로 다시 알리기 - - URL - URL - - - - Status - 상태 - - - - Received - 수신함 - - - - Seeds - 시드 - - - - Peers - 피어 - - - - Downloaded - 받기 완료됨 - - - - Message - 메시지 - - - - Column visibility - 세로줄 가시성 - - - - TrackerLoginDialog - - - - Tracker authentication - 트래커 인증 - - - - Tracker: - 트래커: - - - - Login - 로그인 - - - - Username: - 사용자명: - - - - Password: - 비밀번호: - - - - Log in - 로그인 + + Remove tracker + 트래커 제거 - TrackersAdditionDialog + TrackersAdditionDlg - + Trackers addition dialog 트래커 추가 대화상자 - + List of trackers to add (one per line): - 추가할 트래커 목록 (한 줄에 하나씩): + 추가할 트래커 목록 (한줄에 하나씩): - - + + µTorrent compatible list URL: µTorrent 호환 목록 URL: - + + I/O Error + I/O 오류 + + + + Error while trying to open the downloaded file. + 받은 파일을 여는 중 오류 발생. + + + No change 변경 없음 - + No additional trackers were found. 추가적인 트래커를 찾지 못했습니다. - + Download error - 내려받기 오류 + 다운로드 오류 - + The trackers list could not be downloaded, reason: %1 - 트래커 목록을 받을 수 없었습니다. 이유: %1 + 트래커 목록을 받을 수 없었습니다. 이유:%1 TransferListDelegate - + Downloading 받는 중 - + Downloading metadata used when loading a magnet link 메타데이터 받는 중 - + Allocating qBittorrent is allocating the files on disk 할당 중 - + Paused 일시중지됨 - + Queued i.e. torrent is queued 대기 중 - + Seeding Torrent is complete and in upload-only mode 배포 중 - + Stalled Torrent is waiting for download to begin 정체됨 - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] 다운로드 중 - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] 배포 중 - + Checking Torrent local data is being checked 검사 중 - + Queued for checking i.e. torrent is queued for hash checking 검사 대기 중 - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. 재시작 데이터 검사 중 - + Completed 완료됨 - - Moving - Torrent local data are being moved/relocated - 이동중 - - - + Missing Files 없는 파일 - + Errored torrent status, the torrent has an error 오류남 - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (%2 동안 배포함) - + %1 ago e.g.: 1h 20m ago %1 전 - - - TransferListFiltersWidget - - - Status - 상태 - - - - Categories - 카테고리 - - - - Tags - 태그 - - - - Trackers - 트래커 - - - - TransferListModel - - - Name - i.e: torrent name - 이름 - - - - Size - i.e: torrent size - 크기 - - - - Done - % Done - 완료 - - - - Status - Torrent status (e.g. downloading, seeding, paused) - 상태 - - - - Seeds - i.e. full sources (often untranslated) - 시드 - - - - Peers - i.e. partial sources (often untranslated) - 피어 - - - - Down Speed - i.e: Download speed - 내려받기 속도 - - - - Up Speed - i.e: Upload speed - 올리기 속도 - - - - Ratio - Share ratio - 비율 - - - - ETA - i.e: Estimated Time of Arrival / Time left - 남은 시간 - - - - Category - 카테고리 - - - - Tags - 태그 - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - 추가일 - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - 완료일 - - - - Tracker - 트래커 - - - - Down Limit - i.e: Download limit - 내려받기 제한 - - - - Up Limit - i.e: Upload limit - 올리기 제한 - - - - Downloaded - Amount of data downloaded (e.g. in MB) - 다운로드 됨 - - - - Uploaded - Amount of data uploaded (e.g. in MB) - 업로드 됨 - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - 세션 다운로드 - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - 세션 업로드 - - - - Remaining - Amount of data left to download (e.g. in MB) - 남음 - - - - Time Active - Time (duration) the torrent is active (not paused) - 활성 시간 - - - - Save path - Torrent save path - 저장 경로 - - - - Completed - Amount of data completed (e.g. in MB) - 완료됨 - - - - Ratio Limit - Upload share ratio limit - 비율 제한 - + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - 최근 본 완료 + + Status + 상태 - - Last Activity - Time passed since a chunk was downloaded/uploaded - 최근 활동 + + Categories + 카테고리 - - Total Size - i.e. Size including unwanted data - 전체 크기 + + Trackers + 트래커 TransferListWidget - + Column visibility 세로줄 가시성 - + Choose save path 저장 경로 선택 - + Torrent Download Speed Limiting 토런트 다운로드 속도 제한 - + Torrent Upload Speed Limiting 토런트 업로드 속도 제한 - + Recheck confirmation 재검사 확인 - + Are you sure you want to recheck the selected torrent(s)? 선택한 토런트를 재검사할까요? - + Rename 이름 바꾸기 - + New name: 새 이름: - + Resume Resume/start the torrent 재시작 - + Force Resume Force Resume/start the torrent 강제 재시작 - + Pause Pause the torrent 일시중지 - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - 위치 설정: "%1" 이동, "%2"에서 "%3"으로 - - - - Add Tags - 태그 추가 - - - - Remove All Tags - 모든 태그 제거 - - - - Remove all tags from selected torrents? - 선택한 토런트에서 모든 태그를 제거할까요? + + New Category + 새 카테고리 - - Comma-separated tags: - 쉼표로 구분된 태그: + + Category: + 카테고리: - - Invalid tag - 무효한 태그 + + Invalid category name + 무효한 카테고리 이름 - - Tag name: '%1' is invalid - 태그 이름: '%1'은 무효합니다 + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + 카테고리 이름은 '\'를 포함하면 안됩니다. +카테고리 이름은 '/'로 시작/끝나면 안됩니다. +카테고리 이름은 연속된 '//'를 포함하면 안됩니다. - + Delete Delete the torrent 삭제 - + Preview file... 파일 미리보기... - + Limit share ratio... 공유 비율 제한... - + Limit upload rate... 업로드 속도 제한... - + Limit download rate... 다운로드 속도 제한... - + Open destination folder 대상 폴더 열기 - + Move up i.e. move up in the queue 위로 이동 - + Move down i.e. Move down in the queue 아래로 이동 - + Move to top i.e. Move to top of the queue 최상단으로 이동 - + Move to bottom i.e. Move to bottom of the queue 최하단으로 이동 - + Set location... 위치 지정... - - Force reannounce - 강제로 다시 알리기 - - - + Copy name 이름 복사 - - Copy hash - 복사 해쉬 - - - + Download first and last pieces first 첫 번째와 마지막 조각을 먼저 다운로드 - + Automatic Torrent Management 자동 토런트 관리 - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category 자동 모드는 관련된 카테고리로 저장 경로와 같은 다양한 토런트 속성을 결정하는 것을 의미합니다 - + Category 카테고리 - + New... New category... 새... - + Reset Reset category 초기화 - - Tags - 태그 - - - - Add... - Add / assign multiple tags... - 추가... - - - - Remove All - Remove all tags - 모두 제거 - - - + Priority 우선순위 - + Force recheck 강제로 다시 검사 - + Copy magnet link 마그넷 링크 복사 - + Super seeding mode 수퍼 배포 모드 - + Rename... 이름 바꾸기... - + Download in sequential order 차례대로 다운로드 - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting 토런트 업로드/다운로드 비율 제한 - - Use global share limit - 전역 공유 한계 사용하기 + + Use global ratio limit + 전역 비율 제한 사용하기 - - - + + + buttonGroup 버튼그룹 - - Set no share limit - 공유 한계 없음 설정하기 + + Set no ratio limit + 비율 제한 없음 설정 - - Set share limit to - 공유 한계 제한: + + Set ratio limit to + 다음 비율로 제한 + + + WebApplication - - ratio - 비율 + + Incorrect category name + 부정확한 카테고리 이름 + + + + WebUI + + + The Web UI is listening on port %1 + 웹 UI 가 포트 %1에서 수신 대기 중입니다 - - minutes - + + Web UI Error - Unable to bind Web UI to port %1 + 웹 UI 오류 - %1 포트에 웹 UI를 바인딩할 수 없습니다 + + + + about + + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Qt 툴킷과 libtorrent-rasterbar 기반의 C++로 짠 고급 비트토런트 클라이언트입니다. + + + + Copyright %1 2006-2016 The qBittorrent project + 저작권 %1 2006-2016 큐빗토런트 프로젝트 + + + + Home Page: + 홈페이지: - - No share limit method selected - 선택한 공유 제한 방법이 없습니다 + + Forum: + 포럼: - - Please select a limit method first - 제한 방법을 먼저 선택하세요 + + Bug Tracker: + 버그 트래커: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - 파이썬 탐지됨, 버전: %1 + + Add Peers + 피어 추가 - - Python not detected - 파이썬을 찾지 못했습니다 + + List of peers to add (one per line): + 추가할 피어 목록 (한 줄에 하나씩): + + + + Format: IPv4:port / [IPv6]:port + 형식: IPv4:포트 / [IPv6]:포트 - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - 사용할 수 없는 파일 형식, 완전한 파일만 허용됩니다. + + + Tracker authentication + 트래커 인증 - - Symlinks inside alternative UI folder are forbidden. - 대체 UI 폴더 내의 심볼릭 링크는 금지되어 있습니다. + + Tracker: + 트래커: - - Exceeded the maximum allowed file size (%1)! - 최대 허용 파일 크기 (%1)를 초과했습니다! + + Login + 로그인 - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - 웹 UI: 오리진 헤더 및 타겟 원점 불일치! 소스 IP: '%1'. 오리진 헤더: '%2'. 타겟 오리진: '%3' + + Username: + 사용자명: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - 웹 UI: 리퍼러 헤더 및 타겟 원점 불일치! 소스 IP: '%1'. 리퍼러 헤더: '%2'. 타겟 오리진: '%3' + + Password: + 비밀번호: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - 웹 UI: 무효한 호스트 헤더, 포트 불일치. 소스 IP 요청: '%1'. 서버 포트: '%2'. 수신된 호스트 헤더: '%3' + + Log in + 로그인 - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - 웹 UI: 무효한 호스트 헤더. 소스 IP 요청: '%1'. 수신된 호스트 헤더: '%2' + + Cancel + 취소 - WebUI + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + 삭제 확인 - 큐빗토런트 + + + + Remember choice + 선택 기억 + + + + Also delete the files on the hard disk + 하드 디스크 상의 파일도 삭제 + + + + confirmShutdownDlg + + + Don't show again + 다시 보지 않음 + + + + createTorrentDialog + + + Cancel + 취소 + + + + Torrent Creation Tool + 토런트 생성 도구 + + + + Torrent file creation + 토런트 파일 만들기 + + + + Add file + 파일 추가 + + + + Add folder + 폴더 추가 + + + + File or folder to add to the torrent: + 토런트에 추가할 파일 또는 폴더: + + + + Tracker URLs: + 트래커 URL: + + + + Web seeds urls: + 웹 시드 URL: + + + + Comment: + 코멘트: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + 트래커 티어 / 그룹을 빈 줄로 구분할 수 있습니다. + + + + Piece size: + 조각 크기: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + 자동 + + + + Private (won't be distributed on DHT network if enabled) + 비공개 (활성화시 DHT 네트워크에 배포되지 않습니다) + - - Web UI: HTTPS setup successful - 웹 UI: HTTPS 설정에 성공했습니다 + + Start seeding after creation + 생성 후 배포 시작하기 - - Web UI: HTTPS setup failed, fallback to HTTP - 웹 UI: HTTPS 설정에 실패해서, HTTP를 사용합니다 + + Ignore share ratio limits for this torrent + 이 토런트에 공유 비율 제한 무시하기 + + + + Create and save... + 생성 후 저장하기... + + + + Progress: + 진행: + + + + downloadFromURL + + + Add torrent links + 토런트 링크 추가 + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + 한 줄에 한 개 (HTTP 링크, 마그넷 링크와 정보 해쉬를 지원합니다) + + + + Download + 다운로드 + + + + Cancel + 취소 + + + + Download from urls + URL에서 다운로드 + + + + No URL entered + 입력한 URL 없음 - - Web UI: Now listening on IP: %1, port: %2 - 웹 UI: 현재 수신 중인 IP: %1, 포트: %2 + + Please type at least one URL. + 적어도 하나의 URL을 입력해주세요. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - 웹 UI: 바인딩 안 되는 IP: %1, 포트: %2. 이유: %3 + + Crash info + 충돌 정보 fsutils - + + + + + Downloads 다운로드 @@ -9766,100 +8746,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + 파이썬을 찾지 못했습니다 + + + + Python version: %1 + 파이썬 버전: %1 + + + /s per second /초 - + %1h %2m e.g: 3hours 5minutes %1시 %2분 - + %1d %2h e.g: 2days 10hours %1일 %2시 - + Unknown Unknown (size) 알 수 없음 - + qBittorrent will shutdown the computer now because all downloads are complete. 모든 다운로드가 끝나서 큐빗토런트는 이제 시스템을 종료할 것입니다. - + < 1m < 1 minute < 1분 - + %1m e.g: 10minutes %1분 + + + Working + 동작 중 + + + + Updating... + 업데이트 중... + + + + Not working + 작동 안됨 + + + + Not contacted yet + 아직 연락 안됨 + preview - + Preview selection 미리보기 선택 - + The following files support previewing, please select one of them: 다음 파일은 미리보기를 지원합니다. 다음 중 하나를 선택하세요: + + + Preview + 미리보기 + + + + Cancel + 취소 + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_lt.ts qbittorrent-3.3.15/src/lang/qbittorrent_lt.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_lt.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_lt.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent Apie qBittorrent - + About Apie - + Author Autorius - - Current maintainer - Dabartinis prižiūrėtojas - - - - Greece - Graikija - - - - + + Nationality: Tautybė: - - + + + Name: + Vardas: + + + + E-mail: El. paštas: - - - Name: - Vardas: + + Greece + Graikija - - Original author - Pradinis autorius + + Current maintainer + Dabartinis palaikytojas - - France - Prancūzija + + Original author + Pirmutinis autorius - + Special Thanks Ypatingos padėkos - + Translators Vertėjai - - License - Licencija - - - + Libraries Bibliotekos - + qBittorrent was built with the following libraries: qBittorrent buvo sukurta su šiomis bibliotekomis: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - Pažangus BitTorrent klientas, parašytas C++ programavimo kalba, naudojant Qt bei libtorrent-rasterbar bibliotekas. - - - - Copyright %1 2006-2018 The qBittorrent project - Autorių teisės %1 2006-2018 qBittorrent projektas - - - - Home Page: - Svetainė internete: - - - - Forum: - Diskusijų forumas: + + France + Prancūzija - - Bug Tracker: - Klaidų seklys: + + License + Licencija @@ -115,57 +90,67 @@ Išsaugoti į - + + Browse... + Naršyti... + + + + Set as default save path + Nustatyti kaip numatytąją išsaugojimo vietą + + + Never show again Daugiau neberodyti - + Torrent settings Torento nuostatos - + Set as default category Nustatyti kaip numatytąją kategoriją - + Category: Kategorija: - + Start torrent Paleisti torentą - + Torrent information Torento informacija - + Skip hash check - Praleisti maišos tikrinimą + Praleisti maišos rakto tikrinimą - + Size: Dydis: - + Hash: Maiša: - + Comment: Komentaras: - + Date: Data: @@ -190,117 +175,89 @@ Automatinė - - Remember last used save path - Prisiminti paskiausiai naudotą išsaugojimo kelią - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog Kai pažymėta, .torrent failas nebus ištrinamas, nepaisant nustatymų, esančių parinkčių dialogo "Atsiuntimų" puslapyje. - + Do not delete .torrent file Neištrinti .torrent failo - - Create subfolder - Sukurti poaplankį - - - - Download in sequential order - Siųsti dalis iš eilės - - - - Download first and last pieces first - Visų pirma siųsti pirmas ir paskutines dalis - - - + Normal Įprasta - + High Aukšta - + Maximum Aukščiausia - + Do not download Nesiųsti - - - + + + I/O Error I/O klaida - + Invalid torrent Netaisyklingas torentas - - Renaming - Pervadinimas - - - - - Rename error - Pervadinimo klaida + + + + + Already in download list + Jau yra siuntimų sąraše - - The name is empty or contains forbidden characters, please choose a different one. - Pavadinimas tuščias arba jame yra uždraustų simbolių, prašome pasirinkti kitą pavadinimą. - - - + Not Available This comment is unavailable Neprieinama - + Not Available This date is unavailable Neprieinama - + Not available Neprieinama - + Invalid magnet link Netaisyklinga magnet nuoroda - + The torrent file '%1' does not exist. Torento failo "%1" nėra. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. Nepavyksta iš disko perskaityti torento failo "%1". Tikriausiai, jūs neturite pakankamai leidimų. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ Klaida: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torentas jau yra atsiuntimų sąraše. Seklių sąrašai nebuvo sulieti, nes tai yra privatus torentas. + + + + Torrent is already in download list. Trackers were merged. + Torentas jau yra atsiuntimų sąraše. Seklių sąrašai buvo sulieti. + + + + + Cannot add torrent + Nepavyko pridėti torento + + + + Cannot add this torrent. Perhaps it is already in adding state. + Nepavyko pridėti šio torento. Galbūt, jis jau yra pridėjimo būsenoje. + + + This magnet link was not recognized Ši magnet nuoroda neatpažinta - + + Magnet link is already in download list. Trackers were merged. + Magnet nuoroda jau yra atsiuntimų sąraše. Seklių sąrašai buvo sulieti. + + + + Cannot add this torrent. Perhaps it is already in adding. + Nepavyko pridėti šio torento. Galbūt, jis jau yra pridedamas. + + + Magnet link Magnet nuoroda - + Retrieving metadata... Atsiunčiami metaduomenys... - + Not Available This size is unavailable. Neprieinama - + Free space on disk: %1 Laisva vieta diske: %1 - + + Choose save path - Pasirinkite išsaugojimo kelią - - - - - - - - - Torrent is already present - Torentas jau yra - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - Torrentas "%1" jau yra siuntimų sąraše. Seklių sąrašai nebuvo sulieti, nes tai yra privatus torentas. - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - Torrentas "%1" jau yra siuntimų sąraše. Seklių sąrašai nebuvo sulieti. + Pasirinkite išsaugojimo vietą - - Torrent is already queued for processing. - Torentas jau laukia eilėje apdorojimui. + + Rename the file + Pervadinti failą - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - Magnet nuoroda "%1" jau yra siuntimų sąraše. Seklių sąrašai buvo sulieti. + + New name: + Naujas vardas: - - Magnet link is already queued for processing. - Magnet nuoroda jau laukia eilėje apdorojimui. + + + The file could not be renamed + Failo pervadinti nepavyko - - New name: - Naujas vardas: + + This file name contains forbidden characters, please choose a different one. + Šiame failo varde yra neleistinų simbolių, pasirinkite kitokį. - - + + This name is already in use in this folder. Please use a different name. Šis vardas šiame aplanke jau naudojamas. Pasirinkite kitokį vardą. - + The folder could not be renamed Aplanko pervadinti nepavyko - + Rename... Pervadinti... - + Priority Svarba - + Invalid metadata Netaisyklingi metaduomenys - + Parsing metadata... Analizuojami metaduomenys... - + Metadata retrieval complete Metaduomenų atsiuntimas baigtas - + Download Error Atsiuntimo klaida @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Podėlio diske dydis + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Išeities prievadai (Min.) [0: Išjungta] - + Outgoing ports (Max) [0: Disabled] Išeities prievadai (Maks.) [0: Išjungta] - + Recheck torrents on completion Pertikrinti torentus baigus atsiuntimą - + Transfer list refresh interval Siuntimų sąrašo atnaujinimo intervalas - + ms milliseconds ms - + Setting Nuostata - + Value Value set for this setting Reikšmė - - - (disabled) - (išjungta) - - - + (auto) (automatinis) - - min - minutes - min. - - - + All addresses Visi adresai - + qBittorrent Section qBittorrent sekcija - - + + Open documentation Atverti žinyną - + libtorrent Section libtorrent sekcija - - Asynchronous I/O threads - Asinchroninės I/O gijos - - - - Disk cache - Disko podėlis - - - + s seconds s - + Disk cache expiry interval Podėlio diske galiojimo trukmė - + Enable OS cache Įgalinti operacinės sistemos spartinančiąją atmintinę - - Guided read cache - Valdomas skaitymo podėlis - - - - Coalesce reads & writes - Sujungti skaitymai ir rašymai - - - - Send upload piece suggestions - Siųsti išsiuntimo dalių pasiūlymus - - - - - KiB - KiB - - - - Send buffer watermark - Siųsti buferio vandenženklį - - - - Send buffer low watermark - Siųsti buferio žemą vandenženklį - - - - Send buffer watermark factor - Siųsti buferio vandenženklio faktorių - - - - Prefer TCP - Teikti pirmenybę TCP - - - - Peer proportional (throttles TCP) - Proporcionalus siuntėjams (uždusina TCP) - - - - Allow multiple connections from the same IP address - Leisti kelis sujungimus iš to paties IP adreso + + m + minutes + min. - + Resolve peer countries (GeoIP) Gauti siuntėjų šalis (GeoIP) - + Resolve peer host names Gauti siuntėjų stočių vardus - + Strict super seeding Griežtas super skleidimas - + Network Interface (requires restart) Tinklo sąsaja (būtina paleisti iš naujo) - + Optional IP Address to bind to (requires restart) Nebūtinas IP adresas su kuriuo susieti (būtina paleisti iš naujo) - + Listen on IPv6 address (requires restart) Klausytis ties IPv6 adresu (būtina paleisti iš naujo) - + Display notifications Rodyti pranešimus - + Display notifications for added torrents Rodyti pranešimus pridedamiems torentams - + Download tracker's favicon Atsisiųsti seklio svetainės piktogramą - - Save path history length - Išsaugojimo kelio istorijos ilgis - - - - Fixed slots - Fiksuoti prisijungimai - - - - Upload rate based - Pagrįsta išsiuntimo greičiu - - - - Upload slots behavior - Išsiuntimo prisijungimų elgsena - - - - Round-robin - Ratelio algoritmas - - - - Fastest upload - Greičiausias išsiuntimas - - - - Anti-leech - Anti-siuntėjų - - - - Upload choking algorithm - Išsiuntimo prismaugimo algoritmas - - - + Confirm torrent recheck Patvirtinti torentų pertikrinimą - - Confirm removal of all tags - Patvirtinti visų žymių šalinimą - - - - Always announce to all trackers in a tier - Visada siųsti atnaujinimus visiems sekliams pakopoje + Exchange trackers with other peers + Keistis sekliais su kitais siuntėjais - - Always announce to all tiers - Visada siųsti atnaujinimus visoms pakopoms + + Always announce to all trackers + Visada siųsti atnaujinimus visiems sekliams - + Any interface i.e. Any network interface Bet kokia sąsaja - + Save resume data interval How often the fastresume file is saved. Pratęstų duomenų išsaugojimo intervalas - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - %1-TCP maišytos veiksenos algoritmas - - - + Maximum number of half-open connections [0: Unlimited] Didžiausias pusiau atvirų prisijungimų skaičius [0: Neribotas] - + IP Address to report to trackers (requires restart) Sekliams siunčiamas IP adresas (būtina paleisti iš naujo) - + Enable embedded tracker Įjungti įtaisytąjį seklį - + Embedded tracker port Įtaisytojo seklio prievadas - + Check for software updates Tikrinti, ar yra atnaujinimų - + Use system icon theme Naudoti sistemos piktogramas @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 paleista - + Torrent: %1, running external program, command: %2 Torentas: %1, vykdoma išorinė programa, komanda: %2 - - Torrent name: %1 - Torento pavadinimas: %1 - - - - Torrent size: %1 - Torento dydis: %1 - - - - Save path: %1 - Išsaugojimo kelias: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Torentas atsiųstas per %1. - - - - Thank you for using qBittorrent. - Ačiū, kad naudojatės qBittorrent. - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] "%1" atsiuntimas užbaigtas + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torentas: %1, išorinės programos komanda buvo vykdoma per ilgai (trukmė > %2), vykdymas nepavyko. - + Torrent: %1, sending mail notification Torentas: %1, siunčiamas pašto pranešimas - + Information Informacija - - To control qBittorrent, access the Web UI at %1 - Norėdami valdyti qBittorrent, prisijunkite prie tinklo naudotojo sąsajos, adresu %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + Kad valdytumėte qBittorrent, prisijunkite prie tinklo naudotojo sąsajos adresu http://localhost:%1 - + The Web UI administrator user name is: %1 Tinklo naudotojo sąsajos administratoriaus naudotojo vardas yra: %1 - + The Web UI administrator password is still the default one: %1 Tinklo naudotojo sąsajos administratoriaus slaptažodis vis dar yra numatytasis: %1 - + This is a security risk, please consider changing your password from program preferences. Yra saugumo spragos rizika, pasikeiskite savo slaptažodį programos nustatymuose. - + Saving torrent progress... Išsaugoma torento eiga... - - - Portable mode and explicit profile directory options are mutually exclusive - Perkeliamos veiksenos ir išreikštinio profilio katalogo parinktys yra viena kitą paneigiančios - - - - Portable mode implies relative fastresume - Perkeliama veiksena numano santykinį greitąjį pratęsimą - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - Tinklo API prisijungimo nesėkmė. Priežastis: IP buvo užblokuotas, IP: %1, naudotojo vardas: %2 - - - - Your IP address has been banned after too many failed authentication attempts. - Jūsų IP adresas buvo užblokuotas po per didelio kiekio nepavykusių atpažinimo bandymų. - - - - WebAPI login success. IP: %1 - Tinklo API prisijungimas pavyko. IP: %1 - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - Tinklo API prisijungimo nesėkmė. Priežastis: neteisingi prisijungimo duomenys, bandymas nr.: %1, IP: %2, naudotojo vardas: %3 - AutomatedRssDownloader - + Save to: Išsaugoti į: @@ -861,817 +658,680 @@ RSS atsiuntimas - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - Automatinis RSS torentų atsiuntimas dabar yra išjungtas! Jūs galite jį įjungti programos nustatymuose. + + Enable Automated RSS Downloader + Įjungti automatizuotą RSS atsiuntimą - + Download Rules Atsiuntimo taisyklės - + Rule Definition Taisyklės apibrėžimas - + Use Regular Expressions - Naudoti reguliariuosius reiškinius - - - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - Išmanusis filtrų epizodas tikrins epizodų numerį, kad neleistų dublikatų atsiuntimo. -Palaiko formatus: S01E01, 1x1, 2017.01.01 ir 01.01.2017 (Datos formatai taip pat palaikomi - kaip skirtukai) - - - - Use Smart Episode Filter - Naudoti išmanųjį epizodų filtrą + Naudoti reguliariąsias išraiškas - + Must Contain: Privalo turėti žodį: - + Must Not Contain: Privalo neturėti žodžio: - + Episode Filter: Epizodų filtras: - + Assign Category: Priskirti kategoriją: - + Save to a Different Directory Išsaugoti kitame kataloge - + Ignore Subsequent Matches for (0 to Disable) ... X days Nepaisyti paeilinių atitikimų (0, kad būtų išjungta) - + Disabled - Išjungta + Išjungta - + days dienų - + Add Paused: Pridėti pristabdytus: - + Use global settings Naudoti visuotinius nustatymus - + Always Visada - + Never Niekada - + Apply Rule to Feeds: Taikyti taisyklę šiems kanalams: - + Matching RSS Articles Atitinkantys RSS įrašai - + &Import... &Importuoti... - + &Export... &Eksportuoti... - + Matches articles based on episode filter. - Atitinka epizodų filtru pagrįstus įrašus. + Atitinka, epizodų filtru pagrįstus, filtrus. - + Example: Pavyzdys: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match atitiks pirmojo sezono 2, 5, nuo 8 iki 15, 30 ir tolesnius epizodus - + Episode filter rules: Epizodų filtravimo taisyklės: - + Season number is a mandatory non-zero value Sezono numeris yra privaloma nenulinė reikšmė - + Episode number is a mandatory non-zero value + Epizodo numeris yra privaloma nenulinė reikšmė + + + Filter must end with semicolon Filtras privalo užsibaigti kabliataškiu - + Three range types for episodes are supported: Yra palaikomi trys epizodų rėžiai: - + Single number: <b>1x25;</b> matches episode 25 of season one Pavienis skaičius: <b>1x25;</b> atitinka 25, pirmojo sezono, epizodą - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Normalus rėžis: <b>1x25-40;</b> atitinka pirmojo sezono epizodus nuo 25 iki 40 - - Episode number is a mandatory positive value - Epizodo numeris yra privaloma teigiama reikšmė - - - - Rules - Taisyklės + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Begalinis rėžis: <b>1x25-;</b> atitinka pirmojo sezono epizodus nuo 25 ir toliau - - Rules (legacy) - Taisyklės (pasenusios) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Begalinis rėžis: <b>1x25-;</b> atitinka pirmojo sezono epizodus nuo 25 ir toliau bei visus vėlesnių sezonų epizodus + - + Last Match: %1 days ago Paskutinis atitikimas: prieš %1 dienų - + Last Match: Unknown Paskutinis atitikimas: Nežinoma - + New rule name Naujas taisyklės vardas - + Please type the name of the new download rule. Įveskite vardą naujai atsiuntimo taisyklei. - - + + Rule name conflict Taisyklių vardų nesuderinamumas - - + + A rule with this name already exists, please choose another name. Taisyklė tokiu vardu jau egzistuoja, pasirinkite kitokį vardą. - + Are you sure you want to remove the download rule named '%1'? Ar tikrai norite pašalinti atsiuntimo taisyklę, pavadinimu "%1"? - + Are you sure you want to remove the selected download rules? Ar tikrai norite pašalinti pasirinktas atsiuntimo taisykles? - + Rule deletion confirmation Taisyklių pašalinimo patvirtinimas - + Destination directory Išsaugojimo aplankas - + Invalid action Netinkamas veiksmas - + The list is empty, there is nothing to export. Sąrašas tuščias, nėra ką eksportuoti. - - Export RSS rules - Eksportuoti RSS taisykles + + Where would you like to save the list? + Kur norėtumėte išsaugoti sąrašą? - - + + Rules list (*.rssrules) + Taisyklių sąrašas (*.rssrules) + + + I/O Error I/O klaida - - Failed to create the destination file. Reason: %1 - Nepavyko sukurti paskirties failo. Priežastis: %1 + + Failed to create the destination file + Nepavyko sukurti išvesties failo - - Import RSS rules - Importuoti RSS taisykles + + Please point to the RSS download rules file + Nurodykite kelią iki RSS atsiuntimo taisyklių failo - - Failed to open the file. Reason: %1 - Nepavyko atverti failo. Priežastis: %1 + + Rules list + Taisyklių sąrašas - + Import Error - Importavimo klaida + Įkėlimo klaida - - Failed to import the selected rules file. Reason: %1 - Nepavyko importuoti pasirinkto taisyklių failo. Priežastis: %1 + + Failed to import the selected rules file + Nepavyko įkelti nurodyto taisyklių failo - + Add new rule... Pridėti naują taisyklę... - + Delete rule Ištrinti taisyklę - + Rename rule... Pervadinti taisyklę... - + Delete selected rules Ištrinti pasirinktas taisykles - - Clear downloaded episodes... - Išvalyti atsisiųstus epizodus... - - - + Rule renaming Taisyklių pervadinimas - + Please type the new rule name Įveskite naują taisyklės vardą - - Clear downloaded episodes - Išvalyti atsisiųstus epizodus - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - Ar tikrai norite išvalyti pasirinktos taisyklės atsisiųstų epizodų sąrašą? - - - - Regex mode: use Perl-compatible regular expressions - Reguliariųjų reiškinių veiksena: naudoti su Perl suderinamus reguliariuosius reiškinius + + Regex mode: use Perl-like regular expressions + Regex režimas: naudoti Perl stiliaus reguliariąsias išraiškas - - - Position %1: %2 - Pozicija %1: %2 - - - + Wildcard mode: you can use - Pakaitos simbolių veiksena: galite naudoti + - + ? to match any single character - ? norėdami atitikti bet kurį vieną simbolį + - + * to match zero or more of any characters - * norėdami atitikti nulį ar daugiau bet kokių simbolių + - + Whitespaces count as AND operators (all words, any order) - Tarpai yra laikomi IR operatoriais (visi žodžiai, bet kokia tvarka) + - + | is used as OR operator - | yra naudojamas kaip AR operatorius + - + If word order is important use * instead of whitespace. - Jeigu yra svarbi žodžių tvarka, vietoj tarpų naudokite * + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Reiškinys su tuščia %1 sąlyga (pvz., %2) + - + will match all articles. - atitiks visus įrašus. + - + will exclude all articles. - išskirs visus įrašus. - - - - BanListOptionsDialog - - - List of banned IP addresses - Uždraustų IP adresų sąrašas - - - - Ban IP - Uždrausti IP - - - - Delete - Ištrinti - - - - - Warning - Įspėjimas + - - The entered IP address is invalid. - Įvestas IP adresas yra netaisyklingas. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Pakaitos simbolių režimas: galite naudoti <ul><li>? vietoje vieno bet kokio simbolio</li><li>* vietoje nulio ar daugiau bet kokių simbolių</li><li>Tarpai laikomi logine operacija AND</li></ul> - - The entered IP is already banned. - Įvestas IP adresas jau yra uždraustas. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Pakaitos simbolių režimas: galite naudoti <ul><li>? vietoje vieno bet kokio simbolio</li><li>* vietoje nulio ar daugiau bet kokių simbolių</li><li>| naudojamas loginei operacijai ARBA</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support Būtina paleisti programą iš naujo norint pakeisti PeX palaikymą - - Could not get GUID of configured network interface. Binding to IP %1 - Nepavyko gauti konfigūruotos tinklo sąsajos GUID. Susiejama su IP %1 - - - + Embedded Tracker [ON] Įtaisytas seklys [ĮJUNGTAS] - + Failed to start the embedded tracker! Nepavyko paleisti įtaisytojo seklio! - + Embedded Tracker [OFF] Įtaisytasis seklys [IŠJUNGTAS] - + + '%1' reached the maximum ratio you set. Removing... + "%1" pasiekė didžiausią jūsų nustatytą dalinimosi santykį. Šalinama... + + + + '%1' reached the maximum ratio you set. Pausing... + "%1" pasiekė didžiausią jūsų nustatytą dalinimosi santykį. Pristabdoma... + + + System network status changed to %1 e.g: System network status changed to ONLINE Sistemos tinklo būsena pasikeitė į %1 - + ONLINE PRISIJUNGTA - + OFFLINE ATSIJUNGTA - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding Pasikeitė %1 tinklo konfigūracija, iš naujo įkeliamas seanso susiejimas - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. Sukonfigūruotos tinklo sąsajos adresas %1 nėra teisingas. - - + Encryption support [%1] Šifravimo palaikymas [%1] - - + FORCED PRIVERSTINAI - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 nėra taisyklingas IP adresas ir, taikant uždraustų adresų sąrašą, buvo atmestas. - - - - + Anonymous mode [%1] Anoniminė veiksena [%1] - + Unable to decode '%1' torrent file. Nepavyko iškoduoti "%1" torento failo. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Rekursyvus failo "%1", įdėto į torentą "%2", atsiuntimas - + Queue positions were corrected in %1 resume files - Eilės pozicijos buvo pataisytos %1 pratęstuose failuose + - + Couldn't save '%1.torrent' Nepavyko išsaugoti "%1.torrent" - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - "%1" buvo pašalintas iš siuntimų sąrašo. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - "%1" buvo pašalintas iš siuntimų sąrašo bei standžiojo disko. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - "%1" buvo pašalintas iš siuntimų sąrašo, tačiau failų ištrinti nepavyko. Klaida: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. nes %1 yra išjungta. - + because %1 is disabled. this peer was blocked because TCP is disabled. nes %1 yra išjungta. - + URL seed lookup failed for URL: '%1', message: %2 URL skleidėjo patikrinimas nepavyko adresu: "%1", pranešimas: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent nepavyko klausytis ties įrenginio %1 prievadu: %2/%3. Priežastis: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' buvo pašalintas iš siuntimų sąrašo bei kietojo disko. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' buvo pašalintas iš siuntimų sąrašo. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Atsiunčiamas '%1', luktelkite... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent bando klausytis ties visų įrenginių prievadu: %1 - + The network interface defined is invalid: %1 Ši tinklo sąsaja yra netinkama: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent bando klausytis ties įrenginio %1 prievadu: %2 - - Peer ID: - Siuntėjo ID: - - - - HTTP User-Agent is '%1' - HTTP naudotojo agentas yra "%1" - - - - + DHT support [%1] DHT palaikymas [%1] - - - - - - - - - + + + + ON ĮJUNGTA - - - - - - - - - + + + + OFF IŠJUNGTA - - + Local Peer Discovery support [%1] Vietinių siuntėjų aptikimo palaikymas [%1] - - PeX support [%1] - PeX palaikymas [%1] - - - - '%1' reached the maximum ratio you set. Removed. - "%1" pasiekė didžiausią jūsų nustatytą dalinimosi santykį. Pašalintas. - - - - '%1' reached the maximum ratio you set. Paused. - "%1" pasiekė didžiausią jūsų nustatytą dalinimosi santykį. Pristabdytas. - - - - '%1' reached the maximum seeding time you set. Removed. - "%1" pasiekė didžiausią jūsų nustatytą skleidimo laiką. Pašalintas. - - - - '%1' reached the maximum seeding time you set. Paused. - "%1" pasiekė didžiausią jūsų nustatytą skleidimo laiką. Pristabdytas. + Restart is required to toggle Tracker Exchange support + Būtina paleisti programą iš naujo, norint perjungti seklių apsikeitimo palaikymą - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorent nepavyko rasti %1 vietinio adreso klausymuisi - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent nepavyko pasiklausyti ties visų sąsajų prievadu: %1. Priežastis: %2. - + Tracker '%1' was added to torrent '%2' Seklys '%1' buvo pridėtas prie torento '%2' - + Tracker '%1' was deleted from torrent '%2' Seklys '%1' buvo ištrintas iš torento '%2' - + URL seed '%1' was added to torrent '%2' URL šaltinis '%1' buvo pridėtas prie torento '%2' - + URL seed '%1' was removed from torrent '%2' URL šaltinis '%1' buvo pašalintas iš torento '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Nepavyko pratęsti torento "%1". - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Nurodytas IP filtras sėkmingai įkeltas. %1 taisyklės pritaikytos. - + Error: Failed to parse the provided IP filter. Klaida: Nepavyko įkelti nurodyto IP filtro. - - '%1' restored. - 'torrent name' restored. - "%1" atkurtas. - - - + Couldn't add torrent. Reason: %1 Nepavyko pridėti torento. Priežastis: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' buvo pratęstas (spartus pratęsimas) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' buvo pridėtas į siuntimų sąrašą. - + An I/O error occurred, '%1' paused. %2 Įvyko I/O klaida, '%1' pristabdytas. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Prievadų išdėstymas nesėkmingas, žinutė: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Prievadų išdėstymas sėkmingas, žinutė: %1 - + due to IP filter. this peer was blocked due to ip filter. dėl IP filtro. - + due to port filter. this peer was blocked due to port filter. dėl prievadų filtro. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. dėl i2p maišytos veiksenos apribojimų. - + because it has a low port. this peer was blocked because it has a low port. nes jo žemas prievadas. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent sėkmingai klausosi ties įrenginio %1 prievadu: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 Išorinis IP: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - naujo torento failo sukūrimas patyrė nesėkmę - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - Visų pirma atsisiųsti pirmą ir paskutinę dalį: %1, torentas: "%2" - - - - On - Įjungta - - - - Off - Išjungta - - - - Successfully moved torrent: %1. New path: %2 - Torentas sėkmingai perkeltas: %1. Naujas kelias: %2 - - - + Could not move torrent: '%1'. Reason: %2 - Nepavyko perkelti torento: "%1". Priežastis: %2 + Nepavyko perkelti torento: '%1'. Priežastis: %2 - + File sizes mismatch for torrent '%1', pausing it. Failų dydžio nesutapimas torente "%1", jis pristabdomas. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... Spartaus pratęsimo duomenys torentui "%1" buvo atmesti. Priežastis: %2. Tikrinama iš naujo... @@ -1679,19 +1339,19 @@ CategoryFilterModel - + Categories - Kategorijos + Kategorijos - + All - Visi + Visi - + Uncategorized - Be kategorijos + @@ -1699,42 +1359,147 @@ Add category... - Pridėti kategoriją... + Pridėti kategoriją... Add subcategory... - Pridėti subkategoriją... + - Edit category... - Taisyti kategoriją... + Remove category + Šalinti kategoriją + + + + Remove unused categories + Šalinti nenaudojamas kategorijas + + + + Resume torrents + + + + + Pause torrents + Pristabdyti torentus + + + + Delete torrents + Ištrinti torentus + + + + New Category + Nauja kategorija + + + + Category: + Kategorija: + + + + Invalid category name + Neteisingas kategorijos pavadinimas + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Kategorijos pavadinime negali būti "\". +Kategorijos pavadinimas negali prasidėti/užsibaigti simboliu "/". +Kategorijos pavadinime negali būti "//" sekos. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Visi (0) + + + Uncategorized (0) + Be kategorijos (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Be kategorijos (%1) + + + Add category... + Pridėti kategoriją... - Remove category - Šalinti kategoriją + Šalinti kategoriją - Remove unused categories - Šalinti nenaudojamas kategorijas + Šalinti nenaudojamas kategorijas - Resume torrents - Pratęsti torentus + Pratęsti torentus - Pause torrents - Pristabdyti torentus + Pristabdyti torentus - Delete torrents - Ištrinti torentus + Ištrinti torentus + + + New Category + Nauja kategorija + + + Category: + Kategorija: + + + Invalid category name + Neteisingas kategorijos pavadinimas + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Kategorijos pavadinime negali būti "\". +Kategorijos pavadinimas negali prasidėti/užsibaigti simboliu "/". +Kategorijos pavadinime negali būti "//" sekos. + + + All (%1) + this is for the category filter + Visi (%1) @@ -1774,220 +1539,101 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Ištrynimo patvirtinimas - - - - Remember choice - Atsiminti pasirinkimą - + DeletionConfirmationDlg - - Also delete the files on the hard disk - Taipogi ištrinti failus iš standžiojo disko - - - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? Ar tikrai norite ištrinti "%1" iš siuntimų sąrašo? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? Ar tikrai norite ištrinti šiuos %1 torentus iš siuntimų sąrašo? - DownloadFromURLDialog - - - Download from URLs - Atsisiųsti iš URL adresų - - - - Add torrent links - Pridėti torentų nuorodas - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - Po vieną nuorodą eilutėje (palaikomos HTTP nuorodos, Magnet nuorodos bei informacinės maišos) - - - - Download - Atsiųsti - - - - No URL entered - Neįvestas URL - - - - Please type at least one URL. - Įveskite bent vieną URL adresą. - - - DownloadedPiecesBar - + White: Missing pieces Balta: Trūkstamos dalys - + Green: Partial pieces Žalia: Dalinės dalys - + Blue: Completed pieces Mėlyna: Užbaigtos dalys - ExecutionLogWidget + ExecutionLog - + General Bendra - + Blocked IPs - Užblokuoti IP adresai + Užblokuoti IP - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked <font color='red'>%1</font> buvo užblokuotas %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - <font color='red'>%1</font> buvo uždraustas + <font color='red'>%1</font> <i> buvo uždraustas FeedListWidget - + RSS feeds RSS kanalai - - - Unread (%1) - Neskaityta (%1) + + Unread + Neskaityta FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. + + An error occured while trying to open the log file. Logging to file is disabled. Įvyko klaida, bandant atverti žurnalo failą. Registravimas į failą yra išjungtas. - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - &Naršyti... - - - - Choose a file - Caption for file open/save dialog - Pasirinkti failą - - - - Choose a folder - Caption for directory open dialog - Pasirinkti aplanką - - - - Any file - Bet koks failas - - - FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - I/O klaida: Nepavyko atverti IP filtrų failo skaitymo veiksenoje. - - - - - - IP filter line %1 is malformed. - IP filtro eilutė %1 yra netaisyklinga. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - IP filtro eilutė %1 yra netaisyklinga. Rėžio pradžios IP yra netaisyklingas. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - IP filtro eilutė %1 yra netaisyklinga. Rėžio pabaigos IP yra netaisyklingas. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - IP filtro eilutė %1 yra netaisyklinga. Vienas IP yra IPv4, o kitas IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - Eilutei %1 pateikta IP filtro išimtis. Išimtis yra: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - Įvyko %1 papildomų IP filtro nagrinėjimo klaidų. + + + + I/O Error: Could not open ip filter file in read mode. + I/O Klaida: Nepavyko atverti ip filtrų failo skaitymo veiksenoje. - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. Analizavimo klaida: Filtrų failas nėra taisyklingas PeerGuardian P2B failas. @@ -1995,396 +1641,472 @@ GeoIPDatabase - - + + Unsupported database file size. Nepalaikomas duomenų bazės failo dydis. - + Metadata error: '%1' entry not found. Metaduomenų klaida: "%1" įrašas nerastas. - + Metadata error: '%1' entry has invalid type. Metaduomenų klaida: "%1" įrašas turi netaisyklingą tipą. - + Unsupported database version: %1.%2 Nepalaikoma duomenų bazės versija: %1.%2 - + Unsupported IP version: %1 Nepalaikoma IP versija: %1 - + Unsupported record size: %1 Nepalaikomas įrašo dydis: %1 - + Invalid database type: %1 Neteisingas duomenų bazės tipas: %1 - + Database corrupted: no data section found. Duomenų bazė sugadinta: nerasta duomenų sekcija. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - Http užklausos dydis viršija ribą, lizdas uždaromas. Riba: %ld, IP: %s + + File + Failas - - Bad Http request, closing socket. IP: %s - Bloga Http užklausa, uždaromas lizdas. IP: %s + + Edit + Redaguoti - - - HttpServer - + + Help + Žinynas + + + Exit qBittorrent Išeiti iš qBittorrent - + Only one link per line Po vieną nuorodą eilutėje - + + Download + Atsiųsti + + + Global upload rate limit must be greater than 0 or disabled. Visuotinio išsiuntimo greičio apribojimas privalo būti arba aukštesnis už 0, arba išjungtas. - + Global download rate limit must be greater than 0 or disabled. Visuotinio atsiuntimo greičio apribojimas privalo būti arba aukštesnis už 0, arba išjungtas. - + Alternative upload rate limit must be greater than 0 or disabled. Alternatyvus išsiuntimo greičio apribojimas privalo būti arba aukštesnis už 0, arba išjungtas. - + Alternative download rate limit must be greater than 0 or disabled. Alternatyvus atsiuntimo greičio apribojimas privalo būti arba aukštesnis už 0, arba išjungtas. - + Maximum active downloads must be greater than -1. Didžiausias aktyvių atsiuntimų kiekis privalo būti didesnis nei -1. - + Maximum active uploads must be greater than -1. Didžiausias aktyvių išsiuntimų kiekis privalo būti didesnis nei -1. - + Maximum active torrents must be greater than -1. Didžiausias aktyvių torentų kiekis privalo būti didesnis nei -1. - + Maximum number of connections limit must be greater than 0 or disabled. Didžiausias prisijungimų kiekis privalo būti arba aukštesnis už 0, arba išjungtas. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Didžiausias prisijungimų kiekis vienam torentui privalo būti arba aukštesnis už 0, arba išjungtas. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Didžiausias išsiuntimo prisijungimų kiekis vienam torentui privalo būti arba aukštesnis už 0, arba išjungtas. - + Unable to save program preferences, qBittorrent is probably unreachable. Nepavyko išsaugoti programos nuostatų, qBittorrent tikriausiai yra nepasiekiamas. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent Freenode serveryje - - - - Invalid category name: -Please do not use any special characters in the category name. - Neteisingas kategorijos pavadinimas: -Prašome kategorijos pavadinime nenaudoti jokių specialių simbolių. - - - - Unknown - Nežinoma - - - - Hard Disk - Standusis diskas - - - - Share ratio limit must be between 0 and 9998. - Dalijimosi santykio apribojimas privalo būti tarp 0 ir 9998. - - - - Seeding time limit must be between 0 and 525600 minutes. - Skleidimo laiko riba privalo būti tarp 0 ir 525600 minučių. + + Language + Kalba - + The port used for incoming connections must be between 1 and 65535. Įeinančių susijungimų prievadas privalo būti tarp 1 ir 65535. - + The port used for the Web UI must be between 1 and 65535. Tinklo naudotojo sąsajos prievadas privalo būti tarp 1 ir 65535. - + Unable to log in, qBittorrent is probably unreachable. Negalima prisijungti, qBittorrent, tikriausiai, yra nepasiekamas. - + Invalid Username or Password. Neteisingas naudotojo vardas ar slaptažodis. - - Username - Naudotojo vardas - - - + Password Slaptažodis - + Login Prisijungimas - + + Upload Failed! + Išsiuntimas nepavyko! + + + Original authors Pirmutiniai autoriai - + + Upload limit: + Išsiuntimo riba: + + + + Download limit: + Atsiuntimo riba: + + + Apply Taikyti - + Add Pridėti - + + Category: + Kategorija: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Išsiųsti torentus - + + All + Visi + + + + Downloading + Atsiunčiama + + + + Seeding + Skleidžiama + + + + Completed + Užbaigta + + + + Resumed + Pratęsta + + + + Paused + Pristabdyta + + + + Active + Aktyvūs + + + + Inactive + Neaktyvūs + + + Save files to location: Failus išsaugoti į: - + Cookie: Slapukas: - + Type folder here Čia įveskite aplanką - + + Run an external program on torrent completion + Užbaigus torento siuntimą, paleisti išorinę programą + + + + Enable bandwidth management (uTP) + Įjungti srauto valdymą (uTP) + + + + Apply rate limit to uTP connections + Taikyti greičio apribojimus uTP susijungimams + + + + Alternative Global Rate Limits + Alternatyvūs visuotiniai greičio apribojimai + + + More information Daugiau informacijos - + Information about certificates Informacija apie liudijimus - + Save Files to Išsaugoti failus į - - Set location - Nustatyti vietą - - - - Limit upload rate - Apriboti išsiuntimo greitį + + Watch Folder + Stebėti aplanką - - Limit download rate - Apriboti atsiuntimo greitį + + Default Folder + Numatytasis aplankas - - Rename torrent - Pervadinti torentą + + from + from time1 to time2 + nuo - - Unable to create category - + + to + from time1 to time2 + iki - + Other... Save Files to: Watch Folder / Default Folder / Other... Kita... - + + Every day + Schedule the use of alternative rate limits on ... + Kasdieną + + + + Week days + Schedule the use of alternative rate limits on ... + Darbo dienomis + + + + Week ends + Schedule the use of alternative rate limits on ... + Savaitgaliais + + + Monday Schedule the use of alternative rate limits on ... Pirmadieniais - + Tuesday Schedule the use of alternative rate limits on ... Antradieniais - + Wednesday Schedule the use of alternative rate limits on ... Trečiadieniais - + Thursday Schedule the use of alternative rate limits on ... Ketvirtadieniais - + Friday Schedule the use of alternative rate limits on ... Penktadieniais - + Saturday Schedule the use of alternative rate limits on ... Šeštadieniais - + Sunday Schedule the use of alternative rate limits on ... Sekmadieniais - + + Downloaded + Is the file downloaded or not? + Atsiųstas + + + Logout Atsijungti - + + Download from URLs + Atsisiųsti iš URL adresų + + + Download Torrents from their URLs or Magnet links Atsisiųsti torentus iš jų URL arba Magnet nuorodų - + Upload local torrent Išsiųsti vietinį torentą - + Are you sure you want to delete the selected torrents from the transfer list? Ar tikrai norite pašalinti pasirinktus torentus iš siuntimų sąrašo? - + Save Išsaugoti - + qBittorrent client is not reachable qBittorrent klientas nepasiekiamas - - qBittorrent has been shutdown. - qBittorrent buvo išjungtas. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Baltajame sąraše esančių IP potinklių sąrašas + + HTTP Server + HTTP serveris - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Pavyzdys: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Palaikomi šie parametrai: - - Add subnet - Pridėti potinklį + + Torrent path + Torento saugojimo vieta - - Delete - Ištrinti + + Torrent name + Torento pavadinimas - - Error - Klaida + + qBittorrent has been shutdown. + qBittorrent buvo išjungtas. + + + LineEdit - - The entered subnet is invalid. - Įvestas potinklis yra netaisyklingas. + + Clear the text + Išvalyti tekstą LogListWidget - + Copy Kopijuoti - + Clear Valyti @@ -2417,551 +2139,493 @@ Už&baigus atsiuntimus - + &View Rod&ymas - + &Options... &Parinktys... - + &Resume &Tęsti - + Torrent &Creator Su&kurti torentą - + Set Upload Limit... Nustatyti išsiuntimo greičio ribą... - + Set Download Limit... Nustatyti atsiuntimo greičio ribą... - + Set Global Download Limit... Nustatyti visuotinę atsiuntimo greičio ribą... - + Set Global Upload Limit... Nustatyti visuotinę išsiuntimo greičio ribą... - + Minimum Priority Žemiausia svarba - + Top Priority Aukščiausia svarba - + Decrease Priority Sumažinti svarbą - + Increase Priority Padidinti svarbą - - + + Alternative Speed Limits Alternatyvūs greičio apribojimai - + &Top Toolbar Viršutinė įrankių juos&ta - + Display Top Toolbar Rodyti viršutinę įrankių juostą - - Status &Bar - Būsenos &juosta - - - + S&peed in Title Bar &Greitis pavadinimo juostoje - + Show Transfer Speed in Title Bar Rodyti siuntimų greitį pavadinimo juostoje - + &RSS Reader &RSS skaitytuvas - + Search &Engine Paieškos &sistema - + L&ock qBittorrent Užra&kinti qBittorrent - + Do&nate! &Paaukoti! - - Close Window - Užverti langą - - - + R&esume All T&ęsti visus - + Manage Cookies... Tvarkyti slapukus... - + Manage stored network cookies Tvarkyti kaupiamus tinklo slapukus - + Normal Messages Normalios žinutės - + Information Messages Informacinės žinutės - + Warning Messages Įspėjamosios žinutės - + Critical Messages Kritinės žinutės - + &Log Ž&urnalas - + &Exit qBittorrent Iš&eiti iš qBittorrent - + &Suspend System Pri&stabdyti sistemą - + &Hibernate System &Užmigdyti sistemą - + S&hutdown System Iš&jungti kompiuterį - + &Disabled &Išjungta - + &Statistics &Statistika - + Check for Updates Tikrinti, ar yra atnaujinimų - + Check for Program Updates Tikrinti, ar yra programos atnaujinimų - + &About &Apie - + &Pause &Pristabdyti - + &Delete Ištrin&ti - + P&ause All Prist&abdyti visus - + &Add Torrent File... &Pridėti torento failą... - + Open Atverti - + E&xit Iš&eiti - + Open URL Atverti URL - + &Documentation &Žinynas - + Lock Užrakinti - - - + + + Show Rodyti - + Check for program updates Tikrinti, ar yra programos atnaujinimų - + Add Torrent &Link... Pridėti torento &nuorodą... - + If you like qBittorrent, please donate! Jei Jums patinka qBittorrent, paaukokite! - - + Execution Log Vykdymo žurnalas - + Clear the password Išvalyti slaptažodį - + Filter torrent list... Filtruoti torentų sąrašą... - + &Set Password &Nustatyti slaptažodį - - Preferences - Nuostatos - - - + &Clear Password &Išvalyti slaptažodį - + Transfers Siuntimai - - - qBittorrent is minimized to tray - qBittorrent suskleista į dėklą - - - - - - This behavior can be changed in the settings. You won't be reminded again. - Ši elgsena gali būti pakeista nustatymuose. Daugiau jums apie tai nebebus priminta. - - - + Torrent file association .torrent failų susiejimas - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent nėra numatytoji programa atverti .torrent failams bei Magnet nuorodoms. Ar norite susieti .torrent failus bei Magnet nuorodas su qBittorrent? - + Icons Only Tik piktogramos - + Text Only Tik tekstas - + Text Alongside Icons Tekstas šalia piktogramų - + Text Under Icons Tekstas po piktogramomis - + Follow System Style Sekti sistemos stilių - - - + + + UI lock password Naudotojo sąsajos užrakinimo slaptažodis - - - + + + Please type the UI lock password: Įveskite naudotojo sąsajos užrakinimo slaptažodį: - + The password should contain at least 3 characters Slaptažodį turi sudaryti bent 3 simboliai - + Password update Slaptažodžio atnaujinimas - + The UI lock password has been successfully updated Naudotojo sąsajos užrakinimo slaptažodis sėkmingai atnaujintas - + Are you sure you want to clear the password? Ar tikrai norite išvalyti slaptažodį? - - Use regular expressions - Naudoti reguliariuosius reiškinius - - - + Search Paieška - + Transfers (%1) Siuntimai (%1) - + Error Klaida - + Failed to add torrent: %1 Nepavyko pridėti torento: %1 - + Torrent added Torentas pridėtas - + '%1' was added. e.g: xxx.avi was added. "%1" buvo pridėtas. - + Download completion Atsiuntimas užbaigtas - + I/O Error i.e: Input/Output Error I/O klaida - + Recursive download confirmation Rekursyvaus siuntimo patvirtinimas - + Yes Taip - + No Ne - + Never Niekada - + Global Upload Speed Limit Visuotinis išsiuntimo greičio apribojimas - + Global Download Speed Limit Visuotinis atsiuntimo greičio apribojimas - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent ką tik buvo atnaujinta ir ją reikia paleisti iš naujo, norint, kad įsigaliotų nauji pakeitimai. - - - - qBittorrent is closed to tray - qBittorrent užverta į dėklą - - - - Some files are currently transferring. - Šiuo metu yra persiunčiami kai kurie failai. - - - - Are you sure you want to quit qBittorrent? - Ar tikrai norite išeiti iš qBittorrent? - - - + &No &Ne - + &Yes &Taip - + &Always Yes &Visada taip - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - Nepavyko nustatyti jūsų Python versijos. Paieškos sistema išjungta. - - - + Old Python Interpreter Senas Python interpretatorius - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. Jūsų Python versija (%1) yra pasenusi. Tam, kad veiktų paieškos sistemos, prašome atnaujinti iki naujausios versijos. Minimalūs reikalavimai: 2.7.9 / 3.3.0. - + qBittorrent Update Available Yra prieinamas qBittorrent atnaujinimas - + + A new version is available. +Do you want to download %1? + Yra prieinama nauja versija. +Ar norite atsisiųsti %1? + + + Already Using the Latest qBittorrent Version Jau yra naudojama naujausia qBittorrent versija - + Undetermined Python version Nenustatyta Python versija - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. "%1" atsiuntimas užbaigtas. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2970,158 +2634,154 @@ Priežastis: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? Torente "%1" yra torentų failų. Ar norite atsisiųsti ir juos? - + Couldn't download file at URL '%1', reason: %2. Nepavyko atsisiųsti failo iš URL "%1", prežastis: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin Python rasta kataloge %1: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + Nepavyko nustatyti jūsų Python versijos (%1). Paieškos sistema išjungta. + + + + Missing Python Interpreter Nerastas Python interpretatorius - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Norint naudoti paieškos sistemą, būtinas Python interpretatorius, tačiau neatrodo, jog jis būtų įdiegtas. Ar norite įdiegti jį dabar? - + Python is required to use the search engine but it does not seem to be installed. Norint naudoti paieškos sistemą, būtinas Python interpretatorius, tačiau neatrodo, jog jis būtų įdiegtas. - - A new version is available. - Yra prieinama nauja versija. - - - - Do you want to download %1? - Ar norite atsisiųsti %1? - - - - Open changelog... - Atverti keitinių žurnalą... - - - + No updates available. You are already using the latest version. Nėra prieinamų atnaujinimų. Jūs jau naudojate naujausią versiją. - + &Check for Updates &Tikrinti, ar yra atnaujinimų - + Checking for Updates... Tikrinama, ar yra atnaujinimų... - + Already checking for program updates in the background Šiuo metu fone jau ieškoma programos atnaujinimų... - + Python found in '%1' Python rasta kataloge "%1" - + Download error Atsiuntimo klaida - + Python setup could not be downloaded, reason: %1. Please install it manually. Python įdiegties atsiųsti nepavyko, priežastis: %1. Prašome padaryti tai rankiniu būdu. - - + + Invalid password Neteisingas slaptažodis - - - + + RSS (%1) RSS (%1) - + URL download error URL atsiuntimo klaida - + The password is invalid Slaptažodis yra neteisingas - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Ats. greitis: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Išs. greitis: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [A: %1, I: %2] qBittorrent %3 - + Hide Slėpti - + Exiting qBittorrent Užveriama qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Šiuo metu vyksta kelių failų siuntimas. +Ar tikrai norite užverti qBittorrent? + + + Open Torrent Files Atverti torentų failus - + Torrent Files Torentų failai - + Options were saved successfully. Parinktys sėkmingai išsaugotos. @@ -3129,52 +2789,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. Jūsų dinamis DNS buvo sėkmingai atnaujintas. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Dinaminio DNS klaida: Paslauga laikinai neprieinama, bus bandoma iš naujo po 30 minučių. - + Dynamic DNS error: hostname supplied does not exist under specified account. Dinaminio DNS klaida: pateikto stoties vardo nurodytoje paskyroje nėra. - + Dynamic DNS error: Invalid username/password. Dinaminio DNS klaida: Neteisingas naudotojo vardas/slaptažodis. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Dinaminio DNS klaida: qBittorrent buvo uždraustas šioje paslaugoje, prašome apie klaidą pranešti adresu http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Dinaminio DNS klaida: paslauga grąžino %1, prašome pranešti apie klaidą adresu http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Dinaminio DNS klaida: Jūsų naudotojo vardas buvo užblokuotas dėl netinkamo naudojimo. - + Dynamic DNS error: supplied domain name is invalid. Dinaminio DNS klaida: pateiktas domeno vardas yra netaisyklingas. - + Dynamic DNS error: supplied username is too short. Dinaminio DNS klaida: pateiktas naudotojo vardas yra per trumpas. - + Dynamic DNS error: supplied password is too short. Dinaminio DNS klaida: pateiktas slaptažodis yra per trumpas. @@ -3182,1413 +2842,1303 @@ Net::DownloadHandler - + I/O Error I/O klaida - + The file size is %1. It exceeds the download limit of %2. Failo dydis yra %1. Jis viršija %2 atsiuntimo ribą. - + Unexpected redirect to magnet URI. Netikėtas peradresavimas į magnet URI. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - Nuotolinio serverio vardas nerastas (negaliojantis serverio vardas) + + + GeoIP database loaded. Type: %1. Build time: %2. + GeoIP duomenų bazė įkelta. Tipas: %1. Sukūrimo laikas: %2. - - The operation was canceled - Operacijos atsisakyta + + + Couldn't load GeoIP database. Reason: %1 + Nepavyko įkelti GeoIP duomenų bazės. Priežastis: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - Nuotolinis serveris per anksti nutraukė prisijungimą, nespėjus gauti bei apdoroti pilno atsakymo + + Venezuela, Bolivarian Republic of + Venesuelos Bolivaro respublika - - The connection to the remote server timed out - Baigėsi prisijungimui prie nuotolinio serverio skirtas laikas + + Viet Nam + Vietnamas - - SSL/TLS handshake failed - SSL/TLS ryšio suderinimas nepavyko + + + N/A + Nėra - - The remote server refused the connection - Nuotolinis serveris atmetė prisijungimą + + Andorra + Andora - - The connection to the proxy server was refused - Ryšys su įgaliotuoju serveriu buvo atmestas + + United Arab Emirates + Jungtiniai Arabų Emyratai - - The proxy server closed the connection prematurely - Įgaliotasis serveris per anksti nutraukė ryšį + + Afghanistan + Afganistanas - - The proxy host name was not found - Įgaliotojo serverio vardas nerastas + + Antigua and Barbuda + Antigva ir Barbuda - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - Baigėsi prisijungimui prie įgaliotojo serverio skirtas laikas arba įgaliotasis serveris laiku neatsakė į užklausą + + Anguilla + Angilija - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - Įgaliotasis serveris reikalauja atpažinimo, norint įvykdyti užklausą, tačiau nepriėmė jokių siūlytų prisijungimo duomenų - - - - The access to the remote content was denied (401) - Prieiga prie nuotolinio turinio buvo atmesta (401) - - - - The operation requested on the remote content is not permitted - Su nuotoliniu turiniu užklausta operacija neleidžiama - - - - The remote content was not found at the server (404) - Nuotolinis turinys serveryje nerastas (404) - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - Serveris reikalauja atpažinimo norėdamas pateikti turinį, tačiau nepriėmė jokių siūlytų prisijungimo duomenų - - - - The Network Access API cannot honor the request because the protocol is not known - Tinklo prieigos API negali įvykdyti užklausos, nes užklausos protokolas nežinomas - - - - The requested operation is invalid for this protocol - Užklausta operacija šiam protokolui yra neteisinga - - - - An unknown network-related error was detected - Aptikta nežinoma tinklo klaida - - - - An unknown proxy-related error was detected - Aptikta nežinoma su įgaliotuoju serveriu susijusi klaida - - - - An unknown error related to the remote content was detected - Aptikta nežinoma su nuotoliniu turiniu susijusi klaida - - - - A breakdown in protocol was detected - Protokole aptiktas gedimas - - - - Unknown error - Nežinoma klaida - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - GeoIP duomenų bazė įkelta. Tipas: %1. Sukūrimo laikas: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - Nepavyko įkelti GeoIP duomenų bazės. Priežastis: %1 - - - - Venezuela, Bolivarian Republic of - Venesuelos Bolivaro respublika - - - - Viet Nam - Vietnamas - - - - - N/A - Nėra - - - - Andorra - Andora - - - - United Arab Emirates - Jungtiniai Arabų Emyratai - - - - Afghanistan - Afganistanas - - - - Antigua and Barbuda - Antigva ir Barbuda + + Albania + Albanija - Anguilla - Angilija - - - - Albania - Albanija - - - Armenia Armėnija - + Angola Angola - + Antarctica Antarktida - + Argentina Argentina - + American Samoa Amerikos Samoa - + Austria Austrija - + Australia Australija - + Aruba Aruba - + Azerbaijan Azerbaidžanas - + Bosnia and Herzegovina Bosnija ir Hercegovina - + Barbados Barbadosas - + Bangladesh Bangladešas - + Belgium Belgija - + Burkina Faso Burkina Fasas - + Bulgaria Bulgarija - + Bahrain Bahreinas - + Burundi Burundis - + Benin Beninas - + Bermuda Bermuda - + Brunei Darussalam Brunėjaus Darusalamas - + Brazil Brazilija - + Bahamas Bahamos - + Bhutan Butanas - + Bouvet Island Buvė sala - + Botswana Botsvana - + Belarus Baltarusija - + Belize Belizas - + Canada Kanada - + Cocos (Keeling) Islands Kokosų (Kilingo) salos - + Congo, The Democratic Republic of the Kongo Respublika - + Central African Republic Centrinės Afrikos Respublika - + Congo Kongas - + Switzerland Šveicarija - + Cook Islands Kuko salos - + Chile Čilė - + Cameroon Kamerūnas - + China Kinija - + Colombia Kolumbija - + Costa Rica Kosta Rika - + Cuba Kuba - + Cape Verde Žaliasis Kyšulys - + Curacao Kiurasao - + Christmas Island Kalėdų sala - + Cyprus Kipras - + Czech Republic Čekija - + Germany Vokietija - + Djibouti Džibutis - + Denmark Danija - + Dominica Dominika - + Dominican Republic Dominikos Respublika - + Algeria Alžyras - + Ecuador Ekvadoras - + Estonia Estija - + Egypt Egiptas - + Western Sahara Vakarų Sachara - + Eritrea Eritrėja - + Spain Ispanija - + Ethiopia Etiopija - + Finland Suomija - + Fiji Fidžis - + Falkland Islands (Malvinas) Folklando (Malvinų) salos - + Micronesia, Federated States of Mikronezijos Federacinės Valstijos - + Faroe Islands Farerų salos - + France Prancūzija - + Gabon Gabonas - + United Kingdom Jungtinė Karalystė - + Grenada Grenada - + Georgia Gruzija - + French Guiana Prancūzijos Gviana - + Ghana Gana - + Gibraltar Gibraltaras - + Greenland Grenlandija - + Gambia Gambija - + Guinea Gvinėja - + Guadeloupe Gvadelupa - + Equatorial Guinea Pusiaujo Gvinėja - + Greece Graikija - + South Georgia and the South Sandwich Islands Pietų Džordžijos ir Pietų Sandvičo salos - + Guatemala Gvatemala - + Guam Guamas - + Guinea-Bissau Bisau Gvinėja - + Guyana Gajana - + Hong Kong Honkongas - + Heard Island and McDonald Islands Herdo ir Makdonaldo salos - + Honduras Hondūras - + Croatia Kroatija - + Haiti Haitis - + Hungary Vengrija - + Indonesia Indonezija - + Ireland Airija - + Israel Izraelis - + India Indija - + British Indian Ocean Territory Indijos vandenyno Britų sritis - + Iraq Irakas - + Iran, Islamic Republic of Irano Islamo Respublika - + Iceland Islandija - + Italy Italija - + Jamaica Jamaika - + Jordan Jordanija - + Japan Japonija - + Kenya Kenija - + Kyrgyzstan Kirgizija - + Cambodia Kambodža - + Kiribati Kiribatis - + Comoros Komorai - + Saint Kitts and Nevis Sent Kitsas ir Nevis - + Korea, Democratic People's Republic of Korėjos Liaudies Demokratinė Respublika - + Korea, Republic of Korėjos Respublika - + Kuwait Kuveitas - + Cayman Islands Kaimanų salos - + Kazakhstan Kazachstanas - + Lao People's Democratic Republic Laoso Liaudies Demokratinė Respublika - + Lebanon Libanas - + Saint Lucia Sent Lusija - + Liechtenstein Lichtenšteinas - + Sri Lanka Šri Lanka - + Liberia Liberija - + Lesotho Lesotas - + Lithuania Lietuva - + Luxembourg Liuksemburgas - + Latvia Latvija - + Morocco Marokas - + Monaco Monakas - + Moldova, Republic of Moldovos Respublika - + Madagascar Madagaskaras - + Marshall Islands Maršalo Salos - + Mali Malis - + Myanmar Mianmaras - + Mongolia Mongolija - + Northern Mariana Islands Šiaurės Marianų salos - + Martinique Martinika - + Mauritania Mauritanija - + Montserrat Montseratas - + Malta Malta - + Mauritius Mauricijus - + Maldives Maldyvai - + Malawi Malavis - + Mexico Meksika - + Malaysia Malaizija - + Mozambique Mozambikas - + Namibia Namibija - + New Caledonia Naujoji Kaledonija - + Niger Nigeris - + Norfolk Island Norfolko sala - + Nigeria Nigerija - + Nicaragua Nikaragva - + Netherlands Nyderlandai - + Norway Norvegija - + Nepal Nepalas - + Nauru Nauru - + Niue Niujė - + New Zealand Naujoji Zelandija - + Oman Omanas - + Panama Panama - + Peru Peru - + French Polynesia Prancūzijos Polinezija - + Papua New Guinea Papua Naujoji Gvinėja - + Philippines Filipinai - + Pakistan Pakistanas - + Poland Lenkija - + Saint Pierre and Miquelon Sen Pjeras ir Mikelonas - + Puerto Rico Puerto Rikas - + Portugal Portugalija - + Palau Palau - + Paraguay Paragvajus - + Qatar Kataras - + Reunion - Reunjonas + Reunionas - + Romania Rumunija - + Russian Federation Rusijos Federacija - + Rwanda Ruanda - + Saudi Arabia Saudo Arabija - + Solomon Islands Saliamono salos - + Seychelles Seišeliai - + Sudan Sudanas - + Sweden Švedija - + Singapore Singapūras - + Slovenia Slovėnija - + Svalbard and Jan Mayen Svalbardas ir Jan Majenas - + Slovakia Slovakija - + Sierra Leone Siera Leonė - + San Marino San Marinas - + Senegal Senegalas - + Somalia Somalis - + Suriname Surinamas - + Sao Tome and Principe San Tomė ir Prinsipė - + El Salvador Salvadoras - + Syrian Arab Republic Sirija arabų respublika - + Swaziland Svazilandas - + Turks and Caicos Islands Terkso ir Kaikoso salos - + Chad Čadas - + French Southern Territories Prancūzijos pietų sritys - + Togo Togas - + Thailand Tailandas - + Tajikistan Tadžikija - + Tokelau Tokelau - + Turkmenistan Turkmėnija - + Tunisia Tunisas - + Tonga Tonga - - Could not decompress GeoIP database file. - Nepavyko išglaudinti GeoIP duomenų bazės failo. - - - + Timor-Leste Rytų Timoras - + Bolivia, Plurinational State of - Bolivijos daugiatautė valstybė + Bolivijos daugiautautė valstybė - + Bonaire, Sint Eustatius and Saba Boneras, Sint Eustatijus ir Saba - + Cote d'Ivoire Dramblio Kaulo Krantas - + Libya Libija - + Saint Martin (French part) Sen Martenas (Prancūzijos dalis) - + Macedonia, The Former Yugoslav Republic of Buvusi Jugoslavijos respublika Makedonija - + Macao Makao - + Pitcairn Pitkernas - + Palestine, State of Palestinos sritis - + Saint Helena, Ascension and Tristan da Cunha Šv. Elenos, Dangun žengimo ir Tristano da Kunja salos - + South Sudan Pietų Sudanas - + Sint Maarten (Dutch part) Sint Martenas (Nyderlandų dalis) - + Turkey Turkija - + Trinidad and Tobago Trinidadas ir Tobagas - + Tuvalu Tuvalu - + Taiwan Taivanas - + Tanzania, United Republic of Tanzanijos Jungtinė Respublika - + Ukraine Ukraina - + Uganda Uganda - + United States Minor Outlying Islands JAV išorinės mažosios salos - + United States Jungtinės Valstijos - + Uruguay Urugvajus - + Uzbekistan Uzbekija - + Holy See (Vatican City State) Šventasis Sostas (Vatikano Miesto Valstybė) - + Saint Vincent and the Grenadines Sent Vinsentas ir Grenadinai - + Virgin Islands, British Mergelių salos, Didžioji Britanija - + Virgin Islands, U.S. Mergelių salos, JAV - + Vanuatu Vanuatu - + Wallis and Futuna Volisas ir Futūna - + Samoa Samoa - + Yemen Jemenas - + Mayotte Majotas - + Serbia Serbija - + South Africa Pietų Afrika - + Zambia Zambija - + Montenegro Juodkalnija - + Zimbabwe Zimbabvė - + Aland Islands Alandai - + Guernsey Gernsis - + Isle of Man Meno sala - + Jersey Džersis - + Saint Barthelemy Šv. Bartolomėjaus sala - + + Could not uncompress GeoIP database file. + Nepavyko išglaudinti GeoIP duomenų bazės failo. + + + Couldn't save downloaded GeoIP database file. Nepavyko įrašyti atsiųsto GeoIP duomenų bazės failo. - + Successfully updated GeoIP database. GeoIP duomenų bazė sėkmingai atnaujinta. - + Couldn't download GeoIP database file. Reason: %1 Nepavyko atsisiųsti GeoIP duomenų bazės failo. Priežastis: %1 @@ -4596,12 +4146,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] UPnP / NAT-PMP palaikymas [ĮJUNGTAS] - + UPnP / NAT-PMP support [OFF] UPnP / NAT-PMP palaikymas [IŠJUNGTAS] @@ -4609,7 +4159,7 @@ Net::Smtp - + Email Notification Error: El. pašto pranešimo klaida: @@ -4617,1281 +4167,1077 @@ OptionsDialog - + Options Parinktys - + Behavior Elgsena - + Downloads Atsiuntimai - + Connection Jungiamumas - + Speed Greitis - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI Tinklo sąsaja - + Advanced Išplėstinės - + Language Kalba - + User Interface Language: Naudotojo sąsajos kalba: - + (Requires restart) (būtina paleisti iš naujo) - + Transfer List Siuntimų sąrašas - + Confirm when deleting torrents Patvirtinti, kai ištrinama torentus - + Use alternating row colors In transfer list, one every two rows will have grey background. Naudoti skirtingas eilučių spalvas - + Hide zero and infinity values Slėpti nulio ir begalybės reikšmes - + Always Visada - + Paused torrents only Tik pristabdytuose torentuose - + Action on double-click Veiksmas, atliekamas du kartus spustelėjus - + Downloading torrents: Atsiunčiamus torentus: - - + + Start / Stop Torrent Pratęsti / pristabdyti torentą - - + + Open destination folder Atverti paskirties aplanką - - + + No action Jokio veiksmo - + Completed torrents: Užbaigtus torentus: - + Desktop Darbalaukis - + Start qBittorrent on Windows start up Paleisti qBittorrent Windows paleidimo metu - + Show splash screen on start up Paleidžiant programą rodyti prisistatymo langą - + Start qBittorrent minimized Paleisti qBittorrent suskleistą - + Confirmation on exit when torrents are active Išeinant, klausti patvirtinimo, kai yra aktyvių siuntimų - + Confirmation on auto-exit when downloads finish Užbaigus atsiuntimus ir automatiškai išeinant, klausti patvirtinimo - - KiB - KiB - - - - Email notification &upon download completion - Pabaigus a&tsiuntimą, pranešti el. paštu - - - - Run e&xternal program on torrent completion - Užbaigus torento siuntimą, &paleisti išorinę programą - - - - IP Fi&ltering - IP fi&ltravimas - - - - Schedule &the use of alternative rate limits - Planuoti &alternatyvių greičio apribojimų naudojimą - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Daugiau informacijos</a>) - - - - &Torrent Queueing - &Siuntimų eilė - - - - Seed torrents until their seeding time reaches - Skleisti torentus, kol jų skleidimo laikas pasieks - - - - A&utomatically add these trackers to new downloads: - Į naujus a&tsiuntimus, automatiškai pridėti šiuos seklius: - - - - RSS Reader - RSS skaitytuvė - - - - Enable fetching RSS feeds - Įjungti RSS kanalų gavimą - - - - Feeds refresh interval: - Kanalų įkėlimo iš naujo intervalas: - - - - Maximum number of articles per feed: - Didžiausias įrašų kanale kiekis: - - - - - min - minutes - min. - - - - RSS Torrent Auto Downloader - RSS torentų automatinis atsiuntimas - - - - Enable auto downloading of RSS torrents - Įjungti automatinį RSS torentų atsiuntimą - - - - Edit auto downloading rules... - Taisyti automatinio atsiuntimo taisykles... - - - - Web User Interface (Remote control) - Tinklo naudotojo sąsaja (Nuotolinis valdymas) - - - - IP address: - IP adresas: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - IP adresas su kuriuo bus susieta Tinklo sąsaja. -Nurodykite IPv4 ar IPv6 adresą. Bet kokiam IPv4 adresui galite nurodyti "0.0.0.0", -Bet kokiam IPv6 adresui galite nurodyti "::", arba galite nurodyti "*" bet kokiam IPv4 ir IPv6. - - - - Server domains: - Serverio domenai: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - HTTP serverio antraščių reikšmių filtravimo baltasis sąrašas. -Norėdami apsisaugoti nuo DNS atnaujinto susiejimo atakos, -turėtumėte įvesti tinklo sąsajos serverio naudojamus domenų -pavadinimus. - -Norėdami atskirti kelias reikšmes, naudokite ";". Galima naudoti -pakaitos simbolį "*". - - - - &Use HTTPS instead of HTTP - Na&udoti HTTPS vietoje HTTP - - - - Bypass authentication for clients on localhost - Apeiti atpažinimą klientams, esantiems vietiniame serveryje - - - - Bypass authentication for clients in whitelisted IP subnets - Apeiti atpažinimą klientams, kurie yra IP potinklių baltajame sąraše + + Show qBittorrent in notification area + Rodyti qBittorrent piktogramą pranešimų srityje - - IP subnet whitelist... - IP potinklių baltasis sąrašas... - - - - Upda&te my dynamic domain name - Atn&aujinti mano dinaminį domeno vardą - - - + Minimize qBittorrent to notification area Suskleisti qBittorrent į pranešimų sritį - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. Užverti qBittorrent į pranešimų sritį - + Tray icon style: Dėklo piktogramos stilius: - + Normal Įprasta - + Monochrome (Dark theme) Vienspalvė (Tamsi) - + Monochrome (Light theme) Vienspalvė (Šviesi) - + File association Failų susiejimas - + Use qBittorrent for .torrent files Naudoti qBittorrent .torrent failams - + Use qBittorrent for magnet links Naudoti qBittorrent Magnet nuorodoms - + Power Management Energijos valdymas - + + Inhibit system sleep when torrents are active + Neleisti užmigdyti sistemos, kai yra aktyvių siuntimų + + + + Log file + Žurnalo failas + + + Save path: Išsaugojimo kelias: - + Backup the log file after: Daryti atsarginę žurnalo failo kopiją po: - + + MB + MB + + + Delete backup logs older than: Ištrinti atsargines žurnalo kopijas, senesnes nei: - + days Delete backup logs older than 10 months dienų - + months Delete backup logs older than 10 months mėnesių - + years Delete backup logs older than 10 years metų - + When adding a torrent Kai pridedamas torentas - + + Display torrent content and some options + Rodyti torento turinį ir keletą parinkčių + + + Bring torrent dialog to the front Iškelti torento dialogo langą į priekį - + Do not start the download automatically The torrent will be added to download list in pause state Nepradėti atsiuntimų automatiškai - + Should the .torrent file be deleted after adding it Ar .torrent failas po pridėjimo turėtų būti ištrinamas - + + Delete .torrent files afterwards + Po to ištrinti .torrent failus + + + Also delete .torrent files whose addition was cancelled Taip pat ištrinti .torrent failus, kurių pridėjimas buvo atšauktas - + Also when addition is cancelled Taip pat, kai pridėjimas yra atšaukiamas - + Warning! Data loss possible! Įspėjimas! Galimas duomenų praradimas! - + Saving Management Išsaugojimo tvarkymas - + Default Torrent Management Mode: Numatytoji torento tvarkymo veiksena: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category Automatinė veiksena reiškia, kad įvairios torento savybės (pvz., išsaugojimo kelias) bus nuspręstos pagal priskirtą kategoriją. - + Manual Rankinė - + Automatic Automatinė - + When Torrent Category changed: Kai pakeičiama torento kategorija: - + Relocate torrent Perkelti torentą - + Switch torrent to Manual Mode Perjungti torentą į rankinę veikseną - + When Default Save Path changed: Kai pakeičiamas numatytasis išsaugojimo kelias: - - + + Relocate affected torrents Perkelti paveiktus torentus - - + + Switch affected torrents to Manual Mode Perjungti paveiktus torentus į rankinę veikseną - + When Category changed: Kai pakeičiama kategorija: - + Use Subcategories Naudoti subkategorijas - + Default Save Path: Numatytasis išsaugojimo kelias: - + Keep incomplete torrents in: Nebaigtus siuntimus laikyti čia: - + Copy .torrent files to: Kopijuoti .torrent failus į: - - Show &qBittorrent in notification area - Rodyti &qBittorrent piktogramą pranešimų srityje - - - - &Log file - Žu&rnalo failas - - - - Display &torrent content and some options - Rodyti &torento turinį ir keletą parinkčių - - - - Create subfolder for torrents with multiple files - Torentams su keliais failais kurti poaplankį - - - - De&lete .torrent files afterwards - Po to ištri&nti .torrent failus - - - + Copy .torrent files for finished downloads to: Kopijuoti baigtų atsiuntimų .torrent failus į: - + Pre-allocate disk space for all files Iš anksto priskirti disko vietą visiems failams - - Inhibit system sleep when torrents are downloading - Neleisti užmigdyti sistemos, kai yra atsiunčiami torentai - - - - Inhibit system sleep when torrents are seeding - Neleisti užmigdyti sistemos, kai yra skleidžiamas turinys - - - + Append .!qB extension to incomplete files Pridėti .!qB plėtinį nebaigtiems siųsti failams - - Enable recursive download dialog - Įjungti rekursyvaus atsiuntimo dialogą - - - + Automatically add torrents from: Automatiškai pridėti torentus iš: - + Add entry Pridėti įrašą - + Remove entry Šalinti įrašą - + + Email notification upon download completion + Pabaigus atsiuntimą, pranešti el. paštu + + + + Destination email: + Gavėjo el. pašto adresas: + + + SMTP server: SMTP serveris: - + This server requires a secure connection (SSL) Šis serveris reikalauja saugaus susijungimo (SSL) - - + + + Authentication Atpažinimas - - - - + + + + Username: Naudotojo vardas: - - - - + + + + Password: Slaptažodis: - - Enabled protocol: - Įjungtas protokolas: - - - - TCP and μTP - TCP ir μTP + + Run external program on torrent completion + Užbaigus torento siuntimą, paleisti išorinę programą - + Listening Port Klausymosi prievadas - + Port used for incoming connections: Prievadas, naudojamas įeinantiems sujungimams: - + Random Atsitiktinis - + Use UPnP / NAT-PMP port forwarding from my router Naudoti UPnP / NAT-PMP prievadų nukreipimą mašrutizatoriuje - + Use different port on each startup Kiekvieno paleidimo metu naudoti skirtingą prievadą - + Connections Limits Prisijungimų apribojimai - + Maximum number of connections per torrent: Didžiausias prisijungimų skaičius vienam torentui: - + Global maximum number of connections: Visuotinis didžiausias prisijungimų skaičius: - + Maximum number of upload slots per torrent: Didžiausias išsiuntimo prisijungimų skaičius vienam torentui: - + Global maximum number of upload slots: Visuotinis didžiausias leistinas išsiuntimo prisijungimų skaičius: - + Proxy Server Įgaliotasis serveris - + Type: Tipas: - + (None) (jokio) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Serveris: - - + + Port: Prievadas: - + Otherwise, the proxy server is only used for tracker connections Kitais atvejais įgaliotasis serveris naudojamas tik prisijungimams prie seklių - + Use proxy for peer connections Naudoti įgaliotąjį serverį susijungimams su siuntėjais - + Disable connections not supported by proxies Išjungti įgaliotųjų serverių nepalaikomus ryšius - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Daugiau informacijos</a>) - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection RSS kanalai, paieškos sistemos, programinės įrangos atnaujinimai ar bet kas kita, nei torentų persiuntimai ar su jais susijusios operacijos (pvz., apsikeitimai su kitais siuntėjais) naudos tiesioginį susijungimą - + Use proxy only for torrents Naudoti įgaliotąjį serverį tik torentams - - A&uthentication - A&tpažinimas - - - + Info: The password is saved unencrypted Informacija: Slaptažodis yra išsaugomas nešifruotai - + + IP Filtering + IP filtravimas + + + Filter path (.dat, .p2p, .p2b): Kelias iki filtro (.dat, .p2p, .p2b): - + Reload the filter Įkelti filtrą iš naujo - - Manually banned IP addresses... - Rankiniu būdu uždrausti IP adresai... - - - + Apply to trackers Taikyti sekliams - + Global Rate Limits Visuotinis greičio ribojimas - - - - - - - KiB/s - KiB/s - - - - + + Upload: Išsiuntimo: - - + + + + + KiB/s + KiB/s + + + + Download: Atsiuntimo: - + Alternative Rate Limits Alternatyvūs greičio apribojimai - - + + Schedule the use of alternative rate limits + Planuoti alternatyvių greičio apribojimų naudojimą + + + From: from (time1 to time2) Nuo: - - + To: time1 to time2 Iki: - + When: Kada: - + Every day Kasdieną - + Weekdays Darbo dienomis - + Weekends Savaitgaliais - + Rate Limits Settings Greičio apribojimų nustatymai - + Apply rate limit to peers on LAN Taikyti greičio apribojimus siuntėjams LAN tinkle - + Apply rate limit to transport overhead Taikyti santykio apribojimą perdavimo pertekliui - - + + + Enable µTP protocol + Įjungti µTP protokolą + + + Apply rate limit to µTP protocol Taikyti greičio apribojimus µTP protokolui - + Privacy Privatumas - + Enable DHT (decentralized network) to find more peers Įjungti DHT (decentralizuotą tinklą), kad būtų rasta daugiau siuntėjų - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Keistis siuntėjais su suderinamais BitTorrent klientais (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers Įjungti apsikeitimą siuntėjais (PeX), kad būtų rasta daugiau siuntėjų - + Look for peers on your local network Ieškoti siuntėjų vietiniame tinkle - + Enable Local Peer Discovery to find more peers Įjungti vietinių siuntėjų aptikimą, kad būtų rasta daugiau siuntėjų - + Encryption mode: Šifravimo veiksena: - + Prefer encryption Teikti pirmenybę šifravimui - + Require encryption Reikalauti šifravimo - + Disable encryption Išjungti šifravimą - + Enable when using a proxy or a VPN connection Įjunkite, kai naudojate įgaliotąjį serverį ar VPN ryšį - + Enable anonymous mode Įjungti anoniminę veikseną - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Daugiau informacijos</a>) + + + + Torrent Queueing + Siuntimų eilė + + + Maximum active downloads: Didžiausias aktyvių atsiuntimų skaičius: - + Maximum active uploads: Didžiausias aktyvių išsiuntimų skaičius: - + Maximum active torrents: Didžiausias aktyvių torentų skaičius: - + Do not count slow torrents in these limits Į šiuos apribojimus neįskaičiuoti lėtus torentus - - Upload rate threshold: - Išsiuntimo greičio slenkstis: - - - - Download rate threshold: - Atsiuntimo greičio slenkstis: - - - - sec - seconds - sek. - - - - Torrent inactivity timer: - Torento neveiklumo laikmatis: - - - + Share Ratio Limiting - Dalijimosi santykio ribojimas + Dalinimosi santykio ribojimas - + Seed torrents until their ratio reaches Skleisti torentus, kol jų dalinimosi santykis pasieks - + then , o tuomet - + Pause them juos pristabdyti - + Remove them juos pašalinti - - RSS Smart Episode Filters - RSS išmanieji epizodų filtrai + + Automatically add these trackers to new downloads: + Į naujus atsiuntimus, automatiškai pridėti šiuos seklius: + + + + Enable Web User Interface (Remote control) + Įjungti tinklo naudotojo sąsają (nuotolinis valdymas) - + Use UPnP / NAT-PMP to forward the port from my router Naudoti UPnP / NAT-PMP, siekiant nukreipti prievadą iš maršrutizatoriaus - + + Use HTTPS instead of HTTP + Vietoj HTTP naudoti HTTPS + + + Certificate: Liudijimas: - + Import SSL Certificate Importuoti SSL liudijimą - + Key: Raktas: - + Import SSL Key Importuoti SSL raktą - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Informacija apie liudijimus</a> - - Use alternative Web UI - Naudoti alternatyvią tinklo naudotojo sąsają - - - - Files location: - Failų vieta: - - - - Enable clickjacking protection - Įjungti apsaugą nuo spustelėjimų ant melagingų objektų + + Bypass authentication for localhost + Apeiti vietinio serverio atpažinimą - - Enable Cross-Site Request Forgery (CSRF) protection - Įjungti apsaugą nuo užklausų tarp svetainių klastojimo (CSRF) + + Update my dynamic domain name + Atnaujinti mano dinaminį domeno vardą - + Service: Paslauga: - + Register Registruotis - + Domain name: Domeno vardas: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! Įjungdami šias parinktis, jūs galite <strong>neatšaukiamai prarasti</strong> savo .torrent failus! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well Kai šios parinktys yra įjungtos, qBittorent <strong>ištrins</strong> .torrent failus po to kai jie bus sėkmingai (pirmas variantas) arba nesėkmingai (antras variantas) pridėti į atsiuntimų eilę. Tai bus taikoma <strong>ne tik</strong> failams, kurie bus atveriami per meniu veiksmą &ldquo;Pridėti torentą&rdquo;, tačiau ir tiems failams, kurie bus atveriami per <strong>failo tipo susiejimus</strong> - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog Jeigu įjungsite antrą parinktį (&ldquo;Taip pat kai pridėjimas yra atšaukiamas&rdquo;), tuomet .torrent failas <strong>bus ištrinamas</strong> netgi tuo atveju, jei dialoge &ldquo;Pridėti torentą&rdquo; nuspausite &ldquo;<strong>Atsisakyti</strong>&rdquo; - - Choose Alternative UI files location - Pasirinkti alternatyvią naudotojo sąsajos failų vietą - - - + Supported parameters (case sensitive): Palaikomi parametrai (skiriant raidžių dydį): - + %N: Torrent name %N: Torento pavadinimas - + %L: Category %L: Kategorija - - %G: Tags (seperated by comma) - %G: Žymės (atskirtos kableliais) - - - + %F: Content path (same as root path for multifile torrent) %F: Turinio kelias (toks pats kaip šaknies kelias kelių failų torente) - + %R: Root path (first torrent subdirectory path) %R: Šaknies kelias (pirmas torento pakatalogio kelias) - + %D: Save path %D: Išsaugojimo kelias - + %C: Number of files %C: Failų skaičius - + %Z: Torrent size (bytes) %Z: Torento dydis (baitais) - + %T: Current tracker %T: Esamas seklys - + %I: Info hash %I: Informacijos maiša - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") Patarimas: Tam, kad tekstas nebūtų apkirptas ties tarpais, rašykite parametrą kabutėse (pvz., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - Torentas bus laikomas lėtu, jeigu per "Torento neveiklumo laikmačio" sekundes jo atsiuntimo ir išsiuntimo greičiai išlieka žemiau šių reikšmių - - - + Select folder to monitor Pasirinkite aplanką, kurį stebėti - + Folder is already being monitored: Aplankas jau yra stebimas: - + Folder does not exist: Aplanko nėra: - + Folder is not readable: Aplanko skaityti nepavyko: - + Adding entry failed Įrašo pridėjimas nepavyko - - - - + + Choose export directory Pasirinkite eksportavimo katalogą - - - + + + + + + Choose a save directory Pasirinkite išsaugojimo katalogą - + Choose an IP filter file Pasirinkite IP filtrų failą - + All supported filters Visi palaikomi filtrai - + SSL Certificate SSL liudijimas - + + SSL Key + SSL raktas + + + Parsing error Analizavimo klaida - + Failed to parse the provided IP filter Nepavyko išanalizuoti pateikto IP filtro - + Successfully refreshed Sėkmingai atnaujinta - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Pateiktas IP filtras sėkmingai išanalizuotas. Pritaikytos %1 taisyklės. - + Invalid key Netaisyklingas raktas - + This is not a valid SSL key. Šis raktas nėra taisyklingas SSL raktas. - + Invalid certificate Netaisyklingas liudijimas - - Preferences - Nuostatos - - - - Import SSL certificate - Importuoti SSL liudijimą - - - + This is not a valid SSL certificate. Šis liudijimas nėra taisyklingas SSL liudijimas. - - Import SSL key - Importuoti SSL raktą - - - - SSL key - SSL raktas - - - + Time Error Laiko klaida - + The start time and the end time can't be the same. Pradžios bei pabaigos laikai negali sutapti. - - + + Length Error Ilgio klaida - + The Web UI username must be at least 3 characters long. Tinklo sąsajos naudotojo vardas privalo būti bent 3 simbolių ilgio. - + The Web UI password must be at least 6 characters long. Tinklo sąsajos naudotojo slaptažodis privalo būti bent 6 simbolių ilgio. @@ -5899,72 +5245,72 @@ PeerInfo - - Interested(local) and Choked(peer) - Susidomėjęs(vietinis) ir prismaugtas(siuntėjas) + + interested(local) and choked(peer) + susidomėjęs(vietinis) ir prismaugtas(siuntėjas) - + interested(local) and unchoked(peer) susidomėjęs(siuntėjas) ir nebesmaugiamas(siuntėjas) - + interested(peer) and choked(local) susidomėjęs(siuntėjas) ir prismaugtas(vietinis) - + interested(peer) and unchoked(local) susidomėjęs(siuntėjas) ir nebesmaugiamas(vietinis) - + optimistic unchoke optimistiškai nebesmaugiamas - + peer snubbed siuntėjas ignoruojamas - + incoming connection įeinantis prisijungimas - + not interested(local) and unchoked(peer) nesusidomėjęs(vietinis) ir nebesmaugiamas(siuntėjas) - + not interested(peer) and unchoked(local) nesusidomėjęs(siuntėjas) ir nebesmaugiamas(vietinis) - + peer from PEX siuntėjas iš PEX - + peer from DHT siuntėjas iš DHT - + encrypted traffic užšifruotas srautas - + encrypted handshake užšifruotas pasisveikinimas - + peer from LSD siuntėjas iš LSD @@ -5972,180 +5318,165 @@ PeerListWidget - + IP IP - + Port Prievadas - + Flags Vėliavos - + Connection Jungiamumas - + Client i.e.: Client application Klientas - + Progress i.e: % downloaded - Eiga + Baigta - + Down Speed i.e: Download speed Atsiuntimo greitis - + Up Speed i.e: Upload speed Išsiuntimo greitis - + Downloaded i.e: total data downloaded Atsiųsta - + Uploaded i.e: total data uploaded Išsiųsta - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Tinkamumas - + Files i.e. files that are being downloaded right now Failai - + Column visibility Stulpelio matomumas - + Add a new peer... Pridėti siuntėją... - - + + Ban peer permanently Uždrausti siuntėją visam laikui - + Manually adding peer '%1'... Rankiniu būdu pridedamas siuntėjas "%1"... - + The peer '%1' could not be added to this torrent. Siuntėjo "%1" nepavyko pridėti prie šio torento. - + Manually banning peer '%1'... Rankiniu būdu uždraudžiamas siuntėjas "%1"... - - + + Peer addition Siuntėjo pridėjimas - + Country Šalis - + Copy IP:port Kopijuoti IP:prievadą - + Some peers could not be added. Check the Log for details. Nepavyko pridėti kai kurių siuntėjų. Išsamesnei informacijai žiūrėkite žurnalą. - + The peers were added to this torrent. Siuntėjai buvo pridėti prie šio torento. - + Are you sure you want to ban permanently the selected peers? Ar tikrai norite visam laikui uždrausti pasirinktus siuntėjus? - + &Yes &Taip - + &No &Ne - PeersAdditionDialog + PeersAdditionDlg - - Add Peers - Pridėti siuntėjus + + No peer entered + Neįvestas siuntėjas - - List of peers to add (one IP per line): - Norimų pridėti siuntėjų sąrašas (po vieną IP eilutėje): - - - - Format: IPv4:port / [IPv6]:port - Formatas: IPv4:prievadas/ [IPv6]:prievadas - - - - No peer entered - Neįvestas siuntėjas - - - + Please type at least one peer. Įveskite bent vieną siuntėją. - + Invalid peer Netaisyklingas siuntėjas - + The peer '%1' is invalid. Siuntėjas "%1" yra netaisyklingas. @@ -6153,12 +5484,12 @@ PieceAvailabilityBar - + White: Unavailable pieces Balta: Neprieinamos dalys - + Blue: Available pieces Mėlyna: Prieinamos dalys @@ -6166,337 +5497,293 @@ PiecesBar - + Files in this piece: Failų šioje dalyje: - + File in this piece Failas šioje dalyje - + File in these pieces Failas šiose dalyse - - Wait until metadata become available to see detailed information - Norėdami matyti išsamesnę informaciją, laukite, kol taps prieinami metaduomenys - - - + Hold Shift key for detailed information Išsamesnei informacijai, laikykite nuspaudę Shift klavišą - PluginSelectDialog + PluginSelectDlg - + Search plugins Paieškos papildiniai - + Installed search plugins: Įdiegti paieškos papildiniai: - + Name Pavadinimas - + Version Versija - + Url URL - - + + Enabled Įjungta - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - Įspėjimas: Atsisiųsdami failus iš šių paieškos sistemų, būkite susipažinę su savo šalies autorių teisių įstatymais. - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> Naujų paieškos sistemų papildinių galite gauti čia: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one Įdiegti naują - + Check for updates Tikrinti, ar yra atnaujinimų - + Close Užverti - + Uninstall Pašalinti - - - + + + Yes Taip - - - - + + + + No Ne - + Uninstall warning Pašalinimo įspėjimas - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. Kai kurių papildinių nepavyko pašalinti, nes jie yra integruoti į qBittorrent. Pašalinti galima tik tuos papildinius, kuriuos pridėjote patys. Tie papildiniai buvo išjungti. - + Uninstall success Sėkmingai pašalinta - + All selected plugins were uninstalled successfully Visi pasirinkti papildiniai buvo sėkmingai pašalinti - - - - - Search plugin update - Paieškos papildinio atnaujinimas - - - - Plugins installed or updated: %1 - Įdiegti ar atnaujinti papildiniai: %1 - - - - + + New search engine plugin URL Naujo paieškos sistemos papildinio URL - - + + URL: URL: - + Invalid link Netaisyklinga nuoroda - + The link doesn't seem to point to a search engine plugin. - Nepanašu, kad nuoroda nurodytų į paieškos sistemos papildinį. + Nepanašu, jog nuoroda nurodytų į paieškos sistemos papildinį. - + Select search plugins Pasirinkite paieškos papildinius - + qBittorrent search plugin qBittorrent paieškos papildinys - + + + + Search plugin update + Paieškos papildinio atnaujinimas + + + All your plugins are already up to date. Visi jūsų papildiniai yra naujausios versijos. - + Sorry, couldn't check for plugin updates. %1 Atleiskite, nepavyko patikrinti ar papildiniui yra prieinami atnaujinimai. %1 - + + + Search plugin install Paieškos papildinio įdiegimas - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + "%1" paieškos sistemos papildinys buvo sėkmingai įdiegtas. + + + Couldn't install "%1" search engine plugin. %2 Nepavyko įdiegti "%1" paieškos sistemos papildinio. %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + "%1" paieškos sistemos papildinys buvo sėkmingai atnaujintas. + + + Couldn't update "%1" search engine plugin. %2 Nepavyko atnaujinti "%1" paieškos sistemos papildinio. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source Papildinio šaltinis - + Search plugin source: Paieškos papildinio šaltinis: - + Local file Vietinis failas - + Web link Tinklo nuoroda - PowerManagement - - - qBittorrent is active - qBittorrent aktyvi - - - - PreviewSelectDialog - - - Preview - Peržiūra - + PreviewSelect - + Name - Pavadinimas + Vardas - + Size Dydis - + Progress - Eiga + Baigta - - + + Preview impossible Peržiūra neįmanoma - - + + Sorry, we can't preview this file Atsiprašome, tačiau negalime parodyti šio failo - Private::FileLineEdit - - - '%1' does not exist - "'%1" nėra - - - - '%1' does not point to a directory - "%1" nenurodo į katalogą - - - - '%1' does not point to a file - "%1" nenurodo į failą - - - - Does not have read permission in '%1' - Neturi leidimo skaityti ties "%1" - - - - Does not have write permission in '%1' - Neturi leidimo rašyti ties "%1" - - - PropListDelegate - + Not downloaded Neatsiųsti - - + + Normal Normal (priority) Įprasta - - N/A - Nėra - - - + Do not download Do not download (priority) - Nesiųsti + Nesiųsti - - + + High High (priority) Aukšta - + N/A + Nėra + + + Mixed Mixed (priorities Įvairi - - + + Maximum Maximum (priority) Aukščiausia @@ -6505,32 +5792,32 @@ PropTabBar - + General Bendra - + Trackers Sekliai - + Peers Siuntėjai - + HTTP Sources HTTP šaltiniai - + Content Failai - + Speed Greitis @@ -6550,7 +5837,7 @@ Progress: - Eiga: + Baigta: @@ -6624,29 +5911,29 @@ Komentaras: - + Select All Pažymėti viską - + Select None Nieko nežymėti - + Normal Normali - + High Aukšta Share Ratio: - Dalijimosi santykis: + Dalinimosi santykis: @@ -6691,173 +5978,173 @@ Torrent Hash: - Torento maiša: + Torento maišos raktas: Save Path: - Išsaugojimo kelias: + Atsiuntimo vieta: - + Maximum Aukščiausia + - Do not download Nesiųsti - + Never Niekada - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (turima %3) - - + + %1 (%2 this session) %1 (%2 šiame seanse) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (skleidžiama jau %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (daugiausiai %2) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (viso %2) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (vidut. %2) - + Open Atverti - + Open Containing Folder Atverti aplanką - + Rename... Pervadinti... - + Priority Svarba - + New Web seed Naujas žiniatinklio šaltinis - + Remove Web seed Pašalinti žiniatinklio šaltinį - + Copy Web seed URL Kopijuoti žiniatinklio šaltinio URL - + Edit Web seed URL Redaguoti žiniatinklio šaltinio URL - + + Rename the file + Pervadinti failą + + + New name: Naujas vardas: - - + + + The file could not be renamed + Failo pervadinti nepavyko + + + + This file name contains forbidden characters, please choose a different one. + Šiame failo varde yra neleistinų simbolių, pasirinkite kitokį. + + + + This name is already in use in this folder. Please use a different name. Šis vardas šiame aplanke jau naudojamas. Pasirinkite kitokį vardą. - + The folder could not be renamed Šio aplanko pervadinti nepavyko - + qBittorrent qBittorrent - + Filter files... Filtruoti failus... - - Renaming - Pervadinimas - - - - - Rename error - Pervadinimo klaida - - - - The name is empty or contains forbidden characters, please choose a different one. - Pavadinimas tuščias arba jame yra uždraustų simbolių, prašome pasirinkti kitą pavadinimą. - - - + New URL seed New HTTP source Naujo šaltinio adresas - + New URL seed: Naujo šaltinio adresas: - - + + This URL seed is already in the list. Šis adresas jau yra sąraše. - + Web seed editing Žiniatinklio šaltinio redagavimas - + Web seed URL: Žiniatinklio šaltinio URL: @@ -6865,585 +6152,551 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + Jūsų IP adresas buvo užblokuotas po per didelio kiekio nepavykusių atpažinimo bandymų. + + + + Error: '%1' is not a valid torrent file. + + Klaida: '%1' nėra taisyklingas torento failas. + + + + + Error: Could not add torrent to session. + Klaida: Nepavyko pridėti torento į seansą. + + + + I/O Error: Could not create temporary file. + I/O Klaida: Nepavyko sukurti laikinojo failo. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 yra nežinomas komandų eilutės parametras. - - + + %1 must be the single command line parameter. %1 privalo būti vienas komandų eilutės parametras. - + + %1 must specify the correct port (1 to 65535). + %1 privalo nurodyti teisingą prievadą (1 iki 65535). + + + You cannot use %1: qBittorrent is already running for this user. Jūs negalite naudoti %1: programa qBittorrent šiam naudotojui jau yra vykdoma. - + Usage: Naudojimas: - + Options: Parinktys: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - Parametras "%1" privalo atitikti sintaksę "%1=%2" + + Displays program version + Rodo programos versiją - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - Parametras "%1" privalo atitikti sintaksę "%1=%2" + + Displays this help message + Rodo šią pagalbos žinutę - - Expected integer number in environment variable '%1', but got '%2' - Aplinkos kintamajame "%1" tikėtasi sveiko skaičiaus, tačiau gauta "%2" + + Changes the Web UI port (current: %1) + Pakeičia tinklo sąsajos prievadą (dabartinis: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - Parametras "%1" privalo atitikti sintaksę "%1=%2" + + Disable splash screen + Išjungti pradžios langą - - Expected %1 in environment variable '%2', but got '%3' - Aplinkos kintamajame "%2" tikėtasi %1, tačiau gauta "%3" + + Run in daemon-mode (background) + Vykdyti foniniame režime - - port - prievadas + + Downloads the torrents passed by the user + Atsiunčia torentus, perduotus naudotojo - - %1 must specify a valid port (1 to 65535). - %1 privalo nurodyti teisingą prievadą (1 iki 65535). + + Help + Žinynas - - Display program version and exit - Rodyti programos versiją ir išeiti + + Run application with -h option to read about command line parameters. + Vykdykite programą su -h parinktimi, norėdami skaityti apie komandų eilutės parametrus. - - Display this help message and exit - Rodyti šį pagalbos pranešimą ir išeiti + + Bad command line + Bloga komandų eilutė - - Change the Web UI port - Pakeisti tinklo sąsajos prievadą + + Bad command line: + Bloga komandų eilutė: - - Disable splash screen - Išjungti pradžios langą + + Legal Notice + Teisinis pranešimas - - Run in daemon-mode (background) - Vykdyti foniniame režime + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + qBittorrent yra failų dalinimosi programa. Vykdant torento siuntimą, jo duomenys bus prieinami kitiems išsiuntimo tikslais. Visas turinys, kuriuo dalinsitės, yra Jūsų atsakomybė. + +Daugiau nebus rodoma pranešimų apie tai. - - dir - Use appropriate short form or abbreviation of "directory" - katalogas + + Press %1 key to accept and continue... + Spauskite mygtuką %1, jei sutinkate ir norite tęsti... + + + + Legal notice + Teisinis pranešimas - - Store configuration files in <dir> - Laikyti konfigūracijos failus ties <dir> + + Cancel + Atšaukti - - - name - pavadinimas + + I Agree + Sutinku - - Store configuration files in directories qBittorrent_<name> - Laikyti konfigūracijos failus qBittorrent_<name> kataloguose + + Torrent name: %1 + Torento pavadinimas: %1 - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Įsilaužti į libtorrent greitojo pratęsimo failus ir padaryti failų kelius santykinius profilio katalogui + + Torrent size: %1 + Torento dydis: %1 - - files or URLs - failai ar URL + + Save path: %1 + Atsiuntimo vieta: %1 - - Download the torrents passed by the user - Atsisiųsti naudotojo perduotus torentus + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Torentas atsiųstas per %1. - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Nurodyti ar pridedant torentą bus atveriamas "Pridėti naują torentą" dialogas + + Thank you for using qBittorrent. + Ačiū, kad naudojatės qBittorrent. - - Options when adding new torrents: - Parinktys, pridedant naujus torentus: + + [qBittorrent] '%1' has finished downloading + [qBittorrent] "%1" atsiuntimas užbaigtas - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Trumpinys, skirtas %1 + + The remote host name was not found (invalid hostname) + Nuotolinio serverio vardas nerastas (negaliojantis serverio vardas) - - path - kelias + + The operation was canceled + Operacija buvo atšaukta - - Torrent save path - Torento išsaugojimo kelias + + The remote server closed the connection prematurely, before the entire reply was received and processed + Serveris netinkamai nutraukė prisijungimą, nespėjus gauti bei apdoroti pilno atsakymo - - Add torrents as started or paused - Pridėti torentus kaip pradėtus ar pristabdytus + + The connection to the remote server timed out + Baigėsi prisijungimui skirtas laikas - - Skip hash check - Praleisti maišos tikrinimą + + SSL/TLS handshake failed + SSL/TLS pasisveikinimas nepavyko - - Assign torrents to category. If the category doesn't exist, it will be created. - Priskirti torentus kategorijai. Jeigu kategorijos nėra, ji bus sukurta. + + The remote server refused the connection + Serveris atmetė prisijungimą - - Download files in sequential order - Atsisiųsti failus eilės tvarka + + The connection to the proxy server was refused + Proxy serveris atmetė prisijungimą - - Download first and last pieces first - Visų pirma siųsti pirmas ir paskutines dalis + + The proxy server closed the connection prematurely + Proxy serveris netinkamai nutraukė prisijungimą - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - Parinkties reikšmės gali būti pateikiamos per aplinkos kintamuosius. Parinkčiai, pavadinimu "parameter-name", aplinkos kintamojo pavadinimas bus "QBT_PARAMETER_NAME" (rašant didžiosiomis raidėmis, "-" pakeičiami "_"). Norėdami perduoti vėliavėlių reikšmes, nustatykite kintamąjį į "1" arba "TRUE". Pavyzdžiui, norint išjungti prisistatymo langą: + + The proxy host name was not found + Proxy stoties vardas nerastas - - Command line parameters take precedence over environment variables - Komandų eilutės parametrai turi pirmumo teisę prieš aplinkos kintamuosius + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Baigėsi prisijungimui prie proxy serverio skirtas laikas arba proxy serveris laiku neatsakė į užklausą - - Help - Žinynas + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Proxy serveris reikalauja atpažinimo, norint įvykdyti užklausą, tačiau nepriėmė jokių siūlytų duomenų. - - Run application with -h option to read about command line parameters. - Vykdykite programą su -h parinktimi, norėdami skaityti apie komandų eilutės parametrus. + + The access to the remote content was denied (401) + Priėjimas prie turinio buvo uždraustas (401) - - Bad command line - Bloga komandų eilutė + + The operation requested on the remote content is not permitted + Užklaustas veiksmas yra neleistinas serveryje - - Bad command line: - Bloga komandų eilutė: + + The remote content was not found at the server (404) + Turinys serveryje nerastas (404) - - Legal Notice - Teisinis pranešimas + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Serveris reikalauja atpažinimo norint įvykdyti užklausą, tačiau nepriėmė jokių siūlytų duomenų - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - qBittorrent yra dalijimosi failais programa. Vykdant torento siuntimą, jo duomenys bus prieinami kitiems išsiuntimo tikslais. Visas turinys, kuriuo dalinsitės, yra jūsų asmeninė atsakomybė. + + The Network Access API cannot honor the request because the protocol is not known + Tinklo priėjimo API negali įvykdyti užklausos, nes užklausos protokolas nežinomas - - No further notices will be issued. - Daugiau apie tai nebus rodoma jokių pranešimų. + + The requested operation is invalid for this protocol + Šis veiksmas yra negalimas šiam protokolui - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - qBittorrent yra dalijimosi failais programa. Vykdant torento siuntimą, jo duomenys bus prieinami kitiems išsiuntimo tikslais. Visas turinys, kuriuo dalinsitės, yra jūsų asmeninė atsakomybė. - -Daugiau apie tai nebus rodoma jokių pranešimų. + + An unknown network-related error was detected + Įvyko nežinoma tinklo klaida - - Press %1 key to accept and continue... - Spauskite mygtuką %1, jei sutinkate ir norite tęsti... + + An unknown proxy-related error was detected + Įvyko nežinoma proxy klaida - - Legal notice - Teisinis pranešimas + + An unknown error related to the remote content was detected + Įvyko nežinoma, su nuotoliniu turiniu susijusi, klaida - - Cancel - Atšaukti + + A breakdown in protocol was detected + Protokole aptiktas gedimas - - I Agree - Sutinku + + Unknown error + Nežinoma klaida - - + + Upgrade Atnaujinti - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] Jūs atsinaujinote iš senesnės versijos, kuri kitaip išsaugodavo duomenis. Privalote persikelti į naują išsaugojimo sistemą. Jūs daugiau nebegalėsite naudoti senesnės nei v3.3.0 versijos. Tęsti? [t/n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. Jūs atsinaujinote iš senesnės versijos, kuri kitaip išsaugodavo duomenis. Privalote persikelti į naują išsaugojimo sistemą. Jeigu tęsite, jūs daugiau nebegalėsite naudoti senesnės nei v3.3.0 versijos. - + Couldn't migrate torrent with hash: %1 Nepavyko perkelti torento su maiša: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 Nepavyko perkelti torento. Neteisingas greitojo pratęsimo failo pavadinimas: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 - Aptiktas netvarkingas išėjimas iš programos. Naudojamas gedimų neutralizavimo failas, kad būtų atkurti nustatymai: %1 + + Detected unclean program exit. Using fallback file to restore settings. + Aptiktas netvarkingas išėjimas iš programos. Naudojamas gedimų neutralizavimo failas, kad būtų atkurti nustatymai. - + An access error occurred while trying to write the configuration file. Įvyko prieigos klaida, bandant įrašyti konfigūracijos failą. - + A format error occurred while trying to write the configuration file. Įvyko formato klaida, bandant įrašyti konfigūracijos failą. - - - An unknown error occurred while trying to write the configuration file. - Įvyko nežinoma klaida, bandant įrašyti konfigūracijos failą. - - RSS::AutoDownloader + RSS - - - Invalid data format. - Neteisingas duomenų formatas. + + Search + Ieškoti - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - Nepavyko įrašyti RSS automatinio atsiuntimo duomenų į %1. Klaida: %2 + + New subscription + Nauja prenumerata - - Invalid data format - Klaidingas duomenų formatas + + + + Mark items read + Pažymėti visus kaip skaitytus - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - Nepavyko perskaityti RSS automatinio atsiuntimo taisyklių iš %1. Klaida: %2 + + Update all + Atnaujinti visus - - Couldn't load RSS AutoDownloader rules. Reason: %1 - Nepavyko įkelti RSS automatinio atsiuntimo taisyklių. Priežastis: %1 + + RSS Downloader... + RSS atsiuntimas... - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - Nepavyko atsisiųsti RSS kanalo ties "%1". Priežastis: %2 + + Settings... + Nuostatos... - - RSS feed at '%1' updated. Added %2 new articles. - RSS kanalas ties "%1" atnaujintas. Pridėta %2 naujų įrašų. + + Torrents: (double-click to download) + Torentai: (dukart spustelėkite, kad atsisiųstumėte) - - Failed to parse RSS feed at '%1'. Reason: %2 - Nepavyko išnagrinėti RSS kanalo ties "%1". Priežastis: %2 + + + Delete + Ištrinti - - Couldn't read RSS Session data from %1. Error: %2 - Nepavyko perskaityti RSS seanso duomenų iš %1. Klaida: %2 + + Rename... + Pervadinti... - - Couldn't parse RSS Session data. Error: %1 - Nepavyko išnagrinėti RSS seanso duomenų. Klaida: %1 + + Rename + Pervadinti - - Couldn't load RSS Session data. Invalid data format. - Nepavyko įkelti RSS seanso duomenų. Neteisingas duomenų formatas. + + + Update + Atnaujinti - - Couldn't load RSS article '%1#%2'. Invalid data format. - Nepavyko įkelti RSS įrašo "%1#%2". Neteisingas duomenų formatas. + + New subscription... + Nauja prenumerata... - - - RSS::Private::Parser - - Invalid RSS feed. - Neteisingas RSS kanalas. + + + Update all feeds + Atnaujinti visus kanalus - - %1 (line: %2, column: %3, offset: %4). - %1 (eilutė: %2, stulpelis: %3, poslinkis: %4). + + Download torrent + Atsisiųsti torentą - - - RSS::Session - - RSS feed with given URL already exists: %1. - RSS kanalas su nurodytu URL jau yra: %1. + + Open news URL + Atverti naujienos URL - - Cannot move root folder. - Nepavyksta perkelti šakninio aplanko. + + Copy feed URL + Kopijuoti kanalo URL - - - Item doesn't exist: %1. - Elemento nėra: %1. + + New folder... + Naujas aplankas... - - Cannot delete root folder. - Nepavyksta ištrinti šakninio aplanko. + + Refresh RSS streams + Atnaujinti RSS srautus + + + RSSImp - - Incorrect RSS Item path: %1. - Neteisingas RSS elemento kelias: %1. + + Stream URL: + Srauto URL: - - RSS item with given path already exists: %1. - RSS elementas su nurodytu keliu jau yra: %1. + + Please type a RSS stream URL + Įveskite RSS srauto URL adresą - - Parent folder doesn't exist: %1. - Viršaplankio nėra: %1. - - - - RSSWidget - - - Search - Paieška - - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - RSS kanalų gavimas dabar yra išjungtas! Jūs galite jį įjungti programos nustatymuose. - - - - New subscription - Nauja prenumerata - - - - - - Mark items read - Žymėti elementus kaip skaitytus - - - - Refresh RSS streams - Iš naujo įkelti RSS srautus - - - - Update all - Atnaujinti visus - - - - RSS Downloader... - RSS atsiuntimas... - - - - Torrents: (double-click to download) - Torentai: (norėdami atsisiųsti, dukart spustelėkite) - - - - - Delete - Ištrinti - - - - Rename... - Pervadinti... - - - - Rename - Pervadinti + + This RSS feed is already in the list. + Šis RSS kanalas jau yra sąraše. - - - Update - Atnaujinti + + Please choose a folder name + Pasirinkite aplanko vardą - - New subscription... - Nauja prenumerata... + + Folder name: + Aplanko vardas: - - - Update all feeds - Atnaujinti visus kanalus + + New folder + Naujas aplankas - - Download torrent - Atsisiųsti torentą + + Deletion confirmation + Pašalinimo patvirtinimas - - Open news URL - Atverti naujienos URL + + Are you sure you want to delete the selected RSS feeds? + Ar tikrai norite ištrinti pasirinktus RSS kanalus? - - Copy feed URL - Kopijuoti kanalo URL + + Please choose a new name for this RSS feed + Pasirinkite naują vardą šiam RSS kanalui - - New folder... - Naujas aplankas... + + New feed name: + Naujas kanalo vardas: - - Please choose a folder name - Pasirinkite aplanko pavadinimą + + Name already in use + Šis vardas jau naudojamas - - Folder name: - Aplanko pavadinimas: + + This name is already used by another item, please choose another one. + Šis vardas jau naudojamas, pasirinkite kitokį vardą. - - New folder - Naujas aplankas + + Date: + Data: - - Please type a RSS feed URL - Įrašykite RSS kanalo URL + + Author: + Autorius: - - Feed URL: - Kanalo URL: + + Unread + Neskaityta + + + Rss::Feed - - Deletion confirmation - Ištrynimo patvirtinimas + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + Automatinis "%1" atsiuntimas iš "%2" RSS kanalo nepavyko, nes jame nėra torento ar magnet nuorodos... - - Are you sure you want to delete the selected RSS feeds? - Ar tikrai norite ištrinti pasirinktus RSS kanalus? + + Automatically downloading '%1' torrent from '%2' RSS feed... + Automatiškai atsiunčiamas torentas "%1" iš RSS kanalo "%2"... + + + Rss::Private::Parser - - Please choose a new name for this RSS feed - Pasirinkite šiam RSS kanalui naują pavadinimą + + Invalid RSS feed. + Netaisyklingas RSS kanalas. + + + RssSettingsDlg - - New feed name: - Naujas kanalo pavadinimas: + + RSS Reader Settings + RSS skaitytuvo nuostatos - - Rename failed - Pervadinimas nepavyko + + RSS feeds refresh interval: + RSS kanalų atnaujinimo intervalas: - - Date: - Data: + + min + min. - - Author: - Autorius: + + Maximum number of articles per feed: + Didžiausias įrašų kanale kiekis: ScanFoldersDelegate - + Select save location Pasirinkti išsaugojimo vietą @@ -7451,274 +6704,268 @@ ScanFoldersModel - + Monitored Folder Stebimas aplankas - + Override Save Location Nustelbti išsaugojimo vietą - + Monitored folder Stebimas aplankas - + Default save location Numatytoji išsaugojimo vieta - + Browse... Naršyti... - SearchJobWidget + SearchEngine - - Form - Forma + + Unknown search engine plugin file format. + Nežinomas paieškos sistemos papildinio failo formatas. - - Results(xxx) - Rezultatai(xxx) + + A more recent version of this plugin is already installed. + Jau yra įdiegta naujesnė šio papildinio versija. - - Search in: - Ieškoti: + + + Plugin is not supported. + Papildinys nepalaikomas. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - <html><head/><body><p>Kai kurios paieškos sistemos atlieka paiešką torentų aprašuose, o taip pat jų failų pavadinimuose. Ši veiksena valdo tai, ar tokie rezultatai bus rodomi sąraše žemiau.</p><p><span style=" font-weight:600;">Visur </span>išjungia filtravimą ir rodo visus paieškos sistemų pateikiamus rezultatus.</p><p><span style=" font-weight:600;">Tik torentų pavadinimuose</span> rodo tik tuos torentus, kurių pavadinimai atitinka paieškos užklausą.</p></body></html> + + Update server is temporarily unavailable. %1 + Atnaujinimų serveris laikinai neprieinamas. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - <html><head/><body><p>Nustatykite mažiausią ir didžiausią leidžiamą skleidėjų skaičių</p></body></html> + + + Failed to download the plugin file. %1 + Nepavyko atsisiųsti papildinio failo. %1 - - Seeds: - Skleidėjai: + + An incorrect update info received. + Gauta neteisinga atnaujinimų informacija. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - <html><head/><body><p>Mažiausias skleidėjų skaičius</p></body></html> + + All categories + Visos kategorijos - - - to - iki + + Movies + Filmai - - <html><head/><body><p>Maximal number of seeds</p></body></html> - <html><head/><body><p>Didžiausias skleidėjų skaičius</p></body></html> + + TV shows + TV laidos - - - - + + Music + Muzika - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - <html><head/><body><p>Nustatykite mažiausią ir didžiausią leidžiamą torento dydį</p></body></html> + + Games + Žaidimai - - Size: - Dydis: + + Anime + Anime - - <html><head/><body><p>Minimal torrent size</p></body></html> - <html><head/><body><p>Mažiausias torento dydis</p></body></html> + + Software + Programinė įranga - - <html><head/><body><p>Maximal torrent size</p></body></html> - <html><head/><body><p>Didžiausias torento dydis</p></body></html> + + Pictures + Nuotraukos + + + + Books + Knygos + + + + SearchListDelegate + + + + Unknown + Nežinoma + + + SearchTab - + Name i.e: file name - Pavadinimas + Vardas - + Size i.e: file size Dydis - + Seeders i.e: Number of full sources Skleidėjai - + Leechers i.e: Number of partial sources Siuntėjai - + Search engine Paieškos sistema - - Filter search results... - Filtruoti paieškos rezultatus... - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results Rezultatai (rodoma <i>%1</i> iš <i>%2</i>): - + Torrent names only Tik torentų pavadinimuose - + Everywhere Visur - - Use regular expressions - Naudoti reguliariuosius reiškinius - - - + Searching... Ieškoma... - + Search has finished Paieška baigta - + Search aborted Paieška nutraukta - + An error occurred during search... Paieškos metu įvyko klaida... - + Search returned no results Paieška negrąžino jokių rezultatų - + Column visibility - Stulpelio matomumas - - - - SearchPluginManager - - - Unknown search engine plugin file format. - Nežinomas paieškos sistemos papildinio failo formatas. - - - - A more recent version of this plugin is already installed. - Jau yra įdiegta naujesnė šio papildinio versija. + Stulpelio matomumas - - - Plugin is not supported. - Papildinys nepalaikomas. + + Form + Forma - - All categories - Visos kategorijos + + Results(xxx) + Rezultatai(xxx) - - Movies - Filmai + + Search in: + Ieškoti: - - TV shows - TV laidos + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Kai kurios paieškos sistemos atlieka paiešką torentų aprašuose, o taip pat jų failų pavadinimuose. Ši veiksena valdo tai, ar tokie rezultatai bus rodomi sąraše žemiau.</p><p><span style=" font-weight:600;">Visur </span>išjungia filtravimą ir rodo visus paieškos sistemų pateikiamus rezultatus.</p><p><span style=" font-weight:600;">Tik torentų pavadinimuose</span> rodo tik tuos torentus, kurių pavadinimai atitinka paieškos užklausą.</p></body></html> - - Music - Muzika + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Nustatykite mažiausią ir didžiausią leidžiamą skleidėjų skaičių</p></body></html> - - Games - Žaidimai + + Seeds: + Skleidėjai: - - Anime - Anime + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Mažiausias skleidėjų skaičius</p></body></html> - - Software - Programinė įranga + + + to + iki - - Pictures - Paveikslai + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Didžiausias skleidėjų skaičius</p></body></html> - - - Books - Knygos + + + + + - - Update server is temporarily unavailable. %1 - Atnaujinimų serveris laikinai neprieinamas. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Nustatykite mažiausią ir didžiausią leidžiamą torento dydį</p></body></html> - - - Failed to download the plugin file. %1 - Nepavyko atsisiųsti papildinio failo. %1 + + Size: + Dydis: - - An incorrect update info received. - Gauta neteisinga atnaujinimų informacija. + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Mažiausias torento dydis</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - Paieškos papildinyje "%1" yra neteisinga versijos eilutė ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Didžiausias torento dydis</p></body></html> @@ -7726,198 +6973,185 @@ - - - - + + + Search Paieška - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - Nėra įdiegta jokių paieškos papildinių. -Norėdami juos įdiegti, spustelėkite lango apatinėje dešinėje mygtuką "Paieškos papildiniai...". - - - + Download Atsisiųsti - + Go to description page Eiti į aprašymo puslapį - + Copy description page URL Kopijuoti aprašymo puslapio URL - + Search plugins... Paieškos papildiniai... - + A phrase to search for. Frazė, kurios ieškoti. - + Spaces in a search term may be protected by double quotes. Tarpai paieškos žodžiuose gali būti išsaugoti dvigubomis kabutėmis. - + Example: Search phrase example Pavyzdys: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>: bus ieškoma <b>foo</b> ir <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: bus ieškoma <b>foo bar</b> - + All plugins Visi papildiniai - + Only enabled Tik įjungti - + Select... Pasirinkti... - - - + + + Search Engine Paieškos sistema - + Please install Python to use the Search Engine. Norėdami naudoti paieškos sistemą, įdiekite Python. - + Empty search pattern Tuščias paieškos raktažodis - + Please type a search pattern first Visų pirma nurodykite paieškos raktažodį - + Stop Stabdyti - + Search has finished Paieška baigta - + Search has failed Paieška nepavyko - ShutdownConfirmDialog - - - Don't show again - Daugiau neberodyti - + ShutdownConfirmDlg - + qBittorrent will now exit. Dabar iš qBittorrent bus išeita. - + E&xit Now Iš&eiti dabar - + Exit confirmation - Išėjimo patvirtinimas + Užvėrimo patvirtinimas - + The computer is going to shutdown. Kompiuteris ruošiasi išsijungti. - + &Shutdown Now &Išjungti dabar - - Shutdown confirmation - Išjungimo patvirtinimas - - - + The computer is going to enter suspend mode. Kompiuteris ruošiasi pereiti į pristabdymo veikseną. - + &Suspend Now Pri&stabdyti dabar - + Suspend confirmation Pristabdymo patvirtinimas - + The computer is going to enter hibernation mode. Kompiuteris ruošiasi pereiti į užmigdymo veikseną. - + &Hibernate Now &Užmigdyti dabar - + Hibernate confirmation Užmigdymo patvirtinimas - + You can cancel the action within %1 seconds. - Galite atsisakyti šio veiksmo %1 sekundžių bėgyje. + Jūs galite atsisakyti šio veiksmo %1 sekundžių begyje. + + + + Shutdown confirmation + Išjungimo patvirtinimas SpeedLimitDialog - + KiB/s KiB/s @@ -7925,52 +7159,52 @@ SpeedPlotView - + Total Upload Bendras išsiuntimas - + Total Download Bendras atsiuntimas - + Payload Upload Naudingasis išsiuntimas - + Payload Download Naudingasis atsiuntimas - + Overhead Upload Pridėtinis išsiuntimas - + Overhead Download Pridėtinis atsiuntimas - + DHT Upload DHT išsiuntimas - + DHT Download DHT atsiuntimas - + Tracker Upload Seklio išsiuntimas - + Tracker Download Seklio atsiuntimas @@ -7978,95 +7212,87 @@ SpeedWidget - + Period: Laikotarpis: - + 1 Minute 1 minutė - + 5 Minutes 5 minutės - + 30 Minutes 30 minučių - + 6 Hours 6 valandos - + Select Graphs Pasirinkti kreives - + Total Upload Bendras išsiuntimas - + Total Download Bendras atsiuntimas - + Payload Upload Naudingasis išsiuntimas - + Payload Download Naudingasis atsiuntimas - + Overhead Upload Pridėtinis išsiuntimas - + Overhead Download Pridėtinis atsiuntimas - + DHT Upload DHT išsiuntimas - + DHT Download DHT atsiuntimas - + Tracker Upload Seklio išsiuntimas - + Tracker Download Seklio atsiuntimas - StacktraceDialog - - - Crash info - Strigties informacija - - - StatsDialog @@ -8079,49 +7305,49 @@ Naudotojo statistika - - Cache statistics - Podėlio statistika + + Total peer connections: + Viso susijungimų: - - Read cache hits: - Kreipiniai į skaitymo podėlį: + + Global ratio: + Visuotinis santykis: - - Average time in queue: - Vidutinė laukimo eilėje trukmė: + + Alltime download: + Viso atsisiųsta: - - Connected peers: - Prisijungusių siuntėjų: + + Alltime upload: + Viso išsiųsta: - - All-time share ratio: - Viso laikotarpio dalijimosi santykis: + + Total waste (this session): + Viso iššvaistyta (šiuo paleidimu): - - All-time download: - Viso laikotarpio atsiuntimas: + + Cache statistics + Podėlio statistika - - Session waste: - Iššvaistyta per seansą: + + Read cache hits: + Kreipiniai į skaitymo podėlį: - - All-time upload: - Viso laikotarpio išsiuntimas: + + Average time in queue: + Vidutinė laukimo eilėje trukmė: - Total buffer size: - Bendras buferio dydis: + Total buffers size: + Bendras buferių dydis: @@ -8149,7 +7375,12 @@ Bendras eilės dydis: - + + OK + Gerai + + + %1 ms 18 milliseconds %1 ms @@ -8158,27 +7389,32 @@ StatusBar - + Connection status: Prisijungimo būsena: - + No direct connections. This may indicate network configuration problems. Nėra tiesioginių susijungimų. Tai gali reikšti tinklo nustatymo problemas. - + DHT: %1 nodes DHT: %1 mazgų - - qBittorrent needs to be restarted! - qBittorrent turi būti paleista iš naujo! + + qBittorrent needs to be restarted + qBittorrent turi būti paleistas iš naujo + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent ką tik atsinaujino ir ją reikia paleisti iš naujo, norint, kad įsigaliotų nauji pakeitimai. @@ -8197,883 +7433,616 @@ Prisijungta - + Click to switch to alternative speed limits Spauskite, jei norite įjungti alternatyvius greičio apribojimus - + Click to switch to regular speed limits Spauskite, jei norite įjungti įprastus greičio apribojimus - + + Manual change of rate limits mode. The scheduler is disabled. + Rankinio apribojimų keitimo režimas. Planuotojas išjungtas. + + + Global Download Speed Limit Visuotinis atsiuntimo greičio apribojimas - + Global Upload Speed Limit Visuotinis išsiuntimo greičio apribojimas - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter Visi (0) - + Downloading (0) Atsiunčiami (0) - + Seeding (0) Skleidžiami (0) - + Completed (0) Užbaigti (0) - + Resumed (0) Pratęsti (0) - + Paused (0) Pristabdyti (0) - + Active (0) Aktyvūs (0) - + Inactive (0) Neaktyvūs (0) - + Errored (0) Klaida (0) - + All (%1) Visi (%1) - + Downloading (%1) Atsiunčiami (%1) - + Seeding (%1) Skleidžiami (%1) - + Completed (%1) Užbaigti (%1) - + Paused (%1) Pristabdyti (%1) - + Resumed (%1) Pratęsti (%1) - + Active (%1) Aktyvūs (%1) - + Inactive (%1) Neaktyvūs (%1) - + Errored (%1) Klaida (%1) - TagFilterModel + TorrentContentModel - - Tags - Žymės + + Name + Vardas - - All - Visos + + Size + Dydis - - Untagged - Be žymių + + Progress + Baigta - - - TagFilterWidget - - Add tag... - Pridėti žymę... + + Download Priority + Atsiuntimo svarba - - Remove tag - Šalinti žymę + + Remaining + Liko + + + TorrentCreatorDlg - - Remove unused tags - Šalinti nenaudojamas žymes + + Select a folder to add to the torrent + Pasirinkite aplanką, kurį norite įdėti į torentą - - Resume torrents - Pratęsti torentus + + Select a file to add to the torrent + Pasirinkite failą, kurį norite įdėti į torentą - - Pause torrents - Pristabdyti torentus + + No input path set + Nenurodyta įvesties vieta - - Delete torrents - Ištrinti torentus + + Please type an input path first + Visų pirma nurodykite įvesties vietą - - New Tag - Nauja žymė + + Select destination torrent file + Pasirinkite, kur norite išsaugoti torentą - - Tag: - Žymė: + + Torrent Files (*.torrent) + Torentų failai (*.torrent) - - Invalid tag name - Neteisingas žymės pavadinimas + + Torrent was created successfully: %1 + %1 is the path of the torrent + Torentas sėkmingai sukurtas: %1 - - Tag name '%1' is invalid - Žymės pavadinimas "%1" yra neteisingas + + + + Torrent creation + Torento kūrimas - - Tag exists - Žymė yra + + Torrent creation was unsuccessful, reason: %1 + Torento sukurti nepavyko, priežasitis: %1 - - Tag name already exists. - Žymės pavadinimas jau yra. + + Created torrent file is invalid. It won't be added to download list. + Sukurtas torento failas yra sugadintas. Jis nebus pridėtas į siuntimų sąrašą. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Torento kategorijos savybės + + Name + i.e: torrent name + Vardas - - Name: - Pavadinimas: + + Size + i.e: torrent size + Dydis - - Save path: - Išsaugojimo kelias: + + Done + % Done + Baigta - - Choose save path - Pasirinkite išsaugojimo kelią + + Status + Torrent status (e.g. downloading, seeding, paused) + Būsena - - New Category - Nauja kategorija + + Seeds + i.e. full sources (often untranslated) + Skleidėjai - - Invalid category name - Neteisingas kategorijos pavadinimas + + Peers + i.e. partial sources (often untranslated) + Siuntėjai - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - Kategorijos pavadinime negali būti "\". -Kategorijos pavadinimas negali prasidėti/užsibaigti simboliu "/". -Kategorijos pavadinime negali būti "//" sekos. + + Down Speed + i.e: Download speed + Ats. greitis - - Category creation error - Kategorijos sukūrimo klaida + + Up Speed + i.e: Upload speed + Išs. greitis - - Category with the given name already exists. -Please choose a different name and try again. - Kategorija tokiu pavadinimu jau yra. -Pasirinkite kitokį pavadinimą ir bandykite dar kartą. + + Ratio + Share ratio + Santykis - - - TorrentContentModel - - Name - Vardas + + ETA + i.e: Estimated Time of Arrival / Time left + Liko - - Size - Dydis + + Category + Kategorija - - Progress - Eiga + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Pridėta - - Download Priority - Atsiuntimo svarba + + Completed On + Torrent was completed on 01/01/2010 08:00 + Užbaigta - - Remaining - Liko + + Tracker + Seklys - - Availability - Prieinamumas + + Down Limit + i.e: Download limit + Ats. riba - - - TorrentCreatorDialog - - Torrent Creator - Sukurti torentą + + Up Limit + i.e: Upload limit + Išs. riba - - Select file/folder to share - Pasirinkite failą/aplanką, kurį bendrinti + + Downloaded + Amount of data downloaded (e.g. in MB) + Atsiųsta - - Path: - Kelias: + + Uploaded + Amount of data uploaded (e.g. in MB) + Išsiųsta - - [Drag and drop area] - [Vilkimo sritis] + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Atsiųsta per seansą - - - Select file - Pasirinkti failą + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Išsiųsta per seansą - - - Select folder - Pasirinkti aplanką + + Remaining + Amount of data left to download (e.g. in MB) + Liko - - Settings - Nustatymai + + Time Active + Time (duration) the torrent is active (not paused) + Aktyvus - - Piece size: - Dalies dydis: + + Save path + Torrent save path + Atsiuntimo vieta - - Auto - nustatyti automatiškai + + Completed + Amount of data completed (e.g. in MB) + Užbaigta - - 16 KiB - 16 KiB + + Ratio Limit + Upload share ratio limit + Dalijimosi santykio riba - - 32 KiB - 32 KiB + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Paskutinį kartą matytas užbaigtu - - 64 KiB - 64 KiB + + Last Activity + Time passed since a chunk was downloaded/uploaded + Paskutinė veikla - - 128 KiB - 128 KiB + + Total Size + i.e. Size including unwanted data + Bendras Dydis + + + TrackerFiltersList - - 256 KiB - 256 KiB + + All (0) + this is for the tracker filter + Visi (0) - - 512 KiB - 512 KiB + + Trackerless (0) + Be seklių (0) - - 1 MiB - 1 MiB + + Error (0) + Klaida (0) - - 2 MiB - 2 MiB + + Warning (0) + Įspėjimas (0) - - 4 MiB - 4 MiB + + + Trackerless (%1) + Be seklių (%1) - - 8 MiB - 8 MiB + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - 16 MiB - 16 MiB + + + Error (%1) + Klaida (%1) - - 32 MiB - 32 MiB + + + Warning (%1) + Įspėjimas (%1) - - Calculate number of pieces: - Paskaičiuoti dalių skaičių: + + Resume torrents + Prastęsti torentus - - Private torrent (Won't distribute on DHT network) - Privatus torentas (Nebus platinamas DHT tinkle) + + Pause torrents + Pristabdyti torentus - - Start seeding immediately - Nedelsiant pradėti skleisti + + Delete torrents + Ištrinti torentus - - Ignore share ratio limits for this torrent - Šiam torentui nepaisyti dalijimosi santykio apribojimų + + + All (%1) + this is for the tracker filter + Visi (%1) + + + TrackerList - - Optimize alignment - Optimizuoti failų išdėstymą + + URL + URL - - Fields - Laukai + + Status + Būsena - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - Tuščia eilute galite atskirti seklius į pakopas / grupes. + + Received + - - Web seed URLs: - Saityno skleidimo URL adresai: + + Seeds + Skleidėjai - - Tracker URLs: - Seklių URL: + + Peers + Siuntėjai - - Comments: - Komentarai: + + Downloaded + - - Source: - Šaltinis: - - - - Progress: - Eiga: - - - - Create Torrent - Sukurti torentą - - - - - - Torrent creation failed - Torento sukūrimas nepavyko - - - - Reason: Path to file/folder is not readable. - Priežastis: Kelias į failą/aplanką nėra skaitomas. - - - - Select where to save the new torrent - Pasirinkite kur išsaugoti naują torentą - - - - Torrent Files (*.torrent) - Torentų failai (*.torrent) - - - - Reason: %1 - Priežastis: %1 - - - - Reason: Created torrent is invalid. It won't be added to download list. - Priežastis: Sukurtas torentas yra sugadintas. Jis nebus pridėtas į siuntimų sąrašą. - - - - Torrent creator - Sukurti torentą - - - - Torrent created: - Torentas sukurtas: - - - - TorrentInfo - - - File size exceeds max limit %1 - Failo dydis viršija didžiausią ribą %1 - - - - Torrent file read error: %1 - Torento failo skaitymo klaida: %1 - - - - Torrent file read error: size mismatch - Torento failo skaitymo klaida: dydžių neatitikimas - - - - TorrentsController - - - Not contacted yet - Kol kas nesusisiekta - - - - Updating... - Atnaujinama... - - - - Working - Veikia - - - - Not working - Neveikia - - - - Error: '%1' is not a valid torrent file. - Klaida: '%1' nėra taisyklingas torento failas. - - - - - - - Torrent queueing must be enabled - Privalo būti įjungta siuntimų eilė - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - Save path is empty - Išsaugojimo kelias yra tuščias - - - - Cannot make save path - Nepavyksta sukurti išsaugojimo kelio - - - - Cannot write to directory - Nepavyksta rašyti į katalogą - - - - WebUI Set location: moving "%1", from "%2" to "%3" - Tinklo sąsaja Nustatyti vietą: perkeliama "%1", iš "%2" į "%3" - - - - Incorrect torrent name - Neteisingas torento pavadinimas - - - - - Incorrect category name - Neteisingas kategorijos pavadinimas - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - Visi (0) - - - - Trackerless (0) - Be seklių (0) - - - - Error (0) - Klaida (0) - - - - Warning (0) - Įspėjimas (0) - - - - - Trackerless (%1) - Be seklių (%1) - - - - - Error (%1) - Klaida (%1) - - - - - Warning (%1) - Įspėjimas (%1) - - - - Resume torrents - Prastęsti torentus - - - - Pause torrents - Pristabdyti torentus - - - - Delete torrents - Ištrinti torentus - - - - - All (%1) - this is for the tracker filter - Visi (%1) + + Message + Žinutė - - - TrackerListWidget - - + + Working Veikia - + Disabled Išjungta - + This torrent is private Šis torentas yra privatus - + Updating... Atnaujinama... - + Not working Neveikia - + Not contacted yet Dar nesusisiekta - - - - - - - N/A - Nėra + + Tracker URL: + Seklio URL: - + Tracker editing Seklio redagavimas - - Tracker URL: - Seklio URL: - - - - + + Tracker editing failed Nepavyko redaguoti seklio - + The tracker URL entered is invalid. Įvestas netaisyklingas seklio URL. - + The tracker URL already exists. - Toks seklio URL jau yra. + Toks seklio URL jau egzistuoja. - + Add a new tracker... - Pridėti naują seklį... + Pridėti seklį... - - Remove tracker - Šalinti seklį - - - + Copy tracker URL Kopijuoti seklio URL - + Edit selected tracker URL Redaguoti pasirinkto seklio URL - + Force reannounce to selected trackers Priverstinai siųsti atnaujinimus pasirinktiems sekliams - + Force reannounce to all trackers Priverstinai siųsti atnaujinimus visiems sekliams - - URL - URL - - - - Status - Būsena - - - - Received - Gauta - - - - Seeds - Skleidėjai - - - - Peers - Siuntėjai - - - - Downloaded - Atsiųsta - - - - Message - Žinutė - - - - Column visibility - Stulpelio matomumas - - - - TrackerLoginDialog - - - - Tracker authentication - Seklio atpažinimas - - - - Tracker: - Seklys: - - - - Login - Prisijungimas - - - - Username: - Naudotojo vardas: - - - - Password: - Slaptažodis: - - - - Log in - Prisijungti + + Remove tracker + Pašalinti seklį - TrackersAdditionDialog + TrackersAdditionDlg - + Trackers addition dialog - Seklių pridėjimo dialogas + Seklių pridėjimo vediklis - + List of trackers to add (one per line): Norimų pridėti seklių sąrašas (po vieną eilutėje): - - + + µTorrent compatible list URL: Suderinamo su µTorrent sąrašo URL: - + + I/O Error + I/O klaida + + + + Error while trying to open the downloaded file. + Klaida bandant atverti atsiųstą failą. + + + No change Jokių pokyčių - + No additional trackers were found. Nerasta jokių papildomų seklių. - + Download error Atsiuntimo klaida - + The trackers list could not be downloaded, reason: %1 Seklių sąrašo atsiųsti nepavyko, priežastis: %1 @@ -9081,686 +8050,694 @@ TransferListDelegate - + Downloading Atsiunčiama - + Downloading metadata used when loading a magnet link Atsiunčiami metaduomenys - + Allocating qBittorrent is allocating the files on disk Išskiriama - + Paused Pristabdyta - + Queued i.e. torrent is queued Eilėje - + Seeding Torrent is complete and in upload-only mode Skleidžiama - + Stalled Torrent is waiting for download to begin Laukiama - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] Atsiunčiama - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] Skleidžiama - + Checking Torrent local data is being checked Tikrinama - + Queued for checking i.e. torrent is queued for hash checking Eilėje patikrinimui - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Tikrinami pratęsimo duomenys - + Completed Užbaigta - - Moving - Torrent local data are being moved/relocated - Perkeliama - - - + Missing Files Trūksta failų - + Errored torrent status, the torrent has an error Klaida - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (skleidžiama jau %2) - + %1 ago e.g.: 1h 20m ago prieš %1 - - TransferListFiltersWidget - - - Status - Būsena - - - - Categories - Kategorijos - - - - Tags - Žymės - - - - Trackers - Sekliai - - - - TransferListModel - - - Name - i.e: torrent name - Pavadinimas - - - - Size - i.e: torrent size - Dydis - - - - Done - % Done - Baigta - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Būsena - - - - Seeds - i.e. full sources (often untranslated) - Skleidėjai - - - - Peers - i.e. partial sources (often untranslated) - Siuntėjai - - - - Down Speed - i.e: Download speed - Ats. greitis - - - - Up Speed - i.e: Upload speed - Išs. greitis - - - - Ratio - Share ratio - Santykis - - - - ETA - i.e: Estimated Time of Arrival / Time left - Liko - - - - Category - Kategorija - - - - Tags - Žymės - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - Pridėta - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - Užbaigta - - - - Tracker - Seklys - - - - Down Limit - i.e: Download limit - Ats. riba - - - - Up Limit - i.e: Upload limit - Išs. riba - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Atsiųsta - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Išsiųsta - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - Atsiųsta per seansą - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - Išsiųsta per seansą - - - - Remaining - Amount of data left to download (e.g. in MB) - Liko - - - - Time Active - Time (duration) the torrent is active (not paused) - Aktyvus - - - - Save path - Torrent save path - Išsaugojimo kelias - - - - Completed - Amount of data completed (e.g. in MB) - Užbaigta - - - - Ratio Limit - Upload share ratio limit - Dalijimosi santykio riba - + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - Paskutinį kartą matytas užbaigtu + + Status + Būsena - - Last Activity - Time passed since a chunk was downloaded/uploaded - Paskutinė veikla + + Categories + Kategorijos - - Total Size - i.e. Size including unwanted data - Bendras dydis + + Trackers + Sekliai TransferListWidget - + Column visibility Stulpelio matomumas - + Choose save path - Pasirinkite išsaugojimo kelią + Pasirinkite išsaugojimo vietą - + Torrent Download Speed Limiting Torento atsiuntimo greičio ribojimas - + Torrent Upload Speed Limiting Torento išsiuntimo greičio ribojimas - + Recheck confirmation Pertikrinimo patvirtinimas - + Are you sure you want to recheck the selected torrent(s)? Ar tikrai norite pertikrinti pasirinktą torentą (-us)? - + Rename Pervadinti - + New name: Naujas vardas: - + Resume Resume/start the torrent Tęsti - + Force Resume Force Resume/start the torrent Priverstinai pratęsti - + Pause Pause the torrent Pristabdyti - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Nustatyti vietą: perkeliama "%1", iš "%2" į "%3" - - - - Add Tags - Pridėti žymes - - - - Remove All Tags - Šalinti visas žymes - - - - Remove all tags from selected torrents? - Šalinti pasirinktiems torentams visas žymes? + + New Category + Nauja kategorija - - Comma-separated tags: - Kableliais atskirtos žymės: + + Category: + Kategorija: - - Invalid tag - Neteisinga žymė + + Invalid category name + Neteisingas kategorijos pavadinimas - - Tag name: '%1' is invalid - Žymės pavadinimas: "%1" yra neteisingas + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Kategorijos pavadinime negali būti "\". +Kategorijos pavadinimas negali prasidėti/užsibaigti simboliu "/". +Kategorijos pavadinime negali būti "//" sekos. - + Delete Delete the torrent Ištrinti - + Preview file... Peržiūrėti failą... - + Limit share ratio... Apriboti dalijimosi santykį... - + Limit upload rate... Apriboti išsiuntimo greitį... - + Limit download rate... Apriboti atsiuntimo greitį... - + Open destination folder Atverti atsiuntimo aplanką - + Move up i.e. move up in the queue Aukštyn - + Move down i.e. Move down in the queue Žemyn - + Move to top i.e. Move to top of the queue Į viršų - + Move to bottom i.e. Move to bottom of the queue Į apačią - + Set location... Nustatyti saugojimo vietą... - - Force reannounce - Priverstinai siųsti atnaujinimus - - - + Copy name Kopijuoti pavadinimą - - Copy hash - Kopijuoti maišą - - - + Download first and last pieces first Visų pirma siųsti pirmas ir paskutines dalis - + Automatic Torrent Management Automatinis torento tvarkymas - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category Automatinė veiksena reiškia, kad įvairios torento savybės (pvz., išsaugojimo kelias) bus nuspręstos pagal priskirtą kategoriją. - + Category Kategorija - + New... New category... Nauja... - + Reset Reset category Atstatyti - - Tags - Žymės - - - - Add... - Add / assign multiple tags... - Pridėti... - - - - Remove All - Remove all tags - Šalinti visas - - - + Priority Svarba - + Force recheck Priverstinai pertikrinti - + Copy magnet link Kopijuoti Magnet nuorodą - + Super seeding mode Super skleidimo režimas - + Rename... Pervadinti... - + Download in sequential order Siųsti dalis iš eilės - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting Torentų Išsiuntimo/Atsiuntimo santykio ribojimas - - Use global share limit - Naudoti visuotinį dalijimosi apribojimą + + Use global ratio limit + Naudoti visuotinį santykio apribojimą - - - + + + buttonGroup buttonGroup - - Set no share limit - Nenustatinėti jokio dalijimosi apribojimo + + Set no ratio limit + Neriboti dalijimosi santykio + + + + Set ratio limit to + Nustatyti santykio ribą iki + + + + WebApplication + + + Incorrect category name + Neteisingas kategorijos pavadinimas + + + + WebUI + + + The Web UI is listening on port %1 + Tinklo naudotojo sąsaja klausosi ties prievadu %1 + + + + Web UI Error - Unable to bind Web UI to port %1 + Tinklo naudotojo sąsajos klaida - Nepavyksta pririšti tinklo naudotojo sąsają prie prievado %1 + + + about - - Set share limit to - Nustatyti dalijimosi apribojimą į + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Pažangus BitTorrent klientas, parašytas C++ programavimo kalba, naudojant Qt bei libtorrent-rasterbar bibliotekas. - - ratio - santykis + + Copyright %1 2006-2016 The qBittorrent project + Autorių Teisės %1 2006-2016 qBittorrent projektas - - minutes - minučių + + Home Page: + Svetainė internete: - - No share limit method selected - Nepasirinktas joks dalijimosi apribojimo metodas + + Forum: + Diskusijų forumas: - - Please select a limit method first - Iš pradžių, pasirinkite apribojimų metodą + + Bug Tracker: + Klaidų seklys: - Utils::ForeignApps + addPeersDialog + + + Add Peers + Pridėti siuntėjus + - - Python detected, version: %1 - Python aptikta, versija: %1 + + List of peers to add (one per line): + Norimų pridėti siuntėjų sąrašas (po vieną eilutėje): - - Python not detected - Python neaptikta + + Format: IPv4:port / [IPv6]:port + Formatas: IPv4:prievadas/ [IPv6]:prievadas - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - Nepriimtinas failo tipas, yra leidžiamas tik įprastas failas. + + + Tracker authentication + Seklio atpažinimas - - Symlinks inside alternative UI folder are forbidden. - Simbolinės nuorodos alternatyvaus naudotojo sąsajos aplanko viduje yra uždraustos. + + Tracker: + Seklys: - - Exceeded the maximum allowed file size (%1)! - Viršytas didžiausias leidžiamas failo dydis (%1)! + + Login + Prisijungimas - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - Tinklo sąsaja: Kilmės antraštė ir Paskirties kilmė nesutampa! Šaltinio IP: "%1". Kilmės antraštė: "%2". Paskirties kilmė: "%3" + + Username: + Naudotojo vardas: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - Tinklo sąsaja: Nukreipėjo antraštė ir Paskirties kilmė nesutampa! Šaltinio IP: "%1". Nukreipėjo antraštė: "%2". Paskirties kilmė: "%3" + + Password: + Slaptažodis: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - Tinklo sąsaja: Neteisinga Serverio antraštė, prievadai nesutampa. Užklausos šaltinio IP: "%1". Serverio prievadas: "%2". Gauta Serverio antraštė: "%3" + + Log in + Prisijungti - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - Tinklo sąsaja: Neteisinga Serverio antraštė. Užklausos šaltinio IP: "%1". Gauta Serverio antraštė: "%2" + + Cancel + Atšaukti - WebUI + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + Pašalinimo patvirtinimas - qBittorrent + + + + Remember choice + Atsiminti pasirinkimą + + + + Also delete the files on the hard disk + Taipogi ištrinti failus iš kietojo disko + + + + confirmShutdownDlg + + + Don't show again + Daugiau neberodyti + + + + createTorrentDialog + + + Cancel + Atšaukti + + + + Torrent Creation Tool + Torento kūrimo vediklis + + + + Torrent file creation + Torento failo kūrimas + + + + Add file + Pridėti failą + + + + Add folder + Pridėti aplanką + + + + File or folder to add to the torrent: + Failas arba aplankas, įdedamas į torentą: + + + + Tracker URLs: + Seklių URL: + + + + Web seeds urls: + Skleidimo tinkle URL: + + + + Comment: + Komentaras: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Galite atskirti seklius į pakopas / grupes tuščia eilute. + + + + Piece size: + Dalies dydis: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + nustatyti automatiškai + + + + Private (won't be distributed on DHT network if enabled) + Privatus (nebus prieinamas DHT tinkle, jei tai įjungta) + + + + Start seeding after creation + Pradėti skleisti po sukūrimo + + + + Ignore share ratio limits for this torrent + Šiam torentui nepaisyti dalinimosi santykio apribojimų + + + + Create and save... + Kurti ir išsaugoti... + + + + Progress: + Baigta: + + + + downloadFromURL + + + Add torrent links + Pridėti torentų nuorodas + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Po vieną eilutėje (palaikomos HTTP nuorodos, Magnet nuorodos bei maišos raktai) + + + + Download + Atsiųsti + + + + Cancel + Atšaukti + - - Web UI: HTTPS setup successful - Tinklo sąsaja: HTTPS sąranka sėkminga + + Download from urls + Atsiųsti iš URL adreso - - Web UI: HTTPS setup failed, fallback to HTTP - Tinklo sąsaja: HTTPS sąranka nepavyko, grįžtama prie HTTP + + No URL entered + Neįvestas URL - - Web UI: Now listening on IP: %1, port: %2 - Tinklo sąsaja: Dabar klausomasi ties IP: %1, prievadas: %2 + + Please type at least one URL. + Įveskite bent vieną URL adresą. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Tinklo sąsaja: Nepavyko susieti su IP: %1, prievadas: %2. Priežastis: %3 + + Crash info + Strigties informacija fsutils - + + + + + Downloads Atsiuntimai @@ -9768,100 +8745,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + Python neaptikta + + + + Python version: %1 + Python versija: %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1 val. %2 min. - + %1d %2h e.g: 2days 10hours %1 d. %2 val. - + Unknown Unknown (size) Nežinoma - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent dabar išjungs kompiuterį, kadangi visi siuntimai baigti. - + < 1m < 1 minute < 1 min. - + %1m e.g: 10minutes %1 min. + + + Working + Veikia + + + + Updating... + Atnaujinama... + + + + Not working + Neveikia + + + + Not contacted yet + Dar nesusisiekta + preview - + Preview selection Peržiūrėti pasirinktą dalį - + The following files support previewing, please select one of them: Šie failai gali būti peržiūrėti. Pasirinkite vieną iš jų: + + + Preview + Peržiūrėti + + + + Cancel + Atšaukti + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_lv_LV.ts qbittorrent-3.3.15/src/lang/qbittorrent_lv_LV.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_lv_LV.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_lv_LV.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - + Par qBittorrent - + About - + Par - + Author - - - - - Current maintainer - + Autori - - Greece - Grieķija + + + Nationality: + Nacionalitāte: - - - Nationality: - + + + Name: + Vārds: - - + + E-mail: - + E-pasts: - - - Name: - + + Greece + Grieķija - - Original author - + + Current maintainer + Pašreizējais uzturētājs - - France - Francija + + Original author + Programmas radītājs - + Special Thanks - + Īpašs paldies - + Translators - + Tulkotāji - - License - - - - + Libraries - + Bibliotēkas - + qBittorrent was built with the following libraries: - - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - + Šī qBittorrent versija tika uzbūvēta, izmantojot šīs bibliotēkas: - - Forum: - + + France + Francija - - Bug Tracker: - + + License + Licence @@ -115,57 +90,67 @@ Saglabāt šeit - + + Browse... + Pārlūkot... + + + + Set as default save path + Uzstādīt kā noklusēto saglabāšanas vietu + + + Never show again Vairs nerādīt - + Torrent settings Torrenta iestatījumi - + Set as default category Uzstādīt kā noklusēto kategoriju - + Category: Kategorija: - + Start torrent Sākt lejupielādi - + Torrent information Torrenta informācija - + Skip hash check Izlaist jaucējkoda pārbaudi - + Size: Izmērs: - + Hash: Jaucējkods: - + Comment: Komentārs: - + Date: Datums: @@ -190,117 +175,89 @@ Automātiski - - Remember last used save path - Atcerēties pēdējo norādīto saglabāšanas vietu - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog Ja atzīmēts, .torrent fails netiks dzēsts, neņemot vērā "Lejupielādes" lappuses iestatījumus - + Do not delete .torrent file Neizdzēst .torrent failu - - Create subfolder - Izveidot apakšmapi - - - - Download in sequential order - Lejupielādēt secīgā kārtībā - - - - Download first and last pieces first - Vispirms ielādēt pirmās un pēdējās daļiņas - - - + Normal Normāla - + High Augsta - + Maximum Maksimālā - + Do not download Nelejupielādēt - - - + + + I/O Error Ievades/izvades kļūda - + Invalid torrent Nederīgs torents - - Renaming - Pārdēvēšana - - - - - Rename error - Kļūda pārdēvēšanā + + + + + Already in download list + Jau ir lejupielāžu sarakstā - - The name is empty or contains forbidden characters, please choose a different one. - Nosaukums satur neatļautus simbolus, lūdzu izvēlieties citu nosaukumu. - - - + Not Available This comment is unavailable Nav pieejams - + Not Available This date is unavailable Nav pieejams - + Not available Nav pieejams - + Invalid magnet link Nederīga magnētsaite - + The torrent file '%1' does not exist. Torrenta fails '%1' neeksistē. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. Torrenta failu '%1' nevar nolasīt no diska. Iespējams, jums nav nepieciešamo tiesību. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ Kļūda: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torrents jau ir lejupielāžu sarakstā. Trakeri netika apvienoti, jo tas ir privāts torrents. + + + + Torrent is already in download list. Trackers were merged. + Torrents jau ir lejupielāžu sarakstā. Trakeri tika apvienoti. + + + + + Cannot add torrent + Nevar pievienot torentu + + + + Cannot add this torrent. Perhaps it is already in adding state. + Neizdevās pievienot torrentu. Iespējams tas jau tiek pievienots. + + + This magnet link was not recognized Šī magnētsaite netika atpazīta - + + Magnet link is already in download list. Trackers were merged. + Magnētsaite jau ir lejupielāžu sarakstā. Trakeri tika apvienoti. + + + + Cannot add this torrent. Perhaps it is already in adding. + Neizdevās pievienot torrentu. Iespējams tas jau ir pievienošanā. + + + Magnet link Magnētsaite - + Retrieving metadata... Tiek izgūti metadati... - + Not Available This size is unavailable. Nav pieejams - + Free space on disk: %1 Brīvās vietas diskā: %1 - + + Choose save path Izvēlieties vietu, kur saglabāt - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - + + Rename the file + Pārdēvēt failu - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + + New name: + Jaunais nosaukums: - - Magnet link is already queued for processing. - + + + The file could not be renamed + Failu neizdevās pārdēvēt - - New name: - Jaunais nosaukums: + + This file name contains forbidden characters, please choose a different one. + Šis faila nosaukums satur aizliegtus simbolus, lūdzu izvēlieties citu nosaukumu. - - + + This name is already in use in this folder. Please use a different name. Šajā mapē jau ir fails ar šādu nosaukumu. Lūdzu izvēlieties citu nosaukumu. - + The folder could not be renamed Mapi neizdevās pārdēvēt - + Rename... Pārdēvēt... - + Priority Prioritāte - + Invalid metadata Nederīgi metadati - + Parsing metadata... Tiek parsēti metadati... - + Metadata retrieval complete Metadatu izguve pabeigta - + Download Error Lejupielādes kļūda @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Diskā rakstīšanas kešatmiņas izmērs + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Izejošie porti (Min) [0: Atslēgts] - + Outgoing ports (Max) [0: Disabled] Izejošie porti (Maks.) [0: Atslēgts] - + Recheck torrents on completion - Atkārtoti pārbaudīt torrentus pēc ielādes pabeigšanas + Atkārtoti pārbaudīt torrentus pēc pabeigšanas - + Transfer list refresh interval Torrentu saraksta atsvaidzināšanas intervāls - + ms milliseconds ms - + Setting Iespējas - + Value Value set for this setting Vērtība - - - (disabled) - (Atslēgts) - - - + (auto) (automātiski) - - min - minutes - - - - + All addresses Visas adreses - + qBittorrent Section qBittorrent sadaļa - - + + Open documentation Atvērt dokumentāciju - + libtorrent Section libtorrent sadaļa - - Asynchronous I/O threads - - - - - Disk cache - Diska kešatmiņa - - - + s seconds s - + Disk cache expiry interval Diska kešatmiņas derīguma intervāls - + Enable OS cache Izmantot OS kešatmiņu - - Guided read cache - - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - - - - - - KiB - KiB - - - - Send buffer watermark - - - - - Send buffer low watermark - - - - - Send buffer watermark factor - - - - - Prefer TCP - - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address - Atļaut vairākus savienojumus no vienas IP adreses + + m + minutes + m - + Resolve peer countries (GeoIP) Rādīt koplietotāju valstis (GeoIP) - + Resolve peer host names Rādīt koplietotāju Datoru nosaukumus - + Strict super seeding Piespiedu super-augšupielādēšana - + Network Interface (requires restart) Interneta savienojums (nepieciešams restarts) - + Optional IP Address to bind to (requires restart) Piesaistīt papildu IP adresi (nepieciešams restarts) - + Listen on IPv6 address (requires restart) Klausīties IPv6 adresē (nepieciešams restarts) - + Display notifications - Rādīt paziņojumus + Parādīt paziņojumus - + Display notifications for added torrents - Rādīt paziņojumus par pievienotajiem torrentiem + Parādīt paziņojumus par pievienotajiem torrentiem - + Download tracker's favicon Ielādēt trakera adreses ikonu - - Save path history length - - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - - - - - Round-robin - - - - - Fastest upload - Ātrākā augšupielāde - - - - Anti-leech - - - - - Upload choking algorithm - - - - + Confirm torrent recheck Apstiprināt torrentu atkārtotu pārbaudi - - Confirm removal of all tags - Apstiprināt visu birku noņemšanu - - - - Always announce to all trackers in a tier - + Exchange trackers with other peers + Trakereru apmaiņa koplietotāju starpā - - Always announce to all tiers - + + Always announce to all trackers + Vienmēr uzturēt kontaktu ar visiem trakeriem - + Any interface i.e. Any network interface Automātiski - + Save resume data interval How often the fastresume file is saved. Progresa datu saglabāšanas intervāls - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - - - - + Maximum number of half-open connections [0: Unlimited] Maksimālais pusatvērto savienojumu skaits [0: Neierobežots] - + IP Address to report to trackers (requires restart) IP adrese, kuru paziņot trakeriem (nepieciešams restarts) - + Enable embedded tracker Ieslēgt iebūvēto trakeri - + Embedded tracker port Iebūvētā trakera ports - + Check for software updates Meklēt programmatūras atjauninājumus - + Use system icon theme Lietot sistēmas ikonu dizainu @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started Tika ieslēgts qBittorrent %1 - + Torrent: %1, running external program, command: %2 Torrents: %1, palaista ārējā programma, komanda: %2 - - Torrent name: %1 - Torenta nosaukums: %1 - - - - Torrent size: %1 - Torenta izmērs: %1 - - - - Save path: %1 - Saglabāšanas vieta: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Torrents tika lejupielādēts %1. - - - - Thank you for using qBittorrent. - Paldies, ka izmantojāt qBittorrent. - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' ir pabeidzis lejupielādi + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrents: %1, ārējās programmas palaišanas komanda pārāk gara (garums > %2), izpilde neizdevās. - + Torrent: %1, sending mail notification Torrents: %1, sūta e-pasta paziņojumu - + Information Informācija - - To control qBittorrent, access the Web UI at %1 - Lai piekļūtu qBittorrent Web UI kontroles panelim, atveriet %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + Lai piekļūtu qBittorrent tālvadības kontroles panelim, atveriet http://localhost:%1 - + The Web UI administrator user name is: %1 Tālvadības kontroles paneļa administratora lietotājvārds ir: %1 - + The Web UI administrator password is still the default one: %1 Tālvadības kontroles paneļa administratora parole vēl aizvien ir noklusētā: %1 - + This is a security risk, please consider changing your password from program preferences. Tas is drošības risks, lūdzam apsvērt paroles maiņu - + Saving torrent progress... Saglabā torrenta progresu... - - - Portable mode and explicit profile directory options are mutually exclusive - - - - - Portable mode implies relative fastresume - - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - Jūsu IP adrese ir tikusi nobloķēta, vairāku neveiksmīgu pierakstīšanās mēģinājumu dēļ. - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Saglabāt šeit: @@ -861,836 +658,700 @@ RSS lejupielādētājs - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - RSS automātiskais lejupielādētājs ir atslēgts! Jūs to varat ieslēgt programmas iestatījumos. + + Enable Automated RSS Downloader + Ieslēgt automatizēto RSS lejupielādētāju - + Download Rules Lejupielādes filtri - + Rule Definition Filtra konfigurācija - + Use Regular Expressions Lietot Regulārās izteiksmes - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - Lietot Viedo Epizožu filtru - - - + Must Contain: Iekļaut: - + Must Not Contain: Neiekļaut: - + Episode Filter: Epizožu filtrs: - + Assign Category: Piešķirt kategoriju: - + Save to a Different Directory Saglabāt citā mapē - + Ignore Subsequent Matches for (0 to Disable) ... X days Ignorēt filtra rezultātus uz (0 atslēgt) - + Disabled - Atslēgts + Atslēgts - + days dienām - + Add Paused: Pievienot nopauzētu: - + Use global settings Lietot globālos iestatījumus - + Always Vienmēr - + Never Nekad - + Apply Rule to Feeds: - Pielāgot filtru šiem kanāliem: + Pielāgot filtrus šiem kanāliem: - + Matching RSS Articles Filtra iegūtie rezultāti - + &Import... &Ievietot filtru... - + &Export... &Saglabāt filtru... - + Matches articles based on episode filter. Meklē rezultātus pēc epizožu filtra. - + Example: Piemērs: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match - filtrs atlasīs 2., 5., 8. - 15., 30. un turpmākās pirmās sezonas epizodes + atbildīs 2, 5, 8 - 15, 30 un turpmākās pirmās sezonas epizodes - + Episode filter rules: Epizožu filtrs: - + Season number is a mandatory non-zero value Sezonas numurs nedrīkst būt 0 - + Episode number is a mandatory non-zero value + Epizodes numurs nedrīkst būt 0 + + + Filter must end with semicolon Filtram jābeidzas ar semikolu - + Three range types for episodes are supported: Filtram ir atļauti 3 parametru veidi: - + Single number: <b>1x25;</b> matches episode 25 of season one - Parametrs <b>1x25;</b> atlasīs tikai 1. sezonas 25. epizodi + Parametrs <b>1x25;</b> atzīmēs tikai 1. sezonas 25. epizodi - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one - Parametrs <b>1x25-40;</b> atlasīs tikai 1. sezonas epizodes, sākot no 25. līdz 40. - - - - Episode number is a mandatory positive value - Epizodes numurs nedrīkst būt 0 + Parametrs <b>1x25-40;</b> atzīmēs tikai 1. sezonas epizodes, sākot no 25. līdz 40. - - Rules - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Parametrs <b>1x25-;</b> atzīmēs visas turpmākās epizodes un sezonas, sākot ar 1. sezonas 25. epizodi - - Rules (legacy) + + Episode number is a mandatory positive value - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Parametrs <b>1x25-;</b> atlasīs visas turpmākās epizodes un sezonas, sākot ar 1. sezonas 25. epizodi + - + Last Match: %1 days ago Pēdējie rezultāti: pirms %1 dienām - + Last Match: Unknown Pēdējie rezultāti: nav atrasti - + New rule name Jaunā filtra nosaukums - + Please type the name of the new download rule. Lūdzu ievadiet jaunā filtra nosaukumu. - - + + Rule name conflict - Neatļauts nosaukums + Filtru nosaukumu konflikts - - + + A rule with this name already exists, please choose another name. Filtrs ar šādu nosaukumu jau pastāv, lūdzu izvēlieties citu nosaukumu. - + Are you sure you want to remove the download rule named '%1'? Vai esat pārliecināts, ka vēlaties dzēst filtru ar nosaukumu '%1'? - + Are you sure you want to remove the selected download rules? Vai esat pārliecināts, ka vēlāties dzēst atlasītos lejupielādes filtrus? - + Rule deletion confirmation Filtra dzēšanas apstiprināšana - + Destination directory Izvēlieties saglabāšanas vietu - + Invalid action - + Nederīga darbība - + The list is empty, there is nothing to export. - + Saraksts ir tukšs, nav ko saglabāt. - - Export RSS rules - + + Where would you like to save the list? + Kur vēlaties saglabāt sarakstu? - - + + Rules list (*.rssrules) + Filtru saraksts (*.rssrules) + + + I/O Error - Ievades/izvades kļūda + Ievades/izvades kļūda - - Failed to create the destination file. Reason: %1 - + + Failed to create the destination file + Neizdevās failu saglabāt - - Import RSS rules - + + Please point to the RSS download rules file + Lūdzu norādiet RSS lejupielādes filtru failu - - Failed to open the file. Reason: %1 - + + Rules list + Filtru saraksts - + Import Error - + Importēšanas kļūda - - Failed to import the selected rules file. Reason: %1 - + + Failed to import the selected rules file + Neizdevās ievietot izvēlēto filtra failu - + Add new rule... Pievienot jaunu filtru... - + Delete rule Dzēst filtru - + Rename rule... Pārdēvēt filtru... - + Delete selected rules Dzēst atlasītos filtrus - - Clear downloaded episodes... - - - - + Rule renaming Filtra pārdēvēšana - + Please type the new rule name Lūdzu ievadiet jauno filtra nosaukumu - - Clear downloaded episodes - - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - Regex režīms: lietot Perl valodas regulārās izteiksmes - - - - - Position %1: %2 - + + Regex mode: use Perl-like regular expressions + Regex režīms: lietot Perl-valodas regulārās izteiksmes - + Wildcard mode: you can use - + ? to match any single character - + * to match zero or more of any characters - + Whitespaces count as AND operators (all words, any order) - + | is used as OR operator - + If word order is important use * instead of whitespace. - Ja vārdu secība ir svarīga, lietojiet * simbolu. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - + will match all articles. - + will exclude all articles. - - - BanListOptionsDialog - - - List of banned IP addresses - - - - - Ban IP - - - - - Delete - Dzēst - - - - - Warning - - - - The entered IP address is invalid. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Aizstājējzīmju režīms: jūs varat lietot<ul><li>?, lai atbilstu jebkurš viens simbols</li><li>*, lai atbilstu jebcik jebkādu simbolu</li><li>Atstarpes strādā kā AND operatori - - The entered IP is already banned. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Aizstājējzīmju režīms: jūs varat lietot<ul><li>?, lai atbilstu jebkurš viens simbols</li><li>*, lai atbilstu jebcik jebkādu simbolu</li><li>| simboli strādā kā OR operatori BitTorrent::Session - + Restart is required to toggle PeX support Nepieciešams restarts, lai mainītu PeX atbalsta iestatījumus: - - Could not get GUID of configured network interface. Binding to IP %1 - - - - + Embedded Tracker [ON] Iebūvētais trakeris [IESLĒGTS] - + Failed to start the embedded tracker! Neizdevās ieslēgt iebūvēto trakeri! - + Embedded Tracker [OFF] Iebūvētais trakeris [IZSLĒGTS] - + + '%1' reached the maximum ratio you set. Removing... + '%1' sasniedzis uzstādīto maksimālo reitingu. Torrents tiek dzēsts... + + + + '%1' reached the maximum ratio you set. Pausing... + '%1' sasniedzis uzstādīto maksimālo reitingu. Torrents tiek apstādināts... + + + System network status changed to %1 e.g: System network status changed to ONLINE Sistēmas tīkla statuss izmainīts uz %1 - + ONLINE PIESLĒDZIES - + OFFLINE ATSLĒDZIES - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding Tīkla %1 uzstādījumi ir izmainīti, atjaunojam piesaistītās sesijas datus - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. Tīkla interfeisa uzstādītā adrese %1 nav derīga. - - + Encryption support [%1] Šifrēšanas atbalsts [%1] - - + FORCED PIESPIEDU - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 adrese nav derīga, tādēļ tā netika pievienota bloķēto adrešu sarakstam. - - - - + Anonymous mode [%1] Anonīmais režīms [%1] - + Unable to decode '%1' torrent file. Neizdevās atkodēt '%1' torrenta failu. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' - Faila '%1' rekursīvā lejupielāde torrentam '%2' + Faila '%1' rekursīvā lejupielāde ir torrentā '%2' - + Queue positions were corrected in %1 resume files - + Couldn't save '%1.torrent' Neizdevās saglabāt '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' veiksmīgi izdzēsts no torrentu saraksta. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' veiksmīgi izdzēsts no torrentu saraksta un cietā diskā. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '1%' veiksmīgi izdzēsts no torrentu saraksta, bet failus uz cietā diskā neizdevās izdzēst. Kļūme: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. jo %1 ir izslēgts. - + because %1 is disabled. this peer was blocked because TCP is disabled. jo %1 ir izslēgts. - + URL seed lookup failed for URL: '%1', message: %2 Neizdevās atrast tīmekļa devēju: '%1', ziņojums: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent neizdevās saklausīt interneta savienojuma %1 portus: %2/%3. Iemesls: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' veiksmīgi izdzēsts no Torrentu saraksta un cietā diskā. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' veiksmīgi izdzēsts no Torrentu saraksta. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Lejupielādējam '%1', lūdzu uzgaidiet... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 - qBittorrent šobrīd cenšas nodibināt kontaktu ar jebkuru interneta savienojuma portu: %1 + qBittorrent šobrīd cenšas nodibināt kontaktu ar jebkura interneta savienojuma portu: %1 - + The network interface defined is invalid: %1 Uzstādītais interneta savienojums ir nederīgs: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent šobrīd cenšas nodibināt kontaktu ar interneta savienojuma %1 portu: %2 - - Peer ID: - Koplietotāja ID: - - - - HTTP User-Agent is '%1' - HTTP Lietotāja Aģents ir '%1' - - - - + DHT support [%1] DHT atbalsts [%1] - - - - - - - - - + + + + ON IESLĒGTS - - - - - - - - - + + + + OFF IZSLĒGTS - - + Local Peer Discovery support [%1] Vietējo koplietotāju meklēšana [%1] - - PeX support [%1] - PeX atbalsts [%1] - - - - '%1' reached the maximum ratio you set. Removed. - '%1' sasniedzis uzstādīto maksimālo reitingu. Torrents izdzēsts. - - - - '%1' reached the maximum ratio you set. Paused. - '%1' sasniedzis uzstādīto maksimālo reitingu. Torrents nopauzēts. - - - - '%1' reached the maximum seeding time you set. Removed. - '%1' sasniedzis uzstādīto atļauto augšupielādes laiku. Torrents izdzēsts. - - - - '%1' reached the maximum seeding time you set. Paused. - '%1' sasniedzis uzstādīto atļauto augšupielādes laiku. Torrents nopauzēts. + Restart is required to toggle Tracker Exchange support + Lai pārslēgtu Tracker Exchange atbalstu, nepieciešams restarts - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent nespēja atrast %1 vietējo adresi ar kuru izveidot savienojumu - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent nespēja nodibināt kontaktu ar nevienu portu: %1. Iemesls: %2. - + Tracker '%1' was added to torrent '%2' Trakeris '%1' tika pievienots torrentam '%2' - + Tracker '%1' was deleted from torrent '%2' - Trakeris '%1' tika noņemts torrentam '%2' + Trakeris '%1' tika izdzēsts no torrenta '%2' - + URL seed '%1' was added to torrent '%2' Tīmekļa devējs '%1' tika pievienots torrentam '%2' - + URL seed '%1' was removed from torrent '%2' Tīmekļa devējs '%1' tika atvienots no torrenta '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Neizdevās atsākt torrenta '%1' ielādi - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - Veiksmīgi notikusi IP filtra parsēšana: tika piemēroti %1 nosacījumi + Veiksmīga notikusi IP filtra parsēšana: tika piemēroti %1 nosacījumi - + Error: Failed to parse the provided IP filter. Kļūme: IP filtra parsēšana neveiksmīga. - - '%1' restored. - 'torrent name' restored. - - - - + Couldn't add torrent. Reason: %1 Neizdevās pievienot torentu. Iemesls: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' atsākts. (ātrā atsākšana) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' pievienots lejupielāžu sarakstam. - + An I/O error occurred, '%1' paused. %2 Notikusi Ievades/izvades kļūda, '%1' apstādināts. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Portu skenēšana neveiksmīga, ziņojums: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Portu skenēšana veiksmīga, ziņojums: %1 - + due to IP filter. this peer was blocked due to ip filter. IP filtra dēļ. - + due to port filter. this peer was blocked due to port filter. portu filtra dēļ. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. - dēļ i2p jauktā režīma ierobežojumiem. + i2p jauktā režīma ierobežojumu kārtā. - + because it has a low port. this peer was blocked because it has a low port. - jo koplietotājs izmanto neatļautu portu. + koplietotājs izmanto neatļautu portu. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent veiksmīgi aktīvi noklausās interneta savienojuma %1 portus: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 Ārējā IP: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + Neizdevās pārvietot torrentu: '%1'. Iemesls: %2 - + File sizes mismatch for torrent '%1', pausing it. - + Failu izmēri nesakrīt ar torrentu '%1', torrents nopauzēts. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - + Torrenta '%1' ātrās atsākšanas dati tika noraidīti. Iemesls: %2. Pārbaudām vēlreiz... CategoryFilterModel - + Categories - Kategorijas + Kategorijas - + All - Visi + Visi - + Uncategorized - Bez kategorijas + @@ -1698,42 +1359,147 @@ Add category... - Pievienot kategoriju... + Pievienot kategoriju... Add subcategory... - Pievienot apakškategoriju... + - Edit category... - Labot kategoriju + Remove category + Noņemt kategoriju + + + + Remove unused categories + Noņemt neizmantotās kategorijas + + + + Resume torrents + Atsākt torrentus + + + + Pause torrents + Nopauzēt torrentus + + + + Delete torrents + Dzēst torrentus + + + + New Category + Jauna kategorija + + + + Category: + Kategorija: + + + + Invalid category name + Nederīgs kategorijas nosaukums + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Kategorijas nosaukums nedrīkst saturēt '\'. +Kategorijas nosaukums nedrīkst sākties vai beigties ar '/'. +Kategorijas nosaukums nedrīkst saturēt '//' simbolus. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Visi (0) + + + Uncategorized (0) + Bez kategorijas (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Bez kategorijas (%1) + + + Add category... + Pievienot kategoriju... - Remove category - Dzēst kategoriju + Noņemt kategoriju - Remove unused categories - Dzēst nelietotās kategorijas + Noņemt neizmantotās kategorijas - Resume torrents - Atsākt torrentus + Atsākt torrentus - Pause torrents - Nopauzēt torrentus + Nopauzēt torrentus - Delete torrents - Dzēst torrentus + Dzēst torrentus + + + New Category + Jauna kategorija + + + Category: + Kategorija: + + + Invalid category name + Nederīgs kategorijas nosaukums + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Kategorijas nosaukums nedrīkst saturēt '\'. +Kategorijas nosaukums nedrīkst sākties vai beigties ar '/'. +Kategorijas nosaukums nedrīkst saturēt '//' simbolus. + + + All (%1) + this is for the category filter + Visas (%1) @@ -1773,220 +1539,101 @@ - DeletionConfirmationDialog - - - Deletion confirmation - - + DeletionConfirmationDlg - - Remember choice - - - - - Also delete the files on the hard disk - - - - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Vai esat pārliecināts, ka vēlaties izdzēst '%1' no Torrentu saraksta? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - - - - - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - Lejupielādēt - - - - No URL entered - - - - - Please type at least one URL. - + Vai esat pārliecināts, ka vēlaties izdzēst šos %1 torrentus no Torrentu saraksta? DownloadedPiecesBar - + White: Missing pieces Baltās: Iztrūkstošās daliņas - + Green: Partial pieces Zaļās: Nepabeigtās daļiņas - + Blue: Completed pieces Zilās: Pabeigtās daļiņas - ExecutionLogWidget + ExecutionLog - + General - Vispārīgi + Vispārīgi - + Blocked IPs - + Bloķētās IP adreses - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> tika bloķēta %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - + <font color='red'>%1</font> tika nobloķēts FeedListWidget - + RSS feeds RSS kanāli - - - Unread (%1) - Neskatīti (%1) + + Unread + Neskatīti FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - - - - - &Browse... - Launch file dialog button text (full) - &Pārlūkot... - - - - Choose a file - Caption for file open/save dialog - - - - - Choose a folder - Caption for directory open dialog - - - - - Any file - + + An error occured while trying to open the log file. Logging to file is disabled. + Radās kļūda, mēģinot atvērt reģistra failu. Reģistra saglabāšana failā ir atslēgta. FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. + + + + I/O Error: Could not open ip filter file in read mode. Ievades/Izvades kļūda: Neizdevās nolasīt IP filtra failu. - - - - IP filter line %1 is malformed. - - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - - - - - - IP filter exception thrown for line %1. Exception is: %2 - - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - - - - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. Parsēšanas kļūda: Šis filtra fails nav saderīgs are PeerGuardian P2B failu. @@ -1994,395 +1641,472 @@ GeoIPDatabase - - + + Unsupported database file size. Neatbalstīts datubāzes faila izmērs - + Metadata error: '%1' entry not found. Kļūda Metadatos: "%1' ieraksts nav atrasts. - + Metadata error: '%1' entry has invalid type. Kļūda Metadatos: '%1' nederīgs ieraksts. - + Unsupported database version: %1.%2 Neatbalstīta datubāzes versija: %1.%2 - + Unsupported IP version: %1 Neatbalstīta IP versija: %1 - + Unsupported record size: %1 Neatbalstīts ieraksta izmērs: %1 - + Invalid database type: %1 Nederīgs datubāzes veids: %1 - + Database corrupted: no data section found. Bojāta datubāze: dati netika atrasti - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - + + File + Fails - - Bad Http request, closing socket. IP: %s - + + Edit + Rediģēt - - - HttpServer - + + Help + Palīdzība + + + Exit qBittorrent Aizvērt qBittorrent - + Only one link per line Katrā rindiņā pa vienai saitei - + + Download + Lejupielādēt + + + Global upload rate limit must be greater than 0 or disabled. Globālajam augšupielādes ātruma limitam ir jābūt lielākam par 0 vai arī atslēgtam. - + Global download rate limit must be greater than 0 or disabled. Globālajam lejupielādes ātruma limitam ir jābūt lielākam par 0 vai arī atslēgtam. - + Alternative upload rate limit must be greater than 0 or disabled. Alternatīvajam augšupielādes ātruma limitam ir jābūt lielākam par 0 vai arī atslēgtam. - + Alternative download rate limit must be greater than 0 or disabled. Alternatīvajam lejupielādes ātruma limitam ir jābūt lielākam par 0 vai arī atslēgtam. - + Maximum active downloads must be greater than -1. Maksimālajam aktīvo lejupielāžu skaitam jābūt lielākam par -1. - + Maximum active uploads must be greater than -1. Maksimālajam aktīvo augšupielāžu skaitam jābūt lielākam par -1. - + Maximum active torrents must be greater than -1. Maksimālajam aktīvo torrentu skaitam jābūt lielākam par -1. - + Maximum number of connections limit must be greater than 0 or disabled. Maksimālajam savienojumu skaita limitam jābūt lielākam par 0 vai arī atslēgtam. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Maksimālajam savienojumu skaitam uz katru torrentu jābūt lielākam par 0 vai arī atslēgtam. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Maksimālajam augšupielādes slotu skaitam uz torrentu jābūt lielākam par 0 vai arī atslēgtam. - + Unable to save program preferences, qBittorrent is probably unreachable. Neizdevās saglabāt programmas iestatījumus, qBittorrent droši vien nav sasniedzams. - - IRC: #qbittorrent on Freenode - - - - - Invalid category name: -Please do not use any special characters in the category name. - - - - - Unknown - Nezināms - - - - Hard Disk - - - - - Share ratio limit must be between 0 and 9998. - Koplietošanas reitinga limitam jābūt starp 0 un 9998. - - - - Seeding time limit must be between 0 and 525600 minutes. - + + Language + Valoda - + The port used for incoming connections must be between 1 and 65535. Ienākošo savienojumu portam ir jābūt starp 1 un 65535. - + The port used for the Web UI must be between 1 and 65535. Tālvadības kontroles paneļa portam ir jābūt starp 1 un 65535. - + Unable to log in, qBittorrent is probably unreachable. Neizdevās ielogoties, qBittorrent droši vien nav sasniedzams. - + Invalid Username or Password. Nederīgs lietotājvārds vai parole. - - Username - - - - + Password Parole - + Login Ielogoties - + + Upload Failed! + Augšupielāde neizdevās! + + + Original authors Programmas radītāji - + + Upload limit: + Augšupielādes limits: + + + + Download limit: + Lejupielādes limits: + + + Apply Apstiprināt - + Add Pievienot - + + Category: + Kategorija: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Augšupielādēt torentus - + + All + Visi + + + + Downloading + Lejupielādē + + + + Seeding + Augšupielādē + + + + Completed + Pabeigti + + + + Resumed + Atsākti + + + + Paused + Nopauzēti + + + + Active + Aktīvi + + + + Inactive + Neaktīvi + + + Save files to location: Saglabāt failus šeit: - + Cookie: Sīkdatne: - + Type folder here Ievadiet mapi šeit - + + Run an external program on torrent completion + Pēc torrenta lejupielādes pabeigšanas, palaist šo programmu + + + + Enable bandwidth management (uTP) + Ieslēgt kontroli pār interneta ātrumiem (uTP) + + + + Apply rate limit to uTP connections + Pielāgot ātruma limitu uTP savienojumiem + + + + Alternative Global Rate Limits + Alternatīvie Globālā ātruma ierobežojumi + + + More information Papildus informācija - + Information about certificates Informācija par sertifikātiem - + Save Files to Saglabāt failus šeit: - - Set location - - - - - Limit upload rate - + + Watch Folder + Uzraudzītajā mapē - - Limit download rate - + + Default Folder + Noklusētajā mapē - - Rename torrent - Pārdēvēt torrentu + + from + from time1 to time2 + no - - Unable to create category - + + to + from time1 to time2 + uz - + Other... Save Files to: Watch Folder / Default Folder / Other... Citā... - + + Every day + Schedule the use of alternative rate limits on ... + Katru dienu + + + + Week days + Schedule the use of alternative rate limits on ... + Darbdienās + + + + Week ends + Schedule the use of alternative rate limits on ... + Nedēļas nogalēs + + + Monday Schedule the use of alternative rate limits on ... Pirmdienās - + Tuesday Schedule the use of alternative rate limits on ... Otrdienās - + Wednesday Schedule the use of alternative rate limits on ... Trešdienās - + Thursday Schedule the use of alternative rate limits on ... Ceturtdienās - + Friday Schedule the use of alternative rate limits on ... Piektdienās - + Saturday Schedule the use of alternative rate limits on ... Sestdienās - + Sunday Schedule the use of alternative rate limits on ... Svētdienās - + + Downloaded + Is the file downloaded or not? + Lejupielādēti + + + Logout Iziet - + + Download from URLs + Lejupielādēt no saitēm + + + Download Torrents from their URLs or Magnet links Lejupielādēt torrentus no to URL vai magnētsaitēm - + Upload local torrent Augšupielādēt torrentu - + Are you sure you want to delete the selected torrents from the transfer list? Vai esat pārliecināts, ka vēlaties izdzēst atlasītos torrentus no Torrentu saraksta? - + Save Saglabāt - + qBittorrent client is not reachable qBittorrent klients nav sasniedzams - - qBittorrent has been shutdown. - qBittorrent klients ir izslēgts. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - + + HTTP Server + HTTP serveris - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - + + The following parameters are supported: + Šie parametri ir atbalstīti: - - Add subnet - + + Torrent path + Torrenta atrašanās vieta - - Delete - Dzēst + + Torrent name + Torrenta nosaukums - - Error - Kļūda + + qBittorrent has been shutdown. + qBittorrent klients ir izslēgts. + + + LineEdit - - The entered subnet is invalid. - + + Clear the text + Notīrīt tekstu LogListWidget - + Copy Kopēt - + Clear Notīrīt @@ -2415,551 +2139,493 @@ Kad lejupielādes &pabeigtas - + &View &Skats - + &Options... &Iestatījumi... - + &Resume &Atsākt - + Torrent &Creator Torentu &veidotājs - + Set Upload Limit... Uzstādīt augšupielādes limitu... - + Set Download Limit... Uzstādīt lejupielādes limitu... - + Set Global Download Limit... Uzstādīt Globālo lejupielādes limitu... - + Set Global Upload Limit... Uzstādīt Globālo augšupielādes limitu... - + Minimum Priority Zemākā prioritāte - + Top Priority Augstākā prioritāte - + Decrease Priority Samazināt prioritāti - + Increase Priority Paaugstināt prioritāti - - + + Alternative Speed Limits Alternatīvie ielādes ātrumi - + &Top Toolbar &Augšējā rīkjosla - + Display Top Toolbar Rādīt augšējo rīkjoslu - - Status &Bar - Statusa &josla - - - + S&peed in Title Bar Ā&trums Nosaukuma joslā - + Show Transfer Speed in Title Bar Rādīt ielādes ātrumus Nosaukuma joslā - + &RSS Reader &RSS lasītājs - + Search &Engine Meklētājs - + L&ock qBittorrent A&izslēgt qBittorrent - + Do&nate! Zie&dot! - - Close Window - - - - + R&esume All A&tsākt visus - + Manage Cookies... Sīkfailu pārvaldība... - + Manage stored network cookies Saglabāto tīkla sīkfailu pārvaldība - + Normal Messages Parasti ziņojumi - + Information Messages Informatīvi ziņojumi - + Warning Messages Brīdinājumu ziņojumi - + Critical Messages Kritiski ziņojumi - + &Log Reģistrs - + &Exit qBittorrent &Aizvērt qBittorrent - + &Suspend System Pārslēgties miega režīmā - + &Hibernate System Pārslēgties hibernācijas režīmā - + S&hutdown System Izslēgt datoru - + &Disabled &Nedarīt neko - + &Statistics &Statistika - + Check for Updates Meklēt atjauninājumus - + Check for Program Updates Meklēt programmas atjauninājumus - + &About &Par BitTorrent - + &Pause &Nopauzēt - + &Delete &Dzēst - + P&ause All N&opauzēt visus - + &Add Torrent File... &Pievienot Torrentu failus... - + Open Atvērt - + E&xit Iz&iet - + Open URL Atvērt adresi - + &Documentation &Dokumentācija - + Lock Aizslēgt - - - + + + Show Rādīt - + Check for program updates Meklēt programmas atjauninājumus - + Add Torrent &Link... Pievienot Torrentu &saites... - + If you like qBittorrent, please donate! Ja jums patīk qBittorrent, lūdzu, ziedojiet! - - + Execution Log Reģistrs - + Clear the password Notīrīt paroli - + Filter torrent list... Meklēt torrentu sarakstā... - + &Set Password &Uzstādīt paroli - - Preferences - - - - + &Clear Password &Notīrīt paroli - + Transfers Torrenti - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Torrenta faila asociācija - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorent nav uzstādīta kā noklusētā programma torrenta failu un magnētsaišu atvēršanai. Vai vēlaties to izdarīt tagad? - + Icons Only Tikai ikonas - + Text Only Tikai tekstu - + Text Alongside Icons Teksts blakus ikonām - + Text Under Icons Teksts zem ikonām - + Follow System Style Sistēmas noklusētais - - - + + + UI lock password qBittorrent bloķēšanas parole - - - + + + Please type the UI lock password: Lūdzu ievadiet qBittorrent bloķēšanas paroli: - + The password should contain at least 3 characters Parolei ir jābūt vismaz 3 simbolu garai - + Password update Atjaunot paroli - + The UI lock password has been successfully updated qBittorrent bloķēšanas parole ir veiksmīgi atjaunota - + Are you sure you want to clear the password? Vai esat pārliecināts, ka vēlaties notīrīt paroli? - - Use regular expressions - - - - + Search Meklētājs - + Transfers (%1) Torrenti (%1) - + Error Kļūda - + Failed to add torrent: %1 Neizdevās pievienot torentu: %1 - + Torrent added Torrents pievienots - + '%1' was added. e.g: xxx.avi was added. '%1' tika pievienots. - + Download completion Pabeigti - + I/O Error i.e: Input/Output Error Ievades/izvades kļūda - + Recursive download confirmation Rekursīvās lejupielādes apstiprināšana - + Yes - + No - + Never Nekad - + Global Upload Speed Limit Globālais augšupielādes ātruma limits - + Global Download Speed Limit Globālais lejupielādes ātruma limits - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - - - - - Are you sure you want to quit qBittorrent? - - - - + &No &Nē - + &Yes &Jā - + &Always Yes &Vienmēr jā - - %1/s - s is a shorthand for seconds - - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter Novecojis Python interpretētājs - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. Jūsu Python versija (1%) ir novecojusi. Lai darbotos meklētājprogrammas, lūdzu veiciet jaunināšanu uz pašreizējo versiju. Minimālās prasības: 2.7.9 / 3.3.0. - + qBittorrent Update Available Pieejams qBittorrent atjauninājums - + + A new version is available. +Do you want to download %1? + Pieejama jauna versija. +Vai vēlaties lejupielādēt %1? + + + Already Using the Latest qBittorrent Version - Jūs jau lietojat jaunāko qBittorrent + Jūs jau lietojat jaunāko qBittorrent versiju - + Undetermined Python version Nenoteikta Python versija - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. '%1' ir pabeidzis lejupielādi. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2968,158 +2634,154 @@ Iemesls: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? Torrenta fails '%1' satur torrentu failus, vai vēlaties veikt to lejupielādi? - + Couldn't download file at URL '%1', reason: %2. Neizdevās ielādēt failu no '%1', iemesls: %2 - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin Python atrasts %1: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + Neizdevās noteikt jūsu Python versiju (%1). Meklētājs ir izslēgts. + + + + Missing Python Interpreter Nav atrasts Python interpretētājs - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Lai lietotu meklētāju, ir nepieciešams uzinstalēt Python. Vai vēlaties to instalēt tagad? - + Python is required to use the search engine but it does not seem to be installed. Lai lietotu meklētāju, ir nepieciešams uzinstalēt Python. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. Atjauninājumi nav pieejami. Jūs jau lietojat jaunāko versiju. - + &Check for Updates &Meklēt atjauninājumus - + Checking for Updates... Meklē atjauninājumus... - + Already checking for program updates in the background Atjauninājumu meklēšana jau ir procesā - + Python found in '%1' Python atrasts šeit %1 - + Download error Lejupielādes kļūda - + Python setup could not be downloaded, reason: %1. Please install it manually. Python instalāciju neizdevās lejupielādēt, iemesls: %1. Lūdzam to izdarīt manuāli. - - + + Invalid password Nederīga parole - - - + + RSS (%1) RSS (%1) - + URL download error Tīmekļa lejupielādes kļūda - + The password is invalid Parole nav derīga - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Lejup. ātrums: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Augšup. ātrums: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [L: %1, A: %2] qBittorrent %3 - + Hide Paslēpt - + Exiting qBittorrent Aizvērt qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Dažu failu ielāde vēl nav pabeigta. + Vai esat pārliecināts, ka vēlaties aizvērt qBittorrent? + + + Open Torrent Files Izvēlieties Torrentu failus - + Torrent Files Torrentu faili - + Options were saved successfully. Iestatījumi veiksmīgi saglabāti. @@ -3127,52 +2789,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. Jūsu dinamiskais DNS ir sekmīgi atjaunināts. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Dinamiskā DNS kļūme: Pakalpojums īslaicīgi nepieejams; tiks atkārtoti mēģināts pēc 30 minūtēm. - + Dynamic DNS error: hostname supplied does not exist under specified account. Dinamiskā DNS kļūme: Norādītais datora nosaukums nav piederīgs norādītajam lietotāja kontam. - + Dynamic DNS error: Invalid username/password. Dinamiskā DNS kļūme: Nederīgs lietotājvārds/parole. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Dinamiskā DNS kļūme: qBittorrent klients ir nobloķēts un iekļauts melnajā sarakstā. Lūdzu noziņojiet šo gadījumu http://bugs.qbittorrent.org - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Dinamiskā DNS kļūme: serviss atbildēja ar %1, lūdzu noziņojiet šo gadījumu http://bugs.qbittorrent.org - + Dynamic DNS error: Your username was blocked due to abuse. Dinamiskā DNS kļūme: Jūsu lietotāja konts ir bloķēts, noteikumu pārkāpumu pēc. - + Dynamic DNS error: supplied domain name is invalid. Dinamiskā DNS kļūme: norādītais domēna nosaukums ir nepareizs. - + Dynamic DNS error: supplied username is too short. Dinamiskā DNS kļūme: norādītais lietotājvārds ir par īsu. - + Dynamic DNS error: supplied password is too short. Dinamiskā DNS kļūme: norādītā parole ir par īsu. @@ -3180,1413 +2842,1303 @@ Net::DownloadHandler - + I/O Error Ievades/izvades kļūda - + The file size is %1. It exceeds the download limit of %2. Faila izmērs ir %1. Tas pārsniedz lejupielādes limitu %2. - + Unexpected redirect to magnet URI. Negaidīta pāradresācija uz magnētsaiti. - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. GeoIP datubāze ielādēta. Veids: %1. Jaunāka brūve: %2 - - + + Couldn't load GeoIP database. Reason: %1 Neizdevās ielādēt GeoIP datubāzi. Iemesls: %1 - + Venezuela, Bolivarian Republic of Venecuēla - + Viet Nam Vjetnama - - + + N/A Nav atrasta - + Andorra Andora - + United Arab Emirates Apvienotie Arābu Emirāti - + Afghanistan Afganistāna - + Antigua and Barbuda Antigva un Barbuda - + Anguilla Angilja - + Albania Albānija - + Armenia Armēnija - + Angola Angola - + Antarctica Antarktīda - + Argentina Agentīna - + American Samoa Amerikāņu Samoa - + Austria Austrija - + Australia Austrālija - + Aruba Aruba - + Azerbaijan Azerbaidžāna - + Bosnia and Herzegovina Bosnija un Hercegovina - + Barbados Barbadosa - + Bangladesh Bangladeša - + Belgium Beļģija - + Burkina Faso Burkinafaso - + Bulgaria Bulgārija - + Bahrain Bahreina - + Burundi Burundi - + Benin Benina - + Bermuda Bermuda - + Brunei Darussalam Bruneja Darusalama - + Brazil Brazīlija - + Bahamas Bahamas - + Bhutan Butāna - + Bouvet Island Buvē sala - + Botswana Botsvāna - + Belarus Baltkrievija - + Belize Beliza - + Canada Kanāda - + Cocos (Keeling) Islands Kokosu (Kīlinga) Salas - + Congo, The Democratic Republic of the Kongo Demokrātiskā Republika - + Central African Republic Centrālāfrikas Republika - + Congo Kongo Republika - + Switzerland Šveice - + Cook Islands Kuka salas - + Chile Čīle - + Cameroon Kamerūna - + China Ķīna - + Colombia Kolumbija - + Costa Rica Kostarika - + Cuba Kuba - + Cape Verde Kaboverde - + Curacao Kirasao - + Christmas Island Ziemsvētku sala - + Cyprus Kipra - + Czech Republic Čehija - + Germany Vācija - + Djibouti Džibutija - + Denmark Dānija - + Dominica Dominika - + Dominican Republic Dominikānas republika - + Algeria Alžīrija - + Ecuador Ekvadora - + Estonia Igaunija - + Egypt Ēģipte - + Western Sahara Rietumsahāra - + Eritrea Eritreja - + Spain Spānija - + Ethiopia Etiopija - + Finland Somija - + Fiji Fidži - + Falkland Islands (Malvinas) Folklenda (Malvinu) Salas - + Micronesia, Federated States of Mikronēzijas Federatīvās Valstis - + Faroe Islands Fēru salas - + France Francija - + Gabon Gabona - + United Kingdom Apvienotā Karaliste - + Grenada Grenāda - + Georgia Gruzija - + French Guiana Franču Gviāna - + Ghana Gana - + Gibraltar Gibraltārs - + Greenland Grenlande - + Gambia Gambija - + Guinea Gvineja - + Guadeloupe Gvadelupa - + Equatorial Guinea Ekvatoriālā Gvineja - + Greece Grieķija - + South Georgia and the South Sandwich Islands Dienviddžordžija un Dienvidsendviču salas - + Guatemala Gvatemala - + Guam Guama - + Guinea-Bissau Gvineja-Bisava - + Guyana Gajāna - + Hong Kong Honkonga - + Heard Island and McDonald Islands Hērda Sala un Makdonalda Salas - + Honduras Hondurasa - + Croatia Horvātija - + Haiti Haiti - + Hungary Ungārija - + Indonesia Indonēzija - + Ireland Īrija - + Israel Izraēla - + India Indija - + British Indian Ocean Territory Britu Indijas okeāna teritorija - + Iraq Irāka - + Iran, Islamic Republic of Irāna - + Iceland Īslande - + Italy Itālija - + Jamaica Jamaika - + Jordan Jordānija - + Japan Japāna - + Kenya Kenija - + Kyrgyzstan Kirgizstāna - + Cambodia Kambodža - + Kiribati Kiribati - + Comoros Komoras - + Saint Kitts and Nevis Sentkitsa un Nevisa - + Korea, Democratic People's Republic of Ziemeļkoreja - + Korea, Republic of Dienvidkoreja - + Kuwait Kuveita - + Cayman Islands Kaimanu salas - + Kazakhstan Kazahstāna - + Lao People's Democratic Republic Laosas Tautas Demokrātiskā Republika - + Lebanon Libāna - + Saint Lucia Sentlūsija - + Liechtenstein Lihtenšteina - + Sri Lanka Šrilanka - + Liberia Libērija - + Lesotho Lesoto - + Lithuania Lietuva - + Luxembourg Luksemburga - + Latvia Latvija - + Morocco Maroka - + Monaco Monako - + Moldova, Republic of Moldova - + Madagascar Madagaskara - + Marshall Islands Māršala salas - + Mali Mali - + Myanmar Mjanma - + Mongolia Mongolija - + Northern Mariana Islands Ziemeļu Marianas salas - + Martinique Martinika - + Mauritania Mauritānija - + Montserrat Montserrata - + Malta Malta - + Mauritius Maurīcija - + Maldives Maldīvija - + Malawi Malāvija - + Mexico Meksika - + Malaysia Malaizija - + Mozambique Mozambika - + Namibia Namībija - + New Caledonia Jaunkaledonija - + Niger Nigēra - + Norfolk Island Norfolkas Sala - + Nigeria Nigērija - + Nicaragua Nikaragva - + Netherlands Nīderlande - + Norway Norvēģija - + Nepal Nepāla - + Nauru Nauru - + Niue Niue - + New Zealand Jaunzēlande - + Oman Omāna - + Panama Panama - + Peru Peru - + French Polynesia Franču Polinēzija - + Papua New Guinea Papua Jaungvineja - + Philippines Filipīnas - + Pakistan Pakistāna - + Poland Polija - + Saint Pierre and Miquelon Senpjēra un Mikelona - + Puerto Rico Puertoriko - + Portugal Portugāle - + Palau Palau - + Paraguay Paragvaja - + Qatar Katara - + Reunion Reinjona - + Romania Rumānija - + Russian Federation Krievija - + Rwanda Ruanda - + Saudi Arabia Saūda Arābija - + Solomon Islands Zālamana salas - + Seychelles Seišelu salas - + Sudan Sudāna - + Sweden Zviedrija - + Singapore Singapūra - + Slovenia Slovēnija - + Svalbard and Jan Mayen Svalbāra un Jana Majena sala - + Slovakia Slovākija - + Sierra Leone Sjerraleone - + San Marino Sanmarīno - + Senegal Senegāla - + Somalia Somālija - + Suriname Surinama - + Sao Tome and Principe Santome un Prinsipi - + El Salvador Salvadora - + Syrian Arab Republic Sīrija - + Swaziland Svazilenda - + Turks and Caicos Islands Tērksas un Kaikosas salas - + Chad Čada - + French Southern Territories Franču Dienvidu Teritorijas - + Togo Togo - + Thailand Taizeme - + Tajikistan Tadžikistāna - + Tokelau Tokelau - + Turkmenistan Turkmenistāna - + Tunisia Tunisija - + Tonga Tonga - - Could not decompress GeoIP database file. - - - - + Timor-Leste Austrumtimora - + Bolivia, Plurinational State of Bolīvija - + Bonaire, Sint Eustatius and Saba Bonaire, Sintēstatiusa un Saba - + Cote d'Ivoire Kotdivuāra - + Libya Lībija - + Saint Martin (French part) Sentmārtina (Francijas daļa) - + Macedonia, The Former Yugoslav Republic of Maķedonija - + Macao Makao - + Pitcairn Pitkērna - + Palestine, State of Palestīna - + Saint Helena, Ascension and Tristan da Cunha Svētās Helēnas sala, Debesbraukšanas salas un Tristana da Kuņas salas - + South Sudan Dienvidsudāna - + Sint Maarten (Dutch part) Sintmārtena (Nīderlandes daļa) - + Turkey Turcija - + Trinidad and Tobago Trinidada un Tobāgo - + Tuvalu Tuvalu - + Taiwan Taivāna - + Tanzania, United Republic of Tanzānija - + Ukraine Ukraina - + Uganda Uganda - + United States Minor Outlying Islands ASV Mazās Aizjūras salas - + United States Amerikas Savienotās Valstis - + Uruguay Urugvaja - + Uzbekistan Uzbekistāna - + Holy See (Vatican City State) Vatikāns (Svētais krēsls) - + Saint Vincent and the Grenadines Sentvinsenta un Grenadīnas - + Virgin Islands, British Britu Virdžīnu salas - + Virgin Islands, U.S. ASV Virdžīnu salas - + Vanuatu Vanuatu - + Wallis and Futuna Volisa un Futuna - + Samoa Samoa Neatkarīgā Valsts - + Yemen Jemena - + Mayotte Majota - + Serbia Serbija - + South Africa Dienvidāfrika - + Zambia Zambija - + Montenegro Melnkalne - + Zimbabwe Zimbabve - + Aland Islands Ālandu salas - + Guernsey Gērnsija - + Isle of Man Menas sala - + Jersey Džērsija - + Saint Barthelemy Senbartelmī - + + Could not uncompress GeoIP database file. + Neizdevās atvērt GeoIP datubāzes failu. + + + Couldn't save downloaded GeoIP database file. Neizdevās saglabāt lejupielādēto GeoIP datubāzes failu. - + Successfully updated GeoIP database. GeoIP datubāze veiksmīgi atjaunota. - + Couldn't download GeoIP database file. Reason: %1 Neizdevās lejupielādēt GeoIP datubāzes failu. Iemesls: %1 @@ -4594,12 +4146,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] UPnP / NAT-PMP atbalsts [IESLĒGTS] - + UPnP / NAT-PMP support [OFF] UPnP / NAT-PMP atbalsts [IZSLĒGTS] @@ -4607,7 +4159,7 @@ Net::Smtp - + Email Notification Error: E-pasta paziņojuma kļūda: @@ -4615,1273 +4167,1077 @@ OptionsDialog - + Options Iestatījumi - + Behavior Uzvedība - + Downloads Lejupielādes - + Connection Savienojums - + Speed Ātrums - + BitTorrent BitTorrent - - RSS - - - - + Web UI Tālvadība - + Advanced Papildus - + Language Valoda - + User Interface Language: Interfeisa valoda: - + (Requires restart) (Nepieciešams restarts) - + Transfer List Torrentu saraksts - + Confirm when deleting torrents Apstiprināt Torrentu dzēšanu - + Use alternating row colors In transfer list, one every two rows will have grey background. Iekrāsot katru otro rindiņu - + Hide zero and infinity values Nerādīt nulles un bezgalības vērtības - + Always Vienmēr - + Paused torrents only Tikai nopauzētiem torrentiem - + Action on double-click Dubultklikšķa darbība - + Downloading torrents: Lejupielādējot torrentus: - - + + Start / Stop Torrent Sākt / Apturēt torentu - - + + Open destination folder Atvērt failu atrašanās vietu - - + + No action Nedarīt neko - + Completed torrents: Pabeigtajiem torentiem: - + Desktop Darbvirsma - + Start qBittorrent on Windows start up Ieslēgt qBittorrent reizē ar Windows - + Show splash screen on start up Pirms palaišanas parādīt qBittorrent logo - + Start qBittorrent minimized Ieslēgt qBittorrent jau minimizētu - + Confirmation on exit when torrents are active Apstiprināt programmas aizvēršanu, ja kāda faila ielāde vēl nav pabeigta - + Confirmation on auto-exit when downloads finish Apstiprināt programmas automātisko aizvēršanu pēc lejupielāžu pabeigšanas - - KiB - KiB - - - - Email notification &upon download completion - E-pasta paziņojums par lejupielādes pabeigšanu - - - - Run e&xternal program on torrent completion - Programmas palaišana pēc lejupielādes pabeigšanas - - - - IP Fi&ltering - IP filtrēšana - - - - Schedule &the use of alternative rate limits - Uzstādīt grafiku Alternatīvajiem ielādes ātruma ierobežojumiem - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Vairāk informācijas</a>) - - - - &Torrent Queueing - - - - - Seed torrents until their seeding time reaches - - - - - A&utomatically add these trackers to new downloads: - - - - - RSS Reader - - - - - Enable fetching RSS feeds - - - - - Feeds refresh interval: - - - - - Maximum number of articles per feed: - - - - - - min - minutes - - - - - RSS Torrent Auto Downloader - - - - - Enable auto downloading of RSS torrents - - - - - Edit auto downloading rules... - - - - - Web User Interface (Remote control) - - - - - IP address: - - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - - - - - Server domains: - - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - - - - - &Use HTTPS instead of HTTP - - - - - Bypass authentication for clients on localhost - - - - - Bypass authentication for clients in whitelisted IP subnets - - - - - IP subnet whitelist... - - - - - Upda&te my dynamic domain name - + + Show qBittorrent in notification area + Rādīt qBittorrent ikonu paziņojumu joslā - + Minimize qBittorrent to notification area Ar samazināšanas pogu, novietot qBittorrent paziņojumu joslā - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. Ar aizvēršanas pogu, novietot qBittorrent paziņojumu joslā - + Tray icon style: Paziņojumu joslas ikonas stils: - + Normal Normāls - + Monochrome (Dark theme) Vienkrāsains (Gaišais tonis) - + Monochrome (Light theme) Vienkrāsains (Tumšais tonis) - + File association Failu asociācija - + Use qBittorrent for .torrent files Lietot qBittorrent .torrent failiem - + Use qBittorrent for magnet links Lietot qBittorrent Magnētsaitēm - + Power Management Barošanas pārvaldība - + + Inhibit system sleep when torrents are active + Atturēt Datorsistēmu no iemigšanas režīma, ja kādu failu ielāde vēl nav pabeigta + + + + Log file + Reģistra fails + + + Save path: Saglabāšanas vieta: - + Backup the log file after: Izveidot reģistra kopiju ik pēc: - + + MB + MB + + + Delete backup logs older than: Dzēst reģistra kopijas vecākas par: - + days Delete backup logs older than 10 months dienām - + months Delete backup logs older than 10 months mēnešiem - + years Delete backup logs older than 10 years gadiem - + When adding a torrent Pievienojot torrentu - + + Display torrent content and some options + Parādīt torenta saturu un dažas opcijas + + + Bring torrent dialog to the front Novietot torenta dialogu priekšplānā - + Do not start the download automatically The torrent will be added to download list in pause state Lejupielāde netiek sākta automātiski. - + Should the .torrent file be deleted after adding it .torrent fails tiks izdzēsts uzreiz pēc tā pievienošanas - + + Delete .torrent files afterwards + Izdzēst .torrent failu pēc tā pievienošanas + + + Also delete .torrent files whose addition was cancelled .torrent faili tiks izdzēsti arī pie pievienošanas atcelšanas. - + Also when addition is cancelled Arī atceļot pievienošanu - + Warning! Data loss possible! Brīdinājums! Iespējams datu zudums! - + Saving Management Saglabāšanas iestatījumi - + Default Torrent Management Mode: Noklusējuma torrentu pārvaldības režīms: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category Automātiskais režīms nozīmē, ka torrenta īpašības (piem. saglabāšanas vieta), tiks piešķirta atbilstoši izvēlētajai kategorijai. - + Manual Manuāli - + Automatic Automātiski - + When Torrent Category changed: Mainot torrenta kategoriju: - + Relocate torrent Pārvietot torrentu - + Switch torrent to Manual Mode Pārslēgt torrentu Manuālajā režīmā - + When Default Save Path changed: Mainot noklusējuma saglabāšanas vietu: - - + + Relocate affected torrents Pārvietot ietekmētos torrentus - - + + Switch affected torrents to Manual Mode Pārslēgt ietekmētos torrentus Manuālajā režīmā - + When Category changed: Mainot kategoriju: - + Use Subcategories Lietot apakškategorijas - + Default Save Path: Noklusētā saglabāšanas vieta: - + Keep incomplete torrents in: Glabāt nepabeigtos failus šeit: - + Copy .torrent files to: Izveidot .torrent failu kopijas šeit: - - Show &qBittorrent in notification area - Rādīt &qBittorrent paziņojumu joslā - - - - &Log file - &Reģistra fails - - - - Display &torrent content and some options - Parādīt torrenta saturu un iestatījumus - - - - Create subfolder for torrents with multiple files - Izveidot apakšmapi torrentiem, kas satur vairākus failus - - - - De&lete .torrent files afterwards - Izdzēst .torrent failu pēc tā pievienošanas - - - + Copy .torrent files for finished downloads to: Izveidot .torrent failu kopijas pabeigtajiem torrentiem šeit: - + Pre-allocate disk space for all files Jau iepriekš aizņemt brīvo vietu uz diska jaunajiem failiem - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding - - - - + Append .!qB extension to incomplete files Pievienot .!qB galotni nepabeigtajiem failiem - - Enable recursive download dialog - - - - + Automatically add torrents from: Automātiski pievienot torrentus no: - + Add entry Pievienot mapi - + Remove entry Noņemt mapi - + + Email notification upon download completion + E-pasta paziņojums par lejupielādes pabeigšanu + + + + Destination email: + Saņēmēja e-pasts: + + + SMTP server: SMTP serveris: - + This server requires a secure connection (SSL) Šim serverim ir nepieciešams šifrēts savienojums (SSL) - - + + + Authentication Pierakstīšanās - - - - + + + + Username: Lietotājvārds: - - - - + + + + Password: Parole: - - Enabled protocol: - Protokola izvēle: - - - - TCP and μTP - + + Run external program on torrent completion + Pēc torrenta lejupielādes pabeigšanas, palaist šo programmu - + Listening Port Portu iestatījumi - + Port used for incoming connections: Ports, kuru izmanto ienākošajiem savienojumiem: - + Random Nejaušs - + Use UPnP / NAT-PMP port forwarding from my router Lietot mana rūtera UPnP / NAT-PMP portu pāradresāciju - + Use different port on each startup Automātiski izvēlēties un nomainīt portu pie qBittorrent ieslēgšanas - + Connections Limits Savienojumu ierobežojumi - + Maximum number of connections per torrent: Maksimālais savienojumu skaits katram torrentam: - + Global maximum number of connections: Kopējais maksimālais savienojumu skaits: - + Maximum number of upload slots per torrent: Maksimālais augšupielādes slotu skaits katram torrentam: - + Global maximum number of upload slots: Kopējais maksimālais augšupielādes slotu skaits: - + Proxy Server Starpniekserveris - + Type: Lietot: - + (None) (Nevienu) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Adrese: - - + + Port: Ports: - + Otherwise, the proxy server is only used for tracker connections Pretējā gadījumā, starpniekserveris tiks izmantots tikai savienojumiem ar trakeriem - + Use proxy for peer connections Izmantot starpniekserveri koplietotāju savienojumiem - + Disable connections not supported by proxies Neatļaut savienojumus, kurus neatbalsta starpniekserveri - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Vairāk informācijas</a>) - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection RSS kanāli, meklētājs, programmatūras atjauninājumi un viss cits, izņemot Torrentu ielādi un visu, kas ar to saistīts (piemēram Trakeru apmaiņa koplietotāju starpā), izmantos tiešu savienojumu. - + Use proxy only for torrents Lietot starpniekserveri tikai torrentiem - - A&uthentication - Pierakstīšanas - - - + Info: The password is saved unencrypted Brīdinājums: Šī parole netiek glabāta šifrētā veidā - + + IP Filtering + IP filtrēšana + + + Filter path (.dat, .p2p, .p2b): Filtra atrašanās vieta (.dat, .p2p, .p2b): - + Reload the filter Pārlādēt filtru - - Manually banned IP addresses... - Manuāli bloķētās IP adreses... - - - + Apply to trackers Pielietot trakeriem - + Global Rate Limits - Globālie ielādes ātruma ierobežojumi - - - - - - - - - KiB/s - + Globālā ielādes ātruma ierobežojumi - - + + Upload: Augšuplāde: - - + + + + + KiB/s + KiB/s + + + + Download: Lejuplāde: - + Alternative Rate Limits Alternatīvie ātruma ierobežojumi - - + + Schedule the use of alternative rate limits + Uzstādīt grafiku Alternatīvajiem ielādes ātruma ierobežojumiem + + + From: from (time1 to time2) No: - - + To: time1 to time2 - Līdz: + Uz: - + When: Kad: - + Every day Katru dienu. - + Weekdays Darbdienās - + Weekends Nedēļas nogalēs - + Rate Limits Settings Ielādes ātrumu ierobežojumu iestatījumi - + Apply rate limit to peers on LAN Pielietot ierobežojumus koplietotājiem LAN tīklā - + Apply rate limit to transport overhead Pielietot ātruma ierobežojums tikai transporta izmaksām - - + + + Enable µTP protocol + Lietot µTP protokolu + + + Apply rate limit to µTP protocol Pielietot ierobežojumus µTP protokolam - + Privacy Privātums - + Enable DHT (decentralized network) to find more peers Ieslēgt DHT (necentralizēto tīklu), lai atrastu vēl vairāk koplietotājus - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Apmainīties ar koplietotājiem ar saderīgiem Bittorrent klientiem (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers Ieslēgt datu apmaiņu koplietotāju starpā (PeX), lai atrastu vairāk koplietotājus - + Look for peers on your local network Meklēt koplietotājus privātajā tīklā - + Enable Local Peer Discovery to find more peers Ieslēgt Vietējo koplietotāju meklēšanu, lai atrastu vēl vairāk koplietotājus - + Encryption mode: Šifrēšanas režīms: - + Prefer encryption Šifrēšana vēlama - + Require encryption Pieprasīt šifrēšanu - + Disable encryption Atslēgt šifrēšanu - + Enable when using a proxy or a VPN connection Ieslēgt, ja tiek izmantots starpniekserveris vai VPN - + Enable anonymous mode Iespējot anonīmo režīmu - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Vairāk informācijas</a>) + + + + Torrent Queueing + Torrentu saraksts + + + Maximum active downloads: Maksimālais aktīvo lejupielāžu skaits: - + Maximum active uploads: Maksimālais aktīvo augšupielāžu skaits: - + Maximum active torrents: Maksimālais kopējais aktīvo torrentu skaits: - + Do not count slow torrents in these limits Neiekļaut šajās robežās lēnos torrentus. - - Upload rate threshold: - - - - - Download rate threshold: - - - - - sec - seconds - - - - - Torrent inactivity timer: - - - - + Share Ratio Limiting - Koplietošanas reitinga limits: + Augšupielādes/Lejupielādes attiecības limits - + Seed torrents until their ratio reaches Dalīt torrentus līdz to Augšupielādes/Lejupielādes attiecība sasniedz limitu - + then tad - + Pause them Tos nopauzēt - + Remove them Tos izdzēst - - RSS Smart Episode Filters - + + Automatically add these trackers to new downloads: + Automātiski jaunām lejupielādēm pievienot šos trakerus: + + + + Enable Web User Interface (Remote control) + Aktivizēt web lietotāja interfeisu (Tālvadības kontroli) - + Use UPnP / NAT-PMP to forward the port from my router Lietot UPnP / NAT-PMP lai pāradresētu portu manā maršrutētājā - + + Use HTTPS instead of HTTP + HTTP vietā izmantot HTTPS + + + Certificate: Sertifikāts - + Import SSL Certificate Ievietot SSL sertifikātu - + Key: Atslēga: - + Import SSL Key Ievietot SSL atslēgu - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Informācija par sertifikātiem</a> - - Use alternative Web UI - - - - - Files location: - - - - - Enable clickjacking protection - + + Bypass authentication for localhost + Apiet autentifikāciju vietējā sistēmā - - Enable Cross-Site Request Forgery (CSRF) protection - + + Update my dynamic domain name + Atjaunināt manu dinamiskā domēna nosaukumu - + Service: Serviss: - + Register Reģistrēties - + Domain name: Domēna vārds: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! Iespējojot šo opciju, varat <strong>neatgriezeniski zaudēt</strong> .torrent failus! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well Ja šīs opcijas ir iespējotas, qBittorent <strong>dzēsīs</strong> .torrent failus pēc tam, kad tie tiks veiksmīgi (pirmais variants) vai ne (otrais variants) pievienoti lejupielādes sarakstam. Tas tiks piemērots <strong>ne tikai</strong> failiem, kas atvērti, izmantojot &ldquo;Add torrent&rdquo; izvēlnes darbību, bet arī to atverot izmantojot <strong>failu tipu piesaistes</strong> - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): Nodrošinātie parametri (reģistrjūtīgi): - + %N: Torrent name %N: Torrent faila nosaukums - + %L: Category %L: Kategorija - - %G: Tags (seperated by comma) - %G: Birkas (atdalītas ar komatu) - - - + %F: Content path (same as root path for multifile torrent) %F: Satura ceļš (tāpat kā saknes ceļš daudz-failu torrentam) - + %R: Root path (first torrent subdirectory path) %R: Saknes ceļš (pirmā torrent apakšdirektorija ceļš) - + %D: Save path %D: Saglabāšanas vieta - + %C: Number of files %C: Failu skaits - + %Z: Torrent size (bytes) %Z: Torrenta izmērs (baitos) - + %T: Current tracker %T: Pašreizējais trakeris - + %I: Info hash %I: Jaucējkods - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") Padoms: Lai izvairītos no teksta sadalīšanās, ja lietojat atstarpes, ievietojiet parametru pēdiņās (piemēram, "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor Izvēlēties mapi, kuru uzraudzīt - + Folder is already being monitored: Šī mape jau tiek uzraudzīta. - + Folder does not exist: Mape nepastāv. - + Folder is not readable: Mape nav nolasāma. - + Adding entry failed Ieraksta pievienošana neizdevās - - - - + + Choose export directory Izvēlieties eksportēšanas direktoriju - - - + + + + + + Choose a save directory Izvēlieties saglabāšanas direktoriju - + Choose an IP filter file Izvēlieties IP filtra failu - + All supported filters Visi atbalstītie filtri - + SSL Certificate SSL Sertifikāts - + + SSL Key + SSL atslēga + + + Parsing error Parsēšanas kļūda - + Failed to parse the provided IP filter Neizdevās parsēt norādīto IP filtru - + Successfully refreshed Veiksmīgi atsvaidzināts - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number IP filtra parsēšana veiksmīga: piemēroti %1 nosacījumi. - + Invalid key Nepareiza atslēga - + This is not a valid SSL key. Šī nav pareizā SSL atslēga. - + Invalid certificate Nepareizs sertifikāts - - Preferences - - - - - Import SSL certificate - - - - + This is not a valid SSL certificate. Šis nav derīgs SSL sertifikāts - - Import SSL key - - - - - SSL key - - - - + Time Error Laika kļūda - + The start time and the end time can't be the same. Sākuma un beigu laiks nevar būt vienāds - - + + Length Error Garuma kļūda - + The Web UI username must be at least 3 characters long. Web interfeisa lietotājvārdam jāsatur vismaz 3 rakstzīmes. - + The Web UI password must be at least 6 characters long. Web interfeisa parolei jāsatur vismaz 6 rakstzīmes. @@ -5889,72 +5245,72 @@ PeerInfo - - Interested(local) and Choked(peer) + + interested(local) and choked(peer) - + interested(local) and unchoked(peer) - + interested(peer) and choked(local) - + interested(peer) and unchoked(local) - + optimistic unchoke - + peer snubbed Koplietotājs noraidīts - + incoming connection ienākošs savienojums - + not interested(local) and unchoked(peer) - + not interested(peer) and unchoked(local) - + peer from PEX koplietotājs no PEX - + peer from DHT koplietotājs no DHT - + encrypted traffic Šifrēta datplūsma - + encrypted handshake šifrēts rokasspiediens - + peer from LSD koplietotājs no LSD @@ -5962,193 +5318,178 @@ PeerListWidget - + IP IP - + Port Ports - + Flags Karogi - + Connection Savienojums - + Client i.e.: Client application Klients - + Progress i.e: % downloaded Progress - + Down Speed i.e: Download speed Lejupielādes ātrums - + Up Speed i.e: Upload speed Augšupielādes ātrums - + Downloaded i.e: total data downloaded Lejupielādēti - + Uploaded i.e: total data uploaded Augšupielādēti - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Koplietotāja progress - + Files i.e. files that are being downloaded right now Faili - + Column visibility Kolonnas redzamība - + Add a new peer... Pievienot jaunu koplietotāju... - - + + Ban peer permanently Nobloķēt koplietotāju - + Manually adding peer '%1'... Manuāli pievieno koplietotāju '%1'... - + The peer '%1' could not be added to this torrent. Koplietotāju '%1' neizdevās pievienot šim torrentam. - + Manually banning peer '%1'... Manuāli nobloķēts '%1'... - - + + Peer addition Koplietotāja pievienošana - + Country Valsts - + Copy IP:port Kopēt IP portu - + Some peers could not be added. Check the Log for details. Dažus koplietotājus neizdevās pievienot. Iemeslu skatīt Reģistrā. - + The peers were added to this torrent. Koplietotāji tika veiksmīgi pievienoti torrentam. - + Are you sure you want to ban permanently the selected peers? Vai esat pārliecināts, ka vēlāties nobloķēt atlasītos koplietotājus? - + &Yes &Jā - + &No &Nē - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - + PeersAdditionDlg - + No peer entered - + Koplietotājs netika norādīts - + Please type at least one peer. - + Lūdzu norādiet vismaz vienu koplietotāju - + Invalid peer - + Nederīgs koplietotājs - + The peer '%1' is invalid. - + Koplietotājs '%1' nav derīgs. PieceAvailabilityBar - + White: Unavailable pieces Baltās: Nepiejamās daļiņas - + Blue: Available pieces Zilās: Pieejamās daļiņas @@ -6156,336 +5497,293 @@ PiecesBar - + Files in this piece: Faili šajā daļā: - + File in this piece Fails šajā daļā - + File in these pieces Fails šajās daļās - - Wait until metadata become available to see detailed information - - - - + Hold Shift key for detailed information Detalizētai informācijai turiet nospiestu Shift taustiņu - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Meklētāju spraudņi - + Installed search plugins: - + Ieinstalētie meklētāju spraudņi: - + Name - Nosaukums + Nosaukums - + Version - + Versija - + Url - + Adrese - - + + Enabled - - - - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - + Ieslēgts - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Jūs varat atrast jaunus meklētāju spraudņus šeit: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Instalēt jaunu spraudni - + Check for updates - + Meklēt atjauninājumus - + Close - + Aizvērt - + Uninstall - + Atinstalēt - - - + + + Yes - + - - - - + + + + No - + - + Uninstall warning - + Atinstalēšanas brīdinājums - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Dažus spraudņus nav iespējams atinstalēt, jo tie ir iekļauti qBittorrent. Jūs varat atinstalēt tikai tos spraudņus, kurus pats ieinstalējāt. +Esošie spraudņi tika atslēgti. - + Uninstall success - + Atinstalācija veiksmīga - + All selected plugins were uninstalled successfully - - - - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - + Visi meklētāju spraudņi tika veiksmīgi atinstalēti - - + + New search engine plugin URL - + Meklētāja spraudņa adrese - - + + URL: - + Adrese: - + Invalid link - + Nederīga saite - + The link doesn't seem to point to a search engine plugin. - + Zem šīs saites netika atrasts neviens meklētāja spraudnis. - + Select search plugins - + Izvēlēties meklētāju spraudņus - + qBittorrent search plugin - + qBittorrent meklētāju spraudņi + + + + + + Search plugin update + Meklēt spraudņa atjauninājumus - + All your plugins are already up to date. - + Visi jūsu spraudņi jau ir atjaunināti. - + Sorry, couldn't check for plugin updates. %1 - + Atvainojiet, neizdevās sameklēt spraudņu atjauninājumus. %1 - + + + Search plugin install - + Meklētāju spraudņu instalācija + + + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + "%1" meklētāja spraudnis tika veiksmīgi ieinstalēts. - + Couldn't install "%1" search engine plugin. %2 - + Neizdevās ieinstalēt "%1" meklētāja spraudni. %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + "%1" meklētāja spraudnis tika veiksmīgi atjaunināts. + + + Couldn't update "%1" search engine plugin. %2 - + Neizdevās atjaunināt "%1" meklētāja spraudni. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Spraudņa avots - + Search plugin source: - + Meklētāja spraudņa avots: - + Local file - + Datorā - + Web link - - - - - PowerManagement - - - qBittorrent is active - + Internetā - PreviewSelectDialog + PreviewSelect - - Preview - - - - + Name - Nosaukums + Nosaukums - + Size - Izmērs + Izmērs - + Progress - Progress + Progress - - + + Preview impossible - + Priekšskatīt neiespējamo - - + + Sorry, we can't preview this file - - - - - Private::FileLineEdit - - - '%1' does not exist - - - - - '%1' does not point to a directory - - - - - '%1' does not point to a file - - - - - Does not have read permission in '%1' - - - - - Does not have write permission in '%1' - + Atvainojiet, šo failu nevar priekšskatīt PropListDelegate - + Not downloaded Nav lejupielādēts - - + + Normal Normal (priority) Normāla - - N/A - Nav atrasta - - - + Do not download Do not download (priority) Nelejupielādēt - - + + High High (priority) Augsta - + N/A + Nav piešķirts + + + Mixed Mixed (priorities Jaukta - - + + Maximum Maximum (priority) Maksimālā @@ -6494,32 +5792,32 @@ PropTabBar - + General Vispārīgi - + Trackers Trakeri - + Peers Koplietotāji - + HTTP Sources HTTP avoti - + Content Saturs - + Speed Ātrumi @@ -6555,7 +5853,7 @@ ETA: - Aptuvenais ielādes laiks: + ETA: @@ -6613,22 +5911,22 @@ Komentārs: - + Select All Izvēlēties visus - + Select None Neizvēlēties nevienu - + Normal Normāla - + High Augsta @@ -6688,165 +5986,165 @@ Saglabāšanas vieta: - + Maximum Maksimālā + - Do not download Nelejupielādēt - + Never Nekad - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (ielādētas %3) - - + + %1 (%2 this session) %1 (%2 šajā sesijā) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (augšupielādē jau %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 maks.) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 kopā) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 vidējais) - + Open Atvērt - + Open Containing Folder Atvērt failu atrašanās vietu - + Rename... Pārdēvēt... - + Priority Prioritāte - + New Web seed Pievienot tīmekļa devēju - + Remove Web seed Noņemt tīmekļa devēju - + Copy Web seed URL Kopēt tīmekļa devēja adresi - + Edit Web seed URL Izlabot tīmekļa devēja adresi - + + Rename the file + Pārdēvēt failu + + + New name: Jaunais nosaukums: - - + + + The file could not be renamed + Failu neizdevās pārdēvēt + + + + This file name contains forbidden characters, please choose a different one. + Šis faila nosaukums satur aizliegtus simbolus, lūdzu izvēlieties citu nosaukumu. + + + + This name is already in use in this folder. Please use a different name. Šajā mapē jau ir fails ar šādu nosaukumu. Lūdzu izvēlieties citu nosaukumu. - + The folder could not be renamed Mapi neizdevās pārdēvēt - + qBittorrent qBittorrent - + Filter files... Meklēt failos... - - Renaming - Pārdēvēšana - - - - - Rename error - Kļūda pārdēvēšana - - - - The name is empty or contains forbidden characters, please choose a different one. - Nosaukums satur neatļautus simbolus, lūdzu izvēlieties citu nosaukumu. - - - + New URL seed New HTTP source Pievienot tīmekļa devēju - + New URL seed: Pievienot tīmekļa devēju - - + + This URL seed is already in the list. Šis tīmekļa devējs jau ir sarakstā. - + Web seed editing Tīmekļa devēja labošana - + Web seed URL: Tīmekļa devēja adrese: @@ -6854,585 +6152,551 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + Jūsu IP adrese ir tikusi nobloķēta, dēļ vairākiem neveiksmīgiem pierakstīšanās mēģinājumiem. + + + + Error: '%1' is not a valid torrent file. + + Kļūda. '%1' nav derīgs torrenta fails. + + + + + Error: Could not add torrent to session. + Kļūda: Torrentu neizdevās pievienot šajā sesijā. + + + + I/O Error: Could not create temporary file. + Ievades/Izvades kļūda: Neizdevās izveidot pagaidu failu. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 ir nezināms komandlīnijas parametrs. - - + + %1 must be the single command line parameter. %1 ir jābūt vienrindiņas komandlīnijas paramateram. - + + %1 must specify the correct port (1 to 65535). + %1 norādiet pareizo portu (starp 1 un 65535). + + + You cannot use %1: qBittorrent is already running for this user. Tu nevari atvērt %1: qBittorrent šim lietotājam jau ir atvērts. - + Usage: Lietojums: - + Options: Iespējas: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - + + Displays program version + Parāda programmas versiju - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - + + Displays this help message + Parāda palīdzības ziņojumu - - Expected integer number in environment variable '%1', but got '%2' - + + Changes the Web UI port (current: %1) + Nomainīt Tālvadības kontroles paneļa portu (patreizējais: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - + + Disable splash screen + Atslēgt uzlēcošo logu - - Expected %1 in environment variable '%2', but got '%3' - + + Run in daemon-mode (background) + Darbināt fonā (daemon-mode) - - port + + Downloads the torrents passed by the user - - %1 must specify a valid port (1 to 65535). - - + + Help + Palīdzība + - - Display program version and exit - + + Run application with -h option to read about command line parameters. + Palaist programmu ar -h parametru, lai iegūtu informāciju par komandlīnijas parametriem - - Display this help message and exit - + + Bad command line + Slikta komandlīnija - - Change the Web UI port - + + Bad command line: + Slikta komandlīnija: - - Disable splash screen - Atslēgt uzlēcošo logu + + Legal Notice + Juridiskais ziņojums - - Run in daemon-mode (background) - Darbināt fonā (daemon-mode) + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + qBittorrent ir failu koplietošanas programma. Katrs jūsu aktīvais koplietotais torrents ar augšupielādes palīdzību būs pieejams citiem lietotājiem. Katrs fails, kuru augšupielādējat ir uz jūsu pašu atbildību. + +Tālāki atgādinājumi netiks izsniegti. - - dir - Use appropriate short form or abbreviation of "directory" - + + Press %1 key to accept and continue... + Nospiediet taustiņu %1 lai turpinātu... - - Store configuration files in <dir> - + + Legal notice + Juridiskais ziņojums - - - name - + + Cancel + Atcelt - - Store configuration files in directories qBittorrent_<name> - + + I Agree + Es piekrītu - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - + + Torrent name: %1 + Torrenta nosaukums: %1 - - files or URLs - + + Torrent size: %1 + Torrenta izmērs: %1 - - Download the torrents passed by the user - + + Save path: %1 + Saglabāšanas vieta: %1 - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Torrents tika lejupielādēts %1. - - Options when adding new torrents: - + + Thank you for using qBittorrent. + Paldies, ka izmantojāt qBittorrent. - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - + + [qBittorrent] '%1' has finished downloading + [qBittorrent] '%1' ir pabeidzis lejupielādi - - path - + + The remote host name was not found (invalid hostname) + Datora nosaukums (hostname) netika atrasts - - Torrent save path - + + The operation was canceled + Darbība tika atcelta - - Add torrents as started or paused - + + The remote server closed the connection prematurely, before the entire reply was received and processed + Serveris pārtrauca savienojumu priekšlaicīgi, pirms tika pagūts saņemt pilnu atbildes ziņojumu no tā. - - Skip hash check - Izlaist jaucējkoda pārbaudi + + The connection to the remote server timed out + Neizdevās izveidot savienojumu ar serveri - - Assign torrents to category. If the category doesn't exist, it will be created. - + + SSL/TLS handshake failed + SSL/TLS rokasspiediens neizdevās - - Download files in sequential order - + + The remote server refused the connection + Serveris atteicās izveidot savienojumu - - Download first and last pieces first - Vispirms ielādēt pirmās un pēdējās daļiņas + + The connection to the proxy server was refused + Savienojums ar starpniekserveri tika atteikts - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - + + The proxy server closed the connection prematurely + Starpniekserveris pārtrauca savienojumu priekšlaicīgi - - Command line parameters take precedence over environment variables - + + The proxy host name was not found + Starpniekservera nosaukums netika atrasts - - Help - Palīdzība + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Neizdevās izveidot savienojumu ar starpniekserveri - - Run application with -h option to read about command line parameters. - Palaist programmu ar -h parametru, lai iegūtu informāciju par komandlīnijas parametriem + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Starpniekserveris pieprasa veikt datu autentifikāciju, lai noslēgtu savienojumu, bet piedāvietie autentifikācijas dati netika pieņemti - - Bad command line - Slikta komandlīnija + + The access to the remote content was denied (401) + Piekļuve materiālam uz servera tika liegta (error 401) - - Bad command line: - Slikta komandlīnija: + + The operation requested on the remote content is not permitted + Pieprasītā piekļuve materiālam uz servera nav atļauta - - Legal Notice - Juridiskais ziņojums + + The remote content was not found at the server (404) + Meklētais materiāls uz servera netika atrasts (error 404) - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Serveris pieprasa veikt datu autentifikāciju, lai noslēgtu savienojumu, bet piedāvietie autentifikācijas dati netika pieņemti - - No further notices will be issued. - + + The Network Access API cannot honor the request because the protocol is not known + Protokols nav zināms, līdz ar to tīkla piekļuves API nevar apstrādāt jūsu pieprasījumu - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - qBittorrent ir failu koplietošanas programma. Katrs jūsu aktīvais koplietotais torrents ar augšupielādes palīdzību būs pieejams citiem lietotājiem. Katrs fails, kuru augšupielādējat ir uz jūsu pašu atbildību. - -Tālāki atgādinājumi netiks izsniegti. + + The requested operation is invalid for this protocol + Pieprasītā operācija ar šo protokolu nav saderīga - - Press %1 key to accept and continue... - Nospiediet taustiņu %1 lai turpinātu... + + An unknown network-related error was detected + Atklāta nezināma ar tīklu saistīta kļūda. - - Legal notice - Juridiskais ziņojums + + An unknown proxy-related error was detected + Atklāta nezināma ar starpniekserveri saistīta kļūda. - - Cancel - Atcelt + + An unknown error related to the remote content was detected + Atklāta nezināma ar meklēto materiālu saistīta kļūda - - I Agree - Es piekrītu + + A breakdown in protocol was detected + Konstatēts protokola traucējums - - + + Unknown error + Nezināma kļūda + + + + Upgrade Uzlabot - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] Jūs veicāt atjaunināšanu no vecākas versijas, kura saglabā lietas savādāk. Jums jāatjaunina arī saglabāšanas sistēma. Jūs nevarēsiet atkārtoti lietot vecāku versiju par v3.3.0. Vai vēlaties turpināt? [j/n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. Jūs veicāt atjaunināšanu no vecākas versijas, kura saglabā lietas savādāk. Jums jāatjaunina arī saglabāšanas sistēma. Ja jūs turpināsiet, jūs nevarēsiet atkārtoti lietot vecāku versiju par v3.3.0. - + Couldn't migrate torrent with hash: %1 Neizdevās pārvietot torrentu ar jaucējodu: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 Neizdevās pārvietot torrenta failu. Nederīgs ātrās atsākšanas faila nosaukums: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 - + + Detected unclean program exit. Using fallback file to restore settings. + Programma netika droši aizvērta. Izmantojam kopijas, lai atjaunotu iestatījumus. - + An access error occurred while trying to write the configuration file. Piekļuves kļūda mēģinot rakstīt konfigurācijas failā. - + A format error occurred while trying to write the configuration file. Formāta kļūda mēģinot rakstīt konfigurācijas failā. - - - An unknown error occurred while trying to write the configuration file. - - - RSS::AutoDownloader - - - - Invalid data format. - - - - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - - - - - Invalid data format - - + RSS - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - + + Search + Meklēt - - Couldn't load RSS AutoDownloader rules. Reason: %1 - + + New subscription + Pievienot kanālu - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - + + + + Mark items read + Atzīmēt visus kā skatītus - - RSS feed at '%1' updated. Added %2 new articles. - + + Update all + Atsvaidzināt visus - - Failed to parse RSS feed at '%1'. Reason: %2 - + + RSS Downloader... + RSS lejupielādētājs... - - Couldn't read RSS Session data from %1. Error: %2 - + + Settings... + Iestatījumi... - - Couldn't parse RSS Session data. Error: %1 - + + Torrents: (double-click to download) + Torrenti: (dubultklikšķis, lai lejupielādētu) - - Couldn't load RSS Session data. Invalid data format. - + + + Delete + Dzēst - - Couldn't load RSS article '%1#%2'. Invalid data format. - + + Rename... + Pārdēvēt... - - - RSS::Private::Parser - - Invalid RSS feed. - + + Rename + Pārdēvēt - - %1 (line: %2, column: %3, offset: %4). - + + + Update + Atsvaidzināt - - - RSS::Session - - RSS feed with given URL already exists: %1. - + + New subscription... + Pievienot kanālu... - - Cannot move root folder. - + + + Update all feeds + Atsvaidzināt visus kanālus - - - Item doesn't exist: %1. - + + Download torrent + Lejupielādēt torrentu - - Cannot delete root folder. - + + Open news URL + Atvērt ieraksta adresi - - Incorrect RSS Item path: %1. - + + Copy feed URL + Kopēt kanāla adresi - - RSS item with given path already exists: %1. - + + New folder... + Jauna mape... - - Parent folder doesn't exist: %1. - + + Refresh RSS streams + Atsvaidzināt RSS kanālus - RSSWidget + RSSImp - - Search - + + Stream URL: + Kanāla adrese: - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - + + Please type a RSS stream URL + Lūdzu ievadiet RSS kanāla adresi - - New subscription - + + This RSS feed is already in the list. + Šis RSS kanāls jau ir sarakstā. - - - - Mark items read - + + Please choose a folder name + Lūdzu, izvēlēties mapes nosaukumu - - Refresh RSS streams - + + Folder name: + Mapes nosaukums: - - Update all - + + New folder + Jauna mape - - RSS Downloader... - + + Deletion confirmation + Dzēšanas apstiprināšana - - Torrents: (double-click to download) - + + Are you sure you want to delete the selected RSS feeds? + Vai esat pārliecināts, ka vēlaties izdzēst atlasītos RSS kanālus? - - - Delete - Dzēst + + Please choose a new name for this RSS feed + Lūdzu izvēlēties jaunu nosaukumu šim RSS kanālam - - Rename... - Pārdēvēt... + + New feed name: + Jaunais kanāla nosaukums: - - Rename - Pārdēvēt + + Name already in use + Šads nosaukums jau tiek izmantots - - - Update - + + This name is already used by another item, please choose another one. + Šāds nosaukums jau tiek izmantots, lūdzu izvēlieties citu. - - New subscription... - + + Date: + Datums: - - - Update all feeds - + + Author: + Autors: - - Download torrent - + + Unread + Neskatīti + + + Rss::Feed - - Open news URL - + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + '%1' automātiska lejupielāde no kanāla '%2" neizdevās, jo saturā nav atrasts nedz torrenta fails, nedz arī magnētsaite... - - Copy feed URL - + + Automatically downloading '%1' torrent from '%2' RSS feed... + Automātiski lejupielādējam '%1' torrentu no RSS kanāla '%2'... + + + Rss::Private::Parser - - New folder... - + + Invalid RSS feed. + Nederīgs RSS kanāls. + + + RssSettingsDlg - - Please choose a folder name - + + RSS Reader Settings + RSS lasītāja iestatījumi - - Folder name: - + + RSS feeds refresh interval: + RSS kanālu atsvaidzināšanas intervāls: - - New folder - + + min + min - - Please type a RSS feed URL - - - - - Feed URL: - - - - - Deletion confirmation - - - - - Are you sure you want to delete the selected RSS feeds? - - - - - Please choose a new name for this RSS feed - - - - - New feed name: - - - - - Rename failed - Pārdēvēšana neizdevās - - - - Date: - - - - - Author: - + + Maximum number of articles per feed: + Maksimālais jaunāko ziņu skaits uz kanālu: ScanFoldersDelegate - + Select save location Izvēlēties saglabāšanas vietu @@ -7440,274 +6704,268 @@ ScanFoldersModel - + Monitored Folder Uzraudzītā mape - + Override Save Location Ignorēt saglabāšanas vietu - + Monitored folder Uzraudzītā mape - + Default save location Noklusējuma saglabāšanas vieta - + Browse... Pārlūkot... - SearchJobWidget + SearchEngine - - Form - + + Unknown search engine plugin file format. + Nezināms meklētāja spraudņa faila formāts. - - Results(xxx) - + + A more recent version of this plugin is already installed. + Šobrīd jau ir ieinstalēta šī spraudņa jaunāka versija. - - Search in: - + + + Plugin is not supported. + Spraudnis nav atbalstīts - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - + + Update server is temporarily unavailable. %1 + Atjauninājumu serveris šobrīd nav pieejams. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - + + + Failed to download the plugin file. %1 + Neizdevās lejupielādēt spraudņa failu. %1 - - Seeds: - Devēji: + + An incorrect update info received. + Saņemta kļūdaina atjauninājuma informācija - - <html><head/><body><p>Minimal number of seeds</p></body></html> - + + All categories + Visas kategorijas - - - to - + + Movies + Filmas - - <html><head/><body><p>Maximal number of seeds</p></body></html> - + + TV shows + TV raidījumi - - - - + + Music + Mūzika - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + + Games + Spēles - - Size: - Izmērs: + + Anime + Anime - - <html><head/><body><p>Minimal torrent size</p></body></html> - + + Software + Programmatūra - - <html><head/><body><p>Maximal torrent size</p></body></html> - + + Pictures + Attēli + + + + Books + Grāmatas + + + + SearchListDelegate + + + + Unknown + Nezināms + + + SearchTab - + Name i.e: file name - Nosaukums + Nosaukums - + Size i.e: file size - Izmērs + Izmērs - + Seeders i.e: Number of full sources - + Devēji - + Leechers i.e: Number of partial sources - + Ņēmēji - + Search engine - - - - - Filter search results... - + Meklētājs - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Rezultāti (parādīti <i>%1</i> no <i>%2</i>): - + Torrent names only - + Tikai torrentu nosaukumos - + Everywhere - - - - - Use regular expressions - + Visur - + Searching... - + Meklē... - + Search has finished - Meklēšana pabeigta + Meklēšana pabeigta. - + Search aborted - + Meklēšana pārtraukta - + An error occurred during search... - + Meklēšanas laikā radās kļūda... - + Search returned no results - + Meklēšana nedeva rezultātus - + Column visibility Kolonnas redzamība - - - SearchPluginManager - - - Unknown search engine plugin file format. - - - - - A more recent version of this plugin is already installed. - - - - - Plugin is not supported. - + + Form + Forma - - All categories - Visas kategorijas + + Results(xxx) + Rezultāti(xxx) - - Movies - + + Search in: + Meklēt: - - TV shows - + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Daži meklētāji meklē meklētājā ierakstītos vārdus gan torrentu aprakstā, gan arī torrentu nosaukumos. Izvēles iespējām tiek piešķirt divi sekojošie režīmi.</p><p><span style=" font-weight:600;">Visur </span>parāda pilnīgi visus rezultātus</p><p><span style=" font-weight:600;">Tikai torrentu nosaukumos</span> parāda tikai torrentus, kura nosaukumi satur meklētājā ierakstītos vārdus.</p></body></html> - - Music - + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Uzstādīt minimālo un maksimālo atļauto devēju skaitu</p></body></html> - - Games - + + Seeds: + Devēji: - - Anime - + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Mināmalais devēju skaits</p></body></html> - - Software - + + + to + uz - - Pictures - + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Maksimālais devēju skaits</p></body></html> - - - Books - + + + + + - - Update server is temporarily unavailable. %1 - + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Uzstādīt minimālos un maksimālos torrenta failu izmērus</p></body></html> - - - Failed to download the plugin file. %1 - + + Size: + Izmērs: - - An incorrect update info received. - + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Minimālais torrentu izmērs</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Maksimālais torrentu izmērs</p></body></html> @@ -7715,198 +6973,185 @@ - - - - + + + Search Meklēt - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - Nav atrasti uzinstalēti meklētāju spraudņi. -Spiediet uz "Meklētāju spraudņi..." pogas, lai kādu uzinstalētu. - - - + Download Lejupielādēt - + Go to description page Atvērt torrenta apraksta lapu - + Copy description page URL Nokopēt apraksta lapas adresi - + Search plugins... Meklētāju spraudņi... - + A phrase to search for. Frāze, ko meklēt. - + Spaces in a search term may be protected by double quotes. Meklējot terminu ar atstarpēm, iekļaujiet to pēdiņās. - + Example: Search phrase example Piemērs: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - + All plugins Visi spraudņi - + Only enabled Tikai ieslēgtie - + Select... Izvēlēties... - - - + + + Search Engine Meklētājs - + Please install Python to use the Search Engine. Lūdzu uzinstalējiet Python, lai lietotu meklētāju. - + Empty search pattern Ievadiet atslēgas vārdus - + Please type a search pattern first Lūdzu meklētājā ievadiet atslēgas vārdus - + Stop Pārtraukt - + Search has finished Meklēšana pabeigta - + Search has failed Meklēšana neizdevās - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + qBittorrent klients tiks aizvērts. - + E&xit Now - + Ai&zvērt tagad - + Exit confirmation - + Aizvēršanas apstiprināšana - + The computer is going to shutdown. - + Dators tiks izslēgts. - + &Shutdown Now - + &Izslēgt tagad - - Shutdown confirmation - - - - + The computer is going to enter suspend mode. - + Dators tiks pārslēgts miega režīmā. - + &Suspend Now - + Pārslēgties miega režīmā - + Suspend confirmation - + Miega režīma apstiprināšana - + The computer is going to enter hibernation mode. - + Dators tiks pārslēgts hibernācijas režīmā. - + &Hibernate Now - + Pārslēgties hibernācijas režīmā - + Hibernate confirmation - + Hibernācijas režīma apstiprināšana - + You can cancel the action within %1 seconds. - + Jūs varat atcelt izvēli %1 sekundēs. + + + + Shutdown confirmation + Datora izslēgšanas apstiprināšana SpeedLimitDialog - + KiB/s KiB/s @@ -7914,52 +7159,52 @@ SpeedPlotView - + Total Upload Kopējā augšupielāde - + Total Download Kopējā lejupielāde - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload Augšupielāde DHT tīklā - + DHT Download Lejupielāde DHT tīklā - + Tracker Upload Augšupielāde trakeros - + Tracker Download Lejupielāde trakeros @@ -7967,95 +7212,87 @@ SpeedWidget - + Period: Periods: - + 1 Minute 1 minūte - + 5 Minutes 5 minūtes - + 30 Minutes 30 minūtes - + 6 Hours 6 stundas - + Select Graphs Izvēlēties diagrammas - + Total Upload Kopējā augšupielāde - + Total Download Kopējā lejupielāde - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload Augšupielāde DHT tīklā - + DHT Download Lejupielāde DHT tīklā - + Tracker Upload Augšupielāde trakeros - + Tracker Download Lejupielāde trakeros - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8068,49 +7305,49 @@ Lietotāja statistika - - Cache statistics - Kešatmiņa: + + Total peer connections: + Savienojumi ar koplietotājiem: - - Read cache hits: - + + Global ratio: + Kopējais reitings: - - Average time in queue: - + + Alltime download: + Kopējā lejupielāde: - - Connected peers: - Pievienotie koplietotāji: + + Alltime upload: + Kopējā augšupielāde: - - All-time share ratio: - Kopējais koplietošanas reitings: + + Total waste (this session): + Kopā izmesti (šajā sesijā): - - All-time download: - Kopējais lejupielādes daudzums: + + Cache statistics + Kešatmiņa: - - Session waste: + + Read cache hits: - - All-time upload: - Kopējais augšupielādes daudzums: + + Average time in queue: + - Total buffer size: - + Total buffers size: + Kopējais bufera izmērs: @@ -8138,7 +7375,12 @@ - + + OK + Labi + + + %1 ms 18 milliseconds %1 ms @@ -8147,27 +7389,32 @@ StatusBar - + Connection status: Savienojuma statuss: - + No direct connections. This may indicate network configuration problems. Nav tieša savienojuma. Tas var norādīt uz nepareizi nokonfigurētu tīkla savienojumu. - + DHT: %1 nodes DHT: %1 serveri - - qBittorrent needs to be restarted! - + + qBittorrent needs to be restarted + qBittorrent ir nepieciešams restarts + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent nupat tika atjaunināts un ir nepieciešams restarts, lai izmaiņas stātos spēkā. @@ -8186,1564 +7433,1311 @@ Pieslēdzies. Tas parasti nozīmē, ka vajadzīgie porti ir atvērti un viss strādā kā nākas. - + Click to switch to alternative speed limits Klikšķiniet šeit, lai pielietotu alternatīvos ielādes ātrumus - + Click to switch to regular speed limits Klikšķiniet šeit, lai pielietotu regulāros ielādes ātrumus - + + Manual change of rate limits mode. The scheduler is disabled. + Manuāla ielādes ātrumu maiņa. Grafiks ir izslēgts. + + + Global Download Speed Limit Globālais lejupielādes ātruma limits - + Global Upload Speed Limit Globālais augšupielādes ātruma limits - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - Visi (0) + Visi (0) - + Downloading (0) - + Lejupielādē (0) - + Seeding (0) - + Augšupielādē (0) - + Completed (0) - + Pabeigti (0) - + Resumed (0) - + Atsākti (0) - + Paused (0) - + Nopauzēti (0) - + Active (0) - + Aktīvi (0) - + Inactive (0) - + Neaktīvi (0) - + Errored (0) - + Kļūdaini (0) - + All (%1) - Visi (%1) + Visi (%1) - + Downloading (%1) - + Lejupielādē (%1) - + Seeding (%1) - + Augšupielādē (%1) - + Completed (%1) - + Pabeigti (%1) - + Paused (%1) - + Nopauzēti (%1) - + Resumed (%1) - + Atsākti (%1) - + Active (%1) - + Aktīvi (%1) - + Inactive (%1) - + Neaktīvi (%1) - + Errored (%1) - + Kļūdaini (%1) - TagFilterModel + TorrentContentModel - - Tags - Birkas + + Name + Nosaukums - - All - Visi + + Size + Izmērs - - Untagged - Bez birkas + + Progress + Progress - - - TagFilterWidget - - Add tag... - Pievienot birku... + + Download Priority + Lejupielādes prioritāte - - Remove tag - Dzēst birku + + Remaining + Atlikuši + + + TorrentCreatorDlg - - Remove unused tags - Dzēst nelietotās birkas + + Select a folder to add to the torrent + Izvēlēties mapi, kuru pievienot torrentam - - Resume torrents - Atsākt torrentus + + Select a file to add to the torrent + Izvēlieties failu, kuru pievienot torrentam - - Pause torrents - Nopauzēt torrentus + + No input path set + Nav norādīts fails vai mape - - Delete torrents - Dzēst torrentus + + Please type an input path first + Lūdzu norādiet failu vai mapi - - New Tag - Jauna birka + + Select destination torrent file + Izvēlieties, kur saglabāt torrenta failu - - Tag: - Birka: + + Torrent Files (*.torrent) + Torrentu faili (*.torrent) - - Invalid tag name - Nederīgs birkas nosaukums + + Torrent was created successfully: %1 + %1 is the path of the torrent + Torrents veiksmīgi izveidots: %1 - - Tag name '%1' is invalid - Birkas nosaukums '%1' nav derīgs + + + + Torrent creation + Torrenta izveide - - Tag exists - Kļūda nosaukumā + + Torrent creation was unsuccessful, reason: %1 + Torenta izveide bija nesekmīga, iemesls: %1 - - Tag name already exists. - Birka ar šādu nosaukumu jau pastāv. + + Created torrent file is invalid. It won't be added to download list. + Izveidotais torrenta fails nav derīgs. Tas netiks pievienots torrentu sarakstam. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Torrentu kategorijas īpašības + + Name + i.e: torrent name + Nosaukums - - Name: - + + Size + i.e: torrent size + Izmērs - - Save path: - Saglabāšanas vieta: + + Done + % Done + Pabeigti - - Choose save path - Izvēlieties vietu, kur saglabāt + + Status + Torrent status (e.g. downloading, seeding, paused) + Statuss - - New Category - + + Seeds + i.e. full sources (often untranslated) + Devēji - - Invalid category name - + + Peers + i.e. partial sources (often untranslated) + Koplietotāji - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - + + Down Speed + i.e: Download speed + Lejupielādes ātrums - - Category creation error - Kļūda nosaukumā + + Up Speed + i.e: Upload speed + Augšupielādes ātrums - - Category with the given name already exists. -Please choose a different name and try again. - Kategorija ar šādu nosaukumu jau pastāv. -Lūdzu izvēlieties citu nosaukumu. + + Ratio + Share ratio + Reitings - - - TorrentContentModel - - Name - Nosaukums + + ETA + i.e: Estimated Time of Arrival / Time left + ETA - - Size - Izmērs + + Category + Kategorija - - Progress - Progress + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Pievienots - - Download Priority - Lejupielādes prioritāte + + Completed On + Torrent was completed on 01/01/2010 08:00 + Pabeigts - - Remaining - Atlikuši + + Tracker + Trakeris - - Availability - Pieejamība + + Down Limit + i.e: Download limit + Lejupielādes limits - - - TorrentCreatorDialog - - Torrent Creator - + + Up Limit + i.e: Upload limit + Augšupielādes limits - - Select file/folder to share - + + Downloaded + Amount of data downloaded (e.g. in MB) + Lejupielādēti - - Path: - + + Uploaded + Amount of data uploaded (e.g. in MB) + Augšupielādēti - - [Drag and drop area] - + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Lejupielādēti šajā sesijā - - - Select file - + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Augšupielādēti šajā sesijā - - - Select folder - + + Remaining + Amount of data left to download (e.g. in MB) + Atlikuši - - Settings - + + Time Active + Time (duration) the torrent is active (not paused) + Aktīvs jau - - Piece size: - + + Save path + Torrent save path + Saglabāšanas vieta - - Auto - + + Completed + Amount of data completed (e.g. in MB) + Pabeigti - - 16 KiB - + + Ratio Limit + Upload share ratio limit + Reitinga limits - - 32 KiB - + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Pēdējo reizi koplietots - - 64 KiB - + + Last Activity + Time passed since a chunk was downloaded/uploaded + Pēdējā aktivitāte - - 128 KiB - + + Total Size + i.e. Size including unwanted data + Kopējais izmērs + + + TrackerFiltersList - - 256 KiB - + + All (0) + this is for the tracker filter + Visi (0) - - 512 KiB - + + Trackerless (0) + Bez trakeriem (0) - - 1 MiB - + + Error (0) + Kļūda (0) - - 2 MiB - + + Warning (0) + Brīdinājums (0) - - 4 MiB - + + + Trackerless (%1) + Bez trakeriem (%1) - - 8 MiB - + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - 16 MiB - + + + Error (%1) + Kļūda (%1) - - 32 MiB - + + + Warning (%1) + Brīdinājums (%1) - - Calculate number of pieces: - + + Resume torrents + Atsākt torrentus - - Private torrent (Won't distribute on DHT network) - + + Pause torrents + Nopauzēt torrentus - - Start seeding immediately - + + Delete torrents + Dzēst torrentus - - Ignore share ratio limits for this torrent - + + + All (%1) + this is for the tracker filter + Visi (%1) + + + TrackerList - - Optimize alignment - + + URL + Adrese - - Fields - + + Status + Statuss - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + + Received - - Web seed URLs: - + + Seeds + Devēji - - Tracker URLs: - + + Peers + Koplietotāji - - Comments: - + + Downloaded + Lejupielādēti - - Source: - + + Message + Ziņojums - - Progress: - Progress: + + + Working + Strādā - - Create Torrent - + + Disabled + Atslēgts - - - - Torrent creation failed - + + This torrent is private + Šis torrents ir privāts - - Reason: Path to file/folder is not readable. - + + Updating... + Atjaunina... - - Select where to save the new torrent - + + Not working + Nestrādā - - Torrent Files (*.torrent) - + + Not contacted yet + Vēl nav savienots - - Reason: %1 - + + Tracker URL: + Trakera adrese: - - Reason: Created torrent is invalid. It won't be added to download list. - + + Tracker editing + Trakera rediģēšana - - Torrent creator - + + + Tracker editing failed + Trakera rediģēšana neizdevās - - Torrent created: - + + The tracker URL entered is invalid. + Ievadītā trakera adrese nav derīga. - - - TorrentInfo - - File size exceeds max limit %1 - + + The tracker URL already exists. + Šī trakera adrese jau ir pievienota. - - Torrent file read error: %1 - + + Add a new tracker... + Pievienot jaunu trakeri... - - Torrent file read error: size mismatch - + + Copy tracker URL + Kopēt trakera adresi - - - TorrentsController - - Not contacted yet - Vēl nav savienots + + Edit selected tracker URL + Izlabot izvēlētā trakera adresi - - Updating... - + + Force reannounce to selected trackers + Piespiedu sazināšanās ar izvēlētajiem trakeriem - - Working - Strādā - - - - Not working - Nestrādā - - - - Error: '%1' is not a valid torrent file. - - - - - - - - Torrent queueing must be enabled - - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - - Cannot make save path - - - - - Cannot write to directory - - - - - WebUI Set location: moving "%1", from "%2" to "%3" - - - - - Incorrect torrent name - - - - - - Incorrect category name - - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - Visi (0) - - - - Trackerless (0) - Bez trakeriem (0) - - - - Error (0) - Kļūda (0) - - - - Warning (0) - Brīdinājums (0) - - - - - Trackerless (%1) - Bez trakeriem (%1) - - - - - Error (%1) - Kļūda (%1) - - - - - Warning (%1) - Brīdinājums (%1) - - - - Resume torrents - Atsākt torrentus - - - - Pause torrents - Nopauzēt torrentus - - - - Delete torrents - Dzēst torrentus - - - - - All (%1) - this is for the tracker filter - Visi (%1) - - - - TrackerListWidget - - - - Working - Strādā - - - - Disabled - Atslēgts - - - - This torrent is private - - - - - Updating... - - - - - Not working - Nestrādā - - - - Not contacted yet - Vēl nav savienots - - - - - - - - - N/A - Nav atrasta - - - - Tracker editing - - - - - Tracker URL: - - - - - - Tracker editing failed - - - - - The tracker URL entered is invalid. - - - - - The tracker URL already exists. - - - - - Add a new tracker... - - - - - Remove tracker - - - - - Copy tracker URL - - - - - Edit selected tracker URL - - - - - Force reannounce to selected trackers - - - - + Force reannounce to all trackers - - - - - URL - - - - - Status - Statuss - - - - Received - - - - - Seeds - - - - - Peers - Koplietotāji - - - - Downloaded - Lejupielādēti - - - - Message - + Piespiedu sazināšanās ar visiem trakeriem - - Column visibility - Kolonnas redzamība + + Remove tracker + Noņemt trakeri - TrackerLoginDialog - - - - Tracker authentication - - - - - Tracker: - - + TrackersAdditionDlg - - Login - Ielogoties - - - - Username: - Lietotājvārds: - - - - Password: - Parole: + + Trackers addition dialog + Trakeru pievienošanas logs - - Log in - + + List of trackers to add (one per line): + Saraksts ar trakeriem, kurus pievienot (katrā rindā pa vienam): - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + Ar µTorrent saderīga saraksta adrese: - - List of trackers to add (one per line): - + + I/O Error + Ievades/izvades kļūda - - µTorrent compatible list URL: - + + Error while trying to open the downloaded file. + Kļūme lejupielādētā faila atvēršanas laikā. - + No change - + Nav izmaiņu - + No additional trackers were found. - + Jauni trakeri netika atrasti. - + Download error - Lejupielādes kļūda + Lejupielādes kļūda - + The trackers list could not be downloaded, reason: %1 - + Trakeru sarakstu neizdevās lejupielādēt, iemesls: %1 TransferListDelegate - + Downloading Lejupielādē - + Downloading metadata used when loading a magnet link Lejupielādējam metadatus - + Allocating qBittorrent is allocating the files on disk Nodrošinām brīvo vietu - + Paused Nopauzēts - + Queued i.e. torrent is queued Ierindots - + Seeding Torrent is complete and in upload-only mode Augšupielādē - + Stalled Torrent is waiting for download to begin Apstājies - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [P] Lejupielādē - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [P] Augšupielādēšana - + Checking Torrent local data is being checked Pārbauda - + Queued for checking i.e. torrent is queued for hash checking Ierindots pārbaudei - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Pārbaudām atsākšanas datus - + Completed Pabeigts - - Moving - Torrent local data are being moved/relocated - - - - + Missing Files Trūkst faili - + Errored torrent status, the torrent has an error Kļūdaini - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - %1 (augšupielādē jau %2) - - - - %1 ago - e.g.: 1h 20m ago - pirms %1 - - - - TransferListFiltersWidget - - - Status - Statuss - - - - Categories - Kategorijas - - - - Tags - Birkas - - - - Trackers - Trakeri - - - - TransferListModel - - - Name - i.e: torrent name - Nosaukums - - - - Size - i.e: torrent size - Izmērs - - - - Done - % Done - - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Statuss - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - Koplietotāji - - - - Down Speed - i.e: Download speed - Lejupielādes ātrums - - - - Up Speed - i.e: Upload speed - Augšupielādes ātrums - - - - Ratio - Share ratio - - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - Kategorija - - - - Tags - Birkas - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Lejupielādēti - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Augšupielādēti - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - Atlikuši - - - - Time Active - Time (duration) the torrent is active (not paused) - - - - - Save path - Torrent save path - - - - - Completed - Amount of data completed (e.g. in MB) - Pabeigts + %1 (augšupielādē jau %2) - - Ratio Limit - Upload share ratio limit - + + %1 ago + e.g.: 1h 20m ago + pirms %1 + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + Statuss - - Last Activity - Time passed since a chunk was downloaded/uploaded - + + Categories + Kategorijas - - Total Size - i.e. Size including unwanted data - + + Trackers + Trakeri TransferListWidget - + Column visibility Kolonnas redzamība - + Choose save path Izvēlieties vietu, kur saglabāt - + Torrent Download Speed Limiting Torrenta lejupielādes ātruma ierobežošana - + Torrent Upload Speed Limiting Torrenta augšupielādes ātruma ierobežošana - + Recheck confirmation Pārbaudes apstiprināšana - + Are you sure you want to recheck the selected torrent(s)? Vai esat pārliecināts, ka vēlāties pārbaudīt izvēlētos torrentus?() - + Rename Pārdēvēt - + New name: Jaunais nosaukums: - + Resume Resume/start the torrent Atsākt - + Force Resume Force Resume/start the torrent Piespiedu atsākšana - + Pause Pause the torrent Nopauzēt - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - - - - - Add Tags - Pievienot birkas - - - - Remove All Tags - Dzēst visas birkas - - - - Remove all tags from selected torrents? - + + New Category + Jauna kategorija - - Comma-separated tags: - + + Category: + Kategorija: - - Invalid tag - Nederīga birka + + Invalid category name + Nederīgs kategorijas nosaukums - - Tag name: '%1' is invalid - Birkas nosaukums: '%1' nav derīgs + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Kategorijas nosaukums nedrīkst saturēt '\'. +Kategorijas nosaukums nedrīkst sākties vai beigties ar '/'. +Kategorijas nosaukums nedrīkst saturēt '//' simbolus. - + Delete Delete the torrent Dzēst - + Preview file... Priekšskatīt failu... - + Limit share ratio... Ierobežot koplietošanas reitingu... - + Limit upload rate... Ierobežot augšupielādes ātrumu... - + Limit download rate... Ierobežot lejupielādes ātrumu... - + Open destination folder Atvērt failu atrašanās vietu - + Move up i.e. move up in the queue Pārvietot augšup - + Move down i.e. Move down in the queue Pārvietot lejup - + Move to top i.e. Move to top of the queue Novietot saraksta augšgalā - + Move to bottom i.e. Move to bottom of the queue Novietot saraksta apakšā - + Set location... Nomainīt failu atrašanās vietu... - - Force reannounce - - - - + Copy name Kopēt nosaukumu - - Copy hash - - - - + Download first and last pieces first Vispirms ielādēt pirmās un pēdējās daļiņas - + Automatic Torrent Management Automātiska torrentu pārvaldība - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category Automātiskais režīms nozīmē, ka torrenta īpašības (piem. saglabāšanas vieta), tiks piešķirta atbilstoši izvēlētajai kategorijai. - + Category Kategorija - + New... New category... Jaunu... - + Reset Reset category Atiestatīt - - Tags - Birkas - - - - Add... - Add / assign multiple tags... - - - - - Remove All - Remove all tags - - - - + Priority Prioritāte - + Force recheck Piespiedu pārbaude - + Copy magnet link Kopēt magnētsaiti - + Super seeding mode Super-augšupielādēšanas režīms - + Rename... Pārdēvēt... - + Download in sequential order Lejupielādēt secīgā kārtībā - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + Torrenta augšupielādes/lejupielādes reitinga ierobežošana - - Use global share limit - + + Use global ratio limit + Lietot globālos uzstādījumus - - - + + + buttonGroup - - Set no share limit - + + Set no ratio limit + Neierobežot - - Set share limit to - + + Set ratio limit to + Reitinga robeža + + + WebApplication - - ratio - + + Incorrect category name + Nepareizs kategorijas nosaukums + + + WebUI - - minutes - + + The Web UI is listening on port %1 + Tālvadības kontroles panelis pieejams caur portu %1 - - No share limit method selected - + + Web UI Error - Unable to bind Web UI to port %1 + Tālvadības kontroles paneļa kļūda - neizdevās piesaistīt portu %1 + + + about - - Please select a limit method first - + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Moderns BitTorrent klients programmēts C++ valodā, veidots ar Qt toolkit uz libtorrent-rasterbar bāzes. + + + + Copyright %1 2006-2016 The qBittorrent project + Autortiesības %1 2006-2016 The qBittorrent project + + + + Home Page: + Mājaslapa: + + + + Forum: + Forums: + + + + Bug Tracker: + Par kļūmēm: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - + + Add Peers + Koplietotāju pievienošana - - Python not detected - + + List of peers to add (one per line): + Saraksts ar koplietotājiem, kurus pievienot (katrā rindā pa vienam): + + + + Format: IPv4:port / [IPv6]:port + Formāts: IPv4:ports / [IPv6]:ports - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - + + + Tracker authentication + Pierakstīšanās trakerim - - Symlinks inside alternative UI folder are forbidden. - + + Tracker: + Trakeris: - - Exceeded the maximum allowed file size (%1)! - + + Login + Ielogoties - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - + + Username: + Lietotājvārds: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - + + Password: + Parole: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - + + Log in + Pierakstīties - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - + + Cancel + Atcelt - WebUI + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + Dzēšanas apstiprināšana - qBittorrent + - - Web UI: HTTPS setup successful - Tālvadības panelis: HTTPS uzstādīts veiksmīgi + + Remember choice + Atcerēties izvēli - - Web UI: HTTPS setup failed, fallback to HTTP - Tālvadības panelis: HTTPS uzstādīšana neizdevās, atgriežamies pie HTTP + + Also delete the files on the hard disk + Izdzēst failus arī uz cietā diska + + + confirmShutdownDlg - - Web UI: Now listening on IP: %1, port: %2 - + + Don't show again + Vairs nerādīt + + + + createTorrentDialog + + + Cancel + Atcelt + + + + Torrent Creation Tool + Torrentu izveides rīks - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 + + Torrent file creation + Torrentu faila izvede + + + + Add file + Pievienot failu + + + + Add folder + Pievienot mapi + + + + File or folder to add to the torrent: + Fails vai mape, kuru pievienot torrentam: + + + + Tracker URLs: + Trakeru adreses: + + + + Web seeds urls: + Tīmekļa devēju adreses: + + + + Comment: + Komentārs: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + + + Piece size: + Daļiņas izmērs: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + Automātiski + + + + Private (won't be distributed on DHT network if enabled) + Privāts (nebūs pieejams DHT tīklā) + + + + Start seeding after creation + Sākt koplietošanu pēc torrenta izveides + + + + Ignore share ratio limits for this torrent + Ignorēt koplietošanas reitinga limitus šim torrentam + + + + Create and save... + Izveidot un saglabāt... + + + + Progress: + Progress: + + + + downloadFromURL + + + Add torrent links + Pievienot torrentu saites + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Katrā rindā pa vienai saitei (Ir atbalstītas HTTP saites, Magnētsaites un Jaucējkodi) + + + + Download + Lejupielādēt + + + + Cancel + Atcelt + + + + Download from urls + Lejupielādēt no saitēm + + + + No URL entered + Adrese netika ievadīta + + + + Please type at least one URL. + Lūdzu ievadiet vismaz vienu adresi. + + + + errorDialog + + + Crash info + Informācija par kļūmi + fsutils - + + + + + Downloads Lejupielādes @@ -9751,100 +8745,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + Python nav atrasts + + + + Python version: %1 + Python versija: %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1st %2m - + %1d %2h e.g: 2days 10hours %1d %2st - + Unknown Unknown (size) Nezināms - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorent tagad izslēgs datoru, jo visas lejupielādes ir pabeigtas. - + < 1m < 1 minute < 1m - + %1m e.g: 10minutes %1m + + + Working + Strādā + + + + Updating... + Atjaunina... + + + + Not working + Nestrādā + + + + Not contacted yet + Vēl nav savienots + preview - + Preview selection Priekšskatīt izvēlēto - + The following files support previewing, please select one of them: Sekojošie faili atbalsta priekšskatīšanu, lūdzu izvēlieties vienu no tiem: + + + Preview + Priekšskatīt + + + + Cancel + Atcelt + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_ms_MY.ts qbittorrent-3.3.15/src/lang/qbittorrent_ms_MY.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_ms_MY.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_ms_MY.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - + Perihal qBittorrent - + About - + Perihal - + Author - - - - - Current maintainer - + Pengarang - - Greece - Yunani + + + Nationality: + Kerakyatan: - - - Nationality: - + + + Name: + Nama: - - + + E-mail: - + E-mel: - - - Name: - Nama: + + Greece + Yunani - - Original author - + + Current maintainer + Penyelenggaran semasa - - France - Perancis + + Original author + Pengarang asal - + Special Thanks - + Penghargaan Istimewa - + Translators - - - - - License - + Penterjemah - + Libraries - + Pustaka - + qBittorrent was built with the following libraries: - - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - + qBittorrent telah dibina dengan pustaka berikut: - - Forum: - + + France + Perancis - - Bug Tracker: - + + License + Lesen @@ -115,57 +90,67 @@ Disimpan di - + + Browse... + Layar... + + + + Set as default save path + Tetapkan laluan simpan lalai + + + Never show again Jangan sesekali tunjuk lagi - + Torrent settings Tetapan Torrent - + Set as default category Tetapkan sebagai kategori lalai - + Category: Kategori: - + Start torrent Mula torrent - + Torrent information Maklumat torrent - + Skip hash check Langkau semakan cincangan - + Size: Saiz: - + Hash: Cincangan: - + Comment: Ulasan: - + Date: Tarikh: @@ -190,117 +175,89 @@ Automatik - - Remember last used save path - - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog Bila ditanda, fail .torrent tidak akan dipadam walaupun bersandarkan tetapan pada halaman "Muat Turun" pada dialog pilihan - + Do not delete .torrent file Jangan padam fail .torrent - - Create subfolder - Cipta subfolder - - - - Download in sequential order - Muat turun dalam tertib berjujukan - - - - Download first and last pieces first - - - - + Normal Biasa - + High Tinggi - + Maximum Maksimum - + Do not download Jangan muat turun - - - + + + I/O Error Ralat I/O - + Invalid torrent Torrent tidak sah - - Renaming - Berbaki - - - - - Rename error - Ralat nama semula + + + + + Already in download list + Sudah ada di dalam senarai muat turun - - The name is empty or contains forbidden characters, please choose a different one. - Nama fail kosong atau mengandungi aksara terlarang, sila pilih yang lain. - - - + Not Available This comment is unavailable Tidak Tersedia - + Not Available This date is unavailable Tidak Tersedia - + Not available Tidak tersedia - + Invalid magnet link Pautan magnet tidak sah - + The torrent file '%1' does not exist. Fail torrent '%1' tidak wujud. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. Fail torrent '%1' tidak dapat dibaca dari cakera. Berkemungkinan anda tidak mempunyai keizinan yang mencukupi. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ Ralat: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torrent sudah ada dalam senarai muat turun. Penjejak tidak digabungkan kerana ia merupakan torrent persendirian. + + + + Torrent is already in download list. Trackers were merged. + Torrent sudah ada dalam senarai muat turun. Penjejak telah digabungkan. + + + + + Cannot add torrent + Tidak dapat tambah torrent + + + + Cannot add this torrent. Perhaps it is already in adding state. + Tidak dapat tambah torrent ini. Berkemungkinan ia sudah ada dalam keadaan tambah. + + + This magnet link was not recognized Pautan magnet ini tidak dikenali - + + Magnet link is already in download list. Trackers were merged. + Pautan magnet sudah ada dalam senarai muat turun. Penjejak telah digabungkan. + + + + Cannot add this torrent. Perhaps it is already in adding. + Tidak dapat tambah torrent ini. Berkemungkinan ia sudah ada dalam keadaan tambah. + + + Magnet link Pautan magnet - + Retrieving metadata... Mendapatkan data meta... - + Not Available This size is unavailable. Tidak Tersedia - + Free space on disk: %1 Ruang bebas dalam cakera: %1 - + + Choose save path Pilih laluan simpan - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - + + Rename the file + Namakan semula fail - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + + New name: + Nama baharu: - - Magnet link is already queued for processing. - + + + The file could not be renamed + Fail tidak dapat dinamakan semula - - New name: - Nama baharu: + + This file name contains forbidden characters, please choose a different one. + Nama fail ini mengandungi aksara terlarang, sila pilih yang lain. - - + + This name is already in use in this folder. Please use a different name. Nama ini sudah digunakan dalam folder ini. Sila guna nama lain. - + The folder could not be renamed Folder tidak dapat dinamakan semula - + Rename... Nama semula... - + Priority Keutamaan - + Invalid metadata Data meta tidak sah - + Parsing metadata... Menghurai data meta... - + Metadata retrieval complete Pemerolehan data meta selesai - + Download Error Ralat Muat Turun @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Saiz cache tulis cakera + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Port keluar (Min) [0: Dilumpuhkan] - + Outgoing ports (Max) [0: Disabled] Port keluar (Max) [0: Dilumpuhkan] - + Recheck torrents on completion Semak semula torrent seusai lengkap - + Transfer list refresh interval Sela segar semula senarai pemindahan - + ms milliseconds ms - + Setting Tetapan - + Value Value set for this setting Nilai - - - (disabled) - (dilumpuhkan) - - - + (auto) (auto) - - min - minutes - min - - - + All addresses Semua alamat - + qBittorrent Section Seksyen qBittorrent - - + + Open documentation Buka dokumentasi - + libtorrent Section Seksyen libtorrent - - Asynchronous I/O threads - - - - - Disk cache - Cache cakera - - - + s seconds s - + Disk cache expiry interval Sela luput cache cakera - + Enable OS cache Benarkan cache OS - - Guided read cache - Cache baca terpandu - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - Hantar cadangan cebisan muat naik - - - - - KiB - KiB - - - - Send buffer watermark - Hantar tera air penimbal - - - - Send buffer low watermark - Hantar tera air penimbal rendah - - - - Send buffer watermark factor - Hantar faktor tera air penimbal - - - - Prefer TCP - - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address - Benarkan sambungan berbilang daripada alamat IP yang sama + + m + minutes + m - + Resolve peer countries (GeoIP) Lerai negara rakan (GeoIP) - + Resolve peer host names Lerai nama hos rakan - + Strict super seeding Super penyemaian ketat - + Network Interface (requires restart) Antaramuka Rangkaian (perlu mula semula) - + Optional IP Address to bind to (requires restart) Alamat IP pilihan untuk diikatkan (perlu mula semula) - + Listen on IPv6 address (requires restart) Dengar pada alamat IPv6 (perlu mula semula) - + Display notifications Papar pemberitahuan - + Display notifications for added torrents Papar pemberitahuan untuk torrent yang ditambah - + Download tracker's favicon Muat turun favicon penjejak - - Save path history length - Panjang sejarah laluan simpan - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - Kelakuan slot muat naik - - - - Round-robin - - - - - Fastest upload - - - - - Anti-leech - - - - - Upload choking algorithm - Algoritma pencekik muat naik - - - + Confirm torrent recheck Sahkan semakan semula torrent - - Confirm removal of all tags - Sahkan pembuangan semua tag - - - - Always announce to all trackers in a tier - Sentiasa umum kepada semua penjejak dalam satu peringkat + Exchange trackers with other peers + Tukar penjejak dengan rakan lain - - Always announce to all tiers - Sentiasa umum kepada semua peringkat + + Always announce to all trackers + Sentiasa umum kepada semua penjejak - + Any interface i.e. Any network interface Mana-mana antaramuka - + Save resume data interval How often the fastresume file is saved. Simpan sela data sambung semula - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - Algoritma mod bercampur %1-TCP - - - + Maximum number of half-open connections [0: Unlimited] Bilangan maksimum sambunga buka-separa [0: Tanpa Had] - + IP Address to report to trackers (requires restart) Alamat IP untuk dilaporkan kepada penjejak (perlu mula semula) - + Enable embedded tracker Benarkan penjejak terbenam - + Embedded tracker port Port penjejak terbenam - + Check for software updates Semak kemaskini perisian - + Use system icon theme Guna tema ikon sistem @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 bermula - + Torrent: %1, running external program, command: %2 Torrent: %1, menjalankan program luar, perintah: %2 - - Torrent name: %1 - Nama torrent: %1 - - - - Torrent size: %1 - Saiz torrent: %1 - - - - Save path: %1 - Laluan simpan: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Torrent telah dimuat turun dalam %1. - - - - Thank you for using qBittorrent. - Terima kasih kerana menggunakan qBittorrent. - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' telah selesai dimuat turun + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrent: %1, menjalankan program luar, perintah terlalu panjang (panjang > %2), pelakuan gagal. - + Torrent: %1, sending mail notification Torrent: %1, menghantar pemberitahuan mel - + Information Maklumat - - To control qBittorrent, access the Web UI at %1 - + + To control qBittorrent, access the Web UI at http://localhost:%1 + Untuk mengawal qBittorrent, capai UI Sesawang di http://localhost:%1 - + The Web UI administrator user name is: %1 Nama pengguna bagi pentadbir UI Sesawang ialah: %1 - + The Web UI administrator password is still the default one: %1 Kata laluan pentadbir UI Sesawang masih yang lalai: %1 - + This is a security risk, please consider changing your password from program preferences. Ia merupakan risiko keselamatan, sila ubah kata laluan anda menerusi keutamaan program. - + Saving torrent progress... Menyimpan kemajuan torrent... - - - Portable mode and explicit profile directory options are mutually exclusive - Mod mudah alih dan pilihan direktori profil eksplisit adalah ekslusif bersama-sama - - - - Portable mode implies relative fastresume - Mod mudah alih melaksanakan sambung semula pantas secara relatif - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Simpan ke: @@ -861,836 +658,700 @@ Pemuat Turun RSS - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - Auto muat turun torrent RSS dilumpuhkan sekarang! Anda boleh benarkannya di dalam tetapan aplikasi. + + Enable Automated RSS Downloader + Benarkan Pemuat Turun RSS Berautomatik - + Download Rules Peraturan Muat Turun - + Rule Definition Takrifan Peraturan - + Use Regular Expressions Guna Ungkapan Nalar - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - - - - + Must Contain: Mesti Kandungi: - + Must Not Contain: Tidak Boleh Kandungi: - + Episode Filter: Penapis Episod: - + Assign Category: Kategori Umpuk: - + Save to a Different Directory Simpan dalam Direktori Berlainan - + Ignore Subsequent Matches for (0 to Disable) ... X days Abai Padanan Berturutan (0 untuk Lumpuhkan) - + Disabled - Dilumpuhkan + Dilumpuhkan - + days hari - + Add Paused: Tambah Dijeda: - + Use global settings Guna tetapan sejagat - + Always Sentiasa - + Never Tidak Sesekali - + Apply Rule to Feeds: Laksana Peraturan pada Suapan: - + Matching RSS Articles Artikel RSS Sepadan - + &Import... &Import... - + &Export... &Eksport... - + Matches articles based on episode filter. Artikel sepadan berdasarkan penapis episod. - + Example: Contoh: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match akan padankan 2, 5, 8 menerusi 15, 30 dan episod seterusnya bagi musim pertama - + Episode filter rules: Peraturan penapis episod: - + Season number is a mandatory non-zero value Bilangan musim adalah nilai bukan-sifar yang mandatori - + Episode number is a mandatory non-zero value + Bilangan episod adalah nilai bukan-sifar yang mandatori + + + Filter must end with semicolon Penapis mesti diakhir dengan tanda titik bertindih - + Three range types for episodes are supported: Tiga jenis julat untuk episod disokong: - + Single number: <b>1x25;</b> matches episode 25 of season one Nombor tunggal: <b>1x25;</b> sepadan episod 25 bagi musim pertama - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Julat biasa: <b>1x25-40;</b> sepadan 25 hingga 40 episod bagi musim pertama - - Episode number is a mandatory positive value - Bilangan episod adalah nilai positif yang mandatori - - - - Rules - Peraturan + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Julat tak terhingga: <b>1x25-;</b> sepadan 25 episod dan ke atas bagi musim pertama - - Rules (legacy) - Peraturan (lama) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Julat tak terhingga: <b>1x25-;</b> sepadan 25 episod dan ke atas bagi musim pertama, dan semua episod bagi musim berikutnya + - + Last Match: %1 days ago Padanan Terakhir: %1 hari yang lalu - + Last Match: Unknown Padanan Terakhir: Tidak diketahui - + New rule name Nama peraturan baharu - + Please type the name of the new download rule. Sila taip nama bagi peraturan muat turun baharu. - - + + Rule name conflict Nama peraturan berkonflik - - + + A rule with this name already exists, please choose another name. Satu nama peraturan dengan nama ini telah wujud, sila pilih nama lain. - + Are you sure you want to remove the download rule named '%1'? Anda pasti mahu buang peraturan muat turun bernama '%1'? - + Are you sure you want to remove the selected download rules? Anda pasti mahu buang peraturan muat turun terpilih? - + Rule deletion confirmation Pengesahan pemadaman peraturan - + Destination directory Direktori destinasi - + Invalid action Tindakan tidak sah - + The list is empty, there is nothing to export. Senarai kosong, tiada apa hendak dieksportkan. - - Export RSS rules - Eksport peraturan RSS + + Where would you like to save the list? + Lokasi yang anda mahu simpankan senarai? - - + + Rules list (*.rssrules) + Senarai peraturan (*.rssrules) + + + I/O Error Ralat I/O - - Failed to create the destination file. Reason: %1 - Gagal mencipta fail destinasi. Sebab: %1 + + Failed to create the destination file + Gagal mencipta fail destinasi - - Import RSS rules - Import peraturan RSS + + Please point to the RSS download rules file + Sila tuju ke fail peraturan muat turun RSS - - Failed to open the file. Reason: %1 - Gagal membuka fail. Sebab: %1 + + Rules list + Senarai peraturan - + Import Error Ralat Import - - Failed to import the selected rules file. Reason: %1 - Gagal mengimport fail peraturan terpilih. Sebab: %1 + + Failed to import the selected rules file + Gagal mengimport fail peraturan terpilih - + Add new rule... Tambah peraturan baharu... - + Delete rule Padam peraturan - + Rename rule... Nama semula peraturan... - + Delete selected rules Padam peraturan terpilih - - Clear downloaded episodes... - - - - + Rule renaming Penamaan semula peraturan - + Please type the new rule name Sila taip nama peraturan yang baharu - - Clear downloaded episodes - + + Regex mode: use Perl-like regular expressions + Mod ungkapan nalar: guna ungkapan nalar seakan-Perl - - Are you sure you want to clear the list of downloaded episodes for the selected rule? + + Wildcard mode: you can use - - Regex mode: use Perl-compatible regular expressions - Mod ungkapan nalar: guna ungkapan nalar serasi-Perl + + ? to match any single character + - - - Position %1: %2 - Kedudukan %1: %2 - - - - Wildcard mode: you can use - Mod kad liar: anda boleh gunakan - - - - ? to match any single character - ? untuk padankan mana-mana aksara tunggal - - - + * to match zero or more of any characters - * untuk padankan sifar atau lagi mana-mana aksara + - + Whitespaces count as AND operators (all words, any order) - Kiraan ruang putih dan operator AND (semua perkataan, mana-mana tertib) + - + | is used as OR operator - digunakan sebagai operator OR + - + If word order is important use * instead of whitespace. - Jika tertib perkataan adalah mustahak guna * selain dari ruang putih. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Satu ungkapan dengan klausa %1 kosong (seperti %2) - - - - will match all articles. - akan padankan semua artikel. - - - - will exclude all articles. - akan asingkan semua artikel. - - - - BanListOptionsDialog - - - List of banned IP addresses - - Ban IP + + will match all articles. - - Delete - Padam - - - - - Warning + + will exclude all articles. - - The entered IP address is invalid. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Mod kad liar: anda boleh gunakan<ul><li>? untuk padankan mana-mana aksara tunggal</li><li>* untuk padankan sifar atau mana-mana aksara</li><li>Ruang putih dikira sebagai operator AND</li></ul> - - The entered IP is already banned. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Mod kad liar: anda boleh gunakan<ul><li>? untuk padankan mana-mana aksara tunggal</li><li>* untuk padankan sifar atau mana-mana aksara lain</li><li>| digunakan sebagai operator OR</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support Mula semula diperlukan untuk menogol sokongan PeX - - Could not get GUID of configured network interface. Binding to IP %1 - Tidak dapat GUID antaramuka rangkaian terkonfigur. Mengikat ke IP %1 - - - + Embedded Tracker [ON] Penjejak Terbenam [HIDUP] - + Failed to start the embedded tracker! Gagal memulakan penjejak terbenam! - + Embedded Tracker [OFF] Penjejak Terbenam [MATI] - + + '%1' reached the maximum ratio you set. Removing... + '%1' mencapai nisbah maksimum yang anda tetapkan. Membuang... + + + + '%1' reached the maximum ratio you set. Pausing... + '%1' mencapai nisbah maksimum yang anda tetapkan. Dijedakan... + + + System network status changed to %1 e.g: System network status changed to ONLINE Status rangkaian sistem berubah ke %1 - + ONLINE ATAS-TALIAN - + OFFLINE LUAR-TALIAN - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding Konfigurasi rangkaian %1 telah berubah, menyegar semula pengikatan sesi - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. Alamat antaramuka rangkaian terkonfigur %1 tidak sah - - + Encryption support [%1] Sokongan penyulitan [%1] - - + FORCED DIPAKSA - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 bukanlah alamat IP yang sah dan telah ditolak ketika melaksanakan senarai alamat dilarang. - - - - + Anonymous mode [%1] Mod awanama [%1] - + Unable to decode '%1' torrent file. Tidak boleh menyahkod fail torrent '%1'. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Muat turun rekursif bagi fail terbenam '%1' dalam torrent '%2' - + Queue positions were corrected in %1 resume files - Kedudukan baris gilir dibetulkan dengan %1 fail sambung semula + - + Couldn't save '%1.torrent' Tidak dapat simpan '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' telah dibuang dari senarai pemindahan. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' telah dibuang dari senarai pemindahan dan cakera keras. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '%1' telah dibuang dari senarai pemindahan tetapi fail tidak dapat dipadam. Ralat: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. kerana %1 telah dilumpuhkan. - + because %1 is disabled. this peer was blocked because TCP is disabled. kerana %1 telah dilumpuhkan. - + URL seed lookup failed for URL: '%1', message: %2 Carian semaian URL gagal bagi URL: '%1', mesej: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent gagal mendengar pada antaramuka %1 port: %2/%3. Sebab: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' telah dibuang dari senarai pemindahan dan cakera keras. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' telah dibuang dari senarai pemindahan. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Memuat turun '%1', tunggu sebentar... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent cuba mendengar pada mana-mana port antaramuka: %1 - + The network interface defined is invalid: %1 Antaramuka rangkaian yang ditakrif tidak sah: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent cuba mendengar pada antaramuka %1 port: %2 - - Peer ID: - - - - - HTTP User-Agent is '%1' - - - - - + DHT support [%1] Sokongan DHT [%1] - - - - - - - - - + + + + ON HIDUP - - - - - - - - - + + + + OFF MATI - - + Local Peer Discovery support [%1] Sokongan Penemuan Rakan Setempat [%1] - - PeX support [%1] - - - - - '%1' reached the maximum ratio you set. Removed. - '%1' mencapai nisbah maksimum yang anda tetapkan. Dibuang. - - - - '%1' reached the maximum ratio you set. Paused. - '%1' mencapai nisbah maksimum yang anda tetapkan. Dijedakan. - - - - '%1' reached the maximum seeding time you set. Removed. - '%1' mencapai masa penyemaian maksimum yang anda tetapkan. Dibuang. - - - - '%1' reached the maximum seeding time you set. Paused. - '%1' mencapai masa penyemaian maksimum yang anda tetapkan. Dijeda. + Restart is required to toggle Tracker Exchange support + Mula semula diperlukan untuk menogol sokongan Pertukaran Penjejak - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent tidak dapat cari alamat setempat %1 yang didengari - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent gagal mendengar pada mana-mana port antaramuka: %1. Sebab: %2. - + Tracker '%1' was added to torrent '%2' Penjejak '%1' telah ditambah ke dalam torrent '%2' - + Tracker '%1' was deleted from torrent '%2' Penjejak '%1' telah dipadam dari torrent '%2' - + URL seed '%1' was added to torrent '%2' Semaian URL '%1' telah ditambah ke dalam torrent '%2' - + URL seed '%1' was removed from torrent '%2' Semaian URL '%1' telah dibuang dari torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Tidak boleh sambung semula torrent '%1' - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Berjaya menghurai penapis IP yang disediakan: %1 peraturan telah dilaksanakan. - + Error: Failed to parse the provided IP filter. Ralat: Gagal menghurai penapis IP yang disediakan. - - '%1' restored. - 'torrent name' restored. - - - - + Couldn't add torrent. Reason: %1 Tidak dapat tambah torrent. Sebab: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' disambung semula. (sambung semula pantas) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' ditambah ke dalam senarai muat turun. - + An I/O error occurred, '%1' paused. %2 Satu ralat I/O berlaku, '%1' dijedakan. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Kegagalan pemetaan port, mesej: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Pemetaan port berjaya, mesej: %1 - + due to IP filter. this peer was blocked due to ip filter. disebabkan penapis IP. - + due to port filter. this peer was blocked due to port filter. disebabkan penapis port. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. disebabkan sekatan mod bercampur i2p. - + because it has a low port. this peer was blocked because it has a low port. kerana ia mempunyai port rendah. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent berjaya mendengar pada antaramuka %1 port: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 IP LUARAN: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - penciptaan fail torrent baharu gagal - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + Tidak dapat alih torrent: '%1'. Sebab: %2 - + File sizes mismatch for torrent '%1', pausing it. - + Saiz fail tidak sepadan untuk torrent '%1', menjedakannya. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - + Data sambung semula pantas telah ditolak bagi torrent '%1'. Sebab: %2 Menyemak kembali... CategoryFilterModel - + Categories - Kategori + Kategori - + All - Semua + Semua - + Uncategorized - Tiada Kategori + @@ -1698,42 +1359,147 @@ Add category... - Tambah kategori... + Tambah kategori... Add subcategory... - Tambah subkategori... + - Edit category... - Sunting kategori... + Remove category + Buang kategori + + + + Remove unused categories + Buang kategori yang tidak digunakan + + + + Resume torrents + Sambung semula torrent + + + + Pause torrents + Jeda torrent + + + + Delete torrents + Padam torrent + + + + New Category + Kategori Baharu + + + + Category: + Kategori: + + + + Invalid category name + Nama kategori tidak sah + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Nama kategori mesti tidak mengandungi '\'. +Nama kategori mesti tidak bermula/tamat dengan '/'. +Nama kategori mesti tidak mengandungi jujukan '//'. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Semua (0) + + + Uncategorized (0) + Tiada kategori (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Tiada kategori (%1) + + + Add category... + Tambah kategori... - Remove category - Buang kategori + Buang kategori - Remove unused categories - Buang kategori yang tidak digunakan + Buang kategori yang tidak digunakan - Resume torrents - Sambung semula torrent + Sambung semula torrent - Pause torrents - Jeda torrent + Jeda torrent - Delete torrents - Padam torrent + Padam torrent + + + New Category + Kategori Baharu + + + Category: + Kategori: + + + Invalid category name + Nama kategori tidak sah + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Nama kategori mesti tidak mengandungi '\'. +Nama kategori mesti tidak bermula/tamat dengan '/'. +Nama kategori mesti tidak mengandungi jujukan '//'. + + + All (%1) + this is for the category filter + Semua (%1) @@ -1773,220 +1539,101 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Pengesahan pemadaman - - - - Remember choice - - - - - Also delete the files on the hard disk - - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Anda mahu padam '%1' dari senarai pemindahan? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - - - - - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - Muat turun - - - - No URL entered - - - - - Please type at least one URL. - + Anda mahu padam %1 torrent ini dari senarai pemindahan? DownloadedPiecesBar - + White: Missing pieces Putih: Cebisan hilang - + Green: Partial pieces Hijau: Cebisan separa - + Blue: Completed pieces Biru: Cebisan selesai - ExecutionLogWidget + ExecutionLog - + General - Am + Am - + Blocked IPs - + IP Disekat - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> telah menyekat %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - + <font color='red'>%1</font> telah dihalang masuk FeedListWidget - + RSS feeds Suapan RSS - - - Unread (%1) - Belum Baca (%1) + + Unread + Belum Baca FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - - - - - &Browse... - Launch file dialog button text (full) - - - - - Choose a file - Caption for file open/save dialog - - - - - Choose a folder - Caption for directory open dialog - - - - - Any file - + + An error occured while trying to open the log file. Logging to file is disabled. + Satu ralat berlaku ketika cuba membuka fail log. Pengelogan fail telah dilumpuhkan. FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - Ralat I/O: Tidak dapat buka fail penapis IP dalam mod baca. - - - - - - IP filter line %1 is malformed. - Baris penapis IP %1 telah cacat. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - Baris penapis IP %1 telah cacat. Julat permulaan IP telah cacat. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - Baris penapis IP %1 telah cacat. Julat penamat IP telah cacat. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - Baris penapis IP %1 telah cacat. Satu IP ialah IPv4 manakala yang lain IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - Pengecualian penapis IP dibuang bagi baris %1. Pengecualian ialah: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - %1 ralat penghuraian penapis IP tambahan berlaku. + + + + I/O Error: Could not open ip filter file in read mode. + Ralat I/O: Tidak dapat buka fail penapis ip dalam mod baca. - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. Ralat Menghurai: Fail penapis bukan fail P2B PeerGuardian yang sah. @@ -1994,396 +1641,472 @@ GeoIPDatabase - - + + Unsupported database file size. Saiz fail pengkalan data tidak disokong. - + Metadata error: '%1' entry not found. Ralat data meta: masukan '%1' tidak ditemui. - + Metadata error: '%1' entry has invalid type. Ralat data meta: masukan '%1' mempunyai jenis yang tidak sah. - + Unsupported database version: %1.%2 Versi pangkalan data tidak disokong: %1.%2 - + Unsupported IP version: %1 Versi IP tidak disokong: %1 - + Unsupported record size: %1 Saiz rekod tidak disokong: %1 - + Invalid database type: %1 Jenis pengkalan data tidak sah: %1 - + Database corrupted: no data section found. Pangkalan data telah rosak: tiada seksyen data ditemui. - Http::Connection - - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - - + HttpServer - - Bad Http request, closing socket. IP: %s - + + File + Fail - - - HttpServer - Exit qBittorrent - Keluar qBittorrent + Edit + Sunting - + + Help + Bantuan + + + + Exit qBittorrent + Keluar qBittorrent + + + Only one link per line Hanya satu pautan per baris - + + Download + Muat Turun + + + Global upload rate limit must be greater than 0 or disabled. Had kadar muat naik sejagat mesti lebih besar dari 0 atau dilumpuhkan. - + Global download rate limit must be greater than 0 or disabled. Had kadar muat turun sejagat mesti lebih besar dari 0 atau dilumpuhkan. - + Alternative upload rate limit must be greater than 0 or disabled. Had kadar muat naik alternatif mesti lebih besar dari 0 atau dilumpuhkan. - + Alternative download rate limit must be greater than 0 or disabled. Had kadar muat turun alternatif mesti lebih besar dari 0 atau dilumpuhkan. - + Maximum active downloads must be greater than -1. Muat turun aktif maksimum mesti lebih besar dari -1. - + Maximum active uploads must be greater than -1. Muat naik aktif maksimum mesti lebih besar dari -1. - + Maximum active torrents must be greater than -1. Torrent aktif maksimum mesti lebih besar dari -1. - + Maximum number of connections limit must be greater than 0 or disabled. Bilangan had sambungan maksimum mesti lebih besar dari 0 atau dilumpuhkan. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Bilangan sambungan had per torrent maksimum mesti lebih besar dari 0 atau dilumpuhkan. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Bilangan slot muat naik per had torrent maksimum mesti lebih besar dari 0 atau dilumpuhkan. - + Unable to save program preferences, qBittorrent is probably unreachable. Tidak boleh simpan keutamaan program, qBittorrent berkemungkinan tidak boleh dicapai. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent di Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - Nama kategori tidak sah: -Jangan guna apa jua aksara khas dalam nama kategori. - - - - Unknown - Tidak diketahui - - - - Hard Disk - Cakera Keras - - - - Share ratio limit must be between 0 and 9998. - Had nisbah kongsi mesti diantara 0 hingga 9998. - - - - Seeding time limit must be between 0 and 525600 minutes. - Had masa penyemaian mesti diantara 0 hingga 525600 minit. + + Language + Bahasa - + The port used for incoming connections must be between 1 and 65535. Port yang digunakan untuk sambungan masuk mestilah diantara 1 hingga 65535. - + The port used for the Web UI must be between 1 and 65535. Port yang digunakan untuk UI Sesawang mestilah diantara 1 hingga 65535. - + Unable to log in, qBittorrent is probably unreachable. Tidak boleh daftar masuk, qBittorrent berkemungkinan tidak boleh dicapai. - + Invalid Username or Password. Nama Pengguna atau Kata Laluan tidak sah. - - Username - Nama pengguna - - - + Password Kata Laluan - + Login Daftar Masuk - + + Upload Failed! + Muat Naik Gagal! + + + Original authors Pengarang asal - + + Upload limit: + Had muat naik: + + + + Download limit: + Had muat turun: + + + Apply Laksana - + Add Tambah - + + Category: + Kategori: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Muat Naik Torrent - + + All + Semua + + + + Downloading + Memuat turun + + + + Seeding + Menyemai + + + + Completed + Selesai + + + + Resumed + Disambung semula + + + + Paused + Dijeda + + + + Active + Aktif + + + + Inactive + Tidak aktif + + + Save files to location: Simpan fail ke lokasi: - + Cookie: Kuki: - + Type folder here Taip folder di sini - + + Run an external program on torrent completion + Jalankan program luar bila torrent selesai + + + + Enable bandwidth management (uTP) + Benarkan pengurusan lebar jalur (uTP) + + + + Apply rate limit to uTP connections + Laksana had kadar pada sambungan uTP + + + + Alternative Global Rate Limits + Had Kadar Sejagat Alternatif + + + More information Lagi maklumat - + Information about certificates Maklumat berkenaan sijil - + Save Files to Simpan Fail ke - - Set location - Tetapkan lokasi - - - - Limit upload rate - Had kadar muat naik + + Watch Folder + Folder Pantau - - Limit download rate - Had kadar muat turun + + Default Folder + Folder Lalai - - Rename torrent - Nama semula torrent + + from + from time1 to time2 + daripada - - Unable to create category - + + to + from time1 to time2 + kepada - + Other... Save Files to: Watch Folder / Default Folder / Other... Lain-lain... - + + Every day + Schedule the use of alternative rate limits on ... + Setiap hari + + + + Week days + Schedule the use of alternative rate limits on ... + Hari biasa + + + + Week ends + Schedule the use of alternative rate limits on ... + Hujung minggu + + + Monday Schedule the use of alternative rate limits on ... Isnin - + Tuesday Schedule the use of alternative rate limits on ... Selasa - + Wednesday Schedule the use of alternative rate limits on ... Rabu - + Thursday Schedule the use of alternative rate limits on ... Khamis - + Friday Schedule the use of alternative rate limits on ... Jumaat - + Saturday Schedule the use of alternative rate limits on ... Sabtu - + Sunday Schedule the use of alternative rate limits on ... Ahad - + + Downloaded + Is the file downloaded or not? + Dimuat turun + + + Logout Daftar keluar - + + Download from URLs + Muat turun dari URL + + + Download Torrents from their URLs or Magnet links Muat turun Torrent dari URL atau pautan Magnet mereka - + Upload local torrent Muat naik torrent setempat - + Are you sure you want to delete the selected torrents from the transfer list? Anda pasti mahu memadam torrent terpilih dari senarai pemindahan? - + Save Simpan - + qBittorrent client is not reachable Klien qBittorrent tidak dapat dicapai - - qBittorrent has been shutdown. - qBittorrent telah dimatikan. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Senarai subnet IP tersenarai putih + + HTTP Server + Pelayan HTTP - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Contoh: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Parameter berikut disokong: - - Add subnet - Tambah subnet + + Torrent path + Laluan torrent - - Delete - Padam + + Torrent name + Nama torrent - - Error - Ralat + + qBittorrent has been shutdown. + qBittorrent telah dimatikan. + + + LineEdit - - The entered subnet is invalid. - Subnet yang dimasukkan tidak sah. + + Clear the text + Kosongkan teks LogListWidget - + Copy Salin - + Clear Kosongkan @@ -2416,550 +2139,492 @@ Jika Muat Turun &Selesai - + &View &Lihat - + &Options... &Pilihan... - + &Resume Sa&mbung Semula - + Torrent &Creator Pen&cipta Torrent - + Set Upload Limit... Tetapkan Had Muat Naik... - + Set Download Limit... Tetapkan Had Muat Turun... - + Set Global Download Limit... Tetapkan Had Muat Turun Sejagat... - + Set Global Upload Limit... Tetapkan Had Muat Naik Sejagat... - + Minimum Priority Keutamaan Minimum - + Top Priority Keutamaan Tertinggi - + Decrease Priority Rendahkan Keutamaan - + Increase Priority Tingkatkan Keutamaan - - + + Alternative Speed Limits Had Kelajuan Alternatif - + &Top Toolbar Palang Ala&t Atas - + Display Top Toolbar Papar Palang Alat Atas - - Status &Bar - &Palang Status - - - + S&peed in Title Bar Ke&lajuan dalam Palang Tajuk - + Show Transfer Speed in Title Bar Tunjuk Kelajuan Pemindahan dalam Palang Tajuk - + &RSS Reader Pembaca &RSS - + Search &Engine &Enjin Gelintar - + L&ock qBittorrent K&unci qBittorrent - + Do&nate! Be&ri &Derma! - - Close Window - Tutup Tetingkap - - - + R&esume All Samb&ung Semula Semua - + Manage Cookies... Urus Kuki... - + Manage stored network cookies Urus kuki rangkaian tersimpan - + Normal Messages Mesesj Biasa - + Information Messages Mesej Maklumat - + Warning Messages Mesej Amaran - + Critical Messages Mesej Kritikal - + &Log &Log - + &Exit qBittorrent &Keluar qBittorrent - + &Suspend System Tan&gguh Sistem - + &Hibernate System &Hibernasi Sistem - + S&hutdown System &Matikan Sistem - + &Disabled &Dilumpuhkan - + &Statistics &Statistik - + Check for Updates Semak Kemaskini - + Check for Program Updates Semak Kemaskini Program - + &About Perih&al - + &Pause &Jeda - + &Delete Pa&dam - + P&ause All J&eda Semua - + &Add Torrent File... T&ambah Fail Torrent... - + Open Buka - + E&xit Ke&luar - + Open URL Buka URL - + &Documentation &Dokumentasi - + Lock Kunci - - - + + + Show Tunjuk - + Check for program updates Semak kemaskini program - + Add Torrent &Link... Tambah Pa&utan Torrent... - + If you like qBittorrent, please donate! Jika anda menyukai qBittorrent, sila beri derma! - - + Execution Log Log Pelakuan - + Clear the password Kosongkan kata laluan - + Filter torrent list... Tapis senarai torrent... - + &Set Password &Tetapkan Kata Laluan - - Preferences - Keutamaan - - - + &Clear Password &Kosongkan Kata Laluan - + Transfers Pemindahan - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Perkaitan fail torrent - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent bukanlah aplikasi lalai untuk membuka fail torrent atau pautan Magnet. Anda mahu kaitkan qBittorrent dengan fail torrent dan pautan Magnet? - + Icons Only Ikon Sahaja - + Text Only Teks Sahaja - + Text Alongside Icons Teks Bersebelahan Ikon - + Text Under Icons Teks Di Bawah Ikon - + Follow System Style Ikut Gaya Sistem - - - + + + UI lock password Kata laluan kunci UI - - - + + + Please type the UI lock password: Sila taip kata laluan kunci UI: - + The password should contain at least 3 characters Kata laluan seharusnya mengandungi sekurang-kurangnya 3 aksara - + Password update Kemaskini kata laluan - + The UI lock password has been successfully updated Kata laluan kunci UI telah berjaya dikemakinikan - + Are you sure you want to clear the password? Anda pasti mahu kosongkan kata laluan? - - Use regular expressions - - - - + Search Gelintar - + Transfers (%1) Pemindahan (%1) - + Error Ralat - + Failed to add torrent: %1 Gagal menambah torrent: %1 - + Torrent added Torrent ditambah - + '%1' was added. e.g: xxx.avi was added. '%1' telah ditambah. - + Download completion Muat turun selesai - + I/O Error i.e: Input/Output Error Ralat I/O - + Recursive download confirmation Pengesahan muat turun rekursif - + Yes Ya - + No Tidak - + Never Tidak Sesekali - + Global Upload Speed Limit Had Kelajuan Muat Naik Sejagat - + Global Download Speed Limit Had Kelajuan Muat Turun Sejagat - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent baru sahaja dikemaskini dan perlu dimulakan semula supaya perubahan berkesan. - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - Beberapa fail sedang dipindahkan. - - - - Are you sure you want to quit qBittorrent? - Anda pasti mahu keluar dari qBittorrent? - - - + &No &Tidak - + &Yes &Ya - + &Always Yes &Sentiasa Ya - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter Pentafsir Python Lama - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. Versi Python (%1) anda telah lapuk. Sila tatar ke versi terkini supaya enjin gelintar berfungsi. Keperluan minimum: 2.7.9 / 3.3.0. - + qBittorrent Update Available Kemaskini qBittorrent Tersedia - - Already Using the Latest qBittorrent Version + + A new version is available. +Do you want to download %1? + Satu versi baharu telah tersedia. +Anda mahu muat turun %1? + + + + Already Using the Latest qBittorrent Version Sudah ada Versi qBittorrent Terkini - + Undetermined Python version Versi Python Tidak Dikenalpasti - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. '%1' telah selesai dimuat turun. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2968,158 +2633,154 @@ Sebab: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? Torrent '%1' mengandungi fail torrent, anda mahu teruskan dengan muat turun mereka? - + Couldn't download file at URL '%1', reason: %2. Tidak dapat muat turun fail pada URL '%1', sebab: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin Python ditemui dalam %1: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + Tidak dapat tentukan versi Python anda (%1). Enjin gelintar dilumpuhkan. + + + + Missing Python Interpreter Pentafsir Python Hilang - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Python diperlukan untuk guna enjin gelintar tetapi tidak kelihatan dipasang. Anda mahu pasangkannya sekarang? - + Python is required to use the search engine but it does not seem to be installed. Python diperlukan untuk guna enjin gelintar tetapi tidak kelihatan dipasang. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. Tiada kemaskinitersedia. Anda sudah ada versi yang terkini. - + &Check for Updates &Semak Kemaskini - + Checking for Updates... Menyemak Kemaskini... - + Already checking for program updates in the background Sudah memeriksa kemaskini program disebalik tabir - + Python found in '%1' Python ditemui dalam '%1' - + Download error Ralat muat turun - + Python setup could not be downloaded, reason: %1. Please install it manually. Persediaan Pythin tidak dapat dimuat turun, sebab: %1. Sila pasangkannya secara manual. - - + + Invalid password Kata laluan tidak sah - - - + + RSS (%1) RSS (%1) - + URL download error Ralat muat turun URL - + The password is invalid Kata laluan tidak sah - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Kelajuan MT: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Kelajuan MN: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [T: %1, N: %2] qBittorrent %3 - + Hide Sembunyi - + Exiting qBittorrent Keluar qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Beberapa fail sedang dipindahkan. +Anda pasti mahu keluar qBittorrent? + + + Open Torrent Files Buka Fail Torrent - + Torrent Files Fail Torrent - + Options were saved successfully. Pilihan berjaya disimpankan. @@ -3127,52 +2788,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. DNS dinamik anda berjaya dikemaskinikan. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Ralat DNS dinamik: Perkhidmatan tidak tersedia buat masa ini, ia akan dicuba kembali dalam tempoh 30 minit. - + Dynamic DNS error: hostname supplied does not exist under specified account. Ralat DNS dinamik: nama hos yang dibekal tidak wujud di bawah akaun yang dinyatakan. - + Dynamic DNS error: Invalid username/password. Ralat DNS dinamik: Nama pengguna / kata laluan tidak sah. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Ralat DNS dinamik: qBittorrent telah disenarai hitam oleh perkhidmatan, sila laporkan pepijat di http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Ralat DNS dinamik: %1 telah dikembalikan oleh perkhidmatan, sila laporkan pepijat di http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Ralat DNS dinamik: Nama pengguna anda telah disekat kerana penyalahgunaan. - + Dynamic DNS error: supplied domain name is invalid. Ralat DNS dinamik: nama domain yang dibekal tidak sah. - + Dynamic DNS error: supplied username is too short. Ralat DNS dinamik: nama pengguna yang dibekal terlalu pendek. - + Dynamic DNS error: supplied password is too short. Ralat DNS dinamik: kata laluan yang dibekal terlalu pendek. @@ -3180,1413 +2841,1303 @@ Net::DownloadHandler - + I/O Error Ralat I/O - + The file size is %1. It exceeds the download limit of %2. Saiz fail ialah %1. Ia melangkaui had muat turun %2. - + Unexpected redirect to magnet URI. Arah semula tidak dijangka ke URI magnet. - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. Pangkalan data GeoIP dimuatkan. Jenis: %1. Masa binaan: %2. - - + + Couldn't load GeoIP database. Reason: %1 Tidak dapat muat pangkalan data GeoIP. Sebab: %1 - + Venezuela, Bolivarian Republic of Republik Bolivia, Venezuela - + Viet Nam Vietnam - - + + N/A T/A - + Andorra Andorra - + United Arab Emirates Emiriah Arab Bersatu - + Afghanistan Afghanistan - + Antigua and Barbuda Antigua dan Barbuda - + Anguilla Anguilla - + Albania Albania - + Armenia Armenia - + Angola Angola - + Antarctica Antartika - + Argentina Argentina - + American Samoa Samoa Amerika - + Austria Austria - + Australia Australia - + Aruba Aruba - + Azerbaijan Azerbaijan - + Bosnia and Herzegovina Bosnia dan Herzegovina - + Barbados Barbados - + Bangladesh Bangladesh - + Belgium Belgium - + Burkina Faso Burkina Faso - + Bulgaria Bulgaria - + Bahrain Bahrain - + Burundi Burundi - + Benin Benin - + Bermuda Bermuda - + Brunei Darussalam Brunei Darussalam - + Brazil Brazil - + Bahamas Bahamas - + Bhutan Bhutan - + Bouvet Island Pulau Bouvet - + Botswana Botswana - + Belarus Belarus - + Belize Belize - + Canada Kanada - + Cocos (Keeling) Islands Kepulauan Cocos (Keeling) - + Congo, The Democratic Republic of the Republik Demokratik Kongo - + Central African Republic Republik Afrika Tengah - + Congo Kongo - + Switzerland Switzerland - + Cook Islands Kepulauan Cook - + Chile Chile - + Cameroon Cameroon - + China China - + Colombia Colombia - + Costa Rica Costa Rica - + Cuba Cuba - + Cape Verde Cape Verde - + Curacao Curacao - + Christmas Island Pulau Christmas - + Cyprus Cyprus - + Czech Republic Republik Czech - + Germany Jerman - + Djibouti Djibouti - + Denmark Denmark - + Dominica Dominica - + Dominican Republic Republik Dominican - + Algeria Algeria - + Ecuador Ecuador - + Estonia Estonia - + Egypt Mesir - + Western Sahara Sahara Barat - + Eritrea Eritrea - + Spain Sepanyol - + Ethiopia Ethiopia - + Finland Finland - + Fiji Fiji - + Falkland Islands (Malvinas) Kepulauan Falkland (Malvinas) - + Micronesia, Federated States of Negeri Persekutuan Micronesia - + Faroe Islands Kepulauan Faroe - + France Perancis - + Gabon Gabon - + United Kingdom United Kingdom - + Grenada Grenada - + Georgia Georgia - + French Guiana Guiana Perancis - + Ghana Ghana - + Gibraltar Gibraltar - + Greenland Greenland - + Gambia Gambia - + Guinea Guinea - + Guadeloupe Guadeloupe - + Equatorial Guinea Guinea Khatulistiwa - + Greece Yunani - + South Georgia and the South Sandwich Islands Kepulauan Georgia Selatan dan Sandwich Selatan - + Guatemala Guatemala - + Guam Guam - + Guinea-Bissau Guinea-Bissau - + Guyana Guyana - + Hong Kong Hong Kong - + Heard Island and McDonald Islands Pulau Heard dan Kepulauan McDonald - + Honduras Honduras - + Croatia Croatia - + Haiti Haiti - + Hungary Hungary - + Indonesia Indonesia - + Ireland Ireland - + Israel Israel - + India India - + British Indian Ocean Territory Wilayah Lautan India British - + Iraq Iraq - + Iran, Islamic Republic of Republik Islam Iran - + Iceland Iceland - + Italy Itali - + Jamaica Jamaica - + Jordan Jordan - + Japan Jepun - + Kenya Kenya - + Kyrgyzstan Kyrgyzstan - + Cambodia Kampuchea - + Kiribati Kiribati - + Comoros Comoros - + Saint Kitts and Nevis Saint Kitts dan Nevis - + Korea, Democratic People's Republic of Republik Demokratik Korea - + Korea, Republic of Republik Korea - + Kuwait Kuwait - + Cayman Islands Kepulauan Cayman - + Kazakhstan Kazakhstan - + Lao People's Democratic Republic Republik Demokratik Rakyat Lao - + Lebanon Lubnan - + Saint Lucia Saint Lucia - + Liechtenstein Liechtenstein - + Sri Lanka Sri Lanka - + Liberia Liberia - + Lesotho Lesotho - + Lithuania Lithuania - + Luxembourg Luxembourg - + Latvia Latvia - + Morocco Maghribi - + Monaco Monaco - + Moldova, Republic of Republik Moldova - + Madagascar Madagascar - + Marshall Islands Kepulauan Marshall - + Mali Mali - + Myanmar Myanmar - + Mongolia Mongolia - + Northern Mariana Islands Kepulauan Mariana Utara - + Martinique Martinique - + Mauritania Mauritania - + Montserrat Montserrat - + Malta Malta - + Mauritius Mauritius - + Maldives Maldives - + Malawi Malawi - + Mexico Mexico - + Malaysia Malaysia - + Mozambique Mozambique - + Namibia Namibia - + New Caledonia New Caledonia - + Niger Niger - + Norfolk Island Pulau Norfolk - + Nigeria Nigeria - + Nicaragua Nicaragua - + Netherlands Belanda - + Norway Norway - + Nepal Nepal - + Nauru Nauru - + Niue Niue - + New Zealand New Zealand - + Oman Oman - + Panama Panama - + Peru Peru - + French Polynesia Polynesia Perancis - + Papua New Guinea Papua New Guinea - + Philippines Filipina - + Pakistan Pakistan - + Poland Poland - + Saint Pierre and Miquelon Saint Pierre dan Miquelon - + Puerto Rico Puerto Rico - + Portugal Portugal - + Palau Palau - + Paraguay Paraguay - + Qatar Qatar - + Reunion Reunion - + Romania Romania - + Russian Federation Persekutuan Rusia - + Rwanda Rwanda - + Saudi Arabia Arab Saudi - + Solomon Islands Kepulauan Solomon - + Seychelles Seychelles - + Sudan Sudan - + Sweden Sweden - + Singapore Singapura - + Slovenia Slovenia - + Svalbard and Jan Mayen Svalbard dan Jan Mayen - + Slovakia Slovakia - + Sierra Leone Sierra Leone - + San Marino San Marino - + Senegal Senegal - + Somalia Somalia - + Suriname Suriname - + Sao Tome and Principe Sao Tome dan Principe - + El Salvador El Salvador - + Syrian Arab Republic Republik Arab Syria - + Swaziland Swaziland - + Turks and Caicos Islands Kepulauan Turk dan Caicos - + Chad Chad - + French Southern Territories Wilayah Selatah Perancis - + Togo Togo - + Thailand Siam - + Tajikistan Tajikistan - + Tokelau Tokelau - + Turkmenistan Turkmenistan - + Tunisia Tunisia - + Tonga Tonga - - Could not decompress GeoIP database file. - Tidak dapat menyahmampat fail pangkalan data GeoIP. - - - + Timor-Leste Timor-Leste - + Bolivia, Plurinational State of Bolivia - + Bonaire, Sint Eustatius and Saba Bonaire, Sint Eustatius dan Saba - + Cote d'Ivoire Cote d'Ivoire - + Libya Libya - + Saint Martin (French part) Saint Martin (Bahagian Perancis) - + Macedonia, The Former Yugoslav Republic of Macedonia - + Macao Macao - + Pitcairn Pitcairn - + Palestine, State of Palestin - + Saint Helena, Ascension and Tristan da Cunha Saint Helena, Ascension dan Tristan da Cunha - + South Sudan Sudan Selatan - + Sint Maarten (Dutch part) Sint Maarten (Bahagian Belanda) - + Turkey Turki - + Trinidad and Tobago Trinidad dan Tobago - + Tuvalu Tuvalu - + Taiwan Taiwan - + Tanzania, United Republic of Republik Bersatu Tanzania - + Ukraine Ukraine - + Uganda Uganda - + United States Minor Outlying Islands Kepulauan Luar Minor Amerika Syarikat - + United States Amerika Syarikat - + Uruguay Uruguay - + Uzbekistan Uzbekistan - + Holy See (Vatican City State) Holy See (Negara Bandar Vatican) - + Saint Vincent and the Grenadines Saint Vincent dan Grenadines - + Virgin Islands, British Kepulauan Virgin, British - + Virgin Islands, U.S. Kepulauan Virgin, U.S. - + Vanuatu Vanuatu - + Wallis and Futuna Wallis dan Futuna - + Samoa Samoa - + Yemen Yaman - + Mayotte Mayotte - + Serbia Serbia - + South Africa Afrika Selatan - + Zambia Zambia - + Montenegro Montenegro - + Zimbabwe Zimbabwe - + Aland Islands Kepulauan Aland - + Guernsey Guernsey - + Isle of Man Isle of Man - + Jersey Jersey - + Saint Barthelemy Saint Barthelemy - + + Could not uncompress GeoIP database file. + Tidak dapat menyahmampat fail pangkalan data GeoIP. + + + Couldn't save downloaded GeoIP database file. Tidak dapat simpan fail pangkalan data GeoIP dimuat turun. - + Successfully updated GeoIP database. Berjaya mengemaskini pangkalan data GeoIP. - + Couldn't download GeoIP database file. Reason: %1 Tidak dapat muat turun fail pangkalan data GeoIP. Sebab: %1 @@ -4594,12 +4145,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] Sokongan UPnP / NAT-PMP [HIDUP] - + UPnP / NAT-PMP support [OFF] Sokongan UPnP / NAT-PMP [MATI] @@ -4607,7 +4158,7 @@ Net::Smtp - + Email Notification Error: Ralat Pemberitahuan Emel: @@ -4615,1279 +4166,1077 @@ OptionsDialog - + Options Pilihan - + Behavior Kelakuan - + Downloads Muat Turun - + Connection Sambungan - + Speed Kelajuan - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI UI Sesawang - + Advanced Lanjutan - + Language Bahasa - + User Interface Language: Bahasa Antaramuka Pengguna: - + (Requires restart) (Perlu mula semula) - + Transfer List Senarai Pemindahan) - + Confirm when deleting torrents Sahkan bila memadam torrent - + Use alternating row colors In transfer list, one every two rows will have grey background. Guna warna baris alternatif - + Hide zero and infinity values Sembunyi nilai sifar dan tak terhingga - + Always Sentiasa - + Paused torrents only Torrent dijeda sahaja - + Action on double-click Tindakan bila dwi-klik - + Downloading torrents: Torrent dimuat turun: - - + + Start / Stop Torrent Mula / Henti Torrent - - + + Open destination folder Buka folder destinasi - - + + No action Tiada tindakan - + Completed torrents: Torrent selesai: - + Desktop Desktop - + Start qBittorrent on Windows start up Mulakan qBittorrent ketika permulaan Windows - + Show splash screen on start up Tunjuk skrin percikan ketika permulaan - + Start qBittorrent minimized Mulakan qBittorrent diminimumkan - + Confirmation on exit when torrents are active Pengesahan ketika keluar jika torrent masih aktif - + Confirmation on auto-exit when downloads finish Pengesahan ketika auto-keluar bila muat turun selesai - - KiB - KiB - - - - Email notification &upon download completion - Pemberitahuan emel se&usai muat turun lengkap - - - - Run e&xternal program on torrent completion - &Jalankan program luar bila torrent selesai - - - - IP Fi&ltering - Penap&isan IP + + Show qBittorrent in notification area + Tunjuk qBittorrent dalam ruang pemberitahuan - - Schedule &the use of alternative rate limits - Jadualkan penggunaan &had kadar alternatif - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - - - - &Torrent Queueing - Pembarisan Gilir &Torrent - - - - Seed torrents until their seeding time reaches - Semai torrent sehingga nisbah mereka tercapai - - - - A&utomatically add these trackers to new downloads: - Tambah penjejak ini secara automatik ke muat turun baharu: - - - - RSS Reader - Pembaca RSS - - - - Enable fetching RSS feeds - Benarkan mendapatkan suapan RSS - - - - Feeds refresh interval: - Sela segar semula suapan: - - - - Maximum number of articles per feed: - Bilangan maksimum artikel per suapan: - - - - - min - minutes - min - - - - RSS Torrent Auto Downloader - Auto Pemuat Turun Torrent RSS - - - - Enable auto downloading of RSS torrents - Benarkan auto muat turun torrent RSS - - - - Edit auto downloading rules... - Sunting peraturan auto muat turun... - - - - Web User Interface (Remote control) - Antaramuka Pengguna Sesawang (Kawalan jauh) - - - - IP address: - Alamat IP: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - Alamat IP yang mana UI Sesawang akan diikatkan. -Nyatakan satu alamat IPv4 atau IPv6. Anda boleh nyatakan "0.0.0.0" untuk mana-mana alamat IPv4, -"::" untuk mana-mana alamat IPv6, atau "*" untuk kedua-dua IPv4 dan IPv6. - - - - Server domains: - Domain pelayan: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - Senarai putih untuk menapis nilai pengepala Hos HTTP. -Untuk menampan serangan pengikatan semula DNS, -anda patut letak nama domain yang digunakan oleh pelayan WebUI. - -Guna ';' untuk asingkan masukan berbilang. Boleh guna kad liar '*'. - - - - &Use HTTPS instead of HTTP - G&una HTTPS selain dari HTTP - - - - Bypass authentication for clients on localhost - Lepasi pengesahihan untuk klien pada localhost - - - - Bypass authentication for clients in whitelisted IP subnets - Lepasi pengesahihan untuk klien dalam subnet IP tersenarai putih - - - - IP subnet whitelist... - Senarai putih subnet IP... - - - - Upda&te my dynamic domain name - Ke&maskini nama domain dinamik saya - - - + Minimize qBittorrent to notification area Minimumkan qBittorrent ke ruang pemberitahuan - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. Tutup qBittorrent ke ruang pemberitahuan - + Tray icon style: Gaya ikon talam: - + Normal Biasa - + Monochrome (Dark theme) Monokrom (Tema gelap) - + Monochrome (Light theme) Monokrom (Tema cerah) - + File association Perkaitan fail - + Use qBittorrent for .torrent files Guna qBittorrent untuk fail .torrent - + Use qBittorrent for magnet links Guna qBittorrent untuk pautan magnet - + Power Management Pengurusan Kuasa - + + Inhibit system sleep when torrents are active + Sekat tidur sistem bila torrent masih aktif + + + + Log file + Fail log + + + Save path: Laluan simpan: - + Backup the log file after: Sandar fail log selepas: - + + MB + MB + + + Delete backup logs older than: Padam log sandar lebih tua dari: - + days Delete backup logs older than 10 months hari - + months Delete backup logs older than 10 months bulan - + years Delete backup logs older than 10 years tahun - + When adding a torrent Bila menambah sebuah torrent - + + Display torrent content and some options + Papar kandungan torrent dan beberapa pilihan + + + Bring torrent dialog to the front Bawa dialog torrent ke hadapan - + Do not start the download automatically The torrent will be added to download list in pause state Jangan mulakan muat turun secara automatik - + Should the .torrent file be deleted after adding it Patutkah fail .torrent dipadamkan selepas menambahnya - + + Delete .torrent files afterwards + Padam fail .torrent selepas itu + + + Also delete .torrent files whose addition was cancelled Juga pada fail .torrent yang mana penambahannya telah dibatalkan - + Also when addition is cancelled Juga bila penambahan dibatalkan - + Warning! Data loss possible! Amaran! Kehilangan data mungkin berlaku! - + Saving Management Pengurusan Penyimpanan - + Default Torrent Management Mode: Mod Pengurusan Torrent Lalai: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category Mod automatik bermaksud pelbagai sifat torrent (seperti laluan simpan) akan ditentukan oleh kategori berkaitan - + Manual Manual - + Automatic Automatik - + When Torrent Category changed: Bila Kategori Torrent berubah: - + Relocate torrent Tempat semula torrent - + Switch torrent to Manual Mode Tular torrent ke Mod Manual - + When Default Save Path changed: Bila Laluan Simpan Lalai berubah: - - + + Relocate affected torrents Tempat semula torrent yang dipengaruhi - - + + Switch affected torrents to Manual Mode Tukar torrent yang dipengaruhi ke Mod Manual - + When Category changed: Bila Kategori berubah: - + Use Subcategories Guna Subkategori - + Default Save Path: Laluan Simpan Lalai: - + Keep incomplete torrents in: Kekalkan torrent tidak selesai dalam: - + Copy .torrent files to: Salin fail .torrent ke: - - Show &qBittorrent in notification area - Tunjuk &qBittorrent dalam ruang pemberitahuan - - - - &Log file - Fail &log: - - - - Display &torrent content and some options - Papar kandungan &torrent dan beberapa pilihan - - - - Create subfolder for torrents with multiple files - Cipta subfolder untuk torrent dengan fail berbilang - - - - De&lete .torrent files afterwards - Pa&dam fail .torrent selepas itu - - - + Copy .torrent files for finished downloads to: Salin fail .torrent bagi muat turun yang selesai ke: - + Pre-allocate disk space for all files Pra-peruntuk ruang cakera untuk semua fail - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding - - - - + Append .!qB extension to incomplete files Tambah sambungan .!qB pada fail tidak lengkap - - Enable recursive download dialog - - - - + Automatically add torrents from: Tambah torrent secara automatik dari: - + Add entry Tambah masukan - + Remove entry Buang masukan - + + Email notification upon download completion + Pemberitahuan emel seusai muat turun lengkap + + + + Destination email: + Emel destinasi: + + + SMTP server: Pelayan SMTP: - + This server requires a secure connection (SSL) Pelayan ini memerlukan satu sambungan selamat (SSL) - - + + + Authentication Pengesahihan - - - - + + + + Username: Nama pengguna: - - - - + + + + Password: Kata laluan: - - Enabled protocol: - Protokol dibenarkan: + + Run external program on torrent completion + Jalankan program luar bila torrent selesai - - TCP and μTP - TCP dan μTP - - - + Listening Port Port Dengar - + Port used for incoming connections: Port yang digunakan untuk sambungan masuk: - + Random Rawak - + Use UPnP / NAT-PMP port forwarding from my router Guna pemajuan port UPnP / NAT-PMP daripada penghala saya - + Use different port on each startup Guna port berlainan bagi setiap permulaan - + Connections Limits Had Sambungan - + Maximum number of connections per torrent: Bilangan sambungan per torrent maksimum: - + Global maximum number of connections: Bilangan sambungan maksimum sejagat: - + Maximum number of upload slots per torrent: Bilangan slot muat naik per torrent maksimum: - + Global maximum number of upload slots: Bilangan maksimum sejagat bagi slot muat naik: - + Proxy Server Pelayan Proksi - + Type: Jenis: - + (None) (Tiada) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Hos: - - + + Port: Port: - + Otherwise, the proxy server is only used for tracker connections Jika tidak, pelayan proksi hanya digunakan untuk sambungan penjejak - + Use proxy for peer connections Guna proksi untuk sambungan rakan - + Disable connections not supported by proxies Lumpuhkan sambungan yang tidak disokong oleh proksi - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection Suapan RSS, enjin gelintar, kemaskini perisian atau apa jua selain dari pemindahan torrent dan operasi berkaitan (seperti pertukaran rakan) akan menggunakan sambungan terus - + Use proxy only for torrents Guna proksi hanya untuk torrent - - A&uthentication - Pen&gesahihan - - - + Info: The password is saved unencrypted Maklumat: Kata laluan disimpan secara tak sulit - + + IP Filtering + Penapisan IP + + + Filter path (.dat, .p2p, .p2b): Tapis laluan (.dat, .p2p, .p2b): - + Reload the filter Muat semula penapis - - Manually banned IP addresses... - Alamat IP dilarang secara manual... - - - + Apply to trackers Laksana kepada penjejak - + Global Rate Limits Had Kadar Sejagat - - - - - - - KiB/s - - - - - + + Upload: Muat naik: - - + + + + + KiB/s + KiB/s + + + + Download: Muat Turun: - + Alternative Rate Limits Had Kadar Alternatif - - + + Schedule the use of alternative rate limits + Jadualkan penggunaan had kadar alternatif + + + From: from (time1 to time2) Daripada: - - + To: time1 to time2 Kepada: - + When: Bila: - + Every day Setiap hari - + Weekdays Hari biasa - + Weekends Hujung minggu - + Rate Limits Settings Tetapan Had Kadar - + Apply rate limit to peers on LAN Laksana had kadar kepada rakan dalam LAN - + Apply rate limit to transport overhead Laksana had kadar untuk overhed angkutan - - + + + Enable µTP protocol + Benarkan protokol µTP + + + Apply rate limit to µTP protocol Laksana had kadar ke protokol µTP - + Privacy Kerahsiaan - + Enable DHT (decentralized network) to find more peers Benarkan DHT (rangkaian tak sepusat) untuk dapatkan lagi rakan - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Tukar rakan dengan klien Bittorrent yang serasi (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers Benarkan Pertukaran Rakan (PeX) untuk dapatkan lagi rakan - + Look for peers on your local network Cari rakan dalam rangkaian setempat anda - + Enable Local Peer Discovery to find more peers Benarkan Penemuan Rakan Setempat untuk cari lagi rakan - + Encryption mode: Mod penyulitan: - + Prefer encryption Utamakan penyulitan - + Require encryption Perlu penyulitan - + Disable encryption Lumpuhkan penyulitan - + Enable when using a proxy or a VPN connection Benarkan bila menggunakan proksi atau sambungan VPN - + Enable anonymous mode Benarkan mod awanama - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Lagi maklumat</a>) + + + + Torrent Queueing + Pembarisan Gilir Torrent + + + Maximum active downloads: Muat turun aktif maksimum: - + Maximum active uploads: Muat naik aktif maksimum: - + Maximum active torrents: Torrent aktif maksimum: - + Do not count slow torrents in these limits Jangan kira torrent lembab dalam had ini - - Upload rate threshold: - - - - - Download rate threshold: - - - - - sec - seconds - - - - - Torrent inactivity timer: - - - - + Share Ratio Limiting Pembatasan Nisbah Kongsi - + Seed torrents until their ratio reaches Semai torrent sehingga nisbah mereka tercapai - + then maka - + Pause them Jedakannya - + Remove them Buangkannya - - RSS Smart Episode Filters - + + Automatically add these trackers to new downloads: + Tambah penjejak ini secara automatik ke muat turun baharu: + + + + Enable Web User Interface (Remote control) + Benarkan Antaramuka Pengguna Sesawang (Kawalan jauh) - + Use UPnP / NAT-PMP to forward the port from my router Guna UPnP / NAT-PMP untuk majukan port daripada penghala saya - + + Use HTTPS instead of HTTP + Guna HTTPS selain dari HTTP + + + Certificate: Sijil: - + Import SSL Certificate Import Sijil SSL - + Key: Kunci: - + Import SSL Key Import Kunci SSL - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Maklumat berkenaan sijil</a> - - Use alternative Web UI - - - - - Files location: - - - - - Enable clickjacking protection - + + Bypass authentication for localhost + Lepasi pengesahihan untuk localhost - - Enable Cross-Site Request Forgery (CSRF) protection - + + Update my dynamic domain name + Kemaskini nama domain dinamik saya - + Service: Perkhidmatan: - + Register Daftar - + Domain name: Nama domain: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! Dengan membenarkan pilihan ini, anda boleh <strong>kehilangan terus</strong> fail .torrent anda! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well Bila pilihan ini dibenarkan, qBittorent akan <strong>memadam</strong> fail .torrent sebaik sahaja ia berjaya (pilihan pertama) atau tidak (pilihan kedua) ditambah ke baris gilir muat turunya. Tindakan ini akan dilaksanakan <strong>bukan hanya</strong> pada fail yang dibuka melalui tindakan menu &ldquo;Tambah torrent&rdquo; tetapi juga pada yang dibuka melalui <strong>perkaitan jenis fail</strong> jua - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog Jika anda benarkan pilihan kedua (&ldquo;Juga bila penambahan dibatalkan&rdquo;) fail .torrent <strong>akan dipadamkan</strong> walaupun jika anda menekan &ldquo;<strong>Batal</strong>&rdquo; di dalam dialog &ldquo;Tambah torrent&rdquo; - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): Parameter disokong (peka kata): - + %N: Torrent name %N: Nama torrent - + %L: Category %L: Kategori - - %G: Tags (seperated by comma) - - - - + %F: Content path (same as root path for multifile torrent) %F: Laluan kandungan (sama dengan laluan root untuk torrent berbilang-fail) - + %R: Root path (first torrent subdirectory path) %R: Laluan root (laluan subdirektori torrent pertama) - + %D: Save path %D: Laluan simpan - + %C: Number of files %C: Bilangan fail - + %Z: Torrent size (bytes) %Z: Saiz torrent (bait) - + %T: Current tracker %T: Penjejak semasa - + %I: Info hash %I: Cincangan maklumat - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") Petua: Parameter dalam kurungan dengan tanda petikan untuk menghindari teks dipotong pada ruang putih (contohnya., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor Pilih folder untuk dipantau - + Folder is already being monitored: Folder sudah dipantau: - + Folder does not exist: Folder tidak wujud: - + Folder is not readable: Folder tidak boleh dibaca: - + Adding entry failed Penambahan masukan gagal - - - - + + Choose export directory Pilih direktori eksport - - - + + + + + + Choose a save directory Pilih satu direktori simpan - + Choose an IP filter file Pilih satu fail penapis IP - + All supported filters Semua penapis disokong - + SSL Certificate Sijil SSL - + + SSL Key + Kunci SSL + + + Parsing error Ralat penghuraian - + Failed to parse the provided IP filter Gagal menghurai penapis IP yang disediakan - + Successfully refreshed Berjaya disegar semulakan - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Berjaya menghurai penapis IP yang disediakan: %1 peraturan telah dilaksanakan. - + Invalid key Kunci tidak sah - + This is not a valid SSL key. Ini bukanlah kunci SSL yang sah. - + Invalid certificate Sijil tidak sah - - Preferences - Keutamaan - - - - Import SSL certificate - Import sijil SSL - - - + This is not a valid SSL certificate. Ini bukanlah sijil SSL yang sah. - - Import SSL key - Import kunci SSL - - - - SSL key - Kunci SSL - - - + Time Error Ralat Masa - + The start time and the end time can't be the same. Masa mula dan masa tamat tidak boleh serupa. - - + + Length Error Ralat Panjang - + The Web UI username must be at least 3 characters long. Nama pengguna UI Sesawang mestilah sekurang-kurangnya 3 aksara panjangnya. - + The Web UI password must be at least 6 characters long. Kata laluan UI Sesawang mestilah sekurang-kurangnya 6 aksara panjangnya. @@ -5895,72 +5244,72 @@ PeerInfo - - Interested(local) and Choked(peer) - Berminat(setempat) dan Dicekik(rakan) + + interested(local) and choked(peer) + berminat(setempat) dan dicekik(rakan) - + interested(local) and unchoked(peer) berminat(setempat) dan tidak dicekik(rakan) - + interested(peer) and choked(local) berminat(rakan) dan dicekik(setempat) - + interested(peer) and unchoked(local) berminat(rakan) dan tidak dicekik(setempat) - + optimistic unchoke tidak dicekik optimistik - + peer snubbed rakan tidak dipedulikan - + incoming connection sambungan masuk - + not interested(local) and unchoked(peer) tidak berminat(setempat) dan tidak dicekik(rakan) - + not interested(peer) and unchoked(local) tidak berminat(rakan) dan tidak dicekik(setempat) - + peer from PEX rakan daripada PEX - + peer from DHT rakan daripada DHT - + encrypted traffic trafik tersulit - + encrypted handshake jabat tangan tersulit - + peer from LSD rakan daripada LSD @@ -5968,193 +5317,178 @@ PeerListWidget - + IP IP - + Port Port - + Flags Bendera - + Connection Sambungan - + Client i.e.: Client application Klien - + Progress i.e: % downloaded Kemajuan - + Down Speed i.e: Download speed Kelajuan Turun - + Up Speed i.e: Upload speed Kelajuan Naik - + Downloaded i.e: total data downloaded Dimuat Turun - + Uploaded i.e: total data uploaded Dimuat Naik - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Berkaitan - + Files i.e. files that are being downloaded right now Fail - + Column visibility Ketampakan lajur - + Add a new peer... Tambah satu rakan baharu... - - + + Ban peer permanently Sekat rakan selamanya - + Manually adding peer '%1'... Menambah rakan '%1' secara manual... - + The peer '%1' could not be added to this torrent. Rakan '%1' tidak dapat ditambah ke torrent ini. - + Manually banning peer '%1'... Menyekat rakan '%1' secara manual... - - + + Peer addition Penambahan rakan - + Country Negara - + Copy IP:port Salin IP:port - + Some peers could not be added. Check the Log for details. Sesetengah rakan tidak dapat ditambah. Periksa Log untuk perincian. - + The peers were added to this torrent. Rakan yang ditambah ke torrent ini. - + Are you sure you want to ban permanently the selected peers? Anda pasti mahu menyekat rakan terpilih secara kekal? - + &Yes &Ya - + &No &Tidak - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - + PeersAdditionDlg - + No peer entered - + Tiada rakan dimasukkan - + Please type at least one peer. - + Sila taip sekurang-kurangnya seorang rakan. - + Invalid peer - + Rakan tidak sah - + The peer '%1' is invalid. - + Rakan '%1' tidak sah. PieceAvailabilityBar - + White: Unavailable pieces Putih: Cebisan tidak tersedia - + Blue: Available pieces Biru: Cebisan tersedia @@ -6162,336 +5496,293 @@ PiecesBar - + Files in this piece: Fail dalam cebisan ini: - + File in this piece Fail dalam cebisan ini - + File in these pieces Fail dalam cebisan ini - - Wait until metadata become available to see detailed information - Tunggu sehingga data meta telah tersedia untuk melihat maklumat terperincinya - - - + Hold Shift key for detailed information Tahan kekunci Shift untuk maklumat lanjut - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Pemalam gelintar - + Installed search plugins: - + Pemalam gelintar terpasang: - + Name - Nama + Nama - + Version - + Versi - + Url - + Url - - + + Enabled - - - - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - + Dibenarkan - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Anda boleh dapatkan pemalam enjin gelintar baharu di sini: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Pasang satu yang baharu - + Check for updates - + Periksa kemaskini - + Close - + Tutup - + Uninstall - + Nyahpasang - - - + + + Yes - Ya + Ya - - - - + + + + No - Tidak + Tidak - + Uninstall warning - + Amaran nyahpasang - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Sesetengah pemalam tidak dipasang kerana ia sudah disertakan dalam qBittorrent. Hanya yang anda tambah sendiri boleh dinyahpasangkan. +Pemalam tersebut telah dilumpuhkan. - + Uninstall success - + Nyahpasang berjaya - + All selected plugins were uninstalled successfully - - - - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - + Semua pemalam terpilih telah berjaya dinyahpasangkan - - + + New search engine plugin URL - + URL pemalam enjin gelintar baharu - - + + URL: - + URL: - + Invalid link - + Pautan tidak sah - + The link doesn't seem to point to a search engine plugin. - + Pautan tidak kelihatan menuju ke pemalam enjin gelintar. - + Select search plugins - + Pilih pemalam gelintar - + qBittorrent search plugin - + Pemalam gelintar qBittorrent - + + + + Search plugin update + Kemaskini pemalam gelintar + + + All your plugins are already up to date. - + Semua pemalam anda sudah dikemaskinikan - + Sorry, couldn't check for plugin updates. %1 - + Maaf, tidak dapat periksa kemaskini pemalam. %1 - + + + Search plugin install - + Pasang pemalam gelintar + + + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + Pemalam gelintar "%1" berjaya dipasangkan. - + Couldn't install "%1" search engine plugin. %2 - + Tidak dapat pasang pemalam enjin gelintar "%1". %2 + + + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + Pemalam enjin gelintar "%1" telah berjaya dikemaskinikan. - + Couldn't update "%1" search engine plugin. %2 - + Tidak dapat kemaskini pemalam enjin gelintar "%1". %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Sumber pemalam - + Search plugin source: - + Sumber pemalam gelintar: - + Local file - + Fail setempat - + Web link - + Pautan Sesawang - PowerManagement + PreviewSelect - - qBittorrent is active - - - - - PreviewSelectDialog - - - Preview - Pratonton - - - + Name Nama - + Size Saiz - + Progress Kemajuan - - + + Preview impossible Pratonton adalah mustahil - - + + Sorry, we can't preview this file Maaf, kami tidak dapat pratonton fail ini - Private::FileLineEdit - - - '%1' does not exist - '%1' tidak wujud. - - - - '%1' does not point to a directory - '%1' tidak menuju ke direktori - - - - '%1' does not point to a file - '%1' tidak menuju ke fail - - - - Does not have read permission in '%1' - Tidak mempunyai keizinan baca dalam '%1' - - - - Does not have write permission in '%1' - Tidak mempunyai keizinan tulis dalam '%1' - - - PropListDelegate - + Not downloaded Tidak dimuat turun - - + + Normal Normal (priority) Biasa - - N/A - T/A - - - + Do not download Do not download (priority) - Jangan muat turun + Jangan muat turun - - + + High High (priority) Tinggi - + N/A + T/A + + + Mixed Mixed (priorities Bercampur - - + + Maximum Maximum (priority) Maksimum @@ -6500,32 +5791,32 @@ PropTabBar - + General Am - + Trackers Penjejak - + Peers Rakan - + HTTP Sources Sumber HTTP - + Content Kandungan - + Speed Kelajuan @@ -6619,22 +5910,22 @@ Ulasan: - + Select All Pilih Semua - + Select None Pilih Tiada - + Normal Biasa - + High Tinggi @@ -6694,165 +5985,165 @@ Laluan Simpan: - + Maximum Maksimum + - Do not download Jangan muat turun - + Never Tidak sesekali - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (mempunyai %3) - - + + %1 (%2 this session) %1 (%2 sesi ini) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (disemai untuk %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 maks) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 jumlah) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 pur.) - + Open Buka - + Open Containing Folder Buka Folder Dikandungi - + Rename... Nama Semula... - + Priority Keutamaan - + New Web seed Semai Sesawang Baharu - + Remove Web seed Buang semaian Sesawang - + Copy Web seed URL Salin URL semai Sesawang - + Edit Web seed URL Sunting URL semai Sesawang - + + Rename the file + Namakan semula fail + + + New name: Nama baharu: - - + + + The file could not be renamed + Fail tidak dapat dinamakan semula + + + + This file name contains forbidden characters, please choose a different one. + Nama fail ini mengandungi aksara terlarang, sila pilih yang lain. + + + + This name is already in use in this folder. Please use a different name. Nama ini sudah digunakan dalam folder ini. Sila gunakan nama lain. - + The folder could not be renamed Folder tidak dapat dinamakan semula - + qBittorrent qBittorrent - + Filter files... Tapis fail... - - Renaming - Penamaan semula - - - - - Rename error - Ralat nama semula - - - - The name is empty or contains forbidden characters, please choose a different one. - Nama fail kosong atau mengandungi aksara terlarang, sila pilih yang lain. - - - + New URL seed New HTTP source Semai URL baharu - + New URL seed: Semai URL baharu: - - + + This URL seed is already in the list. Semaian URL ini sudah ada dalam senarai. - + Web seed editing Penyuntingan semaian Sesawang - + Web seed URL: URL semaian Sesawang: @@ -6860,230 +6151,117 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + Alamat IP anda telah disekat selepas terlalu banyak percubaan pengesahihan yang gagal. + + + + Error: '%1' is not a valid torrent file. + + Ralat: '%1' bukanlah fail torrent yang sah. + + + + + Error: Could not add torrent to session. + Ralat: Tidak dapat tambah torrent ke sesi. + + + + I/O Error: Could not create temporary file. + Ralat I/O: Tidak dapat cipta fail sementara. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 bukanlah parameter baris perintah yang tidak diketahui. - - + + %1 must be the single command line parameter. %1 mestilah parameter baris perintah tunggal. - + + %1 must specify the correct port (1 to 65535). + %1 mestilah nyatakan port yang betul (1 hingga 65535). + + + You cannot use %1: qBittorrent is already running for this user. Anda tidak boleh guna %1: qBittorrent sudah dijalankan untuk pengguna ini. - + Usage: Penggunaan: - + Options: Pilihan: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - Parameter '%1' mesti ikuti sintak '%1=%2' - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - Parameter '%1' mesti ikuti sintak '%1=%2' - - - - Expected integer number in environment variable '%1', but got '%2' - Dijangka nombor integer dalam pembolehubah persekitaran '%1', tetapi dapat '%2' - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - Parameter '%1' mesti ikuti sintak '%1=%2' - - - - Expected %1 in environment variable '%2', but got '%3' - Dijangka %1 dalam pembolehubah persekitaran '%2', tetapi dapat '%3' - - - - port - port - - - - %1 must specify a valid port (1 to 65535). - %1 mestilah nyatakan port yang sah (1 hingga 65535). - - - - Display program version and exit - Papar versi program kemudian keluar + + Displays program version + Papar versi program - - Display this help message and exit - Papar mesej bantuan ini kemudian keluar + + Displays this help message + Papar mesej bantuan ini - - Change the Web UI port - Ubah port UI Sesawang + + Changes the Web UI port (current: %1) + Perubahan port UI Sesawang (semasa: %1) - + Disable splash screen Lumpuhkan skrin percikan - + Run in daemon-mode (background) Jalankan dalam mod-daemon (disebalik tabir) - - dir - Use appropriate short form or abbreviation of "directory" - dir - - - - Store configuration files in <dir> - Simpan fail konfigurasi dalam <dir> - - - - - name - nama - - - - Store configuration files in directories qBittorrent_<name> - Simpan fail konfigurasi dalam direktori qBittorrent_<name> - - - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Godam ke dalam fail fastresume libtorrent dan buat laluan fail yang relatif dengan direktori profil - - - - files or URLs - fail atau URL - - - - Download the torrents passed by the user + + Downloads the torrents passed by the user Muat turun torrent diluluskan oleh pengguna - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Nyatakan sama ada dialog "Tambah Torrent Baharu" dibuka ketika menambah sebuah torrent. - - - - Options when adding new torrents: - Pilihan bila menambah torrent baharu: - - - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Pintasan untuk %1 - - - - path - laluan - - - - Torrent save path - Laluan simpan Torrent - - - - Add torrents as started or paused - Tambah torrent sebagai dimulakan atau dijeda - - - - Skip hash check - Langkau semakan cincangan - - - - Assign torrents to category. If the category doesn't exist, it will be created. - Umpuk torrent dengan kategori. Jika kategori tidak wujuf, ia akan diciptakan. - - - - Download files in sequential order - Muat turun fail dalam tertib berjujukan - - - - Download first and last pieces first - Muat turun cebisan pertama dan terakhir dahulu - - - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - Nilai pilihan boleh dibekalkan melalui pembolehubah persekitaran. Untuk pilihan bernama 'parameter-name', nama pembolehubah persekitaran ialah 'QBT_PARAMETER_NAME' (dalam huruf besar, '-' diganti dengan '_'). Untuk melepasi nilai bendera, tetapkan pembolehubah ke '1' atau 'TRUE'. Sebagai contoh, untuk lumpuhkan skrin percikan: - - - - Command line parameters take precedence over environment variables - Parameter baris perintah mengambil alih pembolehubah persekitaran - - - + Help Bantuan - + Run application with -h option to read about command line parameters. Jalankan aplikasi dengan pilihan -h untuk baca berkenaan parameter baris perintah. - + Bad command line Baris perintah teruk - + Bad command line: Baris perintah teruk: - + Legal Notice Notis Perundangan - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - - - - - No further notices will be issued. - - - - + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. No further notices will be issued. @@ -7092,353 +6270,432 @@ Tiada lagi notis lanjutan akan dikeluarkan. - + Press %1 key to accept and continue... Tekan kekunci %1 untuk terima dan teruskan... - + Legal notice Notis perundangan - + Cancel Batal - + I Agree Saya Setuju - - - Upgrade - Tatar + + Torrent name: %1 + Nama torrent: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - Anda telah mengemaskini dari versi lebih lama yang mana menyimpan dengan cara berbeza. Anda mesti pindahkan ke sistem penyimpanan baharu. Anda tidak dapat guna versi lebih lama dari v3.3.0 lagi. Teruskan? [y/n] + + Torrent size: %1 + Saiz torrent: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - Anda telah mengemaskini dari versi lebih lama yang mana menyimpan dengan cara berbeza. Anda mesti pindahkan ke sistem penyimpanan baharu. Anda tidak dapat guna versi lebih lama dari v3.3.0 lagi. + + Save path: %1 + Laluan simpan: %1 - - Couldn't migrate torrent with hash: %1 - Tidak dapat pindah torrent dengan cincangan: %1 + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Torrent telah dimuat turun dalam %1. - - Couldn't migrate torrent. Invalid fastresume file name: %1 - Tidak dapat pindahkan torrent. Nama fail fastresume tidak sah: %1 + + Thank you for using qBittorrent. + Terima kasih kerana menggunakan qBittorrent. - - Detected unclean program exit. Using fallback file to restore settings: %1 - + + [qBittorrent] '%1' has finished downloading + [qBittorrent] '%1' telah selesai dimuat turun - - An access error occurred while trying to write the configuration file. - Satu ralat capaian berlaku ketika cuba menulis fail konfigurasi. + + The remote host name was not found (invalid hostname) + Nama hos jauh tidak ditemui (nama hos tidak sah) - - A format error occurred while trying to write the configuration file. - Satu ralat format berlaku ketika cuba menulis fail konfigurasi. + + The operation was canceled + Operasi telah dibatalkan - - An unknown error occurred while trying to write the configuration file. - + + The remote server closed the connection prematurely, before the entire reply was received and processed + Pelayan jauh telah ditutup sambungannya secara pramatang, sebelum keseluruhan balasan diterima dan diproses - - - RSS::AutoDownloader - - - Invalid data format. - Format data tidak sah. + + The connection to the remote server timed out + Sambungan ke pelayan jauh telah tamat masa - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - + + SSL/TLS handshake failed + Jabat tangan SSL/TLS telah gagal - - Invalid data format - + + The remote server refused the connection + Pelayan jauh menafikan sambungan - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - + + The connection to the proxy server was refused + Sambungan ke pelayan proksi telah dinafikan - - Couldn't load RSS AutoDownloader rules. Reason: %1 - + + The proxy server closed the connection prematurely + Pelayan proksi telah ditutup sambungannya secara pramatang - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - + + The proxy host name was not found + Nama hos proksi tidak ditemui - - RSS feed at '%1' updated. Added %2 new articles. - + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Sambungan ke proksi telah tamat masa atau proksi tidak membalas dalam tempoh permintaan dihantar - - Failed to parse RSS feed at '%1'. Reason: %2 - + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Proksi memerlukan pengesahihan untuk menawarkan permintaan tetapi tidak menerima apa-apa kelayakan yang ditawarkan - - Couldn't read RSS Session data from %1. Error: %2 - + + The access to the remote content was denied (401) + Capaian ke kandungan jauh telah dinafikan (401) - - Couldn't parse RSS Session data. Error: %1 - + + The operation requested on the remote content is not permitted + Operasi yang dipinta pada kandungan jauh tidak dibenarkan - - Couldn't load RSS Session data. Invalid data format. - + + The remote content was not found at the server (404) + Kandungan jauh tidak ditemui di dalam pelayan (404) - - Couldn't load RSS article '%1#%2'. Invalid data format. - + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Pelayan jauh memerlukan pengesahihan untuk menawarkan kandungan tetapi kelayakan yang diberi tidak dapat diterima - - - RSS::Private::Parser - - Invalid RSS feed. - Suapan RSS tidak sah. + + The Network Access API cannot honor the request because the protocol is not known + API Capaian Rangkaian tidak dapat meneruskan permintaan kerana protokol tidak diketahui - - %1 (line: %2, column: %3, offset: %4). - %1 (baris: %2, lajur: %3, ofset: %4). + + The requested operation is invalid for this protocol + Operasi yang dipinta tidak sah untuk protokol ini + + + + An unknown network-related error was detected + Ralat berkaitan-rangkaian tidak diketahui telah dikesan + + + + An unknown proxy-related error was detected + Ralat berkaitan-proksi tidak diketahui telah dikesan + + + + An unknown error related to the remote content was detected + Ralat tidak diketahui berkaitan dengan kandungan jauh telah dikesan + + + + A breakdown in protocol was detected + Kerosakan pada protokol telah dikesan + + + + Unknown error + Ralat tidak diketahui + + + + + Upgrade + Tatar - - - RSS::Session - - RSS feed with given URL already exists: %1. - Suapan RSS dengan URL diberi sudah wujud: %1. + + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] + Anda telah mengemaskini dari versi lebih lama yang mana menyimpan dengan cara berbeza. Anda mesti pindahkan ke sistem penyimpanan baharu. Anda tidak dapat guna versi lebih lama dari v3.3.0 lagi. Teruskan? [y/n] - - Cannot move root folder. - Tidak dapat alih folder root. + + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. + Anda telah mengemaskini dari versi lebih lama yang mana menyimpan dengan cara berbeza. Anda mesti pindahkan ke sistem penyimpanan baharu. Anda tidak dapat guna versi lebih lama dari v3.3.0 lagi. - - - Item doesn't exist: %1. - Item tidak wujud: %1. + + Couldn't migrate torrent with hash: %1 + Tidak dapat pindah torrent dengan cincangan: %1 - - Cannot delete root folder. - Tidak dapat padam folder root. + + Couldn't migrate torrent. Invalid fastresume file name: %1 + Tidak dapat pindahkan torrent. Nama fail fastresume tidak sah: %1 - - Incorrect RSS Item path: %1. - Laluan Item RSS salah: %1. + + Detected unclean program exit. Using fallback file to restore settings. + Program tidak bersih dikesan ketika keluar. Menggunakan fail jatuh-balik untuk pulihkan tetapan. - - RSS item with given path already exists: %1. - Suapan RSS dengan URL diberi sudah wujud: %1. + + An access error occurred while trying to write the configuration file. + Satu ralat capaian berlaku ketika cuba menulis fail konfigurasi. - - Parent folder doesn't exist: %1. - Folder induk tidak wujud: %1. + + A format error occurred while trying to write the configuration file. + Satu ralat format berlaku ketika cuba menulis fail konfigurasi. - RSSWidget + RSS - + Search Gelintar - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - Mendapatkan suapan RSS dilumpuhkan sekarang! Anda boleh benarkannya di dalam tetapan aplikasi. - - - + New subscription Langganan baharu - - - + + + Mark items read Tanda item telah dibaca - - Refresh RSS streams - Segar semula strim RSS - - - + Update all Kemaskini semua - + RSS Downloader... Pemuat Turun RSS... - + + Settings... + Tetapan... + + + Torrents: (double-click to download) Torrent: (dwi-klik untuk muat turun) - - + + Delete Padam - + Rename... Nama semula... - + Rename - Nama semula + Nama Semula - - + + Update Kemaskini - + New subscription... Langganan baharu... - - + + Update all feeds Kemaskini semua suapan - + Download torrent Muat turun torrent - + Open news URL Buka URL berita - + Copy feed URL Salin URL suapan - + New folder... Folder baharu... - + + Refresh RSS streams + Segar semula strim RSS + + + + RSSImp + + + Stream URL: + URL strim: + + + + Please type a RSS stream URL + Sila taip satu URL strim RSS + + + + This RSS feed is already in the list. + Suapan RSS ini sudah ada dalam senarai + + + Please choose a folder name Sila pilih satu nama folder - + Folder name: Nama folder: - + New folder Folder baharu - - Please type a RSS feed URL - Sila taip satu URL suapan RSS. - - - - Feed URL: - URL Suapan: - - - + Deletion confirmation Pengesahan pemadaman - + Are you sure you want to delete the selected RSS feeds? Anda pasti mahu memadam suapan RSS terpilih? - + Please choose a new name for this RSS feed Sila pilih satu nama baharu untuk suapan RSS ini - + New feed name: Nama suapan baharu: - - Rename failed - Nama semula gagal + + Name already in use + Nama sudah digunakan + + + + This name is already used by another item, please choose another one. + Nama ini sudah digunakan oleh item lain, sila pilih yang lain. - + Date: Tarikh: - + Author: Pengarang: + + + Unread + Belum baca + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + Muat turun automatik '%1' dari suapan RSS '%2' gagal kerana ia tidak mengandungi torrent atau pautan magnet... + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + Memuat turun torrent '%1' secara automatik dari suapan RSS '%2'... + + + + Rss::Private::Parser + + + Invalid RSS feed. + Suapan RSS tidak sah. + + + + RssSettingsDlg + + + RSS Reader Settings + Tetapan Pembaca RSS + + + + RSS feeds refresh interval: + Sela segar semula suapan RSS: + + + + min + min + + + + Maximum number of articles per feed: + Bilangan maksimum artikel per suapan: + ScanFoldersDelegate - + Select save location Pilih lokasi simpan @@ -7446,274 +6703,268 @@ ScanFoldersModel - + Monitored Folder Folder Dipantau - + Override Save Location Batalkan Lokasi Simpan - + Monitored folder Folder dipantau - + Default save location Lokasi simpan lalai - + Browse... Layar... - SearchJobWidget + SearchEngine - - Form - + + Unknown search engine plugin file format. + Format fail pemalam enjin gelintar tidak diketahui. - - Results(xxx) - + + A more recent version of this plugin is already installed. + Versi terkini pemalam ini sudah pun dipasang. - - Search in: - + + + Plugin is not supported. + Pemalam tidak disokong. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - + + Update server is temporarily unavailable. %1 + Pelayan kemaskini buat masa ini tidak tersedia. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - + + + Failed to download the plugin file. %1 + Gagal memuat turun fail pemalam. %1 - - Seeds: - Semaian: + + An incorrect update info received. + Satu maklumat kemaskini yang salah telah diterima. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - + + All categories + Semua kategori - - - to - + + Movies + Cereka - - <html><head/><body><p>Maximal number of seeds</p></body></html> - + + TV shows + Rancangan TV - - - - + + Music + Muzik - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + + Games + Permainan - - Size: - Saiz: + + Anime + Anime - - <html><head/><body><p>Minimal torrent size</p></body></html> - + + Software + Perisian - - <html><head/><body><p>Maximal torrent size</p></body></html> - + + Pictures + Gambar + + + + Books + Buku + + + + SearchListDelegate + + + + Unknown + Tidak diketahui + + + SearchTab - + Name i.e: file name - Nama + Nama - + Size i.e: file size - Saiz + Saiz - + Seeders i.e: Number of full sources - + Penyemai - + Leechers i.e: Number of partial sources - + Penyedut - + Search engine - + Enjin gelintar - - Filter search results... - - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Keputusan (menunjukkan <i>%1</i> dari <i>%2</i>): - + Torrent names only - + Nama torrent sahaja - + Everywhere - - - - - Use regular expressions - + Di mana sahaja - + Searching... - + Menggelintar... - + Search has finished - Gelintar selesai + Gelintar telah selesai - + Search aborted - + Gelintar dihenti paksa - + An error occurred during search... - + Satu ralat berlaku ketika menggelintar... - + Search returned no results - + Gelintar tidak kembalikan keputusan - + Column visibility Ketampakan lajur - - - SearchPluginManager - - Unknown search engine plugin file format. - + + Form + Borang - - A more recent version of this plugin is already installed. - + + Results(xxx) + Keputusan(xxx) - - - Plugin is not supported. - + + Search in: + Gelintar dalam: - - All categories - - - - - Movies - - - - - TV shows - + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Sesetengah enjin gelintar menggelintar dalam keterangan torrent dan dalam nama fail torrent file. Keputusan sebegitu akan ditunjukkan dalam senarai di bawah yang mana dikawal oleh mod ini.</p><p><span style=" font-weight:600;">Di mana sahaja </span>lumpuhkan penapisan dan tunjukkan segalanya dikembalikan oleh enjin gelintar ini.</p><p><span style=" font-weight:600;">Nama torrent sahaja</span> hanya menunjukkan nama yang sepadan dengan pertanyaan gelintar.</p></body></html> - - Music - + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Tetapkan bilangan penyemai minimum dan maksimum yang dibenarkan</p></body></html> - - Games - + + Seeds: + Semaian: - - Anime - + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Bilangan minimum semaian</p></body></html> - - Software - + + + to + hingga - - Pictures - + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Bilangan maksimum semaian</p></body></html> - - - Books - + + + + + - - Update server is temporarily unavailable. %1 - + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Tetapkan saiz torrent minimum dan maksimum yang dibenarkan</p></body></html> - - - Failed to download the plugin file. %1 - + + Size: + Saiz: - - An incorrect update info received. - + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Saiz torrent minimum</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Saiz torrent maksimum</p></body></html> @@ -7721,198 +6972,185 @@ - - - - + + + Search Gelintar - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - Tiada mana-mana pelama gelintar dipasang. -Klik butang "Gelintar pemalam..." di bahagian bawah kanan tetingkap untuk pasangkannya. - - - + Download Muat turun - + Go to description page Pergi ke halaman keterangan - + Copy description page URL Salin URL halaman keterangan - + Search plugins... Gelintar pemalam... - + A phrase to search for. Satu frasa untuk digelintarkan. - + Spaces in a search term may be protected by double quotes. Jarak dalam terma gelintar dilindungi dengan tanda petikan ganda dua. - + Example: Search phrase example Contoh: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> - + All plugins Semua pemalam - + Only enabled Hanya dibenarkan - + Select... Pilih... - - - + + + Search Engine Enjin Gelintar - + Please install Python to use the Search Engine. Sila pasang Python untuk guna Enjin Gelintar. - + Empty search pattern Kosongkan pola gelintar - + Please type a search pattern first Sila taip satu pola gelintar dahulu - + Stop Henti - + Search has finished Gelintar selesai - + Search has failed Gelintar telah gagal - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + qBittorrent akan keluar sekarang. - + E&xit Now - + K&eluar Sekarang - + Exit confirmation - + Pengesahan keluar - + The computer is going to shutdown. - + Komputer akan dimatikan. - + &Shutdown Now - + &Matikan Sekarang - - Shutdown confirmation - - - - + The computer is going to enter suspend mode. - + Komputer akan memasuki mod tangguh. - + &Suspend Now - + &Tangguh Sekarang - + Suspend confirmation - + Pengesahan tangguh - + The computer is going to enter hibernation mode. - + Komputer akan memasuki mod hibernasi. - + &Hibernate Now - + &Hibernasi Sekarang - + Hibernate confirmation - + Pengesahan hibernasi - + You can cancel the action within %1 seconds. - + Anda boleh batalkan tindakan dalam tempoh %1 saat. + + + + Shutdown confirmation + Pengesahan matikan SpeedLimitDialog - + KiB/s KiB/s @@ -7920,52 +7158,52 @@ SpeedPlotView - + Total Upload Jumlah Muat Naik - + Total Download Jumlah Muat Turun - + Payload Upload Beban Muat Naik - + Payload Download Beban Muat Turun - + Overhead Upload Overhed Muat Naik - + Overhead Download Overhed Muat Turun - + DHT Upload DHT Muat Naik - + DHT Download DHT Muat Turun - + Tracker Upload Penjejak Muat Naik - + Tracker Download Penjejak Muat Turun @@ -7973,95 +7211,87 @@ SpeedWidget - + Period: Tempoh: - + 1 Minute 1 Minit - + 5 Minutes 5 Minit - + 30 Minutes 30 Minit - + 6 Hours 6 Jam - + Select Graphs Pilih Graf - + Total Upload Jumlah Muat Naik - + Total Download Jumlah Muat Turun - + Payload Upload Beban Muat Naik - + Payload Download Beban Muat Turun - + Overhead Upload Overhed Muat Naik - + Overhead Download Overhed Muat Turun - + DHT Upload DHT Muat Naik - + DHT Download DHT Muat Turun - + Tracker Upload Penjejak Muat Naik - + Tracker Download Penjejak Muat Turun - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8074,49 +7304,49 @@ Statistik pengguna - - Cache statistics - Statistik cache + + Total peer connections: + Jumlah sambungan rakan: - - Read cache hits: - Hit cache baca: + + Global ratio: + Nisbah sejagat: - - Average time in queue: - Masa purata dalam baris gilir: + + Alltime download: + Muat turun sepanjang masa: - - Connected peers: - + + Alltime upload: + Muat naik sepanjang masa: - - All-time share ratio: - + + Total waste (this session): + Jumlah tersia (sesi ini): - - All-time download: - + + Cache statistics + Statistik cache - - Session waste: - + + Read cache hits: + Hit cache baca: - - All-time upload: - + + Average time in queue: + Masa purata dalam baris gilir: - Total buffer size: - + Total buffers size: + Jumlah saiz penimbal: @@ -8144,7 +7374,12 @@ Jumlah saiz dibaris gilir: - + + OK + OK + + + %1 ms 18 milliseconds %1 ms @@ -8153,27 +7388,32 @@ StatusBar - + Connection status: Status sambungan: - + No direct connections. This may indicate network configuration problems. Tiada sambungan terus. Ini menunjukkan masalah konfigurasi rangkaian. - + DHT: %1 nodes DHT: %1 nod - - qBittorrent needs to be restarted! - qBittorrent perlu dimulakan semula! + + qBittorrent needs to be restarted + qBittorrent perlu dimualakn semula + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent baru sahaja dikemaskini dan perlu dimulakan semula supaya perubahan berkesan. @@ -8192,1566 +7432,1311 @@ Atas-Talian - + Click to switch to alternative speed limits Klik untuk tukar ke had kelajuan alternatif - + Click to switch to regular speed limits Klik untuk tukar ke had kelajuan biasa - + + Manual change of rate limits mode. The scheduler is disabled. + Ubah mod had kadar secara manual. Penjadual dilumpuhkan. + + + Global Download Speed Limit Had Kelajuan Muat Turun Sejagat - + Global Upload Speed Limit Had Kelajuan Muat Naik Sejagat - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - Semua (0) + Semua (0) - + Downloading (0) - + Memuat Turun (0) - + Seeding (0) - + Menyemai (0) - + Completed (0) - + Selesai (0) - + Resumed (0) - + Disambung Semula (0) - + Paused (0) - + Dijeda (0) - + Active (0) - + Aktif (0) - + Inactive (0) - + Tidak Aktif (0) - + Errored (0) - + Dengan Ralat (0) - + All (%1) - Semua (%1) + Semua (%1) - + Downloading (%1) - + Memuat Turun (%1) - + Seeding (%1) - + Menyemai (%1) - + Completed (%1) - + Selesai (%1) - + Paused (%1) - + Dijeda (%1) - + Resumed (%1) - + Disambung Semula (%1) - + Active (%1) - + Aktif (%1) - + Inactive (%1) - + Tidak Aktif (%1) - + Errored (%1) - + Dengan Ralat (%1) - TagFilterModel + TorrentContentModel - - Tags - Tag + + Name + Nama - - All - Semua + + Size + Saiz - - Untagged - Tanpa Tag + + Progress + Kemajuan - - - TagFilterWidget - - Add tag... - Tambah tag... + + Download Priority + Keutamaan Muat Turun - - Remove tag - Buang tag + + Remaining + Berbaki + + + TorrentCreatorDlg - - Remove unused tags - Buang tag yang tidak digunakan + + Select a folder to add to the torrent + Pilih satu folder untuk ditambah ke torrent - - Resume torrents - Sambung semula torrent + + Select a file to add to the torrent + Pilih satu fail untuk ditambah ke torrent - - Pause torrents - Jeda torrent + + No input path set + Tiada laluan input ditetapkan - - Delete torrents - Padam torrent + + Please type an input path first + Sila taipkan satu laluan input dahulu - - New Tag - Tag Baharu + + Select destination torrent file + Pilih fail torrent destinasi - - Tag: - Tag: + + Torrent Files (*.torrent) + Fail Torrent (*.torrent) - - Invalid tag name - Nama tag tidak sah + + Torrent was created successfully: %1 + %1 is the path of the torrent + Torrent berjaya dicipta: %1 - - Tag name '%1' is invalid - Nama tag '%1' tidak sah + + + + Torrent creation + Penciptaan torrent - - Tag exists - Tag wujud + + Torrent creation was unsuccessful, reason: %1 + Penciptaan torrent tidak berjaya, sebab: %1 - - Tag name already exists. - Nama tag sudah wujud. + + Created torrent file is invalid. It won't be added to download list. + Fail torrent yang dicipta tidak sah. Ia tidak akan ditambah ke dalam senarai muat turun. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Sifat Kategori Torrent + + Name + i.e: torrent name + Nama - - Name: - Nama: + + Size + i.e: torrent size + Saiz - - Save path: - Laluan simpan: + + Done + % Done + Selesai - - Choose save path - Pilih laluan simpan + + Status + Torrent status (e.g. downloading, seeding, paused) + Status - - New Category - Kategori Baharu + + Seeds + i.e. full sources (often untranslated) + Semai - - Invalid category name - Nama kategori tidak sah + + Peers + i.e. partial sources (often untranslated) + Rakan - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - Nama kategori tidak boleh mengandungi '\'. -Nama kategori tidak boleh bermula/tamat dengan '/'. -Nama kategori tidak boleh mengandungi jujukan '//'. - - - - Category creation error - Ralat penciptaan kategori - - - - Category with the given name already exists. -Please choose a different name and try again. - Kategori dengan nama diberi telah wujud. -Sila pilih nama lain dan cuba sekali lagi. + + Down Speed + i.e: Download speed + Kelajuan Turun - - - TorrentContentModel - - Name - Nama + + Up Speed + i.e: Upload speed + Kelajuan Naik - - Size - Saiz + + Ratio + Share ratio + Nisbah - - Progress - Kemajuan + + ETA + i.e: Estimated Time of Arrival / Time left + ETA - - Download Priority - Keutamaan Muat Turun + + Category + Kategori - - Remaining - Berbaki + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Ditambah Pada - - Availability - Ketersediaan + + Completed On + Torrent was completed on 01/01/2010 08:00 + Selesai Pada - - - TorrentCreatorDialog - - Torrent Creator - + + Tracker + Penjejak - - Select file/folder to share - + + Down Limit + i.e: Download limit + Had Turun - - Path: - + + Up Limit + i.e: Upload limit + Had Naik - - [Drag and drop area] - + + Downloaded + Amount of data downloaded (e.g. in MB) + Dimuat Turun - - - Select file - + + Uploaded + Amount of data uploaded (e.g. in MB) + Dimuat Naik - - - Select folder - - - - - Settings - - - - - Piece size: - - - - - Auto - - - - - 16 KiB - - - - - 32 KiB - - - - - 64 KiB - - - - - 128 KiB - - - - - 256 KiB - - - - - 512 KiB - - - - - 1 MiB - - - - - 2 MiB - - - - - 4 MiB - - - - - 8 MiB - - - - - 16 MiB - - - - - 32 MiB - - - - - Calculate number of pieces: - - - - - Private torrent (Won't distribute on DHT network) - - - - - Start seeding immediately - - - - - Ignore share ratio limits for this torrent - - - - - Optimize alignment - - - - - Fields - - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - - - - Web seed URLs: - - - - - Tracker URLs: - - - - - Comments: - - - - - Source: - - - - - Progress: - Kemajuan: - - - - Create Torrent - - - - - - - Torrent creation failed - - - - - Reason: Path to file/folder is not readable. - - - - - Select where to save the new torrent - - - - - Torrent Files (*.torrent) - - - - - Reason: %1 - - - - - Reason: Created torrent is invalid. It won't be added to download list. - - - - - Torrent creator - - - - - Torrent created: - - - - - TorrentInfo - - - File size exceeds max limit %1 - - - - - Torrent file read error: %1 - - - - - Torrent file read error: size mismatch - - - - - TorrentsController - - - Not contacted yet - - - - - Updating... - - - - - Working - - - - - Not working - - - - - Error: '%1' is not a valid torrent file. - - - - - - - - Torrent queueing must be enabled - + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Sesi Muat Turun - - Save path cannot be empty - + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Sesi Muat Naik - - - Category cannot be empty - + + Remaining + Amount of data left to download (e.g. in MB) + Berbaki - - Unable to create category - + + Time Active + Time (duration) the torrent is active (not paused) + Masa Aktif - - Unable to edit category - + + Save path + Torrent save path + Laluan simpan - - Cannot make save path - + + Completed + Amount of data completed (e.g. in MB) + Selesai - - Cannot write to directory - + + Ratio Limit + Upload share ratio limit + Had Nisbah - - WebUI Set location: moving "%1", from "%2" to "%3" - + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Terakhir Dilihat Selesai - - Incorrect torrent name - + + Last Activity + Time passed since a chunk was downloaded/uploaded + Aktiviti Terakhir - - - Incorrect category name - + + Total Size + i.e. Size including unwanted data + Jumlah Saiz TrackerFiltersList - + All (0) this is for the tracker filter Semua (0) - + Trackerless (0) Tanpa Penjejak (0) - + Error (0) Ralat (0) - + Warning (0) Amaran (0) - - + + Trackerless (%1) Tanpa Penjejak (%1) - - + %1 (%2) + openbittorrent.com (10) + %1 (%2) + + + + Error (%1) Ralat (%1) - - + + Warning (%1) Amaran (%1) - + Resume torrents Sambung semula torrent - + Pause torrents Jeda torrent - + Delete torrents Padam torrent - - + + All (%1) this is for the tracker filter Semua (%1) - TrackerListWidget - - - - Working - - - - - Disabled - Dilumpuhkan - + TrackerList - - This torrent is private - + + URL + URL - - Updating... - + + Status + Status - - Not working + + Received - - Not contacted yet - + + Seeds + Semai - - - - - - - N/A - T/A + + Peers + Rakan - - Tracker editing + + Downloaded - - Tracker URL: - + + Message + Mesej - - - Tracker editing failed - + + + Working + Berfungsi - - The tracker URL entered is invalid. - + + Disabled + Dilumpuhkan - - The tracker URL already exists. - + + This torrent is private + Torrent ini adalah persendirian - - Add a new tracker... - + + Updating... + Mengemaskini... - - Remove tracker - + + Not working + Tidak berfungsi - - Copy tracker URL - + + Not contacted yet + Belum dihubungi lagi - - Edit selected tracker URL - + + Tracker URL: + URL penjejak: - - Force reannounce to selected trackers - + + Tracker editing + Penyuntingan penjejak - - Force reannounce to all trackers - + + + Tracker editing failed + Penyuntingan penjejak gagal - - URL - + + The tracker URL entered is invalid. + URL penjejak yang dimasukkan tidak sah. - - Status - Status + + The tracker URL already exists. + URL penjejak sudah wujud. - - Received - + + Add a new tracker... + Tambah satu penjejak baharu... - - Seeds - + + Copy tracker URL + Salin URL penjejak - - Peers - Rakan + + Edit selected tracker URL + Sunting URL penjejak terpilih - - Downloaded - Dimuat Turun + + Force reannounce to selected trackers + Paksa umum semula pada penjejak terpilih - - Message - + + Force reannounce to all trackers + Paksa umum semula pada semua penjejak - - Column visibility - Ketampakan lajur + + Remove tracker + Buang penjejak - TrackerLoginDialog - - - - Tracker authentication - - + TrackersAdditionDlg - - Tracker: - - - - - Login - Daftar Masuk - - - - Username: - Nama pengguna: - - - - Password: - Kata laluan: + + Trackers addition dialog + Dialog penambahan penjejak - - Log in - + + List of trackers to add (one per line): + Senarai penjejak yang ditambahkan (satu per baris): - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + URL senarai keserasian µTorrent: - - List of trackers to add (one per line): - + + I/O Error + Ralat I/O - - µTorrent compatible list URL: - + + Error while trying to open the downloaded file. + Ralat ketika cuba membuka fail dimuat turun. - + No change - + Tiada perubahan - + No additional trackers were found. - + Tiada penjejak tambahan telah ditemui. - + Download error - Ralat muat turun + Ralat muat turun - + The trackers list could not be downloaded, reason: %1 - + Senarai penjejak tidak dapat dimuat turun, sebab: %1 TransferListDelegate - + Downloading Memuat turun - + Downloading metadata used when loading a magnet link Memuat turun data meta - + Allocating qBittorrent is allocating the files on disk Memperuntukkan - + Paused Dijeda - + Queued i.e. torrent is queued Dibaris gilir - + Seeding Torrent is complete and in upload-only mode Menyemai - + Stalled Torrent is waiting for download to begin Tertegun - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [P] Memuat turun - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [P] Menyemai - + Checking Torrent local data is being checked Memeriksa - + Queued for checking i.e. torrent is queued for hash checking Dibaris gilir untuk penyemakan - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Menyemak data sambung semula - + Completed Selesai - - Moving - Torrent local data are being moved/relocated - - - - + Missing Files Fail Hilang - - Errored - torrent status, the torrent has an error - Dengan ralat - - - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - %1 (disemai untuk %2) - - - - %1 ago - e.g.: 1h 20m ago - %1 yang lalu - - - - TransferListFiltersWidget - - - Status - Status - - - - Categories - Kategori - - - - Tags - Tag - - - - Trackers - Penjejak - - - - TransferListModel - - - Name - i.e: torrent name - Nama - - - - Size - i.e: torrent size - Saiz - - - - Done - % Done - - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Status - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - Rakan - - - - Down Speed - i.e: Download speed - Kelajuan Turun - - - - Up Speed - i.e: Upload speed - Kelajuan Naik - - - - Ratio - Share ratio - - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - Kategori - - - - Tags - Tag - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Dimuat Turun - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Dimuat Naik - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - Berbaki - - - - Time Active - Time (duration) the torrent is active (not paused) - - - - - Save path - Torrent save path - + + Errored + torrent status, the torrent has an error + Dengan ralat - - Completed - Amount of data completed (e.g. in MB) - Selesai + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) + %1 (disemai untuk %2) - - Ratio Limit - Upload share ratio limit - + + %1 ago + e.g.: 1h 20m ago + %1 yang lalu + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + Status - - Last Activity - Time passed since a chunk was downloaded/uploaded - + + Categories + Kategori - - Total Size - i.e. Size including unwanted data - + + Trackers + Penjejak TransferListWidget - + Column visibility Ketampakan lajur - + Choose save path Pilih laluan simpan - + Torrent Download Speed Limiting Pembatasan Kelajuan Muat Turun Torrent - + Torrent Upload Speed Limiting Pembatasan Kelajuan Muat Naik Torrent - + Recheck confirmation Pengesahan semak semula - + Are you sure you want to recheck the selected torrent(s)? Anda pasti mahu menyemak semula torrent(s) terpilih? - + Rename Nama semula - + New name: Nama baharu: - + Resume Resume/start the torrent Sambung Semula - + Force Resume Force Resume/start the torrent Paksa Sambung Semula - + Pause Pause the torrent Jeda - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Tetapkan lokasi: mengalih "%1", dari "%2" ke "%3" - - - - Add Tags - Tambah Tag - - - - Remove All Tags - Buang Semua Tag - - - - Remove all tags from selected torrents? - Buang semua tag dari torrent terpilih? + + New Category + Kategori Baharu - - Comma-separated tags: - Tag dipisah-tanda-koma: + + Category: + Kategori: - - Invalid tag - Tag tidak sah + + Invalid category name + Nama kategori tidak sah - - Tag name: '%1' is invalid - Nama tag: '%1' tidak sah + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Nama kategori mesti tidak mengandungi '\'. +Nama kategori mesti tidak bermula/tamat dengan '/'. +Nama kategori mesti tidak mengandungi jujukan '//'. - + Delete Delete the torrent Padam - + Preview file... Pratonton fail... - + Limit share ratio... Had nisbah kongsi... - + Limit upload rate... Had kadar muat naik... - + Limit download rate... Had kadar muat turun... - + Open destination folder Buka folder destinasi - + Move up i.e. move up in the queue Alih ke atas - + Move down i.e. Move down in the queue Alih ke bawah - + Move to top i.e. Move to top of the queue Alih ke teratas - + Move to bottom i.e. Move to bottom of the queue Alih ke terbawah - + Set location... Tetapkan lokasi... - - Force reannounce - Paksa umum semula - - - + Copy name Salin nama - - Copy hash - Salin cincangan - - - + Download first and last pieces first Muat turn cebisan pertama dan terakhir dahulu - + Automatic Torrent Management Pengurusan Torrent Automatik - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category Mod automatik bermaksud pelbagai sifat torrent (seperti laluan simpan) akan ditentukan oleh kategori berkaitan - + Category Kategori - + New... New category... Baharu... - + Reset Reset category Tetap Semula - - Tags - Tag - - - - Add... - Add / assign multiple tags... - Tambah... - - - - Remove All - Remove all tags - Buang Semua - - - + Priority Keutamaan - + Force recheck Paksa semak semula - + Copy magnet link Salin pautan magnet - + Super seeding mode Mod penyemaian super - + Rename... Nama semula... - + Download in sequential order Muat turun dalam tertib berjujukan - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + Pembatasan Nisbah Muat Naik/Muat Turun Torrent - - Use global share limit - + + Use global ratio limit + Guna had nisbah sejagat - - - + + + buttonGroup - + buttonGroup - - Set no share limit - + + Set no ratio limit + Tetapkan had tanpa nisbah - - Set share limit to - + + Set ratio limit to + Tetapkan hd nisbah pada + + + WebApplication - - ratio - + + Incorrect category name + Nama kategori salah + + + WebUI - - minutes - + + The Web UI is listening on port %1 + UI Sesawang mendengar pada port %1 - - No share limit method selected - + + Web UI Error - Unable to bind Web UI to port %1 + Ralat UI Sesawang - Tidak boleh ikat UI Sesawang ke port %1 + + + about - - Please select a limit method first - + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Klien BiTorrent lanjutan yang diaturcara dalam C++, berasaskan pada kit alat Qt dan libtorrent-rasterbar. + + + + Copyright %1 2006-2016 The qBittorrent project + Hakcipta %1 2006-2016 Projek qBittorrent + + + + Home Page: + Laman Rumah: + + + + Forum: + Forum: + + + + Bug Tracker: + Penjejak Pepijat: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - + + Add Peers + Tambah Rakan - - Python not detected - + + List of peers to add (one per line): + Senarai rakan untuk ditambah (satu per baris): + + + + Format: IPv4:port / [IPv6]:port + Format: IPv4:port / [IPv6]:port - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - + + + Tracker authentication + Pengesahihan penjejak - - Symlinks inside alternative UI folder are forbidden. - + + Tracker: + Penjejak: - - Exceeded the maximum allowed file size (%1)! - + + Login + Daftar masuk - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - + + Username: + Nama pengguna: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - + + Password: + Kata laluan: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - + + Log in + Daftar masuk - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - + + Cancel + Batal - WebUI + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + Pengesahan pemadaman - qBittorrent + + + + Remember choice + Ingat pilihan + + + + Also delete the files on the hard disk + Juga padam fail pada cakera keras + + + + confirmShutdownDlg + + + Don't show again + Jangan tunjuk lagi + + + + createTorrentDialog + + + Cancel + Batal + + + + Torrent Creation Tool + Alat Penciptaan Torrent + + + + Torrent file creation + Penciptaan fail torrent + + + + Add file + Tambah fail + + + + Add folder + Tambah folder + + + + File or folder to add to the torrent: + Fail atau folder yang hendak ditambah ke dalam torrent: + + + + Tracker URLs: + URL penjejak: + + + + Web seeds urls: + URL semaian Sesawang: + + + + Comment: + Ulasan: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Anda boleh asingkan kumpulan / tier penjejak dengan baris kosong. + + + + Piece size: + Saiz cebisan: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + - - Web UI: HTTPS setup successful - UI Sesawang: Persediaan HTPPS berjaya + + 16 MiB + 16 MiB + + + + Auto + Auto + + + + Private (won't be distributed on DHT network if enabled) + Persendirian (tidak diganggu pada rangkaian DHT jika dibenarkan) + + + + Start seeding after creation + Mula menyemai selepas penciptaan + + + + Ignore share ratio limits for this torrent + Abai had nisbah kongsi untuk torrent ini + + + + Create and save... + Cipta dan simpan... + + + + Progress: + Kemajuan: + + + + downloadFromURL + + + Add torrent links + Tambah pautan torrent + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Satu per baris (Pautan HTTP, Pautan Magnet dan cincangan-maklumat disokong) + + + + Download + Muat turun + + + + Cancel + Batal - - Web UI: HTTPS setup failed, fallback to HTTP - UI Sesawang: Persediaan HTTPS gagal, jatuh balik ke HTTP + + Download from urls + Muat turun dari url - - Web UI: Now listening on IP: %1, port: %2 - UI Sesawang: Kini mendengar pada IP: %1, port: %2 + + No URL entered + Tiada URL dimasukkan + + + + Please type at least one URL. + Sila taip sekurang-kurangnya satu URL. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - UI Sesawang: Tidak boleh ikat ke IP: %1, port %2. Sebab: %3 + + Crash info + Maklumat kerosakan fsutils - + + + + + Downloads Muat turun @@ -9759,100 +8744,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + Python tidak dikesan + + + + Python version: %1 + Versi Python: %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1j %2m - + %1d %2h e.g: 2days 10hours %1h %2j - + Unknown Unknown (size) Tidak diketahui - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent akan matikan komputer sekarang kerana semua muat turun telah selesai. - + < 1m < 1 minute < 1m - + %1m e.g: 10minutes %1m + + + Working + Berfungsi + + + + Updating... + Mengemaskini + + + + Not working + Tidak berfungsi + + + + Not contacted yet + Belum dihubungi lagi + preview - + Preview selection Pemilihan pratonton - + The following files support previewing, please select one of them: Fail berikut menyokong pratonton, sila pilih salah satu: + + + Preview + Pratonton + + + + Cancel + Batal + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_nb.ts qbittorrent-3.3.15/src/lang/qbittorrent_nb.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_nb.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_nb.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent Om qBittorrent - + About Om - + Author - Opphavsperson + Utvikler - - Current maintainer - Nåværende vedlikeholder - - - - Greece - Hellas + + + Nationality: + Fra: - - - Nationality: - Nasjonalitet: + + + Name: + Navn: - - + + E-mail: E-post: - - - Name: - Navn: + + Greece + Hellas - - Original author - Opprinnelig opphavsperson + + Current maintainer + Nåværende vedlikeholder - - France - Frankrike + + Original author + Opprinnelig utvikler - + Special Thanks Spesiell takk til - + Translators Oversettere - - License - Lisens - - - + Libraries Bibliotek - + qBittorrent was built with the following libraries: - qBittorrent ble bygd med følgende biblioteker: - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - En avansert BitTorrent klient programmert i C++, basert på Qt toolkit og libtorrent-rasterbar. - - - - Copyright %1 2006-2018 The qBittorrent project - Opphavsrett %1 2006-2018 qBittorrent prosjektet - - - - Home Page: - Hjemmeside: + qBittorrent lot seg bygge med disse bibliotekene: - - Forum: - Forum: + + France + Frankrike - - Bug Tracker: - Feilsporer: + + License + Lisens @@ -115,57 +90,67 @@ Lagre i - + + Browse... + Bla gjennom… + + + + Set as default save path + Bruk som forvalgt lagringsmappe + + + Never show again Aldri vis igjen - + Torrent settings Torrentinnstillinger - + Set as default category Bruk som forvalgt kategori - + Category: Kategori: - + Start torrent Start torrent - + Torrent information Informasjon om torrent - + Skip hash check Hopp over sjekksummering - + Size: Størrelse: - + Hash: Sjekksum: - + Comment: Kommentar: - + Date: Dato: @@ -190,117 +175,89 @@ Automatisk - - Remember last used save path - Husk sist brukte lagringsbane - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog Forhindrer sletting av torrent uavhenging av innstillinger på siden 'Nedlastinger', under 'Alternativer' - + Do not delete .torrent file Ikke slett .torrent-fil - - Create subfolder - Opprett undermappe - - - - Download in sequential order - Last ned i rekkefølge - - - - Download first and last pieces first - Last ned første og siste delene først - - - + Normal Normal - + High Høy - + Maximum Maksimal - + Do not download Ikke last ned - - - + + + I/O Error - Inn/ut-datafeil + Inn- ut-datafeil - + Invalid torrent Ugyldig torrent - - Renaming - Tildeler nytt navn - - - - - Rename error - Feil ved tildeling av nytt navn - - - - The name is empty or contains forbidden characters, please choose a different one. - Navnet er tomt eller inneholder forbudte tegn, velg noe annet. + + + + + Already in download list + Allerede i nedlastingskø - + Not Available This comment is unavailable Ikke tilgjengelig - + Not Available This date is unavailable Ikke tilgjengelig - + Not available Ikke tilgjengelig - + Invalid magnet link Ugyldig magnetlenke - + The torrent file '%1' does not exist. Torrentfilen '%1' finnes ikke. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. Torrentfilen '%1' kan ikke leses fra disken. Du mangler sannsynligvis ikke tilgang til det. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ Feil: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torrent allerede i nedlastingskø. Fletting av sporere ble ikke gjort fordi det er en privat torrent. + + + + Torrent is already in download list. Trackers were merged. + Torrent allerede i nedlastingskø. Fletting av sporere utført. + + + + + Cannot add torrent + Kan ikke legge til torrent + + + + Cannot add this torrent. Perhaps it is already in adding state. + Kan ikke legge til denne torrenten. Kanskje den allerede blir lagt til. + + + This magnet link was not recognized Denne magnetlenken ble ikke gjenkjent - + + Magnet link is already in download list. Trackers were merged. + Magnetlenkens innhold er allerede i nedlastingskø. Fletting av sporere ble utført. + + + + Cannot add this torrent. Perhaps it is already in adding. + Kan ikke legge til denne torrentent. Kanskje den allerede blir lagt til. + + + Magnet link Magnetlenke - + Retrieving metadata... Henter metadata… - + Not Available This size is unavailable. Ikke tilgjengelig - + Free space on disk: %1 Ledig plass på disk: %1 - + + Choose save path Velg lagringsmappe - - - - - - - Torrent is already present - Torrent er allerede til stede - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - Torrent '%1' er allerede i overføringslisten. Sporere har ikke blitt slått sammen fordi det er en privat torrent. - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - Torrent '%1' er allerede i overføringslisten. Sporere har blitt fusjonert. - - - - Torrent is already queued for processing. - Torrent er allerede i kø for behandling. + + Rename the file + Gi filen nytt navn - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - Magnetlenken '%1' er allerede i overføringslisten. Sporere har blitt fusjonert. + + New name: + Nytt navn: - - Magnet link is already queued for processing. - Magnetlenken er allerede i kø for behandling. + + + The file could not be renamed + Ending av navn mislyktes - - New name: - Nytt navn: + + This file name contains forbidden characters, please choose a different one. + Dette filnavnet inneholder forbudte tegn, velg noe annet. - - + + This name is already in use in this folder. Please use a different name. - En fil ved dette navnet finnes allerede i denne mappen. Velg et annet navn. + Ei fil ved dette navnet finnes allerede i denne mappa. Velg et annet navn. - + The folder could not be renamed Kunne ikke gi mappa nytt navn. - + Rename... Gi nytt navn… - + Priority Prioritet - + Invalid metadata Feilaktig metadata - + Parsing metadata... Analyserer metadata… - + Metadata retrieval complete Henting av metadata fullført - + Download Error Nedlastingsfeil @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Hurtiglagerstørrelse for skriving til disk + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Utgående porter (Min) [0: Deaktivert] - + Outgoing ports (Max) [0: Disabled] Utgående porter (Maks) [0: Deaktivert] - + Recheck torrents on completion Gjennomsjekk torrenter på nytt ved fullførelse - + Transfer list refresh interval Oppdateringsintervall for overføringsliste - + ms milliseconds ms - + Setting Innstilling - + Value Value set for this setting Verdi - - - (disabled) - (deaktivert) - - - + (auto) (auto) - - min - minutes - min - - - + All addresses Alle adresser - + qBittorrent Section qBittorrent-del - - + + Open documentation Åpne dokumentasjon - + libtorrent Section libtorrent-del - - Asynchronous I/O threads - - - - - Disk cache - Disk-hurtiglager - - - + s seconds s - + Disk cache expiry interval Utløpsintervall for hurtiglager på disk - + Enable OS cache Aktiver OS-hurtiglager - - Guided read cache - Guidet lese-hurtiglager - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - Send forslag om opplastingsdeler - - - - - KiB - KiB - - - - Send buffer watermark - Send mellomlagringsvannmerke - - - - Send buffer low watermark - Send lavt mellomlager-vannmerke - - - - Send buffer watermark factor - Send mellomlagringsvannmerkefaktor - - - - Prefer TCP - Foretrekk TCP - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address - Tillat flere tilkoblinger fra samme IP-adresse + + m + minutes + m - + Resolve peer countries (GeoIP) Finn fram til geografisk tilhørighet for likemenn (GeoIP) - + Resolve peer host names Finn frem til vertsnavn for likemenn - + Strict super seeding Streng superdeling - + Network Interface (requires restart) Nettverksgrensesnitt (krever omstart) - + Optional IP Address to bind to (requires restart) Valgfri IP-adresse å tilknytte seg til (krever omstart) - + Listen on IPv6 address (requires restart) Lytt til IPv6-adresse (krever omstart) - + Display notifications Vis varslinger - + Display notifications for added torrents Vis varslinger for tillagte torrenter - + Download tracker's favicon Last ned sporerens favikon - - Save path history length - Lagre stihistorikklengde - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - Oppførsel for opplastingsplasser - - - - Round-robin - - - - - Fastest upload - Raskeste opplasting - - - - Anti-leech - - - - - Upload choking algorithm - Kvelningsalgoritme for opplastninger - - - + Confirm torrent recheck Bekreft ny gjenommsjekking av torrent - - Confirm removal of all tags - Bekreft fjerning av alle etiketter + Exchange trackers with other peers + Utveksle sporere med andre likemenn - - Always announce to all trackers in a tier - Alltid annonser til alle sporere på ett nivå + + Always announce to all trackers + Annonser alltid til alle sporere - - Always announce to all tiers - Alltid annonser til alle nivåer - - - + Any interface i.e. Any network interface Vilkårlig grensesnitt - + Save resume data interval How often the fastresume file is saved. Intervall for lagring av gjenopptakelsesdata - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - %1-algoritme for sammenblandet TCP-modus - - - + Maximum number of half-open connections [0: Unlimited] Maksimalt antall halvåpne tilkoblinger [0: Ubegrenset] - + IP Address to report to trackers (requires restart) IP-adresse som skal rapporteres til sporere (krever omstart) - + Enable embedded tracker Aktiver innebygd sporer - + Embedded tracker port Innebygd sporerport - + Check for software updates Se etter programvareoppdateringer - + Use system icon theme Ifør systemets ikondrakt @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 startet - + Torrent: %1, running external program, command: %2 Torrent: %1, kjører eksternt program, kommando: %2 - - Torrent name: %1 - Torrentnavn: %1 - - - - Torrent size: %1 - Torrentstørrelse: %1 - - - - Save path: %1 - Lagringssti: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Torrenten ble lastet ned på %1. - - - - Thank you for using qBittorrent. - Takk for at du bruker qBittorrent. - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' er ferdig nedlastet + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrent: %1, kommando for kjøring av eksternt program for lang (length > %2), oppstart feilet. - + Torrent: %1, sending mail notification Torrent: %1, sender e-postmerknad - + Information Informasjon - - To control qBittorrent, access the Web UI at %1 - For å kontrollere qBittorrent, få tilgang til webgrensesnittet på %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + For å kontrollere qBittorrent, få tilgang til nettbrukergrensesnittet hos http://localhost:%1 - + The Web UI administrator user name is: %1 Nettbrukergrensesnittets administrator-brukernavn er: %1 - + The Web UI administrator password is still the default one: %1 Nettbrukergrensesnittets administrator-passord er fremdeles standardpassordet: %1 - + This is a security risk, please consider changing your password from program preferences. Dette er en sikkerhetsrisiko, vurder å endre passordet ditt fra programinnstillingene. - + Saving torrent progress... Lagrer torrent-framdrift… - - - Portable mode and explicit profile directory options are mutually exclusive - Portabelt modus og eksplisitte profilmappevalg er gjensidig utelukkende - - - - Portable mode implies relative fastresume - Portabelt modus impliserer relativ hurtiggjenopptakelse - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - Din IP-adresse er blitt utestengt etter for mange mislykkede autentiseringsforsøk. - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Lagre til: @@ -861,836 +658,700 @@ RSS-informasjonskanalsnedlaster - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - Automatisk nedlasting av RSS-torrenter er skrudd av nå. Du kan skru det på i programinnstillingene. + + Enable Automated RSS Downloader + Skru på automatisert RSS-nedlaster - + Download Rules Nedlastingsregler - + Rule Definition Regeldefinisjon - + Use Regular Expressions Bruk regulære uttrykk - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - - - - + Must Contain: Må inneholde: - + Must Not Contain: Kan ikke inneholde: - + Episode Filter: Episodefilter: - + Assign Category: Kategoriser: - + Save to a Different Directory Lagre i annen mappe - + Ignore Subsequent Matches for (0 to Disable) ... X days Se bort fra påfølgende treff (0 for å skru av) - + Disabled - Avskrudd + Avskrudd - + days dager - + Add Paused: Legg til uten å starte: - + Use global settings Bruk globale innstillinger - + Always Alltid - + Never Aldri - + Apply Rule to Feeds: Ta i bruk regel ovenfor informasjonskanaler: - + Matching RSS Articles Samsvarende informasjonskanalsartikler - + &Import... &Importer… - + &Export... &Eksporter… - + Matches articles based on episode filter. Samsvarende artikler i henhold til episodefilter. - + Example: Eksempel: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match vil samsvare med 2, 5, 8 til og med 15, 30 samt påfølgende episoder av sesong én - + Episode filter rules: Episodefiltreringsregler: - + Season number is a mandatory non-zero value Sesongnummer er en obligatorisk ikke-null verdi - + Episode number is a mandatory non-zero value + Episodenummer er en obligatorisk ikke-null verdi + + + Filter must end with semicolon Filter må avsluttes med semikolon - + Three range types for episodes are supported: Tre grupperingstyper for episoder er støttet: - + Single number: <b>1x25;</b> matches episode 25 of season one Enkeltnummer: <b>1x25;</b> samsvarer med episode 25 av sesong én - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Normalgruppering: <b>1x25-40;</b> samsvarer med episode 25 til og med 40 av sesong én - - Episode number is a mandatory positive value - Episodenummer er en påkrevd verdi som må være over null - - - - Rules - Regler + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Uendelig gruppering: <b>1x25-;</b> samsvarer med episode 25 og utover i sesong én - - Rules (legacy) - Regler (foreldet) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Uendelig gruppering: <b>1x25-;</b> samsvarer med episode 25 og utover i sesong én og alle episoder i senere sesonger + - + Last Match: %1 days ago Siste treff: %1 dager siden - + Last Match: Unknown Siste treff: Ukjent - + New rule name Navn på ny regel - + Please type the name of the new download rule. Skriv navnet på den nye nedlastingsregelen. - - + + Rule name conflict Regelnavnskonflikt - - + + A rule with this name already exists, please choose another name. En regel med dette navnet eksisterer allerede, velg et annet navn. - + Are you sure you want to remove the download rule named '%1'? Er du sikker på at du vil fjerne nedlastingsregelen som heter '%1'? - + Are you sure you want to remove the selected download rules? Er du sikker på at du vil fjerne de valgte nedlastingsreglene? - + Rule deletion confirmation Regelslettingsbekreftelse - + Destination directory Målmappe - + Invalid action Ugyldig handling - + The list is empty, there is nothing to export. Listen er tom, ingenting å eksportere. - - Export RSS rules - Eksporter RSS-regler + + Where would you like to save the list? + Hvor vil du lagre listen? - - + + Rules list (*.rssrules) + Regelliste (*.rssrules) + + + I/O Error - Inn/ut-datafeil + Inn- ut-datafeil - - Failed to create the destination file. Reason: %1 - Oppretting av målfil mislyktes. Grunn: %1 + + Failed to create the destination file + Oppretting av målfil mislyktes - - Import RSS rules - Importer RSS-regler + + Please point to the RSS download rules file + Vis til filen inneholdende nedlastingsregler for nyhetsmatinger - - Failed to open the file. Reason: %1 - Åpning av fil mislyktes. Grunn: %1 + + Rules list + Regelliste - + Import Error Importeringsfeil - - Failed to import the selected rules file. Reason: %1 - Importering av valgt regelfil mislyktes. Grunn: %1 + + Failed to import the selected rules file + Importering av den valgte regelfilen mislyktes - + Add new rule... Legg til ny regel… - + Delete rule Slett regel - + Rename rule... Gi regel nytt navn… - + Delete selected rules Slett valgte regler - - Clear downloaded episodes... - Fjern nedlastede episoder... - - - + Rule renaming Bytting av regelnavn - + Please type the new rule name Skriv inn nytt regelnavn - - Clear downloaded episodes - Fjern nedlastede episoder - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - Regex-modus: Bruk Perl-kompatible regulære uttrykk - - - - - Position %1: %2 - Posisjon %1: %2 + + Regex mode: use Perl-like regular expressions + Reg.(-ulært) -modus: bruk Perl-lignende regulære uttrykk - + Wildcard mode: you can use - Joker-modus: Du kan bruke + - + ? to match any single character - ? for å samsvare med ethvert enkeltstående tegn + - + * to match zero or more of any characters - * for å samsvare med null eller flere av vilkårlige tegn + - + Whitespaces count as AND operators (all words, any order) - Blanktegn teller som OG-operatorer (alle ord, vilkårlig forordning) + - + | is used as OR operator - | brukes som ELLER-operator + - + If word order is important use * instead of whitespace. - Hvis ord-rekkefølge er viktig, bruk * istedenfor blanktegn. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Et uttrykk med en tom %1-klausul (f.eks. %2) + - + will match all articles. - vil samsvare med alle artikler. + - + will exclude all articles. - vil utelate alle artikler. + - - - BanListOptionsDialog - - List of banned IP addresses - Liste over bannlyste IP-adresser + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Jokertegnmodus: du kan bruke<ul><li>? til å samsvare med hvilke tegn som helst</li><li>* for å samsvare med null eller mer av hvilke som helst tegn</li><li>Blanktegn teller som OG-operatører</li></ul> - - Ban IP - Bannlys IP + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Jokertegnmodus: du kan bruke<ul><li>? til å samsvare med hvilke tegn som helst</li><li>* for å samsvare med null eller mer av hvilket som helst tegn</li><li>| er brukt som ELLER-operatør</li></ul> + + + BitTorrent::Session - - Delete - Slett + + Restart is required to toggle PeX support + Omstart kreves for å veksle PeX-støtte - - - Warning - Advarsel + + Embedded Tracker [ON] + Innebygd sporer [PÅ] - - The entered IP address is invalid. - Den oppgitte IP-adressen er ugyldig. - - - - The entered IP is already banned. - Den angitte IP er allerede utestengt. - - - - BitTorrent::Session - - - Restart is required to toggle PeX support - Omstart kreves for å veksle PeX-støtte - - - - Could not get GUID of configured network interface. Binding to IP %1 - Kunne ikke hente GUID tilhørende oppsatt nettverksgrensesnitt. Binder til IP %1 - - - - Embedded Tracker [ON] - Innebygd sporer [PÅ] - - - + Failed to start the embedded tracker! Mislyktes i å starte opp den innebygde sporeren! - + Embedded Tracker [OFF] Innebygd sporer [AV] - + + '%1' reached the maximum ratio you set. Removing... + '%1' nådde det maksimale forholdet du anga. Fjerner… + + + + '%1' reached the maximum ratio you set. Pausing... + '%1' nådde det maksimale forholdet du anga. Setter på pause… + + + System network status changed to %1 e.g: System network status changed to ONLINE Systemets nettverkstatus endret til %1 - + ONLINE TILKOBLET - + OFFLINE FRAKOBLET - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding Nettverksoppsettet av %1 har blitt forandret, oppdaterer øktbinding - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. Den oppsatte nettverksgrensesnittadressen %1 er ugyldig. - - + Encryption support [%1] Krypteringsstøtte [%1] - - + FORCED TVUNGET - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 er ikke en gyldig IP-adresse og ble avslått under tillegging av listen over bannlyste adresser. - - - - + Anonymous mode [%1] Anonymt modus [%1] - + Unable to decode '%1' torrent file. Klarte ikke å dekode '%1' torrentfil. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Rekursiv nedlasting av fila '%1' innebygd i torrenten '%2' - + Queue positions were corrected in %1 resume files - Kø-plasseringer ble rettet opp i %1 gjenopptakelsesfiler + - + Couldn't save '%1.torrent' Kunne ikke lagre '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' ble fjernet fra overføringslisten. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' ble fjernet fra overføringsliste og harddisk. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - "%1 ble fjernet fra overføringsliste, men filene kunne ikke slettes. Feil: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. fordi %1 er avskrudd. - + because %1 is disabled. this peer was blocked because TCP is disabled. fordi %1 er avskrudd. - + URL seed lookup failed for URL: '%1', message: %2 Nettdelingsadresseoppslag feilet for: '%1', melding: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent mislyktes i å lytte til grensesnittet %1 port: %2/%3. Grunn: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' fjernet fra overføringsliste og disk. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' fjernet fra overføringsliste. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Laster ned '%1', vent… - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent forsøker å lytte til hvilken som helst grensesnitts-port: %1 - + The network interface defined is invalid: %1 Angitt nettverksgrensesnitt er ugyldig: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent forsøker å lytte til grensesnitt %1 port: %2 - - Peer ID: - Deltaker ID: - - - - HTTP User-Agent is '%1' - HTTP-brukeragenten er '%1' - - - - + DHT support [%1] DHT-støtte [%1] - - - - - - - - - + + + + ON - - - - - - - - - + + + + OFF AV - - + Local Peer Discovery support [%1] Støtte for lokal deltakeroppdagelse [%1] - - PeX support [%1] - PeX støtte [%1] - - - - '%1' reached the maximum ratio you set. Removed. - '%1' nådde det maksimale forholdet du angav. Fjernet. - - - - '%1' reached the maximum ratio you set. Paused. - '%1' nådde det maksimale forholdet du anga. Satt på pause. - - - - '%1' reached the maximum seeding time you set. Removed. - '%1' nådde den maksimale delingstiden du angav. Fjernet. - - - - '%1' reached the maximum seeding time you set. Paused. - '%1' nådde den maksimale delingstiden du angav. Satt på pause. + Restart is required to toggle Tracker Exchange support + Omstart kreves for å veksle utveksling av sporere - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent fant ikke en %1-lokaladresse å lytte til - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent mislyktes i å lytte til hvilket som helst grensesnitts-port: %1. Grunn: %2. - + Tracker '%1' was added to torrent '%2' Sporeren '%1' ble lagt til torrenten '%2' - + Tracker '%1' was deleted from torrent '%2' Sporeren '%1' ble slettet fra torrenten '%2' - + URL seed '%1' was added to torrent '%2' Nettadresse-deleren '%1' ble lagt til torrenten '%2' - + URL seed '%1' was removed from torrent '%2' Nettadresse-deleren '%1' ble fjernet fra torrenten '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Ute av stand stand til å gjenoppta torrenten '%1'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Oppgitt IP-filter analysert: %1 regler ble lagt til. - + Error: Failed to parse the provided IP filter. Feil: Mislyktes i fortolkning av oppgitt IP-filter. - - '%1' restored. - 'torrent name' restored. - '%1' gjenopprettet. - - - + Couldn't add torrent. Reason: %1 Kunne ikke legge til torrent. Grunn: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' gjenopptatt (hurtig) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' lagt i nedlastingskø. - + An I/O error occurred, '%1' paused. %2 - En inn/ut-datafeil oppstod, '%1' satt på pause. %2 + En inn- ut-datafeil oppstod, '%1' satt på pause. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP- NAT-PMP: Port-tilordningssvikt, melding: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP- NAT-PMP: Port-tilordning gjort, melding: %1 - + due to IP filter. this peer was blocked due to ip filter. pga. IP-filter. - + due to port filter. this peer was blocked due to port filter. pga. port-filter. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. pga. blandingsmodusbegrensninger i I2P. - + because it has a low port. this peer was blocked because it has a low port. fordi den har en lavt nummerert port. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent lytter til grensesnittet %1 på port: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 Ekstern-IP: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - opprettelse av ny torrentfil mislyktes - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - Av - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + Kunne ikke flytte torrent: '%1'. Grunn: %2 - + File sizes mismatch for torrent '%1', pausing it. - + Ikke samsvar i filstørrelser for torrent '%1', settes på pause. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - + Hurtig gjenopptakelsesdata ble avvist for torrenten '%1'. Grunn: %2. Sjekker igjen… CategoryFilterModel - + Categories - Kategorier + Kategorier - + All - Alle + Alle - + Uncategorized - Ukategoriserte + @@ -1698,42 +1359,145 @@ Add category... - Legg til kategori… + Legg til kategori… Add subcategory... - Legg til underkategori… + - Edit category... - Rediger kategori… + Remove category + Fjern kategori + + + + Remove unused categories + Fjern ubrukte kategorier + + + + Resume torrents + Gjenoppta torrenter + + + + Pause torrents + Sett torrenter på pause + + + + Delete torrents + Slett torrenter + + + + New Category + Ny kategori + + + + Category: + Kategori: + + + + Invalid category name + Ugyldig kategorinavn + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Alle (0) + + + Uncategorized (0) + Ukategoriserte (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Ukategoriserte (%1) + + + Add category... + Legg til kategori… - Remove category - Fjern kategori + Fjern kategori - Remove unused categories - Fjern ubrukte kategorier + Fjern ubrukte kategorier - Resume torrents - Gjenoppta torrenter + Gjenoppta torrenter - Pause torrents - Sett torrenter på pause + Sett torrenter på pause - Delete torrents - Slett torrenter + Slett torrenter + + + New Category + Ny kategori + + + Category: + Kategori: + + + Invalid category name + Ugyldig kategorinavn + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Kategorinavn kan ikke inneholde '\'. +Kategorinavn kan ikke starte/slutte med '/'. +Kategorinavn kan ikke inneholde en '//'-sekvens. + + + All (%1) + this is for the category filter + Alle (%1) @@ -1773,220 +1537,101 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Slettingsbekreftelse - - - - Remember choice - Husk valg - - - - Also delete the files on the hard disk - Slett også filene på harddisken - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? Er du sikker på at du vil slette '%1' fra overføringslisten? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? Er du sikker på at du vil slette disse %1 torrentene fra overføringslisten? - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - Legg til torrent linker - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - Last ned - - - - No URL entered - - - - - Please type at least one URL. - - - - DownloadedPiecesBar - + White: Missing pieces Hvitt: Manglende deler - + Green: Partial pieces Grønt: Ufullstendige deler - + Blue: Completed pieces Blått: Fullførte deler - ExecutionLogWidget + ExecutionLog - + General Generelt - + Blocked IPs - Blokkerte IPer + Blokerte IP-er - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> ble blokkert %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - + <font color='red'>%1</font> ble bannlyst FeedListWidget - + RSS feeds Nyhetsmatinger - - - Unread (%1) - Ulest (%1) + + Unread + Ulest FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - &Bla gjennom… - - - - Choose a file - Caption for file open/save dialog - Velg en fil - - - - Choose a folder - Caption for directory open dialog - Velg en mappe - - - - Any file - Enhver fil + + An error occured while trying to open the log file. Logging to file is disabled. + En feil oppstod i forsøk på å åpne loggfilen. Loggføring til fil avskrudd. FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - Inn/ut-operasjonsfeil: Kunne ikke åpne IP-filterfil i lesemodus. - - - - - - IP filter line %1 is malformed. - IP-filterlinjen %1 er skrevet feil. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - IP-filterlinjen %1 er skrevet feil. Start-IP-en for spennet er skrevet feil. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - IP-filterlinjen %1 er skrevet feil. Slutt-IP-en for spennet er skrevet feil. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - IP-filterlinjen %1 er skrevet feil. Én IP er IPv4 og den andre er IPv6! + + + + I/O Error: Could not open ip filter file in read mode. + Inn- ut-operasjonsfeil: Kunne ikke åpne IP-filterfil i lesemodus. - - - IP filter exception thrown for line %1. Exception is: %2 - IP-filterunntak i linjen %1. Unntaket er: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - %1 ekstra IP-filtertolkningsfeil inntraff. - - - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. Fortolkningsfil: Filterfilen er ikke en gyldig PeerGuardian-P2B-fil. @@ -1994,396 +1639,472 @@ GeoIPDatabase - - + + Unsupported database file size. Ustøttet størrelse på database-fil. - + Metadata error: '%1' entry not found. Metadata-feil: '%1' oppføring ikke funnet. - + Metadata error: '%1' entry has invalid type. Metadata feil: '%1' oppføringen har ugyldig type. - + Unsupported database version: %1.%2 Ustøttet database-versjon: %1.%2 - + Unsupported IP version: %1 Ustøttet IP-versjon: %1 - + Unsupported record size: %1 Ustøttet oppføringsstørrelse: %1 - + Invalid database type: %1 Ugyldig database-type: %1 - + Database corrupted: no data section found. Ødelagt database: Ingen dataseksjon funnet. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - + + File + Fil - - Bad Http request, closing socket. IP: %s - + + Edit + Rediger - - - HttpServer - + + Help + Hjelp + + + Exit qBittorrent Avslutt qBittorrent - + Only one link per line Kun én lenke per linje - + + Download + Last ned + + + Global upload rate limit must be greater than 0 or disabled. - Global opplastingshastighetsgrense må være større enn 0 eller deaktivert. + Global opplastingsforholdsgrense må være større enn 0 eller deaktivert. - + Global download rate limit must be greater than 0 or disabled. - Global nedlastingshastighetsgrense må være større enn 0 eller deaktivert. + Global nedlastingsforholdsgrense må være større enn 0 eller deaktivert. - + Alternative upload rate limit must be greater than 0 or disabled. - Alternativ opplastingshastighetsgrense må være større enn 0 eller deaktivert. + Alternativ opplastingsforholdsgrense må være større enn 0 eller deaktivert. - + Alternative download rate limit must be greater than 0 or disabled. - Alternativ nedlastingshastighetsgrense må være større enn 0 eller deaktivert. + Alternativ nedlastingsforholdsgrense må være større enn 0 eller deaktivert. - + Maximum active downloads must be greater than -1. Maksimalt aktive nedlastinger må være større enn -1. - + Maximum active uploads must be greater than -1. Maksimalt aktive opplastinger må være større enn -1. - + Maximum active torrents must be greater than -1. Maksimalt aktive torrenter må være større enn -1. - + Maximum number of connections limit must be greater than 0 or disabled. Grensen for maksimalt antall tilkoblinger må være større enn 0 eller deaktivert. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Grensen for maksimalt antall tilkoblinger per torrent må være større enn 0 eller deaktivert. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Grensen for maksimalt antall opplastingsåpninger per torrent må være større enn 0 eller deaktivert. - + Unable to save program preferences, qBittorrent is probably unreachable. Ikke i stand til å lagre programinnstillinger, qBittorrent er sannsynligvis unåelig. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent på Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - Ugyldig kategorinavn: -Ikke bruk noen spesialtegn i kategorinavn. - - - - Unknown - Ukjent - - - - Hard Disk - Harddisk - - - - Share ratio limit must be between 0 and 9998. - Delingssforholdsgrense må være mellom 0 og 9998. - - - - Seeding time limit must be between 0 and 525600 minutes. - Delingstidgrensen må være mellom 0 og 525600 minutter. + + Language + Språk - + The port used for incoming connections must be between 1 and 65535. Porten som brukes for innkommende tilkoblinger må være mellom 1 og 65535. - + The port used for the Web UI must be between 1 and 65535. Porten som brukes for nettbrukergrensesnittet må være mellom 1 og 65535. - + Unable to log in, qBittorrent is probably unreachable. Ikke i stand til å logge inn, qBittorrent er sannsynligvis unåelig. - + Invalid Username or Password. Ugyldig brukernavn eller passord. - - Username - Brukernavn - - - + Password Passord - + Login Logg inn - + + Upload Failed! + Opplasting mislyktes! + + + Original authors - Opphavspersoner + Opprinnelige utviklere - + + Upload limit: + Opplastingsgrense: + + + + Download limit: + Nedlastingsgrense: + + + Apply Bruk - + Add Legg til - + + Category: + Kategori: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Last opp torrenter - + + All + Alle + + + + Downloading + Laster ned + + + + Seeding + Deler + + + + Completed + Fullførte + + + + Resumed + Gjenopptatte + + + + Paused + Satt på pause + + + + Active + Aktive + + + + Inactive + Inaktive + + + Save files to location: Lagre filer i mappe: - + Cookie: Informasjonskapsel: - + Type folder here Velg mappe her - + + Run an external program on torrent completion + Kjør et eksternt program når torrenter ferdigstilles + + + + Enable bandwidth management (uTP) + Aktiver båndbreddestyring (uTP) + + + + Apply rate limit to uTP connections + Bruk forholdsgrense for uTP-tilkoblinger + + + + Alternative Global Rate Limits + Alternative globale forholdsgrenser + + + More information Mer informasjon - + Information about certificates Informasjon om sertifikater - + Save Files to Lagre filer til - - Set location - Velg plassering - - - - Limit upload rate - Begrens opplastingshastighet + + Watch Folder + Overvåkingsmappe - - Limit download rate - Begrens nedlastingshastighet + + Default Folder + Forvalgt mappe - - Rename torrent - Gi torrent nytt navn + + from + from time1 to time2 + fra - - Unable to create category - + + to + from time1 to time2 + til - + Other... Save Files to: Watch Folder / Default Folder / Other... Annen… - + + Every day + Schedule the use of alternative rate limits on ... + Hver dag + + + + Week days + Schedule the use of alternative rate limits on ... + Ukedager + + + + Week ends + Schedule the use of alternative rate limits on ... + Helger + + + Monday Schedule the use of alternative rate limits on ... Mandag - + Tuesday Schedule the use of alternative rate limits on ... Tirsdag - + Wednesday Schedule the use of alternative rate limits on ... Onsdag - + Thursday Schedule the use of alternative rate limits on ... Torsdag - + Friday Schedule the use of alternative rate limits on ... Fredag - + Saturday Schedule the use of alternative rate limits on ... Lørdag - + Sunday Schedule the use of alternative rate limits on ... Søndag - + + Downloaded + Is the file downloaded or not? + Nedlastet + + + Logout Logg ut - + + Download from URLs + Last ned fra nettadresser + + + Download Torrents from their URLs or Magnet links Last ned torrenter fra der-tilhørende nettadresser eller magnetlenker - + Upload local torrent Last opp lokal torrent - + Are you sure you want to delete the selected torrents from the transfer list? Er du sikker på at du vil slette valgte torrenter fra overføringslisten? - + Save Lagre - + qBittorrent client is not reachable qBittorrent er ikke oppnåelig - - qBittorrent has been shutdown. - qBittorrent har blitt avslått. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Liste over hvitlistede IP-subnett + + HTTP Server + HTTP-tjener - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Eksempel: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Følgende parametre er støttet: - - Add subnet - Legg til subnett + + Torrent path + Torrentmappe - - Delete - Slett + + Torrent name + Torrentnavn - - Error - Feil + + qBittorrent has been shutdown. + qBittorrent har blitt avslått. + + + LineEdit - - The entered subnet is invalid. - Innskrevet subnett er ugyldig. + + Clear the text + Fjern teksten LogListWidget - + Copy Kopier - + Clear Fjern @@ -2416,710 +2137,648 @@ Når nedlastinger er fer&dige - + &View &Vis - + &Options... &Alternativer… - + &Resume &Gjenoppta - + Torrent &Creator &Torrentoppretter - + Set Upload Limit... Sett opplastingsgrense… - + Set Download Limit... Sett nedlastingsgrense… - + Set Global Download Limit... Sett global nedlastingsgrense… - + Set Global Upload Limit... Sett global opplastingsgrense… - + Minimum Priority Minimumsprioritet - + Top Priority Toppprioritet - + Decrease Priority Senk prioritetsnivå - + Increase Priority Øk prioriteringsnivå - - + + Alternative Speed Limits Alternative hastighetsgrenser - + &Top Toolbar &Topp-verktøyslinje - + Display Top Toolbar Vis Topp-verktøyslinje - - Status &Bar - Status&felt - - - + S&peed in Title Bar &Hastighet i tittellinjen - + Show Transfer Speed in Title Bar Vis overføringshastighet i tittellinjen - + &RSS Reader Nyhetsmatingsleser (&RSS) - + Search &Engine Søke&motor - + L&ock qBittorrent Lås qBitt&orrent - + Do&nate! Do&ner! - - Close Window - Lukk vindu - - - + R&esume All Gj&enoppta alle - + Manage Cookies... Behandle informasjonskapsler… - + Manage stored network cookies Behandle lagrede nettverksinformasjonskapsler - + Normal Messages Normale meldinger - + Information Messages Informasjonsmeldinger - + Warning Messages Advarselsmeldinger - + Critical Messages Kritiske meldinger - + &Log &Logg - + &Exit qBittorrent Avslutt qBittorr&ent - + &Suspend System &Sett system i hvilemodus - + &Hibernate System Sett system i &dvalemodus - + S&hutdown System Sl&å av system - + &Disabled &Deaktivert - + &Statistics &Statistikk - + Check for Updates Se etter oppdateringer - + Check for Program Updates Se etter programoppdateringer - + &About &Om - + &Pause Sett på &pause - + &Delete &Slett - + P&ause All Sett alt på p&ause - + &Add Torrent File... Legg til torrent&fil… - + Open Åpne - + E&xit &Avslutt - + Open URL Åpne nettadresse - + &Documentation &Dokumentasjon - + Lock Lås - - - + + + Show Vis - + Check for program updates Se etter programoppdateringer - + Add Torrent &Link... Legg til torrent&lenke… - + If you like qBittorrent, please donate! Send noen kroner hvis du liker qBittorrent. - - + Execution Log Utførelseslogg - + Clear the password Fjern passordet - + Filter torrent list... Filtrer torrentliste… - + &Set Password &Sett passord - - Preferences - Innstillinger - - - + &Clear Password &Fjern Passord - + Transfers Overføringer - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Filtilknytning for torrenter - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent er ikke forvalgt program for åpning av hverken torrentfiler eller magnetlenker. Vil du tilknytte qBittorrent med disse? - + Icons Only Kun ikoner - + Text Only Kun tekst - + Text Alongside Icons Tekst ved siden av ikoner - + Text Under Icons Tekst under ikoner - + Follow System Style Følg systemsøm - - - + + + UI lock password Låsingspassord for brukergrensesnitt - - - + + + Please type the UI lock password: Skriv låsingspassordet for brukergrensesnittet: - + The password should contain at least 3 characters Passordet bør inneholde minst 3 tegn - + Password update Oppdatering av passord - + The UI lock password has been successfully updated Låsingspassordet for brukergrensesnittet har blitt oppdatert - + Are you sure you want to clear the password? Er du sikker på at du vil fjerne passordet? - - Use regular expressions - - - - + Search Søk - + Transfers (%1) Overføringer (%1) - + Error Feil - + Failed to add torrent: %1 Kunne ikke legge til torrent: %1 - + Torrent added Torrent lagt til - + '%1' was added. e.g: xxx.avi was added. '%1' ble lagt til. - + Download completion Nedlastingsfullførelse - + I/O Error i.e: Input/Output Error - Inn/ut-datafeil + Inn- ut-datafeil - + Recursive download confirmation Rekursiv nedlastingsbekreftelse - + Yes Ja - + No Nei - + Never Aldri - + Global Upload Speed Limit Global grense for opplastingshastighet - + Global Download Speed Limit Global grense for nedlastingshastighet - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent ble nettopp oppdatert og trenger å bli omstartet for at forandringene skal tre i kraft. - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - Noen filer overføres for øyeblikket. - - - - Are you sure you want to quit qBittorrent? - Er du sikker på at du vil avslutte qBittorrent? - - - + &No &Nei - + &Yes &Ja - + &Always Yes &Alltid Ja - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter Gammel Python-fortolker - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. Din Python-versjon (%1) er utdatert. Oppgrader til siste versjon for at søkemotorene skal virke. Minimumskrav: 2.7.9 / 3.3.0. - + qBittorrent Update Available qBittorrent-oppdatering tilgjengelig - + + A new version is available. +Do you want to download %1? + Ny versjon er tilgjengelig. +Vil du laste ned %1? + + + Already Using the Latest qBittorrent Version Bruker allerede siste qBittorrent-versjon - + Undetermined Python version Ubestemt Python-versjon - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. '%1' er ferdig nedlastet. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. Reason: disk is full. - En Inn/ut-datafeil oppstod for torrenten '%1'. + En Inn- ut-datafeil oppstod for torrenten '%1'. Grunn: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? Torrenten '%1' inneholder torrentfiler, vil du fortsette nedlastingen av dem? - + Couldn't download file at URL '%1', reason: %2. Kunne ikke laste ned fil på nettadressen: '%1', Grunn: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin Python funnet i %1: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + Kunne ikke bestemme din Python-versjon (%1). Søkemotor avskrudd. + + + + Missing Python Interpreter Manglende Python-fortolker - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Python kreves for å bruke søkemotoren, men det synes ikke å være installert. Vil du installere det nå? - + Python is required to use the search engine but it does not seem to be installed. Python kreves for å bruke søkemotoren, men det synes ikke å være installert. - - A new version is available. - En ny versjon er tilgjengelig. - - - - Do you want to download %1? - - - - - Open changelog... - Åpne endringslogg... - - - + No updates available. You are already using the latest version. Ingen oppdateringer tilgjengelig. Du bruker allerede den siste versjonen. - + &Check for Updates &Se etter oppdateringer - + Checking for Updates... Ser etter oppdateringer… - + Already checking for program updates in the background Ser allerede etter programoppdateringer i bakgrunnen - + Python found in '%1' Python funnet i '%1' - + Download error Nedlastingsfeil - + Python setup could not be downloaded, reason: %1. Please install it manually. Python-oppsett kunne ikke lastes ned, grunn: %1. Installer det manuelt. - - + + Invalid password Ugyldig passord - - - + + RSS (%1) Nyhetsmating (%1) - + URL download error Nedlastingsfeil for nettadressen - + The password is invalid Passordet er ugyldig - - + + DL speed: %1 e.g: Download speed: 10 KiB/s ↓-hastighet: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s ↑-hastighet: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [↓: %1, ↑: %2] qBittorrent %3 - + Hide Skjul - + Exiting qBittorrent Avslutter qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Noen filer overføres for øyeblikket. +Er du sikker på at du vil avslutte qBittorrent? + + + Open Torrent Files Åpne torrentfiler - + Torrent Files Torrentfiler - + Options were saved successfully. Alternativene ble lagret. @@ -3127,52 +2786,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. Din dynamiske DNS ble oppdatert. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Dynamisk DNS-feil: Tjenesten er midlertidlig utilgjengelig. Nytt forsøk om 30 minutter. - + Dynamic DNS error: hostname supplied does not exist under specified account. Dynamisk DNS-feil: Oppgitt vertsnavn eksisterer ikke under angitt konto. - + Dynamic DNS error: Invalid username/password. Dynamisk DNS-feil: Ugyldig brukernavn eller passord. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Dynamisk DNS-feil: qBittorrent ble svartelistet av tjenesten. Rapporter som feil på http://bugs.qbittorrent.org - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Dynamisk DNS-feil: %1 ble returnert av tjenesten. Rapporter som feil hos http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Dynamisk DNS-feil: Brukernavnet ditt ble blokkert på grunn av misbruk. - + Dynamic DNS error: supplied domain name is invalid. Dynamisk DNS-feil: Oppgitt domenenavn er ugyldig. - + Dynamic DNS error: supplied username is too short. Dynamisk DNS-feil: Oppgitt brukernavn er for kort. - + Dynamic DNS error: supplied password is too short. Dynamisk DNS-feil: Oppgitt passord er for kort. @@ -3180,1413 +2839,1303 @@ Net::DownloadHandler - + I/O Error - Inn/ut-datafeil + Inn- ut-datafeil - + The file size is %1. It exceeds the download limit of %2. Filstørrelsen er %1. Det overskrider nedlastingsgrensen på %2. - + Unexpected redirect to magnet URI. Uforventet omadressering til magnet-oppsettsadresse. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - + + + GeoIP database loaded. Type: %1. Build time: %2. + GeoIP-database innlastet. Type: %1. Byggetid: %2. - - The remote server closed the connection prematurely, before the entire reply was received and processed - + + + Couldn't load GeoIP database. Reason: %1 + Kunne ikke laste inn GeoIP-database. Grunn: %1 - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - Ukjent feil - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - GeoIP-database innlastet. Type: %1. Byggetid: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - Kunne ikke laste inn GeoIP-database. Grunn: %1 - - - + Venezuela, Bolivarian Republic of Venezuela, Den Bolivianske Rebublikken - + Viet Nam Vietnam - - + + N/A Ikke tilgjengelig - + Andorra Andorra - + United Arab Emirates Forente Arabiske Emirater, De - + Afghanistan Afghanistan - + Antigua and Barbuda Antigua og Barbuda - + Anguilla Anguilla - + Albania Albania - + Armenia Armenia - + Angola Angola - + Antarctica Antarktis - + Argentina Argentina - + American Samoa Amerikansk Samoa - + Austria Østerrike - + Australia Australia - + Aruba Aruba - + Azerbaijan Aserbajdsjan - + Bosnia and Herzegovina Bosnia og Hercegovina - + Barbados Barbados - + Bangladesh Bangladesh - + Belgium Belgia - + Burkina Faso Burkina Faso - + Bulgaria Bulgaria - + Bahrain Bahrain - + Burundi Burundi - + Benin Benin - + Bermuda Bermuda - + Brunei Darussalam Brunei Darussalam - + Brazil Brasil - + Bahamas Bahamas - + Bhutan Bhutan - + Bouvet Island Bouvetøya - + Botswana Botswana - + Belarus Hviterussland - + Belize Belize - + Canada Canada - + Cocos (Keeling) Islands Kokosøyene - + Congo, The Democratic Republic of the Kongo, Den Demokratiske Republikken - + Central African Republic Sentralafrikanske Republikk, Den - + Congo Kongo - + Switzerland Sveits - + Cook Islands Cookøyene - + Chile Chile - + Cameroon Kamerun - + China Kina - + Colombia Colombia - + Costa Rica Costa Rica, Republikken - + Cuba Kuba - + Cape Verde Kapp Verde - + Curacao Curacao - + Christmas Island Christmasøya - + Cyprus Kypros - + Czech Republic Tsjekkia - + Germany Tyskland - + Djibouti Djibouti - + Denmark Danmark - + Dominica Dominica - + Dominican Republic Dominikanske Republikk, Den - + Algeria Algerie - + Ecuador Ecuador - + Estonia Estland - + Egypt Egypt - + Western Sahara Vest-Sahara - + Eritrea Eritrea - + Spain Spania - + Ethiopia Etiopia - + Finland Finland - + Fiji Fiji - + Falkland Islands (Malvinas) Falklandsøyene - + Micronesia, Federated States of Mikronesia - + Faroe Islands Færøyene - + France Frankrike - + Gabon Gabon - + United Kingdom Storbritannia - + Grenada Grenada - + Georgia Georgia - + French Guiana Fransk Guyana - + Ghana Ghana - + Gibraltar Gibraltar - + Greenland Grønland - + Gambia Gambia - + Guinea Guinea - + Guadeloupe Guadeloupe - + Equatorial Guinea Ekvatorial-Guinea - + Greece Hellas - + South Georgia and the South Sandwich Islands Sør-Georgia og Sør-Sandwichøyene - + Guatemala Guatemala - + Guam Guam - + Guinea-Bissau Guinea-Bissau - + Guyana Guyana - + Hong Kong Hongkong - + Heard Island and McDonald Islands Heard- og McDonaldøyene - + Honduras Honduras - + Croatia Kroatia - + Haiti Haiti - + Hungary Ungarn - + Indonesia Indonesia - + Ireland Irland - + Israel Israel - + India India - + British Indian Ocean Territory Britiske Territoriet i Indiahavet, Det - + Iraq Irak - + Iran, Islamic Republic of Iran, Den Islamske Republikken - + Iceland Island - + Italy Italia - + Jamaica Jamaica - + Jordan Jordan - + Japan Japan - + Kenya Kenya - + Kyrgyzstan Kirgisistan - + Cambodia Kambodsja - + Kiribati Kiribati - + Comoros Komorene - + Saint Kitts and Nevis Saint Kitts og Nevis - + Korea, Democratic People's Republic of Nord-Korea - + Korea, Republic of Sør-Korea - + Kuwait Kuwait - + Cayman Islands Caymanøyene - + Kazakhstan Kasakhstan - + Lao People's Democratic Republic Laofolkets Demokratiske Folkerepublikk - + Lebanon Libanon - + Saint Lucia Saint Lucia - + Liechtenstein Liechtenstein - + Sri Lanka Sri Lanka - + Liberia Liberia - + Lesotho Lesotho - + Lithuania Litauen - + Luxembourg Luxembourg - + Latvia Latvia - + Morocco Marokko - + Monaco Monaco - + Moldova, Republic of Moldova - + Madagascar Madagaskar - + Marshall Islands Marshalløyene - + Mali Mali - + Myanmar Myanmar - + Mongolia Mongolia - + Northern Mariana Islands Nord-Marianene - + Martinique Martinique - + Mauritania Mauritania - + Montserrat Montserrat - + Malta Malta - + Mauritius Mauritius - + Maldives Maldivene - + Malawi Malawi - + Mexico Mexico - + Malaysia Malaysia - + Mozambique Mosambik - + Namibia Namibia - + New Caledonia Ny-Caledonia - + Niger Niger - + Norfolk Island Norfolkøya - + Nigeria Nigeria - + Nicaragua Nicaragua - + Netherlands Nederland - + Norway Norge - + Nepal Nepal - + Nauru Nauru - + Niue Niue - + New Zealand New Zealand - + Oman Oman - + Panama Panama - + Peru Peru - + French Polynesia Fransk Polynesia - + Papua New Guinea Papua Ny-Guinea - + Philippines Filippinene - + Pakistan Pakistan - + Poland Polen - + Saint Pierre and Miquelon Saint-Pierre og Miquelon - + Puerto Rico Puerto Rico - + Portugal Portugal - + Palau Palau - + Paraguay Paraguay - + Qatar Qatar - + Reunion Réunion - + Romania Romania - + Russian Federation Russiske Føderasjon, Den - + Rwanda Rwanda - + Saudi Arabia Saudi-Arabia - + Solomon Islands Salomonøyene - + Seychelles Seychellene - + Sudan Sudan - + Sweden Sverige - + Singapore Singapore - + Slovenia Slovenia - + Svalbard and Jan Mayen Svalbard og Jan Mayen - + Slovakia Slovakia - + Sierra Leone Sierra Leone - + San Marino San Marino - + Senegal Senegal - + Somalia Somalia - + Suriname Surinam - + Sao Tome and Principe São Tomé og Príncipe - + El Salvador El Salvador - + Syrian Arab Republic Syria, Den Arabiske Republikk - + Swaziland Swaziland - + Turks and Caicos Islands Turks- og Caicosøyene - + Chad Tsjad - + French Southern Territories Franske Sørterritorier, De - + Togo Togo - + Thailand Thailand - + Tajikistan Tadsjikistan - + Tokelau Tokelau - + Turkmenistan Turkmenistan - + Tunisia Tunisia - + Tonga Tonga - - Could not decompress GeoIP database file. - Kunne ikke pakke ut GeoIP-database-fil. - - - + Timor-Leste Øst-Timor - + Bolivia, Plurinational State of Bolivia, Den Multinasjonale Staten - + Bonaire, Sint Eustatius and Saba Bonaire, Sint Eustatius og Saba - + Cote d'Ivoire Elfenbenskysten - + Libya Libya - + Saint Martin (French part) Saint Martin (Fransk del) - + Macedonia, The Former Yugoslav Republic of Makedonia, Den Tidligere Jugoslaviske Republikken - + Macao Macao - + Pitcairn Pitcairn - + Palestine, State of Palestina, Staten - + Saint Helena, Ascension and Tristan da Cunha Saint Helena, Ascension og Tristan da Cunha - + South Sudan Sør-Sudan - + Sint Maarten (Dutch part) Sint Maarten (Nederlandsk del) - + Turkey Tyrkia - + Trinidad and Tobago Trinidad og Tobago - + Tuvalu Tuvalu - + Taiwan Taiwan - + Tanzania, United Republic of Tanzania, Den Forente Republikken - + Ukraine Ukraina - + Uganda Uganda - + United States Minor Outlying Islands USAs Ytre Småøyer - + United States USA - + Uruguay Uruguay - + Uzbekistan Usbekistan - + Holy See (Vatican City State) Hellige Stol, Den (Vatikanstaten) - + Saint Vincent and the Grenadines Saint Vincent og Grenadinene - + Virgin Islands, British Jomfruøyene, De Britiske - + Virgin Islands, U.S. Jomfruøyene, De Amerikanske. - + Vanuatu Vanuatu - + Wallis and Futuna Wallis og Futuna - + Samoa Samoa - + Yemen Jemen - + Mayotte Mayotte - + Serbia Serbia - + South Africa Sør-Afrika - + Zambia Zambia - + Montenegro Montenegro - + Zimbabwe Zimbabwe - + Aland Islands Åland - + Guernsey Guernsey - + Isle of Man Isle of Man - + Jersey Jersey - + Saint Barthelemy Saint-Barthélemy - + + Could not uncompress GeoIP database file. + Kunne ikke pakke ut GeoIP-database-fil. + + + Couldn't save downloaded GeoIP database file. Kunne ikke lagre nedlastet GeoIP-database-fil. - + Successfully updated GeoIP database. GeoIP-database oppdatert. - + Couldn't download GeoIP database file. Reason: %1 Kunne ikke laste ned GeoIP-database-fil. Grunn: %1 @@ -4594,12 +4143,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] UPnP- / NAT-PMP -støtte [PÅ] - + UPnP / NAT-PMP support [OFF] UPnP- / NAT-PMP -støtte [AV] @@ -4607,7 +4156,7 @@ Net::Smtp - + Email Notification Error: E-post-varslingsfeil: @@ -4615,1279 +4164,1077 @@ OptionsDialog - + Options Alternativer - + Behavior Oppførsel - + Downloads Nedlastinger - + Connection Tilkobling - + Speed Hastighet - + BitTorrent BitTorrent - - RSS - Nyhetsmating (RSS) - - - + Web UI Nettgrensesnitt - + Advanced Avansert - + Language Språk - + User Interface Language: Brukergrensesnittsspråk: - + (Requires restart) (Krever omstart) - + Transfer List Overføringsliste - + Confirm when deleting torrents Bekreft ved sletting av torrenter - + Use alternating row colors In transfer list, one every two rows will have grey background. Bruk alternerende rekkefarger - + Hide zero and infinity values Skjul null- og uendelighets -verdier - + Always Alltid - + Paused torrents only Kun torrenter satt på pause - + Action on double-click Handling ved dobbelklikk - + Downloading torrents: Nedlastende torrenter: - - + + Start / Stop Torrent Start / stopp torrent - - + + Open destination folder Åpne målmappe - - + + No action Ingen handling - + Completed torrents: Fullførte torrenter: - + Desktop Skrivebord - + Start qBittorrent on Windows start up Start qBittorrent ved Windows-oppstart - + Show splash screen on start up Vis velkomstskjerm ved oppstart - + Start qBittorrent minimized Start qBittorrent minimert - + Confirmation on exit when torrents are active Bekreftelse ved programavslutning når torrenter er aktive - + Confirmation on auto-exit when downloads finish Bekreftelse ved auto-programavslutning når nedlastinger er ferdige - - KiB - KiB - - - - Email notification &upon download completion - Epost-varsling &ved nedlastingsfullførelse - - - - Run e&xternal program on torrent completion - Kjør e&ksternt program ved ferdigstillelse av torrenter - - - - IP Fi&ltering - IP-fil&trering - - - - Schedule &the use of alternative rate limits - Planlegg &bruken av alternative hastighetsgrenser - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Mer informasjon</a>) - - - - &Torrent Queueing - &Torrentkødanning - - - - Seed torrents until their seeding time reaches - Del torrenter til delingstiden deres når - - - - A&utomatically add these trackers to new downloads: - A&utomatisk legg disse sporerne til nye nedlastinger: - - - - RSS Reader - Nyhetsmatingsleser (RSS) - - - - Enable fetching RSS feeds - Skru på innhenting av RSS-informasjonskanaler - - - - Feeds refresh interval: - Oppdateringsintervall for nyhetsmatinger: - - - - Maximum number of articles per feed: - Maksimalt antall artikler per mating: - - - - - min - minutes - min - - - - RSS Torrent Auto Downloader - Automatisk RSS-informasjonskanalsnedlaster - - - - Enable auto downloading of RSS torrents - Skru på automatisk nedlasting av RSS-torrenter - - - - Edit auto downloading rules... - Rediger automatiske nedlastingsregler… - - - - Web User Interface (Remote control) - Nettbrukergrenesnitt (fjernkontroll) - - - - IP address: - IP-adresse: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - IP-adresse som vevgrensesnittet binder seg til. -Angi en IPv4- eller IPv6-adresse. Du kan oppgi "0.0.0.0" for enhver IPv4-adresse, -"::" for enhver IPv6-adresse, eller "*" for både IPv4 og IPv6. - - - - Server domains: - Tjenerdomener: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - Hvitliste for filtrering av HTTP-vertshodeverdier. -For å kunne beskytte mot DNS-ombindingsangrep, -burde du skrive inn domenenavn brukt av vevgrensesnitttjeneren. - -Bruk ";" for å splitte flerfoldige oppføringer. Jokertegnet "*" kan brukes. - - - - &Use HTTPS instead of HTTP - &Bruk HTTPS istedenfor HTTP - - - - Bypass authentication for clients on localhost - Omgå autentisering for klienter på lokalvert - - - - Bypass authentication for clients in whitelisted IP subnets - Omgå autentisering for klienter i hvitlistede IP-subnett - - - - IP subnet whitelist... - Hvitliste for IP-subnett… - - - - Upda&te my dynamic domain name - Oppda&ter mitt dynamiske domenenavn + + Show qBittorrent in notification area + Vis qBittorrent i varslingsområdet - + Minimize qBittorrent to notification area Minimer qBittorrent til varslingsområdet - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. Send qBittorrent til varslingsområdet ved lukking - + Tray icon style: Stil for systemkurvsikon: - + Normal Normal - + Monochrome (Dark theme) Monokromt (mørk drakt) - + Monochrome (Light theme) Monokromt (lys drakt) - + File association Filtilknytning - + Use qBittorrent for .torrent files Bruk qBittorrent for .torrent-filer - + Use qBittorrent for magnet links Bruk qBittorrent for magnetlenker - + Power Management Strømstyring - + + Inhibit system sleep when torrents are active + Hindre systemhvile når torrenter er aktive + + + + Log file + Loggfil + + + Save path: Lagringssti - + Backup the log file after: Sikkerhetskopier loggfilen etter: - + + MB + MB + + + Delete backup logs older than: Slett sikkerhetskopi av loggføring eldre enn: - + days Delete backup logs older than 10 months dager - + months Delete backup logs older than 10 months måneder - + years Delete backup logs older than 10 years år - + When adding a torrent Når en torrent legges til - + + Display torrent content and some options + Vis torrentinnhold og noen alternativer + + + Bring torrent dialog to the front Hent torrentdialog til forgrunnen - + Do not start the download automatically The torrent will be added to download list in pause state Ikke start nedlastingen automatisk - + Should the .torrent file be deleted after adding it Skal .torrent-filen slettes etter å ha blitt lagt til - + + Delete .torrent files afterwards + Slett .torrent-filer etterpå + + + Also delete .torrent files whose addition was cancelled - Slett .torrent-filer som hvis tillegg i listen ble avbrutt samtidig + Slett også .torrent-filer som fikk sitt tillegg i listen avbrutt - + Also when addition is cancelled Også når tillegging blir avbrutt - + Warning! Data loss possible! Advarsel! Datatap mulig! - + Saving Management Lagringsbehandling - + Default Torrent Management Mode: Forvalgt torrentbehandlingsmodus: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category Automatisk modus betyr at diverse torrent-egenskaper (f.eks. lagringsmappe) vil bli bestemt av tilknyttet kategori - + Manual Manuell - + Automatic Automatisk - + When Torrent Category changed: Når torrentkategori endres: - + Relocate torrent Omplasser torrent - + Switch torrent to Manual Mode Bytt torrent til manuell modus - + When Default Save Path changed: Når forvalgt lagringsmappe endres: - - + + Relocate affected torrents Omplasser berørte torrenter - - + + Switch affected torrents to Manual Mode Bytt berørte torrenter til manuell modus - + When Category changed: Når kategori endres: - + Use Subcategories Bruk underkategorier - + Default Save Path: Forvalgt lagringsmappe: - + Keep incomplete torrents in: Behold ufullstendige torrenter i: - + Copy .torrent files to: Kopier .torrent-filer til: - - Show &qBittorrent in notification area - Vis &qBittorrent i varslingsområdet - - - - &Log file - &Loggfil - - - - Display &torrent content and some options - Vis &torrentinnhold og noen alternativer - - - - Create subfolder for torrents with multiple files - Opprett undermappe for torrenter med flerfoldige filer - - - - De&lete .torrent files afterwards - Sl&ett .torrent-filer etterpå - - - + Copy .torrent files for finished downloads to: Kopier .torrent-filer for fullførte nedlastinger til: - + Pre-allocate disk space for all files Forhåndstildel diskplass for alle filer - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding - - - - + Append .!qB extension to incomplete files Tilføy .!qB benevnelse for ikke-fullførte filer - - Enable recursive download dialog - - - - + Automatically add torrents from: Legg automatisk til torrenter fra: - + Add entry Legg til oppføring - + Remove entry Fjern oppføring - + + Email notification upon download completion + E-post-varsling ved nedlastingsfullførelse + + + + Destination email: + Mål for e-post: + + + SMTP server: SMTP-tjener: - + This server requires a secure connection (SSL) Denne tjeneren krever en sikker tilkobling (SSL) - - + + + Authentication Autentisering - - - - + + + + Username: Brukernavn: - - - - + + + + Password: Passord: - - Enabled protocol: - Aktivert protokoll: + + Run external program on torrent completion + Kjør eksternt program ved ferdigstillelse av torrenter - - TCP and μTP - TCP og μTP - - - + Listening Port Lytteport - + Port used for incoming connections: Port brukt for innkommende tilkoblinger: - + Random Tilfeldig - + Use UPnP / NAT-PMP port forwarding from my router Bruk UPnP / NAT-PMP port-videresending fra min ruter - + Use different port on each startup Bruk ny port ved hver oppstart - + Connections Limits Tilkoblingsgrenser - + Maximum number of connections per torrent: Maksimalt antall tilkoblinger per torrent: - + Global maximum number of connections: Globalt maksimumsantall for tilkoblinger: - + Maximum number of upload slots per torrent: Maksimalt antall opplastingsåpninger per torrent: - + Global maximum number of upload slots: Globalt maksimumsantall for opplastingsåpninger: - + Proxy Server Mellomtjener - + Type: Type: - + (None) (Ingen) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Vert: - - + + Port: Port: - + Otherwise, the proxy server is only used for tracker connections Ellers blir mellomtjeneren bare brukt til sporertilkoblinger - + Use proxy for peer connections Bruk mellomtjener for likemannstilkoblinger - + Disable connections not supported by proxies Skru av tilkoblinger som ikke støttes av mellomtjenere - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Mer informasjon</a>) - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection Direkte tilkobling for RSS-informasjonsstrømmer, søkemotor, programvareoppdateringer, eller hva som helst annet enn torrentoverføringer og relaterte operasjoner (som likemennsutvekslinger) - + Use proxy only for torrents Bruk mellomtjener kun for torrenter - - A&uthentication - Id&entitetsbekreftelse - - - + Info: The password is saved unencrypted Info: Passordet er lagret ukryptert - + + IP Filtering + IP-filtrering + + + Filter path (.dat, .p2p, .p2b): Filtermappe (.dat, .p2p, .p2b): - + Reload the filter Last inn filteret på nytt - - Manually banned IP addresses... - Manuelt bannlyste IP-adresser… - - - + Apply to trackers Bruk for sporere - + Global Rate Limits - Globale hastighetsgrenser - - - - - - - - - KiB/s - KiB/s + Globale forholdsgrenser - - + + Upload: Opplasting: - - + + + + + KiB/s + KiB/s + + + + Download: Nedlasting: - + Alternative Rate Limits - Alternative hastighetsgrenser + Alternative forholdsgrenser + + + + Schedule the use of alternative rate limits + Planlegg bruken av alternative forholdsgrenser - - + From: from (time1 to time2) Fra: - - + To: time1 to time2 Til: - + When: Når: - + Every day Hver dag - + Weekdays Ukedager - + Weekends Helger - + Rate Limits Settings - Innstillinger for hastighetsgrenser + Innstillinger for forholdsgrenser - + Apply rate limit to peers on LAN - Bruk hastighetsgrense for likemenn på lokalnett + Bruk forholdsgrense for likemenn på lokalnett - + Apply rate limit to transport overhead - Bruk hastighetsgrense for transportering av tilleggsdata + Bruk forholdsgrense for transportering av tilleggsdata - - + + + Enable µTP protocol + Aktiver µTP-protokoll + + + Apply rate limit to µTP protocol - Bruk hastighetsgrense for µTP-protokoll + Bruk forholdsgrense for µTP-protokoll - + Privacy Personvern - + Enable DHT (decentralized network) to find more peers Aktiver DHT (desentralisert nettverk) for å finne flere likemenn - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Utveksle likemenn med kompatible Bittorrent-klienter (µTorrent, Vuze, …) - + Enable Peer Exchange (PeX) to find more peers Skru på likemennsutveksling (PeX) for å finne flere likemenn - + Look for peers on your local network Se etter likemenn i ditt lokalnettverk - + Enable Local Peer Discovery to find more peers Aktiver lokal likemannsoppdaging for å finne flere likemenn - + Encryption mode: Krypteringsmodus: - + Prefer encryption Foretrekk kryptering - + Require encryption Krev kryptering - + Disable encryption Deaktiver kryptering - + Enable when using a proxy or a VPN connection Aktiver ved bruk av mellomtjener eller en VPN-tilkobling - + Enable anonymous mode Aktiver anonymitetsmodus - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Mer informasjon</a>) + + + + Torrent Queueing + Torrent-kødannelse + + + Maximum active downloads: Maksimalt antall aktive nedlastinger: - + Maximum active uploads: Maksimalt antall aktive opplastinger: - + Maximum active torrents: Maksimalt antall aktive torrenter: - + Do not count slow torrents in these limits Ikke ta med trege torrenter i regnskapet for disse grensene - - Upload rate threshold: - - - - - Download rate threshold: - - - - - sec - seconds - sek - - - - Torrent inactivity timer: - - - - + Share Ratio Limiting Delingsforholdsbegrensning - + Seed torrents until their ratio reaches Del torrenter til forholdet deres når - + then deretter - + Pause them Sett dem på pause - + Remove them Fjern dem - - RSS Smart Episode Filters - + + Automatically add these trackers to new downloads: + Legg disse sporerne til nye nedlastinger automatisk: + + + + Enable Web User Interface (Remote control) + Aktiver nettbrukergrenesnitt (fjernkontroll) - + Use UPnP / NAT-PMP to forward the port from my router Bruk UPnP / NAT-PMP for å videresende porten fra min ruter - + + Use HTTPS instead of HTTP + Bruk HTTPS istedenfor HTTP + + + Certificate: Sertifikat: - + Import SSL Certificate Importer SSL-sertifikat - + Key: Nøkkel: - + Import SSL Key Importer SSL-nøkkel - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Informasjon om sertifikater</a> - - Use alternative Web UI - - - - - Files location: - - - - - Enable clickjacking protection - + + Bypass authentication for localhost + Omgå autentisering for lokalvert - - Enable Cross-Site Request Forgery (CSRF) protection - + + Update my dynamic domain name + Oppdater mitt dynamiske domenenavn - + Service: Tjeneste: - + Register Registrer - + Domain name: Domenenavn: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! Ved å aktivere disse alternativene kan du miste dine .torrent-filer <strong>for godt</strong>! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well Når disse alternativene er aktivert vil qBittorrent <strong>slette</strong> .torrentfiler etter at de har blitt vellykket (det første alternativet), eller ikke (det andre alternativet), lagt til nedlastingskøen. Dette vil bli brukt <strong>ikke bare</strong> for filer åpnet via meny-handlingen &ldquo;Legg til torrent&rdquo;, men også for dem som blir åpnet via filtypetilknytning - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog Hvis du aktiverer det andre alternativet (&ldquo;Også når tillegging blir avbrutt&rdquo;) vil .torrent-filen <strong>bli slettet</strong> selv om du trykker &ldquo;<strong>Avbryt</strong>&rdquo; i &ldquo;Legg til torrent&rdquo;-dialogen - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): Støttede parametre (forskjell på små og store bokstaver): - + %N: Torrent name %N: Torrentnavn - + %L: Category %L: Kategori - - %G: Tags (seperated by comma) - - - - + %F: Content path (same as root path for multifile torrent) %F: Innholdsmappe (samme som rotmappe for flerfilstorrenter) - + %R: Root path (first torrent subdirectory path) %R: Rotmappe (første underkatalogsmappe for torrenter) - + %D: Save path %D: Lagringsmappe - + %C: Number of files %C: Antall filer - + %Z: Torrent size (bytes) %Z: Torrentstørrelse (Byte) - + %T: Current tracker %T: Nåværende sporer - + %I: Info hash %I: Informativ sjekksum - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") Tips: Innkapsle parameter med anførselstegn for å unngå at teksten blir avskåret ved mellomrom (f.eks., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor Velg mappe å overvåke - + Folder is already being monitored: Mappen er allerede under overvåkning: - + Folder does not exist: Mappen eksisterer ikke: - + Folder is not readable: Mappen er ikke lesbar: - + Adding entry failed Tillegg av oppføring mislyktes - - - - + + Choose export directory Velg eksporteringskatalog - - - + + + + + + Choose a save directory Velg en lagringskatalog - + Choose an IP filter file Velg en IP-filterfil - + All supported filters Alle støttede filter - + SSL Certificate SSL-stertifikat - + + SSL Key + SSL-nøkkel + + + Parsing error Tolkningsfeil - + Failed to parse the provided IP filter Kunne ikke tolke oppgitt IP-filter - + Successfully refreshed Oppdatert - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Oppgitte IP-filteret tolket: %1 regler lagt til. - + Invalid key Ugyldig nøkkel - + This is not a valid SSL key. Dette er ikke en gyldig SSL-nøkkel. - + Invalid certificate Ugyldig sertifikat - - Preferences - Innstillinger - - - - Import SSL certificate - Importer SSL-sertifikat - - - + This is not a valid SSL certificate. Dette er ikke et gyldig SSL-sertifikat. - - Import SSL key - Importer SSL-nøkkel - - - - SSL key - SSL-nøkkel - - - + Time Error Tidsfeil - + The start time and the end time can't be the same. Start- og slutt -tidspunktet kan ikke være det samme. - - + + Length Error Lengdefeil - + The Web UI username must be at least 3 characters long. Brukernavn for nettbrukergrensesnittet må være minst 3 tegn. - + The Web UI password must be at least 6 characters long. Passordet for nettbrukergrensesnittet må være minst 6 tegn. @@ -5895,72 +5242,72 @@ PeerInfo - - Interested(local) and Choked(peer) - interessert(lokal) og kvalt(delktaker) + + interested(local) and choked(peer) + interessert(lokal) og kvalt(likemann) - + interested(local) and unchoked(peer) interessert(lokal) og avkvalt(likemann) - + interested(peer) and choked(local) interessert(likemann) og kvalt(lokal) - + interested(peer) and unchoked(local) interessert(likemann) og ukvalt(lokal) - + optimistic unchoke optimistisk avkvelning - + peer snubbed likemann avbrutt - + incoming connection innkommende tilkobling - + not interested(local) and unchoked(peer) ikke interessert(lokal) og avkvalt(likemann) - + not interested(peer) and unchoked(local) ikke interessert(likemann) og ukvalt(lokal) - + peer from PEX likemann fra PEX - + peer from DHT likemann fra DHT - + encrypted traffic kryptert trafikk - + encrypted handshake kryptert håndtrykk - + peer from LSD likemann fra LSD @@ -5968,193 +5315,178 @@ PeerListWidget - + IP IP - + Port Port - + Flags Flagg - + Connection Tilkobling - + Client i.e.: Client application Klient - + Progress i.e: % downloaded Framdrift - + Down Speed i.e: Download speed Ned-hastighet - + Up Speed i.e: Upload speed Opp-hastighet - + Downloaded i.e: total data downloaded Nedlastet - + Uploaded i.e: total data uploaded Opplastet - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Relevans - + Files i.e. files that are being downloaded right now Filer - + Column visibility - Kolonnesynlighet + Kolonne-synlighet - + Add a new peer... Legg til ny likemann… - - + + Ban peer permanently Bannlys likemann for godt - + Manually adding peer '%1'... Legger til likemann manuelt '%1'… - + The peer '%1' could not be added to this torrent. Likemannen '%1 kunne ikke bli lagt til denne torrenten. - + Manually banning peer '%1'... Bannlyser likemann manuelt '%1'… - - + + Peer addition Tillegg av likemenn - + Country Land - + Copy IP:port Kopier IP:port - + Some peers could not be added. Check the Log for details. Noen likemenn kunne ikke legges til. Sjekk loggen for detaljer. - + The peers were added to this torrent. Likemennene ble lagt til denne torrenten. - + Are you sure you want to ban permanently the selected peers? Er du sikker på at du vil bannlyse valgte likemenn for godt? - + &Yes &Ja - + &No &Nei - PeersAdditionDialog - - - Add Peers - Legg til likemenn - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - + PeersAdditionDlg - + No peer entered - + Ingen likemann angitt - + Please type at least one peer. - + Oppgi minst én likemann. - + Invalid peer - + Ugyldig likemann - + The peer '%1' is invalid. - + Likemannen '%1' er ugyldig. PieceAvailabilityBar - + White: Unavailable pieces Hvitt: Utilgjengelige deler - + Blue: Available pieces Blått: Tilgjengelige deler @@ -6162,337 +5494,293 @@ PiecesBar - + Files in this piece: Filer i denne biten: - + File in this piece Fil i denne biten: - + File in these pieces Fil i disse bitene: - - Wait until metadata become available to see detailed information - Vent til metadata blir tilgjengelig for å se detaljert informasjon - - - + Hold Shift key for detailed information Hold Shift-tasten for detaljert informasjon - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Programtillegg for søk - + Installed search plugins: - + Installerte søke-programtillegg: - + Name Navn - + Version Versjon - + Url - + Nettadresse - - + + Enabled - + Påskrudd - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - Advarsel: Pass på å overholde landets opphavsrettslover når du laster ned torrenter fra noen av disse søkemotorene. - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - Du kan få nye søkemotormoduler her: <a href="http://plugins.qbittorrent.org"> -http://plugins.qbittorrent.org</a> + Du kan skaffe nye søkemotor-programtillegg her: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Installer et nytt - + Check for updates Se etter oppdateringer - + Close - + Lukk - + Uninstall Avinstaller - - - + + + Yes Ja - - - - + + + + No Nei - + Uninstall warning - + Avinstalleringsadvarsel - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Noen programtillegg kunne ikke avinstalleres, siden de er inkludert i qBittorrent. Kun de du har lagt til selv kan avinstalleres. +De programtilleggene ble avskrudd. - + Uninstall success - + Avinstallert - + All selected plugins were uninstalled successfully - + Alle valgte programtillegg avinstallert - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - - - - - + + New search engine plugin URL - + Ny nettadresse for søkemotor-programtillegg - - + + URL: - + Nettadresse: - + Invalid link - + Ugyldig lenke - + The link doesn't seem to point to a search engine plugin. - + Lenken ser ikke ut til å peke til et søkemotor-programtillegg. - + Select search plugins - + Velg programtillegg for søk - + qBittorrent search plugin - + qBittorrent søke-programtillegg + + + + + + Search plugin update + Oppdatering av søke-programtillegg - + All your plugins are already up to date. - + Alle programtillegg er allerede oppdatert. - + Sorry, couldn't check for plugin updates. %1 - + Klarte ikke å se etter nye programtilleggsoppdateringer. %1 - + + + Search plugin install - + Installering av søke-programtillegg + + + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + "%1" søkemotor-programtillegg installert. - + Couldn't install "%1" search engine plugin. %2 - + Kunne ikke installere "%1" søkemotor-programtillegg. %2 + + + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + "%1" søkemotor-programtillegg ble oppdatert. - + Couldn't update "%1" search engine plugin. %2 - + Kunne ikke oppdatere "%1" søkemotor-programtillegg. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Programtilleggskilde - + Search plugin source: - + Kilde for søke-programtillegg: - + Local file - + Lokal fil - + Web link - - - - - PowerManagement - - - qBittorrent is active - qBittorrent er aktiv + Nettlenke - PreviewSelectDialog - - - Preview - Forhåndsvis - + PreviewSelect - + Name Navn - + Size Størrelse - + Progress - Fremdrift + Framdrift - - + + Preview impossible Forhåndsvisning er ikke mulig - - + + Sorry, we can't preview this file Kan ikke forhåndsvise denne filen - Private::FileLineEdit - - - '%1' does not exist - '%1' finnes ikke - - - - '%1' does not point to a directory - '%1' peker ikke på en mappe - - - - '%1' does not point to a file - '%1' peker ikke på en fil - - - - Does not have read permission in '%1' - Har ikke lesetilgang til '%1' - - - - Does not have write permission in '%1' - Har ikke skrivetilgang til '%1' - - - PropListDelegate - + Not downloaded Ikke nedlastet - - + + Normal Normal (priority) Normal - - N/A - Ikke tilgjengelig - - - + Do not download Do not download (priority) - Ikke last ned + Ikke last ned - - + + High High (priority) Høy - + N/A + Ikke tilgjengelig + + + Mixed Mixed (priorities Blandet - - + + Maximum Maximum (priority) Maksimal @@ -6501,32 +5789,32 @@ PropTabBar - + General Generelt - + Trackers Sporere - + Peers Likemenn - + HTTP Sources HTTP-kilder - + Content Innhold - + Speed Hastighet @@ -6620,22 +5908,22 @@ Kommentar: - + Select All Velg alle - + Select None Fravelg alt - + Normal Normal - + High Høy @@ -6695,165 +5983,165 @@ Lagringsmappe: - + Maximum Maksimal + - Do not download Ikke last ned - + Never Aldri - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (har %3) - - + + %1 (%2 this session) %1 (%2 denne økta) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (delt i %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 maks) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 totalt) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 gj.sn.) - + Open Åpne - + Open Containing Folder Åpne innholdende mappe - + Rename... Gi nytt navn… - + Priority Prioritet - + New Web seed Ny nettdeler - + Remove Web seed Fjern nettdeler - + Copy Web seed URL Kopier adresse for nettdeler - + Edit Web seed URL Rediger adresse for nettdeler - + + Rename the file + Gi fil nytt navn + + + New name: Nytt navn: - - + + + The file could not be renamed + Kunne ikke gi fila nytt navn + + + + This file name contains forbidden characters, please choose a different one. + Dette filnavnet inneholder forbudte tegn, velg noe annet. + + + + This name is already in use in this folder. Please use a different name. Dette navnet er allerede i bruk i denne mappen. Velg et annet navn. - + The folder could not be renamed Kunne ikke gi mappa nytt navn - + qBittorrent qBittorrent - + Filter files... Filtrer filer… - - Renaming - Gir nytt navn - - - - - Rename error - Feil ved tildeling av nytt navn - - - - The name is empty or contains forbidden characters, please choose a different one. - Navnet er tomt eller inneholder forbudte tegn, velg noe annet. - - - + New URL seed New HTTP source Ny nettadressedeler - + New URL seed: Ny nettadressedeler - - + + This URL seed is already in the list. Denne nettadressedeleren er allerede i listen. - + Web seed editing Nettdeler-redigering - + Web seed URL: Nettdeleradresse: @@ -6861,230 +6149,117 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + IP-adressen din har blitt bannlyst etter for mange mislykkede autentiseringsforsøk. + + + + Error: '%1' is not a valid torrent file. + + Feil: '%1' er ikke en gyldig torrentfil. + + + + + Error: Could not add torrent to session. + Feil: Kunne ikke legge torrent til økt. + + + + I/O Error: Could not create temporary file. + Inn- ut -datafeil: Kunne ikke opprette midlertidig fil. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 er et ukjent kommandolinje-parameter. - - + + %1 must be the single command line parameter. %1 må være det enkle kommandolinje-parametret. - + + %1 must specify the correct port (1 to 65535). + %1 må spesifisere den rette porten (1 tilogmed 65535). + + + You cannot use %1: qBittorrent is already running for this user. Du kan ikke bruke %1: qBittorrent kjører allerede for denne brukeren. - + Usage: Bruk: - + Options: Alternativer: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - Parameteret '%1' må følge syntaksen '%1=%2' - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - Parameteret '%1' må følge syntaksen '%1=%2' - - - - Expected integer number in environment variable '%1', but got '%2' - Forventet heltall i miljøvariabel '%1', men fikk '%2' - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - Parameteret '%1' må følge syntaksen '%1=%2' - - - - Expected %1 in environment variable '%2', but got '%3' - Forventet %1 i miljøvariabel '%2', men fikk '%3' - - - - port - port - - - - %1 must specify a valid port (1 to 65535). - %1 må spesifisere en gyldig port (1 til 65535). - - - - Display program version and exit - Vis programversjon og avslutt + + Displays program version + Viser programversjon - - Display this help message and exit - Vis denne hjelpemeldingen og avslutt + + Displays this help message + Viser denne hjelpemeldingen - - Change the Web UI port - Endre nettbrukergrensesnittets port + + Changes the Web UI port (current: %1) + Forandrer nettbrukergrensesnitt-porten (nåværende: %1) - + Disable splash screen Skru av velkomstskjerm - + Run in daemon-mode (background) Kjør i nissemodus (bakgrunn) - - dir - Use appropriate short form or abbreviation of "directory" - kat. - - - - Store configuration files in <dir> - Lagre oppsettsfiler i <dir> - - - - - name - navn - - - - Store configuration files in directories qBittorrent_<name> - Lagre oppsettsfiler i mapper qBittorrent_<name> - - - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Hack inn i libtorrents hurtigopptakelsesfiler og gjør filstier relative til profilmappen - - - - files or URLs - filer eller URL-er - - - - Download the torrents passed by the user - Last ned torrenter godkjent av brukeren - - - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Angi hvorvidt dialogvinduet "Legg til ny torrent" åpnes når en torrent legges til. - - - - Options when adding new torrents: - Valg ved tillegg av nye torrenter: - - - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Snarvei for %1 - - - - path - sti - - - - Torrent save path - Torrentlagringssti - - - - Add torrents as started or paused - Legg til torrenter som startet eller pauset - - - - Skip hash check - Hopp over verifiseringssjekk - - - - Assign torrents to category. If the category doesn't exist, it will be created. - Tildel torrenter til kategori. Hvis kategorien ikke finnes vil den bli opprettes. - - - - Download files in sequential order - Last ned filer i sekvensiell rekkefølge - - - - Download first and last pieces first - Last ned de første og siste delene først - - - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - Valgbare verdier kan angis via miljøvariabler. For valget ved navn "parameter-name" er miljøvariabelen "QBT_PARAMETER_NAME" (med store bokstaver "-" erstattet med "_". For å sende flaggverdier, sett variabelen til "1" eller "TRUE". For eksempel for å skru av oppstartsskjermen: - - - - Command line parameters take precedence over environment variables - Kommandolinjeparameter overstyrer miljøvariabler + + Downloads the torrents passed by the user + Laster ned torrentene gitt av brukeren - + Help Hjelp - + Run application with -h option to read about command line parameters. Kjør programmet med -h flagg for å lese om kommandolinje-parametre. - + Bad command line Dårlig kommandolinje - + Bad command line: Dårlig kommandolinje: - + Legal Notice Juridisk notis - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - qBittorrent er et fildelingsprogram. Når du driver en torrent, blir dataene gjort tilgjengelig for andre ved hjelp av opplasting. Alt innhold du deler, er ditt eget ansvar. - - - - No further notices will be issued. - - - - + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. No further notices will be issued. @@ -7093,353 +6268,432 @@ Ingen flere notiser vil bli gitt. - + Press %1 key to accept and continue... Trykk %1-tasten for å akseptere og fortsette… - + Legal notice Juridisk notis - + Cancel Avbryt - + I Agree Jeg samtykker - - - Upgrade - Oppgrader + + Torrent name: %1 + Torrentnavn: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - Du oppdaterte fra en eldre versjon som lagret ting annerledes. Du må gå over til det nye lagringssystemet. Du vil ikke kunne bruke en eldre versjon enn v3.3.0 igjen. Fortsett? [J/N] + + Torrent size: %1 + Torrentstørrelse: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - Du oppdaterte fra en eldre versjon som lagret ting annerledes. Du må gå over til det nye lagringssystemet. Hvis du fortsetter vil du ikke kunne bruke en eldre versjon enn v3.3.0 igjen. + + Save path: %1 + Lagringsmappe: %1 - - Couldn't migrate torrent with hash: %1 - Kunne ikke flytte torrent med sjekksum: %1 + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Torrenten ble lastet ned til %1. - - Couldn't migrate torrent. Invalid fastresume file name: %1 - Kunne ikke flytte torrent. Ugyldig filnavn for hurtig gjenopptakelse: %1 + + Thank you for using qBittorrent. + Takk for at du bruker qBittorrent. - - Detected unclean program exit. Using fallback file to restore settings: %1 - + + [qBittorrent] '%1' has finished downloading + [qBittorrent] '%1' er ferdig nedlastet - - An access error occurred while trying to write the configuration file. - Tilgangsfeil ved skriving til oppsettsfila. + + The remote host name was not found (invalid hostname) + Fjernvertsnavnet ble ikke funnet (ugyldig vertsnavn) - - A format error occurred while trying to write the configuration file. - Formatfeil ved skriving til oppsettsfila. + + The operation was canceled + Operasjonen ble avbrutt - - An unknown error occurred while trying to write the configuration file. - + + The remote server closed the connection prematurely, before the entire reply was received and processed + Fjerntjeneren stengte forbindelsen for tidlig, før hele svaret ble mottatt og behandlet - - - RSS::AutoDownloader - - - Invalid data format. - Ugyldig dataformat. + + The connection to the remote server timed out + Tidsavbrudd i forbindelse til fjerntjener - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - - + + SSL/TLS handshake failed + SSL- TLS-håndtrykk mislyktes + - - Invalid data format - + + The remote server refused the connection + Fjerntjeneren avslo forbindelsen - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - + + The connection to the proxy server was refused + Forbindelsen til mellomtjeneren ble avslått - - Couldn't load RSS AutoDownloader rules. Reason: %1 - + + The proxy server closed the connection prematurely + Mellomtjeneren stengte forbindelsen for tidlig - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - + + The proxy host name was not found + Mellomtjenernavnet ble ikke funnet - - RSS feed at '%1' updated. Added %2 new articles. - + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Enten tidsabrudd i forbindelsen til mellomtjener eller inget svar på send forespørsel i tide fra mellomtjener - - Failed to parse RSS feed at '%1'. Reason: %2 - + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Mellomtjeneren krever autentisering for å godta forespørselen, men avslo alle de oppgitte referansene - - Couldn't read RSS Session data from %1. Error: %2 - + + The access to the remote content was denied (401) + Tilgang til fjerninnholdet ble avslått (401) - - Couldn't parse RSS Session data. Error: %1 - + + The operation requested on the remote content is not permitted + Operasjonen forespurt utført på fjerninnholdet er ikke tillatt - - Couldn't load RSS Session data. Invalid data format. - + + The remote content was not found at the server (404) + Fjerninnholdet ble ikke funnet hos tjeneren (404) - - Couldn't load RSS article '%1#%2'. Invalid data format. - + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Fjerntjeneren krever autentisering for å servere innholdet, men de oppgitte referansene ble ikke akseptert - - - RSS::Private::Parser - - Invalid RSS feed. - Ugyldig RSS-informasjonskanal. + + The Network Access API cannot honor the request because the protocol is not known + Nettverktilgangens applikasjonsprogrammeringsgrensesnitt kan ikke godta forespørselen, fordi protokollen ikke er kjent - - %1 (line: %2, column: %3, offset: %4). - %1 (linje: %2, kolonne: %3, forskyvning: %4). + + The requested operation is invalid for this protocol + Forespurt operasjon er ugyldig for denne protokollen + + + + An unknown network-related error was detected + Ukjent nettverksrelatert feil oppdaget + + + + An unknown proxy-related error was detected + Ukjent mellomtjenerrelatert feil oppdaget + + + + An unknown error related to the remote content was detected + Ukjent feil relatert til fjerninnholdet oppdaget + + + + A breakdown in protocol was detected + Sammenbrudd i protokollen oppdaget + + + + Unknown error + Ukjent feil + + + + + Upgrade + Oppgrader - - - RSS::Session - - RSS feed with given URL already exists: %1. - RSS-informasjonskanal med angitt nettadresse finnes allerede: %1|. + + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] + Du oppdaterte fra en eldre versjon som lagret ting annerledes. Du må gå over til det nye lagringssystemet. Du vil ikke kunne bruke en eldre versjon enn v3.3.0 igjen. Fortsett? [J/N] - - Cannot move root folder. - Kan ikke flytte rotmappe. + + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. + Du oppdaterte fra en eldre versjon som lagret ting annerledes. Du må gå over til det nye lagringssystemet. Hvis du fortsetter vil du ikke kunne bruke en eldre versjon enn v3.3.0 igjen. - - - Item doesn't exist: %1. - Elementet finnes ikke: %1 + + Couldn't migrate torrent with hash: %1 + Kunne ikke flytte torrent med sjekksum: %1 - - Cannot delete root folder. - Kan ikke slette rotmappe. + + Couldn't migrate torrent. Invalid fastresume file name: %1 + Kunne ikke flytte torrent. Ugyldig filnavn for hurtig gjenopptakelse: %1 - - Incorrect RSS Item path: %1. - Uriktig nyhetsmatingselemetsti: %1. + + Detected unclean program exit. Using fallback file to restore settings. + Oppdaget uren programavsluttning. Bruker reservefil for å gjenopprette innstillinger. - - RSS item with given path already exists: %1. - RSS-informasjonskanal med angitt sti finnes allerede: %1|. + + An access error occurred while trying to write the configuration file. + Tilgangsfeil ved skriving til oppsettsfila. - - Parent folder doesn't exist: %1. - Overnevnte mappe finnes ikke: %1 + + A format error occurred while trying to write the configuration file. + Formatfeil ved skriving til oppsettsfila. - RSSWidget + RSS - + Search Søk - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - Automatisk henting av RSS-informasjonskanaler er skrudd av nå. Du kan skru det på i programinnstillingene. - - - + New subscription Nytt abonnement - - - + + + Mark items read Marker ting som lest - - Refresh RSS streams - Oppdater nyhetsmatingsdataflyt - - - + Update all Oppdater alle - + RSS Downloader... Nyhetsmatingsnedlaster… - + + Settings... + Innstillinger… + + + Torrents: (double-click to download) Torrenter: (dobbel-klikk for å laste ned) - - + + Delete Slett - + Rename... Gi nytt navn… - + Rename Gi nytt navn - - + + Update Oppdater - + New subscription... Nytt abonnement… - - + + Update all feeds Oppdater alle matinger - + Download torrent Last ned torrent - + Open news URL Åpne nyhetsnettadresse - + Copy feed URL Kopier matingsnettadresse - + New folder... - Ny mappe…| + Ny mappe… + + + + Refresh RSS streams + Oppdater nyhetsmatingsdataflyt + + + + RSSImp + + + Stream URL: + Dataflytsnettadresse: + + + + Please type a RSS stream URL + Skriv inn en nettadresse for nyhetsmatingsdataflyt + + + + This RSS feed is already in the list. + Denne nyhetsmatingen er allerede i listen. - + Please choose a folder name Velg et mappenavn - + Folder name: Mappenavn: - + New folder Ny mappe - - Please type a RSS feed URL - Skriv inn nyhetsmatingens nettadresse - - - - Feed URL: - Nyhetsmatingsnettadresse: - - - + Deletion confirmation Slettingsbekreftelse - + Are you sure you want to delete the selected RSS feeds? Er du sikker på at du vil slette de valgte nyhetsmatingene? - + Please choose a new name for this RSS feed Velg et nytt navn for denne nyhetsmatingen - + New feed name: Nytt matingsnavn: - - Rename failed - Tildeling av nytt navn mislyktes + + Name already in use + Navn allerede i bruk + + + + This name is already used by another item, please choose another one. + Dette navnet brukes allerede av en annen gjenstand, velg noe annet. - + Date: Dato: - + Author: - Utvikler: + Utvikler: + + + + Unread + Ulest + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + Automatisk nedlasting %1 fra %2 nyhetsmating mislyktes, fordi den ikke inneholder en torrent eller en magnetlenke… + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + Laster ned '%1' torrent automatisk fra '%2' nyhetsmating… + + + + Rss::Private::Parser + + + Invalid RSS feed. + Ugyldig RSS-informasjonskanal. + + + + RssSettingsDlg + + + RSS Reader Settings + Innstillinger for nyhetsmatingsleser + + + + RSS feeds refresh interval: + Oppdateringsintervall for nyhetsmating: + + + + min + min + + + + Maximum number of articles per feed: + Maksimalt antall artikler per mating: ScanFoldersDelegate - + Select save location Velg lagringsplassering @@ -7447,274 +6701,268 @@ ScanFoldersModel - + Monitored Folder Overvåket mappe - + Override Save Location Overstyr lagringsplassering - + Monitored folder Overvåket mappe - + Default save location Forvalgt lagringsplass - + Browse... Bla gjennom… - SearchJobWidget + SearchEngine - - Form - Skjema + + Unknown search engine plugin file format. + Ukjent programtilleggs-filformat for søkemotor. - - Results(xxx) - + + A more recent version of this plugin is already installed. + En nyere versjon av dette programtillegget er allerede installert. - - Search in: - + + + Plugin is not supported. + Programtillegget er ikke støttet. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - + + Update server is temporarily unavailable. %1 + Oppdateringstjeneren er midlertidlig utilgjengelig. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - + + + Failed to download the plugin file. %1 + Nedlasting av programtilleggsfilen mislyktes. %1 - - Seeds: - Delere: + + An incorrect update info received. + Feilaktig oppdateringsinfo mottatt. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - + + All categories + Alle kategorier - - - to - til + + Movies + Filmer - - <html><head/><body><p>Maximal number of seeds</p></body></html> - + + TV shows + TV-forestillinger - - - - + + Music + Musikk - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + + Games + Spill - - Size: - Størrelse: + + Anime + Anime - - <html><head/><body><p>Minimal torrent size</p></body></html> - + + Software + Programvare - - <html><head/><body><p>Maximal torrent size</p></body></html> - + + Pictures + Bilder + + + + Books + Bøker + + + SearchListDelegate + + + + Unknown + Ukjent + + + + SearchTab - + Name i.e: file name Navn - + Size i.e: file size Størrelse - + Seeders i.e: Number of full sources - Givere + Delere - + Leechers i.e: Number of partial sources - + Sankere - + Search engine Søkemotor - - Filter search results... - - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Resultat (viser <i>%1</i> av <i>%2</i>): - + Torrent names only - + Kun torrentnavn - + Everywhere Overalt - - Use regular expressions - - - - + Searching... - Søker... + Søker… - + Search has finished Søket er ferdig - + Search aborted - + Søk avbrutt - + An error occurred during search... - + En feil oppstod under søket… - + Search returned no results - + Søket returnerte ingen resultat - + Column visibility - Kolonnesynlighet - - - - SearchPluginManager - - - Unknown search engine plugin file format. - - A more recent version of this plugin is already installed. - + + Form + Skjema - - - Plugin is not supported. - + + Results(xxx) + Resultat(xxx) - - All categories - Alle Kategorier + + Search in: + Søk i: - - Movies - Filmer + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Noen søkemotorer søker i torrentbeskrivelsen også i torrent-filnavn. Om slike resultat skal vises i listen nedenfor, kontrolleres av dette moduset.</p><p><span style=" font-weight:600;">Overalt </span>skrur av filtrering og viser derfor alt som blir returnert av søkemotorene.</p><p><span style=" font-weight:600;">Kun torrentnavn</span> viser kun torrenter hvis navn samsvarer med søkeforespørselen.</p></body></html> - - TV shows - TV-serier + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Velg øvre og nedre mengde tillate delere</p></body></html> - - Music - Musikk + + Seeds: + Delere: - - Games - Spill + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Minimum antall delere</p></body></html> - - Anime - Anime + + + to + til - - Software - Programvare + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Maksimalt antall delere</p></body></html> - - - Pictures - Bilder + + + + + - - Books - Bøker + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Sett gyldig størrelsesområde for torrent</p></body></html> - - Update server is temporarily unavailable. %1 - + + Size: + Størrelse: - - - Failed to download the plugin file. %1 - - - - - An incorrect update info received. - + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Minimal torrentstørrelse</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Maksimal torrentstørrelse</p></body></html> @@ -7722,198 +6970,185 @@ - - - - + + + Search Søk - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - Ingen søkeprogramtillegg installert. -Klikk "Søk etter programtillegg…"-knappen nederst til høyre i vinduet for å installere det. - - - + Download Last ned - + Go to description page Gå til beskrivelsesside - + Copy description page URL Kopier nettadresse for beskrivelsesside - + Search plugins... Søk i programtillegg… - + A phrase to search for. Søkefrase. - + Spaces in a search term may be protected by double quotes. Mellomrom i søkebegrep kan være beskyttet av doble anførselstegn. - + Example: Search phrase example Eksempel: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>: søk etter <b>foo</b> og <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: søk etter <b>foo bar</b> - + All plugins Alle programtillegg - + Only enabled Kun aktiverte - + Select... Velg… - - - + + + Search Engine Søkemotor - + Please install Python to use the Search Engine. Installer Python for å bruke søkemotoren. - + Empty search pattern Tom søkestreng - + Please type a search pattern first Skriv en søkestreng først - + Stop Stopp - + Search has finished Søket er ferdig - + Search has failed Søket mislyktes - ShutdownConfirmDialog - - - Don't show again - Ikke vis igjen - + ShutdownConfirmDlg - + qBittorrent will now exit. - + qBittorrent vil nå avslutte. - + E&xit Now - + &Avslutt nå - + Exit confirmation - + Avslutningbekreftelse - + The computer is going to shutdown. - Datamaskinen kommer til å slå av. + Datamaskinen vil slås av. - + &Shutdown Now - - - - - Shutdown confirmation - + &Slå av nå - + The computer is going to enter suspend mode. - + Datamaskinen vil gå i hvilemodus. - + &Suspend Now - + Gå i &hvile nå - + Suspend confirmation - + Hvilebekreftelse - + The computer is going to enter hibernation mode. - + Datamaskinen vil gå i dvalemodus. - + &Hibernate Now - + &Dvalgang nå. - + Hibernate confirmation - + Dvalebekreftelse - + You can cancel the action within %1 seconds. - + Du kan avbryte handlingen innen %1 sekunder. + + + + Shutdown confirmation + Avslåingsbekreftelse SpeedLimitDialog - + KiB/s KiB/s @@ -7921,52 +7156,52 @@ SpeedPlotView - + Total Upload Total opplastet - + Total Download Total nedlastet - + Payload Upload Nytteopplasting - + Payload Download Nyttenedlasting - + Overhead Upload Tilleggsdata-opplasting - + Overhead Download Tilleggsdata-nedlasting - + DHT Upload DHT-opplasting - + DHT Download DHT-nedlasting - + Tracker Upload Sporer-opplasting - + Tracker Download Sporer-nedlasting @@ -7974,95 +7209,87 @@ SpeedWidget - + Period: Periode: - + 1 Minute ett minutt - + 5 Minutes fem minutter - + 30 Minutes 30 Minutter - + 6 Hours seks timer - + Select Graphs Velg grafer - + Total Upload Total opplastet - + Total Download Total nedlastet - + Payload Upload Nyttelast-opplasting - + Payload Download Nyttelast-nedlasting - + Overhead Upload Tilleggsdata-opplasting - + Overhead Download Tilleggsdata-nedlasting - + DHT Upload DHT-opplasting - + DHT Download DHT-nedlasting - + Tracker Upload Sporer-opplasting - + Tracker Download Sporer-nedlasting - StacktraceDialog - - - Crash info - Krasj info - - - StatsDialog @@ -8075,49 +7302,49 @@ Brukerstatistikk - - Cache statistics - Hurtiglager-statistikk + + Total peer connections: + Totalt antall tilkoblinger fra likemenn: - - Read cache hits: - Treff i lesehurtiglager: + + Global ratio: + Globalt forhold: - - Average time in queue: - Gjennomsnittlig tid i kø: + + Alltime download: + Nedlasting gjennom alle tider: - - Connected peers: - + + Alltime upload: + Opplasting gjennom alle tider: - - All-time share ratio: - + + Total waste (this session): + Totalt ødslet (denne økta): - - All-time download: - + + Cache statistics + Hurtiglager-statistikk - - Session waste: - + + Read cache hits: + Treff i lesehurtiglager: - - All-time upload: - + + Average time in queue: + Gjennomsnittlig tid i kø: - Total buffer size: - + Total buffers size: + Total mellomlagerstørrelse: @@ -8145,7 +7372,12 @@ Total køstørrelse: - + + OK + OK + + + %1 ms 18 milliseconds %1 ms @@ -8154,27 +7386,32 @@ StatusBar - + Connection status: Tilkoblingsstatus: - + No direct connections. This may indicate network configuration problems. Ingen direkte tilkoblinger. Dette kan indikere problemer med nettverksoppsettet. - + DHT: %1 nodes DHT: %1 noder - - qBittorrent needs to be restarted! - qBittorrent må startes på nytt. + + qBittorrent needs to be restarted + qBittorrent behøver omstart + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent ble nettopp oppdatert og trenger omstart for at forandringene skal trå i kraft. @@ -8193,1566 +7430,1311 @@ Tilkoblet - + Click to switch to alternative speed limits Klikk for å bytte til alternative hastighetsgrenser - + Click to switch to regular speed limits Klikk for å bytte til vanlige hastighetsgrenser - + + Manual change of rate limits mode. The scheduler is disabled. + Manuell forandring av forholdsgrense-modus. Planleggeren er avskrudd. + + + Global Download Speed Limit Global hastighetsavgrensning for nedlastinger - + Global Upload Speed Limit Global hastighetsavgrensning for opplastinger - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter Alle (0) - + Downloading (0) Laster ned (0) - + Seeding (0) - + Deler (0) - + Completed (0) Fullførte (0) - + Resumed (0) - + Gjenopptatte (0) - + Paused (0) - + Satt på pause (0) - + Active (0) Aktive (0) - + Inactive (0) - + Inaktive (0) - + Errored (0) - + Feilede (0) - + All (%1) Alle (%1) - + Downloading (%1) - + Laster ned (%1) - + Seeding (%1) - + Deler (%1) - + Completed (%1) - + Fullførte (%1) - + Paused (%1) - + Satt på pause (%1) - + Resumed (%1) - + Gjenopptatte (%1) - + Active (%1) - + Aktive (%1) - + Inactive (%1) - + Inaktive (%1) - + Errored (%1) - + Feilede (%1) - TagFilterModel + TorrentContentModel - - Tags - Etiketter + + Name + Navn - - All - Alle + + Size + Størrelse - - Untagged - Umerket + + Progress + Framdrift - - - TagFilterWidget - - Add tag... - Legg til etikett… + + Download Priority + Nedlastingsprioritet - - Remove tag - Fjern etikett + + Remaining + Gjenstående + + + TorrentCreatorDlg - - Remove unused tags - Fjern ubrukte etiketter + + Select a folder to add to the torrent + Velg en mappe som skal legges til torrenten - - Resume torrents - Gjenoppta torrenter + + Select a file to add to the torrent + Velg en fil som skal legges til torrenten - - Pause torrents - Sett torrenter på pause + + No input path set + Ingen mappe for inndata fastsatt - - Delete torrents - Slett torrenter + + Please type an input path first + Velg mappe for inndata først - - New Tag - Ny etikett + + Select destination torrent file + Velg torrent-målfil - - Tag: - Etikett: + + Torrent Files (*.torrent) + Torrentfiler (*.torrent) - - Invalid tag name - Ugyldig etikettnavn + + Torrent was created successfully: %1 + %1 is the path of the torrent + Torrent ble opprettet med hell: %1 - - Tag name '%1' is invalid - Etikettnavnet '%1' er ugyldig + + + + Torrent creation + Torrentopprettelse - - Tag exists - Etiketten finnes + + Torrent creation was unsuccessful, reason: %1 + Torrentopprettelse mislyktes, grunn: %1 - - Tag name already exists. - Etikettnavnet finnes allerede. + + Created torrent file is invalid. It won't be added to download list. + Den opprettede torrentfilen er ugyldig. Den vil ikke bli lagt til nedlastingskøen. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Torrentkategoriegenskaper + + Name + i.e: torrent name + Navn - - Name: - Navn: + + Size + i.e: torrent size + Størrelse - - Save path: - Lagringssti: + + Done + % Done + Ferdig - - Choose save path - Velg lagringsmappe + + Status + Torrent status (e.g. downloading, seeding, paused) + Status - - New Category - Ny kategori + + Seeds + i.e. full sources (often untranslated) + Delere - - Invalid category name - Ugyldig kategorinavn + + Peers + i.e. partial sources (often untranslated) + Likemenn - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - Kategorinavn kan ikke inneholde '\'. -Kategorinavn kan ikke starte/slutte med '/'. -Kategorinavn kan ikke inneholde en '//'-sekvens. + + Down Speed + i.e: Download speed + Ned-hastighet - - Category creation error - Kategoriopprettelsesfeil + + Up Speed + i.e: Upload speed + Opp-hastighet - - Category with the given name already exists. -Please choose a different name and try again. - Kategori ved dette navnet finnes allerede. -Velg et annet navn og prøv igjen. + + Ratio + Share ratio + Forhold - - - TorrentContentModel - - Name - Navn + + ETA + i.e: Estimated Time of Arrival / Time left + Gjenværende tid - - Size - Størrelse + + Category + Kategori - - Progress - Framdrift + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Lagt til - - Download Priority - Nedlastingsprioritet + + Completed On + Torrent was completed on 01/01/2010 08:00 + Fullført - - Remaining - Gjenstående + + Tracker + Sporer - - Availability - Tilgjengelighet + + Down Limit + i.e: Download limit + Ned-grense - - - TorrentCreatorDialog - - Torrent Creator - + + Up Limit + i.e: Upload limit + Opp-grense - - Select file/folder to share - + + Downloaded + Amount of data downloaded (e.g. in MB) + Nedlastet - - Path: - + + Uploaded + Amount of data uploaded (e.g. in MB) + Opplastet - - [Drag and drop area] - + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Nedlastet denne økta - - - Select file - Velg fil + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Opplastet denne økta - - - Select folder - Velg mappe + + Remaining + Amount of data left to download (e.g. in MB) + Gjenstående - - Settings - Innstillinger + + Time Active + Time (duration) the torrent is active (not paused) + Aktivitetstid - - Piece size: - + + Save path + Torrent save path + Lagringsmappe - - Auto - Auto + + Completed + Amount of data completed (e.g. in MB) + Fullført - - 16 KiB - + + Ratio Limit + Upload share ratio limit + Forholdsgrense - - 32 KiB - + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Sist sett i fullført tilstand - - 64 KiB - + + Last Activity + Time passed since a chunk was downloaded/uploaded + Siste aktivitet - - 128 KiB - + + Total Size + i.e. Size including unwanted data + Total størrelse + + + TrackerFiltersList - - 256 KiB - - - - - 512 KiB - - - - - 1 MiB - - - - - 2 MiB - - - - - 4 MiB - - - - - 8 MiB - - - - - 16 MiB - - - - - 32 MiB - - - - - Calculate number of pieces: - - - - - Private torrent (Won't distribute on DHT network) - Privat torrent (vil ikke distribueres på DHT-nettverk) - - - - Start seeding immediately - Begynn deling umiddelbart - - - - Ignore share ratio limits for this torrent - - - - - Optimize alignment - - - - - Fields - - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - - - - Web seed URLs: - - - - - Tracker URLs: - - - - - Comments: - Kommentarer: - - - - Source: - Kilde: - - - - Progress: - Framdrift: - - - - Create Torrent - Opprett torrent - - - - - - Torrent creation failed - - - - - Reason: Path to file/folder is not readable. - - - - - Select where to save the new torrent - - - - - Torrent Files (*.torrent) - - - - - Reason: %1 - - - - - Reason: Created torrent is invalid. It won't be added to download list. - - - - - Torrent creator - - - - - Torrent created: - - - - - TorrentInfo - - - File size exceeds max limit %1 - - - - - Torrent file read error: %1 - - - - - Torrent file read error: size mismatch - - - - - TorrentsController - - - Not contacted yet - - - - - Updating... - Oppdaterer… - - - - Working - Virker - - - - Not working - Virker ikke - - - - Error: '%1' is not a valid torrent file. - - - - - - - - Torrent queueing must be enabled - - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - - Cannot make save path - - - - - Cannot write to directory - - - - - WebUI Set location: moving "%1", from "%2" to "%3" - - - - - Incorrect torrent name - - - - - - Incorrect category name - - - - - TrackerFiltersList - - + All (0) this is for the tracker filter Alle (0) - + Trackerless (0) Sporerløse (0) - + Error (0) Feil (0) - + Warning (0) Advarsel (0) - - + + Trackerless (%1) Sporerløse (%1) - - + %1 (%2) + openbittorrent.com (10) + %1 (%2) + + + + Error (%1) Feil (%1) - - + + Warning (%1) Advarsel (%1) - + Resume torrents Gjenoppta torrenter - + Pause torrents Sett torrenter på pause - + Delete torrents Slett torrenter - - + + All (%1) this is for the tracker filter Alle (%1) - TrackerListWidget + TrackerList + + + URL + Nettadresse + + + + Status + Status + + + + Received + + + + + Seeds + Delere + + + + Peers + Likemenn + + + + Downloaded + Nedlastet + + + + Message + Melding + - - + + Working Virker - + Disabled - Avskrudd + Avskrudd - + This torrent is private Denne torrenten er privat - + Updating... - Oppdaterer... + Oppdaterer… - + Not working Virker ikke - + Not contacted yet - + Ikke kontaktet ennå - - - - - - - N/A - Ikke tilgjengelig + + Tracker URL: + Nettadresse til sporer: - + Tracker editing - - - - - Tracker URL: - + Sporer-redigering - - + + Tracker editing failed - + Sporer-redigering mislyktes - + The tracker URL entered is invalid. - + Den oppgitte sporer-nettadressen er ugyldig. - + The tracker URL already exists. - + Sporer-nettadressen finnes allerede. - + Add a new tracker... - - - - - Remove tracker - Fjern sporer + Legg til en ny sporer… - + Copy tracker URL - + Kopier sporer-nettadresse - + Edit selected tracker URL - + Rediger valgt sporer-nettadresse - + Force reannounce to selected trackers - + Tving reannonsering til valgte sporere på ny - + Force reannounce to all trackers - + Tving reannonsering til alle sporere på ny - - URL - Nettadresse - - - - Status - Status - - - - Received - Mottatt - - - - Seeds - - - - - Peers - Likemenn - - - - Downloaded - Nedlastet - - - - Message - - - - - Column visibility - Kolonnesynlighet + + Remove tracker + Fjern sporer - TrackerLoginDialog + TrackersAdditionDlg - - - Tracker authentication - - - - - Tracker: - - - - - Login - Logg Inn - - - - Username: - Brukernavn: - - - - Password: - Passord: + + Trackers addition dialog + Tilleggingsdialog for sporere - - Log in - Logg inn + + List of trackers to add (one per line): + Liste over sporere som skal legges til (én per linje): - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + Nettadresse for µTorrent-kompatibel liste: - - List of trackers to add (one per line): - + + I/O Error + Inn- ut-datafeil - - µTorrent compatible list URL: - + + Error while trying to open the downloaded file. + Feil ved forsøk på å åpne den nedlastede filen. - + No change - + Ingen forandring - + No additional trackers were found. - + Ingen flere sporere ble funnet. - + Download error - Nedlastingsfeil + Nedlastingsfeil - + The trackers list could not be downloaded, reason: %1 - + Listen over sporere kunne ikke lastes ned, grunn: %1 TransferListDelegate - + Downloading Laster ned - + Downloading metadata used when loading a magnet link Laster ned metadata - + Allocating qBittorrent is allocating the files on disk Tildeler - + Paused Satt på pause - + Queued i.e. torrent is queued I kø - + Seeding Torrent is complete and in upload-only mode Deler - + Stalled Torrent is waiting for download to begin Laster ikke ned - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] Laster ned - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] Deler - + Checking Torrent local data is being checked Sjekker - + Queued for checking i.e. torrent is queued for hash checking Plassert i kø for gjennomsjekking - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Sjekker gjenopptakelsesdata - + Completed Fullført - - Moving - Torrent local data are being moved/relocated - Flytting - - - + Missing Files Mangler filer - + Errored torrent status, the torrent has an error Feilet - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (delt i %2) - - - %1 ago - e.g.: 1h 20m ago - %1 siden - - - - TransferListFiltersWidget - - - Status - Status - - - - Categories - Kategorier - - - - Tags - Etiketter - - - - Trackers - Sporere - - - - TransferListModel - - - Name - i.e: torrent name - Navn - - - - Size - i.e: torrent size - Størrelse - - - - Done - % Done - Ferdig - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Status - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - Likemenn - - - - Down Speed - i.e: Download speed - Ned-hastighet - - - - Up Speed - i.e: Upload speed - Opp-hastighet - - - - Ratio - Share ratio - - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - Kategori - - - - Tags - Etiketter - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Nedlastet - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Opplastet - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - Gjenstående - - - - Time Active - Time (duration) the torrent is active (not paused) - - - - - Save path - Torrent save path - - - - - Completed - Amount of data completed (e.g. in MB) - Fullført - - - - Ratio Limit - Upload share ratio limit - + + + %1 ago + e.g.: 1h 20m ago + %1 siden + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + Status - - Last Activity - Time passed since a chunk was downloaded/uploaded - + + Categories + Kategorier - - Total Size - i.e. Size including unwanted data - + + Trackers + Sporere TransferListWidget - + Column visibility Kolonnesynlighet - + Choose save path Velg lagringsmappe - + Torrent Download Speed Limiting Hastighetsbegrensning for torrentnedlasting - + Torrent Upload Speed Limiting Hastighetsbegrensning for torrentopplasting - + Recheck confirmation Bekreftelse av ny gjennomsjekking - + Are you sure you want to recheck the selected torrent(s)? Er du sikker på at du vil sjekke valgte torrent(er) på nytt? - + Rename Gi nytt navn - + New name: Nytt navn: - + Resume Resume/start the torrent Gjenoppta - + Force Resume Force Resume/start the torrent Påtving gjenopptakelse - + Pause Pause the torrent Sett på pause - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Velg plassering: Flytter "%1", fra "%2" til "%3" - - - - Add Tags - Legg til etiketter - - - - Remove All Tags - Fjern alle etiketter - - - - Remove all tags from selected torrents? - Fjern alle etiketter fra valgte torrenter? + + New Category + Ny kategori - - Comma-separated tags: - Kommainndelte etiketter: + + Category: + Kategori: - - Invalid tag - Ugyldig etikett + + Invalid category name + Ugyldig kategorinavn - - Tag name: '%1' is invalid - Etikettnavnet: '%1' er ugyldig + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Kategorinavn kan ikke inneholde '\'. +Kategorinavn kan ikke starte/slutte med '/'. +Kategorinavn kan ikke inneholde '//'-sekvens. - + Delete Delete the torrent Slett - + Preview file... Forhåndsvis fil… - + Limit share ratio... Begrens delingsforhold… - + Limit upload rate... - Begrens opplastingshastighet… + Begrens opplastingsforhold… - + Limit download rate... - Begrens nedlastingshastighet… + Begrens nedlastingsforhold… - + Open destination folder Åpne målmappe - + Move up i.e. move up in the queue Flytt oppover - + Move down i.e. Move down in the queue Flytt nedover - + Move to top i.e. Move to top of the queue Flytt til toppen - + Move to bottom i.e. Move to bottom of the queue Flytt til bunnen - + Set location... - Velg plassering… - - - - Force reannounce - Tvubg reabbibserubg + Sett plassering… - + Copy name Kopier navn - - Copy hash - Kopier sjekksum - - - + Download first and last pieces first Last ned de første og siste delene først - + Automatic Torrent Management Automatisk torrentbehandling - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category Automatisk modus betyr at diverse torrent-egenskaper (f.eks. lagringsmappe) vil bli bestemt av tilknyttet kategori - + Category Kategori - + New... New category... Ny… - + Reset Reset category Tilbakestill - - Tags - Etiketter - - - - Add... - Add / assign multiple tags... - Legg til… - - - - Remove All - Remove all tags - Fjern alle - - - + Priority Prioritet - + Force recheck Påtving ny gjennomsjekk - + Copy magnet link Kopier magnetlenke - + Super seeding mode Superdelingsmodus - + Rename... Gi nytt navn… - + Download in sequential order Last ned i rekkefølge - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + Forholdsbegrensning for torrent-opp-/ned-lasting - - Use global share limit - + + Use global ratio limit + Bruk global forholdsgrense - - - + + + buttonGroup - + knappegruppe - - Set no share limit - + + Set no ratio limit + Fri forholdsgrense - - Set share limit to - + + Set ratio limit to + Sett forholdsgrensen til + + + WebApplication - - ratio - + + Incorrect category name + Feilaktig kategorinavn + + + WebUI - - minutes - + + The Web UI is listening on port %1 + Nettbrukergrensesnittet lytter til port %1 - - No share limit method selected - + + Web UI Error - Unable to bind Web UI to port %1 + Nettbrukergrensesnitt-feil - Ikke i stand til å binde nettbrukergrensesnitt til port %1 + + + about - - Please select a limit method first - + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + En avansert BitTorrent-klient, programmert i C++, basert på Qt-verktøyssettet og libtorrent-rasterbar. + + + + Copyright %1 2006-2016 The qBittorrent project + Kopirett %1 2006-2016 qBittorrent-prosjektet + + + + Home Page: + Hjemmeside: + + + + Forum: + Forum: + + + + Bug Tracker: + Feilsporer: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - + + Add Peers + Legg til likemenn - - Python not detected - + + List of peers to add (one per line): + Liste over likemenn som skal legges til (én per linje): + + + + Format: IPv4:port / [IPv6]:port + Format: IPv4:port / [IPv6]:port - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - + + + Tracker authentication + Sporerautentisering - - Symlinks inside alternative UI folder are forbidden. - + + Tracker: + Sporer: - - Exceeded the maximum allowed file size (%1)! - + + Login + Innlogging - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - + + Username: + Brukernavn: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - + + Password: + Passord: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - + + Log in + Logg inn - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - + + Cancel + Avbryt - WebUI + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + Slettingsbekreftelse - qBittorrent + + + + Remember choice + Husk valg + + + + Also delete the files on the hard disk + Slett også filene på harddisken + + + + confirmShutdownDlg + + + Don't show again + Ikke vis igjen + + + + createTorrentDialog - - Web UI: HTTPS setup successful - Vevgrensesnitt: HTTPS satt opp + + Cancel + Avbryt + + + + Torrent Creation Tool + Torrentopprettelsesverktøy + + + + Torrent file creation + Torrentfilopprettelse + + + + Add file + Legg til fil + + + + Add folder + Legg til mappe + + + + File or folder to add to the torrent: + Fil eller mappe som skal legges til torrenten: + + + + Tracker URLs: + Sporer-nettadresser: + + + + Web seeds urls: + Nettdeleradresser: + + + + Comment: + Kommentar: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Du kan dele opp sporerlag / grupper med en tom linje. + + + + Piece size: + Delstørrelse: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + Auto + + + + Private (won't be distributed on DHT network if enabled) + Privat (vil ikke bli forstyrret på DHT-nettverk hvis aktivert) + + + + Start seeding after creation + Start deling etter opprettelse + + + + Ignore share ratio limits for this torrent + Ignorer delingsforholdsbegrensninger for denne torrenten + + + + Create and save... + Opprett og lagre… + + + + Progress: + Framdrift: + + + + downloadFromURL + + + Add torrent links + Legg til torrentlenker + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Én per linje (HTTP-lenker, magnetlenker og informative verifiseringsnøkler er støttet) + + + + Download + Last ned + + + + Cancel + Avbryt + + + + Download from urls + Last ned fra nettadresser - - Web UI: HTTPS setup failed, fallback to HTTP - Vevgrensesnitt: HTTPS oppsett mislyktes, faller tilbake til HTTP + + No URL entered + Ingen nettadresse oppgitt - - Web UI: Now listening on IP: %1, port: %2 - Vevgrensesnitt: Lytter nå på IP: %1, port: %2 + + Please type at least one URL. + Skriv minst én nettadresse. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Vevgrensesnitt: Ikke i stand til å binde til IP: %1, port: %2. Grunn: %3 + + Crash info + Krasjinfo fsutils - + + + + + Downloads Nedlastinger @@ -9760,100 +8742,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + Python ikke oppdaget + + + + Python version: %1 + Pythonversjon: %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1t %2m - + %1d %2h e.g: 2days 10hours %1d %2t - + Unknown Unknown (size) Ukjent - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent vil nå slå av datamaskinen fordi alle nedlastinger er fullført. - + < 1m < 1 minute < 1m - + %1m e.g: 10minutes %1m + + + Working + Virker + + + + Updating... + Oppdaterer… + + + + Not working + Virker ikke + + + + Not contacted yet + Ikke kontaktet ennå + preview - + Preview selection Forhåndsvis utvalg - + The following files support previewing, please select one of them: Følgende filer støtter forhåndsvisning, velg en av dem: + + + Preview + Forhåndsvis + + + + Cancel + Avbryt + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_nl.ts qbittorrent-3.3.15/src/lang/qbittorrent_nl.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_nl.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_nl.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent Over qBittorrent - + About Over - + Author Auteur - - Current maintainer - Huidige beheerder - - - - Greece - Griekenland - - - - + + Nationality: Nationaliteit: - - + + + Name: + Naam: + + + + E-mail: E-mail: - - - Name: - Naam: + + Greece + Griekenland - - Original author - Oorspronkelijke auteur + + Current maintainer + Huidige beheerder - - France - Frankrijk + + Original author + Oorspronkelijke auteur - + Special Thanks Speciale dank - + Translators Vertalers - - License - Licentie - - - + Libraries Bibliotheken - + qBittorrent was built with the following libraries: qBittorrent werd gebouwd met de volgende bibliotheken: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - Een geavanceerde BitTorrent-client geprogrammeerd in C++, gebaseerd op Qt-toolkit en libtorrent-rasterbar. - - - - Copyright %1 2006-2018 The qBittorrent project - Auteursrecht %1 2006-2018 het qBittorrent-project - - - - Home Page: - Homepagina: - - - - Forum: - Forum: + + France + Frankrijk - - Bug Tracker: - Bug-tracker: + + License + Licentie @@ -115,57 +90,67 @@ Opslaan op - + + Browse... + Bladeren... + + + + Set as default save path + Instellen als standaard pad om op te slaan + + + Never show again Niet opnieuw weergeven - + Torrent settings Torrent-instellingen - + Set as default category Instellen als standaardcategorie - + Category: Categorie: - + Start torrent Torrent starten - + Torrent information Torrent-informatie - + Skip hash check Hash-check overslaan - + Size: Grootte: - + Hash: Hash: - + Comment: Opmerkingen: - + Date: Datum: @@ -190,117 +175,89 @@ Automatisch - - Remember last used save path - Laatst gebruikte opslagpad onthouden - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - Indien aangevinkt zal het torrentbestand niet verwijderd worden ondanks de instellingen op de "download"-pagina van het opties-venster. + Indien aangevinkt zal het .torrent-bestand niet verwijderd worden ondanks de instellingen op de "download"-pagina van het opties-venster. - + Do not delete .torrent file Torrentbestand niet verwijderen - - Create subfolder - Submap aanmaken - - - - Download in sequential order - In sequentiële volgorde downloaden - - - - Download first and last pieces first - Eerste en laatste deeltjes eerst downloaden - - - + Normal Normaal - + High Hoog - + Maximum Maximum - + Do not download Niet downloaden - - - + + + I/O Error I/O-fout - + Invalid torrent Ongeldige torrent - - Renaming - Naam wijzigen - - - - - Rename error - Fout bij naam wijzigen + + + + + Already in download list + Reeds in downloadlijst - - The name is empty or contains forbidden characters, please choose a different one. - De naam is leeg of bevat verboden tekens. Gelieve een andere te kiezen. - - - + Not Available This comment is unavailable Niet beschikbaar - + Not Available This date is unavailable Niet beschikbaar - + Not available Niet beschikbaar - + Invalid magnet link Ongeldige magneetlink - + The torrent file '%1' does not exist. Torrentbestand '%1' bestaat niet. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. Het torrentbestand '%1' kan niet van de schijf gelezen worden. U heeft waarschijnlijk niet genoeg rechten. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ Fout: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torrent staat reeds in downloadlijst. Trackers werden niet samengevoegd omdat het een privé-torrent is. + + + + Torrent is already in download list. Trackers were merged. + Torrent staat reeds in downloadlijst. Trackers werden samengevoegd. + + + + + Cannot add torrent + Kan torrent niet toevoegen + + + + Cannot add this torrent. Perhaps it is already in adding state. + Kan deze torrent niet toevoegen. Misschien wordt hij reeds toegevoegd. + + + This magnet link was not recognized Deze magneetlink werd niet herkend - + + Magnet link is already in download list. Trackers were merged. + Magneetlink staat al in downloadlijst. Trackers werden samengevoegd. + + + + Cannot add this torrent. Perhaps it is already in adding. + Kan deze torrent niet toevoegen. Misschien wordt hij reeds toegevoegd. + + + Magnet link Magneetlink - + Retrieving metadata... Metadata ophalen... - + Not Available This size is unavailable. Niet beschikbaar - + Free space on disk: %1 Vrije ruimte op schijf: %1 - + + Choose save path Opslagpad kiezen - - - - - - - Torrent is already present - Torrent is reeds aanwezig - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - Torrent '%1' staat reeds in de overdrachtlijst. Trackers werden niet samengevoegd omdat het een privé-torrent is. + + Rename the file + Bestandsnaam wijzigen - - Torrent '%1' is already in the transfer list. Trackers have been merged. - Torrent '%1' staat reeds in de overdrachtlijst. Trackers werden samengevoegd. - - - - Torrent is already queued for processing. - Torrent staat reeds in wachtrij voor verwerking. - - - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - Magneetlink '%1' staat reeds in de overdrachtlijst. Trackers werden samengevoegd. + + New name: + Nieuwe naam: - - Magnet link is already queued for processing. - Magneetlink staat reeds in wachtrij voor verwerking. + + + The file could not be renamed + De bestandsnaam kon niet gewijzigd worden - - New name: - Nieuwe naam: + + This file name contains forbidden characters, please choose a different one. + Deze bestandsnaam bevat verboden tekens, gelieve een andere te kiezen. - - + + This name is already in use in this folder. Please use a different name. Deze naam bestaat al in deze map. Gelieve een andere naam te gebruiken. - + The folder could not be renamed De mapnaam kon niet gewijzigd worden - + Rename... Naam wijzigen... - + Priority Prioriteit - + Invalid metadata Ongeldige metadata - + Parsing metadata... Metadata verwerken... - + Metadata retrieval complete Metadata ophalen voltooid - + Download Error Downloadfout @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Grootte schrijfbuffer + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Uitgaande poorten (Min) [0: Uitgeschakeld] - + Outgoing ports (Max) [0: Disabled] UItgaande poorten (Max) [0: Uitgeschakeld] - + Recheck torrents on completion Torrents opnieuw controleren bij voltooiing - + Transfer list refresh interval Vernieuwinterval overdrachtlijst - + ms milliseconds ms - + Setting Instelling - + Value Value set for this setting Waarde - - - (disabled) - (uitgeschakeld) - - - + (auto) (auto) - - min - minutes - min - - - + All addresses Alle adressen - + qBittorrent Section qBittorrent-sectie - - + + Open documentation Documentatie openen - + libtorrent Section libtorrent-sectie - - Asynchronous I/O threads - Asynchrone I/O-threads - - - - Disk cache - Schijfbuffer - - - + s seconds s - + Disk cache expiry interval Interval voor verstrijken van schijfbuffer - + Enable OS cache Systeembuffer inschakelen - - Guided read cache - Geleide leesbuffer - - - - Coalesce reads & writes - Lezen en schrijven combineren - - - - Send upload piece suggestions - Suggesties voor uploaden van deeltjes zenden - - - - - KiB - KiB - - - - Send buffer watermark - Verzendbuffer-watermerk - - - - Send buffer low watermark - Verzendbuffer laag watermerk - - - - Send buffer watermark factor - Verzendbuffer watermerk factor - - - - Prefer TCP - TCP verkiezen - - - - Peer proportional (throttles TCP) - Peer-proportioneel (vermindert TCP) - - - - Allow multiple connections from the same IP address - Meerdere verbindingen van hetzelfde IP-adres toestaan + + m + minutes + m - + Resolve peer countries (GeoIP) Landen van peers oplossen (GeoIP) - + Resolve peer host names Hostnamen van peers oplossen - + Strict super seeding Strikt super-seeden. - + Network Interface (requires restart) Netwerkinterface (opnieuw starten vereist) - + Optional IP Address to bind to (requires restart) Optioneel IP-adres om aan te binden (opnieuw opstarten vereist) - + Listen on IPv6 address (requires restart) Luisteren op IPv6-adres (opnieuw starten vereist) - + Display notifications Meldingen weergeven - + Display notifications for added torrents Meldingen weergeven voor toegevoegde torrents - + Download tracker's favicon Favicon van tracker downloaden - - Save path history length - Lengte geschiedenis opslagpaden - - - - Fixed slots - Vaste slots - - - - Upload rate based - Gebaseerd op uploadsnelheid - - - - Upload slots behavior - Gedrag van uploadslots - - - - Round-robin - Elk om beurt - - - - Fastest upload - Snelste upload - - - - Anti-leech - Anti-leech - - - - Upload choking algorithm - Upload-choking-algoritme - - - + Confirm torrent recheck Torrent opnieuw controleren bevestigen - - Confirm removal of all tags - Verwijderen van alle labels bevestigen + Exchange trackers with other peers + Trackers uitwisselen met andere peers - - Always announce to all trackers in a tier - Altijd aankondigen bij alle trackers in een rij + + Always announce to all trackers + Altijd bij alle trackers aankondigen - - Always announce to all tiers - Altijd aankondigen bij alle rijen - - - + Any interface i.e. Any network interface Om het even welke interface - + Save resume data interval How often the fastresume file is saved. Interval voor opslaan van hervattingsdata - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - %1-TCP gemengde modus algoritme - - - + Maximum number of half-open connections [0: Unlimited] Maximaal aantal halfopen verbindingen [0: ongelimiteerd] - + IP Address to report to trackers (requires restart) IP-adres om te melden aan trackers (opnieuw opstarten vereist) - + Enable embedded tracker Ingebedde tracker inschakelen - + Embedded tracker port Poort ingebedde tracker - + Check for software updates Controleren op software-updates - + Use system icon theme Iconenthema van systeem gebruiken @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 gestart - + Torrent: %1, running external program, command: %2 Torrent: %1, extern programma uitvoeren, opdracht: %2 - - Torrent name: %1 - Naam torrent: %1 - - - - Torrent size: %1 - Grootte torrent: %1 - - - - Save path: %1 - Opslagpad: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - De torrent werd gedownload in %1. - - - - Thank you for using qBittorrent. - Bedankt om qBittorrent te gebruiken. - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' is klaar met downloaden + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrent: %1, opdracht extern programma uitvoeren te lang (lengte > %2), uitvoeren mislukt. - + Torrent: %1, sending mail notification Torrent: %1, melding via mail verzenden - + Information Informatie - - To control qBittorrent, access the Web UI at %1 - Gebruik de Web-UI op %1 om qBittorrent te besturen + + To control qBittorrent, access the Web UI at http://localhost:%1 + Gebruik de Web-UI op http://localhost:%1 om qBittorrent te besturen - + The Web UI administrator user name is: %1 De Web-UI-administrator-gebruikersnaam is: %1 - + The Web UI administrator password is still the default one: %1 Het Web-UI-administratorwachtwoord is still nog steeds standaard: %1 - + This is a security risk, please consider changing your password from program preferences. Dit is een beveiligingsrisico, overweeg om uw wachtwoord aan te passen via programmavoorkeuren. - + Saving torrent progress... Torrent-voortgang opslaan... - - - Portable mode and explicit profile directory options are mutually exclusive - Opties draagbare modus en expliciete profielmap sluiten elkaar uit - - - - Portable mode implies relative fastresume - Draagbare modus impliceert relatief snelhervatten - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - WebAPI aanmeldfout. Reden: IP werd verbannen, IP: %1, gebruikersnaam: %2 - - - - Your IP address has been banned after too many failed authentication attempts. - Uw IP-adres is geblokkeerd na te veel mislukte authenticatie-pogingen. - - - - WebAPI login success. IP: %1 - WebAPI-aanmelding gelukt. IP: %1 - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - WebAPI aanmeldfout. Reden: ongeldige aanmeldgegevens, aantal pogingen: %1, IP: %2, gebruikersnaam: %3 - AutomatedRssDownloader - + Save to: Opslaan in: @@ -861,817 +658,680 @@ RSS-downloader - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - Automatisch downloaden van RSS-torrents is nu uitgeschakeld! U kunt het inschakelen in de toepassingsinstellingen. + + Enable Automated RSS Downloader + Automatische RSS-downloader inschakelen - + Download Rules Downloadregels - + Rule Definition Regeldefinitie - + Use Regular Expressions Reguliere expressies gebruiken - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - Slimme afleveringsfilter zal het nummer van de aflevering controleren om het downloaden van duplicaten te voorkomen. -Ondersteunt de formaten: S01E01, 1x1, 2017.12.31 en 31.12.2017 (datumformaten ondersteunen ook - als scheidingsteken) - - - - Use Smart Episode Filter - Slimme afleveringsfilter gebruiken - - - + Must Contain: Moet bevatten: - + Must Not Contain: Mag niet bevatten: - + Episode Filter: Afleveringsfilter: - + Assign Category: Categorie toewijzen: - + Save to a Different Directory Opslaan in een andere map - + Ignore Subsequent Matches for (0 to Disable) ... X days Volgende overeenkomsten negeren voor (0 om uit te schakelen) - + Disabled - Uitgeschakeld + Uitgeschakeld - + days dagen - + Add Paused: Gepauzeerd toevoegen: - + Use global settings Algemene instellingen gebruiken - + Always Altijd - + Never Nooit - + Apply Rule to Feeds: Regel toepassen op feeds: - + Matching RSS Articles Overeenkomstige RSS-artikels - + &Import... &Importeren... - + &Export... &Exporteren... - + Matches articles based on episode filter. Komt overeen met artikels gebaseerd op afleveringsfilter. - + Example: Voorbeeld: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match zal overeenkomen met aflevering 2, 5, 8 tot 15, 30 en verdere van seizoen 1 - + Episode filter rules: Afleveringsfilter-regels: - + Season number is a mandatory non-zero value Seizoensnummer is een verplichte "geen nul"-waarde - + Episode number is a mandatory non-zero value + Afleveringsnummer is een verplichte "geen nul"-waarde + + + Filter must end with semicolon Filter moet eindigen met een puntkomma - + Three range types for episodes are supported: Er worden drie bereiktypes voor afleveringen ondersteund: - + Single number: <b>1x25;</b> matches episode 25 of season one Enkel cijfer: <b>1x25;</b> komt overeen met aflevering 25 van seizoen 1 - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Normaal bereik: <b>1x25-40;</b> komt overeen met aflevering 25 tot 40 van seizoen 1 - - Episode number is a mandatory positive value - Afleveringsnummer is een verplichte positieve waarde - - - - Rules - Regels + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Oneindig bereik: <b>1x25-;</b> komt overeen met aflevering 25 en verder van seizoen 1 - - Rules (legacy) - Regels (oud) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Oneindig bereik: <b>1x25-;</b> komt overeen met aflevering 25 en verder van seizoen 1, en alle afleveringen van latere seizoenen + - + Last Match: %1 days ago Laatste overeenkomst: %1 dagen geleden - + Last Match: Unknown Laatste overeenkomst: onbekend - + New rule name Naam van nieuwe regel - + Please type the name of the new download rule. Typ de naam van de nieuwe downloadregel. - - + + Rule name conflict Regelnaam-conflict - - + + A rule with this name already exists, please choose another name. Een regel met deze naam bestaat reeds, kies een andere naam. - + Are you sure you want to remove the download rule named '%1'? Weet u zeker dat u de downloadregel met naam '%1' wilt verwijderen? - + Are you sure you want to remove the selected download rules? - Weet u zeker dat u de geselecteerde downloadregels wilt verwijderen? + Bent u zeker dat u de geselecteerde downloadregels wilt verwijderen? - + Rule deletion confirmation Bevestiging verwijderen regel - + Destination directory Doelmap - + Invalid action Ongeldige handeling - + The list is empty, there is nothing to export. De lijst is leeg, er is niets om te exporteren. - - Export RSS rules - Rss-regels exporteren + + Where would you like to save the list? + Waar wilt u de lijst opslaan? - - + + Rules list (*.rssrules) + Regelllijst (*.rssrules) + + + I/O Error I/O-fout - - Failed to create the destination file. Reason: %1 - Doelbestand aanmaken mislukt. Reden: %1 + + Failed to create the destination file + Doelbestand aanmaken mislukt - - Import RSS rules - Rss-regels importeren + + Please point to the RSS download rules file + Gelieve te verwijzen naar het bestand met RSS-downloadregels - - Failed to open the file. Reason: %1 - Bestand openen mislukt. Reden: %1 + + Rules list + Lijst van regels - + Import Error Importeerfout - - Failed to import the selected rules file. Reason: %1 - Importeren van geselecteerd regelbestand mislukt. Reden: %1 + + Failed to import the selected rules file + Importeren van geselecteerd regelbestand mislukt - + Add new rule... Nieuwe regel toevoegen... - + Delete rule Regel verwijderen - + Rename rule... Regel hernoemen... - + Delete selected rules Geselecteerde regels verwijderen - - Clear downloaded episodes... - Gedownloade afleveringen wissen... - - - + Rule renaming Regelhernoeming - + Please type the new rule name Typ de naam van de nieuwe regel - - Clear downloaded episodes - Gedownloade afleveringen wissen - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - Weet u zeker dat u de lijst van gedownloade afleveringen voor de geselecteerde regel wilt wissen? - - - - Regex mode: use Perl-compatible regular expressions - Regex-modus: Perl-compatibele reguliere expressies gebruiken - - - - - Position %1: %2 - Positie %1: %2 + + Regex mode: use Perl-like regular expressions + Regex-modus: Perl-achtige reguliere expressies gebruiken - + Wildcard mode: you can use - U kunt volgende jokertekens gebruiken: + - + ? to match any single character - ? voor een enkel teken + - + * to match zero or more of any characters - * voor nul of meerdere tekens + - + Whitespaces count as AND operators (all words, any order) - Spaties tellen als AND-operatoren (alle woorden, om het even welke volgorde) + - + | is used as OR operator - | wordt gebruikt als OR-operator + - + If word order is important use * instead of whitespace. - Gebruik * in plaats van een spatie als woordvolgorde belangrijk is. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Een expressie met een lege %1-clausule (bijvoorbeeld %2) + - + will match all articles. - zal met alle artikels overeenkomen. + - + will exclude all articles. - zal alle artikels uitsluiten. - - - - BanListOptionsDialog - - - List of banned IP addresses - Lijst van verbannen IP-adressen - - - - Ban IP - IP verbannen - - - - Delete - Verwijderen - - - - - Warning - Waarschuwing + - - The entered IP address is invalid. - Het opgegeven IP-adres is ongeldig. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Jokerteken-modus: u kunt gebruik maken van<ul><li>? om één enkel teken voor te stellen</li><li>* om nul of meerdere tekens voor te stellen<li><li>Witruimtes tellen als AND-operatoren<li><lu> - - The entered IP is already banned. - Het opgegeven IP is al verbannen. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Jokerteken-modus: u kunt gebruik maken van <ul><li>? om één enkel teken voor te stellen</li><li>* om nul of meerdere tekens voor te stellen<li><li>| wordt gebruikt als OR-operator<li><lu> BitTorrent::Session - + Restart is required to toggle PeX support Opnieuw starten is vereist om PeX-ondersteuning in/uit te schakelen - - Could not get GUID of configured network interface. Binding to IP %1 - Kon GUID van geconfigureerde netwerkinterface niet verkrijgen. Binden aan IP %1 - - - + Embedded Tracker [ON] Ingebedde tracker [AAN] - + Failed to start the embedded tracker! Ingebedde tracker starten mislukt! - + Embedded Tracker [OFF] Ingebedde tracker [UIT] - - System network status changed to %1 + + '%1' reached the maximum ratio you set. Removing... + '%1' heeft de maximum ingestelde verhouding bereikt. Verwijderen... + + + + '%1' reached the maximum ratio you set. Pausing... + '%1' heeft de maximum ingestelde verhouding bereikt. Pauzeren... + + + + System network status changed to %1 e.g: System network status changed to ONLINE Systeem-netwerkstatus gewijzigd in %1 - + ONLINE ONLINE - + OFFLINE OFFLINE - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding Netwerkconfiguratie van %1 is gewijzigd, sessie-koppeling vernieuwen - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. Geconfigureerd netwerkinterface-adres %1 is niet geldig. - - + Encryption support [%1] Encryptie-ondersteuning [%1] - - + FORCED GEFORCEERD - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 is geen geldig IP-adres en het werd verworpen tijdens het toepassen van de lijst van verbannen adressen. - - - - + Anonymous mode [%1] Anonieme modus [%1] - + Unable to decode '%1' torrent file. Kon torrentbestand '%1' niet decoderen. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Recursieve download van bestand '%1' in torrent '%2' - + Queue positions were corrected in %1 resume files - Wachtrijposities werden gecorrigeerd in %1 hervattingsbesstanden. + - + Couldn't save '%1.torrent' Kon '%1.torrent' niet opslaan - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' werd verwijderd van de overdrachtlijst. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' werd verwijderd van de overdrachtlijst en harde schijf. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '%1' werd verwijderd van de overdrachtlijst maar de bestanden konden niet verwijderd worden. Fout: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. omdat %1 uitgeschakeld is. - + because %1 is disabled. this peer was blocked because TCP is disabled. omdat %1 uitgeschakeld is. - + URL seed lookup failed for URL: '%1', message: %2 URL-seed raadpleging mislukt voor url: '%1', bericht: '%2' - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent slaagde er niet in om te luisteren naar interface %1 poort: %2/%3. Reden: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' werd verwijderd van de overdrachtlijst en harde schijf. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' werd verwijderd van de overdrachtlijst. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Bezig met downloaden van '%1', even geduld... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent probeert te luisteren op om het even welke interface-poort: %1 - + The network interface defined is invalid: %1 De opgegeven netwerkinterface is ongeldig: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent probeert te luisteren op interface %1 poort: %2 - - Peer ID: - Peer-id: - - - - HTTP User-Agent is '%1' - HTTP user-agent is '%1' - - - - + DHT support [%1] DHT-ondersteuning [%1] - - - - - - - - - + + + + ON AAN - - - - - - - - - + + + + OFF UIT - - + Local Peer Discovery support [%1] Ondersteuning voor lokale peer-ontdekking [%1] - - PeX support [%1] - PeX-ondersteuning [%1] - - - - '%1' reached the maximum ratio you set. Removed. - '%1' heeft de maximum ingestelde verhouding bereikt. Verwijderd. - - - - '%1' reached the maximum ratio you set. Paused. - '%1' heeft de maximum ingestelde verhouding bereikt. Gepauzeerd. - - - - '%1' reached the maximum seeding time you set. Removed. - '%1' heeft de maximum ingestelde seed-tijd bereikt. Verwijderd. - - - - '%1' reached the maximum seeding time you set. Paused. - '%1' heeft de maximum ingestelde seed-tijd bereikt. Gepauzeerd. + Restart is required to toggle Tracker Exchange support + Opnieuw opstarten is vereist om ondersteuning voor tracker-uitwisseling in/uit te schakelen. - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorent vond geen lokaal %1 adres om op te luisteren - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent slaagde er niet in om te luisteren op om het even welke interface-poort: %1. Reden: %2. - + Tracker '%1' was added to torrent '%2' Tracker '%1' werd toegevoegd aan torrent '%2' - + Tracker '%1' was deleted from torrent '%2' Tracker '%1' werd verwijderd uit torrent '%2' - + URL seed '%1' was added to torrent '%2' URL-seed '%1' werd toegevoegd aan torrent '%2' - + URL seed '%1' was removed from torrent '%2' URL-seed '%1' werd verwijderd uit torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Kon torrent '%1' niet hervatten. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Verwerken van opgegeven IP-filter gelukt: er werden %1 regels toegepast. - + Error: Failed to parse the provided IP filter. Fout: verwerken van de opgegeven IP-filter mislukt - - '%1' restored. - 'torrent name' restored. - '%1' hersteld. - - - + Couldn't add torrent. Reason: %1 Kon torrent niet toevoegen. Reden: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' hervat. (snel hervatten) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' toegevoegd aan downloadlijst. - + An I/O error occurred, '%1' paused. %2 Er trad een I/O-fout op, '%1' gepauzeerd. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: port mapping mislukt, bericht: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: port mapping succesvol, bericht: %1 - + due to IP filter. this peer was blocked due to ip filter. veroorzaakt door IP-filter. - + due to port filter. this peer was blocked due to port filter. veroorzaakt door poortfilter. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. veroorzaakt door i2p mixed mode restricties. - + because it has a low port. this peer was blocked because it has a low port. omdat het een lage poort heeft. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent luistert met succes naar interface %1 poort: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 Externe IP: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - aanmaken van nieuw torrentbestand mislukt - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - Eerste en laatste deeltje eerst downloaden: %1, torrent: '%2' - - - - On - Aan - - - - Off - Uit - - - - Successfully moved torrent: %1. New path: %2 - Torrent succesvol verplaatst: %1. Nieuw pad: %2 - - - + Could not move torrent: '%1'. Reason: %2 Torrent '%1' kon niet verplaatst worden. Reden: %2 - + File sizes mismatch for torrent '%1', pausing it. - Bestandsgroottes komen niet overeen voor torrent '%1', wordt gepauzeerd. + Bestandgroottes komen niet overeen voor torrent '%1', wordt gepauzeerd. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... Data voor snel hervatten werd afgewezen voor torrent '%1'. Reden: %2. Opnieuw controleren... @@ -1679,19 +1339,19 @@ CategoryFilterModel - + Categories - Categorieën + Categorieën - + All - Alle + Alle - + Uncategorized - Zonder categorie + @@ -1699,42 +1359,147 @@ Add category... - Categorie toevoegen... + Categorie toevoegen... Add subcategory... - Subcategorie toevoegen... + - Edit category... - Categorie bewerken... + Remove category + Categorie verwijderen + + + + Remove unused categories + Niet-gebruikte categorieën verwijderen + + + + Resume torrents + Torrents hervatten + + + + Pause torrents + Torrents pauzeren + + + + Delete torrents + Torrents verwijderen + + + + New Category + Nieuwe categorie + + + + Category: + Categorie: + + + + Invalid category name + Ongeldige categorienaam + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Categorienaam mag geen '\' bevatten. +Categorienaam mag niet beginnen/eindigen met '/'. +Categorienaam mag de '//'-opeenvolging niet bevatten. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Alles (0) + + + Uncategorized (0) + Zonder categorie (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Zonder categorie (%1) + + + Add category... + Categorie toevoegen... - Remove category - Categorie verwijderen + Categorie verwijderen - Remove unused categories - Niet-gebruikte categorieën verwijderen + Niet-gebruikte categorieën verwijderen - Resume torrents - Torrents hervatten + Torrents hervatten - Pause torrents - Torrents pauzeren + Torrents pauzeren - Delete torrents - Torrents verwijderen + Torrents verwijderen + + + New Category + Nieuwe categorie + + + Category: + Categorie: + + + Invalid category name + Ongeldige categorienaam + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Categorienaam mag geen '\' bevatten. +Categorienaam mag niet beginnen/eindigen met '/'. +Categorienaam mag de '//'-opeenvolging niet bevatten. + + + All (%1) + this is for the category filter + Alles (%1) @@ -1774,220 +1539,101 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Bevestiging verwijdering - - - - Remember choice - Keuze onthouden - - - - Also delete the files on the hard disk - Ook bestanden op de harde schijf verwijderen - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? Weet u zeker dat u '%1' uit de overdrachtlijst wilt verwijderen? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - Weet u zeker dat u deze %1 torrents uit de overdrachtlijst wilt verwijderen? - - - - DownloadFromURLDialog - - - Download from URLs - Downloaden uit url's - - - - Add torrent links - Torrent-links toevoegen - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - Een link per regel (http-verbindingen, magneetlinks en info-hashes worden ondersteund) - - - - Download - Downloaden - - - - No URL entered - Geen url opgegeven - - - - Please type at least one URL. - Typ op zijn minst één url. + Weet u zeker dat u de %1 geselecteerde torrents wilt verwijderen uit de overdrachtlijst? DownloadedPiecesBar - + White: Missing pieces Wit: ontbrekende deeltjes - + Green: Partial pieces Groen: gedeeltelijke deeltjes - + Blue: Completed pieces Blauw: voltooide deeltjes - ExecutionLogWidget + ExecutionLog - + General Algemeen - + Blocked IPs Geblokkeerde IP's - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - <font color='red'>%1</font> werd geblokkeerd %2 + <font color='red'>%1</font> is geblokkeerd %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - <font color='red'>%1</font> werd verbannen + <font color='red'>%1</font> is verbannen FeedListWidget - + RSS feeds RSS-feeds - - - Unread (%1) - Ongelezen (%1) + + Unread + Ongelezen FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. + + An error occured while trying to open the log file. Logging to file is disabled. Er trad een fout op tijdens het proberen openen van het logbestand. Loggen naar bestand is uitgeschakeld. - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - &Bladeren... - - - - Choose a file - Caption for file open/save dialog - Bestand kiezen - - - - Choose a folder - Caption for directory open dialog - Map kiezen - - - - Any file - Om het even welk bestand - - - FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. + + + + I/O Error: Could not open ip filter file in read mode. I/O-fout: kon ip-filterbestand niet openen in leesmodus. - - - - IP filter line %1 is malformed. - IP-filter regel %1 is slecht gevormd. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - IP-filter regel %1 is slecht gevormd. Begin-IP van het bereik is slecht gevormd. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - IP-filter regel %1 is slecht gevormd. Eind-IP van het bereik is slecht gevormd. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - IP-filter regel %1 is slecht gevormd. Een IP is IPv4 en het andere is IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - IP-filter heeft een uitzondering veroorzaakt voor regel %1. Uitzondering is: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - Er traden %1 extra IP-filter-verwerkingsfouten op. - - - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. Fout bij verwerken: het filterbestand is geen geldig PeerGuardian P2B-bestand. @@ -1995,396 +1641,472 @@ GeoIPDatabase - - + + Unsupported database file size. Database-bestandsgrootte niet ondersteund. - + Metadata error: '%1' entry not found. Metadata-fout: '%1' item niet gevonden. - + Metadata error: '%1' entry has invalid type. Metadata-fout: '%1' item heeft een ongeldig type. - + Unsupported database version: %1.%2 Database-versie niet ondersteund: %1.%2 - + Unsupported IP version: %1 IP-versie niet ondersteund: %1 - + Unsupported record size: %1 Opnamegrootte niet ondersteund: %1 - + Invalid database type: %1 Ongeldig database-type: %1 - + Database corrupted: no data section found. Database beschadigd: geen datasectie teruggevonden. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - Http-aanvraaggrootte overschrijdt grens. Socket sluiten. Grens: %ld, IP: %s + + File + Bestand - - Bad Http request, closing socket. IP: %s - Foute http-aanvraag. Socket sluiten. IP: %s + + Edit + Bewerken - - - HttpServer - + + Help + Help + + + Exit qBittorrent qBittorrent afsluiten - + Only one link per line Slechts één link per regel - + + Download + Download + + + Global upload rate limit must be greater than 0 or disabled. Algemene begrenzing voor uploadsnelheid moet groter dan 0 of uitgeschakeld zijn. - + Global download rate limit must be greater than 0 or disabled. Algemene begrenzing voor downloadsnelheid moet groter dan 0 of uitgeschakeld zijn. - + Alternative upload rate limit must be greater than 0 or disabled. Alternatieve begrenzing voor uploadsnelheid moet groter dan 0 of uitgeschakeld zijn. - + Alternative download rate limit must be greater than 0 or disabled. Alternatieve begrenzing voor downloadsnelheid moet groter dan 0 of uitgeschakeld zijn. - + Maximum active downloads must be greater than -1. Maximaal aantal actieve downloads moet groter zijn dan -1. - + Maximum active uploads must be greater than -1. Maximaal aantal actieve uploads moet groter zijn dan -1. - + Maximum active torrents must be greater than -1. Maximaal aantal actieve torrents moet groter zijn dan -1. - + Maximum number of connections limit must be greater than 0 or disabled. Limiet voor maximaal aantal verbindingen moet groter zijn dan 0 of uitgeschakeld. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Limiet voor maximaal aantal verbindingen per torrent moet groter zijn dan 0 of uitgeschakeld. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Limiet voor maximaal aantal uploadslots per torrent moet groter zijn dan 0 of uitgeschakeld. - + Unable to save program preferences, qBittorrent is probably unreachable. Onmogelijk om programmavoorkeuren op te slaan, qBittorrent is waarschijnlijk onbereikbaar. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent op Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - Ongeldige categorienaam: -Gebruik geen speciale tekens in de categorienaam. + + Language + Taal - - Unknown - Onbekend + + The port used for incoming connections must be between 1 and 65535. + De poort gebruikt voor inkomende verbindingen moet liggen tussen 1 en 65535. - - Hard Disk - Harde schijf + + The port used for the Web UI must be between 1 and 65535. + De poort gebruikt voor de Web-UI moet liggen tussen 1 en 65535. - - Share ratio limit must be between 0 and 9998. - Begrenzing voor deelverhouding moet tussen 0 en 9998 liggen. + + Unable to log in, qBittorrent is probably unreachable. + Niet mogelijk om in te loggen, qBittorrent is waarschijnlijk onbereikbaar. - - Seeding time limit must be between 0 and 525600 minutes. - Begrenzing voor seed-tijd moet liggen tussen 0 en 525 600 minuten. - - - - The port used for incoming connections must be between 1 and 65535. - De poort gebruikt voor inkomende verbindingen moet liggen tussen 1 en 65535. - - - - The port used for the Web UI must be between 1 and 65535. - De poort gebruikt voor de Web-UI moet liggen tussen 1 en 65535. - - - - Unable to log in, qBittorrent is probably unreachable. - Niet mogelijk om in te loggen, qBittorrent is waarschijnlijk onbereikbaar. - - - + Invalid Username or Password. Ongeldige gebruikersnaam of wachtwoord. - - Username - Gebruikersnaam - - - + Password Wachtwoord - + Login Login - + + Upload Failed! + Uploaden mislukt! + + + Original authors Oorspronkelijke auteurs - + + Upload limit: + Uploadbegrenzing: + + + + Download limit: + Downloadbegrenzing: + + + Apply Toepassen - + Add Toevoegen - + + Category: + Categorie: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Torrents uploaden - + + All + Alle + + + + Downloading + Downloaden + + + + Seeding + Seeden + + + + Completed + Voltooid + + + + Resumed + Hervat + + + + Paused + Gepauzeerd + + + + Active + Actief + + + + Inactive + Inactief + + + Save files to location: Bestanden opslaan in: - + Cookie: Cookie: - + Type folder here Map hier typen - + + Run an external program on torrent completion + Een extern programma uitvoeren bij voltooien van de torrent + + + + Enable bandwidth management (uTP) + Bandbreedte-beheer inschakelen (uTP) + + + + Apply rate limit to uTP connections + Snelheidsbegrenzing toepassen op uTP-verbindingen + + + + Alternative Global Rate Limits + Alternatieve algemene snelheidsbegrenzingen + + + More information Meer informatie - + Information about certificates Informatie over certificaten - + Save Files to Bestanden opslaan in - - Set location - Locatie instellen - - - - Limit upload rate - Uploadsnelheid begrenzen + + Watch Folder + Map in het oog houden - - Limit download rate - Downloadsnelheid begrenzen + + Default Folder + Standaard map - - Rename torrent - Naam van torrent wijzigen + + from + from time1 to time2 + van - - Unable to create category - + + to + from time1 to time2 + tot - + Other... Save Files to: Watch Folder / Default Folder / Other... Andere... - + + Every day + Schedule the use of alternative rate limits on ... + Elke dag + + + + Week days + Schedule the use of alternative rate limits on ... + Weekdagen + + + + Week ends + Schedule the use of alternative rate limits on ... + Weekends + + + Monday Schedule the use of alternative rate limits on ... Maandag - + Tuesday Schedule the use of alternative rate limits on ... Dinsdag - + Wednesday Schedule the use of alternative rate limits on ... Woensdag - + Thursday Schedule the use of alternative rate limits on ... Donderdag - + Friday Schedule the use of alternative rate limits on ... Vrijdag - + Saturday Schedule the use of alternative rate limits on ... Zaterdag - + Sunday Schedule the use of alternative rate limits on ... Zondag - + + Downloaded + Is the file downloaded or not? + Gedownload + + + Logout Afmelden - + + Download from URLs + Downloaden uit url's + + + Download Torrents from their URLs or Magnet links Torrents downloaden via hun url's of magneetlinks - + Upload local torrent Lokale torrent uploaden - + Are you sure you want to delete the selected torrents from the transfer list? - Weet u zeker dat u de geselecteerde torrents wilt verwijderen uit de overdrachtenlijst? + Bent u zeker dat u de geselecteerde torrents wilt verwijderen uit de overdrachtenlijst? - + Save Opslaan - + qBittorrent client is not reachable qBittorrent-client is niet bereikbaar - - qBittorrent has been shutdown. - qBittorrent werd afgesloten. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Lijst van toegestane IP-subnets + + HTTP Server + Http-server - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Voorbeeld: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + De volgende parameters worden ondersteund: - - Add subnet - Subnet toevoegen + + Torrent path + Torrent-pad - - Delete - Verwijderen + + Torrent name + Torrentnaam - - Error - Fout + + qBittorrent has been shutdown. + qBittorrent werd afgesloten. + + + LineEdit - - The entered subnet is invalid. - Het ingegeven subnet is ongeldig. + + Clear the text + Tekst wissen LogListWidget - + Copy Kopiëren - + Clear Wissen @@ -2417,551 +2139,493 @@ Wanneer &downloads voltooid zijn - + &View &Beeld - + &Options... &Opties... - + &Resume &Hervatten - + Torrent &Creator Torrent &aanmaken - + Set Upload Limit... Uploadbegrenzing instellen... - + Set Download Limit... Downloadbegrenzing instellen... - + Set Global Download Limit... Algemene downloadbegrenzing instellen... - + Set Global Upload Limit... Algemene uploadbegrenzing instellen... - + Minimum Priority Laagste prioriteit - + Top Priority Hoogste prioriteit - + Decrease Priority Prioriteit verlagen - + Increase Priority Prioriteit verhogen - - + + Alternative Speed Limits Alternatieve snelheidsbegrenzing - + &Top Toolbar Bovenste &werkbalk - + Display Top Toolbar Bovenste werkbalk weergeven - - Status &Bar - Status&balk - - - + S&peed in Title Bar &Snelheid in titelbalk - + Show Transfer Speed in Title Bar Overdrachtsnelheid weergeven in titelbalk - + &RSS Reader &RSS-reader - + Search &Engine Zoek&machine - + L&ock qBittorrent qBittorrent vergrendelen - + Do&nate! Do&neren! - - Close Window - Venster sluiten - - - + R&esume All All&es hervatten - + Manage Cookies... Cookies beheren... - + Manage stored network cookies Opgeslagen netwerkcookies beheren - + Normal Messages Normale berichten - + Information Messages Informatieberichten - + Warning Messages Waarschuwingsberichten - + Critical Messages Kritieke berichten - + &Log &Log - + &Exit qBittorrent qBittorrent afsluit&en - + &Suspend System &Slaapstand - + &Hibernate System &Sluimerstand - + S&hutdown System &Afsluiten - + &Disabled Uitgeschakel&d - + &Statistics &Statistieken - + Check for Updates Controleren op updates - + Check for Program Updates Op programma-updates controleren - + &About &Over - + &Pause &Pauzeren - + &Delete &Verwijderen - + P&ause All Alles p&auzeren - + &Add Torrent File... Torrentbest&and toevoegen... - + Open Openen - + E&xit Slu&iten - + Open URL URL openen - + &Documentation &Documentatie - + Lock Vergrendelen - - - + + + Show Weergeven - + Check for program updates Op programma-updates controleren - + Add Torrent &Link... Torrent-link toevoegen - + If you like qBittorrent, please donate! Als u qBittorrent goed vindt, gelieve te doneren! - - + Execution Log Uitvoeringslog - + Clear the password Wachtwoord wissen - + Filter torrent list... Torrentlijst filteren... - + &Set Password Wachtwoord in&stellen - - Preferences - Voorkeuren - - - + &Clear Password Wachtwoord &wissen - + Transfers Overdrachten - - - qBittorrent is minimized to tray - qBittorrent is naar systeemvak geminimaliseerd - - - - - - This behavior can be changed in the settings. You won't be reminded again. - Dit gedrag kan veranderd worden in de instellingen. U zult niet meer herinnerd worden. - - - + Torrent file association Torrent-bestandsassociatie - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent is niet het standaardprogramma om torrentbestanden of magneetlinks te openen. Wilt u qBittorrent koppelen met torrentbestanden en magneetlinks? - + Icons Only Alleen pictogrammen - + Text Only Alleen tekst - + Text Alongside Icons Tekst naast pictogrammen - + Text Under Icons Tekst onder pictogrammen - + Follow System Style Systeemstijl volgen - - - + + + UI lock password Wachtwoord UI-vergrendeling - - - + + + Please type the UI lock password: Geef het wachtwoord voor UI-vergrendeling op: - + The password should contain at least 3 characters Het wachtwoord moet minstens 3 tekens bevatten - + Password update Wachtwoord-update - + The UI lock password has been successfully updated Het wachtwoord voor UI-vergrendeling is succesvol bijgewerkt - + Are you sure you want to clear the password? Weet u zeker dat u het wachtwoord wilt wissen? - - Use regular expressions - Reguliere expressies gebruiken - - - + Search Zoeken - + Transfers (%1) Overdrachten (%1) - + Error Fout - + Failed to add torrent: %1 Toevoegen van torrent mislukt: %1 - + Torrent added Torrent toegevoegd - + '%1' was added. e.g: xxx.avi was added. '%1' werd toegevoegd. - + Download completion Gedownload - + I/O Error i.e: Input/Output Error I/O-fout - + Recursive download confirmation Recursieve donwloadbevestiging - + Yes Ja - + No Nee - + Never Nooit - + Global Upload Speed Limit Algemene uploadsnelheidbegrenzing - + Global Download Speed Limit Algemene downloadsnelheidbegrenzing - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent is bijgewerkt en moet opnieuw opgestart worden om de wijzigingen toe te passen. - - - - qBittorrent is closed to tray - qBittorrent is naar systeemvak gesloten - - - - Some files are currently transferring. - Er worden momenteel een aantal bestanden overgedragen. - - - - Are you sure you want to quit qBittorrent? - Weet u zeker dat u qBittorrent wilt afsluiten? - - - + &No &Nee - + &Yes &Ja - + &Always Yes &Altijd ja - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - Kon uw Pythonversie niet bepalen. Zoekmachine uitgeschakeld. - - - + Old Python Interpreter Oude Python-interpreter - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. Uw Pythonversie (%1) is verouderd. Gelieve bij te werken naar de laatste versie om zoekmachines te laten werken. Minimale vereiste: 2.7.9 / 3.3.0. - + qBittorrent Update Available qBittorrent-update beschikbaar - + + A new version is available. +Do you want to download %1? + Er is een nieuwe versie beschikbaar. +Wilt u %1 downloaden? + + + Already Using the Latest qBittorrent Version - Laatste qBittorrent-versie wordt al gebruikt + De laatste versie van qBittorrent wordt al gebruikt - + Undetermined Python version Niet-bepaalde Pythonversie - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. '%1' is klaar met downloaden. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2970,158 +2634,154 @@ Reden: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? Torrent '%1' bevat torrentbestanden, wilt u verdergaan met hun download? - + Couldn't download file at URL '%1', reason: %2. Kon bestand niet downloaden vanaf URL '%1', reden: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin Python teruggevonden in %1: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + Kon uw Pythonversie niet bepalen (%1). Zoekmachine uitgeschakeld. + + + + Missing Python Interpreter Ontbrekende Python-interpreter - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Python is vereist om de zoekmachine te gebruiken maar dit lijkt niet geïnstalleerd. Wilt u het nu installeren? - + Python is required to use the search engine but it does not seem to be installed. Python is vereist om de zoekmachine te gebruiken maar dit lijkt niet geïnstalleerd. - - A new version is available. - Er is een nieuwe versie beschikbaar. - - - - Do you want to download %1? - Wilt u %1 downloaden? - - - - Open changelog... - Wijzigingenlogboek openen... - - - + No updates available. You are already using the latest version. Geen updates beschikbaar. -U gebruikt de laatste versie. +U gebruikt de laatste versie al. - + &Check for Updates &Controleren op updates - + Checking for Updates... Controleren op updates... - + Already checking for program updates in the background Reeds aan het controleren op programma-updates op de achtergrond - + Python found in '%1' Python teruggevonden in '%1' - + Download error Downloadfout - + Python setup could not be downloaded, reason: %1. Please install it manually. Python-installatie kon niet gedownload worden, reden: %1. Gelieve het manueel te installeren. - - + + Invalid password Ongeldig wachtwoord - - - + + RSS (%1) RSS (%1) - + URL download error URL-downloadfout - + The password is invalid Het wachtwoord is ongeldig - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Downloadsnelheid: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Uploadsnelheid: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [D: %1, U: %2] qBittorrent %3 - + Hide Verbergen - + Exiting qBittorrent qBittorrent afsluiten - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Er worden momenteel een aantal bestanden overgedragen. +Weet u zeker dat u qBittorrent wilt afsluiten? + + + Open Torrent Files Torrentbestanden openen - + Torrent Files Torrentbestanden - + Options were saved successfully. Opties zijn succesvol opgeslagen. @@ -3129,52 +2789,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. Uw dynamische DNS werd succesvol bijgewerkt. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Dynamische DNS fout: de dienst is tijdelijk niet beschikbaar, er wordt opnieuw geprobeerd binnen 30 minuten. - + Dynamic DNS error: hostname supplied does not exist under specified account. Dynamische DNS fout: opgegeven hostnaam bestaat niet bij de opgegeven account. - + Dynamic DNS error: Invalid username/password. Dynamische DNS fout: ongeldige gebruikersnaam/wachtwoord. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Dynamische DNS fout: qBittorrent werd geblacklist door deze dienst, gelieve de bug te rapporteren op http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Dynamische DNS fout: %1 werd teruggegeven door de dienst, gelieve de bug te rapporteren op http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Dynamische DNS fout: uw gebruikersnaam werd geblokkeerd door misbruik. - + Dynamic DNS error: supplied domain name is invalid. Dynamische DNS fout: opgegeven domeinnaam is ongeldig. - + Dynamic DNS error: supplied username is too short. Dynamische DNS fout: opgegeven gebruikersnaam is te kort. - + Dynamic DNS error: supplied password is too short. Dynamische DNS fout: opgegeven wachtwoord is te kort. @@ -3182,1413 +2842,1303 @@ Net::DownloadHandler - + I/O Error I/O-fout - + The file size is %1. It exceeds the download limit of %2. De bestandsgrootte is %1. Ze overschrijdt de downloadlimiet van %2. - + Unexpected redirect to magnet URI. Onverwachte omleiding naar magneetlink. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - De externe hostnaam werd niet teruggevonden (ongeldige hostnaam) + + + GeoIP database loaded. Type: %1. Build time: %2. + GeoIP-database geladen. Type: %1. Build-tijd: %2. - - The operation was canceled - De handeling werd geannuleerd + + + Couldn't load GeoIP database. Reason: %1 + Kon GeoIP-database niet laden. Reden: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - De externe server heeft de verbinding vroegtijdig afgesloten, voordat het volledige antwoord ontvangen en verwerkt werd + + Venezuela, Bolivarian Republic of + Venezuela - - The connection to the remote server timed out - De verbinding met de externe server is verlopen + + Viet Nam + Vietnam - - SSL/TLS handshake failed - SSL/TLS handshake mislukt + + + N/A + N/B - - The remote server refused the connection - De externe server weigerde de verbinding - - - - The connection to the proxy server was refused - De verbinding naar de proxyserver werd geweigerd - - - - The proxy server closed the connection prematurely - De proxyserver heeft de verbinding vroegtijdig afgesloten - - - - The proxy host name was not found - De proxy-hostnaam werd niet gevonden - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - De verbinding naar de proxy is verlopen of de proxy reageerde niet op tijd op het verzonden verzoek - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - De proxy vereist authenticatie om in te kunnen gaan op het verzoek maar accepteerde geen van de aangeboden aanmeldingsgegevens - - - - The access to the remote content was denied (401) - De toegang tot de externe inhoud werd geweigerd (401) - - - - The operation requested on the remote content is not permitted - De gevraagde handeling op de externe inhoud is niet toegestaan - - - - The remote content was not found at the server (404) - De externe inhoud werd niet teruggevonden op de server (404) - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - De externe server vereist authenticatie om de inhoud aan te bieden maar de gegeven aanmeldingsgegevens werden niet geaccepteerd - - - - The Network Access API cannot honor the request because the protocol is not known - De netwerktoegang-API kon niet ingaan op het verzoek omdat het protocol niet bekend is - - - - The requested operation is invalid for this protocol - De gevraagde handeling is niet geldig voor dit protocol - - - - An unknown network-related error was detected - Er werd een onbekende netwerkgerelateerde fout gevonden - - - - An unknown proxy-related error was detected - Er werd een onbekende proxy-gerelateerde fout gevonden - - - - An unknown error related to the remote content was detected - Er werd een onbekende fout, gerelateerd aan de externe inhoud, gevonden - - - - A breakdown in protocol was detected - Er werd een storing in het protocol gedetecteerd - - - - Unknown error - Onbekende fout - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - GeoIP-database geladen. Type: %1. Build-tijd: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - Kon GeoIP-database niet laden. Reden: %1 - - - - Venezuela, Bolivarian Republic of - Venezuela - - - - Viet Nam - Vietnam - - - - - N/A - N/B - - - + Andorra Andorra - + United Arab Emirates Verenigde Arabische Emiraten - + Afghanistan Afghanistan - + Antigua and Barbuda Antigua en Barbuda - + Anguilla Anguilla - + Albania Albanië - + Armenia Armenië - + Angola Angola - + Antarctica Antarctica - + Argentina Argentinië - + American Samoa Amerikaans-Samoa - + Austria Oostenrijk - + Australia Australië - + Aruba Aruba - + Azerbaijan Azerbeidzjan - + Bosnia and Herzegovina Bosnië en Herzegovina - + Barbados Barbados - + Bangladesh Bangladesh - + Belgium België - + Burkina Faso Burkina Faso - + Bulgaria Bulgarije - + Bahrain Bahrein - + Burundi Burundi - + Benin Benin - + Bermuda Bermuda - + Brunei Darussalam Brunei - + Brazil Brazilië - + Bahamas Bahama's - + Bhutan Bhutan - + Bouvet Island Bouvet Island - + Botswana Botswana - + Belarus Wit-Rusland - + Belize Belize - + Canada Canada - + Cocos (Keeling) Islands Cocoseilanden - + Congo, The Democratic Republic of the Congo-Kinshasa - + Central African Republic Centraal-Afrikaanse Republiek - + Congo Congo - + Switzerland Zwitserland - + Cook Islands Cookeilanden - + Chile Chili - + Cameroon Kameroen - + China China - + Colombia Colombia - + Costa Rica Costa Rica - + Cuba Cuba - + Cape Verde Kaapverdië - + Curacao Curaçao - + Christmas Island Christmaseiland - + Cyprus Cyprus - + Czech Republic Tsjechië - + Germany Duitsland - + Djibouti Djibouti - + Denmark Denemarken - + Dominica Dominica - + Dominican Republic Dominicaanse republiek - + Algeria Algerije - + Ecuador Ecuador - + Estonia Estland - + Egypt Egypte - + Western Sahara Westelijke Sahara - + Eritrea Eritrea - + Spain Spanje - + Ethiopia Ethiopië - + Finland Finland - + Fiji Fiji - + Falkland Islands (Malvinas) Falklandeilanden (Malvinas) - + Micronesia, Federated States of Micronesia - + Faroe Islands Faeröer - + France Frankrijk - + Gabon Gabon - + United Kingdom Verenigd Koninkrijk - + Grenada Grenada - + Georgia Georgië - + French Guiana Frans-Guyana - + Ghana Ghana - + Gibraltar Gibraltar - + Greenland Groenland - + Gambia Gambia - + Guinea Guinee - + Guadeloupe Guadeloupe - + Equatorial Guinea Equatoriaal-Guinea - + Greece Griekenland - + South Georgia and the South Sandwich Islands Zuid-Georgia en de Zuidelijke Sandwicheilanden - + Guatemala Guatemala - + Guam Guam - + Guinea-Bissau Guinee-Bissau - + Guyana Guyana - + Hong Kong Hongkong - + Heard Island and McDonald Islands Heard en McDonaldeilanden - + Honduras Honduras - + Croatia Kroatië - + Haiti Haïti - + Hungary Hongarije - + Indonesia Indonesië - + Ireland Ierland - + Israel Israël - + India India - + British Indian Ocean Territory Brits Indische Oceaanterritorium - + Iraq Irak - + Iran, Islamic Republic of Iran - + Iceland Ijsland - + Italy Italië - + Jamaica Jamaica - + Jordan Jordanië - + Japan Japan - + Kenya Kenia - + Kyrgyzstan Kirgizië - + Cambodia Cambodja - + Kiribati Kiribati - + Comoros Comoren - + Saint Kitts and Nevis Saint Kitts en Nevis - + Korea, Democratic People's Republic of Noord-Korea - + Korea, Republic of Zuid-Korea - + Kuwait Koeweit - + Cayman Islands Kaaimaneilanden - + Kazakhstan Kazachstan - + Lao People's Democratic Republic Laos - + Lebanon Libanon - + Saint Lucia Saint Lucia - + Liechtenstein Liechtenstein - + Sri Lanka Sri Lanka - + Liberia Liberia - + Lesotho Lesotho - + Lithuania Litouwen - + Luxembourg Luxemburg - + Latvia Letland - + Morocco Marokko - + Monaco Monaco - + Moldova, Republic of Moldavië - + Madagascar Madagaskar - + Marshall Islands Marshalleilanden - + Mali Mali - + Myanmar Myanmar - + Mongolia Mongolië - + Northern Mariana Islands Noordelijke Marianen - + Martinique Martinique - + Mauritania Mauritanië - + Montserrat Montserrat - + Malta Malta - + Mauritius Mauritius - + Maldives Maldiven - + Malawi Malawi - + Mexico Mexico - + Malaysia Maleisië - + Mozambique Mozambique - + Namibia Namibië - + New Caledonia Nieuw-Caledonië - + Niger Niger - + Norfolk Island Norfolk - + Nigeria Nigeria - + Nicaragua Nicaragua - + Netherlands Nederland - + Norway Noorwegen - + Nepal Nepal - + Nauru Nauru - + Niue Niue - + New Zealand Nieuw-Zeeland - + Oman Oman - + Panama Panama - + Peru Peru - + French Polynesia Frans-Polynesië - + Papua New Guinea Papoea-Nieuw-Guinea - + Philippines Filipijnen - + Pakistan Pakistan - + Poland Polen - + Saint Pierre and Miquelon Saint-Pierre en Miquelon - + Puerto Rico Puerto Rico - + Portugal Portugal - + Palau Palau - + Paraguay Paraguay - + Qatar Qatar - + Reunion Réunion - + Romania Roemenië - + Russian Federation Rusland - + Rwanda Rwanda - + Saudi Arabia Saoedi-Arabië - + Solomon Islands Salomonseilanden - + Seychelles Seychellen - + Sudan Soedan - + Sweden Zweden - + Singapore Singapore - + Slovenia Slovenië - + Svalbard and Jan Mayen -  Spitsbergen en Jan Mayen +  Spitsbergen en Jan Mayen - + Slovakia Slowakije - + Sierra Leone Sierra Leone - + San Marino San Marino - + Senegal Senegal - + Somalia Somalië - + Suriname Suriname - + Sao Tome and Principe Sao Tomé en Principe - + El Salvador El Salvador - + Syrian Arab Republic Syrië - + Swaziland Swaziland - + Turks and Caicos Islands Turks- en Caicoseilanden - + Chad Tsjaad - + French Southern Territories Franse Zuidelijke en Antarctische Gebieden - + Togo Togo - + Thailand Thailand - + Tajikistan Tadzjikistan - + Tokelau Tokelau - + Turkmenistan Turkmenistan - + Tunisia Tunesië - + Tonga Tonga - - Could not decompress GeoIP database file. - Kon GeoIP-databasebestand niet uitpakken. - - - + Timor-Leste Oost-Timor - + Bolivia, Plurinational State of Bolivia - + Bonaire, Sint Eustatius and Saba Bonaire, Sint Eustatius en Saba - + Cote d'Ivoire Ivoorkust - + Libya Libië - + Saint Martin (French part) Sint-Maarten (Franse Antillen) - + Macedonia, The Former Yugoslav Republic of Macedonië - + Macao Macau - + Pitcairn Pitcairneilanden - + Palestine, State of Palestina - + Saint Helena, Ascension and Tristan da Cunha Sint-Helena, Ascension en Tristan da Cunha - + South Sudan Zuid-Soedan - + Sint Maarten (Dutch part) Sint Maarten (Nederlands deel) - + Turkey Turkije - + Trinidad and Tobago Trinidad en Tobago - + Tuvalu Tuvalu - + Taiwan Taiwan - + Tanzania, United Republic of Tanzania - + Ukraine Oekraïne - + Uganda Oeganda - + United States Minor Outlying Islands Kleine Pacifische eilanden van de Verenigde Staten - + United States Verenigde Staten - + Uruguay Uruguay - + Uzbekistan Oezbekistan - + Holy See (Vatican City State) Vaticaanstad - + Saint Vincent and the Grenadines Saint Vincent en de Grenadines - + Virgin Islands, British Britse Maagdeneilanden - + Virgin Islands, U.S. Amerikaanse Maagdeneilanden - + Vanuatu Vanuatu - + Wallis and Futuna Wallis en Futuna - + Samoa Samoa - + Yemen Jemen - + Mayotte Mayotte - + Serbia Servië - + South Africa Zuid-Afrika - + Zambia Zambia - + Montenegro Montenegro - + Zimbabwe Zimbabwe - + Aland Islands Åland - + Guernsey Guernsey - + Isle of Man Man - + Jersey Jersey - + Saint Barthelemy Saint-Barthélemy - + + Could not uncompress GeoIP database file. + Kon GeoIP-databasebestand niet uitpakken. + + + Couldn't save downloaded GeoIP database file. Kon gedownload GeoIP-databasebestand niet opslaan. - + Successfully updated GeoIP database. GeoIP-database succesvol bijgewerkt. - + Couldn't download GeoIP database file. Reason: %1 Kon GeoIP-database niet downloaden. Reden: %1 @@ -4596,12 +4146,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] UPnP/NAT-PMP-ondersteuning [AAN] - + UPnP / NAT-PMP support [OFF] UPnP/NAT-PMP-ondersteuning [UIT] @@ -4609,7 +4159,7 @@ Net::Smtp - + Email Notification Error: E-mail meldingsfout: @@ -4617,1279 +4167,1077 @@ OptionsDialog - + Options Opties - + Behavior Gedrag - + Downloads Downloads - + Connection Verbinding - + Speed Snelheid - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI Web-UI - + Advanced Geavanceerd - + Language Taal - + User Interface Language: Taal gebruikersinterface: - + (Requires restart) (opnieuw opstarten vereist) - + Transfer List Overdrachtlijst - + Confirm when deleting torrents Bevestigen bij verwijderen van torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. Afwisselende rijkleuren gebruiken - + Hide zero and infinity values Waarden nul en oneindig verbergen - + Always Altijd - + Paused torrents only Alleen gepauzeerde torrents - + Action on double-click Actie bij dubbelklikken - + Downloading torrents: Downloadende torrents: - - + + Start / Stop Torrent Torrent starten/stoppen - - + + Open destination folder Doelmap openen - - + + No action Geen actie - + Completed torrents: Voltooide torrents: - + Desktop Bureaublad - + Start qBittorrent on Windows start up qBittorrent starten bij opstarten van Windows - + Show splash screen on start up Splash-screen weergeven bij opstarten - + Start qBittorrent minimized qBittorrent geminimaliseerd starten - + Confirmation on exit when torrents are active Bevestiging bij afsluiten wanneer torrents actief zijn - + Confirmation on auto-exit when downloads finish Bevestiging bij automatisch afsluiten wanneer downloads voltooid zijn - - KiB - KiB - - - - Email notification &upon download completion - Melding via &e-mail wanneer download voltooid is - - - - Run e&xternal program on torrent completion - E&xtern programma uitvoeren bij voltooien van de torrent - - - - IP Fi&ltering - IP-fi&ltering - - - - Schedule &the use of alternative rate limits - Gebruik van al&ternatieve snelheidsbegrenzingen inplannen - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Meer informatie</a>) - - - - &Torrent Queueing - &Torrents in wachtrij plaatsen - - - - Seed torrents until their seeding time reaches - Torrents seeden totdat ze een seed-tijd bereiken van - - - - A&utomatically add these trackers to new downloads: - Deze trackers a&utomatisch toevoegen aan nieuwe downloads: - - - - RSS Reader - RSS-lezer - - - - Enable fetching RSS feeds - Ophalen van RSS-feeds inschakelen - - - - Feeds refresh interval: - Vernieuwinterval feeds: - - - - Maximum number of articles per feed: - Maximaal aantal artikels per feed: - - - - - min - minutes - min - - - - RSS Torrent Auto Downloader - RSS-torrent auto-downloader + + Show qBittorrent in notification area + qBittorrent weergeven in systeemvak - - Enable auto downloading of RSS torrents - Automatisch downloaden van RSS-torrents inschakelen - - - - Edit auto downloading rules... - Regels voor automatisch downloaden bewerken... - - - - Web User Interface (Remote control) - Web-gebruikersinterface (bediening op afstand) - - - - IP address: - IP-adres: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - IP-adres waarmee de Web-UI zal verbinden. -Geef een IPv4- of IPv6-adres op. U kunt "0.0.0.0" opgeven voor om het even welk IPv4-adres, -"::" voor om het even welk IPv6-adres of "*" voor IPv4 en IPv6. - - - - Server domains: - Server-domeinen: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - Whitelist voor filteren van http-host header-waarden. -Om te verdedigen tegen een DNS-rebinding-aanval -zet u er domeinnamen in die gebruikt worden door de WebUI-server. - -Gebruik ';' om meerdere items te splitsen. Jokerteken '*' kan gebruikt worden. - - - - &Use HTTPS instead of HTTP - &HTTPS in plaats van HTTP gebruiken - - - - Bypass authentication for clients on localhost - Authenticatie overslaan voor clients op localhost - - - - Bypass authentication for clients in whitelisted IP subnets - Authenticatie overslaan voor clients in toegestane IP-subnets - - - - IP subnet whitelist... - Toegestane IP-subnets... - - - - Upda&te my dynamic domain name - Mijn &dynamische domeinnaam bijwerken - - - + Minimize qBittorrent to notification area qBittorrent naar systeemvak minimaliseren - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. qBittorrent naar systeemvak sluiten - + Tray icon style: Stijl systeemvakpictogram - + Normal Normaal - + Monochrome (Dark theme) Monochroom (donker thema) - + Monochrome (Light theme) Monochroom (licht thema) - + File association Bestandskoppeling - + Use qBittorrent for .torrent files - qBittorrent gebruiken voor torrentbestanden + qBittorrent gebruiken voor .torrent-bestanden - + Use qBittorrent for magnet links qBittorrent gebruiken voor magneetlinks - + Power Management Energiebeheer - + + Inhibit system sleep when torrents are active + Slaapstand voorkomen wanneer torrents actief zijn + + + + Log file + Logbestand + + + Save path: Opslagpad: - + Backup the log file after: Back-up maken van logbestand na: - + + MB + MB + + + Delete backup logs older than: Back-up-logs verwijderen die ouder zijn dan: - + days Delete backup logs older than 10 months dagen - + months Delete backup logs older than 10 months maand - + years Delete backup logs older than 10 years jaar - + When adding a torrent Bij toevoegen torrent - + + Display torrent content and some options + Torrentinhoud en enkele opties weergeven + + + Bring torrent dialog to the front Torrent-dialoogvenster naar voor brengen - + Do not start the download automatically The torrent will be added to download list in pause state Download niet automatisch starten - + Should the .torrent file be deleted after adding it - Moet het torrentbestand verwijderd worden na toevoegen + Moet het .torrentbestand verwijderd worden na toevoegen + + + + Delete .torrent files afterwards + Torrentbestanden nadien verwijderen - + Also delete .torrent files whose addition was cancelled - Ook torrentbestanden verwijderen waarvan de toevoeging geannuleerd werd. + Ook .torrentbestanden verwijderen waarvan de toevoeging geannuleerd werd. - + Also when addition is cancelled Ook wanneer toevoeging geannuleerd is - + Warning! Data loss possible! Waarschuwing! Dataverlies mogelijk! - + Saving Management Opslagbeheer - + Default Torrent Management Mode: Standaard torrent-beheermodus: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category Automatische modus betekent dat verschillende torrent-eigenschappen (bijvoorbeeld opslagpad) bepaald zullen worden door de overeenkomstige categorie. - + Manual Manueel - + Automatic Automatisch - + When Torrent Category changed: Wanneer torrentcategorie wijzigt: - + Relocate torrent Torrent verplaatsen - + Switch torrent to Manual Mode Torrent wisselen naar handmatige modus - + When Default Save Path changed: Wanneer standaard opslagpad wijzigt: - - + + Relocate affected torrents Beïnvloede torrents verplaatsen - - + + Switch affected torrents to Manual Mode Beïnvloede torrents wisselen naar handmatige modus - + When Category changed: Wanneer categorie wijzigt: - + Use Subcategories Subcategorieën gebruiken - + Default Save Path: Standaard opslagpad: - + Keep incomplete torrents in: Onvoltooide torrents bewaren in: - + Copy .torrent files to: - Torrentbestanden kopiëren naar: - - - - Show &qBittorrent in notification area - &qBittorrent weergeven in systeemvak - - - - &Log file - &Logbestand + .torrentbestanden kopiëren naar: - - Display &torrent content and some options - &Torrentinhoud en enkele opties weergeven - - - - Create subfolder for torrents with multiple files - Submap aanmaken voor torrents met meerdere bestanden - - - - De&lete .torrent files afterwards - &Torrentbestanden nadien verwijderen - - - + Copy .torrent files for finished downloads to: Torrentbestanden voor voltooide downloads kopiëren naar: - + Pre-allocate disk space for all files Schijfruimte vooraf toewijzen voor alle bestanden - - Inhibit system sleep when torrents are downloading - Slaapstand voorkomen wanneer torrents aan het downloaden zijn - - - - Inhibit system sleep when torrents are seeding - Slaapstand voorkomen wanneer torrents aan het seeden zijn - - - + Append .!qB extension to incomplete files .!qB-extensie toevoegen aan onvolledige bestanden - - Enable recursive download dialog - Venster voor recursieve download inschakelen - - - + Automatically add torrents from: Torrents automatisch toevoegen vanuit: - + Add entry Entry toevoegen - + Remove entry Entry verwijderen - + + Email notification upon download completion + Melding via e-mail wanneer download voltooid is + + + + Destination email: + E-mail ontvanger: + + + SMTP server: SMTP-server: - + This server requires a secure connection (SSL) Deze server vereist een veilige verbinding (SSL) - - + + + Authentication Authenticatie - - - - + + + + Username: Gebruikersnaam: - - - - + + + + Password: Wachtwoord: - - Enabled protocol: - Ingeschakeld protocol: + + Run external program on torrent completion + Extern programma uitvoeren bij voltooien van de torrent - - TCP and μTP - TCP en µTP - - - + Listening Port Luisterpoort - + Port used for incoming connections: Poort voor inkomende verbindingen: - + Random Willekeurig - + Use UPnP / NAT-PMP port forwarding from my router UPnP/NAT-PMP port forwarding van mijn router gebruiken - + Use different port on each startup Bij elke opstart een andere poort gebruiken - + Connections Limits Begrenzing verbindingen - + Maximum number of connections per torrent: Maximaal aantal verbindingen per torrent: - + Global maximum number of connections: Algemeen maximaal aantal verbindingen: - + Maximum number of upload slots per torrent: Maximaal aantal uploadslots per torrent: - + Global maximum number of upload slots: Algemeen maximaal aantal uploadslots: - + Proxy Server Proxy-server - + Type: Type: - + (None) (Geen) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Host: - - + + Port: Poort: - + Otherwise, the proxy server is only used for tracker connections Anders wordt de proxy server alleen gebruikt voor trackerverbindingen - + Use proxy for peer connections Proxy gebruiken voor peer-verbindingen - + Disable connections not supported by proxies Verbindingen die niet ondersteund worden door proxy's uitschakelen - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Meer informatie</a>) - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection RSS-feeds, zoekmachine, software-updates of iets anders dan torrent-overdrachten en gerelateerde handelingen (zoals peer-uitwisselingen) zullen een directe verbinding gebruiken - + Use proxy only for torrents Proxy alleen voor torrents gebruiken - - A&uthentication - A&uthenticatie - - - + Info: The password is saved unencrypted Info: het wachtwoord wordt onversleuteld opgeslagen - + + IP Filtering + IP-filtering + + + Filter path (.dat, .p2p, .p2b): Filterpad (.dat, p2p, p2b): - + Reload the filter Filter opnieuw laden - - Manually banned IP addresses... - Manueel verbannen IP-adressen... - - - + Apply to trackers Toepassen op trackers - + Global Rate Limits Algemene snelheidsbegrenzingen - - - - - - - KiB/s - KiB/s - - - - + + Upload: Upload: - - + + + + + KiB/s + KiB/s + + + + Download: Download: - + Alternative Rate Limits Alternatieve snelheidsbegrenzingen - - + + Schedule the use of alternative rate limits + Gebruik van alternatieve snelheidsbegrenzingen inplannen + + + From: from (time1 to time2) Van: - - + To: time1 to time2 Tot: - + When: Wanneer: - + Every day Elke dag - + Weekdays Weekdagen - + Weekends Weekends - + Rate Limits Settings Instellingen snelheidsbegrenzing - + Apply rate limit to peers on LAN Snelheidslimiet toepassen op peers op LAN - + Apply rate limit to transport overhead Snelheidsbegrenzing toepassen op transport-overhead - - + + + Enable µTP protocol + µTP-protocol inschakelen + + + Apply rate limit to µTP protocol Snelheidsbegrenzing toepassen op µTP-protocol - + Privacy Privacy - + Enable DHT (decentralized network) to find more peers DHT (decentralized network) inschakelen om meer peers te vinden - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Peers uitwisselen met compatibele Bittorrent-clients (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers Peer Exchange (PeX) inschakelen om meer peers te vinden - + Look for peers on your local network Zoeken naar peers in uw lokaal netwerk - + Enable Local Peer Discovery to find more peers Lokale peer-ontdekking inschakelen om meer peers te vinden - + Encryption mode: Encryptiemodus: - + Prefer encryption Encryptie verkiezen - + Require encryption Encryptie vereisen - + Disable encryption Encryptie uitschakelen - + Enable when using a proxy or a VPN connection Inschakelen bij gebruik van een proxy of vpn-verbinding - + Enable anonymous mode Anonieme modus inschakelen - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Meer informatie</a>) + + + + Torrent Queueing + Torrents in wachtrij plaatsen + + + Maximum active downloads: Maximaal aantal actieve downloads: - + Maximum active uploads: Maximaal aantal actieve uploads: - + Maximum active torrents: Maximaal aantal actieve torrents: - + Do not count slow torrents in these limits Trage torrents niet meerekenen bij deze begrenzingen - - Upload rate threshold: - Uploadsnelheid-drempel: - - - - Download rate threshold: - Downloadsnelheid-drempel: - - - - sec - seconds - s - - - - Torrent inactivity timer: - Inactiviteitstimer van torrent: - - - + Share Ratio Limiting Deelverhouding begrenzen - + Seed torrents until their ratio reaches Torrents seeden totdat ze een verhouding bereiken van - + then en ze dan - + Pause them pauzeren - + Remove them verwijderen - - RSS Smart Episode Filters - RSS slimme afleveringsfilters + + Automatically add these trackers to new downloads: + Deze trackers automatisch toevoegen aan nieuwe downloads: + + + + Enable Web User Interface (Remote control) + Web-gebruikersinterface inschakelen (bediening op afstand) - + Use UPnP / NAT-PMP to forward the port from my router UPnP/NAT-PMP gebruiken om de poort van mijn router te forwarden - + + Use HTTPS instead of HTTP + HTTPS in plaats van HTTP gebruiken + + + Certificate: Certificaat: - + Import SSL Certificate SSL-certificaat importeren - + Key: Sleutel: - + Import SSL Key SSL-sleutel importeren - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Informatie over certificaten</a> - - Use alternative Web UI - Alternatieve web-UI gebruiken - - - - Files location: - Locatie van bestanden: - - - - Enable clickjacking protection - Clickjacking-bescherming inschakelen + + Bypass authentication for localhost + Authenticatie overslaan voor localhost - - Enable Cross-Site Request Forgery (CSRF) protection - Bescherming tegen Cross-Site Request Forgery (CSRF) inschakelen + + Update my dynamic domain name + Mijn dynamische domeinnaam bijwerken - + Service: Dienst: - + Register Registreren - + Domain name: Domeinnaam: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - Door deze opties in te schakelen, kunt u uw torrentbestanden <strong>onomkeerbaar kwijtraken</strong>! + Door deze opties in te schakelen, kunt u uw .torrentbestanden <strong>onomkeerbaar kwijtraken</strong>! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - Wanneer deze opties ingeschakeld zijn, zal qBittorrent torrentbestanden <strong>verwijderen</strong> nadat ze succesvol (de eerste optie) of niet (de tweede optie) toegevoegd zijn aan de downloadwachtrij. Dit wordt <strong>niet alleen</strong> toegepast op de bestanden die via de &ldquo;torrent toevoegen&rdquo;-menu-optie geopend worden, maar ook op de bestanden die via de <strong>bestandskoppeling</strong> geopend worden + Wanneer deze opties ingeschakeld zijn, zal qBittorrent .torrent-bestanden <strong>verwijderen</strong> nadat ze succesvol (de eerste optie) of niet (de tweede optie) toegevoegd zijn aan de downloadwachtrij. Dit wordt <strong>niet alleen</strong> toegepast op de bestanden die via de &ldquo;torrent toevoegen&rdquo;-menu-optie geopend worden, maar ook op de bestanden die via de <strong>bestandskoppeling</strong> geopend worden - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - Als u de tweede optie inschakelt (&ldquo;Ook als toevoegen geannuleerd wordt&rdquo;), zal het torrentbestand <strong>verwijderd worden</strong>, zelfs als u op &ldquo;<strong>annuleren</strong>&rdquo; drukt in het &ldquo;torrent toevoegen&rdquo;-scherm - - - - Choose Alternative UI files location - Locatie van bestanden van alternatieve UI kiezen + Als u de tweede optie inschakelt (&ldquo;Ook als toevoegen geannuleerd wordt&rdquo;), zal het .torrent-bestand <strong>verwijderd worden</strong>, zelfs als u op &ldquo;<strong>annuleren</strong>&rdquo; drukt in het &ldquo;torrent toevoegen&rdquo;-scherm - + Supported parameters (case sensitive): Ondersteunde parameters (hoofdlettergevoelig): - + %N: Torrent name %N: naam torrent - + %L: Category %L: categorie - - %G: Tags (seperated by comma) - %G: labels (gescheiden door komma) - - - + %F: Content path (same as root path for multifile torrent) %F: pad naar inhoud (zelfde als root-pad voor torrent met meerdere bestanden) - + %R: Root path (first torrent subdirectory path) %R: root-pad (pad naar eerste submap van torrent) - + %D: Save path %D: opslagpad - + %C: Number of files %C: aantal bestanden - + %Z: Torrent size (bytes) %Z: grootte torrent (bytes) - + %T: Current tracker %T: huidige tracker - + %I: Info hash %I: info-hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") Tip: omring de parameter met aanhalingstekens om te vermijden dat tekst afgekapt wordt bij witruimte (bijvoorbeeld: "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - Een torrent zal als traag beschouwd worden als zijn download- en uploadsnelheden onder deze waarden blijven voor het aantal seconden in "inactiviteitstimer van torrent". - - - + Select folder to monitor Map selecteren om te monitoren - + Folder is already being monitored: Map wordt reeds gemonitord: - + Folder does not exist: Map bestaat niet: - + Folder is not readable: Map kan niet gelezen worden: - + Adding entry failed Entry toevoegen mislukt - - - - + + Choose export directory Export-map kiezen - - - + + + + + + Choose a save directory Opslagmap kiezen - + Choose an IP filter file IP-filterbestand kiezen - + All supported filters Alle ondersteunde filters - + SSL Certificate SSL-certificaat - + + SSL Key + SSL-sleutel + + + Parsing error Verwerkingsfout - + Failed to parse the provided IP filter Verwerken van opgegeven IP-filter mislukt - + Successfully refreshed Vernieuwen gelukt - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Verwerken van opgegeven IP-filter gelukt: er werden %1 regels toegepast. - + Invalid key Ongeldige sleutel - + This is not a valid SSL key. Dit is geen geldige SSL-sleutel. - + Invalid certificate Ongeldig certificaat - - Preferences - Voorkeuren - - - - Import SSL certificate - SSL-certificaat importeren - - - + This is not a valid SSL certificate. Dit is geen geldig SSL-certificaat. - - Import SSL key - SSL-sleutel importeren - - - - SSL key - SSL-sleutel - - - + Time Error Tijd-fout - + The start time and the end time can't be the same. De starttijd en de eindtijd kan niet hetzelfde zijn. - - + + Length Error Lengte-fout - + The Web UI username must be at least 3 characters long. De Web-UI-gebruikersnaam moet minstens 3 tekens lang zijn. - + The Web UI password must be at least 6 characters long. Het Web-UI-wachtwoord moet minstens 6 tekens lang zijn. @@ -5897,72 +5245,72 @@ PeerInfo - - Interested(local) and Choked(peer) + + interested(local) and choked(peer) geïnteresseerd (lokaal) en gestopt (peer) - + interested(local) and unchoked(peer) geïnteresseerd (lokaal) en voortgezet (peer) - + interested(peer) and choked(local) geïnteresseerd (peer) en gestopt (lokaal) - + interested(peer) and unchoked(local) geïnteresseerd (peer) en voortgezet (lokaal) - + optimistic unchoke optimistisch voortzetten - + peer snubbed peer gestopt met uploaden - + incoming connection inkomende verbinding - + not interested(local) and unchoked(peer) niet geïnteresseerd (lokaal) en voortgezet (peer) - + not interested(peer) and unchoked(local) niet geïnteresseerd (peer) en voortgezet (lokaal) - + peer from PEX peer van PEX - + peer from DHT peer van DHT - + encrypted traffic versleuteld verkeer - + encrypted handshake versleutelde handdruk - + peer from LSD peer van LSD @@ -5970,180 +5318,165 @@ PeerListWidget - + IP IP - + Port Poort - + Flags Vlaggen - + Connection Verbinding - + Client i.e.: Client application Cliënt - + Progress i.e: % downloaded Voortgang - + Down Speed i.e: Download speed Downloadsnelheid - + Up Speed i.e: Upload speed Uploadsnelheid - + Downloaded i.e: total data downloaded Gedownload - + Uploaded i.e: total data uploaded Geüpload - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Relevantie - + Files i.e. files that are being downloaded right now Bestanden - + Column visibility Kolom-zichtbaarheid - + Add a new peer... Nieuwe peer toevoegen... - - + + Ban peer permanently Peer permanent bannen - + Manually adding peer '%1'... Peer '%1' manueel toevoegen... - + The peer '%1' could not be added to this torrent. Peer '%1' kon niet toegevoegd worden aan deze torrent. - + Manually banning peer '%1'... Peer '%1' manueel bannen... - - + + Peer addition Peer toevoegen - + Country Land - + Copy IP:port IP:poort kopiëren - + Some peers could not be added. Check the Log for details. Een aantal peers konden niet toegevoegd worden. Controleer het logbestand voor details. - + The peers were added to this torrent. De peers werden toegevoegd aan deze torrent. - + Are you sure you want to ban permanently the selected peers? - Weet u zeker dat u de geselecteerde peer permanent wilt bannen? + Bent u zeker dat u de geselecteerde peer permanent wilt bannen? - + &Yes &Ja - + &No &Nee - PeersAdditionDialog - - - Add Peers - Peers toevoegen - - - - List of peers to add (one IP per line): - Lijst van toe te voegen peers (een IP per regel): - - - - Format: IPv4:port / [IPv6]:port - Formaat: IPv4:poort / [IPv6]:poort - + PeersAdditionDlg - + No peer entered Geen peer ingevoerd - + Please type at least one peer. Typ ten minste één peer. - + Invalid peer Ongeldige peer - + The peer '%1' is invalid. Peer '%1' is ongeldig. @@ -6151,12 +5484,12 @@ PieceAvailabilityBar - + White: Unavailable pieces Wit: niet-beschikbare deeltjes - + Blue: Available pieces Blauw: beschikbare deeltjes @@ -6164,337 +5497,293 @@ PiecesBar - + Files in this piece: Bestanden in dit deeltje: - + File in this piece Bestand in dit deeltje - + File in these pieces Bestand in deze deeltjes - - Wait until metadata become available to see detailed information - Wacht totdat metadata beschikbaar wordt om gedetailleerde informatie te zien - - - + Hold Shift key for detailed information Shif-toets ingedrukt houden voor gedetailleerde informatie - PluginSelectDialog + PluginSelectDlg - + Search plugins Zoekplugins - + Installed search plugins: Geïnstalleerde zoekplugins: - + Name Naam - + Version Versie - + Url Url - - + + Enabled Ingeschakeld - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - Waarschuwing: verzeker u ervan dat u voldoet aan de wetten op auteursrecht in uw land wanneer u torrents downloadt via een van deze zoekmachines. - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> U kunt hier nieuwe zoekmachineplugins vinden:<a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one Een nieuwe installeren - + Check for updates Op updates controleren - + Close Sluiten - + Uninstall Deïnstalleren - - - + + + Yes Ja - - - - + + + + No Nee - + Uninstall warning Deïnstallatie-waarschuwing - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - Niet alle plugins konden verwijderd worden omdat ze bij qBittorrent horen. Alleen de door uzelf toegevoegde plugins kunnen verwijderd worden. + Niet alle plugins konden verwijderd worden omdat ze bij qBittorrent horen. Alleen de door uzelf toegevoegde plugins kunnen worden verwijderd. Deze plugins zijn uitgeschakeld. - + Uninstall success Deïnstallatie gelukt - + All selected plugins were uninstalled successfully - Alle geselecteerde plugins werden succesvol gedeïnstalleerd - - - - - - - Search plugin update - Plugin-update zoeken - - - - Plugins installed or updated: %1 - Plugins geïnstalleerd of bijgewerkt: %1 + Alle gekozen plugins zijn succesvol verwijderd - - + + New search engine plugin URL Nieuwe zoekmachineplugin-url - - + + URL: - Url: + URL: - + Invalid link Ongeldige link - + The link doesn't seem to point to a search engine plugin. - De link lijkt niet naar een zoekmachine-plugin te wijzen. + De link lijkt niet te wijzen naar een zoekmachine-plugin. - + Select search plugins Zoekplugins selecteren - + qBittorrent search plugin qBittorrent zoekplugin - + + + + Search plugin update + Plugin-update zoeken + + + All your plugins are already up to date. - Uw plugins zijn al allemaal bijgewerkt. + Uw plugins zijn al up-to-date. - + Sorry, couldn't check for plugin updates. %1 Sorry, kon niet controleren op plugin-updates. %1 - + + + Search plugin install Installatie zoekplugin - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + "%1" zoekmachineplugin is succesvol geïnstalleerd. + + + Couldn't install "%1" search engine plugin. %2 Kon "%1" zoekmachineplugin niet installeren. %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + "%1" zoekmachineplugin is succesvol bijgewerkt. + + + Couldn't update "%1" search engine plugin. %2 Kon "%1" zoekmachineplugin niet bijwerken. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source Plugin-bron - + Search plugin source: Zoekplugin-bron: - + Local file Lokaal bestand - + Web link Weblink - PowerManagement - - - qBittorrent is active - qBittorrent is actief - - - - PreviewSelectDialog - - - Preview - Voorbeeld - + PreviewSelect - + Name Naam - + Size Grootte - + Progress Voortgang - - + + Preview impossible Voorbeeld onmogelijk - - + + Sorry, we can't preview this file Sorry, we kunnen geen voorbeeld weergeven van dit bestand - Private::FileLineEdit - - - '%1' does not exist - '%1' bestaat niet - - - - '%1' does not point to a directory - '%1' wijst niet naar een map - - - - '%1' does not point to a file - '%1' wijst niet naar een bestand - - - - Does not have read permission in '%1' - Heeft geen leesrechten in '%1' - - - - Does not have write permission in '%1' - Heeft geen schrijfrechten in '%1' - - - PropListDelegate - + Not downloaded Niet gedownload - - + + Normal Normal (priority) Normaal - - N/A - N/B - - - + Do not download Do not download (priority) - Niet downloaden + Niet downloaden - - + + High High (priority) Hoog - + N/A + N/B + + + Mixed Mixed (priorities Gemengd - - + + Maximum Maximum (priority) Maximum @@ -6503,32 +5792,32 @@ PropTabBar - + General Algemeen - + Trackers Trackers - + Peers Peers - + HTTP Sources HTTP-bronnen - + Content Inhoud - + Speed Snelheid @@ -6622,22 +5911,22 @@ Opmerkingen: - + Select All Alles selecteren - + Select None Niets selecteren - + Normal Normaal - + High Hoog @@ -6697,165 +5986,165 @@ Opslagpad: - + Maximum Maximum + - Do not download Niet downloaden - + Never Nooit - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (%3 in bezit) - - + + %1 (%2 this session) %1 (%2 deze sessie) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (geseed voor %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 max) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 totaal) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 gem.) - + Open Openen - + Open Containing Folder Bijbehorende map openen - + Rename... Naam wijzigen... - + Priority Prioriteit - + New Web seed Nieuwe webseed - + Remove Web seed Webseed verwijderen - + Copy Web seed URL Webseed-url kopiëren - + Edit Web seed URL Webseed-url bewerken - + + Rename the file + Bestandsnaam wijzigen + + + New name: Nieuwe naam: - - + + + The file could not be renamed + De bestandsnaam kon niet gewijzigd worden + + + + This file name contains forbidden characters, please choose a different one. + Deze bestandsnaam bevat verboden tekens, gelieve een andere te kiezen. + + + + This name is already in use in this folder. Please use a different name. Deze naam bestaat al in deze map. Gelieve een andere naam te gebruiken. - + The folder could not be renamed De mapnaam kon niet gewijzigd worden - + qBittorrent qBittorrent - + Filter files... Bestanden filteren... - - Renaming - Naam wijzigen - - - - - Rename error - Fout bij naam wijzigen - - - - The name is empty or contains forbidden characters, please choose a different one. - De naam is leeg of bevat verboden tekens. Gelieve een andere te kiezen. - - - + New URL seed New HTTP source Nieuwe URL-seed - + New URL seed: Nieuwe URL-seed: - - + + This URL seed is already in the list. Deze URL-seed staat al in de lijst. - + Web seed editing Webseed bewerken - + Web seed URL: Webseed-url: @@ -6863,585 +6152,551 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + Uw IP-adres is geblokkeerd na te veel mislukte authenticatie-pogingen. + + + + Error: '%1' is not a valid torrent file. + + Fout: '%1' is geen geldig torrentbestand. + + + + + Error: Could not add torrent to session. + Fout: kon torrent niet aan sessie toevoegen. + + + + I/O Error: Could not create temporary file. + I/O-fout: kon geen tijdelijk bestand aanmaken. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 is een onbekende opdrachtregelparameter - - + + %1 must be the single command line parameter. %1 moet de enige opdrachtregelparameter zijn - + + %1 must specify the correct port (1 to 65535). + %1 moet de correcte poort specificeren (1 tot 65535). + + + You cannot use %1: qBittorrent is already running for this user. U kunt %1 niet gebruiken: qBittorrent wordt al uitgevoerd voor deze gebruiker. - + Usage: Gebruik: - + Options: Opties: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - Parameter '%1' moet syntax '%1 = %2' volgen + + Displays program version + Geeft programmaversie weer - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - Parameter '%1' moet syntax '%1 = %2' volgen + + Displays this help message + Geeft dit helpbericht weer - - Expected integer number in environment variable '%1', but got '%2' - Geheel nummer verwacht in omgevingsvariabele '%1', maar kreeg '%2' + + Changes the Web UI port (current: %1) + Wijzigt de web-UI-poort (huidige: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - Parameter '%1' moet syntax '%1 = %2' volgen + + Disable splash screen + Opstartscherm uitschakelen - - Expected %1 in environment variable '%2', but got '%3' - %1 verwacht in omgevingsvariabele '%2', maar kreeg '%3' + + Run in daemon-mode (background) + Uitvoeren in daemon-modus (achtergrond) - - port - poort + + Downloads the torrents passed by the user + Downloadt de torrents doorgegeven door de gebruiker - - %1 must specify a valid port (1 to 65535). - %1 moet een geldige poort opgeven (1 tot 65535). + + Help + Help - - Display program version and exit - Programmaversie weergeven en afsluiten + + Run application with -h option to read about command line parameters. + Voer de toepassing uit met optie -h om te lezen over opdrachtregelparameters - - Display this help message and exit - Dit helpbericht weergeven en afsluiten + + Bad command line + Slechte opdrachtregel - - Change the Web UI port - De web-UI-poort wijzigen + + Bad command line: + Slechte opdrachtregel: - - Disable splash screen - Opstartscherm uitschakelen + + Legal Notice + Juridische mededeling - - Run in daemon-mode (background) - Uitvoeren in daemon-modus (achtergrond) + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + qBittorrent is een bestanddelingsprogramma. Als u een torrent gebruikt zal zijn data beschikbaar worden gesteld voor anderen door het te uploaden. Elke inhoud die u deelt is alleen uw verantwoordelijkheid. + +Er zullen geen verdere kennisgevingen meer gedaan worden. - - dir - Use appropriate short form or abbreviation of "directory" - map + + Press %1 key to accept and continue... + Druk op de %1-toets om te accepteren en verder te gaan... - - Store configuration files in <dir> - Configuratiebestanden opslaan in <dir> + + Legal notice + Juridische mededeling - - - name - naam + + Cancel + Annuleren - - Store configuration files in directories qBittorrent_<name> - Configuratiebestanden opslaan in mappen qBittorrent_<name> + + I Agree + Akkoord - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - In de bestanden voor snel hervatten van libtorrent hacken en bestandspaden relatief aan de profielmap maken. + + Torrent name: %1 + Naam torrent: %1 - - files or URLs - bestanden of url's + + Torrent size: %1 + Grootte torrent: %1 - - Download the torrents passed by the user - Torrents doorgegeven door de gebruiker downloaden + + Save path: %1 + Opslagpad: %1 - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Opgeven of het "nieuwe torrent toevoegen"-venster opent bij het toevoegen van een torrent. + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + De torrent werd gedownload in %1. - - Options when adding new torrents: - Opties bij het toevoegen van nieuwe torrents: + + Thank you for using qBittorrent. + Bedankt om qBittorrent te gebruiken. - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Snelkoppeling voor %1 + + [qBittorrent] '%1' has finished downloading + [qBittorrent] '%1' is klaar met downloaden - - path - pad + + The remote host name was not found (invalid hostname) + De externe hostnaam werd niet teruggevonden (ongeldige hostnaam) - - Torrent save path - Opslagpad torrent + + The operation was canceled + De handeling werd geannuleerd - - Add torrents as started or paused - Torrents als gestart of gepauzeerd toevoegen + + The remote server closed the connection prematurely, before the entire reply was received and processed + De externe server heeft de verbinding vroegtijdig afgesloten, voordat het volledige antwoord ontvangen en verwerkt werd - - Skip hash check - Hash-check overslaan + + The connection to the remote server timed out + De verbinding met de externe server is verlopen - - Assign torrents to category. If the category doesn't exist, it will be created. - Torrents aan categorie toewijzen. Als de categorie niet bestaat, zal hij aangemaakt worden. + + SSL/TLS handshake failed + SSL/TLS handshake mislukt - - Download files in sequential order - Bestanden in sequentiële volgorde downloaden + + The remote server refused the connection + De externe server heeft de verbinding geweigerd - - Download first and last pieces first - Eerste en laatste deeltjes eerst downloaden + + The connection to the proxy server was refused + De verbinding naar de proxyserver werd geweigerd - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - Optiewaarden kunnen voorzien worden via omgevingsvariabelen. Voor optie 'parameter-naam' is de naam van de omgevingsvariabele 'QBT_PARAMETER_NAAM' (in hoofdletters, '-' vervangen door '_'). Om vlagwaarden door te geven stelt u de variabele in op '1' of 'TRUE'. Om bijvoorbeeld het 'splash screen' uit te schakelen: + + The proxy server closed the connection prematurely + De proxyserver heeft de verbinding vroegtijdig afgesloten - - Command line parameters take precedence over environment variables - Opdrachtregelparameters krijgen voorrang op omgevingsvariabelen + + The proxy host name was not found + De proxy-hostnaam werd niet gevonden - - Help - Help + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + De verbinding naar de proxy is verlopen of de proxy reageerde niet op tijd op het verzonden verzoek - - Run application with -h option to read about command line parameters. - Voer de toepassing uit met optie -h om te lezen over opdrachtregelparameters + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + De proxy vereist authenticatie om in te kunnen gaan op het verzoek maar accepteerde geen van de aangeboden aanmeldingsgegevens - - Bad command line - Slechte opdrachtregel + + The access to the remote content was denied (401) + De toegang tot de externe inhoud werd geweigerd (401) - - Bad command line: - Slechte opdrachtregel: + + The operation requested on the remote content is not permitted + De gevraagde handeling op de externe inhoud is niet toegestaan - - Legal Notice - Juridische mededeling + + The remote content was not found at the server (404) + De externe inhoud werd niet teruggevonden op de server (404) - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - qBittorrent is een bestanddelingsprogramma. Als u een torrent gebruikt zal zijn data beschikbaar worden gesteld voor anderen door het te uploaden. Elke inhoud die u deelt is alleen uw verantwoordelijkheid. + + The remote server requires authentication to serve the content but the credentials provided were not accepted + De externe server vereist authenticatie om de inhoud aan te bieden maar de gegeven aanmeldingsgegevens werden niet geaccepteerd - - No further notices will be issued. - Er zullen geen verdere meldingen meer gedaan worden. + + The Network Access API cannot honor the request because the protocol is not known + De netwerktoegang-API kon niet ingaan op het verzoek omdat het protocol niet bekend is - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - qBittorrent is een bestanddelingsprogramma. Als u een torrent gebruikt zal zijn data beschikbaar worden gesteld voor anderen door het te uploaden. Elke inhoud die u deelt is alleen uw verantwoordelijkheid. - -Er zullen geen verdere kennisgevingen meer gedaan worden. + + The requested operation is invalid for this protocol + De gevraagde handeling is niet geldig voor dit protocol - - Press %1 key to accept and continue... - Druk op de %1-toets om te accepteren en verder te gaan... + + An unknown network-related error was detected + Er werd een onbekende netwerkgerelateerde fout gevonden - - Legal notice - Juridische mededeling + + An unknown proxy-related error was detected + Er werd een onbekende proxy-gerelateerde fout gevonden - - Cancel - Annuleren + + An unknown error related to the remote content was detected + Er werd een onbekende fout, gerelateerd aan de externe inhoud, gevonden - - I Agree - Akkoord + + A breakdown in protocol was detected + Er werd een storing in het protocol gedetecteerd - - + + Unknown error + Onbekende fout + + + + Upgrade Upgraden - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] U heeft bijgewerkt vanaf een oudere versie die dingen op een andere manier opsloeg. U moet migreren naar het nieuwe opslagsysteem. U zult een oudere versie dan v3.3.0 niet meer opnieuw kunnen gebruiken. Doorgaan? [j/n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. U heeft bijgewerkt vanaf een oudere versie die dingen op een andere manier opsloeg. U moet migreren naar het nieuwe opslagsysteem. Als u verdergaat, zult u een oudere versie dan v3.3.0 niet meer opnieuw kunnen gebruiken. - + Couldn't migrate torrent with hash: %1 Kon torrent met hash %1 niet migreren - + Couldn't migrate torrent. Invalid fastresume file name: %1 Kon torrent niet migreren. Ongeldige bestandsnaam voor snel hervatten: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 - Programma is foutief beëindigd. Fallback-bestand wordt gebruikt om instellingen te herstellen: %1 + + Detected unclean program exit. Using fallback file to restore settings. + Programma is foutief beëindigd. Fallback-bestand wordt gebruikt om instellingen te herstellen. - + An access error occurred while trying to write the configuration file. Er trad toegangsfout op tijdens het proberen schrijven van het configuratiebestand. - + A format error occurred while trying to write the configuration file. Er trad een formatteringsfout op tijdens het proberen schrijven van het configuratiebestand. - - - An unknown error occurred while trying to write the configuration file. - Er trad een onbekende fout op tijdens het proberen schrijven van het configuratiebestand. - - RSS::AutoDownloader + RSS - - - Invalid data format. - Ongeldig dataformaat. + + Search + Zoeken - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - Kon data van RSS AutoDownloader niet opslaan in %1. Fout: %2 - - - - Invalid data format - Ongeldig dataformaat - - - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - Kon regels van RSS AutoDownloader niet lezen van %1. Fout: %2 - - - - Couldn't load RSS AutoDownloader rules. Reason: %1 - Kon regels van RSS AutoDownloader niet laden. Reden: %1 - - - - RSS::Feed - - - Failed to download RSS feed at '%1'. Reason: %2 - Kon rss-feed niet downloaden op '%1'. Reden: %2 - - - - RSS feed at '%1' updated. Added %2 new articles. - Rss-feed op '%1' bijgewerkt. %2 nieuwe artikels toegevoegd. - - - - Failed to parse RSS feed at '%1'. Reason: %2 - Kon rss-feed niet verwerken op '%1'. Reden: %2 - - - - Couldn't read RSS Session data from %1. Error: %2 - Kon rss-sessiedata niet lezen van %1. Fout: %2 - - - - Couldn't parse RSS Session data. Error: %1 - Kon rss-sessiedata niet verwerken. Fout: %1 - - - - Couldn't load RSS Session data. Invalid data format. - Kon rss-sessiedata niet laden. Ongeldig gegevensformaat. - - - - Couldn't load RSS article '%1#%2'. Invalid data format. - Kon rss-artikel '%1%2' niet laden. Ongeldig gegevensformaat. - - - - RSS::Private::Parser - - - Invalid RSS feed. - Ongeldige rss-feed. - - - - %1 (line: %2, column: %3, offset: %4). - %1 (regel: %2, kolom: %3, offset: %4). - - - - RSS::Session - - - RSS feed with given URL already exists: %1. - RSS-feed met opgegeven url bestaat reeds: %1. - - - - Cannot move root folder. - Kan hoofdmap niet verplaatsen. - - - - - Item doesn't exist: %1. - Item bestaat niet: %1. - - - - Cannot delete root folder. - Kan hoofdmap niet verwijderen. - - - - Incorrect RSS Item path: %1. - Onjuist RSS-item-pad: %1. - - - - RSS item with given path already exists: %1. - RSS-item met opgegeven pad bestaat reeds: %1. - - - - Parent folder doesn't exist: %1. - Bovenliggende map bestaat niet: %1. - - - - RSSWidget - - - Search - Zoeken - - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - Ophalen van RSS-feeds is nu uitgeschakeld! U kunt het inschakelen in toepassingsinstellingen. - - - + New subscription Nieuw abonnement - - - + + + Mark items read Items als gelezen markeren - - Refresh RSS streams - RSS-streams vernieuwen - - - + Update all Alles bijwerken - + RSS Downloader... RSS-downloader... - + + Settings... + Instellingen... + + + Torrents: (double-click to download) Torrents: (dubbelklikken om te downloaden) - - + + Delete Verwijderen - + Rename... Naam wijzigen... - + Rename Naam wijzigen - - + + Update Bijwerken - + New subscription... Nieuw abonnement... - - + + Update all feeds Alle feeds bijwerken - + Download torrent Torrent downloaden - + Open news URL Nieuws-url openen - + Copy feed URL Feed-url kopiëren - + New folder... Nieuwe map... - + + Refresh RSS streams + RSS-streams vernieuwen + + + + RSSImp + + + Stream URL: + Stream-url: + + + + Please type a RSS stream URL + Gelieve een RSS-stream-URL in te geven + + + + This RSS feed is already in the list. + Deze RSS-feed staat al in de lijst. + + + Please choose a folder name Mapnaam kiezen - + Folder name: Mapnaam: - + New folder Nieuwe map - - Please type a RSS feed URL - Type een RSS-feed-url - - - - Feed URL: - Feed-url: - - - + Deletion confirmation - Bevestiging verwijdering + Verwijderbevestiging - + Are you sure you want to delete the selected RSS feeds? Weet u zeker dat u de geselecteerde RSS-feeds wilt verwijderen? - + Please choose a new name for this RSS feed - Kies een nieuwe naam voor deze RSS feed + Nieuwe naam kiezen voor deze rss-feed - + New feed name: Nieuwe feed-naam: - - Rename failed - Naam wijzigen mislukt + + Name already in use + Naam al in gebruik + + + + This name is already used by another item, please choose another one. + Deze naam is al gebruikt door een ander item, kies een andere naam. - + Date: Datum: - + Author: Auteur: + + + Unread + Ongelezen + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + Automatische download van '%1' van '%2' RSS-feed mislukt omdat het geen torrent of magneetlink bevat... + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + Automatisch downloaden van '%1' torrent van '%2' RSS-feed... + + + + Rss::Private::Parser + + + Invalid RSS feed. + Ongeldige rss-feed. + + + + RssSettingsDlg + + + RSS Reader Settings + Instellingen rss-lezer + + + + RSS feeds refresh interval: + Vernieuwinterval rss-feeds: + + + + min + min + + + + Maximum number of articles per feed: + Maximaal aantal artikels per feed: + ScanFoldersDelegate - + Select save location Selecteer opslaglocatie @@ -7449,274 +6704,268 @@ ScanFoldersModel - + Monitored Folder Gemonitorde map - + Override Save Location Opslaglocatie overschrijven - + Monitored folder Gemonitorde map - + Default save location Standaard opslaglocatie - + Browse... Bladeren... - SearchJobWidget + SearchEngine - - Form - Vorm + + Unknown search engine plugin file format. + Onbekend bestandsformaat zoekmachineplugin. - - Results(xxx) - Resultaten(xxx) + + A more recent version of this plugin is already installed. + Een nieuwere versie van deze plugin is al geïnstalleerd. - - Search in: - Zoeken in: + + + Plugin is not supported. + Plugin wordt niet ondersteund. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - <html><head/><body><p>Sommige zoekmachines zoeken ook in de beschrijving van de torrent en de naam van het torrentbestand. Of deze resultaten weergegeven worden in onderstaande lijst, wordt geregeld via deze modus.</p><p><span style=" font-weight:600;">Overal </span>schakelt filteren uit en geeft alles weer dat door de zoekmachines gevonden werd.</p><p><span style=" font-weight:600;">Alleen torrentnamen</span> geeft alleen torrents weer waarvan de namen overeenkomen met de zoekopdracht.</p></body></html> + + Update server is temporarily unavailable. %1 + Updateserver is tijdelijk niet bereikbaar. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - <html><head/><body><p>Minimaal en maximaal aantal toegestane seeders instellen</p></body></html> + + + Failed to download the plugin file. %1 + Downloaden van pluginbestand mislukt. %1 - - Seeds: - Seeds: + + An incorrect update info received. + Onjuiste update-info ontvangen. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - <html><head/><body><p>Minimaal aantal seeds</p></body></html> + + All categories + Alle categorieën - - - to - tot + + Movies + Films - - <html><head/><body><p>Maximal number of seeds</p></body></html> - <html><head/><body><p>Maximaal aantal seeds</p></body></html> + + TV shows + Tv-shows - - - - + + Music + Muziek - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - <html><head/><body><p>Minimale en maximale toegestane grootte van een torrent instellen</p></body></html> + + Games + Spellen - - Size: - Grootte: + + Anime + Anime - - <html><head/><body><p>Minimal torrent size</p></body></html> - <html><head/><body><p>Minimale torrentgrootte</p></body></html> + + Software + Software - - <html><head/><body><p>Maximal torrent size</p></body></html> - <html><head/><body><p>Maximale torrentgrootte</p></body></html> + + Pictures + Afbeeldingen + + + + Books + Boeken + + + + SearchListDelegate + + + + Unknown + Onbekend + + + SearchTab - + Name i.e: file name Naam - + Size i.e: file size Grootte - + Seeders i.e: Number of full sources Seeders - + Leechers i.e: Number of partial sources Leechers - + Search engine Zoekmachine - - Filter search results... - Zoekresultaten filteren... - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results Resultaten (<i>%1</i> van <i>%2</i>): - + Torrent names only Alleen torrentnamen - + Everywhere Overal - - Use regular expressions - Reguliere expressies gebruiken - - - + Searching... Zoeken... - + Search has finished Zoeken is klaar - + Search aborted Zoeken afgebroken - + An error occurred during search... Er trad een fout op tijdens het zoeken... - + Search returned no results Zoeken gaf geen resultaten - + Column visibility - Kolom-zichtbaarheid - - - - SearchPluginManager - - - Unknown search engine plugin file format. - Onbekend bestandsformaat van zoekmachineplugin. - - - - A more recent version of this plugin is already installed. - Er is al een nieuwere versie van deze plugin geïnstalleerd. + Kolom-zichtbaarheid - - - Plugin is not supported. - Plugin wordt niet ondersteund. + + Form + Vorm - - All categories - Alle categorieën + + Results(xxx) + Resultaten(xxx) - - Movies - Films + + Search in: + Zoeken in: - - TV shows - Tv-shows + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Sommige zoekmachines zoeken ook in de beschrijving van de torrent en de naam van het torrentbestand. Of deze resultaten weergegeven worden in onderstaande lijst, wordt geregeld via deze modus.</p><p><span style=" font-weight:600;">Overal </span>schakelt filteren uit en geeft alles weer dat door de zoekmachines gevonden werd.</p><p><span style=" font-weight:600;">Alleen torrentnamen</span> geeft alleen torrents weer waarvan de namen overeenkomen met de zoekopdracht.</p></body></html> - - Music - Muziek + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Minimaal en maximaal aantal toegestane seeders instellen</p></body></html> - - Games - Spellen + + Seeds: + Seeds: - - Anime - Anime + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Minimaal aantal seeds</p></body></html> - - Software - Software + + + to + tot - - Pictures - Afbeeldingen + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Maximaal aantal seeds</p></body></html> - - - Books - Boeken + + + + + - - Update server is temporarily unavailable. %1 - Updateserver is tijdelijk niet bereikbaar. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Minimale en maximale toegestane grootte van een torrent instellen</p></body></html> - - - Failed to download the plugin file. %1 - Downloaden van pluginbestand mislukt. %1 + + Size: + Grootte: - - An incorrect update info received. - Onjuiste update-info ontvangen. + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Minimale torrentgrootte</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - Zoekplugin '%1' bevat ongeldige versie-string ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Maximale torrentgrootte</p></body></html> @@ -7724,198 +6973,185 @@ - - - - + + + Search Zoeken - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - Er zijn geen zoekplugins geïnstalleerd. -Klik op de "plugins zoeken..."-knop rechtsonder het venster om er een aantal te installeren. - - - + Download Download - + Go to description page Naar de beschrijvingspagina gaan - + Copy description page URL Link van beschrijvingspagina kopiëren - + Search plugins... Zoekplugins... - + A phrase to search for. Een zin om naar te zoeken. - + Spaces in a search term may be protected by double quotes. Spaties in een zoekterm kunnen beschermd worden door dubbele aanhalingstekens. - + Example: Search phrase example Voorbeeld: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>: zoekt naar <b>foo</b> en <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: zoekt naar <b>foo bar</b> - + All plugins Alle plugins - + Only enabled Alleen ingeschakeld - + Select... Selecteer... - - - + + + Search Engine Zoekmachine - + Please install Python to use the Search Engine. Installeer Python om de zoekmachine te gebruiken. - + Empty search pattern Leeg zoekpatroon - + Please type a search pattern first Typ eerst een zoekpatroon - + Stop Stoppen - + Search has finished Zoeken is klaar - + Search has failed Zoeken mislukt - ShutdownConfirmDialog - - - Don't show again - Niet opnieuw weergeven - + ShutdownConfirmDlg - + qBittorrent will now exit. qBittorrent zal nu afsluiten. - + E&xit Now - Nu &sluiten + Nu a&fsluiten - + Exit confirmation - Bevestiging voor sluiten + Afsluiten bevestigen - + The computer is going to shutdown. - De computer zal uitschakelen. + De computer zal afsluiten. - + &Shutdown Now - Nu uit&schakelen - - - - Shutdown confirmation - Bevestiging voor uitschakelen + Nu af&sluiten - + The computer is going to enter suspend mode. De computer zal in stand-by gaan. - + &Suspend Now Nu in &stand-by - + Suspend confirmation Bevestiging voor stand-by - + The computer is going to enter hibernation mode. De computer zal in sluimerstand gaan. - + &Hibernate Now Nu in &sluimerstand - + Hibernate confirmation Bevestiging voor sluimerstand - + You can cancel the action within %1 seconds. U kunt de handeling annuleren binnen %1 seconden. + + + Shutdown confirmation + Bevestiging voor afsluiten + SpeedLimitDialog - + KiB/s KiB/s @@ -7923,52 +7159,52 @@ SpeedPlotView - + Total Upload Totale upload - + Total Download Totale download - + Payload Upload Payload-upload - + Payload Download Payload-download - + Overhead Upload Overhead-upload - + Overhead Download Overhead-download - + DHT Upload DHT-upload - + DHT Download DHT-download - + Tracker Upload Tracker-upload - + Tracker Download Tracker-download @@ -7976,95 +7212,87 @@ SpeedWidget - + Period: Tijdspanne: - + 1 Minute 1 minuut - + 5 Minutes 5 minuten - + 30 Minutes 30 minuten - + 6 Hours 6 uur - + Select Graphs Grafieken selecteren - + Total Upload Totale upload - + Total Download Totale download - + Payload Upload Payload-upload - + Payload Download Payload-download - + Overhead Upload Overhead-upload - + Overhead Download Overhead-download - + DHT Upload DHT-upload - + DHT Download DHT-download - + Tracker Upload Tracker-upload - + Tracker Download Tracker-download - StacktraceDialog - - - Crash info - Crash-info - - - StatsDialog @@ -8077,49 +7305,49 @@ Gebruikersstatistieken - - Cache statistics - Buffer-statistieken + + Total peer connections: + Totaal aantal peerverbindingen: - - Read cache hits: - Leesbuffer-hits: + + Global ratio: + Algemene verhouding: - - Average time in queue: - Gemiddelde tijd in wachtrij: + + Alltime download: + Totale download: - - Connected peers: - Verbonden peers: + + Alltime upload: + Totale upload: - - All-time share ratio: - Deelverhouding van altijd: + + Total waste (this session): + Totaal verloren (deze sessie): - - All-time download: - Download van altijd: + + Cache statistics + Buffer-statistieken - - Session waste: - Sessie-verlies: + + Read cache hits: + Leesbuffer-hits: - - All-time upload: - Upload van altijd: + + Average time in queue: + Gemiddelde tijd in wachtrij: - Total buffer size: - Totale buffergrootte: + Total buffers size: + Totale grootte buffers: @@ -8147,7 +7375,12 @@ Totale grootte van wachtrij: - + + OK + Ok + + + %1 ms 18 milliseconds %1 ms @@ -8156,27 +7389,32 @@ StatusBar - + Connection status: Verbindingsstatus: - + No direct connections. This may indicate network configuration problems. Geen directe verbindingen. Dit kan komen door netwerkconfiguratieproblemen. - + DHT: %1 nodes DHT: %1 nodes - - qBittorrent needs to be restarted! - qBittorrent moet opnieuw opgestart worden! + + qBittorrent needs to be restarted + qBittorrent moet opnieuw opgestart worden + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent is bijgewerkt en moet opnieuw opgestart worden om de wijzigingen toe te passen. @@ -8195,883 +7433,616 @@ Online - + Click to switch to alternative speed limits Klikken om alternatieve snelheidbegrenzing in te schakelen - + Click to switch to regular speed limits Klikken om algemene snelheidbegrenzing in te schakelen - + + Manual change of rate limits mode. The scheduler is disabled. + Handmatige wijziging van snelheidbegrenzing. De planner is uitgeschakeld. + + + Global Download Speed Limit Algemene begrenzing downloadsnelheid - + Global Upload Speed Limit Algemene begrenzing uploadsnelheid - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter Alles (0) - + Downloading (0) Downloaden (0) - + Seeding (0) Seeden (0) - + Completed (0) Voltooid (0) - + Resumed (0) Hervat (0) - + Paused (0) Gepauzeerd (0) - + Active (0) Actief (0) - + Inactive (0) Niet actief (0) - + Errored (0) Met fouten (0) - + All (%1) Alles (%1) - + Downloading (%1) Downloaden (%1) - + Seeding (%1) Seeden (%1) - + Completed (%1) Voltooid (%1) - + Paused (%1) Gepauzeerd (%1) - + Resumed (%1) Hervat (%1) - + Active (%1) Actief (%1) - + Inactive (%1) Niet actief (%1) - + Errored (%1) Met fouten (%1) - TagFilterModel + TorrentContentModel - - Tags - Labels + + Name + Naam - - All - Alle + + Size + Grootte - - Untagged - Niet gelabeld + + Progress + Voortgang - - - TagFilterWidget - - Add tag... - Label toevoegen... + + Download Priority + Downloadprioriteit - - Remove tag - Label verwijderen + + Remaining + Resterend + + + TorrentCreatorDlg - - Remove unused tags - Niet-gebruikte labels verwijderen + + Select a folder to add to the torrent + Map selecteren om toe te voegen aan de torrent - - Resume torrents - Torrents hervatten + + Select a file to add to the torrent + Bestand selecteren om toe te voegen aan de torrent - - Pause torrents - Torrents pauzeren + + No input path set + Geen invoerpad ingesteld - - Delete torrents - Torrents verwijderen + + Please type an input path first + Geef eerst een invoerpad op - - New Tag - Nieuw label + + Select destination torrent file + Doel-torrentbestand selecteren - - Tag: - Label: + + Torrent Files (*.torrent) + Torrentbestanden (*.torrent) - - Invalid tag name - Ongeldige labelnaam + + Torrent was created successfully: %1 + %1 is the path of the torrent + Torrent succesvol aangemaakt: %1 - - Tag name '%1' is invalid - Labelnaam '%1' is ongeldig + + + + Torrent creation + Torrent aanmaken - - Tag exists - Label bestaat + + Torrent creation was unsuccessful, reason: %1 + Fout tijdens het maken van torrent, reden: %1 - - Tag name already exists. - Labelnaam bestaat al. + + Created torrent file is invalid. It won't be added to download list. + Aangemaakt torrentbestand is ongeldig. Het wordt niet toegevoegd aan de downloadlijst. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Eigenschappen torrent-categorie + + Name + i.e: torrent name + Naam - - Name: - Naam: + + Size + i.e: torrent size + Grootte - - Save path: - Opslagpad: + + Done + % Done + Klaar - - Choose save path - Opslagpad kiezen + + Status + Torrent status (e.g. downloading, seeding, paused) + Status - - New Category - Nieuwe categorie + + Seeds + i.e. full sources (often untranslated) + Seeds - - Invalid category name - Ongeldige categorienaam + + Peers + i.e. partial sources (often untranslated) + Peers - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - Categorienaam mag geen '\' bevatten. -Categorienaam mag niet beginnen/eindigen met '/'. -Categorienaam mag de '//'-opeenvolging niet bevatten. + + Down Speed + i.e: Download speed + Downloadsnelheid - - Category creation error - Fout bij aanmaken categorie + + Up Speed + i.e: Upload speed + Uploadsnelheid - - Category with the given name already exists. -Please choose a different name and try again. - Er bestaat reeds een categorie met opgegeven naam. -Kies een andere naam en probeer het opnieuw. + + Ratio + Share ratio + Verhouding - - - TorrentContentModel - - Name - Naam + + ETA + i.e: Estimated Time of Arrival / Time left + Geschatte resterende tijd - - Size - Grootte + + Category + Categorie - - Progress - Voortgang + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Toegevoegd op - - Download Priority - Downloadprioriteit + + Completed On + Torrent was completed on 01/01/2010 08:00 + Voltooid op - - Remaining - Resterend + + Tracker + Tracker - - Availability - Beschikbaarheid + + Down Limit + i.e: Download limit + Downloadbegrenzing - - - TorrentCreatorDialog - - Torrent Creator - Torrent aanmaken + + Up Limit + i.e: Upload limit + Uploadbegrenzing - - Select file/folder to share - Map/bestand selecteren om te delen + + Downloaded + Amount of data downloaded (e.g. in MB) + Gedownload - - Path: - Pad: + + Uploaded + Amount of data uploaded (e.g. in MB) + Geüpload - - [Drag and drop area] - [Gebied voor slepen en neerzetten] + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Sessie-download - - - Select file - Bestand selecteren + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Sessie-upload - - - Select folder - Map selecteren + + Remaining + Amount of data left to download (e.g. in MB) + Resterend - - Settings - Instellingen + + Time Active + Time (duration) the torrent is active (not paused) + Tijd actief - - Piece size: - Grootte deeltjes: + + Save path + Torrent save path + Opslagpad - - Auto - Auto + + Completed + Amount of data completed (e.g. in MB) + Voltooid - - 16 KiB - 16 KiB + + Ratio Limit + Upload share ratio limit + Begrenzing deelverhouding - - 32 KiB - 32 KiB + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Laatst volledig gezien - - 64 KiB - 64 KiB + + Last Activity + Time passed since a chunk was downloaded/uploaded + Laatste activiteit - - 128 KiB - 128 KiB + + Total Size + i.e. Size including unwanted data + Totale grootte + + + TrackerFiltersList - - 256 KiB - 256 KiB + + All (0) + this is for the tracker filter + Alles (0) - - 512 KiB - 512 KiB + + Trackerless (0) + Zonder trackers (0) - - 1 MiB - 1 MiB + + Error (0) + Fout (0) - - 2 MiB - 2 MiB + + Warning (0) + Waarschuwing (0) - - 4 MiB - 4 MiB + + + Trackerless (%1) + Zonder trackers (%1) - - 8 MiB - 8 MiB + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - 16 MiB - 16 MiB + + + Error (%1) + Fout (%1) - - 32 MiB - 32 MiB + + + Warning (%1) + Waarschuwing (%1) - - Calculate number of pieces: - Aantal deeltjes berekenen: + + Resume torrents + Torrents hervatten - - Private torrent (Won't distribute on DHT network) - Privétorrent (zal niet verdelen op het DHT-netwerk) + + Pause torrents + Torrents pauzeren - - Start seeding immediately - Onmiddellijk beginnen seeden + + Delete torrents + Torrents verwijderen - - Ignore share ratio limits for this torrent - Deelverhoudingsbegrenzing negeren voor deze torrent - - - - Optimize alignment - Uitlijning optimaliseren - - - - Fields - Velden - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - U kunt tracker tiers/groepen scheiden met een lege regel. - - - - Web seed URLs: - Webseed-url's: - - - - Tracker URLs: - Tracker-url's: - - - - Comments: - Opmerkingen: - - - - Source: - Bron: - - - - Progress: - Voortgang: - - - - Create Torrent - Torrent aanmaken - - - - - - Torrent creation failed - Torrent aanmaken mislukt - - - - Reason: Path to file/folder is not readable. - Reden: pad naar bestand/map is niet leesbaar. - - - - Select where to save the new torrent - Selecteer waar de nieuwe torrent moet opgeslagen worden - - - - Torrent Files (*.torrent) - Torrentbestanden (*.torrent) - - - - Reason: %1 - Reden: %1 - - - - Reason: Created torrent is invalid. It won't be added to download list. - Reden: aangemaakte torrent is ongeldig. Hij zal niet aan de downloadlijst toegevoegd worden. - - - - Torrent creator - Torrent aanmaken - - - - Torrent created: - Torrent aangemaakt: - - - - TorrentInfo - - - File size exceeds max limit %1 - Bestandsgrootte overschrijdt maximale grens van %1 - - - - Torrent file read error: %1 - Leesfout bij torrentbestand: %1 - - - - Torrent file read error: size mismatch - Leesfout bij torrentbestand: grootte komt niet overeen + + + All (%1) + this is for the tracker filter + Alles (%1) - TorrentsController - - - Not contacted yet - Nog niet gecontacteerd - - - - Updating... - Bijwerken... - - - - Working - Werkend - + TrackerList - - Not working - Niet werkend - - - - Error: '%1' is not a valid torrent file. - Fout: '%1' is geen geldig torrentbestand. - - - - - - - Torrent queueing must be enabled - Torrents in wachtrij plaatsen moet ingeschakeld zijn - - - - Save path cannot be empty - - - - - - Category cannot be empty - + + URL + URL - - Unable to create category - + + Status + Status - - Unable to edit category + + Received - Save path is empty - Opslagpad is leeg - - - - Cannot make save path - Kan opslagpad niet aanmaken - - - - Cannot write to directory - Kan niet schrijven naar map - - - - WebUI Set location: moving "%1", from "%2" to "%3" - WebUI locatie instellen: "%1" verplaatsen van "%2" naar "%3" - - - - Incorrect torrent name - Incorrecte torrentnaam - - - - - Incorrect category name - Incorrecte categorienaam - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - Alles (0) - - - - Trackerless (0) - Zonder trackers (0) - - - - Error (0) - Fout (0) - - - - Warning (0) - Waarschuwing (0) - - - - - Trackerless (%1) - Zonder trackers (%1) - - - - - Error (%1) - Fout (%1) - - - - - Warning (%1) - Waarschuwing (%1) - - - - Resume torrents - Torrents hervatten + + Seeds + Seeds - - Pause torrents - Torrents pauzeren + + Peers + Peers - - Delete torrents - Torrents verwijderen + + Downloaded + Gedownload - - - All (%1) - this is for the tracker filter - Alles (%1) + + Message + Bericht - - - TrackerListWidget - - + + Working Werkend - + Disabled Uitgeschakeld - + This torrent is private Deze torrent is privé - + Updating... Bijwerken... - + Not working Niet werkend - + Not contacted yet Nog niet gecontacteerd - - - - - - - N/A - N/B + + Tracker URL: + Tracker-url: - + Tracker editing Tracker bewerken - - Tracker URL: - Tracker-url: - - - - + + Tracker editing failed Tracker bewerken mislukt - + The tracker URL entered is invalid. De ingevoerde tracker-url is ongeldig - + The tracker URL already exists. De tracker-url bestaat al - + Add a new tracker... Nieuwe tracker toevoegen... - - Remove tracker - Tracker verwijderen - - - + Copy tracker URL - Tracker-url kopiëren + Tracker-URL kopiëren - + Edit selected tracker URL Geselecteerde tracker-url bewerken - + Force reannounce to selected trackers Opnieuw aankondigen bij geselecteerde trackers forceren - + Force reannounce to all trackers - Opnieuw aankondigen bij alle trackers forceren - - - - URL - Url - - - - Status - Status - - - - Received - Ontvangen - - - - Seeds - Seeds - - - - Peers - Peers - - - - Downloaded - Gedownload - - - - Message - Bericht - - - - Column visibility - Kolom-zichtbaarheid - - - - TrackerLoginDialog - - - - Tracker authentication - Tracker authenticatie - - - - Tracker: - Tracker: - - - - Login - Aanmelden - - - - Username: - Gebruikersnaam: - - - - Password: - Wachtwoord: + Altijd naar alle trackers aankondigen - - Log in - Aanmelden + + Remove tracker + Tracker verwijderen - TrackersAdditionDialog + TrackersAdditionDlg - + Trackers addition dialog Trackers toevoegen-venster - + List of trackers to add (one per line): Lijst van toe te voegen trackers (een per regel): - - + + µTorrent compatible list URL: - Url van µTorrent-compatibele lijst: + Url µTorrent-compatibele lijst: + + + + I/O Error + I/O-fout - + + Error while trying to open the downloaded file. + Fout bij openen van gedownload bestand. + + + No change Geen wijziging - + No additional trackers were found. Er werden geen extra trackers gevonden. - + Download error Downloadfout - + The trackers list could not be downloaded, reason: %1 Lijst met trackers kon niet gedownload worden, reden: %1 @@ -9079,686 +8050,694 @@ TransferListDelegate - + Downloading Downloaden - + Downloading metadata used when loading a magnet link Metadata downloaden - + Allocating qBittorrent is allocating the files on disk Toewijzen - + Paused Gepauzeerd - + Queued i.e. torrent is queued In wachtrij - + Seeding Torrent is complete and in upload-only mode Seeden - + Stalled Torrent is waiting for download to begin Wachten - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] downloaden - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] seeden - + Checking Torrent local data is being checked Controleren - + Queued for checking i.e. torrent is queued for hash checking In wachtrij voor controleren - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Hervattingsdata controleren - + Completed Voltooid - - Moving - Torrent local data are being moved/relocated - Verplaatsen - - - + Missing Files Ontbrekende bestanden - + Errored torrent status, the torrent has an error Met fouten - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (geseed voor %2) - + %1 ago e.g.: 1h 20m ago %1 geleden - TransferListFiltersWidget - - - Status - Status - - - - Categories - Categorieën - - - - Tags - Labels - - - - Trackers - Trackers - - - - TransferListModel - - - Name - i.e: torrent name - Naam - - - - Size - i.e: torrent size - Grootte - - - - Done - % Done - Klaar - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Status - - - - Seeds - i.e. full sources (often untranslated) - Seeds - - - - Peers - i.e. partial sources (often untranslated) - Peers - - - - Down Speed - i.e: Download speed - Downloadsnelheid - - - - Up Speed - i.e: Upload speed - Uploadsnelheid - - - - Ratio - Share ratio - Verhouding - - - - ETA - i.e: Estimated Time of Arrival / Time left - Geschatte resterende tijd - - - - Category - Categorie - - - - Tags - Labels - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - Toegevoegd op - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - Voltooid op - - - - Tracker - Tracker - - - - Down Limit - i.e: Download limit - Downloadbegrenzing - - - - Up Limit - i.e: Upload limit - Uploadbegrenzing - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Gedownload - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Geüpload - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - Sessie-download - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - Sessie-upload - - - - Remaining - Amount of data left to download (e.g. in MB) - Resterend - - - - Time Active - Time (duration) the torrent is active (not paused) - Tijd actief - - - - Save path - Torrent save path - Opslagpad - - - - Completed - Amount of data completed (e.g. in MB) - Voltooid - - - - Ratio Limit - Upload share ratio limit - Begrenzing deelverhouding - - - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - Laatst volledig gezien + TransferListFiltersWidget + + + Status + Status - - Last Activity - Time passed since a chunk was downloaded/uploaded - Laatste activiteit + + Categories + Categorieën - - Total Size - i.e. Size including unwanted data - Totale grootte + + Trackers + Trackers TransferListWidget - + Column visibility Kolom-zichtbaarheid - + Choose save path Opslagpad kiezen - + Torrent Download Speed Limiting Begrenzing downloadsnelheid torrent - + Torrent Upload Speed Limiting Begrenzing uploadsnelheid torrent - + Recheck confirmation Bevestiging opnieuw controleren - + Are you sure you want to recheck the selected torrent(s)? Weet u zeker dat u de geselecteerde torrent(s) opnieuw wilt controleren? - + Rename Naam wijzigen - + New name: Nieuwe naam: - + Resume Resume/start the torrent Hervatten - + Force Resume Force Resume/start the torrent - Geforceerd hervatten + Hervatten forceren - + Pause Pause the torrent Pauzeren - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Locatie instellen: "%1" verplaatsen van "%2" naar "%3" - - - - Add Tags - Labels toevoegen - - - - Remove All Tags - Alle labels verwijderen - - - - Remove all tags from selected torrents? - Alle labels van geselecteerde torrents verwijderen? + + New Category + Nieuwe categorie - - Comma-separated tags: - Kommagescheiden labels: + + Category: + Categorie: - - Invalid tag - Ongeldig label + + Invalid category name + Ongeldige categorienaam - - Tag name: '%1' is invalid - Labelnaam '%1' is ongeldig + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Categorienaam mag geen '\' bevatten. +Categorienaam mag niet beginnen/eindigen met '/'. +Categorienaam mag de '//'-opeenvolging niet bevatten. - + Delete Delete the torrent Verwijderen - + Preview file... Voorbeeld van bestand weergeven... - + Limit share ratio... Deelverhouding begrenzen... - + Limit upload rate... Uploadsnelheid begrenzen... - + Limit download rate... Downloadsnelheid begrenzen... - + Open destination folder Doelmap openen - + Move up i.e. move up in the queue Omhoog verplaatsen - + Move down i.e. Move down in the queue Omlaag verplaatsen - + Move to top i.e. Move to top of the queue Bovenaan plaatsen - + Move to bottom i.e. Move to bottom of the queue Onderaan plaatsen - + Set location... Locatie instellen... - - Force reannounce - Opnieuw aankondigen forceren - - - + Copy name Naam kopiëren - - Copy hash - Hash kopiëren - - - + Download first and last pieces first Eerste en laatste deeltjes eerst downloaden - + Automatic Torrent Management Automatisch torrent-beheer - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category Automatische modus betekent dat verschillende torrent-eigenschappen (bijvoorbeeld opslagpad) bepaald zullen worden door de overeenkomstige categorie. - + Category Categorie - + New... New category... Nieuw... - + Reset Reset category Herstellen - - Tags - Labels - - - - Add... - Add / assign multiple tags... - Toevoegen... - - - - Remove All - Remove all tags - Alles verwijderen - - - + Priority Prioriteit - + Force recheck Opnieuw controleren forceren - + Copy magnet link Magneetlink kopiëren - + Super seeding mode Super-seeding-modus - + Rename... Naam wijzigen... - + Download in sequential order In sequentiële volgorde downloaden - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting Upload/downloadverhouding van torrent begrenzen - - Use global share limit - Algemene deelbegrenzing gebruiken + + Use global ratio limit + Algemene deelverhoudingsbegrenzing gebruiken - - - + + + buttonGroup knopgroep - - Set no share limit - Geen deelbegrenzing instellen + + Set no ratio limit + Geen deelverhoudingsbegrenzing instellen + + + + Set ratio limit to + Deelverhoudingsbegrenzing instellen op + + + + WebApplication + + + Incorrect category name + Incorrecte categorienaam + + + + WebUI + + + The Web UI is listening on port %1 + De web-UI luistert naar poort %1 + + + + Web UI Error - Unable to bind Web UI to port %1 + Web-gebruikersinterface fout - Niet mogelijk om Web-UI te binden aan poort %1 + + + about - - Set share limit to - Deelbegrenzing instellen op + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Een geavanceerde BitTorrent client geprogrammeerd in C + +, gebaseerd op Qt4-toolkit en libtorrent-rasterbar. - - ratio - verhouding + + Copyright %1 2006-2016 The qBittorrent project + Auteursrecht %1 2006-2016 het qBittorrent-project - - minutes - minuten + + Home Page: + Homepagina: - - No share limit method selected - Geen deelbegrenzingsmethode geselecteerd + + Forum: + Forum: - - Please select a limit method first - Selecteer eerst een begrenzingsmethode + + Bug Tracker: + Bug-tracker: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - Python gedetecteerd, versie: %1 + + Add Peers + Peers - - Python not detected - Python niet gedetecteerd + + List of peers to add (one per line): + Lijst van toe te voegen peers (een per regel): + + + + Format: IPv4:port / [IPv6]:port + Formaat: IPv4:poort / [IPv6]:poort - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - Niet-aanvaardbaar bestandstype, alleen gewoon bestand is toegestaan. + + + Tracker authentication + Tracker-aanmelding - - Symlinks inside alternative UI folder are forbidden. - Symlinks in map van alternatieve UI zijn verboden. + + Tracker: + Tracker: - - Exceeded the maximum allowed file size (%1)! - Maximum toegestane bestandsgrootte overschreden (%1)! + + Login + Login - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - WebUI: oorsprong-header en doel-oorsprong komen niet overeen! Bron-IP: '%1'. Oorsprong-header: '%2'. Doel-oorsprong: '%3' + + Username: + Gebruikersnaam: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - WebUI: referer-header en doel-oorsprong komen niet overeen! Bron-IP: '%1'. Referer-header: '%2'. Doel-oorsprong: '%3' + + Password: + Wachtwoord: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - WebUI: ongeldige host-header, poorten komen niet overeen. Aanvragen bron-IP: '%1'. Server-poort: '%2'. Ontvangen host-header: '%3' + + Log in + Aanmelden - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - WebUI: ongeldige host-header. Aanvragen bron-IP: '%1'. Ontvangen host-header: '%2' + + Cancel + Annuleren - WebUI + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + Verwijderbevestiging - qBittorrent + + + + Remember choice + Keuze onthouden + + + + Also delete the files on the hard disk + Ook bestanden op de harde schijf verwijderen + + + + confirmShutdownDlg + + + Don't show again + Niet opnieuw weergeven + + + + createTorrentDialog + + + Cancel + Annuleren + + + + Torrent Creation Tool + Hulpprogramma voor aanmaken torrent + + + + Torrent file creation + Torrentbestand aanmaken + + + + Add file + Bestand toevoegen + + + + Add folder + Map toevoegen + + + + File or folder to add to the torrent: + Bestand of map om toe te voegen aan de torrent: + + + + Tracker URLs: + Tracker-url's: + + + + Web seeds urls: + Webseeds-url's: + - - Web UI: HTTPS setup successful - Web UI: https-instelling gelukt + + Comment: + Opmerkingen: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + U kunt tracker tiers/groepen scheiden met een lege regel. + + + + Piece size: + Grootte deeltjes: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + Automatisch + + + + Private (won't be distributed on DHT network if enabled) + Privé (wordt niet verdeeld op het DHT-netwerk indien ingeschakeld) + + + + Start seeding after creation + Beginnen met seeden na aanmaken + + + + Ignore share ratio limits for this torrent + Deelverhoudingsbegrenzing negeren voor deze torrent + + + + Create and save... + Aanmaken en opslaan... + + + + Progress: + Voortgang: + + + + downloadFromURL + + + Add torrent links + Torrent-links toevoegen + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Een per regel (http-verbindingen, magneetkoppelingen en info-hashes worden ondersteund) + + + + Download + Downloaden + + + + Cancel + Annuleren + + + + Download from urls + Downloaden uit url's - - Web UI: HTTPS setup failed, fallback to HTTP - Web UI: https-instelling mislukt, terugvallen op http + + No URL entered + Geen url ingevoerd - - Web UI: Now listening on IP: %1, port: %2 - Web UI: luisteren naar IP: %1, poort: %2 + + Please type at least one URL. + Typ op zijn minst één url. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Web UI: niet mogelijk om te binden aan IP: %1, poort: %2. Reden: %3 + + Crash info + Crash-info fsutils - + + + + + Downloads Downloads @@ -9766,100 +8745,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + Python niet gedetecteerd + + + + Python version: %1 + Python versie: %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1 u %2 m - + %1d %2h e.g: 2days 10hours %1 d %2 u - + Unknown Unknown (size) Onbekend - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent zal de computer afsluiten omdat alle downloads voltooid zijn. - + < 1m < 1 minute < 1 m - + %1m e.g: 10minutes %1 m + + + Working + Werkend + + + + Updating... + Bijwerken... + + + + Not working + Niet werkend + + + + Not contacted yet + Nog niet gecontacteerd + preview - + Preview selection Voorbeeld van selectie weergeven - + The following files support previewing, please select one of them: De volgende bestanden ondersteunen het weergeven van een voorbeeld, selecteer er een van: + + + Preview + Voorbeeld weergeven + + + + Cancel + Annuleren + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_oc.ts qbittorrent-3.3.15/src/lang/qbittorrent_oc.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_oc.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_oc.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - + A prepaus de qBittorrent - + About - + A prepaus - + Author - - - - - Current maintainer - + Autor - - Greece - Grècia + + + Nationality: + Nacionalitat : - - - Nationality: - + + + Name: + Nom : - - + + E-mail: - + Corrièr electronic : - - - Name: - + + Greece + Grècia - - Original author - + + Current maintainer + Manteneire actual - - France - França + + Original author + Autor original - + Special Thanks - + Mercejaments - + Translators - + Traductors - - License - - - - + Libraries - + Bibliotècas - + qBittorrent was built with the following libraries: - - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - + qBittorrent es estat compilat amb las bibliotècas seguentas : - - Forum: - + + France + França - - Bug Tracker: - + + License + Licéncia @@ -115,57 +90,67 @@ Enregistrar jos - + + Browse... + Percórrer... + + + + Set as default save path + Utilizar coma dorsièr de salvament per défaut + + + Never show again Afichar pas mai - + Torrent settings Paramètres del torrent - + Set as default category Definir coma categoria per défaut - + Category: Categoria : - + Start torrent Aviar lo torrent - + Torrent information Informacions sul torrent - + Skip hash check Verificar pas las donadas del torrent - + Size: Talha : - + Hash: Hash : - + Comment: Comentari : - + Date: Data : @@ -190,117 +175,89 @@ Automatic - - Remember last used save path - - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog Quand marcat, lo fichièr .torrent serà pas suprimit malgrat los paramètres de la pagina "Telecargaments" de las opcions. - + Do not delete .torrent file suprimir pas lo fichièr .torrent - - Create subfolder - - - - - Download in sequential order - Telecargament sequencial - - - - Download first and last pieces first - Telecargar primièras e darrièras pèças en primièr - - - + Normal Normala - + High Nauta - + Maximum Maximala - + Do not download Telecargar pas - - - + + + I/O Error ErrorE/S - + Invalid torrent Torrent invalid - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - + + + + + Already in download list + Ja present dins la lista dels telecargaments - + Not Available This comment is unavailable Pas disponible - + Not Available This date is unavailable Pas disponible - + Not available Pas disponible - + Invalid magnet link Ligam magnet invalid - + The torrent file '%1' does not exist. Lo torrent '%1' existís pas. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. Lo torrent '%1' pòt pas èsser legit sul disc. Avètz probablament pas las permissions requesidas. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ Error : %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Lo torrent es ja dins la lista de telecargament. Los trackers son pas estats fusionats perque es un torrent privat. + + + + Torrent is already in download list. Trackers were merged. + Lo torrent es ja dins la lista de telecargament. Los trackers son estats fusionats. + + + + + Cannot add torrent + Impossible d'apondre lo torrent + + + + Cannot add this torrent. Perhaps it is already in adding state. + Impossible d'apondre aqueste torrent. Benlèu es ja en cors d'apondon. + + + This magnet link was not recognized Aqueste ligam magnet es pas estat reconegut - + + Magnet link is already in download list. Trackers were merged. + Lo ligam magnet es ja dins la lista dels telecargaments. Los trackers son estats fusionats. + + + + Cannot add this torrent. Perhaps it is already in adding. + Impossible d'apondre aqueste torrent. Benlèu qu'es ja en cors d'apondon. + + + Magnet link Ligam magnet - + Retrieving metadata... Recuperacion de las metadonadas… - + Not Available This size is unavailable. Pas disponible - + Free space on disk: %1 Espaci liure dins lo disc : %1 - + + Choose save path Causir un repertòri de destinacion - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - + + Rename the file + Renomenar lo fichièr - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + + New name: + Nom novèl : - - Magnet link is already queued for processing. - + + + The file could not be renamed + Lo fichièr a pas pogut èsser renomenat - - New name: - Nom novèl : + + This file name contains forbidden characters, please choose a different one. + Aqueste nom de fichièr conten de caractèrs interdits, vcausissètz-ne un autre. - - + + This name is already in use in this folder. Please use a different name. Aqueste nom de fichièr es ja utilizat dins aqueste dorsièr. Veuillez utilizar un autre nom. - + The folder could not be renamed Lo dorsièr a pas pogut èsser renomenat - + Rename... Renomenar… - + Priority Prioritat - + Invalid metadata Metadata invalidas. - + Parsing metadata... Analisi sintaxica de las metadonadas... - + Metadata retrieval complete Recuperacion de las metadonadas acabada - + Download Error Error de telecargament @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Talha del cache disc + + + MiB Mio - + Outgoing ports (Min) [0: Disabled] Pòrts sortents (min) [0: desactivat] - + Outgoing ports (Max) [0: Disabled] Pòrts sortents (max) [0: desactivat] - + Recheck torrents on completion Reverificar los torrents quand son acabats - + Transfer list refresh interval Interval d'actualizacion de la lista de transferiment - + ms milliseconds ms - + Setting Paramètre - + Value Value set for this setting Valor - - - (disabled) - - - - + (auto) (automatic) - - min - minutes - - - - + All addresses Totas las adreças - + qBittorrent Section Seccion qBittorrent - - + + Open documentation Dobrir documentacion - + libtorrent Section Seccion libtorrent - - Asynchronous I/O threads - - - - - Disk cache - - - - + s seconds s - + Disk cache expiry interval Interval de l'expiracion del cache disc - + Enable OS cache Activar lo cache del sistèma operatiu - - Guided read cache - - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - - - - - - KiB - - - - - Send buffer watermark - - - - - Send buffer low watermark - - - - - Send buffer watermark factor - - - - - Prefer TCP - - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address - + + m + minutes + m - + Resolve peer countries (GeoIP) Afichar lo país dels pars (GeoIP) - + Resolve peer host names Afichar lo nom d'òste dels pars - + Strict super seeding Super-partiment estrict - + Network Interface (requires restart) Interfàcia ret (reaviada requis) - + Optional IP Address to bind to (requires restart) - + Listen on IPv6 address (requires restart) Escotar sus l’adreça IPv6 (reaviada requesida) - + Display notifications Afichar las notificacions - + Display notifications for added torrents Afichar las notificacions pels torrents aponduts - + Download tracker's favicon - - Save path history length - - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - - - - - Round-robin - - - - - Fastest upload - - - - - Anti-leech - - - - - Upload choking algorithm - - - - + Confirm torrent recheck Confirmer la reverificacion del torrent - - Confirm removal of all tags - - - - - Always announce to all trackers in a tier - + Exchange trackers with other peers + Escambiar los trackers amb d'autres pars - - Always announce to all tiers - + + Always announce to all trackers + Contactar totjorn totes los trackers - + Any interface i.e. Any network interface Quina interfàcia que siá - + Save resume data interval How often the fastresume file is saved. Interval de salvament de las donadas de represa - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - - - - + Maximum number of half-open connections [0: Unlimited] - Nombre maximum de connexions a meitat dobèrtas [0 : Illimitat] + Nombre maximum de connexions a meitat dobèrtas [0 : Illimitat] - + IP Address to report to trackers (requires restart) Adreça IP anonciada als trackers (Reaviada requesida) - + Enable embedded tracker Activar lo tracker integrat - + Embedded tracker port Pòrt del tracker integrat - + Check for software updates Verificar las mesas a jorn del logicial - + Use system icon theme Utilizar lo tèma d'icônes del sistèma @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 aviat. - + Torrent: %1, running external program, command: %2 - - Torrent name: %1 - - - - - Torrent size: %1 - - - - - Save path: %1 - - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - - - - - Thank you for using qBittorrent. - - - - - [qBittorrent] '%1' has finished downloading + + Torrent: %1, run external program command too long (length > %2), execution failed. - + Torrent: %1, sending mail notification - + Information Informacion - - To control qBittorrent, access the Web UI at %1 - + + To control qBittorrent, access the Web UI at http://localhost:%1 + Per contrarotlar qBittorrent, accedissètz a l'interfàcia web via http://localhost:%1 - + The Web UI administrator user name is: %1 Lo nom d'utilizaire de l'administrator de l'interfàcia web es : %1 - + The Web UI administrator password is still the default one: %1 Lo senhal de l'administrator de l'interfàcia web es totjorn lo per defaut : %1 - + This is a security risk, please consider changing your password from program preferences. Aquò pòt èsser dangierós, pensatz a cambiar vòstre senhal dins las opcions. - + Saving torrent progress... Salvament de l'avançament del torrent. - - - Portable mode and explicit profile directory options are mutually exclusive - - - - - Portable mode implies relative fastresume - - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Salvar jos : @@ -861,834 +658,694 @@ Gestionnaire de telecargament RSS - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - + + Enable Automated RSS Downloader + Activar lo telecargament auto de flux RSS - + Download Rules Règlas pel telecargament - + Rule Definition Definicion d'una règla - + Use Regular Expressions Utilizar las expressions regularas - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - - - - + Must Contain: Deu conténer : - + Must Not Contain: Deu pas conténer : - + Episode Filter: - Filtre d'episòdi : + Filtre d'episòdi : - + Assign Category: Assignar categoria : - + Save to a Different Directory Enregistrar dins un dorsièr diferent - + Ignore Subsequent Matches for (0 to Disable) ... X days Ignorar las correspondéncias ulterioras per (0 per desactivar) - + Disabled - + Desactivat - + days jorns - + Add Paused: - Apondre en pausa : + Apondre en pausa : - + Use global settings Utilizar la configuracion globala - + Always Totjorn - + Never Pas jamai - + Apply Rule to Feeds: Aplicar la règla als fluxes : - + Matching RSS Articles Articles RSS correspondents - + &Import... &Importar... - + &Export... &Exportar... - + Matches articles based on episode filter. Articles correspondents basats sul filtratge episòdi - + Example: - Exemple : + Exemple : - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match correspondrà als episòdis 2, 5, 8 e 15-30 e superiors de la sason 1 - + Episode filter rules: - Règlas de filtratge d'episòdis : + Règlas de filtratge d'episòdis : - + Season number is a mandatory non-zero value Lo numèro de sason es una valor obligatòria diferenta de zèro - + Episode number is a mandatory non-zero value + Lo numèro d'episòdi es una valor obligatòria diferenta de zèro + + + Filter must end with semicolon Lo filtre se deu acabar amb un punt-virgula - + Three range types for episodes are supported: - Tres tipes d'intervals d'episòdis son preses en carga : + Tres tipes d'intervals d'episòdis son preses en carga : - + Single number: <b>1x25;</b> matches episode 25 of season one - Nombre simple : <b>1×25;</b> correspond a l'episòdi 25 de la sason 1 + Nombre simple : <b>1×25;</b> correspond a l'episòdi 25 de la sason 1 - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one - Interval standard : <b>1×25-40;</b> correspond als episòdis 25 a 40 de la saison 1 - - - - Episode number is a mandatory positive value - + Interval standard : <b>1×25-40;</b> correspond als episòdis 25 a 40 de la saison 1 - - Rules - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Interval infinie : <b>1×25-;</b> correspond als episòdis 25 e seguents de la sason 1 - - Rules (legacy) + + Episode number is a mandatory positive value - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - + Last Match: %1 days ago - Darrièra correspondéncia : i a %1 jorns + Darrièra correspondéncia : i a %1 jorns - + Last Match: Unknown - Darrièra correspondéncia : desconegut + Darrièra correspondéncia : desconegut - + New rule name Novèl nom per la règla - + Please type the name of the new download rule. Entratz lo nom de la novèla règla de telecargament. - - + + Rule name conflict Conflicte dins los noms de règla - - + + A rule with this name already exists, please choose another name. Una règla amb aqueste nom existís ja, causissètz-ne un autre. - + Are you sure you want to remove the download rule named '%1'? Sètz segur que volètz suprimir la règla de telecargament '%1' - + Are you sure you want to remove the selected download rules? Sètz segur que volètz suprimir las règlas seleccionadas ? - + Rule deletion confirmation Confirmacion de la supression - + Destination directory Repertòri de destinacion - + Invalid action - + Accion invalida - + The list is empty, there is nothing to export. - + La lista es voida, i a pas res a exportar. - - Export RSS rules - + + Where would you like to save the list? + Ont volètz salvar aquesta lista ? - - + + Rules list (*.rssrules) + Lista de règlas (*.rssrules) + + + I/O Error - + Error E/S - - Failed to create the destination file. Reason: %1 - + + Failed to create the destination file + Impossible de crear lo fichièr de destinacion - - Import RSS rules - + + Please point to the RSS download rules file + Veuillez indiquer lo fichièr contenant les règlas de telecargament RSS - - Failed to open the file. Reason: %1 - + + Rules list + Lista de las règlas - + Import Error - + Error al moment de l'importacion - - Failed to import the selected rules file. Reason: %1 - + + Failed to import the selected rules file + Impossible d'importar lo fichièr de règlas seleccionat - + Add new rule... Apondre una novèla règla… - + Delete rule Suprimir la règla - + Rename rule... Renomenar la règla… - + Delete selected rules Suprimir las règlas seleccionadas - - Clear downloaded episodes... - - - - + Rule renaming Renommage de la règla - + Please type the new rule name Entratz lo novèl nom per la règla - - Clear downloaded episodes - - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - - - - - - Position %1: %2 - + + Regex mode: use Perl-like regular expressions + Mòde regex : utilizar d'expressions regularas similaras a las de Perl - + Wildcard mode: you can use - + ? to match any single character - + * to match zero or more of any characters - + Whitespaces count as AND operators (all words, any order) - + | is used as OR operator - + If word order is important use * instead of whitespace. - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - + will match all articles. - + will exclude all articles. - - - BanListOptionsDialog - - - List of banned IP addresses - - - - - Ban IP - - - - - Delete - Suprimir - - - - - Warning - - - - The entered IP address is invalid. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Mòde simplificat : podètz utilizar<ul><li>? per remplaçar quin caractèr que siá</li><li>* per remplaçar zèro o mantun caractèr</li><li>Los espacis son considerats equivalents a d'operators E</li></ul> - - The entered IP is already banned. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Mòde simplificat : podètz utilizar<ul><li>? per remplaçar quin caractèr que siá</li><li>* per remplaçar zèro o plusieurs caractèrs</li><li>| es utilizat coma operator O</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support Un reaviada es necessària per cambiar lo supòrt PeX - - Could not get GUID of configured network interface. Binding to IP %1 - - - - + Embedded Tracker [ON] Tracker integrat [ACTIVAT] - + Failed to start the embedded tracker! - Impossible d'aviar lo tracker integrat ! + Impossible d'aviar lo tracker integrat ! - + Embedded Tracker [OFF] Tracker integrat [DESACTIVAT] - + + '%1' reached the maximum ratio you set. Removing... + '%1' a atent lo ratio maximum qu'avètz definit. Supression... + + + + '%1' reached the maximum ratio you set. Pausing... + '%1' a atent lo ratio maximum qu'avètz definit. Mesa en pausa... + + + System network status changed to %1 e.g: System network status changed to ONLINE Estatut ret del sistèma cambiat en %1 - + ONLINE EN LINHA - + OFFLINE FÒRA LINHA - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding La configuracion ret de %1 a cambiat, refrescament de la session - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. - - + Encryption support [%1] - - + FORCED - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - - - - - + Anonymous mode [%1] - + Unable to decode '%1' torrent file. Impossible de desencodar lo fichièr torrent '%1' - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Telecargament recursiu del fichièr '%1' al dintre del torrent '%2' - + Queue positions were corrected in %1 resume files - + Couldn't save '%1.torrent' Impossible de salvar '%1.torrent" - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - - - - + because %1 is disabled. this peer was blocked because uTP is disabled. perque '%1' es desactivat - + because %1 is disabled. this peer was blocked because TCP is disabled. perque '%1' es desactivat - + URL seed lookup failed for URL: '%1', message: %2 Lo contacte de la font URL a fracassat per l'URL : '%1', messatge : %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent capita pas d'escotar sul pòrt %2/%3 de l'interfàcia %1. Motiu : %4 - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' es estat suprimit de la lista de transferiments e del disc. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' es estat suprimit de la lista de transferiments. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Telecargament de '%1', pacientatz... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent ensaja d'escotar un pòrt d'interfàcia : %1 - + The network interface defined is invalid: %1 L'interfàcia ret definida es invalida : %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent ensja d'escotar sul pòrt %2 de l'interfàcia %1 - - Peer ID: - - - - - HTTP User-Agent is '%1' - - - - - + DHT support [%1] - - - - - - - - - + + + + ON - - - - - - - - - + + + + OFF - - + Local Peer Discovery support [%1] - - PeX support [%1] - - - - - '%1' reached the maximum ratio you set. Removed. - - - - - '%1' reached the maximum ratio you set. Paused. - - - - - '%1' reached the maximum seeding time you set. Removed. - - - - - '%1' reached the maximum seeding time you set. Paused. - - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent a pas trobat d'adreça locala %1 sus la quala escotar - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent a pas capitat d'escotar sus un pòrt d'interfàcia : %1. Motiu : %2 - + Tracker '%1' was added to torrent '%2' Tracker '%1' apondut al torrent '%2' - + Tracker '%1' was deleted from torrent '%2' Tracker '%1' levat del torrent '%2' - + URL seed '%1' was added to torrent '%2' URL de partiment '%1' aponduda al torrent '%2' - + URL seed '%1' was removed from torrent '%2' URL de partiment '%1' levada del torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Impossible de resumir lo torrent "%1". - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Lo filtre IP es estat cargat corrèctament : %1 règlas son estadas aplicadas. - + Error: Failed to parse the provided IP filter. Error : impossible d'analisar lo filtre IP provesit. - - '%1' restored. - 'torrent name' restored. - - - - + Couldn't add torrent. Reason: %1 Impossible d'apondre lo torrent. Motiu : %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' es estat relançat. (relançament rapid) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' apondut a la lista de telecargament. - + An I/O error occurred, '%1' paused. %2 Una error E/S s'es produita, '%1' es estat mes en pausa. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP : impossible de redirigir lo pòrt, messatge : %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP : la redireccion del pòrt a capitat, messatge : %1 - + due to IP filter. this peer was blocked due to ip filter. a causa del filtratge IP. - + due to port filter. this peer was blocked due to port filter. a causa del filtratge de pòrts. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. a causa de las restriccions del mòde mixte d'i2p. - + because it has a low port. this peer was blocked because it has a low port. perque son numèro de pòrt es tròp bas. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent escota corrèctament sul pòrt %2/%3 de l'interfàcia %1 - + External IP: %1 e.g. External IP: 192.168.0.1 IP extèrne : %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + Lo torrent '%1' a pas pogut èsser desplaçat. Motiu : %2 - + File sizes mismatch for torrent '%1', pausing it. - + Las talhas de fichièrs correspondon pas pel torrent %1, mes en pausa. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - + La relança rapida del torrent %1 es estada regetada. Motiu : %2. Reverificacion... CategoryFilterModel - + Categories Categorias - + All - + Totes - + Uncategorized @@ -1698,7 +1355,7 @@ Add category... - + Apondre categoria... @@ -1707,34 +1364,139 @@ - Edit category... - - - - Remove category - + Suprimir categoria - + Remove unused categories - + Suprimir las categorias inutilizadas - + Resume torrents Aviar los torrents - + Pause torrents Metre en pausa los torrents - + Delete torrents Suprimir los torrents + + + New Category + Novèla Categoria + + + + Category: + Categoria : + + + + Invalid category name + Nom de categoria invalid + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Nom de categoria deu pas conténer '\'. +Nom de categoria deu pas començar/finir amb '/'. +Nom de categoria deu pas conténer la sequéncia '//'. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Totas (0) + + + Uncategorized (0) + Sens categoria (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Sens categoria (%1) + + + Add category... + Apondre categoria... + + + Remove category + Suprimir categoria + + + Remove unused categories + Suprimir las categorias inutilizadas + + + Resume torrents + Aviar los torrents + + + Pause torrents + Metre en pausa los torrents + + + Delete torrents + Suprimir los torrents + + + New Category + Novèla Categoria + + + Category: + Categoria : + + + Invalid category name + Nom de categoria invalid + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Nom de categoria deu pas conténer '\'. +Nom de categoria deu pas començar/finir amb '/'. +Nom de categoria deu pas conténer la sequéncia '//'. + + + All (%1) + this is for the category filter + Totas (%1) + CookiesDialog @@ -1773,616 +1535,574 @@ - DeletionConfirmationDialog - - - Deletion confirmation - - - - - Remember choice - - - - - Also delete the files on the hard disk - - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Sètz segur que volètz suprimir '%1' de la lista dels transferiments ? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - - - - - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - Telecargar - - - - No URL entered - - - - - Please type at least one URL. - + Sètz segur que volètz suprimir aquestes %1 torrents de la lista dels transferiments ? DownloadedPiecesBar - + White: Missing pieces Blanc : tròces mancants - + Green: Partial pieces Verd : tròces parcials - + Blue: Completed pieces Blau : tròces complets - ExecutionLogWidget + ExecutionLog - + General - General + General - + Blocked IPs - + Adreças IP blocadas - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> es estat blocat %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - + <font color='red'>%1</font> es estat bandit FeedListWidget - + RSS feeds Flux RSS - - - Unread (%1) - + + Unread + Pas legit FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - + + An error occured while trying to open the log file. Logging to file is disabled. + Una error s'es produita al moment de la temptativa de dobrir lo fichièr Log. L'accès al fichièr es desactivat. - FileSystemPathEdit + FilterParserThread - - ... - Launch file dialog button text (brief) - + + + + I/O Error: Could not open ip filter file in read mode. + Error d'entrada/sortida : impossible de dobrir lo fichièr de filtratge IP en lectura. - - &Browse... - Launch file dialog button text (full) - + + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. + Error d'analisi : lo fichièr de filtratge es pas un fichièr P2B PeerGuardian valid. + + + GeoIPDatabase - - Choose a file - Caption for file open/save dialog - + + + Unsupported database file size. + Talha del fichièr de basa de donadas pas suportat. - - Choose a folder - Caption for directory open dialog - - - - - Any file - - - - - FilterParserThread - - - - - I/O Error: Could not open IP filter file in read mode. - - - - - - - IP filter line %1 is malformed. - - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - - - - - - IP filter exception thrown for line %1. Exception is: %2 - - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - - - - - - - - - - - Parsing Error: The filter file is not a valid PeerGuardian P2B file. - Error d'analisi : lo fichièr de filtratge es pas un fichièr P2B PeerGuardian valid. - - - - GeoIPDatabase - - - - Unsupported database file size. - Talha del fichièr de basa de donadas pas suportat. - - - + Metadata error: '%1' entry not found. Error de las metadonadas : '%1' pas trobat. - + Metadata error: '%1' entry has invalid type. Error de las metadonadas : lo tipe de '%1' es invalid. - + Unsupported database version: %1.%2 Version de basa de donadas pas suportada : %1.%2 - + Unsupported IP version: %1 Version IP pas suportada : %1 - + Unsupported record size: %1 Talha del registre pas suportada : %1 - + Invalid database type: %1 Tipe de basa de donadas invalid : %1 - + Database corrupted: no data section found. Basa de donadas corrompuda : seccion data introbabla. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - + + File + Fichièr - - Bad Http request, closing socket. IP: %s - + + Edit + Edicion - - - HttpServer - + + Help + Ajuda + + + Exit qBittorrent Quitter qBittorrent - + Only one link per line Un sol ligam per linha - + + Download + Telecargar + + + Global upload rate limit must be greater than 0 or disabled. Lo limit global per la velocitat de mandadís deu èsser superior a 0 o desactivat. - + Global download rate limit must be greater than 0 or disabled. Lo limit global per la velocitat de recepcion deu èsser superior a 0 o desactivat. - + Alternative upload rate limit must be greater than 0 or disabled. Lo limit alternatiu per la velocitat de mandadís deu èsser superior a 0 o desactivat. - + Alternative download rate limit must be greater than 0 or disabled. Lo limit alternatiu per la velocitat de recepcion deu èsser superior a 0 o desactivat. - + Maximum active downloads must be greater than -1. Lo nombre maximum de telecargaments actius deu èsser superior a -1. - + Maximum active uploads must be greater than -1. Lo nombre maximum de mandadisses actius deu èsser superior a -1. - + Maximum active torrents must be greater than -1. Lo nombre maximum de torrents actius deu èsser superior a -1. - + Maximum number of connections limit must be greater than 0 or disabled. Lo nombre maximum de connexions deu èsser superior a 0 o desactivat. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Lo nombre maximum de connexions per torrent deu èsser superior a 0 o desactivat. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Lo nombre maximum de slots de mandadís per torrent deu èsser superior a 0 o desactivat. - + Unable to save program preferences, qBittorrent is probably unreachable. Impossible de salvar las preferéncias, qBittorrent es probablament inaccessible. - - IRC: #qbittorrent on Freenode - - - - - Invalid category name: -Please do not use any special characters in the category name. - - - - - Unknown - Desconeguda - - - - Hard Disk - - - - - Share ratio limit must be between 0 and 9998. - - - - - Seeding time limit must be between 0 and 525600 minutes. - + + Language + Lenga - + The port used for incoming connections must be between 1 and 65535. Lo pòrt utilizat per las connexions entrantas deu èsser comprés entre 1 e 65535. - + The port used for the Web UI must be between 1 and 65535. Lo pòrt utilizat per l'interfàcia Web deu èsser comprés entre 1024 e 65535. - + Unable to log in, qBittorrent is probably unreachable. Impossible de se connect&r, qBittorrent es probablament inaccessible. - + Invalid Username or Password. Nom d'utilizaire o senhal invalid. - - Username - - - - + Password Senhal - + Login Identificant - + + Upload Failed! + Lo transfert a fracassat ! + + + Original authors Autors originaux - + + Upload limit: + Limit de mandadís : + + + + Download limit: + Limit de telecargament : + + + Apply Aplicar - + Add Apondre - + + Category: + Categoria : + + + Upload Torrents Upload torrent files to qBittorent using WebUI Mandar de torrents - + + All + Totes + + + + Downloading + En telecargament + + + + Seeding + En partiment + + + + Completed + Completats + + + + Resumed + Contunhats + + + + Paused + En pausa + + + + Active + Actius + + + + Inactive + Inactius + + + Save files to location: - Salvar los fichièrs dins : + Salvar los fichièrs dins : - + Cookie: - Cookie : + Cookie : - + Type folder here Entratz lo dorsièr aicí - + + Run an external program on torrent completion + Aviar un programa extèrne quand un torrent es completat + + + + Enable bandwidth management (uTP) + Activar la gestion de benda passanta (uTP) + + + + Apply rate limit to uTP connections + Aplicar los limits de velocitat a las connexions uTP + + + + Alternative Global Rate Limits + Limits de velocitat globals alternatius + + + More information Mai d'informacions - + Information about certificates Informacion suls certificats - + Save Files to Salvar los fichièrs dins - - Set location - - - - - Limit upload rate - + + Watch Folder + Survelhar lo dorsièr - - Limit download rate - + + Default Folder + Dorsièr per defaut - - Rename torrent - + + from + from time1 to time2 + de - - Unable to create category - + + to + from time1 to time2 + a - + Other... Save Files to: Watch Folder / Default Folder / Other... Autre... - + + Every day + Schedule the use of alternative rate limits on ... + Cada jorn + + + + Week days + Schedule the use of alternative rate limits on ... + Jorns dobrants + + + + Week ends + Schedule the use of alternative rate limits on ... + Week ends + + + Monday Schedule the use of alternative rate limits on ... Diluns - + Tuesday Schedule the use of alternative rate limits on ... Dimars - + Wednesday Schedule the use of alternative rate limits on ... Dimècres - + Thursday Schedule the use of alternative rate limits on ... Dijòus - + Friday Schedule the use of alternative rate limits on ... Divendres - + Saturday Schedule the use of alternative rate limits on ... Dissabte - + Sunday Schedule the use of alternative rate limits on ... Dimenge - + + Downloaded + Is the file downloaded or not? + Telecargat + + + Logout Se desconnectar - + + Download from URLs + Telecargar dempuèi d'URLs + + + Download Torrents from their URLs or Magnet links Telecargar los torrents dempuèi lors URLs o ligams Magnet - + Upload local torrent Transferir un torrent local - + Are you sure you want to delete the selected torrents from the transfer list? Sètz segur que volètz suprimir los torrents seleccionats de la lista de transferiment ? - + Save Salvar - + qBittorrent client is not reachable Lo logicial qBittorrent es pas accessible - - qBittorrent has been shutdown. - qBittorrent es estat arrestat. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - + + HTTP Server + Servidor HTTP - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - + + The following parameters are supported: + Los paramètres seguents son preses en carga : - - Add subnet - + + Torrent path + Camin del torrent - - Delete - Suprimir + + Torrent name + Nom del torrent - - Error - Error + + qBittorrent has been shutdown. + qBittorrent es estat arrestat. + + + LineEdit - - The entered subnet is invalid. - + + Clear the text + Escafar lo tèxte LogListWidget - + Copy Copiar - + Clear Escafar @@ -2415,710 +2135,648 @@ Accion quand los telecargaments son acaba&ts - + &View A&fichatge - + &Options... &Opcions... - + &Resume &Aviar - + Torrent &Creator &Creator de torrent - + Set Upload Limit... Definir lo limit de mandadís... - + Set Download Limit... Definir lo limit de telecargament... - + Set Global Download Limit... Definir lo limit de telecargament global... - + Set Global Upload Limit... Definir lo limit de mandadís global... - + Minimum Priority Prioritat minimala - + Top Priority Prioritat maximala - + Decrease Priority Demesir la prioritat - + Increase Priority Aumentar la prioritat - - + + Alternative Speed Limits Limits de velocitat alternativas - + &Top Toolbar Barra d'ai&sinas - + Display Top Toolbar Afichar la barra d'aisinas - - Status &Bar - - - - + S&peed in Title Bar &Velocitat dins lo títol de la fenèstra - + Show Transfer Speed in Title Bar Afichar la velocitat dins lo títol de la fenèstra - + &RSS Reader Lector &RSS - + Search &Engine &Motor de recèrca - + L&ock qBittorrent &Verrolhar qBittorrent - + Do&nate! - Far un do&n ! - - - - Close Window - + Far un do&n ! - + R&esume All A&viar tot - + Manage Cookies... Gerir los Cookies... - + Manage stored network cookies Gerir les cookies ret emmagazinats - + Normal Messages Messatges normals - + Information Messages Messatges d'informacion - + Warning Messages Messatges d'avertiment - + Critical Messages Messatges critics - + &Log &Jornal - + &Exit qBittorrent &Quitar qBittorrent - + &Suspend System &Metre en velha lo sistèma - + &Hibernate System &Metre en velha perlongada lo sistèma - + S&hutdown System A&tudar lo sistèma - + &Disabled &Desactivat - + &Statistics &Estatisticas - + Check for Updates Verificar las mesas a jorn - + Check for Program Updates Verificar las mesas a jorn del programa - + &About &A prepaus - + &Pause Metre en &pausa - + &Delete &Suprimir - + P&ause All Tout &metre en pausa - + &Add Torrent File... &Apondre un fichièr torrent… - + Open Dobrir - + E&xit &Quitar - + Open URL Dobrir URL - + &Documentation &Documentacion - + Lock Verrolhar - - - + + + Show Afichar - + Check for program updates Verificar la disponibilitat de mesas a jorn del logicial - + Add Torrent &Link... Apondre &ligam cap a un torrent… - + If you like qBittorrent, please donate! Se qBittorrent vos agrada, fasètz un don ! - - + Execution Log Jornal d'execucion - + Clear the password Escafar lo senhal - + Filter torrent list... Filtrar la lista dels torrents… - + &Set Password &Definir lo senhal - - Preferences - - - - + &Clear Password &Suprimir lo mot de pass - + Transfers Transferiments - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Associacion als fichièrs torrent - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent es pas l'aplicacion per defaut utilizada per dobrir los fichièrs torrent o los ligams magnet. Volètz associar qBittorrent als fichièrs torrent e ligams magnet ? - + Icons Only Icònas solament - + Text Only Tèxte solament - + Text Alongside Icons Tèxte al costat de las Icònas - + Text Under Icons Tèxte jos las Icònas - + Follow System Style Seguir l'estil del sistèma - - - + + + UI lock password Senhal de verrolhatge - - - + + + Please type the UI lock password: Entratz lo senhal de verrolhatge : - + The password should contain at least 3 characters Lo senhal deu conténer al mens 3 caractèrs - + Password update Mesa a jorn del senhal - + The UI lock password has been successfully updated Lo senhal de verrolhatge es estat mes a jorn - + Are you sure you want to clear the password? - Sètz segur que volètz escafar lo senhal ? - - - - Use regular expressions - + Sètz segur que volètz escafar lo senhal ? - + Search Recèrca - + Transfers (%1) Transferiments (%1) - + Error Error - + Failed to add torrent: %1 - Fracàs de l'apondon del torrent : %1 + Fracàs de l'apondon del torrent : %1 - + Torrent added Torrent apondut - + '%1' was added. e.g: xxx.avi was added. '%1' es estat apondut. - + Download completion Fin del telecargament - + I/O Error i.e: Input/Output Error Error E/S - + Recursive download confirmation Confirmacion per telecargament recursiu - + Yes Òc - + No Non - + Never Pas jamai - + Global Upload Speed Limit Limit global de la velocitat de mandadís - + Global Download Speed Limit Limit global de la velocitat de recepcion - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - - - - - Are you sure you want to quit qBittorrent? - - - - + &No &Non - + &Yes &Òc - + &Always Yes &Òc, totjorn - - %1/s - s is a shorthand for seconds - - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter Ancian interpretador Python - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - + qBittorrent Update Available Mesa a jorn de qBittorrent disponibla - + + A new version is available. +Do you want to download %1? + Una novèla version es disponibla. +Volètz telecargar %1 ? + + + Already Using the Latest qBittorrent Version Utilizatz ja la darrièra version de qBittorrent - + Undetermined Python version Version de Python indeterminada - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. - Lo telecargament de « %1 » es acabat. + Lo telecargament de « %1 » es acabat. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. Reason: disk is full. - Una error d'entrada/sortida s'es produita sul torrent « %1 ». -Rason : %2 + Una error d'entrada/sortida s'es produita sul torrent « %1 ». +Rason : %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? - Lo torrent « %1 » conten de fichièrs torrent, volètz procedir en los telecargant ? + Lo torrent « %1 » conten de fichièrs torrent, volètz procedir en los telecargant ? - + Couldn't download file at URL '%1', reason: %2. - Impossible de telecargar lo fichièr a l'adreça « %1 », rason : %2. + Impossible de telecargar lo fichièr a l'adreça « %1 », rason : %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - - + + Couldn't determine your Python version (%1). Search engine disabled. + Impossible de determinar vòstra version de Python (%1). Motor de recèrca desactivat. + + + + Missing Python Interpreter L’interpretador Python es absent - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Python es necessari per fin d'utilizar lo motor de recèrca mas sembla pas èsser installat. -Lo volètz installar ara ? +Lo volètz installar ara ? - + Python is required to use the search engine but it does not seem to be installed. Python es necessari per fin d'utilizar lo motor de recèrca mas sembla pas èsser installat. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. Pas de mesas a jorn disponiblas. Utilizatz ja la darrièra version. - + &Check for Updates &Verificar las mesas a jorn - + Checking for Updates... Verificacion de las mesas a jorn… - + Already checking for program updates in the background Recèrca de mesas a jorn ja en cors en prètzfait de fons - + Python found in '%1' - Python trobat dins « %1 » + Python trobat dins « %1 » - + Download error Error de telecargament - + Python setup could not be downloaded, reason: %1. Please install it manually. L’installador Python pòt pas èsser telecargat per la rason seguenta : %1. Installatz-lo manualament. - - + + Invalid password Senhal invalid - - - + + RSS (%1) RSS (%1) - + URL download error Error de telecargament URL - + The password is invalid Lo senhal fourni es invalid - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Velocitat de recepcion : %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Velocitat de mandadís : %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [R : %1, E : %2] qBittorrent %3 - + Hide Amagar - + Exiting qBittorrent Tampadura de qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Certans fichièrs son en cors de transferiment. +Sètz segur que volètz quitar qBittorrent ? + + + Open Torrent Files Dobrir fichièrs torrent - + Torrent Files Fichièrs torrent - + Options were saved successfully. Preferéncias salvadas amb succès. @@ -3126,1479 +2784,1369 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. Vòstre DNS dinamic es estat mes a jorn amb succès. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. - Error de DNS dinamic : Lo servici es temporàriament indisponible, un novèl ensag serà fait dins 30 minutas. + Error de DNS dinamic : Lo servici es temporàriament indisponible, un novèl ensag serà fait dins 30 minutas. - + Dynamic DNS error: hostname supplied does not exist under specified account. - Error de DNS dinamic : Lo nom d'òste provesit existís pas pel compte especificat. + Error de DNS dinamic : Lo nom d'òste provesit existís pas pel compte especificat. - + Dynamic DNS error: Invalid username/password. - Error de DNS dinamic : Nom d'utilizaire o senhal invalid. + Error de DNS dinamic : Nom d'utilizaire o senhal invalid. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. - Error de DNS dinamic : qBittorrent es estat blacklistat pel servici, raportatz un bug sus http://bugs.qbittorrent.org. + Error de DNS dinamic : qBittorrent es estat blacklistat pel servici, raportatz un bug sus http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. - Error de DNS dinamic : %1 es estat tornat pel servici, raportatz un bug sus http://bugs.qbittorrent.org. + Error de DNS dinamic : %1 es estat tornat pel servici, raportatz un bug sus http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. - Error de DNS dinamic : Vòstre nom d'utilizaire es estat blocat per fauta d'abús. + Error de DNS dinamic : Vòstre nom d'utilizaire es estat blocat per fauta d'abús. - + Dynamic DNS error: supplied domain name is invalid. - Error de DNS dinamic : Lo nom de domeni provesit es invalid. + Error de DNS dinamic : Lo nom de domeni provesit es invalid. - + Dynamic DNS error: supplied username is too short. - Error de DNS dinamic : Lo nom d'utilizaire provesit es tròp cort. + Error de DNS dinamic : Lo nom d'utilizaire provesit es tròp cort. - + Dynamic DNS error: supplied password is too short. - Error de DNS dinamic : Lo senhal provesit es tròp cort. + Error de DNS dinamic : Lo senhal provesit es tròp cort. Net::DownloadHandler - + I/O Error Error d'entrada/sortida - + The file size is %1. It exceeds the download limit of %2. La talha del fichièr es %1. Aquò depassa lo limit de telecargament de %2. - + Unexpected redirect to magnet URI. Redireccion pas esperar cap a una URL magnet. - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. - Basa de donadas GeoIP cargada. Tipe : %1. Durada de construccion : %2 + Basa de donadas GeoIP cargada. Tipe : %1. Durada de construccion : %2 - - + + Couldn't load GeoIP database. Reason: %1 - Impossible de cargar la basa de donadas GeoIP. Rason : %1 + Impossible de cargar la basa de donadas GeoIP. Rason : %1 - + Venezuela, Bolivarian Republic of Veneçuèla, Republica bolivariana de - + Viet Nam Vietnam - - + + N/A N/A - + Andorra Andòrra - + United Arab Emirates Emirats Arabis Units - + Afghanistan Afganistan - + Antigua and Barbuda Antigua e Barbuda - + Anguilla Anguilla - + Albania Albania - + Armenia Armenia - + Angola Angòla - + Antarctica Antarctica - + Argentina Argentina - + American Samoa Samoa Americanas - + Austria Àustria - + Australia Austràlia - + Aruba Aruba - + Azerbaijan Azerbaitjan - + Bosnia and Herzegovina Bòsnia e Ercegovina - + Barbados Barbada - + Bangladesh Bangladèsh - + Belgium Belgica - + Burkina Faso Burkina Faso - + Bulgaria Bulgaria - + Bahrain Bahrain - + Burundi Burundi - + Benin Benin - + Bermuda Bermudas - + Brunei Darussalam Brunei - + Brazil Brasil - + Bahamas Bahamas - + Bhutan Botan - + Bouvet Island Illa Bouvet - + Botswana Botswana - + Belarus Bielorussia - + Belize Belize - + Canada Canadà - + Cocos (Keeling) Islands Illas Cocos (ancianament Keeling) - + Congo, The Democratic Republic of the Republica Democratica del Còngo - + Central African Republic Republica d'Afrique Centrale - + Congo Còngo - + Switzerland Soïssa - + Cook Islands Illas Cook - + Chile Chili - + Cameroon Cameron - + China China - + Colombia Colombia - + Costa Rica Còsta Rica - + Cuba Cuba - + Cape Verde Cap Verd - + Curacao Curaçao - + Christmas Island Illa Christmas - + Cyprus Chipre - + Czech Republic Republica Chèca - + Germany Alemanha - + Djibouti Jiboti - + Denmark Danemarc - + Dominica Dominica - + Dominican Republic Republica dominicana - + Algeria Argeria - + Ecuador Eqüator - + Estonia Estònia - + Egypt Egipte - + Western Sahara Sahara occidental - + Eritrea Eritrèa - + Spain Espanha - + Ethiopia Etiòpia - + Finland Finlàndia - + Fiji Fiji - + Falkland Islands (Malvinas) Illas Maloinas (Falkland) - + Micronesia, Federated States of Micronesia - + Faroe Islands Illas Feròe - + France França - + Gabon Gabon - + United Kingdom Reialme unit - + Grenada Grenada - + Georgia Georgia - + French Guiana Guinèa francesa - + Ghana Ghana - + Gibraltar Gibraltar - + Greenland Groenlàndia - + Gambia Gambia - + Guinea Guinèa - + Guadeloupe Guadalope - + Equatorial Guinea Guinèa eqüatoriala - + Greece Grècia - + South Georgia and the South Sandwich Islands Georgia del Sud e las Illas Sandwich del Sud - + Guatemala Guatemala - + Guam Guam - + Guinea-Bissau Guinèa-Bissau - + Guyana Guiana - + Hong Kong Hong Kong - + Heard Island and McDonald Islands Illas Heard e MacDonald - + Honduras Honduras - + Croatia Croàcia - + Haiti Haïtí - + Hungary Ongria - + Indonesia Indonesia - + Ireland Irlanda - + Israel Israèl - + India Índia - + British Indian Ocean Territory Territòri britanic de l'ocean Indian - + Iraq Iraq - + Iran, Islamic Republic of Republica islamica d'Iran - + Iceland Islàndia - + Italy Itàlia - + Jamaica Jamaïca - + Jordan Jordania - + Japan Japon - + Kenya Kenya - + Kyrgyzstan Quirguistan - + Cambodia Cambòtja - + Kiribati Kiribati - + Comoros Comòras - + Saint Kitts and Nevis Sant Christophe e Nievès - + Korea, Democratic People's Republic of Corèa del Nòrd - + Korea, Republic of Corèa del Sud - + Kuwait Kuwait - + Cayman Islands Illas Caïmans - + Kazakhstan Cazakstan - + Lao People's Democratic Republic Laos - + Lebanon Liban - + Saint Lucia Santa Lúcia - + Liechtenstein Liechtenstein - + Sri Lanka Sri Lanka - + Liberia Libèria - + Lesotho Lesotho - + Lithuania Lituania - + Luxembourg Luxemborg - + Latvia Letonia - + Morocco Marròc - + Monaco Mónegue - + Moldova, Republic of Moldavia - + Madagascar Madagascar - + Marshall Islands Illas Marshall - + Mali Mali - + Myanmar Birmania - + Mongolia Mongolia - + Northern Mariana Islands Illas Marianas del Nòrd - + Martinique Martinica - + Mauritania Mauritania - + Montserrat Montserrat - + Malta Malta - + Mauritius Maurici - + Maldives Maldivas - + Malawi Malawi - + Mexico Mexic - + Malaysia Malaisia - + Mozambique Moçambic - + Namibia Namibia - + New Caledonia Nòva Caledònia - + Niger Nigèr - + Norfolk Island Illa Norfòlk - + Nigeria Nigèria - + Nicaragua Nicaragua - + Netherlands Païsses Basses - + Norway Norvègia - + Nepal Nepal - + Nauru Nauru - + Niue Niue - + New Zealand Nòva Zelanda - + Oman Oman - + Panama Panamà - + Peru Peró - + French Polynesia Polinesia francesa - + Papua New Guinea Papoa - Nòva Guinèa - + Philippines Filipinas - + Pakistan Paquistan - + Poland Polonha - + Saint Pierre and Miquelon Saint Pierre e Miquelon - + Puerto Rico Puerto Rico - + Portugal Portugal - + Palau Palau - + Paraguay Paraguai - + Qatar Qatar - + Reunion Reünion - + Romania Romania - + Russian Federation Russia - + Rwanda Rwanda - + Saudi Arabia Arabia Saudita - + Solomon Islands Illas Salomon - + Seychelles Seichèlas - + Sudan Sodan - + Sweden Suècia - + Singapore Singapor - + Slovenia Eslovènia - + Svalbard and Jan Mayen Svalbard e Jan Mayen - + Slovakia Eslovaquia - + Sierra Leone Sierra Leone - + San Marino Sant Marin - + Senegal Senegal - + Somalia Somalia - + Suriname Surinam - + Sao Tome and Principe Sao Tomé-e-Principe - + El Salvador Lo Salvador - + Syrian Arab Republic Siria - + Swaziland Swazilàndia - + Turks and Caicos Islands Illas Turcas e Caïcas - + Chad Chad - + French Southern Territories Tèrras australas francesas - + Togo Tògo - + Thailand Taïlàndia - + Tajikistan Tadjiquistan - + Tokelau Tokelau - + Turkmenistan Turcmenistan - + Tunisia Tunisia - + Tonga Tònga - - Could not decompress GeoIP database file. - - - - + Timor-Leste Timor Oriental - + Bolivia, Plurinational State of Bolívia - + Bonaire, Sint Eustatius and Saba Païses Basses caribeans - Bonaire, St Eustatius, Saba - + Cote d'Ivoire Còsta d'Evòri - + Libya Libia - + Saint Martin (French part) Sant Martin (França) - + Macedonia, The Former Yugoslav Republic of Macedònia - + Macao Macao - + Pitcairn Illas Pitcairn - + Palestine, State of Palestina, Estat de - + Saint Helena, Ascension and Tristan da Cunha Santa Elena, Ascension e Tristan da Cunha - + South Sudan Sodan del Sud - + Sint Maarten (Dutch part) Sant Martin (Païsses basses) - + Turkey Turquia - + Trinidad and Tobago Trinidad e Tobago - + Tuvalu Tuvalu - + Taiwan Taiwan - + Tanzania, United Republic of Tanzania - + Ukraine Ucraïna - + Uganda Oganda - + United States Minor Outlying Islands Illas menoras alunhadas dels Estats Units - + United States Estats Units - + Uruguay Uruguai - + Uzbekistan Ozbequistan - + Holy See (Vatican City State) Vatican - + Saint Vincent and the Grenadines Sant Vincenç e las Grenadinas - + Virgin Islands, British Illas Verges, Reialme Unit - + Virgin Islands, U.S. Illas Verges, Estats Units - + Vanuatu Vanuatu - + Wallis and Futuna Wallis e Futuna - + Samoa Samoa - + Yemen Iemèn - + Mayotte Maiòta - + Serbia Serbia - + South Africa Africa del Sud - + Zambia Zambia - + Montenegro Montenegro - + Zimbabwe Zimbabwe - + Aland Islands Åland - + Guernsey Bailliage de Guernesey - + Isle of Man Illa de Man - + Jersey Jersey - + Saint Barthelemy Sant Bertomieu - + + Could not uncompress GeoIP database file. + Impossible de descompressar lo fichièr de basa de donadas GeoIP. + + + Couldn't save downloaded GeoIP database file. Impossible d'enregistrer lo fichièr de basa de donadas GeoIP telecargat. - + Successfully updated GeoIP database. Mesa a jorn de la basa de donadas GeoIP realizada amb succès. - + Couldn't download GeoIP database file. Reason: %1 - Impossible de telecargar lo fichièr de basa de donadas GeoIP. Rason : %1 + Impossible de telecargar lo fichièr de basa de donadas GeoIP. Rason : %1 Net::PortForwarder - + UPnP / NAT-PMP support [ON] Presa en carga de l'UPnP / NAT-PMP [ACTIVÉE] - + UPnP / NAT-PMP support [OFF] Presa en carga de l'UPnP / NAT-PMP [DESACTIVADA] @@ -4606,7 +4154,7 @@ Net::Smtp - + Email Notification Error: Error de notificacion e-mail : @@ -4614,1273 +4162,1077 @@ OptionsDialog - + Options Opcions - + Behavior - + Downloads Telecargaments - + Connection Connexion - + Speed Velocitat - + BitTorrent BitTorrent - - RSS - - - - + Web UI Interfàcia web - + Advanced Avançat - + Language Lenga - + User Interface Language: - + (Requires restart) - + Transfer List Lista dels transferiments - + Confirm when deleting torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. - + Hide zero and infinity values - + Always Totjorn - + Paused torrents only - + Action on double-click - + Downloading torrents: - - + + Start / Stop Torrent - - + + Open destination folder Dobrir lo repertòri de destinacion - - + + No action Pas cap d'accion - + Completed torrents: Torrents telecargats : - + Desktop Burèu - + Start qBittorrent on Windows start up - + Show splash screen on start up - + Start qBittorrent minimized - + Confirmation on exit when torrents are active - + Confirmation on auto-exit when downloads finish - - KiB + + Show qBittorrent in notification area - - Email notification &upon download completion + + Minimize qBittorrent to notification area - - Run e&xternal program on torrent completion + + Close qBittorrent to notification area + i.e: The systray tray icon will still be visible when closing the main window. - - IP Fi&ltering + + Tray icon style: - - Schedule &the use of alternative rate limits - + + Normal + Normala - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + + Monochrome (Dark theme) - - &Torrent Queueing + + Monochrome (Light theme) - - Seed torrents until their seeding time reaches + + File association - - A&utomatically add these trackers to new downloads: + + Use qBittorrent for .torrent files - - RSS Reader + + Use qBittorrent for magnet links - - Enable fetching RSS feeds + + Power Management - - Feeds refresh interval: + + Inhibit system sleep when torrents are active - - Maximum number of articles per feed: + + Log file - - - min - minutes + + Save path: - - RSS Torrent Auto Downloader + + Backup the log file after: - - Enable auto downloading of RSS torrents - + + MB + Mo - - Edit auto downloading rules... + + Delete backup logs older than: - - Web User Interface (Remote control) - + + days + Delete backup logs older than 10 months + jorns + + + + months + Delete backup logs older than 10 months + meses + + + + years + Delete backup logs older than 10 years + ans - - IP address: + + When adding a torrent - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. + + Display torrent content and some options - - Server domains: + + Bring torrent dialog to the front - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. + + Do not start the download automatically + The torrent will be added to download list in pause state - - &Use HTTPS instead of HTTP + + Should the .torrent file be deleted after adding it - - Bypass authentication for clients on localhost + + Delete .torrent files afterwards - - Bypass authentication for clients in whitelisted IP subnets + + Also delete .torrent files whose addition was cancelled - - IP subnet whitelist... + + Also when addition is cancelled - - Upda&te my dynamic domain name + + Warning! Data loss possible! - - Minimize qBittorrent to notification area + + Saving Management - - Close qBittorrent to notification area - i.e: The systray tray icon will still be visible when closing the main window. + + Default Torrent Management Mode: - - Tray icon style: + + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - - Normal - Normala + + Manual + Manual - - Monochrome (Dark theme) + + Automatic + Automatic + + + + When Torrent Category changed: - - Monochrome (Light theme) + + Relocate torrent - - File association + + Switch torrent to Manual Mode - - Use qBittorrent for .torrent files + + When Default Save Path changed: - - Use qBittorrent for magnet links + + + Relocate affected torrents - - Power Management + + + Switch affected torrents to Manual Mode - - Save path: + + When Category changed: - - Backup the log file after: + + Use Subcategories - - Delete backup logs older than: + + Default Save Path: - - days - Delete backup logs older than 10 months - jorns - - - - months - Delete backup logs older than 10 months - meses - - - - years - Delete backup logs older than 10 years - ans - - - - When adding a torrent - - - - - Bring torrent dialog to the front - - - - - Do not start the download automatically - The torrent will be added to download list in pause state - - - - - Should the .torrent file be deleted after adding it - - - - - Also delete .torrent files whose addition was cancelled - - - - - Also when addition is cancelled - - - - - Warning! Data loss possible! - - - - - Saving Management - - - - - Default Torrent Management Mode: - - - - - Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - - - - - Manual - Manual - - - - Automatic - Automatic - - - - When Torrent Category changed: - - - - - Relocate torrent - - - - - Switch torrent to Manual Mode - - - - - When Default Save Path changed: - - - - - - Relocate affected torrents - - - - - - Switch affected torrents to Manual Mode - - - - - When Category changed: - - - - - Use Subcategories - - - - - Default Save Path: - - - - + Keep incomplete torrents in: - + Copy .torrent files to: - - Show &qBittorrent in notification area - - - - - &Log file - - - - - Display &torrent content and some options - - - - - Create subfolder for torrents with multiple files - - - - - De&lete .torrent files afterwards - - - - + Copy .torrent files for finished downloads to: - + Pre-allocate disk space for all files - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding - - - - + Append .!qB extension to incomplete files - - Enable recursive download dialog - - - - + Automatically add torrents from: - + Add entry Apondre una entrada - + Remove entry Suprimir una entrada - + + Email notification upon download completion + + + + + Destination email: + + + + SMTP server: Servidor SMTP : - + This server requires a secure connection (SSL) - - + + + Authentication Autentificacion - - - - + + + + Username: Nom d'utilizaire : - - - - + + + + Password: Senhal : - - Enabled protocol: - - - - - TCP and μTP + + Run external program on torrent completion - + Listening Port - + Port used for incoming connections: - + Random - + Use UPnP / NAT-PMP port forwarding from my router - + Use different port on each startup - + Connections Limits - + Maximum number of connections per torrent: - + Global maximum number of connections: - + Maximum number of upload slots per torrent: - + Global maximum number of upload slots: - + Proxy Server - + Type: Tipe : - + (None) (Pas cap) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Òste : - - + + Port: Pòrt : - + Otherwise, the proxy server is only used for tracker connections - + Use proxy for peer connections - + Disable connections not supported by proxies - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - + Use proxy only for torrents - - A&uthentication + + Info: The password is saved unencrypted - - Info: The password is saved unencrypted + + IP Filtering - + Filter path (.dat, .p2p, .p2b): - + Reload the filter - - Manually banned IP addresses... - - - - + Apply to trackers - + Global Rate Limits - - - - - - - KiB/s - - - - - + + Upload: Mandadís : - - + + + + + KiB/s + Kio/s + + + + Download: Telecargament : - + Alternative Rate Limits - - + + Schedule the use of alternative rate limits + + + + From: from (time1 to time2) De : - - + To: time1 to time2 A : - + When: Quora : - + Every day Cada jorn - + Weekdays Jorns de setmana - + Weekends Fins de setmanas - + Rate Limits Settings - + Apply rate limit to peers on LAN - + Apply rate limit to transport overhead - - + + + Enable µTP protocol + + + + Apply rate limit to µTP protocol - + Privacy - + Enable DHT (decentralized network) to find more peers - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers - + Look for peers on your local network - + Enable Local Peer Discovery to find more peers - + Encryption mode: - + Prefer encryption - + Require encryption - + Disable encryption - + Enable when using a proxy or a VPN connection - + Enable anonymous mode - - Maximum active downloads: - - - - - Maximum active uploads: - - - - - Maximum active torrents: + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - Do not count slow torrents in these limits + + Torrent Queueing - - Upload rate threshold: + + Maximum active downloads: - - Download rate threshold: + + Maximum active uploads: - - sec - seconds + + Maximum active torrents: - - Torrent inactivity timer: + + Do not count slow torrents in these limits - + Share Ratio Limiting - + Seed torrents until their ratio reaches - + then - + Pause them - + Remove them - - RSS Smart Episode Filters + + Automatically add these trackers to new downloads: + + + + + Enable Web User Interface (Remote control) - + Use UPnP / NAT-PMP to forward the port from my router - + + Use HTTPS instead of HTTP + + + + Certificate: Certificat : - + Import SSL Certificate - + Key: Clau : - + Import SSL Key - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - - Use alternative Web UI - - - - - Files location: - - - - - Enable clickjacking protection + + Bypass authentication for localhost - - Enable Cross-Site Request Forgery (CSRF) protection + + Update my dynamic domain name - + Service: Servici : - + Register - + Domain name: Nom de domeni : - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): - + %N: Torrent name %N : Nom del torrent - + %L: Category %L : Categoria - - %G: Tags (seperated by comma) - - - - + %F: Content path (same as root path for multifile torrent) - + %R: Root path (first torrent subdirectory path) - + %D: Save path %D : Camin de salvament - + %C: Number of files %C : Nombre de fichièrs - + %Z: Torrent size (bytes) - + %T: Current tracker - + %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor - + Folder is already being monitored: - + Folder does not exist: - + Folder is not readable: - + Adding entry failed - - - - + + Choose export directory - - - + + + + + + Choose a save directory - + Choose an IP filter file - + All supported filters - + SSL Certificate Certificat SSL - + + SSL Key + Clau SSL + + + Parsing error - + Failed to parse the provided IP filter - + Successfully refreshed - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Lo filtre IP es estat cargat corrèctament : %1 règlas son estadas aplicadas. - + Invalid key Clau invalida - + This is not a valid SSL key. - + Invalid certificate Certificat invalid - - Preferences - - - - - Import SSL certificate - - - - + This is not a valid SSL certificate. - - Import SSL key - - - - - SSL key - - - - + Time Error - + The start time and the end time can't be the same. - - + + Length Error - + The Web UI username must be at least 3 characters long. - + The Web UI password must be at least 6 characters long. @@ -5888,72 +5240,72 @@ PeerInfo - - Interested(local) and Choked(peer) - + + interested(local) and choked(peer) + interessat (local) e engorgat (par) - + interested(local) and unchoked(peer) interessat (local) e pas engorgat (par) - + interested(peer) and choked(local) interessat (pair) e engorgat (local) - + interested(peer) and unchoked(local) interessat (pair) e pas engorgat (local) - + optimistic unchoke non-escanament optimista - + peer snubbed par evitat - + incoming connection connexion entranta - + not interested(local) and unchoked(peer) pas interessat (local) e non engorgat (par) - + not interested(peer) and unchoked(local) pas interessat (par) e pas engorgat (local) - + peer from PEX par eissit de PEX - + peer from DHT par eissit del DHT - + encrypted traffic trafic chifrat - + encrypted handshake ponhada de man chifrada - + peer from LSD par eissit de LSD @@ -5961,530 +5313,472 @@ PeerListWidget - + IP IP - + Port Pòrt - + Flags Indicadors - + Connection Connexion - + Client i.e.: Client application Logicial - + Progress i.e: % downloaded Progression - + Down Speed i.e: Download speed Velocitat DL - + Up Speed i.e: Upload speed Velocitat UP - + Downloaded i.e: total data downloaded Telecargat - + Uploaded i.e: total data uploaded Mandat - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Pertinéncia - + Files i.e. files that are being downloaded right now Fichièrs - + Column visibility Visibilitat de colomna - + Add a new peer... Apondre un novèl par… - - + + Ban peer permanently Blocar lo par indefinidament - + Manually adding peer '%1'... - Apondon manual del par « %1 »… + Apondon manual del par « %1 »… - + The peer '%1' could not be added to this torrent. - Lo par « %1 » a pas pogut èsser apondut a aqueste torrent. + Lo par « %1 » a pas pogut èsser apondut a aqueste torrent. - + Manually banning peer '%1'... - Bandiment manual del par « %1 »… + Bandiment manual del par « %1 »… - - + + Peer addition Apondon d'un par - + Country País - + Copy IP:port Copiar l'IP:pòrt - + Some peers could not be added. Check the Log for details. Certans pars an pas pogut èsser aponduts. Consultatz lo Jornal per mai d'informacion. - + The peers were added to this torrent. Los pars son estats aponduts a aqueste torrent. - + Are you sure you want to ban permanently the selected peers? Sètz segur que volètz blocar los pars seleccionats ? - + &Yes &Òc - + &No &Non - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - + PeersAdditionDlg - + No peer entered - + Pas de par entrat - + Please type at least one peer. - + Entratz al mens un par. - + Invalid peer - + Par invalid - + The peer '%1' is invalid. - + Lo par « %1 » es invalid. PieceAvailabilityBar - + White: Unavailable pieces - Blanc : tròces pas disponibles + Blanc : tròces pas disponibles - + Blue: Available pieces - Blau : tròces disponibles + Blau : tròces disponibles PiecesBar - + Files in this piece: - + File in this piece - + File in these pieces - - Wait until metadata become available to see detailed information - - - - + Hold Shift key for detailed information - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Empeutons de recèrca - + Installed search plugins: - + Empeutons de recèrca installats : - + Name - Nom + Nom - + Version - + Version - + Url - + URL - - + + Enabled - + Activat - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Mai d'empeutons de recèrca aicí : <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Installar un novèl - + Check for updates - + Recercar de mesas a jorn - + Close - + Tampar - + Uninstall - + Desinstallar - - - + + + Yes - Òc + Òc - - - - + + + + No - Non + Non - + Uninstall warning - + Avertiment de desinstallacion - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Certans empeutons an pas pogut èsser desinstallats perque son incluses dins qBittorrent. Sols los qu'avètz vos-meteis aponduts pòdon èsser desinstallats. +Los empeutons en question son estats desactivats. - + Uninstall success - + Desinstallacion reüssida - + All selected plugins were uninstalled successfully - - - - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - + Totes los empeutons seleccionats son estats desinstallats amb succès - - + + New search engine plugin URL - + Adreça del novèl empeuton de recèrca - - + + URL: - + URL: - + Invalid link - + Ligam invalid - + The link doesn't seem to point to a search engine plugin. - + Lo ligam sembla pas puntar cap a un empeuton de motor de recèrca. - + Select search plugins - + Seleccionatz los empeutons de recèrca - + qBittorrent search plugin - + Empeutons de recèrca qBittorrent + + + + + + Search plugin update + Mesa a jorn de l'empeuton de recèrca - + All your plugins are already up to date. - + Totes vòstres empeutons son ja a jorn. - + Sorry, couldn't check for plugin updates. %1 - + O planhèm, impossible de verificar las mesas a jorn de l'empeuton. %1 - + + + Search plugin install - + Installacion d'un empeuton de recèrca + + + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + L'empeuton "%1" es estat installat amb succès. - + Couldn't install "%1" search engine plugin. %2 - + Impossible d'installar l'empeuton "%1". %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + L'empeuton "%1" es estat mes a jorn amb succès. + + + Couldn't update "%1" search engine plugin. %2 - + Impossible de metre a jorn l'empeuton "%1". %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Font de l'empeuton - + Search plugin source: - + Font de l'empeuton de recèrca : - + Local file - + Fichièr local - + Web link - - - - - PowerManagement - - - qBittorrent is active - + Ligam web - PreviewSelectDialog + PreviewSelect - - Preview - - - - + Name - Nom + Nom - + Size - Talha + Talha - + Progress - Progression + Progression - - + + Preview impossible - + Previsualizacion impossibla - - + + Sorry, we can't preview this file - - - - - Private::FileLineEdit - - - '%1' does not exist - - - - - '%1' does not point to a directory - - - - - '%1' does not point to a file - - - - - Does not have read permission in '%1' - - - - - Does not have write permission in '%1' - + O planhèm, es impossible de previsualizar aqueste fichièr PropListDelegate - + Not downloaded Pas telecargat - - + + Normal Normal (priority) Normala - - N/A - N/A - - - + Do not download Do not download (priority) Telecargar pas - - + + High High (priority) Nauta - + N/A + N/D + + + Mixed Mixed (priorities Mixtas - - + + Maximum Maximum (priority) Maximala @@ -6493,32 +5787,32 @@ PropTabBar - + General General - + Trackers Trackers - + Peers Pars - + HTTP Sources Fonts HTTP - + Content Contengut - + Speed Velocitat @@ -6538,7 +5832,7 @@ Progress: - Progression : + Progression : @@ -6549,12 +5843,12 @@ Time Active: Time (duration) the torrent is active (not paused) - Actiu pendent : + Actiu pendent : ETA: - Temps restant : + Temps restant : @@ -6564,17 +5858,17 @@ Seeds: - Fonts : + Fonts : Download Speed: - Velocitat de telecargament : + Velocitat de telecargament : Upload Speed: - Velocitat d'emission : + Velocitat d'emission : @@ -6584,12 +5878,12 @@ Download Limit: - Limit de telecargament : + Limit de telecargament : Upload Limit: - Limit de mandadís : + Limit de mandadís : @@ -6612,54 +5906,54 @@ Comentari : - + Select All Seleccionar tot - + Select None Seleccionar pas res - + Normal Normala - + High Nauta Share Ratio: - Ratio de partiment : + Ratio de partiment : Reannounce In: - Anonciar dins : + Anonciar dins : Last Seen Complete: - Darrièra fois vu complet : + Darrièra fois vu complet : Total Size: - Talha totala : + Talha totala : Pieces: - Tròces : + Tròces : Created By: - Creat per : + Creat per : @@ -6679,173 +5973,173 @@ Torrent Hash: - Hachage del torrent : + Hachage del torrent : Save Path: - Camin de salvament : + Camin de salvament : - + Maximum Maximala + - Do not download Telecargar pas - + Never Pas jamai - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 × %2 (a %3) - - + + %1 (%2 this session) %1 (%2 aquesta session) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (partejat pendent %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 maximum) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 total) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 en mejana) - + Open Dobèrt - + Open Containing Folder Dobrir lo contengut del dorsièr - + Rename... Renomenar… - + Priority Prioritat - + New Web seed Novèla font web - + Remove Web seed Suprimir la font web - + Copy Web seed URL Copiar l'URL de la font web - + Edit Web seed URL Modificar l'URL de la font web - + + Rename the file + Renomenar lo fichièr + + + New name: Nom novèl : - - + + + The file could not be renamed + Lo fichier a pas pogut èsser renomenat + + + + This file name contains forbidden characters, please choose a different one. + Aqueste nom de fichier conten de caractèrs interdits, causissètz-ne un autre. + + + + This name is already in use in this folder. Please use a different name. Aqueste nom es ja utilizat al dintre d'aqueste dorsièr. Causissètz un nom diferent. - + The folder could not be renamed Lo dorsièr a pas pogut èsser renomenat - + qBittorrent qBittorrent - + Filter files... Filtrar los fichièrs… - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - - - - + New URL seed New HTTP source Novèla font URL - + New URL seed: - Novèla font URL : + Novèla font URL : - - + + This URL seed is already in the list. Aquesta font URL es ja sus la liste. - + Web seed editing Modificacion de la font web - + Web seed URL: URL de la font web : @@ -6853,230 +6147,117 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + Vòstra adreça IP es estada bandida aprèp un nombre excessiu de temptativas d'autentificacion fracassadas. + + + + Error: '%1' is not a valid torrent file. + + Error : « %1 » es pas un fichièr torrent valid. + + + + + Error: Could not add torrent to session. + Error al moment de l'apondon del torrent a la session. + + + + I/O Error: Could not create temporary file. + Error d'entrada/sortida : lo fichièr temporari a pas pogut èsser creat. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 es un paramètre de linha de comanda desconegut. - - + + %1 must be the single command line parameter. %1 deu èsser lo paramètre de linha de comanda unica. - + + %1 must specify the correct port (1 to 65535). + %1 deu especificar lo pòrt corrècte (1 a 65535). + + + You cannot use %1: qBittorrent is already running for this user. Podètz pas utilizar% 1: qBittorrent es ja en cors d'execucion per aqueste utilizaire. - + Usage: Utilizacion : - + Options: Opcions - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - - - - - Expected integer number in environment variable '%1', but got '%2' - - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - - - - - Expected %1 in environment variable '%2', but got '%3' - - - - - port - - - - - %1 must specify a valid port (1 to 65535). - - - - - Display program version and exit - + + Displays program version + Afichar la version del programa - - Display this help message and exit - + + Displays this help message + Afichar aqueste messatge d'ajuda - - Change the Web UI port - + + Changes the Web UI port (current: %1) + Càmbia lo pòrt de l'interfàcia Web (actualament : %1) - + Disable splash screen Desactivar l'ecran d'aviada - + Run in daemon-mode (background) Executar en prètzfait de fons - - dir - Use appropriate short form or abbreviation of "directory" - - - - - Store configuration files in <dir> - - - - - - name - - - - - Store configuration files in directories qBittorrent_<name> - - - - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - - - - - files or URLs - - - - - Download the torrents passed by the user - - - - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - - - - - Options when adding new torrents: - - - - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - - - - - path - - - - - Torrent save path - - - - - Add torrents as started or paused - - - - - Skip hash check - Verificar pas las donadas del torrent - - - - Assign torrents to category. If the category doesn't exist, it will be created. - - - - - Download files in sequential order - - - - - Download first and last pieces first - Telecargar primièras e darrièras pèças en primièr - - - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - + + Downloads the torrents passed by the user + Telecargar los torrents transmeses per l'utilizaire - - Command line parameters take precedence over environment variables - - - - + Help Ajuda - + Run application with -h option to read about command line parameters. Executar lo programa amb l'opcion -h per afichar los paramètres de linha de comanda. - + Bad command line Marrida linha de comanda - + Bad command line: Marrida linha de comanda : - + Legal Notice Informacion legala - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - - - - - No further notices will be issued. - - - - + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. No further notices will be issued. @@ -7085,353 +6266,432 @@ Aqueste messatge d'avertiment serà pas mai afichat. - + Press %1 key to accept and continue... Quichatz sus la tòca %1 per acceptar e contunhar… - + Legal notice Informacion legala - + Cancel Anullar - + I Agree Accèpti - - - Upgrade - Metre a jorn + + Torrent name: %1 + Nom del torrent : %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - Venètz de metre a jorn dempuèi una anciana version que salvava los paramètres d'una manièra diferenta. Vos cal migrar cap al novèl sistèma de salvament. Poiretz pas mai utilizar una version mai anciana que la v3.3.0. Contunhar ? [o/n] + + Torrent size: %1 + Talha del torrent : %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - Venètz de metre a jorn dempuèi una anciana version que salvava los paramètres d'una manièra diferenta. Vos cal migrar cap al novèl sistèma de salvament. Se contunhatz, poiretz pas mai utilizar una version mai anciana que la v3.3.0. + + Save path: %1 + Camin de salvament : %1 - - Couldn't migrate torrent with hash: %1 - Impossible de migrar lo torrent amb lo hachage : %1 + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Lo torrent es estat telecargat dins %1. - - Couldn't migrate torrent. Invalid fastresume file name: %1 - Impossible de migrar lo torrent. Nom de fichièr fastresume invalid : %1 + + Thank you for using qBittorrent. + Mercé d'utilizar qBittorrent. - - Detected unclean program exit. Using fallback file to restore settings: %1 - + + [qBittorrent] '%1' has finished downloading + [qBittorrent] Lo telecargament de « %1 » es acabat. - - An access error occurred while trying to write the configuration file. - Una error d'accès s'es produita en ensajant d'escriure lo fichièr de configuracion. + + The remote host name was not found (invalid hostname) + Òste distant introbable (nom d'òste invalid) - - A format error occurred while trying to write the configuration file. - Una error de format s'es produita en ensajant d'escriure lo fichièr de configuracion. + + The operation was canceled + L'operacion es estada anullada - - An unknown error occurred while trying to write the configuration file. - + + The remote server closed the connection prematurely, before the entire reply was received and processed + Lo servidor distant a interromput la connexion prematuradament, abans la recepcion completa de la responsa - - - RSS::AutoDownloader - - - Invalid data format. - + + The connection to the remote server timed out + Relambi de connexion al servidor distant expirat - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - + + SSL/TLS handshake failed + Punhada de man SSL/TLS fracassada - - Invalid data format - + + The remote server refused the connection + Lo servidor distant a refusat la connexion - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - + + The connection to the proxy server was refused + La connexion al servidor proxy es estada refusada - - Couldn't load RSS AutoDownloader rules. Reason: %1 - + + The proxy server closed the connection prematurely + Lo servidor proxy a tampat la connexion prematuradament - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - + + The proxy host name was not found + Lo nom d'òste del proxy es pas estat trobat - - RSS feed at '%1' updated. Added %2 new articles. - + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Relambi de connexion al servidor mandatari expirat o lo servidor a pas respondut a temps a la requèsta - - Failed to parse RSS feed at '%1'. Reason: %2 - + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Lo proxy requerís una autentificacion per fin de respondre a la requèsta, mas accèpta pas cap dels identificants especificats - - Couldn't read RSS Session data from %1. Error: %2 - + + The access to the remote content was denied (401) + L'accès al contengut distant es estat refusat (401) - - Couldn't parse RSS Session data. Error: %1 - + + The operation requested on the remote content is not permitted + L'operacion demandada sul contengut distant es pas autorizada - - Couldn't load RSS Session data. Invalid data format. - + + The remote content was not found at the server (404) + Lo contengut distant es pas estat trobat sul servidor (404) - - Couldn't load RSS article '%1#%2'. Invalid data format. - + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Lo servidor distant demanda una autentificacion abans de distribuir lo contengut, mas los identificants provesits son pas estats acceptats - - - RSS::Private::Parser - - Invalid RSS feed. - + + The Network Access API cannot honor the request because the protocol is not known + L'API d'Accès Ret pòt pas tractar la requèsta perque lo protocòl es desconegut - - %1 (line: %2, column: %3, offset: %4). - + + The requested operation is invalid for this protocol + L'operacion demandada es invalida per aqueste protocòl - - - RSS::Session - - RSS feed with given URL already exists: %1. - + + An unknown network-related error was detected + Una error desconeguda relativa a la ret es estada detectada - - Cannot move root folder. - + + An unknown proxy-related error was detected + Una error desconeguda relativa al servidor mandatari es estada detectada - - - Item doesn't exist: %1. - + + An unknown error related to the remote content was detected + Una error desconeguda relativa al contengut distant es estada detectada - - Cannot delete root folder. - + + A breakdown in protocol was detected + Una ruptura de protocòl es estada detectada - - Incorrect RSS Item path: %1. - + + Unknown error + Error desconeguda - - RSS item with given path already exists: %1. - + + + Upgrade + Metre a jorn - - Parent folder doesn't exist: %1. - + + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] + Venètz de metre a jorn dempuèi una anciana version que salvava los paramètres d'una manièra diferenta. Vos cal migrar cap al novèl sistèma de salvament. Poiretz pas mai utilizar una version mai anciana que la v3.3.0. Contunhar ? [o/n] + + + + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. + Venètz de metre a jorn dempuèi una anciana version que salvava los paramètres d'una manièra diferenta. Vos cal migrar cap al novèl sistèma de salvament. Se contunhatz, poiretz pas mai utilizar una version mai anciana que la v3.3.0. + + + + Couldn't migrate torrent with hash: %1 + Impossible de migrar lo torrent amb lo hachage : %1 + + + + Couldn't migrate torrent. Invalid fastresume file name: %1 + Impossible de migrar lo torrent. Nom de fichièr fastresume invalid : %1 + + + + Detected unclean program exit. Using fallback file to restore settings. + Tampadura inesperada del programa detectada. Lo fichièr de salvament va èsser utilizat per restablir los paramètres. + + + + An access error occurred while trying to write the configuration file. + Una error d'accès s'es produita en ensajant d'escriure lo fichièr de configuracion. + + + + A format error occurred while trying to write the configuration file. + Una error de format s'es produita en ensajant d'escriure lo fichièr de configuracion. - RSSWidget + RSS - + Search - Recèrca - - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - + Recercar - + New subscription - + Novèla soscripcion - - - + + + Mark items read - + Marcar coma legit - - Refresh RSS streams - - - - + Update all - + Tot metre a jorn - + RSS Downloader... - + Telecargador de RSS… + + + + Settings... + Paramètres… - + Torrents: (double-click to download) - + Torrents : (doble-clic per telecargar) - - + + Delete - Suprimir + Suprimir - + Rename... - Renomenar… + Renomenar… - + Rename - Renomenar + Renomenar - - + + Update - + Metre a jorn - + New subscription... - + Novèla soscripcion… - - + + Update all feeds - + Tot metre a jorn - + Download torrent - + Telecargar lo torrent - + Open news URL - + Dobrir l'URL de l'article - + Copy feed URL - + Copiar l'URL del flux - + New folder... - + Novèl dorsièr… - - Please choose a folder name - + + Refresh RSS streams + Refrescar los fluxes RSS + + + + RSSImp + + + Stream URL: + URL del flux : - - Folder name: - + + Please type a RSS stream URL + Entratz l'adreça d'un flux RSS - - New folder - + + This RSS feed is already in the list. + Aqueste flux RSS es ja dins la lista. - - Please type a RSS feed URL - + + Please choose a folder name + Indicatz un nom de dorsièr - - Feed URL: - + + Folder name: + Nom del dorsièr : + + + + New folder + Novèl dorsièr - + Deletion confirmation - + Confirmacion de supression - + Are you sure you want to delete the selected RSS feeds? - + Sètz segur que volètz suprimir los fluxes RSS seleccionats ? - + Please choose a new name for this RSS feed - + Causissètz un novèl nom per aqueste flux RSS - + New feed name: - + Novèl nom del flux : - - Rename failed - + + Name already in use + Nom ja utilizat + + + + This name is already used by another item, please choose another one. + Aqueste nom es ja utilizat per un autre element, causissètz-ne un autre. - + Date: - + Data : - + Author: - + Autor : + + + + Unread + Pas legit + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + Lo telecargament automatic de '%1' a partir del flux RSS '%2' a fracassat perque conten pas un ligam cap a un torrent o un magnet... + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + Telecargament automatic del torrent '%1' dempuèi lo flux RSS '%2'… + + + + Rss::Private::Parser + + + Invalid RSS feed. + Flux RSS invalid. + + + + RssSettingsDlg + + + RSS Reader Settings + Paramètres del lector RSS + + + + RSS feeds refresh interval: + Interval de refrescament dels fluxes RSS : + + + + min + min + + + + Maximum number of articles per feed: + Nombre maximum d'articles per flux : ScanFoldersDelegate - + Select save location Seleccionar un emplaçament de salvament @@ -7439,274 +6699,268 @@ ScanFoldersModel - + Monitored Folder Repertòri susvelhat - + Override Save Location Remplaçar l'emplaçament de salvament - + Monitored folder Repertòri susvelhat - + Default save location Emplaçament de salvament per défaut - + Browse... Percórrer... - SearchJobWidget + SearchEngine - - Form - + + Unknown search engine plugin file format. + Format de fichièrs de l'empeuton de recèrca desconegut. - - Results(xxx) - + + A more recent version of this plugin is already installed. + Una version mai recenta d'aqueste empeuton es ja installada. - - Search in: - + + + Plugin is not supported. + L'empeuton es pas suportat. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - + + Update server is temporarily unavailable. %1 + O planhèm, lo servidor de mesa a jorn es temporàriament indisponible. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - + + + Failed to download the plugin file. %1 + Impossible de telecargar l'empeuton. %1 - - Seeds: - Fonts : + + An incorrect update info received. + Una informacion erronèa es estada recebuda a prepaus de la mesa a jorn. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - + + All categories + Totas las categorias - - - to - + + Movies + Filmes - - <html><head/><body><p>Maximal number of seeds</p></body></html> - + + TV shows + Serias TV - - - - + + Music + Musica - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + + Games + Jòcs - - Size: - Talha : + + Anime + Anime - - <html><head/><body><p>Minimal torrent size</p></body></html> - + + Software + Logicials - - <html><head/><body><p>Maximal torrent size</p></body></html> - + + Pictures + Fòtos + + + + Books + Libres + + + + SearchListDelegate + + + + Unknown + Desconegut + + + SearchTab - + Name i.e: file name - Nom + Nom - + Size i.e: file size - Talha + Talha - + Seeders i.e: Number of full sources - + Fonts completas - + Leechers i.e: Number of partial sources - + Fonts parcialas - + Search engine - - - - - Filter search results... - + Motor de recèrca - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Resultats (afichatge <i>%1</i> de <i>%2</i>) : - + Torrent names only - + Noms de torrent solament - + Everywhere - - - - - Use regular expressions - + Pertot - + Searching... - + Recèrca... - + Search has finished - Recèrca acabada + Recèrca acabada - + Search aborted - + Recèrca interrompuda - + An error occurred during search... - + Una error s'es produita pendent la recèrca.. - + Search returned no results - + La recèrca a pas tornat cap de resultat - + Column visibility - - - SearchPluginManager - - Unknown search engine plugin file format. - + + Form + Formulari - - A more recent version of this plugin is already installed. - + + Results(xxx) + Resultats(xxx) - - - Plugin is not supported. - + + Search in: + Recercar dins : - - All categories - + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Certans motors de recèrca cèrcan dins la descripcion del torrent e tanben dins los noms de fichièr del torrent. Siá aqueles resultats que seràn afichats dins la lista çaijós es controrotlada per aqueste mòde.</p><p><span style=" font-weight:600;">Pertot </span>desactiva lo filtratge e mòstra tot çò qu'es tornat pels motors de recèrca.</p><p><span style=" font-weight:600;">Noms de torrent solament</span> mòstra pas que los torrents que los noms correspondon a la requèsta de recèrca.</p></body></html> - - Movies - + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Definir un nombre minimal e maximal autorizat de fonts</p></body></html> - - TV shows - + + Seeds: + Fonts : - - Music - + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Nombre minimal de fonts</p></body></html> - - Games - + + + to + a - - Anime - + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Nombre maximal de fonts</p></body></html> + + + + + + - - Software - + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Definir la talha minimala e maximala autorizada d'un torrent</p></body></html> - - Pictures - + + Size: + Talha : - - Books - - - - - Update server is temporarily unavailable. %1 - - - - - - Failed to download the plugin file. %1 - - - - - An incorrect update info received. - + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Talha minimala del torrent</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Talha maximala del torrent</p></body></html> @@ -7714,197 +6968,185 @@ - - - - + + + Search Recèrca - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - - + Download Telecargar - + Go to description page Anar a la pagina de descripcion - + Copy description page URL Copiar l'URL de la pagina de descripcion - + Search plugins... Empeutons de recèrca... - + A phrase to search for. Una frasa de recercar - + Spaces in a search term may be protected by double quotes. Los espacis dins un tèrme de recèrca pòdon èsser protegits per de verguetas. - + Example: Search phrase example Exemple : - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>: recèrca <b>foo</b> e <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: recèrca <b>foo bar</b> - + All plugins Totes los empeutons - + Only enabled Unicament activat(s) - + Select... Causir... - - - + + + Search Engine Motor de recèrca - + Please install Python to use the Search Engine. Installatz Python per fin d'utilizar lo motor de recèrca. - + Empty search pattern Motiu de recèrca void - + Please type a search pattern first Entratz un motiu de recèrca - + Stop Arrestar - + Search has finished Recèrca acabada - + Search has failed La recèrca a fracassat - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + qBittorrent se va tampar ara. - + E&xit Now - + &Quitar ara - + Exit confirmation - + Confirmacion de tampadura - + The computer is going to shutdown. - + L'ordenador se va atudar - + &Shutdown Now - - - - - Shutdown confirmation - + &Atudar ara - + The computer is going to enter suspend mode. - + L'ordenador va entrar en mòde velha - + &Suspend Now - + &Metre en velha ara - + Suspend confirmation - + Confirmacion de mesa en velha - + The computer is going to enter hibernation mode. - + L'ordenador va entrar en velha perlongada - + &Hibernate Now - + &Metre en velha perlongada ara - + Hibernate confirmation - + Confirmacion de velha perlongada - + You can cancel the action within %1 seconds. - + Podètz anullar aquesta accion dins %1 segondas. + + + + Shutdown confirmation + Confirmacion de l'atudament SpeedLimitDialog - + KiB/s Kio/s @@ -7912,52 +7154,52 @@ SpeedPlotView - + Total Upload Mandadís (total) - + Total Download Telecargament(total) - + Payload Upload Mandadís (carga utila) - + Payload Download Telecargament (carga utila - + Overhead Upload Mandadís (sobras) - + Overhead Download Telecargament (sobras - + DHT Upload Mandadís (DHT) - + DHT Download Telecargament(DHT) - + Tracker Upload Mandadís (tracker) - + Tracker Download Telecargament (tracker) @@ -7965,95 +7207,87 @@ SpeedWidget - + Period: - Periòde : + Periòde : - + 1 Minute 1 minuta - + 5 Minutes 5 minutas - + 30 Minutes 30 minutas - + 6 Hours 6 oras - + Select Graphs Seleccionar los grafics - + Total Upload Mandadís (total) - + Total Download Telecargament (total) - + Payload Upload Mandadís (carga utila) - + Payload Download Telecargament (carga utila) - + Overhead Upload Mandadís (sobras) - + Overhead Download Telecargament (sobras) - + DHT Upload Mandadís (DHT) - + DHT Download Telecargament (DHT) - + Tracker Upload Mandadís (tracker) - + Tracker Download Telecargament (tracker) - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8066,49 +7300,49 @@ Estatisticas utilizaire - - Cache statistics - Estatisticas del tampon + + Total peer connections: + Nombre total de connexions als pars : - - Read cache hits: - Succès de tampon en lectura : + + Global ratio: + Ratio global : - - Average time in queue: - Temps mejan passat en fila d'espèra : + + Alltime download: + Telecargat dempuèi la primièra utilizacion : - - Connected peers: - + + Alltime upload: + Mandat dempuèi la primièra utilizacion : - - All-time share ratio: - + + Total waste (this session): + Total degalhat (pendent aquesta session) : - - All-time download: - + + Cache statistics + Estatisticas del tampon - - Session waste: - + + Read cache hits: + Succès de tampon en lectura : - - All-time upload: - + + Average time in queue: + Temps mejan passat en fila d'espèra : - Total buffer size: - + Total buffers size: + Talha totala dels buffers : @@ -8136,7 +7370,12 @@ Talha totala dels fichièrs en fila d'espèra : - + + OK + D'acòrdi + + + %1 ms 18 milliseconds %1 ms @@ -8145,27 +7384,32 @@ StatusBar - + Connection status: Estatut de la connexion : - + No direct connections. This may indicate network configuration problems. Pas cap de connexion dirècta. Aquò pòt èsser signe d'una marrida configuracion de la ret. - + DHT: %1 nodes DHT : %1 nosèls - - qBittorrent needs to be restarted! - + + qBittorrent needs to be restarted + qBittorrent deu èsser reaviat + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent ven d'èsser mes a jorn e deu èsser reaviat per que los cambiaments sián preses en compte. @@ -8184,1563 +7428,1311 @@ Connectat - + Click to switch to alternative speed limits Clicatz aicí per utilizar los limits de velocitat alternatius - + Click to switch to regular speed limits Clicatz aicí per utilizar los limits de velocitat normals - + + Manual change of rate limits mode. The scheduler is disabled. + Mòde de cambiament manual dels limits de taus. Lo planificador es desactivat. + + + Global Download Speed Limit Limit global de la velocitat de recepcion - + Global Upload Speed Limit Limit global de la velocitat de mandadís - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - Totes (0) + Totes (0) - + Downloading (0) - + En Telecargament (0) - + Seeding (0) - + En Partiment (0) - + Completed (0) - + Acabats (0) - + Resumed (0) - + Aviats (0) - + Paused (0) - + En Pausa (0) - + Active (0) - + Actius (0) - + Inactive (0) - + Inactius (0) - + Errored (0) - + Error (0) - + All (%1) - Totes (%1) + Totes (%1) - + Downloading (%1) - + En Telecargament (%1) - + Seeding (%1) - + En Partiment (%1) - + Completed (%1) - + Acabats (%1) - + Paused (%1) - + En Pausa (%1) - + Resumed (%1) - + Aviats (%1) - + Active (%1) - + Actius (%1) - + Inactive (%1) - + Inactius (%1) - + Errored (%1) - + Error (%1) - TagFilterModel + TorrentContentModel - - Tags - + + Name + Nom - - All - + + Size + Talha - - Untagged - + + Progress + Progression - - - TagFilterWidget - - Add tag... - + + Download Priority + Prioritat de telecargament - - Remove tag - + + Remaining + Restant + + + TorrentCreatorDlg - - Remove unused tags - + + Select a folder to add to the torrent + Seleccionar un dorsièr d'apondre al torrent - - Resume torrents - Aviar los torrents + + Select a file to add to the torrent + Seleccionar un fichièr d'apondre al torrent - - Pause torrents - Metre en pausa los torrents + + No input path set + Cap de fichièr pas inclús - - Delete torrents - Suprimir los torrents + + Please type an input path first + Seleccionatz un fichièr o un dorsièr d'inclure d'en primièr - - New Tag - + + Select destination torrent file + Seleccionar lo torrent de crear - - Tag: - + + Torrent Files (*.torrent) + Fichièrs torrent (*.torrent) - - Invalid tag name - + + Torrent was created successfully: %1 + %1 is the path of the torrent + Torrent creat amb succès : %1 - - Tag name '%1' is invalid - + + + + Torrent creation + Creacion d'un torrent - - Tag exists - + + Torrent creation was unsuccessful, reason: %1 + La creacion del torrent a fracassat, rason : %1 - - Tag name already exists. - + + Created torrent file is invalid. It won't be added to download list. + Lo torrent creat es invalid. Serà pas apondut a la lista dels telecargaments. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - + + Name + i.e: torrent name + Nom - - Name: - + + Size + i.e: torrent size + Talha - - Save path: - + + Done + % Done + Progression - - Choose save path - + + Status + Torrent status (e.g. downloading, seeding, paused) + Estatut - - New Category - + + Seeds + i.e. full sources (often untranslated) + Fonts - - Invalid category name - + + Peers + i.e. partial sources (often untranslated) + Pars - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - + + Down Speed + i.e: Download speed + Velocitat DL - - Category creation error - + + Up Speed + i.e: Upload speed + Velocitat UP - - Category with the given name already exists. -Please choose a different name and try again. - + + Ratio + Share ratio + Ratio - - - TorrentContentModel - - Name - Nom + + ETA + i.e: Estimated Time of Arrival / Time left + Temps restant - - Size - Talha + + Category + Categoria - - Progress - Progression + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Apondut lo - - Download Priority - Prioritat de telecargament + + Completed On + Torrent was completed on 01/01/2010 08:00 + Acabat lo - - Remaining - Restant + + Tracker + Tracker - - Availability - + + Down Limit + i.e: Download limit + Limit recepcion - - - TorrentCreatorDialog - - Torrent Creator - + + Up Limit + i.e: Upload limit + Limit mandadís - - Select file/folder to share - + + Downloaded + Amount of data downloaded (e.g. in MB) + Telecargat - - Path: - + + Uploaded + Amount of data uploaded (e.g. in MB) + Mandat - - [Drag and drop area] - + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Telecargament de la session - - - Select file - + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Emission de la session - - - Select folder - + + Remaining + Amount of data left to download (e.g. in MB) + Restant - - Settings - - - - - Piece size: - - - - - Auto - - - - - 16 KiB - - - - - 32 KiB - - - - - 64 KiB - - - - - 128 KiB - - - - - 256 KiB - - - - - 512 KiB - - - - - 1 MiB - - - - - 2 MiB - - - - - 4 MiB - - - - - 8 MiB - - - - - 16 MiB - - - - - 32 MiB - - - - - Calculate number of pieces: - - - - - Private torrent (Won't distribute on DHT network) - - - - - Start seeding immediately - - - - - Ignore share ratio limits for this torrent - - - - - Optimize alignment - - - - - Fields - - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - - - - Web seed URLs: - - - - - Tracker URLs: - - - - - Comments: - - - - - Source: - - - - - Progress: - Progression : - - - - Create Torrent - - - - - - - Torrent creation failed - - - - - Reason: Path to file/folder is not readable. - - - - - Select where to save the new torrent - - - - - Torrent Files (*.torrent) - - - - - Reason: %1 - - - - - Reason: Created torrent is invalid. It won't be added to download list. - - - - - Torrent creator - - - - - Torrent created: - - - - - TorrentInfo - - - File size exceeds max limit %1 - - - - - Torrent file read error: %1 - - - - - Torrent file read error: size mismatch - - - - - TorrentsController - - - Not contacted yet - - - - - Updating... - - - - - Working - - - - - Not working - - - - - Error: '%1' is not a valid torrent file. - - - - - - - - Torrent queueing must be enabled - - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - + + Time Active + Time (duration) the torrent is active (not paused) + Actiu pendent - - Unable to edit category - + + Save path + Torrent save path + Camin de salvament - - Cannot make save path - + + Completed + Amount of data completed (e.g. in MB) + Acabat - - Cannot write to directory - + + Ratio Limit + Upload share ratio limit + Limit de ratio - - WebUI Set location: moving "%1", from "%2" to "%3" - + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Darrièr còp vist complet - - Incorrect torrent name - + + Last Activity + Time passed since a chunk was downloaded/uploaded + Darrièra activitat - - - Incorrect category name - + + Total Size + i.e. Size including unwanted data + Talha totala TrackerFiltersList - + All (0) this is for the tracker filter Totes (0) - + Trackerless (0) Sens tracker (0) - + Error (0) Error (0) - + Warning (0) Alèrta (0) - - + + Trackerless (%1) Sens tracker (%1) - - + %1 (%2) + openbittorrent.com (10) + %1 (%2) + + + + Error (%1) Error (%1) - - + + Warning (%1) Alèrta (%1) - + Resume torrents Aviar los torrents - + Pause torrents Metre en pausa los torrents - + Delete torrents Suprimir los torrents - - + + All (%1) this is for the tracker filter Totes (%1) - TrackerListWidget - - - - Working - - - - - Disabled - - + TrackerList - - This torrent is private - + + URL + URL - - Updating... - + + Status + Estatut - - Not working + + Received - - Not contacted yet - + + Seeds + Fonts - - - - - - - N/A - N/A + + Peers + Pars - - Tracker editing - + + Downloaded + Telecargat - - Tracker URL: - + + Message + Messatge - - - Tracker editing failed - + + + Working + Fonciona - - The tracker URL entered is invalid. - + + Disabled + Desactivat - - The tracker URL already exists. - + + This torrent is private + Aqueste torrent es privat - - Add a new tracker... - + + Updating... + Mesa a jorn… - - Remove tracker - + + Not working + Fonciona pas - - Copy tracker URL - + + Not contacted yet + Pas encara contactat - - Edit selected tracker URL - + + Tracker URL: + URL del tracker : - - Force reannounce to selected trackers - + + Tracker editing + Modificacion del tracker - - Force reannounce to all trackers - + + + Tracker editing failed + Fracàs de la modificacion del tracker - - URL - + + The tracker URL entered is invalid. + L'URL del tracker provesit es invalid. - - Status - Estatut + + The tracker URL already exists. + L'URL del tracker existís ja. - - Received - + + Add a new tracker... + Apondre un novèl tracker… - - Seeds - + + Copy tracker URL + Copiar l'URL del tracker - - Peers - Pars + + Edit selected tracker URL + Modificar l'URL del tracker seleccionat - - Downloaded - Telecargat + + Force reannounce to selected trackers + Forçar una novèla anóncia als trackers seleccionats - - Message - + + Force reannounce to all trackers + Forçar una novèla anóncia a totes los trackers - - Column visibility - + + Remove tracker + Suprimir lo tracker - TrackerLoginDialog - - - - Tracker authentication - - - - - Tracker: - - + TrackersAdditionDlg - - Login - Identificant - - - - Username: - Nom d'utilizaire : - - - - Password: - Senhal : + + Trackers addition dialog + Fenèstra d'apondon de trackers - - Log in - + + List of trackers to add (one per line): + Lista dels trackers d'apondre (un per linha) : - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + URL de la lista compatibla amb µTorrent : - - List of trackers to add (one per line): - + + I/O Error + Error E/S - - µTorrent compatible list URL: - + + Error while trying to open the downloaded file. + Error a la dobertura del fichièr telecargat. - + No change - + Pas cap de cambiament - + No additional trackers were found. - + Cap de tracker suplementari es pas disponible. - + Download error - Error de telecargament + Error de telecargament - + The trackers list could not be downloaded, reason: %1 - + La lista de trackers a pas pogut èsser telecargada, rason : %1 TransferListDelegate - + Downloading En telecargament - + Downloading metadata used when loading a magnet link Telecargament de las metadonadas - + Allocating qBittorrent is allocating the files on disk Atribucion - + Paused En pausa - + Queued i.e. torrent is queued En fila d'espèra - + Seeding Torrent is complete and in upload-only mode En partiment - + Stalled Torrent is waiting for download to begin En espèra - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] Telecargament - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] Emission - + Checking Torrent local data is being checked Verificacion - + Queued for checking i.e. torrent is queued for hash checking Verificacion planificada - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Verificacion de las donadas de reaviada - + Completed Acabat - - Moving - Torrent local data are being moved/relocated - - - - + Missing Files Fichièrs mancants - + Errored torrent status, the torrent has an error Error - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (partejat pendent %2) - - %1 ago - e.g.: 1h 20m ago - i a %1 - - - - TransferListFiltersWidget - - - Status - Estatut - - - - Categories - Categorias - - - - Tags - - - - - Trackers - Trackers - - - - TransferListModel - - - Name - i.e: torrent name - Nom - - - - Size - i.e: torrent size - Talha - - - - Done - % Done - - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Estatut - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - Pars - - - - Down Speed - i.e: Download speed - Velocitat DL - - - - Up Speed - i.e: Upload speed - Velocitat UP - - - - Ratio - Share ratio - - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - Categoria - - - - Tags - - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Telecargat - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Mandat - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - Restant - - - - Time Active - Time (duration) the torrent is active (not paused) - - - - - Save path - Torrent save path - - - - - Completed - Amount of data completed (e.g. in MB) - Acabat - - - - Ratio Limit - Upload share ratio limit - + + %1 ago + e.g.: 1h 20m ago + i a %1 + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + Estatut - - Last Activity - Time passed since a chunk was downloaded/uploaded - + + Categories + Categorias - - Total Size - i.e. Size including unwanted data - + + Trackers + Trackers TransferListWidget - + Column visibility Visibilitat de las colomnas - + Choose save path Causida del repertòri de destinacion - + Torrent Download Speed Limiting Limitacion de la velocitat de recepcion - + Torrent Upload Speed Limiting Limitacion de la velocitat d'emission - + Recheck confirmation Reverificar la confirmacion - + Are you sure you want to recheck the selected torrent(s)? Sètz segur que volètz reverificar lo o los torrent(s) seleccionat(s) ? - + Rename Renomenar - + New name: Novèl nom : - + Resume Resume/start the torrent Aviar - + Force Resume Force Resume/start the torrent Forçar la represa - + Pause Pause the torrent Metre en pausa - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - - - - - Add Tags - - - - - Remove All Tags - - - - - Remove all tags from selected torrents? - + + New Category + Novèla Categoria - - Comma-separated tags: - + + Category: + Categoria : - - Invalid tag - + + Invalid category name + Nom de categoria invalid - - Tag name: '%1' is invalid - + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Nom de categoria deu pas conténer '\'. +Nom de categoria deu pas començar/finir amb '/'. +Nom de categoria deu pas conténer la sequéncia '//'. - + Delete Delete the torrent Suprimir - + Preview file... Previsualizar lo fichièr… - + Limit share ratio... Limitar lo ratio de partiment… - + Limit upload rate... Limitar la velocitat de mandadís… - + Limit download rate... Limitar la velocitat de recepcion… - + Open destination folder Dobrir lo repertòri de destinacion - + Move up i.e. move up in the queue Desplaçar cap amont - + Move down i.e. Move down in the queue Desplaçar cap aval - + Move to top i.e. Move to top of the queue Desplaçar cap amont - + Move to bottom i.e. Move to bottom of the queue Desplaçar cap aval - + Set location... Camin de salvament… - - Force reannounce - - - - + Copy name Copiar nom - - Copy hash - - - - + Download first and last pieces first Telecargar primièras e darrièras pèças en primièr - + Automatic Torrent Management Gestion de torrent automatique - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category Lo mòde automatic significa que certanas proprietats del torrent (ex: lo dorsièr d'enregistrament) seràn decidits via la categoria associada - + Category Categoria - + New... New category... Novèla… - + Reset Reset category Reïnicializar - - Tags - - - - - Add... - Add / assign multiple tags... - - - - - Remove All - Remove all tags - - - - + Priority Prioritat - + Force recheck Forçar una reverificacion - + Copy magnet link Copiar lo ligam magnet - + Super seeding mode Mòde de superpartiment - + Rename... Renomenar… - + Download in sequential order Telecargament sequencial - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + Limitacion del ratio de partiment - - Use global share limit - + + Use global ratio limit + Utilizar lo limit global - - - + + + buttonGroup - + buttonGroup - - Set no share limit - + + Set no ratio limit + Limitar pas lo ratio - - Set share limit to - + + Set ratio limit to + Limitar lo ratio a + + + + WebApplication + + + Incorrect category name + Nom de categoria incorrect + + + WebUI - - ratio - + + The Web UI is listening on port %1 + L'interfàcia web es associada al pòrt %1 - - minutes - + + Web UI Error - Unable to bind Web UI to port %1 + Error de l'interfàcia Web – Impossible d'assignar l'interfàcia Web al pòrt %1 + + + about - - No share limit method selected - + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Un client avançat BitTorrent programat en C++, basat sus l'aisina Qt e libtorrent-rasterbar. - - Please select a limit method first - + + Copyright %1 2006-2016 The qBittorrent project + Copyright %1 2006-2016 Lo projècte qBittorrent + + + + Home Page: + Pagina d'acuèlh : + + + + Forum: + Forum : + + + + Bug Tracker: + Seguiment de Bugs : - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - + + Add Peers + Apondre de pars - - Python not detected - + + List of peers to add (one per line): + Lista dels pars d'apondre (un per linha) : + + + + Format: IPv4:port / [IPv6]:port + Format : IPv4:port / [IPv6]:port - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - + + + Tracker authentication + Autentificacion del tracker - - Symlinks inside alternative UI folder are forbidden. - + + Tracker: + Tracker : - - Exceeded the maximum allowed file size (%1)! - + + Login + Autentificacion - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - + + Username: + Nom d'utilizaire : - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - + + Password: + Senhal : - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - + + Log in + S'autentificar - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - + + Cancel + Anullar - WebUI + confirmDeletionDlg - - Web UI: HTTPS setup successful - + + Deletion confirmation - qBittorrent + Confirmacion de la supression – qBittorrent - - Web UI: HTTPS setup failed, fallback to HTTP - + + Remember choice + Se remembrar de la causida - - Web UI: Now listening on IP: %1, port: %2 - + + Also delete the files on the hard disk + Suprimir tanben los fichièrs sul disc + + + + confirmShutdownDlg + + + Don't show again + Afichar pas mai + + + createTorrentDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - + + Cancel + Anullar + + + + Torrent Creation Tool + Utilitari de creacion de torrent + + + + Torrent file creation + Creacion d'un fichièr torrent + + + + Add file + Apondre un fichièr + + + + Add folder + Apondre un dorsièr + + + + File or folder to add to the torrent: + Fichièr o dorsièr d'apondre al torrent : + + + + Tracker URLs: + URL dels trackers : + + + + Web seeds urls: + URL de las fonts web : + + + + Comment: + Comentari : + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Podètz separar los nivèls / gropes del tracker per una linha voida. + + + + Piece size: + Talha dels tròces : + + + + 16 KiB + 16 Kio + + + + 32 KiB + 32 Kio + + + + 64 KiB + 64 Kio + + + + 128 KiB + 128 Kio + + + + 256 KiB + 256 Kio + + + + 512 KiB + 512 Kio + + + + 1 MiB + 1 Mio + + + + 2 MiB + 2 Mio + + + + 4 MiB + 4 Mio + + + + 8 MiB + 8 Mio + + + + 16 MiB + 16 Mio + + + + Auto + Automatic + + + + Private (won't be distributed on DHT network if enabled) + Privat (serà pas distribuit sus la ret DHT se activat) + + + + Start seeding after creation + Començar lo partiment dirèctament + + + + Ignore share ratio limits for this torrent + Ignorar los limits del ratio de partiment per aqueste torrent + + + + Create and save... + Crear e salvar… + + + + Progress: + Progression : + + + + downloadFromURL + + + Add torrent links + Apondon de ligams cap a de torrents + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Un per linha (los ligams HTTP, ligams magnet e info-hachages son suportats) + + + + Download + Telecargar + + + + Cancel + Anullar + + + + Download from urls + Telecargament dempuèi dels URL + + + + No URL entered + Cap d'URL pas entrada + + + + Please type at least one URL. + Entratz al mens una URL. + + + + errorDialog + + + Crash info + Informacion de plantatge fsutils - + + + + + Downloads Telecargaments @@ -9748,100 +8740,140 @@ misc - + B bytes Oct - + KiB kibibytes (1024 bytes) Kio - + MiB mebibytes (1024 kibibytes) Mio - + GiB gibibytes (1024 mibibytes) Gio - + TiB tebibytes (1024 gibibytes) Tio - + PiB pebibytes (1024 tebibytes) Pio - + EiB exbibytes (1024 pebibytes) Eio - + + Python not detected + Python pas detectat + + + + Python version: %1 + Version de Python : %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1h %2m - + %1d %2h e.g: 2days 10hours %1j %2h - + Unknown Unknown (size) Desconeguda - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent, ara, va atudar l'ordenador perque totes los telecargaments son acabats. - + < 1m < 1 minute < 1min - + %1m e.g: 10minutes %1min + + + Working + Fonciona + + + + Updating... + Mesa a jorn… + + + + Not working + Fonciona pas + + + + Not contacted yet + Pas encara contactat + preview - + Preview selection Seleccion del fichièr a previsualizar - + The following files support previewing, please select one of them: Los fichièrs seguents prenon en carga la previsualizacion, seleccionatz-ne un : + + + Preview + Previsualizar + + + + Cancel + Anullar + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_pl.ts qbittorrent-3.3.15/src/lang/qbittorrent_pl.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_pl.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_pl.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent O qBittorrent - + About O programie - + Author Autor - - Current maintainer - Aktualny opiekun - - - - Greece - Grecja - - - - + + Nationality: Narodowość: - - + + + Name: + Imię i nazwisko: + + + + E-mail: E-mail: - - - Name: - Imię i nazwisko: + + Greece + Grecja - - Original author - Pierwotny autor + + Current maintainer + Aktualny opiekun - - France - Francja + + Original author + Autor - + Special Thanks Specjalne podziękowania - + Translators Tłumacze - - License - Licencja - - - + Libraries Biblioteki - + qBittorrent was built with the following libraries: - qBittorrent został stworzony z wykorzystaniem następujących bibliotek: - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - Zaawansowany klient BitTorrent napisany w języku C++ z wykorzystaniem bibliotek Qt i libtorrent-rasterbar. - - - - Copyright %1 2006-2018 The qBittorrent project - Copyright %1 2006-2018 Projekt qBittorrent - - - - Home Page: - Strona domowa: + qBittorrent został zbudowany przy użyciu następujących bibliotek: - - Forum: - Forum: + + France + Francja - - Bug Tracker: - Śledzenie błędów: + + License + Licencja @@ -115,64 +90,74 @@ Zapisz w - + + Browse... + Przeglądaj... + + + + Set as default save path + Ustaw jako domyślną ścieżkę zapisu + + + Never show again Nigdy więcej nie pokazuj - + Torrent settings Ustawienia torrenta - + Set as default category Ustaw domyślną kategorię - + Category: Kategoria: - + Start torrent Rozpocznij pobieranie - + Torrent information Informacje o torrencie - + Skip hash check Pomiń sprawdzanie danych - + Size: Rozmiar: - + Hash: Hash: - + Comment: Komentarz: - + Date: Data: Torrent Management Mode: - Tryb zarządzania torrentem: + Tryb zarządzania torrentem @@ -190,117 +175,89 @@ Automatyczny - - Remember last used save path - Zapamiętaj ostatnią użytą ścieżkę zapisu - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog Gdy zaznaczone, plik .torrent nie zostanie usunięty pomimo ustawień na karcie "Pobieranie" w oknie opcji - + Do not delete .torrent file Nie usuwaj pliku .torrent - - Create subfolder - Utwórz podfolder - - - - Download in sequential order - Pobierz w kolejności sekwencyjnej - - - - Download first and last pieces first - Pobierz najpierw część pierwszą i ostatnią - - - + Normal Normalny - + High Wysoki - + Maximum Maksymalny - + Do not download Nie pobieraj - - - + + + I/O Error Błąd we/wy - + Invalid torrent Nieprawidłowy torrent - - Renaming - Zmiana nazwy - - - - - Rename error - Błąd zmiany nazwy + + + + + Already in download list + Już jest na liście pobierania - - The name is empty or contains forbidden characters, please choose a different one. - Nazwa jest pusta lub zawiera zabronione znaki, proszę wybrać inną nazwę. - - - + Not Available This comment is unavailable Niedostępne - + Not Available This date is unavailable Niedostępne - + Not available Niedostępne - + Invalid magnet link Nieprawidłowy odnośnik magnet - + The torrent file '%1' does not exist. Plik torrent '%1' nie istnieje. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. Nie można odczytać pliku torrent '%1' z dysku. Prawdopodobnie nie masz wystarczających uprawnień. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ Błąd: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torrent jest już na liście pobierania. Trackery nie zostały połączone, ponieważ jest to torrent prywatny. + + + + Torrent is already in download list. Trackers were merged. + Torrent jest już na liście pobierania. Trackery zostały połączone. + + + + + Cannot add torrent + Nie można dodać pliku torrent + + + + Cannot add this torrent. Perhaps it is already in adding state. + Nie można dodać tego pliku torrent. Możliwe, że jest już w stanie dodawania. + + + This magnet link was not recognized Odnośnik magnet nie został rozpoznany - + + Magnet link is already in download list. Trackers were merged. + Odnośnik magnet jest już na liście pobierania. Trackery zostały połączone. + + + + Cannot add this torrent. Perhaps it is already in adding. + Nie można dodać tego pliku torrent. Możliwe, że jest już dodawany. + + + Magnet link Odnośnik magnet - + Retrieving metadata... Pobieranie metadanych... - + Not Available This size is unavailable. Niedostępne - + Free space on disk: %1 Wolne miejsce na dysku: %1 - + + Choose save path Wybierz ścieżkę zapisu - - - - - - - Torrent is already present - Torrent jest już obecny - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - Torrent '%1' jest już na liście transferów. Trackery nie zostały połączone, ponieważ jest to torrent prywatny. + + Rename the file + Zmień nazwę pliku - - Torrent '%1' is already in the transfer list. Trackers have been merged. - Torrent '%1' jest już na liście transferów. Trackery zostały połączone. - - - - Torrent is already queued for processing. - Torrent jest już w kolejce do przetwarzania. - - - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - Odnośnik magnet '%1' jest już na liście transferów. Trackery zostały połączone. + + New name: + Nowa nazwa: - - Magnet link is already queued for processing. - Odnośnik magnet jest już w kolejce do przetwarzania. + + + The file could not be renamed + Nie można zmienić nazwy pliku - - New name: - Nowa nazwa: + + This file name contains forbidden characters, please choose a different one. + Nazwa pliku zawiera zabronione znaki. Wybierz inną nazwę. - - + + This name is already in use in this folder. Please use a different name. Wybrana nazwa jest już używana w tym katalogu. Wybierz inną nazwę. - + The folder could not be renamed Nie można zmienić nazwy katalogu - + Rename... Zmień nazwę... - + Priority Priorytet - + Invalid metadata Nieprawidłowe metadane - + Parsing metadata... Przetwarzanie metadanych... - + Metadata retrieval complete Pobieranie metadanych zakończone - + Download Error Błąd pobierania @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Rozmiar pamięci podręcznej na dysku + + + MiB - MiB + MiB - + Outgoing ports (Min) [0: Disabled] Port wychodzący (Min) [0: wyłączony] - + Outgoing ports (Max) [0: Disabled] Port wychodzący (Max) [0: wyłączony] - + Recheck torrents on completion Sprawdzaj dane po pobraniu - + Transfer list refresh interval Częstotliwość odświeżania listy transferów - + ms milliseconds ms - + Setting Ustawienie - + Value Value set for this setting Wartość - - - (disabled) - (wyłączone) - - - + (auto) (auto) - - min - minutes - min - - - + All addresses Wszystkie adresy - + qBittorrent Section Sekcja qBittorrent - - + + Open documentation Otwórz dokumentację - + libtorrent Section Sekcja libtorrent - - Asynchronous I/O threads - Asynchroniczne wątki wejścia-wyjścia - - - - Disk cache - Pamięć podręczna dysku - - - + s seconds s - + Disk cache expiry interval Okres ważności pamięci podręcznej - + Enable OS cache Włącz pamięć podręczną systemu operacyjnego - - Guided read cache - Kierowana pamięć podręczna odczytu - - - - Coalesce reads & writes - Połączone odczyty i zapisy - - - - Send upload piece suggestions - Wyślij sugestie wysyłanej części - - - - - KiB - KiB - - - - Send buffer watermark - Wyślij limit bufora - - - - Send buffer low watermark - Wyślij dolny limit bufora - - - - Send buffer watermark factor - Wyślij czynnik limitu bufora - - - - Prefer TCP - Preferuj TCP - - - - Peer proportional (throttles TCP) - Partner współmierny (dławi TCP) - - - - Allow multiple connections from the same IP address - Zezwalaj na wiele połączeń z tego samego adresu IP + + m + minutes + min - + Resolve peer countries (GeoIP) Odczytuj kraje partnerów (GeoIP) - + Resolve peer host names Odczytuj nazwy hostów partnerów - + Strict super seeding Ścisłe super-seeding - + Network Interface (requires restart) Interfejs sieciowy (wymaga ponownego uruchomienia) - + Optional IP Address to bind to (requires restart) Opcjonalny adres IP do przypisania (wymaga ponownego uruchomienia) - + Listen on IPv6 address (requires restart) Nasłuchuj adres IPv6 (wymaga ponownego uruchomienia) - + Display notifications Wyświetlaj powiadomienia - + Display notifications for added torrents Wyświetlaj powiadomienia dodanych torrentów - + Download tracker's favicon Pobierz ikonę ulubionych trackera - - Save path history length - Długość historii ścieżki zapisu - - - - Fixed slots - Stałe sloty - - - - Upload rate based - Na podstawie współczynnika wysyłania - - - - Upload slots behavior - Zachowanie slotów wysyłania - - - - Round-robin - Karuzela - - - - Fastest upload - Najszybsze wysyłanie - - - - Anti-leech - Anty-pijawka - - - - Upload choking algorithm - Algorytm dławienia wysyłania - - - + Confirm torrent recheck - Potwierdź ponowne sprawdzanie torrenta - - - - Confirm removal of all tags - Potwierdź usunięcie wszystkich znaczników + Potwierdzaj ponowne sprawdzanie torrenta - - Always announce to all trackers in a tier - Zawsze ogłaszaj do wszystkich trackerów na poziomie + Exchange trackers with other peers + Wymieniaj adresy trackerów z innymi partnerami - - Always announce to all tiers - Zawsze ogłaszaj na wszystkich poziomach + + Always announce to all trackers + Zawsze ogłaszaj do wszystkich trackerów - + Any interface i.e. Any network interface Dowolny interfejs - + Save resume data interval How often the fastresume file is saved. Interwał zapisu danych wznowienia - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - Algorytm trybu mieszanego %1-TCP - - - + Maximum number of half-open connections [0: Unlimited] Maksymalna liczba półotwartych połączeń [0: nieograniczona] - + IP Address to report to trackers (requires restart) Adres IP zgłaszany trackerom (wymaga ponownego uruchomienia) - + Enable embedded tracker Włącz wbudowany tracker - + Embedded tracker port Port wbudowanego trackera - + Check for software updates Sprawdzaj aktualizacje programu - + Use system icon theme Używaj systemowego zestawu ikon @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started - Uruchomiono qBittorrent %1 + Uruchomiono qBittorrent% 1 - + Torrent: %1, running external program, command: %2 Torrent: %1, uruchomienie zewnętrznego programu, polecenie: %2 - - Torrent name: %1 - Nazwa torrenta: %1 - - - - Torrent size: %1 - Rozmiar torrenta: %1 - - - - Save path: %1 - Ścieżka zapisu: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Torrent został pobrany w %1. - - - - Thank you for using qBittorrent. - Dziękujemy za używanie qBittorrent. - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' skończył pobieranie + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrent: %1, polecenie uruchomienia zewnętrznego programu zbyt długie (długość > %2), wykonanie zakończone niepowodzeniem. - + Torrent: %1, sending mail notification Torrent: %1, wysyłanie powiadomienia e-mail - + Information Informacje - - To control qBittorrent, access the Web UI at %1 - Aby kontrolować qBittorrent, należy uzyskać dostęp do interfejsu WWW pod adresem %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + Aby kontrolować qBittorrent, należy uzyskać dostęp do sieciowego interfejsu użytkownika pod adresem http://localhost:%1 - + The Web UI administrator user name is: %1 - Nazwa administratora interfejsu WWW to: %1 + Nazwa administratora sieciowego interfejsu użytkownika to: %1 - + The Web UI administrator password is still the default one: %1 - Hasło administratora interfejsu WWW to nadal domyślne: %1 + Hasło administratora sieciowego interfejsu użytkownika to nadal domyślne: %1 - + This is a security risk, please consider changing your password from program preferences. Ze względów bezpieczeństwa należy rozważyć zmianę hasła w ustawieniach programu. - + Saving torrent progress... Zapisywanie postępu torrenta... - - - Portable mode and explicit profile directory options are mutually exclusive - Tryb przenośny i opcje jawnego katalogu profilu wzajemnie się wykluczają - - - - Portable mode implies relative fastresume - Tryb przenośny oznacza względne fastresume - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - Błąd logowania WebAPI. Powód: IP został zbanowany, IP: %1, nazwa użytkownika: %2 - - - - Your IP address has been banned after too many failed authentication attempts. - Twój adres IP został zbanowany po zbyt wielu nieudanych próbach uwierzytelnienia. - - - - WebAPI login success. IP: %1 - Sukces logowania WebAPI. IP: %1 - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - Błąd logowania WebAPI. Powód: nieprawidłowe dane uwierzytelniające, liczba prób: %1, IP:%2, nazwa użytkownika: %3 - AutomatedRssDownloader - + Save to: Pobierz do: @@ -861,817 +658,680 @@ Pobieranie z RSS - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - Automatyczne pobieranie torrentów RSS jest teraz wyłączone! Możesz włączyć je w ustawieniach aplikacji. + + Enable Automated RSS Downloader + Włącz automatyczne pobieranie z RSS - + Download Rules Reguły pobierania - + Rule Definition Definicja reguły - + Use Regular Expressions Używaj wyrażeń regularnych - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - Inteligentny filtr odcinków sprawdzi numer odcinka, aby zapobiec pobieraniu duplikatów. -Obsługuje formaty: S01E01, 1x1, 2017.01.01 oraz 01.01.2017 (Formaty daty również obsługiwane - jako separator) - - - - Use Smart Episode Filter - Użyj inteligentnego filtra odcinków - - - + Must Contain: Musi zawierać: - + Must Not Contain: Nie może zawierać: - + Episode Filter: Filtr odcinków: - + Assign Category: Przypisz kategorię: - + Save to a Different Directory Zapisz do innego katalogu - + Ignore Subsequent Matches for (0 to Disable) ... X days Ignoruj kolejne dopasowania (0, aby wyłączyć) - + Disabled - Wyłączone + Wyłączone - + days - dni + dni - + Add Paused: Dodaj wstrzymane: - + Use global settings Użyj ustawień globalnych - + Always Zawsze - + Never Nigdy - + Apply Rule to Feeds: Zastosuj regułę do kanałów: - + Matching RSS Articles Pasujące wpisy RSS - + &Import... &Importuj... - + &Export... &Eksportuj... - + Matches articles based on episode filter. Dopasowane artykuły na podstawie filtra epizodów. - + Example: - Przykład: + Przykład: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match - dopasuje 2, 5, 8, poprzez 15, 30 oraz dalsze odcinki pierwszego sezonu + dopasuje 2, 5, 8, poprzez 15, 30 oraz dalsze odcinki pierwszego sezonu - + Episode filter rules: - Reguły filra odcinków: + Reguły filra odcinków: - + Season number is a mandatory non-zero value Numer sezonu jest obowiązkową wartością niezerową - + Episode number is a mandatory non-zero value + Numer odcinka jest obowiązkową wartością niezerową + + + Filter must end with semicolon Filtr musi być zakończony średnikiem - + Three range types for episodes are supported: - Obsługiwane są trzy rodzaje zakresu odcinków: + Obsługiwane są trzy rodzaje zakresu odcinków: - + Single number: <b>1x25;</b> matches episode 25 of season one Liczba pojedyncza: <b>1x25;</b> dopasuje odcinek 25 sezonu pierwszego - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Zwykły zakres: <b>1x25-40;</b> dopasuje odcinki 25 do 40 sezonu pierwszego - - Episode number is a mandatory positive value - Numer odcinka jest obowiązkową wartością dodatnią - - - - Rules - Reguły + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Nieskończony zakres: <b>1x25-;</b> dopasuje odcinki 25 i wzwyż sezonu pierwszego - - Rules (legacy) - Reguły (przestarzałe) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Nieskończony zakres: <b>1x25-;</b> dopasuje odcinki 25 i wzwyż sezonu pierwszego, a także wszystkie odcinki późniejszych sezonów + - + Last Match: %1 days ago Ostatni pasujący: %1 dni temu - + Last Match: Unknown Ostatni pasujący: nieznany - + New rule name Nazwa nowej reguły - + Please type the name of the new download rule. Wprowadź nazwę dla tworzonej reguły. - - + + Rule name conflict Konflikt nazw reguł - - + + A rule with this name already exists, please choose another name. Reguła o wybranej nazwie już istnieje. Wybierz inną. - + Are you sure you want to remove the download rule named '%1'? Czy na pewno usunąć regułę pobierania o nazwie %1? - + Are you sure you want to remove the selected download rules? Czy na pewno usunąć wybrane reguły pobierania? - + Rule deletion confirmation Usuwanie reguły - + Destination directory Wybierz katalog docelowy - + Invalid action Nieprawidłowa operacja - + The list is empty, there is nothing to export. Lista jest pusta, nie ma czego eksportować. - - Export RSS rules - Eksportuj reguły RSS + + Where would you like to save the list? + Gdzie chcesz zapisać listę? - - + + Rules list (*.rssrules) + Lista reguł (*.rssrules) + + + I/O Error Błąd we/wy - - Failed to create the destination file. Reason: %1 - Nie udało się utworzyć pliku docelowego. Powód: %1 + + Failed to create the destination file + Błąd podczas tworzenia pliku docelowego - - Import RSS rules - Importuj reguły RSS + + Please point to the RSS download rules file + Wskaż położenie pliku reguł do zaimportowania - - Failed to open the file. Reason: %1 - Nie udało się otworzyć pliku. Powód: %1 + + Rules list + Lista reguł - + Import Error Błąd podczas importowania - - Failed to import the selected rules file. Reason: %1 - Nie udało się zaimportować wybranego pliku reguł. Powód: %1 + + Failed to import the selected rules file + Nie udało się zaimportować wybranego pliku reguł - + Add new rule... Dodaj nową... - + Delete rule Usuń - + Rename rule... Zmień nazwę... - + Delete selected rules Usuń wybrane - - Clear downloaded episodes... - Wyczyść pobrane odcinki... - - - + Rule renaming Zmiana nazwy - + Please type the new rule name Podaj nową nazwę reguły - - Clear downloaded episodes - Wyczyść pobrane odcinki - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - Czy na pewno chcesz wyczyścić listę pobranych odcinków dla wybranej reguły? - - - - Regex mode: use Perl-compatible regular expressions - Tryb regex: używaj wyrażeń regularnych zgodnych z Perl - - - - - Position %1: %2 - Pozycja %1: %2 + + Regex mode: use Perl-like regular expressions + Tryb regex: używaj wyrażeń regularnych w stylu Perl - + Wildcard mode: you can use - Tryb wieloznaczny: można używać + - + ? to match any single character - ? do dopasowania dowolnego pojedynczego znaku + - + * to match zero or more of any characters - * do dopasowania zera lub więcej dowolnych znaków + - + Whitespaces count as AND operators (all words, any order) - Odstępy traktowane są jako operatory AND (wszystkie słowa, dowolna kolejność) + - + | is used as OR operator - | jest użyty jako operator OR + - + If word order is important use * instead of whitespace. - Jeśli kolejność słów jest ważna, użyj * zamiast odstępu. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Wyrażenie z pustą %1 klauzulą (np. %2) + - + will match all articles. - będzie pasować do wszystkich artykułów. + - + will exclude all articles. - wykluczy wszystkie artykuły. - - - - BanListOptionsDialog - - - List of banned IP addresses - Lista zbanowanych adresów IP - - - - Ban IP - Zbanuj IP - - - - Delete - Usuń - - - - - Warning - Ostrzeżenie + - - The entered IP address is invalid. - Wprowadzony adres IP jest nieprawidłowy. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Tryb wzorca: można użyć <ul><li>? dla dowolnego pojedynczego znaku</li><li>* dla dowolnej ilości znaków</li><li>Białe znaki są traktowane jako operatory AND</li></ul> - - The entered IP is already banned. - Wprowadzony adres IP jest już zablokowany. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Tryb wzorca: można użyć <ul><li>? dla dowolnego pojedynczego znaku</li><li>* dla dowolnej ilości znaków</li><li>Białe znaki są traktowane jako operatory OR</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support Zmiana statusu PeX wymaga ponownego uruchomienia - - Could not get GUID of configured network interface. Binding to IP %1 - Nie udało się uzyskać GUID skonfigurowanego interfejsu sieciowego. Wiązanie z IP %1 - - - + Embedded Tracker [ON] Wbudowany tracker [WŁ] - + Failed to start the embedded tracker! Nie udało się uruchomić wbudowanego trackera! - + Embedded Tracker [OFF] Wbudowany tracker [WYŁ] - + + '%1' reached the maximum ratio you set. Removing... + %1' osiągnął ustalony współczynnik udziału. Usuwanie... + + + + '%1' reached the maximum ratio you set. Pausing... + %1' osiągnął ustalony współczynnik udziału. Wstrzymywanie... + + + System network status changed to %1 e.g: System network status changed to ONLINE Stan sieci systemu zmieniono na %1 - + ONLINE ONLINE - + OFFLINE OFFLINE - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding Konfiguracja sieci %1 uległa zmianie, odświeżanie powiązania sesji - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. Skonfigurowany interfejs sieciowy %1 jest nieprawidłowy. - - + Encryption support [%1] Obsługa szyfrowania [%1] - - + FORCED WYMUSZONE - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 nie jest prawidłowym adresem IP i został odrzucony podczas stosowania listy zablokowanych adresów. - - - - + Anonymous mode [%1] Tryb anonimowy [%1] - + Unable to decode '%1' torrent file. Nie można odszyfrować pliku torrent: '%1'. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Rekurencyjne pobieranie pliku '%1' osadzonego w pliku torrent '%2' - + Queue positions were corrected in %1 resume files - Pozycje kolejki zostały skorygowane w %1 wznowionych plikach + - + Couldn't save '%1.torrent' Nie można zapisać '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' usunięto z listy transferów. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' usunięto z listy transferów i twardego dysku. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '%1' usunięto z listy transferów, ale pliki nie mogły zostać usunięte. Błąd: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. ponieważ %1 jest wyłączone. - + because %1 is disabled. this peer was blocked because TCP is disabled. ponieważ %1 jest wyłączone. - + URL seed lookup failed for URL: '%1', message: %2 Błąd wyszukiwania URL seeda dla adresu '%1', komunikat: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent napotkał błąd podczas nasłuchu interfejsu sieciowego %1 port: %2/%3. Powód: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + %1' usunięto z listy transferów i twardego dysku. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' usunięto z listy transferów. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Pobieranie '%1', proszę czekać... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent próbuje nasłuchiwać dowolnego portu interfejsu: %1 - + The network interface defined is invalid: %1 Podany interfejs sieciowy jest nieprawidłowy: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent próbuje nasłuchiwać interfejsu %1 port: %2 - - Peer ID: - Identyfikator partnera: - - - - HTTP User-Agent is '%1' - Klient użytkownika HTTP to '%1' - - - - + DHT support [%1] Obsługa DHT [%1] - - - - - - - - - + + + + ON WŁ. - - - - - - - - - + + + + OFF WYŁ. - - + Local Peer Discovery support [%1] Obsługa wykrywania partnerów w sieci lokalnej [%1] - - PeX support [%1] - Obsługa PeX [%1] - - - - '%1' reached the maximum ratio you set. Removed. - %1' osiągnął ustalony współczynnik udziału. Usunięto. + Restart is required to toggle Tracker Exchange support + Ponowne uruchomienie jest wymagane, aby przełączyć obsługę wymiany trackerów - - '%1' reached the maximum ratio you set. Paused. - %1' osiągnął ustalony współczynnik udziału. Wstrzymano. - - - - '%1' reached the maximum seeding time you set. Removed. - %1' osiągnął ustalony współczynnik seedowania. Usunięto. - - - - '%1' reached the maximum seeding time you set. Paused. - %1' osiągnął ustalony współczynnik seedowania. Wstrzymano. - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent nie znalazł żadnego %1 lokalnego adresu, na którym można nasłuchiwać - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent napotkał błąd podczas nasłuchu interfejsu sieciowego port: %1. Powód: %2. - + Tracker '%1' was added to torrent '%2' Tracker '%1' został dodany do torrenta '%2' - + Tracker '%1' was deleted from torrent '%2' Tracker '%1' został usunięty z torrenta '%2' - + URL seed '%1' was added to torrent '%2' URL seeda '%1' został dodany do torrenta '%2' - + URL seed '%1' was removed from torrent '%2' URL seeda '%1' został usunięty z torrenta '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. - Nie można wznowić torrenta: '%1'. + Nie można wznowić torrenta: '%1' - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Pomyślnie przetworzono podany filtr IP: zastosowano %1 reguł. - + Error: Failed to parse the provided IP filter. Błąd: nie udało się przetworzyć podanego filtra IP. - - '%1' restored. - 'torrent name' restored. - Przywrócono '%1'. - - - + Couldn't add torrent. Reason: %1 Nie można dodać torrenta. Powód: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' wznowiony (szybkie wznawianie). + + + '%1' added to download list. 'torrent name' was added to download list. '%1' dodano do listy pobierania. - + An I/O error occurred, '%1' paused. %2 Wystąpił błąd we/wy, '%1' wstrzymany. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: błąd mapowania portu, komunikat %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: udane mapowanie portu, komunikat %1 - + due to IP filter. this peer was blocked due to ip filter. z powodu filtru IP. - + due to port filter. this peer was blocked due to port filter. z powodu filtru portu. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. z powodu ograniczeń trybu mieszanego i2p. - + because it has a low port. this peer was blocked because it has a low port. ponieważ ma niski port. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent skutecznie nasłuchuje interfejs sieciowy %1 port: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 Zewnętrzne IP: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - utworzenie nowego pliku torrent nie powiodło się - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - Pobierz najpierw część pierwszą i ostatnią: %1, torrent: '%2' - - - - On - Wł. - - - - Off - Wył. - - - - Successfully moved torrent: %1. New path: %2 - Pomyślnie przeniesiono torrent: %1. Nowa ścieżka: %2 - - - + Could not move torrent: '%1'. Reason: %2 - Nie można przenieść torrenta: '%1'. Powód: %2 + Nie można przenieść: '%1'. Powód: %2 - + File sizes mismatch for torrent '%1', pausing it. Błędny rozmiar pliku z torrenta '%1', wstrzymuję pobieranie. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... Szybkie wznowienie pobierania zostało odrzucone dla torrenta '%1'. Powód: %2. Ponowne sprawdzanie... @@ -1679,19 +1339,19 @@ CategoryFilterModel - + Categories - Kategorie + Kategorie - + All - Wszystkie + Wszystkie - + Uncategorized - Bez kategorii + @@ -1699,42 +1359,147 @@ Add category... - Dodaj kategorię... + Dodaj kategorię... Add subcategory... - Dodaj podkategorię... + - Edit category... - Edytuj kategorię... + Remove category + Usuń kategorię + + + + Remove unused categories + Usuń nieużywane kategorie + + + + Resume torrents + Wznów torrenty + + + + Pause torrents + Wstrzymaj torrenty + + + + Delete torrents + Usuń torrenty + + + + New Category + Nowa kategoria + + + + Category: + Kategoria: + + + + Invalid category name + Nieprawidłowa nazwa kategorii + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Nazwa kategorii nie może zawierać '\'. +Nazwa kategorii nie może się rozpoczynać/kończyć '/'. +Nazwa kategorii nie może zawierać sekwencji '//'. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Wszystkie (0) + + + Uncategorized (0) + Bez kategorii (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Bez kategorii (%1) + + + Add category... + Dodaj kategorię... - Remove category - Usuń kategorię + Usuń kategorię - Remove unused categories - Usuń nieużywane kategorie + Usuń nieużywane kategorie - Resume torrents - Wznów torrenty + Wznów torrenty - Pause torrents - Wstrzymaj torrenty + Wstrzymaj torrenty - Delete torrents - Usuń torrenty + Usuń torrenty + + + New Category + Nowa kategoria + + + Category: + Kategoria: + + + Invalid category name + Nieprawidłowa nazwa kategorii + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Nazwa kategorii nie może zawierać '\'. +Nazwa kategorii nie może się rozpoczynać/kończyć '/'. +Nazwa kategorii nie może zawierać sekwencji '//'. + + + All (%1) + this is for the category filter + Wszystkie (%1) @@ -1742,7 +1507,7 @@ Manage Cookies - Zarządzaj ciasteczkami + Zarządzaj ciasteczkami... @@ -1774,106 +1539,58 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Potwierdzenie usuwania - - - - Remember choice - Zapamiętaj wybór - - - - Also delete the files on the hard disk - Usuń także dane z twardego dysku - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? Czy na pewno chcesz usunąć '%1' z listy transferów? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - Czy na pewno usunąć te torrenty (w sumie: %1) z listy transferów? - - - - DownloadFromURLDialog - - - Download from URLs - Pobierz z adresów URL - - - - Add torrent links - Dodaj odnośniki do plików torrent - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - Jeden odnośnik na wiersz (dozwolone są odnośniki HTTP, Magnet oraz info-hash) - - - - Download - Pobierz - - - - No URL entered - Nie wprowadzono adresu URL - - - - Please type at least one URL. - Proszę podać przynajmniej jeden adres URL. + Czy na pewno usunąć te %1 torrenty z listy transferów? DownloadedPiecesBar - + White: Missing pieces Biały: brakujące części - + Green: Partial pieces Zielony: cząstkowe części - + Blue: Completed pieces Niebieski: ukończone części - ExecutionLogWidget + ExecutionLog - + General - Główny + Ogólne - + Blocked IPs Zablokowane IP - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked <font color='red'>%1</font> został zablokowany %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned <font color='red'>%1</font> został zbanowany @@ -1882,509 +1599,514 @@ FeedListWidget - + RSS feeds Kanały RSS - - - Unread (%1) - Nieprzeczytane (%1) + + Unread + Nieprzeczytane FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - Wystąpił błąd dostępu podczas próby otwarcia pliku dziennika. Rejestrowanie do pliku jest wyłączone. - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - &Przeglądaj... - - - - Choose a file - Caption for file open/save dialog - Wybierz plik - - - - Choose a folder - Caption for directory open dialog - Wybierz folder - - - - Any file - Dowolny plik + + An error occured while trying to open the log file. Logging to file is disabled. + Wystąpił błąd dostępu podczas próby otworzenia pliku dziennika. Rejestrowanie do pliku jest wyłączone. FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. + + + + I/O Error: Could not open ip filter file in read mode. Błąd we/wy: nie można otworzyć pliku filtra IP w trybie odczytu. - - - - IP filter line %1 is malformed. - Wiersz %1 filtra IP jest nieprawidłowy. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - Wiersz %1 filtra IP jest nieprawidłowy. Początkowy IP zakresu jest nieprawidłowy. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - Wiersz %1 filtra IP jest nieprawidłowy. Końcowy IP zakresu jest nieprawidłowy. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - Wiersz %1 filtra IP jest nieprawidłowy. Jeden IP to IPv4, a drugi to IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - Wyrzucono wyjątek w filtrze IP dla linii %1. Wyjątek to: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - Wystąpiły %1 dodatkowe błędy przetwarzania filtra IP. - - - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. - Błąd przetwarzania: plik filtra nie jest prawidłowym plikiem PeerGuardian P2B. + Błąd parsowania: plik filtru nie jest prawidłowym plikiem PeerGuardian P2B. GeoIPDatabase - - + + Unsupported database file size. Nieobsługiwany rozmiar pliku bazy danych. - + Metadata error: '%1' entry not found. Błąd metadanych: wpis '%1' nieodnaleziony. - + Metadata error: '%1' entry has invalid type. Błąd metadanych: wpis '%1' jest nieprawidłowy. - + Unsupported database version: %1.%2 Nieobsługiwana wersja bazy danych: %1.%2 - + Unsupported IP version: %1 Nieobsługiwana wersja IP: %1 - + Unsupported record size: %1 Nieobsługiwany rozmiar rekordu: %1 - + Invalid database type: %1 Nieprawidłowy typ bazy danych: %1 - + Database corrupted: no data section found. Uszkodzona baza danych: nie odnaleziono sekcji danych. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - Rozmiar żądania HTTP przekracza ograniczenie, zamykam gniazdo. Limit: %ld, IP: %s + + File + Plik - - Bad Http request, closing socket. IP: %s - Złe żądanie HTTP, zamykam gniazdo. IP: %s + + Edit + Edycja - - - HttpServer - + + Help + Pomoc + + + Exit qBittorrent Zakończ qBittorrent - + Only one link per line W jednym wierszu można podać tylko jeden odnośnik - + + Download + Pobierz + + + Global upload rate limit must be greater than 0 or disabled. Ogólny limit prędkości wysyłania musi być większy od 0 lub wyłączony. - + Global download rate limit must be greater than 0 or disabled. Ogólny limit prędkości pobierania musi być większy od 0 lub wyłączony. - + Alternative upload rate limit must be greater than 0 or disabled. Alternatywny limit prędkości wysyłania musi być większy niż 0 albo wyłączony. - + Alternative download rate limit must be greater than 0 or disabled. Alternatywny limit prędkości pobierania musi być większy niż 0 albo wyłączony. - + Maximum active downloads must be greater than -1. Maksymalna liczba aktywnych pobierań musi być większa niż -1. - + Maximum active uploads must be greater than -1. Maksymalna liczba aktywnych wysyłań musi być większa niż -1. - + Maximum active torrents must be greater than -1. Maksymalna liczba aktywnych torrentów musi być większa niż -1. - + Maximum number of connections limit must be greater than 0 or disabled. Limit połączeń musi być większy od 0 lub wyłączony. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Limit połączeń dla pliku torrent musi być większy od 0 lub wyłączony. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Limit slotów wysyłania dla pliku torrent musi być większy od 0 lub wyłączony. - + Unable to save program preferences, qBittorrent is probably unreachable. Nie można zapisać ustawień, prawdopodobnie qBittorrent jest nieosiągalny. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent w sieci Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - Nieprawidłowa nazwa kategorii: -Nie należy używać żadnych znaków specjalnych w nazwie kategorii. + + Language + Język - - Unknown - Nieznany + + The port used for incoming connections must be between 1 and 65535. + Port, na którym nasłuchiwane są połączenia przychodzące, musi być pomiędzy 1 a 65535. - - Hard Disk - Dysk twardy + + The port used for the Web UI must be between 1 and 65535. + Port, na którym działa interfejs WWW, musi być pomiędzy 1 a 65535. - - Share ratio limit must be between 0 and 9998. - Limit współczynnika udziału musi zawierać się w przedziale między 0 a 9998. + + Unable to log in, qBittorrent is probably unreachable. + Nie można się zalogować, qBittorrent jest prawdopodobnie nieosiągalny. - - Seeding time limit must be between 0 and 525600 minutes. - Limit czasu seedowania musi zawierać się w przedziale między 0 a 525600 minut. - - - - The port used for incoming connections must be between 1 and 65535. - Port, na którym nasłuchiwane są połączenia przychodzące, musi być pomiędzy 1 a 65535. - - - - The port used for the Web UI must be between 1 and 65535. - Port, na którym działa interfejs WWW, musi być pomiędzy 1 a 65535. - - - - Unable to log in, qBittorrent is probably unreachable. - Nie można się zalogować, qBittorrent jest prawdopodobnie nieosiągalny. - - - + Invalid Username or Password. Nieprawidłowa nazwa użytkownika lub hasło. - - Username - Nazwa użytkownika - - - + Password Hasło - + Login Login - + + Upload Failed! + Wysyłanie nie powiodło się! + + + Original authors Pierwotni autorzy - + + Upload limit: + Ograniczenie wysyłania: + + + + Download limit: + Ograniczanie pobierania: + + + Apply Zastosuj - + Add Dodaj - + + Category: + Kategoria: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Wyślij torrenty - + + All + Wszystkie + + + + Downloading + Pobierane + + + + Seeding + Seedowanie + + + + Completed + Ukończone + + + + Resumed + Wznowione + + + + Paused + Wstrzymane + + + + Active + Aktywne + + + + Inactive + Nieaktywne + + + Save files to location: - Zapisz pliki w położeniu: + Zapisz pliki w lokalizacji: - + Cookie: Ciasteczko: - + Type folder here - Wpisz tutaj folder + Wpisz tutaj folder - + + Run an external program on torrent completion + Uruchom zewnętrzny program po ukończeniu pobierania + + + + Enable bandwidth management (uTP) + Włącz zarządzanie pasmem (uTP) + + + + Apply rate limit to uTP connections + Stosuj limity prędkości do połączeń uTP + + + + Alternative Global Rate Limits + Alternatywne ogólne limity prędkości + + + More information Więcej informacji - + Information about certificates Informacje o certyfikatach - + Save Files to Zapisz pliki do - - Set location - Ustaw położenie - - - - Limit upload rate - Ogranicz prędkości wysyłania + + Watch Folder + Obserwowany folder - - Limit download rate - Ogranicz prędkości pobierania + + Default Folder + Domyślny folder - - Rename torrent - Zmień nazwę torrenta + + from + from time1 to time2 + od - - Unable to create category - + + to + from time1 to time2 + do - + Other... Save Files to: Watch Folder / Default Folder / Other... Inne... - + + Every day + Schedule the use of alternative rate limits on ... + codziennie + + + + Week days + Schedule the use of alternative rate limits on ... + dni robocze + + + + Week ends + Schedule the use of alternative rate limits on ... + weekendy + + + Monday Schedule the use of alternative rate limits on ... poniedziałek - + Tuesday Schedule the use of alternative rate limits on ... wtorek - + Wednesday Schedule the use of alternative rate limits on ... środa - + Thursday Schedule the use of alternative rate limits on ... czwartek - + Friday Schedule the use of alternative rate limits on ... piątek - + Saturday Schedule the use of alternative rate limits on ... sobota - + Sunday Schedule the use of alternative rate limits on ... niedziela - + + Downloaded + Is the file downloaded or not? + Pobrany + + + Logout Wyloguj - + + Download from URLs + Pobierz z adresów URL + + + Download Torrents from their URLs or Magnet links Pobierz torrenty z ich adresów URL albo łączy Magnet - + Upload local torrent Wyślij lokalny plik torrent - + Are you sure you want to delete the selected torrents from the transfer list? Czy na pewno usunąć wybrane pliki torrent z listy transferów? - + Save Zapisz - + qBittorrent client is not reachable Klient qBittorrent jest nieosiągalny - - qBittorrent has been shutdown. - qBittorrent został zamknięty. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Lista podsieci IP z białej listy + + HTTP Server + Serwer HTTP - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Przykład: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Obsługiwane są poniższe parametry: - - Add subnet - Dodaj podsieć + + Torrent path + Ścieżka torrenta - - Delete - Usuń + + Torrent name + Nazwa torrenta - - Error - Błąd + + qBittorrent has been shutdown. + qBittorrent został zamknięty. + + + LineEdit - - The entered subnet is invalid. - Wprowadzona podsieć jest nieprawidłowa. + + Clear the text + Wyczyść tekst LogListWidget - + Copy Kopiuj - + Clear Wyczyść @@ -2417,551 +2139,493 @@ Po ukończeniu &pobierania - + &View &Widok - + &Options... &Opcje... - + &Resume W&znów - + Torrent &Creator Kreator plików torre&nt - + Set Upload Limit... Ustaw limit wysyłania... - + Set Download Limit... Ustaw limit pobierania... - + Set Global Download Limit... Ustaw ogólny limit pobierania... - + Set Global Upload Limit... Ustaw ogólny limit wysyłania... - + Minimum Priority Minimalny priorytet - + Top Priority Najwyższy priorytet - + Decrease Priority Zmniejsz priorytet - + Increase Priority Zwiększ priorytet - - + + Alternative Speed Limits Alternatywne limity prędkości - + &Top Toolbar &Górny pasek narzędziowy - + Display Top Toolbar Wyświetlaj górny pasek narzędziowy - - Status &Bar - Pa&sek stanu - - - + S&peed in Title Bar &Prędkość na pasku tytułu - + Show Transfer Speed in Title Bar Pokaż szybkość transferu na pasku tytułu - + &RSS Reader Czytnik &RSS - + Search &Engine &Wyszukiwarka - + L&ock qBittorrent Zablo&kuj qBittorrent - + Do&nate! W&spomóż! - - Close Window - Zamknij okno - - - + R&esume All Wznów wszystki&e - + Manage Cookies... Zarządzaj ciasteczkami... - + Manage stored network cookies Zarządzaj przechowywanymi ciasteczkami sieciowymi - + Normal Messages Komunikaty zwykłe - + Information Messages Komunikaty informacyjne - + Warning Messages Komunikaty ostrzegawcze - + Critical Messages Komunikaty krytyczne - + &Log &Dziennik - + &Exit qBittorrent Zakończ &qBittorrent - + &Suspend System Wst&rzymaj system - + &Hibernate System &Hibernuj system - + S&hutdown System Zamknij syst&em - + &Disabled Wyłąc&zone - + &Statistics S&tatystyki - + Check for Updates Sprawdź aktualizacje - + Check for Program Updates Sprawdź aktualizacje programu - + &About &O programie - + &Pause &Wstrzymaj - + &Delete U&suń - + P&ause All Ws&trzymaj wszystkie - + &Add Torrent File... &Dodaj plik torrent... - + Open Otwórz - + E&xit Zak&ończ - + Open URL Otwórz URL - + &Documentation &Dokumentacja - + Lock Zablokuj - - - + + + Show Pokaż - + Check for program updates Sprawdź aktualizacje programu - + Add Torrent &Link... D&odaj łąc&ze torrenta... - + If you like qBittorrent, please donate! Jeśli lubisz qBittorrent, przekaż pieniądze! - - + Execution Log Dziennik programu - + Clear the password Wyczyść hasło - + Filter torrent list... Filtruj listę torrentów... - + &Set Password - &Ustaw hasło + &Ustaw hasło... - - Preferences - Preferencje - - - + &Clear Password Wyczyść ha&sło - + Transfers Transfery - - - qBittorrent is minimized to tray - qBittorrent jest zminimalizowany do zasobnika - - - - - - This behavior can be changed in the settings. You won't be reminded again. - To zachowanie można zmienić w ustawieniach. Nie będziesz już otrzymywać przypomnień. - - - + Torrent file association Powiązanie z plikami torrent - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent nie jest domyślnym programem do obsługi plików torrent i odnośników Magnet. Czy powiązać qBittorrent z plikami torrent i odnośnikami Magnet? - + Icons Only Tylko ikony - + Text Only Tylko tekst - + Text Alongside Icons Tekst obok ikon - + Text Under Icons Tekst pod ikonami - + Follow System Style Dopasuj do stylu systemu - - - + + + UI lock password Hasło blokady interfejsu - - - + + + Please type the UI lock password: Proszę podać hasło blokady interfejsu: - + The password should contain at least 3 characters Hasło powinno zawierać przynajmniej 3 znaki - + Password update Aktualizacja hasła - + The UI lock password has been successfully updated Pomyślnie zaktualizowano hasło blokady interfejsu - + Are you sure you want to clear the password? Czy jesteś pewien, że chcesz wyczyścić hasło? - - Use regular expressions - Używaj wyrażeń regularnych - - - + Search Szukaj - + Transfers (%1) Transfery (%1) - + Error Błąd - + Failed to add torrent: %1 Nie można dodać torrenta: %1 - + Torrent added Dodano torrent - + '%1' was added. e.g: xxx.avi was added. '%1' został dodany. - + Download completion Zakończono pobieranie - + I/O Error i.e: Input/Output Error Błąd we/wy - + Recursive download confirmation Potwierdzenie pobierania rekurencyjnego - + Yes Tak - + No Nie - + Never Nigdy - + Global Upload Speed Limit Ogólny limit wysyłania - + Global Download Speed Limit Ogólny limit pobierania - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent został zaktualizowany i konieczne jest jego ponowne uruchomienie. - - - - qBittorrent is closed to tray - qBittorrent jest zamknięty do zasobnika - - - - Some files are currently transferring. - Niektóre pliki są obecnie przenoszone. - - - - Are you sure you want to quit qBittorrent? - Czy na pewno chcesz zamknąć qBittorrent? - - - + &No &Nie - + &Yes &Tak - + &Always Yes &Zawsze tak - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - Nie można ustalić twojej wersji Pythona. Wyłączono wyszukiwarki. - - - + Old Python Interpreter Stary interpreter Pythona - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. Twoja wersja Pythona (%1) jest przestarzała. Proszę uaktualnić ją do najnowszej wersji, aby wyszukiwarki mogły działać. Minimalny wymóg: 2.7.9/3.3.0. - + qBittorrent Update Available Dostępna aktualizacja qBittorrenta - + + A new version is available. +Do you want to download %1? + Dostępna jest nowa wersja. +Czy chcesz pobrać %1? + + + Already Using the Latest qBittorrent Version Korzystasz już z najnowszej wersji qBittorrenta - + Undetermined Python version Nieokreślona wersja Pythona - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. '%1' został pobrany. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2970,158 +2634,154 @@ Powód: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? Torrent '%1' zawiera pliki torrent, czy chcesz rozpocząć ich pobieranie? - + Couldn't download file at URL '%1', reason: %2. Nie można pobrać pliku z URL: '%1', powód: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin Python odnaleziony w %1: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + Nie można ustalić twojej wersji Pythona (%1). Wyłączono wyszukiwarki. + + + + Missing Python Interpreter Nie znaleziono interpretera Pythona - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Python jest wymagany do używania wyszukiwarki, ale wygląda na to, że nie jest zainstalowany. Czy chcesz go teraz zainstalować? - + Python is required to use the search engine but it does not seem to be installed. Python jest wymagany do używania wyszukiwarki, ale wygląda na to, że nie jest zainstalowany. - - A new version is available. - Dostępna jest nowa wersja. - - - - Do you want to download %1? - Czy chcesz pobrać %1? - - - - Open changelog... - Otwórz dziennik zmian... - - - + No updates available. You are already using the latest version. Nie ma dostępnych aktualizacji. Korzystasz już z najnowszej wersji. - + &Check for Updates S&prawdź aktualizacje - + Checking for Updates... Sprawdzanie aktualizacji... - + Already checking for program updates in the background Trwa sprawdzanie aktualizacji w tle - + Python found in '%1' Python odnaleziony w '%1' - + Download error Błąd pobierania - + Python setup could not be downloaded, reason: %1. Please install it manually. Nie można pobrać instalatora Pythona z powodu %1 . Należy zainstalować go ręcznie. - - + + Invalid password Nieprawidłowe hasło - - - + + RSS (%1) RSS (%1) - + URL download error Błąd pobierania adresu URL - + The password is invalid Podane hasło jest nieprawidłowe - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Pobieranie: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Wysyłanie: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [P: %1, W: %2] qBittorrent %3 - + Hide Ukryj - + Exiting qBittorrent Zamykanie qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Aktualnie trwa pobieranie plików. +Czy na pewno zamknąć qBittorrent? + + + Open Torrent Files Otwórz pliki torrent - + Torrent Files Pliki .torrent - + Options were saved successfully. Ustawienia pomyślnie zapisane. @@ -3129,52 +2789,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. Pomyślnie zaktualizowano twój dynamiczny DNS. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Błąd dynamicznego DNS: usługa tymczasowo niedostępna, ponowienie za 30 minut. - + Dynamic DNS error: hostname supplied does not exist under specified account. Błąd dynamicznego DNS: wskazane konto nie zawiera podanej nazwy hosta. - + Dynamic DNS error: Invalid username/password. Błąd dynamicznego DNS: nieprawidłowa nazwa użytkownika i/lub hasło. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Błąd dynamicznego DNS: usługa dodała program qBittorrent do czarnej listy; zgłoś błąd na stronie http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Błąd dynamicznego DNS: usługa zwróciła: %1; zgłoś błąd na stronie http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Błąd dynamicznego DNS: z powodu nadużycia nazwa użytkownika została zablokowana. - + Dynamic DNS error: supplied domain name is invalid. Błąd dynamicznego DNS: podana nazwa domeny jest nieprawidłowa. - + Dynamic DNS error: supplied username is too short. Błąd dynamicznego DNS: podana nazwa użytkownika jest zbyt krótka. - + Dynamic DNS error: supplied password is too short. Błąd dynamicznego DNS: podane hasło jest zbyt krótkie. @@ -3182,1413 +2842,1303 @@ Net::DownloadHandler - + I/O Error Błąd we/wy - + The file size is %1. It exceeds the download limit of %2. - Rozmiar pliku to %1. Przekracza to limit pobierania %2. + Rozmiar pliku to %1. Przekracza to ograniczenie pobierania %2. - + Unexpected redirect to magnet URI. Nieoczekiwane przekierowanie do adresu URL magnet. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - Nie odnaleziono nazwy zdalnego hosta (nieprawidłowa nazwa hosta) + + + GeoIP database loaded. Type: %1. Build time: %2. + Załadowano bazę danych GeoIP. Typ: %1. Czas budowy: %2. - - The operation was canceled - Operacja została anulowana + + + Couldn't load GeoIP database. Reason: %1 + Nie można załadować bazy danych GeoIP. Powód: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - Zdalny serwer przedwcześnie zakończył połączenie, zanim otrzymano i przetworzono odpowiedź + + Venezuela, Bolivarian Republic of + Wenezuela, Boliwariańska Republika - - The connection to the remote server timed out - Przekroczono czas oczekiwania na połącznie ze zdalnym serwerem + + Viet Nam + Wietnam - - SSL/TLS handshake failed - Próba negocjacji połączenia SSL/TLS nie powiodła się + + + N/A + Nie dotyczy - - The remote server refused the connection - Zdalny serwer odrzucił połączenie + + Andorra + Andora - - The connection to the proxy server was refused - Połączenie z serwerem proxy zostało odrzucone - - - - The proxy server closed the connection prematurely - Serwer proxy przedwcześnie zakończył połączenie - - - - The proxy host name was not found - Nie znaleziono nazwy hosta serwera proxy - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - Przekroczono czas oczekiwania na połączenie z serwerem proxy lub serwer nie odpowiedział na czas - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - Serwer proxy wymaga uwierzytelnienia, aby zaakceptować żądanie, lecz oferowane dane uwierzytelnienia zostały odrzucone - - - - The access to the remote content was denied (401) - Odmówiono dostępu do zdalnego zasobu (401) - - - - The operation requested on the remote content is not permitted - Żądana operacja na zdalnym zasobie nie jest dozwolona - - - - The remote content was not found at the server (404) - Nie znaleziono zdalnego zasobu na serwerze (404) - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - Zdalny serwer wymaga uwierzytelnienia w celu dostępu do zasobu, lecz dane uwierzytelniające nie zostały zaakceptowane - - - - The Network Access API cannot honor the request because the protocol is not known - API dostępu do sieci nie może zaakceptować żądania, ponieważ protokół jest nieznany - - - - The requested operation is invalid for this protocol - Żądana operacja jest nieprawidłowa dla tego protokołu - - - - An unknown network-related error was detected - Wykryto nieznany błąd związany z siecią - - - - An unknown proxy-related error was detected - Wykryto nieznany błąd związany z proxy - - - - An unknown error related to the remote content was detected - Wykryto nieznany błąd związany ze zdalną zawartością - - - - A breakdown in protocol was detected - Wykryto awarię protokołu - - - - Unknown error - Nieznany błąd - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - Załadowano bazę danych GeoIP. Typ: %1. Czas budowy: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - Nie można załadować bazy danych GeoIP. Powód: %1 - - - - Venezuela, Bolivarian Republic of - Wenezuela, Boliwariańska Republika - - - - Viet Nam - Wietnam - - - - - N/A - Nie dotyczy - - - - Andorra - Andora - - - + United Arab Emirates Zjednoczone Emiraty Arabskie - + Afghanistan Afganistan - + Antigua and Barbuda Antigua i Barbuda - + Anguilla Anguilla - + Albania Albania - + Armenia Armenia - + Angola Angola - + Antarctica Antarktyda - + Argentina Argentyna - + American Samoa Samoa Amerykańskie - + Austria Austria - + Australia Australia - + Aruba Aruba - + Azerbaijan Azerbejdżan - + Bosnia and Herzegovina Bośnia i Hercegowina - + Barbados Barbados - + Bangladesh Bangladesz - + Belgium Belgia - + Burkina Faso Burkina Faso - + Bulgaria Bułgaria - + Bahrain Bahrajn - + Burundi Burundi - + Benin Benin - + Bermuda Bermudy - + Brunei Darussalam Brunei - + Brazil Brazylia - + Bahamas Bahamy - + Bhutan Bhutan - + Bouvet Island Wyspa Bouveta - + Botswana Botswana - + Belarus Białoruś - + Belize Belize - + Canada Kanada - + Cocos (Keeling) Islands Wyspy Kokosowe (Keelinga) - + Congo, The Democratic Republic of the Demokratyczna Republika Konga - + Central African Republic Republika Środkowoafrykańska - + Congo Kongo - + Switzerland Szwajcaria - + Cook Islands Wyspy Cooka - + Chile Chile - + Cameroon Kamerun - + China Chiny - + Colombia - Kolumbia + Kolumbia - + Costa Rica Kostaryka - + Cuba Kuba - + Cape Verde Republika Zielonego Przylądka - + Curacao Curacao - + Christmas Island Wyspa Bożego Narodzenia - + Cyprus Cypr - + Czech Republic Czechy - + Germany Niemcy - + Djibouti Dżibuti - + Denmark Dania - + Dominica Dominika - + Dominican Republic Dominikana - + Algeria Algieria - + Ecuador Ekwador - + Estonia Estonia - + Egypt Egipt - + Western Sahara Sahara Zachodnia - + Eritrea Erytrea - + Spain Hiszpania - + Ethiopia Etiopia - + Finland Finlandia - + Fiji Fidżi - + Falkland Islands (Malvinas) Falklandy (Malwiny) - + Micronesia, Federated States of Mikronezja - + Faroe Islands Wyspy Owcze - + France Francja - + Gabon Gabon - + United Kingdom Wielka Brytania - + Grenada Grenada - + Georgia Gruzja - + French Guiana Gujana Francuska - + Ghana Ghana - + Gibraltar Gibraltar - + Greenland Grenlandia - + Gambia Gambia - + Guinea Gwinea - + Guadeloupe Gwadelupa - + Equatorial Guinea Gwinea Równikowa - + Greece Grecja - + South Georgia and the South Sandwich Islands Georgia Południowa i Sandwich Południowy - + Guatemala Gwatemala - + Guam Guam - + Guinea-Bissau Gwinea Bissau - + Guyana Gujana - + Hong Kong Hongkong - + Heard Island and McDonald Islands Wyspy Heard i McDonalda - + Honduras Honduras - + Croatia Chorwacja - + Haiti Haiti - + Hungary Węgry - + Indonesia Indonezja - + Ireland Irlandia - + Israel Izrael - + India Indie - + British Indian Ocean Territory Brytyjskie Terytorium Oceanu Indyjskiego - + Iraq Irak - + Iran, Islamic Republic of Iran - + Iceland Islandia - + Italy Włochy - + Jamaica Jamajka - + Jordan Jordania - + Japan Japonia - + Kenya Kenia - + Kyrgyzstan Kirgistan - + Cambodia Kambodża - + Kiribati Kiribati - + Comoros Komory - + Saint Kitts and Nevis Saint Kitts i Nevis - + Korea, Democratic People's Republic of Korea Północna - + Korea, Republic of Korea Południowa - + Kuwait Kuwejt - + Cayman Islands Kajmany - + Kazakhstan Kazachstan - + Lao People's Democratic Republic Laos - + Lebanon Liban - + Saint Lucia Saint Lucia - + Liechtenstein Liechtenstein - + Sri Lanka Sri Lanka - + Liberia Liberia - + Lesotho Lesotho - + Lithuania Litwa - + Luxembourg Luksemburg - + Latvia Łotwa - + Morocco Maroko - + Monaco Monako - + Moldova, Republic of Mołdawia - + Madagascar Madagaskar - + Marshall Islands Wyspy Marshalla - + Mali Mali - + Myanmar Mjanma - + Mongolia Mongolia - + Northern Mariana Islands Mariany Północne - + Martinique Martynika - + Mauritania Mauretania - + Montserrat Montserrat - + Malta Malta - + Mauritius Mauritius - + Maldives Malediwy - + Malawi Malawi - + Mexico Meksyk - + Malaysia Malezja - + Mozambique Mozambik - + Namibia Namibia - + New Caledonia Nowa Kaledonia - + Niger Niger - + Norfolk Island Norfolk - + Nigeria Nigeria - + Nicaragua Nikaragua - + Netherlands Holandia - + Norway Norwegia - + Nepal Nepal - + Nauru Nauru - + Niue Niue - + New Zealand Nowa Zelandia - + Oman Oman - + Panama Panama - + Peru Peru - + French Polynesia Polinezja Francuska - + Papua New Guinea Papua-Nowa Gwinea - + Philippines Filipiny - + Pakistan Pakistan - + Poland Polska - + Saint Pierre and Miquelon Saint-Pierre i Miquelon - + Puerto Rico Portoryko - + Portugal Portugalia - + Palau Palau - + Paraguay Paragwaj - + Qatar Katar - + Reunion Reunion - + Romania Rumunia - + Russian Federation Rosja - + Rwanda Rwanda - + Saudi Arabia Arabia Saudyjska - + Solomon Islands Wyspy Salomona - + Seychelles Seszele - + Sudan Sudan - + Sweden Szwecja - + Singapore Singapur - + Slovenia Słowenia - + Svalbard and Jan Mayen Svalbard i Jan Mayen - + Slovakia Słowacja - + Sierra Leone Sierra Leone - + San Marino San Marino - + Senegal Senegal - + Somalia Somalia - + Suriname Surinam - + Sao Tome and Principe Wyspy Świętego Tomasza i Książęca - + El Salvador Salwador - + Syrian Arab Republic Syria - + Swaziland Suazi - + Turks and Caicos Islands Turks i Caicos - + Chad Czad - + French Southern Territories Francuskie Terytoria Południowe i Antarktyczne - + Togo Togo - + Thailand Tajlandia - + Tajikistan Tadżykistan - + Tokelau Tokelau - + Turkmenistan Turkmenistan - + Tunisia Tunezja - + Tonga Tonga - - Could not decompress GeoIP database file. - Nie mozna rozpakować pliku bazy danych GeoIP. - - - + Timor-Leste Timor Wschodni - + Bolivia, Plurinational State of Boliwia, Wielonarodowe Państwo - + Bonaire, Sint Eustatius and Saba - Bonaire, Sint Eustatius i Saba + Bonaire, Sint Eustatius i Saba - + Cote d'Ivoire Wybrzeże Kości Słoniowej - + Libya Libia - + Saint Martin (French part) Sint Maarten (część francuska) - + Macedonia, The Former Yugoslav Republic of Macedonia, Była Jugosłowiańska Republika - + Macao Makau - + Pitcairn Pitcairn - + Palestine, State of Palestyna, Państwo - + Saint Helena, Ascension and Tristan da Cunha Wyspa Świętej Heleny, Wyspa Wniebowstąpienia i Tristan da Cunha - + South Sudan Sudan Południowy - + Sint Maarten (Dutch part) Sint Maarten (część holenderska) - + Turkey Turcja - + Trinidad and Tobago Trynidad i Tobago - + Tuvalu Tuvalu - + Taiwan Tajwan - + Tanzania, United Republic of Tanzania - + Ukraine Ukraina - + Uganda Uganda - + United States Minor Outlying Islands Dalekie Wyspy Mniejsze Stanów Zjednoczonych - + United States Stany Zjednoczone - + Uruguay Urugwaj - + Uzbekistan Uzbekistan - + Holy See (Vatican City State) Stolica Apostolska (Watykan) - + Saint Vincent and the Grenadines Saint Vincent i Grenadyny - + Virgin Islands, British Brytyjskie Wyspy Dziewicze - + Virgin Islands, U.S. Wyspy Dziewicze Stanów Zjednoczonych - + Vanuatu Vanuatu - + Wallis and Futuna Wallis i Futuna - + Samoa Samoa - + Yemen Jemen - + Mayotte Majotta - + Serbia Serbia - + South Africa Republika Południowej Afryki - + Zambia Zambia - + Montenegro Czarnogóra - + Zimbabwe Zimbabwe - + Aland Islands Wyspy Alandzkie - + Guernsey Guernsey - + Isle of Man Wyspa Man - + Jersey Jersey - + Saint Barthelemy Saint-Barthélemy - + + Could not uncompress GeoIP database file. + Nie mozna rozpakować pliku bazy danych GeoIP. + + + Couldn't save downloaded GeoIP database file. Nie można zapisać pobranego pliku bazy danych GeoIP. - + Successfully updated GeoIP database. Pomyślnie uaktualniono bazę danych GeoIP. - + Couldn't download GeoIP database file. Reason: %1 Nie można pobrać pliku bazy danych GeoIP. Powód: %1 @@ -4596,12 +4146,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] Wsparcie UPnP / NAT-PMP [WŁ] - + UPnP / NAT-PMP support [OFF] Wsparcie UPnP / NAT-PMP [WYŁ] @@ -4609,7 +4159,7 @@ Net::Smtp - + Email Notification Error: Błąd powiadomienia e-mail: @@ -4617,1279 +4167,1077 @@ OptionsDialog - + Options Opcje - + Behavior Zachowanie - + Downloads Pobierane - + Connection Połączenie - + Speed Prędkość - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI Interfejs WWW - + Advanced Zaawansowane - + Language Język - + User Interface Language: Język interfejsu: - + (Requires restart) (Wymaga ponownego uruchomienia) - + Transfer List Lista transferów - + Confirm when deleting torrents Potwierdzaj usuwanie torrentów - + Use alternating row colors In transfer list, one every two rows will have grey background. Użyj naprzemiennego kolorowania wierszy - + Hide zero and infinity values Ukryj zerowe i nieskończone wartości - + Always Zawsze - + Paused torrents only Tylko wstrzymane torrenty - + Action on double-click - Działanie podwójnego kliknięcia + Działanie podwójnego kliknięcia: - + Downloading torrents: Pobierane torrenty: - - + + Start / Stop Torrent Uruchom / Zatrzymaj torrent - - + + Open destination folder Otwórz katalog docelowy - - + + No action Brak działania - + Completed torrents: Ukończone torrenty: - + Desktop Pulpit - + Start qBittorrent on Windows start up Uruchamiaj qBittorrent ze startem systemu Windows - + Show splash screen on start up Pokazuj ekran startowy podczas uruchamiania - + Start qBittorrent minimized Uruchamiaj qBittorrent zminimalizowany - + Confirmation on exit when torrents are active Potwierdzenie wyjścia, gdy torrenty są aktywne - + Confirmation on auto-exit when downloads finish Potwierdzenie automatycznego wyjścia, gdy pobierania zostaną ukończone - - KiB - KiB - - - - Email notification &upon download completion - Wyślij e-mail po &ukończeniu pobierania - - - - Run e&xternal program on torrent completion - Uruchom zewnętr&zny program po ukończeniu pobierania - - - - IP Fi&ltering - Filtrowa&nie IP - - - - Schedule &the use of alternative rate limits - &Harmonogram użycia alternatywnych limitów prędkości - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Więcej informacji</a>) - - - - &Torrent Queueing - K&olejkowanie torrentów - - - - Seed torrents until their seeding time reaches - Seeduj torrenty do czasu, aż czas seedowania osiągnie - - - - A&utomatically add these trackers to new downloads: - A&utomatycznie dodaj te trackery do nowych pobierań: - - - - RSS Reader - Czytnik RSS - - - - Enable fetching RSS feeds - Włącz pobieranie kanałów RSS - - - - Feeds refresh interval: - Częstotliwość odświeżania kanałów: - - - - Maximum number of articles per feed: - Maksymalna liczba wiadomości na kanał: - - - - - min - minutes - min - - - - RSS Torrent Auto Downloader - Automatyczne pobieranie torrentów RSS - - - - Enable auto downloading of RSS torrents - Włącz automatyczne pobieranie torrentów RSS - - - - Edit auto downloading rules... - Edytuj reguły automatycznego pobierania... - - - - Web User Interface (Remote control) - Interfejs WWW (zdalne zarządzanie) - - - - IP address: - Adres IP: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - Adres IP, z którym zostanie powiązany Interfejs WWW. -Ustal adres IPv4 albo IPv6. Możesz ustawić 0.0.0.0 dla adresu IPv4, -"::" dla adresu IPv6, albo "*" dla zarówno IPv4 oraz IPv6. - - - - Server domains: - Domeny serwera: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - Biała lista filtrowania wartości nagłówka hosta HTTP. -Aby uchronić się przed atakiem ponownego wiązania DNS, -należy wpisać nazwy domen używane przez serwer interfejsu WWW. - -Użyj ';' do rozdzielania wielu wpisów. Można użyć wieloznacznika '*'. - - - - &Use HTTPS instead of HTTP - &Używaj HTTPS zamiast HTTP - - - - Bypass authentication for clients on localhost - Pomiń uwierzytelnianie dla klientów lokalnego hosta - - - - Bypass authentication for clients in whitelisted IP subnets - Pomiń uwierzytelnianie dla klientów w podsieciach IP z białej listy - - - - IP subnet whitelist... - Biała lista podsieci IP... - - - - Upda&te my dynamic domain name - A&ktualizuj nazwę domeny dynamicznej + + Show qBittorrent in notification area + Pokazuj ikonę qBittorrent w obszarze powiadomień - + Minimize qBittorrent to notification area Minimalizuj qBittorrent do obszaru powiadomień - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. Zamykaj qBittorrent do obszaru powiadomień - + Tray icon style: Styl ikony w obszarze powiadomień: - + Normal Normalny - + Monochrome (Dark theme) Monochromatyczny (ciemny motyw) - + Monochrome (Light theme) Monochromatyczny (jasny motyw) - + File association Skojarzenie plików - + Use qBittorrent for .torrent files Używaj qBittorrent z plikami .torrent - + Use qBittorrent for magnet links Używaj qBittorrent z odnośnikami magnet - + Power Management Zarządzanie energią - + + Inhibit system sleep when torrents are active + Nie pozwalaj na usypianie systemu, gdy są aktywne torrenty + + + + Log file + Plik dziennika + + + Save path: Ścieżka zapisu: - + Backup the log file after: Stwórz kopię pliku dziennika po: - + + MB + MB + + + Delete backup logs older than: Usuń kopie dzienników starszych niż: - + days Delete backup logs older than 10 months dni - + months Delete backup logs older than 10 months miesiące - + years Delete backup logs older than 10 years lata - + When adding a torrent Podczas dodawania torrenta - + + Display torrent content and some options + Pokaż zawartość torrenta i kilka opcji + + + Bring torrent dialog to the front Przywołaj okno dialogowe torrenta na wierzch - + Do not start the download automatically The torrent will be added to download list in pause state Nie uruchamiaj automatycznie pobierań - + Should the .torrent file be deleted after adding it Czy plik .torrent powinien zostać usunięty po jego dodaniu - + + Delete .torrent files afterwards + Potem usuń pliki .torrent + + + Also delete .torrent files whose addition was cancelled Usuń także pliki .torrent, których dodanie zostało anulowane - + Also when addition is cancelled Także gdy dodanie zostało anulowane - + Warning! Data loss possible! Uwaga! Możliwa utrata danych! - + Saving Management Zarządzanie zapisywaniem - + Default Torrent Management Mode: Domyślny tryb zarządzania torrentem: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category Tryb automatyczny oznacza, że różne właściwości torrenta (np. ścieżka zapisu) będą ustalane przez przyporządkowaną kategorię - + Manual Ręczny - + Automatic Automatyczny - + When Torrent Category changed: Gdy zmieniono kategorię torrenta: - + Relocate torrent Przenieś torrent - + Switch torrent to Manual Mode Przełącz torrent do trybu ręcznego - + When Default Save Path changed: Gdy zmieniono domyślną ścieżkę zapisu: - - + + Relocate affected torrents Przenieś dotknięte torrenty - - + + Switch affected torrents to Manual Mode Przełącz dotknięte torrenty do trybu ręcznego - + When Category changed: Gdy zmieniono kategorię: - + Use Subcategories Użyj podkategorii - + Default Save Path: Domyślna ścieżka zapisu: - + Keep incomplete torrents in: Przechowuj niekompletne torrenty w: - + Copy .torrent files to: Kopiuj pliki .torrent do: - - Show &qBittorrent in notification area - Pokazuj ikonę &qBittorrent w obszarze powiadomień - - - - &Log file - Plik &dziennika - - - - Display &torrent content and some options - Pokaż zawartość &torrenta i kilka opcji - - - - Create subfolder for torrents with multiple files - Utwórz podfolder dla torrentów z wieloma plikami - - - - De&lete .torrent files afterwards - P&otem usuń pliki .torrent - - - + Copy .torrent files for finished downloads to: Kopiuj pliki .torrent zakończonych pobierań do: - + Pre-allocate disk space for all files Rezerwuj miejsce na dysku dla wszystkich plików - - Inhibit system sleep when torrents are downloading - Nie pozwalaj na usypianie systemu podczas pobierania torrentów - - - - Inhibit system sleep when torrents are seeding - Nie pozwalaj na usypianie systemu podczas seedowania torrentów - - - + Append .!qB extension to incomplete files Dodaj rozszerzenie .!qB do niekompletnych plików - - Enable recursive download dialog - Włącz okno dialogowe pobierania rekursywnego - - - + Automatically add torrents from: Automatycznie dodawaj torrenty z: - + Add entry Dodaj wpis - + Remove entry Usuń wpis - + + Email notification upon download completion + Wyślij powiadomienie e-mail po ukończeniu pobierania + + + + Destination email: + Docelowy adres e-mail: + + + SMTP server: Serwer SMTP: - + This server requires a secure connection (SSL) Ten serwer wymaga bezpiecznego połączenia (SSL) - - + + + Authentication Uwierzytelnianie - - - - + + + + Username: Nazwa użytkownika: - - - - + + + + Password: Hasło: - - Enabled protocol: - Włącz protokół: - - - - TCP and μTP - TCP oraz μTP + + Run external program on torrent completion + Uruchom zewnętrzny program po ukończeniu pobierania - + Listening Port Port nasłuchu - + Port used for incoming connections: Port dla połączeń przychodzących: - + Random Losowy - + Use UPnP / NAT-PMP port forwarding from my router Używaj UPnP / NAT-PMP do przekierowania portów na moim routerze - + Use different port on each startup Używaj innego portu przy każdym uruchomieniu - + Connections Limits Limit połączeń - + Maximum number of connections per torrent: Maksymalna liczba połączeń na torrent: - + Global maximum number of connections: Maksymalna liczba połączeń: - + Maximum number of upload slots per torrent: Maksymalna liczba slotów wysyłania na torrent: - + Global maximum number of upload slots: Maksymalna liczba slotów wysyłania: - + Proxy Server Serwer proxy - + Type: Typ: - + (None) (Żaden) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Host: - - + + Port: Port: - + Otherwise, the proxy server is only used for tracker connections W przeciwnym razie serwer proxy będzie używany tylko do połączeń z trackerem - + Use proxy for peer connections Używaj proxy do połączeń z partnerami - + Disable connections not supported by proxies - Wyłącz połączenia nieobsługiwane przez proxy - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Więcej informacji</a>) + Wyłącz połączenia nieobsługiwane przez proxy. - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection Kanały RSS, wyszukiwarki, aktualizacje oprogramowania albo cokolwiek innego niż transfery torrentów oraz powiązane operacje (np. wymiana partnerów) będą używać połączeń bezpośrednich - + Use proxy only for torrents Używaj proxy tylko dla torrentów - - A&uthentication - U&wierzytelnianie - - - + Info: The password is saved unencrypted Informacja: hasło jest zapisywane bez szyfrowania - + + IP Filtering + Filtrowanie IP + + + Filter path (.dat, .p2p, .p2b): Ścieżka do pliku filtra (.dat, .p2p, .p2b): - + Reload the filter Przeładuj filtr - - Manually banned IP addresses... - Ręcznie zablokowane adresy IP... - - - + Apply to trackers Zastosuj do trackerów - + Global Rate Limits Ogólne limity prędkości - - - - - - - KiB/s - KiB/s - - - - + + Upload: Wysyłanie: - - + + + + + KiB/s + KiB/s + + + + Download: Pobieranie: - + Alternative Rate Limits Alternatywne limity prędkości - - + + Schedule the use of alternative rate limits + Harmonogram użycia alternatywnych limitów prędkości + + + From: from (time1 to time2) Od: - - + To: time1 to time2 Do: - + When: Kiedy: - + Every day Codziennie - + Weekdays Dni robocze - + Weekends Weekendy - + Rate Limits Settings Ustawienia limitów prędkości - + Apply rate limit to peers on LAN Stosuj limity prędkości do partnerów w LAN - + Apply rate limit to transport overhead Stosuj limity prędkości do transferów z narzutem - - + + + Enable µTP protocol + Włącz protokół µTP + + + Apply rate limit to µTP protocol Stosuj limity prędkości do protokołu µTP - + Privacy Prywatność - + Enable DHT (decentralized network) to find more peers Włącz sieć DHT (sieć rozproszona), aby odnależć więcej partnerów - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Wymieniaj partnerów pomiędzy kompatybilnymi klientami sieci Bittorrent (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers Włącz wymianę partnerów (PeX), aby odnależć więcej partnerów - + Look for peers on your local network Wyszukuj partnerów w sieci lokalnej - + Enable Local Peer Discovery to find more peers Włącz wykrywanie partnerów w sieci lokalnej, aby znaleźć więcej partnerów - + Encryption mode: Tryb szyfrowania: - + Prefer encryption Preferuj szyfrowanie - + Require encryption Wymagaj szyfrowania - + Disable encryption Wyłącz szyfrowanie - + Enable when using a proxy or a VPN connection Włącz podczas używania proxy lub połączenia VPN - + Enable anonymous mode Włącz tryb anonimowy - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Więcej informacji</a>) + + + + Torrent Queueing + Kolejkowanie torrentów + + + Maximum active downloads: Maksymalna liczba aktywnych pobierań: - + Maximum active uploads: Maksymalna liczba aktywnych wysyłań: - + Maximum active torrents: Maksymalna liczba aktywnych torrentów: - + Do not count slow torrents in these limits Nie wliczaj powolnych torrentów do tych limitów - - Upload rate threshold: - Próg prędkości wysyłania: - - - - Download rate threshold: - Próg prędkości pobierania: - - - - sec - seconds - s - - - - Torrent inactivity timer: - Zegar bezczynności torrenta: - - - + Share Ratio Limiting - Limitowanie współczynnika udziału + Ograniczenie współczynnika udziału - + Seed torrents until their ratio reaches - Seeduj torrenty, aż współczynnik udziału osiągnie + Seeduj torrenty aż współczynnik udziału osiągnie - + then następnie - + Pause them Wstrzymaj je - + Remove them Usuń je - - RSS Smart Episode Filters - Inteligentne filtry odcinków RSS + + Automatically add these trackers to new downloads: + Automatycznie dodaj te trackery do nowych pobierań: - + + Enable Web User Interface (Remote control) + Włącz interfejs WWW (Zdalne zarządzanie) + + + Use UPnP / NAT-PMP to forward the port from my router Używaj UPnP / NAT-PMP do przekierowania portów na moim routerze - + + Use HTTPS instead of HTTP + Używaj HTTPS zamiast HTTP + + + Certificate: Certyfikat: - + Import SSL Certificate Importuj certyfikat SSL - + Key: Klucz: - + Import SSL Key Importuj klucz SSL - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Informacje o certyfikatach</a> - - Use alternative Web UI - Używaj alternatywnego interfejsu WWW - - - - Files location: - Położenie plików: - - - - Enable clickjacking protection - Włącz ochronę przed porywaniem kliknięć + + Bypass authentication for localhost + Pomiń uwierzytelnianie dla lokalnego hosta - - Enable Cross-Site Request Forgery (CSRF) protection - Włącz ochronę przed Cross-Site Request Forgery (CSRF) + + Update my dynamic domain name + Aktualizuj moją nazwę domeny dynamicznej - + Service: Usługa: - + Register Zarejestruj - + Domain name: Nazwa domeny: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! Poprzez włączenie tych opcji możesz <strong>nieodwołalnie stracić</strong> twoje pliki .torrent! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well Gdy te opcje zostaną włączone, qBittorrent <strong>usunie</strong> pliki .torrent po ich pomyślnym (pierwsza opcja) lub niepomyślnym (druga opcja) dodaniu do kolejki pobierania. Stosuje się to <strong>nie tylko</strong> do plików otwarych poprzez działanie menu &ldquo;Dodaj torrent&rdquo;, ale także do plików otwartych poprzez <strong>skojarzenie typu pliku</strong> - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog Jeżeli włączysz drugą opcję (&ldquo;Także gdy dodanie zostało anulowane&rdquo;), plik .torrent <strong>zostanie usunięty</strong> nawet po wciśnięciu &ldquo;<strong>Anuluj</strong>&rdquo; w oknie &ldquo;Dodaj torrent&rdquo; - - Choose Alternative UI files location - Wybierz położenie plików alternatywnego interfejsu. - - - + Supported parameters (case sensitive): Obsługiwane parametry (z uwzględnieniem wielkości liter): - + %N: Torrent name %N: Nazwa torrenta - + %L: Category %L: Kategoria - - %G: Tags (seperated by comma) - %G: Znaczniki (oddzielone przecinkiem) - - - + %F: Content path (same as root path for multifile torrent) %F: Ścieżka zawartości (taka sama, jak główna ścieżka dla wieloplikowych torrentów) - + %R: Root path (first torrent subdirectory path) %R: Ścieżka główna (pierwsza ścieżka podkatalogu torrenta) - + %D: Save path %D: Ścieżka zapisu - + %C: Number of files %C: Liczba plików - + %Z: Torrent size (bytes) %Z: Rozmiar torrenta (w bajtach) - + %T: Current tracker %T: Bieżący tracker - + %I: Info hash %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") Wskazówka: otocz parametr cudzysłowem, aby uniknąć odcięcia tekstu (np. "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - Torrent będzie uważany za powolny, jeśli jego szybkość pobierania i wysyłania pozostanie poniżej tych wartości sekund "Zegara bezczynności torrenta" - - - + Select folder to monitor Wybierz katalog do monitorowania - + Folder is already being monitored: Katalog jest już monitorowany: - + Folder does not exist: Katalog nie istnieje: - + Folder is not readable: Nie można odczytać katalogu: - + Adding entry failed Dodanie wpisu nie powiodło się - - - - + + Choose export directory Wybierz katalog eksportu - - - + + + + + + Choose a save directory Wybierz katalog docelowy - + Choose an IP filter file Wybierz plik filtra IP - + All supported filters Wszystkie obsługiwane filtry - + SSL Certificate Certyfikat SSL - + + SSL Key + Klucz SSL + + + Parsing error Błąd przetwarzania - + Failed to parse the provided IP filter Nie udało się przetworzyć podanego filtra IP - + Successfully refreshed Pomyślnie odświeżony - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Pomyślnie przetworzono podany filtr IP: zastosowano %1 reguł. - + Invalid key Niepoprawny klucz - + This is not a valid SSL key. To nie jest poprawny klucz SSL. - + Invalid certificate Niepoprawny certyfikat - - Preferences - Preferencje - - - - Import SSL certificate - Importuj certyfikat SSL - - - + This is not a valid SSL certificate. To nie jest poprawny certyfikat SSL. - - Import SSL key - Importuj klucz SSL - - - - SSL key - Klucz SSL - - - + Time Error Błąd ustawień harmonogramu - + The start time and the end time can't be the same. Czas uruchomienia nie może byś taki sam jak czas zakończenia. - - + + Length Error Błąd długości - + The Web UI username must be at least 3 characters long. Nazwa użytkownika interfejsu WWW musi składać się z co najmniej 3 znaków. - + The Web UI password must be at least 6 characters long. Hasło interfejsu WWW musi składać się z co najmniej 6 znaków. @@ -5897,72 +5245,72 @@ PeerInfo - - Interested(local) and Choked(peer) - Zainteresowany(lokalny) i stłumiony(partner) + + interested(local) and choked(peer) + zainteresowany(lokalny) i stłumiony(partner) - + interested(local) and unchoked(peer) zainteresowany(lokalny) i niestłumiony(partner) - + interested(peer) and choked(local) zainteresowany(partner) i stłumiony(lokalny) - + interested(peer) and unchoked(local) zainteresowany(partner) i niestłumiony(lokalny) - + optimistic unchoke niestłumienie optymistyczne - + peer snubbed ignorowany partner - + incoming connection nadchodzące połączenie - + not interested(local) and unchoked(peer) niezainteresowany(lokalny) i niestłumiony(partner) - + not interested(peer) and unchoked(local) niezainteresowany(partner) i niestłumiony(lokalny) - + peer from PEX partner z PEX - + peer from DHT partner z DHT - + encrypted traffic zaszyfrowany ruch - + encrypted handshake zaszyfrowane połączenie - + peer from LSD partner z LSD @@ -5970,180 +5318,165 @@ PeerListWidget - + IP Adres IP - + Port Port - + Flags Flagi - + Connection Połączenie - + Client i.e.: Client application Klient - + Progress i.e: % downloaded Postęp - + Down Speed i.e: Download speed Pobieranie - + Up Speed i.e: Upload speed Wysyłanie - + Downloaded i.e: total data downloaded Pobrano - + Uploaded i.e: total data uploaded Wysłano - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Trafność - + Files i.e. files that are being downloaded right now Pliki - + Column visibility Widoczność kolumy - + Add a new peer... Dodaj partnera... - - + + Ban peer permanently Blokuj partnera na stałe - + Manually adding peer '%1'... Ręczne dodawanie partnera '%1'... - + The peer '%1' could not be added to this torrent. Partner '%1' nie może zostać dodany do tego torrenta. - + Manually banning peer '%1'... Ręczne blokowanie partnera '%1'... - - + + Peer addition Dodawanie partnera - + Country Kraj - + Copy IP:port Skopiuj IP:port - + Some peers could not be added. Check the Log for details. Niektórzy partnerzy nie mogą zostać dodani. Sprawdź szczegóły w Dzienniku. - + The peers were added to this torrent. Partnerzy zostali dodani do tego torrenta. - + Are you sure you want to ban permanently the selected peers? Czy na pewno zablokować na stałe wybranych partnerów? - + &Yes &Tak - + &No &Nie - PeersAdditionDialog - - - Add Peers - Dodaj partnerów - - - - List of peers to add (one IP per line): - Lista partnerów do dodania (po jednym IP w wierszu): - - - - Format: IPv4:port / [IPv6]:port - Format: IPv4:port / [IPv6]:port - + PeersAdditionDlg - + No peer entered Nie wprowadzono partnera - + Please type at least one peer. - Proszę wpisać co najmniej jednego partnera. + Wprowadź co najmniej jednego partnera. - + Invalid peer Nieprawidłowy partner - + The peer '%1' is invalid. Partner '%1' jest nieprawidłowy. @@ -6151,12 +5484,12 @@ PieceAvailabilityBar - + White: Unavailable pieces Biały: niedostępne części - + Blue: Available pieces Niebieski: dostępne części @@ -6164,337 +5497,293 @@ PiecesBar - + Files in this piece: Pliki w tym kawałku: - + File in this piece Plik w tym kawałku - + File in these pieces Plik w tych kawałkach - - Wait until metadata become available to see detailed information - Poczekaj, aż metadane będą dostępne, aby uzyskać szczegółowe informacje - - - + Hold Shift key for detailed information Przytrzymaj klawisz Shift w celu uzyskania szczegółowych informacji - PluginSelectDialog + PluginSelectDlg - + Search plugins Wtyczki wyszukiwania - + Installed search plugins: Zainstalowane wtyczki wyszukiwania: - + Name Nazwa - + Version Wersja - + Url URL - - + + Enabled Włączone - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - Ostrzeżenie: upewnij się, że przestrzegasz praw autorskich swojego kraju podczas pobierania torrentów z każdej z tych wyszukiwarek. - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - Tutaj możesz pobrać nowe wtyczki wyszukiwania: </a>http://plugins.qbittorrent.org</a> + Tutaj możesz pobrać nowe wtyczki wyszukiwania: <a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one Zainstaluj nową - + Check for updates Sprawdź aktualizacje - + Close Zamknij - + Uninstall Odinstaluj - - - + + + Yes Tak - - - - + + + + No Nie - + Uninstall warning Ostrzeżenie dezinstalacji - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - Niektóre wtyczki nie mogą zostać odinstalowane, ponieważ są częścią qBittorenta. Tylko te, które dodałeś, mogą zostać odinstalowane. -Te wtyczki zostały wyłączone. + Niektóre wtyczki nie mogą zostać usunięte, ponieważ są częścią qBittorenta. Można usunąć tylko te własnoręcznie dodane. +Tamte wtyczki zostały wyłączone. - + Uninstall success - Dezinstalacja pomyślna + Dezinstalacja zakończona - + All selected plugins were uninstalled successfully Wszystkie wybrane wtyczki zostały pomyślnie odinstalowane - - - - - Search plugin update - Aktualizacja wtyczki wyszukiwania - - - - Plugins installed or updated: %1 - Wtyczki zainstalowane lub zaktualizowane: %1 - - - - + + New search engine plugin URL Nowy URL wtyczki wyszukiwania - - + + URL: URL: - + Invalid link Nieprawidłowy odnośnik - + The link doesn't seem to point to a search engine plugin. Odnośnik nie wydaje się wskazywać na wtyczkę wyszukiwania. - + Select search plugins - Wybierz wtyczkę wyszukiwania + Wybierz wtyczki wyszukiwania - + qBittorrent search plugin Wtyczka wyszukiwania qBittorrent - + + + + Search plugin update + Aktualizacja wtyczki wyszukiwania + + + All your plugins are already up to date. Wszystkie twoje wtyczki są aktualne. - + Sorry, couldn't check for plugin updates. %1 Niestety, nie można sprawdzić aktualizacji wtyczki. %1 - + + + Search plugin install Instalacja wtyczki wyszukiwania - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + Pomyślnie zainstalowano wtyczkę wyszukiwania "%1". + + + Couldn't install "%1" search engine plugin. %2 Nie można zainstalować wtyczki wyszukiwania "%1". %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + Pomyślnie zaktualizowano wtyczkę wyszukiwania "%1". + + + Couldn't update "%1" search engine plugin. %2 Nie można zaktualizować wtyczki wyszukiwania "%1". %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source Źródło wtyczki - + Search plugin source: Źródło wtyczki wyszukiwania: - + Local file Plik lokalny - + Web link - Łącze internetowe - - - - PowerManagement - - - qBittorrent is active - qBittorrent jest aktywny + Adres strony - PreviewSelectDialog - - - Preview - Podgląd - + PreviewSelect - + Name Nazwa - + Size Rozmiar - + Progress Postęp - - + + Preview impossible - Podgląd niemożliwy + Nie ma możliwości podglądu - - + + Sorry, we can't preview this file - Przepraszamy, podgląd pliku jest niedostępny - - - - Private::FileLineEdit - - - '%1' does not exist - '%1' nie istnieje - - - - '%1' does not point to a directory - '%1' nie wskazuje na katalog - - - - '%1' does not point to a file - '%1' nie wskazuje na plik - - - - Does not have read permission in '%1' - Nie ma uprawnień odczytu w '%1' - - - - Does not have write permission in '%1' - Nie ma uprawnień zapisu w '%1' + Niestety, podgląd pliku jest niedostępny PropListDelegate - + Not downloaded Nie pobierany - - + + Normal Normal (priority) Normalny - - N/A - Nie dotyczy - - - + Do not download Do not download (priority) - Nie pobieraj + Nie pobieraj - - + + High High (priority) Wysoki - + N/A + Nie dotyczy + + + Mixed Mixed (priorities Różne - - + + Maximum Maximum (priority) Maksymalny @@ -6503,32 +5792,32 @@ PropTabBar - + General Główne - + Trackers Trackery - + Peers Partnerzy - + HTTP Sources Źródła HTTP - + Content Zawartość - + Speed Prędkość @@ -6594,12 +5883,12 @@ Download Limit: - Limit pobierania: + Ograniczanie pobierania: Upload Limit: - Limit wysyłania: + Ograniczenie wysyłania: @@ -6622,22 +5911,22 @@ Komentarz: - + Select All Zaznacz wszystko - + Select None Odznacz wszystko - + Normal Normalny - + High Wysoki @@ -6649,7 +5938,7 @@ Reannounce In: - Rozgłoszenie za: + Sprawdzanie trackera za: @@ -6697,165 +5986,165 @@ Ścieżka zapisu: - + Maximum Maksymalny + - Do not download Nie pobieraj - + Never Nigdy - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (ma %3) - - + + %1 (%2 this session) %1 (w tej sesji %2) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (seedowane przez %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (maksymalnie %2) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (całkowicie %2) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (średnio %2) - + Open Otwórz - + Open Containing Folder Otwórz katalog pobierań - + Rename... Zmień nazwę... - + Priority Priorytet - + New Web seed Nowy seed sieciowy - + Remove Web seed Usuń seed sieciowy - + Copy Web seed URL Kopiuj URL seeda sieciowego - + Edit Web seed URL Edytuj URL seeda sieciowego - + + Rename the file + Zmień nazwę pliku + + + New name: Nowa nazwa: - - + + + The file could not be renamed + Nie można zmienić nazwy pliku + + + + This file name contains forbidden characters, please choose a different one. + Nazwa pliku zawiera zabronione znaki; wybierz inną nazwę. + + + + This name is already in use in this folder. Please use a different name. Wybrana nazwa jest już używana w tym katalogu. Wybierz inną nazwę. - + The folder could not be renamed Nie można zmienić nazwy katalogu - + qBittorrent qBittorrent - + Filter files... Filtrowane pliki... - - Renaming - Zmiana nazwy - - - - - Rename error - Błąd zmiany nazwy - - - - The name is empty or contains forbidden characters, please choose a different one. - Nazwa jest pusta lub zawiera zabronione znaki, proszę wybrać inną nazwę. - - - + New URL seed New HTTP source Nowy URL seeda - + New URL seed: Nowy URL seeda: - - + + This URL seed is already in the list. Ten URL seeda już jest na liście. - + Web seed editing Edytowanie seeda sieciowego - + Web seed URL: URL seeda sieciowego: @@ -6863,585 +6152,551 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + Twój adres IP został zbanowany po zbyt wielu nieudanych próbach uwierzytelnienia. + + + + Error: '%1' is not a valid torrent file. + + Błąd: '%1' nie jest prawidłowym plikiem torrent. + + + + + Error: Could not add torrent to session. + Błąd: Nie można dodać torrenta do sesji. + + + + I/O Error: Could not create temporary file. + Błąd I/O: Nie można utworzyć pliku tymczasowego. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 to nieznany parametr linii poleceń. - - + + %1 must be the single command line parameter. %1 musi być pojedynczym parametrem linii poleceń. - + + %1 must specify the correct port (1 to 65535). + %1 musi określić odpowiedni port (1 do 65535). + + + You cannot use %1: qBittorrent is already running for this user. Nie możesz użyć %1: qBittorrent jest już uruchomiony dla tego użytkownika. - + Usage: Użycie: - + Options: Opcje: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - Parametr '%1' musi odpowiadać składni '%1=%2' + + Displays program version + Wyświetlenie wersji programu - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - Parametr '%1' musi odpowiadać składni '%1=%2' + + Displays this help message + Wyświetla tę wiadomość pomocy - - Expected integer number in environment variable '%1', but got '%2' - Oczekiwano liczbę całkowitą w zmiennej środowiskowej '%1', ale otrzymano '%2' + + Changes the Web UI port (current: %1) + Zmienia port sieciowego interfejsu użytkownika (obecnie: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - Parametr '%1' musi odpowiadać składni '%1=%2' + + Disable splash screen + Wyłączenie ekranu startowego - - Expected %1 in environment variable '%2', but got '%3' - Oczekiwano %1 w zmiennej środowiskowej '%2', ale otrzymano '%3' + + Run in daemon-mode (background) + Uruchom w trybie demona (w tle) - - port - port + + Downloads the torrents passed by the user + Pobiera pliki torrent podane przez użytkownika - - %1 must specify a valid port (1 to 65535). - %1 musi określić prawidłowy port (1 do 65535). + + Help + Pomoc - - Display program version and exit - Wyświetl wersję programu i zamknij + + Run application with -h option to read about command line parameters. + Uruchom aplikację z opcją -h, aby przeczytać o parametrach linii komend. - - Display this help message and exit - Wyświetl tę wiadomość pomocy i zamknij + + Bad command line + Niewłaściwy wiersz poleceń - - Change the Web UI port - Zmień port interfejsu WWW + + Bad command line: + Niewłaściwy wiersz poleceń: - - Disable splash screen - Wyłączenie ekranu startowego + + Legal Notice + Nota prawna - - Run in daemon-mode (background) - Uruchom w trybie demona (w tle) + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + qBittorrent jest programem do wymiany plików. Uruchomienie torrenta powoduje, że jego zawartość jest dostępna dla innych. Użytkownik ponosi pełną odpowiedzialność za udostępniane treści. + +W przyszłości powiadomienie nie będzie wyświetlane. - - dir - Use appropriate short form or abbreviation of "directory" - katalog + + Press %1 key to accept and continue... + Nacisnij klawisz %1, aby zaakceptować i kontynuować... - - Store configuration files in <dir> - Przechowuj pliki konfiguracyjne w <dir> + + Legal notice + Nota prawna - - - name - nazwa + + Cancel + Anuluj - - Store configuration files in directories qBittorrent_<name> - Przechowuj pliki konfiguracyjne w katalogach qBittorrent_<name> + + I Agree + Zgadzam się - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Włam się do plików fastresume libtorrent i uczyń ścieżki plików względnymi do katalogu profilu + + Torrent name: %1 + Nazwa torrenta: %1 - - files or URLs - pliki albo adresy URL + + Torrent size: %1 + Rozmiar torrenta: %1 - - Download the torrents passed by the user - Pobierz pliki torrent podane przez użytkownika + + Save path: %1 + Ścieżka zapisu: %1 - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Określ, czy otwierać okno "Dodaj nowy plik torrent" podczas dodawnia torrenta. + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Torrent został pobrany w %1. - - Options when adding new torrents: - Opcje podczas dodawania nowych torrentów: + + Thank you for using qBittorrent. + Dziękujemy za używanie qBittorrent. - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Skrót do %1 + + [qBittorrent] '%1' has finished downloading + [qBittorrent] '%1' skończył pobieranie - - path - ścieżka + + The remote host name was not found (invalid hostname) + Nie odnaleziono nazwy zdalnego hosta (nieprawidłowa nazwa hosta) - - Torrent save path - Ścieżka zapisu torrenta + + The operation was canceled + Operacja została anulowana - - Add torrents as started or paused - Dodaj torrenty jako rozpoczęte lub wstrzymane + + The remote server closed the connection prematurely, before the entire reply was received and processed + Zdalny serwer przedwcześnie zakończył połączenie, zanim otrzymano i przetworzono odpowiedź - - Skip hash check - Pomiń sprawdzanie sumy kontrolnej + + The connection to the remote server timed out + Przekroczono czas oczekiwania na połącznie ze zdalnym serwerem - - Assign torrents to category. If the category doesn't exist, it will be created. - Przypisz torrenty do kategorii. Jeśli kategoria nie istnieje, zostanie utworzona. + + SSL/TLS handshake failed + Próba negocjacji połączenia SSL/TLS nie powiodła się - - Download files in sequential order - Pobierz pliki w kolejności sekwencyjnej + + The remote server refused the connection + Zdalny serwer odrzucił połączenie - - Download first and last pieces first - Pobierz najpierw część pierwszą i ostatnią + + The connection to the proxy server was refused + Połączenie z serwerem proxy zostało odrzucone - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - Wartości opcji mogą być dostarczane za pośrednictwem zmiennych środowiskowych. Dla opcji nazwanej 'parameter-name', nazwa zmiennej środowiskowej to 'QBT_PARAMETER_NAME' (w trybie wielkich liter '-' zastąpione jest '_'). Aby przekazać wartości flagi, ustaw zmienną na '1' albo 'TRUE'. Na przykład, aby wyłączyć ekran powitalny: + + The proxy server closed the connection prematurely + Serwer proxy przedwcześnie zakończył połączenie - - Command line parameters take precedence over environment variables - Parametry linii poleceń mają pierwszeństwo przed zmiennymi środowiskowymi + + The proxy host name was not found + Nie znaleziono nazwy hosta serwera proxy - - Help - Pomoc + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Przekroczono czas oczekiwania na połączenie z serwerem proxy lub serwer nie odpowiedział na czas - - Run application with -h option to read about command line parameters. - Uruchom aplikację z opcją -h, aby przeczytać o parametrach linii komend. + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Serwer proxy wymaga uwierzytelnienia, aby zaakceptować żądanie, lecz oferowane dane uwierzytelnienia zostały odrzucone - - Bad command line - Niewłaściwy wiersz poleceń + + The access to the remote content was denied (401) + Odmówiono dostępu do zdalnego zasobu (401) - - Bad command line: - Niewłaściwy wiersz poleceń: + + The operation requested on the remote content is not permitted + Żądana operacja na zdalnym zasobie nie jest dozwolona - - Legal Notice - Nota prawna + + The remote content was not found at the server (404) + Nie znaleziono zdalnego zasobu na serwerze (404) - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - qBittorrent jest programem do wymiany plików. Uruchomienie torrenta powoduje, że jego zawartość jest dostępna dla innych. Użytkownik ponosi pełną odpowiedzialność za udostępniane treści. + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Zdalny serwer wymaga uwierzytelnienia w celu dostępu do zasobu, lecz dane uwierzytelniające nie zostały zaakceptowane - - No further notices will be issued. - Żadne dodatkowe zawiadomienia nie będą wydawane. + + The Network Access API cannot honor the request because the protocol is not known + API dostępu do sieci nie może zaakceptować żądania, ponieważ protokół jest nieznany - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - qBittorrent jest programem do wymiany plików. Uruchomienie torrenta powoduje, że jego zawartość jest dostępna dla innych. Użytkownik ponosi pełną odpowiedzialność za udostępniane treści. - -W przyszłości powiadomienie nie będzie wyświetlane. + + The requested operation is invalid for this protocol + Żądana operacja jest nieprawidłowa dla tego protokołu - - Press %1 key to accept and continue... - Nacisnij klawisz %1, aby zaakceptować i kontynuować... + + An unknown network-related error was detected + Wykryto nieznany błąd związany z siecią - - Legal notice - Nota prawna + + An unknown proxy-related error was detected + Wykryto nieznany błąd związany z proxy - - Cancel - Anuluj + + An unknown error related to the remote content was detected + Wykryto nieznany błąd związany ze zdalną zawartością - - I Agree - Zgadzam się + + A breakdown in protocol was detected + Wykryto błąd w protokole - - + + Unknown error + Nieznany błąd + + + + Upgrade Zaktualizuj - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - Zaktualizowano starszą wersję, która zapisywała inaczej. Należy przeprowadzić migrację do nowego systemu zapisywania, lecz wówczas nie będzie można używać wersji starszej niż v3.3.0. Kontynuować? [t/n] + Zaktualizowano starszą wersję, która zapisywała inaczej. Należy przeprowadzić migrację do nowego systemu zapisywania, lecz wówczas nie będzie można używać wersji starszej niż v3.3.0. Kontynuować? [t/n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. Zaktualizowano starszą wersję, która zapisywała inaczej. Należy przeprowadzić migrację do nowego systemu zapisywania, lecz wówczas nie będzie można używać wersji starszej niż v3.3.0. - + Couldn't migrate torrent with hash: %1 Nie udało się przenieść torrenta z hashem: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 Nie udało się przenieść torrenta. Nieprawidłowa nazwa pliku szybkiego wznawiania: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 - Wykryto nieczyste zakończenie programu. Korzystam z pliku awaryjnego, aby przywrócić ustawienia: %1 + + Detected unclean program exit. Using fallback file to restore settings. + Wykryto nieczyste zakończenie programu. Korzystam z pliku awaryjnego, aby przywrócić ustawienia. - + An access error occurred while trying to write the configuration file. Wystąpił błąd dostępu podczas próby zapisania pliku konfiguracji. - + A format error occurred while trying to write the configuration file. Wystąpił błąd formatu podczas próby zapisania pliku konfiguracji. - - - An unknown error occurred while trying to write the configuration file. - Wystąpił nieznany błąd podczas próby zapisania pliku konfiguracji. - - RSS::AutoDownloader + RSS - - - Invalid data format. - Nieprawidłowy format danych. + + Search + Szukaj - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - Nie można zapisać danych automatycznego pobierania RSS w %1. Błąd: %2 + + New subscription + Nowy kanał RSS - - Invalid data format - Nieprawidłowy format danych + + + + Mark items read + Zaznacz jako przeczytane - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - Nie można wczytać reguł automatycznego pobierania RSS z %1. Błąd: %2 + + Update all + Odśwież wszystkie - - Couldn't load RSS AutoDownloader rules. Reason: %1 - Nie można wczytać reguł automatycznego pobierania RSS. Powód: %1 - - - - RSS::Feed - - - Failed to download RSS feed at '%1'. Reason: %2 - Nie udało się pobrać kanału RSS z '%1'. Powód: %2 - - - - RSS feed at '%1' updated. Added %2 new articles. - Kanał RSS z '%1' został zaktualizowany. Dodano %2 nowe artykuły. - - - - Failed to parse RSS feed at '%1'. Reason: %2 - Nie udało się przetworzyć kanału RSS z '%1'. Powód: %2 - - - - Couldn't read RSS Session data from %1. Error: %2 - Nie można odczytać danych sesji RSS z %1. Błąd: %2 - - - - Couldn't parse RSS Session data. Error: %1 - Nie można przetworzyć danych sesji RSS. Błąd: %1 - - - - Couldn't load RSS Session data. Invalid data format. - Nie można załadować danych sesji RSS. Nieprawidłowy format danych. - - - - Couldn't load RSS article '%1#%2'. Invalid data format. - Nie można załadować artykułu RSS '%1#%2'. Nieprawidłowy format danych. - - - - RSS::Private::Parser - - - Invalid RSS feed. - Nieprawidłowy kanał RSS. - - - - %1 (line: %2, column: %3, offset: %4). - %1 (wiersz: %2, kolumna: %3, rozstaw: %4). - - - - RSS::Session - - - RSS feed with given URL already exists: %1. - Kanał RSS z tym samym adresem URL już istnieje: %1. - - - - Cannot move root folder. - Nie można przenieść katalogu głównego. - - - - - Item doesn't exist: %1. - Element nie istnieje: %1. - - - - Cannot delete root folder. - Nie można usunąć katalogu głównego. - - - - Incorrect RSS Item path: %1. - Nieprawidłowa ścieżka elementu RSS: %1. - - - - RSS item with given path already exists: %1. - Element RSS z tą samą ścieżką już istnieje: %1. - - - - Parent folder doesn't exist: %1. - Folder nadrzędny nie istnieje: %1. - - - - RSSWidget - - - Search - Szukaj - - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - Pobieranie kanałów RSS jest teraz wyłączone! Możesz włączyć je w ustawieniach aplikacji. - - - - New subscription - Nowa subskrypcja - - - - - - Mark items read - Zaznacz jako przeczytane - - - - Refresh RSS streams - Odśwież strumienie RSS - - - - Update all - Zaktualizuj wszystkie - - - + RSS Downloader... Pobieranie z kanałów RSS... - + + Settings... + Ustawienia... + + + Torrents: (double-click to download) Torrenty: (podwójne kliknięcie, aby pobrać) - - + + Delete Usuń - + Rename... Zmień nazwę... - + Rename Zmień nazwę - - + + Update Odśwież - + New subscription... - Nowa subskrypcja... + Nowy kanał RSS... - - + + Update all feeds - Zaktualizuj wszystkie kanały RSS + Odśwież wszystkie kanały RSS - + Download torrent Pobierz torrent - + Open news URL Otwórz URL wiadomości - + Copy feed URL Kopiuj adres kanału RSS - + New folder... - Nowy folder... + Nowy katalog... - - Please choose a folder name - Proszę wybrać nazwę folderu + + Refresh RSS streams + Odśwież kanały RSS + + + RSSImp - - Folder name: - Nazwa folderu: + + Stream URL: + Adres URL dla nowego kanału RSS: - - New folder - Nowy folder + + Please type a RSS stream URL + Proszę wpisać adres URL strumienia RSS + + + + This RSS feed is already in the list. + Ten kanał RSS już jest na liście. + + + + Please choose a folder name + Wprowadź nazwę katalogu - - Please type a RSS feed URL - Proszę wpisać adres URL kanału RSS + + Folder name: + Nazwa dla nowego katalogu: - - Feed URL: - URL kanału: + + New folder + Nowy katalog - + Deletion confirmation - Potwierdzenie usuwania + Potwierdzenia usuwania - + Are you sure you want to delete the selected RSS feeds? Czy na pewno chcesz usunąć wybrane kanały RSS? - + Please choose a new name for this RSS feed Należy podać nową nazwę dla tego kanału RSS - + New feed name: Nowa nazwa kanału RSS: - - Rename failed - Zmiana nazwy nie powiodła się + + Name already in use + Podana nazwa już istnieje + + + + This name is already used by another item, please choose another one. + Podana nazwa już istnieje, należy wybrać inną. - + Date: Data: - + Author: Autor: + + + Unread + Nieprzeczytane + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + Automatyczne pobieranie '%1' z kanału RSS '%2' zakończyło się niepowodzeniem, ponieważ nie zawiera pliku torrent albo łącza magnet... + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + Automatyczne pobieranie torrenta '%1' z kanału RSS '%2'... + + + + Rss::Private::Parser + + + Invalid RSS feed. + Nieprawidłowy kanał RSS. + + + + RssSettingsDlg + + + RSS Reader Settings + Ustawienia czytnika RSS + + + + RSS feeds refresh interval: + Częstotliwość odświeżania kanałów: + + + + min + minuty + + + + Maximum number of articles per feed: + Maksymalna liczba wiadomości na kanał: + ScanFoldersDelegate - + Select save location Wybierz miejsce zapisu @@ -7449,274 +6704,268 @@ ScanFoldersModel - + Monitored Folder Monitorowany katalog - + Override Save Location Zastąp miejsce zapisu - + Monitored folder Monitorowany katalog - + Default save location Domyślne miejsce zapisu - + Browse... Przeglądaj... - SearchJobWidget + SearchEngine - - Form - Formularz + + Unknown search engine plugin file format. + Nieznany format pliku wtyczki wyszukiwania - - Results(xxx) - Wyniki(xxx) + + A more recent version of this plugin is already installed. + Najnowsza wersja tej wtyczki jest już zainstalowana. - - Search in: - Wyszukaj w: + + + Plugin is not supported. + Wtyczka nie jest obsługiwania. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - <html><head/><body><p>Niektóre wyszukiwarki przeszukują także opisy i nazwy plików torrentów. Ten tryb kontroluje, czy takie wyniki zostaną wyświetlone na liście poniżej.</p><p><span style=" font-weight:600;">Wszędzie </span>wyłącza filtrowanie i pokazuje wszystko zwrócone przez wyszukiwarki.</p><p><span style=" font-weight:600;">Tylko nazwy torrentów</span> pokazują tylko torrenty, których nazwy pasują do wyszukiwanej frazy.</p></body></html> + + Update server is temporarily unavailable. %1 + Serwer aktualizacji jest tymczasowo niedostępny. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - <html><head/><body><p>Ustaw minimalną i maksymalną liczbę seedujących</p></body></html> + + + Failed to download the plugin file. %1 + Nie udało się pobrać pliku wtyczki. %1 - - Seeds: - Seedy: + + An incorrect update info received. + Otrzymano nieprawidłowe informacje aktualizacji. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - <html><head/><body><p>Minimalna liczba seedów</p></body></html> + + All categories + Wszystko - - - to - do + + Movies + Filmy - - <html><head/><body><p>Maximal number of seeds</p></body></html> - <html><head/><body><p>Maksymalna liczba seedów</p></body></html> + + TV shows + Seriale TV - - - - + + Music + Muzyka - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - <html><head/><body><p>Ustaw minimalny i maksymalny dozwolony rozmiar torrenta</p></body></html> + + Games + Gry - - Size: - Rozmiar: + + Anime + Anime - - <html><head/><body><p>Minimal torrent size</p></body></html> - <html><head/><body><p>Minimalny rozmiar torrenta</p></body></html> + + Software + Programy - - <html><head/><body><p>Maximal torrent size</p></body></html> - <html><head/><body><p>Maksymalny rozmiar torrenta</p></body></html> + + Pictures + Obrazki + + + + Books + Książki + + + + SearchListDelegate + + + + Unknown + Nieznany + + + SearchTab - + Name i.e: file name Nazwa - + Size i.e: file size Rozmiar - + Seeders i.e: Number of full sources Seedujący - + Leechers i.e: Number of partial sources - Pijawki + Częściowych - + Search engine Wyszukiwarka - - Filter search results... - Filtruj wyniki wyszukiwania... - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results Wyniki (pokazuje <i>%1</i> z <i>%2</i>): - + Torrent names only Tylko nazwy torrentów - + Everywhere Wszędzie - - Use regular expressions - Używaj wyrażeń regularnych - - - + Searching... Wyszukiwanie... - + Search has finished Wyszukiwanie zakończone - + Search aborted Wyszukiwanie przerwane - + An error occurred during search... Wystąpił błąd podczas wyszukiwania... - + Search returned no results Wyszukiwanie nie zwróciło wyników - + Column visibility - Widoczność kolumy - - - - SearchPluginManager - - - Unknown search engine plugin file format. - Nieznany format pliku wtyczki wyszukiwania. - - - - A more recent version of this plugin is already installed. - Najnowsza wersja tej wtyczki jest już zainstalowana. + - - - Plugin is not supported. - Wtyczka nie jest obsługiwania. + + Form + Formularz - - All categories - Wszystko + + Results(xxx) + Wyniki(xxx) - - Movies - Filmy + + Search in: + Wyszukaj w: - - TV shows - Seriale TV + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Niektóre wyszukiwarki przeszukują także opisy i nazwy plików torrentów. Ten tryb kontroluje, czy takie wyniki zostaną wyświetlone na liście poniżej.</p><p><span style=" font-weight:600;">Wszędzie </span>wyłącza filtrowanie i pokazuje wszystko zwrócone przez wyszukiwarki.</p><p><span style=" font-weight:600;">Tylko nazwy torrentów</span> pokazują tylko torrenty, których nazwy pasują do wyszukiwanej frazy.</p></body></html> - - Music - Muzyka + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Ustaw minimalną i maksymalną liczbę seedujących</p></body></html> - - Games - Gry + + Seeds: + Seedy: - - Anime - Anime + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Minimalna liczba seedów</p></body></html> - - Software - Oprogramowanie + + + to + do - - Pictures - Obrazki + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Maksymalna liczba seedów</p></body></html> - - - Books - Książki + + + + + - - Update server is temporarily unavailable. %1 - Serwer aktualizacji jest tymczasowo niedostępny. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Ustaw minimalny i maksymalny dozwolony rozmiar torrenta</p></body></html> - - - Failed to download the plugin file. %1 - Nie udało się pobrać pliku wtyczki. %1 + + Size: + Rozmiar: - - An incorrect update info received. - Otrzymano nieprawidłowe informacje aktualizacji. + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Minimalny rozmiar torrenta</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - Wtyczka wyszukiwania '%1' zawiera nieprawidłowy ciąg wersji ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Maksymalny rozmiar torrenta</p></body></html> @@ -7724,198 +6973,185 @@ - - - - + + + Search Wyszukaj - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - Nie ma zainstalowanych żadnych wtyczek wyszukiwania. -Kliknij przycisk "Wtyczki wyszukiwania..." w prawym dolnym rogu okna, aby zainstalować niektóre. - - - + Download Pobierz - + Go to description page Przejdź do strony z opisem - + Copy description page URL Kopiuj URL strony opisu - + Search plugins... Wtyczki wyszukiwania... - + A phrase to search for. Fraza do wyszukiwania. - + Spaces in a search term may be protected by double quotes. Odstępy w wyszukiwanej frazie mogą być chronione przez cudzysłów. - + Example: Search phrase example Przykład: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>: wyszukaj <b>foo</b> oraz <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: wyszukaj <b>foo bar</b> - + All plugins Wszystkie wtyczki - + Only enabled Tylko włączone - + Select... Wybierz... - - - + + + Search Engine Wyszukiwarka - + Please install Python to use the Search Engine. Należy zainstalować Pythona, aby móc używać wyszukiwarki. - + Empty search pattern Pusty wzorzec wyszukiwania - + Please type a search pattern first Najpierw podaj wzorzec wyszukiwania - + Stop Zatrzymaj - + Search has finished Wyszukiwanie zakończone - + Search has failed Wyszukiwanie nie powiodło się - ShutdownConfirmDialog - - - Don't show again - Nie pokazuj ponownie - + ShutdownConfirmDlg - + qBittorrent will now exit. - qBittorrent zostanie teraz zamknięty. + qBittorrent zostanie teraz wyłączony. - + E&xit Now Zak&ończ teraz - + Exit confirmation Potwierdzenie zamykania - + The computer is going to shutdown. Komputer zostanie wyłączony. - + &Shutdown Now - &Zamknij system teraz + &Zamknij teraz - - Shutdown confirmation - Potwierdzenie zamykania systemu - - - + The computer is going to enter suspend mode. Komputer zostanie przełączony w stan wstrzymania. - + &Suspend Now - &Wstrzymaj system teraz + &Wstrzymaj teraz - + Suspend confirmation - Potwierdzenie wstrzymania systemu + Potwierdzenie wstrzymania - + The computer is going to enter hibernation mode. Komputer zostanie przełączony w tryb hibernacji. - + &Hibernate Now - &Hibernuj system teraz + &Hibernuj teraz - + Hibernate confirmation - Potwierdzenie hibernacji systemu + Potwierdzenie hibernacji - + You can cancel the action within %1 seconds. Możesz anulować akcję w ciągu %1 sekund. + + + Shutdown confirmation + Potwierdzenie zamykania + SpeedLimitDialog - + KiB/s KiB/s @@ -7923,52 +7159,52 @@ SpeedPlotView - + Total Upload Całość wysyłania - + Total Download Całość pobierania - + Payload Upload Wysyłany ładunek - + Payload Download Pobierany ładunek - + Overhead Upload Narzut wysyłania - + Overhead Download Narzut pobierania - + DHT Upload Wysyłanie DHT - + DHT Download Pobieranie DHT - + Tracker Upload Wysyłanie trackera - + Tracker Download Pobierania trackera @@ -7976,95 +7212,87 @@ SpeedWidget - + Period: Okres: - + 1 Minute 1 minuta - + 5 Minutes 5 minut - + 30 Minutes 30 minut - + 6 Hours 6 godzin - + Select Graphs Wybierz wykresy - + Total Upload Całość wysyłania - + Total Download Całość pobierania - + Payload Upload Wysyłany ładunek - + Payload Download Pobierany ładunek - + Overhead Upload Narzut wysyłania - + Overhead Download Narzut pobierania - + DHT Upload Wysyłanie DHT - + DHT Download Pobieranie DHT - + Tracker Upload Wysyłanie trackera - + Tracker Download Pobierania trackera - StacktraceDialog - - - Crash info - Informacje o awarii - - - StatsDialog @@ -8077,49 +7305,49 @@ Statystyki użytkownika - - Cache statistics - Statystyki cache + + Total peer connections: + Całość połączeń partnerów: - - Read cache hits: - Odsłony pamięci podręcznej odczytu: + + Global ratio: + Globalny współczynnik udziału: - - Average time in queue: - Średni czas w kolejce: + + Alltime download: + Pobrano w sumie - - Connected peers: - Połączeni partnerzy: + + Alltime upload: + Wysłano w sumie - - All-time share ratio: - Współczynnik udziału absolutny: + + Total waste (this session): + Stracono (w tej sesji): - - All-time download: - Pobieranie absolutne: + + Cache statistics + Statystyki cache - - Session waste: - Strata sesji: + + Read cache hits: + Odsłony pamięci podręcznej odczytu: - - All-time upload: - Wysyłanie absolutne: + + Average time in queue: + Średni czas w kolejce: - Total buffer size: - Całość rozmiaru bufora: + Total buffers size: + Całkowity rozmiar buforów: @@ -8147,7 +7375,12 @@ Całkowity rozmiar kolejki: - + + OK + OK + + + %1 ms 18 milliseconds %1 ms @@ -8156,27 +7389,32 @@ StatusBar - + Connection status: Status połączenia: - + No direct connections. This may indicate network configuration problems. Brak bezpośrednich połączeń. Może to oznaczać problem z konfiguracją sieci. - + DHT: %1 nodes Węzły DHT: %1 - - qBittorrent needs to be restarted! - qBittorrent musi zostać uruchomiony ponownie! + + qBittorrent needs to be restarted + qBittorrent musi być ponownie uruchomiony + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent został zaktualizowany i konieczne jest jego ponowne uruchomienie. @@ -8195,989 +7433,716 @@ Połączony - + Click to switch to alternative speed limits Kliknij, aby przełączyć na alternatywne limity prędkości - + Click to switch to regular speed limits Kliknij, aby przełączyć na normalne limity prędkości - + + Manual change of rate limits mode. The scheduler is disabled. + Ręczna zmiana trybu wysokości limitów. Harmonogram jest wyłączony. + + + Global Download Speed Limit Ogólny limit pobierania - + Global Upload Speed Limit Ogólny limit wysyłania - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter Wszystkie (0) - + Downloading (0) Pobierane (0) - + Seeding (0) - Seedowane (0) + Seedowanie (0) - + Completed (0) Ukończone (0) - + Resumed (0) Wznowione (0) - + Paused (0) Wstrzymane (0) - + Active (0) Aktywne (0) - + Inactive (0) Nieaktywne (0) - + Errored (0) Błędne (0) - + All (%1) Wszystkie (%1) - + Downloading (%1) Pobierane (%1) - + Seeding (%1) - Seedowane (%1) + Seedowanie (%1) - + Completed (%1) Ukończone (%1) - + Paused (%1) Wstrzymane (%1) - + Resumed (%1) Wznowione (%1) - + Active (%1) Aktywne (%1) - + Inactive (%1) Nieaktywne (%1) - + Errored (%1) Błędne (%1) - TagFilterModel + TorrentContentModel - - Tags - Znaczniki + + Name + Nazwa - - All - Wszystkie + + Size + Rozmiar - - Untagged - Bez znaczników + + Progress + Postęp - - - TagFilterWidget - - Add tag... - Dodaj znacznik... + + Download Priority + Priorytet pobierania - - Remove tag - Usuń znacznik + + Remaining + Pozostało + + + TorrentCreatorDlg - - Remove unused tags - Usuń nieużywane znaczniki + + Select a folder to add to the torrent + Wybierz katalog, który chcesz dodać do torrenta - - Resume torrents - Wznów torrenty + + Select a file to add to the torrent + Wybierz plik, który chcesz dodać do torrenta - - Pause torrents - Wstrzymaj torrenty + + No input path set + Nieznany katalog źródłowy - - Delete torrents - Usuń torrenty + + Please type an input path first + Podaj katalog źródłowy - - New Tag - Nowy znacznik + + Select destination torrent file + Wybierz plik docelowy - - Tag: - Znacznik: + + Torrent Files (*.torrent) + Pliki torrent (*.torrent) - - Invalid tag name - Nieprawidłowa nazwa znacznika + + Torrent was created successfully: %1 + %1 is the path of the torrent + Plik torrent został pomyślnie utworzony: %1 - - Tag name '%1' is invalid - Nazwa znacznika '%1' jest nieprawidłowa + + + + Torrent creation + Tworzenie pliku torrent - - Tag exists - Znacznik istnieje + + Torrent creation was unsuccessful, reason: %1 + Nie udało się utworzyć pliku torrent z powodu: %1 - - Tag name already exists. - Nazwa znacznika już istnieje. + + Created torrent file is invalid. It won't be added to download list. + Utworzony plik torrent jest nieprawidłowy. Nie zostanie dodany do listy pobierania. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Właściwości kategorii torrenta + + Name + i.e: torrent name + Nazwa - - Name: - Nazwa: + + Size + i.e: torrent size + Rozmiar - - Save path: - Ścieżka zapisu: + + Done + % Done + Ukończono - - Choose save path - Wybierz ścieżkę zapisu + + Status + Torrent status (e.g. downloading, seeding, paused) + Status - - New Category - Nowa kategoria + + Seeds + i.e. full sources (often untranslated) + Seedy - - Invalid category name - Nieprawidłowa nazwa kategorii + + Peers + i.e. partial sources (often untranslated) + Partnerzy - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - Nazwa kategorii nie może zawierać '\'. -Nazwa kategorii nie może się rozpoczynać/kończyć '/'. -Nazwa kategorii nie może zawierać sekwencji '//'. + + Down Speed + i.e: Download speed + Pobieranie - - Category creation error - Błąd tworzenia kategorii + + Up Speed + i.e: Upload speed + Wysyłanie - - Category with the given name already exists. -Please choose a different name and try again. - Kategoria o wybranej nazwie już istnieje. -Należy wybrać inną nazwę i spróbować ponownie. + + Ratio + Share ratio + Udział - - - TorrentContentModel - - Name - Nazwa + + ETA + i.e: Estimated Time of Arrival / Time left + ETA - - Size - Rozmiar + + Category + Kategoria - - Progress - Postęp + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Dodano - - Download Priority - Priorytet pobierania + + Completed On + Torrent was completed on 01/01/2010 08:00 + Ukończono - - Remaining - Pozostało + + Tracker + Tracker - - Availability - Dostępność + + Down Limit + i.e: Download limit + Limit pobierania - - - TorrentCreatorDialog - - Torrent Creator - Kreator plików torrent + + Up Limit + i.e: Upload limit + Limit wysyłania - - Select file/folder to share - Wybierz plik lub folder do współdzielenia + + Downloaded + Amount of data downloaded (e.g. in MB) + Pobrano - - Path: - Ścieżka: + + Uploaded + Amount of data uploaded (e.g. in MB) + Wysłano - - [Drag and drop area] - [Obszar przeciągnia i upuszczania] + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Pobrane w sesji - - - Select file - Wybierz plik + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Wysłane w sesji - - - Select folder - Wybierz folder + + Remaining + Amount of data left to download (e.g. in MB) + Pozostały czas - - Settings - Ustawienia + + Time Active + Time (duration) the torrent is active (not paused) + Aktywny przez - - Piece size: - Rozmiar części: + + Save path + Torrent save path + Katalog docelowy - - Auto - Automatyczny + + Completed + Amount of data completed (e.g. in MB) + Ukończone - - 16 KiB - 16 KiB + + Ratio Limit + Upload share ratio limit + Limit współczynnika udziału - - 32 KiB - 32 KiB + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Ostatni raz widziany kompletny - - 64 KiB - 64 KiB + + Last Activity + Time passed since a chunk was downloaded/uploaded + Ostatnia aktywność - - 128 KiB - 128 KiB + + Total Size + i.e. Size including unwanted data + Całkowity rozmiar + + + TrackerFiltersList - - 256 KiB - 256 KiB + + All (0) + this is for the tracker filter + Wszystkie (0) - - 512 KiB - 512 KiB + + Trackerless (0) + Bez trackera (0) - - 1 MiB - 1 MiB + + Error (0) + Błędne (0) - - 2 MiB - 2 MiB + + Warning (0) + Z ostrzeżeniem (0) - - 4 MiB - 4 MiB + + + Trackerless (%1) + Bez trackera (%1) - - 8 MiB - 8 MiB + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - 16 MiB - 16 MiB + + + Error (%1) + Błędne (%1) - - 32 MiB - 32 MiB + + + Warning (%1) + Z ostrzeżeniem (%1) - - Calculate number of pieces: - Oblicz liczbę części: + + Resume torrents + Wznów torrenty - - Private torrent (Won't distribute on DHT network) - Prywatny torrent (nie będzie rozprowadzany w sieci DHT) + + Pause torrents + Wstrzymaj torrenty - - Start seeding immediately - Natychmiast rozpocznij seedowanie + + Delete torrents + Usuń torrenty - - Ignore share ratio limits for this torrent - Ignoruj limity współczynnika udziału dla tego torrenta - - - - Optimize alignment - Zoptymalizuj wyrównanie - - - - Fields - Pola - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - Można oddzielić warstwy / grupy trackerów pustym wierszem. - - - - Web seed URLs: - Adresy URL źródła sieciowego: - - - - Tracker URLs: - Adresy URL trackerów: - - - - Comments: - Komentarze: - - - - Source: - Źródło: - - - - Progress: - Postęp: - - - - Create Torrent - Utwórz torrent - - - - - - Torrent creation failed - Niepowodzenie tworzenia torrenta - - - - Reason: Path to file/folder is not readable. - Powód: nie można odczytać ścieżki do pliku lub folderu. - - - - Select where to save the new torrent - Wybierz, gdzie zapisać nowy torrent - - - - Torrent Files (*.torrent) - Pliki torrent (*.torrent) - - - - Reason: %1 - Powód: %1 - - - - Reason: Created torrent is invalid. It won't be added to download list. - Powód: utworzony plik torrent jest nieprawidłowy. Nie zostanie dodany do listy pobierania. - - - - Torrent creator - Kreator torrentów - - - - Torrent created: - Torrent utworzono: + + + All (%1) + this is for the tracker filter + Wszystkie (%1) - TorrentInfo - - - File size exceeds max limit %1 - Rozmiar pliku przekracza maksymalny limit %1 - - - - Torrent file read error: %1 - Błąd odczytu pliku torrent: %1 - + TrackerList - - Torrent file read error: size mismatch - Błąd odczytu pliku torrent: niedopasowanie rozmiaru - - - - TorrentsController - - - Not contacted yet - Niesprawdzony - - - - Updating... - Aktualizowanie... - - - - Working - Działa - - - - Not working - Nie działa - - - - Error: '%1' is not a valid torrent file. - Błąd: '%1' nie jest prawidłowym plikiem torrent. + + URL + URL - - - - - Torrent queueing must be enabled - Kolejkowanie torrentów musi być włączone + + Status + Status - - Save path cannot be empty + + Received - - - Category cannot be empty - + + Seeds + Seedy - - Unable to create category - + + Peers + Partnerzy - - Unable to edit category + + Downloaded - Save path is empty - Ścieżka zapisu jest pusta - - - - Cannot make save path - Nie można utworzyć ścieżki zapisu - - - - Cannot write to directory - Nie można zapisać do katalogu - - - - WebUI Set location: moving "%1", from "%2" to "%3" - Interfejs WWW Ustaw położenie: przenoszenie "%1", z "%2" do "%3" - - - - Incorrect torrent name - Nieprawidłowa nazwa torrenta - - - - - Incorrect category name - Nieprawidłowa nazwa kategorii - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - Wszystkie (0) - - - - Trackerless (0) - Bez trackera (0) - - - - Error (0) - Błędne (0) - - - - Warning (0) - Z ostrzeżeniem (0) - - - - - Trackerless (%1) - Bez trackera (%1) - - - - - Error (%1) - Błędne (%1) - - - - - Warning (%1) - Z ostrzeżeniem (%1) - - - - Resume torrents - Wznów torrenty - - - - Pause torrents - Wstrzymaj torrenty - - - - Delete torrents - Usuń torrenty - - - - - All (%1) - this is for the tracker filter - Wszystkie (%1) + + Message + Komunikat - - - TrackerListWidget - - + + Working Działa - + Disabled Wyłączone - + This torrent is private - Ten torrent jest prywatny + Torrent prywatny - + Updating... Aktualizowanie... - + Not working Nie działa - + Not contacted yet Niesprawdzony - - - - - - - N/A - Nie dotyczy + + Tracker URL: + Adres trackera: - + Tracker editing - Edytowanie trackera - - - - Tracker URL: - Adres URL trackera: + Edycja trackera - - + + Tracker editing failed - Edytowanie trackera nie powiodła się + Edycja trackera nie powiodła się - + The tracker URL entered is invalid. - Wprowadzony adres URL trackera jest nieprawidłowy. + Wprowadzony adres trackera jest nieprawidłowy. - + The tracker URL already exists. - Adres URL trackera już istnieje. + Adres trackera już istnieje. - + Add a new tracker... - Dodaj nowy tracker... + Dodaj tracker... - - Remove tracker - Usuń tracker - - - + Copy tracker URL Kopiuj adres URL trackera - + Edit selected tracker URL - Edytuj adres URL wybranego trackera + Edytuj adres wybranego trackera - + Force reannounce to selected trackers Wymuś rozgłoszenie do wybranych trackerów - + Force reannounce to all trackers Wymuś rozgłoszenie do wszystkich trackerów - - URL - Adres URL: - - - - Status - Status - - - - Received - Odebrano - - - - Seeds - Seedy - - - - Peers - Partnerzy - - - - Downloaded - Pobrano - - - - Message - Komunikat - - - - Column visibility - Widoczność kolumy - - - - TrackerLoginDialog - - - - Tracker authentication - Uwierzytelnianie trackera - - - - Tracker: - Tracker: - - - - Login - Login - - - - Username: - Nazwa użytkownika: - - - - Password: - Hasło: - - - - Log in - Zaloguj + + Remove tracker + Usuń tracker - TrackersAdditionDialog + TrackersAdditionDlg - + Trackers addition dialog - Okno dodawania trackerów + Dodawanie trackerów - + List of trackers to add (one per line): Lista trackerów do dodania (po jednym w wierszu): - - + + µTorrent compatible list URL: Adres kompatybilny z µTorrent: - + + I/O Error + Błąd we/wy + + + + Error while trying to open the downloaded file. + Błąd podczas próby otwarcia pobranego pliku. + + + No change Bez zmian - + No additional trackers were found. Nie znaleziono dodatkowych trackerów. - + Download error Błąd pobierania - + The trackers list could not be downloaded, reason: %1 - Nie można pobrać listy trackerów, powód %1 + Nie można pobrać listy trackerów z powodu %1 TransferListDelegate - + Downloading Pobieranie - + Downloading metadata used when loading a magnet link Pobieranie metadanych - + Allocating qBittorrent is allocating the files on disk Alokowanie - + Paused Wstrzymany - + Queued i.e. torrent is queued W kolejce - + Seeding Torrent is complete and in upload-only mode Seedowanie - + Stalled Torrent is waiting for download to begin Oczekujący - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [W] Pobieranie - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [W] Seedowanie - + Checking Torrent local data is being checked Sprawdzanie - + Queued for checking i.e. torrent is queued for hash checking W kolejce do sprawdzenia - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Sprawdzanie danych wznawiania - + Completed Ukończone - - Moving - Torrent local data are being moved/relocated - Przenoszenie - - - + Missing Files Brakujące pliki - + Errored torrent status, the torrent has an error Błędne - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (seedowany przez %2) - + %1 ago e.g.: 1h 20m ago %1 temu @@ -9185,580 +8150,594 @@ TransferListFiltersWidget - - - Status - Status - - - - Categories - Kategorie - - - - Tags - Znaczniki - - - - Trackers - Trackery - - - - TransferListModel - - - Name - i.e: torrent name - Nazwa - - - - Size - i.e: torrent size - Rozmiar - - - - Done - % Done - Ukończono - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Status - - - - Seeds - i.e. full sources (often untranslated) - Seedy - - - - Peers - i.e. partial sources (often untranslated) - Partnerzy - - - - Down Speed - i.e: Download speed - Prędkość pobierania - - - - Up Speed - i.e: Upload speed - Prędkość wysyłania - - - - Ratio - Share ratio - Udział - - - - ETA - i.e: Estimated Time of Arrival / Time left - ETA - - - - Category - Kategoria - - - - Tags - Znaczniki - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - Dodano - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - Ukończono - - - - Tracker - Tracker - - - - Down Limit - i.e: Download limit - Limit pobierania - - - - Up Limit - i.e: Upload limit - Limit wysyłania - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Pobrano - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Wysłano - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - Pobrane w sesji - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - Wysłane w sesji - - - - Remaining - Amount of data left to download (e.g. in MB) - Pozostało - - - - Time Active - Time (duration) the torrent is active (not paused) - Aktywny przez - - - - Save path - Torrent save path - Ścieżka zapisu - - - - Completed - Amount of data completed (e.g. in MB) - Ukończone - - - - Ratio Limit - Upload share ratio limit - Limit współczynnika udziału - - - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - Ostatni raz widziany kompletny + + + Status + Status - - Last Activity - Time passed since a chunk was downloaded/uploaded - Ostatnia aktywność + + Categories + Kategorie - - Total Size - i.e. Size including unwanted data - Całkowity rozmiar + + Trackers + Trackery TransferListWidget - + Column visibility Widoczność kolumn - + Choose save path Wybierz katalog docelowy - + Torrent Download Speed Limiting - Limitowanie prędkości pobierania torrenta + Ograniczanie prędkości pobierania torrenta - + Torrent Upload Speed Limiting - Limitowanie prędkości wysyłania torrenta + Ograniczanie prędkości wysyłania torrenta - + Recheck confirmation Potwierdzenie ponownego sprawdzania - + Are you sure you want to recheck the selected torrent(s)? Czy na pewno ponownie sprawdzić wybrane torrenty? - + Rename Zmień nazwę - + New name: Nowa nazwa: - + Resume Resume/start the torrent Wznów - + Force Resume Force Resume/start the torrent Wymuś wznowienie - + Pause Pause the torrent Wstrzymaj - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Ustaw położenie: przenoszenie "%1", z "%2" do "%3" - - - - Add Tags - Dodaj znaczniki - - - - Remove All Tags - Usuń wszystkie znaczniki - - - - Remove all tags from selected torrents? - Usunąć wszystkie znaczniki z wybranych torrentów? + + New Category + Nowa kategoria - - Comma-separated tags: - Znaczniki rozdzielone przecinkami: + + Category: + Kategoria: - - Invalid tag - Niepoprawny znacznik + + Invalid category name + Nieprawidłowa nazwa kategorii - - Tag name: '%1' is invalid - Nazwa znacznika '%1' jest nieprawidłowa + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Nazwa kategorii nie może zawierać '\'. +Nazwa kategorii nie może się rozpoczynać/kończyć '/'. +Nazwa kategorii nie może zawierać sekwencji '//'. - + Delete Delete the torrent Usuń - + Preview file... Podgląd pliku... - + Limit share ratio... - Limituj współczynnik udziału... + Ogranicz współczynnik udziału... - + Limit upload rate... - Limituj prędkości wysyłania... + Ogranicz prędkości wysyłania... - + Limit download rate... - Limituj prędkości pobierania... + Ogranicz prędkości pobierania... - + Open destination folder Otwórz katalog pobierań - + Move up i.e. move up in the queue Przenieś w górę - + Move down i.e. Move down in the queue Przenieś w dół - + Move to top i.e. Move to top of the queue Przenieś na początek - + Move to bottom i.e. Move to bottom of the queue Przenieś na koniec - + Set location... - Ustaw położenie... - - - - Force reannounce - Wymuś rozgłoszenie + Zmień położenie... - + Copy name Kopiuj nazwę - - Copy hash - Kopiuj hash - - - + Download first and last pieces first Pobierz najpierw część pierwszą i ostatnią - + Automatic Torrent Management Automatyczne zarządzanie torrentem - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category Tryb automatyczny oznacza, że różne właściwości torrenta (np. ścieżka zapisu) będą ustalane przez przyporządkowaną kategorię - + Category Kategoria - + New... New category... Nowa... - + Reset Reset category Resetuj - - Tags - Znaczniki - - - - Add... - Add / assign multiple tags... - Dodaj... - - - - Remove All - Remove all tags - Usuń wszystkie - - - + Priority Priorytet - + Force recheck Sprawdź pobrane dane - + Copy magnet link Kopiuj odnośnik magnet - + Super seeding mode Tryb super-seeding - + Rename... Zmień nazwę... - + Download in sequential order Pobierz w kolejności sekwencyjnej - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - Limitowanie współczynnika wysyłania i pobierania torrenta + Ograniczanie współczynnika udziału - - Use global share limit - Użyj globalnego limitu udziału + + Use global ratio limit + Użyj globalnego limitu - - - + + + buttonGroup buttonGroup - - Set no share limit - Ustaw bez limitu udziału + + Set no ratio limit + Ustaw bez limitu + + + + Set ratio limit to + Ustaw limit na + + + + WebApplication + + + Incorrect category name + Nieprawidłowa nazwa kategorii + + + + WebUI + + + The Web UI is listening on port %1 + Sieciowy interfejs użytkownika nasłuchuje na porcie %1 + + + + Web UI Error - Unable to bind Web UI to port %1 + Błąd sieciowego interfejsu użytkownika: nie można połączyć sieciowego interfejsu użytkownika z portem %1 + + + about - - Set share limit to - Ustaw limit udziału na + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Zaawansowany klient BitTorrent napisany w języku C++ z wykorzystaniem bibliotek Qt i libtorrent-rasterbar. - - ratio - udział + + Copyright %1 2006-2016 The qBittorrent project + Copyright %1 2006-2016 The qBittorrent project - - minutes - minuty + + Home Page: + Strona domowa: - - No share limit method selected - Nie wybrano metody limitu udziału + + Forum: + Forum: - - Please select a limit method first - Proszę najpierw wybrać metodę limitu + + Bug Tracker: + Śledzenie błędów: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - Wykryto Pythona, wersja: %1 + + Add Peers + Dodaj partnerów - - Python not detected - Nie wykryto Pythona + + List of peers to add (one per line): + Lista partnerów do dodania (po jednym w wierszu): + + + + Format: IPv4:port / [IPv6]:port + Format: IPv4:port / [IPv6]:port - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - Niedozwolony typ pliku, dozwolone są tylko zwykłe pliki. + + + Tracker authentication + Uwierzytelnianie trackera - - Symlinks inside alternative UI folder are forbidden. - Dowiązania symboliczne w alternatywnym folderze interfejsu są zabronione. + + Tracker: + Tracker: - - Exceeded the maximum allowed file size (%1)! - Przekroczono maksymalny dozwolony rozmiar pliku (%1)! + + Login + Login - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - Interfejs WWW: Niedopasowanie nagłówka źródłowego i źródła celu! Źródło IP: '%1'. Nagłówek źródłowy: '%2'. Źródło celu: '%3' + + Username: + Nazwa użytkownika: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - Interfejs WWW: Niedopasowanie nagłówka odsyłacza i źródła celu! Źródło IP: '%1'. Nagłówek odsyłacza: '%2'. Źródło celu: '%3' + + Password: + Hasło: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - Interfejs WWW: Nieprawidłowy nagłówek hosta, niedopasowanie portu. Źródło IP żądania: '%1'. Port serwera: '%2'. Odebrany nagłówek hosta: '%3' + + Log in + Zaloguj - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - Interfejs WWW: Nieprawidłowy nagłówek hosta. Źródło IP żądania: '%1'. Nagłówek hosta: '%2' + + Cancel + Anuluj - WebUI + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + Potwierdzenia usuwania - qBittorrent + + + + Remember choice + Zapamiętaj wybór + + + + Also delete the files on the hard disk + Usuń także dane z twardego dysku + + + + confirmShutdownDlg + + + Don't show again + Nie pokazuj ponownie + + + + createTorrentDialog + + + Cancel + Anuluj + + + + Torrent Creation Tool + Kreator plików torrent + + + + Torrent file creation + Tworzenie pliku torrent + + + + Add file + Dodaj plik + + + + Add folder + Dodaj katalog + + + + File or folder to add to the torrent: + Plik lub katalog, który ma zostać dodany do torrenta: + + + + Tracker URLs: + Adresy trackerów: + - - Web UI: HTTPS setup successful - Interfejs WWW: pomyślna konfiguracja HTTPS + + Web seeds urls: + Adresy seedów sieciowych: - - Web UI: HTTPS setup failed, fallback to HTTP - Interfejs WWW: nieprawidłowa konfiguracja HTTPS, powrót do HTTP + + Comment: + Komentarz: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Można oddzielić warstwy / grupy trackerów pustym wierszem. + + + + Piece size: + Rozmiar części: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + Auto + + + + Private (won't be distributed on DHT network if enabled) + Prywatny (po zaznaczeniu torrent nie będzie rozprowadzany w sieci DHT) + + + + Start seeding after creation + Rozpocznij seedowanie po utworzeniu + + + + Ignore share ratio limits for this torrent + Ignoruj współczynnik udziału dla tego torrenta + + + + Create and save... + Utwórz i zapisz... + + + + Progress: + Postęp: + + + + downloadFromURL + + + Add torrent links + Dodaj odnośniki do plików torrent + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Jeden na wiersz (dozwolone są odnośniki HTTP, Magnet oraz info-hash) + + + + Download + Pobierz + + + + Cancel + Anuluj + + + + Download from urls + Pobierz z adresów URL + + + + No URL entered + Nie wprowadzono adresu URL - - Web UI: Now listening on IP: %1, port: %2 - Interfejs WWW: teraz nasłuchuje IP: %1, port: %2 + + Please type at least one URL. + Podaj przynajmniej jeden adres URL. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Interfejs WWW: nie można powiązać z IP: %1, port: %2. Powód: %3 + + Crash info + Informacje o błędzie fsutils - + + + + + Downloads Pobrania @@ -9766,100 +8745,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + Nie wykryto Pythona + + + + Python version: %1 + Wersja Pythona: %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1h %2m - + %1d %2h e.g: 2days 10hours %1d %2h - + Unknown Unknown (size) Nieznany - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent wyłączy teraz komputer, ponieważ pobieranie zostało ukończone. - + < 1m < 1 minute < 1m - + %1m e.g: 10minutes %1m + + + Working + Działa + + + + Updating... + Aktualizowanie... + + + + Not working + Nie działa + + + + Not contacted yet + Niesprawdzony + preview - + Preview selection Podgląd wybranego - + The following files support previewing, please select one of them: Podgląd jest możliwy dla poniższych plików - wybierz jeden z nich: + + + Preview + Podgląd + + + + Cancel + Anuluj + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_pt_BR.ts qbittorrent-3.3.15/src/lang/qbittorrent_pt_BR.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_pt_BR.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_pt_BR.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - Sobre o qBittorrent + Sobre qBittorrent - + About Sobre - + Author Autor - - Current maintainer - Mantenedor atual - - - - Greece - Grécia - - - - + + Nationality: Nacionalidade: - - + + + Name: + Nome: + + + + E-mail: E-mail: - - - Name: - Nome: + + Greece + Grécia - - Original author - Autor original + + Current maintainer + Atual mantenedor - - France - França + + Original author + Autor original - + Special Thanks - Agradecimentos Especiais + Agradecimentos especiais - + Translators Tradutores - - License - Licença - - - + Libraries Bibliotecas - + qBittorrent was built with the following libraries: - O qBittorrent foi criado com as seguintes bibliotecas: - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - Um cliente BitTorrent avançado escrito em C++, baseado no Qt toolkit e libtorrent-rasterbar. - - - - Copyright %1 2006-2018 The qBittorrent project - Copyright %1 2006-2018 The qBittorrent project - - - - Home Page: - Site: + O qBittorrent foi construído com as seguintes bibliotecas: - - Forum: - Fórum: + + France + França - - Bug Tracker: - Rastreador de bug: + + License + Licença @@ -115,57 +90,67 @@ Salvar em - + + Browse... + Pesquisar... + + + + Set as default save path + Salvar como caminho padrão de salvamento + + + Never show again - Não mostrar novamente + Nunca mais mostrar - + Torrent settings Configurações de torrent - + Set as default category Definir como categoria padrão - + Category: Categoria: - + Start torrent Iniciar torrent - + Torrent information Informações do torrent - + Skip hash check Pular checagem de hash - + Size: Tamanho: - + Hash: Hash: - + Comment: Comentário: - + Date: Data: @@ -177,7 +162,7 @@ Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - O modo automático configura várias propriedades do torrent (ex: caminho para salvar) baseado na categoria associada + O modo automático configura várias propriedades do torrent (ex.: caminho para salvar) baseado na categoria associada @@ -190,117 +175,89 @@ Automático - - Remember last used save path - Lembrar último caminho para salvar usado - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog Se marcado, o arquivo .torrent não será excluído apesar das configuraçãoes da página "Download" do diálogo de opções - + Do not delete .torrent file Não excluir arquivo .torrrent - - Create subfolder - Criar subpasta - - - - Download in sequential order - Baixar em ordem sequencial - - - - Download first and last pieces first - Baixar a primeira e a última parte primeiro - - - + Normal Normal - + High Alto - + Maximum Máximo - + Do not download Não baixar - - - + + + I/O Error Erro de entrada e saída - + Invalid torrent Torrent inválido - - Renaming - Renomeando - - - - - Rename error - Renomear erro - - - - The name is empty or contains forbidden characters, please choose a different one. - O nome está vazio ou contém caracteres proibidos. Por favor escolha um nome diferente. + + + + + Already in download list + Já está na lista de download - + Not Available This comment is unavailable Não Disponível - + Not Available This date is unavailable Não Disponível - + Not available Não disponível - + Invalid magnet link Link magnético inválido - + The torrent file '%1' does not exist. - O arquivo torrent '%1' não existe. + O arquivo . torrent '%1' não existe. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. O arquivo torrent '%1' não pode ser lido a partir do disco. Provavelmente você não possui permissões suficientes. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ Erro: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torrent já está na lista de download. Os trackers não foram fundidos porque este é um torrent privado. + + + + Torrent is already in download list. Trackers were merged. + Torrent já está na lista de download. Trackers foram fundidos. + + + + + Cannot add torrent + Não foi possível adicionar torrente + + + + Cannot add this torrent. Perhaps it is already in adding state. + Não foi possível adicionar este torrent. Talvez ele já esteja sendo adicionado. + + + This magnet link was not recognized Este link magnético não foi reconhecido - + + Magnet link is already in download list. Trackers were merged. + Este magnet já está na lista de downloads. Os trackers foram adicionados. + + + + Cannot add this torrent. Perhaps it is already in adding. + Não foi possível adicionar este torrent. Talvez ele já esteja sendo adicionado. + + + Magnet link Link magnético - + Retrieving metadata... Capturando informações... - + Not Available This size is unavailable. Não Disponível - + Free space on disk: %1 Espaço livre no disco: %1 - + + Choose save path Escolha o caminho de salvamento - - - - - - - Torrent is already present - Este torrent já está presente - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - O torrent '%1' já está na lista de transferências. O trackers não foram mesclados pois este é um torrent privado. - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - O torrent '%1' já está na lista de transferências. Os trackers foram mesclados. - - - - Torrent is already queued for processing. - O torrent já está na fila para ser processado. + + Rename the file + Renomeie o arquivo - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - O link magnético '%1' já está na lista de transferências. Os trackers foram mesclados. + + New name: + Novo nome: - - Magnet link is already queued for processing. - O link magnético já está na fila para ser processado. + + + The file could not be renamed + O arquivo não pôde ser renomeado - - New name: - Novo nome: + + This file name contains forbidden characters, please choose a different one. + Este nome contém caracteres proibidos, por favor escolha um diferente. - - + + This name is already in use in this folder. Please use a different name. Este nome já está em uso nessa pasta. Por favor escolha um diferente. - + The folder could not be renamed Esta pasta não pode ser renomeada - + Rename... Renomear... - + Priority Prioridade - + Invalid metadata Metadados inválido - + Parsing metadata... Analisando metadados... - + Metadata retrieval complete Captura de metadados completa - + Download Error Erro no download @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Tamanho de cache em disco + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Portas de saída (Min) [0: Desabilitado] - + Outgoing ports (Max) [0: Disabled] Portas de saída (Max) [0: Desabilitado] - + Recheck torrents on completion Rechecar torrents quando concluir - + Transfer list refresh interval Intervalo de atualização da lista de transferência - + ms milliseconds ms - + Setting Configuração - + Value Value set for this setting Valor - - - (disabled) - (desabilitado) - - - + (auto) (auto) - - min - minutes - min. - - - + All addresses Todos os endereços - + qBittorrent Section Seção qBittorrent - - + + Open documentation Abrir documentação - + libtorrent Section Seção libtorrent - - Asynchronous I/O threads - Segmentos de E/S assíncronos - - - - Disk cache - Cache em disco - - - + s seconds s - + Disk cache expiry interval Intervalo de expiração de cache de disco - + Enable OS cache Ativar cache do sistema operacional - - Guided read cache - Cache de leitura guiado - - - - Coalesce reads & writes - Leituras & escritas de junção - - - - Send upload piece suggestions - Enviar sugestões de partes de upload - - - - - KiB - KiB - - - - Send buffer watermark - Enviar marca d'água do buffer - - - - Send buffer low watermark - Enviar marca d'água de buffer baixo - - - - Send buffer watermark factor - Enviar fator de marca d'água do buffer - - - - Prefer TCP - Preferir TCP - - - - Peer proportional (throttles TCP) - Peer proporcional (limita o TCP) - - - - Allow multiple connections from the same IP address - Permitir múltiplas conexões a partir do mesmo endeeço IP + + m + minutes + min - + Resolve peer countries (GeoIP) Determinar países dos pares (GeoIP) - + Resolve peer host names Determinar nomes dos pares - + Strict super seeding Super semeador - + Network Interface (requires restart) Interface de rede (requer reinício) - + Optional IP Address to bind to (requires restart) Endereço de IP opcional para ligar-se (necessário reiniciar) - + Listen on IPv6 address (requires restart) Ouvir no endereço IPv6 (requer reinicialização) - + Display notifications Exibir notificações - + Display notifications for added torrents Exibe notificações para torrents adicionados - + Download tracker's favicon Baixar favicon do tracker - - Save path history length - Salvar o comprimento do histórico do caminho - - - - Fixed slots - Slots fixos - - - - Upload rate based - Baseado em taxa de upload - - - - Upload slots behavior - Comportamento dos slots de upload - - - - Round-robin - Round-robin - - - - Fastest upload - Upload mais rápido - - - - Anti-leech - Anti-leech - - - - Upload choking algorithm - Algoritmo de bloqueio de upload - - - + Confirm torrent recheck Confirmar re-checagem - - Confirm removal of all tags - Confirmar remoção de todas as tags - - - - Always announce to all trackers in a tier - Sempre anunciar para todos os trackers em um nível + Exchange trackers with other peers + Trocar trackers com outros pares - - Always announce to all tiers - Sempre anunciar para todos os níveis + + Always announce to all trackers + Sempre anunciar para todos os trackers - + Any interface i.e. Any network interface Qualquer interface - + Save resume data interval How often the fastresume file is saved. Gravar intervalo de dados de continuação - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - Algoritmo de modo misto %1-TCP - - - + Maximum number of half-open connections [0: Unlimited] Número máximo de conexões semiabertas [0: Ilimitado] - + IP Address to report to trackers (requires restart) Endereço IP para reportar aos trackers (requer reinicio) - + Enable embedded tracker Ativar tracker embutido - + Embedded tracker port Porta do tracker embutido - + Check for software updates Verificar atualizações - + Use system icon theme Usar tema de ícone do sistema @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 iniciado - + Torrent: %1, running external program, command: %2 Torrent: %1, executando programa externo, comando: %2 - - Torrent name: %1 - Nome do torrent: %1 - - - - Torrent size: %1 - Tamanho do torrent: %1 - - - - Save path: %1 - Caminho para salvar: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - O torrent foi baixado em %1. - - - - Thank you for using qBittorrent. - Obrigado por usar o qBittorrent. - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] %1 terminou o download + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrent: %1, executar programa externo - comando muito longo (tamanho > %2), falha na execução. - + Torrent: %1, sending mail notification Torrent: %1, enviando notificação por e-mail - + Information Informação - - To control qBittorrent, access the Web UI at %1 - Para controlar o qBittorrent, acesse a interface Web em %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + Para controlar o qBittorrent, acesse a Interface do Usuário na Web em http://localhost:%1 - + The Web UI administrator user name is: %1 O nome do administrador da Interface Web é: %1 - + The Web UI administrator password is still the default one: %1 - A senha do administrador da Interface Web do usuário ainda é a padrão: %1 + A senha do administrador da Interface Web do usuário ainda é a padrão: 1% - + This is a security risk, please consider changing your password from program preferences. Este é um risco de segurança, por favor considere mudar a sua senha nas opções do programa. - + Saving torrent progress... Salvando o progresso do torrent... - - - Portable mode and explicit profile directory options are mutually exclusive - As opções de modo portátil e pasta de perfil explícito são mutuamente exclusivas - - - - Portable mode implies relative fastresume - O modo portátil implica em resumo rápido relativo - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - Falha no login WebAPI. Motivo: o IP foi banido, IP: %1, nome de usuário: %2 - - - - Your IP address has been banned after too many failed authentication attempts. - Seu endereço IP foi banido após várias tentativas de autenticação com falha. - - - - WebAPI login success. IP: %1 - Login WebAPI bem sucedido. IP: %1 - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - Falha no login WebAPI. Motivo: credenciais inválidas, contagem de tentativas: %1, IP: %2, nome de usuário: %3 - AutomatedRssDownloader - + Save to: Salvar em: @@ -861,817 +658,680 @@ Baixador RSS - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - O download automático de torrents RSS está desativado agora! Você pode ativá-lo nas configurações do programa. + + Enable Automated RSS Downloader + Ativar Baixador RSS Automático - + Download Rules Regras de Download - + Rule Definition Definição da Regra - + Use Regular Expressions Usar Expressões Regulares - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - O Filtro Inteligente de Episódios irá verificar o número do episódio para prevenir baixar arquivos duplicados. -Suporta os formatos: S01E01, 1x1, 2017.01.01 e 01.01.2017 (Suporte também para formatos de data - como um separador) - - - - Use Smart Episode Filter - Usar Filtro Inteligente de Episódios - - - + Must Contain: Deve Conter: - + Must Not Contain: Não Deve Conter: - + Episode Filter: Filtro de Episódio: - + Assign Category: Atribuir categoria: - + Save to a Different Directory Salvar em uma Pasta Diferente - + Ignore Subsequent Matches for (0 to Disable) ... X days Ignorar Resultados Subsequentes por (0 para Desabilitar) - + Disabled - Desativado + Desabilitado - + days - dias + dias - + Add Paused: - Adicionar pausado: + Adicionar pausad: - + Use global settings Usar configurações globais - + Always Sempre - + Never Nunca - + Apply Rule to Feeds: Aplicar Regra aos Feeds: - + Matching RSS Articles Artigos RSS Correspondentes - + &Import... &Importar... - + &Export... &Exportar... - + Matches articles based on episode filter. Iguala artigos baseado no filtro de episódios. - + Example: - Exemplo: + Exemplo: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match - resultará nos episódios 2, 5, 8 a 15 e 30 em diante da temporada um + resultará nos episódios 2, 5, 8 a 15 e 30 em diante da temporada um - + Episode filter rules: - Regras do filtro de episódios: + Regras do filtro de episódios: - + Season number is a mandatory non-zero value Número da temporada é um valor obrigatório diferente de zero - + Episode number is a mandatory non-zero value + Número do episódio é um valor obrigatório diferente de zero + + + Filter must end with semicolon O filtro deve terminar com ponto e vírgula - + Three range types for episodes are supported: - Três tipos de intervalo para episódios são suportados: + Três tipos de intervalo para episódios são suportados: - + Single number: <b>1x25;</b> matches episode 25 of season one Número único: <b>1x25;</b> combina com o episódio 25 da temporada um - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Intervalo normal: <b>1x25-40;</b> combina com os episódios 25 a 40 da temporada um - - Episode number is a mandatory positive value - O número do episódio é um valor positivo obrigatório - - - - Rules - Regras + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Intervalo infinito: <b>1x25-;</b> combina com os episódios 25 em diante da temporada um - - Rules (legacy) - Regras (legado) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Intervalo infinito: <b>1x25-;</b> combina com os episódios 25 em diante da temporada um, e todos os episódios das temporadas posteriores + - + Last Match: %1 days ago Última Correspondência: %1 dias atrás - + Last Match: Unknown Última Correspondência: Desconhecida - + New rule name Nome da nova regra - + Please type the name of the new download rule. Por favor digite o nome da nova regra de download. - - + + Rule name conflict Conflito no nome da regra - - + + A rule with this name already exists, please choose another name. Uma regra com o mesmo nome existe, por favor escolha outro. - + Are you sure you want to remove the download rule named '%1'? Quer mesmo remover a regra de download de nome %1? - + Are you sure you want to remove the selected download rules? Quer mesmo remover as regras de download selecionadas? - + Rule deletion confirmation Confirmação de exclusão de regra - + Destination directory Diretório de destino - + Invalid action Ação inválida - + The list is empty, there is nothing to export. A lista está vazia, não há nada para exportar. - - Export RSS rules - Exportar regras do RSS + + Where would you like to save the list? + Onde gostaria de salvar a lista? - - + + Rules list (*.rssrules) + Lista de regras (*.rssrules) + + + I/O Error - Erro de E/S + Erro de I/O - - Failed to create the destination file. Reason: %1 - Falha ao criar o arquivo de destino. Motivo: %1 + + Failed to create the destination file + Falha ao criar o arquivo de destino - - Import RSS rules - Importar regras do RSS + + Please point to the RSS download rules file + Por favor aponte para o arquivo de regras de download RSS - - Failed to open the file. Reason: %1 - Falha ao abrir o arquivo. Motivo: %1 + + Rules list + Lista de regras - + Import Error - Erro de Importação + Erro de importação - - Failed to import the selected rules file. Reason: %1 - Falha ao importar o arquivo de regras selecionado. Motivo: %1 + + Failed to import the selected rules file + Falha ao importar o arquivo de regras selecionado - + Add new rule... Adicionar nova regra... - + Delete rule Deletar regra - + Rename rule... Renomear regra... - + Delete selected rules Deletar regras selecionadas - - Clear downloaded episodes... - Limpar episódios baixados... - - - + Rule renaming Renomeando regra - + Please type the new rule name Por favor digite o novo nome da regra - - Clear downloaded episodes - Limpar episódios baixados - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - Deseja realmente limpar a lista de episódios baixados da regra selecionada? - - - - Regex mode: use Perl-compatible regular expressions - Modo Regex: usar expressões regulares compatíveis com Perl + + Regex mode: use Perl-like regular expressions + Modo Regex: Usar expressões regulares estilo Perl - - - Position %1: %2 - Posição %1: %2 - - - + Wildcard mode: you can use - Modo curinga: você pode usar + - + ? to match any single character - ? para corresponder a qualquer caractere único + - + * to match zero or more of any characters - * para corresponder a zero ou mais caracteres + - + Whitespaces count as AND operators (all words, any order) - Espaços em branco contam como operadores AND (todas as palavras, qualquer ordem) + - + | is used as OR operator - | é usado como operador OR + - + If word order is important use * instead of whitespace. - Se as ordem das palavras é importante, use * em vez de espaço em branco. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Uma expressão com uma cláusula %1 vazia (ex. %2) + - + will match all articles. - irá corresponder todos os artigos. + - + will exclude all articles. - irá excluir todos os artigos. - - - - BanListOptionsDialog - - - List of banned IP addresses - Lista de endereços IP banidos - - - - Ban IP - Banir IP - - - - Delete - Excluir - - - - - Warning - Aviso + - - The entered IP address is invalid. - O endereço IP inserido é inválido. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Modo coringa: você pode usar<ul><li>? para atingir um caracter</li><li>* para atingir zero ou mais de vários caracteres</li><li>Espaços vazios contam como operador AND</li></ul> - - The entered IP is already banned. - O endereço IP inserido já está banido. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Modo coringa: você pode usar<ul><li>? para atingir um caracter</li><li>* para atingir zero ou mais de vários caracteres</li><li>| é usado como como operador OR</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support - É necessário reiniciar para alterar o suporte a PeX - - - - Could not get GUID of configured network interface. Binding to IP %1 - Não foi possível obter o GUID da interface de rede configurada. Vinculando ao IP %1 + É necessário reinicar para alterar o suporte a PeX. - + Embedded Tracker [ON] Tracker embutido [LIGADO] - + Failed to start the embedded tracker! - Falha ao iniciar o tracker embutido! + Falha ao iniciar o tracker embutido. - + Embedded Tracker [OFF] Tracker embutido [DESLIGADO] - + + '%1' reached the maximum ratio you set. Removing... + '%1' alcançou a proporção máxima definida. Removendo... + + + + '%1' reached the maximum ratio you set. Pausing... + '%1' alcançou a proporção máxima definida. Pausando... + + + System network status changed to %1 e.g: System network status changed to ONLINE Estado de rede do sistema alterado para %1 - + ONLINE ONLINE - + OFFLINE OFFLINE - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding A configuração de rede de %1 foi alterada, atualizando ligação da sessão - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. O endereço %1 da interface de rede definida é inválida. - - + Encryption support [%1] Suporte a criptografia [%1] - - + FORCED FORÇADO - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 não é um endereço IP válido e foi rejeitado ao aplicar a lista de endereços banidos. - - - - + Anonymous mode [%1] Modo anônimo [%1] - + Unable to decode '%1' torrent file. Impossível decodificar o arquivo torrent '%1'. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Download recursivo do arquivo '%1' embutido no torrent '%2' - + Queue positions were corrected in %1 resume files - As posições na fila foram corrigidas em %1 arquivos de resumo + - + Couldn't save '%1.torrent' Não foi possível salvar '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' foi removido da lista de transferências. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' foi removido da lista de transferências e do disco rígido. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '%1' foi removido da lista de transferências, mas os arquivos não foram excluídos. Erro: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. pois %1 está desabilitado. - + because %1 is disabled. this peer was blocked because TCP is disabled. pois %1 está desabilitado. - + URL seed lookup failed for URL: '%1', message: %2 Falha na procura de seeds falhou para url: '%1', mensagem: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. - O qBittorrent falhou ao escutar na porta da interface %1: %2/%3. Motivo: %4. + O qBittorrent falhou ao escutar na porta da interface %1: %2/%3. Motivo: %4 - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' foi removido da lista de transferência e do disco rígido. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' foi removido da lista de transferência. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... - Baixando '%1'. Por favor, aguarde... + Baixando '%1'. Por favor, aguarde. - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent está tentando escutar em qualquer porta de interface: %1 - + The network interface defined is invalid: %1 A interface de rede definida é inválida: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 O qBittorrent está tentando escutar na porta da interface %1: %2 - - Peer ID: - ID do Peer: - - - - HTTP User-Agent is '%1' - O usuário agente HTTP é '%1' - - - - + DHT support [%1] Suporte a DHT [%1] - - - - - - - - - + + + + ON LIGADO - - - - - - - - - + + + + OFF DESLIGADO - - + Local Peer Discovery support [%1] Suporte para Descoberta de Peer Local [%1] - - PeX support [%1] - Suporte a PeX [%1] - - - - '%1' reached the maximum ratio you set. Removed. - '%1' alcançou a proporção máxima definida. Removido. - - - - '%1' reached the maximum ratio you set. Paused. - '%1' alcançou a proporção máxima definida. Pausado. - - - - '%1' reached the maximum seeding time you set. Removed. - '%1' alcançou o tempo máximo de semeadura definido. Removido. + Restart is required to toggle Tracker Exchange support + É necessário reiniciar para alternar o suporte para Troca de Trackers - - '%1' reached the maximum seeding time you set. Paused. - '%1' alcançou o tempo máximo de semeadura definido. Pausado. - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on O qBittorrent não encontrou um endereço local %1 no qual escutar - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface - O qBittorrent não conseguiu escutar em qualquer porta de interface: %1. Motivo: %2. + O qBittorrent não conseguiu escutar em qualquer porta de interface: % 1. Motivo: %2. - + Tracker '%1' was added to torrent '%2' O tracker '%1' foi adicionado ao torrent '%2' - + Tracker '%1' was deleted from torrent '%2' O tracker '%1' foi excluído do torrent '%2' - + URL seed '%1' was added to torrent '%2' O seed da URL '%1' foi adicionado ao torrent '%2' - + URL seed '%1' was removed from torrent '%2' O seed da URL '%1' foi removido do torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Não foi possível resumir o torrent '%1'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Filtro de IP fornecido analisado com sucesso: %1 regras foram aplicadas. - + Error: Failed to parse the provided IP filter. Erro: Falha ao analisar o filtro de IP fornecido. - - '%1' restored. - 'torrent name' restored. - '%1' restaurado. - - - + Couldn't add torrent. Reason: %1 Não foi possível adicionar o torrent. Motivo: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' resumido. (resumir rápido) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' adicionado à lista de downloads. - + An I/O error occurred, '%1' paused. %2 Ocorreu um erro de E/S, '%1' pausado. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Falha no mapeamento de porta, mensagem: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Mapeamento de porta bem sucedido, mensagem: %1 - + due to IP filter. this peer was blocked due to ip filter. devido ao filtro de IP. - + due to port filter. this peer was blocked due to port filter. devido ao filtro de porta. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. devido às restrições de modo misto i2p. - + because it has a low port. this peer was blocked because it has a low port. pois ele tem uma porta baixa. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 O qBittorrent está escutando com sucesso na porta da interface %1: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 IP externo: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - falha ao criar novo arquivo torrent - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - Baixar primeiro a primeira e a última parte: %1, torrent: '%2' - - - - On - Ligado - - - - Off - Desligado - - - - Successfully moved torrent: %1. New path: %2 - Torrent movido com sucesso: %1. Novo caminho: %2 - - - + Could not move torrent: '%1'. Reason: %2 - Não foi possível mover o torrent: %1. Motivo: %2 + Não foi possível mover torrent: '% 1'. Motivo:% 2 - + File sizes mismatch for torrent '%1', pausing it. - O tamanho dos arquivos não corresponde ao torrent '%1', pausando. + O tamanho do arquivo para o torrent '%1' está incorreto. Pausando. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... Resumo rápido rejeitado para o torrent '%1'. Motivo: %2. Verificando novamente... @@ -1679,19 +1339,19 @@ CategoryFilterModel - + Categories - Categorias + Categorias - + All - Tudo + Todos - + Uncategorized - Sem categoria + @@ -1699,42 +1359,147 @@ Add category... - Adicionar categoria... + Adicionar categoria... Add subcategory... - Adicionar subcategoria... + - Edit category... - Editar categoria... + Remove category + Remover categoria + + + + Remove unused categories + Remover categorias não utilizadas + + + + Resume torrents + Retomar torrents + + + + Pause torrents + Pausar torrents + + + + Delete torrents + + + + + New Category + Nova categoria + + + + Category: + Categoria: + + + + Invalid category name + Nome de categoria inválido + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + O nome da categoria não pode conter '\'. +O nome da categoria não pode iniciar/terminar com '/'. +O nome da categoria não pode conter a sequência '//'. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Todos (0) + + + Uncategorized (0) + Sem categoria (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Sem categoria (%1) + + + Add category... + Adicionar categoria... - Remove category - Remover categoria + Remover categoria - Remove unused categories - Remover categorias não utilizadas + Remover categorias não utilizadas - Resume torrents - Resumir torrents + Retomar torrents - Pause torrents - Pausar torrents + Pausar torrents - Delete torrents - Excluir torrents + Apagar torrents + + + New Category + Nova categoria + + + Category: + Categoria: + + + Invalid category name + Nome de categoria inválido + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + O nome da categoria não pode conter '\'. +O nome da categoria não pode iniciar/terminar com '/'. +O nome da categoria não pode conter a sequência '//'. + + + All (%1) + this is for the category filter + Todas (%1) @@ -1774,106 +1539,58 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Confirmação de exclusão - + DeletionConfirmationDlg - - Remember choice - Lembrar escolha - - - - Also delete the files on the hard disk - Excluir também os arquivos do disco rígido - - - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - Tem certeza de que deseja excluir '%1' da lista de transferências? + Tem certeza de que deseja deletar '%1' da lista de transferência? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - Você tem certeza de que deseja excluir esses %1 torrents da lista de transferências? - - - - DownloadFromURLDialog - - - Download from URLs - Baixar de URLs - - - - Add torrent links - Adicionar links torrent - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - Um link por linha (links HTTP, links magnéticos e info-hashes são suportados) - - - - Download - Baixar - - - - No URL entered - Nenhuma URL inserida - - - - Please type at least one URL. - Por favor, entre pelo menos uma URL. + Tem certeza que quer deletar estes %1 torrents da lista de transferências? DownloadedPiecesBar - + White: Missing pieces Branco: Pedaços Faltando - + Green: Partial pieces Verde: Pedaços parciais - + Blue: Completed pieces Azul: Pedaços concluídos - ExecutionLogWidget + ExecutionLog - + General Geral - + Blocked IPs - IPs Bloqueados + IPs bloqueados - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked <font color='red'>%1</font> foi bloqueado %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned <font color='red'>%1</font> foi banido @@ -1882,112 +1599,41 @@ FeedListWidget - + RSS feeds RSS feeds - - - Unread (%1) - Não lido (%1) + + Unread + Não lido FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. + + An error occured while trying to open the log file. Logging to file is disabled. Ocorreu um erro ao tentar abrir o arquivo de log. O registro de log no arquivo está desativado. - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - &Procurar... - - - - Choose a file - Caption for file open/save dialog - Escolha um arquivo - - - - Choose a folder - Caption for directory open dialog - Escolha uma pasta - - - - Any file - Qualquer arquivo - - - FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - Erro de E/S: Não foi possível abrir arquivo do filtro de IP no modo de leitura. - - - - - - IP filter line %1 is malformed. - A linha %1 do filtro de IP está mal formada. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - A linha %1 do filtro de IP está mal formada. O IP inicial do intervalo está mal formado. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - A linha %1 do filtro de IP está mal formada. O IP final do intervalo está mal formado. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - A linha %1 do filtro de IP está mal formada. Um IP é IPv4 e o outro é IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - Exceção de filtro IP lançada para a linha %1. A exceção é: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - %1 erros de análise de filtro extra de IP ocorreram. + + + + I/O Error: Could not open ip filter file in read mode. + Erro de E/S: Não foi possível abrir arquivo do filtro de IP no modo leitura. - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. Erro de Análise: O arquivo de filtro não é um arquivo P2B válido do PeerGuardian. @@ -1995,396 +1641,472 @@ GeoIPDatabase - - + + Unsupported database file size. Tamanho do arquivo de banco de dados não suportado. - + Metadata error: '%1' entry not found. Erro de metadados: Entrada '%1' não encontrada. - + Metadata error: '%1' entry has invalid type. Erro de metadados:r: Entrada '%1' tem um tipo inválido. - + Unsupported database version: %1.%2 Versão do banco de dados não suportada: %1.%2 - + Unsupported IP version: %1 Versão do IP não suportada: %1 - + Unsupported record size: %1 Tamanho de gravação não suportado: %1 - + Invalid database type: %1 Tipo do banco de dados inválido: %1 - + Database corrupted: no data section found. Banco de dados corrompido: nenhuma seção de dados encontrada. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - O tamanho da solicitação http excede o limite, fechado o soquete. Limite: %ld, IP:%s + + File + Arquivo - - Bad Http request, closing socket. IP: %s - Solicitação http incorreta, fechando o soquete. IP: %s + + Edit + Editar - - - HttpServer - + + Help + Ajuda + + + Exit qBittorrent Sair do qBittorrent - + Only one link per line Somente um link por linha - + + Download + Baixar + + + Global upload rate limit must be greater than 0 or disabled. A taxa limite de upload deve ser maior que 0 ou desabilitada. - + Global download rate limit must be greater than 0 or disabled. A taxa limite de download deve ser maior que 0 ou desabilitada. - + Alternative upload rate limit must be greater than 0 or disabled. A taxa limite de upload alternativa deve ser maior que 0 ou desabilitada. - + Alternative download rate limit must be greater than 0 or disabled. A taxa limite de download alternativa deve ser maior que 0 ou desabilitada. - + Maximum active downloads must be greater than -1. O máximo de downloads ativos deve ser maior do que -1. - + Maximum active uploads must be greater than -1. O máximo de uploads ativos deve ser maior do que -1. - + Maximum active torrents must be greater than -1. O máximo de torrents ativos deve ser maior do que -1. - + Maximum number of connections limit must be greater than 0 or disabled. O número máximo de conexões deve ser maior que 0 ou desabilitado. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. O número máximo de conexões por torrent deve ser maior que 0 ou desabilitado. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. O número máximo de slots de upload por torrent deve ser maior que 0 ou desabilitado. - + Unable to save program preferences, qBittorrent is probably unreachable. Impossível salvar preferências do programa, qBittorrent provavelmente está inatingível. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent no Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - Nome de categoria inválido: -Por favor não use caracteres especiais no nome da categoria. - - - - Unknown - Desconhecido - - - - Hard Disk - Disco Rígido - - - - Share ratio limit must be between 0 and 9998. - O limite da proporção de compartilhamento deve ser de 0 a 9998. - - - - Seeding time limit must be between 0 and 525600 minutes. - O limite do tempo de semeadura deve ser de 0 a 525600 minutos. + + Language + Linguagem - + The port used for incoming connections must be between 1 and 65535. A porta usada para conexão de entrada deve estar entre 1 e 65535. - + The port used for the Web UI must be between 1 and 65535. - A porta usada para a Interface Web deve estar entre 1 e 65535. + A porta usada para a UI Web deve estar entre 1 e 65535. - + Unable to log in, qBittorrent is probably unreachable. Não é possível fazer login; qBittorrent provavelmente está inatingível. - + Invalid Username or Password. Nome de usuário ou senha inválidos. - - Username - Nome de usuário - - - + Password Senha - + Login Login - + + Upload Failed! + Upload falhou! + + + Original authors Autores Originais - + + Upload limit: + Limite de upload: + + + + Download limit: + Limite de download: + + + Apply Aplicar - + Add Adicionar - + + Category: + Categoria: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Fazer upload de torrents - + + All + Todos + + + + Downloading + Baixando + + + + Seeding + Enviando + + + + Completed + Concluído + + + + Resumed + Resumido + + + + Paused + Pausado + + + + Active + Ativo + + + + Inactive + Inativo + + + Save files to location: Salvar arquivos no diretório: - + Cookie: Cookie: - + Type folder here Digite a pasta aqui - + + Run an external program on torrent completion + Rodar um programa externo quando completar o torrent + + + + Enable bandwidth management (uTP) + Habilitar manutenção de largura de banda (uTP) + + + + Apply rate limit to uTP connections + Aplicar taxa limite para conexões uTP + + + + Alternative Global Rate Limits + Taxa limite global alternativa + + + More information Mais informações' - + Information about certificates Informações sobre certificados - + Save Files to Salvar Arquivos em - - Set location - Definir local - - - - Limit upload rate - Taxa de limite de upload + + Watch Folder + Pasta Vigiada - - Limit download rate - Limite de taxa de download + + Default Folder + Pasta Padrão - - Rename torrent - Renomear torrent + + from + from time1 to time2 + de - - Unable to create category - + + to + from time1 to time2 + até - + Other... Save Files to: Watch Folder / Default Folder / Other... Outro... - + + Every day + Schedule the use of alternative rate limits on ... + Diariamente + + + + Week days + Schedule the use of alternative rate limits on ... + Dias da semana + + + + Week ends + Schedule the use of alternative rate limits on ... + Finais de semana + + + Monday Schedule the use of alternative rate limits on ... Segunda - + Tuesday Schedule the use of alternative rate limits on ... Terça - + Wednesday Schedule the use of alternative rate limits on ... Quarta - + Thursday Schedule the use of alternative rate limits on ... Quinta - + Friday Schedule the use of alternative rate limits on ... Sexta - + Saturday Schedule the use of alternative rate limits on ... Sábado - + Sunday Schedule the use of alternative rate limits on ... - Domingo + Doming - + + Downloaded + Is the file downloaded or not? + Baixado + + + Logout Sair - + + Download from URLs + Baixar de URLs + + + Download Torrents from their URLs or Magnet links Baixar torrents a partir de suas URLs ou links magnéticos - + Upload local torrent Fazer upload de torrent local - + Are you sure you want to delete the selected torrents from the transfer list? Deseja realmente excluir os torrents selecionados da lista de transferência? - + Save Salvar - + qBittorrent client is not reachable Cliente qBittorrent não está alcançável - - qBittorrent has been shutdown. - qBittorrent foi encerrado - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Lista branca de sub-redes IP + + HTTP Server + Servidor HTTP - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Exemplo: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Os parâmetros a seguir são suportados: - - Add subnet - Adicionar sub-rede + + Torrent path + Caminho torrent - - Delete - Remover + + Torrent name + Nome do torrent - - Error - Erro + + qBittorrent has been shutdown. + qBittorrent foi encerrado + + + LineEdit - - The entered subnet is invalid. - A sub-rede inserida é inválida. + + Clear the text + Limpa o texto LogListWidget - + Copy Copia - + Clear Limpar @@ -2417,551 +2139,493 @@ Ao Concluir os &Downloads - + &View &Ver - + &Options... &Opções... - + &Resume &Resumir - + Torrent &Creator &Criar Torrent - + Set Upload Limit... Configurar Limite de Upload... - + Set Download Limit... Configurar Limite de Download... - + Set Global Download Limit... Configurar Limite Global de Download... - + Set Global Upload Limit... Configurar Limite Global de Upload... - + Minimum Priority Prioridade Mínima - + Top Priority Prioridade Máxima - + Decrease Priority Diminuir Prioridade - + Increase Priority Aumentar Prioridade - - + + Alternative Speed Limits Limites de Velocidade Alternativos - + &Top Toolbar Barra de &Ferramentas Superior - + Display Top Toolbar Exibir Barra de Ferramentas Superior - - Status &Bar - &Barra de Status - - - + S&peed in Title Bar &Velocidade na Barra de Título - + Show Transfer Speed in Title Bar Mostrar Velocidade de Transferência na Barra de Título - + &RSS Reader Leitor de &RSS - + Search &Engine Mecanismo de &Busca - + L&ock qBittorrent Travar &o qBittorrent - + Do&nate! &Doar! - - Close Window - Fechar Janela - - - + R&esume All R&esume Todos - + Manage Cookies... Gerenciar Cookies... - + Manage stored network cookies Gerencie cookies de rede armazenados - + Normal Messages Mensagens Normais - + Information Messages Mensagens Informativas - + Warning Messages Mensagens de Aviso - + Critical Messages Mensagens Críticas - + &Log &Log - + &Exit qBittorrent Sair do qBittorr&ent - + &Suspend System &Suspender o Sistema - + &Hibernate System &Hibernar o Sistema - + S&hutdown System Desli&gar o Sistema - + &Disabled &Não fazer nada - + &Statistics E&statísticas - + Check for Updates Verificar Atualizações - + Check for Program Updates Verificar Atualizações do Programa - + &About &Sobre - + &Pause &Pausar - + &Delete &Remover - + P&ause All P&ausar Todos - + &Add Torrent File... &Adicionar Arquivo Torrent... - + Open Abrir - + E&xit &Sair - + Open URL Abrir URL - + &Documentation &Documentação - + Lock Travar - - - + + + Show Mostrar - + Check for program updates Verificar atualizações do programa - + Add Torrent &Link... Adicionar &Link Torrent... - + If you like qBittorrent, please donate! Se você curte qBittorrent, por favor faça sua doação! - - + Execution Log Execução Log - + Clear the password Limpar a senha - + Filter torrent list... Filtrar lista de torrents... - + &Set Password Definir &Senha - - Preferences - Preferências - - - + &Clear Password &Limpar Senha - + Transfers Transferências - - - qBittorrent is minimized to tray - O qBittorrent está minimizado na área de notificação - - - - - - This behavior can be changed in the settings. You won't be reminded again. - Este comportamento pode ser alterado nas configurações. Você não será mais lembrado. - - - + Torrent file association Associação de arquivo torrent - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent não é sua aplicação padrão para arquivos torrent e links magnéticos. Gostaria de associar o qBittorrent para arquivos torrent e links magnéticos? - + Icons Only Apenas ícones - + Text Only Apenas texto - + Text Alongside Icons Texto ao lado dos ícones - + Text Under Icons Texto embaixo dos ícones - + Follow System Style Seguir estilo do sistema - - - + + + UI lock password Senha de travamento da UI - - - + + + Please type the UI lock password: Por favor digite sua senha UI: - + The password should contain at least 3 characters A senha deve conter ao menos 3 caracteres - + Password update Atualiza senha - + The UI lock password has been successfully updated A senha de travamento da UI foi atualizada com sucesso - + Are you sure you want to clear the password? Tem certeza que você deseja limpar a senha? - - Use regular expressions - Usar expressões regulares - - - + Search Busca - + Transfers (%1) Transferências (%1) - + Error Erro - + Failed to add torrent: %1 Falha ao adicionar o torrent: %1 - + Torrent added Torrent adicionado - + '%1' was added. e.g: xxx.avi was added. '%1' foi adicionado. - + Download completion Completação de download - + I/O Error i.e: Input/Output Error Erro de I/O - + Recursive download confirmation Confirmação de download recursivo - + Yes Sim - + No Não - + Never Nunca - + Global Upload Speed Limit Velocidade limite global de upload - + Global Download Speed Limit Velocidade limite global de download - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - O qBittorrent foi atualizado e precisa ser reiniciado para que as mudanças sejam aplicadas. - - - - qBittorrent is closed to tray - O qBittorrent foi fechado para a área de notificação - - - - Some files are currently transferring. - Alguns arquivos estão atualmente sendo transferidos. - - - - Are you sure you want to quit qBittorrent? - Você tem certeza de que deseja fechar o qBittorrent? - - - + &No &Não - + &Yes &Sim - + &Always Yes Se&mpre Sim - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - Não foi possível determinar a sua versão do Python. Pesquisa desativada. - - - + Old Python Interpreter Interpretador antigo do Python - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. Sua versão (%1) do Python está desatualizada. Por favor, atualize para a última versão para a pesquisa funcionar. Requisito mínimo: 2.7.9 / 3.3.0. - + qBittorrent Update Available Atualização disponível para o qBittorent - + + A new version is available. +Do you want to download %1? + Uma nova versão está disponível. +Deseja baixar o %1? + + + Already Using the Latest qBittorrent Version Você está usando a versão mais recente. do qBittorrent - + Undetermined Python version Versão indeterminada do Python - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. '%1' terminou de ser baixado. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2970,158 +2634,154 @@ Motivo: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? O torrent '%1' contém arquivos torrent. Deseja prosseguir com este download? - + Couldn't download file at URL '%1', reason: %2. Não foi possível baixar arquivo na URL '%1', motivo: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin Python encontrado em %1: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + Não foi possível determinar a sua versão do Python (%1). Pesquisa desativada. + + + + Missing Python Interpreter Faltando interpretador Python - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? O Python é requerido para você poder usar a busca, mas ele parece não estar instalado. Gostaria de instalar agora? - + Python is required to use the search engine but it does not seem to be installed. O Python é requerido para usar a pesquisa, mas parece não estar instalado. - - A new version is available. - Uma nova versão está disponível. - - - - Do you want to download %1? - Deseja baixar o %1? - - - - Open changelog... - Abrir log de alterações... - - - + No updates available. You are already using the latest version. Nenhuma atualização disponível. Você já está usando a versão mais recente. - + &Check for Updates &Verificar Atualizações - + Checking for Updates... Verificando Atualizações... - + Already checking for program updates in the background Busca por atualizações do programa já está em execução em segundo plano - + Python found in '%1' Python encontrado em '%1' - + Download error Erro no download - + Python setup could not be downloaded, reason: %1. Please install it manually. A instalação do Python não pôde ser baixada, razão: %1. Por favor instale manualmente. - - + + Invalid password Senha inválida - - - + + RSS (%1) RSS (%1) - + URL download error - Erro no download da URL + Erro no download da URL. - + The password is invalid A senha está inválida - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Velocidade de download: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Velocidade de upload: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [D: %1, U: %2] qBittorrent %3 - + Hide Esconder - + Exiting qBittorrent Saindo do qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Muitos arquivos estão atualmente sendo transferidos. +Quer mesmo sair do qBittorrent? + + + Open Torrent Files Abrir Arquivos Torrent - + Torrent Files Arquivos Torrent - + Options were saved successfully. Opções foram salvas com sucesso. @@ -3129,52 +2789,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. Seu DNS dinâmico foi atualizado com sucesso. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Erro de DNS dinâmico: O serviço está temporariamente inacessível, nova tentativa em 30 minutos. - + Dynamic DNS error: hostname supplied does not exist under specified account. Erro de DNS dinâmico: o hostname fornecido não existe na conta especificada. - + Dynamic DNS error: Invalid username/password. Erro de DNS dinâmico: Usuário/Senha inválido. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Erro de DNS dinâmico: O qBittorrent está na lista negra deste serviço. Por favor, envie este bug para http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Erro de DNS dinâmico: %1 foi retornado pelo serviço. Por favor, envie este bug para http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Erro de DNS dinâmico: Seu usuário foi bloqueado por motivo de abuso. - + Dynamic DNS error: supplied domain name is invalid. Erro de DNS dinâmico: O domínio é inválido. - + Dynamic DNS error: supplied username is too short. Erro de DNS dinâmico: Usuário informado é muito pequeno. - + Dynamic DNS error: supplied password is too short. Erro de DNS dinâmico: A senha é muito pequena. @@ -3182,1413 +2842,1303 @@ Net::DownloadHandler - + I/O Error Erro de E/S - + The file size is %1. It exceeds the download limit of %2. O tamanho do arquivo é %1. Ele excede o limite de download em %2. - + Unexpected redirect to magnet URI. Redirecionamento inesperado para URI magnético. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - O host remoto não foi encontrado (host inválido) + + + GeoIP database loaded. Type: %1. Build time: %2. + Banco de dados GeoIP carregado. Tipo: %1. Data de criação: %2. - - The operation was canceled - A operação foi cancelada + + + Couldn't load GeoIP database. Reason: %1 + Não foi possível carregar o banco de dados GeoIP. Motivo: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - O servidor remoto fechou a conexão prematuramente, antes da resposta completa ter sido recebida e processada + + Venezuela, Bolivarian Republic of + Venezuela, República Bolivariana da - - The connection to the remote server timed out - A conexão com o servidor remoto atingiu o tempo limite + + Viet Nam + Vietnã - - SSL/TLS handshake failed - Handshake SSL/TLS falhou + + + N/A + N/A - - The remote server refused the connection - O servidor remoto recusou a conexão + + Andorra + Andorra - - The connection to the proxy server was refused - A conexão com servidor proxy foi recusada + + United Arab Emirates + Emirados Árabes Unidos - - The proxy server closed the connection prematurely - O servidor proxy fechou a conexão prematuramente + + Afghanistan + Afeganistão - - The proxy host name was not found - O nome do host do proxy não foi encontrado + + Antigua and Barbuda + Antígua e Barbuda - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - Fim do tempo de conexão com o proxy ou o proxy não respondeu no tempo + + Anguilla + Anguilla - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - O proxy requer autenticação mas não aceitou as credenciais oferecidas - - - - The access to the remote content was denied (401) - O acesso ao conteúdo remoto foi negado (401) - - - - The operation requested on the remote content is not permitted - A operação solicitada no conteúdo remoto não foi permitida - - - - The remote content was not found at the server (404) - O conteúdo remoto não foi encontrado no servidor (404) - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - O servidor remoto requer autenticação para fornecer os dados, mas as credenciais oferecidas não foram aceitas - - - - The Network Access API cannot honor the request because the protocol is not known - A API de Acesso à Rede não pôde honrar o pedido pois o protocolo é desconhecido - - - - The requested operation is invalid for this protocol - A operação solicitada está inválida para este protocolo - - - - An unknown network-related error was detected - Um erro desconhecido relacionado à rede foi detectado - - - - An unknown proxy-related error was detected - Um erro desconhecido relacionado ao proxy foi detectado - - - - An unknown error related to the remote content was detected - Um erro desconhecido relacionado ao conteúdo remoto foi detectado - - - - A breakdown in protocol was detected - Uma pane no protocolo foi detectada - - - - Unknown error - Erro desconhecido - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - Banco de dados GeoIP carregado. Tipo: %1. Data de criação: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - Não foi possível carregar o banco de dados GeoIP. Motivo: %1 - - - - Venezuela, Bolivarian Republic of - Venezuela, República Bolivariana da - - - - Viet Nam - Vietnã - - - - - N/A - N/A - - - - Andorra - Andorra - - - - United Arab Emirates - Emirados Árabes Unidos - - - - Afghanistan - Afeganistão - - - - Antigua and Barbuda - Antígua e Barbuda + + Albania + Albânia - Anguilla - Anguilla - - - - Albania - Albânia - - - Armenia Armênia - + Angola Angola - + Antarctica Antártica - + Argentina Argentina - + American Samoa Samoa Americana - + Austria Áustria - + Australia Austrália - + Aruba Aruba - + Azerbaijan Azerbaidjão - + Bosnia and Herzegovina Bósnia-Herzegóvina - + Barbados Barbados - + Bangladesh Bangladesh - + Belgium Bélgica - + Burkina Faso Burkina Fasso - + Bulgaria Bulgária - + Bahrain Barein - + Burundi Burundi - + Benin Benin - + Bermuda Bermudas - + Brunei Darussalam Brunei - + Brazil Brasil - + Bahamas Bahamas - + Bhutan Butão - + Bouvet Island Ilha Bouvet - + Botswana Botsuana - + Belarus Belarus - + Belize Belize - + Canada Canadá - + Cocos (Keeling) Islands Ilhas Cocos (Keeling) - + Congo, The Democratic Republic of the Congo, República Democrática do - + Central African Republic República Centro-Africana - + Congo Congo - + Switzerland Suíça - + Cook Islands Ilhas Cook - + Chile Chile - + Cameroon Camarões - + China China - + Colombia Colômbia - + Costa Rica Costa Rica - + Cuba Cuba - + Cape Verde Cabo Verde - + Curacao Curaçao - + Christmas Island Ilha Christmas - + Cyprus Chipre - + Czech Republic República Tcheca - + Germany Alemanha - + Djibouti Djibuti - + Denmark Dinamarca - + Dominica Dominica - + Dominican Republic República Dominicana - + Algeria Algéria - + Ecuador Equador - + Estonia Estônia - + Egypt Egito - + Western Sahara Saara Ocidental - + Eritrea Eritréia - + Spain Espanha - + Ethiopia Etiópia - + Finland Finlândia - + Fiji Fiji - + Falkland Islands (Malvinas) Ilhas Falkland (Malvinas) - + Micronesia, Federated States of Micronésia, Estados Federados da - + Faroe Islands Ilhas Feroe - + France França - + Gabon Gabão - + United Kingdom Reino Unido - + Grenada Granada - + Georgia Geórgia - + French Guiana Guiana Francesa - + Ghana Gana - + Gibraltar Gibraltar - + Greenland Groenlândia - + Gambia Gâmbia - + Guinea Guiné - + Guadeloupe Guadalupe - + Equatorial Guinea Guiné-Equatorial - + Greece Grécia - + South Georgia and the South Sandwich Islands Ilhas Geórgia do Sul e Sandwich do Sul - + Guatemala Guatemala - + Guam Guão - + Guinea-Bissau Guiné-Bissau - + Guyana Guiana - + Hong Kong Hong Kong - + Heard Island and McDonald Islands Ilha Heard e Ilhas McDonald - + Honduras Honduras - + Croatia Croácia - + Haiti Haiti - + Hungary Hungria - + Indonesia Indonésia - + Ireland Irlanda - + Israel Israel - + India Índia - + British Indian Ocean Territory Território Britânico do Oceano Índico - + Iraq Iraque - + Iran, Islamic Republic of Irã, República Islâmica do - + Iceland Islândia - + Italy Itália - + Jamaica Jamaica - + Jordan Jordânia - + Japan Japão - + Kenya Quênia - + Kyrgyzstan Quirguistão - + Cambodia Camboja - + Kiribati Kiribati - + Comoros Comores - + Saint Kitts and Nevis São Cristóvão e Nevis - + Korea, Democratic People's Republic of Coréia do Norte - + Korea, Republic of Coréia do Sul - + Kuwait Kuweit - + Cayman Islands Ilhas Cayman - + Kazakhstan Cazaquistão - + Lao People's Democratic Republic Laos - + Lebanon Líbano - + Saint Lucia Santa Lúcia - + Liechtenstein Liechtenstein - + Sri Lanka Sri Lanka - + Liberia Libéria - + Lesotho Lesoto - + Lithuania Lituânia - + Luxembourg Luxemburgo - + Latvia Letônia - + Morocco Marrocos - + Monaco Mônaco - + Moldova, Republic of Moldávia, República da - + Madagascar Madagáscar - + Marshall Islands Ilhas Marshall - + Mali Mali - + Myanmar Mianmar - + Mongolia Mongólia - + Northern Mariana Islands Ilhas Marianas Setentrionais - + Martinique Martinica - + Mauritania Mauritânia - + Montserrat Montserrat - + Malta Malta - + Mauritius Maurício - + Maldives Maldivas - + Malawi Malauí - + Mexico México - + Malaysia Malásia - + Mozambique Moçambique - + Namibia Namíbia - + New Caledonia Nova Caledônia - + Niger Níger - + Norfolk Island Ilha Norfolk - + Nigeria Nigéria - + Nicaragua Nicarágua - + Netherlands Holanda - + Norway Noruega - + Nepal Nepal - + Nauru Nauru - + Niue Niue - + New Zealand Nova Zelândia - + Oman Omã - + Panama Panamá - + Peru Peru - + French Polynesia Polinésia Francesa - + Papua New Guinea Papua Nova Guiné - + Philippines Filipinas - + Pakistan Paquistão - + Poland Polônia - + Saint Pierre and Miquelon São Pedro e Miquelão - + Puerto Rico Porto Rico - + Portugal Portugal - + Palau Palau - + Paraguay Paraguai - + Qatar Catar - + Reunion Ilha Reunião - + Romania Romênia - + Russian Federation Federação Russa - + Rwanda Ruanda - + Saudi Arabia Arábia Saudita - + Solomon Islands Ilhas Salomão - + Seychelles Seicheles - + Sudan Sudão - + Sweden Suécia - + Singapore Singapura - + Slovenia Eslovênia - + Svalbard and Jan Mayen Svalbard e Jan Mayen - + Slovakia Eslováquia - + Sierra Leone Serra Leoa - + San Marino San Marino - + Senegal Senegal - + Somalia Somália - + Suriname Suriname - + Sao Tome and Principe São Tomé e Príncipe - + El Salvador El Salvador - + Syrian Arab Republic Síria, República Árabe da - + Swaziland Suazilândia - + Turks and Caicos Islands Ilhas Turks e Caicos - + Chad Chade - + French Southern Territories Terras Austrais e Antárticas Francesas - + Togo Togo - + Thailand Tailândia - + Tajikistan Tadjiquistão - + Tokelau Toquelau - + Turkmenistan Turcomenistão - + Tunisia Tunísia - + Tonga Tonga - - Could not decompress GeoIP database file. - Não foi possível descompactar o arquivo do banco de dados GeoIP. - - - + Timor-Leste Timor Leste - + Bolivia, Plurinational State of Bolívia, Estado Plurinacional da - + Bonaire, Sint Eustatius and Saba Bonaire, Santo Eustáquio e Saba - + Cote d'Ivoire Cote d'Ivoire - + Libya Líbia - + Saint Martin (French part) Saint Martin (parte francesa) - + Macedonia, The Former Yugoslav Republic of Macedónia, Antiga República Jugoslava da - + Macao Macao - + Pitcairn Pitcairn - + Palestine, State of Palestina, Estado da - + Saint Helena, Ascension and Tristan da Cunha Santa Helena, Ascensão e Tristão da Cunha - + South Sudan Sudão do Sul - + Sint Maarten (Dutch part) Sint Maarten (parte holandesa) - + Turkey Turquia - + Trinidad and Tobago Trinidad e Tobago - + Tuvalu Tuvalu - + Taiwan Taiwan - + Tanzania, United Republic of Tanzânia, República Unida da - + Ukraine Ucrânia - + Uganda Uganda - + United States Minor Outlying Islands Ilhas Menores Distantes dos Estados Unidos - + United States Estados Unidos - + Uruguay Uruguai - + Uzbekistan Uzbequistão - + Holy See (Vatican City State) Santa Sé (Cidade-Estado do Vaticano) - + Saint Vincent and the Grenadines São Vicente e Granadinas - + Virgin Islands, British Ilhas Virgens Britânicas - + Virgin Islands, U.S. Ilhas Virgens Americanas - + Vanuatu Vanuatu - + Wallis and Futuna Wallis e Futuna - + Samoa Samoa - + Yemen Iêmen - + Mayotte Mayotte - + Serbia Sérvia - + South Africa África do Sul - + Zambia Zâmbia - + Montenegro Montenegro - + Zimbabwe Zimbábue - + Aland Islands Ilhas Aland - + Guernsey Guernsey - + Isle of Man Ilha de Man - + Jersey Jersey - + Saint Barthelemy São Bartolomeu, Coletividade de - + + Could not uncompress GeoIP database file. + Não foi possível descompactar o banco de dados GeoIP. + + + Couldn't save downloaded GeoIP database file. Não foi possível salvar o banco de dados GeoIP baixado. - + Successfully updated GeoIP database. Banco de dados GeoIP atualizado com sucesso. - + Couldn't download GeoIP database file. Reason: %1 Não foi possível baixar o banco de dados GeoIP. Motivo: %1 @@ -4596,12 +4146,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] Suporte a UPnp / NAT-PMP [LIG] - + UPnP / NAT-PMP support [OFF] Suporte a UPnp / NAT-PMP [DESL] @@ -4609,7 +4159,7 @@ Net::Smtp - + Email Notification Error: E-mail de Notificação de Erro: @@ -4617,1279 +4167,1077 @@ OptionsDialog - + Options Opções - + Behavior Comportamento - + Downloads Downloads - + Connection Conexão - + Speed Velocidade - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI - Interface Web + UI Web - + Advanced Avançado - + Language - Idioma + Linguagem - + User Interface Language: - Idioma da interface de usuário: + Linguagem da interface de usuário: - + (Requires restart) (Necessário reiniciar) - + Transfer List Lista de transferência - + Confirm when deleting torrents Confirmar ao excluir torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. Usar linhas alternadas de cor - + Hide zero and infinity values Ocultar valores zero e infinito - + Always Sempre - + Paused torrents only Somente torrents pausados - + Action on double-click Ação do duplo clique - + Downloading torrents: Baixando torrents: - - + + Start / Stop Torrent Iniciar / Parar Torrent - - + + Open destination folder Abrir pasta de destino - - + + No action Nenhuma ação - + Completed torrents: Torrents completos: - + Desktop Área de trabalho - + Start qBittorrent on Windows start up Iniciar qBittorrent quando o Windows inicializar - + Show splash screen on start up - Mostrar imagem de início ao inicializar + Mostrar imagem de início ao iniclalizar - + Start qBittorrent minimized Iniciar qBittorrent minimizado - + Confirmation on exit when torrents are active Confirmação ao sair com torrents ativos - + Confirmation on auto-exit when downloads finish Confirmação ao sair automaticamente quando concluir os downloads - - KiB - KiB - - - - Email notification &upon download completion - Notificação por email q&uando completar o download - - - - Run e&xternal program on torrent completion - Executar programa e&xterno quando completar o torrent - - - - IP Fi&ltering - Fi&ltro de IP - - - - Schedule &the use of alternative rate limits - Agendar para usar &taxas de limite alternativas - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Mais informações</a>) - - - - &Torrent Queueing - &Torrents na Espera - - - - Seed torrents until their seeding time reaches - Semear torrents até que sua taxa de semeadura seja atingida - - - - A&utomatically add these trackers to new downloads: - A&utomaticamente adicionar estes trackers para novos downloads: - - - - RSS Reader - Leitor de RSS - - - - Enable fetching RSS feeds - Habilitar a busca de feeds RSS - - - - Feeds refresh interval: - Intervalo de atualização de feeds: - - - - Maximum number of articles per feed: - Número máximo de artigos por feed: - - - - - min - minutes - min - - - - RSS Torrent Auto Downloader - Baixador automático de RSS - - - - Enable auto downloading of RSS torrents - Habilitar download automático de torrents RSS - - - - Edit auto downloading rules... - Editar regras de download automático... - - - - Web User Interface (Remote control) - Interface Web do Usuário (Controle remoto) - - - - IP address: - Endereço de IP: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - Endereço IP para o qual a Interface Web se conectará. -Especifique um endereço IPv4 ou IPv6. Você pode especificar "0.0.0.0" para qualquer endereço IPv4, -"::" para qualquer endereço IPv6, ou "*" para IPv4 e IPv6. - - - - Server domains: - Domínios do servidor: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - A lista branca para filtrar valores de cabeçalho do host HTTP. -Para se defender contra o ataque de reinserção de DNS, -você deve colocar nomes de domínio usados pelo servidor WebUI. - -Use ';' para dividir várias entradas. Pode usar o curinga '*'. - - - - &Use HTTPS instead of HTTP - &Usar HTTPS em vez de HTTP + + Show qBittorrent in notification area + Mostrar qBittorrent na área de notificação - - Bypass authentication for clients on localhost - Ignorar autenticação para clientes no host local - - - - Bypass authentication for clients in whitelisted IP subnets - Ignorar autenticação para clientes em sub-redes IP da lista branca - - - - IP subnet whitelist... - Lista branca de sub-redes IP... - - - - Upda&te my dynamic domain name - A&tualizar meu nome de domínio dinâmico - - - + Minimize qBittorrent to notification area Minimizar qBittorrent na área de notificação - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. Fechar qBittorrent para área de notificação - + Tray icon style: Estilo do ícone da bandeja: - + Normal Normal - + Monochrome (Dark theme) Monocromático (tema Escuro) - + Monochrome (Light theme) Monocromático (tema Claro) - + File association Associação de arquivo - + Use qBittorrent for .torrent files Usar qBittorrent para arquivos .torrent - + Use qBittorrent for magnet links Usar qBittorrent para links magnéticos - + Power Management Gestão de Energia - + + Inhibit system sleep when torrents are active + Sistema de espera inibe quando torrents estão activos + + + + Log file + Arquivo de log + + + Save path: Caminho para salvar: - + Backup the log file after: Fazer backup do arquivo de log após: - + + MB + MB + + + Delete backup logs older than: Excluir logs de backup mais antigos que: - + days Delete backup logs older than 10 months dias - + months Delete backup logs older than 10 months meses - + years Delete backup logs older than 10 years anos - + When adding a torrent Quando adicionar um torrent - + + Display torrent content and some options + Mostrar conteúdo torrent e mais opções + + + Bring torrent dialog to the front Trazer a janela torrent para frente - + Do not start the download automatically The torrent will be added to download list in pause state Não iniciar o download automaticamente - + Should the .torrent file be deleted after adding it O arquivo .torrent deve ser excluído após adicioná-lo - + + Delete .torrent files afterwards + Excluir arquivos .torrent mais tarde + + + Also delete .torrent files whose addition was cancelled - Também excluir arquivos .torrent cuja adição foi cancelada + Tambem excluir arquivos .torrent cuja adição foi cancelada - + Also when addition is cancelled Também quando a adição foi cancelada - + Warning! Data loss possible! Atenção! Possibilidade de perda de dados! - + Saving Management Gestão de Salvamento - + Default Torrent Management Mode: Modo de Gerenciamento de Torrents Padrão: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category O modo automático configura várias propriedades do torrent (ex.: caminho para salvar) baseado na categoria associada - + Manual Manual - + Automatic Automático - + When Torrent Category changed: Quando a Categoria do Torrent for alterada: - + Relocate torrent Realocar torrent - + Switch torrent to Manual Mode Alterar torrent para Modo Manual - + When Default Save Path changed: Quando o Caminho Padrão para Salvar for alterado: - - + + Relocate affected torrents Realocar torrents implicados - - + + Switch affected torrents to Manual Mode Alterar torrents afetados para Modo Manual - + When Category changed: Quando a Categoria for alterada: - + Use Subcategories Usar Subcategorias - + Default Save Path: Caminho Padrão para Salvar: - + Keep incomplete torrents in: Manter torrents incompletos em: - + Copy .torrent files to: Copiar arquivos .torrent para: - - Show &qBittorrent in notification area - Mostrar o &qBittorrent na área de notificação - - - - &Log file - Arquivo de &log - - - - Display &torrent content and some options - Mostrar conteúdo do &torrent e mais opções - - - - Create subfolder for torrents with multiple files - Criar subpasta para torrents com múltiplos arquivos - - - - De&lete .torrent files afterwards - &Excluir arquivos .torrent mais tarde - - - + Copy .torrent files for finished downloads to: Copiar arquivos .torrent finalizados para: - + Pre-allocate disk space for all files Pré-alocar espaço em disco para todos os arquivos - - Inhibit system sleep when torrents are downloading - Impedir suspensão do sistema quando torrents estão sendo baixados - - - - Inhibit system sleep when torrents are seeding - Impedir suspensão do sistema quando torrents estão sendo semeados - - - + Append .!qB extension to incomplete files Adicionar extensão .!qB para arquivos incompletos - - Enable recursive download dialog - Habilitar diálogo de download recursivo - - - + Automatically add torrents from: Adicionar automaticamente torrents de: - + Add entry Adicionar entrada - + Remove entry Remover entrada - + + Email notification upon download completion + Notificação por e-mail quando concluir o download + + + + Destination email: + E-mail de destino: + + + SMTP server: Servidor SMTP: - + This server requires a secure connection (SSL) Este servidor espera por uma conexão segura (SSL) - - + + + Authentication Autenticação - - - - + + + + Username: Nome de usuário: - - - - + + + + Password: Senha: - - Enabled protocol: - Protocolo habilitado: - - - - TCP and μTP - TCP e μTP + + Run external program on torrent completion + Executar programa externo ao concluir o torrent - + Listening Port Porta de Escuta - + Port used for incoming connections: Porta usada para conexões de entrada: - + Random Aleatória - + Use UPnP / NAT-PMP port forwarding from my router Usar redirecionamento de porta UPnP / NAT-PMP do meu roteador - + Use different port on each startup Usar uma porta diferente a cada inicialização - + Connections Limits Limites de Conexão - + Maximum number of connections per torrent: Número máximo de conexões por torrent: - + Global maximum number of connections: Número máximo global de conexões: - + Maximum number of upload slots per torrent: Número máximo de slots de upload por torrent: - + Global maximum number of upload slots: Número máximo global de slots de upload: - + Proxy Server Servidor Proxy - + Type: Tipo: - + (None) (Nenhum) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Servidor: - - + + Port: Porta: - + Otherwise, the proxy server is only used for tracker connections Caso contrário, o servidor proxy é somente usado para conexões de tracker - + Use proxy for peer connections Usar proxy para conexões de peer - + Disable connections not supported by proxies Desabilitar conexões não suportadas por proxy - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Mais informações</a>) - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection Feeds RSS, mecanismo de busca, atualizações de software ou qualquer outra coisa que não sejam transferências de torrent e operações relacionadas (tais como intercâmbio de peer) usarão conexão direta - + Use proxy only for torrents Usar proxy somente para torrents - - A&uthentication - A&utenticação - - - + Info: The password is saved unencrypted Info: A senha é salva sem criptografia - + + IP Filtering + Filtro de IP + + + Filter path (.dat, .p2p, .p2b): Caminho do filtro (.dat, .p2p, .p2b): - + Reload the filter Recarregar o filtro - - Manually banned IP addresses... - Lista de endereços IP banidos manualmente... - - - + Apply to trackers Aplicar aos trackers - + Global Rate Limits Limite Global - - - - - - - KiB/s - KiB/s - - - - + + Upload: Upload: - - + + + + + KiB/s + KB/s + + + + Download: Download: - + Alternative Rate Limits Limites de Taxa Alternativos - - + + Schedule the use of alternative rate limits + Agendar uso de taxas limite alternativas + + + From: from (time1 to time2) De: - - + To: time1 to time2 Até: - + When: Quando: - + Every day Diariamente - + Weekdays Dias de semana - + Weekends Finais de semana - + Rate Limits Settings Configurações de Limites de Taxa - + Apply rate limit to peers on LAN Aplicar limite de taxa para peers na LAN - + Apply rate limit to transport overhead Aplicar taxa limite para transporte acima da carga - - + + + Enable µTP protocol + Ativar protocolo µTP + + + Apply rate limit to µTP protocol - Aplicar limite de taxa para protocolo µTP + Aplicar limite de taxa para protocolo µTP - + Privacy Privacidade - + Enable DHT (decentralized network) to find more peers Habilitar DHT (rede decentralizada) para encontrar mais peers - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Trocar peers com clientes Bittorrent compatíveis (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers Habilitar Peer Exchange (PeX) para encontrar mais peers - + Look for peers on your local network Buscar por peers na rede local - + Enable Local Peer Discovery to find more peers Habilitar Descoberta de Peer Local para encontrar mais peers - + Encryption mode: Modo de encriptação: - + Prefer encryption Preferir encriptação - + Require encryption Encriptação requerida - + Disable encryption Desabilitar encriptação - + Enable when using a proxy or a VPN connection Habilite ao usar proxy ou uma conexão VPN - + Enable anonymous mode Habilitar modo anônimo - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Mais informações</a>) + + + + Torrent Queueing + Torrents na Espera + + + Maximum active downloads: Máximo de downloads ativos: - + Maximum active uploads: Máximo de uploads ativos: - + Maximum active torrents: Máximo de torrents ativos: - + Do not count slow torrents in these limits Não contar torrents lentos nesses limites - - Upload rate threshold: - Limite da taxa de upload: - - - - Download rate threshold: - Limite da taxa de download: - - - - sec - seconds - seg - - - - Torrent inactivity timer: - Temporizador de inatividade do torrent: - - - + Share Ratio Limiting LImite da Taxa de Compartilhamento - + Seed torrents until their ratio reaches Semear torrents até que sua taxa atinja - + then então - + Pause them Pausá-los - + Remove them Removê-los - - RSS Smart Episode Filters - Filtros RSS Inteligentes de Episódios + + Automatically add these trackers to new downloads: + Automaticamente adicionar estes trackers para novos downloads: + + + + Enable Web User Interface (Remote control) + Habilitar Interface Web do Usuário (Controle remoto) - + Use UPnP / NAT-PMP to forward the port from my router Usar UPnP / NAT-PMP para redirecionar a porta do meu roteador - + + Use HTTPS instead of HTTP + Usar HTTPS em vez de HTTP + + + Certificate: Certificado: - + Import SSL Certificate Importar Certificado SSL - + Key: Chave: - + Import SSL Key Importar Chave SSL - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Informações sobre certificados</a> - - Use alternative Web UI - Usar interface Web alternativa - - - - Files location: - Local dos arquivos: + + Bypass authentication for localhost + Ignorar autenticação para host local - - Enable clickjacking protection - Habilitar proteção contra clickjacking + + Update my dynamic domain name + Atualize meu nome de domínio dinâmico - - Enable Cross-Site Request Forgery (CSRF) protection - Habilitar proteção de Falsificação de Solicitação de Site Cruzado (CSRF) - - - + Service: Serviço: - + Register Registrar - + Domain name: Nome do domínio: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! Ao habilitar estas opções, você pode <strong>definitivamente perder</strong> seus arquivos .torrent! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well Quando estas opções estiverem habilitadas, o qBittorrent irá <strong>excluir</strong> os arquivos .torrent após eles serem adicionados com sucesso (primeira opção) ou não (segunda opção) em suas filas filas de download. Isto será aplicado <strong>não somente</strong> aos arquivos abertos pelo menu &ldquo;Adicionar torrent&rdquo;, mas também para aqueles abertos pela <strong>associação de tipos de arquivo</strong> - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog Se você habilitar a segunda opção (&ldquo;Também se a adição for cancelada&rdquo;) o arquivo .torrent <strong>será excluído</strong> mesmo se você pressionar &ldquo;<strong>Cancelar</strong>&rdquo; no diálogo &ldquo;Adicionar torrent&rdquo; - - Choose Alternative UI files location - Escolha o local dos arquivos da interface alternativa - - - + Supported parameters (case sensitive): - Parâmetros suportados (diferencia maiúsculas de minúsculas): + Parâmetros suportados (diferencia maiúsculas de minúsculas) - + %N: Torrent name %N: Nome do torrent - + %L: Category Categoria - - %G: Tags (seperated by comma) - %G: Tags (separadas por vírgula) - - - + %F: Content path (same as root path for multifile torrent) %F: Caminho de conteúdo (mesmo do caminho raiz para torrent multi arquivo) - + %R: Root path (first torrent subdirectory path) %R: Caminho raiz (caminho da subpasta do primeiro torrent) - + %D: Save path %D: Caminho para salvar - + %C: Number of files %C: Número de arquivos - + %Z: Torrent size (bytes) %Z: Tamanho do torrent (bytes) - + %T: Current tracker %T: Tracker atual - + %I: Info hash %I: Informação de hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") Dica: Coloque o parâmetro entre aspas para evitar que o texto seja cortado nos espaços em branco (ex.: "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - Um torrent será considerado lento se suas taxas de download e upload ficarem abaixo desses valores pelos segundos do "Temporizador de inatividade do Torrent" - - - + Select folder to monitor Selecione a pasta para monitorar - + Folder is already being monitored: A pasta já está sendo monitorada: - + Folder does not exist: Essa pasta não existe: - + Folder is not readable: A pasta não possui suporte para leitura: - + Adding entry failed Falha ao adicionar entrada - - - - + + Choose export directory Escolha a pasta para exportar - - - + + + + + + Choose a save directory Escolha a pasta para salvar - + Choose an IP filter file Escolha um arquivo de filtro de IP - + All supported filters Todos os filtros suportados - + SSL Certificate Certificado SSL - + + SSL Key + Chave SSL + + + Parsing error Erro de análise - + Failed to parse the provided IP filter Falha ao analisar filtro de IP fornecido - + Successfully refreshed Atualizado com sucesso - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Filtro de IP fornecido analisado com sucesso: %1 regras foram aplicadas. - + Invalid key Chave inválida - + This is not a valid SSL key. Esta não é uma chave SSL válida. - + Invalid certificate Certificado inválido - - Preferences - Preferências - - - - Import SSL certificate - Importar certificado SSL - - - + This is not a valid SSL certificate. Este não é um certificado SSL válido. - - Import SSL key - Importar chave SSL - - - - SSL key - Chave SSL - - - + Time Error Erro de Tempo - + The start time and the end time can't be the same. O tempo inicial e final não pode ser igual. - - + + Length Error Erro de Comprimento - + The Web UI username must be at least 3 characters long. O nome de usuário para a interface Web deve conter mais que 3 caracteres. - + The Web UI password must be at least 6 characters long. A senha de usuário da interface Web deve ser maior que 3 caracteres. @@ -5897,72 +5245,72 @@ PeerInfo - - Interested(local) and Choked(peer) - Interessados​​(local) e Paralisar(peer) + + interested(local) and choked(peer) + interessados​​(local) e paralisar(peer) - + interested(local) and unchoked(peer) interessados(local) e paralisados(peer) - + interested(peer) and choked(local) interessados(peer) e paralisados(local) - + interested(peer) and unchoked(local) - interessado (peer) e unchoked (local) + nteressado (peer) e unchoked (local) - + optimistic unchoke unchoke otimista - + peer snubbed peer esnobado - + incoming connection conexão de entrada - + not interested(local) and unchoked(peer) não está interessado (local) e unchoked (peer) - + not interested(peer) and unchoked(local) não está interessado (peer) e unchoked (local) - + peer from PEX peer de PEX - + peer from DHT peer de DHT - + encrypted traffic tráfego criptografado - + encrypted handshake handshake criptografado - + peer from LSD peer de LSD @@ -5970,180 +5318,165 @@ PeerListWidget - + IP IP - + Port Porta - + Flags Bandeiras - + Connection Conexão - + Client i.e.: Client application Cliente - + Progress i.e: % downloaded Progresso - + Down Speed i.e: Download speed Velocidade de download - + Up Speed i.e: Upload speed Velocidade de upload - + Downloaded i.e: total data downloaded Baixado - + Uploaded i.e: total data uploaded Subido - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Relevância - + Files i.e. files that are being downloaded right now Arquivos - + Column visibility Visibilidade da coluna - + Add a new peer... Adicionar um novo peer... - - + + Ban peer permanently Banir fonte permanentemente - + Manually adding peer '%1'... Adicionando manualmente peer %1... - + The peer '%1' could not be added to this torrent. O peer '%1' não pôde ser adicionado a este torrent. - + Manually banning peer '%1'... Banindo manualmente peer '%1'... - - + + Peer addition Adição de fonte - + Country País - + Copy IP:port Copiar IP:porta - + Some peers could not be added. Check the Log for details. Alguns peers não puderam ser adicionados. Veja o Log para detalhes. - + The peers were added to this torrent. Peers adicionados a este torrent. - + Are you sure you want to ban permanently the selected peers? Deseja mesmo banir permanentemente a fonte selecionada? - + &Yes &Sim - + &No &Não - PeersAdditionDialog + PeersAdditionDlg - - Add Peers - Adicionar Peers + + No peer entered + Nenhum peer inserida - - List of peers to add (one IP per line): - Lista de peers para adicionar (um IP por linha): + + Please type at least one peer. + Por favor, entre pelo menos um peer. - - Format: IPv4:port / [IPv6]:port - Formato: IPv4:porta / [IPv6]:porta - - - - No peer entered - Nenhum peer inserido - - - - Please type at least one peer. - Por favor, entre pelo menos um peer. - - - + Invalid peer Peer inválido - + The peer '%1' is invalid. O peer '%1' é inválido. @@ -6151,12 +5484,12 @@ PieceAvailabilityBar - + White: Unavailable pieces Branco: Pedaços indisponíveis - + Blue: Available pieces Azul: Pedaços disponíveis @@ -6164,337 +5497,293 @@ PiecesBar - + Files in this piece: Arquivos neste pedaço: - + File in this piece Arquivo neste pedaço - + File in these pieces Arquivo nestes pedaços - - Wait until metadata become available to see detailed information - Aguarde até que os metadados estejam disponíveis para ver informação detalhada - - - + Hold Shift key for detailed information Pressione a tecla Shift para informações detalhadas - PluginSelectDialog + PluginSelectDlg - + Search plugins Plugins de pesquisa - + Installed search plugins: Plugins de pesquisa instalados: - + Name Nome - + Version Versão - + Url URL - - + + Enabled - Habilitado + Ativado - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - Aviso: Certifique-se de observar as leis de copyright do seu país ao baixar torrents de qualquer um destes mecanismos de busca. - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - Você pode obter novos mecanismos de busca aqui: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Você pode obter novos plugins de mecanismos de pesquisa aqui: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one Instalar um novo - + Check for updates Verificar atualizações - + Close Fechar - + Uninstall Desinstalar - - - + + + Yes Sim - - - - + + + + No Não - + Uninstall warning Aviso de desinstalação - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - Alguns plugins não puderam ser desinstalados pois estão incluídos no qBittorrent. Somente aqueles que você instalou podem ser desinstalados. -Estes plugins foram desabilitados. + Alguns plugins não puderam ser desinstalados pois estão incluídos no qBittorrent. Somente aqueles que você mesmo adicionou podem ser desinstalados. +Esses plugins foram desativados. - + Uninstall success - Desinstalado com sucesso + Desinstaaldo com sucesso - + All selected plugins were uninstalled successfully Todos os plugins selecionados foram desinstalados com sucesso - - - - - Search plugin update - Atualização de plugin de busca - - - - Plugins installed or updated: %1 - Plugins instalados ou atualizados: %1 - - - - + + New search engine plugin URL - URL de novo plugin de busca + URL de novo plugin de pesquisa - - + + URL: URL: - + Invalid link Link inválido - + The link doesn't seem to point to a search engine plugin. - Esse link não parece estar apontando para um plugin de mecanismo de busca. + Esse link não parece estar apontando para um plugin de motor de busca. - + Select search plugins Selecionar plugins de busca - + qBittorrent search plugin Plugin de busca do qBittorrent - + + + + Search plugin update + Atualização de plugin de busca + + + All your plugins are already up to date. - Todos os seus plugins estão atualizados. + Todos os plugins já estão atuais. - + Sorry, couldn't check for plugin updates. %1 - Desculpe, não foi possível verificar por atualizações de plugin. %1 + Desculpe, não foi possível verificar por atualizações do plugin: %1 - + + + Search plugin install Instalação de plugin de busca - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + Plugin de busca "%1" instalado com sucesso. + + + Couldn't install "%1" search engine plugin. %2 - Não foi possível instalar o plugin de busca "%1". %2 + Não foi possível instalar o plugin do motor de busca "%1". %2 + + + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + Plugin de busca "%1" atualizado com sucesso. - + Couldn't update "%1" search engine plugin. %2 - Não foi possível instalar o plugin de busca "%1". %2 + Não foi possível atualizar o plugin do motor de busca "%1". %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source Fonte do plugin - + Search plugin source: Fonte do plugin de busca: - + Local file Arquivo local - + Web link - Link da web - - - - PowerManagement - - - qBittorrent is active - O qBittorrent está ativo + Link da net - PreviewSelectDialog + PreviewSelect - - Preview - Prévia - - - + Name Nome - + Size Tamanho - + Progress Progresso - - + + Preview impossible - Impossível pré-visualizar + Pré-visualização impossível - - + + Sorry, we can't preview this file - Desculpe, não é possível pré-visualizar este arquivo - - - - Private::FileLineEdit - - - '%1' does not exist - '%1' não existe - - - - '%1' does not point to a directory - '%1' não aponta para um diretório - - - - '%1' does not point to a file - '%1' não aponta para um arquivo - - - - Does not have read permission in '%1' - Não há permissão de leitura em '%1' - - - - Does not have write permission in '%1' - Não há permissão de escritura em '%1' + Desculpe, não é possível pré-visualizar esse arquivo PropListDelegate - + Not downloaded Não baixado - - + + Normal Normal (priority) Normal - - N/A - N/A - - - + Do not download Do not download (priority) - Não baixar + Não baixar - - + + High High (priority) Alta - + N/A + N/A + + + Mixed Mixed (priorities Misto - - + + Maximum Maximum (priority) Máxima @@ -6503,32 +5792,32 @@ PropTabBar - + General Geral - + Trackers Rastreadores - + Peers Peers - + HTTP Sources Fontes HTTP - + Content Conteúdo - + Speed Velocidade @@ -6622,22 +5911,22 @@ Comentário: - + Select All Seleciona todos - + Select None Selecionar nenhum - + Normal Normal - + High Alto @@ -6697,165 +5986,165 @@ Caminho para Salvar: - + Maximum Máximo + - Do not download Não baixar - + Never Nunca - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (possui %3) - - + + %1 (%2 this session) %1 (%2 nesta sessão) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (semeado por %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 máx.) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 total) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 média) - + Open Abrir - + Open Containing Folder Abrir pasta - + Rename... Renomear... - + Priority Prioridade - + New Web seed Novo seed web - + Remove Web seed Remover seed web - + Copy Web seed URL Copiar link do seed web - + Edit Web seed URL Editar o link seed - + + Rename the file + Renomeie o arquivo + + + New name: Novo nome: - - + + + The file could not be renamed + O arquivo não pode ser renomeado + + + + This file name contains forbidden characters, please choose a different one. + O arquivo contem caracteres desconhecidos, por favor use um nome diferente. + + + + This name is already in use in this folder. Please use a different name. Este nome já está sendo utilizado nessa pasta. Por favor use um nome diferente. - + The folder could not be renamed A pasta não pode ser renomeada - + qBittorrent qBittorrent - + Filter files... Arquivos de filtro... - - Renaming - Renomeando - - - - - Rename error - Erro ao renomear - - - - The name is empty or contains forbidden characters, please choose a different one. - O nome está vazio ou contém caracteres proibidos. Por favor escolha um nome diferente. - - - + New URL seed New HTTP source Nova URL de seed - + New URL seed: Nova URL de seed: - - + + This URL seed is already in the list. Essa URL de seed já está na lista. - + Web seed editing Editando o seed web - + Web seed URL: Link de seed web: @@ -6863,585 +6152,551 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + Seu endereço IP foi banido após muitas falhas de autenticação. + + + + Error: '%1' is not a valid torrent file. + + Erro: '%1' não é um arquivo torrent válido. + + + + + Error: Could not add torrent to session. + Erro: Não foi possível adicionar o torrent à sessão. + + + + I/O Error: Could not create temporary file. + Erro de E/S: Não foi possível criar arquivo temporário. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. - %1 é um parâmetro de linha de comando desconhecido. + % 1 é um parâmetro de linha de comando desconhecido. - - + + %1 must be the single command line parameter. - %1 deve ser o único parâmetro da linha de comando. + % 1 deve ser o único parâmetro da linha de comando. + + + + %1 must specify the correct port (1 to 65535). + % 1 deve especificar a porta correta (1 a 65535). - + You cannot use %1: qBittorrent is already running for this user. - Você não pode usar%1: qBittorrent já está em execução para este usuário. + Você não pode usar% 1: qBittorrent já está em execução para este usuário.javascript:; - + Usage: Uso: - + Options: - Opções: + Opções + + + + Displays program version + Mostra a versão do programa - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - O parâmetro '%1' precisa seguir a sintaxe '%1=%2' + + Displays this help message + Mostra esta mensagem de ajuda - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - O parâmetro '%1' precisa seguir a sintaxe '%1=%2' + + Changes the Web UI port (current: %1) + Muda a porta da Interface Web (atual: %1) - - Expected integer number in environment variable '%1', but got '%2' - Número inteiro esperado na variável de ambiente '%1', mas obteve '%2' + + Disable splash screen + Desabilitar tela de inicio - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - O parâmetro '%1' precisa seguir a sintaxe '%1=%2' + + Run in daemon-mode (background) + Executar em modo daemon (background) - - Expected %1 in environment variable '%2', but got '%3' - %1 esperado na variável de ambiente '%2', mas obteve '%3' + + Downloads the torrents passed by the user + Baixar os torrents passados pelo usuário - - port - porta + + Help + Ajuda - - %1 must specify a valid port (1 to 65535). - %1 deve especificar uma porta válida (1 até 65535). + + Run application with -h option to read about command line parameters. + Execute a aplicação com a opção -h para ler sobre os parâmetros da linha de comando. - - Display program version and exit - Mostra a versão do programa e sai + + Bad command line + Comando errado - - Display this help message and exit - Mostra esta mensagem de ajuda e sai + + Bad command line: + Comando errado: - - Change the Web UI port - Altera a porta da Interface Web + + Legal Notice + Notícia Legal - - Disable splash screen - Desabilitar tela de inicio + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + O qBittorrent é um programa de compartilhamento de arquivos. Quando você executa um torrent, seus dados serão disponibilizados a terceiros por meio de upload. Qualquer conteúdo que você compartilha é de sua exclusiva responsabilidade. + +Não serão exibidos mais avisos. - - Run in daemon-mode (background) - Executar em modo daemon (background) + + Press %1 key to accept and continue... + Pressione a tecla %1 para aceitar e continuar... - - dir - Use appropriate short form or abbreviation of "directory" - dir + + Legal notice + Notícia legal - - Store configuration files in <dir> - Guardar arquivos de configuração em <dir> + + Cancel + Cancelar - - - name - nome + + I Agree + Eu aceito - - Store configuration files in directories qBittorrent_<name> - Guardar arquivos de configuração nos diretórios qBittorrent_<name> + + Torrent name: %1 + Nome do torrent: %1 - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Alterar arquivos de resumo rápido libtorrent e criar caminhos de arquivos relativos à pasta do perfil + + Torrent size: %1 + Tamanho do torrent: %1 - - files or URLs - arquivos ou URLs + + Save path: %1 + Caminho para salvar: %1 - - Download the torrents passed by the user - Baixa os arquivos fornecidos pelo usuário + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + O torrent foi baixado em %1. - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Especifica quando o diálogo "Adicionar Novo Torrent" será aberto ao adicionar um torrent. + + Thank you for using qBittorrent. + Obrigado por usar o qBittorrent. - - Options when adding new torrents: - Opções ao adicionar novos torrents: + + [qBittorrent] '%1' has finished downloading + [qBittorrent] %1 terminou de ser baixado - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Atalho para %1 + + The remote host name was not found (invalid hostname) + O host remoto não foi encontrado (host inválido) - - path - caminho + + The operation was canceled + A operação foi cancelada - - Torrent save path - Caminho para salvar torrent + + The remote server closed the connection prematurely, before the entire reply was received and processed + O servidor remoto fechou a conexão prematuramente, antes da resposta completa ter sido recebida e processada - - Add torrents as started or paused - Adicionar torrents como iniciados ou pausados + + The connection to the remote server timed out + A conexão com o servidor remoto atingiu o tempo limite - - Skip hash check - Pular verificação de hash + + SSL/TLS handshake failed + Handshake SSL/TLS falhou - - Assign torrents to category. If the category doesn't exist, it will be created. - Atribua torrents à categoria. Se a categoria não existir, ela será criada. + + The remote server refused the connection + O servidor remoto recusou a conexão - - Download files in sequential order - Baixar arquivos em ordem sequencial + + The connection to the proxy server was refused + A conexão com servidor proxy foi recusada - - Download first and last pieces first - Baixar a primeira e a última parte primeiro + + The proxy server closed the connection prematurely + O servidor proxy fechou a conexão prematuramente - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - Os valores das opções podem ser fornecidos através de variáveis de ambiente. Para a opção denominada 'parameter-name', o nome da variável de ambiente é 'QBT_PARAMETER_NAME' (em maiúsculas, '-' substituído por '_'). Para passar os valores do sinalizador, defina a variável como '1' ou 'TRUE'. Por exemplo, para desativar a tela inicial: + + The proxy host name was not found + O nome do host do proxy não foi encontrado - - Command line parameters take precedence over environment variables - Os parâmetros da linha de comando têm precedência sobre as variáveis de ambiente + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Fim do tempo de conexão com o proxy ou o proxy não respondeu no tempo - - Help - Ajuda + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + O proxy requer autenticação mas não aceitou as credenciais oferecidas - - Run application with -h option to read about command line parameters. - Execute a aplicação com a opção -h para ler sobre os parâmetros da linha de comando. + + The access to the remote content was denied (401) + O acesso ao conteúdo remoto foi negado (401) - - Bad command line - Comando errado + + The operation requested on the remote content is not permitted + A operação solicitada no conteúdo remoto não foi permitida - - Bad command line: - Comando errado: + + The remote content was not found at the server (404) + O conteúdo remoto não foi encontrado no servidor (404) - - Legal Notice - Notícia Legal + + The remote server requires authentication to serve the content but the credentials provided were not accepted + O servidor remoto requer autenticação para fornecer os dados, mas as credenciais oferecidas não foram aceitas - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - O qBittorrent é um programa de compartilhamento de arquivos. Quando você executa um torrent, seus dados serão disponibilizados para outras pessoas por meio de upload. Qualquer conteúdo que você compartilhe é de sua inteira responsabilidade. + + The Network Access API cannot honor the request because the protocol is not known + A API de Acesso à Rede não pôde honrar o pedido pois o protocolo é desconhecido - - No further notices will be issued. - Nenhum aviso adicional será emitido. + + The requested operation is invalid for this protocol + A operação solicitada é inválida para este protocolo - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - O qBittorrent é um programa de compartilhamento de arquivos. Quando você executa um torrent, seus dados serão disponibilizados a terceiros por meio de upload. Qualquer conteúdo que você compartilha é de sua exclusiva responsabilidade. - -Não serão exibidos mais avisos. + + An unknown network-related error was detected + Um erro desconhecido relacionado à internet foi detectado - - Press %1 key to accept and continue... - Pressione a tecla %1 para aceitar e continuar... + + An unknown proxy-related error was detected + Um erro desconhecido relacionado ao proxy foi detectado - - Legal notice - Notícia legal + + An unknown error related to the remote content was detected + Um erro desconhecido relacionado ao conteúdo remoto foi detectado - - Cancel - Cancelar + + A breakdown in protocol was detected + Uma pane no protocolo foi detectada - - I Agree - Eu aceito + + Unknown error + Erro desconhecido - - + + Upgrade Upgrade - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] Você atualizou a partir de uma versão mais antiga que salvou as coisas de forma diferente. Você deve migrar para o novo sistema de salvamento. Você não será capaz de usar uma versão mais antiga que a v3.3.0 novamente. Continuar? [S/N] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. Você atualizou a partir de uma versão mais antiga que salvou as coisas de forma diferente. Você deve migrar para o novo sistema de salvamento. Se você continuar, não será capaz de usar uma versão mais antiga que a v3.3.0 novamente. - + Couldn't migrate torrent with hash: %1 Não foi possível migrar o torrent com hash: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 Não foi possível migrar o torrent. Nome inválido do arquivo de resumo rápido: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 - Detectado encerramento irregular do programa. Usando arquivo de reserva para restaurar as configurações: %1 + + Detected unclean program exit. Using fallback file to restore settings. + Detectado encerramento irregular do programa. Usando arquivo de reserva para restaurar as configurações. - + An access error occurred while trying to write the configuration file. Um erro de acesso ocorreu ao tentar escrever o arquivo de configuração. - + A format error occurred while trying to write the configuration file. Um erro de formato ocorreu ao tentar escrever o arquivo de configuração. - - - An unknown error occurred while trying to write the configuration file. - Um erro desconhecido ocorreu ao tentar escrever o arquivo de configuração. - - RSS::AutoDownloader + RSS - - - Invalid data format. - Formato de dados inválido. + + Search + Busca - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - Não foi possível salvar os dados de download automático do RSS em %1. Erro: %2 + + New subscription + Nova inscrição - - Invalid data format - Formato de dados inválido + + + + Mark items read + Marcar ítems lidos - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - Não foi possível ler as regras de download automático do RSS de %1. Erro: %2 + + Update all + Atualizar todos - - Couldn't load RSS AutoDownloader rules. Reason: %1 - Não foi possível carregar as regras de download automático do RSS. Motivo: %1 + + RSS Downloader... + Baixador RSS... - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - Falha ao baixar o feed RSS em '%1'. Causa: %2. + + Settings... + Configurações... - - RSS feed at '%1' updated. Added %2 new articles. - Feed RSS em '%1' atualizado. %2 novos artigos adicionados. + + Torrents: (double-click to download) + Torrents: (duplo clique para baixar) - - Failed to parse RSS feed at '%1'. Reason: %2 - Falha ao analisar o feed RSS em '%1'. Causa: %2. + + + Delete + Apagar - - Couldn't read RSS Session data from %1. Error: %2 - Não foi possível ler a Sessão de dados do RSS de %1. Erro: %2 + + Rename... + Renomear... - - Couldn't parse RSS Session data. Error: %1 - Não foi possível analisar a Sessão de dados do RSS. Erro: %1 + + Rename + Renomear - - Couldn't load RSS Session data. Invalid data format. - Não foi possível carregar a Sessão de dados do RSS. Formato inválido de dados. + + + Update + Atualiza - - Couldn't load RSS article '%1#%2'. Invalid data format. - Não foi possível carregar o artigo do RSS '%1#%2'. Formato inválido de dados. + + New subscription... + Nova inscrição... - - - RSS::Private::Parser - - Invalid RSS feed. - Feed RSS inválido. - - - - %1 (line: %2, column: %3, offset: %4). - %1 (linha: %2, coluna: %3, deslocamento: %4). - - - - RSS::Session - - - RSS feed with given URL already exists: %1. - Feed RSS com o URL informado já existe: %1. - - - - Cannot move root folder. - Não é possível mover a pasta raiz. + + + Update all feeds + Atualizar todos feeds - - - Item doesn't exist: %1. - O item não existe: %1. + + Download torrent + Baixar torrent - - Cannot delete root folder. - Não é possível excluir a pasta raiz. + + Open news URL + Abrir novas URL - - Incorrect RSS Item path: %1. - Caminho incorreto do item RSS: %1. + + Copy feed URL + Copiar URL do feed - - RSS item with given path already exists: %1. - O item RSS com o caminho fornecido já existe: %1. + + New folder... + Nova pasta... - - Parent folder doesn't exist: %1. - A pasta pai não existe: %1. + + Refresh RSS streams + Atualizar RSS streams - RSSWidget - - - Search - Busca - - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - A procura de feeds RSS está desativada agora! Você pode ativá-la nas configurações do programa. - - - - New subscription - Nova inscrição - - - - - - Mark items read - Marcar itens como lidos - - - - Refresh RSS streams - Atualizar streams RSS - - - - Update all - Atualizar todos - - - - RSS Downloader... - Baixador RSS... - - - - Torrents: (double-click to download) - Torrents: (duplo clique para baixar) - + RSSImp - - - Delete - Apagar + + Stream URL: + Stream URL: - - Rename... - Renomear... + + Please type a RSS stream URL + Por favor, digite uma URL de stream RSS - - Rename - Renomear + + This RSS feed is already in the list. + Esta fonte RSS já está na lista. - - - Update - Atualizar + + Please choose a folder name + Por favor escolha um nome de pasta - - New subscription... - Nova inscrição... + + Folder name: + Nome da pasta: - - - Update all feeds - Atualizar todos os feeds + + New folder + Nova pasta - - Download torrent - Baixar torrent + + Deletion confirmation + Confirmação de exclusão - - Open news URL - Abrir novas URL + + Are you sure you want to delete the selected RSS feeds? + Tem certeza de que deseja excluir as fontes RSS selecionadas? - - Copy feed URL - Copiar URL do feed + + Please choose a new name for this RSS feed + Por favor escolha um novo nome para este feed RSS - - New folder... - Nova pasta... + + New feed name: + Novo nome do feed: - - Please choose a folder name - Por favor escolha um nome de pasta + + Name already in use + Novo já está em uso - - Folder name: - Nome da pasta: + + This name is already used by another item, please choose another one. + Este nome já está sendo usado por outro ítem, por favor escolha outro. - - New folder - Nova pasta + + Date: + Data: - - Please type a RSS feed URL - Por favor, digite uma URL de feed RSS + + Author: + Autor: - - Feed URL: - URL do feed: + + Unread + Não lido + + + Rss::Feed - - Deletion confirmation - Confirmação de exclusão + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + O download automático de '%1' da fonte RSS '%2' falhou pois ele não contém um torrent ou um link magnet... - - Are you sure you want to delete the selected RSS feeds? - Tem certeza de que deseja excluir os feeds RSS selecionados? + + Automatically downloading '%1' torrent from '%2' RSS feed... + Baixando automaticamente o torrent '%1' do RSS feed '%2'... + + + Rss::Private::Parser - - Please choose a new name for this RSS feed - Por favor escolha um novo nome para este feed RSS + + Invalid RSS feed. + Feed RSS inválido. + + + RssSettingsDlg - - New feed name: - Novo nome do feed: + + RSS Reader Settings + Configurações de Leitor de RSS - - Rename failed - Falha ao renomear + + RSS feeds refresh interval: + Intervalo de atualização de feeds RSS: - - Date: - Data: + + min + min - - Author: - Autor: + + Maximum number of articles per feed: + Número máximo de artigos por feed: ScanFoldersDelegate - + Select save location Selecione o local para salvar @@ -7449,274 +6704,268 @@ ScanFoldersModel - + Monitored Folder Pasta Monitorada - + Override Save Location Substituir Local para Salvar - + Monitored folder Pasta monitorada - + Default save location Local padrão para salvar - + Browse... Procurar... - SearchJobWidget + SearchEngine - - Form - Formulário + + Unknown search engine plugin file format. + Formato desconhecido do arquivo de plugin do motor de busca. - - Results(xxx) - Resultados (xxx) + + A more recent version of this plugin is already installed. + Uma versão mais recente de plugin de busca já está instalado. - - Search in: - Pesquisar em: + + + Plugin is not supported. + Plugin não suportado. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - <html><head/><body><p>Alguns mecanismos de busca pesquisam na descrição do torrent e também nos nomes dos arquivos torrent. A exibição destes resultados na lista abaixo é controlada por este modo.</p><p><span style=" font-weight:600;">Em toda parte </span>desativa a filtragem e mostra tudo retornado pelos mecanismos de busca.</p><p><span style=" font-weight:600;">Somente nomes de torrents</span> mostra apenas torrents cujos nomes correspondem à consulta de pesquisa.</p></body></html> + + Update server is temporarily unavailable. %1 + O servidor de atualizações está temporariamente indisponível. - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - <html><head/><body><p>Defina o número máximo e mínimo de seeders permitidos</p></body></html> + + + Failed to download the plugin file. %1 + Falha ao baixar arquivo do plugin. %1 - - Seeds: - Seeds: + + An incorrect update info received. + Recebida uma informação incorreta de atualização. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - <html><head/><body><p>Número mínimo de seeds</p></body></html> + + All categories + Todas as categorias - - - to - até + + Movies + Filmes - - <html><head/><body><p>Maximal number of seeds</p></body></html> - <html><head/><body><p>Número máximo de seeds</p></body></html> + + TV shows + Shows de TV - - - - + + Music + Música - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - <html><head/><body><p>Defina o tamanho máximo e mínimo permitido do torrent</p></body></html> + + Games + Jogos - - Size: - Tamanho: + + Anime + Anime - - <html><head/><body><p>Minimal torrent size</p></body></html> - <html><head/><body><p>Tamanho mínimo do torrent</p></body></html> + + Software + Software - - <html><head/><body><p>Maximal torrent size</p></body></html> - <html><head/><body><p>Tamanho máximo do torrent</p></body></html> + + Pictures + Imagens + + + + Books + Livros + + + + SearchListDelegate + + + + Unknown + Desconhecido + + + SearchTab - + Name i.e: file name Nome - + Size i.e: file size Tamanho - + Seeders i.e: Number of full sources - Seeders + Compartilhadores completos - + Leechers i.e: Number of partial sources - Leechers + Compartilhadores parciais - + Search engine Mecanismo de busca - - Filter search results... - Filtrar resultados da busca... - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results Resultados (exibindo <i>%1</i> de <i>%2</i>): - + Torrent names only Somente nomes de torrents - + Everywhere - Em qualquer lugar - - - - Use regular expressions - Usar expressões regulares + Em todos os lugares - + Searching... Pesquisando... - + Search has finished Pesquisa concluída - + Search aborted Pesquisa cancelada - + An error occurred during search... Ocorreu um erro durante a pesquisa... - + Search returned no results A pesquisa não retornou resultados - + Column visibility - Visibilidade da coluna - - - - SearchPluginManager - - - Unknown search engine plugin file format. - Formato desconhecido do arquivo de plugin do mecanismo de busca. - - - - A more recent version of this plugin is already installed. - Uma versão mais recente deste plugin já está instalada. + Visibilidade da coluna - - - Plugin is not supported. - O plugin não é suportado. + + Form + Formulário - - All categories - Todas as categorias + + Results(xxx) + Resultados (xxx) - - Movies - Filmes + + Search in: + Pesquisar em: - - TV shows - Shows de TV + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Alguns mecanismos de pesquisa buscam na descrição do torrent e nos nomes de arquivos torrent também.</p><p><span style=" font-weight:600;">Em todos os lugares </span>desativa a filtragem a exibe todos os resultados fornecidos pelos mecanismos de pesquisa.</p><p><span style=" font-weight:600;">Somente nomes de torrents</span> exibe somente torrents cujos nomes correspondam ao termo pesquisado.</p></body></html> - - Music - Músicas + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Defina o número máximo e mínimo de seeders permitidos</p></body></html> - - Games - Jogos + + Seeds: + Seeds: - - Anime - Anime + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Número mínimo de seeds</p></body></html> - - Software - Software + + + to + até - - Pictures - Imagens + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Número máximo de seeds</p></body></html> - - - Books - Livros + + + + + - - Update server is temporarily unavailable. %1 - O servidor de atualização está temporariamente indisponível. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Defina o tamanho máximo e mínimo permitido do torrent</p></body></html> - - - Failed to download the plugin file. %1 - Falha ao baixar o arquivo de plugin. %1 + + Size: + Tamanho: - - An incorrect update info received. - Informação de atualização incorreta recebida. + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Tamanho mínimo do torrent</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - O plugin de pesquisa '%1' contém uma string de versão inválida ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Tamanho máximo do torrent</p></body></html> @@ -7724,198 +6973,185 @@ - - - - + + + Search Busca - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - Nenhum plugin de busca está instalado. -Clique no botão "Plugins de busca" na parte inferior direita da janela para instalar alguns. - - - + Download Download - + Go to description page Ir para a página de descrição - + Copy description page URL Copiar URL da página de descrição - + Search plugins... Plugins de busca... - + A phrase to search for. Uma frase para ser pesquisada. - + Spaces in a search term may be protected by double quotes. Espaços em um termo de pesquisa devem ser protegidos por aspas duplas. - + Example: Search phrase example Exemplo: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>: pesquise por <b>foo</b> e <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: pesquise por <b>foo bar</b> - + All plugins Todos os plugins - + Only enabled Somente habilitados - + Select... Selecionar... - - - + + + Search Engine Mecanismo de Busca - + Please install Python to use the Search Engine. Por favor, instale o Python para usar o Mecanismo de Busca. - + Empty search pattern Padrão de busca vazio - + Please type a search pattern first Por favor digite um padrão de busca primeiro - + Stop Parar - + Search has finished Busca finalizada - + Search has failed Busca falhou - ShutdownConfirmDialog - - - Don't show again - Não exibir novamente - + ShutdownConfirmDlg - + qBittorrent will now exit. O qBittorrent irá sair agora. - + E&xit Now Sair A&gora - + Exit confirmation Confirmação de saída - + The computer is going to shutdown. O computador será desligado. - + &Shutdown Now &Desligar Agora - - Shutdown confirmation - Confirmação de desligamento - - - + The computer is going to enter suspend mode. O computador será colocado em modo de suspensão. - + &Suspend Now &Suspender Agora - + Suspend confirmation - Confirmar suspensão + Confirmar supensão - + The computer is going to enter hibernation mode. O computador entrará em modo de hibernação. - + &Hibernate Now &Hibernar Agora - + Hibernate confirmation Confirmar hibernação - + You can cancel the action within %1 seconds. Você pode cancelar a ação dentro de %1 segundos. + + + Shutdown confirmation + Confirmação de desligamento + SpeedLimitDialog - + KiB/s KiB/s @@ -7923,52 +7159,52 @@ SpeedPlotView - + Total Upload Upload Total - + Total Download Download Total - + Payload Upload Upload Payload - + Payload Download Download Payload - + Overhead Upload Sobrecarga de Upload - + Overhead Download Sobrecarga de Download - + DHT Upload Upload DHT - + DHT Download Download DHT - + Tracker Upload Upload do Tracker - + Tracker Download Download do Tracker @@ -7976,95 +7212,87 @@ SpeedWidget - + Period: Período: - + 1 Minute 1 minuto - + 5 Minutes 5 minutos - + 30 Minutes 30 minutos - + 6 Hours 6 horas - + Select Graphs Selecione os Gráficos - + Total Upload Upload Total - + Total Download Download Total - + Payload Upload Upload Payload - + Payload Download Download Payload - + Overhead Upload Sobrecarga de Upload - + Overhead Download Sobrecarga de Download - + DHT Upload Upload DHT - + DHT Download Download DHT - + Tracker Upload Upload do Tracker - + Tracker Download Download do Tracker - StacktraceDialog - - - Crash info - Informações de falha - - - StatsDialog @@ -8077,49 +7305,49 @@ Estatísticas de usuário - - Cache statistics - Estatísticas de cache + + Total peer connections: + Total de conexões de peer: - - Read cache hits: - Acertos do cache de leitura: + + Global ratio: + Proporção global: - - Average time in queue: - Tempo médio na fila: + + Alltime download: + Download (desde sempre): - - Connected peers: - Peers conectados: + + Alltime upload: + Upload (desde sempre): - - All-time share ratio: - Taxa de compartilhamento de todo o tempo: + + Total waste (this session): + Total desperdiçado (nesta sessão): - - All-time download: - Download de todo o tempo: + + Cache statistics + Estatísticas de cache - - Session waste: - Perdas da sessão: + + Read cache hits: + Acertos do cache de leitura: - - All-time upload: - Upload de todo o tempo: + + Average time in queue: + Tempo médio na fila: - Total buffer size: - Tamanho total do buffer: + Total buffers size: + Tamanho total dos buffers: @@ -8147,7 +7375,12 @@ Tamanho total em fila: - + + OK + OK + + + %1 ms 18 milliseconds %1 ms @@ -8156,27 +7389,32 @@ StatusBar - + Connection status: Estado da conexão: - + No direct connections. This may indicate network configuration problems. Sem conexões diretas. Talvez tenha algo errado em sua configuração. - + DHT: %1 nodes DHT: %1 nos - - qBittorrent needs to be restarted! - O qBittorrent precisa ser reiniciado! + + qBittorrent needs to be restarted + qBittorrent precisa ser reiniciado + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent foi atualizado e precisa ser reiniciado para que as mudanças sejam aplicadas. @@ -8195,1570 +7433,1311 @@ Online - + Click to switch to alternative speed limits Clique aqui para mudar para os limites de velocidade alternativa - + Click to switch to regular speed limits Clique aqui para alternar para regular os limites de velocidade - + + Manual change of rate limits mode. The scheduler is disabled. + Mudança manual de limites da taxa. O programador está desativado. + + + Global Download Speed Limit Limite de Velocidade Global de Download - + Global Upload Speed Limit Limite de Velocidade Global de Upload - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter Todos (0) - + Downloading (0) Baixando (0) - + Seeding (0) Enviando (0) - + Completed (0) - Concluído (0) + Completo (0) - + Resumed (0) Retomado (0) - + Paused (0) Pausado (0) - + Active (0) Ativo (0) - + Inactive (0) Inativo (0) - + Errored (0) Com erro (0) - + All (%1) Todos (%1) - + Downloading (%1) Baixando (%1) - + Seeding (%1) Enviando (%1) - + Completed (%1) - Concluído (%1) + Completo (%1) - + Paused (%1) Pausado (%1) - + Resumed (%1) Retomado (%1) - + Active (%1) - Ativo (%1) + Ativos (%1) - + Inactive (%1) Inativo (%1) - + Errored (%1) Com erro (%1) - TagFilterModel + TorrentContentModel - - Tags - Tags + + Name + Nome - - All - Tudo + + Size + Tamanho - - Untagged - Sem etiqueta + + Progress + Progresso - - - TagFilterWidget - - Add tag... - Adicionar tag... + + Download Priority + Prioridade de download - - Remove tag - Remover tag + + Remaining + Faltando + + + TorrentCreatorDlg - - Remove unused tags - Remover tags não utilizadas + + Select a folder to add to the torrent + Selecione uma pasta para adicionar ao torrent - - Resume torrents - Retomar torrents + + Select a file to add to the torrent + Selecione um arquivo para adicionar ao torrent - - Pause torrents - Pausar torrents + + No input path set + Nenhum caminho de entrada selecionado - - Delete torrents - Apagar torrents + + Please type an input path first + Digite primeiro um caminho de entrada - - New Tag - Nova tag + + Select destination torrent file + Selecione o arquivo torrent de destino - - Tag: - Tag: + + Torrent Files (*.torrent) + Arquivos torrent (*.torrent) - - Invalid tag name - Nome de tag inválido + + Torrent was created successfully: %1 + %1 is the path of the torrent + Torrent criado com sucesso: %1 - - Tag name '%1' is invalid - O nome de tag '%1' é inválido + + + + Torrent creation + Criação de torrent - - Tag exists - A tag existe + + Torrent creation was unsuccessful, reason: %1 + A criação do torrent não foi possível, motivo: %1 - - Tag name already exists. - O nome de tag já existe. + + Created torrent file is invalid. It won't be added to download list. + Torrent criado é inválido. Não será adicionado a lista de download. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Propriedades da Categoria do Torrent + + Name + i.e: torrent name + Nome - - Name: - Nome: + + Size + i.e: torrent size + Tamanho - - Save path: - Caminho para salvar: + + Done + % Done + Feito - - Choose save path - Escolha o caminho de salvamento + + Status + Torrent status (e.g. downloading, seeding, paused) + Estado - - New Category - Nova Categoria + + Seeds + i.e. full sources (often untranslated) + Seeds - - Invalid category name - Nome de categoria inválido + + Peers + i.e. partial sources (often untranslated) + Peers - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - O nome da categoria não pode conter '\'. -O nome da categoria não pode iniciar/terminar com '/'. -O nome da categoria não pode conter a sequência '//'. + + Down Speed + i.e: Download speed + Velocidade de download - - Category creation error - Erro ao criar categoria + + Up Speed + i.e: Upload speed + Velocidade de upload - - Category with the given name already exists. -Please choose a different name and try again. - Uma categoria com este nome já existe. -Por favor, escolha um nome diferente e tente novamente. + + Ratio + Share ratio + Taxa - - - TorrentContentModel - - Name - Nome + + ETA + i.e: Estimated Time of Arrival / Time left + ETA - - Size - Tamanho + + Category + Categoria - - Progress - Progresso + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Adicionado em - - Download Priority - Prioridade de download + + Completed On + Torrent was completed on 01/01/2010 08:00 + Completado em - - Remaining - Faltando + + Tracker + Tracker - - Availability - Disponibilidade + + Down Limit + i.e: Download limit + Limite de download - - - TorrentCreatorDialog - - Torrent Creator - Criar Torrent + + Up Limit + i.e: Upload limit + Limite de upload - - Select file/folder to share - Selecione o arquivo/pasta para compartilhar + + Downloaded + Amount of data downloaded (e.g. in MB) + Recebido - - Path: - Caminho: + + Uploaded + Amount of data uploaded (e.g. in MB) + Enviado - - [Drag and drop area] - [Área para arrastar e soltar] + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Baixado na sessão - - - Select file - Selecione o arquivo + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Enviado na sessão - - - Select folder - Selecione a pasta + + Remaining + Amount of data left to download (e.g. in MB) + Faltando - - Settings - Configurações + + Time Active + Time (duration) the torrent is active (not paused) + Tempo Ativo - - Piece size: - Tamanho da parte: + + Save path + Torrent save path + Caminho para salvar - - Auto - Automático + + Completed + Amount of data completed (e.g. in MB) + Completo - - 16 KiB - 16 KB + + Ratio Limit + Upload share ratio limit + Limite da proporção - - 32 KiB - 32 KB + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Última Vez Visto Completo - - 64 KiB - 64 KB + + Last Activity + Time passed since a chunk was downloaded/uploaded + Última Atividade - - 128 KiB - 128 KB + + Total Size + i.e. Size including unwanted data + Tamanho Total + + + TrackerFiltersList - - 256 KiB - 256 KB + + All (0) + this is for the tracker filter + Todos (0) - - 512 KiB - 512 KB + + Trackerless (0) + Sem rastreador (0) - - 1 MiB - 1 MB + + Error (0) + Erro (0) - - 2 MiB - 2 MB + + Warning (0) + Aviso (0) - - 4 MiB - 4 MB + + + Trackerless (%1) + Sem rastreador (%1) - - 8 MiB - 8 MB + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - 16 MiB - 16 MB + + + Error (%1) + Erro (%1) - - 32 MiB - 32 MB + + + Warning (%1) + Aviso (%1) - - Calculate number of pieces: - Calcular número de partes: + + Resume torrents + Retomar torrents - - Private torrent (Won't distribute on DHT network) - Torrent privado (não distribuir em redes DHT) + + Pause torrents + Pausar torrents - - Start seeding immediately - Iniciar a compartilhar imediatamente + + Delete torrents + Apagar Torrents - - Ignore share ratio limits for this torrent - Ignorar limites de taxa de compartilhamento para esse torrent + + + All (%1) + this is for the tracker filter + Todos (%1) + + + TrackerList - - Optimize alignment - Otimizar alinhamento + + URL + URL - - Fields - Campos + + Status + Estado - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - Você pode separar níveis / grupos de trackers com uma linha vazia. + + Received + - - Web seed URLs: - URLs de seed web: + + Seeds + Seeds - - Tracker URLs: - URLs do Tracker: + + Peers + Fontes - - Comments: - Comentários: + + Downloaded + - - Source: - Fonte: + + Message + Mensagem - - Progress: - Progresso: + + + Working + Trabalhando - - Create Torrent - Criar Torrent + + Disabled + Desabilitado - - - - Torrent creation failed - Falha na criação do torrent + + This torrent is private + Este torrent é privado - - Reason: Path to file/folder is not readable. - Motivo: O caminho para o arquivo/pasta não possui permissão de leitura. + + Updating... + Atualizando... - - Select where to save the new torrent - Selecione onde salvar o novo torrent + + Not working + Sem serviço - - Torrent Files (*.torrent) - Arquivos Torrent (*.torrent) + + Not contacted yet + Não contactado ainda - - Reason: %1 - Motivo: %1 + + Tracker URL: + Link do Tracker - - Reason: Created torrent is invalid. It won't be added to download list. - Motivo: O torrent criado é inválido. Ele não será adicionado à lista de downloads. + + Tracker editing + Editando Tracker - - Torrent creator - Criar torrent + + + Tracker editing failed + Falha editando Tracker - - Torrent created: - Torrent criado: - - - - TorrentInfo - - - File size exceeds max limit %1 - O tamanho do arquivo excede o limite máximo de %1 - - - - Torrent file read error: %1 - Erro de leitura do arquivo torrent: %1 - - - - Torrent file read error: size mismatch - Erro de leitura do arquivo torrent: tamanho incompatível - - - - TorrentsController - - - Not contacted yet - Ainda não contactado + + The tracker URL entered is invalid. + O link do Tracker está inválido - - Updating... - Atualizando... - - - - Working - Funcionando - - - - Not working - Não funcionando - - - - Error: '%1' is not a valid torrent file. - Erro: '%1' não é um arquivo torrent válido. - - - - - - - Torrent queueing must be enabled - Torrents em Espera deve estar habilitado - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - Save path is empty - O caminho para salvar está vazio - - - - Cannot make save path - Não foi possível criar o caminho para salvar - - - - Cannot write to directory - Não é possível gravar na pasta - - - - WebUI Set location: moving "%1", from "%2" to "%3" - Definir local da Interface Web: movendo "%1", de "%2" para "%3" - - - - Incorrect torrent name - Nome incorreto do torrent - - - - - Incorrect category name - Nome incorreto de categoria - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - Todos (0) - - - - Trackerless (0) - Sem rastreador (0) - - - - Error (0) - Erro (0) - - - - Warning (0) - Aviso (0) - - - - - Trackerless (%1) - Sem rastreador (%1) - - - - - Error (%1) - Erro (%1) - - - - - Warning (%1) - Aviso (%1) - - - - Resume torrents - Retomar torrents - - - - Pause torrents - Pausar torrents - - - - Delete torrents - Apagar Torrents - - - - - All (%1) - this is for the tracker filter - Todos (%1) - - - - TrackerListWidget - - - - Working - Trabalhando - - - - Disabled - Desabilitado - - - - This torrent is private - Este torrent é privado - - - - Updating... - Atualizando... - - - - Not working - Não funciona - - - - Not contacted yet - Não contatado ainda - - - - - - - - - N/A - N/A - - - - Tracker editing - Editar Tracker - - - - Tracker URL: - URL do Tracker: - - - - - Tracker editing failed - Falha ao editar o Tracker - - - - The tracker URL entered is invalid. - A URL do Tracker fornecida é inválida. - - - + The tracker URL already exists. - A URL do Tracker já existe. + O link do Tracker já existe. - + Add a new tracker... Adicionar novo tracker... - - Remove tracker - Remover tracker - - - + Copy tracker URL Copiar URL do tracker - + Edit selected tracker URL - Editar URL do Tracker selecionado + Editar link do Tracker selecionado - + Force reannounce to selected trackers - Forçar reanúncio dos trackers selecionados + Forçar reanúncio para os trackers selecionados - + Force reannounce to all trackers - Forçar reanúncio de todos os trackers - - - - URL - URL - - - - Status - Status - - - - Received - Recebido - - - - Seeds - Seeds - - - - Peers - Peers - - - - Downloaded - Recebido + Forçar reanuncio de todos os trackers - - Message - Mensagem - - - - Column visibility - Visibilidade da coluna - - - - TrackerLoginDialog - - - - Tracker authentication - Autenticação de tracker - - - - Tracker: - Tracker: - - - - Login - Login - - - - Username: - Usuário: - - - - Password: - Senha: - - - - Log in - Logar + + Remove tracker + Remover tracker - TrackersAdditionDialog + TrackersAdditionDlg - + Trackers addition dialog Diálogo de adição de Trackers - + List of trackers to add (one per line): - Lista de Trackers para adicionar (um por linha): + Lista Trackers para adicionar (um por linha): - - + + µTorrent compatible list URL: URL da lista compatível com µTorrent: - + + I/O Error + Erro de entrada e saída + + + + Error while trying to open the downloaded file. + Erro ao tentar abrir o arquivo baixado. + + + No change - Nenhuma alteração + Sem mudanças - + No additional trackers were found. Não foram encontrados Trackers adicionais. - + Download error Erro no download - + The trackers list could not be downloaded, reason: %1 - A lista de trackers não pôde ser baixada, motivo: %1 + A lista de trackers não pode ser baixada, razão: %1 TransferListDelegate - + Downloading Baixando - + Downloading metadata used when loading a magnet link Baixando metadata - + Allocating qBittorrent is allocating the files on disk Alocando - + Paused Pausado - + Queued i.e. torrent is queued Espera - + Seeding Torrent is complete and in upload-only mode Enviando - + Stalled Torrent is waiting for download to begin Estacionado - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] Baixando - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] Enviando - + Checking Torrent local data is being checked Checando - + Queued for checking i.e. torrent is queued for hash checking Na fila de verificação - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Verificando dados de resumo - + Completed Completo - - Moving - Torrent local data are being moved/relocated - Movendo - - - + Missing Files Arquivos indisponíveis - - - Errored - torrent status, the torrent has an error - Com erro - - - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - %1 (semeado por %2) - - - - %1 ago - e.g.: 1h 20m ago - %1 atrás - - - - TransferListFiltersWidget - - - Status - Estado - - - - Categories - Categorias - - - - Tags - Tags - - - - Trackers - Trackers - - - - TransferListModel - - - Name - i.e: torrent name - Nome - - - - Size - i.e: torrent size - Tamanho - - - - Done - % Done - Concluído - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Status - - - - Seeds - i.e. full sources (often untranslated) - Seeds - - - - Peers - i.e. partial sources (often untranslated) - Peers - - - - Down Speed - i.e: Download speed - Velocidade de Download - - - - Up Speed - i.e: Upload speed - Velocidade de Upload - - - - Ratio - Share ratio - Taxa - - - - ETA - i.e: Estimated Time of Arrival / Time left - Tempo Restante - - - - Category - Categoria - - - - Tags - Tags - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - Adicionado em - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - Concluído em - - - - Tracker - Tracker - - - - Down Limit - i.e: Download limit - Limite de Download - - - - Up Limit - i.e: Upload limit - Limite de Upload - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Recebido - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Enviado - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - Baixado na sessão - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - Enviado na sessão - - - - Remaining - Amount of data left to download (e.g. in MB) - Faltando - - - - Time Active - Time (duration) the torrent is active (not paused) - Tempo Ativo - - - - Save path - Torrent save path - Caminho para salvar + + + Errored + torrent status, the torrent has an error + Com erro - - Completed - Amount of data completed (e.g. in MB) - Concluído + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) + %1 (semeado por %2) - - Ratio Limit - Upload share ratio limit - Taxa Limite + + %1 ago + e.g.: 1h 20m ago + %1 atrás + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - Última Vez Visto Completo + + Status + Estado - - Last Activity - Time passed since a chunk was downloaded/uploaded - Última Atividade + + Categories + Categorias - - Total Size - i.e. Size including unwanted data - Tamanho Total + + Trackers + Trackers TransferListWidget - + Column visibility Visibilidade da coluna - + Choose save path Escolha caminho de salvamento - + Torrent Download Speed Limiting Limitando Velocidade de Download de Torrent - + Torrent Upload Speed Limiting Limitando Velocidade de Upload de Torrent - + Recheck confirmation Confirmação de rechecagem - + Are you sure you want to recheck the selected torrent(s)? Tem certeza de que deseja checar novamente o(s) torrent(s) selecionado(s)? - + Rename Renomear - + New name: Novo nome: - + Resume Resume/start the torrent Resumir - + Force Resume Force Resume/start the torrent Forçar retomada - + Pause Pause the torrent Pausar - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Definir local: movendo "%1", de "%2" para "%3" - - - - Add Tags - Adicionar tags - - - - Remove All Tags - Remover todas as tags - - - - Remove all tags from selected torrents? - Remover todas as tags dos torrents selecionados? + + New Category + Nova categoria - - Comma-separated tags: - Tags separadas por vírgulas: + + Category: + Categoria: - - Invalid tag - Tag inválida + + Invalid category name + Nome de categoria inválido - - Tag name: '%1' is invalid - O nome de tag: '%1' é inválido + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + O nome da categoria não pode conter '\'. +O nome da categoria não pode iniciar/terminar com '/'. +O nome da categoria não pode conter a sequência '//'. - + Delete Delete the torrent Apagar - + Preview file... Arquivo de pré-exibição... - + Limit share ratio... Taxa de limite de compartilhamento... - + Limit upload rate... Limite de taxa de upload... - + Limit download rate... Limite de taxa de download... - + Open destination folder Abrir pasta de destino - + Move up i.e. move up in the queue Mover para cima - + Move down i.e. Move down in the queue Mover para baixo - + Move to top i.e. Move to top of the queue Mover para o topo - + Move to bottom i.e. Move to bottom of the queue Mover para último - + Set location... Definir local... - - Force reannounce - Forçar reanuncio - - - + Copy name Copiar nome - - Copy hash - Copiar hash - - - + Download first and last pieces first Baixar primeiro a primeira e a última parte - + Automatic Torrent Management Gerenciamento Automático de Torrents - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category O modo automático configura várias propriedades do torrent (ex.: caminho para salvar) baseado na categoria associada - + Category Categoria - + New... New category... Nova... - + Reset Reset category Resetar - - Tags - Tags - - - - Add... - Add / assign multiple tags... - Adicionar... - - - - Remove All - Remove all tags - Remover tudo - - - + Priority Prioridade - + Force recheck Forçar re-checagem - + Copy magnet link Copiar link magnético - + Super seeding mode Modo super compartilhador - + Rename... Renomear... - + Download in sequential order Download em ordem sequencial - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - Taxa de limite de Upload/Download to torrent + Torrent Upload/Download limite - - Use global share limit - Usar limite global de compartilhamento + + Use global ratio limit + Usar taxa de limite global - - - + + + buttonGroup - buttonGroup + botãoGrupo + + + + Set no ratio limit + Não configurar taxa de limite + + + + Set ratio limit to + Configurar limite para + + + + WebApplication + + + Incorrect category name + Nome incorreto da categoria + + + + WebUI + + + The Web UI is listening on port %1 + A Web UI é escutado na porta %1 - - Set no share limit - Não definir limite de compartilhamento + + Web UI Error - Unable to bind Web UI to port %1 + Erro da Interface Web - Não foi possível vincular a interface Web para a porta %1 + + + about - - Set share limit to - Definir limite de compartilhamento para + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Um cliente BitTorrent avançado escrito em C++, baseado no toolkit Qt e libtorrent-rasterbar. - - ratio - taxa + + Copyright %1 2006-2016 The qBittorrent project + Copyright %1 2006-2016 Projeto qBittorrent - - minutes - minutos + + Home Page: + Site: - - No share limit method selected - Nenhum método de limite de compartilhamento selecionado + + Forum: + Fórum: - - Please select a limit method first - Por favor, selecione primeiro um método de limitação + + Bug Tracker: + Rastreador de bug: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - Python detectado, versão: %1 + + Add Peers + Adicionar peers - - Python not detected - Python não detectado + + List of peers to add (one per line): + Lista de peers para adicionar (um por linha): + + + + Format: IPv4:port / [IPv6]:port + Formato: IPv4:porta / [IPv6]:porta - WebApplication + authentication + + + + Tracker authentication + Autenticação de tracker + - - Unacceptable file type, only regular file is allowed. - Tipo de arquivo inaceitável, somente o arquivo regular é permitido. + + Tracker: + Tracker: + + + + Login + Login + + + + Username: + Usuário: + + + + Password: + Senha: - - Symlinks inside alternative UI folder are forbidden. - Os links simbólicos dentro da pasta alternativa da interface são proibidos. + + Log in + Logar - - Exceeded the maximum allowed file size (%1)! - Excedido o tamanho máximo de arquivo permitido (%1)! + + Cancel + Cancelar + + + confirmDeletionDlg - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - Interface Web : incompatibilidade do cabeçalho de origem & origem de destino! IP de origem: '%1'. Cabeçalho de origem: '%2'. Origem de destino: '%3' + + Deletion confirmation - qBittorrent + Confirmação de exclusão - qBittorrent - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - Interface Web : incompatibilidade do cabeçalho do referenciador & origem de destino! IP de origem: '%1'. Cabeçalho do referenciador: '%2'. Origem de destino: '%3' + + Remember choice + Lembrar escolha - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - Interface Web: Incompatibilidade do cabeçalho do host e porta. IP de origem do pedido: '%1'. Porta do servidor '%2'. Cabeçalho recebido do host: '%3' + + Also delete the files on the hard disk + Deletar também arquivos do disco + + + confirmShutdownDlg - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - Interface Web: Cabeçalho inválido do host. IP de Origem do pedido: '%1'. Cabeçalho recebido do host: '%2' + + Don't show again + Não exibir novamente - WebUI + createTorrentDialog + + + Cancel + Cancelar + - - Web UI: HTTPS setup successful - Interface Web: HTTPS configurado com sucesso + + Torrent Creation Tool + Ferramenta de Criação de Torrent - - Web UI: HTTPS setup failed, fallback to HTTP - Interface Web: falha ao configurar HTTPS, revertendo para HTTP + + Torrent file creation + Criando arquivo Torrent - - Web UI: Now listening on IP: %1, port: %2 - Interface Web: Escutando agora no IP: %1, porta: %2 + + Add file + Adicionar arquivo - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Interface Web: Não foi possível vincular ao IP: %1, porta: %2. Causa: %3 + + Add folder + Adicionar pasta + + + + File or folder to add to the torrent: + Arquivo ou pasta para adicionar ao torrent: + + + + Tracker URLs: + Tracker URLs: + + + + Web seeds urls: + Web seeds urls: + + + + Comment: + Comentário: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Você pode separar / grupos com uma linha vazia + + + + Piece size: + Tamanho: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32kb + + + + 64 KiB + 64kb + + + + 128 KiB + 128kb + + + + 256 KiB + 256kb + + + + 512 KiB + 512kb + + + + 1 MiB + 1mb + + + + 2 MiB + 2mb + + + + 4 MiB + 4mb + + + + 8 MiB + 8 MB + + + + 16 MiB + 16 MB + + + + Auto + Auto + + + + Private (won't be distributed on DHT network if enabled) + Privado (não distribuir em DHT se habilitado) + + + + Start seeding after creation + Iniciar compartilhamento depois de criar + + + + Ignore share ratio limits for this torrent + Ignorar limites de proporção de compartilhamento para esse torrent + + + + Create and save... + Criar e salvar... + + + + Progress: + Progresso: + + + + downloadFromURL + + + Add torrent links + Adicionar links torrent + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Um por linha (links HTTP, links magnéticos e infor-hashes são suportados) + + + + Download + Baixar + + + + Cancel + Cancelar + + + + Download from urls + Baixar de URLs + + + + No URL entered + Nenhuma URL inserida + + + + Please type at least one URL. + Por favor digite uma URL. + + + + errorDialog + + + Crash info + Informação de crash fsutils - + + + + + Downloads Downloads @@ -9766,100 +8745,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + Python não detectado + + + + Python version: %1 + Versão do Python: 1% + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1h %2m - + %1d %2h e.g: 2days 10hours %1d %2h - + Unknown Unknown (size) Desconhecido - + qBittorrent will shutdown the computer now because all downloads are complete. qBIttorrent irá desligar seu computador agora porque os downloads terminaram. - + < 1m < 1 minute < 1 minuto - + %1m e.g: 10minutes %1m + + + Working + Trabalhando + + + + Updating... + Atualizando... + + + + Not working + Sem serviço + + + + Not contacted yet + Não contactado ainda + preview - + Preview selection Seleção de pré-visualização - + The following files support previewing, please select one of them: Os arquivos a seguir suportam pré-visualização, por favor selecione um: + + + Preview + Pré-visualização + + + + Cancel + Cancelar + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_pt_PT.ts qbittorrent-3.3.15/src/lang/qbittorrent_pt_PT.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_pt_PT.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_pt_PT.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent Acerca do qBittorrent - + About Acerca - + Author Autor - - Current maintainer - Programador atual - - - - Greece - Grécia - - - - + + Nationality: Nacionalidade: - - + + + Name: + Nome: + + + + E-mail: E-mail: - - - Name: - Nome: + + Greece + Grécia - - Original author - Autor original + + Current maintainer + Programador atual - - France - França + + Original author + Autor - + Special Thanks Agradecimento especial - + Translators Tradutores - - License - Licença - - - + Libraries Bibliotecas - + qBittorrent was built with the following libraries: O qBittorrent foi criado com as seguintes bibliotecas: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - Um cliente avançado de BitTorrent programado em C++, baseado em ferramentas QT e em 'libtorrent-rasterbar'. - - - - Copyright %1 2006-2018 The qBittorrent project - Copyright %1 2006-2018 O projeto qBittorrent - - - - Home Page: - Página inicial: - - - - Forum: - Fórum: + + France + França - - Bug Tracker: - Bug Tracker: + + License + Licença @@ -115,57 +90,67 @@ Guardar em - + + Browse... + Procurar... + + + + Set as default save path + Definir como caminho padrão para guardar + + + Never show again Não mostrar novamente - + Torrent settings Definições do torrent - + Set as default category Definir como categoria padrão - + Category: Categoria: - + Start torrent Iniciar torrent - + Torrent information Informação do torrent - + Skip hash check Ignorar verificação hash - + Size: Tamanho: - + Hash: Hash: - + Comment: Comentário: - + Date: Data: @@ -177,7 +162,7 @@ Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - O modo automático significa que várias propriedades do torrent (ex: caminho para guardar) serão decididas pela categoria associada + O modo automático significa que várias propriedades do torrent (ex: salvar caminho) serão decididas pela categoria associada @@ -190,117 +175,89 @@ Automático - - Remember last used save path - Lembrar o último caminho utilizado guardado - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - Se assinalado, o ficheiro .torrent não será eliminado apesar das definições existentes nas opções da página 'Transferência' + Se assinalado, o ficheiro .torrent não será eliminado apesar das definições existentes nas opções da página 'Download' - + Do not delete .torrent file Não eliminar o ficheiro .torrent - - Create subfolder - Criar sub-pasta - - - - Download in sequential order - Fazer o download sequencialmente - - - - Download first and last pieces first - Fazer o download da primeira e última peça primeiro - - - + Normal Normal - + High Alto - + Maximum Máximo - + Do not download - Não fazer a transferência + Não fazer o download - - - + + + I/O Error Erro I/O - + Invalid torrent Torrent inválido - - Renaming - A renomear - - - - - Rename error - Erro ao renomear + + + + + Already in download list + Já existe na lista de downloads - - The name is empty or contains forbidden characters, please choose a different one. - O nome está vazio ou contém caracteres proibidos. por favor escolha um diferente. - - - + Not Available This comment is unavailable Indisponível - + Not Available This date is unavailable Indisponível - + Not available Indisponível - + Invalid magnet link Ligação magnet inválida - + The torrent file '%1' does not exist. O ficheiro de torrent '%1' não existe. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. O ficheiro de torrent '%1' não pode ser lido a partir do disco. Provavelmente porque você não possui permissões suficientes. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,428 +266,327 @@ Erro: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + O torrent já existe na lista de downloads. Os trackers não foram unidos porque é um torrent privado. + + + + Torrent is already in download list. Trackers were merged. + O torrent já existe na lista de downloads. Os trackers serão unidos. + + + + + Cannot add torrent + Não foi possível adicionar o torrent + + + + Cannot add this torrent. Perhaps it is already in adding state. + Não foi possível adicionar o torrent. Talvez já esteja na lista de adições. + + + This magnet link was not recognized Esta ligação magnet não foi reconhecida - + + Magnet link is already in download list. Trackers were merged. + A ligação magnet já existe na lista de downloads. Os trackers serão unidos. + + + + Cannot add this torrent. Perhaps it is already in adding. + Não foi possível adicionar o torrent. Talvez já esteja na lista de adições. + + + Magnet link Ligação magnet - + Retrieving metadata... Obtenção de metadados... - + Not Available This size is unavailable. Indisponível - + Free space on disk: %1 Espaço disponível no disco: %1 - + + Choose save path Escolha o caminho para guardar - - - - - - - Torrent is already present - O torrent já se encontra presente - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - O torrent '%1' já existe na lista de transferências. Os trackers não foram unidos porque é um torrent privado. + + Rename the file + Renomear o ficheiro - - Torrent '%1' is already in the transfer list. Trackers have been merged. - O torrent '%1' já existe na lista de transferências. Os trackers foram unidos. - - - - Torrent is already queued for processing. - O torrent já se encontra em fila para ser processado. - - - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - O link magnet '%1' já existe na lista de transferências. Os trackers foram unidos. + + New name: + Novo nome: - - Magnet link is already queued for processing. - O link magnet já se encontra em fila para ser processado. + + + The file could not be renamed + Não foi possível renomear o ficheiro - - New name: - Novo nome: + + This file name contains forbidden characters, please choose a different one. + Este nome contém caracteres proibidos. Por favor, escolha um nome diferente. - - + + This name is already in use in this folder. Please use a different name. Este nome já se encontra em utilização nessa pasta. Por favor, escolha um nome diferente. - + The folder could not be renamed Não foi possível renomear a pasta - + Rename... Renomear... - + Priority Prioridade - + Invalid metadata Metadados inválidos - + Parsing metadata... Análise de metadados... - + Metadata retrieval complete Obtenção de metadados terminada - + Download Error - Erro ao tentar fazer a transferência + Erro ao tentar fazer o download AdvancedSettings - + + Disk write cache size + Tamanho de cache em disco + + + MiB MB - + Outgoing ports (Min) [0: Disabled] Portas de envio (Mín.) [0: Inativa] - + Outgoing ports (Max) [0: Disabled] Portas de envio (Máx.) [0: Inativa] - + Recheck torrents on completion Verificar torrents ao terminar - + Transfer list refresh interval Intervalo de atualização da lista de transferência - + ms milliseconds ms - + Setting Definição - + Value Value set for this setting Valor - - - (disabled) - (desativado) - - - + (auto) (automático) - - min - minutes - min - - - + All addresses Todos os endereços - + qBittorrent Section Secção qBittorrent - - + + Open documentation Abrir documentação - + libtorrent Section Secção libtorrent - - Asynchronous I/O threads - Threads assíncronas I/O - - - - Disk cache - Cache do disco - - - + s seconds s - + Disk cache expiry interval Intervalo para cache de disco - + Enable OS cache Ativar cache do sistema - - Guided read cache - Cache da leitura guiada - - - - Coalesce reads & writes - Unir leituras e escritas - - - - Send upload piece suggestions - Enviar o upload da peça de sugestões - - - - - KiB - KB - - - - Send buffer watermark - Marca de água do buffer de envio - - - - Send buffer low watermark - Marca de água baixa do buffer de envio - - - - Send buffer watermark factor - Fator da marca de água do buffer de envio - - - - Prefer TCP - Preferir TCP - - - - Peer proportional (throttles TCP) - Semear de forma proporcional (limita TCP) - - - - Allow multiple connections from the same IP address - Permitir várias ligações a partir do mesmo endereço de IP + + m + minutes + m - + Resolve peer countries (GeoIP) Resolver fontes dos países (GeoIP) - + Resolve peer host names Resolver nomes dos servidores de fontes - + Strict super seeding Restringir super semear - + Network Interface (requires restart) Interface de rede (necessita de reiniciar) - + Optional IP Address to bind to (requires restart) - Endereço IP opcional para associar (necessita de reiniciar) + Endereço IP opcional para vincular (necessita de reiniciar) - + Listen on IPv6 address (requires restart) Receber de endereços IPv6 (necessita de reiniciar) - + Display notifications Exibir notificações - + Display notifications for added torrents Exibir notificações para os torrents adicionados - + Download tracker's favicon - Fazer a transferência do favicon tracker - - - - Save path history length - Guardar o tamanho do histórico do caminho - - - - Fixed slots - Slots corrigidos - - - - Upload rate based - Baseado no rácio de upload - - - - Upload slots behavior - Comportamento das slots de upload - - - - Round-robin - Round-robin - - - - Fastest upload - Upload mais rápido + Fazer o download do favicon do tracker - - Anti-leech - Anti-leech - - - - Upload choking algorithm - Algoritmo choking do upload - - - + Confirm torrent recheck Confirmar reverificação do torrent - - Confirm removal of all tags - Confirme o remover de todas as etiquetas + Exchange trackers with other peers + Partilhar trackers com outras fontes - - Always announce to all trackers in a tier - Anunciar sempre para todos os trackers num nível + + Always announce to all trackers + Anunciar sempre para todos os trackers - - Always announce to all tiers - Anunciar sempre para todos os níveis - - - + Any interface i.e. Any network interface Qualquer interface - + Save resume data interval How often the fastresume file is saved. Intervalo para gravação do ficheiro "fastresume" - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - Algoritmo do modo de mistura %1-TCP - - - + Maximum number of half-open connections [0: Unlimited] Número máximo de ligações semiabertas [0: Ilimitado] - + IP Address to report to trackers (requires restart) Endereço IP para reportar aos trackers (necessita de reiniciar) - + Enable embedded tracker Ativar tracker embutido - + Embedded tracker port Porta do tracker embutido - + Check for software updates Procurar atualizações - + Use system icon theme Utilizar o tema com os ícones do sistema @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 iniciado - + Torrent: %1, running external program, command: %2 Torrent: %1, a correr programa externo, comando: %2 - - Torrent name: %1 - Nome do torrent: %1 - - - - Torrent size: %1 - Tamanho do torrent: %1 - - - - Save path: %1 - Caminho para guardar: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Foi feito a transferência do torrent para %1. - - - - Thank you for using qBittorrent. - Obrigado por utilizar o qBittorrent. - - - - [qBittorrent] '%1' has finished downloading - O [qBittorrent] '%1' terminou de fazer a transferência + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrent: %1, comando para correr programa externo demasiado longo (tamanho > %2) - falha na execução. - + Torrent: %1, sending mail notification Torrent: %1, a enviar notificação por e-mail - + Information Informações - - To control qBittorrent, access the Web UI at %1 - Para controlar o qBittorrent, aceda à interface web em %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + Para controlar o qBittorrent, aceda à interface web em http://localhost:%1 - + The Web UI administrator user name is: %1 - O nome de utilizador do administrador da interface web é: %1 + O nome de utilizador da interface web é: %1 - + The Web UI administrator password is still the default one: %1 A palavra-passe de administrador para aceder a interface web ainda é a pré-definida: %1 - + This is a security risk, please consider changing your password from program preferences. Isto apresenta um risco de segurança, favor considere alterar a palavra-passe através das definições do programa. - + Saving torrent progress... A guardar progresso do torrent... - - - Portable mode and explicit profile directory options are mutually exclusive - As opções do modo portátil e as opções explicitas da diretoria do perfil são mutuamente exclusivas - - - - Portable mode implies relative fastresume - O modo portátil implica fastresume relativo - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - Erro de inicio de sessão no WebAPI. Motivo: O IP foi banido, IP: %1, nome de utilizador: %2 - - - - Your IP address has been banned after too many failed authentication attempts. - O seu endereço IP foi banido após várias tentativas de autenticação falhadas. - - - - WebAPI login success. IP: %1 - Inicio de sessão com sucesso no WebAPI. IP: %1 - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - Erro de inicio de sessão no WebAPI. Motivo: Credenciais inválidas, tentativas: %1, IP: %2, nome de utilizador: %3 - AutomatedRssDownloader - + Save to: Guardar em: @@ -861,817 +658,680 @@ Downloader de RSS - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - O download automático de torrents RSS está agora desativado! Você pode ativá-lo nas definições da aplicação. + + Enable Automated RSS Downloader + Ativar o download automático de RSS - + Download Rules Regras para download - + Rule Definition Definição de regra - + Use Regular Expressions Utilizar expressões regulares - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - O 'Filtro inteligente de episódios' irá verificar o número do episódio para prevenir downloads duplicados. -Suporta os formatos: S01E01, 1x1, 2017.01.01 e 01.01.2017 (Formatos de data suportando também - como separador) - - - - Use Smart Episode Filter - Utilizar o 'Filtro inteligente de episódios' - - - + Must Contain: Deverá conter: - + Must Not Contain: Não deverá conter: - + Episode Filter: Filtro de episódio: - + Assign Category: Atribuir categoria: - + Save to a Different Directory Guardar noutra diretoria - + Ignore Subsequent Matches for (0 to Disable) ... X days Ignorar ocorrências subsequentes para (0 para desativar) - + Disabled - Inativo + Inativo - + days dias - + Add Paused: Se em pausa: - + Use global settings Utilizar definições globais - + Always Sempre - + Never Nunca - + Apply Rule to Feeds: Aplicar regra às fontes: - + Matching RSS Articles Artigos RSS coincidentes - + &Import... &Importar... - + &Export... &Exportar... - + Matches articles based on episode filter. Correspondência de artigos tendo por base o filtro de episódios. - + Example: Exemplo: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match irá corresponder aos episódios 2, 5, 8 até 15, 30 e subsequentes da temporada um - + Episode filter rules: Regras para filtro de episódios: - + Season number is a mandatory non-zero value O número de temporada tem que ser um valor positivo - + Episode number is a mandatory non-zero value + O número de episódio tem que ser positivo + + + Filter must end with semicolon O filtro deve terminar com ponto e vírgula - + Three range types for episodes are supported: São suportados três tipos de intervalos para episódios: - + Single number: <b>1x25;</b> matches episode 25 of season one Um número: <b>1x25;</b> corresponde ao episódio 25 da temporada um - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Intervalo normal: <b>1x25-40;</b> corresponde aos episódios 25 a 40 da temporada um - - Episode number is a mandatory positive value - O número de episódio tem de ser obrigatóriamente positivo - - - - Rules - Regras + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Intervalo infinito: <b>1x25-;</b> corresponde aos episódios 25 e superiores da temporada um - - Rules (legacy) - Regras (legado) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Limite infinito: <b>1x25-;</b> corresponde os episódios 25 e superiores da temporada um, e a todos os episódios de temporadas posteriores + - + Last Match: %1 days ago Última correspondência: %1 dias atrás - + Last Match: Unknown Última correspondência: desconhecida - + New rule name Nome da nova regra - + Please type the name of the new download rule. Por favor, escreva o nome da nova regra para downloads. - - + + Rule name conflict Conflito no nome da regra - - + + A rule with this name already exists, please choose another name. Já existe uma regra com este nome. Por favor, escolha outro nome. - + Are you sure you want to remove the download rule named '%1'? Tem a certeza de que deseja remover a regra para downloads com o nome '%1'? - + Are you sure you want to remove the selected download rules? Tem a certeza que deseja remover as regras selecionadas para downloads? - + Rule deletion confirmation Confirmação de eliminação de regra - + Destination directory Diretoria de destino - + Invalid action Ação inválida - + The list is empty, there is nothing to export. - A lista encontra-se vazia, não há nada para exportar. + A lista está vazia, não existem itens para exportar. - - Export RSS rules - Exportar regras RSS + + Where would you like to save the list? + Onde gostaria de guardar a lista? - - + + Rules list (*.rssrules) + Lista de regras (*.rssrules) + + + I/O Error Erro I/O - - Failed to create the destination file. Reason: %1 - Ocorreu um erro ao tentar criar o ficheiro de destino. Motivo: %1 + + Failed to create the destination file + Ocorreu um erro ao criar o ficheiro de destino - - Import RSS rules - Importar regras RSS + + Please point to the RSS download rules file + Por favor, indique o ficheiro para download das regras RSS - - Failed to open the file. Reason: %1 - Ocorreu um erro ao tentar abrir o ficheiro. Motivo: %1 + + Rules list + Lista de regras - + Import Error - Erro ao importar + Erro de importação - - Failed to import the selected rules file. Reason: %1 - Ocorreu um erro ao tentar o ficheiro com as regras selecionadas. Motivo: %1 + + Failed to import the selected rules file + Ocorreu um erro ao importar o ficheiro de regras - + Add new rule... Adicionar nova regra... - + Delete rule Eliminar regra - + Rename rule... Renomear regra... - + Delete selected rules Eliminar regras selecionadas - - Clear downloaded episodes... - Limpar os episódios descarregados... - - - + Rule renaming Renomear regra - + Please type the new rule name Por favor, escreva o novo nome da regra - - Clear downloaded episodes - Limpar os episódios descarregados - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - Tem certeza de que deseja limpar a lista de episódios descarregados para a regra selecionada? - - - - Regex mode: use Perl-compatible regular expressions - Modo regex: utilizar expressões regulares compatíveis com Perl - - - - - Position %1: %2 - Posição %1: %2 + + Regex mode: use Perl-like regular expressions + Modo regex: utilizar expressões regulares Perl - + Wildcard mode: you can use - Modo 'Wildcard': você pode utilizar + - + ? to match any single character - ? para corresponder a qualquer caracter + - + * to match zero or more of any characters - * para igualar a zero ou mais caracteres + - + Whitespaces count as AND operators (all words, any order) - Os espaços em branco contam como operadores AND (E) (todas as palavras, qualquer ordem) + - + | is used as OR operator - É utilizado como operador OU (OR) + - + If word order is important use * instead of whitespace. - Se a ordem das palavras é importante utilize * em vez de um espaço em branco. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Uma expressão com uma cláusula %1 vazia (por exemplo, %2) + - + will match all articles. - irá corresponder a todos os artigos. + - + will exclude all articles. - irá excluir todos os artigos. - - - - BanListOptionsDialog - - - List of banned IP addresses - Lista de endereços de IP banidos - - - - Ban IP - Banir IP - - - - Delete - Eliminar - - - - - Warning - Aviso + - - The entered IP address is invalid. - O endereço de IP introduzido é inválido. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Modo wildcard: pode usar<ul><li>? para fazer coincidir com um carácter</li><li>* para fazer coincidir com 0 ou mais de quaisquer caracteres.</li><li>Os espaços vazios contam como operador AND</li></ul> - - The entered IP is already banned. - O IP inserido já se encontra banido. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Modo wildcard: pode usar<ul><li>? para fazer coincidir com um carácter</li><li>* para fazer coincidir com 0 ou mais de quaisquer caracteres.</li><li>| é utilizado como operador OR</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support É necessário reiniciar para alternar para o suporte PeX - - Could not get GUID of configured network interface. Binding to IP %1 - Não é possível obter o 'Identificador único global' (GUID) da interface de rede configurada. A vincular para o IP %1 - - - + Embedded Tracker [ON] Tracker embutido [ON] - + Failed to start the embedded tracker! Ocorreu um erro ao tentar iniciar o tracker embutido! - + Embedded Tracker [OFF] Tracker embutido [OFF] - + + '%1' reached the maximum ratio you set. Removing... + '%1' atingiu o rácio máximo definido por si. A remover... + + + + '%1' reached the maximum ratio you set. Pausing... + '%1' atingiu o rácio máximo definido por si. A colocar em pausa... + + + System network status changed to %1 e.g: System network status changed to ONLINE O estado da rede do sistema foi alterado para %1 - + ONLINE - ON-LINE + ONLINE - + OFFLINE - OFF-LINE + OFFLINE - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding A configuração da rede %1 foi alterada. A atualizar a sessão. - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. - O endereço da interface de rede configurada %1 é inválido + O endereço da interface de rede configurada %1 não é válido - - + Encryption support [%1] Suporte para encriptação [%1] - - + FORCED FORÇADO - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 não é um endereço de IP válido e foi rejeitado ao ser aplicada a lista de endereços banidos. - - - - + Anonymous mode [%1] Modo anónimo [%1] - + Unable to decode '%1' torrent file. Não foi possível descodificar o ficheiro de torrent '%1'. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Download recursivo do ficheiro '%1', incorporado no torrent %2 - + Queue positions were corrected in %1 resume files - As posições da fila foram corrigidas em %1 ficheiros retomados + - + Couldn't save '%1.torrent' Não foi possível guardar '1%.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' foi removido da lista de transferências. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' foi removido da lista de transferências e do disco. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '%1' foi removido da lista de transferências mas não foi possível eliminar os ficheiros. Erro: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. - porque '%1' encontra-se inativo. + porque '%1' se encontra inativo. - + because %1 is disabled. this peer was blocked because TCP is disabled. - porque '%1' encontra-se inativo. + porque '%1' se encontra inativo. - + URL seed lookup failed for URL: '%1', message: %2 A procura do URL de sementes falhou para o URL: '%1', mensagem: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. O qBittorrent não conseguiu receber da interface %1, porta: %2/%3. Motivo: %4 - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' foi removido da lista de transferências e do disco. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' foi removido da lista de transferências. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... A fazer o download de '%1'. Aguarde, por favor... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 O qBitorrent está a tentar receber de qualquer porta: %1 - + The network interface defined is invalid: %1 - A interface de rede definida é inválida: %1 + A interface de rede definida não é válida: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 O qBitorrent está a tentar receber na interface %1, porta: %2 - - Peer ID: - ID da fonte: - - - - HTTP User-Agent is '%1' - O agente de utilizador HTTP é '%1' - - - - + DHT support [%1] Suporte DHT [%1] - - - - - - - - - + + + + ON ON - - - - - - - - - + + + + OFF OFF - - + Local Peer Discovery support [%1] Suporte para a 'Descoberta de fontes locais' [%1] - - PeX support [%1] - Suporte PeX [%1] - - - - '%1' reached the maximum ratio you set. Removed. - '%1' atingiu o rácio máximo definido por si. Removido. - - - - '%1' reached the maximum ratio you set. Paused. - '%1' atingiu o rácio máximo definido por si. Em pausa. - - - - '%1' reached the maximum seeding time you set. Removed. - '%1' atingiu o período máximo a semear definido por si. Removido. + Restart is required to toggle Tracker Exchange support + É necessário reiniciar para mudar para o suporte do Tracker Exchange - - '%1' reached the maximum seeding time you set. Paused. - '%1' atingiu o período máximo a semear definido por si. Em pausa. - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on O qBittorrent não encontrou o endereço local %1 para a receção - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface O qBittorrent não conseguiu receber de qualquer porta: %1. Motivo: %2 - + Tracker '%1' was added to torrent '%2' O tracker '%1' foi adicionado ao torrent '%2' - + Tracker '%1' was deleted from torrent '%2' O tracker '%1' foi eliminado do torrent '%2' - + URL seed '%1' was added to torrent '%2' O URL semeador '%1' foi adicionado ao torrent '%2' - + URL seed '%1' was removed from torrent '%2' O URL semeador '%1' foi removido do torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Não foi possível retomar o torrent %1 - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Foi analisado com sucesso o filtro de IP fornecido: Foram aplicadas %1 regras. - + Error: Failed to parse the provided IP filter. Erro: falha ao analisar o filtro de IP fornecido. - - '%1' restored. - 'torrent name' restored. - '%1' restaurado. - - - + Couldn't add torrent. Reason: %1 Não foi possível adicionar o torrent. Motivo: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' foi retomado. (retoma rápida) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' foi adicionado à lista de downloads. - + An I/O error occurred, '%1' paused. %2 Ocorreu um erro I/O, '%1' foi colocado em pausa. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Falha no mapeamento da porta, mensagem: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Portas mapeadas com sucesso, mensagem: %1 - + due to IP filter. this peer was blocked due to ip filter. através de um filtro IP. - + due to port filter. this peer was blocked due to port filter. através de um filtro de porta. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. através das restrições do modo misto i2p. - + because it has a low port. this peer was blocked because it has a low port. porque possui uma porta baixa. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 O qBittorrent está a receber com sucesso da interface %1, porta: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 IP externo: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - falha ao criar um novo ficheiro torrent - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - Fazer o download da primeira e última peça primeiro: %1, torrent: '%2' - - - - On - On - - - - Off - Off - - - - Successfully moved torrent: %1. New path: %2 - Torrent movido com sucesso: '%1. Novo caminho: %2 - - - + Could not move torrent: '%1'. Reason: %2 Não foi possível mover o torrent: '%1'. Motivo: %2 - + File sizes mismatch for torrent '%1', pausing it. Disparidade de tamanhos para o torrent '%1', que está a ser colocado em pausa. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... A retoma rápida rejeitou o torrent '%1'. Motivo: %2. A verificar novamente... @@ -1679,19 +1339,19 @@ CategoryFilterModel - + Categories - Categorias + Categorias - + All - Tudo + Todos - + Uncategorized - Sem categoria + @@ -1699,42 +1359,145 @@ Add category... - Adicionar categoria + Adicionar categoria... Add subcategory... - Adicionar sub-categoria... + - Edit category... - Editar categoria... + Remove category + Remover categoria + + + + Remove unused categories + Remover categorias não utilizadas + + + + Resume torrents + Retomar torrents + + + + Pause torrents + Pausar torrents + + + + Delete torrents + Eliminar torrents + + + + New Category + Nova categoria + + + + Category: + Categoria: + + + + Invalid category name + Nome de categoria inválido + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Tudo (0) + + + Uncategorized (0) + Sem categoria (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Sem categoria (%1) + + + Add category... + Adicionar categoria... - Remove category - Remover categoria + Remover categoria - Remove unused categories - Remover categorias não utilizadas + Remover categorias não utilizadas - Resume torrents - Retomar torrents + Retomar torrents - Pause torrents - Pausar torrents + Pausar torrents - Delete torrents - Eliminar torrents + Eliminar torrents + + + New Category + Nova categoria + + + Category: + Categoria: + + + Invalid category name + Nome de categoria inválido + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + O nome da categoria não deverá conter '\'. +O nome da categoria não deverá começar/terminar com '\'. +O nome da categoria não deverá conter a sequência '//'. + + + All (%1) + this is for the category filter + Tudo (%1) @@ -1774,106 +1537,58 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Confirmação de eliminação - - - - Remember choice - Memorizar escolha - - - - Also delete the files on the hard disk - Eliminar também os ficheiros existentes no disco rígido - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - Tem a certeza que pretende eliminar '%1' da lista de transferências? + Tem a certeza de que pretende eliminar '%1' da lista de transferências? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? Tem a certeza que quer eliminar estes %1 torrents da lista de transferências? - DownloadFromURLDialog - - - Download from URLs - Fazer o download a partir de URLs - - - - Add torrent links - Adicionar ligações torrent - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - Uma ligação por linha (são suportados ligações HTTP, ligações magnet e info-hashes) - - - - Download - Download - - - - No URL entered - Nenhum URL inserido - - - - Please type at least one URL. - Por favor, introduza pelo menos um URL. - - - DownloadedPiecesBar - + White: Missing pieces Branco: Peças em falta - + Green: Partial pieces Verde: Peças parciais - + Blue: Completed pieces Azul: Peças completas - ExecutionLogWidget + ExecutionLog - + General Geral - + Blocked IPs IPs bloqueados - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked <font color='red'>%1</font> foi bloqueado %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned <font color='red'>%1</font> foi banido @@ -1882,112 +1597,41 @@ FeedListWidget - + RSS feeds Fontes RSS - - - Unread (%1) - Por ler (%1) + + Unread + Não lidas FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. + + An error occured while trying to open the log file. Logging to file is disabled. Ocorreu um erro ao tentar abrir o ficheiro de registo. Está desativado o registo para o ficheiro. - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - &Explorar... - - - - Choose a file - Caption for file open/save dialog - Escolha um ficheiro - - - - Choose a folder - Caption for directory open dialog - Escolha uma pasta - - - - Any file - Qualquer ficheiro - - - FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - Erro I/O: Não é possível abrir o ficheiro do filtro de IP no modo de leitura. - - - - - - IP filter line %1 is malformed. - A linha %1 do filtro IP encontra-se mal formada. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - O filtro IP da linha %1 está mal formado. O IP de início do intervalo encontra-se mal formado. + + + + I/O Error: Could not open ip filter file in read mode. + Erro I/O: Não foi possível abrir o ficheiro do filtro ip no modo de leitura. - - - IP filter line %1 is malformed. End IP of the range is malformed. - O filtro IP da linha %1 está mal formado. O IP do fim do intervalo encontra-se mal formado. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - O filtro IP da linha %1 está mal formado. Um IP é IPv4 e outro IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - Exceção do filtro de IP lançado para a linha %1. A exceção é: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - Ocorreram %1 erros extra de análise do filtro de IP - - - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. Erro de análise: O ficheiro do filtro não é um ficheiro PeerGuardian P2B válido. @@ -1995,396 +1639,472 @@ GeoIPDatabase - - + + Unsupported database file size. Tamanho do ficheiro da base de dados não suportado. - + Metadata error: '%1' entry not found. Erro de metadados: Entrada '%1' não encontrada. - + Metadata error: '%1' entry has invalid type. Erro de metadados: A entrada '%1' é de um tipo inválido. - + Unsupported database version: %1.%2 Versão não suportada da base de dados: %1.%2 - + Unsupported IP version: %1 Versão não suportada do IP: %1 - + Unsupported record size: %1 Tamanho de gravação não suportado: %1 - + Invalid database type: %1 Tipo de base de dados inválido: %1 - + Database corrupted: no data section found. Base de dados corrompida: secção de dados não encontrada. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - O pedido Http excede o limite de tamanho, a encerrar socket. Limite: %ld, IP: %s + + File + Ficheiro - - Bad Http request, closing socket. IP: %s - Pedido inválido de Http, a encerrar socket: IP: %s + + Edit + Editar - - - HttpServer - + + Help + Ajuda + + + Exit qBittorrent Sair do qBittorrent - + Only one link per line Apenas uma ligação por linha - + + Download + Download + + + Global upload rate limit must be greater than 0 or disabled. O limite do rácio global para uploads tem que ser superior a 0 ou inativo. - + Global download rate limit must be greater than 0 or disabled. O limite do rácio global para downloads tem que ser superior a 0 ou inativo. - + Alternative upload rate limit must be greater than 0 or disabled. O limite do rácio alternativo para uploads tem que ser superior a 0 ou inativo. - + Alternative download rate limit must be greater than 0 or disabled. O limite do rácio alternativo para downloads tem que ser superior a 0 ou inativo. - + Maximum active downloads must be greater than -1. O número máximo de downloads ativos tem que ser superior a -1. - + Maximum active uploads must be greater than -1. O número máximo de uploads ativos tem que ser superior a -1. - + Maximum active torrents must be greater than -1. O número máximo de torrents ativos tem que ser superior a -1. - + Maximum number of connections limit must be greater than 0 or disabled. O número máximo do limite de ligações tem que ser superior a 0 ou inativo. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. O número máximo do limite de ligações por torrent tem que ser superior a 0 ou inativo. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. - O número máximo do limite de slots de upload por torrent tem que ser superior a 0 ou inativo. + O número máximo do limite de ligações para upload por torrent tem que ser superior a 0 ou inativo. - + Unable to save program preferences, qBittorrent is probably unreachable. Não foi possível guardar as preferências, o qBittorrent está provavelmente inacessível. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent no Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - Nome da categoria inválido: -Por favor, não utilize nenhum caractere especial para o nome da categoria. - - - - Unknown - Desconhecido(a) - - - - Hard Disk - Disco rígido - - - - Share ratio limit must be between 0 and 9998. - O limite do rácio de partilha deverá estar situado entre 0 e 9998. - - - - Seeding time limit must be between 0 and 525600 minutes. - O limite do tempo a semear deverá estar localizado entre os 0 e os 525600 minutos. + + Language + Idioma - + The port used for incoming connections must be between 1 and 65535. A porta utilizada para as receções tem que estar compreendida entre 1 e 65535. - + The port used for the Web UI must be between 1 and 65535. A porta utilizada para a interface web tem que estar compreendida entre 1 e 65535. - + Unable to log in, qBittorrent is probably unreachable. Não foi possível iniciar sessão, o qBittorrent está provavelmente inacessível. - + Invalid Username or Password. Palavra-passe ou utilizador inválido. - - Username - Nome de utilizador - - - + Password Palavra-passe - + Login Iniciar sessão - + + Upload Failed! + Ocorreu um erro ao tentar fazer o upload! + + + Original authors Autores originais - + + Upload limit: + Limite de upload: + + + + Download limit: + Limite de download: + + + Apply Aplicar - + Add Adicionar - + + Category: + Categoria: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Fazer o upload de torrents - + + All + Todos + + + + Downloading + A fazer o download + + + + Seeding + A semear + + + + Completed + Terminado(s) + + + + Resumed + Retomado(s) + + + + Paused + Em pausa + + + + Active + Ativo(s) + + + + Inactive + Inativo(s) + + + Save files to location: Gravar ficheiros em: - + Cookie: Cookie: - + Type folder here Escreva aqui a pasta - + + Run an external program on torrent completion + Executar uma aplicação externa ao terminar a transferência + + + + Enable bandwidth management (uTP) + Ativar a gestão da largura de banda (uTP) + + + + Apply rate limit to uTP connections + Aplicar o rácio limite às ligações uTP + + + + Alternative Global Rate Limits + Limites alternativos do rácio global + + + More information Mais informações - + Information about certificates Informações acerca dos certificados - + Save Files to Guardar ficheiros em - - Set location - Definir localização - - - - Limit upload rate - Limitar rácio de upload + + Watch Folder + Ver pasta - - Limit download rate - Limitar o rácio de download + + Default Folder + Pasta padrão - - Rename torrent - Renomear torrent + + from + from time1 to time2 + de - - Unable to create category - + + to + from time1 to time2 + para - + Other... Save Files to: Watch Folder / Default Folder / Other... Outro... - + + Every day + Schedule the use of alternative rate limits on ... + Diariamente + + + + Week days + Schedule the use of alternative rate limits on ... + Dias da semana + + + + Week ends + Schedule the use of alternative rate limits on ... + Fins de semana + + + Monday Schedule the use of alternative rate limits on ... Segunda-feira - + Tuesday Schedule the use of alternative rate limits on ... Terça-feira - + Wednesday Schedule the use of alternative rate limits on ... Quarta-feira - + Thursday Schedule the use of alternative rate limits on ... Quinta-feira - + Friday Schedule the use of alternative rate limits on ... Sexta-feira - + Saturday Schedule the use of alternative rate limits on ... Sábado - + Sunday Schedule the use of alternative rate limits on ... Domingo - + + Downloaded + Is the file downloaded or not? + Descarregado + + + Logout Terminar sessão - + + Download from URLs + Fazer o download a partir de URLs + + + Download Torrents from their URLs or Magnet links - Fazer o download de torrents a partir dos seus URLs ou de ligações magnet + Fazer o download de torrents a partir dos seus URLs ou de ligações Magnet - + Upload local torrent Fazer o upload de torrent local - + Are you sure you want to delete the selected torrents from the transfer list? Tem a certeza de que quer eliminar os torrents selecionados da lista de transferências? - + Save Guardar - + qBittorrent client is not reachable O cliente qBittorrent encontra-se inacessível - - qBittorrent has been shutdown. - O qBittorrent foi desligado. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Lista de sub-redes de IP confiável + + HTTP Server + Servidor HTTP - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Exemplo: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + São suportados os seguintes parâmetros: - - Add subnet - Adicionar sub-rede + + Torrent path + Caminho do torrent - - Delete - Eliminar + + Torrent name + Nome do torrent - - Error - Erro + + qBittorrent has been shutdown. + O qBittorrent foi desligado. + + + LineEdit - - The entered subnet is invalid. - A sub-rede inserida é inválida. + + Clear the text + Limpar texto LogListWidget - + Copy Copiar - + Clear Limpar @@ -2417,550 +2137,492 @@ Ao t&erminar os downloads - + &View &Ver - + &Options... &Opções... - + &Resume &Retomar - + Torrent &Creator &Criador de torrents - + Set Upload Limit... Definir o limite de uploads... - + Set Download Limit... Definir o limite de downloads... - + Set Global Download Limit... Definir o limite global de downloads... - + Set Global Upload Limit... Definir o limite global de uploads... - + Minimum Priority Prioridade mínima - + Top Priority Prioridade máxima - + Decrease Priority Diminuir prioridade - + Increase Priority Aumentar prioridade - - + + Alternative Speed Limits Limites alternativos de velocidade - + &Top Toolbar &Barra superior - + Display Top Toolbar Exibir a barra superior - - Status &Bar - &Barra de estado - - - + S&peed in Title Bar &Velocidade na barra de título - + Show Transfer Speed in Title Bar - Exibir a velocidade de transferência na barra de título + Exibir a velocidade da transferência na barra de título - + &RSS Reader Leitor &RSS - + Search &Engine Motor bu&sca - + L&ock qBittorrent Bl&oquear o qBittorrent - + Do&nate! Do&ar! - - Close Window - Fechar janela - - - + R&esume All R&etomar tudo - + Manage Cookies... Gerir cookies... - + Manage stored network cookies Gerir os cookies de rede guardados - + Normal Messages Mensagens normais - + Information Messages Mensagens informativas - + Warning Messages Mensagens de aviso - + Critical Messages Mensagens críticas - + &Log &Registo - + &Exit qBittorrent S&air do qBittorrent - + &Suspend System &Suspender sistema - + &Hibernate System &Hibernar sistema - + S&hutdown System D&esligar sistema - + &Disabled - &Não fazer nada + &Desativado - + &Statistics Estatística&s - + Check for Updates Pesquisar por atualizações - + Check for Program Updates Pesquisar por atualizações da aplicação - + &About &Acerca - + &Pause &Pausar - + &Delete E&liminar - + P&ause All P&ausar tudo - + &Add Torrent File... &Adicionar ficheiro torrent... - + Open Abrir - + E&xit Sa&ir - + Open URL Abrir URL - + &Documentation &Documentação - + Lock Bloquear - - - + + + Show Exibir - + Check for program updates Pesquisar por atualizações da aplicação - + Add Torrent &Link... Adicionar &ligação torrent... - + If you like qBittorrent, please donate! Se gosta do qBittorrent, ajude-nos e faça uma doação! - - + Execution Log Registo de execução - + Clear the password Limpar palavra-passe - + Filter torrent list... Filtrar lista de torrents... - + &Set Password Definir palavra-pa&sse - - Preferences - Preferências - - - + &Clear Password &Limpar palavra-passe - + Transfers Transferências - - - qBittorrent is minimized to tray - O qBittorrent foi minimizado para a barra de tarefas - - - - - - This behavior can be changed in the settings. You won't be reminded again. - Este comportamento pode ser modificado nas definições. Você não será novamente relembrado. - - - + Torrent file association Associação de ficheiros torrent - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? - O qBittorrent não é a aplicação pré-definida para ficheiros torrent e ligações magnet. Gostaria de associar o qBittorrent a este tipo de ficheiros e ligações? + O qBittorrent não é a aplicação pré-definida para ficheiros torrent e ligações Magnet. Gostaria de associar o qBittorrent a este tipo de ficheiros e ligações? - + Icons Only Apenas ícones - + Text Only Apenas texto - + Text Alongside Icons Texto ao lado dos ícones - + Text Under Icons Texto abaixo dos ícones - + Follow System Style Utilizar o estilo do sistema - - - + + + UI lock password Palavra-passe da interface - - - + + + Please type the UI lock password: Por favor, escreva a palavra-passe da interface: - + The password should contain at least 3 characters A palavra-passe deverá conter pelo menos 3 caracteres - + Password update Atualizar palavra-passe - + The UI lock password has been successfully updated A palavra-passe da interface foi atualizada com sucesso - + Are you sure you want to clear the password? Tem a certeza que pretende eliminar a palavra-passe? - - Use regular expressions - Utilizar expressões regulares - - - + Search Pesquisar - + Transfers (%1) Transferências (%1) - + Error Erro - + Failed to add torrent: %1 Ocorreu um erro ao tentar adicionar o torrent: %1 - + Torrent added Torrent adicionado - + '%1' was added. e.g: xxx.avi was added. Foi adicionado '%1'. - + Download completion Download concluído - + I/O Error i.e: Input/Output Error Erro I/O - + Recursive download confirmation Confirmação de download recursivo - + Yes Sim - + No Não - + Never Nunca - + Global Upload Speed Limit Limite global da velocidade para os uploads - + Global Download Speed Limit Limite global da velocidade para os downloads - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - O qBittorrent foi atualizado e necessita de ser reiniciado para que as alterações tenham efeito. - - - - qBittorrent is closed to tray - O qBittorrent foi fechado para a barra de tarefas - - - - Some files are currently transferring. - Ainda estão a ser transferidos alguns ficheiros. - - - - Are you sure you want to quit qBittorrent? - Tem a certeza que deseja sair do qBittorrent? - - - + &No &Não - + &Yes &Sim - + &Always Yes - &Fechar sempre - - - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - Não foi possível determinar a sua versão Python. O motor de busca foi desativado. + Se&mpre 'Sim' - + Old Python Interpreter Processador Python desatualizado - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. A sua versão Python (%1) encontra-se desatualizada. Para que os motores de busca funcionem, necessita de fazer o upgrade para a versão mais recente. Requisitos mínimos: Versão 2.7.9/3.3.0 - + qBittorrent Update Available Atualização disponível - + + A new version is available. +Do you want to download %1? + Está disponível uma nova versão. +Deseja fazer o download de %1? + + + Already Using the Latest qBittorrent Version Já está a utilizar a versão mais recente do qBittorrent - + Undetermined Python version Versão Python indeterminada - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. Terminou o download de '%1'. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2969,158 +2631,154 @@ Motivo: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? O torrent '%1' contém ficheiros torrent, deseja continuar com o seu download? - + Couldn't download file at URL '%1', reason: %2. Não foi possível fazer o download do ficheiro do URL '%1'. Motivo: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin Descoberto Python em %1: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + Não foi possível determinar a sua versão Python (%1). O motor de busca foi desativado. + + + + Missing Python Interpreter Interpretador Python inexistente - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? É necessário o Python para poder utilizar o motor de busca, mas parece que não existe nenhuma versão instalada. Gostaria de o instalar agora? - + Python is required to use the search engine but it does not seem to be installed. É necessário o Python para poder utilizar o motor de busca, mas parece que não existe nenhuma versão instalada. - - A new version is available. - Está disponível uma nova versão. - - - - Do you want to download %1? - Deseja fazer o download de %1? - - - - Open changelog... - Abrir histórico de alterações... - - - + No updates available. You are already using the latest version. Não existem atualizações disponíveis. Você já possui a versão mais recente. - + &Check for Updates Pesq&uisar por atualizações - + Checking for Updates... A pesquisar atualizações... - + Already checking for program updates in the background O programa já está à procura de atualizações em segundo plano - + Python found in '%1' Python encontrado em '%1' - + Download error Ocorreu um erro ao tentar fazer o download - + Python setup could not be downloaded, reason: %1. Please install it manually. Não foi possível fazer o download do Python. Motivo: %1. Por favor, instale-o manualmente. - - + + Invalid password Palavra-passe inválida - - - + + RSS (%1) RSS (%1) - + URL download error Ocorreu um erro ao fazer o download do URL - + The password is invalid A palavra-passe é inválida - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Veloc. download: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s - Vel. upload: %1 + Veloc. upload: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [D: %1, U: %2] qBittorrent %3 - + Hide Ocultar - + Exiting qBittorrent A sair do qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Ainda estão a ser transferidos alguns ficheiros. +Tem a certeza que deseja sair do qBittorrent? + + + Open Torrent Files Abrir ficheiros torrent - + Torrent Files Ficheiros torrent - + Options were saved successfully. As opções foram guardadas com sucesso. @@ -3128,52 +2786,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. O seu DNS dinâmico foi atualizado com sucesso. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Erro de DNS dinâmico: O serviço encontra-se temporariamente indisponível. Será feita uma nova tentativa dentro de 30 minutos. - + Dynamic DNS error: hostname supplied does not exist under specified account. Erro de DNS dinâmico: o nome do servidor não existe na conta especificada. - + Dynamic DNS error: Invalid username/password. Erro de DNS dinâmico: Utilizador e/ou palavra-passe inválido(a). - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Erro de DNS dinâmico: o qBittorrent está na lista negra deste serviço. Reporte este erro em http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Erro de DNS dinâmico: o serviço devolveu %1. Reporte este erro em http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Erro de DNS dinâmico: O seu nome de utilizador foi bloqueado por abusos. - + Dynamic DNS error: supplied domain name is invalid. Erro de DNS dinâmico: o domínio é inválido. - + Dynamic DNS error: supplied username is too short. Erro de DNS dinâmico: o nome de utilizador é muito curto. - + Dynamic DNS error: supplied password is too short. Erro de DNS dinâmico: a palavra-passe fornecida é muito curta. @@ -3181,1413 +2839,1303 @@ Net::DownloadHandler - + I/O Error Erro I/O - + The file size is %1. It exceeds the download limit of %2. O tamanho do ficheiro é %1, e excede o limite de downloads de %2. - + Unexpected redirect to magnet URI. Reencaminhamento inesperado para um URL Magnet. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - O nome do servidor remoto não foi encontrado (inválido) + + + GeoIP database loaded. Type: %1. Build time: %2. + Base de dados GeoIP carregada. Tipo: %1, compilada em: %2 - - The operation was canceled - A operação foi cancelada + + + Couldn't load GeoIP database. Reason: %1 + Base de dados GeoIP não carregada. Motivo: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - O servidor remoto terminou a ligação antes da resposta ser recebida e processada. + + Venezuela, Bolivarian Republic of + Venezuela (República Bolivariana da Venezuela) - - The connection to the remote server timed out - A ligação ao servidor remoto expirou + + Viet Nam + Vietname - - SSL/TLS handshake failed - Falha na negociação SSL/TLS + + + N/A + N/D - - The remote server refused the connection - O servidor remoto recusou a ligação + + Andorra + Andorra - - The connection to the proxy server was refused - O servidor proxy recusou a ligação. + + United Arab Emirates + Emirados Árabes Unidos - - The proxy server closed the connection prematurely - O servidor proxy terminou a ligação prematuramente. + + Afghanistan + Afeganistão - - The proxy host name was not found - O nome do servidor proxy não foi encontrado - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - A ligação ao proxy atingiu o limite de tempo ou o proxy não respondeu no tempo limite - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - O proxy requer a autenticação do pedido mas não aceitou as credenciais indicadas - - - - The access to the remote content was denied (401) - O acesso ao conteúdo remoto foi recusado (401) - - - - The operation requested on the remote content is not permitted - A operação solicitada no conteúdo remoto não é permitida - - - - The remote content was not found at the server (404) - O conteúdo remoto não foi encontrado no servidor (404) - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - O servidor remoto requer autenticação para mostrar o conteúdo, mas as credenciais indicadas não foram aceites - - - - The Network Access API cannot honor the request because the protocol is not known - A API de acesso à rede não cumpriu o pedido porque o protocolo não é conhecido - - - - The requested operation is invalid for this protocol - A operação é inválida para este protocolo - - - - An unknown network-related error was detected - Foi detetado um erro desconhecido relacionado com a rede - - - - An unknown proxy-related error was detected - Ocorreu um erro desconhecido relacionado com o proxy - - - - An unknown error related to the remote content was detected - Foi detetado um erro desconhecido relacionado com o conteúdo remoto - - - - A breakdown in protocol was detected - Ocorreu um erro relacionado com o protocolo - - - - Unknown error - Erro desconhecido - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - Base de dados GeoIP carregada. Tipo: %1, compilada em: %2 - - - - - Couldn't load GeoIP database. Reason: %1 - Base de dados GeoIP não carregada. Motivo: %1 - - - - Venezuela, Bolivarian Republic of - Venezuela (República Bolivariana da Venezuela) - - - - Viet Nam - Vietname - - - - - N/A - N/D - - - - Andorra - Andorra - - - - United Arab Emirates - Emirados Árabes Unidos + + Antigua and Barbuda + Antígua e Barbuda - Afghanistan - Afeganistão - - - - Antigua and Barbuda - Antígua e Barbuda - - - Anguilla Anguilla - + Albania Albânia - + Armenia Arménia - + Angola Angola - + Antarctica Antártica - + Argentina Argentina - + American Samoa Samoa Americana - + Austria Áustria - + Australia Austrália - + Aruba Aruba - + Azerbaijan Azerbeijão - + Bosnia and Herzegovina Bósnia e Herzegovina - + Barbados Barbados - + Bangladesh Bangladesh - + Belgium Bélgica - + Burkina Faso Burkina Faso - + Bulgaria Bulgária - + Bahrain Bahrein - + Burundi Burundi - + Benin Benin - + Bermuda Bermudas - + Brunei Darussalam Brunei Darussalam - + Brazil Brasil - + Bahamas Bahamas - + Bhutan Butão - + Bouvet Island Ilha Bouvet - + Botswana Botsuana - + Belarus Bielorrúsia - + Belize Belize - + Canada Canadá - + Cocos (Keeling) Islands Ilhas Coco (Keeling) - + Congo, The Democratic Republic of the República Democrática do Congo - + Central African Republic República Africana Central - + Congo Congo - + Switzerland Suíça - + Cook Islands Ilhas Cook - + Chile Chile - + Cameroon Camarões - + China China - + Colombia Colômbia - + Costa Rica Costa Rica - + Cuba Cuba - + Cape Verde Cabo Verde - + Curacao Curaçao - + Christmas Island Ilhas Natal - + Cyprus Chipre - + Czech Republic República Checa - + Germany Alemanha - + Djibouti Djibouti - + Denmark Dinamarca - + Dominica Domínica - + Dominican Republic República Dominicana - + Algeria Argélia - + Ecuador Equador - + Estonia Estónia - + Egypt Egito - + Western Sahara Saara Ocidental - + Eritrea Eritreia - + Spain Espanha - + Ethiopia Etiópia - + Finland Finlândia - + Fiji Ilhas Fiji - + Falkland Islands (Malvinas) Ilhas Falkland (Malvinas) - + Micronesia, Federated States of Estados Federados da Micronésia - + Faroe Islands Ilhas Faroé - + France França - + Gabon Gabão - + United Kingdom Reino Unido - + Grenada Granada - + Georgia Geórgia - + French Guiana Guiana Francesa - + Ghana Gana - + Gibraltar Gibraltar - + Greenland Gronelandia - + Gambia Gâmbia - + Guinea Guiné - + Guadeloupe Guadalupe - + Equatorial Guinea Guiné Equatorial - + Greece Grécia - + South Georgia and the South Sandwich Islands Ilhas Georgia do Sul e Sandwich do Sul - + Guatemala Guatemala - + Guam Guam - + Guinea-Bissau Guiné Bissau - + Guyana Guiana - + Hong Kong Hong Kong - + Heard Island and McDonald Islands Ilha Heard e Ilhas McDonald - + Honduras Honduras - + Croatia Croácia - + Haiti Haiti - + Hungary Hungria - + Indonesia Indonésia - + Ireland Irlanda - + Israel Israel - + India Índia - + British Indian Ocean Territory Território Britânico do Oceano Índico - + Iraq Iraque - + Iran, Islamic Republic of República Islâmica do Irão - + Iceland Islândia - + Italy Itália - + Jamaica Jamaica - + Jordan Jordânia - + Japan Japão - + Kenya Quénia - + Kyrgyzstan Quirguistão - + Cambodia Cambodja - + Kiribati Kiribati - + Comoros União das Comores - + Saint Kitts and Nevis São Cristóvão e Neves - + Korea, Democratic People's Republic of República Democrática da Coreia - + Korea, Republic of República da Coreia - + Kuwait Kuwait - + Cayman Islands Ilhas Caimão - + Kazakhstan Cazaquistão - + Lao People's Democratic Republic República Democrática Popular Lau - + Lebanon Líbano - + Saint Lucia Santa Lúcia - + Liechtenstein Liechtenstein - + Sri Lanka Sri Lanka - + Liberia Libéria - + Lesotho Lesoto - + Lithuania Lituânia - + Luxembourg Luxemburgo - + Latvia Letónia - + Morocco Marrocos - + Monaco Mónaco - + Moldova, Republic of República da Moldávia - + Madagascar Madagáscar - + Marshall Islands Ilhas Marshall - + Mali Mali - + Myanmar Birmânia - + Mongolia Mongólia - + Northern Mariana Islands Ilhas Marianas do Norte - + Martinique Martinica - + Mauritania Mauritânia - + Montserrat Montserrat - + Malta Malta - + Mauritius Mauritânia - + Maldives Maldivas - + Malawi Maláui - + Mexico México - + Malaysia Malásia - + Mozambique Moçambique - + Namibia Namíbia - + New Caledonia Nova Caledónia - + Niger Níger - + Norfolk Island Ilhas Norfolk - + Nigeria Nigéria - + Nicaragua Nicarágua - + Netherlands Holanda - + Norway Noruega - + Nepal Nepal - + Nauru Nauru - + Niue Niue - + New Zealand Nova Zelândia - + Oman Omã - + Panama Panamá - + Peru Peru - + French Polynesia Polinésia Francesa - + Papua New Guinea Papua Nova Guiné - + Philippines Filipinas - + Pakistan Paquistão - + Poland Polónia - + Saint Pierre and Miquelon São Pedro e Miquelão - + Puerto Rico Porto Rico - + Portugal Portugal - + Palau Palau - + Paraguay Paraguai - + Qatar Catar - + Reunion Reunião - + Romania Roménia - + Russian Federation Federação Russa - + Rwanda Ruanda - + Saudi Arabia Arábia Saudita - + Solomon Islands Ilhas Salomão - + Seychelles Seicheles - + Sudan Sudão - + Sweden Suécia - + Singapore Singapura - + Slovenia Eslovénia - + Svalbard and Jan Mayen Svalbard e Jan Mayen - + Slovakia Eslováquia - + Sierra Leone Serra Leoa - + San Marino São Marino - + Senegal Senegal - + Somalia Somália - + Suriname Suriname - + Sao Tome and Principe São Tomé e Príncipe - + El Salvador El Salvador - + Syrian Arab Republic República Árabe da Síria - + Swaziland Suazilândia - + Turks and Caicos Islands Ilhas Turcas e Caicos - + Chad Chade - + French Southern Territories Terras Austrais e Antárticas Francesas - + Togo Togo - + Thailand Tailandia - + Tajikistan Tajiquistão - + Tokelau Toquelau - + Turkmenistan Turquemenistão - + Tunisia Tunísia - + Tonga Tonga - - Could not decompress GeoIP database file. - Não foi possível descomprimir a base de dados GeoIP. - - - + Timor-Leste Timor Leste - + Bolivia, Plurinational State of Estado Plurinacional da Bolívia - + Bonaire, Sint Eustatius and Saba Território Insular de Bonaire - + Cote d'Ivoire Costa do Marfim - + Libya Líbia - + Saint Martin (French part) Ilha de São Martinho (parte francesa) - + Macedonia, The Former Yugoslav Republic of República da Macedónia - + Macao Macau - + Pitcairn Ilhas Pitcairn - + Palestine, State of Estado da Palestina - + Saint Helena, Ascension and Tristan da Cunha Santa Helena, Ascensão e Tristão da Cunha - + South Sudan Sudão do Sul - + Sint Maarten (Dutch part) Ilha de São Martinho (parte holandesa) - + Turkey Turquia - + Trinidad and Tobago Trindade e Tobago - + Tuvalu Tuvalu - + Taiwan Taiwan - + Tanzania, United Republic of República Unida da Tanzânia - + Ukraine Ucrânia - + Uganda Uganda - + United States Minor Outlying Islands Ilhas Menores Distantes dos Estados Unidos - + United States Estados Unidos da América - + Uruguay Uruguai - + Uzbekistan Uzbequistão - + Holy See (Vatican City State) Santa Sé (Estado do Vaticano) - + Saint Vincent and the Grenadines São Vicente e Granadinas - + Virgin Islands, British Ilhas Virgens Britânicas - + Virgin Islands, U.S. Ilhas Virgens Americanas - + Vanuatu Vanuatu - + Wallis and Futuna Wallis e Futuna - + Samoa Samoa - + Yemen Iémen - + Mayotte Maiote - + Serbia Sérvia - + South Africa África do Sul - + Zambia Zâmbia - + Montenegro Montenegro - + Zimbabwe Zimbabwe - + Aland Islands Ilhas Aland - + Guernsey Guernsey - + Isle of Man Ilha de Man - + Jersey Jersey - + Saint Barthelemy São Bartolomeu - + + Could not uncompress GeoIP database file. + Não foi possível descomprimir a base de dados GeoIP. + + + Couldn't save downloaded GeoIP database file. Não foi possível guardar a base de dados GeoIP descarregada. - + Successfully updated GeoIP database. Base de dados GeoIP atualizada com sucesso. - + Couldn't download GeoIP database file. Reason: %1 Não foi possível fazer o download da base de dados GeoIP. Motivo: %1 @@ -4595,12 +4143,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] Suporte UPnp/NAT-PMP [ON] - + UPnP / NAT-PMP support [OFF] Suporte UPnp/NAT-PMP [OFF] @@ -4608,7 +4156,7 @@ Net::Smtp - + Email Notification Error: Notificação de erro por e-mail: @@ -4616,1279 +4164,1077 @@ OptionsDialog - + Options Opções - + Behavior Comportamento - + Downloads Transferências - + Connection Ligação - + Speed Velocidade - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI - Interface Web + IU Web - + Advanced Avançado - + Language Idioma - + User Interface Language: Idioma da interface do utilizador: - + (Requires restart) (Necessita de reiniciar) - + Transfer List Lista de transferências - + Confirm when deleting torrents Confirmar eliminação de torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. Utilizar cores alternadas para as linhas - + Hide zero and infinity values Ocultar os valores zero e infinito - + Always Sempre - + Paused torrents only Apenas os torrents pausados - + Action on double-click Ação do duplo clique - + Downloading torrents: Download dos torrents: - - + + Start / Stop Torrent Iniciar/Parar torrent - - + + Open destination folder Abrir pasta de destino - - + + No action Nenhuma ação - + Completed torrents: Torrents completos: - + Desktop Área de trabalho - + Start qBittorrent on Windows start up Iniciar o qBittorrent ao arrancar o Windows - + Show splash screen on start up Exibir ecrã de arranque - + Start qBittorrent minimized Iniciar o qBittorrent minimizado - + Confirmation on exit when torrents are active Confirmação necessária ao sair caso existam torrents ativos - + Confirmation on auto-exit when downloads finish Confirmação durante a saída automática ao terminar os downloads - - KiB - KB - - - - Email notification &upon download completion - Enviar notificação &por e-mail ao terminar o download - - - - Run e&xternal program on torrent completion - Correr programa e&xterno ao terminar o torrent - - - - IP Fi&ltering - Fi&ltro de IP - - - - Schedule &the use of alternative rate limits - Agendar &a utilização dos limites de rácio alternativos - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Mais informação</a>) - - - - &Torrent Queueing - Fila de &torrents - - - - Seed torrents until their seeding time reaches - Semear os torrents até ser atingido o seu tempo de sementeira - - - - A&utomatically add these trackers to new downloads: - Adicionar a&utomaticamente estes trackers aos novos downloads: - - - - RSS Reader - Leitor RSS - - - - Enable fetching RSS feeds - Ativar a procura de fontes RSS - - - - Feeds refresh interval: - Intervalo de atualização das fontes: - - - - Maximum number of articles per feed: - Número máximo de artigos por fonte: - - - - - min - minutes - min - - - - RSS Torrent Auto Downloader - Download automático de torrents RSS - - - - Enable auto downloading of RSS torrents - Ativar o download automático de torrents RSS - - - - Edit auto downloading rules... - Editar regras do download automático... - - - - Web User Interface (Remote control) - Interface web do utilizador (controlo remoto) - - - - IP address: - Endereço IP: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - Endereço IP com o qual a interface web irá ligar. -Especifique um endereço IPv4 ou IPv6. Você pode especificar "0.0.0.0" para qualquer endereço IPv4, -"::" para qualquer endereço IPv6, ou "*" para IPv4 e IPv6. - - - - Server domains: - Domínio do servidor: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - Lista branca para filtrar os valores do cabeçalho de hosts HTTP. -Para se defender contra ataques de reinserção de DNS, -você deverá colocar os nomes de domínio usados pelo servidor da interface web. - -Utilize ';' para dividir várias entradas. Pode usar o asterisco '*'. - - - - &Use HTTPS instead of HTTP - &Utilizar o HTTPS como alternativa ao HTTP - - - - Bypass authentication for clients on localhost - Desativar a autenticação para clientes no localhost - - - - Bypass authentication for clients in whitelisted IP subnets - Desativar a autenticação para clientes pertencentes à lista de IPs confiáveis - - - - IP subnet whitelist... - Sub-rede de IP confiável... + + Show qBittorrent in notification area + Exibir o qBittorrent na área de notificação - - Upda&te my dynamic domain name - A&tualizar o nome de domínio dinâmico - - - + Minimize qBittorrent to notification area Minimizar o qBittorrent para a área de notificação - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. Fechar o qBittorrent para a área de notificação - + Tray icon style: Estilo do ícone: - + Normal Normal - + Monochrome (Dark theme) Monocromático (tema escuro) - + Monochrome (Light theme) Monocromático (tema claro) - + File association Associação de ficheiros - + Use qBittorrent for .torrent files Associar o qBittorrent aos ficheiros .torrent - + Use qBittorrent for magnet links - Associar o qBittorrent às ligações magnet + Associar o qBittorrent às ligações Magnet - + Power Management Gestão de energia - + + Inhibit system sleep when torrents are active + Impedir a suspensão do sistema caso existam torrents ativos + + + + Log file + Ficheiro de registo + + + Save path: Guardar em: - + Backup the log file after: Fazer backup do ficheiro de registo após: - + + MB + MB + + + Delete backup logs older than: Eliminar registos de backup anteriores a: - + days Delete backup logs older than 10 months dias - + months Delete backup logs older than 10 months meses - + years Delete backup logs older than 10 years anos - + When adding a torrent Ao adicionar um torrent - + + Display torrent content and some options + Exibir o conteúdo do torrent e algumas opções + + + Bring torrent dialog to the front Trazer o diálogo do torrent para a frente - + Do not start the download automatically The torrent will be added to download list in pause state Não iniciar o download automaticamente - + Should the .torrent file be deleted after adding it O ficheiro .torrent deverá ser eliminado após ter sido adicionado - + + Delete .torrent files afterwards + Eliminar os ficheiros .torrent mais tarde + + + Also delete .torrent files whose addition was cancelled Eliminar também os ficheiros .torrent cuja adição foi cancelada - + Also when addition is cancelled Também quando a adição for cancelada - + Warning! Data loss possible! Atenção! Possível perda de dados! - + Saving Management Gestão do "guardar": - + Default Torrent Management Mode: Modo de gestão do torrent por defeito: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category O modo automático significa que várias propriedades do torrent (ex: caminho para guardar) serão decididas pela categoria associada - + Manual Manual - + Automatic Automático - + When Torrent Category changed: Quando a 'Categoria do torrent' for alterada: - + Relocate torrent Realocar torrent - + Switch torrent to Manual Mode Mudar o torrent para o 'Modo manual' - + When Default Save Path changed: Quando o 'Caminho padrão para guardar' for alterado: - - + + Relocate affected torrents Realocar torrents afetados - - + + Switch affected torrents to Manual Mode Mudar os torrents afetados para o 'Modo manual' - + When Category changed: Quando a 'Categoria' for alterada: - + Use Subcategories Utilizar subcategorias - + Default Save Path: Caminho padrão para o 'Guardar': - + Keep incomplete torrents in: Guardar os torrents incompletos em: - + Copy .torrent files to: Copiar os ficheiros .torrent para: - - Show &qBittorrent in notification area - Exibir o &qBittorrent na área de notificação - - - - &Log file - Ficheiro de &registo - - - - Display &torrent content and some options - Exibir o conteúdo do &torrent e algumas opções - - - - Create subfolder for torrents with multiple files - Criar uma subpasta para os torrents com vários ficheiros - - - - De&lete .torrent files afterwards - Elim&inar os ficheiros .torrent mais tarde - - - + Copy .torrent files for finished downloads to: Copiar os ficheiros .torrent dos downloads terminados para: - + Pre-allocate disk space for all files Pré-alocar espaço em disco para todos os ficheiros - - Inhibit system sleep when torrents are downloading - Impedir a suspensão do sistema caso existam torrents a serem descarregados - - - - Inhibit system sleep when torrents are seeding - Impedir a suspensão do sistema caso existam torrents a serem semeados - - - + Append .!qB extension to incomplete files Adicionar a extensão .!qB aos ficheiros incompletos - - Enable recursive download dialog - Ativar o diálogo de download recursivo - - - + Automatically add torrents from: Adicionar automaticamente os torrents de: - + Add entry Adicionar entrada - + Remove entry Remover entrada - + + Email notification upon download completion + Enviar notificação por e-mail ao terminar o download + + + + Destination email: + E-mail de destino: + + + SMTP server: Servidor SMTP: - + This server requires a secure connection (SSL) Este servidor requer uma ligação segura (SSL) - - + + + Authentication Autenticação - - - - + + + + Username: Nome de utilizador: - - - - + + + + Password: Palavra-passe: - - Enabled protocol: - Ativar o protocolo: + + Run external program on torrent completion + Executar uma aplicação externa ao terminar a transferência - - TCP and μTP - TCP e μTP - - - + Listening Port Porta de receção - + Port used for incoming connections: Porta utilizada para as ligações recebidas: - + Random Aleatória - + Use UPnP / NAT-PMP port forwarding from my router Utilizar o reencaminhamento de portas UPnP/NAT-PMP do meu router - + Use different port on each startup Utilizar uma porta diferente a cada arranque - + Connections Limits Limites das ligações - + Maximum number of connections per torrent: Número máximo de ligações por torrent: - + Global maximum number of connections: Número máximo de ligações globais: - + Maximum number of upload slots per torrent: Número máximo de slots de upload por torrent: - + Global maximum number of upload slots: Número máximo de slots de upload por torrent: - + Proxy Server Servidor proxy - + Type: Tipo: - + (None) (Nenhum(a)) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Servidor: - - + + Port: Porta: - + Otherwise, the proxy server is only used for tracker connections Se não o fizer, o servidor proxy só será utilizado para as ligações aos trackers - + Use proxy for peer connections Utilizar um proxy para ligações às fontes - + Disable connections not supported by proxies Desativar as ligações não suportadas pelos proxies - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Mais informação</a>) - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection As fontes RSS, o motor de busca, as atualizações de software ou qualquer outra coisa não relacionada com as transferências de torrents e operações relacionada (ex. troca de fontes) utilizarão uma ligação direta. - + Use proxy only for torrents Utilizar um proxy apenas para torrents - - A&uthentication - A&utenticação - - - + Info: The password is saved unencrypted Informação: A palavra-passe é guardada sem encriptação - + + IP Filtering + Filtro de IP + + + Filter path (.dat, .p2p, .p2b): Filtrar caminho (.dat, .p2p, .p2b): - + Reload the filter Recarregar o filtro - - Manually banned IP addresses... - Endereços de IP banidos manualmente... - - - + Apply to trackers Aplicar aos trackers - + Global Rate Limits Limites de rácio globais - - - - - - - KiB/s - KiB/s - - - - + + Upload: Upload: - - + + + + + KiB/s + KB/s + + + + Download: Download: - + Alternative Rate Limits Limites de rácio alternativo - - + + Schedule the use of alternative rate limits + Agendar a utilização dos limites de rácio alternativos + + + From: from (time1 to time2) De: - - + To: time1 to time2 Para: - + When: Quando: - + Every day Diariamente - + Weekdays Dias da semana - + Weekends Fins de semana - + Rate Limits Settings Definições dos limites de rácio - + Apply rate limit to peers on LAN Aplicar o limite de rácio às fontes nas ligações LAN - + Apply rate limit to transport overhead Aplicar os limites de rácio para o transporte "overhead" - - + + + Enable µTP protocol + Ativar o protocolo µTP + + + Apply rate limit to µTP protocol Aplicar os limites de rácio ao protocolo µTP - + Privacy Privacidade - + Enable DHT (decentralized network) to find more peers Ativar DHT (rede descentralizada) para encontrar mais fontes - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Trocar fontes com clientes Bittorrent compatíveis (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers Ativar a 'Troca de Fontes' (PeX) para encontrar mais fontes - + Look for peers on your local network Procurar fontes na rede local - + Enable Local Peer Discovery to find more peers Ativar 'Descoberta de fontes locais' para encontrar mais fontes - + Encryption mode: Modo de encriptação: - + Prefer encryption Preferir encriptação - + Require encryption Requer encriptação - + Disable encryption Desativar encriptação - + Enable when using a proxy or a VPN connection Ativar ao utilizar uma ligação proxy ou VPN - + Enable anonymous mode Ativar o modo anónimo - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Mais informações</a>) + + + + Torrent Queueing + Fila de torrents + + + Maximum active downloads: Nº máximo de downloads ativos: - + Maximum active uploads: Nº máximo de uploads ativos: - + Maximum active torrents: Nº máximo de torrents ativos: - + Do not count slow torrents in these limits Não considerar os torrents lentos para estes limites - - Upload rate threshold: - Limite do rácio de upload: - - - - Download rate threshold: - Limite do rácio de download: - - - - sec - seconds - seg - - - - Torrent inactivity timer: - Temporizador de inatividade do torrent: - - - + Share Ratio Limiting Limite de partilhas - + Seed torrents until their ratio reaches Partilhar torrents até que o rácio atinja - + then depois - + Pause them Pausá-los - + Remove them Removê-los - - RSS Smart Episode Filters - Filtros inteligentes de episódios RSS + + Automatically add these trackers to new downloads: + Adicionar automaticamente estes trackers aos novos downloads: - + + Enable Web User Interface (Remote control) + Ativar interface web do utilizador (controle remoto) + + + Use UPnP / NAT-PMP to forward the port from my router Utilizar o reencaminhamento de portas UPnP/NAT-PMP do meu router - + + Use HTTPS instead of HTTP + Utilizar HTTPS em vez de HTTP + + + Certificate: Certificado: - + Import SSL Certificate Importar certificado SSL - + Key: Chave: - + Import SSL Key Importar chave SSL - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Informação acerca dos certificados</a> - - Use alternative Web UI - Utilizar a interface web alternativa - - - - Files location: - Localização dos ficheiros: - - - - Enable clickjacking protection - Ativar a proteção contra o "clickjacking" + + Bypass authentication for localhost + Desativar a autenticação para o localhost - - Enable Cross-Site Request Forgery (CSRF) protection - Ativar a proteção contra falsificação de solicitação entre sites (CSRF) + + Update my dynamic domain name + Atualizar o nome do meu domínio dinâmico - + Service: Serviço: - + Register Registar - + Domain name: Nome do domínio: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! Ao ativar estas opções, poderá <strong>perder permanentemente</strong> os seus ficheiros .torrent! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well Ao ativar estas opções, o qbittorrent irá <strong>eliminar</strong> os ficheiros .torrent depois deles terem sido adicionados com sucesso (a primeira opção) ou não (a segunda opção) à sua fila de downloads. Isto será aplicado <strong>não só</strong> aos ficheiros abertos através do menu de ação &ldquo;Adicionar torrent&rdquo; , mas também para aqueles abertos através da <strong>associação por tipo de ficheiro</strong> - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog Se ativar a segunda opção (&ldquo;Também quando a adição for cancelada&rdquo;) o ficheiro .torrent <strong>será eliminado</strong>, mesmo que prima &ldquo;<strong>Cancelar</ strong>&rdquo; no diálogo &ldquo;Adicionar torrent&rdquo; - - Choose Alternative UI files location - Escolher localização alternativa para os ficheiros da interface do utilizador - - - + Supported parameters (case sensitive): Parâmetros suportados (sensível a maiúsculas/minúsculas): - + %N: Torrent name %N: Nome do torrent - + %L: Category %L: Categoria - - %G: Tags (seperated by comma) - %G: Etiquetas (separadas por vírgula) - - - + %F: Content path (same as root path for multifile torrent) %F: Caminho do conteúdo (igual ao caminho raiz para torrents de vários ficheiros) - + %R: Root path (first torrent subdirectory path) %R: Caminho raiz (caminho da primeira subdiretoria do torrent) - + %D: Save path %D: Caminho para gravar - + %C: Number of files %C: Número de ficheiros - + %Z: Torrent size (bytes) %Z: Tamanho do torrent (bytes) - + %T: Current tracker %T: Tracker atual - + %I: Info hash %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") Dica: Encapsule o parâmetro entre aspas para evitar que sejam cortados os espaços em branco do texto (ex: "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - Um torrent será considerado lento se os rácios de download e upload se mantiverem abaixo destes valores durante "Temporizador de inatividade do torrent" segundos - - - + Select folder to monitor Selecione a pasta a ser monitorizada - + Folder is already being monitored: A pasta já se encontra a ser monitorizada: - + Folder does not exist: A pasta não existe: - + Folder is not readable: A pasta não pode ser lida: - + Adding entry failed Ocorreu um erro ao tentar adicionar a entrada - - - - + + Choose export directory Escolha a diretoria para exportar - - - + + + + + + Choose a save directory Escolha uma diretoria para o gravar - + Choose an IP filter file Escolha um ficheiro de filtro IP - + All supported filters Todos os filtros suportados - + SSL Certificate Certificado SSL - + + SSL Key + Chave SSL + + + Parsing error Erro de processamento - + Failed to parse the provided IP filter Ocorreu um erro ao processar o filtro IP indicado - + Successfully refreshed Atualizado com sucesso - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number O filtro de IP fornecido foi processado com sucesso: Foram aplicadas %1 regras. - + Invalid key Chave inválida - + This is not a valid SSL key. Esta não é uma chave SSL válida. - + Invalid certificate Certificado inválido - - Preferences - Preferências - - - - Import SSL certificate - Importar certificado SSL - - - + This is not a valid SSL certificate. Este não é um certificado SSL válido. - - Import SSL key - Importar chave SSL - - - - SSL key - Chave SSL - - - + Time Error Erro de horário - + The start time and the end time can't be the same. A hora de início e a de fim não podem ser idênticas. - - + + Length Error Erro de comprimento - + The Web UI username must be at least 3 characters long. O nome de utilizador da interface web deverá conter pelo menos 3 carateres. - + The Web UI password must be at least 6 characters long. A palavra-passe da interface web deverá conter pelo menos 6 caracteres. @@ -5896,72 +5242,72 @@ PeerInfo - - Interested(local) and Choked(peer) - Interessado(local) e Choked(peer) + + interested(local) and choked(peer) + interessado(local) e choked(fontes) - + interested(local) and unchoked(peer) interessado(local) e unchoked(fontes) - + interested(peer) and choked(local) interessado(fontes) e choked(local) - + interested(peer) and unchoked(local) interessado(fontes) e unchoked(local) - + optimistic unchoke unchoke otimista - + peer snubbed fonte censurada - + incoming connection ligação recebida - + not interested(local) and unchoked(peer) não interessado(local) e unchoked(fonte) - + not interested(peer) and unchoked(local) não interessado(fonte) e unchoked(local) - + peer from PEX fonte de PEX - + peer from DHT fonte de DHT - + encrypted traffic tráfego encriptado - + encrypted handshake negociação encriptada - + peer from LSD fonte de LSD @@ -5969,180 +5315,165 @@ PeerListWidget - + IP IP - + Port Porta - + Flags Bandeiras - + Connection Ligação - + Client i.e.: Client application Cliente - + Progress i.e: % downloaded Evolução - + Down Speed i.e: Download speed - Vel. download + Vel. de download - + Up Speed i.e: Upload speed - Vel. upload + Vel. de upload - + Downloaded i.e: total data downloaded Descarregado - + Uploaded i.e: total data uploaded Enviado - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Importância - + Files i.e. files that are being downloaded right now Ficheiros - + Column visibility Visibilidade da coluna - + Add a new peer... Adicionar uma nova fonte... - - + + Ban peer permanently Banir fonte permanentemente - + Manually adding peer '%1'... A adicionar manualmente a fonte '%1'... - + The peer '%1' could not be added to this torrent. Não foi possível adicionar a fonte '%1' a este torrent. - + Manually banning peer '%1'... A banir manualmente a fonte '%1'... - - + + Peer addition Adição de fonte - + Country País - + Copy IP:port Copiar IP: porta - + Some peers could not be added. Check the Log for details. Não foi possível adicionar algumas fontes. Para mais detalhes consulte o 'Registo'. - + The peers were added to this torrent. As fontes foram adicionadas a este torrent. - + Are you sure you want to ban permanently the selected peers? Tem a certeza de que deseja banir permanentemente as fontes selecionadas? - + &Yes &Sim - + &No &Não - PeersAdditionDialog + PeersAdditionDlg - - Add Peers - Adicionar fontes - - - - List of peers to add (one IP per line): - Lista de fontes a adicionar (um IP por linha): - - - - Format: IPv4:port / [IPv6]:port - Formato: IPv4:porta / [IPv6]:porta - - - + No peer entered Fonte não inserida - + Please type at least one peer. Por favor, insira pelo menos uma fonte. - + Invalid peer Fonte inválida - + The peer '%1' is invalid. A fonte '%1' é inválida. @@ -6150,12 +5481,12 @@ PieceAvailabilityBar - + White: Unavailable pieces Branco: Peças indisponíveis - + Blue: Available pieces Azul: Peças disponíveis @@ -6163,337 +5494,293 @@ PiecesBar - + Files in this piece: Ficheiros nesta peça: - + File in this piece Ficheiro nesta peça - + File in these pieces Ficheiros nestas peças - - Wait until metadata become available to see detailed information - Espere até aos metadados ficarem disponíveis de forma a poder ver informação mais detalhada - - - + Hold Shift key for detailed information Manter premida a tecla Shift para uma informação detalhada - PluginSelectDialog + PluginSelectDlg - + Search plugins - 'Plugins' de pesquisa + Plugins de pesquisa - + Installed search plugins: - Plugins de pesquisa instalados: + Plugins de pesquisa selecionados: - + Name Nome - + Version Versão - + Url Url - - + + Enabled Ativo - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - Aviso: Certifique-se que cumpre as leis de direitos de autor do seu país ao fazer o download de torrents a partir de qualquer um destes motores de busca. - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - Pode obter novos plugins para o motor de busca aqui: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + Pode obter novos motores de plugins de pesquisa em: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one Instalar um novo - + Check for updates - Procurar atualizações + Pesquisar por atualizações - + Close Fechar - + Uninstall Desinstalar - - - + + + Yes Sim - - - - + + + + No Não - + Uninstall warning Aviso de desinstalação - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - Alguns 'plugins' não podem ser desinstalados por serem parte integrante do qBittorrent. Apenas os plugins instalados pelo utilizador podem ser removidos. -Esses plugins foram desativados. + Alguns plugins não podem ser desinstalados por serem parte integrante do qBittorrent. Apenas os plugins instalados pelo utilizador poderão ser desinstalados. +Contudo, esses plugins foram desativados. - + Uninstall success Desinstalação bem sucedida - + All selected plugins were uninstalled successfully Todos os plugins selecionados foram desinstalados com sucesso - - - - - Search plugin update - Atualização do plugin de pesquisa - - - - Plugins installed or updated: %1 - Plugins instalados ou atualizados: %1 - - - - + + New search engine plugin URL - URL do novo plugin do motor de busca + URL do novo 'plugin' do motor de busca - - + + URL: URL: - + Invalid link - Link inválido + Ligação inválida - + The link doesn't seem to point to a search engine plugin. - O link não aparenta apontar para um plugin do motor de busca. + Esta ligação não parece apontar para nenhum plugin de motor de busca. - + Select search plugins - Selecionar plugins de busca + Selecionar plugins de pesquisa - + qBittorrent search plugin Plugin de busca do qBittorrent - + + + + Search plugin update + Atualização do plugin de busca + + + All your plugins are already up to date. - Todos os seus plugins já se encontram atualizados. + Todos os plugins já se encontram atualizados. - + Sorry, couldn't check for plugin updates. %1 - Desculpe, não é possível pesquisar por atualizações do plugin. %1 + Desculpe, não foi possível verificar se existem atualizações disponíveis para o plugin. %1 - + + + Search plugin install Instalar plugin de busca - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + O plugin do motor de busca '%1', foi instalado com sucesso. + + + Couldn't install "%1" search engine plugin. %2 Não foi possível instalar o plugin do motor de busca '%1'. %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + O plugin do motor de busca '%1', foi atualizado com sucesso. + + + Couldn't update "%1" search engine plugin. %2 Não foi possível atualizar o plugin do motor de busca '%1'. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source Fonte do plugin - + Search plugin source: Pesquisar fonte do plugin: - + Local file Ficheiro local - + Web link - Ligação da web - - - - PowerManagement - - - qBittorrent is active - O qBittorrent encontra-se ativo + Ligação web - PreviewSelectDialog + PreviewSelect - - Preview - Visualizar - - - + Name Nome - + Size Tamanho - + Progress Evolução - - + + Preview impossible Não é possível visualizar - - + + Sorry, we can't preview this file Desculpe mas não é possível visualizar este ficheiro - Private::FileLineEdit - - - '%1' does not exist - '%1' não existe - - - - '%1' does not point to a directory - '%1' não aponta para uma diretoria - - - - '%1' does not point to a file - '%1' não aponta para um ficheiro - - - - Does not have read permission in '%1' - Não tem permissão de leitura para '%1' - - - - Does not have write permission in '%1' - Não tem permissão de escrita para '%1' - - - PropListDelegate - + Not downloaded Por descarregar - - + + Normal Normal (priority) Normal - - N/A - N/D - - - + Do not download Do not download (priority) - Não fazer o download + Não fazer o download - - + + High High (priority) Alta - + N/A + N/A + + + Mixed Mixed (priorities Mista - - + + Maximum Maximum (priority) Máxima @@ -6502,32 +5789,32 @@ PropTabBar - + General Geral - + Trackers Trackers - + Peers Fontes - + HTTP Sources Fontes HTTP - + Content Conteúdo - + Speed Velocidade @@ -6578,12 +5865,12 @@ Download Speed: - Vel. de download: + Velocidade de download: Upload Speed: - Vel. de upload: + Velocidade de upload: @@ -6621,22 +5908,22 @@ Comentário: - + Select All Selecionar tudo - + Select None Selecionar nada - + Normal Normal - + High Alta @@ -6696,165 +5983,165 @@ Guardado em: - + Maximum Máximo + - Do not download Não fazer o download - + Never Nunca - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (tem %3) - - + + %1 (%2 this session) %1 (%2 nesta sessão) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (semeado durante %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (máximo: %2) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (total: %2) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (média: %2) - + Open Abrir - + Open Containing Folder Abrir pasta respetiva - + Rename... Renomear... - + Priority Prioridade - + New Web seed Nova fonte web - + Remove Web seed Remover fonte web - + Copy Web seed URL Copiar URL da fonte web - + Edit Web seed URL Editar URL da fonte web - + + Rename the file + Renomear ficheiro + + + New name: Novo nome: - - + + + The file could not be renamed + Não foi possível renomear o ficheiro + + + + This file name contains forbidden characters, please choose a different one. + Este nome de ficheiro contém caracteres proibidos. Por favor, escolha um nome diferente. + + + + This name is already in use in this folder. Please use a different name. Este nome já se encontra em utilização nesta pasta. Por favor, escolha um nome diferente. - + The folder could not be renamed Não foi possível renomear a pasta - + qBittorrent qBittorrent - + Filter files... Filtrar ficheiros... - - Renaming - A renomear - - - - - Rename error - Erro a renomear - - - - The name is empty or contains forbidden characters, please choose a different one. - O nome encontra-se vazio ou contém caracteres proibidos. Por favor escolha um nome diferente. - - - + New URL seed New HTTP source Novo URL de sementes - + New URL seed: Novo URL de sementes: - - + + This URL seed is already in the list. Este URL de sementes já existe na lista. - + Web seed editing Edição de sementes web - + Web seed URL: URL de sementes da web: @@ -6862,585 +6149,551 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + O seu endereço IP foi banido após demasiadas tentativas de acesso falhadas. + + + + Error: '%1' is not a valid torrent file. + + Erro: %1 não é um ficheiro torrent válido. + + + + + Error: Could not add torrent to session. + Erro: Não foi possível adicionar o torrent a esta sessão. + + + + I/O Error: Could not create temporary file. + Erro I/O: Não foi possível criar o ficheiro temporário. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 é um parâmetro de linha de comandos desconhecido. - - + + %1 must be the single command line parameter. %1 deverá ser o único parâmetro da linha de comandos. - + + %1 must specify the correct port (1 to 65535). + %1 deverá especificar a porta correta (de 1 a 65535). + + + You cannot use %1: qBittorrent is already running for this user. Não pode utilizar %1: O qBittorrent já se encontra em utilização por este utilizador. - + Usage: Utilização: - + Options: Opções: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - O parâmetro '%1' deverá seguir a sintaxe '%1=%2' + + Displays program version + Exibir a versão do programa + + + + Displays this help message + Exibir esta mensagem de ajuda - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - O parâmetro '%1' deverá seguir a sintaxe '%1=%2' + + Changes the Web UI port (current: %1) + Altera a porta da interface web (atual: %1) - - Expected integer number in environment variable '%1', but got '%2' - Era esperado o número inteiro na variável ambiente '%1', mas foi obtido '%2' + + Disable splash screen + Desativar ecrã de arranque - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - O parâmetro '%1' deverá seguir a sintaxe '%1=%2' + + Run in daemon-mode (background) + Executar no modo daemon (em segundo plano) - - Expected %1 in environment variable '%2', but got '%3' - Era esperado %1 na variável ambiente '%2', mas foi obtido '%3' + + Downloads the torrents passed by the user + Faz o download dos torrents enviados pelo utilizador - - port - porta + + Help + Ajuda - - %1 must specify a valid port (1 to 65535). - %1 deverá especificar uma porta válida (entre 1 e 65535). + + Run application with -h option to read about command line parameters. + Executa a aplicação com a opção -h para saber mais acerca dos parâmetros da linha de comandos. - - Display program version and exit - Exibir a versão do programa e sair + + Bad command line + Linha de comandos inválida - - Display this help message and exit - Exibir esta mensagem de ajuda e sair + + Bad command line: + Linha de comandos inválida: - - Change the Web UI port - Alterar a porta da interface web + + Legal Notice + Aviso legal - - Disable splash screen - Desativar ecrã de arranque + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + O qBittorrent é um programa de partilha de ficheiros. Ao executar um torrent, os dados do ficheiro ficam disponíveis para todos os utilizadores. Todo o conteúdo partilhado é da sua inteira responsabilidade. + +Não serão emitidos mais avisos relacionados com este assunto. - - Run in daemon-mode (background) - Executar no modo daemon (em segundo plano) + + Press %1 key to accept and continue... + Prima %1 para aceitar e continuar... - - dir - Use appropriate short form or abbreviation of "directory" - dir + + Legal notice + Aviso legal - - Store configuration files in <dir> - Guardar ficheiros de configuração em <dir> + + Cancel + Cancelar - - - name - nome + + I Agree + Concordo - - Store configuration files in directories qBittorrent_<name> - Guardar ficheiros de configuração em diretorias qBittorrent_<name> + + Torrent name: %1 + Nome do torrent: %1 - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Retalhar em ficheiros fastresume libtorrent e fazer caminhos de ficheiro relativos para a diretoria do perfil + + Torrent size: %1 + Tamanho do torrent: %1 - - files or URLs - ficheiros ou URLs + + Save path: %1 + Caminho para guardar: %1 - - Download the torrents passed by the user - Download dos torrents enviados pelo utilizador + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Foi feito o download do torrent para %1. - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Especifica se a caixa de diálogo "Adicionar novo torrent" é aberta ao adicionar um torrent. + + Thank you for using qBittorrent. + Obrigado por utilizar o qBittorrent. - - Options when adding new torrents: - Opções ao adicionar novos torrents: + + [qBittorrent] '%1' has finished downloading + O [qBittorrent] '%1' terminou de fazer o download - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Atalho para %1 + + The remote host name was not found (invalid hostname) + O nome do servidor remoto não foi encontrado (nome de hostname inválido) - - path - caminho + + The operation was canceled + A operação foi cancelada - - Torrent save path - Caminho para guardar o torrent + + The remote server closed the connection prematurely, before the entire reply was received and processed + O servidor remoto terminou a ligação antes da resposta ser recebida e processada. - - Add torrents as started or paused - Adicionar torrents como iniciados ou pausados + + The connection to the remote server timed out + A ligação ao servidor remoto expirou. - - Skip hash check - Ignorar a verificação hash + + SSL/TLS handshake failed + Falha na negociação SSL/TLS - - Assign torrents to category. If the category doesn't exist, it will be created. - Atribuir os torrents a categorias. Se ela não existir será criada. + + The remote server refused the connection + O servidor remoto recusou a ligação. - - Download files in sequential order - Fazer o download sequencial dos ficheiros + + The connection to the proxy server was refused + O servidor proxy recusou a ligação. - - Download first and last pieces first - Fazer o download da primeira e última peça primeiro + + The proxy server closed the connection prematurely + O servidor proxy terminou a ligação prematuramente. - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - Os valores das opções podem ser fornecidos através de variáveis de ambiente. Para a opção denominada 'nome-parâmetro', o nome da variável de ambiente é 'QBT_PARAMETER_NAME' (em maiúsculas, '-' substituído por '_'). Para passar os valores do sinalizador, defina a variável como '1' ou 'VERDADEIRO'. Por exemplo, para desativar o ecrã inicial: + + The proxy host name was not found + O nome do servidor proxy não foi encontrado - - Command line parameters take precedence over environment variables - Os parâmetros da linha de comando têm precedência sobre as variáveis de ambiente + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + A ligação ao proxy expirou ou o proxy não respondeu no tempo limite exigido - - Help - Ajuda + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + O proxy exige uma autenticação do pedido mas não aceitou as credenciais indicadas - - Run application with -h option to read about command line parameters. - Executa a aplicação com a opção -h para saber mais acerca dos parâmetros da linha de comandos. + + The access to the remote content was denied (401) + O acesso ao conteúdo remoto foi negado (401) - - Bad command line - Linha de comandos inválida + + The operation requested on the remote content is not permitted + A operação solicitada no conteúdo remoto não é permitida - - Bad command line: - Linha de comandos inválida: + + The remote content was not found at the server (404) + O conteúdo remoto não foi encontrado no servidor (404) - - Legal Notice - Aviso legal + + The remote server requires authentication to serve the content but the credentials provided were not accepted + O servidor remoto requer autenticação para mostrar o conteúdo mas as credenciais indicadas não foram aceites - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - O qBittorrent é um programa de partilha de ficheiros. Ao executar um torrent, os dados do torrent estão disponíveis para todos os utilizadores. Todo o conteúdo partilhado é da sua inteira responsabilidade. + + The Network Access API cannot honor the request because the protocol is not known + A API de acesso à rede não cumpriu o pedido porque o protocolo é desconhecido - - No further notices will be issued. - Não será emitido mais nenhum aviso adicional. + + The requested operation is invalid for this protocol + A operação é inválida para este protocolo - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - O qBittorrent é um programa de partilha de ficheiros. Ao executar um torrent, os dados do ficheiro ficam disponíveis para todos os utilizadores. Todo o conteúdo partilhado é da sua inteira responsabilidade. - -Não serão emitidos mais avisos relacionados com este assunto. + + An unknown network-related error was detected + Foi detetado um erro desconhecido relacionado com a rede - - Press %1 key to accept and continue... - Prima %1 para aceitar e continuar... + + An unknown proxy-related error was detected + Foi detetado um erro desconhecido relacionado com a proxy - - Legal notice - Aviso legal + + An unknown error related to the remote content was detected + Foi detetado um erro desconhecido relacionado com o conteúdo remoto - - Cancel - Cancelar + + A breakdown in protocol was detected + Foi detetada uma quebra no protocolo - - I Agree - Concordo + + Unknown error + Erro desconhecido - - + + Upgrade Upgrade - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] Está a atualizar o programa a partir de uma versão que guardava os dados de forma diferente. Tem que ser feita a migração para o novo sistema. Já não será possível utilizar novamente a versão 3.3.0. Deseja continuar? [y/n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. Está a atualizar o programa a partir de uma versão que guardava os dados de forma diferente. Tem que ser feita a migração para o novo sistema. Se continuar, já não será possível utilizar a versão 3.3.0. - + Couldn't migrate torrent with hash: %1 Não foi possível migrar o torrent com o hash: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 Não foi possível migrar o torrent. Nome de ficheiro inválido: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 - Foi detetado um encerramento inválido do programa. Será utilizado o ficheiro de recurso para restaurar as definições: %1 + + Detected unclean program exit. Using fallback file to restore settings. + Foi detetado um encerramento anterior incorreto do programa. A utilizar dados guardados para tentar restaurar as definições. - + An access error occurred while trying to write the configuration file. Ocorreu um erro de acesso ao tentar escrever o ficheiro de configuração. - + A format error occurred while trying to write the configuration file. Ocorreu um erro de formato ao tentar escrever o ficheiro de configuração. - - - An unknown error occurred while trying to write the configuration file. - Ocorreu um erro desconhecido ao tentar escrever dados no ficheiro de configuração. - - RSS::AutoDownloader + RSS - - - Invalid data format. - Formato de dados inválido. + + Search + Pesquisar - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - Não foi possível guardar os dados RSS do AutoDownloader em %1. Erro: %2 + + New subscription + Nova subscrição - - Invalid data format - Formato de dados inválido + + + + Mark items read + Marcar itens como lidos - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - Não foi possível ler as regras RSS do AutoDownloader em %1. Erro: %2 + + Update all + Atualizar tudo - - Couldn't load RSS AutoDownloader rules. Reason: %1 - Não foi possível carregar as regras RSS do AutoDownloader. Motivo: %1 + + RSS Downloader... + Downloader de RSS... - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - Não foi possível fazer o download da fonte RSS em '%1'. Motivo: %2 + + Settings... + Definições... - - RSS feed at '%1' updated. Added %2 new articles. - A fonte RSS em '%1' foi atualizada. Adicionados %2 novos artigos. + + Torrents: (double-click to download) + Torrents: (duplo clique para fazer o download) - - Failed to parse RSS feed at '%1'. Reason: %2 - Não foi possível analisar a fonte RSS em '%1'. Motivo: %2 + + + Delete + Eliminar - - Couldn't read RSS Session data from %1. Error: %2 - Não foi possível ler os dados da sessão RSS a partir de %1. Erro: %2 + + Rename... + Renomear... - - Couldn't parse RSS Session data. Error: %1 - Não foi possível analisar os dados da sessão RSS. Erro: %1 + + Rename + Renomear - - Couldn't load RSS Session data. Invalid data format. - Não foi possível carregar os dados da sessão RSS. Formato de dados inválido. + + + Update + Atualizar - - Couldn't load RSS article '%1#%2'. Invalid data format. - Não foi possível carregar o artigo RSS '%1#%2'. Formato de dados inválido. + + New subscription... + Nova subscrição... - - - RSS::Private::Parser - - Invalid RSS feed. - Fonte RSS inválida. + + + Update all feeds + Atualizar todas as fontes - - %1 (line: %2, column: %3, offset: %4). - %1 (linha: %2, coluna: %3, offset: %4). - - - - RSS::Session - - - RSS feed with given URL already exists: %1. - Já existe uma fonte RSS com o URL dado: %1 - - - - Cannot move root folder. - Não é possível mover a pasta root. - - - - - Item doesn't exist: %1. - O item não existe: %1. - - - - Cannot delete root folder. - Não é possível eliminar a pasta root. - - - - Incorrect RSS Item path: %1. - Caminho do item RSS incorreto: %1. - - - - RSS item with given path already exists: %1. - Já existe o item RSS com o caminho dado: %1. - - - - Parent folder doesn't exist: %1. - Pasta associada inexistente: %1. - - - - RSSWidget - - - Search - Procurar + + Download torrent + Fazer o download do torrent - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - A procura de fontes RSS está agora desativada! Você pode ativá-la nas definições da aplicação. + + Open news URL + Abrir URL - - New subscription - Nova subscrição + + Copy feed URL + Copiar URL da fonte - - - - Mark items read - Marcar itens como lidos + + New folder... + Nova pasta... - + Refresh RSS streams Atualizar emissão de RSS + + + RSSImp - - Update all - Atualizar tudo - - - - RSS Downloader... - Downloader de RSS... - - - - Torrents: (double-click to download) - Torrents: (duplo clique para fazer o download) - - - - - Delete - Eliminar + + Stream URL: + URL da emissão: - - Rename... - Renomear... + + Please type a RSS stream URL + Por favor, indique o URL da emissão RSS - - Rename - Renomear + + This RSS feed is already in the list. + Esta fonte de RSS já se encontra na lista. - - - Update - Atualizar + + Please choose a folder name + Por favor, escolha o nome da pasta - - New subscription... - Nova subscrição... + + Folder name: + Nome da pasta: - - - Update all feeds - Atualizar todas as fontes + + New folder + Nova pasta - - Download torrent - Fazer o download do torrent + + Deletion confirmation + Confirmação de eliminação - - Open news URL - Abrir URL + + Are you sure you want to delete the selected RSS feeds? + Tem a certeza de que deseja eliminar as fontes RSS selecionadas? - - Copy feed URL - Copiar URL da fonte + + Please choose a new name for this RSS feed + Por favor, escolha um nome novo para esta fonte RSS - - New folder... - Nova pasta... + + New feed name: + Novo nome da fonte: - - Please choose a folder name - Por favor, escolha o nome da pasta + + Name already in use + O nome já se encontra em utilização - - Folder name: - Nome da pasta: + + This name is already used by another item, please choose another one. + Este nome já se entra em utilização por outro item. Por favor, escolha outro. - - New folder - Nova pasta + + Date: + Data: - - Please type a RSS feed URL - Por favor, introduza um URL com fonte RSS + + Author: + Autor: - - Feed URL: - URL fonte: + + Unread + Por ler + + + Rss::Feed - - Deletion confirmation - Confirmação de eliminação + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + O download automático de '%1' a partir da fonte RSS '%2' falhou porque não possui um torrent ou ligação Magnet... - - Are you sure you want to delete the selected RSS feeds? - Tem a certeza de que deseja eliminar as fontes RSS selecionadas? + + Automatically downloading '%1' torrent from '%2' RSS feed... + A fazer o download automático do torrent '%1' a partir da fonte RSS '%2'... + + + Rss::Private::Parser - - Please choose a new name for this RSS feed - Por favor escolha um novo nome para esta fonte RSS + + Invalid RSS feed. + Fonte RSS inválida. + + + RssSettingsDlg - - New feed name: - Novo nome da fonte: + + RSS Reader Settings + Definições do leitor RSS - - Rename failed - Ocorreu um erro ao tentar renomear + + RSS feeds refresh interval: + Intervalo de atualização das fontes RSS: - - Date: - Data: + + min + min - - Author: - Autor: + + Maximum number of articles per feed: + Número máximo de artigos por fonte: ScanFoldersDelegate - + Select save location Selecione o local para onde guardar @@ -7448,274 +6701,268 @@ ScanFoldersModel - + Monitored Folder Pasta monitorizada - + Override Save Location Sobrepor o local para guardar - + Monitored folder Pasta monitorizada - + Default save location Local por defeito para o 'Guardar' - + Browse... Navegar... - SearchJobWidget + SearchEngine - - Form - Questionário + + Unknown search engine plugin file format. + Formato desconhecido do ficheiro do plugin de motor de busca. - - Results(xxx) - Resultados(xxx) + + A more recent version of this plugin is already installed. + Já se encontra instalada uma versão mais recente deste plugin. - - Search in: - Pesquisar em: + + + Plugin is not supported. + Plugin não suportado. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - <html><head/><body><p>Alguns motores de busca pesquisam na descrição e também nos nomes dos ficheiros de torrent. Esses resultados da pesquisa serão exibidos na lista abaixo e controlados por esse modo.</p><p><span style=" font-weight:600;">Em tudo </span>desativa a filtragem e exibe todos os resultados do motor de pesquisa. </p><p><span style=" font-weight:600;">Apenas nomes de torrents</span> exibe apenas os torrents cujos nomes coincidam com o pedido.</p></body></html> + + Update server is temporarily unavailable. %1 + O servidor de atualizações encontra-se temporariamente indisponível. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - <html><head/><body><p>Definir o número máximo e mínimo de semeadores permitidos</p></body></html> + + + Failed to download the plugin file. %1 + Ocorreu um erro ao tentar fazer o download do ficheiro de plugin. %1 - - Seeds: - Sementes: + + An incorrect update info received. + Foi recebida uma informação de atualização incorreta. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - <html><head/><body><p>Número mínimo de sementes</p></body></html> + + All categories + Todas as categorias - - - to - para + + Movies + Filmes - - <html><head/><body><p>Maximal number of seeds</p></body></html> - <html><head/><body><p>Número máximo de sementes</p></body></html> + + TV shows + Programas de TV - - - - + + Music + Música - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - <html><head/><body><p>Definir o tamanho máximo e mínimo permitido de um torrent</p></body></html> + + Games + Jogos - - Size: - Tamanho: + + Anime + Animação - - <html><head/><body><p>Minimal torrent size</p></body></html> - <html><head/><body><p>Tamanho mínimo do torrent</p></body></html> + + Software + Software - - <html><head/><body><p>Maximal torrent size</p></body></html> - <html><head/><body><p>Tamanho máximo do torrent</p></body></html> + + Pictures + Imagens + + + + Books + Livros + + + + SearchListDelegate + + + + Unknown + Desconhecido(a) + + + SearchTab - + Name i.e: file name Nome - + Size i.e: file size Tamanho - + Seeders i.e: Number of full sources Semeadores - + Leechers i.e: Number of partial sources - Leechers + Sanguessugas - + Search engine Motor de busca - - Filter search results... - Filtrar resultados da pesquisa... - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results Resultados (a exibir <i>%1</i> de <i>%2</i>): - + Torrent names only Apenas nomes de torrents - + Everywhere Em tudo - - Use regular expressions - Utilizar expressões regulares - - - + Searching... A pesquisar... - + Search has finished A pesquisa terminou - + Search aborted Pesquisa abortada - + An error occurred during search... - Ocorreu um erro durante a procura... + Ocorreu um erro durante a pesquisa... - + Search returned no results A pesquisa não devolveu resultados - + Column visibility - Visibilidade da coluna - - - - SearchPluginManager - - - Unknown search engine plugin file format. - Formato desconhecido do ficheiro do plugin de motor de busca. - - - - A more recent version of this plugin is already installed. - Já se encontra instalada uma versão mais recente deste plugin. + - - - Plugin is not supported. - Plugin não suportado. + + Form + Questionário - - All categories - Todas as categorias + + Results(xxx) + Resultados(xxx) - - Movies - Filmes + + Search in: + Pesquisar em: - - TV shows - Programas de TV + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Alguns motores de busca pesquisam na descrição e também nos nomes dos ficheiros de torrent. Esses resultados da pesquisa serão exibidos na lista abaixo e controlados por esse modo.</p><p><span style=" font-weight:600;">Em tudo </span>desativa a filtragem e exibe todos os resultados do motor de pesquisa. </p><p><span style=" font-weight:600;">Apenas nomes de torrents</span> exibe apenas os torrents cujos nomes coincidam com o pedido.</p></body></html> - - Music - Música + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Definir o número máximo e mínimo de semeadores permitidos</p></body></html> - - Games - Jogos + + Seeds: + Sementes: - - Anime - Animação + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Número mínimo de sementes</p></body></html> - - Software - Software + + + to + para - - Pictures - Imagens + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Número máximo de sementes</p></body></html> - - - Books - Livros + + + + + - - Update server is temporarily unavailable. %1 - O servidor de atualizações encontra-se temporariamente indisponível. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Definir o tamanho máximo e mínimo permitido de um torrent</p></body></html> - - - Failed to download the plugin file. %1 - Ocorreu um erro ao tentar fazer o download do ficheiro de plugin. %1 + + Size: + Tamanho: - - An incorrect update info received. - Foi recebida uma informação de atualização incorreta. + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Tamanho mínimo do torrent</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - O plugin de procura '%1' contém uma versão inválida da string ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Tamanho máximo do torrent</p></body></html> @@ -7723,251 +6970,238 @@ - - - - + + + Search Procurar - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - Não se encontram instalados nenhuns plugins de pesquisa. -Para instalar alguns, clique no botão "Plugins de pesquisa..." localizado no canto inferior direito da janela. - - - + Download Transferir - + Go to description page Ir para a página de descrição - + Copy description page URL Copiar URL da página de descrição - + Search plugins... Plugins de pesquisa... - + A phrase to search for. Uma frase para procurar. - + Spaces in a search term may be protected by double quotes. Os espaços dentro de um termo de pesquisa poderão ser protegidos com aspas duplas. - + Example: Search phrase example Exemplo: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>: pesquisar por <b>foo</b> e <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: pesquisar por <b>foo bar</b> - + All plugins Todos os plugins - + Only enabled Apenas ativo(s) - + Select... Selecionar... - - - + + + Search Engine Motor de busca - + Please install Python to use the Search Engine. Por favor, instale o Python para poder utilizar o 'Motor de pesquisa' - + Empty search pattern Padrão de procura vazio - + Please type a search pattern first Por favor, indique primeiro um padrão de procura - + Stop Parar - + Search has finished A pesquisa terminou - + Search has failed A pesquisa falhou - ShutdownConfirmDialog - - - Don't show again - Não exibir novamente - + ShutdownConfirmDlg - + qBittorrent will now exit. O qBittorrent irá agora terminar. - + E&xit Now - Te&rminar agora + Sa&ir agora - + Exit confirmation Confirmação de saída - + The computer is going to shutdown. - O computador irá agora desligar-se. + O computador irá agora desligar-se - + &Shutdown Now - &Encerrar agora - - - - Shutdown confirmation - Confirmação de encerramento + De&sligar agora - + The computer is going to enter suspend mode. O computador irá entrar em modo de suspensão. - + &Suspend Now &Suspender agora - + Suspend confirmation - Confirmação de suspensão + Suspender confirmação - + The computer is going to enter hibernation mode. O computador irá entrar em modo de hibernação. - + &Hibernate Now &Hibernar agora - + Hibernate confirmation - Confirmação de hibernação + Confirmar hibernação - + You can cancel the action within %1 seconds. Poderá cancelar esta ação durante %1 segundos. + + + Shutdown confirmation + Confirmação de encerramento + SpeedLimitDialog - + KiB/s - KiB/s + KB/s SpeedPlotView - + Total Upload Total de uploads - + Total Download Total de downloads - + Payload Upload Carga de uploads - + Payload Download Carga de downloads - + Overhead Upload Overhead de uploads - + Overhead Download Overhead de downloads - + DHT Upload DHT de upload - + DHT Download Receção DHT - + Tracker Upload Upload de tracker - + Tracker Download Download de tracker @@ -7975,95 +7209,87 @@ SpeedWidget - + Period: Período: - + 1 Minute 1 minuto - + 5 Minutes 5 minutos - + 30 Minutes 30 minutos - + 6 Hours 6 horas - + Select Graphs Selecionar gráficos - + Total Upload Total de uploads - + Total Download Total de downloads - + Payload Upload Envio payload - + Payload Download Carga de downloads - + Overhead Upload Overhead de uploads - + Overhead Download Overhead de downloads - + DHT Upload DHT de upload - + DHT Download Download de DHT - + Tracker Upload Upload de tracker - + Tracker Download Download de tracker - StacktraceDialog - - - Crash info - Informações do erro - - - StatsDialog @@ -8076,48 +7302,48 @@ Estatísticas do utilizador - - Cache statistics - Estatísticas de cache + + Total peer connections: + Total de fontes de ligações: - - Read cache hits: - Ler os tops da cache: + + Global ratio: + Rácio global: - - Average time in queue: - Tempo médio em fila: + + Alltime download: + Receções totais: - - Connected peers: - Fontes ligadas: + + Alltime upload: + Envios totais: - - All-time share ratio: - Taxa de partilha global: + + Total waste (this session): + Total de perdas (nesta sessão): - - All-time download: - Downloads globais: + + Cache statistics + Estatísticas de cache - - Session waste: - Desperdício da sessão: + + Read cache hits: + Ler os tops da cache: - - All-time upload: - Uploads globais: + + Average time in queue: + Tempo médio em fila: - Total buffer size: + Total buffers size: Tamanho total do buffer: @@ -8146,7 +7372,12 @@ Tamanho total da fila: - + + OK + OK + + + %1 ms 18 milliseconds %1 ms @@ -8155,27 +7386,32 @@ StatusBar - + Connection status: Estado da ligação: - + No direct connections. This may indicate network configuration problems. Sem ligações diretas. Isto poderá indicar erros na configuração da rede. - + DHT: %1 nodes DHT: %1 nós - - qBittorrent needs to be restarted! - O qBittorrent necessita de ser reiniciado! + + qBittorrent needs to be restarted + O qBittorrent necessita de ser recomeçado + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + O qBittorrent foi atualizado e necessita de reiniciado para que as alterações tenham efeito. @@ -8186,891 +7422,624 @@ Offline. This usually means that qBittorrent failed to listen on the selected port for incoming connections. - Off-line. Normalmente isto significa que o qBittorrent não conseguiu ativar a porta selecionada para as ligações recebidas. + Offline. Normalmente isto significa que o qBittorrent não conseguiu ativar a porta selecionada para as ligações recebidas. Online - On-line + Online - + Click to switch to alternative speed limits Clique para mudar para os limites alternativos de velocidade - + Click to switch to regular speed limits Clique para mudar para os limites normais de velocidade - + + Manual change of rate limits mode. The scheduler is disabled. + Alteração manual do rácio do modo de limites. O agendamento encontra-se inativo. + + + Global Download Speed Limit Limite global para a velocidade de download - + Global Upload Speed Limit Limite global para a velocidade de upload - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter Tudo (0) - + Downloading (0) - A fazer o download de (0) + A fazer o download (0) - + Seeding (0) A semar (0) - + Completed (0) - Terminado(s) (0) + Terminado (0) - + Resumed (0) - Retomado(s) (0) + Retomado (0) - + Paused (0) Em pausa (0) - + Active (0) - Ativo(s) (0) + Ativos (0) - + Inactive (0) - Inativo(s) (0) + Inativos (0) - + Errored (0) - Com erros (0) + Com erro (0) - + All (%1) Tudo (%1) - + Downloading (%1) A fazer o download (%1) - + Seeding (%1) A semear (%1) - + Completed (%1) - Terminado(s) (%1) + Terminados (%1) - + Paused (%1) Em pausa (%1) - + Resumed (%1) - Retomado(s) (%1) + Retomados (%1) - + Active (%1) - Ativo(s) (%1) + Ativos (%1) - + Inactive (%1) - Inativo(s) (%1) + Inativos (%1) - + Errored (%1) - Com erros (%1) + Com erro (%1) - TagFilterModel + TorrentContentModel - - Tags - Etiquetas + + Name + Nome - - All - Tudo + + Size + Tamanho - - Untagged - Sem etiqueta + + Progress + Evolução - - - TagFilterWidget - - Add tag... - Adicionar etiqueta... + + Download Priority + Prioridade dos downloads - - Remove tag - Remover etiqueta + + Remaining + Restante + + + TorrentCreatorDlg - - Remove unused tags - Remover etiquetas não utilizadas + + Select a folder to add to the torrent + Selecione uma pasta para adicionar ao torrent - - Resume torrents - Retomar torrents + + Select a file to add to the torrent + Selecione um ficheiro para o adicionar ao torrent - - Pause torrents - Pausar torrents + + No input path set + Não foi ainda selecionado nenhum caminho de entrada - - Delete torrents - Eliminar torrents + + Please type an input path first + Por favor, indique primeiro o caminho de entrada - - New Tag - Nova etiqueta + + Select destination torrent file + Selecione o ficheiro torrent de destino - - Tag: - Etiqueta: + + Torrent Files (*.torrent) + Ficheiros torrent (*.torrent) - - Invalid tag name - Nome de etiqueta inválido + + Torrent was created successfully: %1 + %1 is the path of the torrent + Torrent criado com sucesso: '%1' - - Tag name '%1' is invalid - O nome da etiqueta '%1' é inválido + + + + Torrent creation + Criação de torrent - - Tag exists - A etiqueta já existe + + Torrent creation was unsuccessful, reason: %1 + Não foi possível a criação do torrent. Motivo: %1 - - Tag name already exists. - O nome da etiqueta já existe. + + Created torrent file is invalid. It won't be added to download list. + O ficheiro torrent criado é inválido e não será adicionado à lista de downloads. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Propriedades da categoria do torrent + + Name + i.e: torrent name + Nome - - Name: - Nome: + + Size + i.e: torrent size + Tamanho - - Save path: - Caminho de gravação: + + Done + % Done + Concluído - - Choose save path - Escolha o caminho para guardar + + Status + Torrent status (e.g. downloading, seeding, paused) + Estado - - New Category - Nova categoria + + Seeds + i.e. full sources (often untranslated) + Sementes - - Invalid category name - Nome de categoria inválido + + Peers + i.e. partial sources (often untranslated) + Fontes - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - O nome da categoria não pode conter '\'. -O nome da categoria não pode iniciar/terminar com '/'. -O nome da categoria não pode conter a sequência '//'. - - - - Category creation error - Erro ao criar a categoria - - - - Category with the given name already exists. -Please choose a different name and try again. - Já existe uma categoria com o nome dado. -Por favor, escolha um nome diferente e tente novamente. + + Down Speed + i.e: Download speed + Vel. de download - - - TorrentContentModel - - Name - Nome + + Up Speed + i.e: Upload speed + Vel. de upload - - Size - Tamanho + + Ratio + Share ratio + Rácio - - Progress - Evolução + + ETA + i.e: Estimated Time of Arrival / Time left + TEF - - Download Priority - Prioridade dos downloads + + Category + Categoria - - Remaining - Restante + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Adicionado em - - Availability - Disponibilidade + + Completed On + Torrent was completed on 01/01/2010 08:00 + Concluído em - - - TorrentCreatorDialog - - Torrent Creator - Criador de torrents + + Tracker + Tracker - - Select file/folder to share - Selecione o ficheiro/pasta a partilhar + + Down Limit + i.e: Download limit + Limite de downloads - - Path: - Caminho: + + Up Limit + i.e: Upload limit + Limite de uploads - - [Drag and drop area] - [Área arrastar e largar] + + Downloaded + Amount of data downloaded (e.g. in MB) + Descarregado - - - Select file - Selecione o ficheiro + + Uploaded + Amount of data uploaded (e.g. in MB) + Enviado - - - Select folder - Selecione a pasta + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Dados recebidos - - Settings - Definições + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Dados enviados - - Piece size: - Tamanho da peça: + + Remaining + Amount of data left to download (e.g. in MB) + Restante - - Auto - Automático + + Time Active + Time (duration) the torrent is active (not paused) + Tempo ativo - - 16 KiB - 16 KiB + + Save path + Torrent save path + Guardar em - - 32 KiB - 32 KiB + + Completed + Amount of data completed (e.g. in MB) + Terminado - - 64 KiB - 64 KiB + + Ratio Limit + Upload share ratio limit + Limite do rácio - - 128 KiB - 128 KiB + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Última vez que o ficheiro esteve completo - - 256 KiB - 256 KiB + + Last Activity + Time passed since a chunk was downloaded/uploaded + Última atividade - - 512 KiB - 512 KiB + + Total Size + i.e. Size including unwanted data + Tamanho total + + + TrackerFiltersList - - 1 MiB - 1 MiB + + All (0) + this is for the tracker filter + Tudo (0) - - 2 MiB - 2 MiB + + Trackerless (0) + Trackerless (0) - - 4 MiB - 4 MiB + + Error (0) + Erro (0) - - 8 MiB - 8 MiB + + Warning (0) + Aviso (0) - - 16 MiB - 16 MiB + + + Trackerless (%1) + Trackerless (%1) - - 32 MiB - 32 MiB + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - Calculate number of pieces: - Calcular o número de peças: + + + Error (%1) + Erro (%1) - - Private torrent (Won't distribute on DHT network) - Torrent privado (Não distribuir em redes DHT) + + + Warning (%1) + Aviso (%1) - - Start seeding immediately - Começar a semear imediatamente + + Resume torrents + Retomar torrents - - Ignore share ratio limits for this torrent - Ignorar limites do rácio de partilha para este torrent + + Pause torrents + Pausar torrents - - Optimize alignment - Otimizar alinhamento + + Delete torrents + Eliminar torrents - - Fields - Campos + + + All (%1) + this is for the tracker filter + Tudo (%1) + + + TrackerList - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - Pode separar os grupos/filas de trackers com uma linha vazia. + + URL + URL - - Web seed URLs: - URL de sementes da web: - - - - Tracker URLs: - URLs do tracker: - - - - Comments: - Comentários: - - - - Source: - Fonte: - - - - Progress: - Evolução: - - - - Create Torrent - Criar torrent - - - - - - Torrent creation failed - Falha ao tentar criar torrent - - - - Reason: Path to file/folder is not readable. - Motivo: O caminho para o ficheiro/pasta é ilegível. - - - - Select where to save the new torrent - Selecione para onde guardar o torrent novo - - - - Torrent Files (*.torrent) - Ficheiros torrent (*.torrent) - - - - Reason: %1 - Motivo: %1 - - - - Reason: Created torrent is invalid. It won't be added to download list. - Motivo: O torrent criado não é válido e não será adicionado à lista de downloads. - - - - Torrent creator - Criador de torrents - - - - Torrent created: - Torrent criado: - - - - TorrentInfo - - - File size exceeds max limit %1 - O tamanho do ficheiro excede o limite máx. de %1 - - - - Torrent file read error: %1 - Erro de leitura do ficheiro torrent: %1 - - - - Torrent file read error: size mismatch - Erro de leitura do ficheiro torrent: incompatibilidade de tamanho - - - - TorrentsController - - - Not contacted yet - Ainda não contactado - - - - Updating... - A atualizar... - - - - Working - A executar - - - - Not working - Parado - - - - Error: '%1' is not a valid torrent file. - Erro: '%1' não é um ficheiro torrent válido. - - - - - - - Torrent queueing must be enabled - Deverá ser ativada a fila de torrents - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - + + Status + Estado - - Unable to edit category + + Received - Save path is empty - O caminho de gravação encontra-se vazio - - - - Cannot make save path - Não é possível criar o caminho de gravação - - - - Cannot write to directory - Não é possível escrever na diretoria - - - - WebUI Set location: moving "%1", from "%2" to "%3" - Definir localização da interface web: a mover "%1", de "%2" para"%3" - - - - Incorrect torrent name - Nome do torrent incorreto - - - - - Incorrect category name - Nome de categoria incorreto - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - Tudo (0) - - - - Trackerless (0) - Trackerless (0) - - - - Error (0) - Erro (0) - - - - Warning (0) - Aviso (0) - - - - - Trackerless (%1) - Trackerless (%1) - - - - - Error (%1) - Erro (%1) - - - - - Warning (%1) - Aviso (%1) - - - - Resume torrents - Retomar torrents + + Seeds + Sementes - - Pause torrents - Pausar torrents + + Peers + Fontes - - Delete torrents - Eliminar torrents + + Downloaded + Descarregado - - - All (%1) - this is for the tracker filter - Tudo (%1) + + Message + Mensagem - - - TrackerListWidget - - + + Working A executar - + Disabled Inativo - + This torrent is private Este torrent é privado - + Updating... A atualizar... - + Not working Parado - + Not contacted yet - Ainda não contactado + Ainda não ligado - - - - - - - N/A - N/D + + Tracker URL: + URL do tracker: - + Tracker editing - A editar tracker + Editar tracker - - Tracker URL: - URL do tracker: - - - - + + Tracker editing failed - Ocorreu um erro ao tentar editar o tracker + Ocorreu um erro ao tentar editar tracker - + The tracker URL entered is invalid. O URL do tracker introduzido é inválido. - + The tracker URL already exists. O URL do tracker já existe. - + Add a new tracker... Adicionar novo tracker... - - Remove tracker - Remover tracker - - - + Copy tracker URL Copiar URL do tracker - + Edit selected tracker URL Editar URL do tracker selecionado - + Force reannounce to selected trackers Forçar novo anúncio dos trackers selecionados - + Force reannounce to all trackers Forçar novo anúncio de todos os trackers - - URL - URL - - - - Status - Estado - - - - Received - Recebidos - - - - Seeds - Sementes - - - - Peers - Fontes - - - - Downloaded - Descarregados - - - - Message - Mensagem - - - - Column visibility - Visibilidade da coluna - - - - TrackerLoginDialog - - - - Tracker authentication - Autenticação do tracker - - - - Tracker: - Tracker: - - - - Login - Iniciar sessão - - - - Username: - Nome de utilizador: - - - - Password: - Palavra-passe: - - - - Log in - Iniciar sessão + + Remove tracker + Remover tracker - TrackersAdditionDialog + TrackersAdditionDlg - + Trackers addition dialog - Diálogo de adição de trackers + Diálogo de adição de Trackers - + List of trackers to add (one per line): Lista de trackers a adicionar (um por linha): - - + + µTorrent compatible list URL: URL da lista compatível com µTorrent: - + + I/O Error + Erro I/O + + + + Error while trying to open the downloaded file. + Ocorreu um erro ao tentar abrir o ficheiro descarregado. + + + No change Sem alterações - + No additional trackers were found. Não foram encontrados trackers adicionais. - + Download error Erro de download - + The trackers list could not be downloaded, reason: %1 Não foi possível fazer o download das lista de trackers. Motivo: %1 @@ -9078,787 +8047,835 @@ TransferListDelegate - + Downloading A fazer o download - + Downloading metadata used when loading a magnet link A fazer o download dos meta-dados - + Allocating qBittorrent is allocating the files on disk A alocar - + Paused Em pausa - + Queued i.e. torrent is queued Na fila - + Seeding Torrent is complete and in upload-only mode A semear - + Stalled Torrent is waiting for download to begin Em espera - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] Download - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] Semear - + Checking Torrent local data is being checked A verificar - + Queued for checking i.e. torrent is queued for hash checking Na fila de verificação - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. A analisar dados - + Completed Terminado - - Moving - Torrent local data are being moved/relocated - A mover - - - + Missing Files Ficheiros em falta - + Errored torrent status, the torrent has an error Com erro - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - %1 (semeado durante %2) - - - - %1 ago - e.g.: 1h 20m ago - %1 atrás - - - - TransferListFiltersWidget - - - Status - Estado - - - - Categories - Categorias - - - - Tags - Etiquetas - - - - Trackers - Trackers - - - - TransferListModel - - - Name - i.e: torrent name - Nome - - - - Size - i.e: torrent size - Tamanho - - - - Done - % Done - Concluído - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Estado - - - - Seeds - i.e. full sources (often untranslated) - Sementes - - - - Peers - i.e. partial sources (often untranslated) - Fontes - - - - Down Speed - i.e: Download speed - Vel. de download - - - - Up Speed - i.e: Upload speed - Vel. upload - - - - Ratio - Share ratio - Rácio - - - - ETA - i.e: Estimated Time of Arrival / Time left - TEF - - - - Category - Categoria - - - - Tags - Etiquetas - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - Adicionado em - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - Terminado em - - - - Tracker - Tracker - - - - Down Limit - i.e: Download limit - Limite de downloads - - - - Up Limit - i.e: Upload limit - Limite de uploads - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Transferido - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Enviado - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - Dados recebidos - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - Dados enviados - - - - Remaining - Amount of data left to download (e.g. in MB) - Restante - - - - Time Active - Time (duration) the torrent is active (not paused) - Tempo de atividade - - - - Save path - Torrent save path - Guardar em - - - - Completed - Amount of data completed (e.g. in MB) - Terminado(s) + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) + %1 (semeado durante %2) - - Ratio Limit - Upload share ratio limit - Limite do rácio + + %1 ago + e.g.: 1h 20m ago + %1 atrás + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - Última vez que o ficheiro esteve completo + + Status + Estado - - Last Activity - Time passed since a chunk was downloaded/uploaded - Última atividade + + Categories + Categorias - - Total Size - i.e. Size including unwanted data - Tamanho total + + Trackers + Trackers TransferListWidget - + Column visibility Visibilidade das colunas - + Choose save path Escolha o caminho para guardar - + Torrent Download Speed Limiting Limite de velocidade para o download dos torrents - + Torrent Upload Speed Limiting Limite de velocidade para o upload de torrents - + Recheck confirmation Confirmação de reverificação - + Are you sure you want to recheck the selected torrent(s)? Tem a certeza de que deseja reverificar o(s) torrent(s) selecionado(s)? - + Rename Renomear - + New name: Novo nome: - + Resume Resume/start the torrent Retomar - + Force Resume Force Resume/start the torrent Forçar continuação - + Pause Pause the torrent Pausar - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Definir localização: a mover "%1", de "%2" para "%3" - - - - Add Tags - Adicionar etiquetas - - - - Remove All Tags - Remover todas as etiquetas - - - - Remove all tags from selected torrents? - Remover todas as etiquetas dos torrents selecionados? + + New Category + Nova categoria - - Comma-separated tags: - Etiquetas separadas por virgulas: + + Category: + Categoria: - - Invalid tag - Etiqueta inválida + + Invalid category name + Nome de categoria inválido - - Tag name: '%1' is invalid - Nome da etiqueta: '%1' é inválido + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + O nome da categoria não deverá conter '\'. +O nome da categoria não deverá começar/terminar com '/'. +O nome da categoria não deverá conter a sequencia '//'. - + Delete Delete the torrent Eliminar - + Preview file... Visualizar ficheiro... - + Limit share ratio... Limitar o rácio de partilha... - + Limit upload rate... Limitar rácio de upload... - + Limit download rate... Limitar o rácio de download... - + Open destination folder Abrir pasta de destino - + Move up i.e. move up in the queue Mover para cima - + Move down i.e. Move down in the queue Mover para baixo - + Move to top i.e. Move to top of the queue Mover para o início - + Move to bottom i.e. Move to bottom of the queue Mover para o fim - + Set location... Definir localização... - - Force reannounce - Forçar reinício - - - + Copy name Copiar nome - - Copy hash - Copiar hash - - - + Download first and last pieces first Fazer o download da primeira e última peça primeiro - + Automatic Torrent Management Gestão automática do torrent - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category O modo automático significa que várias propriedades do torrent (ex: salvar caminho) serão decididas pela categoria associada - + Category Categoria - + New... New category... Novo(a)... - + Reset Reset category Redefinir - - Tags - Etiquetas - - - - Add... - Add / assign multiple tags... - Adicionar... - - - - Remove All - Remove all tags - Remover tudo - - - + Priority Prioridade - + Force recheck Forçar nova verificação - + Copy magnet link - Copiar ligação magnet + Copiar ligação Magnet - + Super seeding mode Modo super semeador - + Rename... Renomear... - + Download in sequential order Fazer o download sequencialmente - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting Limite de rácio para o upload/download dos torrents - - Use global share limit - Utilizar limite de partilha global + + Use global ratio limit + Utilizar limite de rácio global - - - + + + buttonGroup botãoGrupo - - Set no share limit - Definir ausência de limite de partilha + + Set no ratio limit + Sem limites de rácio + + + + Set ratio limit to + Definir o limite de rácio para + + + + WebApplication + + + Incorrect category name + Nome de categoria incorreto + + + + WebUI + + + The Web UI is listening on port %1 + A interface web está a receber na porta %1 + + + + Web UI Error - Unable to bind Web UI to port %1 + Erro da interface web - Não foi possível associar a porta %1 + + + about - - Set share limit to - Definir o limite de partilha para + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Um cliente avançado de BitTorrent programado em C++, baseado em ferramentas QT e em 'libtorrent-rasterbar'. - - ratio - rácio + + Copyright %1 2006-2016 The qBittorrent project + Copyright %1 2006-2016 The qBittorrent project - - minutes - minutos + + Home Page: + Página inícial - - No share limit method selected - Não foi selecionado nenhum método de limite de partilha + + Forum: + Fórum: - - Please select a limit method first - Por favor, selecione primeiro um método de limite de partilha + + Bug Tracker: + Bug Tracker: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - Versão Python detetada: %1 + + Add Peers + Adicionar fontes - - Python not detected - Python não detetado + + List of peers to add (one per line): + Lista de fontes a adicionar (uma por linha): + + + + Format: IPv4:port / [IPv6]:port + Formato: IPv4:porta / [IPv6]:porta - WebApplication + authentication + + + + Tracker authentication + Autenticação do tracker + + + + Tracker: + Tracker: + + + + Login + Iniciar sessão + + + + Username: + Nome de utilizador: + - - Unacceptable file type, only regular file is allowed. - Tipo de ficheiro não permitido, apenas são permitidos ficheiros regulares. + + Password: + Palavra-passe: - - Symlinks inside alternative UI folder are forbidden. - São proibidos Symlinks dentro da pasta alternativa da interface o utilizador. + + Log in + Iniciar sessão - - Exceeded the maximum allowed file size (%1)! - Foi excedido o limite de tamanho máximo permitido para um ficheiro (%1)! + + Cancel + Cancelar + + + confirmDeletionDlg - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - Interface web: O 'Cabeçalho de origem' e o 'Alvo de origem' são incompatíveis! IP da fonte: '%1'. Cabeçalho de origem: '%2'. Alvo de origem: '%3' + + Deletion confirmation - qBittorrent + Confirmação de eliminação - qBittorrent - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - Interface web: O 'Cabeçalho referenciador' e o 'Alvo de origem' são incompatíveis! IP da fonte: '%1'. Cabeçalho referenciador: '%2'. Alvo de origem: '%3' + + Remember choice + Memorizar escolha - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - Interface web: Porta incompatível no 'Cabeçalho referenciador. IP da fonte pedido: '%1'. Porta do servidor: '%2'. Cabeçalho do host recebido: '%3' + + Also delete the files on the hard disk + Eliminar também os ficheiros existentes no disco rígido + + + confirmShutdownDlg - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - Interface web: Cabeçalho do Host inválido. IP da fonte pedido: '%1'. Recebido o cabeçalho do Host: '%2' + + Don't show again + Não exibir novamente - WebUI + createTorrentDialog + + + Cancel + Cancelar + + + + Torrent Creation Tool + Ferramenta de criação de torrent + + + + Torrent file creation + Criação do ficheiro torrent + + + + Add file + Adicionar ficheiro + + + + Add folder + Adicionar pasta + + + + File or folder to add to the torrent: + Ficheiro ou pasta para adicionar ao torrent: + + + + Tracker URLs: + URLs de tracker: + + + + Web seeds urls: + URLs de fontes web: + + + + Comment: + Comentário: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Pode separar os grupos/filas de trackers com uma linha vazia. + + + + Piece size: + Tamanho da peça: + + + + 16 KiB + 16 KB + + + + 32 KiB + 32 KB + + + + 64 KiB + 64 KB + + + + 128 KiB + 128 KB + + + + 256 KiB + 256 KB + + + + 512 KiB + 512 KB + + + + 1 MiB + 1 MB + + + + 2 MiB + 2 MB + + + + 4 MiB + 4 MB + + + + 8 MiB + 8 MB + + + + 16 MiB + 16 MB + + + + Auto + Automático + + + + Private (won't be distributed on DHT network if enabled) + Privado (se ativo, não será partilhado em redes DHT) + + + + Start seeding after creation + Iniciar o semeio depois da criação + - - Web UI: HTTPS setup successful - Interface web: HTTPS configurado com sucesso + + Ignore share ratio limits for this torrent + Ignorar limites do rácio de partilha para este torrent + + + + Create and save... + Criar e guardar... + + + + Progress: + Evolução: + + + + downloadFromURL + + + Add torrent links + Adicionar ligações torrent + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Um por linha (são suportadas ligações HTTP, Magnet e info-hashes) - - Web UI: HTTPS setup failed, fallback to HTTP - Interface web: falha na configuração do HTTPS, a retroceder para HTTP + + Download + Download + + + + Cancel + Cancelar + + + + Download from urls + Download a partir de URLs - - Web UI: Now listening on IP: %1, port: %2 - Interface web: Agora a escutar no IP: %1, porta: %2 + + No URL entered + Nenhum URL inserido + + + + Please type at least one URL. + Por favor, introduza pelo menos um URL. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Interface web: Não foi possível associar ao IP: %1., porta: %2. Motivo: %3 + + Crash info + Informações do erro fsutils - + + + + + Downloads - Transferências + Downloads misc - + B bytes B - + KiB kibibytes (1024 bytes) KB - + MiB mebibytes (1024 kibibytes) MB - + GiB gibibytes (1024 mibibytes) GB - + TiB tebibytes (1024 gibibytes) TB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + Python não detetado + + + + Python version: %1 + Versão do Python: %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1 h e %2 m - + %1d %2h e.g: 2days 10hours %1 d e %2 h - + Unknown Unknown (size) Desconhecido - + qBittorrent will shutdown the computer now because all downloads are complete. O qBittorrent vai desligar o computador porque todos os downloads foram concluídos. - + < 1m < 1 minute < 1 m - + %1m e.g: 10minutes %1 m + + + Working + A executar + + + + Updating... + A atualizar... + + + + Not working + Parado + + + + Not contacted yet + Ainda não ligado + preview - + Preview selection Visualizar seleção - + The following files support previewing, please select one of them: Os ficheiros seguintes suportam a visualização. Por favor escolha um: + + + Preview + Visualizar + + + + Cancel + Cancelar + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_ro.ts qbittorrent-3.3.15/src/lang/qbittorrent_ro.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_ro.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_ro.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - + Despre qBittorrent - + About - + Despre - + Author - - - - - Current maintainer - + Autor - - Greece - Grecia + + + Nationality: + Naționalitate: - - - Nationality: - + + + Name: + Nume: - - + + E-mail: - + E-mail: - - - Name: - Nume: + + Greece + Grecia - - Original author - + + Current maintainer + Responsabil actual - - France - Franța + + Original author + Autor original - + Special Thanks - + Mulțumiri speciale - + Translators - + Traducători - - License - - - - + Libraries - + Biblioteci - + qBittorrent was built with the following libraries: - - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - + qBittorrent a fost construit folosind următoarele biblioteci: - - Forum: - + + France + Franța - - Bug Tracker: - + + License + Licență @@ -115,57 +90,67 @@ Salvează la - + + Browse... + Răsfoire... + + + + Set as default save path + Stabilește drept cale de salvare implicită + + + Never show again Nu arăta din nou - + Torrent settings Configurări torrent - + Set as default category Stabilește ca și categorie implicită - + Category: Categorie: - + Start torrent Pornește torrentul - + Torrent information Informații torrent - + Skip hash check Omite verificarea indexului - + Size: Dimensiune: - + Hash: Index: - + Comment: Comentariu: - + Date: Dată: @@ -190,117 +175,89 @@ Automat - - Remember last used save path - - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog Când opțiunea este bifată, fișierul .torrent nu va fi șters în ciuda setărilor din pagina "Descărcări” a ferestrei de dialog opțiuni - + Do not delete .torrent file Nu șterge fișierul .torrent - - Create subfolder - Creează subdosar - - - - Download in sequential order - Descarcă în ordine secvențială - - - - Download first and last pieces first - Descarcă prima și ultima bucată întâi - - - + Normal Normal - + High Înalt - + Maximum Maxim - + Do not download Nu descărca - - - + + + I/O Error Eroare Intrare/Ieșire - + Invalid torrent Torrent nevalid - - Renaming - Se redenumește - - - - - Rename error - Eroare de redenumire - - - - The name is empty or contains forbidden characters, please choose a different one. - + + + + + Already in download list + Este deja în lista de descărcări - + Not Available This comment is unavailable Nu este disponibil - + Not Available This date is unavailable Nu este disponibil - + Not available Nu este disponibil - + Invalid magnet link Legătură magnet nevalidă - + The torrent file '%1' does not exist. Fișierul torent „%1” nu există. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. Fișierul torent „%1” nu a putut fi citit de pe disc. Probabil nu aveți permisiuni suficiente. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ Eroare: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torrentul este deja în lista de descărcări. Urmăritoarele nu au fost combinate deoarece este un torrent privat. + + + + Torrent is already in download list. Trackers were merged. + Torrentul este deja în lista de descărcări. Urmăritoarele au fost combinate. + + + + + Cannot add torrent + Nu se poate adăuga torrentul + + + + Cannot add this torrent. Perhaps it is already in adding state. + Acest torrent nu poate fi adăugat. Probabil este deja într-o stare de adăugare. + + + This magnet link was not recognized Această legătură magnet nu a fost recunoscută - + + Magnet link is already in download list. Trackers were merged. + Legătura magnet este deja în lista de descărcări. Urmăritoarele au fost combinate. + + + + Cannot add this torrent. Perhaps it is already in adding. + Acest torrent nu poate fi adăugat. Probabil este deja într-o stare de adăugare. + + + Magnet link Legătură magnet - + Retrieving metadata... Se obțin metadatele... - + Not Available This size is unavailable. Nu este disponibil - + Free space on disk: %1 Spațiu liber pe disc: %1 - + + Choose save path Alegeți calea de salvare - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - + + Rename the file + Redenumire fișier - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + + New name: + Nume nou: - - Magnet link is already queued for processing. - + + + The file could not be renamed + Fișierul nu a putut fi redenumit - - New name: - Nume nou: + + This file name contains forbidden characters, please choose a different one. + Numele fișierului conține caractere interzise, alegeți un nume diferit. - - + + This name is already in use in this folder. Please use a different name. Acest nume este deja utilizat în dosar. Utilizați un nume diferit. - + The folder could not be renamed Dosarul nu a putut fi redenumit - + Rename... Redenumire... - + Priority Prioritate - + Invalid metadata Metadate nevalide - + Parsing metadata... Se analizează metadatele... - + Metadata retrieval complete Metadatele au fost obținute - + Download Error Eroare descărcare @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Mărime prestocare la scrierea pe disc + + + MiB MiO - + Outgoing ports (Min) [0: Disabled] Porturi de ieșire (Min) [0: Dezactivat] - + Outgoing ports (Max) [0: Disabled] Porturi de ieșire (Max) [0: Dezactivat] - + Recheck torrents on completion Reverifică torrentele la finalizare - + Transfer list refresh interval Intervalul de reîmprospătare a listei de transferuri - + ms milliseconds ms - + Setting Configurare - + Value Value set for this setting Valoare - - - (disabled) - (dezactivată) - - - + (auto) (automată) - - min - minutes - min - - - + All addresses Toate adresele - + qBittorrent Section Secțiune qBittorrent - - + + Open documentation Deschide documentația - + libtorrent Section Secțiune libtorrent - - Asynchronous I/O threads - - - - - Disk cache - Prestocare disc - - - + s seconds s - + Disk cache expiry interval - Interval de expirare prestocare (cache) disc + Interval de expirare prestocare(cache) disc - + Enable OS cache Activează prestocarea (cache-ul) sistemului - - Guided read cache - Prestocare citire ghidată - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - - - - - - KiB - KiO - - - - Send buffer watermark - - - - - Send buffer low watermark - - - - - Send buffer watermark factor - - - - - Prefer TCP - - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address - + + m + minutes + m - + Resolve peer countries (GeoIP) Rezolvă țările partenerilor (GeoIP) - + Resolve peer host names Rezolvă numele de gazdă ale partenerilor - + Strict super seeding Doar super-contribuire - + Network Interface (requires restart) Interfață de rețea (necesită repornire) - + Optional IP Address to bind to (requires restart) Adresă IP opțională pentru legare (necesită repornire) - + Listen on IPv6 address (requires restart) Ascultă pe adresa IPv6 (necesită repornire) - + Display notifications Afișează notificări - + Display notifications for added torrents Afișează notificări pentru torentele adăugate - + Download tracker's favicon Descarcă pictograma de favorite a urmăritorului - - Save path history length - - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - Comportament sloturi de încărcare - - - - Round-robin - - - - - Fastest upload - - - - - Anti-leech - - - - - Upload choking algorithm - Algoritm de înecare încărcare - - - + Confirm torrent recheck Cere confirmare pentru reverificarea torrentelor - - Confirm removal of all tags - - - - - Always announce to all trackers in a tier - + Exchange trackers with other peers + Schimbă urmăritoare cu alți parteneri - - Always announce to all tiers - Anunță întotdeauna tuturor straturilor + + Always announce to all trackers + Anunță întotdeauna toate urmăritoarele - + Any interface i.e. Any network interface Oricare interfață - + Save resume data interval How often the fastresume file is saved. Interval salvare date de reluare - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - Algoritm %1-TCP în mod amestecat - - - + Maximum number of half-open connections [0: Unlimited] Număr maxim de conexiuni semi-deschise [0: Nelimitate] - + IP Address to report to trackers (requires restart) Adresa IP de raportat urmăritoarelor (necesită repornire) - + Enable embedded tracker Activează urmăritorul încorporat - + Embedded tracker port Port urmăritor încorporat - + Check for software updates Verifică dacă sunt actualizări program - + Use system icon theme Utilizează tema de sistem pentru pictograme @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 a pornit - + Torrent: %1, running external program, command: %2 Torent: %1, se rulează programul extern, comanda: %2 - - Torrent name: %1 - - - - - Torrent size: %1 - - - - - Save path: %1 - - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - - - - - Thank you for using qBittorrent. - Vă mulțumim că folosiți qBittorrent. - - - - [qBittorrent] '%1' has finished downloading - + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torent: %1, comanda ruleaza program extern este prea lungă (lungime > %2), execuția a eșuat. - + Torrent: %1, sending mail notification Torent: %1, se trimite notificare prin email - + Information Informație - - To control qBittorrent, access the Web UI at %1 - + + To control qBittorrent, access the Web UI at http://localhost:%1 + Pentru a controla qBittorrent, accesați interfața Web la http://localhost:%1 - + The Web UI administrator user name is: %1 Numele de administrator al interfeței Web este: %1 - + The Web UI administrator password is still the default one: %1 Parola de administrator al interfeței Web este încă cea implicită: %1 - + This is a security risk, please consider changing your password from program preferences. Acesta est un risc de securitate, vă rugăm să luați în calcul schimbarea parolei din preferințe. - + Saving torrent progress... Se salvează progresul torentelor... - - - Portable mode and explicit profile directory options are mutually exclusive - - - - - Portable mode implies relative fastresume - - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Salvează în: @@ -861,836 +658,696 @@ Descărcător RSS - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - + + Enable Automated RSS Downloader + Activează descărcătorul RSS automat - + Download Rules Reguli de descărcare - + Rule Definition Definiție regulă - + Use Regular Expressions - Folosește expresii regulate - - - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - + Folosește expresii regulare - + Must Contain: Trebuie să conțină: - + Must Not Contain: Nu trebuie să conțină: - + Episode Filter: Filtru episod: - + Assign Category: Atribuire categorie: - + Save to a Different Directory Salvează într-un director diferit - + Ignore Subsequent Matches for (0 to Disable) ... X days Ignoră potrivirile următoare pentru (0 pentru dezactivare) - + Disabled - Dezactivat + Dezactivat - + days zile - + Add Paused: Adaugă suspendate: - + Use global settings Utilizează configurările globale - + Always Întotdeauna - + Never Niciodată - + Apply Rule to Feeds: Aplicare regulă la fluxurile: - + Matching RSS Articles Articole RSS care se potrivesc - + &Import... &Importare... - + &Export... &Exportare... - + Matches articles based on episode filter. Articole care se potrivesc bazate pe filtrul episod. - + Example: Exemple: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match va potrivi 2, 5, 8 din 15, 30 și episoadele ulterioare al sezonului unu - + Episode filter rules: Reguli filtru episod: - + Season number is a mandatory non-zero value Numărul sezonului este obligatoriu nu o valoare zero - + Episode number is a mandatory non-zero value + Numărul episodului este obligatoriu nu o valoare zero + + + Filter must end with semicolon Filtrul trebuie să se termine cu punct și virgulă - + Three range types for episodes are supported: - Sunt sprijinite trei tipuri de intervale pentru episoade: + Sunt suportate trei tipuri de gamă pentru episoade: - + Single number: <b>1x25;</b> matches episode 25 of season one Un singur număr: <b>1x25;</b> se potrivește cu episodul 25 al sezonului unu - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Gamă normală: <b>1x25-40;</b> se potrivește cu episoadele de la 25 la 40 ale sezonului unu - - Episode number is a mandatory positive value - Numărul episodului este o valoare pozitivă obligatorie - - - - Rules - Reguli + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Gamă infinită: <b>1x25-;</b> se potrivește cu episoadele 25 și următoarele pentru sezonul unu - - Rules (legacy) - Reguli (moștenire) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Interval infinit: <b>1x25-;</b> nimerește episoadele 25 și mai sus ale sezonului unu, și toate episoadele sezoanelor ulterioare + - + Last Match: %1 days ago Ultima potrivire: acum %1 zile - + Last Match: Unknown Ultima potrivire: necunoscută - + New rule name Nume regulă nouă - + Please type the name of the new download rule. Introduceți numele noii reguli de descărcare. - - + + Rule name conflict Conflict nume regulă - - + + A rule with this name already exists, please choose another name. O regulă cu acest nume există deja, alegeți alt nume. - + Are you sure you want to remove the download rule named '%1'? Sigur doriți să eliminați regula de descărcare numită „%1”? - + Are you sure you want to remove the selected download rules? Sigur doriți să eliminați regulile de descărcare selectate? - + Rule deletion confirmation Confirmare ștergere regulă - + Destination directory Director destinație - + Invalid action - acțiune nevalidă + Acțiune nevalidă - + The list is empty, there is nothing to export. - + Lista este goală, nu este nimic de exportat. - - Export RSS rules - + + Where would you like to save the list? + Unde doriți să salvați lista? - - + + Rules list (*.rssrules) + Listă de reguli (*.rssrules) + + + I/O Error Eroare Intrare/Ieșire - - Failed to create the destination file. Reason: %1 - + + Failed to create the destination file + A eșuat crearea fișierului destinație - - Import RSS rules - + + Please point to the RSS download rules file + Indicați locația fișierului cu regulile de descărcare RSS - - Failed to open the file. Reason: %1 - + + Rules list + Listă reguli - + Import Error - + Eroare importare - - Failed to import the selected rules file. Reason: %1 - + + Failed to import the selected rules file + A eșuat importarea fișierului de reguli selectat - + Add new rule... Adăugare regulă nouă... - + Delete rule Șterge regula - + Rename rule... Redenumire regulă... - + Delete selected rules Șterge regulile selectate - - Clear downloaded episodes... - - - - + Rule renaming Redenumire regulă - + Please type the new rule name Introduceți noul nume al regulii - - Clear downloaded episodes - - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - Mod expresii regulate: Folosește expresii regulate compatibile cu limbajul Perl + + Regex mode: use Perl-like regular expressions + Mod regex: utilizează expresii regulare similare Perl - - - Position %1: %2 - Poziția %1: %2 - - - + Wildcard mode: you can use - Mod metacaractere: le puteți utiliza + - + ? to match any single character - ? pentru a nimeri oricare un singur caracter + - + * to match zero or more of any characters - * pentru a nimeri zero sau mai multe caractere + - + Whitespaces count as AND operators (all words, any order) - Spațiile albe (goale) se consideră operatori ȘI (toate cuvintele, în oricare ordine) + - + | is used as OR operator - | este folosit ca operator SAU + - + If word order is important use * instead of whitespace. - Dacă ordinea cuvintelor este importantă utilizați * în loc de spațiu alb (gol). + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - O expresie cu o clauză %1 goală (de ex: %2) - - - - will match all articles. - va nimeri toate articolele. - - - - will exclude all articles. - va exclude toate articolele. - - - - BanListOptionsDialog - - - List of banned IP addresses - - Ban IP + + will match all articles. - - Delete - Șterge - - - - - Warning + + will exclude all articles. - - The entered IP address is invalid. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Mod metacaracter: puteți utiliza<ul><li>? pentru a potrivi oricare caracter</li><li>* pentru a potrivi zero sau mai multe caractere</li><li>Spațiile albe se socotesc ca și operatori ȘI</li></ul> - - The entered IP is already banned. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Mod metacaracter: puteți utiliza<ul><li>? pentru a potrivi oricare caracter</li><li>* pentru a potrivi zero mai multe caractere</li><li>| este utilizat ca și operator SAU</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support - Repornirea este necesară pentru comutarea sprijinului PeX - - - - Could not get GUID of configured network interface. Binding to IP %1 - + Repornirea este necesară pentru comutarea suportului PeX - + Embedded Tracker [ON] Urmăritor încorporat [PORNIT] - + Failed to start the embedded tracker! A eșuat pornirea urmăritorului încorporat! - + Embedded Tracker [OFF] Urmăritor încorporat [OPRIT] - + + '%1' reached the maximum ratio you set. Removing... + „%1” a atins raportul de partajare maxim pe care l-ați stabilit. Se elimină... + + + + '%1' reached the maximum ratio you set. Pausing... + „%1” a atins raportul de partajare maxim pe care l-ați stabilit. Se suspendă... + + + System network status changed to %1 e.g: System network status changed to ONLINE Starea rețelei sistemului s-a schimbat la %1 - + ONLINE CONECTAT - + OFFLINE DECONECTAT - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding Configurația rețelei %1 a fost schimbată, se reîmprospătează asocierea sesiunii - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. Adresa interfeței de rețea configurate %1 nu este validă. - - + Encryption support [%1] - Sprijinire criptare [%1] + - - + FORCED - FORȚATĂ - - - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 nu este o adresă IP validă și a fost respinsă în timp ce se aplica lista de adrese blocate. + - - + Anonymous mode [%1] - Mod anonim [%1] + - + Unable to decode '%1' torrent file. Nu s-a putut decoda fișierul torrent „%1”. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Descărcare recursivă a fișierului „%1” încorporat în torrentul „%2” - + Queue positions were corrected in %1 resume files - Pozițiile de la coadă au fost corectate în %1 fișiere de reluare + - + Couldn't save '%1.torrent' Nu s-a putut salva „%1.torrent” - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - - - - + because %1 is disabled. this peer was blocked because uTP is disabled. fiindcă %1 este dezactivat. - + because %1 is disabled. this peer was blocked because TCP is disabled. fiindcă %1 este dezactivat. - + URL seed lookup failed for URL: '%1', message: %2 Rezolvarea adresei sursei a eșuat pentru URL-ul: „%1”, mesaj: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent a eșuat în ascultarea interfeței %1 portul: %2/%3. Motivul: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + „%1” a fost înlăturat din lista de transferuri și de pe disc. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + „%1” a fost eliminat din lista de transferuri. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Se descarcă „%1”, așteptați... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent încearcă să asculte pe oricare port de interfață: %1 - + The network interface defined is invalid: %1 Interfața de rețea definită nu este validă: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent încearcă să asculte pe interfața %1 portul: %2 - - Peer ID: - - - - - HTTP User-Agent is '%1' - - - - - + DHT support [%1] - Sprijinire DHT [%1] - - - - - - - - - - - - ON - PORNIT - - - - - - - - - - - - OFF - OPRIT - - - - - Local Peer Discovery support [%1] - Sprijinire descoperire parteneri locali [%1] - - - - PeX support [%1] - - - - - '%1' reached the maximum ratio you set. Removed. - - '%1' reached the maximum ratio you set. Paused. + + + + + ON - - '%1' reached the maximum seeding time you set. Removed. + + + + + OFF - - '%1' reached the maximum seeding time you set. Paused. + + Local Peer Discovery support [%1] - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent nu a găsit o adresă locală %1 pe care să asculte - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent nu a putut asculta pe niciun port al interfeței: %1. Motivul: %2. - + Tracker '%1' was added to torrent '%2' Urmăritorul „%1” a fost adăugat torrentului „%2” - + Tracker '%1' was deleted from torrent '%2' Urmăritorul „%1” a fost șters de la torrentul „%2” - + URL seed '%1' was added to torrent '%2' Sursa URL „%1” a fost adăugată torrentului „%2” - + URL seed '%1' was removed from torrent '%2' Sursa URL „%1” a fost ștearsă de la torrentul „%2” - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Nu se poate relua descărcarea torrent: „%1” - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number S-a analizat cu succes filtrul IP furnizat: %1 reguli au fost aplicate. - + Error: Failed to parse the provided IP filter. Eroare: Eșec în analiza filtrului IP furnizat. - - '%1' restored. - 'torrent name' restored. - - - - + Couldn't add torrent. Reason: %1 Nu s-a putut adăuga torrentul. Motivul: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + „%1” reluat. (reluare rapidă) + + + '%1' added to download list. 'torrent name' was added to download list. „%1” a fost adăugat în lista de descărcare. - + An I/O error occurred, '%1' paused. %2 A apărut o eroare de Intrare/Ieșire, „%1” suspendat. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Eșec în maparea portului, mesaj: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Maparea portului încheiată cu succes, mesaj: %1 - + due to IP filter. this peer was blocked due to ip filter. datorită filtrării IP. - + due to port filter. this peer was blocked due to port filter. datorită filtrării portului. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. datorită restricțiilor modului mixt i2p. - + because it has a low port. this peer was blocked because it has a low port. fiindcă are un port mic. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent ascultă cu succes pe interfața %1 portul: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 IP extern: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + Nu s-a putut muta torrentul: „%1”. Motivul: %2 - + File sizes mismatch for torrent '%1', pausing it. - + Nepotrivire dimensiuni fișiere pentru torrentul „%1”, se suspendă. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - + Datele pentru reluare rapidă au fost respinse pentru torrentul „%1”. Motivul %2. Se verifică din nou... CategoryFilterModel - + Categories - Categorii + Categorii - + All - Toate + Toate - + Uncategorized - Necategorisite + @@ -1698,42 +1355,147 @@ Add category... - Adăugare categorie... + Adăugare categorie... Add subcategory... - Adăugare subcategorie... + - Edit category... - Editare categorie... + Remove category + Elimină categoria + + + + Remove unused categories + Elimină categoriile neutilizate + + + + Resume torrents + Reia torrentele + + + + Pause torrents + Suspendă torrentele + + + + Delete torrents + Șterge torrentele + + + + New Category + Categorie nouă + + + + Category: + Categorie: + + + + Invalid category name + Nume categorie nevalid + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Numele categoriei nu trebuie să conțină „\”. +Numele categoriei nu trebuie să înceapă/încheie cu „/”. +Numele categoriei nu trebuie să conțină secvența „//”. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Toate (0) + + + Uncategorized (0) + Necategorisite (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Necategorisite (%1) + + + Add category... + Adăugare categorie... - Remove category - Elimină categoria + Elimină categoria - Remove unused categories - Elimină categoriile neutilizate + Elimină categoriile neutilizate - Resume torrents - Reia torentele + Reia torrentele - Pause torrents - Suspendă torentele + Suspendă torrentele - Delete torrents - Șterge torentele + Șterge torrentele + + + New Category + Categorie nouă + + + Category: + Categorie: + + + Invalid category name + Nume categorie nevalid + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Numele categoriei nu trebuie să conțină „\”. +Numele categoriei nu trebuie să înceapă/încheie cu „/”. +Numele categoriei nu trebuie să conțină secvența „//”. + + + All (%1) + this is for the category filter + Toate (%1) @@ -1773,616 +1535,574 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Confirmare ștergere - + DeletionConfirmationDlg - - Remember choice - - - - - Also delete the files on the hard disk - - - - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Sigur doriți să ștergeți „%1” din lista de transferuri? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - - - - - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - Descarcă - - - - No URL entered - - - - - Please type at least one URL. - + Sigur doriți să ștergeți aceste %1 torrente din lista de transferuri? DownloadedPiecesBar - + White: Missing pieces Alb: Bucăți lipsă - + Green: Partial pieces Verde: Bucăți parțiale - + Blue: Completed pieces Albastru: Bucăți gata - ExecutionLogWidget + ExecutionLog - + General - General + General - + Blocked IPs - + IP-uri blocate - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> a fost blocat %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - + <font color='red'>%1</font> a fost interzis FeedListWidget - + RSS feeds Fluxuri RSS - - - Unread (%1) - Necitite (%1) + + Unread + Necitite FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - + + An error occured while trying to open the log file. Logging to file is disabled. + A apătut o eroare în timpul deschiderii fișierului jurnal. Jurnalizarea în fișier este dezactivată. - FileSystemPathEdit + FilterParserThread - - ... - Launch file dialog button text (brief) - + + + + I/O Error: Could not open ip filter file in read mode. + Eroare Intrare/Ieșire: Nu se poate deschide fișierul de filtrare IP în modul „doar citire.” - - &Browse... - Launch file dialog button text (full) - + + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. + Eroare de analiză: Fișierul filtru nu este un fișier PeerGuardian P2B valid. + + + GeoIPDatabase - - Choose a file - Caption for file open/save dialog - + + + Unsupported database file size. + Mărime fișier bază de date nevalid. - - Choose a folder - Caption for directory open dialog - + + Metadata error: '%1' entry not found. + Eroare metadate: nu s-a găsit intrarea „%1”. - - Any file - + + Metadata error: '%1' entry has invalid type. + Eroare metadate: intrarea „%1” nu are un tip valid. - - - FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - + + Unsupported database version: %1.%2 + Versiunea bazei de date este nevalidă: %1.%2 - - - - IP filter line %1 is malformed. - + + Unsupported IP version: %1 + Versiune de IP nevalidă. %1 - - - IP filter line %1 is malformed. Start IP of the range is malformed. - - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - - - - - - IP filter exception thrown for line %1. Exception is: %2 - - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - - - - - - - - - - - Parsing Error: The filter file is not a valid PeerGuardian P2B file. - Eroare de analiză: Fișierul filtru nu este un fișier PeerGuardian P2B valid. - - - - GeoIPDatabase - - - - Unsupported database file size. - Mărime fișier bază de date nesprijinită. - - - - Metadata error: '%1' entry not found. - Eroare metadate: nu s-a găsit intrarea „%1”. - - - - Metadata error: '%1' entry has invalid type. - Eroare metadate: intrarea „%1” nu are un tip valid. - - - - Unsupported database version: %1.%2 - Versiunea bazei de date este nesprijinită: %1.%2 - - - - Unsupported IP version: %1 - Versiune IP (protocol internet) nesprijinită. %1 - - - + Unsupported record size: %1 - Mărime înregistrare nesprijinită: %1 + Mărime înregistrare nevalidă: %1 - + Invalid database type: %1 Tipul bazei de date este nevalid: %1 - + Database corrupted: no data section found. Baza de date este deteriorată: Nu s-a găsit nicio secțiune de date. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - + + File + Fișier - - Bad Http request, closing socket. IP: %s - + + Edit + Editare - - - HttpServer - + + Help + Ajutor + + + Exit qBittorrent Închide qBittorrent - + Only one link per line Doar o legătură per linie - + + Download + Descarcă + + + Global upload rate limit must be greater than 0 or disabled. Limita ratei de încărcare globală trebuie să fie mai mare ca 0 sau dezactivată. - + Global download rate limit must be greater than 0 or disabled. Limita ratei de descărcare globală trebuie să fie mai mare ca 0 sau dezactivată. - + Alternative upload rate limit must be greater than 0 or disabled. Limita ratei de încărcare alternativă trebuie să fie mai mare ca 0 sau dezactivată. - + Alternative download rate limit must be greater than 0 or disabled. Limita ratei de descărcare alternative trebuie să fie mai mare ca 0 sau dezactivată. - + Maximum active downloads must be greater than -1. Numărul maxim de descărcări active trebuie să fie mai mare decât -1. - + Maximum active uploads must be greater than -1. Numărul maxim de încărcări active trebuie să fie mai mare decât -1. - + Maximum active torrents must be greater than -1. Numărul maxim de torrente active trebuie să fie mai mare decât -1. - + Maximum number of connections limit must be greater than 0 or disabled. Limita maximă a numărului de conexiuni trebuie să fie mai mare ca 0 sau dezactivată. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Limita maximă a numărului de conexiuni pe torrent trebuie să fie mai mare ca 0 sau dezactivată. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Numărul maxim de sloturi de încărcare pe torrent trebuie să fie mai mare ca 0 sau dezactivat. - + Unable to save program preferences, qBittorrent is probably unreachable. Nu se pot salva preferințele programului, probabil qBittorrent nu poate fi contactat. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent pe Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - - - - - Unknown - Necunoscut - - - - Hard Disk - Disc tare - - - - Share ratio limit must be between 0 and 9998. - Limita raportului de partajare trebuie să fie între 0 și 9998. - - - - Seeding time limit must be between 0 and 525600 minutes. - + + Language + Limbă - + The port used for incoming connections must be between 1 and 65535. Portul folosit pentru conexiunile de intrare trebuie să fie între 1 și 65535. - + The port used for the Web UI must be between 1 and 65535. Portul folosit pentru interfața Web trebuie să fie între 1 și 65535. - + Unable to log in, qBittorrent is probably unreachable. Nu se poate autentifica, probabil qBittorrent nu poate fi contactat. - + Invalid Username or Password. Numele de utilizator sau parola nu sunt valide. - - Username - Nume de utilizator - - - + Password Parolă - + Login Autentifică - + + Upload Failed! + Încărcarea a eșuat! + + + Original authors Autori originali - + + Upload limit: + Limită de încărcare: + + + + Download limit: + Limită de descărcare: + + + Apply Aplică - + Add Adaugă - + + Category: + Categorie: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Încărcare torente - + + All + Toate + + + + Downloading + Se descarcă + + + + Seeding + Se contribuie + + + + Completed + Finalizate + + + + Resumed + Reluate + + + + Paused + Suspendate + + + + Active + Active + + + + Inactive + Inactive + + + Save files to location: Salvează fișierele în locația: - + Cookie: Fișier cookie: - + Type folder here Introduceți dosarul aici - + + Run an external program on torrent completion + Rulează un program extern la încheierea torrentului + + + + Enable bandwidth management (uTP) + Activează administrarea lățimii de bandă (uTP) + + + + Apply rate limit to uTP connections + Aplică limitarea ratei la conexiunile uTP + + + + Alternative Global Rate Limits + Limite de viteză alternative + + + More information Mai multe informații - + Information about certificates Informații despre certificate - + Save Files to Salvează fișierele în - - Set location - Stabilire locație - - - - Limit upload rate - + + Watch Folder + Urmărește dosarul - - Limit download rate - + + Default Folder + Dosar implicit - - Rename torrent - + + from + from time1 to time2 + de la - - Unable to create category - + + to + from time1 to time2 + până la - + Other... Save Files to: Watch Folder / Default Folder / Other... Altul... - + + Every day + Schedule the use of alternative rate limits on ... + Zilnic + + + + Week days + Schedule the use of alternative rate limits on ... + Zile lucrătoare + + + + Week ends + Schedule the use of alternative rate limits on ... + Zile nelucrătoare + + + Monday Schedule the use of alternative rate limits on ... Luni - + Tuesday Schedule the use of alternative rate limits on ... Marți - + Wednesday Schedule the use of alternative rate limits on ... Miercuri - + Thursday Schedule the use of alternative rate limits on ... Joi - + Friday Schedule the use of alternative rate limits on ... Vineri - + Saturday Schedule the use of alternative rate limits on ... Sâmbătă - + Sunday Schedule the use of alternative rate limits on ... Duminică - + + Downloaded + Is the file downloaded or not? + Descărcat + + + Logout Deautentifică - + + Download from URLs + Descarcă de la adrese URL + + + Download Torrents from their URLs or Magnet links Descarcă torrente de la adrese URL sau legături magnet - + Upload local torrent Încărcare torrent local - + Are you sure you want to delete the selected torrents from the transfer list? Sigur doriți să ștergeți torrentele selectate din lista de transferuri? - + Save Salvează - + qBittorrent client is not reachable Clientul qBittorrent nu poate fi contactat - - qBittorrent has been shutdown. - qBittorrent a fost închis. + + HTTP Server + Servitor HTTP - - - IPSubnetWhitelistOptionsDialog - - List of whitelisted IP subnets - - - - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - + + The following parameters are supported: + Parametrii următori sunt suportați: - - Add subnet - + + Torrent path + Cale torrent - - Delete - Șterge + + Torrent name + Nume torrent - - Error - Eroare + + qBittorrent has been shutdown. + qBittorrent a fost închis. + + + LineEdit - - The entered subnet is invalid. - + + Clear the text + Curăță textul LogListWidget - + Copy Copiază - + Clear Curăță @@ -2415,551 +2135,493 @@ Când descărcările sunt &gata - + &View &Vizualizare - + &Options... &Opțiuni... - + &Resume &Reluare - + Torrent &Creator &Creator torrent - + Set Upload Limit... Stabilire limită de încărcare... - + Set Download Limit... Stabilire limită de descărcare... - + Set Global Download Limit... Stabilire limită de descărcare globală... - + Set Global Upload Limit... Stabilire limită de încărcare globală... - + Minimum Priority Prioritate minimă - + Top Priority Prioritate maximă - + Decrease Priority Scade prioritatea - + Increase Priority Crește prioritatea - - + + Alternative Speed Limits Limite de viteză alternative - + &Top Toolbar &Bara de unelte superioară - + Display Top Toolbar Afișează bara superioară de unelte - - Status &Bar - &Bara de stare - - - + S&peed in Title Bar &Viteza în bara de titlu - + Show Transfer Speed in Title Bar Arată viteza de transfer în bara de titlu - + &RSS Reader Cititor &RSS - + Search &Engine &Motor de căutare - + L&ock qBittorrent Bl&ocare qBittorrent - + Do&nate! Do&nați! - - Close Window - Închide fereastra - - - + R&esume All Reia &toate - + Manage Cookies... Administrează cookie-urile... - + Manage stored network cookies Administrează cookie-urile rețelelor salvate - + Normal Messages Mesaje normale - + Information Messages Mesaje informații - + Warning Messages Mesaje avertizări - + Critical Messages Mesaje critice - + &Log &Jurnal - + &Exit qBittorrent Î&nchide qBittorrent - + &Suspend System &Suspendă sistemul - + &Hibernate System &Hibernează sistemul - + S&hutdown System &Oprește sistemul - + &Disabled &Dezactivat - + &Statistics &Statistici - + Check for Updates Verifică pentru actualizări - + Check for Program Updates Verifică pentru actualizări program - + &About &Despre - + &Pause &Suspendare - + &Delete Ș&terge - + P&ause All Suspendă to&ate - + &Add Torrent File... &Adăugare fișier torrent... - + Open Deschide - + E&xit Î&nchide programul - + Open URL Deschide URL - + &Documentation &Documentație - + Lock Blochează - - - + + + Show Arată - + Check for program updates Verifică pentru actualizări program - + Add Torrent &Link... Adăugare &legătură torrent... - + If you like qBittorrent, please donate! Dacă vă place qBittorrent, vă rugăm să donați! - - + Execution Log Jurnal de execuție - + Clear the password Eliminare parolă - + Filter torrent list... Filtrare listă de torrente... - + &Set Password &Stabilire parolă - - Preferences - Preferințe - - - + &Clear Password &Eliminare parolă - + Transfers Transferuri - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Asociere fișiere torrent - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent nu este aplicația implicită pentru deschiderea fișierelor torrent sau a legăturilor magnet. Doriți să asociați qBittorrent cu fișierele torrent și legăturile magnet? - + Icons Only Doar pictograme - + Text Only Doar text - + Text Alongside Icons Text alături de pictograme - + Text Under Icons Text sub pictograme - + Follow System Style Utilizează stilul sistemului - - - + + + UI lock password Parolă de blocare interfață - - - + + + Please type the UI lock password: Introduceți parola pentru blocarea interfeței: - + The password should contain at least 3 characters Parola ar trebui să aibă cel puțin 3 caractere - + Password update Actualizare parolă - + The UI lock password has been successfully updated Parola pentru blocarea interfeței a fost actualizată cu succes - + Are you sure you want to clear the password? Sigur doriți să eliminați parola? - - Use regular expressions - - - - + Search Căutare - + Transfers (%1) Transferuri (%1) - + Error Eroare - + Failed to add torrent: %1 Eșec la adăugarea torrentului: %1 - + Torrent added Fișier torent adăugat - + '%1' was added. e.g: xxx.avi was added. „%1” a fost adăugat. - + Download completion Descărcare finalizată - + I/O Error i.e: Input/Output Error Eroare Intrare/Ieșire - + Recursive download confirmation Confirmare descărcare recursivă - + Yes Da - + No Nu - + Never Niciodată - + Global Upload Speed Limit Limită viteză de încărcare globală - + Global Download Speed Limit Limită viteză de descărare globală - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent tocmai a fost actualizat și trebuie să fie repornit pentru ca schimbările să intre în vigoare. - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - - - - - Are you sure you want to quit qBittorrent? - Sigur doriți să închideți qBittorrent? - - - + &No &Nu - + &Yes &Da - + &Always Yes Î&ntotdeauna Da - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter Interpretor Python vechi - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. Versiunea dumneavoastră de Python (%1) este învechită. Actualizați la ultima versiune pentru ca motoarele de căutare să funcționeze. Cerințe minime: 2.7.9 / 3.3.0. - + qBittorrent Update Available Este disponibilă o actualizare pentru qBittorrent - + + A new version is available. +Do you want to download %1? + Este disponibilă o nouă versiune. +Doriți să descărcați versiunea %1? + + + Already Using the Latest qBittorrent Version Folosiți deja ultima versiune qBittorrent - + Undetermined Python version Versiune Python nedeterminată - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. „%1” s-a descărcat. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2968,158 +2630,154 @@ Motivul: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? Torentul „%1” conține fișiere torrent, doriți să continuați cu descărcarea lor? - + Couldn't download file at URL '%1', reason: %2. Nu s-a putut descărca fișierul la URL-ul: „%1”, motivul: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin Python găsit în %1: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + Nu s-a putut determina versiunea Python (%1). Motoarele de căutare au fost dezactivate. + + + + Missing Python Interpreter Interpretorul Python lipsește - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Python este necesar pentru a putea folosi motorul de căutare, dar nu pare a fi instalat. Doriți să îl instalați acum? - + Python is required to use the search engine but it does not seem to be installed. Python este necesar pentru a putea folosi motorul de căutare, dar nu pare a fi instalat. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. Nu sunt disponibile actualizări. Utilizați deja ultima versiune. - + &Check for Updates &Verifică dacă sunt actualizări - + Checking for Updates... Se verifică dacă sunt actualizări... - + Already checking for program updates in the background Se caută deja actualizări de program în fundal - + Python found in '%1' Python găsit în „%1” - + Download error Eroare la descărcare - + Python setup could not be downloaded, reason: %1. Please install it manually. Programul de instalare Python nu a putut fi descărcat, motivul: %1. Instalați-l manual. - - + + Invalid password Parolă nevalidă - - - + + RSS (%1) RSS (%1) - + URL download error Eroarea la descărcarea URL - + The password is invalid Parola nu este validă - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Viteză descărcare: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Viteză încărcare: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [D: %1/s, Î: %2/s] qBittorrent %3 - + Hide Ascunde - + Exiting qBittorrent Închidere qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Unele fișiere sunt în curs de transfer. +Sigur doriți să închideți qBittorrent? + + + Open Torrent Files Deschide fișiere torrent - + Torrent Files Fișiere torrent - + Options were saved successfully. Opțiunile au fost salvate cu succes. @@ -3127,52 +2785,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. DNS-ul dinamic a fost actualizat cu succes. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Eroare DNS dinamic: Serviciul este temporar indisponibil, va fi reâncercat în 30 de minute. - + Dynamic DNS error: hostname supplied does not exist under specified account. Eroare DNS dinamic: numele gazdă furnizat nu există în contul specificat. - + Dynamic DNS error: Invalid username/password. Eroare DNS dinamic: Parolă/nume utilizator nevalid(ă). - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Eroare DNS dinamic: qBittorrent a fost interzis de serviciu; raportați problema la http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Eroare DNS dinamic: valoarea %1 a fost întoarsă de către serviciu, raportați problema la http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Eroare DNS dinamic: Numele dumneavoastră de utilizator a fost blocat datorită abuzului. - + Dynamic DNS error: supplied domain name is invalid. Eroare DNS dinamic: numele de domeniu furnizat este nevalid. - + Dynamic DNS error: supplied username is too short. Eroare DNS dinamic: numele de utilizator furnizat este prea scurt. - + Dynamic DNS error: supplied password is too short. Eroare DNS dinamic: parola furnizată este prea scurtă. @@ -3180,1413 +2838,1303 @@ Net::DownloadHandler - + I/O Error Eroare Intrare/Ieșire - + The file size is %1. It exceeds the download limit of %2. Mărimea fișierului este %1. Ea depășește limita de %2. - + Unexpected redirect to magnet URI. Redirecționare neașteptată la URI-ul magnet. - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. Baza de date GeoIP încărcată. Tipul: %1. Data construirii: %2. - - + + Couldn't load GeoIP database. Reason: %1 Nu s-a putut încărca baza de date GeoIP. Motivul: %1 - + Venezuela, Bolivarian Republic of Venezuela - + Viet Nam Vietnam - - + + N/A Indisponibil - + Andorra Andorra - + United Arab Emirates Emiratele Arabe Unite - + Afghanistan Afganistan - + Antigua and Barbuda Antigua și Barbuda - + Anguilla Anguilla - + Albania Albania - + Armenia Armenia - + Angola Angola - + Antarctica Antarctica - + Argentina Argentina - + American Samoa Samoa Americană - + Austria Austria - + Australia Australia - + Aruba Aruba - + Azerbaijan Azerbaidjan - + Bosnia and Herzegovina Bosnia și Herțegovina - + Barbados Barbados - + Bangladesh Bangladeș - + Belgium Belgia - + Burkina Faso Burkina Faso - + Bulgaria Bulgaria - + Bahrain Bahrain - + Burundi Burundi - + Benin Benin - + Bermuda Insulele Bermude - + Brunei Darussalam Brunei - + Brazil Brazilia - + Bahamas Bahamas - + Bhutan Bhutan - + Bouvet Island Insula Bouvet - + Botswana Botswana - + Belarus Belarus - + Belize Belize - + Canada Canada - + Cocos (Keeling) Islands Insulele Cocos (Keeling) - + Congo, The Democratic Republic of the Congo, Republica Democrată - + Central African Republic Republica Central Africană - + Congo Congo - + Switzerland Elveția - + Cook Islands Insulele Cook - + Chile Chile - + Cameroon Camerun - + China China - + Colombia Columbia - + Costa Rica Costa Rica - + Cuba Cuba - + Cape Verde Insulele Capului Verde - + Curacao Curaçao - + Christmas Island Insula Crăciunului - + Cyprus Cipru - + Czech Republic Cehia - + Germany Germania - + Djibouti Djibouti - + Denmark Danemarca - + Dominica Dominica - + Dominican Republic Republica Dominicană - + Algeria Algeria - + Ecuador Ecuador - + Estonia Estonia - + Egypt Egipt - + Western Sahara - Sahara de Vest + Sahara de vest - + Eritrea Eritreea - + Spain Spania - + Ethiopia Etiopia - + Finland Finlanda - + Fiji Fiji - + Falkland Islands (Malvinas) Insulele Falkland (Malvine) - + Micronesia, Federated States of Statele Federale ale Micronesiei - + Faroe Islands Insulele Feroe - + France Franța - + Gabon Gabon - + United Kingdom Regatul Unit - + Grenada Grenada - + Georgia Georgia - + French Guiana Guiana Franceză - + Ghana Ghana - + Gibraltar Gibraltar - + Greenland Groenlanda - + Gambia Gambia - + Guinea Guinea - + Guadeloupe Guadalupe - + Equatorial Guinea Guineea Ecuatorială - + Greece Grecia - + South Georgia and the South Sandwich Islands Georgia de Sud și Insulele Sandwich de Sud - + Guatemala Guatemala - + Guam Guam - + Guinea-Bissau Guineea-Bissau - + Guyana Guyana - + Hong Kong Hong Kong - + Heard Island and McDonald Islands Insula Heard și Insulele McDonald - + Honduras Honduras - + Croatia Croația - + Haiti Haiti - + Hungary Ungaria - + Indonesia Indonezia - + Ireland Irlanda - + Israel Israel - + India India - + British Indian Ocean Territory Teritoriul Oceanului Indian Britanic - + Iraq Irac - + Iran, Islamic Republic of Iran - + Iceland Islanda - + Italy Italia - + Jamaica Jamaica - + Jordan Iordania - + Japan Japonia - + Kenya Kenya - + Kyrgyzstan Kârgâzstan - + Cambodia Cambogia - + Kiribati Kiribati - + Comoros Insulele Comore - + Saint Kitts and Nevis Sfântul Cristofor și Nevis - + Korea, Democratic People's Republic of Republica Populară Democrată Coreeană - + Korea, Republic of Republica Coreea - + Kuwait Kuweit - + Cayman Islands Insulele Cayman - + Kazakhstan Kazahstan - + Lao People's Democratic Republic Republica Populară Democrată Laos - + Lebanon Liban - + Saint Lucia Sfânta Lucia - + Liechtenstein Liechtenstein - + Sri Lanka Sri Lanka - + Liberia Liberia - + Lesotho Lesotho - + Lithuania Lituania - + Luxembourg Luxemburg - + Latvia Letonia - + Morocco Maroc - + Monaco Monaco - + Moldova, Republic of Republica Moldova - + Madagascar Madagascar - + Marshall Islands Insulele Marshall - + Mali Mali - + Myanmar Birmania - + Mongolia Mongolia - + Northern Mariana Islands Comunitatea Insulelor Mariane de Nord - + Martinique Martinica - + Mauritania Mauritania - + Montserrat Montserrat - + Malta Malta - + Mauritius Republica Mauritius - + Maldives Insulele Maldive - + Malawi Republica Malawi - + Mexico Mexic - + Malaysia Malaezia - + Mozambique Mozambic - + Namibia Namibia - + New Caledonia Noua Caledonie - + Niger Nigeria - + Norfolk Island Insula Norfolk - + Nigeria Nigeria - + Nicaragua Nicaragua - + Netherlands Olanda - + Norway Norvegia - + Nepal Nepal - + Nauru Nauru - + Niue Niue - + New Zealand Noua Zeelandă - + Oman Oman - + Panama Panama - + Peru Peru - + French Polynesia Polinezia Franceză - + Papua New Guinea Papua Noua Guinee - + Philippines Filipine - + Pakistan Pakistan - + Poland Polonia - + Saint Pierre and Miquelon Saint Pierre și Miquelon - + Puerto Rico Puerto Rico - + Portugal Portugalia - + Palau Palau - + Paraguay Paraguai - + Qatar Qatar - + Reunion Reunion - + Romania România - + Russian Federation Rusia - + Rwanda Ruanda - + Saudi Arabia Arabia Saudită - + Solomon Islands Insulele Solomon - + Seychelles Seișele - + Sudan Sudan - + Sweden Suedia - + Singapore Singapore - + Slovenia Slovenia - + Svalbard and Jan Mayen Svalbard și Jan Mayen - + Slovakia Slovacia - + Sierra Leone Sierra Leone - + San Marino San Marino - + Senegal Senegal - + Somalia Somalia - + Suriname Surinam - + Sao Tome and Principe São Tomé și Príncipe - + El Salvador El Salvador - + Syrian Arab Republic Siria - + Swaziland Elveția - + Turks and Caicos Islands Insulele Turks și Caicos - + Chad Republica Ciad - + French Southern Territories Teritoriile Sudice Franceze - + Togo Togo - + Thailand Tailanda - + Tajikistan Tadjikistan - + Tokelau Tokelau - + Turkmenistan Turkmenistan - + Tunisia Tunisia - + Tonga Tonga - - Could not decompress GeoIP database file. - Nu s-a putut decomprima fișierul cu baza de date geografică GeoIP. - - - + Timor-Leste Timor-Leste - + Bolivia, Plurinational State of Bolivia - + Bonaire, Sint Eustatius and Saba Insulele Bonaire, Sfântul Eustachio și Saba - + Cote d'Ivoire Coasta de Fildeș - + Libya Libia - + Saint Martin (French part) Sfântul Martin (partea franceză) - + Macedonia, The Former Yugoslav Republic of Macedonia - + Macao Macao - + Pitcairn Insulele Pitcairn - + Palestine, State of Palestina - + Saint Helena, Ascension and Tristan da Cunha Sfânta Elena, Ascension și Tristan da Cunha - + South Sudan Sudanul de Sud - + Sint Maarten (Dutch part) Sfântul Martin (partea olandeză) - + Turkey Turcia - + Trinidad and Tobago Trinidad și Tobago - + Tuvalu Tuvalu - + Taiwan Taiwan - + Tanzania, United Republic of Tanzania - + Ukraine Ucraina - + Uganda Uganda - + United States Minor Outlying Islands Insulele Minore Îndepartate ale Statelor Unite - + United States Statele Unite - + Uruguay Uruguai - + Uzbekistan Uzbekistan - + Holy See (Vatican City State) Vatican - + Saint Vincent and the Grenadines Sfântul Vicențiu și Grenadinele - + Virgin Islands, British Insulele Virgine Britanice - + Virgin Islands, U.S. Insulele Virgine Americane - + Vanuatu Vanuatu - + Wallis and Futuna Wallis și Futuna - + Samoa Samoa - + Yemen Yemen - + Mayotte Mayotte - + Serbia Serbia - + South Africa Africa de Sud - + Zambia Zambia - + Montenegro Muntenegru - + Zimbabwe ZImbabwe - + Aland Islands Insulele Åland - + Guernsey Guernsey - + Isle of Man Insula Man - + Jersey Insula Jersey - + Saint Barthelemy Sfântul Bartolomeu - + + Could not uncompress GeoIP database file. + Nu s-a putut decomprima fișierul cu baza de date GeoIP. + + + Couldn't save downloaded GeoIP database file. Nu s-a putut salva fișierul descărcat cu baza de date GeoIP. - + Successfully updated GeoIP database. Baza de date GeoIP a fost actualizată cu succes. - + Couldn't download GeoIP database file. Reason: %1 Nu s-a putut descărca fișierul cu baza de date GeoIP. Motivul: %1 @@ -4594,20 +4142,20 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] - sprijin UPnP / NAT-PMP [PORNIT] + suport UPnP / NAT-PMP [PORNIT] - + UPnP / NAT-PMP support [OFF] - sprijin UPnP / NAT-PMP [OPRIT] + suport UPnP / NAT-PMP [OPRIT] Net::Smtp - + Email Notification Error: Eroare de Notificare Email: @@ -4615,1274 +4163,1078 @@ OptionsDialog - + Options Opțiuni - + Behavior Comportament - + Downloads Descărcări - + Connection Conexiune - + Speed Viteză - + BitTorrent BitTorrent - - RSS - - - - + Web UI Interfață Web - + Advanced Avansat - + Language Limbă - + User Interface Language: Limba interfeței cu utilizatorul: - + (Requires restart) (Necesită repornire) - + Transfer List Lista de transferuri - + Confirm when deleting torrents Cere confirmare la ștergerea torrentelor - + Use alternating row colors In transfer list, one every two rows will have grey background. Utilizează culori de rând alternative - + Hide zero and infinity values Ascunde valorile zero și infinit - + Always Întotdeauna - + Paused torrents only Doar torrentele suspendate - + Action on double-click Acțiune la clic dublu - + Downloading torrents: Torente în curs de descărcare: - - + + Start / Stop Torrent Pornește / Oprește torrent - - + + Open destination folder Deschide dosarul destinație - - + + No action Nicio acțiune - + Completed torrents: Torente încheiate: - + Desktop Spațiul de lucru - + Start qBittorrent on Windows start up Pornește qBittorrent la pornirea Windows-ului - + Show splash screen on start up Arată ecranul de întâmpinare la pornire - + Start qBittorrent minimized Pornește qBittorrent minimizat - + Confirmation on exit when torrents are active Confirmare la ieșire când torrentele sunt active - + Confirmation on auto-exit when downloads finish Confirmare la ieșirea automată când descărcările s-au încheiat - - KiB - KiO - - - - Email notification &upon download completion - - - - - Run e&xternal program on torrent completion - - - - - IP Fi&ltering - Fi&ltrare adrese IP - - - - Schedule &the use of alternative rate limits - - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - - - - &Torrent Queueing - - - - - Seed torrents until their seeding time reaches - - - - - A&utomatically add these trackers to new downloads: - - - - - RSS Reader - Cititor RSS - - - - Enable fetching RSS feeds - - - - - Feeds refresh interval: - Interval de reîmprospătare al fluxurilor: - - - - Maximum number of articles per feed: - - - - - - min - minutes - min - - - - RSS Torrent Auto Downloader - - - - - Enable auto downloading of RSS torrents - - - - - Edit auto downloading rules... - Editare reguli de descărcare automată... - - - - Web User Interface (Remote control) - Interfață utilizator Web (Control la distanță) - - - - IP address: - - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - - - - - Server domains: - Domenii servitor: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - - - - - &Use HTTPS instead of HTTP - &Utilizează HTTPS în locul HTTP - - - - Bypass authentication for clients on localhost - - - - - Bypass authentication for clients in whitelisted IP subnets - - - - - IP subnet whitelist... - - - - - Upda&te my dynamic domain name - + + Show qBittorrent in notification area + Arată qBittorrent în zona de notificare - + Minimize qBittorrent to notification area Minimizează qBittorrent în zona de notificare - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. Închide qBittorrent în zona de notificare - + Tray icon style: Stilul iconiței de notificare: - + Normal Normală - + Monochrome (Dark theme) Monocrom (Tema întunecată) - + Monochrome (Light theme) Monocrom (Tema luminoasă) - + File association Asociere fișier - + Use qBittorrent for .torrent files Utilizează qBittorren pentru fișiere .torrent - + Use qBittorrent for magnet links Utilizează qBittorren pentru legături magnet - + Power Management Gestiune energie - + + Inhibit system sleep when torrents are active + Împiedică adormirea sistemului cât timp torrentele sunt active + + + + Log file + Fișier jurnal + + + Save path: Cale de salvare: - + Backup the log file after: Fă o copie de rezervă a fișierului jurnal după: - + + MB + MO + + + Delete backup logs older than: - Șterge copiile de rezervă ale fișierului jurnal mai vechi decât: + Sterge fișierele jurnal mai vechi decât: - + days Delete backup logs older than 10 months zile - + months Delete backup logs older than 10 months luni - + years Delete backup logs older than 10 years ani - + When adding a torrent Când se adaugă un torrent - + + Display torrent content and some options + Afișează conținutul torrentului și câteva opțiuni + + + Bring torrent dialog to the front Adu fereastra de dialog a torrentului în față - + Do not start the download automatically The torrent will be added to download list in pause state Nu porni automat descărcarea - + Should the .torrent file be deleted after adding it Ar trebui fișierele .torrent să fie șterse după adăugare? - + + Delete .torrent files afterwards + Șterge fișierele .torrent după + + + Also delete .torrent files whose addition was cancelled Șterge fișierele .torrent a căror adăugare a fost anulată - + Also when addition is cancelled Și când adăugarea a fost anulată - + Warning! Data loss possible! Atenție! Este posibilă pierderea datelor! - + Saving Management Gestionare salvare - + Default Torrent Management Mode: Mod gestionare torrent implicit: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category Modul automatic înseamnă că diferitele proprietăți ale torentului (ca de exemplu calea de salvare) vor fi decise de către categoria asociată - + Manual Manual - + Automatic Automat - + When Torrent Category changed: Când categoria torrentului a fost schimbată - + Relocate torrent Mută torrentul în altă locație - + Switch torrent to Manual Mode Comută torentul pe modul manual - + When Default Save Path changed: Când calea de salvare implicită a fost schimbată - - + + Relocate affected torrents Mută torrentele afectate în altă locație - - + + Switch affected torrents to Manual Mode Comută torrentele afectate pe modul manual - + When Category changed: Când categoria a fost schimbată: - + Use Subcategories Utilizează subcategoriile - + Default Save Path: Cale de salvare implicită: - + Keep incomplete torrents in: Păstrează torentele incomplete în: - + Copy .torrent files to: Copiază fișierele .torrent în: - - Show &qBittorrent in notification area - - - - - &Log file - Fișier jurna&l - - - - Display &torrent content and some options - - - - - Create subfolder for torrents with multiple files - - - - - De&lete .torrent files afterwards - - - - + Copy .torrent files for finished downloads to: Copiază fișierele .torrent pentru descărcările încheiate în: - + Pre-allocate disk space for all files Pre-alocă spațiu pe disc pentru toate fișierele - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding - - - - + Append .!qB extension to incomplete files Adaugă extensia .!qB fișierelor incomplete - - Enable recursive download dialog - - - - + Automatically add torrents from: Adaugă automat torente din: - + Add entry Adaugă intrarea - + Remove entry Elimină intrarea - + + Email notification upon download completion + Trimite notificări prin email la finalizarea descărcării + + + + Destination email: + Email destinație: + + + SMTP server: Servitor SMTP: - + This server requires a secure connection (SSL) Servitorul necesită o conexiune securizată (SSL) - - + + + Authentication Autentificare - - - - + + + + Username: Nume utilizator: - - - - + + + + Password: Parolă: - - Enabled protocol: - Protocol activat: - - - - TCP and μTP - TCP și μTP + + Run external program on torrent completion + Rulează un program extern la încheierea descărcării torrentului - + Listening Port Port ascultat - + Port used for incoming connections: Portul utilizat pentru conexiunile de intrare: - + Random Aleator - + Use UPnP / NAT-PMP port forwarding from my router Utilizează înaintare port UPnP / NAT-PMP de la routerul meu - + Use different port on each startup Utilizează port diferit la fiecare pornire - + Connections Limits Stabilește limitele conexiunii - + Maximum number of connections per torrent: Numărul maxim de conexiuni per torent: - + Global maximum number of connections: Număr maxim global de conexiuni: - + Maximum number of upload slots per torrent: Numărul maxim de sloturi de încărcare per torent: - + Global maximum number of upload slots: Număr maxim global de sloturi de încărcare: - + Proxy Server Servitor proxy - + Type: Tip: - + (None) (Niciunul) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Gazdă: - - + + Port: Port: - + Otherwise, the proxy server is only used for tracker connections Altfel, servitorul proxy este utilizat doar pentru conexiuni la urmăritor - + Use proxy for peer connections Utilizează proxy pentru conexiuni la parteneri - + Disable connections not supported by proxies - Dezactivează conexiunile care nu sunt sprijinite de proxy-uri - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - + Dezactivează conexiunile care nu sunt suportate de proxy-uri - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection Fluxurile RSS, motoarele de căutare, actualizările de software sau orice altceva în afară de transferuri de torrente și operațiuni conexe (precum schimbul de parteneri) vor utiliza o conexiune directă - + Use proxy only for torrents Utilizează proxy doar pentru torrente - - A&uthentication - A&utentificare - - - + Info: The password is saved unencrypted Informare: Parola este salvată în mod necriptat - + + IP Filtering + Filtrare IP + + + Filter path (.dat, .p2p, .p2b): Cale filtru (.dat, .p2p, .p2b): - + Reload the filter Reîncarcă filtrul - - Manually banned IP addresses... - Adrese IP blocate manual... - - - + Apply to trackers Aplică urmăritoarelor - + Global Rate Limits Limite de viteză globale - - - - - - - KiB/s - - - - - + + Upload: Încărcare: - - + + + + + KiB/s + KiO/s + + + + Download: Descărcare: - + Alternative Rate Limits Limite de viteză alternative - - + + Schedule the use of alternative rate limits + Planifică utilizarea limitelor alternative de viteză + + + From: from (time1 to time2) De la: - - + To: time1 to time2 la: - + When: Când: - + Every day Zilnic - + Weekdays Zile lucrătoare - + Weekends Zile libere - + Rate Limits Settings Setări limite de viteză - + Apply rate limit to peers on LAN Aplică limitarea ratei partenerilor din rețeaua locală (LAN) - + Apply rate limit to transport overhead Aplică limitarea de viteză incluzând datele de transport - - + + + Enable µTP protocol + Activează protocolul µTP + + + Apply rate limit to µTP protocol Aplică limitarea ratei protocolului µTP - + Privacy Confidențialitate - + Enable DHT (decentralized network) to find more peers Activează rețeaua descentralizată (DHT) pentru a găsi mai multe surse - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Schimbă parteneri cu clienții Bittorrent compatibili (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers Activează schimbul de surse (PeX) cu alți clienți pentru a găsi mai multe surse - + Look for peers on your local network Caută parteneri în rețeaua locală - + Enable Local Peer Discovery to find more peers Activează descoperirea partenerilor locali pentru a găsi mai mulți parteneri - + Encryption mode: Modul criptării: - + Prefer encryption Preferă criptarea - + Require encryption Necesită criptarea - + Disable encryption Dezactivează criptarea - + Enable when using a proxy or a VPN connection Activează când este utilizată o conexiune VPN sau proxy - + Enable anonymous mode Activează modul anonim - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Mai multe informații</a>) + + + + Torrent Queueing + Coadă torente + + + Maximum active downloads: Numărul maxim de descărcări active: - + Maximum active uploads: Numărul maxim de încărcări active: - + Maximum active torrents: Numărul maxim de torrente active: - + Do not count slow torrents in these limits Nu socoti torrentele lente în aceste limite - - Upload rate threshold: - - - - - Download rate threshold: - - - - - sec - seconds - - - - - Torrent inactivity timer: - - - - + Share Ratio Limiting Limitare raport partajare - + Seed torrents until their ratio reaches Contribuie torrentele până când raportul lor de partajare atinge - + then apoi - + Pause them - Suspendă-le + Întrerupe-le - + Remove them Elimină-le - - RSS Smart Episode Filters - + + Automatically add these trackers to new downloads: + Adaugă automat aceste urmăritoare la noile descărcări: + + + + Enable Web User Interface (Remote control) + Activează interfața Web (control la distanță) - + Use UPnP / NAT-PMP to forward the port from my router Utilizează UPnP / NAT-PMP pentru a înainta portul din routerul meu - + + Use HTTPS instead of HTTP + Utilizează HTTPS în locul HTTP + + + Certificate: Certificat: - + Import SSL Certificate Importă certificatul SSL - + Key: Cheie: - + Import SSL Key Importă cheia SSL - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Informații despre certificate</a> - - Use alternative Web UI - - - - - Files location: - - - - - Enable clickjacking protection - + + Bypass authentication for localhost + Ocolește autentificarea pentru localhost - - Enable Cross-Site Request Forgery (CSRF) protection - + + Update my dynamic domain name + Actualizează numele meu dinamic de domeniu - + Service: Serviciu: - + Register Înregistrează - + Domain name: Nume de domeniu: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! Prin activarea acestor opțiuni, puteți <strong>pierde în mod definitiv<strong> fișierele dumneavoastră .torrent! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well Când aceste opțiuni sunt active, qBittorrent va <strong>șterge<strong> fișierele .torrent după ce acestea au fost adăugate (prima opțiune) sau nu (a doua opțiune) la coadă. Setarea se va aplica <strong>nu doar<strong> fișierelor deschise prin opțiunea din meniul ldquo;Adaugă Torrent&rdquo; dar și celor deschise prin <strong>asociere tip fișier<strong> - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog Dacă activați cea de-a doua opțiune (&ldquo;Și când adăugarea a fost anulată&rdquo;) fișierul .torrent <strong>va fi șters<strong>chiar dacă apăsați &ldquo; <strong>Anulează<strong>&rdquo; în fereastra de dialog &ldquo;Adaugă torent&rdquo; - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): - Parametri sprijiniți (sensibil la majuscule): + Parametri suportați (sensibil la majuscule): - + %N: Torrent name %N: Nume torrent - + %L: Category %L: Categorie - - %G: Tags (seperated by comma) - - - - + %F: Content path (same as root path for multifile torrent) %F: Cale conținut (aceeași cu calea rădăcină pentru torrent cu mai multe fișiere) - + %R: Root path (first torrent subdirectory path) %R: Cale rădăcină (cale subdirector a primului torrent) - + %D: Save path %D: Cale de salvare - + %C: Number of files %C: Număr de fișiere - + %Z: Torrent size (bytes) %Z: Dimensiune torrent (octeți) - + %T: Current tracker %T: Urmăritor actual - + %I: Info hash %I: Informații indexare - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") Sfat: Încapsulați parametrul între ghilimele (englezești) pentru a evita ca textul să fie tăiat la spațiu (de ex., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor Selectați dosarul ce va fi supravegheat - + Folder is already being monitored: Dosarul este deja sub supraveghere. - + Folder does not exist: Dosarul nu există: - + Folder is not readable: Dosarul nu poate fi citit: - + Adding entry failed Adăugarea intrării a eșuat - - - - + + Choose export directory Alegeți un dosar pentru exportare - - - + + + + + + Choose a save directory Alegeți un dosar pentru salvare - + Choose an IP filter file Alegeți un fișier filtru IP - + All supported filters - Toate filtrele sprijinite + Toate filtrele suportate - + SSL Certificate Certificat SSL - + + SSL Key + Cheie SSL + + + Parsing error Eroare de analiză - + Failed to parse the provided IP filter A eșuat analiza filtrului IP furnizat - + Successfully refreshed Reîmprospătat cu succes - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number S-a analizat cu succes filtrul IP furnizat: %1 reguli au fost aplicate. - + Invalid key Cheie nevalidă - + This is not a valid SSL key. Aceasta nu este o cheie SSL validă. - + Invalid certificate Certificat nevalid - - Preferences - Preferințe - - - - Import SSL certificate - Importă certificatul SSL - - - + This is not a valid SSL certificate. Acesta nu este un certificat SSL valid. - - Import SSL key - Importă cheia SSL - - - - SSL key - Cheie SSL - - - + Time Error Eroare timp - + The start time and the end time can't be the same. Timpul de pornire și timpul de încheiere nu pot fi aceiași. - - + + Length Error Eroare lungime - + The Web UI username must be at least 3 characters long. Numele de utilizator al interfeței Web trebuie să conțină minim 3 caractere. - + The Web UI password must be at least 6 characters long. Parola interfeței Web trebuie să fie de minim 6 caractere. @@ -5890,72 +5242,72 @@ PeerInfo - - Interested(local) and Choked(peer) - + + interested(local) and choked(peer) + interesat(local) și copleșit(partener) - + interested(local) and unchoked(peer) interesat(local) și decopleșit(partener) - + interested(peer) and choked(local) interesat(partener) și copleșit(local) - + interested(peer) and unchoked(local) interesat(partener) și decopleșit(local) - + optimistic unchoke decopleșire optimistă - + peer snubbed partener ignorat - + incoming connection conexiune de intrare - + not interested(local) and unchoked(peer) neinteresat(local) și decopleșit(partener) - + not interested(peer) and unchoked(local) neinteresat(partener) și decopleșit(local) - + peer from PEX partener din PEX - + peer from DHT partener din DHT - + encrypted traffic trafic criptat - + encrypted handshake inițializare criptată - + peer from LSD partener din LSD @@ -5963,193 +5315,178 @@ PeerListWidget - + IP IP - + Port Port - + Flags Indicatori - + Connection Conexiune - + Client i.e.: Client application Client - + Progress i.e: % downloaded Progres - + Down Speed i.e: Download speed Viteză descărcare - + Up Speed i.e: Upload speed Viteză încărcare - + Downloaded i.e: total data downloaded Descărcat - + Uploaded i.e: total data uploaded Încărcat - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Relevanță - + Files i.e. files that are being downloaded right now Fișiere - + Column visibility Vizibilitate coloană - + Add a new peer... Adăugare un partener nou... - - + + Ban peer permanently Blochează permanent partenerul - + Manually adding peer '%1'... Se adaugă manual partenerul „%1”... - + The peer '%1' could not be added to this torrent. Partenerul „%1” nu a putut fi adăugat la acest torrent. - + Manually banning peer '%1'... Se blochează manual partenerul „%1”... - - + + Peer addition Adăugare partener - + Country Țară - + Copy IP:port Copiază IP:port - + Some peers could not be added. Check the Log for details. Unii parteneri nu au putut fi adăugați. Verificați jurnalul pentru detalii. - + The peers were added to this torrent. Partenerii au fost adăugați la acest torrent. - + Are you sure you want to ban permanently the selected peers? Sigur doriți să blocați permanent partenerii selectați? - + &Yes &Da - + &No &Nu - PeersAdditionDialog - - - Add Peers - - + PeersAdditionDlg - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - - - + No peer entered - + Niciun partener introdus - + Please type at least one peer. - + Introduceți măcar un partener. - + Invalid peer - + Partener nevalid - + The peer '%1' is invalid. - + Partenerul „%1” nu este valid. PieceAvailabilityBar - + White: Unavailable pieces Alb: Bucăți indisponibile - + Blue: Available pieces Albastru: Bucăți disponibile @@ -6157,336 +5494,293 @@ PiecesBar - + Files in this piece: Fișiere în această bucată: - + File in this piece Fișier în această bucată - + File in these pieces Fișier în aceste bucăți - - Wait until metadata become available to see detailed information - Așteptați până când metadatele sunt obținute pentru a vedea informații detaliate - - - + Hold Shift key for detailed information Țineți apăsat tasta Shift pentru informații detaliate - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Module de căutare - + Installed search plugins: - + Module de căutare instalate: - + Name - Nume + Nume - + Version - + Versiune - + Url - + URL - - + + Enabled - - - - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - + Activat - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Puteți să obțineți noi module motor de căutare de aici: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Instalează unul nou - + Check for updates - + Caută actualizări - + Close - + Închide - + Uninstall - + Dezinstalează - - - + + + Yes - Da + Da - - - - + + + + No - Nu + Nu - + Uninstall warning - + Avertisment dezinstalare - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Unele module nu au putut fi dezinstalate deoarece vin incluse în qBittorrent. Doar cele pe care le-ați adăugat manual pot fi dezinstalate. +Totuși, acele module au fost dezactivate. - + Uninstall success - + Succes dezinstalare - + All selected plugins were uninstalled successfully - - - - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - + Toate modulele selectate au fost dezinstalate cu succes - - + + New search engine plugin URL - + URL nou pentru modulul de motor de căutare - - + + URL: - + URL: - + Invalid link - + Legătură nevalidă - + The link doesn't seem to point to a search engine plugin. - + Legătura nu pare a indica spre un modul pentru motorul de căutare. - + Select search plugins - + Alegeți module de căutare - + qBittorrent search plugin - + Modul de căutare qBittorrent + + + + + + Search plugin update + Actualizare modul de căutare - + All your plugins are already up to date. - + Toate modulele sunt deja actualizate. - + Sorry, couldn't check for plugin updates. %1 - + Ne pare rău, nu se poate verifica dacă sunt actualizări pentru module. %1 - + + + Search plugin install - + Instalare module de căutare - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + Modulul de motor de căutare „%1” a fost instalat cu succes. + + + Couldn't install "%1" search engine plugin. %2 - + Modulul de motor de căutare „%1” nu a putut fi instalat. %2 + + + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + Modulul de motor de căutare „%1” a fost actualizat cu succes. - + Couldn't update "%1" search engine plugin. %2 - + Modulul de motor de căutare „%1” nu a putut fi actualizat. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Sursă modul - + Search plugin source: - + Sursă modul de căutare: - + Local file - + Fișier local - + Web link - - - - - PowerManagement - - - qBittorrent is active - + Legătură Web - PreviewSelectDialog - - - Preview - Previzualizare - + PreviewSelect - + Name Nume - + Size Dimensiune - + Progress Progres - - + + Preview impossible Previzualizare imposibilă - - + + Sorry, we can't preview this file Fișierul nu poate fi previzualizat - Private::FileLineEdit - - - '%1' does not exist - „%1” nu există - - - - '%1' does not point to a directory - „%1” nu indică către un director - - - - '%1' does not point to a file - „%1” nu indică către un fișier - - - - Does not have read permission in '%1' - Nu are permisiune în „%1” - - - - Does not have write permission in '%1' - Nu are permisiune de scriere în „%1” - - - PropListDelegate - + Not downloaded Nedescărcat - - + + Normal Normal (priority) Normală - - N/A - Indisponibil - - - + Do not download Do not download (priority) - Nu descărca + Nu descărca - - + + High High (priority) Înaltă - + N/A + Indisponibil + + + Mixed Mixed (priorities Mixtă - - + + Maximum Maximum (priority) Maximă @@ -6495,32 +5789,32 @@ PropTabBar - + General General - + Trackers Urmăritoare - + Peers Parteneri - + HTTP Sources Surse HTTP - + Content Conținut - + Speed Viteză @@ -6614,22 +5908,22 @@ Comentariu: - + Select All Selectează toate - + Select None Nu selecta nimic - + Normal Normală - + High Înaltă @@ -6689,165 +5983,165 @@ Cale de salvare: - + Maximum Maximă + - Do not download Nu descărca - + Never Niciodată - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (avem %3) - - + + %1 (%2 this session) %1 (%2 în această sesiune) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (contribuit pentru %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 maxim) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 în total) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 în medie) - + Open Deschide - + Open Containing Folder Deschide dosarul conținător - + Rename... Redenumire... - + Priority Prioritate - + New Web seed Sursă Web nouă - + Remove Web seed Elimină sursa Web - + Copy Web seed URL Copiază URL-ul sursei Web - + Edit Web seed URL Editare URL sursă Web - + + Rename the file + Redenumire fișier + + + New name: Denumire nouă: - - + + + The file could not be renamed + Fișierul nu a putut fi redenumit + + + + This file name contains forbidden characters, please choose a different one. + Numele fișierului conține caractere interzise. Alegeți unul diferit. + + + + This name is already in use in this folder. Please use a different name. Acest nume este deja folosit în acest dosar. Alegeți un nume diferit. - + The folder could not be renamed Dosarul nu a putut fi redenumit - + qBittorrent qBittorrent - + Filter files... Filtrare fișiere... - - Renaming - Redenumire - - - - - Rename error - Eroare de redenumire - - - - The name is empty or contains forbidden characters, please choose a different one. - - - - + New URL seed New HTTP source Sursă URL nouă - + New URL seed: Sursa URL nouă: - - + + This URL seed is already in the list. Această sursă URL este deja în listă. - + Web seed editing Editare sursă Web - + Web seed URL: URL sursă Web: @@ -6855,230 +6149,116 @@ QObject - - %1 is an unknown command line parameter. - --random-parameter is an unknown command line parameter. - %1 este un parametru linie de comandă necunoscut. - - - - - %1 must be the single command line parameter. - %1 trebuie să fie singurul parametru pentru linia de comandă. - - - - You cannot use %1: qBittorrent is already running for this user. - Nu puteți utiliza %1: qBittorrent rulează deja pentru acest utilizator. + + Your IP address has been banned after too many failed authentication attempts. + Adresa dumneavoastră IP a fost interzisă după prea multe încercări de autentificare eșuate. - - Usage: - Utilizare: + + Error: '%1' is not a valid torrent file. + + Eroare: „%1” nu este un fișier torrent valid. - - Options: - Opțiuni: + + Error: Could not add torrent to session. + Eroare: Nu s-a putut adăuga torrentul acestei sesiuni. - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - + + I/O Error: Could not create temporary file. + Eroare Intrare/Ieșire: Nu se poate crea fișierul temporar. - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - + + %1 is an unknown command line parameter. + --random-parameter is an unknown command line parameter. + %1 este un parametru linie de comandă necunoscut. - - Expected integer number in environment variable '%1', but got '%2' - + + + %1 must be the single command line parameter. + %1 trebuie să fie singurul parametru pentru linia de comandă. - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - + + %1 must specify the correct port (1 to 65535). + %1 trebuie specificat portul corect (de la 1 la 65535). - - Expected %1 in environment variable '%2', but got '%3' - + + You cannot use %1: qBittorrent is already running for this user. + Nu puteți utiliza %1: qBittorrent rulează deja pentru acest utilizator. - - port - port + + Usage: + Utilizare: - - %1 must specify a valid port (1 to 65535). - %1 trebuie să specifice un port valid (de la 1 la 65535). + + Options: + Opțiuni: - - Display program version and exit - Afișează versiunea programului și iese + + Displays program version + Afișează versiunea programului - - Display this help message and exit - Afișează acest mesaj de ajutor și iese + + Displays this help message + Afișează acest mesaj de ajutor - - Change the Web UI port - + + Changes the Web UI port (current: %1) + Schimbă portul interfeței Web (actual: %1) - + Disable splash screen Dezactivează ecranul de întâmpinare - + Run in daemon-mode (background) Rulează în mod daemon (fundal) - - dir - Use appropriate short form or abbreviation of "directory" - - - - - Store configuration files in <dir> - Stochează fișierele de configurare în <dir> - - - - - name - nume - - - - Store configuration files in directories qBittorrent_<name> - - - - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - - - - - files or URLs - fișiere sau adrese URL - - - - Download the torrents passed by the user - - - - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - - - - - Options when adding new torrents: - - - - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Scurtătură pentru %1 - - - - path - cale - - - - Torrent save path - Cale salvare torente - - - - Add torrents as started or paused - Adaugă torente în modul pornite sau suspendate - - - - Skip hash check - Omite verificarea indexului - - - - Assign torrents to category. If the category doesn't exist, it will be created. - - - - - Download files in sequential order - Descarcă fișierele în ordine secvențială - - - - Download first and last pieces first - Descarcă prima și ultima bucată întâi - - - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - - - - - Command line parameters take precedence over environment variables - + + Downloads the torrents passed by the user + Descărcă torrentele transmise de către utilizator - + Help Ajutor - + Run application with -h option to read about command line parameters. Rulați aplicația cu opțiunea -h pentru a citi despre parametri din linia de comandă. - + Bad command line Linie de comandă nepotrivită: - + Bad command line: Linie de comandă nepotrivită: - + Legal Notice Notă juridică - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - - - - - No further notices will be issued. - - - - + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. No further notices will be issued. @@ -7087,628 +6267,701 @@ Nu vor fi emise alte notificări. - + Press %1 key to accept and continue... Apăsați tasta %1 pentru a accepta și continua... - + Legal notice Notă juridică - + Cancel Renunță - + I Agree Sunt de acord - - - Upgrade - Actualizează + + Torrent name: %1 + Nume torrent: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - Ați actualizat de la o versiune mai veche ce a salvat setările în mod diferit. Trebuie să migrați setările la noul sistem de salvare. Nu veți mai putea folosi o versiune mai veche de v3.3.0 altă dată. Continuați? [d/n] + + Torrent size: %1 + Dimensiune torrent: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - Ați actualizat de la o versiune mai veche ce a salvat setările în mod diferit. Trebuie să migrați setările la noul sistem de salvare. Dacă alegeți să continuați nu veți mai putea folosi o versiune mai veche de v3.3.0 altă dată. + + Save path: %1 + Cale salvare: %1 - - Couldn't migrate torrent with hash: %1 - Nu s-a reușit migrarea torrentului cu indexul: %1 + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Torrentul a fost descărcat în %1. - - Couldn't migrate torrent. Invalid fastresume file name: %1 - Nu s-a reușit migrarea torrentului. Nume fișier nevalid: %1 + + Thank you for using qBittorrent. + Mulțumim pentru că folosiți qBittorrent. - - Detected unclean program exit. Using fallback file to restore settings: %1 - + + [qBittorrent] '%1' has finished downloading + [qBittorrent] '%1' a terminat descărcarea - - An access error occurred while trying to write the configuration file. - A apărut o eroare de acces când se încerca scrierea fișierului de configurație. + + The remote host name was not found (invalid hostname) + Numele gazdei la distanță nu a fost găsit (nume de gazdă nevalid) - - A format error occurred while trying to write the configuration file. - A apărut o eroare de format când se încerca scrierea fișierului de configurație. + + The operation was canceled + Operația a fost abandonată - - An unknown error occurred while trying to write the configuration file. - + + The remote server closed the connection prematurely, before the entire reply was received and processed + Servitorul la distanță a închis conexiunea prematur, înainte ca întregul răspuns să fie primit și procesat - - - RSS::AutoDownloader - - - Invalid data format. - Format de date nevalid . + + The connection to the remote server timed out + Conexiunea la servitorul la distanță a expirat - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - + + SSL/TLS handshake failed + Inițierea conexiunii SSL/TLS a eșuat - - Invalid data format - + + The remote server refused the connection + Servitorul la distanță a refuzat conexiunea - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - + + The connection to the proxy server was refused + Conexiunea la servitorul proxy a fost refuzată - - Couldn't load RSS AutoDownloader rules. Reason: %1 - + + The proxy server closed the connection prematurely + Servitorul proxy a închis conexiunea prematur - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - + + The proxy host name was not found + Numele de gazdă al servitorului proxy nu a fost găsit - - RSS feed at '%1' updated. Added %2 new articles. - + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Conexiunea la proxy terminată sau proxy-ul nu a răspuns la timp cererii trimise - - Failed to parse RSS feed at '%1'. Reason: %2 - + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Proxy-ul cere autentificare pentru a putea onora cererea dar nu a acceptat certificările oferite - - Couldn't read RSS Session data from %1. Error: %2 - + + The access to the remote content was denied (401) + Accesul la conținutul la distanță a fost refuzat (401) - - Couldn't parse RSS Session data. Error: %1 - + + The operation requested on the remote content is not permitted + Operațiunea cerută asupra conținutului la distanță nu este permisă - - Couldn't load RSS Session data. Invalid data format. - + + The remote content was not found at the server (404) + Conținutul la distanță nu a fost găsit pe acest servitor (404) - - Couldn't load RSS article '%1#%2'. Invalid data format. - + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Servitorul la distanță cere autentificare pentru a furniza conținutul dar certificările oferite nu au fost acceptate - - - RSS::Private::Parser - - Invalid RSS feed. - + + The Network Access API cannot honor the request because the protocol is not known + API-ul de acces la rețea nu poate onora cererea deoarece protocolul nu este cunoscut - - %1 (line: %2, column: %3, offset: %4). - + + The requested operation is invalid for this protocol + Operațiunea cerută nu este validă pentru acest protocol - - - RSS::Session - - RSS feed with given URL already exists: %1. - + + An unknown network-related error was detected + O eroare necunoscută legată de rețea a fost detectată - - Cannot move root folder. - Nu se poate muta dosarul rădăcină. + + An unknown proxy-related error was detected + O eroare necunoscută legată de proxy a fost detectată - - - Item doesn't exist: %1. - + + An unknown error related to the remote content was detected + O eroare necunocută legată de conținutul la distanță a fost detectată - - Cannot delete root folder. - Nu se poate șterge dosarul rădăcină. + + A breakdown in protocol was detected + O întrerupere a fost detectată în protocol - - Incorrect RSS Item path: %1. - + + Unknown error + Eroare necunoscută - - RSS item with given path already exists: %1. - + + + Upgrade + Actualizează + + + + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] + Ați actualizat de la o versiune mai veche ce a salvat setările în mod diferit. Trebuie să migrați setările la noul sistem de salvare. Nu veți mai putea folosi o versiune mai veche de v3.3.0 altă dată. Continuați? [d/n] + + + + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. + Ați actualizat de la o versiune mai veche ce a salvat setările în mod diferit. Trebuie să migrați setările la noul sistem de salvare. Dacă alegeți să continuați nu veți mai putea folosi o versiune mai veche de v3.3.0 altă dată. + + + + Couldn't migrate torrent with hash: %1 + Nu s-a reușit migrarea torrentului cu indexul: %1 + + + + Couldn't migrate torrent. Invalid fastresume file name: %1 + Nu s-a reușit migrarea torrentului. Nume fișier nevalid: %1 + + + + Detected unclean program exit. Using fallback file to restore settings. + A fost detectată o ieșire forțată din program. Se folosește fișierul de rezervă pentru a restaura configurările. - - Parent folder doesn't exist: %1. - Dosarul părinte nu există: %1. + + An access error occurred while trying to write the configuration file. + A apărut o eroare de acces când se încerca scrierea fișierului de configurație. + + + + A format error occurred while trying to write the configuration file. + A apărut o eroare de format când se încerca scrierea fișierului de configurație. - RSSWidget + RSS - + Search Caută - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - - - - + New subscription Abonament nou - - - + + + Mark items read Marchează elementele ca citite - - Refresh RSS streams - Reîmprospătează fluxurile RSS - - - + Update all Actualizează toate - + RSS Downloader... Descărcător RSS... - + + Settings... + Configurări... + + + Torrents: (double-click to download) - Torente: (clic-dublu pntru a descărca) + Torrente: (clic dublu pentru a descărca) - - + + Delete Șterge - + Rename... Redenumire... - + Rename Redenumește - - + + Update Actualizează - + New subscription... Abonament nou... - - + + Update all feeds Actualizează toate fluxurile - + Download torrent - Descarcă torentul + Descarcă torrent - + Open news URL - + Deschide URL articol - + Copy feed URL - + Copiază URL-ul fluxului - + New folder... Dosar nou... - + + Refresh RSS streams + Reîmprospătează fluxurile RSS + + + + RSSImp + + + Stream URL: + URL flux: + + + + Please type a RSS stream URL + Introduceți un URL pentru fluxul RSS + + + + This RSS feed is already in the list. + Acest flux RSS este deja în listă. + + + Please choose a folder name - + Alegeți un nume pentru dosar - + Folder name: Nume dosar: - + New folder Dosar nou - - Please type a RSS feed URL - - - - - Feed URL: - - - - + Deletion confirmation Confirmare ștergere - + Are you sure you want to delete the selected RSS feeds? - + Sigur doriți să ștergeți fluxurile RSS selectate? - + Please choose a new name for this RSS feed - + Alegeți un nume nou pentru acest flux RSS - + New feed name: - + Nume flux nou: + + + + Name already in use + Numele este deja utilizat - - Rename failed - Redenumirea a eșuat + + This name is already used by another item, please choose another one. + Numele este deja folosit de un alt element, alegeți alt nume. - + Date: - Dată: + Dată: - + Author: - Autor: + Autor: - - - ScanFoldersDelegate - - Select save location - Selectează locație pentru salvare + + Unread + Necitite - ScanFoldersModel + Rss::Feed - - Monitored Folder - Dosar urmărit + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + Descărcarea automată a fluxului RSS „%1” de la „%2” a eșuat deoarece nu conține un torrent sau o legătură magnet... - - Override Save Location - Suprascrie locația pentru salvare + + Automatically downloading '%1' torrent from '%2' RSS feed... + Descărcare automată a „%1” torrent de la „%2” fluxuri RSS... + + + Rss::Private::Parser - - Monitored folder - Dosar urmărit + + Invalid RSS feed. + Flux RSS nevalid. + + + + RssSettingsDlg + + + RSS Reader Settings + Configurări cititor RSS + + + + RSS feeds refresh interval: + Interval de reîmprospătare flux RSS: + + + + min + min + + + + Maximum number of articles per feed: + Numărul maxim de articole pe flux: + + + + ScanFoldersDelegate + + + Select save location + Selectează locație pentru salvare + + + + ScanFoldersModel + + + Monitored Folder + Dosar urmărit + + + + Override Save Location + Suprascrie locația pentru salvare + Monitored folder + Dosar urmărit + + + Default save location Cale de salvare implicită - + Browse... Răsfoire... - SearchJobWidget + SearchEngine - - Form - + + Unknown search engine plugin file format. + Format fișier necunoscut pentru modul motor de căutare. - - Results(xxx) - + + A more recent version of this plugin is already installed. + O versiune mai recentă a acestui modul este deja instalată. - - Search in: - + + + Plugin is not supported. + Modulul nu este compatibil. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - + + Update server is temporarily unavailable. %1 + Servitorul de actualizări este temporar indisponibil. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - + + + Failed to download the plugin file. %1 + Descărcarea fișierului modulului a eșuat. %1 - - Seeds: - Surse: + + An incorrect update info received. + A fost primită o informație greșită de actualizare. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - + + All categories + Toate categoriile - - - to - + + Movies + Filme artistice - - <html><head/><body><p>Maximal number of seeds</p></body></html> - + + TV shows + Filme seriale - - - - + + Music + Muzică - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + + Games + Jocuri - - Size: - Dimensiune: + + Anime + Anime - - <html><head/><body><p>Minimal torrent size</p></body></html> - + + Software + Aplicații - - <html><head/><body><p>Maximal torrent size</p></body></html> - + + Pictures + Imagini + + + + Books + Cărți + + + + SearchListDelegate + + + + Unknown + Necunoscută + + + SearchTab - + Name i.e: file name - Nume + Nume - + Size i.e: file size - Dimensiune + Dimensiune - + Seeders i.e: Number of full sources - + Surse - + Leechers i.e: Number of partial sources - + Descărcători - + Search engine - - - - - Filter search results... - + Motor de căutare - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Rezultate (se afișează <i>%1</i> din<i>%2</i>): - + Torrent names only - + Doar numele torentelor - + Everywhere - - - - - Use regular expressions - + Oriunde - + Searching... - + Se caută... - + Search has finished - Căutarea s-a finalizat + Căutarea s-a finalizat - + Search aborted - + Căutare abandonată - + An error occurred during search... - + A apărut o eroare în timpul căutării... - + Search returned no results - + Căutarea nu a întors rezultate - + Column visibility Vizibilitate coloană - - - SearchPluginManager - - - Unknown search engine plugin file format. - - - - A more recent version of this plugin is already installed. - - - - - - Plugin is not supported. - + + Form + Formular - - All categories - + + Results(xxx) + Rezultate(xxx) - - Movies - + + Search in: + Caută în: - - TV shows - + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Unele motoare de căutare caută și în descrierea torentului și numele de fișier. Dacă rezultatele căutării vor fi afișate în lista de mai jos este controlat de acest mod</p><p><span style=" font-weight:600;">Oriunde</span>dezactivează filtrarea și afișează întreg conținutul returnat de motoarele de căutare.</p><p><span style=" font-weight:600;">Doar nume de torent</span>afișează doar acele torente a căror nume se potrivesc interogării.</p></body></html> - - Music - + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Stabilește numărul minim și maxim de contribuitori</p></body></html> - - Games - + + Seeds: + Surse: - - Anime - + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Numărul minim de surse</p></body></html> - - Software - + + + to + până la - - Pictures - + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Numărul maxim de surse</p></body></html> - - - Books - + + + + + - - Update server is temporarily unavailable. %1 - + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Stabilește dimensiunea minimă și maximă permisă a unui torent </p></body></html> - - - Failed to download the plugin file. %1 - + + Size: + Dimensiune: - - An incorrect update info received. - + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Dimensiunea minimă a torentului</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Dimensiunea maximă a torentului</p></body></html> @@ -7716,197 +6969,185 @@ - - - - + + + Search Caută - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - - + Download Descarcă - + Go to description page Mergi la pagina cu descrierea - + Copy description page URL Copiază adresa paginii cu descrierea - + Search plugins... Module de căutare... - + A phrase to search for. O expresie de căutat. - + Spaces in a search term may be protected by double quotes. Spațiile dintr-o expresie de căutare pot fi protejate prin ghilimele (englezești, duble). - + Example: Search phrase example Exemplu: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>: caută după <b>foo</b> și <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: caută după <b>foo bar</b> - + All plugins Toate modulele - + Only enabled Doar activate - + Select... Selectare... - - - + + + Search Engine Motor de căutare - + Please install Python to use the Search Engine. Instalați Python pentru a utiliza motorul de căutare. - + Empty search pattern Model de căutare gol - + Please type a search pattern first Introduceți un model de căutare mai întâi - + Stop Oprește - + Search has finished Căutarea s-a finalizat - + Search has failed Căutarea a eșuat - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + qBittorrent va ieși. - + E&xit Now - + Ieși acum - + Exit confirmation - + Confirmare ieșire - + The computer is going to shutdown. - + Calculatorul se va opri. - + &Shutdown Now - - - - - Shutdown confirmation - + Oprește acum - + The computer is going to enter suspend mode. - + Calculatorul se va intra în modul adormire. - + &Suspend Now - + &Suspendă acum - + Suspend confirmation - + Confirmare adormire - + The computer is going to enter hibernation mode. - + Calculatorul se va intra în modul hibernare. - + &Hibernate Now - + &Hibernează acum - + Hibernate confirmation - + Confirmare hibernare - + You can cancel the action within %1 seconds. - + Puteți anula această acțiune în %1 secunde. + + + + Shutdown confirmation + Confirmare oprire SpeedLimitDialog - + KiB/s KiO/s @@ -7914,52 +7155,52 @@ SpeedPlotView - + Total Upload Încărcare totală - + Total Download Descărcare totală - + Payload Upload Încărcare sarcină utilă - + Payload Download Descărcare sarcină utilă - + Overhead Upload Încărcare suprasarcină - + Overhead Download Descărcare suprasarcină - + DHT Upload Încărcare DHT - + DHT Download Descărcare DHT - + Tracker Upload Încărcare urmăritor - + Tracker Download Descărcare urmăritor @@ -7967,95 +7208,87 @@ SpeedWidget - + Period: Perioadă: - + 1 Minute 1 minut - + 5 Minutes 5 minute - + 30 Minutes 30 de minute - + 6 Hours 6 ore - + Select Graphs Selectare grafice - + Total Upload Încărcare totală - + Total Download Descărcare totală - + Payload Upload Încărcare sarcină utilă - + Payload Download Descărcare sarcină utilă - + Overhead Upload Încărcare suprasarcină - + Overhead Download Descărcare suprasarcină - + DHT Upload Încărcare DHT - + DHT Download Descărcare DHT - + Tracker Upload Încărcare urmăritor - + Tracker Download Descărcare urmăritor - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8068,49 +7301,49 @@ Statistici utilizator - - Cache statistics - Statistici prestocare (cache) + + Total peer connections: + Conexiuni totale cu parteneri: - - Read cache hits: - Accesări prestocare citire: + + Global ratio: + Raport global: - - Average time in queue: - Timp mediu la coadă: + + Alltime download: + Descărcare totală: - - Connected peers: - + + Alltime upload: + Încărcare totală: - - All-time share ratio: - + + Total waste (this session): + Pierdut în total (această sesiune): - - All-time download: - + + Cache statistics + Statistici prestocare (cache) - - Session waste: - + + Read cache hits: + Accesări prestocare citire: - - All-time upload: - + + Average time in queue: + Timp mediu la coadă: - Total buffer size: - + Total buffers size: + Dimensiune totală încărcări în avans: @@ -8138,7 +7371,12 @@ Dimensiune totală coadă: - + + OK + OK + + + %1 ms 18 milliseconds %1 ms @@ -8147,27 +7385,32 @@ StatusBar - + Connection status: Stare conexiune: - + No direct connections. This may indicate network configuration problems. Fără conexiuni directe. Aceasta ar putea indica o problemă la configurarea rețelei. - + DHT: %1 nodes DHT: %1 noduri - - qBittorrent needs to be restarted! - qBittorrent trebuie să fie repornit! + + qBittorrent needs to be restarted + qBittorrent trebuie să fie repornit + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent a fost actualizat și necesită să fie repornit pentru ca schimbările să aibe efect. @@ -8186,1563 +7429,1311 @@ Conectat - + Click to switch to alternative speed limits Clic pentru a activa limitele de viteză alternative - + Click to switch to regular speed limits Clic pentru a activa limitele de viteză obișnuite - - Global Download Speed Limit + + Manual change of rate limits mode. The scheduler is disabled. + Schimbarea manuală a modului limitelor de viteză. Planificatorul e dezactivat. + + + + Global Download Speed Limit Limită viteză de decărcare globală - + Global Upload Speed Limit Limită viteză de încărcare globală - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - Toate (0) + Toate (0) - + Downloading (0) - + Se descarcă (0) - + Seeding (0) - + Se contribuie (0) - + Completed (0) - + Încheiate (0) - + Resumed (0) - + Reluate (0) - + Paused (0) - + Suspendate (0) - + Active (0) - + Active (0) - + Inactive (0) - + Inactive (0) - + Errored (0) - + Cu erori (0) - + All (%1) - Toate (%1) + Toate (%1) - + Downloading (%1) - + Se descarcă (%1) - + Seeding (%1) - + Se contribuie (%1) - + Completed (%1) - + Încheiate (%1) - + Paused (%1) - + Suspendate (%1) - + Resumed (%1) - + Reluate (%1) - + Active (%1) - + Active (%1) - + Inactive (%1) - + Inactive (%1) - + Errored (%1) - + Cu erori (%1) - TagFilterModel + TorrentContentModel - - Tags - Etichete + + Name + Nume - - All - Toate + + Size + Dimensiune - - Untagged - Neetichetate + + Progress + Progres - - - TagFilterWidget - - Add tag... - Adăugare etichetă... + + Download Priority + Prioritate descărcare - - Remove tag - Elimină eticheta + + Remaining + Rămas + + + TorrentCreatorDlg - - Remove unused tags - Elimină etichetele neutilizate + + Select a folder to add to the torrent + Selectați un dosar de adăugat la torrent - - Resume torrents - Reia torentele + + Select a file to add to the torrent + Selectați un fișier de adăugat la torrent - - Pause torrents - Suspendă torentele + + No input path set + Nicio cale de intrare stabilită - - Delete torrents - Șterge torentele + + Please type an input path first + Introduceți mai întâi o cale de intrare - - New Tag - Etichetă nouă + + Select destination torrent file + Selectați fișierul torrent destinație - - Tag: - Etichetă: + + Torrent Files (*.torrent) + Fișiere torrent (*.torrent) - - Invalid tag name - Nume etichetă nevalid + + Torrent was created successfully: %1 + %1 is the path of the torrent + Torrentul a fost creat cu succes: %1 - - Tag name '%1' is invalid - Numele de etichetă „%1” nu este valid + + + + Torrent creation + Creare torrent - - Tag exists - Eticheta există + + Torrent creation was unsuccessful, reason: %1 + Crearea torrentului a eșuat, motivul: %1 - - Tag name already exists. - Numele etichetei există deja. + + Created torrent file is invalid. It won't be added to download list. + Fișierul torrent creat nu este valid. Nu va fi adăugat listei de descărcare. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - + + Name + i.e: torrent name + Nume - - Name: - Nume: + + Size + i.e: torrent size + Dimensiune - - Save path: - Cale de salvare: + + Done + % Done + Gata - - Choose save path - Alegeți calea de salvare + + Status + Torrent status (e.g. downloading, seeding, paused) + Stare - - New Category - Categorie nouă + + Seeds + i.e. full sources (often untranslated) + Surse - - Invalid category name - + + Peers + i.e. partial sources (often untranslated) + Parteneri - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - + + Down Speed + i.e: Download speed + Viteză descărcare - - Category creation error - + + Up Speed + i.e: Upload speed + Viteză încărcare - - Category with the given name already exists. -Please choose a different name and try again. - + + Ratio + Share ratio + Raport - - - TorrentContentModel - - Name - Nume + + ETA + i.e: Estimated Time of Arrival / Time left + Timp rămas - - Size - Dimensiune + + Category + Categorie - - Progress - Progres + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Adăugat la - - Download Priority - Prioritate descărcare + + Completed On + Torrent was completed on 01/01/2010 08:00 + Terminat la - - Remaining - Rămas + + Tracker + Urmăritor - - Availability - Disponibilitate + + Down Limit + i.e: Download limit + Limită descărcare - - - TorrentCreatorDialog - - Torrent Creator - + + Up Limit + i.e: Upload limit + Limită încărcare - - Select file/folder to share - + + Downloaded + Amount of data downloaded (e.g. in MB) + Descărcat - - Path: - + + Uploaded + Amount of data uploaded (e.g. in MB) + Încărcat - - [Drag and drop area] - + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Descărcat în sesiune - - - Select file - + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Încărcat în sesiune - - - Select folder - + + Remaining + Amount of data left to download (e.g. in MB) + Rămas - - Settings - + + Time Active + Time (duration) the torrent is active (not paused) + Timp activ - - Piece size: - + + Save path + Torrent save path + Cale salvare - - Auto - + + Completed + Amount of data completed (e.g. in MB) + Terminat - - 16 KiB - + + Ratio Limit + Upload share ratio limit + Limită raport - - 32 KiB - + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Văzut complet ultima dată - - 64 KiB - + + Last Activity + Time passed since a chunk was downloaded/uploaded + Ultima activitate - - 128 KiB - + + Total Size + i.e. Size including unwanted data + Dimensiune totală + + + TrackerFiltersList - - 256 KiB - + + All (0) + this is for the tracker filter + Toate (0) - - 512 KiB - + + Trackerless (0) + Fără urmăritor (0) - - 1 MiB - + + Error (0) + Cu erori (0) - - 2 MiB - + + Warning (0) + Cu avertismente (0) - - 4 MiB - + + + Trackerless (%1) + Fără urmăritor (%1) - - 8 MiB - + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - 16 MiB - + + + Error (%1) + Cu erori (%1) - - 32 MiB - + + + Warning (%1) + Cu avertismente (%1) - - Calculate number of pieces: - + + Resume torrents + Reia torrentele - - Private torrent (Won't distribute on DHT network) - + + Pause torrents + Suspendă torrentele - - Start seeding immediately - + + Delete torrents + Șterge torrentele - - Ignore share ratio limits for this torrent - + + + All (%1) + this is for the tracker filter + Toate (%1) + + + TrackerList - - Optimize alignment - + + URL + URL - - Fields - + + Status + Stare - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + + Received - - Web seed URLs: - + + Seeds + Surse - - Tracker URLs: - + + Peers + Parteneri - - Comments: - + + Downloaded + Descărcat - - Source: - + + Message + Mesaj - - Progress: - Progres: + + + Working + Funcțional - - Create Torrent - + + Disabled + Dezactivat - - - - Torrent creation failed - + + This torrent is private + Acest torrent este privat - - Reason: Path to file/folder is not readable. - + + Updating... + Se actualizează... - - Select where to save the new torrent - + + Not working + Nefuncțional - - Torrent Files (*.torrent) - + + Not contacted yet + Nu a fost contactat încă - - Reason: %1 - + + Tracker URL: + URL urmăritor: - - Reason: Created torrent is invalid. It won't be added to download list. - + + Tracker editing + Editare urmăritor - - Torrent creator - + + + Tracker editing failed + Editarea urmăritorului a eșuat - - Torrent created: - + + The tracker URL entered is invalid. + URL-ul urmăritorului nu este valid. - - - TorrentInfo - - File size exceeds max limit %1 - + + The tracker URL already exists. + URL-ul urmăritorului există deja. - - Torrent file read error: %1 - + + Add a new tracker... + Adăugare urmăritor nou... - - Torrent file read error: size mismatch - + + Copy tracker URL + Copiază URL-ul urmăritorului - - - TorrentsController - - Not contacted yet - + + Edit selected tracker URL + Editează URL-ul urmăritorului selectat - - Updating... - - - - - Working - - - - - Not working - - - - - Error: '%1' is not a valid torrent file. - - - - - - - - Torrent queueing must be enabled - - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - - Cannot make save path - - - - - Cannot write to directory - - - - - WebUI Set location: moving "%1", from "%2" to "%3" - - - - - Incorrect torrent name - - - - - - Incorrect category name - - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - Toate (0) - - - - Trackerless (0) - Fără urmăritor (0) - - - - Error (0) - Cu erori (0) - - - - Warning (0) - Cu avertizări (0) - - - - - Trackerless (%1) - Fără urmăritor (%1) - - - - - Error (%1) - Cu erori (%1) - - - - - Warning (%1) - Cu avertizări (%1) - - - - Resume torrents - Reia torrentele - - - - Pause torrents - Suspendă torrentele - - - - Delete torrents - Șterge torrentele - - - - - All (%1) - this is for the tracker filter - Toate (%1) - - - - TrackerListWidget - - - - Working - - - - - Disabled - Dezactivat - - - - This torrent is private - - - - - Updating... - - - - - Not working - - - - - Not contacted yet - - - - - - - - - - N/A - Indisponibil - - - - Tracker editing - - - - - Tracker URL: - - - - - - Tracker editing failed - - - - - The tracker URL entered is invalid. - - - - - The tracker URL already exists. - - - - - Add a new tracker... - - - - - Remove tracker - - - - - Copy tracker URL - - - - - Edit selected tracker URL - - - - + Force reannounce to selected trackers - + Forțează reanunțarea urmăritoarelor selectate - + Force reannounce to all trackers - - - - - URL - - - - - Status - Stare - - - - Received - + Forțează reanunțarea tuturor urmăritoarelor - - Seeds - - - - - Peers - Parteneri - - - - Downloaded - Descărcat - - - - Message - - - - - Column visibility - Vizibilitate coloană + + Remove tracker + Elimină urmăritorul - TrackerLoginDialog - - - - Tracker authentication - - - - - Tracker: - - + TrackersAdditionDlg - - Login - Autentifică - - - - Username: - Nume utilizator: - - - - Password: - Parolă: + + Trackers addition dialog + Dialog adăugare urmăritoare - - Log in - + + List of trackers to add (one per line): + Listă urmăritoare de adăugat (unul per linie): - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + Listă URL compatibilă µTorrent: - - List of trackers to add (one per line): - + + I/O Error + Eroare Intrare/Ieșire - - µTorrent compatible list URL: - + + Error while trying to open the downloaded file. + Eroarea la încercarea deschiderii fișierului descărcat. - + No change - + Nicio modificare - + No additional trackers were found. - + Niciun urmăritor adițional găsit. - + Download error - Eroare la descărcare + Eroare descărcare - + The trackers list could not be downloaded, reason: %1 - + Lista de urmăritoare nu a putut fi descărcată, motivul: %1 TransferListDelegate - + Downloading Se descarcă - + Downloading metadata used when loading a magnet link Se descarcă metadatele - + Allocating qBittorrent is allocating the files on disk Se alocă - + Paused Suspendat - + Queued i.e. torrent is queued Pus la coadă - + Seeding Torrent is complete and in upload-only mode Se contribuie - + Stalled Torrent is waiting for download to begin Stagnat - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] Se descarcă - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] Se contribuie - + Checking Torrent local data is being checked Se verifică - + Queued for checking i.e. torrent is queued for hash checking Pus la coadă pentru verificare - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Se verifică reluarea datelor - + Completed Încheiat - - Moving - Torrent local data are being moved/relocated - - - - + Missing Files Fișiere lipsă - - Errored - torrent status, the torrent has an error - Eroare - - - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - %2 (contribuit pentru %2) - - - - %1 ago - e.g.: 1h 20m ago - %1 în urmă - - - - TransferListFiltersWidget - - - Status - Stare - - - - Categories - Categorii - - - - Tags - Etichete - - - - Trackers - Urmăritoare - - - - TransferListModel - - - Name - i.e: torrent name - Nume - - - - Size - i.e: torrent size - Dimensiune - - - - Done - % Done - - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Stare - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - Parteneri - - - - Down Speed - i.e: Download speed - Viteză descărcare - - - - Up Speed - i.e: Upload speed - Viteză încărcare - - - - Ratio - Share ratio - - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - Categorie - - - - Tags - Etichete - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Descărcat - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Încărcat - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - Rămas - - - - Time Active - Time (duration) the torrent is active (not paused) - - - - - Save path - Torrent save path - + + Errored + torrent status, the torrent has an error + Eroare - - Completed - Amount of data completed (e.g. in MB) - Încheiat + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) + %2 (contribuit pentru %2) - - Ratio Limit - Upload share ratio limit - + + %1 ago + e.g.: 1h 20m ago + %1 în urmă + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + Stare - - Last Activity - Time passed since a chunk was downloaded/uploaded - + + Categories + Categorii - - Total Size - i.e. Size including unwanted data - + + Trackers + Urmăritoare TransferListWidget - + Column visibility Vizibilitate coloană - + Choose save path Alegeți calea de salvare - + Torrent Download Speed Limiting Limitare viteză descărcare torrent - + Torrent Upload Speed Limiting Limitare viteză de încărcare torrent - + Recheck confirmation Confirmare reverificare - + Are you sure you want to recheck the selected torrent(s)? Sigur doriți să reverificați torrentul(ele) selectat? - + Rename Redenumire - + New name: Denumire nouă: - + Resume Resume/start the torrent Reia - + Force Resume Force Resume/start the torrent Forțează reluarea - + Pause Pause the torrent Suspendă - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Stabilire locație: se mută „%1”, din „%2” în „%3” - - - - Add Tags - Adăugare etichete - - - - Remove All Tags - Elimină toate etichetele - - - - Remove all tags from selected torrents? - Eliminați toate etichetele de la torentele selectate? + + New Category + Categorie nouă - - Comma-separated tags: - Etichete separate prin virgulă: + + Category: + Categorie: - - Invalid tag - Etichetă nevalidă + + Invalid category name + Nume categorie nevalid - - Tag name: '%1' is invalid - Numele de etichetă: „%1” nu este valid + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Numele categoriei nu trebuie să conțină „\”. +Numele categoriei nu trebuie să înceapă/încheie cu „/”. +Numele categoriei nu trebuie să conțină secvența „//”. - + Delete Delete the torrent Șterge - + Preview file... Previzualizare fișier... - + Limit share ratio... Limitare raport de partajare.... - + Limit upload rate... Limitare viteză de încărcare... - + Limit download rate... Limitare viteză de descărcare... - + Open destination folder Deschide dosarul destinație - + Move up i.e. move up in the queue Mută mai sus - + Move down i.e. Move down in the queue Mută mai jos - + Move to top i.e. Move to top of the queue Mută în vârf - + Move to bottom i.e. Move to bottom of the queue Mută la bază - + Set location... Stabilire locație... - - Force reannounce - Forțează reanunțarea - - - + Copy name Copiază numele - - Copy hash - Copy indexul - - - + Download first and last pieces first Descarcă prima și ultima bucată întâi - + Automatic Torrent Management Administrare automată torente - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category Modul automatic înseamnă că diferitele proprietăți ale torentului (ca de exemplu calea de salvare) vor fi decise de către categoria asociată - + Category Categorie - + New... New category... Nouă... - + Reset Reset category Restabilește - - Tags - Etichete - - - - Add... - Add / assign multiple tags... - Adăugare... - - - - Remove All - Remove all tags - Elimină toate - - - + Priority Prioritate - + Force recheck Forțează reverificarea - + Copy magnet link Copiază legătura magnet - + Super seeding mode Mod super-contribuire - + Rename... Redenumire... - + Download in sequential order Descarcă în ordine secvențială - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + Limitare raport încărcare/descărcare torrent - - Use global share limit - + + Use global ratio limit + Utilizează limita globală a raportului - - - + + + buttonGroup - + butonGroup - - Set no share limit - + + Set no ratio limit + Stabilește nicio limită a raportului - - Set share limit to - + + Set ratio limit to + Stabilește limita raportului la + + + + WebApplication + + + Incorrect category name + Nume categorie incorectă + + + WebUI - - ratio - + + The Web UI is listening on port %1 + Interfața Web ascultă pe portul %1 - - minutes - + + Web UI Error - Unable to bind Web UI to port %1 + Eroare interfață Web - Nu se poate lega interfața Web la portul %1 + + + about - - No share limit method selected - + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Un client BitTorrent avansat, programat în C++, bazat pe setul de unelte Qt și pe biblioteca libtorrent-rasterbar. - - Please select a limit method first - + + Copyright %1 2006-2016 The qBittorrent project + Drept de autor %1 2006-2016 Proiectul qBittorrent + + + + Home Page: + Pagină de pornire: + + + + Forum: + Forum: + + + + Bug Tracker: + Urmăritor de defecțiuni: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - + + Add Peers + Adăugare parteneri - - Python not detected - + + List of peers to add (one per line): + Listă de parteneri de adăugat (unu per linie): + + + + Format: IPv4:port / [IPv6]:port + Format: IPv4:port / [IPv6]:port - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - + + + Tracker authentication + Autentificare urmăritor - - Symlinks inside alternative UI folder are forbidden. - + + Tracker: + Urmăritor: - - Exceeded the maximum allowed file size (%1)! - + + Login + Autentificare - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - + + Username: + Nume utilizator: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - + + Password: + Parolă: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - + + Log in + Autentificare - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - + + Cancel + Anulare - WebUI + confirmDeletionDlg - - Web UI: HTTPS setup successful - + + Deletion confirmation - qBittorrent + Confirmare ștergere - qBittorrent - - Web UI: HTTPS setup failed, fallback to HTTP - + + Remember choice + Ține minte alegerea - - Web UI: Now listening on IP: %1, port: %2 - + + Also delete the files on the hard disk + Șterge și fișierele de pe disc + + + + confirmShutdownDlg + + + Don't show again + Nu arăta din nou + + + createTorrentDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - + + Cancel + Renunță + + + + Torrent Creation Tool + Unealtă creare torrent + + + + Torrent file creation + Creare fișier torrent + + + + Add file + Adaugă fișier + + + + Add folder + Adaugă dosar + + + + File or folder to add to the torrent: + Fișier sau dosar de adăugat la torrent: + + + + Tracker URLs: + URL-uri urmăritoare: + + + + Web seeds urls: + URL-uri surse Web: + + + + Comment: + Comentariu: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Puteți separa nivelurile/grupurile de urmăritoare cu o linie goală. + + + + Piece size: + Dimensiune bucată: + + + + 16 KiB + 16 KiO + + + + 32 KiB + 32 KiO + + + + 64 KiB + 64 KiO + + + + 128 KiB + 128 KiO + + + + 256 KiB + 256 KiO + + + + 512 KiB + 512 KiO + + + + 1 MiB + 1 MiO + + + + 2 MiB + 2 MiO + + + + 4 MiB + 4 MiO + + + + 8 MiB + 8 MiO + + + + 16 MiB + 16 MiO + + + + Auto + Automată + + + + Private (won't be distributed on DHT network if enabled) + Privat (nu va fi distribuit pe rețeaua DHT în caz că este activă) + + + + Start seeding after creation + Pornește contribuirea după creare + + + + Ignore share ratio limits for this torrent + Ignoră limitele de distribuire pentru acest torrent + + + + Create and save... + Creează și salvează... + + + + Progress: + Progres: + + + + downloadFromURL + + + Add torrent links + Adăugați legături torrent + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Una pe linie ( sunt suportate legăturile HTTP, legăturile magnet și informațiile index) + + + + Download + Descarcă + + + + Cancel + Renunță + + + + Download from urls + Descărcare de la URL-uri + + + + No URL entered + Niciun URL introdus + + + + Please type at least one URL. + Introduceți măcar un URL. + + + + errorDialog + + + Crash info + Informații de depanare fsutils - + + + + + Downloads Descărcări @@ -9750,100 +8741,140 @@ misc - + B bytes O - + KiB kibibytes (1024 bytes) KiO - + MiB mebibytes (1024 kibibytes) MiO - + GiB gibibytes (1024 mibibytes) GiO - + TiB tebibytes (1024 gibibytes) TiO - + PiB pebibytes (1024 tebibytes) PiO - + EiB exbibytes (1024 pebibytes) EiO - + + Python not detected + Python nedetectat + + + + Python version: %1 + Versiune Python: %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1o %2m - + %1d %2h e.g: 2days 10hours %1z %2o - + Unknown Unknown (size) Necunoscut - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent va opri acum calculatorul deoarece toate descărcările au fost finalizate. - + < 1m < 1 minute < 1m - + %1m e.g: 10minutes %1m + + + Working + Funcțional + + + + Updating... + Se actualizează... + + + + Not working + Nefuncțional + + + + Not contacted yet + Nu a fost contactat încă + preview - + Preview selection Previzualizeazare selecție - + The following files support previewing, please select one of them: - Următoarele fișiere sprijină previzualizarea, selectați unul dintre ele: + Următoarele fișiere suportă previzualizarea, selectați unul din ele: + + + + Preview + Previzualizează + + + + Cancel + Renunță diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_ru.ts qbittorrent-3.3.15/src/lang/qbittorrent_ru.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_ru.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_ru.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent О qBittorrent - + About О программе - + Author Авторы - - Current maintainer - Сопровождение кода + + + Nationality: + Страна: - - Greece - Греция + + + Name: + Имя: - - - Nationality: - Страна: + + + E-mail: + E-mail: - - - E-mail: - Эл. почта: + + Greece + Греция - - - Name: - Имя: + + Current maintainer + Сопровождение кода - + Original author Оригинальный автор - - France - Франция - - - + Special Thanks Благодарности - + Translators Перевод - - License - Лицензия - - - + Libraries Библиотеки - + qBittorrent was built with the following libraries: - Текущая версия qBittorrent собрана с использованием следующих библиотек: - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - Продвинутый клиент сети BitTorrent, написанный на языке C++ с использованием фреймворка Qt и библиотеки libtorrent-rasterbar. - - - - Copyright %1 2006-2018 The qBittorrent project - Copyright %1 2006-2018 The qBittorrent project - - - - Home Page: - Домашняя страница: + Эта версия qBittorrent собрана с использованием следующих библиотек: - - Forum: - Форум: + + France + Франция - - Bug Tracker: - Баг-трекер: + + License + Лицензия @@ -112,60 +87,70 @@ Save at - Сохранить в + Сохранить на + + + + Browse... + Обзор… + + + + Set as default save path + Установить как путь сохранения по умолчанию - + Never show again Больше не показывать - + Torrent settings Настройки торрента - + Set as default category - Выбрать в качестве категории по умолчанию + Установить в качестве категории по умолчанию - + Category: Категория: - + Start torrent Запустить торрент - + Torrent information Сведения о торренте - + Skip hash check Пропустить проверку хеша - + Size: Размер: - + Hash: Хеш: - + Comment: Комментарий: - + Date: Дата: @@ -190,234 +175,219 @@ Автоматический - - Remember last used save path - Запоминать последний путь сохранения - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - При включении торрент-файл не будет удалён, вне зависимости от параметров «Загрузок» в окне «Настроек» + При включении торрент-файл не будет удалён, в независимости от параметров "Загрузок" в окне "Настроек" - + Do not delete .torrent file Не удалять торрент-файл - - Create subfolder - Создать подпапку - - - - Download in sequential order - Загружать файлы последовательно - - - - Download first and last pieces first - Загружать с первой и последней части - - - + Normal Обычный - + High Высокий - + Maximum Максимальный - + Do not download Не загружать - - - + + + I/O Error Ошибка ввода/вывода - + Invalid torrent - Недопустимый торрент - - - - Renaming - Переименование + Неправильный торрент - - - Rename error - Ошибка переименования + + + + + Already in download list + Уже присутствует в списке загрузок - - The name is empty or contains forbidden characters, please choose a different one. - Имя пустое или содержит запрещённые символы, пожалуйста, выберите другое. - - - + Not Available This comment is unavailable Недоступно - + Not Available This date is unavailable Недоступно - + Not available Недоступно - + Invalid magnet link - Недопустимая магнет-ссылка + Неправильная magnet-ссылка - + The torrent file '%1' does not exist. - Торрент-файл «%1» не существует. + Торрент файл '%1' не существует. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. - Невозможно прочесть торрент-файл «%1» с диска. Вероятно, у вас не хватает для этого прав. + Нельзя прочитать торрент-файл '%1' с диска. Вероятно, у вас не хватает для этого прав. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' ' characters. They insert a newline. - Не удалось загрузить торрент: %1. + Не удалось загрузить торрент: %1 Ошибка: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Торрент уже присутствует в списке загрузок. Трекеры не были объединены, поскольку торрент является приватным. + + + + Torrent is already in download list. Trackers were merged. + Торрент уже присутствует в списке загрузок. Трекеры были объединены. + + + + + Cannot add torrent + Нельзя добавить торрент + + + + Cannot add this torrent. Perhaps it is already in adding state. + Нельзя добавить этот торрент. Возможно, он уже в состоянии добавления. + + + This magnet link was not recognized - Магнет-ссылка не распознана + Magnet-ссылка не распознана + + + + Magnet link is already in download list. Trackers were merged. + Magnet-ссылка уже присутствует в списке загрузок. Трекеры были объединены. + + + + Cannot add this torrent. Perhaps it is already in adding. + Нельзя добавить этот торрент. Возможно, он уже добавляется. - + Magnet link - Магнет-ссылка + Magnet-ссылка - + Retrieving metadata... Получение метаданных… - + Not Available This size is unavailable. Недоступно - + Free space on disk: %1 - Свободно на диске: %1 + Свободно на диске: %1 - + + Choose save path Выберите путь сохранения - - - - - - - Torrent is already present - Торрент уже существует - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - Торрент «%1» уже присутствует в списке. Трекеры не были объединены, поскольку торрент является приватным. - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - Торрент «%1» уже присутствует в списке. Трекеры были объединены. - - - - Torrent is already queued for processing. - Торрент уже в очереди на обработку. + + Rename the file + Переименовать файл - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - Магнет-ссылка «%1» уже присутствует в списке. Трекеры были объединены. + + New name: + Новое имя: - - Magnet link is already queued for processing. - Магнет-ссылка уже в очереди на обработку. + + + The file could not be renamed + Файл не может быть переименован - - New name: - Новое имя: + + This file name contains forbidden characters, please choose a different one. + Имя файла содержит недопустимые символы. Пожалуйста, выберите другое. - - + + This name is already in use in this folder. Please use a different name. - Файл с таким именем уже существует в этой папке. Пожалуйста, укажите другое имя. + Файл с таким именем уже существует в этой папке. Пожалуйста, задайте другое. - + The folder could not be renamed Папка не может быть переименована - + Rename... Переименовать… - + Priority Приоритет - + Invalid metadata - Недопустимые метаданные + Неправильные метаданные - + Parsing metadata... Анализ метаданных… - + Metadata retrieval complete Получение метаданных завершено - + Download Error Ошибка загрузки @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Кэш для записи на диск + + + MiB МБ - + Outgoing ports (Min) [0: Disabled] Исходящие порты (минимум) [0: Отключено] - + Outgoing ports (Max) [0: Disabled] Исходящие порты (максимум) [0: Отключено] - + Recheck torrents on completion - Проверить торрент по окончании загрузки + Перепроверить торрент по окончании - + Transfer list refresh interval Интервал обновления списка торрентов - + ms milliseconds мс - + Setting Параметр - + Value Value set for this setting Значение - - - (disabled) - (отключено) - - - + (auto) - (автоматически) - - - - min - minutes - мин + (авто) - + All addresses Все адреса - + qBittorrent Section Раздел qBittorrent - - + + Open documentation Открыть документацию - + libtorrent Section Раздел libtorrent - - Asynchronous I/O threads - Потоки асинхронного ввода-вывода - - - - Disk cache - Кэш диска - - - + s seconds с - + Disk cache expiry interval Интервал очистки дискового кэша - + Enable OS cache Разрешить кэш ОС - - Guided read cache - Управляемый кэш чтения - - - - Coalesce reads & writes - Объединять операции чтения и записи - - - - Send upload piece suggestions - Отправлять предложения частей отдачи - - - - - KiB - КБ - - - - Send buffer watermark - Уровень буфера отправки - - - - Send buffer low watermark - Минимальный уровень буфера отправки - - - - Send buffer watermark factor - Фактор уровня буфера отправки - - - - Prefer TCP - Предпочитать TCP - - - - Peer proportional (throttles TCP) - Пропорционально пирам (регулировка TCP) - - - - Allow multiple connections from the same IP address - Разрешить несколько соединений с одного IP-адреса + + m + minutes + мин - + Resolve peer countries (GeoIP) - Определять страну пира по GeoIP + Определять страну пира (GeoIP) - + Resolve peer host names Определять имя хоста пира - + Strict super seeding - Традиционный суперсид + Строгий суперсид - + Network Interface (requires restart) Сетевой интерфейс (требуется перезапуск) - + Optional IP Address to bind to (requires restart) - Адрес IP для привязки (требуется перезапуск) + IP-адрес для привязки (требуется перезапуск) - + Listen on IPv6 address (requires restart) Слушать адрес IPv6 (требуется перезапуск) - + Display notifications Показывать уведомления - + Display notifications for added torrents - Показывать уведомления при добавлении торрентов + Показывать уведомления для добавленных торрентов - + Download tracker's favicon Загружать значки трекеров - - Save path history length - Длина истории пути сохранения - - - - Fixed slots - Фиксированные слоты - - - - Upload rate based - На основе скорости отдачи - - - - Upload slots behavior - Поведение слотов отдачи - - - - Round-robin - По кругу - - - - Fastest upload - Быстрейшая отдача - - - - Anti-leech - Анти-лич - - - - Upload choking algorithm - Алгоритм заглушения отдачи - - - + Confirm torrent recheck - Подтверждать проверку торрента - - - - Confirm removal of all tags - Подтверждать удаление всех меток + Подтверждать перепроверку торрента - - Always announce to all trackers in a tier - Всегда анонсировать на все трекеры в группе + Exchange trackers with other peers + Обмениваться трекерами с другими пирами - - Always announce to all tiers - Всегда анонсировать на все группы трекеров + + Always announce to all trackers + Всегда анонсировать на все трекеры - + Any interface i.e. Any network interface Любой интерфейс - + Save resume data interval How often the fastresume file is saved. - Период сохранения данных возобновления + Период сохранения данных о загрузках - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - Алгоритм смешанного режима %1-TCP - - - + Maximum number of half-open connections [0: Unlimited] - Число полуоткрытых соединений [0: Неограниченно] + Макс. кол-во полуоткрытых соединений [0: Неограниченно] - + IP Address to report to trackers (requires restart) IP для сообщения трекерам (требуется перезапуск) - + Enable embedded tracker Включить встроенный трекер - + Embedded tracker port Порт встроенного трекера - + Check for software updates Проверять обновления - + Use system icon theme Использовать системные значки @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 запущен - + Torrent: %1, running external program, command: %2 Торрент: %1, запуск внешней программы, команда: %2 - - Torrent name: %1 - Имя торрента: %1 - - - - Torrent size: %1 - Размер торрента: %1 - - - - Save path: %1 - Путь сохранения: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Торрент был загружен за %1. - - - - Thank you for using qBittorrent. - Спасибо, что используете qBittorrent. - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] загрузка «%1» завершена + + Torrent: %1, run external program command too long (length > %2), execution failed. + Торрент: %1, слишком длинная команда запуска внешней программы (длина > %2), запуск не удался. - + Torrent: %1, sending mail notification - Торрент: %1, отправка оповещения на эл. почту + Торрент: %1, отправка уведомления на почту - + Information Информация - - To control qBittorrent, access the Web UI at %1 - Войдите в веб-интерфейс для управления qBittorrent: %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + Войдите в веб-интерфейс для управления qBittorrent: http://localhost:%1 - + The Web UI administrator user name is: %1 Имя администратора веб-интерфейса: %1 - + The Web UI administrator password is still the default one: %1 Пароль администратора веб-интерфейса всё ещё стандартный: %1 - + This is a security risk, please consider changing your password from program preferences. Это небезопасно, пожалуйста, измените свой пароль в настройках программы. - + Saving torrent progress... Сохранение состояния торрента… - - - Portable mode and explicit profile directory options are mutually exclusive - Портативный режим и отдельный путь профиля являются взаимоисключающими параметрами - - - - Portable mode implies relative fastresume - Портативный режим подразумевает относительное быстрое возобновление - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - Ошибка входа WebAPI. Причина: IP был запрещён, IP: %1, имя пользователя: %2 - - - - Your IP address has been banned after too many failed authentication attempts. - Ваш IP-адрес был заблокирован после слишком большого количества неудачных попыток аутентификации. - - - - WebAPI login success. IP: %1 - Успешный вход в WebAPI. IP: %1 - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - Ошибка входа WebAPI. Причина: неверные учётные данные, попыток: %1, IP: %2, имя пользователя: %3 - AutomatedRssDownloader - + Save to: Сохранить в: @@ -861,837 +658,700 @@ Загрузчик RSS - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - Автозагрузка торрентов из RSS в данный момент отключена! Вы можете включить её в настройках приложения. + + Enable Automated RSS Downloader + Включить автоматический загрузчик RSS - + Download Rules Правила загрузки - + Rule Definition - Определение правила + Описание правила - + Use Regular Expressions Использовать регулярные выражения - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - Умный фильтр эпизодов проверит номера, чтобы не допустить загрузки повторов. -Поддерживает форматы: S01E01, 1x1, 2017.01.01 и 01.01.2017 (Форматы дат также принимают «-» в качестве разделителя) - - - - Use Smart Episode Filter - Использовать умный фильтр эпизодов - - - + Must Contain: Должно содержать: - + Must Not Contain: Не должно содержать: - + Episode Filter: Фильтр эпизодов: - + Assign Category: Назначить категорию: - + Save to a Different Directory Сохранить в другую папку - + Ignore Subsequent Matches for (0 to Disable) ... X days - Игнорировать последующие совпадения (0: откл.) + Игнорировать последующие совпадения для (0 - отключено) - + Disabled - Отключён + Выключен - + days - дней + дней - + Add Paused: Добавить остановленные: - + Use global settings Использовать глобальные настройки - + Always Всегда - + Never Никогда - + Apply Rule to Feeds: Применить правило к каналам: - + Matching RSS Articles - Подходящие статьи RSS + Подходящие RSS-заголовки - + &Import... &Импорт… - + &Export... &Экспорт… - + Matches articles based on episode filter. Указывает на статьи, основанные на фильтре эпизодов. - + Example: - Пример: + Пример: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match - указывает на 2, 5, 8-15, 30 и следующие эпизоды первого сезона + указывает на 2, 5, 8-15, 30 и следующие эпизоды первого сезона - + Episode filter rules: - Правила фильтрации эпизодов: + Правила фильтрации эпизодов: - + Season number is a mandatory non-zero value Номер сезона должен иметь ненулевое значение - + Episode number is a mandatory non-zero value + Номер эпизода должен иметь ненулевое значение + + + Filter must end with semicolon Фильтр должен заканчиваться точкой с запятой - + Three range types for episodes are supported: - Поддерживаются три типа диапазонов для эпизодов: + Поддерживаются три типа диапазонов для эпизодов: - + Single number: <b>1x25;</b> matches episode 25 of season one Одиночный номер: <b>1x25;</b> означает 25-й эпизод первого сезона - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Обычный диапазон: <b>1x25-40;</b> указывает на эпизоды с 25-го по 40-й первого сезона - - Episode number is a mandatory positive value - Номер эпизода должен быть ненулевым - - - - Rules - Правила + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Бесконечный диапазон: <b>1x25-;</b> указывает на эпизоды с 25-го и выше первого сезона - - Rules (legacy) - Правила (устаревшие) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Бесконечный диапазон: <b>1x25-;</b> указывает на эпизоды с 25-го и выше первого сезона, и все эпизоды более поздних сезонов + - + Last Match: %1 days ago Последнее совпадение: %1 дней назад - + Last Match: Unknown - Последнее совпадение: Неизвестно + Последнее совпадение: неизвестно - + New rule name Новое правило - + Please type the name of the new download rule. - Пожалуйста, введите имя нового правила загрузки. + Введите имя нового правила загрузки. - - + + Rule name conflict Конфликт имени правила - - + + A rule with this name already exists, please choose another name. Правило с таким именем уже существует. Пожалуйста, выберите другое. - + Are you sure you want to remove the download rule named '%1'? - Вы уверены, что хотите удалить правило загрузки «%1»? + Вы уверены, что хотите удалить правило загрузки '%1'? - + Are you sure you want to remove the selected download rules? Вы уверены, что хотите удалить выбранные правила загрузки? - + Rule deletion confirmation Подтверждение удаления правила - + Destination directory Папка назначения - + Invalid action - Недопустимое действие + Неверное действие - + The list is empty, there is nothing to export. Список пуст, нечего экспортировать. - - Export RSS rules - Экспортировать правила RSS + + Where would you like to save the list? + Куда Вы хотите сохранить список? - - + + Rules list (*.rssrules) + Списки правил (*.rssrules) + + + I/O Error Ошибка ввода/вывода - - Failed to create the destination file. Reason: %1 - Не удалось создать целевой файл. Причина: %1 + + Failed to create the destination file + Не удалось создать целевой файл - - Import RSS rules - Импортировать правила RSS + + Please point to the RSS download rules file + Укажите файл с правилами загрузки RSS - - Failed to open the file. Reason: %1 - Не удалось открыть файл. Причина: %1 + + Rules list + Список правил - + Import Error Ошибка импорта - - Failed to import the selected rules file. Reason: %1 - Не удалось импортировать выбранный файл правил. Причина: %1 + + Failed to import the selected rules file + Не удалось импортировать выбранный файл правил - + Add new rule... Добавить правило… - + Delete rule Удалить правило - + Rename rule... Переименовать правило… - + Delete selected rules Удалить выбранные правила - - Clear downloaded episodes... - Очистить загруженные эпизоды… - - - + Rule renaming Переименование правила - + Please type the new rule name - Пожалуйста, введите имя нового правила - - - - Clear downloaded episodes - Очистить загруженные эпизоды - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - Вы уверены, что хотите очистить список загруженных эпизодов для выбранного правила? - - - - Regex mode: use Perl-compatible regular expressions - Режим Regex: Используйте регулярные выражения в стиле Perl + Введите новое имя правила - - - Position %1: %2 - Позиция %1: %2 + + Regex mode: use Perl-like regular expressions + Режим Regex: использовать регулярные выражения в стиле Perl - + Wildcard mode: you can use - Режим поиска по шаблону: можно использовать + - + ? to match any single character - «?» соответствует любому одиночному символу + - + * to match zero or more of any characters - «*» соответствует нулю или нескольким любым символам + - + Whitespaces count as AND operators (all words, any order) - Пробелы считаются как операторы И (все слова, любой порядок) + - + | is used as OR operator - «|» используется как оператор ИЛИ + - + If word order is important use * instead of whitespace. - Если порядок слов важен, то используйте «*» вместо пробелов. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Выражение с пустым пунктом %1 (например, %2) + - + will match all articles. - подойдёт всем статьям. + - + will exclude all articles. - исключит все статьи. - - - - BanListOptionsDialog - - - List of banned IP addresses - Список запрещённых адресов IP - - - - Ban IP - Запретить IP - - - - Delete - Удалить - - - - - Warning - Предупреждение + - - The entered IP address is invalid. - Введённый адрес IP недопустим. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Режим Wildcard: можно использовать<ul><li>? для замещения любого одного символа</li><li>* для замещения нуля и более любых символов</li><li>Пробелы действуют как операторы AND</li></ul> - - The entered IP is already banned. - Введённый адрес IP уже запрещён. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Режим Wildcard: можно использовать<ul><li>? для замещения любого одного символа</li><li>* для замещения нуля и более любых символов</li><li>| используется как оператор OR</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support Необходим перезапуск для включения поддержки PeX - - Could not get GUID of configured network interface. Binding to IP %1 - Не удалось получить GUID настроенного интерфейса подключения. Производится привязка к IP %1 - - - + Embedded Tracker [ON] - Встроенный трекер [ВКЛ] + Встроенный трекер [Вкл] - + Failed to start the embedded tracker! Не удалось запустить встроенный трекер! - + Embedded Tracker [OFF] - Встроенный трекер [ОТКЛ] + Встроенный трекер [Выкл] - + + '%1' reached the maximum ratio you set. Removing... + '%1' достиг установленного Вами максимального коэффициента. Удаление… + + + + '%1' reached the maximum ratio you set. Pausing... + '%1' достиг установленного Вами максимального коэффициента. Приостановка… + + + System network status changed to %1 e.g: System network status changed to ONLINE - Системный сетевой статус сменился на «%1» + Системный сетевой статус сменился на %1 - + ONLINE В СЕТИ - + OFFLINE НЕ В СЕТИ - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding Настройки сети %1 изменились, обновление привязки сеанса - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. Настроенный сетевой интерфейс %1 недоступен. - - + Encryption support [%1] Поддержка шифрования [%1] - - + FORCED ПРИНУДИТЕЛЬНО - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 — недопустимый адрес IP, он отклонён в процессе добавления в список запрещённых адресов. - - - - + Anonymous mode [%1] Анонимный режим [%1] - + Unable to decode '%1' torrent file. - Не удалось декодировать торрент-файл «%1». + Не удалось декодировать торрент-файл '%1'. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' - Рекурсивная загрузка файла «%1», встроенного в торрент «%2» + Рекурсивная загрузка файла '%1', встроенного в торрент '%2' - + Queue positions were corrected in %1 resume files - Позиции в очереди были исправлены в %1 файлах возобновления + - + Couldn't save '%1.torrent' - Не удалось сохранить «%1.torrent» + Не удалось сохранить '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - «%1» удалён из списка торрентов. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - «%1» удалён из списка торрентов и с диска. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - «%1» удалён из списка торрентов, но файлы не удалось удалить. Ошибка: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. потому что %1 отключён. - + because %1 is disabled. this peer was blocked because TCP is disabled. потому что %1 отключён. - + URL seed lookup failed for URL: '%1', message: %2 - Поиск адреса источника не удался: «%1», сообщение: «%2» + Поиск адреса источника не удался: '%1', сообщение: '%2' - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorent не смог прослушать порт %2/%3 на интерфейсе %1. Причина: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' был удалён из списка торрентов и с диска. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' был удалён из списка торрентов. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... - Загружается «%1», пожалуйста, подождите… + Загружается '%1', подождите… - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 - qBittorrent пытается прослушать порт %1 на всех интерфейсах + qBittorrent пытается использовать порт %1 - + The network interface defined is invalid: %1 Указанный сетевой интерфейс недоступен: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 - qBittorrent пытается прослушать порт %2 на интерфейсе %1 - - - - Peer ID: - ID пира: + qBittorrent пытается использовать порт %2 на интерфейсе %1 - - HTTP User-Agent is '%1' - HTTP User-Agent: %1 - - - - + DHT support [%1] Поддержка DHT [%1] - - - - - - - - - + + + + ON ВКЛ - - - - - - - - - + + + + OFF - ОТКЛ + ВЫКЛ - - + Local Peer Discovery support [%1] Обнаружение локальных пиров [%1] - - PeX support [%1] - Поддержка PeX [%1] - - - - '%1' reached the maximum ratio you set. Removed. - «%1» достиг установленного вами максимального рейтинга и теперь удалён. - - - - '%1' reached the maximum ratio you set. Paused. - «%1» достиг установленного вами максимального рейтинга и теперь остановлен. - - - - '%1' reached the maximum seeding time you set. Removed. - «%1» достиг установленного вами максимального времени раздачи и теперь удалён. + Restart is required to toggle Tracker Exchange support + Необходим перезапуск для включения обмена трекерами - - '%1' reached the maximum seeding time you set. Paused. - «%1» достиг установленного вами максимального времени раздачи и теперь остановлен. - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent не смог найти адрес %1 для прослушивания - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface - qBittorent не смог прослушать порт: %1. Причина: %2. + qBittorent не смог прослушать порт %1. Причина: %2. - + Tracker '%1' was added to torrent '%2' - Трекер «%1» добавлен в торрент «%2» + Трекер '%1' добавлен в торрент '%2' - + Tracker '%1' was deleted from torrent '%2' - Трекер «%1» удалён из торрента «%2» + Трекер '%1' удалён из торрента '%2' - + URL seed '%1' was added to torrent '%2' - Адрес источника «%1» добавлен в торрент «%2» + Адрес источника '%1' добавлен в торрент '%2' - + URL seed '%1' was removed from torrent '%2' - Адрес источника «%1» удалён из торрента «%2» + Адрес источника '%1' удалён из торрента '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. - Не удалось возобновить торрент «%1». + Не удалось возобновить торрент '%1'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - Указанный IP-фильтр успешно разобран: Применено %1 правил. + Указанный IP-фильтр был успешно разобран: применено %1 правил. - + Error: Failed to parse the provided IP filter. - Ошибка: Не удалось разобрать IP-фильтр. - - - - '%1' restored. - 'torrent name' restored. - «%1» восстановлен. + Ошибка: не удалось разобрать IP-фильтр. - + Couldn't add torrent. Reason: %1 Не удалось добавить торрент. Причина: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + %1 возобновлён (быстрое возобновление) + + + '%1' added to download list. 'torrent name' was added to download list. - «%1» добавлен в список загрузок. + '%1' добавлен в список загрузок. - + An I/O error occurred, '%1' paused. %2 - Ошибка ввода/вывода, «%1» остановлен. %2 + Ошибка ввода/вывода, '%1' остановлен. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 - UPnP/NAT-PMP: Проброс портов не удался с сообщением: %1 + Распределение портов UPnP/NAT-PMP не удалось с сообщением: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 - UPnP/NAT-PMP: Проброс портов прошёл успешно: %1 + Распределение портов UPnP/NAT-PMP прошло успешно: %1 - + due to IP filter. this peer was blocked due to ip filter. в соответствии с IP-фильтром. - + due to port filter. this peer was blocked due to port filter. в соответствии с фильтром портов. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. согласно ограничениям смешанного режима i2p. - + because it has a low port. this peer was blocked because it has a low port. - так как у него малый номер порта. + так как они имеют низкий порт. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 - qBittorrent успешно прослушивает порт %2/%3 на интерфейсе %1 + qBittorrent прослушивает порт %2/%3 на интерфейсе %1 успешно - + External IP: %1 e.g. External IP: 192.168.0.1 Внешний IP: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - создание нового торрента не удалось - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - Загружать с первой и последней части: %1, торрент: «%2» - - - - On - Вкл. - - - - Off - Откл. - - - - Successfully moved torrent: %1. New path: %2 - Торрент успешно перемещён: %1. Новый путь: %2 - - - + Could not move torrent: '%1'. Reason: %2 - Не удалось переместить торрент: «%1». Причина: %2 + Не удалось переместить торрент: '%1'. Причина: %2 - + File sizes mismatch for torrent '%1', pausing it. - Несоответствие размеров файлов для торрента «%1», остановка. + Несовпадение размеров файлов для торрента '%1', приостановка. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - Быстрое возобновление данных для торрента «%1» было отклонено. Причина: %2. Повтор проверки… + Быстрое восстановление данных для торрента '%1' было отклонено. Причина: %2. Повтор проверки… CategoryFilterModel - + Categories - Категории + Категории - + All - Все + Все - + Uncategorized - Без категории + @@ -1699,42 +1359,145 @@ Add category... - Добавить категорию… + Добавить категорию… Add subcategory... - Добавить подкатегорию… + - Edit category... - Изменить категорию… + Remove category + Удалить категорию + + + + Remove unused categories + Удалить неиспользуемые категории + + + + Resume torrents + + + + + Pause torrents + + + + + Delete torrents + + + + + New Category + Новая категория + + + + Category: + Категория: + + + + Invalid category name + Неправильное имя категории + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Все (0) + + + Uncategorized (0) + Без категории (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Без категории (%1) + + + Add category... + Добавить категорию… - Remove category - Удалить категорию + Удалить категорию - Remove unused categories - Удалить пустые категории + Удалить неиспользуемые категории - Resume torrents - Возобновить торренты + Возобновить торренты - Pause torrents - Остановить торренты + Остановить торренты - Delete torrents - Удалить торренты + Удалить торренты + + + New Category + Новая категория + + + Category: + Категория: + + + Invalid category name + Неправильное имя категории + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Имя категории не должно содержать '\'. +Имя категории не должно начинаться или заканчиваться '/'. +Имя категории не должно содержать '//'. + + + All (%1) + this is for the category filter + Все (%1) @@ -1742,7 +1505,7 @@ Manage Cookies - Управление куки (cookie) + Управление cookies @@ -1774,220 +1537,101 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Подтверждение удаления - - - - Remember choice - Запомнить выбор - - - - Also delete the files on the hard disk - Безвозвратно удалить загруженные файлы с диска - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - Вы уверены, что хотите удалить «%1» из списка торрентов? + Вы уверены, что хотите удалить '%1' из списка торрентов? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? Вы уверены, что хотите удалить %1 торрента из списка? - DownloadFromURLDialog - - - Download from URLs - Загрузить торренты по ссылкам - - - - Add torrent links - Добавьте ссылки на торренты - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - Одна на строку (ссылки HTTP, магнет-ссылки и хеш-суммы) - - - - Download - Загрузить - - - - No URL entered - Адрес не введён - - - - Please type at least one URL. - Пожалуйста, введите хотя бы один адрес. - - - DownloadedPiecesBar - + White: Missing pieces - Белый: Отсутствующие части + Белый: Отсутствуют файлы - + Green: Partial pieces - Зелёный: Неполные части + Зелёный: Отдельные части - + Blue: Completed pieces Синий: Завершённые части - ExecutionLogWidget + ExecutionLog - + General - Общий + Общие - + Blocked IPs - Запрещённые IP + Заблокированные IP - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - <font color='red'>%1</font> был запрещён %2 + <font color='red'>%1</font> был заблокирован %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - <font color='red'>%1</font> был запрещён + <font color='red'>%1</font> был заблокирован FeedListWidget - + RSS feeds RSS-каналы - - - Unread (%1) - Непрочитанные (%1) + + Unread + Непрочитанные FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. + + An error occured while trying to open the log file. Logging to file is disabled. Ошибка при открытии файла журнала. Журналирование в файл отключено. - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - - - - - &Browse... - Launch file dialog button text (full) - &Обзор… - - - - Choose a file - Caption for file open/save dialog - Выберите файл - - - - Choose a folder - Caption for directory open dialog - Выберите папку - - - - Any file - Любой файл - - - FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. + + + + I/O Error: Could not open ip filter file in read mode. Ошибка ввода-вывода: Не удалось открыть файл IP-фильтра в режиме чтения. - - - - IP filter line %1 is malformed. - Строка IP-фильтра %1 некорректна. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - Строка IP-фильтра %1 некорректна. Начальный IP из диапазона некорректен. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - Строка IP-фильтра %1 некорректна. Конечный IP из диапазона некорректен. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - Строка IP-фильтра %1 некорректна. Один IP в принадлежит IPv4, другой — IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - Строка IP-фильтра %1 выдала исключение: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - Произошло %1 дополнительных ошибок разбора IP-фильтра. - - - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. Ошибка разбора: Файл фильтра не является рабочим файлом PeerGuardian P2B. @@ -1995,396 +1639,472 @@ GeoIPDatabase - - + + Unsupported database file size. Неподдерживаемый размер файла данных. - + Metadata error: '%1' entry not found. - Ошибка метаданных: Запись «%1» не найдена. + Ошибка метаданных: запись '%1' не найдена. - + Metadata error: '%1' entry has invalid type. - Ошибка метаданных: Запись «%1» имеет неверный тип. + Ошибка метаданных: запись '%1' имеет неверный тип. - + Unsupported database version: %1.%2 Неподдерживаемая версия базы данных: %1.%2 - + Unsupported IP version: %1 Неподдерживаемая версия IP: %1 - + Unsupported record size: %1 Неподдерживаемый размер записи: %1 - + Invalid database type: %1 - Недопустимый тип базы данных: %1 + Неверный тип базы данных: %1 - + Database corrupted: no data section found. - База данных повреждена: Не найден раздел данных. + База данных повреждена: не найден раздел данных. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - Размер HTTP-запроса превышает ограничение, закрытия сокета. Ограничение: %ld, IP: %s + + File + Файл - - Bad Http request, closing socket. IP: %s - Неверный HTTP-запрос, закрытие сокета. IP: %s + + Edit + Правка - - - HttpServer - + + Help + Справка + + + Exit qBittorrent Выйти из qBittorrent - + Only one link per line - Только одна ссылка на строку + Только одна ссылка в строке - + + Download + Загрузить + + + Global upload rate limit must be greater than 0 or disabled. - Общее ограничение соотношения отдачи должно быть больше 0 или отключено. + Общее ограничение соотношения раздачи должно быть больше 0 или отключено. - + Global download rate limit must be greater than 0 or disabled. Общее ограничение соотношения загрузки должно быть больше 0 или отключено. - + Alternative upload rate limit must be greater than 0 or disabled. - Другое ограничение соотношения отдачи должно быть больше 0 или отключено. + Другое ограничение соотношения раздачи должно быть больше 0 или отключено. - + Alternative download rate limit must be greater than 0 or disabled. Другое ограничение соотношения загрузки должно быть больше 0 или отключено. - + Maximum active downloads must be greater than -1. Максимальное число активных загрузок должно быть больше -1. - + Maximum active uploads must be greater than -1. - Максимальное число активных отдач должно быть больше -1. + Максимальное число активных раздач должно быть больше -1. - + Maximum active torrents must be greater than -1. Максимальное число активных торрентов должно быть больше -1. - + Maximum number of connections limit must be greater than 0 or disabled. Максимальное число соединений должно быть больше 0 или отключено. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Максимальное число соединений на торрент должно быть больше 0 или отключено. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. - Максимальное число слотов отдачи на торрент должно быть больше 0 или отключено. + Максимальное число слотов раздачи на торрент должно быть больше 0 или отключено. - + Unable to save program preferences, qBittorrent is probably unreachable. Не удалось сохранить настройки, возможно, qBittorrent недоступен. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent на Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - Недопустимое название категории: -Пожалуйста, не используйте специальные символы в названии. - - - - Unknown - Неизвестный - - - - Hard Disk - Диск - - - - Share ratio limit must be between 0 and 9998. - Рейтинг должен быть в диапазоне от 0 до 9998. - - - - Seeding time limit must be between 0 and 525600 minutes. - Ограничение времени раздачи должно быть в диапазоне от 0 до 525600 минут. + + Language + Язык - + The port used for incoming connections must be between 1 and 65535. Порт для входящих соединений должен принимать значения от 1 до 65535. - + The port used for the Web UI must be between 1 and 65535. Порт для для веб-интерфейса должен принимать значения от 1 до 65535. - + Unable to log in, qBittorrent is probably unreachable. Не удалось войти, возможно, qBittorrent недоступен. - + Invalid Username or Password. Неверное имя пользователя или пароль. - - Username - Имя пользователя - - - + Password Пароль - + Login Войти - + + Upload Failed! + Загрузка не удалась! + + + Original authors Авторы - + + Upload limit: + Огр. отдачи: + + + + Download limit: + Огр. загрузки: + + + Apply Применить - + Add Добавить - + + Category: + Категория: + + + Upload Torrents Upload torrent files to qBittorent using WebUI - Отдавать торренты + Раздавать торренты - + + All + Все + + + + Downloading + Загружается + + + + Seeding + Раздаются + + + + Completed + Завершены + + + + Resumed + Возобновлены + + + + Paused + Остановлены + + + + Active + Активны + + + + Inactive + Неактивны + + + Save files to location: Путь сохранения по умолчанию: - + Cookie: - Куки (cookie): + Cookie: - + Type folder here Укажите папку здесь - + + Run an external program on torrent completion + Запустить внешнюю программу по окончании загрузки торрента + + + + Enable bandwidth management (uTP) + Включить управление полосой пропускания (uTP) + + + + Apply rate limit to uTP connections + Применять ограничения скорости к uTP-соединениям + + + + Alternative Global Rate Limits + Альтернативные ограничения скорости + + + More information - Подробнее + Дополнительные сведения - + Information about certificates Сведения о сертификатах - + Save Files to Сохранять файлы в - - Set location - Переместить - - - - Limit upload rate - Ограничение скорости отдачи + + Watch Folder + Отслеживаемая папка - - Limit download rate - Ограничение скорости загрузки + + Default Folder + Стандартная папка - - Rename torrent - Переименовать торрент + + from + from time1 to time2 + с - - Unable to create category - + + to + from time1 to time2 + до - + Other... Save Files to: Watch Folder / Default Folder / Other... Другой… - + + Every day + Schedule the use of alternative rate limits on ... + Каждый день + + + + Week days + Schedule the use of alternative rate limits on ... + Каждый будний день + + + + Week ends + Schedule the use of alternative rate limits on ... + Каждый выходной + + + Monday Schedule the use of alternative rate limits on ... Понедельник - + Tuesday Schedule the use of alternative rate limits on ... Вторник - + Wednesday Schedule the use of alternative rate limits on ... Среда - + Thursday Schedule the use of alternative rate limits on ... Четверг - + Friday Schedule the use of alternative rate limits on ... Пятница - + Saturday Schedule the use of alternative rate limits on ... Суббота - + Sunday Schedule the use of alternative rate limits on ... Воскресение - + + Downloaded + Is the file downloaded or not? + Загружен + + + Logout Выйти - + + Download from URLs + Загрузить торренты из URL-ссылок + + + Download Torrents from their URLs or Magnet links - Загрузить торренты по их адресам или магнет-ссылкам + Загружать торренты по их URL или magnet-ссылкам - + Upload local torrent Загрузить локальный торрент - + Are you sure you want to delete the selected torrents from the transfer list? Вы уверены, что хотите удалить выделенные торренты из списка? - + Save Сохранить - + qBittorrent client is not reachable - Клиент qBittorrent недоступен + клиент qBittorrent недоступен - - qBittorrent has been shutdown. - qBittorrent был выключен. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Список разрешённых подсетей + + HTTP Server + HTTP-сервер - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Пример: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Поддерживаются следующие параметры: - - Add subnet - Добавить подсеть + + Torrent path + Путь торрента - - Delete - Удалить + + Torrent name + Имя торрента - - Error - Ошибка + + qBittorrent has been shutdown. + qBittorrent был выключен. + + + LineEdit - - The entered subnet is invalid. - Введённая подсеть недопустима. + + Clear the text + Очистить текст LogListWidget - + Copy Копировать - + Clear Очистить @@ -2394,12 +2114,12 @@ &Edit - &Правка + П&равка &Tools - &Инструменты + Инс&трументы @@ -2417,2178 +2137,2005 @@ По &окончании загрузок - + &View &Вид - + &Options... &Настройки… - + &Resume &Возобновить - + Torrent &Creator &Создать торрент - + Set Upload Limit... Установить ограничение отдачи… - + Set Download Limit... Установить ограничение загрузки… - + Set Global Download Limit... Ограничение загрузки… - + Set Global Upload Limit... Ограничение отдачи… - + Minimum Priority Низший приоритет - + Top Priority Высший приоритет - + Decrease Priority Понизить приоритет - + Increase Priority Повысить приоритет - - + + Alternative Speed Limits Другие ограничения скорости - + &Top Toolbar Панель &инструментов - + Display Top Toolbar Показывать панель инструментов - - Status &Bar - Панель &статуса - - - + S&peed in Title Bar - С&корость в заголовке + &Скорость в заголовке - + Show Transfer Speed in Title Bar Отображать текущую скорость в заголовке окна - + &RSS Reader - &Менеджер RSS + &RSS-менеджер - + Search &Engine &Поисковик - + L&ock qBittorrent &Заблокировать qBittorrent - + Do&nate! - По&жертвовать! + &Пожертвовать! - - Close Window - Закрыть окно - - - + R&esume All Воз&обновить все - + Manage Cookies... - Управление куки… + Управление cookies… - + Manage stored network cookies - Управление сохранёнными файлами куки + Управление сохранёнными сетевыми cookies - + Normal Messages Обычные сообщения - + Information Messages Информационные сообщения - + Warning Messages - Предупреждения + Предупреждающие сообщения - + Critical Messages Критичные сообщения - + &Log &Журнал - + &Exit qBittorrent &Выйти из qBittorrent - + &Suspend System - Перейти в &ждущий режим + &Перейти в ждущий режим - + &Hibernate System - Перейти в &спящий режим + &Перейти в спящий режим - + S&hutdown System &Выключить компьютер - + &Disabled &Ничего не делать - + &Statistics - С&татистика + &Статистика - + Check for Updates Проверить обновления - + Check for Program Updates Проверить наличие обновлений - + &About &О qBittorrent - + &Pause &Остановить - + &Delete &Удалить - + P&ause All О&становить все - + &Add Torrent File... &Добавить торрент-файл… - + Open Открыть - + E&xit &Выход - + Open URL - Открыть адрес + Открыть ссылку - + &Documentation &Документация - + Lock Заблокировать - - - + + + Show Показать - + Check for program updates Проверить наличие обновлений - + Add Torrent &Link... Добавить &ссылку на торрент… - + If you like qBittorrent, please donate! - Если вам нравится qBittorrent, пожалуйста, поддержите! + Если Вам нравится qBittorrent, пожалуйста, поддержите! - - + Execution Log - Журнал активности + Журнал выполнения - + Clear the password Удалить пароль - + Filter torrent list... Фильтр торрентов… - + &Set Password &Установить пароль - - Preferences - Настройки - - - + &Clear Password &Удалить пароль - + Transfers Торренты - - - qBittorrent is minimized to tray - qBittorrent свёрнут в трей - - - - - - This behavior can be changed in the settings. You won't be reminded again. - Это поведение можно поменять в настройках. Больше это уведомление показываться не будет. - - - + Torrent file association - Ассоциация торрент-файлов + Ассоциации торрент-файлов - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? - qBittorrent сейчас не является стандартным приложением для торрент-файлов или магнет-ссылок. -Хотите привязать торрент-файлы и магнет-ссылки к qBittorrent? + qBittorrent сейчас не является приложением по умолчанию для открытия торрент-файлов или magnet-ссылок. +Хотите ли Вы открывать торрент-файлы и magnet-ссылки с помощью qBittorrent? - + Icons Only Только значки - + Text Only Только текст - + Text Alongside Icons - Текст сбоку от значков + Текст рядом со значками - + Text Under Icons Текст под значками - + Follow System Style - Использовать стиль системы + Использовать стиль ОС - - - + + + UI lock password Пароль блокировки интерфейса - - - + + + Please type the UI lock password: Пожалуйста, введите пароль блокировки интерфейса: - + The password should contain at least 3 characters Пароль должен содержать минимум 3 символа - + Password update Обновить пароль - + The UI lock password has been successfully updated Пароль блокировки интерфейса был успешно обновлён - + Are you sure you want to clear the password? Вы уверены, что хотите удалить пароль? - - Use regular expressions - Использовать регулярные выражения - - - + Search Поиск - + Transfers (%1) Торренты (%1) - + Error Ошибка - + Failed to add torrent: %1 Не удалось добавить торрент: %1 - + Torrent added Торрент добавлен - + '%1' was added. e.g: xxx.avi was added. - «%1» был добавлен. + '%1' был добавлен. - + Download completion - Загрузка завершена + Завершение загрузок - + I/O Error i.e: Input/Output Error Ошибка ввода/вывода - + Recursive download confirmation Подтверждение рекурсивной загрузки - + Yes Да - + No Нет - + Never Никогда - + Global Upload Speed Limit - Ограничение скорости отдачи + Общее ограничение скорости отдачи - + Global Download Speed Limit - Ограничение скорости загрузки - - - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent был обновлён и нуждается в перезапуске для применения изменений. - - - - qBittorrent is closed to tray - qBittorrent закрыт в трей - - - - Some files are currently transferring. - Некоторые файлы сейчас раздаются. - - - - Are you sure you want to quit qBittorrent? - Вы действительно хотите выйти из qBittorrent? + Общее ограничение скорости загрузки - + &No &Нет - + &Yes &Да - + &Always Yes &Всегда да - - %1/s - s is a shorthand for seconds - %1/с - - - - Couldn't determine your Python version. Search engine disabled. - Не удалось определить вашу версию Python. Поисковик отключён. - - - + Old Python Interpreter Старый интерпретатор Python - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - Ваша версия Python %1 устарела. Пожалуйста, обновитесь до последней версии для использования поисковых плагинов. -Требуются как минимум 2.7.9 или 3.3.0. + Ваша версия Python %1 устарела. Пожалуйста, обновитесь до последней версии для использования поисковиков. Требуются как минимум 2.7.9 или 3.3.0. - + qBittorrent Update Available - Обновление qBittorrent + Доступно обновление qBittorrent - + + A new version is available. +Do you want to download %1? + Доступна новая версия. +Хотите скачать %1? + + + Already Using the Latest qBittorrent Version Используется последняя версия qBittorrent - + Undetermined Python version Версия Python не определена - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. - Завершена загрузка «%1». + Загрузка '%1' завершена. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. Reason: disk is full. - Произошла ошибка ввода/вывода для торрента «%1». + Произошла ошибка ввода/вывода для торрента '%1'. Причина: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? - Торрент «%1» содержит торрент-файлы, хотите ли вы приступить к их загрузке? + Торрент '%1' содержит торрент-файлы, хотите ли Вы приступить к их загрузке? - + Couldn't download file at URL '%1', reason: %2. - Не удалось загрузить файл по адресу: «%1», причина: %2. + Не удалось загрузить файл по ссылке: '%1', причина: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin Python найден в %1: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + Не удалось определить Вашу версию Python (%1). Поисковик выключен. + + + + Missing Python Interpreter Отсутствует интерпретатор Python - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? - Для использования поисковика требуется Python, но он, видимо, не установлен. + Для использования поисковика требуется Python, но, видимо, он не установлен. Хотите установить его сейчас? - + Python is required to use the search engine but it does not seem to be installed. Для использования поисковика требуется Python, но он, видимо, не установлен. - - A new version is available. - Доступна новая версия. - - - - Do you want to download %1? - Хотите скачать %1? - - - - Open changelog... - Открыть список изменений… - - - + No updates available. You are already using the latest version. Обновлений нет. Вы используете последнюю версию программы. - + &Check for Updates &Проверить обновления - + Checking for Updates... Проверка обновлений… - + Already checking for program updates in the background Проверка обновлений уже выполняется - + Python found in '%1' - Python найден в «%1» + Python найден в '%1' - + Download error Ошибка при загрузке - + Python setup could not be downloaded, reason: %1. Please install it manually. Установщик Python не может быть загружен по причине: %1. Пожалуйста, установите его вручную. - - + + Invalid password - Недопустимый пароль + Неверный пароль - - - + + RSS (%1) RSS (%1) - + URL download error - Ошибка при загрузке адреса + Ошибка при загрузке ссылки - + The password is invalid - Недопустимый пароль + Неверный пароль - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Загрузка: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Отдача: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [З: %1, О: %2] qBittorrent %3 - + Hide Скрыть - + Exiting qBittorrent Завершение работы qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Некоторые торренты сейчас активны. +Вы уверены, что хотите выйти из qBittorrent? + + + Open Torrent Files Открыть торрент-файлы - + Torrent Files Торрент-файлы - + Options were saved successfully. - Настройки успешно сохранены. + Настройки были успешно сохранены. Net::DNSUpdater - + Your dynamic DNS was successfully updated. Ваш динамический DNS был успешно обновлён. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. - Ошибка динамического DNS: Служба временно недоступна. Повтор попытки соединения через 30 минут. + Ошибка динамического DNS: служба временно недоступна. Повтор попытки соединения через 30 минут. - + Dynamic DNS error: hostname supplied does not exist under specified account. - Ошибка динамического DNS: Предоставленное имя хоста не существует в указанной учётной записи. + Ошибка динамического DNS: предоставленное имя хоста не существует в указанной учетной записи. - + Dynamic DNS error: Invalid username/password. - Ошибка динамического DNS: Неверное имя пользователя или пароль. + Ошибка динамического DNS: неверный логин или пароль. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. - Ошибка динамического DNS: qBittorrent внесён службой в чёрный список. Пожалуйста, сообщите об ошибке на http://bugs.qbittorrent.org. + Ошибка Dynamic DNS: qBittorrent внесён службой в чёрный список. Пожалуйста, сообщите об ошибке на http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. - Ошибка динамического DNS: Служба вернула %1. Пожалуйста, сообщите об ошибке на http://bugs.qbittorrent.org. + Ошибка динамического DNS: служба вернула %1. Пожалуйста, сообщите об ошибке на http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. - Ошибка динамического DNS: Ваша учётная запись была заблокирована из-за злоупотребления. + Ошибка динамического DNS: Ваша учетная запись была заблокирована из-за злоупотребления. - + Dynamic DNS error: supplied domain name is invalid. Ошибка динамического DNS: предоставленное доменное имя неверно. - + Dynamic DNS error: supplied username is too short. - Ошибка динамического DNS: Предоставленное имя пользователя слишком короткое. + Ошибка динамического DNS: предоставленное имя пользователя слишком короткое. - + Dynamic DNS error: supplied password is too short. - Ошибка динамического DNS: Предоставленный пароль слишком короткий. + Ошибка динамического DNS: предоставленный пароль слишком короткий. Net::DownloadHandler - + I/O Error Ошибка ввода/вывода - + The file size is %1. It exceeds the download limit of %2. - Размер файла — %1, что превышает ограничение загрузки %2. + Размер файла - %1, что превышает ограничение загрузки %2. - + Unexpected redirect to magnet URI. - Неожиданная переадресация к магнет-ссылке. + Неожиданная переадресация к magnet-ссылке. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - Удалённый хост не был найден (неверное имя хоста) + + + GeoIP database loaded. Type: %1. Build time: %2. + База данных GeoIP загружена. Тип: %1. Время построения: %2. - - The operation was canceled - Операция была отменена + + + Couldn't load GeoIP database. Reason: %1 + Не удалось загрузить базу данных GeoIP. Причина: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - Удалённый сервер закрыл соединение, прежде чем весь ответ был принят и обработан + + Venezuela, Bolivarian Republic of + Венесуэла - - The connection to the remote server timed out - Время соединения с удалённым сервером истекло + + Viet Nam + Вьетнам - - SSL/TLS handshake failed - Соединение SSL/TLS не удалось + + + N/A + Н/Д - - The remote server refused the connection - Удалённый сервер отклонил соединение + + Andorra + Андорра - - The connection to the proxy server was refused - Прокси-сервер отклонил соединение + + United Arab Emirates + Объединённые Арабские Эмираты - - The proxy server closed the connection prematurely - Прокси-сервер преждевременно закрыл соединение + + Afghanistan + Афганистан - - The proxy host name was not found - Имя прокси-сервера не было найдено + + Antigua and Barbuda + Антигуа и Барбуда - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - Подключение к прокси-серверу истекло или прокси-сервер не ответил на запрос + + Anguilla + Ангилья - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - Прокси-сервер требует аутентификации, но не принял указанные учётные данные - - - - The access to the remote content was denied (401) - В доступе к внешним данным было отказано (401) - - - - The operation requested on the remote content is not permitted - Операция, запрошенная для внешних данных, не разрешена. - - - - The remote content was not found at the server (404) - Внешние данные не были найдены на сервере (404) - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - Удалённый сервер требует аутентификации для передачи данных, но указанные учётные данные не были приняты - - - - The Network Access API cannot honor the request because the protocol is not known - API сетевого доступа не может выполнить запрос, потому что протокол неизвестен - - - - The requested operation is invalid for this protocol - Запрошенная операция не поддерживается этим протоколом - - - - An unknown network-related error was detected - Обнаружена неизвестная сетевая ошибка - - - - An unknown proxy-related error was detected - Обнаружена неизвестная ошибка прокси-сервера - - - - An unknown error related to the remote content was detected - Обнаружена неизвестная ошибка внешних данных - - - - A breakdown in protocol was detected - Обнаружена ошибка в протоколе - - - - Unknown error - Неизвестная ошибка - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - База данных GeoIP загружена. Тип: %1. Время построения: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - Не удалось загрузить базу данных GeoIP. Причина: %1 - - - - Venezuela, Bolivarian Republic of - Венесуэла - - - - Viet Nam - Вьетнам - - - - - N/A - Н/Д - - - - Andorra - Андорра - - - - United Arab Emirates - Объединённые Арабские Эмираты - - - - Afghanistan - Афганистан - - - - Antigua and Barbuda - Антигуа и Барбуда + + Albania + Албания - Anguilla - Ангилья - - - - Albania - Албания - - - Armenia Армения - + Angola Ангола - + Antarctica Антарктида - + Argentina Аргентина - + American Samoa Американское Самоа - + Austria Австрия - + Australia Австралия - + Aruba Аруба - + Azerbaijan Азербайджан - + Bosnia and Herzegovina Босния и Герцеговина - + Barbados Барбадос - + Bangladesh Бангладеш - + Belgium Бельгия - + Burkina Faso Буркина-Фасо - + Bulgaria Болгария - + Bahrain Бахрейн - + Burundi Бурунди - + Benin Бенин - + Bermuda Бермудские острова - + Brunei Darussalam Бруней - + Brazil Бразилия - + Bahamas Багамские Острова - + Bhutan Бутан - + Bouvet Island Остров Буве - + Botswana Ботсвана - + Belarus Беларусь - + Belize Белиз - + Canada Канада - + Cocos (Keeling) Islands Кокосовые острова - + Congo, The Democratic Republic of the Демократическая Республика Конго - + Central African Republic Центральноафриканская Республика - + Congo Республика Конго - + Switzerland Швейцария - + Cook Islands Острова Кука - + Chile Чили - + Cameroon Камерун - + China Китай - + Colombia Колумбия - + Costa Rica Коста-Рика - + Cuba Куба - + Cape Verde Кабо-Верде - + Curacao Кюрасао - + Christmas Island Остров Рождества - + Cyprus Кипр - + Czech Republic Чехия - + Germany Германия - + Djibouti Джибути - + Denmark Дания - + Dominica Доминика - + Dominican Republic Доминиканская Республика - + Algeria Алжир - + Ecuador Эквадор - + Estonia Эстония - + Egypt Египет - + Western Sahara Западная Сахара - + Eritrea Эритрея - + Spain Испания - + Ethiopia Эфиопия - + Finland Финляндия - + Fiji Фиджи - + Falkland Islands (Malvinas) Фолклендские острова - + Micronesia, Federated States of Федеративные Штаты Микронезии - + Faroe Islands Фарерские острова - + France Франция - + Gabon Габон - + United Kingdom Великобритания - + Grenada Гренада - + Georgia Грузия - + French Guiana Французская Гвиана - + Ghana Гана - + Gibraltar Гибралтар - + Greenland Гренландия - + Gambia Гамбия - + Guinea Гвинея - + Guadeloupe Гваделупа - + Equatorial Guinea Экваториальная Гвинея - + Greece Греция - + South Georgia and the South Sandwich Islands Южная Георгия и Южные Сандвичевы Острова - + Guatemala Гватемала - + Guam Гуам - + Guinea-Bissau Гвинея-Бисау - + Guyana Гайана - + Hong Kong Гонконг - + Heard Island and McDonald Islands Остров Херд и острова Макдональд - + Honduras Гондурас - + Croatia Хорватия - + Haiti Гаити - + Hungary Венгрия - + Indonesia Индонезия - + Ireland Ирландия - + Israel Израиль - + India Индия - + British Indian Ocean Territory Британская территория в Индийском океане - + Iraq Ирак - + Iran, Islamic Republic of Иран - + Iceland Исландия - + Italy Италия - + Jamaica Ямайка - + Jordan Иордания - + Japan Япония - + Kenya Кения - + Kyrgyzstan Киргизия - + Cambodia Камбоджа - + Kiribati Кирибати - + Comoros Коморы - + Saint Kitts and Nevis Сент-Китс и Невис - + Korea, Democratic People's Republic of Корейская Народно-Демократическая Республика - + Korea, Republic of Республика Корея - + Kuwait Кувейт - + Cayman Islands Острова Кайман - + Kazakhstan Казахстан - + Lao People's Democratic Republic Лаос - + Lebanon Ливан - + Saint Lucia Сент-Люсия - + Liechtenstein Лихтенштейн - + Sri Lanka Шри-Ланка - + Liberia Либерия - + Lesotho Лесото - + Lithuania Литва - + Luxembourg Люксембург - + Latvia Латвия - + Morocco Марокко - + Monaco Монако - + Moldova, Republic of Молдавия - + Madagascar Мадагаскар - + Marshall Islands Маршалловы Острова - + Mali Мали - + Myanmar Мьянма - + Mongolia Монголия - + Northern Mariana Islands Северные Марианские острова - + Martinique Мартиника - + Mauritania Мавритания - + Montserrat Монтсеррат - + Malta Мальта - + Mauritius Маврикий - + Maldives Мальдивы - + Malawi Малави - + Mexico Мексика - + Malaysia Малайзия - + Mozambique Мозамбик - + Namibia Намибия - + New Caledonia Новая Каледония - + Niger Нигер - + Norfolk Island Остров Норфолк - + Nigeria Нигерия - + Nicaragua Никарагуа - + Netherlands Нидерланды - + Norway Норвегия - + Nepal Непал - + Nauru Науру - + Niue Ниуэ - + New Zealand Новая Зеландия - + Oman Оман - + Panama Панама - + Peru Перу - + French Polynesia Французская Полинезия - + Papua New Guinea Папуа — Новая Гвинея - + Philippines Филиппины - + Pakistan Пакистан - + Poland Польша - + Saint Pierre and Miquelon Сен-Пьер и Микелон - + Puerto Rico Пуэрто-Рико - + Portugal Португалия - + Palau Палау - + Paraguay Парагвай - + Qatar Катар - + Reunion Реюньон - + Romania Румыния - + Russian Federation Российская Федерация - + Rwanda Руанда - + Saudi Arabia Саудовская Аравия - + Solomon Islands Соломоновы Острова - + Seychelles Сейшельские Острова - + Sudan Судан - + Sweden Швеция - + Singapore Сингапур - + Slovenia Словения - + Svalbard and Jan Mayen Шпицберген и Ян-Майен - + Slovakia Словакия - + Sierra Leone Сьерра-Леоне - + San Marino Сан-Марино - + Senegal Сенегал - + Somalia Сомали - + Suriname Суринам - + Sao Tome and Principe Сан-Томе и Принсипи - + El Salvador Сальвадор - + Syrian Arab Republic Сирия - + Swaziland Свазиленд - + Turks and Caicos Islands Теркс и Кайкос - + Chad Чад - + French Southern Territories Французские Южные и Антарктические территории - + Togo Того - + Thailand - Таиланд + Thailand - + Tajikistan Таджикистан - + Tokelau Токелау - + Turkmenistan Туркмения - + Tunisia Тунис - + Tonga Тонга - - Could not decompress GeoIP database file. - Не удалось распаковать файл базы данных GeoIP. - - - + Timor-Leste Восточный Тимор - + Bolivia, Plurinational State of Боливия - + Bonaire, Sint Eustatius and Saba Бонэйр, Синт-Эстатиус и Саба - + Cote d'Ivoire Кот-д’Ивуар - + Libya Ливия - + Saint Martin (French part) Сен-Мартен (Франция) - + Macedonia, The Former Yugoslav Republic of Македония - + Macao Макао - + Pitcairn Питкэрн - + Palestine, State of Палестина - + Saint Helena, Ascension and Tristan da Cunha Острова Святой Елены, Вознесения и Тристан-да-Кунья - + South Sudan Южный Судан - + Sint Maarten (Dutch part) Синт-Мартен - + Turkey Турция - + Trinidad and Tobago Тринидад и Тобаго - + Tuvalu Тувалу - + Taiwan Тайвань - + Tanzania, United Republic of Танзания - + Ukraine Украина - + Uganda Уганда - + United States Minor Outlying Islands Внешние малые острова США - + United States Соединённые Штаты Америки - + Uruguay Уругвай - + Uzbekistan Узбекистан - + Holy See (Vatican City State) Ватикан - + Saint Vincent and the Grenadines Сент-Винсент и Гренадины - + Virgin Islands, British Британские Виргинские острова - + Virgin Islands, U.S. Виргинские Острова, США - + Vanuatu Вануату - + Wallis and Futuna Уоллис и Футуна - + Samoa Самоа - + Yemen Йемен - + Mayotte Майотта - + Serbia Сербия - + South Africa Южно-Африканская Республика - + Zambia Замбия - + Montenegro Черногория - + Zimbabwe Зимбабве - + Aland Islands Аландские острова - + Guernsey Гернси - + Isle of Man Остров Мэн - + Jersey Джерси - + Saint Barthelemy Сен-Бартелеми - + + Could not uncompress GeoIP database file. + Не удалось распаковать файл базы данных GeoIP. + + + Couldn't save downloaded GeoIP database file. Не удалось сохранить загруженный файл базы данных GeoIP. - + Successfully updated GeoIP database. База данных GeoIP успешно обновлена. - + Couldn't download GeoIP database file. Reason: %1 Не удалось загрузить файл базы данных GeoIP. Причина: %1 @@ -4596,1300 +4143,1098 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] - Поддержка UPnP / NAT-PMP [ВКЛ] + Поддержка UPnP / NAT-PMP [Вкл] - + UPnP / NAT-PMP support [OFF] - Поддержка UPnP / NAT-PMP [ОТКЛ] + Поддержка UPnP / NAT-PMP [Выкл] Net::Smtp - + Email Notification Error: - Ошибка оповещения по эл. почте: + Ошибка оповещения по e-mail: OptionsDialog - + Options Настройки - + Behavior Поведение - + Downloads Загрузки - + Connection Соединение - + Speed Скорость - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI Веб-интерфейс - + Advanced Дополнительно - + Language Язык - + User Interface Language: Язык интерфейса: - + (Requires restart) (требуется перезапуск) - + Transfer List Список торрентов - + Confirm when deleting torrents Подтверждать удаление торрентов - + Use alternating row colors In transfer list, one every two rows will have grey background. Использовать чередующиеся цвета строк - + Hide zero and infinity values Скрывать нулевые и бесконечные значения - + Always Всегда - + Paused torrents only Только для остановленных - + Action on double-click Действие по двойному щелчку - + Downloading torrents: Загружаемые торренты: - - + + Start / Stop Torrent - Запустить / остановить торрент + Запустить / Остановить торрент - - + + Open destination folder Открыть папку назначения - - + + No action Нет действия - + Completed torrents: Завершённые торренты: - + Desktop Настройки интерфейса - + Start qBittorrent on Windows start up Запускать qBittorrent вместе с Windows - + Show splash screen on start up - Показывать заставку при запуске + Показать заставку при запуске - + Start qBittorrent minimized Запускать qBittorrent свёрнутым - + Confirmation on exit when torrents are active Подтверждать выход при наличии активных торрентов - + Confirmation on auto-exit when downloads finish Подтверждать автовыход по окончании загрузок - - KiB - КБ - - - - Email notification &upon download completion - Сообщать об окончании &загрузки по эл. почте - - - - Run e&xternal program on torrent completion - Запустить &внешнюю программу по окончании загрузки торрента - - - - IP Fi&ltering - &Фильтрация по IP - - - - Schedule &the use of alternative rate limits - &Запланировать использование других ограничений скорости - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Подробнее</a>) - - - - &Torrent Queueing - &Очерёдность торрентов - - - - Seed torrents until their seeding time reaches - Раздавать торренты, пока их время раздачи не достигнет - - - - A&utomatically add these trackers to new downloads: - Авто&матически добавлять эти трекеры к новым загрузкам: - - - - RSS Reader - Менеджер RSS - - - - Enable fetching RSS feeds - Включить загрузку RSS-каналов - - - - Feeds refresh interval: - Интервал обновления каналов: - - - - Maximum number of articles per feed: - Максимальное число статей на канал: - - - - - min - minutes - мин - - - - RSS Torrent Auto Downloader - Автозагрузчик торрентов из RSS - - - - Enable auto downloading of RSS torrents - Включить автозагрузку торрентов из RSS - - - - Edit auto downloading rules... - Изменить правила автозагрузки… - - - - Web User Interface (Remote control) - Веб-интерфейс (удалённое управление) - - - - IP address: - IP-адрес: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - IP-адрес, к которому будет привязан веб-интерфейс. -Укажите адрес IPv4 или IPv6. Вы можете указать «0.0.0.0» для любого IPv4-адреса, -«::» для любого IPv6-адреса, или «*» для обоих IPv4 и IPv6. - - - - Server domains: - Домены сервера: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - Белый список фильтра заголовков HTTP-хоста. -В целях защиты от атаки DNS, вы должны указать -доменные имена сервера веб-интерфейса. - -Используйте «;» для разделения имён. Допустимы шаблоны типа «*». - - - - &Use HTTPS instead of HTTP - &Использовать HTTPS вместо HTTP - - - - Bypass authentication for clients on localhost - Пропускать аутентификацию клиентов для localhost - - - - Bypass authentication for clients in whitelisted IP subnets - Пропускать аутентификацию клиентов для разрешённых подсетей - - - - IP subnet whitelist... - Разрешённые подсети… - - - - Upda&te my dynamic domain name - О&бновлять динамическое доменное имя + + Show qBittorrent in notification area + Показывать qBittorrent в области уведомлений - + Minimize qBittorrent to notification area - Сворачивать qBittorrent в область уведомлений + Сворачивать qBittorrent в область уведомлений - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. - Закрывать qBittorrent в область уведомлений + Закрывать qBittorrent в область уведомлений - + Tray icon style: Стиль значка в трее: - + Normal Обычный - + Monochrome (Dark theme) Монохромный (тёмная тема) - + Monochrome (Light theme) Монохромный (светлая тема) - + File association Ассоциации файлов - + Use qBittorrent for .torrent files Использовать qBittorrent для торрент-файлов - + Use qBittorrent for magnet links - Использовать qBittorrent для магнет-ссылок + Использовать qBittorrent для magnet-ссылок - + Power Management Управление питанием - + + Inhibit system sleep when torrents are active + Запретить спящий режим при наличии активных торрентов + + + + Log file + Файл журнала + + + Save path: Путь: - + Backup the log file after: Создавать резервную копию после: - + + MB + МБ + + + Delete backup logs older than: Удалять резервные копии старше: - + days Delete backup logs older than 10 months дней - + months Delete backup logs older than 10 months месяцев - + years Delete backup logs older than 10 years года/лет - + When adding a torrent При добавлении торрента - + + Display torrent content and some options + Отображать содержимое торрента и дополнительные настройки + + + Bring torrent dialog to the front Выводить окно добавления торрента поверх остальных окон - + Do not start the download automatically The torrent will be added to download list in pause state Не начинать загрузку автоматически - + Should the .torrent file be deleted after adding it - Удалять торрент-файл после успешного добавления в очередь + Удалять торрент-файл после его успешного добавления в очередь + + + + Delete .torrent files afterwards + Удалять торрент-файлы после добавления - + Also delete .torrent files whose addition was cancelled - Удалять торрент-файлы, добавление которых было отменено + Также удалять торрент-файлы, добавление которых было отменено - + Also when addition is cancelled - Удалять торрент-файл после отмены добавления + Также удалять торрент-файл, когда добавление отменено - + Warning! Data loss possible! Внимание! Возможна потеря данных! - + Saving Management Управление сохранением - + Default Torrent Management Mode: Режим управления торрентом по умолчанию: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - Автоматический режим подбирает настройки торрентов (напр. путь сохранения) в зависимости от их категории + Автоматический режим выбирает настройки торрентов (напр. путь сохранения) в зависимости от их категории - + Manual Ручной - + Automatic Автоматический - + When Torrent Category changed: При изменении категории торрента: - + Relocate torrent Переместить торрент - + Switch torrent to Manual Mode Переключить торрент в Ручной режим - + When Default Save Path changed: При изменении пути сохранения по умолчанию: - - + + Relocate affected torrents Переместить затронутые торренты - - + + Switch affected torrents to Manual Mode Переключить затронутые торренты в Ручной режим - + When Category changed: При изменении категории: - + Use Subcategories Использовать подкатегории - + Default Save Path: Путь сохранения по умолчанию: - + Keep incomplete torrents in: Хранить незавершённые торренты в: - + Copy .torrent files to: Копировать торрент-файлы в: - - Show &qBittorrent in notification area - Показывать &qBittorrent в области уведомлений - - - - &Log file - &Файл журнала - - - - Display &torrent content and some options - Отображать содержимое &торрента и некоторые настройки - - - - Create subfolder for torrents with multiple files - Создать подпапку для торрентов с множеством файлов - - - - De&lete .torrent files afterwards - У&далять торрент-файлы после добавления - - - + Copy .torrent files for finished downloads to: Копировать торрент-файлы завершённых загрузок в: - + Pre-allocate disk space for all files Предварительно резервировать место для всех файлов - - Inhibit system sleep when torrents are downloading - Запретить спящий режим, когда торренты загружаются - - - - Inhibit system sleep when torrents are seeding - Запретить спящий режим, когда торренты раздаются - - - + Append .!qB extension to incomplete files - Добавлять расширение .!qB к незавершённым файлам - - - - Enable recursive download dialog - Включить окно рекурсивной загрузки + Добавить расширение .!qB к незавершённым файлам - + Automatically add torrents from: Автоматически добавлять торренты из: - + Add entry Добавить запись - + Remove entry Удалить запись - + + Email notification upon download completion + Сообщать об окончании загрузки по почте + + + + Destination email: + E-mail получателя: + + + SMTP server: SMTP-сервер: - + This server requires a secure connection (SSL) Этот сервер требует защищённого соединения (SSL) - - + + + Authentication Аутентификация - - - - + + + + Username: Имя пользователя: - - - - + + + + Password: Пароль: - - Enabled protocol: - Задействовать протокол: - - - - TCP and μTP - TCP и μTP + + Run external program on torrent completion + Запустить внешнюю программу по окончании загрузки торрента - + Listening Port Прослушиваемый порт - + Port used for incoming connections: Порт для входящих соединений: - + Random Случайный - + Use UPnP / NAT-PMP port forwarding from my router - Использовать UPnP / NAT-PMP маршрутизатора + Использовать UPnP / NAT-PMP моего маршрутизатора - + Use different port on each startup Использовать случайный порт при запуске - + Connections Limits Ограничения соединений - + Maximum number of connections per torrent: - Максимальное число соединений на торрент: + Максимальное число соединений на торрент: - + Global maximum number of connections: Общее ограничение числа соединений: - + Maximum number of upload slots per torrent: - Максимальное число слотов отдачи на торрент: + Максимальное число слотов отдачи на торрент: - + Global maximum number of upload slots: Общее ограничение слотов отдачи: - + Proxy Server Прокси-сервер - + Type: Тип: - + (None) (нет) - + SOCKS4 SOCKS4 - + SOCKS5 - SOCKS5 + Сервер SOCKS5 - + HTTP HTTP - + Host: Хост: - - + + Port: Порт: - + Otherwise, the proxy server is only used for tracker connections Иначе прокси-сервер используется только для соединения с трекерами - + Use proxy for peer connections Использовать прокси для соединения с пирами - + Disable connections not supported by proxies Не использовать протоколы, неподдерживаемые прокси-сервером - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Подробнее</a>) - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection RSS-каналы, поисковики, обновления программы и прочее, что не относится к передаче торрентов (например, обмен пирами), будут использовать прямое соединение - + Use proxy only for torrents Использовать прокси только для торрентов - - A&uthentication - &Аутентификация + + Info: The password is saved unencrypted + Информация: пароль будет сохранён в незашифрованном виде - - Info: The password is saved unencrypted - Примечание: Пароль будет сохранён в нешифрованном виде + + IP Filtering + Фильтрация по IP - + Filter path (.dat, .p2p, .p2b): Путь к фильтрам (.dat, .p2p, .p2b): - + Reload the filter Перезагрузить фильтр - - Manually banned IP addresses... - Адреса IP, запрещённые вручную… - - - + Apply to trackers Применить к трекерам - + Global Rate Limits Общие ограничения скорости - - - - - - - KiB/s - КБ/с - - - - + + Upload: Отдача: - - + + + + + KiB/s + КБ/с + + + + Download: Загрузка: - + Alternative Rate Limits Другие ограничения скорости - - + + Schedule the use of alternative rate limits + Запланировать использование других ограничений скорости + + + From: from (time1 to time2) - От: + С: - - + To: time1 to time2 До: - + When: Когда: - + Every day Каждый день - + Weekdays Будни - + Weekends Выходные - + Rate Limits Settings - Настройки ограничений скорости + Настройки ограничения скорости - + Apply rate limit to peers on LAN Применять ограничения скорости к локальным пирам - + Apply rate limit to transport overhead Применять ограничения скорости к служебному трафику - - + + + Enable µTP protocol + Задействовать протокол µTP + + + Apply rate limit to µTP protocol Применять ограничения скорости к протоколу µTP - + Privacy Приватность - + Enable DHT (decentralized network) to find more peers - Включить DHT (децентрализованную сеть) для поиска пиров + Включить DHT (децентрализованную сеть), чтобы найти больше пиров - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - Обмен пирами с совместимыми клиентами Bittorrent (µTorrent, Vuze, …) + Обмен пирами с совместимыми клиентами Bittorrent (µTorrent, Vuze, …) - + Enable Peer Exchange (PeX) to find more peers - Включить обмен пирами (PeX) + Включить обмен пирами (PeX), чтобы найти больше пиров - + Look for peers on your local network - Поиск пиров в локальной сети + Искать пиров в Вашей локальной сети - + Enable Local Peer Discovery to find more peers - Включить обнаружение локальных пиров + Включить обнаружение локальных пиров, чтобы найти больше пиров - + Encryption mode: Режим шифрования: - + Prefer encryption Предпочитать шифрование - + Require encryption Требовать шифрование - + Disable encryption Отключить шифрование - + Enable when using a proxy or a VPN connection Рекомендуется использовать при подключении через прокси или VPN - + Enable anonymous mode Включить анонимный режим - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Подробнее</a>) + + + + Torrent Queueing + Очерёдность торрентов + + + Maximum active downloads: Максимальное число активных загрузок: - + Maximum active uploads: - Максимальное число активных отдач: + Максимальное число активных раздач: - + Maximum active torrents: Максимальное число активных торрентов: - + Do not count slow torrents in these limits - Не учитывать медленные торренты в этих ограничениях - - - - Upload rate threshold: - Ограничение скорости отдачи - - - - Download rate threshold: - Ограничение скорости загрузки - - - - sec - seconds - с + Не учитывать количество медленных торрентов в этих ограничениях - - Torrent inactivity timer: - Таймер бездействия торрента: - - - + Share Ratio Limiting - Ограничение рейтинга раздачи + Ограничение коэффициента раздачи - + Seed torrents until their ratio reaches - Раздавать торренты, пока их рейтинг не достигнет + Раздавать торренты, пока их коэффициент не достигнет - + then затем - + Pause them Остановить - + Remove them Удалить - - RSS Smart Episode Filters - Умный фильтр эпизодов RSS + + Automatically add these trackers to new downloads: + Автоматически добавлять указанные трекеры к новым загрузкам: + + + + Enable Web User Interface (Remote control) + Включить веб-интерфейс (удалённое управление) - + Use UPnP / NAT-PMP to forward the port from my router - Использовать UPnP / NAT-PMP для проброса портов через маршрутизатор + Использовать UPnP / NAT-PMP для перенаправления портов через мой маршрутизатор - + + Use HTTPS instead of HTTP + Использовать HTTPS вместо HTTP + + + Certificate: Сертификат: - + Import SSL Certificate Импортировать сертификат SSL - + Key: Ключ: - + Import SSL Key Импортировать ключ SSL - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Сведения о сертификатах</a> - - - - Use alternative Web UI - Использовать альтернативный веб-интерфейс + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Информация о сертификатах</a> - - Files location: - Расположение файлов: + + Bypass authentication for localhost + Пропускать аутентификацию для localhost - - Enable clickjacking protection - Включить защиту от кликджекинга + + Update my dynamic domain name + Обновлять моё доменное имя - - Enable Cross-Site Request Forgery (CSRF) protection - Включить защиту от межсайтовой подделки запроса (CSRF) - - - + Service: Служба: - + Register Регистрация - + Domain name: Доменное имя: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - После включения этой настройки вы можете <strong>безвозвратно потерять</strong> свои торрент-файлы! + После включения данной настройки вы можете <strong>безвозвратно потерять</strong> свои торрент-файлы! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - Если эти параметры включены, qBittorrent будет <strong>удалять</strong> торрент-файлы после их успешного (первый параметр) или неуспешного (второй параметр) добавления в очередь загрузок. Это применяется не только для файлов, добавленных через меню &ldquo;Добавить торрент&rdquo;, но и для тех, что были открыты через <strong>файловую ассоциацию</strong> + Если данные параметры включены, qBittorrent будет <strong>удалять</strong> торрент-файлы после их успешного (первый параметр) или неуспешного (второй параметр) добавления в очередь загрузок. Это применяется не только для файлов, добавленных через меню &ldquo;Добавить торрент&rdquo;, но и для тех, что были открыты через <strong>файловую ассоциацию</strong> - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - Если включить второй параметр (&ldquo;а так же если добавление отменено&rdquo;) торрент-файл <strong>будет удалён</strong> даже если вы нажмёте на &ldquo;<strong>Отмену</strong>&rdquo; в окне &ldquo;Добавить торрент&rdquo; - - - - Choose Alternative UI files location - Использовать расположение файлов альтернативного интерфейса + Если включить второй параметр ( &ldquo;а так же если добавление отменено&rdquo;) торрент-файл <strong>будет удалён</strong> даже если вы нажмёте на &ldquo;<strong>Отмену</strong>&rdquo; в окне &ldquo;Добавить торрент&rdquo; - + Supported parameters (case sensitive): - Поддерживаемые параметры (с учётом регистра): + Поддерживаемые параметры (с учетом регистра): - + %N: Torrent name %N: Имя торрента - + %L: Category %L: Категория - - %G: Tags (seperated by comma) - %G: Метки (разделённые запятыми) - - - + %F: Content path (same as root path for multifile torrent) %F: Папка содержимого (та же, что и корневая папка для множественных торрентов) - + %R: Root path (first torrent subdirectory path) %R: Корневая папка (главный путь для подкаталога торрента) - + %D: Save path %D: Путь сохранения - + %C: Number of files %C: Количество файлов - + %Z: Torrent size (bytes) %Z: Размер торрента (в байтах) - + %T: Current tracker %T: Текущий трекер - + %I: Info hash - %I: Хеш-сумма + %I: Хеш - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - Подсказка: Включите параметр в кавычки для защиты от обрезки на пробелах (напр. "%N") - - - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - Торрент будет считаться медленным, если его скорость загрузки или отдачи станет меньше указанных значений на время «Таймера бездействия торрента» + Подсказка: включите парамерт в кавычки во избежание обрезки на пробелах (напр. "%N") - + Select folder to monitor - Выберите папку для наблюдения + Выберите папку для мониторинга - + Folder is already being monitored: - Папка уже наблюдается: + Папка уже мониторится: - + Folder does not exist: Папка не существует: - + Folder is not readable: Папка недоступна для чтения: - + Adding entry failed Добавление записи не удалось - - - - + + Choose export directory Выберите папку для экспорта - - - + + + + + + Choose a save directory Выберите путь сохранения - + Choose an IP filter file Укажите файл IP-фильтра - + All supported filters Все поддерживаемые фильтры - + SSL Certificate Сертификат SSL - + + SSL Key + Ключ SSL + + + Parsing error Ошибка разбора - + Failed to parse the provided IP filter - Не удалось разобрать указанный IP-фильтр + Не удалось разобрать данный IP-фильтр - + Successfully refreshed Успешно обновлён - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - Указанный IP-фильтр успешно разобран: Применено %1 правил. + Указанный IP-фильтр был успешно проанализирован: применено %1 правил. - + Invalid key Недействительный ключ - + This is not a valid SSL key. Это недействительный ключ SSL. - + Invalid certificate Недействительный сертификат - - Preferences - Настройки - - - - Import SSL certificate - Импортировать сертификат SSL - - - + This is not a valid SSL certificate. Это недействительный сертификат SSL. - - Import SSL key - Импортировать ключ SSL - - - - SSL key - Ключ SSL - - - + Time Error Ошибка времени - + The start time and the end time can't be the same. - Время начала и завершения не может быть одинаковым. + Время начала и завершения не могут быть одинаковыми. - - + + Length Error Ошибка размера - + The Web UI username must be at least 3 characters long. - Имя пользователя веб-интерфейса должно содержать не менее 3 символов. + Имя пользователя веб-интерфейса должно быть не менее 3 символов. - + The Web UI password must be at least 6 characters long. Пароль веб-интерфейса должен быть не менее 6 символов. @@ -5897,605 +5242,546 @@ PeerInfo - - Interested(local) and Choked(peer) - Заинтересованный (клиент) и Заглохший (пир) + + interested(local) and choked(peer) + заинтересованный (клиент) и блокированный (пир) - + interested(local) and unchoked(peer) - заинтересованный (клиент) и заглохший (пир) + заинтересованный (клиент) и разблокированный (пир) - + interested(peer) and choked(local) - заинтересованный (пир) и заглохший (клиент) + заинтересованный (пир) и блокированный (клиент) - + interested(peer) and unchoked(local) - заинтересованный (пир) и незаглохший (клиент) + заинтересованный (пир) и разблокированный (клиент) - + optimistic unchoke - оптимистичное разглушение + оптимистичная разблокировка - + peer snubbed - пренебрегающий пир + застопоренный пир - + incoming connection входящее соединение - + not interested(local) and unchoked(peer) - незаинтересованный (клиент) и незаглохший (пир) + незаинтересованный (клиент) и разблокированный (пир) - + not interested(peer) and unchoked(local) - незаинтересованный (пир) и незаглохший (клиент) + незаинтересованный (пир) и разблокированный (клиент) - + peer from PEX - пир из PEX + пир из PEX - + peer from DHT - пир из DHT + пир из DHT - + encrypted traffic шифрованное соединение - + encrypted handshake шифрованное рукопожатие - + peer from LSD - пир из LSD + пир из LSD PeerListWidget - + IP IP - + Port Порт - + Flags Флаги - + Connection Соединение - + Client i.e.: Client application Клиент - + Progress i.e: % downloaded Прогресс - + Down Speed i.e: Download speed Скорость загрузки - + Up Speed i.e: Upload speed Скорость отдачи - + Downloaded i.e: total data downloaded Загружено - + Uploaded i.e: total data uploaded Отдано - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. - Соответствие + Релевантность - + Files i.e. files that are being downloaded right now Файлы - + Column visibility Отображение колонок - + Add a new peer... Добавить нового пира… - - + + Ban peer permanently - Запретить пира навсегда + Заблокировать пира навсегда - + Manually adding peer '%1'... - Ручное добавление пира «%1»… + Ручное добавление пира '%1'… - + The peer '%1' could not be added to this torrent. - Пир «%1» не может быть добавлен к этому торренту. + Пир '%1' не может быть добавлен к этому торренту. - + Manually banning peer '%1'... - Ручная блокировка пира «%1»… + Ручная блокировка пира '%1'… - - + + Peer addition Добавление пира - + Country Страна - + Copy IP:port Копировать IP:порт - + Some peers could not be added. Check the Log for details. Некоторые пиры не могут быть добавлены. Смотрите журнал для получения подробной информации. - + The peers were added to this torrent. Пиры были добавлены к этому торренту. - + Are you sure you want to ban permanently the selected peers? - Вы уверены, что хотите навсегда запретить выделенных пиров? + Вы уверены, что хотите навсегда заблокировать выделенных пиров? - + &Yes &Да - + &No &Нет - PeersAdditionDialog + PeersAdditionDlg - - Add Peers - Добавить пиров - - - - List of peers to add (one IP per line): - Список пиров для добавления (один IP на строку): - - - - Format: IPv4:port / [IPv6]:port - Формат: IPv4:порт / [IPv6]:порт - - - + No peer entered Пир не введён - + Please type at least one peer. - Пожалуйста, введите хотя бы одного пира. + Пожалуйста, введите минимум одного пира. - + Invalid peer - Недопустимый пир + Неправильный пир - + The peer '%1' is invalid. - Недопустимый пир «%1». + Неправильный пир '%1'. PieceAvailabilityBar - + White: Unavailable pieces - Белый: Недоступные части + Белый: Отсутствуют части - + Blue: Available pieces - Синий: Доступные части + Синий: Части доступны PiecesBar - + Files in this piece: Файлы в данной части - + File in this piece Файл в данной части - + File in these pieces Файл в данных частях - - Wait until metadata become available to see detailed information - Чтобы увидеть информацию, дождитесь пока метаданные станут доступны - - - + Hold Shift key for detailed information - Зажмите Shift для расширенной информации + Зажмите клавишу Shift для просмотра расширенной информации - PluginSelectDialog + PluginSelectDlg - + Search plugins Поисковые плагины - + Installed search plugins: Установленные поисковые плагины: - + Name Имя - + Version Версия - + Url Ссылка - - + + Enabled Включён - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - Предупреждение: Обязательно соблюдайте законы об авторских правах вашей страны при загрузке торрентов из этих поисковых систем. - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> Вы можете скачать новые поисковые плагины по адресу: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one Установить новый - + Check for updates Проверить обновления - + Close Закрыть - + Uninstall Удалить - - - + + + Yes Да - - - - + + + + No Нет - + Uninstall warning Предупреждение об удалении - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. Некоторые плагины не могут быть удалены, так как включены в qBittorrent. -Удалить можно лишь те, что вы установили сами. +Удалены могут быть лишь те, что Вы установили сами. Тем не менее, эти плагины были отключены. - + Uninstall success - Успешно удалён + Успешно удалено - + All selected plugins were uninstalled successfully Все выбранные плагины были успешно удалены - - - - - Search plugin update - Обновление поисковых плагинов - - - - Plugins installed or updated: %1 - Установленные или обновлённые плагины: %1 - - - - + + New search engine plugin URL - Адрес нового поискового плагина + URL нового плагина поисковика - - + + URL: Адрес: - + Invalid link Неправильная ссылка - + The link doesn't seem to point to a search engine plugin. Ссылка не указывает на поисковый плагин. - + Select search plugins Выбрать поисковые плагины - + qBittorrent search plugin Поисковый плагин qBittorrent - + + + + Search plugin update + Обновление поисковых плагинов + + + All your plugins are already up to date. - Все ваши плагины имеют последние версии. + Все Ваши плагины имеют последние версии. - + Sorry, couldn't check for plugin updates. %1 Извините, не удалось проверить наличие обновлений плагинов. %1 - + + + Search plugin install Установка поискового плагина - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + Успешно установлен поисковый плагин "%1". + + + Couldn't install "%1" search engine plugin. %2 - Не удалось установить поисковый плагин «%1». %2 + Не удалось установить поисковый плагин "%1". %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + Успешно обновлён поисковый плагин "%1". + + + Couldn't update "%1" search engine plugin. %2 - Не удалось обновить поисковый плагин «%1». %2 + Не удалось обновить поисковый плагин "%1". %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source Источник плагина - + Search plugin source: Источник поискового плагина: - + Local file Локальный файл - + Web link - Веб-ссылка - - - - PowerManagement - - - qBittorrent is active - qBittorrent активен + Ссылка - PreviewSelectDialog - - - Preview - Предпросмотр - + PreviewSelect - + Name Имя - + Size Размер - + Progress Прогресс - - + + Preview impossible Предпросмотр невозможен - - + + Sorry, we can't preview this file Извините, предпросмотр этого файла невозможен - Private::FileLineEdit - - - '%1' does not exist - «%1» не существует - - - - '%1' does not point to a directory - «%1» не указывает на папку - - - - '%1' does not point to a file - «%1» не указывает на файл - - - - Does not have read permission in '%1' - Отсутствуют права для чтения в «%1» - - - - Does not have write permission in '%1' - Отсутствуют права для записи в «%1» - - - PropListDelegate - + Not downloaded Не загружено - - + + Normal Normal (priority) Обычный - - N/A - Н/Д - - - + Do not download Do not download (priority) - Не загружать + Не загружать - - + + High High (priority) Высокий - + N/A + Н/Д + + + Mixed Mixed (priorities Смешанный - - + + Maximum Maximum (priority) Максимальный @@ -6504,32 +5790,32 @@ PropTabBar - + General Общие - + Trackers Трекеры - + Peers Пиры - + HTTP Sources Веб-сиды - + Content Файлы - + Speed Скорость @@ -6623,29 +5909,29 @@ Комментарий: - + Select All Выбрать все - + Select None Отменить выбор - + Normal Обычный - + High Высокий Share Ratio: - Рейтинг: + Коэффициент: @@ -6665,7 +5951,7 @@ Pieces: - Части: + Частей: @@ -6675,12 +5961,12 @@ Added On: - Дата добавления: + Добавлен: Completed On: - Дата завершения: + Завершён: @@ -6698,165 +5984,165 @@ Путь сохранения: - + Maximum Максимальный + - Do not download Не загружать - + Never Никогда - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (из них есть %3) - - + + %1 (%2 this session) %1 (%2 за сеанс) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (раздаётся %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 макс.) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 всего) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 сред.) - + Open Открыть - + Open Containing Folder Открыть папку назначения - + Rename... Переименовать… - + Priority Приоритет - + New Web seed Новый веб-сид - + Remove Web seed - Удалить веб-сида + Удалить веб-сид - + Copy Web seed URL Копировать адрес веб-сида - + Edit Web seed URL Изменить адрес веб-сида - + + Rename the file + Переименовать файл + + + New name: Новое имя: - - + + + The file could not be renamed + Файл не может быть переименован + + + + This file name contains forbidden characters, please choose a different one. + Имя файла содержит недопустимые символы. Пожалуйста, выберите другое. + + + + This name is already in use in this folder. Please use a different name. - Файл с таким именем уже существует в этой папке. Пожалуйста, воспользуйтесь другим именем. + Файл с таким именем уже существует в этой папке. Используйте другое имя. - + The folder could not be renamed Папка не может быть переименована - + qBittorrent qBittorrent - + Filter files... Фильтр файлов… - - Renaming - Переименование - - - - - Rename error - Ошибка переименования - - - - The name is empty or contains forbidden characters, please choose a different one. - Пустое имя, или оно содержит запрещённые символы, пожалуйста, выберите другое. - - - + New URL seed New HTTP source - Новый адрес сида + Новый адрес раздачи - + New URL seed: - Новый адрес сида: + Новый адрес раздачи: - - + + This URL seed is already in the list. - Этот адрес сида уже есть в списке. + Этот адрес источника уже в списке. - + Web seed editing Редактирование веб-сида - + Web seed URL: Адрес веб-сида: @@ -6864,585 +6150,551 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + Ваш IP-адрес был заблокирован после слишком большого количества неудачных попыток аутентификации. + + + + Error: '%1' is not a valid torrent file. + + Ошибка: '%1' не является действительным торрент-файлом. + + + + + Error: Could not add torrent to session. + Ошибка: не удалось добавить торрент в сеанс. + + + + I/O Error: Could not create temporary file. + Ошибка ввода-вывода: невозможно создать временный файл. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. Неизвестный параметр командной строки %1. - - + + %1 must be the single command line parameter. %1 должен быть единственным параметром командной строки. - + + %1 must specify the correct port (1 to 65535). + %1 должен содержать корректный порт (с 1 до 65535). + + + You cannot use %1: qBittorrent is already running for this user. Нельзя использовать %1: qBittorrent уже выполняется для данного пользователя. - + Usage: Использование: - + Options: Настройки: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - Параметр «%1» должен соответствовать синтаксису «%1=%2» + + Displays program version + Отображает версию программы + + + + Displays this help message + Показать эту справку - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - Параметр «%1» должен соответствовать синтаксису «%1=%2» + + Changes the Web UI port (current: %1) + Изменяет порт веб-интерфейса (текущий: %1) - - Expected integer number in environment variable '%1', but got '%2' - Ожидаемое целое число в переменных окружения — «%1», но получено «%2» + + Disable splash screen + Отключить заставку при запуске - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - Параметр «%1» должен соответствовать синтаксису «%1=%2» + + Run in daemon-mode (background) + Работать в режиме службы (в фоне) - - Expected %1 in environment variable '%2', but got '%3' - Ожидалось «%1» в переменных окружения «%2», но получено «%3» + + Downloads the torrents passed by the user + Загружает торренты, обозначенные пользователем - - port - порт + + Help + Справка - - %1 must specify a valid port (1 to 65535). - %1 должен содержать допустимый порт (с 1 до 65535). + + Run application with -h option to read about command line parameters. + Запустите программу с параметром -h, чтобы получить справку по параметрам командной строки. - - Display program version and exit - Отображать версию программы и выход + + Bad command line + Недопустимая командная строка - - Display this help message and exit - Показать эту справку и выход + + Bad command line: + Недопустимая командная строка: - - Change the Web UI port - Изменить порт веб-интерфейса + + Legal Notice + Официальное уведомление - - Disable splash screen - Отключить заставку при запуске + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + qBittorrent — это программа для обмена файлами. При запуске торрента информация, связанная с ним, становится доступна другим пользователям посредством раздачи. Вы несёте персональную ответственность за всю информацию, которой делитесь с другими пользователями. + +Никаких дальнейших уведомлений выводиться не будет. - - Run in daemon-mode (background) - Работать в режиме службы (в фоне) + + Press %1 key to accept and continue... + Нажмите %1, чтобы принять и продолжить… - - dir - Use appropriate short form or abbreviation of "directory" - папке + + Legal notice + Официальное уведомление - - Store configuration files in <dir> - Хранить файлы настроек в <dir> + + Cancel + Отмена - - - name - имя + + I Agree + Я согласен - - Store configuration files in directories qBittorrent_<name> - Хранить файлы настроек в папках qBittorrent_<name> + + Torrent name: %1 + Имя торрента: %1 - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Взломать файлы libtorrent для быстрого возобновления и сделать пути файлов относительными к каталогу профиля + + Torrent size: %1 + Размер торрента: %1 - - files or URLs - файлы или ссылки + + Save path: %1 + Путь сохранения: %1 - - Download the torrents passed by the user - Загружать торренты, обозначенные пользователем + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Торрент был загружен за %1. - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Управление показом окна «Добавить новый торрент» при добавлении торрента. + + Thank you for using qBittorrent. + Спасибо за использование qBittorrent. - - Options when adding new torrents: - Параметры добавления новых торрентов: + + [qBittorrent] '%1' has finished downloading + [qBittorrent] загрузка '%1' завершена - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Сочетание клавиш для %1 + + The remote host name was not found (invalid hostname) + Удалённый хост не был найден (неверное имя хоста) - - path - путь + + The operation was canceled + Операция была отменена - - Torrent save path - Путь сохранения торрентов + + The remote server closed the connection prematurely, before the entire reply was received and processed + Удалённый сервер закрыл соединение, прежде чем весь ответ был принят и обработан - - Add torrents as started or paused - Добавлять торренты запущенными или остановленными + + The connection to the remote server timed out + Время соединения с удалённым сервером вышло - - Skip hash check - Пропустить проверку хеша + + SSL/TLS handshake failed + Соединение SSL/TLS не удалось - - Assign torrents to category. If the category doesn't exist, it will be created. - Назначать категории торрентам. Если категория не существует, она будет создана. + + The remote server refused the connection + Удалённый сервер отклонил соединение - - Download files in sequential order - Загружать файлы последовательно + + The connection to the proxy server was refused + Прокси-сервер отклонил соединение - - Download first and last pieces first - Загружать с первой и последней части + + The proxy server closed the connection prematurely + Прокси-сервер преждевременно закрыл соединение - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - Значения параметров могут предоставляться через переменные среды. Для опции с названием «parameter-name» переменная среды — «QBT_PARAMETER_NAME» (в верхнем регистре, «-» заменяется на «_»). Чтобы передать значения флага, установите для переменной значение «1» или «ИСТИНА». Например, чтобы отключить заставку: + + The proxy host name was not found + Имя прокси-сервера не было найдено - - Command line parameters take precedence over environment variables - Параметры командной строки имеют приоритет над переменными среды + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Подключение к прокси-серверу истекло или прокси-сервер не ответил на запрос - - Help - Справка + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Прокси-сервер требует аутентификации, но не принял указанные учетные данные - - Run application with -h option to read about command line parameters. - Запустите программу с параметром -h, чтобы получить справку по параметрам командной строки. + + The access to the remote content was denied (401) + В доступе к сторонним данным было отказано (401) - - Bad command line - Недопустимая командная строка + + The operation requested on the remote content is not permitted + В данной операции над сторонними данными отказано - - Bad command line: - Недопустимая командная строка: + + The remote content was not found at the server (404) + Сторонние данные не были найдены на сервере (404) - - Legal Notice - Официальное уведомление + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Удалённый сервер требует аутентификации для отдачи данных, но указанные учётные данные не были приняты - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - qBittorrent — это программа для обмена файлами. При запуске торрента данные, связанные с ним, становятся доступны другим пользователям посредством раздачи. Вы несёте персональную ответственность за всю информацию, которой делитесь. + + The Network Access API cannot honor the request because the protocol is not known + API сетевого доступа не может выполнить запрос, потому что протокол неизвестен - - No further notices will be issued. - Никаких дальнейших уведомлений выводиться не будет. + + The requested operation is invalid for this protocol + Запрошенная операция не поддерживается данным протоколом - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - qBittorrent — это программа для обмена файлами. При запуске торрента данные, связанные с ним, становятся доступны другим пользователям посредством раздачи. Вы несёте персональную ответственность за всю информацию, которой делитесь. - -Никаких дальнейших уведомлений выводиться не будет. + + An unknown network-related error was detected + Неизвестная сетевая ошибка - - Press %1 key to accept and continue... - Нажмите %1, чтобы принять и продолжить… + + An unknown proxy-related error was detected + Неизвестная ошибка прокси-сервера - - Legal notice - Официальное уведомление + + An unknown error related to the remote content was detected + Неизвестная ошибка сторонних данных - - Cancel - Отмена + + A breakdown in protocol was detected + Ошибка в протоколе - - I Agree - Я согласен + + Unknown error + Неизвестная ошибка - - + + Upgrade Обновить - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - Вы обновились со старой версии, которая сохраняла настройки иначе. Вы должны перейти на новую систему сохранения. В дальнейшем Вы не сможете использовать версии ранее 3.3.0. Продолжить? [да/нет] + Вы обновились со старой версии, которая сохраняла настройки иначе. Вы должны перейти на новую систему сохранения. В дальнейшем Вы не сможете использовать версии ранее 3.3.0. Продолжить? [у/n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. Вы обновились со старой версии, которая сохраняла настройки иначе. Вы должны перейти на новую систему сохранения. В дальнейшем Вы не сможете использовать версии ранее 3.3.0. - + Couldn't migrate torrent with hash: %1 Не удалось перенести торрент с хешем: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 - Не удалось перенести торрент. Неверное имя файла «быстрого возобновления»: %1 + Не удалось перенести торрент. Неверное имя файла "быстрого возобновления": %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 - Обнаружено некорректное завершение программы. Производится попытка восстановления настроек из резервной копии: %1 + + Detected unclean program exit. Using fallback file to restore settings. + Обнаружено некорректное завершение программы. Производится попытка восстановления настроек из резервной копии. - + An access error occurred while trying to write the configuration file. Ошибка доступа при попытке записи файла конфигурации. - + A format error occurred while trying to write the configuration file. Ошибка формата при попытке записи файла конфигурации. - - - An unknown error occurred while trying to write the configuration file. - Возникла неизвестная ошибка при попытке записи файла конфигурации. - - RSS::AutoDownloader + RSS - - - Invalid data format. - Неверный формат данных. + + Search + Поиск - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - Не удалось сохранить данные Автозагрузчика RSS из %1. Ошибка: %2 + + New subscription + Новый канал - - Invalid data format - Неверный формат данных + + + + Mark items read + Отметить элементы как прочитанные - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - Не удалось прочесть правила Автозагрузчика RSS из %1. Ошибка: %2 + + Update all + Обновить все - - Couldn't load RSS AutoDownloader rules. Reason: %1 - Не удалось загрузить правила Автозагрузчика RSS. Причина: %1 + + RSS Downloader... + Загрузчик RSS… - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - Не удалось загрузить RSS-канал с «%1». Причина: %2 + + Settings... + Настройки… - - RSS feed at '%1' updated. Added %2 new articles. - RSS-канал с «%1» обновлён. Добавлено %2 новых статей. + + Torrents: (double-click to download) + Торренты: (двойной щелчок для загрузки) - - Failed to parse RSS feed at '%1'. Reason: %2 - Не удалось разобрать RSS-канал с «%1». Причина: %2 + + + Delete + Удалить - - Couldn't read RSS Session data from %1. Error: %2 - Не удалось прочесть данные сеанса RSS из %1. Ошибка: %2 + + Rename... + Переименовать… - - Couldn't parse RSS Session data. Error: %1 - Не удалось разобрать данные сеанса RSS. Ошибка: %1 + + Rename + Переименовать - - Couldn't load RSS Session data. Invalid data format. - Не удалось загрузить данные сеанса RSS. Неверный формат данных. + + + Update + Обновить - - Couldn't load RSS article '%1#%2'. Invalid data format. - Не удалось загрузить статью RSS «%1#%2». Неверный формат данных. + + New subscription... + Новая подписка… - - - RSS::Private::Parser - - Invalid RSS feed. - Неверный RSS-канал. + + + Update all feeds + Обновить все каналы - - %1 (line: %2, column: %3, offset: %4). - %1 (строка: %2, столбец: %3, смещение: %4). + + Download torrent + Загрузить торрент - - - RSS::Session - - RSS feed with given URL already exists: %1. - RSS-канал с указанным адресом уже существует. + + Open news URL + Открыть ссылку в браузере - - Cannot move root folder. - Невозможно переместить корневую папку. + + Copy feed URL + Скопировать ссылку канала - - - Item doesn't exist: %1. - Элемент не существует: %1. - - - - Cannot delete root folder. - Невозможно удалить корневую папку. - - - - Incorrect RSS Item path: %1. - Некорректный путь элемента RSS: %1. - - - - RSS item with given path already exists: %1. - RSS-канал с указанным путём уже существует: %1. - - - - Parent folder doesn't exist: %1. - Родительская папка не существует: %1. - - - - RSSWidget - - - Search - Поиск - - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - Загрузка RSS в данный момент отключена! Вы можете включить её в настройках приложения. - - - - New subscription - Новая подписка - - - - - - Mark items read - Отметить как прочитанные + + New folder... + Новая папка… - + Refresh RSS streams Обновить RSS-потоки + + + RSSImp - - Update all - Обновить все - - - - RSS Downloader... - Загрузчик RSS… - - - - Torrents: (double-click to download) - Торренты: (двойной щелчок для загрузки) - - - - - Delete - Удалить + + Stream URL: + Адрес потока: - - Rename... - Переименовать… + + Please type a RSS stream URL + Введите адрес RSS-потока - - Rename - Переименовать + + This RSS feed is already in the list. + Этот RSS-канал уже в списке. - - - Update - Обновить + + Please choose a folder name + Выберите имя папки - - New subscription... - Новая подписка… + + Folder name: + Имя папки: - - - Update all feeds - Обновить все каналы + + New folder + Новая папка - - Download torrent - Загрузить торрент + + Deletion confirmation + Подтверждение удаления - - Open news URL - Открыть новостную ссылку + + Are you sure you want to delete the selected RSS feeds? + Вы уверены, что хотите удалить выбранный RSS-канал? - - Copy feed URL - Копировать адрес канала + + Please choose a new name for this RSS feed + Укажите новое имя для этого RSS-канала - - New folder... - Новая папка… + + New feed name: + Новое имя канала: - - Please choose a folder name - Пожалуйста, выберите имя папки + + Name already in use + Имя уже используется - - Folder name: - Имя папки: + + This name is already used by another item, please choose another one. + Это имя уже используется. Пожалуйста, выберите другое. - - New folder - Новая папка + + Date: + Дата: - - Please type a RSS feed URL - Пожалуйста, введите адрес RSS-канала + + Author: + Автор: - - Feed URL: - Адрес канала: + + Unread + Непрочитанные + + + Rss::Feed - - Deletion confirmation - Подтверждение удаления + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + Автоматическая загрузка '%1' из RSS-канала '%2' не удалась, потому что он не содержит торрента или magnet-ссылки… - - Are you sure you want to delete the selected RSS feeds? - Вы уверены, что хотите удалить выделенные RSS-каналы? + + Automatically downloading '%1' torrent from '%2' RSS feed... + Автоматическая загрузка торрента '%1' с RSS-канала '%2'… + + + Rss::Private::Parser - - Please choose a new name for this RSS feed - Пожалуйста, укажите новое имя для этого RSS-канала + + Invalid RSS feed. + Неправильный RSS-канал. + + + RssSettingsDlg - - New feed name: - Новое имя канала: + + RSS Reader Settings + Настройки RSS-менеджера - - Rename failed - Переименование не удалось + + RSS feeds refresh interval: + Интервал обновления RSS-каналов: - - Date: - Дата: + + min + мин. - - Author: - Автор: + + Maximum number of articles per feed: + Максимальное число статей на канал: ScanFoldersDelegate - + Select save location Выбрать путь сохранения @@ -7450,274 +6702,268 @@ ScanFoldersModel - + Monitored Folder - Папка для наблюдения + Папка для мониторинга - + Override Save Location Переопределить путь сохранения - + Monitored folder - Папка для наблюдения + Папка для мониторинга - + Default save location Путь сохранения по умолчанию - + Browse... Обзор… - SearchJobWidget + SearchEngine - - Form - Форма + + Unknown search engine plugin file format. + Неизвестный формат файла поискового плагина. - - Results(xxx) - Результаты (xxx) + + A more recent version of this plugin is already installed. + Уже установлена самая последняя версия этого плагина. - - Search in: - Поиск: + + + Plugin is not supported. + Плагин не поддерживается. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - <html><head/><body><p>Некоторые поисковики способны искать среди описаний и названий файлов. Отображение поисковых результатов в списке ниже контролируется этим режимом.</p><p><span style=" font-weight:600;">Везде</span> отключает фильтрование и отображает полный результат поисковика.</p><p><span style=" font-weight:600;">В именах торрентов</span> отображает торренты, соответствующие запросу по имени файла.</p></body></html> + + Update server is temporarily unavailable. %1 + Сервер обновлений временно недоступен. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - <html><head/><body><p>Установить минимально и максимально допустимое число сидов</p></body></html> + + + Failed to download the plugin file. %1 + Не удалось загрузить файл плагина. %1 - - Seeds: - Сиды: + + An incorrect update info received. + Получена неправильная информация об обновлении. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - <html><head/><body><p>Минимальное количество сидов</p></body></html> + + All categories + Все категории - - - to - до + + Movies + Фильмы - - <html><head/><body><p>Maximal number of seeds</p></body></html> - <html><head/><body><p>Максимальное количество сидов</p></body></html> + + TV shows + ТВ-шоу - - - - + + Music + Музыка - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - <html><head/><body><p>Установить минимально и максимально допустимый размер торрента</p></body></html> + + Games + Игры - - Size: - Размер: + + Anime + Аниме - - <html><head/><body><p>Minimal torrent size</p></body></html> - <html><head/><body><p>Минимальный размер торрента</p></body></html> + + Software + Программы - - <html><head/><body><p>Maximal torrent size</p></body></html> - <html><head/><body><p>Максимальный размер торрента</p></body></html> + + Pictures + Изображения + + + + Books + Книги + + + + SearchListDelegate + + + + Unknown + Неизвестно + + + SearchTab - + Name i.e: file name Имя - + Size i.e: file size Размер - + Seeders i.e: Number of full sources Сиды - + Leechers i.e: Number of partial sources - Личи + Пиры - + Search engine Поисковик - - Filter search results... - Фильтровать результаты поиска… - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - Результаты (показываются <i>%1</i> из <i>%2</i>): + Результаты (показывается <i>%1</i> из <i>%2</i>): - + Torrent names only В именах торрентов - + Everywhere Везде - - Use regular expressions - Использовать регулярные выражения - - - + Searching... - Производится поиск… + Поиск… - + Search has finished Поиск завершён - + Search aborted Поиск прерван - + An error occurred during search... Во время поиска произошла ошибка… - + Search returned no results Поиск не дал результатов - + Column visibility - Отображение столбцов - - - - SearchPluginManager - - - Unknown search engine plugin file format. - Неизвестный формат файла поискового плагина. - - - - A more recent version of this plugin is already installed. - Уже установлена самая последняя версия этого плагина. + - - - Plugin is not supported. - Плагин не поддерживается. + + Form + Форма - - All categories - Все категории + + Results(xxx) + Результаты(xxx) - - Movies - Фильмы + + Search in: + Поиск: - - TV shows - ТВ-шоу + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Некоторые поисковики способны искать среди описаний и названий файлов. Отображение поисковых результатов в списке ниже контролируется данным режимом.</p><p><span style=" font-weight:600;">Где угодно</span> отключает фильтрование и отображает полный результат поисковой выдачи.</p><p><span style=" font-weight:600;">Только в названиях файлов</span> отображает торренты, соотвествующие запросу по имени файла.</p></body></html> - - Music - Музыка + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Установить минимально и максимально позволенное количество сидов</p></body></html> - - Games - Игры + + Seeds: + Сиды: - - Anime - Аниме + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Минимальное количество сидов</p></body></html> - - Software - Программы + + + to + до - - Pictures - Изображения + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Максимальное количество сидов</p></body></html> - - - Books - Книги + + + + + - - Update server is temporarily unavailable. %1 - Сервер обновлений временно недоступен. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Установить минимально и максимально позволенный размер торрента</p></body></html> - - - Failed to download the plugin file. %1 - Не удалось загрузить файл плагина. %1 + + Size: + Размер: - - An incorrect update info received. - Получена неверная информация об обновлении. + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Минимальный размер торрента</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - Поисковый плагин «%1» содержит недопустимую строку версии («%2») + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Максимальный размер торрента</p></body></html> @@ -7725,198 +6971,185 @@ - - - - + + + Search Поиск - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - Отсутствуют установленные поисковые плагины. -Нажмите на кнопку «Поисковые плагины…» в левой нижней части окна для установки. - - - + Download - Загрузить + Скачать - + Go to description page - Открыть страницу описания + Перейти на страницу описания - + Copy description page URL - Скопировать адрес описания + Скопировать адрес страницы описания - + Search plugins... Поисковые плагины… - + A phrase to search for. Фраза для поиска. - + Spaces in a search term may be protected by double quotes. Пробелы в поисковом запросе могут быть защищены двойными кавычками. - + Example: Search phrase example Пример: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - <b>foo bar</b>: для поиска <b>foo</b> и <b>bar</b> + <b>foo bar</b>: поиск для <b>foo</b> и <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - <b>&quot;foo bar&quot;</b>: для поиска <b>foo bar</b> + <b>&quot;foo bar&quot;</b>: поиск для <b>foo bar</b> - + All plugins Все плагины - + Only enabled Только включённые - + Select... Выбрать… - - - + + + Search Engine Поисковик - + Please install Python to use the Search Engine. Пожалуйста, установите Python для использования поисковика. - + Empty search pattern Очистить шаблон поиска - + Please type a search pattern first Пожалуйста, задайте сначала шаблон поиска - + Stop Стоп - + Search has finished Поиск завершён - + Search has failed Поиск не удался - ShutdownConfirmDialog - - - Don't show again - Больше не показывать - + ShutdownConfirmDlg - + qBittorrent will now exit. - qBittorrent будет сейчас закрыт. + qBittorrent будет закрыт. - + E&xit Now В&ыйти сейчас - + Exit confirmation - Подтверждение выхода + Подтверждение завершения программы - + The computer is going to shutdown. Компьютер будет выключен. - + &Shutdown Now &Выключить сейчас - - Shutdown confirmation - Подтверждение выключения - - - + The computer is going to enter suspend mode. - Компьютер перейдёт в ждущий режим. + Компьютер перейдёт в режим ожидания. - + &Suspend Now - &Перейти в ждущий режим + &Перейти в режим ожидания - + Suspend confirmation - Подтверждение перехода в ждущий режим + Подтверждение перехода в режим ожидания - + The computer is going to enter hibernation mode. Компьютер перейдёт в спящий режим. - + &Hibernate Now П&ерейти в спящий режим - + Hibernate confirmation Подтверждение перехода в спящий режим - + You can cancel the action within %1 seconds. Вы можете отменить действие в течение %1 секунд. + + + Shutdown confirmation + Подтверждение выключения + SpeedLimitDialog - + KiB/s КБ/с @@ -7924,52 +7157,52 @@ SpeedPlotView - + Total Upload Всего отдано - + Total Download Всего загружено - + Payload Upload Отдано полезного - + Payload Download Загружено полезного - + Overhead Upload Отдано служебного трафика - + Overhead Download Загружено служебного трафика - + DHT Upload Отдано DHT - + DHT Download Загружено DHT - + Tracker Upload Отдано трекером - + Tracker Download Загружено трекером @@ -7977,95 +7210,87 @@ SpeedWidget - + Period: Период: - + 1 Minute 1 минута - + 5 Minutes 5 минут - + 30 Minutes 30 минут - + 6 Hours 6 часов - + Select Graphs Выбрать графики - + Total Upload Всего отдано - + Total Download Всего загружено - + Payload Upload Отдано полезного - + Payload Download Загружено полезного - + Overhead Upload Отдано служебного трафика - + Overhead Download Загружено служебного трафика - + DHT Upload Отдано DHT - + DHT Download Загружено DHT - + Tracker Upload Отдано трекером - + Tracker Download Загружено трекером - StacktraceDialog - - - Crash info - Отчёт об ошибке - - - StatsDialog @@ -8075,52 +7300,52 @@ User statistics - Статистика пользователя + Пользовательская статистика - - Cache statistics - Кэш + + Total peer connections: + Всего соединений: - - Read cache hits: - Попаданий в кэш чтения: + + Global ratio: + Общий коэффициент: - - Average time in queue: - Среднее время простоя в очереди: + + Alltime download: + Всего загружено: - - Connected peers: - Подключённые пиры: + + Alltime upload: + Всего отдано: - - All-time share ratio: - Общий рейтинг раздачи: + + Total waste (this session): + Всего потеряно (за сеанс): - - All-time download: - Всего загружено: + + Cache statistics + Кэш - - Session waste: - Потеряно за сеанс: + + Read cache hits: + Попадений в кеш чтения: - - All-time upload: - Всего отдано: + + Average time in queue: + Среднее время простоя в очереди: - Total buffer size: - Общий размер буфера: + Total buffers size: + Общий размер буферов: @@ -8148,7 +7373,12 @@ Общий размер очереди: - + + OK + OK + + + %1 ms 18 milliseconds %1 мс @@ -8157,27 +7387,32 @@ StatusBar - + Connection status: Состояние связи: - + No direct connections. This may indicate network configuration problems. - Нет прямых соединений. Причиной этому могут быть проблемы в настройках сети. + Нет прямых соединений. Причиной этого могут быть проблемы в настройке сети. - + DHT: %1 nodes DHT: %1 узлов - - qBittorrent needs to be restarted! - qBittorrent надо перезапустить! + + qBittorrent needs to be restarted + qBittorrent надо перезапустить + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent был обновлён и нуждается в перезапуске, чтобы изменения вступили в силу. @@ -8196,1570 +7431,1311 @@ В сети - + Click to switch to alternative speed limits - Нажмите для переключения на другие ограничения скорости + Нажмите для включения других ограничений скорости - + Click to switch to regular speed limits - Нажмите для переключения на обычные ограничения скорости + Нажмите для включения обычных ограничений скорости - + + Manual change of rate limits mode. The scheduler is disabled. + Ограничения скорости изменены вручную. Планировщик выключен. + + + Global Download Speed Limit Общее ограничение скорости загрузки - + Global Upload Speed Limit Общее ограничение скорости отдачи - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter Все (0) - + Downloading (0) Загружаются (0) - + Seeding (0) Раздаются (0) - + Completed (0) Завершены (0) - + Resumed (0) Возобновлены (0) - + Paused (0) Остановлены (0) - + Active (0) Активны (0) - + Inactive (0) Неактивны (0) - + Errored (0) С ошибкой (0) - + All (%1) Все (%1) - + Downloading (%1) Загружаются (%1) - + Seeding (%1) Раздаются (%1) - + Completed (%1) Завершены (%1) - + Paused (%1) Остановлены (%1) - + Resumed (%1) Возобновлены (%1) - + Active (%1) Активны (%1) - + Inactive (%1) Неактивны (%1) - + Errored (%1) С ошибкой (%1) - TagFilterModel + TorrentContentModel - - Tags - Метки + + Name + Имя - - All - Все + + Size + Размер - - Untagged - Без метки + + Progress + Прогресс - - - TagFilterWidget - - Add tag... - Добавить метку… + + Download Priority + Приоритет - - Remove tag - Удалить метку + + Remaining + Осталось + + + TorrentCreatorDlg - - Remove unused tags - Удалить пустые метки + + Select a folder to add to the torrent + Выберите папку для добавления в торрент - - Resume torrents - Возобновить торренты + + Select a file to add to the torrent + Выберите файл для добавления в торрент - - Pause torrents - Остановить торренты + + No input path set + Не задано содержимое - - Delete torrents - Удалить торренты + + Please type an input path first + Пожалуйста, сначала выберите содержимое - - New Tag - Новая метка + + Select destination torrent file + Выберите имя и путь сохранения - - Tag: - Метка: + + Torrent Files (*.torrent) + Торрент-файлы (*.torrent) - - Invalid tag name - Недопустимое имя метки + + Torrent was created successfully: %1 + %1 is the path of the torrent + Торрент успешно создан: %1 - - Tag name '%1' is invalid - Недопустимое имя метки «%1» + + + + Torrent creation + Создание торрента - - Tag exists - Метка существует + + Torrent creation was unsuccessful, reason: %1 + Создание торрента не удалось, причина: %1 - - Tag name already exists. - Имя метки уже существует. + + Created torrent file is invalid. It won't be added to download list. + Созданный торрент-файл испорчен. Он не будет добавлен в список загрузок. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Свойства категории торрента + + Name + i.e: torrent name + Имя - - Name: - Имя: + + Size + i.e: torrent size + Размер - - Save path: - Путь сохранения: + + Done + % Done + Прогресс - - Choose save path - Выберите путь сохранения + + Status + Torrent status (e.g. downloading, seeding, paused) + Статус - - New Category - Новая категория + + Seeds + i.e. full sources (often untranslated) + Сиды - - Invalid category name - Недопустимое имя категории + + Peers + i.e. partial sources (often untranslated) + Пиры - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - Имя категории не должно содержать «\». -Имя категории не должно начинаться или заканчиваться с «/». -Имя категории не должно содержать «//». + + Down Speed + i.e: Download speed + Загрузка - - Category creation error - Ошибка создания категории + + Up Speed + i.e: Upload speed + Отдача - - Category with the given name already exists. -Please choose a different name and try again. - Категория с таким именем уже существует. -Пожалуйста, выберите другое имя и попробуйте снова. + + Ratio + Share ratio + Коэфф. - - - TorrentContentModel - - Name - Имя + + ETA + i.e: Estimated Time of Arrival / Time left + Время - - Size - Размер + + Category + Категория - - Progress - Прогресс + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Добавлен - - Download Priority - Приоритет + + Completed On + Torrent was completed on 01/01/2010 08:00 + Завершён - - Remaining - Осталось + + Tracker + Трекер - - Availability - Доступно + + Down Limit + i.e: Download limit + Огр. загрузки - - - TorrentCreatorDialog - - Torrent Creator - Создать торрент + + Up Limit + i.e: Upload limit + Огр. отдачи - - Select file/folder to share - Выберите файл или папку для раздачи + + Downloaded + Amount of data downloaded (e.g. in MB) + Загружено - - Path: - Путь: + + Uploaded + Amount of data uploaded (e.g. in MB) + Отдано - - [Drag and drop area] - [Область переноса] + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Загружено за сеанс - - - Select file - Выбрать файл + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Отдано за сеанс - - - Select folder - Выбрать папку + + Remaining + Amount of data left to download (e.g. in MB) + Осталось - - Settings - Настройки + + Time Active + Time (duration) the torrent is active (not paused) + Время активности - - Piece size: - Размер части: + + Save path + Torrent save path + Путь сохранения - - Auto - Авто + + Completed + Amount of data completed (e.g. in MB) + Завершено байт - - 16 KiB - 16 КБ + + Ratio Limit + Upload share ratio limit + Огр. коэффициента - - 32 KiB - 32 КБ + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Замечен целиком - - 64 KiB - 64 КБ + + Last Activity + Time passed since a chunk was downloaded/uploaded + Последняя активность - - 128 KiB - 128 КБ + + Total Size + i.e. Size including unwanted data + Общий объем + + + TrackerFiltersList - - 256 KiB - 256 КБ + + All (0) + this is for the tracker filter + Все (0) - - 512 KiB - 512 КБ + + Trackerless (0) + Без трекера (0) - - 1 MiB - 1 МБ + + Error (0) + С ошибкой (0) - - 2 MiB - 2 МБ + + Warning (0) + Предупреждения (0) - - 4 MiB - 4 МБ + + + Trackerless (%1) + Без трекера (%1) - - 8 MiB - 8 МБ + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - 16 MiB - 16 МБ + + + Error (%1) + С ошибкой (%1) - - 32 MiB - 32 МБ + + + Warning (%1) + Предупреждения (%1) - - Calculate number of pieces: - Посчитать кол-во частей: + + Resume torrents + Возобновить - - Private torrent (Won't distribute on DHT network) - Приватный торрент (не раздаётся через децентрализованную сеть DHT) + + Pause torrents + Остановить - - Start seeding immediately - Начать раздачу сразу + + Delete torrents + Удалить - - Ignore share ratio limits for this torrent - Игнорировать ограничения рейтинга для этого торрента + + + All (%1) + this is for the tracker filter + Все (%1) + + + TrackerList - - Optimize alignment - Оптимизировать сортировку файлов + + URL + Адрес - - Fields - Поля + + Status + Статус - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - Используйте пустые строки для разделения тиров/групп трекеров. + + Received + - - Web seed URLs: - Адреса веб-сидов: + + Seeds + Сиды - - Tracker URLs: - Адреса трекеров: + + Peers + Пиры - - Comments: - Комментарии: + + Downloaded + - - Source: - Источник: + + Message + Сообщение - - Progress: - Прогресс: - - - - Create Torrent - Создать торрент - - - - - - Torrent creation failed - Не удалось создать торрент - - - - Reason: Path to file/folder is not readable. - Причина: Путь к файлу или папке недоступен для чтения. - - - - Select where to save the new torrent - Выберите папку для сохранения нового торрента - - - - Torrent Files (*.torrent) - Торрент-файлы (*.torrent) - - - - Reason: %1 - Причина: %1 - - - - Reason: Created torrent is invalid. It won't be added to download list. - Причина: Созданный торрент-файл испорчен. Он не будет добавлен в список загрузок. - - - - Torrent creator - Создать торрент - - - - Torrent created: - Торрент создан: - - - - TorrentInfo - - - File size exceeds max limit %1 - Размер файла превышает ограничение в %1 - - - - Torrent file read error: %1 - Ошибка чтения торрент-файла: %1 - - - - Torrent file read error: size mismatch - Ошибка чтения торрент-файла: несоответствие размера - - - - TorrentsController - - - Not contacted yet - Нет соединения - - - - Updating... - Обновляется… - - - + + Working Работает - - Not working - Не работает - - - - Error: '%1' is not a valid torrent file. - Ошибка: «%1» не является допустимым торрент-файлом. - - - - - - - Torrent queueing must be enabled - Очерёдность торрентов должна быть включена - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - Save path is empty - Путь сохранения пуст - - - - Cannot make save path - Невозможно создать путь сохранения - - - - Cannot write to directory - Запись в папку невозможна - - - - WebUI Set location: moving "%1", from "%2" to "%3" - Веб-интерфейс, перемещение: «%1» перемещается из «%2» в «%3» - - - - Incorrect torrent name - Неправильное имя торрента - - - - - Incorrect category name - Неправильное имя категории - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - Все (0) - - - - Trackerless (0) - Без трекера (0) - - - - Error (0) - С ошибкой (0) - - - - Warning (0) - Предупреждения (0) - - - - - Trackerless (%1) - Без трекера (%1) - - - - - Error (%1) - С ошибкой (%1) - - - - - Warning (%1) - Предупреждения (%1) - - - - Resume torrents - Возобновить - - - - Pause torrents - Остановить - - - - Delete torrents - Удалить торренты - - - - - All (%1) - this is for the tracker filter - Все (%1) - - - - TrackerListWidget - - - - Working - Работает - - - + Disabled - Отключён + Выключен - + This torrent is private Это приватный торрент - + Updating... Обновляется… - + Not working Не работает - + Not contacted yet - Нет соединения + Не соединился - - - - - - - N/A - Н/Д + + Tracker URL: + Адрес трекера: - + Tracker editing Редактирование трекера - - Tracker URL: - Адрес трекера: - - - - + + Tracker editing failed - Редактирование трекера не удалось + Не удалось отредактировать адрес трекера - + The tracker URL entered is invalid. - Введён недопустимый адрес трекера. + Введён неверный адрес трекера. - + The tracker URL already exists. Трекер с таким адресом уже существует. - + Add a new tracker... Добавить новый трекер… - - Remove tracker - Удалить трекер - - - + Copy tracker URL - Копировать адрес трекера + Скопировать адрес трекера - + Edit selected tracker URL Изменить адрес выбранного трекера - + Force reannounce to selected trackers Переанонсировать на выбранные трекеры - + Force reannounce to all trackers Переанонсировать на все трекеры - - URL - Адрес - - - - Status - Статус - - - - Received - Получено - - - - Seeds - Сиды - - - - Peers - Пиры - - - - Downloaded - Загружено - - - - Message - Сообщение - - - - Column visibility - Отображение столбцов - - - - TrackerLoginDialog - - - - Tracker authentication - Аутентификация трекера - - - - Tracker: - Трекер: - - - - Login - Войти - - - - Username: - Имя пользователя: - - - - Password: - Пароль: - - - - Log in - Вход + + Remove tracker + Удалить трекер - TrackersAdditionDialog + TrackersAdditionDlg - + Trackers addition dialog Окно добавления трекеров - + List of trackers to add (one per line): Список трекеров для добавления (один трекер на строку): - - + + µTorrent compatible list URL: Адрес списка, совместимого с µTorrent: - + + I/O Error + Ошибка ввода/вывода + + + + Error while trying to open the downloaded file. + Ошибка при открытии загруженного файла. + + + No change Без изменений - + No additional trackers were found. Дополнительные трекеры не найдены. - + Download error - Ошибка загрузки + Ошибка при загрузке - + The trackers list could not be downloaded, reason: %1 - Не удалось загрузить список трекеров. Причина: %1 + Невозможно загрузить список трекеров. Причина: %1 TransferListDelegate - + Downloading Загружается - + Downloading metadata used when loading a magnet link Загрузка метаданных - + Allocating qBittorrent is allocating the files on disk - Резервирует место + Резервирование места - + Paused Остановлен - + Queued i.e. torrent is queued В очереди - + Seeding Torrent is complete and in upload-only mode Раздаётся - + Stalled Torrent is waiting for download to begin Простаивает - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] Загружается - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] Раздаётся - + Checking Torrent local data is being checked Проверяется - + Queued for checking i.e. torrent is queued for hash checking В очереди на проверку - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Проверка данных возобновления - + Completed Завершён - - Moving - Torrent local data are being moved/relocated - Перемещение - - - + Missing Files Отсутствуют файлы - + Errored torrent status, the torrent has an error С ошибкой - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (раздаётся %2) - - - %1 ago - e.g.: 1h 20m ago - %1 назад - - - - TransferListFiltersWidget - - - Status - Статус - - - - Categories - Категории - - - - Tags - Метки - - - - Trackers - Трекеры - - - - TransferListModel - - - Name - i.e: torrent name - Имя - - - - Size - i.e: torrent size - Размер - - - - Done - % Done - Прогресс - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Статус - - - - Seeds - i.e. full sources (often untranslated) - Сиды - - - - Peers - i.e. partial sources (often untranslated) - Пиры - - - - Down Speed - i.e: Download speed - Загрузка - - - - Up Speed - i.e: Upload speed - Отдача - - - - Ratio - Share ratio - Рейтинг - - - - ETA - i.e: Estimated Time of Arrival / Time left - Время - - - - Category - Категория - - - - Tags - Метки - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - Дата добавления - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - Дата завершения - - - - Tracker - Трекер - - - - Down Limit - i.e: Download limit - Огр. загрузки - - - - Up Limit - i.e: Upload limit - Огр. отдачи - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Загружено - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Отдано - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - Загружено за сеанс - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - Отдано за сеанс - - - - Remaining - Amount of data left to download (e.g. in MB) - Осталось - - - - Time Active - Time (duration) the torrent is active (not paused) - Время активности - - - - Save path - Torrent save path - Путь сохранения - - - - Completed - Amount of data completed (e.g. in MB) - Завершено байт - - - - Ratio Limit - Upload share ratio limit - Огр. рейтинга + + + %1 ago + e.g.: 1h 20m ago + %1 назад + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - Замечен целиком + + Status + Статус - - Last Activity - Time passed since a chunk was downloaded/uploaded - Активность + + Categories + Категории - - Total Size - i.e. Size including unwanted data - Общий размер + + Trackers + Трекеры TransferListWidget - + Column visibility Отображение столбцов - + Choose save path Выберите путь сохранения - + Torrent Download Speed Limiting Ограничение скорости загрузки торрента - + Torrent Upload Speed Limiting - Ограничение скорости отдачи торрента + Ограничение скорости раздачи торрента - + Recheck confirmation - Подтверждение проверки + Подтвердите повторную проверку - + Are you sure you want to recheck the selected torrent(s)? - Вы уверены, что хотите проверить выбранные торренты? + Вы уверены, что хотите перепроверить выбранные торренты? - + Rename Переименовать - + New name: Новое имя: - + Resume Resume/start the torrent Возобновить - + Force Resume Force Resume/start the torrent - Возобновить принудительно + Продолжить принудительно - + Pause Pause the torrent Остановить - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Перемещение: «%1» перемещается из «%2» в «%3» - - - - Add Tags - Добавить метки - - - - Remove All Tags - Удалить все метки - - - - Remove all tags from selected torrents? - Удалить все метки для выбранных торрентов? + + New Category + Новая категория - - Comma-separated tags: - Метки, разделённые запятыми: + + Category: + Категория: - - Invalid tag - Недопустимая метка + + Invalid category name + Неправильное имя категории - - Tag name: '%1' is invalid - Имя метки «%1» недопустимо + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Имя категории не должно содержать '\' +Имя категории не должно начинаться или заканчиваться '/' +Имя категории не должно содержать '//' - + Delete Delete the torrent Удалить - + Preview file... Предпросмотр файла… - + Limit share ratio... - Ограничить рейтинг… + Ограничить коэффициент раздачи… - + Limit upload rate... - Ограничить скорость отдачи… + Ограничить скорость раздачи… - + Limit download rate... Ограничить скорость загрузки… - + Open destination folder Открыть папку назначения - + Move up i.e. move up in the queue - Повысить + Вверх - + Move down i.e. Move down in the queue - Понизить + Вниз - + Move to top i.e. Move to top of the queue - Высший + На самый верх - + Move to bottom i.e. Move to bottom of the queue - Низший + В самый низ - + Set location... Переместить… - - Force reannounce - Переанонсировать принудительно - - - + Copy name Копировать имя - - Copy hash - Копировать хеш - - - + Download first and last pieces first Загружать с первой и последней части - + Automatic Torrent Management Автоматическое управление - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category Автоматический режим выбирает настройки торрентов (напр. путь сохранения) в зависимости от их категории - + Category Категория - + New... New category... Новая… - + Reset Reset category Сбросить - - Tags - Метки - - - - Add... - Add / assign multiple tags... - Добавить… - - - - Remove All - Remove all tags - Удалить все - - - + Priority Приоритет - + Force recheck Проверить принудительно - + Copy magnet link - Копировать магнет-ссылку + Скопировать magnet-ссылку - + Super seeding mode Режим суперсида - + Rename... Переименовать… - + Download in sequential order Загружать последовательно - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - Ограничение рейтинга загрузки/отдачи торрента + Ограничение коэффициента загрузки/раздачи торрента - - Use global share limit - Использовать глобальное ограничение раздачи + + Use global ratio limit + Использовать глобальное ограничение коэффициента - - - + + + buttonGroup buttonGroup - - Set no share limit - Убрать ограничение раздачи + + Set no ratio limit + Убрать ограничение коэффициента + + + + Set ratio limit to + Установить ограничение коэффициента + + + + WebApplication + + + Incorrect category name + Неправильное имя категории + + + + WebUI + + + The Web UI is listening on port %1 + Веб-интерфейс использует порт %1 + + + + Web UI Error - Unable to bind Web UI to port %1 + Ошибка веб-интерфейса — не удалось занять порт %1 + + + about - - Set share limit to - Установить ограничение раздачи + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Продвинутый BitTorrent клиент, написанный на C++. Использует фреймворк Qt и библиотеку libtorrent-rasterbar. - - ratio - рейтинг + + Copyright %1 2006-2016 The qBittorrent project + Copyright %1 2006-2016 Проект qBittorrent - - minutes - минуты + + Home Page: + Домашняя страница: - - No share limit method selected - Не выбран метод ограничения раздачи + + Forum: + Форум: - - Please select a limit method first - Пожалуйста, выберите метод ограничения + + Bug Tracker: + Баг-трекер: - Utils::ForeignApps + addPeersDialog + + + Add Peers + Добавить пиров + - - Python detected, version: %1 - Python найден, версия: %1 + + List of peers to add (one per line): + Список пиров для добавления (один пир на строку): - - Python not detected - Python не найден + + Format: IPv4:port / [IPv6]:port + Формат: IPv4:порт / [IPv6]:порт - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - Недопустимый тип файла, разрешены только стандартные файлы. + + + Tracker authentication + Аутентификация трекера - - Symlinks inside alternative UI folder are forbidden. - Символические ссылки внутри папки альтернативного интерфейса запрещены. + + Tracker: + Трекер: - - Exceeded the maximum allowed file size (%1)! - Превышен максимально допустимый размер файла (%1)! + + Login + Логин - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - Веб-интерфейс: Оригинальный и целевой заголовки не совпадают! IP источника: «%1». Заголовок источника: «%2». Целевой источник: «%3» + + Username: + Имя пользователя: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - Веб-интерфейс: Ссылочный и целевой заголовки не совпадают! IP источника: «%1». Заголовок источника: «%2». Целевой источник: «%3» + + Password: + Пароль: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - Веб-интерфейс: Неверный заголовок хоста, несовпадение порта! Запрос IP источника: «%1». Порт сервера: «%2». Полученный заголовок хоста: «%3» + + Log in + Вход - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - Веб-интерфейс: Неверный заголовок хоста. Запрос IP источника: «%1». Полученный заголовок хоста: «%2» + + Cancel + Отмена - WebUI + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + Подтверждение удаления - qBittorrent + + + + Remember choice + Запомнить выбор + + + + Also delete the files on the hard disk + Удалить загруженные данные с диска + + + + confirmShutdownDlg + + + Don't show again + Больше не показывать + + + + createTorrentDialog + + + Cancel + Отмена + + + + Torrent Creation Tool + Инструмент для создания торрентов + + + + Torrent file creation + Создание торрент-файла + + + + Add file + Добавить файл + + + + Add folder + Добавить папку + + + + File or folder to add to the torrent: + Файл или папка для добавления в торрент: + + + + Tracker URLs: + Адреса трекеров: + - - Web UI: HTTPS setup successful - Веб-интерфейс: Установка HTTPS успешна + + Web seeds urls: + Адреса веб-сидов: + + + + Comment: + Комментарий: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Используйте пустые строки для разделения групп трекеров. + + + + Piece size: + Размер части: + + + + 16 KiB + 16 КБ + + + + 32 KiB + 32 КБ + + + + 64 KiB + 64 КБ + + + + 128 KiB + 128 КБ + + + + 256 KiB + 256 КБ + + + + 512 KiB + 512 КБ + + + + 1 MiB + 1 МБ + + + + 2 MiB + 2 МБ + + + + 4 MiB + 4 МБ + + + + 8 MiB + 8 МБ + + + + 16 MiB + 16 МБ + + + + Auto + Авто + + + + Private (won't be distributed on DHT network if enabled) + Приватный (при включении не будет раздаваться через децентрализованную сеть DHT) + + + + Start seeding after creation + Начать раздавать после создания + + + + Ignore share ratio limits for this torrent + Игнорировать ограничения коэффициента раздачи для этого торрента + + + + Create and save... + Создать и сохранить… + + + + Progress: + Прогресс: + + + + downloadFromURL + + + Add torrent links + Добавьте ссылки на торренты - - Web UI: HTTPS setup failed, fallback to HTTP - Веб-интерфейс: Установка HTTPS не удалась, откат к HTTP + + One per line (HTTP links, Magnet links and info-hashes are supported) + Одна ссылка на строку (поддерживаются HTTP-ссылки, magnet-ссылки и info-хеши) - - Web UI: Now listening on IP: %1, port: %2 - Веб-интерфейс: Сейчас используется IP: %1, порт: %2 + + Download + Загрузить + + + + Cancel + Отмена + + + + Download from urls + Загрузить торренты по ссылкам + + + + No URL entered + Адрес не введён + + + + Please type at least one URL. + Пожалуйста, введите хотя бы одну ссылку. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Веб-интерфейс: Невозможно занять IP: %1, порт: %2. Причина: %3 + + Crash info + Детали сбоя fsutils - + + + + + Downloads Загрузки @@ -9767,100 +8743,140 @@ misc - + B bytes Б - + KiB kibibytes (1024 bytes) КБ - + MiB mebibytes (1024 kibibytes) МБ - + GiB gibibytes (1024 mibibytes) ГБ - + TiB tebibytes (1024 gibibytes) ТБ - + PiB pebibytes (1024 tebibytes) ПБ - + EiB exbibytes (1024 pebibytes) ЭБ - + + Python not detected + Python не найден + + + + Python version: %1 + Версия Python: %1 + + + /s per second - + %1h %2m e.g: 3hours 5minutes %1 ч %2 мин - + %1d %2h e.g: 2days 10hours %1 д %2 ч - + Unknown Unknown (size) Неизвестно - + qBittorrent will shutdown the computer now because all downloads are complete. - qBittorrent сейчас выключит компьютер, так как все загрузки были завершены. + qBittorrent сейчас выключит компьютер, так как все загрузки завершены. - + < 1m < 1 minute < 1 мин - + %1m e.g: 10minutes %1 мин + + + Working + Работает + + + + Updating... + Обновляется… + + + + Not working + Не работает + + + + Not contacted yet + Не соединился + preview - + Preview selection Выбор предпросмотра - + The following files support previewing, please select one of them: - Следующие файлы поддерживают предпросмотр, пожалуйста, выберите один из них: + Следующие файлы поддерживают предпросмотр, выберите один из них: + + + + Preview + Предпросмотр + + + + Cancel + Отмена diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_sk.ts qbittorrent-3.3.15/src/lang/qbittorrent_sk.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_sk.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_sk.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - + O aplikácii qBittorrent - + About - + O aplikácii - + Author - - - - - Current maintainer - + Autor - - Greece - Grécko + + + Nationality: + Národnosť: - - - Nationality: - + + + Name: + Meno: - - + + E-mail: - + E-mail: - - - Name: - + + Greece + Grécko - - Original author - + + Current maintainer + Súčasný správca - - France - Francúzsko + + Original author + Pôvodný autor - + Special Thanks - + Špeciálne poďakovanie - + Translators - + Prekladatelia - - License - - - - + Libraries - + Knižnice - + qBittorrent was built with the following libraries: - - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - + Táto verza qBittorrent bola zostavená s nasledovnými knižnicami: - - Forum: - + + France + Francúzsko - - Bug Tracker: - + + License + Licencia @@ -115,57 +90,67 @@ Uložiť do - + + Browse... + Prehliadať... + + + + Set as default save path + Nastaviť ako predvolenú cestu pre uloženie + + + Never show again Už nikdy nezobrazovať - + Torrent settings Nastavenia torrentu - + Set as default category Nastaviť ako predvolenú kategóriu - + Category: Kategória: - + Start torrent Spustiť torrent - + Torrent information Informácie o torrente - + Skip hash check Preskočiť kontrolu hašu - + Size: Veľkosť: - + Hash: Haš info: - + Comment: Komentár: - + Date: Dátum: @@ -190,117 +175,89 @@ Automaticky - - Remember last used save path - - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog Ak je zaškrtnuté, tak .torrent súbor nebude vymazaný napriek nastaveniu na záložke "Sťahovanie" v okne "Možnosti" - + Do not delete .torrent file Nevymazať súbor .torrent - - Create subfolder - - - - - Download in sequential order - Sťahovať v poradí - - - - Download first and last pieces first - Sťahovať najprv prvú a poslednú časť - - - + Normal Normálna - + High Vysoká - + Maximum Maximálna - + Do not download Nesťahovať - - - + + + I/O Error V/V chyba - + Invalid torrent Neplatný torrent - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - + + + + + Already in download list + Už sa nachádza v zozname sťahovaných - + Not Available This comment is unavailable Nedostupný - + Not Available This date is unavailable Nedostupný - + Not available Nedostupný - + Invalid magnet link Neplatný odkaz Magnet - + The torrent file '%1' does not exist. Torrentový súbor '%1' neexistuje. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. Torrentový súbor '%1' sa nepodarilo načítať z disku. Pravdepodobne nemáte dostatočné práva. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ Chyba: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torrent sa už nachádza v zozname sťahovaných. Trackery však neboli boli zlúčené, pretože ide o privátny torrent. + + + + Torrent is already in download list. Trackers were merged. + Torrent sa už nachádza v zozname sťahovaných. Trackery boli zlúčené. + + + + + Cannot add torrent + Nepodarilo sa pridať torrent + + + + Cannot add this torrent. Perhaps it is already in adding state. + Nepodarilo sa pridať torrent. Pravdepodobne už je v zozname pridávaných. + + + This magnet link was not recognized Tento odkaz Magnet nebol rozpoznaný - + + Magnet link is already in download list. Trackers were merged. + Odkaz Magnet sa už nachádza v zozname sťahovaných. Trackery boli zlúčené. + + + + Cannot add this torrent. Perhaps it is already in adding. + Nepodarilo sa pridať torrent. Pravdepodobne už je v zozname pridávaných. + + + Magnet link Odkaz Magnet - + Retrieving metadata... Získavajú sa metadáta... - + Not Available This size is unavailable. Nedostupný - + Free space on disk: %1 Voľné miesto na disku: %1 - + + Choose save path Zvoľte cieľový adresár - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - + + Rename the file + Premenovať súbor - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + + New name: + Nový názov: - - Magnet link is already queued for processing. - + + + The file could not be renamed + Nebolo možné premenovať súbor - - New name: - Nový názov: + + This file name contains forbidden characters, please choose a different one. + Tento názov súboru obsahuje nepovolené znaky. Prosím, zvoľte iný názov. - - + + This name is already in use in this folder. Please use a different name. Tento názov sa v tomto adresári už používa. Prosím, zvoľte iný názov. - + The folder could not be renamed Nebolo možné premenovať priečinok - + Rename... Premenovať... - + Priority Priorita - + Invalid metadata Neplatné metadáta - + Parsing metadata... Spracovávajú sa metadáta... - + Metadata retrieval complete Získavanie metadát dokončené - + Download Error Chyba pri sťahovaní @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Veľkosť vyrovnávacej pamäte pre zápis na disk + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Odcházajúce porty (min) [0: Vyonuté] - + Outgoing ports (Max) [0: Disabled] Odcházajúce porty (max) [0: Vyonuté] - + Recheck torrents on completion Znovu skontrolovať torrenty po dokončení - + Transfer list refresh interval Interval obnovovania zoznamu prenosov - + ms milliseconds ms - + Setting Nastavenie - + Value Value set for this setting Hodnota - - - (disabled) - - - - + (auto) (auto) - - min - minutes - - - - + All addresses Všetky adresy - + qBittorrent Section Sekcia qBittorent - - + + Open documentation Otvoriť dokumentáciu - + libtorrent Section Sekcia libtorrent - - Asynchronous I/O threads - - - - - Disk cache - - - - + s seconds s - + Disk cache expiry interval Interval vypršania platnosti diskovej vyrovnávacej pamäte - + Enable OS cache Povoliť OS cache - - Guided read cache - - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - - - - - - KiB - - - - - Send buffer watermark - - - - - Send buffer low watermark - - - - - Send buffer watermark factor - - - - - Prefer TCP - - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address - + + m + minutes + m - + Resolve peer countries (GeoIP) Prekladať názvy krajín rovesníkov (GeoIP) - + Resolve peer host names Prekladať názvy počítačov rovesníkov - + Strict super seeding Prísne super seedovanie - + Network Interface (requires restart) Sieťové rozhranie (vyžaduje reštart) - + Optional IP Address to bind to (requires restart) Voliteľná IP adresa s ktorou sa prepojiť (vyžaduje reštart) - + Listen on IPv6 address (requires restart) Počúvať na IPv6 adrese (vyžaduje reštart) - + Display notifications Zobrazovať hlásenia - + Display notifications for added torrents Zobrazovať hlásenia pre pridané torrenty - + Download tracker's favicon Stiahnuť favicon trackera - - Save path history length - - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - - - - - Round-robin - - - - - Fastest upload - - - - - Anti-leech - - - - - Upload choking algorithm - - - - + Confirm torrent recheck Potvrdenie opätovnej kontroly torrentu - - Confirm removal of all tags - - - - - Always announce to all trackers in a tier - + Exchange trackers with other peers + Vymieňať si trackery s ostatnými rovesníkmi - - Always announce to all tiers - + + Always announce to all trackers + Vždy oznamovať všetkým trackerom - + Any interface i.e. Any network interface t.j. Ľubovoľné sieťové rozhranie - + Save resume data interval How often the fastresume file is saved. Ulož interval dát pre pokračovanie - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - - - - + Maximum number of half-open connections [0: Unlimited] Maximálny počet polootvorených spojení [0: neobmedzený] - + IP Address to report to trackers (requires restart) Akú IP adresu oznamovať trackeru (vyžaduje reštart) - + Enable embedded tracker Zapnúť zabudovaný tracker - + Embedded tracker port Port zabudovaného trackera - + Check for software updates Skontrolovať aktualizácie softvéru - + Use system icon theme Používať vzhľad ikon systému @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 bol spustený - + Torrent: %1, running external program, command: %2 Torrent: %1, spustenie externého programu, príkaz: %2 - - Torrent name: %1 - - - - - Torrent size: %1 - - - - - Save path: %1 - - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - - - - - Thank you for using qBittorrent. - - - - - [qBittorrent] '%1' has finished downloading - + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrent: %1, vykonanie externého programu zlyhalo, príkaz je príliš dlhý (length > %2). - + Torrent: %1, sending mail notification Torrent: %1, posielanie oznámenia emailom - + Information Informácia - - To control qBittorrent, access the Web UI at %1 - + + To control qBittorrent, access the Web UI at http://localhost:%1 + Pre ovládanie qBittorrentu cez webové rozhranie choďte na adresu http://localhost:%1 - + The Web UI administrator user name is: %1 Používateľské meno správcu webového rozhrania je: %1 - + The Web UI administrator password is still the default one: %1 Heslo správcu webového rozhrania je stále predvolená hodnota: %1 - + This is a security risk, please consider changing your password from program preferences. Toto je bezpečnostné riziko. Prosím, zmeňte si heslo v Nastaveniach programu. - + Saving torrent progress... Ukladá sa priebeh torrentu... - - - Portable mode and explicit profile directory options are mutually exclusive - - - - - Portable mode implies relative fastresume - - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Uložiť do: @@ -861,834 +658,694 @@ Sťahovanie kanálov RSS - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - + + Enable Automated RSS Downloader + Zapnúť automatické sťahovanie RSS - + Download Rules Pravidlá sťahovania - + Rule Definition Definícia pravidla - + Use Regular Expressions Používať regulárne výrazy - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - - - - + Must Contain: Musí obsahovať: - + Must Not Contain: Nesmie obsahovať: - + Episode Filter: Filter epizód: - + Assign Category: Priradiť kategóriu: - + Save to a Different Directory Uložiť do iného adresára - + Ignore Subsequent Matches for (0 to Disable) ... X days Ignorovať následné hľadania pre (0 zakáže ignorovanie) - + Disabled - + Vypnuté - + days dní - + Add Paused: Pridať pozastavený: - + Use global settings Použiť globálne nastavenie - + Always Vždy - + Never Nikdy - + Apply Rule to Feeds: Použiť pravidlo na kanály: - + Matching RSS Articles Zodpovedajúce články RSS - + &Import... &Importovať... - + &Export... &Exportovať... - + Matches articles based on episode filter. Nájde články podľa filtra epizód. - + Example: Príklad: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match nájde epizódy 2, 5, 8 až 15, 30 a všetky nasledujúce z prvej sezóny - + Episode filter rules: Pravidlá pre filtrovanie epizód: - + Season number is a mandatory non-zero value Číslo sezóny je povinná, nenulová hodnota - + Episode number is a mandatory non-zero value + Číslo epizódy je povinná, nenulová hodnota + + + Filter must end with semicolon Filter musí končiť bodkočiarkou - + Three range types for episodes are supported: Tri druhy rozsahov pre epizódy sú podporované: - + Single number: <b>1x25;</b> matches episode 25 of season one Jedno číslo: <b>1x25;</b> zodpovedá epizóde 25 prvej sezóny - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Normálny rozsah: <b>1x25-40;</b> zodpovedá epizódam 25 až 40 prvej sezóny - - Episode number is a mandatory positive value - - - - - Rules - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Neohraničený rozsah: <b>1x25-;</b> zodpovedá epizóde 25 a všetkým nasledujúcim z prvej sezóny - - Rules (legacy) + + Episode number is a mandatory positive value - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - + Last Match: %1 days ago Naposledy nájdené: pred %1 dňami - + Last Match: Unknown Naposledy nájdené: neznáme - + New rule name Nový názov pravidla - + Please type the name of the new download rule. Prosím, napíšte nový názov pre tonto pravidlo sťahovania. - - + + Rule name conflict Konflikt v názvoch pravidel - - + + A rule with this name already exists, please choose another name. Pravidlo s týmto názvom už existuje. Prosím, zvoľte iný názov. - + Are you sure you want to remove the download rule named '%1'? Ste si istý, že chcete odstrániť pravidlo sťahovania s názvom '%1'? - + Are you sure you want to remove the selected download rules? Ste si istý, že chcete odstrániť vybrané pravidlá sťahovania? - + Rule deletion confirmation Potvrdenie zmazania pravidla - + Destination directory Cieľový adresár - + Invalid action - + Neplatná operácia - + The list is empty, there is nothing to export. - + Zoznam je prázdny, niet čo exportovať. - - Export RSS rules - + + Where would you like to save the list? + Kam chcete uložiť tento súbor? - - + + Rules list (*.rssrules) + Zoznam pravidiel (*.rssrules) + + + I/O Error - + V/V Chyba - - Failed to create the destination file. Reason: %1 - + + Failed to create the destination file + Nepodarilo sa vytvoriť cieľový súbor - - Import RSS rules - + + Please point to the RSS download rules file + Prosím, vyberte súbor s pravidlami sťahovania RSS - - Failed to open the file. Reason: %1 - + + Rules list + Zoznam pravidiel - + Import Error - + Chyba importu - - Failed to import the selected rules file. Reason: %1 - + + Failed to import the selected rules file + Nepodarilo sa importovať vybraný súbor pravidiel - + Add new rule... Pridať nové pravidlo... - + Delete rule Zmazať pravidlo - + Rename rule... Premenovať pravidlo... - + Delete selected rules Zmazať vybrané pravidlá - - Clear downloaded episodes... - - - - + Rule renaming Premenovanie pravidiel - + Please type the new rule name Prosím, napíšte názov nového pravidla - - Clear downloaded episodes - - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - - - - - - Position %1: %2 - + + Regex mode: use Perl-like regular expressions + Režim regulárnych výrazov: používať štýl Perl - + Wildcard mode: you can use - + ? to match any single character - + * to match zero or more of any characters - + Whitespaces count as AND operators (all words, any order) - + | is used as OR operator - + If word order is important use * instead of whitespace. - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - + will match all articles. - + will exclude all articles. - - - BanListOptionsDialog - - - List of banned IP addresses - - - - - Ban IP - - - - - Delete - Zmazať - - - - - Warning - - - - The entered IP address is invalid. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Režim zástupných znakov: <ul><li>? zodpovedá ľubovoľnému jednotlivému znaku</li><li>* zodpovedá nula alebo viac ľubovoľným znakom</li><li>Netlačiteľné znaky sa počítajú ako operátory AND</li></ul> - - The entered IP is already banned. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Režim zástupných znakov: <ul><li>? zodpovedá ľubovoľnému jednotlivému znaku</li><li>* zodpovedá nula alebo viac ľubovoľným znakom</li><li>| sa používa ako operátor OR</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support Na zmenenie podpory PeX je potrebný reštart - - Could not get GUID of configured network interface. Binding to IP %1 - - - - + Embedded Tracker [ON] Zabudovaný tracker [zapnutý] - + Failed to start the embedded tracker! Nepodarilo sa spustiť zabudovaný tracker! - + Embedded Tracker [OFF] Zabudovaný tracker [vypnutý] - + + '%1' reached the maximum ratio you set. Removing... + '%1' dosiahol nastavený maximálny pomer zdieľania. Odstraňujem... + + + + '%1' reached the maximum ratio you set. Pausing... + '%1' dosiahol nastavený maximálny pomer zdieľania. Pozastavujem... + + + System network status changed to %1 e.g: System network status changed to ONLINE Stav siete systému sa zmenil na %1 - + ONLINE pripojený - + OFFLINE nepripojený - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding Konfigurácia siete %1 sa zmenila, obnovuje sa väzba relácie - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. Nastavená adresa sieťového rozhrania %1 je neplatná. - - + Encryption support [%1] Podpora šifrovania [%1] - - + FORCED Vynútené - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - - - - - + Anonymous mode [%1] Anonymný režim [%1] - + Unable to decode '%1' torrent file. Nepodarilo sa dekódovať torrentový súbor '%1'. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Rekurzívne sťahovanie súboru '%1' vnoreného v torrente '%2' - + Queue positions were corrected in %1 resume files - + Couldn't save '%1.torrent' Nepodarilo sa uložiť '%1.torrent'. - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - - - - + because %1 is disabled. this peer was blocked because uTP is disabled. pretože %1 je zakázané. - + because %1 is disabled. this peer was blocked because TCP is disabled. pretože %1 je zakázané. - + URL seed lookup failed for URL: '%1', message: %2 Vyhľadanie URL seedu zlyhalo pre URL: '%1', správa: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrentu sa nepodarilo počúvať na rozhraní %1 na porte: %2/%3. Dôvod: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + „%1“ bol odstránený zo zoznamu sťahovaných a z pevného disku. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + „%1“ bol odstránený zo zoznamu sťahovaných. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Prebieha sťahovanie „%1“, čakajte prosím... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent sa pokúša počúvať na všetkých rozhraniach na porte: %1 - + The network interface defined is invalid: %1 Definované sieťové rozhranie je neplatné: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent sa pokúša počúvať na rozhraní %1 na porte: %2 - - Peer ID: - - - - - HTTP User-Agent is '%1' - - - - - + DHT support [%1] Podpora DHT[%1] - - - - - - - - - + + + + ON Zapnuté - - - - - - - - - + + + + OFF Vypnuté - - + Local Peer Discovery support [%1] Podpora Local Peer Discovery [%1] - - PeX support [%1] - - - - - '%1' reached the maximum ratio you set. Removed. - - - - - '%1' reached the maximum ratio you set. Paused. - - - - - '%1' reached the maximum seeding time you set. Removed. - - - - - '%1' reached the maximum seeding time you set. Paused. - - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent nenašiel lokálnu adresu %1, na ktorej by mohol počúvať - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrentu sa nepodarilo počúvať na žiadnom porte rozhrania: %1. Dôvod: %2. - + Tracker '%1' was added to torrent '%2' Tracker „%1“ bol pridaný do torrentu „%2“ - + Tracker '%1' was deleted from torrent '%2' Tracker „%1“ bol vymazaný z torrentu „%2“ - + URL seed '%1' was added to torrent '%2' URL seed „%1“ bolo pridané do torrentu „%2“ - + URL seed '%1' was removed from torrent '%2' URL seed „%1“ bolo vymazané z torrentu „%2“ - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Nepodarilo sa obnoviť torrent „%1“. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Zadaný filter IP bol úspešne spracovaný: %1 pravidiel bolo použitých. - + Error: Failed to parse the provided IP filter. Chyba: Nepodarilo sa spracovať zadaný filter IP. - - '%1' restored. - 'torrent name' restored. - - - - + Couldn't add torrent. Reason: %1 Nepodarilo sa pridať torrent. Dôvod: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + „%1“ bol obnovený. (rýchle obnovenie) + + + '%1' added to download list. 'torrent name' was added to download list. „%1“ bol pridaný do zoznamu na sťahovanie. - + An I/O error occurred, '%1' paused. %2 Vyskytla sa V/V chyba, „%1“ je pozastavené. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Zlyhanie mapovania portov, správa: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Mapovanie portov úspešné, správa: %1 - + due to IP filter. this peer was blocked due to ip filter. v dôsledku filtra IP. - + due to port filter. this peer was blocked due to port filter. v dôsledku filtra portov. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. v dôsledku i2p reštrikcií zmiešaného módu. - + because it has a low port. this peer was blocked because it has a low port. pretože má nízky port. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent úspešne počúva na rozhraní %1 na porte: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 Externá IP: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + Nepodarilo sa presunúť torrent: „%1“.. Dôvod: %2 - + File sizes mismatch for torrent '%1', pausing it. - + Veľkosti súborov sa líšia pre torrent '%1', pozastavuje sa. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - + Rýchle obnovenie torrentu '%'1 bolo zamietnuté. Dôvod: %2. Prebieha opätovná kontrola... CategoryFilterModel - + Categories Kategórie - + All - + Všetky - + Uncategorized @@ -1698,7 +1355,7 @@ Add category... - + Pridať kategóriu... @@ -1707,33 +1364,138 @@ - Edit category... + Remove category + Odstrániť kategóriu + + + + Remove unused categories + Odstrániť nepoužívané kategórie + + + + Resume torrents - - Remove category + + Pause torrents + Pozastaviť torrenty + + + + Delete torrents + Zmazať torrenty + + + + New Category + Nová kategória + + + + Category: + Kategória: + + + + Invalid category name + Neplatný názov kategórie + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Názov kategórie nesmie obsahovať znak '\'. +Názov kategóre nesmie začínať ani končiť znakom '/'. +Názov kategórie nesmie obsahovať postupnosť znakov '//'. + + + + + Category exists - - Remove unused categories + + Category name already exists. - + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Všetky (0) + + + Uncategorized (0) + Bez kategórie (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Bez kategórie (%1) + + + Add category... + Pridať kategóriu... + + + Remove category + Odstrániť kategóriu + + + Remove unused categories + Odstrániť nepoužívané kategórie + + Resume torrents - Obnov torrenty + Pokračovať v torrentoch - Pause torrents - Pozastaviť torrenty + Pozastaviť torrenty - Delete torrents - Zmazať torrenty + Zmazať torrenty + + + New Category + Nová kategória + + + Category: + Kategória: + + + Invalid category name + Neplatný názov kategórie + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Názov kategórie nesmie obsahovať znak '\'. +Názov kategóre nesmie začínať ani končiť znakom '/'. +Názov kategórie nesmie obsahovať postupnosť znakov '//'. + + + All (%1) + this is for the category filter + Všetky (%1) @@ -1773,617 +1535,575 @@ - DeletionConfirmationDialog - - - Deletion confirmation - - - - - Remember choice - - - - - Also delete the files on the hard disk - - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Ste si istý, že chcete vymazať '%1' zo zoznamu prenosov? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - - - - - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - - - - - No URL entered - - - - - Please type at least one URL. - + Ste si istý, že chcete vymazať týchto %1 torrentov zo zoznamu prenosov? DownloadedPiecesBar - + White: Missing pieces Biele: chýbajúce kúsky - + Green: Partial pieces Biele: nedokončené kúsky - + Blue: Completed pieces Biele: dokončené kúsky - ExecutionLogWidget + ExecutionLog - + General - Všeobecné + Všeobecné - + Blocked IPs - + Zablokované IP - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> bol zablokovaný %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - + <font color='red'>%1</font> bol zakázaný FeedListWidget - + RSS feeds RSS kanály - - - Unread (%1) - + + Unread + Neprečítané FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. + + An error occured while trying to open the log file. Logging to file is disabled. - FileSystemPathEdit + FilterParserThread - - ... - Launch file dialog button text (brief) - + + + + I/O Error: Could not open ip filter file in read mode. + V/V chyba: Nepodarilo sa súbor filtra IP v režime čítania. - - &Browse... - Launch file dialog button text (full) - + + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. + Chyba syntaxe: Súbor filtra nie je platný PeerGuardian P2B súbor. + + + GeoIPDatabase - - Choose a file - Caption for file open/save dialog - + + + Unsupported database file size. + Nepodporovaná veľkosť súboru databázy. - - Choose a folder - Caption for directory open dialog - - - - - Any file - - - - - FilterParserThread - - - - - I/O Error: Could not open IP filter file in read mode. - - - - - - - IP filter line %1 is malformed. - - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - - - - - - IP filter exception thrown for line %1. Exception is: %2 - - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - - - - - - - - - - - Parsing Error: The filter file is not a valid PeerGuardian P2B file. - Chyba syntaxe: Súbor filtra nie je platný PeerGuardian P2B súbor. - - - - GeoIPDatabase - - - - Unsupported database file size. - Nepodporovaná veľkosť súboru databázy. - - - + Metadata error: '%1' entry not found. Chyba metadát: záznam "%1" nebol nájdený. - + Metadata error: '%1' entry has invalid type. Chyba metadát: záznam "%1" má neplatný typ. - + Unsupported database version: %1.%2 Nepodporovaná verzia databázy: %1.%2 - + Unsupported IP version: %1 Nepodporovaná verzia IP: %1 - + Unsupported record size: %1 Nepodporovaná veľkosť záznamu: %1 - + Invalid database type: %1 Neplatný typ databázy: %1 - + Database corrupted: no data section found. Poškodená databáza: nebola nájdená žiadna dátová sekcia. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - + + File + Súbor - - Bad Http request, closing socket. IP: %s - + + Edit + Upraviť - - - HttpServer - + + Help + Pomocník + + + Exit qBittorrent Ukončiť qBittorrent - + Only one link per line Iba jeden odkaz na riadok - + + Download + Stiahnuť + + + Global upload rate limit must be greater than 0 or disabled. Globálne obmedzenie na rýchlosť nahrávania musí byť väčšie ako 0 alebo vypnuté. - + Global download rate limit must be greater than 0 or disabled. Globálne obmedzenie na rýchlosť sťahovania musí byť väčšie ako 0 alebo vypnuté. - + Alternative upload rate limit must be greater than 0 or disabled. Alternatívne obmedzenie na rýchlosť nahrávania musí byť väčšie ako 0 alebo vypnuté. - + Alternative download rate limit must be greater than 0 or disabled. Alternatívne obmedzenie na rýchlosť sťahovania musí byť väčšie ako 0 alebo vypnuté. - + Maximum active downloads must be greater than -1. Maximálny počet aktívnych sťahovaní musí byť väčší ako -1. - + Maximum active uploads must be greater than -1. Maximálny počet aktívnych nahrávaní musí byť väčší ako -1. - + Maximum active torrents must be greater than -1. Maximálny počet aktívnych torrentov musí byť väčší ako -1. - + Maximum number of connections limit must be greater than 0 or disabled. Maximálny počet spojení musí byť väčší ako 0 alebo vypnutý. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Maximálny počet spojení na torrent musí byť väčší ako 0 alebo vypnutý. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Maximálny počet nahrávacích pozící musí byť väčší ako 0 alebo vypnutý. - + Unable to save program preferences, qBittorrent is probably unreachable. Nepodarilo sa uložiť nastavenia programu, qBittorrent je pravdepodobne nedostupný. - - IRC: #qbittorrent on Freenode - - - - - Invalid category name: -Please do not use any special characters in the category name. - - - - - Unknown - Neznáma - - - - Hard Disk - - - - - Share ratio limit must be between 0 and 9998. - - - - - Seeding time limit must be between 0 and 525600 minutes. - + + Language + Jazyk - + The port used for incoming connections must be between 1 and 65535. Port pre prichádzajúce spojenia musí byť medzi 1 a 65535. - + The port used for the Web UI must be between 1 and 65535. Port pre webové rozhranie musí byť medzi 1 a 65535. - + Unable to log in, qBittorrent is probably unreachable. Nepodarilo sa prihlásiť, qBittorrent je pravdepodobne nedosiahnuteľný. - + Invalid Username or Password. Nesprávne užívateľské meno alebo heslo. - - Username - - - - + Password Heslo - + Login Prihlasovacie meno - + + Upload Failed! + Nahrávanie zlyhalo! + + + Original authors Pôvodní autori - + + Upload limit: + Limit pre nahrávanie: + + + + Download limit: + Limit na sťahovanie: + + + Apply Použiť - + Add Pridať - + + Category: + Kategória: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Nahrať torrenty - + + All + Všetky + + + + Downloading + Sťahuje sa + + + + Seeding + Seeduje sa + + + + Completed + Dokončené + + + + Resumed + Obnovené + + + + Paused + Pozastavené + + + + Active + Aktívne + + + + Inactive + Neaktívne + + + Save files to location: Uložiť súbory do priečinka: - + Cookie: Cookie: - + Type folder here Napíšte sem názov priečinku - + + Run an external program on torrent completion + Po dokončení sťahovania spustiť externý program + + + + Enable bandwidth management (uTP) + Zapnúť správu šírky prenosového pásma (uTP) + + + + Apply rate limit to uTP connections + Použiť rýchlostné obmedzenie na spojenia uTP + + + + Alternative Global Rate Limits + Alternatívne globálne rýchlostné obmedzenia + + + More information Ďalšie informácie - + Information about certificates Informácie o certifikátoch - + Save Files to Uložiť súbory do - - Set location - - - - - Limit upload rate - + + Watch Folder + Sledovať priečinok - - Limit download rate - + + Default Folder + Predvolený priečinok - - Rename torrent - + + from + from time1 to time2 + od - - Unable to create category - + + to + from time1 to time2 + do - + Other... Save Files to: Watch Folder / Default Folder / Other... Iné... - + + Every day + Schedule the use of alternative rate limits on ... + Každý deň + + + + Week days + Schedule the use of alternative rate limits on ... + Pracovné dni + + + + Week ends + Schedule the use of alternative rate limits on ... + Víkendy + + + Monday Schedule the use of alternative rate limits on ... Pondelok - + Tuesday Schedule the use of alternative rate limits on ... Utorok - + Wednesday Schedule the use of alternative rate limits on ... Streda - + Thursday Schedule the use of alternative rate limits on ... Štvrtok - + Friday Schedule the use of alternative rate limits on ... Piatok - + Saturday Schedule the use of alternative rate limits on ... Sobota - + Sunday Schedule the use of alternative rate limits on ... Nedeľa - + + Downloaded + Is the file downloaded or not? + Stiahnuté + + + Logout Odhlásenie - + + Download from URLs + Stiahnuť z viacerých URL + + + Download Torrents from their URLs or Magnet links Stiahnuť torrenty z ich URL alebo odkazov Magnet - + Upload local torrent Nahrať lokálny torrent - + Are you sure you want to delete the selected torrents from the transfer list? Ste si istý, že chcete zmazať vybrané torrenty zo zoznamu prenosov? - + Save Uložiť - + qBittorrent client is not reachable Klient qBittorrent nie je dostupný - - qBittorrent has been shutdown. - qBittorrent bol ukončený. + + HTTP Server + HTTP server - - - IPSubnetWhitelistOptionsDialog - - List of whitelisted IP subnets - - - - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - + + The following parameters are supported: + Nasledovné parametre sú podporované: - - Add subnet - + + Torrent path + Cesta k torrentu - - Delete - Zmazať + + Torrent name + Názov torrentu - - Error - Chyba + + qBittorrent has been shutdown. + qBittorrent bol ukončený. + + + LineEdit - - The entered subnet is invalid. - + + Clear the text + Vyčistiť pole LogListWidget - + Copy Kopírovať - + Clear Vyčistiť @@ -2416,550 +2136,492 @@ Po &skončení sťahovania - + &View &Zobraziť - + &Options... Mo&žnosti... - + &Resume Pok&račovať - + Torrent &Creator &Vytvoriť torrent - + Set Upload Limit... Nastaviť obmedzenie nahrávania... - + Set Download Limit... Nastaviť obmedzenie sťahovania... - + Set Global Download Limit... Nastaviť globálne obmedzenie sťahovania... - + Set Global Upload Limit... Nastaviť globálne obmedzenie nahrávania... - + Minimum Priority Najnižšia priorita - + Top Priority Najvyššia priorita - + Decrease Priority Znížiť prioritu - + Increase Priority Zvýšiť prioritu - - + + Alternative Speed Limits Alternatívne obmedzenia rýchlostí - + &Top Toolbar Panel nás&trojov - + Display Top Toolbar Zobraziť horný panel nástrojov - - Status &Bar - - - - + S&peed in Title Bar Rýchlo&sť v titulnom pruhu - + Show Transfer Speed in Title Bar Zobraziť prenosovú rýchlosť v titulnom pruhu - + &RSS Reader Čítačka &RSS - + Search &Engine &Vyhľadávač - + L&ock qBittorrent &Zamknúť qBittorrent - + Do&nate! &Prispejte! - - Close Window - - - - + R&esume All Pokračovať vš&etky - + Manage Cookies... Spravovať Cookies... - + Manage stored network cookies Spravovať cookies uložené z internetu - + Normal Messages Normálne správy - + Information Messages Informačné správy - + Warning Messages Upozorňujúce správy - + Critical Messages Kritické správy - + &Log Žurná&l - + &Exit qBittorrent &Ukončiť qBittorrent - + &Suspend System U&spať systém - + &Hibernate System Uspať systém na &disk - + S&hutdown System &Vypnúť systém - + &Disabled &Neurobiť nič - + &Statistics Štatistik&a - + Check for Updates &Skontrolovať aktualizácie - + Check for Program Updates Skontrolovať aktualizácie programu - + &About O &aplikácii - + &Pause &Pozastaviť - + &Delete &Zmazať - + P&ause All Poz&astaviť všetky - + &Add Torrent File... Prid&ať torrentový súbor... - + Open Otvoriť - + E&xit U&končiť - + Open URL Otvoriť URL - + &Documentation &Dokumentácia - + Lock Zamknúť - - - + + + Show Zobraziť - + Check for program updates Skontrolovať aktualizácie programu - + Add Torrent &Link... Prid&ať torrentový súbor... - + If you like qBittorrent, please donate! Ak sa vám qBittorrent páči, prosím, prispejte! - - + Execution Log Záznam spustení - + Clear the password Vyčistiť heslo - + Filter torrent list... Filtruj zoznam torrentu... - + &Set Password &Nastaviť heslo - - Preferences - - - - + &Clear Password &Vymazať heslo - + Transfers Prenosy - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Asociácia typu súboru .torrent - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent nie je predvolená aplikácia na otváranie súborov torrent a odkazov Magnet. Chcete asociovať qBittorrent so súbormi torrent a odkazmi Magnet? - + Icons Only Iba ikony - + Text Only Iba text - + Text Alongside Icons Text vedľa ikôn - + Text Under Icons Text pod ikonami - + Follow System Style Používať systémové štýly - - - + + + UI lock password Heslo na zamknutie používateľského rozhrania - - - + + + Please type the UI lock password: Prosím, napíšte heslo na zamknutie používateľského rozhrania: - + The password should contain at least 3 characters Heslo by malo obsahovať aspoň 3 znaky - + Password update Aktualizovať heslo - + The UI lock password has been successfully updated Heslo na zamknutie používateľského rozhrania bolo úspešne aktualizované - + Are you sure you want to clear the password? Ste si istý, že chcete vyčistiť heslo? - - Use regular expressions - - - - + Search Vyhľadávanie - + Transfers (%1) Prenosy (%1) - + Error Chyba - + Failed to add torrent: %1 Nepodarilo sa pridať torrent: %1 - + Torrent added Torrent pridaný - + '%1' was added. e.g: xxx.avi was added. '%1' bol pridaný. - + Download completion Dokončenie sťahovnia - + I/O Error i.e: Input/Output Error V/V Chyba - + Recursive download confirmation Potvrdenie rekurzívneho sťahovania - + Yes Áno - + No Nie - + Never Nikdy - + Global Upload Speed Limit Globálne rýchlostné obmedzenie nahrávania - + Global Download Speed Limit Globálne rýchlostné obmedzenie sťahovania - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - - - - - Are you sure you want to quit qBittorrent? - - - - + &No &Nie - + &Yes &Áno - + &Always Yes &Vždy áno - - %1/s - s is a shorthand for seconds - - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter Starý interpreter Pythonu - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. Vaša verzia Pythonu (%1) je zastaraná. Pre správne fungovanie vyhľadávačov ju treba aktualizovať na novšiu verziu. Minimálne požiadavky: 2.7.9/3.3.0. - + qBittorrent Update Available Aktualizácia qBittorentu je dostupná - + + A new version is available. +Do you want to download %1? + Nová verzia je dostupná. +Prajete si stiahnuť %1? + + + Already Using the Latest qBittorrent Version Používate najnovšiu verziu qBittorrentu - + Undetermined Python version Nezistená verziu Pythonu - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. '%1' bol stiahnutý. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2968,158 +2630,154 @@ Dôvod: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? Torrent '%1' obsahuje ďalšie torrentové súbory. Chcete stiahnuť aj tie? - + Couldn't download file at URL '%1', reason: %2. Nepodarilo sa stiahnuť súbor z URL: '%1', dôvod: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin Python bol nájdený v %1: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + Nepodarilo sa zistiť vašu verziu Pythonu (%1). Vyhľadávače boli vypnuté. + + + + Missing Python Interpreter Chýbajúci interpreter Pythonu - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Na použitie vyhľadávačov je potrebný Python, ten však nie je nainštalovaný. Chcete ho inštalovať teraz? - + Python is required to use the search engine but it does not seem to be installed. Na použitie vyhľadávačov je potrebný Python, zdá sa však, že nie je nainštalovaný. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. Žiadne aktualizácie nie sú dostupné. Používate najnovšiu verziu. - + &Check for Updates &Skontrolovať aktualizácie - + Checking for Updates... Overujem aktualizácie... - + Already checking for program updates in the background Kontrola aktualizácií programu už prebieha na pozadí - + Python found in '%1' Python bol nájdený v '%1' - + Download error Chyba pri sťahovaní - + Python setup could not be downloaded, reason: %1. Please install it manually. Nebolo možné stiahnuť inštalačný program Pythonu. Dôvod: %1 Prosím, nainštalujte ho ručne. - - + + Invalid password Neplatné heslo - - - + + RSS (%1) RSS (%1) - + URL download error Chyba sťahovania z URL - + The password is invalid Heslo nie je platné - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Rýchlosť sťahovania: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Rýchlosť nahrávania: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [S: %1, N: %2] qBittorrent %3 - + Hide Skryť - + Exiting qBittorrent Ukončuje sa qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Niektoré súbory sa práve prenášajú. +Ste si istý, že chcete ukončiť Bittorrent? + + + Open Torrent Files Otvoriť torrent súbory - + Torrent Files Torrent súbory - + Options were saved successfully. Nastavenia boli úspešne uložené. @@ -3127,52 +2785,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. Váš dynamický DNS záznam bol úspešne aktualizovaný. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Chyba dynamického DNS: Služba je dočasne nedostupná, pokus sa zopakuje o 30 minút. - + Dynamic DNS error: hostname supplied does not exist under specified account. Chyba dynamického DNS: Zadaný názov hostiteľa v uvedenom účte neexistuje. - + Dynamic DNS error: Invalid username/password. Chyba dynamického DNS: Neplatné používateľské meno alebo heslo. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Chyba dynamického DNS: qBittorrent bol zaradený na čiernu listinu služby, nahláste prosím túto chybu na http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Chyba dynamického DNS: Služba vrátila %1, nahláste prosím túto chybu na http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Chyba dynamického DNS: Vaše používateľské meno bolo zablokované z dôvodu zneužitia. - + Dynamic DNS error: supplied domain name is invalid. Chyba dynamického DNS: Zadaný názov domény nie je platný. - + Dynamic DNS error: supplied username is too short. Chyba dynamického DNS: Zadané používateľské meno je príliš krátke. - + Dynamic DNS error: supplied password is too short. Chyba dynamického DNS: Zadané heslo je príliš krátke. @@ -3180,1413 +2838,1303 @@ Net::DownloadHandler - + I/O Error V/V chyba - + The file size is %1. It exceeds the download limit of %2. Veľkosť súboru je %1. Prekračuje tak limit na sťahovanie, ktorý je %2. - + Unexpected redirect to magnet URI. Neočakávané presmerovanie na magnet URI. - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. GeoIP databáza bola načítaná. Typ: %1. Doba vytvárania: %2. - - + + Couldn't load GeoIP database. Reason: %1 Nepodarilo sa načítať GeoIP databázu. Dôvod: %1 - + Venezuela, Bolivarian Republic of Venezuela - + Viet Nam Vietnam - - + + N/A Neuvedené - + Andorra Andora - + United Arab Emirates Spojené arabské emiráty - + Afghanistan Afganistan - + Antigua and Barbuda Antigua and Barbuda - + Anguilla Anguilla - + Albania Albánsko - + Armenia Arménsko - + Angola Angola - + Antarctica Antarktída - + Argentina Argentína - + American Samoa Americká Samoa - + Austria Rakúsko - + Australia Austrália - + Aruba Aruba - + Azerbaijan Azerbajdžan - + Bosnia and Herzegovina Bosna a Hercegovina - + Barbados Barbados - + Bangladesh Bangladéš - + Belgium Belgicko - + Burkina Faso Burkina Faso - + Bulgaria Bulharsko - + Bahrain Bahrajn - + Burundi Burundi - + Benin Benin - + Bermuda Bermuda - + Brunei Darussalam Brunej - + Brazil Brazília - + Bahamas Bahamy - + Bhutan Bhután - + Bouvet Island Bouvetov ostrov - + Botswana Botswana - + Belarus Bielorusko - + Belize Belize - + Canada Kanada - + Cocos (Keeling) Islands Kokosové ostrovy - + Congo, The Democratic Republic of the Konžská demokratická republika - + Central African Republic Stredoafrická republika - + Congo Kongo - + Switzerland Švajčiarsko - + Cook Islands Cookove ostrovy - + Chile Čile - + Cameroon Kamerun - + China Čína - + Colombia Kolumbia - + Costa Rica Kostarika - + Cuba Kuba - + Cape Verde Kapverdy - + Curacao Curaçao - + Christmas Island Vianočný ostrov - + Cyprus Cyprus - + Czech Republic Česká republika - + Germany Nemecko - + Djibouti Džibutsko - + Denmark Dánsko - + Dominica Dominika - + Dominican Republic Dominikánska republika - + Algeria Alžírsko - + Ecuador Ekvádor - + Estonia Estónsko - + Egypt Egypt - + Western Sahara Západná Sahara - + Eritrea Eritrea - + Spain Španielsko - + Ethiopia Etiópia - + Finland Fínsko - + Fiji Fidži - + Falkland Islands (Malvinas) Falklandské ostrovy (Malvíny) - + Micronesia, Federated States of Mikronézia - + Faroe Islands Faerské ostrovy - + France Francúzsko - + Gabon Gabon - + United Kingdom Spojené kráľovstvo - + Grenada Grenada - + Georgia Gruznsko - + French Guiana Francúzska Guyana - + Ghana Ghana - + Gibraltar Gibraltár - + Greenland Grónsko - + Gambia Gambia - + Guinea Guinea - + Guadeloupe Guadeloupe - + Equatorial Guinea Rovníková Guinea - + Greece Grécko - + South Georgia and the South Sandwich Islands Južná Georgia a Južné Sandwichove ostrovy - + Guatemala Guatemala - + Guam Guam - + Guinea-Bissau Guinea-Bissau - + Guyana Guyana - + Hong Kong Hong Kong - + Heard Island and McDonald Islands Heardov ostrov a McDonaldove ostrovy - + Honduras Honduras - + Croatia Chorvátsko - + Haiti Haiti - + Hungary Maďarsko - + Indonesia Indonézia - + Ireland Írsko - + Israel Izreal - + India India - + British Indian Ocean Territory Britské indickooceánske územie - + Iraq Irak - + Iran, Islamic Republic of Irán - + Iceland Island - + Italy Taliansko - + Jamaica Jamajka - + Jordan Jordánsko - + Japan Japonsko - + Kenya Keňa - + Kyrgyzstan Kyrgyzsko - + Cambodia Kambodža - + Kiribati Kiribati - + Comoros Komory - + Saint Kitts and Nevis Svätý Krištof a Nevis - + Korea, Democratic People's Republic of Kórejská ľudovodemokratická republika - + Korea, Republic of Kórejská republika - + Kuwait Kuvajt - + Cayman Islands Kajmanie ostrovy - + Kazakhstan Kazachstan - + Lao People's Democratic Republic Laos - + Lebanon Libanon - + Saint Lucia Svätá Lucia - + Liechtenstein Lichtenštajnsko - + Sri Lanka Srí Lanka - + Liberia Libéria - + Lesotho Lesoto - + Lithuania Litva - + Luxembourg Luxembursko - + Latvia Lotyšsko - + Morocco Maroko - + Monaco Monako - + Moldova, Republic of Moldavsko - + Madagascar Madagaskar - + Marshall Islands Marshallove ostrovy - + Mali Mali - + Myanmar Mjanmarsko - + Mongolia Mongolsko - + Northern Mariana Islands Severné Mariány - + Martinique Martinik - + Mauritania Mauritánia - + Montserrat Montserrat - + Malta Malta - + Mauritius Maurícius - + Maldives Maledivy - + Malawi Malawi - + Mexico Mexico - + Malaysia Malajzia - + Mozambique Mozambik - + Namibia Namíbia - + New Caledonia Nová Kaledónia - + Niger Niger - + Norfolk Island Ostrov Norfolk - + Nigeria Nigéria - + Nicaragua Nikaragua - + Netherlands Holandsko - + Norway Nórsko - + Nepal Nepál - + Nauru Nauru - + Niue Niue - + New Zealand Nový Zéland - + Oman Omán - + Panama Panama - + Peru Peru - + French Polynesia Francúzska Polynézia - + Papua New Guinea Papua-Nová Guinea - + Philippines Filipíny - + Pakistan Pakistan - + Poland Poľsko - + Saint Pierre and Miquelon Saint Pierre a Miquelon - + Puerto Rico Portoriko - + Portugal Portugalsko - + Palau Palau - + Paraguay Paraguaj - + Qatar Katar - + Reunion Réunion - + Romania Rumunsko - + Russian Federation Rusko - + Rwanda Rwanda - + Saudi Arabia Saudská Arábia - + Solomon Islands Šalamúnove ostrovy - + Seychelles Seychely - + Sudan Sudán - + Sweden Švédsko - + Singapore Singapur - + Slovenia Slovinsko - + Svalbard and Jan Mayen Svalbard a Jan Mayen - + Slovakia Slovensko - + Sierra Leone Sierra Leone - + San Marino San Marino - + Senegal Senegal - + Somalia Somálsko - + Suriname Surinam - + Sao Tome and Principe Svätý Tomáš a Princov ostrov - + El Salvador Salvádor - + Syrian Arab Republic Sýria - + Swaziland Svazijsko - + Turks and Caicos Islands Turks a Caicos - + Chad Čad - + French Southern Territories Francúzske južné a antarktické územia - + Togo Togo - + Thailand Thajsko - + Tajikistan Tadžikistan - + Tokelau Tokelau - + Turkmenistan Turkmenistan - + Tunisia Tunisko - + Tonga Tonga - - Could not decompress GeoIP database file. - - - - + Timor-Leste Východný Timor - + Bolivia, Plurinational State of Bolívia - + Bonaire, Sint Eustatius and Saba Bonaire, Svätý Eustach a Saba - + Cote d'Ivoire Pobrežie Slonoviny - + Libya Líbya - + Saint Martin (French part) Svätý Martin (Francúzska časť) - + Macedonia, The Former Yugoslav Republic of Macedónsko - + Macao Macao - + Pitcairn Pitcairnove ostrovy - + Palestine, State of Palestína - + Saint Helena, Ascension and Tristan da Cunha Svätá Helena - + South Sudan Južný Sudán - + Sint Maarten (Dutch part) Svätý Martin (Holandská časť) - + Turkey Turecko - + Trinidad and Tobago Trinidad a Tobago - + Tuvalu Tuvalu - + Taiwan Taiwan - + Tanzania, United Republic of Tanzánia - + Ukraine Ukrajina - + Uganda Uganda - + United States Minor Outlying Islands Menšie odľahlé ostrovy USA - + United States Spojené štáty - + Uruguay Uruguaj - + Uzbekistan Uzbekistan - + Holy See (Vatican City State) Vatikán - + Saint Vincent and the Grenadines Svätý Vincent a Grenadíny - + Virgin Islands, British Panenské ostrovy, Britské - + Virgin Islands, U.S. Panenské ostrovy, U.S.A - + Vanuatu Vanuatu - + Wallis and Futuna Wallis a Futuna - + Samoa Samoa - + Yemen Jemen - + Mayotte Mayotte - + Serbia Srbsko - + South Africa Južná Afrika - + Zambia Zambia - + Montenegro Čierna Hora - + Zimbabwe Zimbabwe - + Aland Islands Alandské ostrovy - + Guernsey Guernsey - + Isle of Man Ostrov Man - + Jersey Jersey - + Saint Barthelemy Svätý Bartolomej - + + Could not uncompress GeoIP database file. + Nepodarilo sa rozbaliť súbor s GeoIP databázou. + + + Couldn't save downloaded GeoIP database file. Nepodarilo sa uložiť stiahnutý súbor s GeoIP databázou. - + Successfully updated GeoIP database. GeoIP databáza bola úspešne aktualizovaná. - + Couldn't download GeoIP database file. Reason: %1 Nepodarilo sa stiahnuť súbor s GeoIP databázou. Dôvod: %1 @@ -4594,12 +4142,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] Podpora UPnP/NAT-PMP [zapnutá] - + UPnP / NAT-PMP support [OFF] Podpora UPnP/NAT-PMP [vypnutá] @@ -4607,7 +4155,7 @@ Net::Smtp - + Email Notification Error: Chyba emailovej notfikácie: @@ -4615,1273 +4163,1077 @@ OptionsDialog - + Options Možnosti - + Behavior Správanie - + Downloads Sťahovanie - + Connection Spojenie - + Speed Rýchlosť - + BitTorrent Bittorrent - - RSS - - - - + Web UI Webové rozhranie - + Advanced Rozšírené - + Language Jazyk - + User Interface Language: Jazyk používateľského rozhrania: - + (Requires restart) (vyžaduje reštart) - + Transfer List Zoznam prenosov - + Confirm when deleting torrents Potvrdiť zmazanie torrentu - + Use alternating row colors In transfer list, one every two rows will have grey background. Používať striedavé farby pozadia riadkov - + Hide zero and infinity values Skryť nulové a nekonečné hodnoty - + Always Vždy - + Paused torrents only Len pozastavené torrenty - + Action on double-click Akcia po dvojitom kliknutí - + Downloading torrents: Sťahované torrenty: - - + + Start / Stop Torrent Spusti / zastavi torrent - - + + Open destination folder Otvor cieľový priečinok - - + + No action Neurob nič - + Completed torrents: Dokončené torrenty: - + Desktop Plocha - + Start qBittorrent on Windows start up Spustiť qBittorrent pri štarte Windows - + Show splash screen on start up Zobraziť pri spustení štartovaciu obrazovku - + Start qBittorrent minimized Spustiť qBittorrent minimalizovaný - + Confirmation on exit when torrents are active Vyžiadať potvrdenie pri ukončení programu ak sú torrenty aktívne - + Confirmation on auto-exit when downloads finish Vyžiadať potvrdenie pri automatickom ukončení programu ak sťahovanie skončilo - - KiB - + + Show qBittorrent in notification area + Zobraziť qBittorrent v oznamovacej oblasti - - Email notification &upon download completion - + + Minimize qBittorrent to notification area + Minimalizovať qBittorrent do oznamovacej oblasti - - Run e&xternal program on torrent completion - + + Close qBittorrent to notification area + i.e: The systray tray icon will still be visible when closing the main window. + Po zatvorení minimalizuj qBittorrent do oznamovacej oblasti - - IP Fi&ltering - + + Tray icon style: + Štýl ikony v oznamovacej oblasti: - - Schedule &the use of alternative rate limits - + + Normal + Normálny - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - + + Monochrome (Dark theme) + Monochromatický (tmavá téma) - - &Torrent Queueing - + + Monochrome (Light theme) + Monochromatický (svetlá téma) - - Seed torrents until their seeding time reaches - + + File association + Asociácia typu súboru - - A&utomatically add these trackers to new downloads: - + + Use qBittorrent for .torrent files + Otvárať .torrent súbory programom qBittorrent - - RSS Reader - + + Use qBittorrent for magnet links + Otvárať odkazy magnet programom qBittorrent - - Enable fetching RSS feeds - + + Power Management + Správa napájania - - Feeds refresh interval: - + + Inhibit system sleep when torrents are active + Potlačiť prechod systému do režimu spánku ak sú torrenty aktívne - - Maximum number of articles per feed: - + + Log file + Log súbor - - - min - minutes - + + Save path: + Uložiť do: - - RSS Torrent Auto Downloader - + + Backup the log file after: + Zálohovať log súbor po dosiahnutí: - - Enable auto downloading of RSS torrents - + + MB + MB - - Edit auto downloading rules... - + + Delete backup logs older than: + Vymazať zálohy log súborov staršie ako: - - Web User Interface (Remote control) - + + days + Delete backup logs older than 10 months + dní - - IP address: - + + months + Delete backup logs older than 10 months + mesiacov - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - + + years + Delete backup logs older than 10 years + rokov - - Server domains: - + + When adding a torrent + Pri pridávaní torrentu - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - + + Display torrent content and some options + Zobraziť obsah torrentu a ďalšie voľby - - &Use HTTPS instead of HTTP - + + Bring torrent dialog to the front + Preniesť dialóg torrentu do popredia - - Bypass authentication for clients on localhost - + + Do not start the download automatically + The torrent will be added to download list in pause state + Pridať torrent do zoznamu sťahovaných ako pozastavený - - Bypass authentication for clients in whitelisted IP subnets - + + Should the .torrent file be deleted after adding it + Má byť .torrent súbor vymazaný po pridaní? - - IP subnet whitelist... - + + Delete .torrent files afterwards + Vymazať .torrent súbory po pridaní - - Upda&te my dynamic domain name - + + Also delete .torrent files whose addition was cancelled + Vymazať tiež .torrent súbory, ktorých pridanie zlyhalo - - Minimize qBittorrent to notification area - Minimalizovať qBittorrent do oznamovacej oblasti - - - - Close qBittorrent to notification area - i.e: The systray tray icon will still be visible when closing the main window. - Po zatvorení minimalizuj qBittorrent do oznamovacej oblasti - - - - Tray icon style: - Štýl ikony v oznamovacej oblasti: - - - - Normal - Normálny - - - - Monochrome (Dark theme) - Monochromatický (tmavá téma) - - - - Monochrome (Light theme) - Monochromatický (svetlá téma) - - - - File association - Asociácia typu súboru - - - - Use qBittorrent for .torrent files - Otvárať .torrent súbory programom qBittorrent - - - - Use qBittorrent for magnet links - Otvárať odkazy magnet programom qBittorrent - - - - Power Management - Správa napájania - - - - Save path: - Uložiť do: - - - - Backup the log file after: - Zálohovať log súbor po dosiahnutí: - - - - Delete backup logs older than: - Vymazať zálohy log súborov staršie ako: - - - - days - Delete backup logs older than 10 months - dní - - - - months - Delete backup logs older than 10 months - mesiacov - - - - years - Delete backup logs older than 10 years - rokov - - - - When adding a torrent - Pri pridávaní torrentu - - - - Bring torrent dialog to the front - Preniesť dialóg torrentu do popredia - - - - Do not start the download automatically - The torrent will be added to download list in pause state - Pridať torrent do zoznamu sťahovaných ako pozastavený - - - - Should the .torrent file be deleted after adding it - Má byť .torrent súbor vymazaný po pridaní? - - - - Also delete .torrent files whose addition was cancelled - Vymazať tiež .torrent súbory, ktorých pridanie zlyhalo - - - + Also when addition is cancelled Vymazať tiež .torrent súbory, ktorých pridanie bolo zrušené - + Warning! Data loss possible! Upozornenie! Vyskytla sa možná strata dát! - + Saving Management Správa ukladania - + Default Torrent Management Mode: Prednastavený režim správy torrentov: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category Automatický režim znamená, že niektoré vlastnosti torrentu (napr. cesta na ukladanie) budú určené na základe priradenej kategórie. - + Manual Manuálny - + Automatic Automatický - + When Torrent Category changed: Ak sa zmení kategória torrentu: - + Relocate torrent Premiestni torrent - + Switch torrent to Manual Mode Prepni torrent do manuálneho režimu - + When Default Save Path changed: Ak sa zmení predvolená cesta pre ukladanie: - - + + Relocate affected torrents Premiestni torrenty, ktorých sa zmena týka - - + + Switch affected torrents to Manual Mode Prepni torrenty, ktorých sa zmena týka, do manuálneho režimu - + When Category changed: Ak sa zmení kategória: - + Use Subcategories Použi podkategórie - + Default Save Path: Predvolená cesta pre ukladanie: - + Keep incomplete torrents in: Ponechať neúplné torrenty v: - + Copy .torrent files to: Kopírovať .torrent súbory do: - - Show &qBittorrent in notification area - - - - - &Log file - - - - - Display &torrent content and some options - - - - - Create subfolder for torrents with multiple files - - - - - De&lete .torrent files afterwards - - - - + Copy .torrent files for finished downloads to: Kopírovať .torrent súbory po dokončení sťahovania do: - + Pre-allocate disk space for all files Dopredu alokovať miesto pre všetky súbory - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding - - - - + Append .!qB extension to incomplete files Pridať príponu .!qB k nedokončeným súborom - - Enable recursive download dialog - - - - + Automatically add torrents from: Automaticky pridať torrenty z: - + Add entry Pridať záznam - + Remove entry Odstrániť záznam - + + Email notification upon download completion + Upozornenie o dokončení sťahovania emailom + + + + Destination email: + Cieľový email: + + + SMTP server: SMTP server: - + This server requires a secure connection (SSL) Tento server vyžaduje zabezpečené pripojenie (SSL) - - + + + Authentication Autentifikácia - - - - + + + + Username: Meno používateľa: - - - - + + + + Password: Heslo: - - Enabled protocol: - - - - - TCP and μTP - + + Run external program on torrent completion + Spustiť externý program po dokončení sťahovania - + Listening Port Počúvať na porte - + Port used for incoming connections: Port pre prichádzajúce spojenia: - + Random Náhodný - + Use UPnP / NAT-PMP port forwarding from my router Použiť presmerovanie portov UPnP/NAT-PMP z môjho smerovača - + Use different port on each startup Použiť pri každom spustení iný port - + Connections Limits Obmedzenia spojení - + Maximum number of connections per torrent: Maximálny počet spojení na torrent: - + Global maximum number of connections: Maximálny celkový počet spojení: - + Maximum number of upload slots per torrent: Maximálny počet slotov pre nahrávanie na torrent: - + Global maximum number of upload slots: Maximálny celkový počet slotov na nahrávanie: - + Proxy Server Proxy server - + Type: Typ: - + (None) (žiadny) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Host: - - + + Port: Port: - + Otherwise, the proxy server is only used for tracker connections Inak sa proxy server použije iba na pripojenia k trackeru - + Use proxy for peer connections Používať proxy na spojenia s rovesníkmi - + Disable connections not supported by proxies Zakázať spojenia, ktoré proxy nepodporujú - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection RSS kanály, vyhľadávacie module, softvérové aktualizácie a čokoľvek iné ako torrentové prenosy a podobné operácie (ako výmena medzi rovesníkmi) budú používať priame spojenie. - + Use proxy only for torrents Používať proxy len na torrenty. - - A&uthentication - - - - + Info: The password is saved unencrypted Info: Heslo sa ukladá nezašifrované - + + IP Filtering + IP filterovanie + + + Filter path (.dat, .p2p, .p2b): Cesta k filtrom (.dat, .p2p, .p2b): - + Reload the filter Znovu načítať filter - - Manually banned IP addresses... - - - - + Apply to trackers Použiť na trackery - + Global Rate Limits Globálne rýchlostné obmedzenia - - - - - - - KiB/s - - - - - + + Upload: Nahrávanie: - - + + + + + KiB/s + KiB/s + + + + Download: Sťahovanie: - + Alternative Rate Limits Alternatívne rýchlostné obmedzenia - - + + Schedule the use of alternative rate limits + Naplánovať použitie alternatívnych rýchlostných obmedzení + + + From: from (time1 to time2) Od: - - + To: time1 to time2 Do: - + When: Kedy: - + Every day Každý deň - + Weekdays Dni v týždni - + Weekends Víkendy - + Rate Limits Settings Nastavenia rýchlostných obmedzení - + Apply rate limit to peers on LAN Použiť rýchlostné obmedzenie na rovesníkov v LAN - + Apply rate limit to transport overhead Použiť rýchlostné obmedzenie na réžiu prenosu - - + + + Enable µTP protocol + Povoliť protokol µTP + + + Apply rate limit to µTP protocol Použiť obmedzenie rýchlosti na protokol µTP - + Privacy Súkromie - + Enable DHT (decentralized network) to find more peers Zapnúť DHT (decentralizovaná sieť) - umožní nájsť viac rovesníkov - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Vymieňať si zoznam rovesníkov s kompatibilnými klientmi siete Bittorrent (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers Zapnúť Peer eXchange (PeX) - umožní nájsť viac rovesníkov - + Look for peers on your local network Hľadať rovesníkov na vašej lokálnej sieti - + Enable Local Peer Discovery to find more peers Zapnúť Local Peer Discovery - umožní nájsť viac rovesníkov - + Encryption mode: Režim šifrovania: - + Prefer encryption Uprednostňovať šifrovanie - + Require encryption Vyžadovať šifrovanie - + Disable encryption Vypnúť šifrovanie - + Enable when using a proxy or a VPN connection Povoliť počas používania proxy alebo spojenia VPN - + Enable anonymous mode Zapnúť anonymný režim - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Ďalšie informácie</a>) + + + + Torrent Queueing + Zaraďovanie torrentov do frontu + + + Maximum active downloads: Maximálny počet aktívnych sťahovaní: - + Maximum active uploads: Maximálny počet aktívnych nahrávaní: - + Maximum active torrents: Maximálny počet aktívnych torrentov: - + Do not count slow torrents in these limits Nepočítať pomalé torrenty do týchto obmedzení - - Upload rate threshold: - - - - - Download rate threshold: - - - - - sec - seconds - - - - - Torrent inactivity timer: - - - - + Share Ratio Limiting Obmedzenie pomeru zdieľania - + Seed torrents until their ratio reaches Seedovať torrenty pokým ich pomer nedosiahne - + then potom - + Pause them ich pozastaviť - + Remove them ich odstrániť - - RSS Smart Episode Filters - + + Automatically add these trackers to new downloads: + Automaticky pridať tieto trackery k novým sťahovaniam: + + + + Enable Web User Interface (Remote control) + Zapnúť webové rozhranie (vzdialené ovládanie) - + Use UPnP / NAT-PMP to forward the port from my router Použiť presmerovanie portov UPnP/NAT-PMP z môjho smerovača - + + Use HTTPS instead of HTTP + Používať HTTPS namiesto HTTP + + + Certificate: Certifikát: - + Import SSL Certificate Importovať certifikát SSL - + Key: Kľúč: - + Import SSL Key Importovať kľúč SSL - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Informácie o certifikátoch</a> - - Use alternative Web UI - - - - - Files location: - - - - - Enable clickjacking protection - + + Bypass authentication for localhost + Obísť autentifikáciu pri prihlasovaní z lokálneho počítača - - Enable Cross-Site Request Forgery (CSRF) protection - + + Update my dynamic domain name + Aktualizovať môj dynamický názov domény - + Service: Služba: - + Register Zaregistrovať sa - + Domain name: Názov domény: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! Nastavením týchto volieb môžete <strong>nenávratne stratiť</strong> vaše .torrent súbory! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well Nastavením týchto volieb qBittorrent <strong>vymaže</strong> .torrent súbory po ich úspešnom (prvá voľba) alebo neúspešnom (druhá voľba) pridaní do zoznamu na sťahovanie. Toto nastavenie sa použije <strong>nielen</strong> na súbory otvorené cez položku menu &ldquo;Pridať torrent&rdquo; ale aj na súbory otvorené cez <strong>asociáciu typu súborov</strong> - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): - + %N: Torrent name - + %L: Category - - %G: Tags (seperated by comma) - - - - + %F: Content path (same as root path for multifile torrent) - + %R: Root path (first torrent subdirectory path) - + %D: Save path - + %C: Number of files - + %Z: Torrent size (bytes) - + %T: Current tracker - + %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor - + Folder is already being monitored: - + Folder does not exist: - + Folder is not readable: - + Adding entry failed - - - - + + Choose export directory - - - + + + + + + Choose a save directory - + Choose an IP filter file - + All supported filters - + SSL Certificate - + + SSL Key + + + + Parsing error - + Failed to parse the provided IP filter - + Successfully refreshed - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Zadaný filter IP bol úspešne spracovaný: %1 pravidiel bolo použitých. - + Invalid key - + This is not a valid SSL key. - + Invalid certificate - - Preferences - - - - - Import SSL certificate - - - - + This is not a valid SSL certificate. - - Import SSL key - - - - - SSL key - - - - + Time Error - + The start time and the end time can't be the same. - - + + Length Error - + The Web UI username must be at least 3 characters long. - + The Web UI password must be at least 6 characters long. @@ -5889,72 +5241,72 @@ PeerInfo - - Interested(local) and Choked(peer) - + + interested(local) and choked(peer) + interesovaný(lokálny) a blokovaný(rovesník) - + interested(local) and unchoked(peer) interesovaný(lokálny) a neblokovaný(rovesník) - + interested(peer) and choked(local) interesovaný(rovesník) a blokovaný(lokálny) - + interested(peer) and unchoked(local) interesovaný(rovesník) a neblokovaný(lokálny) - + optimistic unchoke optimisticky neblokovaní - + peer snubbed rovesník neposiela - + incoming connection prichádzajúce spojenie - + not interested(local) and unchoked(peer) neinteresovaný(lokálny) a neblokovaný(rovesník) - + not interested(peer) and unchoked(local) neinteresovaný(rovesník) a neblokovaný(lokálny) - + peer from PEX rovesník z PEX - + peer from DHT rovesník z DHT - + encrypted traffic šifrovaný prenos - + encrypted handshake šifrovaný handshake - + peer from LSD rovesník z LSD @@ -5962,193 +5314,178 @@ PeerListWidget - + IP IP - + Port Port - + Flags Príznaky - + Connection Spojenie - + Client i.e.: Client application Klient - + Progress i.e: % downloaded Priebeh - + Down Speed i.e: Download speed Rýchlosť sťahovania - + Up Speed i.e: Upload speed Rýchlosť nahrávania - + Downloaded i.e: total data downloaded Stiahnuté - + Uploaded i.e: total data uploaded Nahrané - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Dôležitosť: - + Files i.e. files that are being downloaded right now Súbory - + Column visibility Viditeľnosť stĺpca - + Add a new peer... Pridať nového rovesníka... - - + + Ban peer permanently Zablokovať rovesníka na stálo - + Manually adding peer '%1'... Manuálne pridaný rovesník '%1'... - + The peer '%1' could not be added to this torrent. Rovesníka '%1' nebolo možné pridať k tomuto torrentu. - + Manually banning peer '%1'... Manuálne zablokovaný rovesník '%1'... - - + + Peer addition Pridanie rovesníka - + Country - + Copy IP:port - + Some peers could not be added. Check the Log for details. Niektorých rovesníkov nebolo možné pridať. Pozrite prosím žurnál pre detaily. - + The peers were added to this torrent. Rovesníci boli pridaní k tomuto torrentu. - + Are you sure you want to ban permanently the selected peers? Ste si istý, že chcete zmazať natrvalo zablokovať vybraného rovesníka? - + &Yes Án&o - + &No &Nie - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - + PeersAdditionDlg - - Format: IPv4:port / [IPv6]:port - - - - + No peer entered - + Žiaden rovesník nevstúpil - + Please type at least one peer. - + Zadajte prosím aspoň jedného rovesníka. - + Invalid peer - + Neplatný rovesník - + The peer '%1' is invalid. - + Rovesník '%1' je neplatný. PieceAvailabilityBar - + White: Unavailable pieces Biele: nedostupné kúsky - + Blue: Available pieces Biele: dostupné kúsky @@ -6156,336 +5493,290 @@ PiecesBar - + Files in this piece: - + File in this piece - + File in these pieces - - Wait until metadata become available to see detailed information - - - - + Hold Shift key for detailed information - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Installed search plugins: - + Name - Názov + Meno - + Version - + Verzia - + Url - + Url - - + + Enabled - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Nainštalovať nový - + Check for updates - + Skontrolovať aktualizácie - + Close - + Zatvoriť - + Uninstall - + Odinštalovať - - - + + + Yes - Áno + Áno - - - - + + + + No - Nie + Nie - + Uninstall warning - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Niektoré zásuvné moduly nebolo možné odstrániť, pretože sú súčasťou aplikácie qBittorrent. + Iba tie, ktoré ste sami pridali je možné odstrániť. +Tieto moduly však boli vypnuté. - + Uninstall success - + All selected plugins were uninstalled successfully - + Všetky zvolené zásuvné moduly boli úspešne odinštalované - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - - - - - + + New search engine plugin URL - - + + URL: - + URL: - + Invalid link - + Neplatný odkaz - + The link doesn't seem to point to a search engine plugin. - + Zdá sa, že odkaz nesmeruje na zásuvný modul vyhľadávača. - + Select search plugins - + qBittorrent search plugin - - All your plugins are already up to date. + + + + Search plugin update - + + All your plugins are already up to date. + Všetky vaše vyhľadávacie zásuvné moduly sú už aktuálne. + + + Sorry, couldn't check for plugin updates. %1 - + + + Search plugin install - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + + + + Couldn't install "%1" search engine plugin. %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + + + + Couldn't update "%1" search engine plugin. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Search plugin source: - + Local file - + Lokálny súbor - + Web link - PowerManagement - - - qBittorrent is active - - - - - PreviewSelectDialog - - - Preview - - + PreviewSelect - + Name - Názov + Názov - + Size - Veľkosť + Veľkosť - + Progress - Priebeh + Priebeh - - + + Preview impossible - + Náhľad nie je možný - - + + Sorry, we can't preview this file - - - - - Private::FileLineEdit - - - '%1' does not exist - - - - - '%1' does not point to a directory - - - - - '%1' does not point to a file - - - - - Does not have read permission in '%1' - - - - - Does not have write permission in '%1' - + Prepáčte, tento súbor sa nedá otvoriť ako náhľad PropListDelegate - + Not downloaded Nestiahnuté - - + + Normal Normal (priority) Normálna - - N/A - Neuvedené - - - + Do not download Do not download (priority) Nesťahovať - - + + High High (priority) Vysoká - + Mixed Mixed (priorities Zmiešaná - - + + Maximum Maximum (priority) Maximálna @@ -6494,32 +5785,32 @@ PropTabBar - + General Všeobecné - + Trackers Trackery - + Peers Rovesníci - + HTTP Sources HTTP zdroje - + Content Obsah - + Speed Rýchlosť @@ -6613,22 +5904,22 @@ Komentár: - + Select All Vybrať všetky - + Select None Nevybrať nič - + Normal Normálna - + High Vysoká @@ -6688,165 +5979,165 @@ Uložené do: - + Maximum Maximálna + - Do not download Nesťahovať - + Never Nikdy - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (máte %3) - - + + %1 (%2 this session) %1 (%2 toto sedenie) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (seedovaný už %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (%2 max.) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 celkom) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 priem.) - + Open Otvoriť - + Open Containing Folder Otvoriť obsahujúci adresár - + Rename... Premenovať... - + Priority Priorita - + New Web seed Nový webový seed - + Remove Web seed Odstrániť webový seed - + Copy Web seed URL Kopírovať URL webového seedu - + Edit Web seed URL Upraviť URL webového seedu - + + Rename the file + Premenovať súbor + + + New name: Nový názov: - - + + + The file could not be renamed + Nebolo možné premenovať súbor + + + + This file name contains forbidden characters, please choose a different one. + Tento názov súboru obsahuje nepovolené znaky, preto zvoľte iný. + + + + This name is already in use in this folder. Please use a different name. Tento názov sa v tomto adresári už používa. Prosím, zvoľte iný názov. - + The folder could not be renamed Nebolo možné premenovať adresár - + qBittorrent qBittorrent - + Filter files... Filtruj súbory... - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - - - - + New URL seed New HTTP source Nový URL seed - + New URL seed: Nový URL seed: - - + + This URL seed is already in the list. Tento URL seed je už v zozname. - + Web seed editing Úprava webového seedu - + Web seed URL: URL webového seedu: @@ -6854,585 +6145,552 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + Vaša IP adresa bola zakázaná kvôli príliš veľkému počtu neúspešných pokusov o prihlásenie. + + + + Error: '%1' is not a valid torrent file. + + Chyba: '%1' nie je korektný torrentový súbor. + + + + + + Error: Could not add torrent to session. + Chyba: nepodarilo sa pridať torrent do sedenia. + + + + I/O Error: Could not create temporary file. + V/V chyba: Nepodarilo sa vytvoriť dočasný súbor. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 je neznámy parameter príkazového riadka - - + + %1 must be the single command line parameter. %1 musí byť jediný parameter príkazového riadka - + + %1 must specify the correct port (1 to 65535). + %1 musí určovať správny port (1 to 65535). + + + You cannot use %1: qBittorrent is already running for this user. Nemožno použiť %1: qBitorrent bol už pre tohto užívateľa spustený. - + Usage: Použitie: - + Options: Voľby: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - + + Displays program version + zobraz verziu programu - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - + + Displays this help message + zobraz túto nápvedu - - Expected integer number in environment variable '%1', but got '%2' - + + Changes the Web UI port (current: %1) + Zmeň port webového rozhrania (aktuálny: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - + + Disable splash screen + vypni štartovaciu obrazovku - - Expected %1 in environment variable '%2', but got '%3' - + + Run in daemon-mode (background) + spusti v režime démona (na pozadí) - - port - + + Downloads the torrents passed by the user + stiahni torrenty zadané užívateľom - - %1 must specify a valid port (1 to 65535). - + + Help + Nápoveda - - Display program version and exit - + + Run application with -h option to read about command line parameters. + Spustite aplikáciu s parametrom -h pre zobrazenie nápovedy o prípustných parametroch. - - Display this help message and exit - + + Bad command line + Chyba v príkazovom riadku - - Change the Web UI port - + + Bad command line: + Chyba v príkazovom riadku: - - Disable splash screen - vypni štartovaciu obrazovku + + Legal Notice + Právne upozornenie - - Run in daemon-mode (background) - spusti v režime démona (na pozadí) + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + qBittorrent je program na zdieľanie súborov. Spustením torrentu sa jeho dáta sprístupnia iným prostredníctvom nahrávania. Za akýkoľvek obsah, ktorý zdieľate, nesiete výlučnú zodpovednosť Vy. + +Žiadne ďalšie upozornenie už nebude zobrazené. - - dir - Use appropriate short form or abbreviation of "directory" - + + Press %1 key to accept and continue... + Pre akceptovanie a pokračovanie stlačte kláves %1.... - - Store configuration files in <dir> - + + Legal notice + Právne upozornenie - - - name - + + Cancel + Zrušiť - - Store configuration files in directories qBittorrent_<name> - + + I Agree + Súhlasím - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - + + Torrent name: %1 + Názov torrentu: %1 - - files or URLs - + + Torrent size: %1 + Veľkosť torrentu: %1 - - Download the torrents passed by the user - + + Save path: %1 + Uložiť do: %1 - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Torrent bol stiahnutý za %1. - - Options when adding new torrents: - + + Thank you for using qBittorrent. + Ďakujeme, že používate qBittorrent. - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - + + [qBittorrent] '%1' has finished downloading + [qBittorrent] sťahovanie '%1' bolo dokončené - - path - + + The remote host name was not found (invalid hostname) + Nepodarilo sa zistiť názov vzdialeného počítača (neplatný názov počítača) - - Torrent save path - + + The operation was canceled + Operácia bola zrušená - - Add torrents as started or paused - + + The remote server closed the connection prematurely, before the entire reply was received and processed + Vzdialený server predčasne zatvoril spojenie predtým, než bola prijatá a spracovaná celá odpoveď - - Skip hash check - Preskočiť kontrolu hašu + + The connection to the remote server timed out + Čas spojenia so vzdialeným serverom vypršal - - Assign torrents to category. If the category doesn't exist, it will be created. - + + SSL/TLS handshake failed + SSL/TLS handshake zlyhal - - Download files in sequential order - + + The remote server refused the connection + Vzdialený server odmietol spojenie - - Download first and last pieces first - Sťahovať najprv prvú a poslednú časť + + The connection to the proxy server was refused + Spojenie s proxy serverom bolo odmietnuté - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - + + The proxy server closed the connection prematurely + Proxy server predčasne zatvoril spojenie - - Command line parameters take precedence over environment variables - + + The proxy host name was not found + Názov proxy servera nebol nájdený - - Help - Nápoveda + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Čas spojenia s proxy serverom vypršal alebo proxy server neodpovedal včas na zaslanú požiadavku - - Run application with -h option to read about command line parameters. - Spustite aplikáciu s parametrom -h pre zobrazenie nápovedy o prípustných parametroch. + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Proxy vyžaduje autentifikáciu aby mohol splniť požiadavku, neprijal ale žiadne z ponúkaných prihlasovacích údajov - - Bad command line - Chyba v príkazovom riadku + + The access to the remote content was denied (401) + Prístup k vzdialenému obsahu bol zamietnutý (401) - - Bad command line: - Chyba v príkazovom riadku: + + The operation requested on the remote content is not permitted + Požadovaná operácia so vzdialeným obsahom nie je povolená - - Legal Notice - Právne upozornenie + + The remote content was not found at the server (404) + Vzdialený obsah nebol nájdený na serveri (404) - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Vzdialený server vyžaduje na poskytnutie obsahu autentifikáciu, neprijal ale poskytnuté prihlasovacie údaje. - - No further notices will be issued. - + + The Network Access API cannot honor the request because the protocol is not known + Network Access API neprijalo požiadavku, pretože protokol nie je známy - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - qBittorrent je program na zdieľanie súborov. Spustením torrentu sa jeho dáta sprístupnia iným prostredníctvom nahrávania. Za akýkoľvek obsah, ktorý zdieľate, nesiete výlučnú zodpovednosť Vy. - -Žiadne ďalšie upozornenie už nebude zobrazené. + + The requested operation is invalid for this protocol + Požadovaná operácia nie je platná pre tento protokol - - Press %1 key to accept and continue... - Pre akceptovanie a pokračovanie stlačte kláves %1.... + + An unknown network-related error was detected + Bola zistená neznáma chyba týkajúca sa siete - - Legal notice - Právne upozornenie + + An unknown proxy-related error was detected + Bola zistená neznáma chyba týkajúca sa proxy - - Cancel - Zrušiť + + An unknown error related to the remote content was detected + Bola zistená neznáma chyba týkajúca sa vzdialeného obsahu - - I Agree - Súhlasím + + A breakdown in protocol was detected + Bola zistená porucha v protokole - - + + Unknown error + Neznáma chyba + + + + Upgrade Aktualizácia - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] Aktualizovali ste program zo staršej verzie, ktorá ukladala veci odlišným spôsobom. Je preto nutné, aby ste prešli na nový spôsob ukladania. V dôsledku toho však už nebudete môcť použiť znova verziu staršiu ako v3.3.0. Chcete pokračovať? [á/n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. Aktualizovali ste program zo staršej verzie, ktorá ukladala veci odlišným spôsobom. Je preto nutné, aby ste prešli na nový spôsob ukladania. Ak budete pokračovať, nebudete už môcť znova použiť verziu staršiu ako v3.3.0. - + Couldn't migrate torrent with hash: %1 Nepodarilo sa konvertovať torrent s hašom: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 Nepodarilo sa konvertovať torrent. Neplatný názov súboru pre rýchle obnovenie: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 + + Detected unclean program exit. Using fallback file to restore settings. - + An access error occurred while trying to write the configuration file. - + A format error occurred while trying to write the configuration file. - - - An unknown error occurred while trying to write the configuration file. - - - RSS::AutoDownloader + RSS - - - Invalid data format. - + + Search + Vyhľadávanie - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - + + New subscription + Nové predplatné - - Invalid data format - + + + + Mark items read + Označiť položku ako prečítané - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - + + Update all + Aktualizovať všetky - - Couldn't load RSS AutoDownloader rules. Reason: %1 - + + RSS Downloader... + Sťahovanie RSS kanálov... - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - + + Settings... + Nastavenia... - - RSS feed at '%1' updated. Added %2 new articles. - - - - - Failed to parse RSS feed at '%1'. Reason: %2 - - - - - Couldn't read RSS Session data from %1. Error: %2 - - - - - Couldn't parse RSS Session data. Error: %1 - + + Torrents: (double-click to download) + Torrenty: (dvojklik pre stiahnutie) - - Couldn't load RSS Session data. Invalid data format. - + + + Delete + Zmazať - - Couldn't load RSS article '%1#%2'. Invalid data format. - + + Rename... + Premenovať... - - - RSS::Private::Parser - - Invalid RSS feed. - + + Rename + Premenovať - - %1 (line: %2, column: %3, offset: %4). - + + + Update + Aktualizovať - - - RSS::Session - - RSS feed with given URL already exists: %1. - + + New subscription... + Nový odber... - - Cannot move root folder. - + + + Update all feeds + Aktualizovať všetky kanálu - - - Item doesn't exist: %1. - + + Download torrent + Stiahnuť torrent - - Cannot delete root folder. - + + Open news URL + Otvoriť URL kanála - - Incorrect RSS Item path: %1. - + + Copy feed URL + Skopírovať URL kanála - - RSS item with given path already exists: %1. - + + New folder... + Nový priečinok ... - - Parent folder doesn't exist: %1. - + + Refresh RSS streams + Obnoviť RSS streamy - RSSWidget - - - Search - Vyhľadávanie - - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - - - - - New subscription - - - - - - - Mark items read - - - - - Refresh RSS streams - - - - - Update all - - - - - RSS Downloader... - - - - - Torrents: (double-click to download) - - + RSSImp - - - Delete - Zmazať + + Stream URL: + URL streamu: - - Rename... - Premenovať... + + Please type a RSS stream URL + Zadajte prosím URL RSS streamu - - Rename - Premenovať + + This RSS feed is already in the list. + Tento RSS kanál už je v zozname. - - - Update - + + Please choose a folder name + Prosím, vyberte názov priečinka - - New subscription... - + + Folder name: + Názov priečinka: - - - Update all feeds - + + New folder + Nový priečinok - - Download torrent - + + Deletion confirmation + Potvrdenie zmazania - - Open news URL - + + Are you sure you want to delete the selected RSS feeds? + Ste si istý, že chcete vymazať označené RSS kanály? - - Copy feed URL - + + Please choose a new name for this RSS feed + Prosím, vyberte nový názov pre tento RSS kanál - - New folder... - + + New feed name: + Nový názov kanála: - - Please choose a folder name - + + Name already in use + Názov sa už používa - - Folder name: - + + This name is already used by another item, please choose another one. + Tento názov už používa iná položka. Prosím, zvoľte iný názov. - - New folder - + + Date: + Dátum: - - Please type a RSS feed URL - + + Author: + Autor: - - Feed URL: - + + Unread + Neprečítané + + + Rss::Feed - - Deletion confirmation + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... - - Are you sure you want to delete the selected RSS feeds? + + Automatically downloading '%1' torrent from '%2' RSS feed... + + + Rss::Private::Parser - - Please choose a new name for this RSS feed + + Invalid RSS feed. + + + RssSettingsDlg - - New feed name: - + + RSS Reader Settings + Nastavenia čítačky RSS - - Rename failed - + + RSS feeds refresh interval: + Interval obnovovania RSS kanálov: - - Date: + + min - - Author: - + + Maximum number of articles per feed: + Maximálny počet článkov na kanál: ScanFoldersDelegate - + Select save location @@ -7440,273 +6698,267 @@ ScanFoldersModel - + Monitored Folder - + Override Save Location - + Monitored folder - + Default save location - + Browse... - + Prehliadať... - SearchJobWidget + SearchEngine - - Form + + Unknown search engine plugin file format. - - Results(xxx) - + + A more recent version of this plugin is already installed. + Novšia verzia tohto zásuvného modulu je už nainštalovaná. - - Search in: + + + Plugin is not supported. + Zásuvný modul nie je podporovaný. + + + + Update server is temporarily unavailable. %1 - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + + + Failed to download the plugin file. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + + An incorrect update info received. - - Seeds: - Seedov: + + All categories + Všetky kategórie - - <html><head/><body><p>Minimal number of seeds</p></body></html> - + + Movies + Filmy - - - to - + + TV shows + TV relácie - - <html><head/><body><p>Maximal number of seeds</p></body></html> - + + Music + Hudba - - - - + + Games + Hry - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + + Anime + Anime - - Size: - Veľkosť: + + Software + Softvér - - <html><head/><body><p>Minimal torrent size</p></body></html> - + + Pictures + Obrázky - - <html><head/><body><p>Maximal torrent size</p></body></html> - + + Books + Knihy + + + SearchListDelegate + + + + Unknown + Neznáme + + + + SearchTab - + Name i.e: file name - Názov + Názov - + Size i.e: file size - Veľkosť + Veľkosť - + Seeders i.e: Number of full sources - + Seederi - + Leechers i.e: Number of partial sources - + Leecheri - + Search engine - + Vyhľadávač - - Filter search results... - - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Torrent names only - + Everywhere - - Use regular expressions - - - - + Searching... - + Search has finished - + Search aborted - + An error occurred during search... - + Search returned no results - + Column visibility Viditeľnosť stĺpca - - - SearchPluginManager - - - Unknown search engine plugin file format. - - - - A more recent version of this plugin is already installed. - - - - - - Plugin is not supported. + + Form - - All categories + + Results(xxx) - - Movies + + Search in: - - TV shows + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - - Music + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - - Games - + + Seeds: + Seedov: - - Anime + + <html><head/><body><p>Minimal number of seeds</p></body></html> - - Software - + + + to + do - - Pictures + + <html><head/><body><p>Maximal number of seeds</p></body></html> - - - Books + + + + - - Update server is temporarily unavailable. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - - - Failed to download the plugin file. %1 - + + Size: + Veľkosť: - - An incorrect update info received. + + <html><head/><body><p>Minimal torrent size</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> @@ -7715,197 +6967,185 @@ - - - - + + + Search Vyhľadávanie - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - - + Download - + Stiahnuť - + Go to description page - + Copy description page URL - + Search plugins... - + A phrase to search for. - + Spaces in a search term may be protected by double quotes. - + Example: Search phrase example - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - + All plugins Všetky zásuvné moduly - + Only enabled - + Select... - - - + + + Search Engine - + Please install Python to use the Search Engine. - + Empty search pattern - + Please type a search pattern first - + Stop - + Search has finished - + Search has failed - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + E&xit Now - + Exit confirmation - + Potvrdenie ukončenia - + The computer is going to shutdown. - + &Shutdown Now - - Shutdown confirmation - - - - + The computer is going to enter suspend mode. - + &Suspend Now - + Suspend confirmation - + The computer is going to enter hibernation mode. - + &Hibernate Now - + Hibernate confirmation - + You can cancel the action within %1 seconds. + + + Shutdown confirmation + Potvrdenie vypnutia + SpeedLimitDialog - + KiB/s KiB/s @@ -7913,52 +7153,52 @@ SpeedPlotView - + Total Upload Nahraté celkom - + Total Download Stiahnuté celkom - + Payload Upload Nahraté úžitkové dáta - + Payload Download Stiahnuté úžitkové dáta - + Overhead Upload Nahraté réžijné dáta - + Overhead Download Stiahnuté réžijné dáta - + DHT Upload DHT nahrávanie - + DHT Download DHT sťahovanie - + Tracker Upload Nahrávanie trackera - + Tracker Download Sťahovanie trackera @@ -7966,95 +7206,87 @@ SpeedWidget - + Period: Obdobie: - + 1 Minute 1 minúta - + 5 Minutes 5 minút - + 30 Minutes 30 minút - + 6 Hours 6 hodín - + Select Graphs Vyberte grafy - + Total Upload Nahraté celkom - + Total Download Stiahnuté celkom - + Payload Upload Nahraté úžitkové dáta - + Payload Download Stiahnuté úžitkové dáta - + Overhead Upload Nahraté réžijné dáta - + Overhead Download Stiahnuté réžijné dáta - + DHT Upload DHT nahrávanie - + DHT Download DHT sťahovanie - + Tracker Upload Nahrávanie trackera - + Tracker Download Sťahovanie trackera - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8067,49 +7299,49 @@ Štatistika používateľa - - Cache statistics - Štatistika vyrovnávacej pamäte + + Total peer connections: + Celkovo spojení s rovesníkmi: - - Read cache hits: - Čítaní z vyrovnávacej pamäte: + + Global ratio: + Globálny pomer: - - Average time in queue: - Priemerný čas vo fronte: + + Alltime download: + Stiahnuté celkom: - - Connected peers: - + + Alltime upload: + Nahrané celkom: - - All-time share ratio: - + + Total waste (this session): + Celkovo premrhané (v tejto relácii): - - All-time download: - + + Cache statistics + Štatistika vyrovnávacej pamäte - - Session waste: - + + Read cache hits: + Čítaní z vyrovnávacej pamäte: - - All-time upload: - + + Average time in queue: + Priemerný čas vo fronte: - Total buffer size: - + Total buffers size: + Celková veľkosť bufferov: @@ -8137,7 +7369,12 @@ Celková veľkosť frontu: - + + OK + OK + + + %1 ms 18 milliseconds ms @@ -8146,27 +7383,32 @@ StatusBar - + Connection status: Stav spojenia: - + No direct connections. This may indicate network configuration problems. Žiadne priame spojenia. To môže znamenať problém s nastavením siete. - + DHT: %1 nodes DHT: %1 uzlov - - qBittorrent needs to be restarted! - + + qBittorrent needs to be restarted + Je potrebné reštartovať qBittorrent + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent bol práve aktualizovaný a je potrebné ho reštartovať, aby sa zmeny prejavili. @@ -8185,1563 +7427,1311 @@ Online - + Click to switch to alternative speed limits Kliknutím prepnete na alternatívne rýchlostné obmedzenia - + Click to switch to regular speed limits Kliknutím prepnete na bežné rýchlostné obmedzenia - + + Manual change of rate limits mode. The scheduler is disabled. + Manuálna zmena režimu obmedzenia rýchlosti. Plánovač je vypnutý. + + + Global Download Speed Limit Globálne rýchlostné obmedzenie sťahovania - + Global Upload Speed Limit Globálne rýchlostné obmedzenie nahrávania - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - + Všetky (0) - + Downloading (0) - + Sťahované (0) - + Seeding (0) - + Seedované (0) - + Completed (0) - + Dokončené (0) - + Resumed (0) - + Obnovené (0) - + Paused (0) - + Pozastavené (0) - + Active (0) - + Aktívne (0) - + Inactive (0) - + Neaktívne (0) - + Errored (0) - + Chybných (0) - + All (%1) - Všetky (%1) + Všetky (%1) - + Downloading (%1) - + Sťahované (%1) - + Seeding (%1) - + Seedované (%1) - + Completed (%1) - + Dokončené (%1) - + Paused (%1) - + Pozastavené (%1) - + Resumed (%1) - + Obnovené (%1) - + Active (%1) - + Aktívne (%1) - + Inactive (%1) - + Neaktívne (%1) - + Errored (%1) - + Chybných (%1) - TagFilterModel + TorrentContentModel - - Tags - + + Name + Názov - - All - + + Size + Veľkosť - - Untagged - + + Progress + Priebeh - - - TagFilterWidget - - Add tag... - + + Download Priority + Priorita sťahovania - - Remove tag - + + Remaining + Ostáva + + + TorrentCreatorDlg - - Remove unused tags - + + Select a folder to add to the torrent + Vyberte adresár, ktorý sa má pridať do torrentu - - Resume torrents - Obnov torrenty + + Select a file to add to the torrent + Vyberte súbor, ktorý sa má pridať do torrentu - - Pause torrents - Pozastaviť torrenty + + No input path set + Nebola zadaná vstupná cesta - - Delete torrents - Zmazať torrenty + + Please type an input path first + Napíšte prosím najprv vstupnú cestu - - New Tag - + + Select destination torrent file + Vybrať cieľový torrent súbor - - Tag: - + + Torrent Files (*.torrent) + Torrent súbory (*.torrent) - - Invalid tag name - + + Torrent was created successfully: %1 + %1 is the path of the torrent + Torrent bol úspešne vytvorený: %1 - - Tag name '%1' is invalid - + + + + Torrent creation + Vytvorenie torrentu - - Tag exists - + + Torrent creation was unsuccessful, reason: %1 + Torrent nebol vytvorený, dôvod: %1 - - Tag name already exists. - + + Created torrent file is invalid. It won't be added to download list. + Vytvorený torrent je neplatný. Nebude pridaný do zoznamu sťahovaných. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - + + Name + i.e: torrent name + Názov - - Name: - + + Size + i.e: torrent size + Veľkosť - - Save path: - Uložiť do: + + Done + % Done + Hotovo - - Choose save path - Zvoľte cieľový adresár + + Status + Torrent status (e.g. downloading, seeding, paused) + Stav - - New Category - + + Seeds + i.e. full sources (often untranslated) + Seedov - - Invalid category name - + + Peers + i.e. partial sources (often untranslated) + Rovesníkov - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - + + Down Speed + i.e: Download speed + Rýchlosť sťahovania - - Category creation error - + + Up Speed + i.e: Upload speed + Rýchlosť nahrávania - - Category with the given name already exists. -Please choose a different name and try again. - + + Ratio + Share ratio + Pomer - - - TorrentContentModel - - Name - Názov + + ETA + i.e: Estimated Time of Arrival / Time left + Odhad. čas - - Size - Veľkosť + + Category + Kategória - - Progress - Priebeh + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Pridané - - Download Priority - Priorita sťahovania + + Completed On + Torrent was completed on 01/01/2010 08:00 + Dokončené - - Remaining - Ostáva + + Tracker + Tracker - - Availability - + + Down Limit + i.e: Download limit + Limit sťah. - - - TorrentCreatorDialog - - Torrent Creator - + + Up Limit + i.e: Upload limit + Limit nahr. - - Select file/folder to share - + + Downloaded + Amount of data downloaded (e.g. in MB) + Stiahnuté - - Path: - + + Uploaded + Amount of data uploaded (e.g. in MB) + Nahrané - - [Drag and drop area] - + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Stiahnuté od spustenia - - - Select file - + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Nahrané od spustenia - - - Select folder - + + Remaining + Amount of data left to download (e.g. in MB) + Ostáva - - Settings - + + Time Active + Time (duration) the torrent is active (not paused) + Čas aktivity - - Piece size: - + + Save path + Torrent save path + Uložiť do - - Auto - + + Completed + Amount of data completed (e.g. in MB) + Dokončené - - 16 KiB - + + Ratio Limit + Upload share ratio limit + Obmedzenie pomeru zdieľania - - 32 KiB - + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Posledné videné ukončenie - - 64 KiB - + + Last Activity + Time passed since a chunk was downloaded/uploaded + Posledná aktivita - - 128 KiB - + + Total Size + i.e. Size including unwanted data + Celková veľkosť + + + TrackerFiltersList - - 256 KiB - + + All (0) + this is for the tracker filter + Všetky (0) - - 512 KiB - + + Trackerless (0) + Bez trackeru (0) - - 1 MiB - + + Error (0) + Chyby (0) - - 2 MiB - + + Warning (0) + Upozornenia (0) - - 4 MiB - + + + Trackerless (%1) + Bez trackeru (%1) - - 8 MiB - + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - 16 MiB - + + + Error (%1) + Chyby (%1) - - 32 MiB - - - - - Calculate number of pieces: - - - - - Private torrent (Won't distribute on DHT network) - - - - - Start seeding immediately - - - - - Ignore share ratio limits for this torrent - - - - - Optimize alignment - - - - - Fields - - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - - - - Web seed URLs: - - - - - Tracker URLs: - - - - - Comments: - - - - - Source: - - - - - Progress: - Priebeh: - - - - Create Torrent - - - - - - - Torrent creation failed - - - - - Reason: Path to file/folder is not readable. - - - - - Select where to save the new torrent - - - - - Torrent Files (*.torrent) - - - - - Reason: %1 - - - - - Reason: Created torrent is invalid. It won't be added to download list. - - - - - Torrent creator - + + + Warning (%1) + Upozornenia (%1) - - Torrent created: - + + Resume torrents + Obnov torrenty - - - TorrentInfo - - File size exceeds max limit %1 - + + Pause torrents + Pozastaviť torrenty - - Torrent file read error: %1 - + + Delete torrents + Zmazať torrenty - - Torrent file read error: size mismatch - + + + All (%1) + this is for the tracker filter + Všetky (%1) - TorrentsController - - - Not contacted yet - - - - - Updating... - - + TrackerList - - Working - - - - - Not working - - - - - Error: '%1' is not a valid torrent file. - - - - - - - - Torrent queueing must be enabled - - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - - Cannot make save path - - - - - Cannot write to directory - - - - - WebUI Set location: moving "%1", from "%2" to "%3" - - - - - Incorrect torrent name - + + URL + URL - - - Incorrect category name - + + Status + Stav - - - TrackerFiltersList - - All (0) - this is for the tracker filter + + Received - - Trackerless (0) - Bez trackeru (0) - - - - Error (0) - Chyby (0) - - - - Warning (0) - Upozornenia (0) - - - - - Trackerless (%1) - Bez trackeru (%1) - - - - - Error (%1) - Chyby (%1) - - - - - Warning (%1) - Upozornenia (%1) - - - - Resume torrents - Obnov torrenty + + Seeds + Seedov - - Pause torrents - Pozastaviť torrenty + + Peers + Rovesníci - - Delete torrents - Zmazať torrenty + + Downloaded + Stiahnuté - - - All (%1) - this is for the tracker filter - Všetky (%1) + + Message + Správa - - - TrackerListWidget - - + + Working - + Pracuje sa - + Disabled - + Vypnuté - + This torrent is private - + Torrent je súkromný - + Updating... - + Prebieha aktualizácia... - + Not working - + Nefunguje - + Not contacted yet - + Zatiaľ nekontaktovaný - - - - - - - N/A - Neuvedené + + Tracker URL: + URL trackera: - + Tracker editing - + Úprava trackera - - Tracker URL: - - - - - + + Tracker editing failed - + Úprava trackera zlyhala - + The tracker URL entered is invalid. - + Zadané URL trackera je neplatné. - + The tracker URL already exists. - + URL trackera už existuje. - + Add a new tracker... - - - - - Remove tracker - + Pridať nový tracker... - + Copy tracker URL - + Skopírovať URL trackera - + Edit selected tracker URL - + Upraviť URL vybraného trackera - + Force reannounce to selected trackers - + Vynútiť znovuohlásenie vybraným trackerom - + Force reannounce to all trackers - + Vynútiť znovuohlásenie všetkým trackerom - - URL - - - - - Status - Stav - - - - Received - - - - - Seeds - - - - - Peers - Rovesníci - - - - Downloaded - Stiahnuté - - - - Message - - - - - Column visibility - Viditeľnosť stĺpca + + Remove tracker + Odstrániť tracker - TrackerLoginDialog - - - - Tracker authentication - - - - - Tracker: - - - - - Login - Prihlasovacie meno - - - - Username: - Meno používateľa: - + TrackersAdditionDlg - - Password: - Heslo: + + Trackers addition dialog + Dialóg pre pridanie torrentu - - Log in - + + List of trackers to add (one per line): + Pridať nasledovné trackery (jeden tracker na riadok): - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + Zoznam URL kompatibilný s µTorrent: - - List of trackers to add (one per line): - + + I/O Error + V/V Chyba - - µTorrent compatible list URL: - + + Error while trying to open the downloaded file. + Chyba počas pokusu otvoriť stiahnutý súbor. - + No change - + Bez zmeny - + No additional trackers were found. - + Neboli nájdené žiadne ďalšie trackery. - + Download error - Chyba pri sťahovaní + Chyba pri sťahovaní - + The trackers list could not be downloaded, reason: %1 - + Trackery nebolo možné stiahnuť. Dôvod: %1 TransferListDelegate - + Downloading Sťahuje sa - + Downloading metadata used when loading a magnet link Prebieha sťahovanie metadát - + Allocating qBittorrent is allocating the files on disk Prebieha alokácia - + Paused Pozastavený - + Queued i.e. torrent is queued Vo fronte - + Seeding Torrent is complete and in upload-only mode Seeduje sa - + Stalled Torrent is waiting for download to begin Bez pohybu - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] Sťahuje sa - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] Seeduje sa - + Checking Torrent local data is being checked Prebieha kontrola - + Queued for checking i.e. torrent is queued for hash checking Vo fronte na kontrolu - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Kontrolujú sa dáta na pokračovanie v sťahovaní - + Completed Dokončené - - Moving - Torrent local data are being moved/relocated - - - - + Missing Files Chýbajúce súbory - + Errored torrent status, the torrent has an error Chybných - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - %1 (seedovaný už %2) - - - - %1 ago - e.g.: 1h 20m ago - pred %1 - - - - TransferListFiltersWidget - - - Status - Stav - - - - Categories - Kategórie - - - - Tags - - - - - Trackers - Trackery - - - - TransferListModel - - - Name - i.e: torrent name - Názov - - - - Size - i.e: torrent size - Veľkosť - - - - Done - % Done - - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Stav - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - Rovesníci - - - - Down Speed - i.e: Download speed - Rýchlosť sťahovania - - - - Up Speed - i.e: Upload speed - Rýchlosť nahrávania - - - - Ratio - Share ratio - - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - Kategória - - - - Tags - - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Stiahnuté - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Nahrané - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - Ostáva - - - - Time Active - Time (duration) the torrent is active (not paused) - - - - - Save path - Torrent save path - - - - - Completed - Amount of data completed (e.g. in MB) - Dokončené + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) + %1 (seedovaný už %2) - - Ratio Limit - Upload share ratio limit - + + %1 ago + e.g.: 1h 20m ago + pred %1 + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + Stav - - Last Activity - Time passed since a chunk was downloaded/uploaded - + + Categories + Kategórie - - Total Size - i.e. Size including unwanted data - + + Trackers + Trackery TransferListWidget - + Column visibility Viditeľnosť stĺpca - + Choose save path Zvoľte cieľový adresár - + Torrent Download Speed Limiting Obmedzenie rýchlosti sťahovania torrentu - + Torrent Upload Speed Limiting Obmedzenie rýchlosti nahrávania torrentu - + Recheck confirmation Znovu skontrolovať potvrdenie - + Are you sure you want to recheck the selected torrent(s)? Ste si istý, že chcete znovu skontrolovať vybrané torrenty? - + Rename Premenovať - + New name: Nový názov: - + Resume Resume/start the torrent Pokračovať - + Force Resume Force Resume/start the torrent Vynútiť pokračovanie - + Pause Pause the torrent Pozastaviť - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - - - - - Add Tags - - - - - Remove All Tags - - - - - Remove all tags from selected torrents? - + + New Category + Nová kategória - - Comma-separated tags: - + + Category: + Kategória: - - Invalid tag - + + Invalid category name + Neplatný názov kategórie - - Tag name: '%1' is invalid - + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Názov kategórie nesmie obsahovať znak '\'. +Názov kategóre nesmie začínať ani končiť znakom '/'. +Názov kategórie nesmie obsahovať postupnosť znakov '//'. - + Delete Delete the torrent Zmazať - + Preview file... Náhľad súboru... - + Limit share ratio... Obmedzenie pomeru zdieľania... - + Limit upload rate... Obmedziť rýchlosť nahrávania... - + Limit download rate... Obmedziť rýchlosť sťahovania... - + Open destination folder Otvoriť cieľový priečinok - + Move up i.e. move up in the queue Presunúť vyššie - + Move down i.e. Move down in the queue Presunúť nižšie - + Move to top i.e. Move to top of the queue Presunúť navrch - + Move to bottom i.e. Move to bottom of the queue Presunúť na spodok - + Set location... Nastaviť cieľ... - - Force reannounce - - - - + Copy name Kopírovať názov - - Copy hash - - - - + Download first and last pieces first Sťahovať najprv prvú a poslednú časť - + Automatic Torrent Management - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category Automatický režim znamená, že niektoré vlastnosti torrentu (napr. cesta na ukladanie) budú určené na základe priradenej kategórie. - + Category Kategória - + New... New category... Nová... - + Reset Reset category Vrátiť pôvodné - - Tags - - - - - Add... - Add / assign multiple tags... - - - - - Remove All - Remove all tags - - - - + Priority Priorita - + Force recheck Vynútiť opätovnú kontrolu - + Copy magnet link Kopírovať magnet URI - + Super seeding mode Režim super seedovania - + Rename... Premenovať... - + Download in sequential order Sťahovať v poradí - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + Obmedzenie pomeru odoslaných/stiahnutých dát torrentu - - Use global share limit - + + Use global ratio limit + Použiť globálne obmedzenie pomeru - - - + + + buttonGroup - + buttonGroup - - Set no share limit - + + Set no ratio limit + Bez obmedzenia pomeru - - Set share limit to - + + Set ratio limit to + Nastaviť obmedzenie pomeru na + + + WebApplication - - ratio - + + Incorrect category name + Nesprávny názov kategórie + + + WebUI - - minutes - + + The Web UI is listening on port %1 + Webové rozhranie počúva na porte %1 - - No share limit method selected - + + Web UI Error - Unable to bind Web UI to port %1 + Chyba webového rozhrania - nepodaril sa bind webového rozhrania na port %1 + + + + about + + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Pokročilý klient siete BitTorrent naprogramovaný v C++, založený na sade nástrojov Qt a knižnici libtorrent-rasterbar. + + + + Copyright %1 2006-2016 The qBittorrent project + Copyright %1 2006-2016 projekt qBittorrent + + + + Home Page: + Domovská stránka + + + + Forum: + Fórum: - - Please select a limit method first + + Bug Tracker: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - + + Add Peers + Pridať rovesníkov - - Python not detected - + + List of peers to add (one per line): + Pridať nasledovných rovesníkov (jeden rovesník na riadok): + + + + Format: IPv4:port / [IPv6]:port + Formát: IPv4:port / [IPv6]:port - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - + + + Tracker authentication + Autentifikácia trackera - - Symlinks inside alternative UI folder are forbidden. - + + Tracker: + Tracker: - - Exceeded the maximum allowed file size (%1)! - + + Login + Prihlásenie - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - + + Username: + Meno používateľa: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - + + Password: + Heslo: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - + + Log in + Prihásiť sa - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - + + Cancel + Storno - WebUI + confirmDeletionDlg - - Web UI: HTTPS setup successful - + + Deletion confirmation - qBittorrent + Potvrdenie zmazania - qBittorrent - - Web UI: HTTPS setup failed, fallback to HTTP - + + Remember choice + Pamätať si vyrovnávaciu pamäť - - Web UI: Now listening on IP: %1, port: %2 - + + Also delete the files on the hard disk + Zmazať aj súbory na pevnom disku + + + confirmShutdownDlg - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - + + Don't show again + Už viac nezobrazovať + + + + createTorrentDialog + + + Cancel + Storno + + + + Torrent Creation Tool + Nástroj na vytvorenie Torrentu + + + + Torrent file creation + Vytvorenie Torrent súboru + + + + Add file + Pridať súbor + + + + Add folder + Pridať priečinok + + + + File or folder to add to the torrent: + Súbor alebo priečinok, ktorý sa má pridať do torrentu: + + + + Tracker URLs: + URL trackera: + + + + Web seeds urls: + URL web seedov: + + + + Comment: + Komentár: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Skupiny / úrovne trackerov môžete oddeliť prázdnym riadkom. + + + + Piece size: + Veľkosť časti: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + Auto + + + + Private (won't be distributed on DHT network if enabled) + Súkromný (ak je zapnuté, nebude sa šíriť pomocou siete DHT) + + + + Start seeding after creation + Začať seedovanie po vytvorení + + + + Ignore share ratio limits for this torrent + Ignorovať obmedzenia pomeru zdieľania pre tento torrent + + + + Create and save... + Vytvoriť a uložiť... + + + + Progress: + Priebeh: + + + + downloadFromURL + + + Add torrent links + Pridať odkazy na torrent + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Jeden na riadok (odkazy HTTP, sú podporované odkazy Magnet aj info-haše) + + + + Download + Stiahnuť + + + + Cancel + Storno + + + + Download from urls + Stiahnuť z viacerých url + + + + No URL entered + Nebolo zadané URL + + + + Please type at least one URL. + Prosím, napíšte aspoň jedno URL. + + + + errorDialog + + + Crash info + Informácie o havárii fsutils - + + + + + Downloads Sťahovania @@ -9749,100 +8739,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + Python nebol nájdený. + + + + Python version: %1 + Verzia Python: %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1h %2m - + %1d %2h e.g: 2days 10hours %1d %2h - + Unknown Unknown (size) Neznáma - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent teraz vypne počítač, pretože sťahovanie všetkých torrentov bolo dokončené. - + < 1m < 1 minute < 1m - + %1m e.g: 10minutes %1m + + + Working + Pracuje sa + + + + Updating... + Prebieha aktualizácia... + + + + Not working + Nepracuje sa + + + + Not contacted yet + Zatiaľ nekontaktovaný + preview - + Preview selection Výber náhľadu - + The following files support previewing, please select one of them: Nasledujúce súbory podporujú náhľad, prosím vyberte jeden z nich: + + + Preview + Náhľad + + + + Cancel + Storno + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_sl.ts qbittorrent-3.3.15/src/lang/qbittorrent_sl.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_sl.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_sl.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent O programu qBittorent - + About O programu - + Author Avtor - - Current maintainer - Trenutni vzdrževalec - - - - Greece - Grčija - - - - + + Nationality: Državljanstvo: - - + + + Name: + Ime: + + + + E-mail: E-pošta: - - - Name: - Ime: + + Greece + Grčija - - Original author - Originalni avtor + + Current maintainer + Trenutni vzdrževalec - - France - Francija + + Original author + Originalni avtor - + Special Thanks Posebna zahvala - + Translators Prevajalci - - License - Licenca - - - + Libraries Knjižnice - + qBittorrent was built with the following libraries: qBittorent je bil ustvarjen s sledečimi knjižnicami: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - Napreden odjemalec BitTorrent, programiran v C++, temelji na zbirki orodij Qt in libtorrent-rasterbar. - - - - Copyright %1 2006-2018 The qBittorrent project - Avtorske pravice %1 2006-2018 The qBittorrent project - - - - Home Page: - Domača stran: - - - - Forum: - Forum: + + France + Francija - - Bug Tracker: - Sledilnik hroščev: + + License + Licenca @@ -115,57 +90,67 @@ Shrani v - + + Browse... + Brskaj ... + + + + Set as default save path + Nastavi kot privzeto pot za shranjevanje prenosov + + + Never show again Ne prikaži več - + Torrent settings Torrent nastavitve - + Set as default category Nastavi kot privzeto kategorijo - + Category: Kategorija: - + Start torrent Začni torrent - + Torrent information Informacije o torrentu - + Skip hash check Preskoči preverjanje šifre - + Size: Velikost: - + Hash: Šifra: - + Comment: Komentar: - + Date: Datum: @@ -190,117 +175,89 @@ Samodejni - - Remember last used save path - Zapomni si zadnjo uporabljeno pot za shranjevanje - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog Če izbrano, .torrent datoteke ne bodo izbrisane kljub nastavitvam med "Prenosi" v Možnostih - + Do not delete .torrent file Ne izbriši .torrent datoteke - - Create subfolder - Ustvari podmapo - - - - Download in sequential order - Prejemanje v zaporednem vrstnem redu - - - - Download first and last pieces first - Prejemanje najprej prvih in zadnjih kosov - - - + Normal Normalno - + High Visoko - + Maximum Maksimalno - + Do not download Ne prenesi - - - + + + I/O Error I/O Napaka - + Invalid torrent Napačen torrent - - Renaming - Preimenovanje - - - - - Rename error - Napaka v preimenovanju + + + + + Already in download list + Torrent je že na seznamu prenosov - - The name is empty or contains forbidden characters, please choose a different one. - Ime je prazno ali pa vsebuje nedovoljene znake, prosimo izberite drugega. - - - + Not Available This comment is unavailable Ni na voljo. - + Not Available This date is unavailable Ni na voljo - + Not available Ni na voljo - + Invalid magnet link Napačna magnetna povezava - + The torrent file '%1' does not exist. Torrent datoteka '%1' ne obstaja. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. Torrent datoteka '%1' ne more biti brana z diska. Verjetno nimate dovoljenja. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ Napaka: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torrent je že na seznamu prenosov. Sledilniki niso bili združeni ker je torrent zaseben. + + + + Torrent is already in download list. Trackers were merged. + Torrent že obstaja v seznamu prenosov. Sledilniki so bili združeni. + + + + + Cannot add torrent + Ni mogoče dodati torrenta + + + + Cannot add this torrent. Perhaps it is already in adding state. + Torrenta ni mogoče dodati. Morda je že v stanju dodajanja. + + + This magnet link was not recognized Ta magnetna povezava ni prepoznavna - + + Magnet link is already in download list. Trackers were merged. + Magnetna povezava je že v seznamu prenosov. Sledilniki so bili združeni. + + + + Cannot add this torrent. Perhaps it is already in adding. + Torrenta ni mogoče dodati. Morda ga že dodajate. + + + Magnet link Magnetna povezava - + Retrieving metadata... Pridobivam podatke... - + Not Available This size is unavailable. Ni na voljo - + Free space on disk: %1 Neporabljen prostor na disku: %1 - + + Choose save path Izberi mapo za shranjevanje - - - - - - - Torrent is already present - Torrent je že prisoten - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - Torrent '%1' je že na seznamu prenosov. Sledilniki niso bili združeni ker je torrent zaseben. + + Rename the file + Preimenuj datoteko - - Torrent '%1' is already in the transfer list. Trackers have been merged. - Torrent '%1' je že na seznamu prenosov. Sledilniki so bili združeni. - - - - Torrent is already queued for processing. - Torrent že čaka na obdelavo. - - - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - Magnetna povezava '%1' je že na seznamu prenosov. Sledilniki so bili združeni. + + New name: + Novo ime: - - Magnet link is already queued for processing. - Magnetna povezava že čaka na obdelavo. + + + The file could not be renamed + Datoteke ni možno preimenovati - - New name: - Novo ime: + + This file name contains forbidden characters, please choose a different one. + To ime datoteke vsebuje prepovedane znake, prosim izberi drugo ime. - - + + This name is already in use in this folder. Please use a different name. To ime je že v uporabi v tej mapi. Prosim uporabi drugo ime. - + The folder could not be renamed Mape ni možno preimenovati - + Rename... Preimenuj... - + Priority Prioriteta - + Invalid metadata Neveljavni meta podatki - + Parsing metadata... Razpoznavanje podatkov... - + Metadata retrieval complete Pridobivanje podatkov končano - + Download Error Napaka prejema @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Velikost predpomnilnika + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Odhodni porti (min) [0: Onemogočeno] - + Outgoing ports (Max) [0: Disabled] Odhodni porti (max) [0: Onemogočeno] - + Recheck torrents on completion Preveri torrent po prenosu - + Transfer list refresh interval Interval osvežanja seznama prenosov - + ms milliseconds ms - + Setting Nastavitve - + Value Value set for this setting Vrednost - - - (disabled) - (onemogočeno) - - - + (auto) (samodejno) - - min - minutes - min - - - + All addresses Vsi naslovi - + qBittorrent Section qBittorrent profil - - + + Open documentation Odpri dokumentacijo - + libtorrent Section libtorrent profil - - Asynchronous I/O threads - - - - - Disk cache - Predpomnilnik diska - - - + s seconds s - + Disk cache expiry interval Predpomnilnik poteče v - + Enable OS cache Omogoči predpomnilnik OS - - Guided read cache - Vodeno branje predpomnilnika - - - - Coalesce reads & writes - Poveži branje in pisanje - - - - Send upload piece suggestions - Pošlji primere za kose za pošiljanje - - - - - KiB - KiB - - - - Send buffer watermark - Pošlji oznako medpomnilnika - - - - Send buffer low watermark - Pošlji oznako zapolnjenega medpomnilnika - - - - Send buffer watermark factor - Pošlji faktor oznake medpomnilnika - - - - Prefer TCP - - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address - Dovoli več povezav z istega IP naslova + + m + minutes + m - + Resolve peer countries (GeoIP) Razreši mednarodne soležnike (GeoIP) - + Resolve peer host names Razreši host imena soležnikov - + Strict super seeding Strogo super sejanje - + Network Interface (requires restart) Mrežni vmesnik (zahteva ponovni zagon) - + Optional IP Address to bind to (requires restart) Izbiren IP naslov za povezavo (zahteva ponovni zagon) - + Listen on IPv6 address (requires restart) Poslušaj na IPv6 naslovu (zahteva ponovni zagon) - + Display notifications Prikaži obvestila - + Display notifications for added torrents Prikaži obvestila za dodane torrente - + Download tracker's favicon Prenesi ikono zaznamka sledilnika - - Save path history length - Dolžina zgodovine mest shranjevanja - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - Vedenje povezav za pošiljanje - - - - Round-robin - - - - - Fastest upload - - - - - Anti-leech - - - - - Upload choking algorithm - Pošlji algoritem blokiranja - - - + Confirm torrent recheck Potrdi ponovno preverjanje torrenta - - Confirm removal of all tags - Potrdi odstranitev vseh oznak + Exchange trackers with other peers + Izmenjuj sledilnike z drugimi soležniki - - Always announce to all trackers in a tier - Vedno sporoči vsem sledilcem na stopnji + + Always announce to all trackers + Vedno sporoči vsem sledilcem - - Always announce to all tiers - Vedno sporoči vsem stopnjam - - - + Any interface i.e. Any network interface Katerikoli vmesnik - + Save resume data interval How often the fastresume file is saved. Interval shranjevanja podatkov o prenosu - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - %1-TCP algoritem mešanega načina - - - + Maximum number of half-open connections [0: Unlimited] Maksimalno število na pol odprtih povezav [0: Neomejeno] - + IP Address to report to trackers (requires restart) IP naslov za poročilo sledilcem (zahteva ponovni zagon) - + Enable embedded tracker Omogoči vdelane sledilnike - + Embedded tracker port Vrata vdelanih sledilnikov - + Check for software updates Preveri posodobitve programa - + Use system icon theme Uporabi sistemske ikone @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 zagnan - + Torrent: %1, running external program, command: %2 Torrent: %1, zagon zunanjega programa, ukaz: %2 - - Torrent name: %1 - Ime torrenta: %1 - - - - Torrent size: %1 - Velikost torrenta: %1 - - - - Save path: %1 - Mesto shranjevanja: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Torrent je bil prejet v %1. - - - - Thank you for using qBittorrent. - Hvala, ker uporabljate qBittorrent. - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' je zaključil prejemanje + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrent: %1, ukaz za zagon zunanjega programa predolg (dolžina > %2), izvedba spodletela. - + Torrent: %1, sending mail notification Torrent: %1, pošilja E-poštno obvestilo - + Information Podatki - - To control qBittorrent, access the Web UI at %1 - Za nadziranje qBittorenta, pojdite na spletni vmesnik na %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + Za nadziranje qBittorenta, pojdite na http://localhost:%1 - + The Web UI administrator user name is: %1 Skrbniško ime spletnega vmesnika je: %1 - + The Web UI administrator password is still the default one: %1 Skrbniško geslo spletnega vmesnika je: %1 - + This is a security risk, please consider changing your password from program preferences. To je varnostno tveganje, zato premislite o zamenjavi gesla v možnostih programa. - + Saving torrent progress... Shranjujem napredek torrenta ... - - - Portable mode and explicit profile directory options are mutually exclusive - Prenosni način in izrecne možnosti profilne mape in se medsebojno izlkjučujeta - - - - Portable mode implies relative fastresume - Prenosni način ima posledično relativno hitro nadaljevanje - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - Vaš naslov IP je bil izobčen zaradi prevelikega števila neuspešnih poskusov overitve. - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Shrani v: @@ -861,817 +658,680 @@ Prejemnik RSS - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - Samodejni prenos RSS torentov je zdaj onemogočen! Omgočite ga lahko v nastavitvah aplikacije. + + Enable Automated RSS Downloader + Omogoči samodejni RSS prenos - + Download Rules Pravila prenosov - + Rule Definition Definicija pravila - + Use Regular Expressions Uporabi splošne izraze - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - Pametni filter epizod bo preveril številko epizode za preprečitev prenosa duplikatov. -Podpora formatov: S01E01, 1x1, 2017.01.01 in 01.01.2017 (Datumski format podpira tudi - kot ločevalec) - - - - Use Smart Episode Filter - Uporabi pametni filter epizod - - - + Must Contain: Mora vsebovati: - + Must Not Contain: Ne sme vsebovati: - + Episode Filter: Filter epizod: - + Assign Category: Določi kategorijo: - + Save to a Different Directory Shrani v drugo mapo - + Ignore Subsequent Matches for (0 to Disable) ... X days Naknadne prilagoditve ignoriraj (0 za onemogočeno) - + Disabled - Onemogočeno + Onemogočeno - + days dni - + Add Paused: Dodaj torrente v premoru: - + Use global settings Uporabi splošne nastavitve - + Always Vedno - + Never Nikoli - + Apply Rule to Feeds: Uveljavi pravilo za vire: - + Matching RSS Articles Ujemajoči RSS članki - + &Import... &Uvozi... - + &Export... &Izvozi... - + Matches articles based on episode filter. Prilagodi članke na podlagi filtra epizod. - + Example: Primer: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match bo uejlo epizode ene sezone 2, 5, 8 do 15, 30 in naprej - + Episode filter rules: Filter pravila epizod: - + Season number is a mandatory non-zero value Številka sezone je obvezno vrednost večja od 0 - + Episode number is a mandatory non-zero value + Številka epizode je obvezna vrednost + + + Filter must end with semicolon Filter se mora končati z pomišljajem - + Three range types for episodes are supported: Tri vrste epizod so podprte: - + Single number: <b>1x25;</b> matches episode 25 of season one Sama številka: <b>1x25;</b> ustreza epizodi 25 sezone 1 - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Normalen razpon: <b>1x25-40;</b> ustreza epizodam 25 do 40 sezone 1 - - Episode number is a mandatory positive value - Številka sezone je obvezno vrednost večja od 0 - - - - Rules - Pravila + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Nekončen razpon: <b>1x25-;</b> ustreza epizodam 25 in naprej sezone 1 - - Rules (legacy) - Pravila (legacy) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Neskončen razpon: <b>1x25-;</b> ustreza epizodam 25 in naprej sezone 1 in vsem epizodam kasnejših sezon + - + Last Match: %1 days ago Zadnje ujemanje: pred %1 dnevi - + Last Match: Unknown Zadnje ujemanje: Neznano - + New rule name Ime novega pravila - + Please type the name of the new download rule. Prosim vpiši ime novega pravila prenosov. - - + + Rule name conflict Konflikt imen pravil. - - + + A rule with this name already exists, please choose another name. Pravilo z tem imenom že obstaja, prosim izberi drugo ime. - + Are you sure you want to remove the download rule named '%1'? Ali zares želiš odstraniti pravilo prenosov z imenom %1? - + Are you sure you want to remove the selected download rules? Ali ste prepričani, da želite odstraniti izbrana pravila za prejem? - + Rule deletion confirmation Potrditev odstranitev pravila - + Destination directory Ciljni imenik - + Invalid action Neveljavno dejanje - + The list is empty, there is nothing to export. Seznam je prazen. Ničesar ni za izvoz. - - Export RSS rules - Izvozi RSS pravila + + Where would you like to save the list? + Kam želite shraniti seznam? - - + + Rules list (*.rssrules) + Seznam pravil (*.rssrules) + + + I/O Error I/O Napaka - - Failed to create the destination file. Reason: %1 - Spodletelo ustvarjanje ciljne datoteke. Razlog: %1 + + Failed to create the destination file + Spodletelo ustvarjanje ciljne datoteke - - Import RSS rules - Uvozi RSS pravila + + Please point to the RSS download rules file + Vpišite naslov spletnega vira RSS. - - Failed to open the file. Reason: %1 - Odpiranje datoteka je spodletelo. Razlog: %1 + + Rules list + Seznam pravil - + Import Error Napaka uvoza - - Failed to import the selected rules file. Reason: %1 - Spodletelo uvažanje izbrane datoteke s pravili. Razlog: %1 + + Failed to import the selected rules file + Spodletelo uvažanje izbrane datoteke s pravili - + Add new rule... Dodaj novo pravilo ... - + Delete rule Odstrani pravilo - + Rename rule... Preimenuj pravilo ... - + Delete selected rules Odstrani izbrana pravila - - Clear downloaded episodes... - Počisti prenesene epizode... - - - + Rule renaming Preimenovanje pravila - + Please type the new rule name Vpišite novo ime pravila - - Clear downloaded episodes - Počisti prenesene epizode - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - Ali ste prepričani da želite počistiti seznam prenesenih epizod za izbrano pravilo? + + Regex mode: use Perl-like regular expressions + Način regularnega izraza: uporabite Perlu podobne regularne izraze - - Regex mode: use Perl-compatible regular expressions - Način regularnega izraza: uporabite Perlu kompatibilne regularne izraze - - - - - Position %1: %2 - Položaj %1: %2 - - - + Wildcard mode: you can use - Način nadomestnega znaka: lahko uporabite + - + ? to match any single character - ? za ujemanje enega znaka + - + * to match zero or more of any characters - * za ujemanje nič ali več znakov + - + Whitespaces count as AND operators (all words, any order) - Presledki delujejo kot IN funkcije (vse besede, kakršen koli red) + - + | is used as OR operator - | deluje kot ALI funkcija + - + If word order is important use * instead of whitespace. - Če je vrstni red besed pomemben uporabi * namesto presledka. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Izraz s praznim %1 delom (npr. %2) + - + will match all articles. - se bo ujemal z vsemi članki. + - + will exclude all articles. - bo izločil vse članke. + - - - BanListOptionsDialog - - List of banned IP addresses - Seznam izločenih IP naslovov + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Način nadomestnega znaka: uporabite lahko <ul><li>? za ujemanje enega znaka </li><li>* za ujemanje nič ali več znakov </li><li>presledek velja kot IN operator</li></ul> - - Ban IP - Izloči IP - - - - Delete - Odstrani - - - - - Warning - Opozorilo - - - - The entered IP address is invalid. - Vnesen IP naslov je neveljaven. - - - - The entered IP is already banned. - Vnesen IP je že izločen. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Način nadomestnega znaka: uporabite lahko <ul><li>? za ujemanje enega znaka </li><li>* za ujemanje nič ali več znakov </li><li>| velja kot ALI operator</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support Potreben je ponovni zagon za preklop PeX podpore - - Could not get GUID of configured network interface. Binding to IP %1 - Pridobitev GUID konfiguriranega mrežnega vmesnika ni bila mogoča. Povezujem na IP %1 - - - + Embedded Tracker [ON] Vdelan sledilnik [vključen] - + Failed to start the embedded tracker! Spodletel zagon vdelanega sledilnika! - + Embedded Tracker [OFF] Vdelan sledilnik [izključen] - + + '%1' reached the maximum ratio you set. Removing... + %1 je dosegel najvišje nastavljeno razmerje. Odstranjujem ... + + + + '%1' reached the maximum ratio you set. Pausing... + %1 je dosegel najvišje nastavljeno razmerje. Premor ... + + + System network status changed to %1 e.g: System network status changed to ONLINE Status sistemskega omrežja spremenjen v %1 - + ONLINE POVEZANI - + OFFLINE NEPOVEZANI - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding Nastavitve omrežja %1 so se spremenile, osveževanje povezave za sejo - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. Nastavljen naslov mrežnega vmesnika %1 ni veljaven. - - + Encryption support [%1] Podpora šifriranja [%1] - - + FORCED PRISILJENO - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 ni veljaven IP naslov in je bil zavrnjen pri uveljavljanju seznama izločenih naslovov. - - - - + Anonymous mode [%1] Anonimni način [%1] - + Unable to decode '%1' torrent file. Ni mogoče odkodirati '%1' torrent datoteke. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' Rekurzivni prejem datoteke '%1' vdelane v torrent '%2' - + Queue positions were corrected in %1 resume files - Mesta v čakalni vrsti so bila popravljena pri %1 nadaljevanih datotekah + - + Couldn't save '%1.torrent' Ni bilo mogoče shraniti '%1. torrenta' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' je bil odstranjen iz seznama prenosov. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' je bil odstranjen iz seznama prenosov in trdega diska. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '%1' je bil odstranjen iz seznama prenosov vendar datotek ni bilo mogoče izbrisati. Napaka: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. ker je %1 onemogočen. - + because %1 is disabled. this peer was blocked because TCP is disabled. ker je %1 onemogočen. - + URL seed lookup failed for URL: '%1', message: %2 Spodletelo iskanje URL naslova za seme: '%1', sporočilo: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent je spodletel pri poslušanju na vratih: %2/%3 vmesnika %1. Razlog: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' je bil odstranjen iz seznama prenosov in trdega diska. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' je bil odstranjen iz seznama prenosov. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Prejemanje '%1', prosim počakajte ... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent poskuša poslušati na vseh vratih vmesnika: %1 - + The network interface defined is invalid: %1 Določeni omrežni vmesnik je neveljaven: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent poskuša poslušati na vmesniku %1 in vratih: %2 - - Peer ID: - ID soležnika: - - - - HTTP User-Agent is '%1' - Uporabniški posrednik HTTP je '%1' - - - - + DHT support [%1] Podpora DHT [%1] - - - - - - - - - + + + + ON VKLJUČENO - - - - - - - - - + + + + OFF IZKLJUČENO - - + Local Peer Discovery support [%1] Podpora odkrivanja krajevnih soležnikov [%1] - - PeX support [%1] - Podpora PeX [%1] - - - - '%1' reached the maximum ratio you set. Removed. - '%1' je dosegel najvišje nastavljeno razmerje. Odstranjen. - - - - '%1' reached the maximum ratio you set. Paused. - '%1' je dosegel najvišje nastavljeno razmerje. Ustavljen. - - - - '%1' reached the maximum seeding time you set. Removed. - '%1' je dosegel najvišji nastavljen čas sejanja. Odstranjen. - - - - '%1' reached the maximum seeding time you set. Paused. - '%1' je dosegel najvišji nastavljen čas sejanja. Ustavljen. + Restart is required to toggle Tracker Exchange support + Potreben je ponovni zagon za preklop podpore Izmenjave sledilnikov - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent ni našel krajevnega naslova %1 za poslušanje - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent je spodletel pri poslušanju na vseh vratih vmesnika: %1. Razlog: %2. - + Tracker '%1' was added to torrent '%2' Sledilnik '%1' je bil dodan h torrentu '%2' - + Tracker '%1' was deleted from torrent '%2' Sledilnik '%1' je bil odstranjen iz torrenta '%2' - + URL seed '%1' was added to torrent '%2' URL seme '%1' je bil dodan h torrentu '%2' - + URL seed '%1' was removed from torrent '%2' URL seme '%1' je bil odstranjen iz torrenta '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Ni mogoče nadaljevati torrenta '%1'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Uspešno razčlenjen filter IP: %1 pravil je bilo uveljavljenih. - + Error: Failed to parse the provided IP filter. Napaka: Spodletelo razčlenjevanje filtra IP. - - '%1' restored. - 'torrent name' restored. - - - - + Couldn't add torrent. Reason: %1 Ni bilo mogoče dodati torrenta. Razlog: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' se nadaljuje. (hitro nadaljevanje) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' je bil dodan na seznam prejemov. - + An I/O error occurred, '%1' paused. %2 Zgodila se je napaka I/O, '%1' v premoru. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Spodletela preslikava vrat, sporočilo: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Uspešna preslikava vrat, sporočilo: %1 - + due to IP filter. this peer was blocked due to ip filter. zaradi filtra IP. - + due to port filter. this peer was blocked due to port filter. zaradi filtra vrat. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. zaradi I2P omejitev mešanega načina. - + because it has a low port. this peer was blocked because it has a low port. ker ima prenizka vrata. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent uspešno posluša na vmesniku %1 in vratih: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 Zunanji IP: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - ustvarjanje nove torrent datoteke ni uspelo - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - Vklopljeno - - - - Off - Izklopljeno - - - - Successfully moved torrent: %1. New path: %2 - Torrent uspešno premaknjen: %1. Nova pot: %2 - - - + Could not move torrent: '%1'. Reason: %2 - Torrenta ni bilo mogoče premakniti: '%1'. Razlog: %2 + Ni bilo mogoče premakniti torrenta: '%1'. Razlog: %2 - + File sizes mismatch for torrent '%1', pausing it. Neusklajene velikosti datotek za torrent '%1', v premoru. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... Hitro nadaljevanje je bilo zavrnjeno za torrent '%1'. Razlog: %2. Preverjam znova ... @@ -1679,19 +1339,19 @@ CategoryFilterModel - + Categories - Kategorije + Kategorije - + All - Vse + Vse - + Uncategorized - Ne kategorizirani + @@ -1699,42 +1359,147 @@ Add category... - Dodaj kategorijo... + Dodaj kategorijo... Add subcategory... - Dodaj podkategorijo... + - Edit category... - Uredi kategorijo... + Remove category + Odstrani kategorijo + + + + Remove unused categories + Odstrani neuporabljene kategorije + + + + Resume torrents + Nadaljuj torrente + + + + Pause torrents + + + + + Delete torrents + + + + + New Category + Nova kategorija: + + + + Category: + Kategorija: + + + + Invalid category name + Neveljavno ime kategorije + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Ime kategorije ne sme vsebovati '\'. +Ime kategorije se ne sme začeti/končati z '/'. +Ime kategorije ne sme vsebovati zaporedja '//'. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Vsi (0) + + + Uncategorized (0) + Ne kategorizirani (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Ne kategorizirani (%1) + + + Add category... + Dodaj kategorijo... - Remove category - Odstrani kategorijo + Odstrani kategorijo - Remove unused categories - Odstrani neuporabljene kategorije + Odstrani neuporabljene kategorije - Resume torrents - Nadaljuj torrente + Nadaljuj torrente - Pause torrents - Ustavi torrente + Ustavi torrente - Delete torrents - Izbriši torrente + Izbriši torrente + + + New Category + Nova kategorija: + + + Category: + Kategorija: + + + Invalid category name + Neveljavno ime kategorije + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Ime kategorije ne sme vsebovati '\'. +Ime kategorije se ne sme začeti/končati z '/'. +Ime kategorije ne sme vsebovati zaporedja '//'. + + + All (%1) + this is for the category filter + Vsi (%1) @@ -1774,220 +1539,101 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Potrditev odstranjevanja - - - - Remember choice - Zapomni si izbiro - - - - Also delete the files on the hard disk - Odstrani tudi datoteke na trdem disku - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? Ali ste prepričani, da želite odstraniti '%1' iz seznama prenosov? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? Ali ste prepričani, da želite odstraniti %1 torrentov iz seznama prenosov? - DownloadFromURLDialog - - - Download from URLs - Prejem z URLjev - - - - Add torrent links - Dodaj torrent povezave - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - Ena povezava na vrstico (povezave HTTP, magnetne povezave in info-šifre so podprte) - - - - Download - Prejem - - - - No URL entered - Ni bilo vnesenega URLja - - - - Please type at least one URL. - - - - DownloadedPiecesBar - + White: Missing pieces Belo: Manjkajoči kosi - + Green: Partial pieces Zeleno: Nepopolni kosi - + Blue: Completed pieces Modro: Dokončani kosi - ExecutionLogWidget + ExecutionLog - + General - Splošno + Splošno - + Blocked IPs - + Blokirani IPji - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> je bil blokiran %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - + <font color='red'>%1</font> je bil izobčen FeedListWidget - + RSS feeds Viri RSS - - - Unread (%1) - Neprebrano (%1) + + Unread + Neprebrano FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. + + An error occured while trying to open the log file. Logging to file is disabled. Ob odpiranju datoteke dnevnika je prišlo do napake. Beleženje v datoteko je onemogočeno. - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - - - - - &Browse... - Launch file dialog button text (full) - - - - - Choose a file - Caption for file open/save dialog - - - - - Choose a folder - Caption for directory open dialog - - - - - Any file - Katerakoli datoteka - - - FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. + + + + I/O Error: Could not open ip filter file in read mode. Napaka I/O: Ni mogoče odpreti datoteke filtra IP v načinu branja. - - - - IP filter line %1 is malformed. - Vrstica IP filtra %1 je deformirana. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - Vrstica IP filtra %1 je deformirana. Začetni IP razpona je deformiran. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - Vrstica IP filtra %1 je deformirana. Končni IP razpona je deformiran. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - Vrstica IP filtra %1 je deformirana. En IP je IPv4 in drugi je IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - IP filter izjema izvržena za vrstico %1. Izjema je: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - Pojavila se je %1 dodatna napaka razčlenjevanja IP filtra. - - - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. Napaka razčlenjevanja: Datoteka filtra ni veljavna datoteka PeerGuardian P2B. @@ -1995,396 +1641,472 @@ GeoIPDatabase - - + + Unsupported database file size. Nepodprta velikost datoteke podatkovne zbirke - + Metadata error: '%1' entry not found. Napaka meta podatkov: '%1' ni mogoče najti. - + Metadata error: '%1' entry has invalid type. Napaka meta podatkov: '%1' je neveljavne vrste. - + Unsupported database version: %1.%2 Nepodprta različica podatkovne zbirke: %1.%2 - + Unsupported IP version: %1 Nepodprta različica IP: %1 - + Unsupported record size: %1 Nepodprta velikost zapisa: %1 - + Invalid database type: %1 Neveljavna vrsta podatkovne zbirke: %1 - + Database corrupted: no data section found. Podatkovna zbirka pokvarjena: najden odsek brez podatkov. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - Velikost Http zahteva presega omejitev, zapiranje vtičnice. Meja: %ld, IP: %s + + File + Datoteka - - Bad Http request, closing socket. IP: %s - Slaba Http zahteva, zapiranje vtičnice. IP: %s + + Edit + Uredi - - - HttpServer - + + Help + Pomoč + + + Exit qBittorrent Zapri qBittorrent - + Only one link per line Samo ena povezava na vrstico - + + Download + Prejem + + + Global upload rate limit must be greater than 0 or disabled. Splošna omejitev razmerja pošiljanja mora biti večja od 0 ali onemogočena. - + Global download rate limit must be greater than 0 or disabled. Splošna omejitev razmerja prejema mora biti večja od 0 ali onemogočena. - + Alternative upload rate limit must be greater than 0 or disabled. Nadomestna omejitev razmerja pošiljanja mora biti večja od 0 ali onemogočena. - + Alternative download rate limit must be greater than 0 or disabled. Nadomestna omejitev razmerja prejema mora biti večja od 0 ali onemogočena. - + Maximum active downloads must be greater than -1. Največje število dejavnih prejemov mora biti večje od -1. - + Maximum active uploads must be greater than -1. Največje število dejavnih pošiljanj mora biti večje od -1. - + Maximum active torrents must be greater than -1. Največje število dejavnih torrentov mora biti večje od -1. - + Maximum number of connections limit must be greater than 0 or disabled. Največje število povezav mora biti večje od 0 ali onemogočeno. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Največje število povezav na torrent mora biti večje od 0 ali onemogočeno. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Največje število povezav za pošiljanje na torrent mora biti večje od 0 ali onemogočeno. - + Unable to save program preferences, qBittorrent is probably unreachable. Ni mogoče shraniti možnosti programa, qBittorrent je verjetno nedosegljiv. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent na Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - Neveljavno ime kategorije: -Ne uporabljajte posebnih znakov v imenu kategorije. - - - - Unknown - Nezano - - - - Hard Disk - Trdi disk - - - - Share ratio limit must be between 0 and 9998. - Omejitev razmerja izmenjave mora biti med 0 in 9998. - - - - Seeding time limit must be between 0 and 525600 minutes. - Omejitev časa sejanja mora biti med 0 525600 minut. + + Language + Jezik - + The port used for incoming connections must be between 1 and 65535. Vrata uporabljena za dohodne povezave morajo biti med 1 in 65535. - + The port used for the Web UI must be between 1 and 65535. Vrata uporabljena za spletni vmesnik morajo biti med 1 in 65535. - + Unable to log in, qBittorrent is probably unreachable. Prijava ni mogoča, qBittorrent je verjetno nedosegljiv. - + Invalid Username or Password. Neveljavno uporabniško ime ali geslo. - - Username - Uporabniško ime - - - + Password Geslo - + Login Prijava - + + Upload Failed! + Pošiljanje spodletelo! + + + Original authors Izvirni avtorji - + + Upload limit: + Omejitev pošiljanja: + + + + Download limit: + Omejitev prejema: + + + Apply Uveljavi - + Add Dodaj - + + Category: + Kategorija: + + + Upload Torrents Upload torrent files to qBittorent using WebUI Pošlji torrente - + + All + Vse + + + + Downloading + Prejemanje + + + + Seeding + Sejanje + + + + Completed + Končano + + + + Resumed + Se nadaljuje + + + + Paused + V premoru + + + + Active + Dejavno + + + + Inactive + Nedejavno + + + Save files to location: Shrani datoteke v: - + Cookie: Piškotek: - + Type folder here Vnesite mesto mape - + + Run an external program on torrent completion + Ko se torrent zaključi zaženi zunanji program + + + + Enable bandwidth management (uTP) + Omogoči upravljanje pasovne širine (uTP) + + + + Apply rate limit to uTP connections + Uveljavi omejitve hitrosti za povezave uTP + + + + Alternative Global Rate Limits + Nadomestne splošne omejitve hitrosti + + + More information Več podrobnosti - + Information about certificates Podrobnosti o potrdilih - + Save Files to Shrani datoteke v - - Set location - Nastavi lokacijo - - - - Limit upload rate - Omejitev razmerja pošiljanja + + Watch Folder + Opazuj mapo - - Limit download rate - Omejitev razmerja prejemanja + + Default Folder + Privzeta mapa - - Rename torrent - Preimenuj torrent + + from + from time1 to time2 + od - - Unable to create category - + + to + from time1 to time2 + do - + Other... Save Files to: Watch Folder / Default Folder / Other... Drugo... - + + Every day + Schedule the use of alternative rate limits on ... + Vsak dan + + + + Week days + Schedule the use of alternative rate limits on ... + Med tednom + + + + Week ends + Schedule the use of alternative rate limits on ... + Vikend + + + Monday Schedule the use of alternative rate limits on ... Ponedeljek - + Tuesday Schedule the use of alternative rate limits on ... Torek - + Wednesday Schedule the use of alternative rate limits on ... Sreda - + Thursday Schedule the use of alternative rate limits on ... Četrtek - + Friday Schedule the use of alternative rate limits on ... Petek - + Saturday Schedule the use of alternative rate limits on ... Sobota - + Sunday Schedule the use of alternative rate limits on ... Nedelja - + + Downloaded + Is the file downloaded or not? + Prejeto + + + Logout Odjava - + + Download from URLs + Prejemi z URLjev + + + Download Torrents from their URLs or Magnet links Prejmi torrente preko URL ali magnetne povezave. - + Upload local torrent Pošlji krajevni torrent - + Are you sure you want to delete the selected torrents from the transfer list? Ali ste prepričani, da želite izbrisati izbrane torrente iz seznama prenosov? - + Save Shrani - + qBittorrent client is not reachable Odjemalec qBittorrent ni dosegljiv - - qBittorrent has been shutdown. - qBittorrent je bil izklopljen. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Seznam dovoljenih IP podmrež + + HTTP Server + Strežnik HTTP - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Primer: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Naslednji parametri so podprti: - - Add subnet - Dodaj podmrežo + + Torrent path + Pot torrenta - - Delete - Odstrani + + Torrent name + Ime torrenta - - Error - Napaka + + qBittorrent has been shutdown. + qBittorrent je bil izklopljen. + + + LineEdit - - The entered subnet is invalid. - Vnesena podmreža je neveljavna. + + Clear the text + Pobriši besedilo LogListWidget - + Copy Kopiraj - + Clear Pobriši @@ -2417,551 +2139,493 @@ Ob &zaključenih prejemih - + &View &Pogled - + &Options... &Možnosti ... - + &Resume &Nadaljuj - + Torrent &Creator Ustvarjalnik &torrentov - + Set Upload Limit... Nastavi omejitev pošiljanja ... - + Set Download Limit... Nastavi omejitev prejemanja ... - + Set Global Download Limit... Nastavi splošno omejitev prejemanja ... - + Set Global Upload Limit... Nastavi splošno omejitev pošiljanja ... - + Minimum Priority Najmanjša prednost - + Top Priority Najvišja prednost - + Decrease Priority Zmanjšaj prednost - + Increase Priority Povišaj prednost - - + + Alternative Speed Limits Nadomestna omejitev hitrosti - + &Top Toolbar &Zgornja orodna vrstica - + Display Top Toolbar Pokaži zgornjo orodno vrstico - - Status &Bar - Vrstica &stanja - - - + S&peed in Title Bar Hit&rost v naslovni vrstici - + Show Transfer Speed in Title Bar Pokaži hitrost prenosa v naslovni vrstici - + &RSS Reader &Bralnik RSS - + Search &Engine &Iskalnik - + L&ock qBittorrent &Zakleni qBittorrent - + Do&nate! Pod&ari! - - Close Window - Zapri okno - - - + R&esume All &Nadaljuj vse - + Manage Cookies... Upravljanje piškotkov ... - + Manage stored network cookies Upravljanje shranjenih omrežnih piškotkov - + Normal Messages Dogodki - + Information Messages Informacije - + Warning Messages Opozorila - + Critical Messages Napake - + &Log &Dnevnik - + &Exit qBittorrent &Zapri qBittorrent - + &Suspend System Stanje &pripravljenost - + &Hibernate System Stanje &mirovanje - + S&hutdown System Zau&stavi sistem - + &Disabled Onemo&goči - + &Statistics Statisti&ka - + Check for Updates Preveri za posodobitve - + Check for Program Updates Preveri posodobitve programa - + &About &O programu - + &Pause &Premor - + &Delete &Odstrani - + P&ause All P&remor vseh - + &Add Torrent File... &Dodaj datoteko torrent ... - + Open Odpri - + E&xit &Končaj - + Open URL Odpri URL - + &Documentation Dokumenta&cija - + Lock Zakleni - - - + + + Show Pokaži - + Check for program updates Preveri posodobitve programa - + Add Torrent &Link... Dodaj torrent &povezavo - + If you like qBittorrent, please donate! Če vam je qBittorrent všeč, potem prosim donirajte! - - + Execution Log Dnevnik izvedb - + Clear the password Pobriši geslo - + Filter torrent list... Filtriraj seznam torrenta ... - + &Set Password &Nastavi geslo - - Preferences - Možnosti - - - + &Clear Password &Pobriši geslo - + Transfers Prenosi - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Povezava datoteke torrent - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent ni privzeti program za odpiranje datotek torrent ali magnetnih povezav. Ali želite qBittorrent povezati z datotekami torrent in magnetnimi povezavami? - + Icons Only Samo ikone - + Text Only Samo besedilo - + Text Alongside Icons Besedilo zraven ikon - + Text Under Icons Besedilo pod ikonami - + Follow System Style Upoštevaj slog sistema - - - + + + UI lock password Geslo za zaklep uporabniškega vmesnika - - - + + + Please type the UI lock password: Vpišite geslo za zaklep uporabniškega vmesnika: - + The password should contain at least 3 characters Geslo mora vsebovati vsaj 3 znake. - + Password update Posodobite geslo - + The UI lock password has been successfully updated Geslo za zaklep uporabniškega vmesnika je bilo uspešno posodobljeno. - + Are you sure you want to clear the password? Ali ste prepričani, da želite pobrisati geslo? - - Use regular expressions - - - - + Search Iskanje - + Transfers (%1) Prenosi (%1) - + Error Napaka - + Failed to add torrent: %1 Spodletelo dodajanje torrenta: %1 - + Torrent added Torrent dodan - + '%1' was added. e.g: xxx.avi was added. '%1' je dodan. - + Download completion Prejem zaključen - + I/O Error i.e: Input/Output Error Napaka I/O - + Recursive download confirmation Rekurzivna potrditev prejema - + Yes Da - + No Ne - + Never Nikoli - + Global Upload Speed Limit Splošna omejitev hitrosti pošiljanja - + Global Download Speed Limit Splošna omejitev hitrosti prejemanja - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent se je pravkar posodobil in potrebuje ponovni zagon za uveljavitev sprememb. - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - Nekatere datoteke se trenutno prenašajo. - - - - Are you sure you want to quit qBittorrent? - Ali ste prepričani, da želite zapreti qBittorrent? - - - + &No &Ne - + &Yes &Da - + &Always Yes &Vedno da - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter Star Python tolmač - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. Vaša različica Pythona (%1) je zastarela. Za delovanje iskalnikov morate Python nadgraditi na zadnjo različico. Najmanjša zahteva je: 2.7.9/3.3.0 - + qBittorrent Update Available Na voljo je posodobitev - + + A new version is available. +Do you want to download %1? + Na voljo je nova različica. +Želite prenesti različico %1? + + + Already Using the Latest qBittorrent Version Že uporabljate zadnjo različico - + Undetermined Python version Nedoločena različica Pythona - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. '%1' je zaključil prejemanje. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2970,158 +2634,154 @@ Razlog: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? Torrent '%1' vsebuje torrent datoteke. Ali želite nadaljevati z njihovim prejemom? - + Couldn't download file at URL '%1', reason: %2. Datoteke na URL-ju '%1' ni mogoče prejeti. Razlog: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin Python najden v %1: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + Ni mogoče razbrati vaše različice Pythona (%1). Iskalnik je onemogočen. + + + + Missing Python Interpreter Manjka Python tolmač - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Za uporabo iskalnika potrebujete Python. Ta pa ni nameščen. Ali ga želite namestiti sedaj? - + Python is required to use the search engine but it does not seem to be installed. Python je potreben za uporabo iskalnika, vendar ta ni nameščen. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. Ni posodobitev. Že uporabljate zadnjo različico. - + &Check for Updates &Preveri za posodobitve - + Checking for Updates... Preverjam za posodobitve ... - + Already checking for program updates in the background Že v ozadju preverjam posodobitve programa - + Python found in '%1' Python najden v '%1' - + Download error Napaka prejema - + Python setup could not be downloaded, reason: %1. Please install it manually. Namestitev za Python ni bilo mogoče prejeti. Razlog: %1 Namestite Python ročno. - - + + Invalid password Neveljavno geslo - - - + + RSS (%1) RSS (%1) - + URL download error Napaka prejema URL - + The password is invalid Geslo je neveljavno - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Hitrost prejema: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Hitrost pošiljanja: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [Pr: %1, Po: %2] qBittorrent %3 - + Hide Skrij - + Exiting qBittorrent Izhod qBittorrenta - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Trenutno se prenašajo določene datoteke. +Ali ste prepričani, da želite končati qBittorrent? + + + Open Torrent Files Odpri datoteke torrent - + Torrent Files Torrent datoteke - + Options were saved successfully. Možnosti so bile uspešno shranjene @@ -3129,52 +2789,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. Vaš dinamični DNS je bil uspešno posodobljen. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Napaka dinamičnega DNS-ja: Storitev trenutno ni na voljo, sledi vnovičen poskus čez 30min. - + Dynamic DNS error: hostname supplied does not exist under specified account. Napaka dinamičnega DNS-ja: vpisano ime gostitelja ne obstaja pod določenim računom. - + Dynamic DNS error: Invalid username/password. Napaka dinamičnega DNS-ja: Neveljavno uporabniško ime/geslo. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Napaka dinamičnega DNS-ja: qBittorrent je pristal na črnem seznamu storitve. Prijavite hrošča na http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Napaka dinamičnega DNS-ja: storitev je sporočila %1. Prijavite hrošča na http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Napaka dinamičnega DNSja: Vaše uporabniško ime je bilo blokirano zaradi zlorabe. - + Dynamic DNS error: supplied domain name is invalid. Napaka dinamičnega DNS-ja: vpisano ime domene je neveljavno. - + Dynamic DNS error: supplied username is too short. Napaka dinamičnega DNS-ja: vpisano uporabniško ime je prekratko. - + Dynamic DNS error: supplied password is too short. Napaka dinamičnega DNS-ja: vpisano geslo je prekratko. @@ -3182,1413 +2842,1303 @@ Net::DownloadHandler - + I/O Error I/O Napaka - + The file size is %1. It exceeds the download limit of %2. Velikost datoteke je %1. Prekorači omejitev prejema %2. - + Unexpected redirect to magnet URI. Nepričakovana preusmeritev na magnetno povezavo. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - + + + GeoIP database loaded. Type: %1. Build time: %2. + GeoIP podatkovna zbirka naložena. Vrsta: %1. Čas izgradnje: %2. - - The operation was canceled - + + + Couldn't load GeoIP database. Reason: %1 + Ni bilo mogoče naložiti podatkovne zbirke GeoIP. Razlog: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - + + Venezuela, Bolivarian Republic of + Venezuela, Bolivarska republika - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - GeoIP podatkovna zbirka naložena. Vrsta: %1. Čas izgradnje: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - Ni bilo mogoče naložiti podatkovne zbirke GeoIP. Razlog: %1 - - - - Venezuela, Bolivarian Republic of - Venezuela, Bolivarska republika - - - + Viet Nam Vietnam - - + + N/A / - + Andorra Andora - + United Arab Emirates Združeni Arabski Emirati - + Afghanistan Afganistan - + Antigua and Barbuda Antigva in Barbuda - + Anguilla Angvila - + Albania Albanija - + Armenia Armenija - + Angola Angola - + Antarctica Antarktika - + Argentina Argentina - + American Samoa Ameriška Samoa - + Austria Avstrija - + Australia Avstralija - + Aruba Aruba - + Azerbaijan Azerbajdžan - + Bosnia and Herzegovina Bosna in Hercegovina - + Barbados Barbados - + Bangladesh Bangladeš - + Belgium Belgija - + Burkina Faso Burkina Faso - + Bulgaria Bolgarija - + Bahrain Bahrajn - + Burundi Burundi - + Benin Benin - + Bermuda Bermudi - + Brunei Darussalam Brunej - + Brazil Brazilija - + Bahamas Bahami - + Bhutan Butan - + Bouvet Island Bouvetov otok - + Botswana Bocvana - + Belarus Belorusija - + Belize Belize - + Canada Kanada - + Cocos (Keeling) Islands Kokosovi (Keeling) otoki - + Congo, The Democratic Republic of the Kongo, Demokratična republika - + Central African Republic Srednjeafriška republika - + Congo Kongo - + Switzerland Švica - + Cook Islands Cookovi otoki - + Chile Čile - + Cameroon Kamerun - + China Kitajska - + Colombia Kolumbija - + Costa Rica Kostarika - + Cuba Kuba - + Cape Verde Zelenortski otoki - + Curacao Curacao - + Christmas Island Božični otok - + Cyprus Ciper - + Czech Republic Češka - + Germany Nemčija - + Djibouti Džibuti - + Denmark Danska - + Dominica Dominika - + Dominican Republic Dominikanska republika - + Algeria Alžirija - + Ecuador Ekvador - + Estonia Estonija - + Egypt Egipt - + Western Sahara Zahodna Sahara - + Eritrea Eritreja - + Spain Španija - + Ethiopia Etiopija - + Finland Finska - + Fiji Fidži - + Falkland Islands (Malvinas) Falklandski otoki (Malvinski otoki) - + Micronesia, Federated States of Mikronezija, Federativne države - + Faroe Islands Ferski otoki - + France Francija - + Gabon Gabon - + United Kingdom Združeno Kraljestvo - + Grenada Granada - + Georgia Gruzija - + French Guiana Francoska Gvajana - + Ghana Gana - + Gibraltar Gibraltar - + Greenland Grenlandija - + Gambia Gambija - + Guinea Gvineja - + Guadeloupe Gvadelup - + Equatorial Guinea Ekvatorialna Gvineja - + Greece Grčija - + South Georgia and the South Sandwich Islands Južna Georgija in Južni Sandwichevi otoki - + Guatemala Gvatemala - + Guam Guam - + Guinea-Bissau Gvineja Bissau - + Guyana Gvajana - + Hong Kong Hong Kong - + Heard Island and McDonald Islands Otok Heard in otočje McDonald - + Honduras Honduras - + Croatia Hrvaška - + Haiti Haiti - + Hungary Madžarska - + Indonesia Indonezija - + Ireland Irska - + Israel Izrael - + India Indija - + British Indian Ocean Territory Britansko ozemlje v Indijskem oceanu - + Iraq Irak - + Iran, Islamic Republic of Iran, Islamska republika - + Iceland Islandija - + Italy Italija - + Jamaica Jamajka - + Jordan Jordanija - + Japan Japonska - + Kenya Kenija - + Kyrgyzstan Kirgizistan - + Cambodia Kambodža - + Kiribati Kiribati - + Comoros Komori - + Saint Kitts and Nevis Sveti Krištof in Nevis - + Korea, Democratic People's Republic of Severna Koreja - + Korea, Republic of Južna Koreja - + Kuwait Kuvajt - + Cayman Islands Kajmanski otoki - + Kazakhstan Kazahstan - + Lao People's Democratic Republic Laos - + Lebanon Libanon - + Saint Lucia Sveta Lucija - + Liechtenstein Lihtenštajn - + Sri Lanka Šrilanka - + Liberia Liberija - + Lesotho Lesoto - + Lithuania Litva - + Luxembourg Luksemburg - + Latvia Latvija - + Morocco Maroko - + Monaco Monako - + Moldova, Republic of Moldavija - + Madagascar Madagaskar - + Marshall Islands Marshallovi otoki - + Mali Mali - + Myanmar Mjanmar - + Mongolia Mongolija - + Northern Mariana Islands Severni Marianski otoki - + Martinique Martinik - + Mauritania Mavretanija - + Montserrat Montserrat - + Malta Malta - + Mauritius Mauritius - + Maldives Maldivi - + Malawi Malavi - + Mexico Mehika - + Malaysia Malezija - + Mozambique Mozambik - + Namibia Namibija - + New Caledonia Nova Kaledonija - + Niger Niger - + Norfolk Island Norfolk otok - + Nigeria Nigerija - + Nicaragua Nikaragva - + Netherlands Nizozemska - + Norway Norveška - + Nepal Nepal - + Nauru Nauru - + Niue Niue - + New Zealand Nova Zelandija - + Oman Oman - + Panama Panama - + Peru Peru - + French Polynesia Francoska Polinezija - + Papua New Guinea Papua Nova Gvineja - + Philippines Filipini - + Pakistan Pakistan - + Poland Poljska - + Saint Pierre and Miquelon Saint Pierre in Miquelon - + Puerto Rico Portoriko - + Portugal Portugalska - + Palau Palau - + Paraguay Paragvaj - + Qatar Katar - + Reunion Reunion - + Romania Romunija - + Russian Federation Rusija - + Rwanda Ruanda - + Saudi Arabia Savdska Arabija - + Solomon Islands Salomonovi otoki - + Seychelles Sejšeli - + Sudan Sudan - + Sweden Švedska - + Singapore Singapur - + Slovenia Slovenija - + Svalbard and Jan Mayen Svalbard in Jan Mayen - + Slovakia Slovaška - + Sierra Leone Sierra Leone - + San Marino San Marino - + Senegal Senegal - + Somalia Somalija - + Suriname Surinam - + Sao Tome and Principe Sveti Tomaž in Princ - + El Salvador Salvador - + Syrian Arab Republic Sirija - + Swaziland Svazi - + Turks and Caicos Islands Otoki Turks in Caicos - + Chad Čad - + French Southern Territories Francoska južna in antarktična ozemlja - + Togo Togo - + Thailand Tajska - + Tajikistan Tadžikistan - + Tokelau Tokelav - + Turkmenistan Turkmenistan - + Tunisia Tunizija - + Tonga Tonga - - Could not decompress GeoIP database file. - Datoteke podatkovne zbirke GeoIP ni bilo mogoče razširiti. - - - + Timor-Leste Vzhodni Timor - + Bolivia, Plurinational State of Bolivija - + Bonaire, Sint Eustatius and Saba Nizozemski Karibi - + Cote d'Ivoire Slonokoščena obala - + Libya Libija - + Saint Martin (French part) Saint Martin (Francoski del) - + Macedonia, The Former Yugoslav Republic of Makedonija - + Macao Macao - + Pitcairn Pitcairnovi otoki - + Palestine, State of Palestina - + Saint Helena, Ascension and Tristan da Cunha Sveta Helena, Ascension in Tristan da Cunha - + South Sudan Južni Sudan - + Sint Maarten (Dutch part) Sint Maarten (Nizozemski del) - + Turkey Turčija - + Trinidad and Tobago Trinidad in Tobago - + Tuvalu Tuvalu - + Taiwan Tajvan - + Tanzania, United Republic of Tanzanija, Združena republika - + Ukraine Ukrajina - + Uganda Uganda - + United States Minor Outlying Islands Mali oddaljeni otoki ZDA - + United States Združene države - + Uruguay Urugvaj - + Uzbekistan Uzbekistan - + Holy See (Vatican City State) Sveti sedež (Vatikan) - + Saint Vincent and the Grenadines Sveti Vincencij in Grenadine - + Virgin Islands, British Deviški otoki, Britanski - + Virgin Islands, U.S. Deviški otoki, ZDA - + Vanuatu Vanuatu - + Wallis and Futuna Wallis in Futuna - + Samoa Samoa - + Yemen Jemen - + Mayotte Mayotte - + Serbia Srbija - + South Africa Južna Afrika - + Zambia Zambija - + Montenegro Črna gora - + Zimbabwe Zimbabve - + Aland Islands Alandski otoki - + Guernsey Guernsey - + Isle of Man Otok Man - + Jersey Jersey - + Saint Barthelemy Sveti Bartolomej - + + Could not uncompress GeoIP database file. + Datoteke podatkovne zbirke GeoIP ni bilo mogoče razširiti. + + + Couldn't save downloaded GeoIP database file. Prejete datoteke podatkovne zbirke GeoIP ni bilo mogoče shraniti . - + Successfully updated GeoIP database. Podatkovna zbirka GeoIP uspešno posodobljena . - + Couldn't download GeoIP database file. Reason: %1 Datoteke podatkovne zbirke GeoIP ni bilo mogoče prejeti. Razlog: %1 @@ -4596,12 +4146,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] Podpora UPnP / NAT-PMP [vključena] - + UPnP / NAT-PMP support [OFF] Podpora UPnP / NAT-PMP [izključena] @@ -4609,7 +4159,7 @@ Net::Smtp - + Email Notification Error: Napaka e-poštnega obvestila: @@ -4617,1279 +4167,1077 @@ OptionsDialog - + Options Možnosti - + Behavior Obnašanje - + Downloads Prejemi - + Connection Povezava - + Speed Hitrost - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI Spletni vmesnik - + Advanced Napredno - + Language Jezik - + User Interface Language: Jezik uporabniškega vmesnika: - + (Requires restart) (Zahteva ponovni zagon) - + Transfer List Seznam prenosov - + Confirm when deleting torrents Potrdi ob brisanju torrentov - + Use alternating row colors In transfer list, one every two rows will have grey background. Uporabi izmenične barve vrstic - + Hide zero and infinity values Skrij ničelne in neskončne vrednosti - + Always Vedno - + Paused torrents only Samo ustavljeni torrenti - + Action on double-click Dejanje ob dvojnem kliku - + Downloading torrents: Med prejemanjem torrentov: - - + + Start / Stop Torrent Začni / Ustavi torrent - - + + Open destination folder Odpri ciljno mapo - - + + No action Brez dejanja - + Completed torrents: Končani torrenti: - + Desktop Namizje - + Start qBittorrent on Windows start up Zaženi qBittorrent ob zagonu Windowsov - + Show splash screen on start up Pokaži pozdravno okno ob zagonu - + Start qBittorrent minimized Zaženi qBittorrent skrčen - + Confirmation on exit when torrents are active Zahtevaj potrditev ob izhodu, če so torrenti dejavni - + Confirmation on auto-exit when downloads finish Zahtevaj potrditev ob avtomatskem izhodu, ko so prejemi končani. - - KiB - KiB - - - - Email notification &upon download completion - Pošlji e-poštno obvestilo ob &zaključku prejema - - - - Run e&xternal program on torrent completion - Ko se torrent zaključi za&ženi zunanji program - - - - IP Fi&ltering - Fi&ltriranje IP - - - - Schedule &the use of alternative rate limits - Načrtujte uporabo nadomestnih omejitev hi&trosti - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Več informacij</a>) - - - - &Torrent Queueing - Čakalna vrsta &torrentov - - - - Seed torrents until their seeding time reaches - Seji torrente, dokler čas sejanja ne doseže - - - - A&utomatically add these trackers to new downloads: - S&amodejno dodaj te sledilnike novim prenosom: - - - - RSS Reader - Bralnik RSS - - - - Enable fetching RSS feeds - Omogoči pridobivanje RSS virov - - - - Feeds refresh interval: - Interval osveževanja virov: - - - - Maximum number of articles per feed: - Največje število člankov na vir: - - - - - min - minutes - min - - - - RSS Torrent Auto Downloader - Samodejni prejemnik RSS torrentov - - - - Enable auto downloading of RSS torrents - Omogoči samodejni prejem RSS torrentov - - - - Edit auto downloading rules... - Uredi pravila samodejnega prejema... - - - - Web User Interface (Remote control) - Spletni uporabniški vmesnik (Oddaljen nadzor) - - - - IP address: - IP naslov: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - IP naslov na katerega se bo Web UI povezal. -Določi IPv4 ali IPv6 naslov. Lahko doličiš "0.0.0.0" za katerikoli IPv4 naslov, -"::" za katerikoli IPv6 naslov, ali "*" za oba IPv4 in IPv6. - - - - Server domains: - Domene strežnika: + + Show qBittorrent in notification area + Pokaži qBittorrent v območju za obvestila - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - Seznam dovoljenj za filtriranje vrednosti HTTP Glave gostitelja. -Da se obraniš pred napadom DNS povezovanja, -vstavi imena domen, ki jih uporablja WebUI strežnik. - -Uporabi ';' da razčleniš vnose. Lahko uporbiš nadomestni znak '*'. - - - - &Use HTTPS instead of HTTP - &Uporabi HTTPS namesto HTTP - - - - Bypass authentication for clients on localhost - Obidi overitev za odjemalce na lokalnem gostitelju - - - - Bypass authentication for clients in whitelisted IP subnets - Obidi overitev za odjemalce na seznamu dovoljenih IP podmrež - - - - IP subnet whitelist... - Seznam dovoljenih IP podmrež... - - - - Upda&te my dynamic domain name - &Posodobi moje dinamično ime domene - - - + Minimize qBittorrent to notification area Skrči qBittorrent v območje za obvestila - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. Zapri qBittorrent v območje za ovestila - + Tray icon style: Slog ikone sistemske vrstice: - + Normal Normalen - + Monochrome (Dark theme) Enobarven (Temna tema) - + Monochrome (Light theme) Enobarven (Svetla tema) - + File association Povezava datoteke - + Use qBittorrent for .torrent files Uporabi qBittorrent za datoteke .torrent - + Use qBittorrent for magnet links Uporabi qBittorrent za magnetne povezave - + Power Management Upravljanje porabe - + + Inhibit system sleep when torrents are active + Prepreči prehod v stanje pripravljenosti, če so torrenti dejavni + + + + Log file + Dnevnik + + + Save path: Mesto shranjevanja: - + Backup the log file after: Varnostno kopiraj dnevnik po: - + + MB + MB + + + Delete backup logs older than: Izbriši varnostne kopije dnevnikov starejše od: - + days Delete backup logs older than 10 months dni - + months Delete backup logs older than 10 months mesecev - + years Delete backup logs older than 10 years let - + When adding a torrent Ob dodajanju torrenta - + + Display torrent content and some options + Pokaži vsebino torrenta in nekatere možnosti + + + Bring torrent dialog to the front Prikaži torrent pogovorno okno v ospredju - + Do not start the download automatically The torrent will be added to download list in pause state Prejema ne začni samodejno - + Should the .torrent file be deleted after adding it Ali naj bo .torrent datoteka po dodajanju izbrisana - + + Delete .torrent files afterwards + Po tem izbriši .torrent datoteke + + + Also delete .torrent files whose addition was cancelled Izbriši tudi .torrent datoteke katerih dodajanje je bilo preklicano - + Also when addition is cancelled Tudi ko je dodajanje preklicano - + Warning! Data loss possible! Pozor! Možna je izguba podatkov! - + Saving Management Upravljanje shranjevanja - + Default Torrent Management Mode: Privzet Način Upravljanja Torrentov: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category Avtomatski način pomeni, da so različne lastnosti torrenta (npr. pot za shranjevanje) določene z dodeljeno kategorijo - + Manual Ročni - + Automatic Samodejni - + When Torrent Category changed: Ko je kategorija torrenta spremenjena: - + Relocate torrent Premakni torrent - + Switch torrent to Manual Mode Preklopi torrent na Ročni Način - + When Default Save Path changed: Ko je privzeta pot za shranjevanje spremenjena: - - + + Relocate affected torrents Premakni dotične torrente - - + + Switch affected torrents to Manual Mode Preklopi dotične torrente na Ročni Način - + When Category changed: Ko je Kategorija spremenjena: - + Use Subcategories Uporabi Podkategorije - + Default Save Path: Privzeta pot za shranjevanje: - + Keep incomplete torrents in: Hrani nedokončane torrente v: - + Copy .torrent files to: Kopiraj datoteke .torrent v: - - Show &qBittorrent in notification area - Pokaži &qBittorrent v obvestilnem področju - - - - &Log file - &Dnevnik - - - - Display &torrent content and some options - Pokaži vsebino &torrenta in nekaj možnosti - - - - Create subfolder for torrents with multiple files - Ustvari podmapo za torrente z večimi datotekami - - - - De&lete .torrent files afterwards - Po tem izbriši .torrent &datoteke - - - + Copy .torrent files for finished downloads to: Za zaključene prejeme kopiraj datoteke .torrent v: - + Pre-allocate disk space for all files Predhodno dodeli prostor na disku za vse datoteke - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding - - - - + Append .!qB extension to incomplete files Dodaj pripono .!qB nedokončanim datotekam - - Enable recursive download dialog - - - - + Automatically add torrents from: Samodejno dodaj torrente iz: - + Add entry Dodaj vnos - + Remove entry Odstrani vnos - + + Email notification upon download completion + Pošlji e-poštno obvestilo ob zaključku prejema + + + + Destination email: + Ciljni e-poštni naslov: + + + SMTP server: Strežnik SMTP: - + This server requires a secure connection (SSL) Ta strežnik zahteva varno povezavo (SSL) - - + + + Authentication Overitev - - - - + + + + Username: Uporabniško ime: - - - - + + + + Password: Geslo: - - Enabled protocol: - Omogočen protokol: + + Run external program on torrent completion + Ko se torrent zaključi zaženi zunanji program - - TCP and μTP - TCP in μTP - - - + Listening Port Vrata za poslušanje - + Port used for incoming connections: Uporabljena vrata za dohodne povezave: - + Random Naključna - + Use UPnP / NAT-PMP port forwarding from my router Uporabi UPnP / NAT-PMP posredovanje vrat od mojega usmerjevalnika - + Use different port on each startup Uporabi druga vrata ob vsakem zagonu - + Connections Limits Omejitve povezav - + Maximum number of connections per torrent: Najvišje število povezav na torrent: - + Global maximum number of connections: Najvišje splošno število povezav: - + Maximum number of upload slots per torrent: Najvišje število povezav za pošiljanje na torrent: - + Global maximum number of upload slots: Najvišje splošno število povezav za pošiljanje na torrent: - + Proxy Server Posredniški strežnik - + Type: Tip: - + (None) (Brez) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Gostitelj: - - + + Port: Vrata: - + Otherwise, the proxy server is only used for tracker connections Drugače je posredniški strežnik uporabljen samo za povezave s sledilnikom - + Use proxy for peer connections Uporabi posredniški strežnik za povezave s soležniki - + Disable connections not supported by proxies Onemogoči povezave, ki jih posredniški strežniki ne podpirajo - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Več informacij</a>) - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection Za Vire RSS, iskalnik, posodobitve in ostalo kar ni torrent prenos ali s tem povezano dejanje (kot npr. izmenjava soležnikov) bo uporabljena neposredna povezava - + Use proxy only for torrents Uporabi posredniški strežnik le za torrente - - A&uthentication - Overitev - - - + Info: The password is saved unencrypted Obvestilo: Geslo je shranjeno nešifrirano - + + IP Filtering + Filtriranje IP + + + Filter path (.dat, .p2p, .p2b): Pot filtra (.dat, .p2p, .p2b): - + Reload the filter Ponovno naloži filter - - Manually banned IP addresses... - Ročno izločeni IP naslovi... - - - + Apply to trackers Uveljavi pri sledilcih - + Global Rate Limits Splošne omejitve hitrosti - - - - - - - KiB/s - KiB/s - - - - + + Upload: Pošiljanje: - - + + + + + KiB/s + KiB/s + + + + Download: Prejem: - + Alternative Rate Limits Nadomestne omejitve hitrosti - - + + Schedule the use of alternative rate limits + Načrtujte uporabo nadomestnih omejitev hitrosti + + + From: from (time1 to time2) Od: - - + To: time1 to time2 Do: - + When: Kdaj: - + Every day Vsak dan - + Weekdays Med tednom - + Weekends Vikendi - + Rate Limits Settings Nastavitve omejitev hitrosti - + Apply rate limit to peers on LAN Uveljavi omejitve hitrosti za soležnike na krajevnem omrežju - + Apply rate limit to transport overhead Uveljavi omejitev razmerja v slepi prenos - - + + + Enable µTP protocol + Omogoči µTP protokol + + + Apply rate limit to µTP protocol Uveljavi omejitve hitrosti za µTP protokol - + Privacy Zasebnost - + Enable DHT (decentralized network) to find more peers Omogočite DHT (decentralizirano omrežje) da najdete več soležnikov - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Izmenjaj soležnike z združljivimi odjemalci Bittorrent (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers Omogočite Izmenjavo soležnikov (PeX) da najdete več soležnikov - + Look for peers on your local network Poišči soležnike na krajevnem omrežju - + Enable Local Peer Discovery to find more peers Omogočite odkrivanje krajevnih soležnikov za iskanje več soležnikov - + Encryption mode: Način šifriranja: - + Prefer encryption Prednost šifriranju - + Require encryption Zahtevaj šifriranje - + Disable encryption Onemogoči šifriranje - + Enable when using a proxy or a VPN connection Omogoči, ko se uporablja posredniški strežnik ali povezava VPN - + Enable anonymous mode Omogoči anonimni način - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Več informacij</a>) + + + + Torrent Queueing + Čakalna vrsta torrentov + + + Maximum active downloads: Največ dejavnih prejemov: - + Maximum active uploads: Največ dejavnih pošiljanj: - + Maximum active torrents: Največ dejavnih torrentov: - + Do not count slow torrents in these limits V teh omejitvah ne štej počasnih torrentov - - Upload rate threshold: - Omejitev hitrosti pošiljanja: - - - - Download rate threshold: - Omejitev hitrosti prejemanja: - - - - sec - seconds - sec - - - - Torrent inactivity timer: - Časovnik nedejavnosti torrenta: - - - + Share Ratio Limiting Omejevanje razmerja izmenjave - + Seed torrents until their ratio reaches - Seji torrente, dokler razmerje ne doseže + Pošiljaj torrente, dokler razmerje ne doseže - + then nato - + Pause them Jih ustavi - + Remove them Jih odstrani - - RSS Smart Episode Filters - RSS Pametni filtri epizod + + Automatically add these trackers to new downloads: + Samodejno dodaj te sledilnike novim prenosom: - + + Enable Web User Interface (Remote control) + Omogoči spletni uporabniški vmesnik (Daljinski nadzor) + + + Use UPnP / NAT-PMP to forward the port from my router Uporabi UPnP / NAT-PMP za posredovanje vrat od mojega usmerjevalnika - + + Use HTTPS instead of HTTP + Uporabi HTTPS namesto HTTP + + + Certificate: Potrdilo: - + Import SSL Certificate Uvozi SSL potrdilo - + Key: Ključ: - + Import SSL Key Uvozi SSL ključ - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Podrobnosti o potrdilih</a> - - Use alternative Web UI - Uporabi alternativni spletni vmesnik + + Bypass authentication for localhost + Obidi overitev za lokalnega gostitelja - - Files location: - Mesto datotek: + + Update my dynamic domain name + Posodobi mojo dinamično ime domene - - Enable clickjacking protection - - - - - Enable Cross-Site Request Forgery (CSRF) protection - - - - + Service: Storitev: - + Register Vpis - + Domain name: Ime domene: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! Z omogočanjem teh možnosti lahko <strong>nepreklicno izgubite</strong> vaše .torrent datoteke! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well Ko so te možnosti omogočene, bo qBittorent <strong>izbrisal</strong> .torrent datoteke po uspešnem (prva možnost) ali neuspešnem (druga možnost) dodajanju na čakalno vrsto. To bo uveljavljeno <strong>ne le</strong> pri datotekah odprtih z ukaznim menijem &ldquo;Dodaj torrent&rdquo;, ampak tudi pri odprtih s <strong>povezavo tipa datoteke</strong> - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog Če omogočite drugo možnost (&ldquo;Tudi ko je dodajanje preklicano&rdquo;) bodo .torrent datoteke <strong>izbrisane</strong>, tudi če pritisnete &ldquo;<strong>Prekliči</strong>&rdquo;, v &ldquo;Dodaj torrent&rdquo; meniju - - Choose Alternative UI files location - Izberi mesto datotek alternativnega vmesnika - - - + Supported parameters (case sensitive): Podprti parametri (razlikovanje velikosti črk): - + %N: Torrent name %N: Ime torrenta - + %L: Category %L: Kategorija - - %G: Tags (seperated by comma) - %G: Oznake (ločene z vejico) - - - + %F: Content path (same as root path for multifile torrent) %F: Pot vsebine (enaka kot korenska pot za večdatotečni torrent) - + %R: Root path (first torrent subdirectory path) %R: Korenska pot (pot podmape prvega torrenta) - + %D: Save path %D: Mesto za shranjevanje - + %C: Number of files %C: Število datotek - + %Z: Torrent size (bytes) %Z: Velikost torrenta (bajti) - + %T: Current tracker %T: Trenutni sledilnik - + %I: Info hash %I: Info šifra - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") Namig: Postavi parameter med narekovaje da se izogneš prelomu teksta na presledku (npr., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - Torrent bo obravnavan kot počasen, če hitrosti pošiljanja in prejemanja ostaneta pod temi vrednostmi za "Časovnik nedejavnosti torrenta" sekund - - - + Select folder to monitor Izberite mapo za nadzorovanje - + Folder is already being monitored: Mapa se že nadzaruje: - + Folder does not exist: Mapa ne obstaja: - + Folder is not readable: Mapa ni berljiva: - + Adding entry failed Dodajanje vnosa je spodletelo - - - - + + Choose export directory Izberite mapo za izvoz - - - + + + + + + Choose a save directory Izberite mapo za shranjevanje - + Choose an IP filter file Izberite datoteko s filtri IP - + All supported filters Vsi podprti filtri - + SSL Certificate Potrdilo SSL - + + SSL Key + Ključ SSL + + + Parsing error Napaka razčlenjevanja - + Failed to parse the provided IP filter Spodletelo razčlenjevanje filtra IP - + Successfully refreshed Uspešno osveženo - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Uspešno razčlenjen filter IP: %1 pravil je bilo uveljavljenih. - + Invalid key Neveljaven ključ - + This is not a valid SSL key. To ni veljaven ključ SSL. - + Invalid certificate Neveljavno potrdilo - - Preferences - Možnosti - - - - Import SSL certificate - Uvozi SSL potrdilo - - - + This is not a valid SSL certificate. To ni veljavno potrdilo SSL. - - Import SSL key - Uvozi SSL ključ + + Time Error + Napaka v času - - SSL key - SSL ključ - - - - Time Error - Napaka v času - - - + The start time and the end time can't be the same. Čas začetka in konca ne smeta biti enaka. - - + + Length Error Napaka v dolžini - + The Web UI username must be at least 3 characters long. Uporabniško ime za spletni vmesnik mora vsebovati vsaj 3 znake. - + The Web UI password must be at least 6 characters long. Geslo za spletni vmesnik mora vsebovati vsaj 6 znakov. @@ -5897,72 +5245,72 @@ PeerInfo - - Interested(local) and Choked(peer) - Zainteresiran(krajevni) in Blokiran(soležnik) + + interested(local) and choked(peer) + zainteresiran(krajevni) in blokiran(soležnik) - + interested(local) and unchoked(peer) zainteresiran(krajevni) in sproščen(soležnik) - + interested(peer) and choked(local) zainteresiran(soležnik) in blokiran(krajevni) - + interested(peer) and unchoked(local) zainteresiran(soležnik) in sproščen(krajevni) - + optimistic unchoke poskusna sprostitev - + peer snubbed soležnik ignoriran - + incoming connection dohodna povezava - + not interested(local) and unchoked(peer) nezainteresiran(krajevni) in sproščen(soležnik) - + not interested(peer) and unchoked(local) nezainteresiran(soležnik) in sproščen(krajevni) - + peer from PEX soležnik s PEX - + peer from DHT soležnik z DHT - + encrypted traffic šifriran promet - + encrypted handshake šifrirana izmenjava signalov - + peer from LSD soležnik z LSD @@ -5970,193 +5318,178 @@ PeerListWidget - + IP IP - + Port Vrata - + Flags Zastavice - + Connection Povezava - + Client i.e.: Client application Odjemalec - + Progress i.e: % downloaded Napredek - + Down Speed i.e: Download speed Hitrost prejema - + Up Speed i.e: Upload speed Hitrost pošiljanja - + Downloaded i.e: total data downloaded Prejeto - + Uploaded i.e: total data uploaded Poslano - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Pomembnost - + Files i.e. files that are being downloaded right now Datoteke - + Column visibility Vidnost stolpca - + Add a new peer... Dodaj novega soležnika ... - - + + Ban peer permanently Trajno izobči soležnika - + Manually adding peer '%1'... Ročno dodajanje soležnika '%1' ... - + The peer '%1' could not be added to this torrent. Soležnika '%1' ni bilo mogoče dodati k torrentu. - + Manually banning peer '%1'... Ročno izobčenje soležnika '%1' ... - - + + Peer addition Zbiranje soležnikov - + Country Država - + Copy IP:port Kopiraj IP: vrata - + Some peers could not be added. Check the Log for details. Nekaterih soležnikov ni bilo mogoče dodati h torrentu. Za več podrobnosti preverite Dnevnik. - + The peers were added to this torrent. Soležniki so bili dodani h torrentu. - + Are you sure you want to ban permanently the selected peers? Ali ste prepričani, da želite trajno izobčiti izbrane soležnike? - + &Yes &Da - + &No &Ne - PeersAdditionDialog + PeersAdditionDlg - - Add Peers - - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - - - + No peer entered - + Ni bilo vnesenega soležnika - + Please type at least one peer. - + Vpišite vsaj enega soležnika. - + Invalid peer - + Neveljaven soležnik - + The peer '%1' is invalid. - + Soležnik '%1' je neveljaven. PieceAvailabilityBar - + White: Unavailable pieces Belo: Nedosegljivi kosi - + Blue: Available pieces Modro: Dosegljivi kosi @@ -6164,370 +5497,327 @@ PiecesBar - + Files in this piece: Datoteke v tem kosu: - + File in this piece Datoteka v tem kosu - + File in these pieces Datoteka v teh kosih - - Wait until metadata become available to see detailed information - Za ogled podrobnejših informacij počakajte, da podatki postanejo dostopni - - - + Hold Shift key for detailed information Drži tipko Shift za podrobnejše informacije - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Vstavki iskanja - + Installed search plugins: - + Nameščeni vstavki iskanja: - + Name - Ime + Ime - + Version - + Verzija - + Url - + URL - - + + Enabled - - - - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - + Omogočeno - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Nove vstavke iskanja najdete na: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Namestite novega - + Check for updates - + Preveri za posodobitve - + Close - + Zapri - + Uninstall - + Odstrani - - - + + + Yes - Da + Da - - - - + + + + No - Ne + Ne - + Uninstall warning - + Opozorilo odstranjevanja - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Nekatere vstavke ni bilo mogoče odstraniti, ker so vključeni v qBittorrent. Odstranite lahko samo tiste, ki ste jih dodali sami. +Tisti vstavki so bili onemogočeni. - + Uninstall success - + Odstranjevanje uspešno - + All selected plugins were uninstalled successfully - - - - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - + Vsi izbrani vstavki so bili uspešno odstranjeni - - + + New search engine plugin URL - + Nov URL vstavka iskalnika. - - + + URL: - + URL: - + Invalid link - + Neveljavna povezava - + The link doesn't seem to point to a search engine plugin. - + Povezava ne kaže na vstavek iskalnika. - + Select search plugins - + Izberite vstavke iskanja - + qBittorrent search plugin - + qBittorrent vstavek iskanja - + + + + Search plugin update + Posodobitev vstavka iskanja + + + All your plugins are already up to date. - + Vsi vstavki so že posodobljeni. - + Sorry, couldn't check for plugin updates. %1 - + Oprostite, preverjanje posodobitev za vstavek ni mogoče. %1 - + + + Search plugin install - + Namestitev vstavka iskanja + + + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + Vstavek iskalnika "%1" je bil uspešno nameščen. - + Couldn't install "%1" search engine plugin. %2 - + Namestitev vstavka iskalnika "%1" ni bila mogoča. %2 + + + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + Vstavek iskalnika "%1" je bil uspešno posodobljen. - + Couldn't update "%1" search engine plugin. %2 - + Posodobitev vstavka iskalnika "%1" ni bila mogoča. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Vir vstavka - + Search plugin source: - + Vir vstavka iskanja: - + Local file - + Lokalna datoteka - + Web link - - - - - PowerManagement - - - qBittorrent is active - + Spletna povezava - PreviewSelectDialog - - - Preview - Predogled - + PreviewSelect - + Name Ime - + Size Velikost - + Progress Napredek - - + + Preview impossible Predogled ni mogoč - - + + Sorry, we can't preview this file - Žal predogled te datoteke ni mogoč - - - - Private::FileLineEdit - - - '%1' does not exist - '%1' ne obstaja - - - - '%1' does not point to a directory - '%1' ne povezuje do mape - - - - '%1' does not point to a file - '%1' ne povezuje do datoteke - - - - Does not have read permission in '%1' - Ni dovoljenja za branje v '%1' - - - - Does not have write permission in '%1' - Ni dovoljenja za pisanje v '%1' + Žal, predogled te datoteke ni mogoč PropListDelegate - + Not downloaded Ni prejet - - + + Normal Normal (priority) - Normalna - - - - N/A - / + Normalno - + Do not download Do not download (priority) - Ne prenesi + Ne prenesi - - + + High High (priority) - Visoka + Visoko + + + N/A + / - + Mixed Mixed (priorities Mešano - - + + Maximum Maximum (priority) - Najvišja + Najvišje PropTabBar - + General Splošno - + Trackers Sledilniki - + Peers Soležniki - + HTTP Sources Viri HTTP - + Content Vsebina - + Speed Hitrost @@ -6621,22 +5911,22 @@ Komentar: - + Select All Izberi vse - + Select None Ne izberi nič - + Normal Normalno - + High Visoko @@ -6696,165 +5986,165 @@ Mesto: - + Maximum Največ + - Do not download Ne prenesi - + Never Nikoli - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (ima %3) - - + + %1 (%2 this session) %1(%2 to sejo) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (sejano %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1(%2 max) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1(%2 skupno) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1(%2 povpr.) - + Open Odpri - + Open Containing Folder Odpri mapo - + Rename... Preimenuj ... - + Priority Prednost - + New Web seed Nov spletni sejalec - + Remove Web seed Odstrani spletnega sejalca - + Copy Web seed URL Kopiraj URL spletnega sejalca - + Edit Web seed URL Uredi URL spletnega sejalca - + + Rename the file + Preimenuj datoteko + + + New name: Novo ime: - - + + + The file could not be renamed + Datoteke ni bilo mogoče preimenovati + + + + This file name contains forbidden characters, please choose a different one. + Ime datoteke vsebuje prepovedane znake, izberite drugo ime. + + + + This name is already in use in this folder. Please use a different name. To ime je že v uporabi v tej mapi. Prosim uporabite drugo ime. - + The folder could not be renamed Mape ni bilo mogoče preimenovati - + qBittorrent qBittorrent - + Filter files... Filtriraj datoteke ... - - Renaming - Preimenovanje - - - - - Rename error - Napaka v preimenovanju - - - - The name is empty or contains forbidden characters, please choose a different one. - Ime je prazno ali pa vsebuje nedovoljene znake, prosimo izberite drugega. - - - + New URL seed New HTTP source Nov URL sejalca - + New URL seed: Nov URL sejalca: - - + + This URL seed is already in the list. URL sejalca je že na seznamu. - + Web seed editing Urejanje spletnega sejalca - + Web seed URL: URL spletnega sejalca: @@ -6862,230 +6152,117 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + Vaš naslov IP je bil izobčen zaradi prevelikega števila neuspešnih poskusov overitve. + + + + Error: '%1' is not a valid torrent file. + + Napaka: '%1' je neveljavna datoteka torrent. + + + + + Error: Could not add torrent to session. + Napaka: Ni mogoče dodati torrenta k seji. + + + + I/O Error: Could not create temporary file. + Napaka I/O: Ni mogoče ustvariti začasne datoteke. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 ni znan parameter ukazne vrstice. - - + + %1 must be the single command line parameter. %1 mora biti parameter v eni ukazni vrstici. - + + %1 must specify the correct port (1 to 65535). + %1 mora določiti prava vrata ( 1 do 65535). + + + You cannot use %1: qBittorrent is already running for this user. Ne morete uporabiti %1: qBittorrent je že zagnan za tega uporabnika. - + Usage: Uporaba: - + Options: Možnosti: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - Parameter '%1' mora slediti sintaksi '%1=%2' - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - Parameter '%1' mora slediti sintaksi '%1=%2' - - - - Expected integer number in environment variable '%1', but got '%2' - Pričakovano število v okoljski spremenljivki '%1', ampak dobljeno '%2' - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - Parameter '%1' mora slediti sintaksi '%1=%2' - - - - Expected %1 in environment variable '%2', but got '%3' - Pričakovano %1 v okoljski spremenljivki '%2', ampak dobljeno '%3' - - - - port - vrata - - - - %1 must specify a valid port (1 to 65535). - %1 mora določiti veljavna vrata ( 1 do 65535). - - - - Display program version and exit - Pokaži različico programa in zapri + + Displays program version + Pokaže različico programa - - Display this help message and exit - Prikaži sporočilo s pomočjo in zapri + + Displays this help message + Pokaže to spletno pomoč - - Change the Web UI port - Spremeni vrata spletnega vmesnika + + Changes the Web UI port (current: %1) + Spremeni vrata spletnega vmesnika (trenutno: %1) - + Disable splash screen Onemogoči pozdravno okno - + Run in daemon-mode (background) Zaženi v načinu ozadnjega opravila (v ozadju) - - dir - Use appropriate short form or abbreviation of "directory" - mapa - - - - Store configuration files in <dir> - Shrani konfiguracijske datoteke v <dir> - - - - - name - ime - - - - Store configuration files in directories qBittorrent_<name> - Shrani konfiguracijske datoteke v mapah qBittorrent_<name> - - - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Vdri v libtorrent datoteke za hitro nadaljevanje in ustvari poti datotek ki se nanašajo na profilno mapo - - - - files or URLs - datoteke ali URL-ji - - - - Download the torrents passed by the user - Prenesi datoteke, ki jih je uporabnik preskočil - - - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Določi ali se pojavno okno "Dodaj nov torrent" prikaže ob dodajanju novih torrentov. - - - - Options when adding new torrents: - Možnosti ob dodajanju novih torrentov: - - - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Bližnjica do %1 - - - - path - pot - - - - Torrent save path - Pot za shranjevanje torrenta - - - - Add torrents as started or paused - Dodaj torrente kot začete ali ustavljene - - - - Skip hash check - Preskoči preverjanje napak - - - - Assign torrents to category. If the category doesn't exist, it will be created. - Dodeli torrente kategoriji. Če kategorija ne obstaja bo ustvarjena. - - - - Download files in sequential order - Prejemanje datotek v zaporednem vrstnem redu - - - - Download first and last pieces first - Prejemanje najprej prvih in zadnjih kosov - - - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - Vrednosti možnosti so lahko posredovane preko okoljskih spremenljivk. Za možnost imenovano 'parameter-name', je ime okoljske spremenljivke 'QBT_PARAMETER_NAME' (veliki znaki, '-' je zamenjan z '_'). Da preideš zastavljene vrednost nastavi spremenljivko na '1' ali 'TRUE'. Na primer, da onemogočiš pozdravno okno: + + Downloads the torrents passed by the user + Prejme torrente, ki jih posreduje uporabnik - - Command line parameters take precedence over environment variables - Parametri ukazne vrstice imajo prednost pred okoljskimi spremenljivkami - - - + Help Pomoč - + Run application with -h option to read about command line parameters. Zaženite program z možnosti -h, če želite prebrati več o parametrih ukazne vrstice. - + Bad command line Napačna ukazna vrstica - + Bad command line: Napačna ukazna vrstica: - + Legal Notice Pravno obvestilo - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - qBittorrent je program za izmenjavo datotek. Ko zaženete torrent bodo njegovi podatki na voljo drugim. Vsebina, ki jo izmenjujete je samo vaša odgovornost. - - - - No further notices will be issued. - Nadaljnih obvestil ne bo. - - - + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. No further notices will be issued. @@ -7094,353 +6271,432 @@ Ne bo nadaljnjih obvestil. - + Press %1 key to accept and continue... Pritisnite tipko %1 za sprejem in nadaljevanje ... - + Legal notice Pravno obvestilo - + Cancel Prekliči - + I Agree Se strinjam - - - Upgrade - Nadgradnja + + Torrent name: %1 + Ime torrenta: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - Posodobili ste starejšo različico, ki je shranjevala predmete na drugačen način. Morali boste uporabljati nov sistem shranjevanja. Ne boste mogli več uporabljati starejše različice od v3.3.0. Nadaljujem? [y/n] + + Torrent size: %1 + Velikost torrenta: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - Posodobili ste starejšo različico, ki je shranjevala predmete na drugačen način. Morali boste uporabljati nov sistem shranjevanja. Če nadaljujete ne boste mogli več uporabljati starejše različice od v3.3.0. + + Save path: %1 + Mesto: %1 - - Couldn't migrate torrent with hash: %1 - Ni mogoče preseliti torrenta z šifro: %1 + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Torrent je bil prejet v %1. - - Couldn't migrate torrent. Invalid fastresume file name: %1 - Ni mogoče preseliti torrenta. Neveljavno ime datoteke za hitro nadaljevanje: %1 + + Thank you for using qBittorrent. + Hvala, ker uporabljate qBittorrent. - - Detected unclean program exit. Using fallback file to restore settings: %1 - + + [qBittorrent] '%1' has finished downloading + [qBittorrent] '%1' je zaključil prejemanje - - An access error occurred while trying to write the configuration file. - Ob poskusu pisanja nastavitvene datoteke se je zgodila napaka dostopa. + + The remote host name was not found (invalid hostname) + Oddaljeno ime gostitelja ni bilo najdeno (neveljavno ime gostitelja) - - A format error occurred while trying to write the configuration file. - Ob poskusu pisanja nastavitvene datoteke se je zgodila napaka zapisa. - + + The operation was canceled + Dejanje je bilo preklicano + - - An unknown error occurred while trying to write the configuration file. - + + The remote server closed the connection prematurely, before the entire reply was received and processed + Oddaljeni strežnik je predčasno zaprl povezavo, preden je bil odgovor prejet in obdelan + + + + The connection to the remote server timed out + Povezava do oddaljenega strežnika je časovno potekla + + + + SSL/TLS handshake failed + Spodletela izmenjava signalov SSL/TLS - - - RSS::AutoDownloader - - - Invalid data format. - Neveljavna oblika podatkov. + + The remote server refused the connection + Oddaljeni strežnik je zavrnil povezavo + + + + The connection to the proxy server was refused + Povezava na posredniški strežnik je bila zavrnjena - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - Podatkov Samodejnega prejemnika RSS ni bilo mogoče shraniti na %1. Napaka: %2 + + The proxy server closed the connection prematurely + Posredniški strežnik je predčasno zaprl povezavo - - Invalid data format - Neveljavna oblika podatkov + + The proxy host name was not found + Ime gostitelja posredniškega strežnika ni bilo najdeno - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - Pravil Samodejnega prejemnika RSS ni bilo mogoče brati z %1. Napaka: %2 + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Povezava do posredniškega strežnika je časovno potekla ali pa posredniški strežnik ni odgovoril na poslano zahtevo - - Couldn't load RSS AutoDownloader rules. Reason: %1 - Pravil Samodejnega prejemnika RSS ni bilo mogoče naložiti. Razlog: %1 + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Posredniški strežnik potrebuje overitev za spoštovanje zahteve ampak ni sprejel nobenih ponujenih poveril - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - RSS vira z '%1' ni mogoče prejeti. Razlog: %2. + + The access to the remote content was denied (401) + Dostop do oddaljene vsebine je bil zavrnjen (401) - - RSS feed at '%1' updated. Added %2 new articles. - RSS vir z '%1' posodobljen. Dodanih %2 novih člankov. + + The operation requested on the remote content is not permitted + Zahtevano dejanje na oddaljeni vsebini ni dovoljeno - - Failed to parse RSS feed at '%1'. Reason: %2 - Razčlenjevanje RSS vira z '%1' ni uspelo. Razlog: %2 + + The remote content was not found at the server (404) + Oddaljena vsebina ni bila najdena na strežniku (404) - - Couldn't read RSS Session data from %1. Error: %2 - Podatkov RSS seje ni bilo mogoče brati z %1. Napaka: %2 + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Oddaljeni strežnik potrebuje overitev za serviranje vsebine ampak ni sprejel nobenih ponujenih poveril - - Couldn't parse RSS Session data. Error: %1 - Razčlenjevanje podatkov RSS seje ni uspelo. Napaka: %1 + + The Network Access API cannot honor the request because the protocol is not known + Network Access API ne more spoštovati zahteve, ker protokol ni znan - - Couldn't load RSS Session data. Invalid data format. - Podatkov RSS seje ni bilo mogoče naložiti. Neveljaven zapis podatkov. + + The requested operation is invalid for this protocol + Zahtevano dejanje je neveljavno za ta protokol - - Couldn't load RSS article '%1#%2'. Invalid data format. - RSS članka '%1#%2' ni bilo mogoče naložiti. Neveljaven zapis podatkov. + + An unknown network-related error was detected + Zaznana je bila neznana napaka povezana z omrežjem - - - RSS::Private::Parser - - Invalid RSS feed. - Neveljaven vir RSS. + + An unknown proxy-related error was detected + Zaznana je bila neznana napaka povezana s posredniškim strežnikom - - %1 (line: %2, column: %3, offset: %4). - %1 (vrstica: %2, stolpec: %3, odmik: %4). + + An unknown error related to the remote content was detected + Zaznana je bila neznana napaka povezana z oddaljeno vsebino + + + + A breakdown in protocol was detected + Zaznana je bila napaka v protokolu + + + + Unknown error + Neznana napaka - - - RSS::Session - - RSS feed with given URL already exists: %1. - Vir RSS z danim URL-jem že obstaja: %1. + + + Upgrade + Nadgradnja + + + + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] + Posodobili ste starejšo različico, ki je shranjevala predmete na drugačen način. Morali boste uporabljati nov sistem shranjevanja. Ne boste mogli več uporabljati starejše različice od v3.3.0. Nadaljujem? [y/n] - - Cannot move root folder. - Korenske mape ni mogoče premakniti. + + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. + Posodobili ste starejšo različico, ki je shranjevala predmete na drugačen način. Morali boste uporabljati nov sistem shranjevanja. Če nadaljujete ne boste mogli več uporabljati starejše različice od v3.3.0. - - - Item doesn't exist: %1. - Predmet ne obsaja: %1. + + Couldn't migrate torrent with hash: %1 + Ni mogoče preseliti torrenta z šifro: %1 - - Cannot delete root folder. - Korenske mape ni mogoče izbrisati. + + Couldn't migrate torrent. Invalid fastresume file name: %1 + Ni mogoče preseliti torrenta. Neveljavno ime datoteke za hitro nadaljevanje: %1 - - Incorrect RSS Item path: %1. - Nepravilna pot RSS predmeta: %1. + + Detected unclean program exit. Using fallback file to restore settings. + Zaznana nepravilna zaustavitev programa. Uporaba povrnitvene datoteke za obnovitev nastavitev. - - RSS item with given path already exists: %1. - RSS predmet z dano potjo že obstaja: %1. + + An access error occurred while trying to write the configuration file. + Ob poskusu pisanja nastavitvene datoteke se je zgodila napaka dostopa. - - Parent folder doesn't exist: %1. - Starševska mapa ne obstaja: %1. + + A format error occurred while trying to write the configuration file. + Ob poskusu pisanja nastavitvene datoteke se je zgodila napaka zapisa. - RSSWidget + RSS - + Search Iskanje - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - Pridobivanje RSS virov je zdaj onemogočeno! Omgočite ga lahko v nastavitvah aplikacije. - - - + New subscription Nova naročnina - - - + + + Mark items read Označi predmete kot prebrane - - Refresh RSS streams - Osveži pretok RSS - - - + Update all Posodobi vse - + RSS Downloader... - Prejemalnik RSS ... + Prejemnik RSS ... + + + + Settings... + Nastavitve ... - + Torrents: (double-click to download) - Torrenti: (dvojni klik za prejem) + Torrenti: (dvojni klik za prenos) - - + + Delete Odstrani - + Rename... Preimenuj ... - + Rename Preimenuj - - + + Update Posodobi - + New subscription... Nova naročnina ... - - + + Update all feeds Posodobi vse vire - + Download torrent Prejmi torrent - + Open news URL Odpri URL novic - + Copy feed URL Kopiraj URL vira - + New folder... Nova mapa ... - + + Refresh RSS streams + Osveži pretok RSS + + + + RSSImp + + + Stream URL: + URL pretoka: + + + + Please type a RSS stream URL + Vpišite URL pretoka RSS + + + + This RSS feed is already in the list. + Vir RSS je že na vašem seznamu. + + + Please choose a folder name Izberite ime mape - + Folder name: Ime mape: - + New folder Nova mapa - - Please type a RSS feed URL - Vpišite URL vira RSS - - - - Feed URL: - Vir URL: - - - + Deletion confirmation - Potrditev odstranjevanja + Potrditev brisanja - + Are you sure you want to delete the selected RSS feeds? Ali ste prepričani, da želite izbrisati izbrane vire RSS? - + Please choose a new name for this RSS feed Izberite novo ime za ta vir RSS - + New feed name: Novo ime vira: - - Rename failed - Preimenovanje neuspešno + + Name already in use + Ime je že v uporabi + + + + This name is already used by another item, please choose another one. + To ime že uporablja drug predmet, izberite novo ime. - + Date: Datum: - + Author: Avtor: + + + Unread + Neprebrano + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + Samodejni prejem '%1' iz '%2' vira RSS je spodletel, ker ne vsebuje torrenta ali magnetne povezave... + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + Samodejno prenašanje torrenta '%1' iz '%2' vira RSS ... + + + + Rss::Private::Parser + + + Invalid RSS feed. + Neveljaven vir RSS. + + + + RssSettingsDlg + + + RSS Reader Settings + Nastavitve bralnika RSS + + + + RSS feeds refresh interval: + Razmik osveževanja virov RSS: + + + + min + min + + + + Maximum number of articles per feed: + Največje število člankov na vir: + ScanFoldersDelegate - + Select save location Izberi mesto shranjevanja @@ -7448,274 +6704,268 @@ ScanFoldersModel - + Monitored Folder Nadzorovana mapa - + Override Save Location Prepiši mesto shranjevanja - + Monitored folder Nadzorovana mapa - + Default save location Privzeto mesto za shranjevanje - + Browse... Brskaj ... - SearchJobWidget + SearchEngine - - Form - + + Unknown search engine plugin file format. + Neznana datotečna oblika vstavka iskalnika. - - Results(xxx) - + + A more recent version of this plugin is already installed. + Novejša različica tega vstavka je že nameščena. - - Search in: - + + + Plugin is not supported. + Vstavek ni podprt. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - + + Update server is temporarily unavailable. %1 + Strežnik za posodobitve trenutno ni na voljo. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - + + + Failed to download the plugin file. %1 + Prenos vstavka je spodletel. %1 - - Seeds: - Semena: + + An incorrect update info received. + Sprejeti napačni podatki o posodobitvah. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - + + All categories + Vse kategorije - - - to - + + Movies + Filmi - - <html><head/><body><p>Maximal number of seeds</p></body></html> - + + TV shows + TV oddaje - - - - + + Music + Glasba - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + + Games + Igre - - Size: - Velikost: + + Anime + Anime - - <html><head/><body><p>Minimal torrent size</p></body></html> - + + Software + Programska oprema - - <html><head/><body><p>Maximal torrent size</p></body></html> - + + Pictures + Slike + + + + Books + Knjige + + + + SearchListDelegate + + + + Unknown + Neznano + + + SearchTab - + Name i.e: file name - Ime + Ime - + Size i.e: file size - Velikost + Velikost - + Seeders i.e: Number of full sources - + Sejalci - + Leechers i.e: Number of partial sources - + Pobiralci - + Search engine - - - - - Filter search results... - + Iskalnik - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Rezultati (prikazani <i>%1</i> od <i>%2</i>): - + Torrent names only - + Samo imena torrentov - + Everywhere - - - - - Use regular expressions - + Povsod - + Searching... - + Iskanje ... - + Search has finished - Iskanje je zaključeno + Iskanje je zaključeno - + Search aborted - + Iskanje preklicano - + An error occurred during search... - + Med iskanjem se je zgodila napaka - + Search returned no results - + Iskanje ni vrnilo rezultatov - + Column visibility Vidnost stolpca - - - SearchPluginManager - - Unknown search engine plugin file format. - Neznana datotečna oblika vstavka iskalnika. + + Form + Oblika - - A more recent version of this plugin is already installed. - Novejša različica tega vstavka je že nameščena. + + Results(xxx) + Rezultati (xxx) - - - Plugin is not supported. - Vstavek ni podprt. + + Search in: + Išči v: - - All categories - + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Nekateri iskalniki iščejo tako v opusu, kot v imenu torrent datoteke. Ali so taki rezultati prikazani na spodnjem seznamu, nadzirate s tem načinom</p><p><span style=" font-weight:600;">Povsod</span> onemogoči filtriranje in prikaže vse rezultate iskalnikov.</p><p><span style=" font-weight:600;">Samo imena torrentov</span> prikaže samo torente, katerih imena se ujemajo s poizvedbo iskanja</p></body></html> - - Movies - + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Nastavi najmanjše in največje dovoljeno število sejalcev</p></body></html> - - TV shows - + + Seeds: + Semena: - - Music - + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Najmanjše število semen</p></body></html> - - Games - + + + to + do - - Anime - + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Največje število semen</p></body></html> + + + + + + - - Software - + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Nastavi najmanjše in največje dovoljeno velikost torrenta</p></body></html> - - Pictures - + + Size: + Velikost: - - Books - + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Najmanjša velikost torrenta</p></body></html> - - Update server is temporarily unavailable. %1 - Strežnik za posodobitve trenutno ni na voljo. %1 - - - - - Failed to download the plugin file. %1 - Prenos vstavka je spodletel. %1 - - - - An incorrect update info received. - Sprejeti napačni podatki o posodobitvah. - - - - Search plugin '%1' contains invalid version string ('%2') - Vstavek iskanja '%1' vsebuje neveljaven niz različice ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Največja velikost torrenta</p></body></html> @@ -7723,198 +6973,185 @@ - - - - + + + Search Iskanje - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - Ni nameščenih vstavkov iskanja. -Klikni na gumb "Vstavki iskanja ..." spodaj desno da jih namestite. - - - + Download Prejmi - + Go to description page Pojdi na stran z opisom - + Copy description page URL Kopiraj URL naslov strani z opisom - + Search plugins... Vstavki iskanja ... - + A phrase to search for. Iskalna fraza: - + Spaces in a search term may be protected by double quotes. Presledke pri iskalni frazi lahko zaščitite z dvojnimi narekovaji. - + Example: Search phrase example Primer: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>: išči <b>foo</b> in <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: išči <b>foo bar</b> - + All plugins Vsi vstavki - + Only enabled Samo omogočeni - + Select... Izberi ... - - - + + + Search Engine Iskalnik - + Please install Python to use the Search Engine. Za uporabo iskalnika namestite Python. - + Empty search pattern Prazen iskani parameter - + Please type a search pattern first Najprej vpišite iskani parameter - + Stop Ustavi - + Search has finished Iskanje je zaključeno - + Search has failed Iskanje je spodletelo - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + qBittorrent se bo zdaj zaprl. - + E&xit Now - + &Zapri - + Exit confirmation - + Potrditev izhoda - + The computer is going to shutdown. - + Računalnik se bo zaustavil. - + &Shutdown Now - - - - - Shutdown confirmation - + Za&ustavi - + The computer is going to enter suspend mode. - + Računalnik bo šel v stanje pripravljenosti. - + &Suspend Now - + &Pripravljenost - + Suspend confirmation - + Potrditev stanja pripravljenosti - + The computer is going to enter hibernation mode. - + Računalnik bo šel v stanje mirovanja. - + &Hibernate Now - + &Mirovanje - + Hibernate confirmation - + Potrditev stanja mirovanja - + You can cancel the action within %1 seconds. - + Dejanje lahko prekinete v %1 sekundah. + + + + Shutdown confirmation + Potrditev izklopa SpeedLimitDialog - + KiB/s KiB/s @@ -7922,52 +7159,52 @@ SpeedPlotView - + Total Upload Skupaj poslano - + Total Download Skupaj prejeto - + Payload Upload Poslano koristne vsebine - + Payload Download Prejeto koristne vsebine - + Overhead Upload Poslano skupne uporabe - + Overhead Download Prejeto skupne uporabe - + DHT Upload DHT poslano - + DHT Download DHT prejeto - + Tracker Upload Sledilnik poslal - + Tracker Download Sledilnik prejel @@ -7975,95 +7212,87 @@ SpeedWidget - + Period: Obdobje: - + 1 Minute 1 minuta - + 5 Minutes 5 minut - + 30 Minutes 30 minut - + 6 Hours 6 ur - + Select Graphs Izberite grafe - + Total Upload Skupaj poslano - + Total Download Skupaj prejeto - + Payload Upload Poslano koristne vsebine - + Payload Download Prejeto koristne vsebine - + Overhead Upload Poslano skupne uporabe - + Overhead Download Prejeto skupne uporabe - + DHT Upload DHT poslano - + DHT Download DHT prejeto - + Tracker Upload Sledilnik poslal - + Tracker Download Sledilnik prejel - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8076,48 +7305,48 @@ Statistika uporabnika - - Cache statistics - Statistika predpomnilnika + + Total peer connections: + Skupno število povezav soležnikov: - - Read cache hits: - Zadetki branja predpomnilnika: + + Global ratio: + Splošno razmerje: - - Average time in queue: - Povprečen čas v čakalni vrsti: + + Alltime download: + Skupno prejeto: - - Connected peers: - Povezanih soležnikov: + + Alltime upload: + Skupno poslano: - - All-time share ratio: - Razmerje izmenjave vseh časov: + + Total waste (this session): + Skupaj zavrnjeno (to sejo): - - All-time download: - Prenos vseh časov: + + Cache statistics + Statistika predpomnilnika - - Session waste: - Zavrženo v seji: + + Read cache hits: + Zadetki branja predpomnilnika: - - All-time upload: - Poslano vseh časov: + + Average time in queue: + Povprečen čas v čakalni vrsti: - Total buffer size: + Total buffers size: Skupna velikost medpomnilnika: @@ -8146,7 +7375,12 @@ Skupna velikost v čakalni vrsti: - + + OK + OK + + + %1 ms 18 milliseconds %1 ms @@ -8155,27 +7389,32 @@ StatusBar - + Connection status: Stanje povezave: - + No direct connections. This may indicate network configuration problems. Ni neposrednih povezav. To lahko pomeni, da so težave z nastavitvijo omrežja. - + DHT: %1 nodes DHT: %1 vozlišč - - qBittorrent needs to be restarted! - qBittorrent se mora ponovno zagnati! + + qBittorrent needs to be restarted + qBittorrent se mora ponovno zagnati + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent se je pravkar posodobil in potrebuje ponovni zagon za uveljavljanje sprememb. @@ -8194,1566 +7433,1311 @@ Povezani - + Click to switch to alternative speed limits Kliknite za uporabo nadomestnih omejitev hitrosti - + Click to switch to regular speed limits Kliknite za uporabo splošnih omejitev hitrosti - + + Manual change of rate limits mode. The scheduler is disabled. + Ročna sprememba načina omejitve hitrosti. Razporejevalnik je onemogočen. + + + Global Download Speed Limit Splošna omejitev hitrosti prejemanja - + Global Upload Speed Limit Splošna omejitev hitrosti pošiljanja - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - Vsi (0) + Vsi (0) - + Downloading (0) - + Prejemanje (0) - + Seeding (0) - + Sejanje (0) - + Completed (0) - + Končano (0) - + Resumed (0) - + Se nadaljuje (0) - + Paused (0) - + V premoru (0) - + Active (0) - + Dejavno (0) - + Inactive (0) - + Nedejavno (0) - + Errored (0) - + Napaka (0) - + All (%1) - Vsi (%1) + Vsi (%1) - + Downloading (%1) - + Prejemanje (%1) - + Seeding (%1) - + Sejanje (%1) - + Completed (%1) - + Končano (%1) - + Paused (%1) - + V premoru (%1) - + Resumed (%1) - + Se nadaljuje (%1) - + Active (%1) - + Dejavno (%1) - + Inactive (%1) - + Nedejavno (%1) - + Errored (%1) - + Napaka (%1) - TagFilterModel + TorrentContentModel - - Tags - Oznake + + Name + Ime - - All - Vse + + Size + Velikost - - Untagged - Neoznačeno + + Progress + Napredek - - - TagFilterWidget - - Add tag... - Dodaj oznako ... + + Download Priority + Prioriteta prenosov - - Remove tag - Odstrani oznako + + Remaining + Preostalo + + + TorrentCreatorDlg - - Remove unused tags - Odstrani neuporabljene oznake + + Select a folder to add to the torrent + Izberite mapo, ki jo želite dodati torrentu - - Resume torrents - Nadaljuj torrente + + Select a file to add to the torrent + Izberite datoteko, ki jo želite dodati torrentu - - Pause torrents - Ustavi torrente + + No input path set + Ni bilo nastavljeno mesto vnosa - - Delete torrents - Izbriši torrente + + Please type an input path first + Najprej vpišite mesto vnosa - - New Tag - Nova oznaka + + Select destination torrent file + Izberite ciljno datoteko torrenta - - Tag: - Oznaka: + + Torrent Files (*.torrent) + Torrent datoteke (*.torrent) - - Invalid tag name - Neveljavno ime oznake + + Torrent was created successfully: %1 + %1 is the path of the torrent + Torrent je bil uspešno ustvarjen: %1 - - Tag name '%1' is invalid - Ime oznake '%1' je neveljavno + + + + Torrent creation + Ustvarjanje torrenta - - Tag exists - Oznaka obstaja + + Torrent creation was unsuccessful, reason: %1 + Ustvarjanje torrenta ni bilo uspešno. Razlog: %1 - - Tag name already exists. - Ime oznake že obstaja. + + Created torrent file is invalid. It won't be added to download list. + Ustvarjena datoteka torrent je neveljavna. Ne bo dodana na seznam prejemov. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Lastnosti kategorije torrenta + + Name + i.e: torrent name + Ime - - Name: - Ime: + + Size + i.e: torrent size + Velikost - - Save path: - Mesto shranjevanja: + + Done + % Done + Končano - - Choose save path - Izberi mapo za shranjevanje + + Status + Torrent status (e.g. downloading, seeding, paused) + Stanje - - New Category - Nova kategorija: + + Seeds + i.e. full sources (often untranslated) + Semena - - Invalid category name - Neveljavno ime kategorije + + Peers + i.e. partial sources (often untranslated) + Soležniki - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - Ime kategorije ne sme vsebovati '\'. -Ime kategorije se ne sme začeti/končati z '/'. -Ime kategorije ne sme vsebovati zaporedja '//'. + + Down Speed + i.e: Download speed + Hitrost prejema - - Category creation error - Napaka pri ustvarjanju kategorije + + Up Speed + i.e: Upload speed + Hitrost pošiljanja - - Category with the given name already exists. -Please choose a different name and try again. - Kategorija z danim imenom že obstaja. -Prosimo da izberete drugo ime in poizkusite znova. + + Ratio + Share ratio + Razmerje - - - TorrentContentModel - - Name - Ime + + ETA + i.e: Estimated Time of Arrival / Time left + Preostali čas - - Size - Velikost + + Category + Kategorija - - Progress - Napredek + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Dodano - - Download Priority - Prioriteta prenosov + + Completed On + Torrent was completed on 01/01/2010 08:00 + Končano - - Remaining - Preostalo + + Tracker + Sledilnik - - Availability - Na voljo + + Down Limit + i.e: Download limit + Omejitev prejemanja - - - TorrentCreatorDialog - - Torrent Creator - + + Up Limit + i.e: Upload limit + Omejitev pošiljanja - - Select file/folder to share - + + Downloaded + Amount of data downloaded (e.g. in MB) + Prejeto - - Path: - + + Uploaded + Amount of data uploaded (e.g. in MB) + Poslano - - [Drag and drop area] - + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Prejeto v seji - - - Select file - + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Poslano v seji - - - Select folder - + + Remaining + Amount of data left to download (e.g. in MB) + Preostalo - - Settings - + + Time Active + Time (duration) the torrent is active (not paused) + Čas delovanja - - Piece size: - + + Save path + Torrent save path + Mesto - - Auto - + + Completed + Amount of data completed (e.g. in MB) + Končano - - 16 KiB - + + Ratio Limit + Upload share ratio limit + Omejitev razmerja - - 32 KiB - + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Nazadnje videno v celoti - - 64 KiB - + + Last Activity + Time passed since a chunk was downloaded/uploaded + Zadnja dejavnost - - 128 KiB - - - - - 256 KiB - - - - - 512 KiB - - - - - 1 MiB - - - - - 2 MiB - - - - - 4 MiB - - - - - 8 MiB - - - - - 16 MiB - - - - - 32 MiB - - - - - Calculate number of pieces: - - - - - Private torrent (Won't distribute on DHT network) - - - - - Start seeding immediately - - - - - Ignore share ratio limits for this torrent - - - - - Optimize alignment - - - - - Fields - - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - - - - Web seed URLs: - - - - - Tracker URLs: - - - - - Comments: - - - - - Source: - - - - - Progress: - Napredek: - - - - Create Torrent - - - - - - - Torrent creation failed - - - - - Reason: Path to file/folder is not readable. - - - - - Select where to save the new torrent - - - - - Torrent Files (*.torrent) - - - - - Reason: %1 - - - - - Reason: Created torrent is invalid. It won't be added to download list. - - - - - Torrent creator - - - - - Torrent created: - - - - - TorrentInfo - - - File size exceeds max limit %1 - - - - - Torrent file read error: %1 - - - - - Torrent file read error: size mismatch - - - - - TorrentsController - - - Not contacted yet - Še ni bilo stika - - - - Updating... - Posodabljam... - - - - Working - Deluje - - - - Not working - Ne deluje - - - - Error: '%1' is not a valid torrent file. - Napaka: '%1' je neveljavna datoteka torrent. - - - - - - - Torrent queueing must be enabled - Čakalna vrsta Torrentov mora biti omogočena - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - - Cannot make save path - - - - - Cannot write to directory - - - - - WebUI Set location: moving "%1", from "%2" to "%3" - WebUI Nastavi mesto: premikam "&1" z "%2" na "%3" - - - - Incorrect torrent name - Napačno ime torrenta - - - - - Incorrect category name - Napačno ime kategorije + + Total Size + i.e. Size including unwanted data + Skupna velikost TrackerFiltersList - + All (0) this is for the tracker filter Vsi (0) - + Trackerless (0) Brez sledilnika (0) - + Error (0) Napaka (0) - + Warning (0) Opozorilo (0) - - + + Trackerless (%1) Brez sledilnika (%1) - - + %1 (%2) + openbittorrent.com (10) + %1 (%2) + + + + Error (%1) Napaka (%1) - - + + Warning (%1) Opozorilo (%1) - + Resume torrents Nadaljuj torrente - + Pause torrents Premor torrentov - + Delete torrents Odstrani torrente - - + + All (%1) this is for the tracker filter Vsi (%1) - TrackerListWidget + TrackerList - - - Working - Deluje + + URL + URL - - Disabled - Onemogočeno + + Status + Stanje - - This torrent is private + + Received - - Updating... - Posodabljam... - - - - Not working - Ne deluje - - - - Not contacted yet - Še ni bilo stika + + Seeds + Semena - - - - - - - N/A - / + + Peers + Soležniki - - Tracker editing - + + Downloaded + Prejeto - - Tracker URL: - + + Message + Sporočilo - - - Tracker editing failed - + + + Working + Deluje - - The tracker URL entered is invalid. - + + Disabled + Onemogočeno - - The tracker URL already exists. - + + This torrent is private + Ta torrent je zaseben - - Add a new tracker... - + + Updating... + Posodabljam... - - Remove tracker - + + Not working + Ne deluje - - Copy tracker URL - + + Not contacted yet + Še ni bilo stika - - Edit selected tracker URL - + + Tracker URL: + URL sledilnika: - - Force reannounce to selected trackers - + + Tracker editing + Urejanje sledilnika - - Force reannounce to all trackers - + + + Tracker editing failed + Urejanje sledilnika spodletelo - - URL - + + The tracker URL entered is invalid. + Vpisani URL sledilnika ni veljaven. - - Status - Stanje + + The tracker URL already exists. + URL sledilnika že obstaja. - - Received - + + Add a new tracker... + Dodaj nov sledilnik ... - - Seeds - + + Copy tracker URL + Kopiraj URL sledilnika - - Peers - Soležniki + + Edit selected tracker URL + Uredi izbrani URL sledilnika - - Downloaded - Prejeto + + Force reannounce to selected trackers + Prisilno sporoči izbranim sledilnikom - - Message - + + Force reannounce to all trackers + Prisilno sporoči vsem sledilnikom - - Column visibility - Vidnost stolpca + + Remove tracker + Odstrani sledilnik - TrackerLoginDialog - - - - Tracker authentication - - - - - Tracker: - - - - - Login - Prijava - - - - Username: - Uporabniško ime: - + TrackersAdditionDlg - - Password: - Geslo: + + Trackers addition dialog + Pogovorno okno za dodajanje sledilnikov - - Log in - + + List of trackers to add (one per line): + Seznam sledilnikov za dodajanje (en na vrstico): - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + µTorrent URL seznam združljivosti: - - List of trackers to add (one per line): - + + I/O Error + I/O Napaka - - µTorrent compatible list URL: - + + Error while trying to open the downloaded file. + Napaka ob poskusu odpiranja prejete datoteke. - + No change - + Brez spremembe - + No additional trackers were found. - + Ni bilo najdenih dodatnih sledilnikov. - + Download error - Napaka prejema + Napaka prejema - + The trackers list could not be downloaded, reason: %1 - + Seznam sledilnikov ni bilo mogoče prejeti. Razlog: %1 TransferListDelegate - + Downloading Prejemanje - + Downloading metadata used when loading a magnet link Prejemanje meta podatkov - + Allocating qBittorrent is allocating the files on disk Alociram - + Paused V premoru - + Queued i.e. torrent is queued V vrsti za prejem - + Seeding Torrent is complete and in upload-only mode Sejanje - + Stalled Torrent is waiting for download to begin Zastoj - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [D] Prejemanje - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [D] Sejanje - + Checking Torrent local data is being checked Preverjanje - + Queued for checking i.e. torrent is queued for hash checking V čakalni vrsti za preverjanje - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Preverjanje podatkov za nadaljevanje - + Completed Končano - - Moving - Torrent local data are being moved/relocated - - - - + Missing Files Mankajoče Datoteke - + Errored torrent status, the torrent has an error Napaka - + %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - %1 (sejano %2) - - - - %1 ago - e.g.: 1h 20m ago - %1 nazaj - - - - TransferListFiltersWidget - - - Status - Stanje - - - - Categories - Kategorije - - - - Tags - Oznake - - - - Trackers - Sledilniki - - - - TransferListModel - - - Name - i.e: torrent name - Ime - - - - Size - i.e: torrent size - Velikost - - - - Done - % Done - - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Stanje - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - Soležniki - - - - Down Speed - i.e: Download speed - Hitrost prejema - - - - Up Speed - i.e: Upload speed - Hitrost pošiljanja - - - - Ratio - Share ratio - - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - Kategorija - - - - Tags - Oznake - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Prejeto - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Poslano - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - Preostalo - - - - Time Active - Time (duration) the torrent is active (not paused) - - - - - Save path - Torrent save path - - - - - Completed - Amount of data completed (e.g. in MB) - Končano + e.g. 4m39s (seeded for 3m10s) + %1 (sejano %2) - - Ratio Limit - Upload share ratio limit - + + %1 ago + e.g.: 1h 20m ago + %1 nazaj + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + Stanje - - Last Activity - Time passed since a chunk was downloaded/uploaded - + + Categories + Kategorije - - Total Size - i.e. Size including unwanted data - + + Trackers + Sledilniki TransferListWidget - + Column visibility Vidnost stolpca - + Choose save path Izberite mesto za shranjevanje - + Torrent Download Speed Limiting Omejitev hitrosti prejemanja torrenta - + Torrent Upload Speed Limiting Omejitev hitrosti pošiljanja torrenta - + Recheck confirmation Ponovno potrdite preverjanje - + Are you sure you want to recheck the selected torrent(s)? Ali ste prepričani, da želite ponovno preveriti želene torrente? - + Rename Preimenuj - + New name: Novo ime: - + Resume Resume/start the torrent Nadaljuj - + Force Resume Force Resume/start the torrent Prisili nadaljevanje - + Pause Pause the torrent Premor - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Nastavi mesto: premikam "&1" z "%2" na "%3" - - - - Add Tags - Dodaj oznake - - - - Remove All Tags - Odstrani vse oznake - - - - Remove all tags from selected torrents? - Odstrani vse oznake z izbranega torrenta? + + New Category + Nova kategorija: - - Comma-separated tags: - Z vejico ločene oznake: + + Category: + Kategorija: - - Invalid tag - Neveljavna oznaka + + Invalid category name + Neveljavno ime kategorije - - Tag name: '%1' is invalid - Ime oznake: '%1' je neveljavno + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Ime kategorije ne sme vsebovati '\'. +Ime kategorije se ne sme začeti/končati z '/'. +Ime kategorije ne sme vsebovati zaporedja '//'. - + Delete Delete the torrent Odstrani - + Preview file... Predogled datoteke ... - + Limit share ratio... Omeji razmerje izmenjave ... - + Limit upload rate... Omejitev razmerja pošiljanja ... - + Limit download rate... Omejitev razmerja prejemanja ... - + Open destination folder Odpri ciljno mapo - + Move up i.e. move up in the queue Premakni navzgor - + Move down i.e. Move down in the queue Premakni navzdol - + Move to top i.e. Move to top of the queue Premakni na vrh - + Move to bottom i.e. Move to bottom of the queue Premakni na dno - + Set location... Nastavi mesto ... - - Force reannounce - Prisili ponovno sporočanje - - - + Copy name Kopiraj ime - - Copy hash - Kopiraj šifro - - - + Download first and last pieces first Prejemanje najprej prvih in zadnjih kosov - + Automatic Torrent Management Samodejno Upravljanje Torrenta - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category Avtomatski način pomeni, da so različne lastnosti torrenta (npr. pot za shranjevanje), določene z dodeljeno kategorijo - + Category Kategorija - + New... New category... Nova... - + Reset Reset category Ponastavi - - Tags - Oznake - - - - Add... - Add / assign multiple tags... - Dodaj ... - - - - Remove All - Remove all tags - Odstrani vse - - - + Priority Prioriteta - + Force recheck Prisili ponovno preverjanje - + Copy magnet link Kopiraj magnetno povezavo - + Super seeding mode Način super sejanja - + Rename... Preimenuj... - + Download in sequential order Prejemanje v zaporednem vrstnem redu - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + Omejevanje torrent razmerja pošiljanja/prejemanja - - Use global share limit - + + Use global ratio limit + Uporabi splošno omejitev razmerja - - - + + + buttonGroup - + buttonGroup - - Set no share limit - + + Set no ratio limit + Brez omejitve razmerja - - Set share limit to - + + Set ratio limit to + Nastavi omejitev razmerja na + + + WebApplication - - ratio - + + Incorrect category name + Napačno ime kategorije + + + WebUI - - minutes - + + The Web UI is listening on port %1 + Spletni vmesnik posluša na vratih %1 - - No share limit method selected - + + Web UI Error - Unable to bind Web UI to port %1 + Napaka spletnega vmesnika - ni mogoče povezati spletni vmesnik na vrata %1 + + + + about + + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Napreden odjemalec BitTorrent, programiran v C++, temelji na zbirki orodij Qt in libtorrent-rasterbar. - - Please select a limit method first - + + Copyright %1 2006-2016 The qBittorrent project + Avtorske pravice %1 2006-2016 The qBittorrent project + + + + Home Page: + Domača stran: + + + + Forum: + Forum: + + + + Bug Tracker: + Sledilnik hroščev: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - + + Add Peers + Dodaj soležnike - - Python not detected - + + List of peers to add (one per line): + Seznam soležnikov za dodajanje (en na vrstico): + + + + Format: IPv4:port / [IPv6]:port + Zapis: IPv4:vrata / [IPv6]:vrata - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - Nesprejemljiva oblika datoteke, dovoljene so le splošne datoteke. + + + Tracker authentication + Overitev sledilnika - - Symlinks inside alternative UI folder are forbidden. - Symlinki znotraj mape alternativnega vmesnika so prepovedani. + + Tracker: + Sledilnik: - - Exceeded the maximum allowed file size (%1)! - Presežena največja dovoljena velikost datoteke (%1)! + + Login + Prijava - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - WebUI: Glava izvirnika & Izvor tarče se ne ujemata! IP vira: '%1'. Glava izvirnika: '%2'. Izvor tarče: '%3' + + Username: + Uporabniško ime: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - WebUI: Glava nanašalca & Izvor tarče se ne ujemata! IP vira: '%1'. Glava nanašalca: '%2'. Izvor tarče: '%3' + + Password: + Geslo: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - WebUI: Neveljavna Glava Gostitelja, neujemanje vrat. Zahteva za IP vira: '%1'. Vrata strežnika: '%2'. Prejeta Glava izvirnika: '%3'  + + Log in + Prijava - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - WebUI: Neveljavna Glava Gostitelja. Zahteva za IP vira: '%1'. Prejeta Glava izvirnika: '%2' + + Cancel + Prekliči - WebUI + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + Potrditev odstranjevanje - qBittorrent + + + + Remember choice + Zapomni si izbiro + + + + Also delete the files on the hard disk + Odstrani tudi datoteke na trdem disku + + + + confirmShutdownDlg + + + Don't show again + Ne prikaži več + + + + createTorrentDialog - - Web UI: HTTPS setup successful - Web UI: HTTPS namestitev uspešna + + Cancel + Prekliči + + + + Torrent Creation Tool + Orodje za ustvarjanje torrenta + + + + Torrent file creation + Ustvarjanje datoteke torrent + + + + Add file + Dodaj datoteko + + + + Add folder + Dodaj mapo + + + + File or folder to add to the torrent: + Datoteka ali mapa, ki jo želite dodati torrentu: + + + + Tracker URLs: + URL-ji sledilnikov: + + + + Web seeds urls: + URL pletnih sejalcev: + + + + Comment: + Komentar: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Ločite lahko stopnje / skupine sledilnika s prazno vrstico. + + + + Piece size: + Velikost kosa: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + Samodejno - - Web UI: HTTPS setup failed, fallback to HTTP - Web UI: HTTPS namestitev spodletela, povrnitev na HTTP + + Private (won't be distributed on DHT network if enabled) + Zasebno (če omogočeno, ne bo razširjeno na omrežju DHT) - - Web UI: Now listening on IP: %1, port: %2 - Web UI: Posluša na IP: %1, vrata %2 + + Start seeding after creation + Po ustvarjanju začni sejati - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Web UI: Povezava na IP %1, vrata %2 ni mogoča. Razlog: %3 + + Ignore share ratio limits for this torrent + Ne upoštevaj omejitev razmerja izmenjave za ta torrent + + + + Create and save... + Ustvari in shrani ... + + + + Progress: + Napredek: + + + + downloadFromURL + + + Add torrent links + Dodaj torrent povezave + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Eno na vrstico (povezave HTTP, magnetne povezave in info-šifre so podprta) + + + + Download + Prenesi + + + + Cancel + Prekliči + + + + Download from urls + Prejemanje iz URLjev + + + + No URL entered + Ni bilo vpisanega URLja + + + + Please type at least one URL. + Vpišite vsaj en URL. + + + + errorDialog + + + Crash info + Informacije o napaki fsutils - + + + + + Downloads Prejemi @@ -9761,100 +8745,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + Python ni bil zaznan + + + + Python version: %1 + Različica Python: %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1h %2m - + %1d %2h e.g: 2days 10hours %1d %2h - + Unknown Unknown (size) Neznano - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent bo sedaj izklopil računalnik, ker so vsi prejemi zaključeni. - + < 1m < 1 minute < 1m - + %1m e.g: 10minutes %1m + + + Working + Deluje + + + + Updating... + Posodabljam... + + + + Not working + Ne deluje + + + + Not contacted yet + Še ni bilo stika + preview - + Preview selection Izbira predogleda - + The following files support previewing, please select one of them: Naslednje datoteke podpirajo predogled. Izberite eno: + + + Preview + Predogled + + + + Cancel + Prekliči + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_sr.ts qbittorrent-3.3.15/src/lang/qbittorrent_sr.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_sr.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_sr.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,145 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - O qBittorrent-у + O qBittorrent-у - + About - О програму + О програму - + Author - Аутор - - - - Current maintainer - + Аутор - - Greece + + + Nationality: - - - Nationality: - + + + Name: + Име: - - + + E-mail: - Електронска-пошта: + Електронска-пошта: - - - Name: - Име: + + Greece + - - Original author + + Current maintainer - - France - Француска + + Original author + - + Special Thanks - + Translators - - License - Лиценца - - - + Libraries - Библиотеке + Библиотеке - + qBittorrent was built with the following libraries: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - - - - - Forum: - - - - - Bug Tracker: - - - - - AboutDlg - - About qBittorrent - O qBittorrent-у - - - About - О програму - - - Author - Аутор - - - Name: - Име: - - - E-mail: - Електронска-пошта: - - - Libraries - Библиотеке - - + France - Француска + Француска + License - Лиценца + Лиценца @@ -150,57 +90,67 @@ - + + Browse... + + + + + Set as default save path + + + + Never show again - + Torrent settings - + Set as default category - + Category: - + Start torrent - + Torrent information - + Skip hash check - + Size: - + Hash: - + Comment: Коментар: - + Date: @@ -225,245 +175,218 @@ - - Remember last used save path - - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - + Do not delete .torrent file - - Create subfolder - - - - - Download in sequential order - Преузимање у сријском редоследу - - - - Download first and last pieces first - - - - + Normal Нормалан - + High Висок - + Maximum Максималан - + Do not download Не преузимај - - - + + + I/O Error И/О Грешка - + Invalid torrent - - - - - - - Torrent is already present + + + + + Already in download list - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. + + Not Available + This comment is unavailable - - Torrent '%1' is already in the transfer list. Trackers have been merged. + + Not Available + This date is unavailable - - Torrent is already queued for processing. + + Not available - - Magnet link '%1' is already in the transfer list. Trackers have been merged. + + Invalid magnet link - - Magnet link is already queued for processing. + + The torrent file '%1' does not exist. - - Renaming + + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. - - - Rename error + + Failed to load the torrent: %1. +Error: %2 + Don't remove the ' +' characters. They insert a newline. - - The name is empty or contains forbidden characters, please choose a different one. + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. - - Not Available - This comment is unavailable + + Torrent is already in download list. Trackers were merged. - - Not Available - This date is unavailable + + + Cannot add torrent - - Not available + + Cannot add this torrent. Perhaps it is already in adding state. - - Invalid magnet link + + This magnet link was not recognized - - The torrent file '%1' does not exist. + + Magnet link is already in download list. Trackers were merged. - - The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. + + Cannot add this torrent. Perhaps it is already in adding. - Failed to load the torrent: %1. -Error: %2 - Don't remove the ' -' characters. They insert a newline. - - - - - This magnet link was not recognized - - - - Magnet link - + Retrieving metadata... - + Not Available This size is unavailable. - + Free space on disk: %1 - + + Choose save path Изаберите путању чувања + Rename the file - Преименуј фајл + Преименуј фајл - + New name: Ново име: + + The file could not be renamed - Фајл не може бити преименован + Фајл не може бити преименован + This file name contains forbidden characters, please choose a different one. - Ово име фајла садржи недозвољене карактере, молим изаберите неко друго. + Ово име фајла садржи недозвољене карактере, молим изаберите неко друго. - - + + This name is already in use in this folder. Please use a different name. Ово име је већ у употреби молим изаберите неко друго. - + The folder could not be renamed Фолдер не може бити преименован - + Rename... Преименуј... - + Priority Приоритет - + Invalid metadata - + Parsing metadata... - + Metadata retrieval complete - + Download Error @@ -471,324 +394,198 @@ AdvancedSettings + Disk write cache size - Величина кеша Диска + Величина кеша Диска - + MiB MiB - + Outgoing ports (Min) [0: Disabled] Одлазних портова (Min) [0: Искључено] - + Outgoing ports (Max) [0: Disabled] Одлазних портова (Max) [0: Искључено] - + Recheck torrents on completion Провери торенте на завршетку - + Transfer list refresh interval Трансфер листа интервал освежавања - + ms milliseconds ms - + Setting Подешавање - + Value Value set for this setting Вредност - - - (disabled) - - - - + (auto) - - min - minutes - - - - + All addresses - + qBittorrent Section - - + + Open documentation - + libtorrent Section - - Asynchronous I/O threads - - - - - Disk cache - - - - + s seconds - + Disk cache expiry interval - + Enable OS cache - - Guided read cache - - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - - - - - - KiB - - - - - Send buffer watermark - - - - - Send buffer low watermark - - - - - Send buffer watermark factor - - - - - Prefer TCP - - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address + + m + minutes - + Resolve peer countries (GeoIP) Одреди земљу peer-а (учесника) (GeoIP) - + Resolve peer host names Одреди име хоста peer-а (учесника) - + Strict super seeding Искључиво супер донирање (seeding) - + Network Interface (requires restart) Мрежни интерфејс (захтева рестарт) - + Optional IP Address to bind to (requires restart) - + Listen on IPv6 address (requires restart) - + Display notifications - + Display notifications for added torrents - + Download tracker's favicon - - Save path history length - - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - - - - - Round-robin - - - - - Fastest upload - - - - - Anti-leech - - - - - Upload choking algorithm - - - - + Confirm torrent recheck - - Confirm removal of all tags - - - - - Always announce to all trackers in a tier - - - - - Always announce to all tiers - - - Exchange trackers with other peers Размена претилаца са осталим учесницима + Always announce to all trackers - Увек објави за све пратиоце + Увек објави за све пратиоце - + Any interface i.e. Any network interface Било који мрежни интерфејс - + Save resume data interval How often the fastresume file is saved. - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - - - - + Maximum number of half-open connections [0: Unlimited] - + IP Address to report to trackers (requires restart) IP адресни извештај о пратиоцима (захтева рестарт) - + Enable embedded tracker Омогући уграђени пратилац - + Embedded tracker port Уграђени пратилац порта - + Check for software updates Проверите за надоградњу софтвера - + Use system icon theme Користи тему системских икона @@ -796,120 +593,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started - + Torrent: %1, running external program, command: %2 - - Torrent name: %1 - - - - - Torrent size: %1 - - - - - Save path: %1 - - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - - - - - Thank you for using qBittorrent. - - - - - [qBittorrent] '%1' has finished downloading + + Torrent: %1, run external program command too long (length > %2), execution failed. - + Torrent: %1, sending mail notification - + Information Информације - - To control qBittorrent, access the Web UI at %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 - + The Web UI administrator user name is: %1 - + The Web UI administrator password is still the default one: %1 - + This is a security risk, please consider changing your password from program preferences. - + Saving torrent progress... - - - Portable mode and explicit profile directory options are mutually exclusive - - - - - Portable mode implies relative fastresume - - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Сачувај у: @@ -919,404 +657,342 @@ - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. + + Enable Automated RSS Downloader - + Download Rules - + Rule Definition - + Use Regular Expressions - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - - - - + Must Contain: - + Must Not Contain: - + Episode Filter: - + Assign Category: - + Save to a Different Directory - + Ignore Subsequent Matches for (0 to Disable) ... X days - + Disabled Онемогућен - + days - + Add Paused: - + Use global settings - + Always - + Never Никада - + Apply Rule to Feeds: - + Matching RSS Articles - + &Import... - + &Export... - + Matches articles based on episode filter. - + Example: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match - + Episode filter rules: - + Season number is a mandatory non-zero value - + Filter must end with semicolon - + Three range types for episodes are supported: - + Single number: <b>1x25;</b> matches episode 25 of season one - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one - + Episode number is a mandatory positive value - - Rules + + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - - Rules (legacy) + + Last Match: %1 days ago - - Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons + + Last Match: Unknown - - Last Match: %1 days ago - - - - - Last Match: Unknown - - - - + New rule name Назив новог правила - + Please type the name of the new download rule. - - + + Rule name conflict Конфликт у називу правила - - + + A rule with this name already exists, please choose another name. Правило са овим називом већ постоји, молим изаберите неки други назив. - + Are you sure you want to remove the download rule named '%1'? - + Are you sure you want to remove the selected download rules? Да ли сте сигурни да желите да уклоните изабрана правила преузимања? - + Rule deletion confirmation Потврда брисања - правила - + Destination directory Одредишни директоријум - + Invalid action - Неважећа акција + Неважећа акција - + The list is empty, there is nothing to export. - Листа је празна, не постоји ништа за извоз. - - - - Export RSS rules - - - - - Failed to create the destination file. Reason: %1 - - - - - Import RSS rules - - - - - Failed to open the file. Reason: %1 - - - - - Failed to import the selected rules file. Reason: %1 - + Листа је празна, не постоји ништа за извоз. + Where would you like to save the list? - Где желите да сачувате листу? + Где желите да сачувате листу? + Rules list (*.rssrules) - Листа правила (*.rssrules) + Листа правила (*.rssrules) - - + I/O Error - И/О Грешка + И/О Грешка + Failed to create the destination file - Грешка при креирању циљне датотеке + Грешка при креирању циљне датотеке + Please point to the RSS download rules file - Молим укажите на RSS датотеку са правилима преузимања + Молим укажите на RSS датотеку са правилима преузимања + + + + Rules list + - + Import Error - Грешка при увозу + Грешка при увозу + Failed to import the selected rules file - Грешка при увозу изабране датотеке са правилима + Грешка при увозу изабране датотеке са правилима - + Add new rule... - + Delete rule Обриши правило - + Rename rule... - + Delete selected rules Обриши изабрана правила - - Clear downloaded episodes... - - - - + Rule renaming Преименовање правила - + Please type the new rule name Молим упишите назив за ново правило - - Clear downloaded episodes - - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - - - - - - Position %1: %2 - - - + Regex mode: use Perl-like regular expressions - Regex мод: користи слично Perl-у регуларне изразе + Regex мод: користи слично Perl-у регуларне изразе - + Wildcard mode: you can use - + ? to match any single character - + * to match zero or more of any characters - + Whitespaces count as AND operators (all words, any order) - + | is used as OR operator - + If word order is important use * instead of whitespace. - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - + will match all articles. - + will exclude all articles. @@ -1330,444 +1006,319 @@ - BanListOptions - - Delete - Обриши - - - - BanListOptionsDialog - - - List of banned IP addresses - - - - - Ban IP - - - - - Delete - Обриши - - - - - Warning - - - - - The entered IP address is invalid. - - + BitTorrent::Session - - The entered IP is already banned. + + Restart is required to toggle PeX support - - - BitTorrent::Session - - Restart is required to toggle PeX support + + Embedded Tracker [ON] - - Could not get GUID of configured network interface. Binding to IP %1 + + Failed to start the embedded tracker! - - Embedded Tracker [ON] + + Embedded Tracker [OFF] - - Failed to start the embedded tracker! + + '%1' reached the maximum ratio you set. Removing... - - Embedded Tracker [OFF] + + '%1' reached the maximum ratio you set. Pausing... - + System network status changed to %1 e.g: System network status changed to ONLINE - + ONLINE - + OFFLINE - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. - - + Encryption support [%1] - - + FORCED - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - - - - - + Anonymous mode [%1] - + Unable to decode '%1' torrent file. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' - + Queue positions were corrected in %1 resume files - + Couldn't save '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - - - - + because %1 is disabled. this peer was blocked because uTP is disabled. - + because %1 is disabled. this peer was blocked because TCP is disabled. - + URL seed lookup failed for URL: '%1', message: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 - + The network interface defined is invalid: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 - - Peer ID: - - - - - HTTP User-Agent is '%1' - - - - - + DHT support [%1] - - - - - - - - - + + + + ON - - - - - - - - - + + + + OFF - - + Local Peer Discovery support [%1] - - PeX support [%1] - - - - - '%1' reached the maximum ratio you set. Removed. - - - - - '%1' reached the maximum ratio you set. Paused. - - - - - '%1' reached the maximum seeding time you set. Removed. - - - - - '%1' reached the maximum seeding time you set. Paused. - - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface - + Tracker '%1' was added to torrent '%2' - + Tracker '%1' was deleted from torrent '%2' - + URL seed '%1' was added to torrent '%2' - + URL seed '%1' was removed from torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Error: Failed to parse the provided IP filter. - - '%1' restored. - 'torrent name' restored. + + Couldn't add torrent. Reason: %1 - - Couldn't add torrent. Reason: %1 + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) - + '%1' added to download list. 'torrent name' was added to download list. - + An I/O error occurred, '%1' paused. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 - + due to IP filter. this peer was blocked due to ip filter. - + due to port filter. this peer was blocked due to port filter. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. - + because it has a low port. this peer was blocked because it has a low port. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 - + External IP: %1 e.g. External IP: 192.168.0.1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + File sizes mismatch for torrent '%1', pausing it. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... @@ -1775,17 +1326,17 @@ CategoryFilterModel - + Categories - + All - + Uncategorized @@ -1804,34 +1355,67 @@ - Edit category... - - - - Remove category - + Remove unused categories - + Resume torrents - + Pause torrents - + Delete torrents + + + New Category + + + + + Category: + + + + + Invalid category name + + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + CookiesDialog @@ -1870,82 +1454,34 @@ - DeletionConfirmationDialog - - - Deletion confirmation - - - - - Remember choice - Запамти избор - - - - Also delete the files on the hard disk - Такође избриши датотеке на чврстом диску - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - Додај торент линкове - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - - - - - No URL entered - URL није унет - - - - Please type at least one URL. - Молим упишите најмање један URL. - - - DownloadedPiecesBar - + White: Missing pieces - + Green: Partial pieces - + Blue: Completed pieces @@ -1953,34 +1489,23 @@ ExecutionLog + General - Опште - - - Blocked IPs - Блокирани IP-и - - - - ExecutionLogWidget - - - General - Опште + Опште - + Blocked IPs - Блокирани IP-и + Блокирани IP-и - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> was banned x.y.z.w was banned @@ -1989,583 +1514,520 @@ FeedListWidget - + RSS feeds RSS поруке - - - Unread (%1) - - - + Unread - Непрочитане + Непрочитане FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. + + An error occured while trying to open the log file. Logging to file is disabled. - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - - - - - &Browse... - Launch file dialog button text (full) - - - - - Choose a file - Caption for file open/save dialog - - + FilterParserThread - - Choose a folder - Caption for directory open dialog + + + + I/O Error: Could not open ip filter file in read mode. - - Any file + + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. - FilterParserThread + GeoIPDatabase - - - - I/O Error: Could not open IP filter file in read mode. + + + Unsupported database file size. - - - - IP filter line %1 is malformed. + + Metadata error: '%1' entry not found. - - - IP filter line %1 is malformed. Start IP of the range is malformed. + + Metadata error: '%1' entry has invalid type. - - - IP filter line %1 is malformed. End IP of the range is malformed. + + Unsupported database version: %1.%2 - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! + + Unsupported IP version: %1 - - - IP filter exception thrown for line %1. Exception is: %2 + + Unsupported record size: %1 - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. + + Invalid database type: %1 - - - - - - - - Parsing Error: The filter file is not a valid PeerGuardian P2B file. + + Database corrupted: no data section found. - GeoIPDatabase - - - - Unsupported database file size. - - - - - Metadata error: '%1' entry not found. - - - - - Metadata error: '%1' entry has invalid type. - - - - - Unsupported database version: %1.%2 - - - - - Unsupported IP version: %1 - - - - - Unsupported record size: %1 - - - - - Invalid database type: %1 - - - - - Database corrupted: no data section found. - - - - - Http::Connection - - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - - - - - Bad Http request, closing socket. IP: %s - - - - - HttpServer + HttpServer + File - Фајл + Фајл + Edit - Уреди + Уреди + Help - Помоћ + Помоћ - + Exit qBittorrent - + Only one link per line Само један линк по линији + Download - Преузимање + Преузимање - + Global upload rate limit must be greater than 0 or disabled. - + Global download rate limit must be greater than 0 or disabled. - + Alternative upload rate limit must be greater than 0 or disabled. - + Alternative download rate limit must be greater than 0 or disabled. - + Maximum active downloads must be greater than -1. - + Maximum active uploads must be greater than -1. - + Maximum active torrents must be greater than -1. - + Maximum number of connections limit must be greater than 0 or disabled. Максимални број конекција при лимитирању мора бити већи од 0 или онемогућен. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Максимални број конекција по Торенту при лимитирању мора бити већи од 0 или онемогућен. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Максимални број слотова за слање Торента при лимитирању мора бити већи од 0 или онемогућен. - + Unable to save program preferences, qBittorrent is probably unreachable. Не могу да сачувам програмска подешавања, qBittorrent је вероватно недоступан. - - IRC: #qbittorrent on Freenode - + + Language + Језик - - Invalid category name: -Please do not use any special characters in the category name. + + The port used for incoming connections must be between 1 and 65535. - - Unknown - Непознат-а - - - - Hard Disk + + The port used for the Web UI must be between 1 and 65535. - - Share ratio limit must be between 0 and 9998. + + Unable to log in, qBittorrent is probably unreachable. - - Seeding time limit must be between 0 and 525600 minutes. + + Invalid Username or Password. - Language - Језик - - - - The port used for incoming connections must be between 1 and 65535. + + Password - - The port used for the Web UI must be between 1 and 65535. - + + Login + Логовање - - Unable to log in, qBittorrent is probably unreachable. + + Upload Failed! - - Invalid Username or Password. + + Original authors - - Username + + Upload limit: - - Password + + Download limit: - - Login - Логовање + + Apply + - - Original authors + + Add - - Apply + + Category: - - Add + + Upload Torrents + Upload torrent files to qBittorent using WebUI - Set location + All - Limit upload rate - + Downloading + Преузимање - Limit download rate - + Seeding + Донирање - Rename torrent + Completed - Unable to create category - - - - - Upload Torrents - Upload torrent files to qBittorent using WebUI + Resumed - Downloading - Преузимање + + Paused + Паузиран - Seeding - Донирање + + Active + - Paused - Паузиран + + Inactive + - + Save files to location: - + Cookie: - + Type folder here - + + Run an external program on torrent completion + + + + + Enable bandwidth management (uTP) + + + + + Apply rate limit to uTP connections + + + + + Alternative Global Rate Limits + + + + More information - + Information about certificates - + Save Files to - + + Watch Folder + + + + + Default Folder + + + + + from + from time1 to time2 + + + + + to + from time1 to time2 + + + + Other... Save Files to: Watch Folder / Default Folder / Other... + Every day Schedule the use of alternative rate limits on ... - Сваки дан + Сваки дан - + + Week days + Schedule the use of alternative rate limits on ... + + + + + Week ends + Schedule the use of alternative rate limits on ... + + + + Monday Schedule the use of alternative rate limits on ... - + Tuesday Schedule the use of alternative rate limits on ... - + Wednesday Schedule the use of alternative rate limits on ... - + Thursday Schedule the use of alternative rate limits on ... - + Friday Schedule the use of alternative rate limits on ... - + Saturday Schedule the use of alternative rate limits on ... - + Sunday Schedule the use of alternative rate limits on ... + Downloaded Is the file downloaded or not? - Преузет + Преузет - + Logout - + + Download from URLs + + + + Download Torrents from their URLs or Magnet links - + Upload local torrent - + Are you sure you want to delete the selected torrents from the transfer list? - + Save Сачувај - + qBittorrent client is not reachable qBittorrent клијент није доступан + HTTP Server - HTTP Сервер + HTTP Сервер + The following parameters are supported: - Следећи параметри су подржани: + Следећи параметри су подржани: + Torrent path - Путања Трента + Путања Трента + Torrent name - Име Торента + Име Торента - + qBittorrent has been shutdown. - IPSubnetWhitelistOptionsDialog + LineEdit - - List of whitelisted IP subnets - + + Clear the text + Обриши текст + + + LogListWidget - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - + + Copy + Копирај - - Add subnet + + Clear - - - Delete - Обриши - - - - Error - - - - - The entered subnet is invalid. - - - - - LineEdit - - Clear the text - Обриши текст - - - - LogListWidget - - - Copy - Копирај - - - - Clear - - - - - MainWindow + + + MainWindow &Edit @@ -2592,550 +2054,491 @@ - + &View &Изглед - + &Options... &Опције... - + &Resume &Настави - + Torrent &Creator - + Set Upload Limit... - + Set Download Limit... - + Set Global Download Limit... - + Set Global Upload Limit... - + Minimum Priority - + Top Priority - + Decrease Priority - + Increase Priority - - + + Alternative Speed Limits - + &Top Toolbar - + Display Top Toolbar - - Status &Bar - - - - + S&peed in Title Bar - + Show Transfer Speed in Title Bar - + &RSS Reader - + Search &Engine - + L&ock qBittorrent - + Do&nate! - - Close Window - - - - + R&esume All Н&астави Све - + Manage Cookies... - + Manage stored network cookies - + Normal Messages - + Information Messages - + Warning Messages - + Critical Messages - + &Log - + &Exit qBittorrent - + &Suspend System - + &Hibernate System - + S&hutdown System - + &Disabled - + &Statistics - + Check for Updates - + Check for Program Updates - + &About &О програму - + &Pause &Пауза - + &Delete &Обриши - + P&ause All П&аузирај све - + &Add Torrent File... - + Open - + E&xit - + Open URL - + &Documentation &Документација - + Lock - - - + + + Show Прикажи - + Check for program updates - + Add Torrent &Link... - + If you like qBittorrent, please donate! Ако волите qBittorrent, молимо Вас донирајте! - - + Execution Log Дневник догађаја - + Clear the password - + Filter torrent list... - + &Set Password - - Preferences - - - - + &Clear Password - + Transfers Трансфери - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Асоцириње Торент фајла - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent није подразумевана апликација за отварање Торент фајлова или Magnet линкова. Да ли желите да асоцирате qBittorrent за Торент фајлове и Magnet линкове? - + Icons Only - + Text Only - + Text Alongside Icons - + Text Under Icons - + Follow System Style - - - + + + UI lock password Закључавање КИ-а лозинком - - - + + + Please type the UI lock password: Молим упишите лозинку закључавања КИ-а: - + The password should contain at least 3 characters Лозинка мора имати најмање 3 карактера - + Password update Обнављање лозинке - + The UI lock password has been successfully updated Закључавање КИ-а лозинком је успешно обновљено - + Are you sure you want to clear the password? - - Use regular expressions - - - - + Search Претраживање - + Transfers (%1) Трансфери (%1) - + Error - + Failed to add torrent: %1 - + Torrent added - + '%1' was added. e.g: xxx.avi was added. - + Download completion Комплетно преузет - + I/O Error i.e: Input/Output Error И/О Грешка - + Recursive download confirmation Потврда поновног преузимања - + Yes Да - + No Не - + Never Никада - + Global Upload Speed Limit Општи лимит брзине слања - + Global Download Speed Limit Општи лимит брзине преузимања - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent је управо ажуриран и треба бити рестартован, да би' промене имале ефекта. - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - - - - - Are you sure you want to quit qBittorrent? - - - - + &No &Не - + &Yes &Да - + &Always Yes - - %1/s - s is a shorthand for seconds - - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - + qBittorrent Update Available - + + A new version is available. +Do you want to download %1? + + + + Already Using the Latest qBittorrent Version - + Undetermined Python version - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -3143,161 +2546,151 @@ - + The torrent '%1' contains torrent files, do you want to proceed with their download? - + Couldn't download file at URL '%1', reason: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - - + + Couldn't determine your Python version (%1). Search engine disabled. + + + + + Missing Python Interpreter - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? - + Python is required to use the search engine but it does not seem to be installed. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. - + &Check for Updates - + Checking for Updates... - + Already checking for program updates in the background - + Python found in '%1' - + Download error Грешка преузимања - + Python setup could not be downloaded, reason: %1. Please install it manually. - - + + Invalid password Погрешна лозинка - - - + + RSS (%1) - + URL download error - + The password is invalid Лозинка је погрешна - - + + DL speed: %1 e.g: Download speed: 10 KiB/s - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version - + Hide Сакриј - + Exiting qBittorrent Излазак из qBittorrent-а + Some files are currently transferring. Are you sure you want to quit qBittorrent? - Неки фајлови се тренутно преносе. + Неки фајлови се тренутно преносе. Да ли сте сигурни да желите да прекинете qBittorrent? - + Open Torrent Files Отвори Торент фајлове - + Torrent Files Торент Фајлови - + Options were saved successfully. Опције када је сачуван успешно. @@ -3305,52 +2698,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. - + Dynamic DNS error: hostname supplied does not exist under specified account. - + Dynamic DNS error: Invalid username/password. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. - + Dynamic DNS error: supplied domain name is invalid. - + Dynamic DNS error: supplied username is too short. - + Dynamic DNS error: supplied password is too short. @@ -3358,1413 +2751,1303 @@ Net::DownloadHandler - + I/O Error И/О Грешка - + The file size is %1. It exceeds the download limit of %2. - + Unexpected redirect to magnet URI. - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. - - + + Couldn't load GeoIP database. Reason: %1 - + Venezuela, Bolivarian Republic of - + Viet Nam - - + + N/A - + Andorra - + United Arab Emirates - + Afghanistan - + Antigua and Barbuda - + Anguilla - + Albania - + Armenia - + Angola - + Antarctica - + Argentina - + American Samoa - + Austria - + Australia - + Aruba - + Azerbaijan - + Bosnia and Herzegovina - + Barbados - + Bangladesh - + Belgium - + Burkina Faso - + Bulgaria - + Bahrain - + Burundi - + Benin - + Bermuda - + Brunei Darussalam - + Brazil - + Bahamas - + Bhutan - + Bouvet Island - + Botswana - + Belarus - + Belize - + Canada - + Cocos (Keeling) Islands - + Congo, The Democratic Republic of the - + Central African Republic - + Congo - + Switzerland - + Cook Islands - + Chile - + Cameroon - + China - + Colombia - + Costa Rica - + Cuba - + Cape Verde - + Curacao - + Christmas Island - + Cyprus - + Czech Republic - + Germany - + Djibouti - + Denmark - + Dominica - + Dominican Republic - + Algeria - + Ecuador - + Estonia - + Egypt - + Western Sahara - + Eritrea - + Spain - + Ethiopia - + Finland - + Fiji - + Falkland Islands (Malvinas) - + Micronesia, Federated States of - + Faroe Islands - + France Француска - + Gabon - + United Kingdom - + Grenada - + Georgia - + French Guiana - + Ghana - + Gibraltar - + Greenland - + Gambia - + Guinea - + Guadeloupe - + Equatorial Guinea - + Greece - + South Georgia and the South Sandwich Islands - + Guatemala - + Guam - + Guinea-Bissau - + Guyana - + Hong Kong - + Heard Island and McDonald Islands - + Honduras - + Croatia - + Haiti - + Hungary - + Indonesia - + Ireland - + Israel - + India - + British Indian Ocean Territory - + Iraq - + Iran, Islamic Republic of - + Iceland - + Italy - + Jamaica - + Jordan - + Japan - + Kenya - + Kyrgyzstan - + Cambodia - + Kiribati - + Comoros - + Saint Kitts and Nevis - + Korea, Democratic People's Republic of - + Korea, Republic of - + Kuwait - + Cayman Islands - + Kazakhstan - + Lao People's Democratic Republic - + Lebanon - + Saint Lucia - + Liechtenstein - + Sri Lanka - + Liberia - + Lesotho - + Lithuania - + Luxembourg - + Latvia - + Morocco - + Monaco - + Moldova, Republic of - + Madagascar - + Marshall Islands - + Mali - + Myanmar - + Mongolia - + Northern Mariana Islands - + Martinique - + Mauritania - + Montserrat - + Malta - + Mauritius - + Maldives - + Malawi - + Mexico - + Malaysia - + Mozambique - + Namibia - + New Caledonia - + Niger - + Norfolk Island - + Nigeria - + Nicaragua - + Netherlands - + Norway - + Nepal - + Nauru - + Niue - + New Zealand - + Oman - + Panama - + Peru - + French Polynesia - + Papua New Guinea - + Philippines - + Pakistan - + Poland - + Saint Pierre and Miquelon - + Puerto Rico - + Portugal - + Palau - + Paraguay - + Qatar - + Reunion - + Romania - + Russian Federation - + Rwanda - + Saudi Arabia - + Solomon Islands - + Seychelles - + Sudan - + Sweden - + Singapore - + Slovenia - + Svalbard and Jan Mayen - + Slovakia - + Sierra Leone - + San Marino - + Senegal - + Somalia - + Suriname - + Sao Tome and Principe - + El Salvador - + Syrian Arab Republic - + Swaziland - + Turks and Caicos Islands - + Chad - + French Southern Territories - + Togo - + Thailand - + Tajikistan - + Tokelau - + Turkmenistan - + Tunisia - + Tonga - - Could not decompress GeoIP database file. - - - - + Timor-Leste - + Bolivia, Plurinational State of - + Bonaire, Sint Eustatius and Saba - + Cote d'Ivoire - + Libya - + Saint Martin (French part) - + Macedonia, The Former Yugoslav Republic of - + Macao - + Pitcairn - + Palestine, State of - + Saint Helena, Ascension and Tristan da Cunha - + South Sudan - + Sint Maarten (Dutch part) - + Turkey - + Trinidad and Tobago - + Tuvalu - + Taiwan - + Tanzania, United Republic of - + Ukraine - + Uganda - + United States Minor Outlying Islands - + United States - + Uruguay - + Uzbekistan - + Holy See (Vatican City State) - + Saint Vincent and the Grenadines - + Virgin Islands, British - + Virgin Islands, U.S. - + Vanuatu - + Wallis and Futuna - + Samoa - + Yemen - + Mayotte - + Serbia - + South Africa - + Zambia - + Montenegro - + Zimbabwe - + Aland Islands - + Guernsey - + Isle of Man - + Jersey - + Saint Barthelemy - + + Could not uncompress GeoIP database file. + + + + Couldn't save downloaded GeoIP database file. - + Successfully updated GeoIP database. - + Couldn't download GeoIP database file. Reason: %1 @@ -4772,12 +4055,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] - + UPnP / NAT-PMP support [OFF] @@ -4785,7 +4068,7 @@ Net::Smtp - + Email Notification Error: @@ -4793,1325 +4076,1077 @@ OptionsDialog - + Options Опције - + Behavior Понашање - + Downloads Преузимање - + Connection Конекције - + Speed Брзина - + BitTorrent Бит-торент - - RSS - - - - + Web UI Веб КИ - + Advanced Напредно - + Language Језик - + User Interface Language: Кориснички интерфејс Језик: - + (Requires restart) (Захтева рестарт) - + Transfer List Трансфер листа - + Confirm when deleting torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. Користи различите боје за приказ редова - + Hide zero and infinity values - + Always - + Paused torrents only - + Action on double-click Дејство при двоструком клику - + Downloading torrents: Преузимање торента: - - + + Start / Stop Torrent Старт / Стоп Торент - - + + Open destination folder Отвори одредишну фасциклу - - + + No action Без дејства - + Completed torrents: Завршени торенти: - + Desktop Радна површина - + Start qBittorrent on Windows start up - + Show splash screen on start up Прикажи уводни екран при пократању - + Start qBittorrent minimized Стартуј qBittorrent минимизовано - + Confirmation on exit when torrents are active - + Confirmation on auto-exit when downloads finish - - Inhibit system sleep when torrents are downloading - + + Show qBittorrent in notification area + Прикажи qBittorrent на системској палети - - Inhibit system sleep when torrents are seeding - + + Minimize qBittorrent to notification area + Минимизуј qBittorrent на системску палету - - KiB - + + Close qBittorrent to notification area + i.e: The systray tray icon will still be visible when closing the main window. + Затвори qBittorrent на системску палету - - Enable recursive download dialog - + + Tray icon style: + Изглед системске иконе: - - Email notification &upon download completion - + + Normal + Нормалан - - Run e&xternal program on torrent completion - + + Monochrome (Dark theme) + Једнобојан (Тамна тема) - - Enabled protocol: - + + Monochrome (Light theme) + Једнобојан (Светла тема) - - TCP and μTP - + + File association + Асоцириње фајлова - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - + + Use qBittorrent for .torrent files + Користи qBittorrent за .torrent фајлове - - IP Fi&ltering - + + Use qBittorrent for magnet links + Користи qBittorrent за магнет линкове - - - - - - - KiB/s - + + Power Management + Управљање напајањем + + + + Inhibit system sleep when torrents are active + Спречи стање мировања када су торенти активни - - Schedule &the use of alternative rate limits + + Log file - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + + Save path: - - &Torrent Queueing + + Backup the log file after: - - Seed torrents until their seeding time reaches + + MB - - A&utomatically add these trackers to new downloads: + + Delete backup logs older than: - - RSS Reader + + days + Delete backup logs older than 10 months - - Enable fetching RSS feeds + + months + Delete backup logs older than 10 months - - Feeds refresh interval: + + years + Delete backup logs older than 10 years - - Maximum number of articles per feed: - Максимални број чланака по допису: + + When adding a torrent + Када додајете неки торент - - - min - minutes - + + Display torrent content and some options + Прикажи садржај торента и неке опције - - Upload rate threshold: + + Bring torrent dialog to the front - - Download rate threshold: - + + Do not start the download automatically + The torrent will be added to download list in pause state + Немој аутоматски да стартујеш преузимање - - sec - seconds + + Should the .torrent file be deleted after adding it - - Torrent inactivity timer: + + Delete .torrent files afterwards - - RSS Torrent Auto Downloader + + Also delete .torrent files whose addition was cancelled - - Enable auto downloading of RSS torrents + + Also when addition is cancelled - - Edit auto downloading rules... + + Warning! Data loss possible! - - RSS Smart Episode Filters + + Saving Management - - Web User Interface (Remote control) + + Default Torrent Management Mode: - - IP address: + + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. + + Manual - - Server domains: + + Automatic - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - - - - - &Use HTTPS instead of HTTP - - - - - Bypass authentication for clients on localhost - - - - - Bypass authentication for clients in whitelisted IP subnets - - - - - IP subnet whitelist... - - - - - Use alternative Web UI - - - - - Files location: - - - - - Enable clickjacking protection - - - - - Enable Cross-Site Request Forgery (CSRF) protection - - - - - Upda&te my dynamic domain name - - - - Show qBittorrent in notification area - Прикажи qBittorrent на системској палети - - - - Minimize qBittorrent to notification area - Минимизуј qBittorrent на системску палету - - - - Close qBittorrent to notification area - i.e: The systray tray icon will still be visible when closing the main window. - Затвори qBittorrent на системску палету - - - - Tray icon style: - Изглед системске иконе: - - - - Normal - Нормалан - - - - Monochrome (Dark theme) - Једнобојан (Тамна тема) - - - - Monochrome (Light theme) - Једнобојан (Светла тема) - - - - File association - Асоцириње фајлова - - - - Use qBittorrent for .torrent files - Користи qBittorrent за .torrent фајлове - - - - Use qBittorrent for magnet links - Користи qBittorrent за магнет линкове - - - - Power Management - Управљање напајањем - - - Inhibit system sleep when torrents are active - Спречи стање мировања када су торенти активни - - - - Save path: - - - - - Backup the log file after: - - - - - Delete backup logs older than: - - - - - days - Delete backup logs older than 10 months - - - - - months - Delete backup logs older than 10 months - - - - - years - Delete backup logs older than 10 years - - - - - When adding a torrent - Када додајете неки торент - - - Display torrent content and some options - Прикажи садржај торента и неке опције - - - - Bring torrent dialog to the front - - - - - Do not start the download automatically - The torrent will be added to download list in pause state - Немој аутоматски да стартујеш преузимање - - - - Should the .torrent file be deleted after adding it - - - - - Also delete .torrent files whose addition was cancelled - - - - - Also when addition is cancelled - - - - - Warning! Data loss possible! - - - - - Saving Management - - - - - Default Torrent Management Mode: - - - - - Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - - - - - Manual - - - - - Automatic - - - - + When Torrent Category changed: - + Relocate torrent - + Switch torrent to Manual Mode - + When Default Save Path changed: - - + + Relocate affected torrents - - + + Switch affected torrents to Manual Mode - + When Category changed: - + Use Subcategories - + Default Save Path: - + Keep incomplete torrents in: Задржи некомплетне торенте у: - + Copy .torrent files to: Копирај .torrent фајлове у: - - Show &qBittorrent in notification area - - - - - &Log file - - - - - Display &torrent content and some options - - - - - Create subfolder for torrents with multiple files - - - - - De&lete .torrent files afterwards - - - - + Copy .torrent files for finished downloads to: - + Pre-allocate disk space for all files Додели простор на диску за све фајлове - + Append .!qB extension to incomplete files Додај .!qB екстензију у некомплетне фајлове - + Automatically add torrents from: Аутоматски додај торенте из: - + Add entry - + Remove entry + Email notification upon download completion - Обавештење Е-поштом након комплетног преузимања + Обавештење Е-поштом након комплетног преузимања + Destination email: - Адреса за Е-пошту: + Адреса за Е-пошту: - + SMTP server: SMTP сервер: - + This server requires a secure connection (SSL) Овај сервер захтева безбедну конекцију (SSL) - - + + + Authentication Аутентификација - - - - + + + + Username: Корисничко име: - - - - + + + + Password: Лозинка: - + + Run external program on torrent completion + + + + Listening Port Пријемни порт - + Port used for incoming connections: Порт коришћен за долазне конекције: - + Random Случајан - + Use UPnP / NAT-PMP port forwarding from my router Користи UPnP / NAT-PMP преусмерење порта са мог рутера - + Use different port on each startup - + Connections Limits Конекциона ограничења - + Maximum number of connections per torrent: Максимални број конекција по торенту: - + Global maximum number of connections: Општи максимални број конекција: - + Maximum number of upload slots per torrent: Максимални број слотова за слање по торенту: - + Global maximum number of upload slots: - + Proxy Server Прокси сервер - + Type: Тип: - + (None) (Ниједан) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Домаћин: - - + + Port: Порт: - + Otherwise, the proxy server is only used for tracker connections У супротном, прокси сервер се једино користи за конекције tracker-а(пратилаца) - + Use proxy for peer connections Користи прокси за peer(учесничке) конекције - + Disable connections not supported by proxies - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - + Use proxy only for torrents - - A&uthentication - - - - + Info: The password is saved unencrypted + IP Filtering - IP Филтрирање + IP Филтрирање - + Filter path (.dat, .p2p, .p2b): Филтер, путања фајла (.dat, .p2p, .p2b): - + Reload the filter Поново учитај филтер - - Manually banned IP addresses... - - - - + Apply to trackers - + Global Rate Limits Општа вредност ограничења - - + + Upload: Слање: + + + + KiB/s - KiB/s + KiB/s - - + + Download: Преузимање: - + Alternative Rate Limits + Schedule the use of alternative rate limits - Распоред коришћења алтернативног ограничења брзине + Распоред коришћења алтернативног ограничења брзине - - + From: from (time1 to time2) - - + To: time1 to time2 - + When: Када: - + Every day Сваки дан - + Weekdays - + Weekends - + Rate Limits Settings - + Apply rate limit to peers on LAN - + Apply rate limit to transport overhead Примени ведносна ограничења код прекорачење преноса - - + + + Enable µTP protocol + + + + Apply rate limit to µTP protocol - + Privacy Приватност - + Enable DHT (decentralized network) to find more peers Омогући DHT (децентализовану мрежу) за налажење додатних учесника - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Размењуј peer-ове са компатибилним Bittorrent клијентима (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers Омогући Peer Exchange (PeX) за налажење додатних учесника - + Look for peers on your local network Потражите peer-ове на вашој локалној мрежи - + Enable Local Peer Discovery to find more peers Омогући откривање локалних веза за налажење додатних учесника - + Encryption mode: Режим шифровања: - + Prefer encryption Предложи шифровање - + Require encryption Захтевај шифровање - + Disable encryption Онемогући шифровање - + Enable when using a proxy or a VPN connection - + Enable anonymous mode Омогући анонимни начин рада + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + + + + Torrent Queueing - Опслуживање Торета + Опслуживање Торета - + Maximum active downloads: Максимум активних преузимања: - + Maximum active uploads: Максимум активних слања: - + Maximum active torrents: Максимум активних торента: - + Do not count slow torrents in these limits Не вреднуј споре торенте у овим ограничењима - + Share Ratio Limiting Ограничење индекса дељења - + Seed torrents until their ratio reaches Донирај торенте док не достигнеш тражени ниво - + then затим - + Pause them Паузирај их - + Remove them Уклони их + + Automatically add these trackers to new downloads: + + + + Enable Web User Interface (Remote control) - Омогући Веб Кориснички Интерфејс (Даљински приступ) + Омогући Веб Кориснички Интерфејс (Даљински приступ) - + Use UPnP / NAT-PMP to forward the port from my router Користи UPnP / NAT-PMP преусмерење порта са мог рутера + Use HTTPS instead of HTTP - Користи HTTPS уместо HTTP + Користи HTTPS уместо HTTP - + Certificate: Сертификат: - + Import SSL Certificate Увоз SSL сертификата - + Key: Кључ: - + Import SSL Key Увоз SSL кључа - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> + Bypass authentication for localhost - Заобиђи аутентификацију за localhost-а + Заобиђи аутентификацију за localhost-а + Update my dynamic domain name - Обнови име мог динамичког домена + Обнови име мог динамичког домена - + Service: Сервис: - + Register Регистар - + Domain name: Име домена: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): - + %N: Torrent name - + %L: Category - - %G: Tags (seperated by comma) - - - - + %F: Content path (same as root path for multifile torrent) - + %R: Root path (first torrent subdirectory path) - + %D: Save path - + %C: Number of files - + %Z: Torrent size (bytes) - + %T: Current tracker - + %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor - + Folder is already being monitored: - + Folder does not exist: - + Folder is not readable: - + Adding entry failed - - - - + + Choose export directory Изаберите директоријум за извоз - - - + + + + + + Choose a save directory Изаберите директоријум за чување - + Choose an IP filter file - + All supported filters - + SSL Certificate - + + SSL Key + + + + Parsing error Анализа грешака - + Failed to parse the provided IP filter Неспешна анализа датог IP филтера - + Successfully refreshed Успешно обновљен - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Invalid key Погрешан кључ - + This is not a valid SSL key. Ово није валидан SSL кључ. - + Invalid certificate Неважећи сертификат - - Preferences - - - - - Import SSL certificate - - - - + This is not a valid SSL certificate. Ово није валидан SSL сертификат. - - Import SSL key - - - - - SSL key - - - - + Time Error - + The start time and the end time can't be the same. - - + + Length Error - + The Web UI username must be at least 3 characters long. - + The Web UI password must be at least 6 characters long. @@ -6119,72 +5154,72 @@ PeerInfo - - Interested(local) and Choked(peer) + + interested(local) and choked(peer) - + interested(local) and unchoked(peer) - + interested(peer) and choked(local) - + interested(peer) and unchoked(local) - + optimistic unchoke - + peer snubbed - + incoming connection - + not interested(local) and unchoked(peer) - + not interested(peer) and unchoked(local) - + peer from PEX - + peer from DHT - + encrypted traffic - + encrypted handshake - + peer from LSD @@ -6192,180 +5227,165 @@ PeerListWidget - + IP IP - + Port - + Flags - + Connection Конекције - + Client i.e.: Client application Клијент - + Progress i.e: % downloaded Напредак - + Down Speed i.e: Download speed Брзина Преузимања - + Up Speed i.e: Upload speed Брзина Слања - + Downloaded i.e: total data downloaded Преузето - + Uploaded i.e: total data uploaded Послато - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. - + Files i.e. files that are being downloaded right now - + Column visibility Прегледност колона - + Add a new peer... Додај нов peer (учесник-а)... - - + + Ban peer permanently Забрани(бануј) peer трајно - + Manually adding peer '%1'... - + The peer '%1' could not be added to this torrent. - + Manually banning peer '%1'... - - + + Peer addition Додавање (peer-a) учесника - + Country - + Copy IP:port - + Some peers could not be added. Check the Log for details. - + The peers were added to this torrent. - + Are you sure you want to ban permanently the selected peers? Да ли сте сигурни да желите да забраните изабране учеснике трајно? - + &Yes &Да - + &No &Не - PeersAdditionDialog + PeersAdditionDlg - - Add Peers + + No peer entered - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - - - - No peer entered - - - - + Please type at least one peer. - + Invalid peer - + The peer '%1' is invalid. @@ -6373,12 +5393,12 @@ PieceAvailabilityBar - + White: Unavailable pieces - + Blue: Available pieces @@ -6386,248 +5406,223 @@ PiecesBar - + Files in this piece: - + File in this piece - + File in these pieces - - Wait until metadata become available to see detailed information - - - - + Hold Shift key for detailed information - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Installed search plugins: - + Name Име - + Version - + Url - - + + Enabled - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Check for updates - + Close - + Uninstall - - - + + + Yes Да - - - - + + + + No Не - + Uninstall warning - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Uninstall success - + All selected plugins were uninstalled successfully - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - - - - - + + New search engine plugin URL - - + + URL: - + Invalid link - + The link doesn't seem to point to a search engine plugin. - + Select search plugins - + qBittorrent search plugin - + + + + Search plugin update + + + + All your plugins are already up to date. - + Sorry, couldn't check for plugin updates. %1 - + + + Search plugin install - - Couldn't install "%1" search engine plugin. %2 + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine - - Couldn't update "%1" search engine plugin. %2 + + Couldn't install "%1" search engine plugin. %2 - - - PluginSelectDlg - - Name - Име - - Yes - Да + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + - No - Не + + Couldn't update "%1" search engine plugin. %2 + - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Search plugin source: - + Local file - + Web link - PowerManagement - - - qBittorrent is active - - - - Preferences Downloads @@ -6778,7 +5773,7 @@ Every day Сваки дан - + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Размењуј peer-ове са компатибилним Bittorrent клијентима (µTorrent, Vuze, ...) @@ -7080,130 +6075,69 @@ PreviewSelect + Name - Име - - - Size - Величина - - - Progress - Напредак - - - Preview impossible - Приказ немогућ - - - Sorry, we can't preview this file - Жалим не могу да прикажем овај фајл - - - - PreviewSelectDialog - - - Preview - Прикажи - - - - Name - Име + Име - + Size - Величина + Величина - + Progress - Напредак + Напредак - - + + Preview impossible - Приказ немогућ + Приказ немогућ - - + + Sorry, we can't preview this file - Жалим не могу да прикажем овај фајл - - - - Private::FileLineEdit - - - '%1' does not exist - - - - - '%1' does not point to a directory - - - - - '%1' does not point to a file - - - - - Does not have read permission in '%1' - - - - - Does not have write permission in '%1' - + Жалим не могу да прикажем овај фајл PropListDelegate - + Not downloaded Не преузимај - - + + Normal Normal (priority) Нормалан - - N/A - - - - + Do not download Do not download (priority) Не преузимај - - + + High High (priority) Висок - + Mixed Mixed (priorities Комбинован - - + + Maximum Maximum (priority) Максималан @@ -7212,32 +6146,32 @@ PropTabBar - + General Опште - + Trackers Пратиоци - + Peers Peers (учесници) - + HTTP Sources HTTP извори - + Content Садржај - + Speed Брзина @@ -7331,22 +6265,22 @@ Коментар: - + Select All Селектуј све - + Select None Деселектуј - + Normal Нормалан - + High Висок @@ -7406,177 +6340,165 @@ - + Maximum Максималан + - Do not download Не преузимај - + Never Никада - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) - - + + %1 (%2 this session) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) - + Open - + Open Containing Folder - + Rename... Преименуј... - + Priority Приоритет - + New Web seed - + Remove Web seed - + Copy Web seed URL - + Edit Web seed URL + Rename the file - Преименуј фајл + Преименуј фајл - + New name: Ново име: + + The file could not be renamed - Фајл не може бити преименован + Фајл не може бити преименован + This file name contains forbidden characters, please choose a different one. - Ово име фајла садржи недозвољене карактере, молим изаберите неко друго. + Ово име фајла садржи недозвољене карактере, молим изаберите неко друго. - - + + This name is already in use in this folder. Please use a different name. Ово име је већ у употреби молим изаберите неко друго. - + The folder could not be renamed Фолдер не може бити преименован - + qBittorrent qBittorrent - + Filter files... - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - - - - + New URL seed New HTTP source - + New URL seed: - - + + This URL seed is already in the list. - + Web seed editing - + Web seed URL: @@ -7584,716 +6506,548 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + + + + + Error: '%1' is not a valid torrent file. + + + + + + Error: Could not add torrent to session. + + + + + I/O Error: Could not create temporary file. + + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. - - + + %1 must be the single command line parameter. - + + %1 must specify the correct port (1 to 65535). + + + + You cannot use %1: qBittorrent is already running for this user. - + Usage: - + Options: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' + + Displays program version - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' + + Displays this help message - - Expected integer number in environment variable '%1', but got '%2' + + Changes the Web UI port (current: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' + + Disable splash screen - - Expected %1 in environment variable '%2', but got '%3' + + Run in daemon-mode (background) - - port + + Downloads the torrents passed by the user - - %1 must specify a valid port (1 to 65535). - + + Help + Помоћ - - Display program version and exit + + Run application with -h option to read about command line parameters. - - Display this help message and exit + + Bad command line - - Change the Web UI port + + Bad command line: - - Disable splash screen + + Legal Notice - - Run in daemon-mode (background) + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. - - dir - Use appropriate short form or abbreviation of "directory" + + Press %1 key to accept and continue... - - Store configuration files in <dir> + + Legal notice - - - name + + Cancel + Откажи + + + + I Agree - - Store configuration files in directories qBittorrent_<name> + + Torrent name: %1 - - Hack into libtorrent fastresume files and make file paths relative to the profile directory + + Torrent size: %1 - - files or URLs + + Save path: %1 - - Download the torrents passed by the user + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. + + Thank you for using qBittorrent. - - Options when adding new torrents: + + [qBittorrent] '%1' has finished downloading - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume + + The remote host name was not found (invalid hostname) - - path + + The operation was canceled - - Torrent save path + + The remote server closed the connection prematurely, before the entire reply was received and processed - - Add torrents as started or paused + + The connection to the remote server timed out - - Skip hash check + + SSL/TLS handshake failed - - Assign torrents to category. If the category doesn't exist, it will be created. + + The remote server refused the connection - - Download files in sequential order + + The connection to the proxy server was refused - - Download first and last pieces first + + The proxy server closed the connection prematurely - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: + + The proxy host name was not found - - Command line parameters take precedence over environment variables + + The connection to the proxy timed out or the proxy did not reply in time to the request sent - - Help - Помоћ + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + - - Run application with -h option to read about command line parameters. + + The access to the remote content was denied (401) - - Bad command line + + The operation requested on the remote content is not permitted - - Bad command line: + + The remote content was not found at the server (404) - - Legal Notice + + The remote server requires authentication to serve the content but the credentials provided were not accepted - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + + The Network Access API cannot honor the request because the protocol is not known - - No further notices will be issued. + + The requested operation is invalid for this protocol - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. + + An unknown network-related error was detected - - Press %1 key to accept and continue... + + An unknown proxy-related error was detected - - Legal notice + + An unknown error related to the remote content was detected - - Cancel - Откажи + + A breakdown in protocol was detected + - - I Agree + + Unknown error - - + + Upgrade - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - + Couldn't migrate torrent with hash: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 + + Detected unclean program exit. Using fallback file to restore settings. - + An access error occurred while trying to write the configuration file. - + A format error occurred while trying to write the configuration file. - - - An unknown error occurred while trying to write the configuration file. - - RSS + Search - Претраживање + Претраживање + New subscription - Нови допис + Нови допис + + + Mark items read - Означи прочитане ставке + Означи прочитане ставке + Update all - Ажурирај све + Ажурирај све + RSS Downloader... - RSS преузимач порука... + RSS преузимач порука... + Settings... - Подешавања... + Подешавања... + + + + Torrents: (double-click to download) + + + Delete - Обриши + Обриши + Rename... - Преименуј... + Преименуј... + Rename - Преименуј + Преименуј + + Update - Ажурирај + Ажурирај + New subscription... - Нови допис... + Нови допис... + + Update all feeds - Ажурирај све поруке + Ажурирај све поруке + Download torrent - Преузми Торент + Преузми Торент + Open news URL - Отвори новости URL + Отвори новости URL + Copy feed URL - Копирај feed URL + Копирај feed URL + New folder... - Нова фасцикла... + Нова фасцикла... + Refresh RSS streams - Освежи RSS токове података + Освежи RSS токове података - RSS::AutoDownloader + RSSImp - - - Invalid data format. - + + Stream URL: + Ток података URL: - - Couldn't save RSS AutoDownloader data in %1. Error: %2 + + Please type a RSS stream URL - - Invalid data format + + This RSS feed is already in the list. - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - + + Please choose a folder name + Молим изаберите име фасцикле - - Couldn't load RSS AutoDownloader rules. Reason: %1 - + + Folder name: + Име фасцикле: - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - + + New folder + Нова фасцикла - - RSS feed at '%1' updated. Added %2 new articles. + + Deletion confirmation - - Failed to parse RSS feed at '%1'. Reason: %2 + + Are you sure you want to delete the selected RSS feeds? - - Couldn't read RSS Session data from %1. Error: %2 - + + Please choose a new name for this RSS feed + Молим изаберит ново име за овај RSS допис - - Couldn't parse RSS Session data. Error: %1 - + + New feed name: + Ново feed име: - - Couldn't load RSS Session data. Invalid data format. - - - - - Couldn't load RSS article '%1#%2'. Invalid data format. - - - - - RSS::Private::Parser - - - Invalid RSS feed. - - - - - %1 (line: %2, column: %3, offset: %4). - - - - - RSS::Session - - - RSS feed with given URL already exists: %1. - - - - - Cannot move root folder. - - - - - - Item doesn't exist: %1. - - - - - Cannot delete root folder. - - - - - Incorrect RSS Item path: %1. - - - - - RSS item with given path already exists: %1. - - - - - Parent folder doesn't exist: %1. - - - - - RSSImp - - Stream URL: - Ток података URL: - - - Please choose a folder name - Молим изаберите име фасцикле - - - Folder name: - Име фасцикле: - - - New folder - Нова фасцикла - - - Please choose a new name for this RSS feed - Молим изаберит ново име за овај RSS допис - - - New feed name: - Ново feed име: - - - Name already in use - Име је већ у употреби + + Name already in use + Име је већ у употреби + This name is already used by another item, please choose another one. - Ово име је већ у употреби молим изаберите неко друго. + Ово име је већ у употреби молим изаберите неко друго. + Date: - Датум: + Датум: + Author: - Аутор: + Аутор: + Unread - Непрочитан + Непрочитан - RSSWidget - - - Search - Претраживање - - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - - - - - New subscription - Нови допис - - - - - - Mark items read - Означи прочитане ставке - - - - Refresh RSS streams - Освежи RSS токове података - - - - Update all - Ажурирај све - - - - RSS Downloader... - RSS преузимач порука... - - - - Torrents: (double-click to download) - - - - - - Delete - Обриши - - - - Rename... - Преименуј... - - - - Rename - Преименуј - - - - - Update - Ажурирај - - - - New subscription... - Нови допис... - - - - - Update all feeds - Ажурирај све поруке - - - - Download torrent - Преузми Торент - - - - Open news URL - Отвори новости URL - - - - Copy feed URL - Копирај feed URL - - - - New folder... - Нова фасцикла... - - - - Please choose a folder name - Молим изаберите име фасцикле - - - - Folder name: - Име фасцикле: - - - - New folder - Нова фасцикла - - - - Please type a RSS feed URL - - - - - Feed URL: - - + Rss::Feed - - Deletion confirmation + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... - - Are you sure you want to delete the selected RSS feeds? + + Automatically downloading '%1' torrent from '%2' RSS feed... + + + Rss::Private::Parser - - Please choose a new name for this RSS feed - Молим изаберит ново име за овај RSS допис - - - - New feed name: - Ново feed име: - - - - Rename failed + + Invalid RSS feed. - - - Date: - Датум: - - - - Author: - Аутор: - RssSettingsDlg + RSS Reader Settings - RSS читач Подешавања + RSS читач Подешавања + RSS feeds refresh interval: - RSS поруке интервал освежавања: + RSS поруке интервал освежавања: + + + + min + + Maximum number of articles per feed: - Максимални број чланака по допису: + Максимални број чланака по допису: ScanFoldersDelegate - + Select save location @@ -8301,517 +7055,454 @@ ScanFoldersModel - + Monitored Folder - + Override Save Location - + Monitored folder - + Default save location - + Browse... - SearchJobWidget + SearchEngine - - Form + + Unknown search engine plugin file format. - - Results(xxx) + + A more recent version of this plugin is already installed. - - Search in: + + + Plugin is not supported. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + + Update server is temporarily unavailable. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + + + Failed to download the plugin file. %1 - - Seeds: + + An incorrect update info received. - - <html><head/><body><p>Minimal number of seeds</p></body></html> + + All categories - - - to + + Movies - - <html><head/><body><p>Maximal number of seeds</p></body></html> + + TV shows - - - + + Music - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + + Games - - Size: + + Anime - - <html><head/><body><p>Minimal torrent size</p></body></html> + + Software - - <html><head/><body><p>Maximal torrent size</p></body></html> + + Pictures + + + + + Books + + + SearchListDelegate + + + + Unknown + Непознат-а + + + + SearchTab - + Name i.e: file name - Име + Име - + Size i.e: file size - Величина + Величина - + Seeders i.e: Number of full sources - Донори + Донори - + Leechers i.e: Number of partial sources - Трагачи + Трагачи - + Search engine - Претраживачки модул - - - - Filter search results... - + Претраживачки модул - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Torrent names only - + Everywhere - - Use regular expressions - - - - + Searching... - + Search has finished - + Search aborted - + An error occurred during search... - + Search returned no results - + Column visibility Прегледност колона - - - SearchListDelegate - Unknown - Непознат-а + + Form + - - - SearchPluginManager - - Unknown search engine plugin file format. + + Results(xxx) - - A more recent version of this plugin is already installed. + + Search in: - - - Plugin is not supported. + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - - All categories + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - - Movies + + Seeds: - - TV shows + + <html><head/><body><p>Minimal number of seeds</p></body></html> - - Music + + + to - - Games + + <html><head/><body><p>Maximal number of seeds</p></body></html> - - - Anime + + + + - - Software + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - - Pictures + + Size: - - Books + + <html><head/><body><p>Minimal torrent size</p></body></html> - - Update server is temporarily unavailable. %1 + + <html><head/><body><p>Maximal torrent size</p></body></html> + + + SearchWidget + + + + + + + Search + Претраживање + - - - Failed to download the plugin file. %1 + + Download - - An incorrect update info received. + + Go to description page - - Search plugin '%1' contains invalid version string ('%2') + + Copy description page URL - - - SearchTab - Name - i.e: file name - Име - - - Size - i.e: file size - Величина - - - Seeders - i.e: Number of full sources - Донори - - - Leechers - i.e: Number of partial sources - Трагачи - - - Search engine - Претраживачки модул - - - Column visibility - Прегледност колона - - - - SearchWidget - - - - - - - - Search - Претраживање - - - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - - - Download - - - - - Go to description page - - - - - Copy description page URL - - - - + Search plugins... - + A phrase to search for. - + Spaces in a search term may be protected by double quotes. - + Example: Search phrase example - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - + All plugins - + Only enabled - + Select... - - - + + + Search Engine - + Please install Python to use the Search Engine. - + Empty search pattern - + Please type a search pattern first - + Stop - + Search has finished - + Search has failed - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + E&xit Now - + Exit confirmation - + The computer is going to shutdown. - + &Shutdown Now - - Shutdown confirmation - Потврђивање искључења - - - + The computer is going to enter suspend mode. - + &Suspend Now - + Suspend confirmation - + The computer is going to enter hibernation mode. - + &Hibernate Now - + Hibernate confirmation - + You can cancel the action within %1 seconds. - - - ShutdownConfirmDlg + Shutdown confirmation - Потврђивање искључења + Потврђивање искључења SpeedLimitDialog - + KiB/s KiB/s @@ -8819,52 +7510,52 @@ SpeedPlotView - + Total Upload - + Total Download - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - + DHT Download - + Tracker Upload - + Tracker Download @@ -8872,95 +7563,87 @@ SpeedWidget - + Period: - + 1 Minute - + 5 Minutes - + 30 Minutes - + 6 Hours - + Select Graphs - + Total Upload - + Total Download - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - + DHT Download - + Tracker Upload - + Tracker Download - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8973,48 +7656,48 @@ - - Cache statistics + + Total peer connections: - - Read cache hits: + + Global ratio: - - Average time in queue: + + Alltime download: - - Connected peers: + + Alltime upload: - - All-time share ratio: + + Total waste (this session): - - All-time download: + + Cache statistics - - Session waste: + + Read cache hits: - - All-time upload: + + Average time in queue: - Total buffer size: + Total buffers size: @@ -9043,7 +7726,12 @@ - + + OK + + + + %1 ms 18 milliseconds @@ -9052,35 +7740,32 @@ StatusBar - + Connection status: Статус конекције: - + No direct connections. This may indicate network configuration problems. Нема директних конекција. То може указивати на проблем мрежне конфигурације. - + DHT: %1 nodes DHT: %1 чворова + qBittorrent needs to be restarted - qBittorrent треба бити рестартован + qBittorrent треба бити рестартован + qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent је управо ажуриран и треба бити рестартован, да би' промене имале ефекта. - - - - qBittorrent needs to be restarted! - + qBittorrent је управо ажуриран и треба бити рестартован, да би' промене имале ефекта. @@ -9099,2050 +7784,1304 @@ На вези - + Click to switch to alternative speed limits Кликните да укључите алтернативно ограничење брзине - + Click to switch to regular speed limits Кликните да укључите уобичајено ограничење брзине - + + Manual change of rate limits mode. The scheduler is disabled. + + + + Global Download Speed Limit Општи лимит брзине преузимања - + Global Upload Speed Limit Општи лимит брзине слања - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - + Downloading (0) - + Seeding (0) - + Completed (0) - + Resumed (0) - + Paused (0) - + Active (0) - + Inactive (0) - + Errored (0) - + All (%1) - + Downloading (%1) - + Seeding (%1) - + Completed (%1) - + Paused (%1) - + Resumed (%1) - + Active (%1) - + Inactive (%1) - + Errored (%1) - TagFilterModel + TorrentContentModel - - Tags - + + Name + Име - - All - + + Size + Величина - - Untagged - + + Progress + Напредак - - - TagFilterWidget - - Add tag... + + Download Priority - - Remove tag + + Remaining + + + TorrentCreatorDlg - - Remove unused tags - + + Select a folder to add to the torrent + Селектујте фасциклу коју додајете у торент - - Resume torrents - + + Select a file to add to the torrent + Селектујте фајл који додајете у торент - - Pause torrents - + + No input path set + Није унета путања - - Delete torrents - + + Please type an input path first + Молим прво упишите улазну путању - - New Tag - + + Select destination torrent file + Изаберите дестинацију торент фајла - - Tag: + + Torrent Files (*.torrent) - - Invalid tag name + + Torrent was created successfully: %1 + %1 is the path of the torrent - - Tag name '%1' is invalid - + + + + Torrent creation + Креирање Торента - - Tag exists - + + Torrent creation was unsuccessful, reason: %1 + Креирање Торента је неуспешно, разлог: %1 - - Tag name already exists. - + + Created torrent file is invalid. It won't be added to download list. + Креирана Торент датотека је неважећа. Неће бити додата у листу за преузимање. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - + + Name + i.e: torrent name + Име - - Name: - Име: + + Size + i.e: torrent size + Величина - - Save path: - + + Done + % Done + Урађено - - Choose save path - Изаберите путању чувања + + Status + Torrent status (e.g. downloading, seeding, paused) + Статус - - New Category - + + Seeds + i.e. full sources (often untranslated) + Донори - - Invalid category name - + + Peers + i.e. partial sources (often untranslated) + Peers (учесници) - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - + + Down Speed + i.e: Download speed + Брзина Преуз - - Category creation error - + + Up Speed + i.e: Upload speed + Брзина Слања - - Category with the given name already exists. -Please choose a different name and try again. - + + Ratio + Share ratio + Однос - - - TorrentContentModel - - Name - Име + + ETA + i.e: Estimated Time of Arrival / Time left + ETA - - Size - Величина + + Category + - - Progress - Напредак + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Додато на - - Download Priority - + + Completed On + Torrent was completed on 01/01/2010 08:00 + Завршено дана - - Remaining - + + Tracker + Пратилац - - Availability - + + Down Limit + i.e: Download limit + Преуз. Лимит - - - TorrentCreatorDialog - - Torrent Creator - + + Up Limit + i.e: Upload limit + Слањ. Лимит - - Select file/folder to share + + Downloaded + Amount of data downloaded (e.g. in MB) - - Path: - + + Uploaded + Amount of data uploaded (e.g. in MB) + Послато - - [Drag and drop area] + + Session Download + Amount of data downloaded since program open (e.g. in MB) - - - Select file + + Session Upload + Amount of data uploaded since program open (e.g. in MB) - - - Select folder + + Remaining + Amount of data left to download (e.g. in MB) - - Settings + + Time Active + Time (duration) the torrent is active (not paused) + Протекло време + + + + Save path + Torrent save path - - Piece size: - Делови величине: + + Completed + Amount of data completed (e.g. in MB) + - - Auto - Аутоматски + + Ratio Limit + Upload share ratio limit + - - 16 KiB - 512 KiB {16 ?} + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + - - 32 KiB - 32 KiB + + Last Activity + Time passed since a chunk was downloaded/uploaded + - - 64 KiB - 64 KiB - - - - 128 KiB - 128 KiB - - - - 256 KiB - 256 KiB - - - - 512 KiB - 512 KiB - - - - 1 MiB - 1 MiB - - - - 2 MiB - 2 MiB - - - - 4 MiB - 4 MiB - - - - 8 MiB - 4 MiB {8 ?} - - - - 16 MiB - 4 MiB {16 ?} - - - - 32 MiB - 4 MiB {16 ?} {32 ?} - - - - Calculate number of pieces: - - - - - Private torrent (Won't distribute on DHT network) - - - - - Start seeding immediately - - - - - Ignore share ratio limits for this torrent - - - - - Optimize alignment - - - - - Fields - - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - - - - Web seed URLs: - - - - - Tracker URLs: - Пратилац URLs: - - - - Comments: - - - - - Source: - - - - - Progress: - Напредак: - - - - Create Torrent - - - - - - - Torrent creation failed - - - - - Reason: Path to file/folder is not readable. - - - - - Select where to save the new torrent - - - - - Torrent Files (*.torrent) - - - - - Reason: %1 - - - - - Reason: Created torrent is invalid. It won't be added to download list. - - - - - Torrent creator - - - - - Torrent created: - - - - - TorrentCreatorDlg - - Select a folder to add to the torrent - Селектујте фасциклу коју додајете у торент - - - Select a file to add to the torrent - Селектујте фајл који додајете у торент - - - No input path set - Није унета путања - - - Please type an input path first - Молим прво упишите улазну путању - - - Select destination torrent file - Изаберите дестинацију торент фајла - - - Torrent creation - Креирање Торента - - - Torrent creation was unsuccessful, reason: %1 - Креирање Торента је неуспешно, разлог: %1 - - - Created torrent file is invalid. It won't be added to download list. - Креирана Торент датотека је неважећа. Неће бити додата у листу за преузимање. - - - Piece size: - Делови величине: - - - Auto - Аутоматски - - - 16 KiB - 512 KiB {16 ?} - - - 32 KiB - 32 KiB - - - 64 KiB - 64 KiB - - - 128 KiB - 128 KiB - - - 256 KiB - 256 KiB - - - 512 KiB - 512 KiB - - - 1 MiB - 1 MiB - - - 2 MiB - 2 MiB - - - 4 MiB - 4 MiB - - - 8 MiB - 4 MiB {8 ?} - - - 16 MiB - 4 MiB {16 ?} - - - 32 MiB - 4 MiB {16 ?} {32 ?} - - - Tracker URLs: - Пратилац URLs: - - - Progress: - Напредак: - - - - TorrentInfo - - - File size exceeds max limit %1 - - - - - Torrent file read error: %1 - - - - - Torrent file read error: size mismatch - - - - - TorrentModel - - Name - i.e: torrent name - Име - - - Size - i.e: torrent size - Величина - - - Done - % Done - Урађено - - - Status - Torrent status (e.g. downloading, seeding, paused) - Статус - - - Seeds - i.e. full sources (often untranslated) - Донори - - - Peers - i.e. partial sources (often untranslated) - Peers (учесници) - - - Down Speed - i.e: Download speed - Брзина Преуз - - - Up Speed - i.e: Upload speed - Брзина Слања - - - Ratio - Share ratio - Однос - - - ETA - i.e: Estimated Time of Arrival / Time left - ETA - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - Додато на - - - Completed On - Torrent was completed on 01/01/2010 08:00 - Завршено дана - - - Tracker - Пратилац - - - Down Limit - i.e: Download limit - Преуз. Лимит - - - Up Limit - i.e: Upload limit - Слањ. Лимит - - - Uploaded - Amount of data uploaded (e.g. in MB) - Послато - - - Time Active - Time (duration) the torrent is active (not paused) - Протекло време - - - - TorrentsController - - - Not contacted yet - Није још контактиран - - - - Updating... - Ажурирање... - - - - Working - Ради - - - - Not working - Не ради - - - - Error: '%1' is not a valid torrent file. - - - - - - - - Torrent queueing must be enabled - - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - - Cannot make save path - - - - - Cannot write to directory - - - - - WebUI Set location: moving "%1", from "%2" to "%3" - - - - - Incorrect torrent name - - - - - - Incorrect category name - - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - - - - - Trackerless (0) - - - - - Error (0) - - - - - Warning (0) - - - - - - Trackerless (%1) - - - - - - Error (%1) - - - - - - Warning (%1) - - - - - Resume torrents - - - - - Pause torrents - - - - - Delete torrents - - - - - - All (%1) - this is for the tracker filter - - - - - TrackerList - - URL - URL - - - Status - Статус - - - Seeds - Донори - - - Peers - Peers (учесници) - - - Message - Порука - - - Working - Ради - - - Disabled - Онемогућен - - - This torrent is private - Овај торент је приватан - - - Updating... - Ажурирање... - - - Not working - Не ради - - - Not contacted yet - Није још контактиран - - - Add a new tracker... - Додај нови пратилац... - - - Column visibility - Прегледност колона - - - Remove tracker - Уклони пратилац + + Total Size + i.e. Size including unwanted data + - TrackerListWidget - - - - Working - Ради - - - - Disabled - Онемогућен - - - - This torrent is private - Овај торент је приватан - - - - Updating... - Ажурирање... - - - - Not working - Не ради - - - - Not contacted yet - Није још контактиран - + TrackerFiltersList - - - - - - - N/A + + All (0) + this is for the tracker filter - - Tracker editing + + Trackerless (0) - - Tracker URL: + + Error (0) - - - Tracker editing failed + + Warning (0) - - The tracker URL entered is invalid. + + + Trackerless (%1) - - The tracker URL already exists. + + + Error (%1) - - Add a new tracker... - Додај нови пратилац... - - - - Remove tracker - Уклони пратилац + + + Warning (%1) + - - Copy tracker URL + + Resume torrents - - Edit selected tracker URL + + Pause torrents - - Force reannounce to selected trackers + + Delete torrents - - Force reannounce to all trackers + + + All (%1) + this is for the tracker filter + + + TrackerList - + URL - URL + URL - + Status - Статус + Статус - + Received - + Seeds Донори - + Peers - Peers (учесници) + Peers (учесници) - + Downloaded - + Message - Порука - - - - Column visibility - Прегледност колона - - - - TrackerLoginDialog - - - - Tracker authentication - Аутентификација пратилаца - - - - Tracker: - Пратилац: - - - - Login - Логовање - - - - Username: - Корисничко име: - - - - Password: - Лозинка: - - - - Log in - Логуј се - - - - TrackersAdditionDialog - - - Trackers addition dialog - Пратиоци, дијалог додавања - - - - List of trackers to add (one per line): - Листа за додавање пратилаца (један по линији): - - - - µTorrent compatible list URL: - µTorrent компатибилна листа URL адреса: - - - - No change - Без измена - - - - No additional trackers were found. - Нису пронађени додатни пратиоци. - - - - Download error - Грешка преузимања - - - - The trackers list could not be downloaded, reason: %1 - Листа пратилаца не може бити преузета, разлог: %1 - - - - TrackersAdditionDlg - - Trackers addition dialog - Пратиоци, дијалог додавања - - - List of trackers to add (one per line): - Листа за додавање пратилаца (један по линији): - - - µTorrent compatible list URL: - µTorrent компатибилна листа URL адреса: - - - I/O Error - И/О Грешка - - - Error while trying to open the downloaded file. - Грешка при покушају да се отвори преузета датотека. - - - No change - Без измена - - - No additional trackers were found. - Нису пронађени додатни пратиоци. - - - Download error - Грешка преузимања - - - The trackers list could not be downloaded, reason: %1 - Листа пратилаца не може бити преузета, разлог: %1 - - - - TransferListDelegate - - - Downloading - Преузимање - - - - Downloading metadata - used when loading a magnet link - + Порука - - Allocating - qBittorrent is allocating the files on disk - - - - - Paused - Паузиран - - - - Queued - i.e. torrent is queued - Редослед - - - - Seeding - Torrent is complete and in upload-only mode - Донирање + + + Working + Ради - - Stalled - Torrent is waiting for download to begin - Застој + + Disabled + Онемогућен - - [F] Downloading - used when the torrent is forced started. You probably shouldn't translate the F. - + + This torrent is private + Овај торент је приватан - - [F] Seeding - used when the torrent is forced started. You probably shouldn't translate the F. - + + Updating... + Ажурирање... - - Checking - Torrent local data is being checked - Провера + + Not working + Не ради - - Queued for checking - i.e. torrent is queued for hash checking - + + Not contacted yet + Није још контактиран - - Checking resume data - used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. + + Tracker URL: - - Completed + + Tracker editing - - Moving - Torrent local data are being moved/relocated + + + Tracker editing failed - - Missing Files + + The tracker URL entered is invalid. - - Errored - torrent status, the torrent has an error + + The tracker URL already exists. - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - + + Add a new tracker... + Додај нови пратилац... - - %1 ago - e.g.: 1h 20m ago + + Copy tracker URL - - - TransferListFiltersWidget - - Status - Статус + + Edit selected tracker URL + - - Categories + + Force reannounce to selected trackers - - Tags + + Force reannounce to all trackers - - Trackers - Пратиоци + + Remove tracker + Уклони пратилац - TransferListModel + TrackersAdditionDlg - - Name - i.e: torrent name - Име + + Trackers addition dialog + Пратиоци, дијалог додавања - - Size - i.e: torrent size - Величина + + List of trackers to add (one per line): + Листа за додавање пратилаца (један по линији): - - - Done - % Done - Урађено + + + µTorrent compatible list URL: + µTorrent компатибилна листа URL адреса: - - Status - Torrent status (e.g. downloading, seeding, paused) - Статус + + I/O Error + И/О Грешка - - Seeds - i.e. full sources (often untranslated) - Донори + + Error while trying to open the downloaded file. + Грешка при покушају да се отвори преузета датотека. - - Peers - i.e. partial sources (often untranslated) - Peers (учесници) + + No change + Без измена - - Down Speed - i.e: Download speed - + + No additional trackers were found. + Нису пронађени додатни пратиоци. - - Up Speed - i.e: Upload speed - Брзина Слања + + Download error + Грешка преузимања - - Ratio - Share ratio - Однос + + The trackers list could not be downloaded, reason: %1 + Листа пратилаца не може бити преузета, разлог: %1 + + + TransferListDelegate - - ETA - i.e: Estimated Time of Arrival / Time left - ETA + + Downloading + Преузимање - - Category + + Downloading metadata + used when loading a magnet link - - Tags + + Allocating + qBittorrent is allocating the files on disk - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - Додато на + + Paused + Паузиран - - Completed On - Torrent was completed on 01/01/2010 08:00 - Завршено дана + + Queued + i.e. torrent is queued + Редослед - - Tracker - Пратилац + + Seeding + Torrent is complete and in upload-only mode + Донирање - - Down Limit - i.e: Download limit - Преуз. Лимит + + Stalled + Torrent is waiting for download to begin + Застој - - Up Limit - i.e: Upload limit - Слањ. Лимит + + [F] Downloading + used when the torrent is forced started. You probably shouldn't translate the F. + - - Downloaded - Amount of data downloaded (e.g. in MB) + + [F] Seeding + used when the torrent is forced started. You probably shouldn't translate the F. - - Uploaded - Amount of data uploaded (e.g. in MB) - Послато + + Checking + Torrent local data is being checked + Провера - - Session Download - Amount of data downloaded since program open (e.g. in MB) + + Queued for checking + i.e. torrent is queued for hash checking - - Session Upload - Amount of data uploaded since program open (e.g. in MB) + + Checking resume data + used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - - Remaining - Amount of data left to download (e.g. in MB) + + Completed - - Time Active - Time (duration) the torrent is active (not paused) - Протекло време + + Missing Files + - - Save path - Torrent save path + + Errored + torrent status, the torrent has an error - - Completed - Amount of data completed (e.g. in MB) + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) - - Ratio Limit - Upload share ratio limit + + %1 ago + e.g.: 1h 20m ago + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + Статус - - Last Activity - Time passed since a chunk was downloaded/uploaded + + Categories - - Total Size - i.e. Size including unwanted data - + + Trackers + Пратиоци TransferListWidget - + Column visibility Прегледност колона - + Choose save path Изаберите путању чувања - + Torrent Download Speed Limiting Ограничење брзине преузимања Торента - + Torrent Upload Speed Limiting Ограничење брзине слања Торента - + Recheck confirmation - + Are you sure you want to recheck the selected torrent(s)? - + Rename Преименуј - + New name: Ново име: - + Resume Resume/start the torrent Настави - + Force Resume Force Resume/start the torrent - + Pause Pause the torrent Пауза - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - - - - - Add Tags - - - - - Remove All Tags - - - - - Remove all tags from selected torrents? + + New Category - - Comma-separated tags: + + Category: - - Invalid tag + + Invalid category name - - Tag name: '%1' is invalid + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. - + Delete Delete the torrent Обриши - + Preview file... Приказ датотеке... - + Limit share ratio... Ограничење односа дељења... - + Limit upload rate... Ограничење брзине слања... - + Limit download rate... Ограничење брзине преузимања... - + Open destination folder Отвори одредишну фасциклу - + Move up i.e. move up in the queue Премести навише - + Move down i.e. Move down in the queue Премести надоле - + Move to top i.e. Move to top of the queue Премести на врх - + Move to bottom i.e. Move to bottom of the queue Премести на дно - + Set location... Подесите локацију... - - Force reannounce - - - - + Copy name - - Copy hash - - - - + Download first and last pieces first - + Automatic Torrent Management - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - + Category - + New... New category... - + Reset Reset category - - Tags - - - - - Add... - Add / assign multiple tags... - - - - - Remove All - Remove all tags - - - - + Priority Приоритет - + Force recheck Форсирано провери - + Copy magnet link Копирај магнет линк - + Super seeding mode Супер seeding (донирајући) мод - + Rename... Преименуј... - + Download in sequential order Преузимање у сријском редоследу - UpDownRatioDialog - - - Torrent Upload/Download Ratio Limiting - Однос ограничења слања/преузимања торента - - - - Use global share limit - - - - - - - buttonGroup - дугмад Група - - - - Set no share limit - - - - - Set share limit to - - - - - ratio - - - - - minutes - - - - - No share limit method selected - - - - - Please select a limit method first - - - - UpDownRatioDlg + Torrent Upload/Download Ratio Limiting - Однос ограничења слања/преузимања торента + Однос ограничења слања/преузимања торента + Use global ratio limit - Користи општи однос ограничења + Користи општи однос ограничења + + + buttonGroup - дугмад Група + дугмад Група + Set no ratio limit - Постави без односа ограничења + Постави без односа ограничења + Set ratio limit to - Постави односа ограничења на + Постави односа ограничења на - Utils::ForeignApps - - - Python detected, version: %1 - - + WebApplication - - Python not detected + + Incorrect category name - WebApplication + WebUI - - Unacceptable file type, only regular file is allowed. + + The Web UI is listening on port %1 - - Symlinks inside alternative UI folder are forbidden. + + Web UI Error - Unable to bind Web UI to port %1 + + + about - - Exceeded the maximum allowed file size (%1)! + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' + + Copyright %1 2006-2016 The qBittorrent project - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' + + Home Page: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' + + Forum: - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' + + Bug Tracker: - WebUI - - - Web UI: HTTPS setup successful - - + addPeersDialog - - Web UI: HTTPS setup failed, fallback to HTTP + + Add Peers - - Web UI: Now listening on IP: %1, port: %2 + + List of peers to add (one per line): - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 + + Format: IPv4:port / [IPv6]:port authentication + + Tracker authentication - Аутентификација пратилаца + Аутентификација пратилаца + Tracker: - Пратилац: + Пратилац: + Login - Логовање + Логовање + Username: - Корисничко име: + Корисничко име: + Password: - Лозинка: + Лозинка: + Log in - Логуј се + Логуј се + Cancel - Откажи + Откажи confirmDeletionDlg + Deletion confirmation - qBittorrent - Потврда брисања - qBittorrent + Потврда брисања - qBittorrent + Remember choice - Запамти избор + Запамти избор + Also delete the files on the hard disk - Такође избриши датотеке на чврстом диску + Такође избриши датотеке на чврстом диску + + + + confirmShutdownDlg + + + Don't show again + createTorrentDialog + Cancel - Откажи + Откажи + Torrent Creation Tool - Алат креирања Торента + Алат креирања Торента + Torrent file creation - Креирање Торент фајла + Креирање Торент фајла + Add file - Додај фајл + Додај фајл + Add folder - Додај фасциклу + Додај фасциклу + File or folder to add to the torrent: - Фајл или фасцикла за додавање у Торент: + Фајл или фасцикла за додавање у Торент: + Tracker URLs: - Пратилац URLs: + Пратилац URLs: + Web seeds urls: - Веб донори URLs: + Веб донори URLs: + Comment: - Коментар: + Коментар: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + + Piece size: - Делови величине: + Делови величине: + 16 KiB - 512 KiB {16 ?} + 512 KiB {16 ?} + 32 KiB - 32 KiB + 32 KiB + 64 KiB - 64 KiB + 64 KiB + 128 KiB - 128 KiB + 128 KiB + 256 KiB - 256 KiB + 256 KiB + 512 KiB - 512 KiB + 512 KiB + 1 MiB - 1 MiB + 1 MiB + 2 MiB - 2 MiB + 2 MiB + 4 MiB - 4 MiB + 4 MiB + 8 MiB - 4 MiB {8 ?} + 4 MiB {8 ?} + 16 MiB - 4 MiB {16 ?} + 4 MiB {16 ?} + Auto - Аутоматски + Аутоматски + Private (won't be distributed on DHT network if enabled) - Приватност (неће бити дистрибуиран на DHT мрежу ако је омогућена) + Приватност (неће бити дистрибуиран на DHT мрежу ако је омогућена) + Start seeding after creation - Стартуј донирање после креирања + Стартуј донирање после креирања + + + + Ignore share ratio limits for this torrent + + Create and save... - Креирај и сачувај... + Креирај и сачувај... + Progress: - Напредак: + Напредак: downloadFromURL + Add torrent links - Додај торент линкове + Додај торент линкове + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + + Download - Преузми + Преузми + Cancel - Откажи + Откажи + Download from urls - Преузимање са urls + Преузимање са urls + No URL entered - URL није унет + URL није унет + Please type at least one URL. - Молим упишите најмање један URL. + Молим упишите најмање један URL. + + + + errorDialog + + + Crash info + fsutils - + + + + + Downloads Преузимање @@ -11150,103 +9089,117 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) - + EiB exbibytes (1024 pebibytes) - + + Python not detected + + + + + Python version: %1 + + + + /s per second - + %1h %2m e.g: 3hours 5minutes %1h%2m - + %1d %2h e.g: 2days 10hours %1d %2h - + Unknown Unknown (size) Непознат-а - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent ће искључити рачунар сада, јер су сва преузимања завршена. - + < 1m < 1 minute < 1m - + %1m e.g: 10minutes %1m + Working - Ради + Ради + Updating... - Ажурирање... + Ажурирање... + Not working - Не ради + Не ради + Not contacted yet - Није још контактиран + Није још контактиран @@ -11295,29 +9248,24 @@ preview - + Preview selection Избор приказа - + The following files support previewing, please select one of them: + Preview - Прикажи + Прикажи + Cancel - Откажи - - - - trackerLogin - - Log in - Логуј се + Откажи diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_sv.ts qbittorrent-3.3.15/src/lang/qbittorrent_sv.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_sv.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_sv.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent Om qBittorrent - + About Om - + Author - Författare + Upphovsman - - Current maintainer - Nuvarande underhållare - - - - Greece - Grekland - - - - + + Nationality: Nationalitet: - - + + + Name: + Namn: + + + + E-mail: E-post: - - - Name: - Namn: + + Greece + Grekland - - Original author - Ursprunglig författare + + Current maintainer + Nuvarande underhållare - - France - Frankrike + + Original author + Ursprunglig skapare - + Special Thanks - Speciellt tack + - + Translators Översättare - - License - Licens - - - + Libraries Bibliotek - + qBittorrent was built with the following libraries: qBittorrent byggdes med följande bibliotek: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - En avancerad BitTorrent-klient programmerad i C++, baserad på Qt-verktygslåda och libtorrent-rasterbar. - - - - Copyright %1 2006-2018 The qBittorrent project - Copyright %1 2006-2018 The qBittorrent project - - - - Home Page: - Webbplats: - - - - Forum: - Forum: + + France + Frankrike - - Bug Tracker: - + + License + Licens @@ -115,69 +90,79 @@ Spara på - + + Browse... + Bläddra... + + + + Set as default save path + Ange som standardsökväg för sparade filer + + + Never show again Visa aldrig igen - + Torrent settings Torrentinställningar - + Set as default category Sätt som standardkategori - + Category: Kategori: - + Start torrent Starta torrent - + Torrent information Torrent information - + Skip hash check Skippa hashkontroll - + Size: Storlek: - + Hash: - Hash: + - + Comment: Kommentar: - + Date: Datum: Torrent Management Mode: - Torrenthanteringsläge: + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - Automatiskt läge betyder att vissa torrentegenskaper (t.ex. var filen ska sparas) bestäms av filens kategori + @@ -190,234 +175,218 @@ Automatiskt - - Remember last used save path - Kom ihåg den senast använda spara sökvägen - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - Om kryssad, kommer .torrent-filen inte tas bort trots inställningarna på "Hämta"-sidan i dialogrutan Alternativ + - + Do not delete .torrent file Radera inte .torrent-fil - - Create subfolder - Skapa undermapp - - - - Download in sequential order - Hämta i sekventiell ordning - - - - Download first and last pieces first - Hämta första och sista bitarna först - - - + Normal Normal - + High Hög - + Maximum - Högsta + Maximalt - + Do not download Hämta inte - - - + + + I/O Error In-/Ut-fel - + Invalid torrent Ogiltig torrent - - Renaming - Byter namn - - - - - Rename error - Fel vid namnbyte - - - - The name is empty or contains forbidden characters, please choose a different one. - Namnet är tomt eller innehåller förbjudna tecken, vänligen välj ett annat filnamn. + + + + + Already in download list + Redan i hämtningslistan - + Not Available This comment is unavailable Inte tillgänglig - + Not Available This date is unavailable Inte tillgänglig - + Not available Inte tillgänglig - + Invalid magnet link Ogiltig magnetlänk - + The torrent file '%1' does not exist. Torrentfilen '%1' finns inte. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. - Torrentfilen '%1' kan inte läsas från disken. Du har förmodligen inte diskbehörigheterna som krävs. + - + Failed to load the torrent: %1. Error: %2 Don't remove the ' ' characters. They insert a newline. - Kunde inte ladda torrenten: %1 -Fel: %2 + + + + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + + + + + Torrent is already in download list. Trackers were merged. + Torrent finns deran i nedladdningslistan. Slår samman trackers. + + + + + Cannot add torrent + Kan ej lägga till torrent + + + + Cannot add this torrent. Perhaps it is already in adding state. + Kan ej lägga till denna torrenten. Den kanske redan är i tillägningsläge. - + This magnet link was not recognized Denna magnetlänk känns ej igen - + + Magnet link is already in download list. Trackers were merged. + Magnetlänk är redan i nedladdningslistan. Sammanslår trackers. + + + + Cannot add this torrent. Perhaps it is already in adding. + Kan ej lägga till denna torrenten. Den kanske redan håller på att läggas till. + + + Magnet link Magnetlänk - + Retrieving metadata... Hämtar metadata... - + Not Available This size is unavailable. Inte tillgänglig - + Free space on disk: %1 Ledigt diskutrymme: %1 - + + Choose save path Välj sökväg att spara i - - - - - - - Torrent is already present - Torrent är redan närvarande - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - + + Rename the file + Byt namn på filen - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + + New name: + Nytt namn: - - Magnet link is already queued for processing. - + + + The file could not be renamed + Det gick inte att byta namn på filen - - New name: - Nytt namn: + + This file name contains forbidden characters, please choose a different one. + Detta filnamn innehåller förbjudna tecken. Välj ett annat filnamn. - - + + This name is already in use in this folder. Please use a different name. Detta namn används redan i denna mapp. Använd ett annat namn. - + The folder could not be renamed Det gick inte att byta namn på mappen - + Rename... Byt namn... - + Priority Prioritet - + Invalid metadata Ogiltig metadata - + Parsing metadata... Löser metadata... - + Metadata retrieval complete Hämtning av metadata klart - + Download Error Hämtningsfel @@ -425,312 +394,198 @@ AdvancedSettings - + + Disk write cache size + Storlek för diskskrivningscache + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Utgående portar (Min) [0: Inaktiverat] - + Outgoing ports (Max) [0: Disabled] Utgående portar (Max) [0: Inaktiverat] - + Recheck torrents on completion - Kontrollera torrenter igen vid färdigställande + Kontrollera torrentfiler igen vid färdigställande - + Transfer list refresh interval Uppdateringsintervall för överföringslista - + ms milliseconds ms - + Setting Inställning - + Value Value set for this setting Värde - - - (disabled) - (inaktiverad) - - - + (auto) (auto) - - min - minutes - min - - - + All addresses - Alla adresser + - + qBittorrent Section - qBittorrent-sektion + - - + + Open documentation - Öppna dokumentationen + - + libtorrent Section - libtorrent-sektion - - - - Asynchronous I/O threads - - Disk cache - Diskcache - - - + s seconds s - + Disk cache expiry interval Interval för utgång av diskcache - + Enable OS cache Slå på OS-cache - - Guided read cache - Guidad läscache - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - - - - - - KiB - KiB - - - - Send buffer watermark - - - - - Send buffer low watermark - - - - - Send buffer watermark factor - - - - - Prefer TCP - Föredra TCP - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address - + + m + minutes + m - + Resolve peer countries (GeoIP) Slå upp klienternas länder (GeoIP) - + Resolve peer host names Slå upp klienternas värdnamn - + Strict super seeding - Strikt superdistribuering + Strikt "super seeding" - + Network Interface (requires restart) Nätverksgränssnitt (kräver omstart) - + Optional IP Address to bind to (requires restart) - + Listen on IPv6 address (requires restart) Lyssna på IPv6-adresser (kräver omstart) - + Display notifications - Visa aviseringar - - - - Display notifications for added torrents - Visa aviseringar för tillagda torrenter - - - - Download tracker's favicon - Hämta spårarens favicon - - - - Save path history length - Spara längd för sökvägshistorik - - - - Fixed slots - - - - - Upload rate based - Sändning betygbaserad - - - - Upload slots behavior - Beteende för sändningsplatser - - - - Round-robin - - Fastest upload - Snabbaste sändning - - - - Anti-leech + + Display notifications for added torrents - - Upload choking algorithm + + Download tracker's favicon - + Confirm torrent recheck Bekräfta återkoll av torrent - - Confirm removal of all tags - Bekräfta borttagning av alla taggar - - - - Always announce to all trackers in a tier - + Exchange trackers with other peers + Utväxla bevakare med andra klienter - - Always announce to all tiers - + + Always announce to all trackers + Annonsera alltid till alla bevakare - + Any interface i.e. Any network interface Valfritt gränssnitt - + Save resume data interval How often the fastresume file is saved. Interval för sparning av återupptagningsdata - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - %1-TCP blandad lägesalgoritm - - - + Maximum number of half-open connections [0: Unlimited] - Högsta antal halvöppna anslutningar [0: inaktiverat] + Maximalt antal halvöppna anslutningar [0: inaktiverat] - + IP Address to report to trackers (requires restart) IP-adress att rapportera till bevakare (kräver omstart) - + Enable embedded tracker Aktivera inbäddad bevakare - + Embedded tracker port Port för inbäddad bevakare - + Check for software updates Leta efter programuppdateringar - + Use system icon theme Använd systemets ikontema @@ -738,120 +593,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 startad - + Torrent: %1, running external program, command: %2 - Torrent: %1, kör externt program, kommando: %2 - - - - Torrent name: %1 - Torrentnamn: %1 - - - - Torrent size: %1 - Torrentstorlek: %1 - - - - Save path: %1 - Spara sökvägen: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Torrent hämtades i %1. - - - - Thank you for using qBittorrent. - Tack för att ni använde qBittorrent. + - - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' har slutförd hämtningen + + Torrent: %1, run external program command too long (length > %2), execution failed. + - + Torrent: %1, sending mail notification - Torrent: %1, skickar e-postavisering + - + Information Information - - To control qBittorrent, access the Web UI at %1 - För att styra qBittorrent, öppna webbgränssnittet på %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + För att styra qBittorrent, gå in på webbgränssnittet på http://localhost:%1 - + The Web UI administrator user name is: %1 Administratörsnamnet för webbgränssnittet är: %1 - + The Web UI administrator password is still the default one: %1 Lösenordet för administratören på webbgränssnittet är standardlösenordet: %1 - + This is a security risk, please consider changing your password from program preferences. Detta är en säkerhetsrisk så överväg att ändra ditt lösenord från programinställningarna. - + Saving torrent progress... Sparar torrents framsteg... - - - Portable mode and explicit profile directory options are mutually exclusive - - - - - Portable mode implies relative fastresume - - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Spara till: @@ -861,816 +657,676 @@ RSS Hämtare - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - + + Enable Automated RSS Downloader + Aktivera automatisk RSS-hämtning - + Download Rules Hämtningsregler - + Rule Definition Regeldefinition - + Use Regular Expressions Använd reguljära uttryck - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - - - - + Must Contain: Måste innehålla: - + Must Not Contain: Får inte innehålla: - + Episode Filter: Avsnittsfilter: - + Assign Category: - Tilldela kategori: + - + Save to a Different Directory Spara till en annan katalog - + Ignore Subsequent Matches for (0 to Disable) ... X days - + Disabled - Inaktiverad + Inaktiverad - + days dagar - + Add Paused: Lägg till pausad: - + Use global settings - Använd allmän inställning + - + Always Alltid - + Never Aldrig - + Apply Rule to Feeds: - Tillämpa regel till flöden: + - + Matching RSS Articles - Matcha RSS-artiklar + - + &Import... Importera... - + &Export... Exportera... - + Matches articles based on episode filter. Matchar artiklar baserat på avsnittsfilter. - + Example: Exempel: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match kommer matcha 2, 5, 8 genom 15, 30 och framåt på avsnittet säsong ett - + Episode filter rules: Regler för avsnittsfilter: - + Season number is a mandatory non-zero value Säsongsnummer är ett krav för värden över noll - + Episode number is a mandatory non-zero value + Avsnittsnummer är ett krav för värden över noll + + + Filter must end with semicolon Filter måste sluta med semikolon - + Three range types for episodes are supported: - Tre olika typer av episoder stöds: + - + Single number: <b>1x25;</b> matches episode 25 of season one Ensamma siffror: <b>1x25;</b> matchar episod 25 av säsong ett - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Vanligt intervall: <b>1x25-40;</b>matchar episoderna 25 till 40 av säsong ett - - Episode number is a mandatory positive value - Episodnummer är ett obligatoriskt positivt värde - - - - Rules - Regler + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Oändligt intervall: <b>1x25-;</b> matchar episoderna 25 och uppåt av säsong ett - - Rules (legacy) - Regler (legacy) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - + Last Match: %1 days ago - Senaste matchning: %1 dagar sedan + - + Last Match: Unknown Senaste matchning: Okänd - + New rule name Namn för ny regel - + Please type the name of the new download rule. Ange det nya regelnamnet. - - + + Rule name conflict Namnkonflikt för regler - - + + A rule with this name already exists, please choose another name. En regel med denna namn finns redan. Välj ett annat namn. - + Are you sure you want to remove the download rule named '%1'? Är du säker på att du vill ta bort hämtningsregeln %1? - + Are you sure you want to remove the selected download rules? Är du säker på att du vill ta bort de markerade hämtningsreglerna? - + Rule deletion confirmation Bekräfta regelborttagning - + Destination directory Målkatalog - + Invalid action Ogiltig åtgärd - + The list is empty, there is nothing to export. - Listan är tom, det finns inget att exportera. + Listan är tom. Det finns ingenting att exportera. - - Export RSS rules - Exportera RSS-regler + + Where would you like to save the list? + Var vill du spara listan? - - + + Rules list (*.rssrules) + Regellista (*.rssrules) + + + I/O Error - I/O Fel + In-/Ut-fel - - Failed to create the destination file. Reason: %1 - Misslyckades med att skapa destinationsfilen. Anledning: %1 + + Failed to create the destination file + Misslyckades med att skapa målfilen - - Import RSS rules - Importera RSS-regler + + Please point to the RSS download rules file + Peka ut regelfilen för RSS-hämtning - - Failed to open the file. Reason: %1 - Misslyckades med att öppna filen. Anledning: %1 + + Rules list + Regellista - + Import Error - Fel vid Importering + Importfel - - Failed to import the selected rules file. Reason: %1 - Misslyckades med att importera den valda regelfilen. Anledning: %1 + + Failed to import the selected rules file + Misslyckades med att importera den valda regelfilen - + Add new rule... Lägg till ny regel... - + Delete rule Ta bort regel - + Rename rule... Byt namn på regel... - + Delete selected rules Ta bort markerade regler - - Clear downloaded episodes... - Rensa hämtade episoder... - - - + Rule renaming Byt namn på regel - + Please type the new rule name Ange det nya regelnamnet - - Clear downloaded episodes - Rensa hämtade episoder - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - Är du säker på att du vill rensa listan över hämtade episoder för den valda regeln? - - - - Regex mode: use Perl-compatible regular expressions - Regex-läge: använd Perl-kompatibla reguljära uttryck + + Regex mode: use Perl-like regular expressions + Regex-läge: använd Perl-liknande reguljära uttryck - - - Position %1: %2 - Position %1: %2 - - - + Wildcard mode: you can use - + ? to match any single character - ? för att matcha alla enskilda tecken + - + * to match zero or more of any characters - * för att matcha noll eller fler av några tecken + - + Whitespaces count as AND operators (all words, any order) - + | is used as OR operator - | används som OR-operatör + - + If word order is important use * instead of whitespace. - Om ordföljden är viktig, användning * i stället för blanksteg. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Ett uttryck med en tom %1-klausul (t.ex. %2) + - + will match all articles. - kommer att matcha alla artiklar. + - + will exclude all articles. - kommer exkludera alla artiklar. - - - - BanListOptionsDialog - - - List of banned IP addresses - - Ban IP - Bannlys IP - - - - Delete - Ta bort - - - - - Warning - Varning - - - - The entered IP address is invalid. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Jokerteckensläge: du kan använda<ul><li>? för att matcha ett enda tecken</li><li>* för att matcha noll eller flera tecken</li><li>Blanksteg räknas som AND-operatorer</li></ul> - - The entered IP is already banned. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Jokerteckensläge: du kan använda<ul><li>? för att matcha ett enda tecken</li><li>* för att matcha noll eller flera tecken</li><li>| använd som OR-operator</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support Omstart krävs för att växla PeX-stöd - - Could not get GUID of configured network interface. Binding to IP %1 - Det gick inte att få GUID för konfigurerat nätverksgränssnitt. Bindning till IP %1 - - - + Embedded Tracker [ON] Inbäddad bevakare [PÅ] - + Failed to start the embedded tracker! Misslyckades med att starta den inbäddade bevakaren! - + Embedded Tracker [OFF] - Inbäddad bevakare [AV] + Inbäddad bevakare [OFF] - + + '%1' reached the maximum ratio you set. Removing... + + + + + '%1' reached the maximum ratio you set. Pausing... + + + + System network status changed to %1 e.g: System network status changed to ONLINE - Systemnätverksstatus ändrad till %1 + - + ONLINE ONLINE - + OFFLINE OFFLINE - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding - Nätverkskonfigurationen för %1 har ändrats, uppdaterar sessionsbindning + - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. - Konfigurerad nätverksgränssnittsadress %1 är inte giltig. + - - + Encryption support [%1] - Krypteringsstöd [%1] + - - + FORCED - Tvingad - - - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 är inte en giltig IP-adress och kunde inte läggas till i listan av förbjudna adresser. + - - + Anonymous mode [%1] - Anonymitetsläge [%1] + - + Unable to decode '%1' torrent file. - Det gick inte att avkoda "%1" torrentfilen. + - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' - + Queue positions were corrected in %1 resume files - + Couldn't save '%1.torrent' Kunde inte spara '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - "%1" har tagits bort från överföringslistan. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - "%1" har tagits bort från överföringslistan och hårddisken. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - "%1" har tagits bort från överföringslistan men filerna kunde inte raderas. Fel: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. - pga att %1 är inaktiverat. + - + because %1 is disabled. this peer was blocked because TCP is disabled. - pga att %1 är inaktiverat. + - + URL seed lookup failed for URL: '%1', message: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + "%1" togs bort från överföringslistan och hårddisken. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + "%1" togs bort från överföringslistan. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Hämtar "%1", vänligen vänta... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 - + The network interface defined is invalid: %1 - Nätverksgränssnittet som definierats är ogiltig: %1 + - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 - qBittorrent försöker lyssna på gränssnittet %1 port: %2 - - - - Peer ID: - Nod-ID: - - - - HTTP User-Agent is '%1' - HTTP-användaragent är '%1' + - - + DHT support [%1] - DHT-stöd [%1] + - - - - - - - - - + + + + ON - + - - - - - - - - - + + + + OFF - AV + - - + Local Peer Discovery support [%1] - Stöd för Local Peer Discovery [%1] - - - - PeX support [%1] - PeX-stöd [%1] - - - - '%1' reached the maximum ratio you set. Removed. - '%1' nått högsta förhållande. Borttagen. - - - - '%1' reached the maximum ratio you set. Paused. - '%1' nått högsta förhållande. Pausad. - - - - '%1' reached the maximum seeding time you set. Removed. - '%1' nådde den högsta distributionstiden du ställde in. Togs bort. - - - - '%1' reached the maximum seeding time you set. Paused. - '%1' nådde den högsta distributionstiden du ställde in. Pausad. + - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on - qBittorrent hittade inte en %1 lokal adress att lyssna på + - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface - qBittorrent misslyckades med att lyssna på någon gränssnittsport: %1. Anledning: %2. + - + Tracker '%1' was added to torrent '%2' - Bevakaren "%1" lades till torrent "%2" + - + Tracker '%1' was deleted from torrent '%2' - Bevakaren "%1" togs bort från torrent "%2" + - + URL seed '%1' was added to torrent '%2' - + URL seed '%1' was removed from torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. Kunde inte återuppta torrent '%1' - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Error: Failed to parse the provided IP filter. - - '%1' restored. - 'torrent name' restored. + + Couldn't add torrent. Reason: %1 - - Couldn't add torrent. Reason: %1 - Kunde inte lägga till torrent. Anledning: %1 + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + - + '%1' added to download list. 'torrent name' was added to download list. - '%1' lades till i hämtningslistan. + - + An I/O error occurred, '%1' paused. %2 - Ett I/O-fel inträffade, "%1" pausades. %2 + - + UPnP/NAT-PMP: Port mapping failure, message: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 - + due to IP filter. this peer was blocked due to ip filter. - på grund av IP-filter. + - + due to port filter. this peer was blocked due to port filter. - på grund av portfilter. + - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. - på grund av i2p blandade lägesbegränsningar. + - + because it has a low port. this peer was blocked because it has a low port. - för att den har en låg port. + - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 - + External IP: %1 e.g. External IP: 192.168.0.1 - Extern IP: %1 - - - - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - skapande av en ny torrentfil misslyckades + BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - Av - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + File sizes mismatch for torrent '%1', pausing it. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... @@ -1678,19 +1334,19 @@ CategoryFilterModel - + Categories - Kategorier + Kategorier - + All - Alla + Alla - + Uncategorized - Okategoriserad + @@ -1698,42 +1354,137 @@ Add category... - Lägg till kategori... + Lägg till kategori... Add subcategory... - Lägg till underkategori... + - Edit category... - Redigera kategori... + Remove category + Ta bort kategori + + + + Remove unused categories + Ta bort oanvända kategorier + + + + Resume torrents + Återuppta torrentfiler + + + + Pause torrents + + + + + Delete torrents + Ta bort torrentfiler + + + + New Category + Ny Kategori + + + + Category: + Kategori: + + + + Invalid category name + Ogiltigt kategorinamn + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Alla (0) + + + Uncategorized (0) + Okategoriserade (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Okategoriserade (%1) + + + Add category... + Lägg till kategori... - Remove category - Ta bort kategori + Ta bort kategori - Remove unused categories - Ta bort oanvända kategorier + Ta bort oanvända kategorier - Resume torrents - Återuppta torrenter + Återuppta torrentfiler - Pause torrents - Pausa torrenter + Pausa torrentfiler - Delete torrents - Ta bort torrenter + Ta bort torrentfiler + + + New Category + Ny Kategori + + + Category: + Kategori: + + + Invalid category name + Ogiltigt kategorinamn + + + All (%1) + this is for the category filter + Alla (%1) @@ -1741,7 +1492,7 @@ Manage Cookies - Hantera kakor + @@ -1749,640 +1500,598 @@ Domain - Domän + Path - Filväg + Name - Namn + Namn Value - Värde + Värde Expiration Date - Utgångsdatum + - DeletionConfirmationDialog - - - Deletion confirmation - Borttagningsbekräftelse - - - - Remember choice - Kom ihåg valet - - - - Also delete the files on the hard disk - - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - Är du säker på att du vill ta bort dessa %1 torrenter från överföringslistan? - - - - DownloadFromURLDialog - - - Download from URLs - Hämta från webbadresser - - - - Add torrent links - Lägg till torrent-länkar - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - Hämta - - - - No URL entered - - - - - Please type at least one URL. - + Är du säker på att du vill ta bort dessa %1 torrent-filerna från överföringslistan? DownloadedPiecesBar - + White: Missing pieces - Vit: Saknade bitar + - + Green: Partial pieces - Grön: Delvis färdiga bitar + - + Blue: Completed pieces - Blå: Slutförda bitar + - ExecutionLogWidget + ExecutionLog - + General Allmänt - + Blocked IPs - + Blockerade IP - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> blockerades %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - + <font color='red'>%1</font> är bannlyst FeedListWidget - + RSS feeds RSS-kanaler - - - Unread (%1) - Olästa (%1) + + Unread + Oläst FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. + + An error occured while trying to open the log file. Logging to file is disabled. - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - &Bläddra... - - - - Choose a file - Caption for file open/save dialog - Välj en fil - + FilterParserThread - - Choose a folder - Caption for directory open dialog - Välj en mapp + + + + I/O Error: Could not open ip filter file in read mode. + - - Any file - Alla filer + + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. + - FilterParserThread + GeoIPDatabase - - - - I/O Error: Could not open IP filter file in read mode. + + + Unsupported database file size. - - - - IP filter line %1 is malformed. + + Metadata error: '%1' entry not found. - - - IP filter line %1 is malformed. Start IP of the range is malformed. + + Metadata error: '%1' entry has invalid type. - - - IP filter line %1 is malformed. End IP of the range is malformed. + + Unsupported database version: %1.%2 - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! + + Unsupported IP version: %1 - - - IP filter exception thrown for line %1. Exception is: %2 + + Unsupported record size: %1 - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. + + Invalid database type: %1 - - - - - - - - Parsing Error: The filter file is not a valid PeerGuardian P2B file. + + Database corrupted: no data section found. - GeoIPDatabase + HttpServer - - - Unsupported database file size. - Ostödd databasfilstorlek. + + File + Arkiv - - Metadata error: '%1' entry not found. - Metadatafel: '%1' inmatning hittades inte. + + Edit + Redigera - - Metadata error: '%1' entry has invalid type. - Metadatafel: '%1' inmatningen har ogiltig typ. - - - - Unsupported database version: %1.%2 - Icke-stödd databasversion: %1.%2 - - - - Unsupported IP version: %1 - Icke-stödd IP-version: %1 - - - - Unsupported record size: %1 - icke-stödd poststorlek: %1 - - - - Invalid database type: %1 - Ogiltig databastyp: %1 - - - - Database corrupted: no data section found. - Databas skadad: ingen data sektion hittades. - - - - Http::Connection - - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - - - - - Bad Http request, closing socket. IP: %s - + + Help + Hjälp - - - HttpServer - + Exit qBittorrent Avsluta qBittorrent - + Only one link per line Endast en länk per rad - + + Download + Hämta + + + Global upload rate limit must be greater than 0 or disabled. - Allmän begränsning för sändningshastighet måste vara större än 0 eller inaktiverad. + - + Global download rate limit must be greater than 0 or disabled. - + Alternative upload rate limit must be greater than 0 or disabled. - Alternativ begränsning för sändningshastighet måste vara större än 0 eller inaktiverad. + - + Alternative download rate limit must be greater than 0 or disabled. - + Maximum active downloads must be greater than -1. Maximalt aktiva hämtningar måste vara större än -1. - + Maximum active uploads must be greater than -1. - Maximalt aktiva sändningar måste vara större än -1. + Maximalt aktiva sändingar måste vara större än -1. - + Maximum active torrents must be greater than -1. Maximalt aktiva torrenter måste vara större än -1. - + Maximum number of connections limit must be greater than 0 or disabled. - Gräns för högsta antal anslutningar måste vara större än 0 eller inaktiverad. + Gräns för maximalt antal anslutningar måste vara större än 0 eller inaktiverad. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. - Gräns för högsta antal anslutningar per torrent måste vara större än 0 eller inaktiverad. + Gräns för maximalt antal anslutningar per torrent måste vara större än 0 eller inaktiverad. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. - Gräns för högsta antal sändningsplatser per torrent måste vara större än 0 eller inaktiverad. + Gräns för maximalt antal sändningsplatser per torrent måste vara större än 0 eller inaktiverad. - + Unable to save program preferences, qBittorrent is probably unreachable. Kunde inte spara programinställningarna. qBittorrent är antagligen inte nåbar. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent på Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - - - - - Unknown - Okänd - - - - Hard Disk - Hårddisk - - - - Share ratio limit must be between 0 and 9998. - - - - - Seeding time limit must be between 0 and 525600 minutes. - + + Language + Språk - + The port used for incoming connections must be between 1 and 65535. Porten som användas för inkommande anslutningar måste vara mellan 1 och 65535. - + The port used for the Web UI must be between 1 and 65535. Porten som används för webbgränssnittet måste vara mellan 1 och 65535 - + Unable to log in, qBittorrent is probably unreachable. Kunde inte logga in. qBittorrent är troligtvis inte nåbart. - + Invalid Username or Password. Felaktigt Användarnamn eller Lösenord - - Username - Användarnamn - - - + Password Lösenord - + Login Inloggning - + + Upload Failed! + Uppladdning misslyckad! + + + Original authors Ursprungliga skapare - + + Upload limit: + Sändningsgräns: + + + + Download limit: + Hämtningsgräns: + + + Apply Verkställ - + Add Lägg till - + + Category: + Kategori: + + + Upload Torrents Upload torrent files to qBittorent using WebUI - Skicka torrenter + Ladda upp torrents - + + All + Alla + + + + Downloading + Hämtar + + + + Seeding + Distribuerar + + + + Completed + Färdiga + + + + Resumed + Återupptagna + + + + Paused + Pausade + + + + Active + Aktiva + + + + Inactive + Inaktiva + + + Save files to location: Spara filer till platsen: - + Cookie: - Kaka: + - + Type folder here - Ange mapp här + - + + Run an external program on torrent completion + + + + + Enable bandwidth management (uTP) + + + + + Apply rate limit to uTP connections + + + + + Alternative Global Rate Limits + + + + More information Mer information - + Information about certificates Information om certifikat - + Save Files to - Spara filer till + - - Set location - Ange plats + + Watch Folder + - - Limit upload rate - Begränsa sändningshastighet + + Default Folder + - - Limit download rate - Begränsa hämtningshastighet + + from + from time1 to time2 + från - - Rename torrent - Byt namn på torrent + + to + from time1 to time2 + till - - Unable to create category + + Other... + Save Files to: Watch Folder / Default Folder / Other... - - Other... - Save Files to: Watch Folder / Default Folder / Other... - Annan... + + Every day + Schedule the use of alternative rate limits on ... + Varje dag - + + Week days + Schedule the use of alternative rate limits on ... + Veckodagar + + + + Week ends + Schedule the use of alternative rate limits on ... + Helger + + + Monday Schedule the use of alternative rate limits on ... Måndag - + Tuesday Schedule the use of alternative rate limits on ... Tisdag - + Wednesday Schedule the use of alternative rate limits on ... Onsdag - + Thursday Schedule the use of alternative rate limits on ... Torsdag - + Friday Schedule the use of alternative rate limits on ... Fredag - + Saturday Schedule the use of alternative rate limits on ... Lördag - + Sunday Schedule the use of alternative rate limits on ... Söndag - + + Downloaded + Is the file downloaded or not? + Hämtad + + + Logout - Logga ut + - + + Download from URLs + + + + Download Torrents from their URLs or Magnet links - Hämta torrenter från deras webbadresser eller magnetlänkar + - + Upload local torrent - Skicka lokal torrent + - + Are you sure you want to delete the selected torrents from the transfer list? - Är du säker på att du vill ta bort de valda torrenterna från överföringslistan? + - + Save Spara - + qBittorrent client is not reachable qBittorrent-klienten är inte nåbar - - qBittorrent has been shutdown. - qBittorrent har stängts av. + + HTTP Server + HTTP-server - - - IPSubnetWhitelistOptionsDialog - - List of whitelisted IP subnets - + + The following parameters are supported: + Följande parametrar stöds: - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Exempel: 172.17.32.0/24, fdff:ffff:c8::/40 + + Torrent path + Torrentsökväg - - Add subnet - + + Torrent name + Torrentnamn - - Delete - Ta bort - - - - Error - Fel + + qBittorrent has been shutdown. + qBittorrent har stängts av. + + + LineEdit - - The entered subnet is invalid. - + + Clear the text + Töm texten LogListWidget - + Copy Kopiera - + Clear Rensa @@ -2415,550 +2124,491 @@ - + &View &Visa - + &Options... A&lternativ... - + &Resume &Återuppta - + Torrent &Creator - Torrent&skapare + - + Set Upload Limit... Ställ in sändningsgräns... - + Set Download Limit... - Ange gräns för hämtningshastighet... + - + Set Global Download Limit... - Ange gräns för global hämtningshastighet... + - + Set Global Upload Limit... - Ange gräns för global sändningshastighet... + - + Minimum Priority Lägsta prioritet - + Top Priority Högsta prioritet - + Decrease Priority Minska prioritet - + Increase Priority Öka prioritet - - + + Alternative Speed Limits - Alternativa hastighetsbegränsningar + - + &Top Toolbar - &Översta verktygsfältet + - + Display Top Toolbar - Visa översta verktygsfältet - - - - Status &Bar - Status&fält + - + S&peed in Title Bar - + Show Transfer Speed in Title Bar - Visa överföringshastighet i titelfältet + - + &RSS Reader - &RSS-läsare + - + Search &Engine - Sök&motor + - + L&ock qBittorrent - L&ås qBittorrent + - + Do&nate! - Do&nera! - - - - Close Window - Stäng fönster + - + R&esume All Återu&ppta alla - + Manage Cookies... - Hantera kakor... + - + Manage stored network cookies - + Normal Messages Normala Meddelanden - + Information Messages Informationsmeddelanden - + Warning Messages Varningsmeddelanden - + Critical Messages Kritiska Meddelanden - + &Log - &Logg + - + &Exit qBittorrent - &Avsluta qBittorrent + - + &Suspend System - + &Hibernate System - + S&hutdown System - S&täng av systemet + - + &Disabled - &Inaktiverad + - + &Statistics - &Statistik + - + Check for Updates Sök efter uppdateringar - + Check for Program Updates Sök efter programuppdateringar - + &About &Om - + &Pause &Paus - + &Delete &Ta bort - + P&ause All P&ausa alla - + &Add Torrent File... - &Lägg till torrentfil... + - + Open Öppna - + E&xit - A&vsluta + - + Open URL Öppna URL - + &Documentation &Dokumentation - + Lock Lås - - - + + + Show Visa - + Check for program updates Leta efter programuppdateringar - + Add Torrent &Link... - Lägg till torrent&länk... + - + If you like qBittorrent, please donate! Donera om du tycker om qBittorrent! - - + Execution Log Körningslogg - + Clear the password Rensa lösenordet - + Filter torrent list... Filtrera torrentlista... - + &Set Password - &Ange lösenord - - - - Preferences - Inställningar + - + &Clear Password - &Rensa lösenord + - + Transfers Överföringar - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Associering av torrentfiler - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent är inte standardprogrammet för att öppna torrentfiler eller Magnet-länkar. Vill du associera qBittorrent med torrentfiler och Magnet-länkar? - + Icons Only Endast ikoner - + Text Only Endast text - + Text Alongside Icons Text längs med ikoner - + Text Under Icons Text under ikoner - + Follow System Style Använd systemets utseende - - - + + + UI lock password Lösenord för gränssnittslåsning - - - + + + Please type the UI lock password: Ange lösenord för gränssnittslåsning: - + The password should contain at least 3 characters Lösenordet bör innehålla minst 3 tecken - + Password update Lösenordet har uppdaterats - + The UI lock password has been successfully updated Lösenordet för gränssnittslåsning har uppdaterats - + Are you sure you want to clear the password? Är du säker att du vill rensa lösenordet? - - Use regular expressions - Använd reguljära uttryck - - - + Search Sök - + Transfers (%1) Överföringar (%1) - + Error - Fel + - + Failed to add torrent: %1 - Misslyckades med att lägga till torrent: %1 + - + Torrent added - Torrent tillagd + - + '%1' was added. e.g: xxx.avi was added. - '%1' tillades. + - + Download completion Hämtningen är färdig - + I/O Error i.e: Input/Output Error In-/ut-fel - + Recursive download confirmation Bekräfta rekursiv hämtning - + Yes Ja - + No Nej - + Never Aldrig - + Global Upload Speed Limit Allmän hastighetsgräns för sändning - + Global Download Speed Limit Allmän hastighetsgräns för hämtning - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - Några filer överförs för närvarande. - - - - Are you sure you want to quit qBittorrent? - Är du säker på att du vill avsluta qBittorrent? - - - + &No - &Nej + &Nej - + &Yes - &Ja + &Ja - + &Always Yes - &Alltid Ja - - - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - Det gick inte att bestämma din Python-version. Sökmotor inaktiverad. + - + Old Python Interpreter - Gammal Python-tolk + - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - + qBittorrent Update Available - qBittorrent uppdatering tillgänglig + + + + + A new version is available. +Do you want to download %1? + - + Already Using the Latest qBittorrent Version - + Undetermined Python version - Ospecificerad Python-version + - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. - "'%1" har hämtats. + - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2966,158 +2616,152 @@ - + The torrent '%1' contains torrent files, do you want to proceed with their download? - + Couldn't download file at URL '%1', reason: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - Python hittades i %1: %2 + - - + + Couldn't determine your Python version (%1). Search engine disabled. + + + + + Missing Python Interpreter Python-tolk saknas - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? - Python krävs för att använda sökmotorn, men det verkar inte vara installerat. -Vill du installera det nu? + - + Python is required to use the search engine but it does not seem to be installed. - Python krävs för att använda sökmotorn, men det verkar inte vara installerat. - - - - A new version is available. - En ny version är tillgänglig. - - - - Do you want to download %1? - Vill du hämta %1? - - - - Open changelog... - Öppna ändringslogg... + - + No updates available. You are already using the latest version. - Inga uppdateringar tillgängliga. -Du använder redan den senaste versionen. + - + &Check for Updates - &Sök efter uppdateringar + - + Checking for Updates... Söker efter uppdateringar... - + Already checking for program updates in the background Leta redan efter programuppdateringar i bakgrunden - + Python found in '%1' - Python hittades i '%1' + - + Download error Hämtningsfel - + Python setup could not be downloaded, reason: %1. Please install it manually. Python-installationen kunde inte hämtas. Anledning: %1. Installera den manuellt. - - + + Invalid password Ogiltigt lösenord - - - + + RSS (%1) RSS (%1) - + URL download error - Webbadress-hämtningsfel + - + The password is invalid Lösenordet är ogiltigt - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Hämtning: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Sändning: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [N: %1/s, U: %2/s] qBittorrent %3 - + Hide Dölj - + Exiting qBittorrent Avslutar qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Ett antal filer håller fortfarande på att överföras. +Är du säker på att du vill avsluta qBittorrent? + + + Open Torrent Files Öppna torrent-filer - + Torrent Files Torrent-filer - + Options were saved successfully. Inställningarna har sparats. @@ -3125,52 +2769,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. - + Dynamic DNS error: hostname supplied does not exist under specified account. - + Dynamic DNS error: Invalid username/password. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. - + Dynamic DNS error: supplied domain name is invalid. - + Dynamic DNS error: supplied username is too short. - + Dynamic DNS error: supplied password is too short. @@ -3178,1413 +2822,1303 @@ Net::DownloadHandler - + I/O Error - I/O-fel + - + The file size is %1. It exceeds the download limit of %2. - + Unexpected redirect to magnet URI. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) + + + GeoIP database loaded. Type: %1. Build time: %2. - - The operation was canceled + + + Couldn't load GeoIP database. Reason: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed + + Venezuela, Bolivarian Republic of - - The connection to the remote server timed out + + Viet Nam - - SSL/TLS handshake failed + + + N/A - - The remote server refused the connection + + Andorra - - The connection to the proxy server was refused + + United Arab Emirates - - The proxy server closed the connection prematurely + + Afghanistan - - The proxy host name was not found + + Antigua and Barbuda - - The connection to the proxy timed out or the proxy did not reply in time to the request sent + + Anguilla - - The proxy requires authentication in order to honor the request but did not accept any credentials offered + + Albania - - The access to the remote content was denied (401) + + Armenia - - The operation requested on the remote content is not permitted + + Angola - - The remote content was not found at the server (404) + + Antarctica - - The remote server requires authentication to serve the content but the credentials provided were not accepted + + Argentina - - The Network Access API cannot honor the request because the protocol is not known + + American Samoa - - The requested operation is invalid for this protocol + + Austria - - An unknown network-related error was detected + + Australia - - An unknown proxy-related error was detected + + Aruba - - An unknown error related to the remote content was detected + + Azerbaijan - - A breakdown in protocol was detected + + Bosnia and Herzegovina - - Unknown error + + Barbados - - - Net::GeoIPManager - - - GeoIP database loaded. Type: %1. Build time: %2. + + Bangladesh - - - Couldn't load GeoIP database. Reason: %1 + + Belgium - - Venezuela, Bolivarian Republic of + + Burkina Faso - - Viet Nam - Vietnam - - - - - N/A + + Bulgaria - - Andorra - Andorra + + Bahrain + - - United Arab Emirates - Förenade Arabemiraten + + Burundi + - - Afghanistan - Afghanistan + + Benin + - - Antigua and Barbuda + + Bermuda - - Anguilla + + Brunei Darussalam - - Albania - Albanien + + Brazil + - - Armenia - Armenien + + Bahamas + - - Angola - Angola + + Bhutan + - - Antarctica - Antarktis + + Bouvet Island + - - Argentina - Argentina - - - - American Samoa - - - - - Austria - Österrike - - - - Australia - Australien - - - - Aruba - - - - - Azerbaijan - - - - - Bosnia and Herzegovina - - - - - Barbados - Barbados - - - - Bangladesh - - - - - Belgium - Belgien - - - - Burkina Faso - - - - - Bulgaria - Bulgarien - - - - Bahrain - - - - - Burundi - - - - - Benin - - - - - Bermuda - - - - - Brunei Darussalam - - - - - Brazil - Brasilien - - - - Bahamas - Bahamas - - - - Bhutan - + + Botswana + - Bouvet Island + Belarus - Botswana + Belize - Belarus - Vitryssland + Canada + - Belize + Cocos (Keeling) Islands - Canada - Kanada + Congo, The Democratic Republic of the + - Cocos (Keeling) Islands + Central African Republic - Congo, The Democratic Republic of the + Congo - Central African Republic + Switzerland - - Congo - Kongo - - - Switzerland - Schweiz - - - Cook Islands - + Chile - Chile + - + Cameroon - + China - Kina + - + Colombia - Colombia + - + Costa Rica - + Cuba - Kuba + - + Cape Verde - + Curacao - + Christmas Island - + Cyprus - Cypern + - + Czech Republic - Tjeckien + - + Germany - Tyskland + - + Djibouti - + Denmark - Danmark + - + Dominica - + Dominican Republic - Dominikanska republiken + - + Algeria - Algeriet + - + Ecuador - + Estonia - Estland + - + Egypt - Egypten + - + Western Sahara - + Eritrea - Eritrea + - + Spain - Spanien + - + Ethiopia - Etiopien + - + Finland - Finland + - + Fiji - Fiji + - + Falkland Islands (Malvinas) - + Micronesia, Federated States of - + Faroe Islands - Färöarna + - + France - Frankrike + Frankrike - + Gabon - + United Kingdom - Storbritannien + - + Grenada - + Georgia - + French Guiana - + Ghana - + Gibraltar - + Greenland - Grönland + - + Gambia - + Guinea - + Guadeloupe - + Equatorial Guinea - + Greece - Grekland + Grekland - + South Georgia and the South Sandwich Islands - + Guatemala - + Guam - + Guinea-Bissau - + Guyana - + Hong Kong - Hong Kong + - + Heard Island and McDonald Islands - + Honduras - + Croatia - Kroatien + - + Haiti - Haiti + - + Hungary - Ungern + - + Indonesia - Indonesien + - + Ireland - Irland + - + Israel - Israel + - + India - Indien + - + British Indian Ocean Territory - + Iraq - Irak + - + Iran, Islamic Republic of - + Iceland - Island + - + Italy - Italien + - + Jamaica - + Jordan - Jordanien + - + Japan - Japan + - + Kenya - Kenya + - + Kyrgyzstan - + Cambodia - Kambodja + - + Kiribati - + Comoros - + Saint Kitts and Nevis - + Korea, Democratic People's Republic of - + Korea, Republic of - + Kuwait - + Cayman Islands - + Kazakhstan - + Lao People's Democratic Republic - + Lebanon - Libanon + - + Saint Lucia - + Liechtenstein - + Sri Lanka - Sri Lanka + - + Liberia - + Lesotho - + Lithuania - Litauen + - + Luxembourg - Luxemburg + - + Latvia - Lettland + - + Morocco - Marocko + - + Monaco - + Moldova, Republic of - + Madagascar - + Marshall Islands - + Mali - + Myanmar - + Mongolia - Mongoliet + - + Northern Mariana Islands - + Martinique - + Mauritania - + Montserrat - + Malta - Malta + - + Mauritius - + Maldives - + Malawi - + Mexico - + Malaysia - + Mozambique - + Namibia - + New Caledonia - + Niger - + Norfolk Island - + Nigeria - Nigeria + - + Nicaragua - + Netherlands - + Norway - Norge + - + Nepal - + Nauru - + Niue - + New Zealand - Nya Zeeland + - + Oman - + Panama - + Peru - Peru + - + French Polynesia - + Papua New Guinea - + Philippines - Filippinerna + - + Pakistan - + Poland - Polen + - + Saint Pierre and Miquelon - + Puerto Rico - + Portugal - Portugal + - + Palau - + Paraguay - + Qatar - + Reunion - + Romania - Rumänien + - + Russian Federation - + Rwanda - + Saudi Arabia - + Solomon Islands - + Seychelles - + Sudan - + Sweden - Sverige + - + Singapore - + Slovenia - + Svalbard and Jan Mayen - + Slovakia - + Sierra Leone - + San Marino - + Senegal - + Somalia - + Suriname - + Sao Tome and Principe - + El Salvador - + Syrian Arab Republic - + Swaziland - + Turks and Caicos Islands - + Chad - + French Southern Territories - + Togo - + Thailand - + Tajikistan - + Tokelau - + Turkmenistan - + Tunisia - + Tonga - - Could not decompress GeoIP database file. - - - - + Timor-Leste - + Bolivia, Plurinational State of - + Bonaire, Sint Eustatius and Saba - + Cote d'Ivoire - + Libya - + Saint Martin (French part) - + Macedonia, The Former Yugoslav Republic of - + Macao - + Pitcairn - + Palestine, State of - + Saint Helena, Ascension and Tristan da Cunha - + South Sudan - Sydsudan + - + Sint Maarten (Dutch part) - + Turkey - Turkiet + - + Trinidad and Tobago - + Tuvalu - + Taiwan - + Tanzania, United Republic of - + Ukraine - + Uganda - Uganda + - + United States Minor Outlying Islands - + United States - Förenta staterna + - + Uruguay - Uruguay + - + Uzbekistan - + Holy See (Vatican City State) - + Saint Vincent and the Grenadines - + Virgin Islands, British - + Virgin Islands, U.S. - + Vanuatu - + Wallis and Futuna - + Samoa - + Yemen - Jemen + - + Mayotte - + Serbia - + South Africa - + Zambia - + Montenegro - + Zimbabwe - + Aland Islands - + Guernsey - + Isle of Man - + Jersey - + Saint Barthelemy - + + Could not uncompress GeoIP database file. + + + + Couldn't save downloaded GeoIP database file. - + Successfully updated GeoIP database. - + Couldn't download GeoIP database file. Reason: %1 @@ -4592,12 +4126,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] UPnP / NAT-PMP-stöd [PÅ] - + UPnP / NAT-PMP support [OFF] UPnP / NAT-PMP-stöd [AV] @@ -4605,1535 +4139,1324 @@ Net::Smtp - + Email Notification Error: - E-postaviseringsfel: + OptionsDialog - + Options - Alternativ + - + Behavior - Beteende + - + Downloads - Hämtningar + Hämtningar - + Connection - Anslutning + Anslutning - + Speed - Hastighet + - + BitTorrent - BitTorrent - - - - RSS - RSS + - + Web UI - Webbgränssnitt + - + Advanced - Avancerat + - + Language - Språk + Språk - + User Interface Language: - Användargränsspråk: + - + (Requires restart) - (Kräver omstart) + - + Transfer List - Överföringslista + - + Confirm when deleting torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. - + Hide zero and infinity values - + Always - Alltid + Alltid - + Paused torrents only - + Action on double-click - + Downloading torrents: - - + + Start / Stop Torrent - Starta/Stoppa torrent + - - + + Open destination folder Öppna målmapp - - + + No action - Ingen åtgärd + - + Completed torrents: - Färdiga torrenter: + - + Desktop - Skrivbord + - + Start qBittorrent on Windows start up - + Show splash screen on start up - + Start qBittorrent minimized - Starta qBittorrent minimerad + - + Confirmation on exit when torrents are active - + Confirmation on auto-exit when downloads finish - - KiB - KiB - - - - Email notification &upon download completion - - - - - Run e&xternal program on torrent completion - - - - - IP Fi&ltering - - - - - Schedule &the use of alternative rate limits - - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - - - - &Torrent Queueing - - - - - Seed torrents until their seeding time reaches - - - - - A&utomatically add these trackers to new downloads: - - - - - RSS Reader - RSS-läsare - - - - Enable fetching RSS feeds - - - - - Feeds refresh interval: + + Show qBittorrent in notification area - - Maximum number of articles per feed: + + Minimize qBittorrent to notification area - - - min - minutes - min - - - - RSS Torrent Auto Downloader + + Close qBittorrent to notification area + i.e: The systray tray icon will still be visible when closing the main window. - - Enable auto downloading of RSS torrents + + Tray icon style: - - Edit auto downloading rules... - + + Normal + Normal - - Web User Interface (Remote control) + + Monochrome (Dark theme) - - IP address: - IP-adress: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. + + Monochrome (Light theme) - - Server domains: - Serverdomäner: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. + + File association - - &Use HTTPS instead of HTTP - &Använd HTTPS istället för HTTP - - - - Bypass authentication for clients on localhost + + Use qBittorrent for .torrent files - - Bypass authentication for clients in whitelisted IP subnets + + Use qBittorrent for magnet links - - IP subnet whitelist... + + Power Management - - Upda&te my dynamic domain name + + Inhibit system sleep when torrents are active - - Minimize qBittorrent to notification area - Minimera qBittorrent till aviseringsområdet - - - - Close qBittorrent to notification area - i.e: The systray tray icon will still be visible when closing the main window. - Stäng qBittorrent till aviseringsområdet - - - - Tray icon style: + + Log file - - Normal - Normal - - - - Monochrome (Dark theme) + + Save path: - - Monochrome (Light theme) + + Backup the log file after: - - File association - Filassociation - - - - Use qBittorrent for .torrent files - Använd qBittorrent för .torrent-filer - - - - Use qBittorrent for magnet links - Använd qBittorrent för magnetlänkar - - - - Power Management - Energihantering - - - - Save path: - Spara sökväg: - - - - Backup the log file after: + + MB - + Delete backup logs older than: - + days Delete backup logs older than 10 months - dagar + - + months Delete backup logs older than 10 months - månader + - + years Delete backup logs older than 10 years - år + - + When adding a torrent - + + Display torrent content and some options + + + + Bring torrent dialog to the front - + Do not start the download automatically The torrent will be added to download list in pause state - + Should the .torrent file be deleted after adding it - + + Delete .torrent files afterwards + + + + Also delete .torrent files whose addition was cancelled - + Also when addition is cancelled - + Warning! Data loss possible! - Varning! Dataförlust möjlig! + - + Saving Management - Sparar hantering + - + Default Torrent Management Mode: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - + Manual - Handbok + Manuellt - + Automatic - Automatisk + Automatiskt - + When Torrent Category changed: - + Relocate torrent - + Switch torrent to Manual Mode - + When Default Save Path changed: - - + + Relocate affected torrents - - + + Switch affected torrents to Manual Mode - + When Category changed: - + Use Subcategories - + Default Save Path: - + Keep incomplete torrents in: - + Copy .torrent files to: - - Show &qBittorrent in notification area - - - - - &Log file - &Loggfil - - - - Display &torrent content and some options - - - - - Create subfolder for torrents with multiple files - - - - - De&lete .torrent files afterwards - - - - + Copy .torrent files for finished downloads to: - + Pre-allocate disk space for all files - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding + + Append .!qB extension to incomplete files - - Append .!qB extension to incomplete files + + Automatically add torrents from: - - Enable recursive download dialog + + Add entry - - Automatically add torrents from: + + Remove entry - - Add entry + + Email notification upon download completion - - Remove entry + + Destination email: - + SMTP server: - SMTP-server: + - + This server requires a secure connection (SSL) - Den här servern kräver en säker anslutning (SSL) + - - + + + Authentication - Autentisering + - - - - + + + + Username: - Användarnamn: + Användarnamn: - - - - + + + + Password: - Lösenord: - - - - Enabled protocol: - Aktiverat protokoll: + Lösenord: - - TCP and μTP - TCP och μTP + + Run external program on torrent completion + - + Listening Port - Lyssningsport + - + Port used for incoming connections: - + Random - Slumpmässig + - + Use UPnP / NAT-PMP port forwarding from my router - + Use different port on each startup - + Connections Limits - + Maximum number of connections per torrent: - + Global maximum number of connections: - + Maximum number of upload slots per torrent: - Högsta antal sändningsplatser per torrent: + - + Global maximum number of upload slots: - Allmänt högsta antal sändningsplatser: + - + Proxy Server - Proxyserver + - + Type: - Typ: + - + (None) - (Inga) + - + SOCKS4 - SOCKS4 + - + SOCKS5 - SOCKS5 + - + HTTP - HTTP + - + Host: - Värd: + - - + + Port: - Port: + - + Otherwise, the proxy server is only used for tracker connections - + Use proxy for peer connections - + Disable connections not supported by proxies - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Mer information</a>) - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - + Use proxy only for torrents - - A&uthentication - A&utentisering - - - + Info: The password is saved unencrypted - - Filter path (.dat, .p2p, .p2b): + + IP Filtering - - Reload the filter + + Filter path (.dat, .p2p, .p2b): - - Manually banned IP addresses... + + Reload the filter - + Apply to trackers - + Global Rate Limits - - - - - - - KiB/s + + + Upload: - - - Upload: - Skickat: + + + + + KiB/s + KiB/s - - + + Download: - Hämtning: + - + Alternative Rate Limits - - + + Schedule the use of alternative rate limits + + + + From: from (time1 to time2) - Från: + - - + To: time1 to time2 - Till: + - + When: - När: + - + Every day - Varje dag + Varje dag - + Weekdays - Vardagar + - + Weekends - Helger + - + Rate Limits Settings - + Apply rate limit to peers on LAN - + Apply rate limit to transport overhead - - + + + Enable µTP protocol + + + + Apply rate limit to µTP protocol - + Privacy - Sekretess + - + Enable DHT (decentralized network) to find more peers - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers - + Look for peers on your local network - + Enable Local Peer Discovery to find more peers - + Encryption mode: - Krypteringsläge: + - + Prefer encryption - Föredra kryptering + - + Require encryption - Kräv kryptering + - + Disable encryption - Inaktivera kryptering + - + Enable when using a proxy or a VPN connection - + Enable anonymous mode - - Maximum active downloads: + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - Maximum active uploads: - Högsta aktiva sändningar: - - - - Maximum active torrents: + + Torrent Queueing - - Do not count slow torrents in these limits + + Maximum active downloads: - - Upload rate threshold: + + Maximum active uploads: - - Download rate threshold: + + Maximum active torrents: - - sec - seconds - sek - - - - Torrent inactivity timer: + + Do not count slow torrents in these limits - + Share Ratio Limiting - + Seed torrents until their ratio reaches - + then - + Pause them - Pausa dem + - + Remove them - Ta bort dem + + + + + Automatically add these trackers to new downloads: + - - RSS Smart Episode Filters + + Enable Web User Interface (Remote control) - + Use UPnP / NAT-PMP to forward the port from my router - + + Use HTTPS instead of HTTP + + + + Certificate: - Certifikat: + - + Import SSL Certificate - Importera SSL-certifikat + - + Key: - Nyckel: + - + Import SSL Key - Importera SSL-nyckel - - - - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information om certifikat</a> - - - - Use alternative Web UI - - Files location: + + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - - Enable clickjacking protection + + Bypass authentication for localhost - - Enable Cross-Site Request Forgery (CSRF) protection + + Update my dynamic domain name - + Service: - Tjänst: + - + Register - Registrera + - + Domain name: - Domännamn: + - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): - + %N: Torrent name - %N: Torrentnamn + - + %L: Category - %L: Kategori - - - - %G: Tags (seperated by comma) - %G: Taggar (separerade med kommatecken) + - + %F: Content path (same as root path for multifile torrent) - + %R: Root path (first torrent subdirectory path) - + %D: Save path - %D: Spara sökväg + - + %C: Number of files - %C: Antal filer + - + %Z: Torrent size (bytes) - %Z: Torrentstorlek (byte) + - + %T: Current tracker - %T: Aktuell spårare + - + %I: Info hash - %I: Info hash - - - - Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds + + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - + Select folder to monitor - Välj mapp för övervakning + - + Folder is already being monitored: - + Folder does not exist: - + Folder is not readable: - + Adding entry failed - - - - + + Choose export directory - - - + + + + + + Choose a save directory - + Choose an IP filter file - + All supported filters - Alla stödda filter + - + SSL Certificate - SSL-certifikat + + + + + SSL Key + - + Parsing error - + Failed to parse the provided IP filter - + Successfully refreshed - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Invalid key - Ogiltig nyckel + - + This is not a valid SSL key. - Detta är inte en giltig SSL-nyckel. + - + Invalid certificate - Ogiltigt certifikat - - - - Preferences - Inställningar - - - - Import SSL certificate - Importera SSL-certifikat + - + This is not a valid SSL certificate. - Detta är inte ett giltigt SSL-certifikat. - - - - Import SSL key - Importera SSL-nyckel - - - - SSL key - SSL-nyckel + - + Time Error - Tidsfel + - + The start time and the end time can't be the same. - Starttiden och sluttiden kan inte vara densamma. + - - + + Length Error - Längdfel + - + The Web UI username must be at least 3 characters long. - Webbanvändarnamnet måste vara minst 3 tecken långt. + - + The Web UI password must be at least 6 characters long. - Webbanvändarlösenordet måste vara minst 6 tecken långt. + PeerInfo - - Interested(local) and Choked(peer) + + interested(local) and choked(peer) - + interested(local) and unchoked(peer) - + interested(peer) and choked(local) - + interested(peer) and unchoked(local) - + optimistic unchoke - + peer snubbed - + incoming connection - inkommande anslutning + - + not interested(local) and unchoked(peer) - + not interested(peer) and unchoked(local) - + peer from PEX - nod från PEX + - + peer from DHT - nod från DHT + - + encrypted traffic - krypterad trafik + - + encrypted handshake - krypterad handskakning + - + peer from LSD - nod från LSD + PeerListWidget - + IP IP - + Port Port - + Flags Flaggor - + Connection Anslutning - + Client i.e.: Client application Klient - + Progress i.e: % downloaded Förlopp - + Down Speed i.e: Download speed Hämtningshastighet - + Up Speed i.e: Upload speed Sändningshastighet - + Downloaded i.e: total data downloaded Hämtat - + Uploaded i.e: total data uploaded Skickat - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Relevans - + Files i.e. files that are being downloaded right now - Filer + - + Column visibility - Kolumnsynlighet + Kolumnsynlighet - + Add a new peer... Lägg till en ny klient... - - + + Ban peer permanently Bannlys klient permanent - + Manually adding peer '%1'... - Lägger till nod "%1" manuellt... + - + The peer '%1' could not be added to this torrent. - + Manually banning peer '%1'... - Förbjuder nod "%1" manuellt... + - - + + Peer addition Lägg till klient - + Country - Land + - + Copy IP:port - Kopiera IP:port + - + Some peers could not be added. Check the Log for details. - + The peers were added to this torrent. - + Are you sure you want to ban permanently the selected peers? Är du säker på att du vill bannlysa de markerade klienterna permanent? - + &Yes &Ja - + &No &Nej - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - + PeersAdditionDlg - + No peer entered - + Please type at least one peer. - + Invalid peer - + The peer '%1' is invalid. @@ -6141,385 +5464,337 @@ PieceAvailabilityBar - + White: Unavailable pieces - Vit: Otillgängliga bitar + - + Blue: Available pieces - Blå: Tillgängliga bitar + PiecesBar - + Files in this piece: - Filer i denna bit: + - + File in this piece - Fil i denna bit + - + File in these pieces - Fil i dessa bitar - - - - Wait until metadata become available to see detailed information - + Hold Shift key for detailed information - PluginSelectDialog + PluginSelectDlg - + Search plugins - Sök efter insticksmoduler + - + Installed search plugins: - + Name - Namn + Namn - + Version - Version + - + Url - Webbadress + - - + + Enabled - Aktiverad - - - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - Du kan få nya sökmotorsinsticksmoduler här: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> + - + Install a new one - Installera en ny + - + Check for updates - Sök efter uppdateringar + - + Close - Stäng + - + Uninstall Avinstallera - - - + + + Yes Ja - - - - + + + + No Nej - + Uninstall warning - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Uninstall success - Avinstallering lyckades - - - - All selected plugins were uninstalled successfully - - - - - Search plugin update - Sök uppdatering för insticksmodul - - - - Plugins installed or updated: %1 + + All selected plugins were uninstalled successfully - - + + New search engine plugin URL - - + + URL: - Webbadress: + - + Invalid link - Ogiltig länk + - + The link doesn't seem to point to a search engine plugin. - + Select search plugins - + qBittorrent search plugin - + + + + Search plugin update + + + + All your plugins are already up to date. - + Sorry, couldn't check for plugin updates. %1 - + + + Search plugin install - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + + + + Couldn't install "%1" search engine plugin. %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + + + + Couldn't update "%1" search engine plugin. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Search plugin source: - + Local file - Lokal fil + - + Web link - Webblänk - - - - PowerManagement - - - qBittorrent is active - qBittorrent är aktiv + - PreviewSelectDialog + PreviewSelect - - Preview - Förhandsvisning - - - + Name Namn - + Size Storlek - + Progress Förlopp - - + + Preview impossible - Förhandsgranskning omöjlig + Förhandsvisning inte möjlig - - + + Sorry, we can't preview this file - Tyvärr, vi kan inte förhandsgranska den här filen - - - - Private::FileLineEdit - - - '%1' does not exist - '%1' finns inte - - - - '%1' does not point to a directory - - - - - '%1' does not point to a file - - - - - Does not have read permission in '%1' - - - - - Does not have write permission in '%1' - + Tyvärr, vi kan inte förhandsvisa den här filen PropListDelegate - + Not downloaded Inte hämtad - - + + Normal Normal (priority) Normal - - N/A - - - - + Do not download Do not download (priority) - Hämta inte + Hämta inte - - + + High High (priority) Hög - + Mixed Mixed (priorities Blandat - - + + Maximum Maximum (priority) - Högsta + Maximal PropTabBar - + General Allmänt - + Trackers Bevakare - + Peers Klienter - + HTTP Sources HTTP-källor - + Content Innehåll - + Speed - Hastighet + @@ -6563,7 +5838,7 @@ Seeds: - Distribueringar: + Distributörer: @@ -6611,22 +5886,22 @@ Kommentar: - + Select All Markera allt - + Select None Markera ingen - + Normal Normal - + High Hög @@ -6648,7 +5923,7 @@ Total Size: - Storlek totalt: + Total storlek: @@ -6686,165 +5961,165 @@ Sökväg att spara i: - + Maximum - Högsta + Maximal + - Do not download Hämta inte - + Never Aldrig - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) - %1 x %2 (har %3) + - - + + %1 (%2 this session) - %1 (%2 denna session) + - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - %1 (distribuerad för %2) + - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) - %1 (%2 max) + - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) - %1 (%2 totalt) + - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) - + Open Öppna - + Open Containing Folder Öppna innehållande katalog - + Rename... Byt namn... - + Priority Prioritet - + New Web seed Ny webbdistribution - + Remove Web seed Ta bort webbdistribution - + Copy Web seed URL Kopiera webbdistributions URL - + Edit Web seed URL Ändra webbdistributions URL - + + Rename the file + Byt namn på filen + + + New name: Nytt namn: - - + + + The file could not be renamed + Det gick inte att byta namn på filen + + + + This file name contains forbidden characters, please choose a different one. + Detta filnamn innehåller förbjudna tecken. Välj ett annat filnamn. + + + + This name is already in use in this folder. Please use a different name. Detta namn används redan i denna mapp. Använd ett annat namn. - + The folder could not be renamed Det gick inte att byta namn på mappen - + qBittorrent qBittorrent - + Filter files... Filtrera filer... - - Renaming - Byter namn - - - - - Rename error - Fel vid namnbyte - - - - The name is empty or contains forbidden characters, please choose a different one. - Namnet är tomt eller innehåller förbjudna tecken, vänligen välj ett annat filnamn. - - - + New URL seed New HTTP source Ny URL-distribution - + New URL seed: Ny URL-distribution: - - + + This URL seed is already in the list. Den här URL-distributionen finns redan i listan. - + Web seed editing Webbdistributionredigering - + Web seed URL: URL för webbdistribution: @@ -6852,859 +6127,818 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + + + + + Error: '%1' is not a valid torrent file. + + + + + + Error: Could not add torrent to session. + + + + + I/O Error: Could not create temporary file. + I/O-fel: Kunde inte skapa temporär fil. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 är en okänd parameter - - + + %1 must be the single command line parameter. - + + %1 must specify the correct port (1 to 65535). + %1 måste ange korrekt port (1 to 65535). + + + You cannot use %1: qBittorrent is already running for this user. Du kan inte använda %1: qBittorrent körs redan för denna användare. - + Usage: Användning: - + Options: Alternativ: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - + + Displays program version + Visar programversionen - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - + + Displays this help message + Visar detta hjälpmeddelande - - Expected integer number in environment variable '%1', but got '%2' + + Changes the Web UI port (current: %1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - - - - - Expected %1 in environment variable '%2', but got '%3' - - - - - port - port - - - - %1 must specify a valid port (1 to 65535). - - - - - Display program version and exit - - - - - Display this help message and exit - - - - - Change the Web UI port - - - - + Disable splash screen Inaktivera startbilden - + Run in daemon-mode (background) Kör i demonläge (i bakgrunden) - - dir - Use appropriate short form or abbreviation of "directory" - - - - - Store configuration files in <dir> - Spara konfigurationsfiler i <dir> - - - - - name - namn - - - - Store configuration files in directories qBittorrent_<name> - - - - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - - - - - files or URLs - filer eller webbadresser - - - - Download the torrents passed by the user - - - - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - - - - - Options when adding new torrents: - - - - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Genväg för %1 - - - - path - sökväg - - - - Torrent save path - - - - - Add torrents as started or paused - Lägg till torrenter som startade eller pausade - - - - Skip hash check - Hoppa över hash kontroll - - - - Assign torrents to category. If the category doesn't exist, it will be created. - - - - - Download files in sequential order - - - - - Download first and last pieces first - Hämta första och sista bitarna först - - - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - - - - - Command line parameters take precedence over environment variables - + + Downloads the torrents passed by the user + Hämtar de torrenter som skickats av användaren - + Help Hjälp - + Run application with -h option to read about command line parameters. Kör applikationen med -h optionen för att läsa om kommando parametrar. - + Bad command line Ogiltig kommandorad - + Bad command line: Ogiltig kommandorad: - + Legal Notice Juridisk information - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - - - - - No further notices will be issued. - - - - + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. No further notices will be issued. - qBittorrent är ett fildelarprogram. När du kör en torrent så kommer dess data att göras tillgängligt för andra genom sändning. Och så klart, allt innehåll som du delar ut är fullständigt på ditt ansvar. + qBittorrent är ett fildelarprogram. När du kör en torrent så kommer dess data att göras tillgängligt för andra. Och så klart, allt innehåll som du delar ut är fullständigt på ditt ansvar. Detta meddelande kommer inte att visas igen. - + Press %1 key to accept and continue... Tryck på %1-tangenten för att godkänna och fortsätta... - + Legal notice Juridisk information - + Cancel Avbryt - + I Agree Jag godkänner - - - Upgrade - Uppgradera + + Torrent name: %1 + - - You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] + + Torrent size: %1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. + + Save path: %1 - - Couldn't migrate torrent with hash: %1 + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds - - Couldn't migrate torrent. Invalid fastresume file name: %1 + + Thank you for using qBittorrent. - - Detected unclean program exit. Using fallback file to restore settings: %1 + + [qBittorrent] '%1' has finished downloading - - An access error occurred while trying to write the configuration file. + + The remote host name was not found (invalid hostname) - - A format error occurred while trying to write the configuration file. + + The operation was canceled - - An unknown error occurred while trying to write the configuration file. + + The remote server closed the connection prematurely, before the entire reply was received and processed - - - RSS::AutoDownloader - - - Invalid data format. + + The connection to the remote server timed out - - Couldn't save RSS AutoDownloader data in %1. Error: %2 + + SSL/TLS handshake failed - - Invalid data format + + The remote server refused the connection - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 + + The connection to the proxy server was refused - - Couldn't load RSS AutoDownloader rules. Reason: %1 + + The proxy server closed the connection prematurely - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 + + The proxy host name was not found - - RSS feed at '%1' updated. Added %2 new articles. + + The connection to the proxy timed out or the proxy did not reply in time to the request sent - - Failed to parse RSS feed at '%1'. Reason: %2 + + The proxy requires authentication in order to honor the request but did not accept any credentials offered - - Couldn't read RSS Session data from %1. Error: %2 + + The access to the remote content was denied (401) - - Couldn't parse RSS Session data. Error: %1 + + The operation requested on the remote content is not permitted - - Couldn't load RSS Session data. Invalid data format. + + The remote content was not found at the server (404) - - Couldn't load RSS article '%1#%2'. Invalid data format. + + The remote server requires authentication to serve the content but the credentials provided were not accepted - - - RSS::Private::Parser - - Invalid RSS feed. - Ogiltigt RSS-flöde. + + The Network Access API cannot honor the request because the protocol is not known + - - %1 (line: %2, column: %3, offset: %4). + + The requested operation is invalid for this protocol + + + + + An unknown network-related error was detected + + + + + An unknown proxy-related error was detected + + + + + An unknown error related to the remote content was detected + + + + + A breakdown in protocol was detected + + + + + Unknown error + + + + + + Upgrade - - - RSS::Session - - RSS feed with given URL already exists: %1. + + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - - Cannot move root folder. - Det går inte att flytta root-mapp. + + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. + - - - Item doesn't exist: %1. - Artikeln existerar inte: %1. + + Couldn't migrate torrent with hash: %1 + - - Cannot delete root folder. - Kan inte radera root-mapp. + + Couldn't migrate torrent. Invalid fastresume file name: %1 + - - Incorrect RSS Item path: %1. + + Detected unclean program exit. Using fallback file to restore settings. - - RSS item with given path already exists: %1. + + An access error occurred while trying to write the configuration file. - - Parent folder doesn't exist: %1. + + A format error occurred while trying to write the configuration file. - RSSWidget + RSS - + Search Sök - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - - - - + New subscription Ny prenumeration - - - + + + Mark items read - Märk som läst + Markera objekt som lästa - - Refresh RSS streams - Uppdatera RSS-flöden - - - + Update all Uppdatera alla - + RSS Downloader... - RSS-hämtare... + RSS-hämtning... + + + + Settings... + Inställningar... - + Torrents: (double-click to download) - Torrenter: (dubbelklicka för att hämta) + - - + + Delete Ta bort - + Rename... Byt namn... - + Rename Byt namn - - + + Update Uppdatera - + New subscription... Ny prenumeration... - - + + Update all feeds - Uppdatera alla flöden + Uppdatera alla kanaler - + Download torrent Hämta torrent - + Open news URL - + Öppna URL för nyheter - + Copy feed URL - + Kopera URL för kanal - + New folder... Ny mapp... - - Please choose a folder name - + + Refresh RSS streams + Uppdatera RSS-kanaler + + + RSSImp - - Folder name: - Mappnamn + + Stream URL: + URL för kanal: - - New folder - Ny mapp + + Please type a RSS stream URL + - - Please type a RSS feed URL + + This RSS feed is already in the list. - - Feed URL: - + + Please choose a folder name + Välj ett mappnamn + + + + Folder name: + Mappnamn: + + + + New folder + Ny mapp - + Deletion confirmation - Borttagningsbekräftelse + - + Are you sure you want to delete the selected RSS feeds? - Är du säker på att du vill ta bort de valda RSS-flödena? + - + Please choose a new name for this RSS feed - Välj ett nytt namn för detta RSS-flöde + Välj ett nytt namn för denna RSS-kanal - + New feed name: - Nytt namn på flöde: + Nytt kanalnamn: - - Rename failed - Byt namn misslyckades + + Name already in use + Namnet används redan - + + This name is already used by another item, please choose another one. + Detta namn används redan av ett annat objekt. Välj ett annat namn. + + + Date: - Datum: + Datum: - + Author: - Författare: + Upphovsman: + + + + Unread + Oläst - ScanFoldersDelegate + Rss::Feed - - Select save location - Välj spara plats + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + - ScanFoldersModel + Rss::Private::Parser - - Monitored Folder - Övervakad mapp + + Invalid RSS feed. + + + + RssSettingsDlg - - Override Save Location - Åsidosätt spara plats + + RSS Reader Settings + Inställningar för RSS-läsare - - Monitored folder - Övervakad mapp + + RSS feeds refresh interval: + Uppdateringsintervall för RSS-kanaler: - - Default save location - Standard spara plats + + min + - - Browse... - Bläddra... + + Maximum number of articles per feed: + Maximalt antal inlägg per RSS-kanal: - SearchJobWidget + ScanFoldersDelegate - - Form + + Select save location + + + ScanFoldersModel - - Results(xxx) - Resultat(xxx) + + Monitored Folder + - - Search in: - Sök i: + + Override Save Location + - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + + Monitored folder - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + + Default save location - - Seeds: - Distribueringar: + + Browse... + Bläddra... + + + SearchEngine - - <html><head/><body><p>Minimal number of seeds</p></body></html> + + Unknown search engine plugin file format. - - - to + + A more recent version of this plugin is already installed. - - <html><head/><body><p>Maximal number of seeds</p></body></html> + + + Plugin is not supported. - - - - + + Update server is temporarily unavailable. %1 + - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + + + Failed to download the plugin file. %1 - - Size: - Storlek: + + An incorrect update info received. + - - <html><head/><body><p>Minimal torrent size</p></body></html> - + + All categories + Alla kategorier - - <html><head/><body><p>Maximal torrent size</p></body></html> - + + Movies + Filmer + + + + TV shows + TV-program + + + + Music + Musik + + + + Games + Spel + + + + Anime + Anime + + + + Software + Programvara + + + + Pictures + Bilder + + + + Books + Böcker + + + + SearchListDelegate + + + + Unknown + Okänt + + + SearchTab - + Name i.e: file name Namn - + Size i.e: file size Storlek - + Seeders i.e: Number of full sources Distributörer - + Leechers i.e: Number of partial sources - + Reciprokörer - + Search engine Sökmotor - - Filter search results... - Filtrera sökresultat... - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Torrent names only - + Everywhere - Överallt - - - - Use regular expressions - Använd reguljära uttryck + - + Searching... - Söker... + - + Search has finished Sökningen är färdig - + Search aborted - + An error occurred during search... - + Search returned no results - + Column visibility Kolumnsynlighet - - - SearchPluginManager - - - Unknown search engine plugin file format. - Okänd sökmotor insticksmodulsfilformat. - - - - A more recent version of this plugin is already installed. - En senare version av den här insticksmodulen är redan installerad. - - - - Plugin is not supported. - Insticksmodul stöds inte. + + Form + - - All categories - Alla kategorier + + Results(xxx) + - - Movies - Filmer + + Search in: + - - TV shows - Tv program + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + - - Music - Musik + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + - - Games - Spel + + Seeds: + Distributörer: - - Anime - Animerat + + <html><head/><body><p>Minimal number of seeds</p></body></html> + - - Software - Mjukvara + + + to + till - - Pictures - Bilder + + <html><head/><body><p>Maximal number of seeds</p></body></html> + - - - Books - Böcker + + + + + - - Update server is temporarily unavailable. %1 - Uppdateringsserveren är tillfälligt otillgänglig. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + - - - Failed to download the plugin file. %1 - + + Size: + Storlek: - - An incorrect update info received. + + <html><head/><body><p>Minimal torrent size</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> @@ -7713,197 +6947,185 @@ - - - - + + + Search Sök - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - - + Download - Hämta + Hämta - + Go to description page - Gå till beskrivningssidan + - + Copy description page URL - Kopiera beskrivningssidans URL + - + Search plugins... - Sök insticksmodul... + - + A phrase to search for. - En fras att söka efter. + - + Spaces in a search term may be protected by double quotes. - + Example: Search phrase example - Exempel: + - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - + All plugins - Alla insticksmoduler + - + Only enabled - Endast aktiverade + - + Select... - Välj... + - - - + + + Search Engine - Sökmotor + - + Please install Python to use the Search Engine. - Installera Python för att använda sökmotorn. + - + Empty search pattern - + Please type a search pattern first - + Stop - Stoppa + - + Search has finished Sökningen är färdig - + Search has failed Sökningen misslyckades - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + E&xit Now - + Exit confirmation - + Bekräfta vid avslut - + The computer is going to shutdown. - + &Shutdown Now - - Shutdown confirmation - - - - + The computer is going to enter suspend mode. - + &Suspend Now - + Suspend confirmation - + The computer is going to enter hibernation mode. - + &Hibernate Now - + Hibernate confirmation - + You can cancel the action within %1 seconds. + + + Shutdown confirmation + Bekräfta avstängning + SpeedLimitDialog - + KiB/s KiB/s @@ -7911,52 +7133,52 @@ SpeedPlotView - + Total Upload - Skickat totalt + - + Total Download - Hämtat totalt + - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - DHT skickat + - + DHT Download - DHT hämtat + - + Tracker Upload - Sändning för bevakare + - + Tracker Download @@ -7964,91 +7186,83 @@ SpeedWidget - + Period: - Period: + - + 1 Minute - 1 minut + 1 Minut - + 5 Minutes - 5 minuter + 5 Minuter - + 30 Minutes - 30 minuter + 30 Minuter - + 6 Hours 6 Timmar - + Select Graphs - Välj grafer + - + Total Upload - Skickat totalt + - + Total Download - Hämtat totalt + - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - DHT skickat + - + DHT Download - DHT hämtat + - + Tracker Upload - Sändning för bevakare - - - - Tracker Download - - - StacktraceDialog - - Crash info + + Tracker Download @@ -8065,49 +7279,49 @@ Användarstatistik - - Cache statistics - Cache Statistik + + Total peer connections: + - - Read cache hits: - + + Global ratio: + Global ratio: - - Average time in queue: - Genomsnittlig tid i kö: + + Alltime download: + All nedladdning: - - Connected peers: - Anslutna noder: + + Alltime upload: + All uppladdning: - - All-time share ratio: + + Total waste (this session): - - All-time download: - + + Cache statistics + Cache Statistik - - Session waste: + + Read cache hits: - - All-time upload: + + Average time in queue: - Total buffer size: - + Total buffers size: + Total buffer storlek: @@ -8132,39 +7346,49 @@ Total queued size: - Köstorlek totalt: + Total köstorlek: + + + + OK + OK - + %1 ms 18 milliseconds - %1 ms + StatusBar - + Connection status: Anslutningsstatus: - + No direct connections. This may indicate network configuration problems. Inga direktanslutningar. Detta kan betyda problem med nätverkskonfigurationen. - + DHT: %1 nodes DHT: %1 noder - - qBittorrent needs to be restarted! - qBittorrent behöver startas om! + + qBittorrent needs to be restarted + qBittorrent behöver startas om + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent har uppdaterats och behöver startas om för att ändringarna ska bli aktiva. @@ -8183,1567 +7407,1309 @@ Ansluten - + Click to switch to alternative speed limits Klicka för att växla till alternativa hastighetsgränser - + Click to switch to regular speed limits Klicka för att växla till vanliga hastighetsgränser - + + Manual change of rate limits mode. The scheduler is disabled. + + + + Global Download Speed Limit Allmän hastighetsgräns för hämtning - + Global Upload Speed Limit Allmän hastighetsgräns för sändning - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter Alla (0) - + Downloading (0) Hämtar (0) - + Seeding (0) - Distributerar (0) + Distribuerar (0) - + Completed (0) - Färdig (0) + Färdiga (0) - + Resumed (0) - Återupptagna (0) + Återupptagen (0) - + Paused (0) - Pausade (0) + Pausad (0) - + Active (0) Aktiva (0) - + Inactive (0) Inaktiva (0) - + Errored (0) - Med fel (0) + - + All (%1) Alla (%1) - + Downloading (%1) Hämtar (%1) - + Seeding (%1) - Distributerar (%1) + Distribuerar (%1) - + Completed (%1) Färdiga (%1) - + Paused (%1) - Pausade (%1) + Pausad (%1) - + Resumed (%1) Återupptagna (%1) - + Active (%1) Aktiva (%1) - + Inactive (%1) Inaktiva (%1) - + Errored (%1) - Med fel (%1) + - TagFilterModel + TorrentContentModel - - Tags - Taggar + + Name + Namn - - All - Alla + + Size + Storlek - - Untagged - Otaggade + + Progress + Förlopp - - - TagFilterWidget - - Add tag... - Lägg till tagg... + + Download Priority + Hämtningsprioritet - - Remove tag - Ta bort tagg + + Remaining + Återstår + + + TorrentCreatorDlg - - Remove unused tags - Ta bort oanvända taggar + + Select a folder to add to the torrent + Välj en mapp att lägga till i torrent-filen - - Resume torrents - Återuppta torrenter + + Select a file to add to the torrent + Välj en fil att lägga till i torrent-filen - - Pause torrents - Pausa torrenter + + No input path set + Ingen sökväg inställd för indata - - Delete torrents - Ta bort torrenter + + Please type an input path first + Ange en sökväg för indata först - - New Tag - Ny tagg + + Select destination torrent file + Välj mål för torrent-fil - - Tag: - Tagg: + + Torrent Files (*.torrent) + Torrent-filer (*.torrent) - - Invalid tag name - Ogiltigt taggnamn + + Torrent was created successfully: %1 + %1 is the path of the torrent + - - Tag name '%1' is invalid - Taggnamn '%1' är ogiltigt + + + + Torrent creation + Skapa torrent - - Tag exists - Tagg finns + + Torrent creation was unsuccessful, reason: %1 + Skapandet av torrent-fil misslyckades. Anledning: %1 - - Tag name already exists. - Taggnamn finns redan. + + Created torrent file is invalid. It won't be added to download list. + Den skapade torrentfilen är ogiltig. Den kommer inte att läggas till i hämtningslistan. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Torrent-kategori egenskaper + + Name + i.e: torrent name + Namn - - Name: - Namn: + + Size + i.e: torrent size + Storlek - - Save path: - Spara sökväg: + + Done + % Done + Färdig - - Choose save path - Välj spara sökväg - - - - New Category - Ny kategori - - - - Invalid category name - Ogiltigt kategorinamn - - - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - - - - - Category creation error - - - - - Category with the given name already exists. -Please choose a different name and try again. - - - - - TorrentContentModel - - - Name - Namn - - - - Size - Storlek - - - - Progress - Förlopp - - - - Download Priority - Hämtningsprioritet - - - - Remaining - Återstår - - - - Availability - Tillgänglighet - - - - TorrentCreatorDialog - - - Torrent Creator - Torrent-skapare - - - - Select file/folder to share - Välj fil/mapp att dela - - - - Path: - Sökväg: - - - - [Drag and drop area] - [Dra och släpp område] - - - - - Select file - Välj fil - - - - - Select folder - Välj mapp - - - - Settings - Inställningar - - - - Piece size: - - - - - Auto - Automatisk - - - - 16 KiB - 16 KiB - - - - 32 KiB - 32 KiB - - - - 64 KiB - 64 KiB - - - - 128 KiB - 128 KiB - - - - 256 KiB - 256 KiB - - - - 512 KiB - 512 KiB - - - - 1 MiB - 1 MiB - - - - 2 MiB - 2 MiB - - - - 4 MiB - 4 MiB - - - - 8 MiB - 8 MiB - - - - 16 MiB - 16 MiB - - - - 32 MiB - 32 MiB - - - - Calculate number of pieces: - - - - - Private torrent (Won't distribute on DHT network) - - - - - Start seeding immediately - - - - - Ignore share ratio limits for this torrent - - - - - Optimize alignment - - - - - Fields - Fält - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - - - - Web seed URLs: - - - - - Tracker URLs: - - - - - Comments: - Kommentarer: - - - - Source: - Källa: - - - - Progress: - Förlopp: - - - - Create Torrent - Skapa torrent - - - - - - Torrent creation failed - Torrent skapande misslyckades - - - - Reason: Path to file/folder is not readable. - Orsak: Sökväg till fil/mapp är inte läsbar. - - - - Select where to save the new torrent - Välj var du vill spara den nya torrenten + + Status + Torrent status (e.g. downloading, seeding, paused) + Status - - Torrent Files (*.torrent) - Torrentfiler (*.torrent) + + Seeds + i.e. full sources (often untranslated) + Distributörer - - Reason: %1 - Orsak: %1 + + Peers + i.e. partial sources (often untranslated) + Klienter - - Reason: Created torrent is invalid. It won't be added to download list. - + + Down Speed + i.e: Download speed + Hämtningshastighet - - Torrent creator - + + Up Speed + i.e: Upload speed + Sändningshastighet - - Torrent created: - + + Ratio + Share ratio + Förhållande - - - TorrentInfo - - File size exceeds max limit %1 - + + ETA + i.e: Estimated Time of Arrival / Time left + Färdig om - - Torrent file read error: %1 - + + Category + Kategori - - Torrent file read error: size mismatch - + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Lades till - - - TorrentsController - - Not contacted yet - Inte kontaktade ännu + + Completed On + Torrent was completed on 01/01/2010 08:00 + Färdigställdes - - Updating... - Uppdaterar... + + Tracker + Bevakare - - Working - Arbetar + + Down Limit + i.e: Download limit + Hämtningsgräns - - Not working - Arbetar inte + + Up Limit + i.e: Upload limit + Sändningsgräns - - Error: '%1' is not a valid torrent file. - + + Downloaded + Amount of data downloaded (e.g. in MB) + Hämtat - - - - - Torrent queueing must be enabled - + + Uploaded + Amount of data uploaded (e.g. in MB) + Skickat - - Save path cannot be empty + + Session Download + Amount of data downloaded since program open (e.g. in MB) - - - Category cannot be empty + + Session Upload + Amount of data uploaded since program open (e.g. in MB) - - Unable to create category - + + Remaining + Amount of data left to download (e.g. in MB) + Återstår - - Unable to edit category - + + Time Active + Time (duration) the torrent is active (not paused) + Tid aktiv - Save path is empty - Spara sökväg är tom + + Save path + Torrent save path + Sökväg att spara i - - Cannot make save path - + + Completed + Amount of data completed (e.g. in MB) + Färdiga - - Cannot write to directory - + + Ratio Limit + Upload share ratio limit + Förhållandegräns - - WebUI Set location: moving "%1", from "%2" to "%3" - + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Sågs senast fullständig - - Incorrect torrent name - + + Last Activity + Time passed since a chunk was downloaded/uploaded + Senast aktivitet - - - Incorrect category name - + + Total Size + i.e. Size including unwanted data + Total storlek TrackerFiltersList - + All (0) this is for the tracker filter Alla (0) - + Trackerless (0) Bevakarlös (0) - + Error (0) Fel (0) - + Warning (0) Varning (0) - - + + Trackerless (%1) Bevakarlös (%1) - - + %1 (%2) + openbittorrent.com (10) + %1 (%2) + + + + Error (%1) Fel (%1) - - + + Warning (%1) Varning (%1) - + Resume torrents - Återuppta torrenter + Återuppta torrentfiler - + Pause torrents - Pausa torrenter + Gör paus i torrentfiler - + Delete torrents - Ta bort torrenter + Ta bort torrentfiler - - + + All (%1) this is for the tracker filter Alla (%1) - TrackerListWidget + TrackerList + + + URL + URL + - - + + Status + Status + + + + Received + + + + + Seeds + Distributörer + + + + Peers + Klienter + + + + Downloaded + + + + + Message + Meddelande + + + + Working - Arbetar + Fungerar - + Disabled Inaktiverad - + This torrent is private - + Denna torrent-fil är privat - + Updating... - Uppdaterar... + Uppdaterar... - + Not working - Arbetar inte + Fungerar inte - + Not contacted yet - Inte kontaktade ännu + Inte kontaktad ännu - - - - - - - N/A - + + Tracker URL: + URL för bevakare: - + Tracker editing - - - - - Tracker URL: - + Redigera bevakare - - + + Tracker editing failed - + Redigering av bevakare misslyckades - + The tracker URL entered is invalid. - + Angiven URL för bevakaren är ogiltig. - + The tracker URL already exists. - + Bevakarens URL finns redan. - + Add a new tracker... - Lägg till ny bevakare... - - - - Remove tracker - Ta bort bevakare + Lägg till en ny bevakare... - + Copy tracker URL - + Edit selected tracker URL - + Ändra markerad bevakares URL - + Force reannounce to selected trackers - + Tvinga återannonsering till markerade bevakare - + Force reannounce to all trackers - - - - - URL - Webbadress - - - - Status - Tillstånd - - - - Received - Mottaget - - - - Seeds - Delningar - - - - Peers - Noder - - - - Downloaded - Hämtat - - - - Message - Meddelande + Tvinga återannonsering till alla bevakare - - Column visibility - Kolumnsynlighet + + Remove tracker + Ta bort bevakare - TrackerLoginDialog - - - - Tracker authentication - - - - - Tracker: - Bevakare: - - - - Login - Logga in - + TrackersAdditionDlg - - Username: - Användarnamn: - - - - Password: - Lösenord: + + Trackers addition dialog + Lägg till bevakare - - Log in - Logga in + + List of trackers to add (one per line): + Lista över bevakare att lägga till (en per rad): - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + URL för µTorrent-kompatibel lista: - - List of trackers to add (one per line): - + + I/O Error + In-/ut-fel - - µTorrent compatible list URL: - + + Error while trying to open the downloaded file. + Fel vid försök att öppna den hämtade filen. - + No change Ingen ändring - + No additional trackers were found. - + Inga ytterligare bevakare hittades. - + Download error Hämtningsfel - + The trackers list could not be downloaded, reason: %1 - + Listan över bevakare kunde inte hämtas. Anledning: %1 TransferListDelegate - + Downloading Hämtar - + Downloading metadata used when loading a magnet link Hämtar metadata - + Allocating qBittorrent is allocating the files on disk Allokerar - + Paused Pausad - + Queued i.e. torrent is queued Kölagd - + Seeding Torrent is complete and in upload-only mode Distribuerar - + Stalled Torrent is waiting for download to begin Avstannad - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] Laddar ner - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] Distribuerar - + Checking Torrent local data is being checked Kontrollerar - + Queued for checking i.e. torrent is queued for hash checking - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - + Completed Färdiga - - Moving - Torrent local data are being moved/relocated - Flyttar - - - + Missing Files Saknade filer - + Errored torrent status, the torrent has an error - Felaktiga + - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - %1 (distribuerad för %2) - - - - %1 ago - e.g.: 1h 20m ago - %1 sedan - - - - TransferListFiltersWidget - - - Status - Status - - - - Categories - Kategorier - - - - Tags - Taggar - - - - Trackers - Bevakare - - - - TransferListModel - - - Name - i.e: torrent name - Namn - - - - Size - i.e: torrent size - Storlek - - - - Done - % Done - Färdig - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Tillstånd - - - - Seeds - i.e. full sources (often untranslated) - Distributeringar - - - - Peers - i.e. partial sources (often untranslated) - Noder - - - - Down Speed - i.e: Download speed - Hämtningshastighet - - - - Up Speed - i.e: Upload speed - Sändningshastighet - - - - Ratio - Share ratio - Förhållande - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - Kategori - - - - Tags - Taggar - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - Bevakare - - - - Down Limit - i.e: Download limit - Hämtningsgräns - - - - Up Limit - i.e: Upload limit - Sändningsgräns - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Hämtat - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Sänt - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - Återstår - - - - Time Active - Time (duration) the torrent is active (not paused) - - - - - Save path - Torrent save path - Spara sökväg - - - - Completed - Amount of data completed (e.g. in MB) - Färdiga - - - - Ratio Limit - Upload share ratio limit - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + %1 ago + e.g.: 1h 20m ago + %1 sedan + + + TransferListFiltersWidget - - Last Activity - Time passed since a chunk was downloaded/uploaded - + + Status + Status - - Total Size - i.e. Size including unwanted data - Total storlek + + Categories + Kategorier + + + + Trackers + Bevakare TransferListWidget - + Column visibility Kolumnsynlighet - + Choose save path Välj sökväg att spara i - + Torrent Download Speed Limiting Hastighetsgräns för torrenthämtning - + Torrent Upload Speed Limiting Hastighetsgräns för torrentsändning - + Recheck confirmation Bekräftelse om återkontroll - + Are you sure you want to recheck the selected torrent(s)? - + Rename Byt namn - + New name: Nytt namn: - + Resume Resume/start the torrent Återuppta - + Force Resume Force Resume/start the torrent Tvinga Återupptagning - + Pause Pause the torrent Gör paus - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - - - - - Add Tags - Lägg till taggar - - - - Remove All Tags - Ta bort alla taggar - - - - Remove all tags from selected torrents? - Ta bort alla taggar från valda torrenter? + + New Category + Ny Kategori - - Comma-separated tags: - Kommaseparerade taggar: + + Category: + Kategori: - - Invalid tag - Ogiltig tagg + + Invalid category name + Ogiltigt kategorinamn - - Tag name: '%1' is invalid - Taggnamn: '%1' är ogiltig + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + - + Delete Delete the torrent Ta bort - + Preview file... Förhandsgranska fil... - + Limit share ratio... Begränsa utdelningsförhållande... - + Limit upload rate... Begränsa sändningshastighet... - + Limit download rate... Begränsa hämtningshastighet... - + Open destination folder Öppna målmapp - + Move up i.e. move up in the queue Flytta uppåt - + Move down i.e. Move down in the queue Flytta nedåt - + Move to top i.e. Move to top of the queue Flytta överst - + Move to bottom i.e. Move to bottom of the queue Flytta nederst - + Set location... Ange plats... - - Force reannounce - - - - + Copy name Kopiera namn - - Copy hash - Kopiera hash - - - + Download first and last pieces first - Hämta första och sista bitarna först + - + Automatic Torrent Management - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - Automatiskt läge betyder att vissa torrentegenskaper (t.ex. var filen ska sparas) bestäms av filens kategori + - + Category Kategori - + New... New category... Ny... - + Reset Reset category Återställ - - Tags - Taggar - - - - Add... - Add / assign multiple tags... - Lägg till... - - - - Remove All - Remove all tags - Ta bort alla - - - + Priority Prioritet - + Force recheck Tvinga återkontroll - + Copy magnet link Kopiera magnetlänk - + Super seeding mode Superdistributionsläge - + Rename... Byt namn... - + Download in sequential order Hämta i sekventiell ordning - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + Gränser för sändning/hämtning - - Use global share limit - + + Use global ratio limit + Använd allmän förhållandegräns - - - + + + buttonGroup + knappGrupp + + + + Set no ratio limit + Ställ inte in någon förhållandegräns + + + + Set ratio limit to + Ställ in förhållandegräns till + + + + WebApplication + + + Incorrect category name + + + + + WebUI + + + The Web UI is listening on port %1 - - Set no share limit + + Web UI Error - Unable to bind Web UI to port %1 + + + about - - Set share limit to + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - ratio - förhållande + + Copyright %1 2006-2016 The qBittorrent project + - - minutes - minuter + + Home Page: + Hemsida: - - No share limit method selected + + Forum: - - Please select a limit method first + + Bug Tracker: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 + + Add Peers - - Python not detected + + List of peers to add (one per line): + + + + + Format: IPv4:port / [IPv6]:port - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - + + + Tracker authentication + Autentisering för bevakare - - Symlinks inside alternative UI folder are forbidden. - + + Tracker: + Bevakare: - - Exceeded the maximum allowed file size (%1)! - + + Login + Inloggning - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - + + Username: + Användarnamn: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - + + Password: + Lösenord: + + + + Log in + Logga in + + + + Cancel + Avbryt + + + + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + Bekräfta borttagning - qBittorrent + + + + Remember choice + Kom ihåg mitt val + + + + Also delete the files on the hard disk + Ta även bort filerna på hårddisken + + + + confirmShutdownDlg + + + Don't show again + Visa inte igen + + + + createTorrentDialog + + + Cancel + Avbryt + + + + Torrent Creation Tool + Verktyg för att skapa torrent + + + + Torrent file creation + Skapa torrent-fil + + + + Add file + Lägg till fil + + + + Add folder + Lägg till mapp + + + + File or folder to add to the torrent: + Fil eller mapp att lägga till i torrent: + + + + Tracker URLs: + URL:er för bevakare: + + + + Web seeds urls: + URL:er för webbdistribution: + + + + Comment: + Kommentar: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' + + Piece size: + Delstorlek: + + + + 16 KiB + 512 KiB {16 ?} + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 4 MiB {8 ?} + + + + 16 MiB + 4 MiB {16 ?} + + + + Auto + Automatiskt + + + + Private (won't be distributed on DHT network if enabled) + Privat (kommer inte att distribueras på DHT-nätverk om aktiverat) + + + + Start seeding after creation + Börja distribuera efter den skapats + + + + Ignore share ratio limits for this torrent + + + Create and save... + Skapa och spara... + + + + Progress: + Förlopp: + - WebUI + downloadFromURL - - Web UI: HTTPS setup successful - Webbgränssnitt: HTTPS-inställningen lyckades + + Add torrent links + Lägg till torrentlänkar + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + + + + + Download + Hämta - - Web UI: HTTPS setup failed, fallback to HTTP - Webgränssnitt: HTTPS-inställningen misslyckades, återgång till HTTP + + Cancel + Avbryt + + + + Download from urls + Hämta från url:er - - Web UI: Now listening on IP: %1, port: %2 - Webbgränssnitt: Lyssnar nu på IP: %1, port: %2 + + No URL entered + Ingen URL angavs + + + + Please type at least one URL. + Ange åtminstone en url. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Webbgränssnitt: Kan inte binda till IP: %1, port: %2. Anledning: %3 + + Crash info + Krash info fsutils - + + + + + Downloads Hämtningar @@ -9751,100 +8717,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) - PiB + - + EiB exbibytes (1024 pebibytes) - EiB + + + + + Python not detected + + + + + Python version: %1 + - + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1h %2m - + %1d %2h e.g: 2days 10hours %1d %2h - + Unknown Unknown (size) Okänd - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent kommer nu att stänga av datorn därför att alla hämtningar är färdiga. - + < 1m < 1 minute < 1 min - + %1m e.g: 10minutes %1 min + + + Working + Fungerar + + + + Updating... + Uppdaterar... + + + + Not working + Fungerar inte + + + + Not contacted yet + Inte ännu kontaktad + preview - + Preview selection Förhandsvisa markering - + The following files support previewing, please select one of them: Följande filer har stöd för förhandsvisning, välj en av dem: + + + Preview + Förhandsvisa + + + + Cancel + Avbryt + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_tr.ts qbittorrent-3.3.15/src/lang/qbittorrent_tr.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_tr.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_tr.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent qBittorrent Hakkında - + About Hakkında - + Author Hazırlayan - - Current maintainer - Şu anki geliştiren - - - - Greece - Yunanistan - - - - + + Nationality: Uyruk: - - + + + Name: + Adı: + + + + E-mail: E-posta: - - - Name: - Adı: + + Greece + Yunanistan - - Original author - Orijinal hazırlayanı + + Current maintainer + Şu anki geliştiren - - France - Fransa + + Original author + Orijinal hazırlayanı - + Special Thanks Özel Teşekkürler - + Translators Çevirmenler - - License - Lisans - - - + Libraries Kütüphaneler - + qBittorrent was built with the following libraries: qBittorrent aşağıdaki kütüphaneler ile yapıldı: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - Qt toolkit ve libtorrent-rasterbar tabanlı, C++ ile programlanmış gelişmiş bir BitTorrent istemcisidir. - - - - Copyright %1 2006-2018 The qBittorrent project - Telif hakkı %1 2006-2018 qBittorrent projesi - - - - Home Page: - Ana Sayfa: - - - - Forum: - Forum: + + France + Fransa - - Bug Tracker: - Hata İzleyicisi: + + License + Lisans @@ -115,57 +90,67 @@ Kaydetme yeri - + + Browse... + Gözat... + + + + Set as default save path + Varsayılan kayıt yolu olarak ayarla + + + Never show again Asla tekrar gösterme - + Torrent settings Torrent ayarları - + Set as default category Varsayılan kategori olarak ayarla - + Category: Kategori: - + Start torrent - Torrent'i başlat + Torrenti başlat - + Torrent information Torrent bilgisi - + Skip hash check - Adresleme denetimini atla + Adresleme kontrolünü atla - + Size: Boyut: - + Hash: Adresleme: - + Comment: Yorum: - + Date: Tarih: @@ -190,234 +175,219 @@ Otomatik - - Remember last used save path - Son kullanılan kaydetme yolunu hatırla - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - İşaretlendiğinde, .torrent dosyası, seçenekler iletisi penceresinin "İndirmeler" sayfasındaki ayarlara rağmen silinmeyecektir + İşaretlendiğinde, .torrent dosyası, seçenekler ileti kutusunun "İndirmeler" sayfasındaki ayarlara rağmen silinmeyecektir - + Do not delete .torrent file .torrent dosyasını silme - - Create subfolder - Alt klasör oluştur - - - - Download in sequential order - Sıralı düzende indir - - - - Download first and last pieces first - Önce ilk ve son parçaları indir - - - + Normal Normal - + High Yüksek - + Maximum En yüksek - + Do not download İndirme yapma - - - + + + I/O Error G/Ç Hatası - + Invalid torrent Geçersiz torrent - - Renaming - Yeniden adlandırma - - - - - Rename error - Yeniden adlandırma hatası - - - - The name is empty or contains forbidden characters, please choose a different one. - İsim boş ya da yasak karakterler içeriyor, lütfen farklı bir tane seçin. + + + + + Already in download list + Zaten indirme listesinde - + Not Available This comment is unavailable Mevcut Değil - + Not Available This date is unavailable Mevcut Değil - + Not available Mevcut değil - + Invalid magnet link Geçersiz magnet bağlantısı - + The torrent file '%1' does not exist. Torrent dosyası '%1' mevcut değil. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. Torrent dosyası '%1' diskten okunamıyor. Mutemelen yeterli izinlere sahip değilsiniz. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' ' characters. They insert a newline. - Torrent'i yükleme başarısız: %1. + Torrenti yükleme başarısız: %1. Hata: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torrent zaten indirme listesinde. İzleyiciler birleştirilemedi çünkü bu özel bir torrenttir. + + + + Torrent is already in download list. Trackers were merged. + Torrent zaten indirme listesinde. İzleyiciler birleştirildi. + + + + + Cannot add torrent + Torrent eklenemiyor + + + + Cannot add this torrent. Perhaps it is already in adding state. + Bu torrent eklenemiyor. Belki zaten ekleme durumundadır. + + + This magnet link was not recognized Bu magnet bağlantısı tanınamadı - + + Magnet link is already in download list. Trackers were merged. + Magnet bağlantısı zaten indirme listesinde. İzleyiciler birleştirildi. + + + + Cannot add this torrent. Perhaps it is already in adding. + Bu torrent eklenemiyor. Belki zaten eklenmektedir. + + + Magnet link Magnet bağlantısı - + Retrieving metadata... Üstveri alınıyor... - + Not Available This size is unavailable. Mevcut Değil - + Free space on disk: %1 Diskteki boş alan: %1 - + + Choose save path Kayıt yolunu seçin - - - - - - - Torrent is already present - Torrent zaten mevcut - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - Torrent '%1' zaten aktarım listesinde. İzleyiciler birleştirilmedi çünkü bu özel bir torrent'tir. - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - Torrent '%1' zaten aktarım listesinde. İzleyiciler birleştirildi. - - - - Torrent is already queued for processing. - Torrent zaten işlem için kuyrukta. + + Rename the file + Dosyayı yeniden adlandır - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - Magnet bağlantısı '%1' zaten aktarım listesinde. İzleyiciler birleştirildi. + + New name: + Yeni adı: - - Magnet link is already queued for processing. - Magnet bağlantısı zaten işlem için kuyrukta. + + + The file could not be renamed + Dosya yeniden adlandırılamadı - - New name: - Yeni adı: + + This file name contains forbidden characters, please choose a different one. + Bu dosya adı yasak karakterler içeriyor, lütfen farklı bir tane seçin. - - + + This name is already in use in this folder. Please use a different name. Bu dosya adı bu klasörde zaten kullanılmakta. Lütfen farklı bir ad kullanın. - + The folder could not be renamed Klasör yeniden adlandırılamadı - + Rename... Yeniden adlandır... - + Priority Öncelik - + Invalid metadata Geçersiz üstveri - + Parsing metadata... Üstveri ayrıştırılıyor... - + Metadata retrieval complete Üstveri alımı tamamlandı - + Download Error İndirme Hatası @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Disk yazma önbelleği boyutu + + + MiB - MiB + MB - + Outgoing ports (Min) [0: Disabled] Giden b.noktaları (En az) [0: Etkisizleştirildi] - + Outgoing ports (Max) [0: Disabled] Giden b.noktaları (En fazla) [0: Etkisizleştirildi] - + Recheck torrents on completion - Tamamlanmada torrent'leri yeniden denetle + Tamamlanmada torrentleri yeniden kontrol et - + Transfer list refresh interval Aktarım listesi yenileme aralığı - + ms milliseconds ms - + Setting Ayar - + Value Value set for this setting Değer - - - (disabled) - (etkisizleştirildi) - - - + (auto) (otomatik) - - min - minutes - dak - - - + All addresses Tüm adresler - + qBittorrent Section qBittorrent Bölümü - - + + Open documentation Belgeleri aç - + libtorrent Section libtorrent Bölümü - - Asynchronous I/O threads - Eşzamansız G/Ç iş parçaları - - - - Disk cache - Disk önbelleği - - - + s seconds s - + Disk cache expiry interval Disk önbelleği bitiş aralığı - + Enable OS cache İS önbelleğini etkinleştir - - Guided read cache - Yönlendirilmiş okuma önbelleği - - - - Coalesce reads & writes - Okuma ve yazmaları birleştir - - - - Send upload piece suggestions - Gönderme parçası önerileri gönder - - - - - KiB - KiB - - - - Send buffer watermark - Arabellek eşiğini gönder - - - - Send buffer low watermark - Arabellek alt eşiğini gönder - - - - Send buffer watermark factor - Arabellek eşiği etkenini gönder - - - - Prefer TCP - TCP tercih et - - - - Peer proportional (throttles TCP) - Kişi orantılı (TCP'yi kısıtlar) - - - - Allow multiple connections from the same IP address - Aynı IP adresinden çoklu bağlantılara izin ver + + m + minutes + d - + Resolve peer countries (GeoIP) Kişi ülkelerini çöz (GeoIP) - + Resolve peer host names Kişi anamakine adlarını çöz - + Strict super seeding Değişmez süper gönderim - + Network Interface (requires restart) Ağ Arayüzü (yeniden başlatma gerektirir) - + Optional IP Address to bind to (requires restart) Bağlamak için isteğe bağlı IP Adresi (yeniden başlatma gerektirir) - + Listen on IPv6 address (requires restart) IPv6 adresinde dinle (yeniden başlatma gerektirir) - + Display notifications Bildirimleri görüntüle - + Display notifications for added torrents - Eklenen torrent'ler için bildirimleri görüntüle + Eklenen torrentler için bildirimleri görüntüle - + Download tracker's favicon İzleyicinin favicon'unu indir - - Save path history length - Kaydetme yolu geçmişi uzunluğu - - - - Fixed slots - Sabit yuvalar - - - - Upload rate based - Gönderme oranına dayalı - - - - Upload slots behavior - Gönderme yuvaları davranışı - - - - Round-robin - Dönüşümlü - - - - Fastest upload - En hızlı gönderme - - - - Anti-leech - Sömürü önleyici - - - - Upload choking algorithm - Gönderme kısma algoritması - - - + Confirm torrent recheck - Torrent'i yeniden denetlemeyi onayla - - - - Confirm removal of all tags - Tüm etiketlerin kaldırılmasını onayla + Yeniden torrent kontrolünü onayla - - Always announce to all trackers in a tier - Bir seviyedeki tüm izleyicilere her zaman duyur + Exchange trackers with other peers + Diğer kişilerle izleyicileri değiştir - - Always announce to all tiers - Tüm seviyelere her zaman duyur + + Always announce to all trackers + Her zaman tüm izleyicilere duyur - + Any interface i.e. Any network interface Herhangi bir arayüz - + Save resume data interval How often the fastresume file is saved. Devam eden veri aralığını kaydet - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - %1-TCP karışık kip algoritması - - - + Maximum number of half-open connections [0: Unlimited] Yarı açık bağlantıların en fazla sayısı [0: Sınırsız] - + IP Address to report to trackers (requires restart) İzleyicilere bildirmek için IP Adresi (yeniden başlatma gerektirir) - + Enable embedded tracker Gömülü izleyiciyi etkinleştir - + Embedded tracker port Gömülü izleyici bağlantı noktası - + Check for software updates - Yazılım güncellemelerini denetle + Yazılım güncellemelerini kontrol et - + Use system icon theme Sistem simge temasını kullan @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 başlatıldı - + Torrent: %1, running external program, command: %2 Torrent: %1, harici program çalıştırılıyor, komut: %2 - - Torrent name: %1 - Torrent adı: %1 - - - - Torrent size: %1 - Torrent boyutu: %1 - - - - Save path: %1 - Kaydetme yolu: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Torrent %1 içinde indirildi. - - - - Thank you for using qBittorrent. - qBittorrent'i kullandığınız için teşekkür ederiz. - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' indirmeyi tamamladı + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrent: %1, çalıştırılan harici program komutu çok uzun (uzunluk > %2), yürütme başarısız oldu. - + Torrent: %1, sending mail notification Torrent: %1, posta bildirimi gönderiliyor - + Information Bilgi - - To control qBittorrent, access the Web UI at %1 - qBittorrent'i denetlemek için %1 adresinden Web Arayüzüne erişin + + To control qBittorrent, access the Web UI at http://localhost:%1 + qBittorrent'i denetlemek etmek için, http://localhost:%1 adresinden Web Arayüzüne erişin - + The Web UI administrator user name is: %1 Web Arayüzü yönetici kullanıcı adı: %1 - + The Web UI administrator password is still the default one: %1 Web Arayüzü yönetici parolası hala varsayılan: %1 - + This is a security risk, please consider changing your password from program preferences. Bu bir güvenlik riskidir, lütfen program tercihlerinden parolanızı değiştirmeyi dikkate alın. - + Saving torrent progress... Torrent ilerlemesi kaydediliyor... - - - Portable mode and explicit profile directory options are mutually exclusive - Taşınabilir kipi ve açık profil dizini seçenekleri karşılıklı olarak birbirini dışlar - - - - Portable mode implies relative fastresume - Taşınabilir kipi göreceli hızlı devam anlamına gelir - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - WebAPI oturum açma başarısız. Sebep: IP yasaklanmış, IP: %1, kullanıcı adı: %2 - - - - Your IP address has been banned after too many failed authentication attempts. - IP adresiniz çok fazla başarısız kimlik doğrulaması denemesinden sonra yasaklandı. - - - - WebAPI login success. IP: %1 - WebAPI oturum açma başarılı. IP: %1 - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - WebAPI oturum açma başarısız. Sebep: geçersiz kimlik bilgileri, deneme sayısı: %1, IP: %2, kullanıcı adı: %3 - AutomatedRssDownloader - + Save to: Şuraya kaydet: @@ -861,837 +658,700 @@ RSS İndirici - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - RSS torrent'lerini otomatik indirme şimdi etkisizleştirildi! Uygulama ayarlarından etkinleştirebilirsiniz. + + Enable Automated RSS Downloader + Otomatikleştirilmiş RSS İndirici'yi etkinleştir - + Download Rules İndirme Kuralları - + Rule Definition Kural Tanımı - + Use Regular Expressions Düzenli İfadeler kullan - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - Akıllı Bölüm Süzgeci, kopyalarının indirilmesi önlemek için bölüm numaralarını kontrol edecek. -Desteklenen biçimler: S01E01, 1x1, 2017.01.01 ve 01.01.2017 (Tarih biçimlerini ayrıca destekler - bir ayıraç ile) - - - - Use Smart Episode Filter - Akıllı Bölüm Süzgeci kullan - - - + Must Contain: İçermeli: - + Must Not Contain: İçermemeli: - + Episode Filter: Bölüm Süzgeci: - + Assign Category: Kategori Ata: - + Save to a Different Directory Farklı bir Dizine kaydet - + Ignore Subsequent Matches for (0 to Disable) ... X days Sonradan Gelen Eşleşmelerin Yoksayılması (0: Etkisiz) - + Disabled - Etkisizleştirildi + Etkisizleştirildi - + days gün - + Add Paused: Duraklatıldı olarak ekle: - + Use global settings Genel ayarları kullan - + Always Her zaman - + Never Asla - + Apply Rule to Feeds: - Kuralı Bildirimlere Uygula: + Kuralı Beslemelere Uygula: - + Matching RSS Articles Eşleşen RSS Makaleleri - + &Import... İç&e Aktar... - + &Export... &Dışa Aktar... - + Matches articles based on episode filter. Bölüm süzgecine dayalı eşleşen makaleler. - + Example: - Örnek: + Örnek: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match 2, 5, 8 ila 15, 30 arasıyla ve birinci sezonun ileriki bölümleriyle eşleşecek - + Episode filter rules: Bölüm süzgeç kuralları: - + Season number is a mandatory non-zero value - Sezon numarası mecburen sıfırdan farklı bir değerdir + Sezon numarası sıfırdan farklı zorunlu bir değerdir + + + Episode number is a mandatory non-zero value + Bölüm numarası sıfırdan farklı zorunlu bir değerdir - + Filter must end with semicolon Süzgeç noktalı virgül ile bitmek zorundadır - + Three range types for episodes are supported: Bölümler için üç aralık türü desteklenir: - + Single number: <b>1x25;</b> matches episode 25 of season one Tek numara: <b>1x25;</b> birinci sezonun 25. bölümüyle eşleşir - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Normal aralık: <b>1x25-40;</b> birinci sezonun 25 ila 40 arası bölümleriyle eşleşir - - Episode number is a mandatory positive value - Bölüm numarası mecburen pozitif bir değerdir - - - - Rules - Kurallar + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Sonsuz aralık: <b>1x25-;</b> birinci sezonun 25. ve ileriki bölümleriyle eşleşir - - Rules (legacy) - Kurallar (eski) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Sonsuz aralık: <b>1x25-;</b> birinci sezonun 25 ve daha fazlası ile eşleşir, ve sonraki sezonların tüm bölümleri + - + Last Match: %1 days ago Son Eşleşme: %1 gün önce - + Last Match: Unknown Son Eşleşme: Bilinmiyor - + New rule name Yeni kural adı - + Please type the name of the new download rule. Lütfen yeni indirme kuralı adını yazın. - - + + Rule name conflict Kural adı çakışması - - + + A rule with this name already exists, please choose another name. Bu isimde bir kural zaten var, lütfen başka bir isim seçin. - + Are you sure you want to remove the download rule named '%1'? '%1' adındaki indirme kuralını kaldırmak istediğinize emin misiniz? - + Are you sure you want to remove the selected download rules? Seçilen indirme kurallarını kaldırmak istediğinize emin misiniz? - + Rule deletion confirmation Kural silme onayı - + Destination directory Hedef dizin - + Invalid action Geçersiz eylem - + The list is empty, there is nothing to export. - Liste boş, dışa aktarmak için hiçbir şey yok. + Liste boş, dışa aktarmak için bir şey yok. - - Export RSS rules - RSS kurallarını dışa aktar + + Where would you like to save the list? + Listeyi nereye kaydetmek istersiniz? - - + + Rules list (*.rssrules) + Kurallar listesi (*.rssrules) + + + I/O Error G/Ç Hatası - - Failed to create the destination file. Reason: %1 - Hedef dosya oluşturma başarısız. Sebep: %1 + + Failed to create the destination file + Hedef dosya oluşturma başarısız - - Import RSS rules - RSS kurallarını içe aktar + + Please point to the RSS download rules file + Lütfen RSS indirme kuralları dosyasını gösterin - - Failed to open the file. Reason: %1 - Dosyayı açma başarısız. Sebep: %1 + + Rules list + Kurallar listesi - + Import Error İçe Aktarma Hatası - - Failed to import the selected rules file. Reason: %1 - Seçilen kurallar dosyasını içe aktarma başarısız. Sebep: %1 + + Failed to import the selected rules file + Seçilen kurallar dosyasını içe aktarma başarısız - + Add new rule... Yeni kural ekle... - + Delete rule Kuralı sil - + Rename rule... Kuralı yeniden adlandır... - + Delete selected rules Seçilen kuralları sil - - Clear downloaded episodes... - İndirilmiş bölümleri temizle... - - - + Rule renaming Kural yeniden adlandırma - + Please type the new rule name Lütfen yeni kural adını yazın - - Clear downloaded episodes - İndirilmiş bölümleri temizle - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - Seçilen kural için indirilmiş bölümlerin listesini temizlemek istediğinize emin misiniz? - - - - Regex mode: use Perl-compatible regular expressions - Regex kipi: Perl uyumlu düzenli ifadeleri kullanın - - - - - Position %1: %2 - Konum %1: %2 + + Regex mode: use Perl-like regular expressions + Regex kipi: Perl gibi düzenli ifadeleri kullan - + Wildcard mode: you can use - Joker karakter kipi: + - + ? to match any single character - herhangi bir tek karakterle eşleşmesi için ? kullanabilirsiniz + - + * to match zero or more of any characters - karakterden daha fazlasıyla eşleşmesi ya da hiç eşleşmemesi için * kullanabilirsiniz + - + Whitespaces count as AND operators (all words, any order) - AND işleticileri olarak boşluk sayısı kullanabilirsiniz (tüm kelimeler, herhangi bir sırada) + - + | is used as OR operator - | karakteri OR işleticisi olarak kullanılır + - + If word order is important use * instead of whitespace. - Eğer kelime sırası önemliyse boşluk yerine * kullanın. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Boş bir %1 ibaresi olan ifade (örn. %2) + - + will match all articles. - tüm makalelerle eşleşecek. + - + will exclude all articles. - tüm makaleleri hariç tutacak. - - - - BanListOptionsDialog - - - List of banned IP addresses - Yasaklı IP adresleri listesi - - - - Ban IP - IP Yasakla - - - - Delete - Sil - - - - - Warning - Uyarı + - - The entered IP address is invalid. - Girilen IP adresi geçersiz. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Joker kipi: <ul><li>Herhangi bir tek karakteri eşlemek için ?</li><li>Herhangi bir karakterin daha fazlasını ya da sıfır karakteri eşlemek için *</li><li>AND işleticileri olarak Boşluk miktarını</li></ul> kullanabilirsiniz - - The entered IP is already banned. - Girilen IP zaten yasaklı. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Joker kipi: <ul><li>Herhangi bir tek karakteri eşlemek için ?</li><li>Herhangi bir karakterin daha fazlasını ya da sıfır karakteri eşlemek için *</li><li>| işaretini OR işleticileri olarak</li></ul> kullanabilirsiniz BitTorrent::Session - + Restart is required to toggle PeX support PeX desteğini değiştirmek için yeniden başlatma gerekir - - Could not get GUID of configured network interface. Binding to IP %1 - Yapılandırılmış ağ arayüzünün GUID'si alınamadı. %1 IP adresine bağlıyor - - - + Embedded Tracker [ON] Gömülü İzleyici [AÇIK] - + Failed to start the embedded tracker! Gömülü izleyiciyi başlatma başarısız! - + Embedded Tracker [OFF] Gömülü İzleyici [KAPALI] - + + '%1' reached the maximum ratio you set. Removing... + '%1', ayarladığınız en fazla orana ulaştı. Kaldırılıyor... + + + + '%1' reached the maximum ratio you set. Pausing... + '%1', ayarladığınız en fazla orana ulaştı. Duraklatılıyor... + + + System network status changed to %1 e.g: System network status changed to ONLINE Sistem ağ durumu %1 olarak değişti - + ONLINE ÇEVRİMİÇİ - + OFFLINE ÇEVRİMDIŞI - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding %1 ağ yapılandırması değişti, oturum bağlaması yenileniyor - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. Yapılandırılan ağ arayüzü adresi %1 geçersiz. - - + Encryption support [%1] Şifreleme desteği [%1] - - + FORCED ZORLANDI - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 geçerli bir IP adresi değil ve yasaklanan adresler listesi uygulanırken reddedildi. - - - - + Anonymous mode [%1] İsimsiz kipi [%1] - + Unable to decode '%1' torrent file. '%1' torrent dosyası çözülemiyor. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' - '%1' dosyasının tekrarlayan indirmesi '%2' torrent'i içine gömüldü + '%1' dosyasının tekrarlayan indirmesi '%2' torrenti içine gömüldü - + Queue positions were corrected in %1 resume files - Kuyruk konumları %1 devam eden dosya olarak düzeltildi + - + Couldn't save '%1.torrent' '%1.torrent' dosyası kaydedilemedi - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' dosyası aktarım listesinden kaldırıldı. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' dosyası aktarım listesinden ve sabit diskten kaldırıldı. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '%1' dosyası aktarım listesinden kaldırıldı ancak dosyalar silinemedi. Hata: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. engellendi çünkü %1 etkisizleştirildi. - + because %1 is disabled. this peer was blocked because TCP is disabled. engellendi çünkü %1 etkisizleştirildi. - + URL seed lookup failed for URL: '%1', message: %2 URL gönderimi arama şu URL için başarısız oldu: '%1', ileti: '%2' - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent, %1 arayüzünde şu bağlantı noktasını dinlemede başarısız oldu: %2/%3. Sebep: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' dosyası aktarım listesinden ve sabit diskten kaldırıldı. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' dosyası aktarım listesinden kaldırıldı. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... '%1' indiriliyor, lütfen bekleyin... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 - qBittorrent, herhangi bir arayüzde şu bağlantı noktasını dinlemeye çalışıyor: %1 + qBittorrent, herhangi bir arayüz bağlantı noktasını dinlemeyi deniyor: %1 - + The network interface defined is invalid: %1 Tanımlanan ağ arayüzü geçersiz: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 - qBittorrent, %1 arayüzünde şu bağlantı noktasını dinlemeye çalışıyor: %2 - - - - Peer ID: - Kişi KİMLİĞİ: + qBittorrent, %1 arayüzünde şu bağlantı noktasını dinlemeyi deniyor: %2 - - HTTP User-Agent is '%1' - HTTP Kullanıcı Tanıtıcısı '%1' - - - - + DHT support [%1] DHT desteği [%1] - - - - - - - - - + + + + ON AÇIK - - - - - - - - - + + + + OFF KAPALI - - + Local Peer Discovery support [%1] Yerel Kişi Keşfi desteği [%1] - - PeX support [%1] - PeX desteği [%1] - - - - '%1' reached the maximum ratio you set. Removed. - '%1', ayarladığınız en fazla orana ulaştı. Kaldırıldı. - - - - '%1' reached the maximum ratio you set. Paused. - '%1', ayarladığınız en fazla orana ulaştı. Duraklatıldı. - - - - '%1' reached the maximum seeding time you set. Removed. - '%1', ayarladığınız en fazla gönderim süresine ulaştı. Kaldırıldı. + Restart is required to toggle Tracker Exchange support + İzleyici Değişimi desteğini değiştirmek için yeniden başlatma gerekir - - '%1' reached the maximum seeding time you set. Paused. - '%1', ayarladığınız en fazla gönderim süresine ulaştı. Duraklatıldı. - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent dinlemek için bir %1 yerel adresi bulamadı - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent, herhangi bir arayüz bağlantı noktasını dinlemede başarısız oldu: %1. Sebep: %2. - + Tracker '%1' was added to torrent '%2' - İzleyici '%1', '%2' torrent'ine eklendi + İzleyici '%1', '%2' torrentine eklendi - + Tracker '%1' was deleted from torrent '%2' - İzleyici '%1', '%2' torrent'inden silindi + İzleyici '%1', '%2' torrentinden silindi - + URL seed '%1' was added to torrent '%2' - Gönderim URL'si '%1', '%2' torrent'ine eklendi + Gönderim URL'si '%1', '%2' torrentine eklendi - + URL seed '%1' was removed from torrent '%2' - Gönderim URL'si '%1', '%2' torrent'inden kaldırıldı + Gönderim URL'si '%1', '%2' torrentinden kaldırıldı - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. '%1' torrent dosyası devam ettirilemiyor. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Verilen IP süzgeci başarılı olarak ayrıştırıldı: %1 kural uygulandı. - + Error: Failed to parse the provided IP filter. Hata: Verilen IP süzgecini ayrıştırma başarısız. - - '%1' restored. - 'torrent name' restored. - '%1' geri yüklendi. - - - + Couldn't add torrent. Reason: %1 Torrent eklenemedi. Sebep: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' dosyasına devam edildi. (hızlı devam) + + + '%1' added to download list. 'torrent name' was added to download list. '%1' dosyası indirme listesine eklendi. - + An I/O error occurred, '%1' paused. %2 Bir G/Ç hatası meydana geldi, '%1' duraklatıldı. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Bağlantı noktası eşleme başarısız, ileti: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Bağlantı noktası eşleme başarılı, ileti: %1 - + due to IP filter. this peer was blocked due to ip filter. IP süzgecinden dolayı engellendi. - + due to port filter. this peer was blocked due to port filter. bağlantı noktası süzgecinden dolayı engellendi. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. i2p karışık kip kısıtlamalarından dolayı engellendi. - + because it has a low port. this peer was blocked because it has a low port. engellendi çünkü düşük bir bağlantı noktasına sahip. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent, %1 arayüzünde şu bağlantı noktasını başarılı olarak dinliyor: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 Dış IP: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - yeni torrent dosyası oluşturma başarısız oldu - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - Önce ilk ve son parçayı indir: %1, torrent: '%2' - - - - On - Açık - - - - Off - Kapalı - - - - Successfully moved torrent: %1. New path: %2 - Torrent başarılı olarak taşındı: '%1'. Yeni yolu: %2 - - - + Could not move torrent: '%1'. Reason: %2 Torrent taşınamadı: '%1'. Sebep: %2 - + File sizes mismatch for torrent '%1', pausing it. - '%1' torrent'i için dosya boyutu uyuşmuyor, duraklatılıyor. + '%1' torrenti için dosya boyutu uyuşmuyor, duraklatılıyor. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - Hızlı devam verisi '%1' torrent'i için reddedildi. Sebep: '%2'. Tekrar denetleniyor... + Hızlı devam verisi '%1' torrenti için reddedildi. Sebep: '%2'. Tekrar kontrol ediliyor... CategoryFilterModel - + Categories - Kategoriler + Kategoriler - + All - Tümü + Tümü - + Uncategorized - Kategorilenmemiş + @@ -1699,42 +1359,147 @@ Add category... - Kategori ekle... + Kategori ekle... Add subcategory... - Alt kategori ekle... + - Edit category... - Kategoriyi düzenle... + Remove category + Kategoriyi kaldır + + + + Remove unused categories + Kullanılmayan kategorileri kaldır + + + + Resume torrents + Torrentlere devam et + + + + Pause torrents + Torrentleri duraklat + + + + Delete torrents + Torrentleri sil + + + + New Category + Yeni Kategori + + + + Category: + Kategori: + + + + Invalid category name + Geçersiz kategori adı + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Kategori adı '\' içeremez. +Kategori adı '/' ile başlayamaz/bitemez. +Kategori adı art arda gelen '//' içeremez. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Tümü (0) + + + Uncategorized (0) + Kategorilenmemiş (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Kategorilenmemiş (%1) + + + Add category... + Kategori ekle... - Remove category - Kategoriyi sil + Kategoriyi kaldır - Remove unused categories - Kullanılmayan kategorileri kaldır + Kullanılmayan kategorileri kaldır - Resume torrents - Torrent'lere devam et + Torrentlere devam et - Pause torrents - Torrent'leri duraklat + Torrentleri duraklat - Delete torrents - Torrent'leri sil + Torrentleri sil + + + New Category + Yeni Kategori + + + Category: + Kategori: + + + Invalid category name + Geçersiz kategori adı + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Kategori adı '\' içeremez. +Kategori adı '/' ile başlayamaz/bitemez. +Kategori adı art arda gelen '//' içeremez. + + + All (%1) + this is for the category filter + Tümü (%1) @@ -1774,106 +1539,58 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Silme onayı - - - - Remember choice - Seçimi hatırla - - - - Also delete the files on the hard disk - Aynı zamanda sabit diskteki dosyaları sil - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? '%1' dosyasını aktarım listesinden silmek istediğinize emin misiniz? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? Bu %1 torrenti aktarım listesinden silmek istediğinize emin misiniz? - DownloadFromURLDialog - - - Download from URLs - URL'lerden indir - - - - Add torrent links - Torrent bağlantılarını ekleyin - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - Satır başına bir bağlantı (HTTP bağlantıları, Magnet bağlantıları ve bilgi adreslemeleri desteklenir) - - - - Download - İndir - - - - No URL entered - Girilmiş URL yok - - - - Please type at least one URL. - Lütfen en az bir URL yazın. - - - DownloadedPiecesBar - + White: Missing pieces Beyaz: Eksik parçalar - + Green: Partial pieces Yeşil: Kısmi parçalar - + Blue: Completed pieces Mavi: Tamamlanan parçalar - ExecutionLogWidget + ExecutionLog - + General Genel - + Blocked IPs Engellenmiş IP'ler - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked <font color='red'>%1</font> %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned <font color='red'>%1</font> yasaklandı @@ -1882,112 +1599,41 @@ FeedListWidget - + RSS feeds - RSS bildirimleri + RSS beslemeleri - - - Unread (%1) - Okunmamış (%1) + + Unread + Okunmadı FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. + + An error occured while trying to open the log file. Logging to file is disabled. Yapılandırma dosyasını açmaya çalışırken bir hata meydana geldi. Dosyaya günlükleme etkisizleştirildi. - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - &Gözat... - - - - Choose a file - Caption for file open/save dialog - Bir dosya seçin - - - - Choose a folder - Caption for directory open dialog - Bir klasör seçin - - - - Any file - Herhangi bir dosya - - - FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - G/Ç Hatası: Okuma kipinde IP süzgeci dosyası açılamadı. - - - - - - IP filter line %1 is malformed. - IP süzgeç satırı %1 hatalı oluşturulmuş. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - IP süzgeç satırı %1 hatalı oluşturulmuş. Aralığın başlangıç IP'si hatalı oluşturulmuş. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - IP süzgeç satırı %1 hatalı oluşturulmuş. Aralığın bitiş IP'si hatalı oluşturulmuş. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - IP süzgeç satırı %1 hatalı oluşturulmuş. Bir IP, IPv4 ve diğeri ise IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - Satır %1 için IP süzgeç özel durumu oluştu. İstisna: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - %1 fazladan IP süzgeci ayrıştırma hatası meydana geldi. + + + + I/O Error: Could not open ip filter file in read mode. + G/Ç Hatası: Okuma kipinde ip süzgeci dosyası açılamadı. - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. Ayrıştırma Hatası: Süzgeç dosyası geçerli bir PeerGuardian P2B dosyası değil. @@ -1995,396 +1641,472 @@ GeoIPDatabase - - + + Unsupported database file size. Desteklenmeyen veritabanı dosya boyutu. - + Metadata error: '%1' entry not found. Üstveri hatası: '%1' giriş bulunamadı. - + Metadata error: '%1' entry has invalid type. Üstveri hatası: '%1' giriş geçersiz türe sahip. - + Unsupported database version: %1.%2 Desteklenmeyen veritabanı sürümü: %1.%2 - + Unsupported IP version: %1 Desteklenmeyen IP sürümü: %1 - + Unsupported record size: %1 Desteklenmeyen kayıt boyutu: %1 - + Invalid database type: %1 Geçersiz veritabanı türü: %1 - + Database corrupted: no data section found. Veritabanı bozuldu: bulunan veri bölümü yok. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - Http istek boyutu sınırlamayı aşıyor, soket kapatılıyor. Sınır: %ld, IP: %s + + File + Dosya - - Bad Http request, closing socket. IP: %s - Kötü Http isteği, soket kapatılıyor. IP: %s + + Edit + Düzen - - - HttpServer - + + Help + Yardım + + + Exit qBittorrent qBittorrent'ten Çık - + Only one link per line Her satıra bir bağlantı - + + Download + İndir + + + Global upload rate limit must be greater than 0 or disabled. Genel gönderme oranı sınırı 0'dan büyük olmak ya da etkisizleştirilmek zorundadır. - + Global download rate limit must be greater than 0 or disabled. Genel indirme oranı sınırı 0'dan büyük olmak ya da etkisizleştirilmek zorundadır. - + Alternative upload rate limit must be greater than 0 or disabled. Alternatif gönderme oranı sınırı 0'dan büyük olmak ya da etkisizleştirilmek zorundadır. - + Alternative download rate limit must be greater than 0 or disabled. Alternatif indirme oranı sınırı 0'dan büyük olmak ya da etkisizleştirilmek zorundadır. - + Maximum active downloads must be greater than -1. En fazla aktif indirme -1'den büyük olmak zorundadır. - + Maximum active uploads must be greater than -1. En fazla aktif gönderme -1'den büyük olmak zorundadır. - + Maximum active torrents must be greater than -1. En fazla aktif torrent -1'den büyük olmak zorundadır. - + Maximum number of connections limit must be greater than 0 or disabled. En fazla bağlantı sınırı sayısı 0'dan büyük olmak ya da etkisizleştirilmek zorundadır. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Torrent başına en fazla bağlantı sınırı sayısı 0'dan büyük olmak ya da etkisizleştirilmek zorundadır. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Torrent başına en fazla gönderme yuvası sınırı sayısı 0'dan büyük olmak ya da etkisizleştirilmek zorundadır. - + Unable to save program preferences, qBittorrent is probably unreachable. Program tercihleri kaydedilemiyor, qBittorrent'e muhtemelen ulaşılamıyor. - - IRC: #qbittorrent on Freenode - IRC: Freenode üzerinde #qbittorrent kanalı - - - - Invalid category name: -Please do not use any special characters in the category name. - Geçersiz kategori adı: -Lütfen kategori adı içinde hiçbir özel karakter kullanmayın. - - - - Unknown - Bilinmiyor - - - - Hard Disk - Sabit Disk - - - - Share ratio limit must be between 0 and 9998. - Paylaşma oranı sınırı 0 ve 9998 arasında olmak zorundadır. - - - - Seeding time limit must be between 0 and 525600 minutes. - Gönderim süresi sınırı 0 ve 525600 dakika arasında olmak zorundadır. + + Language + Dil - + The port used for incoming connections must be between 1 and 65535. Gelen bağlantılar için kullanılan bağlantı noktası 1 ve 65535 arasında olmak zorundadır. - + The port used for the Web UI must be between 1 and 65535. Web Arayüzü için kullanılan bağlantı noktası 1 ve 65535 arasında olmak zorundadır. - + Unable to log in, qBittorrent is probably unreachable. Oturum açılamıyor, qBittorrent muhtemelen erişilebilir değil. - + Invalid Username or Password. Geçersiz Kullanıcı Adı veya Parola. - - Username - Kullanıcı adı - - - + Password Parola - + Login - Oturum Aç + Oturum aç - + + Upload Failed! + Gönderme Başarısız Oldu! + + + Original authors Orijinal hazırlayanları - + + Upload limit: + Gönderme sınırı: + + + + Download limit: + İndirme sınırı: + + + Apply Uygula - + Add Ekle - + + Category: + Kategori: + + + Upload Torrents Upload torrent files to qBittorent using WebUI - Torrent'leri Gönder + Torrentleri Gönder - + + All + Tümü + + + + Downloading + İndiriliyor + + + + Seeding + Gönderiliyor + + + + Completed + Tamamlandı + + + + Resumed + Devam edildi + + + + Paused + Duraklatıldı + + + + Active + Etkin + + + + Inactive + Etkin değil + + + Save files to location: Dosyaların kaydedildiği yer: - + Cookie: Tanımlama Bilgisi: - + Type folder here Klasörü buraya yazın - + + Run an external program on torrent completion + Torrent tamamlanmasında harici bir program çalıştır + + + + Enable bandwidth management (uTP) + Bant genişliği yönetimini (uTP) etkinleştir + + + + Apply rate limit to uTP connections + Oran sınırını uTP bağlantılarına uygula + + + + Alternative Global Rate Limits + Alternatif Genel Oran Sınırları + + + More information Daha fazla bilgi - + Information about certificates Sertifikalar hakkında bilgiler - + Save Files to Dosyaları şuraya kaydet - - Set location - Konum ayarla - - - - Limit upload rate - Gönderme oranını sınırla + + Watch Folder + İzleme Klasörü - - Limit download rate - İndirme oranını sınırla + + Default Folder + Varsayılan Klasör - - Rename torrent - Torrent'i yeniden adlandır + + from + from time1 to time2 + Bu saatten: - - Unable to create category - + + to + from time1 to time2 + Bu saate: - + Other... Save Files to: Watch Folder / Default Folder / Other... Diğer... - + + Every day + Schedule the use of alternative rate limits on ... + Her gün + + + + Week days + Schedule the use of alternative rate limits on ... + Hafta içi + + + + Week ends + Schedule the use of alternative rate limits on ... + Hafta sonu + + + Monday Schedule the use of alternative rate limits on ... Pazartesi - + Tuesday Schedule the use of alternative rate limits on ... Salı - + Wednesday Schedule the use of alternative rate limits on ... Çarşamba - + Thursday Schedule the use of alternative rate limits on ... Perşembe - + Friday Schedule the use of alternative rate limits on ... Cuma - + Saturday Schedule the use of alternative rate limits on ... Cumartesi - + Sunday Schedule the use of alternative rate limits on ... Pazar - + + Downloaded + Is the file downloaded or not? + İndirilen + + + Logout Oturumu Kapat - + + Download from URLs + URL'lerden indir + + + Download Torrents from their URLs or Magnet links - Torrent'leri URL'lerinden ya da Magnet bağlantılarından indir + Torrentleri URL'lerinden ya da Magnet bağlantısından indir - + Upload local torrent - Yerel torrent'i gönder + Yerel torrenti gönder - + Are you sure you want to delete the selected torrents from the transfer list? - Seçilen torrent'leri aktarım listesinden silmek istediğinize emin misiniz? + Seçilen torrentleri aktarım listesinden silmek istediğinize emin misiniz? - + Save Kaydet - + qBittorrent client is not reachable qBittorrent istemcisine ulaşılamıyor - - qBittorrent has been shutdown. - qBittorrent kapatıldı. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Beyaz listeye alınmış IP alt ağları listesi + + HTTP Server + HTTP Sunucusu - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Örnek: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Aşağıdaki parametreler desteklenir: - - Add subnet - Alt ağ ekle + + Torrent path + Torrent yolu - - Delete - Sil + + Torrent name + Torrent adı - - Error - Hata + + qBittorrent has been shutdown. + qBittorrent kapatıldı. + + + LineEdit - - The entered subnet is invalid. - Girilen alt ağ geçersiz. + + Clear the text + Metni temizle LogListWidget - + Copy Kopyala - + Clear Temizle @@ -2417,711 +2139,649 @@ İndirmeler &Bittiğinde - + &View &Görünüm - + &Options... &Seçenekler... - + &Resume &Devam - + Torrent &Creator Torrent &Oluşturucu - + Set Upload Limit... Gönderme Sınırını Ayarla... - + Set Download Limit... İndirme Sınırını Ayarla... - + Set Global Download Limit... Genel İndirme Sınırını Ayarla... - + Set Global Upload Limit... Genel Gönderme Sınırını Ayarla... - + Minimum Priority En Düşük Öncelik - + Top Priority En Yüksek Öncelik - + Decrease Priority Önceliği Azalt - + Increase Priority Önceliği Arttır - - + + Alternative Speed Limits Alternatif Hız Sınırları - + &Top Toolbar Üst &Araç Çubuğu - + Display Top Toolbar Üst Araç Çubuğunu Görüntüle - - Status &Bar - Durum Çu&buğu - - - + S&peed in Title Bar Başlık Çubuğunda &Hızı Göster - + Show Transfer Speed in Title Bar Aktarım Hızını Başlık Çubuğunda Göster - + &RSS Reader &RSS Okuyucu - + Search &Engine Arama &Motoru - + L&ock qBittorrent - qBittorrent'i Kili&tle + qBittorrent'i Kilitle - + Do&nate! &Bağış Yap! - - Close Window - Pencereyi Kapat - - - + R&esume All &Tümüne Devam Et - + Manage Cookies... Tanımlama Bilgilerini Yönet... - + Manage stored network cookies Depolanan ağ tanımlama bilgilerini yönet - + Normal Messages Normal İletiler - + Information Messages Bilgi İletileri - + Warning Messages Uyarı İletileri - + Critical Messages Önemli İletiler - + &Log &Günlük - + &Exit qBittorrent qBittorrent'ten Çı&k - + &Suspend System Bilgisayarı &Askıya Al - + &Hibernate System Bilgisayarı &Hazırda Beklet - + S&hutdown System Bil&gisayarı Kapat - + &Disabled &Etkisizleştirildi - + &Statistics İ&statistikler - + Check for Updates - Güncellemeleri Denetle + Güncellemeleri Kontrol Et - + Check for Program Updates - Program Güncellemelerini Denetle + Program Güncellemelerini Kontrol Et - + &About &Hakkında - + &Pause &Duraklat - + &Delete &Sil - + P&ause All Tümünü D&uraklat - + &Add Torrent File... Torrent Dosyası &Ekle... - + Open - + E&xit Çı&kış - + Open URL URL'yi Aç - + &Documentation B&elgeler - + Lock Kilitle - - - + + + Show Göster - + Check for program updates - Program güncellemelerini denetle + Program güncellemelerini kontrol et - + Add Torrent &Link... Torrent &Bağlantısı Ekle... - + If you like qBittorrent, please donate! qBittorrent'i beğendiyseniz, lütfen bağış yapın! - - + Execution Log Çalıştırma Günlüğü - + Clear the password Parolayı temizle - + Filter torrent list... - Torrent listesini süzün... + Torrent listesini süz... - + &Set Password Parola &Ayarla - - Preferences - Tercihler - - - + &Clear Password Parolayı &Temizle - + Transfers Aktarımlar - - - qBittorrent is minimized to tray - qBittorrent tepsiye simge durumuna küçültüldü - - - - - - This behavior can be changed in the settings. You won't be reminded again. - Bu davranış ayarlar içinde değiştirilebilir. Size tekrar hatırlatılmayacaktır. - - - + Torrent file association Torrent dosyası ilişkilendirme - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent, torrent dosyalarını ya da Magnet bağlantılarını açmak için varsayılan uygulama değildir. qBittorrent'i torrent dosyalarına ya da Magnet bağlantılarına ilişkilendirmek istiyor musunuz? - + Icons Only Sadece Simgeler - + Text Only Sadece Metin - + Text Alongside Icons Metin Simgelerin Yanında - + Text Under Icons Metin Simgelerin Altında - + Follow System Style Sistem Stilini Takip Et - - - + + + UI lock password Arayüz kilidi parolası - - - + + + Please type the UI lock password: Lütfen Arayüz kilidi parolasını yazın: - + The password should contain at least 3 characters Parola en az 3 karakter içermeli - + Password update Parola güncelleme - + The UI lock password has been successfully updated Arayüz kilidi parolası başarılı olarak güncellendi - + Are you sure you want to clear the password? Parolayı temizlemek istediğinize emin misiniz? - - Use regular expressions - Düzenli ifadeleri kullan - - - + Search Ara - + Transfers (%1) Aktarımlar (%1) - + Error Hata - + Failed to add torrent: %1 - Torrent'i ekleme başarısız: %1 + Torrenti ekleme başarısız: %1 - + Torrent added Torrent eklendi - + '%1' was added. e.g: xxx.avi was added. '%1' eklendi. - + Download completion İndirme tamamlandı - + I/O Error i.e: Input/Output Error G/Ç Hatası - + Recursive download confirmation - Tekrarlayan indirme onayı + Tekrarlanan indirme onayı - + Yes Evet - + No Hayır - + Never Asla - + Global Upload Speed Limit Genel Gönderme Hızı Sınırı - + Global Download Speed Limit Genel İndirme Hızı Sınırı - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent henüz güncellendi ve değişikliklerin etkili olması için yeniden başlatılması gerek. - - - - qBittorrent is closed to tray - qBittorrent tepsiye kapatıldı - - - - Some files are currently transferring. - Bazı dosyalar şu anda aktarılıyor. - - - - Are you sure you want to quit qBittorrent? - qBittorrent uygulamasından çıkmak istediğinize emin misiniz? - - - + &No &Hayır - + &Yes &Evet - + &Always Yes Her &Zaman Evet - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - Python sürümünüz belirlenemedi. Arama motoru etkisizleştirildi. - - - + Old Python Interpreter Eski Python Yorumlayıcı - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. Python sürümünüz (%1) eskimiş. Arama motorlarının çalışması için lütfen en son sürüme yükseltin. En düşük gereken: 2.7.9/3.3.0. - + qBittorrent Update Available qBittorrent Güncellemesi Mevcut - + + A new version is available. +Do you want to download %1? + Yeni bir sürüm mevcut. +%1 sürümünü indirmek istiyor musunuz? + + + Already Using the Latest qBittorrent Version Zaten En Son qBittorrent Sürümü Kullanılıyor - + Undetermined Python version Belirlenemeyen Python sürümü - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. '%1' dosyasının indirilmesi tamamlandı. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. Reason: disk is full. - '%1' torrent'i için bir G/Ç hatası meydana geldi. + '%1' torrenti için bir G/Ç hatası meydana geldi. Sebep: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? - '%1' torrent'i, torrent dosyaları içeriyor, bunların indirilmesi ile işleme devam etmek istiyor musunuz? + '%1' torrenti, torrent dosyaları içeriyor, bunların indirilmesi ile işleme devam etmek istiyor musunuz? - + Couldn't download file at URL '%1', reason: %2. Şu URL'den dosya indirilemedi: '%1', sebep: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin %1 içinde Python bulundu: %2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + Python sürümünüz (%1) belirlenemedi. Arama motoru etkisizleştirildi. + + + + Missing Python Interpreter Eksik Python Yorumlayıcı - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Arama motorunu kullanmak için Python gerekir ancak yüklenmiş görünmüyor. Şimdi yüklemek istiyor musunuz? - + Python is required to use the search engine but it does not seem to be installed. Arama motorunu kullanmak için Python gerekir ancak yüklenmiş görünmüyor. - - A new version is available. - Yeni bir sürüm mevcut. - - - - Do you want to download %1? - %1 sürümünü indirmek istiyor musunuz? - - - - Open changelog... - Değişiklikleri aç... - - - + No updates available. You are already using the latest version. Mevcut güncellemeler yok. Zaten en son sürümü kullanıyorsunuz. - + &Check for Updates - Güncellemeleri &Denetle + Güncellemeleri &Kontrol Et - + Checking for Updates... - Güncellemeler denetleniyor... + Güncellemeler kontrol ediliyor... - + Already checking for program updates in the background - Program güncellemeleri arka planda zaten denetleniyor + Program güncellemeleri arka planda zaten kontrol ediliyor - + Python found in '%1' '%1' içinde Python bulundu - + Download error İndirme hatası - + Python setup could not be downloaded, reason: %1. Please install it manually. Python kurulumu indirilemedi, sebep: %1. Lütfen el ile yükleyin. - - + + Invalid password Geçersiz parola - - - + + RSS (%1) RSS (%1) - + URL download error URL indirme hatası - + The password is invalid Parola geçersiz - - + + DL speed: %1 e.g: Download speed: 10 KiB/s İND hızı: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s GÖN hızı: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [İnd: %1, Gön: %2] qBittorrent %3 - + Hide Gizle - + Exiting qBittorrent qBittorrent'ten çıkılıyor - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Bazı dosyalar şu anda aktarılıyor. +qBittorrent'ten çıkmak istediğinize emin misiniz? + + + Open Torrent Files Torrent Dosyalarını Aç - + Torrent Files Torrent Dosyaları - + Options were saved successfully. Seçenekler başarılı olarak kaydedildi. @@ -3129,52 +2789,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. Değişken DNS'iniz başarılı olarak güncellendi. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Değişken DNS hatası: Hizmet geçici olarak kullanılamıyor, 30 dakika içinde yeniden denenecektir. - + Dynamic DNS error: hostname supplied does not exist under specified account. Değişken DNS hatası: verilen anamakine adı belirtilen hesap altında mevcut değil. - + Dynamic DNS error: Invalid username/password. Değişken DNS hatası: Geçersiz kullanıcı adı/parola. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Değişken DNS hatası: qBittorrent, hizmet tarafından kara listeye alındı, lütfen http://bugs.qbittorrent.org adresinde bir hata bildirin. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Değişken DNS hatası: %1, hizmet tarafından geri döndürüldü, lütfen http://bugs.qbittorrent.org adresinde bir hata bildirin. - + Dynamic DNS error: Your username was blocked due to abuse. Değişken DNS hatası: Kullanıcı adınız kötüye kullanımdan dolayı engellendi. - + Dynamic DNS error: supplied domain name is invalid. Değişken DNS hatası: verilen etki alanı adı geçersiz. - + Dynamic DNS error: supplied username is too short. Değişken DNS hatası: verilen kullanıcı adı çok kısa. - + Dynamic DNS error: supplied password is too short. Değişken DNS hatası: verilen parola çok kısa. @@ -3182,1413 +2842,1303 @@ Net::DownloadHandler - + I/O Error G/Ç Hatası - + The file size is %1. It exceeds the download limit of %2. Dosya boyutu %1. %2 indirme sınırını aşıyor. - + Unexpected redirect to magnet URI. Magnet URI'ye beklenmedik yönlendirme. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - Uzak anamakine adı bulunamadı (geçersiz anamakine adı) + + + GeoIP database loaded. Type: %1. Build time: %2. + GeoIP veritabanı yüklendi. Türü: %1. Yapım zamanı: %2. - - The operation was canceled - İşlem iptal edildi + + + Couldn't load GeoIP database. Reason: %1 + GeoIP veritabanı yüklenemedi. Sebep: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - Uzak sunucu, tam bir yanıt alınmadan ve işlenmeden önce bağlantıyı erken kapattı + + Venezuela, Bolivarian Republic of + Venezüela Bolivar Cumhuriyeti - - The connection to the remote server timed out - Uzak sunucuya bağlantı zaman aşımına uğradı + + Viet Nam + Vietnam - - SSL/TLS handshake failed - SSL/TLS görüşmesi başarısız oldu + + + N/A + Yok - - The remote server refused the connection - Uzak sunucu bağlantıyı reddetti + + Andorra + Andora - - The connection to the proxy server was refused - Proksi sunucusuna bağlantı reddedildi + + United Arab Emirates + Birleşik Arap Emirlikleri - - The proxy server closed the connection prematurely - Proksi sunucusu bağlantıyı erken kapattı + + Afghanistan + Afganistan - - The proxy host name was not found - Proksi anamakine adı bulunamadı - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - Proksi sunucusuna bağlantı zaman aşımına uğradı ya da proksi gönderilen isteğe zamanında yanıt vermedi - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - Proksi, isteğe karşılık vermek için kimlik doğrulaması gerektirir ancak verilen kimlik bilgilerinin hiçbirini kabul etmedi - - - - The access to the remote content was denied (401) - Uzak içeriğe erişim reddedildi (401) - - - - The operation requested on the remote content is not permitted - Uzak içerikte istenen işleme izin verilmedi - - - - The remote content was not found at the server (404) - Uzak içerik sunucuda bulunamadı (404) - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - Uzak sunucu, içeriği sunmak için kimlik doğrulaması gerektirir ancak verilen kimlik bilgileri kabul edilmedi - - - - The Network Access API cannot honor the request because the protocol is not known - Ağ Erişim API'si isteğe karşılık veremiyor çünkü protokol bilinmiyor - - - - The requested operation is invalid for this protocol - İstenen işlem bu protokol için geçersiz - - - - An unknown network-related error was detected - Bilinmeyen bir ağ-ile-ilgili hata saptandı - - - - An unknown proxy-related error was detected - Bilinmeyen bir proksi-ile-ilgili hata saptandı - - - - An unknown error related to the remote content was detected - Uzak içerikle ilgili bilinmeyen bir hata saptandı - - - - A breakdown in protocol was detected - Protokolde bir bozulma saptandı - - - - Unknown error - Bilinmeyen hata - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - GeoIP veritabanı yüklendi. Türü: %1. Yapım zamanı: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - GeoIP veritabanı yüklenemedi. Sebep: %1 - - - - Venezuela, Bolivarian Republic of - Venezüela Bolivar Cumhuriyeti - - - - Viet Nam - Vietnam - - - - - N/A - Yok - - - - Andorra - Andora - - - - United Arab Emirates - Birleşik Arap Emirlikleri + + Antigua and Barbuda + Antigua ve Barbuda - Afghanistan - Afganistan - - - - Antigua and Barbuda - Antigua ve Barbuda - - - Anguilla Anguilla - + Albania Arnavutluk - + Armenia Ermenistan - + Angola Angola - + Antarctica Antartika - + Argentina Arjantina - + American Samoa Amerikan Samoası - + Austria Avusturya - + Australia Avusturalya - + Aruba Aruba - + Azerbaijan Azerbaycan - + Bosnia and Herzegovina Bosna Hersek - + Barbados Barbados - + Bangladesh Bangladeş - + Belgium Belçika - + Burkina Faso Burkina Faso - + Bulgaria Bulgaristan - + Bahrain Bahreyn - + Burundi Burundi - + Benin Benin - + Bermuda Bermuda - + Brunei Darussalam Brunei Darussalam - + Brazil Brezilya - + Bahamas Bahamalar - + Bhutan Bhutan - + Bouvet Island Bouvet Adası - + Botswana Botsvana - + Belarus Beyaz Rusya - + Belize Beliz - + Canada Kanada - + Cocos (Keeling) Islands Cocos (Keeling) Adaları - + Congo, The Democratic Republic of the Demokratik Kongo Cumhuriyeti - + Central African Republic Orta Afrika Cumhuriyeti - + Congo Kongo - + Switzerland İsviçre - + Cook Islands Cook Adaları - + Chile Şili - + Cameroon Kamerun - + China Çin - + Colombia Kolombiya - + Costa Rica Kosta Rika - + Cuba Kuba - + Cape Verde Yeşil Burun Adaları - + Curacao Curaçao - + Christmas Island Christmas Adası - + Cyprus Kıbrıs - + Czech Republic Çek Cumhuriyeti - + Germany Almanya - + Djibouti Cibuti - + Denmark Danimarka - + Dominica Dominika - + Dominican Republic Dominik Cumhuriyeti - + Algeria Cezayir - + Ecuador Ekvator - + Estonia Estonya - + Egypt Mısır - + Western Sahara Batı Sahra - + Eritrea Eritre - + Spain İspanya - + Ethiopia Etiyopya - + Finland Finlandiya - + Fiji Fiji - + Falkland Islands (Malvinas) Falkland Adaları (Malvinas) - + Micronesia, Federated States of Mikronezya Federal Devletleri - + Faroe Islands Faroe Adaları - + France Fransa - + Gabon Gabon - + United Kingdom Birleşik Krallık - + Grenada Grenada - + Georgia Gürcistan - + French Guiana Fransız Guyanası - + Ghana Gana - + Gibraltar Cebelitarık - + Greenland Grönland - + Gambia Gambiya - + Guinea Gine - + Guadeloupe Guadeloupe - + Equatorial Guinea Ekvator Ginesi - + Greece Yunanistan - + South Georgia and the South Sandwich Islands Güney Georgia ve Güney Sandwich Adaları - + Guatemala Guatemala - + Guam Guam - + Guinea-Bissau Gine-Bissau - + Guyana Guyana - + Hong Kong Hong Kong - + Heard Island and McDonald Islands Heard Adası ve McDonald Adaları - + Honduras Honduras - + Croatia Hırvatistan - + Haiti Haiti - + Hungary Macaristan - + Indonesia Endonezya - + Ireland İrlanda - + Israel İsrail - + India Hindistan - + British Indian Ocean Territory Britanya Hint Okyanusu Toprakları - + Iraq Irak - + Iran, Islamic Republic of İran İslam Cumhuriyeti - + Iceland İzlanda - + Italy İtalya - + Jamaica Jamaika - + Jordan Ürdün - + Japan Japonya - + Kenya Kenya - + Kyrgyzstan Kırgizistan - + Cambodia Kamboçya - + Kiribati Kiribati - + Comoros Komorlar - + Saint Kitts and Nevis Saint Kitts ve Nevis - + Korea, Democratic People's Republic of Kore Demokratik Halk Cumhuriyeti - + Korea, Republic of Güney Kore - + Kuwait Kuveyt - + Cayman Islands Kayman Adaları - + Kazakhstan Kazakistan - + Lao People's Democratic Republic Laos Demokratik Halk Cumhuriyeti - + Lebanon Lübnan - + Saint Lucia Saint Lucia - + Liechtenstein Lihtenştayn - + Sri Lanka Sri Lanka - + Liberia Liberya - + Lesotho Lesotho - + Lithuania Litvanya - + Luxembourg Lüksemburg - + Latvia Letonya - + Morocco Fas - + Monaco Monako - + Moldova, Republic of Moldova Cumhuriyeti - + Madagascar Madakaskar - + Marshall Islands Marshall Adaları - + Mali Mali - + Myanmar Myanmar - + Mongolia Moğolistan - + Northern Mariana Islands Kuzey Mariana Adaları - + Martinique Martinik - + Mauritania Moritanya - + Montserrat Montserrat - + Malta Malta - + Mauritius Mauritius - + Maldives Maldivler - + Malawi Malavi - + Mexico Meksika - + Malaysia Malesya - + Mozambique Mozambik - + Namibia Namibya - + New Caledonia Yeni Kaledonya - + Niger Nijer - + Norfolk Island Norfolk Adası - + Nigeria Nijerya - + Nicaragua Nikaragua - + Netherlands Hollanda - + Norway Norveç - + Nepal Nepal - + Nauru Nauru - + Niue Niue - + New Zealand Yeni Zelanda - + Oman Oman - + Panama Panama - + Peru Peru - + French Polynesia Fransız Polinezyası - + Papua New Guinea Papua Yeni Gine - + Philippines Filipinler - + Pakistan Pakistan - + Poland Polonya - + Saint Pierre and Miquelon Saint Pierre ve Miquelon - + Puerto Rico Porto Riko - + Portugal Portekiz - + Palau Palau - + Paraguay Paraguay - + Qatar Katar - + Reunion Reunion - + Romania Romanya - + Russian Federation Rusya Federasyonu - + Rwanda Ruanda - + Saudi Arabia Suudi Arabistan - + Solomon Islands Solomon Adaları - + Seychelles Seyşeller - + Sudan Sudan - + Sweden İsveç - + Singapore Singapur - + Slovenia Slovenya - + Svalbard and Jan Mayen Svalbard ve Jan Mayen - + Slovakia Slovakya - + Sierra Leone Sierra Leone - + San Marino San Marino - + Senegal Senegal - + Somalia Somali - + Suriname Surinam - + Sao Tome and Principe Sao Tome ve Principe - + El Salvador El Salvador - + Syrian Arab Republic Suriye Arap Cumhuriyeti - + Swaziland Svaziland - + Turks and Caicos Islands Turks ve Caicos Adaları - + Chad Çad - + French Southern Territories Fransız Güney Toprakları - + Togo Togo - + Thailand Tayland - + Tajikistan Tacikistan - + Tokelau Tokelau - + Turkmenistan Türkmenistan - + Tunisia Tunus - + Tonga Tonga - - Could not decompress GeoIP database file. - Sıkıştırılmış GeoIP veritabanı dosyası açılamadı. - - - + Timor-Leste Doğu Timor - + Bolivia, Plurinational State of Çokuluslu Bolivya Devleti - + Bonaire, Sint Eustatius and Saba Bonaire, Sint Eustatius ve Saba - + Cote d'Ivoire Fildişi Sahili - + Libya Libya - + Saint Martin (French part) Saint Martin (Fransız kısmı) - + Macedonia, The Former Yugoslav Republic of Makedonya - + Macao Makao - + Pitcairn Pitcairn Adaları - + Palestine, State of Filistin Devleti - + Saint Helena, Ascension and Tristan da Cunha Saint Helena, Ascension ve Tristan da Cunha - + South Sudan Güney Sudan - + Sint Maarten (Dutch part) Sint Maarten (Hollandalı kısmı) - + Turkey Türkiye - + Trinidad and Tobago Trinidad ve Tobago - + Tuvalu Tuvalu - + Taiwan Tayvan - + Tanzania, United Republic of Tanzanya Birleşik Cumhuriyeti - + Ukraine Ukrayna - + Uganda Uganda - + United States Minor Outlying Islands Amerika Birleşik Devletleri Küçük Dış Adaları - + United States Amerika Birleşik Devletleri - + Uruguay Uruguay - + Uzbekistan Özbekistan - + Holy See (Vatican City State) Vatikan - + Saint Vincent and the Grenadines Saint Vincent ve Grenadinler - + Virgin Islands, British Britanya Virjin Adaları - + Virgin Islands, U.S. ABD Virjin Adaları - + Vanuatu Vanuatu - + Wallis and Futuna Wallis ve Futuna - + Samoa Samoa - + Yemen Yemen - + Mayotte Mayotte - + Serbia Sırbistan - + South Africa Güney Afrika - + Zambia Zambiya - + Montenegro Karadağ - + Zimbabwe Zimbabve - + Aland Islands Aland Adaları - + Guernsey Guernsey - + Isle of Man Man Adası - + Jersey Jersey - + Saint Barthelemy Saint Barthelemy - + + Could not uncompress GeoIP database file. + GeoIP veritabanı dosyası genişletilemedi. + + + Couldn't save downloaded GeoIP database file. İndirilmiş GeoIP veritabanı dosyası kaydedilemedi. - + Successfully updated GeoIP database. GeoIP veritabanı başarılı olarak güncellendi. - + Couldn't download GeoIP database file. Reason: %1 GeoIP veritabanı dosyası indirilemedi. Sebep: %1 @@ -4596,12 +4146,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] UPnP / NAT-PMP desteği [AÇIK] - + UPnP / NAT-PMP support [OFF] UPnP / NAT-PMP desteği [KAPALI] @@ -4609,7 +4159,7 @@ Net::Smtp - + Email Notification Error: E-posta Bildirim Hatası: @@ -4617,1279 +4167,1077 @@ OptionsDialog - + Options Seçenekler - + Behavior Davranış - + Downloads İndirmeler - + Connection Bağlantı - + Speed Hız - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI Web Arayüzü - + Advanced Gelişmiş - + Language Dil - + User Interface Language: Kullanıcı Arayüzü Dili: - + (Requires restart) (Yeniden başlatma gerektirir) - + Transfer List Aktarım Listesi - + Confirm when deleting torrents - Torrent'leri silerken onayla + Torrentleri silerken onayla - + Use alternating row colors In transfer list, one every two rows will have grey background. Değişen satır renkleri kullan - + Hide zero and infinity values Sıfır ve sonsuz değerleri gizle - + Always Her zaman - + Paused torrents only - Sadece duraklatılmış torrent'ler + Sadece duraklatılmış torrentler - + Action on double-click Çift tıklama eylemi - + Downloading torrents: - İndirilen torrent'ler: + İndirilen torrentler: - - + + Start / Stop Torrent - Torrent'i Başlat / Durdur + Torrenti Başlat / Durdur - - + + Open destination folder Hedef klasörü aç - - + + No action Eylem yok - + Completed torrents: - Tamamlanan torrent'ler: + Tamamlanan torrentler: - + Desktop Masaüstü - + Start qBittorrent on Windows start up Windows başlangıcında qBittorrent'i başlat - + Show splash screen on start up Başlangıçta karşılama ekranı göster - + Start qBittorrent minimized qBittorrent'i simge durumunda başlat - + Confirmation on exit when torrents are active - Torrent'ler etkinken çıkışta onay iste + Torrentler etkinken çıkışta onay iste - + Confirmation on auto-exit when downloads finish İndirmeler tamamlandığında otomatik çıkışta onay iste - - KiB - KiB - - - - Email notification &upon download completion - İndirmenin tamamlanması ü&zerine e-posta bildirimi yap - - - - Run e&xternal program on torrent completion - Torrent tamamlanmasında &harici program çalıştır - - - - IP Fi&ltering - IP Süz&me - - - - Schedule &the use of alternative rate limits - Alternatif oran sı&nırları kullanımını zamanla - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Daha fazla bilgi</a>) - - - - &Torrent Queueing - &Torrent Kuyruğu - - - - Seed torrents until their seeding time reaches - Torrent'leri şu gönderim süresine ulaşıncaya kadar gönder - - - - A&utomatically add these trackers to new downloads: - Bu izleyicileri &otomatik olarak yeni indirmelere ekle: - - - - RSS Reader - RSS Okuyucu - - - - Enable fetching RSS feeds - RSS bildirimlerini almayı etkinleştir - - - - Feeds refresh interval: - Bildirimleri yenileme aralığı: - - - - Maximum number of articles per feed: - Bildirim başına en fazla makale sayısı: - - - - - min - minutes - dak - - - - RSS Torrent Auto Downloader - RSS Torrent Otomatik İndirici - - - - Enable auto downloading of RSS torrents - RSS torrent'lerini otomatik indirmeyi etkinleştir - - - - Edit auto downloading rules... - Otomatik indirme kurallarını düzenle... - - - - Web User Interface (Remote control) - Web Kullanıcı Arayüzü (Uzak denetim) - - - - IP address: - IP adresi: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - Web Arayüzünün bağlanacağı IP adresi. -Bir IPv4 veya IPv6 adresi belirleyin. Herhangi bir IPv4 adresi için "0.0.0.0", -herhangi bir IPv6 adresi için "::", ya da her iki IPv4 ve IPv6 içinse "*" belirtebilirsiniz. - - - - Server domains: - Sunucu etki alanları: + + Show qBittorrent in notification area + qBittorrent'i bildirim alanında göster - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - HTTP Anamakine üstbilgi değerlerini süzmek için beyaz liste. -DNS'i yeniden bağlama saldırılarına karşı savunmak için, Web Arayüzü -sunucusu tarafından kullanılan etki alanı adlarına eklemelisiniz. - -Çoklu girişleri bölmek için ';' kullanın. '*' joker karakteri kullanılabilir. - - - - &Use HTTPS instead of HTTP - HTTP yerine HTTPS &kullan - - - - Bypass authentication for clients on localhost - Yerel makinedeki istemciler için kimlik doğrulamasını atlat - - - - Bypass authentication for clients in whitelisted IP subnets - Beyaz listeye alınmış IP alt ağlarındaki istemciler için kimlik doğrulamasını atlat - - - - IP subnet whitelist... - IP alt ağ beyaz listesi... - - - - Upda&te my dynamic domain name - Değişken etki alanı adımı &güncelle - - - + Minimize qBittorrent to notification area qBittorrent'i bildirim alanına küçült - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. qBittorrent'i bildirim alanına kapat - + Tray icon style: Tepsi simgesi stili: - + Normal Normal - + Monochrome (Dark theme) Siyah beyaz (Koyu tema) - + Monochrome (Light theme) Siyah beyaz (Açık tema) - + File association Dosya ilişkilendirme - + Use qBittorrent for .torrent files .torrent dosyaları için qBittorrent'i kullan - + Use qBittorrent for magnet links Magnet bağlantıları için qBittorrent'i kullan - + Power Management Güç Yönetimi - + + Inhibit system sleep when torrents are active + Torrentler etkinken bilgisayarın uykuya geçmesini engelle + + + + Log file + Günlük dosyası + + + Save path: Kaydetme yolu: - + Backup the log file after: Günlüğü şu boyuttan sonra yedekle: - + + MB + MB + + + Delete backup logs older than: Şu süreden eski yedek günlükleri sil: - + days Delete backup logs older than 10 months gün - + months Delete backup logs older than 10 months ay - + years Delete backup logs older than 10 years yıl - + When adding a torrent Bir torrent eklerken - + + Display torrent content and some options + Torrent içeriğini ve bazı seçenekleri görüntüle + + + Bring torrent dialog to the front - Torrent ileti penceresini öne getir + Torrent iletisini öne getir - + Do not start the download automatically The torrent will be added to download list in pause state İndirmeyi otomatik olarak başlatma - + Should the .torrent file be deleted after adding it Eklendikten sonra .torrent dosyası silinmeli mi - + + Delete .torrent files afterwards + Sonrasında .torrent dosyalarını sil + + + Also delete .torrent files whose addition was cancelled Ayrıca eklenmesi iptal edilmiş .torrent dosyalarını sil - + Also when addition is cancelled Ayrıca ekleme iptal edildiğinde - + Warning! Data loss possible! Uyarı! Veri kaybı mümkün! - + Saving Management Kaydetme Yönetimi - + Default Torrent Management Mode: Varsayılan Torrent Yönetim Kipi: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category Otomatik kip, çeşitli torrent özelliklerine (örn. kaydetme yolu) ilişkilendirilmiş kategori tarafından karar verileceği anlamına gelir - + Manual Elle - + Automatic Otomatik - + When Torrent Category changed: Torrent Kategorisi değiştiğinde: - + Relocate torrent - Torrent'in yerini değiştir + Torrentin yerini değiştir - + Switch torrent to Manual Mode Torrent'i Elle Kipine değiştir - + When Default Save Path changed: Varsayılan Kaydetme Yolu değiştiğinde: - - + + Relocate affected torrents - Etkilenmiş torrent'lerin yerini değiştir + Etkilenmiş torrentlerin yerini değiştir - - + + Switch affected torrents to Manual Mode - Etkilenmiş torrent'leri Elle Kipine değiştir + Etkilenmiş torrentleri Elle Kipine değiştir - + When Category changed: Kategori değiştiğinde: - + Use Subcategories Alt kategorileri kullan - + Default Save Path: Varsayılan Kaydetme Yolu: - + Keep incomplete torrents in: - Tamamlanmamış torrent'leri şurada tut: + Tamamlanmamış torrentleri şurada tut: - + Copy .torrent files to: .torrent dosyalarını şuraya kopyala: - - Show &qBittorrent in notification area - &qBittorrent'i bildirim alanında göster - - - - &Log file - &Günlük dosyası - - - - Display &torrent content and some options - &Torrent içeriğini ve bazı seçenekleri görüntüle - - - - Create subfolder for torrents with multiple files - Çoklu dosyaları olan torrent'ler için alt klasör oluştur - - - - De&lete .torrent files afterwards - Sonrasında .torrent dosyalarını si&l - - - + Copy .torrent files for finished downloads to: Tamamlanan indirmeler için .torrent dosyalarını şuraya kopyala: - + Pre-allocate disk space for all files Tüm dosyalar için disk alanını önceden ayır - - Inhibit system sleep when torrents are downloading - Torrentler indiriliyorken bilgisayarın uykuya geçmesini engelle - - - - Inhibit system sleep when torrents are seeding - Torrent'ler gönderiliyorken bilgisayarın uykuya geçmesini engelle - - - + Append .!qB extension to incomplete files Tamamlanmamış dosyalara .!qB uzantısı ekle - - Enable recursive download dialog - Tekrarlayan indirme ileti penceresini etkinleştir - - - + Automatically add torrents from: - Torrent'leri otomatik olarak şuradan ekle: + Torrentleri otomatik olarak şuradan ekle: - + Add entry Giriş ekle - + Remove entry Girişi kaldır - + + Email notification upon download completion + İndirmenin tamamlanması üzerine e-posta bildirimi yap + + + + Destination email: + Hedef e-posta: + + + SMTP server: SMTP sunucusu: - + This server requires a secure connection (SSL) Bu sunucu güvenli bir bağlantı gerektirir (SSL) - - + + + Authentication Kimlik Doğrulaması - - - - + + + + Username: Kullanıcı adı: - - - - + + + + Password: Parola: - - Enabled protocol: - Etkinleştirilmiş protokol: + + Run external program on torrent completion + Torrent tamamlanmasında harici program çalıştır - - TCP and μTP - TCP ve μTP - - - + Listening Port Dinlenen Bağlantı Noktası - + Port used for incoming connections: Gelen bağlantılar için kullanılan b.noktası: - + Random Rastgele - + Use UPnP / NAT-PMP port forwarding from my router Yönlendiricimden UPnP / NAT-PMP bağlantı noktası yönlendirmesi kullan - + Use different port on each startup Her başlangıçta farklı bağlantı noktası kullan - + Connections Limits Bağlantı Sınırları - + Maximum number of connections per torrent: Torrent başına en fazla bağlantı sayısı: - + Global maximum number of connections: Genel en fazla bağlantı sayısı: - + Maximum number of upload slots per torrent: Torrent başına en fazla gönderme yuvası sayısı: - + Global maximum number of upload slots: Genel en fazla gönderme yuvası sayısı: - + Proxy Server Proksi Sunucusu - + Type: Türü: - + (None) (Hiçbiri) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Anamakine: - - + + Port: B.Noktası: - + Otherwise, the proxy server is only used for tracker connections Aksi halde, proksi sunucusu sadece izleyici bağlantıları için kullanılır - + Use proxy for peer connections Kişi bağlantıları için proksi kullan - + Disable connections not supported by proxies Proksiler tarafından desteklenmeyen bağlantıları etkisizleştir - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Daha fazla bilgi</a>) - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - Torrent aktarımları ve ilgili işlemlerin (kişi değişimleri gibi) dışında RSS bildirimleri, arama motoru, yazılım güncellemeleri gibi herşey doğrudan bağlantı kullanacak + Torrent aktarımları ve ilgili işlemlerin (kişi değişimleri gibi) dışında RSS beslemeleri, arama motoru, yazılım güncellemeleri gibi herşey doğrudan bağlantı kullanacak - + Use proxy only for torrents - Sadece torrent'ler için proksi kullan + Sadece torrentler için proksi kullan - - A&uthentication - Kimlik Doğr&ulaması - - - + Info: The password is saved unencrypted Bilgi: Parola şifrelenmeden kaydedilir - + + IP Filtering + IP Süzme + + + Filter path (.dat, .p2p, .p2b): Süzgeç yolu (.dat, .p2p, .p2b): - + Reload the filter Süzgeci yeniden yükle - - Manually banned IP addresses... - El ile yasaklanan IP adresleri... - - - + Apply to trackers İzleyicilere uygula - + Global Rate Limits Genel Oran Sınırları - - - - - - - KiB/s - KiB/s - - - - + + Upload: Gönderme: - - + + + + + KiB/s + KiB/s + + + + Download: İndirme: - + Alternative Rate Limits Alternatif Oran Sınırları - - + + Schedule the use of alternative rate limits + Alternatif oran sınırları kullanımını zamanla + + + From: from (time1 to time2) - Buradan: + Bu saatten: - - + To: time1 to time2 - Buraya: + Bu saate: - + When: Zaman: - + Every day Her gün - + Weekdays Hafta içi - + Weekends Hafta sonu - + Rate Limits Settings Oran Sınırı Ayarları - + Apply rate limit to peers on LAN Oran sınırını LAN üzerindeki kişilere uygula - + Apply rate limit to transport overhead Oran sınırını aktarım ekyüküne uygula - - + + + Enable µTP protocol + µTP protokolünü etkinleştir + + + Apply rate limit to µTP protocol Oran sınırını µTP protokolüne uygula - + Privacy Gizlilik - + Enable DHT (decentralized network) to find more peers Daha çok kişi bulmak için DHT'yi (merkezsizleştirilmiş ağ) etkinleştir - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Kişileri uyumlu Bittorrent istemcileri ile değiştir (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers Daha çok kişi bulmak için Kişi Değişimi'ni (PeX) etkinleştir - + Look for peers on your local network Yerel ağınızdaki kişileri arar - + Enable Local Peer Discovery to find more peers Daha çok kişi bulmak için Yerel Kişi Keşfi'ni etkinleştir - + Encryption mode: Şifreleme kipi: - + Prefer encryption Şifrelemeyi tercih et - + Require encryption Şifreleme gerekir - + Disable encryption Şifrelemeyi etkisizleştir - + Enable when using a proxy or a VPN connection Bir proksi veya VPN bağlantısı kullanılırken etkinleştir - + Enable anonymous mode İsimsiz kipi etkinleştir - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Daha fazla bilgi</a>) + + + + Torrent Queueing + Torrent Kuyruğu + + + Maximum active downloads: En fazla aktif indirme: - + Maximum active uploads: En fazla aktif gönderme: - + Maximum active torrents: En fazla aktif torrent: - + Do not count slow torrents in these limits - Yavaş torrent'leri bu sınırlar içinde sayma - - - - Upload rate threshold: - Gönderme oranı eşiği: + Yavaş torrentleri bu sınırlar içinde sayma - - Download rate threshold: - İndirme oranı eşiği: - - - - sec - seconds - san - - - - Torrent inactivity timer: - Torrent boşta durma zamanlayıcısı: - - - + Share Ratio Limiting Paylaşma Oranı Sınırlama - + Seed torrents until their ratio reaches - Torrent'leri şu orana ulaşıncaya kadar gönder + Torrentleri şu orana ulaşıncaya kadar gönder - + then ondan sonra - + Pause them Bunları duraklat - + Remove them Bunları kaldır - - RSS Smart Episode Filters - RSS Akıllı Bölüm Süzgeçleri + + Automatically add these trackers to new downloads: + Bu izleyicileri otomatik olarak yeni indirmelere ekle: + + + + Enable Web User Interface (Remote control) + Web Kullanıcı Arayüzünü etkinleştir (Uzak denetim) - + Use UPnP / NAT-PMP to forward the port from my router Yönlendiricimden bağlantı noktasını yönlendirmek için UPnP / NAT-PMP kullan - + + Use HTTPS instead of HTTP + HTTP yerine HTTPS kullan + + + Certificate: Sertifika: - + Import SSL Certificate SSL Sertifikasını İçe Aktar - + Key: Anahtar: - + Import SSL Key SSL Anahtarını İçe Aktar - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Sertifikalar hakkında bilgi</a> - - Use alternative Web UI - Alternatif Web Arayüzü kullan - - - - Files location: - Dosyalar konumu: + + Bypass authentication for localhost + Yerel makineler için kimlik doğrulamasını atlat - - Enable clickjacking protection - Clickjacking korumasını etkinleştir + + Update my dynamic domain name + Değişken etki alanı adımı güncelle - - Enable Cross-Site Request Forgery (CSRF) protection - Siteler Arası İstek Sahteciliği (CSRF) korumasını etkinleştir - - - + Service: Hizmet: - + Register Kaydol - + Domain name: Etki alanı adı: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! Bu seçenekleri etkinleştirerek, .torrent dosyalarınızı <strong>geri alınamaz bir şekilde kaybedebilirsiniz</strong>! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - Bu seçenekler etkinleştirildiğinde, dosyalar başarılı olarak indirme kuyruğuna eklendikten (ilk seçenek) ya da eklenmedikten (ikinci seçenek) sonra qBittorrent .torrent dosyalarını <strong>silecek</strong>. Bu, sadece &ldquo;Torrent ekle&rdquo; menüsü eylemi yoluyla açık olan dosyalara <strong>değil</strong> ayrıca <strong>dosya türü ilişkilendirmesi</strong> yoluyla açılanlara da uygulanmayacaktır + Bu seçenekler etkinleştirildiğinde, dosyalar başarılı olarak indirme kuyruğuna eklendikten (ilk seçenek) ya da eklenmedikten (ikinci seçenek) sonra qBittorent .torrent dosyalarını <strong>silecek</strong>. Bu, sadece &ldquo;Torrent ekle&rdquo; menüsü eylemi yoluyla açık olan dosyalara <strong>değil</strong> ayrıca <strong>dosya türü ilişkilendirmesi</strong> yoluyla açılanlara da uygulanmayacaktır - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - Eğer ikinci seçeneği (&ldquo;Ayrıca ekleme iptal edildiğinde&rdquo;) etkinleştirirseniz, &ldquo;Torrent ekle&rdquo; ileti penceresinde &ldquo;<strong>İptal</strong>&rdquo; düğmesine bassanız bile .torrent dosyası <strong>silinecektir</strong> - - - - Choose Alternative UI files location - Alternatif Arayüz dosyaları konumunu seçin + Eğer ikinci seçeneği (&ldquo;Ayrıca ekleme iptal edildiğinde&rdquo;) etkinleştirirseniz, &ldquo;Torrent ekle&rdquo; ileti kutusunda &ldquo;<strong>İptal</strong>&rdquo; düğmesine bassanız bile .torrent dosyası <strong>silinecektir</strong> - + Supported parameters (case sensitive): Desteklenen parametreler (büyük küçük harfe duyarlı): - + %N: Torrent name %N: Torrent adı - + %L: Category %L: Kategori - - %G: Tags (seperated by comma) - %G: Etiketler (virgülle ayrıldı) - - - + %F: Content path (same as root path for multifile torrent) %F: İçerik yolu (çok dosyalı torrent için olan kök yolu ile aynı) - + %R: Root path (first torrent subdirectory path) %R: Kök yolu (ilk torrent alt dizin yolu) - + %D: Save path %D: Kaydetme yolu - + %C: Number of files %C: Dosya sayısı - + %Z: Torrent size (bytes) %Z: Torrent boyutu (bayt) - + %T: Current tracker %T: Şu anki izleyici - + %I: Info hash %I: Bilgi adreslemesi - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") İpucu: Metnin boşluktan kesilmesini önlemek için parametreyi tırnak işaretleri arasına alın (örn., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - Bir torrent, indirme ve gönderme oranları bu "Torrent boşta durma zamanlayıcısı" saniye değerinin altında kalırsa yavaş sayılacaktır - - - + Select folder to monitor İzlemek için bir klasör seçin - + Folder is already being monitored: Klasör zaten izleniyor: - + Folder does not exist: Klasör mevcut değil: - + Folder is not readable: Klasör okunabilir değil: - + Adding entry failed Giriş ekleme başarısız oldu - - - - + + Choose export directory Dışa aktarma dizini seçin - - - + + + + + + Choose a save directory Bir kaydetme dizini seçin - + Choose an IP filter file Bir IP süzgeci dosyası seçin - + All supported filters Tüm desteklenen süzgeçler - + SSL Certificate SSL Sertifikası - + + SSL Key + SSL Anahtarı + + + Parsing error Ayrıştırma hatası - + Failed to parse the provided IP filter Verilen IP süzgecini ayrıştırma başarısız - + Successfully refreshed Başarılı olarak yenilendi - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Verilen IP süzgeci başarılı olarak ayrıştırıldı: %1 kural uygulandı. - + Invalid key Geçersiz anahtar - + This is not a valid SSL key. Bu geçerli bir SSL anahtarı değil. - + Invalid certificate Geçersiz sertifika - - Preferences - Tercihler - - - - Import SSL certificate - SSL sertifikasını içe aktar - - - + This is not a valid SSL certificate. Geçerli bir SSL sertifikası değil. - - Import SSL key - SSL anahtarını içe aktar - - - - SSL key - SSL anahtarı - - - + Time Error Zaman Hatası - + The start time and the end time can't be the same. Başlangıç zamanı ve bitiş zamanı aynı olamaz. - - + + Length Error Uzunluk Hatası - + The Web UI username must be at least 3 characters long. Web Arayüzü kullanıcı adı en az 3 karakter uzunluğunda olmak zorundadır. - + The Web UI password must be at least 6 characters long. Web Arayüzü parolası en az 6 karakter uzunluğunda olmak zorundadır. @@ -5897,72 +5245,72 @@ PeerInfo - - Interested(local) and Choked(peer) - İlgilenen(yerel) ve Sıkışan(kişi) + + interested(local) and choked(peer) + ilgilenen(yerel) ve sıkışan(kişi) - + interested(local) and unchoked(peer) ilgilenen(yerel) ve sıkışmayan(kişi) - + interested(peer) and choked(local) ilgilenen(kişi) ve sıkışan(yerel) - + interested(peer) and unchoked(local) ilgilenen(kişi) ve sıkışmayan(yerel) - + optimistic unchoke iyimser sıkışmama - + peer snubbed kişi geri çevrildi - + incoming connection gelen bağlantı - + not interested(local) and unchoked(peer) ilgilenmeyen(yerel) ve sıkışmayan(kişi) - + not interested(peer) and unchoked(local) ilgilenmeyen(kişi) ve sıkışmayan(yerel) - + peer from PEX PEX'ten kişi - + peer from DHT DHT'den kişi - + encrypted traffic şifrelenmiş trafik - + encrypted handshake şifrelenmiş görüşme - + peer from LSD LSD'den kişi @@ -5970,180 +5318,165 @@ PeerListWidget - + IP IP - + Port B.Noktası - + Flags İşaretler - + Connection Bağlantı - + Client i.e.: Client application İstemci - + Progress i.e: % downloaded İlerleme - + Down Speed i.e: Download speed İndirme Hızı - + Up Speed i.e: Upload speed Gönderme Hızı - + Downloaded i.e: total data downloaded İndirilen - + Uploaded i.e: total data uploaded Gönderilen - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Uygunluk - + Files i.e. files that are being downloaded right now Dosyalar - + Column visibility Sütun görünürlüğü - + Add a new peer... Yeni bir kişi ekle... - - + + Ban peer permanently Kişiyi kalıcı olarak yasakla - + Manually adding peer '%1'... - El ile eklenen kişi '%1'... + Kişi '%1' el ile ekleniyor... - + The peer '%1' could not be added to this torrent. - Kişi '%1' bu torrent'e eklenemedi. + Kişi '%1' bu torrente eklenemedi. - + Manually banning peer '%1'... - El ile yasaklanan kişi '%1'... + Kişi '%1' el ile yasaklanıyor... - - + + Peer addition Kişi ekleme - + Country Ülke - + Copy IP:port IP:b.noktasını kopyala - + Some peers could not be added. Check the Log for details. - Bazı kişiler eklenemedi. Ayrıntılar için Günlüğü denetleyin. + Bazı kişiler eklenemedi. Ayrıntılar için Günlüğü kontrol edin. - + The peers were added to this torrent. - Kişiler bu torrent'e eklendi. + Kişiler bu torrente eklendi. - + Are you sure you want to ban permanently the selected peers? Seçilen kişileri kalıcı olarak yasaklamak istediğinize emin misiniz? - + &Yes &Evet - + &No &Hayır - PeersAdditionDialog - - - Add Peers - Kişileri Ekle - - - - List of peers to add (one IP per line): - Eklemek için kişilerin listesi (satır başına bir IP): - - - - Format: IPv4:port / [IPv6]:port - Biçim: IPv4:b.noktası / [IPv6]:b.noktası - + PeersAdditionDlg - + No peer entered Girilmiş kişi yok - + Please type at least one peer. Lütfen en az bir kişi yazın. - + Invalid peer Geçersiz kişi - + The peer '%1' is invalid. Kişi '%1' geçersiz. @@ -6151,12 +5484,12 @@ PieceAvailabilityBar - + White: Unavailable pieces Beyaz: Mevcut olmayan parçalar - + Blue: Available pieces Mavi: Mevcut parçalar @@ -6164,337 +5497,293 @@ PiecesBar - + Files in this piece: Bu parçadaki dosyalar: - + File in this piece Bu parçadaki dosya - + File in these pieces Bu parçalardaki dosya - - Wait until metadata become available to see detailed information - Ayrıntılı bilgileri görmek için üstveri mevcut olana kadar bekle - - - + Hold Shift key for detailed information Ayrıntılı bilgiler için Shift tuşunu basılı tutun - PluginSelectDialog + PluginSelectDlg - + Search plugins Arama eklentileri - + Installed search plugins: Yüklenmiş arama eklentileri: - + Name Adı - + Version Sürüm - + Url Url - - + + Enabled Etkinleştirildi - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - Uyarı: Bu arama motorlarının herhangi birinden torrent'leri indirirken ülkenizin telif hakkı yasalarına uyduğunuzdan emin olun. - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> Yeni arama motoru eklentilerini buradan alabilirsiniz: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one Yeni bir tane yükle - + Check for updates - Güncellemeleri denetle + Güncellemeleri kontrol et - + Close Kapat - + Uninstall Kaldır - - - + + + Yes Evet - - - - + + + + No Hayır - + Uninstall warning Kaldırma uyarısı - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. Bazı eklentiler kaldırılamadı çünkü bunlar qBittorrent'e dahil edilmiş durumda. Sadece kendi ekledikleriniz kaldırılabilir. Bu eklentiler etkisizleştirildi. - + Uninstall success Kaldırma başarılı - + All selected plugins were uninstalled successfully Tüm seçilen eklentiler başarılı olarak kaldırıldı - - - - - Search plugin update - Arama eklentisi güncellemesi - - - - Plugins installed or updated: %1 - Yüklenen ve güncellenen eklentiler: %1 - - - - + + New search engine plugin URL Yeni arama motoru eklenti URL'si - - + + URL: URL: - + Invalid link Geçersiz bağlantı - + The link doesn't seem to point to a search engine plugin. Bağlantı bir arama motoru eklentisini gösteriyor görünmüyor. - + Select search plugins Arama eklentilerini seç - + qBittorrent search plugin qBittorrent arama eklentisi - + + + + Search plugin update + Arama eklentisi güncellemesi + + + All your plugins are already up to date. Tüm eklentileriniz zaten güncel. - + Sorry, couldn't check for plugin updates. %1 - Üzgünüz, eklenti güncellemeleri denetlenemedi. %1 + Üzgünüz, eklenti güncellemeleri kontrol edilemedi. %1 - + + + Search plugin install Arama eklentisi yüklemesi - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + "%1" arama motoru eklentisi başarılı olarak yüklendi. + + + Couldn't install "%1" search engine plugin. %2 "%1" arama motoru eklentisi yüklenemedi. %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + "%1" arama motoru eklentisi başarılı olarak güncellendi. + + + Couldn't update "%1" search engine plugin. %2 "%1" arama motoru eklentisi güncellenemedi. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source Eklenti kaynağı - + Search plugin source: Arama eklentisi kaynağı: - + Local file Yerel dosya - + Web link Web bağlantısı - PowerManagement - - - qBittorrent is active - qBittorrent etkin - - - - PreviewSelectDialog - - - Preview - Önizle - + PreviewSelect - + Name Adı - + Size Boyut - + Progress İlerleme - - + + Preview impossible Önizleme imkansız - - + + Sorry, we can't preview this file Üzgünüz, bu dosyanın önizlemesini yapamıyoruz - Private::FileLineEdit - - - '%1' does not exist - '%1' mevcut değil - - - - '%1' does not point to a directory - '%1' bir dizini işaret etmiyor - - - - '%1' does not point to a file - '%1' bir dosyayı işaret etmiyor - - - - Does not have read permission in '%1' - '%1' içinde okuma izni yok - - - - Does not have write permission in '%1' - '%1' içinde yazma izni yok - - - PropListDelegate - + Not downloaded İndirilmedi - - + + Normal Normal (priority) Normal - - N/A - Yok - - - + Do not download Do not download (priority) - İndirme yapma + İndirme yapma - - + + High High (priority) Yüksek - + N/A + Yok + + + Mixed Mixed (priorities Karışık - - + + Maximum Maximum (priority) En yüksek @@ -6503,32 +5792,32 @@ PropTabBar - + General Genel - + Trackers İzleyiciler - + Peers Kişiler - + HTTP Sources HTTP Kaynakları - + Content İçerik - + Speed Hız @@ -6622,22 +5911,22 @@ Yorum: - + Select All Tümünü Seç - + Select None Hiçbirini Seçme - + Normal Normal - + High Yüksek @@ -6697,165 +5986,165 @@ Kaydetme Yolu: - + Maximum En yüksek + - Do not download İndirme yapma - + Never Asla - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (%3 var) - - + + %1 (%2 this session) - %1 (bu oturumda %2) + %1 (bu oturumda %2): - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (gönderilme %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (en fazla %2) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (toplam %2) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (ort. %2) - + Open - + Open Containing Folder İçerdiği Klasörü Aç - + Rename... Yeniden Adlandır... - + Priority Öncelik - + New Web seed Yeni Web gönderimi - + Remove Web seed Web gönderimini kaldır - + Copy Web seed URL Web gönderim URL'sini kopyala - + Edit Web seed URL Web gönderim URL'sini düzenle - + + Rename the file + Dosyayı yeniden adlandır + + + New name: Yeni adı: - - + + + The file could not be renamed + Dosya yeniden adlandırılamadı + + + + This file name contains forbidden characters, please choose a different one. + Bu dosya adı yasak karakterler içeriyor, lütfen başka bir tane seçin. + + + + This name is already in use in this folder. Please use a different name. Bu ad zaten bu klasör içinde kullanımda, Lütfen farklı bir ad kullanın. - + The folder could not be renamed Klasör yeniden adlandırılamadı - + qBittorrent qBittorrent - + Filter files... - Dosyaları süzün... - - - - Renaming - Yeniden adlandırma - - - - - Rename error - Yeniden adlandırma hatası - - - - The name is empty or contains forbidden characters, please choose a different one. - İsim boş ya da yasak karakterler içeriyor, lütfen farklı bir tane seçin. + Dosyaları süz... - + New URL seed New HTTP source Yeni URL gönderimi - + New URL seed: Yeni URL gönderimi: - - + + This URL seed is already in the list. Bu URL gönderimi zaten listede. - + Web seed editing Web gönderim düzenleme - + Web seed URL: Web gönderim URL'si: @@ -6863,585 +6152,551 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + IP adresiniz çok fazla başarısız kimlik doğrulaması denemesinden sonra yasaklandı. + + + + Error: '%1' is not a valid torrent file. + + Hata: '%1' geçerli bir torrent dosyası değil. + + + + + Error: Could not add torrent to session. + Hata: Torrent oturuma eklenemedi. + + + + I/O Error: Could not create temporary file. + G/Ç Hatası: Geçici dosya oluşturamadı. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 bilinmeyen bir komut satırı parametresidir. - - + + %1 must be the single command line parameter. %1 tek komut satırı parametresi olmak zorundadır. - + + %1 must specify the correct port (1 to 65535). + %1 doğru bağlantı noktasını belirtmek zorunda (1'den 65535'e). + + + You cannot use %1: qBittorrent is already running for this user. %1 kullanamazsınız: qBittorrent zaten bu kullanıcı için çalışıyor. - + Usage: Kullanım: - + Options: Seçenekler: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - Parametre '%1', '%1=%2' sözdizimi şeklinde olmak zorunda + + Displays program version + Program sürümünü görüntüler + + + + Displays this help message + Bu yardım iletisini görüntüler - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - Parametre '%1', '%1=%2' sözdizimi şeklinde olmak zorunda + + Changes the Web UI port (current: %1) + Web Arayüzü bağlantı noktasını değiştirir (şu anki: %1) - - Expected integer number in environment variable '%1', but got '%2' - Ortam değişkeni '%1' içinde beklenen tam sayı, ancak '%2' var + + Disable splash screen + Karşılama ekranını etkisizleştir - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - Parametre '%1', '%1=%2' sözdizimi şeklinde olmak zorunda + + Run in daemon-mode (background) + Arka plan programı kipinde çalıştır (arka planda) - - Expected %1 in environment variable '%2', but got '%3' - Ortam değişkeni '%2' içinde beklenen %1, ancak '%3' var + + Downloads the torrents passed by the user + Kullanıcı tarafından atlanmış torrentleri indirir - - port - b.noktası + + Help + Yardım - - %1 must specify a valid port (1 to 65535). - %1 geçerli bir bağlantı noktasını belirtmek zorunda (1'den 65535'e). + + Run application with -h option to read about command line parameters. + Komut satırı parametreleri hakkında bilgi için uygulamayı -h seçeneği ile çalıştırın. - - Display program version and exit - Program sürümünü görüntüle ve çık + + Bad command line + Hatalı komut satırı - - Display this help message and exit - Bu yardım iletisini görüntüle ve çık + + Bad command line: + Hatalı komut satırı: - - Change the Web UI port - Web Arayüzü bağlantı noktasını değiştir + + Legal Notice + Yasal Bildiri - - Disable splash screen - Karşılama ekranını etkisizleştir + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + qBittorrent bir dosya paylaşım programıdır. Bir torrent çalıştırdığınızda verileri başkaları için kullanılabilir yani başkalarına gönderilebilir olacaktır. Paylaştığınız herhangi bir içerik sizin sorumluluğunuzdadır. + +Başka bir bildiri yayınlanmayacaktır. - - Run in daemon-mode (background) - Arka plan programı kipinde çalıştır (arka planda) + + Press %1 key to accept and continue... + Kabul etmek ve devam etmek için %1 tuşuna basın... - - dir - Use appropriate short form or abbreviation of "directory" - dizin + + Legal notice + Yasal bildiri - - Store configuration files in <dir> - Yapılandırma dosyalarını <dir> içinde depola + + Cancel + İptal - - - name - adı + + I Agree + Kabul Ediyorum - - Store configuration files in directories qBittorrent_<name> - Yapılandırma dosyalarını qBittorrent_<dir> dizinlerinde depola + + Torrent name: %1 + Torrent adı: %1 - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Libtorrent hızlı devam dosyaları içine girin ve dosya yollarını profil dizinine göre yapın + + Torrent size: %1 + Torrent boyutu: %1 - - files or URLs - dosyalar veya URL'ler + + Save path: %1 + Kaydetme yolu: %1 - - Download the torrents passed by the user - Kullanıcı tarafından atlanmış torrentleri indir + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Torrent, %1 içine indirildi. - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - Bir torrent eklenirken "Yeni Torrent Ekle" ileti penceresinin açılıp açılmayacağını belirle. + + Thank you for using qBittorrent. + qBittorrent'i kullandığınız için teşekkür ederiz. - - Options when adding new torrents: - Yeni torrent'ler eklenirken seçenekler: + + [qBittorrent] '%1' has finished downloading + [qBittorrent] '%1' indirmeyi tamamladı - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - %1 için kısayol + + The remote host name was not found (invalid hostname) + Uzak anamakine adı bulunamadı (geçersiz anamakine adı) - - path - yol + + The operation was canceled + İşlem iptal edildi - - Torrent save path - Torrent kaydetme yolu + + The remote server closed the connection prematurely, before the entire reply was received and processed + Uzak sunucu, tam bir yanıt alınmadan ve işlenmeden önce bağlantıyı erken kapattı - - Add torrents as started or paused - Torrent'leri başlatıldı veya duraklatıldı olarak ekle + + The connection to the remote server timed out + Uzak sunucuya bağlantı zaman aşımına uğradı - - Skip hash check - Adresleme denetimini atla + + SSL/TLS handshake failed + SSL/TLS görüşmesi başarısız oldu - - Assign torrents to category. If the category doesn't exist, it will be created. - Torrent'leri kategoriye ata. Eğer kategori mevcut değilse, oluşturulacaktır. + + The remote server refused the connection + Uzak sunucu bağlantıyı reddetti - - Download files in sequential order - Dosyaları sıralı düzende indir + + The connection to the proxy server was refused + Proksi sunucusuna bağlantı reddedildi - - Download first and last pieces first - Önce ilk ve son parçaları indir + + The proxy server closed the connection prematurely + Proksi sunucusu bağlantıyı erken kapattı - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - Ortam değişkenleri aracılığıyla seçenek değerleri sağlanabilir. 'parameter-name' olarak adlandırılan seçenek için ortam değişkeni adı 'QBT_PARAMETER_NAME'dir (büyük harf olarak, '-' karakteri '_' ile değiştirildi). İşaretleme değerlerini geçmek için değişkeni '1' veya 'TRUE' olarak ayarlayın. Örneğin, karşılama ekranını etkisizleştirmek için: + + The proxy host name was not found + Proksi anamakine adı bulunamadı - - Command line parameters take precedence over environment variables - Komut satırı parametreleri ortam değişkenleri üzerinde öncelik alır + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Proksi sunucusuna bağlantı zaman aşımına uğradı ya da proksi gönderilen isteğe zamanında yanıt vermedi - - Help - Yardım + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Proksi, isteğe karşılık vermek için kimlik doğrulaması gerektirir ancak verilen kimlik bilgilerinin hiçbirini kabul etmedi - - Run application with -h option to read about command line parameters. - Komut satırı parametreleri hakkında bilgi için uygulamayı -h seçeneği ile çalıştırın. + + The access to the remote content was denied (401) + Uzak içeriğe erişim reddedildi (401) - - Bad command line - Hatalı komut satırı + + The operation requested on the remote content is not permitted + Uzak içerikte istenen işleme izin verilmedi - - Bad command line: - Hatalı komut satırı: + + The remote content was not found at the server (404) + Uzak içerik sunucuda bulunamadı (404) - - Legal Notice - Yasal Bildiri + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Uzak sunucu, içeriği sunmak için kimlik doğrulaması gerektirir ancak verilen kimlik bilgileri kabul edilmedi - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - qBittorrent bir dosya paylaşım programıdır. Bir torrent çalıştırdığınızda verileri başkaları için kullanılabilir yani başkalarına gönderilebilir olacaktır. Paylaştığınız herhangi bir içerik sizin sorumluluğunuzdadır. + + The Network Access API cannot honor the request because the protocol is not known + Ağ Erişim API'si isteğe karşılık veremiyor çünkü protokol bilinmiyor - - No further notices will be issued. - Başka bir bildiri yayınlanmayacaktır. + + The requested operation is invalid for this protocol + İstenen işlem bu protokol için geçersiz - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - qBittorrent bir dosya paylaşım programıdır. Bir torrent çalıştırdığınızda verileri başkaları için kullanılabilir yani başkalarına gönderilebilir olacaktır. Paylaştığınız herhangi bir içerik sizin sorumluluğunuzdadır. - -Başka bir bildiri yayınlanmayacaktır. + + An unknown network-related error was detected + Bilinmeyen bir ağ-ile-ilgili hata saptandı - - Press %1 key to accept and continue... - Kabul etmek ve devam etmek için %1 tuşuna basın... + + An unknown proxy-related error was detected + Bilinmeyen bir proksi-ile-ilgili hata saptandı - - Legal notice - Yasal bildiri + + An unknown error related to the remote content was detected + Uzak içerikle ilgili bilinmeyen bir hata saptandı - - Cancel - İptal + + A breakdown in protocol was detected + Protokolde bir bozulma saptandı - - I Agree - Kabul Ediyorum + + Unknown error + Bilinmeyen hata - - + + Upgrade Yükselt - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] Dosyaları farklı olarak kaydeden eski bir sürümden güncellediniz. Yeni kaydetme sistemine geçirmek zorundasınız. Artık v3.3.0 sürümünden daha eski bir sürümü kullanamayacaksınız. Devam edilsin mi? [e/h] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. Dosyaları farklı olarak kaydeden eski bir sürümden güncellediniz. Yeni kaydetme sistemine geçirmek zorundasınız. Eğer devam ederseniz, artık v3.3.0 sürümünden daha eski bir sürümü kullanamayacaksınız. - + Couldn't migrate torrent with hash: %1 - Torrent'in geçirilmesi şu adresleme ile yapılamadı: %1 + Torrentin geçirilmesi şu adresleme ile yapılamadı: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 - Torrent'in geçirilmesi yapılamadı. Geçersiz hızlı devam etme dosya adı: %1 + Torrentin geçirilmesi yapılamadı. Geçersiz hızlı devam etme dosya adı: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 - Programdan düzgün olmayan bir şekilde çıkıldığı algılandı. Ayarları geri yüklemek için geri alma dosyası kullanılıyor: %1 + + Detected unclean program exit. Using fallback file to restore settings. + Programdan düzgün olmayan bir şekilde çıkıldığı algılandı. Ayarları geri yüklemek için geri alma dosyası kullanılıyor. - + An access error occurred while trying to write the configuration file. Yapılandırma dosyasını yazmaya çalışırken bir erişim hatası meydana geldi. - + A format error occurred while trying to write the configuration file. Yapılandırma dosyasını yazmaya çalışırken bir biçim hatası meydana geldi. - - - An unknown error occurred while trying to write the configuration file. - Yapılandırma dosyasını yazmaya çalışırken bilinmeyen bir hata meydana geldi. - - RSS::AutoDownloader + RSS - - - Invalid data format. - Geçersiz veri biçimi. + + Search + Arama - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - %1 içine RSS Otoİndirici verileri kaydedilemedi. Hata: %2 + + New subscription + Yeni abonelik - - Invalid data format - Geçersiz veri biçimi + + + + Mark items read + Öğeleri okundu olarak işaretle - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - %1 adresinden RSS Otoİndirici kuralları okunamadı. Hata: %2 + + Update all + Tümünü güncelle - - Couldn't load RSS AutoDownloader rules. Reason: %1 - RSS Otoİndirici kuralları yüklenemedi. Sebep: %1 + + RSS Downloader... + RSS İndirici... - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - RSS bildirimini '%1' adresinden indirme başarısız. Sebep: %2 + + Settings... + Ayarlar... - - RSS feed at '%1' updated. Added %2 new articles. - '%1' adresinden RSS bildirimi güncellendi. %2 yeni makale eklendi. + + Torrents: (double-click to download) + Torrentler: (indirmek için çift tıklayın) - - Failed to parse RSS feed at '%1'. Reason: %2 - RSS bildirimini '%1' adresinden ayrıştırma başarısız. Sebep: %2 + + + Delete + Sil - - Couldn't read RSS Session data from %1. Error: %2 - %1 adresinden RSS Oturum verileri okunamadı. Hata: %2 + + Rename... + Yeniden adlandır... - - Couldn't parse RSS Session data. Error: %1 - RSS Oturum verileri ayrıştırılamadı. Hata: %1 + + Rename + Yeniden adlandır - - Couldn't load RSS Session data. Invalid data format. - RSS Oturum verileri yüklenemedi. Geçersiz veri biçimi. - - - - Couldn't load RSS article '%1#%2'. Invalid data format. - RSS makalesi '%1#%2' yüklenemedi. Geçersiz veri biçimi. - - - - RSS::Private::Parser - - - Invalid RSS feed. - Geçersiz RSS bildirimi. - - - - %1 (line: %2, column: %3, offset: %4). - %1 (satır: %2, sütün: %3, çıkıntı: %4). - - - - RSS::Session - - - RSS feed with given URL already exists: %1. - Verilen URL ile RSS bildirimi zaten var: %1. - - - - Cannot move root folder. - Kök klasör taşınamıyor. - - - - - Item doesn't exist: %1. - Öğe mevcut değil: %1. - - - - Cannot delete root folder. - Kök klasör silinemiyor. - - - - Incorrect RSS Item path: %1. - Yanlış RSS Öğesi yolu: %1. + + + Update + Güncelle - - RSS item with given path already exists: %1. - Verilen yol ile RSS öğesi zaten var: %1. + + New subscription... + Yeni abonelik... - - Parent folder doesn't exist: %1. - Ana klasör mevcut değil: %1. + + + Update all feeds + Tüm beslemeleri güncelle - - - RSSWidget - - Search - Ara + + Download torrent + Torrenti indir - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - RSS bildirimlerinin alınması şimdi etkisizleştirildi! Uygulama ayarlarından etkinleştirebilirsiniz. + + Open news URL + Haber URL'sini aç - - New subscription - Yeni abonelik + + Copy feed URL + Besleme URL'sini kopyala - - - - Mark items read - Öğeleri okundu olarak işaretle + + New folder... + Yeni klasör... - + Refresh RSS streams RSS akışlarını yenile + + + RSSImp - - Update all - Tümünü güncelle - - - - RSS Downloader... - RSS İndirici... - - - - Torrents: (double-click to download) - Torrent'ler: (indirmek için çift tıklayın) - - - - - Delete - Sil + + Stream URL: + Akış URL'si: - - Rename... - Yeniden adlandır... + + Please type a RSS stream URL + Lütfen bir RSS akışı URL'si yazın - - Rename - Yeniden adlandır + + This RSS feed is already in the list. + Bu RSS beslemesi zaten listede. - - - Update - Güncelle + + Please choose a folder name + Lütfen bir klasör adı seçin - - New subscription... - Yeni abonelik... + + Folder name: + Klasör adı: - - - Update all feeds - Tüm bildirimleri güncelle + + New folder + Yeni klasör - - Download torrent - Torrent'i indir + + Deletion confirmation + Silme onayı - - Open news URL - Haber URL'sini aç + + Are you sure you want to delete the selected RSS feeds? + Seçilen RSS beslemelerini silmek istediğinize emin misiniz? - - Copy feed URL - Bildirim URL'sini kopyala + + Please choose a new name for this RSS feed + Lütfen bu RSS beslemesi için yeni bir ad seçin - - New folder... - Yeni klasör... + + New feed name: + Yeni besleme adı: - - Please choose a folder name - Lütfen bir klasör adı seçin + + Name already in use + Bu ad kullanımda - - Folder name: - Klasör adı: + + This name is already used by another item, please choose another one. + Bu ad başka bir öğe tarafından zaten kullanılıyor, lütfen başka bir tane seçin. - - New folder - Yeni klasör + + Date: + Tarih: - - Please type a RSS feed URL - Lütfen bir RSS bildirim URL'si yazın + + Author: + Hazırlayan: - - Feed URL: - Bildirim URL'si: + + Unread + Okunmadı + + + Rss::Feed - - Deletion confirmation - Silme onayı + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + '%2' RSS beslemesinden '%1' torrentini otomatik indirme başarısız oldu çünkü bir torrent veya magnet bağlantısı içermiyor... - - Are you sure you want to delete the selected RSS feeds? - Seçilen RSS bildirimlerini silmek istediğinize emin misiniz? + + Automatically downloading '%1' torrent from '%2' RSS feed... + '%2' RSS beslemesinden '%1' torrenti otomatik olarak indiriliyor... + + + Rss::Private::Parser - - Please choose a new name for this RSS feed - Lütfen bu RSS bildirimi için yeni bir ad seçin + + Invalid RSS feed. + Geçersiz RSS beslemesi. + + + RssSettingsDlg - - New feed name: - Yeni bildirim adı: + + RSS Reader Settings + RSS Okuyucu Ayarları - - Rename failed - Yeniden adlandırma başarısız oldu + + RSS feeds refresh interval: + RSS beslemeleri yenileme aralığı: - - Date: - Tarih: + + min + dak - - Author: - Hazırlayan: + + Maximum number of articles per feed: + Besleme başına en fazla makale sayısı: ScanFoldersDelegate - + Select save location Kaydetme yerini seçin @@ -7449,274 +6704,268 @@ ScanFoldersModel - + Monitored Folder İzlenen Klasör - + Override Save Location - Geçersiz Kılınan Kaydetme Yeri + Kaydetme Yerini Geçersiz Kıl - + Monitored folder İzlenen klasör - + Default save location - Varsayılan kaydetme yeri + Varsayılan kaydetme yolu - + Browse... Gözat... - SearchJobWidget + SearchEngine - - Form - Form + + Unknown search engine plugin file format. + Bilinmeyen arama motoru eklentisi dosya biçimi. - - Results(xxx) - Sonuçlar(xxx) + + A more recent version of this plugin is already installed. + Bu eklentinin en son sürümü zaten yüklü. - - Search in: - Aranan: + + + Plugin is not supported. + Eklenti desteklenmiyor. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - <html><head/><body><p>Bazı arama motorları torrent açıklamalarında ve torrent dosya adlarında da arar. Bu tür sonuçlar bu kip tarafından denetlenen aşağıdaki listede gösterilecektir.</p><p><span style=" font-weight:600;">Her yeri</span> seçeneği süzmeyi etkisizleştirir ve arama motorları tarafından döndürülen her şeyi gösterir.</p><p><span style=" font-weight:600;">Sadece torrent adları</span> seçeneği sadece adları arama sorgusuyla eşleşen torrent'leri gösterir.</p></body></html> + + Update server is temporarily unavailable. %1 + Güncelleme sunucusu geçici olarak kullanılamaz. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - <html><head/><body><p>Gönderenlerin izin verilen en az ve en fazla sayısını ayarla</p></body></html> + + + Failed to download the plugin file. %1 + Eklenti dosyasını indirme başarısız. %1 - - Seeds: - Gönderim: + + An incorrect update info received. + Yanlış bir güncelleme bilgisi alındı. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - <html><head/><body><p>En az gönderim sayısı</p></body></html> + + All categories + Tüm kategoriler - - - to - > + + Movies + Filmler - - <html><head/><body><p>Maximal number of seeds</p></body></html> - <html><head/><body><p>En fazla gönderim sayısı</p></body></html> + + TV shows + TV programları - - - - + + Music + Müzik - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - <html><head/><body><p>Bir torrent'in izin verilen en az ve en fazla boyutunu ayarla</p></body></html> + + Games + Oyunlar - - Size: - Boyut: + + Anime + Çizgi Film - - <html><head/><body><p>Minimal torrent size</p></body></html> - <html><head/><body><p>En az torrent boyutu</p></body></html> + + Software + Yazılım - - <html><head/><body><p>Maximal torrent size</p></body></html> - <html><head/><body><p>En fazla torrent boyutu</p></body></html> + + Pictures + Resimler + + + + Books + Kitaplar + + + + SearchListDelegate + + + + Unknown + Bilinmiyor + + + SearchTab - + Name i.e: file name Adı - + Size i.e: file size Boyut - + Seeders i.e: Number of full sources Gönderen - + Leechers i.e: Number of partial sources Çeken - + Search engine Arama motoru - - Filter search results... - Arama sonuçlarını süzün... - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results Sonuçlar (<i>%1</i> / <i>%2</i> gösteriliyor): - + Torrent names only Sadece torrent adları - + Everywhere - Her yeri - - - - Use regular expressions - Düzenli ifadeleri kullan + Her yerde - + Searching... Aranıyor... - + Search has finished Arama tamamlandı - + Search aborted Arama iptal edildi - + An error occurred during search... Arama sırasında bir hata meydana geldi... - + Search returned no results Arama hiç sonuç bulamadı - + Column visibility - Sütun görünürlüğü - - - - SearchPluginManager - - - Unknown search engine plugin file format. - Bilinmeyen arama motoru eklentisi dosya biçimi. + Sütun görünürlüğü - - A more recent version of this plugin is already installed. - Bu eklentinin en son sürümü zaten yüklü. - - - - - Plugin is not supported. - Eklenti desteklenmiyor. + + Form + Form - - All categories - Tüm kategoriler + + Results(xxx) + Sonuçlar(xxx) - - Movies - Filmler + + Search in: + Aranan: - - TV shows - TV programları + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Bazı arama motorları torrent açıklamlarında ve torrent dosya adlarında da arar. Bu tür sonuçlar bu kip tarafından denetlenen aşağıdaki listede gösterilecektir.</p><p><span style=" font-weight:600;">Her yerde</span> seçeneği süzmeyi etkisizleştirir ve arama motorları tarafından döndürülen her şeyi gösterir.</p><p><span style=" font-weight:600;">Sadece torrent adları</span> seçeneği sadece adları arama sorgusuyla eşleşen torrentleri gösterir.</p></body></html> - - Music - Müzik + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Gönderenlerin izin verilen en az ve en fazla sayısını ayarla</p></body></html> - - Games - Oyunlar + + Seeds: + Gönderim: - - Anime - Çizgi Film + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>En küçük gönderim sayısı</p></body></html> - - Software - Yazılım + + + to + > - - Pictures - Resimler + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>En büyük gönderim sayısı</p></body></html> - - - Books - Kitaplar + + + + + - - Update server is temporarily unavailable. %1 - Güncelleme sunucusu geçici olarak kullanılamaz. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Bir torrentin izin verilen en az ve en fazla boyutunu ayarla</p></body></html> - - - Failed to download the plugin file. %1 - Eklenti dosyasını indirme başarısız. %1 + + Size: + Boyut: - - An incorrect update info received. - Yanlış bir güncelleme bilgisi alındı. + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>En küçük torrent boyutu</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - Aranan eklenti '%1' geçersiz sürüm dizgisi ('%2') içeriyor + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>En büyük torrent boyutu</p></body></html> @@ -7724,251 +6973,238 @@ - - - - + + + Search Ara - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - Hiçbir arama eklentisi yüklü değil. -Bazılarını yüklemek için pencerenin sağ altındaki "Arama eklentileri..." düğmesine tıklayın. - - - + Download İndir - + Go to description page Açıklama sayfasına git - + Copy description page URL Açıklama sayfası URL'sini kopyala - + Search plugins... Arama eklentileri... - + A phrase to search for. Aranacak bir ifade. - + Spaces in a search term may be protected by double quotes. - Aranan bir terimdeki boşluklar çift tırnaklar ile korunabilir. + Bir arama terimindeki boşluklar çift tırnaklar ile korunabilir. - + Example: Search phrase example Örnek: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - <b>foo bar</b>: aranacak olan <b>foo</b> ve <b>bar</b> + <b>foo bar</b>: aranancak olan <b>foo</b> ve <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: aranacak olan <b>foo bar</b> - + All plugins Tüm eklentiler - + Only enabled Sadece etkinleştirilmişler - + Select... Seç... - - - + + + Search Engine Arama Motoru - + Please install Python to use the Search Engine. Arama Motorunu kullanmak için lütfen Python'u yükleyin. - + Empty search pattern Boş arama örneği - + Please type a search pattern first Lütfen önce bir arama örneği girin - + Stop Durdur - + Search has finished Arama tamamlandı - + Search has failed Arama başarısız oldu - ShutdownConfirmDialog - - - Don't show again - Bir daha gösterme - + ShutdownConfirmDlg - + qBittorrent will now exit. qBittorrent'ten şimdi çıkılacak. - + E&xit Now Şimdi Çı&k - + Exit confirmation Çıkış onayı - + The computer is going to shutdown. Bilgisayar kapatılacak. - + &Shutdown Now Şimdi Ka&pat - - Shutdown confirmation - Kapatma onayı - - - + The computer is going to enter suspend mode. Bilgisayar askıya alma kipine girecek. - + &Suspend Now Şimdi &Askıya Al - + Suspend confirmation Akıya alma onayı - + The computer is going to enter hibernation mode. Bilgisayar hazırda bekletme kipine girecek. - + &Hibernate Now Şimdi &Hazırda Beklet - + Hibernate confirmation Hazırda bekletme onayı - + You can cancel the action within %1 seconds. Eylemi %1 saniye içinde iptal edebilirsiniz. + + + Shutdown confirmation + Kapatma onayı + SpeedLimitDialog - + KiB/s - KiB/s + KB/s SpeedPlotView - + Total Upload Toplam Gönderme - + Total Download Toplam İndirme - + Payload Upload Yük Gönderme - + Payload Download Yük İndirme - + Overhead Upload Ek Yük Gönderme - + Overhead Download Ek Yük İndirme - + DHT Upload DHT Gönderme - + DHT Download DHT İndirme - + Tracker Upload İzleyici Gönderme - + Tracker Download İzleyici İndirme @@ -7976,95 +7212,87 @@ SpeedWidget - + Period: Süre: - + 1 Minute 1 Dakika - + 5 Minutes 5 Dakika - + 30 Minutes 30 Dakika - + 6 Hours 6 Saat - + Select Graphs Grafikleri Seç - + Total Upload Toplam Gönderme - + Total Download Toplam İndirme - + Payload Upload Yük Gönderme - + Payload Download Yük İndirme - + Overhead Upload Ek Yük Gönderme - + Overhead Download Ek Yük İndirme - + DHT Upload DHT Gönderme - + DHT Download DHT İndirme - + Tracker Upload İzleyici Gönderme - + Tracker Download İzleyici İndirme - StacktraceDialog - - - Crash info - Arıza bilgisi - - - StatsDialog @@ -8077,48 +7305,48 @@ Kullanıcı istatistikleri - - Cache statistics - Önbellek istatistikleri + + Total peer connections: + Toplam kişi bağlantısı: - - Read cache hits: - Okuma önbelleği yoklaması: + + Global ratio: + Genel oran: - - Average time in queue: - Kuyruktaki ortalama süre: + + Alltime download: + Tüm zaman indirilen: - - Connected peers: - Bağlı kişi: + + Alltime upload: + Tüm zaman gönderilen: - - All-time share ratio: - Tüm zaman paylaşma oranı: + + Total waste (this session): + Toplam boşa giden (bu oturumda): - - All-time download: - Tüm zaman indirilen: + + Cache statistics + Önbellek istatistikleri - - Session waste: - Oturum israfı: + + Read cache hits: + Okuma önbelleği yoklaması: - - All-time upload: - Tüm zaman gönderilen: + + Average time in queue: + Kuyruktaki ortalama süre: - Total buffer size: + Total buffers size: Toplam arabellek boyutu: @@ -8147,7 +7375,12 @@ Toplam kuyruğa alınmış boyut: - + + OK + TAMAM + + + %1 ms 18 milliseconds %1 ms @@ -8156,27 +7389,32 @@ StatusBar - + Connection status: Bağlantı durumu: - + No direct connections. This may indicate network configuration problems. Doğrudan bağlantılar yok. Bu, ağ yapılandırma sorunlarını gösterebilir. - + DHT: %1 nodes DHT: %1 düğüm - - qBittorrent needs to be restarted! - qBittorrent'in yeniden başlatılması gerek! + + qBittorrent needs to be restarted + qBittorrent'in yeniden başlatılması gerek + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent henüz güncellendi ve değişikliklerin etkili olması için yeniden başlatılması gerek. @@ -8195,883 +7433,616 @@ Çevrimiçi - + Click to switch to alternative speed limits Alternatif hız sınırlarını değiştirmek için tıklayın - + Click to switch to regular speed limits Düzenli hız sınırlarını değiştirmek için tıklayın - + + Manual change of rate limits mode. The scheduler is disabled. + Oran sınırlarının elle değiştirilmesi kipi. Zamanlayıcı etkisizleştirildi. + + + Global Download Speed Limit Genel İndirme Hızı Sınırı - + Global Upload Speed Limit Genel Gönderme Hızı Sınırı - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter Tümü (0) - + Downloading (0) İndiriliyor (0) - + Seeding (0) Gönderiliyor (0) - + Completed (0) Tamamlandı (0) - + Resumed (0) Devam edildi (0) - + Paused (0) Duraklatıldı (0) - + Active (0) Etkin (0) - + Inactive (0) Etkin değil (0) - + Errored (0) Hata oldu (0) - + All (%1) Tümü (%1) - + Downloading (%1) İndiriliyor (%1) - + Seeding (%1) Gönderiliyor (%1) - + Completed (%1) Tamamlandı (%1) - + Paused (%1) Duraklatıldı (%1) - + Resumed (%1) Devam edildi (%1) - + Active (%1) Etkin (%1) - + Inactive (%1) Etkin değil (%1) - + Errored (%1) Hata oldu (%1) - TagFilterModel + TorrentContentModel - - Tags - Etiketler + + Name + Adı - - All - Tümü + + Size + Boyut - - Untagged - Etiketlenmemiş + + Progress + İlerleme - - - TagFilterWidget - - Add tag... - Etiket ekle... + + Download Priority + İndirme Önceliği - - Remove tag - Etiketi kaldır + + Remaining + Kalan + + + TorrentCreatorDlg - - Remove unused tags - Kullanılmayan etiketleri kaldır + + Select a folder to add to the torrent + Torrente eklemek için bir klasör seçin - - Resume torrents - Torrent'lere devam et + + Select a file to add to the torrent + Torrente eklemek için bir dosya seçin - - Pause torrents - Torrent'leri duraklat + + No input path set + Ayarlı girdi yolu yok - - Delete torrents - Torrent'leri sil + + Please type an input path first + Lütfen önce bir girdi yolu yazın - - New Tag - Yeni Etiket + + Select destination torrent file + Hedef torrent dosyasını seçin - - Tag: - Etiket: + + Torrent Files (*.torrent) + Torrent Dosyaları (*.torrent) - - Invalid tag name - Geçersiz etiket adı + + Torrent was created successfully: %1 + %1 is the path of the torrent + Torrent başarılı olarak oluşturuldu: %1 - - Tag name '%1' is invalid - Etiket adı '%1' geçersiz + + + + Torrent creation + Torrent oluşturma - - Tag exists - Etiket var + + Torrent creation was unsuccessful, reason: %1 + Torrent oluşturma başarısız oldu, sebep: %1 - - Tag name already exists. - Etiket adı zaten var. + + Created torrent file is invalid. It won't be added to download list. + Oluşturulan torrent dosyası geçersiz. İndirme listesine eklenmeyecektir. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Torrent Kategorisi Özellikleri + + Name + i.e: torrent name + Adı - - Name: - Adı: + + Size + i.e: torrent size + Boyut - - Save path: - Kaydetme yolu: + + Done + % Done + Tamamlanma - - Choose save path - Kaydetme yolunu seçin + + Status + Torrent status (e.g. downloading, seeding, paused) + Durum - - New Category - Yeni Kategori + + Seeds + i.e. full sources (often untranslated) + Gönderimler - - Invalid category name - Geçersiz kategori adı + + Peers + i.e. partial sources (often untranslated) + Kişiler - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - Kategori adı '\' içeremez. -Kategori adı '/' ile başlayamaz/bitemez. -Kategori adı '//' şeklinde dizi içeremez. + + Down Speed + i.e: Download speed + İnd. Hızı - - Category creation error - Kategori oluşturma hatası + + Up Speed + i.e: Upload speed + Gön. Hızı - - Category with the given name already exists. -Please choose a different name and try again. - Verilen isimde kategori zaten var. -Lütfen farklı bir isim seçin ve tekrar deneyin. + + Ratio + Share ratio + Oran - - - TorrentContentModel - - Name - Adı + + ETA + i.e: Estimated Time of Arrival / Time left + TBS - - Size - Boyut + + Category + Kategori - - Progress - İlerleme + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Eklenme - - Download Priority - İndirme Önceliği + + Completed On + Torrent was completed on 01/01/2010 08:00 + Tamamlanma - - Remaining - Kalan + + Tracker + İzleyici - - Availability - Kullanılabilirlik + + Down Limit + i.e: Download limit + İnd. Sınırı - - - TorrentCreatorDialog - - Torrent Creator - Torrent Oluşturucu + + Up Limit + i.e: Upload limit + Gön. Sınırı - - Select file/folder to share - Paylaşmak için dosya/klasör seçin + + Downloaded + Amount of data downloaded (e.g. in MB) + İndirilen - - Path: - Yol: + + Uploaded + Amount of data uploaded (e.g. in MB) + Gönderilen - - [Drag and drop area] - [Sürükle ve bırak alanı] + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Oturumda İndirilen - - - Select file - Dosya seç + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Oturumda Gönderilen - - - Select folder - Klasör seç + + Remaining + Amount of data left to download (e.g. in MB) + Kalan - - Settings - Ayarlar + + Time Active + Time (duration) the torrent is active (not paused) + Etkinlik Süresi - - Piece size: - Parça boyutu: + + Save path + Torrent save path + Kaydetme yolu - - Auto - Otomatik + + Completed + Amount of data completed (e.g. in MB) + Tamamlanan - - 16 KiB - 16 KiB + + Ratio Limit + Upload share ratio limit + Oran Sınırı - - 32 KiB - 32 KiB + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Tam Halinin Görülmesi - - 64 KiB - 64 KiB + + Last Activity + Time passed since a chunk was downloaded/uploaded + Son Etkinlik - - 128 KiB - 128 KiB + + Total Size + i.e. Size including unwanted data + Toplam Boyut + + + TrackerFiltersList - - 256 KiB - 256 KiB + + All (0) + this is for the tracker filter + Tümü (0) - - 512 KiB - 512 KiB + + Trackerless (0) + İzleyicisiz (0) - - 1 MiB - 1 MiB + + Error (0) + Hata (0) - - 2 MiB - 2 MiB + + Warning (0) + Uyarı (0) - - 4 MiB - 4 MiB + + + Trackerless (%1) + İzleyicisiz (%1) - - 8 MiB - 8 MiB + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - 16 MiB - 16 MiB + + + Error (%1) + Hata (%1) - - 32 MiB - 32 MiB + + + Warning (%1) + Uyarı (%1) - - Calculate number of pieces: - Parçaların sayısını hesapla: + + Resume torrents + Torrentlere devam et - - Private torrent (Won't distribute on DHT network) - Özel torrent (DHT ağında dağıtılmayacak) + + Pause torrents + Torrentleri duraklat - - Start seeding immediately - Gönderimi hemen başlat + + Delete torrents + Torrentleri sil - - Ignore share ratio limits for this torrent - Bu torrent için paylaşma oranı sınırlarını yoksay + + + All (%1) + this is for the tracker filter + Tümü (%1) + + + TrackerList - - Optimize alignment - Hizalamayı en iyi duruma getir + + URL + URL - - Fields - Alanlar + + Status + Durum - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - İzleyici katmanlarını / gruplarını boş bir satırla ayırabilirsiniz. + + Received + - - Web seed URLs: - Web gönderim URL'leri: + + Seeds + Gönderimler - - Tracker URLs: - İzleyici URL'leri: + + Peers + Kişiler - - Comments: - Yorumlar: + + Downloaded + İndirilen - - Source: - Kaynak: - - - - Progress: - İlerleme: - - - - Create Torrent - Torrent Oluştur - - - - - - Torrent creation failed - Torrent oluşturma başarısız oldu - - - - Reason: Path to file/folder is not readable. - Sebep: Dosya/klasör için yol okunabilir değil. - - - - Select where to save the new torrent - Yeni torrent'in kaydedileceği yeri seçin - - - - Torrent Files (*.torrent) - Torrent Dosyaları (*.torrent) - - - - Reason: %1 - Sebep: %1 - - - - Reason: Created torrent is invalid. It won't be added to download list. - Sebep: Oluşturulan torrent geçersiz. İndirme listesine eklenmeyecektir. - - - - Torrent creator - Torrent oluşturucu - - - - Torrent created: - Torrent oluşturuldu: - - - - TorrentInfo - - - File size exceeds max limit %1 - Dosya boyutu en fazla %1 sınırını aşıyor - - - - Torrent file read error: %1 - Torrent dosyası okuma hatası: %1 - - - - Torrent file read error: size mismatch - Torrent dosyası okuma hatası: boyut uyuşmuyor - - - - TorrentsController - - - Not contacted yet - Daha bağlanılamadı - - - - Updating... - Güncelleniyor... - - - - Working - Çalışıyor - - - - Not working - Çalışmıyor - - - - Error: '%1' is not a valid torrent file. - Hata: '%1' geçerli bir torrent dosyası değil. - - - - - - - Torrent queueing must be enabled - Torrent kuyruğa alma etkinleştirilmek zorundadır - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - Save path is empty - Kaydetme yolu boş - - - - Cannot make save path - Kaydetme yolunu oluşturamıyor - - - - Cannot write to directory - Dizine yazamıyor - - - - WebUI Set location: moving "%1", from "%2" to "%3" - Web Arayüzü Ayar konumu: taşınan "%1", "%2" yerinden "%3" yerine - - - - Incorrect torrent name - Yanlış torrent adı - - - - - Incorrect category name - Yanlış kategori adı - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - Tümü (0) - - - - Trackerless (0) - İzleyicisiz (0) - - - - Error (0) - Hata (0) - - - - Warning (0) - Uyarı (0) - - - - - Trackerless (%1) - İzleyicisiz (%1) - - - - - Error (%1) - Hata (%1) - - - - - Warning (%1) - Uyarı (%1) - - - - Resume torrents - Torrent'lere devam et - - - - Pause torrents - Torrent'leri duraklat - - - - Delete torrents - Torrent'leri sil - - - - - All (%1) - this is for the tracker filter - Tümü (%1) + + Message + İleti - - - TrackerListWidget - - + + Working Çalışıyor - + Disabled Etkisizleştirildi - + This torrent is private - Bu torrent özeldir + Bu torrent özel - + Updating... Güncelleniyor... - + Not working Çalışmıyor - + Not contacted yet - Daha bağlanılamadı + Henüz bağlanmadı - - - - - - - N/A - Yok + + Tracker URL: + İzleyici URL'si: - + Tracker editing İzleyici düzenleme - - Tracker URL: - İzleyici URL'si: - - - - + + Tracker editing failed İzleyici düzenleme başarısız oldu - + The tracker URL entered is invalid. Girilen izleyici URL'si geçersiz. - + The tracker URL already exists. İzleyici URL'si zaten var. - + Add a new tracker... Yeni bir izleyici ekle... - - Remove tracker - İzleyiciyi kaldır - - - + Copy tracker URL İzleyici URL'sini kopyala - + Edit selected tracker URL Seçilen izleyici URL'sini düzenle - + Force reannounce to selected trackers Seçilen izleyicilere yeniden duyurmayı zorla - + Force reannounce to all trackers Tüm izleyicilere yeniden duyurmayı zorla - - URL - URL - - - - Status - Durum - - - - Received - Alan - - - - Seeds - Gönderim - - - - Peers - Kişi - - - - Downloaded - İndiren - - - - Message - İleti - - - - Column visibility - Sütun görünürlüğü - - - - TrackerLoginDialog - - - - Tracker authentication - İzleyici kimlik doğrulaması - - - - Tracker: - İzleyici: - - - - Login - Oturum Aç - - - - Username: - Kullanıcı adı: - - - - Password: - Parola: - - - - Log in - Oturum aç + + Remove tracker + İzleyiciyi kaldır - TrackersAdditionDialog + TrackersAdditionDlg - + Trackers addition dialog - İzleyicileri ekleme ileti penceresi + İzleyicileri ekleme iletisi - + List of trackers to add (one per line): Eklemek için izleyicilerin listesi (satır başına bir tane): - - + + µTorrent compatible list URL: µTorrent uyumlu liste URL'si: - + + I/O Error + G/Ç Hatası + + + + Error while trying to open the downloaded file. + İndirilen dosyayı açmaya çalışırken bir hata oldu. + + + No change Değişiklik yok - + No additional trackers were found. Hiç ilave izleyici bulunamadı. - + Download error İndirme hatası - + The trackers list could not be downloaded, reason: %1 İzleyici listesi indirilemedi, sebep: %1 @@ -9079,686 +8050,694 @@ TransferListDelegate - + Downloading İndiriliyor - + Downloading metadata used when loading a magnet link Üstveri indiriliyor - + Allocating qBittorrent is allocating the files on disk Ayrılıyor - + Paused Duraklatıldı - + Queued i.e. torrent is queued Kuyrukta - + Seeding Torrent is complete and in upload-only mode Gönderiliyor - + Stalled Torrent is waiting for download to begin Askıda - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] İndiriliyor - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] Gönderiliyor - + Checking Torrent local data is being checked - Denetleniyor + Kontrol ediliyor - + Queued for checking i.e. torrent is queued for hash checking - Denetim için kuyruğa alındı + Kontrol için kuyruğa alındı - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - Devam etme verisi denetleniyor + Devam etme verisi kontrol ediliyor - + Completed Tamamlandı - - Moving - Torrent local data are being moved/relocated - Taşınıyor - - - + Missing Files Eksik Dosyalar - + Errored torrent status, the torrent has an error Hata oldu - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (gönderilme %2) - - - %1 ago - e.g.: 1h 20m ago - %1 önce - - - - TransferListFiltersWidget - - - Status - Durum - - - - Categories - Kategoriler - - - - Tags - Etiketler - - - - Trackers - İzleyiciler - - - - TransferListModel - - - Name - i.e: torrent name - Adı - - - - Size - i.e: torrent size - Boyut - - - - Done - % Done - Tamamlanma - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Durum - - - - Seeds - i.e. full sources (often untranslated) - Gönderim - - - - Peers - i.e. partial sources (often untranslated) - Kişi - - - - Down Speed - i.e: Download speed - İnd. Hızı - - - - Up Speed - i.e: Upload speed - Gön. Hızı - - - - Ratio - Share ratio - Oran - - - - ETA - i.e: Estimated Time of Arrival / Time left - TBS - - - - Category - Kategori - - - - Tags - Etiketler - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - Eklenme - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - Tamamlanma - - - - Tracker - İzleyici - - - - Down Limit - i.e: Download limit - İnd. Sınırı - - - - Up Limit - i.e: Upload limit - Gön. Sınırı - - - - Downloaded - Amount of data downloaded (e.g. in MB) - İndirilen - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Gönderilen - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - Oturumda İndirilen - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - Oturumda Gönderilen - - - - Remaining - Amount of data left to download (e.g. in MB) - Kalan - - - - Time Active - Time (duration) the torrent is active (not paused) - Etkinlik Süresi - - - - Save path - Torrent save path - Kaydetme yolu - - - - Completed - Amount of data completed (e.g. in MB) - Tamamlanan - - - - Ratio Limit - Upload share ratio limit - Oran Sınırı + + + %1 ago + e.g.: 1h 20m ago + %1 önce + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - Tam Halinin Görülmesi + + Status + Durum - - Last Activity - Time passed since a chunk was downloaded/uploaded - Son Etkinlik + + Categories + Kategoriler - - Total Size - i.e. Size including unwanted data - Toplam Boyut + + Trackers + İzleyiciler TransferListWidget - + Column visibility Sütun görünürlüğü - + Choose save path Kaydetme yolunu seçin - + Torrent Download Speed Limiting Torrent İndirme Hızı Sınırlama - + Torrent Upload Speed Limiting Torrent Gönderme Hızı Sınırlama - + Recheck confirmation - Yeniden denetleme onayı + Yeniden kontrol onayı - + Are you sure you want to recheck the selected torrent(s)? - Seçilen torrent'(ler)i yeniden denetlemek istediğinize emin misiniz? + Seçilen torrent(ler)i yeniden kontrol etmek istediğinize emin misiniz? - + Rename Yeniden adlandır - + New name: Yeni adı: - + Resume Resume/start the torrent Devam - + Force Resume Force Resume/start the torrent Devam Etmeye Zorla - + Pause Pause the torrent Duraklat - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Yeri ayarla: taşınan "%1", "%2" yerinden "%3" yerine - - - - Add Tags - Etiketleri Ekle - - - - Remove All Tags - Tüm Etiketleri Kaldır - - - - Remove all tags from selected torrents? - Tüm etiketler seçilen torrent'lerden kaldırılsın mı? + + New Category + Yeni Kategori - - Comma-separated tags: - Virgülle ayrılan etiketler: + + Category: + Kategori: - - Invalid tag - Geçersiz etiket + + Invalid category name + Geçersiz kategori adı - - Tag name: '%1' is invalid - Etiket adı: '%1' geçersiz + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Kategori adı '\' içeremez. +Kategori adı '/' ile başlayamaz/bitemez. +Kategori adı art arda gelen '//' içeremez. - + Delete Delete the torrent Sil - + Preview file... Dosyayı önizle... - + Limit share ratio... Paylaşma oranını sınırla... - + Limit upload rate... Gönderme oranını sınırla... - + Limit download rate... İndirme oranını sınırla... - + Open destination folder Hedef klasörü aç - + Move up i.e. move up in the queue Yukarı taşı - + Move down i.e. Move down in the queue Aşağı taşı - + Move to top i.e. Move to top of the queue En üste taşı - + Move to bottom i.e. Move to bottom of the queue En alta taşı - + Set location... - Yeri ayarla... - - - - Force reannounce - Yeniden duyurmaya zorla + Konum ayarla... - + Copy name Adı kopyala - - Copy hash - Adreslemeyi kopyala - - - + Download first and last pieces first Önce ilk ve son parçaları indir - + Automatic Torrent Management Otomatik Torrent Yönetimi - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category Otomatik kip, çeşitli torrent özelliklerine (örn. kaydetme yolu) ilişkilendirilmiş kategori tarafından karar verileceği anlamına gelir - + Category Kategori - + New... New category... Yeni... - + Reset Reset category Sıfırla - - Tags - Etiketler - - - - Add... - Add / assign multiple tags... - Ekle... - - - - Remove All - Remove all tags - Tümünü Kaldır - - - + Priority Öncelik - + Force recheck - Yeniden denetlemeye zorla + Yeniden kontrole zorla - + Copy magnet link Magnet bağlantısını kopyala - + Super seeding mode Süper gönderim kipi - + Rename... Yeniden adlandır... - + Download in sequential order Sıralı düzende indir - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting Torrent Gönderme/İndirme Oranı Sınırlama - - Use global share limit - Genel paylaşma sınırını kullan + + Use global ratio limit + Genel oran sınırını kullan - - - + + + buttonGroup Grup düğmesi - - Set no share limit - Paylaşma sınırını ayarlama + + Set no ratio limit + Oran sınırını ayarlama + + + + Set ratio limit to + Oran sınırını şuna ayarla + + + + WebApplication + + + Incorrect category name + Yanlış kategori adı + + + + WebUI + + + The Web UI is listening on port %1 + Web Arayüzü %1 nolu bağlantı noktasında dinleniyor + + + + Web UI Error - Unable to bind Web UI to port %1 + Web Arayüzü Hatası - Web Arayüzü %1 nolu bağlantı noktasına bağlanamıyor + + + about - - Set share limit to - Paylaşma sınırını şuna ayarla + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Qt toolkit ve libtorrent-rasterbar tabanlı, C++ ile programlanmış gelişmiş bir BitTorrent istemcisi. - - ratio - oran + + Copyright %1 2006-2016 The qBittorrent project + Telif hakkı %1 2006-2016 qBittorrent projesi - - minutes - dakika + + Home Page: + Ana Sayfa: - - No share limit method selected - Seçilen paylaşma sınırı yöntemi yok + + Forum: + Forum: - - Please select a limit method first - Lütfen önce bir sınır yöntemi seçin + + Bug Tracker: + Hata İzleyicisi: - Utils::ForeignApps + addPeersDialog + + + Add Peers + Kişileri Ekle + - - Python detected, version: %1 - Python algılandı, sürüm: %1 + + List of peers to add (one per line): + Eklemek için kişilerin listesi (satır başına bir tane): - - Python not detected - Python algılanmadı + + Format: IPv4:port / [IPv6]:port + Biçim: IPv4:b.noktası / [IPv6]:b.noktası - WebApplication + authentication + + + + Tracker authentication + İzleyici kimlik doğrulaması + + + + Tracker: + İzleyici: + + + + Login + Oturum aç + + + + Username: + Kullanıcı adı: + - - Unacceptable file type, only regular file is allowed. - Kabul edilemez dosya türü, sadece normal dosyaya izin verilir. + + Password: + Parola: - - Symlinks inside alternative UI folder are forbidden. - Alternatif Arayüz klasörü içinde simgesel bağlantılar yasaktır. + + Log in + Oturum aç - - Exceeded the maximum allowed file size (%1)! - En fazla izin verilen dosya boyutu (%1) aşıldı! + + Cancel + İptal + + + confirmDeletionDlg - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - Web Arayüzü: Başlangıç üstbilgisi ve Hedef başlangıcı uyuşmuyor! Kaynak IP: '%1'. Başlangıç üstbilgisi: '%2'. Hedef başlangıcı: '%3' + + Deletion confirmation - qBittorrent + Silme onayı - qBittorrent - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - Web Arayüzü: Gönderen üstbilgisi ve Hedef başlangıcı uyuşmuyor! Kaynak IP: '%1'. Gönderen üstbilgisi: '%2'. Hedef başlangıcı: '%3' + + Remember choice + Seçimi hatırla - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - Web Arayüzü: Geçersiz Anamakine üstbilgisi, bağlantı noktası uyuşmuyor. İstek kaynak IP: '%1'. Sunucu b.noktası: '%2'. Alınan Anamakine üstbilgisi: '%3' + + Also delete the files on the hard disk + Aynı zamanda sabit diskteki dosyaları sil + + + confirmShutdownDlg - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - Web Arayüzü: Geçersiz Anamakine üstbilgisi. İstek kaynak IP: '%1'. Alınan Anamakine üstbilgisi: '%2' + + Don't show again + Tekrar gösterme - WebUI + createTorrentDialog + + + Cancel + İptal + + + + Torrent Creation Tool + Torrent Oluşturma Aracı + + + + Torrent file creation + Torrent dosyası oluşturma + + + + Add file + Dosya ekle + + + + Add folder + Klasör ekle + + + + File or folder to add to the torrent: + Torrente eklemek için dosya veya klasör: + + + + Tracker URLs: + İzleyici URL'leri: + + + + Web seeds urls: + Web gönderimi URL'leri: + + + + Comment: + Yorum: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + İzleyici katmanlarını / gruplarını boş bir satırla ayırabilirsiniz. + + + + Piece size: + Parça boyutu: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KB + + + + 64 KiB + 64 KB + + + + 128 KiB + 128 KB + + + + 256 KiB + 256 KB + + + + 512 KiB + 512 KB + + + + 1 MiB + 1 MB + + + + 2 MiB + 2 MB + + + + 4 MiB + 4 MB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + Otomatik + + + + Private (won't be distributed on DHT network if enabled) + Özel (etkinleştirildiğinde DHT ağında dağıtılmayacaktır) + + + + Start seeding after creation + Oluşturmadan sonra gönderimi başlat + - - Web UI: HTTPS setup successful - Web Arayüzü: HTTPS kurulumu başarılı + + Ignore share ratio limits for this torrent + Bu torrent için paylaşma oranı sınırlarını yoksay + + + + Create and save... + Oluştur ve kaydet... + + + + Progress: + İlerleme: + + + + downloadFromURL + + + Add torrent links + Torrent bağlantılarını ekleyin + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Satır başına bir tane (HTTP bağlantıları, Magnet bağlantıları ve bilgi adreslemeleri desteklenir) - - Web UI: HTTPS setup failed, fallback to HTTP - Web Arayüzü: HTTPS kurulumu başarısız, HTTP'ye geri çekiliyor + + Download + İndir + + + + Cancel + İptal + + + + Download from urls + URL'lerden indir + + + + No URL entered + Girilmiş URL yok - - Web UI: Now listening on IP: %1, port: %2 - Web Arayüzü: Şu an IP: %1 ve %2 nolu bağlantı noktasında dinleniyor + + Please type at least one URL. + Lütfen en az bir URL yazın. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Web Arayüzü: IP: %1 ve %2 nolu bağlantı noktasına bağlanamıyor. Neden: %3 + + Crash info + Arıza bilgisi fsutils - + + + + + Downloads İndirmeler @@ -9766,100 +8745,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) - KiB + KB - + MiB mebibytes (1024 kibibytes) - MiB + MB - + GiB gibibytes (1024 mibibytes) - GiB + GB - + TiB tebibytes (1024 gibibytes) - TiB + TB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + Python algılanmadı + + + + Python version: %1 + Python sürümü: %1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes - %1sa %2dk + %1s %2d - + %1d %2h e.g: 2days 10hours - %1gn %2sa + %1g %2s - + Unknown Unknown (size) Bilinmiyor - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent bilgisayarı şimdi kapatacak çünkü tüm indirmeler tamamlandı. - + < 1m < 1 minute - < 1dk + < 1d - + %1m e.g: 10minutes - %1dk + %1d + + + + Working + Çalışıyor + + + + Updating... + Güncelleniyor... + + + + Not working + Çalışmıyor + + + + Not contacted yet + Henüz bağlanmadı preview - + Preview selection Önizleme seçimi - + The following files support previewing, please select one of them: Aşağıdaki dosyalar önizlemeyi destekler, lütfen bunlardan birini seçin: + + + Preview + Önizle + + + + Cancel + İptal + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_uk.ts qbittorrent-3.3.15/src/lang/qbittorrent_uk.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_uk.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_uk.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - Візитівка + Про qBittorrent - + About - Про + Про програму - + Author Автор - - Current maintainer - Поточний супровідник + + + Nationality: + Національність: - - Greece - Греція + + + Name: + Ім'я: - - - Nationality: - Національність: + + + E-mail: + E-mail: - - - E-mail: - Ел. пошта: + + Greece + Греція - - - Name: - Назва: + + Current maintainer + Поточний супровідник - + Original author Оригінальний автор - - France - Франція - - - + Special Thanks - Окрема подяка + Особлива подяка - + Translators Перекладачі - - License - Ліцензія - - - + Libraries Бібліотеки - + qBittorrent was built with the following libraries: - qBittorrent збудовано за допомогою наступних бібліотек: - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - Потужний клієнт BitTorrent, запрограмований на C++, на основі бібліотек Qt та libtorrent-rasterbar. - - - - Copyright %1 2006-2018 The qBittorrent project - Копірайт %1 2006-2018 The qBittorrent project - - - - Home Page: - Домашня сторінка: + qBittorrent було збудовано з наступними бібліотеками: - - Forum: - Форум: + + France + Франція - - Bug Tracker: - Трекер помилок: + + License + Ліцензія @@ -115,69 +90,79 @@ Зберегти у - + + Browse... + Відкрити... + + + + Set as default save path + Зробити стандартним шляхом збереження + + + Never show again Більше ніколи не показувати - + Torrent settings - Налаштування торенту + Налаштування торрента - + Set as default category Зробити категорією за замовчуванням - + Category: Категорія: - + Start torrent - Запустити торент + Запустити торрент - + Torrent information - Інформація про торент + Інформація про торрент - + Skip hash check - Пропустити гешеву перевірку  + Пропустити перевірку хешу - + Size: Розмір: - + Hash: - Геш: + Хеш: - + Comment: Коментар: - + Date: Дата: Torrent Management Mode: - Режим керування торентами: + Режим керування торрентами: Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - Автоматичний режим означає, що різні властивості торенту (наприклад, шлях збереження) буде визначено через його категорію + Автоматичний режим означає, що різні властивості торрента (наприклад, шлях збереження) буде визначено через його категорію @@ -190,234 +175,219 @@ Автоматичний - - Remember last used save path - Пам'ятати останній шлях збереження файлів - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - При ввімкненні торент-файл не буде видалено, незалежно від параметрів "Завантаження" у вікні "Налаштування" + При увімкненні торрент-файл не буде видалено, в незалежності від параметрів "Завантаження" у вікні "Налаштування" - + Do not delete .torrent file Не видаляти файл .torrent - - Create subfolder - Створити підтеку - - - - Download in sequential order - Завантажувати послідовно - - - - Download first and last pieces first - Завантажувати першу й останню частину напочатку - - - + Normal Нормальний - + High Високий - + Maximum Максимальний - + Do not download Не завантажувати - - - + + + I/O Error Помилка вводу/виводу - + Invalid torrent - Хибний торент - - - - Renaming - Перейменування - - - - - Rename error - Помилка перейменування + Хибний торрент - - The name is empty or contains forbidden characters, please choose a different one. - Назва порожня або містить заборонені символи, будь ласка, виберіть іншу. + + + + + Already in download list + Вже є в списку завантажень - + Not Available This comment is unavailable Недоступно - + Not Available This date is unavailable Недоступно - + Not available Недоступно - + Invalid magnet link Хибне magnet-посилання - + The torrent file '%1' does not exist. Torrent-файл '%1' не існує. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. - Не вдалося прочитати торент-файл '%1' із диска. Можливо, ви не маєте достатньо дозволів. + Не вдалося прочитати торрент-файл '%1' із диска. Можливо, у вас немає доступу. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' ' characters. They insert a newline. - Не вдалося завантажити торент: %1 + Не вдалося завантажити торрент: %1 Помилка: %2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Торрент вже є у списку завантажень. Трекери не було об'єднано, бо це приватний торрент. + + + + Torrent is already in download list. Trackers were merged. + Торрент вже є у списку завантажень. Трекери об'єднано. + + + + + Cannot add torrent + Не вдалось додати торрент + + + + Cannot add this torrent. Perhaps it is already in adding state. + Не вдалось додати цей торрент. Можливо, він уже в стані додавання. + + + This magnet link was not recognized Це magnet-посилання не було розпізнано - + + Magnet link is already in download list. Trackers were merged. + Magnet-посилання вже є в списку завантажень. Трекерт об'єднано. + + + + Cannot add this torrent. Perhaps it is already in adding. + Не вдалось додати цей торрент. Можливо, він уже додається + + + Magnet link Magnet-посилання - + Retrieving metadata... Отримуються метадані... - + Not Available This size is unavailable. Недоступно - + Free space on disk: %1 Вільне місце на диску: %1 - + + Choose save path Виберіть шлях збереження - - - - - - - Torrent is already present - Торент вже існує - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - Торент '%1' вже знаходиться у спискові завантажень. Трекери не об'єднано бо цей торент є приватним. - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - Торрент '%1' вже знаходиться у спискові завантажень. Списки трекерів об'єднано. - - - - Torrent is already queued for processing. - Торент вже у черзі на оброблення. + + Rename the file + Перейменувати файл - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - Торрент '%1' вже знаходиться у спискові завантажень. Списки трекерів об'єднано. + + New name: + Нова назва: - - Magnet link is already queued for processing. - Магнет-ланка вже у черзі на оброблення. + + + The file could not be renamed + Файл не вдалося перейменувати - - New name: - Нова назва: + + This file name contains forbidden characters, please choose a different one. + Ця назва файла містить заборонені символи. Будь ласка, виберіть іншу. - - + + This name is already in use in this folder. Please use a different name. Ця назва вже використовується в даній папці. Будь ласка, виберіть іншу. - + The folder could not be renamed Цю теку не вдалося перейменувати - + Rename... Перейменувати... - + Priority Пріоритет - + Invalid metadata Хибні метадані - + Parsing metadata... Розбираються метадані... - + Metadata retrieval complete Завершено отримання метаданих - + Download Error Помилка завантаження @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + Розмір дискового кешу + + + MiB МіБ - + Outgoing ports (Min) [0: Disabled] Вихідні порти (мінімум) [0 — вимк.] - + Outgoing ports (Max) [0: Disabled] Вихідні порти (максимум) [0 — вимк.] - + Recheck torrents on completion - Переперевіряти торенти після завантаження + Перепровіряти торренти після завантаження - + Transfer list refresh interval Інтервал оновлення списку завантажень - + ms milliseconds мс - + Setting Параметр - + Value Value set for this setting Значення - - - (disabled) - (вимкнено) - - - + (auto) (автоматично) - - min - minutes - хв - - - + All addresses Всі адреси - + qBittorrent Section Розділ про qBittorrent - - + + Open documentation Відкрити документацію - + libtorrent Section Розділ про libtorrent - - Asynchronous I/O threads - Несинхронизовані нитки вводу/виводу - - - - Disk cache - Дисковий кеш - - - + s seconds с - + Disk cache expiry interval Термін дійсності дискового кешу - + Enable OS cache Увімкнути кеш ОС - - Guided read cache - Спрямованне читання кешу - - - - Coalesce reads & writes - Загальне читання та записування - - - - Send upload piece suggestions - Надсилати підказку вивантаження частин - - - - - KiB - КіБ - - - - Send buffer watermark - Надсилати буферову емблему - - - - Send buffer low watermark - Надсилати буферову підемблему - - - - Send buffer watermark factor - Надсилати фактор буферової емблеми - - - - Prefer TCP - Надавати перевагу TCP - - - - Peer proportional (throttles TCP) - Пірова пропорційність (заповільнює TCP) - - - - Allow multiple connections from the same IP address - Дозволити більше одного з'єднання з тієї ж IP-адреси + + m + minutes + хв - + Resolve peer countries (GeoIP) Дізнаватись країну пірів (GeoIP) - + Resolve peer host names Дізнаватись адресу пірів - + Strict super seeding - Суворе супер-сидування + Строге супер-сідування - + Network Interface (requires restart) Мережевий інтерфейс (потребує перезапуску) - + Optional IP Address to bind to (requires restart) Додаткова IP-адреса для прив'язки (потребує перезапуску) - + Listen on IPv6 address (requires restart) - Очікувати з'єднання за адресою IPv6 (потребує перезапуску) + Очікувати з'єднання за адресою IPv6 (потребує перезапуску). - + Display notifications Показувати сповіщення - + Display notifications for added torrents - Показувати сповіщення для доданих торентів + Показувати сповіщення для доданих торрентів - + Download tracker's favicon - Завантажувати піктограми для трекерів - - - - Save path history length - Зберегти довжину шляху завантаження - - - - Fixed slots - Виправлені слоти - - - - Upload rate based - Стандартна швидкість вивантаження - - - - Upload slots behavior - Поведінка слотів вивантаження - - - - Round-robin - Round-robin - - - - Fastest upload - Найшвидшу вивантаження - - - - Anti-leech - Антиліч - - - - Upload choking algorithm - Частиновий алгоритм відвантаження + - + Confirm torrent recheck - Підтверджувати повторну перевірку торентів - - - - Confirm removal of all tags - Підтверджувати видалення усіх міток + Підтверджувати повторну перевірку торрентів - - Always announce to all trackers in a tier - Завжди анонсувати до трекерів усіх рівнів + Exchange trackers with other peers + Обмінюватись трекерами з іншими пірами - - Always announce to all tiers - Завжди анонсувати до всіх рівнів + + Always announce to all trackers + Отримувати пірів з усіх трекерів - + Any interface i.e. Any network interface Будь-який інтерфейс - + Save resume data interval How often the fastresume file is saved. Інтервал збереження даних відновлення - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - Алгоритм мішаного режиму %1-TCP - - - + Maximum number of half-open connections [0: Unlimited] Максимальна кількість напіввідкритих з'єднань [0 — необмежено] - + IP Address to report to trackers (requires restart) IP адреса, що повідомляється трекерам (потребує перезапуску) - + Enable embedded tracker Увімкнути вбудований трекер - + Embedded tracker port Порт вбудованого трекера - + Check for software updates Перевірити оновлення програмного забезпечення - + Use system icon theme Використовувати системну тему значків @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 запущено - + Torrent: %1, running external program, command: %2 - Торент: %1, запуск зовнішньої програми, команда: %2 - - - - Torrent name: %1 - Назва торенту: %1 - - - - Torrent size: %1 - Розмір торенту: %1 - - - - Save path: %1 - Шлях збереження: %1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Торент завантажено за %1. - - - - Thank you for using qBittorrent. - Дякуємо за використання qBittorrent. + Торрент: %1, запуск зовнішньої програми, команда: %2 - - [qBittorrent] '%1' has finished downloading - [qBittorrent] Завантаження '%1' завершене + + Torrent: %1, run external program command too long (length > %2), execution failed. + Торрент: %1, занадто довга команда запуску зовнішньої програми (довжина > %2), помилка запуску. - + Torrent: %1, sending mail notification - Торент: %1, надсилання сповіщення на пошту + Торрент: %1, надсилання сповіщення на пошту - + Information Інформація - - To control qBittorrent, access the Web UI at %1 - Для керування qBittorrent'ом, почніть працювати з веб-інтерфейсом на %1 + + To control qBittorrent, access the Web UI at http://localhost:%1 + Щоб керувати програмою qBittorrent, скористайтесь Веб-інтерфейсом: http://localhost:%1 - + The Web UI administrator user name is: %1 Ім'я користувача-адміністратора в Веб-інтерфейсі: %1 - + The Web UI administrator password is still the default one: %1 Пароль адміністратора в Веб-інтерфейсі все ще стандартний: %1 - + This is a security risk, please consider changing your password from program preferences. Це ризик безпеки, будь ласка, змініть пароль в налаштуваннях програми. - + Saving torrent progress... - Зберігається прогрес торенту... - - - - Portable mode and explicit profile directory options are mutually exclusive - Портативний режим та явний каталог профілю є взаємовиключними - - - - Portable mode implies relative fastresume - Портативний режим передбачає відносно швидке відновлення - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - Невдача логіну WebAPI. Причина: IP забанено, IP: %1, користувач: %2 - - - - Your IP address has been banned after too many failed authentication attempts. - Ваша IP забанена через забагато невдалих спроб автентифікування. - - - - WebAPI login success. IP: %1 - WebAPI логування успішне. IP: %1 - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - Невдача логіну WebAPI. Причина: хибне перепосилання, кількість спроб: %1, IP: %2, користувач: %3 + Зберігається прогрес торрента... AutomatedRssDownloader - + Save to: Зберегти у: @@ -861,837 +658,696 @@ Завантажувач RSS - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - Автоматичний завантажувач RSS торентів зараз вимкнено! Ви можете увімкнути його у налаштуваннях програми. + + Enable Automated RSS Downloader + Увімкнути автоматичний завантажувач RSS - + Download Rules Правила завантаження - + Rule Definition Визначення правила - + Use Regular Expressions Використовувати регулярні вирази - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - Смартільтр перевіре кількість епізодів для запобігання завантаження дублікатів. -Підтримуються формати назв: S01E01, 1x1, 2017.01.01 та 01.01.2017 (Формати дат теж підтримуються - як розділяч) - - - - Use Smart Episode Filter - Використовувати розумний фільтр епізодів - - - + Must Contain: Повинно містити: - + Must Not Contain: Не може містити: - + Episode Filter: Фільтр серій: - + Assign Category: Призначити категорію: - + Save to a Different Directory - Зберегти в інший каталог + Зберегти в іншу теку - + Ignore Subsequent Matches for (0 to Disable) ... X days Ігнорувати подальші збіги протягом (0 щоб вимкнути) - + Disabled - Вимкнено + Вимкнений - + days - днів + днів - + Add Paused: Додати зупиненим: - + Use global settings Використовувати глобальні налаштування - + Always Завжди - + Never Ніколи - + Apply Rule to Feeds: Застосувати правило до подач: - + Matching RSS Articles Відповідні RSS-статті - + &Import... &Імпорт... - + &Export... &Експорт... - + Matches articles based on episode filter. - Знаходить статті на основі фільтра серій + Знаходить статті на основі фільтру серій - + Example: - Приклад: + Приклад: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match - знайде 2, 5, 8-15, 30 і подальші серії першого сезону + знайде 2, 5, 8-15, 30 і подальші серії першого сезону - + Episode filter rules: - Правила фільтра серій: + Правила фільтра серій: - + Season number is a mandatory non-zero value Номер сезону — обов'язкове ненульове значення - + Episode number is a mandatory non-zero value + Номер серії — обов'язкове ненульове значення + + + Filter must end with semicolon Фільтр повинен закінчуватись крапкою з комою - + Three range types for episodes are supported: - Підтримуються три типи діапазонів для серій: + Підтримуються три типи діапазонів для серій - + Single number: <b>1x25;</b> matches episode 25 of season one Одне число: <b>1x25;</b> відповідає 25ій серії першого сезону - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Звичайний діапазон: <b>1x25-40;</b> відповідає серіям 25-40 першого сезону - - Episode number is a mandatory positive value - Номер серії — обов’язкове додатне значення - - - - Rules - Правила + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Нескінченний діапазон: <b>1x25-;</b> відповідає всім серіям, починаючи з 25-ї, першого сезону - - Rules (legacy) - Правила (застарілі) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - Нескінченний діапазон: <b>1x25-;</b> відповідає всім серіям, починаючи з 25-ї, першого сезону, і всім серіям наступних сезонів + - + Last Match: %1 days ago Останній збіг: %1 днів тому - + Last Match: Unknown Останній збіг: невідомо - + New rule name Нова назва правила - + Please type the name of the new download rule. Будь ласка, введіть назву нового правила завантаження. - - + + Rule name conflict Конфлікт назв правил - - + + A rule with this name already exists, please choose another name. Правило з цією назвою вже існує, будь ласка, оберіть іншу назву. - + Are you sure you want to remove the download rule named '%1'? Ви впевнені, що хочете видалити правило завантаження під назвою '%1'? - + Are you sure you want to remove the selected download rules? Ви дійсно хочете видалити вибрані правила завантаження? - + Rule deletion confirmation Підтвердження видалення правила - + Destination directory - Каталог призначення + Тека призначення - + Invalid action - Хибна дія + Неправильна дія - + The list is empty, there is nothing to export. - Список порожній, нічого експортувати + Список порожній, нічого експортувати. - - Export RSS rules - Експортувати правила RSS + + Where would you like to save the list? + Де би ви хотіли зберегти список? - - + + Rules list (*.rssrules) + Список правил (*.rssrules) + + + I/O Error Помилка вводу/виводу - - Failed to create the destination file. Reason: %1 - Не вдалося створити файл призначення. Причина: %1 + + Failed to create the destination file + Не вдалося створити теку призначення - - Import RSS rules - Імпортувати правила RSS + + Please point to the RSS download rules file + Будь ласка, вкажіть файл правил завантаження RSS - - Failed to open the file. Reason: %1 - Не вдалося відкрити файл. Причина: %1 + + Rules list + Список правил - + Import Error Помилка імпорту - - Failed to import the selected rules file. Reason: %1 - Не вдалось імпортувати вибраний файл правил. Причина: %1 + + Failed to import the selected rules file + Не вдалось імпортувати вибраний файл правил - + Add new rule... Додати нове правило... - + Delete rule Видалити правило - + Rename rule... Перейменувати правило... - + Delete selected rules Видалити позначені правила - - Clear downloaded episodes... - Очистити завантажені епізоди... - - - + Rule renaming Перейменування правила - + Please type the new rule name Будь ласка, введіть нову назву правила - - Clear downloaded episodes - Очистити завантажені епізоди - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - Чи ви певні що хочете очистити список завантажених епізодів для вибраного правила? - - - - Regex mode: use Perl-compatible regular expressions - Regex режим: використовуйте Perl-сумісні регулярні вирази - - - - - Position %1: %2 - Позиція %1: %2 + + Regex mode: use Perl-like regular expressions + Режим регулярних виразів: Perl-подібні - + Wildcard mode: you can use - Режим шаблонів: можна використовувати + - + ? to match any single character - ? для позначення будь-якого одного символа + - + * to match zero or more of any characters - * для позначення 0 або більше будь-яких символів + - + Whitespaces count as AND operators (all words, any order) - Пробіли вважаються операторами AND (всі слова, у будь-якому порядку) + - + | is used as OR operator - | використовується як оператор OR + - + If word order is important use * instead of whitespace. - Якщо порядок слів важливий, то використовуйте * замість пробілів. + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - Вираз з порожнім пунктом %1 (наприклад: %2) + - + will match all articles. - відповідатиме всім статтям. + - + will exclude all articles. - виключить всі статті. - - - - BanListOptionsDialog - - - List of banned IP addresses - Список заблокованих IP-адрес - - - - Ban IP - Заблокувати IP-адресу - - - - Delete - Вилучити - - - - - Warning - Попередити + - - The entered IP address is invalid. - Введена IP-адреса є помилковою. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Режим шаблонів: можна використовувати<ul><li>? для позначення будь-якого символа</li><li>* для позначення 0 або більше символів</li><li>Пробіли вважаються операторами AND (та)</li></ul> - - The entered IP is already banned. - Введена IP-адреса вже забанена. + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Режим шаблонів: можна використовувати<ul><li>? для позначення будь-якого символа</li><li>* для позначення 0 або більше символів</li><li>| використовується як оператор OR (або)</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support Щоб перемкнути підтримку PeX, потрібно перезавантажити програму - - Could not get GUID of configured network interface. Binding to IP %1 - Не можливо отримати GUID з налаштованого мережевого інтерфейсу. Йде прив'язування до IP %1 - - - + Embedded Tracker [ON] Вбудований трекер [Увімк.] - + Failed to start the embedded tracker! Не вдалося запустити вбудований трекер! - + Embedded Tracker [OFF] Вбудований трекер [Вимк.] - + + '%1' reached the maximum ratio you set. Removing... + '%1' досяг максимального коефіцієнта, налаштованого вами. Видаляється... + + + + '%1' reached the maximum ratio you set. Pausing... + '%1' досяг максимального коефіцієнта, налаштованого вами. Призупиняється... + + + System network status changed to %1 e.g: System network status changed to ONLINE Мережевий статус системи змінено на %1 - + ONLINE ОНЛАЙН - + OFFLINE ОФЛАЙН - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding Мережева конфігурація %1 змінилась, оновлення прив'язки сеансу - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. Налаштований мережевий інтерфейс %1 некоректний. - - + Encryption support [%1] - Підтримка шифрування [%1] + - - + FORCED - ПРИМУСОВО - - - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 некоректна IP-адреса, тому була відхилена при застосуванні списку заблокованих адрес. + - - + Anonymous mode [%1] - Анонімний режим [%1] + - + Unable to decode '%1' torrent file. - Не вдалось розкодувати торент-файл '%1'. + Не вдалось розкодувати торрент-файл '%1'. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' - Рекурсивне завантаження файла '%1', вбудованого у торент '%2' + Рекурсивне завантаження файла '%1', вбудованого в торрент '%2' - + Queue positions were corrected in %1 resume files - Позиції в черзі було виправлено в %1 відновлених файлах + - + Couldn't save '%1.torrent' Не вдалося зберегти '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' усунено зі списку завантажень. - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' усунено зі списку завантажень та твердого диску. - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '%1' усунено зі списку завантажень, але файли не вдається видалити. Хиба: %2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. бо %1 вимкнено. - + because %1 is disabled. this peer was blocked because TCP is disabled. бо %1 вимкнено. - + URL seed lookup failed for URL: '%1', message: %2 Пошук URL роздачі невдалий для URL: '%1', повідомлення: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent не зміг приєднатись до інтерфейсу %1 порт: %2/%3. Причина: %4. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' видалено зі списку завантажень та жорсткого диску. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' видалено зі списку завантажень. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Завантажується '%1', зачекайте... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent пробує приєднатись до будь-якого інтерфейсу, порт: %1 - + The network interface defined is invalid: %1 Зазначений мережевий інтерфейс неправильний: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent пробує приєднатись до інтерфейсу %1, порт: %2 - - Peer ID: - Піровий ID: - - - - HTTP User-Agent is '%1' - Назва програми (HTTP) - '%1' - - - - + DHT support [%1] - Підтримка DHT [%1] + - - - - - - - - - + + + + ON - Увімк. + - - - - - - - - - + + + + OFF - Вимк. + - - + Local Peer Discovery support [%1] - Пошук локальних пірів [%1] - - - - PeX support [%1] - Підтримка PeX [%1] - - - - '%1' reached the maximum ratio you set. Removed. - '%1' досяг максимального коефіцієнта, налаштованого вами. Видалено. - - - - '%1' reached the maximum ratio you set. Paused. - '%1' досяг максимального коефіцієнта, налаштованого вами. Призупинено. - - - - '%1' reached the maximum seeding time you set. Removed. - '%1' досяг максимального часу роздавання, налаштованого вами. Видалено. - - - - '%1' reached the maximum seeding time you set. Paused. - '%1' досяг максимального часу роздавання, налаштованого вами. Призупинено. + - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent не знайшов локальну адресу %1 для очікування вхідних з'єднань - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent не зміг відкрити порт %1 на жодному доступному мережевому інтерфейсі. Причина: %2. - + Tracker '%1' was added to torrent '%2' - Трекер '%1' додано до торенту '%2' + Трекет '%1' додано до торрента '%2' - + Tracker '%1' was deleted from torrent '%2' - Трекер '%1' вилучено з торенту '%2' + Трекер '%1' вилучено з торрента '%2' - + URL seed '%1' was added to torrent '%2' - URL-роздачу '%1' додано до торенту '%2' + URL-роздачу '%1' додано до торрента '%2' - + URL seed '%1' was removed from torrent '%2' - URL-роздачу '%1' вилучено з торенту '%2' + URL-роздачу '%1' вилучено з торрента '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. - Не вдалося відновити торент '%1'. + Не вдалося відновити торрент '%1'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Успішно оброблено наданий фільтр IP: застосовано %1 правил. - + Error: Failed to parse the provided IP filter. Помилка: Не вдалося розібрати даний фільтр IP. - - '%1' restored. - 'torrent name' restored. - '%1' поновлено. + + Couldn't add torrent. Reason: %1 + Не вдалося додати торрент. Причина: %1 - - Couldn't add torrent. Reason: %1 - Не вдалося додати торент. Причина: %1 + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' продовжено. (швидке відновлення) - + '%1' added to download list. 'torrent name' was added to download list. '%1' додано до списку завантажень. - + An I/O error occurred, '%1' paused. %2 Виникла помилка вводу/виводу, '%1' призупинено. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Не вдалось приєднати порт, повідомлення: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Успішне приєднання порта, повідомлення: %1 - + due to IP filter. this peer was blocked due to ip filter. через фільтр IP. - + due to port filter. this peer was blocked due to port filter. через фільтр портів. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. через обмеження змішаного режиму i2p. - + because it has a low port. this peer was blocked because it has a low port. через низький номер порта. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 - qBittorrent успішно з'єднано на інтерфейсі %1 порту: %2/%3 + qBittorrent очікує з'єднань на інтерфейсі %1 порт: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 Зовнішня IP: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - не вдалося створити новий торент-файл - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - Завантажувати першу й останню частину напочатку: %1, торент: '%2' - - - - On - Увімк. - - - - Off - Вимк. - - - - Successfully moved torrent: %1. New path: %2 - Успішно пересуното торент: %1. Новий шлях: %2 - - - + Could not move torrent: '%1'. Reason: %2 - Неможливо пересунення торенту: '%1'. Причина: %2 + Не вдалося перемістити торрент: '%1'. Причина: %2 - + File sizes mismatch for torrent '%1', pausing it. - Розміри файлів торенту '%1', не збігаються, він призупиняється. + Розміри файлів не збігаються для торрента %1, буде зупинено. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - + Дані швидкого відновлення були відкинуті для торрента '%1'. Причина: %2. Повторна перевірка... CategoryFilterModel - + Categories - Категорії + Категорії - + All - Всі + Всі - + Uncategorized - Без категорії + @@ -1699,42 +1355,147 @@ Add category... - Додати категорію... + Додати категорію... Add subcategory... - Додати підкатегорію... + - Edit category... - Змінити категорію... + Remove category + Вилучити категорію + + + + Remove unused categories + Вилучити невикористовувані категорії + + + + Resume torrents + Продовжити торренти + + + + Pause torrents + Призупинити торренти + + + + Delete torrents + Видалити торренти + + + + New Category + Нова категорія + + + + Category: + Категорія: + + + + Invalid category name + Некоректна назва категорії + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Назва категорії не повинна містити '\'. +Назва категорії не повинна починатись/закінчуватись на '/'. +Назва категорії не повинна містити послідовність '//'. + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + Всі (0) + + + Uncategorized (0) + Без категорії (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + Без категорії (%1) + + + Add category... + Додати категорію... - Remove category - Вилучити категорію + Вилучити категорію - Remove unused categories - Вилучити невикористовувані категорії + Вилучити невикористовувані категорії - Resume torrents - Продовжити торенти + Продовжити торренти - Pause torrents - Призупинити торенти + Призупинити торренти - Delete torrents - Видалити торенти + Видалити торренти + + + New Category + Нова категорія + + + Category: + Категорія: + + + Invalid category name + Некоректна назва категорії + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Назва категорії не повинна містити '\'. +Назва категорії не повинна починатись/закінчуватись на '/'. +Назва категорії не повинна містити послідовність '//'. + + + All (%1) + this is for the category filter + Всі (%1) @@ -1774,617 +1535,574 @@ - DeletionConfirmationDialog - - - Deletion confirmation - Підтвердження видалення - - - - Remember choice - Запам'ятати вибір - - - - Also delete the files on the hard disk - Також видалити файли на твердому дискові - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Ви впевнені, що хочете вилучити '%1' зі списку завантажень? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - - - - - DownloadFromURLDialog - - - Download from URLs - Завантажити з адрес - - - - Add torrent links - Додати торентові ланки - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - Одна ланка на рядок (підтримку мають HTTP- і magnet-ланки та інформаційні геші) - - - - Download - Завантажити - - - - No URL entered - Не введено URL - - - - Please type at least one URL. - Будь ласка, введіть хоча б один URL. + Ви впевнені, що хочете видалити ці %1 торренти зі списку завантажень? DownloadedPiecesBar - + White: Missing pieces Білий: відсутні частини - + Green: Partial pieces Зелений: часткові частини - + Blue: Completed pieces Синій: завершені частини - ExecutionLogWidget + ExecutionLog - + General Загальні - + Blocked IPs - Заблоковані IP-адреси + Заблоковані IP - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - <font color='red'>%1</font> заблокована %2 + <font color='red'>%1</font> заблоковано %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned - <font color='red'>%1</font> забанена + <font color='red'>%1</font> забанено FeedListWidget - + RSS feeds RSS-подачі - - - Unread (%1) - Непрочитані (%1) + + Unread + Непрочитані FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. + + An error occured while trying to open the log file. Logging to file is disabled. Виникла помилка при спробі відкрити файл журналу. Журналювання вимкнено. - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - &Огляд... - - - - Choose a file - Caption for file open/save dialog - Оберіть файл - - - - Choose a folder - Caption for directory open dialog - Оберіть теку - - - - Any file - Будь-який файл - - - FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - Помилка вводу/виводу: Не вдалось відкрити для читання файл IP-фільтру. - - - - - - IP filter line %1 is malformed. - Рядок IP-фільтра %1 є некоректним. - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - Рядок IP-фільтра %1 є неприпустимим. Початок IP діапазону не є коректним. - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - Рядок IP-фільтра %1 є неприпустимим. Кінець IP діапазону не є коректним. - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - Рядок IP-фільтра %1 є неприпустимим. Один IP належить до IPv4, а інший до IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - IP-фільтр згенерував виняткову ситуацію для рядка %1. Помилка: %2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - + + + + I/O Error: Could not open ip filter file in read mode. + Помилка вводу/виводу: Не вдалось відкрити для читання файл IP-фільтра. - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. - Помилка розбору: Файл фільтра не є коректним файлом PeerGuardian P2B. + Помилка розбору: Файл фільтру не є коректним файлом PeerGuardian P2B. GeoIPDatabase - - + + Unsupported database file size. Непідтримуваний розмір файла бази даних - + Metadata error: '%1' entry not found. Помилка метаданих: запис '%1' не знайдено. - + Metadata error: '%1' entry has invalid type. Помилка метаданих: запис '%1' має некоректний тип. - + Unsupported database version: %1.%2 Непідтримувана версія бази даних: %1.%2 - + Unsupported IP version: %1 Непідтримувана версія IP: %1 - + Unsupported record size: %1 Непідтримуваний розмір запису: %1 - + Invalid database type: %1 Некоректний тип бази даних: %1 - + Database corrupted: no data section found. Пошкоджена база даних: не знайдено розділ даних. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - + + File + Файл - - Bad Http request, closing socket. IP: %s - + + Edit + Редагувати - - - HttpServer - + + Help + Допомога + + + Exit qBittorrent Вийти з qBittorrent - + Only one link per line Одне посилання на рядок - + + Download + Завантажити + + + Global upload rate limit must be greater than 0 or disabled. Глобальний ліміт швидкості вивантаження повинен бути більшим 0 або відсутнім. - + Global download rate limit must be greater than 0 or disabled. Глобальний ліміт швидкості завантаження повинен бути більшим 0 або відсутнім. - + Alternative upload rate limit must be greater than 0 or disabled. Альтернативний ліміт швидкості вивантаження повинен бути більшим 0 або відсутнім. - + Alternative download rate limit must be greater than 0 or disabled. Альтернативний ліміт швидкості завантаження повинен бути більшим 0 або відсутнім. - + Maximum active downloads must be greater than -1. Максимальна кількість активних завантажень повинна бути більша за -1. - + Maximum active uploads must be greater than -1. Максимальна кількість активних вивантажень повинна бути більша за -1. - + Maximum active torrents must be greater than -1. - Максимальна кількість активних торентів повинна бути більша за -1. + Максимальна кількість активних торрентів повинна бути більша за -1. - + Maximum number of connections limit must be greater than 0 or disabled. Максимальна кількість з'єднань повинна бути більша 0 або відсутня. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. - Максимальна кількість з'єднань на торент повинна бути більша 0 або відсутня. + Максимальна кількість з'єднань на торрент повинна бути більша 0 або відсутня. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. - Максимальна кількість з'єднань для вивантаження на торент повинна бути більша 0 або відсутня. + Максимальна кількість з'єднань для вивантаження на торрент повинна бути більша 0 або відсутня. - + Unable to save program preferences, qBittorrent is probably unreachable. Не вдалося зберегти налаштування програми, можливо qBittorrent недоступний. - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent на Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - Некоректна назва категорії: -Будь ласка, не використовуйте спеціальні символи у назві категорії. - - - - Unknown - Невідомо - - - - Hard Disk - Твердий диск - - - - Share ratio limit must be between 0 and 9998. - Коефіцієнт роздачі має бути у діапазоні від 0 до 9998. - - - - Seeding time limit must be between 0 and 525600 minutes. - Обмеження часу роздачі має бути у діапазоні від 0 до 525600 хвилин. + + Language + Мова - + The port used for incoming connections must be between 1 and 65535. Порт, який використовується для вхідних підключень, повинен бути між 1 і 65535. - + The port used for the Web UI must be between 1 and 65535. Порт, який використовується для Веб-інтерфейсу повинен бути між 1 і 65535. - + Unable to log in, qBittorrent is probably unreachable. Не вдалось залогуватись, qBittorrent напевне недосяжний - + Invalid Username or Password. Неправильний логін або пароль. - - Username - Ім'я користувача + + Password + Пароль - - Password - Пароль - - - + Login Логін - + + Upload Failed! + Не вдалось вивантажити! + + + Original authors Оригінальні автори - + + Upload limit: + Обмеження вивантаження: + + + + Download limit: + Обмеження завантаження: + + + Apply Застосувати - + Add Додати - + + Category: + Категорія: + + + Upload Torrents Upload torrent files to qBittorent using WebUI - Вивантажити торенти + Вивантажити торренти - + + All + Всі + + + + Downloading + Завантажуються + + + + Seeding + Роздаються + + + + Completed + Завершені + + + + Resumed + Відновлені + + + + Paused + Призупинені + + + + Active + Активні + + + + Inactive + Неактивні + + + Save files to location: Зберігати файли до: - + Cookie: Кукі: - + Type folder here - Введіть тут назву теки + Введіть тут папку - + + Run an external program on torrent completion + Запустити зовнішню програму при завершенні торрента + + + + Enable bandwidth management (uTP) + Увімкнути керування пропускною здатністю (uTP) + + + + Apply rate limit to uTP connections + Включати в обмеження з'єднання uTP + + + + Alternative Global Rate Limits + Альтернативні глобальні обмеження швидкості + + + More information Детальніше - + Information about certificates Інформація про сертифікати - + Save Files to Зберігати файли у - - Set location - Задати розташування - - - - Limit upload rate - Обмеження швидкості відвантаження + + Watch Folder + Стежити за текою - - Limit download rate - Обмеження швидкості завантаження + + Default Folder + Тека за замовчуванням - - Rename torrent - Змінити назву торенту + + from + from time1 to time2 + з - - Unable to create category - + + to + from time1 to time2 + до - + Other... Save Files to: Watch Folder / Default Folder / Other... Інша... - + + Every day + Schedule the use of alternative rate limits on ... + Щодня + + + + Week days + Schedule the use of alternative rate limits on ... + Робочі дні + + + + Week ends + Schedule the use of alternative rate limits on ... + Вихідні + + + Monday Schedule the use of alternative rate limits on ... Понеділок - + Tuesday Schedule the use of alternative rate limits on ... Вівторок - + Wednesday Schedule the use of alternative rate limits on ... Середа - + Thursday Schedule the use of alternative rate limits on ... Четвер - + Friday Schedule the use of alternative rate limits on ... П'ятниця - + Saturday Schedule the use of alternative rate limits on ... Субота - + Sunday Schedule the use of alternative rate limits on ... Неділя - + + Downloaded + Is the file downloaded or not? + Завантажено + + + Logout Вийти - + + Download from URLs + Завантажити з адрес + + + Download Torrents from their URLs or Magnet links - Завантажити торенти з їхніх URL або magnet-посилань + Завантажити торренти з їх URL або magnet-посилань - + Upload local torrent - Вивантажити локальний торент + Вивантажити локальний торрент - + Are you sure you want to delete the selected torrents from the transfer list? - Ви впевнені, що хочете видалити вибрані торенти зі списку завантажень? + Ви впевнені, що хочете видалити вибрані торренти зі списку завантажень? - + Save Зберегти - + qBittorrent client is not reachable Клієнт qBittorrent недосяжний - - qBittorrent has been shutdown. - qBittorrent вимкнено. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - Список дозволених підмереж IP + + HTTP Server + Сервер HTTP - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - Приклад: 172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + Підтримуються наступні параметри: - - Add subnet - Додати підмережу + + Torrent path + Шлях до торрента - - Delete - Вилучити + + Torrent name + Назва торрента - - Error - Помилка + + qBittorrent has been shutdown. + qBittorrent вимкнено. + + + LineEdit - - The entered subnet is invalid. - Уведено некоректну підмережу. + + Clear the text + Очистити текст LogListWidget - + Copy Копіювати - + Clear Очистити @@ -2417,710 +2135,648 @@ Після &завершення завантажень - + &View &Показати - + &Options... &Налаштування... - + &Resume &Продовжити - + Torrent &Creator - С&творення торенту + С&творення торрента - + Set Upload Limit... Встановити обмеження вивантаження... - + Set Download Limit... Встановити обмеження завантаження... - + Set Global Download Limit... Встановити глобальний ліміт завантаження... - + Set Global Upload Limit... Встановити глобальний ліміт вивантаження... - + Minimum Priority Найнижчий пріоритет - + Top Priority Найвищий пріоритет - + Decrease Priority Зменшити пріоритет - + Increase Priority Збільшити пріоритет - - + + Alternative Speed Limits Альтернативні обмеження швидкості - + &Top Toolbar &Верхню панель - + Display Top Toolbar Показувати верхню панель - - Status &Bar - Рядок &стану - - - + S&peed in Title Bar &Швидкість у заголовку - + Show Transfer Speed in Title Bar Показувати швидкість завантаження і вивантаження у заголовку - + &RSS Reader &Читач RSS - + Search &Engine &Пошуковик - + L&ock qBittorrent За&блокувати qBittorrent - + Do&nate! По&жертвувати гроші - - Close Window - Закрити вікно - - - + R&esume All П&родовжити всі - + Manage Cookies... Керування Cookies... - + Manage stored network cookies Керування збереженими мережевими Cookies - + Normal Messages Звичайні повідомлення - + Information Messages Інформаційні повідомлення - + Warning Messages Попередження - + Critical Messages Критичні повідомлення - + &Log &Журнал - + &Exit qBittorrent В&ийти з qBittorrent - + &Suspend System При&зупинити систему - + &Hibernate System При&спати систему - + S&hutdown System &Вимкнути систему - + &Disabled &Вимкнено - + &Statistics &Статистика - + Check for Updates Перевірити оновлення - + Check for Program Updates Перевірити оновлення програми - + &About &Про програму - + &Pause При&зупинити - + &Delete &Видалити - + P&ause All З&упинити всі - + &Add Torrent File... &Додати torrent-файл... - + Open Відкрити - + E&xit &Вийти - + Open URL Відкрити URL - + &Documentation &Документація - + Lock Замкнути - - - + + + Show Показати - + Check for program updates Перевірити, чи є свіжіші версії програми - + Add Torrent &Link... - Додати &посилання на торент + Додати &посилання на торрент - + If you like qBittorrent, please donate! Якщо вам подобається qBittorrent, будь ласка, пожертвуйте кошти! - - + Execution Log Журнал виконання - + Clear the password Забрати пароль - + Filter torrent list... - Фільтрувати список торентів... + Фільтрувати список торрентів... - + &Set Password &Встановити пароль - - Preferences - Налаштування - - - + &Clear Password &Забрати пароль - + Transfers Завантаження - - - qBittorrent is minimized to tray - Значок qBittorrent'у покладено до таці - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Асоціації torrent-файлів - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? - qBittorrent не є стандартною програмою для відкривання торентів. + qBittorrent не є програмою за замовчуванням для відкривання торрентів. Встановити qBittorrent як програму для відкривання torrent-файлів та magnet-посилань? - + Icons Only Лише значки - + Text Only Лише текст - + Text Alongside Icons Текст біля значків - + Text Under Icons Текст під значками - + Follow System Style Наслідувати стиль системи - - - + + + UI lock password Пароль блокування інтерфейсу - - - + + + Please type the UI lock password: Будь ласка, введіть пароль блокування інтерфейсу: - + The password should contain at least 3 characters Пароль повинен містити щонайменше 3 символи - + Password update Оновити пароль - + The UI lock password has been successfully updated Пароль блокування інтерфейсу успішно оновлено - + Are you sure you want to clear the password? Ви впевнені, що хочете забрати пароль? - - Use regular expressions - Використовувати звичайні вирази - - - + Search Пошук - + Transfers (%1) Завантаження (%1) - + Error Помилка - + Failed to add torrent: %1 - Не вдалося додати торент: %1 + Не вдалося додати торрент: %1 - + Torrent added - Торент додано + Торрент додано - + '%1' was added. e.g: xxx.avi was added. '%1' додано. - + Download completion Завантажено - + I/O Error i.e: Input/Output Error Помилка вводу/виводу - + Recursive download confirmation Підтвердження рекурсивного завантаження - + Yes Так - + No Ні - + Never Ніколи - + Global Upload Speed Limit Глобальний ліміт вивантаження - + Global Download Speed Limit Глобальний ліміт завантаження - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent щойно оновлено і потребує перезапуску, аби застосувати зміни. - - - - qBittorrent is closed to tray - qBittorrent прибрано на тацю - - - - Some files are currently transferring. - Деякі файли наразі передаються. - - - - Are you sure you want to quit qBittorrent? - Ви впевнені, що хочете вийти з qBittorrent? - - - + &No &Ні - + &Yes &Так - + &Always Yes &Завжди так - - %1/s - s is a shorthand for seconds - %1/с - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter Старий інтерпретатор Python - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. Ваша версія Python (%1) застаріла. Будь ласка, встановіть найновішу версію, щоб запрацював пошук. Мінімальна вимога: 2.7.9 / 3.3.0. - + qBittorrent Update Available Доступне оновлення qBittorrent - + + A new version is available. +Do you want to download %1? + Доступна нова версія. +Бажаєте завантажити %1? + + + Already Using the Latest qBittorrent Version Вже використовується найновіша версія qBittorrent - + Undetermined Python version Невизначена версія Python - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. Завантаження '%1' завершено. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. Reason: disk is full. - Виникла помилка вводу/виводу для торенту '%1'. + Виникла помилка вводу/виводу для торрента '%1'. Причина: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? - Торент '%1' містить інші торенти. Завантажити і їх? + Торрент '%1' містить інші торренти. Завантажувати і їх? - + Couldn't download file at URL '%1', reason: %2. Не вдалося завантажити файл з URL: '%1', причина: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - Python знайдено в %1: %2 + - - + + Couldn't determine your Python version (%1). Search engine disabled. + Не вдалось визначити версію Python (%1). Пошук вимкнено. + + + + Missing Python Interpreter Не вистачає інтерпретатора Python - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Для використання Пошуковика потрібен Python, але, здається, він не встановлений. Встановити його зараз? - + Python is required to use the search engine but it does not seem to be installed. Для використання Пошуковика потрібен Python, але, здається, він не встановлений. - - A new version is available. - Доступна нова версія. - - - - Do you want to download %1? - Чи ви хочете завантажити %1? - - - - Open changelog... - Відкрити список змін... - - - + No updates available. You are already using the latest version. Немає доступних оновлень. Ви вже користуєтеся найновішою версією. - + &Check for Updates &Перевірити оновлення - + Checking for Updates... Перевірка оновлень... - + Already checking for program updates in the background Вже відбувається фонова перевірка оновлень - + Python found in '%1' Python знайдено в '%1' - + Download error Помилка завантаження - + Python setup could not be downloaded, reason: %1. Please install it manually. Не вдалося завантажити програму інсталяції Python. Причина: %1. Будь ласка, встановіть Python самостійно. - - + + Invalid password Неправильний пароль - - - + + RSS (%1) RSS (%1) - + URL download error Помилка завантаження URL - + The password is invalid Цей пароль неправильний - - + + DL speed: %1 e.g: Download speed: 10 KiB/s Шв. завант.: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Шв. вивант.: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [З: %1, В: %2] qBittorrent %3 - + Hide Сховати - + Exiting qBittorrent Вихід із qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Ще відбуваються передачі файлів. +Ви впевнені, що хочете вийти з qBittorrent? + + + Open Torrent Files Відкрити torrent-файли - + Torrent Files - Торент-файли + Torrent-файли - + Options were saved successfully. Налаштування успішно збережені. @@ -3128,52 +2784,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. Ваш динамічний DNS успішно оновлено. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. Помилка динамічного DNS: Сервіс тимчасово недоступний; повторна спроба за 30 хвилин. - + Dynamic DNS error: hostname supplied does not exist under specified account. Помилка динамічного DNS: наданий домен не існує в зазначеному обліковому записі. - + Dynamic DNS error: Invalid username/password. Помилка динамічного DNS: Неправильний логін/пароль. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. Помилка динамічного DNS: qBittorrent додано в чорний список сервісу; будь ласка, повідомте про це на http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. Помилка динамічного DNS: Сервіс повернув %1; будь ласка, повідомте про помилку на http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. Помилка динамічного DNS: Ваш логін заблоковано через зловживання. - + Dynamic DNS error: supplied domain name is invalid. Помилка динамічного DNS: наданий домен неправильний. - + Dynamic DNS error: supplied username is too short. Помилка динамічного DNS: наданий логін закороткий. - + Dynamic DNS error: supplied password is too short. Помилка динамічного DNS: наданий пароль закороткий. @@ -3181,1413 +2837,1303 @@ Net::DownloadHandler - + I/O Error Помилка вводу/виводу - + The file size is %1. It exceeds the download limit of %2. Розмір файла %1. Він перевищує ліміт завантаження %2. - + Unexpected redirect to magnet URI. Неочікуване перенаправлення на magnet-посилання. + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - + + + GeoIP database loaded. Type: %1. Build time: %2. + Базу даних GeoIP завантажено. Тип: %1. Час збірки: %2. - - The operation was canceled - Операція скасована + + + Couldn't load GeoIP database. Reason: %1 + Не вдалося завантажити базу даних GeoIP. Причина: %1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - + + Venezuela, Bolivarian Republic of + Венесуела, Боліварська Республіка - - The connection to the remote server timed out - + + Viet Nam + В'єтнам - - SSL/TLS handshake failed - Помилка SSL/TLS + + + N/A + - - The remote server refused the connection - Віддалений сервер відмовив у з’єднанні + + Andorra + Андорра - - The connection to the proxy server was refused - Відмовлено у з’єднанні з проксі-сервером + + United Arab Emirates + Об'єднані Арабські Емірати - - The proxy server closed the connection prematurely - Проксі-сервер закрив з’єднання передчасно + + Afghanistan + Афганістан - - The proxy host name was not found - Не знайдено адресу проксі-серверу + + Antigua and Barbuda + Антигуа і Барбуда - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - Вичерпано час на з'єднання з проксі - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - Відмовлено у доступі до віддалених даних (401) - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - Виявлено невідому помилку, пов'язану з віддаленим вмістом - - - - A breakdown in protocol was detected - Виявлено поломку в протоколі - - - - Unknown error - Невідома помилка - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - Базу даних GeoIP завантажено. Тип: %1. Час збірки: %2. - - - - - Couldn't load GeoIP database. Reason: %1 - Не вдалося завантажити базу даних GeoIP. Причина: %1 - - - - Venezuela, Bolivarian Republic of - Венесуела, Боліварська Республіка - - - - Viet Nam - В'єтнам - - - - - N/A - - - - - Andorra - Андорра - - - - United Arab Emirates - Об'єднані Арабські Емірати - - - - Afghanistan - Афганістан + + Anguilla + Ангілья - Antigua and Barbuda - Антигуа і Барбуда - - - - Anguilla - Ангілья - - - Albania Албанія - + Armenia Вірменія - + Angola Ангола - + Antarctica Антарктида - + Argentina Аргентина - + American Samoa Американське Самоа - + Austria Австрія - + Australia Австралія - + Aruba Аруба - + Azerbaijan Азербайджан - + Bosnia and Herzegovina Боснія і Герцеговина - + Barbados Барбадос - + Bangladesh Бангладеш - + Belgium Бельгія - + Burkina Faso Буркіна-Фасо - + Bulgaria Болгарія - + Bahrain Бахрейн - + Burundi Бурунді - + Benin Бенін - + Bermuda Бермудські острови - + Brunei Darussalam Бруней-Даруссалам - + Brazil Бразилія - + Bahamas Багами - + Bhutan Бутан - + Bouvet Island Острів Буве - + Botswana Ботсвана - + Belarus Білорусь - + Belize Беліз - + Canada Канада - + Cocos (Keeling) Islands Кокосові (Кілінгові) острови - + Congo, The Democratic Republic of the Конго, Демократична Республіка - + Central African Republic Центральноафриканська Республіка - + Congo Конго - + Switzerland Швейцарія - + Cook Islands Острови Кука - + Chile Чилі - + Cameroon Камерун - + China Китай - + Colombia Колумбія - + Costa Rica Коста-Ріка - + Cuba Куба - + Cape Verde Кабо-Верде - + Curacao Кюрасао - + Christmas Island Острів Різдва - + Cyprus Кіпр - + Czech Republic Чехія - + Germany Німеччина - + Djibouti Джибуті - + Denmark Данія - + Dominica Домініка - + Dominican Republic Домініканська республіка - + Algeria Алжир - + Ecuador Еквадор - + Estonia Естонія - + Egypt Єгипет - + Western Sahara Західна Сахара - + Eritrea Еритрея - + Spain Іспанія - + Ethiopia Ефіопія - + Finland Фінляндія - + Fiji Фіджі - + Falkland Islands (Malvinas) Фолклендські (Мальвінські) острови - + Micronesia, Federated States of Мікронезія, Федеративні Штати - + Faroe Islands Фарерські острови - + France Франція - + Gabon Габон - + United Kingdom Об'єднане Королівство - + Grenada Гренада - + Georgia Грузія - + French Guiana Французька Гвіана - + Ghana Гана - + Gibraltar Гібралтар - + Greenland Гренландія - + Gambia Гамбія - + Guinea Гвінея - + Guadeloupe Гваделупа - + Equatorial Guinea Екваторіальна Гвінея - + Greece Греція - + South Georgia and the South Sandwich Islands Південна Джорджія та Південні Сандвічеві острови - + Guatemala Гватемала - + Guam Гуам - + Guinea-Bissau Гвінея-Бісау - + Guyana Гайана - + Hong Kong Гонконг - + Heard Island and McDonald Islands Острів Герд і Острови Макдональд - + Honduras Гондурас - + Croatia Хорватія - + Haiti Гаїті - + Hungary Угорщина - + Indonesia Індонезія - + Ireland Ірландія - + Israel Ізраїль - + India Індія - + British Indian Ocean Territory Британська територія Індійського океану - + Iraq Ірак - + Iran, Islamic Republic of Іран, Ісламська Республіка - + Iceland Ісландія - + Italy Італія - + Jamaica Ямайка - + Jordan Йорданія - + Japan Японія - + Kenya Кенія - + Kyrgyzstan Киргизстан - + Cambodia Камбоджа - + Kiribati Кірибаті - + Comoros Коморські острови - + Saint Kitts and Nevis Сент-Кіттс і Невіс - + Korea, Democratic People's Republic of Корейська Народно-Демократична Республіка - + Korea, Republic of Корея, Республіка - + Kuwait Кувейт - + Cayman Islands Кайманові острови - + Kazakhstan Казахстан - + Lao People's Democratic Republic Лаоська Народно-Демократична Республіка - + Lebanon Ліван - + Saint Lucia Сент-Люсія - + Liechtenstein Ліхтенштейн - + Sri Lanka Шрі Ланка - + Liberia Ліберія - + Lesotho Лесото - + Lithuania Литва - + Luxembourg Люксембург - + Latvia Латвія - + Morocco Марокко - + Monaco Монако - + Moldova, Republic of Молдова, Республіка - + Madagascar Мадагаскар - + Marshall Islands Маршаллові Острови - + Mali Малі - + Myanmar М'янма - + Mongolia Монголія - + Northern Mariana Islands Північні Маріанські острови - + Martinique Мартиніка - + Mauritania Мавританія - + Montserrat Монтсеррат - + Malta Мальта - + Mauritius Маврикій - + Maldives Мальдіви - + Malawi Малаві - + Mexico Мексика - + Malaysia Малайзія - + Mozambique Мозамбік - + Namibia Намібія - + New Caledonia Нова Каледонія - + Niger Нігер - + Norfolk Island Норфолк, Острів - + Nigeria Нігерія - + Nicaragua Нікарагуа - + Netherlands Нідерланди - + Norway Норвегія - + Nepal Непал - + Nauru Науру - + Niue Ніуе - + New Zealand Нова Зеландія - + Oman Оман - + Panama Панама - + Peru Перу - + French Polynesia Французька Полінезія - + Papua New Guinea Папуа-Нова Гвінея - + Philippines Філіппіни - + Pakistan Пакистан - + Poland Польща - + Saint Pierre and Miquelon Сен-П'єр і Мікелон - + Puerto Rico Пуерто-Рико - + Portugal Португалія - + Palau Палау - + Paraguay Парагвай - + Qatar Катар - + Reunion Реюньйон - + Romania Румунія - + Russian Federation Російська Федерація - + Rwanda Руанда - + Saudi Arabia Саудівська Аравія - + Solomon Islands Соломонові Острови - + Seychelles Сейшельські Острови - + Sudan Судан - + Sweden Швеція - + Singapore Сінгапур - + Slovenia Словенія - + Svalbard and Jan Mayen Свальбард і Ян-Маєн - + Slovakia Словаччина - + Sierra Leone Сьєрра-Леоне - + San Marino Сан-Марино - + Senegal Сенегал - + Somalia Сомалі - + Suriname Сурінам - + Sao Tome and Principe Сан-Томе і Принсіпі - + El Salvador Сальвадор - + Syrian Arab Republic Сирійська Арабська Республіка - + Swaziland Свазіленд - + Turks and Caicos Islands Теркс і Кейкос, Острови - + Chad Чад - + French Southern Territories Французькі Південні території - + Togo Того - + Thailand Таїланд - + Tajikistan Таджикистан - + Tokelau Токелау - + Turkmenistan Туркменістан - + Tunisia Туніс - + Tonga Тонга - - Could not decompress GeoIP database file. - Не вдалося розпакувати файл бази даних GeoIP. - - - + Timor-Leste Східний Тимор - + Bolivia, Plurinational State of Болівія, Багатонаціональна Держава - + Bonaire, Sint Eustatius and Saba Бонайре, Сінт-Естатіус та Саба - + Cote d'Ivoire Кот-д'Івуар - + Libya Лівія - + Saint Martin (French part) Сен-Мартен (Франція) - + Macedonia, The Former Yugoslav Republic of Колишня Югославська Респу́бліка Македонія - + Macao Макао - + Pitcairn Піткерн - + Palestine, State of Палестинська держава - + Saint Helena, Ascension and Tristan da Cunha Святої Єлени, Вознесіння та Тристан-да-Кунья, острови - + South Sudan Південний Судан - + Sint Maarten (Dutch part) Сінт-Мартен (Нідерланди) - + Turkey Туреччина - + Trinidad and Tobago Тринідад і Тобаго - + Tuvalu Тувалу - + Taiwan Тайвань - + Tanzania, United Republic of Танзанія, Об'єднана Республіка - + Ukraine Україна - + Uganda Уганда - + United States Minor Outlying Islands Зовнішні малі острови США - + United States США - + Uruguay Уругвай - + Uzbekistan Узбекистан - + Holy See (Vatican City State) Святий Престол (Держава-місто Ватикан) - + Saint Vincent and the Grenadines Сент-Вінсент і Гренадини - + Virgin Islands, British Віргінські Острови, Британські - + Virgin Islands, U.S. Віргінські острови, Американські - + Vanuatu Вануату - + Wallis and Futuna Волліс і Футуна - + Samoa Самоа - + Yemen Ємен - + Mayotte Майотта - + Serbia Сербія - + South Africa Південна Африка - + Zambia Замбія - + Montenegro Чорногорія - + Zimbabwe Зімбабве - + Aland Islands Аландські острови - + Guernsey Гернсі - + Isle of Man Острів Мен - + Jersey Джерсі, Острів - + Saint Barthelemy Сен-Бартельмі - + + Could not uncompress GeoIP database file. + Не вдалося розпакувати базу даних GeoIP. + + + Couldn't save downloaded GeoIP database file. Не вдалося зберегти завантажений файл бази GeoIP. - + Successfully updated GeoIP database. Базу даних GeoIP успішно оновлено. - + Couldn't download GeoIP database file. Reason: %1 Не вдалося завантажити файл бази GeoIP. Причина: %1 @@ -4595,12 +4141,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] Підтримка UPnP / NAT-PMP [Увімк.] - + UPnP / NAT-PMP support [OFF] Підтримка UPnP / NAT-PMP [Вимк.] @@ -4608,7 +4154,7 @@ Net::Smtp - + Email Notification Error: Помилка сповіщення e-mail: @@ -4616,1277 +4162,1077 @@ OptionsDialog - + Options Налаштування - + Behavior Поведінка - + Downloads Завантаження - + Connection З'єднання - + Speed Швидкість - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI Веб-інтерфейс - + Advanced Додатково - + Language Мова - + User Interface Language: Мова інтерфейсу: - + (Requires restart) (Потребує перезапуску програми) - + Transfer List Список завантажень - + Confirm when deleting torrents - Підтверджувати видалення торентів + Підтверджувати видалення торрентів - + Use alternating row colors In transfer list, one every two rows will have grey background. Кожен другий рядок виділений кольором - + Hide zero and infinity values Сховати значення нуль та нескінченність - + Always Завжди - + Paused torrents only - Лише призупинені торенти + Лише призупинені торренти - + Action on double-click Дія при подвійному клацанні - + Downloading torrents: Якщо завантажується: - - + + Start / Stop Torrent - Запустити або зупинити торент + Запустити або зупинити торрент - - + + Open destination folder Відкрити теку призначення - - + + No action Нічого не робити - + Completed torrents: - Завершені торенти: + Завершені торренти: - + Desktop Робочий стіл - + Start qBittorrent on Windows start up Запускати qBittorrent при завантаженні системи - + Show splash screen on start up Показувати логотип при завантаженні програми - + Start qBittorrent minimized Запускати qBittorrent згорнутим - + Confirmation on exit when torrents are active - Підтверджувати вихід, коли є активні торенти + Підтверджувати вихід, коли є активні торренти - + Confirmation on auto-exit when downloads finish Підтверджувати автоматичний вихід після завершення завантажень - - KiB - КіБ - - - - Email notification &upon download completion - Сповіщення через e-mail про &завершення завантажень - - - - Run e&xternal program on torrent completion - Запустити зовнішню &програму при завершенні торенту - - - - IP Fi&ltering - &Фільтрування IP - - - - Schedule &the use of alternative rate limits - Використання альтернативних обмежень &швидкості за розкладом - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Додатково</a>) - - - - &Torrent Queueing - &Черга торентів - - - - Seed torrents until their seeding time reaches - Сидувати торенти, доки час їх роздачі не досягне - - - - A&utomatically add these trackers to new downloads: - Автоматично &додавати ці трекери до нових завантажень: - - - - RSS Reader - Читач RSS - - - - Enable fetching RSS feeds - Увімкнути завантаження RSS-подач - - - - Feeds refresh interval: - Інтервал оновлення подач: - - - - Maximum number of articles per feed: - Максимальна кількість новин на подачу: - - - - - min - minutes - хв - - - - RSS Torrent Auto Downloader - Автозавантажувач торентів із RSS - - - - Enable auto downloading of RSS torrents - Ввімкнути автоматичне завантаження торентів з RSS - - - - Edit auto downloading rules... - Редагувати правила автозавантаження... - - - - Web User Interface (Remote control) - Веб-інтерфейс користувача (дистанційне керування) - - - - IP address: - IP адреса: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - - - - - Server domains: - Домени сервера: + + Show qBittorrent in notification area + Показувати qBittorrent в області сповіщень - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - Білий список для фільтрування значень заголовку HTTP вузла. -Щоб захиститися від атаки DNS-переприв'язування, ви повинні -додати імена доменів, які використовуються сервером Веб-інтерфейсу. - -Використовуйте ';', щоб розділити кілька записів. Можна використовувати шаблон '*'. - - - - &Use HTTPS instead of HTTP - &Використовувати HTTPS замість HTTP - - - - Bypass authentication for clients on localhost - Уникати автентифікації для клієнтів на localhost - - - - Bypass authentication for clients in whitelisted IP subnets - - - - - IP subnet whitelist... - Список дозволених підмереж IP... - - - - Upda&te my dynamic domain name - Оновлювати мій &динамічний домен - - - + Minimize qBittorrent to notification area Згортати qBittorrent у зону сповіщень - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. Закривати qBittorrent у зону сповіщень - + Tray icon style: Стиль значка в системному лотку: - + Normal Звичайний - + Monochrome (Dark theme) Монохромний (Темна тема) - + Monochrome (Light theme) Монохромний (Світла тема) - + File association Прив'язка файлів - + Use qBittorrent for .torrent files Використовувати qBittorrent для файлів .torrent - + Use qBittorrent for magnet links Використовувати qBittorrent для magnet-посилань - + Power Management Керування енергоспоживанням - + + Inhibit system sleep when torrents are active + Не дозволяти призупинення системи, коли є активні торренти + + + + Log file + Файл журналу + + + Save path: Шлях збереження: - + Backup the log file after: Робити резервну копію журналу після: - + + MB + МБ + + + Delete backup logs older than: Видаляти файли журналу, старіші ніж: - + days Delete backup logs older than 10 months днів - + months Delete backup logs older than 10 months місяців - + years Delete backup logs older than 10 years років - + When adding a torrent - При додаванні торенту + При додаванні торрента + + + + Display torrent content and some options + Відображати вміст торрента і деякі налаштування - + Bring torrent dialog to the front - Підняти торентове вікно + Підняти вікно торрента - + Do not start the download automatically The torrent will be added to download list in pause state Не починати завантаження автоматично - + Should the .torrent file be deleted after adding it Видаляти файл .torrent після його успішного додавання до черги - + + Delete .torrent files afterwards + Видаляти файли .torrent опісля + + + Also delete .torrent files whose addition was cancelled Також видаляти .torrent-файли, додавання яких було скасовано - + Also when addition is cancelled - Також, якщо додавання скасовано + Також якщо додавання скасовано - + Warning! Data loss possible! Увага! Можлива втрата даних! - + Saving Management Керування зберіганням - + Default Torrent Management Mode: - Режим керування торентами за замовчуванням: + Режим керування торрентами за замовчуванням: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - Автоматичний режим означає, що різні властивості торенту (наприклад, шлях збереження) буде визначено через його категорію + Автоматичний режим означає, що різні властивості торрента (наприклад, шлях збереження) буде визначено через його категорію - + Manual Вручну - + Automatic Автоматичний - + When Torrent Category changed: - Коли змінилася категорія торенту: + Коли змінилася категорія торрента: - + Relocate torrent - Перемістити торент + Перемістити торрент - + Switch torrent to Manual Mode - Перемкнути торент до ручного режиму + Перемкнути торрент до ручного режиму - + When Default Save Path changed: Коли змінився стандартний шлях збереження: - - + + Relocate affected torrents - Перемістити відповідні торенти + Перемістити відповідні торренти - - + + Switch affected torrents to Manual Mode - Перемкнути відповідні торенти до ручного режиму + Перемкнути відповідні торренти до ручного режиму - + When Category changed: Коли змінилася категорія: - + Use Subcategories Використовувати підкатегорії - + Default Save Path: Шлях збереження за замовчуванням: - + Keep incomplete torrents in: - Тримати незавершені торенти у: + Тримати незавершені торренти у: - + Copy .torrent files to: Копіювати torrent-файли до: - - Show &qBittorrent in notification area - Показувати &qBittorrent в області сповіщень - - - - &Log file - Файл &журналу - - - - Display &torrent content and some options - Показувати вміст &торента та деякі налаштування - - - - Create subfolder for torrents with multiple files - Створити підкаталог для торентів з декількома файлами - - - - De&lete .torrent files afterwards - &Видаляти файли .torrent опісля - - - + Copy .torrent files for finished downloads to: Копіювати torrent-файли для завершених завантажень до: - + Pre-allocate disk space for all files Попередньо виділяти місце для всіх файлів - - Inhibit system sleep when torrents are downloading - Не дозволяти призупинення системи під час завантаження торентів - - - - Inhibit system sleep when torrents are seeding - Не дозволяти призупинення системи, коли торенти роздаються - - - + Append .!qB extension to incomplete files Додавати розширення .!qB до незавершених файлів - - Enable recursive download dialog - - - - + Automatically add torrents from: - Автоматично додавати торенти з: + Автоматично додавати торренти із: - + Add entry Додати запис - + Remove entry Вилучити запис - + + Email notification upon download completion + Сповіщення через e-mail при завершенні завантажень + + + + Destination email: + E-mail призначення: + + + SMTP server: Сервер SMTP: - + This server requires a secure connection (SSL) Цей сервер вимагає безпечного з'єднання (SSL) - - + + + Authentication Автентифікація - - - - + + + + Username: Ім'я користувача: - - - - + + + + Password: Пароль: - - Enabled protocol: - Задіяні протоколи: - - - - TCP and μTP - TCP та μTP + + Run external program on torrent completion + Запустити зовнішню програму при завершенні торрента - + Listening Port Порт для вхідних з'єднань - + Port used for incoming connections: Порт, який використовуватиметься для вхідних з'єднань: - + Random Випадковий - + Use UPnP / NAT-PMP port forwarding from my router Використовувати UPnP / NAT-PMP з мого роутера - + Use different port on each startup Використовувати щоразу інший порт - + Connections Limits Обмеження з'єднань - + Maximum number of connections per torrent: - Максимальна кількість з'єднань на торент: + Максимальна кількість з'єднань на торрент: - + Global maximum number of connections: Максимальна кількість з'єднань: - + Maximum number of upload slots per torrent: - Макс. з'єднань для вивантаження на торент: + Макс. з'єднань для вивантаження на торрент: - + Global maximum number of upload slots: Максимальна кількість з'єднань для вивантаження: - + Proxy Server Проксі-сервер - + Type: Тип: - + (None) (Немає) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: Адреса: - - + + Port: Порт: - + Otherwise, the proxy server is only used for tracker connections В іншому випадку, проксі-сервер використовується лише для з'єднань з трекером - + Use proxy for peer connections Використовувати проксі для з'єднання з пірами - + Disable connections not supported by proxies Вимкнути з'єднання, які не підтримуються проксі-серверами. - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">Додатково</a>) - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - RSS-подачі, пошуковик, оновлення ПЗ та все інше крім передачі даних торентів і пов’язаних операцій (наприклад, обмін пірами) використовуватиме пряме з’єднання + RSS-подачі, пошуковик, оновлення ПЗ та все інше крім передачі даних торрентів і пов’язаних операцій (наприклад, обмін пірами) використовуватиме пряме з’єднання - + Use proxy only for torrents - Використовувати проксі лише для торентів - - - - A&uthentication - &Автентифікація + Використовувати проксі лише для торрентів - + Info: The password is saved unencrypted Увага: пароль зберігається в незашифрованому вигляді - + + IP Filtering + IP-фільтр + + + Filter path (.dat, .p2p, .p2b): Шлях до фільтра (.dat, .p2p, .p2b): - + Reload the filter Перезавантажити фільтр - - Manually banned IP addresses... - Вручну заблоковані IP-адреси... - - - + Apply to trackers Застосувати до трекерів - + Global Rate Limits Глобальні обмеження швидкості - - - - - - - KiB/s - КіБ/ів - - - - + + Upload: Вивантаження: - - + + + + + KiB/s + КіБ/с + + + + Download: Завантаження: - + Alternative Rate Limits Альтернативні обмеження швидкості - - + + Schedule the use of alternative rate limits + Використання альтернативних обмежень швидкості за розкладом + + + From: from (time1 to time2) З: - - + To: time1 to time2 До: - + When: Коли: - + Every day Щодня - + Weekdays Робочі дні - + Weekends Вихідні - + Rate Limits Settings Налаштування обмежень швидкості - + Apply rate limit to peers on LAN Застосувати обмеження для пірів з LAN - + Apply rate limit to transport overhead Включати в обмеження протокол передачі - - + + + Enable µTP protocol + Увімкнути протокол µTP + + + Apply rate limit to µTP protocol Включати в обмеження протокол uTP - + Privacy Конфіденційність - + Enable DHT (decentralized network) to find more peers Увімкнути DHT (децентралізовану мережу), щоб знаходити більше пірів - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) Обмін пірами із сумісними Bittorrent-клієнтами (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers Увімкнути обмін пірами (PeX), щоб знаходити більше пірів - + Look for peers on your local network Шукати пірів у локальній мережі - + Enable Local Peer Discovery to find more peers Увімкнути локальний пошук пірів, щоб знаходити більше пірів - + Encryption mode: Режим шифрування: - + Prefer encryption Надавати перевагу шифруванню - + Require encryption Вимагати шифрування - + Disable encryption Вимкнути шифрування - + Enable when using a proxy or a VPN connection Увімкнути при використанні з’єднання через проксі або VPN - + Enable anonymous mode Увімкнути анонімний режим - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">Подробиці</a>) + + + + Torrent Queueing + Черга торрентів + + + Maximum active downloads: Макс. активних завантажень: - + Maximum active uploads: Макс. активних вивантажень: - + Maximum active torrents: - Макс. активних торентів: + Макс. активних торрентів: - + Do not count slow torrents in these limits - Не враховувати повільні торенти до цих обмежень - - - - Upload rate threshold: - - - - - Download rate threshold: - - - - - sec - seconds - сек - - - - Torrent inactivity timer: - Час простоювання торенту: + Не враховувати повільні торренти до цих обмежень - + Share Ratio Limiting Обмеження вивантаження - + Seed torrents until their ratio reaches - Сидувати торенти, доки їх коефіцієнт не досягне + Сідувати торренти, доки їх коефіцієнт не досягне - + then а тоді - + Pause them Призупинити їх - + Remove them Видалити їх - - RSS Smart Episode Filters - + + Automatically add these trackers to new downloads: + Автоматично додавати ці трекери до нових завантажень: + + + + Enable Web User Interface (Remote control) + Увімкнути веб-інтерфейс (дистанційне керування) - + Use UPnP / NAT-PMP to forward the port from my router Використовувати UPnP / NAT-PMP, щоб направити порт в роутері - + + Use HTTPS instead of HTTP + Використовувати HTTPS замість HTTP + + + Certificate: Сертифікат: - + Import SSL Certificate Імпортувати сертифікат SSL - + Key: Ключ: - + Import SSL Key Імпортувати ключ SSL - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Інформація про сертифікати</a> - - Use alternative Web UI - Використовувати альтернативний вебовий інтерфейс - - - - Files location: - Розташування файлів + + Bypass authentication for localhost + Уникати автентифікації для localhost - - Enable clickjacking protection - - - - - Enable Cross-Site Request Forgery (CSRF) protection - + + Update my dynamic domain name + Оновити мій динамічний домен - + Service: Сервіс: - + Register Зареєструватись - + Domain name: Домен: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! Увімкнувши ці налаштування, ви ризикуєте <strong>безповоротно втратити</strong> ваші файли .torrent! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - Якщо дані параметри увімкнені, qBittorent буде <strong>видаляти</strong> файл .torrent після його успішного (перший параметр) або неуспішного (другий параметр) додавання в чергу завантажень. Це застосовується не тільки для файлів, доданих через меню &ldquo;Додати торент&rdquo;, але і для тих, що були відкриті через <strong>файлову асоціацію</strong> + Якщо дані параметри увімкнені, qBittorent буде <strong>видаляти</strong> файл .torrent після його успішного (перший параметр) або неуспішного (другий параметр) додавання в чергу завантажень. Це застосовується не тільки для файлів, доданих через меню &ldquo;Додати торрент&rdquo;, але і для тих, що були відкриті через <strong>файлову асоціацію</strong> - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - Якщо увімкнути другий параметр ( &ldquo;Також, якщо додавання скасовано&rdquo;) торент-файл <strong>буде видалено</strong> навіть якщо ви натиснете &ldquo;<strong>Скасувати</strong>&rdquo; у вікні &ldquo;Додати торент&rdquo; + Якщо увімкнути другий параметр ( &ldquo;Крім того, якщо додавання скасовано&rdquo;) файл .torrent <strong>буде видалено</strong> навіть якщо ви натиснете на &ldquo;<strong>Скасування</strong>&rdquo; у вікні &ldquo;Додати торрент&rdquo; - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): Підтримувані параметри (чутливо до регістру): - + %N: Torrent name - %N: Назва торенту + %N: Назва торрента - + %L: Category %L: Категорія - - %G: Tags (seperated by comma) - - - - + %F: Content path (same as root path for multifile torrent) - %F: Шлях вмісту (для торенту з багатьма файлами те саме що корінь) + %F: Шлях вмісту (для торрента з багатьма файлами те саме що корінь) - + %R: Root path (first torrent subdirectory path) - %R: Кореневий шлях (шлях до головної теки торенту) + %R: Кореневий шлях (шлях до головної папки торрента) - + %D: Save path %D: Шлях збереження - + %C: Number of files %C: Кількість файлів - + %Z: Torrent size (bytes) - %Z: Розмір торенту (у байтах) + %Z: Розмір торрента (в байтах) - + %T: Current tracker %T: Поточний трекер - + %I: Info hash - %I: Інформаційний геш + %I: Інформаційний хеш - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") Порада: Обгорніть параметр лапками, щоб уникнути розділення тексту пробілами (наприклад, "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor Виберіть теку для спостереження - + Folder is already being monitored: За текою вже ведеться стеження: - + Folder does not exist: Тека не існує: - + Folder is not readable: Теку неможливо прочитати: - + Adding entry failed Не вдалося додати запис - - - - + + Choose export directory - Виберіть каталог для експорту + Виберіть теку для експорту - - - + + + + + + Choose a save directory - Виберіть каталог для збереження + Виберіть теку для збереження - + Choose an IP filter file Виберіть файл IP-фільтра - + All supported filters Всі підтримувані фільтри - + SSL Certificate Сертифікат SSL - + + SSL Key + Ключ SSL + + + Parsing error Помилка розбору - + Failed to parse the provided IP filter Не вдалося розібрати даний фільтр IP - + Successfully refreshed Успішно оновлено - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Успішно розібрано наданий фільтр IP: застосовано %1 правил. - + Invalid key Хибний ключ - + This is not a valid SSL key. Це не є коректний ключ SSL. - + Invalid certificate Хибний сертифікат - - Preferences - Налаштування - - - - Import SSL certificate - Імпортувати сертифікат SSL - - - + This is not a valid SSL certificate. Це не є коректний сертифікат SSL. - - Import SSL key - Імпортувати ключ SSL - - - - SSL key - Ключ SSL - - - + Time Error Помилка часу - + The start time and the end time can't be the same. Час початку і кінця не може бути тим самим. - - + + Length Error Помилка довжини - + The Web UI username must be at least 3 characters long. Ім'я користувача веб-інтерфейсу повинне містити хоча б 3 символи. - + The Web UI password must be at least 6 characters long. Пароль від Веб-інтерфейсу повинен містити хоча би 6 символів. @@ -5894,72 +5240,72 @@ PeerInfo - - Interested(local) and Choked(peer) - + + interested(local) and choked(peer) + зацікавлений (локальний), відмовляється (пір) - + interested(local) and unchoked(peer) зацікавлений (локальний), погоджується (пір) - + interested(peer) and choked(local) зацікавлений (пір), відмовляється (локальний) - + interested(peer) and unchoked(local) зацікавлений (пір), погоджується (локальний) - + optimistic unchoke оптимістичний вибір - + peer snubbed пір зупинився - + incoming connection вхідне з'єднання - + not interested(local) and unchoked(peer) незацікавлений (локальний), відмовляється (пір) - + not interested(peer) and unchoked(local) незацікавлений (пір), відмовляється (локальний) - + peer from PEX пір із PEX - + peer from DHT пір із DHT - + encrypted traffic шифрований трафік - + encrypted handshake шифроване підтвердження встановлення зв'язку - + peer from LSD пір із LSD @@ -5967,193 +5313,178 @@ PeerListWidget - + IP IP - + Port Порт - + Flags Прапори - + Connection З'єднання - + Client i.e.: Client application Клієнт - + Progress i.e: % downloaded Прогрес - + Down Speed i.e: Download speed Шв. завантаження - + Up Speed i.e: Upload speed Шв. вивантаження - + Downloaded i.e: total data downloaded Завантажено - + Uploaded i.e: total data uploaded Вивантажено - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. Доречність - + Files i.e. files that are being downloaded right now Файли - + Column visibility Показані колонки - + Add a new peer... Додати нового піра... - - + + Ban peer permanently Заблокувати піра - + Manually adding peer '%1'... Вручну додається пір '%1'... - + The peer '%1' could not be added to this torrent. - Піра '%1' не вдалося додати до цього торенту. + Піра '%1' не вдалося додати до цього торрента. - + Manually banning peer '%1'... Вручну блокується пір '%1'... - - + + Peer addition Додавання піра - + Country Країна - + Copy IP:port Копіювати IP:порт - + Some peers could not be added. Check the Log for details. Деяких пірів не вдалося додати. Додаткові деталі в Журналі. - + The peers were added to this torrent. - Пірів додано до цього торенту. + Пірів додано до цього торрента. - + Are you sure you want to ban permanently the selected peers? Ви впевнені, що хочете назовсім заблокувати вибраних пірів? - + &Yes &Так - + &No &Ні - PeersAdditionDialog + PeersAdditionDlg - - Add Peers - Додати пірів - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - - - + No peer entered - Не введено жодного піра. + Не введено піра. - + Please type at least one peer. Будь ласка, введіть хоча б одного піра. - + Invalid peer Хибний пір - + The peer '%1' is invalid. - + Пір '%1' хибний. PieceAvailabilityBar - + White: Unavailable pieces Білий: недоступні частини - + Blue: Available pieces Синій: доступні частини @@ -6161,336 +5492,293 @@ PiecesBar - + Files in this piece: Файли в даній частині: - + File in this piece Файл в даній частині - + File in these pieces Файл у даних частинах - - Wait until metadata become available to see detailed information - Для перегляду детальної інформації, зачекайте, поки метадані стануть доступними - - - + Hold Shift key for detailed information Утримуйте клавішу Shift для перегляду розширеної інформації - PluginSelectDialog + PluginSelectDlg - + Search plugins Пошукові додатки - + Installed search plugins: Встановлені пошукові додатки: - + Name Назва - + Version Версія - + Url - Веб-сторінка + URL - - + + Enabled Увімкнено - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Ви можете отримати нові пошукові додатки тут: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one Встановити новий - + Check for updates - Перевірити на оновлення + Перевірити оновлення - + Close Закрити - + Uninstall Видалити - - - + + + Yes Так - - - - + + + + No Ні - + Uninstall warning Попередження про видалення - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Деякі додатки не вдалось видалити, бо вони є частиною qBittorrent. Можна видалити лише ті додатки, які ви встановили власноруч. +Ці додатки було вимкнено. - + Uninstall success Видалення успішне - + All selected plugins were uninstalled successfully - - - - - - - - Search plugin update - Оновити пошуковий додаток - - - - Plugins installed or updated: %1 - + Всі вибрані додатки успішно видалено - - + + New search engine plugin URL - + Новий URL пошукового додатка - - + + URL: URL: - + Invalid link - Хибна ланка + Хибне посилання - + The link doesn't seem to point to a search engine plugin. - + Це посилання не вказує на пошуковий додаток. - + Select search plugins Вибрати пошукові додатки - + qBittorrent search plugin Пошуковий додаток qBittorrent - + + + + Search plugin update + Оновити пошуковий додаток + + + All your plugins are already up to date. Всі ваші додатки свіжої версії. - + Sorry, couldn't check for plugin updates. %1 - + Вибачте, не вдалось перевірити оновлення додатків. %1 - + + + Search plugin install Встановити пошуковий додаток - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + Пошуковий додаток "%1" успішно встановлено. + + + Couldn't install "%1" search engine plugin. %2 - + Не вдалося встановити пошуковий додаток "%1". %2 + + + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + Пошуковий додаток "%1" успішно оновлено. - + Couldn't update "%1" search engine plugin. %2 - + Не вдалося оновити пошуковий додаток "%1". %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - Джерело додатку + Джерело додатка - + Search plugin source: - Джерело пошукового додатку: + Джерело пошукового додатка: - + Local file Локальний файл - + Web link - Веб-ланка - - - - PowerManagement - - - qBittorrent is active - qBittorrent працює + Веб-посилання - PreviewSelectDialog - - - Preview - Попередній перегляд - + PreviewSelect - + Name Назва - + Size Розмір - + Progress - Перебіг + Прогрес - - + + Preview impossible - Попередній перегляд неможливий + Перегляд неможливий - - + + Sorry, we can't preview this file Пробачте, неможливо переглянути цей файл - Private::FileLineEdit - - - '%1' does not exist - '%1' не існує - - - - '%1' does not point to a directory - '%1' не вказує на каталог - - - - '%1' does not point to a file - '%1' не вказує на файл - - - - Does not have read permission in '%1' - Відсутні права на читання '%1' - - - - Does not have write permission in '%1' - Відсутні права на запис в '%1' - - - PropListDelegate - + Not downloaded Не завантажується - - + + Normal Normal (priority) Нормальний - - N/A - - - - + Do not download Do not download (priority) - Не завантажувати + Не завантажувати - - + + High High (priority) Високий - + N/A + + + + Mixed Mixed (priorities Змішані - - + + Maximum Maximum (priority) Максимальний @@ -6499,32 +5787,32 @@ PropTabBar - + General Загальні - + Trackers Трекери - + Peers Піри - + HTTP Sources Джерела HTTP - + Content Вміст - + Speed Швидкість @@ -6570,7 +5858,7 @@ Seeds: - Сиди: + Сіди: @@ -6618,22 +5906,22 @@ Коментар: - + Select All Вибрати все - + Select None Зняти виділення - + Normal Нормальний - + High Високий @@ -6685,7 +5973,7 @@ Torrent Hash: - Геш торенту: + Хеш торрента: @@ -6693,751 +5981,717 @@ Шлях збереження: - + Maximum Максимальний + - Do not download Не завантажувати - + Never Ніколи - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 × %2 (є %3) - - + + %1 (%2 this session) %1 (%2 цього сеансу) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (роздавався %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (макс. %2) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (%2 загалом) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (%2 середн.) - + Open Відкрити - + Open Containing Folder Відкрити теку - + Rename... Перейменувати... - + Priority Пріоритет - + New Web seed - Новий веб-сид + Додати Веб-сід - + Remove Web seed - Вилучити веб-сида + Вилучити Веб-сід - + Copy Web seed URL - Скопіювати URL веб-сида + Скопіювати URL Веб-сіда - + Edit Web seed URL - Редагувати URL веб-сида + Редагувати URL Веб-сіда + + + + Rename the file + Перейменувати файл - + New name: Нова назва: - - + + + The file could not be renamed + Файл не вдалося перейменувати + + + + This file name contains forbidden characters, please choose a different one. + Ця назва файла містить заборонені символи. Будь ласка, виберіть іншу. + + + + This name is already in use in this folder. Please use a different name. - Ця назва файла вже використовується в даній теці. Будь ласка, виберіть іншу. + Ця назва файла вже використовується в даній папці. Будь ласка, виберіть іншу. - + The folder could not be renamed Не вдалося перейменувати цю теку - + qBittorrent qBittorrent - + Filter files... Фільтрувати файли... - - Renaming - Перейменування - - - - - Rename error - Помилка перейменування - - - - The name is empty or contains forbidden characters, please choose a different one. - Назва порожня або містить заборонені символи, будь ласка, виберіть іншу. - - - + New URL seed New HTTP source Нова URL-роздача - + New URL seed: Нова URL-роздача: - - + + This URL seed is already in the list. Ця URL-роздача вже є у списку. - + Web seed editing - Редагування веб-сида + Редагування Веб-сіда - + Web seed URL: - URL веб-сида: + URL Веб-сіда: QObject - + + Your IP address has been banned after too many failed authentication attempts. + Ваша IP-адреса заблокована після надто численних невдалих спроб автентифікації. + + + + Error: '%1' is not a valid torrent file. + + Помилка: '%1' не є коректним torrent-файлом. + + + + + Error: Could not add torrent to session. + Помилка: Не вдалося додати торрент до сеансу. + + + + I/O Error: Could not create temporary file. + Помилка вводу/виводу. + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 — невідомий параметр командного рядка. - - + + %1 must be the single command line parameter. %1 повинен бути єдиним параметром командного рядка. - + + %1 must specify the correct port (1 to 65535). + %1 повинен бути коректним портом (1–65535). + + + You cannot use %1: qBittorrent is already running for this user. Ви не можете використовувати %1: qBittorrent уже запущено для цього користувача. - + Usage: Використання: - + Options: Параметри: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - Параметр '%1' повинен відповідати синтаксису '%1=%2' + + Displays program version + Показує версію програми + + + + Displays this help message + Показує це повідомлення допомоги - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - Параметр '%1' повинен відповідати синтаксису '%1=%2' + + Changes the Web UI port (current: %1) + Змінює порт Веб-інтерфейсу (поточний: %1) - - Expected integer number in environment variable '%1', but got '%2' - Очікувалося ціле число у змінній середовища '%1', але отримано '%2' + + Disable splash screen + Вимкнути початкову заставку - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - Параметр '%1' повинен відповідати синтаксису '%1=%2' + + Run in daemon-mode (background) + Виконувати у фоновому режимі (daemon) - - Expected %1 in environment variable '%2', but got '%3' - Очікувалося %1 у змінній середовища '%2', але отримано '%3' + + Downloads the torrents passed by the user + Завантажує торренти, вказані користувачем - - port - порт + + Help + Допомога - - %1 must specify a valid port (1 to 65535). - %1 має вказувати коректний порт (від 1 до 65535). + + Run application with -h option to read about command line parameters. + Запустіть програму із параметром -h, щоб прочитати про параметри командного рядка. - - Display program version and exit - Показати версію програми та вийти + + Bad command line + Поганий командний рядок - - Display this help message and exit - Показати цю довідку та вийти + + Bad command line: + Поганий командний рядок: - - Change the Web UI port - Змінити порт Веб-інтерфейсу + + Legal Notice + Правова примітка - - Disable splash screen - Вимкнути початкову заставку + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + qBittorrent — це програма для роздачі файлів. Коли ви запускаєте торрент, його дані будуть доступні іншим через вивантаження. Всі дані, які ви роздаєте, на вашій відповідальності. + +Ця замітка більше не з'являтиметься. - - Run in daemon-mode (background) - Виконувати у фоновому режимі (daemon) + + Press %1 key to accept and continue... + Натисніть %1, щоб погодитись і продовжити... - - dir - Use appropriate short form or abbreviation of "directory" - тека + + Legal notice + Правова примітка - - Store configuration files in <dir> - Зберігати файли конфігурації в <dir> + + Cancel + Скасувати - - - name - назва + + I Agree + Я погоджуюсь - - Store configuration files in directories qBittorrent_<name> - Зберігати файли налаштувань у каталогах qBittorrent_<name> + + Torrent name: %1 + Назва торрента: %1 - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - Змінити файли швидкого відновлення libtorrent та створити шляхи файлів відносно каталогу профілю + + Torrent size: %1 + Розмір торрента: %1 - - files or URLs - файли або посилання + + Save path: %1 + Шлях збереження: %1 - - Download the torrents passed by the user - Завантажити торенти, вказані користувачем + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Торрент завантажено за %1. - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - + + Thank you for using qBittorrent. + Дякуємо, що ви користуєтесь qBittorrent. - - Options when adding new torrents: - Опції для додавання нових торентів: + + [qBittorrent] '%1' has finished downloading + [qBittorrent] Завантаження '%1' завершено - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - Скорочення для %1 + + The remote host name was not found (invalid hostname) + Віддалений сервер не знайдено (неправильна адреса) - - path - шлях + + The operation was canceled + Операцію скасовано - - Torrent save path - Шлях збереження торенту + + The remote server closed the connection prematurely, before the entire reply was received and processed + Віддалений сервер закрив з'єднання передчасно, перед тим, як було отримано і оброблено відповідь - - Add torrents as started or paused - Додавати торенти як запущені чи призупинені + + The connection to the remote server timed out + Вичерпано час на з'єднання з віддаленим сервером - - Skip hash check - Пропустити перевірку гешу + + SSL/TLS handshake failed + Помилка обміну SSL/TLS - - Assign torrents to category. If the category doesn't exist, it will be created. - + + The remote server refused the connection + Віддалений сервер відмовив у з'єднанні - - Download files in sequential order - Завантажувати файли по порядку + + The connection to the proxy server was refused + Відмовлено у з'єднанні з проксі-сервером - - Download first and last pieces first - Спочатку завантажувати першу і останню частину + + The proxy server closed the connection prematurely + Проксі-сервер закрив з'єднання передчасно - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - + + The proxy host name was not found + Не знайдено адресу проксі-сервера - - Command line parameters take precedence over environment variables - Параметри командного рядка мають пріоритет над змінними середовища + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Вичерпано час на з'єднання з проксі або сервер не встиг відповісти на запит - - Help - Допомога + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + Проксі потребує автентифікації, щоб задовольнити запит, але не прийняв запропонованих автентифікаційних даних - - Run application with -h option to read about command line parameters. - Запустіть програму із параметром -h, щоб прочитати про параметри командного рядка. + + The access to the remote content was denied (401) + Відмовлено у доступі до віддалених даних (401) - - Bad command line - Поганий командний рядок + + The operation requested on the remote content is not permitted + Операція щодо віддаленого вмісту не дозволена - - Bad command line: - Хибний командний рядок: + + The remote content was not found at the server (404) + Віддалені дані не знайдено на сервері (404) - - Legal Notice - Правова примітка + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Віддалений сервер потребує автентифікації, щоб надати вміст, але не прийняв наданих автентифікаційних даних - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - + + The Network Access API cannot honor the request because the protocol is not known + Не вдалось задовольнити запит: невідомий протокол - - No further notices will be issued. - + + The requested operation is invalid for this protocol + Операція недопустима для цього протоколу - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - qBittorrent — це програма для роздачі файлів. Коли ви запускаєте торент, його дані будуть доступні іншим через вивантаження. Всі дані, які ви роздаєте, на вашій відповідальності. - -Ця замітка більше не з'являтиметься. + + An unknown network-related error was detected + Виявлено невідому помилку, пов'язану з мережею - - Press %1 key to accept and continue... - Натисніть %1, щоб погодитись і продовжити... + + An unknown proxy-related error was detected + Виявлено невідому помилку, пов'язану з проксі - - Legal notice - Правова примітка + + An unknown error related to the remote content was detected + Виявлено невідому помилку, пов'язану з віддаленим вмістом - - Cancel - Скасувати + + A breakdown in protocol was detected + Виявлено поломку в протоколі - - I Agree - Я погоджуюсь + + Unknown error + Невідома помилка - - + + Upgrade Оновлення - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] Ви оновили програму зі старої версії, яка по-іншому зберігала дані. Ви повинні перейти на нову систему. Після цього ви не зможете повернутись до версії, старішої ніж v3.3.0. Продовжити? [т/н] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. Ви оновили програму зі старої версії, яка по-іншому зберігала дані. Ви повинні перейти на нову систему. Після цього ви не зможете повернутись до версії, старішої ніж v3.3.0. - + Couldn't migrate torrent with hash: %1 - Не вдалося адаптувати торент з гешем: %1 + Не вдалося адаптувати торрент з хешом: %1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 - Не вдалося адаптувати торент. Неправильна назва файла швидкого відновлення: %1 + Не вдалося адаптувати торрент. Неправильна назва файла швидкого відновлення: %1 - - Detected unclean program exit. Using fallback file to restore settings: %1 - + + Detected unclean program exit. Using fallback file to restore settings. + Виявлено аварійний вихід програми. Використовується резервний файл для відновлення налаштувань. - + An access error occurred while trying to write the configuration file. Виникла помилка доступу при спробі запису файла конфігурації. - + A format error occurred while trying to write the configuration file. Виникла помилка формату при спробі запису файла конфігурації. - - - An unknown error occurred while trying to write the configuration file. - - - RSS::AutoDownloader + RSS - - - Invalid data format. - + + Search + Пошук - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - + + New subscription + Нова підписка - - Invalid data format - + + + + Mark items read + Позначити як прочитане - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - - - - - Couldn't load RSS AutoDownloader rules. Reason: %1 - - - - - RSS::Feed - - - Failed to download RSS feed at '%1'. Reason: %2 - - - - - RSS feed at '%1' updated. Added %2 new articles. - - - - - Failed to parse RSS feed at '%1'. Reason: %2 - - - - - Couldn't read RSS Session data from %1. Error: %2 - - - - - Couldn't parse RSS Session data. Error: %1 - - - - - Couldn't load RSS Session data. Invalid data format. - - - - - Couldn't load RSS article '%1#%2'. Invalid data format. - - - - - RSS::Private::Parser - - - Invalid RSS feed. - Некоректна RSS подача. - - - - %1 (line: %2, column: %3, offset: %4). - - - - - RSS::Session - - - RSS feed with given URL already exists: %1. - RSS подача за даним URL вже присутня: %1. - - - - Cannot move root folder. - Неможливо перемістити кореневу теку - - - - - Item doesn't exist: %1. - Елемент не існує: %1. - - - - Cannot delete root folder. - Неможливо видалити кореневу теку. - - - - Incorrect RSS Item path: %1. - - - - - RSS item with given path already exists: %1. - Запис RSS за даним шляхом вже присутній: %1. - - - - Parent folder doesn't exist: %1. - Батьківська тека не існує: %1. - - - - RSSWidget - - - Search - Пошук - - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - - - - - New subscription - Нова підписка - - - - - - Mark items read - Позначити як прочитане - - - - Refresh RSS streams - Оновити подачі RSS - - - + Update all Оновити всі - + RSS Downloader... Завантажувач RSS... - + + Settings... + Налаштування... + + + Torrents: (double-click to download) - Торенти: (клацніть двічі, щоб завантажити) + Торренти: (двічі клацніть щоб завантажити) - - + + Delete Видалити - + Rename... Перейменувати... - + Rename Перейменувати - - + + Update Оновити - + New subscription... Нова підписка... - - + + Update all feeds Оновити всі подачі - + Download torrent - Завантажити торент + Завантажити торрент - + Open news URL Відкрити URL новини - + Copy feed URL Копіювати URL подачі - + New folder... Нова тека... - + + Refresh RSS streams + Оновити подачі RSS + + + + RSSImp + + + Stream URL: + URL подачі: + + + + Please type a RSS stream URL + Будь ласка, введіть URL подачі RSS + + + + This RSS feed is already in the list. + Ця подача RSS вже є у списку. + + + Please choose a folder name Будь ласка, виберіть назву теки - + Folder name: Назва теки: - + New folder Нова тека - - Please type a RSS feed URL - Будь-ласка, введіть URL подачі RSS - - - - Feed URL: - URL подачі: - - - + Deletion confirmation Підтвердження видалення - + Are you sure you want to delete the selected RSS feeds? Ви впевнені, що хочете видалити вибрані RSS-подачі? - + Please choose a new name for this RSS feed Будь ласка, виберіть нову назву для цієї RSS-подачі - + New feed name: Нова назва подачі: - - Rename failed - Перейменування не вдалося + + Name already in use + Назва вже використовується + + + + This name is already used by another item, please choose another one. + Ця назва вже використовується. Будь ласка, виберіть іншу. - + Date: Дата: - + Author: Автор: + + + Unread + Непрочитані + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + Автоматичне завантаження '%1' із RSS-подачі '%2' не вдалося, тому що вона не містить торрент або magnet-посилання... + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + Автоматично завантажується торрент '%1' з RSS-подачі '%2'... + + + + Rss::Private::Parser + + + Invalid RSS feed. + Некоректна RSS подача. + + + + RssSettingsDlg + + + RSS Reader Settings + Налаштування читача RSS + + + + RSS feeds refresh interval: + Інтервал оновлення RSS-подач: + + + + min + хв + + + + Maximum number of articles per feed: + Максимальна кількість новин на подачу: + ScanFoldersDelegate - + Select save location Виберіть місце збереження @@ -7445,274 +6699,268 @@ ScanFoldersModel - + Monitored Folder Тека стеження - + Override Save Location Перевизначити місце збереження - + Monitored folder Тека стеження - + Default save location Місце збереження за замовчуванням - + Browse... Відкрити... - SearchJobWidget + SearchEngine - - Form - Форма + + Unknown search engine plugin file format. + Новий URL пошукового додатка - - Results(xxx) - Результати(xxx) + + A more recent version of this plugin is already installed. + Новіша версія цього пошукового додатка вже встановлена. - - Search in: - Шукати у: + + + Plugin is not supported. + Додаток не підтримується. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - <html><head/><body><p>Деякі пошуковики шукають і в описі торенту, і в назві торент-файлу. Цей режим визначає, чи будуть такі результати показані у списку нижче.</p><p><span style=" font-weight:600;">Всюди </span>вимикає фільтрацію і показує все, що повертають пошуковики.</p><p><span style=" font-weight:600;">Лише назви торентів</span> показує лише торенти, назви яких збігаються з пошуковим запитом.</p></body></html> + + Update server is temporarily unavailable. %1 + Сервер оновлень тимчасово недоступний. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - <html><head/><body><p>Налаштувати найменшу та найбільшу дозволену кількість сидерів</p></body></html> + + + Failed to download the plugin file. %1 + Не вдалося завантажити файл додатка. %1 - - Seeds: - Сиди: + + An incorrect update info received. + Отримана неправильна інформація про оновлення. - - <html><head/><body><p>Minimal number of seeds</p></body></html> - <html><head/><body><p>Мінімальна кількість сидів</p></body></html> + + All categories + Всі категорії - - - to - до + + Movies + Фільми - - <html><head/><body><p>Maximal number of seeds</p></body></html> - <html><head/><body><p>Максимальна кількість сидів</p></body></html> + + TV shows + Телешоу - - - - + + Music + Музика - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - <html><head/><body><p>Встановити мінімальний та максимальний дозволений розмір торенту</p></body></html> + + Games + Ігри - - Size: - Розмір: + + Anime + Аніме - - <html><head/><body><p>Minimal torrent size</p></body></html> - <html><head/><body><p>Мінімальний розмір торенту</p></body></html> + + Software + Програми - - <html><head/><body><p>Maximal torrent size</p></body></html> - <html><head/><body><p>Максимальний розмір торенту</p></body></html> + + Pictures + Зображення + + + + Books + Книги + + + + SearchListDelegate + + + + Unknown + Невідомо + + + SearchTab - + Name i.e: file name Назва - + Size i.e: file size Розмір - + Seeders i.e: Number of full sources - Сидери + Сідери - + Leechers i.e: Number of partial sources - Лічерів + Лічери - + Search engine Пошуковик - - Filter search results... - Результати фільтрових пошуків... - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - Результати (показано <i>%1</i> з <i>%2</i>): + Результати (показано <i>%1</i> із <i>%2</i>): - + Torrent names only - Лише назви торентів + Лише назви торрентів - + Everywhere Всюди - - Use regular expressions - Використовувати звичайні вирази - - - + Searching... Пошук... - + Search has finished Пошук закінчено - + Search aborted Пошук перервано - + An error occurred during search... Під час пошуку сталася помилка... - + Search returned no results Пошук не дав результів - + Column visibility - Видимість стовпців - - - - SearchPluginManager - - - Unknown search engine plugin file format. - Новий URL пошукового додатку - - - - A more recent version of this plugin is already installed. - Новіша версія цього пошукового додатку вже встановлена. + Показані колонки - - - Plugin is not supported. - Додаток не підтримується. + + Form + Форма - - All categories - Всі категорії + + Results(xxx) + Результати(xxx) - - Movies - Кіна + + Search in: + Шукати у: - - TV shows - Серіали + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>Деякі пошуковики шукають і в описі торрента, і в назві торрент-файла. Цей режим визначає, чи будуть такі результати показані у списку нижче.</p><p><span style=" font-weight:600;">Всюди </span>вимикає фільтрацію і показує все, що повертають пошуковики.</p><p><span style=" font-weight:600;">Лише назви торрентів</span> показує лише торренти, назви яких збігаються з пошуковим запитом.</p></body></html> - - Music - Музика + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>Встановити мінімальну та максимальну дозволену кількість сідів</p></body></html> - - Games - Ігри + + Seeds: + Сіди: - - Anime - Аніме + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>Мінімальна кількість сідів</p></body></html> - - Software - Програми + + + to + - - - Pictures - Зображення + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>Максимальна кількість сідів</p></body></html> - - - Books - Книжки + + + + + - - Update server is temporarily unavailable. %1 - Сервер оновлень тимчасово недоступний. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>Встановити мінімальний та максимальний дозволений розмір торрента</p></body></html> - - - Failed to download the plugin file. %1 - Не вдалося завантажити файл додатку. %1 + + Size: + Розмір: - - An incorrect update info received. - Отримана неправильна інформація про оновлення. + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Мінімальний розмір торрента</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Максимальний розмір торрента</p></body></html> @@ -7720,197 +6968,185 @@ - - - - + + + Search Пошук - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - - + Download Завантажити - + Go to description page Перейти до сторінки опису - + Copy description page URL Скопіювати URL сторінки опису - + Search plugins... Пошукові додатки... - + A phrase to search for. Пошукова фраза. - + Spaces in a search term may be protected by double quotes. Пробіли в пошуковій фразі можна захистити прямими подвійними лапками - + Example: Search phrase example Наприклад: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>: шукати <b>foo</b> та <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>: шукати <b>foo bar</b> - + All plugins Всі додатки - + Only enabled Лише увімкнені - + Select... Вибрати... - - - + + + Search Engine Пошуковик - + Please install Python to use the Search Engine. Будь ласка, встановіть Python, щоб використовувати Пошуковик - + Empty search pattern Порожній шаблон пошуку - + Please type a search pattern first Будь ласка, спочатку введіть шаблон пошуку - + Stop Зупинити - + Search has finished Пошук закінчено - + Search has failed Пошук невдалий - ShutdownConfirmDialog + ShutdownConfirmDlg - - Don't show again - Більше не показувати - - - + qBittorrent will now exit. Зараз qBittorrent завершиться. - + E&xit Now В&ийти зараз - + Exit confirmation Підтвердження виходу - + The computer is going to shutdown. Зараз комп'ютер вимкнеться. - + &Shutdown Now &Вимкнути комп'ютер зараз - - Shutdown confirmation - Підтвердження вимкнення - - - + The computer is going to enter suspend mode. Зараз комп'ютер призупиниться - + &Suspend Now При&зупинити зараз - + Suspend confirmation - Підтвердження призупинення + Підтвердження призупинки - + The computer is going to enter hibernation mode. - Зараз комп'ютер перейде до режиму сна. + Зараз комп'ютер перейде у режим сну. - + &Hibernate Now При&спати зараз - + Hibernate confirmation Підтвердження присипання - + You can cancel the action within %1 seconds. Дію можна буде скасувати через %1 секунд. + + + Shutdown confirmation + Підтвердження вимкнення + SpeedLimitDialog - + KiB/s КіБ/с @@ -7918,52 +7154,52 @@ SpeedPlotView - + Total Upload Вивантаження: загалом - + Total Download Завантаження: загалом - + Payload Upload Вивантаження: власне дані - + Payload Download Завантаження: власне дані - + Overhead Upload Вивантаження: протокол - + Overhead Download Завантаження: протокол - + DHT Upload Вивантаження: DHT - + DHT Download Завантаження: DHT - + Tracker Upload Вивантаження: трекери - + Tracker Download Завантаження: трекери @@ -7971,95 +7207,87 @@ SpeedWidget - + Period: Період: - + 1 Minute 1 хвилина - + 5 Minutes 5 хвилин - + 30 Minutes 30 хвилин - + 6 Hours 6 годин - + Select Graphs Вибрати графіки - + Total Upload Вивантаження: загалом - + Total Download Завантаження: загалом - + Payload Upload Вивантаження: власне дані - + Payload Download Завантаження: власне дані - + Overhead Upload Вивантаження: протокол - + Overhead Download Завантаження: протокол - + DHT Upload Вивантаження: DHT - + DHT Download Завантаження: DHT - + Tracker Upload Вивантаження: трекери - + Tracker Download Завантаження: трекери - StacktraceDialog - - - Crash info - Інформація про крах - - - StatsDialog @@ -8072,49 +7300,49 @@ Статистика користувача - - Cache statistics - Статистика кешу + + Total peer connections: + Загальна кількість підключень пірів: - - Read cache hits: - Попадань в кеші зчитування: + + Global ratio: + Глобальний коефіцієнт: - - Average time in queue: - Середній час в черзі: + + Alltime download: + Завантажено за весь час: - - Connected peers: - Під'єднані піри: + + Alltime upload: + Вивантажено за весь час: - - All-time share ratio: - Коєфіцієнт відданого за весь час: + + Total waste (this session): + Загалом змарновано (за цей сеанс): - - All-time download: - Коєфіцієнт завантаженого за весь час: + + Cache statistics + Статистика кешу - - Session waste: - За сесію змарновано: + + Read cache hits: + Попадань в кеші зчитування: - - All-time upload: - Відвантажено за весь час: + + Average time in queue: + Середній час в черзі: - Total buffer size: - Загальний розмір буферу: + Total buffers size: + Загальний розмір буферів: @@ -8142,7 +7370,12 @@ Загальний розмір в черзі: - + + OK + Гаразд + + + %1 ms 18 milliseconds %1 мс @@ -8151,27 +7384,32 @@ StatusBar - + Connection status: Статус з'єднання: - + No direct connections. This may indicate network configuration problems. Немає прямих з'єднань. Це може означати, що є проблеми з налаштуванням мережі. - + DHT: %1 nodes DHT: %1 вузлів - - qBittorrent needs to be restarted! - Потрібно перезапустити qBittorrent! + + qBittorrent needs to be restarted + Потрібно перезапустити qBittorrent + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent щойно було оновлено, і тепер потрібно його перезапустити, щоб застосувати зміни. @@ -8190,982 +7428,716 @@ В мережі - + Click to switch to alternative speed limits Клацніть, щоб перемкнутись на альтернативні обмеження швидкості - + Click to switch to regular speed limits Клацніть, щоб повернутись до звичайних обмежень швидкості - + + Manual change of rate limits mode. The scheduler is disabled. + Режим ручної зміни обмежень. Розклад вимкнено. + + + Global Download Speed Limit Глобальний ліміт завантаження - + Global Upload Speed Limit Глобальний ліміт вивантаження - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter Всі (0) - + Downloading (0) Завантажуються (0) - + Seeding (0) - Сидують (0) + Роздаються (0) - + Completed (0) Завершені (0) - + Resumed (0) Відновлені (0) - + Paused (0) Призупинені (0) - + Active (0) - Працюють (0) + Активні (0) - + Inactive (0) - Не працюють (0) + Неактивні (0) - + Errored (0) З помилкою (0) - + All (%1) Всі (%1) - + Downloading (%1) Завантажуються (%1) - + Seeding (%1) - Сидують (%1) + Роздаються (%1) - + Completed (%1) Завершені (%1) - + Paused (%1) Призупинені (%1) - + Resumed (%1) Відновлені (%1) - + Active (%1) - Працюють (%1) + Активні (%1) - + Inactive (%1) - Не працюють (%1) + Неактивні (%1) - + Errored (%1) З помилкою (%1) - TagFilterModel + TorrentContentModel - - Tags - Мітки + + Name + Назва - - All - Всі + + Size + Розмір - - Untagged - Без мітки + + Progress + Прогрес - - - TagFilterWidget - - Add tag... - Додати мітку... + + Download Priority + Пріоритет завантаження - - Remove tag - Вилучити мітку + + Remaining + Залишилось + + + TorrentCreatorDlg - - Remove unused tags - Вилучити невикористовувані мітки + + Select a folder to add to the torrent + Виберіть теку для додавання в торрент - - Resume torrents - Продовжити торенти + + Select a file to add to the torrent + Виберіть файл для додавання в торрент - - Pause torrents - Призупинити торенти + + No input path set + Не задано вхідний шлях - - Delete torrents - Видалити торенти + + Please type an input path first + Будь ласка, спочатку введіть вхідний шлях - - New Tag - Нова мітка + + Select destination torrent file + Виберіть цільовий torrent-файл - - Tag: - Мітка: + + Torrent Files (*.torrent) + Torrent-файли (*.torrent) - - Invalid tag name - Некоректна назва мітки + + Torrent was created successfully: %1 + %1 is the path of the torrent + Торрент успішно створено: %1 - - Tag name '%1' is invalid - Назва мітки '%1' некоректна + + + + Torrent creation + Створення торрента - - Tag exists - Мітка існує + + Torrent creation was unsuccessful, reason: %1 + Створення торрента було невдалим, причина: %1 - - Tag name already exists. - Мітка під такою назвою вже існує. + + Created torrent file is invalid. It won't be added to download list. + Створений торрент-файл некоректний. Його не буде додано до списку завантажень. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Налаштування торентових категорій + + Name + i.e: torrent name + Назва - - Name: - Назва: + + Size + i.e: torrent size + Розмір - - Save path: - Шлях збереження: + + Done + % Done + Зроблено - - Choose save path - Оберіть шлях збереження + + Status + Torrent status (e.g. downloading, seeding, paused) + Статус - - New Category - Нова категорія + + Seeds + i.e. full sources (often untranslated) + Сіди - - Invalid category name - Некоректна назва категорії + + Peers + i.e. partial sources (often untranslated) + Піри - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - + + Down Speed + i.e: Download speed + Шв. завантаження - - Category creation error - Помилка створення категорії + + Up Speed + i.e: Upload speed + Шв. вивантаження - - Category with the given name already exists. -Please choose a different name and try again. - + + Ratio + Share ratio + Коефіцієнт - - - TorrentContentModel - - Name - Назва + + ETA + i.e: Estimated Time of Arrival / Time left + Залишилось - - Size - Розмір + + Category + Категорія - - Progress - Прогрес + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Додано - - Download Priority - Пріоритет завантаження + + Completed On + Torrent was completed on 01/01/2010 08:00 + Завершено о - - Remaining - Залишилось + + Tracker + Трекер - - Availability - Доступно + + Down Limit + i.e: Download limit + Ліміт завантаження - - - TorrentCreatorDialog - - Torrent Creator - Торентовий створювач + + Up Limit + i.e: Upload limit + Ліміт вивантаження - - Select file/folder to share - + + Downloaded + Amount of data downloaded (e.g. in MB) + Завантажено - - Path: - + + Uploaded + Amount of data uploaded (e.g. in MB) + Вивантажено - - [Drag and drop area] - + + Session Download + Amount of data downloaded since program open (e.g. in MB) + Завантажено за сеанс - - - Select file - + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + Вивантажено за сеанс - - - Select folder - + + Remaining + Amount of data left to download (e.g. in MB) + Залишилось - - Settings - + + Time Active + Time (duration) the torrent is active (not paused) + Активний протягом - - Piece size: - + + Save path + Torrent save path + Шлях збереження - - Auto - + + Completed + Amount of data completed (e.g. in MB) + Завершено - - 16 KiB - 16 КіБ + + Ratio Limit + Upload share ratio limit + Обмеження коефіцієнта - - 32 KiB - 32 КіБ + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + Востаннє завершений - - 64 KiB - 64 КіБ + + Last Activity + Time passed since a chunk was downloaded/uploaded + Востаннє активний - - 128 KiB - 128 КіБ + + Total Size + i.e. Size including unwanted data + Загальний розмір + + + TrackerFiltersList - - 256 KiB - 256 КіБ + + All (0) + this is for the tracker filter + Всі (0) - - 512 KiB - 512 КіБ + + Trackerless (0) + Без трекерів (0) - - 1 MiB - 1 МіБ + + Error (0) + Помилка (0) - - 2 MiB - 2 МіБ + + Warning (0) + Попередження (0) - - 4 MiB - 4 МіБ + + + Trackerless (%1) + Без трекерів (%1) - - 8 MiB - 8 МіБ + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - 16 MiB - 16 МіБ + + + Error (%1) + Помилка (%1) - - 32 MiB - 32 МіБ + + + Warning (%1) + Попередження (%1) - - Calculate number of pieces: - + + Resume torrents + Продовжити торренти - - Private torrent (Won't distribute on DHT network) - Приватний торент (не буде передаватись через мережу DHT) + + Pause torrents + Призупинити торренти - - Start seeding immediately - Почати сидування негайно + + Delete torrents + Видалити торренти - - Ignore share ratio limits for this torrent - + + + All (%1) + this is for the tracker filter + Всі (%1) + + + TrackerList - - Optimize alignment - + + URL + URL - - Fields - + + Status + Статус - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + + Received - - Web seed URLs: - URL-ланки веб-сидів: + + Seeds + Сіди - - Tracker URLs: - URL трекерів: + + Peers + Піри - - Comments: - Коментарі: + + Downloaded + Завантажено - - Source: - Джерело: + + Message + Повідомлення - - Progress: - Прогрес: + + + Working + Працює - - Create Torrent - Створити торент + + Disabled + Вимкнений - - - - Torrent creation failed - Не вдалося створити торенту + + This torrent is private + Цей торрент приватний - - Reason: Path to file/folder is not readable. - + + Updating... + Оновлюється... - - Select where to save the new torrent - - - - - Torrent Files (*.torrent) - - - - - Reason: %1 - Причина: %1 - - - - Reason: Created torrent is invalid. It won't be added to download list. - Причина: Створений торент-файл є некоректним. Його не буде додано до списку завантажень. - - - - Torrent creator - Торентовий створювач - - - - Torrent created: - Торент створено: - - - - TorrentInfo - - - File size exceeds max limit %1 - - - - - Torrent file read error: %1 - - - - - Torrent file read error: size mismatch - - - - - TorrentsController - - - Not contacted yet - Ще не зв'язувався - - - - Updating... - Оновлюється... - - - - Working - Працює - - - + Not working Не працює - - Error: '%1' is not a valid torrent file. - - - - - - - - Torrent queueing must be enabled - - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - - Cannot make save path - - - - - Cannot write to directory - - - - - WebUI Set location: moving "%1", from "%2" to "%3" - - - - - Incorrect torrent name - - - - - - Incorrect category name - - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - Всі (0) - - - - Trackerless (0) - Без трекерів (0) - - - - Error (0) - Помилка (0) - - - - Warning (0) - Попередження (0) - - - - - Trackerless (%1) - Без трекерів (%1) - - - - - Error (%1) - Помилка (%1) - - - - - Warning (%1) - Попередження (%1) - - - - Resume torrents - Продовжити торенти - - - - Pause torrents - Призупинити торенти - - - - Delete torrents - Видалити торенти - - - - - All (%1) - this is for the tracker filter - Всі (%1) - - - - TrackerListWidget - - - - Working - Працює - - - - Disabled - Вимкнено - - - - This torrent is private - - - - - Updating... - Оновлюється... - - - - Not working - Не працює - - - + Not contacted yet - Ще не зв'язувався + Ще не зв'язувався - - - - - - - N/A - + + Tracker URL: + URL трекера: - + Tracker editing - - - - - Tracker URL: - + Редагування трекера - - + + Tracker editing failed - + Не вдалось відредагувати трекер - + The tracker URL entered is invalid. - + Введено некоректний URL трекера. - + The tracker URL already exists. - + Цей URL трекера вже присутній. - + Add a new tracker... - + Додати новий трекер... - - Remove tracker - - - - + Copy tracker URL - + Копіювати адресу трекера - + Edit selected tracker URL - + Редагувати вибраний URL трекера - + Force reannounce to selected trackers - + Примусово отримати пірів із вибраних трекерів - + Force reannounce to all trackers - - - - - URL - - - - - Status - Статус - - - - Received - - - - - Seeds - Сиди - - - - Peers - Піри - - - - Downloaded - Завантажено - - - - Message - + Примусово отримати пірів з усіх трекерів - - Column visibility - + + Remove tracker + Видалити трекер - TrackerLoginDialog - - - - Tracker authentication - - - - - Tracker: - - + TrackersAdditionDlg - - Login - Логін - - - - Username: - Ім'я користувача: - - - - Password: - Пароль: + + Trackers addition dialog + Додавання трекера - - Log in - + + List of trackers to add (one per line): + Список трекерів, які ви хочете додати (один на рядок): - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + URL µTorrent-сумісного списку: - - List of trackers to add (one per line): - + + I/O Error + Помилка вводу/виводу - - µTorrent compatible list URL: - + + Error while trying to open the downloaded file. + Не вдалося відкрити завантажений файл. - + No change - + Без змін - + No additional trackers were found. - + Не знайдено додаткових трекерів. - + Download error - Помилка завантаження + Помилка завантаження - + The trackers list could not be downloaded, reason: %1 - + Не вдалося завантажити список трекерів, причина: %1 TransferListDelegate - + Downloading Завантажується - + Downloading metadata used when loading a magnet link Завантажуються метадані - + Allocating qBittorrent is allocating the files on disk Виділяється місце - + Paused Зупинено - + Queued i.e. torrent is queued В черзі - + Seeding Torrent is complete and in upload-only mode Роздається - + Stalled Torrent is waiting for download to begin Заглох - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [П] Завантажується - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [П] Роздається - + Checking Torrent local data is being checked Перевіряється - + Queued for checking i.e. torrent is queued for hash checking В черзі на перевірку - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. Перевірка даних відновлення - + Completed Завершені - - Moving - Torrent local data are being moved/relocated - - - - + Missing Files Відсутні файли - + Errored torrent status, the torrent has an error З помилкою - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (роздавався %2) - + %1 ago e.g.: 1h 20m ago %1 тому @@ -9174,579 +8146,593 @@ TransferListFiltersWidget - + Status Статус - + Categories Категорії - - - Tags - Мітки - - - - Trackers - Трекери - - - - TransferListModel - - - Name - i.e: torrent name - Назва - - - - Size - i.e: torrent size - Розмір - - - - Done - % Done - - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Статус - - - - Seeds - i.e. full sources (often untranslated) - Сиди - - - - Peers - i.e. partial sources (often untranslated) - Піри - - - - Down Speed - i.e: Download speed - Шв. завантаження - - - - Up Speed - i.e: Upload speed - Шв. вивантаження - - - - Ratio - Share ratio - - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - Категорія - - - - Tags - Мітки - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - Завантажено - - - - Uploaded - Amount of data uploaded (e.g. in MB) - Вивантажено - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - Залишилось - - - - Time Active - Time (duration) the torrent is active (not paused) - - - - - Save path - Torrent save path - - - - - Completed - Amount of data completed (e.g. in MB) - Завершені - - - - Ratio Limit - Upload share ratio limit - - - - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - - - - - Last Activity - Time passed since a chunk was downloaded/uploaded - - - - - Total Size - i.e. Size including unwanted data - - + + + Trackers + Трекери + TransferListWidget - + Column visibility Показані колонки - + Choose save path Виберіть шлях збереження - + Torrent Download Speed Limiting - Обмеження швидкості завантаження торенту + Обмеження швидкості завантаження торрента - + Torrent Upload Speed Limiting - Обмеження швидкості вивантаження торенту + Обмеження швидкості вивантаження торрента - + Recheck confirmation Підтвердження повторної перевірки - + Are you sure you want to recheck the selected torrent(s)? - Чи ви певні, що хочете повторно перевірити вибрані торент(и)? + Ви впевнені, що хочете повторно перевірити вибрані торрент(и)? - + Rename Перейменувати - + New name: Нова назва: - + Resume Resume/start the torrent Продовжити - + Force Resume Force Resume/start the torrent Примусово продовжити - + Pause Pause the torrent Призупинити - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - Зміна розташування: "%1" переміщується з "%2" у "%3" - - - - Add Tags - Додати мітки - - - - Remove All Tags - Вилучити всі мітки - - - - Remove all tags from selected torrents? - Вилучити всі мітки з обраних торентів? + + New Category + Нова категорія - - Comma-separated tags: - Мітки, розділені комами: + + Category: + Категорія: - - Invalid tag - Некоректна мітка + + Invalid category name + Некоректна назва категорії - - Tag name: '%1' is invalid - Назва мітки: '%1' некоректна + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + Назва категорії не повинна містити '\'. +Назва категорії не повинна починатись/закінчуватись на '/'. +Назва категорії не повинна містити послідовність '//'. - + Delete Delete the torrent Видалити - + Preview file... Переглянути файл... - + Limit share ratio... Обмежити коефіцієнт роздачі... - + Limit upload rate... Обмежити швидкість вивантаження... - + Limit download rate... Обмежити швидкість завантаження... - + Open destination folder Відкрити теку призначення - + Move up i.e. move up in the queue Посунути вперед - + Move down i.e. Move down in the queue Посунути назад - + Move to top i.e. Move to top of the queue Перемістити на початок - + Move to bottom i.e. Move to bottom of the queue Перемістити в кінець - + Set location... - Змінити розташування... - - - - Force reannounce - + Встановити місце... - + Copy name Копіювати назву - - Copy hash - Копіювати геш - - - + Download first and last pieces first Спочатку завантажувати першу і останню частину - + Automatic Torrent Management - Автоматичне керування торентами + Автоматичне керування торрентами - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - Автоматичний режим означає, що різні властивості торенту (наприклад, шлях збереження) буде визначено через його категорію + Автоматичний режим означає, що різні властивості торрента (наприклад, шлях збереження) буде визначено через його категорію - + Category Категорія - + New... New category... Нова... - + Reset Reset category Забрати - - Tags - Мітки - - - - Add... - Add / assign multiple tags... - Додати... - - - - Remove All - Remove all tags - Вилучити всі - - - + Priority Пріоритет - + Force recheck Примусова перевірка - + Copy magnet link Копіювати magnet-посилання - + Super seeding mode - Режим супер-сидування + Режим супер-сідування - + Rename... Перейменувати... - + Download in sequential order Завантажувати послідовно - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - Обмеження коєфіцієнту завантаження/вивантаження торента + Обмеження коефіцієнта вивантаження/завантаження торрента - - Use global share limit - + + Use global ratio limit + Використовувати глобальні обмеження - - - + + + buttonGroup - + Група кнопок - - Set no share limit - + + Set no ratio limit + Не використовувати обмеження коефіцієнта - - Set share limit to - + + Set ratio limit to + Встановити обмеження коефіцієнта в + + + WebApplication - - ratio - + + Incorrect category name + Некоректна назва категорії + + + WebUI - - minutes - + + The Web UI is listening on port %1 + Веб-інтерфейс очікує з'єднань (порт %1) - - No share limit method selected - + + Web UI Error - Unable to bind Web UI to port %1 + Помилка Веб-інтерфейсу - Не вдалось приєднати Веб-інтерфейс до порту %1 + + + about - - Please select a limit method first - + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + Потужний клієнт BitTorrent, запрограмований на C++, на основі бібліотек Qt та libtorrent-rasterbar. + + + + Copyright %1 2006-2016 The qBittorrent project + Авторське право %1 2006-2016 Проект qBittorrent + + + + Home Page: + Домашня сторінка: + + + + Forum: + Форум: + + + + Bug Tracker: + Трекер помилок: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - + + Add Peers + Додати пірів - - Python not detected - + + List of peers to add (one per line): + Список пірів, яких ви хочете додати (один на рядок): + + + + Format: IPv4:port / [IPv6]:port + Формат: IPv4:порт / [IPv6]:порт - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - + + + Tracker authentication + Автентифікація на трекері - - Symlinks inside alternative UI folder are forbidden. - + + Tracker: + Трекер: - - Exceeded the maximum allowed file size (%1)! - + + Login + Логін - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - + + Username: + Ім'я користувача: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - + + Password: + Пароль: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - + + Log in + Увійти - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - + + Cancel + Скасувати - WebUI + confirmDeletionDlg - - Web UI: HTTPS setup successful - + + Deletion confirmation - qBittorrent + Підтвердження видалення — qBittorrent - - Web UI: HTTPS setup failed, fallback to HTTP - + + Remember choice + Запам'ятати вибір - - Web UI: Now listening on IP: %1, port: %2 - + + Also delete the files on the hard disk + Також видалити файли на жорсткому диску + + + confirmShutdownDlg - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - + + Don't show again + Більше не показувати + + + + createTorrentDialog + + + Cancel + Скасувати + + + + Torrent Creation Tool + Інструмент створення торрента + + + + Torrent file creation + Створення torrent-файла + + + + Add file + Додати файл + + + + Add folder + Додати теку + + + + File or folder to add to the torrent: + Файл або тека для додавання в торрент: + + + + Tracker URLs: + URL трекерів: + + + + Web seeds urls: + URL Веб-сідів: + + + + Comment: + Коментар: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Можна розділити групи трекерів пустими рядками. + + + + Piece size: + Розмір частини: + + + + 16 KiB + 16 КіБ + + + + 32 KiB + 32 КіБ + + + + 64 KiB + 64 КіБ + + + + 128 KiB + 128 КіБ + + + + 256 KiB + 256 КіБ + + + + 512 KiB + 512 КіБ + + + + 1 MiB + 1 МіБ + + + + 2 MiB + 2 МіБ + + + + 4 MiB + 4 МіБ + + + + 8 MiB + 8 МіБ + + + + 16 MiB + 16 МіБ + + + + Auto + Автоматично + + + + Private (won't be distributed on DHT network if enabled) + Приватно (не буде передаватись через мережу DHT, якщо увімкнено) + + + + Start seeding after creation + Почати роздачу одразу після створення + + + + Ignore share ratio limits for this torrent + Ігнорувати обмеження коефіцієнта роздачі для цього торрента + + + + Create and save... + Створити і зберегти... + + + + Progress: + Прогрес: + + + + downloadFromURL + + + Add torrent links + Додати посилання на торрент + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Одне на рядок (підтримуються HTTP- і magnet-посилання та інформаційні хеші) + + + + Download + Завантажити + + + + Cancel + Скасувати + + + + Download from urls + Завантажити з адрес + + + + No URL entered + Не введено URL + + + + Please type at least one URL. + Будь ласка, введіть хоча б один URL. + + + + errorDialog + + + Crash info + Інформація про крах fsutils - + + + + + Downloads Завантаження @@ -9754,100 +8740,140 @@ misc - + B bytes Б - + KiB kibibytes (1024 bytes) КіБ - + MiB mebibytes (1024 kibibytes) МіБ - + GiB gibibytes (1024 mibibytes) ГіБ - + TiB tebibytes (1024 gibibytes) ТіБ - + PiB pebibytes (1024 tebibytes) ПіБ - + EiB exbibytes (1024 pebibytes) ЕіБ - + + Python not detected + Python не виявлено + + + + Python version: %1 + Версія Python: %1 + + + /s per second - + %1h %2m e.g: 3hours 5minutes %1г %2хв - + %1d %2h e.g: 2days 10hours %1д %2г - + Unknown Unknown (size) Невідомо - + qBittorrent will shutdown the computer now because all downloads are complete. Зараз qBittorrent вимкне комп'ютер, бо всі завантаження завершено. - + < 1m < 1 minute < 1хв - + %1m e.g: 10minutes %1хв + + + Working + Працює + + + + Updating... + Оновлюється... + + + + Not working + Не працює + + + + Not contacted yet + Ще не зв'язувався + preview - + Preview selection Вибір перегляду - + The following files support previewing, please select one of them: Наступні файли підтримують перегляд, виберіть один з них: + + + Preview + Перегляд + + + + Cancel + Скасувати + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_uz@Latn.ts qbittorrent-3.3.15/src/lang/qbittorrent_uz@Latn.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_uz@Latn.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_uz@Latn.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - + qBittorrent haqida - + About - + Dastur haqida - + Author - + Muallif: - - Current maintainer + + + Nationality: - - Greece - Gretsiya - - - - - Nationality: - + + + Name: + Ism: - - + + E-mail: - + E-pochta: - - - Name: - + + Greece + Gretsiya - - Original author - + + Current maintainer + Joriy tarjimon - - France - Fransiya + + Original author + Original muallifi - + Special Thanks - + Translators - - License - - - - + Libraries - + Kutubxonalar - + qBittorrent was built with the following libraries: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - - - - - Forum: - + + France + Fransiya - - Bug Tracker: - + + License + Litsenziya @@ -115,57 +90,67 @@ - + + Browse... + Belgila... + + + + Set as default save path + Odatiy saqlash yo‘lagi qilib qo‘yish + + + Never show again Boshqa ko‘rsatilmasin - + Torrent settings Torrent sozlamalari - + Set as default category - + Category: - + Start torrent Torrentni boshlash - + Torrent information - + Skip hash check Shifr tekshirilmasin - + Size: Hajmi: - + Hash: - + Comment: Sharh: - + Date: Sana: @@ -190,117 +175,89 @@ - - Remember last used save path - - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - + Do not delete .torrent file - - Create subfolder - - - - - Download in sequential order - - - - - Download first and last pieces first - - - - + Normal O‘rta - + High Yuqori - + Maximum Maksimal - + Do not download Yuklab olinmasin - - - + + + I/O Error I/O xatosi - + Invalid torrent Torrent fayli yaroqsiz - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - + + + + + Already in download list + Yuklanishlar ro‘yxatida oldindan mavjud - + Not Available This comment is unavailable Mavjud emas - + Not Available This date is unavailable Mavjud emas - + Not available Mavjud emas - + Invalid magnet link Magnet havolasi yaroqsiz - + The torrent file '%1' does not exist. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -308,115 +265,128 @@ - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + + + + + Torrent is already in download list. Trackers were merged. + Torrent yuklanishlar ro‘yxatida bor. Trekerlar birlashtirildi. + + + + + Cannot add torrent + Torrentni qo‘shib bo‘lmaydi + + + + Cannot add this torrent. Perhaps it is already in adding state. + Bu torrentni qo‘shib bo‘lmaydi. U allaqachon qo‘shilayotgan bo‘lishi mumkin. + + + This magnet link was not recognized Bu magnet havolasi noma’lum formatda - + + Magnet link is already in download list. Trackers were merged. + Magnet havolasi yuklanishlar ro‘yxatida mavjud. Trekerlar birlashtirildi. + + + + Cannot add this torrent. Perhaps it is already in adding. + Bu torrentni qo‘shib bo‘lmaydi. U allaqachon qo‘shilayotgan bo‘lishi mumkin. + + + Magnet link Magnet havola - + Retrieving metadata... Tavsif ma’lumotlari olinmoqda... - + Not Available This size is unavailable. Mavjud emas - + Free space on disk: %1 - + + Choose save path Saqlash yo‘lagini tanlang - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - + + Rename the file + Fayl nomini o‘zgartirish - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + + New name: + Yangi nomi: - - Magnet link is already queued for processing. - + + + The file could not be renamed + Fayl nomini o‘zgartirib bo‘lmadi - - New name: - Yangi nomi: + + This file name contains forbidden characters, please choose a different one. + Bu nomda taqiqlangan belgilar bor, boshqa nom kiriting. - - + + This name is already in use in this folder. Please use a different name. Bu nom ushbu jildda oldindan mavjud. Boshqa nom kiriting. - + The folder could not be renamed Jild nomini o‘zgartirib bo‘lmadi - + Rename... Nomini o‘zgartirish... - + Priority Dolzarblik - + Invalid metadata Tavsif ma’lumotlari yaroqsiz - + Parsing metadata... Tavsif ma’lumotlari ochilmoqda... - + Metadata retrieval complete Tavsif ma’lumotlari olindi - + Download Error Yuklab olish xatoligi @@ -424,312 +394,198 @@ AdvancedSettings - + + Disk write cache size + Diskka yozish kesh hajmi + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] Chiqish portlari (Min) [0: o‘chirilgan] - + Outgoing ports (Max) [0: Disabled] Chiqish portlari (Maks) [0: o‘chirilgan] - + Recheck torrents on completion Torrentlar tugallanganidan so‘ng yana bir bor tekshirilsin - + Transfer list refresh interval Transfer ro‘yxatini yangilash oralig‘i - + ms milliseconds ms - + Setting Sozlama - + Value Value set for this setting Qiymat - - - (disabled) - - - - + (auto) (avtomatik) - - min - minutes - - - - + All addresses - + qBittorrent Section - - + + Open documentation - + libtorrent Section - - Asynchronous I/O threads - - - - - Disk cache - - - - + s seconds s - + Disk cache expiry interval Disk keshining saqlanish muddati - + Enable OS cache OT keshi ishga tushirilsin - - Guided read cache - - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - - - - - - KiB - - - - - Send buffer watermark - - - - - Send buffer low watermark - - - - - Send buffer watermark factor - - - - - Prefer TCP - - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address - + + m + minutes + m - + Resolve peer countries (GeoIP) Pir mamlakatlarni tahlillash (GeoIP) - + Resolve peer host names Pir xost nomlarini tahlillash - + Strict super seeding Qat’iy super tarqatish - + Network Interface (requires restart) Tarmoq interfeysi (qayta boshlash lozim) - + Optional IP Address to bind to (requires restart) - + Listen on IPv6 address (requires restart) IPv6 manzilda tinglansin (qayta boshlash lozimt) - + Display notifications - + Display notifications for added torrents - + Download tracker's favicon - - Save path history length - - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - - - - - Round-robin - - - - - Fastest upload - - - - - Anti-leech - - - - - Upload choking algorithm - - - - + Confirm torrent recheck Torrent qayta tekshirilishi tasdiqlansin - - Confirm removal of all tags - - - - - Always announce to all trackers in a tier - + Exchange trackers with other peers + Boshqa pirli almashuv trekerlari - - Always announce to all tiers - + + Always announce to all trackers + Doim barcha trekerlarga e’lon qilinsin - + Any interface i.e. Any network interface Har qanday interfeys - + Save resume data interval How often the fastresume file is saved. Davomlash ma’lumotlarni saqlash oralig‘i - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - - - - + Maximum number of half-open connections [0: Unlimited] Yarim ochiq ulanishlar maksimal soni [0: cheklanmagan] - + IP Address to report to trackers (requires restart) Trekerlarga bildiriladigan IP manzili (qayta boshlash lozim) - + Enable embedded tracker Ichki o‘rnatilgan treker ishga tushirilsin - + Embedded tracker port Ichki o‘rnatilgan treker porti - + Check for software updates Dasturiy ta’minot yangilanishlarini tekshirish - + Use system icon theme Tizimga xos ikon mavzusidan foydalanish @@ -737,120 +593,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 boshlandi - + Torrent: %1, running external program, command: %2 - - Torrent name: %1 - - - - - Torrent size: %1 - - - - - Save path: %1 - - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - - - - - Thank you for using qBittorrent. - - - - - [qBittorrent] '%1' has finished downloading + + Torrent: %1, run external program command too long (length > %2), execution failed. - + Torrent: %1, sending mail notification - + Information Ma’lumot - - To control qBittorrent, access the Web UI at %1 - + + To control qBittorrent, access the Web UI at http://localhost:%1 + qBittorrent dasturini nazorat qilish uchun http://localhost:%1 manzilidagi veb-interfeysiga kiring - + The Web UI administrator user name is: %1 Veb-interfeys administratorining nomi: %1 - + The Web UI administrator password is still the default one: %1 Veb-interfeys administratorining paroli o‘sha-o‘sha: %1 - + This is a security risk, please consider changing your password from program preferences. Bu xavfsizlikka xatar tug‘diradi, parolingizni dastur parametrlarida o‘zgartirganingiz ma’qul. - + Saving torrent progress... Torrent rivoji saqlanmoqda... - - - Portable mode and explicit profile directory options are mutually exclusive - - - - - Portable mode implies relative fastresume - - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Bu joyga saqlash: @@ -860,834 +657,694 @@ RSS yuklab oluvchi - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - + + Enable Automated RSS Downloader + Avtomatik RSS yuklab oluvchi ishga tushirilsin - + Download Rules Yuklab olish qoidalari - + Rule Definition Qoida ta’rifi - + Use Regular Expressions Muntazam ifodalar ishlatish - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - - - - + Must Contain: Tarkibida bu bo‘lishi shart: - + Must Not Contain: Tarkibida bu bo‘lmasligi shart: - + Episode Filter: Qism filtri: - + Assign Category: - + Save to a Different Directory Boshqa jildga saqlash - + Ignore Subsequent Matches for (0 to Disable) ... X days Hosilaviy mosliklar hisobga olinmasin (0: o‘chirib qo‘yish) - + Disabled - + days kun - + Add Paused: Pauzadagini qo‘shish: - + Use global settings Global sozlamalar ishlatish - + Always Har doim - + Never Hech qachon - + Apply Rule to Feeds: Qoidani tasmalarga qo‘llash: - + Matching RSS Articles RSS maqolalari mosligini aniqlash - + &Import... &Import qilish... - + &Export... &Eksport qilish... - + Matches articles based on episode filter. Qism filtriga asoslangan maqolalar mosligini aniqlaydi. - + Example: Misol: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match birinchi faslning 2, 5, 8-15, 30 va undan keyingi qismlariga mos keladi - + Episode filter rules: Qism filtri qoidalari: - + Season number is a mandatory non-zero value Fasl raqamiga nol bo‘lmagan qiymat kiritish shart - + Episode number is a mandatory non-zero value + Qism raqamiga nol bo‘lmagan qiymat kiritish shart + + + Filter must end with semicolon Filtr oxirida nuqta-vergul qo‘yilishi shart - + Three range types for episodes are supported: Qismlar uchun uch xildagi miqyos qo‘llanadi: - + Single number: <b>1x25;</b> matches episode 25 of season one Bitta son: <b>1x25;</b> birinchi faslning 25-qismiga mos keladi - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Normal miqyos <b>1x25-40;</b> birinchi faslning 25-40 qismlariga mos keladi - - Episode number is a mandatory positive value - - - - - Rules - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Cheksiz miqyos: <b>1x25-;</b> birinchi faslning 25 va undan keyingi qismlariga mos keladi - - Rules (legacy) + + Episode number is a mandatory positive value - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - + Last Match: %1 days ago Oxirgi marta %1 kun oldin mos kelgan - + Last Match: Unknown Oxirgi mos kelish sanasi noma’lum - + New rule name Yangi qoida nomi - + Please type the name of the new download rule. Yangi yuklab olish qoidasi uchun nom kiriting - - + + Rule name conflict Qoida nomida ziddiyat - - + + A rule with this name already exists, please choose another name. Bu nomdagi qoida oldindan mavjud, boshqa kiriting. - + Are you sure you want to remove the download rule named '%1'? Haqiqatan ham “%1” nomli yuklab olish qoidasini o‘chirib tashlamoqchimisiz? - + Are you sure you want to remove the selected download rules? Haqiqatan ham tanlangan yuklab olish qoidalarini o‘chirib tashlamoqchimisiz? - + Rule deletion confirmation Qoidani o‘chirib tashlashni tasdiqlash - + Destination directory Manziliy jild - + Invalid action - + Amal noto‘g‘ri - + The list is empty, there is nothing to export. - + Ro‘yxat bo‘m-bo‘sh, eksport qilinadigan narsa yo‘q. - - Export RSS rules - + + Where would you like to save the list? + Ro‘yxatni qayerda saqlaysiz? - - + + Rules list (*.rssrules) + Qoidalar ro‘yxati (*.rssrules) + + + I/O Error - I/O xatosi + I/O xatoligi - - Failed to create the destination file. Reason: %1 - + + Failed to create the destination file + Manziliy faylni yaratishda xatolik yuz berdi - - Import RSS rules - + + Please point to the RSS download rules file + RSS yuklab olish qoidalari faylini ko‘rsating - - Failed to open the file. Reason: %1 - + + Rules list + Qoidalar ro‘yxati - + Import Error - + Import qilishda xatolik - - Failed to import the selected rules file. Reason: %1 - + + Failed to import the selected rules file + Tanlangan qoidalar faylini import qilish amalga oshmadi - + Add new rule... Yangi qoida qo‘shish... - + Delete rule Qoidani o‘chirib tashlash - + Rename rule... Qoida nomini o‘zgartirish... - + Delete selected rules Tanlangan qoidalarni o‘chirib tashlash - - Clear downloaded episodes... - - - - + Rule renaming Qoida ismini o‘zgartirish - + Please type the new rule name Yangi qoida nomini kiriting - - Clear downloaded episodes - - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - - - - - - Position %1: %2 - + + Regex mode: use Perl-like regular expressions + Muntazam ifoda rejimi: Perl’ga o‘xshash muntazam ifodalarni qo‘llash - + Wildcard mode: you can use - + ? to match any single character - + * to match zero or more of any characters - + Whitespaces count as AND operators (all words, any order) - + | is used as OR operator - + If word order is important use * instead of whitespace. - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - + will match all articles. - + will exclude all articles. - - - BanListOptionsDialog - - - List of banned IP addresses - - - - - Ban IP - - - - - Delete - - - - - - Warning - - - - The entered IP address is invalid. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Andaza belgisi rejimi: <ul><li>bitta belgi uchun ?</li><li>har qanday miqdordagi belgilar uchun *</li><li>Bo‘shliq AND operatori hisoblanadi</li></ul> - - The entered IP is already banned. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Andaza belgisi rejimi: <ul><li>bitta belgi uchun ?</li><li>har qanday miqdordagi belgilar uchun *</li><li>| OR operatori hisoblanadi</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support PeX qo‘llovini o‘zgartirish uchun dasturni qayta boshlash lozim - - Could not get GUID of configured network interface. Binding to IP %1 - - - - + Embedded Tracker [ON] Ichki o‘rnatilgan treker [YONIQ] - + Failed to start the embedded tracker! Ichki o‘rnatilgan trekerni boshlab bo‘lmadi! - + Embedded Tracker [OFF] Ichki o‘rnatilgan treker (O‘CHIQ) - + + '%1' reached the maximum ratio you set. Removing... + “%1” siz belgilagan maksimal nisbatga yetdi. Olib tashlanmoqda... + + + + '%1' reached the maximum ratio you set. Pausing... + “%1” siz belgilagan maksimal nisbatga yetdi. To‘xtatib turilmoqda... + + + System network status changed to %1 e.g: System network status changed to ONLINE Tizim tarmog‘i holati “%1”ga o‘zgardi - + ONLINE ONLAYN - + OFFLINE OFLAYN - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding %1 tarmoq sozlamasi o‘zgardi, seans bog‘lamasi yangilanmoqda - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. - - + Encryption support [%1] - - + FORCED - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - - - - - + Anonymous mode [%1] - + Unable to decode '%1' torrent file. “%1” torrent faylini dekodlab bo‘lmaydi. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' “%2” torrentidagi “%1” faylini yuklab olish - + Queue positions were corrected in %1 resume files - + Couldn't save '%1.torrent' “%1.torrent” faylini saqlab bo‘lmadi - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - - - - + because %1 is disabled. this peer was blocked because uTP is disabled. chunki %1 o‘chirib qo‘yilgan. - + because %1 is disabled. this peer was blocked because TCP is disabled. chunki %1 o‘chirib qo‘yilgan. - + URL seed lookup failed for URL: '%1', message: %2 Ushbu URL’ning sidini izlash amalga oshmadi: “%1”, xabar: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + “%1” oldi-berdi ro‘yxatidan va diskdan olib tashlandi. + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + “%1” oldi-berdi ro‘yxatidan olib tashlandi. + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... “%1” yuklab olinmoqda, kutib turing... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent har qanday interfeys portini tinglashga urinmoqda: %1 - + The network interface defined is invalid: %1 Belgilangan tarmoq interfeysi yaroqsiz: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent %1 interfeysining %2-portini tinglashga urinmoqda - - Peer ID: - - - - - HTTP User-Agent is '%1' - - - - - + DHT support [%1] - - - - - - - - - + + + + ON - - - - - - - - - + + + + OFF - - + Local Peer Discovery support [%1] - - PeX support [%1] - - - - - '%1' reached the maximum ratio you set. Removed. - - - - - '%1' reached the maximum ratio you set. Paused. - - - - - '%1' reached the maximum seeding time you set. Removed. - - - - - '%1' reached the maximum seeding time you set. Paused. - - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent tinglashga %1 mahalliy manzilni topa olmadi - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent hech qaysi interfeysda %1 portini tinglay olmadi. Sababi: %2. - + Tracker '%1' was added to torrent '%2' “%2” torrentiga “%1” trekeri qo‘shildi - + Tracker '%1' was deleted from torrent '%2' “%1” trekeri “%2” torrentidan o‘chirib tashlandi - + URL seed '%1' was added to torrent '%2' “%2” torrentiga “%1” URL sidi qo‘shildi - + URL seed '%1' was removed from torrent '%2' “%1” URL sidi “%2” torrentidan o‘chirib tashlandi - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. “%1” torrentini davomlab bo‘lmaydi. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Berilgan IP filtri tahlil qilindi: %1 ta qoida qo‘llandi. - + Error: Failed to parse the provided IP filter. Xato: berilgan IP filtrini tahlil qilib bo‘lmadi. - - '%1' restored. - 'torrent name' restored. - - - - + Couldn't add torrent. Reason: %1 Torrent qo‘shib bo‘lmadi. Sababi: %1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + “%1” davomlandi. (tez davomlash) + + + '%1' added to download list. 'torrent name' was added to download list. “%1” yuklanishlar ro‘yxatiga qo‘shildi. - + An I/O error occurred, '%1' paused. %2 I/O xatoligi yuz berdi, “%1” pauza qilindi. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: portni belgilash amalga oshmadi, xabar: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: portni belgilash amalga oshdi, xabar: %1 - + due to IP filter. this peer was blocked due to ip filter. IP filtri. - + due to port filter. this peer was blocked due to port filter. port filtri. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. i2p aralash rejim cheklovlari. - + because it has a low port. this peer was blocked because it has a low port. porti quyi darajada. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent %1 interfeysida ushbu portni tinglamoqda: %2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 Tashqi IP: %1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + “%1” torrentini ko‘chirib bo‘lmadi. Sababi: %2 - + File sizes mismatch for torrent '%1', pausing it. - + “%1” torrentining fayl hajmi to‘g‘ri kelmayapti, pauza qilindi. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - + “%1” torrentini tez davomlash rad etildi. Sababi: %2. Qayta tekshirilmoqda... CategoryFilterModel - + Categories - + All - + Hammasini - + Uncategorized @@ -1706,34 +1363,67 @@ - Edit category... - - - - Remove category - + Remove unused categories - + Resume torrents Torrentlarni davomlash - + Pause torrents Torrentlarni pauza qilish - + Delete torrents Torrentlarni o‘chirib tashlash + + + New Category + + + + + Category: + + + + + Invalid category name + + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + CookiesDialog @@ -1772,220 +1462,101 @@ - DeletionConfirmationDialog - - - Deletion confirmation - - - - - Remember choice - - + DeletionConfirmationDlg - - Also delete the files on the hard disk - - - - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Haqiqatan ham “%1”ni oldi-berdi ro‘yxatidan o‘chirib tashlaysizmi? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - - - - - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - Yuklab olish - - - - No URL entered - - - - - Please type at least one URL. - + Haqiqatan ham %1 ta torrentni oldi-berdi ro‘yxatidan o‘chirib tashlaysizmi? DownloadedPiecesBar - + White: Missing pieces Oq: yetishmayotgan qismlari - + Green: Partial pieces Yashil: qisman olingan qismlar - + Blue: Completed pieces Ko‘k: tugallangan qismlari - ExecutionLogWidget + ExecutionLog - + General - Umumiy + Umumiy - + Blocked IPs - + Bloklangan IP manzillari - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> %2 bloklandi - + <font color='red'>%1</font> was banned x.y.z.w was banned - + <font color='red'>%1</font> ban qilindi FeedListWidget - + RSS feeds RSS tasmalari - - - Unread (%1) - + + Unread + O‘qilmagan FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - - - - - &Browse... - Launch file dialog button text (full) - - - - - Choose a file - Caption for file open/save dialog - - - - - Choose a folder - Caption for directory open dialog - - - - - Any file + + An error occured while trying to open the log file. Logging to file is disabled. FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - - - - - - - IP filter line %1 is malformed. - - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - - - - - - IP filter exception thrown for line %1. Exception is: %2 - - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - + + + + I/O Error: Could not open ip filter file in read mode. + I/O xatosi: o‘qish rejimida ip filtri faylini ochib bo‘lmadi. - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. Tahlil xatosi: bu filtr fayli yaroqli PeerGuardian P2B fayli emas. @@ -1993,395 +1564,472 @@ GeoIPDatabase - - + + Unsupported database file size. Database fayl hajmi qo‘llab-quvvatlanmaydi. - + Metadata error: '%1' entry not found. Tavsif ma’lumotlari xatosi: “%1” kiritmasi topilmadi. - + Metadata error: '%1' entry has invalid type. Tavsif ma’lumotlari xatosi: “%1” kiritmasi yaroqsiz turda. - + Unsupported database version: %1.%2 Database versiyasi qo‘llab-quvvatlanmaydi: %1.%2 - + Unsupported IP version: %1 IP versiyasi qo‘llab-quvvatlanmaydi: %1 - + Unsupported record size: %1 Yozuv hajmi qo‘llab-quvvatlanmaydi: %1 - + Invalid database type: %1 Database turi yaroqsiz: %1 - + Database corrupted: no data section found. Database buzilgan: ma’lumotlar bo‘limi topilmadi. - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - + + File + Fayl - - Bad Http request, closing socket. IP: %s - + + Edit + Tahrir - - - HttpServer - + + Help + Yordam + + + Exit qBittorrent qBittorrent dasturidan chiqish - + Only one link per line Bir qatorga bittadan havola kiriting - - Global upload rate limit must be greater than 0 or disabled. - Global yuklash nisbati cheklovi 0 dan baland yoki o‘chirib qo‘yilgan bo‘lishi kerak. - + + Download + Yuklab olish + - + + Global upload rate limit must be greater than 0 or disabled. + Global yuklash nisbati cheklovi 0 dan baland yoki o‘chirib qo‘yilgan bo‘lishi kerak. + + + Global download rate limit must be greater than 0 or disabled. Global yuklab olish nisbati cheklovi 0 dan baland yoki o‘chirib qo‘yilgan bo‘lishi kerak. - + Alternative upload rate limit must be greater than 0 or disabled. Muqobil yuklash nisbati cheklovi 0 dan baland yoki o‘chirib qo‘yilgan bo‘lishi kerak. - + Alternative download rate limit must be greater than 0 or disabled. Muqobil yuklab olish nisbati cheklovi 0 dan baland yoki o‘chirib qo‘yilgan bo‘lishi kerak. - + Maximum active downloads must be greater than -1. Maksimum faol yuklanishlar soni -1 dan baland bo‘lishi kerak. - + Maximum active uploads must be greater than -1. Maksimum faol yuklashlar soni -1 dan baland bo‘lishi kerak. - + Maximum active torrents must be greater than -1. Maksimum faol torrentlar soni -1 dan baland bo‘lishi kerak. - + Maximum number of connections limit must be greater than 0 or disabled. Maksimal ulanishlar soni cheklovi 0 dan baland yoki o‘chirib qo‘yilgan bo‘lishi kerak. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Bitta torrentga ulanishlarning maksimal soni cheklovi 0 dan baland yoki o‘chirib qo‘yilgan bo‘lishi kerak. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Bitta torrentga yuklash o‘rinlari maksimal soni cheklovi 0 dan baland yoki o‘chirib qo‘yilgan bo‘lishi kerak. - + Unable to save program preferences, qBittorrent is probably unreachable. Dastur sozlamalarini saqlab bo‘lmayapti, qBittorrent dasturini ochib bo‘lmaydi. - - IRC: #qbittorrent on Freenode - - - - - Invalid category name: -Please do not use any special characters in the category name. - - - - - Unknown - - - - - Hard Disk - - - - - Share ratio limit must be between 0 and 9998. - - - - - Seeding time limit must be between 0 and 525600 minutes. - + + Language + Til - + The port used for incoming connections must be between 1 and 65535. Kiruvchi ulanishlar uchun ishlatiladigan port 1 bilan 65535 oralig‘ida bo‘lishi kerak. - + The port used for the Web UI must be between 1 and 65535. Veb interfeysi uchun ishlatiladigan port 1 bilan 65535 oralig‘ida bo‘lishi kerak. - + Unable to log in, qBittorrent is probably unreachable. Tizimga kirib bo‘lmayapti, qBittorrent dasturini ochib bo‘lmaydi. - + Invalid Username or Password. Foydalanuvchi ismi yoki parol noto‘g‘ri. - - Username - - - - + Password Parol - + Login Kirish - + + Upload Failed! + Yuklash amalga oshmadi! + + + Original authors Original mualliflar - + + Upload limit: + Yuklash cheklovi: + + + + Download limit: + Yuklab olish cheklovi: + + + Apply Qo‘llash - + Add Qo‘shish - + + Category: + + + + Upload Torrents Upload torrent files to qBittorent using WebUI - + + All + Hammasini + + + + Downloading + Yuklab olinmoqda + + + + Seeding + Tarqatilmoqda + + + + Completed + Tugallangan + + + + Resumed + Davomlangan + + + + Paused + Pauzada + + + + Active + Faol + + + + Inactive + Nofaol + + + Save files to location: Fayllarni saqlash joyi: - + Cookie: Kuki: - + Type folder here Jildni kiriting - + + Run an external program on torrent completion + Torrent olib bo‘linganida tashqi dasturni ishga tushirish + + + + Enable bandwidth management (uTP) + Trafik boshqaruvi xususiyatini yoqish (uTP) + + + + Apply rate limit to uTP connections + uTP ulanishlariga tezlik cheklovi qo‘llash + + + + Alternative Global Rate Limits + Muqobil Global tezlik cheklovlari + + + More information Ko‘proq ma’lumot - + Information about certificates Sertifikatlar yuzasidan ma’lumot - + Save Files to Fayllarni bu yerga saqlash - - Set location - - - - - Limit upload rate - + + Watch Folder + Kuzatuv jildi - - Limit download rate - + + Default Folder + Odatiy jild - - Rename torrent - + + from + from time1 to time2 + qayerdan - - Unable to create category - + + to + from time1 to time2 + qayerga - + Other... Save Files to: Watch Folder / Default Folder / Other... Boshqa... - + + Every day + Schedule the use of alternative rate limits on ... + Har kuni + + + + Week days + Schedule the use of alternative rate limits on ... + Begim kunlari + + + + Week ends + Schedule the use of alternative rate limits on ... + Dam olish kunlari + + + Monday Schedule the use of alternative rate limits on ... Dushanba - + Tuesday Schedule the use of alternative rate limits on ... Seshanba - + Wednesday Schedule the use of alternative rate limits on ... Chorshanba - + Thursday Schedule the use of alternative rate limits on ... Payshanba - + Friday Schedule the use of alternative rate limits on ... Juma - + Saturday Schedule the use of alternative rate limits on ... Shanba - + Sunday Schedule the use of alternative rate limits on ... Yakshanba - + + Downloaded + Is the file downloaded or not? + Yuklab olingan + + + Logout Chiqish - + + Download from URLs + + + + Download Torrents from their URLs or Magnet links - + Upload local torrent Qurilmadagi torrentni yuklash - + Are you sure you want to delete the selected torrents from the transfer list? Haqiqatan ham tanlangan torrentlarni oldi-berdi ro‘yxatidan o‘chirib tashlamoqchimisiz? - + Save Saqlash - + qBittorrent client is not reachable qBittorrent mijozini ochib bo‘lmaydi - - qBittorrent has been shutdown. - qBittorrent yopib qo‘yildi. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - + + HTTP Server + HTTP serveri - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - + + The following parameters are supported: + Quyidagi parametrlar qo‘llanadi: - - Add subnet - + + Torrent path + Torrent yo‘lagi - - Delete - + + Torrent name + Torrent nomi - - Error - Xato + + qBittorrent has been shutdown. + qBittorrent yopib qo‘yildi. + + + LineEdit - - The entered subnet is invalid. - + + Clear the text + Matnni tozalash LogListWidget - + Copy Nusxalash - + Clear Tozalash @@ -2414,550 +2062,492 @@ Yuklanishlar &tugallanganida - + &View &Ko‘rish - + &Options... &Opsiyalar... - + &Resume &Davomlash - + Torrent &Creator &Torrent yaratuvchi - + Set Upload Limit... Yuklash cheklovini qo‘yish... - + Set Download Limit... Yuklab olish cheklovini qo‘yish... - + Set Global Download Limit... Global yuklab olish cheklovini qo‘yish... - + Set Global Upload Limit... Global yuklash cheklovini qo‘yish... - + Minimum Priority Minimal dolzarblik - + Top Priority Yuqori dolzarblik - + Decrease Priority Dolzarblikni pasaytirish - + Increase Priority Dolzarblikni oshirish - - + + Alternative Speed Limits Muqobil tezlik cheklovlari - + &Top Toolbar &Yuqoridagi uskunalar majmuasi - + Display Top Toolbar Yuqoridagi uskunalar majmuasini ko‘rsatish - - Status &Bar - - - - + S&peed in Title Bar &Tezlik sarlavha qatorida - + Show Transfer Speed in Title Bar Oldi-berdi tezligini sarlavha qatorida ko‘rsatish - + &RSS Reader &RSS o‘quvchi - + Search &Engine &Qidiruv vositasi - + L&ock qBittorrent qBittorrent’ni q&ulflash - + Do&nate! &Xayriya! - - Close Window - - - - + R&esume All &Hammasini davomlash - + Manage Cookies... - + Manage stored network cookies - + Normal Messages - + Information Messages - + Warning Messages - + Critical Messages - + &Log &Log yuritish - + &Exit qBittorrent qBittorrent’dan &chiqish - + &Suspend System &Tizimni uxlatish - + &Hibernate System Tizimni &kutish holatiga o‘tkazish - + S&hutdown System Tizimni &o‘chirish - + &Disabled &Ishlamaydi - + &Statistics &Statistika - + Check for Updates Yangilanishlarni tekshirish - + Check for Program Updates Dastur yangilanishlarini tekshirish - + &About &Dastur haqida - + &Pause &Pauza qilish - + &Delete &O‘chirib tashlash - + P&ause All &Hammasini pauza qilish - + &Add Torrent File... &Torrent fayli qo‘shish... - + Open Ochish - + E&xit &Chiqish - + Open URL URL manzilini ochish - + &Documentation &Hujjatlar - + Lock Qulflash - - - + + + Show Ko‘rsatish - + Check for program updates Dastur yangilanishlarini tekshirish - + Add Torrent &Link... Torrent &havolasi qo‘shish... - + If you like qBittorrent, please donate! Sizga qBittorrent dasturi yoqqan bo‘lsa, marhamat qilib xayriya qiling! - - + Execution Log Faoliyat logi - + Clear the password Parolni tozalash - + Filter torrent list... Torrent ro‘yxatini filtrlash... - + &Set Password &Parol qo‘yish - - Preferences - - - - + &Clear Password Parolni &tozalash - + Transfers Oldi-berdilar - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Torrent faylini biriktirish - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent torrent fayllari yoki Magnet havolalarini ochish uchun odatiy dastur qilib belgilanmagan. qBittorrent dasturini torrent fayllari va Magnet havolalariga biriktirasizmi? - + Icons Only Faqat ikonlar - + Text Only Faqat matn - + Text Alongside Icons Ikonlar yonida matn - + Text Under Icons Ikonlar tagida matn - + Follow System Style Tizim stiliga muvofiq - - - + + + UI lock password FI qulflash paroli - - - + + + Please type the UI lock password: UI qulflash parolini kiriting: - + The password should contain at least 3 characters Parolda kamida 3 ta belgi bo‘lishi kerak - + Password update Parolni o‘zgartirish - + The UI lock password has been successfully updated FI qulflash paroli o‘zgartirildi - + Are you sure you want to clear the password? Haqiqatan ham parolni olib tashlamoqchimisiz? - - Use regular expressions - - - - + Search Qidiruv - + Transfers (%1) Oldi-berdi (%1) - + Error Xato - + Failed to add torrent: %1 Ushbu torrentni qo‘shib bo‘lmadi: %1 - + Torrent added - + '%1' was added. e.g: xxx.avi was added. - + Download completion Yuklab olishning tugallanishi - + I/O Error i.e: Input/Output Error I/O xatosi - + Recursive download confirmation Navbatma-navbat yuklab olishni tasdiqlash - + Yes Ha - + No Yo‘q - + Never Hech qachon - + Global Upload Speed Limit Global yuklash tezligi cheklovi - + Global Download Speed Limit Global yuklab olish tezligi cheklovi - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - - - - - Are you sure you want to quit qBittorrent? - - - - + &No &Yo‘q - + &Yes &Ha - + &Always Yes &Doim ha - - %1/s - s is a shorthand for seconds - - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter Eski Python interpreteri - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - + qBittorrent Update Available qBittorrent uchun yangilanish mavjud - + + A new version is available. +Do you want to download %1? + Yangi versiyasi mavjud. +%1’ni yuklab olasizmi? + + + Already Using the Latest qBittorrent Version Sizdagi qBittorrent versiyasi eng yangisi - + Undetermined Python version Python versiyasi aniqlanmadi - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. “%1” yuklab olishni tamomladi. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2966,158 +2556,154 @@ Sababi: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? “%1” faylida torrent fayllari mavjud, ularni yuklab olishni boshlaymizmi? - + Couldn't download file at URL '%1', reason: %2. “%1” manzilidagi faylni yuklab olib bo‘lmadi, sababi: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - - + + Couldn't determine your Python version (%1). Search engine disabled. + Sizdagi Python versiyasini (%1) aniqlab bo‘lmadi. Qidiruv vositasi o‘chirib qo‘yildi. + + + + Missing Python Interpreter Python interpreteri yetishmayapti - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? Qidiruv vositasini ishlatish uchun Python kerak, ammo o‘rnatilmagan shekilli. Uni o‘rnatishni istaysizmi? - + Python is required to use the search engine but it does not seem to be installed. Qidiruv vositasini ishlatish uchun Python kerak, ammo o‘rnatilmagan shekilli. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. Hech qanday yangilanish mavjud emas. Siz eng yangi versiyasidan foydalanmoqdasiz. - + &Check for Updates &Yangilanishlarni tekshirish - + Checking for Updates... Yangilanishlar tekshirilmoqda... - + Already checking for program updates in the background Dastur yangilanishlar fonda tekshirilmoqda - + Python found in '%1' “%1” faylida Python aniqlandi - + Download error Yuklab olish xatoligi - + Python setup could not be downloaded, reason: %1. Please install it manually. Python o‘rnatish faylini olib bo‘lmadi, sababi: %1. Uni o‘zingiz o‘rnating. - - + + Invalid password Parol noto‘g‘ri - - - + + RSS (%1) RSS (%1) - + URL download error URL manzilini yuklab olish xatoligi - + The password is invalid Parol yaroqsiz - - + + DL speed: %1 e.g: Download speed: 10 KiB/s YO tezligi: %1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s Y tezligi: %1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [O: %1, Y: %2] qBittorrent %3 - + Hide Yashirish - + Exiting qBittorrent qBittorrent dasturidan chiqilmoqda - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Ayrim fayllar oldi-berdi qilinmoqda. +Haqiqatan ham qBittorrent dasturidan chiqmoqchimisiz? + + + Open Torrent Files Torrent fayllarini ochish - + Torrent Files Torrent fayllari - + Options were saved successfully. Opsiyalar saqlandi. @@ -3125,52 +2711,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. O‘zgaruvchan DNS yangilandi. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. O‘zgaruvchan DNS xatosi: xizmat hozircha mavjud emas, 30 daqiqadan so‘ng qayta uriniladi. - + Dynamic DNS error: hostname supplied does not exist under specified account. O‘zgaruvchan DNS xatosi: berilgan xost nomi ko‘rsatilgan hisobda mavjud emas. - + Dynamic DNS error: Invalid username/password. O‘zgaruvchan DNS xatosi: foydalanuvchi ismi/parol noto‘g‘ri. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. O‘zgaruvchan DNS xatosi: qBittorrent xizmat tomonidan qora ro‘yxatga qo‘shilgan, kamchilik haqida http://bugs.qbittorrent.org manzilida xabar bering. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. O‘zgaruvchan DNS xatosi: xizmat %1 javobini qaytardi, kamchilik haqida http://bugs.qbittorrent.org manzilida xabar bering. - + Dynamic DNS error: Your username was blocked due to abuse. O‘zgaruvchan DNS xatosi: suiiste’mol qilingani sababli bu foydalanuvchi ismi bloklangan. - + Dynamic DNS error: supplied domain name is invalid. O‘zgaruvchan DNS xatosi: berilgan domen nomi yaroqsiz. - + Dynamic DNS error: supplied username is too short. O‘zgaruvchan DNS xatosi: berilgan foydalanuvchi ismi o‘ta qisqa. - + Dynamic DNS error: supplied password is too short. O‘zgaruvchan DNS xatosi: berilgan parol o‘ta qisqa. @@ -3178,1413 +2764,1303 @@ Net::DownloadHandler - + I/O Error I/O xatosi - + The file size is %1. It exceeds the download limit of %2. Fayl hajmi %1. U yuklab olish cheklovidan (%2) ortadi. - + Unexpected redirect to magnet URI. Kutilmaganda magnet URI manziliga yo‘naltirildi. - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. GeoIP database yuklandi. Turi: %1. Nashr vaqti: %2. - - + + Couldn't load GeoIP database. Reason: %1 GeoIP databaseni yuklab bo‘lmadi. Sababi: %1 - + Venezuela, Bolivarian Republic of Venesuela, Bolivar respublikasi - + Viet Nam Vyetnam - - + + N/A Noaniq - + Andorra Andorra - + United Arab Emirates Birlashgan Arab Amirliklari - + Afghanistan Afg‘oniston - + Antigua and Barbuda Antigua va Barbuda - + Anguilla Angilya - + Albania Albaniya - + Armenia Armaniston - + Angola Angola - + Antarctica Antarktika - + Argentina Argentina - + American Samoa Amerika Samoasi - + Austria Avstriya - + Australia Avstraliya - + Aruba Aruba - + Azerbaijan Ozarbayjon - + Bosnia and Herzegovina Bosniya va Gersegovinya - + Barbados Barbados - + Bangladesh Bangladesh - + Belgium Belgiya - + Burkina Faso Burkina Faso - + Bulgaria Bolgariya - + Bahrain Bahrayn - + Burundi Burundi - + Benin Benin - + Bermuda Bermuda - + Brunei Darussalam Bruney Darussalam - + Brazil Braziliya - + Bahamas Bagam orollari - + Bhutan Butan - + Bouvet Island Buve oroli - + Botswana Botsvana - + Belarus Belarus - + Belize Beliz - + Canada Kanada - + Cocos (Keeling) Islands Kokos (Kiling) orollari - + Congo, The Democratic Republic of the Kongo, demokratik respublikasi - + Central African Republic Markaziy Afrika Respublikasi - + Congo Kongo - + Switzerland Shveysariya - + Cook Islands Kuk orollari - + Chile Chili - + Cameroon Kamerun - + China Xitoy - + Colombia Kolumbiya - + Costa Rica Kosta Rika - + Cuba Kuba - + Cape Verde Kabo-Verde - + Curacao Kyurasao - + Christmas Island Rojdestvo oroli - + Cyprus Kipr - + Czech Republic Chex respublikasi - + Germany Germaniya - + Djibouti Jibuti - + Denmark Daniya - + Dominica Dominika - + Dominican Republic Dominika Respublikasi - + Algeria Jazoir - + Ecuador Ekvador - + Estonia Estoniya - + Egypt Misr - + Western Sahara G'arbiy Saxara - + Eritrea Eritreya - + Spain Ispaniya - + Ethiopia Efiopiya - + Finland Finlandiya - + Fiji Fiji - + Falkland Islands (Malvinas) Folklend orollari (Malvina) - + Micronesia, Federated States of Mikroneziya Federativ Shtatlari - + Faroe Islands Farer orollari - + France Fransiya - + Gabon Gabon - + United Kingdom Buyuk Britaniya - + Grenada Grenada - + Georgia Gruziya - + French Guiana Gviana - + Ghana Gana - + Gibraltar Gibraltar - + Greenland Grenlandiya - + Gambia Gambiya - + Guinea Gvineya - + Guadeloupe Gvadelupa - + Equatorial Guinea Ekvatorial Gvineya - + Greece Gretsiya - + South Georgia and the South Sandwich Islands Janubiy Georgiya va Janubiy Sendvich orollari - + Guatemala Gvatemala - + Guam Guam - + Guinea-Bissau Gvineya-Bisau - + Guyana Gayana - + Hong Kong Gonkong - + Heard Island and McDonald Islands Xerd oroli va Makdonald orollari - + Honduras Gonduras - + Croatia Xorvatiya - + Haiti Gaiti - + Hungary Vengriya - + Indonesia Indoneziya - + Ireland Irlandiya - + Israel Isroil - + India Hindiston - + British Indian Ocean Territory Hind okeanidagi Britaniya hududi - + Iraq Iroq - + Iran, Islamic Republic of Eron Islom Respublikasi - + Iceland Islandiya - + Italy Italiya - + Jamaica Yamayka - + Jordan Iordaniya - + Japan Yaponiya - + Kenya Keniya - + Kyrgyzstan Qirg‘iziston - + Cambodia Kambodja - + Kiribati Kiribati - + Comoros Komoro orollari - + Saint Kitts and Nevis Sent-Kits va Nevis - + Korea, Democratic People's Republic of Koreya Xalq Demokratik Respublikasi - + Korea, Republic of Koreya Respublikasi - + Kuwait Quvayt - + Cayman Islands Kayman orollari - + Kazakhstan Qozog‘iston - + Lao People's Democratic Republic Laos Xalq Demokratik Respublikasi - + Lebanon Livan - + Saint Lucia Sent-Lyusiya - + Liechtenstein Lixtenshteyn - + Sri Lanka Shri-Lanka - + Liberia Liberiya - + Lesotho Lesoto - + Lithuania Litva - + Luxembourg Lyuksemburg - + Latvia Latviya - + Morocco Marokko - + Monaco Monako - + Moldova, Republic of Moldova Respublikasi - + Madagascar Madagaskar - + Marshall Islands Marshall orollari - + Mali Mali - + Myanmar Myanma - + Mongolia Mo‘g‘uliston - + Northern Mariana Islands Shimoliy Mariana orollari - + Martinique Martinika - + Mauritania Mavritaniya - + Montserrat Montserrat - + Malta Malta - + Mauritius Mavrikiy - + Maldives Maldiv orollari - + Malawi Malavi - + Mexico Meksika - + Malaysia Malayziya - + Mozambique Mozambik - + Namibia Namibiya - + New Caledonia Yangi Kaledoniya - + Niger Niger - + Norfolk Island Norfolk oroli - + Nigeria Nigeriya - + Nicaragua Nikaragua - + Netherlands Niderlandiya - + Norway Norvegiya - + Nepal Nepal - + Nauru Nauru - + Niue Niue - + New Zealand Yangi Zelandiya - + Oman Oman - + Panama Panama - + Peru Peru - + French Polynesia Fransuz Polineziyasi - + Papua New Guinea Papua-Yangi Gvineya - + Philippines Filippin - + Pakistan Pokiston - + Poland Polsha - + Saint Pierre and Miquelon Sen-Pyer va Mikelon - + Puerto Rico Puerto-Riko - + Portugal Portugaliya - + Palau Palau - + Paraguay Paragvay - + Qatar Qatar - + Reunion Reyunion - + Romania Ruminiya - + Russian Federation Rossiya federatsiyasi - + Rwanda Ruanda - + Saudi Arabia Saudiya Arabistoni - + Solomon Islands Solomon orollari - + Seychelles Seyshel orollari - + Sudan Sudan - + Sweden Shvetsiya - + Singapore Singapur - + Slovenia Sloveniya - + Svalbard and Jan Mayen Shpisbergen va Yan-Mayen - + Slovakia Slovakiya - + Sierra Leone Syerra-Leone - + San Marino San-Marino - + Senegal Senegal - + Somalia Somaliya - + Suriname Surinam - + Sao Tome and Principe San-Tome va Prinsipi - + El Salvador Salvador - + Syrian Arab Republic Suriya Arab Respublikasi - + Swaziland Svazilend - + Turks and Caicos Islands Terks va Kaykos - + Chad Chad - + French Southern Territories Fransuz Janubiy Hududlari - + Togo Togo - + Thailand Tayland - + Tajikistan Tojikiston - + Tokelau Tokelau - + Turkmenistan Turkmaniston - + Tunisia Tunis - + Tonga Tonga - - Could not decompress GeoIP database file. - - - - + Timor-Leste Sharqiy Timor - + Bolivia, Plurinational State of Boliviya - + Bonaire, Sint Eustatius and Saba Bonayre, Avliyo Yevstatiy va Saba - + Cote d'Ivoire Kot-d’Ivuar - + Libya Liviya - + Saint Martin (French part) Sen-Marten (Fransuz qismi) - + Macedonia, The Former Yugoslav Republic of Makedoniya sobiq Yugoslav respublikasi - + Macao Makao - + Pitcairn Pitkern - + Palestine, State of Falastin davlati - + Saint Helena, Ascension and Tristan da Cunha Avliyo Yelena, Me’roj va Tristan-da-Kunya - + South Sudan Janubiy Sudan - + Sint Maarten (Dutch part) Sint Maarten (Golland qismi) - + Turkey Turkiya - + Trinidad and Tobago Trinidad va Tobago - + Tuvalu Tuvalu - + Taiwan Tayvan - + Tanzania, United Republic of Tanzaniya birlashgan respublikasi - + Ukraine Ukraina - + Uganda Uganda - + United States Minor Outlying Islands AQSH kichik orollari - + United States Amerika Qo‘shma Shtatlari - + Uruguay Urugvay - + Uzbekistan O‘zbekiston - + Holy See (Vatican City State) Muqaddas Arsh (Vatikan shahar-davlati) - + Saint Vincent and the Grenadines Sent-Vinsent va Grenadinlar - + Virgin Islands, British Virgin orollari, Britaniya - + Virgin Islands, U.S. Virgin orollari, AQSH. - + Vanuatu Vanuatu - + Wallis and Futuna Uollis va Futuna - + Samoa Samoa - + Yemen Yaman - + Mayotte Mayotte - + Serbia Serbiya - + South Africa Janubiy Afrika - + Zambia Zambiya - + Montenegro Chernogoriya - + Zimbabwe Zimbabve - + Aland Islands Aland orollari - + Guernsey Gernsi - + Isle of Man Men oroli - + Jersey Jersi - + Saint Barthelemy Sent-Bartelemiy - + + Could not uncompress GeoIP database file. + GeoIP ombor faylini ajratib bo‘lmadi. + + + Couldn't save downloaded GeoIP database file. Yuklab olingan GeoIP ombor faylini saqlab bo‘lmadi. - + Successfully updated GeoIP database. GeoIP ombori yangilandi. - + Couldn't download GeoIP database file. Reason: %1 GeoIP ombor faylini yuklab olib bo‘lmadi. Sababi: %1 @@ -4592,12 +4068,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] UPnP / NAT-PMP bilan ishlash [YONIQ] - + UPnP / NAT-PMP support [OFF] UPnP / NAT-PMP bilan ishlash [O‘CHIQ] @@ -4605,7 +4081,7 @@ Net::Smtp - + Email Notification Error: E-pochta xabarnomasi xatosi: @@ -4613,1273 +4089,1077 @@ OptionsDialog - + Options - + Behavior - + Downloads - + Connection - + Speed - + BitTorrent - - RSS - - - - + Web UI - + Advanced - + Language - + Til - + User Interface Language: - + (Requires restart) - + Transfer List - + Confirm when deleting torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. - + Hide zero and infinity values - + Always Har doim - + Paused torrents only - + Action on double-click - + Downloading torrents: - - + + Start / Stop Torrent - - + + Open destination folder - - + + No action - + Completed torrents: - + Desktop - + Start qBittorrent on Windows start up - + Show splash screen on start up - + Start qBittorrent minimized - + Confirmation on exit when torrents are active - + Confirmation on auto-exit when downloads finish - - KiB - - - - - Email notification &upon download completion - - - - - Run e&xternal program on torrent completion - - - - - IP Fi&ltering - - - - - Schedule &the use of alternative rate limits - - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - - - - &Torrent Queueing - - - - - Seed torrents until their seeding time reaches - - - - - A&utomatically add these trackers to new downloads: - - - - - RSS Reader - - - - - Enable fetching RSS feeds - - - - - Feeds refresh interval: - - - - - Maximum number of articles per feed: - - - - - - min - minutes - - - - - RSS Torrent Auto Downloader - - - - - Enable auto downloading of RSS torrents - - - - - Edit auto downloading rules... - - - - - Web User Interface (Remote control) - - - - - IP address: - - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - - - - - Server domains: - - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - - - - - &Use HTTPS instead of HTTP - - - - - Bypass authentication for clients on localhost - - - - - Bypass authentication for clients in whitelisted IP subnets - - - - - IP subnet whitelist... - - - - - Upda&te my dynamic domain name + + Show qBittorrent in notification area - + Minimize qBittorrent to notification area - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. - + Tray icon style: - + Normal O‘rta - + Monochrome (Dark theme) - + Monochrome (Light theme) - + File association - + Use qBittorrent for .torrent files - + Use qBittorrent for magnet links - + Power Management - + + Inhibit system sleep when torrents are active + + + + + Log file + + + + Save path: - + Backup the log file after: - + + MB + + + + Delete backup logs older than: - + days Delete backup logs older than 10 months - + months Delete backup logs older than 10 months - + years Delete backup logs older than 10 years - + When adding a torrent - + + Display torrent content and some options + + + + Bring torrent dialog to the front - + Do not start the download automatically The torrent will be added to download list in pause state - + Should the .torrent file be deleted after adding it - + + Delete .torrent files afterwards + + + + Also delete .torrent files whose addition was cancelled - + Also when addition is cancelled - + Warning! Data loss possible! - + Saving Management - + Default Torrent Management Mode: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - + Manual - + Automatic - + When Torrent Category changed: - + Relocate torrent - + Switch torrent to Manual Mode - + When Default Save Path changed: - - + + Relocate affected torrents - - + + Switch affected torrents to Manual Mode - + When Category changed: - + Use Subcategories - + Default Save Path: - + Keep incomplete torrents in: - + Copy .torrent files to: - - Show &qBittorrent in notification area - - - - - &Log file - - - - - Display &torrent content and some options - - - - - Create subfolder for torrents with multiple files - - - - - De&lete .torrent files afterwards - - - - + Copy .torrent files for finished downloads to: - + Pre-allocate disk space for all files - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding + + Append .!qB extension to incomplete files - - Append .!qB extension to incomplete files + + Automatically add torrents from: - - Enable recursive download dialog + + Add entry - - Automatically add torrents from: + + Remove entry - - Add entry + + Email notification upon download completion - - Remove entry + + Destination email: - + SMTP server: - + This server requires a secure connection (SSL) - - + + + Authentication - - - - + + + + Username: - - - - + + + + Password: - - Enabled protocol: - - - - - TCP and μTP + + Run external program on torrent completion - + Listening Port - + Port used for incoming connections: - + Random - + Use UPnP / NAT-PMP port forwarding from my router - + Use different port on each startup - + Connections Limits - + Maximum number of connections per torrent: - + Global maximum number of connections: - + Maximum number of upload slots per torrent: - + Global maximum number of upload slots: - + Proxy Server - + Type: - + (None) - + SOCKS4 - + SOCKS5 - + HTTP - + Host: - - + + Port: - + Otherwise, the proxy server is only used for tracker connections - + Use proxy for peer connections - + Disable connections not supported by proxies - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - + Use proxy only for torrents - - A&uthentication + + Info: The password is saved unencrypted - - Info: The password is saved unencrypted + + IP Filtering - + Filter path (.dat, .p2p, .p2b): - + Reload the filter - - Manually banned IP addresses... - - - - + Apply to trackers - + Global Rate Limits - - - - - - - KiB/s + + + Upload: - - - Upload: + + + + + KiB/s - - + + Download: - + Alternative Rate Limits - - + + Schedule the use of alternative rate limits + + + + From: from (time1 to time2) - - + To: time1 to time2 - + When: - + Every day - + Har kuni - + Weekdays - + Weekends - + Rate Limits Settings - + Apply rate limit to peers on LAN - + Apply rate limit to transport overhead - - + + + Enable µTP protocol + + + + Apply rate limit to µTP protocol - + Privacy - + Enable DHT (decentralized network) to find more peers - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers - + Look for peers on your local network - + Enable Local Peer Discovery to find more peers - + Encryption mode: - + Prefer encryption - + Require encryption - + Disable encryption - + Enable when using a proxy or a VPN connection - + Enable anonymous mode - - Maximum active downloads: - - - - - Maximum active uploads: - - - - - Maximum active torrents: + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - Do not count slow torrents in these limits + + Torrent Queueing - - Upload rate threshold: + + Maximum active downloads: - - Download rate threshold: + + Maximum active uploads: - - sec - seconds + + Maximum active torrents: - - Torrent inactivity timer: + + Do not count slow torrents in these limits - + Share Ratio Limiting - + Seed torrents until their ratio reaches - + then - + Pause them - + Remove them - - RSS Smart Episode Filters + + Automatically add these trackers to new downloads: - - Use UPnP / NAT-PMP to forward the port from my router + + Enable Web User Interface (Remote control) - - Certificate: + + Use UPnP / NAT-PMP to forward the port from my router - - Import SSL Certificate + + Use HTTPS instead of HTTP - - Key: + + Certificate: - - Import SSL Key + + Import SSL Certificate - - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> + + Key: - - Use alternative Web UI + + Import SSL Key - - Files location: + + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - - Enable clickjacking protection + + Bypass authentication for localhost - - Enable Cross-Site Request Forgery (CSRF) protection + + Update my dynamic domain name - + Service: - + Register - + Domain name: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): - + %N: Torrent name - + %L: Category - - %G: Tags (seperated by comma) - - - - + %F: Content path (same as root path for multifile torrent) - + %R: Root path (first torrent subdirectory path) - + %D: Save path - + %C: Number of files - + %Z: Torrent size (bytes) - + %T: Current tracker - + %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor - + Folder is already being monitored: - + Folder does not exist: - + Folder is not readable: - + Adding entry failed - - - - + + Choose export directory - - - + + + + + + Choose a save directory - + Choose an IP filter file - + All supported filters - + SSL Certificate - + + SSL Key + + + + Parsing error - + Failed to parse the provided IP filter - + Successfully refreshed - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number Berilgan IP filtri tahlil qilindi: %1 ta qoida qo‘llandi. - + Invalid key - + This is not a valid SSL key. - + Invalid certificate - - Preferences - - - - - Import SSL certificate - - - - + This is not a valid SSL certificate. - - Import SSL key - - - - - SSL key - - - - + Time Error - + The start time and the end time can't be the same. - - + + Length Error - + The Web UI username must be at least 3 characters long. - + The Web UI password must be at least 6 characters long. @@ -5887,72 +5167,72 @@ PeerInfo - - Interested(local) and Choked(peer) + + interested(local) and choked(peer) - + interested(local) and unchoked(peer) - + interested(peer) and choked(local) - + interested(peer) and unchoked(local) - + optimistic unchoke - + peer snubbed - + incoming connection - + not interested(local) and unchoked(peer) - + not interested(peer) and unchoked(local) - + peer from PEX - + peer from DHT - + encrypted traffic - + encrypted handshake - + peer from LSD @@ -5960,180 +5240,165 @@ PeerListWidget - + IP - + Port - + Flags - + Connection - + Client i.e.: Client application - + Progress i.e: % downloaded - + Down Speed i.e: Download speed - + Up Speed i.e: Upload speed - + Downloaded i.e: total data downloaded Yuklab olingan - + Uploaded i.e: total data uploaded - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. - + Files i.e. files that are being downloaded right now - + Column visibility - + Add a new peer... - - + + Ban peer permanently - + Manually adding peer '%1'... - + The peer '%1' could not be added to this torrent. - + Manually banning peer '%1'... - - + + Peer addition - + Country - + Copy IP:port - + Some peers could not be added. Check the Log for details. - + The peers were added to this torrent. - + Are you sure you want to ban permanently the selected peers? - + &Yes &Ha - + &No &Yo‘q - PeersAdditionDialog - - - Add Peers - - + PeersAdditionDlg - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - - - + No peer entered - + Please type at least one peer. - + Invalid peer - + The peer '%1' is invalid. @@ -6141,12 +5406,12 @@ PieceAvailabilityBar - + White: Unavailable pieces - + Blue: Available pieces @@ -6154,336 +5419,288 @@ PiecesBar - + Files in this piece: - + File in this piece - + File in these pieces - - Wait until metadata become available to see detailed information - - - - + Hold Shift key for detailed information - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Installed search plugins: - + Name - + Version - + Url - - + + Enabled - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Check for updates - + Close - + Uninstall - - - + + + Yes - Ha + Ha - - - - + + + + No - Yo‘q + Yo‘q - + Uninstall warning - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Uninstall success - + All selected plugins were uninstalled successfully - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - - - - - + + New search engine plugin URL - - + + URL: - + Invalid link - + The link doesn't seem to point to a search engine plugin. - + Select search plugins - + qBittorrent search plugin - + + + + Search plugin update + + + + All your plugins are already up to date. - + Sorry, couldn't check for plugin updates. %1 - + + + Search plugin install - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + + + + Couldn't install "%1" search engine plugin. %2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + + + + Couldn't update "%1" search engine plugin. %2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Search plugin source: - + Local file - + Web link - PowerManagement + PreviewSelect - - qBittorrent is active - - - - - PreviewSelectDialog - - - Preview - - - - + Name - + Size - + Progress - - + + Preview impossible - - + + Sorry, we can't preview this file - Private::FileLineEdit - - - '%1' does not exist - - - - - '%1' does not point to a directory - - - - - '%1' does not point to a file - - - - - Does not have read permission in '%1' - - - - - Does not have write permission in '%1' - - - - PropListDelegate - + Not downloaded - - + + Normal Normal (priority) O‘rta - - N/A - Noaniq - - - + Do not download Do not download (priority) Yuklab olinmasin - - + + High High (priority) Yuqori - + Mixed Mixed (priorities - - + + Maximum Maximum (priority) Maksimal @@ -6492,32 +5709,32 @@ PropTabBar - + General Umumiy - + Trackers - + Peers - + HTTP Sources - + Content - + Speed @@ -6611,22 +5828,22 @@ Sharh: - + Select All - + Select None - + Normal O‘rta - + High Yuqori @@ -6686,165 +5903,165 @@ - + Maximum Maksimal + - Do not download Yuklab olinmasin - + Never Hech qachon - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) - - + + %1 (%2 this session) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) - + Open Ochish - + Open Containing Folder - + Rename... Nomini o‘zgartirish... - + Priority Dolzarblik - + New Web seed - + Remove Web seed - + Copy Web seed URL - + Edit Web seed URL - + + Rename the file + Fayl nomini o‘zgartirish + + + New name: Yangi nomi: - - + + + The file could not be renamed + Fayl nomini o‘zgartirib bo‘lmadi + + + + This file name contains forbidden characters, please choose a different one. + Bu nomda taqiqlangan belgilar bor, boshqa nom kiriting. + + + + This name is already in use in this folder. Please use a different name. Bu nom ushbu jildda oldindan mavjud. Boshqa nom kiriting. - + The folder could not be renamed Jild nomini o‘zgartirib bo‘lmadi - + qBittorrent qBittorrent - + Filter files... - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - - - - + New URL seed New HTTP source - + New URL seed: - - + + This URL seed is already in the list. - + Web seed editing - + Web seed URL: @@ -6852,583 +6069,548 @@ QObject - - %1 is an unknown command line parameter. - --random-parameter is an unknown command line parameter. + + Your IP address has been banned after too many failed authentication attempts. - - - %1 must be the single command line parameter. + + Error: '%1' is not a valid torrent file. + - - You cannot use %1: qBittorrent is already running for this user. + + Error: Could not add torrent to session. - - Usage: + + I/O Error: Could not create temporary file. - - Options: + + %1 is an unknown command line parameter. + --random-parameter is an unknown command line parameter. - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' + + + %1 must be the single command line parameter. - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' + + %1 must specify the correct port (1 to 65535). - - Expected integer number in environment variable '%1', but got '%2' + + You cannot use %1: qBittorrent is already running for this user. - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' + + Usage: - - Expected %1 in environment variable '%2', but got '%3' + + Options: - - port + + Displays program version - - %1 must specify a valid port (1 to 65535). + + Displays this help message - - Display program version and exit + + Changes the Web UI port (current: %1) - - Display this help message and exit + + Disable splash screen - - Change the Web UI port + + Run in daemon-mode (background) - - Disable splash screen + + Downloads the torrents passed by the user - - Run in daemon-mode (background) - + + Help + Yordam - - dir - Use appropriate short form or abbreviation of "directory" + + Run application with -h option to read about command line parameters. - - Store configuration files in <dir> + + Bad command line - - - name + + Bad command line: - - Store configuration files in directories qBittorrent_<name> + + Legal Notice - - Hack into libtorrent fastresume files and make file paths relative to the profile directory + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. - - files or URLs + + Press %1 key to accept and continue... - - Download the torrents passed by the user + + Legal notice - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. + + Cancel - - Options when adding new torrents: + + I Agree - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume + + Torrent name: %1 - - path + + Torrent size: %1 - - Torrent save path + + Save path: %1 - - Add torrents as started or paused + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds - - Skip hash check - Shifr tekshirilmasin + + Thank you for using qBittorrent. + - - Assign torrents to category. If the category doesn't exist, it will be created. + + [qBittorrent] '%1' has finished downloading - - Download files in sequential order + + The remote host name was not found (invalid hostname) - - Download first and last pieces first + + The operation was canceled - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: + + The remote server closed the connection prematurely, before the entire reply was received and processed - - Command line parameters take precedence over environment variables + + The connection to the remote server timed out - - Help - Yordam + + SSL/TLS handshake failed + - - Run application with -h option to read about command line parameters. + + The remote server refused the connection - - Bad command line + + The connection to the proxy server was refused - - Bad command line: + + The proxy server closed the connection prematurely - - Legal Notice + + The proxy host name was not found - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + + The connection to the proxy timed out or the proxy did not reply in time to the request sent - - No further notices will be issued. + + The proxy requires authentication in order to honor the request but did not accept any credentials offered - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. + + The access to the remote content was denied (401) - - Press %1 key to accept and continue... + + The operation requested on the remote content is not permitted - - Legal notice + + The remote content was not found at the server (404) - - Cancel + + The remote server requires authentication to serve the content but the credentials provided were not accepted - - I Agree + + The Network Access API cannot honor the request because the protocol is not known - - - Upgrade + + The requested operation is invalid for this protocol - - You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] + + An unknown network-related error was detected - - You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. + + An unknown proxy-related error was detected - - Couldn't migrate torrent with hash: %1 + + An unknown error related to the remote content was detected - - Couldn't migrate torrent. Invalid fastresume file name: %1 + + A breakdown in protocol was detected - - Detected unclean program exit. Using fallback file to restore settings: %1 + + Unknown error - - An access error occurred while trying to write the configuration file. + + + Upgrade - - A format error occurred while trying to write the configuration file. + + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - - An unknown error occurred while trying to write the configuration file. + + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - - - RSS::AutoDownloader - - - Invalid data format. + + Couldn't migrate torrent with hash: %1 - - Couldn't save RSS AutoDownloader data in %1. Error: %2 + + Couldn't migrate torrent. Invalid fastresume file name: %1 - - Invalid data format + + Detected unclean program exit. Using fallback file to restore settings. - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 + + An access error occurred while trying to write the configuration file. - - Couldn't load RSS AutoDownloader rules. Reason: %1 + + A format error occurred while trying to write the configuration file. - RSS::Feed - - - Failed to download RSS feed at '%1'. Reason: %2 - - - - - RSS feed at '%1' updated. Added %2 new articles. - - + RSS - - Failed to parse RSS feed at '%1'. Reason: %2 - + + Search + Qidiruv - - Couldn't read RSS Session data from %1. Error: %2 + + New subscription - - Couldn't parse RSS Session data. Error: %1 + + + + Mark items read - - Couldn't load RSS Session data. Invalid data format. + + Update all - - Couldn't load RSS article '%1#%2'. Invalid data format. + + RSS Downloader... - - - RSS::Private::Parser - - Invalid RSS feed. + + Settings... - - %1 (line: %2, column: %3, offset: %4). + + Torrents: (double-click to download) - - - RSS::Session - - RSS feed with given URL already exists: %1. + + + Delete - - Cannot move root folder. - + + Rename... + Nomini o‘zgartirish... - - - Item doesn't exist: %1. + + Rename - - Cannot delete root folder. + + + Update - - Incorrect RSS Item path: %1. + + New subscription... - - RSS item with given path already exists: %1. + + + Update all feeds - - Parent folder doesn't exist: %1. + + Download torrent - - - RSSWidget - - - Search - Qidiruv - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. + + Open news URL - - New subscription + + Copy feed URL - - - - Mark items read + + New folder... - + Refresh RSS streams + + + RSSImp - - Update all - - - - - RSS Downloader... - - - - - Torrents: (double-click to download) + + Stream URL: - - - Delete + + Please type a RSS stream URL - - Rename... - Nomini o‘zgartirish... - - - - Rename + + This RSS feed is already in the list. - - - Update + + Please choose a folder name - - New subscription... + + Folder name: - - - Update all feeds + + New folder - - Download torrent + + Deletion confirmation - - Open news URL + + Are you sure you want to delete the selected RSS feeds? - - Copy feed URL + + Please choose a new name for this RSS feed - - New folder... + + New feed name: - - Please choose a folder name + + Name already in use - - Folder name: + + This name is already used by another item, please choose another one. - - New folder + + Date: - - Please type a RSS feed URL + + Author: - - Feed URL: - + + Unread + O‘qilmagan + + + Rss::Feed - - Deletion confirmation + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... - - Are you sure you want to delete the selected RSS feeds? + + Automatically downloading '%1' torrent from '%2' RSS feed... + + + Rss::Private::Parser - - Please choose a new name for this RSS feed + + Invalid RSS feed. + + + RssSettingsDlg - - New feed name: + + RSS Reader Settings - - Rename failed + + RSS feeds refresh interval: - - Date: + + min - - Author: + + Maximum number of articles per feed: ScanFoldersDelegate - + Select save location @@ -7436,273 +6618,267 @@ ScanFoldersModel - + Monitored Folder - + Override Save Location - + Monitored folder - + Default save location - + Browse... - + Belgila... - SearchJobWidget + SearchEngine - - Form + + Unknown search engine plugin file format. - - Results(xxx) + + A more recent version of this plugin is already installed. - - Search in: + + + Plugin is not supported. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + + Update server is temporarily unavailable. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + + + Failed to download the plugin file. %1 - - Seeds: + + An incorrect update info received. - - <html><head/><body><p>Minimal number of seeds</p></body></html> + + All categories - - - to + + Movies - - <html><head/><body><p>Maximal number of seeds</p></body></html> + + TV shows - - - + + Music - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + + Games - - Size: - Hajmi: + + Anime + - - <html><head/><body><p>Minimal torrent size</p></body></html> + + Software - - <html><head/><body><p>Maximal torrent size</p></body></html> + + Pictures + + + + + Books + + + + + SearchListDelegate + + + + Unknown + + + SearchTab - + Name i.e: file name - + Size i.e: file size - + Seeders i.e: Number of full sources - + Leechers i.e: Number of partial sources - + Search engine - - Filter search results... - - - - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Torrent names only - + Everywhere - - Use regular expressions - - - - + Searching... - + Search has finished - + Search aborted - + An error occurred during search... - + Search returned no results - + Column visibility - - - SearchPluginManager - - - Unknown search engine plugin file format. - - - - - A more recent version of this plugin is already installed. - - - - - Plugin is not supported. + + Form - - All categories + + Results(xxx) - - Movies + + Search in: - - TV shows + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - - Music + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - - Games + + Seeds: - - Anime + + <html><head/><body><p>Minimal number of seeds</p></body></html> - - Software - + + + to + qayerga - - Pictures + + <html><head/><body><p>Maximal number of seeds</p></body></html> - - - Books + + + + - - Update server is temporarily unavailable. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - - - Failed to download the plugin file. %1 - + + Size: + Hajmi: - - An incorrect update info received. + + <html><head/><body><p>Minimal torrent size</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> @@ -7711,197 +6887,185 @@ - - - - + + + Search Qidiruv - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - - + Download Yuklab olish - + Go to description page - + Copy description page URL - + Search plugins... - + A phrase to search for. - + Spaces in a search term may be protected by double quotes. - + Example: Search phrase example - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - + All plugins - + Only enabled - + Select... - - - + + + Search Engine - + Please install Python to use the Search Engine. - + Empty search pattern - + Please type a search pattern first - + Stop - + Search has finished - + Search has failed - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + E&xit Now - + Exit confirmation - + The computer is going to shutdown. - + &Shutdown Now - - Shutdown confirmation - - - - + The computer is going to enter suspend mode. - + &Suspend Now - + Suspend confirmation - + The computer is going to enter hibernation mode. - + &Hibernate Now - + Hibernate confirmation - + You can cancel the action within %1 seconds. + + + Shutdown confirmation + + SpeedLimitDialog - + KiB/s @@ -7909,52 +7073,52 @@ SpeedPlotView - + Total Upload - + Total Download - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - + DHT Download - + Tracker Upload - + Tracker Download @@ -7962,95 +7126,87 @@ SpeedWidget - + Period: - + 1 Minute - + 5 Minutes - + 30 Minutes - + 6 Hours - + Select Graphs - + Total Upload - + Total Download - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - + DHT Download - + Tracker Upload - + Tracker Download - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8063,48 +7219,48 @@ - - Cache statistics + + Total peer connections: - - Read cache hits: + + Global ratio: - - Average time in queue: + + Alltime download: - - Connected peers: + + Alltime upload: - - All-time share ratio: + + Total waste (this session): - - All-time download: + + Cache statistics - - Session waste: + + Read cache hits: - - All-time upload: + + Average time in queue: - Total buffer size: + Total buffers size: @@ -8133,7 +7289,12 @@ - + + OK + + + + %1 ms 18 milliseconds @@ -8142,26 +7303,31 @@ StatusBar - + Connection status: - + No direct connections. This may indicate network configuration problems. - + DHT: %1 nodes - - qBittorrent needs to be restarted! + + qBittorrent needs to be restarted + + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. @@ -8181,982 +7347,716 @@ - + Click to switch to alternative speed limits - + Click to switch to regular speed limits - + + Manual change of rate limits mode. The scheduler is disabled. + + + + Global Download Speed Limit Global yuklab olish tezligi cheklovi - + Global Upload Speed Limit Global yuklash tezligi cheklovi - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - + Hammasi (0) - + Downloading (0) - + Seeding (0) - + Completed (0) - + Resumed (0) - + Paused (0) - + Active (0) - + Inactive (0) - + Errored (0) - + All (%1) - Hammasi (%1) + Hammasi (%1) - + Downloading (%1) - + Seeding (%1) - + Completed (%1) - + Paused (%1) - + Resumed (%1) - + Active (%1) - + Inactive (%1) - + Errored (%1) - TagFilterModel + TorrentContentModel - - Tags + + Name - - All + + Size - - Untagged + + Progress - - - TagFilterWidget - - Add tag... + + Download Priority - - Remove tag + + Remaining + + + TorrentCreatorDlg - - Remove unused tags + + Select a folder to add to the torrent - - Resume torrents - Torrentlarni davomlash + + Select a file to add to the torrent + - - Pause torrents - Torrentlarni pauza qilish + + No input path set + - - Delete torrents - Torrentlarni o‘chirib tashlash + + Please type an input path first + - - New Tag + + Select destination torrent file - - Tag: + + Torrent Files (*.torrent) - - Invalid tag name + + Torrent was created successfully: %1 + %1 is the path of the torrent - - Tag name '%1' is invalid + + + + Torrent creation - - Tag exists + + Torrent creation was unsuccessful, reason: %1 - - Tag name already exists. + + Created torrent file is invalid. It won't be added to download list. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - - - - - Name: + + Name + i.e: torrent name - - Save path: + + Size + i.e: torrent size - - Choose save path - Saqlash yo‘lagini tanlang - - - - New Category + + Done + % Done - - Invalid category name + + Status + Torrent status (e.g. downloading, seeding, paused) - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. + + Seeds + i.e. full sources (often untranslated) - - Category creation error + + Peers + i.e. partial sources (often untranslated) - - Category with the given name already exists. -Please choose a different name and try again. + + Down Speed + i.e: Download speed - - - TorrentContentModel - - Name + + Up Speed + i.e: Upload speed - - Size + + Ratio + Share ratio - - Progress + + ETA + i.e: Estimated Time of Arrival / Time left - - Download Priority + + Category - - Remaining + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 - - Availability + + Completed On + Torrent was completed on 01/01/2010 08:00 - - - TorrentCreatorDialog - - Torrent Creator + + Tracker - - Select file/folder to share + + Down Limit + i.e: Download limit - - Path: + + Up Limit + i.e: Upload limit - - [Drag and drop area] - + + Downloaded + Amount of data downloaded (e.g. in MB) + Yuklab olingan - - - Select file + + Uploaded + Amount of data uploaded (e.g. in MB) - - - Select folder + + Session Download + Amount of data downloaded since program open (e.g. in MB) - - Settings + + Session Upload + Amount of data uploaded since program open (e.g. in MB) - - Piece size: + + Remaining + Amount of data left to download (e.g. in MB) - - Auto + + Time Active + Time (duration) the torrent is active (not paused) - - 16 KiB + + Save path + Torrent save path - - 32 KiB - + + Completed + Amount of data completed (e.g. in MB) + Tugallangan - - 64 KiB + + Ratio Limit + Upload share ratio limit - - 128 KiB + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole - - 256 KiB + + Last Activity + Time passed since a chunk was downloaded/uploaded - - 512 KiB + + Total Size + i.e. Size including unwanted data + + + TrackerFiltersList - - 1 MiB - + + All (0) + this is for the tracker filter + Hammasi (0) - - 2 MiB + + Trackerless (0) - - 4 MiB + + Error (0) - - 8 MiB + + Warning (0) - - 16 MiB + + + Trackerless (%1) - - 32 MiB - + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - Calculate number of pieces: + + + Error (%1) - - Private torrent (Won't distribute on DHT network) + + + Warning (%1) - - Start seeding immediately - + + Resume torrents + Torrentlarni davomlash - - Ignore share ratio limits for this torrent - + + Pause torrents + Torrentlarni pauza qilish - - Optimize alignment - + + Delete torrents + Torrentlarni o‘chirib tashlash - - Fields - + + + All (%1) + this is for the tracker filter + Hammasi (%1) + + + TrackerList - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + + URL - - Web seed URLs: + + Status - - Tracker URLs: + + Received - - Comments: + + Seeds - - Source: + + Peers - - Progress: - + + Downloaded + Yuklab olingan - - Create Torrent + + Message - - - - Torrent creation failed + + + Working - - Reason: Path to file/folder is not readable. + + Disabled - - Select where to save the new torrent + + This torrent is private - - Torrent Files (*.torrent) + + Updating... - - Reason: %1 + + Not working - - Reason: Created torrent is invalid. It won't be added to download list. + + Not contacted yet - - Torrent creator + + Tracker URL: - - Torrent created: + + Tracker editing - - - TorrentInfo - - File size exceeds max limit %1 + + + Tracker editing failed - - Torrent file read error: %1 + + The tracker URL entered is invalid. - - Torrent file read error: size mismatch + + The tracker URL already exists. - - - TorrentsController - - Not contacted yet + + Add a new tracker... - - Updating... + + Copy tracker URL - - Working + + Edit selected tracker URL - - Not working + + Force reannounce to selected trackers - - Error: '%1' is not a valid torrent file. + + Force reannounce to all trackers - - - - - Torrent queueing must be enabled + + Remove tracker + + + TrackersAdditionDlg - - Save path cannot be empty + + Trackers addition dialog - - - Category cannot be empty + + List of trackers to add (one per line): - - - Unable to create category + + + µTorrent compatible list URL: - - Unable to edit category - + + I/O Error + I/O xatosi - - Cannot make save path + + Error while trying to open the downloaded file. - - Cannot write to directory + + No change - - WebUI Set location: moving "%1", from "%2" to "%3" + + No additional trackers were found. - - Incorrect torrent name - + + Download error + Yuklab olish xatoligi - - - Incorrect category name + + The trackers list could not be downloaded, reason: %1 - TrackerFiltersList + TransferListDelegate - - All (0) - this is for the tracker filter - + + Downloading + Yuklab olinmoqda - - Trackerless (0) - - - - - Error (0) - - - - - Warning (0) - - - - - - Trackerless (%1) - - - - - - Error (%1) - - - - - - Warning (%1) - - - - - Resume torrents - Torrentlarni davomlash - - - - Pause torrents - Torrentlarni pauza qilish - - - - Delete torrents - Torrentlarni o‘chirib tashlash - - - - - All (%1) - this is for the tracker filter - Hammasi (%1) - - - - TrackerListWidget - - - - Working - - - - - Disabled - - - - - This torrent is private - - - - - Updating... - - - - - Not working - - - - - Not contacted yet - - - - - - - - - - N/A - Noaniq - - - - Tracker editing - - - - - Tracker URL: - - - - - - Tracker editing failed - - - - - The tracker URL entered is invalid. - - - - - The tracker URL already exists. - - - - - Add a new tracker... - - - - - Remove tracker - - - - - Copy tracker URL - - - - - Edit selected tracker URL - - - - - Force reannounce to selected trackers - - - - - Force reannounce to all trackers - - - - - URL - - - - - Status - - - - - Received - - - - - Seeds - - - - - Peers - - - - - Downloaded - Yuklab olingan - - - - Message - - - - - Column visibility - - - - - TrackerLoginDialog - - - - Tracker authentication - - - - - Tracker: - - - - - Login - Kirish - - - - Username: - - - - - Password: - - - - - Log in - - - - - TrackersAdditionDialog - - - Trackers addition dialog - - - - - List of trackers to add (one per line): - - - - - µTorrent compatible list URL: - - - - - No change - - - - - No additional trackers were found. - - - - - Download error - Yuklab olish xatoligi - - - - The trackers list could not be downloaded, reason: %1 - - - - - TransferListDelegate - - - Downloading - Yuklab olinmoqda - - - + Downloading metadata used when loading a magnet link - + Allocating qBittorrent is allocating the files on disk - + Paused Pauzada - + Queued i.e. torrent is queued - + Seeding Torrent is complete and in upload-only mode Tarqatilmoqda - + Stalled Torrent is waiting for download to begin - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. - + Checking Torrent local data is being checked - + Queued for checking i.e. torrent is queued for hash checking - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - + Completed Tugallangan - - Moving - Torrent local data are being moved/relocated - - - - + Missing Files - + Errored torrent status, the torrent has an error - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - + %1 ago e.g.: 1h 20m ago @@ -9165,579 +8065,591 @@ TransferListFiltersWidget - + Status - + Categories - - Tags - - - - + Trackers - TransferListModel + TransferListWidget - - Name - i.e: torrent name + + Column visibility - - Size - i.e: torrent size - + + Choose save path + Saqlash yo‘lagini tanlang - - Done - % Done + + Torrent Download Speed Limiting - - Status - Torrent status (e.g. downloading, seeding, paused) + + Torrent Upload Speed Limiting - - Seeds - i.e. full sources (often untranslated) + + Recheck confirmation - - Peers - i.e. partial sources (often untranslated) + + Are you sure you want to recheck the selected torrent(s)? - - Down Speed - i.e: Download speed + + Rename - - Up Speed - i.e: Upload speed - + + New name: + Yangi nomi: - - Ratio - Share ratio + + Resume + Resume/start the torrent - - ETA - i.e: Estimated Time of Arrival / Time left + + Force Resume + Force Resume/start the torrent - - Category + + Pause + Pause the torrent - - Tags + + New Category - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 + + Category: - - Completed On - Torrent was completed on 01/01/2010 08:00 + + Invalid category name - - Tracker + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. - - Down Limit - i.e: Download limit + + Delete + Delete the torrent - - Up Limit - i.e: Upload limit + + Preview file... - - Downloaded - Amount of data downloaded (e.g. in MB) - Yuklab olingan + + Limit share ratio... + - - Uploaded - Amount of data uploaded (e.g. in MB) + + Limit upload rate... - - Session Download - Amount of data downloaded since program open (e.g. in MB) + + Limit download rate... - - Session Upload - Amount of data uploaded since program open (e.g. in MB) + + Open destination folder - - Remaining - Amount of data left to download (e.g. in MB) + + Move up + i.e. move up in the queue - - Time Active - Time (duration) the torrent is active (not paused) + + Move down + i.e. Move down in the queue - - Save path - Torrent save path + + Move to top + i.e. Move to top of the queue - - Completed - Amount of data completed (e.g. in MB) - Tugallangan + + Move to bottom + i.e. Move to bottom of the queue + - - Ratio Limit - Upload share ratio limit + + Set location... - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole + + Copy name - - Last Activity - Time passed since a chunk was downloaded/uploaded + + Download first and last pieces first - - Total Size - i.e. Size including unwanted data + + Automatic Torrent Management - - - TransferListWidget - - Column visibility + + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - - Choose save path - Saqlash yo‘lagini tanlang + + Category + - - Torrent Download Speed Limiting + + New... + New category... - - Torrent Upload Speed Limiting + + Reset + Reset category - - Recheck confirmation + + Priority + Dolzarblik + + + + Force recheck - - Are you sure you want to recheck the selected torrent(s)? + + Copy magnet link - - Rename + + Super seeding mode - - New name: - Yangi nomi: + + Rename... + Nomini o‘zgartirish... - - Resume - Resume/start the torrent + + Download in sequential order + + + UpDownRatioDlg - - Force Resume - Force Resume/start the torrent + + Torrent Upload/Download Ratio Limiting - - Pause - Pause the torrent + + Use global ratio limit - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" + + + + buttonGroup - - Add Tags + + Set no ratio limit - - Remove All Tags + + Set ratio limit to + + + WebApplication - - Remove all tags from selected torrents? + + Incorrect category name + + + WebUI - - Comma-separated tags: + + The Web UI is listening on port %1 - - Invalid tag + + Web UI Error - Unable to bind Web UI to port %1 + + + about - - Tag name: '%1' is invalid + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - Delete - Delete the torrent + + Copyright %1 2006-2016 The qBittorrent project - - Preview file... + + Home Page: - - Limit share ratio... + + Forum: - - Limit upload rate... + + Bug Tracker: + + + addPeersDialog - - Limit download rate... + + Add Peers - - Open destination folder + + List of peers to add (one per line): - - Move up - i.e. move up in the queue + + Format: IPv4:port / [IPv6]:port + + + authentication - - Move down - i.e. Move down in the queue + + + Tracker authentication - - Move to top - i.e. Move to top of the queue + + Tracker: - - Move to bottom - i.e. Move to bottom of the queue + + Login + Kirish + + + + Username: - - Set location... + + Password: - - Force reannounce + + Log in - - Copy name + + Cancel + + + confirmDeletionDlg - - Copy hash + + Deletion confirmation - qBittorrent - - Download first and last pieces first + + Remember choice - - Automatic Torrent Management + + Also delete the files on the hard disk + + + confirmShutdownDlg - - Automatic mode means that various torrent properties(eg save path) will be decided by the associated category + + Don't show again + + + createTorrentDialog - - Category + + Cancel - - New... - New category... + + Torrent Creation Tool - - Reset - Reset category + + Torrent file creation - - Tags + + Add file - - Add... - Add / assign multiple tags... + + Add folder - - Remove All - Remove all tags + + File or folder to add to the torrent: - - Priority - Dolzarblik + + Tracker URLs: + - - Force recheck + + Web seeds urls: - - Copy magnet link + + Comment: + Sharh: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - Super seeding mode + + Piece size: - - Rename... - Nomini o‘zgartirish... + + 16 KiB + - - Download in sequential order + + 32 KiB - - - UpDownRatioDialog - - Torrent Upload/Download Ratio Limiting + + 64 KiB - - Use global share limit + + 128 KiB - - - - buttonGroup + + 256 KiB - - Set no share limit + + 512 KiB - - Set share limit to + + 1 MiB - - ratio + + 2 MiB - - minutes + + 4 MiB - - No share limit method selected + + 8 MiB - - Please select a limit method first + + 16 MiB - - - Utils::ForeignApps - - Python detected, version: %1 + + Auto - - Python not detected + + Private (won't be distributed on DHT network if enabled) - - - WebApplication - - Unacceptable file type, only regular file is allowed. + + Start seeding after creation - - Symlinks inside alternative UI folder are forbidden. + + Ignore share ratio limits for this torrent - - Exceeded the maximum allowed file size (%1)! + + Create and save... - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' + + Progress: + + + downloadFromURL - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' + + Add torrent links - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' + + One per line (HTTP links, Magnet links and info-hashes are supported) - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' + + Download + Yuklab olish + + + + Cancel - - - WebUI - - Web UI: HTTPS setup successful + + Download from urls - - Web UI: HTTPS setup failed, fallback to HTTP + + No URL entered - - Web UI: Now listening on IP: %1, port: %2 + + Please type at least one URL. + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 + + Crash info fsutils - + + + + + Downloads @@ -9745,100 +8657,140 @@ misc - + B bytes - + KiB kibibytes (1024 bytes) - + MiB mebibytes (1024 kibibytes) - + GiB gibibytes (1024 mibibytes) - + TiB tebibytes (1024 gibibytes) - + PiB pebibytes (1024 tebibytes) - + EiB exbibytes (1024 pebibytes) - + + Python not detected + + + + + Python version: %1 + + + + /s per second - + %1h %2m e.g: 3hours 5minutes - + %1d %2h e.g: 2days 10hours - + Unknown Unknown (size) - + qBittorrent will shutdown the computer now because all downloads are complete. - + < 1m < 1 minute - + %1m e.g: 10minutes + + + Working + + + + + Updating... + + + + + Not working + + + + + Not contacted yet + + preview - + Preview selection - + The following files support previewing, please select one of them: + + + Preview + + + + + Cancel + + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_vi.ts qbittorrent-3.3.15/src/lang/qbittorrent_vi.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_vi.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_vi.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,157 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - Thông tin về qBittorrent + Thông tin về qBittorrent - + About - Thông tin về + Thông tin về - + Author - Tác giả - - - - Current maintainer - Người quản lý hiện tại - - - - Greece - Hy Lạp + Tác giả - - + + Nationality: - - + + + Name: + Tên: + + + + E-mail: - E-mail: + E-mail: - - - Name: - Tên: + + Greece + Hy Lạp - - Original author - Tác giả gốc + + Current maintainer + Người quản lý hiện tại - - France - Pháp + + Original author + Tác giả gốc - + Special Thanks - + Translators - - License - Giấy phép - - - + Libraries - Thư viện + Thư viện - + qBittorrent was built with the following libraries: - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - - - - - Forum: - - - - - Bug Tracker: - - - - - AboutDlg - - About qBittorrent - Thông tin về qBittorrent - - - About - Thông tin về - - - Author - Tác giả - - - Name: - Tên: - - - E-mail: - E-mail: - - - Greece - Hy Lạp - - - Current maintainer - Người quản lý hiện tại - - - Original author - Tác giả gốc - - - Libraries - Thư viện - - + France - Pháp + Pháp + License - Giấy phép + Giấy phép @@ -162,61 +90,67 @@ + + Browse... + Duyệt tìm... + + + Set as default save path - Đặt làm đường dẫn lưu mặc định + Đặt làm đường dẫn lưu mặc định - + Never show again Đừng hiển thị lại - + Torrent settings Cài đặt torrent - + Set as default category - + Category: - + Start torrent Khởi chạy torrent - + Torrent information - + Skip hash check Bỏ qua kiểm tra hash - + Size: Kích cỡ: - + Hash: - + Comment: Bình luận: - + Date: Ngày tháng: @@ -241,121 +175,89 @@ - - Remember last used save path - - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog - + Do not delete .torrent file - - Create subfolder - - - - - Download in sequential order - Tải về theo thứ tự tuần tự - - - - Download first and last pieces first - - - - + Normal Thông thường - + High Cao - + Maximum Tối đa - + Do not download Không được tải về - - - + + + I/O Error Lỗi I/O - + Invalid torrent Torrent không hợp lệ + + + + Already in download list - Đã có trong danh sách tải về - - - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - + Đã có trong danh sách tải về - + Not Available This comment is unavailable Không có - + Not Available This date is unavailable Không có - + Not available Không có - + Invalid magnet link Liên kết magnet không hợp lệ - + The torrent file '%1' does not exist. - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -363,135 +265,128 @@ + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + + + + Torrent is already in download list. Trackers were merged. - Torrent hiện đã có trong danh sách tải về. Các tracker đã được gộp. + Torrent hiện đã có trong danh sách tải về. Các tracker đã được gộp. + + Cannot add torrent - Không thể thêm torrent + Không thể thêm torrent + Cannot add this torrent. Perhaps it is already in adding state. - Không thể thêm torrent này. Có lẽ là nó đang được thêm vào. + Không thể thêm torrent này. Có lẽ là nó đang được thêm vào. - + This magnet link was not recognized Không nhận dạng được liên kết magnet này + Magnet link is already in download list. Trackers were merged. - Liên kết magnet hiện đã có trong danh sách tải về. Các tracker đã được gộp. + Liên kết magnet hiện đã có trong danh sách tải về. Các tracker đã được gộp. + Cannot add this torrent. Perhaps it is already in adding. - Không thể thêm torrent này. Có lẽ là nó đang được thêm vào. + Không thể thêm torrent này. Có lẽ là nó đang được thêm vào. - + Magnet link Liên kết magnet - + Retrieving metadata... Đang tiếp nhận siêu dữ liệu... - + Not Available This size is unavailable. Không có - + Free space on disk: %1 - + + Choose save path Chọn đường dẫn để lưu - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - + + Rename the file + Đổi tên tập tin - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + + New name: + Tên mới: - - Magnet link is already queued for processing. - + + + The file could not be renamed + Không thể đổi tên tập tin này - - New name: - Tên mới: + + This file name contains forbidden characters, please choose a different one. + Tên tập tin này chứa các ký tự cấm, vui lòng chọn một tên khác. - - + + This name is already in use in this folder. Please use a different name. Tên này hiện đã được dùng trong thư mục. Vui lòng sử dụng một tên khác. - + The folder could not be renamed Không thể đổi tên thư mục - + Rename... Đổi tên... - + Priority Độ ưu tiên - + Invalid metadata Siêu dữ liệu không hợp lệ - + Parsing metadata... Đang phân tích siêu dữ liệu... - + Metadata retrieval complete Hoàn tất tiếp nhận siêu dữ liệu - + Download Error Lỗi khi tải về @@ -499,325 +394,198 @@ AdvancedSettings + Disk write cache size - Kích thước bộ nhớ đệm ghi đĩa + Kích thước bộ nhớ đệm ghi đĩa - + MiB MiB - + Outgoing ports (Min) [0: Disabled] Cổng gửi (Tối thiểu) [0: Tắt] - + Outgoing ports (Max) [0: Disabled] Cổng gửi (Tối đa) [0: Tắt] - + Recheck torrents on completion Kiểm tra lại các torrent sau khi hoàn tất - + Transfer list refresh interval Khoảng thời gian làm mới danh sách truyền tải - + ms milliseconds m.gi. - + Setting Cài đặt - + Value Value set for this setting Giá trị - - - (disabled) - - - - + (auto) (tự động) - - min - minutes - - - - + All addresses - + qBittorrent Section - - + + Open documentation - + libtorrent Section - - Asynchronous I/O threads - - - - - Disk cache - - - - + s seconds gi. - + Disk cache expiry interval Khoảng thời gian hết hạn của bộ nhớ tạm trên đĩa - + Enable OS cache Bật bộ nhớ đệm của HĐH - - Guided read cache - - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - - - - - - KiB - - - - - Send buffer watermark - - - - - Send buffer low watermark - - - - - Send buffer watermark factor - - - + m minutes - ph. - - - - Prefer TCP - - - - - Peer proportional (throttles TCP) - + ph. - - Allow multiple connections from the same IP address - - - - + Resolve peer countries (GeoIP) Xử lý các quốc gia peer (GeoIP) - + Resolve peer host names Xử lý tên các máy peer - + Strict super seeding Seed cao cấp nghiêm ngặt - + Network Interface (requires restart) Giao diện mạng (cần khởi động lại) - + Optional IP Address to bind to (requires restart) - + Listen on IPv6 address (requires restart) Lắng nghe trên địa chỉ IPv6 (cần khởi động lại) - + Display notifications - + Display notifications for added torrents - + Download tracker's favicon - - Save path history length - - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - - - - - Round-robin - - - - - Fastest upload - - - - - Anti-leech - - - - - Upload choking algorithm - - - - + Confirm torrent recheck Xác nhận kiểm tra lại torrent - - Confirm removal of all tags - - - - - Always announce to all trackers in a tier - - - - - Always announce to all tiers - + Exchange trackers with other peers + Trao đổi tracker với các peer khác + Always announce to all trackers - Luôn thông báo đến tất cả tracker + Luôn thông báo đến tất cả tracker - + Any interface i.e. Any network interface Bất kỳ giao diện nào - + Save resume data interval How often the fastresume file is saved. Lưu khoảng thời gian dữ liệu bắt đầu lại - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - - - - + Maximum number of half-open connections [0: Unlimited] Số lượng tối đa các kết nối mở phân nửa [0: Không giới hạn] - + IP Address to report to trackers (requires restart) Địa chỉ IP để gửi báo cáo đến tracker (cần khởi động lại) - + Enable embedded tracker Bật tracker nhúng - + Embedded tracker port Cổng tracker nhúng - + Check for software updates Kiểm tra cập nhật phần mềm - + Use system icon theme Sử dụng bộ biểu tượng hệ thống @@ -825,124 +593,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 đã khởi chạy - + Torrent: %1, running external program, command: %2 - - Torrent name: %1 - - - - - Torrent size: %1 - - - - - Save path: %1 - - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - - - - - Thank you for using qBittorrent. - - - - - [qBittorrent] '%1' has finished downloading + + Torrent: %1, run external program command too long (length > %2), execution failed. - + Torrent: %1, sending mail notification - + Information Thông tin - - To control qBittorrent, access the Web UI at %1 - - - + To control qBittorrent, access the Web UI at http://localhost:%1 - Để kiểm soát qBittorrent, hãy truy cập Web UI tại http://localhost:%1 + Để kiểm soát qBittorrent, hãy truy cập Web UI tại http://localhost:%1 - + The Web UI administrator user name is: %1 Tên người dùng quản trị Web UI là: %1 - + The Web UI administrator password is still the default one: %1 Tên người dùng quản trị Web UI vẫn là mặc định: %1 - + This is a security risk, please consider changing your password from program preferences. Đây là một mối nguy về bảo mật, vui lòng xem xét việc thay đổi mật khẩu từ phần cài đặt của chương trình. - + Saving torrent progress... Đang lưu tiến trình torrent... - - - Portable mode and explicit profile directory options are mutually exclusive - - - - - Portable mode implies relative fastresume - - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: Lưu vào: @@ -952,823 +657,676 @@ Trình tải RSS - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - + + Enable Automated RSS Downloader + Bật trình tải RSS tự động - + Download Rules Tải về quy luật - + Rule Definition Định nghĩa quy luật - + Use Regular Expressions Sử dụng các biểu thức thông thường - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - - - - + Must Contain: Phải chứa: - + Must Not Contain: Không được chứa: - + Episode Filter: Bộ lọc phân đoạn - + Assign Category: - + Save to a Different Directory Lưu vào một thư mục khác - + Ignore Subsequent Matches for (0 to Disable) ... X days Bỏ qua các kết quả phù hợp sau này trong (0 để Tắt) - + Disabled Vô Hiệu Hóa - + days ngày - + Add Paused: Đã thêm mục tạm dừng: - + Use global settings Sử dụng cài đặt toàn cầu - + Always Luôn luôn - + Never Không bao giờ - + Apply Rule to Feeds: Áp dụng quy luật cho các Feed: - + Matching RSS Articles Các bài viết RSS phù hợp - + &Import... &Nhập... - + &Export... &Xuất... - + Matches articles based on episode filter. Chọn bài viết phù hợp dựa vào bộ lọc phân đoạn. - + Example: Ví dụ: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match sẽ tìm 2, 5, 8 thông qua 15, 30 và các phân đoạn tiếp theo của mùa một - + Episode filter rules: Quy luật lọc phân đoạn: - + Season number is a mandatory non-zero value Số mùa phải là một giá trị không âm - + Episode number is a mandatory non-zero value + Số phân đoạn phải là một giá trị không âm + + + Filter must end with semicolon Bộ lọc phải kết thúc bằng dấu chấm phẩy - + Three range types for episodes are supported: Ba loại phạm vi cho các phân đoạn được hỗ trợ: - + Single number: <b>1x25;</b> matches episode 25 of season one Số đơn: <b>1x25;</b> phù hợp với phân đoạn 25 của mùa một - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one Khoảng thông thường: <b>1x25-40;</b> phù hợp với các phân đoạn từ 25 đến 40 của mùa một - - Episode number is a mandatory positive value - - - - - Rules - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + Khoảng vô cực: <b>1x25-;</b> phù hợp với các phân đoạn từ 25 trở đi của mùa một - - Rules (legacy) + + Episode number is a mandatory positive value - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - + Last Match: %1 days ago Kết quả phù hợp gần đây: %1 ngày trước - + Last Match: Unknown Kết quả phù hợp gần đây: Không rõ - + New rule name Tên của luật mới - + Please type the name of the new download rule. Hãy gõ tên của quy luật tải về mới. - - + + Rule name conflict Xung đột tên quy luật - - + + A rule with this name already exists, please choose another name. Đã có một quy luật với tên như vậy, hãy chọn một tên khác. - + Are you sure you want to remove the download rule named '%1'? Có chắc là bạn muốn xoá quy luật tải về tên là '%1'? - + Are you sure you want to remove the selected download rules? Có chắc là bạn muốn xoá các quy luật tải về đã chọn hay không? - + Rule deletion confirmation Xác nhận xoá quy luật - + Destination directory Thư mục đích - + Invalid action - + Thao tác không hợp lệ - + The list is empty, there is nothing to export. - + Danh sách rỗng, không có dữ liệu nào để xuất. - - Export RSS rules - + + Where would you like to save the list? + Bạn muốn lưu danh sách vào đâu? - - + + Rules list (*.rssrules) + Danh sách quy luật (*.rssrules) + + + I/O Error - + Lỗi I/O - - Failed to create the destination file. Reason: %1 - + + Failed to create the destination file + Thất bại khi tạo tập tin đích - - Import RSS rules - + + Please point to the RSS download rules file + Vui lòng chọn tập tin quy luật tải về RSS - - Failed to open the file. Reason: %1 - + + Rules list + Danh sách quy luật - + Import Error - + Lỗi khi nhập - - Failed to import the selected rules file. Reason: %1 - + + Failed to import the selected rules file + Thất bại khi nhập tập tin quy luật đã chọn - + Add new rule... Thêm quy luật mới... - + Delete rule Xoá quy luật - + Rename rule... Đổi tên quy luật... - + Delete selected rules Xoá các quy luật đã chọn - - Clear downloaded episodes... - - - - + Rule renaming Đổi tên quy luật - + Please type the new rule name Vui lòng gõ tên quy luật mới - - Clear downloaded episodes - - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - - - - - - Position %1: %2 - + + Regex mode: use Perl-like regular expressions + Chế độ Regex: sử dụng các biểu thức thông thường dạng Perl - + Wildcard mode: you can use - + ? to match any single character - + * to match zero or more of any characters - + Whitespaces count as AND operators (all words, any order) - + | is used as OR operator - + If word order is important use * instead of whitespace. - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - + will match all articles. - + will exclude all articles. - - - BanListOptions - - Delete - Xóa - - - - BanListOptionsDialog - - - List of banned IP addresses - - - - - Ban IP - - - - - Delete - Xóa - - - - - Warning - - - - The entered IP address is invalid. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + Chế độ Wildcard: bạn có thể sử dụng<ul><li>? để thay cho bất kỳ ký tự đơn lẻ nào</li><li>* thay cho 0 hoặc nhiều hơn ký tự bất kỳ</li><li>Khoảng trắng được xem như toán tử AND</li></ul> - - The entered IP is already banned. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + Chế độ Wildcard: bạn có thể sử dụng<ul><li>? để thay cho bất kỳ ký tự đơn lẻ nào</li><li>* thay cho 0 hoặc nhiều hơn ký tự bất kỳ</li><li>| được xem như toán tử OR</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support - - Could not get GUID of configured network interface. Binding to IP %1 - - - - + Embedded Tracker [ON] - + Failed to start the embedded tracker! - + Embedded Tracker [OFF] - + + '%1' reached the maximum ratio you set. Removing... + + + + + '%1' reached the maximum ratio you set. Pausing... + + + + System network status changed to %1 e.g: System network status changed to ONLINE - + ONLINE - + OFFLINE - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. - - + Encryption support [%1] - - + FORCED - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - - - - - + Anonymous mode [%1] - + Unable to decode '%1' torrent file. - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' - + Queue positions were corrected in %1 resume files - + Couldn't save '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - - - - + because %1 is disabled. this peer was blocked because uTP is disabled. - + because %1 is disabled. this peer was blocked because TCP is disabled. - + URL seed lookup failed for URL: '%1', message: %2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 - + The network interface defined is invalid: %1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 - - Peer ID: - - - - - HTTP User-Agent is '%1' - - - - - + DHT support [%1] - - - - - - - - - + + + + ON - - - - - - - - - + + + + OFF - - + Local Peer Discovery support [%1] - - PeX support [%1] - - - - - '%1' reached the maximum ratio you set. Removed. - - - - - '%1' reached the maximum ratio you set. Paused. - - - - - '%1' reached the maximum seeding time you set. Removed. - - - - - '%1' reached the maximum seeding time you set. Paused. - - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface - + Tracker '%1' was added to torrent '%2' - + Tracker '%1' was deleted from torrent '%2' - + URL seed '%1' was added to torrent '%2' - + URL seed '%1' was removed from torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Error: Failed to parse the provided IP filter. - - '%1' restored. - 'torrent name' restored. + + Couldn't add torrent. Reason: %1 - - Couldn't add torrent. Reason: %1 + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) - + '%1' added to download list. 'torrent name' was added to download list. - + An I/O error occurred, '%1' paused. %2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 - + due to IP filter. this peer was blocked due to ip filter. - + due to port filter. this peer was blocked due to port filter. - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. - + because it has a low port. this peer was blocked because it has a low port. - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 - + External IP: %1 e.g. External IP: 192.168.0.1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + File sizes mismatch for torrent '%1', pausing it. - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... @@ -1776,17 +1334,17 @@ CategoryFilterModel - + Categories - + All - + Uncategorized @@ -1805,34 +1363,67 @@ - Edit category... - - - - Remove category - + Remove unused categories - + Resume torrents - + Pause torrents - + Delete torrents + + + New Category + + + + + Category: + + + + + Invalid category name + + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + CookiesDialog @@ -1871,90 +1462,34 @@ - DeletionConfirmationDialog - - - Deletion confirmation - - - - - Remember choice - Nhớ lựa chọn của tôi - - - - Also delete the files on the hard disk - Đồng thời xóa các tập tin trên ổ đĩa - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - Bạn có chắc muốn xóa %1 torrent từ danh sách truyền tải ? - - - - DeletionConfirmationDlg - - Are you sure you want to delete these %1 torrents from the transfer list? - Are you sure you want to delete these 5 torrents from the transfer list? - Bạn có chắc muốn xóa %1 torrent từ danh sách truyền tải ? - - - - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - Thêm vào đường dẫn torrent - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - Tải về - - - - No URL entered - Chưa điền vào đường dẫn - - - - Please type at least one URL. - Xin vui lòng nhập vào ít nhất một đường dẫn. + Bạn có chắc muốn xóa %1 torrent từ danh sách truyền tải ? DownloadedPiecesBar - + White: Missing pieces - + Green: Partial pieces - + Blue: Completed pieces @@ -1962,34 +1497,23 @@ ExecutionLog + General - Tổng Quan - - - Blocked IPs - Các IP bị chặn - - - - ExecutionLogWidget - - - General - Tổng Quan + Tổng Quan - + Blocked IPs - Các IP bị chặn + Các IP bị chặn - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> was banned x.y.z.w was banned @@ -1998,508 +1522,514 @@ FeedListWidget - + RSS feeds Feed dạng RSS - - - Unread (%1) - + + Unread + Chưa đọc FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. + + An error occured while trying to open the log file. Logging to file is disabled. - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - - - - - &Browse... - Launch file dialog button text (full) - - - - - Choose a file - Caption for file open/save dialog - - + FilterParserThread - - Choose a folder - Caption for directory open dialog + + + + I/O Error: Could not open ip filter file in read mode. - - Any file + + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. - FilterParserThread + GeoIPDatabase - - - - I/O Error: Could not open IP filter file in read mode. + + + Unsupported database file size. - - - - IP filter line %1 is malformed. + + Metadata error: '%1' entry not found. - - - IP filter line %1 is malformed. Start IP of the range is malformed. + + Metadata error: '%1' entry has invalid type. - - - IP filter line %1 is malformed. End IP of the range is malformed. + + Unsupported database version: %1.%2 - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! + + Unsupported IP version: %1 - - - IP filter exception thrown for line %1. Exception is: %2 + + Unsupported record size: %1 - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. + + Invalid database type: %1 - - - - - - - - Parsing Error: The filter file is not a valid PeerGuardian P2B file. + + Database corrupted: no data section found. - GeoIPDatabase + HttpServer - - - Unsupported database file size. - + + File + Tập tin - - Metadata error: '%1' entry not found. - + + Edit + Chỉnh sửa - - Metadata error: '%1' entry has invalid type. - - - - - Unsupported database version: %1.%2 - - - - - Unsupported IP version: %1 - - - - - Unsupported record size: %1 - - - - - Invalid database type: %1 - - - - - Database corrupted: no data section found. - - - - - Http::Connection - - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - - - - - Bad Http request, closing socket. IP: %s - + + Help + Trợ giúp - - - HttpServer - + Exit qBittorrent - + Only one link per line Mỗi dòng chỉ chứa một liên kết - + + Download + Tải về + + + Global upload rate limit must be greater than 0 or disabled. - + Global download rate limit must be greater than 0 or disabled. - + Alternative upload rate limit must be greater than 0 or disabled. - + Alternative download rate limit must be greater than 0 or disabled. - + Maximum active downloads must be greater than -1. - + Maximum active uploads must be greater than -1. - + Maximum active torrents must be greater than -1. - + Maximum number of connections limit must be greater than 0 or disabled. Giới hạn số lượng tối đa các kết nối phải lớn hơn 0 nếu không sẽ bị vô hiệu hóa. - + Maximum number of connections per torrent limit must be greater than 0 or disabled. Giới hạn số lượng tối đa các kết nối của mỗi torrent phải lớn hơn 0 nếu không sẽ bị vô hiệu hóa. - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. Giới hạn số lượng tối đa các phần tải lên của mỗi torrent phải lớn hơn 0 nếu không sẽ bị vô hiệu hóa. - + Unable to save program preferences, qBittorrent is probably unreachable. Không thể lưu các tùy biến của chương trình, qBittorrent có thể không thể được điều khiển theo mong muốn. + + Language + Ngôn ngữ giao diện + + + + The port used for incoming connections must be between 1 and 65535. + + + + + The port used for the Web UI must be between 1 and 65535. + + + + + Unable to log in, qBittorrent is probably unreachable. + + + + + Invalid Username or Password. + + + + + Password + + + + + Login + Đăng nhập + + - IRC: #qbittorrent on Freenode + Upload Failed! - Invalid category name: -Please do not use any special characters in the category name. + Original authors - Unknown - Chưa rõ + Upload limit: + - Hard Disk + Download limit: - Share ratio limit must be between 0 and 9998. + Apply - Seeding time limit must be between 0 and 525600 minutes. + Add - - The port used for incoming connections must be between 1 and 65535. + + Category: - - The port used for the Web UI must be between 1 and 65535. + + Upload Torrents + Upload torrent files to qBittorent using WebUI - - Unable to log in, qBittorrent is probably unreachable. + + All - - Invalid Username or Password. + + Downloading + Đang tải về + + + + Seeding + Đang seed + + + + Completed - - Username + + Resumed - - Password + + Paused + Tạm dừng + + + + Active - - Login - Đăng nhập + + Inactive + - - Original authors + + Save files to location: - - Apply + + Cookie: - - Add + + Type folder here - - Upload Torrents - Upload torrent files to qBittorent using WebUI + + Run an external program on torrent completion - - Save files to location: + + Enable bandwidth management (uTP) - - Cookie: + + Apply rate limit to uTP connections - - Type folder here + + Alternative Global Rate Limits - + More information - + Information about certificates - + Save Files to - - Set location + + Watch Folder - - Limit upload rate + + Default Folder - - Limit download rate + + from + from time1 to time2 - - Rename torrent + + to + from time1 to time2 - - Unable to create category + + Other... + Save Files to: Watch Folder / Default Folder / Other... - - Other... - Save Files to: Watch Folder / Default Folder / Other... + + Every day + Schedule the use of alternative rate limits on ... - + + Week days + Schedule the use of alternative rate limits on ... + + + + + Week ends + Schedule the use of alternative rate limits on ... + + + + Monday Schedule the use of alternative rate limits on ... - + Tuesday Schedule the use of alternative rate limits on ... - + Wednesday Schedule the use of alternative rate limits on ... - + Thursday Schedule the use of alternative rate limits on ... - + Friday Schedule the use of alternative rate limits on ... - + Saturday Schedule the use of alternative rate limits on ... - + Sunday Schedule the use of alternative rate limits on ... - + + Downloaded + Is the file downloaded or not? + Đã được tải về + + + Logout - + + Download from URLs + + + + Download Torrents from their URLs or Magnet links - + Upload local torrent - + Are you sure you want to delete the selected torrents from the transfer list? - + Save Lưu lại - + qBittorrent client is not reachable Hiện không thể kết nối đến máy trạm của qBittorrent - - qBittorrent has been shutdown. - qBittorrent đã bị tắt đi. - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - + + HTTP Server + Máy chủ HTTP - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - + + The following parameters are supported: + Các thông số sau hiện được hỗ trợ là: - - Add subnet - + + Torrent path + Đường dẫn torrent - - Delete - Xóa + + Torrent name + Tên torrent - - Error - + + qBittorrent has been shutdown. + qBittorrent đã bị tắt đi. + + + LineEdit - - The entered subnet is invalid. - + + Clear the text + Xóa phần nội dung văn bản LogListWidget - + Copy Sao chép - + Clear Dọn dẹp phần nội dung @@ -2532,550 +2062,491 @@ - + &View &Chế Độ Xem - + &Options... &Tùy Chọn... - + &Resume &Hoạt Động Trở Lại - + Torrent &Creator - + Set Upload Limit... - + Set Download Limit... - + Set Global Download Limit... - + Set Global Upload Limit... - + Minimum Priority - + Top Priority - + Decrease Priority - + Increase Priority - - + + Alternative Speed Limits - + &Top Toolbar - + Display Top Toolbar - - Status &Bar - - - - + S&peed in Title Bar - + Show Transfer Speed in Title Bar - + &RSS Reader - + Search &Engine - + L&ock qBittorrent - + Do&nate! - - Close Window - - - - + R&esume All Đ&ưa tất cả hoạt động trở lại - + Manage Cookies... - + Manage stored network cookies - + Normal Messages - + Information Messages - + Warning Messages - + Critical Messages - + &Log - + &Exit qBittorrent - + &Suspend System - + &Hibernate System - + S&hutdown System - + &Disabled - + &Statistics - + Check for Updates - + Check for Program Updates - + &About T&hông tin - + &Pause T&ạm Dừng - + &Delete X&óa - + P&ause All Tạ&m Dừng Tất Cả - + &Add Torrent File... - + Open - + E&xit - + Open URL - + &Documentation &Tài Liệu Hướng Dẫn - + Lock - - - + + + Show Hiển Thị - + Check for program updates Kiểm tra cập nhật chương trình - + Add Torrent &Link... - + If you like qBittorrent, please donate! Nếu Bạn Thích qBittorrent, Hãy Ủng Hộ Chúng Tôi! - - + Execution Log Thi Hành Việc Cập Nhật Nhật Trình - + Clear the password Xóa phần mật khẩu - + Filter torrent list... - + &Set Password - - Preferences - - - - + &Clear Password - + Transfers Truyền Đổi - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Quản Lý Định Dạng Tập Tin Của Torrent - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent không phải là ứng dụng mặc định để mở các tập tin torrent hoặc liên kết dạng Magnet. Bạn có muốn qBittorrent đảm nhiệm mặc định cho thao tác mở các tập tin torrent và liên kết dạng Magnet không? - + Icons Only - + Text Only - + Text Alongside Icons - + Text Under Icons - + Follow System Style - - - + + + UI lock password Mật Khẩu Khóa Lại Giao Diện - - - + + + Please type the UI lock password: Vui Lòng Điền Vào Mật Khẩu Khóa Lại Giao Diện: - + The password should contain at least 3 characters Mật Khẩu Nên Chứa Ít Nhất 3 Ký Tự - + Password update Cập Nhật Mật Khẩu - + The UI lock password has been successfully updated Mật Khẩu Khóa Giao Diện Đã Được Cập Nhật Thành Công - + Are you sure you want to clear the password? Bạn có chắc bạn muốn xóa đi phần mật khẩu? - - Use regular expressions - - - - + Search Tìm Kiếm - + Transfers (%1) Truyền Đổi (%1) - + Error - + Failed to add torrent: %1 - + Torrent added - + '%1' was added. e.g: xxx.avi was added. - + Download completion Tải Về Hoàn Tất - + I/O Error i.e: Input/Output Error Lỗi Về Nhập/Xuất Dữ Liệu - + Recursive download confirmation Xác Nhận Tải Về Đệ Quy - + Yes Đồng Ý - + No Không Đồng Ý - + Never Không Bao Giờ - + Global Upload Speed Limit Giới Hạn Tốc Độ Tải Lên Chung - + Global Download Speed Limit Giới Hạn Tốc Độ Tải Xuống Chung - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - - - - - Are you sure you want to quit qBittorrent? - - - - + &No K&hông Đồng Ý - + &Yes &Đồng Ý - + &Always Yes - - %1/s - s is a shorthand for seconds - - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. - + qBittorrent Update Available - + + A new version is available. +Do you want to download %1? + + + + Already Using the Latest qBittorrent Version - + Undetermined Python version - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -3083,155 +2554,151 @@ - + The torrent '%1' contains torrent files, do you want to proceed with their download? - + Couldn't download file at URL '%1', reason: %2. - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin - - + + Couldn't determine your Python version (%1). Search engine disabled. + + + + + Missing Python Interpreter - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? - + Python is required to use the search engine but it does not seem to be installed. - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. - + &Check for Updates - + Checking for Updates... - + Already checking for program updates in the background Đã thực thi việc kiểm tra bản cập nhật ở chế độ nền - + Python found in '%1' - + Download error Lỗi khi tải về - + Python setup could not be downloaded, reason: %1. Please install it manually. - - + + Invalid password Mật Khẩu Không Hợp Lệ - - - + + RSS (%1) - + URL download error - + The password is invalid Phần Mật Khẩu Không Hợp Lệ - - + + DL speed: %1 e.g: Download speed: 10 KiB/s - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version - + Hide Ẩn Đi - + Exiting qBittorrent Thoát Khỏi qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + Một Số Tập Tin Hiện Đang Trong Quá Trình Truyền Tải. +Bạn Có Chắc Rằng Bạn Vẫn Muốn Thoát Chứ? + + + Open Torrent Files Mở Các Tập Tin Torrent - + Torrent Files Các Tập Tin Torrent - + Options were saved successfully. Các Tùy Chọn Đã Được Lưu Thành Công. @@ -3239,52 +2706,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. - + Dynamic DNS error: hostname supplied does not exist under specified account. - + Dynamic DNS error: Invalid username/password. - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. - + Dynamic DNS error: Your username was blocked due to abuse. - + Dynamic DNS error: supplied domain name is invalid. - + Dynamic DNS error: supplied username is too short. - + Dynamic DNS error: supplied password is too short. @@ -3292,1413 +2759,1303 @@ Net::DownloadHandler - + I/O Error Lỗi I/O - + The file size is %1. It exceeds the download limit of %2. - + Unexpected redirect to magnet URI. - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. - - + + Couldn't load GeoIP database. Reason: %1 - + Venezuela, Bolivarian Republic of - + Viet Nam - - + + N/A - + Andorra - + United Arab Emirates - + Afghanistan - + Antigua and Barbuda - + Anguilla - + Albania - + Armenia - + Angola - + Antarctica - + Argentina - + American Samoa - + Austria - + Australia - + Aruba - + Azerbaijan - + Bosnia and Herzegovina - + Barbados - + Bangladesh - + Belgium - + Burkina Faso - + Bulgaria - + Bahrain - + Burundi - + Benin - + Bermuda - + Brunei Darussalam - + Brazil - + Bahamas - + Bhutan - + Bouvet Island - + Botswana - + Belarus - + Belize - + Canada - + Cocos (Keeling) Islands - + Congo, The Democratic Republic of the - + Central African Republic - + Congo - + Switzerland - + Cook Islands - + Chile - + Cameroon - + China - + Colombia - + Costa Rica - + Cuba - + Cape Verde - + Curacao - + Christmas Island - + Cyprus - + Czech Republic - + Germany - + Djibouti - + Denmark - + Dominica - + Dominican Republic - + Algeria - + Ecuador - + Estonia - + Egypt - + Western Sahara - + Eritrea - + Spain - + Ethiopia - + Finland - + Fiji - + Falkland Islands (Malvinas) - + Micronesia, Federated States of - + Faroe Islands - + France Pháp - + Gabon - + United Kingdom - + Grenada - + Georgia - + French Guiana - + Ghana - + Gibraltar - + Greenland - + Gambia - + Guinea - + Guadeloupe - + Equatorial Guinea - + Greece Hy Lạp - + South Georgia and the South Sandwich Islands - + Guatemala - + Guam - + Guinea-Bissau - + Guyana - + Hong Kong - + Heard Island and McDonald Islands - + Honduras - + Croatia - + Haiti - + Hungary - + Indonesia - + Ireland - + Israel - + India - + British Indian Ocean Territory - + Iraq - + Iran, Islamic Republic of - + Iceland - + Italy - + Jamaica - + Jordan - + Japan - + Kenya - + Kyrgyzstan - + Cambodia - + Kiribati - + Comoros - + Saint Kitts and Nevis - + Korea, Democratic People's Republic of - + Korea, Republic of - + Kuwait - + Cayman Islands - + Kazakhstan - + Lao People's Democratic Republic - + Lebanon - + Saint Lucia - + Liechtenstein - + Sri Lanka - + Liberia - + Lesotho - + Lithuania - + Luxembourg - + Latvia - + Morocco - + Monaco - + Moldova, Republic of - + Madagascar - + Marshall Islands - + Mali - + Myanmar - + Mongolia - + Northern Mariana Islands - + Martinique - + Mauritania - + Montserrat - + Malta - + Mauritius - + Maldives - + Malawi - + Mexico - + Malaysia - + Mozambique - + Namibia - + New Caledonia - + Niger - + Norfolk Island - + Nigeria - + Nicaragua - + Netherlands - + Norway - + Nepal - + Nauru - + Niue - + New Zealand - + Oman - + Panama - + Peru - + French Polynesia - + Papua New Guinea - + Philippines - + Pakistan - + Poland - + Saint Pierre and Miquelon - + Puerto Rico - + Portugal - + Palau - + Paraguay - + Qatar - + Reunion - + Romania - + Russian Federation - + Rwanda - + Saudi Arabia - + Solomon Islands - + Seychelles - + Sudan - + Sweden - + Singapore - + Slovenia - + Svalbard and Jan Mayen - + Slovakia - + Sierra Leone - + San Marino - + Senegal - + Somalia - + Suriname - + Sao Tome and Principe - + El Salvador - + Syrian Arab Republic - + Swaziland - + Turks and Caicos Islands - + Chad - + French Southern Territories - + Togo - + Thailand - + Tajikistan - + Tokelau - + Turkmenistan - + Tunisia - + Tonga - - Could not decompress GeoIP database file. - - - - + Timor-Leste - + Bolivia, Plurinational State of - + Bonaire, Sint Eustatius and Saba - + Cote d'Ivoire - + Libya - + Saint Martin (French part) - + Macedonia, The Former Yugoslav Republic of - + Macao - + Pitcairn - + Palestine, State of - + Saint Helena, Ascension and Tristan da Cunha - + South Sudan - + Sint Maarten (Dutch part) - + Turkey - + Trinidad and Tobago - + Tuvalu - + Taiwan - + Tanzania, United Republic of - + Ukraine - + Uganda - + United States Minor Outlying Islands - + United States - + Uruguay - + Uzbekistan - + Holy See (Vatican City State) - + Saint Vincent and the Grenadines - + Virgin Islands, British - + Virgin Islands, U.S. - + Vanuatu - + Wallis and Futuna - + Samoa - + Yemen - + Mayotte - + Serbia - + South Africa - + Zambia - + Montenegro - + Zimbabwe - + Aland Islands - + Guernsey - + Isle of Man - + Jersey - + Saint Barthelemy - + + Could not uncompress GeoIP database file. + + + + Couldn't save downloaded GeoIP database file. - + Successfully updated GeoIP database. - + Couldn't download GeoIP database file. Reason: %1 @@ -4706,12 +4063,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] - + UPnP / NAT-PMP support [OFF] @@ -4719,7 +4076,7 @@ Net::Smtp - + Email Notification Error: @@ -4727,1277 +4084,1077 @@ OptionsDialog - + Options - + Behavior - + Downloads Tải về - + Connection Kết nối - + Speed - + BitTorrent - - RSS - - - - + Web UI - + Advanced - + Language - + Ngôn ngữ giao diện - + User Interface Language: - + (Requires restart) - + Transfer List - + Confirm when deleting torrents - + Use alternating row colors In transfer list, one every two rows will have grey background. - + Hide zero and infinity values - + Always Luôn luôn - + Paused torrents only - + Action on double-click - + Downloading torrents: - - + + Start / Stop Torrent - - + + Open destination folder Mở thư mục đích - - + + No action - + Completed torrents: - + Desktop - + Start qBittorrent on Windows start up - + Show splash screen on start up - + Start qBittorrent minimized - + Confirmation on exit when torrents are active - + Confirmation on auto-exit when downloads finish - - KiB - - - - - Email notification &upon download completion - - - - - Run e&xternal program on torrent completion - - - - - IP Fi&ltering - - - - - Schedule &the use of alternative rate limits - - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - - - - &Torrent Queueing - - - - - Seed torrents until their seeding time reaches - - - - - A&utomatically add these trackers to new downloads: - - - - - RSS Reader - - - - - Enable fetching RSS feeds - - - - - Feeds refresh interval: - - - - - Maximum number of articles per feed: - - - - - - min - minutes - - - - - RSS Torrent Auto Downloader - - - - - Enable auto downloading of RSS torrents - - - - - Edit auto downloading rules... - - - - - Web User Interface (Remote control) - - - - - IP address: - - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - - - - - Server domains: - - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - - - - - &Use HTTPS instead of HTTP - - - - - Bypass authentication for clients on localhost - - - - - Bypass authentication for clients in whitelisted IP subnets - - - - - IP subnet whitelist... + + Show qBittorrent in notification area - - Upda&te my dynamic domain name - - - - + Minimize qBittorrent to notification area - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. - + Tray icon style: - + Normal - + Monochrome (Dark theme) - + Monochrome (Light theme) - + File association - + Use qBittorrent for .torrent files - + Use qBittorrent for magnet links - + Power Management - + + Inhibit system sleep when torrents are active + + + + + Log file + + + + Save path: - + Backup the log file after: - + + MB + + + + Delete backup logs older than: - + days Delete backup logs older than 10 months - + months Delete backup logs older than 10 months - + years Delete backup logs older than 10 years - + When adding a torrent - + + Display torrent content and some options + + + + Bring torrent dialog to the front - + Do not start the download automatically The torrent will be added to download list in pause state - + Should the .torrent file be deleted after adding it - + + Delete .torrent files afterwards + + + + Also delete .torrent files whose addition was cancelled - + Also when addition is cancelled - + Warning! Data loss possible! - + Saving Management - + Default Torrent Management Mode: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category - + Manual - + Automatic - + When Torrent Category changed: - + Relocate torrent - + Switch torrent to Manual Mode - + When Default Save Path changed: - - + + Relocate affected torrents - - + + Switch affected torrents to Manual Mode - + When Category changed: - + Use Subcategories - + Default Save Path: - + Keep incomplete torrents in: - + Copy .torrent files to: - - Show &qBittorrent in notification area + + Copy .torrent files for finished downloads to: - - &Log file + + Pre-allocate disk space for all files - - Display &torrent content and some options + + Append .!qB extension to incomplete files - - Create subfolder for torrents with multiple files + + Automatically add torrents from: - - De&lete .torrent files afterwards + + Add entry - - Copy .torrent files for finished downloads to: - - - - - Pre-allocate disk space for all files - - - - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding - - - - - Append .!qB extension to incomplete files - - - - - Enable recursive download dialog - - - - - Automatically add torrents from: + + Remove entry - - Add entry + + Email notification upon download completion - - Remove entry + + Destination email: - + SMTP server: - + This server requires a secure connection (SSL) - - + + + Authentication - - - - + + + + Username: Tên người dùng: - - - - + + + + Password: Mật khẩu: - - Enabled protocol: + + Run external program on torrent completion - - TCP and μTP - - - - + Listening Port - + Port used for incoming connections: - + Random - + Use UPnP / NAT-PMP port forwarding from my router - + Use different port on each startup - + Connections Limits - + Maximum number of connections per torrent: - + Global maximum number of connections: - + Maximum number of upload slots per torrent: - + Global maximum number of upload slots: - + Proxy Server - + Type: - + (None) - + SOCKS4 - + SOCKS5 - + HTTP - + Host: - - + + Port: - + Otherwise, the proxy server is only used for tracker connections - + Use proxy for peer connections - + Disable connections not supported by proxies - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection - + Use proxy only for torrents - - A&uthentication + + Info: The password is saved unencrypted - - Info: The password is saved unencrypted + + IP Filtering - + Filter path (.dat, .p2p, .p2b): - + Reload the filter - - Manually banned IP addresses... - - - - + Apply to trackers - + Global Rate Limits - - - - - - - KiB/s - - - - - + + Upload: + + + + KiB/s - KiB/giây + KiB/giây - - + + Download: - + Alternative Rate Limits - - + + Schedule the use of alternative rate limits + + + + From: from (time1 to time2) - - + To: time1 to time2 - + When: - + Every day - + Weekdays - + Weekends - + Rate Limits Settings - + Apply rate limit to peers on LAN - + Apply rate limit to transport overhead - - + + + Enable µTP protocol + + + + Apply rate limit to µTP protocol - + Privacy - + Enable DHT (decentralized network) to find more peers - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - + Enable Peer Exchange (PeX) to find more peers - + Look for peers on your local network - + Enable Local Peer Discovery to find more peers - + Encryption mode: - + Prefer encryption - + Require encryption - + Disable encryption - + Enable when using a proxy or a VPN connection - + Enable anonymous mode - - Maximum active downloads: - - - - - Maximum active uploads: - - - - - Maximum active torrents: + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - - Do not count slow torrents in these limits + + Torrent Queueing - - Upload rate threshold: + + Maximum active downloads: - - Download rate threshold: + + Maximum active uploads: - - sec - seconds + + Maximum active torrents: - - Torrent inactivity timer: + + Do not count slow torrents in these limits - + Share Ratio Limiting - + Seed torrents until their ratio reaches - + then - + Pause them - + Remove them - - RSS Smart Episode Filters + + Automatically add these trackers to new downloads: - - Use UPnP / NAT-PMP to forward the port from my router + + Enable Web User Interface (Remote control) - - Certificate: + + Use UPnP / NAT-PMP to forward the port from my router - - Import SSL Certificate + + Use HTTPS instead of HTTP - - Key: + + Certificate: - - Import SSL Key + + Import SSL Certificate - - <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> + + Key: - - Use alternative Web UI + + Import SSL Key - - Files location: + + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> - - Enable clickjacking protection + + Bypass authentication for localhost - - Enable Cross-Site Request Forgery (CSRF) protection + + Update my dynamic domain name - + Service: - + Register - + Domain name: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): - + %N: Torrent name - + %L: Category - - %G: Tags (seperated by comma) - - - - + %F: Content path (same as root path for multifile torrent) - + %R: Root path (first torrent subdirectory path) - + %D: Save path - + %C: Number of files - + %Z: Torrent size (bytes) - + %T: Current tracker - + %I: Info hash - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor - + Folder is already being monitored: - + Folder does not exist: - + Folder is not readable: - + Adding entry failed - - - - + + Choose export directory - - - + + + + + + Choose a save directory - + Choose an IP filter file - + All supported filters - + SSL Certificate - + + SSL Key + + + + Parsing error - + Failed to parse the provided IP filter - + Successfully refreshed - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number - + Invalid key - + This is not a valid SSL key. - + Invalid certificate - - Preferences - - - - - Import SSL certificate - - - - + This is not a valid SSL certificate. - - Import SSL key - - - - - SSL key - - - - + Time Error - + The start time and the end time can't be the same. - - + + Length Error - + The Web UI username must be at least 3 characters long. - + The Web UI password must be at least 6 characters long. @@ -6005,72 +5162,72 @@ PeerInfo - - Interested(local) and Choked(peer) + + interested(local) and choked(peer) - + interested(local) and unchoked(peer) - + interested(peer) and choked(local) - + interested(peer) and unchoked(local) - + optimistic unchoke - + peer snubbed - + incoming connection - + not interested(local) and unchoked(peer) - + not interested(peer) and unchoked(local) - + peer from PEX - + peer from DHT - + encrypted traffic - + encrypted handshake - + peer from LSD @@ -6078,180 +5235,165 @@ PeerListWidget - + IP IP - + Port - + Flags Cờ Đánh Dấu - + Connection Kết nối - + Client i.e.: Client application Máy trạm - + Progress i.e: % downloaded Tiến độ - + Down Speed i.e: Download speed Tốc độ tải về - + Up Speed i.e: Upload speed Tốc độ tải lên - + Downloaded i.e: total data downloaded Đã tải về - + Uploaded i.e: total data uploaded Đã tải lên - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. - + Files i.e. files that are being downloaded right now - + Column visibility Chế độ hiển thị cột - + Add a new peer... Thêm vào một mạng ngang hàng mới... - - + + Ban peer permanently Luôn cấm mạng ngang hàng - + Manually adding peer '%1'... - + The peer '%1' could not be added to this torrent. - + Manually banning peer '%1'... - - + + Peer addition Bổ sung mạng ngang hàng - + Country - + Copy IP:port - + Some peers could not be added. Check the Log for details. - + The peers were added to this torrent. - + Are you sure you want to ban permanently the selected peers? Bạn có chắc muốn cấm hoàn toàn những mạng ngang hàng mà bạn đã lựa chọn hay không? - + &Yes &Đồng Ý - + &No K&hông Đồng Ý - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - + PeersAdditionDlg - + No peer entered - + Please type at least one peer. - + Invalid peer - + The peer '%1' is invalid. @@ -6259,12 +5401,12 @@ PieceAvailabilityBar - + White: Unavailable pieces - + Blue: Available pieces @@ -6272,374 +5414,288 @@ PiecesBar - + Files in this piece: - + File in this piece - + File in these pieces - - Wait until metadata become available to see detailed information - - - - + Hold Shift key for detailed information - PluginSelectDialog + PluginSelectDlg - + Search plugins - + Installed search plugins: - + Name Tên - + Version - + Url - - + + Enabled - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + Check for updates - + Close - + Uninstall - - - + + + Yes Đồng Ý - - - - + + + + No Không Đồng Ý - + Uninstall warning - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + Uninstall success - + All selected plugins were uninstalled successfully - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - - - - - + + New search engine plugin URL - - + + URL: - + Invalid link - + The link doesn't seem to point to a search engine plugin. - + Select search plugins - + qBittorrent search plugin - + + + + Search plugin update + + + + All your plugins are already up to date. - + Sorry, couldn't check for plugin updates. %1 - + + + Search plugin install - - Couldn't install "%1" search engine plugin. %2 + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine - - Couldn't update "%1" search engine plugin. %2 + + Couldn't install "%1" search engine plugin. %2 - - - PluginSelectDlg - - Name - Tên - - Yes - Đồng Ý + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + - No - Không Đồng Ý + + Couldn't update "%1" search engine plugin. %2 + - PluginSourceDialog + PluginSourceDlg - + Plugin source - + Search plugin source: - + Local file - + Web link - PowerManagement - - - qBittorrent is active - - - - PreviewSelect + Name - Tên - - - Size - Kích thước - - - Progress - Tiến độ - - - Preview impossible - Không thể xem sơ lược - - - Sorry, we can't preview this file - Rất tiếc, chúng tôi không thể cung cấp phần xem sơ lược cho tập tin này - - - - PreviewSelectDialog - - - Preview - Xem sơ lược - - - - Name - Tên + Tên - + Size - Kích thước + Kích thước - + Progress - Tiến độ + Tiến độ - - + + Preview impossible - Không thể xem sơ lược + Không thể xem sơ lược - - + + Sorry, we can't preview this file - Rất tiếc, chúng tôi không thể cung cấp phần xem sơ lược cho tập tin này - - - - Private::FileLineEdit - - - '%1' does not exist - - - - - '%1' does not point to a directory - - - - - '%1' does not point to a file - - - - - Does not have read permission in '%1' - - - - - Does not have write permission in '%1' - + Rất tiếc, chúng tôi không thể cung cấp phần xem sơ lược cho tập tin này PropListDelegate - + Not downloaded Chưa tải về - - + + Normal Normal (priority) Bình thường - - N/A - - - - + Do not download Do not download (priority) - - + + High High (priority) Ưu tiên cao - + Mixed Mixed (priorities Vừa vừa - - + + Maximum Maximum (priority) Ưu tiên tối đa @@ -6648,32 +5704,32 @@ PropTabBar - + General Tổng Quan - + Trackers Tracker - + Peers Mạng ngang hàng - + HTTP Sources Nguồn HTTP - + Content Nội dung - + Speed @@ -6693,7 +5749,7 @@ Progress: - + Tiến độ: @@ -6767,22 +5823,22 @@ Bình luận: - + Select All Chọn Tất cả - + Select None Không chọn gì - + Normal Bình thường - + High Ưu tiên cao @@ -6842,165 +5898,165 @@ - + Maximum Ưu tiên tối đa + - Do not download Không tải về - + Never Không bao giờ - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) - - + + %1 (%2 this session) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) - + Open - + Open Containing Folder - + Rename... Đổi tên... - + Priority Độ ưu tiên - + New Web seed Seed Web mới - + Remove Web seed Loại bỏ seed Web - + Copy Web seed URL Sao chép đường dẫn seed Web - + Edit Web seed URL Chỉnh sửa đường dẫn seed Web - + + Rename the file + Đổi tên tập tin + + + New name: Tên mới: - - + + + The file could not be renamed + Không thể đổi tên tập tin này + + + + This file name contains forbidden characters, please choose a different one. + Tên tập tin chứa một số ký tự bị cấm, vui lòng chọn một tên khác. + + + + This name is already in use in this folder. Please use a different name. Tên này hiện đã được dùng cho một thư mục khác. Vui lòng sử dụng một tên khác. - + The folder could not be renamed Không thể đổi tên thư mục - + qBittorrent qBittorrent - + Filter files... - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - - - - + New URL seed New HTTP source - + New URL seed: - - + + This URL seed is already in the list. - + Web seed editing Đang chỉnh sửa seed Web - + Web seed URL: Đường liên kết seed Web: @@ -7008,583 +6064,548 @@ QObject - - %1 is an unknown command line parameter. - --random-parameter is an unknown command line parameter. + + Your IP address has been banned after too many failed authentication attempts. - - - %1 must be the single command line parameter. + + Error: '%1' is not a valid torrent file. + - - You cannot use %1: qBittorrent is already running for this user. + + Error: Could not add torrent to session. - - Usage: + + I/O Error: Could not create temporary file. - - Options: + + %1 is an unknown command line parameter. + --random-parameter is an unknown command line parameter. - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' + + + %1 must be the single command line parameter. - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' + + %1 must specify the correct port (1 to 65535). - - Expected integer number in environment variable '%1', but got '%2' + + You cannot use %1: qBittorrent is already running for this user. - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - - - - - Expected %1 in environment variable '%2', but got '%3' - - - - - port + + Usage: - - %1 must specify a valid port (1 to 65535). + + Options: - - Display program version and exit + + Displays program version - - Display this help message and exit + + Displays this help message - - Change the Web UI port + + Changes the Web UI port (current: %1) - + Disable splash screen - + Run in daemon-mode (background) - - dir - Use appropriate short form or abbreviation of "directory" + + Downloads the torrents passed by the user - - Store configuration files in <dir> - + + Help + Trợ giúp - - - name + + Run application with -h option to read about command line parameters. - - Store configuration files in directories qBittorrent_<name> + + Bad command line - - Hack into libtorrent fastresume files and make file paths relative to the profile directory + + Bad command line: - - files or URLs + + Legal Notice - - Download the torrents passed by the user + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. + + Press %1 key to accept and continue... - - Options when adding new torrents: + + Legal notice - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - + + Cancel + Hủy bỏ - - path + + I Agree - - Torrent save path + + Torrent name: %1 - - Add torrents as started or paused + + Torrent size: %1 - - Skip hash check - Bỏ qua kiểm tra hash - - - - Assign torrents to category. If the category doesn't exist, it will be created. + + Save path: %1 - - Download files in sequential order + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds - - Download first and last pieces first + + Thank you for using qBittorrent. - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: + + [qBittorrent] '%1' has finished downloading - - Command line parameters take precedence over environment variables + + The remote host name was not found (invalid hostname) - - Help + + The operation was canceled - - Run application with -h option to read about command line parameters. + + The remote server closed the connection prematurely, before the entire reply was received and processed - - Bad command line + + The connection to the remote server timed out - - Bad command line: + + SSL/TLS handshake failed - - Legal Notice + + The remote server refused the connection - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + + The connection to the proxy server was refused - - No further notices will be issued. + + The proxy server closed the connection prematurely - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. + + The proxy host name was not found - - Press %1 key to accept and continue... + + The connection to the proxy timed out or the proxy did not reply in time to the request sent - - Legal notice + + The proxy requires authentication in order to honor the request but did not accept any credentials offered - - Cancel - Hủy bỏ + + The access to the remote content was denied (401) + - - I Agree + + The operation requested on the remote content is not permitted - - - Upgrade + + The remote content was not found at the server (404) - - You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] + + The remote server requires authentication to serve the content but the credentials provided were not accepted - - You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. + + The Network Access API cannot honor the request because the protocol is not known - - Couldn't migrate torrent with hash: %1 + + The requested operation is invalid for this protocol - - Couldn't migrate torrent. Invalid fastresume file name: %1 + + An unknown network-related error was detected - - Detected unclean program exit. Using fallback file to restore settings: %1 + + An unknown proxy-related error was detected - - An access error occurred while trying to write the configuration file. + + An unknown error related to the remote content was detected - - A format error occurred while trying to write the configuration file. + + A breakdown in protocol was detected - - An unknown error occurred while trying to write the configuration file. + + Unknown error - - - RSS::AutoDownloader - - - Invalid data format. + + + Upgrade - - Couldn't save RSS AutoDownloader data in %1. Error: %2 + + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - - Invalid data format + + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 + + Couldn't migrate torrent with hash: %1 - - Couldn't load RSS AutoDownloader rules. Reason: %1 + + Couldn't migrate torrent. Invalid fastresume file name: %1 - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 + + Detected unclean program exit. Using fallback file to restore settings. - - RSS feed at '%1' updated. Added %2 new articles. + + An access error occurred while trying to write the configuration file. - - Failed to parse RSS feed at '%1'. Reason: %2 + + A format error occurred while trying to write the configuration file. + + + RSS - - Couldn't read RSS Session data from %1. Error: %2 - + + Search + Tìm Kiếm - - Couldn't parse RSS Session data. Error: %1 - + + New subscription + Đăng ký theo dõi mới - - Couldn't load RSS Session data. Invalid data format. - + + + + Mark items read + Đánh dấu các mục là đã đọc - - Couldn't load RSS article '%1#%2'. Invalid data format. - + + Update all + Cập nhật tất cả - - - RSS::Private::Parser - - Invalid RSS feed. - + + RSS Downloader... + Phần tải về tin dạng RSS... - - %1 (line: %2, column: %3, offset: %4). - + + Settings... + Thiết lập... - - - RSS::Session - - RSS feed with given URL already exists: %1. + + Torrents: (double-click to download) - - Cannot move root folder. - + + + Delete + Xoá - - - Item doesn't exist: %1. - + + Rename... + Đổi tên... - - Cannot delete root folder. - + + Rename + Đổi tên - - Incorrect RSS Item path: %1. - + + + Update + Cập nhật - - RSS item with given path already exists: %1. - + + New subscription... + Đăng ký theo dõi mới... - - Parent folder doesn't exist: %1. - + + + Update all feeds + Cập nhật các nguồn tin feed - - - RSSWidget - - Search - Tìm Kiếm + + Download torrent + Tải về torrent - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - + + Open news URL + Mở tin tức từ liên kết - - New subscription - + + Copy feed URL + Sao chép đường dẫn feed - - - - Mark items read - + + New folder... + Tạo thư mục mới... - + Refresh RSS streams - + Cập nhật lại các luồng RSS + + + RSSImp - - Update all - + + Stream URL: + Luồng liên kết: - - RSS Downloader... + + Please type a RSS stream URL - - Torrents: (double-click to download) + + This RSS feed is already in the list. - - - Delete - Xóa - - - - Rename... - Đổi tên... - - - - Rename - Đổi tên - - - - - Update - + + Please choose a folder name + Xin vui lòng chọn tên cho thư mục - - New subscription... - + + Folder name: + Tên thư mục: - - - Update all feeds - + + New folder + Tạo thư mục mới - - Download torrent + + Deletion confirmation - - Open news URL + + Are you sure you want to delete the selected RSS feeds? - - Copy feed URL - + + Please choose a new name for this RSS feed + Xin vui lòng chọn một tên mới cho feed dạng RSS này - - New folder... - + + New feed name: + Tên mới cho feed: - - Please choose a folder name - + + Name already in use + Tên này đã được sử dụng - - Folder name: - + + This name is already used by another item, please choose another one. + Tên này đã được sử dụng bởi một đối tượng khác, xin vui lòng chọn một tên khác. - - New folder - + + Date: + Ngày tháng: - - Please type a RSS feed URL - + + Author: + Tác giả: - - Feed URL: - + + Unread + Chưa đọc + + + Rss::Feed - - Deletion confirmation + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... - - Are you sure you want to delete the selected RSS feeds? + + Automatically downloading '%1' torrent from '%2' RSS feed... + + + Rss::Private::Parser - - Please choose a new name for this RSS feed + + Invalid RSS feed. + + + RssSettingsDlg - - New feed name: - + + RSS Reader Settings + Thiết lập phần đọc tin RSS - - Rename failed - + + RSS feeds refresh interval: + Khoảng thời gian làm mới nguồn cấp dữ liệu RSS: - - Date: + + min - - Author: - + + Maximum number of articles per feed: + Số lượng tối đa của các bài viết cho một nguồn cấp dữ liệu: ScanFoldersDelegate - + Select save location @@ -7592,521 +6613,454 @@ ScanFoldersModel - + Monitored Folder - + Override Save Location - + Monitored folder - + Default save location - + Browse... - + Duyệt tìm... - SearchJobWidget + SearchEngine - - Form + + Unknown search engine plugin file format. - - Results(xxx) + + A more recent version of this plugin is already installed. - - Search in: + + + Plugin is not supported. - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + + Update server is temporarily unavailable. %1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + + + Failed to download the plugin file. %1 - - Seeds: + + An incorrect update info received. - - <html><head/><body><p>Minimal number of seeds</p></body></html> + + All categories - - - to + + Movies - - <html><head/><body><p>Maximal number of seeds</p></body></html> + + TV shows - - - + + Music - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + + Games - - Size: - Kích cỡ: + + Anime + - - <html><head/><body><p>Minimal torrent size</p></body></html> + + Software - - <html><head/><body><p>Maximal torrent size</p></body></html> + + Pictures - + + Books + + + + + SearchListDelegate + + + + Unknown + Chưa rõ + + + + SearchTab + + Name i.e: file name - Tên + Tên - + Size i.e: file size - Kích thước + Kích thước - + Seeders i.e: Number of full sources - Các người dùng dạng seeder + Các người dùng dạng seeder - + Leechers i.e: Number of partial sources - Các người dùng dạng leecher + Các người dùng dạng leecher - + Search engine - Cơ chế Tìm kiếm - - - - Filter search results... - + Cơ chế Tìm kiếm - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + Torrent names only - + Everywhere - - Use regular expressions - - - - + Searching... - + Search has finished - + Search aborted - + An error occurred during search... - + Search returned no results - + Column visibility Chế độ hiển thị cột - - - SearchListDelegate - - Unknown - Chưa rõ - - - - SearchPluginManager - - - Unknown search engine plugin file format. - - - - - A more recent version of this plugin is already installed. - - - - - Plugin is not supported. + + Form - - All categories + + Results(xxx) - - Movies + + Search in: - - TV shows + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - - Music + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - - Games + + Seeds: - - Anime + + <html><head/><body><p>Minimal number of seeds</p></body></html> - - Software + + + to - - Pictures + + <html><head/><body><p>Maximal number of seeds</p></body></html> - - - Books + + + + - - Update server is temporarily unavailable. %1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - - - Failed to download the plugin file. %1 - + + Size: + Kích cỡ: - - An incorrect update info received. + + <html><head/><body><p>Minimal torrent size</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') + + <html><head/><body><p>Maximal torrent size</p></body></html> - SearchTab - - Name - i.e: file name - Tên - - - Size - i.e: file size - Kích thước - - - Seeders - i.e: Number of full sources - Các người dùng dạng seeder - - - Leechers - i.e: Number of partial sources - Các người dùng dạng leecher - - - Search engine - Cơ chế Tìm kiếm - - - Column visibility - Chế độ hiển thị cột - - - Size: - Kích cỡ: - - - SearchWidget - - - - + + + Search Tìm Kiếm - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - - + Download Tải về - + Go to description page - + Copy description page URL - + Search plugins... - + A phrase to search for. - + Spaces in a search term may be protected by double quotes. - + Example: Search phrase example - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted - + All plugins - + Only enabled - + Select... - - - + + + Search Engine - + Please install Python to use the Search Engine. - + Empty search pattern - + Please type a search pattern first - + Stop - + Search has finished - + Search has failed - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + E&xit Now - + Exit confirmation - + The computer is going to shutdown. - + &Shutdown Now - - Shutdown confirmation - Xác nhận việc tắt hệ thống - - - + The computer is going to enter suspend mode. - + &Suspend Now - + Suspend confirmation - + The computer is going to enter hibernation mode. - + &Hibernate Now - + Hibernate confirmation - + You can cancel the action within %1 seconds. - - - ShutdownConfirmDlg + Shutdown confirmation - Xác nhận việc tắt hệ thống + Xác nhận việc tắt hệ thống SpeedLimitDialog - + KiB/s KiB/giây @@ -8114,52 +7068,52 @@ SpeedPlotView - + Total Upload - + Total Download - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - + DHT Download - + Tracker Upload - + Tracker Download @@ -8167,95 +7121,87 @@ SpeedWidget - + Period: - + 1 Minute - + 5 Minutes - + 30 Minutes - + 6 Hours - + Select Graphs - + Total Upload - + Total Download - + Payload Upload - + Payload Download - + Overhead Upload - + Overhead Download - + DHT Upload - + DHT Download - + Tracker Upload - + Tracker Download - StacktraceDialog - - - Crash info - Thông tin về lỗi - - - StatsDialog @@ -8268,24 +7214,29 @@ Thống kê người dùng + Total peer connections: - Tổng số kết nối ngang hàng: + Tổng số kết nối ngang hàng: + Global ratio: - Tỉ lệ chung: + Tỉ lệ chung: + Alltime download: - Tổng thời gian tải về: + Tổng thời gian tải về: + Alltime upload: - Tổng thời gian tải lên: + Tổng thời gian tải lên: + Total waste (this session): - Phí tổn (phiên làm việc này): + Phí tổn (phiên làm việc này): @@ -8303,38 +7254,9 @@ - Total buffers size: - Tổng kích cỡ bộ nhớ đệm: - - - - Connected peers: - - - - - All-time share ratio: - - - - - All-time download: - - - - - Session waste: - - - - - All-time upload: - - - - Total buffer size: - + Total buffers size: + Tổng kích cỡ bộ nhớ đệm: @@ -8362,7 +7284,12 @@ Tổng kích thước hàng đợi: - + + OK + Đồng Ý + + + %1 ms 18 milliseconds @@ -8371,27 +7298,32 @@ StatusBar - + Connection status: Trạng thái kết nối: - + No direct connections. This may indicate network configuration problems. Không có kết nối trực tiếp. Vấn đề này có thể liên quan đến việc cấu hình giao thức mạng. - + DHT: %1 nodes DHT: %1 nút - - qBittorrent needs to be restarted! - + + qBittorrent needs to be restarted + qBittorrent cần phải được khởi động lại + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent vừa được cập nhật và cần phải được khởi động lại để các thay đổi vừa thực hiện được thực thi. @@ -8410,1882 +7342,1304 @@ Trực tuyến - + Click to switch to alternative speed limits Click để chuyển sang giới hạn tốc độ thay thế - + Click to switch to regular speed limits Click để chuyển sang giới hạn tốc độ thông thường - + + Manual change of rate limits mode. The scheduler is disabled. + Tự điều chỉnh sự thay đổi của chế độ tỉ lệ giới hạn. Phần lịch trình đã bị vô hiệu hóa. + + + Global Download Speed Limit Giới Hạn Tốc Độ Tải Xuống Chung - + Global Upload Speed Limit Giới Hạn Tốc Độ Tải Lên Chung - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - + Downloading (0) - + Seeding (0) - + Completed (0) - + Resumed (0) - + Paused (0) - + Active (0) - + Inactive (0) - + Errored (0) - + All (%1) - + Downloading (%1) - + Seeding (%1) - + Completed (%1) - + Paused (%1) - + Resumed (%1) - + Active (%1) - + Inactive (%1) - + Errored (%1) - TagFilterModel + TorrentContentModel - - Tags - + + Name + Tên - - All - + + Size + Kích thước - - Untagged - + + Progress + Tiến độ - - - TagFilterWidget - - Add tag... + + Download Priority - - Remove tag - + + Remaining + Còn lại + + + TorrentCreatorDlg - - Remove unused tags - + + Select a folder to add to the torrent + Chọn một thư mục để thêm vào torrent - - Resume torrents - + + Select a file to add to the torrent + Chọn một thư mục để thêm vào torrent - - Pause torrents - + + No input path set + Chưa đặt đường dẫn của dữ liệu đầu vào - - Delete torrents - + + Please type an input path first + Trước tiên xin vui lòng nhập vào đường dẫn của dữ liệu đầu vào - - New Tag - + + Select destination torrent file + Chọn tập tin torrent đích - - Tag: + + Torrent Files (*.torrent) - - Invalid tag name + + Torrent was created successfully: %1 + %1 is the path of the torrent - - Tag name '%1' is invalid - + + + + Torrent creation + Tạo torrent - - Tag exists - + + Torrent creation was unsuccessful, reason: %1 + Quá trình tạo torrent không thành công, nguyên nhân: %1 - - Tag name already exists. - + + Created torrent file is invalid. It won't be added to download list. + Tập tin torrent đã tạo không hợp lệ. Tập tin này sẽ không được thêm vào danh sách tải về. - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - + + Name + i.e: torrent name + Tên - - Name: - Tên: + + Size + i.e: torrent size + Kích thước - - Save path: - + + Done + % Done + Đã hoàn tất - - Choose save path - Chọn đường dẫn để lưu + + Status + Torrent status (e.g. downloading, seeding, paused) + Trạng thái - - New Category - + + Seeds + i.e. full sources (often untranslated) + Seed - - Invalid category name - + + Peers + i.e. partial sources (often untranslated) + Mạng ngang hàng - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - + + Down Speed + i.e: Download speed + Tốc độ tải về - - Category creation error - + + Up Speed + i.e: Upload speed + Tốc độ tải lên - - Category with the given name already exists. -Please choose a different name and try again. - + + Ratio + Share ratio + Tỉ lệ - - - TorrentContentModel - - Name - Tên + + ETA + i.e: Estimated Time of Arrival / Time left + ETA - - Size - Kích thước - - - - Progress - Tiến độ - - - - Download Priority - - - - - Remaining - Còn lại - - - - Availability - - - - - TorrentCreatorDialog - - - Torrent Creator - - - - - Select file/folder to share - - - - - Path: - - - - - [Drag and drop area] - - - - - - Select file - - - - - - Select folder - - - - - Settings - - - - - Piece size: - - - - - Auto - - - - - 16 KiB - - - - - 32 KiB + + Category - - 64 KiB - + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + Được thêm vào - - 128 KiB - + + Completed On + Torrent was completed on 01/01/2010 08:00 + Hoàn tất vào - - 256 KiB - + + Tracker + Tracker - - 512 KiB - + + Down Limit + i.e: Download limit + Giới hạn tải - - 1 MiB - + + Up Limit + i.e: Upload limit + Giới hạn tải lên - - 2 MiB - + + Downloaded + Amount of data downloaded (e.g. in MB) + Đã tải về - - 4 MiB - + + Uploaded + Amount of data uploaded (e.g. in MB) + Đã tải lên - - 8 MiB + + Session Download + Amount of data downloaded since program open (e.g. in MB) - - 16 MiB + + Session Upload + Amount of data uploaded since program open (e.g. in MB) - - 32 MiB - + + Remaining + Amount of data left to download (e.g. in MB) + Còn lại - - Calculate number of pieces: - + + Time Active + Time (duration) the torrent is active (not paused) + Thời gian thực thi: - - Private torrent (Won't distribute on DHT network) - + + Save path + Torrent save path + Lưu đường dẫn - - Start seeding immediately + + Completed + Amount of data completed (e.g. in MB) - - Ignore share ratio limits for this torrent + + Ratio Limit + Upload share ratio limit - - Optimize alignment + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole - - Fields + + Last Activity + Time passed since a chunk was downloaded/uploaded - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + + Total Size + i.e. Size including unwanted data + + + TrackerFiltersList - - Web seed URLs: + + All (0) + this is for the tracker filter - - Tracker URLs: + + Trackerless (0) - - Comments: + + Error (0) - - Source: + + Warning (0) - - Progress: + + + Trackerless (%1) - - Create Torrent + + + Error (%1) - - - - Torrent creation failed + + + Warning (%1) - - Reason: Path to file/folder is not readable. + + Resume torrents - - Select where to save the new torrent + + Pause torrents - - Torrent Files (*.torrent) + + Delete torrents - - Reason: %1 + + + All (%1) + this is for the tracker filter + + + TrackerList - - Reason: Created torrent is invalid. It won't be added to download list. - + + URL + Đường dẫn - - Torrent creator - + + Status + Trạng thái - - Torrent created: + + Received - - - TorrentInfo - - File size exceeds max limit %1 - + + Seeds + Seed - - Torrent file read error: %1 - + + Peers + Mạng ngang hàng - - Torrent file read error: size mismatch + + Downloaded - - - TorrentModel - - Name - i.e: torrent name - Tên - - - Size - i.e: torrent size - Kích thước - - Done - % Done - Đã hoàn tất + + Message + Thông báo - Status - Torrent status (e.g. downloading, seeding, paused) - Trạng thái + + + Working + Đang thực hiện - Seeds - i.e. full sources (often untranslated) - Seed + + Disabled + Vô Hiệu Hóa - Peers - i.e. partial sources (often untranslated) - Mạng ngang hàng + + This torrent is private + Torrent này có dạng riêng tư - Down Speed - i.e: Download speed - Tốc độ tải về + + Updating... + Đang cập nhật... - Up Speed - i.e: Upload speed - Tốc độ tải lên + + Not working + Hiện không được thực hiện - Ratio - Share ratio - Tỉ lệ + + Not contacted yet + Chưa liên lạc được - ETA - i.e: Estimated Time of Arrival / Time left - ETA + + Tracker URL: + Đường dẫn tracker: - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - Được thêm vào + + Tracker editing + Chỉnh sửa tracker - Completed On - Torrent was completed on 01/01/2010 08:00 - Hoàn tất vào + + + Tracker editing failed + Gặp lổi khi chỉnh sửa tracker - Tracker - Tracker + + The tracker URL entered is invalid. + Đường dẫn tracker vừa điền vào không hợp lệ. - Down Limit - i.e: Download limit - Giới hạn tải + + The tracker URL already exists. + Đường dẫn tracker này đã tồn tại rồi. - Up Limit - i.e: Upload limit - Giới hạn tải lên + + Add a new tracker... + Thêm vào một tracker mới... - Downloaded - Amount of data downloaded (e.g. in MB) - Đã tải về + + Copy tracker URL + - Uploaded - Amount of data uploaded (e.g. in MB) - Đã tải lên + + Edit selected tracker URL + Chỉnh sửa đường dẫn tracker đã chọn - Remaining - Amount of data left to download (e.g. in MB) - Còn lại + + Force reannounce to selected trackers + Buộc phải thông báo lại đến với các tracker được chọn - Time Active - Time (duration) the torrent is active (not paused) - Thời gian thực thi: + + Force reannounce to all trackers + Buộc phải thông báo lại đến với mọi tracker - Save path - Torrent save path - Lưu đường dẫn + + Remove tracker + Loại bỏ tracker - TorrentsController - - - Not contacted yet - Chưa liên lạc được - - - - Updating... - Đang cập nhật... - + TrackersAdditionDlg - - Working - + + Trackers addition dialog + Hộp thoại bổ sung của tracker - - Not working - + + List of trackers to add (one per line): + Danh sách các tracker để thêm vào (từng dòng một): - - - Error: '%1' is not a valid torrent file. - + + + µTorrent compatible list URL: + Danh sách đường dẫn tương thích với µTorrent: - - - - - Torrent queueing must be enabled - + + I/O Error + Lỗi về Nhập/Xuất dữ liệu - - Save path cannot be empty - + + Error while trying to open the downloaded file. + Xảy ra lổi khi mở một tập tin đã tải về. - - - Category cannot be empty - + + No change + Không thay đổi - - Unable to create category - + + No additional trackers were found. + Không tìm thấy tracker được bổ sung nào. - - Unable to edit category - + + Download error + Lỗi khi tải về - - Cannot make save path - + + The trackers list could not be downloaded, reason: %1 + Không thể tải về danh sách các tracker, nguyên nhân: %1 + + + TransferListDelegate - - Cannot write to directory - + + Downloading + Đang tải về - - WebUI Set location: moving "%1", from "%2" to "%3" - + + Downloading metadata + used when loading a magnet link + Đang tải về phần thông tin chi tiết - - Incorrect torrent name - + + Allocating + qBittorrent is allocating the files on disk + Phân bổ - - - Incorrect category name - - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - - - - - Trackerless (0) - - - - - Error (0) - - - - - Warning (0) - - - - - - Trackerless (%1) - - - - - - Error (%1) - - - - - - Warning (%1) - - - - - Resume torrents - - - - - Pause torrents - - - - - Delete torrents - - - - - - All (%1) - this is for the tracker filter - - - - - TrackerList - - URL - Đường dẫn - - - Status - Trạng thái - - - Seeds - Seed - - - Peers - Mạng ngang hàng - - - Downloaded - Đã tải về - - - Message - Thông báo - - - Working - Đang thực hiện - - - Disabled - Vô Hiệu Hóa - - - This torrent is private - Torrent này có dạng riêng tư - - - Updating... - Đang cập nhật... - - - Not working - Hiện không được thực hiện - - - Not contacted yet - Chưa liên lạc được - - - Tracker URL: - Đường dẫn tracker: - - - Tracker editing - Chỉnh sửa tracker - - - Tracker editing failed - Gặp lổi khi chỉnh sửa tracker - - - The tracker URL entered is invalid. - Đường dẫn tracker vừa điền vào không hợp lệ. - - - The tracker URL already exists. - Đường dẫn tracker này đã tồn tại rồi. - - - Add a new tracker... - Thêm vào một tracker mới... - - - Edit selected tracker URL - Chỉnh sửa đường dẫn tracker đã chọn - - - Force reannounce to selected trackers - Buộc phải thông báo lại đến với các tracker được chọn - - - Force reannounce to all trackers - Buộc phải thông báo lại đến với mọi tracker - - - Column visibility - Chế độ hiển thị cột - - - Remove tracker - Loại bỏ tracker - - - - TrackerListWidget - - - - Working - - - - - Disabled - Vô Hiệu Hóa - - - - This torrent is private - Torrent này có dạng riêng tư - - - - Updating... - Đang cập nhật... - - - - Not working - - - - - Not contacted yet - Chưa liên lạc được - - - - - - - - - N/A - - - - - Tracker editing - Chỉnh sửa tracker - - - - Tracker URL: - Đường dẫn tracker: - - - - - Tracker editing failed - Gặp lổi khi chỉnh sửa tracker - - - - The tracker URL entered is invalid. - Đường dẫn tracker vừa điền vào không hợp lệ. - - - - The tracker URL already exists. - Đường dẫn tracker này đã tồn tại rồi. - - - - Add a new tracker... - Thêm vào một tracker mới... - - - - Remove tracker - Loại bỏ tracker - - - - Copy tracker URL - - - - - Edit selected tracker URL - Chỉnh sửa đường dẫn tracker đã chọn - - - - Force reannounce to selected trackers - Buộc phải thông báo lại đến với các tracker được chọn - - - - Force reannounce to all trackers - Buộc phải thông báo lại đến với mọi tracker - - - - URL - Đường dẫn - - - - Status - Trạng thái - - - - Received - - - - - Seeds - Seed - - - - Peers - Mạng ngang hàng - - - - Downloaded - Đã tải về - - - - Message - Thông báo - - - - Column visibility - Chế độ hiển thị cột - - - - TrackerLoginDialog - - - - Tracker authentication - Xác nhận tracker - - - - Tracker: - Tracker: - - - - Login - Đăng nhập - - - - Username: - Tên người dùng: - - - - Password: - Mật khẩu: - - - - Log in - Đăng nhập - - - - TrackersAdditionDialog - - - Trackers addition dialog - Hộp thoại bổ sung của tracker - - - - List of trackers to add (one per line): - Danh sách các tracker để thêm vào (từng dòng một): - - - - µTorrent compatible list URL: - Danh sách đường dẫn tương thích với µTorrent: - - - - No change - Không thay đổi - - - - No additional trackers were found. - Không tìm thấy tracker được bổ sung nào. - - - - Download error - Lỗi khi tải về - - - - The trackers list could not be downloaded, reason: %1 - Không thể tải về danh sách các tracker, nguyên nhân: %1 - - - - TrackersAdditionDlg - - Trackers addition dialog - Hộp thoại bổ sung của tracker - - - List of trackers to add (one per line): - Danh sách các tracker để thêm vào (từng dòng một): - - - µTorrent compatible list URL: - Danh sách đường dẫn tương thích với µTorrent: - - - I/O Error - Lỗi về Nhập/Xuất dữ liệu - - - Error while trying to open the downloaded file. - Xảy ra lổi khi mở một tập tin đã tải về. - - - No change - Không thay đổi - - - No additional trackers were found. - Không tìm thấy tracker được bổ sung nào. - - - Download error - Lỗi khi tải về - - - The trackers list could not be downloaded, reason: %1 - Không thể tải về danh sách các tracker, nguyên nhân: %1 - - - - TransferListDelegate - - - Downloading - Đang tải về - - - - Downloading metadata - used when loading a magnet link - Đang tải về phần thông tin chi tiết - - - - Allocating - qBittorrent is allocating the files on disk - Phân bổ - - - - Paused - Tạm dừng - - - - Queued - i.e. torrent is queued - Đang đợi - - - - Seeding - Torrent is complete and in upload-only mode - Đang seed - - - - Stalled - Torrent is waiting for download to begin - Đang bị ngừng - - - - [F] Downloading - used when the torrent is forced started. You probably shouldn't translate the F. - - - - - [F] Seeding - used when the torrent is forced started. You probably shouldn't translate the F. - - - - - Checking - Torrent local data is being checked - Đang kiểm tra - - - - Queued for checking - i.e. torrent is queued for hash checking - - - - - Checking resume data - used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - - - - - Completed - - - - - Moving - Torrent local data are being moved/relocated - - - - - Missing Files - - - - - Errored - torrent status, the torrent has an error - - - - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - - - - - %1 ago - e.g.: 1h 20m ago - - - - - TransferListFiltersWidget - - - Status - Trạng thái - - - - Categories - - - - - Tags - - - - - Trackers - Tracker - - - - TransferListModel - - - Name - i.e: torrent name - Tên - - - - Size - i.e: torrent size - Kích thước - - - - Done - % Done - Đã hoàn tất - - - - Status - Torrent status (e.g. downloading, seeding, paused) - Trạng thái - - - - Seeds - i.e. full sources (often untranslated) - Seed - - - - Peers - i.e. partial sources (often untranslated) - Mạng ngang hàng - - - - Down Speed - i.e: Download speed - Tốc độ tải về - - - - Up Speed - i.e: Upload speed - Tốc độ tải lên - - - - Ratio - Share ratio - Tỉ lệ - - - - ETA - i.e: Estimated Time of Arrival / Time left - ETA - - - - Category - - - - - Tags - - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - Được thêm vào + + Paused + Tạm dừng - - Completed On - Torrent was completed on 01/01/2010 08:00 - Hoàn tất vào + + Queued + i.e. torrent is queued + Đang đợi - - Tracker - Tracker + + Seeding + Torrent is complete and in upload-only mode + Đang seed - - Down Limit - i.e: Download limit - Giới hạn tải + + Stalled + Torrent is waiting for download to begin + Đang bị ngừng - - Up Limit - i.e: Upload limit - Giới hạn tải lên + + [F] Downloading + used when the torrent is forced started. You probably shouldn't translate the F. + - - Downloaded - Amount of data downloaded (e.g. in MB) - Đã tải về + + [F] Seeding + used when the torrent is forced started. You probably shouldn't translate the F. + - - Uploaded - Amount of data uploaded (e.g. in MB) - Đã tải lên + + Checking + Torrent local data is being checked + Đang kiểm tra - - Session Download - Amount of data downloaded since program open (e.g. in MB) + + Queued for checking + i.e. torrent is queued for hash checking - - Session Upload - Amount of data uploaded since program open (e.g. in MB) + + Checking resume data + used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - - Remaining - Amount of data left to download (e.g. in MB) - Còn lại + + Completed + - - Time Active - Time (duration) the torrent is active (not paused) - Thời gian thực thi: + + Missing Files + - - Save path - Torrent save path - Lưu đường dẫn + + Errored + torrent status, the torrent has an error + - - Completed - Amount of data completed (e.g. in MB) + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) - - Ratio Limit - Upload share ratio limit + + %1 ago + e.g.: 1h 20m ago + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + Trạng thái - - Last Activity - Time passed since a chunk was downloaded/uploaded + + Categories - - Total Size - i.e. Size including unwanted data - + + Trackers + Tracker TransferListWidget - + Column visibility Chế độ hiển thị cột - + Choose save path Chọn đường dẫn để lưu - + Torrent Download Speed Limiting Đang giới hạn tốc độ tải về của torrent - + Torrent Upload Speed Limiting Đang giới hạn tốc độ tải lên của torrent - + Recheck confirmation Kiểm tra lại phần xác nhận - + Are you sure you want to recheck the selected torrent(s)? Bạn có chắc bạn muốn kiểm tra lại (các)torrent đã chọn hay không? - + Rename Đổi tên - + New name: Tên mới : - + Resume Resume/start the torrent Khôi phục lại - + Force Resume Force Resume/start the torrent - + Pause Pause the torrent Tạm dừng - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - - - - - Add Tags - - - - - Remove All Tags - - - - - Remove all tags from selected torrents? + + New Category - - Comma-separated tags: + + Category: - - Invalid tag + + Invalid category name - - Tag name: '%1' is invalid + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. - + Delete Delete the torrent Xóa - + Preview file... Xem sơ lược tập tin... - + Limit share ratio... Giới hạn tỉ lệ chia sẻ... - + Limit upload rate... Giới hạn tỉ lệ tải lên... - + Limit download rate... Giới hạn tỉ lệ tải về... - + Open destination folder Mở thư mục đích - + Move up i.e. move up in the queue Di chuyển lên trên - + Move down i.e. Move down in the queue Di chuyển xuống dưới - + Move to top i.e. Move to top of the queue Di chuyển lên trên cùng - + Move to bottom i.e. Move to bottom of the queue Di chuyển xuống dưới cùng - + Set location... Đặt vị trí... - - Force reannounce - - - - + Copy name - - Copy hash - - - - + Download first and last pieces first - + Automatic Torrent Management - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - + Category - + New... New category... - + Reset Reset category - - Tags - - - - - Add... - Add / assign multiple tags... - - - - - Remove All - Remove all tags - - - - + Priority Độ ưu tiên - + Force recheck Buộc kiểm tra lại - + Copy magnet link Sao chép đường dẫn magnet - + Super seeding mode Chế độ seed cao cấp - + Rename... Đổi tên... - + Download in sequential order Tải về theo thứ tự tuần tự - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - Tỉ lệ giới hạn tải lên/tải về torrent + Tỉ lệ giới hạn tải lên/tải về torrent - - Use global share limit - + + Use global ratio limit + Sử dụng tỉ lệ giới hạn chung - - - + + + buttonGroup - buttonGroup - - - - Set no share limit - - - - - Set share limit to - - - - - ratio - + buttonGroup - - minutes - - - - - No share limit method selected - + + Set no ratio limit + Không đặt tỉ lệ giới hạn - - Please select a limit method first - + + Set ratio limit to + Đặt tỉ lệ giới hạn thành - UpDownRatioDlg - - Torrent Upload/Download Ratio Limiting - Tỉ lệ giới hạn tải lên/tải về torrent - + WebApplication - buttonGroup - buttonGroup + + Incorrect category name + - Utils::ForeignApps + WebUI - - Python detected, version: %1 + + The Web UI is listening on port %1 - - Python not detected + + Web UI Error - Unable to bind Web UI to port %1 - WebApplication + about - - Unacceptable file type, only regular file is allowed. - - - - - Symlinks inside alternative UI folder are forbidden. - - - - - Exceeded the maximum allowed file size (%1)! + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' + + Copyright %1 2006-2016 The qBittorrent project - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' + + Home Page: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' + + Forum: - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' + + Bug Tracker: - WebUI - - - Web UI: HTTPS setup successful - - + addPeersDialog - - Web UI: HTTPS setup failed, fallback to HTTP + + Add Peers - - Web UI: Now listening on IP: %1, port: %2 + + List of peers to add (one per line): - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 + + Format: IPv4:port / [IPv6]:port authentication + + Tracker authentication - Xác nhận tracker + Xác nhận tracker + Tracker: - Tracker: + Tracker: + Login - Đăng nhập + Đăng nhập + Username: - Tên người dùng: + Tên người dùng: + Password: - Mật khẩu: + Mật khẩu: + Log in - Đăng nhập + Đăng nhập + Cancel - Hủy bỏ + Hủy bỏ confirmDeletionDlg + + Deletion confirmation - qBittorrent + Xác nhận thao tác xóa - qBittorrent + + + Remember choice - Nhớ lựa chọn của tôi + Nhớ lựa chọn của tôi + Also delete the files on the hard disk - Đồng thời xóa các tập tin trên ổ đĩa + Đồng thời xóa các tập tin trên ổ đĩa + + + + confirmShutdownDlg + + + Don't show again + + + + + createTorrentDialog + + + Cancel + Hủy bỏ + + + + Torrent Creation Tool + Công cụ tạo torrent + + + + Torrent file creation + Tạo torrent + + + + Add file + Thêm tập tin + + + + Add folder + Thêm thư mục + + + + File or folder to add to the torrent: + Tập tin hoặc thư mục để thêm vào torrent: + + + + Tracker URLs: + Đường dẫn tracker: + + + + Web seeds urls: + Đường dẫn seed Web: + + + + Comment: + Bình luận: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + Bạn có thể tách biệt các tracker kết nối / dạng nhóm bằng một hàng rỗng. + + + + Piece size: + Kích thước các mảnh: + + + + 16 KiB + 512 KiB {16 ?} + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 4 MiB {8 ?} + + + + 16 MiB + 4 MiB {16 ?} + + + + Auto + Tự động + + + + Private (won't be distributed on DHT network if enabled) + Riêng tư (sẽ không được phân phối trên mạng DHT nếu kích hoạt) + + + + Start seeding after creation + Bắt đầu seed sau khi đã tạo + + + + Ignore share ratio limits for this torrent + Bỏ qua tỉ lệ giới hạn chia sẻ dành cho torrent này + + + + Create and save... + Tạo và sao lưu... + + + + Progress: + Tiến độ: downloadFromURL + Add torrent links - Thêm vào đường dẫn torrent + Thêm vào đường dẫn torrent + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + Mỗi dòng (một liên kết dạng HTTP, hay dạng liên kết Magnet và thông tin về mã hash được hỗ trợ) + Download - Tải về + Tải về + Cancel - Hủy bỏ + Hủy bỏ + + + + Download from urls + Tải về từ đường dẫn + No URL entered - Chưa điền vào đường dẫn + Chưa điền vào đường dẫn + Please type at least one URL. - Xin vui lòng nhập vào ít nhất một đường dẫn. + Xin vui lòng nhập vào ít nhất một đường dẫn. errorDialog + Crash info - Thông tin về lỗi + Thông tin về lỗi fsutils - + + + + + Downloads Tải về @@ -10293,131 +8647,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) - + EiB exbibytes (1024 pebibytes) - + + Python not detected + + + + + Python version: %1 + + + + /s per second /giây - + %1h %2m e.g: 3hours 5minutes %1 giờ %2 phút - + %1d %2h e.g: 2days 10hours %1d %2h - + Unknown Unknown (size) Chưa rõ - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent sẽ tắt máy tính vì toàn bộ các phần tải về đã được hoàn tất. - + < 1m < 1 minute < 1phút - + %1m e.g: 10minutes %1phút + Working - Làm việc + Làm việc + Updating... - Đang cập nhật... + Đang cập nhật... + Not working - Đang không thực hiện + Đang không thực hiện + Not contacted yet - Chưa liên lạc được + Chưa liên lạc được preview - + Preview selection Xem sơ lược vùng lựa chọn - + The following files support previewing, please select one of them: Các tập tin phía sau đây hỗ trợ việc xem sơ lược, xin vui lòng chọn một trong các phần sau: + Preview - Xem sơ lược + Xem sơ lược + Cancel - Hủy bỏ - - - - trackerLogin - - Log in - Đăng nhập + Hủy bỏ diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_zh_HK.ts qbittorrent-3.3.15/src/lang/qbittorrent_zh_HK.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_zh_HK.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_zh_HK.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - + 關於qBittorrent - + About - + 關於 - + Author - - - - - Current maintainer - + 作者 - - Greece - 希臘(Greece) + + + Nationality: + 國家: - - - Nationality: - + + + Name: + 姓名: - - + + E-mail: - + 電郵: - - - Name: - + + Greece + 希臘 - - Original author - + + Current maintainer + 目前維護者 - - France - 法國(France) + + Original author + 原作者 - + Special Thanks - + 鳴謝 - + Translators - + 翻譯 - - License - - - - + Libraries - + 函式庫 - + qBittorrent was built with the following libraries: - - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - - - - - Copyright %1 2006-2018 The qBittorrent project - - - - - Home Page: - + qBittorrent使用下列函式庫建立: - - Forum: - + + France + 法國 - - Bug Tracker: - + + License + 授權 @@ -115,57 +90,67 @@ 儲存於 - + + Browse... + 瀏覽… + + + + Set as default save path + 設為預設儲存路徑 + + + Never show again 不要再顯示 - + Torrent settings Torrent設定 - + Set as default category 設定為預設分類 - + Category: 分類: - + Start torrent 開始Torrent - + Torrent information Torrent資訊 - + Skip hash check 略過驗證碼檢查 - + Size: 大小: - + Hash: 驗證碼: - + Comment: 評註: - + Date: 日期: @@ -190,117 +175,89 @@ 自動 - - Remember last used save path - - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog 選取時,「.torrent」檔不會被清除。本指示凌駕喜好設定「下載」分頁的指示。 - + Do not delete .torrent file 不要刪除「.torrent」檔 - - Create subfolder - - - - - Download in sequential order - 依順序下載 - - - - Download first and last pieces first - 先下載首片段和最後片段 - - - + Normal 一般 - + High - + Maximum 最高 - + Do not download 不要下載 - - - + + + I/O Error 入出錯誤 - + Invalid torrent 無效Torrent - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - + + + + + Already in download list + 已於下載清單。 - + Not Available This comment is unavailable 不可選用 - + Not Available This date is unavailable 不可選用 - + Not available 不可選用 - + Invalid magnet link 無效磁性連結 - + The torrent file '%1' does not exist. Torrent檔「%1」不存在。 - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. 無法從磁碟中讀取Torrent檔「%1」。你可能權限不足。 - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ 錯誤:%2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torrent已於下載清單。私人Torrent原故,追蹤器不會合併。 + + + + Torrent is already in download list. Trackers were merged. + Torrent已於下載清單。追蹤器被合併。 + + + + + Cannot add torrent + 無法加入Torrent + + + + Cannot add this torrent. Perhaps it is already in adding state. + 無法加入這Torrent。可能正在加入狀態。 + + + This magnet link was not recognized 無法辨認這磁性連結 - + + Magnet link is already in download list. Trackers were merged. + 磁性連結已於下載清單。追蹤器被合併。 + + + + Cannot add this torrent. Perhaps it is already in adding. + 無法加入這Torrent。可能已加入。 + + + Magnet link 磁性連結 - + Retrieving metadata... 檢索元資料… - + Not Available This size is unavailable. 不可選用 - + Free space on disk: %1 可用磁碟空間:%1 - + + Choose save path 選取儲存路徑 - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - + + Rename the file + 重新命名檔案 - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + + New name: + 新名稱: - - Magnet link is already queued for processing. - + + + The file could not be renamed + 檔案無法重新命名 - - New name: - 新名稱: + + This file name contains forbidden characters, please choose a different one. + 檔名包含不准使用的字元,請另選名稱。 - - + + This name is already in use in this folder. Please use a different name. 資料夾存在同名項目。請另選名稱。 - + The folder could not be renamed 這資料夾無法重新命名 - + Rename... 重新命名… - + Priority 優先權 - + Invalid metadata 無效元資料 - + Parsing metadata... 解析元資料… - + Metadata retrieval complete 完成檢索元資料 - + Download Error 下載錯誤 @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + 磁碟寫入快存大小 + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] 連出埠最小數值(0:停用) - + Outgoing ports (Max) [0: Disabled] 連出埠最大數值(0:停用) - + Recheck torrents on completion 完成後重新檢查Torrent - + Transfer list refresh interval 傳輸資訊更新間距 - + ms milliseconds 毫秒 - + Setting 設定 - + Value Value set for this setting - - - (disabled) - - - - + (auto) (自動) - - min - minutes - - - - + All addresses 全部位址 - + qBittorrent Section qBittorrent部份 - - + + Open documentation 網上說明 - + libtorrent Section libtorrent部份 - - Asynchronous I/O threads - - - - - Disk cache - - - - + s seconds - + Disk cache expiry interval 磁碟快存到期間距 - + Enable OS cache 啟用作業系統快存 - - Guided read cache - - - - - Coalesce reads & writes - - - - - Send upload piece suggestions - - - - - - KiB - - - - - Send buffer watermark - - - - - Send buffer low watermark - - - - - Send buffer watermark factor - - - - - Prefer TCP - - - - - Peer proportional (throttles TCP) - - - - - Allow multiple connections from the same IP address - + + m + minutes + 分鐘 - + Resolve peer countries (GeoIP) 分析同路人所在地(GeoIP) - + Resolve peer host names 分析同路人主機名 - + Strict super seeding 嚴格超級種子 - + Network Interface (requires restart) 網絡介面(須重新啟動) - + Optional IP Address to bind to (requires restart) 可用於配對的IP位址(須重新啟動) - + Listen on IPv6 address (requires restart) 監聽IPv6位址(須重新啟動) - + Display notifications 顯示程式通知 - + Display notifications for added torrents 顯示已加入Torrent的通知 - + Download tracker's favicon 下載追蹤器圖示 - - Save path history length - - - - - Fixed slots - - - - - Upload rate based - - - - - Upload slots behavior - - - - - Round-robin - - - - - Fastest upload - - - - - Anti-leech - - - - - Upload choking algorithm - - - - + Confirm torrent recheck 重新檢查Torrent時須確認 - - Confirm removal of all tags - - - - - Always announce to all trackers in a tier - + Exchange trackers with other peers + 與其他同路人交換追蹤器 - - Always announce to all tiers - + + Always announce to all trackers + 總是發佈到全部追蹤器 - + Any interface i.e. Any network interface 任何介面 - + Save resume data interval How often the fastresume file is saved. 儲存項目進度間距 - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - - - - + Maximum number of half-open connections [0: Unlimited] 最大半開啟連接數(0:無限) - + IP Address to report to trackers (requires restart) 告知追蹤器的IP位址(須重新啟動) - + Enable embedded tracker 啟用嵌入式追蹤器 - + Embedded tracker port 嵌入式追蹤器埠 - + Check for software updates 自動檢查軟件更新 - + Use system icon theme 使用系統圖示主題 @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started 已啟動qBittorrent %1 - + Torrent: %1, running external program, command: %2 Torrent:%1,啟用外部程式,指令:%2 - - Torrent name: %1 - - - - - Torrent size: %1 - - - - - Save path: %1 - - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - - - - - Thank you for using qBittorrent. - - - - - [qBittorrent] '%1' has finished downloading - + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrent:%1,過長的外部程式指令(多於%2),執行失敗。 - + Torrent: %1, sending mail notification Torrent:%1,傳送電郵通知 - + Information 資訊 - - To control qBittorrent, access the Web UI at %1 - + + To control qBittorrent, access the Web UI at http://localhost:%1 + 遙控qBittorrent,從「http://localhost:%1」存取Web UI遠端控制 - + The Web UI administrator user name is: %1 Web UI遠端控制管理員名稱是:%1 - + The Web UI administrator password is still the default one: %1 Web UI遠端控制管理員密碼仍是預設的:%1 - + This is a security risk, please consider changing your password from program preferences. 存在安全風險,請考慮於喜好設定更改密碼。 - + Saving torrent progress... 儲存Torrent進度… - - - Portable mode and explicit profile directory options are mutually exclusive - - - - - Portable mode implies relative fastresume - - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: 儲存到: @@ -861,834 +658,698 @@ RSS下載器 - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - + + Enable Automated RSS Downloader + 啟用自動RSS下載器 - + Download Rules 下載規則 - + Rule Definition 規則定義 - + Use Regular Expressions 使用正規表示法 - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - - - - - Use Smart Episode Filter - - - - + Must Contain: 必須包含: - + Must Not Contain: 必須不包含: - + Episode Filter: 集數過濾器: - + Assign Category: 指派分類: - + Save to a Different Directory 儲存到其他路徑 - + Ignore Subsequent Matches for (0 to Disable) ... X days 忽略後來相符項目(0:停用) - + Disabled - + 已停用 - + days - + Add Paused: 加入已暫停的: - + Use global settings 使用整體設定 - + Always 總是 - + Never 從不 - + Apply Rule to Feeds: 套用規則到Feed: - + Matching RSS Articles 搜尋相符RSS文章 - + &Import... 匯入(&I)… - + &Export... 匯出(&E)… - + Matches articles based on episode filter. 基於集數過濾器搜尋相符文章。 - + Example: 例子: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match 相符第1季的第2、第5、第8至15,以及由第30集起的往後集數 - + Episode filter rules: 集數過濾器規則: - + Season number is a mandatory non-zero value 季度數值須大於零 - + Episode number is a mandatory non-zero value + 集數數值須大於零 + + + Filter must end with semicolon 過濾器須以分號作結尾 - + Three range types for episodes are supported: 接受3種集數表達方式: - + Single number: <b>1x25;</b> matches episode 25 of season one 指明集數:<b>1x25;</b> 即第1季第25集 - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one 集數範圍:<b>1x25-40;</b>即第1季第25至40集 - - Episode number is a mandatory positive value - - - - - Rules - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + 往後集數:<b>1x25-;</b> 即第1季由第25集起的往後集數 - - Rules (legacy) + + Episode number is a mandatory positive value - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - + Last Match: %1 days ago 最後相符:%1日前 - + Last Match: Unknown 最後相符:未知 - + New rule name 新規則名 - + Please type the name of the new download rule. 請輸入新下載規則名稱。 - - + + Rule name conflict 規則名稱衝突 - - + + A rule with this name already exists, please choose another name. 存在同名規則,請另選名稱。 - + Are you sure you want to remove the download rule named '%1'? 清除下載規則「%1」,確定? - + Are you sure you want to remove the selected download rules? 清除所選下載規則,確定? - + Rule deletion confirmation 確認清除規則 - + Destination directory 目標路徑 - + Invalid action - + 無效行動 - + The list is empty, there is nothing to export. - + 清單空白,不會匯出任何東西。 - - Export RSS rules - + + Where would you like to save the list? + 清單存放何處? - - + + Rules list (*.rssrules) + 規則清單(*.rssrules) + + + I/O Error - 入出錯誤 + 入出錯誤 - - Failed to create the destination file. Reason: %1 - + + Failed to create the destination file + 無法建立目標檔案 - - Import RSS rules - + + Please point to the RSS download rules file + 請指向RSS下載規則檔案 - - Failed to open the file. Reason: %1 - + + Rules list + 規則清單 - + Import Error - + 匯入錯誤 - - Failed to import the selected rules file. Reason: %1 - + + Failed to import the selected rules file + 匯入所選規則檔失敗 - + Add new rule... 加入新規則… - + Delete rule 刪除規則 - + Rename rule... 重新命名規則… - + Delete selected rules 刪除所選規則 - - Clear downloaded episodes... - - - - + Rule renaming 重新命名規則 - + Please type the new rule name 請輸入新規則名稱 - - Clear downloaded episodes - - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - - - - - Regex mode: use Perl-compatible regular expressions - - - - - - Position %1: %2 - + + Regex mode: use Perl-like regular expressions + 正規表示法模式:使用類Perl的正規表示法 - + Wildcard mode: you can use - + ? to match any single character - + * to match zero or more of any characters - + Whitespaces count as AND operators (all words, any order) - + | is used as OR operator - + If word order is important use * instead of whitespace. - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - + will match all articles. - + will exclude all articles. - - - BanListOptionsDialog - - - List of banned IP addresses - - - - - Ban IP - - - - - Delete - 刪除 - - - - - Warning - - - - The entered IP address is invalid. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + 萬用字元:<ul><li>? 問號代表任何單一字元</li><li>* 星號代表無或多個字元</li><li>空格代表運算子「AND」</li></ul> - - The entered IP is already banned. - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + 萬用字元:<ul><li>? 問號代表任何單一字元</li><li>* 星號代表無或多個字元</li><li>「|」代表運算子「OR」</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support 啟用和停用對PeX同路人交換的支援須重新啟動 - - Could not get GUID of configured network interface. Binding to IP %1 - - - - + Embedded Tracker [ON] 嵌入式追蹤器 [啟用中] - + Failed to start the embedded tracker! 無法開啟嵌入式追蹤器。 - + Embedded Tracker [OFF] 嵌入式追蹤器 [停用中] - + + '%1' reached the maximum ratio you set. Removing... + 「%1」已到你設定的最大分享率。清除中… + + + + '%1' reached the maximum ratio you set. Pausing... + 「%1」已到你設定的最大分享率。暫停中… + + + System network status changed to %1 e.g: System network status changed to ONLINE 系統網絡連線:%1 - + ONLINE 啟用 - + OFFLINE 停用 - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding %1的網絡設定已更改,正在更新階段配對 - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. 設定的網絡介面位址%1無效。 - - + Encryption support [%1] 加密支援 [%1] - - + FORCED 強制 - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - - - - - + Anonymous mode [%1] 匿名模式 [%1] - + Unable to decode '%1' torrent file. 無法解析Torrent檔「%1」 - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' 反復下載嵌入於Torrent「%2」的「%1」 - + Queue positions were corrected in %1 resume files - + Couldn't save '%1.torrent' 無法儲存「%1.torrent」 - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - - - - + because %1 is disabled. this peer was blocked because uTP is disabled. 因%1已被停用。 - + because %1 is disabled. this peer was blocked because TCP is disabled. 因%1已被停用。 - + URL seed lookup failed for URL: '%1', message: %2 網址「%1」搜尋URL種子失敗,訊息:%2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent監聽介面%1的埠%2/%3失敗。理由:%4。 - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + 「%1」已從傳輸清單和磁碟中清除。 + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + 「%1」已從傳輸清單清除。 + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... 下載「%1」中,請稍候… - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent正在嘗試監聽任何介面埠:%1 - + The network interface defined is invalid: %1 定義的網絡介面無效:%1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent正在嘗試監聽介面%1的埠:%2 - - Peer ID: - - - - - HTTP User-Agent is '%1' - - - - - + DHT support [%1] 支援DHT分散式網絡 [%1] - - - - - - - - - + + + + ON 啟用中 - - - - - - - - - + + + + OFF 停用中 - - + Local Peer Discovery support [%1] 支援LPD本地同路人發現 [%1] - - PeX support [%1] - - - - - '%1' reached the maximum ratio you set. Removed. - - - - - '%1' reached the maximum ratio you set. Paused. - - - - - '%1' reached the maximum seeding time you set. Removed. - - - - - '%1' reached the maximum seeding time you set. Paused. - + Restart is required to toggle Tracker Exchange support + 啟用和停用對追蹤器交換的支援須重新啟動 - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent未找到供監聽的%1本地位址 - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent監聽任何介面埠失敗:%1。理由:%2。 - + Tracker '%1' was added to torrent '%2' 追蹤器「%1」已加入到Torrent「%2」 - + Tracker '%1' was deleted from torrent '%2' 追蹤器「%1」已從Torrent「%2」刪除 - + URL seed '%1' was added to torrent '%2' 已加入URL種子「%1」到Torrent「%2」 - + URL seed '%1' was removed from torrent '%2' 已從Torrent「%2」清除URL種子「%1」 - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. 無法復原Torrent檔案「%1」。 - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number 成功解析IP過濾器:已套用%1個規則。 - + Error: Failed to parse the provided IP filter. 錯誤:解析IP過濾器失敗。 - - '%1' restored. - 'torrent name' restored. - - - - + Couldn't add torrent. Reason: %1 無法加入Torrent。理由:%1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + 已重新載入「%1」。(快速復原) + + + '%1' added to download list. 'torrent name' was added to download list. 「%1」已加入到下載清單。 - + An I/O error occurred, '%1' paused. %2 發生入出錯誤,「%1」已暫停。%2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP╱NAT-PMP:埠映射失敗,訊息:%1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP╱NAT-PMP:埠映射成功,訊息:%1 - + due to IP filter. this peer was blocked due to ip filter. 由於IP過濾器。 - + due to port filter. this peer was blocked due to port filter. 由於埠過濾器。 - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. 由於i2p混合模式限制。 - + because it has a low port. this peer was blocked because it has a low port. 由於低埠。 - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent成功監聽介面%1的埠:%2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 外部IP:%1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - - - - - On - - - - - Off - - - - - Successfully moved torrent: %1. New path: %2 - - - - + Could not move torrent: '%1'. Reason: %2 - + 無法移動Torrent「%1」。理由:%2 - + File sizes mismatch for torrent '%1', pausing it. - + 檔案大小不符Torrent「%1」,暫停。 - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - + 快速復原「%1」被拒。理由:%2。再檢查中… CategoryFilterModel - + Categories 分類 - + All - + 全部 - + Uncategorized @@ -1698,7 +1359,7 @@ Add category... - + 加入分類… @@ -1707,34 +1368,139 @@ - Edit category... - - - - Remove category - + 清除分類 - + Remove unused categories - + 清除未使用分類 - + Resume torrents 回復Torrent - + Pause torrents 暫停Torrent - + Delete torrents 刪除Torrent + + + New Category + 新分類 + + + + Category: + 分類: + + + + Invalid category name + 無效分類名 + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + 分類名不可包含「\」。 +分類名不可使用「/」作開頭或結尾。 +分類名不可包含「//」。 + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + 全部(0) + + + Uncategorized (0) + 未分類(0) + + + %1 (%2) + category_name (10) + %1(%2) + + + Uncategorized (%1) + 未分類(%1) + + + Add category... + 加入分類… + + + Remove category + 清除分類 + + + Remove unused categories + 清除未使用分類 + + + Resume torrents + 回復Torrent + + + Pause torrents + 暫停Torrent + + + Delete torrents + 刪除Torrent + + + New Category + 新分類 + + + Category: + 分類: + + + Invalid category name + 無效分類名 + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + 分類名不可包含「\」。 +分類名不可使用「/」作開頭或結尾。 +分類名不可包含「//」。 + + + All (%1) + this is for the category filter + 全部(%1) + CookiesDialog @@ -1773,616 +1539,574 @@ - DeletionConfirmationDialog - - - Deletion confirmation - - - - - Remember choice - - - - - Also delete the files on the hard disk - - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + 從傳輸清單清除「%1」,確定? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - - - - - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - 下載 - - - - No URL entered - - - - - Please type at least one URL. - + 從傳輸清單清除%1個Torrent,確定? DownloadedPiecesBar - + White: Missing pieces 白:從未下載 - + Green: Partial pieces 綠:部份下載 - + Blue: Completed pieces 藍:完成下載 - ExecutionLogWidget + ExecutionLog - + General - 一般 + 一般 - + Blocked IPs - + 被封鎖的IP - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font>被%2封鎖 - + <font color='red'>%1</font> was banned x.y.z.w was banned - + <font color='red'>%1</font>被封鎖 FeedListWidget - + RSS feeds RSS feeds - - - Unread (%1) - + + Unread + 未讀 FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - + + An error occured while trying to open the log file. Logging to file is disabled. + 嘗試開啟日誌檔時發生錯誤。寫入執行日誌已被停用。 - FileSystemPathEdit + FilterParserThread - - ... - Launch file dialog button text (brief) - + + + + I/O Error: Could not open ip filter file in read mode. + 入出錯誤:讀取模式下無法開啟IP過濾器檔。 - - &Browse... - Launch file dialog button text (full) - + + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. + 解析錯誤:過濾器檔並非有效的PeerGuardian P2B檔。 + + + GeoIPDatabase - - Choose a file - Caption for file open/save dialog - + + + Unsupported database file size. + 不支援的資料庫檔案大小。 - - Choose a folder - Caption for directory open dialog - + + Metadata error: '%1' entry not found. + 元資料錯誤:未能找到「%1」項。 - - Any file - - - - - FilterParserThread - - - - - I/O Error: Could not open IP filter file in read mode. - - - - - - - IP filter line %1 is malformed. - - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - - - - - - IP filter exception thrown for line %1. Exception is: %2 - - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - - - - - - - - - - - Parsing Error: The filter file is not a valid PeerGuardian P2B file. - 解析錯誤:過濾器檔並非有效的PeerGuardian P2B檔。 - - - - GeoIPDatabase - - - - Unsupported database file size. - 不支援的資料庫檔案大小。 - - - - Metadata error: '%1' entry not found. - 元資料錯誤:未能找到「%1」項。 - - - + Metadata error: '%1' entry has invalid type. 元資料錯誤:「%1」項類型無效。 - + Unsupported database version: %1.%2 不支援的資料庫版本:%1.%2 - + Unsupported IP version: %1 不支援的IP版本:%1 - + Unsupported record size: %1 不支援的記錄大小:%1 - + Invalid database type: %1 無效的資料庫類型:%1 - + Database corrupted: no data section found. 資料庫破損:未能找到資料部份。 - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - + + File + 檔案 - - Bad Http request, closing socket. IP: %s - + + Edit + 編輯 - - - HttpServer - + + Help + 說明 + + + Exit qBittorrent 關閉qBittorrent - + Only one link per line 一行一連結 - + + Download + 下載 + + + Global upload rate limit must be greater than 0 or disabled. 整體上載速度限制:請停用或設定大於零。 - + Global download rate limit must be greater than 0 or disabled. 整體下載速度限制:請停用或設定大於零。 - + Alternative upload rate limit must be greater than 0 or disabled. 特別上載速度限制:請停用或設定大於零。 - + Alternative download rate limit must be greater than 0 or disabled. 特別下載速度限制:請停用或設定大於零。 - + Maximum active downloads must be greater than -1. 最大活躍下載數量須大於-1。 - + Maximum active uploads must be greater than -1. 最大活躍上載數量須大於-1。 - + Maximum active torrents must be greater than -1. 最大活躍Torrent數量須大於-1。 - + Maximum number of connections limit must be greater than 0 or disabled. 整體最大連接數量限制:請停用或設定大於零。 - + Maximum number of connections per torrent limit must be greater than 0 or disabled. 每個Torrent最大連接數量限制:請停用或設定大於零。 - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. 每個Torrent上載最大連接數量限制:請停用或設定大於零。 - + Unable to save program preferences, qBittorrent is probably unreachable. 無法儲存喜好設定:可能連接不到qBittorrent。 - - IRC: #qbittorrent on Freenode - - - - - Invalid category name: -Please do not use any special characters in the category name. - - - - - Unknown - 未知 - - - - Hard Disk - - - - - Share ratio limit must be between 0 and 9998. - - - - - Seeding time limit must be between 0 and 525600 minutes. - + + Language + 語言 - + The port used for incoming connections must be between 1 and 65535. 連入埠數值須介乎1至65535。 - + The port used for the Web UI must be between 1 and 65535. Web UI遠端控制埠數值須介乎1至65535。 - + Unable to log in, qBittorrent is probably unreachable. 無法登入:可能連接不到qBittorrent。 - + Invalid Username or Password. 無效用戶名稱或密碼。 - - Username - - - - + Password 密碼 - + Login 登入 - + + Upload Failed! + 上載失敗! + + + Original authors 原作者 - + + Upload limit: + 上載速度限制: + + + + Download limit: + 下載速度限制: + + + Apply 套用 - + Add 加入 - + + Category: + 分類: + + + Upload Torrents Upload torrent files to qBittorent using WebUI 上載Torrent - + + All + 全部 + + + + Downloading + 下載中 + + + + Seeding + 做種中 + + + + Completed + 完成 + + + + Resumed + 回復下載 + + + + Paused + 暫停 + + + + Active + 活躍 + + + + Inactive + 不活躍 + + + Save files to location: 儲存檔案到: - + Cookie: Cookie: - + Type folder here 在此輸入資料夾 - + + Run an external program on torrent completion + 完成Torrent時啟動外部程式 + + + + Enable bandwidth management (uTP) + 啟用頻寬管理(µTP) + + + + Apply rate limit to uTP connections + 將速度限制套用到µTP連接 + + + + Alternative Global Rate Limits + 特別整體速度限制 + + + More information 更多資訊 - + Information about certificates 關於憑證的資訊 - + Save Files to 儲存檔案到 - - Set location - - - - - Limit upload rate - + + Watch Folder + 監視資料夾 - - Limit download rate - + + Default Folder + 預設資料夾 - - Rename torrent - + + from + from time1 to time2 + - - Unable to create category - + + to + from time1 to time2 + - + Other... Save Files to: Watch Folder / Default Folder / Other... 其他… - + + Every day + Schedule the use of alternative rate limits on ... + 每日 + + + + Week days + Schedule the use of alternative rate limits on ... + 工作日 + + + + Week ends + Schedule the use of alternative rate limits on ... + 週末 + + + Monday Schedule the use of alternative rate limits on ... 星期一 - + Tuesday Schedule the use of alternative rate limits on ... 星期二 - + Wednesday Schedule the use of alternative rate limits on ... 星期三 - + Thursday Schedule the use of alternative rate limits on ... 星期四 - + Friday Schedule the use of alternative rate limits on ... 星期五 - + Saturday Schedule the use of alternative rate limits on ... 星期六 - + Sunday Schedule the use of alternative rate limits on ... 星期日 - + + Downloaded + Is the file downloaded or not? + 已下載 + + + Logout 登出 - + + Download from URLs + 從網址下載 + + + Download Torrents from their URLs or Magnet links 從網址或磁性連結下載Torrent - + Upload local torrent 上載本地Torrent - + Are you sure you want to delete the selected torrents from the transfer list? 從傳輸清單清除所選Torrent,確定? - + Save 儲存 - + qBittorrent client is not reachable 連接不到qBittorrent用戶端 - - qBittorrent has been shutdown. - qBittorrent已關閉。 - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - + + HTTP Server + HTTP伺服器 - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - + + The following parameters are supported: + 支援以下參數: - - Add subnet - + + Torrent path + Torrent路徑 - - Delete - 刪除 + + Torrent name + Torrent名稱 - - Error - 錯誤 + + qBittorrent has been shutdown. + qBittorrent已關閉。 + + + LineEdit - - The entered subnet is invalid. - + + Clear the text + 清除文字 LogListWidget - + Copy 複製 - + Clear 清除 @@ -2415,550 +2139,492 @@ 下載完成時(&D) - + &View 檢視(&V) - + &Options... 喜好設定(&O) - + &Resume 取消暫停(&R) - + Torrent &Creator Torrent建立工具(&C) - + Set Upload Limit... 設定上載速度限制… - + Set Download Limit... 設定下載速度限制… - + Set Global Download Limit... 設定整體下載速度限制… - + Set Global Upload Limit... 設定整體上載速度限制… - + Minimum Priority 最低優先權 - + Top Priority 最高優先權 - + Decrease Priority 減低優先權 - + Increase Priority 提高優先權 - - + + Alternative Speed Limits 特別速度限制 - + &Top Toolbar 頂端工具列(&T) - + Display Top Toolbar 顯示頂端工具列 - - Status &Bar - - - - + S&peed in Title Bar 標題列和工作列按鈕顯示速度(&P) - + Show Transfer Speed in Title Bar 標題列和工作列按鈕顯示傳輸速度 - + &RSS Reader RSS閱讀器(&R) - + Search &Engine 搜尋引擎(&E) - + L&ock qBittorrent 鎖定qBittorrent(&O) - + Do&nate! 捐款(&N) - - Close Window - - - - + R&esume All 全部取消暫停(&E) - + Manage Cookies... 管理Cookie… - + Manage stored network cookies 管理留駐的網絡Cookie… - + Normal Messages 一般訊息 - + Information Messages 資訊訊息 - + Warning Messages 警告訊息 - + Critical Messages 重要訊息 - + &Log 執行日誌(&L) - + &Exit qBittorrent 關閉qBittorrent - + &Suspend System 睡眠 - + &Hibernate System 休眠 - + S&hutdown System 關機 - + &Disabled 甚麼都不做 - + &Statistics 統計資料(&S) - + Check for Updates 檢查更新 - + Check for Program Updates 檢查程式更新 - + &About 關於(&A) - + &Pause 暫停(&P) - + &Delete 刪除(&D) - + P&ause All 全部暫停(&A) - + &Add Torrent File... 加入Torrent檔案(&A) - + Open 開啟 - + E&xit 離開(&X) - + Open URL 開啟網址 - + &Documentation 網上說明(&D) - + Lock 鎖定 - - - + + + Show 顯示 - + Check for program updates 檢查程式更新 - + Add Torrent &Link... 加入Torrent連結(&L) - + If you like qBittorrent, please donate! 如果你喜歡qBittorrent,請捐款! - - + Execution Log 執行日誌 - + Clear the password 清除密碼 - + Filter torrent list... 過濾Torrent清單… - + &Set Password 設定密碼(&S) - - Preferences - - - - + &Clear Password 清除密碼(&C) - + Transfers 傳輸 - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Torrent檔案關聯 - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent不是你開啟Torrent檔或磁性連結的預設程式。 你想要以qBittorrent開啟Torrent檔和磁性連結嗎? - + Icons Only 只有圖示 - + Text Only 只有文字 - + Text Alongside Icons 文字於圖示旁 - + Text Under Icons 文字於圖示下 - + Follow System Style 跟隨系統風格 - - - + + + UI lock password UI鎖定密碼 - - - + + + Please type the UI lock password: 請輸入UI鎖定密碼: - + The password should contain at least 3 characters 密碼最少含3個字元 - + Password update 更改密碼 - + The UI lock password has been successfully updated 已更改UI鎖定密碼 - + Are you sure you want to clear the password? 清除密碼,確定? - - Use regular expressions - - - - + Search 搜尋 - + Transfers (%1) 傳輸(%1) - + Error 錯誤 - + Failed to add torrent: %1 無法加入Torrent:%1 - + Torrent added 已加入Torrent - + '%1' was added. e.g: xxx.avi was added. 已加入「%1」。 - + Download completion 下載完成 - + I/O Error i.e: Input/Output Error 入出錯誤 - + Recursive download confirmation 確認反復下載 - + Yes - + No - + Never 從不 - + Global Upload Speed Limit 整體上載速度限制 - + Global Download Speed Limit 整體下載速度限制 - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - - - - - Are you sure you want to quit qBittorrent? - - - - + &No 否(&N) - + &Yes 是((&Y) - + &Always Yes 總是(&A) - - %1/s - s is a shorthand for seconds - - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter 舊Python直譯器 - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. 你的Pyrhon版本%1過時,請升級。搜尋引擎需要Pyrhon版本2.7.9╱3.3.0或以上。 - + qBittorrent Update Available qBittorrent存在新版本 - + + A new version is available. +Do you want to download %1? + 存在新版本。 +下載%1嗎? + + + Already Using the Latest qBittorrent Version 已經是最新版qBittorrent。 - + Undetermined Python version 不確定的Python版本 - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. 完成下載「%1」。 - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2967,158 +2633,154 @@ 理由:%2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? Torrent「%1」含未完成下載的檔案,嘗試完成嗎? - + Couldn't download file at URL '%1', reason: %2. 無法於網址「%1」下載檔案,理由:%2。 - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin 於「%1: %2」找到Python - - + + Couldn't determine your Python version (%1). Search engine disabled. + 未能辨認Python版本(%1)。搜尋引擎被停用。 + + + + Missing Python Interpreter 沒有Python直譯器 - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? 沒有安裝搜尋引擎需要的Pyrhon。 立即安裝? - + Python is required to use the search engine but it does not seem to be installed. 沒有安裝搜尋引擎需要的Pyrhon。 - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. 沒有較新的版本 你的版本已是最新。 - + &Check for Updates 檢查更新(&C) - + Checking for Updates... 正在檢查更新… - + Already checking for program updates in the background 已於背景檢查程式更新 - + Python found in '%1' 於「%1」找到Python - + Download error 下載錯誤 - + Python setup could not be downloaded, reason: %1. Please install it manually. Python安裝程式無法下載。理由:%1。 請手動安裝。 - - + + Invalid password 無效密碼 - - - + + RSS (%1) RSS(%1) - + URL download error 網址下載錯誤 - + The password is invalid 無效密碼 - - + + DL speed: %1 e.g: Download speed: 10 KiB/s 下載速度:%1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s 上載速度:%1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [下載:%1,上載:%2] qBittorrent %3 - + Hide 隱藏 - + Exiting qBittorrent 離開qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + 部份檔案仍在傳輸。 +確定離開qBittorrent嗎? + + + Open Torrent Files 開啟Torrent檔 - + Torrent Files Torrent檔 - + Options were saved successfully. 成功儲存喜好設定。 @@ -3126,52 +2788,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. 成功更新動態DNS。 - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. 動態DNS錯誤:服務暫時無法使用,將在30分鐘後重試。 - + Dynamic DNS error: hostname supplied does not exist under specified account. 動態DNS錯誤:提供的主機名稱於指定帳號不存在。 - + Dynamic DNS error: Invalid username/password. 動態DNS錯誤:無效的用戶名稱╱密碼。 - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. 動態DNS錯誤:qBittorrent被該服務封鎖,請通報這問題至http://bugs.qbittorrent.org。 - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. 動態DNS錯誤:該服務傳回%1,請通報這問題至http://bugs.qbittorrent.org。 - + Dynamic DNS error: Your username was blocked due to abuse. 動態DNS錯誤:你的用戶名稱因濫用而被封鎖。 - + Dynamic DNS error: supplied domain name is invalid. 動態DNS錯誤:提供的域名無效。 - + Dynamic DNS error: supplied username is too short. 動態DNS錯誤:提供的用戶名稱太短。 - + Dynamic DNS error: supplied password is too short. 動態DNS錯誤:提供的密碼太短。 @@ -3179,1413 +2841,1303 @@ Net::DownloadHandler - + I/O Error 入出錯誤 - + The file size is %1. It exceeds the download limit of %2. 檔案大小為%1。它超過了%2的下載限制。 - + Unexpected redirect to magnet URI. 未預期重新導向到磁性連結 - - - The remote host name was not found (invalid hostname) - - - - - The operation was canceled - - - - - The remote server closed the connection prematurely, before the entire reply was received and processed - - - - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - Net::GeoIPManager - - + + GeoIP database loaded. Type: %1. Build time: %2. 已載入GeoIP資料庫。類型:%1。版本時間:%2。 - - + + Couldn't load GeoIP database. Reason: %1 無法載入GeoIP資料庫。理由:%1 - + Venezuela, Bolivarian Republic of 委內瑞拉(Venezuela) - + Viet Nam 越南(Viet Nam) - - + + N/A (無) - + Andorra 安道爾(Andorra) - + United Arab Emirates 阿拉伯聯合酋長國(United Arab Emirates) - + Afghanistan 阿富汗(Afghanistan) - + Antigua and Barbuda 安提瓜和巴布達(Antigua and Barbuda) - + Anguilla 安圭拉(Anguilla) - + Albania 阿爾巴尼亞(Albania) - + Armenia 阿美尼亞(Armenia) - + Angola 安哥拉(Angola) - + Antarctica 南極洲(Antarctica) - + Argentina 阿根廷(Argentina) - + American Samoa 美屬薩摩亞(American Samoa) - + Austria 奧地利(Austria) - + Australia 澳洲(Australia) - + Aruba 阿魯巴(Aruba) - + Azerbaijan 阿西拜疆(Azerbaijan) - + Bosnia and Herzegovina 波斯尼亞(Bosnia) - + Barbados 巴巴多斯(Barbados) - + Bangladesh 孟加拉(Bangladesh) - + Belgium 比利時(Belgium) - + Burkina Faso 布基納法索(Burkina Faso) - + Bulgaria 保加利亞(Bulgaria) - + Bahrain 巴林(Bahrain) - + Burundi 布隆迪(Burundi) - + Benin 貝寧(Benin) - + Bermuda 百慕達(Bermuda) - + Brunei Darussalam 汶萊(Brunei) - + Brazil 巴西(Brazil) - + Bahamas 巴哈馬(Bahamas) - + Bhutan 不丹(Bhutan) - + Bouvet Island 鮑威特島(Bouvet Island) - + Botswana 博茨華納(Botswana) - + Belarus 白俄羅斯(Belarus) - + Belize 伯利茲(Belize) - + Canada 加拿大(Canada) - + Cocos (Keeling) Islands 可可斯群島(Cocos Islands) - + Congo, The Democratic Republic of the 剛果民主共和國(Democratic Republic of Congo) - + Central African Republic 中非共和國(Central African Republic) - + Congo 剛果(Congo) - + Switzerland 瑞士(Switzerland) - + Cook Islands 庫克群島(Cook Islands) - + Chile 智利(Chile) - + Cameroon 喀麥隆(Cameroon) - + China 中華人民共和國(China) - + Colombia 哥倫比亞(Colombia) - + Costa Rica 哥斯達黎加(Costa Rica) - + Cuba 古巴(Cuba) - + Cape Verde 佛得角(Cape Verde) - + Curacao 古拉索(Curacao) - + Christmas Island 聖誕島(Christmas Island) - + Cyprus 西浦路斯(Cyprus) - + Czech Republic 捷克(Czech Republic) - + Germany 德國(Germany) - + Djibouti 吉布提(Djibouti) - + Denmark 丹麥(Denmark) - + Dominica 多明尼加聯邦(Dominica) - + Dominican Republic 多明尼加共和國(Dominican Republic) - + Algeria 阿爾及利亞(Algeria) - + Ecuador 厄瓜多爾(Ecuador) - + Estonia 愛沙尼亞(Estonia) - + Egypt 埃及(Egypt) - + Western Sahara 西撒哈拉(Western Sahara) - + Eritrea 厄立特里亞(Eritrea) - + Spain 西班牙(Spain) - + Ethiopia 衣索比亞(Ethiopia) - + Finland 芬蘭(Finland) - + Fiji 斐濟(Fiji) - + Falkland Islands (Malvinas) 福克蘭群島(Falkland Islands) - + Micronesia, Federated States of 密克羅尼西亞聯邦(Federated States of Micronesia) - + Faroe Islands 法羅群島(Faroe Islands) - + France 法國(France) - + Gabon 加蓬(Gabon) - + United Kingdom 英國(United Kingdom) - + Grenada 格林納達(Grenada) - + Georgia 格魯吉亞(Georgia) - + French Guiana 法屬圭亞那(French Guiana) - + Ghana 加納(Ghana) - + Gibraltar 直布羅陀(Gibraltar) - + Greenland 格陵蘭(Greenland) - + Gambia 岡比亞(Gambia) - + Guinea 幾內亞(Guinea) - + Guadeloupe 瓜德羅普(Guadeloupe) - + Equatorial Guinea 赤道幾內亞(Equatorial Guinea) - + Greece 希臘(Greece) - + South Georgia and the South Sandwich Islands 南喬治亞和南三文治群島(South Georgia and South Sandwich Islands) - + Guatemala 危地馬拉(Guatemala) - + Guam 關島(Guam) - + Guinea-Bissau 幾內亞比紹(Guinea-Bissau) - + Guyana 圭亞那(Guyana) - + Hong Kong 香港(Hong Kong) - + Heard Island and McDonald Islands 凱德島和麥當奴群島(Heard Island and McDonald Islands) - + Honduras 洪都拉斯(Honduras) - + Croatia 克羅地亞(Croatia) - + Haiti 海地(Haiti) - + Hungary 匈牙利(Hungary) - + Indonesia 印尼(Indonesia) - + Ireland 愛爾蘭(Ireland) - + Israel 以色列(Israel) - + India 印度(India) - + British Indian Ocean Territory 英屬印度洋領地(British Indian Ocean Territory) - + Iraq 伊拉克(Iraq) - + Iran, Islamic Republic of 伊朗(Iran) - + Iceland 冰島(Iceland) - + Italy 意大利(Italy) - + Jamaica 牙買加(Jamaica) - + Jordan 約旦(Jordan) - + Japan 日本(Japan) - + Kenya 肯亞(Kenya) - + Kyrgyzstan 吉爾吉斯(Kyrgyzstan) - + Cambodia 柬埔寨(Cambodia) - + Kiribati 基里巴斯(Kiribati) - + Comoros 科摩羅(Comoros) - + Saint Kitts and Nevis 聖基茨和尼維斯(Saint Kitts and Nevis) - + Korea, Democratic People's Republic of 朝鮮(North Korea) - + Korea, Republic of 韓國(South Korea) - + Kuwait 科威特(Kuwait) - + Cayman Islands 開曼群島(Cayman Islands) - + Kazakhstan 哈薩克(Kazakhstan) - + Lao People's Democratic Republic 寮國(Laos) - + Lebanon 黎巴嫩(Lebanon) - + Saint Lucia 聖盧西亞(Saint Lucia) - + Liechtenstein 列支敦士登(Liechtenstein) - + Sri Lanka 斯里蘭卡(Sri Lanka) - + Liberia 利比里亞(Liberia) - + Lesotho 萊索托(Lesotho) - + Lithuania 立陶宛(Lithuania) - + Luxembourg 盧森堡(Luxembourg) - + Latvia 拉脫維亞(Latvia) - + Morocco 摩洛哥(Morocco) - + Monaco 摩納哥(Monaco) - + Moldova, Republic of 摩爾多瓦(Moldova) - + Madagascar 馬達加斯加(Madagascar) - + Marshall Islands 馬紹爾群島(Marshall Islands) - + Mali 馬里(Mali) - + Myanmar 緬甸(Myanmar) - + Mongolia 蒙古(Mongolia) - + Northern Mariana Islands 北馬里亞納群島(Northern Mariana Islands) - + Martinique 馬提尼克(Martinique) - + Mauritania 毛里塔尼亞(Mauritania) - + Montserrat 滿特西拉特(Montserrat) - + Malta 馬耳他(Malta) - + Mauritius 毛里求斯(Mauritius) - + Maldives 馬爾代夫(Maldives) - + Malawi 馬拉維(Malawi) - + Mexico 墨西哥(Mexico) - + Malaysia 馬來西亞(Malaysia) - + Mozambique 莫桑比克(Mozambique) - + Namibia 納米比亞(Namibia) - + New Caledonia 新喀里多尼亞(New Caledonia) - + Niger 尼日爾(Niger) - + Norfolk Island 諾福克島(Norfolk Island) - + Nigeria 尼日利亞(Nigeria) - + Nicaragua 尼加拉瓜(Nicaragua) - + Netherlands 荷蘭(Netherlands) - + Norway 挪威(Norway) - + Nepal 尼泊爾(Nepal) - + Nauru 瑙魯(Nauru) - + Niue 紐埃(Niue) - + New Zealand 新西蘭(New Zealand) - + Oman 阿曼(Oman) - + Panama 巴拿馬(Panama) - + Peru 秘魯(Peru) - + French Polynesia 法屬波利尼西亞(French Polynesia) - + Papua New Guinea 巴布亞新幾內亞(Papua New Guinea) - + Philippines 菲律賓(Philippines) - + Pakistan 巴基斯坦(Pakistan) - + Poland 波蘭(Poland) - + Saint Pierre and Miquelon 聖皮埃爾和密克隆(Saint Pierre and Miquelon) - + Puerto Rico 波多黎各(Puerto Rico) - + Portugal 葡萄牙(Portugal) - + Palau 帛琉(Palau) - + Paraguay 巴拉圭(Paraguay) - + Qatar 卡塔爾(Qatar) - + Reunion 留尼旺(Reunion) - + Romania 羅馬尼亞(Romania) - + Russian Federation 俄羅斯(Russia) - + Rwanda 盧旺達(Rwanda) - + Saudi Arabia 沙地阿拉伯(Saudi Arabia) - + Solomon Islands 所羅門群島(Solomon Islands) - + Seychelles 西舌爾(Seychelles) - + Sudan 蘇丹(Sudan) - + Sweden 瑞典(Sweden) - + Singapore 新加坡(Singapore) - + Slovenia 斯洛文尼亞(Slovenia) - + Svalbard and Jan Mayen 斯瓦巴和揚馬延(Svalbard and Jan Mayen) - + Slovakia 斯洛伐克(Slovakia) - + Sierra Leone 西拉利昂(Sierra Leone) - + San Marino 聖馬力諾(San Marino) - + Senegal 西內加爾(Senegal) - + Somalia 索馬里(Somalia) - + Suriname 蘇里南(Suriname) - + Sao Tome and Principe 聖多美和普林西比(Sao Tome and Principe) - + El Salvador 薩爾瓦多(El Salvador) - + Syrian Arab Republic 敘利亞(Syria) - + Swaziland 斯威士蘭(Swaziland) - + Turks and Caicos Islands 特克斯群島和凱科斯群島(Turks and Caicos Islands) - + Chad 乍得(Chad) - + French Southern Territories 法屬南部領地(French Southern Territories) - + Togo 多哥(Togo) - + Thailand 泰國(Thailand) - + Tajikistan 塔吉克(Tajikistan) - + Tokelau 托克勞(Tokelau) - + Turkmenistan 土庫曼(Turkmenistan) - + Tunisia 突尼西亞(Tunisia) - + Tonga 湯加(Tonga) - - Could not decompress GeoIP database file. - - - - + Timor-Leste 東帝汶(East Timor) - + Bolivia, Plurinational State of 玻利維亞(Bolivia) - + Bonaire, Sint Eustatius and Saba 波奈、聖圖達斯和薩巴(Bonaire, Sint Eustatius and Saba) - + Cote d'Ivoire 科特迪瓦(Cote d'Ivoire) - + Libya 利比亞(Libya) - + Saint Martin (French part) 法屬聖馬丁(Saint Martin) - + Macedonia, The Former Yugoslav Republic of 馬其頓(Macedonia) - + Macao 澳門(Macao) - + Pitcairn 皮特凱恩(Pitcairn) - + Palestine, State of 巴勒斯坦(Palestine) - + Saint Helena, Ascension and Tristan da Cunha 聖凱倫娜、阿森淳和崔斯坦達庫尼亞(Saint Helena, Ascension and Tristan da Cunha) - + South Sudan 南蘇丹(South Sudan) - + Sint Maarten (Dutch part) 荷屬聖馬丁(Sint Maarten) - + Turkey 土耳其(Turkey) - + Trinidad and Tobago 千里達和多巴哥(Trinidad and Tobago) - + Tuvalu 吐瓦魯(Tuvalu) - + Taiwan 臺灣(Taiwan) - + Tanzania, United Republic of 坦桑尼亞(Tanzania) - + Ukraine 烏克蘭(Ukraine) - + Uganda 烏干達(Uganda) - + United States Minor Outlying Islands 美國小型外島(United States Minor Outlying Islands) - + United States 美國(United States) - + Uruguay 烏拉圭(Uruguay) - + Uzbekistan 烏茲別克(Uzbekistan) - + Holy See (Vatican City State) 梵蒂岡(Vatican) - + Saint Vincent and the Grenadines 聖文森和格林納丁斯(Saint Vincent and the Grenadines) - + Virgin Islands, British 英屬處女群島(British Virgin Islands) - + Virgin Islands, U.S. 美屬處女群島(American Virgin Islands) - + Vanuatu 瓦努阿圖(Vanuatu) - + Wallis and Futuna 華利斯和富圖納(Wallis and Futuna) - + Samoa 薩摩亞(Samoa) - + Yemen 也門(Yemen) - + Mayotte 馬約特(Mayotte) - + Serbia 西爾維亞(Serbia) - + South Africa 南非(South Africa) - + Zambia 贊比亞(Zambia) - + Montenegro 黑山(Montenegro) - + Zimbabwe 津巴布韋(Zimbabwe) - + Aland Islands 奧蘭群島(Aland Islands) - + Guernsey 根西(Guernsey) - + Isle of Man 曼島(Isle of Man) - + Jersey 澤西(Jersey) - + Saint Barthelemy 聖巴泰勒米(Saint Barthelemy) - + + Could not uncompress GeoIP database file. + 無法解壓縮GeoIP資料庫檔。 + + + Couldn't save downloaded GeoIP database file. 無法儲存GeoIP資料庫檔。 - + Successfully updated GeoIP database. 成功更新GeoIP資料庫。 - + Couldn't download GeoIP database file. Reason: %1 無法下載GeoIP資料庫。理由:%1 @@ -4593,12 +4145,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] UPnP╱NAT-PMP支援 [啟用中] - + UPnP / NAT-PMP support [OFF] UPnP╱NAT-PMP支援 [停用中] @@ -4606,7 +4158,7 @@ Net::Smtp - + Email Notification Error: 電郵通知錯誤: @@ -4614,1273 +4166,1077 @@ OptionsDialog - + Options 喜好設定 - + Behavior 起行 - + Downloads 下載 - + Connection 連接 - + Speed 速度 - + BitTorrent BitTorrent - - RSS - - - - + Web UI 遠端控制 - + Advanced 進階 - + Language 語言 - + User Interface Language: 介面語言: - + (Requires restart) (須重新啟動) - + Transfer List 傳輸清單 - + Confirm when deleting torrents 刪除Torrent時須確認 - + Use alternating row colors In transfer list, one every two rows will have grey background. 單雙行交替背景色彩 - + Hide zero and infinity values 隱藏零和無限大數值 - + Always 總是 - + Paused torrents only 僅暫停Torrent - + Action on double-click 按兩下鼠鍵的行動 - + Downloading torrents: 下載中的Torrent: - - + + Start / Stop Torrent 開始╱停止Torrent - - + + Open destination folder 開啟存放位置 - - + + No action 甚麼都不做 - + Completed torrents: 完成的Torrent: - + Desktop 基本 - + Start qBittorrent on Windows start up Windows啟動時啟動qBittorrent - + Show splash screen on start up 啟動時顯示開始畫面 - + Start qBittorrent minimized 啟動時最小化qBittorrent - + Confirmation on exit when torrents are active Torrent活躍時,離開須確認 - + Confirmation on auto-exit when downloads finish 完成下載所觸發的「自動離開」須確認 - - KiB - - - - - Email notification &upon download completion - + + Show qBittorrent in notification area + 工作列通知區域顯示qBittorrent圖示 - - Run e&xternal program on torrent completion - + + Minimize qBittorrent to notification area + 最小化qBittorrent到工作列通知區域 - - IP Fi&ltering - + + Close qBittorrent to notification area + i.e: The systray tray icon will still be visible when closing the main window. + 關閉qBittorrent到工作列通知區域 - - Schedule &the use of alternative rate limits - + + Tray icon style: + 圖示款式: - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - + + Normal + 一般 - - &Torrent Queueing - + + Monochrome (Dark theme) + 單色(深色主題) - - Seed torrents until their seeding time reaches - + + Monochrome (Light theme) + 單色(淺色主題) - - A&utomatically add these trackers to new downloads: - + + File association + 檔案關聯 - - RSS Reader - + + Use qBittorrent for .torrent files + Torrent檔使用qBittorrent - - Enable fetching RSS feeds - + + Use qBittorrent for magnet links + 磁性連結使用qBittorrent - - Feeds refresh interval: - + + Power Management + 電源管理 - - Maximum number of articles per feed: - + + Inhibit system sleep when torrents are active + Torrent活躍時,防止系統休眠 - - - min - minutes - + + Log file + 備份執行日誌 - - RSS Torrent Auto Downloader - + + Save path: + 儲存路徑: - - Enable auto downloading of RSS torrents - + + Backup the log file after: + 備份日誌檔,每滿 - - Edit auto downloading rules... - + + MB + MB - - Web User Interface (Remote control) - + + Delete backup logs older than: + 只保存備份日誌: - - IP address: - + + days + Delete backup logs older than 10 months + - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - + + months + Delete backup logs older than 10 months + - - Server domains: - + + years + Delete backup logs older than 10 years + - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - + + When adding a torrent + 加入Torrent時 - - &Use HTTPS instead of HTTP - + + Display torrent content and some options + 顯示Torrent內容和其他選項 - - Bypass authentication for clients on localhost - + + Bring torrent dialog to the front + 保持Torrent話匣在畫面最上層 - - Bypass authentication for clients in whitelisted IP subnets - - - - - IP subnet whitelist... - - - - - Upda&te my dynamic domain name - - - - - Minimize qBittorrent to notification area - 最小化qBittorrent到工作列通知區域 - - - - Close qBittorrent to notification area - i.e: The systray tray icon will still be visible when closing the main window. - 關閉qBittorrent到工作列通知區域 - - - - Tray icon style: - 圖示款式: - - - - Normal - 一般 - - - - Monochrome (Dark theme) - 單色(深色主題) - - - - Monochrome (Light theme) - 單色(淺色主題) - - - - File association - 檔案關聯 - - - - Use qBittorrent for .torrent files - Torrent檔使用qBittorrent - - - - Use qBittorrent for magnet links - 磁性連結使用qBittorrent - - - - Power Management - 電源管理 - - - - Save path: - 儲存路徑: - - - - Backup the log file after: - 備份日誌檔,每滿 - - - - Delete backup logs older than: - 只保存備份日誌: - - - - days - Delete backup logs older than 10 months - - - - - months - Delete backup logs older than 10 months - - - - - years - Delete backup logs older than 10 years - - - - - When adding a torrent - 加入Torrent時 - - - - Bring torrent dialog to the front - 保持Torrent話匣在畫面最上層 - - - + Do not start the download automatically The torrent will be added to download list in pause state 不要自動開始下載 - + Should the .torrent file be deleted after adding it 是否於加入Torrent檔後將其清除 - + + Delete .torrent files afterwards + 往後再清除Torrent檔 + + + Also delete .torrent files whose addition was cancelled 同時清除「附加」被取消的「.torrent」檔 - + Also when addition is cancelled 也當「附加」被取消時 - + Warning! Data loss possible! 警告!資料可能消失! - + Saving Management 存檔管理 - + Default Torrent Management Mode: 預設Torrent管理模式: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category 自動模式代表多個Torrent屬性(例如儲存路徑)將由相關分類決定 - + Manual 手動 - + Automatic 自動 - + When Torrent Category changed: Torrent的分類更改時: - + Relocate torrent 重置Torrent - + Switch torrent to Manual Mode 切換Torrent到手動模式 - + When Default Save Path changed: 預設儲存路徑更改時: - - + + Relocate affected torrents 重置受影響的Torrent - - + + Switch affected torrents to Manual Mode 切換受影響Torrent到手動模式 - + When Category changed: 分類更改時: - + Use Subcategories 使用子分類 - + Default Save Path: 預設儲存路徑: - + Keep incomplete torrents in: 未完成Torrent存放於: - + Copy .torrent files to: 複製「.torrent」檔到: - - Show &qBittorrent in notification area - - - - - &Log file - - - - - Display &torrent content and some options - - - - - Create subfolder for torrents with multiple files - - - - - De&lete .torrent files afterwards - - - - + Copy .torrent files for finished downloads to: 複製完成下載的「.torrent」檔到: - + Pre-allocate disk space for all files 預先分配檔案的磁碟空間 - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding - - - - + Append .!qB extension to incomplete files 未完成檔案加上.!qB副檔名 - - Enable recursive download dialog - - - - + Automatically add torrents from: 自動加入以下位置的Torrent: - + Add entry 加入項目 - + Remove entry 清除項目 - + + Email notification upon download completion + 下載完成時以電郵通知 + + + + Destination email: + 寄往電郵: + + + SMTP server: SMTP伺服器: - + This server requires a secure connection (SSL) 這個伺服器需要加密連接(SSL) - - + + + Authentication 驗證 - - - - + + + + Username: 用戶名: - - - - + + + + Password: 密碼: - - Enabled protocol: - - - - - TCP and μTP - + + Run external program on torrent completion + 完成Torrent時啟動外部程式 - + Listening Port 監聽埠 - + Port used for incoming connections: 連入埠: - + Random 隨機 - + Use UPnP / NAT-PMP port forwarding from my router 使用映射自路由器的UPnP╱NAT-PMP連接埠 - + Use different port on each startup 每次啟動時使用不同的埠 - + Connections Limits 連接限制 - + Maximum number of connections per torrent: 每個Torrent最大連接數量: - + Global maximum number of connections: 整體最大連接數量: - + Maximum number of upload slots per torrent: 每個Torrent上載最大連接數量: - + Global maximum number of upload slots: 整體上載最大連接數量: - + Proxy Server 代理伺服器 - + Type: 類型: - + (None) (無) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: 主機: - - + + Port: 埠: - + Otherwise, the proxy server is only used for tracker connections 否則,代理伺服器僅用於追蹤器連接 - + Use proxy for peer connections 使用代理伺服器來連接同路人 - + Disable connections not supported by proxies 停用不被代理伺服器支援的連接 - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection Torrent傳輸和相關動作以外的RSS feeds、搜尋引擎、軟件更新等均直接連接 - + Use proxy only for torrents 代理伺服器僅用於Torrent - - A&uthentication - - - - + Info: The password is saved unencrypted (注意:儲存的密碼不會加密) - + + IP Filtering + IP過濾 + + + Filter path (.dat, .p2p, .p2b): 過濾器(.dat、.p2p、.p2b) - + Reload the filter 重新載入過濾器 - - Manually banned IP addresses... - - - - + Apply to trackers 套用到追蹤器 - + Global Rate Limits 整體速度限制 - - - - - - - KiB/s - - - - - + + Upload: 上載: - - + + + + + KiB/s + KiB/s + + + + Download: 下載: - + Alternative Rate Limits 特別速度限制 - - + + Schedule the use of alternative rate limits + 設定使用特別速度限制的時間 + + + From: from (time1 to time2) 從: - - + To: time1 to time2 到: - + When: 日期: - + Every day 每日 - + Weekdays 工作日 - + Weekends 週末 - + Rate Limits Settings 設定速度限制 - + Apply rate limit to peers on LAN 將速度限制套用到區域網絡(LAN)的同路人 - + Apply rate limit to transport overhead 將速度限制套用到傳輸消耗 - - + + + Enable µTP protocol + 啟用µTP協定 + + + Apply rate limit to µTP protocol 將速度限制套用到µTP協定 - + Privacy 私隱 - + Enable DHT (decentralized network) to find more peers 啟用DHT分散式網絡來尋找更多同路人 - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) 與相容的Bittorrent用戶端(µTorrent等)交換同路人資訊 - + Enable Peer Exchange (PeX) to find more peers 啟用PeX同路人交換來尋找更多同路人 - + Look for peers on your local network 於本地網絡尋找同路人 - + Enable Local Peer Discovery to find more peers 啟用LPD本地同路人發現來尋找更多同路人 - + Encryption mode: 加密模式: - + Prefer encryption 傾向加密 - + Require encryption 要求加密 - + Disable encryption 停用加密 - + Enable when using a proxy or a VPN connection 使用代理伺服器或VPN連接時啟用 - + Enable anonymous mode 啟用匿名模式 - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">網上說明</a>) + + + + Torrent Queueing + Torrent排程 + + + Maximum active downloads: 最大活躍下載數量: - + Maximum active uploads: 最大活躍上載數量: - + Maximum active torrents: 最大活躍Torrent數量: - + Do not count slow torrents in these limits 這些限制不要計算慢速Torrent - - Upload rate threshold: - - - - - Download rate threshold: - - - - - sec - seconds - - - - - Torrent inactivity timer: - - - - + Share Ratio Limiting 最大分享率 - + Seed torrents until their ratio reaches Torrent做種,直至達到分享率 - + then 然後 - + Pause them 暫停它們 - + Remove them 清除它們 - - RSS Smart Episode Filters - + + Automatically add these trackers to new downloads: + 自動加入以下追蹤器到新下載: + + + + Enable Web User Interface (Remote control) + 啟用Web UI遠端控制 - + Use UPnP / NAT-PMP to forward the port from my router 使用UPnP╱NAT-PMP映射路由器連接埠 - + + Use HTTPS instead of HTTP + 使用HTTPS,而不是HTTP + + + Certificate: 憑證: - + Import SSL Certificate 匯入SSL憑證 - + Key: 密匙: - + Import SSL Key 匯入SSL密匙 - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>關於憑證</a> - - Use alternative Web UI - - - - - Files location: - - - - - Enable clickjacking protection - + + Bypass authentication for localhost + 略過本地主機驗證 - - Enable Cross-Site Request Forgery (CSRF) protection - + + Update my dynamic domain name + 更新動態域名 - + Service: 服務: - + Register 註冊 - + Domain name: 域名: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! 啟用這些選項,你的「.torrent 」檔或會<strong>無可挽回</strong>地離你而去! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well 啟用這些選項時,qBittorent會於嘗試加入Torrent到下載排程(首個選項「成功加入」,第二個選項「未成功加入」)後,將「.torrent」檔<strong>清除</strong>。這對透過「加入Torrent」選單和透過<strong>副檔名關聯</strong>開啟的檔案<strong>同樣</strong>有效。 - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog 啟用第二個選項(也當「附加」被取消),「.torrent」檔會被<strong>清除</strong>,不管有否按下「加入Torrent」話匣的「<strong>取消</strong>」按鈕。 - - Choose Alternative UI files location - - - - + Supported parameters (case sensitive): 支援的參數(大小楷視為不同): - + %N: Torrent name 【%N】Torrent名稱 - + %L: Category 【%L】分類 - - %G: Tags (seperated by comma) - - - - + %F: Content path (same as root path for multifile torrent) 【%F】已下載檔案的路徑(單一檔案Torrent) - + %R: Root path (first torrent subdirectory path) 【%R】已下載檔案的路徑(多檔案Torrent首個子資料夾) - + %D: Save path 【%D】儲存路徑 - + %C: Number of files 【%C】檔案數量 - + %Z: Torrent size (bytes) 【%Z】Torrent大小(位元組) - + %T: Current tracker 【%T】目前追蹤器 - + %I: Info hash 【%I】資訊驗證碼 - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") 提示:以引號包起參數可避免於空格被切斷(例如:"%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - - - - + Select folder to monitor 選取監視的資料夾 - + Folder is already being monitored: 正在監視的資料夾: - + Folder does not exist: 資料夾不存在: - + Folder is not readable: 資料夾無法讀取: - + Adding entry failed 加入項目失敗 - - - - + + Choose export directory 選取輸出路徑 - - - + + + + + + Choose a save directory 選取儲存路徑 - + Choose an IP filter file 選取一個IP過濾器檔 - + All supported filters 全部支援的過濾器 - + SSL Certificate SSL憑證 - + + SSL Key + SSL密匙 + + + Parsing error 解析錯誤 - + Failed to parse the provided IP filter 解析IP過濾器失敗 - + Successfully refreshed 成功更新 - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number 成功解析IP過濾器:已套用%1個規則。 - + Invalid key 無效密匙 - + This is not a valid SSL key. 無效的SSL密匙。 - + Invalid certificate 無效憑證 - - Preferences - - - - - Import SSL certificate - - - - + This is not a valid SSL certificate. 無效的SSL憑證。 - - Import SSL key - - - - - SSL key - - - - + Time Error 時間錯誤 - + The start time and the end time can't be the same. 開始時間與結尾時間不可相同。 - - + + Length Error 長度錯誤 - + The Web UI username must be at least 3 characters long. Web UI遠端控制的用戶名最少含3個字元。 - + The Web UI password must be at least 6 characters long. Web UI遠端控制的用戶名最少含6個字元。 @@ -5888,72 +5244,72 @@ PeerInfo - - Interested(local) and Choked(peer) - + + interested(local) and choked(peer) + 【己:想下載╱同:暫停上載】 - + interested(local) and unchoked(peer) 【己:想下載╱同:容許上載】 - + interested(peer) and choked(local) 【同:想下載╱己:暫停上載】 - + interested(peer) and unchoked(local) 【同:想下載╱己:容許上載】 - + optimistic unchoke 互惠者優先 - + peer snubbed 被同路人冷落 - + incoming connection 連入 - + not interested(local) and unchoked(peer) 【己:不想下載╱同:容許上載】 - + not interested(peer) and unchoked(local) 【同:不想下載╱己:容許上載】 - + peer from PEX 來自PeX同路人交換 - + peer from DHT 來自DHT分散式網絡 - + encrypted traffic 加密的流量 - + encrypted handshake 加密的溝通 - + peer from LSD 來自LPD本地同路人發現 @@ -5961,193 +5317,178 @@ PeerListWidget - + IP IP - + Port - + Flags 旗號 - + Connection 連接 - + Client i.e.: Client application 用戶端 - + Progress i.e: % downloaded 進度 - + Down Speed i.e: Download speed 下載速度 - + Up Speed i.e: Upload speed 上載速度 - + Downloaded i.e: total data downloaded 已下載 - + Uploaded i.e: total data uploaded 已上載 - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. 相關度 - + Files i.e. files that are being downloaded right now 檔案 - + Column visibility 欄位顯示 - + Add a new peer... 加入同路人… - - + + Ban peer permanently 永遠封鎖同路人 - + Manually adding peer '%1'... 手動加入同路人「%1」… - + The peer '%1' could not be added to this torrent. 無法加入同路人「%1」到這Torrent。 - + Manually banning peer '%1'... 手動封鎖同路人「%1」… - - + + Peer addition 加入同路人 - + Country 國家 - + Copy IP:port 複製「IP:埠」 - + Some peers could not be added. Check the Log for details. 無法加入部份同路人。詳情請看執行日誌。 - + The peers were added to this torrent. 已加入同路人到這Torrent。 - + Are you sure you want to ban permanently the selected peers? 永遠封鎖所選同路人,確定? - + &Yes 是(&Y) - + &No 否(&N) - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - + PeersAdditionDlg - + No peer entered - + 未輸入同路人 - + Please type at least one peer. - + 請輸入最少一個同路人。 - + Invalid peer - + 無效同路人 - + The peer '%1' is invalid. - + 同路人「%1」無效。 PieceAvailabilityBar - + White: Unavailable pieces 白:不可得 - + Blue: Available pieces 藍:可得 @@ -6155,336 +5496,292 @@ PiecesBar - + Files in this piece: 這片段包含: - + File in this piece 這片段包含的檔案 - + File in these pieces 這些片段包含的檔案 - - Wait until metadata become available to see detailed information - - - - + Hold Shift key for detailed information 按住「Shift」鍵以取得更多資訊 - PluginSelectDialog + PluginSelectDlg - + Search plugins - + 搜尋外掛 - + Installed search plugins: - + 已安裝的搜尋外掛: - + Name - 名稱 + 名稱 - + Version - + 版本 - + Url - + 網址 - - + + Enabled - - - - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - + 已啟用 - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + 需要新的搜尋引擎外掛,請到:<a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + 安裝新的 - + Check for updates - + 檢查更新 - + Close - + 關閉 - + Uninstall - + 解除安裝 - - - + + + Yes - + - - - - + + + + No - + - + Uninstall warning - + 解除安裝警告 - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + qBittorrent包含的外掛是無法解除安裝。僅自己加入的外掛可解除安裝。然而,這些外掛已被停用。 - + Uninstall success - + 成功解除安裝 - + All selected plugins were uninstalled successfully - - - - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - + 全部選取的外掛都已成功解除安裝 - - + + New search engine plugin URL - + 新搜尋引擎外掛網址 - - + + URL: - + 網址: - + Invalid link - + 無效連結 - + The link doesn't seem to point to a search engine plugin. - + 連結似乎沒有指向搜尋引擎外掛。 - + Select search plugins - + 選取搜尋外掛 - + qBittorrent search plugin - + qBittorrent搜尋外掛 + + + + + + Search plugin update + 更新搜尋外掛 - + All your plugins are already up to date. - + 全部外掛已是最新版本。 - + Sorry, couldn't check for plugin updates. %1 - + 抱歉,無法檢查外掛更新。%1 - + + + Search plugin install - + 安裝搜尋外掛 - + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + 成功安裝搜尋引擎外掛「%1」。 + + + Couldn't install "%1" search engine plugin. %2 - + 未能安裝搜尋引擎外掛「%1」。%2 + + + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + 成功更新搜尋引擎外掛「%1」。 - + Couldn't update "%1" search engine plugin. %2 - + 未能更新搜尋引擎外掛「%1」。%2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + 外掛來源 - + Search plugin source: - + 搜尋外掛來源: - + Local file - + 本地檔案 - + Web link - - - - - PowerManagement - - - qBittorrent is active - + 網絡連結 - PreviewSelectDialog - - - Preview - - + PreviewSelect - + Name - 名稱 + 名稱 - + Size - 大小 + 大小 - + Progress - 進度 + 進度 - - + + Preview impossible - + 無法預覽 - - + + Sorry, we can't preview this file - - - - - Private::FileLineEdit - - - '%1' does not exist - - - - - '%1' does not point to a directory - - - - - '%1' does not point to a file - - - - - Does not have read permission in '%1' - - - - - Does not have write permission in '%1' - + 抱歉,無法預覽這個檔案 PropListDelegate - + Not downloaded 沒有下載 - - + + Normal Normal (priority) 一般 - - N/A - (無) - - - + Do not download Do not download (priority) 不要下載 - - + + High High (priority) - + N/A + (無) + + + Mixed Mixed (priorities 混合 - - + + Maximum Maximum (priority) 最高 @@ -6493,32 +5790,32 @@ PropTabBar - + General 一般 - + Trackers 追蹤器 - + Peers 同路人 - + HTTP Sources HTTP來源 - + Content 內容 - + Speed 速度 @@ -6612,22 +5909,22 @@ 評註: - + Select All 選取全部 - + Select None 取消選取檔案 - + Normal 一般 - + High @@ -6687,165 +5984,165 @@ 儲存路徑: - + Maximum 最高 + - Do not download 不要下載 - + Never 從不 - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1×%2(完成%3) - - + + %1 (%2 this session) %1(本階段%2) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1(做種%2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1(最高%2) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1(總計%2) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1(平均%2) - + Open 開啟 - + Open Containing Folder 開啟存放位置 - + Rename... 重新命名… - + Priority 優先權 - + New Web seed 新Web種子 - + Remove Web seed 清除Web種子 - + Copy Web seed URL 複製Web種子網址 - + Edit Web seed URL 編輯Web種子網址 - + + Rename the file + 重新命名檔案 + + + New name: 新名稱: - - + + + The file could not be renamed + 檔案無法重新命名 + + + + This file name contains forbidden characters, please choose a different one. + 檔名包含不准使用的字元,請另選名稱。 + + + + This name is already in use in this folder. Please use a different name. 資料夾存在同名項目。請另選名稱。 - + The folder could not be renamed 這資料夾無法重新命名 - + qBittorrent qBittorrent - + Filter files... 過濾檔案… - - Renaming - - - - - - Rename error - - - - - The name is empty or contains forbidden characters, please choose a different one. - - - - + New URL seed New HTTP source 新URL種子 - + New URL seed: 新URL種子: - - + + This URL seed is already in the list. 這URL種子已於清單。 - + Web seed editing 編輯Web種子 - + Web seed URL: Web種子網址: @@ -6853,585 +6150,550 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + 你的IP位址因多次驗證失敗而被封鎖。 + + + + Error: '%1' is not a valid torrent file. + + 錯誤:「'%1」不是有效Torrent檔。 + + + + Error: Could not add torrent to session. + 錯誤:無法加入種子到工作階段。 + + + + I/O Error: Could not create temporary file. + 入出錯誤:無法建立暫存檔。 + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1是未知的指令行參數。 - - + + %1 must be the single command line parameter. %1必須是單一指令行參數。 - + + %1 must specify the correct port (1 to 65535). + %1須指向正確的埠(1到65535)。 + + + You cannot use %1: qBittorrent is already running for this user. 無法使用%1:qBittorrent正由這用戶執行。 - + Usage: 用量: - + Options: 選項: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - + + Displays program version + 顯示程式版本 - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - + + Displays this help message + 顯示說明訊息 - - Expected integer number in environment variable '%1', but got '%2' - + + Changes the Web UI port (current: %1) + 更改Web UI遠端控制埠(目前是:%1) - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - + + Disable splash screen + 不要顯示開始畫面 - - Expected %1 in environment variable '%2', but got '%3' - + + Run in daemon-mode (background) + 以守護模式啟動(背景執行) - - port - + + Downloads the torrents passed by the user + 下載用戶批准的Torrent - - %1 must specify a valid port (1 to 65535). - + + Help + 說明 - - Display program version and exit - + + Run application with -h option to read about command line parameters. + 以-h選項執行應用程式以閱讀關於指令行參數的資訊。 - - Display this help message and exit - + + Bad command line + 錯誤指令行 - - Change the Web UI port - + + Bad command line: + 錯誤指令行: - - Disable splash screen - 不要顯示開始畫面 + + Legal Notice + 法律聲明 - - Run in daemon-mode (background) - 以守護模式啟動(背景執行) + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + qBittorrent 是一個檔案分享程式。當你運行一個Torrent時,資料會上載予其他人,而你須獨自對分享的內容負責。 + +往後不會再有提醒。 - - dir - Use appropriate short form or abbreviation of "directory" - + + Press %1 key to accept and continue... + 按%1表示接受並繼續… - - Store configuration files in <dir> - + + Legal notice + 法律聲明 - - - name - + + Cancel + 取消 - - Store configuration files in directories qBittorrent_<name> - + + I Agree + 我同意 - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - + + Torrent name: %1 + Torrent名:%1 - - files or URLs - + + Torrent size: %1 + Torrent大小:%1 - - Download the torrents passed by the user - + + Save path: %1 + 儲存路徑:%1 - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Torrent用%1完成下載。 - - Options when adding new torrents: - + + Thank you for using qBittorrent. + 多謝使用qBittorrent。 - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - + + [qBittorrent] '%1' has finished downloading + [qBittorrent]「%1」已完成下載 - - path - + + The remote host name was not found (invalid hostname) + 未找到遠端主機名(無效主機名) - - Torrent save path - + + The operation was canceled + 操作已取消 - - Add torrents as started or paused - + + The remote server closed the connection prematurely, before the entire reply was received and processed + 在回應被接收和處理前,遠端伺服器已關閉連接 - - Skip hash check - 略過驗證碼檢查 + + The connection to the remote server timed out + 連接到遠端伺服器逾時 - - Assign torrents to category. If the category doesn't exist, it will be created. - + + SSL/TLS handshake failed + SSL╱TLS溝通失敗 - - Download files in sequential order - + + The remote server refused the connection + 遠端伺服器拒絕連接 - - Download first and last pieces first - 先下載首片段和最後片段 + + The connection to the proxy server was refused + 連接代理伺服器被拒 - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - + + The proxy server closed the connection prematurely + 代理伺服器過早關閉連接 - - Command line parameters take precedence over environment variables - + + The proxy host name was not found + 代理伺服器主機名不存在 - - Help - 說明 + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + 連接到代理伺服器逾時或代理伺服器未能及時回應 - - Run application with -h option to read about command line parameters. - 以-h選項執行應用程式以閱讀關於指令行參數的資訊。 + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + 代理不接受已提供的憑證,須重新驗證換取代理兌現要求 - - Bad command line - 錯誤指令行 + + The access to the remote content was denied (401) + 存取遠端內容被拒絕(401) - - Bad command line: - 錯誤指令行: + + The operation requested on the remote content is not permitted + 不容許要求遠端內容的操作 - - Legal Notice - 法律聲明 + + The remote content was not found at the server (404) + 伺服器上未找到遠端內容(404) - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - + + The remote server requires authentication to serve the content but the credentials provided were not accepted + 遠端伺服器不接受已提供的憑證,須重新驗證後才可提供內容 - - No further notices will be issued. - + + The Network Access API cannot honor the request because the protocol is not known + 因為未知的協定,網絡存取API無法兌現要求 - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - qBittorrent 是一個檔案分享程式。當你運行一個Torrent時,資料會上載予其他人,而你須獨自對分享的內容負責。 - -往後不會再有提醒。 + + The requested operation is invalid for this protocol + 要求的操作對於這協定是無效 - - Press %1 key to accept and continue... - 按%1表示接受並繼續… + + An unknown network-related error was detected + 偵測到一個未知的網絡相關錯誤 - - Legal notice - 法律聲明 + + An unknown proxy-related error was detected + 偵測到一個未知的代理伺服器相關錯誤 - - Cancel - 取消 + + An unknown error related to the remote content was detected + 偵測到一個未知的遠端內容相關錯誤 - - I Agree - 我同意 + + A breakdown in protocol was detected + 偵測到一個協定錯誤 - - + + Unknown error + 未知的錯誤 + + + + Upgrade 升級 - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] 你升級自一個以其他方式儲存的版本。你必須遷移到新的儲存系統。這樣,你將無法再使用早於v3.3.0的版本。繼續嗎?[y╱n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. 你升級自一個以其他方式儲存的版本。你必須遷移到新的儲存系統。選擇繼續,你將無法再使用早於v3.3.0的版本。 - + Couldn't migrate torrent with hash: %1 無法遷移驗證碼是%1的Torrent - + Couldn't migrate torrent. Invalid fastresume file name: %1 無法遷移Torrent。無效的快速復原檔名稱:%1 - - Detected unclean program exit. Using fallback file to restore settings: %1 - + + Detected unclean program exit. Using fallback file to restore settings. + 偵測到有瑕疵的程式退出。正在使用備份檔案來復原設定。 - + An access error occurred while trying to write the configuration file. 嘗試寫入設定檔時發生存取錯誤。 - + A format error occurred while trying to write the configuration file. 嘗試寫入設定檔時發生格式錯誤。 - - - An unknown error occurred while trying to write the configuration file. - - - RSS::AutoDownloader + RSS - - - Invalid data format. - - - - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - - - - - Invalid data format - - - - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - + + Search + 搜尋 - - Couldn't load RSS AutoDownloader rules. Reason: %1 - + + New subscription + 新訂閱 - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - + + + + Mark items read + 標示項目為已讀 - - RSS feed at '%1' updated. Added %2 new articles. - + + Update all + 全部更新 - - Failed to parse RSS feed at '%1'. Reason: %2 - + + RSS Downloader... + RSS下載器… - - Couldn't read RSS Session data from %1. Error: %2 - + + Settings... + 設定… - - Couldn't parse RSS Session data. Error: %1 - + + Torrents: (double-click to download) + Torrent:(按兩下下載) - - Couldn't load RSS Session data. Invalid data format. - + + + Delete + 刪除 - - Couldn't load RSS article '%1#%2'. Invalid data format. - + + Rename... + 重新命名… - - - RSS::Private::Parser - - Invalid RSS feed. - + + Rename + 重新命名 - - %1 (line: %2, column: %3, offset: %4). - + + + Update + 更新 - - - RSS::Session - - RSS feed with given URL already exists: %1. - + + New subscription... + 新訂閱… - - Cannot move root folder. - + + + Update all feeds + 更新全部Feed - - - Item doesn't exist: %1. - + + Download torrent + 下載Torrent - - Cannot delete root folder. - + + Open news URL + 開啟消息網址 - - Incorrect RSS Item path: %1. - + + Copy feed URL + 複製Feed網址 - - RSS item with given path already exists: %1. - + + New folder... + 新資料夾… - - Parent folder doesn't exist: %1. - + + Refresh RSS streams + 更新RSS資源 - RSSWidget - - - Search - 搜尋 - - - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - - - - - New subscription - - - - - - - Mark items read - - - - - Refresh RSS streams - - - - - Update all - - - - - RSS Downloader... - - - - - Torrents: (double-click to download) - - + RSSImp - - - Delete - 刪除 + + Stream URL: + 資源網址: - - Rename... - 重新命名… + + Please type a RSS stream URL + 請輸入一個RSS資源網址 - - Rename - 重新命名 + + This RSS feed is already in the list. + 這RSS feed已於清單。 - - - Update - + + Please choose a folder name + 請選取資料夾名稱 - - New subscription... - + + Folder name: + 資料夾名稱: - - - Update all feeds - + + New folder + 新資料夾 - - Download torrent - + + Deletion confirmation + 確認刪除 - - Open news URL - + + Are you sure you want to delete the selected RSS feeds? + 刪除所選RSS feed,確定? - - Copy feed URL - + + Please choose a new name for this RSS feed + 請為這RSS feed選取新名稱 - - New folder... - + + New feed name: + 新Feed名稱: - - Please choose a folder name - + + Name already in use + 這名稱已使用 - - Folder name: - + + This name is already used by another item, please choose another one. + 存在同名項目,請另選名稱。 - - New folder - + + Date: + 日期: - - Please type a RSS feed URL - + + Author: + 作者: - - Feed URL: - + + Unread + 未讀 + + + Rss::Feed - - Deletion confirmation - + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + 無法從RSS feed「%2」自動下載「%1」,因它沒有Torrent或磁性連結… - - Are you sure you want to delete the selected RSS feeds? - + + Automatically downloading '%1' torrent from '%2' RSS feed... + 從RSS feed「%2」自動下載「%1」Torrent… + + + Rss::Private::Parser - - Please choose a new name for this RSS feed - + + Invalid RSS feed. + 無效的RSS feed。 + + + RssSettingsDlg - - New feed name: - + + RSS Reader Settings + RSS閱讀器設定 - - Rename failed - + + RSS feeds refresh interval: + RSS feed更新間距: - - Date: - + + min + 分鐘 - - Author: - + + Maximum number of articles per feed: + 每個Feed的最大文章數: ScanFoldersDelegate - + Select save location 選取儲存位置 @@ -7439,274 +6701,268 @@ ScanFoldersModel - + Monitored Folder 監視的資料夾 - + Override Save Location 覆寫儲存位置 - + Monitored folder 監視的資料夾 - + Default save location 預設儲存位置 - + Browse... 瀏覽… - SearchJobWidget + SearchEngine - - Form - + + Unknown search engine plugin file format. + 未知的搜尋引擎外掛檔案格式。 - - Results(xxx) - + + A more recent version of this plugin is already installed. + 已安裝此搜尋引擎外掛的較新版本。 - - Search in: - + + + Plugin is not supported. + 不支援的外掛。 - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - + + Update server is temporarily unavailable. %1 + 更新伺服器暫時不可用。%1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - + + + Failed to download the plugin file. %1 + 下載外掛檔案失敗。%1 - - Seeds: - 種子: + + An incorrect update info received. + 收到不正確的更新資訊。 - - <html><head/><body><p>Minimal number of seeds</p></body></html> - + + All categories + 全部類別 - - - to - + + Movies + 電影 - - <html><head/><body><p>Maximal number of seeds</p></body></html> - + + TV shows + 電視節目 - - - - + + Music + 音樂 - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + + Games + 遊戲 - - Size: - 大小: + + Anime + 動畫 - - <html><head/><body><p>Minimal torrent size</p></body></html> - + + Software + 軟件 - - <html><head/><body><p>Maximal torrent size</p></body></html> - + + Pictures + 圖片 + + + + Books + + + + + SearchListDelegate + + + + Unknown + 未知 + + + SearchTab - + Name i.e: file name - 名稱 + 名稱 - + Size i.e: file size - 大小 + 大小 - + Seeders i.e: Number of full sources - + 完整種子 - + Leechers i.e: Number of partial sources - + 不完整種子 - + Search engine - - - - - Filter search results... - + 搜尋引擎 - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + 搜尋結果(顯示<i>%2</i>中的<i>%1</i>個): - + Torrent names only - + 僅Torrent名 - + Everywhere - + 全部 - - Use regular expressions - - - - + Searching... - + 搜尋中… - + Search has finished - 搜尋完成 + 搜尋完成 - + Search aborted - + 搜尋中止 - + An error occurred during search... - + 搜尋時發生錯誤… - + Search returned no results - + 沒有搜尋結果 - + Column visibility 欄位顯示 - - - SearchPluginManager - - Unknown search engine plugin file format. - + + Form + - - A more recent version of this plugin is already installed. - + + Results(xxx) + 結果(×××) - - - Plugin is not supported. - + + Search in: + 搜尋: - - All categories - + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>部份搜尋引擎同時掃瞄Torrent檔名和Torrent描述。請選擇是否於下方清單中顯示相關結果。</p><p><span style=" font-weight:600;">全部</span>:不作過濾,顯示全部搜尋結果。</p><p><span style=" font-weight:600;">僅Torrent名:僅顯示與Torrent名相符的項目。</p></body></html> - - Movies - + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>設定完整種子數量的上下限</p></body></html> - - TV shows - + + Seeds: + 種子: - - Music - + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>種子數量下限</p></body></html> - - Games - + + + to + - - Anime - + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>種子數量上限</p></body></html> - - - Software - + + + + + 無限 - - Pictures - + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>設定Torrent大小的上下限</p></body></html> - - Books - + + Size: + 大小: - - Update server is temporarily unavailable. %1 - - - - - - Failed to download the plugin file. %1 - - - - - An incorrect update info received. - + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Torrent大小下限</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Torrent大小上限</p></body></html> @@ -7714,197 +6970,185 @@ - - - - + + + Search 搜尋 - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - - - - + Download 下載 - + Go to description page 前往描述頁 - + Copy description page URL 複製描述頁網址 - + Search plugins... 搜尋外掛… - + A phrase to search for. 搜尋的句語: - + Spaces in a search term may be protected by double quotes. 保護搜尋句語的完整,請使用英語雙引號。 - + Example: Search phrase example 例子: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>會搜尋<b>foo</b>和<b>bar</b>兩個單字 - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>會搜尋句語<b>foo bar</b> - + All plugins 全部外掛 - + Only enabled 僅已啟用 - + Select... 選取… - - - + + + Search Engine 搜尋引擎 - + Please install Python to use the Search Engine. 請安裝搜尋引擎需要的Pyrhon。 - + Empty search pattern 空白搜尋模式 - + Please type a search pattern first 請先輸入一個搜尋模式 - + Stop 停止 - + Search has finished 搜尋完成 - + Search has failed 搜尋失敗 - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + qBittorrent將自行關閉。 - + E&xit Now - + 立即離開 - + Exit confirmation - + 確認離開 - + The computer is going to shutdown. - + 電腦將關機。 - + &Shutdown Now - - - - - Shutdown confirmation - + 立即關機 - + The computer is going to enter suspend mode. - + 電腦將睡眠。 - + &Suspend Now - + 立即睡眠 - + Suspend confirmation - + 確認睡眠 - + The computer is going to enter hibernation mode. - + 電腦將休眠。 - + &Hibernate Now - + 立即休眠 - + Hibernate confirmation - + 確認休眠 - + You can cancel the action within %1 seconds. - + 行動可於%1秒內取消。 + + + + Shutdown confirmation + 確認關機 SpeedLimitDialog - + KiB/s KiB/s @@ -7912,52 +7156,52 @@ SpeedPlotView - + Total Upload 總上載 - + Total Download 總下載 - + Payload Upload 有效上載 - + Payload Download 有效下載 - + Overhead Upload 上載消耗 - + Overhead Download 下載消耗 - + DHT Upload DHT分散式網絡上載 - + DHT Download DHT分散式網絡下載 - + Tracker Upload 追蹤器上載 - + Tracker Download 追蹤器下載 @@ -7965,95 +7209,87 @@ SpeedWidget - + Period: 期間: - + 1 Minute 1分鐘 - + 5 Minutes 5分鐘 - + 30 Minutes 30分鐘 - + 6 Hours 6小時 - + Select Graphs 選擇圖表 - + Total Upload 總上載 - + Total Download 總下載 - + Payload Upload 有效上載 - + Payload Download 有效下載 - + Overhead Upload 上載消耗 - + Overhead Download 下載消耗 - + DHT Upload DHT分散式網絡上載 - + DHT Download DHT分散式網絡下載 - + Tracker Upload 追蹤器上載 - + Tracker Download 追蹤器下載 - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8066,49 +7302,49 @@ 用戶統計 - - Cache statistics - 快存統計 + + Total peer connections: + 總同路人連接: - - Read cache hits: - 讀取快存次數: + + Global ratio: + 整體比率: - - Average time in queue: - 佇列平均時間: + + Alltime download: + 歷年下載: - - Connected peers: - + + Alltime upload: + 歷年上載: - - All-time share ratio: - + + Total waste (this session): + 總丟棄(本階段): - - All-time download: - + + Cache statistics + 快存統計 - - Session waste: - + + Read cache hits: + 讀取快存次數: - - All-time upload: - + + Average time in queue: + 佇列平均時間: - Total buffer size: - + Total buffers size: + 總緩衝大小: @@ -8136,7 +7372,12 @@ 總佇列大小: - + + OK + 確定 + + + %1 ms 18 milliseconds %1毫秒 @@ -8145,27 +7386,32 @@ StatusBar - + Connection status: 連接狀態: - + No direct connections. This may indicate network configuration problems. 沒有直接連接。這表示你的網絡設定可能有問題。 - + DHT: %1 nodes DHT分散式網絡:%1個節點 - - qBittorrent needs to be restarted! - + + qBittorrent needs to be restarted + qBittorrent須重新啟動 + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent更新後須重新啟動。 @@ -8184,1563 +7430,1311 @@ 在線 - + Click to switch to alternative speed limits 按下切換到特別速度限制 - + Click to switch to regular speed limits 按下切換到正常速度限制 - + + Manual change of rate limits mode. The scheduler is disabled. + 手動變更限速模式。排程器已停用。 + + + Global Download Speed Limit 整體下載速度限制 - + Global Upload Speed Limit 整體上載速度限制 - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - 全部(0) + 全部(0) - + Downloading (0) - + 下載中(0) - + Seeding (0) - + 做種(0) - + Completed (0) - + 完成(0) - + Resumed (0) - + 回復下載(0) - + Paused (0) - + 暫停(0) - + Active (0) - + 活躍(0) - + Inactive (0) - + 不活躍(0) - + Errored (0) - + 出錯(0) - + All (%1) - 全部(%1) + 全部(%1) - + Downloading (%1) - + 下載中(%1) - + Seeding (%1) - + 做種(%1) - + Completed (%1) - + 完成(%1) - + Paused (%1) - + 暫停(%1) - + Resumed (%1) - + 回復下載(%1) - + Active (%1) - + 活躍(%1) - + Inactive (%1) - + 不活躍(%1) - + Errored (%1) - + 出錯(%1) - TagFilterModel + TorrentContentModel - - Tags - + + Name + 名稱 - - All - + + Size + 大小 - - Untagged - + + Progress + 進度 - - - TagFilterWidget - - Add tag... - + + Download Priority + 下載優先權 - - Remove tag - + + Remaining + 剩餘 + + + TorrentCreatorDlg - - Remove unused tags - + + Select a folder to add to the torrent + 選取加入到Torrent的資料夾 - - Resume torrents - 回復Torrent + + Select a file to add to the torrent + 選取加入到Torrent的檔案 - - Pause torrents - 暫停Torrent + + No input path set + 沒有設定輸入路徑 - - Delete torrents - 刪除Torrent + + Please type an input path first + 請填寫輸入路徑 - - New Tag - + + Select destination torrent file + 選取目標Torrent檔 - - Tag: - + + Torrent Files (*.torrent) + Torrent檔(*.torrent) - - Invalid tag name - + + Torrent was created successfully: %1 + %1 is the path of the torrent + 成功建立Torrent:%1 - - Tag name '%1' is invalid - + + + + Torrent creation + 建立Torrent - - Tag exists - + + Torrent creation was unsuccessful, reason: %1 + 未能建立Torrent,理由:%1 - - Tag name already exists. - + + Created torrent file is invalid. It won't be added to download list. + 建立的Torrent檔無效,不會被加入到下載清單。 - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - + + Name + i.e: torrent name + 名稱 - - Name: - + + Size + i.e: torrent size + 大小 - - Save path: - 儲存路徑: + + Done + % Done + 完成 - - Choose save path - 選取儲存路徑 + + Status + Torrent status (e.g. downloading, seeding, paused) + 狀態 - - New Category - + + Seeds + i.e. full sources (often untranslated) + 完整種子 - - Invalid category name - + + Peers + i.e. partial sources (often untranslated) + 同路人 - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - + + Down Speed + i.e: Download speed + 下載速度 - - Category creation error - + + Up Speed + i.e: Upload speed + 上載速度 - - Category with the given name already exists. -Please choose a different name and try again. - + + Ratio + Share ratio + 分享率 - - - TorrentContentModel - - Name - 名稱 + + ETA + i.e: Estimated Time of Arrival / Time left + 預計剩餘時間 - - Size - 大小 + + Category + 分類 - - Progress - 進度 + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + 加入於 - - Download Priority - 下載優先權 + + Completed On + Torrent was completed on 01/01/2010 08:00 + 完成於 - - Remaining - 剩餘 + + Tracker + 追蹤器 - - Availability - + + Down Limit + i.e: Download limit + 下載速度限制 - - - TorrentCreatorDialog - - Torrent Creator - + + Up Limit + i.e: Upload limit + 上載速度限制 - - Select file/folder to share - + + Downloaded + Amount of data downloaded (e.g. in MB) + 已下載 - - Path: - + + Uploaded + Amount of data uploaded (e.g. in MB) + 已上載 - - [Drag and drop area] - + + Session Download + Amount of data downloaded since program open (e.g. in MB) + 本階段下載 - - - Select file - + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + 本階段上載 - - - Select folder - + + Remaining + Amount of data left to download (e.g. in MB) + 剩餘 - - Settings - + + Time Active + Time (duration) the torrent is active (not paused) + 已用時間 - - Piece size: - - - - - Auto - - - - - 16 KiB - - - - - 32 KiB - - - - - 64 KiB - - - - - 128 KiB - - - - - 256 KiB - - - - - 512 KiB - - - - - 1 MiB - - - - - 2 MiB - - - - - 4 MiB - - - - - 8 MiB - - - - - 16 MiB - - - - - 32 MiB - - - - - Calculate number of pieces: - - - - - Private torrent (Won't distribute on DHT network) - - - - - Start seeding immediately - - - - - Ignore share ratio limits for this torrent - - - - - Optimize alignment - - - - - Fields - - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - - - - Web seed URLs: - - - - - Tracker URLs: - - - - - Comments: - - - - - Source: - - - - - Progress: - 進度: - - - - Create Torrent - - - - - - - Torrent creation failed - - - - - Reason: Path to file/folder is not readable. - - - - - Select where to save the new torrent - - - - - Torrent Files (*.torrent) - - - - - Reason: %1 - - - - - Reason: Created torrent is invalid. It won't be added to download list. - - - - - Torrent creator - - - - - Torrent created: - - - - - TorrentInfo - - - File size exceeds max limit %1 - - - - - Torrent file read error: %1 - - - - - Torrent file read error: size mismatch - - - - - TorrentsController - - - Not contacted yet - - - - - Updating... - - - - - Working - - - - - Not working - - - - - Error: '%1' is not a valid torrent file. - - - - - - - - Torrent queueing must be enabled - - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - + + Save path + Torrent save path + 儲存路徑 - - Cannot make save path - + + Completed + Amount of data completed (e.g. in MB) + 已完成 - - Cannot write to directory - + + Ratio Limit + Upload share ratio limit + 最大分享率 - - WebUI Set location: moving "%1", from "%2" to "%3" - + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + 最後完整可見 - - Incorrect torrent name - + + Last Activity + Time passed since a chunk was downloaded/uploaded + 最後活動 - - - Incorrect category name - + + Total Size + i.e. Size including unwanted data + 總大小 TrackerFiltersList - + All (0) this is for the tracker filter 全部(0) - + Trackerless (0) 缺少追蹤器(0) - + Error (0) 錯誤(0) - + Warning (0) 警告(0) - - + + Trackerless (%1) 缺少追蹤器(%1) - - + %1 (%2) + openbittorrent.com (10) + %1(%2) + + + + Error (%1) 錯誤(%1) - - + + Warning (%1) 警告(%1) - + Resume torrents 回復Torrent - + Pause torrents 暫停Torrent - + Delete torrents 刪除Torrent - - + + All (%1) this is for the tracker filter 全部(%1) - TrackerListWidget - - - - Working - - - - - Disabled - - + TrackerList - - This torrent is private - + + URL + 網址 - - Updating... - + + Status + 狀態 - - Not working + + Received - - Not contacted yet - + + Seeds + 完整種子 - - - - - - - N/A - (無) + + Peers + 同路人 - - Tracker editing - + + Downloaded + 已下載 - - Tracker URL: - + + Message + 訊息 - - - Tracker editing failed - + + + Working + 有效 - - The tracker URL entered is invalid. - + + Disabled + 已停用 - - The tracker URL already exists. - + + This torrent is private + 這是私人Torrent - - Add a new tracker... - + + Updating... + 更新中… - - Remove tracker - + + Not working + 無效 - - Copy tracker URL - + + Not contacted yet + 未嘗連接 - - Edit selected tracker URL - + + Tracker URL: + 追蹤器網址: - - Force reannounce to selected trackers - + + Tracker editing + 編輯追蹤器 - - Force reannounce to all trackers - + + + Tracker editing failed + 編輯追蹤器失敗 - - URL - + + The tracker URL entered is invalid. + 無效追蹤器網址 - - Status - 狀態 + + The tracker URL already exists. + 追蹤器網址已存在 - - Received - + + Add a new tracker... + 加入新追蹤器… - - Seeds - + + Copy tracker URL + 複製追蹤器網址 - - Peers - 同路人 + + Edit selected tracker URL + 編輯所選追蹤器網址 - - Downloaded - 已下載 + + Force reannounce to selected trackers + 強制重新公告到所選追蹤器 - - Message - + + Force reannounce to all trackers + 強制重新公告到全部追蹤器 - - Column visibility - 欄位顯示 + + Remove tracker + 清除追蹤器 - TrackerLoginDialog - - - - Tracker authentication - - - - - Tracker: - - + TrackersAdditionDlg - - Login - 登入 - - - - Username: - 用戶名: - - - - Password: - 密碼: + + Trackers addition dialog + 加入追蹤器話匣 - - Log in - + + List of trackers to add (one per line): + 加入的追蹤器清單(一行一個): - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + µTorrent相容清單網址: - - List of trackers to add (one per line): - + + I/O Error + 入出錯誤 - - µTorrent compatible list URL: - + + Error while trying to open the downloaded file. + 嘗試開啟已下載檔案時發生錯誤。 - + No change - + 沒有更改 - + No additional trackers were found. - + 未找到更多追蹤器。 - + Download error - 下載錯誤 + 下載錯誤 - + The trackers list could not be downloaded, reason: %1 - + 無法下載追蹤器清單,理由:%1 TransferListDelegate - + Downloading 下載中 - + Downloading metadata used when loading a magnet link 正在下載元資料 - + Allocating qBittorrent is allocating the files on disk 分配中 - + Paused 暫停 - + Queued i.e. torrent is queued 佇列 - + Seeding Torrent is complete and in upload-only mode 做種中 - + Stalled Torrent is waiting for download to begin 等待開始 - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. 強制下載 - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. 強制做種 - + Checking Torrent local data is being checked 檢查中 - + Queued for checking i.e. torrent is queued for hash checking 等待檢查驗證碼 - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. 檢查項目進度 - + Completed 已完成 - - Moving - Torrent local data are being moved/relocated - - - - + Missing Files 消失的檔案 - + Errored torrent status, the torrent has an error 出錯 - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1(做種%2) - + %1 ago e.g.: 1h 20m ago %1前 - - TransferListFiltersWidget - - - Status - 狀態 - - - - Categories - 分類 - - - - Tags - - - - - Trackers - 追蹤器 - - - - TransferListModel - - - Name - i.e: torrent name - 名稱 - - - - Size - i.e: torrent size - 大小 - - - - Done - % Done - - - - - Status - Torrent status (e.g. downloading, seeding, paused) - 狀態 - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - 同路人 - - - - Down Speed - i.e: Download speed - 下載速度 - - - - Up Speed - i.e: Upload speed - 上載速度 - - - - Ratio - Share ratio - - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - 分類 - - - - Tags - - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - 已下載 - - - - Uploaded - Amount of data uploaded (e.g. in MB) - 已上載 - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - 剩餘 - - - - Time Active - Time (duration) the torrent is active (not paused) - - - - - Save path - Torrent save path - - - - - Completed - Amount of data completed (e.g. in MB) - 已完成 - - - - Ratio Limit - Upload share ratio limit - - + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + 狀態 - - Last Activity - Time passed since a chunk was downloaded/uploaded - + + Categories + 分類 - - Total Size - i.e. Size including unwanted data - + + Trackers + 追蹤器 TransferListWidget - + Column visibility 欄位顯示 - + Choose save path 選取儲存路徑 - + Torrent Download Speed Limiting Torrent下載速度限制 - + Torrent Upload Speed Limiting Torrent上載速度限制 - + Recheck confirmation 確認重新檢查 - + Are you sure you want to recheck the selected torrent(s)? 重新檢查所選Torrent,確定? - + Rename 重新命名 - + New name: 新名稱: - + Resume Resume/start the torrent 取消暫停 - + Force Resume Force Resume/start the torrent 強制取消暫停 - + Pause Pause the torrent 暫停 - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - - - - - Add Tags - - - - - Remove All Tags - - - - - Remove all tags from selected torrents? - + + New Category + 新分類 - - Comma-separated tags: - + + Category: + 分類: - - Invalid tag - + + Invalid category name + 無效分類名 - - Tag name: '%1' is invalid - + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + 分類名不可包含「\」。 +分類名不可使用「/」作開頭或結尾。 +分類名不可包含「//」。 - + Delete Delete the torrent 刪除 - + Preview file... 預覽檔案… - + Limit share ratio... 設定最大分享率… - + Limit upload rate... 限制上載速度… - + Limit download rate... 限制下載速度… - + Open destination folder 開啟存放位置 - + Move up i.e. move up in the queue 上移 - + Move down i.e. Move down in the queue 下移 - + Move to top i.e. Move to top of the queue 移到最上 - + Move to bottom i.e. Move to bottom of the queue 移到最下 - + Set location... 設定存放位置… - - Force reannounce - - - - + Copy name 複製名稱 - - Copy hash - - - - + Download first and last pieces first 先下載首片段和最後片段 - + Automatic Torrent Management 自動Torrent管理 - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category 自動模式代表多個Torrent屬性(例如儲存路徑)將由相關分類決定 - + Category 分類 - + New... New category... 新… - + Reset Reset category 重設 - - Tags - - - - - Add... - Add / assign multiple tags... - - - - - Remove All - Remove all tags - - - - + Priority 優先權 - + Force recheck 強制重新檢查 - + Copy magnet link 複製磁性連結 - + Super seeding mode 超級種子模式 - + Rename... 重新命名… - + Download in sequential order 依順序下載 - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + Torrent上╱下載比率限制 - - Use global share limit - + + Use global ratio limit + 使用整體比率限制 - - - + + + buttonGroup - + 按鈕群組 - - Set no share limit - + + Set no ratio limit + 不設比率限制 - - Set share limit to - + + Set ratio limit to + 設定比率限制到 + + + WebApplication - - ratio - + + Incorrect category name + 錯誤分類名稱 + + + + WebUI + + + The Web UI is listening on port %1 + Web UI遠端控制正在監聽埠%1 - - minutes - + + Web UI Error - Unable to bind Web UI to port %1 + Web UI遠端控制錯誤:無法捆綁Web UI遠端控制到埠%1 + + + about - - No share limit method selected - + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + 一個以C++撰寫,基於Qt工具箱和libtorrent-rasterbar的進階BitTorrent用戶端。 - - Please select a limit method first - + + Copyright %1 2006-2016 The qBittorrent project + 版權%1 2006-2016 The qBittorrent project + + + + Home Page: + 網站: + + + + Forum: + 論壇: + + + + Bug Tracker: + 通報軟件問題: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - + + Add Peers + 加入同路人 - - Python not detected - + + List of peers to add (one per line): + 加入的同路人清單(一行一個): + + + + Format: IPv4:port / [IPv6]:port + 格式:IPv4:埠╱[IPv6]:埠 - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - + + + Tracker authentication + 追蹤器驗證 - - Symlinks inside alternative UI folder are forbidden. - + + Tracker: + 追蹤器: - - Exceeded the maximum allowed file size (%1)! - + + Login + 登入 - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - + + Username: + 用戶名: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - + + Password: + 密碼: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - + + Log in + 登入 - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - + + Cancel + 取消 - WebUI + confirmDeletionDlg - - Web UI: HTTPS setup successful - + + Deletion confirmation - qBittorrent + 確認刪除 - qBittorrent - - Web UI: HTTPS setup failed, fallback to HTTP - + + Remember choice + 記住選擇 - - Web UI: Now listening on IP: %1, port: %2 - + + Also delete the files on the hard disk + 同時從磁碟刪除檔案 + + + confirmShutdownDlg - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - + + Don't show again + 不要再顯示 + + + + createTorrentDialog + + + Cancel + 取消 + + + + Torrent Creation Tool + Torrent建立工具 + + + + Torrent file creation + 建立Torrent檔 + + + + Add file + 加入檔案 + + + + Add folder + 加入資料夾 + + + + File or folder to add to the torrent: + 加入到Torrent的檔案或資料夾: + + + + Tracker URLs: + 追蹤器網址: + + + + Web seeds urls: + Web種子網址: + + + + Comment: + 評註: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + 你可以用空白行分開線程╱群組。 + + + + Piece size: + 片段大小: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + 自動 + + + + Private (won't be distributed on DHT network if enabled) + 私人(如果啟用,不會發佈到DHT分散式網絡) + + + + Start seeding after creation + 建立後開始做種 + + + + Ignore share ratio limits for this torrent + 忽略這Torrent的分享比率限制 + + + + Create and save... + 建立並儲存… + + + + Progress: + 進度: + + + + downloadFromURL + + + Add torrent links + 加入Torrent連結 + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + 一行一連結(支援HTTP連結、磁性連結和資料驗證碼) + + + + Download + 下載 + + + + Cancel + 取消 + + + + Download from urls + 從網址下載 + + + + No URL entered + 未輸入網址 + + + + Please type at least one URL. + 請輸入最少一個網址。 + + + + errorDialog + + + Crash info + 程式崩塌資訊 fsutils - + + + + + Downloads 下載 @@ -9748,100 +8742,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + 未找到Python + + + + Python version: %1 + Python版本:%1 + + + /s per second 每秒 - + %1h %2m e.g: 3hours 5minutes %1小時%2分鐘 - + %1d %2h e.g: 2days 10hours %1日%2小時 - + Unknown Unknown (size) 未知 - + qBittorrent will shutdown the computer now because all downloads are complete. qBittorrent完成全部下載,即將關機。 - + < 1m < 1 minute 少於1分鐘 - + %1m e.g: 10minutes %1分鐘 + + + Working + 有效 + + + + Updating... + 更新中… + + + + Not working + 無效 + + + + Not contacted yet + 未嘗連接 + preview - + Preview selection 選取預覽 - + The following files support previewing, please select one of them: 以下檔案支援預覽,請從中選取: + + + Preview + 預覽 + + + + Cancel + 取消 + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_zh.ts qbittorrent-3.3.15/src/lang/qbittorrent_zh.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_zh.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_zh.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent - 关于qBittorrent + 关于 qBittorrent - + About 关于 - + Author 作者 - - Current maintainer - 当前维持者 - - - - Greece - 希腊 - - - - + + Nationality: 国籍: - - + + + Name: + 姓名: + + + + E-mail: - E-mail: + 电子邮件: - - - Name: - 姓名: + + Greece + 希腊 - - Original author - 原始作者 + + Current maintainer + 目前的维护者 - - France - 法国 + + Original author + 原作者 - + Special Thanks - 鸣谢 + 特别感谢 - + Translators - 译者 - - - - License - 许可 + 翻译者 - + Libraries - + qBittorrent was built with the following libraries: - qBittorrent使用以下库构建: - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - 一个高级BT下载客户端,由C++编写,基于Qt工具集和libtorrent-rasterbar - - - - Copyright %1 2006-2018 The qBittorrent project - 版权所有 %1 2006-2018 qBittorrent项目 - - - - Home Page: - 主页: + qBittorrent 基于以下库编译: - - Forum: - 论坛: + + France + 法国 - - Bug Tracker: - Bug跟踪器: + + License + 许可证 @@ -115,57 +90,67 @@ 保存在 - + + Browse... + 浏览... + + + + Set as default save path + 设置为默认保存路径 + + + Never show again 不再显示 - + Torrent settings Torrent 设置 - + Set as default category 设置为默认分类 - + Category: 分类: - + Start torrent - 开始 Torrent + 开始 torrent - + Torrent information Torrent 信息 - + Skip hash check 跳过哈希检查 - + Size: 大小: - + Hash: 哈希值: - + Comment: 注释: - + Date: 日期: @@ -177,7 +162,7 @@ Automatic mode means that various torrent properties(eg save path) will be decided by the associated category - 自动模式表示不同的 Torrent 的配置信息(例如保存路径)将由相关的分类决定 + 自动模式表示不同的 torrent 的配置信息(例如保存路径)将由相关的分类决定 @@ -190,117 +175,89 @@ 自动 - - Remember last used save path - 记住上次使用的保存路径 - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog 如果选中,无论“下载”页上的选项如何设置,.torrent 文件都不会被删除 - + Do not delete .torrent file 不要删除 .torrent 文件 - - Create subfolder - 创建子文件夹 - - - - Download in sequential order - 按顺序下载 - - - - Download first and last pieces first - 先下载首尾 - - - + Normal 正常 - + High - + Maximum 最高 - + Do not download 不下载 - - - + + + I/O Error I/O 错误 - + Invalid torrent 无效 torrent - - Renaming - 重命名 - - - - - Rename error - 重命名错误 - - - - The name is empty or contains forbidden characters, please choose a different one. - 文件名为空或包含被禁止的字符,请重新命名。 + + + + + Already in download list + 已经在下载列表中 - + Not Available This comment is unavailable 不可用 - + Not Available This date is unavailable 不可用 - + Not available 不可用 - + Invalid magnet link 无效的磁力链接 - + The torrent file '%1' does not exist. Torrent 文件 '%1' 不存在。 - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. Torrent 文件 '%1' 无法从磁盘中读取,或许你没有足够的权限访问。 - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ 错误:%2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + 此 torrent 已经在下载列表中。Trackers 将不会合并,因为它是一个私有 torrent。 + + + + Torrent is already in download list. Trackers were merged. + 此 torrent 已经在下载列表中。Trackers 已合并。 + + + + + Cannot add torrent + 无法添加 torrent + + + + Cannot add this torrent. Perhaps it is already in adding state. + 无法添加此 torrent。也许它已是添加状态。 + + + This magnet link was not recognized 该磁力链接未被识别 - + + Magnet link is already in download list. Trackers were merged. + Magnet 链接已经在下载列表中。Trackers 已合并。 + + + + Cannot add this torrent. Perhaps it is already in adding. + 无法添加此 torrent。也许它已是添加状态。 + + + Magnet link 磁力链接 - + Retrieving metadata... 检索元数据... - + Not Available This size is unavailable. 不可用 - + Free space on disk: %1 剩余磁盘空间:%1 - + + Choose save path 选择保存路径 - - - - - - - Torrent is already present - 种子已存在 - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - 种子 '%1' 已在下载列表中。Tracker 信息没有合并,因为这是一个私有的 Torrent。 - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - Torrent '%1' 已在下载列表中。Tracker 信息已合并。 - - - - Torrent is already queued for processing. - 种子已在队列中等待处理 + + Rename the file + 重命名文件 - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - 磁力链接 '%1' 已在下载列表中。Tracker 信息已合并。 + + New name: + 新名称: - - Magnet link is already queued for processing. - 磁力链接已在队列中等待处理 + + + The file could not be renamed + 文件不能被重命名 - - New name: - 新名称: + + This file name contains forbidden characters, please choose a different one. + 该文件名包含被禁止符号,请重新命名。 - - + + This name is already in use in this folder. Please use a different name. 该文件名已存在,请重新命名。 - + The folder could not be renamed 该文件夹不能被重命名 - + Rename... 重命名... - + Priority 优先 - + Invalid metadata 无效的元数据 - + Parsing metadata... 解析元数据... - + Metadata retrieval complete 元数据检索完成 - + Download Error 下载错误 @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + 磁盘写入缓存大小 + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] 出端口(最小) [0: 禁用] - + Outgoing ports (Max) [0: Disabled] 出端口(最大) [0: 禁用] - + Recheck torrents on completion 完成后再次核对 torrent - + Transfer list refresh interval 传输列表刷新间隔 - + ms milliseconds ms - + Setting 设置 - + Value Value set for this setting - - - (disabled) - (禁用) - - - + (auto) (自动) - - min - minutes - 分钟 - - - + All addresses 所有地址 - + qBittorrent Section qBittorrent 部分 - - + + Open documentation 打开文档 - + libtorrent Section libtorrent 部分 - - Asynchronous I/O threads - 同步I/O线程 - - - - Disk cache - 磁盘缓存 - - - + s seconds s - + Disk cache expiry interval 磁盘缓存到期间隔 - + Enable OS cache 启用操作系统缓存 - - Guided read cache - 可引导读取缓存 - - - - Coalesce reads & writes - 合并读写 - - - - Send upload piece suggestions - 向 peers 发送需要被上传的分块建议 - - - - - KiB - KiB - - - - Send buffer watermark - 发送缓冲区水印 - - - - Send buffer low watermark - 发送缓冲区低级水印 - - - - Send buffer watermark factor - 发送缓冲区水印系数 - - - - Prefer TCP - 优先使用TCP - - - - Peer proportional (throttles TCP) - 按用户比重(抑制 TCP) - - - - Allow multiple connections from the same IP address - 允许来自同一 IP 地址的多个连接 + + m + minutes + m - + Resolve peer countries (GeoIP) - 显示用户国家(GeoIP) + 显示用户国家(GeoIP) - + Resolve peer host names 显示用户主机名 - + Strict super seeding 严格超级做种 - + Network Interface (requires restart) 网络界面(需要重启) - + Optional IP Address to bind to (requires restart) 绑定可选的 IP 地址到(需要重启) - + Listen on IPv6 address (requires restart) 监听 IPv6 地址(需要重启) - + Display notifications 显示通知 - + Display notifications for added torrents 为添加的 torrents 显示通知 - + Download tracker's favicon 下载 tracker 的网站图标 - - Save path history length - 保存路径的历史记录条目数 - - - - Fixed slots - 固定线程 - - - - Upload rate based - 基于上传速度 - - - - Upload slots behavior - 上传通道行为 - - - - Round-robin - 轮流上传 - - - - Fastest upload - 最快上传 - - - - Anti-leech - 反吸血 - - - - Upload choking algorithm - 上传拥塞控制策略 - - - + Confirm torrent recheck 确认再次核对 torrent - - Confirm removal of all tags - 确认删除所有标签 + Exchange trackers with other peers + 与其他用户交换 trackers - - Always announce to all trackers in a tier - 总是向同级的所有 trackers 发布 + + Always announce to all trackers + 总是向所有 trackers 发布 - - Always announce to all tiers - 总是向所有等级的 trackers 发布 - - - + Any interface i.e. Any network interface 任意网络接口 - + Save resume data interval How often the fastresume file is saved. 保存恢复数据时间间隔 - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - %1-TCP 混合模式策略 - - - + Maximum number of half-open connections [0: Unlimited] 最大半开放连接数 [0: 无限制] - + IP Address to report to trackers (requires restart) 向 trackers 报告 IP 地址(需要重启) - + Enable embedded tracker 启用内置 tracker - + Embedded tracker port 内置 tracker 端口 - + Check for software updates 检查软件更新 - + Use system icon theme 使用系统图标主题 @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 已开始 - + Torrent: %1, running external program, command: %2 Torrent:%1,运行外部程序,指令:%2 - - Torrent name: %1 - Torrent 文件:%1 - - - - Torrent size: %1 - Torrent 大小:%1 - - - - Save path: %1 - 保存路径:%1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - 该 torrent 下载用时为 %1。 - - - - Thank you for using qBittorrent. - 感谢您使用 qBittorrent。 - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] '%1' 已完成下载 + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrent:%1,运行外部程序的指令过长(长度 > %2),执行失败。 - + Torrent: %1, sending mail notification Torrent:%1,发送邮件提醒 - + Information 信息 - - To control qBittorrent, access the Web UI at %1 - 访问 %1 来控制qBittorrent + + To control qBittorrent, access the Web UI at http://localhost:%1 + 欲通过网页端控制 qBittorrent,你需要访问 http://localhost:%1 - + The Web UI administrator user name is: %1 - Web 用户界面管理员的用户名是:%1 + 网页端管理员的用户名是:%1 - + The Web UI administrator password is still the default one: %1 - Web 用户界面管理员密码设置为默认密码:%1 + 网络端管理员密码设置为默认密码:%1 - + This is a security risk, please consider changing your password from program preferences. 存在安全风险!请考虑在设置更改密码! - + Saving torrent progress... 保存 torrent 进程... - - - Portable mode and explicit profile directory options are mutually exclusive - 便携模式选项与指定设置存放目录的选项是互斥的 - - - - Portable mode implies relative fastresume - 便携模式包含相对的快速恢复文件 - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - 网页API登录失败。原因:IP被禁止,IP:%1,用户名:%2 - - - - Your IP address has been banned after too many failed authentication attempts. - 因为身份认证尝试失败次数过多,你的IP已经被屏蔽. - - - - WebAPI login success. IP: %1 - 网页API登录成功。IP:%1 - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - 网页API登录失败。原因:无效的鉴权,失败次数:%1,IP:%2,用户名:%3 - AutomatedRssDownloader - + Save to: 保存到: @@ -861,837 +658,700 @@ RSS 下载器 - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - 自动下载 RSS torrent 功能已被禁用!您可以在应用程序的设置中开启它。 + + Enable Automated RSS Downloader + 启动自动 RSS 下载器 - + Download Rules 下载规则 - + Rule Definition 规则定义 - + Use Regular Expressions 使用正则表达式 - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - 智能剧集过滤器将会检查剧集编号以防止重复的下载发生. -支持格式例如:S01E01, 1x1, 2017.01.01 和01.01.2017 (日期格式也支持把 " - " 作为分隔符) - - - - Use Smart Episode Filter - 使用智能剧集过滤器 - - - + Must Contain: 必须包含: - + Must Not Contain: 必须不含: - + Episode Filter: 剧集过滤器: - + Assign Category: 指定分类: - + Save to a Different Directory 保存到不同的目录 - + Ignore Subsequent Matches for (0 to Disable) ... X days 忽略指定时间后的匹配项 (0 禁用) - + Disabled - 禁用 + 禁用 - + days - + Add Paused: 加入已暂停的: - + Use global settings 使用全局设定 - + Always 总是 - + Never 从不 - + Apply Rule to Feeds: 对该订阅源应用规则: - + Matching RSS Articles 匹配 RSS 文章 - + &Import... 导入... - + &Export... 导出... - + Matches articles based on episode filter. 基于剧集过滤器匹配的文章。 - + Example: 示例: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match 将匹配第 1 季中的 2、5、8 到 15、30 及之后的剧集 - + Episode filter rules: 剧集过滤规则: - + Season number is a mandatory non-zero value 季度数必须是一个非零值 - + Episode number is a mandatory non-zero value + 剧集数必须是一个非零值 + + + Filter must end with semicolon 过滤规则必须以分号结束 - + Three range types for episodes are supported: 支持三种范围类型的剧集过滤规则: - + Single number: <b>1x25;</b> matches episode 25 of season one 单一数字:<b>1x25;</b> 匹配第 1 季的第 25 集 - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one 一般范围:<b>1x25-40;</b> 匹配第 1 季的第 25-40 集 - - Episode number is a mandatory positive value - 剧集数必须是一个正值 - - - - Rules - 规则 + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + 无限范围:<b>1x25-;</b> 匹配第 1 季的第 25 集及之后的剧集 - - Rules (legacy) - 规则 (旧式) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - 无限范围:<b>1x25-;</b> 匹配第 1 季的第 25 集及之后的剧集,以及之后所有的季度的剧集 + - + Last Match: %1 days ago 最后匹配:%1 天前 - + Last Match: Unknown 最后匹配:未知 - + New rule name 新规则名称 - + Please type the name of the new download rule. 请命名新的下载规则。 - - + + Rule name conflict 规则名称冲突 - - + + A rule with this name already exists, please choose another name. 该名称已被另一规则使用,请重新命名。 - + Are you sure you want to remove the download rule named '%1'? 您确定要移除名为 '%1' 的下载规则吗? - + Are you sure you want to remove the selected download rules? 您确定要移除选中的规则吗? - + Rule deletion confirmation 确认删除规则 - + Destination directory 目标目录 - + Invalid action - 无效操作 + 无效行为 - + The list is empty, there is nothing to export. - 列表为空,没有要导出的东西。 + 规则列表为空, 无项目可导出。 - - Export RSS rules - 导出 RSS 规则 + + Where would you like to save the list? + 您想将该列表保存在? - - + + Rules list (*.rssrules) + 规则列表 (*.rssrules) + + + I/O Error I/O 错误 - - Failed to create the destination file. Reason: %1 - 无法创建目标文件。原因: %1 + + Failed to create the destination file + 创建目标文件失败 - - Import RSS rules - 导入 RSS 规则 + + Please point to the RSS download rules file + 请指向 RSS 下载规则文件 - - Failed to open the file. Reason: %1 - 无法打开文件。原因: %1 + + Rules list + 规则列表 - + Import Error 导入错误 - - Failed to import the selected rules file. Reason: %1 - 导入所选规则文件失败。原因: %1 + + Failed to import the selected rules file + 无法导入选中的规则文件 - + Add new rule... 添加新规则... - + Delete rule 删除规则 - + Rename rule... 重命名规则... - + Delete selected rules 删除选中的规则 - - Clear downloaded episodes... - 清除已下载的剧集... - - - + Rule renaming 重命名规则 - + Please type the new rule name 请输入新的规则名称 - - Clear downloaded episodes - 清除已下载的剧集 + + Regex mode: use Perl-like regular expressions + 正则表达式模式:使用类似 Perl 的正则表达式 - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - 确认要删除所选规则下的已下载剧集的列表吗? - - - - Regex mode: use Perl-compatible regular expressions - 正则表达式模式:使用兼容于 Perl 的正则表达式 - - - - - Position %1: %2 - 位置 %1:%2 - - - + Wildcard mode: you can use - 通配符模式:你可以使用 + - + ? to match any single character - ? 以匹配任意单个字符 + - + * to match zero or more of any characters - * 以匹配 0 个或任意个任意字符 + - + Whitespaces count as AND operators (all words, any order) - 空格视为“与”操作符(所有的关键词,任意顺序) + - + | is used as OR operator - | 视为“或”操作符 + - + If word order is important use * instead of whitespace. - 如果需要考虑关键词顺序,使用 * 替代空格 + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - 一个空白分句 %1 抛出了一个异常(例如 %2) + - + will match all articles. - 将匹配所有文章。 + - + will exclude all articles. - 将排除所有文章。 - - - - BanListOptionsDialog - - - List of banned IP addresses - 被禁IP列表 - - - - Ban IP - 禁止IP - - - - Delete - 删除 - - - - - Warning - 警告 + - - The entered IP address is invalid. - 输入的IP地址无效 + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + 通配符模式:可使用<ul><li>? 匹配任意单字符</li><li>* 匹配零个或多个任意字符</li><li>空格视为运算符"且"</li></ul> - - The entered IP is already banned. - 输入的IP地址已经被禁止 + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + 通配符模式:可使用<ul><li>? 匹配任意单字符</li><li>* 匹配零个或多个任意字符</li><li>| 表示运算符"或"</li></ul> BitTorrent::Session - + Restart is required to toggle PeX support 更改 PeX 支持状态需要重启 - - Could not get GUID of configured network interface. Binding to IP %1 - 无法获取配置的网络接口的 GUID。绑定到 IP %1 - - - + Embedded Tracker [ON] 内置 Tracker [开] - + Failed to start the embedded tracker! 无法启动内置 tracker! - + Embedded Tracker [OFF] 内置 Tracker [关] - + + '%1' reached the maximum ratio you set. Removing... + '%1' 达到了您设定的最大比率,正在删除... + + + + '%1' reached the maximum ratio you set. Pausing... + '%1' 达到了您设定的最大比率,暂停中... + + + System network status changed to %1 e.g: System network status changed to ONLINE 系统网络状态变更至 %1 - + ONLINE 在线 - + OFFLINE 离线 - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding 网络配置 %1 发生改变,刷新会话绑定 - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. 设置的网络接口地址 %1 无效。 - - + Encryption support [%1] 加密支持 [%1] - - + FORCED 强制 - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - 在添加 %1 至被禁止 IP 列表时被拒绝,它不是一个有效的 IP 地址。 - - - - + Anonymous mode [%1] 匿名模式 [%1] - + Unable to decode '%1' torrent file. 无法解析 '%1' torrent 文件。 - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' 递归下载包含在 torrent ‘%2’ 内的文件 '%1' - + Queue positions were corrected in %1 resume files - 队列位置被定位于 %1 个恢复文件中 + - + Couldn't save '%1.torrent' 无法保存 '%1.torrent' - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - "%1" 已从传输列表中删除。 + + because %1 is disabled. + this peer was blocked because uTP is disabled. + 因为 %1 已被禁用。 - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - "%1" 已从传输列表和硬盘中删除。 - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - "%1" 已从传输列表中删除,但无法删除这些文件。错误:%2 - - - - because %1 is disabled. - this peer was blocked because uTP is disabled. - 因为 %1 已被禁用。 - - - + because %1 is disabled. this peer was blocked because TCP is disabled. 因为 %1 已被禁用。 - + URL seed lookup failed for URL: '%1', message: %2 找不到 URL 种子:'%1',消息:%2 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent 监听接口 %1 端口:%2/%3 失败。原因:%4。 - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + '%1' 从传输列表及硬盘被移除。 + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + '%1' 从传输列表被移除。 + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... '%1' 下载中,请等待... - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent 正在尝试监听任意网络接口上的端口:%1 - + The network interface defined is invalid: %1 网络界面定义无效:%1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent 试图监听接口 %1 端口:%2 - - Peer ID: - Peer ID: - - - - HTTP User-Agent is '%1' - HTTP用户代理 '%1' - - - - + DHT support [%1] DHT 支持 [%1] - - - - - - - - - + + + + ON 开启 - - - - - - - - - + + + + OFF 关闭 - - + Local Peer Discovery support [%1] 本地资源搜索支持 [%1] - - PeX support [%1] - PeX 支持 [%1] - - - - '%1' reached the maximum ratio you set. Removed. - '%1' 达到了您设定的最大比率,已删除。 - - - - '%1' reached the maximum ratio you set. Paused. - '%1' 达到了您设定的最大比率,已暂停。 - - - - '%1' reached the maximum seeding time you set. Removed. - '%1' 达到了您设定的最大做种时间,已删除。 - - - - '%1' reached the maximum seeding time you set. Paused. - '%1' 达到了您设定的最大做种时间,已暂停。 + Restart is required to toggle Tracker Exchange support + 启用或禁用 Tracker 交换功能需要重新启动 - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent 无法找到一个本地的 %1 地址进行监听 - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent 监听接口端口 %1 失败。原因:%2。 - + Tracker '%1' was added to torrent '%2' Tracker '%1' 已被添加到 torrent '%2' - + Tracker '%1' was deleted from torrent '%2' Tracker '%1' 已被添加到 torrent '%2' - + URL seed '%1' was added to torrent '%2' URL 种子 '%1' 已被添加到 torrent '%2' - + URL seed '%1' was removed from torrent '%2' URL 种子 '%1' 已被添加到 torrent '%2' - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. 无法恢复 torrent:'%1'。 - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number 解析提供的 IP 过滤规则成功:%1 条规则被应用。 - + Error: Failed to parse the provided IP filter. 错误:无法解析提供的 IP 过滤规则。 - - '%1' restored. - 'torrent name' restored. - '%1' 已恢复 - - - + Couldn't add torrent. Reason: %1 不能添加 torrent:'%1'。原因:%2 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + '%1' 已恢复(快速恢复)。 + + + '%1' added to download list. 'torrent name' was added to download list. '%1' 已添加到下载列表。 - + An I/O error occurred, '%1' paused. %2 出现 I/O 错误,'%1' 暂停。%2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP:端口映射失败,消息: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP:端口映射成功,消息: %1 - + due to IP filter. this peer was blocked due to ip filter. 是因为 IP 过滤规则。 - + due to port filter. this peer was blocked due to port filter. 是因为端口过滤规则。 - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. 是因为 I2P 混合模式的限制。 - + because it has a low port. this peer was blocked because it has a low port. 因为它有一个低端口号。 - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent 成功监听接口 %1 端口:%2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 外部 IP:%1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - 创建新的 Torrent 文件失败 - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - 先下载首尾段: %1, torrent: '%2' - - - - On - 开启 - - - - Off - 关闭 - - - - Successfully moved torrent: %1. New path: %2 - 成功移动 torrent: %1. 新路径: %2 - - - + Could not move torrent: '%1'. Reason: %2 - 无法移动 torrent: '%1'. 原因: %2 + 无法移动 torrent:'%1'。原因:%2 - + File sizes mismatch for torrent '%1', pausing it. - torrent '%1', 文件大小不匹配,正在暂停。 + 文件大小与 torrent '%1' 不匹配,暂停中。 - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - torrent '%1'. 的快速恢复数据被拒绝,原因:%2.重新检查中... + Torrent '%1' 的快速恢复数据被拒绝,原因:%2。重新检查中... CategoryFilterModel - + Categories - 分类 + 分类 - + All - 全部 + 全部 - + Uncategorized - 未分类 + @@ -1699,42 +1359,147 @@ Add category... - 添加分类... + 添加分类... Add subcategory... - 添加子分类... + - Edit category... - 编辑类别... + Remove category + 删除分类 + + + + Remove unused categories + 移除未使用的分类 + + + + Resume torrents + 恢复 torrents + + + + Pause torrents + 暂停 torrents + + + + Delete torrents + 删除 torrents + + + + New Category + 新分类 + + + + Category: + 分类: + + + + Invalid category name + 无效分类名 + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + 分类名不能包含 '\'。 +分类名不能以 '/' 开头或结尾。 +分类名不能包含 '//'。 + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + 全部 (0) + + + Uncategorized (0) + 未分类 (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + 未分类 (%1) + + + Add category... + 添加分类... - Remove category - 移除分类 + 删除分类 - Remove unused categories - 移除未使用的分类 + 移除未使用的分类 - Resume torrents - 继续 torrents + 恢复 torrents - Pause torrents - 暂停 torrents + 暂停 torrents - Delete torrents - 删除 torrents + 删除 torrents + + + New Category + 新分类 + + + Category: + 分类: + + + Invalid category name + 无效分类名 + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + 分类名不能包含 '\'。 +分类名不能以 '/' 开头或结尾。 +分类名不能包含 '//'。 + + + All (%1) + this is for the category filter + 全部 (%1) @@ -1774,106 +1539,58 @@ - DeletionConfirmationDialog - - - Deletion confirmation - 删除确认 - - - - Remember choice - 记住选择 - - - - Also delete the files on the hard disk - 同时也删除在硬盘上的文件 - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - 确定要从列表中删除 '%1' 吗 + 您确定要从传输列表中删除 '%1' 吗? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - 确定要从传输列表中删除这 %1 个种子吗? - - - - DownloadFromURLDialog - - - Download from URLs - 从URL下载 - - - - Add torrent links - 添加种子链接 - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - 每行一个链接(支持 HTTP 链接,磁力链接和文件哈希值) - - - - Download - 下载 - - - - No URL entered - 没有输入URL - - - - Please type at least one URL. - 请输入至少一个URL + 你确定要从传输列表中删除这 %1 个 torrents 吗? DownloadedPiecesBar - + White: Missing pieces 白色:缺失部分 - + Green: Partial pieces 绿色:未完成部分 - + Blue: Completed pieces 蓝色:完成部分 - ExecutionLogWidget + ExecutionLog - + General - 通用 + 普通 - + Blocked IPs - 被封禁的IP + 被阻止的 IP - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - <font color='red'>%1</font> 被封禁 %2 + <font color='red'>%1</font> 被拦截 %2 - + <font color='red'>%1</font> was banned x.y.z.w was banned <font color='red'>%1</font> 被禁止 @@ -1882,112 +1599,41 @@ FeedListWidget - + RSS feeds RSS 订阅列表 - - - Unread (%1) - 未读 (%1) + + Unread + 未读 FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - 尝试打开日志文件时发生错误。 已禁用写入日志。 - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - ... - - - - &Browse... - Launch file dialog button text (full) - 浏览... - - - - Choose a file - Caption for file open/save dialog - 选择一个文件 - - - - Choose a folder - Caption for directory open dialog - 选择一个文件夹 - - - - Any file - 任何文件 + + An error occured while trying to open the log file. Logging to file is disabled. + 尝试写入日志文件时出现错误。已禁用写入日志。 FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - I/O 错误:无法在读取模式下打开 IP 筛选器文件。 - - - - - - IP filter line %1 is malformed. - IP 过滤规则的第 %1 行格式不正确。 - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - IP 过滤规则的第 %1 行格式不正确。地址段的起始 IP 格式不正确。 - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - IP 过滤规则的第 %1 行格式不正确。地址段的结束 IP 格式不正确。 - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - IP 过滤规则的第 %1 行格式不正确。其中一个 IP 是 IPv4,而另一个是 IPv6。 - - - - - IP filter exception thrown for line %1. Exception is: %2 - IP 过滤规则在第 %1 行抛出异常。异常信息为:%2 - - - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - %1 额外的 IP 筛选器解析错误 + + + + I/O Error: Could not open ip filter file in read mode. + I/O 错误:无法在读取模式下打开 IP 过滤规则文件。 - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. 解析错误:过滤规则文件不是一个有效的 P2B 流量过滤表文件。 @@ -1995,396 +1641,472 @@ GeoIPDatabase - - + + Unsupported database file size. 不支持数据库文件大小。 - + Metadata error: '%1' entry not found. 元数据错误: 未找到 '%1' 项。 - + Metadata error: '%1' entry has invalid type. 元数据错误: '%1' 项类型无效。 - + Unsupported database version: %1.%2 不支持的数据库版本:%1.%2 - + Unsupported IP version: %1 不支持 IP 版本: %1 - + Unsupported record size: %1 不支持的记录大小:%1 - + Invalid database type: %1 无效的数据库类型:%1 - + Database corrupted: no data section found. 数据库损坏:未发现数据段。 - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - Http请求的大小超过限制,关闭socket. 限制: %ld, IP: %s + + File + 文件 - - Bad Http request, closing socket. IP: %s - Http请求错误, 关闭socket. IP: %s + + Edit + 编辑 - - - HttpServer - + + Help + 帮助 + + + Exit qBittorrent 退出 qBittorrent - + Only one link per line 每行一个连接 - + + Download + 下载 + + + Global upload rate limit must be greater than 0 or disabled. 全局上传速度限制必须大于 0 或禁止。 - + Global download rate limit must be greater than 0 or disabled. 全局下载速度限制必须大于 0 或禁止。 - + Alternative upload rate limit must be greater than 0 or disabled. 备用上传速度限制必须大于 0 或禁止。 - + Alternative download rate limit must be greater than 0 or disabled. 备用下载速度限制必须大于 0 或禁止。 - + Maximum active downloads must be greater than -1. 最大同时下载数必须大于 -1。 - + Maximum active uploads must be greater than -1. 最大同时上传数必须大于 -1。 - + Maximum active torrents must be greater than -1. 最大同时活动 torrents 必须大于 -1。 - + Maximum number of connections limit must be greater than 0 or disabled. 最大连接数限制必须大于 0 或禁用。 - + Maximum number of connections per torrent limit must be greater than 0 or disabled. 每个 torrent 的最大连接数限制必须大于 0 或禁用。 - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. 每个 torrent 的最大上传线程数限制必须大于 0 或禁用。 - + Unable to save program preferences, qBittorrent is probably unreachable. 无法保存程序偏好选项,可能是无法连接到 qBttorrent。 - - IRC: #qbittorrent on Freenode - IRC: #qbittorrent on Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - 无效的分类名: -请不要在分类名中使用特殊符号。 - - - - Unknown - 未知 - - - - Hard Disk - 硬盘 - - - - Share ratio limit must be between 0 and 9998. - 分享率限制必须在 0 和 9998 之间。 - - - - Seeding time limit must be between 0 and 525600 minutes. - 做种时间限制必须在 0 和 525600 分钟之间。 + + Language + 语言 - + The port used for incoming connections must be between 1 and 65535. 用于传入连接的端口必须大于 1 且小于 65535。 - + The port used for the Web UI must be between 1 and 65535. 用于 Web 用户界面的端口必须大于 1 且小于 65535。 - + Unable to log in, qBittorrent is probably unreachable. 登录失败,可能是无法连接到 qBttorrent。 - + Invalid Username or Password. 无效的用户名或密码。 - - Username - 用户名 + + Password + 密码 - - Password - 密码 - - - + Login 登录 - + + Upload Failed! + 上传失败! + + + Original authors 原作者 - + + Upload limit: + 上传限制: + + + + Download limit: + 下载限制: + + + Apply 确定 - + Add 添加 - + + Category: + 分类: + + + Upload Torrents Upload torrent files to qBittorent using WebUI 上传 Torrents - + + All + 全部 + + + + Downloading + 下载 + + + + Seeding + 做种 + + + + Completed + 完成 + + + + Resumed + 恢复 + + + + Paused + 暂停 + + + + Active + 活动 + + + + Inactive + 非活动 + + + Save files to location: 保存文件到: - + Cookie: Cookie: - + Type folder here 在此输入文件夹名称 - + + Run an external program on torrent completion + Torrent 完成时运行外部程序 + + + + Enable bandwidth management (uTP) + 启用宽带管理 (uTP) + + + + Apply rate limit to uTP connections + 应用速度限制于 uTP 连接 + + + + Alternative Global Rate Limits + 备用总速度限制 + + + More information 更多信息 - + Information about certificates 证书信息 - + Save Files to 保存文件到 - - Set location - 更改保存位置 - - - - Limit upload rate - 限制上传速率 + + Watch Folder + 监控文件夹 - - Limit download rate - 限制下载速率 + + Default Folder + 默认文件夹 - - Rename torrent - 重命名 torrent + + from + from time1 to time2 + - - Unable to create category - + + to + from time1 to time2 + - + Other... Save Files to: Watch Folder / Default Folder / Other... 其他... - + + Every day + Schedule the use of alternative rate limits on ... + 每天 + + + + Week days + Schedule the use of alternative rate limits on ... + 工作日 + + + + Week ends + Schedule the use of alternative rate limits on ... + 休息日 + + + Monday Schedule the use of alternative rate limits on ... 周一 - + Tuesday Schedule the use of alternative rate limits on ... 周二 - + Wednesday Schedule the use of alternative rate limits on ... 周三 - + Thursday Schedule the use of alternative rate limits on ... 周四 - + Friday Schedule the use of alternative rate limits on ... 周五 - + Saturday Schedule the use of alternative rate limits on ... 周六 - + Sunday Schedule the use of alternative rate limits on ... 周日 - + + Downloaded + Is the file downloaded or not? + 已下载 + + + Logout 注销 - + + Download from URLs + 从URL下载 + + + Download Torrents from their URLs or Magnet links 从 URL 或磁力链接下载 Torrents - + Upload local torrent 上传本地的 torrent - + Are you sure you want to delete the selected torrents from the transfer list? 你确定要从传输列表中删除选中的 torrents 吗? - + Save 保存 - + qBittorrent client is not reachable 无法访问 qBittorrent 客户端 - - qBittorrent has been shutdown. - qBittorrent 已经关闭。 - - - - IPSubnetWhitelistOptionsDialog - - - List of whitelisted IP subnets - IP 子网白名单列表 + + HTTP Server + HTTP 服务器 - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - 示例:172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + 支持以下参数: - - Add subnet - 添加子网 + + Torrent path + Torrent 路径 - - Delete - 删除 + + Torrent name + Torrent 名称 - - Error - 错误 + + qBittorrent has been shutdown. + qBittorrent 已经关闭。 + + + LineEdit - - The entered subnet is invalid. - 输入的子网无效。 + + Clear the text + 清除文本 LogListWidget - + Copy 复制 - + Clear 清除 @@ -2417,551 +2139,493 @@ 下载完成后 - + &View 视图 - + &Options... 选项... - + &Resume - 继续 + 重新开始 - + Torrent &Creator 生成 Torrent - + Set Upload Limit... 设置上传限制... - + Set Download Limit... 设置下载限制... - + Set Global Download Limit... 设置全局下载限制... - + Set Global Upload Limit... 设置全局上传限制... - + Minimum Priority - 最低优先级 + 设置下载限制... - + Top Priority - 最高优先级 + 最低优先级 - + Decrease Priority 降低优先级 - + Increase Priority 提升优先级 - - + + Alternative Speed Limits 备用速度限制 - + &Top Toolbar 顶部工具栏 - + Display Top Toolbar 显示顶部工具栏 - - Status &Bar - 状态栏 - - - + S&peed in Title Bar 在标题栏显示速度 - + Show Transfer Speed in Title Bar 在标题栏显示传输速度 - + &RSS Reader RSS 阅读器 - + Search &Engine 搜索引擎 - + L&ock qBittorrent 锁定 qBittorrent - + Do&nate! 捐赠 - - Close Window - 关闭窗口 - - - + R&esume All 重新开始所有任务 - + Manage Cookies... 管理 Cookies... - + Manage stored network cookies 管理存储的网络 cookies - + Normal Messages 一般消息 - + Information Messages 通知消息 - + Warning Messages 警告信息 - + Critical Messages 严重信息 - + &Log 日志 - + &Exit qBittorrent 退出 qBittorrent - + &Suspend System 睡眠操作系统 - + &Hibernate System 休眠操作系统 - + S&hutdown System 关闭操作系统 - + &Disabled 不执行任何操作 - + &Statistics 统计 - + Check for Updates 检查更新 - + Check for Program Updates 检查程序更新 - + &About 关于 - + &Pause 暂停 - + &Delete 删除 - + P&ause All 暂停所有任务 - + &Add Torrent File... 添加 Torrent 文件... - + Open 打开 - + E&xit 退出 - + Open URL 打开网址 - + &Documentation 帮助文档 - + Lock 锁定 - - - + + + Show 显示 - + Check for program updates 检查程序更新 - + Add Torrent &Link... 添加 Torrent 链接... - + If you like qBittorrent, please donate! 如果您喜欢 qBittorrent,请捐款! - - + Execution Log 执行日志 - + Clear the password 清除密码 - + Filter torrent list... 过滤 torrent 列表... - + &Set Password 设置密码 - - Preferences - 首选项 - - - + &Clear Password 清除密码 - + Transfers 传输 - - - qBittorrent is minimized to tray - qBittorrent已最小化到任务栏 - - - - - - This behavior can be changed in the settings. You won't be reminded again. - 该行为可以在设置中改变。你不会再次收到此类提醒。 - - - + Torrent file association 关联 torrent 文件 - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? qBittorrent 不是打开 torrent 文件或磁力链接的默认应用程序。 您想用 qBittorrent 打开 torrent 文件或磁力链接吗? - + Icons Only 只显示图标 - + Text Only 只显示文字 - + Text Alongside Icons 在图标旁显示文字 - + Text Under Icons 在图标下显示文字 - + Follow System Style 跟随系统设置 - - - + + + UI lock password 锁定用户界面的密码 - - - + + + Please type the UI lock password: 请输入用于锁定用户界面的密码: - + The password should contain at least 3 characters 密码应包含至少三个字符 - + Password update 更新密码 - + The UI lock password has been successfully updated 锁定用户界面的密码已成功更新 - + Are you sure you want to clear the password? 你确定你要清除密码吗? - - Use regular expressions - 使用正则表达式 - - - + Search 搜索 - + Transfers (%1) 传输 (%1) - + Error 错误 - + Failed to add torrent: %1 无法添加 torrent:%1 - + Torrent added Torrent 已添加 - + '%1' was added. e.g: xxx.avi was added. '%1' 已被添加。 - + Download completion 下载完成 - + I/O Error i.e: Input/Output Error I/O 错误 - + Recursive download confirmation 确认递归下载 - + Yes - + No - + Never 从不 - + Global Upload Speed Limit - 全局上传速度限制 + 总上传速度限制 - + Global Download Speed Limit - 全局下载速度限制 - - - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent 刚刚被更新,需要重启以使更改生效。 - - - - qBittorrent is closed to tray - qBittorrent已最小化到任务栏 - - - - Some files are currently transferring. - 一些文件正在传输中。 - - - - Are you sure you want to quit qBittorrent? - 您确定要退出 qBittorrent 吗? + 总下载速度限制 - + &No - + &Yes - + &Always Yes 总是 - - %1/s - s is a shorthand for seconds - %1/s - - - - Couldn't determine your Python version. Search engine disabled. - 无法确定您的 Python 版本。搜索引擎已禁用。 - - - + Old Python Interpreter 旧的 Python 解释器 - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. 您的 Python (%1) 已过时,请更新其至最新版本以继续使用搜索引擎。 最低要求版本为 2.7.9 / 3.3.0。 - + qBittorrent Update Available qBittorrent 有可用更新 - + + A new version is available. +Do you want to download %1? + 有新版本可供更新。 +您想要下载版本 %1 吗? + + + Already Using the Latest qBittorrent Version 已经是最新的 qBittorrent - + Undetermined Python version 未确定的 Python 版本 - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. '%1' 下载完毕。 - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2970,158 +2634,154 @@ 原因: %2 - + The torrent '%1' contains torrent files, do you want to proceed with their download? Torrent '%1' 包含多个 torrent 文件,您想用它们下载吗? - + Couldn't download file at URL '%1', reason: %2. 无法从网址 '%1' 下载文件,原因:%2。 - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin Python 位于 %1:%2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + 无法确定您的 Python 版本 (%1)。搜索引擎已禁用。 + + + + Missing Python Interpreter 缺少 Python 解释器 - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? 使用搜索引擎需要 Python,但是它似乎未被安装。 你想现在安装吗? - + Python is required to use the search engine but it does not seem to be installed. 使用搜索引擎需要 Python,但是它似乎未被安装。 - - A new version is available. - 新版本可用 - - - - Do you want to download %1? - 你想下载 %1 吗? - - - - Open changelog... - 打开变化日志... - - - + No updates available. You are already using the latest version. 没有可用更新。 您正在使用的已是最新版本。 - + &Check for Updates 检查更新 - + Checking for Updates... 正在检查更新... - + Already checking for program updates in the background 已经在后台检查程序更新 - + Python found in '%1' Python 位于 '%1' - + Download error 下载出错 - + Python setup could not be downloaded, reason: %1. Please install it manually. 不能下载 Python 安装程序,原因:%1。 请手动安装。 - - + + Invalid password 无效密码 - - - + + RSS (%1) RSS (%1) - + URL download error URL 下载出错 - + The password is invalid 该密码无效 - - + + DL speed: %1 e.g: Download speed: 10 KiB/s 下载速度:%1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s 上传速度:%1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [D: %1, U: %2] qBittorrent %3 - + Hide 隐藏 - + Exiting qBittorrent 正在退出 qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + 一些文件正在传输中。 +您确定要退出 qBittorrent 吗? + + + Open Torrent Files 打开 Torrent 文件 - + Torrent Files Torrent 文件 - + Options were saved successfully. 选项保存成功。 @@ -3129,52 +2789,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. 您的动态 DNS 已成功更新。 - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. 动态 DNS 错误:服务器暂时不可用,将于 30 分钟后重试。 - + Dynamic DNS error: hostname supplied does not exist under specified account. 动态 DNS 错误:提供的主机名不在指定的账户下。 - + Dynamic DNS error: Invalid username/password. 动态 DNS 错误:无效的用户名/密码。 - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. 动态 DNS 错误:qBittorrent 被服务器屏蔽,请在 http://bugs.qbittorrent.org 提交此错误。 - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. 动态 DNS 错误:服务器返回 %1,请在 http://bugs.qbittorrent.org 提交此错误。 - + Dynamic DNS error: Your username was blocked due to abuse. 动态 DNS 错误:您的用户名因滥用而被屏蔽。 - + Dynamic DNS error: supplied domain name is invalid. 动态 DNS 错误:提供的域名无效。 - + Dynamic DNS error: supplied username is too short. 动态 DNS 错误:提供的用户名过短。 - + Dynamic DNS error: supplied password is too short. 动态 DNS 错误:提供的密码过短。 @@ -3182,1413 +2842,1303 @@ Net::DownloadHandler - + I/O Error I/O 错误 - + The file size is %1. It exceeds the download limit of %2. 文件大小是 %1。它超出了下载限制 %2。 - + Unexpected redirect to magnet URI. 意外重定向至磁力链接。 + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - 未找到远程主机(无效主机名) + + + GeoIP database loaded. Type: %1. Build time: %2. + 已载入 GeoIP 数据库。类型:%1。创建时间:%2。 - - The operation was canceled - 操作被取消 + + + Couldn't load GeoIP database. Reason: %1 + 无法载入 GeoIP 数据库。原因:%1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - 在接收并处理远程服务器的应答之前,服务器提前中断连接 + + Venezuela, Bolivarian Republic of + 委內瑞拉 - - The connection to the remote server timed out - 连接远程服务器超时 + + Viet Nam + 越南 - - SSL/TLS handshake failed - SSL/TLS 握手失败 + + + N/A + N/A - - The remote server refused the connection - 远端服务器已拒绝连接 + + Andorra + 安道尔 - - The connection to the proxy server was refused - 代理服务器已拒绝连接 + + United Arab Emirates + 阿拉伯联合酋长国 - - The proxy server closed the connection prematurely - 代理服务器提前中断了连接 + + Afghanistan + 阿富汗 - - The proxy host name was not found - 无法找到代理主机名 - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - 代理服务器连接超时,或代理服务器没有及时响应请求 - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - 代理服务器要求身份验证以确认请求但不接受任何提供的凭据 - - - - The access to the remote content was denied (401) - 读取远端内容被拒绝 (401) - - - - The operation requested on the remote content is not permitted - 对于远程内容请求的操作未被许可 - - - - The remote content was not found at the server (404) - 内容在远程服务器上未找到 (404) - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - 远程服务器要求认证以提供资源,但提供的凭据不被接受 - - - - The Network Access API cannot honor the request because the protocol is not known - 网络许可 API 无法处理请求,因为协议未知 - - - - The requested operation is invalid for this protocol - 请求的操作对该协议无效 - - - - An unknown network-related error was detected - 未知网络错误 - - - - An unknown proxy-related error was detected - 未知代理错误 - - - - An unknown error related to the remote content was detected - 检测到关于远端内容的未知错误 - - - - A breakdown in protocol was detected - 协议错误 - - - - Unknown error - 未知错误 - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - 已载入 GeoIP 数据库。类型:%1。创建时间:%2。 - - - - - Couldn't load GeoIP database. Reason: %1 - 无法载入 GeoIP 数据库。原因:%1 - - - - Venezuela, Bolivarian Republic of - 委內瑞拉 - - - - Viet Nam - 越南 - - - - - N/A - N/A - - - - Andorra - 安道尔 - - - - United Arab Emirates - 阿拉伯联合酋长国 + + Antigua and Barbuda + 安提瓜和巴布达 - Afghanistan - 阿富汗 - - - - Antigua and Barbuda - 安提瓜和巴布达 - - - Anguilla 安圭拉 - + Albania 阿尔巴尼亚 - + Armenia 亚美尼亚 - + Angola 安哥拉 - + Antarctica 南极洲 - + Argentina 阿根廷 - + American Samoa 美属萨摩亚 - + Austria 奥地利 - + Australia 澳大利亚 - + Aruba 阿鲁巴 - + Azerbaijan 阿塞拜疆 - + Bosnia and Herzegovina 波斯尼亚和黑塞哥维那 - + Barbados 巴巴多斯 - + Bangladesh 孟加拉国 - + Belgium 比利时 - + Burkina Faso 布吉纳法索 - + Bulgaria 保加利亚 - + Bahrain 巴林 - + Burundi 布隆迪 - + Benin 贝宁 - + Bermuda 百慕大 - + Brunei Darussalam 文莱达鲁萨兰国 - + Brazil 巴西 - + Bahamas 巴哈马 - + Bhutan 不丹 - + Bouvet Island 布维岛 - + Botswana 博茨瓦纳 - + Belarus 白俄罗斯 - + Belize 伯利兹 - + Canada 加拿大 - + Cocos (Keeling) Islands 科科斯 (基林) 群岛 - + Congo, The Democratic Republic of the 刚果民主共和国 - + Central African Republic 中非共和国 - + Congo 刚果 - + Switzerland 瑞士 - + Cook Islands 库克群岛 - + Chile 智利 - + Cameroon 喀麦隆 - + China 中国 - + Colombia 哥伦比亚 - + Costa Rica 哥斯达黎加 - + Cuba 古巴 - + Cape Verde 佛得角 - + Curacao 库拉索 - + Christmas Island 圣诞岛 - + Cyprus 塞浦路斯 - + Czech Republic 捷克共和国 - + Germany 德国 - + Djibouti 吉布提 - + Denmark 丹麦 - + Dominica 多米尼克 - + Dominican Republic 多米尼加共和国 - + Algeria 阿尔及利亚 - + Ecuador 厄瓜多尔 - + Estonia 爱沙尼亚 - + Egypt 埃及 - + Western Sahara 西撒哈拉 - + Eritrea 厄立特里亚 - + Spain 西班牙 - + Ethiopia 埃塞俄比亚 - + Finland 芬兰 - + Fiji 斐济 - + Falkland Islands (Malvinas) 福克兰群岛 (马尔维纳斯群岛) - + Micronesia, Federated States of 密克罗尼西亚联邦国 - + Faroe Islands 法罗群岛 - + France 法国 - + Gabon 加蓬 - + United Kingdom 英国 - + Grenada 格林纳达 - + Georgia 格鲁吉亚 - + French Guiana 法属圭亚那 - + Ghana 加纳 - + Gibraltar 直布罗陀 - + Greenland 格陵兰岛 - + Gambia 冈比亚 - + Guinea 几内亚 - + Guadeloupe 瓜德罗普岛 - + Equatorial Guinea 赤道几内亚 - + Greece 希腊 - + South Georgia and the South Sandwich Islands 南乔治亚岛和南桑威奇群岛 - + Guatemala 危地马拉 - + Guam 关岛 - + Guinea-Bissau 几内亚比绍 - + Guyana 圭亚那 - + Hong Kong 香港 - + Heard Island and McDonald Islands 赫德岛和麦克唐纳群岛 - + Honduras 洪都拉斯 - + Croatia 克罗地亚 - + Haiti 海地 - + Hungary 匈牙利 - + Indonesia 印度尼西亚 - + Ireland 爱尔兰 - + Israel 以色列 - + India 印度 - + British Indian Ocean Territory 英属印度洋领地 - + Iraq 伊拉克 - + Iran, Islamic Republic of 伊朗伊斯兰共和国 - + Iceland 冰岛 - + Italy 意大利 - + Jamaica 牙买加 - + Jordan 约旦 - + Japan 日本 - + Kenya 肯尼亚 - + Kyrgyzstan 吉尔吉斯斯坦 - + Cambodia 柬埔寨 - + Kiribati 基里巴斯 - + Comoros 科摩罗 - + Saint Kitts and Nevis 圣基茨和尼维斯 - + Korea, Democratic People's Republic of 朝鲜民主主义人民共和国 - + Korea, Republic of 韩国 (大韩民国) - + Kuwait 科威特 - + Cayman Islands 开曼群岛 - + Kazakhstan 哈萨克斯坦 - + Lao People's Democratic Republic 老挝人民民主共和国 - + Lebanon 黎巴嫩 - + Saint Lucia 圣卢西亚 - + Liechtenstein 列支敦士登 - + Sri Lanka 斯里兰卡 - + Liberia 利比里亚 - + Lesotho 莱索托 - + Lithuania 立陶宛 - + Luxembourg 卢森堡 - + Latvia 拉托维亚 - + Morocco 摩洛哥 - + Monaco 摩纳哥 - + Moldova, Republic of 摩尔多瓦共和国 - + Madagascar 马达加斯加 - + Marshall Islands 马绍尔群岛 - + Mali 马里 - + Myanmar 缅甸 - + Mongolia 蒙古 - + Northern Mariana Islands 北马里亚纳群岛 - + Martinique 马提尼克岛 - + Mauritania 毛里塔尼亚 - + Montserrat 蒙特塞拉特 - + Malta 马耳他 - + Mauritius 毛里求斯 - + Maldives 马尔代夫 - + Malawi 马拉维 - + Mexico 墨西哥 - + Malaysia 马来西亚 - + Mozambique 莫桑比克 - + Namibia 纳米比亚 - + New Caledonia 新喀里多尼亚 - + Niger 尼日尔 - + Norfolk Island 诺福克岛 - + Nigeria 尼日利亚 - + Nicaragua 尼加拉瓜 - + Netherlands 荷兰 - + Norway 挪威 - + Nepal 尼泊尔 - + Nauru 瑙鲁 - + Niue 纽埃 - + New Zealand 新西兰 - + Oman 阿曼 - + Panama 巴拿马 - + Peru 秘鲁 - + French Polynesia 法属波利尼西亚 - + Papua New Guinea 巴布亚新几内亚 - + Philippines 菲律宾 - + Pakistan 巴基斯坦 - + Poland 波兰 - + Saint Pierre and Miquelon 圣皮埃尔和密克隆群岛 - + Puerto Rico 波多黎各 - + Portugal 葡萄牙 - + Palau 帕劳 - + Paraguay 巴拉圭 - + Qatar 卡塔尔 - + Reunion 团聚 - + Romania 罗马尼亚 - + Russian Federation 俄罗斯联邦 - + Rwanda 卢旺达 - + Saudi Arabia 沙特阿拉伯 - + Solomon Islands 所罗门群岛 - + Seychelles 塞舌尔 - + Sudan 苏丹 - + Sweden 瑞典 - + Singapore 新加坡 - + Slovenia 斯洛文尼亚 - + Svalbard and Jan Mayen 斯瓦尔巴和扬马延岛 - + Slovakia 斯洛伐克 - + Sierra Leone 塞拉利昂 - + San Marino 圣马利诺 - + Senegal 塞内加尔 - + Somalia 索马里 - + Suriname 苏里南 - + Sao Tome and Principe 圣多美和普林西比 - + El Salvador 萨尔瓦多 - + Syrian Arab Republic 阿拉伯叙利亚共和国 - + Swaziland 斯威士兰 - + Turks and Caicos Islands 特克斯和凯科斯群岛 - + Chad 乍得 - + French Southern Territories 法国南部领地 - + Togo 多哥 - + Thailand 泰国 - + Tajikistan 塔吉克斯坦 - + Tokelau 托克劳 - + Turkmenistan 土库曼斯坦 - + Tunisia 突尼斯 - + Tonga 汤加 - - Could not decompress GeoIP database file. - 无法解压 GeoIP 数据库文件。 - - - + Timor-Leste 东帝汶 - + Bolivia, Plurinational State of 玻利维亚 - + Bonaire, Sint Eustatius and Saba 博奈尔 - + Cote d'Ivoire 科特迪瓦 - + Libya 利比亚 - + Saint Martin (French part) 法属圣马丁岛 - + Macedonia, The Former Yugoslav Republic of 马其顿共和国 - + Macao 澳门 - + Pitcairn 皮特凯恩 - + Palestine, State of 巴勒斯坦 - + Saint Helena, Ascension and Tristan da Cunha 圣赫勒拿、阿森松和特里斯坦-达库尼亚 - + South Sudan 南苏丹 - + Sint Maarten (Dutch part) 荷属圣马丁岛 - + Turkey 土耳其 - + Trinidad and Tobago 特立尼达和多巴哥 - + Tuvalu 图瓦卢 - + Taiwan 台湾省 - + Tanzania, United Republic of 坦桑尼亚联合共和国 - + Ukraine 乌克兰 - + Uganda 乌干达 - + United States Minor Outlying Islands 美国本土外小岛屿 - + United States 美国 - + Uruguay 乌拉圭 - + Uzbekistan 乌兹别克斯坦 - + Holy See (Vatican City State) 教廷(梵蒂冈城国) - + Saint Vincent and the Grenadines 圣文森特和格林纳丁斯 - + Virgin Islands, British 英属维京群岛 - + Virgin Islands, U.S. 美属维京群岛 - + Vanuatu 瓦努阿图 - + Wallis and Futuna 瓦利斯和富图纳群岛 - + Samoa 萨摩亚 - + Yemen 也门 - + Mayotte 马约特岛 - + Serbia 塞尔维亚 - + South Africa 南非 - + Zambia 赞比亚 - + Montenegro 黑山 - + Zimbabwe 津巴布韦 - + Aland Islands 奥兰群岛 - + Guernsey 根西岛 - + Isle of Man 马恩岛 - + Jersey 泽西岛 - + Saint Barthelemy 圣巴泰勒米 - + + Could not uncompress GeoIP database file. + 无法解压 GeoIP 数据库文件。 + + + Couldn't save downloaded GeoIP database file. 无法保存已下载的 GeoIP 数据库文件。 - + Successfully updated GeoIP database. 成功更新 GeoIP 数据库。 - + Couldn't download GeoIP database file. Reason: %1 无法下载 GeoIP 数据库文件。原因:%1 @@ -4596,12 +4146,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] UPnP / NAT-PMP 支持 [开] - + UPnP / NAT-PMP support [OFF] UPnP / NAT-PMP 支持 [关] @@ -4609,7 +4159,7 @@ Net::Smtp - + Email Notification Error: Email 提醒出错: @@ -4617,1352 +4167,1150 @@ OptionsDialog - + Options 选项 - + Behavior 行为 - + Downloads 下载 - + Connection 连接 - + Speed 速度 - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI - Web 用户界面 + 网络操作界面 - + Advanced 高级 - + Language 语言 - + User Interface Language: 用户界面语言: - + (Requires restart) (需要重启) - + Transfer List 传输列表 - + Confirm when deleting torrents 删除 torrents 时进行确认 - + Use alternating row colors In transfer list, one every two rows will have grey background. 使用交替的行颜色 - + Hide zero and infinity values 隐藏为 0 及无穷大的项 - + Always 总是 - + Paused torrents only 仅暂停 torrents - + Action on double-click 双击执行操作 - + Downloading torrents: 正在下载 torrents: - - + + Start / Stop Torrent 开始 / 停止 Torrent - - + + Open destination folder 打开目标文件夹 - - + + No action 不执行操作 - + Completed torrents: 完成的 torrents: - + Desktop 桌面 - + Start qBittorrent on Windows start up 在 Windows 启动时启动 qBittorrent - + Show splash screen on start up 启动时显示程序启动画面 - + Start qBittorrent minimized 启动时使 qBittorrent 最小化 - + Confirmation on exit when torrents are active 当有 torrents 处于活动状态时确认退出 - + Confirmation on auto-exit when downloads finish 当下载完成并自动退出时询问 - - KiB - KiB - - - - Email notification &upon download completion - 下载完成时发送电子邮件通知 - - - - Run e&xternal program on torrent completion - Torrent 完成时运行外部程序 - - - - IP Fi&ltering - IP 过滤 - - - - Schedule &the use of alternative rate limits - 计划备用速度限制的启用时间 - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">更多信息</a>) - - - - &Torrent Queueing - Torrent 排队 - - - - Seed torrents until their seeding time reaches - 分享 torrents 直至达到做种时间限制 - - - - A&utomatically add these trackers to new downloads: - 自动添加以下 trackers 到新的 torrents: - - - - RSS Reader - RSS 阅读器 - - - - Enable fetching RSS feeds - 启用获取 RSS 订阅 - - - - Feeds refresh interval: - RSS 消息源刷新间隔: - - - - Maximum number of articles per feed: - 每个订阅源文章数目最大值: - - - - - min - minutes - 分钟 - - - - RSS Torrent Auto Downloader - RSS Torrent 自动下载器 - - - - Enable auto downloading of RSS torrents - 启用 RSS Torrent 自动下载 - - - - Edit auto downloading rules... - 修改自动下载规则... - - - - Web User Interface (Remote control) - Web 用户界面(远程控制) - - - - IP address: - IP 地址: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - Web UI 将绑定到的 IP 地址。 -指定 IPv4 或 IPv6 地址。您可以指定 "0.0.0.0",为任何 IPv4 地址, -"::" 为任何 IPv6 地址,或 "*" 为 IPv4 和 IPv6。 - - - - Server domains: - 服务器域名: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - 白名单用于过滤 HTTP 头的 Host 参数。 -为了预防 DNS 反向绑定攻击, -您应当指定供 Web 用户界面使用的域名。 - -使用 ';' 区分不同的输入。可以使用通配符 '*'。 - - - - &Use HTTPS instead of HTTP - 使用 HTTPS 而不是 HTTP - - - - Bypass authentication for clients on localhost - 对本地主机上的客户端跳过身份验证 - - - - Bypass authentication for clients in whitelisted IP subnets - 对 IP 子网白名单中的客户端跳过身份验证 - - - - IP subnet whitelist... - IP 子网白名单... - - - - Upda&te my dynamic domain name - 更新我的动态域名 + + Show qBittorrent in notification area + 在通知区域显示 qBittorrent - + Minimize qBittorrent to notification area 最小化 qBittorrent 到通知区域 - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. 关闭 qBittorrent 到通知区域 - + Tray icon style: 托盘图标样式: - + Normal 正常 - + Monochrome (Dark theme) 单色(深色主题) - + Monochrome (Light theme) 单色(浅色主题) - + File association 文件关联 - + Use qBittorrent for .torrent files 使用 qBittorrent 打开 .torrent 文件 - + Use qBittorrent for magnet links 使用 qBittorrent 打开磁力链接 - + Power Management 电源管理 - + + Inhibit system sleep when torrents are active + 当 torrents 处于活动状态时禁止系统休眠 + + + + Log file + 日志文件 + + + Save path: 保存路径: - + Backup the log file after: 当大于指定大小时备份日志文件: - + + MB + MB + + + Delete backup logs older than: 删除早于指定时间的备份日志文件: - + days Delete backup logs older than 10 months - + months Delete backup logs older than 10 months - + years Delete backup logs older than 10 years - + When adding a torrent 添加 torrent 时 - + + Display torrent content and some options + 显示 torrent 内容及选项 + + + Bring torrent dialog to the front 前置 torrent 对话框 - + Do not start the download automatically The torrent will be added to download list in pause state 不要自动开始下载 - + Should the .torrent file be deleted after adding it 在添加 .torrent 文件后删除该文件 - + + Delete .torrent files afterwards + 完成后删除 .torrent 文件 + + + Also delete .torrent files whose addition was cancelled 添加操作被取消时也删除 .torrent 文件 - + Also when addition is cancelled 添加操作被取消时也删除 .torrent 文件 - + Warning! Data loss possible! 警告!该操作可能会丢失数据! - + Saving Management 保存管理 - + Default Torrent Management Mode: 默认 Torrent 管理模式: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category 自动模式表示不同的 torrent 的配置信息(例如保存路径)将由相关的分类决定 - + Manual 手动 - + Automatic 自动 - + When Torrent Category changed: 当 Torrent 分类改变时: - + Relocate torrent 移动 torrent - + Switch torrent to Manual Mode 转换 torrent 至手动模式 - + When Default Save Path changed: 当默认保存路径改变时: - - + + Relocate affected torrents 移动影响的 torrents - - + + Switch affected torrents to Manual Mode 转换被影响的 torrents 至手动模式 - + When Category changed: 当分类改变时: - + Use Subcategories 启用子分类: - + Default Save Path: 默认保存路径: - + Keep incomplete torrents in: 保存未完成的 torrents 到: - + Copy .torrent files to: 复制 .torrent 文件到: - - Show &qBittorrent in notification area - 在通知区域显示 qBittorrent - - - - &Log file - 日志文件 - - - - Display &torrent content and some options - 显示 torrent 内容及选项 - - - - Create subfolder for torrents with multiple files - 为包含多个文件的 torrent 创建子文件夹 - - - - De&lete .torrent files afterwards - 完成后删除 .torrent 文件 - - - + Copy .torrent files for finished downloads to: 复制下载完成的 .torrent 文件到: - + Pre-allocate disk space for all files 为所有文件预分配磁盘空间 - - Inhibit system sleep when torrents are downloading - 种子处于下载状态时禁止系统自动休眠 - - - - Inhibit system sleep when torrents are seeding - 种子处于做种状态时禁止系统自动休眠 - - - + Append .!qB extension to incomplete files 为不完整的文件添加扩展名 .!qB - - Enable recursive download dialog - 启用递归下载会话 - - - + Automatically add torrents from: 自动从此处添加 torrents: - + Add entry 添加条目 - + Remove entry 移除条目 - + + Email notification upon download completion + 下载完成时邮件通知 + + + + Destination email: + 目标电子邮箱: + + + SMTP server: SMTP 服务器: - + This server requires a secure connection (SSL) 该服务器需要安全链接(SSL) - - + + + Authentication 验证 - - - - + + + + Username: 用户名: - - - - + + + + Password: 密码: - - Enabled protocol: - 启用的协议: - - - - TCP and μTP - TCP 和 μTP + + Run external program on torrent completion + Torrent 完成时运行外部程序 - + Listening Port 监听端口 - + Port used for incoming connections: 用于传入连接的端口: - + Random 随机 - + Use UPnP / NAT-PMP port forwarding from my router 使用我的路由器的 UPnP / NAT-PMP 端口转发 - + Use different port on each startup 在每次启动时使用不同的端口 - + Connections Limits 连接限制 - + Maximum number of connections per torrent: 每 torrent 最大连接数: - + Global maximum number of connections: - 全局最大连接数: + 总最大连接数: - + Maximum number of upload slots per torrent: 每 torrent 上传线程最大值: - + Global maximum number of upload slots: - 全局最大上传线程数: + 总最大上传线程数: - + Proxy Server 代理服务器 - + Type: 类型: - + (None) (无) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: 主机: - - + + Port: 端口: - + Otherwise, the proxy server is only used for tracker connections 否则,代理服务器将仅用于 tracker 连接 - + Use proxy for peer connections 使用代理服务器进行连接 - + Disable connections not supported by proxies 禁用代理服务器不支持的连接 - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">更多信息</a>) - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection RSS 订阅,搜索引擎,软件更新或者其他除了 torrent 传输和相关操作(例如用户交换数据)之外的任何操作都将使用直接连接 - + Use proxy only for torrents 只对 torrents 使用代理 - - A&uthentication - 认证 - - - + Info: The password is saved unencrypted 提示:密码未加密 - + + IP Filtering + IP 过滤 + + + Filter path (.dat, .p2p, .p2b): 过滤规则路径 (.dat, .p2p, .p2b): - + Reload the filter 重新加载过滤规则 - - Manually banned IP addresses... - 手动屏蔽 IP 地址... - - - + Apply to trackers 匹配 trackers - + Global Rate Limits - 全局速度限制 + 总速度限制 - - - - - - - KiB/s - KiB/s - - - - + + Upload: 上传: - - + + + + + KiB/s + KiB/s + + + + Download: 下载: - + Alternative Rate Limits - 备用速度限制 + 可替代速度限制 - - + + Schedule the use of alternative rate limits + 计划可替代的速度限制的使用时间 + + + From: from (time1 to time2) 从: - - + To: time1 to time2 到: - + When: 时间: - + Every day 每天 - + Weekdays 工作日 - + Weekends 周末 - + Rate Limits Settings 设置速度限制 - + Apply rate limit to peers on LAN 对本地网络用户进行速度限制 - + Apply rate limit to transport overhead 对传送总开销进行速度限制 - - + + + Enable µTP protocol + 启用 µTP 协议 + + + Apply rate limit to µTP protocol 对 µTP 协议进行速度限制 - + Privacy 隐私 - + Enable DHT (decentralized network) to find more peers 启用 DHT(分散网络)以获取更多资源 - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) 与兼容的 Bittorrent 客户端交换资源(µTorrent,Vuze,…) - + Enable Peer Exchange (PeX) to find more peers 启用用户交换(PeX)以获取更多资源 - + Look for peers on your local network 在本地网络上寻找资源 - + Enable Local Peer Discovery to find more peers 启用本地资源搜索以获取更多资源 - + Encryption mode: 加密模式: - + Prefer encryption 偏好加密 - + Require encryption - 强制加密 + 要求加密 - + Disable encryption 禁用加密 - + Enable when using a proxy or a VPN connection 使用代理或 VPN 连接时启用 - + Enable anonymous mode 启用匿名模式 - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">更多信息</a>) + + + + Torrent Queueing + Torrent 排队 + + + Maximum active downloads: 最大活动的下载数: - + Maximum active uploads: 最大活动的上传数: - + Maximum active torrents: 最大活动的 torrents 数: - + Do not count slow torrents in these limits 慢速 torrent 不计入限制内 - - Upload rate threshold: - 上传速率阈值 - - - - Download rate threshold: - 下载速率阈值 - - - - sec - seconds - - - - - Torrent inactivity timer: - Torrent 非活动计时器 - - - + Share Ratio Limiting 分享率限制 - + Seed torrents until their ratio reaches 分享 torrents 直至达到比率 - + then 然后 - + Pause them 暂停它们 - + Remove them 移除它们 - - RSS Smart Episode Filters - RSS智能剧集过滤器 + + Automatically add these trackers to new downloads: + 自动添加以下 trackers 到新的 torrents: + + + + Enable Web User Interface (Remote control) + 启用网络用户界面(远程控制) - + Use UPnP / NAT-PMP to forward the port from my router 使用我的路由器的 UPnP / NAT-PMP 端口来转发 - + + Use HTTPS instead of HTTP + 用 HTTPS 取代 HTTP + + + Certificate: 证书: - + Import SSL Certificate 导入 SSL 证书 - + Key: 密钥: - + Import SSL Key 导入 SSL 密钥 - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>关于证书</a> - - Use alternative Web UI - 使用替代的 Web UI - - - - Files location: - 文件位置: - - - - Enable clickjacking protection - 启用点击劫持保护 + + Bypass authentication for localhost + 绕过对本地主机的验证 - - Enable Cross-Site Request Forgery (CSRF) protection - 启用跨站请求伪造(CSRF)保护 + + Update my dynamic domain name + 更新我的动态域名 - + Service: 服务: - + Register 注册 - + Domain name: 域名: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! 若启用以下选项,你可能会<strong>永久地丢失<strong>你的 .torrent 文件! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well 如启用以下选项,qBittorent 会在 .torrent 文件成功地被添加到下载队列中后(第一选项)或添加失败后(第二选项)<strong> 删除</strong>它们。该设置<strong>不仅</strong>适用于通过 &ldquo;添加 torrent&rdquo; 菜单打开的文件,也适用于通过<strong>关联文件类型</strong>打开的文件。 - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog 如果启用第二选项(&ldquo;添加失败时同样处理&rdquo;),即使在 &ldquo;添加 torrent&rdquo; 对话框中点击 &ldquo;<strong>取消</strong>&rdquo; ,.torrent 文件<strong>也将被删除</strong>。 - - Choose Alternative UI files location - 选择用于替换的 UI 文件位置 - - - + Supported parameters (case sensitive): 支持的参数(区分大小写): - + %N: Torrent name %N:Torrent 名称 - + %L: Category %L:分类 - - %G: Tags (seperated by comma) - %G: 标签 (用逗号分隔) - - - + %F: Content path (same as root path for multifile torrent) %F:内容路径(与多文件 torrent 的根目录相同) - + %R: Root path (first torrent subdirectory path) %R:根目录(第一个 torrent 的子目录路径) - + %D: Save path %D:保存路径 - + %C: Number of files %C:文件数 - + %Z: Torrent size (bytes) %Z:Torrent 大小(字节) - + %T: Current tracker %T:当前 tracker - + %I: Info hash %I:哈希值 - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") 提示:使用引号将参数扩起以防止文本被空白符分割(例如:"%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - 当 Torrent 下载或上传速度低于指定阈值超过非活动计时器指定的时间时,Torrent将会被判定为慢速。 - - - + Select folder to monitor 选择要监视的文件夹 - + Folder is already being monitored: 已被监视的文件夹: - + Folder does not exist: 不存在的文件夹: - + Folder is not readable: 不可读的文件夹: - + Adding entry failed 添加条目失败 - - - - + + Choose export directory 选择导出目录 - - - + + + + + + Choose a save directory 选择保存目录 - + Choose an IP filter file 选择一个 IP 过滤规则文件 - + All supported filters 所有支持的过滤规则 - + SSL Certificate SSL 证书 - + + SSL Key + SSL 密钥 + + + Parsing error 解析错误 - + Failed to parse the provided IP filter 无法解析提供的 IP 过滤规则 - + Successfully refreshed 刷新成功 - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number 成功解析提供的 IP 过滤规则:%1 条规则已应用。 - + Invalid key 无效密钥 - + This is not a valid SSL key. 这不是有效的 SSL 密钥。 - + Invalid certificate 无效证书 - - Preferences - 首选项 - - - - Import SSL certificate - 导入 SSL 证书 - - - + This is not a valid SSL certificate. 这不是有效的 SSL 证书。 - - Import SSL key - 导入 SSL 密钥 - - - - SSL key - SSL 密钥 - - - + Time Error 时间错误 - + The start time and the end time can't be the same. 开始时间和结束时间不能相同。 - - + + Length Error 长度错误 - + The Web UI username must be at least 3 characters long. - Web 用户界面用户名长度最少为 3 个字符。 + Web 界面用户名长度最少为 3 个字符。 - + The Web UI password must be at least 6 characters long. - Web 用户界面密码长度最少为 6 个字符。 + Web 界面密码长度最少为 6 个字符。 PeerInfo - - Interested(local) and Choked(peer) + + interested(local) and choked(peer) 客户端期望下载但用户传输阻塞 - + interested(local) and unchoked(peer) 客户端期望下载且用户传输疏通 - + interested(peer) and choked(local) 用户期望下载但客户端传输阻塞 - + interested(peer) and unchoked(local) 用户期望下载且客户端传输疏通 - + optimistic unchoke 传输阻塞并正尝试疏通 - + peer snubbed 传输未阻塞但连接超时 - + incoming connection 传入连接中 - + not interested(local) and unchoked(peer) 用户传输疏通但客户端不期望下载 - + not interested(peer) and unchoked(local) 客户端传输疏通但用户不期望下载 - + peer from PEX 来自 PEX 的用户 - + peer from DHT 来自 DHT 的用户 - + encrypted traffic 加密的流量 - + encrypted handshake 加密的握手 - + peer from LSD 来自 LSD 的用户 @@ -5970,180 +5318,165 @@ PeerListWidget - + IP IP - + Port 端口 - + Flags 标志 - + Connection 连接 - + Client i.e.: Client application 客户端 - + Progress i.e: % downloaded 进度 - + Down Speed i.e: Download speed 下载速度 - + Up Speed i.e: Upload speed 上传速度 - + Downloaded i.e: total data downloaded 已下载 - + Uploaded i.e: total data uploaded 已上传 - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. 文件关联 - + Files i.e. files that are being downloaded right now 文件 - + Column visibility 显示列 - + Add a new peer... 添加新用户... - - + + Ban peer permanently 永久禁止用户 - + Manually adding peer '%1'... 手动添加用户 '%1'... - + The peer '%1' could not be added to this torrent. 用户 '%1' 无法被添加到此 torrent。 - + Manually banning peer '%1'... 手动禁止用户 '%1'... - - + + Peer addition 添加用户 - + Country 国家 - + Copy IP:port 复制 IP:端口 - + Some peers could not be added. Check the Log for details. 部分用户无法被添加。请查看日志以了解更多。 - + The peers were added to this torrent. 这些用户已添加到此 torrent。 - + Are you sure you want to ban permanently the selected peers? 您确定要永久禁止被选中的用户吗? - + &Yes - + &No - PeersAdditionDialog - - - Add Peers - 添加Peer用户 - - - - List of peers to add (one IP per line): - 要添加的用户列表(每行一个 IP): - - - - Format: IPv4:port / [IPv6]:port - 格式:IPv4:端口 / [IPv6]:端口 - + PeersAdditionDlg - + No peer entered 未输入用户 - + Please type at least one peer. 请至少输入一个用户。 - + Invalid peer - 无效的用户 + 错误的用户 - + The peer '%1' is invalid. 用户 '%1' 无效。 @@ -6151,12 +5484,12 @@ PieceAvailabilityBar - + White: Unavailable pieces 白色:不可用部分 - + Blue: Available pieces 蓝色:可用部分 @@ -6164,337 +5497,293 @@ PiecesBar - + Files in this piece: 在此块中的文件: - + File in this piece 在此块中的文件 - + File in these pieces 在这些块中的文件: - - Wait until metadata become available to see detailed information - 等待直到元数据可以显示详细信息 - - - + Hold Shift key for detailed information 按住 Shift 键以查看详细信息 - PluginSelectDialog + PluginSelectDlg - + Search plugins 搜索插件 - + Installed search plugins: 已安装的搜索插件: - + Name 名称 - + Version 版本 - + Url - + 网址 - - + + Enabled 启用 - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - 警告:在下载来自这些搜索引擎的 torrent 时,请确认它符合您所在国家的版权法。 - - - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> 您可以在这里获得新的搜索引擎:<a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one 安装一个新的搜索引擎 - + Check for updates 检查更新 - + Close 关闭 - + Uninstall 卸载 - - - + + + Yes - - - - + + + + No - + Uninstall warning 卸载警告 - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. 一些插件不能被卸载,因为它们是由 qBittorrent 添加的。只有你自己添加的插件才能被卸载。 这些插件已被禁用。 - + Uninstall success 卸载成功 - + All selected plugins were uninstalled successfully 所有选中的插件已成功卸载 - - - - - Search plugin update - 更新搜索插件 - - - - Plugins installed or updated: %1 - 插件已被安装或更新:%1 - - - - + + New search engine plugin URL 新搜索引擎插件网址 - - + + URL: - 网址: + 网址: - + Invalid link 无效链接 - + The link doesn't seem to point to a search engine plugin. 该链接似乎并不指向一个搜索引擎插件。 - + Select search plugins 选择搜索插件 - + qBittorrent search plugin qBittorrent 搜索插件 - + + + + Search plugin update + 更新搜索插件 + + + All your plugins are already up to date. 所有的插件已是最新的。 - + Sorry, couldn't check for plugin updates. %1 - + 抱歉,无法检查插件更新。%1 - + + + Search plugin install - + 安装搜索插件 + + + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + 搜索引擎插件“%1”已成功安装。 - + Couldn't install "%1" search engine plugin. %2 - + 无法安装搜索引擎插件“%1”。%2 + + + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + 搜索引擎插件“%1”已成功更新。 - + Couldn't update "%1" search engine plugin. %2 - + 无法更新搜索引擎插件“%1”。%2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + 插件来源 - + Search plugin source: - + 搜索插件来源: - + Local file - + 本地文件 - + Web link - - - - - PowerManagement - - - qBittorrent is active - + 网络连接 - PreviewSelectDialog - - - Preview - 预览 - + PreviewSelect - + Name 名称 - + Size 大小 - + Progress 进度 - - + + Preview impossible 无法预览 - - + + Sorry, we can't preview this file 抱歉,此文件无法被预览 - Private::FileLineEdit - - - '%1' does not exist - '%1' 不存在 - - - - '%1' does not point to a directory - '%1' 不是一个文件夹 - - - - '%1' does not point to a file - '%1' 不是一个文件 - - - - Does not have read permission in '%1' - '%1' 没有读取权限 - - - - Does not have write permission in '%1' - '%1' 没有写入权限 - - - PropListDelegate - + Not downloaded 未下载 - - + + Normal Normal (priority) 正常 - - N/A - N/A - - - + Do not download Do not download (priority) - 不下载 + 不下载 - - + + High High (priority) - + N/A + N/A + + + Mixed Mixed (priorities 混合的 - - + + Maximum Maximum (priority) 最高 @@ -6503,32 +5792,32 @@ PropTabBar - + General 普通 - + Trackers Trackers - + Peers 用户 - + HTTP Sources HTTP 源 - + Content 内容 - + Speed 速度 @@ -6622,22 +5911,22 @@ 注释: - + Select All 选择所有 - + Select None 全不选 - + Normal 正常 - + High @@ -6697,751 +5986,717 @@ 保存路径: - + Maximum 最高 + - Do not download 不下载 - + Never 从不 - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (已完成 %3) - - + + %1 (%2 this session) %1 (本次会话 %2) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (已做种 %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (最大 %2) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (总计 %2) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (平均 %2) - + Open 打开 - + Open Containing Folder 打开包含文件夹 - + Rename... 重命名... - + Priority 优先 - + New Web seed - 新建 Web 种子 + 新建网页种子 - + Remove Web seed - 移除 Web 种子 + 移除网页种子 - + Copy Web seed URL - 复制 Web 种子 URL + 复制网页种子 URL - + Edit Web seed URL - 编辑 Web 种子 URL + 编辑网页种子 URL + + + + Rename the file + 重命名文件 - + New name: 新文件名: - - + + + The file could not be renamed + 文件不能被重命名 + + + + This file name contains forbidden characters, please choose a different one. + 该文件名包含被禁止符号,请重新命名。 + + + + This name is already in use in this folder. Please use a different name. 该名称已被使用,请重新命名。 - + The folder could not be renamed 文件夹不能被重命名 - + qBittorrent qBittorrent - + Filter files... 过滤文件... - - Renaming - 重命名 - - - - - Rename error - 重命名错误 - - - - The name is empty or contains forbidden characters, please choose a different one. - 文件名为空或包含被禁止的字符,请重新命名。 - - - + New URL seed New HTTP source 新建 URL 种子 - + New URL seed: 新建 URL 种子: - - + + This URL seed is already in the list. 该 URL 种子已在列表中。 - + Web seed editing - 编辑 Web 种子 + 编辑网页种子 - + Web seed URL: -  Web 种子 URL: + 网页种子 URL: QObject - + + Your IP address has been banned after too many failed authentication attempts. + 经过多次授权失败后,您的 IP 已被封锁。 + + + + Error: '%1' is not a valid torrent file. + + 错误:'%1' 不是一个有效的 torrent 文件。 + + + + + Error: Could not add torrent to session. + 错误:无法添加 torrent 到会话中。 + + + + I/O Error: Could not create temporary file. + I/O 错误:创建缓存文件失败。 + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 是未知的命令行参数。 - - + + %1 must be the single command line parameter. %1 必须是一个单一的命令行参数。 - + + %1 must specify the correct port (1 to 65535). + %1 必须指定正确的端口号 (1 ~ 65535)。 + + + You cannot use %1: qBittorrent is already running for this user. 您不能使用 %1:qBittorrent 已在当前用户运行。 - + Usage: 使用: - + Options: 设定: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - 参数 '%1' 必须符合语法 '%1=%2' + + Displays program version + 显示程序版本号 + + + + Displays this help message + 显示帮助信息 - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - 参数 '%1' 必须符合语法 '%1=%2' + + Changes the Web UI port (current: %1) + 修改网络界面端口(当前:%1) - - Expected integer number in environment variable '%1', but got '%2' - 预期环境变量 '%1' 是一个整数,而它的值为 '%2' + + Disable splash screen + 禁用启动界面 - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - 参数 '%1' 必须符合语法 '%1=%2' + + Run in daemon-mode (background) + 运行在守护进程模式(后台运行) - - Expected %1 in environment variable '%2', but got '%3' - 预期环境变量 '%2' 是 '%1',而它是 '%3' + + Downloads the torrents passed by the user + 下载用户批准的 torrents - - port - 端口 + + Help + 帮助 - - %1 must specify a valid port (1 to 65535). - %1 必须指定一个有效的端口号(1 ~ 65535)。 + + Run application with -h option to read about command line parameters. + 启动程序时加入 -h 参数以参看相关命令行信息。 - - Display program version and exit - 显示程序版本并退出 + + Bad command line + 错误的命令 - - Display this help message and exit - 显示帮助信息并退出 + + Bad command line: + 错误的命令: - - Change the Web UI port - 修改 Web 用户界面端口 + + Legal Notice + 法律声明 - - Disable splash screen - 禁用启动界面 + + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. + +No further notices will be issued. + qBittorrent 是一个文件共享程序。当你运行一个 torrent 文件时,它的数据会被上传给其他用户。您需要对你共享的任何内容负全部的责任。 + +之后不会有其他提醒。 - - Run in daemon-mode (background) - 运行在守护进程模式(后台运行) + + Press %1 key to accept and continue... + 按 %1 键接受并且继续... - - dir - Use appropriate short form or abbreviation of "directory" - 路径 + + Legal notice + 法律声明 - - Store configuration files in <dir> - 保存配置文件于 <dir> + + Cancel + 取消 - - - name - 名称 + + I Agree + 同意 - - Store configuration files in directories qBittorrent_<name> - 保存配置文件于 qBittorrent_<name> 文件夹 + + Torrent name: %1 + Torrent 名称:%1 - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - 将修改 libtorrent 的快速恢复文件并使文件路径相对于设置文件夹 + + Torrent size: %1 + Torrent 大小:%1 - - files or URLs - 文件或 URL + + Save path: %1 + 保存路径:%1 - - Download the torrents passed by the user - 下载用户批准的 torrent + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Torrent 文件下载到 %1。 - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - 指定在添加 torrent 时是否开启“新建 Torrent”窗口 + + Thank you for using qBittorrent. + 感谢您使用 qBittorrent。 - - Options when adding new torrents: - 添加新的 torrents 时的选项: + + [qBittorrent] '%1' has finished downloading + [qBittorrent] '%1' 已完成下载 - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - %1 的快捷方式 + + The remote host name was not found (invalid hostname) + 未找到远程服务器(无效主机名) - - path - 路径 + + The operation was canceled + 操作被取消 - - Torrent save path - Torrent 保存路径 + + The remote server closed the connection prematurely, before the entire reply was received and processed + 远程服务器在接到和处理完整回复前过早关闭连接 - - Add torrents as started or paused - 添加 torrents 时的状态为开始或暂停 + + The connection to the remote server timed out + 连接远程服务器超时 - - Skip hash check - 跳过哈希检查 + + SSL/TLS handshake failed + SSL/TLS 握手失败 - - Assign torrents to category. If the category doesn't exist, it will be created. - 指定 torrents 的分类。如果分类不存在,则创建。 + + The remote server refused the connection + 远程服务器拒绝连接 - - Download files in sequential order - 以连续顺序下载文件 + + The connection to the proxy server was refused + 连接到代理服务器被拒绝 - - Download first and last pieces first - 优先下载首尾段 + + The proxy server closed the connection prematurely + 代理服务器过早关闭连接 - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - 选项的值可以通过环境变量设置。例如选项的名称为 'parameter-name',那么它的环境变量名为 'QBT_PARAMETER_NAME' (字符大写,使用 '_' 替换 '-')。若要指定标记的值,将值设置为 '1' 或 'TRUE'。例如,若要禁用启动画面: + + The proxy host name was not found + 代理服务器主机名不存在 - - Command line parameters take precedence over environment variables - 命令行参数将覆盖环境变量 + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + 连接到代理服务器超时或代理服务器未及时回复请求 - - Help - 帮助 + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + 代理服务器要求身份验证以确认请求,但没有接受任何提供的凭据 - - Run application with -h option to read about command line parameters. - 启动程序时加入 -h 参数以参看相关命令行信息。 + + The access to the remote content was denied (401) + 读取远程内容被拒绝 (401) - - Bad command line - 错误的命令 + + The operation requested on the remote content is not permitted + 对于远程内容请求的操作未被允许 - - Bad command line: - 错误的命令: + + The remote content was not found at the server (404) + 内容在远程服务器上未找到 (404) - - Legal Notice - 法律声明 + + The remote server requires authentication to serve the content but the credentials provided were not accepted + 远程服务器要求认证以提供资源,但提供的凭据不被接受 - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - qBittorrent 是一个文件共享程序。当你运行一个BT种子文件时,它的数据会被上传给其他用户。您需要对你共享的任何内容负全部的责任。 + + The Network Access API cannot honor the request because the protocol is not known + 网络许可 API 无法处理请求,因为协议未知 - - No further notices will be issued. - 之后不会有其他提醒。 + + The requested operation is invalid for this protocol + 请求的操作对该协议无效 - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - -No further notices will be issued. - qBittorrent 是一个文件共享程序。当你运行一个 torrent 文件时,它的数据会被上传给其他用户。您需要对你共享的任何内容负全部的责任。 - -之后不会有其他提醒。 + + An unknown network-related error was detected + 检测到未知的关于局域网的错误 - - Press %1 key to accept and continue... - 按 %1 键接受并且继续... + + An unknown proxy-related error was detected + 检测到未知的关于代理服务器的错误 - - Legal notice - 法律声明 + + An unknown error related to the remote content was detected + 检测到未知的关于远程内容的错误 - - Cancel - 取消 + + A breakdown in protocol was detected + 检测到协议故障 - - I Agree - 同意 + + Unknown error + 未知错误 - - + + Upgrade 升级 - + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] 你从较旧的版本更新,两者保存的东西有所不同。你必须迁移到新的保存系统。你将不能再次使用比 v3.3.0 旧的版本。要继续吗? [y/n] - + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. 你从较旧的版本更新,两者保存的东西有所不同。你必须迁移到新的保存系统。如果你继续,你将不能再次使用比 v3.3.0 旧的版本。 - + Couldn't migrate torrent with hash: %1 不能移动 torrent,它的哈希为:%1 - + Couldn't migrate torrent. Invalid fastresume file name: %1 不能移动 torrent。无效的快速恢复文件名称:%1 - - Detected unclean program exit. Using fallback file to restore settings: %1 - 检测到未知的程序退出。使用备份文件还原设置: %1 + + Detected unclean program exit. Using fallback file to restore settings. + 检测到未清理的程序退出。使用备份文件恢复设置。 - + An access error occurred while trying to write the configuration file. 尝试写入配置文件时出现权限错误。 - + A format error occurred while trying to write the configuration file. 尝试写入配置文件时出现文件格式错误。 - - - An unknown error occurred while trying to write the configuration file. - 尝试写入配置文件时出现未知错误。 - - - - RSS::AutoDownloader - - - - Invalid data format. - 无效的数据格式。 - - - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - 无法在 %1 保存 RSS 自动下载器数据。错误: %2 - - - - Invalid data format - 无效数据格式 - - - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - 无法从 %1 读取 RSS 自动下载器规则。错误: %2 - - - - Couldn't load RSS AutoDownloader rules. Reason: %1 - 无法读取 RSS 自动下载器规则。原因: %1 - - - - RSS::Feed - - - Failed to download RSS feed at '%1'. Reason: %2 - 下载 "%1" RSS 订阅失败。原因: %2 - - - - RSS feed at '%1' updated. Added %2 new articles. - 已更新 RSS 订阅 "%1" 。添加了 %2 个新文章。 - - - - Failed to parse RSS feed at '%1'. Reason: %2 - 无法解析 RSS 订阅 "%1" 。原因: %2 - - - - Couldn't read RSS Session data from %1. Error: %2 - 无法从 %1 读取 RSS 会话数据。错误: %2 - - - - Couldn't parse RSS Session data. Error: %1 - 无法解析 RSS 会话数据。错误: %1 - - - - Couldn't load RSS Session data. Invalid data format. - 无法加载 RSS 会话数据。无效的数据格式。 - - - - Couldn't load RSS article '%1#%2'. Invalid data format. - 无法加载 RSS 文章 "%1#%2"。无效的数据格式。 - - - - RSS::Private::Parser - - - Invalid RSS feed. - 无效的 RSS 订阅。 - - - - %1 (line: %2, column: %3, offset: %4). - %1(行:%2,列:%3,偏移:%4)。 - - - - RSS::Session - - - RSS feed with given URL already exists: %1. - 该 URL 已在 RSS 订阅源中存在:%1。 - - - - Cannot move root folder. - 不能移动根文件夹。 - - - - - Item doesn't exist: %1. - 项目不存在: %1。 - - - - Cannot delete root folder. - 不能删除根文件夹。 - - - - Incorrect RSS Item path: %1. - 不正确的 RSS 项路径:%1。 - - - - RSS item with given path already exists: %1. - 该 RSS 项的路径已存在:%1。 - - - - Parent folder doesn't exist: %1. - 父文件夹不存在:%1。 - - RSSWidget + RSS - + Search 搜索 - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - 获取 RSS 订阅功能已被禁用!您可以在应用程序的设置中开启它。 - - - + New subscription 新 RSS 订阅 - - - + + + Mark items read - 标记为已读 + 标记项目为已读 - - Refresh RSS streams - 重新载入 RSS 资源 - - - + Update all 更新所有 - + RSS Downloader... RSS 下载器... - + + Settings... + 设置... + + + Torrents: (double-click to download) Torrents:(双击下载) - - + + Delete 删除 - + Rename... 重命名... - + Rename 重命名 - - + + Update 更新 - + New subscription... 新建订阅... - - + + Update all feeds 更新所有订阅 - + Download torrent 下载 torrent - + Open news URL 打开新闻 URL - + Copy feed URL - 复制订阅源 URL + 复制文件 URL - + New folder... 新文件夹... - + + Refresh RSS streams + 重新载入 RSS 资源 + + + + RSSImp + + + Stream URL: + 资源地址: + + + + Please type a RSS stream URL + 请输入一个 RSS 资源地址 + + + + This RSS feed is already in the list. + 该 RSS 订阅已在列表中。 + + + Please choose a folder name - 请指定文件夹名 + 请选择文件夹名 - + Folder name: 文件夹名: - + New folder 新文件夹 - - Please type a RSS feed URL - 请输入一个 RSS 订阅地址 - - - - Feed URL: - 订阅源 URL: - - - + Deletion confirmation 确认删除 - + Are you sure you want to delete the selected RSS feeds? 您确定要删除选中的 RSS 订阅吗? - + Please choose a new name for this RSS feed - 请重命名该 RSS 订阅源 + 请重命名该 RSS 文件 - + New feed name: - 新订阅源名称: + 新文件名: + + + + Name already in use + 名称已被使用 - - Rename failed - 重命名失败 + + This name is already used by another item, please choose another one. + 该名称已被另一项目使用,请重新选择。 - + Date: 日期: - + Author: 作者: + + + Unread + 未读 + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + 从 '%2' 订阅源自动下载 '%1' 失败,因为 '%2' 订阅源没有包含任何 torrent 或者磁力链接... + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + 自动下载 RSS 订阅 '%2' 中的 torrent '%1' ... + + + + Rss::Private::Parser + + + Invalid RSS feed. + 无效的 RSS 订阅。 + + + + RssSettingsDlg + + + RSS Reader Settings + RSS 阅读器设置 + + + + RSS feeds refresh interval: + RSS 消息源刷新间隔: + + + + min + 分钟 + + + + Maximum number of articles per feed: + 每个订阅源文章数目最大值: + ScanFoldersDelegate - + Select save location 选择保存位置 @@ -7449,274 +6704,268 @@ ScanFoldersModel - + Monitored Folder 监控文件夹 - + Override Save Location 覆盖保存位置 - + Monitored folder 监控文件夹 - + Default save location 默认保存位置 - + Browse... 浏览... - SearchJobWidget + SearchEngine - - Form - + + Unknown search engine plugin file format. + 未知的搜索引擎插件文件格式。 - - Results(xxx) - + + A more recent version of this plugin is already installed. + 此插件的新版本已经安装了。 - - Search in: - + + + Plugin is not supported. + 不支持的插件。 - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - + + Update server is temporarily unavailable. %1 + 更新服务器暂时不可用。%1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - + + + Failed to download the plugin file. %1 + 无法下载插件文件。%1 - - Seeds: - 种子: + + An incorrect update info received. + 收到的更新信息存在错误。 - - <html><head/><body><p>Minimal number of seeds</p></body></html> - + + All categories + 所有类别 - - - to - + + Movies + 电影 - - <html><head/><body><p>Maximal number of seeds</p></body></html> - + + TV shows + 电视节目 - - - - + + Music + 音乐 - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + + Games + 游戏 - - Size: - 大小: + + Anime + 动画 - - <html><head/><body><p>Minimal torrent size</p></body></html> - + + Software + 软件 - - <html><head/><body><p>Maximal torrent size</p></body></html> - + + Pictures + 图片 + + + + Books + 书籍 + + + + SearchListDelegate + + + + Unknown + 未知 + + + SearchTab - + Name i.e: file name - 名称 + 名称 - + Size i.e: file size - 大小 + 大小 - + Seeders i.e: Number of full sources - + 完整种子 - + Leechers i.e: Number of partial sources - + 不完整种子 - + Search engine - - - - - Filter search results... - + 搜索引擎 - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + 结果(显示 <i>%1</i> 条,共 <i>%2</i> 条) - + Torrent names only - + 仅 torrent 名称 - + Everywhere - - - - - Use regular expressions - 使用正则表达式 + 任意位置 - + Searching... - + 搜索中... - + Search has finished - 搜索完毕 + 搜索完毕 - + Search aborted - + 搜索中止 - + An error occurred during search... - + 在搜索时出现错误... - + Search returned no results - + 搜索无结果 - + Column visibility - - - SearchPluginManager - - - Unknown search engine plugin file format. - 未知的搜索引擎插件文件格式。 - - - - A more recent version of this plugin is already installed. - 此插件的新版本已经安装了。 - - - - Plugin is not supported. - 不支持的插件。 + + Form + 表单 - - All categories - 所有类别 + + Results(xxx) + 结果(xxx) - - Movies - 电影 + + Search in: + 在以下范围搜索: - - TV shows - 电视节目 + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>一些搜索引擎会搜索 torrent 介绍和 torrent 内的文件名。可以通过修改此模式来调整显示在下方列表的搜索结果。</p><p><span style=" font-weight:600;">任意位置 </span>将禁用过滤并显示搜索引擎返回的所有结果。</p><p><span style=" font-weight:600;">仅 torrent 名称</span> 将只显示名称匹配搜索关键词的 torrents。</p></body></html> - - Music - 音乐 + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>设置允许的最小 / 最大种子用户数</p></body></html> - - Games - 游戏 + + Seeds: + 种子: - - Anime - 动漫 + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>最小种子数</p></body></html> - - Software - 软件 + + + to + - - Pictures - 图片 + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>最大种子数</p></body></html> - - - Books - 书籍 + + + + + - - Update server is temporarily unavailable. %1 - 更新服务器暂时不可用。%1 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>设置允许的最小 / 最大 torrent 大小</p></body></html> - - - Failed to download the plugin file. %1 - 无法下载插件文件。%1 + + Size: + 大小: - - An incorrect update info received. - 收到的更新信息存在错误。 + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>最小 torrent 大小</p></body></html> - - Search plugin '%1' contains invalid version string ('%2') - 搜索插件 "%1" 包含无效的版本字符串 ("%2") + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>最大 torrent 大小</p></body></html> @@ -7724,198 +6973,185 @@ - - - - + + + Search 搜索 - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - 您未安装任何搜索插件。 -点击窗口右下角的 "搜索插件..." 按钮来安装一些插件。 - - - + Download 下载 - + Go to description page 跳至描述页 - + Copy description page URL 复制描述页网址 - + Search plugins... 搜索插件... - + A phrase to search for. 欲搜索的关键词。 - + Spaces in a search term may be protected by double quotes. 可以使用双引号防止搜索关键词中的空格被忽略。 - + Example: Search phrase example 例如: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>:搜索 <b>foo</b> 和 <b>bar</b> - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>:搜索 <b>foo bar</b> - + All plugins 所有插件 - + Only enabled 只针对开启的 - + Select... 选择... - - - + + + Search Engine 搜索引擎 - + Please install Python to use the Search Engine. 请安装 Python 以使用搜索引擎。 - + Empty search pattern 无搜索关键词 - + Please type a search pattern first 请先输入关键词 - + Stop 停止 - + Search has finished 搜索完毕 - + Search has failed 搜索失败 - ShutdownConfirmDialog + ShutdownConfirmDlg - - Don't show again - + + qBittorrent will now exit. + qBittorrent 即将退出。 - - qBittorrent will now exit. - - - - + E&xit Now - + 立即退出 - + Exit confirmation - + 确认退出 - + The computer is going to shutdown. - + 此电脑即将关机。 - + &Shutdown Now - + 立即关机 - - Shutdown confirmation - - - - + The computer is going to enter suspend mode. - + 此电脑即将进入睡眠模式。 - + &Suspend Now - + 立即睡眠 - + Suspend confirmation - + 确认睡眠 - + The computer is going to enter hibernation mode. - + 此电脑即将进入休眠模式。 - + &Hibernate Now - + 立即休眠 - + Hibernate confirmation - + 休眠确认 - + You can cancel the action within %1 seconds. - + 您可以在 %1 秒内取消操作。 + + + + Shutdown confirmation + 确认关机 SpeedLimitDialog - + KiB/s KiB/s @@ -7923,52 +7159,52 @@ SpeedPlotView - + Total Upload 总上传 - + Total Download 总下载 - + Payload Upload 有效负荷上传 - + Payload Download 有效负荷下载 - + Overhead Upload 上传开销 - + Overhead Download 下载开销 - + DHT Upload DHT 上传 - + DHT Download DHT 下载 - + Tracker Upload Tracker 上传 - + Tracker Download Tracker 下载 @@ -7976,95 +7212,87 @@ SpeedWidget - + Period: 周期: - + 1 Minute 1 分钟 - + 5 Minutes 5 分钟 - + 30 Minutes 30 分钟 - + 6 Hours 6 小时 - + Select Graphs 选择图形 - + Total Upload 总上传 - + Total Download 总下载 - + Payload Upload 有效负荷上传 - + Payload Download 有效负荷下载 - + Overhead Upload 上传开销 - + Overhead Download 下载开销 - + DHT Upload DHT 上传 - + DHT Download DHT 下载 - + Tracker Upload Tracker 上传 - + Tracker Download Tracker 下载 - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8077,49 +7305,49 @@ 用户统计 - - Cache statistics - 缓存统计 + + Total peer connections: + 总的线程连接: - - Read cache hits: - 读缓存次数: + + Global ratio: + 全局比率: - - Average time in queue: - 在队列的平均时间: + + Alltime download: + 所有下载: - - Connected peers: - 已连接的用户数: + + Alltime upload: + 所有上传: - - All-time share ratio: - 全局分享率: + + Total waste (this session): + 总的浪费(本次会话): - - All-time download: - 总计下载: + + Cache statistics + 缓存统计 - - Session waste: - 本次会话丢弃数据: + + Read cache hits: + 读缓存次数: - - All-time upload: - 全局上传: + + Average time in queue: + 在队列的平均时间: - Total buffer size: - 总缓冲大小: + Total buffers size: + 总缓冲大小: @@ -8147,7 +7375,12 @@ 总队列大小: - + + OK + 确定 + + + %1 ms 18 milliseconds %1 ms @@ -8156,27 +7389,32 @@ StatusBar - + Connection status: 连接状态: - + No direct connections. This may indicate network configuration problems. 无直接连接。这也许表明网络设置存在问题。 - + DHT: %1 nodes DHT:%1 结点 - - qBittorrent needs to be restarted! - 需要重启 qBittorrent! + + qBittorrent needs to be restarted + 需要重启 qBittorrent + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent 刚刚被更新,需要重启以使更改生效。 @@ -8195,1566 +7433,1311 @@ 联机 - + Click to switch to alternative speed limits 点击以切换到备用速度限制 - + Click to switch to regular speed limits 点击以切换到常规速度限制 - + + Manual change of rate limits mode. The scheduler is disabled. + 手动更改速度限制模式。计划任务被禁用。 + + + Global Download Speed Limit - 全局下载速度限制 + 总下载速度限制 - + Global Upload Speed Limit - 全局上传速度限制 + 总上传速度限制 - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - 全部 (0) + 全部 (0) - + Downloading (0) - + 下载 (0) - + Seeding (0) - + 做种 (0) - + Completed (0) - + 完成 (0) - + Resumed (0) - + 恢复 (0) - + Paused (0) - + 暂停 (0) - + Active (0) - + 活动 (0) - + Inactive (0) - + 非活动 (0) - + Errored (0) - + 错误 (0) - + All (%1) - 全部 (%1) + 全部 (%1) - + Downloading (%1) - + 下载 (%1) - + Seeding (%1) - + 做种 (%1) - + Completed (%1) - + 完成 (%1) - + Paused (%1) - + 暂停 (%1) - + Resumed (%1) - + 恢复 (%1) - + Active (%1) - + 活动 (%1) - + Inactive (%1) - + 非活动 (%1) - + Errored (%1) - + 错误 (%1) - TagFilterModel + TorrentContentModel - - Tags - 标签 + + Name + 名称 - - All - 全部 + + Size + 大小 - - Untagged - 无标签 + + Progress + 进度 - - - TagFilterWidget - - Add tag... - 添加标签... + + Download Priority + 下载优先级 - - Remove tag - 删除标签 + + Remaining + 剩余 + + + TorrentCreatorDlg - - Remove unused tags - 删除未使用的标签 + + Select a folder to add to the torrent + 选择加入 torrent 的文件夹 - - Resume torrents - 继续 torrents + + Select a file to add to the torrent + 选择加入到 torrent 的文件 - - Pause torrents - 暂停 torrents + + No input path set + 未设置输入路径 - - Delete torrents - 删除 torrents + + Please type an input path first + 请先填写输入路径 - - New Tag - 新标签 + + Select destination torrent file + 选择目标 torrent 文件 - - Tag: - 标签: + + Torrent Files (*.torrent) + Torrent 文件 (*.torrent) - - Invalid tag name - 无效标签名 + + Torrent was created successfully: %1 + %1 is the path of the torrent + 成功创建 torrent:%1 - - Tag name '%1' is invalid - 标签名 '%1' 无效 + + + + Torrent creation + 创建 Torrent - - Tag exists - 标签已存在 + + Torrent creation was unsuccessful, reason: %1 + 创建 torrent 失败,原因:%1 - - Tag name already exists. - 标签名已存在。 + + Created torrent file is invalid. It won't be added to download list. + 创建的 torrent 文件无效。它将不会被添加到下载列表中。 - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Torrent 类别属性 + + Name + i.e: torrent name + 名称 - - Name: - 名称: + + Size + i.e: torrent size + 大小 - - Save path: - 保存路径: + + Done + % Done + 已完成 - - Choose save path - 选择保存路径 + + Status + Torrent status (e.g. downloading, seeding, paused) + 状态 - - New Category - 新建类别 + + Seeds + i.e. full sources (often untranslated) + 种子 - - Invalid category name - 无效的类别名称 + + Peers + i.e. partial sources (often untranslated) + 用户 - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - 类别名称不能包含 "\"。 -类别名称不能以 "/" 开头/结尾。 -类别名称不能包含 "//" 序列。 + + Down Speed + i.e: Download speed + 下载速度 - - Category creation error - 类别创建错误 + + Up Speed + i.e: Upload speed + 上传速度 - - Category with the given name already exists. -Please choose a different name and try again. - 具有给定名称的类别已存在。 -请另选一个名称并重试。 + + Ratio + Share ratio + 比率 - - - TorrentContentModel - - Name - 名称 + + ETA + i.e: Estimated Time of Arrival / Time left + 剩余时间 - - Size - 大小 + + Category + 分类 - - Progress - 进度 + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + 添加于 - - Download Priority - 下载优先级 + + Completed On + Torrent was completed on 01/01/2010 08:00 + 完成于 - - Remaining - 剩余 + + Tracker + Tracker - - Availability - 可用性 + + Down Limit + i.e: Download limit + 下载限制 - - - TorrentCreatorDialog - - Torrent Creator - + + Up Limit + i.e: Upload limit + 上传限制 - - Select file/folder to share - + + Downloaded + Amount of data downloaded (e.g. in MB) + 已下载 - - Path: - + + Uploaded + Amount of data uploaded (e.g. in MB) + 已上传 - - [Drag and drop area] - + + Session Download + Amount of data downloaded since program open (e.g. in MB) + 本次会话下载 - - - Select file - + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + 本次会话上传 - - - Select folder - + + Remaining + Amount of data left to download (e.g. in MB) + 剩余 - - Settings - + + Time Active + Time (duration) the torrent is active (not paused) + 有效时间 - - Piece size: - + + Save path + Torrent save path + 保存路径 - - Auto - + + Completed + Amount of data completed (e.g. in MB) + 完成 - - 16 KiB - + + Ratio Limit + Upload share ratio limit + 比率限制 - - 32 KiB - + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + 最后完整可见 - - 64 KiB - + + Last Activity + Time passed since a chunk was downloaded/uploaded + 最后活动 - - 128 KiB - + + Total Size + i.e. Size including unwanted data + 总大小 + + + TrackerFiltersList - - 256 KiB - + + All (0) + this is for the tracker filter + 全部 (0) - - 512 KiB - + + Trackerless (0) + 缺少 tracker (0) - - 1 MiB - + + Error (0) + 错误 (0) - - 2 MiB - - - - - 4 MiB - - - - - 8 MiB - - - - - 16 MiB - - - - - 32 MiB - - - - - Calculate number of pieces: - - - - - Private torrent (Won't distribute on DHT network) - - - - - Start seeding immediately - - - - - Ignore share ratio limits for this torrent - - - - - Optimize alignment - - - - - Fields - - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - - - - Web seed URLs: - - - - - Tracker URLs: - - - - - Comments: - - - - - Source: - - - - - Progress: - 进度: - - - - Create Torrent - - - - - - - Torrent creation failed - - - - - Reason: Path to file/folder is not readable. - - - - - Select where to save the new torrent - + + Warning (0) + 警告 (0) - - Torrent Files (*.torrent) - + + + Trackerless (%1) + 缺少 tracker (%1) - - Reason: %1 - + %1 (%2) + openbittorrent.com (10) + %1 (%2) - - Reason: Created torrent is invalid. It won't be added to download list. - + + + Error (%1) + 错误 (%1) - - Torrent creator - + + + Warning (%1) + 警告 (%1) - - Torrent created: - + + Resume torrents + 恢复 torrents - - - TorrentInfo - - File size exceeds max limit %1 - 文件大小超过最大限制 %1 + + Pause torrents + 暂停 torrents - - Torrent file read error: %1 - + + Delete torrents + 删除 torrents - - Torrent file read error: size mismatch - + + + All (%1) + this is for the tracker filter + 全部 (%1) - TorrentsController - - - Not contacted yet - 未联系 - - - - Updating... - 更新中... - - - - Working - 工作 - + TrackerList - - Not working - 未工作 - - - - Error: '%1' is not a valid torrent file. - 错误:'%1' 不是一个有效的 torrent 文件。 - - - - - - - Torrent queueing must be enabled - 必须打开种子排队 - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - + + URL + URL - - Cannot make save path - + + Status + 状态 - - Cannot write to directory + + Received - - WebUI Set location: moving "%1", from "%2" to "%3" - Web 用户界面设置路径:从 "%2" 移动 "%1" 至 "%3" - - - - Incorrect torrent name - 不正确的种子名称 - - - - - Incorrect category name - 不正确的分类名 - - - - TrackerFiltersList - - - All (0) - this is for the tracker filter - 全部 (0) - - - - Trackerless (0) - 缺少 tracker (0) - - - - Error (0) - 错误 (0) - - - - Warning (0) - 警告 (0) - - - - - Trackerless (%1) - 缺少 tracker (%1) - - - - - Error (%1) - 错误 (%1) - - - - - Warning (%1) - 警告 (%1) - - - - Resume torrents - 继续 torrents + + Seeds + 种子 - - Pause torrents - 暂停 torrents + + Peers + 用户 - - Delete torrents - 删除 torrents + + Downloaded + 已下载 - - - All (%1) - this is for the tracker filter - 全部 (%1) + + Message + 消息 - - - TrackerListWidget - - + + Working - 工作 + 工作 - + Disabled - 禁用 + 禁用 - + This torrent is private - + 此 torrent 是私有的 - + Updating... - 更新中... + 更新中... - + Not working - 未工作 + 未工作 - + Not contacted yet - 未联系 + 未联系 - - - - - - - N/A - N/A + + Tracker URL: + Tracker URL: - + Tracker editing - - - - - Tracker URL: - + 编辑 Tracker - - + + Tracker editing failed - + Tracker 编辑失败 - + The tracker URL entered is invalid. - + 输入的 tracker 是无效的。 - + The tracker URL already exists. - + Tracker 已经存在。 - + Add a new tracker... - + 添加新 tracker... - - Remove tracker - - - - + Copy tracker URL - + 复制 tracker - + Edit selected tracker URL - + 编辑选定的 tracker - + Force reannounce to selected trackers - + 强制向选定的 trackers 重新发布 - + Force reannounce to all trackers - - - - - URL - - - - - Status - 状态 - - - - Received - + 强制向所有 trackers 重新发布 - - Seeds - 做种 - - - - Peers - 用户 - - - - Downloaded - 已下载 - - - - Message - - - - - Column visibility - + + Remove tracker + 移除 tracker - TrackerLoginDialog + TrackersAdditionDlg - - - Tracker authentication - - - - - Tracker: - - - - - Login - 登录 - - - - Username: - 用户名: - - - - Password: - 密码: + + Trackers addition dialog + 添加 trackers 对话窗 - - Log in - 登入 + + List of trackers to add (one per line): + 要添加的 trackers 列表(每行一个): - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + µTorrent 兼容的 URL 列表: - - List of trackers to add (one per line): - + + I/O Error + I/O 错误 - - µTorrent compatible list URL: - + + Error while trying to open the downloaded file. + 打开已下载的文件时出错。 - + No change 无变化 - + No additional trackers were found. - + 未找到其他的 trackers。 - + Download error - 下载出错 + 下载错误 - + The trackers list could not be downloaded, reason: %1 - + 无法下载 trackers 列表,原因:%1 TransferListDelegate - + Downloading 下载 - + Downloading metadata used when loading a magnet link 下载元数据 - + Allocating qBittorrent is allocating the files on disk 调配 - + Paused 暂停 - + Queued i.e. torrent is queued 列队 - + Seeding Torrent is complete and in upload-only mode 做种 - + Stalled Torrent is waiting for download to begin 等待 - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. [F] 下载 - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. [F] 做种 - + Checking Torrent local data is being checked 检查中 - + Queued for checking i.e. torrent is queued for hash checking 排队等待检查 - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. 检查恢复数据 - + Completed 完成 - - Moving - Torrent local data are being moved/relocated - 移动 - - - - Missing Files - 缺失文件 - - - - Errored - torrent status, the torrent has an error - 错误 - - - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - %1 (已做种 %2) - - - - %1 ago - e.g.: 1h 20m ago - %1 前 - - - - TransferListFiltersWidget - - - Status - 状态 - - - - Categories - 分类 - - - - Tags - 标签 - - - - Trackers - Trackers - - - - TransferListModel - - - Name - i.e: torrent name - 名称 - - - - Size - i.e: torrent size - 大小 - - - - Done - % Done - 已完成 - - - - Status - Torrent status (e.g. downloading, seeding, paused) - 状态 - - - - Seeds - i.e. full sources (often untranslated) - 做种 - - - - Peers - i.e. partial sources (often untranslated) - 用户 - - - - Down Speed - i.e: Download speed - 下载速度 - - - - Up Speed - i.e: Upload speed - 上传速度 - - - - Ratio - Share ratio - 倍率 - - - - ETA - i.e: Estimated Time of Arrival / Time left - 剩余时间 - - - - Category - 分类 - - - - Tags - 标签 - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - Tracker - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - 已下载 - - - - Uploaded - Amount of data uploaded (e.g. in MB) - 已上传 - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - 剩余 - - - - Time Active - Time (duration) the torrent is active (not paused) - + + Missing Files + 缺失文件 - - Save path - Torrent save path - + + Errored + torrent status, the torrent has an error + 错误 - - Completed - Amount of data completed (e.g. in MB) - 完成 + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) + %1 (已做种 %2) - - Ratio Limit - Upload share ratio limit - + + %1 ago + e.g.: 1h 20m ago + %1 前 + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + 状态 - - Last Activity - Time passed since a chunk was downloaded/uploaded - + + Categories + 分类 - - Total Size - i.e. Size including unwanted data - + + Trackers + Trackers TransferListWidget - + Column visibility 是否显示列 - + Choose save path 选择保存路径 - + Torrent Download Speed Limiting Torrent 下载速度限制 - + Torrent Upload Speed Limiting Torrent 上传速度限制 - + Recheck confirmation 重新检查确认 - + Are you sure you want to recheck the selected torrent(s)? 你确定要重新检查选定的 torrent(s) 吗? - + Rename 重命名 - + New name: 新名称: - + Resume Resume/start the torrent - 继续 + 重新开始 - + Force Resume Force Resume/start the torrent - 强制继续 + 强制恢复 - + Pause Pause the torrent 暂停 - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - 设置路径:从 "%2" 移动 "%1" 至 "%3" - - - - Add Tags - 添加标签 - - - - Remove All Tags - 删除所有标签 - - - - Remove all tags from selected torrents? - 从选中的 Torrent 中删除所有标签? + + New Category + 新分类 - - Comma-separated tags: - 逗号分隔的标签: + + Category: + 分类: - - Invalid tag - 无效标签 + + Invalid category name + 无效分类名 - - Tag name: '%1' is invalid - 标签名:'%1' 无效 + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + 分类名不能包含 '\'。 +分类名不能以 '/' 开头或结尾。 +分类名不能包含 '//'。 - + Delete Delete the torrent 删除 - + Preview file... 预览文件... - + Limit share ratio... 限制分享率... - + Limit upload rate... 限制上传速度... - + Limit download rate... 限制下载速度... - + Open destination folder 打开目标文件夹 - + Move up i.e. move up in the queue 上移 - + Move down i.e. Move down in the queue 下移 - + Move to top i.e. Move to top of the queue 移至顶部 - + Move to bottom i.e. Move to bottom of the queue 移至底部 - + Set location... 更改保存位置... - - Force reannounce - 强制重新发布 - - - + Copy name 复制文件名 - - Copy hash - 复制哈希值 - - - + Download first and last pieces first 先下载首尾段 - + Automatic Torrent Management 自动 Torrent 管理 - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category 自动模式表示不同的 torrent 的配置信息(例如保存路径)将由相关的分类决定 - + Category 分类 - + New... New category... 新分类... - + Reset Reset category 重置 - - Tags - 标签 - - - - Add... - Add / assign multiple tags... - 添加... - - - - Remove All - Remove all tags - 删除全部 - - - + Priority 优先 - + Force recheck 强制再次核对 - + Copy magnet link 复制磁力链接 - + Super seeding mode 超级做种模式 - + Rename... 重命名... - + Download in sequential order 以连续顺序下载 - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + Torrent 上传/下载率限制 - - Use global share limit - + + Use global ratio limit + 使用总比率限制 - - - + + + buttonGroup - + 按键组 - - Set no share limit - + + Set no ratio limit + 不设比率限制 - - Set share limit to - + + Set ratio limit to + 设比率限制为 + + + + WebApplication + + + Incorrect category name + 错误分类名 + + + WebUI - - ratio - 倍率 + + The Web UI is listening on port %1 + 网页端正在监听 %1 端口 - - minutes - 分钟 + + Web UI Error - Unable to bind Web UI to port %1 + 网页端错误 - 无法绑定网页端至端口 %1 + + + + about + + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + 一个使用 C++ 编写的基于 Qt toolkit 和 libtorrent-rasterbar 的高级 BitTorrent 客户端 + + + + Copyright %1 2006-2016 The qBittorrent project + Copyright %1 2006-2016 The qBittorrent project + + + + Home Page: + 主页: - - No share limit method selected - 没有选择共享限制方式 + + Forum: + 论坛: - - Please select a limit method first - 请先选择一个限制方式 + + Bug Tracker: + Bug 跟踪: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - 检测到Python,版本:%1 + + Add Peers + 添加多个用户 - - Python not detected - 没有检测到Python + + List of peers to add (one per line): + 要添加的用户列表(每行一个): + + + + Format: IPv4:port / [IPv6]:port + 格式:IPv4:端口 / [IPv6]:端口 - WebApplication + authentication - - Unacceptable file type, only regular file is allowed. - 不可接受的文件类型, 只允许使用常规文件。 + + + Tracker authentication + Tracker 验证 - - Symlinks inside alternative UI folder are forbidden. - 备用 UI 目录中不允许使用符号链接。 + + Tracker: + Tracker: - - Exceeded the maximum allowed file size (%1)! - 超出允许的最大文件大小 (%1)! + + Login + 登录 - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - WebUI:源标头和目标源不匹配!源IP: '%1'. 源标头: '%2'. 目标源: '%3' + + Username: + 用户名: - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - WebUI:引用标头和目标源不匹配!源IP: '%1'.引用标头: '%2'. 目标源: '%3' + + Password: + 密码: - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - WebUI:无效的主机标头,端口不匹配。请求的源 IP: '%1'. 服务器端口: '%2'. 收到的主机标头: '%3' + + Log in + 登入 - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - WebUI:无效的主机标头。请求的源IP: '%1'.收到的主机标头: '%2' + + Cancel + 取消 - WebUI + confirmDeletionDlg + + + Deletion confirmation - qBittorrent + 确认删除 - qBttorrent + + + + Remember choice + 记住选择 + + + + Also delete the files on the hard disk + 同时从硬盘上删除文件 + + + + confirmShutdownDlg + + + Don't show again + 不再显示 + + + + createTorrentDialog + + + Cancel + 取消 + + + + Torrent Creation Tool + Torrent 创建工具 + + + + Torrent file creation + 创建 Torrent 文件 + + + + Add file + 添加文件 + + + + Add folder + 添加文件夹 + + + + File or folder to add to the torrent: + 加入 torrent 的文件或文件夹: + + + + Tracker URLs: + Tracker 网址: + + + + Web seeds urls: + 网页种子网址: + + + + Comment: + 注释: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + 你可以用一个空行分隔 tracker 优先级 / 组。 + + + + Piece size: + 文件块大小: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + - - Web UI: HTTPS setup successful - Web 用户界面:HTTPS 设置成功 + + Auto + 自动 + + + + Private (won't be distributed on DHT network if enabled) + 私人(启用后将不共享到 DHT 网络中) + + + + Start seeding after creation + 创建后开始做种 + + + + Ignore share ratio limits for this torrent + 忽略这个 torrent 的分享比例限制 + + + + Create and save... + 创建并保存... + + + + Progress: + 进度: + + + + downloadFromURL + + + Add torrent links + 添加 torrent 链接 + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + 每行一个(支持 HTTP 链接,磁力链接和哈希值) + + + + Download + 下载 + + + + Cancel + 取消 + + + + Download from urls + 从 URL 下载 - - Web UI: HTTPS setup failed, fallback to HTTP - Web 用户界面:HTTPS 设置失败,转用 HTTP + + No URL entered + 未输入 URL - - Web UI: Now listening on IP: %1, port: %2 - Web UI: 正在侦听 IP: %1,端口: %2 + + Please type at least one URL. + 请输入至少一个 URL。 + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Web UI: 无法绑定到 IP: % 1, 端口: %2。原因: %3 + + Crash info + 崩溃信息 fsutils - + + + + + Downloads 下载 @@ -9762,100 +8745,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + 未检测到 Python + + + + Python version: %1 + Python 版本号:%1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1 小时 %2 分钟 - + %1d %2h e.g: 2days 10hours %1 天 %2 小时 - + Unknown Unknown (size) 未知 - + qBittorrent will shutdown the computer now because all downloads are complete. 所有下载已完成,qBittorrent 将关闭电脑。 - + < 1m < 1 minute < 1 分钟 - + %1m e.g: 10minutes %1 分钟 + + + Working + 工作中 + + + + Updating... + 更新中... + + + + Not working + 不工作 + + + + Not contacted yet + 未联系 + preview - + Preview selection 选择要预览的文件 - + The following files support previewing, please select one of them: 下列文件支持预览,请选择其中之一: + + + Preview + 预览 + + + + Cancel + 取消 + diff -Nru qbittorrent-4.1.3/src/lang/qbittorrent_zh_TW.ts qbittorrent-3.3.15/src/lang/qbittorrent_zh_TW.ts --- qbittorrent-4.1.3/src/lang/qbittorrent_zh_TW.ts 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/lang/qbittorrent_zh_TW.ts 2017-08-03 20:30:10.000000000 +0000 @@ -1,110 +1,85 @@ - + - AboutDialog + AboutDlg - + About qBittorrent 關於 qBittorrent - + About 關於 - + Author 作者 - - Current maintainer - 目前的維護者 - - - - Greece - 希臘 - - - - + + Nationality: 國籍: - - + + + Name: + 姓名: + + + + E-mail: - + 電子郵件: - - - Name: - 名稱: + + Greece + 希臘 - - Original author - + + Current maintainer + 目前的維護者 - - France - 法國 + + Original author + 原始作者 - + Special Thanks 特別感謝 - + Translators 翻譯者 - - License - 授權 - - - + Libraries 函式庫 - + qBittorrent was built with the following libraries: - qBittorrent 使用以下函式庫建構: - - - - An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. - 一個以 C++ 撰寫,基於 Qt 和 libtorrent-rasterbar 功能的 BitTorrent 延伸用戶端。 - - - - Copyright %1 2006-2018 The qBittorrent project - Copyright %1 2006-2018 The qBittorrent project - - - - Home Page: - 首頁: + qBittorrent 是使用下列函式庫建構: - - Forum: - 論壇: + + France + 法國 - - Bug Tracker: - Bug 回報: + + License + 授權 @@ -115,57 +90,67 @@ 儲存至 - + + Browse... + 瀏覽… + + + + Set as default save path + 設為預設儲存路徑 + + + Never show again 不要再顯示 - + Torrent settings Torrent 設定 - + Set as default category 設為預設分類 - + Category: 分類: - + Start torrent 開始 torrent - + Torrent information Torrent 資訊 - + Skip hash check 跳過雜湊值檢查 - + Size: 大小: - + Hash: 雜湊值: - + Comment: 註解: - + Date: 日期: @@ -190,117 +175,89 @@ 自動 - - Remember last used save path - 記住最後一次使用的儲存路徑 - - - + When checked, the .torrent file will not be deleted despite the settings at the "Download" page of the options dialog 當勾選時,.torrent 檔案將不會在選項對話框中的「下載」頁面中被刪除。 - + Do not delete .torrent file 不要刪除 .torrent 檔案 - - Create subfolder - 建立子資料夾 - - - - Download in sequential order - 依順序下載 - - - - Download first and last pieces first - 先下載第一和最後一塊 - - - + Normal 一般 - + High - + Maximum 最高 - + Do not download 不要下載 - - - + + + I/O Error I/O 錯誤 - + Invalid torrent 無效的 torrent - - Renaming - 正在重新命名 - - - - - Rename error - 重新命名錯誤 + + + + + Already in download list + 已經在下載清單裡了。 - - The name is empty or contains forbidden characters, please choose a different one. - 檔案名稱為空或是包含禁止使用之字元,請選擇其他名稱。 - - - + Not Available This comment is unavailable 不可用 - + Not Available This date is unavailable 不可用 - + Not available 不可得 - + Invalid magnet link - 無效的磁力連結 + 無效的磁性連結 - + The torrent file '%1' does not exist. torrent 檔案「%1」不存在。 - + The torrent file '%1' cannot be read from the disk. Probably you don't have enough permissions. 無法從硬碟中讀取 torrent 檔案「%1」。您可能沒有足夠的權限。 - + Failed to load the torrent: %1. Error: %2 Don't remove the ' @@ -309,115 +266,128 @@ 錯誤:%2 - + + + Torrent is already in download list. Trackers weren't merged because it is a private torrent. + Torrent 已經在下載清單裡了。追蹤者不會被合併,因為它是一個私人的 torrent。 + + + + Torrent is already in download list. Trackers were merged. + Torrent 已經在下載清單裡了。追蹤者已被合併。 + + + + + Cannot add torrent + 無法加入 torrent + + + + Cannot add this torrent. Perhaps it is already in adding state. + 無法加入此 torrent。也許它已經在正在加入的狀態了。 + + + This magnet link was not recognized - 無法辨識此磁力連結 + 無法辨識此磁性連結 + + + + Magnet link is already in download list. Trackers were merged. + 磁性連結已經在下載清單裡了。追蹤者已被合併。 + + + + Cannot add this torrent. Perhaps it is already in adding. + 無法加入此 torrent。也許它已經加入了。 - + Magnet link - 磁力連結 + 磁性連結 - + Retrieving metadata... 檢索中介資料… - + Not Available This size is unavailable. 不可用 - + Free space on disk: %1 硬碟上的可用空間:%1 - + + Choose save path 選擇儲存路徑 - - - - - - - Torrent is already present - - - - - - Torrent '%1' is already in the transfer list. Trackers haven't been merged because it is a private torrent. - - - - - Torrent '%1' is already in the transfer list. Trackers have been merged. - - - - - Torrent is already queued for processing. - + + Rename the file + 重新命名檔案 - - Magnet link '%1' is already in the transfer list. Trackers have been merged. - + + New name: + 新名稱: - - Magnet link is already queued for processing. - + + + The file could not be renamed + 檔案無法重新命名 - - New name: - 新名稱: + + This file name contains forbidden characters, please choose a different one. + 檔案名稱包含禁止使用之字元,請選擇其他名稱。 - - + + This name is already in use in this folder. Please use a different name. 此名稱已在此資料夾中使用。請選擇另一個名稱。 - + The folder could not be renamed 此資料夾無法被重新命名 - + Rename... 重新命名… - + Priority 優先度 - + Invalid metadata 無效的中介資料 - + Parsing metadata... 解析中介資料… - + Metadata retrieval complete 中介資料檢索完成 - + Download Error 下載錯誤 @@ -425,312 +395,198 @@ AdvancedSettings - + + Disk write cache size + 硬碟寫入快取大小 + + + MiB MiB - + Outgoing ports (Min) [0: Disabled] 連出埠 (最小) [0:停用] - + Outgoing ports (Max) [0: Disabled] 連出埠 (最大) [0:停用] - + Recheck torrents on completion 完成後重新檢查 torrent - + Transfer list refresh interval 傳輸清單更新間隔 - + ms milliseconds ms - + Setting 設定 - + Value Value set for this setting - - - (disabled) - (已停用) - - - + (auto) (自動) - - min - minutes - 分鐘 - - - + All addresses - 所有位址 + 所有位置 - + qBittorrent Section qBittorrent 小節 - - + + Open documentation 開啟文件 - + libtorrent Section libtorrent 小節 - - Asynchronous I/O threads - - - - - Disk cache - 磁碟快取 - - - + s seconds s - + Disk cache expiry interval 硬碟快取到期區間 - + Enable OS cache 啟用作業系統快取 - - Guided read cache - 引導讀取快取 - - - - Coalesce reads & writes - 合併讀取與寫入 - - - - Send upload piece suggestions - 傳送上傳分塊建議 - - - - - KiB - KiB - - - - Send buffer watermark - 傳送緩衝浮水印 - - - - Send buffer low watermark - 傳送緩衝低浮水印 - - - - Send buffer watermark factor - 傳送緩衝浮水印因子 - - - - Prefer TCP - 偏好 TCP - - - - Peer proportional (throttles TCP) - 下載者比例(TCP 節流) - - - - Allow multiple connections from the same IP address - 允許從同一個 IP 位置而來的多重連線 + + m + minutes + m - + Resolve peer countries (GeoIP) 解析下載者的國家 (GeoIP) - + Resolve peer host names 解析下載者的主機名 - + Strict super seeding 嚴格超級種子 - + Network Interface (requires restart) 網路介面 (需要重新啟動) - + Optional IP Address to bind to (requires restart) 可選擇性綁定至 IP 位置 (必須重新啟動) - + Listen on IPv6 address (requires restart) 監聽 IPv6 位置 (需要重新啟動) - + Display notifications 顯示通知 - + Display notifications for added torrents 顯示已加入的 torrents 的通知 - + Download tracker's favicon 下載追蹤者的 favicon - - Save path history length - 儲存路徑歷史長度 - - - - Fixed slots - 固定通道 - - - - Upload rate based - 上傳速率基於 - - - - Upload slots behavior - 上傳通道行為 - - - - Round-robin - 循環 - - - - Fastest upload - 上傳最快 - - - - Anti-leech - 反吸血 - - - - Upload choking algorithm - 上傳 choking 演算法 - - - + Confirm torrent recheck Torrent 重新檢查確認 - - Confirm removal of all tags - 確認移除所有標籤 - - - - Always announce to all trackers in a tier - 總是在一個層級中發佈到所有的 tracker + Exchange trackers with other peers + 和其他下載者交換追蹤者 - - Always announce to all tiers - 總是發佈到所有層級 + + Always announce to all trackers + 總是發佈到全部的追蹤者 - + Any interface i.e. Any network interface 任何介面 - + Save resume data interval How often the fastresume file is saved. - 儲存復原資料區間 + 儲存恢復資料區間 - - %1-TCP mixed mode algorithm - uTP-TCP mixed mode algorithm - %1-TCP 混合模式演算法 - - - + Maximum number of half-open connections [0: Unlimited] 最大半開啟連線數 [0:無限制] - + IP Address to report to trackers (requires restart) 回報至追蹤者的 IP 位置 (需要重新啟動) - + Enable embedded tracker 啟用嵌入追蹤者 - + Embedded tracker port 嵌入追蹤者埠 - + Check for software updates 檢查軟體更新 - + Use system icon theme 使用系統圖示佈景 @@ -738,120 +594,61 @@ Application - + qBittorrent %1 started qBittorrent v3.2.0alpha started qBittorrent %1 已啟動 - + Torrent: %1, running external program, command: %2 Torrent:%1,正在執行外部程式,命令:%2 - - Torrent name: %1 - Torrent 名稱:%1 - - - - Torrent size: %1 - Torrent 大小:%1 - - - - Save path: %1 - 儲存路徑:%1 - - - - The torrent was downloaded in %1. - The torrent was downloaded in 1 hour and 20 seconds - Torrent 已於 %1 下載完成。 - - - - Thank you for using qBittorrent. - 感謝您使用 qBittorrent。 - - - - [qBittorrent] '%1' has finished downloading - [qBittorrent] 「%1」已下載完成 + + Torrent: %1, run external program command too long (length > %2), execution failed. + Torrent:%1,執行外部程式命令過長 (長度 > %2),執行失敗。 - + Torrent: %1, sending mail notification Torrent:%1,正在傳送郵件通知 - + Information 資訊 - - To control qBittorrent, access the Web UI at %1 - 要控制 qBittorrent,從 %1 存取 Web UI + + To control qBittorrent, access the Web UI at http://localhost:%1 + 要控制 qBittorrent,從 http://localhost:%1 存取 Web UI - + The Web UI administrator user name is: %1 Web UI 管理者名稱是:%1 - + The Web UI administrator password is still the default one: %1 Web UI 管理者密碼仍是預設的:%1 - + This is a security risk, please consider changing your password from program preferences. 這有安全性風險,請考慮從程式偏好設定更改您的密碼。 - + Saving torrent progress... 正在儲存 torrent 進度… - - - Portable mode and explicit profile directory options are mutually exclusive - 可攜式模式與明確的設定檔目錄選項是互斥的 - - - - Portable mode implies relative fastresume - 可攜式模式通常意味著啟動相對快速 - - - - AuthController - - - WebAPI login failure. Reason: IP has been banned, IP: %1, username: %2 - - - - - Your IP address has been banned after too many failed authentication attempts. - 經過多次授權要求失敗之後,您的 IP 已經被封鎖了。 - - - - WebAPI login success. IP: %1 - - - - - WebAPI login failure. Reason: invalid credentials, attempt count: %1, IP: %2, username: %3 - - AutomatedRssDownloader - + Save to: 儲存至: @@ -861,837 +658,700 @@ RSS 下載器 - - Auto downloading of RSS torrents is disabled now! You can enable it in application settings. - RSS 種子的自動下載現在已停用!您可以在應用程式設定中啟用它。 + + Enable Automated RSS Downloader + 啟用自動 RSS 下載器 - + Download Rules 下載原則 - + Rule Definition 原則定義 - + Use Regular Expressions 使用正規表示式 - - Smart Episode Filter will check the episode number to prevent downloading of duplicates. -Supports the formats: S01E01, 1x1, 2017.01.01 and 01.01.2017 (Date formats also support - as a separator) - 智慧型章節過濾器將會檢查章節名稱以避免重複下載。 -支援的格式:S01E01, 1x1, 2017.01.01 與 01.01.2017(日期格式也支援使用 - 作為分隔符號) - - - - Use Smart Episode Filter - 使用智慧型章節過濾器 - - - + Must Contain: 必須包含: - + Must Not Contain: 必須不包含: - + Episode Filter: 分集過濾器: - + Assign Category: 指派分類: - + Save to a Different Directory 儲存到不同的目錄 - + Ignore Subsequent Matches for (0 to Disable) ... X days 忽略後來的符合項目 (設為 0 以停用) - + Disabled - 已停用 + 已停用 - + days - + Add Paused: 加入已暫停的: - + Use global settings 使用全域設定 - + Always 總是 - + Never 永不 - + Apply Rule to Feeds: 套用原則到 feed: - + Matching RSS Articles 配對 RSS 文章 - + &Import... 匯入… (&I) - + &Export... 匯出… (&E) - + Matches articles based on episode filter. 基於分集過濾器的符合文章。 - + Example: 範例: - + will match 2, 5, 8 through 15, 30 and onward episodes of season one example X will match 符合第1季的第 2、第 5、第 8 到 15,以及第 30 集和之後集數 - + Episode filter rules: 分集過濾器原則: - + Season number is a mandatory non-zero value 季的數字為一強制非零的值 - + Episode number is a mandatory non-zero value + 分集的數字為一強制非零的值 + + + Filter must end with semicolon 過濾器必須以分號作結尾 - + Three range types for episodes are supported: 支援三種範圍類型的過濾器: - + Single number: <b>1x25;</b> matches episode 25 of season one 單一數字:<b>1x25;</b> 表示第 1 季的第 25 集 - + Normal range: <b>1x25-40;</b> matches episodes 25 through 40 of season one 一般範圍:<b>1x25-40;</b> 表示第 1 季的第 25 到 40 集 - - Episode number is a mandatory positive value - 片段的數字為一強制正值 - - - - Rules - 規則 + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one + 無限範圍:<b>1x25-;</b> 表示第 1 季的第 25 集和之後集數 - - Rules (legacy) - 規則(舊版) + + Episode number is a mandatory positive value + - + Infinite range: <b>1x25-;</b> matches episodes 25 and upward of season one, and all episodes of later seasons - 無限範圍: <b>1x25-;</b> 符合最活躍的一個中的片段25及以上,以及後面集數的所有片段 + - + Last Match: %1 days ago 最後符合:%1 天前 - + Last Match: Unknown 最後符合:未知 - + New rule name 新原則名稱 - + Please type the name of the new download rule. 請輸入新下載原則的名稱。 - - + + Rule name conflict 原則名稱衝突 - - + + A rule with this name already exists, please choose another name. 此原則名稱已存在,請選擇另一個名稱。 - + Are you sure you want to remove the download rule named '%1'? 您確定要移除已下載的原則「%1」嗎? - + Are you sure you want to remove the selected download rules? 您確定要移除所選的下載原則嗎? - + Rule deletion confirmation 原則刪除確認 - + Destination directory 目的地目錄 - + Invalid action - 無效的動作 + 無效的行動 - + The list is empty, there is nothing to export. - 這個清單是空的,沒有東西可以匯出。 + 清單是空白的,不會匯出任何東西。 - - Export RSS rules - 匯出 RSS 規則 + + Where would you like to save the list? + 您想要將清單儲存到哪裡? - - + + Rules list (*.rssrules) + 原則清單 (*.rssrules) + + + I/O Error I/O 錯誤 - - Failed to create the destination file. Reason: %1 - 建立目標檔案失敗。理由:%1 + + Failed to create the destination file + 無法建立目的檔案 - - Import RSS rules - 匯入 RSS 規則 + + Please point to the RSS download rules file + 請指定 RSS 下載原則檔案 - - Failed to open the file. Reason: %1 - 開啟檔案失敗。理由:%1 + + Rules list + 原則清單 - + Import Error 匯入錯誤 - - Failed to import the selected rules file. Reason: %1 - 匯入選定的規則檔案失敗。理由:%1 + + Failed to import the selected rules file + 匯入選擇的原則檔案失敗 - + Add new rule... 增加新原則… - + Delete rule 刪除原則 - + Rename rule... 重新命名原則… - + Delete selected rules 刪除所選的原則 - - Clear downloaded episodes... - 清除已下載的章節…… - - - + Rule renaming 重新命名原則 - + Please type the new rule name 請輸入新原則檔案的名稱 - - Clear downloaded episodes - 清除已下載的章節 - - - - Are you sure you want to clear the list of downloaded episodes for the selected rule? - 您確定您要清除選定規則的已下載章節清單嗎? - - - - Regex mode: use Perl-compatible regular expressions - 正規表示法模式:使用相容於 Perl 的正規表示法 - - - - - Position %1: %2 - 位置 %1:%2 + + Regex mode: use Perl-like regular expressions + 正規表示法模式:使用類 Perl 的正規表示法 - + Wildcard mode: you can use - 萬用字元模式:您可以使用 + - + ? to match any single character - ? 可配對為任何單一字元 + - + * to match zero or more of any characters - * 可配對為零個或更多個任意字元 + - + Whitespaces count as AND operators (all words, any order) - 空格會以 AND 運算子來計算(所有文字、任意順序) + - + | is used as OR operator - | 則作為 OR 運算子使用 + - + If word order is important use * instead of whitespace. - 若文字順序很重要請使用 * 而非空格。 + - + An expression with an empty %1 clause (e.g. %2) We talk about regex/wildcards in the RSS filters section here. So a valid sentence would be: An expression with an empty | clause (e.g. expr|) - 帶有空 %1 子句的表達式 (例如 %2) + - + will match all articles. - 將會配對所有文章。 + - + will exclude all articles. - 將會排除所有文章。 + - - - BanListOptionsDialog - - List of banned IP addresses - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>Whitespaces count as AND operators</li></ul> + 萬用字元模式:您可以使用<ul><li>? 來配對任何單一字元</li><li>* 來配對零或多個字元</li><li>空白視為「AND」運算子</li></ul> - - Ban IP - + Wildcard mode: you can use<ul><li>? to match any single character</li><li>* to match zero or more of any characters</li><li>| is used as OR operator</li></ul> + 萬用字元模式:您可以使用<ul><li>? 來配對任何單一字元</li><li>* 來配對零或多個字元</li><li>| 視為「OR」運算子</li></ul> + + + BitTorrent::Session - - Delete - 刪除 + + Restart is required to toggle PeX support + 切換 PeX 支援狀態須重新啟動 - - - Warning - - - - - The entered IP address is invalid. - - - - - The entered IP is already banned. - - - - - BitTorrent::Session - - - Restart is required to toggle PeX support - 切換 PeX 支援狀態須重新啟動 - - - - Could not get GUID of configured network interface. Binding to IP %1 - 無法取得已設定網路介面的 GUID。綁紮至 IP %1 - - - + Embedded Tracker [ON] 嵌入式追蹤者 [開啟] - + Failed to start the embedded tracker! 無法開始嵌入追蹤者! - + Embedded Tracker [OFF] 嵌入式追蹤者 [關閉] - + + '%1' reached the maximum ratio you set. Removing... + 「%1」已經到達您設定的最大比率了。正在移除… + + + + '%1' reached the maximum ratio you set. Pausing... + 「%1」已經到達您設定的最大比率了。正在暫停… + + + System network status changed to %1 e.g: System network status changed to ONLINE 系統的網路狀態變更為 %1 - + ONLINE 上線 - + OFFLINE 離線 - + Network configuration of %1 has changed, refreshing session binding e.g: Network configuration of tun0 has changed, refreshing session binding %1 的網路設定已變更,正在重新整理工作階段綁紮 - + Configured network interface address %1 isn't valid. Configured network interface address 124.5.1568.1 isn't valid. 已設定的網路介面位置 %1 無效。 - - + Encryption support [%1] 加密支援 [%1] - - + FORCED 強制 - - %1 is not a valid IP address and was rejected while applying the list of banned addresses. - %1 不是有效的 IP 位址,其在套用已封鎖位址的清單時被退回。 - - - - + Anonymous mode [%1] 匿名模式 [%1] - + Unable to decode '%1' torrent file. 無法解碼 torrent 檔案「%1」。 - + Recursive download of file '%1' embedded in torrent '%2' Recursive download of 'test.torrent' embedded in torrent 'test2' 遞迴下載在 torrent「%2」裡的檔案「%1」 - + Queue positions were corrected in %1 resume files - 佇列位置將會在 %1 個復原的檔案中校正位置 + - + Couldn't save '%1.torrent' 無法儲存「%1.torrent」 - - '%1' was removed from the transfer list. - 'xxx.avi' was removed... - '%1' 已從傳輸清單中移除。 - - - - '%1' was removed from the transfer list and hard disk. - 'xxx.avi' was removed... - '%1' 已從傳輸清單與硬碟中移除。 - - - - '%1' was removed from the transfer list but the files couldn't be deleted. Error: %2 - 'xxx.avi' was removed... - '%1' 已從傳輸清單中移除,但檔案無法刪除。錯誤:%2 - - - + because %1 is disabled. this peer was blocked because uTP is disabled. 因為 %1 已停用。 - + because %1 is disabled. this peer was blocked because TCP is disabled. 因為 %1 已停用。 - + URL seed lookup failed for URL: '%1', message: %2 找不到 URL:「%1」的 URL 種子,訊息:「%2」 - + qBittorrent failed listening on interface %1 port: %2/%3. Reason: %4. e.g: qBittorrent failed listening on interface 192.168.0.1 port: TCP/6881. Reason: already in use. qBittorrent 監聽介面 %1 的埠:%2/%3 失敗。理由:%4。 - + + '%1' was removed from transfer list and hard disk. + 'xxx.avi' was removed... + 「%1」已經從傳輸清單和硬碟中刪除了。 + + + + '%1' was removed from transfer list. + 'xxx.avi' was removed... + 「%1」已經從傳輸清單中刪除了。 + + + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... 下載「%1」中,請稍候… - - + + qBittorrent is trying to listen on any interface port: %1 e.g: qBittorrent is trying to listen on any interface port: TCP/6881 qBittorrent 正在嘗試監聽任何的介面埠:%1 - + The network interface defined is invalid: %1 定義的網路介面是無效的:%1 - - + + qBittorrent is trying to listen on interface %1 port: %2 e.g: qBittorrent is trying to listen on interface 192.168.0.1 port: TCP/6881 qBittorrent 正在嘗試監聽介面 %1 的埠: %2 - - Peer ID: - 下載者 ID: - - - - HTTP User-Agent is '%1' - HTTP 使用者代理為「%1」 - - - - + DHT support [%1] DHT 支援 [%1] - - - - - - - - - + + + + ON 開啟 - - - - - - - - - + + + + OFF 關閉 - - + Local Peer Discovery support [%1] 本地下載者搜尋支援 [%1] - - PeX support [%1] - PeX 支援 [%1] - - - - '%1' reached the maximum ratio you set. Removed. - 「%1」已經到達您設定的最大比率了。已移除。 - - - - '%1' reached the maximum ratio you set. Paused. - 「%1」已經到達您設定的最大比率了。已暫停。 + Restart is required to toggle Tracker Exchange support + 切換追蹤者交換支援需要重新啟動 - - '%1' reached the maximum seeding time you set. Removed. - 「%1」已經到達您設定的最大傳送時間了。已移除。 - - - - '%1' reached the maximum seeding time you set. Paused. - 「%1」已經到達您設定的最大傳送時間了。已暫停。 - - - + qBittorrent didn't find an %1 local address to listen on qBittorrent didn't find an IPv4 local address to listen on qBittorrent 找不到供監聽的 %1 本機位置 - + qBittorrent failed to listen on any interface port: %1. Reason: %2. e.g: qBittorrent failed to listen on any interface port: TCP/6881. Reason: no such interface qBittorrent 監聽任意介面埠失敗:%1 。理由:%2。 - + Tracker '%1' was added to torrent '%2' 追蹤者「%1」已加入到 torrent「%2」中 - + Tracker '%1' was deleted from torrent '%2' 追蹤者「%1」已被從 torrent「%2」中刪除 - + URL seed '%1' was added to torrent '%2' URL 種子「%1」已加入到 torrent「%2」中 - + URL seed '%1' was removed from torrent '%2' URL 種子「%1」已被從 torrent「%2」中刪除 - + Unable to resume torrent '%1'. e.g: Unable to resume torrent 'hash'. 無法復原 torrent 檔案:「%1」 - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number 分析 IP 過濾檔案成功:已套用 %1 個規則。 - + Error: Failed to parse the provided IP filter. 錯誤:IP 過濾檔案分析失敗。 - - '%1' restored. - 'torrent name' restored. - - - - + Couldn't add torrent. Reason: %1 無法加入 torrent。理由:%1 - + + '%1' resumed. (fast resume) + 'torrent name' was resumed. (fast resume) + 「%1」已恢復下載。(快速恢復) + + + '%1' added to download list. 'torrent name' was added to download list. 「%1」已增加到下載清單。 - + An I/O error occurred, '%1' paused. %2 發生 I/O 錯誤,「%1」已暫停。%2 - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP:埠映射失敗,訊息:%1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP:埠映射成功,訊息:%1 - + due to IP filter. this peer was blocked due to ip filter. 由於 IP 過濾器。 - + due to port filter. this peer was blocked due to port filter. 由於埠過濾器。 - + due to i2p mixed mode restrictions. this peer was blocked due to i2p mixed mode restrictions. 由於 i2p 混合模式限制。 - + because it has a low port. this peer was blocked because it has a low port. 因為它有著較低的埠。 - + qBittorrent is successfully listening on interface %1 port: %2/%3 e.g: qBittorrent is successfully listening on interface 192.168.0.1 port: TCP/6881 qBittorrent 成功監聽介面 %1 的埠:%2/%3 - + External IP: %1 e.g. External IP: 192.168.0.1 外部 IP:%1 - BitTorrent::TorrentCreatorThread - - - create new torrent file failed - 建立新 torrent 檔案失敗 - - - BitTorrent::TorrentHandle - - Download first and last piece first: %1, torrent: '%2' - 先下載第一及最後一塊:%1,torrent:「%2」 - - - - On - 開啟 - - - - Off - 關閉 - - - - Successfully moved torrent: %1. New path: %2 - 成功移動 torrent:%1。新路徑:%2 - - - + Could not move torrent: '%1'. Reason: %2 - 無法移動 torrent:「%1」。理由:%2 + 無法移動 torrent:%1。理由:%2 - + File sizes mismatch for torrent '%1', pausing it. - Torrent「%1」檔案大小不符合,暫停。 + 檔案大小和 torrent「%1」不符合,暫停。 - + Fast resume data was rejected for torrent '%1'. Reason: %2. Checking again... - 快速復原資料被 torrent「%1」拒絕。理由:%2。再次檢查…… + 快速恢復 torrent「%1」資料被拒絕,理由:「%2」。正在重新檢查… CategoryFilterModel - + Categories - 分類 + 分類 - + All - 所有 + 全部 - + Uncategorized - 未分類 + @@ -1699,42 +1359,147 @@ Add category... - 新增分類… + 新增分類… Add subcategory... - 新增子分類… + - Edit category... - 編輯分類... + Remove category + 移除分類 + + + + Remove unused categories + 移除未使用的分類 + + + + Resume torrents + 繼續 torrent + + + + Pause torrents + 暫停 torrent + + + + Delete torrents + 刪除 torrent + + + + New Category + 新分類 + + + + Category: + 分類: + + + + Invalid category name + 無效的分類名稱 + + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + 分類名稱不應該包含「\」。 +分類名稱不應該以「/」開頭或結尾。 +分類名稱不應該包含「//」序列。 + + + + + Category exists + + + + + Category name already exists. + + + + + Subcategory name already exists in selected category. + + + + + CategoryFiltersList + + All (0) + this is for the category filter + 全部 (0) + + + Uncategorized (0) + 未分類 (0) + + + %1 (%2) + category_name (10) + %1 (%2) + + + Uncategorized (%1) + 未分類 (%1) + + + Add category... + 新增分類… - Remove category - 移除分類 + 移除分類 - Remove unused categories - 移除未使用的分類 + 移除未使用的分類 - Resume torrents - 繼續 torrent + 繼續 torrent - Pause torrents - 暫停 torrent + 暫停 torrent - Delete torrents - 刪除 torrent + 刪除 torrent + + + New Category + 新分類 + + + Category: + 分類: + + + Invalid category name + 無效的分類名稱 + + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + 分類名稱不應該包含「\」。 +分類名稱不應該以「/」開頭或結尾。 +分類名稱不應該包含「//」序列。 + + + All (%1) + this is for the category filter + 全部 (%1) @@ -1774,220 +1539,101 @@ - DeletionConfirmationDialog - - - Deletion confirmation - 確認刪除 - - - - Remember choice - - - - - Also delete the files on the hard disk - - + DeletionConfirmationDlg - + Are you sure you want to delete '%1' from the transfer list? Are you sure you want to delete 'ubuntu-linux-iso' from the transfer list? - + 確定要從傳輸列表刪除「%1」? - + Are you sure you want to delete these %1 torrents from the transfer list? Are you sure you want to delete these 5 torrents from the transfer list? - - - - - DownloadFromURLDialog - - - Download from URLs - - - - - Add torrent links - - - - - One link per line (HTTP links, Magnet links and info-hashes are supported) - - - - - Download - 下載 - - - - No URL entered - - - - - Please type at least one URL. - + 您確定要刪除在傳輸清單中的這 %1 個 torrents 嗎? DownloadedPiecesBar - + White: Missing pieces 白色:遺失的部份 - + Green: Partial pieces 綠色:未完成的部份 - + Blue: Completed pieces 藍色:已完成的部份 - ExecutionLogWidget + ExecutionLog - + General - 一般 + 一般 - + Blocked IPs - + 被封鎖的 IP - + <font color='red'>%1</font> was blocked %2 x.y.z.w was blocked - + <font color='red'>%1</font> 被 %2 阻擋 - + <font color='red'>%1</font> was banned x.y.z.w was banned - + <font color='red'>%1</font> 被禁止 FeedListWidget - + RSS feeds RSS feeds - - - Unread (%1) - 標示為未讀 (%1) + + Unread + 未讀 FileLogger - - An error occurred while trying to open the log file. Logging to file is disabled. - 嘗試開啟紀錄檔時遇到錯誤。記錄到檔案已停用。 - - - - FileSystemPathEdit - - - ... - Launch file dialog button text (brief) - …… - - - - &Browse... - Launch file dialog button text (full) - 瀏覽……(&B) - - - - Choose a file - Caption for file open/save dialog - 選擇一個檔案 - - - - Choose a folder - Caption for directory open dialog - 選擇一個資料夾 - - - - Any file - 任何檔案 + + An error occured while trying to open the log file. Logging to file is disabled. + 嘗試開啟記錄檔時發生錯誤。寫入活動記錄已被停用。 FilterParserThread - - - - I/O Error: Could not open IP filter file in read mode. - I/O 錯誤:無法在讀取模式中開啟 IP 過濾器。 - - - - - - IP filter line %1 is malformed. - IP 過濾器行 %1 異常。 - - - - - IP filter line %1 is malformed. Start IP of the range is malformed. - IP 過濾器行 %1 異常。起始 IP 範圍異常。 - - - - - IP filter line %1 is malformed. End IP of the range is malformed. - IP 過濾器行 %1 異常。結束 IP 範圍異常。 - - - - - IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6! - IP 過濾器行 %1 異常。一個 IP 是 IPv4,但另外一個是 IPv6! - - - - - IP filter exception thrown for line %1. Exception is: %2 - IP 過濾器在行 %1 丟出了例外。例外為:%2 + + + + I/O Error: Could not open ip filter file in read mode. + I/O 錯誤:無法在讀取模式開啟 IP 過濾器。 - - - %1 extra IP filter parsing errors occurred. - 513 extra IP filter parsing errors occurred. - %1 額外的 IP 過濾器發生解析錯誤。 - - - - - - - - - + + + + + + + Parsing Error: The filter file is not a valid PeerGuardian P2B file. 解析錯誤:過濾器檔案並非有效的 PeerGuardian P2B 檔案。 @@ -1995,396 +1641,472 @@ GeoIPDatabase - - + + Unsupported database file size. 不支援的資料庫檔案大小。 - + Metadata error: '%1' entry not found. 中介資料錯誤:找不到「%1」項目。 - + Metadata error: '%1' entry has invalid type. 中介資料錯誤:「%1」項目有無效的類型。 - + Unsupported database version: %1.%2 不支援的資料庫版本:%1.%2 - + Unsupported IP version: %1 不支援的 IP 版本:%1 - + Unsupported record size: %1 不支援的記錄大小:%1 - + Invalid database type: %1 無效的資料庫類型:%1 - + Database corrupted: no data section found. 資料庫毀損:找不到資料項目。 - Http::Connection + HttpServer - - Http request size exceeds limiation, closing socket. Limit: %ld, IP: %s - Http 請求超過數量上限,正在關閉 socket。限制:%ld,IP:%s + + File + 檔案 - - Bad Http request, closing socket. IP: %s - 不良的 Http 請求,正在關閉 socket。IP:%s + + Edit + 編輯 - - - HttpServer - + + Help + 說明 + + + Exit qBittorrent 結束 qbittorrent - + Only one link per line 一線僅一連結 - + + Download + 下載 + + + Global upload rate limit must be greater than 0 or disabled. 全域上傳速度限制必須大於 0 或停用。 - + Global download rate limit must be greater than 0 or disabled. 全域下載速度限制必須大於 0 或停用。 - + Alternative upload rate limit must be greater than 0 or disabled. 額外的上傳速度限制必須大於 0 或停用。 - + Alternative download rate limit must be greater than 0 or disabled. 額外的下載速度限制必須大於 0 或停用。 - + Maximum active downloads must be greater than -1. 最大活躍下載數必須大於 -1。 - + Maximum active uploads must be greater than -1. 最大活躍上傳數必須大於 -1。 - + Maximum active torrents must be greater than -1. 最大活躍 torrent 數必須大於 -1。 - + Maximum number of connections limit must be greater than 0 or disabled. 最大連線數限制必須大於 0 或停用。 - + Maximum number of connections per torrent limit must be greater than 0 or disabled. 每個 torrent 的最大下載者連線數限制必須大於 0 或停用。 - + Maximum number of upload slots per torrent limit must be greater than 0 or disabled. 每個 torrent 上傳位置的最大數限制必須大於 0 或停用。 - + Unable to save program preferences, qBittorrent is probably unreachable. 無法儲存程式偏好設定,qBittorrent 可能無法連線。 - - IRC: #qbittorrent on Freenode - IRC:#qbittorrent 在 Freenode - - - - Invalid category name: -Please do not use any special characters in the category name. - 無效的分類名稱: -分類名稱請不要使用任何特殊字元。 - - - - Unknown - 未知 - - - - Hard Disk - 硬碟 - - - - Share ratio limit must be between 0 and 9998. - 分享速率限制必須在 0 到 9998 間。 - - - - Seeding time limit must be between 0 and 525600 minutes. - 做種時間限制必須在 0 到 525600 分鐘間。 + + Language + 語言 - + The port used for incoming connections must be between 1 and 65535. 連入的連線埠號必須介於 1 到 65535 間。 - + The port used for the Web UI must be between 1 and 65535. Web UI 所使用的埠號必須介於 1 與 65535 間。 - + Unable to log in, qBittorrent is probably unreachable. 無法登入,qBittorrent 可能無法連線。 - + Invalid Username or Password. 無效的使用者名稱或密碼。 - - Username - 使用者名稱 - - - + Password 密碼 - + Login 登入 - + + Upload Failed! + 上傳失敗! + + + Original authors 原始作者 - + + Upload limit: + 上傳限制: + + + + Download limit: + 下載限制: + + + Apply 套用 - + Add 新增 - + + Category: + 分類: + + + Upload Torrents Upload torrent files to qBittorent using WebUI 上傳 Torrents - + + All + 全部 + + + + Downloading + 下載中 + + + + Seeding + 做種中 + + + + Completed + 已完成 + + + + Resumed + 已繼續 + + + + Paused + 暫停 + + + + Active + 活躍的 + + + + Inactive + 不活躍的 + + + Save files to location: 儲存檔案到: - + Cookie: Cookie: - + Type folder here 在此輸入資料夾 - + + Run an external program on torrent completion + 當 torrent 下載完成時執行外部程式 + + + + Enable bandwidth management (uTP) + 啟用頻寬管理 (uTP) + + + + Apply rate limit to uTP connections + 套用速度限制至 uTP 連線 + + + + Alternative Global Rate Limits + 額外的全域分享率限制 + + + More information 更多資訊 - + Information about certificates 關於憑證的資訊 - + Save Files to 儲存檔案到 - - Set location - 設定位置 - - - - Limit upload rate - 限制上傳速率 + + Watch Folder + 監視資料夾 - - Limit download rate - 限制下載速率 + + Default Folder + 預設資料夾 - - Rename torrent - 重新命名 torrent + + from + from time1 to time2 + - - Unable to create category - + + to + from time1 to time2 + - + Other... Save Files to: Watch Folder / Default Folder / Other... 其他… - + + Every day + Schedule the use of alternative rate limits on ... + 每天 + + + + Week days + Schedule the use of alternative rate limits on ... + 工作天 + + + + Week ends + Schedule the use of alternative rate limits on ... + 假日 + + + Monday Schedule the use of alternative rate limits on ... 星期一 - + Tuesday Schedule the use of alternative rate limits on ... 星期二 - + Wednesday Schedule the use of alternative rate limits on ... 星期三 - + Thursday Schedule the use of alternative rate limits on ... 星期四 - + Friday Schedule the use of alternative rate limits on ... 星期五 - + Saturday Schedule the use of alternative rate limits on ... 星期六 - + Sunday Schedule the use of alternative rate limits on ... 星期天 - + + Downloaded + Is the file downloaded or not? + 已下載 + + + Logout 登出 - + + Download from URLs + 從 URL 下載 + + + Download Torrents from their URLs or Magnet links - 從他們的 URL 或磁力連結下載 torrent + 從他們的 URL 或磁性連結下載 torrent - + Upload local torrent 上傳本機 torrent - + Are you sure you want to delete the selected torrents from the transfer list? 您確定要刪除在傳輸清單中所選擇的 torrent 嗎? - + Save 儲存 - + qBittorrent client is not reachable - 無法連線到 qBittorrent 用戶端 - - - - qBittorrent has been shutdown. - qBittorrent 已經關閉。 + 連接不到 qBittorrent 客戶端 - - - IPSubnetWhitelistOptionsDialog - - List of whitelisted IP subnets - 白名單 IP 的子網清單 + + HTTP Server + HTTP 伺服器 - - Example: 172.17.32.0/24, fdff:ffff:c8::/40 - 例如:172.17.32.0/24, fdff:ffff:c8::/40 + + The following parameters are supported: + 支援以下的參數: - - Add subnet - 新增子網 + + Torrent path + Torrent 路徑 - - Delete - 刪除 + + Torrent name + Torrent 名稱 - - Error - 錯誤 + + qBittorrent has been shutdown. + qBittorrent 已經關閉。 + + + LineEdit - - The entered subnet is invalid. - 已輸入的子網無效。 + + Clear the text + 清除文字 LogListWidget - + Copy 複製 - + Clear 清除 @@ -2417,550 +2139,492 @@ 當下載完成 (&D) - + &View 檢視 (&V) - + &Options... 選項… (&O) - + &Resume 繼續 (&R) - + Torrent &Creator Torrent 製作器 (&C) - + Set Upload Limit... 設定上傳限制… - + Set Download Limit... 設定下載限制… - + Set Global Download Limit... 設定全域下載速度限制… - + Set Global Upload Limit... 設定全域上傳速度限制… - + Minimum Priority 最低優先度 - + Top Priority 最高優先度 - + Decrease Priority 減少優先度 - + Increase Priority 增加優先度 - - + + Alternative Speed Limits 替代速度限制 - + &Top Toolbar 頂端工具列 (&T) - + Display Top Toolbar 顯示頂端工具列 - - Status &Bar - 狀態列(&B) - - - + S&peed in Title Bar 在標題列的速度 (&P) - + Show Transfer Speed in Title Bar 在標題列顯示傳輸速度 - + &RSS Reader RSS 閱讀器 (&R) - + Search &Engine 搜尋引擎 (&E) - + L&ock qBittorrent 鎖定 qBittorrent (&O) - + Do&nate! 捐款!(&N) - - Close Window - 關閉視窗 - - - + R&esume All 全部繼續 (&E) - + Manage Cookies... 管理 cookie… - + Manage stored network cookies 管理儲存的網路Cookie… - + Normal Messages 一般訊息 - + Information Messages 資訊訊息 - + Warning Messages 警告訊息 - + Critical Messages 重要訊息 - + &Log 記錄 (&L) - + &Exit qBittorrent 結束 qbittorrent (&E) - + &Suspend System 系統暫停 (&S) - + &Hibernate System 系統休眠 (&H) - + S&hutdown System 關機 (&h) - + &Disabled 已停用 (&D) - + &Statistics 統計資料 (&S) - + Check for Updates 檢查更新 - + Check for Program Updates 檢查程式更新 - + &About 關於 (&A) - + &Pause 暫停 (&P) - + &Delete 刪除 (&D) - + P&ause All 全部暫停 (&A) - + &Add Torrent File... 新增 torrent 檔案… (&A) - + Open 開啟 - + E&xit 離開 (&X) - + Open URL 開啟 URL - + &Documentation 說明文件 (&D) - + Lock 鎖定 - - - + + + Show 顯示 - + Check for program updates 檢查軟體更新 - + Add Torrent &Link... 新增 torrent 連結 (&L) - + If you like qBittorrent, please donate! 如果您喜歡 qBittorrent,請捐款! - - + Execution Log 活動紀錄 - + Clear the password 清除密碼 - + Filter torrent list... - 過濾 torrent 清單… + 過濾 torrent 列表… - + &Set Password 設定密碼 (&S) - - Preferences - 偏好設定 - - - + &Clear Password 清除密碼 (&C) - + Transfers 傳輸 - - - qBittorrent is minimized to tray - - - - - - - This behavior can be changed in the settings. You won't be reminded again. - - - - + Torrent file association Torrent 檔案關聯 - + qBittorrent is not the default application to open torrent files or Magnet links. Do you want to associate qBittorrent to torrent files and Magnet links? - qBittorrent 不是您開啟 torrent 檔案或磁力連結的預設程式。 -您想要以 qBittorrent 開啟 torrent 檔案和磁力連結嗎? + qBittorrent 不是您開啟 torrent 檔案或磁性連結的預設程式。 +您想要以 qBittorrent 開啟 torrent 檔案和磁性連結嗎? - + Icons Only 只有圖示 - + Text Only 只有文字 - + Text Alongside Icons 文字在圖示旁 - + Text Under Icons 文字在圖示下 - + Follow System Style 跟隨系統風格 - - - + + + UI lock password UI 鎖定密碼 - - - + + + Please type the UI lock password: 請輸入 UI 鎖定密碼: - + The password should contain at least 3 characters 密碼應該至少包含 3 個字元 - + Password update 更新密碼 - + The UI lock password has been successfully updated UI 鎖定密碼已經更新了 - + Are you sure you want to clear the password? 您確定要清除密碼? - - Use regular expressions - - - - + Search 搜尋 - + Transfers (%1) 傳輸 (%1) - + Error 錯誤 - + Failed to add torrent: %1 無法加入 torrent:%1 - + Torrent added 已加入 torrent - + '%1' was added. e.g: xxx.avi was added. 已加入「%1」 - + Download completion 下載完成 - + I/O Error i.e: Input/Output Error I/O 錯誤 - + Recursive download confirmation 遞迴下載確認 - + Yes - + No - + Never 永不 - + Global Upload Speed Limit 全域上傳速度限制 - + Global Download Speed Limit 全域下載速度限制 - - qBittorrent was just updated and needs to be restarted for the changes to be effective. - qBittorrent 已經更新了並且需要重新啟動。 - - - - qBittorrent is closed to tray - - - - - Some files are currently transferring. - 有些檔案還在傳輸中。 - - - - Are you sure you want to quit qBittorrent? - 您確定要退出 qBittorrent 嗎? - - - + &No 否 (&N) - + &Yes 是 (&Y) - + &Always Yes 永遠是 (&A) - - %1/s - s is a shorthand for seconds - %1/秒 - - - - Couldn't determine your Python version. Search engine disabled. - - - - + Old Python Interpreter 舊的 Python 直譯器 - + Your Python version (%1) is outdated. Please upgrade to latest version for search engines to work. Minimum requirement: 2.7.9 / 3.3.0. 您的 Python 版本 (%1) 過期了。請更新到最新的版本以讓搜尋引擎可以運作。最低需求:2.7.9/3.3.0。 - + qBittorrent Update Available - 有新版本的 qBittorrent 可用 + 有新版本的 qBittorren 可用 + + + + A new version is available. +Do you want to download %1? + 有新版本可用, +您想要下載 %1 嗎? - + Already Using the Latest qBittorrent Version 已經在用最新的 qBittorren 版本 - + Undetermined Python version 不確定的 Python 版本 - + '%1' has finished downloading. e.g: xxx.avi has finished downloading. 「%1」已經下載完成。 - + An I/O error occurred for torrent '%1'. Reason: %2 e.g: An error occurred for torrent 'xxx.avi'. @@ -2969,158 +2633,154 @@ 原因:「%2」 - + The torrent '%1' contains torrent files, do you want to proceed with their download? Torrent「%1」包含 torrent 檔案,您想要執行下載作業嗎? - + Couldn't download file at URL '%1', reason: %2. 無法下載檔案,在此 URL:「%1」,理由:「%2」 - + Python found in %1: %2 Python found in PATH: /usr/local/bin:/usr/bin:/etc/bin 在 %1 找到 Python:%2 - - + + Couldn't determine your Python version (%1). Search engine disabled. + 無法確定您的 Python 版本 (%1)。已停用搜尋引擎。 + + + + Missing Python Interpreter 遺失 Python 直譯器 - + Python is required to use the search engine but it does not seem to be installed. Do you want to install it now? 使用搜尋引擎需要 Python,但是它似乎尚未安裝。 您想要現在安裝嗎? - + Python is required to use the search engine but it does not seem to be installed. 使用搜尋引擎需要 Python,但是它似乎尚未安裝。 - - A new version is available. - - - - - Do you want to download %1? - - - - - Open changelog... - - - - + No updates available. You are already using the latest version. 沒有更新的版本 您已經在用最新的版本了 - + &Check for Updates 檢查更新 (&C) - + Checking for Updates... 正在檢查更新… - + Already checking for program updates in the background 已經在背景檢查程式更新 - + Python found in '%1' 在「%1」找到 Python - + Download error 下載錯誤 - + Python setup could not be downloaded, reason: %1. Please install it manually. Python 安裝程式無法下載。原因: %1。 請手動安裝。 - - + + Invalid password 無效的密碼 - - - + + RSS (%1) RSS (%1) - + URL download error URL 下載錯誤 - + The password is invalid 密碼是無效的 - - + + DL speed: %1 e.g: Download speed: 10 KiB/s 下載速度:%1 - - + + UP speed: %1 e.g: Upload speed: 10 KiB/s 上傳速度:%1 - + [D: %1, U: %2] qBittorrent %3 D = Download; U = Upload; %3 is qBittorrent version [下載:%1,上傳:%2] qBittorrent %3 - + Hide 隱藏 - + Exiting qBittorrent 退出 qBittorrent - + + Some files are currently transferring. +Are you sure you want to quit qBittorrent? + 有些檔案還在傳輸中。 +您確定要退出 qBittorrent 嗎? + + + Open Torrent Files 開啟 torrent 檔案 - + Torrent Files Torrent 檔案 - + Options were saved successfully. 選項儲存成功。 @@ -3128,52 +2788,52 @@ Net::DNSUpdater - + Your dynamic DNS was successfully updated. 您的動態 DNS 更新成功。 - + Dynamic DNS error: The service is temporarily unavailable, it will be retried in 30 minutes. 動態 DNS 錯誤:服務暫時無法使用,將在 30 分鐘後重試。 - + Dynamic DNS error: hostname supplied does not exist under specified account. 動態 DNS 錯誤:提供的主機名稱在指定的帳號下不存在。 - + Dynamic DNS error: Invalid username/password. 動態 DNS 錯誤:無效的使用者名稱/密碼。 - + Dynamic DNS error: qBittorrent was blacklisted by the service, please report a bug at http://bugs.qbittorrent.org. 動態 DNS 錯誤:qBittorrent 被該服務封鎖了,請遞交此錯誤至 http://bugs.qbittorrent.org。 - + Dynamic DNS error: %1 was returned by the service, please report a bug at http://bugs.qbittorrent.org. 動態 DNS 錯誤:該服務傳回 %1,請遞交此錯誤至 http://bugs.qbittorrent.org。 - + Dynamic DNS error: Your username was blocked due to abuse. 動態 DNS 錯誤:您的使用者名稱因濫用而被封鎖。 - + Dynamic DNS error: supplied domain name is invalid. 動態 DNS 錯誤:提供的網域名稱是無效的。 - + Dynamic DNS error: supplied username is too short. 動態 DNS 錯誤:提供的使用者名稱太短。 - + Dynamic DNS error: supplied password is too short. 動態 DNS 錯誤:提供的密碼太短。 @@ -3181,1413 +2841,1303 @@ Net::DownloadHandler - + I/O Error I/O 錯誤 - + The file size is %1. It exceeds the download limit of %2. 檔案大小為 %1。它超過了 %2 的下䵧限制。 - + Unexpected redirect to magnet URI. 未預期的到磁力 URI 的重新導向。 + + + Net::GeoIPManager - - The remote host name was not found (invalid hostname) - + + + GeoIP database loaded. Type: %1. Build time: %2. + GeoIP 資料庫已載入。類型:%1。構建時間:%2。 - - The operation was canceled - + + + Couldn't load GeoIP database. Reason: %1 + 無法載入 GeoIP 資料庫。理由:%1 - - The remote server closed the connection prematurely, before the entire reply was received and processed - + + Venezuela, Bolivarian Republic of + 委內瑞拉玻利瓦共和國 - - The connection to the remote server timed out - - - - - SSL/TLS handshake failed - - - - - The remote server refused the connection - - - - - The connection to the proxy server was refused - - - - - The proxy server closed the connection prematurely - - - - - The proxy host name was not found - - - - - The connection to the proxy timed out or the proxy did not reply in time to the request sent - - - - - The proxy requires authentication in order to honor the request but did not accept any credentials offered - - - - - The access to the remote content was denied (401) - - - - - The operation requested on the remote content is not permitted - - - - - The remote content was not found at the server (404) - - - - - The remote server requires authentication to serve the content but the credentials provided were not accepted - - - - - The Network Access API cannot honor the request because the protocol is not known - - - - - The requested operation is invalid for this protocol - - - - - An unknown network-related error was detected - - - - - An unknown proxy-related error was detected - - - - - An unknown error related to the remote content was detected - - - - - A breakdown in protocol was detected - - - - - Unknown error - - - - - Net::GeoIPManager - - - - GeoIP database loaded. Type: %1. Build time: %2. - GeoIP 資料庫已載入。類型:%1。構建時間:%2。 - - - - - Couldn't load GeoIP database. Reason: %1 - 無法載入 GeoIP 資料庫。理由:%1 - - - - Venezuela, Bolivarian Republic of - 委內瑞拉玻利瓦共和國 - - - + Viet Nam 越南 - - + + N/A N/A - + Andorra 安道爾 - + United Arab Emirates 阿拉伯聯合大公國 - + Afghanistan 阿富汗 - + Antigua and Barbuda 安地卡及巴布達 - + Anguilla 安圭拉 - + Albania 阿爾巴尼亞 - + Armenia 亞美尼亞 - + Angola 安哥拉 - + Antarctica 南極洲 - + Argentina 阿根廷 - + American Samoa 美屬薩摩亞 - + Austria 奧地利 - + Australia 澳大利亞 - + Aruba 阿魯巴 - + Azerbaijan 亞塞拜然 - + Bosnia and Herzegovina 波士尼亞與赫塞哥維納 - + Barbados 巴貝多 - + Bangladesh 孟加拉 - + Belgium 比利時 - + Burkina Faso 布吉納法索 - + Bulgaria 保加利亞 - + Bahrain 巴林 - + Burundi 蒲隆地 - + Benin 貝南 - + Bermuda 百慕達 - + Brunei Darussalam 汶萊 - + Brazil 巴西 - + Bahamas 巴哈馬 - + Bhutan 不丹 - + Bouvet Island 布威島 - + Botswana 波札那 - + Belarus 白俄羅斯 - + Belize 貝里斯 - + Canada 加拿大 - + Cocos (Keeling) Islands 科科斯 (基林) 群島 - + Congo, The Democratic Republic of the 剛果民主共和國 - + Central African Republic 中非共和國 - + Congo 剛果共和國 - + Switzerland 瑞士 - + Cook Islands 庫克群島 - + Chile 智利 - + Cameroon 喀麥隆 - + China 中華人民共和國 - + Colombia 哥倫比亞 - + Costa Rica 哥斯大黎加 - + Cuba 古巴 - + Cape Verde 維德角 - + Curacao 古拉索 - + Christmas Island 聖誕島 - + Cyprus 賽普勒斯 - + Czech Republic 捷克共和國 - + Germany 德國 - + Djibouti 吉布地 - + Denmark 丹麥 - + Dominica 多米尼克 - + Dominican Republic 多明尼加共和國 - + Algeria 阿爾及利亞 - + Ecuador 厄瓜多 - + Estonia 愛沙尼亞 - + Egypt 埃及 - + Western Sahara 西撒哈拉 - + Eritrea 厄利垂亞 - + Spain 西班牙 - + Ethiopia 衣索比亞 - + Finland 芬蘭 - + Fiji 斐濟 - + Falkland Islands (Malvinas) 福克蘭群島 (馬爾維納斯群島) - + Micronesia, Federated States of 密克羅尼西亞聯邦 - + Faroe Islands 法羅群島 - + France 法國 - + Gabon 加彭 - + United Kingdom 英國本土 - + Grenada 格瑞那達 - + Georgia 喬治亞 - + French Guiana 法屬圭亞那 - + Ghana 加納 - + Gibraltar 直布羅陀 - + Greenland 格陵蘭 - + Gambia 甘比亞 - + Guinea 幾內亞 - + Guadeloupe 瓜德羅普 - + Equatorial Guinea 赤道幾內亞 - + Greece 希臘 - + South Georgia and the South Sandwich Islands 南喬治亞與南三明治群島 - + Guatemala 瓜地馬拉 - + Guam 關島 - + Guinea-Bissau 幾內亞比索 - + Guyana 蓋亞那 - + Hong Kong 香港 - + Heard Island and McDonald Islands 赫德島和麥克唐納群島 - + Honduras 洪都拉斯 - + Croatia 克羅埃西亞 - + Haiti 海地 - + Hungary 匈牙利 - + Indonesia 印度尼西亞 - + Ireland 愛爾蘭 - + Israel 以色列 - + India 印度 - + British Indian Ocean Territory 英屬印度洋領地 - + Iraq 伊拉克 - + Iran, Islamic Republic of 伊朗伊斯蘭共和國 - + Iceland 冰島 - + Italy 義大利 - + Jamaica 牙買加 - + Jordan 約旦 - + Japan 日本 - + Kenya 肯亞 - + Kyrgyzstan 吉爾吉斯 - + Cambodia 柬埔寨 - + Kiribati 吉里巴斯 - + Comoros 葛摩 - + Saint Kitts and Nevis 聖克里斯多福及尼維斯 - + Korea, Democratic People's Republic of 朝鮮民主主義人民共和國 - + Korea, Republic of 大韓民國 - + Kuwait 科威特 - + Cayman Islands 蓋曼群島 - + Kazakhstan 哈薩克 - + Lao People's Democratic Republic 寮人民民主共和國 - + Lebanon 黎巴嫩 - + Saint Lucia 聖露西亞 - + Liechtenstein 列支敦斯登 - + Sri Lanka 斯里蘭卡 - + Liberia 利比亞 - + Lesotho 賴索托 - + Lithuania 立陶宛 - + Luxembourg 盧森堡 - + Latvia 拉脫維亞 - + Morocco 摩洛哥 - + Monaco 摩納哥 - + Moldova, Republic of 摩爾多瓦共和國 - + Madagascar 馬達加斯加 - + Marshall Islands 馬紹爾群島 - + Mali 馬利共和國 - + Myanmar 緬甸 - + Mongolia 蒙古 - + Northern Mariana Islands 北馬利安納群島 - + Martinique 馬丁尼克 - + Mauritania 茅利塔尼亞 - + Montserrat 蒙哲臘 - + Malta 馬爾他 - + Mauritius 模里西斯 - + Maldives 馬爾地夫 - + Malawi 馬拉威 - + Mexico 墨西哥 - + Malaysia 馬來西亞 - + Mozambique 莫三比克 - + Namibia 納米比亞 - + New Caledonia 新喀里多尼亞 - + Niger 尼日 - + Norfolk Island 諾福克島 - + Nigeria 奈及利亞 - + Nicaragua 尼加拉瓜 - + Netherlands 荷蘭 - + Norway 挪威 - + Nepal 尼泊爾 - + Nauru 諾魯 - + Niue 紐埃 - + New Zealand 紐西蘭 - + Oman 阿曼 - + Panama 巴拿馬 - + Peru 秘魯 - + French Polynesia 法屬玻里尼西亞 - + Papua New Guinea 巴布亞紐幾內亞 - + Philippines 菲律賓 - + Pakistan 巴基斯坦 - + Poland 波蘭 - + Saint Pierre and Miquelon 聖皮耶與密克隆群島 - + Puerto Rico 波多黎各 - + Portugal 葡萄牙 - + Palau 帛琉 - + Paraguay 巴拉圭 - + Qatar 卡達 - + Reunion 留尼旺 - + Romania 羅馬尼亞 - + Russian Federation 俄羅斯聯邦 - + Rwanda 盧安達 - + Saudi Arabia 沙烏地阿拉伯 - + Solomon Islands 索羅門群島 - + Seychelles 塞席爾 - + Sudan 蘇丹 - + Sweden 瑞典 - + Singapore 新加坡 - + Slovenia 斯洛維尼亞 - + Svalbard and Jan Mayen 斯瓦巴和揚馬延 - + Slovakia 斯洛伐克 - + Sierra Leone 獅子山共和國 - + San Marino 聖馬利諾 - + Senegal 塞內加爾 - + Somalia 索馬利亞 - + Suriname 蘇利南 - + Sao Tome and Principe 聖多美普林西比 - + El Salvador 薩爾瓦多 - + Syrian Arab Republic 阿拉伯敘利亞共和國 - + Swaziland 史瓦茲蘭 - + Turks and Caicos Islands 特克斯和凱科斯群島 - + Chad 查德 - + French Southern Territories 法屬南部領地 - + Togo 多哥 - + Thailand 泰國 - + Tajikistan 塔吉克斯坦 - + Tokelau 托克勞 - + Turkmenistan 土庫曼 - + Tunisia 突尼西亞 - + Tonga 東加 - - Could not decompress GeoIP database file. - 無法解壓縮 GeoIP 資料庫檔案。 - - - + Timor-Leste 東帝汶 - + Bolivia, Plurinational State of 多民族玻利維亞國 - + Bonaire, Sint Eustatius and Saba 荷蘭加勒比區 - + Cote d'Ivoire 象牙海岸 - + Libya 利比亞 - + Saint Martin (French part) 法屬聖馬丁 - + Macedonia, The Former Yugoslav Republic of 前南斯拉夫馬其頓共和國 - + Macao 澳門 - + Pitcairn 皮特肯 - + Palestine, State of 巴勒斯坦國 - + Saint Helena, Ascension and Tristan da Cunha 聖赫勒拿、亞森欣與垂斯坦昆哈 - + South Sudan 南蘇丹 - + Sint Maarten (Dutch part) 荷屬聖馬丁 - + Turkey 土耳其 - + Trinidad and Tobago 千里達及托巴哥 - + Tuvalu 吐瓦魯 - + Taiwan 臺灣 - + Tanzania, United Republic of 坦尚尼亞 - + Ukraine 烏克蘭 - + Uganda 烏甘達 - + United States Minor Outlying Islands 美國本土外小島嶼 - + United States 美國 - + Uruguay 烏拉圭 - + Uzbekistan 烏茲別克斯坦 - + Holy See (Vatican City State) 聖座 (梵蒂岡城國) - + Saint Vincent and the Grenadines 聖文森及格瑞那丁 - + Virgin Islands, British 英屬維京群島 - + Virgin Islands, U.S. 美屬維京群島 - + Vanuatu 萬那杜 - + Wallis and Futuna 瓦利斯和富圖納 - + Samoa 薩摩亞 - + Yemen 葉門 - + Mayotte 馬約特 - + Serbia 塞爾維亞 - + South Africa 南非 - + Zambia 尚比亞 - + Montenegro 蒙特內格魯 - + Zimbabwe 辛巴威 - + Aland Islands 奧蘭群島 - + Guernsey 格恩西 - + Isle of Man 曼島 - + Jersey 澤西 - + Saint Barthelemy 聖巴瑟米 - + + Could not uncompress GeoIP database file. + 無法解壓縮 GeoIP 資料庫檔案。 + + + Couldn't save downloaded GeoIP database file. 無法儲存已下載的 GeoIP 資料庫檔案。 - + Successfully updated GeoIP database. 成功更新 GeoIP 資料庫。 - + Couldn't download GeoIP database file. Reason: %1 無法下載 GeoIP 資料庫檔案。理由:%1 @@ -4595,12 +4145,12 @@ Net::PortForwarder - + UPnP / NAT-PMP support [ON] UPnP/NAT-PMP 支援 [開啟] - + UPnP / NAT-PMP support [OFF] UPnP/NAT-PMP 支援 [關閉] @@ -4608,7 +4158,7 @@ Net::Smtp - + Email Notification Error: 電子郵件通知錯誤: @@ -4616,1279 +4166,1077 @@ OptionsDialog - + Options 選項 - + Behavior 行為 - + Downloads 下載 - + Connection 連線 - + Speed 速度 - + BitTorrent BitTorrent - - RSS - RSS - - - + Web UI Web UI - + Advanced 進階 - + Language 語言 - + User Interface Language: 使用者介面語言: - + (Requires restart) (必須重新啟動) - + Transfer List 傳輸清單 - + Confirm when deleting torrents 當刪除 torrent 時必須確認 - + Use alternating row colors In transfer list, one every two rows will have grey background. 單雙列交替背景顏色 - + Hide zero and infinity values 隱藏零或無限大的值。 - + Always 總是 - + Paused torrents only 僅暫停 torrent - + Action on double-click - 按兩下時的行動 + 雙擊時的行動 - + Downloading torrents: 下載中的 torrent: - - + + Start / Stop Torrent 開始╱停止 torrent - - + + Open destination folder 開啟目的地資料夾 - - + + No action 無行動 - + Completed torrents: 已完成的 torrent: - + Desktop 桌面 - + Start qBittorrent on Windows start up 在 Windows 啟動時啟動 qBittorrent - + Show splash screen on start up 啟動時顯示啟始畫面 - + Start qBittorrent minimized 啟動時最小化 qBittorrent - + Confirmation on exit when torrents are active 當 torrents 活躍時,離開時要確認 - + Confirmation on auto-exit when downloads finish 下載完成時的自動離開要確認 - - KiB - KiB - - - - Email notification &upon download completion - 下載完成時使用 Email 通知(&U) - - - - Run e&xternal program on torrent completion - 當 torrent 下載完成時執行外部程式(&X) - - - - IP Fi&ltering - IP 過濾(&L) - - - - Schedule &the use of alternative rate limits - 排程使用額外的速度限制(&T) - - - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">更多資訊</a>) - - - - &Torrent Queueing - torrent 排程(&T) - - - - Seed torrents until their seeding time reaches - 對 torrent 做種直到達到做種時間 - - - - A&utomatically add these trackers to new downloads: - 自動新增這些追蹤者到新的下載中:(&U) - - - - RSS Reader - RSS 閱讀器 - - - - Enable fetching RSS feeds - 啟用抓取 RSS feed - - - - Feeds refresh interval: - feed 更新間隔: - - - - Maximum number of articles per feed: - 每個 feed 的最大文章數: - - - - - min - minutes - 分鐘 - - - - RSS Torrent Auto Downloader - RSS Torrent 自動下載器 - - - - Enable auto downloading of RSS torrents - 啟用自動 RSS torrent 下載 - - - - Edit auto downloading rules... - 編輯自動下載規則... - - - - Web User Interface (Remote control) - Web UI(遠端控制) - - - - IP address: - IP 位置: - - - - IP address that the Web UI will bind to. -Specify an IPv4 or IPv6 address. You can specify "0.0.0.0" for any IPv4 address, -"::" for any IPv6 address, or "*" for both IPv4 and IPv6. - Web UI 的 IP 位置將會榜綁定到。 -指定 IPv4 或 IPv6 位置。您可以指定 "0.0.0.0" 給任何 IPv4 位置。 -"::" 給任何 IPv6 位置,或是 "*" 同時給 IPv4 與 IPv6。 - - - - Server domains: - 伺服器網域: - - - - Whitelist for filtering HTTP Host header values. -In order to defend against DNS rebinding attack, -you should put in domain names used by WebUI server. - -Use ';' to split multiple entries. Can use wildcard '*'. - HTTP 主機標頭值的過濾白名單。 -為了防禦 DNS 重新綁定攻擊, -您應該將 Web UI 伺服器使用的域名放到白名單內。 - -使用 ';' 來分離多個項目。可以使用萬用字元 '*'。 - - - - &Use HTTPS instead of HTTP - 使用 HTTPS 而不是 HTTP(&U) - - - - Bypass authentication for clients on localhost - 在本機上跳過用戶端驗證 - - - - Bypass authentication for clients in whitelisted IP subnets - 讓已在白名單中的 IP 子網路跳過驗證 + + Show qBittorrent in notification area + 在通知區域顯示 qBittorrent - - IP subnet whitelist... - IP 子網白名單…… - - - - Upda&te my dynamic domain name - 更新我的動態領域名稱(&T) - - - + Minimize qBittorrent to notification area 最小化 qBittorrent 到通知區域 - + Close qBittorrent to notification area i.e: The systray tray icon will still be visible when closing the main window. 關閉 qBittorrent 到通知區域 - + Tray icon style: 系統匣圖示樣式: - + Normal 一般 - + Monochrome (Dark theme) 單色 (暗主題) - + Monochrome (Light theme) 單色 (亮主題) - + File association 檔案關聯 - + Use qBittorrent for .torrent files torrent 檔案使用 qBittorrent - + Use qBittorrent for magnet links - 磁力連結使用 qBittorrent + 磁性連結使用 qBittorrent - + Power Management 電源管理 - + + Inhibit system sleep when torrents are active + 當 torrent 是活躍時,防止系統進入睡眠 + + + + Log file + 記錄檔 + + + Save path: 儲存路徑: - + Backup the log file after: 備份記錄檔,每滿 - + + MB + MB + + + Delete backup logs older than: 只保存備份記錄: - + days Delete backup logs older than 10 months - + months Delete backup logs older than 10 months - + years Delete backup logs older than 10 years - + When adding a torrent 當增加 torrent 時 - + + Display torrent content and some options + 顯示 torrent 內容及其他選項 + + + Bring torrent dialog to the front 把 torrent 對話框帶到最前 - + Do not start the download automatically The torrent will be added to download list in pause state 不要自動開始下載 - + Should the .torrent file be deleted after adding it 是否應該在加入 .torrent 檔案後刪除它 - + + Delete .torrent files afterwards + 事後刪除 .torrent 檔案 + + + Also delete .torrent files whose addition was cancelled 同時也刪除被取消的 .torrent 檔案 - + Also when addition is cancelled 也當附加的被取消時 - + Warning! Data loss possible! 警告!可能遺失資料! - + Saving Management 存檔管理 - + Default Torrent Management Mode: 預設 torrent 管理模式: - + Automatic mode means that various torrent properties (e.g. save path) will be decided by the associated category 自動模式代表了多個 torrent 屬性 (例如儲存路徑) 將會由相關的分類來決定 - + Manual 手動 - + Automatic 自動 - + When Torrent Category changed: 當 Torrent 分類變更時: - + Relocate torrent 重新定位 torrent - + Switch torrent to Manual Mode 切換 torrent 到手動模式 - + When Default Save Path changed: 當預設儲存路徑變更時: - - + + Relocate affected torrents 重新定位受影響的 torrent - - + + Switch affected torrents to Manual Mode 切換受影響的 torrents 至手動模式 - + When Category changed: 當分類變更時: - + Use Subcategories 使用子分類 - + Default Save Path: 預設儲存路徑: - + Keep incomplete torrents in: 保留未完成的 torrent 於: - + Copy .torrent files to: 複製 torrent 檔案到: - - Show &qBittorrent in notification area - 在通知區域顯示 qBittorrent(&Q) - - - - &Log file - 記錄檔(&L) - - - - Display &torrent content and some options - 顯示 torrent 內容及其他選項(&T) - - - - Create subfolder for torrents with multiple files - 為有多個檔案的 torrent 建立子資料夾 - - - - De&lete .torrent files afterwards - 事後刪除 .torrent 檔案(&L) - - - + Copy .torrent files for finished downloads to: 複製已完成的 torrent 檔案到: - + Pre-allocate disk space for all files 為所有檔案事先分配硬碟空間 - - Inhibit system sleep when torrents are downloading - - - - - Inhibit system sleep when torrents are seeding - - - - + Append .!qB extension to incomplete files 在未完成檔案加上 .!qB 副檔名 - - Enable recursive download dialog - - - - + Automatically add torrents from: 自動載入 torrent 檔案: - + Add entry 新增項目 - + Remove entry 移除項目 - + + Email notification upon download completion + 下載完成時使用電子郵件通知 + + + + Destination email: + 目的地電子郵件: + + + SMTP server: SMTP 伺服器: - + This server requires a secure connection (SSL) 這個伺服器需要加密連線 (SSL) - - + + + Authentication 驗證 - - - - + + + + Username: 使用者名稱: - - - - + + + + Password: 密碼: - - Enabled protocol: - 已啟用協定: - - - - TCP and μTP - TCP 與 μTP + + Run external program on torrent completion + 當 torrent 下載完成時執行外部程式 - + Listening Port 監聽埠 - + Port used for incoming connections: 連入連線時使用的埠: - + Random 隨機 - + Use UPnP / NAT-PMP port forwarding from my router 從我的路由器使用 UPnP/NAT-PMP 連接埠轉送 - + Use different port on each startup 每次啟動時使用不同的埠 - + Connections Limits 連線限制 - + Maximum number of connections per torrent: 每個 torrent 的最大連線數: - + Global maximum number of connections: 全域最大連線數: - + Maximum number of upload slots per torrent: 每個 torrent 上傳位置的最大數: - + Global maximum number of upload slots: 全域的上傳通道最大數: - + Proxy Server 代理伺服器 - + Type: 類型: - + (None) (無) - + SOCKS4 SOCKS4 - + SOCKS5 SOCKS5 - + HTTP HTTP - + Host: 主機: - - + + Port: 埠: - + Otherwise, the proxy server is only used for tracker connections 除此之外,代理伺服器僅用於追蹤者連線 - + Use proxy for peer connections 使用代理伺服器來連線下載者 - + Disable connections not supported by proxies 停用不被代理伺服器所支援的連線 - - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">More information</a>) - (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Disable-connections-not-supported-by-proxies">更多資訊</a>) - - - + RSS feeds, search engine, software updates or anything else other than torrent transfers and related operations (such as peer exchanges) will use a direct connection RSS feeds、搜尋引擎、軟體更新或是任何其他除了 torrent 傳輸及相關動作以外的東西 (像是下載者交換) 都將會使用直接連線 - + Use proxy only for torrents 只對 torrent 使用代理伺服器 - - A&uthentication - 認證(&U) - - - + Info: The password is saved unencrypted 資訊:密碼以未加密的形式儲存 - + + IP Filtering + IP 過濾 + + + Filter path (.dat, .p2p, .p2b): 過濾路徑 (.dat, .p2p, .p2b): - + Reload the filter 重新載入過濾器 - - Manually banned IP addresses... - 手動封鎖 IP 位址... - - - + Apply to trackers 套用到追蹤者 - + Global Rate Limits 全域分享率限制 - - - - - - - KiB/s - KiB/s - - - - + + Upload: 上傳: - - + + + + + KiB/s + KiB/s + + + + Download: 下載: - + Alternative Rate Limits 替代速率限制 - - + + Schedule the use of alternative rate limits + 排程使用額外的速度限制 + + + From: from (time1 to time2) 從: - - + To: time1 to time2 到: - + When: 何時: - + Every day 每天 - + Weekdays 平日 - + Weekends 週末 - + Rate Limits Settings 速率限制設定 - + Apply rate limit to peers on LAN 在 LAN 上套用對下載者的速率限制 - + Apply rate limit to transport overhead 套用速度限制至傳輸負載 - - + + + Enable µTP protocol + 啟用 µTP 協定 + + + Apply rate limit to µTP protocol 套用速率限制到 µTP 協定 - + Privacy 隱私 - + Enable DHT (decentralized network) to find more peers 啟用 DHT (分散式網路) 來尋找更多下載者 - - + + Exchange peers with compatible Bittorrent clients (µTorrent, Vuze, ...) - 與相容的 Bittorrent 用戶端 (µTorrent、Vuze等) 交換下載者資訊 + 與相容的 Bittorrent 客戶端 (µTorrent、Vuze等) 交換下載者資訊 - + Enable Peer Exchange (PeX) to find more peers 啟用下載者交換 (PeX) 來尋找更多下載者 - + Look for peers on your local network 在本地網路找尋下載者 - + Enable Local Peer Discovery to find more peers 啟用本地下載者搜尋來尋找更多下載者 - + Encryption mode: 加密模式: - + Prefer encryption 偏好加密 - + Require encryption 要求加密 - + Disable encryption 停用加密 - + Enable when using a proxy or a VPN connection 當使用代理伺服器或 VPN 連線時啟用 - + Enable anonymous mode 啟用匿名模式 - + + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>) + (<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">更多資訊</a>) + + + + Torrent Queueing + torrent 排程 + + + Maximum active downloads: 最活躍的下載數: - + Maximum active uploads: 最活躍的上傳數: - + Maximum active torrents: 最活躍的 torrent: - + Do not count slow torrents in these limits 在這些限制中不要計算速度慢的 torrent - - Upload rate threshold: - 上傳速度閾值: - - - - Download rate threshold: - 下載速度閾值: - - - - sec - seconds - - - - - Torrent inactivity timer: - Torrent 不活躍計時器: - - - + Share Ratio Limiting 分享率限制 - + Seed torrents until their ratio reaches 對 torrent 做種直到達到分享率 - + then 然後 - + Pause them 暫停它們 - + Remove them 移除它們 - - RSS Smart Episode Filters - RSS 智慧型章節過濾器 + + Automatically add these trackers to new downloads: + 自動新增這些追蹤者到新的下載中: + + + + Enable Web User Interface (Remote control) + 啟用 Web UI (遠端控制) - + Use UPnP / NAT-PMP to forward the port from my router 從我的路由器使用 UPnP/NAT-PMP 連接埠轉送 - + + Use HTTPS instead of HTTP + 使用 HTTPS 而不是 HTTP + + + Certificate: 憑證: - + Import SSL Certificate 匯入 SSL 憑證 - + Key: 鍵值: - + Import SSL Key 匯入 SSL 金鑰 - + <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>Information about certificates</a> <a href=https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts>關於憑證的資訊</a> - - Use alternative Web UI - 使用替代 Web UI - - - - Files location: - 檔案位置: + + Bypass authentication for localhost + 略過本機的驗證 - - Enable clickjacking protection - - - - - Enable Cross-Site Request Forgery (CSRF) protection - + + Update my dynamic domain name + 更新我的動態域名 - + Service: 服務: - + Register 註冊 - + Domain name: 網域名稱: - + By enabling these options, you can <strong>irrevocably lose</strong> your .torrent files! 啟用這些選項,您可能會<strong>無可挽回地失去</strong>您的 .torrent 檔案! - + When these options are enabled, qBittorent will <strong>delete</strong> .torrent files after they were successfully (the first option) or not (the second option) added to its download queue. This will be applied <strong>not only</strong> to the files opened via &ldquo;Add torrent&rdquo; menu action but to those opened via <strong>file type association</strong> as well 當這些選項啟用時,qBittorent 將會在它們成功 (第一個選項) 或是未 (第二個選項) 加入其下載隊列時<strong>刪除</strong> .torrent 檔案。這將<strong>不僅是套用於</strong>透過「新增 torrent」選單動作開啟的檔案,也會套用於透過<strong>檔案類型關聯</strong>開啟的檔案。 - + If you enable the second option (&ldquo;Also when addition is cancelled&rdquo;) the .torrent file <strong>will be deleted</strong> even if you press &ldquo;<strong>Cancel</strong>&rdquo; in the &ldquo;Add torrent&rdquo; dialog 若您啟用第二個選項 (「也當附加的被取消時」),.torrent 檔案甚至當您按下在「新增 torrent」對話框裡的「<strong>取消</strong>」時也<strong>將會被刪除</strong> - - Choose Alternative UI files location - 選擇替代 UI 檔案位置 - - - + Supported parameters (case sensitive): 支援的參數 (區分大小寫): - + %N: Torrent name %N:Torrent 名稱 - + %L: Category %L:分類 - - %G: Tags (seperated by comma) - %G:標籤(以逗號分隔) - - - + %F: Content path (same as root path for multifile torrent) %F:內容路徑 (與多重 torrent 的根路徑相同) - + %R: Root path (first torrent subdirectory path) %R:根路徑 (第一個 torrent 的子目錄路徑) - + %D: Save path %D:儲存路徑 - + %C: Number of files %C:檔案數量 - + %Z: Torrent size (bytes) %Z:Torrent 大小 (位元組) - + %T: Current tracker %T:目前的追蹤者 - + %I: Info hash %I:資訊雜湊值 - + Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N") 提示:將參數以引號包起來以避免被空白切斷 (例如:"%N") - - A torrent will be considered slow if its download and upload rates stay below these values for "Torrent inactivity timer" seconds - Torrent 若下載與上傳速度在「Torrent 不活躍計時器」秒數內都低於這些值的話就會被認為是太慢了 - - - + Select folder to monitor 選取資料夾以監視 - + Folder is already being monitored: 資料夾已在監視中: - + Folder does not exist: 資料夾不存在: - + Folder is not readable: 資料夾無法讀取: - + Adding entry failed 新增項目失敗 - - - - + + Choose export directory 選擇輸出目錄 - - - + + + + + + Choose a save directory 選擇儲存的目錄 - + Choose an IP filter file 選擇一個 IP 過濾器檔案 - + All supported filters 所有支援的過濾器 - + SSL Certificate SSL 憑證 - + + SSL Key + SSL 金鑰 + + + Parsing error 解析錯誤 - + Failed to parse the provided IP filter 所提供的 IP 過濾器解析失敗 - + Successfully refreshed 重新更新成功 - + Successfully parsed the provided IP filter: %1 rules were applied. %1 is a number 成功分析所提供的 IP 過濾器:套用 %1 個規則。 - + Invalid key 無效的鍵值 - + This is not a valid SSL key. 這不是一個有效的 SSL 金鑰。 - + Invalid certificate 無效的憑證 - - Preferences - 偏好設定 - - - - Import SSL certificate - 匯入 SSL 憑證 - - - + This is not a valid SSL certificate. 這不是一個有效的 SSL 憑證。 - - Import SSL key - 匯入 SSL 金鑰 - - - - SSL key - SSL 金鑰 - - - + Time Error 時間錯誤 - + The start time and the end time can't be the same. 起始時間與終止時間不能相同。 - - + + Length Error 長度錯誤 - + The Web UI username must be at least 3 characters long. Web UI 使用者名稱必須至少 3 字元長。 - + The Web UI password must be at least 6 characters long. Web UI 密碼必須至少 6 字元長。 @@ -5896,72 +5244,72 @@ PeerInfo - - Interested(local) and Choked(peer) - Interested(本機)及 Choked(點) + + interested(local) and choked(peer) + 【您:期待下載╱他:拒絕上傳】 - + interested(local) and unchoked(peer) 【您:期待下載╱他:同意上傳】 - + interested(peer) and choked(local) 【他:期待下載╱您:拒絕上傳】 - + interested(peer) and unchoked(local) 【他:期待下載╱您:同意上傳】 - + optimistic unchoke 多傳者優先 - + peer snubbed 下載者突然停止 - + incoming connection 連入的連線 - + not interested(local) and unchoked(peer) 【您:不想下載╱他:同意上傳】 - + not interested(peer) and unchoked(local) 【他:不想下載╱您:同意上傳】 - + peer from PEX 來自 PEX 的下載者 - + peer from DHT 來自 DHT 的下載者 - + encrypted traffic 加密的流量 - + encrypted handshake 加密的溝通 - + peer from LSD 來自 LSD 的下載者 @@ -5969,193 +5317,178 @@ PeerListWidget - + IP IP - + Port - + Flags 旗標 - + Connection 連線 - + Client i.e.: Client application - 用戶端 + 客戶端 - + Progress i.e: % downloaded 進度 - + Down Speed i.e: Download speed 下載速度 - + Up Speed i.e: Upload speed 上傳速度 - + Downloaded i.e: total data downloaded 已下載 - + Uploaded i.e: total data uploaded 已上傳 - + Relevance i.e: How relevant this peer is to us. How many pieces it has that we don't. 關聯 - + Files i.e. files that are being downloaded right now 檔案 - + Column visibility 欄目顯示 - + Add a new peer... 增加新下載者… - - + + Ban peer permanently 永遠封鎖下載者 - + Manually adding peer '%1'... 正在手動加入下載者「%1」… - + The peer '%1' could not be added to this torrent. 下載者「%1」無法新增到此 torrent 中。 - + Manually banning peer '%1'... 正在手動封鎖下載者「%1」… - - + + Peer addition 增加下載者 - + Country 國籍 - + Copy IP:port 複製 IP:埠 - + Some peers could not be added. Check the Log for details. 有些下載者無法被新增。檢查記錄檔以取得更多資訊。 - + The peers were added to this torrent. 下載者已新增到此 torrent 中。 - + Are you sure you want to ban permanently the selected peers? 您確定要永遠封鎖所選擇的下載者嗎? - + &Yes 是 (&Y) - + &No 否 (&N) - PeersAdditionDialog - - - Add Peers - - - - - List of peers to add (one IP per line): - - - - - Format: IPv4:port / [IPv6]:port - - + PeersAdditionDlg - + No peer entered - + 未輸入下載者 - + Please type at least one peer. - + 請鍵入至少一個下載者。 - + Invalid peer - + 無效的下載者 - + The peer '%1' is invalid. - + 下載者「%1」無效。 PieceAvailabilityBar - + White: Unavailable pieces 白色:不可用的部份 - + Blue: Available pieces 藍色:可用的部份 @@ -6163,336 +5496,293 @@ PiecesBar - + Files in this piece: 在此分塊中的檔案: - + File in this piece 在此分塊中的檔案 - + File in these pieces 在這些分塊中的檔案 - - Wait until metadata become available to see detailed information - 等到後設資料可用時來檢視詳細資訊 - - - + Hold Shift key for detailed information 按住 Shift 鍵以取得詳細資訊 - PluginSelectDialog + PluginSelectDlg - + Search plugins - + 搜尋外掛 - + Installed search plugins: - + 已安裝的搜尋外掛: - + Name - 名稱 + 名稱 - + Version - + 版本 - + Url - + URL - - + + Enabled - - - - - Warning: Be sure to comply with your country's copyright laws when downloading torrents from any of these search engines. - + 已啟用 - + You can get new search engine plugins here: <a href="http://plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + 您可以在這裡取得新的搜尋引擎外掛:<a href="http:plugins.qbittorrent.org">http://plugins.qbittorrent.org</a> - + Install a new one - + 安裝新的 - + Check for updates - + 檢查更新 - + Close - + 關閉 - + Uninstall - + 解除安裝 - - - + + + Yes - + - - - - + + + + No - + - + Uninstall warning - + 解除安裝警告 - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. Those plugins were disabled. - + 有些外掛不能被解除安裝,因為它們包含在 qBittorrent 裡面。只有您自己安裝的外掛,才可以被解除安裝。 +這些外掛已經被停用了。 - + Uninstall success - + 解除安裝成功 - + All selected plugins were uninstalled successfully - - - - - - - - Search plugin update - - - - - Plugins installed or updated: %1 - + 所有選擇的外掛都已經成功解除安裝了 - - + + New search engine plugin URL - + 新搜尋引擎外掛 URL - - + + URL: - + URL: - + Invalid link - + 無效的連結 - + The link doesn't seem to point to a search engine plugin. - + 連結似乎沒有指向搜尋引擎外掛。 - + Select search plugins - + 選擇搜尋外掛 - + qBittorrent search plugin - + qBittorrent 搜尋外掛 + + + + + + Search plugin update + 更新搜尋外掛 - + All your plugins are already up to date. - + 您所有的外掛都已經是最新版本。 - + Sorry, couldn't check for plugin updates. %1 - + 抱歉,無法檢查外掛更新。%1 - + + + Search plugin install - + 安裝搜尋外掛 + + + + "%1" search engine plugin was successfully installed. + %1 is the name of the search engine + 「%1」搜尋引擎外掛已經成功安裝。 - + Couldn't install "%1" search engine plugin. %2 - + 無法安裝「%1」搜尋引擎外掛。%2 - + + "%1" search engine plugin was successfully updated. + %1 is the name of the search engine + 「%1」搜尋引擎外掛已經成功更新。 + + + Couldn't update "%1" search engine plugin. %2 - + 無法更新「%1」搜尋引擎外掛。%2 - PluginSourceDialog + PluginSourceDlg - + Plugin source - + 外掛來源 - + Search plugin source: - + 搜尋外掛來源: - + Local file - + 本機檔案 - + Web link - - - - - PowerManagement - - - qBittorrent is active - + 網頁連結 - PreviewSelectDialog + PreviewSelect - - Preview - 預覽 - - - + Name 名稱 - + Size 大小 - + Progress - 過程 + 進度 - - + + Preview impossible - 無法預覽 + 不可預覽 - - + + Sorry, we can't preview this file - 抱歉,我們不能預覽此檔案 - - - - Private::FileLineEdit - - - '%1' does not exist - '%1' 不存在 - - - - '%1' does not point to a directory - '%1' 並未指向目錄 - - - - '%1' does not point to a file - '%1' 並未指向檔案 - - - - Does not have read permission in '%1' - 沒有 '%1' 的讀取權限 - - - - Does not have write permission in '%1' - 沒有 '%1' 的寫入權限 + 抱歉,我們無法預覽這個檔案 PropListDelegate - + Not downloaded 沒有下載 - - + + Normal Normal (priority) 一般 - - N/A - N/A - - - + Do not download Do not download (priority) - 不要下載 + 不要下載 - - + + High High (priority) - + N/A + N/A + + + Mixed Mixed (priorities 混和 - - + + Maximum Maximum (priority) 最高 @@ -6501,32 +5791,32 @@ PropTabBar - + General 一般 - + Trackers 追蹤者 - + Peers 下載者 - + HTTP Sources HTTP 來源 - + Content 內容 - + Speed 速率 @@ -6620,22 +5910,22 @@ 註解: - + Select All 全部選擇 - + Select None 全部不選 - + Normal 一般 - + High @@ -6695,165 +5985,165 @@ 儲存路徑: - + Maximum 最高 + - Do not download 不要下載 - + Never 永不 - + %1 x %2 (have %3) (torrent pieces) eg 152 x 4MB (have 25) %1 x %2 (已完成 %3) - - + + %1 (%2 this session) %1 (此作業階段 %2) - + %1 (seeded for %2) e.g. 4m39s (seeded for 3m10s) %1 (已做種 %2) - + %1 (%2 max) %1 and %2 are numbers, e.g. 3 (10 max) %1 (最大 %2) - - + + %1 (%2 total) %1 and %2 are numbers, e.g. 3 (10 total) %1 (總共 %2 個) - - + + %1 (%2 avg.) %1 and %2 are speed rates, e.g. 200KiB/s (100KiB/s avg.) %1 (平均 %2) - + Open 開啟 - + Open Containing Folder 開啟包含的目錄 - + Rename... 重新命名… - + Priority 優先度 - + New Web seed 新網頁種子 - + Remove Web seed 移除網頁種子 - + Copy Web seed URL 複製網頁種子 URL - + Edit Web seed URL 編輯網頁種子 URL - + + Rename the file + 重新命名檔案 + + + New name: 新名稱: - - + + + The file could not be renamed + 檔案無法重新命名 + + + + This file name contains forbidden characters, please choose a different one. + 檔案名稱包含禁止使用之字元,請選擇其他名稱。 + + + + This name is already in use in this folder. Please use a different name. 此名稱已在此資料夾中使用。請選擇另一個名稱。 - + The folder could not be renamed 此資料夾無法被重新命名 - + qBittorrent qBittorrent - + Filter files... 過濾檔案… - - Renaming - 正在重新命名 - - - - - Rename error - 重新命名錯誤 - - - - The name is empty or contains forbidden characters, please choose a different one. - 檔案名稱為空或是包含禁止使用之字元,請選擇其他名稱。 - - - + New URL seed New HTTP source 新的 URL 種子 - + New URL seed: 新的 URL 種子: - - + + This URL seed is already in the list. 此 URL 種子已經在清單裡了。. - + Web seed editing 編輯網頁種子中 - + Web seed URL: 網頁種子 URL: @@ -6861,230 +6151,117 @@ QObject - + + Your IP address has been banned after too many failed authentication attempts. + 經過多次授權要求失敗之後,您的 IP 位置已經被封鎖了。 + + + + Error: '%1' is not a valid torrent file. + + 錯誤:「%1」不是一個有效的 torrent 檔案。 + + + + + Error: Could not add torrent to session. + 錯誤:無法加入種子到工作階段中。 + + + + I/O Error: Could not create temporary file. + I/O 錯誤:無法建立暫存檔。 + + + %1 is an unknown command line parameter. --random-parameter is an unknown command line parameter. %1 是未知的命令列參數。 - - + + %1 must be the single command line parameter. %1 必須是單一個命令列參數。 - + + %1 must specify the correct port (1 to 65535). + %1 必須指定為正確的埠 (1 到 65535)。 + + + You cannot use %1: qBittorrent is already running for this user. 您不能使用 %1:qBittorrent 已經由此使用者執行。 - + Usage: 使用: - + Options: 選項: - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=value' - 參數 '%1' 必須使用語法 '%1=%2' - - - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--webui-port' must follow syntax '--webui-port=<value>' - 參數 '%1' 必須使用語法 '%1=%2' + + Displays program version + 顯示程式版本 - - Expected integer number in environment variable '%1', but got '%2' - 預期在環境變數 '%1' 中為整數,但是得到 '%2' + + Displays this help message + 顯示說明訊息 - - Parameter '%1' must follow syntax '%1=%2' - e.g. Parameter '--add-paused' must follow syntax '--add-paused=<true|false>' - 參數 '%1' 必須使用語法 '%1=%2' + + Changes the Web UI port (current: %1) + 更改 Web UI 埠 (目前是:%1) - - Expected %1 in environment variable '%2', but got '%3' - 預期 %1 在環境變數 '%2' 中,但是得到 '%3' - - - - port - - - - - %1 must specify a valid port (1 to 65535). - %1 必須指定有效的埠(1 到 65535)。 - - - - Display program version and exit - 顯示程式版本並結束 - - - - Display this help message and exit - 顯示此說明訊息並結束 - - - - Change the Web UI port - 變更 Web UI 埠 - - - + Disable splash screen 停用起始畫面 - + Run in daemon-mode (background) 以守護模式開啟 (背景執行) - - dir - Use appropriate short form or abbreviation of "directory" - 目錄 - - - - Store configuration files in <dir> - 儲存設定檔到 <dir> - - - - - name - 名稱 - - - - Store configuration files in directories qBittorrent_<name> - 儲存設定檔到目錄 qBittorrent_<name> - - - - Hack into libtorrent fastresume files and make file paths relative to the profile directory - 徹底了解 libtorrent 快速復原檔案,並讓檔案路徑是相對於設定檔目錄 - - - - files or URLs - 檔案或 URL - - - - Download the torrents passed by the user - 下載由使用者傳遞的 torrent - - - - Specify whether the "Add New Torrent" dialog opens when adding a torrent. - 指定是否要在新增 torrent 時開啟「加入新的 Torrent」對話框。 - - - - Options when adding new torrents: - 當加入新 torrent 時的選項: - - - - Shortcut for %1 - Shortcut for --profile=<exe dir>/profile --relative-fastresume - %1 的快捷鍵 + + Downloads the torrents passed by the user + 不經由使用者下載 torrent - - path - 路徑 - - - - Torrent save path - torrent 儲存路徑 - - - - Add torrents as started or paused - 新增 torrent 為已開始或已暫停 - - - - Skip hash check - 跳過驗證碼檢查 - - - - Assign torrents to category. If the category doesn't exist, it will be created. - 指派 torrent 到分類。若分類不存在,其將會被建立。 - - - - Download files in sequential order - 依順序下載檔案 - - - - Download first and last pieces first - 先下載第一和最後一塊 - - - - Option values may be supplied via environment variables. For option named 'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper case, '-' replaced with '_'). To pass flag values, set the variable to '1' or 'TRUE'. For example, to disable the splash screen: - 選項的值可以透過環境變量提供。對於名為 'QBT_PARAMETER_NAME'(全大寫,並以 '_' 取代 '-')。要傳遞旗標值,設定變數為 '1' 或 'TRUE'。舉例來說,要停用歡迎畫面就是: - - - - Command line parameters take precedence over environment variables - 命令列的參數優先於環境變數 - - - + Help 說明 - + Run application with -h option to read about command line parameters. 以 -h 選項執行應用程式以閱讀關於命令列參數的資訊。 - + Bad command line 不正確的命令列 - + Bad command line: 不正確的命令列: - + Legal Notice 法律聲明 - - qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. - qBittorrent 是檔案分享程式。當您執行 torrent 時,它的資料將會透過上傳的方式分享給其它人。您分享任何內容都必須自行負責。 - - - - No further notices will be issued. - 不會有進一步的通知。 - - - + + qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility. No further notices will be issued. @@ -7093,353 +6270,432 @@ 之後不會再有其他提醒。 - + Press %1 key to accept and continue... 請按 %1 來接受並繼續… - + Legal notice 法律聲明 - + Cancel 取消 - + I Agree 我同意 - - - Upgrade - 更新 + + Torrent name: %1 + Torrent 名稱:%1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] - 您從一個較舊且以完全不同的方式儲存的版本更新。您必須遷移到新的儲存系統。您將無法再次使用比 v3.3.0 更舊的版本。要繼續嗎?[y/n] + + Torrent size: %1 + Torrent 大小:%1 - - You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. - 您從一個較舊且以完全不同的方式儲存的版本更新。您必須遷移到新的儲存系統。如果要繼續,您將無法再次使用比 v3.3.0 更舊的版本。 + + Save path: %1 + 儲存路徑:%1 - - Couldn't migrate torrent with hash: %1 - 無法遷移雜湊值為 %1 的 torrent + + The torrent was downloaded in %1. + The torrent was downloaded in 1 hour and 20 seconds + Torrent 已於 %1 下載完成。 - - Couldn't migrate torrent. Invalid fastresume file name: %1 - 無法遷移 torrent。無效的快速恢復檔案名稱:%1 + + Thank you for using qBittorrent. + 感謝您使用 qBittorrent。 - - Detected unclean program exit. Using fallback file to restore settings: %1 - 已偵測到不清潔的程式退出。正在使用後備檔案來復原設定:%1 + + [qBittorrent] '%1' has finished downloading + [qBittorrent] 「%1」已下載完成 - - An access error occurred while trying to write the configuration file. - 嘗試寫入設定檔時發生存取錯誤。 + + The remote host name was not found (invalid hostname) + 找不到遠端主機的名稱 (無效的主機名) - - A format error occurred while trying to write the configuration file. - 嘗試寫入設定檔時有格式錯誤。 + + The operation was canceled + 操作已取消 - - An unknown error occurred while trying to write the configuration file. - 嘗試寫入設定檔時遇到未知錯誤。 + + The remote server closed the connection prematurely, before the entire reply was received and processed + 在回應被接收及處理之前,遠端伺服器已關閉連線 - - - RSS::AutoDownloader - - - Invalid data format. - 無效的資料格式。 + + The connection to the remote server timed out + 連線到遠端伺服器逾時 - - Couldn't save RSS AutoDownloader data in %1. Error: %2 - 無法在 %1 中儲存 RSS 自動下載器資料。錯誤:%2 - + + SSL/TLS handshake failed + SSL/TLS 握手失敗 + - - Invalid data format - 無效的資料格式 + + The remote server refused the connection + 遠端伺服器拒絕連線 - - Couldn't read RSS AutoDownloader rules from %1. Error: %2 - 無法從 %1 讀取 RSS 自動下載器規則。錯誤:%2 + + The connection to the proxy server was refused + 連線到代理伺服器被拒絕 - - Couldn't load RSS AutoDownloader rules. Reason: %1 - 無法載入 RSS 自動下載器規則。理由:%1 + + The proxy server closed the connection prematurely + 代理伺服器過早關閉連線 - - - RSS::Feed - - Failed to download RSS feed at '%1'. Reason: %2 - 在「%1」下載 RSS feed 失敗。理由:%2 + + The proxy host name was not found + 找不到代理伺服器主機名稱 - - RSS feed at '%1' updated. Added %2 new articles. - 「%1」的 RSS feed 已更新。已新增 %2 個新文章。 + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + 連線到代理伺服器逾時或是在要求的時間內沒有回應 - - Failed to parse RSS feed at '%1'. Reason: %2 - 在「%1」解析 RSS feed 失敗。理由:%2 + + The proxy requires authentication in order to honor the request but did not accept any credentials offered + 為了執行請求,遠端代理伺服器要求認證,但提供的憑證不被接受 - - Couldn't read RSS Session data from %1. Error: %2 - 無法從 %1 讀取 RSS 工作階段資料。錯誤:%2 + + The access to the remote content was denied (401) + 存取遠端內容被拒絕 (401) - - Couldn't parse RSS Session data. Error: %1 - 無法解析 RSS 工作階段資料。錯誤:%1 + + The operation requested on the remote content is not permitted + 對遠端內容要求的操作不被允許 - - Couldn't load RSS Session data. Invalid data format. - 無法載入 RSS 工作階段資料。無效的資料格式。 + + The remote content was not found at the server (404) + 遠端內容在伺服器上找不到 (404) - - Couldn't load RSS article '%1#%2'. Invalid data format. - 無法載入 RSS 文章「%1#%2」。無效的資料格式。 + + The remote server requires authentication to serve the content but the credentials provided were not accepted + 為了提供內容,遠端代理伺服器要求認證,但提供的憑證不被接受 - - - RSS::Private::Parser - - Invalid RSS feed. - 無效的 RSS feed。 + + The Network Access API cannot honor the request because the protocol is not known + 因為未知的協定,網路存取 API 無法執行要求 + + + + The requested operation is invalid for this protocol + 要求的操作對於此協定是無效的 - - %1 (line: %2, column: %3, offset: %4). - %1(行:%2,欄:%3,偏移:%4)。 + + An unknown network-related error was detected + 偵測到一個未知的網路相關錯誤 + + + + An unknown proxy-related error was detected + 偵測到一個未知的代理伺服器相關錯誤 + + + + An unknown error related to the remote content was detected + 偵測到一個未知的遠端內容相關錯誤 + + + + A breakdown in protocol was detected + 偵測到一個協定錯誤 + + + + Unknown error + 未知的錯誤 + + + + + Upgrade + 更新 - - - RSS::Session - - RSS feed with given URL already exists: %1. - 給定 URL 的 RSS feed 已存在:%1。 + + You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n] + 您從一個較舊且以完全不同的方式儲存的版本更新。您必須遷移到新的儲存系統。您將無法再次使用比 v3.3.0 更舊的版本。要繼續嗎?[y/n] - - Cannot move root folder. - 無法移動根資料夾。 + + You updated from an older version that saved things differently. You must migrate to the new saving system. If you continue, you will not be able to use an older version than v3.3.0 again. + 您從一個較舊且以完全不同的方式儲存的版本更新。您必須遷移到新的儲存系統。如果要繼續,您將無法再次使用比 v3.3.0 更舊的版本。 - - - Item doesn't exist: %1. - 項目不存在:%1。 + + Couldn't migrate torrent with hash: %1 + 無法遷移雜湊值為 %1 的 torrent - - Cannot delete root folder. - 無法刪除根資料夾。 + + Couldn't migrate torrent. Invalid fastresume file name: %1 + 無法遷移 torrent。無效的快速恢復檔案名稱:%1 - - Incorrect RSS Item path: %1. - 不正確的 RSS 項目路徑:%1。 + + Detected unclean program exit. Using fallback file to restore settings. + 已偵測到不清潔的程式退出。正在使用後備檔案來復原設定。 - - RSS item with given path already exists: %1. - 給定路徑的 RSS 項目已存在:%1。 + + An access error occurred while trying to write the configuration file. + 嘗試寫入設定檔時發生存取錯誤。 - - Parent folder doesn't exist: %1. - 母資料夾不存在:%1。 + + A format error occurred while trying to write the configuration file. + 嘗試寫入設定檔時有格式錯誤。 - RSSWidget + RSS - + Search 搜尋 - - Fetching of RSS feeds is disabled now! You can enable it in application settings. - RSS feed 的抓取現在已停用!您可以在應用程式設定中啟用它。 - - - + New subscription 新訂閱 - - - + + + Mark items read 標記項目為已讀 - - Refresh RSS streams - 更新 RSS 資源 - - - + Update all 全部更新 - + RSS Downloader... - RSS 下載器... + RSS 下載器… + + + + Settings... + 設定… - + Torrents: (double-click to download) - Torrents:(按兩下以下載) + Torrent:(雙擊以下載) - - + + Delete 刪除 - + Rename... - 重新命名... + 重新命名… - + Rename 重新命名 - - + + Update 更新 - + New subscription... - 新訂閱... + 新訂閱… - - + + Update all feeds 更新全部 feed - + Download torrent 下載 torrent - + Open news URL 開啟消息 URL - + Copy feed URL 複製 feed URL - + New folder... - 新資料夾... + 新資料夾… + + + + Refresh RSS streams + 更新 RSS 資源 + + + + RSSImp + + + Stream URL: + 串流 URL: + + + + Please type a RSS stream URL + 請輸入一個 RSS 串流網址 + + + + This RSS feed is already in the list. + 這個 RSS feed 已經在清單裡了。 - + Please choose a folder name 請選擇資料夾名稱 - + Folder name: 資料夾名稱: - + New folder 新資料夾 - - Please type a RSS feed URL - 請輸入 RSS feed URL - - - - Feed URL: - Feed URL: - - - + Deletion confirmation 確認刪除 - + Are you sure you want to delete the selected RSS feeds? - 您確定您要刪除已選取的 RSS feeds 嗎? + 您是否確定要刪除選定的 RSS feeds? - + Please choose a new name for this RSS feed 請為這個 RSS feed 選擇新名稱 - + New feed name: 新 feed 名稱: - - Rename failed - 重新命名失敗 + + Name already in use + 此名稱已使用 + + + + This name is already used by another item, please choose another one. + 此名稱已被另一個項目使用,請選擇一個新的名稱。 - + Date: - 日期: + 日期: - + Author: 作者: + + + Unread + 未讀 + + + + Rss::Feed + + + Automatic download of '%1' from '%2' RSS feed failed because it doesn't contain a torrent or a magnet link... + 從「%2」RSS feed 自動下載的「%1」失敗,因為其不包含 torrent 或是磁力連結… + + + + Automatically downloading '%1' torrent from '%2' RSS feed... + 正在從「%2」RSS feed 自動下載「%1」torrent… + + + + Rss::Private::Parser + + + Invalid RSS feed. + 無效的 RSS feed。 + + + + RssSettingsDlg + + + RSS Reader Settings + RSS 閱讀器設定 + + + + RSS feeds refresh interval: + RSS feed 更新間隔: + + + + min + 分鐘 + + + + Maximum number of articles per feed: + 每個 feed 的最大文章數: + ScanFoldersDelegate - + Select save location 選取儲存位置 @@ -7447,473 +6703,454 @@ ScanFoldersModel - + Monitored Folder 已監視的資料夾 - + Override Save Location 覆寫儲存位置 - + Monitored folder 已監視的資料夾 - + Default save location 預設儲存位置 - + Browse... 瀏覽… - SearchJobWidget + SearchEngine - - Form - + + Unknown search engine plugin file format. + 未知的搜尋引擎外掛檔案格式。 - - Results(xxx) - + + A more recent version of this plugin is already installed. + 已安裝更新版本的此搜尋引擎外掛。 - - Search in: - + + + Plugin is not supported. + 不支援的外掛。 - - <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everything returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> - + + Update server is temporarily unavailable. %1 + 更新伺服器暫時不可用。%1 - - <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> - + + + Failed to download the plugin file. %1 + 下載外掛檔案失敗。%1 - - Seeds: - 種子: + + An incorrect update info received. + 收到不正確的更新資訊。 - - <html><head/><body><p>Minimal number of seeds</p></body></html> - + + All categories + 所有類別 - - - to - + + Movies + 電影 - - <html><head/><body><p>Maximal number of seeds</p></body></html> - + + TV shows + 電視節目 - - - - + + Music + 音樂 - - <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> - + + Games + 遊戲 - - Size: - 大小: + + Anime + 動畫 - - <html><head/><body><p>Minimal torrent size</p></body></html> - + + Software + 軟體 - - <html><head/><body><p>Maximal torrent size</p></body></html> - + + Pictures + 圖片 + + + + Books + 書籍 + + + + SearchListDelegate + + + + Unknown + 未知 + + + SearchTab - + Name i.e: file name - 名稱 + 名稱 - + Size i.e: file size - 大小 + 大小 - + Seeders i.e: Number of full sources - + 種子 - + Leechers i.e: Number of partial sources - + 不完整種子 - + Search engine - - - - - Filter search results... - + 搜尋引擎 - + Results (showing <i>%1</i> out of <i>%2</i>): i.e: Search results - + 搜尋結果 (顯示<i>%2</i>中的<i>%1</i>個): - + Torrent names only - + 僅 torrent 名稱 - + Everywhere - - - - - Use regular expressions - + 各處 - + Searching... - + 搜尋中… - + Search has finished - 搜尋完成 + 搜尋完成 - + Search aborted - + 搜尋中止 - + An error occurred during search... - + 搜尋時發生錯誤… - + Search returned no results - + 沒有搜尋結果 - + Column visibility 欄目顯示 - - - SearchPluginManager - - Unknown search engine plugin file format. - 未知的搜尋引擎外掛程式檔案格式。 + + Form + - - A more recent version of this plugin is already installed. - 已安裝此外掛程式的較新版本。 + + Results(xxx) + 結果 (xxx) - - - Plugin is not supported. - 不支援的外掛程式。 + + Search in: + 搜尋: - - All categories - 所有分類 + + <html><head/><body><p>Some search engines search in torrent description and in torrent file names too. Whether such results will be shown in the list below is controlled by this mode.</p><p><span style=" font-weight:600;">Everywhere </span>disables filtering and shows everyhing returned by the search engines.</p><p><span style=" font-weight:600;">Torrent names only</span> shows only torrents whose names match the search query.</p></body></html> + <html><head/><body><p>有些搜尋引擎同時掃瞄 torrent 檔名和 torrent 描述。請選擇是否於下方清單中顯示相關結果。</p><p><span style=" font-weight:600;">各處</span>:不作過濾,顯示所有搜尋結果。</p><p><span style=" font-weight:600;">僅 torrent 名稱:僅顯示與 torrent 名稱符合的項目。</p></body></html> - - Movies - 電影 + + <html><head/><body><p>Set minimal and maximal allowed number of seeders</p></body></html> + <html><head/><body><p>設定種子數量的上下限</p></body></html> - - TV shows - 電視節目 + + Seeds: + 種子: - - Music - 音樂 + + <html><head/><body><p>Minimal number of seeds</p></body></html> + <html><head/><body><p>種子數量下限</p></body></html> - - Games - 遊戲 + + + to + - - Anime - 動畫 + + <html><head/><body><p>Maximal number of seeds</p></body></html> + <html><head/><body><p>種子數量上限</p></body></html> - - - Software - 軟體 + + + + + 無限 - - Pictures - 照片 + + <html><head/><body><p>Set minimal and maximal allowed size of a torrent</p></body></html> + <html><head/><body><p>設定 torrent 大小的上下限</p></body></html> - - Books - 書籍 + + Size: + 大小: - - Update server is temporarily unavailable. %1 - 更新伺服器暫時不可用。%1 + + <html><head/><body><p>Minimal torrent size</p></body></html> + <html><head/><body><p>Torrent 大小下限</p></body></html> - - - Failed to download the plugin file. %1 - 下載外掛程式檔案失敗。%1 + + <html><head/><body><p>Maximal torrent size</p></body></html> + <html><head/><body><p>Torrent 大小上限</p></body></html> - - - An incorrect update info received. - 收到不正確的更新資訊。 - - - - Search plugin '%1' contains invalid version string ('%2') - 搜尋外掛程式「%1」包含了無效的版本字串(「%2」) - - - - SearchWidget + + + SearchWidget - - - - + + + Search 搜尋 - - There aren't any search plugins installed. -Click the "Search plugins..." button at the bottom right of the window to install some. - 沒有安裝任何搜尋外掛程式。 -點選視窗右下角的「搜尋外掛程式...」按鈕來安裝一些吧。 - - - + Download 下載 - + Go to description page 到描述頁 - + Copy description page URL 複製描述頁面的 URL - + Search plugins... 搜尋外掛… - + A phrase to search for. 搜尋的片語: - + Spaces in a search term may be protected by double quotes. 維持搜尋片語的完整,請使用英語雙引號。 - + Example: Search phrase example 範例: - + <b>foo bar</b>: search for <b>foo</b> and <b>bar</b> Search phrase example, illustrates quotes usage, a pair of space delimited words, individal words are highlighted <b>foo bar</b>會搜尋<b>foo</b>和<b>bar</b>兩個單字 - + <b>&quot;foo bar&quot;</b>: search for <b>foo bar</b> Search phrase example, illustrates quotes usage, double quotedpair of space delimited words, the whole pair is highlighted <b>&quot;foo bar&quot;</b>會搜尋片語<b>foo bar</b> - + All plugins 所有外掛 - + Only enabled 僅已啟用 - + Select... 選取… - - - + + + Search Engine 搜尋引擎 - + Please install Python to use the Search Engine. 請安裝 Python 以使用搜尋引擎。 - + Empty search pattern 沒有搜尋模式 - + Please type a search pattern first 請先輸入一個搜尋模式 - + Stop 停止 - + Search has finished 搜尋完成 - + Search has failed 搜尋失敗 - ShutdownConfirmDialog - - - Don't show again - - + ShutdownConfirmDlg - + qBittorrent will now exit. - + qBittorrent 現在關閉。 - + E&xit Now - + 現在離開 - + Exit confirmation - + 確認離開 - + The computer is going to shutdown. - + 電腦將關機。 - + &Shutdown Now - - - - - Shutdown confirmation - + 現在關機 - + The computer is going to enter suspend mode. - + 電腦將暫停。 - + &Suspend Now - + 現在暫停 - + Suspend confirmation - + 確認暫停 - + The computer is going to enter hibernation mode. - + 電腦將休眠。 - + &Hibernate Now - + 現在休眠 - + Hibernate confirmation - + 確認休眠 - + You can cancel the action within %1 seconds. - + 可於 %1 秒內取消。 + + + + Shutdown confirmation + 確認關機 SpeedLimitDialog - + KiB/s KiB/s @@ -7921,52 +7158,52 @@ SpeedPlotView - + Total Upload 總上傳 - + Total Download 總下載 - + Payload Upload 酬載上傳 - + Payload Download 酬載下載 - + Overhead Upload 經常消耗上傳 - + Overhead Download 經常消耗下載 - + DHT Upload DHT 上傳 - + DHT Download DHT 下載 - + Tracker Upload 追蹤者上傳 - + Tracker Download 追蹤者下載 @@ -7974,95 +7211,87 @@ SpeedWidget - + Period: 週期: - + 1 Minute 1 分鐘 - + 5 Minutes 5 分鐘 - + 30 Minutes 30 分鐘 - + 6 Hours 6 小時 - + Select Graphs 選取圖表 - + Total Upload 總上傳 - + Total Download 總下載 - + Payload Upload 酬載上傳 - + Payload Download 酬載下載 - + Overhead Upload 經常消耗上傳 - + Overhead Download 經常消耗下載 - + DHT Upload DHT 上傳 - + DHT Download DHT 下載 - + Tracker Upload 追蹤者上傳 - + Tracker Download 追蹤者下載 - StacktraceDialog - - - Crash info - - - - StatsDialog @@ -8075,48 +7304,48 @@ 使用者的統計資料 - - Cache statistics - 緩存的統計資料 + + Total peer connections: + 總下載者連線: - - Read cache hits: - 讀取快取次數: + + Global ratio: + 全域比率: - - Average time in queue: - 在隊列中的平均時間: + + Alltime download: + 所有下載: - - Connected peers: - 已連線的下載者: + + Alltime upload: + 所有上傳: - - All-time share ratio: - 全時間分享速率: + + Total waste (this session): + 總浪費 (此作業階段): - - All-time download: - 全時間下載: + + Cache statistics + 緩存的統計資料 - - Session waste: - 工作階段丟棄: + + Read cache hits: + 讀取快取次數: - - All-time upload: - 全時間上傳: + + Average time in queue: + 在隊列中的平均時間: - Total buffer size: + Total buffers size: 總緩衝大小: @@ -8145,7 +7374,12 @@ 總隊列大小: - + + OK + 確定 + + + %1 ms 18 milliseconds %1 毫秒 @@ -8154,27 +7388,32 @@ StatusBar - + Connection status: 連線狀態: - + No direct connections. This may indicate network configuration problems. 沒有直接的連線。這表示您的網路設定可能有問題。 - + DHT: %1 nodes DHT:%1 個節點 - - qBittorrent needs to be restarted! - qBittorrent 需要重新啟動! + + qBittorrent needs to be restarted + qBittorrent 需要重新啟動 + + + + qBittorrent was just updated and needs to be restarted for the changes to be effective. + qBittorrent 已經更新了並且需要重新啟動。 @@ -8193,1566 +7432,1311 @@ 線上 - + Click to switch to alternative speed limits 點選來切換至額外的速度限制 - + Click to switch to regular speed limits 點選來切換至一般的速度限制 - + + Manual change of rate limits mode. The scheduler is disabled. + 手動變更限速模式。排程器已停用。 + + + Global Download Speed Limit 全域下載速度限制 - + Global Upload Speed Limit 全域上傳速度限制 - StatusFilterWidget + StatusFiltersWidget - + All (0) this is for the status filter - 全部 (0) + 全部 (0) - + Downloading (0) - + 下載中 (0) - + Seeding (0) - + 做種中 (0) - + Completed (0) - + 已完成 (0) - + Resumed (0) - + 繼續 (0) - + Paused (0) - + 暫停 (0) - + Active (0) - + 活躍的 (0) - + Inactive (0) - + 不活躍的 (0) - + Errored (0) - + 錯誤 (0) - + All (%1) - 全部 (%1) + 全部 (%1) - + Downloading (%1) - + 下載中 (%1) - + Seeding (%1) - + 做種中 (%1) - + Completed (%1) - + 已完成 (%1) - + Paused (%1) - + 暫停 (%1) - + Resumed (%1) - + 繼續 (%1) - + Active (%1) - + 活躍的 (%1) - + Inactive (%1) - + 不活躍的 (%1) - + Errored (%1) - + 錯誤 (%1) - TagFilterModel + TorrentContentModel - - Tags - 標籤 + + Name + 名稱 - - All - 所有 + + Size + 大小 - - Untagged - 未標籤 + + Progress + 進度 - - - TagFilterWidget - - Add tag... - 新增標籤... + + Download Priority + 下載優先度 - - Remove tag - 移除標籤 + + Remaining + 剩餘的 + + + TorrentCreatorDlg - - Remove unused tags - 移除未使用的標籤 + + Select a folder to add to the torrent + 選擇要增加到 torrent 的資料夾 - - Resume torrents - 繼續 torrent + + Select a file to add to the torrent + 選擇要增加到 torrent 的檔案 - - Pause torrents - 暫停 torrent + + No input path set + 沒有設定輸入路徑 - - Delete torrents - 刪除 torrent + + Please type an input path first + 請先輸入輸入的路徑 - - New Tag - 新標籤 + + Select destination torrent file + 選擇 torrent 檔案目的地 - - Tag: - 標籤: + + Torrent Files (*.torrent) + Torrent 檔案 (*.torrent) - - Invalid tag name - 無效的標籤名稱 + + Torrent was created successfully: %1 + %1 is the path of the torrent + 已經成功建立 torrent:%1 - - Tag name '%1' is invalid - 標籤名稱 '%1' 無效 + + + + Torrent creation + 產生 torrent - - Tag exists - 已有此標籤 + + Torrent creation was unsuccessful, reason: %1 + 建立 torrent 不成功,原因:%1 - - Tag name already exists. - 已有此標籤名稱。 + + Created torrent file is invalid. It won't be added to download list. + 建立的 torrent 檔案是無效的。它不會被加入到下載清單。 - TorrentCategoryDialog + TorrentModel - - Torrent Category Properties - Torrent 分類屬性 + + Name + i.e: torrent name + 名稱 - - Name: - 名稱: + + Size + i.e: torrent size + 大小 - - Save path: - 儲存路徑: + + Done + % Done + 完成 - - Choose save path - 選擇儲存路徑 + + Status + Torrent status (e.g. downloading, seeding, paused) + 狀態 - - New Category - 新分類 + + Seeds + i.e. full sources (often untranslated) + 種子 - - Invalid category name - 無效的分類名稱 + + Peers + i.e. partial sources (often untranslated) + 下載者 - - Category name cannot contain '\'. -Category name cannot start/end with '/'. -Category name cannot contain '//' sequence. - 分類名稱不能包含 '\'。 -分類名稱不能以 '/' 開始或結束。 -分類名稱不能包含 '//' 序列。 - - - - Category creation error - 分類建立錯誤 - - - - Category with the given name already exists. -Please choose a different name and try again. - 指定名稱的分類已經存在。 -請選擇一個不同的名稱並再試一次。 + + Down Speed + i.e: Download speed + 下載速度 - - - TorrentContentModel - - Name - 名稱 + + Up Speed + i.e: Upload speed + 上傳速度 - - Size - 大小 + + Ratio + Share ratio + 分享率 - - Progress - 進度 + + ETA + i.e: Estimated Time of Arrival / Time left + 預估剩餘時間 - - Download Priority - 下載優先度 + + Category + 分類 - - Remaining - 剩餘的 + + Added On + Torrent was added to transfer list on 01/01/2010 08:00 + 增加於 - - Availability - 可得性 + + Completed On + Torrent was completed on 01/01/2010 08:00 + 完成於 - - - TorrentCreatorDialog - - Torrent Creator - + + Tracker + 追蹤者 - - Select file/folder to share - + + Down Limit + i.e: Download limit + 下載限制 - - Path: - + + Up Limit + i.e: Upload limit + 上傳限制 - - [Drag and drop area] - + + Downloaded + Amount of data downloaded (e.g. in MB) + 已下載 - - - Select file - + + Uploaded + Amount of data uploaded (e.g. in MB) + 已上傳 - - - Select folder - + + Session Download + Amount of data downloaded since program open (e.g. in MB) + 作業期間已下載 - - Settings - + + Session Upload + Amount of data uploaded since program open (e.g. in MB) + 作業期間已上傳 - - Piece size: - + + Remaining + Amount of data left to download (e.g. in MB) + 剩餘的 - - Auto - + + Time Active + Time (duration) the torrent is active (not paused) + 經過時間 - - 16 KiB - + + Save path + Torrent save path + 儲存路徑 - - 32 KiB - + + Completed + Amount of data completed (e.g. in MB) + 已完成 - - 64 KiB - + + Ratio Limit + Upload share ratio limit + 分享率限制 - - 128 KiB - + + Last Seen Complete + Indicates the time when the torrent was last seen complete/whole + 最後完整可見 - - 256 KiB - + + Last Activity + Time passed since a chunk was downloaded/uploaded + 最後活動 - - 512 KiB - - - - - 1 MiB - - - - - 2 MiB - - - - - 4 MiB - - - - - 8 MiB - - - - - 16 MiB - - - - - 32 MiB - - - - - Calculate number of pieces: - - - - - Private torrent (Won't distribute on DHT network) - - - - - Start seeding immediately - - - - - Ignore share ratio limits for this torrent - - - - - Optimize alignment - - - - - Fields - - - - - You can separate tracker tiers / groups with an empty line. - A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. - - - - - Web seed URLs: - - - - - Tracker URLs: - - - - - Comments: - - - - - Source: - - - - - Progress: - 進度: - - - - Create Torrent - - - - - - - Torrent creation failed - - - - - Reason: Path to file/folder is not readable. - - - - - Select where to save the new torrent - - - - - Torrent Files (*.torrent) - - - - - Reason: %1 - - - - - Reason: Created torrent is invalid. It won't be added to download list. - - - - - Torrent creator - - - - - Torrent created: - - - - - TorrentInfo - - - File size exceeds max limit %1 - 檔案大小超過上限 %1 - - - - Torrent file read error: %1 - - - - - Torrent file read error: size mismatch - - - - - TorrentsController - - - Not contacted yet - 尚未連線 - - - - Updating... - 正在更新…… - - - - Working - 正在運作 - - - - Not working - 沒有運作 - - - - Error: '%1' is not a valid torrent file. - 錯誤:「%1」不是有效的 torrent 檔案。 - - - - - - - Torrent queueing must be enabled - Torrent 佇列必須啟用 - - - - Save path cannot be empty - - - - - - Category cannot be empty - - - - - Unable to create category - - - - - Unable to edit category - - - - - Cannot make save path - - - - - Cannot write to directory - - - - - WebUI Set location: moving "%1", from "%2" to "%3" - WebUI 設定位置:正在移動「%1」,從「%2」到「%3」 - - - - Incorrect torrent name - 不正確的 torrent 名稱 - - - - - Incorrect category name - 不正確的分類名稱 + + Total Size + i.e. Size including unwanted data + 總大小 TrackerFiltersList - + All (0) this is for the tracker filter 全部 (0) - + Trackerless (0) 缺少追蹤者 (0) - + Error (0) 錯誤 (0) - + Warning (0) 警告 (0) - - + + Trackerless (%1) 缺少追蹤者 (%1) - - + %1 (%2) + openbittorrent.com (10) + %1 (%2) + + + + Error (%1) 錯誤 (%1) - - + + Warning (%1) 警告 (%1) - + Resume torrents 繼續 torrent - + Pause torrents 暫停 torrent - + Delete torrents 刪除 torrent - - + + All (%1) this is for the tracker filter 全部 (%1) - TrackerListWidget + TrackerList - - - Working - 正在運作 + + URL + URL - - Disabled - 已停用 + + Status + 狀態 - - This torrent is private + + Received - - Updating... - 正在更新…… - - - - Not working - 沒有運作 - - - - Not contacted yet - 尚未連線 + + Seeds + 種子 - - - - - - - N/A - N/A + + Peers + 下載者 - - Tracker editing - + + Downloaded + 已下載 - - Tracker URL: - + + Message + 訊息 - - - Tracker editing failed - + + + Working + 有效 - - The tracker URL entered is invalid. - + + Disabled + 已停用 - - The tracker URL already exists. - + + This torrent is private + 這是私有 torrent - - Add a new tracker... - + + Updating... + 更新中… - - Remove tracker - + + Not working + 無效 - - Copy tracker URL - + + Not contacted yet + 尚未連接 - - Edit selected tracker URL - + + Tracker URL: + 追蹤者 URL: - - Force reannounce to selected trackers - + + Tracker editing + 編輯追蹤者 - - Force reannounce to all trackers - + + + Tracker editing failed + 編輯追蹤者失敗 - - URL - + + The tracker URL entered is invalid. + 無效的追蹤者 URL - - Status - 狀態 + + The tracker URL already exists. + 追蹤者 URL 已經存在 - - Received - + + Add a new tracker... + 增加新追蹤者… - - Seeds - + + Copy tracker URL + 複製追蹤者 URL - - Peers - 下載者 + + Edit selected tracker URL + 編輯選取的追蹤者 URL - - Downloaded - 已下載 + + Force reannounce to selected trackers + 強制再次發佈到被選的追蹤者 - - Message - + + Force reannounce to all trackers + 強制再次發佈到所有追蹤者 - - Column visibility - 欄目顯示 + + Remove tracker + 移除追蹤者 - TrackerLoginDialog - - - - Tracker authentication - - + TrackersAdditionDlg - - Tracker: - - - - - Login - 登入 - - - - Username: - 使用者名稱: - - - - Password: - 密碼: + + Trackers addition dialog + 增加追蹤者對話框 - - Log in - + + List of trackers to add (one per line): + 要增加的追蹤者清單 (一行一個): - - - TrackersAdditionDialog - - - Trackers addition dialog - + + + µTorrent compatible list URL: + µTorrent 相容清單 URL: - - List of trackers to add (one per line): - + + I/O Error + I/O 錯誤 - - µTorrent compatible list URL: - + + Error while trying to open the downloaded file. + 嘗試開啟已下載的檔案時發生錯誤。 - + No change - + 沒有改變 - + No additional trackers were found. - + 沒有找到額外的追蹤者。 - + Download error - 下載錯誤 + 下載錯誤 - + The trackers list could not be downloaded, reason: %1 - + 無法下載追蹤者清單,原因:%1 TransferListDelegate - + Downloading 下載中 - + Downloading metadata used when loading a magnet link 中介資料下載中 - + Allocating qBittorrent is allocating the files on disk 分配中 - + Paused 暫停 - + Queued i.e. torrent is queued 佇列 - + Seeding Torrent is complete and in upload-only mode 做種中 - + Stalled Torrent is waiting for download to begin 等待開始 - + [F] Downloading used when the torrent is forced started. You probably shouldn't translate the F. 強制下載 - + [F] Seeding used when the torrent is forced started. You probably shouldn't translate the F. 強制做種 - + Checking Torrent local data is being checked 檢查中 - + Queued for checking i.e. torrent is queued for hash checking 正等待查核中 - + Checking resume data used when loading the torrents from disk after qbt is launched. It checks the correctness of the .fastresume file. Normally it is completed in a fraction of a second, unless loading many many torrents. - 正在檢查復原資料 + 正在檢查恢複數據 - + Completed 已完成 - - Moving - Torrent local data are being moved/relocated - 正在移動 - - - + Missing Files 遺失的檔案 - - Errored - torrent status, the torrent has an error - 錯誤 - - - - %1 (seeded for %2) - e.g. 4m39s (seeded for 3m10s) - %1 (已做種 %2) - - - - %1 ago - e.g.: 1h 20m ago - %1 前 - - - - TransferListFiltersWidget - - - Status - 狀態 - - - - Categories - 分類 - - - - Tags - 標籤 - - - - Trackers - 追蹤者 - - - - TransferListModel - - - Name - i.e: torrent name - 名稱 - - - - Size - i.e: torrent size - 大小 - - - - Done - % Done - - - - - Status - Torrent status (e.g. downloading, seeding, paused) - 狀態 - - - - Seeds - i.e. full sources (often untranslated) - - - - - Peers - i.e. partial sources (often untranslated) - 下載者 - - - - Down Speed - i.e: Download speed - 下載速度 - - - - Up Speed - i.e: Upload speed - 上傳速度 - - - - Ratio - Share ratio - - - - - ETA - i.e: Estimated Time of Arrival / Time left - - - - - Category - 分類 - - - - Tags - 標籤 - - - - Added On - Torrent was added to transfer list on 01/01/2010 08:00 - - - - - Completed On - Torrent was completed on 01/01/2010 08:00 - - - - - Tracker - - - - - Down Limit - i.e: Download limit - - - - - Up Limit - i.e: Upload limit - - - - - Downloaded - Amount of data downloaded (e.g. in MB) - 已下載 - - - - Uploaded - Amount of data uploaded (e.g. in MB) - 已上傳 - - - - Session Download - Amount of data downloaded since program open (e.g. in MB) - - - - - Session Upload - Amount of data uploaded since program open (e.g. in MB) - - - - - Remaining - Amount of data left to download (e.g. in MB) - 剩餘的 - - - - Time Active - Time (duration) the torrent is active (not paused) - - - - - Save path - Torrent save path - + + Errored + torrent status, the torrent has an error + 錯誤 - - Completed - Amount of data completed (e.g. in MB) - 已完成 + + %1 (seeded for %2) + e.g. 4m39s (seeded for 3m10s) + %1 (已做種 %2) - - Ratio Limit - Upload share ratio limit - + + %1 ago + e.g.: 1h 20m ago + %1 前 + + + TransferListFiltersWidget - - Last Seen Complete - Indicates the time when the torrent was last seen complete/whole - + + Status + 狀態 - - Last Activity - Time passed since a chunk was downloaded/uploaded - + + Categories + 分類 - - Total Size - i.e. Size including unwanted data - + + Trackers + 追蹤者 TransferListWidget - + Column visibility 欄目顯示 - + Choose save path 選擇儲存路徑 - + Torrent Download Speed Limiting Torrent 下載速度限制 - + Torrent Upload Speed Limiting Torrent 上傳速度限制 - + Recheck confirmation 確認重新檢查 - + Are you sure you want to recheck the selected torrent(s)? 確定要重新檢查選取的 torrent(s) 嗎? - + Rename 重新命名 - + New name: 新名稱: - + Resume Resume/start the torrent 繼續 - + Force Resume Force Resume/start the torrent 強制繼續 - + Pause Pause the torrent 暫停 - - Set location: moving "%1", from "%2" to "%3" - Set location: moving "ubuntu_16_04.iso", from "/home/dir1" to "/home/dir2" - 設定位置:正在移動「%1」,從「%2」到「%3」 - - - - Add Tags - 新增標籤 - - - - Remove All Tags - 移除所有標籤 - - - - Remove all tags from selected torrents? - 從選定的 torrent 中移除所有標籤? + + New Category + 新分類 - - Comma-separated tags: - 逗點分隔標籤: + + Category: + 分類: - - Invalid tag - 無效的標籤 + + Invalid category name + 無效的分類名稱 - - Tag name: '%1' is invalid - 標籤名稱:'%1' 無效 + + Category name must not contain '\'. +Category name must not start/end with '/'. +Category name must not contain '//' sequence. + 分類名稱不應該包含「\」。 +分類名稱不應該以「/」開頭或結尾。 +分類名稱不應該包含「//」序列。 - + Delete Delete the torrent 刪除 - + Preview file... 預覽檔案… - + Limit share ratio... 限制分享率… - + Limit upload rate... 限制上傳速度… - + Limit download rate... 限制下載速度… - + Open destination folder 開啟目的地資料夾 - + Move up i.e. move up in the queue 向上移 - + Move down i.e. Move down in the queue 向下移 - + Move to top i.e. Move to top of the queue 移到最上面 - + Move to bottom i.e. Move to bottom of the queue 移到最下面 - + Set location... 設定位置… - - Force reannounce - 強制重新發佈 - - - + Copy name 複製名稱 - - Copy hash - 複製雜湊值 - - - + Download first and last pieces first 先下載第一和最後一塊 - + Automatic Torrent Management 自動 torrent 管理 - + Automatic mode means that various torrent properties(eg save path) will be decided by the associated category 自動模式代表了多個 torrent 屬性 (例如儲存路徑) 將會由相關的分類來決定 - + Category 分類 - + New... New category... 新… - + Reset Reset category 重設 - - Tags - 標籤 - - - - Add... - Add / assign multiple tags... - 新增... - - - - Remove All - Remove all tags - 移除所有 - - - + Priority 優先度 - + Force recheck 強制重新檢查 - + Copy magnet link - 複製磁力連結 + 複製磁性連結 - + Super seeding mode 超級種子模式 - + Rename... 重新命名… - + Download in sequential order 依順序下載 - UpDownRatioDialog + UpDownRatioDlg - + Torrent Upload/Download Ratio Limiting - + Torrent 上傳╱下載比率限制 - - Use global share limit - + + Use global ratio limit + 使用全域比率限制 - - - + + + buttonGroup - + 按鈕群組 - - Set no share limit - + + Set no ratio limit + 設定無比率限制 - - Set share limit to - + + Set ratio limit to + 設定限制比率至 + + + WebApplication - - ratio - + + Incorrect category name + 不正確的分類名稱 + + + WebUI - - minutes - + + The Web UI is listening on port %1 + Web UI 正在監聽的埠為:%1 - - No share limit method selected - + + Web UI Error - Unable to bind Web UI to port %1 + Web UI 錯誤:無法綁定 Web UI 到埠 %1 + + + about - - Please select a limit method first - + + An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar. + 一個以 C++ 撰寫,基於 Qt 工具箱和 libtorrent-rasterbar 的進階 BitTorrent 客戶端。 + + + + Copyright %1 2006-2016 The qBittorrent project + Copyright %1 2006-2016 The qBittorrent project + + + + Home Page: + 首頁: + + + + Forum: + 論壇: + + + + Bug Tracker: + 遞交錯誤報告: - Utils::ForeignApps + addPeersDialog - - Python detected, version: %1 - + + Add Peers + 新增下載者 - - Python not detected - + + List of peers to add (one per line): + 要新增的下載者列表 (每行一個): + + + + Format: IPv4:port / [IPv6]:port + 格式:IPv4:埠/[IPv6]:埠 - WebApplication + authentication + + + + Tracker authentication + 追蹤者驗證 + - - Unacceptable file type, only regular file is allowed. - 無法接受的檔案類型,僅允許一般檔案。 + + Tracker: + 追蹤者: + + + + Login + 登入 + + + + Username: + 使用者名稱: - - Symlinks inside alternative UI folder are forbidden. - 在替代 UI 資料夾中的符號連結是被禁止的。 + + Password: + 密碼: - - Exceeded the maximum allowed file size (%1)! - 超過允許的最大檔案大小(%1)! + + Log in + 登入 - - WebUI: Origin header & Target origin mismatch! Source IP: '%1'. Origin header: '%2'. Target origin: '%3' - WebUI:來源檔頭與目標原始不相符!來源 IP:「%1」。來源檔頭:「%2」。目標原始:「%3」 + + Cancel + 取消 + + + confirmDeletionDlg - - WebUI: Referer header & Target origin mismatch! Source IP: '%1'. Referer header: '%2'. Target origin: '%3' - WebUI:Referer 檔頭與目標原始不符合!來源 IP:「%1」。Referer 檔頭:「%2」。目標原始:「%3」 + + Deletion confirmation - qBittorrent + 刪除確認 - qBittorrent - - WebUI: Invalid Host header, port mismatch. Request source IP: '%1'. Server port: '%2'. Received Host header: '%3' - WebUI:無效的主機檔頭,port 不符合。請求來源 IP:「%1」。伺服器 port:「%2」。收到主機檔頭:「%3」 + + Remember choice + 記住選擇 - - WebUI: Invalid Host header. Request source IP: '%1'. Received Host header: '%2' - WebUI:無效的主機檔頭。請求來源 IP:「%1」。收到主機檔頭:「%2」 + + Also delete the files on the hard disk + 也把硬碟裡的檔案刪除 - WebUI + confirmShutdownDlg + + + Don't show again + 不要再顯示 + + + + createTorrentDialog + + + Cancel + 取消 + + + + Torrent Creation Tool + Torrent 製作器 + + + + Torrent file creation + 建立 torrent 檔案 + + + + Add file + 增加檔案 + + + + Add folder + 增加資料夾 + + + + File or folder to add to the torrent: + 要增加到 torrent 裡的檔案或資料夾: + + + + Tracker URLs: + 追蹤者 URL: + + + + Web seeds urls: + 網頁種子 URL: + + + + Comment: + 註解: + + + + You can separate tracker tiers / groups with an empty line. + A tracker tier is a group of trackers, consisting of a main tracker and its mirrors. + 您可以用一行空白行分離追蹤者線程╱群組。 + + + + Piece size: + 分塊大小: + + + + 16 KiB + 16 KiB + + + + 32 KiB + 32 KiB + + + + 64 KiB + 64 KiB + + + + 128 KiB + 128 KiB + + + + 256 KiB + 256 KiB + + + + 512 KiB + 512 KiB + + + + 1 MiB + 1 MiB + + + + 2 MiB + 2 MiB + + + + 4 MiB + 4 MiB + + + + 8 MiB + 8 MiB + + + + 16 MiB + 16 MiB + + + + Auto + 自動 + + + + Private (won't be distributed on DHT network if enabled) + 私人的 (如果啟用,不會發佈到 DHT 網路) + + + + Start seeding after creation + 製作後開始做種 + + + + Ignore share ratio limits for this torrent + 忽略此 torrent 的分享比率設定 + + + + Create and save... + 建立且儲存… + + + + Progress: + 進度: + + + + downloadFromURL + + + Add torrent links + 增加 torrent 連結 + + + + One per line (HTTP links, Magnet links and info-hashes are supported) + 一行一條 (HTTP 連結、磁性連結及資訊雜湊值皆支援) + + + + Download + 下載 + + + + Cancel + 取消 + - - Web UI: HTTPS setup successful - Web UI:HTTPS 設定成功 + + Download from urls + 從 URL 下載 - - Web UI: HTTPS setup failed, fallback to HTTP - Web UI:HTTPS 設定失敗,退回至 HTTP + + No URL entered + 沒有輸入 URL - - Web UI: Now listening on IP: %1, port: %2 - Web UI:正在監聽 IP:%1,連接埠:%2 + + Please type at least one URL. + 請輸入至少一個 URL。 + + + errorDialog - - Web UI: Unable to bind to IP: %1, port: %2. Reason: %3 - Web UI:無法綁定到 IP:%1,連接埠:%2。理由:%3 + + Crash info + 崩潰資訊 fsutils - + + + + + Downloads 下載 @@ -9760,100 +8744,140 @@ misc - + B bytes B - + KiB kibibytes (1024 bytes) KiB - + MiB mebibytes (1024 kibibytes) MiB - + GiB gibibytes (1024 mibibytes) GiB - + TiB tebibytes (1024 gibibytes) TiB - + PiB pebibytes (1024 tebibytes) PiB - + EiB exbibytes (1024 pebibytes) EiB - + + Python not detected + 未偵測到 Python + + + + Python version: %1 + Python 版本:%1 + + + /s per second /s - + %1h %2m e.g: 3hours 5minutes %1 小時 %2 分鐘 - + %1d %2h e.g: 2days 10hours %1 天 %2 小時 - + Unknown Unknown (size) 未知 - + qBittorrent will shutdown the computer now because all downloads are complete. 因為所有下載已經完成,qBittorrent 現在會將電腦關機。 - + < 1m < 1 minute < 1 分鐘 - + %1m e.g: 10minutes %1 分鐘 + + + Working + 有效 + + + + Updating... + 更新中… + + + + Not working + 無效 + + + + Not contacted yet + 尚未連接 + preview - + Preview selection 選擇預覽 - + The following files support previewing, please select one of them: 以下檔案支援預覽,請從中選取: + + + Preview + 預覽 + + + + Cancel + 取消 + diff -Nru qbittorrent-4.1.3/src/lang.qrc qbittorrent-3.3.15/src/lang.qrc --- qbittorrent-4.1.3/src/lang.qrc 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/lang.qrc 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,54 @@ + + + lang/qbittorrent_ar.qm + lang/qbittorrent_be.qm + lang/qbittorrent_bg.qm + lang/qbittorrent_ca.qm + lang/qbittorrent_cs.qm + lang/qbittorrent_da.qm + lang/qbittorrent_de.qm + lang/qbittorrent_el.qm + lang/qbittorrent_en.qm + lang/qbittorrent_en_AU.qm + lang/qbittorrent_en_GB.qm + lang/qbittorrent_es.qm + lang/qbittorrent_eo.qm + lang/qbittorrent_eu.qm + lang/qbittorrent_fi.qm + lang/qbittorrent_fr.qm + lang/qbittorrent_gl.qm + lang/qbittorrent_he.qm + lang/qbittorrent_hi_IN.qm + lang/qbittorrent_hr.qm + lang/qbittorrent_hu.qm + lang/qbittorrent_hy.qm + lang/qbittorrent_id.qm + lang/qbittorrent_is.qm + lang/qbittorrent_it.qm + lang/qbittorrent_ja.qm + lang/qbittorrent_ka.qm + lang/qbittorrent_ko.qm + lang/qbittorrent_lv_LV.qm + lang/qbittorrent_lt.qm + lang/qbittorrent_ms_MY.qm + lang/qbittorrent_nb.qm + lang/qbittorrent_nl.qm + lang/qbittorrent_oc.qm + lang/qbittorrent_pl.qm + lang/qbittorrent_pt_PT.qm + lang/qbittorrent_pt_BR.qm + lang/qbittorrent_ro.qm + lang/qbittorrent_ru.qm + lang/qbittorrent_sk.qm + lang/qbittorrent_sl.qm + lang/qbittorrent_sr.qm + lang/qbittorrent_sv.qm + lang/qbittorrent_tr.qm + lang/qbittorrent_uk.qm + lang/qbittorrent_uz@Latn.qm + lang/qbittorrent_vi.qm + lang/qbittorrent_zh.qm + lang/qbittorrent_zh_TW.qm + lang/qbittorrent_zh_HK.qm + + Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/qbittorrent_file.ico and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/qbittorrent_file.ico differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/qbittorrent.ico and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/qbittorrent.ico differ diff -Nru qbittorrent-4.1.3/src/qbittorrent_mingw.rc qbittorrent-3.3.15/src/qbittorrent_mingw.rc --- qbittorrent-4.1.3/src/qbittorrent_mingw.rc 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/qbittorrent_mingw.rc 2017-08-03 20:30:10.000000000 +0000 @@ -1,3 +1,3 @@ -IDI_ICON1 ICON DISCARDABLE "icons/qbittorrent.ico" -IDI_ICON2 ICON DISCARDABLE "icons/qbittorrent_file.ico" +IDI_ICON1 ICON DISCARDABLE "qbittorrent.ico" +IDI_ICON2 ICON DISCARDABLE "qbittorrent_file.ico" 1 24 DISCARDABLE "qbittorrent.exe.manifest" Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/qbittorrent_os2.ico and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/qbittorrent_os2.ico differ diff -Nru qbittorrent-4.1.3/src/qbittorrent_os2.rc qbittorrent-3.3.15/src/qbittorrent_os2.rc --- qbittorrent-4.1.3/src/qbittorrent_os2.rc 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/qbittorrent_os2.rc 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1 @@ +ICON 1 DISCARDABLE "qbittorrent_os2.ico" Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/qbittorrent.rc and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/qbittorrent.rc differ Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/searchengine/nova/engines/btdb.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/searchengine/nova/engines/btdb.png differ diff -Nru qbittorrent-4.1.3/src/searchengine/nova/engines/btdb.py qbittorrent-3.3.15/src/searchengine/nova/engines/btdb.py --- qbittorrent-4.1.3/src/searchengine/nova/engines/btdb.py 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/searchengine/nova/engines/btdb.py 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,147 @@ +#VERSION: 1.01 +#AUTHORS: Charles Worthing +#CONTRIBUTORS: Diego de las Heras (ngosang@hotmail.es) + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the author nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +from HTMLParser import HTMLParser +#qBt +from novaprinter import prettyPrinter +from helpers import download_file, retrieve_url + +class btdb(object): + """ Search engine class """ + url = 'https://btdb.in' + name = 'BTDB' + + def download_torrent(self, info): + """ Downloader """ + print(download_file(info)) + + class MyHtmlParser(HTMLParser): + """ Parser class """ + def __init__(self, results, url): + HTMLParser.__init__(self) + self.results = results + self.url = url + self.current_item = {} # One torrent result + self.add_query = True + self.torrent_info_index = 0 # Count of the meta data encountered + self.torrent_info_array = [] + self.meta_data_grabbing = 0 + self.meta_data_array = [] + self.torrent_no_files = 0 + self.torrent_date_added = 0 + self.torrent_popularity = 0 + self.mangnet_link = "" + self.desc_link = "" + self.torrent_name = "" + + def handle_starttag(self, tag, attrs): + if tag == "span": + span_dict = dict(attrs) + if "class" in span_dict: + the_class = span_dict["class"] + if the_class == "item-meta-info-value": + self.meta_data_grabbing += 1 + else: + self.meta_data_grabbing = 0 + if tag == "script": + return + if tag == "li": + for attr in attrs: + if attr[1] == "search-ret-item": + self.torrent_info_index = 1 + if tag == "a": + if self.torrent_info_index > 0: + params = dict(attrs) + if "href" in params: + link = params["href"] + if link.startswith("/torrent"): + self.desc_link = "".join((self.url, link)) + self.torrent_name = params["title"] + if link.startswith("magnet:"): + self.mangnet_link = link + + def handle_endtag(self, tag): + if tag == "script": + return + if tag == "div": + if self.meta_data_grabbing > 0: + + self.torrent_no_files = self.meta_data_array[2] # Not used + self.torrent_date_added = self.meta_data_array[4] # Not used + self.torrent_popularity = self.meta_data_array[6] # Not used + + self.current_item["size"] = self.meta_data_array[0] + self.current_item["name"] = self.torrent_name + self.current_item["engine_url"] = self.url + self.current_item["link"] = self.mangnet_link + self.current_item["desc_link"] = self.desc_link + self.current_item["seeds"] = -1 + self.current_item["leech"] = -1 + + prettyPrinter(self.current_item) + self.results.append('a') + self.current_item = {} + + self.meta_data_grabbing = 0 + self.meta_data_array = [] + self.mangnet_link = "" + self.desc_link = "" + self.torrent_name = "" + + def handle_data(self, data): + if self.torrent_info_index > 0: + self.torrent_info_array.append(data) + self.torrent_info_index += 1 + if self.meta_data_grabbing > 0: + self.meta_data_array.append(data) + self.meta_data_grabbing += 1 + + def handle_entityref(self, name): + c = unichr(name2codepoint[name]) + + def handle_charref(self, name): + if name.startswith('x'): + c = unichr(int(name[1:], 16)) + else: + c = unichr(int(name)) + + + def search(self, what, cat='all'): + """ Performs search """ + results_list = [] + parser = self.MyHtmlParser(results_list, self.url) + i = 1 + while i < 31: + # "what" is already urlencoded + html = retrieve_url(self.url + '/q/%s/%d?sort=popular' % (what, i)) + parser.feed(html) + if len(results_list) < 1: + break + del results_list[:] + i += 1 + parser.close() Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/src/searchengine/nova/engines/demonoid.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/src/searchengine/nova/engines/demonoid.png differ diff -Nru qbittorrent-4.1.3/src/searchengine/nova/engines/demonoid.py qbittorrent-3.3.15/src/searchengine/nova/engines/demonoid.py --- qbittorrent-4.1.3/src/searchengine/nova/engines/demonoid.py 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/searchengine/nova/engines/demonoid.py 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,144 @@ +#VERSION: 1.23 +#AUTHORS: Douman (custparasite@gmx.se) +#CONTRIBUTORS: Diego de las Heras (ngosang@hotmail.es) + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the author nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +from HTMLParser import HTMLParser +from re import compile as re_compile +from re import DOTALL +from itertools import islice +#qBt +from novaprinter import prettyPrinter +from helpers import download_file, retrieve_url + +class demonoid(object): + """ Search engine class """ + url = "https://www.demonoid.pw" + name = "Demonoid" + supported_categories = {'all': '0', + 'music': '2', + 'movies': '1', + 'games': '4', + 'software': '5', + 'books': '11', + 'anime': '9', + 'tv': '3'} + + def download_torrent(self, info): + """ Downloader """ + print(download_file(info)) + + class MyHtmlParseWithBlackJack(HTMLParser): + """ Parser class """ + def __init__(self, url): + HTMLParser.__init__(self) + self.url = url + self.current_item = None + self.save_data = None + self.seeds_leech = False + self.size_repl = re_compile(",") + + def handle_starttag(self, tag, attrs): + """ Parser's start tag handler """ + if tag == "a": + params = dict(attrs) + if "href" in params: + link = params["href"] + if link.startswith("/files/details"): + self.current_item = dict() + self.current_item["desc_link"] = "".join((self.url, link)) + self.current_item["engine_url"] = self.url + self.save_data = "name" + elif link.startswith("/files/download"): + self.current_item["link"] = "".join((self.url, link)) + + elif self.current_item: + if tag == "td": + params = dict(attrs) + if "class" in params and "align" in params: + if params["class"].startswith("tone"): + if params["align"] == "right": + self.save_data = "size" + elif params["align"] == "center": + self.seeds_leech = True + + elif self.seeds_leech and tag == "font": + for attr in attrs: + if "class" in attr: + if attr[1] == "green": + self.save_data = "seeds" + elif attr[1] == "red": + self.save_data = "leech" + + self.seeds_leech = False + + + def handle_data(self, data): + """ Parser's data handler """ + if self.save_data: + if self.save_data == "name": + # names with special characters like '&' are splitted in several pieces + if 'name' not in self.current_item: + self.current_item['name'] = '' + self.current_item['name'] += data + else: + self.current_item[self.save_data] = data + self.save_data = None + if self.current_item.__len__() == 7: + self.current_item["size"] = self.size_repl.sub("", self.current_item["size"]) + prettyPrinter(self.current_item) + self.current_item = None + + def handle_endtag(self, tag): + """ Parser's end tag handler """ + if self.save_data == "name": + self.save_data = None + + def search(self, what, cat='all'): + """ Performs search """ + #prepare query + cat = self.supported_categories[cat.lower()] + query = "".join((self.url, "/files/?category=", cat, "&subcategory=All&quality=All&seeded=2&external=2&query=", what, "&uid=0&sort=S")) + + data = retrieve_url(query) + + add_res_list = re_compile("/files.*page=[0-9]+") + torrent_list = re_compile("start torrent list -->(.*)(.*) @@ -13,21 +11,19 @@ - - + + - - - - - - - - + + + + + + + -
@@ -39,116 +35,104 @@
  • QBT_TR(&File)QBT_TR[CONTEXT=MainWindow]
  • QBT_TR(&Edit)QBT_TR[CONTEXT=MainWindow]
  • QBT_TR(&View)QBT_TR[CONTEXT=MainWindow]
  • QBT_TR(&Tools)QBT_TR[CONTEXT=MainWindow]
  • QBT_TR(&Help)QBT_TR[CONTEXT=MainWindow]
  •    - QBT_TR(Add Torrent &Link...)QBT_TR[CONTEXT=MainWindow] - QBT_TR(&Add Torrent File...)QBT_TR[CONTEXT=MainWindow] - QBT_TR(Delete)QBT_TR[CONTEXT=TransferListWidget] - QBT_TR(Resume)QBT_TR[CONTEXT=TransferListWidget] - QBT_TR(Pause)QBT_TR[CONTEXT=TransferListWidget] + QBT_TR(Add Torrent &Link...)QBT_TR[CONTEXT=MainWindow] + QBT_TR(&Add Torrent File...)QBT_TR[CONTEXT=MainWindow] + QBT_TR(Delete)QBT_TR[CONTEXT=TransferListWidget] + QBT_TR(Resume)QBT_TR[CONTEXT=TransferListWidget] + QBT_TR(Pause)QBT_TR[CONTEXT=TransferListWidget] - QBT_TR(Top Priority)QBT_TR[CONTEXT=MainWindow] - QBT_TR(Increase Priority)QBT_TR[CONTEXT=MainWindow] - QBT_TR(Decrease Priority)QBT_TR[CONTEXT=MainWindow] - QBT_TR(Minimum Priority)QBT_TR[CONTEXT=MainWindow] + QBT_TR(Top Priority)QBT_TR[CONTEXT=MainWindow] + QBT_TR(Increase Priority)QBT_TR[CONTEXT=MainWindow] + QBT_TR(Decrease Priority)QBT_TR[CONTEXT=MainWindow] + QBT_TR(Minimum Priority)QBT_TR[CONTEXT=MainWindow] - QBT_TR(Options)QBT_TR[CONTEXT=OptionsDialog] + QBT_TR(Options)QBT_TR[CONTEXT=OptionsDialog]
    @@ -157,17 +141,16 @@ - Connection Status + Connection Status QBT_TR(Alternative speed limits)QBT_TR[CONTEXT=MainWindow] - + - +
    - diff -Nru qbittorrent-4.1.3/src/webui/www/private/login.html qbittorrent-3.3.15/src/webui/www/private/login.html --- qbittorrent-4.1.3/src/webui/www/private/login.html 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/login.html 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,87 @@ + + + + + + qBittorrent QBT_TR(Web UI)QBT_TR[CONTEXT=OptionsDialog] + + + + + + +
    +

    qBittorrent QBT_TR(Web UI)QBT_TR[CONTEXT=OptionsDialog]

    + +
    +
    +

    +

    +
    +
    +
    +
    +
    + + diff -Nru qbittorrent-4.1.3/src/webui/www/private/newcategory.html qbittorrent-3.3.15/src/webui/www/private/newcategory.html --- qbittorrent-4.1.3/src/webui/www/private/newcategory.html 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/newcategory.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,135 +0,0 @@ - - - - - - QBT_TR(New Category)QBT_TR[CONTEXT=TransferListWidget] - - - - - - - - -
    -

    QBT_TR(Category)QBT_TR[CONTEXT=TransferListWidget]:

    - -

    QBT_TR(Save path)QBT_TR[CONTEXT=TransferListWidget]:

    - -
    - -
    -
    - - - diff -Nru qbittorrent-4.1.3/src/webui/www/private/preferences_content.html qbittorrent-3.3.15/src/webui/www/private/preferences_content.html --- qbittorrent-4.1.3/src/webui/www/private/preferences_content.html 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/preferences_content.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,1360 +0,0 @@ -
    -
    - QBT_TR(Hard Disk)QBT_TR[CONTEXT=HttpServer] -
    - - -
    -
    - - - -
    - -
    - - - -

    QBT_TR(Automatically add torrents from:)QBT_TR[CONTEXT=OptionsDialog]
    - - - - - - - - - - - - - - -
    QBT_TR(Monitored Folder)QBT_TR[CONTEXT=ScanFoldersModel]QBT_TR(Override Save Location)QBT_TR[CONTEXT=ScanFoldersModel]
    -
    - - - Add -
    -

    - -    -
    - -    -
    -
    - -
    - - -
    - -
    -
    - -
    -
    - -
    -
    - -
    - -
    -
    - -
    -
    -
    - -
    - - -
    -
    QBT_TR(Supported parameters (case sensitive):)QBT_TR[CONTEXT=OptionsDialog] -
      -
    • QBT_TR(%N: Torrent name)QBT_TR[CONTEXT=OptionsDialog]
    • -
    • QBT_TR(%L: Category)QBT_TR[CONTEXT=OptionsDialog]
    • -
    • QBT_TR(%G: Tags (seperated by comma))QBT_TR[CONTEXT=OptionsDialog]
    • -
    • QBT_TR(%F: Content path (same as root path for multifile torrent))QBT_TR[CONTEXT=OptionsDialog]
    • -
    • QBT_TR(%R: Root path (first torrent subdirectory path))QBT_TR[CONTEXT=OptionsDialog]
    • -
    • QBT_TR(%D: Save path)QBT_TR[CONTEXT=OptionsDialog]
    • -
    • QBT_TR(%C: Number of files)QBT_TR[CONTEXT=OptionsDialog]
    • -
    • QBT_TR(%Z: Torrent size (bytes))QBT_TR[CONTEXT=OptionsDialog]
    • -
    • QBT_TR(%T: Current tracker)QBT_TR[CONTEXT=OptionsDialog]
    • -
    • QBT_TR(%I: Info hash)QBT_TR[CONTEXT=OptionsDialog]
    • -
    - QBT_TR(Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N"))QBT_TR[CONTEXT=OptionsDialog] -
    -
    -
    - - - - - - - - - -
    -
    - - diff -Nru qbittorrent-4.1.3/src/webui/www/private/preferences.html qbittorrent-3.3.15/src/webui/www/private/preferences.html --- qbittorrent-4.1.3/src/webui/www/private/preferences.html 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/preferences.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ - - - - - - QBT_TR(Download from URLs)QBT_TR[CONTEXT=downloadFromURL] - - - - - - - - - - - - - - - diff -Nru qbittorrent-4.1.3/src/webui/www/private/properties_content.html qbittorrent-3.3.15/src/webui/www/private/properties_content.html --- qbittorrent-4.1.3/src/webui/www/private/properties_content.html 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/properties_content.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,153 +0,0 @@ -
    -
    - QBT_TR(Transfer)QBT_TR[CONTEXT=PropertiesWidget] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    QBT_TR(Time Active:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(ETA:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Connections:)QBT_TR[CONTEXT=PropertiesWidget]
    QBT_TR(Downloaded:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Uploaded:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Seeds:)QBT_TR[CONTEXT=PropertiesWidget]
    QBT_TR(Download Speed:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Upload Speed:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Peers:)QBT_TR[CONTEXT=PropertiesWidget]
    QBT_TR(Download Limit:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Upload Limit:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Wasted:)QBT_TR[CONTEXT=PropertiesWidget]
    QBT_TR(Share Ratio:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Reannounce In:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Last Seen Complete:)QBT_TR[CONTEXT=PropertiesWidget]
    -
    -
    - QBT_TR(Information)QBT_TR[CONTEXT=PropertiesWidget] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    QBT_TR(Total Size:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Pieces:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Created By:)QBT_TR[CONTEXT=PropertiesWidget]
    QBT_TR(Added On:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Completed On:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Created On:)QBT_TR[CONTEXT=PropertiesWidget]
    QBT_TR(Torrent Hash:)QBT_TR[CONTEXT=PropertiesWidget]
    QBT_TR(Save Path:)QBT_TR[CONTEXT=PropertiesWidget]
    QBT_TR(Comment:)QBT_TR[CONTEXT=PropertiesWidget]
    -
    -
    - - - - - - - - - - diff -Nru qbittorrent-4.1.3/src/webui/www/private/properties.html qbittorrent-3.3.15/src/webui/www/private/properties.html --- qbittorrent-4.1.3/src/webui/www/private/properties.html 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/properties.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ - diff -Nru qbittorrent-4.1.3/src/webui/www/private/rename.html qbittorrent-3.3.15/src/webui/www/private/rename.html --- qbittorrent-4.1.3/src/webui/www/private/rename.html 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/rename.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ - - - - - - QBT_TR(Rename)QBT_TR[CONTEXT=TransferListWidget] - - - - - - - - -
    -

    QBT_TR(New name)QBT_TR[CONTEXT=TransferListWidget]:

    - -
    - -
    -
    - - - diff -Nru qbittorrent-4.1.3/src/webui/www/private/scripts/client.js qbittorrent-3.3.15/src/webui/www/private/scripts/client.js --- qbittorrent-4.1.3/src/webui/www/private/scripts/client.js 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/scripts/client.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,786 +0,0 @@ -/* - * MIT License - * Copyright (c) 2008 Ishan Arora , - * Christophe Dumez - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -torrentsTable = new TorrentsTable(); -torrentPeersTable = new TorrentPeersTable(); - -var updatePropertiesPanel = function() {}; - -var updateTorrentData = function() {}; -var updateTrackersData = function() {}; -var updateTorrentPeersData = function() {}; -var updateWebSeedsData = function() {}; -var updateTorrentFilesData = function() {}; - -var updateMainData = function() {}; -var alternativeSpeedLimits = false; -var queueing_enabled = true; -var syncMainDataTimerPeriod = 1500; - -var clipboardEvent; - -var CATEGORIES_ALL = 1; -var CATEGORIES_UNCATEGORIZED = 2; - -var category_list = {}; - -var selected_category = CATEGORIES_ALL; -var setCategoryFilter = function() {}; - -var selected_filter = getLocalStorageItem('selected_filter', 'all'); -var setFilter = function() {}; -var toggleFilterDisplay = function() {}; - -var loadSelectedCategory = function() { - selected_category = getLocalStorageItem('selected_category', CATEGORIES_ALL); -}; -loadSelectedCategory(); - -function genHash(string) { - var hash = 0; - for (var i = 0; i < string.length; ++i) { - var c = string.charCodeAt(i); - hash = (c + hash * 31) | 0; - } - return hash; -} - -window.addEvent('load', function() { - - var saveColumnSizes = function() { - var filters_width = $('Filters').getSize().x; - var properties_height_rel = $('propertiesPanel').getSize().y / Window.getSize().y; - localStorage.setItem('filters_width', filters_width); - localStorage.setItem('properties_height_rel', properties_height_rel); - }; - - window.addEvent('resize', function() { - // Resizing might takes some time. - saveColumnSizes.delay(200); - }); - - /*MochaUI.Desktop = new MochaUI.Desktop(); - MochaUI.Desktop.desktop.setStyles({ - 'background': '#fff', - 'visibility': 'visible' - });*/ - MochaUI.Desktop.initialize(); - - var filt_w = localStorage.getItem('filters_width'); - if ($defined(filt_w)) - filt_w = filt_w.toInt(); - else - filt_w = 120; - new MochaUI.Column({ - id: 'filtersColumn', - placement: 'left', - onResize: saveColumnSizes, - width: filt_w, - resizeLimit: [100, 300] - }); - new MochaUI.Column({ - id: 'mainColumn', - placement: 'main', - width: null, - resizeLimit: [100, 300] - }); - - setCategoryFilter = function(hash) { - selected_category = hash; - localStorage.setItem('selected_category', selected_category); - highlightSelectedCategory(); - if (typeof torrentsTable.tableBody != 'undefined') - updateMainData(); - }; - - setFilter = function(f) { - // Visually Select the right filter - $("all_filter").removeClass("selectedFilter"); - $("downloading_filter").removeClass("selectedFilter"); - $("seeding_filter").removeClass("selectedFilter"); - $("completed_filter").removeClass("selectedFilter"); - $("paused_filter").removeClass("selectedFilter"); - $("resumed_filter").removeClass("selectedFilter"); - $("active_filter").removeClass("selectedFilter"); - $("inactive_filter").removeClass("selectedFilter"); - $("errored_filter").removeClass("selectedFilter"); - $(f + "_filter").addClass("selectedFilter"); - selected_filter = f; - localStorage.setItem('selected_filter', f); - // Reload torrents - if (typeof torrentsTable.tableBody != 'undefined') - updateMainData(); - }; - - toggleFilterDisplay = function(filter) { - var element = filter + "FilterList"; - localStorage.setItem('filter_' + filter + "_collapsed", !$(element).hasClass("invisible")); - $(element).toggleClass("invisible") - var parent = $(element).getParent(".filterWrapper"); - var toggleIcon = $(parent).getChildren(".filterTitle img"); - if (toggleIcon) - toggleIcon[0].toggleClass("rotate"); - }; - - new MochaUI.Panel({ - id: 'Filters', - title: 'Panel', - header: false, - padding: { - top: 0, - right: 0, - bottom: 0, - left: 0 - }, - loadMethod: 'xhr', - contentURL: 'filters.html', - onContentLoaded: function() { - setFilter(selected_filter); - }, - column: 'filtersColumn', - height: 300 - }); - initializeWindows(); - - // Show Top Toolbar is enabled by default - var showTopToolbar = true; - if (localStorage.getItem('show_top_toolbar') !== null) - showTopToolbar = localStorage.getItem('show_top_toolbar') == "true"; - if (!showTopToolbar) { - $('showTopToolbarLink').firstChild.style.opacity = '0'; - $('mochaToolbar').addClass('invisible'); - } - - // Show Status Bar is enabled by default - var showStatusBar = true; - if (localStorage.getItem('show_status_bar') !== null) - showStatusBar = localStorage.getItem('show_status_bar') === "true"; - if (!showStatusBar) { - $('showStatusBarLink').firstChild.style.opacity = '0'; - $('desktopFooterWrapper').addClass('invisible'); - } - - var speedInTitle = localStorage.getItem('speed_in_browser_title_bar') == "true"; - if (!speedInTitle) - $('speedInBrowserTitleBarLink').firstChild.style.opacity = '0'; - - // After showing/hiding the toolbar + status bar - MochaUI.Desktop.setDesktopSize(); - - var syncMainDataLastResponseId = 0; - var serverState = {}; - - var removeTorrentFromCategoryList = function(hash) { - if (hash === null || hash === "") - return false; - var removed = false; - Object.each(category_list, function(category) { - if (Object.contains(category.torrents, hash)) { - removed = true; - category.torrents.splice(category.torrents.indexOf(hash), 1); - } - }); - return removed; - }; - - var addTorrentToCategoryList = function(torrent) { - var category = torrent['category']; - if (typeof category === 'undefined') - return false; - if (category.length === 0) { // Empty category - removeTorrentFromCategoryList(torrent['hash']); - return true; - } - var categoryHash = genHash(category); - if (category_list[categoryHash] === null) // This should not happen - category_list[categoryHash] = { - name: category, - torrents: [] - }; - if (!Object.contains(category_list[categoryHash].torrents, torrent['hash'])) { - removeTorrentFromCategoryList(torrent['hash']); - category_list[categoryHash].torrents = category_list[categoryHash].torrents.combine([torrent['hash']]); - return true; - } - return false; - }; - - var updateFilter = function(filter, filterTitle) { - $(filter + '_filter').firstChild.childNodes[1].nodeValue = filterTitle.replace('%1', torrentsTable.getFilteredTorrentsNumber(filter, CATEGORIES_ALL)); - }; - - var updateFiltersList = function() { - updateFilter('all', 'QBT_TR(All (%1))QBT_TR[CONTEXT=StatusFilterWidget]'); - updateFilter('downloading', 'QBT_TR(Downloading (%1))QBT_TR[CONTEXT=StatusFilterWidget]'); - updateFilter('seeding', 'QBT_TR(Seeding (%1))QBT_TR[CONTEXT=StatusFilterWidget]'); - updateFilter('completed', 'QBT_TR(Completed (%1))QBT_TR[CONTEXT=StatusFilterWidget]'); - updateFilter('resumed', 'QBT_TR(Resumed (%1))QBT_TR[CONTEXT=StatusFilterWidget]'); - updateFilter('paused', 'QBT_TR(Paused (%1))QBT_TR[CONTEXT=StatusFilterWidget]'); - updateFilter('active', 'QBT_TR(Active (%1))QBT_TR[CONTEXT=StatusFilterWidget]'); - updateFilter('inactive', 'QBT_TR(Inactive (%1))QBT_TR[CONTEXT=StatusFilterWidget]'); - updateFilter('errored', 'QBT_TR(Errored (%1))QBT_TR[CONTEXT=StatusFilterWidget]'); - }; - - var updateCategoryList = function() { - var categoryList = $('categoryFilterList'); - if (!categoryList) - return; - categoryList.empty(); - - var create_link = function(hash, text, count) { - var html = '' - + '' - + escapeHtml(text) + ' (' + count + ')' + ''; - var el = new Element('li', { - id: hash, - html: html - }); - categoriesFilterContextMenu.addTarget(el); - return el; - }; - - var all = torrentsTable.getRowIds().length; - var uncategorized = 0; - Object.each(torrentsTable.rows, function(row) { - if (row['full_data'].category.length === 0) - uncategorized += 1; - }); - categoryList.appendChild(create_link(CATEGORIES_ALL, 'QBT_TR(All)QBT_TR[CONTEXT=CategoryFilterModel]', all)); - categoryList.appendChild(create_link(CATEGORIES_UNCATEGORIZED, 'QBT_TR(Uncategorized)QBT_TR[CONTEXT=CategoryFilterModel]', uncategorized)); - - var sortedCategories = []; - Object.each(category_list, function(category) { - sortedCategories.push(category.name); - }); - sortedCategories.sort(); - - Object.each(sortedCategories, function(categoryName) { - var categoryHash = genHash(categoryName); - var categoryCount = category_list[categoryHash].torrents.length; - categoryList.appendChild(create_link(categoryHash, categoryName, categoryCount)); - }); - - highlightSelectedCategory(); - }; - - var highlightSelectedCategory = function() { - var categoryList = $('categoryFilterList'); - if (!categoryList) - return; - var childrens = categoryList.childNodes; - for (var i in childrens) { - if (childrens[i].id == selected_category) - childrens[i].className = "selectedFilter"; - else - childrens[i].className = ""; - } - }; - - var syncMainDataTimer; - var syncMainData = function() { - var url = new URI('api/v2/sync/maindata'); - url.setData('rid', syncMainDataLastResponseId); - var request = new Request.JSON({ - url: url, - noCache: true, - method: 'get', - onFailure: function() { - var errorDiv = $('error_div'); - if (errorDiv) - errorDiv.set('html', 'QBT_TR(qBittorrent client is not reachable)QBT_TR[CONTEXT=HttpServer]'); - clearTimeout(syncMainDataTimer); - syncMainDataTimer = syncMainData.delay(2000); - }, - onSuccess: function(response) { - $('error_div').set('html', ''); - if (response) { - var torrentsTableSelectedRows; - var update_categories = false; - var full_update = (response['full_update'] === true); - if (full_update) { - torrentsTableSelectedRows = torrentsTable.selectedRowsIds(); - torrentsTable.clear(); - category_list = {}; - } - if (response['rid']) { - syncMainDataLastResponseId = response['rid']; - } - if (response['categories']) { - for (var key in response['categories']) { - var category = response['categories'][key]; - var categoryHash = genHash(key); - if (category_list[categoryHash] !== undefined) { - // only the save path can change for existing categories - category_list[categoryHash].savePath = category.savePath; - } - else { - category_list[categoryHash] = { - name: category.name, - savePath: category.savePath, - torrents: [] - }; - } - } - update_categories = true; - } - if (response['categories_removed']) { - response['categories_removed'].each(function(category) { - var categoryHash = genHash(category); - delete category_list[categoryHash]; - }); - update_categories = true; - } - if (response['torrents']) { - var updateTorrentList = false; - for (var key in response['torrents']) { - response['torrents'][key]['hash'] = key; - response['torrents'][key]['rowId'] = key; - if (response['torrents'][key]['state']) - response['torrents'][key]['status'] = response['torrents'][key]['state']; - torrentsTable.updateRowData(response['torrents'][key]); - if (addTorrentToCategoryList(response['torrents'][key])) - update_categories = true; - if (response['torrents'][key]['name']) - updateTorrentList = true; - } - - if (updateTorrentList) - setupCopyEventHandler(); - } - if (response['torrents_removed']) - response['torrents_removed'].each(function(hash) { - torrentsTable.removeRow(hash); - removeTorrentFromCategoryList(hash); - update_categories = true; // Always to update All category - }); - torrentsTable.updateTable(full_update); - torrentsTable.altRow(); - if (response['server_state']) { - var tmp = response['server_state']; - for (var k in tmp) - serverState[k] = tmp[k]; - processServerState(); - } - updateFiltersList(); - if (update_categories) { - updateCategoryList(); - torrentsTableContextMenu.updateCategoriesSubMenu(category_list); - } - - if (full_update) - // re-select previously selected rows - torrentsTable.reselectRows(torrentsTableSelectedRows); - } - clearTimeout(syncMainDataTimer); - syncMainDataTimer = syncMainData.delay(syncMainDataTimerPeriod); - } - }).send(); - }; - - updateMainData = function() { - torrentsTable.updateTable(); - clearTimeout(syncMainDataTimer); - syncMainDataTimer = syncMainData.delay(100); - }; - - var processServerState = function() { - var transfer_info = friendlyUnit(serverState.dl_info_speed, true); - if (serverState.dl_rate_limit > 0) - transfer_info += " [" + friendlyUnit(serverState.dl_rate_limit, true) + "]"; - transfer_info += " (" + friendlyUnit(serverState.dl_info_data, false) + ")"; - $("DlInfos").set('html', transfer_info); - transfer_info = friendlyUnit(serverState.up_info_speed, true); - if (serverState.up_rate_limit > 0) - transfer_info += " [" + friendlyUnit(serverState.up_rate_limit, true) + "]"; - transfer_info += " (" + friendlyUnit(serverState.up_info_data, false) + ")"; - $("UpInfos").set('html', transfer_info); - if (speedInTitle) { - document.title = "QBT_TR([D: %1, U: %2] qBittorrent %3)QBT_TR[CONTEXT=MainWindow]".replace("%1", friendlyUnit(serverState.dl_info_speed, true)).replace("%2", friendlyUnit(serverState.up_info_speed, true)).replace("%3", "${VERSION}"); - document.title += " QBT_TR(Web UI)QBT_TR[CONTEXT=OptionsDialog]"; - } - else - document.title = "qBittorrent ${VERSION} QBT_TR(Web UI)QBT_TR[CONTEXT=OptionsDialog]"; - $('DHTNodes').set('html', 'QBT_TR(DHT: %1 nodes)QBT_TR[CONTEXT=StatusBar]'.replace("%1", serverState.dht_nodes)); - - // Statistics dialog - if (document.getElementById("statisticspage")) { - $('AlltimeDL').set('html', friendlyUnit(serverState.alltime_dl, false)); - $('AlltimeUL').set('html', friendlyUnit(serverState.alltime_ul, false)); - $('TotalWastedSession').set('html', friendlyUnit(serverState.total_wasted_session, false)); - $('GlobalRatio').set('html', serverState.global_ratio); - $('TotalPeerConnections').set('html', serverState.total_peer_connections); - $('ReadCacheHits').set('html', serverState.read_cache_hits + "%"); - $('TotalBuffersSize').set('html', friendlyUnit(serverState.total_buffers_size, false)); - $('WriteCacheOverload').set('html', serverState.write_cache_overload + "%"); - $('ReadCacheOverload').set('html', serverState.read_cache_overload + "%"); - $('QueuedIOJobs').set('html', serverState.queued_io_jobs); - $('AverageTimeInQueue').set('html', serverState.average_time_queue + " ms"); - $('TotalQueuedSize').set('html', friendlyUnit(serverState.total_queued_size, false)); - } - - if (serverState.connection_status == "connected") - $('connectionStatus').src = 'images/skin/connected.svg'; - else if (serverState.connection_status == "firewalled") - $('connectionStatus').src = 'images/skin/firewalled.svg'; - else - $('connectionStatus').src = 'images/skin/disconnected.svg'; - - if (queueing_enabled != serverState.queueing) { - queueing_enabled = serverState.queueing; - torrentsTable.columns['priority'].force_hide = !queueing_enabled; - torrentsTable.updateColumn('priority'); - if (queueing_enabled) { - $('topPrioItem').removeClass('invisible'); - $('increasePrioItem').removeClass('invisible'); - $('decreasePrioItem').removeClass('invisible'); - $('bottomPrioItem').removeClass('invisible'); - $('queueingButtons').removeClass('invisible'); - $('queueingMenuItems').removeClass('invisible'); - } - else { - $('topPrioItem').addClass('invisible'); - $('increasePrioItem').addClass('invisible'); - $('decreasePrioItem').addClass('invisible'); - $('bottomPrioItem').addClass('invisible'); - $('queueingButtons').addClass('invisible'); - $('queueingMenuItems').addClass('invisible'); - } - } - - if (alternativeSpeedLimits != serverState.use_alt_speed_limits) { - alternativeSpeedLimits = serverState.use_alt_speed_limits; - updateAltSpeedIcon(alternativeSpeedLimits); - } - - syncMainDataTimerPeriod = serverState.refresh_interval; - if (syncMainDataTimerPeriod < 500) - syncMainDataTimerPeriod = 500; - }; - - var updateAltSpeedIcon = function(enabled) { - if (enabled) - $('alternativeSpeedLimits').src = "images/slow.png"; - else - $('alternativeSpeedLimits').src = "images/slow_off.png"; - }; - - $('alternativeSpeedLimits').addEvent('click', function() { - // Change icon immediately to give some feedback - updateAltSpeedIcon(!alternativeSpeedLimits); - - new Request({ - url: 'api/v2/transfer/toggleSpeedLimitsMode', - method: 'post', - onComplete: function() { - alternativeSpeedLimits = !alternativeSpeedLimits; - updateMainData(); - }, - onFailure: function() { - // Restore icon in case of failure - updateAltSpeedIcon(alternativeSpeedLimits); - } - }).send(); - }); - - $('DlInfos').addEvent('click', globalDownloadLimitFN); - $('UpInfos').addEvent('click', globalUploadLimitFN); - - $('showTopToolbarLink').addEvent('click', function(e) { - showTopToolbar = !showTopToolbar; - localStorage.setItem('show_top_toolbar', showTopToolbar.toString()); - if (showTopToolbar) { - $('showTopToolbarLink').firstChild.style.opacity = '1'; - $('mochaToolbar').removeClass('invisible'); - } - else { - $('showTopToolbarLink').firstChild.style.opacity = '0'; - $('mochaToolbar').addClass('invisible'); - } - MochaUI.Desktop.setDesktopSize(); - }); - - $('showStatusBarLink').addEvent('click', function(e) { - showStatusBar = !showStatusBar; - localStorage.setItem('show_status_bar', showStatusBar.toString()); - if (showStatusBar) { - $('showStatusBarLink').firstChild.style.opacity = '1'; - $('desktopFooterWrapper').removeClass('invisible'); - } - else { - $('showStatusBarLink').firstChild.style.opacity = '0'; - $('desktopFooterWrapper').addClass('invisible'); - } - MochaUI.Desktop.setDesktopSize(); - }); - - $('speedInBrowserTitleBarLink').addEvent('click', function(e) { - speedInTitle = !speedInTitle; - localStorage.setItem('speed_in_browser_title_bar', speedInTitle.toString()); - if (speedInTitle) - $('speedInBrowserTitleBarLink').firstChild.style.opacity = '1'; - else - $('speedInBrowserTitleBarLink').firstChild.style.opacity = '0'; - processServerState(); - }); - - $('StatisticsLink').addEvent('click', StatisticsLinkFN); - - new MochaUI.Panel({ - id: 'transferList', - title: 'Panel', - header: false, - padding: { - top: 0, - right: 0, - bottom: 0, - left: 0 - }, - loadMethod: 'xhr', - contentURL: 'transferlist.html', - onContentLoaded: function() { - updateMainData(); - }, - column: 'mainColumn', - onResize: saveColumnSizes, - height: null - }); - var prop_h = localStorage.getItem('properties_height_rel'); - if ($defined(prop_h)) - prop_h = prop_h.toFloat() * Window.getSize().y; - else - prop_h = Window.getSize().y / 2.0; - new MochaUI.Panel({ - id: 'propertiesPanel', - title: 'Panel', - header: true, - padding: { - top: 0, - right: 0, - bottom: 0, - left: 0 - }, - contentURL: 'properties_content.html', - require: { - css: ['css/Tabs.css', 'css/dynamicTable.css'], - js: ['scripts/prop-general.js', 'scripts/prop-trackers.js', 'scripts/prop-webseeds.js', 'scripts/prop-files.js'], - }, - tabsURL: 'properties.html', - tabsOnload: function() { - MochaUI.initializeTabs('propertiesTabs'); - - updatePropertiesPanel = function() { - if (!$('prop_general').hasClass('invisible')) - updateTorrentData(); - else if (!$('prop_trackers').hasClass('invisible')) - updateTrackersData(); - else if (!$('prop_peers').hasClass('invisible')) - updateTorrentPeersData(); - else if (!$('prop_webseeds').hasClass('invisible')) - updateWebSeedsData(); - else if (!$('prop_files').hasClass('invisible')) - updateTorrentFilesData(); - }; - - $('PropGeneralLink').addEvent('click', function(e) { - $('prop_general').removeClass("invisible"); - $('prop_trackers').addClass("invisible"); - $('prop_webseeds').addClass("invisible"); - $('prop_files').addClass("invisible"); - $('prop_peers').addClass("invisible"); - updatePropertiesPanel(); - localStorage.setItem('selected_tab', this.id); - }); - - $('PropTrackersLink').addEvent('click', function(e) { - $('prop_trackers').removeClass("invisible"); - $('prop_general').addClass("invisible"); - $('prop_webseeds').addClass("invisible"); - $('prop_files').addClass("invisible"); - $('prop_peers').addClass("invisible"); - updatePropertiesPanel(); - localStorage.setItem('selected_tab', this.id); - }); - - $('PropPeersLink').addEvent('click', function(e) { - $('prop_peers').removeClass("invisible"); - $('prop_trackers').addClass("invisible"); - $('prop_general').addClass("invisible"); - $('prop_webseeds').addClass("invisible"); - $('prop_files').addClass("invisible"); - updatePropertiesPanel(); - localStorage.setItem('selected_tab', this.id); - }); - - $('PropWebSeedsLink').addEvent('click', function(e) { - $('prop_webseeds').removeClass("invisible"); - $('prop_general').addClass("invisible"); - $('prop_trackers').addClass("invisible"); - $('prop_files').addClass("invisible"); - $('prop_peers').addClass("invisible"); - updatePropertiesPanel(); - localStorage.setItem('selected_tab', this.id); - }); - - $('PropFilesLink').addEvent('click', function(e) { - $('prop_files').removeClass("invisible"); - $('prop_general').addClass("invisible"); - $('prop_trackers').addClass("invisible"); - $('prop_webseeds').addClass("invisible"); - $('prop_peers').addClass("invisible"); - updatePropertiesPanel(); - localStorage.setItem('selected_tab', this.id); - }); - - $('propertiesPanel_collapseToggle').addEvent('click', function(e) { - updatePropertiesPanel(); - }); - }, - column: 'mainColumn', - height: prop_h - }); -}); - -function closeWindows() { - MochaUI.closeAll(); -} - -function setupCopyEventHandler() { - if (clipboardEvent) - clipboardEvent.destroy(); - - clipboardEvent = new ClipboardJS('.copyToClipboard', { - text: function(trigger) { - var textToCopy; - - switch (trigger.id) { - case "CopyName": - textToCopy = copyNameFN(); - break; - case "CopyMagnetLink": - textToCopy = copyMagnetLinkFN(); - break; - case "CopyHash": - textToCopy = copyHashFN(); - break; - } - - return textToCopy; - } - }); -} - -var keyboardEvents = new Keyboard({ - defaultEventType: 'keydown', - events: { - 'ctrl+a': function(event) { - torrentsTable.selectAll(); - event.preventDefault(); - }, - 'delete': function(event) { - deleteFN(); - event.preventDefault(); - } - } -}); - -keyboardEvents.activate(); - -var loadTorrentPeersTimer; -var syncTorrentPeersLastResponseId = 0; -var show_flags = true; -var loadTorrentPeersData = function() { - if ($('prop_peers').hasClass('invisible') - || $('propertiesPanel_collapseToggle').hasClass('panel-expand')) { - syncTorrentPeersLastResponseId = 0; - torrentPeersTable.clear(); - return; - } - var current_hash = torrentsTable.getCurrentTorrentHash(); - if (current_hash === "") { - syncTorrentPeersLastResponseId = 0; - torrentPeersTable.clear(); - clearTimeout(loadTorrentPeersTimer); - loadTorrentPeersTimer = loadTorrentPeersData.delay(syncMainDataTimerPeriod); - return; - } - var url = new URI('api/v2/sync/torrentPeers'); - url.setData('rid', syncTorrentPeersLastResponseId); - url.setData('hash', current_hash); - var request = new Request.JSON({ - url: url, - noCache: true, - method: 'get', - onFailure: function() { - $('error_div').set('html', 'QBT_TR(qBittorrent client is not reachable)QBT_TR[CONTEXT=HttpServer]'); - clearTimeout(loadTorrentPeersTimer); - loadTorrentPeersTimer = loadTorrentPeersData.delay(5000); - }, - onSuccess: function(response) { - $('error_div').set('html', ''); - if (response) { - var full_update = (response['full_update'] === true); - if (full_update) { - torrentPeersTable.clear(); - } - if (response['rid']) { - syncTorrentPeersLastResponseId = response['rid']; - } - if (response['peers']) { - for (var key in response['peers']) { - response['peers'][key]['rowId'] = key; - - if (response['peers'][key]['client']) - response['peers'][key]['client'] = escapeHtml(response['peers'][key]['client']); - - torrentPeersTable.updateRowData(response['peers'][key]); - } - } - if (response['peers_removed']) - response['peers_removed'].each(function(hash) { - torrentPeersTable.removeRow(hash); - }); - torrentPeersTable.updateTable(full_update); - torrentPeersTable.altRow(); - - if (response['show_flags']) { - if (show_flags != response['show_flags']) { - show_flags = response['show_flags']; - torrentPeersTable.columns['country'].force_hide = !show_flags; - torrentPeersTable.updateColumn('country'); - } - } - } - else { - torrentPeersTable.clear(); - } - clearTimeout(loadTorrentPeersTimer); - loadTorrentPeersTimer = loadTorrentPeersData.delay(syncMainDataTimerPeriod); - } - }).send(); -}; - -updateTorrentPeersData = function() { - clearTimeout(loadTorrentPeersTimer); - loadTorrentPeersData(); -}; diff -Nru qbittorrent-4.1.3/src/webui/www/private/scripts/contextmenu.js qbittorrent-3.3.15/src/webui/www/private/scripts/contextmenu.js --- qbittorrent-4.1.3/src/webui/www/private/scripts/contextmenu.js 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/scripts/contextmenu.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,399 +0,0 @@ -var lastShownContexMenu = null; -var ContextMenu = new Class({ - //implements - Implements: [Options, Events], - - //options - options: { - actions: {}, - menu: 'menu_id', - stopEvent: true, - targets: 'body', - trigger: 'contextmenu', - offsets: { - x: 0, - y: 0 - }, - onShow: $empty, - onHide: $empty, - onClick: $empty, - fadeSpeed: 200 - }, - - //initialization - initialize: function(options) { - //set options - this.setOptions(options); - - //option diffs menu - this.menu = $(this.options.menu); - this.targets = $$(this.options.targets); - - //fx - this.fx = new Fx.Tween(this.menu, { - property: 'opacity', - duration: this.options.fadeSpeed, - onComplete: function() { - if (this.getStyle('opacity')) { - this.setStyle('visibility', 'visible'); - } - else { - this.setStyle('visibility', 'hidden'); - } - }.bind(this.menu) - }); - - //hide and begin the listener - this.hide().startListener(); - - //hide the menu - this.menu.setStyles({ - 'position': 'absolute', - 'top': '-900000px', - 'display': 'block' - }); - }, - - adjustMenuPosition: function(e) { - this.updateMenuItems(); - - var scrollableMenuMaxHeight = document.documentElement.clientHeight * 0.75; - - if (this.menu.hasClass('scrollableMenu')) - this.menu.setStyle('max-height', scrollableMenuMaxHeight); - - // draw the menu off-screen to know the menu dimensions - this.menu.setStyles({ - left: '-999em', - top: '-999em' - }); - - // position the menu - var xPosMenu = e.page.x + this.options.offsets.x; - var yPosMenu = e.page.y + this.options.offsets.y; - if (xPosMenu + this.menu.offsetWidth > document.documentElement.clientWidth) - xPosMenu -= this.menu.offsetWidth; - if (yPosMenu + this.menu.offsetHeight > document.documentElement.clientHeight) - yPosMenu = document.documentElement.clientHeight - this.menu.offsetHeight; - if (xPosMenu < 0) - xPosMenu = 0; - if (yPosMenu < 0) - yPosMenu = 0; - this.menu.setStyles({ - left: xPosMenu, - top: yPosMenu, - position: 'absolute', - 'z-index': '2000' - }); - - // position the sub-menu - var uls = this.menu.getElementsByTagName('ul'); - for (var i = 0; i < uls.length; ++i) { - var ul = uls[i]; - if (ul.hasClass('scrollableMenu')) - ul.setStyle('max-height', scrollableMenuMaxHeight); - var rectParent = ul.parentNode.getBoundingClientRect(); - var xPosOrigin = rectParent.left; - var yPosOrigin = rectParent.bottom; - var xPos = xPosOrigin + rectParent.width - 1; - var yPos = yPosOrigin - rectParent.height - 1; - if (xPos + ul.offsetWidth > document.documentElement.clientWidth) - xPos -= (ul.offsetWidth + rectParent.width - 2); - if (yPos + ul.offsetHeight > document.documentElement.clientHeight) - yPos = document.documentElement.clientHeight - ul.offsetHeight; - if (xPos < 0) - xPos = 0; - if (yPos < 0) - yPos = 0; - ul.setStyles({ - 'margin-left': xPos - xPosOrigin, - 'margin-top': yPos - yPosOrigin - }); - } - }, - - addTarget: function(t) { - this.targets[this.targets.length] = t; - t.addEvent(this.options.trigger, function(e) { - //enabled? - if (!this.options.disabled) { - //prevent default, if told to - if (this.options.stopEvent) { - e.stop(); - } - //record this as the trigger - this.options.element = $(t); - this.adjustMenuPosition(e); - //show the menu - this.show(); - } - }.bind(this)); - t.addEvent('click', function(e) { - this.hide(); - }.bind(this)); - }, - - //get things started - startListener: function() { - /* all elements */ - this.targets.each(function(el) { - /* show the menu */ - el.addEvent(this.options.trigger, function(e) { - //enabled? - if (!this.options.disabled) { - //prevent default, if told to - if (this.options.stopEvent) { - e.stop(); - } - //record this as the trigger - this.options.element = $(el); - this.adjustMenuPosition(e); - //show the menu - this.show(); - } - }.bind(this)); - el.addEvent('click', function(e) { - this.hide(); - }.bind(this)); - }, this); - - /* menu items */ - this.menu.getElements('a').each(function(item) { - item.addEvent('click', function(e) { - e.preventDefault(); - if (!item.hasClass('disabled')) { - this.execute(item.get('href').split('#')[1], $(this.options.element)); - this.fireEvent('click', [item, e]); - } - }.bind(this)); - }, this); - - //hide on body click - $(document.body).addEvent('click', function() { - this.hide(); - }.bind(this)); - }, - - updateMenuItems: function() {}, - - //show menu - show: function(trigger) { - if (lastShownContexMenu && lastShownContexMenu != this) - lastShownContexMenu.hide(); - this.fx.start(1); - this.fireEvent('show'); - this.shown = true; - lastShownContexMenu = this; - return this; - }, - - //hide the menu - hide: function(trigger) { - if (this.shown) { - this.fx.start(0); - //this.menu.fade('out'); - this.fireEvent('hide'); - this.shown = false; - } - return this; - }, - - setItemChecked: function(item, checked) { - this.menu.getElement('a[href$=' + item + ']').firstChild.style.opacity = - checked ? '1' : '0'; - return this; - }, - - getItemChecked: function(item) { - return '0' != this.menu.getElement('a[href$=' + item + ']').firstChild.style.opacity; - }, - - //hide an item - hideItem: function(item) { - this.menu.getElement('a[href$=' + item + ']').parentNode.addClass('invisible'); - return this; - }, - - //show an item - showItem: function(item) { - this.menu.getElement('a[href$=' + item + ']').parentNode.removeClass('invisible'); - return this; - }, - - //disable the entire menu - disable: function() { - this.options.disabled = true; - return this; - }, - - //enable the entire menu - enable: function() { - this.options.disabled = false; - return this; - }, - - //execute an action - execute: function(action, element) { - if (this.options.actions[action]) { - this.options.actions[action](element, this, action); - } - return this; - } -}); - -var TorrentsTableContextMenu = new Class({ - Extends: ContextMenu, - - updateMenuItems: function() { - all_are_seq_dl = true; - there_are_seq_dl = false; - all_are_f_l_piece_prio = true; - there_are_f_l_piece_prio = false; - all_are_downloaded = true; - all_are_paused = true; - there_are_paused = false; - all_are_force_start = true; - there_are_force_start = false; - all_are_super_seeding = true; - all_are_auto_tmm = true; - there_are_auto_tmm = false; - - var h = torrentsTable.selectedRowsIds(); - h.each(function(item, index) { - var data = torrentsTable.rows.get(item).full_data; - - if (data['seq_dl'] !== true) - all_are_seq_dl = false; - else - there_are_seq_dl = true; - - if (data['f_l_piece_prio'] !== true) - all_are_f_l_piece_prio = false; - else - there_are_f_l_piece_prio = true; - - if (data['progress'] != 1.0) // not downloaded - all_are_downloaded = false; - else if (data['super_seeding'] !== true) - all_are_super_seeding = false; - - if (data['state'] != 'pausedUP' && data['state'] != 'pausedDL') - all_are_paused = false; - else - there_are_paused = true; - - if (data['force_start'] !== true) - all_are_force_start = false; - else - there_are_force_start = true; - - if (data['auto_tmm'] === true) - there_are_auto_tmm = true; - else - all_are_auto_tmm = false; - }); - - show_seq_dl = true; - - if (!all_are_seq_dl && there_are_seq_dl) - show_seq_dl = false; - - show_f_l_piece_prio = true; - - if (!all_are_f_l_piece_prio && there_are_f_l_piece_prio) - show_f_l_piece_prio = false; - - if (all_are_downloaded) { - this.hideItem('DownloadLimit'); - this.menu.getElement('a[href$=UploadLimit]').parentNode.addClass('separator'); - this.hideItem('SequentialDownload'); - this.hideItem('FirstLastPiecePrio'); - this.showItem('SuperSeeding'); - this.setItemChecked('SuperSeeding', all_are_super_seeding); - } - else { - if (!show_seq_dl && show_f_l_piece_prio) - this.menu.getElement('a[href$=FirstLastPiecePrio]').parentNode.addClass('separator'); - else - this.menu.getElement('a[href$=FirstLastPiecePrio]').parentNode.removeClass('separator'); - - if (show_seq_dl) - this.showItem('SequentialDownload'); - else - this.hideItem('SequentialDownload'); - - if (show_f_l_piece_prio) - this.showItem('FirstLastPiecePrio'); - else - this.hideItem('FirstLastPiecePrio'); - - this.setItemChecked('SequentialDownload', all_are_seq_dl); - this.setItemChecked('FirstLastPiecePrio', all_are_f_l_piece_prio); - - this.showItem('DownloadLimit'); - this.menu.getElement('a[href$=UploadLimit]').parentNode.removeClass('separator'); - this.hideItem('SuperSeeding'); - } - - this.showItem('Start'); - this.showItem('Pause'); - this.showItem('ForceStart'); - if (all_are_paused) - this.hideItem('Pause'); - else if (all_are_force_start) - this.hideItem('ForceStart'); - else if (!there_are_paused && !there_are_force_start) - this.hideItem('Start'); - - if (!all_are_auto_tmm && there_are_auto_tmm) - this.hideItem('AutoTorrentManagement'); - else - this.setItemChecked('AutoTorrentManagement', all_are_auto_tmm); - - }, - - updateCategoriesSubMenu: function(category_list) { - var categoryList = $('contextCategoryList'); - categoryList.empty(); - categoryList.appendChild(new Element('li', { - html: 'QBT_TR(New...)QBT_TR[CONTEXT=TransferListWidget] QBT_TR(New...)QBT_TR[CONTEXT=TransferListWidget]' - })); - categoryList.appendChild(new Element('li', { - html: 'QBT_TR(Reset)QBT_TR[CONTEXT=TransferListWidget] QBT_TR(Reset)QBT_TR[CONTEXT=TransferListWidget]' - })); - - var sortedCategories = []; - Object.each(category_list, function(category) { - sortedCategories.push(category.name); - }); - sortedCategories.sort(); - - var first = true; - Object.each(sortedCategories, function(categoryName) { - var categoryHash = genHash(categoryName); - var el = new Element('li', { - html: ' ' + escapeHtml(categoryName) + '' - }); - if (first) { - el.addClass('separator'); - first = false; - } - categoryList.appendChild(el); - }); - } -}); - -var CategoriesFilterContextMenu = new Class({ - Extends: ContextMenu, - updateMenuItems: function() { - var id = this.options.element.id; - if ((id != CATEGORIES_ALL) && (id != CATEGORIES_UNCATEGORIZED)) { - this.showItem('EditCategory'); - this.showItem('DeleteCategory'); - } - else { - this.hideItem('EditCategory'); - this.hideItem('DeleteCategory'); - } - } -}); diff -Nru qbittorrent-4.1.3/src/webui/www/private/scripts/download.js qbittorrent-3.3.15/src/webui/www/private/scripts/download.js --- qbittorrent-4.1.3/src/webui/www/private/scripts/download.js 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/scripts/download.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -/* - * MIT License - * Copyright (c) 2008 Ishan Arora - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -getSavePath = function() { - var req = new Request({ - url: 'api/v2/app/defaultSavePath', - method: 'get', - noCache: true, - onFailure: function() { - alert("Could not contact qBittorrent"); - }, - onSuccess: function(data) { - if (data) { - $('savepath').setProperty('value', data); - } - } - }).send(); -}; - -$(window).addEventListener("load", function() { - getSavePath(); -}); diff -Nru qbittorrent-4.1.3/src/webui/www/private/scripts/dynamicTable.js qbittorrent-3.3.15/src/webui/www/private/scripts/dynamicTable.js --- qbittorrent-4.1.3/src/webui/www/private/scripts/dynamicTable.js 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/scripts/dynamicTable.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,1356 +0,0 @@ -/* - * MIT License - * Copyright (c) 2008 Ishan Arora & Christophe Dumez - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -/************************************************************** - - Script : Dynamic Table - Version : 0.5 - Authors : Ishan Arora & Christophe Dumez - Desc : Programmable sortable table - Licence : Open Source MIT Licence - - **************************************************************/ - -var DynamicTableHeaderContextMenuClass = null; -var ProgressColumnWidth = -1; - -var DynamicTable = new Class({ - - initialize: function() {}, - - setup: function(dynamicTableDivId, dynamicTableFixedHeaderDivId, contextMenu) { - this.dynamicTableDivId = dynamicTableDivId; - this.dynamicTableFixedHeaderDivId = dynamicTableFixedHeaderDivId; - this.fixedTableHeader = $(dynamicTableFixedHeaderDivId).getElements('tr')[0]; - this.hiddenTableHeader = $(dynamicTableDivId).getElements('tr')[0]; - this.tableBody = $(dynamicTableDivId).getElements('tbody')[0]; - this.rows = new Hash(); - this.selectedRows = []; - this.columns = []; - this.contextMenu = contextMenu; - this.sortedColumn = getLocalStorageItem('sorted_column_' + this.dynamicTableDivId, 0); - this.reverseSort = getLocalStorageItem('reverse_sort_' + this.dynamicTableDivId, '0'); - this.initColumns(); - this.loadColumnsOrder(); - this.updateTableHeaders(); - this.setupCommonEvents(); - this.setupHeaderEvents(); - this.setupHeaderMenu(); - }, - - setupCommonEvents: function() { - var scrollFn = function() { - $(this.dynamicTableFixedHeaderDivId).getElements('table')[0].style.left = -$(this.dynamicTableDivId).scrollLeft + 'px'; - }.bind(this); - - $(this.dynamicTableDivId).addEvent('scroll', scrollFn); - - var resizeFn = function() { - var panel = $(this.dynamicTableDivId).getParent('.panel'); - var h = panel.getBoundingClientRect().height - $(this.dynamicTableFixedHeaderDivId).getBoundingClientRect().height; - $(this.dynamicTableDivId).style.height = h + 'px'; - - // Workaround due to inaccurate calculation of elements heights by browser - - var n = 2; - - while (panel.clientWidth != panel.offsetWidth && n > 0) { // is panel vertical scrollbar visible ? - --n; - h -= 0.5; - $(this.dynamicTableDivId).style.height = h + 'px'; - } - - this.lastPanelHeight = panel.getBoundingClientRect().height; - }.bind(this); - - $(this.dynamicTableDivId).getParent('.panel').addEvent('resize', resizeFn); - - this.lastPanelHeight = 0; - - // Workaround. Resize event is called not always (for example it isn't called when browser window changes it's size) - - var checkResizeFn = function() { - var panel = $(this.dynamicTableDivId).getParent('.panel'); - if (this.lastPanelHeight != panel.getBoundingClientRect().height) { - this.lastPanelHeight = panel.getBoundingClientRect().height; - panel.fireEvent('resize'); - } - }.bind(this); - - setInterval(checkResizeFn, 500); - }, - - setupHeaderEvents: function() { - this.currentHeaderAction = ''; - this.canResize = false; - - var resetElementBorderStyle = function(el, side) { - if (side === 'left' || side !== 'right') { - el.setStyle('border-left-style', ''); - el.setStyle('border-left-color', ''); - el.setStyle('border-left-width', ''); - } - if (side === 'right' || side !== 'left') { - el.setStyle('border-right-style', ''); - el.setStyle('border-right-color', ''); - el.setStyle('border-right-width', ''); - } - }; - - var mouseMoveFn = function(e) { - var brect = e.target.getBoundingClientRect(); - var mouseXRelative = e.event.clientX - brect.left; - if (this.currentHeaderAction === '') { - if (brect.width - mouseXRelative < 5) { - this.resizeTh = e.target; - this.canResize = true; - e.target.getParent("tr").style.cursor = 'col-resize'; - } - else if ((mouseXRelative < 5) && e.target.getPrevious('[class=""]')) { - this.resizeTh = e.target.getPrevious('[class=""]'); - this.canResize = true; - e.target.getParent("tr").style.cursor = 'col-resize'; - } - else { - this.canResize = false; - e.target.getParent("tr").style.cursor = ''; - } - } - if (this.currentHeaderAction === 'drag') { - var previousVisibleSibling = e.target.getPrevious('[class=""]'); - var borderChangeElement = previousVisibleSibling; - var changeBorderSide = 'right'; - - if (mouseXRelative > brect.width / 2) { - borderChangeElement = e.target; - this.dropSide = 'right'; - } - else { - this.dropSide = 'left'; - } - - e.target.getParent("tr").style.cursor = 'move'; - - if (!previousVisibleSibling) { // right most column - borderChangeElement = e.target; - - if (mouseXRelative <= brect.width / 2) - changeBorderSide = 'left'; - } - - borderChangeElement.setStyle('border-' + changeBorderSide + '-style', 'solid'); - borderChangeElement.setStyle('border-' + changeBorderSide + '-color', '#e60'); - borderChangeElement.setStyle('border-' + changeBorderSide + '-width', 'initial'); - - resetElementBorderStyle(borderChangeElement, changeBorderSide === 'right' ? 'left' : 'right'); - - borderChangeElement.getSiblings('[class=""]').each(function(el) { - resetElementBorderStyle(el); - }); - } - this.lastHoverTh = e.target; - this.lastClientX = e.event.clientX; - }.bind(this); - - var mouseOutFn = function(e) { - resetElementBorderStyle(e.target); - }.bind(this); - - var onBeforeStart = function(el) { - this.clickedTh = el; - this.currentHeaderAction = 'start'; - this.dragMovement = false; - this.dragStartX = this.lastClientX; - }.bind(this); - - var onStart = function(el, event) { - if (this.canResize) { - this.currentHeaderAction = 'resize'; - this.startWidth = this.resizeTh.getStyle('width').toFloat(); - } - else { - this.currentHeaderAction = 'drag'; - el.setStyle('background-color', '#C1D5E7'); - } - }.bind(this); - - var onDrag = function(el, event) { - if (this.currentHeaderAction === 'resize') { - var width = this.startWidth + (event.page.x - this.dragStartX); - if (width < 16) - width = 16; - this.columns[this.resizeTh.columnName].width = width; - this.updateColumn(this.resizeTh.columnName); - } - }.bind(this); - - var onComplete = function(el, event) { - resetElementBorderStyle(this.lastHoverTh); - el.setStyle('background-color', ''); - if (this.currentHeaderAction === 'resize') - localStorage.setItem('column_' + this.resizeTh.columnName + '_width_' + this.dynamicTableDivId, this.columns[this.resizeTh.columnName].width); - if ((this.currentHeaderAction === 'drag') && (el !== this.lastHoverTh)) { - this.saveColumnsOrder(); - var val = localStorage.getItem('columns_order_' + this.dynamicTableDivId).split(','); - val.erase(el.columnName); - var pos = val.indexOf(this.lastHoverTh.columnName); - if (this.dropSide === 'right') ++pos; - val.splice(pos, 0, el.columnName); - localStorage.setItem('columns_order_' + this.dynamicTableDivId, val.join(',')); - this.loadColumnsOrder(); - this.updateTableHeaders(); - while (this.tableBody.firstChild) - this.tableBody.removeChild(this.tableBody.firstChild); - this.updateTable(true); - } - if (this.currentHeaderAction === 'drag') { - resetElementBorderStyle(el); - el.getSiblings('[class=""]').each(function(el) { - resetElementBorderStyle(el); - }); - } - this.currentHeaderAction = ''; - }.bind(this); - - var onCancel = function(el) { - this.currentHeaderAction = ''; - this.setSortedColumn(el.columnName); - }.bind(this); - - var ths = this.fixedTableHeader.getElements('th'); - - for (var i = 0; i < ths.length; ++i) { - var th = ths[i]; - th.addEvent('mousemove', mouseMoveFn); - th.addEvent('mouseout', mouseOutFn); - th.makeResizable({ - modifiers: { - x: '', - y: '' - }, - onBeforeStart: onBeforeStart, - onStart: onStart, - onDrag: onDrag, - onComplete: onComplete, - onCancel: onCancel - }); - } - }, - - setupDynamicTableHeaderContextMenuClass: function() { - if (!DynamicTableHeaderContextMenuClass) { - DynamicTableHeaderContextMenuClass = new Class({ - Extends: ContextMenu, - updateMenuItems: function() { - for (var i = 0; i < this.dynamicTable.columns.length; ++i) { - if (this.dynamicTable.columns[i].caption === '') - continue; - if (this.dynamicTable.columns[i].visible !== '0') - this.setItemChecked(this.dynamicTable.columns[i].name, true); - else - this.setItemChecked(this.dynamicTable.columns[i].name, false); - } - } - }); - } - }, - - showColumn: function(columnName, show) { - this.columns[columnName].visible = show ? '1' : '0'; - localStorage.setItem('column_' + columnName + '_visible_' + this.dynamicTableDivId, show ? '1' : '0'); - this.updateColumn(columnName); - }, - - setupHeaderMenu: function() { - this.setupDynamicTableHeaderContextMenuClass(); - - var menuId = this.dynamicTableDivId + '_headerMenu'; - - var ul = new Element('ul', { - id: menuId, - class: 'contextMenu scrollableMenu' - }); - - var createLi = function(columnName, text) { - var html = '' + escapeHtml(text) + ''; - return new Element('li', { - html: html - }); - }; - - var actions = {}; - - var onMenuItemClicked = function(element, ref, action) { - this.showColumn(action, this.columns[action].visible === '0'); - }.bind(this); - - for (var i = 0; i < this.columns.length; ++i) { - var text = this.columns[i].caption; - if (text === '') - continue; - ul.appendChild(createLi(this.columns[i].name, text)); - actions[this.columns[i].name] = onMenuItemClicked; - } - - ul.inject(document.body); - - this.headerContextMenu = new DynamicTableHeaderContextMenuClass({ - targets: '#' + this.dynamicTableFixedHeaderDivId + ' tr', - actions: actions, - menu: menuId, - offsets: { - x: -15, - y: 2 - } - }); - - this.headerContextMenu.dynamicTable = this; - }, - - initColumns: function() {}, - - newColumn: function(name, style, caption, defaultWidth, defaultVisible) { - var column = {}; - column['name'] = name; - column['visible'] = getLocalStorageItem('column_' + name + '_visible_' + this.dynamicTableDivId, defaultVisible ? '1' : '0'); - column['force_hide'] = false; - column['caption'] = caption; - column['style'] = style; - column['width'] = getLocalStorageItem('column_' + name + '_width_' + this.dynamicTableDivId, defaultWidth); - column['dataProperties'] = [name]; - column['getRowValue'] = function(row, pos) { - if (pos === undefined) - pos = 0; - return row['full_data'][this.dataProperties[pos]]; - }; - column['compareRows'] = function(row1, row2) { - if (this.getRowValue(row1) < this.getRowValue(row2)) - return -1; - else if (this.getRowValue(row1) > this.getRowValue(row2)) - return 1; - else return 0; - }; - column['updateTd'] = function(td, row) { - td.innerHTML = this.getRowValue(row); - }; - column['onResize'] = null; - this.columns.push(column); - this.columns[name] = column; - - this.hiddenTableHeader.appendChild(new Element('th')); - this.fixedTableHeader.appendChild(new Element('th')); - }, - - loadColumnsOrder: function() { - var columnsOrder = []; - var val = localStorage.getItem('columns_order_' + this.dynamicTableDivId); - if (val === null || val === undefined) return; - val.split(',').forEach(function(v) { - if ((v in this.columns) && (!columnsOrder.contains(v))) - columnsOrder.push(v); - }.bind(this)); - - for (i = 0; i < this.columns.length; ++i) - if (!columnsOrder.contains(this.columns[i].name)) - columnsOrder.push(this.columns[i].name); - - for (i = 0; i < this.columns.length; ++i) - this.columns[i] = this.columns[columnsOrder[i]]; - }, - - saveColumnsOrder: function() { - val = ''; - for (i = 0; i < this.columns.length; ++i) { - if (i > 0) - val += ','; - val += this.columns[i].name; - } - localStorage.setItem('columns_order_' + this.dynamicTableDivId, val); - }, - - updateTableHeaders: function() { - this.updateHeader(this.hiddenTableHeader); - this.updateHeader(this.fixedTableHeader); - }, - - updateHeader: function(header) { - var ths = header.getElements('th'); - - for (var i = 0; i < ths.length; ++i) { - th = ths[i]; - th._this = this; - th.setAttribute('title', this.columns[i].caption); - th.innerHTML = this.columns[i].caption; - th.setAttribute('style', 'width: ' + this.columns[i].width + 'px;' + this.columns[i].style); - th.columnName = this.columns[i].name; - if ((this.columns[i].visible == '0') || this.columns[i].force_hide) - th.addClass('invisible'); - else - th.removeClass('invisible'); - } - }, - - getColumnPos: function(columnName) { - for (var i = 0; i < this.columns.length; ++i) - if (this.columns[i].name == columnName) - return i; - return -1; - }, - - updateColumn: function(columnName) { - var pos = this.getColumnPos(columnName); - var visible = ((this.columns[pos].visible != '0') && !this.columns[pos].force_hide); - var ths = this.hiddenTableHeader.getElements('th'); - var fths = this.fixedTableHeader.getElements('th'); - var trs = this.tableBody.getElements('tr'); - var style = 'width: ' + this.columns[pos].width + 'px;' + this.columns[pos].style; - - ths[pos].setAttribute('style', style); - fths[pos].setAttribute('style', style); - - if (visible) { - ths[pos].removeClass('invisible'); - fths[pos].removeClass('invisible'); - for (var i = 0; i < trs.length; ++i) - trs[i].getElements('td')[pos].removeClass('invisible'); - } - else { - ths[pos].addClass('invisible'); - fths[pos].addClass('invisible'); - for (var j = 0; j < trs.length; ++j) - trs[j].getElements('td')[pos].addClass('invisible'); - } - if (this.columns[pos].onResize !== null) { - this.columns[pos].onResize(columnName); - } - }, - - setSortedColumn: function(column) { - if (column != this.sortedColumn) { - this.sortedColumn = column; - this.reverseSort = '0'; - } - else { - // Toggle sort order - this.reverseSort = this.reverseSort == '0' ? '1' : '0'; - } - localStorage.setItem('sorted_column_' + this.dynamicTableDivId, column); - localStorage.setItem('reverse_sort_' + this.dynamicTableDivId, this.reverseSort); - this.updateTable(false); - }, - - getSelectedRowId: function() { - if (this.selectedRows.length > 0) - return this.selectedRows[0]; - return ''; - }, - - isRowSelected: function(rowId) { - return this.selectedRows.contains(rowId); - }, - - altRow: function() { - if (!MUI.ieLegacySupport) - return; - - var trs = this.tableBody.getElements('tr'); - trs.each(function(el, i) { - if (i % 2) { - el.addClass('alt'); - } - else { - el.removeClass('alt'); - } - }.bind(this)); - }, - - selectAll: function() { - this.deselectAll(); - - var trs = this.tableBody.getElements('tr'); - for (var i = 0; i < trs.length; ++i) { - var tr = trs[i]; - this.selectedRows.push(tr.rowId); - if (!tr.hasClass('selected')) - tr.addClass('selected'); - } - }, - - deselectAll: function() { - this.selectedRows.empty(); - }, - - selectRow: function(rowId) { - this.selectedRows.push(rowId); - this.setRowClass(); - this.onSelectedRowChanged(); - }, - - deselectRow: function(rowId) { - this.selectedRows.erase(rowId); - this.setRowClass(); - this.onSelectedRowChanged(); - }, - - selectRows: function(rowId1, rowId2) { - this.deselectAll(); - if (rowId1 === rowId2) { - this.selectRow(rowId1); - return; - } - - var select = false; - var that = this; - this.tableBody.getElements('tr').each(function(tr) { - if ((tr.rowId == rowId1) || (tr.rowId == rowId2)) { - select = !select; - that.selectedRows.push(tr.rowId); - } - else if (select) { - that.selectedRows.push(tr.rowId); - } - }); - this.setRowClass(); - this.onSelectedRowChanged(); - }, - - reselectRows: function(rowIds) { - this.deselectAll(); - this.selectedRows = rowIds.slice(); - this.tableBody.getElements('tr').each(function(tr) { - if (rowIds.indexOf(tr.rowId) > -1) - tr.addClass('selected'); - }); - }, - - setRowClass: function() { - var that = this; - this.tableBody.getElements('tr').each(function(tr) { - if (that.isRowSelected(tr.rowId)) - tr.addClass('selected'); - else - tr.removeClass('selected'); - }); - }, - - onSelectedRowChanged: function() {}, - - updateRowData: function(data) { - var rowId = data['rowId']; - var row; - - if (!this.rows.has(rowId)) { - row = {}; - this.rows.set(rowId, row); - row['full_data'] = {}; - row['rowId'] = rowId; - } - else - row = this.rows.get(rowId); - - row['data'] = data; - - for (var x in data) - row['full_data'][x] = data[x]; - }, - - getFilteredAndSortedRows: function() { - var filteredRows = []; - - var rows = this.rows.getValues(); - - for (i = 0; i < rows.length; ++i) { - filteredRows.push(rows[i]); - filteredRows[rows[i].rowId] = rows[i]; - } - - filteredRows.sort(function(row1, row2) { - var column = this.columns[this.sortedColumn]; - res = column.compareRows(row1, row2); - if (this.reverseSort == '0') - return res; - else - return -res; - }.bind(this)); - return filteredRows; - }, - - getTrByRowId: function(rowId) { - trs = this.tableBody.getElements('tr'); - for (var i = 0; i < trs.length; ++i) - if (trs[i].rowId == rowId) - return trs[i]; - return null; - }, - - updateTable: function(fullUpdate) { - if (fullUpdate === undefined) - fullUpdate = false; - - var rows = this.getFilteredAndSortedRows(); - - for (var i = 0; i < this.selectedRows.length; ++i) - if (!(this.selectedRows[i] in rows)) { - this.selectedRows.splice(i, 1); - --i; - } - - var trs = this.tableBody.getElements('tr'); - - for (var rowPos = 0; rowPos < rows.length; ++rowPos) { - var rowId = rows[rowPos]['rowId']; - tr_found = false; - for (var j = rowPos; j < trs.length; ++j) - if (trs[j]['rowId'] == rowId) { - tr_found = true; - if (rowPos == j) - break; - trs[j].inject(trs[rowPos], 'before'); - var tmpTr = trs[j]; - trs.splice(j, 1); - trs.splice(rowPos, 0, tmpTr); - break; - } - if (tr_found) // row already exists in the table - this.updateRow(trs[rowPos], fullUpdate); - else { // else create a new row in the table - var tr = new Element('tr'); - - tr['rowId'] = rows[rowPos]['rowId']; - - tr._this = this; - tr.addEvent('contextmenu', function(e) { - if (!this._this.isRowSelected(this.rowId)) { - this._this.deselectAll(); - this._this.selectRow(this.rowId); - } - return true; - }); - tr.addEvent('click', function(e) { - e.stop(); - if (e.control || e.meta) { - // CTRL/CMD ⌘ key was pressed - if (this._this.isRowSelected(this.rowId)) - this._this.deselectRow(this.rowId); - else - this._this.selectRow(this.rowId); - } - else if (e.shift && (this._this.selectedRows.length == 1)) { - // Shift key was pressed - this._this.selectRows(this._this.getSelectedRowId(), this.rowId); - } - else { - // Simple selection - this._this.deselectAll(); - this._this.selectRow(this.rowId); - } - return false; - }); - - this.setupTr(tr); - - for (var k = 0; k < this.columns.length; ++k) { - var td = new Element('td'); - if ((this.columns[k].visible == '0') || this.columns[k].force_hide) - td.addClass('invisible'); - td.injectInside(tr); - } - - // Insert - if (rowPos >= trs.length) { - tr.inject(this.tableBody); - trs.push(tr); - } - else { - tr.inject(trs[rowPos], 'before'); - trs.splice(rowPos, 0, tr); - } - - // Update context menu - if (this.contextMenu) - this.contextMenu.addTarget(tr); - - this.updateRow(tr, true); - } - } - - rowPos = rows.length; - - while ((rowPos < trs.length) && (trs.length > 0)) { - trs[trs.length - 1].dispose(); - trs.pop(); - } - }, - - setupTr: function(tr) {}, - - updateRow: function(tr, fullUpdate) { - var row = this.rows.get(tr.rowId); - data = row[fullUpdate ? 'full_data' : 'data']; - - tds = tr.getElements('td'); - for (var i = 0; i < this.columns.length; ++i) { - if (data.hasOwnProperty(this.columns[i].dataProperties[0])) - this.columns[i].updateTd(tds[i], row); - } - row['data'] = {}; - }, - - removeRow: function(rowId) { - this.selectedRows.erase(rowId); - var tr = this.getTrByRowId(rowId); - if (tr !== null) { - tr.dispose(); - this.rows.erase(rowId); - return true; - } - return false; - }, - - clear: function() { - this.deselectAll(); - this.rows.empty(); - var trs = this.tableBody.getElements('tr'); - while (trs.length > 0) { - trs[trs.length - 1].dispose(); - trs.pop(); - } - }, - - selectedRowsIds: function() { - return this.selectedRows.slice(); - }, - - getRowIds: function() { - return this.rows.getKeys(); - }, -}); - -var TorrentsTable = new Class({ - Extends: DynamicTable, - - initColumns: function() { - this.newColumn('priority', '', '#', 30, true); - this.newColumn('state_icon', 'cursor: default', '', 22, true); - this.newColumn('name', '', 'QBT_TR(Name)QBT_TR[CONTEXT=TransferListModel]', 200, true); - this.newColumn('size', '', 'QBT_TR(Size)QBT_TR[CONTEXT=TransferListModel]', 100, true); - this.newColumn('total_size', '', 'QBT_TR(Total Size)QBT_TR[CONTEXT=TransferListModel]', 100, false); - this.newColumn('progress', '', 'QBT_TR(Done)QBT_TR[CONTEXT=TransferListModel]', 85, true); - this.newColumn('status', '', 'QBT_TR(Status)QBT_TR[CONTEXT=TransferListModel]', 100, true); - this.newColumn('num_seeds', '', 'QBT_TR(Seeds)QBT_TR[CONTEXT=TransferListModel]', 100, true); - this.newColumn('num_leechs', '', 'QBT_TR(Peers)QBT_TR[CONTEXT=TransferListModel]', 100, true); - this.newColumn('dlspeed', '', 'QBT_TR(Down Speed)QBT_TR[CONTEXT=TransferListModel]', 100, true); - this.newColumn('upspeed', '', 'QBT_TR(Up Speed)QBT_TR[CONTEXT=TransferListModel]', 100, true); - this.newColumn('eta', '', 'QBT_TR(ETA)QBT_TR[CONTEXT=TransferListModel]', 100, true); - this.newColumn('ratio', '', 'QBT_TR(Ratio)QBT_TR[CONTEXT=TransferListModel]', 100, true); - this.newColumn('category', '', 'QBT_TR(Category)QBT_TR[CONTEXT=TransferListModel]', 100, true); - this.newColumn('tags', '', 'QBT_TR(Tags)QBT_TR[CONTEXT=TransferListModel]', 100, true); - this.newColumn('added_on', '', 'QBT_TR(Added On)QBT_TR[CONTEXT=TransferListModel]', 100, true); - this.newColumn('completion_on', '', 'QBT_TR(Completed On)QBT_TR[CONTEXT=TransferListModel]', 100, false); - this.newColumn('tracker', '', 'QBT_TR(Tracker)QBT_TR[CONTEXT=TransferListModel]', 100, false); - this.newColumn('dl_limit', '', 'QBT_TR(Down Limit)QBT_TR[CONTEXT=TransferListModel]', 100, false); - this.newColumn('up_limit', '', 'QBT_TR(Up Limit)QBT_TR[CONTEXT=TransferListModel]', 100, false); - this.newColumn('downloaded', '', 'QBT_TR(Downloaded)QBT_TR[CONTEXT=TransferListModel]', 100, false); - this.newColumn('uploaded', '', 'QBT_TR(Uploaded)QBT_TR[CONTEXT=TransferListModel]', 100, false); - this.newColumn('downloaded_session', '', 'QBT_TR(Session Download)QBT_TR[CONTEXT=TransferListModel]', 100, false); - this.newColumn('uploaded_session', '', 'QBT_TR(Session Upload)QBT_TR[CONTEXT=TransferListModel]', 100, false); - this.newColumn('amount_left', '', 'QBT_TR(Remaining)QBT_TR[CONTEXT=TransferListModel]', 100, false); - this.newColumn('time_active', '', 'QBT_TR(Time Active)QBT_TR[CONTEXT=TransferListModel]', 100, false); - this.newColumn('save_path', '', 'QBT_TR(Save path)QBT_TR[CONTEXT=TransferListModel]', 100, false); - this.newColumn('completed', '', 'QBT_TR(Completed)QBT_TR[CONTEXT=TransferListModel]', 100, false); - this.newColumn('max_ratio', '', 'QBT_TR(Ratio Limit)QBT_TR[CONTEXT=TransferListModel]', 100, false); - this.newColumn('seen_complete', '', 'QBT_TR(Last Seen Complete)QBT_TR[CONTEXT=TransferListModel]', 100, false); - this.newColumn('last_activity', '', 'QBT_TR(Last Activity)QBT_TR[CONTEXT=TransferListModel]', 100, false); - - this.columns['state_icon'].onclick = ''; - this.columns['state_icon'].dataProperties[0] = 'state'; - - this.columns['num_seeds'].dataProperties.push('num_complete'); - - this.columns['num_leechs'].dataProperties.push('num_incomplete'); - - this.initColumnsFunctions(); - }, - - initColumnsFunctions: function() { - - // state_icon - this.columns['state_icon'].updateTd = function(td, row) { - var state = this.getRowValue(row); - // normalize states - switch (state) { - case "forcedDL": - case "metaDL": - state = "downloading"; - break; - case "allocating": - state = "stalledDL"; - break; - case "forcedUP": - state = "uploading"; - break; - case "pausedDL": - state = "paused"; - break; - case "pausedUP": - state = "completed"; - break; - case "queuedDL": - case "queuedUP": - state = "queued"; - break; - case "checkingDL": - case "checkingUP": - case "queuedForChecking": - case "checkingResumeData": - case "moving": - state = "checking"; - break; - case "unknown": - case "missingFiles": - state = "error"; - break; - default: - break; // do nothing - } - - var img_path = 'images/skin/' + state + '.svg'; - - if (td.getChildren('img').length) { - var img = td.getChildren('img')[0]; - if (img.src.indexOf(img_path) < 0) - img.set('src', img_path); - } - else - td.adopt(new Element('img', { - 'src': img_path, - 'class': 'stateIcon' - })); - }; - - // status - this.columns['status'].updateTd = function(td, row) { - var state = this.getRowValue(row); - if (!state) return; - - var status; - switch (state) { - case "downloading": - status = "Downloading"; - break; - case "stalledDL": - status = "Stalled"; - break; - case "metaDL": - status = "Downloading metadata"; - break; - case "forcedDL": - status = "[F] Downloading"; - break; - case "allocating": - status = "Allocating"; - break; - case "uploading": - case "stalledUP": - status = "Seeding"; - break; - case "forcedUP": - status = "[F] Seeding"; - break; - case "queuedDL": - case "queuedUP": - status = "Queued"; - break; - case "checkingDL": - case "checkingUP": - status = "Checking"; - break; - case "queuedForChecking": - status = "Queued for checking"; - break; - case "checkingResumeData": - status = "Checking resume data"; - break; - case "pausedDL": - status = "Paused"; - break; - case "pausedUP": - status = "Completed"; - break; - case "moving": - status = "Moving"; - break; - case "missingFiles": - status = "Missing Files"; - break; - case "error": - status = "Errored"; - break; - default: - status = "Unknown"; - } - - td.set('html', status); - }; - - // priority - this.columns['priority'].updateTd = function(td, row) { - var priority = this.getRowValue(row); - td.set('html', priority < 1 ? '*' : priority); - }; - - this.columns['priority'].compareRows = function(row1, row2) { - var row1_val = this.getRowValue(row1); - var row2_val = this.getRowValue(row2); - if (row1_val < 1) - row1_val = 1000000; - if (row2_val < 1) - row2_val = 1000000; - if (row1_val < row2_val) - return -1; - else if (row1_val > row2_val) - return 1; - else return 0; - }; - - // name, category - this.columns['name'].updateTd = function(td, row) { - td.set('html', escapeHtml(this.getRowValue(row))); - }; - this.columns['category'].updateTd = this.columns['name'].updateTd; - - // size - this.columns['size'].updateTd = function(td, row) { - var size = this.getRowValue(row); - td.set('html', friendlyUnit(size, false)); - }; - - // progress - this.columns['progress'].updateTd = function(td, row) { - var progress = this.getRowValue(row); - var progressFormated = (progress * 100).round(1); - if (progressFormated == 100.0 && progress != 1.0) - progressFormated = 99.9; - - if (td.getChildren('div').length) { - var div = td.getChildren('div')[0]; - if (td.resized) { - td.resized = false; - div.setWidth(ProgressColumnWidth - 5); - } - if (div.getValue() != progressFormated) - div.setValue(progressFormated); - } - else { - if (ProgressColumnWidth < 0) - ProgressColumnWidth = td.offsetWidth; - td.adopt(new ProgressBar(progressFormated.toFloat(), { - 'width': ProgressColumnWidth - 5 - })); - td.resized = false; - } - }; - - this.columns['progress'].onResize = function(columnName) { - var pos = this.getColumnPos(columnName); - var trs = this.tableBody.getElements('tr'); - ProgressColumnWidth = -1; - for (var i = 0; i < trs.length; ++i) { - var td = trs[i].getElements('td')[pos]; - if (ProgressColumnWidth < 0) - ProgressColumnWidth = td.offsetWidth; - td.resized = true; - this.columns[columnName].updateTd(td, this.rows.get(trs[i].rowId)); - } - }.bind(this); - - // num_seeds - this.columns['num_seeds'].updateTd = function(td, row) { - var num_seeds = this.getRowValue(row, 0); - var num_complete = this.getRowValue(row, 1); - var html = num_seeds; - if (num_complete != -1) - html += ' (' + num_complete + ')'; - td.set('html', html); - }; - this.columns['num_seeds'].compareRows = function(row1, row2) { - var num_seeds1 = this.getRowValue(row1, 0); - var num_complete1 = this.getRowValue(row1, 1); - - var num_seeds2 = this.getRowValue(row2, 0); - var num_complete2 = this.getRowValue(row2, 1); - - if (num_complete1 < num_complete2) - return -1; - else if (num_complete1 > num_complete2) - return 1; - else if (num_seeds1 < num_seeds2) - return -1; - else if (num_seeds1 > num_seeds2) - return 1; - else return 0; - }; - - // num_leechs - this.columns['num_leechs'].updateTd = this.columns['num_seeds'].updateTd; - this.columns['num_leechs'].compareRows = this.columns['num_seeds'].compareRows; - - // dlspeed - this.columns['dlspeed'].updateTd = function(td, row) { - var speed = this.getRowValue(row); - td.set('html', friendlyUnit(speed, true)); - }; - - // upspeed - this.columns['upspeed'].updateTd = this.columns['dlspeed'].updateTd; - - // eta - this.columns['eta'].updateTd = function(td, row) { - var eta = this.getRowValue(row); - td.set('html', friendlyDuration(eta, true)); - }; - - // ratio - this.columns['ratio'].updateTd = function(td, row) { - var ratio = this.getRowValue(row); - var html = null; - if (ratio == -1) - html = '∞'; - else - html = (Math.floor(100 * ratio) / 100).toFixed(2); //Don't round up - td.set('html', html); - }; - - // tags - this.columns['tags'].updateTd = this.columns['name'].updateTd; - - // added on - this.columns['added_on'].updateTd = function(td, row) { - var date = new Date(this.getRowValue(row) * 1000).toLocaleString(); - td.set('html', date); - }; - - // completion_on - this.columns['completion_on'].updateTd = function(td, row) { - var val = this.getRowValue(row); - if (val === 0xffffffff || val < 0) - td.set('html', ''); - else { - var date = new Date(this.getRowValue(row) * 1000).toLocaleString(); - td.set('html', date); - } - }; - - // seen_complete - this.columns['seen_complete'].updateTd = this.columns['completion_on'].updateTd; - - // dl_limit, up_limit - this.columns['dl_limit'].updateTd = function(td, row) { - var speed = this.getRowValue(row); - if (speed === 0) - td.set('html', '∞'); - else - td.set('html', friendlyUnit(speed, true)); - }; - - this.columns['up_limit'].updateTd = this.columns['dl_limit'].updateTd; - - // downloaded, uploaded, downloaded_session, uploaded_session, amount_left, completed, total_size - this.columns['downloaded'].updateTd = this.columns['size'].updateTd; - this.columns['uploaded'].updateTd = this.columns['size'].updateTd; - this.columns['downloaded_session'].updateTd = this.columns['size'].updateTd; - this.columns['uploaded_session'].updateTd = this.columns['size'].updateTd; - this.columns['amount_left'].updateTd = this.columns['size'].updateTd; - this.columns['amount_left'].updateTd = this.columns['size'].updateTd; - this.columns['completed'].updateTd = this.columns['size'].updateTd; - this.columns['total_size'].updateTd = this.columns['size'].updateTd; - - // save_path, tracker - this.columns['save_path'].updateTd = this.columns['name'].updateTd; - this.columns['tracker'].updateTd = this.columns['name'].updateTd; - - // max_ratio - this.columns['max_ratio'].updateTd = this.columns['ratio'].updateTd; - - // last_activity - this.columns['last_activity'].updateTd = function(td, row) { - var val = this.getRowValue(row); - if (val < 1) - td.set('html', '∞'); - else - td.set('html', 'QBT_TR(%1 ago)QBT_TR[CONTEXT=TransferListDelegate]'.replace('%1', friendlyDuration((new Date()) / 1000 - val, true))); - }; - - // time active - this.columns['time_active'].updateTd = function(td, row) { - var time = this.getRowValue(row); - td.set('html', friendlyDuration(time)); - }; - }, - - applyFilter: function(row, filterName, categoryHash) { - var state = row['full_data'].state; - var inactive = false; - var r; - - switch (filterName) { - case 'downloading': - if (state != 'downloading' && !~state.indexOf('DL')) - return false; - break; - case 'seeding': - if (state != 'uploading' && state != 'forcedUP' && state != 'stalledUP' && state != 'queuedUP' && state != 'checkingUP') - return false; - break; - case 'completed': - if (state != 'uploading' && !~state.indexOf('UP')) - return false; - break; - case 'paused': - if (!~state.indexOf('paused')) - return false; - break; - case 'resumed': - if (~state.indexOf('paused')) - return false; - break; - case 'inactive': - inactive = true; - // fallthrough - case 'active': - if (state == 'stalledDL') - r = (row['full_data'].upspeed > 0); - else - r = state == 'metaDL' || state == 'downloading' || state == 'forcedDL' || state == 'uploading' || state == 'forcedUP'; - if (r == inactive) - return false; - break; - case 'errored': - if (state != 'error' && state != "unknown" && state != "missingFiles") - return false; - break; - } - - if (categoryHash == CATEGORIES_ALL) - return true; - - if (categoryHash == CATEGORIES_UNCATEGORIZED && row['full_data'].category.length === 0) - return true; - - if (categoryHash != genHash(row['full_data'].category)) - return false; - - return true; - }, - - getFilteredTorrentsNumber: function(filterName, categoryHash) { - var cnt = 0; - var rows = this.rows.getValues(); - - for (i = 0; i < rows.length; ++i) - if (this.applyFilter(rows[i], filterName, categoryHash)) ++cnt; - return cnt; - }, - - getFilteredTorrentsHashes: function(filterName, categoryHash) { - var rowsHashes = []; - var rows = this.rows.getValues(); - - for (i = 0; i < rows.length; ++i) - if (this.applyFilter(rows[i], filterName, categoryHash)) - rowsHashes.push(rows[i]['rowId']); - - return rowsHashes; - }, - - getFilteredAndSortedRows: function() { - var filteredRows = []; - - var rows = this.rows.getValues(); - - for (i = 0; i < rows.length; ++i) - if (this.applyFilter(rows[i], selected_filter, selected_category)) { - filteredRows.push(rows[i]); - filteredRows[rows[i].rowId] = rows[i]; - } - - filteredRows.sort(function(row1, row2) { - var column = this.columns[this.sortedColumn]; - res = column.compareRows(row1, row2); - if (this.reverseSort == '0') - return res; - else - return -res; - }.bind(this)); - return filteredRows; - }, - - setupTr: function(tr) { - tr.addEvent('dblclick', function(e) { - e.stop(); - this._this.deselectAll(); - this._this.selectRow(this.rowId); - var row = this._this.rows.get(this.rowId); - var state = row['full_data'].state; - if (~state.indexOf('paused')) - startFN(); - else - pauseFN(); - return true; - }); - tr.addClass("torrentsTableContextMenuTarget"); - }, - - getCurrentTorrentHash: function() { - return this.getSelectedRowId(); - }, - - onSelectedRowChanged: function() { - updatePropertiesPanel(); - } -}); - -var TorrentPeersTable = new Class({ - Extends: DynamicTable, - - initColumns: function() { - this.newColumn('country', '', 'QBT_TR(Country)QBT_TR[CONTEXT=PeerListWidget]', 22, true); - this.newColumn('ip', '', 'QBT_TR(IP)QBT_TR[CONTEXT=PeerListWidget]', 80, true); - this.newColumn('port', '', 'QBT_TR(Port)QBT_TR[CONTEXT=PeerListWidget]', 35, true); - this.newColumn('client', '', 'QBT_TR(Client)QBT_TR[CONTEXT=PeerListWidget]', 140, true); - this.newColumn('progress', '', 'QBT_TR(Progress)QBT_TR[CONTEXT=PeerListWidget]', 50, true); - this.newColumn('dl_speed', '', 'QBT_TR(Down Speed)QBT_TR[CONTEXT=PeerListWidget]', 50, true); - this.newColumn('up_speed', '', 'QBT_TR(Up Speed)QBT_TR[CONTEXT=PeerListWidget]', 50, true); - this.newColumn('downloaded', '', 'QBT_TR(Downloaded)QBT_TR[CONTEXT=PeerListWidget]', 50, true); - this.newColumn('uploaded', '', 'QBT_TR(Uploaded)QBT_TR[CONTEXT=PeerListWidget]', 50, true); - this.newColumn('connection', '', 'QBT_TR(Connection)QBT_TR[CONTEXT=PeerListWidget]', 50, true); - this.newColumn('flags', '', 'QBT_TR(Flags)QBT_TR[CONTEXT=PeerListWidget]', 50, true); - this.newColumn('relevance', '', 'QBT_TR(Relevance)QBT_TR[CONTEXT=PeerListWidget]', 30, true); - this.newColumn('files', '', 'QBT_TR(Files)QBT_TR[CONTEXT=PeerListWidget]', 100, true); - - this.columns['country'].dataProperties.push('country_code'); - this.columns['flags'].dataProperties.push('flags_desc'); - this.initColumnsFunctions(); - }, - - initColumnsFunctions: function() { - - // country - - this.columns['country'].updateTd = function(td, row) { - var country = this.getRowValue(row, 0); - var country_code = this.getRowValue(row, 1); - - if (!country_code) { - if (td.getChildren('img').length) - td.getChildren('img')[0].dispose(); - return; - } - - var img_path = 'images/flags/' + country_code + '.svg'; - - if (td.getChildren('img').length) { - var img = td.getChildren('img')[0]; - img.set('src', img_path); - img.set('class', 'flags'); - img.set('alt', country); - img.set('title', country); - } - else - td.adopt(new Element('img', { - 'src': img_path, - 'class': 'flags', - 'alt': country, - 'title': country - })); - }; - - // ip - - this.columns['ip'].compareRows = function(row1, row2) { - var ip1 = this.getRowValue(row1); - var ip2 = this.getRowValue(row2); - - var a = ip1.split("."); - var b = ip2.split("."); - - for (var i = 0; i < 4; ++i) { - if (a[i] != b[i]) - return a[i] - b[i]; - } - - return 0; - }; - - // progress, relevance - - this.columns['progress'].updateTd = function(td, row) { - var progress = this.getRowValue(row); - var progressFormated = (progress * 100).round(1); - if (progressFormated == 100.0 && progress != 1.0) - progressFormated = 99.9; - progressFormated += "%"; - td.set('html', progressFormated); - }; - - this.columns['relevance'].updateTd = this.columns['progress'].updateTd; - - // dl_speed, up_speed - - this.columns['dl_speed'].updateTd = function(td, row) { - var speed = this.getRowValue(row); - if (speed === 0) - td.set('html', ''); - else - td.set('html', friendlyUnit(speed, true)); - }; - - this.columns['up_speed'].updateTd = this.columns['dl_speed'].updateTd; - - // downloaded, uploaded - - this.columns['downloaded'].updateTd = function(td, row) { - var downloaded = this.getRowValue(row); - td.set('html', friendlyUnit(downloaded, false)); - }; - - this.columns['uploaded'].updateTd = this.columns['downloaded'].updateTd; - - // flags - - this.columns['flags'].updateTd = function(td, row) { - td.innerHTML = this.getRowValue(row, 0); - td.title = this.getRowValue(row, 1); - }; - - // files - - this.columns['files'].updateTd = function(td, row) { - td.innerHTML = escapeHtml(this.getRowValue(row, 0).replace('\n', ';')); - td.title = escapeHtml(this.getRowValue(row, 0)); - }; - - } -}); - -/*************************************************************/ diff -Nru qbittorrent-4.1.3/src/webui/www/private/scripts/lib/clipboard.min.js qbittorrent-3.3.15/src/webui/www/private/scripts/lib/clipboard.min.js --- qbittorrent-4.1.3/src/webui/www/private/scripts/lib/clipboard.min.js 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/scripts/lib/clipboard.min.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -/*! - * clipboard.js v2.0.0 - * https://zenorocha.github.io/clipboard.js - * - * Licensed MIT © Zeno Rocha - */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=3)}([function(t,e,n){var o,r,i;!function(a,c){r=[t,n(7)],o=c,void 0!==(i="function"==typeof o?o.apply(e,r):o)&&(t.exports=i)}(0,function(t,e){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var o=function(t){return t&&t.__esModule?t:{default:t}}(e),r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=function(){function t(t,e){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};this.action=t.action,this.container=t.container,this.emitter=t.emitter,this.target=t.target,this.text=t.text,this.trigger=t.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var t=this,e="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return t.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[e?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=(0,o.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=(0,o.default)(this.target),this.copyText()}},{key:"copyText",value:function(){var t=void 0;try{t=document.execCommand(this.action)}catch(e){t=!1}this.handleResult(t)}},{key:"handleResult",value:function(t){this.emitter.emit(t?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=t,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(t){if(void 0!==t){if(!t||"object"!==(void 0===t?"undefined":r(t))||1!==t.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&t.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(t.hasAttribute("readonly")||t.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=t}},get:function(){return this._target}}]),t}();t.exports=a})},function(t,e,n){function o(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!c.string(e))throw new TypeError("Second argument must be a String");if(!c.fn(n))throw new TypeError("Third argument must be a Function");if(c.node(t))return r(t,e,n);if(c.nodeList(t))return i(t,e,n);if(c.string(t))return a(t,e,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function r(t,e,n){return t.addEventListener(e,n),{destroy:function(){t.removeEventListener(e,n)}}}function i(t,e,n){return Array.prototype.forEach.call(t,function(t){t.addEventListener(e,n)}),{destroy:function(){Array.prototype.forEach.call(t,function(t){t.removeEventListener(e,n)})}}}function a(t,e,n){return u(document.body,t,e,n)}var c=n(6),u=n(5);t.exports=o},function(t,e){function n(){}n.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){function o(){r.off(t,o),e.apply(n,arguments)}var r=this;return o._=e,this.on(t,o,n)},emit:function(t){var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;for(o;o0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText,this.container="object"===d(t.container)?t.container:document.body}},{key:"listenClick",value:function(t){var e=this;this.listener=(0,f.default)(t,"click",function(t){return e.onClick(t)})}},{key:"onClick",value:function(t){var e=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new l.default({action:this.action(e),target:this.target(e),text:this.text(e),container:this.container,trigger:e,emitter:this})}},{key:"defaultAction",value:function(t){return u("action",t)}},{key:"defaultTarget",value:function(t){var e=u("target",t);if(e)return document.querySelector(e)}},{key:"defaultText",value:function(t){return u("text",t)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],e="string"==typeof t?[t]:t,n=!!document.queryCommandSupported;return e.forEach(function(t){n=n&&!!document.queryCommandSupported(t)}),n}}]),e}(s.default);t.exports=p})},function(t,e){function n(t,e){for(;t&&t.nodeType!==o;){if("function"==typeof t.matches&&t.matches(e))return t;t=t.parentNode}}var o=9;if("undefined"!=typeof Element&&!Element.prototype.matches){var r=Element.prototype;r.matches=r.matchesSelector||r.mozMatchesSelector||r.msMatchesSelector||r.oMatchesSelector||r.webkitMatchesSelector}t.exports=n},function(t,e,n){function o(t,e,n,o,r){var a=i.apply(this,arguments);return t.addEventListener(n,a,r),{destroy:function(){t.removeEventListener(n,a,r)}}}function r(t,e,n,r,i){return"function"==typeof t.addEventListener?o.apply(null,arguments):"function"==typeof n?o.bind(null,document).apply(null,arguments):("string"==typeof t&&(t=document.querySelectorAll(t)),Array.prototype.map.call(t,function(t){return o(t,e,n,r,i)}))}function i(t,e,n,o){return function(n){n.delegateTarget=a(n.target,e),n.delegateTarget&&o.call(t,n)}}var a=n(4);t.exports=r},function(t,e){e.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},e.nodeList=function(t){var n=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===n||"[object HTMLCollection]"===n)&&"length"in t&&(0===t.length||e.node(t[0]))},e.string=function(t){return"string"==typeof t||t instanceof String},e.fn=function(t){return"[object Function]"===Object.prototype.toString.call(t)}},function(t,e){function n(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly");n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var o=window.getSelection(),r=document.createRange();r.selectNodeContents(t),o.removeAllRanges(),o.addRange(r),e=o.toString()}return e}t.exports=n}])}); diff -Nru qbittorrent-4.1.3/src/webui/www/private/scripts/lib/excanvas-compressed.js qbittorrent-3.3.15/src/webui/www/private/scripts/lib/excanvas-compressed.js --- qbittorrent-4.1.3/src/webui/www/private/scripts/lib/excanvas-compressed.js 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/scripts/lib/excanvas-compressed.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,876 +0,0 @@ -// Copyright 2006 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - - -// Known Issues: -// -// * Patterns are not implemented. -// * Radial gradient are not implemented. The VML version of these look very -// different from the canvas one. -// * Clipping paths are not implemented. -// * Coordsize. The width and height attribute have higher priority than the -// width and height style values which isn't correct. -// * Painting mode isn't implemented. -// * Canvas width/height should is using content-box by default. IE in -// Quirks mode will draw the canvas using border-box. Either change your -// doctype to HTML5 -// (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype) -// or use Box Sizing Behavior from WebFX -// (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html) -// * Non uniform scaling does not correctly scale strokes. -// * Optimize. There is always room for speed improvements. - -// Only add this code if we do not already have a canvas implementation -if (!document.createElement('canvas').getContext) { - -(function() { - - // alias some functions to make (compiled) code shorter - var m = Math; - var mr = m.round; - var ms = m.sin; - var mc = m.cos; - var abs = m.abs; - var sqrt = m.sqrt; - - // this is used for sub pixel precision - var Z = 10; - var Z2 = Z / 2; - - /** - * This function is assigned to the elements as element.getContext(). - * @this {HTMLElement} - * @return {CanvasRenderingContext2D_} - */ - function getContext() { - return this.context_ || - (this.context_ = new CanvasRenderingContext2D_(this)); - } - - var slice = Array.prototype.slice; - - /** - * Binds a function to an object. The returned function will always use the - * passed in {@code obj} as {@code this}. - * - * Example: - * - * g = bind(f, obj, a, b) - * g(c, d) // will do f.call(obj, a, b, c, d) - * - * @param {Function} f The function to bind the object to - * @param {Object} obj The object that should act as this when the function - * is called - * @param {*} var_args Rest arguments that will be used as the initial - * arguments when the function is called - * @return {Function} A new function that has bound this - */ - function bind(f, obj, var_args) { - var a = slice.call(arguments, 2); - return function() { - return f.apply(obj, a.concat(slice.call(arguments))); - }; - } - - var G_vmlCanvasManager_ = { - init: function(opt_doc) { - if (/MSIE/.test(navigator.userAgent) && !window.opera) { - var doc = opt_doc || document; - // Create a dummy element so that IE will allow canvas elements to be - // recognized. - doc.createElement('canvas'); - doc.attachEvent('onreadystatechange', bind(this.init_, this, doc)); - } - }, - - init_: function(doc) { - // create xmlns - if (!doc.namespaces['g_vml_']) { - doc.namespaces.add('g_vml_', 'urn:schemas-microsoft-com:vml', - '#default#VML'); - - } - if (!doc.namespaces['g_o_']) { - doc.namespaces.add('g_o_', 'urn:schemas-microsoft-com:office:office', - '#default#VML'); - } - - // Setup default CSS. Only add one style sheet per document - if (!doc.styleSheets['ex_canvas_']) { - var ss = doc.createStyleSheet(); - ss.owningElement.id = 'ex_canvas_'; - ss.cssText = 'canvas{display:inline-block;overflow:hidden;' + - // default size is 300x150 in Gecko and Opera - 'text-align:left;width:300px;height:150px}' + - 'g_vml_\\:*{behavior:url(#default#VML)}' + - 'g_o_\\:*{behavior:url(#default#VML)}'; - - } - - // find all canvas elements - var els = doc.getElementsByTagName('canvas'); - for (var i = 0; i < els.length; i++) { - this.initElement(els[i]); - } - }, - - /** - * Public initializes a canvas element so that it can be used as canvas - * element from now on. This is called automatically before the page is - * loaded but if you are creating elements using createElement you need to - * make sure this is called on the element. - * @param {HTMLElement} el The canvas element to initialize. - * @return {HTMLElement} the element that was created. - */ - initElement: function(el) { - if (!el.getContext) { - - el.getContext = getContext; - - // do not use inline function because that will leak memory - el.attachEvent('onpropertychange', onPropertyChange); - el.attachEvent('onresize', onResize); - - var attrs = el.attributes; - if (attrs.width && attrs.width.specified) { - // TODO: use runtimeStyle and coordsize - // el.getContext().setWidth_(attrs.width.nodeValue); - el.style.width = attrs.width.nodeValue + 'px'; - } else { - el.width = el.clientWidth; - } - if (attrs.height && attrs.height.specified) { - // TODO: use runtimeStyle and coordsize - // el.getContext().setHeight_(attrs.height.nodeValue); - el.style.height = attrs.height.nodeValue + 'px'; - } else { - el.height = el.clientHeight; - } - //el.getContext().setCoordsize_() - } - return el; - } - }; - - function onPropertyChange(e) { - var el = e.srcElement; - - switch (e.propertyName) { - case 'width': - el.style.width = el.attributes.width.nodeValue + 'px'; - el.getContext().clearRect(); - break; - case 'height': - el.style.height = el.attributes.height.nodeValue + 'px'; - el.getContext().clearRect(); - break; - } - } - - function onResize(e) { - var el = e.srcElement; - if (el.firstChild) { - el.firstChild.style.width = el.clientWidth + 'px'; - el.firstChild.style.height = el.clientHeight + 'px'; - } - } - - G_vmlCanvasManager_.init(); - - // precompute "00" to "FF" - var dec2hex = []; - for (var i = 0; i < 16; i++) { - for (var j = 0; j < 16; j++) { - dec2hex[i * 16 + j] = i.toString(16) + j.toString(16); - } - } - - function createMatrixIdentity() { - return [ - [1, 0, 0], - [0, 1, 0], - [0, 0, 1] - ]; - } - - function matrixMultiply(m1, m2) { - var result = createMatrixIdentity(); - - for (var x = 0; x < 3; x++) { - for (var y = 0; y < 3; y++) { - var sum = 0; - - for (var z = 0; z < 3; z++) { - sum += m1[x][z] * m2[z][y]; - } - - result[x][y] = sum; - } - } - return result; - } - - function copyState(o1, o2) { - o2.fillStyle = o1.fillStyle; - o2.lineCap = o1.lineCap; - o2.lineJoin = o1.lineJoin; - o2.lineWidth = o1.lineWidth; - o2.miterLimit = o1.miterLimit; - o2.shadowBlur = o1.shadowBlur; - o2.shadowColor = o1.shadowColor; - o2.shadowOffsetX = o1.shadowOffsetX; - o2.shadowOffsetY = o1.shadowOffsetY; - o2.strokeStyle = o1.strokeStyle; - o2.globalAlpha = o1.globalAlpha; - o2.arcScaleX_ = o1.arcScaleX_; - o2.arcScaleY_ = o1.arcScaleY_; - o2.lineScale_ = o1.lineScale_; - } - - function processStyle(styleString) { - var str, alpha = 1; - - styleString = String(styleString); - if (styleString.substring(0, 3) == 'rgb') { - var start = styleString.indexOf('(', 3); - var end = styleString.indexOf(')', start + 1); - var guts = styleString.substring(start + 1, end).split(','); - - str = '#'; - for (var i = 0; i < 3; i++) { - str += dec2hex[Number(guts[i])]; - } - - if (guts.length == 4 && styleString.substr(3, 1) == 'a') { - alpha = guts[3]; - } - } else { - str = styleString; - } - - return {color: str, alpha: alpha}; - } - - function processLineCap(lineCap) { - switch (lineCap) { - case 'butt': - return 'flat'; - case 'round': - return 'round'; - case 'square': - default: - return 'square'; - } - } - - /** - * This class implements CanvasRenderingContext2D interface as described by - * the WHATWG. - * @param {HTMLElement} surfaceElement The element that the 2D context should - * be associated with - */ - function CanvasRenderingContext2D_(surfaceElement) { - this.m_ = createMatrixIdentity(); - - this.mStack_ = []; - this.aStack_ = []; - this.currentPath_ = []; - - // Canvas context properties - this.strokeStyle = '#000'; - this.fillStyle = '#000'; - - this.lineWidth = 1; - this.lineJoin = 'miter'; - this.lineCap = 'butt'; - this.miterLimit = Z * 1; - this.globalAlpha = 1; - this.canvas = surfaceElement; - - var el = surfaceElement.ownerDocument.createElement('div'); - el.style.width = surfaceElement.clientWidth + 'px'; - el.style.height = surfaceElement.clientHeight + 'px'; - el.style.overflow = 'hidden'; - el.style.position = 'absolute'; - surfaceElement.appendChild(el); - - this.element_ = el; - this.arcScaleX_ = 1; - this.arcScaleY_ = 1; - this.lineScale_ = 1; - } - - var contextPrototype = CanvasRenderingContext2D_.prototype; - contextPrototype.clearRect = function() { - this.element_.innerHTML = ''; - this.currentPath_ = []; - }; - - contextPrototype.beginPath = function() { - // TODO: Branch current matrix so that save/restore has no effect - // as per safari docs. - this.currentPath_ = []; - }; - - contextPrototype.moveTo = function(aX, aY) { - var p = this.getCoords_(aX, aY); - this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y}); - this.currentX_ = p.x; - this.currentY_ = p.y; - }; - - contextPrototype.lineTo = function(aX, aY) { - var p = this.getCoords_(aX, aY); - this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y}); - - this.currentX_ = p.x; - this.currentY_ = p.y; - }; - - contextPrototype.bezierCurveTo = function(aCP1x, aCP1y, - aCP2x, aCP2y, - aX, aY) { - var p = this.getCoords_(aX, aY); - var cp1 = this.getCoords_(aCP1x, aCP1y); - var cp2 = this.getCoords_(aCP2x, aCP2y); - bezierCurveTo(this, cp1, cp2, p); - }; - - // Helper function that takes the already fixed cordinates. - function bezierCurveTo(self, cp1, cp2, p) { - self.currentPath_.push({ - type: 'bezierCurveTo', - cp1x: cp1.x, - cp1y: cp1.y, - cp2x: cp2.x, - cp2y: cp2.y, - x: p.x, - y: p.y - }); - self.currentX_ = p.x; - self.currentY_ = p.y; - } - - contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) { - // the following is lifted almost directly from - // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes - - var cp = this.getCoords_(aCPx, aCPy); - var p = this.getCoords_(aX, aY); - - var cp1 = { - x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_), - y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_) - }; - var cp2 = { - x: cp1.x + (p.x - this.currentX_) / 3.0, - y: cp1.y + (p.y - this.currentY_) / 3.0 - }; - - bezierCurveTo(this, cp1, cp2, p); - }; - - contextPrototype.arc = function(aX, aY, aRadius, - aStartAngle, aEndAngle, aClockwise) { - aRadius *= Z; - var arcType = aClockwise ? 'at' : 'wa'; - - var xStart = aX + mc(aStartAngle) * aRadius - Z2; - var yStart = aY + ms(aStartAngle) * aRadius - Z2; - - var xEnd = aX + mc(aEndAngle) * aRadius - Z2; - var yEnd = aY + ms(aEndAngle) * aRadius - Z2; - - // IE won't render arches drawn counter clockwise if xStart == xEnd. - if (xStart == xEnd && !aClockwise) { - xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something - // that can be represented in binary - } - - var p = this.getCoords_(aX, aY); - var pStart = this.getCoords_(xStart, yStart); - var pEnd = this.getCoords_(xEnd, yEnd); - - this.currentPath_.push({type: arcType, - x: p.x, - y: p.y, - radius: aRadius, - xStart: pStart.x, - yStart: pStart.y, - xEnd: pEnd.x, - yEnd: pEnd.y}); - - }; - - contextPrototype.rect = function(aX, aY, aWidth, aHeight) { - this.moveTo(aX, aY); - this.lineTo(aX + aWidth, aY); - this.lineTo(aX + aWidth, aY + aHeight); - this.lineTo(aX, aY + aHeight); - this.closePath(); - }; - - contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) { - // Will destroy any existing path (same as FF behaviour) - this.beginPath(); - this.moveTo(aX, aY); - this.lineTo(aX + aWidth, aY); - this.lineTo(aX + aWidth, aY + aHeight); - this.lineTo(aX, aY + aHeight); - this.closePath(); - this.stroke(); - this.currentPath_ = []; - }; - - contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) { - // Will destroy any existing path (same as FF behaviour) - this.beginPath(); - this.moveTo(aX, aY); - this.lineTo(aX + aWidth, aY); - this.lineTo(aX + aWidth, aY + aHeight); - this.lineTo(aX, aY + aHeight); - this.closePath(); - this.fill(); - this.currentPath_ = []; - }; - - contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) { - var gradient = new CanvasGradient_('gradient'); - gradient.x0_ = aX0; - gradient.y0_ = aY0; - gradient.x1_ = aX1; - gradient.y1_ = aY1; - return gradient; - }; - - contextPrototype.createRadialGradient = function(aX0, aY0, aR0, - aX1, aY1, aR1) { - var gradient = new CanvasGradient_('gradientradial'); - gradient.x0_ = aX0; - gradient.y0_ = aY0; - gradient.r0_ = aR0; - gradient.x1_ = aX1; - gradient.y1_ = aY1; - gradient.r1_ = aR1; - return gradient; - }; - - contextPrototype.drawImage = function(image, var_args) { - var dx, dy, dw, dh, sx, sy, sw, sh; - - // to find the original width we override the width and height - var oldRuntimeWidth = image.runtimeStyle.width; - var oldRuntimeHeight = image.runtimeStyle.height; - image.runtimeStyle.width = 'auto'; - image.runtimeStyle.height = 'auto'; - - // get the original size - var w = image.width; - var h = image.height; - - // and remove overrides - image.runtimeStyle.width = oldRuntimeWidth; - image.runtimeStyle.height = oldRuntimeHeight; - - if (arguments.length == 3) { - dx = arguments[1]; - dy = arguments[2]; - sx = sy = 0; - sw = dw = w; - sh = dh = h; - } else if (arguments.length == 5) { - dx = arguments[1]; - dy = arguments[2]; - dw = arguments[3]; - dh = arguments[4]; - sx = sy = 0; - sw = w; - sh = h; - } else if (arguments.length == 9) { - sx = arguments[1]; - sy = arguments[2]; - sw = arguments[3]; - sh = arguments[4]; - dx = arguments[5]; - dy = arguments[6]; - dw = arguments[7]; - dh = arguments[8]; - } else { - throw Error('Invalid number of arguments'); - } - - var d = this.getCoords_(dx, dy); - - var w2 = sw / 2; - var h2 = sh / 2; - - var vmlStr = []; - - var W = 10; - var H = 10; - - // For some reason that I've now forgotten, using divs didn't work - vmlStr.push(' ' , - '', - ''); - - this.element_.insertAdjacentHTML('BeforeEnd', - vmlStr.join('')); - }; - - contextPrototype.stroke = function(aFill) { - var lineStr = []; - var lineOpen = false; - var a = processStyle(aFill ? this.fillStyle : this.strokeStyle); - var color = a.color; - var opacity = a.alpha * this.globalAlpha; - - var W = 10; - var H = 10; - - lineStr.push(''); - - if (!aFill) { - var lineWidth = this.lineScale_ * this.lineWidth; - - // VML cannot correctly render a line if the width is less than 1px. - // In that case, we dilute the color to make the line look thinner. - if (lineWidth < 1) { - opacity *= lineWidth; - } - - lineStr.push( - '' - ); - } else if (typeof this.fillStyle == 'object') { - var fillStyle = this.fillStyle; - var angle = 0; - var focus = {x: 0, y: 0}; - - // additional offset - var shift = 0; - // scale factor for offset - var expansion = 1; - - if (fillStyle.type_ == 'gradient') { - var x0 = fillStyle.x0_ / this.arcScaleX_; - var y0 = fillStyle.y0_ / this.arcScaleY_; - var x1 = fillStyle.x1_ / this.arcScaleX_; - var y1 = fillStyle.y1_ / this.arcScaleY_; - var p0 = this.getCoords_(x0, y0); - var p1 = this.getCoords_(x1, y1); - var dx = p1.x - p0.x; - var dy = p1.y - p0.y; - angle = Math.atan2(dx, dy) * 180 / Math.PI; - - // The angle should be a non-negative number. - if (angle < 0) { - angle += 360; - } - - // Very small angles produce an unexpected result because they are - // converted to a scientific notation string. - if (angle < 1e-6) { - angle = 0; - } - } else { - var p0 = this.getCoords_(fillStyle.x0_, fillStyle.y0_); - var width = max.x - min.x; - var height = max.y - min.y; - focus = { - x: (p0.x - min.x) / width, - y: (p0.y - min.y) / height - }; - - width /= this.arcScaleX_ * Z; - height /= this.arcScaleY_ * Z; - var dimension = m.max(width, height); - shift = 2 * fillStyle.r0_ / dimension; - expansion = 2 * fillStyle.r1_ / dimension - shift; - } - - // We need to sort the color stops in ascending order by offset, - // otherwise IE won't interpret it correctly. - var stops = fillStyle.colors_; - stops.sort(function(cs1, cs2) { - return cs1.offset - cs2.offset; - }); - - var length = stops.length; - var color1 = stops[0].color; - var color2 = stops[length - 1].color; - var opacity1 = stops[0].alpha * this.globalAlpha; - var opacity2 = stops[length - 1].alpha * this.globalAlpha; - - var colors = []; - for (var i = 0; i < length; i++) { - var stop = stops[i]; - colors.push(stop.offset * expansion + shift + ' ' + stop.color); - } - - // When colors attribute is used, the meanings of opacity and o:opacity2 - // are reversed. - lineStr.push(''); - } else { - lineStr.push(''); - } - - lineStr.push(''); - - this.element_.insertAdjacentHTML('beforeEnd', lineStr.join('')); - }; - - contextPrototype.fill = function() { - this.stroke(true); - } - - contextPrototype.closePath = function() { - this.currentPath_.push({type: 'close'}); - }; - - /** - * @private - */ - contextPrototype.getCoords_ = function(aX, aY) { - var m = this.m_; - return { - x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2, - y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2 - } - }; - - contextPrototype.save = function() { - var o = {}; - copyState(this, o); - this.aStack_.push(o); - this.mStack_.push(this.m_); - this.m_ = matrixMultiply(createMatrixIdentity(), this.m_); - }; - - contextPrototype.restore = function() { - copyState(this.aStack_.pop(), this); - this.m_ = this.mStack_.pop(); - }; - - contextPrototype.translate = function(aX, aY) { - var m1 = [ - [1, 0, 0], - [0, 1, 0], - [aX, aY, 1] - ]; - - this.m_ = matrixMultiply(m1, this.m_); - }; - - contextPrototype.rotate = function(aRot) { - var c = mc(aRot); - var s = ms(aRot); - - var m1 = [ - [c, s, 0], - [-s, c, 0], - [0, 0, 1] - ]; - - this.m_ = matrixMultiply(m1, this.m_); - }; - - contextPrototype.scale = function(aX, aY) { - this.arcScaleX_ *= aX; - this.arcScaleY_ *= aY; - var m1 = [ - [aX, 0, 0], - [0, aY, 0], - [0, 0, 1] - ]; - - var m = this.m_ = matrixMultiply(m1, this.m_); - - // Get the line scale. - // Determinant of this.m_ means how much the area is enlarged by the - // transformation. So its square root can be used as a scale factor - // for width. - var det = m[0][0] * m[1][1] - m[0][1] * m[1][0]; - this.lineScale_ = sqrt(abs(det)); - }; - - /******** STUBS ********/ - contextPrototype.clip = function() { - // TODO: Implement - }; - - contextPrototype.arcTo = function() { - // TODO: Implement - }; - - contextPrototype.createPattern = function() { - return new CanvasPattern_; - }; - - // Gradient / Pattern Stubs - function CanvasGradient_(aType) { - this.type_ = aType; - this.x0_ = 0; - this.y0_ = 0; - this.r0_ = 0; - this.x1_ = 0; - this.y1_ = 0; - this.r1_ = 0; - this.colors_ = []; - } - - CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) { - aColor = processStyle(aColor); - this.colors_.push({offset: aOffset, - color: aColor.color, - alpha: aColor.alpha}); - }; - - function CanvasPattern_() {} - - // set up externs - G_vmlCanvasManager = G_vmlCanvasManager_; - CanvasRenderingContext2D = CanvasRenderingContext2D_; - CanvasGradient = CanvasGradient_; - CanvasPattern = CanvasPattern_; - -})(); - -} // if diff -Nru qbittorrent-4.1.3/src/webui/www/private/scripts/lib/mocha.js qbittorrent-3.3.15/src/webui/www/private/scripts/lib/mocha.js --- qbittorrent-4.1.3/src/webui/www/private/scripts/lib/mocha.js 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/scripts/lib/mocha.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,6234 +0,0 @@ -/* - -Script: Core.js - MUI - A Web Applications User Interface Framework. - -Copyright: - Copyright (c) 2007-2009 Greg Houston, . - -License: - MIT-style license. - -Contributors: - - Scott F. Frederick - - Joel Lindau - -Note: - This documentation is taken directly from the javascript source files. It is built using Natural Docs. - -*/ - -var MUI = MochaUI = new Hash({ - - version: '0.9.6 development', - - options: new Hash({ - theme: 'default', - advancedEffects: false, // Effects that require fast browsers and are cpu intensive. - standardEffects: true // Basic effects that tend to run smoothly. - }), - - path: { - source: 'scripts/source/', // Path to MochaUI source JavaScript - themes: 'themes/', // Path to MochaUI Themes - plugins: 'plugins/' // Path to Plugins - }, - - // Returns the path to the current theme directory - themePath: function(){ - return MUI.path.themes + MUI.options.theme + '/'; - }, - - files: new Hash() - -}); - -MUI.files[MUI.path.source + 'Core/Core.js'] = 'loaded'; - -MUI.extend({ - - Windows: { - instances: new Hash() - }, - - ieSupport: 'excanvas', // Makes it easier to switch between Excanvas and Moocanvas for testing - - ieLegacySupport: Browser.Engine.trident && Browser.version < 9, - - /* - - Function: updateContent - Replace the content of a window or panel. - - Arguments: - updateOptions - (object) - - updateOptions: - element - The parent window or panel. - childElement - The child element of the window or panel receiving the content. - method - ('get', or 'post') The way data is transmitted. - data - (hash) Data to be transmitted - title - (string) Change this if you want to change the title of the window or panel. - content - (string or element) An html loadMethod option. - loadMethod - ('html', 'xhr', or 'iframe') - url - Used if loadMethod is set to 'xhr' or 'iframe'. - scrollbars - (boolean) - padding - (object) - onContentLoaded - (function) - - */ - updateContent: function(options){ - - var options = $extend({ - element: null, - childElement: null, - method: null, - data: null, - title: null, - content: null, - loadMethod: null, - url: null, - scrollbars: null, - padding: null, - require: {}, - onContentLoaded: $empty - }, options); - - options.require = $extend({ - css: [], images: [], js: [], onload: null - }, options.require); - - var args = {}; - - if (!options.element) return; - var element = options.element; - - if (MUI.Windows.instances.get(element.id)){ - args.recipient = 'window'; - } - else { - args.recipient = 'panel'; - } - - var instance = element.retrieve('instance'); - if (options.title) instance.titleEl.set('html', options.title); - - var contentEl = instance.contentEl; - args.contentContainer = options.childElement != null ? options.childElement : instance.contentEl; - var contentWrapperEl = instance.contentWrapperEl; - - if (!options.loadMethod){ - if (!instance.options.loadMethod){ - if (!options.url){ - options.loadMethod = 'html'; - } - else { - options.loadMethod = 'xhr'; - } - } - else { - options.loadMethod = instance.options.loadMethod; - } - } - - // Set scrollbars if loading content in main content container. - // Always use 'hidden' for iframe windows - var scrollbars = options.scrollbars || instance.options.scrollbars; - if (args.contentContainer == instance.contentEl) { - contentWrapperEl.setStyles({ - 'overflow': scrollbars != false && options.loadMethod != 'iframe' ? 'auto' : 'hidden' - }); - } - - if (options.padding != null) { - contentEl.setStyles({ - 'padding-top': options.padding.top, - 'padding-bottom': options.padding.bottom, - 'padding-left': options.padding.left, - 'padding-right': options.padding.right - }); - } - - // Remove old content. - if (args.contentContainer == contentEl) { - contentEl.empty().show(); - // Panels are not loaded into the padding div, so we remove them separately. - contentEl.getAllNext('.column').destroy(); - contentEl.getAllNext('.columnHandle').destroy(); - } - - args.onContentLoaded = function(){ - - if (options.require.js.length || typeof options.require.onload == 'function'){ - new MUI.Require({ - js: options.require.js, - onload: function(){ - if (!$defined(options.require.onload)) - return; - if (Browser.Engine.presto){ - options.require.onload.delay(100); - } - else { - options.require.onload(); - } - options.onContentLoaded ? options.onContentLoaded() : instance.fireEvent('onContentLoaded', element); - }.bind(this) - }); - } - else { - options.onContentLoaded ? options.onContentLoaded() : instance.fireEvent('onContentLoaded', element); - } - - }; - - if (options.require.css.length || options.require.images.length){ - new MUI.Require({ - css: options.require.css, - images: options.require.images, - onload: function(){ - this.loadSelect(instance, options, args); - }.bind(this) - }); - } - else { - this.loadSelect(instance, options, args); - } - }, - - loadSelect: function(instance, options, args){ - - // Load new content. - switch(options.loadMethod){ - case 'xhr': - this.updateContentXHR(instance, options, args); - break; - case 'iframe': - this.updateContentIframe(instance, options, args); - break; - case 'html': - default: - this.updateContentHTML(instance, options, args); - break; - } - - }, - - updateContentXHR: function(instance, options, args){ - var contentEl = instance.contentEl; - var contentContainer = args.contentContainer; - var onContentLoaded = args.onContentLoaded; - new Request.HTML({ - url: options.url, - update: contentContainer, - method: options.method != null ? options.method : 'get', - data: options.data != null ? new Hash(options.data).toQueryString() : '', - evalScripts: instance.options.evalScripts, - evalResponse: instance.options.evalResponse, - onRequest: function(){ - if (args.recipient == 'window' && contentContainer == contentEl){ - instance.showSpinner(); - } - else if (args.recipient == 'panel' && contentContainer == contentEl && $('spinner')){ - $('spinner').show(); - } - }.bind(this), - onFailure: function(response){ - if (contentContainer == contentEl){ - var getTitle = new RegExp("[\n\r\s]*(.*)[\n\r\s]*", "gmi"); - var error = getTitle.exec(response.responseText); - if (!error) error = 'Unknown'; - contentContainer.set('html', '

    Error: ' + error + '

    '); - if (args.recipient == 'window'){ - instance.hideSpinner(); - } - else if (args.recipient == 'panel' && $('spinner')){ - $('spinner').hide(); - } - } - }.bind(this), - onSuccess: function(){ - if (contentContainer == contentEl){ - if (args.recipient == 'window') instance.hideSpinner(); - else if (args.recipient == 'panel' && $('spinner')) $('spinner').hide(); - } - Browser.Engine.trident4 ? onContentLoaded.delay(750) : onContentLoaded(); - }.bind(this), - onComplete: function(){}.bind(this) - }).send(); - }, - - updateContentIframe: function(instance, options, args){ - var contentEl = instance.contentEl; - var contentContainer = args.contentContainer; - var contentWrapperEl = instance.contentWrapperEl; - var onContentLoaded = args.onContentLoaded; - if ( instance.options.contentURL == '' || contentContainer != contentEl) { - return; - } - instance.iframeEl = new Element('iframe', { - 'id': instance.options.id + '_iframe', - 'name': instance.options.id + '_iframe', - 'class': 'mochaIframe', - 'src': options.url, - 'marginwidth': 0, - 'marginheight': 0, - 'frameBorder': 0, - 'scrolling': 'auto', - 'styles': { - 'height': contentWrapperEl.offsetHeight - contentWrapperEl.getStyle('margin-top').toInt() - contentWrapperEl.getStyle('margin-bottom').toInt(), - 'width': instance.panelEl ? contentWrapperEl.offsetWidth - contentWrapperEl.getStyle('margin-left').toInt() - contentWrapperEl.getStyle('margin-right').toInt() : '100%' - } - }).injectInside(contentEl); - - // Add onload event to iframe so we can hide the spinner and run onContentLoaded() - instance.iframeEl.addEvent('load', function(e) { - if (args.recipient == 'window') instance.hideSpinner(); - else if (args.recipient == 'panel' && contentContainer == contentEl && $('spinner')) $('spinner').hide(); - Browser.Engine.trident4 ? onContentLoaded.delay(50) : onContentLoaded(); - }.bind(this)); - if (args.recipient == 'window') instance.showSpinner(); - else if (args.recipient == 'panel' && contentContainer == contentEl && $('spinner')) $('spinner').show(); - }, - - updateContentHTML: function(instance, options, args){ - var contentEl = instance.contentEl; - var contentContainer = args.contentContainer; - var onContentLoaded = args.onContentLoaded; - var elementTypes = new Array('element', 'textnode', 'whitespace', 'collection'); - - if (elementTypes.contains($type(options.content))){ - options.content.inject(contentContainer); - } else { - contentContainer.set('html', options.content); - } - if (contentContainer == contentEl){ - if (args.recipient == 'window') instance.hideSpinner(); - else if (args.recipient == 'panel' && $('spinner')) $('spinner').hide(); - } - Browser.Engine.trident4 ? onContentLoaded.delay(50) : onContentLoaded(); - }, - - /* - - Function: reloadIframe - Reload an iframe. Fixes an issue in Firefox when trying to use location.reload on an iframe that has been destroyed and recreated. - - Arguments: - iframe - This should be both the name and the id of the iframe. - - Syntax: - (start code) - MUI.reloadIframe(element); - (end) - - Example: - To reload an iframe from within another iframe: - (start code) - parent.MUI.reloadIframe('myIframeName'); - (end) - - */ - reloadIframe: function(iframe){ - Browser.Engine.gecko ? $(iframe).src = $(iframe).src : top.frames[iframe].location.reload(true); - }, - - roundedRect: function(ctx, x, y, width, height, radius, rgb, a){ - ctx.fillStyle = 'rgba(' + rgb.join(',') + ',' + a + ')'; - ctx.beginPath(); - ctx.moveTo(x, y + radius); - ctx.lineTo(x, y + height - radius); - ctx.quadraticCurveTo(x, y + height, x + radius, y + height); - ctx.lineTo(x + width - radius, y + height); - ctx.quadraticCurveTo(x + width, y + height, x + width, y + height - radius); - ctx.lineTo(x + width, y + radius); - ctx.quadraticCurveTo(x + width, y, x + width - radius, y); - ctx.lineTo(x + radius, y); - ctx.quadraticCurveTo(x, y, x, y + radius); - ctx.fill(); - }, - - triangle: function(ctx, x, y, width, height, rgb, a){ - ctx.beginPath(); - ctx.moveTo(x + width, y); - ctx.lineTo(x, y + height); - ctx.lineTo(x + width, y + height); - ctx.closePath(); - ctx.fillStyle = 'rgba(' + rgb.join(',') + ',' + a + ')'; - ctx.fill(); - }, - - circle: function(ctx, x, y, diameter, rgb, a){ - ctx.beginPath(); - ctx.arc(x, y, diameter, 0, Math.PI*2, true); - ctx.fillStyle = 'rgba(' + rgb.join(',') + ',' + a + ')'; - ctx.fill(); - }, - - notification: function(message){ - new MUI.Window({ - loadMethod: 'html', - closeAfter: 1500, - type: 'notification', - addClass: 'notification', - content: message, - width: 220, - height: 40, - y: 53, - padding: { top: 10, right: 12, bottom: 10, left: 12 }, - shadowBlur: 5 - }); - }, - - /* - - Function: toggleEffects - Turn effects on and off - - */ - toggleAdvancedEffects: function(link){ - if (MUI.options.advancedEffects == false) { - MUI.options.advancedEffects = true; - if (link){ - this.toggleAdvancedEffectsLink = new Element('div', { - 'class': 'check', - 'id': 'toggleAdvancedEffects_check' - }).inject(link); - } - } - else { - MUI.options.advancedEffects = false; - if (this.toggleAdvancedEffectsLink) { - this.toggleAdvancedEffectsLink.destroy(); - } - } - }, - /* - - Function: toggleStandardEffects - Turn standard effects on and off - - */ - toggleStandardEffects: function(link){ - if (MUI.options.standardEffects == false) { - MUI.options.standardEffects = true; - if (link){ - this.toggleStandardEffectsLink = new Element('div', { - 'class': 'check', - 'id': 'toggleStandardEffects_check' - }).inject(link); - } - } - else { - MUI.options.standardEffects = false; - if (this.toggleStandardEffectsLink) { - this.toggleStandardEffectsLink.destroy(); - } - } - }, - - /* - - The underlay is inserted directly under windows when they are being dragged or resized - so that the cursor is not captured by iframes or other plugins (such as Flash) - underneath the window. - - */ - underlayInitialize: function(){ - var windowUnderlay = new Element('div', { - 'id': 'windowUnderlay', - 'styles': { - 'height': parent.getCoordinates().height, - 'opacity': .01, - 'display': 'none' - } - }).inject(document.body); - }, - setUnderlaySize: function(){ - $('windowUnderlay').setStyle('height', parent.getCoordinates().height); - } -}); - -/* - -function: fixPNG - Bob Osola's PngFix for IE6. - -example: - (begin code) - foo - (end) - -note: - You must have the image height and width attributes specified in the markup. - -*/ - -function fixPNG(myImage){ - if (Browser.Engine.trident4 && document.body.filters){ - var imgID = (myImage.id) ? "id='" + myImage.id + "' " : ""; - var imgClass = (myImage.className) ? "class='" + myImage.className + "' " : ""; - var imgTitle = (myImage.title) ? "title='" + myImage.title + "' " : "title='" + myImage.alt + "' "; - var imgStyle = "display:inline-block;" + myImage.style.cssText; - var strNewHTML = ""; - myImage.outerHTML = strNewHTML; - } -} - -// Blur all windows if user clicks anywhere else on the page -document.addEvent('mousedown', function(event){ - MUI.blurAll.delay(50); -}); - -window.addEvent('domready', function(){ - MUI.underlayInitialize(); -}); - -window.addEvent('resize', function(){ - if ($('windowUnderlay')) { - MUI.setUnderlaySize(); - } - else { - MUI.underlayInitialize(); - } -}); - -Element.implement({ - hide: function(){ - this.setStyle('display', 'none'); - return this; - }, - show: function(){ - this.setStyle('display', 'block'); - return this; - } -}); - -/* - -Shake effect by Uvumi Tools -http://tools.uvumi.com/element-shake.html - -Function: shake - -Example: - Shake a window. - (start code) - $('parametrics').shake() - (end) - -*/ - -Element.implement({ - shake: function(radius,duration){ - radius = radius || 3; - duration = duration || 500; - duration = (duration/50).toInt() - 1; - var parent = this.getParent(); - if(parent != $(document.body) && parent.getStyle('position') == 'static'){ - parent.setStyle('position','relative'); - } - var position = this.getStyle('position'); - if(position == 'static'){ - this.setStyle('position','relative'); - position = 'relative'; - } - if(MUI.ieLegacySupport){ - parent.setStyle('height',parent.getStyle('height')); - } - var coords = this.getPosition(parent); - if(position == 'relative' && !Browser.Engine.presto){ - coords.x -= parent.getStyle('paddingLeft').toInt(); - coords.y -= parent.getStyle('paddingTop').toInt(); - } - var morph = this.retrieve('morph'); - if (morph){ - morph.cancel(); - var oldOptions = morph.options; - } - var morph = this.get('morph',{ - duration:50, - link:'chain' - }); - for(var i=0 ; i < duration ; i++){ - morph.start({ - top:coords.y+$random(-radius,radius), - left:coords.x+$random(-radius,radius) - }); - } - morph.start({ - top:coords.y, - left:coords.x - }).chain(function(){ - if(oldOptions){ - this.set('morph',oldOptions); - } - }.bind(this)); - return this; - } -}); - -String.implement({ - - parseQueryString: function() { - var vars = this.split(/[&;]/); - var rs = {}; - if (vars.length) vars.each(function(val) { - var keys = val.split('='); - if (keys.length && keys.length == 2) rs[decodeURIComponent(keys[0])] = decodeURIComponent(keys[1]); - }); - return rs; - } - -}); - -// Mootools Patch: Fixes issues in Safari, Chrome, and Internet Explorer caused by processing text as XML. -Request.HTML.implement({ - - processHTML: function(text){ - var match = text.match(/]*>([\s\S]*?)<\/body>/i); - text = (match) ? match[1] : text; - var container = new Element('div'); - return container.set('html', text); - } - -}); - -/* - - Examples: - (start code) - getCSSRule('.myRule'); - getCSSRule('#myRule'); - (end) - -*/ -MUI.getCSSRule = function(selector) { - for (var ii = 0; ii < document.styleSheets.length; ii++) { - var mysheet = document.styleSheets[ii]; - var myrules = mysheet.cssRules ? mysheet.cssRules : mysheet.rules; - for (i = 0; i < myrules.length; i++){ - if (myrules[i].selectorText == selector){ - return myrules[i]; - } - } - } - return false; -} - -// This makes it so Request will work to some degree locally -if (location.protocol == "file:"){ - - Request.implement({ - isSuccess : function(status){ - return (status == 0 || (status >= 200) && (status < 300)); - } - }); - - Browser.Request = function(){ - return $try(function(){ - return new ActiveXObject('MSXML2.XMLHTTP'); - }, function(){ - return new XMLHttpRequest(); - }); - }; - -} - -MUI.Require = new Class({ - - Implements: [Options], - - options: { - css: [], - images: [], - js: [], - onload: $empty - }, - - initialize: function(options){ - this.setOptions(options); - var options = this.options; - - this.assetsToLoad = options.css.length + options.images.length + options.js.length; - this.assetsLoaded = 0; - - var cssLoaded = 0; - - // Load CSS before images and JavaScript - - if (options.css.length){ - options.css.each( function(sheet){ - - this.getAsset(sheet, function(){ - if (cssLoaded == options.css.length - 1){ - - if (this.assetsLoaded == this.assetsToLoad - 1){ - this.requireOnload(); - } - else { - // Add a little delay since we are relying on cached CSS from XHR request. - this.assetsLoaded++; - this.requireContinue.delay(50, this); - } - } - else { - cssLoaded++; - this.assetsLoaded++; - } - }.bind(this)); - }.bind(this)); - } - else if (!options.js.length && !options.images.length){ - this.options.onload(); - return true; - } - else { - this.requireContinue.delay(50, this); // Delay is for Safari - } - - }, - - requireOnload: function(){ - this.assetsLoaded++; - if (this.assetsLoaded == this.assetsToLoad){ - this.options.onload(); - return true; - } - - }, - - requireContinue: function(){ - - var options = this.options; - if (options.images.length){ - options.images.each( function(image){ - this.getAsset(image, this.requireOnload.bind(this)); - }.bind(this)); - } - - if (options.js.length){ - options.js.each( function(script){ - this.getAsset(script, this.requireOnload.bind(this)); - }.bind(this)); - } - - }, - - getAsset: function(source, onload){ - - // If the asset is loaded, fire the onload function. - if ( MUI.files[source] == 'loaded' ){ - if (typeof onload == 'function'){ - onload(); - } - return true; - } - - // If the asset is loading, wait until it is loaded and then fire the onload function. - // If asset doesn't load by a number of tries, fire onload anyway. - else if ( MUI.files[source] == 'loading' ){ - var tries = 0; - var checker = (function(){ - tries++; - if (MUI.files[source] == 'loading' && tries < '100') return; - $clear(checker); - if (typeof onload == 'function'){ - onload(); - } - }).periodical(50); - } - - // If the asset is not yet loaded or loading, start loading the asset. - else { - MUI.files[source] = 'loading'; - - properties = { - 'onload': onload != 'undefined' ? onload : $empty - }; - - // Add to the onload function - var oldonload = properties.onload; - properties.onload = function() { - MUI.files[source] = 'loaded'; - if (oldonload) { - oldonload(); - } - }.bind(this); - - switch ( source.match(/\.\w+$/)[0] ) { - case '.js': return Asset.javascript(source, properties); - case '.css': return Asset.css(source, properties); - case '.jpg': - case '.png': - case '.gif': return Asset.image(source, properties); - } - - alert('The required file "' + source + '" could not be loaded'); - } - } - -}); - -$extend(Asset, { - - /* Fix an Opera bug in Mootools 1.2 */ - javascript: function(source, properties){ - properties = $extend({ - onload: $empty, - document: document, - check: $lambda(true) - }, properties); - - if ($(properties.id)) { - properties.onload(); - return $(properties.id); - } - - var script = new Element('script', {'src': source, 'type': 'text/javascript'}); - - var load = properties.onload.bind(script), check = properties.check, doc = properties.document; - delete properties.onload; delete properties.check; delete properties.document; - - if (!Browser.Engine.webkit419 && !Browser.Engine.presto){ - script.addEvents({ - load: load, - readystatechange: function(){ - if (MUI.ieLegacySupport && ['loaded', 'complete'].contains(this.readyState)) - load(); - } - }).setProperties(properties); - } - else { - var checker = (function(){ - if (!$try(check)) return; - $clear(checker); - // Opera has difficulty with multiple scripts being injected into the head simultaneously. We need to give it time to catch up. - Browser.Engine.presto ? load.delay(500) : load(); - }).periodical(50); - } - return script.inject(doc.head); - }, - - // Get the CSS with XHR before appending it to document.head so that we can have an onload callback. - css: function(source, properties){ - - properties = $extend({ - id: null, - media: 'screen', - onload: $empty - }, properties); - - new Request({ - method: 'get', - url: source, - onComplete: function(response) { - var newSheet = new Element('link', { - 'id': properties.id, - 'rel': 'stylesheet', - 'media': properties.media, - 'type': 'text/css', - 'href': source - }).inject(document.head); - properties.onload(); - }.bind(this), - onFailure: function(response){ - }, - onSuccess: function(){ - }.bind(this) - }).send(); - } - -}); - -/* - -REGISTER PLUGINS - - Register Components and Plugins for Lazy Loading - - How this works may take a moment to grasp. Take a look at MUI.Window below. - If we try to create a new Window and Window.js has not been loaded then the function - below will run. It will load the CSS required by the MUI.Window Class and then - then it will load Window.js. Here is the interesting part. When Window.js loads, - it will overwrite the function below, and new MUI.Window(arg) will be ran - again. This time it will create a new MUI.Window instance, and any future calls - to new MUI.Window(arg) will immediately create new windows since the assets - have already been loaded and our temporary function below has been overwritten. - - Example: - - MyPlugins.extend({ - - MyGadget: function(arg){ - new MUI.Require({ - css: [MUI.path.plugins + 'myGadget/css/style.css'], - images: [MUI.path.plugins + 'myGadget/images/background.gif'] - js: [MUI.path.plugins + 'myGadget/scripts/myGadget.js'], - onload: function(){ - new MyPlguins.MyGadget(arg); - } - }); - } - - }); - --------------------------------------------------------------------- */ - -MUI.extend({ - - newWindowsFromJSON: function(arg){ - new MUI.Require({ - js: [MUI.path.source + 'Window/Windows-from-json.js'], - onload: function(){ - new MUI.newWindowsFromJSON(arg); - } - }); - }, - - arrangeCascade: function(){ - new MUI.Require({ - js: [MUI.path.source + 'Window/Arrange-cascade.js'], - onload: function(){ - new MUI.arrangeCascade(); - } - }); - }, - - arrangeTile: function(){ - new MUI.Require({ - js: [MUI.path.source + 'Window/Arrange-tile.js'], - onload: function(){ - new MUI.arrangeTile(); - } - }); - }, - - saveWorkspace: function(){ - new MUI.Require({ - js: [MUI.path.source + 'Layout/Workspaces.js'], - onload: function(){ - new MUI.saveWorkspace(); - } - }); - }, - - loadWorkspace: function(){ - new MUI.Require({ - js: [MUI.path.source + 'Layout/Workspaces.js'], - onload: function(){ - new MUI.loadWorkspace(); - } - }); - }, - - Themes: { - init: function(arg){ - new MUI.Require({ - js: [MUI.path.source + 'Utilities/Themes.js'], - onload: function(){ - MUI.Themes.init(arg); - } - }); - } - } - -}); -/* - -Script: Themes.js - Allows for switching themes dynamically. - -Copyright: - Copyright (c) 2007-2009 Greg Houston, . - -License: - MIT-style license. - -Requires: - Core.js - -Notes: - Themes are new and experimental. - -Syntax: - (start code) - new MUI.Themes.init(newTheme); - (end) - -Example: - (start code) - new MUI.Themes.init('charcoal'); - (end) - -Arguments: - newTheme - (string) The theme name - -*/ - -MUI.files[MUI.path.source + 'Utilities/Themes.js'] = 1; - -MUI.Themes = { - - /* - - Function: themeInit - Initialize a theme. This is experimental and not fully implemented yet. - - */ - init: function(newTheme){ - this.newTheme = newTheme.toLowerCase(); - if (!this.newTheme || this.newTheme == null || this.newTheme == MUI.options.theme.toLowerCase()) return; - - if ($('spinner')) $('spinner').show(); - - this.oldURIs = []; - this.oldSheets = []; - - $$('link').each( function(link){ - var href = link.get('href'); - if (href.contains(MUI.path.themes + MUI.options.theme)){ - this.oldURIs.push(href); - this.oldSheets.push(link); - } - }.bind(this)); - - /* - MUI.files.each( function(value, key, hash){ - if (key.contains(MUI.path.themes + MUI.options.theme)){ - this.oldURIs.push(key); - } - }.bind(this)); - */ - - this.newSheetURLs = this.oldURIs.map(function(item, index){ - return item.replace("/" + MUI.options.theme + "/", "/" + MUI.Themes.newTheme + "/"); - }.bind(this)); - - this.sheetsToLoad = this.oldURIs.length; - this.sheetsLoaded = 0; - - // Download new stylesheets and add them to an array - this.newSheets = []; - this.newSheetURLs.each( function(link){ - var href = link; - - //var id = link.id; - - var cssRequest = new Request({ - method: 'get', - url: href, - onComplete: function(response) { - var newSheet = new Element('link', { - //'id': id, - 'rel': 'stylesheet', - 'media': 'screen', - 'type': 'text/css', - 'href': href - }); - this.newSheets.push(newSheet); - }.bind(this), - onFailure: function(response){ - this.themeLoadSuccess = false; - if ($('spinner')) $('spinner').hide(); - MUI.notification('Stylesheets did not load.'); - }, - onSuccess: function(){ - this.sheetsLoaded++; - if (this.sheetsLoaded == this.sheetsToLoad) { - this.updateThemeStylesheets(); - this.themeLoadSuccess = true; - } - }.bind(this) - }); - cssRequest.send(); - - }.bind(this)); - - }, - updateThemeStylesheets: function(){ - - this.oldSheets.each( function(sheet){ - sheet.destroy(); - }); - - this.newSheets.each( function(sheet){ - MUI.files[sheet.get('href')] = 1; - sheet.inject(document.head); - }); - - // Delay gives the stylesheets time to take effect. IE6 needs more delay. - if (MUI.ieLegacySupport){ - this.redraw.delay(1250, this); - } - else { - this.redraw.delay(250, this); - } - - }, - redraw: function(){ - - $$('.replaced').removeClass('replaced'); - - // Redraw open windows - $$('.mocha').each( function(element){ - var instance = element.retrieve('instance'); - - // Convert CSS colors to Canvas colors. - instance.setColors(); - instance.drawWindow(); - }); - - if (MUI.Dock){ - if (MUI.Dock.options.useControls){ - MUI.Dock.setDockColors(); - MUI.Dock.renderDockControls(); - } - } - - // Reformat layout - if (MUI.Desktop.desktop){ - var checker = (function(){ - // Make sure the style sheets are really ready. - if (MUI.Desktop.desktop.getStyle('overflow') != 'hidden'){ - return; - } - $clear(checker); - MUI.Desktop.setDesktopSize(); - }).periodical(50); - } - - if ($('spinner')) $('spinner').hide(); - MUI.options.theme = this.newTheme; - - /* - this.cookie = new Hash.Cookie('mochaUIthemeCookie', {duration: 3600}); - this.cookie.empty(); - this.cookie.set('theme', MUI.options.theme); - this.cookie.save(); - */ - - } -}; - -window.addEvent('load', function(){ - /* - // Load theme the user was last using. This needs work. - var cookie = new Hash.Cookie('mochaUIthemeCookie', {duration: 3600}); - var themeCookie = cookie.load(); - if(cookie.getKeys().length){ - if (themeCookie.get('theme') != MUI.Themes.options.theme){ - MUI.Themes.init.delay(1000, MUI.Themes, themeCookie.get('theme')); - } - } - */ - - if ($('themeControl')){ - $('themeControl').getElements('option').setProperty('selected', 'false'); - if ($('chooseTheme')){ - $('chooseTheme').setProperty('selected', 'true'); - } - } -}); -/* - -Script: Window.js - Build windows. - -Copyright: - Copyright (c) 2007-2009 Greg Houston, . - -License: - MIT-style license. - -Requires: - Core.js - -*/ - -MUI.files[MUI.path.source + 'Window/Window.js'] = 'loading'; -//$require(MUI.themePath() + '/css/Dock.css'); - -/* -Class: Window - Creates a single MochaUI window. - -Syntax: - (start code) - new MUI.Window(options); - (end) - -Arguments: - options - -Options: - id - The ID of the window. If not defined, it will be set to 'win' + windowIDCount. - title - The title of the window. - icon - Place an icon in the window's titlebar. This is either set to false or to the url of the icon. It is set up for icons that are 16 x 16px. - type - ('window', 'modal', 'modal2', or 'notification') Defaults to 'window'. Modals should be created with new MUI.Modal(options). - loadMethod - ('html', 'xhr', or 'iframe') Defaults to 'html' if there is no contentURL. Defaults to 'xhr' if there is a contentURL. You only really need to set this if using the 'iframe' method. - contentURL - Used if loadMethod is set to 'xhr' or 'iframe'. - closeAfter - Either false or time in milliseconds. Closes the window after a certain period of time in milliseconds. This is particularly useful for notifications. - evalScripts - (boolean) An xhr loadMethod option. Defaults to true. - evalResponse - (boolean) An xhr loadMethod option. Defaults to false. - content - (string or element) An html loadMethod option. - toolbar - (boolean) Create window toolbar. Defaults to false. This can be used for tabs, media controls, and so forth. - toolbarPosition - ('top' or 'bottom') Defaults to top. - toolbarHeight - (number) - toolbarURL - (url) Defaults to 'pages/lipsum.html'. - toolbarContent - (string) - toolbarOnload - (function) - toolbar2 - (boolean) Create window toolbar. Defaults to false. This can be used for tabs, media controls, and so forth. - toolbar2Position - ('top' or 'bottom') Defaults to top. - toolbar2Height - (number) - toolbar2URL - (url) Defaults to 'pages/lipsum.html'. - toolbar2Content - (string) - toolbar2Onload - (function) - container - (element ID) Element the window is injected in. The container defaults to 'desktop'. If no desktop then to document.body. Use 'pageWrapper' if you don't want the windows to overlap the toolbars. - restrict - (boolean) Restrict window to container when dragging. - shape - ('box' or 'gauge') Shape of window. Defaults to 'box'. - collapsible - (boolean) Defaults to true. - minimizable - (boolean) Requires MUI.Desktop and MUI.Dock. Defaults to true if dependenices are met. - maximizable - (boolean) Requires MUI.Desktop. Defaults to true if dependenices are met. - closable - (boolean) Defaults to true. - storeOnClose - (boolean) Hides a window and it's dock tab rather than destroying them on close. If you try to create the window again it will unhide the window and dock tab. - modalOverlayClose - (boolean) Whether or not you can close a modal by clicking on the modal overlay. Defaults to true. - draggable - (boolean) Defaults to false for modals; otherwise true. - draggableGrid - (false or number) Distance in pixels for snap-to-grid dragging. Defaults to false. - draggableLimit - (false or number) An object with x and y properties used to limit the movement of the Window. Defaults to false. - draggableSnap - (boolean) The distance to drag before the Window starts to respond to the drag. Defaults to false. - resizable - (boolean) Defaults to false for modals, notifications and gauges; otherwise true. - resizeLimit - (object) Minimum and maximum width and height of window when resized. - addClass - (string) Add a class to the window for more control over styling. - width - (number) Width of content area. - height - (number) Height of content area. - headerHeight - (number) Height of window titlebar. - footerHeight - (number) Height of window footer. - cornerRadius - (number) - x - (number) If x and y are left undefined the window is centered on the page. - y - (number) - scrollbars - (boolean) - padding - (object) - shadowBlur - (number) Width of shadows. - shadowOffset - Should be positive and not be greater than the ShadowBlur. - controlsOffset - Change this if you want to reposition the window controls. - useCanvas - (boolean) Set this to false if you don't want a canvas body. - useCanvasControls - (boolean) Set this to false if you wish to use images for the buttons. - useSpinner - (boolean) Toggles whether or not the ajax spinners are displayed in window footers. Defaults to true. - headerStartColor - ([r,g,b,]) Titlebar gradient's top color - headerStopColor - ([r,g,b,]) Titlebar gradient's bottom color - bodyBgColor - ([r,g,b,]) Background color of the main canvas shape - minimizeBgColor - ([r,g,b,]) Minimize button background color - minimizeColor - ([r,g,b,]) Minimize button color - maximizeBgColor - ([r,g,b,]) Maximize button background color - maximizeColor - ([r,g,b,]) Maximize button color - closeBgColor - ([r,g,b,]) Close button background color - closeColor - ([r,g,b,]) Close button color - resizableColor - ([r,g,b,]) Resizable icon color - onBeforeBuild - (function) Fired just before the window is built. - onContentLoaded - (function) Fired when content is successfully loaded via XHR or Iframe. - onFocus - (function) Fired when the window is focused. - onBlur - (function) Fired when window loses focus. - onResize - (function) Fired when the window is resized. - onMinimize - (function) Fired when the window is minimized. - onMaximize - (function) Fired when the window is maximized. - onRestore - (function) Fired when a window is restored from minimized or maximized. - onClose - (function) Fired just before the window is closed. - onCloseComplete - (function) Fired after the window is closed. - -Returns: - Window object. - -Example: - Define a window. It is suggested you name the function the same as your window ID + "Window". - (start code) - var mywindowWindow = function(){ - new MUI.Window({ - id: 'mywindow', - title: 'My Window', - loadMethod: 'xhr', - contentURL: 'pages/lipsum.html', - width: 340, - height: 150 - }); - } - (end) - -Example: - Create window onDomReady. - (start code) - window.addEvent('domready', function(){ - mywindow(); - }); - (end) - -Example: - Add link events to build future windows. It is suggested you give your anchor the same ID as your window + "WindowLink" or + "WindowLinkCheck". Use the latter if it is a link in the menu toolbar. - - If you wish to add links in windows that open other windows remember to add events to those links when the windows are created. - - (start code) - // Javascript: - if ($('mywindowLink')){ - $('mywindowLink').addEvent('click', function(e) { - new Event(e).stop(); - mywindow(); - }); - } - - // HTML: - My Window - (end) - - - Loading Content with an XMLHttpRequest(xhr): - For content to load via xhr all the files must be online and in the same domain. If you need to load content from another domain or wish to have it work offline, load the content in an iframe instead of using the xhr option. - - Iframes: - If you use the iframe loadMethod your iframe will automatically be resized when the window it is in is resized. If you want this same functionality when using one of the other load options simply add class="mochaIframe" to those iframes and they will be resized for you as well. - -*/ - -// Having these options outside of the Class allows us to add, change, and remove -// individual options without rewriting all of them. - -MUI.extend({ - Windows: { - instances: new Hash(), - indexLevel: 100, // Used for window z-Index - windowIDCount: 0, // Used for windows without an ID defined by the user - windowsVisible: true, // Ctrl-Alt-Q to toggle window visibility - focusingWindow: false - } -}); - -MUI.Windows.windowOptions = { - id: null, - title: 'New Window', - icon: false, - type: 'window', - require: { - css: [], - images: [], - js: [], - onload: null - }, - loadMethod: null, - method: 'get', - contentURL: null, - data: null, - - closeAfter: false, - - // xhr options - evalScripts: true, - evalResponse: false, - - // html options - content: 'Window content', - - // Toolbar - toolbar: false, - toolbarPosition: 'top', - toolbarHeight: 29, - toolbarURL: 'pages/lipsum.html', - toolbarData: null, - toolbarContent: '', - toolbarOnload: $empty, - - // Toolbar - toolbar2: false, - toolbar2Position: 'bottom', - toolbar2Height: 29, - toolbar2URL: 'pages/lipsum.html', - toolbar2Data: null, - toolbar2Content: '', - toolbar2Onload: $empty, - - // Container options - container: null, - restrict: true, - shape: 'box', - - // Window Controls - collapsible: true, - minimizable: true, - maximizable: true, - closable: true, - - // Close options - storeOnClose: false, - - // Modal options - modalOverlayClose: true, - - // Draggable - draggable: null, - draggableGrid: false, - draggableLimit: false, - draggableSnap: false, - - // Resizable - resizable: null, - resizeLimit: {'x': [250, 2500], 'y': [125, 2000]}, - - // Style options: - addClass: '', - width: 300, - height: 125, - headerHeight: 25, - footerHeight: 25, - cornerRadius: 8, - x: null, - y: null, - scrollbars: true, - padding: { top: 10, right: 12, bottom: 10, left: 12 }, - shadowBlur: 5, - shadowOffset: {'x': 0, 'y': 1}, - controlsOffset: {'right': 6, 'top': 6}, - useCanvas: true, - useCanvasControls: true, - useSpinner: true, - - // Color options: - headerStartColor: [250, 250, 250], - headerStopColor: [229, 229, 229], - bodyBgColor: [229, 229, 229], - minimizeBgColor: [255, 255, 255], - minimizeColor: [0, 0, 0], - maximizeBgColor: [255, 255, 255], - maximizeColor: [0, 0, 0], - closeBgColor: [255, 255, 255], - closeColor: [0, 0, 0], - resizableColor: [254, 254, 254], - - // Events - onBeforeBuild: $empty, - onContentLoaded: $empty, - onFocus: $empty, - onBlur: $empty, - onResize: $empty, - onMinimize: $empty, - onMaximize: $empty, - onRestore: $empty, - onClose: $empty, - onCloseComplete: $empty -}; - -MUI.Windows.windowOptionsOriginal = $merge(MUI.Windows.windowOptions); - -MUI.Window = new Class({ - - Implements: [Events, Options], - - options: MUI.Windows.windowOptions, - - initialize: function(options){ - this.setOptions(options); - - // Shorten object chain - var options = this.options; - - $extend(this, { - mochaControlsWidth: 0, - minimizebuttonX: 0, // Minimize button horizontal position - maximizebuttonX: 0, // Maximize button horizontal position - closebuttonX: 0, // Close button horizontal position - headerFooterShadow: options.headerHeight + options.footerHeight + (options.shadowBlur * 2), - oldTop: 0, - oldLeft: 0, - isMaximized: false, - isMinimized: false, - isCollapsed: false, - timestamp: $time() - }); - - if (options.type != 'window'){ - options.container = document.body; - options.minimizable = false; - } - if (!options.container){ - options.container = MUI.Desktop && MUI.Desktop.desktop ? MUI.Desktop.desktop : document.body; - } - - // Set this.options.resizable to default if it was not defined - if (options.resizable == null){ - if (options.type != 'window' || options.shape == 'gauge'){ - options.resizable = false; - } - else { - options.resizable = true; - } - } - - // Set this.options.draggable if it was not defined - if (options.draggable == null){ - options.draggable = options.type != 'window' ? false : true; - } - - // Gauges are not maximizable or resizable - if (options.shape == 'gauge' || options.type == 'notification'){ - options.collapsible = false; - options.maximizable = false; - options.contentBgColor = 'transparent'; - options.scrollbars = false; - options.footerHeight = 0; - } - if (options.type == 'notification'){ - options.closable = false; - options.headerHeight = 0; - } - - // Minimizable, dock is required and window cannot be modal - if (MUI.Dock && $(MUI.options.dock)){ - if (MUI.Dock.dock && options.type != 'modal' && options.type != 'modal2'){ - options.minimizable = options.minimizable; - } - } - else { - options.minimizable = false; - } - - // Maximizable, desktop is required - options.maximizable = MUI.Desktop && MUI.Desktop.desktop && options.maximizable && options.type != 'modal' && options.type != 'modal2'; - - if (this.options.type == 'modal2') { - this.options.shadowBlur = 0; - this.options.shadowOffset = {'x': 0, 'y': 0}; - this.options.useSpinner = false; - this.options.useCanvas = false; - this.options.footerHeight = 0; - this.options.headerHeight = 0; - } - - // If window has no ID, give it one. - options.id = options.id || 'win' + (++MUI.Windows.windowIDCount); - - this.windowEl = $(options.id); - - if (options.require.css.length || options.require.images.length){ - new MUI.Require({ - css: options.require.css, - images: options.require.images, - onload: function(){ - this.newWindow(); - }.bind(this) - }); - } - else { - this.newWindow(); - } - - // Return window object - return this; - }, - saveValues: function(){ - var coordinates = this.windowEl.getCoordinates(); - this.options.x = coordinates.left.toInt(); - this.options.y = coordinates.top.toInt(); - }, - - /* - - Internal Function: newWindow - - Arguments: - properties - - */ - newWindow: function(properties){ // options is not doing anything - - // Shorten object chain - var instances = MUI.Windows.instances; - var instanceID = MUI.Windows.instances.get(this.options.id); - var options = this.options; - - // Here we check to see if there is already a class instance for this window - if (instanceID) var instance = instanceID; - - // Check if window already exists and is not in progress of closing - if ( this.windowEl && !this.isClosing ){ - // Restore if minimized - if (instance.isMinimized){ - MUI.Dock.restoreMinimized(this.windowEl); - } - // Expand and focus if collapsed - else if (instance.isCollapsed){ - MUI.collapseToggle(this.windowEl); - setTimeout(MUI.focusWindow.pass(this.windowEl, this),10); - } - else if (this.windowEl.hasClass('windowClosed')){ - - if (instance.check) instance.check.show(); - - this.windowEl.removeClass('windowClosed'); - this.windowEl.setStyle('opacity', 0); - this.windowEl.addClass('mocha'); - - if (MUI.Dock && $(MUI.options.dock) && instance.options.type == 'window') { - var currentButton = $(instance.options.id + '_dockTab'); - if (currentButton != null) { - currentButton.show(); - } - MUI.Desktop.setDesktopSize(); - } - - instance.displayNewWindow(); - - } - // Else focus - else { - var coordinates = document.getCoordinates(); - if (this.windowEl.getStyle('left').toInt() > coordinates.width || this.windowEl.getStyle('top').toInt() > coordinates.height){ - MUI.centerWindow(this.windowEl); - } - setTimeout(MUI.focusWindow.pass(this.windowEl, this),10); - if (MUI.options.standardEffects == true) { - this.windowEl.shake(); - } - } - return; - } - else { - instances.set(options.id, this); - } - - this.isClosing = false; - this.fireEvent('onBeforeBuild'); - - // Create window div - MUI.Windows.indexLevel++; - this.windowEl = new Element('div', { - 'class': 'mocha', - 'id': options.id, - 'styles': { - 'position': 'absolute', - 'width': options.width, - 'height': options.height, - 'display': 'block', - 'opacity': 0, - 'zIndex': MUI.Windows.indexLevel += 2 - } - }); - - this.windowEl.store('instance', this); - - this.windowEl.addClass(options.addClass); - - if (options.type == 'modal2') { - this.windowEl.addClass('modal2'); - } - - // Fix a mouseover issue with gauges in IE7 - if ( MUI.ieLegacySupport && options.shape == 'gauge') { - this.windowEl.setStyle('backgroundImage', 'url(../images/skin/spacer.gif)'); - } - - if (options.loadMethod == 'iframe') { - options.padding = { top: 0, right: 0, bottom: 0, left: 0 }; - } - - // Insert sub elements inside windowEl - this.insertWindowElements(); - - // Set title - this.titleEl.set('html', options.title); - - this.contentWrapperEl.setStyle('overflow', 'hidden'); - - this.contentEl.setStyles({ - 'padding-top': options.padding.top, - 'padding-bottom': options.padding.bottom, - 'padding-left': options.padding.left, - 'padding-right': options.padding.right - }); - - if (options.shape == 'gauge'){ - if (options.useCanvasControls){ - this.canvasControlsEl.setStyle('visibility', 'hidden'); - } - else { - this.controlsEl.setStyle('visibility', 'hidden'); - } - this.windowEl.addEvent('mouseover', function(){ - this.mouseover = true; - var showControls = function(){ - if (this.mouseover != false){ - if (options.useCanvasControls){ - this.canvasControlsEl.setStyle('visibility', 'visible'); - } - else { - this.controlsEl.setStyle('visibility', 'visible'); - } - this.canvasHeaderEl.setStyle('visibility', 'visible'); - this.titleEl.show(); - } - }; - showControls.delay(0, this); - - }.bind(this)); - this.windowEl.addEvent('mouseleave', function(){ - this.mouseover = false; - if (this.options.useCanvasControls){ - this.canvasControlsEl.setStyle('visibility', 'hidden'); - } - else { - this.controlsEl.setStyle('visibility', 'hidden'); - } - this.canvasHeaderEl.setStyle('visibility', 'hidden'); - this.titleEl.hide(); - }.bind(this)); - } - - // Inject window into DOM - this.windowEl.inject(options.container); - - // Convert CSS colors to Canvas colors. - this.setColors(); - - if (options.type != 'notification'){ - this.setMochaControlsWidth(); - } - - // Add content to window. - MUI.updateContent({ - 'element': this.windowEl, - 'content': options.content, - 'method': options.method, - 'url': options.contentURL, - 'data': options.data, - 'onContentLoaded': null, - 'require': { - js: options.require.js, - onload: options.require.onload - } - }); - - // Add content to window toolbar. - if (this.options.toolbar == true){ - MUI.updateContent({ - 'element': this.windowEl, - 'childElement': this.toolbarEl, - 'content': options.toolbarContent, - 'loadMethod': 'xhr', - 'method': options.method, - 'url': options.toolbarURL, - 'data': options.toolbarData, - 'onContentLoaded': options.toolbarOnload - }); - } - - // Add content to window toolbar. - if (this.options.toolbar2 == true){ - MUI.updateContent({ - 'element': this.windowEl, - 'childElement': this.toolbar2El, - 'content': options.toolbar2Content, - 'loadMethod': 'xhr', - 'method': options.method, - 'url': options.toolbar2URL, - 'data': options.toolbar2Data, - 'onContentLoaded': options.toolbar2Onload - }); - } - - this.drawWindow(); - - // Attach events to the window - this.attachDraggable(); - this.attachResizable(); - this.setupEvents(); - - if (options.resizable){ - this.adjustHandles(); - } - - // Position window. If position not specified by user then center the window on the page. - if (options.container == document.body || options.container == MUI.Desktop.desktop){ - var dimensions = window.getSize(); - } - else { - var dimensions = $(this.options.container).getSize(); - } - - if (!options.y) { - if (MUI.Desktop && MUI.Desktop.desktop) { - var y = (dimensions.y * .5) - (this.windowEl.offsetHeight * .5); - if (y < -options.shadowBlur) y = -options.shadowBlur; - } - else { - var y = window.getScroll().y + (window.getSize().y * .5) - (this.windowEl.offsetHeight * .5); - if (y < -options.shadowBlur) y = -options.shadowBlur; - } - } - else { - var y = options.y - options.shadowBlur; - } - - if (!this.options.x) { - var x = (dimensions.x * .5) - (this.windowEl.offsetWidth * .5); - if (x < -options.shadowBlur) x = -options.shadowBlur; - } - else { - var x = options.x - options.shadowBlur; - } - - this.windowEl.setStyles({ - 'top': y, - 'left': x - }); - - // Create opacityMorph - - this.opacityMorph = new Fx.Morph(this.windowEl, { - 'duration': 350, - transition: Fx.Transitions.Sine.easeInOut, - onComplete: function(){ - if (MUI.ieLegacySupport){ - this.drawWindow(); - } - }.bind(this) - }); - - this.displayNewWindow(); - - // This is a generic morph that can be reused later by functions like centerWindow() - // It returns the windowEl element rather than this Class. - this.morph = new Fx.Morph(this.windowEl, { - 'duration': 200 - }); - this.windowEl.store('morph', this.morph); - - this.resizeMorph = new Fx.Elements([this.contentWrapperEl, this.windowEl], { - duration: 400, - transition: Fx.Transitions.Sine.easeInOut, - onStart: function(){ - this.resizeAnimation = this.drawWindow.periodical(20, this); - }.bind(this), - onComplete: function(){ - $clear(this.resizeAnimation); - this.drawWindow(); - // Show iframe - if ( this.iframeEl ) { - this.iframeEl.setStyle('visibility', 'visible'); - } - }.bind(this) - }); - this.windowEl.store('resizeMorph', this.resizeMorph); - - // Add check mark to menu if link exists in menu - // Need to make sure the check mark is not added to links not in menu - if ($(this.windowEl.id + 'LinkCheck')){ - this.check = new Element('div', { - 'class': 'check', - 'id': this.options.id + '_check' - }).inject(this.windowEl.id + 'LinkCheck'); - } - - if (this.options.closeAfter != false){ - MUI.closeWindow.delay(this.options.closeAfter, this, this.windowEl); - } - - if (MUI.Dock && $(MUI.options.dock) && this.options.type == 'window' ){ - MUI.Dock.createDockTab(this.windowEl); - } - - }, - displayNewWindow: function(){ - - options = this.options; - if (options.type == 'modal' || options.type == 'modal2') { - MUI.currentModal = this.windowEl; - if (Browser.Engine.trident4){ - $('modalFix').show(); - } - $('modalOverlay').show(); - if (MUI.options.advancedEffects == false){ - $('modalOverlay').setStyle('opacity', .6); - this.windowEl.setStyles({ - 'zIndex': 11000, - 'opacity': 1 - }); - } - else { - MUI.Modal.modalOverlayCloseMorph.cancel(); - MUI.Modal.modalOverlayOpenMorph.start({ - 'opacity': .6 - }); - this.windowEl.setStyles({ - 'zIndex': 11000 - }); - this.opacityMorph.start({ - 'opacity': 1 - }); - } - - $$('.dockTab').removeClass('activeDockTab'); - $$('.mocha').removeClass('isFocused'); - this.windowEl.addClass('isFocused'); - - } - else if (MUI.options.advancedEffects == false){ - this.windowEl.setStyle('opacity', 1); - setTimeout(MUI.focusWindow.pass(this.windowEl, this), 10); - } - else { - // IE cannot handle both element opacity and VML alpha at the same time. - if (MUI.ieLegacySupport){ - this.drawWindow(false); - } - this.opacityMorph.start({ - 'opacity': 1 - }); - setTimeout(MUI.focusWindow.pass(this.windowEl, this), 10); - } - - }, - setupEvents: function() { - var windowEl = this.windowEl; - // Set events - // Note: if a button does not exist, its due to properties passed to newWindow() stating otherwise - if (this.closeButtonEl){ - this.closeButtonEl.addEvent('click', function(e) { - new Event(e).stop(); - MUI.closeWindow(windowEl); - }.bind(this)); - } - - if (this.options.type == 'window'){ - windowEl.addEvent('mousedown', function(e) { - if (MUI.ieLegacySupport) { - new Event(e).stop(); - } - MUI.focusWindow(windowEl); - if (windowEl.getStyle('top').toInt() < -this.options.shadowBlur) { - windowEl.setStyle('top', -this.options.shadowBlur); - } - }.bind(this)); - } - - if (this.minimizeButtonEl) { - this.minimizeButtonEl.addEvent('click', function(e) { - new Event(e).stop(); - MUI.Dock.minimizeWindow(windowEl); - }.bind(this)); - } - - if (this.maximizeButtonEl) { - this.maximizeButtonEl.addEvent('click', function(e) { - new Event(e).stop(); - if (this.isMaximized) { - MUI.Desktop.restoreWindow(windowEl); - } else { - MUI.Desktop.maximizeWindow(windowEl); - } - }.bind(this)); - } - - if (this.options.collapsible == true){ - // Keep titlebar text from being selected on double click in Safari. - this.titleEl.addEvent('selectstart', function(e) { - e = new Event(e).stop(); - }.bind(this)); - - if (MUI.ieLegacySupport) { - this.titleBarEl.addEvent('mousedown', function(e) { - this.titleEl.setCapture(); - }.bind(this)); - this.titleBarEl.addEvent('mouseup', function(e) { - this.titleEl.releaseCapture(); - }.bind(this)); - } - - this.titleBarEl.addEvent('dblclick', function(e) { - e = new Event(e).stop(); - MUI.collapseToggle(this.windowEl); - }.bind(this)); - } - - }, - /* - - Internal Function: attachDraggable() - Make window draggable. - - */ - attachDraggable: function(){ - var windowEl = this.windowEl; - if (!this.options.draggable) return; - this.windowDrag = new Drag.Move(windowEl, { - handle: this.titleBarEl, - container: this.options.restrict == true ? $(this.options.container) : false, - grid: this.options.draggableGrid, - limit: this.options.draggableLimit, - snap: this.options.draggableSnap, - onStart: function() { - if (this.options.type != 'modal' && this.options.type != 'modal2'){ - MUI.focusWindow(windowEl); - $('windowUnderlay').show(); - } - if (this.iframeEl) { - if (!MUI.ieLegacySupport) { - this.iframeEl.setStyle('visibility', 'hidden'); - } - else { - this.iframeEl.hide(); - } - } - }.bind(this), - onComplete: function() { - if (this.options.type != 'modal' && this.options.type != 'modal2') { - $('windowUnderlay').hide(); - } - if ( this.iframeEl ){ - if (!MUI.ieLegacySupport) { - this.iframeEl.setStyle('visibility', 'visible'); - } - else { - this.iframeEl.show(); - } - } - // Store new position in options. - this.saveValues(); - }.bind(this) - }); - }, - /* - - Internal Function: attachResizable - Make window resizable. - - */ - attachResizable: function(){ - var windowEl = this.windowEl; - if (!this.options.resizable) return; - this.resizable1 = this.windowEl.makeResizable({ - handle: [this.n, this.ne, this.nw], - limit: { - y: [ - function(){ - return this.windowEl.getStyle('top').toInt() + this.windowEl.getStyle('height').toInt() - this.options.resizeLimit.y[1]; - }.bind(this), - function(){ - return this.windowEl.getStyle('top').toInt() + this.windowEl.getStyle('height').toInt() - this.options.resizeLimit.y[0]; - }.bind(this) - ] - }, - modifiers: {x: false, y: 'top'}, - onStart: function(){ - this.resizeOnStart(); - this.coords = this.contentWrapperEl.getCoordinates(); - this.y2 = this.coords.top.toInt() + this.contentWrapperEl.offsetHeight; - }.bind(this), - onDrag: function(){ - this.coords = this.contentWrapperEl.getCoordinates(); - this.contentWrapperEl.setStyle('height', this.y2 - this.coords.top.toInt()); - this.resizeOnDrag(); - }.bind(this), - onComplete: function(){ - this.resizeOnComplete(); - }.bind(this) - }); - - this.resizable2 = this.contentWrapperEl.makeResizable({ - handle: [this.e, this.ne], - limit: { - x: [this.options.resizeLimit.x[0] - (this.options.shadowBlur * 2), this.options.resizeLimit.x[1] - (this.options.shadowBlur * 2) ] - }, - modifiers: {x: 'width', y: false}, - onStart: function(){ - this.resizeOnStart(); - }.bind(this), - onDrag: function(){ - this.resizeOnDrag(); - }.bind(this), - onComplete: function(){ - this.resizeOnComplete(); - }.bind(this) - }); - - this.resizable3 = this.contentWrapperEl.makeResizable({ - container: this.options.restrict == true ? $(this.options.container) : false, - handle: this.se, - limit: { - x: [this.options.resizeLimit.x[0] - (this.options.shadowBlur * 2), this.options.resizeLimit.x[1] - (this.options.shadowBlur * 2) ], - y: [this.options.resizeLimit.y[0] - this.headerFooterShadow, this.options.resizeLimit.y[1] - this.headerFooterShadow] - }, - modifiers: {x: 'width', y: 'height'}, - onStart: function(){ - this.resizeOnStart(); - }.bind(this), - onDrag: function(){ - this.resizeOnDrag(); - }.bind(this), - onComplete: function(){ - this.resizeOnComplete(); - }.bind(this) - }); - - this.resizable4 = this.contentWrapperEl.makeResizable({ - handle: [this.s, this.sw], - limit: { - y: [this.options.resizeLimit.y[0] - this.headerFooterShadow, this.options.resizeLimit.y[1] - this.headerFooterShadow] - }, - modifiers: {x: false, y: 'height'}, - onStart: function(){ - this.resizeOnStart(); - }.bind(this), - onDrag: function(){ - this.resizeOnDrag(); - }.bind(this), - onComplete: function(){ - this.resizeOnComplete(); - }.bind(this) - }); - - this.resizable5 = this.windowEl.makeResizable({ - handle: [this.w, this.sw, this.nw], - limit: { - x: [ - function(){ - return this.windowEl.getStyle('left').toInt() + this.windowEl.getStyle('width').toInt() - this.options.resizeLimit.x[1]; - }.bind(this), - function(){ - return this.windowEl.getStyle('left').toInt() + this.windowEl.getStyle('width').toInt() - this.options.resizeLimit.x[0]; - }.bind(this) - ] - }, - modifiers: {x: 'left', y: false}, - onStart: function(){ - this.resizeOnStart(); - this.coords = this.contentWrapperEl.getCoordinates(); - this.x2 = this.coords.left.toInt() + this.contentWrapperEl.offsetWidth; - }.bind(this), - onDrag: function(){ - this.coords = this.contentWrapperEl.getCoordinates(); - this.contentWrapperEl.setStyle('width', this.x2 - this.coords.left.toInt()); - this.resizeOnDrag(); - }.bind(this), - onComplete: function(){ - this.resizeOnComplete(); - }.bind(this) - }); - - }, - resizeOnStart: function(){ - $('windowUnderlay').show(); - if (this.iframeEl){ - if (!MUI.ieLegacySupport) { - this.iframeEl.setStyle('visibility', 'hidden'); - } - else { - this.iframeEl.hide(); - } - } - }, - resizeOnDrag: function(){ - this.drawWindow(); - this.adjustHandles(); - }, - resizeOnComplete: function(){ - $('windowUnderlay').hide(); - if (this.iframeEl){ - if (!MUI.ieLegacySupport) { - this.iframeEl.setStyle('visibility', 'visible'); - } - else { - this.iframeEl.show(); - // The following hack is to get IE8 RC1 IE8 Standards Mode to properly resize an iframe - // when only the vertical dimension is changed. - this.iframeEl.setStyle('width', '99%'); - this.iframeEl.setStyle('height', this.contentWrapperEl.offsetHeight); - this.iframeEl.setStyle('width', '100%'); - this.iframeEl.setStyle('height', this.contentWrapperEl.offsetHeight); - } - } - - // Resize panels if there are any - if (this.contentWrapperEl.getChildren('.column') != null) { - MUI.rWidth(this.contentWrapperEl); - this.contentWrapperEl.getChildren('.column').each(function(column){ - MUI.panelHeight(column); - }); - } - - this.fireEvent('onResize', this.windowEl); - }, - adjustHandles: function(){ - - var shadowBlur = this.options.shadowBlur; - var shadowBlur2x = shadowBlur * 2; - var shadowOffset = this.options.shadowOffset; - var top = shadowBlur - shadowOffset.y - 1; - var right = shadowBlur + shadowOffset.x - 1; - var bottom = shadowBlur + shadowOffset.y - 1; - var left = shadowBlur - shadowOffset.x - 1; - - var coordinates = this.windowEl.getCoordinates(); - var width = coordinates.width - shadowBlur2x + 2; - var height = coordinates.height - shadowBlur2x + 2; - - this.n.setStyles({ - 'top': top, - 'left': left + 10, - 'width': width - 20 - }); - this.e.setStyles({ - 'top': top + 10, - 'right': right, - 'height': height - 30 - }); - this.s.setStyles({ - 'bottom': bottom, - 'left': left + 10, - 'width': width - 30 - }); - this.w.setStyles({ - 'top': top + 10, - 'left': left, - 'height': height - 20 - }); - this.ne.setStyles({ - 'top': top, - 'right': right - }); - this.se.setStyles({ - 'bottom': bottom, - 'right': right - }); - this.sw.setStyles({ - 'bottom': bottom, - 'left': left - }); - this.nw.setStyles({ - 'top': top, - 'left': left - }); - }, - detachResizable: function(){ - this.resizable1.detach(); - this.resizable2.detach(); - this.resizable3.detach(); - this.resizable4.detach(); - this.resizable5.detach(); - this.windowEl.getElements('.handle').hide(); - }, - reattachResizable: function(){ - this.resizable1.attach(); - this.resizable2.attach(); - this.resizable3.attach(); - this.resizable4.attach(); - this.resizable5.attach(); - this.windowEl.getElements('.handle').show(); - }, - /* - - Internal Function: insertWindowElements - - Arguments: - windowEl - - */ - insertWindowElements: function(){ - - var options = this.options; - var height = options.height; - var width = options.width; - var id = options.id; - - var cache = {}; - - if (Browser.Engine.trident4){ - cache.zIndexFixEl = new Element('iframe', { - 'id': id + '_zIndexFix', - 'class': 'zIndexFix', - 'scrolling': 'no', - 'marginWidth': 0, - 'marginHeight': 0, - 'src': '', - 'styles': { - 'position': 'absolute' // This is set here to make theme transitions smoother - } - }).inject(this.windowEl); - } - - cache.overlayEl = new Element('div', { - 'id': id + '_overlay', - 'class': 'mochaOverlay', - 'styles': { - 'position': 'absolute', // This is set here to make theme transitions smoother - 'top': 0, - 'left': 0 - } - }).inject(this.windowEl); - - cache.titleBarEl = new Element('div', { - 'id': id + '_titleBar', - 'class': 'mochaTitlebar', - 'styles': { - 'cursor': options.draggable ? 'move' : 'default' - } - }).inject(cache.overlayEl, 'top'); - - cache.titleEl = new Element('h3', { - 'id': id + '_title', - 'class': 'mochaTitle' - }).inject(cache.titleBarEl); - - if (options.icon != false){ - cache.titleEl.setStyles({ - 'padding-left': 28, - 'background': 'url(' + options.icon + ') 5px 4px no-repeat' - }); - } - - cache.contentBorderEl = new Element('div', { - 'id': id + '_contentBorder', - 'class': 'mochaContentBorder' - }).inject(cache.overlayEl); - - if (options.toolbar){ - cache.toolbarWrapperEl = new Element('div', { - 'id': id + '_toolbarWrapper', - 'class': 'mochaToolbarWrapper', - 'styles': { 'height': options.toolbarHeight } - }).inject(cache.contentBorderEl, options.toolbarPosition == 'bottom' ? 'after' : 'before'); - - if (options.toolbarPosition == 'bottom') { - cache.toolbarWrapperEl.addClass('bottom'); - } - cache.toolbarEl = new Element('div', { - 'id': id + '_toolbar', - 'class': 'mochaToolbar', - 'styles': { 'height': options.toolbarHeight } - }).inject(cache.toolbarWrapperEl); - } - - if (options.toolbar2){ - cache.toolbar2WrapperEl = new Element('div', { - 'id': id + '_toolbar2Wrapper', - 'class': 'mochaToolbarWrapper', - 'styles': { 'height': options.toolbar2Height } - }).inject(cache.contentBorderEl, options.toolbar2Position == 'bottom' ? 'after' : 'before'); - - if (options.toolbar2Position == 'bottom') { - cache.toolbar2WrapperEl.addClass('bottom'); - } - cache.toolbar2El = new Element('div', { - 'id': id + '_toolbar2', - 'class': 'mochaToolbar', - 'styles': { 'height': options.toolbar2Height } - }).inject(cache.toolbar2WrapperEl); - } - - cache.contentWrapperEl = new Element('div', { - 'id': id + '_contentWrapper', - 'class': 'mochaContentWrapper', - 'styles': { - 'width': width + 'px', - 'height': height + 'px' - } - }).inject(cache.contentBorderEl); - - if (this.options.shape == 'gauge'){ - cache.contentBorderEl.setStyle('borderWidth', 0); - } - - cache.contentEl = new Element('div', { - 'id': id + '_content', - 'class': 'mochaContent' - }).inject(cache.contentWrapperEl); - - if (this.options.useCanvas == true && !MUI.ieLegacySupport) { - cache.canvasEl = new Element('canvas', { - 'id': id + '_canvas', - 'class': 'mochaCanvas', - 'width': 10, - 'height': 10 - }).inject(this.windowEl); - } - - if (this.options.useCanvas == true && MUI.ieLegacySupport) { - cache.canvasEl = new Element('canvas', { - 'id': id + '_canvas', - 'class': 'mochaCanvas', - 'width': 50000, // IE8 excanvas requires these large numbers - 'height': 20000, - 'styles': { - 'position': 'absolute', - 'top': 0, - 'left': 0 - } - }).inject(this.windowEl); - - if (MUI.ieLegacySupport && MUI.ieSupport == 'excanvas'){ - G_vmlCanvasManager.initElement(cache.canvasEl); - cache.canvasEl = this.windowEl.getElement('.mochaCanvas'); - } - } - - cache.controlsEl = new Element('div', { - 'id': id + '_controls', - 'class': 'mochaControls' - }).inject(cache.overlayEl, 'after'); - - if (options.useCanvasControls == true){ - cache.canvasControlsEl = new Element('canvas', { - 'id': id + '_canvasControls', - 'class': 'mochaCanvasControls', - 'width': 14, - 'height': 14 - }).inject(this.windowEl); - - if (MUI.ieLegacySupport && MUI.ieSupport == 'excanvas'){ - G_vmlCanvasManager.initElement(cache.canvasControlsEl); - cache.canvasControlsEl = this.windowEl.getElement('.mochaCanvasControls'); - } - } - - if (options.closable){ - cache.closeButtonEl = new Element('div', { - 'id': id + '_closeButton', - 'class': 'mochaCloseButton mochaWindowButton', - 'title': 'Close' - }).inject(cache.controlsEl); - } - - if (options.maximizable){ - cache.maximizeButtonEl = new Element('div', { - 'id': id + '_maximizeButton', - 'class': 'mochaMaximizeButton mochaWindowButton', - 'title': 'Maximize' - }).inject(cache.controlsEl); - } - - if (options.minimizable){ - cache.minimizeButtonEl = new Element('div', { - 'id': id + '_minimizeButton', - 'class': 'mochaMinimizeButton mochaWindowButton', - 'title': 'Minimize' - }).inject(cache.controlsEl); - } - - if (options.useSpinner == true && options.shape != 'gauge' && options.type != 'notification'){ - cache.spinnerEl = new Element('div', { - 'id': id + '_spinner', - 'class': 'mochaSpinner', - 'width': 16, - 'height': 16 - }).inject(this.windowEl, 'bottom'); - } - - if (this.options.shape == 'gauge'){ - cache.canvasHeaderEl = new Element('canvas', { - 'id': id + '_canvasHeader', - 'class': 'mochaCanvasHeader', - 'width': this.options.width, - 'height': 26 - }).inject(this.windowEl, 'bottom'); - - if (MUI.ieLegacySupport && MUI.ieSupport == 'excanvas'){ - G_vmlCanvasManager.initElement(cache.canvasHeaderEl); - cache.canvasHeaderEl = this.windowEl.getElement('.mochaCanvasHeader'); - } - } - - if ( MUI.ieLegacySupport ){ - cache.overlayEl.setStyle('zIndex', 2); - } - - if (options.resizable){ - cache.n = new Element('div', { - 'id': id + '_resizeHandle_n', - 'class': 'handle', - 'styles': { - 'top': 0, - 'left': 10, - 'cursor': 'n-resize' - } - }).inject(cache.overlayEl, 'after'); - - cache.ne = new Element('div', { - 'id': id + '_resizeHandle_ne', - 'class': 'handle corner', - 'styles': { - 'top': 0, - 'right': 0, - 'cursor': 'ne-resize' - } - }).inject(cache.overlayEl, 'after'); - - cache.e = new Element('div', { - 'id': id + '_resizeHandle_e', - 'class': 'handle', - 'styles': { - 'top': 10, - 'right': 0, - 'cursor': 'e-resize' - } - }).inject(cache.overlayEl, 'after'); - - cache.se = new Element('div', { - 'id': id + '_resizeHandle_se', - 'class': 'handle cornerSE', - 'styles': { - 'bottom': 0, - 'right': 0, - 'cursor': 'se-resize' - } - }).inject(cache.overlayEl, 'after'); - - cache.s = new Element('div', { - 'id': id + '_resizeHandle_s', - 'class': 'handle', - 'styles': { - 'bottom': 0, - 'left': 10, - 'cursor': 's-resize' - } - }).inject(cache.overlayEl, 'after'); - - cache.sw = new Element('div', { - 'id': id + '_resizeHandle_sw', - 'class': 'handle corner', - 'styles': { - 'bottom': 0, - 'left': 0, - 'cursor': 'sw-resize' - } - }).inject(cache.overlayEl, 'after'); - - cache.w = new Element('div', { - 'id': id + '_resizeHandle_w', - 'class': 'handle', - 'styles': { - 'top': 10, - 'left': 0, - 'cursor': 'w-resize' - } - }).inject(cache.overlayEl, 'after'); - - cache.nw = new Element('div', { - 'id': id + '_resizeHandle_nw', - 'class': 'handle corner', - 'styles': { - 'top': 0, - 'left': 0, - 'cursor': 'nw-resize' - } - }).inject(cache.overlayEl, 'after'); - } - $extend(this, cache); - - }, - /* - - Convert CSS colors to Canvas colors. - - */ - setColors: function(){ - - if (this.options.useCanvas == true) { - - // Set TitlebarColor - var pattern = /\?(.*?)\)/; - if (this.titleBarEl.getStyle('backgroundImage') != 'none'){ - var gradient = this.titleBarEl.getStyle('backgroundImage'); - gradient = gradient.match(pattern)[1]; - gradient = gradient.parseQueryString(); - var gradientFrom = gradient.from; - var gradientTo = gradient.to.replace(/\"/, ''); // IE7 was adding a quotation mark in. No idea why. - - this.options.headerStartColor = new Color(gradientFrom); - this.options.headerStopColor = new Color(gradientTo); - this.titleBarEl.addClass('replaced'); - } - else if (this.titleBarEl.getStyle('background-color') !== '' && this.titleBarEl.getStyle('background-color') !== 'transparent') { - this.options.headerStartColor = new Color(this.titleBarEl.getStyle('background-color')).mix('#fff', 20); - this.options.headerStopColor = new Color(this.titleBarEl.getStyle('background-color')).mix('#000', 20); - this.titleBarEl.addClass('replaced'); - } - - // Set BodyBGColor - if (this.windowEl.getStyle('background-color') !== '' && this.windowEl.getStyle('background-color') !== 'transparent') { - this.options.bodyBgColor = new Color(this.windowEl.getStyle('background-color')); - this.windowEl.addClass('replaced'); - } - - // Set resizableColor, the color of the SE corner resize handle - if (this.options.resizable && this.se.getStyle('background-color') !== '' && this.se.getStyle('background-color') !== 'transparent') { - this.options.resizableColor = new Color(this.se.getStyle('background-color')); - this.se.addClass('replaced'); - } - - } - - if (this.options.useCanvasControls == true){ - - if (this.minimizeButtonEl){ - - // Set Minimize Button Foreground Color - if (this.minimizeButtonEl.getStyle('color') !== '' && this.minimizeButtonEl.getStyle('color') !== 'transparent') { - this.options.minimizeColor = new Color(this.minimizeButtonEl.getStyle('color')); - } - - // Set Minimize Button Background Color - if (this.minimizeButtonEl.getStyle('background-color') !== '' && this.minimizeButtonEl.getStyle('background-color') !== 'transparent') { - this.options.minimizeBgColor = new Color(this.minimizeButtonEl.getStyle('background-color')); - this.minimizeButtonEl.addClass('replaced'); - } - - } - - if (this.maximizeButtonEl){ - - // Set Maximize Button Foreground Color - if (this.maximizeButtonEl.getStyle('color') !== '' && this.maximizeButtonEl.getStyle('color') !== 'transparent') { - this.options.maximizeColor = new Color(this.maximizeButtonEl.getStyle('color')); - } - - // Set Maximize Button Background Color - if (this.maximizeButtonEl.getStyle('background-color') !== '' && this.maximizeButtonEl.getStyle('background-color') !== 'transparent') { - this.options.maximizeBgColor = new Color(this.maximizeButtonEl.getStyle('background-color')); - this.maximizeButtonEl.addClass('replaced'); - } - - } - - if (this.closeButtonEl){ - - // Set Close Button Foreground Color - if (this.closeButtonEl.getStyle('color') !== '' && this.closeButtonEl.getStyle('color') !== 'transparent') { - this.options.closeColor = new Color(this.closeButtonEl.getStyle('color')); - } - - // Set Close Button Background Color - if (this.closeButtonEl.getStyle('background-color') !== '' && this.closeButtonEl.getStyle('background-color') !== 'transparent') { - this.options.closeBgColor = new Color(this.closeButtonEl.getStyle('background-color')); - this.closeButtonEl.addClass('replaced'); - } - - } - } - }, - /* - - Internal function: drawWindow - This is where we create the canvas GUI - - Arguments: - windowEl: the $(window) - shadows: (boolean) false will draw a window without shadows - - */ - drawWindow: function(shadows) { - - if (this.drawingWindow == true) return; - this.drawingWindow = true; - - if (this.isCollapsed){ - this.drawWindowCollapsed(shadows); - return; - } - - var windowEl = this.windowEl; - - var options = this.options; - var shadowBlur = options.shadowBlur; - var shadowBlur2x = shadowBlur * 2; - var shadowOffset = this.options.shadowOffset; - - this.overlayEl.setStyles({ - 'width': this.contentWrapperEl.offsetWidth - }); - - // Resize iframe when window is resized - if (this.iframeEl) { - this.iframeEl.setStyle('height', this.contentWrapperEl.offsetHeight); - } - - var borderHeight = this.contentBorderEl.getStyle('margin-top').toInt() + this.contentBorderEl.getStyle('margin-bottom').toInt(); - var toolbarHeight = this.toolbarWrapperEl ? this.toolbarWrapperEl.getStyle('height').toInt() + this.toolbarWrapperEl.getStyle('margin-top').toInt() : 0; - var toolbar2Height = this.toolbar2WrapperEl ? this.toolbar2WrapperEl.getStyle('height').toInt() + this.toolbar2WrapperEl.getStyle('margin-top').toInt() : 0; - - this.headerFooterShadow = options.headerHeight + options.footerHeight + shadowBlur2x; - var height = this.contentWrapperEl.getStyle('height').toInt() + this.headerFooterShadow + toolbarHeight + toolbar2Height + borderHeight; - var width = this.contentWrapperEl.getStyle('width').toInt() + shadowBlur2x; - this.windowEl.setStyles({ - 'height': height, - 'width': width - }); - - this.overlayEl.setStyles({ - 'height': height, - 'top': shadowBlur - shadowOffset.y, - 'left': shadowBlur - shadowOffset.x - }); - - if (this.options.useCanvas == true) { - if (MUI.ieLegacySupport) { - this.canvasEl.height = 20000; - this.canvasEl.width = 50000; - } - this.canvasEl.height = height; - this.canvasEl.width = width; - } - - // Part of the fix for IE6 select z-index bug - if (Browser.Engine.trident4){ - this.zIndexFixEl.setStyles({ - 'width': width, - 'height': height - }) - } - - this.titleBarEl.setStyles({ - 'width': width - shadowBlur2x, - 'height': options.headerHeight - }); - - // Make sure loading icon is placed correctly. - if (options.useSpinner == true && options.shape != 'gauge' && options.type != 'notification'){ - this.spinnerEl.setStyles({ - 'left': shadowBlur - shadowOffset.x + 3, - 'bottom': shadowBlur + shadowOffset.y + 4 - }); - } - - if (this.options.useCanvas != false) { - - // Draw Window - var ctx = this.canvasEl.getContext('2d'); - ctx.clearRect(0, 0, width, height); - - switch (options.shape) { - case 'box': - this.drawBox(ctx, width, height, shadowBlur, shadowOffset, shadows); - break; - case 'gauge': - this.drawGauge(ctx, width, height, shadowBlur, shadowOffset, shadows); - break; - } - - if (options.resizable){ - MUI.triangle( - ctx, - width - (shadowBlur + shadowOffset.x + 17), - height - (shadowBlur + shadowOffset.y + 18), - 11, - 11, - options.resizableColor, - 1.0 - ); - } - - // Invisible dummy object. The last element drawn is not rendered consistently while resizing in IE6 and IE7 - if (MUI.ieLegacySupport){ - MUI.triangle(ctx, 0, 0, 10, 10, options.resizableColor, 0); - } - } - - if (options.type != 'notification' && options.useCanvasControls == true){ - this.drawControls(width, height, shadows); - } - - // Resize panels if there are any - if (MUI.Desktop && this.contentWrapperEl.getChildren('.column').length != 0) { - MUI.rWidth(this.contentWrapperEl); - this.contentWrapperEl.getChildren('.column').each(function(column){ - MUI.panelHeight(column); - }); - } - - this.drawingWindow = false; - return this; - - }, - drawWindowCollapsed: function(shadows) { - - var windowEl = this.windowEl; - - var options = this.options; - var shadowBlur = options.shadowBlur; - var shadowBlur2x = shadowBlur * 2; - var shadowOffset = options.shadowOffset; - - var headerShadow = options.headerHeight + shadowBlur2x + 2; - var height = headerShadow; - var width = this.contentWrapperEl.getStyle('width').toInt() + shadowBlur2x; - this.windowEl.setStyle('height', height); - - this.overlayEl.setStyles({ - 'height': height, - 'top': shadowBlur - shadowOffset.y, - 'left': shadowBlur - shadowOffset.x - }); - - // Part of the fix for IE6 select z-index bug - if (Browser.Engine.trident4){ - this.zIndexFixEl.setStyles({ - 'width': width, - 'height': height - }); - } - - // Set width - this.windowEl.setStyle('width', width); - this.overlayEl.setStyle('width', width); - this.titleBarEl.setStyles({ - 'width': width - shadowBlur2x, - 'height': options.headerHeight - }); - - // Draw Window - if (this.options.useCanvas != false) { - this.canvasEl.height = height; - this.canvasEl.width = width; - - var ctx = this.canvasEl.getContext('2d'); - ctx.clearRect(0, 0, width, height); - - this.drawBoxCollapsed(ctx, width, height, shadowBlur, shadowOffset, shadows); - if (options.useCanvasControls == true) { - this.drawControls(width, height, shadows); - } - - // Invisible dummy object. The last element drawn is not rendered consistently while resizing in IE6 and IE7 - if (MUI.ieLegacySupport){ - MUI.triangle(ctx, 0, 0, 10, 10, options.resizableColor, 0); - } - } - - this.drawingWindow = false; - return this; - - }, - drawControls : function(width, height, shadows){ - var options = this.options; - var shadowBlur = options.shadowBlur; - var shadowOffset = options.shadowOffset; - var controlsOffset = options.controlsOffset; - - // Make sure controls are placed correctly. - this.controlsEl.setStyles({ - 'right': shadowBlur + shadowOffset.x + controlsOffset.right, - 'top': shadowBlur - shadowOffset.y + controlsOffset.top - }); - - this.canvasControlsEl.setStyles({ - 'right': shadowBlur + shadowOffset.x + controlsOffset.right, - 'top': shadowBlur - shadowOffset.y + controlsOffset.top - }); - - // Calculate X position for controlbuttons - //var mochaControlsWidth = 52; - this.closebuttonX = options.closable ? this.mochaControlsWidth - 7 : this.mochaControlsWidth + 12; - this.maximizebuttonX = this.closebuttonX - (options.maximizable ? 19 : 0); - this.minimizebuttonX = this.maximizebuttonX - (options.minimizable ? 19 : 0); - - var ctx2 = this.canvasControlsEl.getContext('2d'); - ctx2.clearRect(0, 0, 100, 100); - - if (this.options.closable){ - this.closebutton( - ctx2, - this.closebuttonX, - 7, - options.closeBgColor, - 1.0, - options.closeColor, - 1.0 - ); - } - if (this.options.maximizable){ - this.maximizebutton( - ctx2, - this.maximizebuttonX, - 7, - options.maximizeBgColor, - 1.0, - options.maximizeColor, - 1.0 - ); - } - if (this.options.minimizable){ - this.minimizebutton( - ctx2, - this.minimizebuttonX, - 7, - options.minimizeBgColor, - 1.0, - options.minimizeColor, - 1.0 - ); - } - // Invisible dummy object. The last element drawn is not rendered consistently while resizing in IE6 and IE7 - if (MUI.ieLegacySupport){ - MUI.circle(ctx2, 0, 0, 3, this.options.resizableColor, 0); - } - - }, - drawBox: function(ctx, width, height, shadowBlur, shadowOffset, shadows){ - - var options = this.options; - var shadowBlur2x = shadowBlur * 2; - var cornerRadius = this.options.cornerRadius; - - // This is the drop shadow. It is created onion style. - if ( shadows != false ) { - for (var x = 0; x <= shadowBlur; x++){ - MUI.roundedRect( - ctx, - shadowOffset.x + x, - shadowOffset.y + x, - width - (x * 2) - shadowOffset.x, - height - (x * 2) - shadowOffset.y, - cornerRadius + (shadowBlur - x), - [0, 0, 0], - x == shadowBlur ? .29 : .065 + (x * .01) - ); - } - } - // Window body. - this.bodyRoundedRect( - ctx, // context - shadowBlur - shadowOffset.x, // x - shadowBlur - shadowOffset.y, // y - width - shadowBlur2x, // width - height - shadowBlur2x, // height - cornerRadius, // corner radius - options.bodyBgColor // Footer color - ); - - if (this.options.type != 'notification'){ - // Window header. - this.topRoundedRect( - ctx, // context - shadowBlur - shadowOffset.x, // x - shadowBlur - shadowOffset.y, // y - width - shadowBlur2x, // width - options.headerHeight, // height - cornerRadius, // corner radius - options.headerStartColor, // Header gradient's top color - options.headerStopColor // Header gradient's bottom color - ); - } - }, - drawBoxCollapsed: function(ctx, width, height, shadowBlur, shadowOffset, shadows){ - - var options = this.options; - var shadowBlur2x = shadowBlur * 2; - var cornerRadius = options.cornerRadius; - - // This is the drop shadow. It is created onion style. - if ( shadows != false ){ - for (var x = 0; x <= shadowBlur; x++){ - MUI.roundedRect( - ctx, - shadowOffset.x + x, - shadowOffset.y + x, - width - (x * 2) - shadowOffset.x, - height - (x * 2) - shadowOffset.y, - cornerRadius + (shadowBlur - x), - [0, 0, 0], - x == shadowBlur ? .3 : .06 + (x * .01) - ); - } - } - - // Window header - this.topRoundedRect2( - ctx, // context - shadowBlur - shadowOffset.x, // x - shadowBlur - shadowOffset.y, // y - width - shadowBlur2x, // width - options.headerHeight + 2, // height - cornerRadius, // corner radius - options.headerStartColor, // Header gradient's top color - options.headerStopColor // Header gradient's bottom color - ); - - }, - drawGauge: function(ctx, width, height, shadowBlur, shadowOffset, shadows){ - var options = this.options; - var radius = (width * .5) - (shadowBlur) + 16; - if (shadows != false) { - for (var x = 0; x <= shadowBlur; x++){ - MUI.circle( - ctx, - width * .5 + shadowOffset.x, - (height + options.headerHeight) * .5 + shadowOffset.x, - (width *.5) - (x * 2) - shadowOffset.x, - [0, 0, 0], - x == shadowBlur ? .75 : .075 + (x * .04) - ); - } - } - MUI.circle( - ctx, - width * .5 - shadowOffset.x, - (height + options.headerHeight) * .5 - shadowOffset.y, - (width *.5) - shadowBlur, - options.bodyBgColor, - 1 - ); - - // Draw gauge header - this.canvasHeaderEl.setStyles({ - 'top': shadowBlur - shadowOffset.y, - 'left': shadowBlur - shadowOffset.x - }); - var ctx = this.canvasHeaderEl.getContext('2d'); - ctx.clearRect(0, 0, width, 100); - ctx.beginPath(); - ctx.lineWidth = 24; - ctx.lineCap = 'round'; - ctx.moveTo(13, 13); - ctx.lineTo(width - (shadowBlur*2) - 13, 13); - ctx.strokeStyle = 'rgba(0, 0, 0, .65)'; - ctx.stroke(); - }, - bodyRoundedRect: function(ctx, x, y, width, height, radius, rgb){ - ctx.fillStyle = 'rgba(' + rgb.join(',') + ', 1)'; - ctx.beginPath(); - ctx.moveTo(x, y + radius); - ctx.lineTo(x, y + height - radius); - ctx.quadraticCurveTo(x, y + height, x + radius, y + height); - ctx.lineTo(x + width - radius, y + height); - ctx.quadraticCurveTo(x + width, y + height, x + width, y + height - radius); - ctx.lineTo(x + width, y + radius); - ctx.quadraticCurveTo(x + width, y, x + width - radius, y); - ctx.lineTo(x + radius, y); - ctx.quadraticCurveTo(x, y, x, y + radius); - ctx.fill(); - - }, - topRoundedRect: function(ctx, x, y, width, height, radius, headerStartColor, headerStopColor){ - var lingrad = ctx.createLinearGradient(0, 0, 0, height); - lingrad.addColorStop(0, 'rgb(' + headerStartColor.join(',') + ')'); - lingrad.addColorStop(1, 'rgb(' + headerStopColor.join(',') + ')'); - ctx.fillStyle = lingrad; - ctx.beginPath(); - ctx.moveTo(x, y); - ctx.lineTo(x, y + height); - ctx.lineTo(x + width, y + height); - ctx.lineTo(x + width, y + radius); - ctx.quadraticCurveTo(x + width, y, x + width - radius, y); - ctx.lineTo(x + radius, y); - ctx.quadraticCurveTo(x, y, x, y + radius); - ctx.fill(); - - }, - topRoundedRect2: function(ctx, x, y, width, height, radius, headerStartColor, headerStopColor){ - // Chrome is having trouble rendering the LinearGradient in this particular case - if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1) { - ctx.fillStyle = 'rgba(' + headerStopColor.join(',') + ', 1)'; - } - else { - var lingrad = ctx.createLinearGradient(0, this.options.shadowBlur - 1, 0, height + this.options.shadowBlur + 3); - lingrad.addColorStop(0, 'rgb(' + headerStartColor.join(',') + ')'); - lingrad.addColorStop(1, 'rgb(' + headerStopColor.join(',') + ')'); - ctx.fillStyle = lingrad; - } - ctx.beginPath(); - ctx.moveTo(x, y + radius); - ctx.lineTo(x, y + height - radius); - ctx.quadraticCurveTo(x, y + height, x + radius, y + height); - ctx.lineTo(x + width - radius, y + height); - ctx.quadraticCurveTo(x + width, y + height, x + width, y + height - radius); - ctx.lineTo(x + width, y + radius); - ctx.quadraticCurveTo(x + width, y, x + width - radius, y); - ctx.lineTo(x + radius, y); - ctx.quadraticCurveTo(x, y, x, y + radius); - ctx.fill(); - }, - maximizebutton: function(ctx, x, y, rgbBg, aBg, rgb, a){ - // Circle - ctx.beginPath(); - ctx.arc(x, y, 7, 0, Math.PI*2, true); - ctx.fillStyle = 'rgba(' + rgbBg.join(',') + ',' + aBg + ')'; - ctx.fill(); - // X sign - ctx.strokeStyle = 'rgba(' + rgb.join(',') + ',' + a + ')'; - ctx.lineWidth = 2; - ctx.beginPath(); - ctx.moveTo(x, y - 3.5); - ctx.lineTo(x, y + 3.5); - ctx.moveTo(x - 3.5, y); - ctx.lineTo(x + 3.5, y); - ctx.stroke(); - }, - closebutton: function(ctx, x, y, rgbBg, aBg, rgb, a){ - // Circle - ctx.beginPath(); - ctx.arc(x, y, 7, 0, Math.PI*2, true); - ctx.fillStyle = 'rgba(' + rgbBg.join(',') + ',' + aBg + ')'; - ctx.fill(); - // Plus sign - ctx.strokeStyle = 'rgba(' + rgb.join(',') + ',' + a + ')'; - ctx.lineWidth = 2; - ctx.beginPath(); - ctx.moveTo(x - 3, y - 3); - ctx.lineTo(x + 3, y + 3); - ctx.moveTo(x + 3, y - 3); - ctx.lineTo(x - 3, y + 3); - ctx.stroke(); - }, - minimizebutton: function(ctx, x, y, rgbBg, aBg, rgb, a){ - // Circle - ctx.beginPath(); - ctx.arc(x,y,7,0,Math.PI*2,true); - ctx.fillStyle = 'rgba(' + rgbBg.join(',') + ',' + aBg + ')'; - ctx.fill(); - // Minus sign - ctx.strokeStyle = 'rgba(' + rgb.join(',') + ',' + a + ')'; - ctx.lineWidth = 2; - ctx.beginPath(); - ctx.moveTo(x - 3.5, y); - ctx.lineTo(x + 3.5, y); - ctx.stroke(); - }, - setMochaControlsWidth: function(){ - this.mochaControlsWidth = 0; - var options = this.options; - if (options.minimizable){ - this.mochaControlsWidth += (this.minimizeButtonEl.getStyle('margin-left').toInt() + this.minimizeButtonEl.getStyle('width').toInt()); - } - if (options.maximizable){ - this.mochaControlsWidth += (this.maximizeButtonEl.getStyle('margin-left').toInt() + this.maximizeButtonEl.getStyle('width').toInt()); - } - if (options.closable){ - this.mochaControlsWidth += (this.closeButtonEl.getStyle('margin-left').toInt() + this.closeButtonEl.getStyle('width').toInt()); - } - this.controlsEl.setStyle('width', this.mochaControlsWidth); - if (options.useCanvasControls == true){ - this.canvasControlsEl.setProperty('width', this.mochaControlsWidth); - } - }, - /* - - Function: hideSpinner - Hides the spinner. - - Example: - (start code) - $('myWindow').retrieve('instance').hideSpinner(); - (end) - - */ - hideSpinner: function() { - if (this.spinnerEl) this.spinnerEl.hide(); - return this; - }, - /* - - Function: showSpinner - Shows the spinner. - - Example: - (start code) - $('myWindow').retrieve('instance').showSpinner(); - (end) - - */ - showSpinner: function(){ - if (this.spinnerEl) this.spinnerEl.show(); - return this; - }, - /* - - Function: close - Closes the window. This is an alternative to using MUI.Core.closeWindow(). - - Example: - (start code) - $('myWindow').retrieve('instance').close(); - (end) - - */ - close: function( ) { - if (!this.isClosing) MUI.closeWindow(this.windowEl); - return this; - }, - /* - - Function: minimize - Minimizes the window. - - Example: - (start code) - $('myWindow').retrieve('instance').minimize(); - (end) - - */ - minimize: function( ){ - MUI.Dock.minimizeWindow(this.windowEl); - return this; - }, - /* - - Function: maximize - Maximizes the window. - - Example: - (start code) - $('myWindow').retrieve('instance').maximize(); - (end) - - */ - maximize: function( ) { - if (this.isMinimized){ - MUI.Dock.restoreMinimized(this.windowEl); - } - MUI.Desktop.maximizeWindow(this.windowEl); - return this; - }, - /* - - Function: restore - Restores a minimized/maximized window to its original size. - - Example: - (start code) - $('myWindow').retrieve('instance').restore(); - (end) - - */ - restore: function() { - if ( this.isMinimized ) - MUI.Dock.restoreMinimized(this.windowEl); - else if ( this.isMaximized ) - MUI.Desktop.restoreWindow(this.windowEl); - return this; - }, - /* - - Function: resize - Resize a window. - - Notes: - If Advanced Effects are on the resize is animated. If centered is set to true the window remains centered as it resizes. - - Example: - (start code) - $('myWindow').retrieve('instance').resize({width:500,height:300,centered:true}); - (end) - - */ - resize: function(options){ - MUI.resizeWindow(this.windowEl, options); - return this; - }, - /* - - Function: center - Center a window. - - Example: - (start code) - $('myWindow').retrieve('instance').center(); - (end) - - */ - center: function() { - MUI.centerWindow(this.windowEl); - return this; - }, - - hide: function(){ - this.windowEl.setStyle('display', 'none'); - return this; - }, - - show: function(){ - this.windowEl.setStyle('display', 'block'); - return this; - } - -}); - -MUI.extend({ - /* - - Function: closeWindow - Closes a window. - - Syntax: - (start code) - MUI.closeWindow(); - (end) - - Arguments: - windowEl - the ID of the window to be closed - - Returns: - true - the window was closed - false - the window was not closed - - */ - closeWindow: function(windowEl){ - - var instance = windowEl.retrieve('instance'); - - // Does window exist and is not already in process of closing ? - if (windowEl != $(windowEl) || instance.isClosing) return; - - instance.isClosing = true; - instance.fireEvent('onClose', windowEl); - - if (instance.options.storeOnClose){ - this.storeOnClose(instance, windowEl); - return; - } - if (instance.check) instance.check.destroy(); - - if ((instance.options.type == 'modal' || instance.options.type == 'modal2') && Browser.Engine.trident4){ - $('modalFix').hide(); - } - - if (MUI.options.advancedEffects == false){ - if (instance.options.type == 'modal' || instance.options.type == 'modal2'){ - $('modalOverlay').setStyle('opacity', 0); - } - MUI.closingJobs(windowEl); - return true; - } - else { - // Redraws IE windows without shadows since IE messes up canvas alpha when you change element opacity - if (MUI.ieLegacySupport) instance.drawWindow(false); - if (instance.options.type == 'modal' || instance.options.type == 'modal2'){ - MUI.Modal.modalOverlayCloseMorph.start({ - 'opacity': 0 - }); - } - var closeMorph = new Fx.Morph(windowEl, { - duration: 120, - onComplete: function(){ - MUI.closingJobs(windowEl); - return true; - }.bind(this) - }); - closeMorph.start({ - 'opacity': .4 - }); - } - - }, - closingJobs: function(windowEl){ - - var instances = MUI.Windows.instances; - var instance = instances.get(windowEl.id); - windowEl.setStyle('visibility', 'hidden'); - // Destroy throws an error in IE8 - if (MUI.ieLegacySupport) { - windowEl.dispose(); - } - else { - windowEl.destroy(); - } - instance.fireEvent('onCloseComplete'); - - if (instance.options.type != 'notification'){ - var newFocus = this.getWindowWithHighestZindex(); - this.focusWindow(newFocus); - } - - instances.erase(instance.options.id); - if (this.loadingWorkspace == true) { - this.windowUnload(); - } - - if (MUI.Dock && $(MUI.options.dock) && instance.options.type == 'window') { - var currentButton = $(instance.options.id + '_dockTab'); - if (currentButton != null) { - MUI.Dock.dockSortables.removeItems(currentButton).destroy(); - } - // Need to resize everything in case the dock becomes smaller when a tab is removed - MUI.Desktop.setDesktopSize(); - } - }, - storeOnClose: function(instance, windowEl){ - - if (instance.check) instance.check.hide(); - - windowEl.setStyles({ - zIndex: -1 - }); - windowEl.addClass('windowClosed'); - windowEl.removeClass('mocha'); - - if (MUI.Dock && $(MUI.options.dock) && instance.options.type == 'window') { - var currentButton = $(instance.options.id + '_dockTab'); - if (currentButton != null) { - currentButton.hide(); - } - MUI.Desktop.setDesktopSize(); - } - - instance.fireEvent('onCloseComplete'); - - if (instance.options.type != 'notification'){ - var newFocus = this.getWindowWithHighestZindex(); - this.focusWindow(newFocus); - } - - instance.isClosing = false; - - }, - /* - - Function: closeAll - Close all open windows. - - */ - closeAll: function() { - $$('.mocha').each(function(windowEl){ - this.closeWindow(windowEl); - }.bind(this)); - }, - /* - - Function: collapseToggle - Collapses an expanded window. Expands a collapsed window. - - */ - collapseToggle: function(windowEl){ - var instance = windowEl.retrieve('instance'); - var handles = windowEl.getElements('.handle'); - if (instance.isMaximized == true) return; - if (instance.isCollapsed == false) { - instance.isCollapsed = true; - handles.hide(); - if ( instance.iframeEl ) { - instance.iframeEl.setStyle('visibility', 'hidden'); - } - instance.contentBorderEl.setStyles({ - visibility: 'hidden', - position: 'absolute', - top: -10000, - left: -10000 - }); - if(instance.toolbarWrapperEl){ - instance.toolbarWrapperEl.setStyles({ - visibility: 'hidden', - position: 'absolute', - top: -10000, - left: -10000 - }); - } - instance.drawWindowCollapsed(); - } - else { - instance.isCollapsed = false; - instance.drawWindow(); - instance.contentBorderEl.setStyles({ - visibility: 'visible', - position: null, - top: null, - left: null - }); - if(instance.toolbarWrapperEl){ - instance.toolbarWrapperEl.setStyles({ - visibility: 'visible', - position: null, - top: null, - left: null - }); - } - if ( instance.iframeEl ) { - instance.iframeEl.setStyle('visibility', 'visible'); - } - handles.show(); - } - }, - /* - - Function: toggleWindowVisibility - Toggle window visibility with Ctrl-Alt-Q. - - */ - toggleWindowVisibility: function(){ - MUI.Windows.instances.each(function(instance){ - if (instance.options.type == 'modal' || instance.options.type == 'modal2' || instance.isMinimized == true) return; - var id = $(instance.options.id); - if (id.getStyle('visibility') == 'visible'){ - if (instance.iframe){ - instance.iframeEl.setStyle('visibility', 'hidden'); - } - if (instance.toolbarEl){ - instance.toolbarWrapperEl.setStyle('visibility', 'hidden'); - } - instance.contentBorderEl.setStyle('visibility', 'hidden'); - id.setStyle('visibility', 'hidden'); - MUI.Windows.windowsVisible = false; - } - else { - id.setStyle('visibility', 'visible'); - instance.contentBorderEl.setStyle('visibility', 'visible'); - if (instance.iframe){ - instance.iframeEl.setStyle('visibility', 'visible'); - } - if (instance.toolbarEl){ - instance.toolbarWrapperEl.setStyle('visibility', 'visible'); - } - MUI.Windows.windowsVisible = true; - } - }.bind(this)); - - }, - focusWindow: function(windowEl, fireEvent){ - - // This is used with blurAll - MUI.Windows.focusingWindow = true; - var windowClicked = function(){ - MUI.Windows.focusingWindow = false; - }; - windowClicked.delay(170, this); - - // Only focus when needed - if ($$('.mocha').length == 0) return; - if (windowEl != $(windowEl) || windowEl.hasClass('isFocused')) return; - - var instances = MUI.Windows.instances; - var instance = instances.get(windowEl.id); - - if (instance.options.type == 'notification'){ - windowEl.setStyle('zIndex', 11001); - return; - }; - - MUI.Windows.indexLevel += 2; - windowEl.setStyle('zIndex', MUI.Windows.indexLevel); - - // Used when dragging and resizing windows - $('windowUnderlay').setStyle('zIndex', MUI.Windows.indexLevel - 1).inject($(windowEl),'after'); - - // Fire onBlur for the window that lost focus. - instances.each(function(instance){ - if (instance.windowEl.hasClass('isFocused')){ - instance.fireEvent('onBlur', instance.windowEl); - } - instance.windowEl.removeClass('isFocused'); - }); - - if (MUI.Dock && $(MUI.options.dock) && instance.options.type == 'window') { - MUI.Dock.makeActiveTab(); - } - windowEl.addClass('isFocused'); - - if (fireEvent != false){ - instance.fireEvent('onFocus', windowEl); - } - - }, - getWindowWithHighestZindex: function(){ - this.highestZindex = 0; - $$('.mocha').each(function(element){ - this.zIndex = element.getStyle('zIndex'); - if (this.zIndex >= this.highestZindex) { - this.highestZindex = this.zIndex; - } - }.bind(this)); - $$('.mocha').each(function(element){ - if (element.getStyle('zIndex') == this.highestZindex) { - this.windowWithHighestZindex = element; - } - }.bind(this)); - return this.windowWithHighestZindex; - }, - blurAll: function(){ - if (MUI.Windows.focusingWindow == false) { - $$('.mocha').each(function(windowEl){ - var instance = windowEl.retrieve('instance'); - if (instance.options.type != 'modal' && instance.options.type != 'modal2'){ - windowEl.removeClass('isFocused'); - } - }); - $$('.dockTab').removeClass('activeDockTab'); - } - }, - centerWindow: function(windowEl){ - - if(!windowEl){ - MUI.Windows.instances.each(function(instance){ - if (instance.windowEl.hasClass('isFocused')){ - windowEl = instance.windowEl; - } - }); - } - - var instance = windowEl.retrieve('instance'); - var options = instance.options; - var dimensions = options.container.getCoordinates(); - - var windowPosTop = window.getScroll().y + (window.getSize().y * .5) - (windowEl.offsetHeight * .5); - if (windowPosTop < -instance.options.shadowBlur){ - windowPosTop = -instance.options.shadowBlur; - } - var windowPosLeft = (dimensions.width * .5) - (windowEl.offsetWidth * .5); - if (windowPosLeft < -instance.options.shadowBlur){ - windowPosLeft = -instance.options.shadowBlur; - } - if (MUI.options.advancedEffects == true){ - instance.morph.start({ - 'top': windowPosTop, - 'left': windowPosLeft - }); - } - else { - windowEl.setStyles({ - 'top': windowPosTop, - 'left': windowPosLeft - }); - } - }, - resizeWindow: function(windowEl, options){ - var instance = windowEl.retrieve('instance'); - - $extend({ - width: null, - height: null, - top: null, - left: null, - centered: true - }, options); - - var oldWidth = windowEl.getStyle('width').toInt(); - var oldHeight = windowEl.getStyle('height').toInt(); - var oldTop = windowEl.getStyle('top').toInt(); - var oldLeft = windowEl.getStyle('left').toInt(); - - if (options.centered){ - var top = options.top || oldTop - ((options.height - oldHeight) * .5); - var left = options.left || oldLeft - ((options.width - oldWidth) * .5); - } - else { - var top = options.top || oldTop; - var left = options.left || oldLeft; - } - - if (MUI.options.advancedEffects == false){ - windowEl.setStyles({ - 'top': top, - 'left': left - }); - instance.contentWrapperEl.setStyles({ - 'height': options.height, - 'width': options.width - }); - instance.drawWindow(); - // Show iframe - if (instance.iframeEl){ - if (!MUI.ieLegacySupport) { - instance.iframeEl.setStyle('visibility', 'visible'); - } - else { - instance.iframeEl.show(); - } - } - } - else { - windowEl.retrieve('resizeMorph').start({ - '0': { 'height': options.height, - 'width': options.width - }, - '1': { 'top': top, - 'left': left - } - }); - } - return instance; - }, - /* - - Internal Function: dynamicResize - Use with a timer to resize a window as the window's content size changes, such as with an accordion. - - */ - dynamicResize: function(windowEl){ - var instance = windowEl.retrieve('instance'); - var contentWrapperEl = instance.contentWrapperEl; - var contentEl = instance.contentEl; - - contentWrapperEl.setStyles({ - 'height': contentEl.offsetHeight, - 'width': contentEl.offsetWidth - }); - instance.drawWindow(); - } -}); - -// Toggle window visibility with Ctrl-Alt-Q -document.addEvent('keydown', function(event){ - if (event.key == 'q' && event.control && event.alt) { - MUI.toggleWindowVisibility(); - } -}); -/* - -Script: Modal.js - Create modal dialog windows. - -Copyright: - Copyright (c) 2007-2009 Greg Houston, . - -License: - MIT-style license. - -Requires: - Core.js, Window.js - -See Also: - - -*/ - -MUI.files[MUI.path.source + 'Window/Modal.js'] = 'loaded'; - -MUI.Modal = new Class({ - - Extends: MUI.Window, - - options: { - type: 'modal' - }, - - initialize: function(options){ - - if (!$('modalOverlay')){ - this.modalInitialize(); - - window.addEvent('resize', function(){ - this.setModalSize(); - }.bind(this)); - } - this.parent(options); - - }, - modalInitialize: function(){ - var modalOverlay = new Element('div', { - 'id': 'modalOverlay', - 'styles': { - 'height': document.getCoordinates().height, - 'opacity': .6 - } - }).inject(document.body); - - modalOverlay.setStyles({ - 'position': Browser.Engine.trident4 ? 'absolute' : 'fixed' - }); - - modalOverlay.addEvent('click', function(e){ - var instance = MUI.Windows.instances.get(MUI.currentModal.id); - if (instance.options.modalOverlayClose == true) { - MUI.closeWindow(MUI.currentModal); - } - }); - - if (Browser.Engine.trident4){ - var modalFix = new Element('iframe', { - 'id': 'modalFix', - 'scrolling': 'no', - 'marginWidth': 0, - 'marginHeight': 0, - 'src': '', - 'styles': { - 'height': document.getCoordinates().height - } - }).inject(document.body); - } - - MUI.Modal.modalOverlayOpenMorph = new Fx.Morph($('modalOverlay'), { - 'duration': 150 - }); - MUI.Modal.modalOverlayCloseMorph = new Fx.Morph($('modalOverlay'), { - 'duration': 150, - onComplete: function(){ - $('modalOverlay').hide(); - if (Browser.Engine.trident4){ - $('modalFix').hide(); - } - }.bind(this) - }); - }, - setModalSize: function(){ - $('modalOverlay').setStyle('height', document.getCoordinates().height); - if (Browser.Engine.trident4){ - $('modalFix').setStyle('height', document.getCoordinates().height); - } - } - -}); -/* - -Script: Windows-from-html.js - Create windows from html markup in page. - -Copyright: - Copyright (c) 2007-2009 Greg Houston, . - -License: - MIT-style license. - -Requires: - Core.js, Window.js - -Example: - HTML markup. - (start code) -
    -

    My Window

    -

    My Window Content

    -
    - (end) - -See Also: - - -*/ - -MUI.files[MUI.path.source + 'Window/Windows-from-html.js'] = 'loaded'; - -MUI.extend({ - NewWindowsFromHTML: function(){ - $$('.mocha').each(function(el) { - // Get the window title and destroy that element, so it does not end up in window content - if ( Browser.Engine.presto || Browser.Engine.trident5 ){ - el.hide(); // Required by Opera, and probably IE7 - } - var title = el.getElement('h3.mochaTitle'); - - if(Browser.Engine.presto) el.show(); - - var elDimensions = el.getStyles('height', 'width'); - var properties = { - id: el.getProperty('id'), - height: elDimensions.height.toInt(), - width: elDimensions.width.toInt(), - x: el.getStyle('left').toInt(), - y: el.getStyle('top').toInt() - }; - // If there is a title element, set title and destroy the element so it does not end up in window content - if ( title ) { - properties.title = title.innerHTML; - title.destroy(); - } - - // Get content and destroy the element - properties.content = el.innerHTML; - el.destroy(); - - // Create window - new MUI.Window(properties, true); - }.bind(this)); - } -}); -/* - -Script: Windows-from-json.js - Create one or more windows from JSON data. You can define all the same properties as you can for new MUI.Window(). Undefined properties are set to their defaults. - -Copyright: - Copyright (c) 2007-2009 Greg Houston, . - -License: - MIT-style license. - -Syntax: - (start code) - MUI.newWindowsFromJSON(properties); - (end) - -Example: - (start code) - MUI.jsonWindows = function(){ - var url = 'data/json-windows-data.js'; - var request = new Request.JSON({ - url: url, - method: 'get', - onComplete: function(properties) { - MUI.newWindowsFromJSON(properties.windows); - } - }).send(); - } - (end) - -Note: - Windows created from JSON are not compatible with the current cookie based version - of Save and Load Workspace. - -See Also: - - -*/ - -MUI.files[MUI.path.source + 'Window/Windows-from-json.js'] = 'loaded'; - -MUI.extend({ - newWindowsFromJSON: function(newWindows){ - newWindows.each(function(options) { - var temp = new Hash(options); - temp.each( function(value, key, hash) { - if ($type(value) != 'string') return; - if (value.substring(0,8) == 'function'){ - eval("options." + key + " = " + value); - } - }); - new MUI.Window(options); - }); - } -}); -/* - -Script: Arrange-cascade.js - Cascade windows. - -Copyright: - Copyright (c) 2007-2009 Greg Houston, . - -License: - MIT-style license. - -Requires: - Core.js, Window.js - -Syntax: - (start code) - MUI.arrangeCascade(); - (end) - -*/ - -MUI.files[MUI.path.source + 'Window/Arrange-cascade.js'] = 'loaded'; - -MUI.extend({ - arrangeCascade: function(){ - - var viewportTopOffset = 30; // Use a negative number if necessary to place first window where you want it - var viewportLeftOffset = 20; - var windowTopOffset = 50; // Initial vertical spacing of each window - var windowLeftOffset = 40; - - // See how much space we have to work with - var coordinates = document.getCoordinates(); - - var openWindows = 0; - MUI.Windows.instances.each(function(instance){ - if (!instance.isMinimized && instance.options.draggable) openWindows ++; - }); - - if ((windowTopOffset * (openWindows + 1)) >= (coordinates.height - viewportTopOffset)) { - var topOffset = (coordinates.height - viewportTopOffset) / (openWindows + 1); - } - else { - var topOffset = windowTopOffset; - } - - if ((windowLeftOffset * (openWindows + 1)) >= (coordinates.width - viewportLeftOffset - 20)) { - var leftOffset = (coordinates.width - viewportLeftOffset - 20) / (openWindows + 1); - } - else { - var leftOffset = windowLeftOffset; - } - - var x = viewportLeftOffset; - var y = viewportTopOffset; - $$('.mocha').each(function(windowEl){ - var instance = windowEl.retrieve('instance'); - if (!instance.isMinimized && !instance.isMaximized && instance.options.draggable){ - id = windowEl.id; - MUI.focusWindow(windowEl); - x += leftOffset; - y += topOffset; - - if (MUI.options.advancedEffects == false){ - windowEl.setStyles({ - 'top': y, - 'left': x - }); - } - else { - var cascadeMorph = new Fx.Morph(windowEl, { - 'duration': 550 - }); - cascadeMorph.start({ - 'top': y, - 'left': x - }); - } - } - }.bind(this)); - } -}); -/* - -Script: Arrange-tile.js - Cascade windows. - -Copyright: - Copyright (c) 2007-2009 Greg Houston, . - -Authors: - Harry Roberts and Greg Houston - -License: - MIT-style license. - -Requires: - Core.js, Window.js - -Syntax: - (start code) - MUI.arrangeTile(); - (end) - -*/ - -MUI.files[MUI.path.source + 'Window/Arrange-tile.js'] = 'loaded'; - -MUI.extend({ - arrangeTile: function(){ - - var viewportTopOffset = 30; // Use a negative number if necessary to place first window where you want it - var viewportLeftOffset = 20; - - var x = 10; - var y = 80; - - var instances = MUI.Windows.instances; - - var windowsNum = 0; - - instances.each(function(instance){ - if (!instance.isMinimized && !instance.isMaximized){ - windowsNum++; - } - }); - - var cols = 3; - var rows = Math.ceil(windowsNum / cols); - - var coordinates = document.getCoordinates(); - - var col_width = ((coordinates.width - viewportLeftOffset) / cols); - var col_height = ((coordinates.height - viewportTopOffset) / rows); - - var row = 0; - var col = 0; - - instances.each(function(instance){ - if (!instance.isMinimized && !instance.isMaximized && instance.options.draggable ){ - - var content = instance.contentWrapperEl; - var content_coords = content.getCoordinates(); - var window_coords = instance.windowEl.getCoordinates(); - - // Calculate the amount of padding around the content window - var padding_top = content_coords.top - window_coords.top; - var padding_bottom = window_coords.height - content_coords.height - padding_top; - var padding_left = content_coords.left - window_coords.left; - var padding_right = window_coords.width - content_coords.width - padding_left; - - /* - - // This resizes the windows - if (instance.options.shape != 'gauge' && instance.options.resizable == true){ - var width = (col_width - 3 - padding_left - padding_right); - var height = (col_height - 3 - padding_top - padding_bottom); - - if (width > instance.options.resizeLimit.x[0] && width < instance.options.resizeLimit.x[1]){ - content.setStyle('width', width); - } - if (height > instance.options.resizeLimit.y[0] && height < instance.options.resizeLimit.y[1]){ - content.setStyle('height', height); - } - - }*/ - - var left = (x + (col * col_width)); - var top = (y + (row * col_height)); - - instance.drawWindow(); - - MUI.focusWindow(instance.windowEl); - - if (MUI.options.advancedEffects == false){ - instance.windowEl.setStyles({ - 'top': top, - 'left': left - }); - } - else { - var tileMorph = new Fx.Morph(instance.windowEl, { - 'duration': 550 - }); - tileMorph.start({ - 'top': top, - 'left': left - }); - } - - if (++col === cols) { - row++; - col = 0; - } - } - }.bind(this)); - } -}); -/* - -Script: Tabs.js - Functionality for window tabs. - -Copyright: - Copyright (c) 2007-2009 Greg Houston, . - -License: - MIT-style license. - -Requires: - Core.js, Window.js (for tabbed windows) or Layout.js (for tabbed panels) - -*/ - -MUI.files[MUI.path.source + 'Components/Tabs.js'] = 'loaded'; - -MUI.extend({ - /* - - Function: initializeTabs - Add click event to each list item that fires the selected function. - - */ - initializeTabs: function(el){ - $(el).setStyle('list-style', 'none'); // This is to fix a glitch that occurs in IE8 RC1 when dynamically switching themes - $(el).getElements('li').addEvent('click', function(e){ - MUI.selected(this, el); - }); - }, - /* - - Function: selected - Add "selected" class to current list item and remove it from sibling list items. - - Syntax: - (start code) - selected(el, parent); - (end) - - Arguments: - el - the list item - parent - the ul - - */ - selected: function(el, parent){ - $(parent).getChildren().each(function(listitem){ - listitem.removeClass('selected'); - }); - el.addClass('selected'); - } -}); - -/* - -Script: Layout.js - Create web application layouts. Enables window maximize. - -Copyright: - Copyright (c) 2007-2009 Greg Houston, . - -License: - MIT-style license. - -Requires: - Core.js - -*/ - -MUI.files[MUI.path.source + 'Layout/Layout.js'] = 'loaded'; - -MUI.extend({ - Columns: { - instances: new Hash(), - columnIDCount: 0 // Used for columns without an ID defined by the user - }, - Panels: { - instances: new Hash(), - panelIDCount: 0 // Used for panels without an ID defined by the user - } -}); - -MUI.Desktop = { - - options: { - // Naming options: - // If you change the IDs of the MochaUI Desktop containers in your HTML, you need to change them here as well. - desktop: 'desktop', - desktopHeader: 'desktopHeader', - desktopFooter: 'desktopFooter', - desktopNavBar: 'desktopNavbar', - pageWrapper: 'pageWrapper', - page: 'page', - desktopFooter: 'desktopFooterWrapper' - }, - initialize: function(){ - - this.desktop = $(this.options.desktop); - this.desktopHeader = $(this.options.desktopHeader); - this.desktopNavBar = $(this.options.desktopNavBar); - this.pageWrapper = $(this.options.pageWrapper); - this.page = $(this.options.page); - this.desktopFooter = $(this.options.desktopFooter); - - if (this.desktop) { - ($$('body')).setStyles({ - overflow: 'hidden', - height: '100%', - margin: 0 - }); - ($$('html')).setStyles({ - overflow: 'hidden', - height: '100%' - }); - } - - // This is run on dock initialize so no need to do it twice. - if (!MUI.Dock){ - this.setDesktopSize(); - } - this.menuInitialize(); - - // Resize desktop, page wrapper, modal overlay, and maximized windows when browser window is resized - window.addEvent('resize', function(e){ - this.onBrowserResize(); - }.bind(this)); - - if (MUI.myChain){ - MUI.myChain.callChain(); - } - - }, - menuInitialize: function(){ - // Fix for dropdown menus in IE6 - if (Browser.Engine.trident4 && this.desktopNavBar){ - this.desktopNavBar.getElements('li').each(function(element) { - element.addEvent('mouseenter', function(){ - this.addClass('ieHover'); - }); - element.addEvent('mouseleave', function(){ - this.removeClass('ieHover'); - }); - }); - }; - }, - onBrowserResize: function(){ - this.setDesktopSize(); - // Resize maximized windows to fit new browser window size - setTimeout( function(){ - MUI.Windows.instances.each(function(instance){ - if (instance.isMaximized){ - - // Hide iframe while resize for better performance - if ( instance.iframeEl ){ - instance.iframeEl.setStyle('visibility', 'hidden'); - } - - var coordinates = document.getCoordinates(); - var borderHeight = instance.contentBorderEl.getStyle('margin-top').toInt() + instance.contentBorderEl.getStyle('margin-bottom').toInt(); - var toolbarHeight = instance.toolbarWrapperEl ? instance.toolbarWrapperEl.getStyle('height').toInt() + instance.toolbarWrapperEl.getStyle('margin-top').toInt() : 0; - instance.contentWrapperEl.setStyles({ - 'height': coordinates.height - instance.options.headerHeight - instance.options.footerHeight - borderHeight - toolbarHeight, - 'width': coordinates.width - }); - - instance.drawWindow(); - if ( instance.iframeEl ){ - instance.iframeEl.setStyles({ - 'height': instance.contentWrapperEl.getStyle('height') - }); - instance.iframeEl.setStyle('visibility', 'visible'); - } - - } - }.bind(this)); - }.bind(this), 100); - }, - setDesktopSize: function(){ - var windowDimensions = window.getCoordinates(); - - // var dock = $(MUI.options.dock); - var dockWrapper = $(MUI.options.dockWrapper); - - // Setting the desktop height may only be needed by IE7 - if (this.desktop){ - this.desktop.setStyle('height', windowDimensions.height); - } - - // Set pageWrapper height so the dock doesn't cover the pageWrapper scrollbars. - if (this.pageWrapper) { - var dockOffset = MUI.dockVisible ? dockWrapper.offsetHeight : 0; - var pageWrapperHeight = windowDimensions.height; - pageWrapperHeight -= this.pageWrapper.getStyle('margin-top').toInt(); - pageWrapperHeight -= this.pageWrapper.getStyle('margin-bottom').toInt(); - if (this.desktopHeader){ pageWrapperHeight -= this.desktopHeader.offsetHeight; } - if (this.desktopFooter){ pageWrapperHeight -= this.desktopFooter.offsetHeight; } - pageWrapperHeight -= dockOffset; - - if (pageWrapperHeight < 0){ - pageWrapperHeight = 0; - } - this.pageWrapper.setStyle('height', pageWrapperHeight); - } - - if (MUI.Columns.instances.getKeys().length > 0){ // Conditional is a fix for a bug in IE6 in the no toolbars demo. - MUI.Desktop.resizePanels(); - } - }, - resizePanels: function(){ - MUI.panelHeight(); - MUI.rWidth(); - }, - /* - - Function: maximizeWindow - Maximize a window. - - Syntax: - (start code) - MUI.Desktop.maximizeWindow(windowEl); - (end) - - */ - maximizeWindow: function(windowEl){ - - var instance = MUI.Windows.instances.get(windowEl.id); - var options = instance.options; - var windowDrag = instance.windowDrag; - - // If window no longer exists or is maximized, stop - if (windowEl != $(windowEl) || instance.isMaximized ) return; - - if (instance.isCollapsed){ - MUI.collapseToggle(windowEl); - } - - instance.isMaximized = true; - - // If window is restricted to a container, it should not be draggable when maximized. - if (instance.options.restrict){ - windowDrag.detach(); - if (options.resizable) { - instance.detachResizable(); - } - instance.titleBarEl.setStyle('cursor', 'default'); - } - - // If the window has a container that is not the desktop - // temporarily move the window to the desktop while it is minimized. - if (options.container != this.desktop){ - this.desktop.grab(windowEl); - if (this.options.restrict){ - windowDrag.container = this.desktop; - } - } - - // Save original position - instance.oldTop = windowEl.getStyle('top'); - instance.oldLeft = windowEl.getStyle('left'); - - var contentWrapperEl = instance.contentWrapperEl; - - // Save original dimensions - contentWrapperEl.oldWidth = contentWrapperEl.getStyle('width'); - contentWrapperEl.oldHeight = contentWrapperEl.getStyle('height'); - - // Hide iframe - // Iframe should be hidden when minimizing, maximizing, and moving for performance and Flash issues - if ( instance.iframeEl ) { - if (!MUI.ieLegacySupport) { - instance.iframeEl.setStyle('visibility', 'hidden'); - } - else { - instance.iframeEl.hide(); - } - } - - var windowDimensions = document.getCoordinates(); - var options = instance.options; - var shadowBlur = options.shadowBlur; - var shadowOffset = options.shadowOffset; - var newHeight = windowDimensions.height - options.headerHeight - options.footerHeight; - newHeight -= instance.contentBorderEl.getStyle('margin-top').toInt(); - newHeight -= instance.contentBorderEl.getStyle('margin-bottom').toInt(); - newHeight -= (instance.toolbarWrapperEl ? instance.toolbarWrapperEl.getStyle('height').toInt() + instance.toolbarWrapperEl.getStyle('margin-top').toInt() : 0); - - MUI.resizeWindow(windowEl, { - width: windowDimensions.width, - height: newHeight, - top: shadowOffset.y - shadowBlur, - left: shadowOffset.x - shadowBlur - }); - instance.fireEvent('onMaximize', windowEl); - - if (instance.maximizeButtonEl) { - instance.maximizeButtonEl.setProperty('title', 'Restore'); - } - MUI.focusWindow(windowEl); - - }, - /* - - Function: restoreWindow - Restore a maximized window. - - Syntax: - (start code) - MUI.Desktop.restoreWindow(windowEl); - (end) - - */ - restoreWindow: function(windowEl){ - - var instance = windowEl.retrieve('instance'); - - // Window exists and is maximized ? - if (windowEl != $(windowEl) || !instance.isMaximized) return; - - var options = instance.options; - instance.isMaximized = false; - - if (options.restrict){ - instance.windowDrag.attach(); - if (options.resizable){ - instance.reattachResizable(); - } - instance.titleBarEl.setStyle('cursor', 'move'); - } - - // Hide iframe - // Iframe should be hidden when minimizing, maximizing, and moving for performance and Flash issues - if ( instance.iframeEl ) { - if (!MUI.ieLegacySupport) { - instance.iframeEl.setStyle('visibility', 'hidden'); - } - else { - instance.iframeEl.hide(); - } - } - - var contentWrapperEl = instance.contentWrapperEl; - - MUI.resizeWindow(windowEl,{ - width: contentWrapperEl.oldWidth, - height: contentWrapperEl.oldHeight, - top: instance.oldTop, - left: instance.oldLeft - }); - instance.fireEvent('onRestore', windowEl); - - if (instance.maximizeButtonEl){ - instance.maximizeButtonEl.setProperty('title', 'Maximize'); - } - } -}; - -/* - -Class: Column - Create a column. Columns should be created from left to right. - -Syntax: -(start code) - MUI.Column(); -(end) - -Arguments: - options - -Options: - id - The ID of the column. This must be set when creating the column. - container - Defaults to MUI.Desktop.pageWrapper. - placement - Can be 'right', 'main', or 'left'. There must be at least one column with the 'main' option. - width - 'main' column is fluid and should not be given a width. - resizeLimit - resizelimit of a 'right' or 'left' column. - sortable - (boolean) Whether the panels can be reordered via drag and drop. - onResize - (function) Fired when the column is resized. - onCollapse - (function) Fired when the column is collapsed. - onExpand - (function) Fired when the column is expanded. - -*/ -MUI.Column = new Class({ - - Implements: [Events, Options], - - options: { - id: null, - container: null, - placement: null, - width: null, - resizeLimit: [], - sortable: true, - - // Events - onResize: $empty, - onCollapse: $empty, - onExpand: $empty - - }, - - initialize: function(options){ - this.setOptions(options); - - $extend(this, { - timestamp: $time(), - isCollapsed: false, - oldWidth: 0 - }); - - // If column has no ID, give it one. - if (this.options.id == null){ - this.options.id = 'column' + (++MUI.Columns.columnIDCount); - } - - // Shorten object chain - var options = this.options; - var instances = MUI.Columns.instances; - var instanceID = instances.get(options.id); - - if (options.container == null) { - options.container = MUI.Desktop.pageWrapper - } - else { - $(options.container).setStyle('overflow', 'hidden'); - } - - if (typeof this.options.container == 'string'){ - this.options.container = $(this.options.container); - } - - // Check to see if there is already a class instance for this Column - if (instanceID){ - var instance = instanceID; - } - - // Check if column already exists - if ( this.columnEl ){ - return; - } - else { - instances.set(options.id, this); - } - - // If loading columns into a panel, hide the regular content container. - if ($(options.container).getElement('.pad') != null) { - $(options.container).getElement('.pad').hide(); - } - - // If loading columns into a window, hide the regular content container. - if ($(options.container).getElement('.mochaContent') != null) { - $(options.container).getElement('.mochaContent').hide(); - } - - this.columnEl = new Element('div', { - 'id': this.options.id, - 'class': 'column expanded', - 'styles': { - 'width': options.placement == 'main' ? null : options.width - } - }).inject($(options.container)); - - this.columnEl.store('instance', this); - - var parent = this.columnEl.getParent(); - var columnHeight = parent.getStyle('height').toInt(); - this.columnEl.setStyle('height', columnHeight); - - if (this.options.sortable){ - if (!this.options.container.retrieve('sortables')){ - var sortables = new Sortables(this.columnEl, { - opacity: 1, - handle: '.panel-header', - constrain: false, - revert: false, - onSort: function(){ - $$('.column').each(function(column){ - column.getChildren('.panelWrapper').each(function(panelWrapper){ - panelWrapper.getElement('.panel').removeClass('bottomPanel'); - }); - if (column.getChildren('.panelWrapper').getLast()){ - column.getChildren('.panelWrapper').getLast().getElement('.panel').addClass('bottomPanel'); - } - MUI.panelHeight(); - }.bind(this)); - }.bind(this) - }); - this.options.container.store('sortables', sortables); - } - else { - this.options.container.retrieve('sortables').addLists(this.columnEl); - } - } - - if (options.placement == 'main'){ - this.columnEl.addClass('rWidth'); - } - - switch (this.options.placement) { - case 'left': - this.handleEl = new Element('div', { - 'id': this.options.id + '_handle', - 'class': 'columnHandle' - }).inject(this.columnEl, 'after'); - - this.handleIconEl = new Element('div', { - 'id': options.id + '_handle_icon', - 'class': 'handleIcon' - }).inject(this.handleEl); - - addResizeRight(this.columnEl, options.resizeLimit[0], options.resizeLimit[1]); - break; - case 'right': - this.handleEl = new Element('div', { - 'id': this.options.id + '_handle', - 'class': 'columnHandle' - }).inject(this.columnEl, 'before'); - - this.handleIconEl = new Element('div', { - 'id': options.id + '_handle_icon', - 'class': 'handleIcon' - }).inject(this.handleEl); - addResizeLeft(this.columnEl, options.resizeLimit[0], options.resizeLimit[1]); - break; - } - - if (this.handleEl != null){ - this.handleEl.addEvent('dblclick', function(){ - this.columnToggle(); - }.bind(this)); - } - - MUI.rWidth(); - - }, - columnToggle: function(){ - var column = this.columnEl; - - // Collapse - if (this.isCollapsed == false){ - this.oldWidth = column.getStyle('width').toInt(); - - this.resize.detach(); - this.handleEl.removeEvents('dblclick'); - this.handleEl.addEvent('click', function(){ - this.columnToggle(); - }.bind(this)); - this.handleEl.setStyle('cursor', 'pointer').addClass('detached'); - - column.setStyle('width', 0); - this.isCollapsed = true; - column.addClass('collapsed'); - column.removeClass('expanded'); - MUI.rWidth(); - this.fireEvent('onCollapse'); - } - // Expand - else { - column.setStyle('width', this.oldWidth); - this.isCollapsed = false; - column.addClass('expanded'); - column.removeClass('collapsed'); - - this.handleEl.removeEvents('click'); - this.handleEl.addEvent('dblclick', function(){ - this.columnToggle(); - }.bind(this)); - this.resize.attach(); - this.handleEl.setStyle('cursor', (Browser.Engine.webkit || Browser.Engine.gecko) ? 'col-resize' : 'e-resize').addClass('attached'); - - MUI.rWidth(); - this.fireEvent('onExpand'); - } - } -}); -MUI.Column.implement(new Options, new Events); - -/* - -Class: Panel - Create a panel. Panels go one on top of another in columns. Create your columns first and then add your panels. Panels should be created from top to bottom, left to right. - -Syntax: -(start code) - MUI.Panel(); -(end) - -Arguments: - options - -Options: - id - The ID of the panel. This must be set when creating the panel. - column - Where to inject the panel. This must be set when creating the panel. - loadMethod - ('html', 'xhr', or 'iframe') Defaults to 'html' if there is no contentURL. Defaults to 'xhr' if there is a contentURL. You only really need to set this if using the 'iframe' method. May create a 'panel' loadMethod in the future. - contentURL - Used if loadMethod is set to 'xhr' or 'iframe'. - method - ('get', or 'post') The method used to get the data. Defaults to 'get'. - data - (hash) Data to send with the URL. Defaults to null. - evalScripts - (boolean) An xhr loadMethod option. Defaults to true. - evalResponse - (boolean) An xhr loadMethod option. Defaults to false. - content - (string or element) An html loadMethod option. - tabsURL - (url) - tabsData - (hash) Data to send with the URL. Defaults to null. - tabsOnload - (function) - header - (boolean) Display the panel header or not - headerToolbox: (boolean) - headerToolboxURL: (url) - headerToolboxOnload: (function) - height - (number) Height of content area. - addClass - (string) Add a class to the panel. - scrollbars - (boolean) - padding - (object) - collapsible - (boolean) - onBeforeBuild - (function) Fired before the panel is created. - onContentLoaded - (function) Fired after the panel's conten is loaded. - onResize - (function) Fired when the panel is resized. - onCollapse - (function) Fired when the panel is collapsed. - onExpand - (function) Fired when the panel is expanded. - -*/ -MUI.Panel = new Class({ - - Implements: [Events, Options], - - options: { - id: null, - title: 'New Panel', - column: null, - require: { - css: [], - images: [], - js: [], - onload: null - }, - loadMethod: null, - contentURL: null, - - // xhr options - method: 'get', - data: null, - evalScripts: true, - evalResponse: false, - - // html options - content: 'Panel content', - - // Tabs - tabsURL: null, - tabsData: null, - tabsOnload: $empty, - - header: true, - headerToolbox: false, - headerToolboxURL: 'pages/lipsum.html', - headerToolboxOnload: $empty, - - // Style options: - height: 125, - addClass: '', - scrollbars: true, - padding: { top: 8, right: 8, bottom: 8, left: 8 }, - - // Other: - collapsible: true, - - // Events - onBeforeBuild: $empty, - onContentLoaded: $empty, - onResize: $empty, - onCollapse: $empty, - onExpand: $empty - - }, - initialize: function(options){ - this.setOptions(options); - - $extend(this, { - timestamp: $time(), - isCollapsed: false, // This is probably redundant since we can check for the class - oldHeight: 0, - partner: null - }); - - // If panel has no ID, give it one. - if (this.options.id == null){ - this.options.id = 'panel' + (++MUI.Panels.panelIDCount); - } - - // Shorten object chain - var instances = MUI.Panels.instances; - var instanceID = instances.get(this.options.id); - var options = this.options; - - // Check to see if there is already a class instance for this panel - if (instanceID){ - var instance = instanceID; - } - - // Check if panel already exists - if ( this.panelEl ){ - return; - } - else { - instances.set(this.options.id, this); - } - - this.fireEvent('onBeforeBuild'); - - if (options.loadMethod == 'iframe') { - // Iframes have their own padding. - options.padding = { top: 0, right: 0, bottom: 0, left: 0 }; - } - - this.showHandle = true; - if ($(options.column).getChildren().length == 0) { - this.showHandle = false; - } - - this.panelWrapperEl = new Element('div', { - 'id': this.options.id + '_wrapper', - 'class': 'panelWrapper expanded' - }).inject($(options.column)); - - this.panelEl = new Element('div', { - 'id': this.options.id, - 'class': 'panel expanded', - 'styles': { - 'height': options.height - } - }).inject(this.panelWrapperEl); - - this.panelEl.store('instance', this); - - this.panelEl.addClass(options.addClass); - - this.contentEl = new Element('div', { - 'id': options.id + '_pad', - 'class': 'pad' - }).inject(this.panelEl); - - // This is in order to use the same variable as the windows do in updateContent. - // May rethink this. - this.contentWrapperEl = this.panelEl; - - this.contentEl.setStyles({ - 'padding-top': options.padding.top, - 'padding-bottom': options.padding.bottom, - 'padding-left': options.padding.left, - 'padding-right': options.padding.right - }); - - this.panelHeaderEl = new Element('div', { - 'id': this.options.id + '_header', - 'class': 'panel-header', - 'styles': { - 'display': options.header ? 'block' : 'none' - } - }).inject(this.panelEl, 'before'); - - var columnInstances = MUI.Columns.instances; - var columnInstance = columnInstances.get(this.options.column); - - if (columnInstance.options.sortable){ - this.panelHeaderEl.setStyle('cursor', 'move'); - columnInstance.options.container.retrieve('sortables').addItems(this.panelWrapperEl); - } - - if (this.options.collapsible) { - this.collapseToggleInit(); - } - - if (this.options.headerToolbox) { - this.panelHeaderToolboxEl = new Element('div', { - 'id': options.id + '_headerToolbox', - 'class': 'panel-header-toolbox' - }).inject(this.panelHeaderEl); - } - - this.panelHeaderContentEl = new Element('div', { - 'id': options.id + '_headerContent', - 'class': 'panel-headerContent' - }).inject(this.panelHeaderEl); - - this.titleEl = new Element('h2', { - 'id': options.id + '_title' - }).inject(this.panelHeaderContentEl); - - this.handleEl = new Element('div', { - 'id': options.id + '_handle', - 'class': 'horizontalHandle', - 'styles': { - 'display': this.showHandle == true ? 'block' : 'none' - } - }).inject(this.panelEl, 'after'); - - this.handleIconEl = new Element('div', { - 'id': options.id + '_handle_icon', - 'class': 'handleIcon' - }).inject(this.handleEl); - - addResizeBottom(options.id); - - if (options.require.css.length || options.require.images.length){ - new MUI.Require({ - css: options.require.css, - images: options.require.images, - onload: function(){ - this.newPanel(); - }.bind(this) - }); - } - else { - this.newPanel(); - } - }, - newPanel: function(){ - - options = this.options; - - if (this.options.headerToolbox) { - MUI.updateContent({ - 'element': this.panelEl, - 'childElement': this.panelHeaderToolboxEl, - 'loadMethod': 'xhr', - 'url': options.headerToolboxURL, - 'onContentLoaded': options.headerToolboxOnload - }); - } - - if (options.tabsURL == null) { - this.titleEl.set('html', options.title); - } else { - this.panelHeaderContentEl.addClass('tabs'); - MUI.updateContent({ - 'element': this.panelEl, - 'childElement': this.panelHeaderContentEl, - 'loadMethod': 'xhr', - 'url': options.tabsURL, - 'data': options.tabsData, - 'onContentLoaded': options.tabsOnload - }); - } - - // Add content to panel. - MUI.updateContent({ - 'element': this.panelEl, - 'content': options.content, - 'method': options.method, - 'data': options.data, - 'url': options.contentURL, - 'onContentLoaded': null, - 'require': { - js: options.require.js, - onload: options.require.onload - } - }); - - // Do this when creating and removing panels - $(options.column).getChildren('.panelWrapper').each(function(panelWrapper){ - panelWrapper.getElement('.panel').removeClass('bottomPanel'); - }); - $(options.column).getChildren('.panelWrapper').getLast().getElement('.panel').addClass('bottomPanel'); - - MUI.panelHeight(options.column, this.panelEl, 'new'); - - }, - collapseToggleInit: function(options){ - - var options = this.options; - - this.panelHeaderCollapseBoxEl = new Element('div', { - 'id': options.id + '_headerCollapseBox', - 'class': 'toolbox' - }).inject(this.panelHeaderEl); - - if (options.headerToolbox) { - this.panelHeaderCollapseBoxEl.addClass('divider'); - } - - this.collapseToggleEl = new Element('div', { - 'id': options.id + '_collapseToggle', - 'class': 'panel-collapse icon16', - 'styles': { - 'width': 16, - 'height': 16 - }, - 'title': 'Collapse Panel' - }).inject(this.panelHeaderCollapseBoxEl); - - this.collapseToggleEl.addEvent('click', function(event){ - var panel = this.panelEl; - var panelWrapper = this.panelWrapperEl - - // Get siblings and make sure they are not all collapsed. - // If they are all collapsed and the current panel is collapsing - // Then collapse the column. - var instances = MUI.Panels.instances; - var expandedSiblings = []; - - panelWrapper.getAllPrevious('.panelWrapper').each(function(sibling){ - var instance = instances.get(sibling.getElement('.panel').id); - if (instance.isCollapsed == false){ - expandedSiblings.push(sibling.getElement('.panel').id); - } - }); - - panelWrapper.getAllNext('.panelWrapper').each(function(sibling){ - var instance = instances.get(sibling.getElement('.panel').id); - if (instance.isCollapsed == false){ - expandedSiblings.push(sibling.getElement('.panel').id); - } - }); - - // Collapse Panel - if (this.isCollapsed == false) { - var currentColumn = MUI.Columns.instances.get($(options.column).id); - - if (expandedSiblings.length == 0 && currentColumn.options.placement != 'main'){ - var currentColumn = MUI.Columns.instances.get($(options.column).id); - currentColumn.columnToggle(); - return; - } - else if (expandedSiblings.length == 0 && currentColumn.options.placement == 'main'){ - return; - } - this.oldHeight = panel.getStyle('height').toInt(); - if (this.oldHeight < 10) this.oldHeight = 20; - this.contentEl.setStyle('position', 'absolute'); // This is so IE6 and IE7 will collapse the panel all the way - panel.setStyle('height', 0); - this.isCollapsed = true; - panelWrapper.addClass('collapsed'); - panelWrapper.removeClass('expanded'); - MUI.panelHeight(options.column, panel, 'collapsing'); - MUI.panelHeight(); // Run this a second time for panels within panels - this.collapseToggleEl.removeClass('panel-collapsed'); - this.collapseToggleEl.addClass('panel-expand'); - this.collapseToggleEl.setProperty('title','Expand Panel'); - this.fireEvent('onCollapse'); - } - - // Expand Panel - else { - this.contentEl.setStyle('position', null); // This is so IE6 and IE7 will collapse the panel all the way - panel.setStyle('height', this.oldHeight); - this.isCollapsed = false; - panelWrapper.addClass('expanded'); - panelWrapper.removeClass('collapsed'); - MUI.panelHeight(this.options.column, panel, 'expanding'); - MUI.panelHeight(); // Run this a second time for panels within panels - this.collapseToggleEl.removeClass('panel-expand'); - this.collapseToggleEl.addClass('panel-collapsed'); - this.collapseToggleEl.setProperty('title','Collapse Panel'); - this.fireEvent('onExpand'); - } - }.bind(this)); - } -}); -MUI.Panel.implement(new Options, new Events); - -/* - arguments: - column - The column to resize the panels in - changing - The panel that is collapsing, expanding, or new - action - collapsing, expanding, or new - -*/ - -MUI.extend({ - // Panel Height - panelHeight: function(column, changing, action){ - if (column != null) { - MUI.panelHeight2($(column), changing, action); - } - else { - $$('.column').each(function(column){ - MUI.panelHeight2(column); - }.bind(this)); - } - }, - /* - - actions can be new, collapsing or expanding. - - */ - panelHeight2: function(column, changing, action){ - - var instances = MUI.Panels.instances; - - var parent = column.getParent(); - var columnHeight = parent.getStyle('height').toInt(); - if (Browser.Engine.trident4 && parent == MUI.Desktop.pageWrapper) { - columnHeight -= 1; - } - column.setStyle('height', columnHeight); - - // Get column panels - var panels = []; - column.getChildren('.panelWrapper').each( function(panelWrapper){ - panels.push(panelWrapper.getElement('.panel')); - }.bind(this)); - - // Get expanded column panels - var panelsExpanded = []; - column.getChildren('.expanded').each( function(panelWrapper){ - panelsExpanded.push(panelWrapper.getElement('.panel')); - }.bind(this)); - - // All the panels in the column whose height will be effected. - var panelsToResize = []; - - // The panel with the greatest height. Remainders will be added to this panel - var tallestPanel; - var tallestPanelHeight = 0; - - this.panelsTotalHeight = 0; // Height of all the panels in the column - this.height = 0; // Height of all the elements in the column - - // Set panel resize partners - panels.each(function(panel){ - instance = instances.get(panel.id); - if (panel.getParent().hasClass('expanded') && panel.getParent().getNext('.expanded')) { - instance.partner = panel.getParent().getNext('.expanded').getElement('.panel'); - instance.resize.attach(); - instance.handleEl.setStyles({ - 'display': 'block', - 'cursor': (Browser.Engine.webkit || Browser.Engine.gecko) ? 'row-resize' : 'n-resize' - }).removeClass('detached'); - } else { - instance.resize.detach(); - instance.handleEl.setStyles({ - 'display': 'none', - 'cursor': null - }).addClass('detached'); - } - if (panel.getParent().getNext('.panelWrapper') == null) { - instance.handleEl.hide(); - } - }.bind(this)); - - // Add panels to panelsToResize - // Get the total height of all the resizable panels - // Get the total height of all the column's children - column.getChildren().each(function(panelWrapper){ - - panelWrapper.getChildren().each(function(el){ - - if (el.hasClass('panel')){ - var instance = instances.get(el.id); - - // Are any next siblings Expanded? - anyNextSiblingsExpanded = function(el){ - var test; - el.getParent().getAllNext('.panelWrapper').each(function(sibling){ - var siblingInstance = instances.get(sibling.getElement('.panel').id); - if (siblingInstance.isCollapsed == false){ - test = true; - } - }.bind(this)); - return test; - }.bind(this); - - // If a next sibling is expanding, are any of the nexts siblings of the expanding sibling Expanded? - anyExpandingNextSiblingsExpanded = function(el){ - var test; - changing.getParent().getAllNext('.panelWrapper').each(function(sibling){ - var siblingInstance = instances.get(sibling.getElement('.panel').id); - if (siblingInstance.isCollapsed == false){ - test = true; - } - }.bind(this)); - return test; - }.bind(this); - - // Is the panel that is collapsing, expanding, or new located after this panel? - anyNextContainsChanging = function(el){ - var allNext = []; - el.getParent().getAllNext('.panelWrapper').each(function(panelWrapper){ - allNext.push(panelWrapper.getElement('.panel')); - }.bind(this)); - var test = allNext.contains(changing); - return test; - }.bind(this); - - nextExpandedChanging = function(el){ - var test; - if (el.getParent().getNext('.expanded')){ - if (el.getParent().getNext('.expanded').getElement('.panel') == changing) test = true; - } - return test; - } - - // NEW PANEL - // Resize panels that are "new" or not collapsed - if (action == 'new') { - if (!instance.isCollapsed && el != changing) { - panelsToResize.push(el); - this.panelsTotalHeight += el.offsetHeight.toInt(); - } - } - - // COLLAPSING PANELS and CURRENTLY EXPANDED PANELS - // Resize panels that are not collapsed. - // If a panel is collapsing resize any expanded panels below. - // If there are no expanded panels below it, resize the expanded panels above it. - else if (action == null || action == 'collapsing' ){ - if (!instance.isCollapsed && (!anyNextContainsChanging(el) || !anyNextSiblingsExpanded(el))){ - panelsToResize.push(el); - this.panelsTotalHeight += el.offsetHeight.toInt(); - } - } - - // EXPANDING PANEL - // Resize panels that are not collapsed and are not expanding. - // Resize any expanded panels below the expanding panel. - // If there are no expanded panels below the expanding panel, resize the first expanded panel above it. - else if (action == 'expanding' && !instance.isCollapsed && el != changing){ - if (!anyNextContainsChanging(el) || (!anyExpandingNextSiblingsExpanded(el) && nextExpandedChanging(el))){ - panelsToResize.push(el); - this.panelsTotalHeight += el.offsetHeight.toInt(); - } - } - - if (el.style.height){ - this.height += el.getStyle('height').toInt(); - } - } - else { - this.height += el.offsetHeight.toInt(); - } - }.bind(this)); - - }.bind(this)); - - // Get the remaining height - var remainingHeight = column.offsetHeight.toInt() - this.height; - - this.height = 0; - - // Get height of all the column's children - column.getChildren().each(function(el){ - this.height += el.offsetHeight.toInt(); - }.bind(this)); - - var remainingHeight = column.offsetHeight.toInt() - this.height; - - panelsToResize.each(function(panel){ - var ratio = this.panelsTotalHeight / panel.offsetHeight.toInt(); - var panelHeight = panel.getStyle('height').toInt(); - var newPanelHeight = remainingHeight / ratio; - if (!isNaN(panelHeight)) - newPanelHeight += panelHeight; - if (newPanelHeight < 1){ - newPanelHeight = 0; - } - panel.setStyle('height', newPanelHeight); - }.bind(this)); - - // Make sure the remaining height is 0. If not add/subtract the - // remaining height to the tallest panel. This makes up for browser resizing, - // off ratios, and users trying to give panels too much height. - - // Get height of all the column's children - this.height = 0; - column.getChildren().each(function(panelWrapper){ - panelWrapper.getChildren().each(function(el){ - this.height += el.offsetHeight.toInt(); - if (el.hasClass('panel') && el.getStyle('height').toInt() > tallestPanelHeight){ - tallestPanel = el; - tallestPanelHeight = el.getStyle('height').toInt(); - } - }.bind(this)); - }.bind(this)); - - var remainingHeight = column.offsetHeight.toInt() - this.height; - - if (remainingHeight != 0 && tallestPanelHeight > 0){ - tallestPanel.setStyle('height', tallestPanel.getStyle('height').toInt() + remainingHeight ); - if (tallestPanel.getStyle('height') < 1){ - tallestPanel.setStyle('height', 0 ); - } - } - - parent.getChildren('.columnHandle').each(function(handle){ - var parent = handle.getParent(); - if (parent.getStyle('height').toInt() < 1) return; // Keeps IE7 and 8 from throwing an error when collapsing a panel within a panel - var handleHeight = parent.getStyle('height').toInt() - handle.getStyle('margin-top').toInt() - handle.getStyle('margin-bottom').toInt(); - if (Browser.Engine.trident4 && parent == MUI.Desktop.pageWrapper){ - handleHeight -= 1; - } - handle.setStyle('height', handleHeight); - }); - - panelsExpanded.each(function(panel){ - MUI.resizeChildren(panel); - }.bind(this)); - - }, - // May rename this resizeIframeEl() - resizeChildren: function(panel){ - var instances = MUI.Panels.instances; - var instance = instances.get(panel.id); - var contentWrapperEl = instance.contentWrapperEl; - - if (instance.iframeEl) { - if (!MUI.ieLegacySupport) { - instance.iframeEl.setStyles({ - 'height': contentWrapperEl.getStyle('height'), - 'width': contentWrapperEl.offsetWidth - contentWrapperEl.getStyle('margin-left').toInt() - contentWrapperEl.getStyle('margin-right').toInt() - }); - } - else { - // The following hack is to get IE8 RC1 IE8 Standards Mode to properly resize an iframe - // when only the vertical dimension is changed. - instance.iframeEl.setStyles({ - 'height': contentWrapperEl.getStyle('height'), - 'width': contentWrapperEl.offsetWidth - contentWrapperEl.getStyle('margin-left').toInt() - contentWrapperEl.getStyle('margin-right').toInt() - 1 - }); - instance.iframeEl.setStyles({ - 'width': contentWrapperEl.offsetWidth - contentWrapperEl.getStyle('margin-left').toInt() - contentWrapperEl.getStyle('margin-right').toInt() - }); - } - } - - }, - // Remaining Width - rWidth: function(container){ - if (container == null) { - var container = MUI.Desktop.desktop; - } - container.getElements('.rWidth').each(function(column){ - var currentWidth = column.offsetWidth.toInt(); - currentWidth -= column.getStyle('margin-left').toInt(); - currentWidth -= column.getStyle('margin-right').toInt(); - var parent = column.getParent(); - this.width = 0; - - // Get the total width of all the parent element's children - parent.getChildren().each(function(el){ - if (el.hasClass('mocha') != true) { - this.width += el.offsetWidth.toInt(); - } - }.bind(this)); - - // Add the remaining width to the current element - var remainingWidth = parent.offsetWidth.toInt() - this.width; - var newWidth = currentWidth + remainingWidth; - if (newWidth < 1) newWidth = 0; - column.setStyle('width', newWidth); - column.getChildren('.panel').each(function(panel){ - panel.setStyle('width', newWidth - panel.getStyle('margin-left').toInt() - panel.getStyle('margin-right').toInt()); - MUI.resizeChildren(panel); - }.bind(this)); - - }); - } - -}); - -function addResizeRight(element, min, max){ - if (!$(element)) return; - element = $(element); - - var instances = MUI.Columns.instances; - var instance = instances.get(element.id); - - var handle = element.getNext('.columnHandle'); - handle.setStyle('cursor', (Browser.Engine.webkit || Browser.Engine.gecko) ? 'col-resize' : 'e-resize'); - if (!min) min = 50; - if (!max) max = 250; - if (MUI.ieLegacySupport) { - handle.addEvents({ - 'mousedown': function(){ - handle.setCapture(); - }, - 'mouseup': function(){ - handle.releaseCapture(); - } - }); - } - instance.resize = element.makeResizable({ - handle: handle, - modifiers: { - x: 'width', - y: false - }, - limit: { - x: [min, max] - }, - onStart: function(){ - element.getElements('iframe').setStyle('visibility', 'hidden'); - element.getNext('.column').getElements('iframe').setStyle('visibility', 'hidden'); - }.bind(this), - onDrag: function(){ - MUI.rWidth(element.getParent()); - if (Browser.Engine.trident4) { - element.getChildren().each(function(el){ - var width = $(element).getStyle('width').toInt(); - width -= el.getStyle('margin-right').toInt(); - width -= el.getStyle('margin-left').toInt(); - width -= el.getStyle('padding-right').toInt(); - width -= el.getStyle('padding-left').toInt(); - el.setStyle('width', width); - }.bind(this)); - } - }.bind(this), - onComplete: function(){ - MUI.rWidth(element.getParent()); - element.getElements('iframe').setStyle('visibility', 'visible'); - element.getNext('.column').getElements('iframe').setStyle('visibility', 'visible'); - instance.fireEvent('onResize'); - }.bind(this) - }); -} - -function addResizeLeft(element, min, max){ - if (!$(element)) return; - element = $(element); - - var instances = MUI.Columns.instances; - var instance = instances.get(element.id); - - var handle = element.getPrevious('.columnHandle'); - handle.setStyle('cursor', (Browser.Engine.webkit || Browser.Engine.gecko) ? 'col-resize' : 'e-resize'); - var partner = element.getPrevious('.column'); - if (!min) min = 50; - if (!max) max = 250; - if (MUI.ieLegacySupport){ - handle.addEvents({ - 'mousedown': function(){ - handle.setCapture(); - }, - 'mouseup': function(){ - handle.releaseCapture(); - } - }); - } - instance.resize = element.makeResizable({ - handle: handle, - modifiers: {x: 'width' , y: false}, - invert: true, - limit: { x: [min, max] }, - onStart: function(){ - $(element).getElements('iframe').setStyle('visibility','hidden'); - partner.getElements('iframe').setStyle('visibility','hidden'); - }.bind(this), - onDrag: function(){ - MUI.rWidth(element.getParent()); - }.bind(this), - onComplete: function(){ - MUI.rWidth(element.getParent()); - $(element).getElements('iframe').setStyle('visibility','visible'); - partner.getElements('iframe').setStyle('visibility','visible'); - instance.fireEvent('onResize'); - }.bind(this) - }); -} - -function addResizeBottom(element){ - if (!$(element)) return; - var element = $(element); - - var instances = MUI.Panels.instances; - var instance = instances.get(element.id); - var handle = instance.handleEl; - handle.setStyle('cursor', (Browser.Engine.webkit || Browser.Engine.gecko) ? 'row-resize' : 'n-resize'); - partner = instance.partner; - min = 0; - max = function(){ - return element.getStyle('height').toInt() + partner.getStyle('height').toInt(); - }.bind(this); - - if (MUI.ieLegacySupport) { - handle.addEvents({ - 'mousedown': function(){ - handle.setCapture(); - }, - 'mouseup': function(){ - handle.releaseCapture(); - } - }); - } - instance.resize = element.makeResizable({ - handle: handle, - modifiers: {x: false, y: 'height'}, - limit: { y: [min, max] }, - invert: false, - onBeforeStart: function(){ - partner = instance.partner; - this.originalHeight = element.getStyle('height').toInt(); - this.partnerOriginalHeight = partner.getStyle('height').toInt(); - }.bind(this), - onStart: function(){ - if (instance.iframeEl) { - if (!MUI.ieLegacySupport) { - instance.iframeEl.setStyle('visibility', 'hidden'); - partner.getElements('iframe').setStyle('visibility','hidden'); - } - else { - instance.iframeEl.hide(); - partner.getElements('iframe').hide(); - } - } - - }.bind(this), - onDrag: function(){ - partnerHeight = partnerOriginalHeight; - partnerHeight += (this.originalHeight - element.getStyle('height').toInt()); - partner.setStyle('height', partnerHeight); - MUI.resizeChildren(element, element.getStyle('height').toInt()); - MUI.resizeChildren(partner, partnerHeight); - element.getChildren('.column').each( function(column){ - MUI.panelHeight(column); - }); - partner.getChildren('.column').each( function(column){ - MUI.panelHeight(column); - }); - }.bind(this), - onComplete: function(){ - partnerHeight = partnerOriginalHeight; - partnerHeight += (this.originalHeight - element.getStyle('height').toInt()); - partner.setStyle('height', partnerHeight); - MUI.resizeChildren(element, element.getStyle('height').toInt()); - MUI.resizeChildren(partner, partnerHeight); - element.getChildren('.column').each( function(column){ - MUI.panelHeight(column); - }); - partner.getChildren('.column').each( function(column){ - MUI.panelHeight(column); - }); - if (instance.iframeEl) { - if (!MUI.ieLegacySupport) { - instance.iframeEl.setStyle('visibility', 'visible'); - partner.getElements('iframe').setStyle('visibility','visible'); - } - else { - instance.iframeEl.show(); - partner.getElements('iframe').show(); - // The following hack is to get IE8 Standards Mode to properly resize an iframe - // when only the vertical dimension is changed. - var width = instance.iframeEl.getStyle('width').toInt(); - instance.iframeEl.setStyle('width', width - 1); - MUI.rWidth(); - instance.iframeEl.setStyle('width', width); - } - } - instance.fireEvent('onResize'); - }.bind(this) - }); -} - -MUI.extend({ - /* - - Function: closeColumn - Destroys/removes a column. - - Syntax: - (start code) - MUI.closeColumn(); - (end) - - Arguments: - columnEl - the ID of the column to be closed - - Returns: - true - the column was closed - false - the column was not closed - - */ - closeColumn: function(columnEl){ - var instances = MUI.Columns.instances; - var instance = instances.get(columnEl.id); - if (columnEl != $(columnEl) || instance.isClosing) return; - - instance.isClosing = true; - - if (instance.options.sortable){ - instance.container.retrieve('sortables').removeLists(this.columnEl); - } - - // Destroy all the panels in the column. - var panels = columnEl.getChildren('.panel'); - panels.each(function(panel){ - MUI.closePanel($(panel.id)); - }.bind(this)); - - if (MUI.ieLegacySupport) { - columnEl.dispose(); - if (instance.handleEl != null) { - instance.handleEl.dispose(); - } - } - else { - columnEl.destroy(); - if (instance.handleEl != null) { - instance.handleEl.destroy(); - } - } - if (MUI.Desktop) { - MUI.Desktop.resizePanels(); - } - instances.erase(instance.options.id); - return true; - }, - /* - - Function: closePanel - Destroys/removes a panel. - - Syntax: - (start code) - MUI.closePanel(); - (end) - - Arguments: - panelEl - the ID of the panel to be closed - - Returns: - true - the panel was closed - false - the panel was not closed - - */ - closePanel: function(panelEl){ - var instances = MUI.Panels.instances; - var instance = instances.get(panelEl.id); - if (panelEl != $(panelEl) || instance.isClosing) return; - - var column = instance.options.column; - - instance.isClosing = true; - - var columnInstances = MUI.Columns.instances; - var columnInstance = columnInstances.get(column); - - if (columnInstance.options.sortable){ - columnInstance.options.container.retrieve('sortables').removeItems(instance.panelWrapperEl); - } - - instance.panelWrapperEl.destroy(); - - if (MUI.Desktop) { - MUI.Desktop.resizePanels(); - } - - // Do this when creating and removing panels - $(column).getChildren('.panelWrapper').each(function(panelWrapper){ - panelWrapper.getElement('.panel').removeClass('bottomPanel'); - }); - $(column).getChildren('.panelWrapper').getLast().getElement('.panel').addClass('bottomPanel'); - - instances.erase(instance.options.id); - return true; - - } -}); -/* - -Script: Dock.js - Implements the dock/taskbar. Enables window minimize. - -Copyright: - Copyright (c) 2007-2009 Greg Houston, . - -License: - MIT-style license. - -Requires: - Core.js, Window.js, Layout.js - -Todo: - - Make it so the dock requires no initial html markup. - -*/ - -MUI.files[MUI.path.source + 'Layout/Dock.js'] = 'loaded'; - -MUI.options.extend({ - // Naming options: - // If you change the IDs of the Mocha Desktop containers in your HTML, you need to change them here as well. - dockWrapper: 'dockWrapper', - dock: 'dock' -}); - -MUI.extend({ - /* - - Function: minimizeAll - Minimize all windows that are minimizable. - - */ - minimizeAll: function() { - $$('.mocha').each(function(windowEl){ - var instance = windowEl.retrieve('instance'); - if (!instance.isMinimized && instance.options.minimizable == true){ - MUI.Dock.minimizeWindow(windowEl); - } - }.bind(this)); - } -}); - -MUI.Dock = { - - options: { - useControls: true, // Toggles autohide and dock placement controls. - dockPosition: 'bottom', // Position the dock starts in, top or bottom. - // Style options - trueButtonColor: [70, 245, 70], // Color for autohide on - enabledButtonColor: [115, 153, 191], - disabledButtonColor: [170, 170, 170] - }, - - initialize: function(options){ - // Stops if MUI.Desktop is not implemented - if (!MUI.Desktop) return; - - MUI.dockVisible = true; - this.dockWrapper = $(MUI.options.dockWrapper); - this.dock = $(MUI.options.dock); - this.autoHideEvent = null; - this.dockAutoHide = false; // True when dock autohide is set to on, false if set to off - - if (!this.dockWrapper) return; - - if (!this.options.useControls){ - if($('dockPlacement')){ - $('dockPlacement').setStyle('cursor', 'default'); - } - if($('dockAutoHide')){ - $('dockAutoHide').setStyle('cursor', 'default'); - } - } - - this.dockWrapper.setStyles({ - 'display': 'block', - 'position': 'absolute', - 'top': null, - 'bottom': MUI.Desktop.desktopFooter ? MUI.Desktop.desktopFooter.offsetHeight : 0, - 'left': 0 - }); - - if (this.options.useControls){ - this.initializeDockControls(); - } - - // Add check mark to menu if link exists in menu - if ($('dockLinkCheck')){ - this.sidebarCheck = new Element('div', { - 'class': 'check', - 'id': 'dock_check' - }).inject($('dockLinkCheck')); - } - - this.dockSortables = new Sortables('#dockSort', { - opacity: 1, - constrain: true, - clone: false, - revert: false - }); - - MUI.Desktop.setDesktopSize(); - - if (MUI.myChain){ - MUI.myChain.callChain(); - } - - }, - - initializeDockControls: function(){ - - // Convert CSS colors to Canvas colors. - this.setDockColors(); - - if (this.options.useControls){ - // Insert canvas - var canvas = new Element('canvas', { - 'id': 'dockCanvas', - 'width': '15', - 'height': '18' - }).inject(this.dock); - - // Dynamically initialize canvas using excanvas. This is only required by IE - if (MUI.ieLegacySupport && MUI.ieSupport == 'excanvas'){ - G_vmlCanvasManager.initElement(canvas); - } - } - - var dockPlacement = $('dockPlacement'); - var dockAutoHide = $('dockAutoHide'); - - // Position top or bottom selector - dockPlacement.setProperty('title','Position Dock Top'); - - // Attach event - dockPlacement.addEvent('click', function(){ - this.moveDock(); - }.bind(this)); - - // Auto Hide toggle switch - dockAutoHide.setProperty('title','Turn Auto Hide On'); - - // Attach event Auto Hide - dockAutoHide.addEvent('click', function(event){ - if ( this.dockWrapper.getProperty('dockPosition') == 'top' ) - return false; - - var ctx = $('dockCanvas').getContext('2d'); - this.dockAutoHide = !this.dockAutoHide; // Toggle - if (this.dockAutoHide){ - $('dockAutoHide').setProperty('title', 'Turn Auto Hide Off'); - //ctx.clearRect(0, 11, 100, 100); - MUI.circle(ctx, 5 , 14, 3, this.options.trueButtonColor, 1.0); - - // Define event - this.autoHideEvent = function(event) { - if (!this.dockAutoHide) - return; - if (!MUI.Desktop.desktopFooter) { - var dockHotspotHeight = this.dockWrapper.offsetHeight; - if (dockHotspotHeight < 25) dockHotspotHeight = 25; - } - else if (MUI.Desktop.desktopFooter) { - var dockHotspotHeight = this.dockWrapper.offsetHeight + MUI.Desktop.desktopFooter.offsetHeight; - if (dockHotspotHeight < 25) dockHotspotHeight = 25; - } - if (!MUI.Desktop.desktopFooter && event.client.y > (document.getCoordinates().height - dockHotspotHeight)){ - if (!MUI.dockVisible){ - this.dockWrapper.show(); - MUI.dockVisible = true; - MUI.Desktop.setDesktopSize(); - } - } - else if (MUI.Desktop.desktopFooter && event.client.y > (document.getCoordinates().height - dockHotspotHeight)){ - if (!MUI.dockVisible){ - this.dockWrapper.show(); - MUI.dockVisible = true; - MUI.Desktop.setDesktopSize(); - } - } - else if (MUI.dockVisible){ - this.dockWrapper.hide(); - MUI.dockVisible = false; - MUI.Desktop.setDesktopSize(); - - } - }.bind(this); - - // Add event - document.addEvent('mousemove', this.autoHideEvent); - - } else { - $('dockAutoHide').setProperty('title', 'Turn Auto Hide On'); - //ctx.clearRect(0, 11, 100, 100); - MUI.circle(ctx, 5 , 14, 3, this.options.enabledButtonColor, 1.0); - // Remove event - document.removeEvent('mousemove', this.autoHideEvent); - } - - }.bind(this)); - - this.renderDockControls(); - - if (this.options.dockPosition == 'top'){ - this.moveDock(); - } - - }, - - setDockColors: function(){ - var dockButtonEnabled = MUI.getCSSRule('.dockButtonEnabled'); - if (dockButtonEnabled && dockButtonEnabled.style.backgroundColor){ - this.options.enabledButtonColor = new Color(dockButtonEnabled.style.backgroundColor); - } - - var dockButtonDisabled = MUI.getCSSRule('.dockButtonDisabled'); - if (dockButtonDisabled && dockButtonDisabled.style.backgroundColor){ - this.options.disabledButtonColor = new Color(dockButtonDisabled.style.backgroundColor); - } - - var trueButtonColor = MUI.getCSSRule('.dockButtonTrue'); - if (trueButtonColor && trueButtonColor.style.backgroundColor){ - this.options.trueButtonColor = new Color(trueButtonColor.style.backgroundColor); - } - }, - - renderDockControls: function(){ - // Draw dock controls - var ctx = $('dockCanvas').getContext('2d'); - ctx.clearRect(0, 0, 100, 100); - MUI.circle(ctx, 5 , 4, 3, this.options.enabledButtonColor, 1.0); - - if( this.dockWrapper.getProperty('dockPosition') == 'top'){ - MUI.circle(ctx, 5 , 14, 3, this.options.disabledButtonColor, 1.0) - } - else if (this.dockAutoHide){ - MUI.circle(ctx, 5 , 14, 3, this.options.trueButtonColor, 1.0); - } - else { - MUI.circle(ctx, 5 , 14, 3, this.options.enabledButtonColor, 1.0); - } - }, - - moveDock: function(){ - var ctx = $('dockCanvas').getContext('2d'); - // Move dock to top position - if (this.dockWrapper.getStyle('position') != 'relative'){ - this.dockWrapper.setStyles({ - 'position': 'relative', - 'bottom': null - }); - this.dockWrapper.addClass('top'); - MUI.Desktop.setDesktopSize(); - this.dockWrapper.setProperty('dockPosition','top'); - ctx.clearRect(0, 0, 100, 100); - MUI.circle(ctx, 5, 4, 3, this.options.enabledButtonColor, 1.0); - MUI.circle(ctx, 5, 14, 3, this.options.disabledButtonColor, 1.0); - $('dockPlacement').setProperty('title', 'Position Dock Bottom'); - $('dockAutoHide').setProperty('title', 'Auto Hide Disabled in Top Dock Position'); - this.dockAutoHide = false; - } - // Move dock to bottom position - else { - this.dockWrapper.setStyles({ - 'position': 'absolute', - 'bottom': MUI.Desktop.desktopFooter ? MUI.Desktop.desktopFooter.offsetHeight : 0 - }); - this.dockWrapper.removeClass('top'); - MUI.Desktop.setDesktopSize(); - this.dockWrapper.setProperty('dockPosition', 'bottom'); - ctx.clearRect(0, 0, 100, 100); - MUI.circle(ctx, 5, 4, 3, this.options.enabledButtonColor, 1.0); - MUI.circle(ctx, 5 , 14, 3, this.options.enabledButtonColor, 1.0); - $('dockPlacement').setProperty('title', 'Position Dock Top'); - $('dockAutoHide').setProperty('title', 'Turn Auto Hide On'); - } - }, - - createDockTab: function(windowEl){ - - var instance = windowEl.retrieve('instance'); - - var dockTab = new Element('div', { - 'id': instance.options.id + '_dockTab', - 'class': 'dockTab', - 'title': titleText - }).inject($('dockClear'), 'before'); - - dockTab.addEvent('mousedown', function(e){ - new Event(e).stop(); - this.timeDown = $time(); - }); - - dockTab.addEvent('mouseup', function(e){ - this.timeUp = $time(); - if ((this.timeUp - this.timeDown) < 275){ - // If the visibility of the windows on the page are toggled off, toggle visibility on. - if (MUI.Windows.windowsVisible == false) { - MUI.toggleWindowVisibility(); - if (instance.isMinimized == true) { - MUI.Dock.restoreMinimized.delay(25, MUI.Dock, windowEl); - } - else { - MUI.focusWindow(windowEl); - } - return; - } - // If window is minimized, restore window. - if (instance.isMinimized == true) { - MUI.Dock.restoreMinimized.delay(25, MUI.Dock, windowEl); - } - else{ - // If window is not minimized and is focused, minimize window. - if (instance.windowEl.hasClass('isFocused') && instance.options.minimizable == true){ - MUI.Dock.minimizeWindow(windowEl) - } - // If window is not minimized and is not focused, focus window. - else{ - MUI.focusWindow(windowEl); - } - // if the window is not minimized and is outside the viewport, center it in the viewport. - var coordinates = document.getCoordinates(); - if (windowEl.getStyle('left').toInt() > coordinates.width || windowEl.getStyle('top').toInt() > coordinates.height){ - MUI.centerWindow(windowEl); - } - } - } - }); - - this.dockSortables.addItems(dockTab); - - var titleText = instance.titleEl.innerHTML; - - var dockTabText = new Element('div', { - 'id': instance.options.id + '_dockTabText', - 'class': 'dockText' - }).set('html', titleText.substring(0,19) + (titleText.length > 19 ? '...' : '')).inject($(dockTab)); - - // If I implement this again, will need to also adjust the titleText truncate and the tab's - // left padding. - if (instance.options.icon != false){ - // dockTabText.setStyle('background', 'url(' + instance.options.icon + ') 4px 4px no-repeat'); - } - - // Need to resize everything in case the dock wraps when a new tab is added - MUI.Desktop.setDesktopSize(); - - }, - - makeActiveTab: function(){ - - // getWindowWith HighestZindex is used in case the currently focused window - // is closed. - var windowEl = MUI.getWindowWithHighestZindex(); - var instance = windowEl.retrieve('instance'); - - $$('.dockTab').removeClass('activeDockTab'); - if (instance.isMinimized != true) { - - instance.windowEl.addClass('isFocused'); - - var currentButton = $(instance.options.id + '_dockTab'); - if (currentButton != null) { - currentButton.addClass('activeDockTab'); - } - } - else { - instance.windowEl.removeClass('isFocused'); - } - }, - - minimizeWindow: function(windowEl){ - if (windowEl != $(windowEl)) return; - - var instance = windowEl.retrieve('instance'); - instance.isMinimized = true; - - // Hide iframe - // Iframe should be hidden when minimizing, maximizing, and moving for performance and Flash issues - if ( instance.iframeEl ) { - // Some elements are still visible in IE8 in the iframe when the iframe's visibility is set to hidden. - if (!MUI.ieLegacySupport) { - instance.iframeEl.setStyle('visibility', 'hidden'); - } - else { - instance.iframeEl.hide(); - } - } - - // Hide window and add to dock - instance.contentBorderEl.setStyle('visibility', 'hidden'); - if(instance.toolbarWrapperEl){ - instance.toolbarWrapperEl.hide(); - } - windowEl.setStyle('visibility', 'hidden'); - - MUI.Desktop.setDesktopSize(); - - // Have to use timeout because window gets focused when you click on the minimize button - setTimeout(function(){ - windowEl.setStyle('zIndex', 1); - windowEl.removeClass('isFocused'); - this.makeActiveTab(); - }.bind(this),100); - - instance.fireEvent('onMinimize', windowEl); - }, - - restoreMinimized: function(windowEl) { - - var instance = windowEl.retrieve('instance'); - - if (instance.isMinimized == false) return; - - if (MUI.Windows.windowsVisible == false){ - MUI.toggleWindowVisibility(); - } - - MUI.Desktop.setDesktopSize(); - - // Part of Mac FF2 scrollbar fix - if (instance.options.scrollbars == true && !instance.iframeEl){ - instance.contentWrapperEl.setStyle('overflow', 'auto'); - } - - if (instance.isCollapsed) { - MUI.collapseToggle(windowEl); - } - - windowEl.setStyle('visibility', 'visible'); - instance.contentBorderEl.setStyle('visibility', 'visible'); - if(instance.toolbarWrapperEl){ - instance.toolbarWrapperEl.show(); - } - - // Show iframe - if (instance.iframeEl){ - if (!MUI.ieLegacySupport){ - instance.iframeEl.setStyle('visibility', 'visible'); - } - else { - instance.iframeEl.show(); - } - } - - instance.isMinimized = false; - MUI.focusWindow(windowEl); - instance.fireEvent('onRestore', windowEl); - - } -}; -/* - -Script: Workspaces.js - Save and load workspaces. The Workspaces emulate Adobe Illustrator functionality remembering what windows are open and where they are positioned. - -Copyright: - Copyright (c) 2007-2009 Greg Houston, . - -License: - MIT-style license. - -Requires: - Core.js, Window.js - -To do: - - Move to Window - -*/ - -MUI.files[MUI.path.source + 'Layout/Workspaces.js'] = 'loaded'; - -MUI.extend({ - /* - - Function: saveWorkspace - Save the current workspace. - - Syntax: - (start code) - MUI.saveWorkspace(); - (end) - - Notes: - This version saves the ID of each open window to a cookie, and reloads those windows using the functions in mocha-init.js. This requires that each window have a function in mocha-init.js used to open them. Functions must be named the windowID + "Window". So if your window is called mywindow, it needs a function called mywindowWindow in mocha-init.js. - - */ - saveWorkspace: function(){ - this.cookie = new Hash.Cookie('mochaUIworkspaceCookie', {duration: 3600}); - this.cookie.empty(); - MUI.Windows.instances.each(function(instance) { - instance.saveValues(); - this.cookie.set(instance.options.id, { - 'id': instance.options.id, - 'top': instance.options.y, - 'left': instance.options.x, - 'width': instance.contentWrapperEl.getStyle('width').toInt(), - 'height': instance.contentWrapperEl.getStyle('height').toInt() - }); - }.bind(this)); - this.cookie.save(); - - new MUI.Window({ - loadMethod: 'html', - type: 'notification', - addClass: 'notification', - content: 'Workspace saved.', - closeAfter: '1400', - width: 200, - height: 40, - y: 53, - padding: { top: 10, right: 12, bottom: 10, left: 12 }, - shadowBlur: 5, - bodyBgColor: [255, 255, 255] - }); - - }, - windowUnload: function(){ - if ($$('.mocha').length == 0 && this.myChain){ - this.myChain.callChain(); - } - }, - loadWorkspace2: function(workspaceWindows){ - workspaceWindows.each(function(workspaceWindow){ - windowFunction = eval('MUI.' + workspaceWindow.id + 'Window'); - if (windowFunction){ - eval('MUI.' + workspaceWindow.id + 'Window({width:'+ workspaceWindow.width +',height:' + workspaceWindow.height + '});'); - var windowEl = $(workspaceWindow.id); - windowEl.setStyles({ - 'top': workspaceWindow.top, - 'left': workspaceWindow.left - }); - var instance = windowEl.retrieve('instance'); - instance.contentWrapperEl.setStyles({ - 'width': workspaceWindow.width, - 'height': workspaceWindow.height - }); - instance.drawWindow(); - } - }.bind(this)); - this.loadingWorkspace = false; - }, - /* - - Function: loadWorkspace - Load the saved workspace. - - Syntax: - (start code) - MUI.loadWorkspace(); - (end) - - */ - loadWorkspace: function(){ - cookie = new Hash.Cookie('mochaUIworkspaceCookie', {duration: 3600}); - workspaceWindows = cookie.load(); - - if(!cookie.getKeys().length){ - new MUI.Window({ - loadMethod: 'html', - type: 'notification', - addClass: 'notification', - content: 'You have no saved workspace.', - closeAfter: '1400', - width: 220, - height: 40, - y: 25, - padding: { top: 10, right: 12, bottom: 10, left: 12 }, - shadowBlur: 5, - bodyBgColor: [255, 255, 255] - }); - return; - } - - if ($$('.mocha').length != 0){ - this.loadingWorkspace = true; - this.myChain = new Chain(); - this.myChain.chain( - function(){ - $$('.mocha').each(function(el) { - this.closeWindow(el); - }.bind(this)); - }.bind(this), - function(){ - this.loadWorkspace2(workspaceWindows); - }.bind(this) - ); - this.myChain.callChain(); - } - else { - this.loadWorkspace2(workspaceWindows); - } - - } -}); diff -Nru qbittorrent-4.1.3/src/webui/www/private/scripts/lib/mocha-yc.js qbittorrent-3.3.15/src/webui/www/private/scripts/lib/mocha-yc.js --- qbittorrent-4.1.3/src/webui/www/private/scripts/lib/mocha-yc.js 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/scripts/lib/mocha-yc.js 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -var MUI=MochaUI=new Hash({version:"0.9.6 development",options:new Hash({theme:"default",advancedEffects:false,standardEffects:true}),path:{source:"scripts/source/",themes:"themes/",plugins:"plugins/"},themePath:function(){return MUI.path.themes+MUI.options.theme+"/"},files:new Hash()});MUI.files[MUI.path.source+"Core/Core.js"]="loaded";MUI.extend({Windows:{instances:new Hash()},ieSupport:"excanvas",ieLegacySupport:Browser.Engine.trident&&Browser.version<9,updateContent:function(c){var c=$extend({element:null,childElement:null,method:null,data:null,title:null,content:null,loadMethod:null,url:null,scrollbars:null,padding:null,require:{},onContentLoaded:$empty},c);c.require=$extend({css:[],images:[],js:[],onload:null},c.require);var b={};if(!c.element){return}var d=c.element;if(MUI.Windows.instances.get(d.id)){b.recipient="window"}else{b.recipient="panel"}var a=d.retrieve("instance");if(c.title){a.titleEl.set("html",c.title)}var e=a.contentEl;b.contentContainer=c.childElement!=null?c.childElement:a.contentEl;var g=a.contentWrapperEl;if(!c.loadMethod){if(!a.options.loadMethod){if(!c.url){c.loadMethod="html"}else{c.loadMethod="xhr"}}else{c.loadMethod=a.options.loadMethod}}var f=c.scrollbars||a.options.scrollbars;if(b.contentContainer==a.contentEl){g.setStyles({overflow:f!=false&&c.loadMethod!="iframe"?"auto":"hidden"})}if(c.padding!=null){e.setStyles({"padding-top":c.padding.top,"padding-bottom":c.padding.bottom,"padding-left":c.padding.left,"padding-right":c.padding.right})}if(b.contentContainer==e){e.empty().show();e.getAllNext(".column").destroy();e.getAllNext(".columnHandle").destroy()}b.onContentLoaded=function(){if(c.require.js.length||typeof c.require.onload=="function"){new MUI.Require({js:c.require.js,onload:function(){if(!$defined(c.require.onload)){return}if(Browser.Engine.presto){c.require.onload.delay(100)}else{c.require.onload()}c.onContentLoaded?c.onContentLoaded():a.fireEvent("onContentLoaded",d)}.bind(this)})}else{c.onContentLoaded?c.onContentLoaded():a.fireEvent("onContentLoaded",d)}};if(c.require.css.length||c.require.images.length){new MUI.Require({css:c.require.css,images:c.require.images,onload:function(){this.loadSelect(a,c,b)}.bind(this)})}else{this.loadSelect(a,c,b)}},loadSelect:function(a,c,b){switch(c.loadMethod){case"xhr":this.updateContentXHR(a,c,b);break;case"iframe":this.updateContentIframe(a,c,b);break;case"html":default:this.updateContentHTML(a,c,b);break}},updateContentXHR:function(a,c,b){var f=a.contentEl;var e=b.contentContainer;var d=b.onContentLoaded;new Request.HTML({url:c.url,update:e,method:c.method!=null?c.method:"get",data:c.data!=null?new Hash(c.data).toQueryString():"",evalScripts:a.options.evalScripts,evalResponse:a.options.evalResponse,onRequest:function(){if(b.recipient=="window"&&e==f){a.showSpinner()}else{if(b.recipient=="panel"&&e==f&&$("spinner")){$("spinner").show()}}}.bind(this),onFailure:function(g){if(e==f){var j=new RegExp("[\n\rs]*(.*)[\n\rs]*","gmi");var h=j.exec(g.responseText);if(!h){h="Unknown"}e.set("html","

    Error: "+h+"

    ");if(b.recipient=="window"){a.hideSpinner()}else{if(b.recipient=="panel"&&$("spinner")){$("spinner").hide()}}}}.bind(this),onSuccess:function(){if(e==f){if(b.recipient=="window"){a.hideSpinner()}else{if(b.recipient=="panel"&&$("spinner")){$("spinner").hide()}}}Browser.Engine.trident4?d.delay(750):d()}.bind(this),onComplete:function(){}.bind(this)}).send()},updateContentIframe:function(a,c,b){var f=a.contentEl;var e=b.contentContainer;var g=a.contentWrapperEl;var d=b.onContentLoaded;if(a.options.contentURL==""||e!=f){return}a.iframeEl=new Element("iframe",{id:a.options.id+"_iframe",name:a.options.id+"_iframe","class":"mochaIframe",src:c.url,marginwidth:0,marginheight:0,frameBorder:0,scrolling:"auto",styles:{height:g.offsetHeight-g.getStyle("margin-top").toInt()-g.getStyle("margin-bottom").toInt(),width:a.panelEl?g.offsetWidth-g.getStyle("margin-left").toInt()-g.getStyle("margin-right").toInt():"100%"}}).injectInside(f);a.iframeEl.addEvent("load",function(h){if(b.recipient=="window"){a.hideSpinner()}else{if(b.recipient=="panel"&&e==f&&$("spinner")){$("spinner").hide()}}Browser.Engine.trident4?d.delay(50):d()}.bind(this));if(b.recipient=="window"){a.showSpinner()}else{if(b.recipient=="panel"&&e==f&&$("spinner")){$("spinner").show()}}},updateContentHTML:function(a,c,b){var f=a.contentEl;var e=b.contentContainer;var d=b.onContentLoaded;var g=new Array("element","textnode","whitespace","collection");if(g.contains($type(c.content))){c.content.inject(e)}else{e.set("html",c.content)}if(e==f){if(b.recipient=="window"){a.hideSpinner()}else{if(b.recipient=="panel"&&$("spinner")){$("spinner").hide()}}}Browser.Engine.trident4?d.delay(50):d()},reloadIframe:function(a){Browser.Engine.gecko?$(a).src=$(a).src:top.frames[a].location.reload(true)},roundedRect:function(f,d,j,h,c,b,g,e){f.fillStyle="rgba("+g.join(",")+","+e+")";f.beginPath();f.moveTo(d,j+b);f.lineTo(d,j+c-b);f.quadraticCurveTo(d,j+c,d+b,j+c);f.lineTo(d+h-b,j+c);f.quadraticCurveTo(d+h,j+c,d+h,j+c-b);f.lineTo(d+h,j+b);f.quadraticCurveTo(d+h,j,d+h-b,j);f.lineTo(d+b,j);f.quadraticCurveTo(d,j,d,j+b);f.fill()},triangle:function(e,c,h,g,b,f,d){e.beginPath();e.moveTo(c+g,h);e.lineTo(c,h+b);e.lineTo(c+g,h+b);e.closePath();e.fillStyle="rgba("+f.join(",")+","+d+")";e.fill()},circle:function(d,b,g,f,e,c){d.beginPath();d.arc(b,g,f,0,Math.PI*2,true);d.fillStyle="rgba("+e.join(",")+","+c+")";d.fill()},notification:function(a){new MUI.Window({loadMethod:"html",closeAfter:1500,type:"notification",addClass:"notification",content:a,width:220,height:40,y:53,padding:{top:10,right:12,bottom:10,left:12},shadowBlur:5})},toggleAdvancedEffects:function(a){if(MUI.options.advancedEffects==false){MUI.options.advancedEffects=true;if(a){this.toggleAdvancedEffectsLink=new Element("div",{"class":"check",id:"toggleAdvancedEffects_check"}).inject(a)}}else{MUI.options.advancedEffects=false;if(this.toggleAdvancedEffectsLink){this.toggleAdvancedEffectsLink.destroy()}}},toggleStandardEffects:function(a){if(MUI.options.standardEffects==false){MUI.options.standardEffects=true;if(a){this.toggleStandardEffectsLink=new Element("div",{"class":"check",id:"toggleStandardEffects_check"}).inject(a)}}else{MUI.options.standardEffects=false;if(this.toggleStandardEffectsLink){this.toggleStandardEffectsLink.destroy()}}},underlayInitialize:function(){var a=new Element("div",{id:"windowUnderlay",styles:{height:parent.getCoordinates().height,opacity:0.01,display:"none"}}).inject(document.body)},setUnderlaySize:function(){$("windowUnderlay").setStyle("height",parent.getCoordinates().height)}});function fixPNG(e){if(Browser.Engine.trident4&&document.body.filters){var b=(e.id)?"id='"+e.id+"' ":"";var d=(e.className)?"class='"+e.className+"' ":"";var f=(e.title)?"title='"+e.title+"' ":"title='"+e.alt+"' ";var c="display:inline-block;"+e.style.cssText;var a="";e.outerHTML=a}}document.addEvent("mousedown",function(a){MUI.blurAll.delay(50)});window.addEvent("domready",function(){MUI.underlayInitialize()});window.addEvent("resize",function(){if($("windowUnderlay")){MUI.setUnderlaySize()}else{MUI.underlayInitialize()}});Element.implement({hide:function(){this.setStyle("display","none");return this},show:function(){this.setStyle("display","block");return this}});Element.implement({shake:function(b,h){b=b||3;h=h||500;h=(h/50).toInt()-1;var e=this.getParent();if(e!=$(document.body)&&e.getStyle("position")=="static"){e.setStyle("position","relative")}var a=this.getStyle("position");if(a=="static"){this.setStyle("position","relative");a="relative"}if(MUI.ieLegacySupport){e.setStyle("height",e.getStyle("height"))}var g=this.getPosition(e);if(a=="relative"&&!Browser.Engine.presto){g.x-=e.getStyle("paddingLeft").toInt();g.y-=e.getStyle("paddingTop").toInt()}var f=this.retrieve("morph");if(f){f.cancel();var c=f.options}var f=this.get("morph",{duration:50,link:"chain"});for(var d=0;d]*>([\s\S]*?)<\/body>/i);c=(b)?b[1]:c;var a=new Element("div");return a.set("html",c)}});MUI.getCSSRule=function(b){for(var c=0;c=200)&&(a<300))}});Browser.Request=function(){return $try(function(){return new ActiveXObject("MSXML2.XMLHTTP")},function(){return new XMLHttpRequest()})}}MUI.Require=new Class({Implements:[Options],options:{css:[],images:[],js:[],onload:$empty},initialize:function(a){this.setOptions(a);var a=this.options;this.assetsToLoad=a.css.length+a.images.length+a.js.length;this.assetsLoaded=0;var b=0;if(a.css.length){a.css.each(function(c){this.getAsset(c,function(){if(b==a.css.length-1){if(this.assetsLoaded==this.assetsToLoad-1){this.requireOnload()}else{this.assetsLoaded++;this.requireContinue.delay(50,this)}}else{b++;this.assetsLoaded++}}.bind(this))}.bind(this))}else{if(!a.js.length&&!a.images.length){this.options.onload();return true}else{this.requireContinue.delay(50,this)}}},requireOnload:function(){this.assetsLoaded++;if(this.assetsLoaded==this.assetsToLoad){this.options.onload();return true}},requireContinue:function(){var a=this.options;if(a.images.length){a.images.each(function(b){this.getAsset(b,this.requireOnload.bind(this))}.bind(this))}if(a.js.length){a.js.each(function(b){this.getAsset(b,this.requireOnload.bind(this))}.bind(this))}},getAsset:function(b,c){if(MUI.files[b]=="loaded"){if(typeof c=="function"){c()}return true}else{if(MUI.files[b]=="loading"){var d=0;var a=(function(){d++;if(MUI.files[b]=="loading"&&d<"100"){return}$clear(a);if(typeof c=="function"){c()}}).periodical(50)}else{MUI.files[b]="loading";properties={onload:c!="undefined"?c:$empty};var e=properties.onload;properties.onload=function(){MUI.files[b]="loaded";if(e){e()}}.bind(this);switch(b.match(/\.\w+$/)[0]){case".js":return Asset.javascript(b,properties);case".css":return Asset.css(b,properties);case".jpg":case".png":case".gif":return Asset.image(b,properties)}alert('The required file "'+b+'" could not be loaded')}}}});$extend(Asset,{javascript:function(f,d){d=$extend({onload:$empty,document:document,check:$lambda(true)},d);if($(d.id)){d.onload();return $(d.id)}var b=new Element("script",{src:f,type:"text/javascript"});var e=d.onload.bind(b),a=d.check,g=d.document;delete d.onload;delete d.check;delete d.document;if(!Browser.Engine.webkit419&&!Browser.Engine.presto){b.addEvents({load:e,readystatechange:function(){if(MUI.ieLegacySupport&&["loaded","complete"].contains(this.readyState)){e()}}}).setProperties(d)}else{var c=(function(){if(!$try(a)){return}$clear(c);Browser.Engine.presto?e.delay(500):e()}).periodical(50)}return b.inject(g.head)},css:function(b,a){a=$extend({id:null,media:"screen",onload:$empty},a);new Request({method:"get",url:b,onComplete:function(c){var d=new Element("link",{id:a.id,rel:"stylesheet",media:a.media,type:"text/css",href:b}).inject(document.head);a.onload()}.bind(this),onFailure:function(c){},onSuccess:function(){}.bind(this)}).send()}});MUI.extend({newWindowsFromJSON:function(a){new MUI.Require({js:[MUI.path.source+"Window/Windows-from-json.js"],onload:function(){new MUI.newWindowsFromJSON(a)}})},arrangeCascade:function(){new MUI.Require({js:[MUI.path.source+"Window/Arrange-cascade.js"],onload:function(){new MUI.arrangeCascade()}})},arrangeTile:function(){new MUI.Require({js:[MUI.path.source+"Window/Arrange-tile.js"],onload:function(){new MUI.arrangeTile()}})},saveWorkspace:function(){new MUI.Require({js:[MUI.path.source+"Layout/Workspaces.js"],onload:function(){new MUI.saveWorkspace()}})},loadWorkspace:function(){new MUI.Require({js:[MUI.path.source+"Layout/Workspaces.js"],onload:function(){new MUI.loadWorkspace()}})},Themes:{init:function(a){new MUI.Require({js:[MUI.path.source+"Utilities/Themes.js"],onload:function(){MUI.Themes.init(a)}})}}});MUI.files[MUI.path.source+"Utilities/Themes.js"]=1;MUI.Themes={init:function(a){this.newTheme=a.toLowerCase();if(!this.newTheme||this.newTheme==null||this.newTheme==MUI.options.theme.toLowerCase()){return}if($("spinner")){$("spinner").show()}this.oldURIs=[];this.oldSheets=[];$$("link").each(function(c){var b=c.get("href");if(b.contains(MUI.path.themes+MUI.options.theme)){this.oldURIs.push(b);this.oldSheets.push(c)}}.bind(this));this.newSheetURLs=this.oldURIs.map(function(c,b){return c.replace("/"+MUI.options.theme+"/","/"+MUI.Themes.newTheme+"/")}.bind(this));this.sheetsToLoad=this.oldURIs.length;this.sheetsLoaded=0;this.newSheets=[];this.newSheetURLs.each(function(d){var b=d;var c=new Request({method:"get",url:b,onComplete:function(e){var f=new Element("link",{rel:"stylesheet",media:"screen",type:"text/css",href:b});this.newSheets.push(f)}.bind(this),onFailure:function(e){this.themeLoadSuccess=false;if($("spinner")){$("spinner").hide()}MUI.notification("Stylesheets did not load.")},onSuccess:function(){this.sheetsLoaded++;if(this.sheetsLoaded==this.sheetsToLoad){this.updateThemeStylesheets();this.themeLoadSuccess=true}}.bind(this)});c.send()}.bind(this))},updateThemeStylesheets:function(){this.oldSheets.each(function(a){a.destroy()});this.newSheets.each(function(a){MUI.files[a.get("href")]=1;a.inject(document.head)});if(MUI.ieLegacySupport){this.redraw.delay(1250,this)}else{this.redraw.delay(250,this)}},redraw:function(){$$(".replaced").removeClass("replaced");$$(".mocha").each(function(c){var b=c.retrieve("instance");b.setColors();b.drawWindow()});if(MUI.Dock){if(MUI.Dock.options.useControls){MUI.Dock.setDockColors();MUI.Dock.renderDockControls()}}if(MUI.Desktop.desktop){var a=(function(){if(MUI.Desktop.desktop.getStyle("overflow")!="hidden"){return}$clear(a);MUI.Desktop.setDesktopSize()}).periodical(50)}if($("spinner")){$("spinner").hide()}MUI.options.theme=this.newTheme}};window.addEvent("load",function(){if($("themeControl")){$("themeControl").getElements("option").setProperty("selected","false");if($("chooseTheme")){$("chooseTheme").setProperty("selected","true")}}});MUI.files[MUI.path.source+"Window/Window.js"]="loading";MUI.extend({Windows:{instances:new Hash(),indexLevel:100,windowIDCount:0,windowsVisible:true,focusingWindow:false}});MUI.Windows.windowOptions={id:null,title:"New Window",icon:false,type:"window",require:{css:[],images:[],js:[],onload:null},loadMethod:null,method:"get",contentURL:null,data:null,closeAfter:false,evalScripts:true,evalResponse:false,content:"Window content",toolbar:false,toolbarPosition:"top",toolbarHeight:29,toolbarURL:"pages/lipsum.html",toolbarData:null,toolbarContent:"",toolbarOnload:$empty,toolbar2:false,toolbar2Position:"bottom",toolbar2Height:29,toolbar2URL:"pages/lipsum.html",toolbar2Data:null,toolbar2Content:"",toolbar2Onload:$empty,container:null,restrict:true,shape:"box",collapsible:true,minimizable:true,maximizable:true,closable:true,storeOnClose:false,modalOverlayClose:true,draggable:null,draggableGrid:false,draggableLimit:false,draggableSnap:false,resizable:null,resizeLimit:{x:[250,2500],y:[125,2000]},addClass:"",width:300,height:125,headerHeight:25,footerHeight:25,cornerRadius:8,x:null,y:null,scrollbars:true,padding:{top:10,right:12,bottom:10,left:12},shadowBlur:5,shadowOffset:{x:0,y:1},controlsOffset:{right:6,top:6},useCanvas:true,useCanvasControls:true,useSpinner:true,headerStartColor:[250,250,250],headerStopColor:[229,229,229],bodyBgColor:[229,229,229],minimizeBgColor:[255,255,255],minimizeColor:[0,0,0],maximizeBgColor:[255,255,255],maximizeColor:[0,0,0],closeBgColor:[255,255,255],closeColor:[0,0,0],resizableColor:[254,254,254],onBeforeBuild:$empty,onContentLoaded:$empty,onFocus:$empty,onBlur:$empty,onResize:$empty,onMinimize:$empty,onMaximize:$empty,onRestore:$empty,onClose:$empty,onCloseComplete:$empty};MUI.Windows.windowOptionsOriginal=$merge(MUI.Windows.windowOptions);MUI.Window=new Class({Implements:[Events,Options],options:MUI.Windows.windowOptions,initialize:function(a){this.setOptions(a);var a=this.options;$extend(this,{mochaControlsWidth:0,minimizebuttonX:0,maximizebuttonX:0,closebuttonX:0,headerFooterShadow:a.headerHeight+a.footerHeight+(a.shadowBlur*2),oldTop:0,oldLeft:0,isMaximized:false,isMinimized:false,isCollapsed:false,timestamp:$time()});if(a.type!="window"){a.container=document.body;a.minimizable=false}if(!a.container){a.container=MUI.Desktop&&MUI.Desktop.desktop?MUI.Desktop.desktop:document.body}if(a.resizable==null){if(a.type!="window"||a.shape=="gauge"){a.resizable=false}else{a.resizable=true}}if(a.draggable==null){a.draggable=a.type!="window"?false:true}if(a.shape=="gauge"||a.type=="notification"){a.collapsible=false;a.maximizable=false;a.contentBgColor="transparent";a.scrollbars=false;a.footerHeight=0}if(a.type=="notification"){a.closable=false;a.headerHeight=0}if(MUI.Dock&&$(MUI.options.dock)){if(MUI.Dock.dock&&a.type!="modal"&&a.type!="modal2"){a.minimizable=a.minimizable}}else{a.minimizable=false}a.maximizable=MUI.Desktop&&MUI.Desktop.desktop&&a.maximizable&&a.type!="modal"&&a.type!="modal2";if(this.options.type=="modal2"){this.options.shadowBlur=0;this.options.shadowOffset={x:0,y:0};this.options.useSpinner=false;this.options.useCanvas=false;this.options.footerHeight=0;this.options.headerHeight=0}a.id=a.id||"win"+(++MUI.Windows.windowIDCount);this.windowEl=$(a.id);if(a.require.css.length||a.require.images.length){new MUI.Require({css:a.require.css,images:a.require.images,onload:function(){this.newWindow()}.bind(this)})}else{this.newWindow()}return this},saveValues:function(){var a=this.windowEl.getCoordinates();this.options.x=a.left.toInt();this.options.y=a.top.toInt()},newWindow:function(c){var a=MUI.Windows.instances;var j=MUI.Windows.instances.get(this.options.id);var k=this.options;if(j){var h=j}if(this.windowEl&&!this.isClosing){if(h.isMinimized){MUI.Dock.restoreMinimized(this.windowEl)}else{if(h.isCollapsed){MUI.collapseToggle(this.windowEl);setTimeout(MUI.focusWindow.pass(this.windowEl,this),10)}else{if(this.windowEl.hasClass("windowClosed")){if(h.check){h.check.show()}this.windowEl.removeClass("windowClosed");this.windowEl.setStyle("opacity",0);this.windowEl.addClass("mocha");if(MUI.Dock&&$(MUI.options.dock)&&h.options.type=="window"){var f=$(h.options.id+"_dockTab");if(f!=null){f.show()}MUI.Desktop.setDesktopSize()}h.displayNewWindow()}else{var g=document.getCoordinates();if(this.windowEl.getStyle("left").toInt()>g.width||this.windowEl.getStyle("top").toInt()>g.height){MUI.centerWindow(this.windowEl)}setTimeout(MUI.focusWindow.pass(this.windowEl,this),10);if(MUI.options.standardEffects==true){this.windowEl.shake()}}}}return}else{a.set(k.id,this)}this.isClosing=false;this.fireEvent("onBeforeBuild");MUI.Windows.indexLevel++;this.windowEl=new Element("div",{"class":"mocha",id:k.id,styles:{position:"absolute",width:k.width,height:k.height,display:"block",opacity:0,zIndex:MUI.Windows.indexLevel+=2}});this.windowEl.store("instance",this);this.windowEl.addClass(k.addClass);if(k.type=="modal2"){this.windowEl.addClass("modal2")}if(MUI.ieLegacySupport&&k.shape=="gauge"){this.windowEl.setStyle("backgroundImage","url(../images/skin/spacer.gif)")}if(k.loadMethod=="iframe"){k.padding={top:0,right:0,bottom:0,left:0}}this.insertWindowElements();this.titleEl.set("html",k.title);this.contentWrapperEl.setStyle("overflow","hidden");this.contentEl.setStyles({"padding-top":k.padding.top,"padding-bottom":k.padding.bottom,"padding-left":k.padding.left,"padding-right":k.padding.right});if(k.shape=="gauge"){if(k.useCanvasControls){this.canvasControlsEl.setStyle("visibility","hidden")}else{this.controlsEl.setStyle("visibility","hidden")}this.windowEl.addEvent("mouseover",function(){this.mouseover=true;var l=function(){if(this.mouseover!=false){if(k.useCanvasControls){this.canvasControlsEl.setStyle("visibility","visible")}else{this.controlsEl.setStyle("visibility","visible")}this.canvasHeaderEl.setStyle("visibility","visible");this.titleEl.show()}};l.delay(0,this)}.bind(this));this.windowEl.addEvent("mouseleave",function(){this.mouseover=false;if(this.options.useCanvasControls){this.canvasControlsEl.setStyle("visibility","hidden")}else{this.controlsEl.setStyle("visibility","hidden")}this.canvasHeaderEl.setStyle("visibility","hidden");this.titleEl.hide()}.bind(this))}this.windowEl.inject(k.container);this.setColors();if(k.type!="notification"){this.setMochaControlsWidth()}MUI.updateContent({element:this.windowEl,content:k.content,method:k.method,url:k.contentURL,data:k.data,onContentLoaded:null,require:{js:k.require.js,onload:k.require.onload}});if(this.options.toolbar==true){MUI.updateContent({element:this.windowEl,childElement:this.toolbarEl,content:k.toolbarContent,loadMethod:"xhr",method:k.method,url:k.toolbarURL,data:k.toolbarData,onContentLoaded:k.toolbarOnload})}if(this.options.toolbar2==true){MUI.updateContent({element:this.windowEl,childElement:this.toolbar2El,content:k.toolbar2Content,loadMethod:"xhr",method:k.method,url:k.toolbar2URL,data:k.toolbar2Data,onContentLoaded:k.toolbar2Onload})}this.drawWindow();this.attachDraggable();this.attachResizable();this.setupEvents();if(k.resizable){this.adjustHandles()}if(k.container==document.body||k.container==MUI.Desktop.desktop){var b=window.getSize()}else{var b=$(this.options.container).getSize()}if(!k.y){if(MUI.Desktop&&MUI.Desktop.desktop){var d=(b.y*0.5)-(this.windowEl.offsetHeight*0.5);if(d<-k.shadowBlur){d=-k.shadowBlur}}else{var d=window.getScroll().y+(window.getSize().y*0.5)-(this.windowEl.offsetHeight*0.5);if(d<-k.shadowBlur){d=-k.shadowBlur}}}else{var d=k.y-k.shadowBlur}if(!this.options.x){var e=(b.x*0.5)-(this.windowEl.offsetWidth*0.5);if(e<-k.shadowBlur){e=-k.shadowBlur}}else{var e=k.x-k.shadowBlur}this.windowEl.setStyles({top:d,left:e});this.opacityMorph=new Fx.Morph(this.windowEl,{duration:350,transition:Fx.Transitions.Sine.easeInOut,onComplete:function(){if(MUI.ieLegacySupport){this.drawWindow()}}.bind(this)});this.displayNewWindow();this.morph=new Fx.Morph(this.windowEl,{duration:200});this.windowEl.store("morph",this.morph);this.resizeMorph=new Fx.Elements([this.contentWrapperEl,this.windowEl],{duration:400,transition:Fx.Transitions.Sine.easeInOut,onStart:function(){this.resizeAnimation=this.drawWindow.periodical(20,this)}.bind(this),onComplete:function(){$clear(this.resizeAnimation);this.drawWindow();if(this.iframeEl){this.iframeEl.setStyle("visibility","visible")}}.bind(this)});this.windowEl.store("resizeMorph",this.resizeMorph);if($(this.windowEl.id+"LinkCheck")){this.check=new Element("div",{"class":"check",id:this.options.id+"_check"}).inject(this.windowEl.id+"LinkCheck")}if(this.options.closeAfter!=false){MUI.closeWindow.delay(this.options.closeAfter,this,this.windowEl)}if(MUI.Dock&&$(MUI.options.dock)&&this.options.type=="window"){MUI.Dock.createDockTab(this.windowEl)}},displayNewWindow:function(){options=this.options;if(options.type=="modal"||options.type=="modal2"){MUI.currentModal=this.windowEl;if(Browser.Engine.trident4){$("modalFix").show()}$("modalOverlay").show();if(MUI.options.advancedEffects==false){$("modalOverlay").setStyle("opacity",0.6);this.windowEl.setStyles({zIndex:11000,opacity:1})}else{MUI.Modal.modalOverlayCloseMorph.cancel();MUI.Modal.modalOverlayOpenMorph.start({opacity:0.6});this.windowEl.setStyles({zIndex:11000});this.opacityMorph.start({opacity:1})}$$(".dockTab").removeClass("activeDockTab");$$(".mocha").removeClass("isFocused");this.windowEl.addClass("isFocused")}else{if(MUI.options.advancedEffects==false){this.windowEl.setStyle("opacity",1);setTimeout(MUI.focusWindow.pass(this.windowEl,this),10)}else{if(MUI.ieLegacySupport){this.drawWindow(false)}this.opacityMorph.start({opacity:1});setTimeout(MUI.focusWindow.pass(this.windowEl,this),10)}}},setupEvents:function(){var a=this.windowEl;if(this.closeButtonEl){this.closeButtonEl.addEvent("click",function(b){new Event(b).stop();MUI.closeWindow(a)}.bind(this))}if(this.options.type=="window"){a.addEvent("mousedown",function(b){if(MUI.ieLegacySupport){new Event(b).stop()}MUI.focusWindow(a);if(a.getStyle("top").toInt()<-this.options.shadowBlur){a.setStyle("top",-this.options.shadowBlur)}}.bind(this))}if(this.minimizeButtonEl){this.minimizeButtonEl.addEvent("click",function(b){new Event(b).stop();MUI.Dock.minimizeWindow(a)}.bind(this))}if(this.maximizeButtonEl){this.maximizeButtonEl.addEvent("click",function(b){new Event(b).stop();if(this.isMaximized){MUI.Desktop.restoreWindow(a)}else{MUI.Desktop.maximizeWindow(a)}}.bind(this))}if(this.options.collapsible==true){this.titleEl.addEvent("selectstart",function(b){b=new Event(b).stop()}.bind(this));if(MUI.ieLegacySupport){this.titleBarEl.addEvent("mousedown",function(b){this.titleEl.setCapture()}.bind(this));this.titleBarEl.addEvent("mouseup",function(b){this.titleEl.releaseCapture()}.bind(this))}this.titleBarEl.addEvent("dblclick",function(b){b=new Event(b).stop();MUI.collapseToggle(this.windowEl)}.bind(this))}},attachDraggable:function(){var a=this.windowEl;if(!this.options.draggable){return}this.windowDrag=new Drag.Move(a,{handle:this.titleBarEl,container:this.options.restrict==true?$(this.options.container):false,grid:this.options.draggableGrid,limit:this.options.draggableLimit,snap:this.options.draggableSnap,onStart:function(){if(this.options.type!="modal"&&this.options.type!="modal2"){MUI.focusWindow(a);$("windowUnderlay").show()}if(this.iframeEl){if(!MUI.ieLegacySupport){this.iframeEl.setStyle("visibility","hidden")}else{this.iframeEl.hide()}}}.bind(this),onComplete:function(){if(this.options.type!="modal"&&this.options.type!="modal2"){$("windowUnderlay").hide()}if(this.iframeEl){if(!MUI.ieLegacySupport){this.iframeEl.setStyle("visibility","visible")}else{this.iframeEl.show()}}this.saveValues()}.bind(this)})},attachResizable:function(){var a=this.windowEl;if(!this.options.resizable){return}this.resizable1=this.windowEl.makeResizable({handle:[this.n,this.ne,this.nw],limit:{y:[function(){return this.windowEl.getStyle("top").toInt()+this.windowEl.getStyle("height").toInt()-this.options.resizeLimit.y[1]}.bind(this),function(){return this.windowEl.getStyle("top").toInt()+this.windowEl.getStyle("height").toInt()-this.options.resizeLimit.y[0]}.bind(this)]},modifiers:{x:false,y:"top"},onStart:function(){this.resizeOnStart();this.coords=this.contentWrapperEl.getCoordinates();this.y2=this.coords.top.toInt()+this.contentWrapperEl.offsetHeight}.bind(this),onDrag:function(){this.coords=this.contentWrapperEl.getCoordinates();this.contentWrapperEl.setStyle("height",this.y2-this.coords.top.toInt());this.resizeOnDrag()}.bind(this),onComplete:function(){this.resizeOnComplete()}.bind(this)});this.resizable2=this.contentWrapperEl.makeResizable({handle:[this.e,this.ne],limit:{x:[this.options.resizeLimit.x[0]-(this.options.shadowBlur*2),this.options.resizeLimit.x[1]-(this.options.shadowBlur*2)]},modifiers:{x:"width",y:false},onStart:function(){this.resizeOnStart()}.bind(this),onDrag:function(){this.resizeOnDrag()}.bind(this),onComplete:function(){this.resizeOnComplete()}.bind(this)});this.resizable3=this.contentWrapperEl.makeResizable({container:this.options.restrict==true?$(this.options.container):false,handle:this.se,limit:{x:[this.options.resizeLimit.x[0]-(this.options.shadowBlur*2),this.options.resizeLimit.x[1]-(this.options.shadowBlur*2)],y:[this.options.resizeLimit.y[0]-this.headerFooterShadow,this.options.resizeLimit.y[1]-this.headerFooterShadow]},modifiers:{x:"width",y:"height"},onStart:function(){this.resizeOnStart()}.bind(this),onDrag:function(){this.resizeOnDrag()}.bind(this),onComplete:function(){this.resizeOnComplete()}.bind(this)});this.resizable4=this.contentWrapperEl.makeResizable({handle:[this.s,this.sw],limit:{y:[this.options.resizeLimit.y[0]-this.headerFooterShadow,this.options.resizeLimit.y[1]-this.headerFooterShadow]},modifiers:{x:false,y:"height"},onStart:function(){this.resizeOnStart()}.bind(this),onDrag:function(){this.resizeOnDrag()}.bind(this),onComplete:function(){this.resizeOnComplete()}.bind(this)});this.resizable5=this.windowEl.makeResizable({handle:[this.w,this.sw,this.nw],limit:{x:[function(){return this.windowEl.getStyle("left").toInt()+this.windowEl.getStyle("width").toInt()-this.options.resizeLimit.x[1]}.bind(this),function(){return this.windowEl.getStyle("left").toInt()+this.windowEl.getStyle("width").toInt()-this.options.resizeLimit.x[0]}.bind(this)]},modifiers:{x:"left",y:false},onStart:function(){this.resizeOnStart();this.coords=this.contentWrapperEl.getCoordinates();this.x2=this.coords.left.toInt()+this.contentWrapperEl.offsetWidth}.bind(this),onDrag:function(){this.coords=this.contentWrapperEl.getCoordinates();this.contentWrapperEl.setStyle("width",this.x2-this.coords.left.toInt());this.resizeOnDrag()}.bind(this),onComplete:function(){this.resizeOnComplete()}.bind(this)})},resizeOnStart:function(){$("windowUnderlay").show();if(this.iframeEl){if(!MUI.ieLegacySupport){this.iframeEl.setStyle("visibility","hidden")}else{this.iframeEl.hide()}}},resizeOnDrag:function(){this.drawWindow();this.adjustHandles()},resizeOnComplete:function(){$("windowUnderlay").hide();if(this.iframeEl){if(!MUI.ieLegacySupport){this.iframeEl.setStyle("visibility","visible")}else{this.iframeEl.show();this.iframeEl.setStyle("width","99%");this.iframeEl.setStyle("height",this.contentWrapperEl.offsetHeight);this.iframeEl.setStyle("width","100%");this.iframeEl.setStyle("height",this.contentWrapperEl.offsetHeight)}}if(this.contentWrapperEl.getChildren(".column")!=null){MUI.rWidth(this.contentWrapperEl);this.contentWrapperEl.getChildren(".column").each(function(a){MUI.panelHeight(a)})}this.fireEvent("onResize",this.windowEl)},adjustHandles:function(){var d=this.options.shadowBlur;var j=d*2;var k=this.options.shadowOffset;var e=d-k.y-1;var g=d+k.x-1;var a=d+k.y-1;var c=d-k.x-1;var f=this.windowEl.getCoordinates();var b=f.width-j+2;var h=f.height-j+2;this.n.setStyles({top:e,left:c+10,width:b-20});this.e.setStyles({top:e+10,right:g,height:h-30});this.s.setStyles({bottom:a,left:c+10,width:b-30});this.w.setStyles({top:e+10,left:c,height:h-20});this.ne.setStyles({top:e,right:g});this.se.setStyles({bottom:a,right:g});this.sw.setStyles({bottom:a,left:c});this.nw.setStyles({top:e,left:c})},detachResizable:function(){this.resizable1.detach();this.resizable2.detach();this.resizable3.detach();this.resizable4.detach();this.resizable5.detach();this.windowEl.getElements(".handle").hide()},reattachResizable:function(){this.resizable1.attach();this.resizable2.attach();this.resizable3.attach();this.resizable4.attach();this.resizable5.attach();this.windowEl.getElements(".handle").show()},insertWindowElements:function(){var c=this.options;var a=c.height;var d=c.width;var e=c.id;var b={};if(Browser.Engine.trident4){b.zIndexFixEl=new Element("iframe",{id:e+"_zIndexFix","class":"zIndexFix",scrolling:"no",marginWidth:0,marginHeight:0,src:"",styles:{position:"absolute"}}).inject(this.windowEl)}b.overlayEl=new Element("div",{id:e+"_overlay","class":"mochaOverlay",styles:{position:"absolute",top:0,left:0}}).inject(this.windowEl);b.titleBarEl=new Element("div",{id:e+"_titleBar","class":"mochaTitlebar",styles:{cursor:c.draggable?"move":"default"}}).inject(b.overlayEl,"top");b.titleEl=new Element("h3",{id:e+"_title","class":"mochaTitle"}).inject(b.titleBarEl);if(c.icon!=false){b.titleEl.setStyles({"padding-left":28,background:"url("+c.icon+") 5px 4px no-repeat"})}b.contentBorderEl=new Element("div",{id:e+"_contentBorder","class":"mochaContentBorder"}).inject(b.overlayEl);if(c.toolbar){b.toolbarWrapperEl=new Element("div",{id:e+"_toolbarWrapper","class":"mochaToolbarWrapper",styles:{height:c.toolbarHeight}}).inject(b.contentBorderEl,c.toolbarPosition=="bottom"?"after":"before");if(c.toolbarPosition=="bottom"){b.toolbarWrapperEl.addClass("bottom")}b.toolbarEl=new Element("div",{id:e+"_toolbar","class":"mochaToolbar",styles:{height:c.toolbarHeight}}).inject(b.toolbarWrapperEl)}if(c.toolbar2){b.toolbar2WrapperEl=new Element("div",{id:e+"_toolbar2Wrapper","class":"mochaToolbarWrapper",styles:{height:c.toolbar2Height}}).inject(b.contentBorderEl,c.toolbar2Position=="bottom"?"after":"before");if(c.toolbar2Position=="bottom"){b.toolbar2WrapperEl.addClass("bottom")}b.toolbar2El=new Element("div",{id:e+"_toolbar2","class":"mochaToolbar",styles:{height:c.toolbar2Height}}).inject(b.toolbar2WrapperEl)}b.contentWrapperEl=new Element("div",{id:e+"_contentWrapper","class":"mochaContentWrapper",styles:{width:d+"px",height:a+"px"}}).inject(b.contentBorderEl);if(this.options.shape=="gauge"){b.contentBorderEl.setStyle("borderWidth",0)}b.contentEl=new Element("div",{id:e+"_content","class":"mochaContent"}).inject(b.contentWrapperEl);if(this.options.useCanvas==true&&!MUI.ieLegacySupport){b.canvasEl=new Element("canvas",{id:e+"_canvas","class":"mochaCanvas",width:10,height:10}).inject(this.windowEl)}if(this.options.useCanvas==true&&MUI.ieLegacySupport){b.canvasEl=new Element("canvas",{id:e+"_canvas","class":"mochaCanvas",width:50000,height:20000,styles:{position:"absolute",top:0,left:0}}).inject(this.windowEl);if(MUI.ieLegacySupport&&MUI.ieSupport=="excanvas"){G_vmlCanvasManager.initElement(b.canvasEl);b.canvasEl=this.windowEl.getElement(".mochaCanvas")}}b.controlsEl=new Element("div",{id:e+"_controls","class":"mochaControls"}).inject(b.overlayEl,"after");if(c.useCanvasControls==true){b.canvasControlsEl=new Element("canvas",{id:e+"_canvasControls","class":"mochaCanvasControls",width:14,height:14}).inject(this.windowEl);if(MUI.ieLegacySupport&&MUI.ieSupport=="excanvas"){G_vmlCanvasManager.initElement(b.canvasControlsEl);b.canvasControlsEl=this.windowEl.getElement(".mochaCanvasControls")}}if(c.closable){b.closeButtonEl=new Element("div",{id:e+"_closeButton","class":"mochaCloseButton mochaWindowButton",title:"Close"}).inject(b.controlsEl)}if(c.maximizable){b.maximizeButtonEl=new Element("div",{id:e+"_maximizeButton","class":"mochaMaximizeButton mochaWindowButton",title:"Maximize"}).inject(b.controlsEl)}if(c.minimizable){b.minimizeButtonEl=new Element("div",{id:e+"_minimizeButton","class":"mochaMinimizeButton mochaWindowButton",title:"Minimize"}).inject(b.controlsEl)}if(c.useSpinner==true&&c.shape!="gauge"&&c.type!="notification"){b.spinnerEl=new Element("div",{id:e+"_spinner","class":"mochaSpinner",width:16,height:16}).inject(this.windowEl,"bottom")}if(this.options.shape=="gauge"){b.canvasHeaderEl=new Element("canvas",{id:e+"_canvasHeader","class":"mochaCanvasHeader",width:this.options.width,height:26}).inject(this.windowEl,"bottom");if(MUI.ieLegacySupport&&MUI.ieSupport=="excanvas"){G_vmlCanvasManager.initElement(b.canvasHeaderEl);b.canvasHeaderEl=this.windowEl.getElement(".mochaCanvasHeader")}}if(MUI.ieLegacySupport){b.overlayEl.setStyle("zIndex",2)}if(c.resizable){b.n=new Element("div",{id:e+"_resizeHandle_n","class":"handle",styles:{top:0,left:10,cursor:"n-resize"}}).inject(b.overlayEl,"after");b.ne=new Element("div",{id:e+"_resizeHandle_ne","class":"handle corner",styles:{top:0,right:0,cursor:"ne-resize"}}).inject(b.overlayEl,"after");b.e=new Element("div",{id:e+"_resizeHandle_e","class":"handle",styles:{top:10,right:0,cursor:"e-resize"}}).inject(b.overlayEl,"after");b.se=new Element("div",{id:e+"_resizeHandle_se","class":"handle cornerSE",styles:{bottom:0,right:0,cursor:"se-resize"}}).inject(b.overlayEl,"after");b.s=new Element("div",{id:e+"_resizeHandle_s","class":"handle",styles:{bottom:0,left:10,cursor:"s-resize"}}).inject(b.overlayEl,"after");b.sw=new Element("div",{id:e+"_resizeHandle_sw","class":"handle corner",styles:{bottom:0,left:0,cursor:"sw-resize"}}).inject(b.overlayEl,"after");b.w=new Element("div",{id:e+"_resizeHandle_w","class":"handle",styles:{top:10,left:0,cursor:"w-resize"}}).inject(b.overlayEl,"after");b.nw=new Element("div",{id:e+"_resizeHandle_nw","class":"handle corner",styles:{top:0,left:0,cursor:"nw-resize"}}).inject(b.overlayEl,"after")}$extend(this,b)},setColors:function(){if(this.options.useCanvas==true){var c=/\?(.*?)\)/;if(this.titleBarEl.getStyle("backgroundImage")!="none"){var d=this.titleBarEl.getStyle("backgroundImage");d=d.match(c)[1];d=d.parseQueryString();var a=d.from;var b=d.to.replace(/\"/,"");this.options.headerStartColor=new Color(a);this.options.headerStopColor=new Color(b);this.titleBarEl.addClass("replaced")}else{if(this.titleBarEl.getStyle("background-color")!==""&&this.titleBarEl.getStyle("background-color")!=="transparent"){this.options.headerStartColor=new Color(this.titleBarEl.getStyle("background-color")).mix("#fff",20);this.options.headerStopColor=new Color(this.titleBarEl.getStyle("background-color")).mix("#000",20);this.titleBarEl.addClass("replaced")}}if(this.windowEl.getStyle("background-color")!==""&&this.windowEl.getStyle("background-color")!=="transparent"){this.options.bodyBgColor=new Color(this.windowEl.getStyle("background-color"));this.windowEl.addClass("replaced")}if(this.options.resizable&&this.se.getStyle("background-color")!==""&&this.se.getStyle("background-color")!=="transparent"){this.options.resizableColor=new Color(this.se.getStyle("background-color"));this.se.addClass("replaced")}}if(this.options.useCanvasControls==true){if(this.minimizeButtonEl){if(this.minimizeButtonEl.getStyle("color")!==""&&this.minimizeButtonEl.getStyle("color")!=="transparent"){this.options.minimizeColor=new Color(this.minimizeButtonEl.getStyle("color"))}if(this.minimizeButtonEl.getStyle("background-color")!==""&&this.minimizeButtonEl.getStyle("background-color")!=="transparent"){this.options.minimizeBgColor=new Color(this.minimizeButtonEl.getStyle("background-color"));this.minimizeButtonEl.addClass("replaced")}}if(this.maximizeButtonEl){if(this.maximizeButtonEl.getStyle("color")!==""&&this.maximizeButtonEl.getStyle("color")!=="transparent"){this.options.maximizeColor=new Color(this.maximizeButtonEl.getStyle("color"))}if(this.maximizeButtonEl.getStyle("background-color")!==""&&this.maximizeButtonEl.getStyle("background-color")!=="transparent"){this.options.maximizeBgColor=new Color(this.maximizeButtonEl.getStyle("background-color"));this.maximizeButtonEl.addClass("replaced")}}if(this.closeButtonEl){if(this.closeButtonEl.getStyle("color")!==""&&this.closeButtonEl.getStyle("color")!=="transparent"){this.options.closeColor=new Color(this.closeButtonEl.getStyle("color"))}if(this.closeButtonEl.getStyle("background-color")!==""&&this.closeButtonEl.getStyle("background-color")!=="transparent"){this.options.closeBgColor=new Color(this.closeButtonEl.getStyle("background-color"));this.closeButtonEl.addClass("replaced")}}}},drawWindow:function(b){if(this.drawingWindow==true){return}this.drawingWindow=true;if(this.isCollapsed){this.drawWindowCollapsed(b);return}var g=this.windowEl;var m=this.options;var c=m.shadowBlur;var j=c*2;var l=this.options.shadowOffset;this.overlayEl.setStyles({width:this.contentWrapperEl.offsetWidth});if(this.iframeEl){this.iframeEl.setStyle("height",this.contentWrapperEl.offsetHeight)}var d=this.contentBorderEl.getStyle("margin-top").toInt()+this.contentBorderEl.getStyle("margin-bottom").toInt();var f=this.toolbarWrapperEl?this.toolbarWrapperEl.getStyle("height").toInt()+this.toolbarWrapperEl.getStyle("margin-top").toInt():0;var e=this.toolbar2WrapperEl?this.toolbar2WrapperEl.getStyle("height").toInt()+this.toolbar2WrapperEl.getStyle("margin-top").toInt():0;this.headerFooterShadow=m.headerHeight+m.footerHeight+j;var h=this.contentWrapperEl.getStyle("height").toInt()+this.headerFooterShadow+f+e+d;var a=this.contentWrapperEl.getStyle("width").toInt()+j;this.windowEl.setStyles({height:h,width:a});this.overlayEl.setStyles({height:h,top:c-l.y,left:c-l.x});if(this.options.useCanvas==true){if(MUI.ieLegacySupport){this.canvasEl.height=20000;this.canvasEl.width=50000}this.canvasEl.height=h;this.canvasEl.width=a}if(Browser.Engine.trident4){this.zIndexFixEl.setStyles({width:a,height:h})}this.titleBarEl.setStyles({width:a-j,height:m.headerHeight});if(m.useSpinner==true&&m.shape!="gauge"&&m.type!="notification"){this.spinnerEl.setStyles({left:c-l.x+3,bottom:c+l.y+4})}if(this.options.useCanvas!=false){var k=this.canvasEl.getContext("2d");k.clearRect(0,0,a,h);switch(m.shape){case"box":this.drawBox(k,a,h,c,l,b);break;case"gauge":this.drawGauge(k,a,h,c,l,b);break}if(m.resizable){MUI.triangle(k,a-(c+l.x+17),h-(c+l.y+18),11,11,m.resizableColor,1)}if(MUI.ieLegacySupport){MUI.triangle(k,0,0,10,10,m.resizableColor,0)}}if(m.type!="notification"&&m.useCanvasControls==true){this.drawControls(a,h,b)}if(MUI.Desktop&&this.contentWrapperEl.getChildren(".column").length!=0){MUI.rWidth(this.contentWrapperEl);this.contentWrapperEl.getChildren(".column").each(function(n){MUI.panelHeight(n)})}this.drawingWindow=false;return this},drawWindowCollapsed:function(b){var e=this.windowEl;var k=this.options;var c=k.shadowBlur;var f=c*2;var j=k.shadowOffset;var d=k.headerHeight+f+2;var g=d;var a=this.contentWrapperEl.getStyle("width").toInt()+f;this.windowEl.setStyle("height",g);this.overlayEl.setStyles({height:g,top:c-j.y,left:c-j.x});if(Browser.Engine.trident4){this.zIndexFixEl.setStyles({width:a,height:g})}this.windowEl.setStyle("width",a);this.overlayEl.setStyle("width",a);this.titleBarEl.setStyles({width:a-f,height:k.headerHeight});if(this.options.useCanvas!=false){this.canvasEl.height=g;this.canvasEl.width=a;var h=this.canvasEl.getContext("2d");h.clearRect(0,0,a,g);this.drawBoxCollapsed(h,a,g,c,j,b);if(k.useCanvasControls==true){this.drawControls(a,g,b)}if(MUI.ieLegacySupport){MUI.triangle(h,0,0,10,10,k.resizableColor,0)}}this.drawingWindow=false;return this},drawControls:function(g,e,h){var f=this.options;var d=f.shadowBlur;var c=f.shadowOffset;var b=f.controlsOffset;this.controlsEl.setStyles({right:d+c.x+b.right,top:d-c.y+b.top});this.canvasControlsEl.setStyles({right:d+c.x+b.right,top:d-c.y+b.top});this.closebuttonX=f.closable?this.mochaControlsWidth-7:this.mochaControlsWidth+12;this.maximizebuttonX=this.closebuttonX-(f.maximizable?19:0);this.minimizebuttonX=this.maximizebuttonX-(f.minimizable?19:0);var a=this.canvasControlsEl.getContext("2d");a.clearRect(0,0,100,100);if(this.options.closable){this.closebutton(a,this.closebuttonX,7,f.closeBgColor,1,f.closeColor,1)}if(this.options.maximizable){this.maximizebutton(a,this.maximizebuttonX,7,f.maximizeBgColor,1,f.maximizeColor,1)}if(this.options.minimizable){this.minimizebutton(a,this.minimizebuttonX,7,f.minimizeBgColor,1,f.minimizeColor,1)}if(MUI.ieLegacySupport){MUI.circle(a,0,0,3,this.options.resizableColor,0)}},drawBox:function(h,a,g,c,j,b){var k=this.options;var f=c*2;var d=this.options.cornerRadius;if(b!=false){for(var e=0;e<=c;e++){MUI.roundedRect(h,j.x+e,j.y+e,a-(e*2)-j.x,g-(e*2)-j.y,d+(c-e),[0,0,0],e==c?0.29:0.065+(e*0.01))}}this.bodyRoundedRect(h,c-j.x,c-j.y,a-f,g-f,d,k.bodyBgColor);if(this.options.type!="notification"){this.topRoundedRect(h,c-j.x,c-j.y,a-f,k.headerHeight,d,k.headerStartColor,k.headerStopColor)}},drawBoxCollapsed:function(h,a,g,c,j,b){var k=this.options;var f=c*2;var d=k.cornerRadius;if(b!=false){for(var e=0;e<=c;e++){MUI.roundedRect(h,j.x+e,j.y+e,a-(e*2)-j.x,g-(e*2)-j.y,d+(c-e),[0,0,0],e==c?0.3:0.06+(e*0.01))}}this.topRoundedRect2(h,c-j.x,c-j.y,a-f,k.headerHeight+2,d,k.headerStartColor,k.headerStopColor)},drawGauge:function(g,a,f,c,h,b){var j=this.options;var d=(a*0.5)-(c)+16;if(b!=false){for(var e=0;e<=c;e++){MUI.circle(g,a*0.5+h.x,(f+j.headerHeight)*0.5+h.x,(a*0.5)-(e*2)-h.x,[0,0,0],e==c?0.75:0.075+(e*0.04))}}MUI.circle(g,a*0.5-h.x,(f+j.headerHeight)*0.5-h.y,(a*0.5)-c,j.bodyBgColor,1);this.canvasHeaderEl.setStyles({top:c-h.y,left:c-h.x});var g=this.canvasHeaderEl.getContext("2d");g.clearRect(0,0,a,100);g.beginPath();g.lineWidth=24;g.lineCap="round";g.moveTo(13,13);g.lineTo(a-(c*2)-13,13);g.strokeStyle="rgba(0, 0, 0, .65)";g.stroke()},bodyRoundedRect:function(d,c,g,f,b,a,e){d.fillStyle="rgba("+e.join(",")+", 1)";d.beginPath();d.moveTo(c,g+a);d.lineTo(c,g+b-a);d.quadraticCurveTo(c,g+b,c+a,g+b);d.lineTo(c+f-a,g+b);d.quadraticCurveTo(c+f,g+b,c+f,g+b-a);d.lineTo(c+f,g+a);d.quadraticCurveTo(c+f,g,c+f-a,g);d.lineTo(c+a,g);d.quadraticCurveTo(c,g,c,g+a);d.fill()},topRoundedRect:function(j,g,f,a,h,e,c,d){var b=j.createLinearGradient(0,0,0,h);b.addColorStop(0,"rgb("+c.join(",")+")");b.addColorStop(1,"rgb("+d.join(",")+")");j.fillStyle=b;j.beginPath();j.moveTo(g,f);j.lineTo(g,f+h);j.lineTo(g+a,f+h);j.lineTo(g+a,f+e);j.quadraticCurveTo(g+a,f,g+a-e,f);j.lineTo(g+e,f);j.quadraticCurveTo(g,f,g,f+e);j.fill()},topRoundedRect2:function(j,g,f,a,h,e,c,d){if(navigator.userAgent.toLowerCase().indexOf("chrome")>-1){j.fillStyle="rgba("+d.join(",")+", 1)"}else{var b=j.createLinearGradient(0,this.options.shadowBlur-1,0,h+this.options.shadowBlur+3);b.addColorStop(0,"rgb("+c.join(",")+")");b.addColorStop(1,"rgb("+d.join(",")+")");j.fillStyle=b}j.beginPath();j.moveTo(g,f+e);j.lineTo(g,f+h-e);j.quadraticCurveTo(g,f+h,g+e,f+h);j.lineTo(g+a-e,f+h);j.quadraticCurveTo(g+a,f+h,g+a,f+h-e);j.lineTo(g+a,f+e);j.quadraticCurveTo(g+a,f,g+a-e,f);j.lineTo(g+e,f);j.quadraticCurveTo(g,f,g,f+e);j.fill()},maximizebutton:function(e,c,h,b,g,f,d){e.beginPath();e.arc(c,h,7,0,Math.PI*2,true);e.fillStyle="rgba("+b.join(",")+","+g+")";e.fill();e.strokeStyle="rgba("+f.join(",")+","+d+")";e.lineWidth=2;e.beginPath();e.moveTo(c,h-3.5);e.lineTo(c,h+3.5);e.moveTo(c-3.5,h);e.lineTo(c+3.5,h);e.stroke()},closebutton:function(e,c,h,b,g,f,d){e.beginPath();e.arc(c,h,7,0,Math.PI*2,true);e.fillStyle="rgba("+b.join(",")+","+g+")";e.fill();e.strokeStyle="rgba("+f.join(",")+","+d+")";e.lineWidth=2;e.beginPath();e.moveTo(c-3,h-3);e.lineTo(c+3,h+3);e.moveTo(c+3,h-3);e.lineTo(c-3,h+3);e.stroke()},minimizebutton:function(e,c,h,b,g,f,d){e.beginPath();e.arc(c,h,7,0,Math.PI*2,true);e.fillStyle="rgba("+b.join(",")+","+g+")";e.fill();e.strokeStyle="rgba("+f.join(",")+","+d+")";e.lineWidth=2;e.beginPath();e.moveTo(c-3.5,h);e.lineTo(c+3.5,h);e.stroke()},setMochaControlsWidth:function(){this.mochaControlsWidth=0;var a=this.options;if(a.minimizable){this.mochaControlsWidth+=(this.minimizeButtonEl.getStyle("margin-left").toInt()+this.minimizeButtonEl.getStyle("width").toInt())}if(a.maximizable){this.mochaControlsWidth+=(this.maximizeButtonEl.getStyle("margin-left").toInt()+this.maximizeButtonEl.getStyle("width").toInt())}if(a.closable){this.mochaControlsWidth+=(this.closeButtonEl.getStyle("margin-left").toInt()+this.closeButtonEl.getStyle("width").toInt())}this.controlsEl.setStyle("width",this.mochaControlsWidth);if(a.useCanvasControls==true){this.canvasControlsEl.setProperty("width",this.mochaControlsWidth)}},hideSpinner:function(){if(this.spinnerEl){this.spinnerEl.hide()}return this},showSpinner:function(){if(this.spinnerEl){this.spinnerEl.show()}return this},close:function(){if(!this.isClosing){MUI.closeWindow(this.windowEl)}return this},minimize:function(){MUI.Dock.minimizeWindow(this.windowEl);return this},maximize:function(){if(this.isMinimized){MUI.Dock.restoreMinimized(this.windowEl)}MUI.Desktop.maximizeWindow(this.windowEl);return this},restore:function(){if(this.isMinimized){MUI.Dock.restoreMinimized(this.windowEl)}else{if(this.isMaximized){MUI.Desktop.restoreWindow(this.windowEl)}}return this},resize:function(a){MUI.resizeWindow(this.windowEl,a);return this},center:function(){MUI.centerWindow(this.windowEl);return this},hide:function(){this.windowEl.setStyle("display","none");return this},show:function(){this.windowEl.setStyle("display","block");return this}});MUI.extend({closeWindow:function(c){var a=c.retrieve("instance");if(c!=$(c)||a.isClosing){return}a.isClosing=true;a.fireEvent("onClose",c);if(a.options.storeOnClose){this.storeOnClose(a,c);return}if(a.check){a.check.destroy()}if((a.options.type=="modal"||a.options.type=="modal2")&&Browser.Engine.trident4){$("modalFix").hide()}if(MUI.options.advancedEffects==false){if(a.options.type=="modal"||a.options.type=="modal2"){$("modalOverlay").setStyle("opacity",0)}MUI.closingJobs(c);return true}else{if(MUI.ieLegacySupport){a.drawWindow(false)}if(a.options.type=="modal"||a.options.type=="modal2"){MUI.Modal.modalOverlayCloseMorph.start({opacity:0})}var b=new Fx.Morph(c,{duration:120,onComplete:function(){MUI.closingJobs(c);return true}.bind(this)});b.start({opacity:0.4})}},closingJobs:function(e){var d=MUI.Windows.instances;var a=d.get(e.id);e.setStyle("visibility","hidden");if(MUI.ieLegacySupport){e.dispose()}else{e.destroy()}a.fireEvent("onCloseComplete");if(a.options.type!="notification"){var c=this.getWindowWithHighestZindex();this.focusWindow(c)}d.erase(a.options.id);if(this.loadingWorkspace==true){this.windowUnload()}if(MUI.Dock&&$(MUI.options.dock)&&a.options.type=="window"){var b=$(a.options.id+"_dockTab");if(b!=null){MUI.Dock.dockSortables.removeItems(b).destroy()}MUI.Desktop.setDesktopSize()}},storeOnClose:function(a,d){if(a.check){a.check.hide()}d.setStyles({zIndex:-1});d.addClass("windowClosed");d.removeClass("mocha");if(MUI.Dock&&$(MUI.options.dock)&&a.options.type=="window"){var c=$(a.options.id+"_dockTab");if(c!=null){c.hide()}MUI.Desktop.setDesktopSize()}a.fireEvent("onCloseComplete");if(a.options.type!="notification"){var b=this.getWindowWithHighestZindex();this.focusWindow(b)}a.isClosing=false},closeAll:function(){$$(".mocha").each(function(a){this.closeWindow(a)}.bind(this))},collapseToggle:function(c){var a=c.retrieve("instance");var b=c.getElements(".handle");if(a.isMaximized==true){return}if(a.isCollapsed==false){a.isCollapsed=true;b.hide();if(a.iframeEl){a.iframeEl.setStyle("visibility","hidden")}a.contentBorderEl.setStyles({visibility:"hidden",position:"absolute",top:-10000,left:-10000});if(a.toolbarWrapperEl){a.toolbarWrapperEl.setStyles({visibility:"hidden",position:"absolute",top:-10000,left:-10000})}a.drawWindowCollapsed()}else{a.isCollapsed=false;a.drawWindow();a.contentBorderEl.setStyles({visibility:"visible",position:null,top:null,left:null});if(a.toolbarWrapperEl){a.toolbarWrapperEl.setStyles({visibility:"visible",position:null,top:null,left:null})}if(a.iframeEl){a.iframeEl.setStyle("visibility","visible")}b.show()}},toggleWindowVisibility:function(){MUI.Windows.instances.each(function(a){if(a.options.type=="modal"||a.options.type=="modal2"||a.isMinimized==true){return}var b=$(a.options.id);if(b.getStyle("visibility")=="visible"){if(a.iframe){a.iframeEl.setStyle("visibility","hidden")}if(a.toolbarEl){a.toolbarWrapperEl.setStyle("visibility","hidden")}a.contentBorderEl.setStyle("visibility","hidden");b.setStyle("visibility","hidden");MUI.Windows.windowsVisible=false}else{b.setStyle("visibility","visible");a.contentBorderEl.setStyle("visibility","visible");if(a.iframe){a.iframeEl.setStyle("visibility","visible")}if(a.toolbarEl){a.toolbarWrapperEl.setStyle("visibility","visible")}MUI.Windows.windowsVisible=true}}.bind(this))},focusWindow:function(e,c){MUI.Windows.focusingWindow=true;var b=function(){MUI.Windows.focusingWindow=false};b.delay(170,this);if($$(".mocha").length==0){return}if(e!=$(e)||e.hasClass("isFocused")){return}var d=MUI.Windows.instances;var a=d.get(e.id);if(a.options.type=="notification"){e.setStyle("zIndex",11001);return}MUI.Windows.indexLevel+=2;e.setStyle("zIndex",MUI.Windows.indexLevel);$("windowUnderlay").setStyle("zIndex",MUI.Windows.indexLevel-1).inject($(e),"after");d.each(function(f){if(f.windowEl.hasClass("isFocused")){f.fireEvent("onBlur",f.windowEl)}f.windowEl.removeClass("isFocused")});if(MUI.Dock&&$(MUI.options.dock)&&a.options.type=="window"){MUI.Dock.makeActiveTab()}e.addClass("isFocused");if(c!=false){a.fireEvent("onFocus",e)}},getWindowWithHighestZindex:function(){this.highestZindex=0;$$(".mocha").each(function(a){this.zIndex=a.getStyle("zIndex");if(this.zIndex>=this.highestZindex){this.highestZindex=this.zIndex}}.bind(this));$$(".mocha").each(function(a){if(a.getStyle("zIndex")==this.highestZindex){this.windowWithHighestZindex=a}}.bind(this));return this.windowWithHighestZindex},blurAll:function(){if(MUI.Windows.focusingWindow==false){$$(".mocha").each(function(b){var a=b.retrieve("instance");if(a.options.type!="modal"&&a.options.type!="modal2"){b.removeClass("isFocused")}});$$(".dockTab").removeClass("activeDockTab")}},centerWindow:function(f){if(!f){MUI.Windows.instances.each(function(g){if(g.windowEl.hasClass("isFocused")){f=g.windowEl}})}var a=f.retrieve("instance");var b=a.options;var d=b.container.getCoordinates();var c=window.getScroll().y+(window.getSize().y*0.5)-(f.offsetHeight*0.5);if(c<-a.options.shadowBlur){c=-a.options.shadowBlur}var e=(d.width*0.5)-(f.offsetWidth*0.5);if(e<-a.options.shadowBlur){e=-a.options.shadowBlur}if(MUI.options.advancedEffects==true){a.morph.start({top:c,left:e})}else{f.setStyles({top:c,left:e})}},resizeWindow:function(f,j){var g=f.retrieve("instance");$extend({width:null,height:null,top:null,left:null,centered:true},j);var c=f.getStyle("width").toInt();var h=f.getStyle("height").toInt();var d=f.getStyle("top").toInt();var b=f.getStyle("left").toInt();if(j.centered){var e=j.top||d-((j.height-h)*0.5);var a=j.left||b-((j.width-c)*0.5)}else{var e=j.top||d;var a=j.left||b}if(MUI.options.advancedEffects==false){f.setStyles({top:e,left:a});g.contentWrapperEl.setStyles({height:j.height,width:j.width});g.drawWindow();if(g.iframeEl){if(!MUI.ieLegacySupport){g.iframeEl.setStyle("visibility","visible")}else{g.iframeEl.show()}}}else{f.retrieve("resizeMorph").start({"0":{height:j.height,width:j.width},"1":{top:e,left:a}})}return g},dynamicResize:function(d){var a=d.retrieve("instance");var c=a.contentWrapperEl;var b=a.contentEl;c.setStyles({height:b.offsetHeight,width:b.offsetWidth});a.drawWindow()}});document.addEvent("keydown",function(a){if(a.key=="q"&&a.control&&a.alt){MUI.toggleWindowVisibility()}});MUI.files[MUI.path.source+"Window/Modal.js"]="loaded";MUI.Modal=new Class({Extends:MUI.Window,options:{type:"modal"},initialize:function(a){if(!$("modalOverlay")){this.modalInitialize();window.addEvent("resize",function(){this.setModalSize()}.bind(this))}this.parent(a)},modalInitialize:function(){var a=new Element("div",{id:"modalOverlay",styles:{height:document.getCoordinates().height,opacity:0.6}}).inject(document.body);a.setStyles({position:Browser.Engine.trident4?"absolute":"fixed"});a.addEvent("click",function(d){var c=MUI.Windows.instances.get(MUI.currentModal.id);if(c.options.modalOverlayClose==true){MUI.closeWindow(MUI.currentModal)}});if(Browser.Engine.trident4){var b=new Element("iframe",{id:"modalFix",scrolling:"no",marginWidth:0,marginHeight:0,src:"",styles:{height:document.getCoordinates().height}}).inject(document.body)}MUI.Modal.modalOverlayOpenMorph=new Fx.Morph($("modalOverlay"),{duration:150});MUI.Modal.modalOverlayCloseMorph=new Fx.Morph($("modalOverlay"),{duration:150,onComplete:function(){$("modalOverlay").hide();if(Browser.Engine.trident4){$("modalFix").hide()}}.bind(this)})},setModalSize:function(){$("modalOverlay").setStyle("height",document.getCoordinates().height);if(Browser.Engine.trident4){$("modalFix").setStyle("height",document.getCoordinates().height)}}});MUI.files[MUI.path.source+"Window/Windows-from-html.js"]="loaded";MUI.extend({NewWindowsFromHTML:function(){$$(".mocha").each(function(b){if(Browser.Engine.presto||Browser.Engine.trident5){b.hide()}var d=b.getElement("h3.mochaTitle");if(Browser.Engine.presto){b.show()}var c=b.getStyles("height","width");var a={id:b.getProperty("id"),height:c.height.toInt(),width:c.width.toInt(),x:b.getStyle("left").toInt(),y:b.getStyle("top").toInt()};if(d){a.title=d.innerHTML;d.destroy()}a.content=b.innerHTML;b.destroy();new MUI.Window(a,true)}.bind(this))}});MUI.files[MUI.path.source+"Window/Windows-from-json.js"]="loaded";MUI.extend({newWindowsFromJSON:function(newWindows){newWindows.each(function(options){var temp=new Hash(options);temp.each(function(value,key,hash){if($type(value)!="string"){return}if(value.substring(0,8)=="function"){eval("options."+key+" = "+value)}});new MUI.Window(options)})}});MUI.files[MUI.path.source+"Window/Arrange-cascade.js"]="loaded";MUI.extend({arrangeCascade:function(){var g=30;var a=20;var k=50;var c=40;var j=document.getCoordinates();var d=0;MUI.Windows.instances.each(function(l){if(!l.isMinimized&&l.options.draggable){d++}});if((k*(d+1))>=(j.height-g)){var e=(j.height-g)/(d+1)}else{var e=k}if((c*(d+1))>=(j.width-a-20)){var b=(j.width-a-20)/(d+1)}else{var b=c}var h=a;var f=g;$$(".mocha").each(function(n){var l=n.retrieve("instance");if(!l.isMinimized&&!l.isMaximized&&l.options.draggable){id=n.id;MUI.focusWindow(n);h+=b;f+=e;if(MUI.options.advancedEffects==false){n.setStyles({top:f,left:h})}else{var m=new Fx.Morph(n,{duration:550});m.start({top:f,left:h})}}}.bind(this))}});MUI.files[MUI.path.source+"Window/Arrange-tile.js"]="loaded";MUI.extend({arrangeTile:function(){var g=30;var b=20;var j=10;var f=80;var a=MUI.Windows.instances;var l=0;a.each(function(o){if(!o.isMinimized&&!o.isMaximized){l++}});var h=3;var n=Math.ceil(l/h);var k=document.getCoordinates();var e=((k.width-b)/h);var d=((k.height-g)/n);var m=0;var c=0;a.each(function(x){if(!x.isMinimized&&!x.isMaximized&&x.options.draggable){var t=x.contentWrapperEl;var o=t.getCoordinates();var w=x.windowEl.getCoordinates();var s=o.top-w.top;var v=w.height-o.height-s;var r=o.left-w.left;var y=w.width-o.width-r;var p=(j+(c*e));var u=(f+(m*d));x.drawWindow();MUI.focusWindow(x.windowEl);if(MUI.options.advancedEffects==false){x.windowEl.setStyles({top:u,left:p})}else{var q=new Fx.Morph(x.windowEl,{duration:550});q.start({top:u,left:p})}if(++c===h){m++;c=0}}}.bind(this))}});MUI.files[MUI.path.source+"Components/Tabs.js"]="loaded";MUI.extend({initializeTabs:function(a){$(a).setStyle("list-style","none");$(a).getElements("li").addEvent("click",function(b){MUI.selected(this,a)})},selected:function(b,a){$(a).getChildren().each(function(c){c.removeClass("selected")});b.addClass("selected")}});MUI.files[MUI.path.source+"Layout/Layout.js"]="loaded";MUI.extend({Columns:{instances:new Hash(),columnIDCount:0},Panels:{instances:new Hash(),panelIDCount:0}});MUI.Desktop={options:{desktop:"desktop",desktopHeader:"desktopHeader",desktopFooter:"desktopFooter",desktopNavBar:"desktopNavbar",pageWrapper:"pageWrapper",page:"page",desktopFooter:"desktopFooterWrapper"},initialize:function(){this.desktop=$(this.options.desktop);this.desktopHeader=$(this.options.desktopHeader);this.desktopNavBar=$(this.options.desktopNavBar);this.pageWrapper=$(this.options.pageWrapper);this.page=$(this.options.page);this.desktopFooter=$(this.options.desktopFooter);if(this.desktop){($$("body")).setStyles({overflow:"hidden",height:"100%",margin:0});($$("html")).setStyles({overflow:"hidden",height:"100%"})}if(!MUI.Dock){this.setDesktopSize()}this.menuInitialize();window.addEvent("resize",function(a){this.onBrowserResize()}.bind(this));if(MUI.myChain){MUI.myChain.callChain()}},menuInitialize:function(){if(Browser.Engine.trident4&&this.desktopNavBar){this.desktopNavBar.getElements("li").each(function(a){a.addEvent("mouseenter",function(){this.addClass("ieHover")});a.addEvent("mouseleave",function(){this.removeClass("ieHover")})})}},onBrowserResize:function(){this.setDesktopSize();setTimeout(function(){MUI.Windows.instances.each(function(a){if(a.isMaximized){if(a.iframeEl){a.iframeEl.setStyle("visibility","hidden")}var d=document.getCoordinates();var b=a.contentBorderEl.getStyle("margin-top").toInt()+a.contentBorderEl.getStyle("margin-bottom").toInt();var c=a.toolbarWrapperEl?a.toolbarWrapperEl.getStyle("height").toInt()+a.toolbarWrapperEl.getStyle("margin-top").toInt():0;a.contentWrapperEl.setStyles({height:d.height-a.options.headerHeight-a.options.footerHeight-b-c,width:d.width});a.drawWindow();if(a.iframeEl){a.iframeEl.setStyles({height:a.contentWrapperEl.getStyle("height")});a.iframeEl.setStyle("visibility","visible")}}}.bind(this))}.bind(this),100)},setDesktopSize:function(){var d=window.getCoordinates();var b=$(MUI.options.dockWrapper);if(this.desktop){this.desktop.setStyle("height",d.height)}if(this.pageWrapper){var a=MUI.dockVisible?b.offsetHeight:0;var c=d.height;c-=this.pageWrapper.getStyle("margin-top").toInt();c-=this.pageWrapper.getStyle("margin-bottom").toInt();if(this.desktopHeader){c-=this.desktopHeader.offsetHeight}if(this.desktopFooter){c-=this.desktopFooter.offsetHeight}c-=a;if(c<0){c=0}this.pageWrapper.setStyle("height",c)}if(MUI.Columns.instances.getKeys().length>0){MUI.Desktop.resizePanels()}},resizePanels:function(){MUI.panelHeight();MUI.rWidth()},maximizeWindow:function(f){var g=MUI.Windows.instances.get(f.id);var j=g.options;var c=g.windowDrag;if(f!=$(f)||g.isMaximized){return}if(g.isCollapsed){MUI.collapseToggle(f)}g.isMaximized=true;if(g.options.restrict){c.detach();if(j.resizable){g.detachResizable()}g.titleBarEl.setStyle("cursor","default")}if(j.container!=this.desktop){this.desktop.grab(f);if(this.options.restrict){c.container=this.desktop}}g.oldTop=f.getStyle("top");g.oldLeft=f.getStyle("left");var d=g.contentWrapperEl;d.oldWidth=d.getStyle("width");d.oldHeight=d.getStyle("height");if(g.iframeEl){if(!MUI.ieLegacySupport){g.iframeEl.setStyle("visibility","hidden")}else{g.iframeEl.hide()}}var b=document.getCoordinates();var j=g.options;var e=j.shadowBlur;var h=j.shadowOffset;var a=b.height-j.headerHeight-j.footerHeight;a-=g.contentBorderEl.getStyle("margin-top").toInt();a-=g.contentBorderEl.getStyle("margin-bottom").toInt();a-=(g.toolbarWrapperEl?g.toolbarWrapperEl.getStyle("height").toInt()+g.toolbarWrapperEl.getStyle("margin-top").toInt():0);MUI.resizeWindow(f,{width:b.width,height:a,top:h.y-e,left:h.x-e});g.fireEvent("onMaximize",f);if(g.maximizeButtonEl){g.maximizeButtonEl.setProperty("title","Restore")}MUI.focusWindow(f)},restoreWindow:function(d){var a=d.retrieve("instance");if(d!=$(d)||!a.isMaximized){return}var b=a.options;a.isMaximized=false;if(b.restrict){a.windowDrag.attach();if(b.resizable){a.reattachResizable()}a.titleBarEl.setStyle("cursor","move")}if(a.iframeEl){if(!MUI.ieLegacySupport){a.iframeEl.setStyle("visibility","hidden")}else{a.iframeEl.hide()}}var c=a.contentWrapperEl;MUI.resizeWindow(d,{width:c.oldWidth,height:c.oldHeight,top:a.oldTop,left:a.oldLeft});a.fireEvent("onRestore",d);if(a.maximizeButtonEl){a.maximizeButtonEl.setProperty("title","Maximize")}}};MUI.Column=new Class({Implements:[Events,Options],options:{id:null,container:null,placement:null,width:null,resizeLimit:[],sortable:true,onResize:$empty,onCollapse:$empty,onExpand:$empty},initialize:function(b){this.setOptions(b);$extend(this,{timestamp:$time(),isCollapsed:false,oldWidth:0});if(this.options.id==null){this.options.id="column"+(++MUI.Columns.columnIDCount)}var b=this.options;var g=MUI.Columns.instances;var d=g.get(b.id);if(b.container==null){b.container=MUI.Desktop.pageWrapper}else{$(b.container).setStyle("overflow","hidden")}if(typeof this.options.container=="string"){this.options.container=$(this.options.container)}if(d){var a=d}if(this.columnEl){return}else{g.set(b.id,this)}if($(b.container).getElement(".pad")!=null){$(b.container).getElement(".pad").hide()}if($(b.container).getElement(".mochaContent")!=null){$(b.container).getElement(".mochaContent").hide()}this.columnEl=new Element("div",{id:this.options.id,"class":"column expanded",styles:{width:b.placement=="main"?null:b.width}}).inject($(b.container));this.columnEl.store("instance",this);var c=this.columnEl.getParent();var f=c.getStyle("height").toInt();this.columnEl.setStyle("height",f);if(this.options.sortable){if(!this.options.container.retrieve("sortables")){var e=new Sortables(this.columnEl,{opacity:1,handle:".panel-header",constrain:false,revert:false,onSort:function(){$$(".column").each(function(h){h.getChildren(".panelWrapper").each(function(j){j.getElement(".panel").removeClass("bottomPanel")});if(h.getChildren(".panelWrapper").getLast()){h.getChildren(".panelWrapper").getLast().getElement(".panel").addClass("bottomPanel")}MUI.panelHeight()}.bind(this))}.bind(this)});this.options.container.store("sortables",e)}else{this.options.container.retrieve("sortables").addLists(this.columnEl)}}if(b.placement=="main"){this.columnEl.addClass("rWidth")}switch(this.options.placement){case"left":this.handleEl=new Element("div",{id:this.options.id+"_handle","class":"columnHandle"}).inject(this.columnEl,"after");this.handleIconEl=new Element("div",{id:b.id+"_handle_icon","class":"handleIcon"}).inject(this.handleEl);addResizeRight(this.columnEl,b.resizeLimit[0],b.resizeLimit[1]);break;case"right":this.handleEl=new Element("div",{id:this.options.id+"_handle","class":"columnHandle"}).inject(this.columnEl,"before");this.handleIconEl=new Element("div",{id:b.id+"_handle_icon","class":"handleIcon"}).inject(this.handleEl);addResizeLeft(this.columnEl,b.resizeLimit[0],b.resizeLimit[1]);break}if(this.handleEl!=null){this.handleEl.addEvent("dblclick",function(){this.columnToggle()}.bind(this))}MUI.rWidth()},columnToggle:function(){var a=this.columnEl;if(this.isCollapsed==false){this.oldWidth=a.getStyle("width").toInt();this.resize.detach();this.handleEl.removeEvents("dblclick");this.handleEl.addEvent("click",function(){this.columnToggle()}.bind(this));this.handleEl.setStyle("cursor","pointer").addClass("detached");a.setStyle("width",0);this.isCollapsed=true;a.addClass("collapsed");a.removeClass("expanded");MUI.rWidth();this.fireEvent("onCollapse")}else{a.setStyle("width",this.oldWidth);this.isCollapsed=false;a.addClass("expanded");a.removeClass("collapsed");this.handleEl.removeEvents("click");this.handleEl.addEvent("dblclick",function(){this.columnToggle()}.bind(this));this.resize.attach();this.handleEl.setStyle("cursor",(Browser.Engine.webkit||Browser.Engine.gecko)?"col-resize":"e-resize").addClass("attached");MUI.rWidth();this.fireEvent("onExpand")}}});MUI.Column.implement(new Options,new Events);MUI.Panel=new Class({Implements:[Events,Options],options:{id:null,title:"New Panel",column:null,require:{css:[],images:[],js:[],onload:null},loadMethod:null,contentURL:null,method:"get",data:null,evalScripts:true,evalResponse:false,content:"Panel content",tabsURL:null,tabsData:null,tabsOnload:$empty,header:true,headerToolbox:false,headerToolboxURL:"pages/lipsum.html",headerToolboxOnload:$empty,height:125,addClass:"",scrollbars:true,padding:{top:8,right:8,bottom:8,left:8},collapsible:true,onBeforeBuild:$empty,onContentLoaded:$empty,onResize:$empty,onCollapse:$empty,onExpand:$empty},initialize:function(b){this.setOptions(b);$extend(this,{timestamp:$time(),isCollapsed:false,oldHeight:0,partner:null});if(this.options.id==null){this.options.id="panel"+(++MUI.Panels.panelIDCount)}var f=MUI.Panels.instances;var c=f.get(this.options.id);var b=this.options;if(c){var a=c}if(this.panelEl){return}else{f.set(this.options.id,this)}this.fireEvent("onBeforeBuild");if(b.loadMethod=="iframe"){b.padding={top:0,right:0,bottom:0,left:0}}this.showHandle=true;if($(b.column).getChildren().length==0){this.showHandle=false}this.panelWrapperEl=new Element("div",{id:this.options.id+"_wrapper","class":"panelWrapper expanded"}).inject($(b.column));this.panelEl=new Element("div",{id:this.options.id,"class":"panel expanded",styles:{height:b.height}}).inject(this.panelWrapperEl);this.panelEl.store("instance",this);this.panelEl.addClass(b.addClass);this.contentEl=new Element("div",{id:b.id+"_pad","class":"pad"}).inject(this.panelEl);this.contentWrapperEl=this.panelEl;this.contentEl.setStyles({"padding-top":b.padding.top,"padding-bottom":b.padding.bottom,"padding-left":b.padding.left,"padding-right":b.padding.right});this.panelHeaderEl=new Element("div",{id:this.options.id+"_header","class":"panel-header",styles:{display:b.header?"block":"none"}}).inject(this.panelEl,"before");var d=MUI.Columns.instances;var e=d.get(this.options.column);if(e.options.sortable){this.panelHeaderEl.setStyle("cursor","move");e.options.container.retrieve("sortables").addItems(this.panelWrapperEl)}if(this.options.collapsible){this.collapseToggleInit()}if(this.options.headerToolbox){this.panelHeaderToolboxEl=new Element("div",{id:b.id+"_headerToolbox","class":"panel-header-toolbox"}).inject(this.panelHeaderEl)}this.panelHeaderContentEl=new Element("div",{id:b.id+"_headerContent","class":"panel-headerContent"}).inject(this.panelHeaderEl);this.titleEl=new Element("h2",{id:b.id+"_title"}).inject(this.panelHeaderContentEl);this.handleEl=new Element("div",{id:b.id+"_handle","class":"horizontalHandle",styles:{display:this.showHandle==true?"block":"none"}}).inject(this.panelEl,"after");this.handleIconEl=new Element("div",{id:b.id+"_handle_icon","class":"handleIcon"}).inject(this.handleEl);addResizeBottom(b.id);if(b.require.css.length||b.require.images.length){new MUI.Require({css:b.require.css,images:b.require.images,onload:function(){this.newPanel()}.bind(this)})}else{this.newPanel()}},newPanel:function(){options=this.options;if(this.options.headerToolbox){MUI.updateContent({element:this.panelEl,childElement:this.panelHeaderToolboxEl,loadMethod:"xhr",url:options.headerToolboxURL,onContentLoaded:options.headerToolboxOnload})}if(options.tabsURL==null){this.titleEl.set("html",options.title)}else{this.panelHeaderContentEl.addClass("tabs");MUI.updateContent({element:this.panelEl,childElement:this.panelHeaderContentEl,loadMethod:"xhr",url:options.tabsURL,data:options.tabsData,onContentLoaded:options.tabsOnload})}MUI.updateContent({element:this.panelEl,content:options.content,method:options.method,data:options.data,url:options.contentURL,onContentLoaded:null,require:{js:options.require.js,onload:options.require.onload}});$(options.column).getChildren(".panelWrapper").each(function(a){a.getElement(".panel").removeClass("bottomPanel")});$(options.column).getChildren(".panelWrapper").getLast().getElement(".panel").addClass("bottomPanel");MUI.panelHeight(options.column,this.panelEl,"new")},collapseToggleInit:function(a){var a=this.options;this.panelHeaderCollapseBoxEl=new Element("div",{id:a.id+"_headerCollapseBox","class":"toolbox"}).inject(this.panelHeaderEl);if(a.headerToolbox){this.panelHeaderCollapseBoxEl.addClass("divider")}this.collapseToggleEl=new Element("div",{id:a.id+"_collapseToggle","class":"panel-collapse icon16",styles:{width:16,height:16},title:"Collapse Panel"}).inject(this.panelHeaderCollapseBoxEl);this.collapseToggleEl.addEvent("click",function(f){var b=this.panelEl;var c=this.panelWrapperEl;var g=MUI.Panels.instances;var e=[];c.getAllPrevious(".panelWrapper").each(function(j){var h=g.get(j.getElement(".panel").id);if(h.isCollapsed==false){e.push(j.getElement(".panel").id)}});c.getAllNext(".panelWrapper").each(function(j){var h=g.get(j.getElement(".panel").id);if(h.isCollapsed==false){e.push(j.getElement(".panel").id)}});if(this.isCollapsed==false){var d=MUI.Columns.instances.get($(a.column).id);if(e.length==0&&d.options.placement!="main"){var d=MUI.Columns.instances.get($(a.column).id);d.columnToggle();return}else{if(e.length==0&&d.options.placement=="main"){return}}this.oldHeight=b.getStyle("height").toInt();if(this.oldHeight<10){this.oldHeight=20}this.contentEl.setStyle("position","absolute");b.setStyle("height",0);this.isCollapsed=true;c.addClass("collapsed");c.removeClass("expanded");MUI.panelHeight(a.column,b,"collapsing");MUI.panelHeight();this.collapseToggleEl.removeClass("panel-collapsed");this.collapseToggleEl.addClass("panel-expand");this.collapseToggleEl.setProperty("title","Expand Panel");this.fireEvent("onCollapse")}else{this.contentEl.setStyle("position",null);b.setStyle("height",this.oldHeight);this.isCollapsed=false;c.addClass("expanded");c.removeClass("collapsed");MUI.panelHeight(this.options.column,b,"expanding");MUI.panelHeight();this.collapseToggleEl.removeClass("panel-expand");this.collapseToggleEl.addClass("panel-collapsed");this.collapseToggleEl.setProperty("title","Collapse Panel");this.fireEvent("onExpand")}}.bind(this))}});MUI.Panel.implement(new Options,new Events);MUI.extend({panelHeight:function(a,c,b){if(a!=null){MUI.panelHeight2($(a),c,b)}else{$$(".column").each(function(d){MUI.panelHeight2(d)}.bind(this))}},panelHeight2:function(e,m,f){var b=MUI.Panels.instances;var j=e.getParent();var h=j.getStyle("height").toInt();if(Browser.Engine.trident4&&j==MUI.Desktop.pageWrapper){h-=1}e.setStyle("height",h);var g=[];e.getChildren(".panelWrapper").each(function(n){g.push(n.getElement(".panel"))}.bind(this));var k=[];e.getChildren(".expanded").each(function(n){k.push(n.getElement(".panel"))}.bind(this));var c=[];var d;var a=0;this.panelsTotalHeight=0;this.height=0;g.each(function(n){instance=b.get(n.id);if(n.getParent().hasClass("expanded")&&n.getParent().getNext(".expanded")){instance.partner=n.getParent().getNext(".expanded").getElement(".panel");instance.resize.attach();instance.handleEl.setStyles({display:"block",cursor:(Browser.Engine.webkit||Browser.Engine.gecko)?"row-resize":"n-resize"}).removeClass("detached")}else{instance.resize.detach();instance.handleEl.setStyles({display:"none",cursor:null}).addClass("detached")}if(n.getParent().getNext(".panelWrapper")==null){instance.handleEl.hide()}}.bind(this));e.getChildren().each(function(n){n.getChildren().each(function(p){if(p.hasClass("panel")){var o=b.get(p.id);anyNextSiblingsExpanded=function(q){var r;q.getParent().getAllNext(".panelWrapper").each(function(s){var t=b.get(s.getElement(".panel").id);if(t.isCollapsed==false){r=true}}.bind(this));return r}.bind(this);anyExpandingNextSiblingsExpanded=function(q){var r;m.getParent().getAllNext(".panelWrapper").each(function(s){var t=b.get(s.getElement(".panel").id);if(t.isCollapsed==false){r=true}}.bind(this));return r}.bind(this);anyNextContainsChanging=function(r){var q=[];r.getParent().getAllNext(".panelWrapper").each(function(t){q.push(t.getElement(".panel"))}.bind(this));var s=q.contains(m);return s}.bind(this);nextExpandedChanging=function(q){var r;if(q.getParent().getNext(".expanded")){if(q.getParent().getNext(".expanded").getElement(".panel")==m){r=true}}return r};if(f=="new"){if(!o.isCollapsed&&p!=m){c.push(p);this.panelsTotalHeight+=p.offsetHeight.toInt()}}else{if(f==null||f=="collapsing"){if(!o.isCollapsed&&(!anyNextContainsChanging(p)||!anyNextSiblingsExpanded(p))){c.push(p);this.panelsTotalHeight+=p.offsetHeight.toInt()}}else{if(f=="expanding"&&!o.isCollapsed&&p!=m){if(!anyNextContainsChanging(p)||(!anyExpandingNextSiblingsExpanded(p)&&nextExpandedChanging(p))){c.push(p);this.panelsTotalHeight+=p.offsetHeight.toInt()}}}}if(p.style.height){this.height+=p.getStyle("height").toInt()}}else{this.height+=p.offsetHeight.toInt()}}.bind(this))}.bind(this));var l=e.offsetHeight.toInt()-this.height;this.height=0;e.getChildren().each(function(n){this.height+=n.offsetHeight.toInt()}.bind(this));var l=e.offsetHeight.toInt()-this.height;c.each(function(n){var q=this.panelsTotalHeight/n.offsetHeight.toInt();var p=n.getStyle("height").toInt();var o=l/q;if(!isNaN(p)){o+=p}if(o<1){o=0}n.setStyle("height",o)}.bind(this));this.height=0;e.getChildren().each(function(n){n.getChildren().each(function(o){this.height+=o.offsetHeight.toInt();if(o.hasClass("panel")&&o.getStyle("height").toInt()>a){d=o;a=o.getStyle("height").toInt()}}.bind(this))}.bind(this));var l=e.offsetHeight.toInt()-this.height;if(l!=0&&a>0){d.setStyle("height",d.getStyle("height").toInt()+l);if(d.getStyle("height")<1){d.setStyle("height",0)}}j.getChildren(".columnHandle").each(function(p){var o=p.getParent();if(o.getStyle("height").toInt()<1){return}var n=o.getStyle("height").toInt()-p.getStyle("margin-top").toInt()-p.getStyle("margin-bottom").toInt();if(Browser.Engine.trident4&&o==MUI.Desktop.pageWrapper){n-=1}p.setStyle("height",n)});k.each(function(n){MUI.resizeChildren(n)}.bind(this))},resizeChildren:function(b){var d=MUI.Panels.instances;var a=d.get(b.id);var c=a.contentWrapperEl;if(a.iframeEl){if(!MUI.ieLegacySupport){a.iframeEl.setStyles({height:c.getStyle("height"),width:c.offsetWidth-c.getStyle("margin-left").toInt()-c.getStyle("margin-right").toInt()})}else{a.iframeEl.setStyles({height:c.getStyle("height"),width:c.offsetWidth-c.getStyle("margin-left").toInt()-c.getStyle("margin-right").toInt()-1});a.iframeEl.setStyles({width:c.offsetWidth-c.getStyle("margin-left").toInt()-c.getStyle("margin-right").toInt()})}}},rWidth:function(a){if(a==null){var a=MUI.Desktop.desktop}a.getElements(".rWidth").each(function(e){var b=e.offsetWidth.toInt();b-=e.getStyle("margin-left").toInt();b-=e.getStyle("margin-right").toInt();var d=e.getParent();this.width=0;d.getChildren().each(function(g){if(g.hasClass("mocha")!=true){this.width+=g.offsetWidth.toInt()}}.bind(this));var c=d.offsetWidth.toInt()-this.width;var f=b+c;if(f<1){f=0}e.setStyle("width",f);e.getChildren(".panel").each(function(g){g.setStyle("width",f-g.getStyle("margin-left").toInt()-g.getStyle("margin-right").toInt());MUI.resizeChildren(g)}.bind(this))})}});function addResizeRight(d,c,b){if(!$(d)){return}d=$(d);var f=MUI.Columns.instances;var a=f.get(d.id);var e=d.getNext(".columnHandle");e.setStyle("cursor",(Browser.Engine.webkit||Browser.Engine.gecko)?"col-resize":"e-resize");if(!c){c=50}if(!b){b=250}if(MUI.ieLegacySupport){e.addEvents({mousedown:function(){e.setCapture()},mouseup:function(){e.releaseCapture()}})}a.resize=d.makeResizable({handle:e,modifiers:{x:"width",y:false},limit:{x:[c,b]},onStart:function(){d.getElements("iframe").setStyle("visibility","hidden");d.getNext(".column").getElements("iframe").setStyle("visibility","hidden")}.bind(this),onDrag:function(){MUI.rWidth(d.getParent());if(Browser.Engine.trident4){d.getChildren().each(function(h){var g=$(d).getStyle("width").toInt();g-=h.getStyle("margin-right").toInt();g-=h.getStyle("margin-left").toInt();g-=h.getStyle("padding-right").toInt();g-=h.getStyle("padding-left").toInt();h.setStyle("width",g)}.bind(this))}}.bind(this),onComplete:function(){MUI.rWidth(d.getParent());d.getElements("iframe").setStyle("visibility","visible");d.getNext(".column").getElements("iframe").setStyle("visibility","visible");a.fireEvent("onResize")}.bind(this)})}function addResizeLeft(d,c,b){if(!$(d)){return}d=$(d);var g=MUI.Columns.instances;var a=g.get(d.id);var f=d.getPrevious(".columnHandle");f.setStyle("cursor",(Browser.Engine.webkit||Browser.Engine.gecko)?"col-resize":"e-resize");var e=d.getPrevious(".column");if(!c){c=50}if(!b){b=250}if(MUI.ieLegacySupport){f.addEvents({mousedown:function(){f.setCapture()},mouseup:function(){f.releaseCapture()}})}a.resize=d.makeResizable({handle:f,modifiers:{x:"width",y:false},invert:true,limit:{x:[c,b]},onStart:function(){$(d).getElements("iframe").setStyle("visibility","hidden");e.getElements("iframe").setStyle("visibility","hidden")}.bind(this),onDrag:function(){MUI.rWidth(d.getParent())}.bind(this),onComplete:function(){MUI.rWidth(d.getParent());$(d).getElements("iframe").setStyle("visibility","visible");e.getElements("iframe").setStyle("visibility","visible");a.fireEvent("onResize")}.bind(this)})}function addResizeBottom(b){if(!$(b)){return}var b=$(b);var d=MUI.Panels.instances;var a=d.get(b.id);var c=a.handleEl;c.setStyle("cursor",(Browser.Engine.webkit||Browser.Engine.gecko)?"row-resize":"n-resize");partner=a.partner;min=0;max=function(){return b.getStyle("height").toInt()+partner.getStyle("height").toInt()}.bind(this);if(MUI.ieLegacySupport){c.addEvents({mousedown:function(){c.setCapture()},mouseup:function(){c.releaseCapture()}})}a.resize=b.makeResizable({handle:c,modifiers:{x:false,y:"height"},limit:{y:[min,max]},invert:false,onBeforeStart:function(){partner=a.partner;this.originalHeight=b.getStyle("height").toInt();this.partnerOriginalHeight=partner.getStyle("height").toInt()}.bind(this),onStart:function(){if(a.iframeEl){if(!MUI.ieLegacySupport){a.iframeEl.setStyle("visibility","hidden");partner.getElements("iframe").setStyle("visibility","hidden")}else{a.iframeEl.hide();partner.getElements("iframe").hide()}}}.bind(this),onDrag:function(){partnerHeight=partnerOriginalHeight;partnerHeight+=(this.originalHeight-b.getStyle("height").toInt());partner.setStyle("height",partnerHeight);MUI.resizeChildren(b,b.getStyle("height").toInt());MUI.resizeChildren(partner,partnerHeight);b.getChildren(".column").each(function(e){MUI.panelHeight(e)});partner.getChildren(".column").each(function(e){MUI.panelHeight(e)})}.bind(this),onComplete:function(){partnerHeight=partnerOriginalHeight;partnerHeight+=(this.originalHeight-b.getStyle("height").toInt());partner.setStyle("height",partnerHeight);MUI.resizeChildren(b,b.getStyle("height").toInt());MUI.resizeChildren(partner,partnerHeight);b.getChildren(".column").each(function(f){MUI.panelHeight(f)});partner.getChildren(".column").each(function(f){MUI.panelHeight(f)});if(a.iframeEl){if(!MUI.ieLegacySupport){a.iframeEl.setStyle("visibility","visible");partner.getElements("iframe").setStyle("visibility","visible")}else{a.iframeEl.show();partner.getElements("iframe").show();var e=a.iframeEl.getStyle("width").toInt();a.iframeEl.setStyle("width",e-1);MUI.rWidth();a.iframeEl.setStyle("width",e)}}a.fireEvent("onResize")}.bind(this)})}MUI.extend({closeColumn:function(b){var d=MUI.Columns.instances;var a=d.get(b.id);if(b!=$(b)||a.isClosing){return}a.isClosing=true;if(a.options.sortable){a.container.retrieve("sortables").removeLists(this.columnEl)}var c=b.getChildren(".panel");c.each(function(e){MUI.closePanel($(e.id))}.bind(this));if(MUI.ieLegacySupport){b.dispose();if(a.handleEl!=null){a.handleEl.dispose()}}else{b.destroy();if(a.handleEl!=null){a.handleEl.destroy()}}if(MUI.Desktop){MUI.Desktop.resizePanels()}d.erase(a.options.id);return true},closePanel:function(f){var e=MUI.Panels.instances;var a=e.get(f.id);if(f!=$(f)||a.isClosing){return}var b=a.options.column;a.isClosing=true;var c=MUI.Columns.instances;var d=c.get(b);if(d.options.sortable){d.options.container.retrieve("sortables").removeItems(a.panelWrapperEl)}a.panelWrapperEl.destroy();if(MUI.Desktop){MUI.Desktop.resizePanels()}$(b).getChildren(".panelWrapper").each(function(g){g.getElement(".panel").removeClass("bottomPanel")});$(b).getChildren(".panelWrapper").getLast().getElement(".panel").addClass("bottomPanel");e.erase(a.options.id);return true}});MUI.files[MUI.path.source+"Layout/Dock.js"]="loaded";MUI.options.extend({dockWrapper:"dockWrapper",dock:"dock"});MUI.extend({minimizeAll:function(){$$(".mocha").each(function(b){var a=b.retrieve("instance");if(!a.isMinimized&&a.options.minimizable==true){MUI.Dock.minimizeWindow(b)}}.bind(this))}});MUI.Dock={options:{useControls:true,dockPosition:"bottom",trueButtonColor:[70,245,70],enabledButtonColor:[115,153,191],disabledButtonColor:[170,170,170]},initialize:function(a){if(!MUI.Desktop){return}MUI.dockVisible=true;this.dockWrapper=$(MUI.options.dockWrapper);this.dock=$(MUI.options.dock);this.autoHideEvent=null;this.dockAutoHide=false;if(!this.dockWrapper){return}if(!this.options.useControls){if($("dockPlacement")){$("dockPlacement").setStyle("cursor","default")}if($("dockAutoHide")){$("dockAutoHide").setStyle("cursor","default")}}this.dockWrapper.setStyles({display:"block",position:"absolute",top:null,bottom:MUI.Desktop.desktopFooter?MUI.Desktop.desktopFooter.offsetHeight:0,left:0});if(this.options.useControls){this.initializeDockControls()}if($("dockLinkCheck")){this.sidebarCheck=new Element("div",{"class":"check",id:"dock_check"}).inject($("dockLinkCheck"))}this.dockSortables=new Sortables("#dockSort",{opacity:1,constrain:true,clone:false,revert:false});MUI.Desktop.setDesktopSize();if(MUI.myChain){MUI.myChain.callChain()}},initializeDockControls:function(){this.setDockColors();if(this.options.useControls){var b=new Element("canvas",{id:"dockCanvas",width:"15",height:"18"}).inject(this.dock);if(MUI.ieLegacySupport&&MUI.ieSupport=="excanvas"){G_vmlCanvasManager.initElement(b)}}var a=$("dockPlacement");var c=$("dockAutoHide");a.setProperty("title","Position Dock Top");a.addEvent("click",function(){this.moveDock()}.bind(this));c.setProperty("title","Turn Auto Hide On");c.addEvent("click",function(e){if(this.dockWrapper.getProperty("dockPosition")=="top"){return false}var d=$("dockCanvas").getContext("2d");this.dockAutoHide=!this.dockAutoHide;if(this.dockAutoHide){$("dockAutoHide").setProperty("title","Turn Auto Hide Off");MUI.circle(d,5,14,3,this.options.trueButtonColor,1);this.autoHideEvent=function(g){if(!this.dockAutoHide){return}if(!MUI.Desktop.desktopFooter){var f=this.dockWrapper.offsetHeight;if(f<25){f=25}}else{if(MUI.Desktop.desktopFooter){var f=this.dockWrapper.offsetHeight+MUI.Desktop.desktopFooter.offsetHeight;if(f<25){f=25}}}if(!MUI.Desktop.desktopFooter&&g.client.y>(document.getCoordinates().height-f)){if(!MUI.dockVisible){this.dockWrapper.show();MUI.dockVisible=true;MUI.Desktop.setDesktopSize()}}else{if(MUI.Desktop.desktopFooter&&g.client.y>(document.getCoordinates().height-f)){if(!MUI.dockVisible){this.dockWrapper.show();MUI.dockVisible=true;MUI.Desktop.setDesktopSize()}}else{if(MUI.dockVisible){this.dockWrapper.hide();MUI.dockVisible=false;MUI.Desktop.setDesktopSize()}}}}.bind(this);document.addEvent("mousemove",this.autoHideEvent)}else{$("dockAutoHide").setProperty("title","Turn Auto Hide On");MUI.circle(d,5,14,3,this.options.enabledButtonColor,1);document.removeEvent("mousemove",this.autoHideEvent)}}.bind(this));this.renderDockControls();if(this.options.dockPosition=="top"){this.moveDock()}},setDockColors:function(){var c=MUI.getCSSRule(".dockButtonEnabled");if(c&&c.style.backgroundColor){this.options.enabledButtonColor=new Color(c.style.backgroundColor)}var a=MUI.getCSSRule(".dockButtonDisabled");if(a&&a.style.backgroundColor){this.options.disabledButtonColor=new Color(a.style.backgroundColor)}var b=MUI.getCSSRule(".dockButtonTrue");if(b&&b.style.backgroundColor){this.options.trueButtonColor=new Color(b.style.backgroundColor)}},renderDockControls:function(){var a=$("dockCanvas").getContext("2d");a.clearRect(0,0,100,100);MUI.circle(a,5,4,3,this.options.enabledButtonColor,1);if(this.dockWrapper.getProperty("dockPosition")=="top"){MUI.circle(a,5,14,3,this.options.disabledButtonColor,1)}else{if(this.dockAutoHide){MUI.circle(a,5,14,3,this.options.trueButtonColor,1)}else{MUI.circle(a,5,14,3,this.options.enabledButtonColor,1)}}},moveDock:function(){var a=$("dockCanvas").getContext("2d");if(this.dockWrapper.getStyle("position")!="relative"){this.dockWrapper.setStyles({position:"relative",bottom:null});this.dockWrapper.addClass("top");MUI.Desktop.setDesktopSize();this.dockWrapper.setProperty("dockPosition","top");a.clearRect(0,0,100,100);MUI.circle(a,5,4,3,this.options.enabledButtonColor,1);MUI.circle(a,5,14,3,this.options.disabledButtonColor,1);$("dockPlacement").setProperty("title","Position Dock Bottom");$("dockAutoHide").setProperty("title","Auto Hide Disabled in Top Dock Position");this.dockAutoHide=false}else{this.dockWrapper.setStyles({position:"absolute",bottom:MUI.Desktop.desktopFooter?MUI.Desktop.desktopFooter.offsetHeight:0});this.dockWrapper.removeClass("top");MUI.Desktop.setDesktopSize();this.dockWrapper.setProperty("dockPosition","bottom");a.clearRect(0,0,100,100);MUI.circle(a,5,4,3,this.options.enabledButtonColor,1);MUI.circle(a,5,14,3,this.options.enabledButtonColor,1);$("dockPlacement").setProperty("title","Position Dock Top");$("dockAutoHide").setProperty("title","Turn Auto Hide On")}},createDockTab:function(e){var a=e.retrieve("instance");var d=new Element("div",{id:a.options.id+"_dockTab","class":"dockTab",title:b}).inject($("dockClear"),"before");d.addEvent("mousedown",function(f){new Event(f).stop();this.timeDown=$time()});d.addEvent("mouseup",function(f){this.timeUp=$time();if((this.timeUp-this.timeDown)<275){if(MUI.Windows.windowsVisible==false){MUI.toggleWindowVisibility();if(a.isMinimized==true){MUI.Dock.restoreMinimized.delay(25,MUI.Dock,e)}else{MUI.focusWindow(e)}return}if(a.isMinimized==true){MUI.Dock.restoreMinimized.delay(25,MUI.Dock,e)}else{if(a.windowEl.hasClass("isFocused")&&a.options.minimizable==true){MUI.Dock.minimizeWindow(e)}else{MUI.focusWindow(e)}var g=document.getCoordinates();if(e.getStyle("left").toInt()>g.width||e.getStyle("top").toInt()>g.height){MUI.centerWindow(e)}}}});this.dockSortables.addItems(d);var b=a.titleEl.innerHTML;var c=new Element("div",{id:a.options.id+"_dockTabText","class":"dockText"}).set("html",b.substring(0,19)+(b.length>19?"...":"")).inject($(d));if(a.options.icon!=false){}MUI.Desktop.setDesktopSize()},makeActiveTab:function(){var c=MUI.getWindowWithHighestZindex();var a=c.retrieve("instance");$$(".dockTab").removeClass("activeDockTab");if(a.isMinimized!=true){a.windowEl.addClass("isFocused");var b=$(a.options.id+"_dockTab");if(b!=null){b.addClass("activeDockTab")}}else{a.windowEl.removeClass("isFocused")}},minimizeWindow:function(b){if(b!=$(b)){return}var a=b.retrieve("instance");a.isMinimized=true;if(a.iframeEl){if(!MUI.ieLegacySupport){a.iframeEl.setStyle("visibility","hidden")}else{a.iframeEl.hide()}}a.contentBorderEl.setStyle("visibility","hidden");if(a.toolbarWrapperEl){a.toolbarWrapperEl.hide()}b.setStyle("visibility","hidden");MUI.Desktop.setDesktopSize();setTimeout(function(){b.setStyle("zIndex",1);b.removeClass("isFocused");this.makeActiveTab()}.bind(this),100);a.fireEvent("onMinimize",b)},restoreMinimized:function(b){var a=b.retrieve("instance");if(a.isMinimized==false){return}if(MUI.Windows.windowsVisible==false){MUI.toggleWindowVisibility()}MUI.Desktop.setDesktopSize();if(a.options.scrollbars==true&&!a.iframeEl){a.contentWrapperEl.setStyle("overflow","auto")}if(a.isCollapsed){MUI.collapseToggle(b)}b.setStyle("visibility","visible");a.contentBorderEl.setStyle("visibility","visible");if(a.toolbarWrapperEl){a.toolbarWrapperEl.show()}if(a.iframeEl){if(!MUI.ieLegacySupport){a.iframeEl.setStyle("visibility","visible")}else{a.iframeEl.show()}}a.isMinimized=false;MUI.focusWindow(b);a.fireEvent("onRestore",b)}};MUI.files[MUI.path.source+"Layout/Workspaces.js"]="loaded";MUI.extend({saveWorkspace:function(){this.cookie=new Hash.Cookie("mochaUIworkspaceCookie",{duration:3600});this.cookie.empty();MUI.Windows.instances.each(function(a){a.saveValues();this.cookie.set(a.options.id,{id:a.options.id,top:a.options.y,left:a.options.x,width:a.contentWrapperEl.getStyle("width").toInt(),height:a.contentWrapperEl.getStyle("height").toInt()})}.bind(this));this.cookie.save();new MUI.Window({loadMethod:"html",type:"notification",addClass:"notification",content:"Workspace saved.",closeAfter:"1400",width:200,height:40,y:53,padding:{top:10,right:12,bottom:10,left:12},shadowBlur:5,bodyBgColor:[255,255,255]})},windowUnload:function(){if($$(".mocha").length==0&&this.myChain){this.myChain.callChain()}},loadWorkspace2:function(workspaceWindows){workspaceWindows.each(function(workspaceWindow){windowFunction=eval("MUI."+workspaceWindow.id+"Window");if(windowFunction){eval("MUI."+workspaceWindow.id+"Window({width:"+workspaceWindow.width+",height:"+workspaceWindow.height+"});");var windowEl=$(workspaceWindow.id);windowEl.setStyles({top:workspaceWindow.top,left:workspaceWindow.left});var instance=windowEl.retrieve("instance");instance.contentWrapperEl.setStyles({width:workspaceWindow.width,height:workspaceWindow.height});instance.drawWindow()}}.bind(this));this.loadingWorkspace=false},loadWorkspace:function(){cookie=new Hash.Cookie("mochaUIworkspaceCookie",{duration:3600});workspaceWindows=cookie.load();if(!cookie.getKeys().length){new MUI.Window({loadMethod:"html",type:"notification",addClass:"notification",content:"You have no saved workspace.",closeAfter:"1400",width:220,height:40,y:25,padding:{top:10,right:12,bottom:10,left:12},shadowBlur:5,bodyBgColor:[255,255,255]});return}if($$(".mocha").length!=0){this.loadingWorkspace=true;this.myChain=new Chain();this.myChain.chain(function(){$$(".mocha").each(function(a){this.closeWindow(a)}.bind(this))}.bind(this),function(){this.loadWorkspace2(workspaceWindows)}.bind(this));this.myChain.callChain()}else{this.loadWorkspace2(workspaceWindows)}}}); \ No newline at end of file diff -Nru qbittorrent-4.1.3/src/webui/www/private/scripts/lib/mootools-1.2-core-yc.js qbittorrent-3.3.15/src/webui/www/private/scripts/lib/mootools-1.2-core-yc.js --- qbittorrent-4.1.3/src/webui/www/private/scripts/lib/mootools-1.2-core-yc.js 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/scripts/lib/mootools-1.2-core-yc.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,527 +0,0 @@ -/* ---- -MooTools: the javascript framework - -web build: - - http://mootools.net/core/76bf47062d6c1983d66ce47ad66aa0e0 - -packager build: - - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Delegation Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady Core/Swiff - -copyrights: - - [MooTools](http://mootools.net) - -licenses: - - [MIT License](http://mootools.net/license.txt) -... -*/ - -(function(){this.MooTools={version:"1.4.5",build:"ab8ea8824dc3b24b6666867a2c4ed58ebb762cf0"};var e=this.typeOf=function(i){if(i==null){return"null";}if(i.$family!=null){return i.$family(); -}if(i.nodeName){if(i.nodeType==1){return"element";}if(i.nodeType==3){return(/\S/).test(i.nodeValue)?"textnode":"whitespace";}}else{if(typeof i.length=="number"){if(i.callee){return"arguments"; -}if("item" in i){return"collection";}}}return typeof i;};var u=this.instanceOf=function(w,i){if(w==null){return false;}var v=w.$constructor||w.constructor; -while(v){if(v===i){return true;}v=v.parent;}if(!w.hasOwnProperty){return false;}return w instanceof i;};var f=this.Function;var r=true;for(var q in {toString:1}){r=null; -}if(r){r=["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"];}f.prototype.overloadSetter=function(v){var i=this; -return function(x,w){if(x==null){return this;}if(v||typeof x!="string"){for(var y in x){i.call(this,y,x[y]);}if(r){for(var z=r.length;z--;){y=r[z];if(x.hasOwnProperty(y)){i.call(this,y,x[y]); -}}}}else{i.call(this,x,w);}return this;};};f.prototype.overloadGetter=function(v){var i=this;return function(x){var y,w;if(typeof x!="string"){y=x;}else{if(arguments.length>1){y=arguments; -}else{if(v){y=[x];}}}if(y){w={};for(var z=0;z>>0; -b>>0;b>>0;for(var a=(d<0)?Math.max(0,b+d):d||0;a>>0,b=Array(d);for(var a=0;a>>0; -b-1:String(this).indexOf(a)>-1;},trim:function(){return String(this).replace(/^\s+|\s+$/g,""); -},clean:function(){return String(this).replace(/\s+/g," ").trim();},camelCase:function(){return String(this).replace(/-\D/g,function(a){return a.charAt(1).toUpperCase(); -});},hyphenate:function(){return String(this).replace(/[A-Z]/g,function(a){return("-"+a.charAt(0).toLowerCase());});},capitalize:function(){return String(this).replace(/\b[a-z]/g,function(a){return a.toUpperCase(); -});},escapeRegExp:function(){return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1");},toInt:function(a){return parseInt(this,a||10);},toFloat:function(){return parseFloat(this); -},hexToRgb:function(b){var a=String(this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);return(a)?a.slice(1).hexToRgb(b):null;},rgbToHex:function(b){var a=String(this).match(/\d{1,3}/g); -return(a)?a.rgbToHex(b):null;},substitute:function(a,b){return String(this).replace(b||(/\\?\{([^{}]+)\}/g),function(d,c){if(d.charAt(0)=="\\"){return d.slice(1); -}return(a[c]!=null)?a[c]:"";});}});Number.implement({limit:function(b,a){return Math.min(a,Math.max(b,this));},round:function(a){a=Math.pow(10,a||0).toFixed(a<0?-a:0); -return Math.round(this*a)/a;},times:function(b,c){for(var a=0;a1?Array.slice(arguments,1):null,d=function(){};var c=function(){var g=e,h=arguments.length;if(this instanceof c){d.prototype=a.prototype; -g=new d;}var f=(!b&&!h)?a.call(g):a.apply(g,b&&h?b.concat(Array.slice(arguments)):b||arguments);return g==e?f:g;};return c;},pass:function(b,c){var a=this; -if(b!=null){b=Array.from(b);}return function(){return a.apply(c,b||arguments);};},delay:function(b,c,a){return setTimeout(this.pass((a==null?[]:a),c),b); -},periodical:function(c,b,a){return setInterval(this.pass((a==null?[]:a),b),c);}});delete Function.prototype.bind;Function.implement({create:function(b){var a=this; -b=b||{};return function(d){var c=b.arguments;c=(c!=null)?Array.from(c):Array.slice(arguments,(b.event)?1:0);if(b.event){c=[d||window.event].extend(c);}var e=function(){return a.apply(b.bind||null,c); -};if(b.delay){return setTimeout(e,b.delay);}if(b.periodical){return setInterval(e,b.periodical);}if(b.attempt){return Function.attempt(e);}return e();}; -},bind:function(c,b){var a=this;if(b!=null){b=Array.from(b);}return function(){return a.apply(c,b||arguments);};},bindWithEvent:function(c,b){var a=this; -if(b!=null){b=Array.from(b);}return function(d){return a.apply(c,(b==null)?arguments:[d].concat(b));};},run:function(a,b){return this.apply(b,Array.from(a)); -}});if(Object.create==Function.prototype.create){Object.create=null;}var $try=Function.attempt;(function(){var a=Object.prototype.hasOwnProperty;Object.extend({subset:function(d,g){var f={}; -for(var e=0,b=g.length;e]*>([\s\S]*?)<\/script>/gi,function(r,s){e+=s+"\n"; -return"";});if(p===true){o.exec(e);}else{if(typeOf(p)=="function"){p(e,q);}}return q;});o.extend({Document:this.Document,Window:this.Window,Element:this.Element,Event:this.Event}); -this.Window=this.$constructor=new Type("Window",function(){});this.$family=Function.from("window").hide();Window.mirror(function(e,p){h[e]=p;});this.Document=k.$constructor=new Type("Document",function(){}); -k.$family=Function.from("document").hide();Document.mirror(function(e,p){k[e]=p;});k.html=k.documentElement;if(!k.head){k.head=k.getElementsByTagName("head")[0]; -}if(k.execCommand){try{k.execCommand("BackgroundImageCache",false,true);}catch(g){}}if(this.attachEvent&&!this.addEventListener){var c=function(){this.detachEvent("onunload",c); -k.head=k.html=k.window=null;};this.attachEvent("onunload",c);}var m=Array.from;try{m(k.html.childNodes);}catch(g){Array.from=function(p){if(typeof p!="string"&&Type.isEnumerable(p)&&typeOf(p)!="array"){var e=p.length,q=new Array(e); -while(e--){q[e]=p[e];}return q;}return m(p);};var l=Array.prototype,n=l.slice;["pop","push","reverse","shift","sort","splice","unshift","concat","join","slice"].each(function(e){var p=l[e]; -Array[e]=function(q){return p.apply(Array.from(q),n.call(arguments,1));};});}if(o.Platform.ios){o.Platform.ipod=true;}o.Engine={};var d=function(p,e){o.Engine.name=p; -o.Engine[p+e]=true;o.Engine.version=e;};if(o.ie){o.Engine.trident=true;switch(o.version){case 6:d("trident",4);break;case 7:d("trident",5);break;case 8:d("trident",6); -}}if(o.firefox){o.Engine.gecko=true;if(o.version>=3){d("gecko",19);}else{d("gecko",18);}}if(o.safari||o.chrome){o.Engine.webkit=true;switch(o.version){case 2:d("webkit",419); -break;case 3:d("webkit",420);break;case 4:d("webkit",525);}}if(o.opera){o.Engine.presto=true;if(o.version>=9.6){d("presto",960);}else{if(o.version>=9.5){d("presto",950); -}else{d("presto",925);}}}if(o.name=="unknown"){switch((a.match(/(?:webkit|khtml|gecko)/)||[])[0]){case"webkit":case"khtml":o.Engine.webkit=true;break;case"gecko":o.Engine.gecko=true; -}}this.$exec=o.exec;})();(function(){var b={};var a=this.DOMEvent=new Type("DOMEvent",function(c,g){if(!g){g=window;}c=c||g.event;if(c.$extended){return c; -}this.event=c;this.$extended=true;this.shift=c.shiftKey;this.control=c.ctrlKey;this.alt=c.altKey;this.meta=c.metaKey;var i=this.type=c.type;var h=c.target||c.srcElement; -while(h&&h.nodeType==3){h=h.parentNode;}this.target=document.id(h);if(i.indexOf("key")==0){var d=this.code=(c.which||c.keyCode);this.key=b[d]||Object.keyOf(Event.Keys,d); -if(i=="keydown"){if(d>111&&d<124){this.key="f"+(d-111);}else{if(d>95&&d<106){this.key=d-96;}}}if(this.key==null){this.key=String.fromCharCode(d).toLowerCase(); -}}else{if(i=="click"||i=="dblclick"||i=="contextmenu"||i=="DOMMouseScroll"||i.indexOf("mouse")==0){var j=g.document;j=(!j.compatMode||j.compatMode=="CSS1Compat")?j.html:j.body; -this.page={x:(c.pageX!=null)?c.pageX:c.clientX+j.scrollLeft,y:(c.pageY!=null)?c.pageY:c.clientY+j.scrollTop};this.client={x:(c.pageX!=null)?c.pageX-g.pageXOffset:c.clientX,y:(c.pageY!=null)?c.pageY-g.pageYOffset:c.clientY}; -if(i=="DOMMouseScroll"||i=="mousewheel"){this.wheel=(c.wheelDelta)?c.wheelDelta/120:-(c.detail||0)/3;}this.rightClick=(c.which==3||c.button==2);if(i=="mouseover"||i=="mouseout"){var k=c.relatedTarget||c[(i=="mouseover"?"from":"to")+"Element"]; -while(k&&k.nodeType==3){k=k.parentNode;}this.relatedTarget=document.id(k);}}else{if(i.indexOf("touch")==0||i.indexOf("gesture")==0){this.rotation=c.rotation; -this.scale=c.scale;this.targetTouches=c.targetTouches;this.changedTouches=c.changedTouches;var f=this.touches=c.touches;if(f&&f[0]){var e=f[0];this.page={x:e.pageX,y:e.pageY}; -this.client={x:e.clientX,y:e.clientY};}}}}if(!this.client){this.client={};}if(!this.page){this.page={};}});a.implement({stop:function(){return this.preventDefault().stopPropagation(); -},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation();}else{this.event.cancelBubble=true;}return this;},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault(); -}else{this.event.returnValue=false;}return this;}});a.defineKey=function(d,c){b[d]=c;return this;};a.defineKeys=a.defineKey.overloadSetter(true);a.defineKeys({"38":"up","40":"down","37":"left","39":"right","27":"esc","32":"space","8":"backspace","9":"tab","46":"delete","13":"enter"}); -})();var Event=DOMEvent;Event.Keys={};Event.Keys=new Hash(Event.Keys);(function(){var a=this.Class=new Type("Class",function(h){if(instanceOf(h,Function)){h={initialize:h}; -}var g=function(){e(this);if(g.$prototyping){return this;}this.$caller=null;var i=(this.initialize)?this.initialize.apply(this,arguments):this;this.$caller=this.caller=null; -return i;}.extend(this).implement(h);g.$constructor=a;g.prototype.$constructor=g;g.prototype.parent=c;return g;});var c=function(){if(!this.$caller){throw new Error('The method "parent" cannot be called.'); -}var g=this.$caller.$name,h=this.$caller.$owner.parent,i=(h)?h.prototype[g]:null;if(!i){throw new Error('The method "'+g+'" has no parent.');}return i.apply(this,arguments); -};var e=function(g){for(var h in g){var j=g[h];switch(typeOf(j)){case"object":var i=function(){};i.prototype=j;g[h]=e(new i);break;case"array":g[h]=j.clone(); -break;}}return g;};var b=function(g,h,j){if(j.$origin){j=j.$origin;}var i=function(){if(j.$protected&&this.$caller==null){throw new Error('The method "'+h+'" cannot be called.'); -}var l=this.caller,m=this.$caller;this.caller=m;this.$caller=i;var k=j.apply(this,arguments);this.$caller=m;this.caller=l;return k;}.extend({$owner:g,$origin:j,$name:h}); -return i;};var f=function(h,i,g){if(a.Mutators.hasOwnProperty(h)){i=a.Mutators[h].call(this,i);if(i==null){return this;}}if(typeOf(i)=="function"){if(i.$hidden){return this; -}this.prototype[h]=(g)?i:b(this,h,i);}else{Object.merge(this.prototype,h,i);}return this;};var d=function(g){g.$prototyping=true;var h=new g;delete g.$prototyping; -return h;};a.implement("implement",f.overloadSetter());a.Mutators={Extends:function(g){this.parent=g;this.prototype=d(g);},Implements:function(g){Array.from(g).each(function(j){var h=new j; -for(var i in h){f.call(this,i,h[i],true);}},this);}};})();(function(){this.Chain=new Class({$chain:[],chain:function(){this.$chain.append(Array.flatten(arguments)); -return this;},callChain:function(){return(this.$chain.length)?this.$chain.shift().apply(this,arguments):false;},clearChain:function(){this.$chain.empty(); -return this;}});var a=function(b){return b.replace(/^on([A-Z])/,function(c,d){return d.toLowerCase();});};this.Events=new Class({$events:{},addEvent:function(d,c,b){d=a(d); -if(c==$empty){return this;}this.$events[d]=(this.$events[d]||[]).include(c);if(b){c.internal=true;}return this;},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]); -}return this;},fireEvent:function(e,c,b){e=a(e);var d=this.$events[e];if(!d){return this;}c=Array.from(c);d.each(function(f){if(b){f.delay(b,this,c);}else{f.apply(this,c); -}},this);return this;},removeEvent:function(e,d){e=a(e);var c=this.$events[e];if(c&&!d.internal){var b=c.indexOf(d);if(b!=-1){delete c[b];}}return this; -},removeEvents:function(d){var e;if(typeOf(d)=="object"){for(e in d){this.removeEvent(e,d[e]);}return this;}if(d){d=a(d);}for(e in this.$events){if(d&&d!=e){continue; -}var c=this.$events[e];for(var b=c.length;b--;){if(b in c){this.removeEvent(e,c[b]);}}}return this;}});this.Options=new Class({setOptions:function(){var b=this.options=Object.merge.apply(null,[{},this.options].append(arguments)); -if(this.addEvent){for(var c in b){if(typeOf(b[c])!="function"||!(/^on[A-Z]/).test(c)){continue;}this.addEvent(c,b[c]);delete b[c];}}return this;}});})(); -(function(){var k,n,l,g,a={},c={},m=/\\/g;var e=function(q,p){if(q==null){return null;}if(q.Slick===true){return q;}q=(""+q).replace(/^\s+|\s+$/g,"");g=!!p; -var o=(g)?c:a;if(o[q]){return o[q];}k={Slick:true,expressions:[],raw:q,reverse:function(){return e(this.raw,true);}};n=-1;while(q!=(q=q.replace(j,b))){}k.length=k.expressions.length; -return o[k.raw]=(g)?h(k):k;};var i=function(o){if(o==="!"){return" ";}else{if(o===" "){return"!";}else{if((/^!/).test(o)){return o.replace(/^!/,"");}else{return"!"+o; -}}}};var h=function(u){var r=u.expressions;for(var p=0;p+)\\s*|(\\s+)|(+|\\*)|\\#(+)|\\.(+)|\\[\\s*(+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)".replace(//,"["+f(">+~`!@$%^&={}\\;/g,"(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])").replace(//g,"(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])")); -function b(x,s,D,z,r,C,q,B,A,y,u,F,G,v,p,w){if(s||n===-1){k.expressions[++n]=[];l=-1;if(s){return"";}}if(D||z||l===-1){D=D||" ";var t=k.expressions[n]; -if(g&&t[l]){t[l].reverseCombinator=i(D);}t[++l]={combinator:D,tag:"*"};}var o=k.expressions[n][l];if(r){o.tag=r.replace(m,"");}else{if(C){o.id=C.replace(m,""); -}else{if(q){q=q.replace(m,"");if(!o.classList){o.classList=[];}if(!o.classes){o.classes=[];}o.classList.push(q);o.classes.push({value:q,regexp:new RegExp("(^|\\s)"+f(q)+"(\\s|$)")}); -}else{if(G){w=w||p;w=w?w.replace(m,""):null;if(!o.pseudos){o.pseudos=[];}o.pseudos.push({key:G.replace(m,""),value:w,type:F.length==1?"class":"element"}); -}else{if(B){B=B.replace(m,"");u=(u||"").replace(m,"");var E,H;switch(A){case"^=":H=new RegExp("^"+f(u));break;case"$=":H=new RegExp(f(u)+"$");break;case"~=":H=new RegExp("(^|\\s)"+f(u)+"(\\s|$)"); -break;case"|=":H=new RegExp("^"+f(u)+"(-|$)");break;case"=":E=function(I){return u==I;};break;case"*=":E=function(I){return I&&I.indexOf(u)>-1;};break; -case"!=":E=function(I){return u!=I;};break;default:E=function(I){return !!I;};}if(u==""&&(/^[*$^]=$/).test(A)){E=function(){return false;};}if(!E){E=function(I){return I&&H.test(I); -};}if(!o.attributes){o.attributes=[];}o.attributes.push({key:B,operator:A,value:u,test:E});}}}}}return"";}var d=(this.Slick||{});d.parse=function(o){return e(o); -};d.escapeRegExp=f;if(!this.Slick){this.Slick=d;}}).apply((typeof exports!="undefined")?exports:this);(function(){var k={},m={},d=Object.prototype.toString; -k.isNativeCode=function(c){return(/\{\s*\[native code\]\s*\}/).test(""+c);};k.isXML=function(c){return(!!c.xmlVersion)||(!!c.xml)||(d.call(c)=="[object XMLDocument]")||(c.nodeType==9&&c.documentElement.nodeName!="HTML"); -};k.setDocument=function(w){var p=w.nodeType;if(p==9){}else{if(p){w=w.ownerDocument;}else{if(w.navigator){w=w.document;}else{return;}}}if(this.document===w){return; -}this.document=w;var A=w.documentElement,o=this.getUIDXML(A),s=m[o],r;if(s){for(r in s){this[r]=s[r];}return;}s=m[o]={};s.root=A;s.isXMLDocument=this.isXML(w); -s.brokenStarGEBTN=s.starSelectsClosedQSA=s.idGetsName=s.brokenMixedCaseQSA=s.brokenGEBCN=s.brokenCheckedQSA=s.brokenEmptyAttributeQSA=s.isHTMLDocument=s.nativeMatchesSelector=false; -var q,u,y,z,t;var x,v="slick_uniqueid";var c=w.createElement("div");var n=w.body||w.getElementsByTagName("body")[0]||A;n.appendChild(c);try{c.innerHTML=''; -s.isHTMLDocument=!!w.getElementById(v);}catch(C){}if(s.isHTMLDocument){c.style.display="none";c.appendChild(w.createComment(""));u=(c.getElementsByTagName("*").length>1); -try{c.innerHTML="foo";x=c.getElementsByTagName("*");q=(x&&!!x.length&&x[0].nodeName.charAt(0)=="/");}catch(C){}s.brokenStarGEBTN=u||q;try{c.innerHTML=''; -s.idGetsName=w.getElementById(v)===c.firstChild;}catch(C){}if(c.getElementsByClassName){try{c.innerHTML='';c.getElementsByClassName("b").length; -c.firstChild.className="b";z=(c.getElementsByClassName("b").length!=2);}catch(C){}try{c.innerHTML='';y=(c.getElementsByClassName("a").length!=2); -}catch(C){}s.brokenGEBCN=z||y;}if(c.querySelectorAll){try{c.innerHTML="foo";x=c.querySelectorAll("*");s.starSelectsClosedQSA=(x&&!!x.length&&x[0].nodeName.charAt(0)=="/"); -}catch(C){}try{c.innerHTML='';s.brokenMixedCaseQSA=!c.querySelectorAll(".MiX").length;}catch(C){}try{c.innerHTML=''; -s.brokenCheckedQSA=(c.querySelectorAll(":checked").length==0);}catch(C){}try{c.innerHTML='';s.brokenEmptyAttributeQSA=(c.querySelectorAll('[class*=""]').length!=0); -}catch(C){}}try{c.innerHTML='
    ';t=(c.firstChild.getAttribute("action")!="s");}catch(C){}s.nativeMatchesSelector=A.matchesSelector||A.mozMatchesSelector||A.webkitMatchesSelector; -if(s.nativeMatchesSelector){try{s.nativeMatchesSelector.call(A,":slick");s.nativeMatchesSelector=null;}catch(C){}}}try{A.slick_expando=1;delete A.slick_expando; -s.getUID=this.getUIDHTML;}catch(C){s.getUID=this.getUIDXML;}n.removeChild(c);c=x=n=null;s.getAttribute=(s.isHTMLDocument&&t)?function(G,E){var H=this.attributeGetters[E]; -if(H){return H.call(G);}var F=G.getAttributeNode(E);return(F)?F.nodeValue:null;}:function(F,E){var G=this.attributeGetters[E];return(G)?G.call(F):F.getAttribute(E); -};s.hasAttribute=(A&&this.isNativeCode(A.hasAttribute))?function(F,E){return F.hasAttribute(E);}:function(F,E){F=F.getAttributeNode(E);return !!(F&&(F.specified||F.nodeValue)); -};var D=A&&this.isNativeCode(A.contains),B=w&&this.isNativeCode(w.contains);s.contains=(D&&B)?function(E,F){return E.contains(F);}:(D&&!B)?function(E,F){return E===F||((E===w)?w.documentElement:E).contains(F); -}:(A&&A.compareDocumentPosition)?function(E,F){return E===F||!!(E.compareDocumentPosition(F)&16);}:function(E,F){if(F){do{if(F===E){return true;}}while((F=F.parentNode)); -}return false;};s.documentSorter=(A.compareDocumentPosition)?function(F,E){if(!F.compareDocumentPosition||!E.compareDocumentPosition){return 0;}return F.compareDocumentPosition(E)&4?-1:F===E?0:1; -}:("sourceIndex" in A)?function(F,E){if(!F.sourceIndex||!E.sourceIndex){return 0;}return F.sourceIndex-E.sourceIndex;}:(w.createRange)?function(H,F){if(!H.ownerDocument||!F.ownerDocument){return 0; -}var G=H.ownerDocument.createRange(),E=F.ownerDocument.createRange();G.setStart(H,0);G.setEnd(H,0);E.setStart(F,0);E.setEnd(F,0);return G.compareBoundaryPoints(Range.START_TO_END,E); -}:null;A=null;for(r in s){this[r]=s[r];}};var f=/^([#.]?)((?:[\w-]+|\*))$/,h=/\[.+[*$^]=(?:""|'')?\]/,g={};k.search=function(U,z,H,s){var p=this.found=(s)?null:(H||[]); -if(!U){return p;}else{if(U.navigator){U=U.document;}else{if(!U.nodeType){return p;}}}var F,O,V=this.uniques={},I=!!(H&&H.length),y=(U.nodeType==9);if(this.document!==(y?U:U.ownerDocument)){this.setDocument(U); -}if(I){for(O=p.length;O--;){V[this.getUID(p[O])]=true;}}if(typeof z=="string"){var r=z.match(f);simpleSelectors:if(r){var u=r[1],v=r[2],A,E;if(!u){if(v=="*"&&this.brokenStarGEBTN){break simpleSelectors; -}E=U.getElementsByTagName(v);if(s){return E[0]||null;}for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}else{if(u=="#"){if(!this.isHTMLDocument||!y){break simpleSelectors; -}A=U.getElementById(v);if(!A){return p;}if(this.idGetsName&&A.getAttributeNode("id").nodeValue!=v){break simpleSelectors;}if(s){return A||null;}if(!(I&&V[this.getUID(A)])){p.push(A); -}}else{if(u=="."){if(!this.isHTMLDocument||((!U.getElementsByClassName||this.brokenGEBCN)&&U.querySelectorAll)){break simpleSelectors;}if(U.getElementsByClassName&&!this.brokenGEBCN){E=U.getElementsByClassName(v); -if(s){return E[0]||null;}for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}else{var T=new RegExp("(^|\\s)"+e.escapeRegExp(v)+"(\\s|$)");E=U.getElementsByTagName("*"); -for(O=0;A=E[O++];){className=A.className;if(!(className&&T.test(className))){continue;}if(s){return A;}if(!(I&&V[this.getUID(A)])){p.push(A);}}}}}}if(I){this.sort(p); -}return(s)?null:p;}querySelector:if(U.querySelectorAll){if(!this.isHTMLDocument||g[z]||this.brokenMixedCaseQSA||(this.brokenCheckedQSA&&z.indexOf(":checked")>-1)||(this.brokenEmptyAttributeQSA&&h.test(z))||(!y&&z.indexOf(",")>-1)||e.disableQSA){break querySelector; -}var S=z,x=U;if(!y){var C=x.getAttribute("id"),t="slickid__";x.setAttribute("id",t);S="#"+t+" "+S;U=x.parentNode;}try{if(s){return U.querySelector(S)||null; -}else{E=U.querySelectorAll(S);}}catch(Q){g[z]=1;break querySelector;}finally{if(!y){if(C){x.setAttribute("id",C);}else{x.removeAttribute("id");}U=x;}}if(this.starSelectsClosedQSA){for(O=0; -A=E[O++];){if(A.nodeName>"@"&&!(I&&V[this.getUID(A)])){p.push(A);}}}else{for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}if(I){this.sort(p); -}return p;}F=this.Slick.parse(z);if(!F.length){return p;}}else{if(z==null){return p;}else{if(z.Slick){F=z;}else{if(this.contains(U.documentElement||U,z)){(p)?p.push(z):p=z; -return p;}else{return p;}}}}this.posNTH={};this.posNTHLast={};this.posNTHType={};this.posNTHTypeLast={};this.push=(!I&&(s||(F.length==1&&F.expressions[0].length==1)))?this.pushArray:this.pushUID; -if(p==null){p=[];}var M,L,K;var B,J,D,c,q,G,W;var N,P,o,w,R=F.expressions;search:for(O=0;(P=R[O]);O++){for(M=0;(o=P[M]);M++){B="combinator:"+o.combinator; -if(!this[B]){continue search;}J=(this.isXMLDocument)?o.tag:o.tag.toUpperCase();D=o.id;c=o.classList;q=o.classes;G=o.attributes;W=o.pseudos;w=(M===(P.length-1)); -this.bitUniques={};if(w){this.uniques=V;this.found=p;}else{this.uniques={};this.found=[];}if(M===0){this[B](U,J,D,q,G,W,c);if(s&&w&&p.length){break search; -}}else{if(s&&w){for(L=0,K=N.length;L1)){this.sort(p);}return(s)?(p[0]||null):p;};k.uidx=1;k.uidk="slick-uniqueid";k.getUIDXML=function(n){var c=n.getAttribute(this.uidk); -if(!c){c=this.uidx++;n.setAttribute(this.uidk,c);}return c;};k.getUIDHTML=function(c){return c.uniqueNumber||(c.uniqueNumber=this.uidx++);};k.sort=function(c){if(!this.documentSorter){return c; -}c.sort(this.documentSorter);return c;};k.cacheNTH={};k.matchNTH=/^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;k.parseNTHArgument=function(q){var o=q.match(this.matchNTH); -if(!o){return false;}var p=o[2]||false;var n=o[1]||1;if(n=="-"){n=-1;}var c=+o[3]||0;o=(p=="n")?{a:n,b:c}:(p=="odd")?{a:2,b:1}:(p=="even")?{a:2,b:0}:{a:0,b:n}; -return(this.cacheNTH[q]=o);};k.createNTHPseudo=function(p,n,c,o){return function(s,q){var u=this.getUID(s);if(!this[c][u]){var A=s.parentNode;if(!A){return false; -}var r=A[p],t=1;if(o){var z=s.nodeName;do{if(r.nodeName!=z){continue;}this[c][this.getUID(r)]=t++;}while((r=r[n]));}else{do{if(r.nodeType!=1){continue; -}this[c][this.getUID(r)]=t++;}while((r=r[n]));}}q=q||"n";var v=this.cacheNTH[q]||this.parseNTHArgument(q);if(!v){return false;}var y=v.a,x=v.b,w=this[c][u]; -if(y==0){return x==w;}if(y>0){if(w":function(p,c,r,o,n,q){if((p=p.firstChild)){do{if(p.nodeType==1){this.push(p,c,r,o,n,q); -}}while((p=p.nextSibling));}},"+":function(p,c,r,o,n,q){while((p=p.nextSibling)){if(p.nodeType==1){this.push(p,c,r,o,n,q);break;}}},"^":function(p,c,r,o,n,q){p=p.firstChild; -if(p){if(p.nodeType==1){this.push(p,c,r,o,n,q);}else{this["combinator:+"](p,c,r,o,n,q);}}},"~":function(q,c,s,p,n,r){while((q=q.nextSibling)){if(q.nodeType!=1){continue; -}var o=this.getUID(q);if(this.bitUniques[o]){break;}this.bitUniques[o]=true;this.push(q,c,s,p,n,r);}},"++":function(p,c,r,o,n,q){this["combinator:+"](p,c,r,o,n,q); -this["combinator:!+"](p,c,r,o,n,q);},"~~":function(p,c,r,o,n,q){this["combinator:~"](p,c,r,o,n,q);this["combinator:!~"](p,c,r,o,n,q);},"!":function(p,c,r,o,n,q){while((p=p.parentNode)){if(p!==this.document){this.push(p,c,r,o,n,q); -}}},"!>":function(p,c,r,o,n,q){p=p.parentNode;if(p!==this.document){this.push(p,c,r,o,n,q);}},"!+":function(p,c,r,o,n,q){while((p=p.previousSibling)){if(p.nodeType==1){this.push(p,c,r,o,n,q); -break;}}},"!^":function(p,c,r,o,n,q){p=p.lastChild;if(p){if(p.nodeType==1){this.push(p,c,r,o,n,q);}else{this["combinator:!+"](p,c,r,o,n,q);}}},"!~":function(q,c,s,p,n,r){while((q=q.previousSibling)){if(q.nodeType!=1){continue; -}var o=this.getUID(q);if(this.bitUniques[o]){break;}this.bitUniques[o]=true;this.push(q,c,s,p,n,r);}}};for(var i in j){k["combinator:"+i]=j[i];}var l={empty:function(c){var n=c.firstChild; -return !(n&&n.nodeType==1)&&!(c.innerText||c.textContent||"").length;},not:function(c,n){return !this.matchNode(c,n);},contains:function(c,n){return(c.innerText||c.textContent||"").indexOf(n)>-1; -},"first-child":function(c){while((c=c.previousSibling)){if(c.nodeType==1){return false;}}return true;},"last-child":function(c){while((c=c.nextSibling)){if(c.nodeType==1){return false; -}}return true;},"only-child":function(o){var n=o;while((n=n.previousSibling)){if(n.nodeType==1){return false;}}var c=o;while((c=c.nextSibling)){if(c.nodeType==1){return false; -}}return true;},"nth-child":k.createNTHPseudo("firstChild","nextSibling","posNTH"),"nth-last-child":k.createNTHPseudo("lastChild","previousSibling","posNTHLast"),"nth-of-type":k.createNTHPseudo("firstChild","nextSibling","posNTHType",true),"nth-last-of-type":k.createNTHPseudo("lastChild","previousSibling","posNTHTypeLast",true),index:function(n,c){return this["pseudo:nth-child"](n,""+(c+1)); -},even:function(c){return this["pseudo:nth-child"](c,"2n");},odd:function(c){return this["pseudo:nth-child"](c,"2n+1");},"first-of-type":function(c){var n=c.nodeName; -while((c=c.previousSibling)){if(c.nodeName==n){return false;}}return true;},"last-of-type":function(c){var n=c.nodeName;while((c=c.nextSibling)){if(c.nodeName==n){return false; -}}return true;},"only-of-type":function(o){var n=o,p=o.nodeName;while((n=n.previousSibling)){if(n.nodeName==p){return false;}}var c=o;while((c=c.nextSibling)){if(c.nodeName==p){return false; -}}return true;},enabled:function(c){return !c.disabled;},disabled:function(c){return c.disabled;},checked:function(c){return c.checked||c.selected;},focus:function(c){return this.isHTMLDocument&&this.document.activeElement===c&&(c.href||c.type||this.hasAttribute(c,"tabindex")); -},root:function(c){return(c===this.root);},selected:function(c){return c.selected;}};for(var b in l){k["pseudo:"+b]=l[b];}var a=k.attributeGetters={"for":function(){return("htmlFor" in this)?this.htmlFor:this.getAttribute("for"); -},href:function(){return("href" in this)?this.getAttribute("href",2):this.getAttribute("href");},style:function(){return(this.style)?this.style.cssText:this.getAttribute("style"); -},tabindex:function(){var c=this.getAttributeNode("tabindex");return(c&&c.specified)?c.nodeValue:null;},type:function(){return this.getAttribute("type"); -},maxlength:function(){var c=this.getAttributeNode("maxLength");return(c&&c.specified)?c.nodeValue:null;}};a.MAXLENGTH=a.maxLength=a.maxlength;var e=k.Slick=(this.Slick||{}); -e.version="1.1.7";e.search=function(n,o,c){return k.search(n,o,c);};e.find=function(c,n){return k.search(c,n,null,true);};e.contains=function(c,n){k.setDocument(c); -return k.contains(c,n);};e.getAttribute=function(n,c){k.setDocument(n);return k.getAttribute(n,c);};e.hasAttribute=function(n,c){k.setDocument(n);return k.hasAttribute(n,c); -};e.match=function(n,c){if(!(n&&c)){return false;}if(!c||c===n){return true;}k.setDocument(n);return k.matchNode(n,c);};e.defineAttributeGetter=function(c,n){k.attributeGetters[c]=n; -return this;};e.lookupAttributeGetter=function(c){return k.attributeGetters[c];};e.definePseudo=function(c,n){k["pseudo:"+c]=function(p,o){return n.call(p,o); -};return this;};e.lookupPseudo=function(c){var n=k["pseudo:"+c];if(n){return function(o){return n.call(this,o);};}return null;};e.override=function(n,c){k.override(n,c); -return this;};e.isXML=k.isXML;e.uidOf=function(c){return k.getUIDHTML(c);};if(!this.Slick){this.Slick=e;}}).apply((typeof exports!="undefined")?exports:this); -var Element=function(b,g){var h=Element.Constructors[b];if(h){return h(g);}if(typeof b!="string"){return document.id(b).set(g);}if(!g){g={};}if(!(/^[\w-]+$/).test(b)){var e=Slick.parse(b).expressions[0][0]; -b=(e.tag=="*")?"div":e.tag;if(e.id&&g.id==null){g.id=e.id;}var d=e.attributes;if(d){for(var a,f=0,c=d.length;f=this.length){delete this[g--];}return e;}.protect());}Array.forEachMethod(function(g,e){Elements.implement(e,g);});Array.mirror(Elements);var d; -try{d=(document.createElement("").name=="x");}catch(b){}var c=function(e){return(""+e).replace(/&/g,"&").replace(/"/g,""");};Document.implement({newElement:function(e,g){if(g&&g.checked!=null){g.defaultChecked=g.checked; -}if(d&&g){e="<"+e;if(g.name){e+=' name="'+c(g.name)+'"';}if(g.type){e+=' type="'+c(g.type)+'"';}e+=">";delete g.name;delete g.type;}return this.id(this.createElement(e)).set(g); -}});})();(function(){Slick.uidOf(window);Slick.uidOf(document);Document.implement({newTextNode:function(e){return this.createTextNode(e);},getDocument:function(){return this; -},getWindow:function(){return this.window;},id:(function(){var e={string:function(E,D,l){E=Slick.find(l,"#"+E.replace(/(\W)/g,"\\$1"));return(E)?e.element(E,D):null; -},element:function(D,E){Slick.uidOf(D);if(!E&&!D.$family&&!(/^(?:object|embed)$/i).test(D.tagName)){var l=D.fireEvent;D._fireEvent=function(F,G){return l(F,G); -};Object.append(D,Element.Prototype);}return D;},object:function(D,E,l){if(D.toElement){return e.element(D.toElement(l),E);}return null;}};e.textnode=e.whitespace=e.window=e.document=function(l){return l; -};return function(D,F,E){if(D&&D.$family&&D.uniqueNumber){return D;}var l=typeOf(D);return(e[l])?e[l](D,F,E||document):null;};})()});if(window.$==null){Window.implement("$",function(e,l){return document.id(e,l,this.document); -});}Window.implement({getDocument:function(){return this.document;},getWindow:function(){return this;}});[Document,Element].invoke("implement",{getElements:function(e){return Slick.search(this,e,new Elements); -},getElement:function(e){return document.id(Slick.find(this,e));}});var m={contains:function(e){return Slick.contains(this,e);}};if(!document.contains){Document.implement(m); -}if(!document.createElement("div").contains){Element.implement(m);}Element.implement("hasChild",function(e){return this!==e&&this.contains(e);});(function(l,E,e){this.Selectors={}; -var F=this.Selectors.Pseudo=new Hash();var D=function(){for(var G in F){if(F.hasOwnProperty(G)){Slick.definePseudo(G,F[G]);delete F[G];}}};Slick.search=function(H,I,G){D(); -return l.call(this,H,I,G);};Slick.find=function(G,H){D();return E.call(this,G,H);};Slick.match=function(H,G){D();return e.call(this,H,G);};})(Slick.search,Slick.find,Slick.match); -var r=function(E,D){if(!E){return D;}E=Object.clone(Slick.parse(E));var l=E.expressions;for(var e=l.length;e--;){l[e][0].combinator=D;}return E;};Object.forEach({getNext:"~",getPrevious:"!~",getParent:"!"},function(e,l){Element.implement(l,function(D){return this.getElement(r(D,e)); -});});Object.forEach({getAllNext:"~",getAllPrevious:"!~",getSiblings:"~~",getChildren:">",getParents:"!"},function(e,l){Element.implement(l,function(D){return this.getElements(r(D,e)); -});});Element.implement({getFirst:function(e){return document.id(Slick.search(this,r(e,">"))[0]);},getLast:function(e){return document.id(Slick.search(this,r(e,">")).getLast()); -},getWindow:function(){return this.ownerDocument.window;},getDocument:function(){return this.ownerDocument;},getElementById:function(e){return document.id(Slick.find(this,"#"+(""+e).replace(/(\W)/g,"\\$1"))); -},match:function(e){return !e||Slick.match(this,e);}});if(window.$$==null){Window.implement("$$",function(e){var H=new Elements;if(arguments.length==1&&typeof e=="string"){return Slick.search(this.document,e,H); -}var E=Array.flatten(arguments);for(var F=0,D=E.length;F(?![^<]*<['"])/)).indexOf(F)<0){return null;}E[F]=true;}}var e=Slick.getAttribute(this,F); -return(!e&&!Slick.hasAttribute(this,F))?null:e;},getProperties:function(){var e=Array.from(arguments);return e.map(this.getProperty,this).associate(e); -},removeProperty:function(e){return this.setProperty(e,null);},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this;},set:function(D,l){var e=Element.Properties[D]; -(e&&e.set)?e.set.call(this,l):this.setProperty(D,l);}.overloadSetter(),get:function(l){var e=Element.Properties[l];return(e&&e.get)?e.get.apply(this):this.getProperty(l); -}.overloadGetter(),erase:function(l){var e=Element.Properties[l];(e&&e.erase)?e.erase.apply(this):this.removeProperty(l);return this;},hasClass:function(e){return this.className.clean().contains(e," "); -},addClass:function(e){if(!this.hasClass(e)){this.className=(this.className+" "+e).clean();}return this;},removeClass:function(e){this.className=this.className.replace(new RegExp("(^|\\s)"+e+"(?:\\s|$)"),"$1"); -return this;},toggleClass:function(e,l){if(l==null){l=!this.hasClass(e);}return(l)?this.addClass(e):this.removeClass(e);},adopt:function(){var E=this,e,G=Array.flatten(arguments),F=G.length; -if(F>1){E=e=document.createDocumentFragment();}for(var D=0;D";var a=(t.childNodes.length==1);if(!a){var s="abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "),b=document.createDocumentFragment(),u=s.length; -while(u--){b.createElement(s[u]);}}t=null;var g=Function.attempt(function(){var e=document.createElement("table");e.innerHTML="";return true; -});var c=document.createElement("tr"),o="";c.innerHTML=o;var y=(c.innerHTML==o);c=null;if(!g||!y||!a){Element.Properties.html.set=(function(l){var e={table:[1,"","
    "],select:[1,""],tbody:[2,"","
    "],tr:[3,"","
    "]}; -e.thead=e.tfoot=e.tbody;return function(D){var E=e[this.get("tag")];if(!E&&!a){E=[0,"",""];}if(!E){return l.call(this,D);}var H=E[0],G=document.createElement("div"),F=G; -if(!a){b.appendChild(G);}G.innerHTML=[E[1],D,E[2]].flatten().join("");while(H--){F=F.firstChild;}this.empty().adopt(F.childNodes);if(!a){b.removeChild(G); -}G=null;};})(Element.Properties.html.set);}var n=document.createElement("form");n.innerHTML="";if(n.firstChild.value!="s"){Element.Properties.value={set:function(G){var l=this.get("tag"); -if(l!="select"){return this.setProperty("value",G);}var D=this.getElements("option");for(var E=0;E0||k==null?"visible":"hidden";};var f=(h?function(l,k){l.style.opacity=k;}:(e?function(l,k){var n=l.style; -if(!l.currentStyle||!l.currentStyle.hasLayout){n.zoom=1;}if(k==null||k==1){k="";}else{k="alpha(opacity="+(k*100).limit(0,100).round()+")";}var m=n.filter||l.getComputedStyle("filter")||""; -n.filter=j.test(m)?m.replace(j,k):m+k;if(!n.filter){n.removeAttribute("filter");}}:a));var g=(h?function(l){var k=l.style.opacity||l.getComputedStyle("opacity"); -return(k=="")?1:k.toFloat();}:(e?function(l){var m=(l.style.filter||l.getComputedStyle("filter")),k;if(m){k=m.match(j);}return(k==null||m==null)?1:(k[1]/100); -}:function(l){var k=l.retrieve("$opacity");if(k==null){k=(l.style.visibility=="hidden"?0:1);}return k;}));var b=(i.style.cssFloat==null)?"styleFloat":"cssFloat"; -Element.implement({getComputedStyle:function(m){if(this.currentStyle){return this.currentStyle[m.camelCase()];}var l=Element.getDocument(this).defaultView,k=l?l.getComputedStyle(this,null):null; -return(k)?k.getPropertyValue((m==b)?"float":m.hyphenate()):null;},setStyle:function(l,k){if(l=="opacity"){if(k!=null){k=parseFloat(k);}f(this,k);return this; -}l=(l=="float"?b:l).camelCase();if(typeOf(k)!="string"){var m=(Element.Styles[l]||"@").split(" ");k=Array.from(k).map(function(o,n){if(!m[n]){return""; -}return(typeOf(o)=="number")?m[n].replace("@",Math.round(o)):o;}).join(" ");}else{if(k==String(Number(k))){k=Math.round(k);}}this.style[l]=k;if((k==""||k==null)&&c&&this.style.removeAttribute){this.style.removeAttribute(l); -}return this;},getStyle:function(q){if(q=="opacity"){return g(this);}q=(q=="float"?b:q).camelCase();var k=this.style[q];if(!k||q=="zIndex"){k=[];for(var p in Element.ShortStyles){if(q!=p){continue; -}for(var o in Element.ShortStyles[p]){k.push(this.getStyle(o));}return k.join(" ");}k=this.getComputedStyle(q);}if(k){k=String(k);var m=k.match(/rgba?\([\d\s,]+\)/); -if(m){k=k.replace(m[0],m[0].rgbToHex());}}if(Browser.opera||Browser.ie){if((/^(height|width)$/).test(q)&&!(/px$/.test(k))){var l=(q=="width")?["left","right"]:["top","bottom"],n=0; -l.each(function(r){n+=this.getStyle("border-"+r+"-width").toInt()+this.getStyle("padding-"+r).toInt();},this);return this["offset"+q.capitalize()]-n+"px"; -}if(Browser.ie&&(/^border(.+)Width|margin|padding/).test(q)&&isNaN(parseFloat(k))){return"0px";}}return k;},setStyles:function(l){for(var k in l){this.setStyle(k,l[k]); -}return this;},getStyles:function(){var k={};Array.flatten(arguments).each(function(l){k[l]=this.getStyle(l);},this);return k;}});Element.Styles={left:"@px",top:"@px",bottom:"@px",right:"@px",width:"@px",height:"@px",maxWidth:"@px",maxHeight:"@px",minWidth:"@px",minHeight:"@px",backgroundColor:"rgb(@, @, @)",backgroundPosition:"@px @px",color:"rgb(@, @, @)",fontSize:"@px",letterSpacing:"@px",lineHeight:"@px",clip:"rect(@px @px @px @px)",margin:"@px @px @px @px",padding:"@px @px @px @px",border:"@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)",borderWidth:"@px @px @px @px",borderStyle:"@ @ @ @",borderColor:"rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)",zIndex:"@",zoom:"@",fontWeight:"@",textIndent:"@px",opacity:"@"}; -Element.implement({setOpacity:function(k){f(this,k);return this;},getOpacity:function(){return g(this);}});Element.Properties.opacity={set:function(k){f(this,k); -a(this,k);},get:function(){return g(this);}};Element.Styles=new Hash(Element.Styles);Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}}; -["Top","Right","Bottom","Left"].each(function(q){var p=Element.ShortStyles;var l=Element.Styles;["margin","padding"].each(function(r){var s=r+q;p[r][s]=l[s]="@px"; -});var o="border"+q;p.border[o]=l[o]="@px @ rgb(@, @, @)";var n=o+"Width",k=o+"Style",m=o+"Color";p[o]={};p.borderWidth[n]=p[o][n]=l[n]="@px";p.borderStyle[k]=p[o][k]=l[k]="@"; -p.borderColor[m]=p[o][m]=l[m]="rgb(@, @, @)";});})();(function(){Element.Properties.events={set:function(b){this.addEvents(b);}};[Element,Window,Document].invoke("implement",{addEvent:function(f,h){var i=this.retrieve("events",{}); -if(!i[f]){i[f]={keys:[],values:[]};}if(i[f].keys.contains(h)){return this;}i[f].keys.push(h);var g=f,b=Element.Events[f],d=h,j=this;if(b){if(b.onAdd){b.onAdd.call(this,h,f); -}if(b.condition){d=function(k){if(b.condition.call(this,k,f)){return h.call(this,k);}return true;};}if(b.base){g=Function.from(b.base).call(this,f);}}var e=function(){return h.call(j); -};var c=Element.NativeEvents[g];if(c){if(c==2){e=function(k){k=new DOMEvent(k,j.getWindow());if(d.call(j,k)===false){k.stop();}};}this.addListener(g,e,arguments[2]); -}i[f].values.push(e);return this;},removeEvent:function(e,d){var c=this.retrieve("events");if(!c||!c[e]){return this;}var h=c[e];var b=h.keys.indexOf(d); -if(b==-1){return this;}var g=h.values[b];delete h.keys[b];delete h.values[b];var f=Element.Events[e];if(f){if(f.onRemove){f.onRemove.call(this,d,e);}if(f.base){e=Function.from(f.base).call(this,e); -}}return(Element.NativeEvents[e])?this.removeListener(e,g,arguments[2]):this;},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]);}return this; -},removeEvents:function(b){var d;if(typeOf(b)=="object"){for(d in b){this.removeEvent(d,b[d]);}return this;}var c=this.retrieve("events");if(!c){return this; -}if(!b){for(d in c){this.removeEvents(d);}this.eliminate("events");}else{if(c[b]){c[b].keys.each(function(e){this.removeEvent(b,e);},this);delete c[b]; -}}return this;},fireEvent:function(e,c,b){var d=this.retrieve("events");if(!d||!d[e]){return this;}c=Array.from(c);d[e].keys.each(function(f){if(b){f.delay(b,this,c); -}else{f.apply(this,c);}},this);return this;},cloneEvents:function(e,d){e=document.id(e);var c=e.retrieve("events");if(!c){return this;}if(!d){for(var b in c){this.cloneEvents(e,b); -}}else{if(c[d]){c[d].keys.each(function(f){this.addEvent(d,f);},this);}}return this;}});Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,orientationchange:2,touchstart:2,touchmove:2,touchend:2,touchcancel:2,gesturestart:2,gesturechange:2,gestureend:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,paste:2,input:2,load:2,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,error:1,abort:1,scroll:1}; -Element.Events={mousewheel:{base:(Browser.firefox)?"DOMMouseScroll":"mousewheel"}};if("onmouseenter" in document.documentElement){Element.NativeEvents.mouseenter=Element.NativeEvents.mouseleave=2; -}else{var a=function(b){var c=b.relatedTarget;if(c==null){return true;}if(!c){return false;}return(c!=this&&c.prefix!="xul"&&typeOf(this)!="document"&&!this.contains(c)); -};Element.Events.mouseenter={base:"mouseover",condition:a};Element.Events.mouseleave={base:"mouseout",condition:a};}if(!window.addEventListener){Element.NativeEvents.propertychange=2; -Element.Events.change={base:function(){var b=this.type;return(this.get("tag")=="input"&&(b=="radio"||b=="checkbox"))?"propertychange":"change";},condition:function(b){return this.type!="radio"||(b.event.propertyName=="checked"&&this.checked); -}};}Element.Events=new Hash(Element.Events);})();(function(){var c=!!window.addEventListener;Element.NativeEvents.focusin=Element.NativeEvents.focusout=2; -var k=function(l,m,n,o,p){while(p&&p!=l){if(m(p,o)){return n.call(p,o,p);}p=document.id(p.parentNode);}};var a={mouseenter:{base:"mouseover"},mouseleave:{base:"mouseout"},focus:{base:"focus"+(c?"":"in"),capture:true},blur:{base:c?"blur":"focusout",capture:true}}; -var b="$delegation:";var i=function(l){return{base:"focusin",remove:function(m,o){var p=m.retrieve(b+l+"listeners",{})[o];if(p&&p.forms){for(var n=p.forms.length; -n--;){p.forms[n].removeEvent(l,p.fns[n]);}}},listen:function(x,r,v,n,t,s){var o=(t.get("tag")=="form")?t:n.target.getParent("form");if(!o){return;}var u=x.retrieve(b+l+"listeners",{}),p=u[s]||{forms:[],fns:[]},m=p.forms,w=p.fns; -if(m.indexOf(o)!=-1){return;}m.push(o);var q=function(y){k(x,r,v,y,t);};o.addEvent(l,q);w.push(q);u[s]=p;x.store(b+l+"listeners",u);}};};var d=function(l){return{base:"focusin",listen:function(m,n,p,q,r){var o={blur:function(){this.removeEvents(o); -}};o[l]=function(s){k(m,n,p,s,r);};q.target.addEvents(o);}};};if(!c){Object.append(a,{submit:i("submit"),reset:i("reset"),change:d("change"),select:d("select")}); -}var h=Element.prototype,f=h.addEvent,j=h.removeEvent;var e=function(l,m){return function(r,q,n){if(r.indexOf(":relay")==-1){return l.call(this,r,q,n); -}var o=Slick.parse(r).expressions[0][0];if(o.pseudos[0].key!="relay"){return l.call(this,r,q,n);}var p=o.tag;o.pseudos.slice(1).each(function(s){p+=":"+s.key+(s.value?"("+s.value+")":""); -});l.call(this,r,q);return m.call(this,p,o.pseudos[0].value,q);};};var g={addEvent:function(v,q,x){var t=this.retrieve("$delegates",{}),r=t[v];if(r){for(var y in r){if(r[y].fn==x&&r[y].match==q){return this; -}}}var p=v,u=q,o=x,n=a[v]||{};v=n.base||p;q=function(B){return Slick.match(B,u);};var w=Element.Events[p];if(w&&w.condition){var l=q,m=w.condition;q=function(C,B){return l(C,B)&&m.call(C,B,v); -};}var z=this,s=String.uniqueID();var A=n.listen?function(B,C){if(!C&&B&&B.target){C=B.target;}if(C){n.listen(z,q,x,B,C,s);}}:function(B,C){if(!C&&B&&B.target){C=B.target; -}if(C){k(z,q,x,B,C);}};if(!r){r={};}r[s]={match:u,fn:o,delegator:A};t[p]=r;return f.call(this,v,A,n.capture);},removeEvent:function(r,n,t,u){var q=this.retrieve("$delegates",{}),p=q[r]; -if(!p){return this;}if(u){var m=r,w=p[u].delegator,l=a[r]||{};r=l.base||m;if(l.remove){l.remove(this,u);}delete p[u];q[m]=p;return j.call(this,r,w);}var o,v; -if(t){for(o in p){v=p[o];if(v.match==n&&v.fn==t){return g.removeEvent.call(this,r,n,t,o);}}}else{for(o in p){v=p[o];if(v.match==n){g.removeEvent.call(this,r,n,v.fn,o); -}}}return this;}};[Element,Window,Document].invoke("implement",{addEvent:e(f,g.addEvent),removeEvent:e(j,g.removeEvent)});})();(function(){var h=document.createElement("div"),e=document.createElement("div"); -h.style.height="0";h.appendChild(e);var d=(e.offsetParent===h);h=e=null;var l=function(m){return k(m,"position")!="static"||a(m);};var i=function(m){return l(m)||(/^(?:table|td|th)$/i).test(m.tagName); -};Element.implement({scrollTo:function(m,n){if(a(this)){this.getWindow().scrollTo(m,n);}else{this.scrollLeft=m;this.scrollTop=n;}return this;},getSize:function(){if(a(this)){return this.getWindow().getSize(); -}return{x:this.offsetWidth,y:this.offsetHeight};},getScrollSize:function(){if(a(this)){return this.getWindow().getScrollSize();}return{x:this.scrollWidth,y:this.scrollHeight}; -},getScroll:function(){if(a(this)){return this.getWindow().getScroll();}return{x:this.scrollLeft,y:this.scrollTop};},getScrolls:function(){var n=this.parentNode,m={x:0,y:0}; -while(n&&!a(n)){m.x+=n.scrollLeft;m.y+=n.scrollTop;n=n.parentNode;}return m;},getOffsetParent:d?function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null; -}var n=(k(m,"position")=="static")?i:l;while((m=m.parentNode)){if(n(m)){return m;}}return null;}:function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null; -}try{return m.offsetParent;}catch(n){}return null;},getOffsets:function(){if(this.getBoundingClientRect&&!Browser.Platform.ios){var r=this.getBoundingClientRect(),o=document.id(this.getDocument().documentElement),q=o.getScroll(),t=this.getScrolls(),s=(k(this,"position")=="fixed"); -return{x:r.left.toInt()+t.x+((s)?0:q.x)-o.clientLeft,y:r.top.toInt()+t.y+((s)?0:q.y)-o.clientTop};}var n=this,m={x:0,y:0};if(a(this)){return m;}while(n&&!a(n)){m.x+=n.offsetLeft; -m.y+=n.offsetTop;if(Browser.firefox){if(!c(n)){m.x+=b(n);m.y+=g(n);}var p=n.parentNode;if(p&&k(p,"overflow")!="visible"){m.x+=b(p);m.y+=g(p);}}else{if(n!=this&&Browser.safari){m.x+=b(n); -m.y+=g(n);}}n=n.offsetParent;}if(Browser.firefox&&!c(this)){m.x-=b(this);m.y-=g(this);}return m;},getPosition:function(p){var q=this.getOffsets(),n=this.getScrolls(); -var m={x:q.x-n.x,y:q.y-n.y};if(p&&(p=document.id(p))){var o=p.getPosition();return{x:m.x-o.x-b(p),y:m.y-o.y-g(p)};}return m;},getCoordinates:function(o){if(a(this)){return this.getWindow().getCoordinates(); -}var m=this.getPosition(o),n=this.getSize();var p={left:m.x,top:m.y,width:n.x,height:n.y};p.right=p.left+p.width;p.bottom=p.top+p.height;return p;},computePosition:function(m){return{left:m.x-j(this,"margin-left"),top:m.y-j(this,"margin-top")}; -},setPosition:function(m){return this.setStyles(this.computePosition(m));}});[Document,Window].invoke("implement",{getSize:function(){var m=f(this);return{x:m.clientWidth,y:m.clientHeight}; -},getScroll:function(){var n=this.getWindow(),m=f(this);return{x:n.pageXOffset||m.scrollLeft,y:n.pageYOffset||m.scrollTop};},getScrollSize:function(){var o=f(this),n=this.getSize(),m=this.getDocument().body; -return{x:Math.max(o.scrollWidth,m.scrollWidth,n.x),y:Math.max(o.scrollHeight,m.scrollHeight,n.y)};},getPosition:function(){return{x:0,y:0};},getCoordinates:function(){var m=this.getSize(); -return{top:0,left:0,bottom:m.y,right:m.x,height:m.y,width:m.x};}});var k=Element.getComputedStyle;function j(m,n){return k(m,n).toInt()||0;}function c(m){return k(m,"-moz-box-sizing")=="border-box"; -}function g(m){return j(m,"border-top-width");}function b(m){return j(m,"border-left-width");}function a(m){return(/^(?:body|html)$/i).test(m.tagName); -}function f(m){var n=m.getDocument();return(!n.compatMode||n.compatMode=="CSS1Compat")?n.html:n.body;}})();Element.alias({position:"setPosition"});[Window,Document,Element].invoke("implement",{getHeight:function(){return this.getSize().y; -},getWidth:function(){return this.getSize().x;},getScrollTop:function(){return this.getScroll().y;},getScrollLeft:function(){return this.getScroll().x; -},getScrollHeight:function(){return this.getScrollSize().y;},getScrollWidth:function(){return this.getScrollSize().x;},getTop:function(){return this.getPosition().y; -},getLeft:function(){return this.getPosition().x;}});(function(){var f=this.Fx=new Class({Implements:[Chain,Events,Options],options:{fps:60,unit:false,duration:500,frames:null,frameSkip:true,link:"ignore"},initialize:function(g){this.subject=this.subject||this; -this.setOptions(g);},getTransition:function(){return function(g){return -(Math.cos(Math.PI*g)-1)/2;};},step:function(g){if(this.options.frameSkip){var h=(this.time!=null)?(g-this.time):0,i=h/this.frameInterval; -this.time=g;this.frame+=i;}else{this.frame++;}if(this.frame=(7-4*d)/11){e=c*c-Math.pow((11-6*d-11*f)/4,2);break;}}return e;},Elastic:function(b,a){return Math.pow(2,10*--b)*Math.cos(20*b*Math.PI*(a&&a[0]||1)/3); -}});["Quad","Cubic","Quart","Quint"].each(function(b,a){Fx.Transitions[b]=new Fx.Transition(function(c){return Math.pow(c,a+2);});});(function(){var d=function(){},a=("onprogress" in new Browser.Request); -var c=this.Request=new Class({Implements:[Chain,Events,Options],options:{url:"",data:"",headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript, text/html, application/xml, text/xml, */*"},async:true,format:false,method:"post",link:"ignore",isSuccess:null,emulation:true,urlEncoded:true,encoding:"utf-8",evalScripts:false,evalResponse:false,timeout:0,noCache:false},initialize:function(e){this.xhr=new Browser.Request(); -this.setOptions(e);this.headers=this.options.headers;},onStateChange:function(){var e=this.xhr;if(e.readyState!=4||!this.running){return;}this.running=false; -this.status=0;Function.attempt(function(){var f=e.status;this.status=(f==1223)?204:f;}.bind(this));e.onreadystatechange=d;if(a){e.onprogress=e.onloadstart=d; -}clearTimeout(this.timer);this.response={text:this.xhr.responseText||"",xml:this.xhr.responseXML};if(this.options.isSuccess.call(this,this.status)){this.success(this.response.text,this.response.xml); -}else{this.failure();}},isSuccess:function(){var e=this.status;return(e>=200&&e<300);},isRunning:function(){return !!this.running;},processScripts:function(e){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return Browser.exec(e); -}return e.stripScripts(this.options.evalScripts);},success:function(f,e){this.onSuccess(this.processScripts(f),e);},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain(); -},failure:function(){this.onFailure();},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr);},loadstart:function(e){this.fireEvent("loadstart",[e,this.xhr]); -},progress:function(e){this.fireEvent("progress",[e,this.xhr]);},timeout:function(){this.fireEvent("timeout",this.xhr);},setHeader:function(e,f){this.headers[e]=f; -return this;},getHeader:function(e){return Function.attempt(function(){return this.xhr.getResponseHeader(e);}.bind(this));},check:function(){if(!this.running){return true; -}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.pass(arguments,this));return false;}return false;},send:function(o){if(!this.check(o)){return this; -}this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.running=true;var l=typeOf(o);if(l=="string"||l=="element"){o={data:o};}var h=this.options; -o=Object.append({data:h.data,url:h.url,method:h.method},o);var j=o.data,f=String(o.url),e=o.method.toLowerCase();switch(typeOf(j)){case"element":j=document.id(j).toQueryString(); -break;case"object":case"hash":j=Object.toQueryString(j);}if(this.options.format){var m="format="+this.options.format;j=(j)?m+"&"+j:m;}if(this.options.emulation&&!["get","post"].contains(e)){var k="_method="+e; -j=(j)?k+"&"+j:k;e="post";}if(this.options.urlEncoded&&["post","put"].contains(e)){var g=(this.options.encoding)?"; charset="+this.options.encoding:"";this.headers["Content-type"]="application/x-www-form-urlencoded"+g; -}if(!f){f=document.location.pathname;}var i=f.lastIndexOf("/");if(i>-1&&(i=f.indexOf("#"))>-1){f=f.substr(0,i);}if(this.options.noCache){f+=(f.contains("?")?"&":"?")+String.uniqueID(); -}if(j&&e=="get"){f+=(f.contains("?")?"&":"?")+j;j=null;}var n=this.xhr;if(a){n.onloadstart=this.loadstart.bind(this);n.onprogress=this.progress.bind(this); -}n.open(e.toUpperCase(),f,this.options.async,this.options.user,this.options.password);if(this.options.user&&"withCredentials" in n){n.withCredentials=true; -}n.onreadystatechange=this.onStateChange.bind(this);Object.each(this.headers,function(q,p){try{n.setRequestHeader(p,q);}catch(r){this.fireEvent("exception",[p,q]); -}},this);this.fireEvent("request");n.send(j);if(!this.options.async){this.onStateChange();}else{if(this.options.timeout){this.timer=this.timeout.delay(this.options.timeout,this); -}}return this;},cancel:function(){if(!this.running){return this;}this.running=false;var e=this.xhr;e.abort();clearTimeout(this.timer);e.onreadystatechange=d; -if(a){e.onprogress=e.onloadstart=d;}this.xhr=new Browser.Request();this.fireEvent("cancel");return this;}});var b={};["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(e){b[e]=function(g){var f={method:e}; -if(g!=null){f.data=g;}return this.send(f);};});c.implement(b);Element.Properties.send={set:function(e){var f=this.get("send").cancel();f.setOptions(e); -return this;},get:function(){var e=this.retrieve("send");if(!e){e=new c({data:this,link:"cancel",method:this.get("method")||"post",url:this.get("action")}); -this.store("send",e);}return e;}};Element.implement({send:function(e){var f=this.get("send");f.send({data:this,url:e||f.options.url});return this;}});})(); -Request.HTML=new Class({Extends:Request,options:{update:false,append:false,evalScripts:true,filter:false,headers:{Accept:"text/html, application/xml, text/xml, */*"}},success:function(f){var e=this.options,c=this.response; -c.html=f.stripScripts(function(h){c.javascript=h;});var d=c.html.match(/]*>([\s\S]*?)<\/body>/i);if(d){c.html=d[1];}var b=new Element("div").set("html",c.html); -c.tree=b.childNodes;c.elements=b.getElements(e.filter||"*");if(e.filter){c.tree=c.elements;}if(e.update){var g=document.id(e.update).empty();if(e.filter){g.adopt(c.elements); -}else{g.set("html",c.html);}}else{if(e.append){var a=document.id(e.append);if(e.filter){c.elements.reverse().inject(a);}else{a.adopt(b.getChildren());}}}if(e.evalScripts){Browser.exec(c.javascript); -}this.onSuccess(c.tree,c.elements,c.html,c.javascript);}});Element.Properties.load={set:function(a){var b=this.get("load").cancel();b.setOptions(a);return this; -},get:function(){var a=this.retrieve("load");if(!a){a=new Request.HTML({data:this,link:"cancel",update:this,method:"get"});this.store("load",a);}return a; -}};Element.implement({load:function(){this.get("load").send(Array.link(arguments,{data:Type.isObject,url:Type.isString}));return this;}});if(typeof JSON=="undefined"){this.JSON={}; -}JSON=new Hash({stringify:JSON.stringify,parse:JSON.parse});(function(){var special={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"}; -var escape=function(chr){return special[chr]||"\\u"+("0000"+chr.charCodeAt(0).toString(16)).slice(-4);};JSON.validate=function(string){string=string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""); -return(/^[\],:{}\s]*$/).test(string);};JSON.encode=JSON.stringify?function(obj){return JSON.stringify(obj);}:function(obj){if(obj&&obj.toJSON){obj=obj.toJSON(); -}switch(typeOf(obj)){case"string":return'"'+obj.replace(/[\x00-\x1f\\"]/g,escape)+'"';case"array":return"["+obj.map(JSON.encode).clean()+"]";case"object":case"hash":var string=[]; -Object.each(obj,function(value,key){var json=JSON.encode(value);if(json){string.push(JSON.encode(key)+":"+json);}});return"{"+string+"}";case"number":case"boolean":return""+obj; -case"null":return"null";}return null;};JSON.decode=function(string,secure){if(!string||typeOf(string)!="string"){return null;}if(secure||JSON.secure){if(JSON.parse){return JSON.parse(string); -}if(!JSON.validate(string)){throw new Error("JSON could not decode the input; security is enabled and the value is not secure.");}}return eval("("+string+")"); -};})();Request.JSON=new Class({Extends:Request,options:{secure:true},initialize:function(a){this.parent(a);Object.append(this.headers,{Accept:"application/json","X-Request":"JSON"}); -},success:function(c){var b;try{b=this.response.json=JSON.decode(c,this.options.secure);}catch(a){this.fireEvent("error",[c,a]);return;}if(b==null){this.onFailure(); -}else{this.onSuccess(b,c);}}});var Cookie=new Class({Implements:Options,options:{path:"/",domain:false,duration:false,secure:false,document:document,encode:true},initialize:function(b,a){this.key=b; -this.setOptions(a);},write:function(b){if(this.options.encode){b=encodeURIComponent(b);}if(this.options.domain){b+="; domain="+this.options.domain;}if(this.options.path){b+="; path="+this.options.path; -}if(this.options.duration){var a=new Date();a.setTime(a.getTime()+this.options.duration*24*60*60*1000);b+="; expires="+a.toGMTString();}if(this.options.secure){b+="; secure"; -}this.options.document.cookie=this.key+"="+b;return this;},read:function(){var a=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)"); -return(a)?decodeURIComponent(a[1]):null;},dispose:function(){new Cookie(this.key,Object.merge({},this.options,{duration:-1})).write("");return this;}}); -Cookie.write=function(b,c,a){return new Cookie(b,a).write(c);};Cookie.read=function(a){return new Cookie(a).read();};Cookie.dispose=function(b,a){return new Cookie(b,a).dispose(); -};(function(i,k){var l,f,e=[],c,b,d=k.createElement("div");var g=function(){clearTimeout(b);if(l){return;}Browser.loaded=l=true;k.removeListener("DOMContentLoaded",g).removeListener("readystatechange",a); -k.fireEvent("domready");i.fireEvent("domready");};var a=function(){for(var m=e.length;m--;){if(e[m]()){g();return true;}}return false;};var j=function(){clearTimeout(b); -if(!a()){b=setTimeout(j,10);}};k.addListener("DOMContentLoaded",g);var h=function(){try{d.doScroll();return true;}catch(m){}return false;};if(d.doScroll&&!h()){e.push(h); -c=true;}if(k.readyState){e.push(function(){var m=k.readyState;return(m=="loaded"||m=="complete");});}if("onreadystatechange" in k){k.addListener("readystatechange",a); -}else{c=true;}if(c){j();}Element.Events.domready={onAdd:function(m){if(l){m.call(this);}}};Element.Events.load={base:"load",onAdd:function(m){if(f&&this==i){m.call(this); -}},condition:function(){if(this==i){g();delete Element.Events.load;}return true;}};i.addEvent("load",function(){f=true;});})(window,document);(function(){var Swiff=this.Swiff=new Class({Implements:Options,options:{id:null,height:1,width:1,container:null,properties:{},params:{quality:"high",allowScriptAccess:"always",wMode:"window",swLiveConnect:true},callBacks:{},vars:{}},toElement:function(){return this.object; -},initialize:function(path,options){this.instance="Swiff_"+String.uniqueID();this.setOptions(options);options=this.options;var id=this.id=options.id||this.instance; -var container=document.id(options.container);Swiff.CallBacks[this.instance]={};var params=options.params,vars=options.vars,callBacks=options.callBacks; -var properties=Object.append({height:options.height,width:options.width},options.properties);var self=this;for(var callBack in callBacks){Swiff.CallBacks[this.instance][callBack]=(function(option){return function(){return option.apply(self.object,arguments); -};})(callBacks[callBack]);vars[callBack]="Swiff.CallBacks."+this.instance+"."+callBack;}params.flashVars=Object.toQueryString(vars);if(Browser.ie){properties.classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"; -params.movie=path;}else{properties.type="application/x-shockwave-flash";}properties.data=path;var build='';}}build+="";this.object=((container)?container.empty():new Element("div")).set("html",build).firstChild; -},replaces:function(element){element=document.id(element,true);element.parentNode.replaceChild(this.toElement(),element);return this;},inject:function(element){document.id(element,true).appendChild(this.toElement()); -return this;},remote:function(){return Swiff.remote.apply(Swiff,[this.toElement()].append(arguments));}});Swiff.CallBacks={};Swiff.remote=function(obj,fn){var rs=obj.CallFunction(''+__flash__argumentsToXML(arguments,2)+""); -return eval(rs);};})(); \ No newline at end of file diff -Nru qbittorrent-4.1.3/src/webui/www/private/scripts/lib/mootools-1.2-more.js qbittorrent-3.3.15/src/webui/www/private/scripts/lib/mootools-1.2-more.js --- qbittorrent-4.1.3/src/webui/www/private/scripts/lib/mootools-1.2-more.js 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/scripts/lib/mootools-1.2-more.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,326 +0,0 @@ -// MooTools: the javascript framework. -// Load this file's selection again by visiting: http://mootools.net/more/208dad2fc7517c7e60f4afddd3e7c664 -// Or build this file again with packager using: packager build More/More More/Class.Binds More/Class.Occlude More/String.Extras More/String.QueryString More/URI More/Hash More/Fx.Elements More/Fx.Accordion More/Fx.Move More/Fx.Reveal More/Fx.Scroll More/Fx.Slide More/Fx.SmoothScroll More/Fx.Sort More/Drag More/Drag.Move More/Slider More/Sortables More/Assets More/Color More/Hash.Cookie More/HtmlTable More/Keyboard -/* ---- -copyrights: - - [MooTools](http://mootools.net) - -licenses: - - [MIT License](http://mootools.net/license.txt) -... -*/ -MooTools.More={version:"1.4.0.1",build:"a4244edf2aa97ac8a196fc96082dd35af1abab87"};Class.Mutators.Binds=function(a){if(!this.prototype.initialize){this.implement("initialize",function(){}); -}return Array.from(a).concat(this.prototype.Binds||[]);};Class.Mutators.initialize=function(a){return function(){Array.from(this.Binds).each(function(b){var c=this[b]; -if(c){this[b]=c.bind(this);}},this);return a.apply(this,arguments);};};Class.Occlude=new Class({occlude:function(c,b){b=document.id(b||this.element);var a=b.retrieve(c||this.property); -if(a&&!this.occluded){return(this.occluded=a);}this.occluded=false;b.store(c||this.property,this);return this.occluded;}});(function(){var c={a:/[àáâãäåăą]/g,A:/[ÀÁÂÃÄÅĂĄ]/g,c:/[ćčç]/g,C:/[ĆČÇ]/g,d:/[ďđ]/g,D:/[ĎÐ]/g,e:/[èéêëěę]/g,E:/[ÈÉÊËĚĘ]/g,g:/[ğ]/g,G:/[Ğ]/g,i:/[ìíîï]/g,I:/[ÌÍÎÏ]/g,l:/[ĺľł]/g,L:/[ĹĽŁ]/g,n:/[ñňń]/g,N:/[ÑŇŃ]/g,o:/[òóôõöøő]/g,O:/[ÒÓÔÕÖØ]/g,r:/[řŕ]/g,R:/[ŘŔ]/g,s:/[ššş]/g,S:/[ŠŞŚ]/g,t:/[ťţ]/g,T:/[ŤŢ]/g,ue:/[ü]/g,UE:/[Ü]/g,u:/[ùúûůµ]/g,U:/[ÙÚÛŮ]/g,y:/[ÿý]/g,Y:/[ŸÝ]/g,z:/[žźż]/g,Z:/[ŽŹŻ]/g,th:/[þ]/g,TH:/[Þ]/g,dh:/[ð]/g,DH:/[Ð]/g,ss:/[ß]/g,oe:/[œ]/g,OE:/[Œ]/g,ae:/[æ]/g,AE:/[Æ]/g},b={" ":/[\xa0\u2002\u2003\u2009]/g,"*":/[\xb7]/g,"'":/[\u2018\u2019]/g,'"':/[\u201c\u201d]/g,"...":/[\u2026]/g,"-":/[\u2013]/g,"»":/[\uFFFD]/g}; -var a=function(f,h){var e=f,g;for(g in h){e=e.replace(h[g],g);}return e;};var d=function(e,g){e=e||"";var h=g?"<"+e+"(?!\\w)[^>]*>([\\s\\S]*?)":"]+)?>",f=new RegExp(h,"gi"); -return f;};String.implement({standardize:function(){return a(this,c);},repeat:function(e){return new Array(e+1).join(this);},pad:function(e,h,g){if(this.length>=e){return this; -}var f=(h==null?" ":""+h).repeat(e-this.length).substr(0,e-this.length);if(!g||g=="right"){return this+f;}if(g=="left"){return f+this;}return f.substr(0,(f.length/2).floor())+this+f.substr(0,(f.length/2).ceil()); -},getTags:function(e,f){return this.match(d(e,f))||[];},stripTags:function(e,f){return this.replace(d(e,f),"");},tidy:function(){return a(this,b);},truncate:function(e,f,i){var h=this; -if(f==null&&arguments.length==1){f="…";}if(h.length>e){h=h.substring(0,e);if(i){var g=h.lastIndexOf(i);if(g!=-1){h=h.substr(0,g);}}if(f){h+=f;}}return h; -}});})();String.implement({parseQueryString:function(d,a){if(d==null){d=true;}if(a==null){a=true;}var c=this.split(/[&;]/),b={};if(!c.length){return b; -}c.each(function(i){var e=i.indexOf("=")+1,g=e?i.substr(e):"",f=e?i.substr(0,e-1).match(/([^\]\[]+|(\B)(?=\]))/g):[i],h=b;if(!f){return;}if(a){g=decodeURIComponent(g); -}f.each(function(k,j){if(d){k=decodeURIComponent(k);}var l=h[k];if(j0){c.pop(); -}else{if(f!="."){c.push(f);}}});return c.join("/")+"/";},combine:function(c){return c.value||c.scheme+"://"+(c.user?c.user+(c.password?":"+c.password:"")+"@":"")+(c.host||"")+(c.port&&c.port!=this.schemes[c.scheme]?":"+c.port:"")+(c.directory||"/")+(c.file||"")+(c.query?"?"+c.query:"")+(c.fragment?"#"+c.fragment:""); -},set:function(d,f,e){if(d=="value"){var c=f.match(a.regs.scheme);if(c){c=c[1];}if(c&&this.schemes[c.toLowerCase()]==null){this.parsed={scheme:c,value:f}; -}else{this.parsed=this.parse(f,(e||this).parsed)||(c?{scheme:c,value:f}:{value:f});}}else{if(d=="data"){this.setData(f);}else{this.parsed[d]=f;}}return this; -},get:function(c,d){switch(c){case"value":return this.combine(this.parsed,d?d.parsed:false);case"data":return this.getData();}return this.parsed[c]||""; -},go:function(){document.location.href=this.toString();},toURI:function(){return this;},getData:function(e,d){var c=this.get(d||"query");if(!(c||c===0)){return e?null:{}; -}var f=c.parseQueryString();return e?f[e]:f;},setData:function(c,f,d){if(typeof c=="string"){var e=this.getData();e[arguments[0]]=arguments[1];c=e;}else{if(f){c=Object.merge(this.getData(),c); -}}return this.set(d||"query",Object.toQueryString(c));},clearData:function(c){return this.set(c||"query","");},toString:b,valueOf:b});a.regs={endSlash:/\/$/,scheme:/^(\w+):/,directoryDot:/\.\/|\.$/}; -a.base=new a(Array.from(document.getElements("base[href]",true)).getLast(),{base:document.location});String.implement({toURI:function(c){return new a(this,c); -}});})();(function(){if(this.Hash){return;}var a=this.Hash=new Type("Hash",function(b){if(typeOf(b)=="hash"){b=Object.clone(b.getClean());}for(var c in b){this[c]=b[c]; -}return this;});this.$H=function(b){return new a(b);};a.implement({forEach:function(b,c){Object.forEach(this,b,c);},getClean:function(){var c={};for(var b in this){if(this.hasOwnProperty(b)){c[b]=this[b]; -}}return c;},getLength:function(){var c=0;for(var b in this){if(this.hasOwnProperty(b)){c++;}}return c;}});a.alias("each","forEach");a.implement({has:Object.prototype.hasOwnProperty,keyOf:function(b){return Object.keyOf(this,b); -},hasValue:function(b){return Object.contains(this,b);},extend:function(b){a.each(b||{},function(d,c){a.set(this,c,d);},this);return this;},combine:function(b){a.each(b||{},function(d,c){a.include(this,c,d); -},this);return this;},erase:function(b){if(this.hasOwnProperty(b)){delete this[b];}return this;},get:function(b){return(this.hasOwnProperty(b))?this[b]:null; -},set:function(b,c){if(!this[b]||this.hasOwnProperty(b)){this[b]=c;}return this;},empty:function(){a.each(this,function(c,b){delete this[b];},this);return this; -},include:function(b,c){if(this[b]==undefined){this[b]=c;}return this;},map:function(b,c){return new a(Object.map(this,b,c));},filter:function(b,c){return new a(Object.filter(this,b,c)); -},every:function(b,c){return Object.every(this,b,c);},some:function(b,c){return Object.some(this,b,c);},getKeys:function(){return Object.keys(this);},getValues:function(){return Object.values(this); -},toQueryString:function(b){return Object.toQueryString(this,b);}});a.alias({indexOf:"keyOf",contains:"hasValue"});})();Fx.Elements=new Class({Extends:Fx.CSS,initialize:function(b,a){this.elements=this.subject=$$(b); -this.parent(a);},compute:function(g,h,j){var c={};for(var d in g){var a=g[d],e=h[d],f=c[d]={};for(var b in a){f[b]=this.parent(a[b],e[b],j);}}return c; -},set:function(b){for(var c in b){if(!this.elements[c]){continue;}var a=b[c];for(var d in a){this.render(this.elements[c],d,a[d],this.options.unit);}}return this; -},start:function(c){if(!this.check(c)){return this;}var h={},j={};for(var d in c){if(!this.elements[d]){continue;}var f=c[d],a=h[d]={},g=j[d]={};for(var b in f){var e=this.prepare(this.elements[d],b,f[b]); -a[b]=e.from;g[b]=e.to;}}return this.parent(h,j);}});Fx.Accordion=new Class({Extends:Fx.Elements,options:{fixedHeight:false,fixedWidth:false,display:0,show:false,height:true,width:false,opacity:true,alwaysHide:false,trigger:"click",initialDisplayFx:true,resetHeight:true},initialize:function(){var g=function(h){return h!=null; -};var f=Array.link(arguments,{container:Type.isElement,options:Type.isObject,togglers:g,elements:g});this.parent(f.elements,f.options);var b=this.options,e=this.togglers=$$(f.togglers); -this.previous=-1;this.internalChain=new Chain();if(b.alwaysHide){this.options.link="chain";}if(b.show||this.options.show===0){b.display=false;this.previous=b.show; -}if(b.start){b.display=false;b.show=false;}var d=this.effects={};if(b.opacity){d.opacity="fullOpacity";}if(b.width){d.width=b.fixedWidth?"fullWidth":"offsetWidth"; -}if(b.height){d.height=b.fixedHeight?"fullHeight":"scrollHeight";}for(var c=0,a=e.length;c=0?a-1:0)).chain(d);}else{d();}return this;},detach:function(b){var a=function(c){c.removeEvent(this.options.trigger,c.retrieve("accordion:display")); -}.bind(this);if(!b){this.togglers.each(a);}else{a(b);}return this;},display:function(b,c){if(!this.check(b,c)){return this;}var h={},g=this.elements,a=this.options,f=this.effects; -if(c==null){c=true;}if(typeOf(b)=="element"){b=g.indexOf(b);}if(b==this.previous&&!a.alwaysHide){return this;}if(a.resetHeight){var e=g[this.previous]; -if(e&&!this.selfHidden){for(var d in f){e.setStyle(d,e[f[d]]);}}}if((this.timer&&a.link=="chain")||(b===this.previous&&!a.alwaysHide)){return this;}this.previous=b; -this.selfHidden=false;g.each(function(l,k){h[k]={};var j;if(k!=b){j=true;}else{if(a.alwaysHide&&((l.offsetHeight>0&&a.height)||l.offsetWidth>0&&a.width)){j=true; -this.selfHidden=true;}}this.fireEvent(j?"background":"active",[this.togglers[k],l]);for(var m in f){h[k][m]=j?0:l[f[m]];}if(!c&&!j&&a.resetHeight){h[k].height="auto"; -}},this);this.internalChain.clearChain();this.internalChain.chain(function(){if(a.resetHeight&&!this.selfHidden){var i=g[b];if(i){i.setStyle("height","auto"); -}}}.bind(this));return c?this.start(h):this.set(h).internalChain.callChain();}});var Accordion=new Class({Extends:Fx.Accordion,initialize:function(){this.parent.apply(this,arguments); -var a=Array.link(arguments,{container:Type.isElement});this.container=a.container;},addSection:function(c,b,e){c=document.id(c);b=document.id(b);var d=this.togglers.contains(c); -var a=this.togglers.length;if(a&&(!d||e)){e=e!=null?e:a-1;c.inject(this.togglers[e],"before");b.inject(c,"after");}else{if(this.container&&!d){c.inject(this.container); -b.inject(this.container);}}return this.parent.apply(this,arguments);}});(function(){var b=function(e,d){var f=[];Object.each(d,function(g){Object.each(g,function(h){e.each(function(i){f.push(i+"-"+h+(i=="border"?"-width":"")); -});});});return f;};var c=function(f,e){var d=0;Object.each(e,function(h,g){if(g.test(f)){d=d+h.toInt();}});return d;};var a=function(d){return !!(!d||d.offsetHeight||d.offsetWidth); -};Element.implement({measure:function(h){if(a(this)){return h.call(this);}var g=this.getParent(),e=[];while(!a(g)&&g!=document.body){e.push(g.expose()); -g=g.getParent();}var f=this.expose(),d=h.call(this);f();e.each(function(i){i();});return d;},expose:function(){if(this.getStyle("display")!="none"){return function(){}; -}var d=this.style.cssText;this.setStyles({display:"block",position:"absolute",visibility:"hidden"});return function(){this.style.cssText=d;}.bind(this); -},getDimensions:function(d){d=Object.merge({computeSize:false},d);var i={x:0,y:0};var h=function(j,e){return(e.computeSize)?j.getComputedSize(e):j.getSize(); -};var f=this.getParent("body");if(f&&this.getStyle("display")=="none"){i=this.measure(function(){return h(this,d);});}else{if(f){try{i=h(this,d);}catch(g){}}}return Object.append(i,(i.x||i.x===0)?{width:i.x,height:i.y}:{x:i.width,y:i.height}); -},getComputedSize:function(d){if(d&&d.plains){d.planes=d.plains;}d=Object.merge({styles:["padding","border"],planes:{height:["top","bottom"],width:["left","right"]},mode:"both"},d); -var g={},e={width:0,height:0},f;if(d.mode=="vertical"){delete e.width;delete d.planes.width;}else{if(d.mode=="horizontal"){delete e.height;delete d.planes.height; -}}b(d.styles,d.planes).each(function(h){g[h]=this.getStyle(h).toInt();},this);Object.each(d.planes,function(i,h){var k=h.capitalize(),j=this.getStyle(h); -if(j=="auto"&&!f){f=this.getDimensions();}j=g[h]=(j=="auto")?f[h]:j.toInt();e["total"+k]=j;i.each(function(m){var l=c(m,g);e["computed"+m.capitalize()]=l; -e["total"+k]+=l;});},this);return Object.append(e,g);}});})();(function(b){var a=Element.Position={options:{relativeTo:document.body,position:{x:"center",y:"center"},offset:{x:0,y:0}},getOptions:function(d,c){c=Object.merge({},a.options,c); -a.setPositionOption(c);a.setEdgeOption(c);a.setOffsetOption(d,c);a.setDimensionsOption(d,c);return c;},setPositionOption:function(c){c.position=a.getCoordinateFromValue(c.position); -},setEdgeOption:function(d){var c=a.getCoordinateFromValue(d.edge);d.edge=c?c:(d.position.x=="center"&&d.position.y=="center")?{x:"center",y:"center"}:{x:"left",y:"top"}; -},setOffsetOption:function(f,d){var c={x:0,y:0},g=f.measure(function(){return document.id(this.getOffsetParent());}),e=g.getScroll();if(!g||g==f.getDocument().body){return; -}c=g.measure(function(){var i=this.getPosition();if(this.getStyle("position")=="fixed"){var h=window.getScroll();i.x+=h.x;i.y+=h.y;}return i;});d.offset={parentPositioned:g!=document.id(d.relativeTo),x:d.offset.x-c.x+e.x,y:d.offset.y-c.y+e.y}; -},setDimensionsOption:function(d,c){c.dimensions=d.getDimensions({computeSize:true,styles:["padding","border","margin"]});},getPosition:function(e,d){var c={}; -d=a.getOptions(e,d);var f=document.id(d.relativeTo)||document.body;a.setPositionCoordinates(d,c,f);if(d.edge){a.toEdge(c,d);}var g=d.offset;c.left=((c.x>=0||g.parentPositioned||d.allowNegative)?c.x:0).toInt(); -c.top=((c.y>=0||g.parentPositioned||d.allowNegative)?c.y:0).toInt();a.toMinMax(c,d);if(d.relFixedPosition||f.getStyle("position")=="fixed"){a.toRelFixedPosition(f,c); -}if(d.ignoreScroll){a.toIgnoreScroll(f,c);}if(d.ignoreMargins){a.toIgnoreMargins(c,d);}c.left=Math.ceil(c.left);c.top=Math.ceil(c.top);delete c.x;delete c.y; -return c;},setPositionCoordinates:function(k,g,d){var f=k.offset.y,h=k.offset.x,e=(d==document.body)?window.getScroll():d.getPosition(),j=e.y,c=e.x,i=window.getSize(); -switch(k.position.x){case"left":g.x=c+h;break;case"right":g.x=c+h+d.offsetWidth;break;default:g.x=c+((d==document.body?i.x:d.offsetWidth)/2)+h;break;}switch(k.position.y){case"top":g.y=j+f; -break;case"bottom":g.y=j+f+d.offsetHeight;break;default:g.y=j+((d==document.body?i.y:d.offsetHeight)/2)+f;break;}},toMinMax:function(c,d){var f={left:"x",top:"y"},e; -["minimum","maximum"].each(function(g){["left","top"].each(function(h){e=d[g]?d[g][f[h]]:null;if(e!=null&&((g=="minimum")?c[h]e)){c[h]=e;}});}); -},toRelFixedPosition:function(e,c){var d=window.getScroll();c.top+=d.y;c.left+=d.x;},toIgnoreScroll:function(e,d){var c=e.getScroll();d.top-=c.y;d.left-=c.x; -},toIgnoreMargins:function(c,d){c.left+=d.edge.x=="right"?d.dimensions["margin-right"]:(d.edge.x!="center"?-d.dimensions["margin-left"]:-d.dimensions["margin-left"]+((d.dimensions["margin-right"]+d.dimensions["margin-left"])/2)); -c.top+=d.edge.y=="bottom"?d.dimensions["margin-bottom"]:(d.edge.y!="center"?-d.dimensions["margin-top"]:-d.dimensions["margin-top"]+((d.dimensions["margin-bottom"]+d.dimensions["margin-top"])/2)); -},toEdge:function(c,d){var e={},g=d.dimensions,f=d.edge;switch(f.x){case"left":e.x=0;break;case"right":e.x=-g.x-g.computedRight-g.computedLeft;break;default:e.x=-(Math.round(g.totalWidth/2)); -break;}switch(f.y){case"top":e.y=0;break;case"bottom":e.y=-g.y-g.computedTop-g.computedBottom;break;default:e.y=-(Math.round(g.totalHeight/2));break;}c.x+=e.x; -c.y+=e.y;},getCoordinateFromValue:function(c){if(typeOf(c)!="string"){return c;}c=c.toLowerCase();return{x:c.test("left")?"left":(c.test("right")?"right":"center"),y:c.test(/upper|top/)?"top":(c.test("bottom")?"bottom":"center")}; -}};Element.implement({position:function(d){if(d&&(d.x!=null||d.y!=null)){return(b?b.apply(this,arguments):this);}var c=this.setStyle("position","absolute").calculatePosition(d); -return(d&&d.returnPos)?c:this.setStyles(c);},calculatePosition:function(c){return a.getPosition(this,c);}});})(Element.prototype.position);Fx.Move=new Class({Extends:Fx.Morph,options:{relativeTo:document.body,position:"center",edge:false,offset:{x:0,y:0}},start:function(a){var b=this.element,c=b.getStyles("top","left"); -if(c.top=="auto"||c.left=="auto"){b.setPosition(b.getPosition(b.getOffsetParent()));}return this.parent(b.position(Object.merge({},this.options,a,{returnPos:true}))); -}});Element.Properties.move={set:function(a){this.get("move").cancel().setOptions(a);return this;},get:function(){var a=this.retrieve("move");if(!a){a=new Fx.Move(this,{link:"cancel"}); -this.store("move",a);}return a;}};Element.implement({move:function(a){this.get("move").start(a);return this;}});Element.implement({isDisplayed:function(){return this.getStyle("display")!="none"; -},isVisible:function(){var a=this.offsetWidth,b=this.offsetHeight;return(a==0&&b==0)?false:(a>0&&b>0)?true:this.style.display!="none";},toggle:function(){return this[this.isDisplayed()?"hide":"show"](); -},hide:function(){var b;try{b=this.getStyle("display");}catch(a){}if(b=="none"){return this;}return this.store("element:_originalDisplay",b||"").setStyle("display","none"); -},show:function(a){if(!a&&this.isDisplayed()){return this;}a=a||this.retrieve("element:_originalDisplay")||"block";return this.setStyle("display",(a=="none")?"block":a); -},swapClass:function(a,b){return this.removeClass(a).addClass(b);}});Document.implement({clearSelection:function(){if(window.getSelection){var a=window.getSelection(); -if(a&&a.removeAllRanges){a.removeAllRanges();}}else{if(document.selection&&document.selection.empty){try{document.selection.empty();}catch(b){}}}}});(function(){var a=function(d){var b=d.options.hideInputs; -if(window.OverText){var c=[null];OverText.each(function(e){c.include("."+e.options.labelClass);});if(c){b+=c.join(", ");}}return(b)?d.element.getElements(b):null; -};Fx.Reveal=new Class({Extends:Fx.Morph,options:{link:"cancel",styles:["padding","border","margin"],transitionOpacity:!Browser.ie6,mode:"vertical",display:function(){return this.element.get("tag")!="tr"?"block":"table-row"; -},opacity:1,hideInputs:Browser.ie?"select, input, textarea, object, embed":null},dissolve:function(){if(!this.hiding&&!this.showing){if(this.element.getStyle("display")!="none"){this.hiding=true; -this.showing=false;this.hidden=true;this.cssText=this.element.style.cssText;var d=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode}); -if(this.options.transitionOpacity){d.opacity=this.options.opacity;}var c={};Object.each(d,function(f,e){c[e]=[f,0];});this.element.setStyles({display:Function.from(this.options.display).call(this),overflow:"hidden"}); -var b=a(this);if(b){b.setStyle("visibility","hidden");}this.$chain.unshift(function(){if(this.hidden){this.hiding=false;this.element.style.cssText=this.cssText; -this.element.setStyle("display","none");if(b){b.setStyle("visibility","visible");}}this.fireEvent("hide",this.element);this.callChain();}.bind(this));this.start(c); -}else{this.callChain.delay(10,this);this.fireEvent("complete",this.element);this.fireEvent("hide",this.element);}}else{if(this.options.link=="chain"){this.chain(this.dissolve.bind(this)); -}else{if(this.options.link=="cancel"&&!this.hiding){this.cancel();this.dissolve();}}}return this;},reveal:function(){if(!this.showing&&!this.hiding){if(this.element.getStyle("display")=="none"){this.hiding=false; -this.showing=true;this.hidden=false;this.cssText=this.element.style.cssText;var d;this.element.measure(function(){d=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode}); -}.bind(this));if(this.options.heightOverride!=null){d.height=this.options.heightOverride.toInt();}if(this.options.widthOverride!=null){d.width=this.options.widthOverride.toInt(); -}if(this.options.transitionOpacity){this.element.setStyle("opacity",0);d.opacity=this.options.opacity;}var c={height:0,display:Function.from(this.options.display).call(this)}; -Object.each(d,function(f,e){c[e]=0;});c.overflow="hidden";this.element.setStyles(c);var b=a(this);if(b){b.setStyle("visibility","hidden");}this.$chain.unshift(function(){this.element.style.cssText=this.cssText; -this.element.setStyle("display",Function.from(this.options.display).call(this));if(!this.hidden){this.showing=false;}if(b){b.setStyle("visibility","visible"); -}this.callChain();this.fireEvent("show",this.element);}.bind(this));this.start(d);}else{this.callChain();this.fireEvent("complete",this.element);this.fireEvent("show",this.element); -}}else{if(this.options.link=="chain"){this.chain(this.reveal.bind(this));}else{if(this.options.link=="cancel"&&!this.showing){this.cancel();this.reveal(); -}}}return this;},toggle:function(){if(this.element.getStyle("display")=="none"){this.reveal();}else{this.dissolve();}return this;},cancel:function(){this.parent.apply(this,arguments); -if(this.cssText!=null){this.element.style.cssText=this.cssText;}this.hiding=false;this.showing=false;return this;}});Element.Properties.reveal={set:function(b){this.get("reveal").cancel().setOptions(b); -return this;},get:function(){var b=this.retrieve("reveal");if(!b){b=new Fx.Reveal(this);this.store("reveal",b);}return b;}};Element.Properties.dissolve=Element.Properties.reveal; -Element.implement({reveal:function(b){this.get("reveal").setOptions(b).reveal();return this;},dissolve:function(b){this.get("reveal").setOptions(b).dissolve(); -return this;},nix:function(b){var c=Array.link(arguments,{destroy:Type.isBoolean,options:Type.isObject});this.get("reveal").setOptions(b).dissolve().chain(function(){this[c.destroy?"destroy":"dispose"](); -}.bind(this));return this;},wink:function(){var c=Array.link(arguments,{duration:Type.isNumber,options:Type.isObject});var b=this.get("reveal").setOptions(c.options); -b.reveal().chain(function(){(function(){b.dissolve();}).delay(c.duration||2000);});}});})();(function(){Fx.Scroll=new Class({Extends:Fx,options:{offset:{x:0,y:0},wheelStops:true},initialize:function(c,b){this.element=this.subject=document.id(c); -this.parent(b);if(typeOf(this.element)!="element"){this.element=document.id(this.element.getDocument().body);}if(this.options.wheelStops){var d=this.element,e=this.cancel.pass(false,this); -this.addEvent("start",function(){d.addEvent("mousewheel",e);},true);this.addEvent("complete",function(){d.removeEvent("mousewheel",e);},true);}},set:function(){var b=Array.flatten(arguments); -if(Browser.firefox){b=[Math.round(b[0]),Math.round(b[1])];}this.element.scrollTo(b[0],b[1]);return this;},compute:function(d,c,b){return[0,1].map(function(e){return Fx.compute(d[e],c[e],b); -});},start:function(c,d){if(!this.check(c,d)){return this;}var b=this.element.getScroll();return this.parent([b.x,b.y],[c,d]);},calculateScroll:function(g,f){var d=this.element,b=d.getScrollSize(),h=d.getScroll(),j=d.getSize(),c=this.options.offset,i={x:g,y:f}; -for(var e in i){if(!i[e]&&i[e]!==0){i[e]=h[e];}if(typeOf(i[e])!="number"){i[e]=b[e]-j[e];}i[e]+=c[e];}return[i.x,i.y];},toTop:function(){return this.start.apply(this,this.calculateScroll(false,0)); -},toLeft:function(){return this.start.apply(this,this.calculateScroll(0,false));},toRight:function(){return this.start.apply(this,this.calculateScroll("right",false)); -},toBottom:function(){return this.start.apply(this,this.calculateScroll(false,"bottom"));},toElement:function(d,e){e=e?Array.from(e):["x","y"];var c=a(this.element)?{x:0,y:0}:this.element.getScroll(); -var b=Object.map(document.id(d).getPosition(this.element),function(g,f){return e.contains(f)?g+c[f]:false;});return this.start.apply(this,this.calculateScroll(b.x,b.y)); -},toElementEdge:function(d,g,e){g=g?Array.from(g):["x","y"];d=document.id(d);var i={},f=d.getPosition(this.element),j=d.getSize(),h=this.element.getScroll(),b=this.element.getSize(),c={x:f.x+j.x,y:f.y+j.y}; -["x","y"].each(function(k){if(g.contains(k)){if(c[k]>h[k]+b[k]){i[k]=c[k]-b[k];}if(f[k]this.elements.length){e.splice(this.elements.length-1,e.length-this.elements.length); -}}var b=0;i=a=0;e.each(function(k){var j={};if(d){j.top=i-f[k].top-b;i+=f[k].height;}else{j.left=a-f[k].left;a+=f[k].width;}b=b+f[k].margin;c[k]=j;},this); -var g={};Array.clone(e).sort().each(function(j){g[j]=c[j];});this.start(g);this.currentOrder=e;return this;},rearrangeDOM:function(a){a=a||this.currentOrder; -var b=this.elements[0].getParent();var c=[];this.elements.setStyle("opacity",0);a.each(function(d){c.push(this.elements[d].inject(b).setStyles({top:0,left:0})); -},this);this.elements.setStyle("opacity",1);this.elements=$$(c);this.setDefaultOrder();return this;},getDefaultOrder:function(){return this.elements.map(function(b,a){return a; -});},getCurrentOrder:function(){return this.currentOrder;},forward:function(){return this.sort(this.getDefaultOrder());},backward:function(){return this.sort(this.getDefaultOrder().reverse()); -},reverse:function(){return this.sort(this.currentOrder.reverse());},sortByElements:function(a){return this.sort(a.map(function(b){return this.elements.indexOf(b); -},this));},swap:function(c,b){if(typeOf(c)=="element"){c=this.elements.indexOf(c);}if(typeOf(b)=="element"){b=this.elements.indexOf(b);}var a=Array.clone(this.currentOrder); -a[this.currentOrder.indexOf(c)]=b;a[this.currentOrder.indexOf(b)]=c;return this.sort(a);}});var Drag=new Class({Implements:[Events,Options],options:{snap:6,unit:"px",grid:false,style:true,limit:false,handle:false,invert:false,preventDefault:false,stopPropagation:false,modifiers:{x:"left",y:"top"}},initialize:function(){var b=Array.link(arguments,{options:Type.isObject,element:function(c){return c!=null; -}});this.element=document.id(b.element);this.document=this.element.getDocument();this.setOptions(b.options||{});var a=typeOf(this.options.handle);this.handles=((a=="array"||a=="collection")?$$(this.options.handle):document.id(this.options.handle))||this.element; -this.mouse={now:{},pos:{}};this.value={start:{},now:{}};this.selection=(Browser.ie)?"selectstart":"mousedown";if(Browser.ie&&!Drag.ondragstartFixed){document.ondragstart=Function.from(false); -Drag.ondragstartFixed=true;}this.bound={start:this.start.bind(this),check:this.check.bind(this),drag:this.drag.bind(this),stop:this.stop.bind(this),cancel:this.cancel.bind(this),eventStop:Function.from(false)}; -this.attach();},attach:function(){this.handles.addEvent("mousedown",this.bound.start);return this;},detach:function(){this.handles.removeEvent("mousedown",this.bound.start); -return this;},start:function(a){var j=this.options;if(a.rightClick){return;}if(j.preventDefault){a.preventDefault();}if(j.stopPropagation){a.stopPropagation(); -}this.mouse.start=a.page;this.fireEvent("beforeStart",this.element);var c=j.limit;this.limit={x:[],y:[]};var e,g;for(e in j.modifiers){if(!j.modifiers[e]){continue; -}var b=this.element.getStyle(j.modifiers[e]);if(b&&!b.match(/px$/)){if(!g){g=this.element.getCoordinates(this.element.getOffsetParent());}b=g[j.modifiers[e]]; -}if(j.style){this.value.now[e]=(b||0).toInt();}else{this.value.now[e]=this.element[j.modifiers[e]];}if(j.invert){this.value.now[e]*=-1;}this.mouse.pos[e]=a.page[e]-this.value.now[e]; -if(c&&c[e]){var d=2;while(d--){var f=c[e][d];if(f||f===0){this.limit[e][d]=(typeof f=="function")?f():f;}}}}if(typeOf(this.options.grid)=="number"){this.options.grid={x:this.options.grid,y:this.options.grid}; -}var h={mousemove:this.bound.check,mouseup:this.bound.cancel};h[this.selection]=this.bound.eventStop;this.document.addEvents(h);},check:function(a){if(this.options.preventDefault){a.preventDefault(); -}var b=Math.round(Math.sqrt(Math.pow(a.page.x-this.mouse.start.x,2)+Math.pow(a.page.y-this.mouse.start.y,2)));if(b>this.options.snap){this.cancel();this.document.addEvents({mousemove:this.bound.drag,mouseup:this.bound.stop}); -this.fireEvent("start",[this.element,a]).fireEvent("snap",this.element);}},drag:function(b){var a=this.options;if(a.preventDefault){b.preventDefault(); -}this.mouse.now=b.page;for(var c in a.modifiers){if(!a.modifiers[c]){continue;}this.value.now[c]=this.mouse.now[c]-this.mouse.pos[c];if(a.invert){this.value.now[c]*=-1; -}if(a.limit&&this.limit[c]){if((this.limit[c][1]||this.limit[c][1]===0)&&(this.value.now[c]>this.limit[c][1])){this.value.now[c]=this.limit[c][1];}else{if((this.limit[c][0]||this.limit[c][0]===0)&&(this.value.now[c]d.left&&b.xd.top);},this).getLast();if(this.overed!=a){if(this.overed){this.fireEvent("leave",[this.element,this.overed]); -}if(a){this.fireEvent("enter",[this.element,a]);}this.overed=a;}},drag:function(a){this.parent(a);if(this.options.checkDroppables&&this.droppables.length){this.checkDroppables(); -}},stop:function(a){this.checkDroppables();this.fireEvent("drop",[this.element,this.overed,a]);this.overed=null;return this.parent(a);}});Element.implement({makeDraggable:function(a){var b=new Drag.Move(this,a); -this.store("dragger",b);return b;}});var Slider=new Class({Implements:[Events,Options],Binds:["clickedElement","draggedKnob","scrolledElement"],options:{onTick:function(a){this.setKnobPosition(a); -},initialStep:0,snap:false,offset:0,range:false,wheel:false,steps:100,mode:"horizontal"},initialize:function(f,a,e){this.setOptions(e);e=this.options;this.element=document.id(f); -a=this.knob=document.id(a);this.previousChange=this.previousEnd=this.step=-1;var b={},d={x:false,y:false};switch(e.mode){case"vertical":this.axis="y";this.property="top"; -this.offset="offsetHeight";break;case"horizontal":this.axis="x";this.property="left";this.offset="offsetWidth";}this.setSliderDimensions();this.setRange(e.range); -if(a.getStyle("position")=="static"){a.setStyle("position","relative");}a.setStyle(this.property,-e.offset);d[this.axis]=this.property;b[this.axis]=[-e.offset,this.full-e.offset]; -var c={snap:0,limit:b,modifiers:d,onDrag:this.draggedKnob,onStart:this.draggedKnob,onBeforeStart:(function(){this.isDragging=true;}).bind(this),onCancel:function(){this.isDragging=false; -}.bind(this),onComplete:function(){this.isDragging=false;this.draggedKnob();this.end();}.bind(this)};if(e.snap){this.setSnap(c);}this.drag=new Drag(a,c); -this.attach();if(e.initialStep!=null){this.set(e.initialStep);}},attach:function(){this.element.addEvent("mousedown",this.clickedElement);if(this.options.wheel){this.element.addEvent("mousewheel",this.scrolledElement); -}this.drag.attach();return this;},detach:function(){this.element.removeEvent("mousedown",this.clickedElement).removeEvent("mousewheel",this.scrolledElement); -this.drag.detach();return this;},autosize:function(){this.setSliderDimensions().setKnobPosition(this.toPosition(this.step));this.drag.options.limit[this.axis]=[-this.options.offset,this.full-this.options.offset]; -if(this.options.snap){this.setSnap();}return this;},setSnap:function(a){if(!a){a=this.drag.options;}a.grid=Math.ceil(this.stepWidth);a.limit[this.axis][1]=this.full; -return this;},setKnobPosition:function(a){if(this.options.snap){a=this.toPosition(this.step);}this.knob.setStyle(this.property,a);return this;},setSliderDimensions:function(){this.full=this.element.measure(function(){this.half=this.knob[this.offset]/2; -return this.element[this.offset]-this.knob[this.offset]+(this.options.offset*2);}.bind(this));return this;},set:function(a){if(!((this.range>0)^(a0)^(a>this.max))){a=this.max;}this.step=Math.round(a);return this.checkStep().fireEvent("tick",this.toPosition(this.step)).end();},setRange:function(a,b){this.min=Array.pick([a[0],0]); -this.max=Array.pick([a[1],this.options.steps]);this.range=this.max-this.min;this.steps=this.options.steps||this.full;this.stepSize=Math.abs(this.range)/this.steps; -this.stepWidth=this.stepSize*this.full/Math.abs(this.range);if(a){this.set(Array.pick([b,this.step]).floor(this.min).max(this.max));}return this;},clickedElement:function(c){if(this.isDragging||c.target==this.knob){return; -}var b=this.range<0?-1:1,a=c.page[this.axis]-this.element.getPosition()[this.axis]-this.half;a=a.limit(-this.options.offset,this.full-this.options.offset); -this.step=Math.round(this.min+b*this.toStep(a));this.checkStep().fireEvent("tick",a).end();},scrolledElement:function(a){var b=(this.options.mode=="horizontal")?(a.wheel<0):(a.wheel>0); -this.set(this.step+(b?-1:1)*this.stepSize);a.stop();},draggedKnob:function(){var b=this.range<0?-1:1,a=this.drag.value.now[this.axis];a=a.limit(-this.options.offset,this.full-this.options.offset); -this.step=Math.round(this.min+b*this.toStep(a));this.checkStep();},checkStep:function(){var a=this.step;if(this.previousChange!=a){this.previousChange=a; -this.fireEvent("change",a);}return this;},end:function(){var a=this.step;if(this.previousEnd!==a){this.previousEnd=a;this.fireEvent("complete",a+"");}return this; -},toStep:function(a){var b=(a+this.options.offset)*this.stepSize/this.full*this.steps;return this.options.steps?Math.round(b-=b%this.stepSize):b;},toPosition:function(a){return(this.full*Math.abs(this.min-a))/(this.steps*this.stepSize)-this.options.offset; -}});var Sortables=new Class({Implements:[Events,Options],options:{opacity:1,clone:false,revert:false,handle:false,dragOptions:{},snap:4,constrain:false,preventDefault:false},initialize:function(a,b){this.setOptions(b); -this.elements=[];this.lists=[];this.idle=true;this.addLists($$(document.id(a)||a));if(!this.options.clone){this.options.revert=false;}if(this.options.revert){this.effect=new Fx.Morph(null,Object.merge({duration:250,link:"cancel"},this.options.revert)); -}},attach:function(){this.addLists(this.lists);return this;},detach:function(){this.lists=this.removeLists(this.lists);return this;},addItems:function(){Array.flatten(arguments).each(function(a){this.elements.push(a); -var b=a.retrieve("sortables:start",function(c){this.start.call(this,c,a);}.bind(this));(this.options.handle?a.getElement(this.options.handle)||a:a).addEvent("mousedown",b); -},this);return this;},addLists:function(){Array.flatten(arguments).each(function(a){this.lists.include(a);this.addItems(a.getChildren());},this);return this; -},removeItems:function(){return $$(Array.flatten(arguments).map(function(a){this.elements.erase(a);var b=a.retrieve("sortables:start");(this.options.handle?a.getElement(this.options.handle)||a:a).removeEvent("mousedown",b); -return a;},this));},removeLists:function(){return $$(Array.flatten(arguments).map(function(a){this.lists.erase(a);this.removeItems(a.getChildren());return a; -},this));},getClone:function(b,a){if(!this.options.clone){return new Element(a.tagName).inject(document.body);}if(typeOf(this.options.clone)=="function"){return this.options.clone.call(this,b,a,this.list); -}var c=a.clone(true).setStyles({margin:0,position:"absolute",visibility:"hidden",width:a.getStyle("width")}).addEvent("mousedown",function(d){a.fireEvent("mousedown",d); -});if(c.get("html").test("radio")){c.getElements("input[type=radio]").each(function(d,e){d.set("name","clone_"+e);if(d.get("checked")){a.getElements("input[type=radio]")[e].set("checked",true); -}});}return c.inject(this.list).setPosition(a.getPosition(a.getOffsetParent()));},getDroppables:function(){var a=this.list.getChildren().erase(this.clone).erase(this.element); -if(!this.options.constrain){a.append(this.lists).erase(this.list);}return a;},insert:function(c,b){var a="inside";if(this.lists.contains(b)){this.list=b; -this.drag.droppables=this.getDroppables();}else{a=this.element.getAllPrevious().contains(b)?"before":"after";}this.element.inject(b,a);this.fireEvent("sort",[this.element,this.clone]); -},start:function(b,a){if(!this.idle||b.rightClick||["button","input","a","textarea"].contains(b.target.get("tag"))){return;}this.idle=false;this.element=a; -this.opacity=a.getStyle("opacity");this.list=a.getParent();this.clone=this.getClone(b,a);this.drag=new Drag.Move(this.clone,Object.merge({preventDefault:this.options.preventDefault,snap:this.options.snap,container:this.options.constrain&&this.element.getParent(),droppables:this.getDroppables()},this.options.dragOptions)).addEvents({onSnap:function(){b.stop(); -this.clone.setStyle("visibility","visible");this.element.setStyle("opacity",this.options.opacity||0);this.fireEvent("start",[this.element,this.clone]); -}.bind(this),onEnter:this.insert.bind(this),onCancel:this.end.bind(this),onComplete:this.end.bind(this)});this.clone.inject(this.element,"before");this.drag.start(b); -},end:function(){this.drag.detach();this.element.setStyle("opacity",this.opacity);if(this.effect){var b=this.element.getStyles("width","height"),d=this.clone,c=d.computePosition(this.element.getPosition(this.clone.getOffsetParent())); -var a=function(){this.removeEvent("cancel",a);d.destroy();};this.effect.element=d;this.effect.start({top:c.top,left:c.left,width:b.width,height:b.height,opacity:0.25}).addEvent("cancel",a).chain(a); -}else{this.clone.destroy();}this.reset();},reset:function(){this.idle=true;this.fireEvent("complete",this.element);},serialize:function(){var c=Array.link(arguments,{modifier:Type.isFunction,index:function(d){return d!=null; -}});var b=this.lists.map(function(d){return d.getChildren().map(c.modifier||function(e){return e.get("id");},this);},this);var a=c.index;if(this.lists.length==1){a=0; -}return(a||a===0)&&a>=0&&a=3){d="rgb";c=Array.slice(arguments,0,3);}else{if(typeof c=="string"){if(c.match(/rgb/)){c=c.rgbToHex().hexToRgb(true); -}else{if(c.match(/hsb/)){c=c.hsbToRgb();}else{c=c.hexToRgb(true);}}}}d=d||"rgb";switch(d){case"hsb":var b=c;c=c.hsbToRgb();c.hsb=b;break;case"hex":c=c.hexToRgb(true); -break;}c.rgb=c.slice(0,3);c.hsb=c.hsb||c.rgbToHsb();c.hex=c.rgbToHex();return Object.append(c,this);});a.implement({mix:function(){var b=Array.slice(arguments); -var d=(typeOf(b.getLast())=="number")?b.pop():50;var c=this.slice();b.each(function(e){e=new a(e);for(var f=0;f<3;f++){c[f]=Math.round((c[f]/100*(100-d))+(e[f]/100*d)); -}});return new a(c,"rgb");},invert:function(){return new a(this.map(function(b){return 255-b;}));},setHue:function(b){return new a([b,this.hsb[1],this.hsb[2]],"hsb"); -},setSaturation:function(b){return new a([this.hsb[0],b,this.hsb[2]],"hsb");},setBrightness:function(b){return new a([this.hsb[0],this.hsb[1],b],"hsb"); -}});this.$RGB=function(e,d,c){return new a([e,d,c],"rgb");};this.$HSB=function(e,d,c){return new a([e,d,c],"hsb");};this.$HEX=function(b){return new a(b,"hex"); -};Array.implement({rgbToHsb:function(){var c=this[0],d=this[1],k=this[2],h=0;var j=Math.max(c,d,k),f=Math.min(c,d,k);var l=j-f;var i=j/255,g=(j!=0)?l/j:0; -if(g!=0){var e=(j-c)/l;var b=(j-d)/l;var m=(j-k)/l;if(c==j){h=m-b;}else{if(d==j){h=2+e-m;}else{h=4+b-e;}}h/=6;if(h<0){h++;}}return[Math.round(h*360),Math.round(g*100),Math.round(i*100)]; -},hsbToRgb:function(){var d=Math.round(this[2]/100*255);if(this[1]==0){return[d,d,d];}else{var b=this[0]%360;var g=b%60;var h=Math.round((this[2]*(100-this[1]))/10000*255); -var e=Math.round((this[2]*(6000-this[1]*g))/600000*255);var c=Math.round((this[2]*(6000-this[1]*(60-g)))/600000*255);switch(Math.floor(b/60)){case 0:return[d,c,h]; -case 1:return[e,d,h];case 2:return[h,d,c];case 3:return[h,e,d];case 4:return[c,h,d];case 5:return[d,h,e];}}return false;}});String.implement({rgbToHsb:function(){var b=this.match(/\d{1,3}/g); -return(b)?b.rgbToHsb():null;},hsbToRgb:function(){var b=this.match(/\d{1,3}/g);return(b)?b.hsbToRgb():null;}});})();Hash.Cookie=new Class({Extends:Cookie,options:{autoSave:true},initialize:function(b,a){this.parent(b,a); -this.load();},save:function(){var a=JSON.encode(this.hash);if(!a||a.length>4096){return false;}if(a=="{}"){this.dispose();}else{this.write(a);}return true; -},load:function(){this.hash=new Hash(JSON.decode(this.read(),true));return this;}});Hash.each(Hash.prototype,function(b,a){if(typeof b=="function"){Hash.Cookie.implement(a,function(){var c=b.apply(this.hash,arguments); -if(this.options.autoSave){this.save();}return c;});}});var HtmlTable=new Class({Implements:[Options,Events,Class.Occlude],options:{properties:{cellpadding:0,cellspacing:0,border:0},rows:[],headers:[],footers:[]},property:"HtmlTable",initialize:function(){var a=Array.link(arguments,{options:Type.isObject,table:Type.isElement,id:Type.isString}); -this.setOptions(a.options);if(!a.table&&a.id){a.table=document.id(a.id);}this.element=a.table||new Element("table",this.options.properties);if(this.occlude()){return this.occluded; -}this.build();},build:function(){this.element.store("HtmlTable",this);this.body=document.id(this.element.tBodies[0])||new Element("tbody").inject(this.element); -$$(this.body.rows);if(this.options.headers.length){this.setHeaders(this.options.headers);}else{this.thead=document.id(this.element.tHead);}if(this.thead){this.head=this.getHead(); -}if(this.options.footers.length){this.setFooters(this.options.footers);}this.tfoot=document.id(this.element.tFoot);if(this.tfoot){this.foot=document.id(this.tfoot.rows[0]); -}this.options.rows.each(function(a){this.push(a);},this);},toElement:function(){return this.element;},empty:function(){this.body.empty();return this;},set:function(e,a){var d=(e=="headers")?"tHead":"tFoot",b=d.toLowerCase(); -this[b]=(document.id(this.element[d])||new Element(b).inject(this.element,"top")).empty();var c=this.push(a,{},this[b],e=="headers"?"th":"td");if(e=="headers"){this.head=this.getHead(); -}else{this.foot=this.getHead();}return c;},getHead:function(){var a=this.thead.rows;return a.length>1?$$(a):a.length?document.id(a[0]):false;},setHeaders:function(a){this.set("headers",a); -return this;},setFooters:function(a){this.set("footers",a);return this;},update:function(d,e,a){var b=d.getChildren(a||"td"),c=b.length-1;e.each(function(i,f){var j=b[f]||new Element(a||"td").inject(d),h=(i?i.content:"")||i,g=typeOf(h); -if(i&&i.properties){j.set(i.properties);}if(/(element(s?)|array|collection)/.test(g)){j.empty().adopt(h);}else{j.set("html",h);}if(f>c){b.push(j);}else{b[f]=j; -}});return{tr:d,tds:b};},push:function(e,c,d,a,b){if(typeOf(e)=="element"&&e.get("tag")=="tr"){e.inject(d||this.body,b);return{tr:e,tds:e.getChildren("td")}; -}return this.update(new Element("tr",c).inject(d||this.body,b),e,a);},pushMany:function(d,c,e,a,b){return d.map(function(f){return this.push(f,c,e,a,b); -},this);}});["adopt","inject","wraps","grab","replaces","dispose"].each(function(a){HtmlTable.implement(a,function(){this.element[a].apply(this.element,arguments); -return this;});});(function(){Events.Pseudos=function(h,e,f){var d="_monitorEvents:";var c=function(i){return{store:i.store?function(j,k){i.store(d+j,k); -}:function(j,k){(i._monitorEvents||(i._monitorEvents={}))[j]=k;},retrieve:i.retrieve?function(j,k){return i.retrieve(d+j,k);}:function(j,k){if(!i._monitorEvents){return k; -}return i._monitorEvents[j]||k;}};};var g=function(k){if(k.indexOf(":")==-1||!h){return null;}var j=Slick.parse(k).expressions[0][0],p=j.pseudos,i=p.length,o=[]; -while(i--){var n=p[i].key,m=h[n];if(m!=null){o.push({event:j.tag,value:p[i].value,pseudo:n,original:k,listener:m});}}return o.length?o:null;};return{addEvent:function(m,p,j){var n=g(m); -if(!n){return e.call(this,m,p,j);}var k=c(this),r=k.retrieve(m,[]),i=n[0].event,l=Array.slice(arguments,2),o=p,q=this;n.each(function(s){var t=s.listener,u=o; -if(t==false){i+=":"+s.pseudo+"("+s.value+")";}else{o=function(){t.call(q,s,u,arguments,o);};}});r.include({type:i,event:p,monitor:o});k.store(m,r);if(m!=i){e.apply(this,[m,p].concat(l)); -}return e.apply(this,[i,o].concat(l));},removeEvent:function(m,l){var k=g(m);if(!k){return f.call(this,m,l);}var n=c(this),j=n.retrieve(m);if(!j){return this; -}var i=Array.slice(arguments,2);f.apply(this,[m,l].concat(i));j.each(function(o,p){if(!l||o.event==l){f.apply(this,[o.type,o.monitor].concat(i));}delete j[p]; -},this);n.store(m,j);return this;}};};var b={once:function(e,f,d,c){f.apply(this,d);this.removeEvent(e.event,c).removeEvent(e.original,f);},throttle:function(d,e,c){if(!e._throttled){e.apply(this,c); -e._throttled=setTimeout(function(){e._throttled=false;},d.value||250);}},pause:function(d,e,c){clearTimeout(e._pause);e._pause=e.delay(d.value||250,this,c); -}};Events.definePseudo=function(c,d){b[c]=d;return this;};Events.lookupPseudo=function(c){return b[c];};var a=Events.prototype;Events.implement(Events.Pseudos(b,a.addEvent,a.removeEvent)); -["Request","Fx"].each(function(c){if(this[c]){this[c].implement(Events.prototype);}});})();(function(){var d={relay:false},c=["once","throttle","pause"],b=c.length; -while(b--){d[c[b]]=Events.lookupPseudo(c[b]);}DOMEvent.definePseudo=function(e,f){d[e]=f;return this;};var a=Element.prototype;[Element,Window,Document].invoke("implement",Events.Pseudos(d,a.addEvent,a.removeEvent)); -})();(function(){var a="$moo:keys-pressed",b="$moo:keys-keyup";DOMEvent.definePseudo("keys",function(d,e,c){var g=c[0],f=[],h=this.retrieve(a,[]);f.append(d.value.replace("++",function(){f.push("+"); -return"";}).split("+"));h.include(g.key);if(f.every(function(j){return h.contains(j);})){e.apply(this,c);}this.store(a,h);if(!this.retrieve(b)){var i=function(j){(function(){h=this.retrieve(a,[]).erase(j.key); -this.store(a,h);}).delay(0,this);};this.store(b,i).addEvent("keyup",i);}});DOMEvent.defineKeys({"16":"shift","17":"control","18":"alt","20":"capslock","33":"pageup","34":"pagedown","35":"end","36":"home","144":"numlock","145":"scrolllock","186":";","187":"=","188":",","190":".","191":"/","192":"`","219":"[","220":"\\","221":"]","222":"'","107":"+"}).defineKey(Browser.firefox?109:189,"-"); -})();(function(){var a=this.Keyboard=new Class({Extends:Events,Implements:[Options],options:{defaultEventType:"keydown",active:false,manager:null,events:{},nonParsedEvents:["activate","deactivate","onactivate","ondeactivate","changed","onchanged"]},initialize:function(f){if(f&&f.manager){this._manager=f.manager; -delete f.manager;}this.setOptions(f);this._setup();},addEvent:function(h,g,f){return this.parent(a.parse(h,this.options.defaultEventType,this.options.nonParsedEvents),g,f); -},removeEvent:function(g,f){return this.parent(a.parse(g,this.options.defaultEventType,this.options.nonParsedEvents),f);},toggleActive:function(){return this[this.isActive()?"deactivate":"activate"](); -},activate:function(f){if(f){if(f.isActive()){return this;}if(this._activeKB&&f!=this._activeKB){this.previous=this._activeKB;this.previous.fireEvent("deactivate"); -}this._activeKB=f.fireEvent("activate");a.manager.fireEvent("changed");}else{if(this._manager){this._manager.activate(this);}}return this;},isActive:function(){return this._manager?(this._manager._activeKB==this):(a.manager==this); -},deactivate:function(f){if(f){if(f===this._activeKB){this._activeKB=null;f.fireEvent("deactivate");a.manager.fireEvent("changed");}}else{if(this._manager){this._manager.deactivate(this); -}}return this;},relinquish:function(){if(this.isActive()&&this._manager&&this._manager.previous){this._manager.activate(this._manager.previous);}else{this.deactivate(); -}return this;},manage:function(f){if(f._manager){f._manager.drop(f);}this._instances.push(f);f._manager=this;if(!this._activeKB){this.activate(f);}return this; -},drop:function(f){f.relinquish();this._instances.erase(f);if(this._activeKB==f){if(this.previous&&this._instances.contains(this.previous)){this.activate(this.previous); -}else{this._activeKB=this._instances[0];}}return this;},trace:function(){a.trace(this);},each:function(f){a.each(this,f);},_instances:[],_disable:function(f){if(this._activeKB==f){this._activeKB=null; -}},_setup:function(){this.addEvents(this.options.events);if(a.manager&&!this._manager){a.manager.manage(this);}if(this.options.active){this.activate(); -}else{this.relinquish();}},_handle:function(h,g){if(h.preventKeyboardPropagation){return;}var f=!!this._manager;if(f&&this._activeKB){this._activeKB._handle(h,g); -if(h.preventKeyboardPropagation){return;}}this.fireEvent(g,h);if(!f&&this._activeKB){this._activeKB._handle(h,g);}}});var b={};var c=["shift","control","alt","meta"]; -var e=/^(?:shift|control|ctrl|alt|meta)$/;a.parse=function(h,g,k){if(k&&k.contains(h.toLowerCase())){return h;}h=h.toLowerCase().replace(/^(keyup|keydown):/,function(m,l){g=l; -return"";});if(!b[h]){var f,j={};h.split("+").each(function(l){if(e.test(l)){j[l]=true;}else{f=l;}});j.control=j.control||j.ctrl;var i=[];c.each(function(l){if(j[l]){i.push(l); -}});if(f){i.push(f);}b[h]=i.join("+");}return g+":keys("+b[h]+")";};a.each=function(f,g){var h=f||a.manager;while(h){g.run(h);h=h._activeKB;}};a.stop=function(f){f.preventKeyboardPropagation=true; -};a.manager=new a({active:true});a.trace=function(f){f=f||a.manager;var g=window.console&&console.log;if(g){console.log("the following items have focus: "); -}a.each(f,function(h){if(g){console.log(document.id(h.widget)||h.wiget||h);}});};var d=function(g){var f=[];c.each(function(h){if(g[h]){f.push(h);}});if(!e.test(g.key)){f.push(g.key); -}a.manager._handle(g,g.type+":keys("+f.join("+")+")");};document.addEvents({keyup:d,keydown:d});})(); \ No newline at end of file diff -Nru qbittorrent-4.1.3/src/webui/www/private/scripts/lib/parametrics.js qbittorrent-3.3.15/src/webui/www/private/scripts/lib/parametrics.js --- qbittorrent-4.1.3/src/webui/www/private/scripts/lib/parametrics.js 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/scripts/lib/parametrics.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,224 +0,0 @@ -/* - -Script: Parametrics.js - Initializes the GUI property sliders. - -Copyright: - Copyright (c) 2007-2008 Greg Houston, . - -License: - MIT-style license. - -Requires: - Core.js, Window.js - -*/ -MochaUI.extend({ - addUpLimitSlider: function(hashes) { - if ($('uplimitSliderarea')) { - var windowOptions = MochaUI.Windows.windowOptions; - var sliderFirst = true; - // Get global upload limit - var maximum = 500; - var req = new Request({ - url: 'api/v2/transfer/uploadLimit', - method: 'post', - data: {}, - onSuccess: function(data) { - if (data) { - var tmp = data.toInt(); - if (tmp > 0) { - maximum = tmp / 1024.0; - } - else { - if (hashes[0] == "global") - maximum = 10000; - else - maximum = 1000; - } - } - // Get torrents upload limit - // And create slider - if (hashes[0] == 'global') { - var up_limit = maximum; - if (up_limit < 0) up_limit = 0; - maximum = 10000; - var mochaSlide = new Slider($('uplimitSliderarea'), $('uplimitSliderknob'), { - steps: maximum, - offset: 0, - initialStep: up_limit.round(), - onChange: function(pos) { - if (pos > 0) { - $('uplimitUpdatevalue').value = pos; - $('upLimitUnit').style.visibility = "visible"; - } - else { - $('uplimitUpdatevalue').value = '∞'; - $('upLimitUnit').style.visibility = "hidden"; - } - }.bind(this) - }); - // Set default value - if (up_limit === 0) { - $('uplimitUpdatevalue').value = '∞'; - $('upLimitUnit').style.visibility = "hidden"; - } - else { - $('uplimitUpdatevalue').value = up_limit.round(); - $('upLimitUnit').style.visibility = "visible"; - } - } - else { - var req = new Request.JSON({ - url: 'api/v2/torrents/uploadLimit', - noCache : true, - method: 'post', - data: { - hashes: hashes.join('|') - }, - onSuccess: function(data) { - if (data) { - var up_limit = data[hashes[0]]; - for(var key in data) - if (up_limit != data[key]) { - up_limit = 0; - break; - } - if (up_limit < 0) up_limit = 0; - var mochaSlide = new Slider($('uplimitSliderarea'), $('uplimitSliderknob'), { - steps: maximum, - offset: 0, - initialStep: (up_limit / 1024.0).round(), - onChange: function(pos) { - if (pos > 0) { - $('uplimitUpdatevalue').value = pos; - $('upLimitUnit').style.visibility = "visible"; - } - else { - $('uplimitUpdatevalue').value = '∞'; - $('upLimitUnit').style.visibility = "hidden"; - } - }.bind(this) - }); - // Set default value - if (up_limit === 0) { - $('uplimitUpdatevalue').value = '∞'; - $('upLimitUnit').style.visibility = "hidden"; - } - else { - $('uplimitUpdatevalue').value = (up_limit / 1024.0).round(); - $('upLimitUnit').style.visibility = "visible"; - } - } - } - }).send(); - } - } - }).send(); - } - }, - - addDlLimitSlider: function(hashes) { - if ($('dllimitSliderarea')) { - var windowOptions = MochaUI.Windows.windowOptions; - var sliderFirst = true; - // Get global upload limit - var maximum = 500; - var req = new Request({ - url: 'api/v2/transfer/downloadLimit', - method: 'post', - data: {}, - onSuccess: function(data) { - if (data) { - var tmp = data.toInt(); - if (tmp > 0) { - maximum = tmp / 1024.0; - } - else { - if (hashes[0] == "global") - maximum = 10000; - else - maximum = 1000; - } - } - // Get torrents download limit - // And create slider - if (hashes[0] == 'global') { - var dl_limit = maximum; - if (dl_limit < 0) dl_limit = 0; - maximum = 10000; - var mochaSlide = new Slider($('dllimitSliderarea'), $('dllimitSliderknob'), { - steps: maximum, - offset: 0, - initialStep: dl_limit.round(), - onChange: function(pos) { - if (pos > 0) { - $('dllimitUpdatevalue').value = pos; - $('dlLimitUnit').style.visibility = "visible"; - } - else { - $('dllimitUpdatevalue').value = '∞'; - $('dlLimitUnit').style.visibility = "hidden"; - } - }.bind(this) - }); - // Set default value - if (dl_limit === 0) { - $('dllimitUpdatevalue').value = '∞'; - $('dlLimitUnit').style.visibility = "hidden"; - } - else { - $('dllimitUpdatevalue').value = dl_limit.round(); - $('dlLimitUnit').style.visibility = "visible"; - } - } - else { - var req = new Request.JSON({ - url: 'api/v2/torrents/downloadLimit', - noCache : true, - method: 'post', - data: { - hashes: hashes.join('|') - }, - onSuccess: function(data) { - if (data) { - var dl_limit = data[hashes[0]]; - for(var key in data) - if (dl_limit != data[key]) { - dl_limit = 0; - break; - } - if (dl_limit < 0) dl_limit = 0; - var mochaSlide = new Slider($('dllimitSliderarea'), $('dllimitSliderknob'), { - steps: maximum, - offset: 0, - initialStep: (dl_limit / 1024.0).round(), - onChange: function(pos) { - if (pos > 0) { - $('dllimitUpdatevalue').value = pos; - $('dlLimitUnit').style.visibility = "visible"; - } - else { - $('dllimitUpdatevalue').value = '∞'; - $('dlLimitUnit').style.visibility = "hidden"; - } - }.bind(this) - }); - // Set default value - if (dl_limit === 0) { - $('dllimitUpdatevalue').value = '∞'; - $('dlLimitUnit').style.visibility = "hidden"; - } - else { - $('dllimitUpdatevalue').value = (dl_limit / 1024.0).round(); - $('dlLimitUnit').style.visibility = "visible"; - } - } - } - }).send(); - } - } - }).send(); - } - } -}); diff -Nru qbittorrent-4.1.3/src/webui/www/private/scripts/misc.js qbittorrent-3.3.15/src/webui/www/private/scripts/misc.js --- qbittorrent-4.1.3/src/webui/www/private/scripts/misc.js 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/scripts/misc.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,133 +0,0 @@ -/* - * JS counterpart of the function in src/misc.cpp - */ -function friendlyUnit(value, isSpeed) { - units = [ - "QBT_TR(B)QBT_TR[CONTEXT=misc]", - "QBT_TR(KiB)QBT_TR[CONTEXT=misc]", - "QBT_TR(MiB)QBT_TR[CONTEXT=misc]", - "QBT_TR(GiB)QBT_TR[CONTEXT=misc]", - "QBT_TR(TiB)QBT_TR[CONTEXT=misc]", - "QBT_TR(PiB)QBT_TR[CONTEXT=misc]", - "QBT_TR(EiB)QBT_TR[CONTEXT=misc]" - ]; - - if (value < 0) - return "QBT_TR(Unknown)QBT_TR[CONTEXT=misc]"; - - var i = 0; - while (value >= 1024.0 && i < 6) { - value /= 1024.0; - ++i; - } - - function friendlyUnitPrecision(sizeUnit) { - if (sizeUnit <= 2) return 1; // KiB, MiB - else if (sizeUnit === 3) return 2; // GiB - else return 3; // TiB, PiB, EiB - } - - var ret; - if (i === 0) - ret = value + " " + units[i]; - else { - var precision = friendlyUnitPrecision(i); - var offset = Math.pow(10, precision); - // Don't round up - ret = (Math.floor(offset * value) / offset).toFixed(precision) + " " + units[i]; - } - - if (isSpeed) - ret += "QBT_TR(/s)QBT_TR[CONTEXT=misc]"; - return ret; -} - -/* - * JS counterpart of the function in src/misc.cpp - */ -function friendlyDuration(seconds) { - var MAX_ETA = 8640000; - if (seconds < 0 || seconds >= MAX_ETA) - return "∞"; - if (seconds === 0) - return "0"; - if (seconds < 60) - return "QBT_TR(< 1m)QBT_TR[CONTEXT=misc]"; - var minutes = seconds / 60; - if (minutes < 60) - return "QBT_TR(%1m)QBT_TR[CONTEXT=misc]".replace("%1", parseInt(minutes)); - var hours = minutes / 60; - minutes = minutes % 60; - if (hours < 24) - return "QBT_TR(%1h %2m)QBT_TR[CONTEXT=misc]".replace("%1", parseInt(hours)).replace("%2", parseInt(minutes)); - var days = hours / 24; - hours = hours % 24; - if (days < 100) - return "QBT_TR(%1d %2h)QBT_TR[CONTEXT=misc]".replace("%1", parseInt(days)).replace("%2", parseInt(hours)); - return "∞"; -} - -function friendlyPercentage(value) { - var percentage = (value * 100).round(1); - if (isNaN(percentage) || (percentage < 0)) - percentage = 0; - if (percentage > 100) - percentage = 100; - return percentage.toFixed(1) + "%"; -} - -function friendlyFloat(value, precision) { - return parseFloat(value).toFixed(precision); -} - -/* - * From: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString - */ -if (!Date.prototype.toISOString) { - (function() { - - function pad(number) { - if (number < 10) { - return '0' + number; - } - return number; - } - - Date.prototype.toISOString = function() { - return this.getUTCFullYear() - + '-' + pad(this.getUTCMonth() + 1) - + '-' + pad(this.getUTCDate()) - + 'T' + pad(this.getUTCHours()) - + ':' + pad(this.getUTCMinutes()) - + ':' + pad(this.getUTCSeconds()) - + '.' + (this.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) - + 'Z'; - }; - - }()); -} - -/* - * JS counterpart of the function in src/misc.cpp - */ -function parseHtmlLinks(text) { - var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig; - return text.replace(exp, "$1"); -} - -function escapeHtml(str) { - var div = document.createElement('div'); - div.appendChild(document.createTextNode(str)); - return div.innerHTML; -} - -function safeTrim(value) { - try { - return value.trim(); - } - catch (e) { - if (e instanceof TypeError) - return ""; - throw e; - } -} diff -Nru qbittorrent-4.1.3/src/webui/www/private/scripts/mocha-init.js qbittorrent-3.3.15/src/webui/www/private/scripts/mocha-init.js --- qbittorrent-4.1.3/src/webui/www/private/scripts/mocha-init.js 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/scripts/mocha-init.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,741 +0,0 @@ -/* ----------------------------------------------------------------- - - ATTACH MOCHA LINK EVENTS - Notes: Here is where you define your windows and the events that open them. - If you are not using links to run Mocha methods you can remove this function. - - If you need to add link events to links within windows you are creating, do - it in the onContentLoaded function of the new window. - - ----------------------------------------------------------------- */ -/* Define localStorage object for older browsers */ -if (typeof localStorage == 'undefined') { - window['localStorage'] = { - getItem: function(name) { - return Cookie.read(name); - }, - setItem: function(name, value) { - Cookie.write(name, value, { - duration: 365 * 10 - }); - } - }; -} - -function getLocalStorageItem(name, defaultVal) { - val = localStorage.getItem(name); - if (val === null || val === undefined) - val = defaultVal; - return val; -} - -var deleteFN = function() {}; -var startFN = function() {}; -var pauseFN = function() {}; - -initializeWindows = function() { - - saveWindowSize = function(windowId) { - var size = $(windowId).getSize(); - localStorage.setItem('window_' + windowId + '_width', size.x); - localStorage.setItem('window_' + windowId + '_height', size.y); - }; - - loadWindowWidth = function(windowId, defaultValue) { - return getLocalStorageItem('window_' + windowId + '_width', defaultValue); - }; - - loadWindowHeight = function(windowId, defaultValue) { - return getLocalStorageItem('window_' + windowId + '_height', defaultValue); - }; - - function addClickEvent(el, fn) { - ['Link', 'Button'].each(function(item) { - if ($(el + item)) { - $(el + item).addEvent('click', fn); - } - }); - } - - addClickEvent('download', function(e) { - new Event(e).stop(); - var id = 'downloadPage'; - new MochaUI.Window({ - id: id, - title: "QBT_TR(Download from URLs)QBT_TR[CONTEXT=downloadFromURL]", - loadMethod: 'iframe', - contentURL: 'download.html', - addClass: 'windowFrame', // fixes iframe scrolling on iOS Safari - scrollbars: true, - maximizable: false, - closable: true, - paddingVertical: 0, - paddingHorizontal: 0, - width: loadWindowWidth(id, 500), - height: loadWindowHeight(id, 420), - onResize: function() { - saveWindowSize(id); - } - }); - updateMainData(); - }); - - addClickEvent('preferences', function(e) { - new Event(e).stop(); - var id = 'preferencesPage'; - new MochaUI.Window({ - id: id, - title: "QBT_TR(Options)QBT_TR[CONTEXT=OptionsDialog]", - loadMethod: 'xhr', - toolbar: true, - contentURL: 'preferences_content.html', - require: { - css: ['css/Tabs.css'] - }, - toolbarURL: 'preferences.html', - maximizable: false, - closable: true, - paddingVertical: 0, - paddingHorizontal: 0, - width: loadWindowWidth(id, 700), - height: loadWindowHeight(id, 500), - onResize: function() { - saveWindowSize(id); - } - }); - }); - - addClickEvent('upload', function(e) { - new Event(e).stop(); - var id = 'uploadPage'; - new MochaUI.Window({ - id: id, - title: "QBT_TR(Upload local torrent)QBT_TR[CONTEXT=HttpServer]", - loadMethod: 'iframe', - contentURL: 'upload.html', - addClass: 'windowFrame', // fixes iframe scrolling on iOS Safari - scrollbars: true, - maximizable: false, - paddingVertical: 0, - paddingHorizontal: 0, - width: loadWindowWidth(id, 500), - height: loadWindowHeight(id, 260), - onResize: function() { - saveWindowSize(id); - } - }); - updateMainData(); - }); - - globalUploadLimitFN = function() { - new MochaUI.Window({ - id: 'uploadLimitPage', - title: "QBT_TR(Global Upload Speed Limit)QBT_TR[CONTEXT=MainWindow]", - loadMethod: 'iframe', - contentURL: 'uploadlimit.html?hashes=global', - scrollbars: false, - resizable: false, - maximizable: false, - paddingVertical: 0, - paddingHorizontal: 0, - width: 424, - height: 80 - }); - }; - - uploadLimitFN = function() { - var hashes = torrentsTable.selectedRowsIds(); - if (hashes.length) { - new MochaUI.Window({ - id: 'uploadLimitPage', - title: "QBT_TR(Torrent Upload Speed Limiting)QBT_TR[CONTEXT=TransferListWidget]", - loadMethod: 'iframe', - contentURL: 'uploadlimit.html?hashes=' + hashes.join("|"), - scrollbars: false, - resizable: false, - maximizable: false, - paddingVertical: 0, - paddingHorizontal: 0, - width: 424, - height: 80 - }); - } - }; - - shareRatioFN = function() { - var hashes = torrentsTable.selectedRowsIds(); - if (hashes.length) { - var shareRatio = null; - var torrentsHaveSameShareRatio = true; - - // check if all selected torrents have same share ratio - for (var i = 0; i < hashes.length; ++i) { - var hash = hashes[i]; - var row = torrentsTable.rows[hash].full_data; - var origValues = row.ratio_limit + "|" + row.seeding_time_limit + "|" + row.max_ratio + "|" + row.max_seeding_time; - - // initialize value - if (shareRatio === null) - shareRatio = origValues; - - if (origValues !== shareRatio) { - torrentsHaveSameShareRatio = false; - break; - } - } - - // if all torrents have same share ratio, display that share ratio. else use the default - var orig = torrentsHaveSameShareRatio ? shareRatio : ""; - new MochaUI.Window({ - id: 'shareRatioPage', - title: "QBT_TR(Torrent Upload/Download Ratio Limiting)QBT_TR[CONTEXT=UpDownRatioDialog]", - loadMethod: 'iframe', - contentURL: 'shareratio.html?hashes=' + hashes.join("|") + '&orig=' + orig, - scrollbars: false, - maximizable: false, - paddingVertical: 0, - paddingHorizontal: 0, - width: 424, - height: 175 - }); - } - }; - - toggleSequentialDownloadFN = function() { - var hashes = torrentsTable.selectedRowsIds(); - if (hashes.length) { - new Request({ - url: 'api/v2/torrents/toggleSequentialDownload', - method: 'post', - data: { - hashes: hashes.join("|") - } - }).send(); - updateMainData(); - } - }; - - toggleFirstLastPiecePrioFN = function() { - var hashes = torrentsTable.selectedRowsIds(); - if (hashes.length) { - new Request({ - url: 'api/v2/torrents/toggleFirstLastPiecePrio', - method: 'post', - data: { - hashes: hashes.join("|") - } - }).send(); - updateMainData(); - } - }; - - setSuperSeedingFN = function(val) { - var hashes = torrentsTable.selectedRowsIds(); - if (hashes.length) { - new Request({ - url: 'api/v2/torrents/setSuperSeeding', - method: 'post', - data: { - value: val, - hashes: hashes.join("|") - } - }).send(); - updateMainData(); - } - }; - - setForceStartFN = function() { - var hashes = torrentsTable.selectedRowsIds(); - if (hashes.length) { - new Request({ - url: 'api/v2/torrents/setForceStart', - method: 'post', - data: { - value: 'true', - hashes: hashes.join("|") - } - }).send(); - updateMainData(); - } - }; - - globalDownloadLimitFN = function() { - new MochaUI.Window({ - id: 'downloadLimitPage', - title: "QBT_TR(Global Download Speed Limit)QBT_TR[CONTEXT=MainWindow]", - loadMethod: 'iframe', - contentURL: 'downloadlimit.html?hashes=global', - scrollbars: false, - resizable: false, - maximizable: false, - paddingVertical: 0, - paddingHorizontal: 0, - width: 424, - height: 80 - }); - }; - - StatisticsLinkFN = function() { - var id = 'statisticspage'; - new MochaUI.Window({ - id: id, - title: 'QBT_TR(Statistics)QBT_TR[CONTEXT=StatsDialog]', - loadMethod: 'xhr', - contentURL: 'statistics.html', - maximizable: false, - padding: 10, - width: loadWindowWidth(id, 275), - height: loadWindowHeight(id, 370), - onResize: function() { - saveWindowSize(id); - } - }); - }; - - downloadLimitFN = function() { - var hashes = torrentsTable.selectedRowsIds(); - if (hashes.length) { - new MochaUI.Window({ - id: 'downloadLimitPage', - title: "QBT_TR(Torrent Download Speed Limiting)QBT_TR[CONTEXT=TransferListWidget]", - loadMethod: 'iframe', - contentURL: 'downloadlimit.html?hashes=' + hashes.join("|"), - scrollbars: false, - resizable: false, - maximizable: false, - paddingVertical: 0, - paddingHorizontal: 0, - width: 424, - height: 80 - }); - } - }; - - deleteFN = function() { - var hashes = torrentsTable.selectedRowsIds(); - if (hashes.length) { - new MochaUI.Window({ - id: 'confirmDeletionPage', - title: "QBT_TR(Deletion confirmation)QBT_TR[CONTEXT=confirmDeletionDlg]", - loadMethod: 'iframe', - contentURL: 'confirmdeletion.html?hashes=' + hashes.join("|"), - scrollbars: false, - resizable: false, - maximizable: false, - padding: 10, - width: 424, - height: 140 - }); - updateMainData(); - } - }; - - addClickEvent('delete', function(e) { - new Event(e).stop(); - deleteFN(); - }); - - pauseFN = function() { - var hashes = torrentsTable.selectedRowsIds(); - if (hashes.length) { - new Request({ - url: 'api/v2/torrents/pause', - method: 'post', - data: { - hashes: hashes.join("|") - } - }).send(); - updateMainData(); - } - }; - - startFN = function() { - var hashes = torrentsTable.selectedRowsIds(); - if (hashes.length) { - new Request({ - url: 'api/v2/torrents/resume', - method: 'post', - data: { - hashes: hashes.join("|") - } - }).send(); - updateMainData(); - } - }; - - autoTorrentManagementFN = function() { - var hashes = torrentsTable.selectedRowsIds(); - if (hashes.length) { - var enable = false; - hashes.each(function(hash, index) { - var row = torrentsTable.rows[hash]; - if (!row.full_data.auto_tmm) - enable = true; - }); - new Request({ - url: 'api/v2/torrents/setAutoManagement', - method: 'post', - data: { - hashes: hashes.join("|"), - enable: enable - } - }).send(); - updateMainData(); - } - }; - - recheckFN = function() { - var hashes = torrentsTable.selectedRowsIds(); - if (hashes.length) { - new Request({ - url: 'api/v2/torrents/recheck', - method: 'post', - data: { - hashes: hashes.join("|"), - } - }).send(); - updateMainData(); - } - }; - - reannounceFN = function() { - var hashes = torrentsTable.selectedRowsIds(); - if (hashes.length) { - new Request({ - url: 'api/v2/torrents/reannounce', - method: 'post', - data: { - hashes: hashes.join("|"), - } - }).send(); - updateMainData(); - } - }; - - setLocationFN = function() { - var hashes = torrentsTable.selectedRowsIds(); - if (hashes.length) { - var hash = hashes[0]; - var row = torrentsTable.rows[hash]; - var path = encodeURIComponent(row.full_data.save_path); - new MochaUI.Window({ - id: 'setLocationPage', - title: "QBT_TR(Set location)QBT_TR[CONTEXT=TransferListWidget]", - loadMethod: 'iframe', - contentURL: 'setlocation.html?hashes=' + hashes.join('|') + '&path=' + path, - scrollbars: false, - resizable: false, - maximizable: false, - paddingVertical: 0, - paddingHorizontal: 0, - width: 400, - height: 130 - }); - } - }; - - renameFN = function() { - var hashes = torrentsTable.selectedRowsIds(); - if (hashes.length == 1) { - var hash = hashes[0]; - var row = torrentsTable.rows[hash]; - if (row) { - new MochaUI.Window({ - id: 'renamePage', - title: "QBT_TR(Rename)QBT_TR[CONTEXT=TransferListWidget]", - loadMethod: 'iframe', - contentURL: 'rename.html?hash=' + hashes[0] + '&name=' + row.full_data.name, - scrollbars: false, - resizable: false, - maximizable: false, - paddingVertical: 0, - paddingHorizontal: 0, - width: 250, - height: 100 - }); - } - } - }; - - torrentNewCategoryFN = function() { - var action = "set"; - var hashes = torrentsTable.selectedRowsIds(); - if (hashes.length) { - new MochaUI.Window({ - id: 'newCategoryPage', - title: "QBT_TR(New Category)QBT_TR[CONTEXT=TransferListWidget]", - loadMethod: 'iframe', - contentURL: 'newcategory.html?action=' + action + '&hashes=' + hashes.join('|'), - scrollbars: false, - resizable: false, - maximizable: false, - paddingVertical: 0, - paddingHorizontal: 0, - width: 250, - height: 150 - }); - } - }; - - torrentSetCategoryFN = function(categoryHash) { - var categoryName = ''; - if (categoryHash != 0) - categoryName = category_list[categoryHash].name; - var hashes = torrentsTable.selectedRowsIds(); - if (hashes.length) { - new Request({ - url: 'api/v2/torrents/setCategory', - method: 'post', - data: { - hashes: hashes.join("|"), - category: categoryName - } - }).send(); - } - }; - - createCategoryFN = function() { - var action = "create"; - new MochaUI.Window({ - id: 'newCategoryPage', - title: "QBT_TR(New Category)QBT_TR[CONTEXT=CategoryFilterWidget]", - loadMethod: 'iframe', - contentURL: 'newcategory.html?action=' + action, - scrollbars: false, - resizable: false, - maximizable: false, - paddingVertical: 0, - paddingHorizontal: 0, - width: 250, - height: 150 - }); - updateMainData(); - }; - - editCategoryFN = function(categoryHash) { - var action = "edit"; - var categoryName = category_list[categoryHash].name; - var savePath = category_list[categoryHash].savePath; - new MochaUI.Window({ - id: 'editCategoryPage', - title: "QBT_TR(Edit Category)QBT_TR[CONTEXT=TransferListWidget]", - loadMethod: 'iframe', - contentURL: 'newcategory.html?action=' + action + '&categoryName=' + categoryName + '&savePath=' + savePath, - scrollbars: false, - resizable: false, - maximizable: false, - paddingVertical: 0, - paddingHorizontal: 0, - width: 250, - height: 150 - }); - updateMainData(); - }; - - removeCategoryFN = function(categoryHash) { - var categoryName = category_list[categoryHash].name; - new Request({ - url: 'api/v2/torrents/removeCategories', - method: 'post', - data: { - categories: categoryName - } - }).send(); - setCategoryFilter(CATEGORIES_ALL); - }; - - deleteUnusedCategoriesFN = function() { - var categories = []; - for (var hash in category_list) { - if (torrentsTable.getFilteredTorrentsNumber('all', hash) === 0) - categories.push(category_list[hash].name); - } - new Request({ - url: 'api/v2/torrents/removeCategories', - method: 'post', - data: { - categories: categories.join('\n') - } - }).send(); - setCategoryFilter(CATEGORIES_ALL); - }; - - startTorrentsByCategoryFN = function(categoryHash) { - var hashes = torrentsTable.getFilteredTorrentsHashes('all', categoryHash); - if (hashes.length) { - new Request({ - url: 'api/v2/torrents/resume', - method: 'post', - data: { - hashes: hashes.join("|") - } - }).send(); - updateMainData(); - } - }; - - pauseTorrentsByCategoryFN = function(categoryHash) { - var hashes = torrentsTable.getFilteredTorrentsHashes('all', categoryHash); - if (hashes.length) { - new Request({ - url: 'api/v2/torrents/pause', - method: 'post', - data: { - hashes: hashes.join("|") - } - }).send(); - updateMainData(); - } - }; - - deleteTorrentsByCategoryFN = function(categoryHash) { - var hashes = torrentsTable.getFilteredTorrentsHashes('all', categoryHash); - if (hashes.length) { - new MochaUI.Window({ - id: 'confirmDeletionPage', - title: "QBT_TR(Deletion confirmation)QBT_TR[CONTEXT=confirmDeletionDlg]", - loadMethod: 'iframe', - contentURL: 'confirmdeletion.html?hashes=' + hashes.join("|"), - scrollbars: false, - resizable: false, - maximizable: false, - padding: 10, - width: 424, - height: 140 - }); - updateMainData(); - } - }; - - copyNameFN = function() { - var selectedRows = torrentsTable.selectedRowsIds(); - var names = []; - if (selectedRows.length) { - var rows = torrentsTable.getFilteredAndSortedRows(); - for (var i = 0; i < selectedRows.length; ++i) { - var hash = selectedRows[i]; - names.push(rows[hash].full_data.name); - } - } - return names.join("\n"); - }; - - copyMagnetLinkFN = function() { - var selectedRows = torrentsTable.selectedRowsIds(); - var magnets = []; - if (selectedRows.length) { - var rows = torrentsTable.getFilteredAndSortedRows(); - for (var i = 0; i < selectedRows.length; ++i) { - var hash = selectedRows[i]; - magnets.push(rows[hash].full_data.magnet_uri); - } - } - return magnets.join("\n"); - }; - - copyHashFN = function() { - return torrentsTable.selectedRowsIds().join("\n"); - }; - - ['pause', 'resume'].each(function(item) { - addClickEvent(item + 'All', function(e) { - new Event(e).stop(); - new Request({ - url: 'api/v2/torrents/' + item, - method: 'post', - data: { - hashes: "all" - } - }).send(); - updateMainData(); - }); - }); - - ['pause', 'resume', 'recheck'].each(function(item) { - addClickEvent(item, function(e) { - new Event(e).stop(); - var hashes = torrentsTable.selectedRowsIds(); - if (hashes.length) { - hashes.each(function(hash, index) { - new Request({ - url: 'api/v2/torrents/' + item, - method: 'post', - data: { - hashes: hash - } - }).send(); - }); - updateMainData(); - } - }); - }); - - ['decreasePrio', 'increasePrio', 'topPrio', 'bottomPrio'].each(function(item) { - addClickEvent(item, function(e) { - new Event(e).stop(); - setPriorityFN(item); - }); - }); - - setPriorityFN = function(cmd) { - var hashes = torrentsTable.selectedRowsIds(); - if (hashes.length) { - new Request({ - url: 'api/v2/torrents/' + cmd, - method: 'post', - data: { - hashes: hashes.join("|") - } - }).send(); - updateMainData(); - } - }; - - addClickEvent('about', function(e) { - new Event(e).stop(); - var id = 'aboutpage'; - new MochaUI.Window({ - id: id, - title: 'QBT_TR(About)QBT_TR[CONTEXT=AboutDlg]', - loadMethod: 'xhr', - contentURL: 'about.html', - padding: 10, - width: loadWindowWidth(id, 550), - height: loadWindowHeight(id, 290), - onResize: function() { - saveWindowSize(id); - } - }); - }); - - addClickEvent('logout', function(e) { - new Event(e).stop(); - new Request({ - url: 'api/v2/auth/logout', - method: 'post', - onSuccess: function() { - window.location.reload(); - } - }).send(); - }); - - addClickEvent('shutdown', function(e) { - new Event(e).stop(); - if (confirm('QBT_TR(Are you sure you want to quit qBittorrent?)QBT_TR[CONTEXT=MainWindow]')) { - new Request({ - url: 'api/v2/app/shutdown', - onSuccess: function() { - document.write("QBT_TR(qBittorrent has been shutdown.)QBT_TR[CONTEXT=HttpServer]

    QBT_TR(qBittorrent has been shutdown.)QBT_TR[CONTEXT=HttpServer]

    "); - stop(); - } - }).send(); - } - }); - - // Deactivate menu header links - $$('a.returnFalse').each(function(el) { - el.addEvent('click', function(e) { - new Event(e).stop(); - }); - }); -}; diff -Nru qbittorrent-4.1.3/src/webui/www/private/scripts/progressbar.js qbittorrent-3.3.15/src/webui/www/private/scripts/progressbar.js --- qbittorrent-4.1.3/src/webui/www/private/scripts/progressbar.js 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/scripts/progressbar.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,110 +0,0 @@ -var ProgressBar = new Class({ - initialize: function(value, parameters) { - var vals = { - 'id': 'progressbar_' + (ProgressBars++), - 'value': $pick(value, 0), - 'width': 0, - 'height': 0, - 'darkbg': '#006', - 'darkfg': '#fff', - 'lightbg': '#fff', - 'lightfg': '#000' - }; - if (parameters && $type(parameters) == 'object') $extend(vals, parameters); - if (vals.height < 12) vals.height = 12; - var obj = new Element('div', { - 'id': vals.id, - 'class': 'progressbar_wrapper', - 'styles': { - 'border': '1px solid #000', - 'width': vals.width, - 'height': vals.height, - 'position': 'relative', - 'margin': '0 auto' - } - }); - obj.vals = vals; - obj.vals.value = $pick(value, 0); // Fix by Chris - obj.vals.dark = new Element('div', { - 'id': vals.id + '_dark', - 'class': 'progressbar_dark', - 'styles': { - 'width': vals.width, - 'height': vals.height, - 'background': vals.darkbg, - 'color': vals.darkfg, - 'position': 'absolute', - 'text-align': 'center', - 'left': 0, - 'top': 0, - 'line-height': vals.height - } - }); - obj.vals.light = new Element('div', { - 'id': vals.id + '_light', - 'class': 'progressbar_light', - 'styles': { - 'width': vals.width, - 'height': vals.height, - 'background': vals.lightbg, - 'color': vals.lightfg, - 'position': 'absolute', - 'text-align': 'center', - 'left': 0, - 'top': 0, - 'line-height': vals.height - } - }); - obj.appendChild(obj.vals.dark); - obj.appendChild(obj.vals.light); - obj.getValue = ProgressBar_getValue; - obj.setValue = ProgressBar_setValue; - obj.setWidth = ProgressBar_setWidth; - if (vals.width) obj.setValue(vals.value); - else setTimeout('ProgressBar_checkForParent("' + obj.id + '")', 1); - return obj; - } -}); - -function ProgressBar_getValue() { - return this.vals.value; -} - -function ProgressBar_setValue(value) { - value = parseFloat(value); - if (isNaN(value)) value = 0; - if (value > 100) value = 100; - if (value < 0) value = 0; - this.vals.value = value; - this.vals.dark.empty(); - this.vals.light.empty(); - this.vals.dark.appendText(value.round(1).toFixed(1) + '%'); - this.vals.light.appendText(value.round(1).toFixed(1) + '%'); - var r = parseInt(this.vals.width * (value / 100)); - this.vals.dark.setStyle('clip', 'rect(0,' + r + 'px,' + this.vals.height + 'px,0)'); - this.vals.light.setStyle('clip', 'rect(0,' + this.vals.width + 'px,' + this.vals.height + 'px,' + r + 'px)'); -} - -function ProgressBar_setWidth(value) { - if (this.vals.width !== value) { - this.vals.width = value; - this.setStyle('width', value); - this.vals.dark.setStyle('width', value); - this.vals.light.setStyle('width', value); - this.setValue(this.vals.value); - } -} - -function ProgressBar_checkForParent(id) { - var obj = $(id); - if (!obj) return; - if (!obj.parentNode) return setTimeout('ProgressBar_checkForParent("' + id + '")', 1); - obj.setStyle('width', '100%'); - var w = obj.offsetWidth; - obj.vals.dark.setStyle('width', w); - obj.vals.light.setStyle('width', w); - obj.vals.width = w; - obj.setValue(obj.vals.value); -} - -var ProgressBars = 0; diff -Nru qbittorrent-4.1.3/src/webui/www/private/scripts/prop-files.js qbittorrent-3.3.15/src/webui/www/private/scripts/prop-files.js --- qbittorrent-4.1.3/src/webui/www/private/scripts/prop-files.js 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/scripts/prop-files.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,354 +0,0 @@ -var is_seed = true; -var current_hash = ""; - -if (!(Browser.name == "ie" && Browser.version < 9)) { - $("all_files_cb").removeClass("tristate"); - $("all_files_cb").removeClass("partial"); - $("all_files_cb").removeClass("checked"); - $("tristate_cb").style.display = "inline"; -} - -var setCBState = function(state) { - if (Browser.name == "ie" && Browser.version < 9) { - if (state == "partial") { - if (!$("all_files_cb").hasClass("partial")) { - $("all_files_cb").removeClass("checked"); - $("all_files_cb").addClass("partial"); - } - return; - } - if (state == "checked") { - if (!$("all_files_cb").hasClass("checked")) { - $("all_files_cb").removeClass("partial"); - $("all_files_cb").addClass("checked"); - } - return; - } - $("all_files_cb").removeClass("partial"); - $("all_files_cb").removeClass("checked"); - } - else { - if (state == "partial") { - $("tristate_cb").indeterminate = true; - } - else if (state == "checked") { - $("tristate_cb").indeterminate = false; - $("tristate_cb").checked = true; - } - else { - $("tristate_cb").indeterminate = false; - $("tristate_cb").checked = false; - } - } -}; - -var switchCBState = function() { - // Uncheck - if ($("all_files_cb").hasClass("partial")) { - $("all_files_cb").removeClass("partial"); - // Uncheck all checkboxes - $$('input.DownloadedCB').each(function(item, index) { - item.erase("checked"); - setFilePriority(index, 0); - }); - return; - } - if ($("all_files_cb").hasClass("checked")) { - $("all_files_cb").removeClass("checked"); - // Uncheck all checkboxes - $$('input.DownloadedCB').each(function(item, index) { - item.erase("checked"); - setFilePriority(index, 0); - }); - return; - } - // Check - $("all_files_cb").addClass("checked"); - // Check all checkboxes - $$('input.DownloadedCB').each(function(item, index) { - item.set("checked", "checked"); - setFilePriority(index, 1); - }); -}; - -var allCBChecked = function() { - var CBs = $$('input.DownloadedCB'); - for (var i = 0; i < CBs.length; i += 1) { - var item = CBs[i]; - if (!$defined(item.get('checked')) || !item.get('checked')) - return false; - } - return true; -}; - -var allCBUnchecked = function() { - var CBs = $$('input.DownloadedCB'); - for (var i = 0; i < CBs.length; i += 1) { - var item = CBs[i]; - if ($defined(item.get('checked')) && item.get('checked')) - return false; - } - return true; -}; - -var setFilePriority = function(id, priority) { - if (current_hash === "") return; - new Request({ - url: 'api/v2/torrents/filePrio', - method: 'post', - data: { - 'hash': current_hash, - 'id': id, - 'priority': priority - } - }).send(); - // Display or add combobox - if (priority > 0) { - $('comboPrio' + id).set("value", 1); - $('comboPrio' + id).removeClass("invisible"); - } - else { - $('comboPrio' + id).addClass("invisible"); - } -}; - -var createDownloadedCB = function(id, downloaded) { - var CB = new Element('input'); - CB.set('type', 'checkbox'); - if (downloaded) - CB.set('checked', 'checked'); - CB.set('id', 'cbPrio' + id); - CB.set('class', 'DownloadedCB'); - CB.addEvent('change', function(e) { - var checked = 0; - if ($defined($('cbPrio' + id).get('checked')) && $('cbPrio' + id).get('checked')) - checked = 1; - setFilePriority(id, checked); - if (allCBChecked()) { - setCBState("checked"); - } - else { - if (allCBUnchecked()) { - setCBState("unchecked"); - } - else { - setCBState("partial"); - } - } - }); - return CB; -}; - -var createPriorityCombo = function(id, selected_prio) { - var select = new Element('select'); - select.set('id', 'comboPrio' + id); - select.addEvent('change', function(e) { - var new_prio = $('comboPrio' + id).get('value'); - setFilePriority(id, new_prio); - }); - var opt = new Element("option"); - opt.set('value', '1'); - opt.set('html', "QBT_TR(Normal)QBT_TR[CONTEXT=PropListDelegate]"); - if (selected_prio <= 1) - opt.setAttribute('selected', ''); - opt.injectInside(select); - opt = new Element("option"); - opt.set('value', '2'); - opt.set('html', "QBT_TR(High)QBT_TR[CONTEXT=PropListDelegate]"); - if (selected_prio == 2) - opt.setAttribute('selected', ''); - opt.injectInside(select); - opt = new Element("option"); - opt.set('value', '7'); - opt.set('html', "QBT_TR(Maximum)QBT_TR[CONTEXT=PropListDelegate]"); - if (selected_prio == 7) - opt.setAttribute('selected', ''); - opt.injectInside(select); - if (is_seed || selected_prio < 1) { - select.addClass("invisible"); - } - else { - select.removeClass("invisible"); - } - select.addClass("combo_priority"); - return select; -}; - -var filesDynTable = new Class({ - - initialize: function() {}, - - setup: function(table) { - this.table = $(table); - this.rows = new Hash(); - }, - - removeRow: function(id) { - if (this.rows.has(id)) { - var tr = this.rows.get(id); - tr.dispose(); - this.rows.erase(id); - return true; - } - return false; - }, - - removeAllRows: function() { - this.rows.each(function(tr, id) { - this.removeRow(id); - }.bind(this)); - }, - - updateRow: function(tr, row, id) { - var tds = tr.getElements('td'); - for (var i = 0; i < row.length; ++i) { - switch (i) { - case 0: - if (row[i] > 0) - tds[i].getChildren('input')[0].set('checked', 'checked'); - else - tds[i].getChildren('input')[0].removeProperty('checked'); - break; - case 3: - $('pbf_' + id).setValue(row[i].toFloat()); - break; - case 4: - if (!is_seed && row[i] > 0) { - tds[i].getChildren('select').set('value', row[i]); - $('comboPrio' + id).removeClass("invisible"); - } - else { - if (!$('comboPrio' + id).hasClass("invisible")) - $('comboPrio' + id).addClass("invisible"); - } - break; - default: - tds[i].set('html', row[i]); - } - } - return true; - }, - - insertRow: function(id, row) { - if (this.rows.has(id)) { - var tableRow = this.rows.get(id); - this.updateRow(tableRow, row, id); - return; - } - //this.removeRow(id); - var tr = new Element('tr'); - this.rows.set(id, tr); - for (var i = 0; i < row.length; ++i) { - var td = new Element('td'); - switch (i) { - case 0: - var tree_img = new Element('img', { - src: 'images/L.gif', - style: 'margin-bottom: -2px' - }); - td.adopt(tree_img, createDownloadedCB(id, row[i])); - break; - case 1: - td.set('html', row[i]); - td.set('title', row[i]); - break; - case 3: - td.adopt(new ProgressBar(row[i].toFloat(), { - 'id': 'pbf_' + id, - 'width': 80 - })); - break; - case 4: - td.adopt(createPriorityCombo(id, row[i])); - break; - default: - td.set('html', row[i]); - break; - } - td.injectInside(tr); - } - tr.injectInside(this.table); - }, -}); - -var loadTorrentFilesDataTimer; -var loadTorrentFilesData = function() { - if ($('prop_files').hasClass('invisible') - || $('propertiesPanel_collapseToggle').hasClass('panel-expand')) { - // Tab changed, don't do anything - return; - } - var new_hash = torrentsTable.getCurrentTorrentHash(); - if (new_hash === "") { - fTable.removeAllRows(); - clearTimeout(loadTorrentFilesDataTimer); - loadTorrentFilesDataTimer = loadTorrentFilesData.delay(5000); - return; - } - if (new_hash != current_hash) { - fTable.removeAllRows(); - current_hash = new_hash; - } - var url = new URI('api/v2/torrents/files?hash=' + current_hash); - var request = new Request.JSON({ - url: url, - noCache: true, - method: 'get', - onFailure: function() { - $('error_div').set('html', 'QBT_TR(qBittorrent client is not reachable)QBT_TR[CONTEXT=HttpServer]'); - clearTimeout(loadTorrentFilesDataTimer); - loadTorrentFilesDataTimer = loadTorrentFilesData.delay(10000); - }, - onSuccess: function(files) { - $('error_div').set('html', ''); - if (files) { - // Update Trackers data - var i = 0; - files.each(function(file) { - if (i === 0) { - is_seed = file.is_seed; - } - var row = []; - row.length = 4; - row[0] = file.priority; - row[1] = escapeHtml(file.name); - row[2] = friendlyUnit(file.size, false); - row[3] = (file.progress * 100).round(1); - if (row[3] == 100.0 && file.progress < 1.0) - row[3] = 99.9; - row[4] = file.priority; - row[5] = friendlyUnit(file.size * (1.0 - file.progress)); - row[6] = friendlyPercentage(file.availability); - - fTable.insertRow(i, row); - ++i; - }.bind(this)); - // Set global CB state - if (allCBChecked()) { - setCBState("checked"); - } - else { - if (allCBUnchecked()) { - setCBState("unchecked"); - } - else { - setCBState("partial"); - } - } - } - else { - fTable.removeAllRows(); - } - clearTimeout(loadTorrentFilesDataTimer); - loadTorrentFilesDataTimer = loadTorrentFilesData.delay(5000); - } - }).send(); -}; - -var updateTorrentFilesData = function() { - clearTimeout(loadTorrentFilesDataTimer); - loadTorrentFilesData(); -}; - -fTable = new filesDynTable(); -fTable.setup($('filesTable')); diff -Nru qbittorrent-4.1.3/src/webui/www/private/scripts/prop-general.js qbittorrent-3.3.15/src/webui/www/private/scripts/prop-general.js --- qbittorrent-4.1.3/src/webui/www/private/scripts/prop-general.js 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/scripts/prop-general.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,169 +0,0 @@ -var clearData = function() { - $('time_elapsed').set('html', ''); - $('eta').set('html', ''); - $('nb_connections').set('html', ''); - $('total_downloaded').set('html', ''); - $('total_uploaded').set('html', ''); - $('dl_speed').set('html', ''); - $('up_speed').set('html', ''); - $('dl_limit').set('html', ''); - $('up_limit').set('html', ''); - $('total_wasted').set('html', ''); - $('seeds').set('html', ''); - $('peers').set('html', ''); - $('share_ratio').set('html', ''); - $('reannounce').set('html', ''); - $('last_seen').set('html', ''); - $('total_size').set('html', ''); - $('pieces').set('html', ''); - $('created_by').set('html', ''); - $('addition_date').set('html', ''); - $('completion_date').set('html', ''); - $('creation_date').set('html', ''); - $('torrent_hash').set('html', ''); - $('save_path').set('html', ''); - $('comment').set('html', ''); -}; - -var loadTorrentDataTimer; -var loadTorrentData = function() { - if ($('prop_general').hasClass('invisible') - || $('propertiesPanel_collapseToggle').hasClass('panel-expand')) { - // Tab changed, don't do anything - return; - } - var current_hash = torrentsTable.getCurrentTorrentHash(); - if (current_hash === "") { - clearData(); - clearTimeout(loadTorrentDataTimer); - loadTorrentDataTimer = loadTorrentData.delay(5000); - return; - } - // Display hash - $('torrent_hash').set('html', current_hash); - var url = new URI('api/v2/torrents/properties?hash=' + current_hash); - var request = new Request.JSON({ - url: url, - noCache: true, - method: 'get', - onFailure: function() { - $('error_div').set('html', 'QBT_TR(qBittorrent client is not reachable)QBT_TR[CONTEXT=HttpServer]'); - clearTimeout(loadTorrentDataTimer); - loadTorrentDataTimer = loadTorrentData.delay(10000); - }, - onSuccess: function(data) { - $('error_div').set('html', ''); - if (data) { - var temp; - // Update Torrent data - if (data.seeding_time > 0) - temp = "QBT_TR(%1 (%2 this session))QBT_TR[CONTEXT=PropertiesWidget]" - .replace("%1", friendlyDuration(data.time_elapsed)) - .replace("%2", friendlyDuration(data.seeding_time)); - else - temp = friendlyDuration(data.time_elapsed); - $('time_elapsed').set('html', temp); - - $('eta').set('html', friendlyDuration(data.eta)); - - temp = "QBT_TR(%1 (%2 max))QBT_TR[CONTEXT=PropertiesWidget]" - .replace("%1", data.nb_connections) - .replace("%2", data.nb_connections_limit < 0 ? "∞" : data.nb_connections_limit); - $('nb_connections').set('html', temp); - - temp = "QBT_TR(%1 (%2 this session))QBT_TR[CONTEXT=PropertiesWidget]" - .replace("%1", friendlyUnit(data.total_downloaded)) - .replace("%2", friendlyUnit(data.total_downloaded_session)); - $('total_downloaded').set('html', temp); - - temp = "QBT_TR(%1 (%2 this session))QBT_TR[CONTEXT=PropertiesWidget]" - .replace("%1", friendlyUnit(data.total_uploaded)) - .replace("%2", friendlyUnit(data.total_uploaded_session)); - $('total_uploaded').set('html', temp); - - temp = "QBT_TR(%1 (%2 avg.))QBT_TR[CONTEXT=PropertiesWidget]" - .replace("%1", friendlyUnit(data.dl_speed, true)) - .replace("%2", friendlyUnit(data.dl_speed_avg, true)); - $('dl_speed').set('html', temp); - - temp = "QBT_TR(%1 (%2 avg.))QBT_TR[CONTEXT=PropertiesWidget]" - .replace("%1", friendlyUnit(data.up_speed, true)) - .replace("%2", friendlyUnit(data.up_speed_avg, true)); - $('up_speed').set('html', temp); - - temp = (data.dl_limit == -1 ? "∞" : friendlyUnit(data.dl_limit, true)); - $('dl_limit').set('html', temp); - - temp = (data.up_limit == -1 ? "∞" : friendlyUnit(data.up_limit, true)); - $('up_limit').set('html', temp); - - $('total_wasted').set('html', friendlyUnit(data.total_wasted)); - - temp = "QBT_TR(%1 (%2 total))QBT_TR[CONTEXT=PropertiesWidget]" - .replace("%1", data.seeds) - .replace("%2", data.seeds_total); - $('seeds').set('html', temp); - - temp = "QBT_TR(%1 (%2 total))QBT_TR[CONTEXT=PropertiesWidget]" - .replace("%1", data.peers) - .replace("%2", data.peers_total); - $('peers').set('html', temp); - - $('share_ratio').set('html', data.share_ratio.toFixed(2)); - - $('reannounce').set('html', friendlyDuration(data.reannounce)); - - if (data.last_seen != -1) - temp = new Date(data.last_seen * 1000).toLocaleString(); - else - temp = "QBT_TR(Never)QBT_TR[CONTEXT=PropertiesWidget]"; - $('last_seen').set('html', temp); - - $('total_size').set('html', friendlyUnit(data.total_size)); - - if (data.pieces_num != -1) - temp = "QBT_TR(%1 x %2 (have %3))QBT_TR[CONTEXT=PropertiesWidget]" - .replace("%1", data.pieces_num) - .replace("%2", friendlyUnit(data.piece_size)) - .replace("%3", data.pieces_have); - else - temp = "QBT_TR(Unknown)QBT_TR[CONTEXT=HttpServer]"; - $('pieces').set('html', temp); - - $('created_by').set('html', escapeHtml(data.created_by)); - if (data.addition_date != -1) - temp = new Date(data.addition_date * 1000).toLocaleString(); - else - temp = "QBT_TR(Unknown)QBT_TR[CONTEXT=HttpServer]"; - - $('addition_date').set('html', temp); - if (data.completion_date != -1) - temp = new Date(data.completion_date * 1000).toLocaleString(); - else - temp = ""; - - $('completion_date').set('html', temp); - - if (data.creation_date != -1) - temp = new Date(data.creation_date * 1000).toLocaleString(); - else - temp = "QBT_TR(Unknown)QBT_TR[CONTEXT=HttpServer]"; - $('creation_date').set('html', temp); - - $('save_path').set('html', data.save_path); - - $('comment').set('html', parseHtmlLinks(escapeHtml(data.comment))); - } - else { - clearData(); - } - clearTimeout(loadTorrentDataTimer); - loadTorrentDataTimer = loadTorrentData.delay(5000); - } - }).send(); -}; - -var updateTorrentData = function() { - clearTimeout(loadTorrentDataTimer); - loadTorrentData(); -}; diff -Nru qbittorrent-4.1.3/src/webui/www/private/scripts/prop-trackers.js qbittorrent-3.3.15/src/webui/www/private/scripts/prop-trackers.js --- qbittorrent-4.1.3/src/webui/www/private/scripts/prop-trackers.js 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/scripts/prop-trackers.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,131 +0,0 @@ -var trackersDynTable = new Class({ - - initialize: function() {}, - - setup: function(table) { - this.table = $(table); - this.rows = new Hash(); - }, - - removeRow: function(url) { - if (this.rows.has(url)) { - var tr = this.rows.get(url); - tr.dispose(); - this.rows.erase(url); - return true; - } - return false; - }, - - removeAllRows: function() { - this.rows.each(function(tr, url) { - this.removeRow(url); - }.bind(this)); - }, - - updateRow: function(tr, row) { - var tds = tr.getElements('td'); - for (var i = 0; i < row.length; ++i) { - tds[i].set('html', row[i]); - } - return true; - }, - - insertRow: function(row) { - var url = row[0]; - if (this.rows.has(url)) { - var tableRow = this.rows.get(url); - this.updateRow(tableRow, row); - return; - } - //this.removeRow(id); - var tr = new Element('tr'); - this.rows.set(url, tr); - for (var i = 0; i < row.length; ++i) { - var td = new Element('td'); - td.set('html', row[i]); - td.injectInside(tr); - } - tr.injectInside(this.table); - }, -}); - -var current_hash = ""; - -var loadTrackersDataTimer; -var loadTrackersData = function() { - if ($('prop_trackers').hasClass('invisible') - || $('propertiesPanel_collapseToggle').hasClass('panel-expand')) { - // Tab changed, don't do anything - return; - } - var new_hash = torrentsTable.getCurrentTorrentHash(); - if (new_hash === "") { - tTable.removeAllRows(); - clearTimeout(loadTrackersDataTimer); - loadTrackersDataTimer = loadTrackersData.delay(10000); - return; - } - if (new_hash != current_hash) { - tTable.removeAllRows(); - current_hash = new_hash; - } - var url = new URI('api/v2/torrents/trackers?hash=' + current_hash); - var request = new Request.JSON({ - url: url, - noCache: true, - method: 'get', - onFailure: function() { - $('error_div').set('html', 'QBT_TR(qBittorrent client is not reachable)QBT_TR[CONTEXT=HttpServer]'); - clearTimeout(loadTrackersDataTimer); - loadTrackersDataTimer = loadTrackersData.delay(20000); - }, - onSuccess: function(trackers) { - $('error_div').set('html', ''); - if (trackers) { - // Update Trackers data - trackers.each(function(tracker) { - var row = []; - row.length = 4; - row[0] = escapeHtml(tracker.url); - row[1] = tracker.status; - row[2] = tracker.num_peers; - row[3] = escapeHtml(tracker.msg); - tTable.insertRow(row); - }); - } - else { - tTable.removeAllRows(); - } - clearTimeout(loadTrackersDataTimer); - loadTrackersDataTimer = loadTrackersData.delay(10000); - } - }).send(); -}; - -var updateTrackersData = function() { - clearTimeout(loadTrackersDataTimer); - loadTrackersData(); -}; - -tTable = new trackersDynTable(); -tTable.setup($('trackersTable')); - -// Add trackers code -$('addTrackersPlus').addEvent('click', function addTrackerDlg() { - if (current_hash.length === 0) return; - new MochaUI.Window({ - id: 'trackersPage', - title: "QBT_TR(Trackers addition dialog)QBT_TR[CONTEXT=TrackersAdditionDialog]", - loadMethod: 'iframe', - contentURL: 'addtrackers.html?hash=' + current_hash, - scrollbars: true, - resizable: false, - maximizable: false, - closable: true, - paddingVertical: 0, - paddingHorizontal: 0, - width: 500, - height: 250 - }); -}); diff -Nru qbittorrent-4.1.3/src/webui/www/private/scripts/prop-webseeds.js qbittorrent-3.3.15/src/webui/www/private/scripts/prop-webseeds.js --- qbittorrent-4.1.3/src/webui/www/private/scripts/prop-webseeds.js 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/scripts/prop-webseeds.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,109 +0,0 @@ -var webseedsDynTable = new Class({ - - initialize: function() {}, - - setup: function(table) { - this.table = $(table); - this.rows = new Hash(); - }, - - removeRow: function(url) { - if (this.rows.has(url)) { - var tr = this.rows.get(url); - tr.dispose(); - this.rows.erase(url); - return true; - } - return false; - }, - - removeAllRows: function() { - this.rows.each(function(tr, url) { - this.removeRow(url); - }.bind(this)); - }, - - updateRow: function(tr, row) { - var tds = tr.getElements('td'); - for (var i = 0; i < row.length; ++i) { - tds[i].set('html', row[i]); - } - return true; - }, - - insertRow: function(row) { - var url = row[0]; - if (this.rows.has(url)) { - var tableRow = this.rows.get(url); - this.updateRow(tableRow, row); - return; - } - //this.removeRow(id); - var tr = new Element('tr'); - this.rows.set(url, tr); - for (var i = 0; i < row.length; ++i) { - var td = new Element('td'); - td.set('html', row[i]); - td.injectInside(tr); - } - tr.injectInside(this.table); - }, -}); - -var current_hash = ""; - -var loadWebSeedsDataTimer; -var loadWebSeedsData = function() { - if ($('prop_webseeds').hasClass('invisible') - || $('propertiesPanel_collapseToggle').hasClass('panel-expand')) { - // Tab changed, don't do anything - return; - } - var new_hash = torrentsTable.getCurrentTorrentHash(); - if (new_hash === "") { - wsTable.removeAllRows(); - clearTimeout(loadWebSeedsDataTimer); - loadWebSeedsDataTimer = loadWebSeedsData.delay(10000); - return; - } - if (new_hash != current_hash) { - wsTable.removeAllRows(); - current_hash = new_hash; - } - var url = new URI('api/v2/torrents/webseeds?hash=' + current_hash); - var request = new Request.JSON({ - url: url, - noCache: true, - method: 'get', - onFailure: function() { - $('error_div').set('html', 'QBT_TR(qBittorrent client is not reachable)QBT_TR[CONTEXT=HttpServer]'); - clearTimeout(loadWebSeedsDataTimer); - loadWebSeedsDataTimer = loadWebSeedsData.delay(20000); - }, - onSuccess: function(webseeds) { - $('error_div').set('html', ''); - if (webseeds) { - // Update WebSeeds data - webseeds.each(function(webseed) { - var row = []; - row.length = 1; - row[0] = webseed.url; - wsTable.insertRow(row); - }); - } - else { - wsTable.removeAllRows(); - } - clearTimeout(loadWebSeedsDataTimer); - loadWebSeedsDataTimer = loadWebSeedsData.delay(10000); - } - }).send(); -}; - -var updateWebSeedsData = function() { - clearTimeout(loadWebSeedsDataTimer); - loadWebSeedsData(); -}; - -wsTable = new webseedsDynTable(); -wsTable.setup($('webseedsTable')); diff -Nru qbittorrent-4.1.3/src/webui/www/private/setlocation.html qbittorrent-3.3.15/src/webui/www/private/setlocation.html --- qbittorrent-4.1.3/src/webui/www/private/setlocation.html 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/setlocation.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,70 +0,0 @@ - - - - - - QBT_TR(Set location)QBT_TR[CONTEXT=HttpServer] - - - - - - - - -
    -

    QBT_TR(Location)QBT_TR[CONTEXT=TransferListWidget]:

    - -
     
    -
    - -
    -
    - - - diff -Nru qbittorrent-4.1.3/src/webui/www/private/shareratio.html qbittorrent-3.3.15/src/webui/www/private/shareratio.html --- qbittorrent-4.1.3/src/webui/www/private/shareratio.html 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/shareratio.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,167 +0,0 @@ - - - - - - QBT_TR(Torrent Upload/Download Ratio Limiting)QBT_TR[CONTEXT=UpDownRatioDialog] - - - - - - - - -
    - QBT_TR(Use global share limit)QBT_TR[CONTEXT=UpDownRatioDialog]
    - QBT_TR(Set no share limit)QBT_TR[CONTEXT=UpDownRatioDialog]
    - QBT_TR(Set share limit to)QBT_TR[CONTEXT=UpDownRatioDialog]
    - -
    - - - -
    -
    - - - -
    -
    - -
    -
    - - - diff -Nru qbittorrent-4.1.3/src/webui/www/private/statistics.html qbittorrent-3.3.15/src/webui/www/private/statistics.html --- qbittorrent-4.1.3/src/webui/www/private/statistics.html 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/statistics.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -

    QBT_TR(User statistics)QBT_TR[CONTEXT=StatsDialog]

    - - - - - - - - - - - - - - - - - - - - - -
    QBT_TR(All-time upload:)QBT_TR[CONTEXT=StatsDialog]
    QBT_TR(All-time download:)QBT_TR[CONTEXT=StatsDialog]
    QBT_TR(All-time share ratio:)QBT_TR[CONTEXT=StatsDialog]
    QBT_TR(Session waste:)QBT_TR[CONTEXT=StatsDialog]
    QBT_TR(Connected peers:)QBT_TR[CONTEXT=StatsDialog]
    - -

    QBT_TR(Cache statistics)QBT_TR[CONTEXT=StatsDialog]

    - - - - - - - - - -
    QBT_TR(Read cache hits:)QBT_TR[CONTEXT=StatsDialog]
    QBT_TR(Total buffer size:)QBT_TR[CONTEXT=StatsDialog]
    - -

    QBT_TR(Performance statistics)QBT_TR[CONTEXT=StatsDialog]

    - - - - - - - - - - - - - - - - - - - - - -
    QBT_TR(Write cache overload:)QBT_TR[CONTEXT=StatsDialog]
    QBT_TR(Read cache overload:)QBT_TR[CONTEXT=StatsDialog]
    QBT_TR(Queued I/O jobs:)QBT_TR[CONTEXT=StatsDialog]
    QBT_TR(Average time in queue:)QBT_TR[CONTEXT=StatsDialog]
    QBT_TR(Total queued size:)QBT_TR[CONTEXT=StatsDialog]
    diff -Nru qbittorrent-4.1.3/src/webui/www/private/transferlist.html qbittorrent-3.3.15/src/webui/www/private/transferlist.html --- qbittorrent-4.1.3/src/webui/www/private/transferlist.html 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/transferlist.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,96 +0,0 @@ -
    - - - - -
    -
    - -
    - - - - - -
    -
    - - diff -Nru qbittorrent-4.1.3/src/webui/www/private/upload.html qbittorrent-3.3.15/src/webui/www/private/upload.html --- qbittorrent-4.1.3/src/webui/www/private/upload.html 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/upload.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,86 +0,0 @@ - - - - - - QBT_TR(Upload local torrent)QBT_TR[CONTEXT=HttpServer] - - - - - - - - -
    -
    - -
    -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - -
    -
    -
    - -
    - - - diff -Nru qbittorrent-4.1.3/src/webui/www/private/uploadlimit.html qbittorrent-3.3.15/src/webui/www/private/uploadlimit.html --- qbittorrent-4.1.3/src/webui/www/private/uploadlimit.html 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/private/uploadlimit.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,65 +0,0 @@ - - - - - - QBT_TR(Torrent Upload Speed Limiting)QBT_TR[CONTEXT=TransferListWidget] - - - - - - - - -
    -
    -
    QBT_TR(Upload limit:)QBT_TR[CONTEXT=PropertiesWidget] QBT_TR(KiB/s)QBT_TR[CONTEXT=SpeedLimitDialog]
    -
    -
    -
    -
    -
    -
    - - -
    - - - - - - diff -Nru qbittorrent-4.1.3/src/webui/www/public/about.html qbittorrent-3.3.15/src/webui/www/public/about.html --- qbittorrent-4.1.3/src/webui/www/public/about.html 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/about.html 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,10 @@ + +

    qBittorrent ${VERSION} QBT_TR(Web UI)QBT_TR[CONTEXT=OptionsDialog]

    +

    QBT_TR(An advanced BitTorrent client programmed in C++, based on Qt toolkit and libtorrent-rasterbar.)QBT_TR[CONTEXT=about]

    +

    Copyright (c) 2011-2017 The qBittorrent project

    +

    QBT_TR(Home Page:)QBT_TR[CONTEXT=about] http://www.qbittorrent.org

    +

    QBT_TR(Bug Tracker:)QBT_TR[CONTEXT=about] http://bugs.qbittorrent.org

    +

    QBT_TR(Forum:)QBT_TR[CONTEXT=about] http://forum.qbittorrent.org

    +

    QBT_TR(IRC: #qbittorrent on Freenode)QBT_TR[CONTEXT=HttpServer]

    +

    QBT_TR(Original authors)QBT_TR[CONTEXT=HttpServer]

    +Ishan Arora, Ankit Gupta, Chandan Shikhar Dua and Swapnil Kumar. diff -Nru qbittorrent-4.1.3/src/webui/www/public/addtrackers.html qbittorrent-3.3.15/src/webui/www/public/addtrackers.html --- qbittorrent-4.1.3/src/webui/www/public/addtrackers.html 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/addtrackers.html 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,36 @@ + + + + + QBT_TR(Trackers addition dialog)QBT_TR[CONTEXT=TrackersAdditionDlg] + + + + + + +
    +
    +

    QBT_TR(List of trackers to add (one per line):)QBT_TR[CONTEXT=TrackersAdditionDlg]

    + +
    + +
    + + diff -Nru qbittorrent-4.1.3/src/webui/www/public/confirmdeletion.html qbittorrent-3.3.15/src/webui/www/public/confirmdeletion.html --- qbittorrent-4.1.3/src/webui/www/public/confirmdeletion.html 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/confirmdeletion.html 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,46 @@ + + + + + QBT_TR(Deletion confirmation - qBittorrent)QBT_TR[CONTEXT=confirmDeletionDlg] + + + + + + +
    + +

      QBT_TR(Are you sure you want to delete the selected torrents from the transfer list?)QBT_TR[CONTEXT=HttpServer]

    +     

    +
    +      +
    + + diff -Nru qbittorrent-4.1.3/src/webui/www/public/css/Core.css qbittorrent-3.3.15/src/webui/www/public/css/Core.css --- qbittorrent-4.1.3/src/webui/www/public/css/Core.css 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/css/Core.css 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,54 @@ +/* + +Core.css for Mocha UI + +Theme: Default + +Copyright: + Copyright (c) 2007-2009 Greg Houston, . + +License: + MIT-style license. + +Notes: + CSS rules in this file: + + 1. Rules required by all MochaUI components or are shared by more than one. + 2. Theme specific adjustments to plugin styles. + 3. Miscellaneous rules that have no better place to go. + +*/ + +/* Required By All +---------------------------------------------------------------- */ + +/* Clears */ + +.clear { + clear: both; + height: 0; +} + +* html .clear { + font-size: 1px; + line-height: 1px; + overflow: hidden; + visibility: hidden; +} + +/* Miscellaneous +---------------------------------------------------------------- */ + +#themeControl { + margin-top: 2px; +} + + +/* Theme Specific Adjustments to Default Plugin Styles +---------------------------------------------------------------- */ + +/* Folder Tree */ + +.tree li a { + color: #3f3f3f !important; +} diff -Nru qbittorrent-4.1.3/src/webui/www/public/css/dynamicTable.css qbittorrent-3.3.15/src/webui/www/public/css/dynamicTable.css --- qbittorrent-4.1.3/src/webui/www/public/css/dynamicTable.css 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/css/dynamicTable.css 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,93 @@ + + +/************************************************************** + + Dynamic Table + v 0.4 + +**************************************************************/ +.dynamicTable tbody tr { + background-color: #fff; +} + +.dynamicTable tbody tr:nth-child(even), +.dynamicTable tbody tr.alt { + background-color: #eee; +} + +#transferList .dynamicTable td { + padding: 0 2px; +} + +.dynamicTable tbody tr.selected { + background-color: #354158; + color: #fff; +} + +.dynamicTable tbody tr:hover { + background-color: #ee6600; + color: #fff; +} + +#transferList tr:hover { + cursor: pointer; +} + +#transferList img.stateIcon { + margin-bottom: -4px; + margin-bottom: -1px; +} + +tr.dynamicTableHeader { + cursor: pointer; +} + +.dynamicTable { + table-layout: fixed; + width :1%; + padding: 0; + border-spacing: 0; +} + +.dynamicTable th { + background-color: #eee; + padding: 4px; + white-space: nowrap; + border-right-color: #ccc; + border-right-style: solid; + border-right-width: 1px; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; +} + +.dynamicTable td { + padding:0px 4px; + white-space: nowrap; +} + +.dynamicTable thead tr { + background-color: #eee; +} + +.dynamicTable th, +.dynamicTable td { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.dynamicTableFixedHeaderDiv { + overflow: hidden; +} + +.dynamicTableDiv { + overflow: auto; +} + +.dynamicTableDiv thead th { + line-height: 0px !important; + height: 0px !important; + padding-top: 0px !important; + padding-bottom: 0px !important; +} diff -Nru qbittorrent-4.1.3/src/webui/www/public/css/Layout.css qbittorrent-3.3.15/src/webui/www/public/css/Layout.css --- qbittorrent-4.1.3/src/webui/www/public/css/Layout.css 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/css/Layout.css 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,433 @@ +/* + +Core.css for Mocha UI + +Theme: Default + +Copyright: + Copyright (c) 2007-2009 Greg Houston, . + +License: + MIT-style license. + +Required by: + Layout.js + +*/ + +/* Layout +---------------------------------------------------------------- */ + +html, body { + background: #fff; +} + +body { + margin: 0; /* Required */ +} + +#desktop { + position: relative; + min-width: 400px; /* Helps keep header content from wrapping */ + height: 100%; + min-height: 100%; + overflow: hidden; + cursor: default; /* Fix for issue in IE7. IE7 wants to use the I-bar text cursor */ +} + +#desktopHeader { + background: #f2f2f2; +} + +#desktopTitlebarWrapper { + position: relative; + height: 45px; + overflow: hidden; + background: #718BA6 url(../images/skin/bg-header.gif) repeat-x; +} + +#desktopTitlebar { + padding: 7px 8px 6px 8px; + height: 32px; + background: url(../images/skin/logo.gif) no-repeat; + background-position: left 0; +} + +#desktopTitlebar h1.applicationTitle { + display: none; + margin: 0; + padding: 0 5px 0 0; + font-size: 20px; + line-height: 25px; + font-weight: bold; + color: #fff; +} + +#desktopTitlebar h2.tagline { + padding: 7px 0 0 0; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; + color: #d4dce4; + font-weight: bold; + text-align: center; + text-transform: uppercase; +} + +#desktopTitlebar h2.tagline .taglineEm { + color: #fff; + font-weight: bold; +} + +#topNav { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; + position: absolute; + right: 0; + top: 0; + color: #d4dce4; + text-align: right; + padding: 13px 10px 0 0; +} + +#topNav a { + color: #fff; + font-weight: normal; +} + +#topNav a:hover { + text-decoration: none; +} + +/* Navbar */ + +#desktopNavbar { + background: #f2f2f2; + /*height: 30px;*/ + margin: 0 0px; + overflow: hidden; /* Remove this line if you want the menu to be backward compatible with Firefox 2 */ + /* Fixes by Chris */ + /*background-color: #ccc;*/ + height: 20px; + border-bottom: 1px solid #3f3f3f; +} + +#desktopNavbar ul { + padding: 0; + margin: 0; + list-style: none; + font-size: 12px; +} + +#desktopNavbar>ul>li { + float: left; +} + +#desktopNavbar a { + display: block; +} + +#desktopNavbar ul li a { + /*padding: 6px 10px 6px 10px;*/ + color: #333; + font-weight: normal; + /* Fix by Chris */ + padding: 2px 10px 6px 10px; +} + +#desktopNavbar ul li a:hover { + color: #333; + /* Fix By Chris */ + background-color: #fff; +} + +#desktopNavbar ul li a.arrow-right, #desktopNavbar ul li a:hover.arrow-right { + background-image: url(../images/skin/arrow-right.gif); + background-repeat: no-repeat; + background-position: right 7px; +} + +#desktopNavbar li ul { + border: 1px solid #3f3f3f; + background: #fff url(../images/skin/bg-dropdown.gif) repeat-y; + position: absolute; + left: -999em; + z-index: 8000; + /* Fix by Chris */ + margin-top: -6px; +} + +#desktopNavbar li:hover ul ul, +#desktopNavbar li.ieHover ul ul, +#desktopNavbar li:hover ul ul ul, +#desktopNavbar li.ieHover ul ul ul { + left: -999em; +} + +#desktopNavbar li ul ul { /* third-and-above-level lists */ + margin: -22px 0 0 163px; +} + +#desktopNavbar li ul li .check { + position: absolute; + top: 8px; + left: 6px; + width: 5px; + height: 5px; + background: #555; + overflow: hidden; + line-height: 1px; + font-size: 1px; +} + +#desktopNavbar li ul li a { + position: relative; + /*padding: 1px 9px 1px 25px;*/ + min-width: 120px; + color: #3f3f3f; + font-weight: normal; + /* Fix By Chris */ + padding: 1px 10px 1px 20px; /* Reduce left padding */ +} + +#desktopNavbar li ul li a:hover { + background: #6C98D9; + color: #fff; + -moz-border-radius: 2px; +} + +#desktopNavbar li ul li a:hover .check { + background: #fff; +} + +#desktopNavbar li:hover ul, +#desktopNavbar li.ieHover ul, +#desktopNavbar li li.ieHover ul, +#desktopNavbar li li li.ieHover ul, +#desktopNavbar li li:hover ul, +#desktopNavbar li li li:hover ul { /* lists nested under hovered list items */ + left: auto; +} + +#desktopNavbar li:hover { /* For IE7 */ + position: static; +} + +li.divider { + margin-top: 2px; + padding-top: 3px; + border-top: 1px solid #ebebeb; +} + +#pageWrapper { + position: relative; + overflow: hidden; /* This can be set to hidden or auto */ + border-top: 1px solid #909090; + border-bottom: 1px solid #909090; + /*height: 100%;*/ +} + +/* Footer */ + +#desktopFooterWrapper { + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 30px; + overflow: hidden; +} + +#desktopFooter { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 11px; + height: 24px; + padding: 6px 8px 0 8px; + background: #f2f2f2; +} + + + +/* Panel Layout +---------------------------------------------------------------- */ + +/* Columns */ + +.column { + position: relative; + float: left; + overflow: hidden; /* Required by IE6 */ +} + +/* Panels */ + +.panel { + position: relative; + overflow: auto; + background: #f8f8f8; + border-bottom: 1px solid #b9b9b9; +} + +.panelWrapper.collapsed .panel-header { + border-bottom: 0; +} + +.panelAlt { + background: #f2f2f2; +} + +.bottomPanel { + border-bottom: 0; +} + +.pad { + padding: 8px; +} + +#mainPanel { + background: #fff; +} + +.panel-header { + position: relative; + background: #f1f1f1 url(../images/skin/bg-panel-header.gif) repeat-x; + height: 30px; + overflow: hidden; + border-bottom: 1px solid #d3d3d3; +} + +.panel-headerContent { + padding-top: 2px; +} + +.panel-headerContent.tabs { + background: url(../images/skin/tabs.gif) repeat-x; + background-position: left -68px; +} + +.panel-header h2 { + display: inline-block; + font-size: 12px; + margin: 0; + padding: 3px 8px 0 8px; + height: 22px; + overflow: hidden; + color: #333; +} + +.panel-collapse { + background: url(../images/skin/collapse-expand.gif) left top no-repeat; +} + +.panel-expand { + background: url(../images/skin/collapse-expand.gif) left -16px no-repeat; +} + +.icon16 { + margin: 4px 0 0 2px; + cursor: pointer; +} + +/* Column and Panel Handles */ + +.horizontalHandle { + height: 4px; + line-height: 1px; + font-size: 1px; + overflow: hidden; + background: #eee url(../images/skin/bg-handle-horizontal.gif) repeat-x; +} + +.horizontalHandle.detached .handleIcon { + background: transparent; +} + +.horizontalHandle .handleIcon { + margin: 0 auto; + height: 4px; + line-height: 1px; + font-size: 1px; + overflow: hidden; + background: url(../images/skin/handle-icon-horizontal.gif) center center no-repeat; +} + +.columnHandle { + min-height: 10px; + float: left; + width: 4px; + overflow: hidden; + background: #c3c3c3 url(../images/skin/handle-icon.gif) center center no-repeat; + border: 1px solid #909090; + border-top: 0; + border-bottom: 0; +} + +/* Toolboxes */ + +.toolbox { + float: right; + margin-top: 3px; + padding: 0 5px; + height: 24px; + overflow: hidden; + text-align: right; +} + +.panel-header-toolbox { +} + +div.toolbox.divider { /* Have to specify div here for IE6's sake */ + background: url(../images/skin/toolbox-divider.gif) repeat-y; + padding-left: 8px; +} + +.toolbox img.disabled { + cursor: default; +} + +.iconWrapper { + display: inline-block; + height: 22px; + min-width: 22px; + overflow: hidden; + border: 1px solid transparent; +} + +* html .iconWrapper { + padding: 1px; + border: 0; +} + +.iconWrapper img { + cursor: pointer; + margin: 0; + padding: 3px; +} + +.iconWrapper:hover { + border: 1px solid #a0a0a0; + -moz-border-radius: 3px; +} + +#spinnerWrapper { + width: 16px; + height: 16px; + background: url(../images/skin/spinner-placeholder.gif) no-repeat; + margin: 4px 5px 0 5px; +} + +#spinner { + display: none; + background: url(../images/skin/spinner.gif) no-repeat; + width: 16px; + height: 16px; +} + +#desktopFooter td { + vertical-align: top; + text-align: left; +} + +td.speedLabel { + cursor: pointer; + min-width: 18em; +} diff -Nru qbittorrent-4.1.3/src/webui/www/public/css/login.css qbittorrent-3.3.15/src/webui/www/public/css/login.css --- qbittorrent-4.1.3/src/webui/www/public/css/login.css 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/css/login.css 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -body { - margin: 0; - text-align: left; - font-family: Arial, Helvetica, sans-serif; - font-size: 12px; - line-height: 18px; - color: #555; -} - -.col { - display: inline-block; - vertical-align: middle; -} - -.row { - margin-bottom: 5px; -} - -#main { - margin-left: auto; - margin-right: auto; - text-align: center; - padding-top: 5em; -} - -#formplace { - text-align: left; - padding: 10px; -} - -#error_msg { - color: #f00; -} - -#logo img { - height: 11em; -} diff -Nru qbittorrent-4.1.3/src/webui/www/public/css/style.css qbittorrent-3.3.15/src/webui/www/public/css/style.css --- qbittorrent-4.1.3/src/webui/www/public/css/style.css 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/css/style.css 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,481 @@ +/* Reset */ + +/*ul,ol,dl,li,dt,dd,h1,h2,h3,h4,h5,h6,pre,form,body,html,p,blockquote,fieldset,input,object,iframe { margin: 0; padding: 0; }*/ +a img,:link img,:visited img { border: none; } +/*table { border-collapse: collapse; border-spacing: 0; }*/ +:focus { outline: none; } + +/* Structure */ + +body { + margin: 0; + text-align: left; + font-family: Arial, Helvetica, sans-serif; + font-size: 12px; + line-height: 18px; + color: #555; +} + +.aside { + width: 300px; +} + +.invisible { + display: none; +} + +/* Typography */ + +h2, h3, h4 { + margin: 0; + padding: 0 0 5px 0; + font-size: 12px; + font-weight: bold; + color: #333; +} + +h2 { + font-size: 14px; + color: #555; + font-weight: bold; +} + +#mochaPage h3 { + display: block; + font-size: 12px; + padding: 6px 0 6px 0; + margin: 0 0 8px 0; + border-bottom: 1px solid #bbb; +} + +#error_div { + color: #f00; + font-weight: bold; +} + +h4 { + font-size: 11px; +} + +a { + color: #e60; + text-decoration: none; + cursor: pointer; +} + +a:hover { + text-decoration: none; +} + +p { + margin: 0; + padding: 0 0 9px 0; +} + +/* List Elements */ + +ul { + list-style: outside; + margin: 0 0 9px 16px; +} + +dt { + font-weight: bold; +} + +dd { + padding: 0 0 9px 0; +} + +/* Code */ + +pre { + background-color: #f6f6f6; + color: #006600; + display: block; + font-family: 'Courier New', Courier, monospace; + font-size: 11px; + max-height: 250px; + overflow: auto; + margin: 0 0 10px 0; + padding: 10px; + border: 1px solid #d1d7dc; + } + +/* Dividers */ + +hr { + background-color: #ddd; + color: #ccc; + height: 1px; + border: 0px; +} + +.vcenter { + vertical-align: middle; +} + +#urls { + width:90%; + height:100%; +} + +#trackersUrls { + width:90%; + height:100%; +} + +#Filters ul { + list-style-type: none; +} + +#Filters ul li { + margin-left: -16px; +} + +#Filters ul img { + padding: 2px 4px; + vertical-align: middle; + width: 16px; + height: 16px; +} + +.selectedFilter { + background-color: #415A8D; + color: #FFFFFF; +} + +.selectedFilter a { + color: #FFFFFF; +} + +#properties { + background-color: #e5e5e5; +} + +a.propButton { + border: 1px solid rgb(85, 81, 91); + /*border-radius: 3px;*/ + padding: 2px; + margin-left: 3px; + margin-right: 3px; +} + +a.propButton img { + margin-bottom: -4px; +} + +.scrollableMenu { + overflow-y: auto; + overflow-x: hidden; +} + +/* context menu specific */ + +.contextMenu { border:1px solid #999; padding:0; background:#eee; list-style-type:none; display:none;} +.contextMenu .separator { border-top:1px solid #999; } +.contextMenu li { margin:0; padding:0;} +.contextMenu li a { + display: block; + padding: 5px 20px 5px 5px; + font-size: 12px; + text-decoration: none; + font-family: tahoma,arial,sans-serif; + color: #000; + white-space: nowrap; +} +.contextMenu li a:hover { background-color:#ddd; } +.contextMenu li a.disabled { color:#ccc; font-style:italic; } +.contextMenu li a.disabled:hover { background-color:#eee; } +.contextMenu li ul { + padding: 0; + border:1px solid #999; padding:0; background:#eee; + list-style-type:none; + position: absolute; + left: -999em; + z-index: 8000; + margin: -29px 0 0 100%; + width: 164px; +} +.contextMenu li ul li a { + position: relative; +} +.contextMenu li a.arrow-right, .contextMenu li a:hover.arrow-right { + background-image: url(../images/skin/arrow-right.gif); + background-repeat: no-repeat; + background-position: right center; +} +.contextMenu li:hover ul, +.contextMenu li.ieHover ul, +.contextMenu li li.ieHover ul, +.contextMenu li li li.ieHover ul, +.contextMenu li li:hover ul, +.contextMenu li li li:hover ul { /* lists nested under hovered list items */ + left: auto; +} + +.contextMenu li img { + width: 16px; + height: 16px; + margin-bottom: -4px; + -ms-interpolation-mode : bicubic; +} + +/* Sliders */ + +.slider { + clear: both; + position: relative; + font-size: 12px; + font-weight: bold; + width: 400px; + margin-bottom: 15px; +} + +.sliderWrapper { + position: relative; + font-size: 1px; + line-height: 1px; + height: 9px; + width: 422px; +} + +.sliderarea { + position: absolute; + top: 0; + left: 0; + height: 7px; + width: 420px; + font-size: 1px; + line-height: 1px; + background: #f2f2f2 url(../images/skin/slider-area.gif) repeat-x; + border: 1px solid #a3a3a3; + border-bottom: 1px solid #ccc; + border-left: 1px solid #ccc; + margin: 0; + padding: 0; + overflow: hidden; +} + +.sliderknob { + position: absolute; + top: 0; + left: 0; + height: 9px; + width: 19px; + font-size: 1px; + line-height: 1px; + background: url(../images/skin/knob.gif) no-repeat; + cursor: pointer; + overflow: hidden; + z-index: 2; +} + +.update { + padding-bottom: 5px; +} + +.mochaToolButton { + margin-right: 10px; +} + +/* Mocha Customization */ +#mochaToolbar { + margin-top: 5px; +} + +#mochaToolbar .divider { + background-image: url(../images/skin/toolbox-divider.gif); + background-repeat: no-repeat; + background-position: left center; + padding-left: 14px; + padding-top: 15px; +} + +.MyMenuIcon { + margin-left: -18px; + margin-bottom: -3px; + padding-right: 5px; +} + +/* Tri-state checkbox */ + +label.tristate { + background: url(../images/3-state-checkbox.gif) 0 0 no-repeat; + display: block; + float: left; + height: 13px; + margin: .15em 8px 5px 0px; + overflow: hidden; + text-indent: -999em; + width: 13px; +} + +label.checked { + background-position: 0 -13px; +} + +label.partial { + background-position: 0 -26px; +} + +fieldset.settings { + border: solid 1px black; + border-radius: 8px; + -webkit-border-radius: 8px; + -moz-border-radius: 8px; + padding: 4px 4px 4px 10px; +} + +fieldset.settings legend { + margin-left: 8px; + padding: 4px; + font-weight: bold; +} + +fieldset.settings label { + padding: 2px; +} + +fieldset.settings .leftLabelSmall { + width: 5em; + float: left; + text-align: right; + margin-right: 0.5em; + display: block; +} + +fieldset.settings .leftLabelLarge { + width: 14em; + float: left; + text-align: right; + margin-right: 0.5em; + display: block; +} + +div.formRow { + clear: left; + display: block; +} + +.filterTitle { + font-weight: bold; + text-transform: uppercase; + padding-left: 5px; +} + +ul.filterList { + margin: 0 0 0 16px; + padding-left: 0; +} + +ul.filterList a { + display: block; +} + +ul.filterList li:hover { + background-color: #e60; +} + +ul.filterList li:hover a { + color: white; +} + +td.generalLabel { + white-space: nowrap; + text-align: right; + width: 1px; + vertical-align: top; +} + +#filesTable { + line-height: 20px; +} + +#trackersTable, #webseedsTable { + line-height: 25px; +} + +#addTrackersPlus { + width: 16px; + cursor: pointer; + margin-bottom: -3px; +} + +.unselectable { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#prop_general { + padding: 2px; +} + +#watched_folders_tab { + border-collapse: collapse; +} + +#watched_folders_tab td, #watched_folders_tab th { + padding: 2px 4px; + border: 1px solid black; +} + +.select-watched-folder-editable { + position:relative; + background-color: white; + border: solid grey 1px; + width: 160px; + height: 20px; +} + +.select-watched-folder-editable select { + position: absolute; + top: 0px; + bottom: 0px; + left: 0px; + border: none; + width: 160px; + margin: 0; +} + +.select-watched-folder-editable input { + position: absolute; + top: 0px; + left: 0px; + width: 140px; + padding: 1px; + border: none; +} + +.select-watched-folder-editable select:focus, .select-editable input:focus { + outline: none; +} + +/* + * Workaround to prevent the transfer list from + * disappearing when zooming in the browser. + */ +#filtersColumn_handle { + margin-left: -1px; +} + +#error_div { + float: left; + font-size: 14px; +} + +.combo_priority { + font-size: 1em; +} + +td.statusBarSeparator { + width: 22px; + background-image: url('../images/skin/toolbox-divider.gif'); + background-repeat: no-repeat; + background-position: center 1px; + background-size: 2px 18px; +} diff -Nru qbittorrent-4.1.3/src/webui/www/public/css/Tabs.css qbittorrent-3.3.15/src/webui/www/public/css/Tabs.css --- qbittorrent-4.1.3/src/webui/www/public/css/Tabs.css 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/css/Tabs.css 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,66 @@ +/* + +Tabs.css for Mocha UI + +Theme: Default + +Copyright: + Copyright (c) 2007-2009 Greg Houston, . + +License: + MIT-style license. + +Required by: + Tabs.js + +*/ + +/* Toolbar Tabs */ + +.toolbarTabs { + padding: 0 5px 2px 2px; + background: url(../images/skin/tabs.gif) repeat-x; + background-position: left -70px; + overflow: visible; +} + +.tab-menu { + padding-top: 1px; + list-style: none; + margin: 0; + padding: 0; + line-height: 16px; + font-size: 11px; +} + +.tab-menu li { + display: block; + float: left; + margin: 0 0 5px 0; + cursor: pointer; + background: url(../images/skin/tabs.gif) repeat-x; + background-position: left -35px; +} + +.tab-menu li.selected { + background: url(../images/skin/tabs.gif) repeat-x; + background-position: left 0; +} + +.tab-menu li a { + display: block; + margin-left: 8px; + padding: 6px 15px 5px 9px; + text-align: center; + font-weight: normal; + color: #181818; + background: url(../images/skin/tabs.gif) repeat-x; + background-position: right -35px; +} + +.tab-menu li.selected a { + color: #181818; + font-weight: bold; + background: url(../images/skin/tabs.gif) repeat-x; + background-position: right 0; +} diff -Nru qbittorrent-4.1.3/src/webui/www/public/css/Window.css qbittorrent-3.3.15/src/webui/www/public/css/Window.css --- qbittorrent-4.1.3/src/webui/www/public/css/Window.css 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/css/Window.css 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,378 @@ +/* + +Window.css for Mocha UI + +Theme: Default + +Copyright: + Copyright (c) 2007-2009 Greg Houston, . + +License: + MIT-style license. + +Required by: + Window.js and Modal.css + +*/ + +/* Windows +---------------------------------------------------------------- */ + +.mocha { + display: none; + overflow: hidden; + background-color: #e5e5e5; +} + +.mocha.isFocused { +} + +.mochaOverlay { + position: absolute; /* This is also set in theme.js in order to make theme transitions smoother */ + top: 0; + left: 0; +} + +/* + + We get a little creative here in order to define a gradient in the CSS using a query + string appended to a background image. + + "from" is the top color of the gradient. "to" is the bottom color of the gradient. + + Both must be hex values without the leading # sign. + +*/ + +.mochaTitlebar { + width: 100%; + overflow: hidden; + background: url(../images/skin/spacer.gif?from=fafafa&to=e5e5e5); +} + +.mochaTitlebar h3 { + font-size: 12px; + line-height: 15px; + font-weight: bold; + margin: 0; + padding: 5px 10px 4px 12px; + color: #888; +} + +.mocha.isFocused .mochaTitlebar h3 { + color: #181818; +} + +.mochaToolbarWrapper { + width: 100%; /* For IE */ + position: relative; + height: 29px; + background: #f1f1f1; + overflow: hidden; + border-top: 1px solid #d9d9d9; +} + +div.mochaToolbarWrapper.bottom { + border: 0; + border-bottom: 1px solid #d9d9d9; +} + +.mochaToolbar { + width: 100%; /* For IE */ + border-top: 1px solid #fff; +} + +.mochaContentBorder { + border-top: 1px solid #dadada; + border-bottom: 1px solid #dadada; +} + +.mochaContentWrapper { /* Has a fixed height and scrollbars if required. */ + font-size: 12px; + overflow: auto; + background: #fff; +} + +.mochaContent { + padding: 10px 12px; +} + +.mocha .handle { + position: absolute; + background: #0f0; + width: 3px; + height: 3px; + z-index: 2; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; /* IE8 */ + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); /* IE6 and 7*/ + opacity: .0; + -moz-opacity: .0; + overflow: hidden; + font-size: 1px; /* For IE6 */ +} + +.mocha .corner { /* Corner resize handles */ + width: 10px; + height: 10px; + background: #f00; +} + +.mocha .cornerSE { /* Bottom right resize handle */ + width: 20px; + height: 20px; + background: #fefefe; /* This is the color of the visible resize handle */ +} + +.mochaCanvasHeader { + position: absolute; + top: 0; + left: 0; + background: transparent; + z-index: -1; + visibility: hidden; + overflow: hidden; +} + +.mochaControls { + position: absolute; + width: 52px; + top: 8px; + right: 8px; + height: 14px; + z-index: 4; + background: transparent; +} + +.mochaCanvasControls { + position: absolute; + top: 8px; + right: 8px; + z-index: 3; + background: transparent; +} + +/* + To use images for these buttons: + 1. Set the useCanvasControls window option to false. + 2. If you use a different button size you may need to reposition the controls. + Modify the controlsOffset window option. + 2. Replcac the background-color with a background-image for each button. + +*/ +.mochaMinimizeButton, .mochaMaximizeButton, .mochaCloseButton { + float: right; + width: 14px; + height: 14px; + font-size: 1px; + cursor: pointer; + z-index: 4; + color: #666; + background-color: #fff; + margin-left: 5px; +} + +.mochaMinimizeButton { + margin-left: 0; +} + +.mochaMaximizeButton { +} + +.mochaCloseButton { +} + +.mochaSpinner{ + display: none; + position: absolute; + bottom: 7px; + left: 6px; + width: 16px; + height: 16px; + background: url(../images/skin/spinner.gif) no-repeat; +} + +.mochaIframe { + width: 100%; +} + +/* Fix for IE6 select z-index issue */ +.zIndexFix { + display: block; + position: absolute; + top: 0; + left: 0; + z-index: -1; + filter: mask(); + width: 100px; + height: 100px; + border: 1px solid transparent; +} + +/* Viewport overlays +---------------------------------------------------------------- */ + +#modalOverlay { + display: none; + position: fixed; + top: 0; + left: 0; + width: 100%; + background: #000; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; /* IE8 */ + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); /* IE6 and 7*/ + opacity: 0; + -moz-opacity: 0; + z-index: 10000; +} + +/* Fix for IE6 select z-index issue */ +#modalFix { + display: none; + position: absolute; + top: 0; + left: 0; + width: 100%; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; /* IE8 */ + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); /* IE6 and 7*/ + opacity: 0; + -moz-opacity: 0; + z-index: 9999; +} + +/* Underlay */ + +#windowUnderlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + background: #fff; +} + +* html #windowUnderlay { + position: absolute; +} + +/* The replaced class is used internally when converting CSS values to Canvas. These classes should not be removed. */ + +.mocha.replaced, .mochaTitlebar.replaced, .mochaMinimizeButton.replaced, .mochaMaximizeButton.replaced, .mochaCloseButton.replaced { + background-color: transparent !important; +} + +.windowClosed { + visibility: hidden; + display: none; + position: absolute; + top: -20000px; + left: -20000px; + z-index: -1; + overflow: hidden; +} + +.windowClosed .mochaContentBorder, .windowClosed .mochaToolbarWrapper, .windowClosed .mochaTitlebar, .windowClosed .mochaControls, +.windowClosed .mochaCanvasControls { + position: absolute; + top: 0; + left: 0; + visibility: hidden; + display: none; + z-index: -1; +} + +/* Modals */ + +.modal2 { + border: 8px solid #fff; +} + +.modal2 .mochaContentBorder { + border-width: 0px; +} + +/* Window Themes */ + +.mocha.no-canvas { + background: #e5e5e5; + border: 1px solid #555; +} + +.mocha.no-canvas .mochaTitlebar { + background: #e5e5e5; +} + +.mocha.transparent .mochaTitlebar h3 { + color: #fff; + display: none; +} + +.mocha.transparent .mochaContentWrapper { + background: transparent; +} + +.mocha.notification { + background: #cedff2; +} + +.mocha.notification .mochaTitlebar { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; /* IE8 */ + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=0); /* IE6 and 7*/ + opacity: .0; + -moz-opacity: 0; +} + +.mocha.notification .mochaContentBorder { + border-width: 0px; +} + +.mocha.notification .mochaContentWrapper { + text-align: center; + font-size: 12px; + font-weight: bold; + background: transparent; +} + +/* Example Window Themes */ + +#about_contentWrapper { + background: #e5e5e5 url(../images/skin/logo2.gif) 3px 3px no-repeat; +} + +#builder_contentWrapper { + background: #f5f5f7; +} + +#json01 .mochaTitlebar { + background: #6dd2db; +} + +#json02 .mochaTitlebar { + background: #6db6db; +} + +#json03 .mochaTitlebar { + background: #6d92db; +} + +.jsonExample .mochaTitlebar h3 { + color: #ddd; +} + +/* This does not work in IE6. */ +.isFocused.jsonExample .mochaTitlebar h3 { + color: #fff; +} + +#fxmorpherExample .mochaContentWrapper { + background: #577a9e; +} + +#clock { + background: #fff; +} + +/* Workaround to make invisible buttons clickable */ +.mochaMinimizeButton.replaced, +.mochaMaximizeButton.replaced, +.mochaCloseButton.replaced { + background-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7) !important; +} \ No newline at end of file diff -Nru qbittorrent-4.1.3/src/webui/www/public/download.html qbittorrent-3.3.15/src/webui/www/public/download.html --- qbittorrent-4.1.3/src/webui/www/public/download.html 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/download.html 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,66 @@ + + + + + QBT_TR(Add Torrent Links)QBT_TR[CONTEXT=downloadFromURL] + + + + + + + +
    +
    +
    +

    QBT_TR(Download Torrents from their URLs or Magnet links)QBT_TR[CONTEXT=HttpServer]

    + +

    QBT_TR(Only one link per line)QBT_TR[CONTEXT=HttpServer]

    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + + +
    +
    + + +
    +
    + +
    +
    +
    + +
    + + diff -Nru qbittorrent-4.1.3/src/webui/www/public/downloadlimit.html qbittorrent-3.3.15/src/webui/www/public/downloadlimit.html --- qbittorrent-4.1.3/src/webui/www/public/downloadlimit.html 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/downloadlimit.html 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,62 @@ + + + + + QBT_TR(Torrent Download Speed Limiting)QBT_TR[CONTEXT=TransferListWidget] + + + + + + + +
    +
    +
    QBT_TR(Download limit:)QBT_TR[CONTEXT=PropertiesWidget] QBT_TR(KiB/s)QBT_TR[CONTEXT=SpeedLimitDialog]
    +
    +
    +
    +
    +
    +
    + + +
    + + + + + diff -Nru qbittorrent-4.1.3/src/webui/www/public/filters.html qbittorrent-3.3.15/src/webui/www/public/filters.html --- qbittorrent-4.1.3/src/webui/www/public/filters.html 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/filters.html 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,50 @@ +QBT_TR(Status)QBT_TR[CONTEXT=TransferListFiltersWidget] + +
    +QBT_TR(Categories)QBT_TR[CONTEXT=TransferListFiltersWidget] +
      +
    + + diff -Nru qbittorrent-4.1.3/src/webui/www/public/login.html qbittorrent-3.3.15/src/webui/www/public/login.html --- qbittorrent-4.1.3/src/webui/www/public/login.html 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/login.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,76 +0,0 @@ - - - - - - qBittorrent QBT_TR(Web UI)QBT_TR[CONTEXT=OptionsDialog] - - - - - - - -
    -

    qBittorrent QBT_TR(Web UI)QBT_TR[CONTEXT=OptionsDialog]

    - -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    - - - diff -Nru qbittorrent-4.1.3/src/webui/www/public/newcategory.html qbittorrent-3.3.15/src/webui/www/public/newcategory.html --- qbittorrent-4.1.3/src/webui/www/public/newcategory.html 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/newcategory.html 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,73 @@ + + + + + QBT_TR(New Category)QBT_TR[CONTEXT=TransferListWidget] + + + + + + +
    +

    QBT_TR(Category)QBT_TR[CONTEXT=TransferListWidget]:

    + +
    + +
    +
    + + diff -Nru qbittorrent-4.1.3/src/webui/www/public/preferences_content.html qbittorrent-3.3.15/src/webui/www/public/preferences_content.html --- qbittorrent-4.1.3/src/webui/www/public/preferences_content.html 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/preferences_content.html 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,1316 @@ +
    +
    + QBT_TR(Hard Disk)QBT_TR[CONTEXT=HttpServer] +
    + + +
    +
    + + + +
    + +
    + + + +

    + QBT_TR(Automatically add torrents from:)QBT_TR[CONTEXT=OptionsDialog]
    + + + + + + + +
    QBT_TR(Monitored Folder)QBT_TR[CONTEXT=ScanFoldersModel]QBT_TR(Override Save Location)QBT_TR[CONTEXT=ScanFoldersModel]
    +
    + + + Add +
    +

    + +    +
    + +    +
    +
    + +
    + + +
    + +
    +
    + +
    +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    + +
    + + +
    + QBT_TR(Supported parameters (case sensitive):)QBT_TR[CONTEXT=OptionsDialog] +
      +
    • QBT_TR(%N: Torrent name)QBT_TR[CONTEXT=OptionsDialog]
    • +
    • QBT_TR(%L: Category)QBT_TR[CONTEXT=OptionsDialog]
    • +
    • QBT_TR(%F: Content path (same as root path for multifile torrent))QBT_TR[CONTEXT=OptionsDialog]
    • +
    • QBT_TR(%R: Root path (first torrent subdirectory path))QBT_TR[CONTEXT=OptionsDialog]
    • +
    • QBT_TR(%D: Save path)QBT_TR[CONTEXT=OptionsDialog]
    • +
    • QBT_TR(%C: Number of files)QBT_TR[CONTEXT=OptionsDialog]
    • +
    • QBT_TR(%Z: Torrent size (bytes))QBT_TR[CONTEXT=OptionsDialog]
    • +
    • QBT_TR(%T: Current tracker)QBT_TR[CONTEXT=OptionsDialog]
    • +
    • QBT_TR(%I: Info hash)QBT_TR[CONTEXT=OptionsDialog]
    • +
    + QBT_TR(Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., "%N"))QBT_TR[CONTEXT=OptionsDialog] +
    +
    +
    + + + + + + + + + +
    +
    + + diff -Nru qbittorrent-4.1.3/src/webui/www/public/preferences.html qbittorrent-3.3.15/src/webui/www/public/preferences.html --- qbittorrent-4.1.3/src/webui/www/public/preferences.html 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/preferences.html 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,51 @@ + + + + + QBT_TR(Download from URLs)QBT_TR[CONTEXT=downloadFromURL] + + + + + + + + + + + + + diff -Nru qbittorrent-4.1.3/src/webui/www/public/properties_content.html qbittorrent-3.3.15/src/webui/www/public/properties_content.html --- qbittorrent-4.1.3/src/webui/www/public/properties_content.html 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/properties_content.html 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,119 @@ +
    +
    + QBT_TR(Transfer)QBT_TR[CONTEXT=PropertiesWidget] + + + + + + + + + + + + + + + + + + + + + + +
    QBT_TR(Time Active:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(ETA:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Connections:)QBT_TR[CONTEXT=PropertiesWidget]
    QBT_TR(Downloaded:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Uploaded:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Seeds:)QBT_TR[CONTEXT=PropertiesWidget]
    QBT_TR(Download Speed:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Upload Speed:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Peers:)QBT_TR[CONTEXT=PropertiesWidget]
    QBT_TR(Download Limit:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Upload Limit:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Wasted:)QBT_TR[CONTEXT=PropertiesWidget]
    QBT_TR(Share Ratio:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Reannounce In:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Last Seen Complete:)QBT_TR[CONTEXT=PropertiesWidget]
    +
    +
    + QBT_TR(Information)QBT_TR[CONTEXT=PropertiesWidget] + + + + + + + + + + + + + + + + +
    QBT_TR(Total Size:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Pieces:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Created By:)QBT_TR[CONTEXT=PropertiesWidget]
    QBT_TR(Added On:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Completed On:)QBT_TR[CONTEXT=PropertiesWidget]QBT_TR(Created On:)QBT_TR[CONTEXT=PropertiesWidget]
    QBT_TR(Torrent Hash:)QBT_TR[CONTEXT=PropertiesWidget]
    QBT_TR(Save Path:)QBT_TR[CONTEXT=PropertiesWidget]
    QBT_TR(Comment:)QBT_TR[CONTEXT=PropertiesWidget]
    +
    +
    + + + + + + + + + + diff -Nru qbittorrent-4.1.3/src/webui/www/public/properties.html qbittorrent-3.3.15/src/webui/www/public/properties.html --- qbittorrent-4.1.3/src/webui/www/public/properties.html 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/properties.html 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,10 @@ + diff -Nru qbittorrent-4.1.3/src/webui/www/public/scripts/client.js qbittorrent-3.3.15/src/webui/www/public/scripts/client.js --- qbittorrent-4.1.3/src/webui/www/public/scripts/client.js 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/scripts/client.js 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,686 @@ +/* + * MIT License + * Copyright (c) 2008 Ishan Arora , + * Christophe Dumez + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +torrentsTable = new TorrentsTable(); +torrentPeersTable = new TorrentPeersTable(); + +var updatePropertiesPanel = function () {}; + +var updateTorrentData = function () {}; +var updateTrackersData = function () {}; +var updateTorrentPeersData = function () {}; +var updateWebSeedsData = function () {}; +var updateTorrentFilesData = function () {}; + +var updateMainData = function () {}; +var alternativeSpeedLimits = false; +var queueing_enabled = true; +var syncMainDataTimerPeriod = 1500; + +var CATEGORIES_ALL = 1; +var CATEGORIES_UNCATEGORIZED = 2; + +var category_list = {}; + +var selected_category = CATEGORIES_ALL; +var setCategoryFilter = function(){}; + +var selected_filter = getLocalStorageItem('selected_filter', 'all'); +var setFilter = function(){}; + +var loadSelectedCategory = function () { + selected_category = getLocalStorageItem('selected_category', CATEGORIES_ALL); +}; +loadSelectedCategory(); + +function genHash(string) { + var hash = 0; + for (var i = 0; i < string.length; i++) { + var c = string.charCodeAt(i); + hash = (c + hash * 31) | 0; + } + return hash; +} + +window.addEvent('load', function () { + + var saveColumnSizes = function () { + var filters_width = $('Filters').getSize().x; + var properties_height_rel = $('propertiesPanel').getSize().y / Window.getSize().y; + localStorage.setItem('filters_width', filters_width); + localStorage.setItem('properties_height_rel', properties_height_rel); + }; + + window.addEvent('resize', function() { + // Resizing might takes some time. + saveColumnSizes.delay(200); + }); + + /*MochaUI.Desktop = new MochaUI.Desktop(); + MochaUI.Desktop.desktop.setStyles({ + 'background': '#fff', + 'visibility': 'visible' + });*/ + MochaUI.Desktop.initialize(); + + var filt_w = localStorage.getItem('filters_width'); + if ($defined(filt_w)) + filt_w = filt_w.toInt(); + else + filt_w = 120; + new MochaUI.Column({ + id : 'filtersColumn', + placement : 'left', + onResize : saveColumnSizes, + width : filt_w, + resizeLimit : [100, 300] + }); + new MochaUI.Column({ + id : 'mainColumn', + placement : 'main', + width : null, + resizeLimit : [100, 300] + }); + + setCategoryFilter = function(hash) { + selected_category = hash; + localStorage.setItem('selected_category', selected_category); + highlightSelectedCategory(); + if (typeof torrentsTable.tableBody != 'undefined') + updateMainData(); + }; + + setFilter = function (f) { + // Visually Select the right filter + $("all_filter").removeClass("selectedFilter"); + $("downloading_filter").removeClass("selectedFilter"); + $("seeding_filter").removeClass("selectedFilter"); + $("completed_filter").removeClass("selectedFilter"); + $("paused_filter").removeClass("selectedFilter"); + $("resumed_filter").removeClass("selectedFilter"); + $("active_filter").removeClass("selectedFilter"); + $("inactive_filter").removeClass("selectedFilter"); + $("errored_filter").removeClass("selectedFilter"); + $(f + "_filter").addClass("selectedFilter"); + selected_filter = f; + localStorage.setItem('selected_filter', f); + // Reload torrents + if (typeof torrentsTable.tableBody != 'undefined') + updateMainData(); + }; + + new MochaUI.Panel({ + id : 'Filters', + title : 'Panel', + header : false, + padding : { + top : 0, + right : 0, + bottom : 0, + left : 0 + }, + loadMethod : 'xhr', + contentURL : 'filters.html', + onContentLoaded : function () { + setFilter(selected_filter); + }, + column : 'filtersColumn', + height : 300 + }); + initializeWindows(); + + // Show Top Toolbar is enabled by default + var showTopToolbar = true; + if (localStorage.getItem('show_top_toolbar') !== null) + showTopToolbar = localStorage.getItem('show_top_toolbar') == "true"; + if (!showTopToolbar) { + $('showTopToolbarLink').firstChild.style.opacity = '0'; + $('mochaToolbar').addClass('invisible'); + } + + var speedInTitle = localStorage.getItem('speed_in_browser_title_bar') == "true"; + if (!speedInTitle) + $('speedInBrowserTitleBarLink').firstChild.style.opacity = '0'; + + // After Show Top Toolbar + MochaUI.Desktop.setDesktopSize(); + + var syncMainDataLastResponseId = 0; + var serverState = {}; + + var removeTorrentFromCategoryList = function(hash) { + if (hash === null || hash === "") + return false; + var removed = false; + Object.each(category_list, function(category) { + if (Object.contains(category.torrents, hash)) { + removed = true; + category.torrents.splice(category.torrents.indexOf(hash), 1); + } + }); + return removed; + }; + + var addTorrentToCategoryList = function(torrent) { + var category = torrent['category']; + if (typeof category === 'undefined') + return false; + if (category.length === 0) { // Empty category + removeTorrentFromCategoryList(torrent['hash']); + return true; + } + var categoryHash = genHash(category); + if (category_list[categoryHash] === null) // This should not happen + category_list[categoryHash] = {name: category, torrents: []}; + if (!Object.contains(category_list[categoryHash].torrents, torrent['hash'])) { + removeTorrentFromCategoryList(torrent['hash']); + category_list[categoryHash].torrents = category_list[categoryHash].torrents.combine([torrent['hash']]); + return true; + } + return false; + }; + + var updateFilter = function(filter, filterTitle) { + $(filter + '_filter').firstChild.childNodes[1].nodeValue = filterTitle.replace('%1', torrentsTable.getFilteredTorrentsNumber(filter, CATEGORIES_ALL)); + }; + + var updateFiltersList = function() { + updateFilter('all', 'QBT_TR(All (%1))QBT_TR[CONTEXT=StatusFiltersWidget]'); + updateFilter('downloading', 'QBT_TR(Downloading (%1))QBT_TR[CONTEXT=StatusFiltersWidget]'); + updateFilter('seeding', 'QBT_TR(Seeding (%1))QBT_TR[CONTEXT=StatusFiltersWidget]'); + updateFilter('completed', 'QBT_TR(Completed (%1))QBT_TR[CONTEXT=StatusFiltersWidget]'); + updateFilter('resumed', 'QBT_TR(Resumed (%1))QBT_TR[CONTEXT=StatusFiltersWidget]'); + updateFilter('paused', 'QBT_TR(Paused (%1))QBT_TR[CONTEXT=StatusFiltersWidget]'); + updateFilter('active', 'QBT_TR(Active (%1))QBT_TR[CONTEXT=StatusFiltersWidget]'); + updateFilter('inactive', 'QBT_TR(Inactive (%1))QBT_TR[CONTEXT=StatusFiltersWidget]'); + updateFilter('errored', 'QBT_TR(Errored (%1))QBT_TR[CONTEXT=StatusFiltersWidget]'); + }; + + var updateCategoryList = function() { + var categoryList = $('filterCategoryList'); + if (!categoryList) + return; + categoryList.empty(); + + var create_link = function(hash, text, count) { + var html = '' + + '' + + escapeHtml(text) + ' (' + count + ')' + ''; + var el = new Element('li', {id: hash, html: html}); + categoriesFilterContextMenu.addTarget(el); + return el; + }; + + var all = torrentsTable.getRowIds().length; + var uncategorized = 0; + Object.each(torrentsTable.rows, function(row) { + if (row['full_data'].category.length === 0) + uncategorized += 1; + }); + categoryList.appendChild(create_link(CATEGORIES_ALL, 'QBT_TR(All)QBT_TR[CONTEXT=CategoryFilterModel]', all)); + categoryList.appendChild(create_link(CATEGORIES_UNCATEGORIZED, 'QBT_TR(Uncategorized)QBT_TR[CONTEXT=CategoryFilterModel]', uncategorized)); + + var sortedCategories = []; + Object.each(category_list, function(category) { + sortedCategories.push(category.name); + }); + sortedCategories.sort(); + + Object.each(sortedCategories, function(categoryName) { + var categoryHash = genHash(categoryName); + var categoryCount = category_list[categoryHash].torrents.length; + categoryList.appendChild(create_link(categoryHash, categoryName, categoryCount)); + }); + + highlightSelectedCategory(); + }; + + var highlightSelectedCategory = function() { + var categoryList = $('filterCategoryList'); + if (!categoryList) + return; + var childrens = categoryList.childNodes; + for (var i in childrens) { + if (childrens[i].id == selected_category) + childrens[i].className = "selectedFilter"; + else + childrens[i].className = ""; + } + }; + + var syncMainDataTimer; + var syncMainData = function () { + var url = new URI('sync/maindata'); + url.setData('rid', syncMainDataLastResponseId); + var request = new Request.JSON({ + url : url, + noCache : true, + method : 'get', + onFailure : function () { + $('error_div').set('html', 'QBT_TR(qBittorrent client is not reachable)QBT_TR[CONTEXT=HttpServer]'); + clearTimeout(syncMainDataTimer); + syncMainDataTimer = syncMainData.delay(2000); + }, + onSuccess : function (response) { + $('error_div').set('html', ''); + if (response) { + var update_categories = false; + var full_update = (response['full_update'] === true); + if (full_update) { + torrentsTable.clear(); + category_list = {}; + } + if (response['rid']) { + syncMainDataLastResponseId = response['rid']; + } + if (response['categories']) { + response['categories'].each(function(category) { + var categoryHash = genHash(category); + category_list[categoryHash] = {name: category, torrents: []}; + }); + update_categories = true; + } + if (response['categories_removed']) { + response['categories_removed'].each(function(category) { + var categoryHash = genHash(category); + delete category_list[categoryHash]; + }); + update_categories = true; + } + if (response['torrents']) { + for (var key in response['torrents']) { + response['torrents'][key]['hash'] = key; + response['torrents'][key]['rowId'] = key; + if (response['torrents'][key]['state']) + response['torrents'][key]['status'] = response['torrents'][key]['state']; + torrentsTable.updateRowData(response['torrents'][key]); + if (addTorrentToCategoryList(response['torrents'][key])) + update_categories = true; + } + } + if (response['torrents_removed']) + response['torrents_removed'].each(function (hash) { + torrentsTable.removeRow(hash); + removeTorrentFromCategoryList(hash); + update_categories = true; // Allways to update All category + }); + torrentsTable.updateTable(full_update); + torrentsTable.altRow(); + if (response['server_state']) { + var tmp = response['server_state']; + for(var k in tmp) + serverState[k] = tmp[k]; + processServerState(); + } + updateFiltersList(); + if (update_categories) { + updateCategoryList(); + torrentsTableContextMenu.updateCategoriesSubMenu(category_list); + } + } + clearTimeout(syncMainDataTimer); + syncMainDataTimer = syncMainData.delay(syncMainDataTimerPeriod); + } + }).send(); + }; + + updateMainData = function() { + torrentsTable.updateTable(); + clearTimeout(syncMainDataTimer); + syncMainDataTimer = syncMainData.delay(100); + }; + + var processServerState = function () { + var transfer_info = friendlyUnit(serverState.dl_info_speed, true); + if (serverState.dl_rate_limit > 0) + transfer_info += " [" + friendlyUnit(serverState.dl_rate_limit, true) + "]"; + transfer_info += " (" + friendlyUnit(serverState.dl_info_data, false) + ")"; + $("DlInfos").set('html', transfer_info); + transfer_info = friendlyUnit(serverState.up_info_speed, true); + if (serverState.up_rate_limit > 0) + transfer_info += " [" + friendlyUnit(serverState.up_rate_limit, true) + "]"; + transfer_info += " (" + friendlyUnit(serverState.up_info_data, false) + ")"; + $("UpInfos").set('html', transfer_info); + if (speedInTitle) { + document.title = "QBT_TR([D: %1, U: %2] qBittorrent %3)QBT_TR[CONTEXT=MainWindow]".replace("%1", friendlyUnit(serverState.dl_info_speed, true)).replace("%2", friendlyUnit(serverState.up_info_speed, true)).replace("%3", "${VERSION}"); + document.title += " QBT_TR(Web UI)QBT_TR[CONTEXT=OptionsDialog]"; + }else + document.title = "qBittorrent ${VERSION} QBT_TR(Web UI)QBT_TR[CONTEXT=OptionsDialog]"; + $('DHTNodes').set('html', 'QBT_TR(DHT: %1 nodes)QBT_TR[CONTEXT=StatusBar]'.replace("%1", serverState.dht_nodes)); + + // Statistics dialog + if (document.getElementById("statisticspage")) { + $('AlltimeDL').set('html', 'QBT_TR(Alltime download:)QBT_TR[CONTEXT=StatsDialog]' + " " + friendlyUnit(serverState.alltime_dl, false)); + $('AlltimeUL').set('html', 'QBT_TR(Alltime upload:)QBT_TR[CONTEXT=StatsDialog]' + " " + friendlyUnit(serverState.alltime_ul, false)); + $('TotalWastedSession').set('html', 'QBT_TR(Total wasted (this session):)QBT_TR[CONTEXT=StatsDialog]' + " " + friendlyUnit(serverState.total_wasted_session, false)); + $('GlobalRatio').set('html', 'QBT_TR(Global ratio:)QBT_TR[CONTEXT=StatsDialog]' + " " + serverState.global_ratio); + $('TotalPeerConnections').set('html', 'QBT_TR(Total peer connections:)QBT_TR[CONTEXT=StatsDialog]' + " " + serverState.total_peer_connections); + $('ReadCacheHits').set('html', 'QBT_TR(Read cache hits:)QBT_TR[CONTEXT=StatsDialog]' + " " + serverState.read_cache_hits); + $('TotalBuffersSize').set('html', 'QBT_TR(Total buffers size:)QBT_TR[CONTEXT=StatsDialog]' + " " + friendlyUnit(serverState.total_buffers_size, false)); + $('WriteCacheOverload').set('html', 'QBT_TR(Write cache overload:)QBT_TR[CONTEXT=StatsDialog]' + " " + serverState.write_cache_overload); + $('ReadCacheOverload').set('html', 'QBT_TR(Read cache overload:)QBT_TR[CONTEXT=StatsDialog]' + " " + serverState.read_cache_overload); + $('QueuedIOJobs').set('html', 'QBT_TR(Queued I/O jobs:)QBT_TR[CONTEXT=StatsDialog]' + " " + serverState.queued_io_jobs); + $('AverageTimeInQueue').set('html', 'QBT_TR(Average time in queue:)QBT_TR[CONTEXT=StatsDialog]' + " " + serverState.average_time_queue); + $('TotalQueuedSize').set('html', 'QBT_TR(Total queued size:)QBT_TR[CONTEXT=StatsDialog]' + " " + friendlyUnit(serverState.total_queued_size, false)); + } + + if (serverState.connection_status == "connected") + $('connectionStatus').src = 'images/skin/connected.png'; + else if (serverState.connection_status == "firewalled") + $('connectionStatus').src = 'images/skin/firewalled.png'; + else + $('connectionStatus').src = 'images/skin/disconnected.png'; + + if (queueing_enabled != serverState.queueing) { + queueing_enabled = serverState.queueing; + torrentsTable.columns['priority'].force_hide = !queueing_enabled; + torrentsTable.updateColumn('priority'); + if (queueing_enabled) { + $('queueingLinks').removeClass('invisible'); + $('queueingButtons').removeClass('invisible'); + $('queueingMenuItems').removeClass('invisible'); + } + else { + $('queueingLinks').addClass('invisible'); + $('queueingButtons').addClass('invisible'); + $('queueingMenuItems').addClass('invisible'); + } + } + + if (alternativeSpeedLimits != serverState.use_alt_speed_limits) { + alternativeSpeedLimits = serverState.use_alt_speed_limits; + updateAltSpeedIcon(alternativeSpeedLimits); + } + + syncMainDataTimerPeriod = serverState.refresh_interval; + if (syncMainDataTimerPeriod < 500) + syncMainDataTimerPeriod = 500; + }; + + var updateAltSpeedIcon = function(enabled) { + if (enabled) + $('alternativeSpeedLimits').src = "images/slow.png"; + else + $('alternativeSpeedLimits').src = "images/slow_off.png"; + }; + + $('alternativeSpeedLimits').addEvent('click', function() { + // Change icon immediately to give some feedback + updateAltSpeedIcon(!alternativeSpeedLimits); + + new Request({url: 'command/toggleAlternativeSpeedLimits', + method: 'post', + onComplete: function() { + alternativeSpeedLimits = !alternativeSpeedLimits; + updateMainData(); + }, + onFailure: function() { + // Restore icon in case of failure + updateAltSpeedIcon(alternativeSpeedLimits); + } + }).send(); + }); + + $('DlInfos').addEvent('click', globalDownloadLimitFN); + $('UpInfos').addEvent('click', globalUploadLimitFN); + + $('showTopToolbarLink').addEvent('click', function(e) { + showTopToolbar = !showTopToolbar; + localStorage.setItem('show_top_toolbar', showTopToolbar.toString()); + if (showTopToolbar) { + $('showTopToolbarLink').firstChild.style.opacity = '1'; + $('mochaToolbar').removeClass('invisible'); + } + else { + $('showTopToolbarLink').firstChild.style.opacity = '0'; + $('mochaToolbar').addClass('invisible'); + } + MochaUI.Desktop.setDesktopSize(); + }); + + $('speedInBrowserTitleBarLink').addEvent('click', function(e) { + speedInTitle = !speedInTitle; + localStorage.setItem('speed_in_browser_title_bar', speedInTitle.toString()); + if (speedInTitle) + $('speedInBrowserTitleBarLink').firstChild.style.opacity = '1'; + else + $('speedInBrowserTitleBarLink').firstChild.style.opacity = '0'; + processServerState(); + }); + + $('StatisticsLink').addEvent('click', StatisticsLinkFN); + + new MochaUI.Panel({ + id : 'transferList', + title : 'Panel', + header : false, + padding : { + top : 0, + right : 0, + bottom : 0, + left : 0 + }, + loadMethod : 'xhr', + contentURL : 'transferlist.html', + onContentLoaded : function () { + updateMainData(); + }, + column : 'mainColumn', + onResize : saveColumnSizes, + height : null + }); + var prop_h = localStorage.getItem('properties_height_rel'); + if ($defined(prop_h)) + prop_h = prop_h.toFloat() * Window.getSize().y; + else + prop_h = Window.getSize().y / 2.0; + new MochaUI.Panel({ + id : 'propertiesPanel', + title : 'Panel', + header : true, + padding : { + top : 0, + right : 0, + bottom : 0, + left : 0 + }, + contentURL : 'properties_content.html', + require : { + css : ['css/Tabs.css', 'css/dynamicTable.css'], + js : ['scripts/prop-general.js', 'scripts/prop-trackers.js', 'scripts/prop-webseeds.js', 'scripts/prop-files.js'], + }, + tabsURL : 'properties.html', + tabsOnload : function() { + MochaUI.initializeTabs('propertiesTabs'); + + updatePropertiesPanel = function() { + if (!$('prop_general').hasClass('invisible')) + updateTorrentData(); + else if (!$('prop_trackers').hasClass('invisible')) + updateTrackersData(); + else if (!$('prop_peers').hasClass('invisible')) + updateTorrentPeersData(); + else if (!$('prop_webseeds').hasClass('invisible')) + updateWebSeedsData(); + else if (!$('prop_files').hasClass('invisible')) + updateTorrentFilesData(); + }; + + $('PropGeneralLink').addEvent('click', function(e){ + $('prop_general').removeClass("invisible"); + $('prop_trackers').addClass("invisible"); + $('prop_webseeds').addClass("invisible"); + $('prop_files').addClass("invisible"); + $('prop_peers').addClass("invisible"); + updatePropertiesPanel(); + localStorage.setItem('selected_tab', this.id); + }); + + $('PropTrackersLink').addEvent('click', function(e){ + $('prop_trackers').removeClass("invisible"); + $('prop_general').addClass("invisible"); + $('prop_webseeds').addClass("invisible"); + $('prop_files').addClass("invisible"); + $('prop_peers').addClass("invisible"); + updatePropertiesPanel(); + localStorage.setItem('selected_tab', this.id); + }); + + $('PropPeersLink').addEvent('click', function(e){ + $('prop_peers').removeClass("invisible"); + $('prop_trackers').addClass("invisible"); + $('prop_general').addClass("invisible"); + $('prop_webseeds').addClass("invisible"); + $('prop_files').addClass("invisible"); + updatePropertiesPanel(); + localStorage.setItem('selected_tab', this.id); + }); + + $('PropWebSeedsLink').addEvent('click', function(e){ + $('prop_webseeds').removeClass("invisible"); + $('prop_general').addClass("invisible"); + $('prop_trackers').addClass("invisible"); + $('prop_files').addClass("invisible"); + $('prop_peers').addClass("invisible"); + updatePropertiesPanel(); + localStorage.setItem('selected_tab', this.id); + }); + + $('PropFilesLink').addEvent('click', function(e){ + $('prop_files').removeClass("invisible"); + $('prop_general').addClass("invisible"); + $('prop_trackers').addClass("invisible"); + $('prop_webseeds').addClass("invisible"); + $('prop_peers').addClass("invisible"); + updatePropertiesPanel(); + localStorage.setItem('selected_tab', this.id); + }); + + $('propertiesPanel_collapseToggle').addEvent('click', function(e){ + updatePropertiesPanel(); + }); + }, + column : 'mainColumn', + height : prop_h + }); +}); + +function closeWindows() { + MochaUI.closeAll(); +} + +var keyboardEvents = new Keyboard({ + defaultEventType: 'keydown', + events: { + 'ctrl+a': function(event) { + torrentsTable.selectAll(); + event.preventDefault(); + }, + 'delete': function(event) { + deleteFN(); + event.preventDefault(); + } + } +}); + +keyboardEvents.activate(); + +var loadTorrentPeersTimer; +var syncTorrentPeersLastResponseId = 0; +var show_flags = true; +var loadTorrentPeersData = function(){ + if ($('prop_peers').hasClass('invisible') || + $('propertiesPanel_collapseToggle').hasClass('panel-expand')) { + syncTorrentPeersLastResponseId = 0; + torrentPeersTable.clear(); + return; + } + var current_hash = torrentsTable.getCurrentTorrentHash(); + if (current_hash === "") { + syncTorrentPeersLastResponseId = 0; + torrentPeersTable.clear(); + clearTimeout(loadTorrentPeersTimer); + loadTorrentPeersTimer = loadTorrentPeersData.delay(syncMainDataTimerPeriod); + return; + } + var url = new URI('sync/torrent_peers'); + url.setData('rid', syncTorrentPeersLastResponseId); + url.setData('hash', current_hash); + var request = new Request.JSON({ + url: url, + noCache: true, + method: 'get', + onFailure: function() { + $('error_div').set('html', 'QBT_TR(qBittorrent client is not reachable)QBT_TR[CONTEXT=HttpServer]'); + clearTimeout(loadTorrentPeersTimer); + loadTorrentPeersTimer = loadTorrentPeersData.delay(5000); + }, + onSuccess: function(response) { + $('error_div').set('html', ''); + if (response) { + var full_update = (response['full_update'] === true); + if (full_update) { + torrentPeersTable.clear(); + } + if (response['rid']) { + syncTorrentPeersLastResponseId = response['rid']; + } + if (response['peers']) { + for (var key in response['peers']) { + response['peers'][key]['rowId'] = key; + + if (response['peers'][key]['client']) + response['peers'][key]['client'] = escapeHtml(response['peers'][key]['client']); + + torrentPeersTable.updateRowData(response['peers'][key]); + } + } + if (response['peers_removed']) + response['peers_removed'].each(function (hash) { + torrentPeersTable.removeRow(hash); + }); + torrentPeersTable.updateTable(full_update); + torrentPeersTable.altRow(); + + if (response['show_flags']) { + if (show_flags != response['show_flags']) { + show_flags = response['show_flags']; + torrentPeersTable.columns['country'].force_hide = !show_flags; + torrentPeersTable.updateColumn('country'); + } + } + } + else { + torrentPeersTable.clear(); + } + clearTimeout(loadTorrentPeersTimer); + loadTorrentPeersTimer = loadTorrentPeersData.delay(syncMainDataTimerPeriod); + } + }).send(); +}; + +updateTorrentPeersData = function(){ + clearTimeout(loadTorrentPeersTimer); + loadTorrentPeersData(); +}; diff -Nru qbittorrent-4.1.3/src/webui/www/public/scripts/contextmenu.js qbittorrent-3.3.15/src/webui/www/public/scripts/contextmenu.js --- qbittorrent-4.1.3/src/webui/www/public/scripts/contextmenu.js 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/scripts/contextmenu.js 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,375 @@ +var lastShownContexMenu = null; +var ContextMenu = new Class({ + //implements + Implements: [Options, Events], + + //options + options: { + actions: {}, + menu: 'menu_id', + stopEvent: true, + targets: 'body', + trigger: 'contextmenu', + offsets: { + x: 0, + y: 0 + }, + onShow: $empty, + onHide: $empty, + onClick: $empty, + fadeSpeed: 200 + }, + + //initialization + initialize: function(options) { + //set options + this.setOptions(options); + + //option diffs menu + this.menu = $(this.options.menu); + this.targets = $$(this.options.targets); + + //fx + this.fx = new Fx.Tween(this.menu, { + property: 'opacity', + duration: this.options.fadeSpeed, + onComplete: function() { + if (this.getStyle('opacity')) { + this.setStyle('visibility', 'visible'); + } + else { + this.setStyle('visibility', 'hidden'); + } + }.bind(this.menu) + }); + + //hide and begin the listener + this.hide().startListener(); + + //hide the menu + this.menu.setStyles({ + 'position': 'absolute', + 'top': '-900000px', + 'display': 'block' + }); + }, + + adjustMenuPosition: function(e) { + this.updateMenuItems(); + + var scrollableMenuMaxHeight = document.documentElement.clientHeight * 0.75; + + if (this.menu.hasClass('scrollableMenu')) + this.menu.setStyle('max-height', scrollableMenuMaxHeight); + + // draw the menu off-screen to know the menu dimentions + this.menu.setStyles({ + left: '-999em', + top: '-999em' + }); + + // position the menu + var xPosMenu = e.page.x + this.options.offsets.x; + var yPosMenu = e.page.y + this.options.offsets.y; + if (xPosMenu + this.menu.offsetWidth > document.documentElement.clientWidth) + xPosMenu -= this.menu.offsetWidth; + if (yPosMenu + this.menu.offsetHeight > document.documentElement.clientHeight) + yPosMenu = document.documentElement.clientHeight - this.menu.offsetHeight; + if (xPosMenu < 0) + xPosMenu = 0; + if (yPosMenu < 0) + yPosMenu = 0; + this.menu.setStyles({ + left: xPosMenu, + top: yPosMenu, + position: 'absolute', + 'z-index': '2000' + }); + + // position the sub-menu + var uls = this.menu.getElementsByTagName('ul'); + for (var i = 0; i < uls.length; i++) { + var ul = uls[i]; + if (ul.hasClass('scrollableMenu')) + ul.setStyle('max-height', scrollableMenuMaxHeight); + var rectParent = ul.parentNode.getBoundingClientRect(); + var xPosOrigin = rectParent.left; + var yPosOrigin = rectParent.bottom; + var xPos = xPosOrigin + rectParent.width - 1; + var yPos = yPosOrigin - rectParent.height - 1; + if (xPos + ul.offsetWidth > document.documentElement.clientWidth) + xPos -= (ul.offsetWidth + rectParent.width - 2); + if (yPos + ul.offsetHeight > document.documentElement.clientHeight) + yPos = document.documentElement.clientHeight - ul.offsetHeight; + if (xPos < 0) + xPos = 0; + if (yPos < 0) + yPos = 0; + ul.setStyles({ + 'margin-left': xPos - xPosOrigin, + 'margin-top': yPos - yPosOrigin + }); + } + }, + + addTarget: function(t) { + this.targets[this.targets.length] = t; + t.addEvent(this.options.trigger, function(e) { + //enabled? + if (!this.options.disabled) { + //prevent default, if told to + if (this.options.stopEvent) { + e.stop(); + } + //record this as the trigger + this.options.element = $(t); + this.adjustMenuPosition(e); + //show the menu + this.show(); + } + }.bind(this)); + t.addEvent('click', function(e) { + this.hide(); + }.bind(this)); + }, + + //get things started + startListener: function() { + /* all elements */ + this.targets.each(function(el) { + /* show the menu */ + el.addEvent(this.options.trigger, function(e) { + //enabled? + if (!this.options.disabled) { + //prevent default, if told to + if (this.options.stopEvent) { + e.stop(); + } + //record this as the trigger + this.options.element = $(el); + this.adjustMenuPosition(e); + //show the menu + this.show(); + } + }.bind(this)); + el.addEvent('click', function(e) { + this.hide(); + }.bind(this)); + }, this); + + /* menu items */ + this.menu.getElements('a').each(function(item) { + item.addEvent('click', function(e) { + e.preventDefault(); + if (!item.hasClass('disabled')) { + this.execute(item.get('href').split('#')[1], $(this.options.element)); + this.fireEvent('click', [item, e]); + } + }.bind(this)); + }, this); + + //hide on body click + $(document.body).addEvent('click', function() { + this.hide(); + }.bind(this)); + }, + + updateMenuItems: function () {}, + + //show menu + show: function (trigger) { + if (lastShownContexMenu && lastShownContexMenu != this) + lastShownContexMenu.hide(); + this.fx.start(1); + this.fireEvent('show'); + this.shown = true; + lastShownContexMenu = this; + return this; + }, + + //hide the menu + hide: function (trigger) { + if (this.shown) { + this.fx.start(0); + //this.menu.fade('out'); + this.fireEvent('hide'); + this.shown = false; + } + return this; + }, + + setItemChecked: function (item, checked) { + this.menu.getElement('a[href$=' + item + ']').firstChild.style.opacity = + checked ? '1' : '0'; + return this; + }, + + getItemChecked: function (item) { + return '0' != this.menu.getElement('a[href$=' + item + ']').firstChild.style.opacity; + }, + + //hide an item + hideItem: function (item) { + this.menu.getElement('a[href$=' + item + ']').parentNode.addClass('invisible'); + return this; + }, + + //show an item + showItem: function (item) { + this.menu.getElement('a[href$=' + item + ']').parentNode.removeClass('invisible'); + return this; + }, + + //disable the entire menu + disable: function () { + this.options.disabled = true; + return this; + }, + + //enable the entire menu + enable: function () { + this.options.disabled = false; + return this; + }, + + //execute an action + execute: function (action, element) { + if (this.options.actions[action]) { + this.options.actions[action](element, this, action); + } + return this; + } +}); + +var TorrentsTableContextMenu = new Class({ + Extends: ContextMenu, + + updateMenuItems: function () { + all_are_seq_dl = true; + there_are_seq_dl = false; + all_are_f_l_piece_prio = true; + there_are_f_l_piece_prio = false; + all_are_downloaded = true; + all_are_paused = true; + there_are_paused = false; + all_are_force_start = true; + there_are_force_start = false; + all_are_super_seeding = true; + + var h = torrentsTable.selectedRowsIds(); + h.each(function(item, index){ + var data = torrentsTable.rows.get(item).full_data; + + if (data['seq_dl'] !== true) + all_are_seq_dl = false; + else + there_are_seq_dl = true; + + if (data['f_l_piece_prio'] !== true) + all_are_f_l_piece_prio = false; + else + there_are_f_l_piece_prio = true; + + if (data['progress'] != 1.0) // not downloaded + all_are_downloaded = false; + else if (data['super_seeding'] !== true) + all_are_super_seeding = false; + + if (data['state'] != 'pausedUP' && data['state'] != 'pausedDL') + all_are_paused = false; + else + there_are_paused = true; + + if (data['force_start'] !== true) + all_are_force_start = false; + else + there_are_force_start = true; + }); + + show_seq_dl = true; + + if (!all_are_seq_dl && there_are_seq_dl) + show_seq_dl = false; + + show_f_l_piece_prio = true; + + if (!all_are_f_l_piece_prio && there_are_f_l_piece_prio) + show_f_l_piece_prio = false; + + if (all_are_downloaded) { + this.hideItem('DownloadLimit'); + this.menu.getElement('a[href$=UploadLimit]').parentNode.addClass('separator'); + this.hideItem('SequentialDownload'); + this.hideItem('FirstLastPiecePrio'); + this.showItem('SuperSeeding'); + this.setItemChecked('SuperSeeding', all_are_super_seeding); + } else { + if (!show_seq_dl && show_f_l_piece_prio) + this.menu.getElement('a[href$=FirstLastPiecePrio]').parentNode.addClass('separator'); + else + this.menu.getElement('a[href$=FirstLastPiecePrio]').parentNode.removeClass('separator'); + + if (show_seq_dl) + this.showItem('SequentialDownload'); + else + this.hideItem('SequentialDownload'); + + if (show_f_l_piece_prio) + this.showItem('FirstLastPiecePrio'); + else + this.hideItem('FirstLastPiecePrio'); + + this.setItemChecked('SequentialDownload', all_are_seq_dl); + this.setItemChecked('FirstLastPiecePrio', all_are_f_l_piece_prio); + + this.showItem('DownloadLimit'); + this.menu.getElement('a[href$=UploadLimit]').parentNode.removeClass('separator'); + this.hideItem('SuperSeeding'); + } + + this.showItem('Start'); + this.showItem('Pause'); + this.showItem('ForceStart'); + if (all_are_paused) + this.hideItem('Pause'); + else if (all_are_force_start) + this.hideItem('ForceStart'); + else if (!there_are_paused && !there_are_force_start) + this.hideItem('Start'); + }, + + updateCategoriesSubMenu : function (category_list) { + var categoryList = $('contextCategoryList'); + categoryList.empty(); + categoryList.appendChild(new Element('li', {html: 'QBT_TR(New...)QBT_TR[CONTEXT=TransferListWidget] QBT_TR(New...)QBT_TR[CONTEXT=TransferListWidget]'})); + categoryList.appendChild(new Element('li', {html: 'QBT_TR(Reset)QBT_TR[CONTEXT=TransferListWidget] QBT_TR(Reset)QBT_TR[CONTEXT=TransferListWidget]'})); + + var sortedCategories = []; + Object.each(category_list, function (category) { + sortedCategories.push(category.name); + }); + sortedCategories.sort(); + + var first = true; + Object.each(sortedCategories, function (categoryName) { + var categoryHash = genHash(categoryName); + var el = new Element('li', {html: ' ' + escapeHtml(categoryName) + ''}); + if (first) { + el.addClass('separator'); + first = false; + } + categoryList.appendChild(el); + }); + } +}); + +var CategoriesFilterContextMenu = new Class({ + Extends: ContextMenu, + updateMenuItems: function () { + var id = this.options.element.id; + if (id != CATEGORIES_ALL && id != CATEGORIES_UNCATEGORIZED) + this.showItem('DeleteCategory'); + else + this.hideItem('DeleteCategory'); + } +}); diff -Nru qbittorrent-4.1.3/src/webui/www/public/scripts/download.js qbittorrent-3.3.15/src/webui/www/public/scripts/download.js --- qbittorrent-4.1.3/src/webui/www/public/scripts/download.js 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/scripts/download.js 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,42 @@ +/* + * MIT License + * Copyright (c) 2008 Ishan Arora + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +getSavePath = function() { + var req = new Request({ + url: 'command/getSavePath', + method: 'get', + noCache: true, + onFailure: function() { + alert("Could not contact qBittorrent"); + }, + onSuccess: function(data) { + if (data) { + $('savepath').setProperty('value', data); + } + } + }).send(); +}; + +$(window).addEventListener("load", function() { + getSavePath(); +}); diff -Nru qbittorrent-4.1.3/src/webui/www/public/scripts/dynamicTable.js qbittorrent-3.3.15/src/webui/www/public/scripts/dynamicTable.js --- qbittorrent-4.1.3/src/webui/www/public/scripts/dynamicTable.js 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/scripts/dynamicTable.js 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,1264 @@ +/* + * MIT License + * Copyright (c) 2008 Ishan Arora & Christophe Dumez + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/************************************************************** + + Script : Dynamic Table + Version : 0.5 + Authors : Ishan Arora & Christophe Dumez + Desc : Programable sortable table + Licence : Open Source MIT Licence + + **************************************************************/ + +var DynamicTableHeaderContextMenuClass = null; +var ProgressColumnWidth = -1; + +var DynamicTable = new Class({ + + initialize : function () {}, + + setup : function (dynamicTableDivId, dynamicTableFixedHeaderDivId, contextMenu) { + this.dynamicTableDivId = dynamicTableDivId; + this.dynamicTableFixedHeaderDivId = dynamicTableFixedHeaderDivId; + this.fixedTableHeader = $(dynamicTableFixedHeaderDivId).getElements('tr')[0]; + this.hiddenTableHeader = $(dynamicTableDivId).getElements('tr')[0]; + this.tableBody = $(dynamicTableDivId).getElements('tbody')[0]; + this.rows = new Hash(); + this.selectedRows = []; + this.columns = []; + this.contextMenu = contextMenu; + this.sortedColumn = getLocalStorageItem('sorted_column_' + this.dynamicTableDivId, 0); + this.reverseSort = getLocalStorageItem('reverse_sort_' + this.dynamicTableDivId, '0'); + this.initColumns(); + this.loadColumnsOrder(); + this.updateTableHeaders(); + this.setupCommonEvents(); + this.setupHeaderEvents(); + this.setupHeaderMenu(); + }, + + setupCommonEvents : function () { + var scrollFn = function() { + $(this.dynamicTableFixedHeaderDivId).getElements('table')[0].style.left = + -$(this.dynamicTableDivId).scrollLeft + 'px'; + }.bind(this); + + $(this.dynamicTableDivId).addEvent('scroll', scrollFn); + + var resizeFn = function() { + var panel = $(this.dynamicTableDivId).getParent('.panel'); + var h = panel.getBoundingClientRect().height - $(this.dynamicTableFixedHeaderDivId).getBoundingClientRect().height; + $(this.dynamicTableDivId).style.height = h + 'px'; + + // Workaround due to inaccurate calculation of elements heights by browser + + var n = 2; + + while (panel.clientWidth != panel.offsetWidth && n > 0) { // is panel vertical scrollbar visible ? + n--; + h -= 0.5; + $(this.dynamicTableDivId).style.height = h + 'px'; + } + + this.lastPanelHeight = panel.getBoundingClientRect().height; + }.bind(this); + + $(this.dynamicTableDivId).getParent('.panel').addEvent('resize', resizeFn); + + this.lastPanelHeight = 0; + + // Workaround. Resize event is called not always (for example it isn't called when browser window changes it's size) + + var checkResizeFn = function() { + var panel = $(this.dynamicTableDivId).getParent('.panel'); + if (this.lastPanelHeight != panel.getBoundingClientRect().height) { + this.lastPanelHeight = panel.getBoundingClientRect().height; + panel.fireEvent('resize'); + } + }.bind(this); + + setInterval(checkResizeFn, 500); + }, + + setupHeaderEvents : function () { + this.currentHeaderAction = ''; + this.canResize = false; + + var resetElementBorderStyle = function (el, side) { + if (side === 'left' || side !== 'right') { + el.setStyle('border-left-style', ''); + el.setStyle('border-left-color', ''); + el.setStyle('border-left-width', ''); + } + if (side === 'right' || side !== 'left') { + el.setStyle('border-right-style', ''); + el.setStyle('border-right-color', ''); + el.setStyle('border-right-width', ''); + } + }; + + var mouseMoveFn = function (e) { + var brect = e.target.getBoundingClientRect(); + var mouseXRelative = e.event.clientX - brect.left; + if (this.currentHeaderAction === '') { + if (brect.width - mouseXRelative < 5) { + this.resizeTh = e.target; + this.canResize = true; + e.target.getParent("tr").style.cursor = 'col-resize'; + } + else if ((mouseXRelative < 5) && e.target.getPrevious('[class=""]')) { + this.resizeTh = e.target.getPrevious('[class=""]'); + this.canResize = true; + e.target.getParent("tr").style.cursor = 'col-resize'; + } else { + this.canResize = false; + e.target.getParent("tr").style.cursor = ''; + } + } + if (this.currentHeaderAction === 'drag') { + var previousVisibleSibling = e.target.getPrevious('[class=""]'); + var borderChangeElement = previousVisibleSibling; + var changeBorderSide = 'right'; + + if (mouseXRelative > brect.width / 2) { + borderChangeElement = e.target; + this.dropSide = 'right'; + } + else { + this.dropSide = 'left'; + } + + e.target.getParent("tr").style.cursor = 'move'; + + if (!previousVisibleSibling) { // right most column + borderChangeElement = e.target; + + if (mouseXRelative <= brect.width / 2) + changeBorderSide = 'left'; + } + + borderChangeElement.setStyle('border-' + changeBorderSide + '-style', 'solid'); + borderChangeElement.setStyle('border-' + changeBorderSide + '-color', '#e60'); + borderChangeElement.setStyle('border-' + changeBorderSide + '-width', 'initial'); + + resetElementBorderStyle(borderChangeElement, changeBorderSide === 'right' ? 'left' : 'right'); + + borderChangeElement.getSiblings('[class=""]').each(function(el){ + resetElementBorderStyle(el); + }); + } + this.lastHoverTh = e.target; + this.lastClientX = e.event.clientX; + }.bind(this); + + var mouseOutFn = function (e) { + resetElementBorderStyle(e.target); + }.bind(this); + + var onBeforeStart = function (el) { + this.clickedTh = el; + this.currentHeaderAction = 'start'; + this.dragMovement = false; + this.dragStartX = this.lastClientX; + }.bind(this); + + var onStart = function (el, event) { + if (this.canResize) { + this.currentHeaderAction = 'resize'; + this.startWidth = this.resizeTh.getStyle('width').toFloat(); + } + else { + this.currentHeaderAction = 'drag'; + el.setStyle('background-color', '#C1D5E7'); + } + }.bind(this); + + var onDrag = function (el, event) { + if (this.currentHeaderAction === 'resize') { + var width = this.startWidth + (event.page.x - this.dragStartX); + if (width < 16) + width = 16; + this.columns[this.resizeTh.columnName].width = width; + this.updateColumn(this.resizeTh.columnName); + } + }.bind(this); + + var onComplete = function (el, event) { + resetElementBorderStyle(this.lastHoverTh); + el.setStyle('background-color', ''); + if (this.currentHeaderAction === 'resize') + localStorage.setItem('column_' + this.resizeTh.columnName + '_width_' + this.dynamicTableDivId, this.columns[this.resizeTh.columnName].width); + if ((this.currentHeaderAction === 'drag') && (el !== this.lastHoverTh)) { + this.saveColumnsOrder(); + var val = localStorage.getItem('columns_order_' + this.dynamicTableDivId).split(','); + val.erase(el.columnName); + var pos = val.indexOf(this.lastHoverTh.columnName); + if (this.dropSide === 'right') pos++; + val.splice(pos, 0, el.columnName); + localStorage.setItem('columns_order_' + this.dynamicTableDivId, val.join(',')); + this.loadColumnsOrder(); + this.updateTableHeaders(); + while (this.tableBody.firstChild) + this.tableBody.removeChild(this.tableBody.firstChild); + this.updateTable(true); + } + if (this.currentHeaderAction === 'drag') { + resetElementBorderStyle(el); + el.getSiblings('[class=""]').each(function(el){ + resetElementBorderStyle(el); + }); + } + this.currentHeaderAction = ''; + }.bind(this); + + var onCancel = function (el) { + this.currentHeaderAction = ''; + this.setSortedColumn(el.columnName); + }.bind(this); + + var ths = this.fixedTableHeader.getElements('th'); + + for (var i = 0; i < ths.length; i++) { + var th = ths[i]; + th.addEvent('mousemove', mouseMoveFn); + th.addEvent('mouseout', mouseOutFn); + th.makeResizable({ + modifiers : {x: '', y: ''}, + onBeforeStart : onBeforeStart, + onStart : onStart, + onDrag : onDrag, + onComplete : onComplete, + onCancel : onCancel + }); + } + }, + + setupDynamicTableHeaderContextMenuClass : function () { + if (!DynamicTableHeaderContextMenuClass) { + DynamicTableHeaderContextMenuClass = new Class({ + Extends: ContextMenu, + updateMenuItems: function () { + for (var i = 0; i < this.dynamicTable.columns.length; i++) { + if (this.dynamicTable.columns[i].caption === '') + continue; + if (this.dynamicTable.columns[i].visible !== '0') + this.setItemChecked(this.dynamicTable.columns[i].name, true); + else + this.setItemChecked(this.dynamicTable.columns[i].name, false); + } + } + }); + } + }, + + showColumn : function (columnName, show) { + this.columns[columnName].visible = show ? '1' : '0'; + localStorage.setItem('column_' + columnName + '_visible_' + this.dynamicTableDivId, show ? '1' : '0'); + this.updateColumn(columnName); + }, + + setupHeaderMenu : function () { + this.setupDynamicTableHeaderContextMenuClass(); + + var menuId = this.dynamicTableDivId + '_headerMenu'; + + var ul = new Element('ul', {id: menuId, class: 'contextMenu scrollableMenu'}); + + var createLi = function(columnName, text) { + var html = '' + escapeHtml(text) + ''; + return new Element('li', {html: html}); + }; + + var actions = {}; + + var onMenuItemClicked = function (element, ref, action) { + this.showColumn(action, this.columns[action].visible === '0'); + }.bind(this); + + for (var i = 0; i < this.columns.length; i++) { + var text = this.columns[i].caption; + if (text === '') + continue; + ul.appendChild(createLi(this.columns[i].name, text)); + actions[this.columns[i].name] = onMenuItemClicked; + } + + ul.inject(document.body); + + this.headerContextMenu = new DynamicTableHeaderContextMenuClass({ + targets: '#' + this.dynamicTableFixedHeaderDivId + ' tr', + actions: actions, + menu : menuId, + offsets : { + x : -15, + y : 2 + } + }); + + this.headerContextMenu.dynamicTable = this; + }, + + initColumns : function () {}, + + newColumn : function (name, style, caption, defaultWidth, defaultVisible) { + var column = {}; + column['name'] = name; + column['visible'] = getLocalStorageItem('column_' + name + '_visible_' + this.dynamicTableDivId, defaultVisible ? '1' : '0'); + column['force_hide'] = false; + column['caption'] = caption; + column['style'] = style; + column['width'] = getLocalStorageItem('column_' + name + '_width_' + this.dynamicTableDivId, defaultWidth); + column['dataProperties'] = [name]; + column['getRowValue'] = function (row, pos) { + if (pos === undefined) + pos = 0; + return row['full_data'][this.dataProperties[pos]]; + }; + column['compareRows'] = function (row1, row2) { + if (this.getRowValue(row1) < this.getRowValue(row2)) + return -1; + else if (this.getRowValue(row1) > this.getRowValue(row2)) + return 1; + else return 0; + }; + column['updateTd'] = function (td, row) { + td.innerHTML = this.getRowValue(row); + }; + column['onResize'] = null; + this.columns.push(column); + this.columns[name] = column; + + this.hiddenTableHeader.appendChild(new Element('th')); + this.fixedTableHeader.appendChild(new Element('th')); + }, + + loadColumnsOrder : function () { + var columnsOrder = []; + var val = localStorage.getItem('columns_order_' + this.dynamicTableDivId); + if (val === null || val === undefined) return; + val.split(',').forEach(function(v) { + if ((v in this.columns) && (!columnsOrder.contains(v))) + columnsOrder.push(v); + }.bind(this)); + + for (i = 0; i < this.columns.length; i++) + if (!columnsOrder.contains(this.columns[i].name)) + columnsOrder.push(this.columns[i].name); + + for (i = 0; i < this.columns.length; i++) + this.columns[i] = this.columns[columnsOrder[i]]; + }, + + saveColumnsOrder : function () { + val = ''; + for (i = 0; i < this.columns.length; i++) { + if (i > 0) + val += ','; + val += this.columns[i].name; + } + localStorage.setItem('columns_order_' + this.dynamicTableDivId, val); + }, + + updateTableHeaders : function () { + this.updateHeader(this.hiddenTableHeader); + this.updateHeader(this.fixedTableHeader); + }, + + updateHeader : function (header) { + var ths = header.getElements('th'); + + for (var i = 0; i < ths.length; i++) { + th = ths[i]; + th._this = this; + th.setAttribute('title', this.columns[i].caption); + th.innerHTML = this.columns[i].caption; + th.setAttribute('style', 'width: ' + this.columns[i].width + 'px;' + this.columns[i].style); + th.columnName = this.columns[i].name; + if ((this.columns[i].visible == '0') || this.columns[i].force_hide) + th.addClass('invisible'); + else + th.removeClass('invisible'); + } + }, + + getColumnPos : function (columnName) { + for (var i = 0; i < this.columns.length; i++) + if (this.columns[i].name == columnName) + return i; + return -1; + }, + + updateColumn : function (columnName) { + var pos = this.getColumnPos(columnName); + var visible = ((this.columns[pos].visible != '0') && !this.columns[pos].force_hide); + var ths = this.hiddenTableHeader.getElements('th'); + var fths = this.fixedTableHeader.getElements('th'); + var trs = this.tableBody.getElements('tr'); + var style = 'width: ' + this.columns[pos].width + 'px;' + this.columns[pos].style; + + ths[pos].setAttribute('style', style); + fths[pos].setAttribute('style', style); + + if (visible) { + ths[pos].removeClass('invisible'); + fths[pos].removeClass('invisible'); + for (var i = 0; i < trs.length; i++) + trs[i].getElements('td')[pos].removeClass('invisible'); + } + else { + ths[pos].addClass('invisible'); + fths[pos].addClass('invisible'); + for (var j = 0; j < trs.length; j++) + trs[j].getElements('td')[pos].addClass('invisible'); + } + if (this.columns[pos].onResize !== null) + { + this.columns[pos].onResize(columnName); + } + }, + + setSortedColumn : function (column) { + if (column != this.sortedColumn) { + this.sortedColumn = column; + this.reverseSort = '0'; + } + else { + // Toggle sort order + this.reverseSort = this.reverseSort == '0' ? '1' : '0'; + } + localStorage.setItem('sorted_column_' + this.dynamicTableDivId, column); + localStorage.setItem('reverse_sort_' + this.dynamicTableDivId, this.reverseSort); + this.updateTable(false); + }, + + getSelectedRowId : function () { + if (this.selectedRows.length > 0) + return this.selectedRows[0]; + return ''; + }, + + altRow : function () { + if (!MUI.ieLegacySupport) + return; + + var trs = this.tableBody.getElements('tr'); + trs.each(function (el, i) { + if (i % 2) { + el.addClass('alt'); + } else { + el.removeClass('alt'); + } + }.bind(this)); + }, + + selectAll : function () { + this.selectedRows.empty(); + + var trs = this.tableBody.getElements('tr'); + for (var i = 0; i < trs.length; i++) { + var tr = trs[i]; + this.selectedRows.push(tr.rowId); + if (!tr.hasClass('selected')) + tr.addClass('selected'); + } + }, + + deselectAll : function () { + this.selectedRows.empty(); + }, + + selectRow : function (rowId) { + this.selectedRows.empty(); + this.selectedRows.push(rowId); + var trs = this.tableBody.getElements('tr'); + for (var i = 0; i < trs.length; i++) { + var tr = trs[i]; + if (tr.rowId == rowId) { + if (!tr.hasClass('selected')) + tr.addClass('selected'); + } + else + if (tr.hasClass('selected')) + tr.removeClass('selected'); + } + this.onSelectedRowChanged(); + }, + + onSelectedRowChanged : function () {}, + + updateRowData : function (data) { + var rowId = data['rowId']; + var row; + + if (!this.rows.has(rowId)) { + row = {}; + this.rows.set(rowId, row); + row['full_data'] = {}; + row['rowId'] = rowId; + } + else + row = this.rows.get(rowId); + + row['data'] = data; + + for(var x in data) + row['full_data'][x] = data[x]; + }, + + getFilteredAndSortedRows : function () { + var filteredRows = []; + + var rows = this.rows.getValues(); + + for (i = 0; i < rows.length; i++) + { + filteredRows.push(rows[i]); + filteredRows[rows[i].rowId] = rows[i]; + } + + filteredRows.sort(function (row1, row2) { + var column = this.columns[this.sortedColumn]; + res = column.compareRows(row1, row2); + if (this.reverseSort == '0') + return res; + else + return -res; + }.bind(this)); + return filteredRows; + }, + + getTrByRowId : function (rowId) { + trs = this.tableBody.getElements('tr'); + for (var i = 0; i < trs.length; i++) + if (trs[i].rowId == rowId) + return trs[i]; + return null; + }, + + updateTable : function (fullUpdate) { + if (fullUpdate === undefined) + fullUpdate = false; + + var rows = this.getFilteredAndSortedRows(); + + for (var i = 0; i < this.selectedRows.length; i++) + if (!(this.selectedRows[i] in rows)) { + this.selectedRows.splice(i, 1); + i--; + } + + var trs = this.tableBody.getElements('tr'); + + for (var rowPos = 0; rowPos < rows.length; rowPos++) { + var rowId = rows[rowPos]['rowId']; + tr_found = false; + for (var j = rowPos; j < trs.length; j++) + if (trs[j]['rowId'] == rowId) { + tr_found = true; + if (rowPos == j) + break; + trs[j].inject(trs[rowPos], 'before'); + var tmpTr = trs[j]; + trs.splice(j, 1); + trs.splice(rowPos, 0, tmpTr); + break; + } + if (tr_found) // row already exists in the table + this.updateRow(trs[rowPos], fullUpdate); + else { // else create a new row in the table + var tr = new Element('tr'); + + tr['rowId'] = rows[rowPos]['rowId']; + + tr._this = this; + tr.addEvent('contextmenu', function (e) { + if (!this._this.selectedRows.contains(this.rowId)) + this._this.selectRow(this.rowId); + return true; + }); + tr.addEvent('click', function (e) { + e.stop(); + if (e.control) { + // CTRL key was pressed + if (this._this.selectedRows.contains(this.rowId)) { + // remove it + this._this.selectedRows.erase(this.rowId); + // Remove selected style + this.removeClass('selected'); + } + else { + this._this.selectedRows.push(this.rowId); + // Add selected style + this.addClass('selected'); + } + } + else { + if (e.shift && this._this.selectedRows.length == 1) { + // Shift key was pressed + var first_row_id = this._this.selectedRows[0]; + var last_row_id = this.rowId; + this._this.selectedRows.empty(); + var trs = this._this.tableBody.getElements('tr'); + var select = false; + for (var i = 0; i < trs.length; i++) { + var tr = trs[i]; + + if ((tr.rowId == first_row_id) || (tr.rowId == last_row_id)) { + this._this.selectedRows.push(tr.rowId); + tr.addClass('selected'); + select = !select; + } + else { + if (select) { + this._this.selectedRows.push(tr.rowId); + tr.addClass('selected'); + } + else + tr.removeClass('selected'); + } + } + } else { + // Simple selection + this._this.selectRow(this.rowId); + } + } + return false; + }); + + this.setupTr(tr); + + for (var k = 0 ; k < this.columns.length; k++) { + var td = new Element('td'); + if ((this.columns[k].visible == '0') || this.columns[k].force_hide) + td.addClass('invisible'); + td.injectInside(tr); + } + + // Insert + if (rowPos >= trs.length) { + tr.inject(this.tableBody); + trs.push(tr); + } + else { + tr.inject(trs[rowPos], 'before'); + trs.splice(rowPos, 0, tr); + } + + // Update context menu + if (this.contextMenu) + this.contextMenu.addTarget(tr); + + this.updateRow(tr, true); + } + } + + rowPos = rows.length; + + while ((rowPos < trs.length) && (trs.length > 0)) { + trs[trs.length - 1].dispose(); + trs.pop(); + } + }, + + setupTr : function (tr) {}, + + updateRow : function (tr, fullUpdate) { + var row = this.rows.get(tr.rowId); + data = row[fullUpdate ? 'full_data' : 'data']; + + tds = tr.getElements('td'); + for (var i = 0; i < this.columns.length; i++) { + if (data.hasOwnProperty(this.columns[i].dataProperties[0])) + this.columns[i].updateTd(tds[i], row); + } + row['data'] = {}; + }, + + removeRow : function (rowId) { + this.selectedRows.erase(rowId); + var tr = this.getTrByRowId(rowId); + if (tr !== null) { + tr.dispose(); + this.rows.erase(rowId); + return true; + } + return false; + }, + + clear : function () { + this.selectedRows.empty(); + this.rows.empty(); + var trs = this.tableBody.getElements('tr'); + while (trs.length > 0) { + trs[trs.length - 1].dispose(); + trs.pop(); + } + }, + + selectedRowsIds : function () { + return this.selectedRows.slice(); + }, + + getRowIds : function () { + return this.rows.getKeys(); + }, + }); + +var TorrentsTable = new Class({ + Extends: DynamicTable, + + initColumns : function () { + this.newColumn('priority', '', '#', 30, true); + this.newColumn('state_icon', 'cursor: default', '', 22, true); + this.newColumn('name', '', 'QBT_TR(Name)QBT_TR[CONTEXT=TorrentModel]', 200, true); + this.newColumn('size', '', 'QBT_TR(Size)QBT_TR[CONTEXT=TorrentModel]', 100, true); + this.newColumn('progress', '', 'QBT_TR(Done)QBT_TR[CONTEXT=TorrentModel]', 85, true); + this.newColumn('status', '', 'QBT_TR(Status)QBT_TR[CONTEXT=TorrentModel]', 100, true); + this.newColumn('num_seeds', '', 'QBT_TR(Seeds)QBT_TR[CONTEXT=TorrentModel]', 100, true); + this.newColumn('num_leechs', '', 'QBT_TR(Peers)QBT_TR[CONTEXT=TorrentModel]', 100, true); + this.newColumn('dlspeed', '', 'QBT_TR(Down Speed)QBT_TR[CONTEXT=TorrentModel]', 100, true); + this.newColumn('upspeed', '', 'QBT_TR(Up Speed)QBT_TR[CONTEXT=TorrentModel]', 100, true); + this.newColumn('eta', '', 'QBT_TR(ETA)QBT_TR[CONTEXT=TorrentModel]', 100, true); + this.newColumn('ratio', '', 'QBT_TR(Ratio)QBT_TR[CONTEXT=TorrentModel]', 100, true); + this.newColumn('category', '', 'QBT_TR(Category)QBT_TR[CONTEXT=TorrentModel]', 100, true); + this.newColumn('added_on', '', 'QBT_TR(Added On)QBT_TR[CONTEXT=TorrentModel]', 100, true); + this.newColumn('completion_on', '', 'QBT_TR(Completed On)QBT_TR[CONTEXT=TorrentModel]', 100, false); + this.newColumn('tracker', '', 'QBT_TR(Tracker)QBT_TR[CONTEXT=TorrentModel]', 100, false); + this.newColumn('dl_limit', '', 'QBT_TR(Down Limit)QBT_TR[CONTEXT=TorrentModel]', 100, false); + this.newColumn('up_limit', '', 'QBT_TR(Up Limit)QBT_TR[CONTEXT=TorrentModel]', 100, false); + this.newColumn('downloaded', '', 'QBT_TR(Downloaded)QBT_TR[CONTEXT=TorrentModel]', 100, false); + this.newColumn('uploaded', '', 'QBT_TR(Uploaded)QBT_TR[CONTEXT=TorrentModel]', 100, false); + this.newColumn('downloaded_session', '', 'QBT_TR(Session Download)QBT_TR[CONTEXT=TorrentModel]', 100, false); + this.newColumn('uploaded_session', '', 'QBT_TR(Session Upload)QBT_TR[CONTEXT=TorrentModel]', 100, false); + this.newColumn('amount_left', '', 'QBT_TR(Remaining)QBT_TR[CONTEXT=TorrentModel]', 100, false); + this.newColumn('save_path', '', 'QBT_TR(Save path)QBT_TR[CONTEXT=TorrentModel]', 100, false); + this.newColumn('completed', '', 'QBT_TR(Completed)QBT_TR[CONTEXT=TorrentModel]', 100, false); + this.newColumn('ratio_limit', '', 'QBT_TR(Ratio Limit)QBT_TR[CONTEXT=TorrentModel]', 100, false); + this.newColumn('seen_complete', '', 'QBT_TR(Last Seen Complete)QBT_TR[CONTEXT=TorrentModel]', 100, false); + this.newColumn('last_activity', '', 'QBT_TR(Last Activity)QBT_TR[CONTEXT=TorrentModel]', 100, false); + this.newColumn('total_size', '', 'QBT_TR(Total Size)QBT_TR[CONTEXT=TorrentModel]', 100, false); + + this.columns['state_icon'].onclick = ''; + this.columns['state_icon'].dataProperties[0] = 'state'; + + this.columns['num_seeds'].dataProperties.push('num_complete'); + + this.columns['num_leechs'].dataProperties.push('num_incomplete'); + + this.initColumnsFunctions(); + }, + + initColumnsFunctions : function () { + + // state_icon + this.columns['state_icon'].updateTd = function (td, row) { + var state = this.getRowValue(row); + + if ((state === "forcedDL") || (state === "metaDL")) + state = "downloading"; + else if (state === "allocating") + state = "stalledDL"; + else if (state === "forcedUP") + state = "uploading"; + else if (state === "pausedDL") + state = "paused"; + else if (state === "pausedUP") + state = "completed"; + else if ((state === "queuedDL") || (state === "queuedUP")) + state = "queued"; + else if ((state === "checkingDL") || (state === "checkingUP") || + (state === "queuedForChecking") || (state === "checkingResumeData")) + state = "checking"; + else if ((state === "unknown") || (state === "error") || (state === "missingFiles")) + state = "error"; + + var img_path = 'images/skin/' + state + '.png'; + + if (td.getChildren('img').length) { + var img = td.getChildren('img')[0]; + if (img.src.indexOf(img_path) < 0) + img.set('src', img_path); + } + else + td.adopt(new Element('img', { + 'src' : img_path, + 'class' : 'stateIcon' + })); + }; + + // status + this.columns['status'].updateTd = function (td, row) { + var status = this.getRowValue(row); + if (!status) return; + + if ((status === "downloading") || (status === "forcedDL") || (status === "metaDL")) + status = "Downloading"; + else if ((status === "stalledDL") || (status === "stalledUP") || (status === "allocating")) + status = "Stalled"; + else if ((status === "uploading") || (status === "forcedUP")) + status = "Uploading"; + else if (status === "pausedDL") + status = "Paused"; + else if (status === "pausedUP") + status = "Completed"; + else if ((status === "queuedDL") || (status === "queuedUP")) + status = "Queued"; + else if ((status === "checkingDL") || (status === "checkingUP") || + (status === "queuedForChecking") || (status === "checkingResumeData")) + status = "Checking"; + else if ((status === "unknown") || (status === "error") || (status === "missingFiles")) + status = "Error"; + + td.set('html', status); + }; + + // priority + this.columns['priority'].updateTd = function (td, row) { + var priority = this.getRowValue(row); + td.set('html', priority < 1 ? '*' : priority); + }; + + this.columns['priority'].compareRows = function (row1, row2) { + var row1_val = this.getRowValue(row1); + var row2_val = this.getRowValue(row2); + if (row1_val < 1) + row1_val = 1000000; + if (row2_val < 1) + row2_val = 1000000; + if (row1_val < row2_val) + return -1; + else if (row1_val > row2_val) + return 1; + else return 0; + }; + + // name, category + this.columns['name'].updateTd = function (td, row) { + td.set('html', escapeHtml(this.getRowValue(row))); + }; + this.columns['category'].updateTd = this.columns['name'].updateTd; + + // size + this.columns['size'].updateTd = function (td, row) { + var size = this.getRowValue(row); + td.set('html', friendlyUnit(size, false)); + }; + + // progress + this.columns['progress'].updateTd = function (td, row) { + var progress = this.getRowValue(row); + var progressFormated = (progress * 100).round(1); + if (progressFormated == 100.0 && progress != 1.0) + progressFormated = 99.9; + + if (td.getChildren('div').length) { + var div = td.getChildren('div')[0]; + if (td.resized) { + td.resized = false; + div.setWidth(ProgressColumnWidth - 5); + } + if (div.getValue() != progressFormated) + div.setValue(progressFormated); + } + else { + if (ProgressColumnWidth < 0) + ProgressColumnWidth = td.offsetWidth; + td.adopt(new ProgressBar(progressFormated.toFloat(), { + 'width' : ProgressColumnWidth - 5 + })); + td.resized = false; + } + }; + + this.columns['progress'].onResize = function (columnName) { + var pos = this.getColumnPos(columnName); + var trs = this.tableBody.getElements('tr'); + ProgressColumnWidth = -1; + for (var i = 0; i < trs.length; i++) { + var td = trs[i].getElements('td')[pos]; + if (ProgressColumnWidth < 0) + ProgressColumnWidth = td.offsetWidth; + td.resized = true; + this.columns[columnName].updateTd(td, this.rows.get(trs[i].rowId)); + } + }.bind(this); + + // num_seeds + this.columns['num_seeds'].updateTd = function (td, row) { + var num_seeds = this.getRowValue(row, 0); + var num_complete = this.getRowValue(row, 1); + var html = num_seeds; + if (num_complete != -1) + html += ' (' + num_complete + ')'; + td.set('html', html); + }; + this.columns['num_seeds'].compareRows = function (row1, row2) { + var num_seeds1 = this.getRowValue(row1, 0); + var num_complete1 = this.getRowValue(row1, 1); + + var num_seeds2 = this.getRowValue(row2, 0); + var num_complete2 = this.getRowValue(row2, 1); + + if (num_complete1 < num_complete2) + return -1; + else if (num_complete1 > num_complete2) + return 1; + else if (num_seeds1 < num_seeds2) + return -1; + else if (num_seeds1 > num_seeds2) + return 1; + else return 0; + }; + + // num_leechs + this.columns['num_leechs'].updateTd = this.columns['num_seeds'].updateTd; + this.columns['num_leechs'].compareRows = this.columns['num_seeds'].compareRows; + + // dlspeed + this.columns['dlspeed'].updateTd = function (td, row) { + var speed = this.getRowValue(row); + td.set('html', friendlyUnit(speed, true)); + }; + + // upspeed + this.columns['upspeed'].updateTd = this.columns['dlspeed'].updateTd; + + // eta + this.columns['eta'].updateTd = function (td, row) { + var eta = this.getRowValue(row); + td.set('html', friendlyDuration(eta, true)); + }; + + // ratio + this.columns['ratio'].updateTd = function (td, row) { + var ratio = this.getRowValue(row); + var html = null; + if (ratio == -1) + html = '∞'; + else + html = (Math.floor(100 * ratio) / 100).toFixed(2); //Don't round up + td.set('html', html); + }; + + // added on + this.columns['added_on'].updateTd = function (td, row) { + var date = new Date(this.getRowValue(row) * 1000).toLocaleString(); + td.set('html', date); + }; + + // completion_on + this.columns['completion_on'].updateTd = function (td, row) { + var val = this.getRowValue(row); + if (val === 0xffffffff || val < 0) + td.set('html', ''); + else { + var date = new Date(this.getRowValue(row) * 1000).toLocaleString(); + td.set('html', date); + } + }; + + // seen_complete + this.columns['seen_complete'].updateTd = this.columns['completion_on'].updateTd; + + // dl_limit, up_limit + this.columns['dl_limit'].updateTd = function (td, row) { + var speed = this.getRowValue(row); + if (speed === 0) + td.set('html', '∞'); + else + td.set('html', friendlyUnit(speed, true)); + }; + + this.columns['up_limit'].updateTd = this.columns['dl_limit'].updateTd; + + // downloaded, uploaded, downloaded_session, uploaded_session, amount_left, completed, total_size + this.columns['downloaded'].updateTd = this.columns['size'].updateTd; + this.columns['uploaded'].updateTd = this.columns['size'].updateTd; + this.columns['downloaded_session'].updateTd = this.columns['size'].updateTd; + this.columns['uploaded_session'].updateTd = this.columns['size'].updateTd; + this.columns['amount_left'].updateTd = this.columns['size'].updateTd; + this.columns['amount_left'].updateTd = this.columns['size'].updateTd; + this.columns['completed'].updateTd = this.columns['size'].updateTd; + this.columns['total_size'].updateTd = this.columns['size'].updateTd; + + // save_path, tracker + this.columns['save_path'].updateTd = this.columns['name'].updateTd; + this.columns['tracker'].updateTd = this.columns['name'].updateTd; + + // ratio_limit + this.columns['ratio_limit'].updateTd = this.columns['ratio'].updateTd; + + // last_activity + this.columns['last_activity'].updateTd = function (td, row) { + var val = this.getRowValue(row); + if (val < 1) + td.set('html', '∞'); + else + td.set('html', 'QBT_TR(%1 ago)QBT_TR[CONTEXT=TransferListDelegate]'.replace('%1', friendlyDuration((new Date()) / 1000 - val, true))); + }; + }, + + applyFilter : function (row, filterName, categoryHash) { + var state = row['full_data'].state; + var inactive = false; + var r; + + switch(filterName) { + case 'downloading': + if (state != 'downloading' && !~state.indexOf('DL')) + return false; + break; + case 'seeding': + if (state != 'uploading' && state != 'forcedUP' && state != 'stalledUP' && state != 'queuedUP' && state != 'checkingUP') + return false; + break; + case 'completed': + if (state != 'uploading' && !~state.indexOf('UP')) + return false; + break; + case 'paused': + if (!~state.indexOf('paused')) + return false; + break; + case 'resumed': + if (~state.indexOf('paused')) + return false; + break; + case 'inactive': + inactive = true; + // fallthrough + case 'active': + if (state == 'stalledDL') + r = (row['full_data'].upspeed > 0); + else + r = state == 'metaDL' || state == 'downloading' || state == 'forcedDL' || state == 'uploading' || state == 'forcedUP'; + if (r == inactive) + return false; + break; + case 'errored': + if (state != 'error' && state != "unknown" && state != "missingFiles") + return false; + break; + } + + if (categoryHash == CATEGORIES_ALL) + return true; + + if (categoryHash == CATEGORIES_UNCATEGORIZED && row['full_data'].category.length === 0) + return true; + + if (categoryHash != genHash(row['full_data'].category)) + return false; + + return true; + }, + + getFilteredTorrentsNumber : function (filterName, categoryHash) { + var cnt = 0; + var rows = this.rows.getValues(); + + for (i = 0; i < rows.length; i++) + if (this.applyFilter(rows[i], filterName, categoryHash)) cnt++; + return cnt; + }, + + getFilteredTorrentsHashes : function (filterName, categoryHash) { + var rowsHashes = []; + var rows = this.rows.getValues(); + + for (i = 0; i < rows.length; i++) + if (this.applyFilter(rows[i], filterName, categoryHash)) + rowsHashes.push(rows[i]['rowId']); + + return rowsHashes; + }, + + getFilteredAndSortedRows : function () { + var filteredRows = []; + + var rows = this.rows.getValues(); + + for (i = 0; i < rows.length; i++) + if (this.applyFilter(rows[i], selected_filter, selected_category)) { + filteredRows.push(rows[i]); + filteredRows[rows[i].rowId] = rows[i]; + } + + filteredRows.sort(function (row1, row2) { + var column = this.columns[this.sortedColumn]; + res = column.compareRows(row1, row2); + if (this.reverseSort == '0') + return res; + else + return -res; + }.bind(this)); + return filteredRows; + }, + + setupTr : function (tr) { + tr.addEvent('dblclick', function (e) { + e.stop(); + this._this.selectRow(this.rowId); + var row = this._this.rows.get(this.rowId); + var state = row['full_data'].state; + if (~state.indexOf('paused')) + startFN(); + else + pauseFN(); + return true; + }); + tr.addClass("torrentsTableContextMenuTarget"); + }, + + getCurrentTorrentHash : function () { + return this.getSelectedRowId(); + }, + + onSelectedRowChanged : function () { + updatePropertiesPanel(); + } + }); + +var TorrentPeersTable = new Class({ + Extends: DynamicTable, + + initColumns : function () { + this.newColumn('country', '', 'QBT_TR(Country)QBT_TR[CONTEXT=PeerListWidget]', 22, true); + this.newColumn('ip', '', 'QBT_TR(IP)QBT_TR[CONTEXT=PeerListWidget]', 80, true); + this.newColumn('port', '', 'QBT_TR(Port)QBT_TR[CONTEXT=PeerListWidget]', 35, true); + this.newColumn('client', '', 'QBT_TR(Client)QBT_TR[CONTEXT=PeerListWidget]', 140, true); + this.newColumn('progress', '', 'QBT_TR(Progress)QBT_TR[CONTEXT=PeerListWidget]', 50, true); + this.newColumn('dl_speed', '', 'QBT_TR(Down Speed)QBT_TR[CONTEXT=PeerListWidget]', 50, true); + this.newColumn('up_speed', '', 'QBT_TR(Up Speed)QBT_TR[CONTEXT=PeerListWidget]', 50, true); + this.newColumn('downloaded', '', 'QBT_TR(Downloaded)QBT_TR[CONTEXT=PeerListWidget]', 50, true); + this.newColumn('uploaded', '', 'QBT_TR(Uploaded)QBT_TR[CONTEXT=PeerListWidget]', 50, true); + this.newColumn('connection', '', 'QBT_TR(Connection)QBT_TR[CONTEXT=PeerListWidget]', 50, true); + this.newColumn('flags', '', 'QBT_TR(Flags)QBT_TR[CONTEXT=PeerListWidget]', 50, true); + this.newColumn('relevance', '', 'QBT_TR(Relevance)QBT_TR[CONTEXT=PeerListWidget]', 30, true); + this.newColumn('files', '', 'QBT_TR(Files)QBT_TR[CONTEXT=PeerListWidget]', 100, true); + + this.columns['country'].dataProperties.push('country_code'); + this.columns['flags'].dataProperties.push('flags_desc'); + this.initColumnsFunctions(); + }, + + initColumnsFunctions : function () { + + // country + + this.columns['country'].updateTd = function (td, row) { + var country = this.getRowValue(row, 0); + var country_code = this.getRowValue(row, 1); + + if (!country_code) { + if (td.getChildren('img').length) + td.getChildren('img')[0].dispose(); + return; + } + + var img_path = 'images/flags/' + country_code + '.png'; + + if (td.getChildren('img').length) { + var img = td.getChildren('img')[0]; + img.set('src', img_path); + img.set('alt', country); + img.set('title', country); + } + else + td.adopt(new Element('img', { + 'src' : img_path, + 'alt' : country, + 'title' : country + })); + }; + + // ip + + this.columns['ip'].compareRows = function (row1, row2) { + var ip1 = this.getRowValue(row1); + var ip2 = this.getRowValue(row2); + + var a = ip1.split("."); + var b = ip2.split("."); + + for (var i = 0; i < 4; i++){ + if (a[i] != b[i]) + return a[i] - b[i]; + } + + return 0; + }; + + // progress, relevance + + this.columns['progress'].updateTd = function (td, row) { + var progress = this.getRowValue(row); + var progressFormated = (progress * 100).round(1); + if (progressFormated == 100.0 && progress != 1.0) + progressFormated = 99.9; + progressFormated += "%"; + td.set('html', progressFormated); + }; + + this.columns['relevance'].updateTd = this.columns['progress'].updateTd; + + // dl_speed, up_speed + + this.columns['dl_speed'].updateTd = function (td, row) { + var speed = this.getRowValue(row); + if (speed === 0) + td.set('html', ''); + else + td.set('html', friendlyUnit(speed, true)); + }; + + this.columns['up_speed'].updateTd = this.columns['dl_speed'].updateTd; + + // downloaded, uploaded + + this.columns['downloaded'].updateTd = function (td, row) { + var downloaded = this.getRowValue(row); + td.set('html', friendlyUnit(downloaded, false)); + }; + + this.columns['uploaded'].updateTd = this.columns['downloaded'].updateTd; + + // flags + + this.columns['flags'].updateTd = function (td, row) { + td.innerHTML = this.getRowValue(row, 0); + td.title = this.getRowValue(row, 1); + }; + + // files + + this.columns['files'].updateTd = function (td, row) { + td.innerHTML = escapeHtml(this.getRowValue(row, 0).replace('\n', ';')); + td.title = escapeHtml(this.getRowValue(row, 0)); + }; + + } + }); + +/*************************************************************/ diff -Nru qbittorrent-4.1.3/src/webui/www/public/scripts/excanvas-compressed.js qbittorrent-3.3.15/src/webui/www/public/scripts/excanvas-compressed.js --- qbittorrent-4.1.3/src/webui/www/public/scripts/excanvas-compressed.js 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/scripts/excanvas-compressed.js 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,876 @@ +// Copyright 2006 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +// Known Issues: +// +// * Patterns are not implemented. +// * Radial gradient are not implemented. The VML version of these look very +// different from the canvas one. +// * Clipping paths are not implemented. +// * Coordsize. The width and height attribute have higher priority than the +// width and height style values which isn't correct. +// * Painting mode isn't implemented. +// * Canvas width/height should is using content-box by default. IE in +// Quirks mode will draw the canvas using border-box. Either change your +// doctype to HTML5 +// (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype) +// or use Box Sizing Behavior from WebFX +// (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html) +// * Non uniform scaling does not correctly scale strokes. +// * Optimize. There is always room for speed improvements. + +// Only add this code if we do not already have a canvas implementation +if (!document.createElement('canvas').getContext) { + +(function() { + + // alias some functions to make (compiled) code shorter + var m = Math; + var mr = m.round; + var ms = m.sin; + var mc = m.cos; + var abs = m.abs; + var sqrt = m.sqrt; + + // this is used for sub pixel precision + var Z = 10; + var Z2 = Z / 2; + + /** + * This funtion is assigned to the elements as element.getContext(). + * @this {HTMLElement} + * @return {CanvasRenderingContext2D_} + */ + function getContext() { + return this.context_ || + (this.context_ = new CanvasRenderingContext2D_(this)); + } + + var slice = Array.prototype.slice; + + /** + * Binds a function to an object. The returned function will always use the + * passed in {@code obj} as {@code this}. + * + * Example: + * + * g = bind(f, obj, a, b) + * g(c, d) // will do f.call(obj, a, b, c, d) + * + * @param {Function} f The function to bind the object to + * @param {Object} obj The object that should act as this when the function + * is called + * @param {*} var_args Rest arguments that will be used as the initial + * arguments when the function is called + * @return {Function} A new function that has bound this + */ + function bind(f, obj, var_args) { + var a = slice.call(arguments, 2); + return function() { + return f.apply(obj, a.concat(slice.call(arguments))); + }; + } + + var G_vmlCanvasManager_ = { + init: function(opt_doc) { + if (/MSIE/.test(navigator.userAgent) && !window.opera) { + var doc = opt_doc || document; + // Create a dummy element so that IE will allow canvas elements to be + // recognized. + doc.createElement('canvas'); + doc.attachEvent('onreadystatechange', bind(this.init_, this, doc)); + } + }, + + init_: function(doc) { + // create xmlns + if (!doc.namespaces['g_vml_']) { + doc.namespaces.add('g_vml_', 'urn:schemas-microsoft-com:vml', + '#default#VML'); + + } + if (!doc.namespaces['g_o_']) { + doc.namespaces.add('g_o_', 'urn:schemas-microsoft-com:office:office', + '#default#VML'); + } + + // Setup default CSS. Only add one style sheet per document + if (!doc.styleSheets['ex_canvas_']) { + var ss = doc.createStyleSheet(); + ss.owningElement.id = 'ex_canvas_'; + ss.cssText = 'canvas{display:inline-block;overflow:hidden;' + + // default size is 300x150 in Gecko and Opera + 'text-align:left;width:300px;height:150px}' + + 'g_vml_\\:*{behavior:url(#default#VML)}' + + 'g_o_\\:*{behavior:url(#default#VML)}'; + + } + + // find all canvas elements + var els = doc.getElementsByTagName('canvas'); + for (var i = 0; i < els.length; i++) { + this.initElement(els[i]); + } + }, + + /** + * Public initializes a canvas element so that it can be used as canvas + * element from now on. This is called automatically before the page is + * loaded but if you are creating elements using createElement you need to + * make sure this is called on the element. + * @param {HTMLElement} el The canvas element to initialize. + * @return {HTMLElement} the element that was created. + */ + initElement: function(el) { + if (!el.getContext) { + + el.getContext = getContext; + + // do not use inline function because that will leak memory + el.attachEvent('onpropertychange', onPropertyChange); + el.attachEvent('onresize', onResize); + + var attrs = el.attributes; + if (attrs.width && attrs.width.specified) { + // TODO: use runtimeStyle and coordsize + // el.getContext().setWidth_(attrs.width.nodeValue); + el.style.width = attrs.width.nodeValue + 'px'; + } else { + el.width = el.clientWidth; + } + if (attrs.height && attrs.height.specified) { + // TODO: use runtimeStyle and coordsize + // el.getContext().setHeight_(attrs.height.nodeValue); + el.style.height = attrs.height.nodeValue + 'px'; + } else { + el.height = el.clientHeight; + } + //el.getContext().setCoordsize_() + } + return el; + } + }; + + function onPropertyChange(e) { + var el = e.srcElement; + + switch (e.propertyName) { + case 'width': + el.style.width = el.attributes.width.nodeValue + 'px'; + el.getContext().clearRect(); + break; + case 'height': + el.style.height = el.attributes.height.nodeValue + 'px'; + el.getContext().clearRect(); + break; + } + } + + function onResize(e) { + var el = e.srcElement; + if (el.firstChild) { + el.firstChild.style.width = el.clientWidth + 'px'; + el.firstChild.style.height = el.clientHeight + 'px'; + } + } + + G_vmlCanvasManager_.init(); + + // precompute "00" to "FF" + var dec2hex = []; + for (var i = 0; i < 16; i++) { + for (var j = 0; j < 16; j++) { + dec2hex[i * 16 + j] = i.toString(16) + j.toString(16); + } + } + + function createMatrixIdentity() { + return [ + [1, 0, 0], + [0, 1, 0], + [0, 0, 1] + ]; + } + + function matrixMultiply(m1, m2) { + var result = createMatrixIdentity(); + + for (var x = 0; x < 3; x++) { + for (var y = 0; y < 3; y++) { + var sum = 0; + + for (var z = 0; z < 3; z++) { + sum += m1[x][z] * m2[z][y]; + } + + result[x][y] = sum; + } + } + return result; + } + + function copyState(o1, o2) { + o2.fillStyle = o1.fillStyle; + o2.lineCap = o1.lineCap; + o2.lineJoin = o1.lineJoin; + o2.lineWidth = o1.lineWidth; + o2.miterLimit = o1.miterLimit; + o2.shadowBlur = o1.shadowBlur; + o2.shadowColor = o1.shadowColor; + o2.shadowOffsetX = o1.shadowOffsetX; + o2.shadowOffsetY = o1.shadowOffsetY; + o2.strokeStyle = o1.strokeStyle; + o2.globalAlpha = o1.globalAlpha; + o2.arcScaleX_ = o1.arcScaleX_; + o2.arcScaleY_ = o1.arcScaleY_; + o2.lineScale_ = o1.lineScale_; + } + + function processStyle(styleString) { + var str, alpha = 1; + + styleString = String(styleString); + if (styleString.substring(0, 3) == 'rgb') { + var start = styleString.indexOf('(', 3); + var end = styleString.indexOf(')', start + 1); + var guts = styleString.substring(start + 1, end).split(','); + + str = '#'; + for (var i = 0; i < 3; i++) { + str += dec2hex[Number(guts[i])]; + } + + if (guts.length == 4 && styleString.substr(3, 1) == 'a') { + alpha = guts[3]; + } + } else { + str = styleString; + } + + return {color: str, alpha: alpha}; + } + + function processLineCap(lineCap) { + switch (lineCap) { + case 'butt': + return 'flat'; + case 'round': + return 'round'; + case 'square': + default: + return 'square'; + } + } + + /** + * This class implements CanvasRenderingContext2D interface as described by + * the WHATWG. + * @param {HTMLElement} surfaceElement The element that the 2D context should + * be associated with + */ + function CanvasRenderingContext2D_(surfaceElement) { + this.m_ = createMatrixIdentity(); + + this.mStack_ = []; + this.aStack_ = []; + this.currentPath_ = []; + + // Canvas context properties + this.strokeStyle = '#000'; + this.fillStyle = '#000'; + + this.lineWidth = 1; + this.lineJoin = 'miter'; + this.lineCap = 'butt'; + this.miterLimit = Z * 1; + this.globalAlpha = 1; + this.canvas = surfaceElement; + + var el = surfaceElement.ownerDocument.createElement('div'); + el.style.width = surfaceElement.clientWidth + 'px'; + el.style.height = surfaceElement.clientHeight + 'px'; + el.style.overflow = 'hidden'; + el.style.position = 'absolute'; + surfaceElement.appendChild(el); + + this.element_ = el; + this.arcScaleX_ = 1; + this.arcScaleY_ = 1; + this.lineScale_ = 1; + } + + var contextPrototype = CanvasRenderingContext2D_.prototype; + contextPrototype.clearRect = function() { + this.element_.innerHTML = ''; + this.currentPath_ = []; + }; + + contextPrototype.beginPath = function() { + // TODO: Branch current matrix so that save/restore has no effect + // as per safari docs. + this.currentPath_ = []; + }; + + contextPrototype.moveTo = function(aX, aY) { + var p = this.getCoords_(aX, aY); + this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y}); + this.currentX_ = p.x; + this.currentY_ = p.y; + }; + + contextPrototype.lineTo = function(aX, aY) { + var p = this.getCoords_(aX, aY); + this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y}); + + this.currentX_ = p.x; + this.currentY_ = p.y; + }; + + contextPrototype.bezierCurveTo = function(aCP1x, aCP1y, + aCP2x, aCP2y, + aX, aY) { + var p = this.getCoords_(aX, aY); + var cp1 = this.getCoords_(aCP1x, aCP1y); + var cp2 = this.getCoords_(aCP2x, aCP2y); + bezierCurveTo(this, cp1, cp2, p); + }; + + // Helper function that takes the already fixed cordinates. + function bezierCurveTo(self, cp1, cp2, p) { + self.currentPath_.push({ + type: 'bezierCurveTo', + cp1x: cp1.x, + cp1y: cp1.y, + cp2x: cp2.x, + cp2y: cp2.y, + x: p.x, + y: p.y + }); + self.currentX_ = p.x; + self.currentY_ = p.y; + } + + contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) { + // the following is lifted almost directly from + // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes + + var cp = this.getCoords_(aCPx, aCPy); + var p = this.getCoords_(aX, aY); + + var cp1 = { + x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_), + y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_) + }; + var cp2 = { + x: cp1.x + (p.x - this.currentX_) / 3.0, + y: cp1.y + (p.y - this.currentY_) / 3.0 + }; + + bezierCurveTo(this, cp1, cp2, p); + }; + + contextPrototype.arc = function(aX, aY, aRadius, + aStartAngle, aEndAngle, aClockwise) { + aRadius *= Z; + var arcType = aClockwise ? 'at' : 'wa'; + + var xStart = aX + mc(aStartAngle) * aRadius - Z2; + var yStart = aY + ms(aStartAngle) * aRadius - Z2; + + var xEnd = aX + mc(aEndAngle) * aRadius - Z2; + var yEnd = aY + ms(aEndAngle) * aRadius - Z2; + + // IE won't render arches drawn counter clockwise if xStart == xEnd. + if (xStart == xEnd && !aClockwise) { + xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something + // that can be represented in binary + } + + var p = this.getCoords_(aX, aY); + var pStart = this.getCoords_(xStart, yStart); + var pEnd = this.getCoords_(xEnd, yEnd); + + this.currentPath_.push({type: arcType, + x: p.x, + y: p.y, + radius: aRadius, + xStart: pStart.x, + yStart: pStart.y, + xEnd: pEnd.x, + yEnd: pEnd.y}); + + }; + + contextPrototype.rect = function(aX, aY, aWidth, aHeight) { + this.moveTo(aX, aY); + this.lineTo(aX + aWidth, aY); + this.lineTo(aX + aWidth, aY + aHeight); + this.lineTo(aX, aY + aHeight); + this.closePath(); + }; + + contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) { + // Will destroy any existing path (same as FF behaviour) + this.beginPath(); + this.moveTo(aX, aY); + this.lineTo(aX + aWidth, aY); + this.lineTo(aX + aWidth, aY + aHeight); + this.lineTo(aX, aY + aHeight); + this.closePath(); + this.stroke(); + this.currentPath_ = []; + }; + + contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) { + // Will destroy any existing path (same as FF behaviour) + this.beginPath(); + this.moveTo(aX, aY); + this.lineTo(aX + aWidth, aY); + this.lineTo(aX + aWidth, aY + aHeight); + this.lineTo(aX, aY + aHeight); + this.closePath(); + this.fill(); + this.currentPath_ = []; + }; + + contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) { + var gradient = new CanvasGradient_('gradient'); + gradient.x0_ = aX0; + gradient.y0_ = aY0; + gradient.x1_ = aX1; + gradient.y1_ = aY1; + return gradient; + }; + + contextPrototype.createRadialGradient = function(aX0, aY0, aR0, + aX1, aY1, aR1) { + var gradient = new CanvasGradient_('gradientradial'); + gradient.x0_ = aX0; + gradient.y0_ = aY0; + gradient.r0_ = aR0; + gradient.x1_ = aX1; + gradient.y1_ = aY1; + gradient.r1_ = aR1; + return gradient; + }; + + contextPrototype.drawImage = function(image, var_args) { + var dx, dy, dw, dh, sx, sy, sw, sh; + + // to find the original width we overide the width and height + var oldRuntimeWidth = image.runtimeStyle.width; + var oldRuntimeHeight = image.runtimeStyle.height; + image.runtimeStyle.width = 'auto'; + image.runtimeStyle.height = 'auto'; + + // get the original size + var w = image.width; + var h = image.height; + + // and remove overides + image.runtimeStyle.width = oldRuntimeWidth; + image.runtimeStyle.height = oldRuntimeHeight; + + if (arguments.length == 3) { + dx = arguments[1]; + dy = arguments[2]; + sx = sy = 0; + sw = dw = w; + sh = dh = h; + } else if (arguments.length == 5) { + dx = arguments[1]; + dy = arguments[2]; + dw = arguments[3]; + dh = arguments[4]; + sx = sy = 0; + sw = w; + sh = h; + } else if (arguments.length == 9) { + sx = arguments[1]; + sy = arguments[2]; + sw = arguments[3]; + sh = arguments[4]; + dx = arguments[5]; + dy = arguments[6]; + dw = arguments[7]; + dh = arguments[8]; + } else { + throw Error('Invalid number of arguments'); + } + + var d = this.getCoords_(dx, dy); + + var w2 = sw / 2; + var h2 = sh / 2; + + var vmlStr = []; + + var W = 10; + var H = 10; + + // For some reason that I've now forgotten, using divs didn't work + vmlStr.push(' ' , + '', + ''); + + this.element_.insertAdjacentHTML('BeforeEnd', + vmlStr.join('')); + }; + + contextPrototype.stroke = function(aFill) { + var lineStr = []; + var lineOpen = false; + var a = processStyle(aFill ? this.fillStyle : this.strokeStyle); + var color = a.color; + var opacity = a.alpha * this.globalAlpha; + + var W = 10; + var H = 10; + + lineStr.push(''); + + if (!aFill) { + var lineWidth = this.lineScale_ * this.lineWidth; + + // VML cannot correctly render a line if the width is less than 1px. + // In that case, we dilute the color to make the line look thinner. + if (lineWidth < 1) { + opacity *= lineWidth; + } + + lineStr.push( + '' + ); + } else if (typeof this.fillStyle == 'object') { + var fillStyle = this.fillStyle; + var angle = 0; + var focus = {x: 0, y: 0}; + + // additional offset + var shift = 0; + // scale factor for offset + var expansion = 1; + + if (fillStyle.type_ == 'gradient') { + var x0 = fillStyle.x0_ / this.arcScaleX_; + var y0 = fillStyle.y0_ / this.arcScaleY_; + var x1 = fillStyle.x1_ / this.arcScaleX_; + var y1 = fillStyle.y1_ / this.arcScaleY_; + var p0 = this.getCoords_(x0, y0); + var p1 = this.getCoords_(x1, y1); + var dx = p1.x - p0.x; + var dy = p1.y - p0.y; + angle = Math.atan2(dx, dy) * 180 / Math.PI; + + // The angle should be a non-negative number. + if (angle < 0) { + angle += 360; + } + + // Very small angles produce an unexpected result because they are + // converted to a scientific notation string. + if (angle < 1e-6) { + angle = 0; + } + } else { + var p0 = this.getCoords_(fillStyle.x0_, fillStyle.y0_); + var width = max.x - min.x; + var height = max.y - min.y; + focus = { + x: (p0.x - min.x) / width, + y: (p0.y - min.y) / height + }; + + width /= this.arcScaleX_ * Z; + height /= this.arcScaleY_ * Z; + var dimension = m.max(width, height); + shift = 2 * fillStyle.r0_ / dimension; + expansion = 2 * fillStyle.r1_ / dimension - shift; + } + + // We need to sort the color stops in ascending order by offset, + // otherwise IE won't interpret it correctly. + var stops = fillStyle.colors_; + stops.sort(function(cs1, cs2) { + return cs1.offset - cs2.offset; + }); + + var length = stops.length; + var color1 = stops[0].color; + var color2 = stops[length - 1].color; + var opacity1 = stops[0].alpha * this.globalAlpha; + var opacity2 = stops[length - 1].alpha * this.globalAlpha; + + var colors = []; + for (var i = 0; i < length; i++) { + var stop = stops[i]; + colors.push(stop.offset * expansion + shift + ' ' + stop.color); + } + + // When colors attribute is used, the meanings of opacity and o:opacity2 + // are reversed. + lineStr.push(''); + } else { + lineStr.push(''); + } + + lineStr.push(''); + + this.element_.insertAdjacentHTML('beforeEnd', lineStr.join('')); + }; + + contextPrototype.fill = function() { + this.stroke(true); + } + + contextPrototype.closePath = function() { + this.currentPath_.push({type: 'close'}); + }; + + /** + * @private + */ + contextPrototype.getCoords_ = function(aX, aY) { + var m = this.m_; + return { + x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2, + y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2 + } + }; + + contextPrototype.save = function() { + var o = {}; + copyState(this, o); + this.aStack_.push(o); + this.mStack_.push(this.m_); + this.m_ = matrixMultiply(createMatrixIdentity(), this.m_); + }; + + contextPrototype.restore = function() { + copyState(this.aStack_.pop(), this); + this.m_ = this.mStack_.pop(); + }; + + contextPrototype.translate = function(aX, aY) { + var m1 = [ + [1, 0, 0], + [0, 1, 0], + [aX, aY, 1] + ]; + + this.m_ = matrixMultiply(m1, this.m_); + }; + + contextPrototype.rotate = function(aRot) { + var c = mc(aRot); + var s = ms(aRot); + + var m1 = [ + [c, s, 0], + [-s, c, 0], + [0, 0, 1] + ]; + + this.m_ = matrixMultiply(m1, this.m_); + }; + + contextPrototype.scale = function(aX, aY) { + this.arcScaleX_ *= aX; + this.arcScaleY_ *= aY; + var m1 = [ + [aX, 0, 0], + [0, aY, 0], + [0, 0, 1] + ]; + + var m = this.m_ = matrixMultiply(m1, this.m_); + + // Get the line scale. + // Determinant of this.m_ means how much the area is enlarged by the + // transformation. So its square root can be used as a scale factor + // for width. + var det = m[0][0] * m[1][1] - m[0][1] * m[1][0]; + this.lineScale_ = sqrt(abs(det)); + }; + + /******** STUBS ********/ + contextPrototype.clip = function() { + // TODO: Implement + }; + + contextPrototype.arcTo = function() { + // TODO: Implement + }; + + contextPrototype.createPattern = function() { + return new CanvasPattern_; + }; + + // Gradient / Pattern Stubs + function CanvasGradient_(aType) { + this.type_ = aType; + this.x0_ = 0; + this.y0_ = 0; + this.r0_ = 0; + this.x1_ = 0; + this.y1_ = 0; + this.r1_ = 0; + this.colors_ = []; + } + + CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) { + aColor = processStyle(aColor); + this.colors_.push({offset: aOffset, + color: aColor.color, + alpha: aColor.alpha}); + }; + + function CanvasPattern_() {} + + // set up externs + G_vmlCanvasManager = G_vmlCanvasManager_; + CanvasRenderingContext2D = CanvasRenderingContext2D_; + CanvasGradient = CanvasGradient_; + CanvasPattern = CanvasPattern_; + +})(); + +} // if diff -Nru qbittorrent-4.1.3/src/webui/www/public/scripts/lib/mootools-1.2-core-yc.js qbittorrent-3.3.15/src/webui/www/public/scripts/lib/mootools-1.2-core-yc.js --- qbittorrent-4.1.3/src/webui/www/public/scripts/lib/mootools-1.2-core-yc.js 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/scripts/lib/mootools-1.2-core-yc.js 1970-01-01 00:00:00.000000000 +0000 @@ -1,527 +0,0 @@ -/* ---- -MooTools: the javascript framework - -web build: - - http://mootools.net/core/76bf47062d6c1983d66ce47ad66aa0e0 - -packager build: - - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Delegation Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady Core/Swiff - -copyrights: - - [MooTools](http://mootools.net) - -licenses: - - [MIT License](http://mootools.net/license.txt) -... -*/ - -(function(){this.MooTools={version:"1.4.5",build:"ab8ea8824dc3b24b6666867a2c4ed58ebb762cf0"};var e=this.typeOf=function(i){if(i==null){return"null";}if(i.$family!=null){return i.$family(); -}if(i.nodeName){if(i.nodeType==1){return"element";}if(i.nodeType==3){return(/\S/).test(i.nodeValue)?"textnode":"whitespace";}}else{if(typeof i.length=="number"){if(i.callee){return"arguments"; -}if("item" in i){return"collection";}}}return typeof i;};var u=this.instanceOf=function(w,i){if(w==null){return false;}var v=w.$constructor||w.constructor; -while(v){if(v===i){return true;}v=v.parent;}if(!w.hasOwnProperty){return false;}return w instanceof i;};var f=this.Function;var r=true;for(var q in {toString:1}){r=null; -}if(r){r=["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"];}f.prototype.overloadSetter=function(v){var i=this; -return function(x,w){if(x==null){return this;}if(v||typeof x!="string"){for(var y in x){i.call(this,y,x[y]);}if(r){for(var z=r.length;z--;){y=r[z];if(x.hasOwnProperty(y)){i.call(this,y,x[y]); -}}}}else{i.call(this,x,w);}return this;};};f.prototype.overloadGetter=function(v){var i=this;return function(x){var y,w;if(typeof x!="string"){y=x;}else{if(arguments.length>1){y=arguments; -}else{if(v){y=[x];}}}if(y){w={};for(var z=0;z>>0; -b>>0;b>>0;for(var a=(d<0)?Math.max(0,b+d):d||0;a>>0,b=Array(d);for(var a=0;a>>0; -b-1:String(this).indexOf(a)>-1;},trim:function(){return String(this).replace(/^\s+|\s+$/g,""); -},clean:function(){return String(this).replace(/\s+/g," ").trim();},camelCase:function(){return String(this).replace(/-\D/g,function(a){return a.charAt(1).toUpperCase(); -});},hyphenate:function(){return String(this).replace(/[A-Z]/g,function(a){return("-"+a.charAt(0).toLowerCase());});},capitalize:function(){return String(this).replace(/\b[a-z]/g,function(a){return a.toUpperCase(); -});},escapeRegExp:function(){return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1");},toInt:function(a){return parseInt(this,a||10);},toFloat:function(){return parseFloat(this); -},hexToRgb:function(b){var a=String(this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);return(a)?a.slice(1).hexToRgb(b):null;},rgbToHex:function(b){var a=String(this).match(/\d{1,3}/g); -return(a)?a.rgbToHex(b):null;},substitute:function(a,b){return String(this).replace(b||(/\\?\{([^{}]+)\}/g),function(d,c){if(d.charAt(0)=="\\"){return d.slice(1); -}return(a[c]!=null)?a[c]:"";});}});Number.implement({limit:function(b,a){return Math.min(a,Math.max(b,this));},round:function(a){a=Math.pow(10,a||0).toFixed(a<0?-a:0); -return Math.round(this*a)/a;},times:function(b,c){for(var a=0;a1?Array.slice(arguments,1):null,d=function(){};var c=function(){var g=e,h=arguments.length;if(this instanceof c){d.prototype=a.prototype; -g=new d;}var f=(!b&&!h)?a.call(g):a.apply(g,b&&h?b.concat(Array.slice(arguments)):b||arguments);return g==e?f:g;};return c;},pass:function(b,c){var a=this; -if(b!=null){b=Array.from(b);}return function(){return a.apply(c,b||arguments);};},delay:function(b,c,a){return setTimeout(this.pass((a==null?[]:a),c),b); -},periodical:function(c,b,a){return setInterval(this.pass((a==null?[]:a),b),c);}});delete Function.prototype.bind;Function.implement({create:function(b){var a=this; -b=b||{};return function(d){var c=b.arguments;c=(c!=null)?Array.from(c):Array.slice(arguments,(b.event)?1:0);if(b.event){c=[d||window.event].extend(c);}var e=function(){return a.apply(b.bind||null,c); -};if(b.delay){return setTimeout(e,b.delay);}if(b.periodical){return setInterval(e,b.periodical);}if(b.attempt){return Function.attempt(e);}return e();}; -},bind:function(c,b){var a=this;if(b!=null){b=Array.from(b);}return function(){return a.apply(c,b||arguments);};},bindWithEvent:function(c,b){var a=this; -if(b!=null){b=Array.from(b);}return function(d){return a.apply(c,(b==null)?arguments:[d].concat(b));};},run:function(a,b){return this.apply(b,Array.from(a)); -}});if(Object.create==Function.prototype.create){Object.create=null;}var $try=Function.attempt;(function(){var a=Object.prototype.hasOwnProperty;Object.extend({subset:function(d,g){var f={}; -for(var e=0,b=g.length;e]*>([\s\S]*?)<\/script>/gi,function(r,s){e+=s+"\n"; -return"";});if(p===true){o.exec(e);}else{if(typeOf(p)=="function"){p(e,q);}}return q;});o.extend({Document:this.Document,Window:this.Window,Element:this.Element,Event:this.Event}); -this.Window=this.$constructor=new Type("Window",function(){});this.$family=Function.from("window").hide();Window.mirror(function(e,p){h[e]=p;});this.Document=k.$constructor=new Type("Document",function(){}); -k.$family=Function.from("document").hide();Document.mirror(function(e,p){k[e]=p;});k.html=k.documentElement;if(!k.head){k.head=k.getElementsByTagName("head")[0]; -}if(k.execCommand){try{k.execCommand("BackgroundImageCache",false,true);}catch(g){}}if(this.attachEvent&&!this.addEventListener){var c=function(){this.detachEvent("onunload",c); -k.head=k.html=k.window=null;};this.attachEvent("onunload",c);}var m=Array.from;try{m(k.html.childNodes);}catch(g){Array.from=function(p){if(typeof p!="string"&&Type.isEnumerable(p)&&typeOf(p)!="array"){var e=p.length,q=new Array(e); -while(e--){q[e]=p[e];}return q;}return m(p);};var l=Array.prototype,n=l.slice;["pop","push","reverse","shift","sort","splice","unshift","concat","join","slice"].each(function(e){var p=l[e]; -Array[e]=function(q){return p.apply(Array.from(q),n.call(arguments,1));};});}if(o.Platform.ios){o.Platform.ipod=true;}o.Engine={};var d=function(p,e){o.Engine.name=p; -o.Engine[p+e]=true;o.Engine.version=e;};if(o.ie){o.Engine.trident=true;switch(o.version){case 6:d("trident",4);break;case 7:d("trident",5);break;case 8:d("trident",6); -}}if(o.firefox){o.Engine.gecko=true;if(o.version>=3){d("gecko",19);}else{d("gecko",18);}}if(o.safari||o.chrome){o.Engine.webkit=true;switch(o.version){case 2:d("webkit",419); -break;case 3:d("webkit",420);break;case 4:d("webkit",525);}}if(o.opera){o.Engine.presto=true;if(o.version>=9.6){d("presto",960);}else{if(o.version>=9.5){d("presto",950); -}else{d("presto",925);}}}if(o.name=="unknown"){switch((a.match(/(?:webkit|khtml|gecko)/)||[])[0]){case"webkit":case"khtml":o.Engine.webkit=true;break;case"gecko":o.Engine.gecko=true; -}}this.$exec=o.exec;})();(function(){var b={};var a=this.DOMEvent=new Type("DOMEvent",function(c,g){if(!g){g=window;}c=c||g.event;if(c.$extended){return c; -}this.event=c;this.$extended=true;this.shift=c.shiftKey;this.control=c.ctrlKey;this.alt=c.altKey;this.meta=c.metaKey;var i=this.type=c.type;var h=c.target||c.srcElement; -while(h&&h.nodeType==3){h=h.parentNode;}this.target=document.id(h);if(i.indexOf("key")==0){var d=this.code=(c.which||c.keyCode);this.key=b[d]||Object.keyOf(Event.Keys,d); -if(i=="keydown"){if(d>111&&d<124){this.key="f"+(d-111);}else{if(d>95&&d<106){this.key=d-96;}}}if(this.key==null){this.key=String.fromCharCode(d).toLowerCase(); -}}else{if(i=="click"||i=="dblclick"||i=="contextmenu"||i=="DOMMouseScroll"||i.indexOf("mouse")==0){var j=g.document;j=(!j.compatMode||j.compatMode=="CSS1Compat")?j.html:j.body; -this.page={x:(c.pageX!=null)?c.pageX:c.clientX+j.scrollLeft,y:(c.pageY!=null)?c.pageY:c.clientY+j.scrollTop};this.client={x:(c.pageX!=null)?c.pageX-g.pageXOffset:c.clientX,y:(c.pageY!=null)?c.pageY-g.pageYOffset:c.clientY}; -if(i=="DOMMouseScroll"||i=="mousewheel"){this.wheel=(c.wheelDelta)?c.wheelDelta/120:-(c.detail||0)/3;}this.rightClick=(c.which==3||c.button==2);if(i=="mouseover"||i=="mouseout"){var k=c.relatedTarget||c[(i=="mouseover"?"from":"to")+"Element"]; -while(k&&k.nodeType==3){k=k.parentNode;}this.relatedTarget=document.id(k);}}else{if(i.indexOf("touch")==0||i.indexOf("gesture")==0){this.rotation=c.rotation; -this.scale=c.scale;this.targetTouches=c.targetTouches;this.changedTouches=c.changedTouches;var f=this.touches=c.touches;if(f&&f[0]){var e=f[0];this.page={x:e.pageX,y:e.pageY}; -this.client={x:e.clientX,y:e.clientY};}}}}if(!this.client){this.client={};}if(!this.page){this.page={};}});a.implement({stop:function(){return this.preventDefault().stopPropagation(); -},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation();}else{this.event.cancelBubble=true;}return this;},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault(); -}else{this.event.returnValue=false;}return this;}});a.defineKey=function(d,c){b[d]=c;return this;};a.defineKeys=a.defineKey.overloadSetter(true);a.defineKeys({"38":"up","40":"down","37":"left","39":"right","27":"esc","32":"space","8":"backspace","9":"tab","46":"delete","13":"enter"}); -})();var Event=DOMEvent;Event.Keys={};Event.Keys=new Hash(Event.Keys);(function(){var a=this.Class=new Type("Class",function(h){if(instanceOf(h,Function)){h={initialize:h}; -}var g=function(){e(this);if(g.$prototyping){return this;}this.$caller=null;var i=(this.initialize)?this.initialize.apply(this,arguments):this;this.$caller=this.caller=null; -return i;}.extend(this).implement(h);g.$constructor=a;g.prototype.$constructor=g;g.prototype.parent=c;return g;});var c=function(){if(!this.$caller){throw new Error('The method "parent" cannot be called.'); -}var g=this.$caller.$name,h=this.$caller.$owner.parent,i=(h)?h.prototype[g]:null;if(!i){throw new Error('The method "'+g+'" has no parent.');}return i.apply(this,arguments); -};var e=function(g){for(var h in g){var j=g[h];switch(typeOf(j)){case"object":var i=function(){};i.prototype=j;g[h]=e(new i);break;case"array":g[h]=j.clone(); -break;}}return g;};var b=function(g,h,j){if(j.$origin){j=j.$origin;}var i=function(){if(j.$protected&&this.$caller==null){throw new Error('The method "'+h+'" cannot be called.'); -}var l=this.caller,m=this.$caller;this.caller=m;this.$caller=i;var k=j.apply(this,arguments);this.$caller=m;this.caller=l;return k;}.extend({$owner:g,$origin:j,$name:h}); -return i;};var f=function(h,i,g){if(a.Mutators.hasOwnProperty(h)){i=a.Mutators[h].call(this,i);if(i==null){return this;}}if(typeOf(i)=="function"){if(i.$hidden){return this; -}this.prototype[h]=(g)?i:b(this,h,i);}else{Object.merge(this.prototype,h,i);}return this;};var d=function(g){g.$prototyping=true;var h=new g;delete g.$prototyping; -return h;};a.implement("implement",f.overloadSetter());a.Mutators={Extends:function(g){this.parent=g;this.prototype=d(g);},Implements:function(g){Array.from(g).each(function(j){var h=new j; -for(var i in h){f.call(this,i,h[i],true);}},this);}};})();(function(){this.Chain=new Class({$chain:[],chain:function(){this.$chain.append(Array.flatten(arguments)); -return this;},callChain:function(){return(this.$chain.length)?this.$chain.shift().apply(this,arguments):false;},clearChain:function(){this.$chain.empty(); -return this;}});var a=function(b){return b.replace(/^on([A-Z])/,function(c,d){return d.toLowerCase();});};this.Events=new Class({$events:{},addEvent:function(d,c,b){d=a(d); -if(c==$empty){return this;}this.$events[d]=(this.$events[d]||[]).include(c);if(b){c.internal=true;}return this;},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]); -}return this;},fireEvent:function(e,c,b){e=a(e);var d=this.$events[e];if(!d){return this;}c=Array.from(c);d.each(function(f){if(b){f.delay(b,this,c);}else{f.apply(this,c); -}},this);return this;},removeEvent:function(e,d){e=a(e);var c=this.$events[e];if(c&&!d.internal){var b=c.indexOf(d);if(b!=-1){delete c[b];}}return this; -},removeEvents:function(d){var e;if(typeOf(d)=="object"){for(e in d){this.removeEvent(e,d[e]);}return this;}if(d){d=a(d);}for(e in this.$events){if(d&&d!=e){continue; -}var c=this.$events[e];for(var b=c.length;b--;){if(b in c){this.removeEvent(e,c[b]);}}}return this;}});this.Options=new Class({setOptions:function(){var b=this.options=Object.merge.apply(null,[{},this.options].append(arguments)); -if(this.addEvent){for(var c in b){if(typeOf(b[c])!="function"||!(/^on[A-Z]/).test(c)){continue;}this.addEvent(c,b[c]);delete b[c];}}return this;}});})(); -(function(){var k,n,l,g,a={},c={},m=/\\/g;var e=function(q,p){if(q==null){return null;}if(q.Slick===true){return q;}q=(""+q).replace(/^\s+|\s+$/g,"");g=!!p; -var o=(g)?c:a;if(o[q]){return o[q];}k={Slick:true,expressions:[],raw:q,reverse:function(){return e(this.raw,true);}};n=-1;while(q!=(q=q.replace(j,b))){}k.length=k.expressions.length; -return o[k.raw]=(g)?h(k):k;};var i=function(o){if(o==="!"){return" ";}else{if(o===" "){return"!";}else{if((/^!/).test(o)){return o.replace(/^!/,"");}else{return"!"+o; -}}}};var h=function(u){var r=u.expressions;for(var p=0;p+)\\s*|(\\s+)|(+|\\*)|\\#(+)|\\.(+)|\\[\\s*(+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)".replace(//,"["+f(">+~`!@$%^&={}\\;/g,"(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])").replace(//g,"(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])")); -function b(x,s,D,z,r,C,q,B,A,y,u,F,G,v,p,w){if(s||n===-1){k.expressions[++n]=[];l=-1;if(s){return"";}}if(D||z||l===-1){D=D||" ";var t=k.expressions[n]; -if(g&&t[l]){t[l].reverseCombinator=i(D);}t[++l]={combinator:D,tag:"*"};}var o=k.expressions[n][l];if(r){o.tag=r.replace(m,"");}else{if(C){o.id=C.replace(m,""); -}else{if(q){q=q.replace(m,"");if(!o.classList){o.classList=[];}if(!o.classes){o.classes=[];}o.classList.push(q);o.classes.push({value:q,regexp:new RegExp("(^|\\s)"+f(q)+"(\\s|$)")}); -}else{if(G){w=w||p;w=w?w.replace(m,""):null;if(!o.pseudos){o.pseudos=[];}o.pseudos.push({key:G.replace(m,""),value:w,type:F.length==1?"class":"element"}); -}else{if(B){B=B.replace(m,"");u=(u||"").replace(m,"");var E,H;switch(A){case"^=":H=new RegExp("^"+f(u));break;case"$=":H=new RegExp(f(u)+"$");break;case"~=":H=new RegExp("(^|\\s)"+f(u)+"(\\s|$)"); -break;case"|=":H=new RegExp("^"+f(u)+"(-|$)");break;case"=":E=function(I){return u==I;};break;case"*=":E=function(I){return I&&I.indexOf(u)>-1;};break; -case"!=":E=function(I){return u!=I;};break;default:E=function(I){return !!I;};}if(u==""&&(/^[*$^]=$/).test(A)){E=function(){return false;};}if(!E){E=function(I){return I&&H.test(I); -};}if(!o.attributes){o.attributes=[];}o.attributes.push({key:B,operator:A,value:u,test:E});}}}}}return"";}var d=(this.Slick||{});d.parse=function(o){return e(o); -};d.escapeRegExp=f;if(!this.Slick){this.Slick=d;}}).apply((typeof exports!="undefined")?exports:this);(function(){var k={},m={},d=Object.prototype.toString; -k.isNativeCode=function(c){return(/\{\s*\[native code\]\s*\}/).test(""+c);};k.isXML=function(c){return(!!c.xmlVersion)||(!!c.xml)||(d.call(c)=="[object XMLDocument]")||(c.nodeType==9&&c.documentElement.nodeName!="HTML"); -};k.setDocument=function(w){var p=w.nodeType;if(p==9){}else{if(p){w=w.ownerDocument;}else{if(w.navigator){w=w.document;}else{return;}}}if(this.document===w){return; -}this.document=w;var A=w.documentElement,o=this.getUIDXML(A),s=m[o],r;if(s){for(r in s){this[r]=s[r];}return;}s=m[o]={};s.root=A;s.isXMLDocument=this.isXML(w); -s.brokenStarGEBTN=s.starSelectsClosedQSA=s.idGetsName=s.brokenMixedCaseQSA=s.brokenGEBCN=s.brokenCheckedQSA=s.brokenEmptyAttributeQSA=s.isHTMLDocument=s.nativeMatchesSelector=false; -var q,u,y,z,t;var x,v="slick_uniqueid";var c=w.createElement("div");var n=w.body||w.getElementsByTagName("body")[0]||A;n.appendChild(c);try{c.innerHTML=''; -s.isHTMLDocument=!!w.getElementById(v);}catch(C){}if(s.isHTMLDocument){c.style.display="none";c.appendChild(w.createComment(""));u=(c.getElementsByTagName("*").length>1); -try{c.innerHTML="foo";x=c.getElementsByTagName("*");q=(x&&!!x.length&&x[0].nodeName.charAt(0)=="/");}catch(C){}s.brokenStarGEBTN=u||q;try{c.innerHTML=''; -s.idGetsName=w.getElementById(v)===c.firstChild;}catch(C){}if(c.getElementsByClassName){try{c.innerHTML='';c.getElementsByClassName("b").length; -c.firstChild.className="b";z=(c.getElementsByClassName("b").length!=2);}catch(C){}try{c.innerHTML='';y=(c.getElementsByClassName("a").length!=2); -}catch(C){}s.brokenGEBCN=z||y;}if(c.querySelectorAll){try{c.innerHTML="foo";x=c.querySelectorAll("*");s.starSelectsClosedQSA=(x&&!!x.length&&x[0].nodeName.charAt(0)=="/"); -}catch(C){}try{c.innerHTML='';s.brokenMixedCaseQSA=!c.querySelectorAll(".MiX").length;}catch(C){}try{c.innerHTML=''; -s.brokenCheckedQSA=(c.querySelectorAll(":checked").length==0);}catch(C){}try{c.innerHTML='';s.brokenEmptyAttributeQSA=(c.querySelectorAll('[class*=""]').length!=0); -}catch(C){}}try{c.innerHTML='
    ';t=(c.firstChild.getAttribute("action")!="s");}catch(C){}s.nativeMatchesSelector=A.matchesSelector||A.mozMatchesSelector||A.webkitMatchesSelector; -if(s.nativeMatchesSelector){try{s.nativeMatchesSelector.call(A,":slick");s.nativeMatchesSelector=null;}catch(C){}}}try{A.slick_expando=1;delete A.slick_expando; -s.getUID=this.getUIDHTML;}catch(C){s.getUID=this.getUIDXML;}n.removeChild(c);c=x=n=null;s.getAttribute=(s.isHTMLDocument&&t)?function(G,E){var H=this.attributeGetters[E]; -if(H){return H.call(G);}var F=G.getAttributeNode(E);return(F)?F.nodeValue:null;}:function(F,E){var G=this.attributeGetters[E];return(G)?G.call(F):F.getAttribute(E); -};s.hasAttribute=(A&&this.isNativeCode(A.hasAttribute))?function(F,E){return F.hasAttribute(E);}:function(F,E){F=F.getAttributeNode(E);return !!(F&&(F.specified||F.nodeValue)); -};var D=A&&this.isNativeCode(A.contains),B=w&&this.isNativeCode(w.contains);s.contains=(D&&B)?function(E,F){return E.contains(F);}:(D&&!B)?function(E,F){return E===F||((E===w)?w.documentElement:E).contains(F); -}:(A&&A.compareDocumentPosition)?function(E,F){return E===F||!!(E.compareDocumentPosition(F)&16);}:function(E,F){if(F){do{if(F===E){return true;}}while((F=F.parentNode)); -}return false;};s.documentSorter=(A.compareDocumentPosition)?function(F,E){if(!F.compareDocumentPosition||!E.compareDocumentPosition){return 0;}return F.compareDocumentPosition(E)&4?-1:F===E?0:1; -}:("sourceIndex" in A)?function(F,E){if(!F.sourceIndex||!E.sourceIndex){return 0;}return F.sourceIndex-E.sourceIndex;}:(w.createRange)?function(H,F){if(!H.ownerDocument||!F.ownerDocument){return 0; -}var G=H.ownerDocument.createRange(),E=F.ownerDocument.createRange();G.setStart(H,0);G.setEnd(H,0);E.setStart(F,0);E.setEnd(F,0);return G.compareBoundaryPoints(Range.START_TO_END,E); -}:null;A=null;for(r in s){this[r]=s[r];}};var f=/^([#.]?)((?:[\w-]+|\*))$/,h=/\[.+[*$^]=(?:""|'')?\]/,g={};k.search=function(U,z,H,s){var p=this.found=(s)?null:(H||[]); -if(!U){return p;}else{if(U.navigator){U=U.document;}else{if(!U.nodeType){return p;}}}var F,O,V=this.uniques={},I=!!(H&&H.length),y=(U.nodeType==9);if(this.document!==(y?U:U.ownerDocument)){this.setDocument(U); -}if(I){for(O=p.length;O--;){V[this.getUID(p[O])]=true;}}if(typeof z=="string"){var r=z.match(f);simpleSelectors:if(r){var u=r[1],v=r[2],A,E;if(!u){if(v=="*"&&this.brokenStarGEBTN){break simpleSelectors; -}E=U.getElementsByTagName(v);if(s){return E[0]||null;}for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}else{if(u=="#"){if(!this.isHTMLDocument||!y){break simpleSelectors; -}A=U.getElementById(v);if(!A){return p;}if(this.idGetsName&&A.getAttributeNode("id").nodeValue!=v){break simpleSelectors;}if(s){return A||null;}if(!(I&&V[this.getUID(A)])){p.push(A); -}}else{if(u=="."){if(!this.isHTMLDocument||((!U.getElementsByClassName||this.brokenGEBCN)&&U.querySelectorAll)){break simpleSelectors;}if(U.getElementsByClassName&&!this.brokenGEBCN){E=U.getElementsByClassName(v); -if(s){return E[0]||null;}for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}else{var T=new RegExp("(^|\\s)"+e.escapeRegExp(v)+"(\\s|$)");E=U.getElementsByTagName("*"); -for(O=0;A=E[O++];){className=A.className;if(!(className&&T.test(className))){continue;}if(s){return A;}if(!(I&&V[this.getUID(A)])){p.push(A);}}}}}}if(I){this.sort(p); -}return(s)?null:p;}querySelector:if(U.querySelectorAll){if(!this.isHTMLDocument||g[z]||this.brokenMixedCaseQSA||(this.brokenCheckedQSA&&z.indexOf(":checked")>-1)||(this.brokenEmptyAttributeQSA&&h.test(z))||(!y&&z.indexOf(",")>-1)||e.disableQSA){break querySelector; -}var S=z,x=U;if(!y){var C=x.getAttribute("id"),t="slickid__";x.setAttribute("id",t);S="#"+t+" "+S;U=x.parentNode;}try{if(s){return U.querySelector(S)||null; -}else{E=U.querySelectorAll(S);}}catch(Q){g[z]=1;break querySelector;}finally{if(!y){if(C){x.setAttribute("id",C);}else{x.removeAttribute("id");}U=x;}}if(this.starSelectsClosedQSA){for(O=0; -A=E[O++];){if(A.nodeName>"@"&&!(I&&V[this.getUID(A)])){p.push(A);}}}else{for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}if(I){this.sort(p); -}return p;}F=this.Slick.parse(z);if(!F.length){return p;}}else{if(z==null){return p;}else{if(z.Slick){F=z;}else{if(this.contains(U.documentElement||U,z)){(p)?p.push(z):p=z; -return p;}else{return p;}}}}this.posNTH={};this.posNTHLast={};this.posNTHType={};this.posNTHTypeLast={};this.push=(!I&&(s||(F.length==1&&F.expressions[0].length==1)))?this.pushArray:this.pushUID; -if(p==null){p=[];}var M,L,K;var B,J,D,c,q,G,W;var N,P,o,w,R=F.expressions;search:for(O=0;(P=R[O]);O++){for(M=0;(o=P[M]);M++){B="combinator:"+o.combinator; -if(!this[B]){continue search;}J=(this.isXMLDocument)?o.tag:o.tag.toUpperCase();D=o.id;c=o.classList;q=o.classes;G=o.attributes;W=o.pseudos;w=(M===(P.length-1)); -this.bitUniques={};if(w){this.uniques=V;this.found=p;}else{this.uniques={};this.found=[];}if(M===0){this[B](U,J,D,q,G,W,c);if(s&&w&&p.length){break search; -}}else{if(s&&w){for(L=0,K=N.length;L1)){this.sort(p);}return(s)?(p[0]||null):p;};k.uidx=1;k.uidk="slick-uniqueid";k.getUIDXML=function(n){var c=n.getAttribute(this.uidk); -if(!c){c=this.uidx++;n.setAttribute(this.uidk,c);}return c;};k.getUIDHTML=function(c){return c.uniqueNumber||(c.uniqueNumber=this.uidx++);};k.sort=function(c){if(!this.documentSorter){return c; -}c.sort(this.documentSorter);return c;};k.cacheNTH={};k.matchNTH=/^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;k.parseNTHArgument=function(q){var o=q.match(this.matchNTH); -if(!o){return false;}var p=o[2]||false;var n=o[1]||1;if(n=="-"){n=-1;}var c=+o[3]||0;o=(p=="n")?{a:n,b:c}:(p=="odd")?{a:2,b:1}:(p=="even")?{a:2,b:0}:{a:0,b:n}; -return(this.cacheNTH[q]=o);};k.createNTHPseudo=function(p,n,c,o){return function(s,q){var u=this.getUID(s);if(!this[c][u]){var A=s.parentNode;if(!A){return false; -}var r=A[p],t=1;if(o){var z=s.nodeName;do{if(r.nodeName!=z){continue;}this[c][this.getUID(r)]=t++;}while((r=r[n]));}else{do{if(r.nodeType!=1){continue; -}this[c][this.getUID(r)]=t++;}while((r=r[n]));}}q=q||"n";var v=this.cacheNTH[q]||this.parseNTHArgument(q);if(!v){return false;}var y=v.a,x=v.b,w=this[c][u]; -if(y==0){return x==w;}if(y>0){if(w":function(p,c,r,o,n,q){if((p=p.firstChild)){do{if(p.nodeType==1){this.push(p,c,r,o,n,q); -}}while((p=p.nextSibling));}},"+":function(p,c,r,o,n,q){while((p=p.nextSibling)){if(p.nodeType==1){this.push(p,c,r,o,n,q);break;}}},"^":function(p,c,r,o,n,q){p=p.firstChild; -if(p){if(p.nodeType==1){this.push(p,c,r,o,n,q);}else{this["combinator:+"](p,c,r,o,n,q);}}},"~":function(q,c,s,p,n,r){while((q=q.nextSibling)){if(q.nodeType!=1){continue; -}var o=this.getUID(q);if(this.bitUniques[o]){break;}this.bitUniques[o]=true;this.push(q,c,s,p,n,r);}},"++":function(p,c,r,o,n,q){this["combinator:+"](p,c,r,o,n,q); -this["combinator:!+"](p,c,r,o,n,q);},"~~":function(p,c,r,o,n,q){this["combinator:~"](p,c,r,o,n,q);this["combinator:!~"](p,c,r,o,n,q);},"!":function(p,c,r,o,n,q){while((p=p.parentNode)){if(p!==this.document){this.push(p,c,r,o,n,q); -}}},"!>":function(p,c,r,o,n,q){p=p.parentNode;if(p!==this.document){this.push(p,c,r,o,n,q);}},"!+":function(p,c,r,o,n,q){while((p=p.previousSibling)){if(p.nodeType==1){this.push(p,c,r,o,n,q); -break;}}},"!^":function(p,c,r,o,n,q){p=p.lastChild;if(p){if(p.nodeType==1){this.push(p,c,r,o,n,q);}else{this["combinator:!+"](p,c,r,o,n,q);}}},"!~":function(q,c,s,p,n,r){while((q=q.previousSibling)){if(q.nodeType!=1){continue; -}var o=this.getUID(q);if(this.bitUniques[o]){break;}this.bitUniques[o]=true;this.push(q,c,s,p,n,r);}}};for(var i in j){k["combinator:"+i]=j[i];}var l={empty:function(c){var n=c.firstChild; -return !(n&&n.nodeType==1)&&!(c.innerText||c.textContent||"").length;},not:function(c,n){return !this.matchNode(c,n);},contains:function(c,n){return(c.innerText||c.textContent||"").indexOf(n)>-1; -},"first-child":function(c){while((c=c.previousSibling)){if(c.nodeType==1){return false;}}return true;},"last-child":function(c){while((c=c.nextSibling)){if(c.nodeType==1){return false; -}}return true;},"only-child":function(o){var n=o;while((n=n.previousSibling)){if(n.nodeType==1){return false;}}var c=o;while((c=c.nextSibling)){if(c.nodeType==1){return false; -}}return true;},"nth-child":k.createNTHPseudo("firstChild","nextSibling","posNTH"),"nth-last-child":k.createNTHPseudo("lastChild","previousSibling","posNTHLast"),"nth-of-type":k.createNTHPseudo("firstChild","nextSibling","posNTHType",true),"nth-last-of-type":k.createNTHPseudo("lastChild","previousSibling","posNTHTypeLast",true),index:function(n,c){return this["pseudo:nth-child"](n,""+(c+1)); -},even:function(c){return this["pseudo:nth-child"](c,"2n");},odd:function(c){return this["pseudo:nth-child"](c,"2n+1");},"first-of-type":function(c){var n=c.nodeName; -while((c=c.previousSibling)){if(c.nodeName==n){return false;}}return true;},"last-of-type":function(c){var n=c.nodeName;while((c=c.nextSibling)){if(c.nodeName==n){return false; -}}return true;},"only-of-type":function(o){var n=o,p=o.nodeName;while((n=n.previousSibling)){if(n.nodeName==p){return false;}}var c=o;while((c=c.nextSibling)){if(c.nodeName==p){return false; -}}return true;},enabled:function(c){return !c.disabled;},disabled:function(c){return c.disabled;},checked:function(c){return c.checked||c.selected;},focus:function(c){return this.isHTMLDocument&&this.document.activeElement===c&&(c.href||c.type||this.hasAttribute(c,"tabindex")); -},root:function(c){return(c===this.root);},selected:function(c){return c.selected;}};for(var b in l){k["pseudo:"+b]=l[b];}var a=k.attributeGetters={"for":function(){return("htmlFor" in this)?this.htmlFor:this.getAttribute("for"); -},href:function(){return("href" in this)?this.getAttribute("href",2):this.getAttribute("href");},style:function(){return(this.style)?this.style.cssText:this.getAttribute("style"); -},tabindex:function(){var c=this.getAttributeNode("tabindex");return(c&&c.specified)?c.nodeValue:null;},type:function(){return this.getAttribute("type"); -},maxlength:function(){var c=this.getAttributeNode("maxLength");return(c&&c.specified)?c.nodeValue:null;}};a.MAXLENGTH=a.maxLength=a.maxlength;var e=k.Slick=(this.Slick||{}); -e.version="1.1.7";e.search=function(n,o,c){return k.search(n,o,c);};e.find=function(c,n){return k.search(c,n,null,true);};e.contains=function(c,n){k.setDocument(c); -return k.contains(c,n);};e.getAttribute=function(n,c){k.setDocument(n);return k.getAttribute(n,c);};e.hasAttribute=function(n,c){k.setDocument(n);return k.hasAttribute(n,c); -};e.match=function(n,c){if(!(n&&c)){return false;}if(!c||c===n){return true;}k.setDocument(n);return k.matchNode(n,c);};e.defineAttributeGetter=function(c,n){k.attributeGetters[c]=n; -return this;};e.lookupAttributeGetter=function(c){return k.attributeGetters[c];};e.definePseudo=function(c,n){k["pseudo:"+c]=function(p,o){return n.call(p,o); -};return this;};e.lookupPseudo=function(c){var n=k["pseudo:"+c];if(n){return function(o){return n.call(this,o);};}return null;};e.override=function(n,c){k.override(n,c); -return this;};e.isXML=k.isXML;e.uidOf=function(c){return k.getUIDHTML(c);};if(!this.Slick){this.Slick=e;}}).apply((typeof exports!="undefined")?exports:this); -var Element=function(b,g){var h=Element.Constructors[b];if(h){return h(g);}if(typeof b!="string"){return document.id(b).set(g);}if(!g){g={};}if(!(/^[\w-]+$/).test(b)){var e=Slick.parse(b).expressions[0][0]; -b=(e.tag=="*")?"div":e.tag;if(e.id&&g.id==null){g.id=e.id;}var d=e.attributes;if(d){for(var a,f=0,c=d.length;f=this.length){delete this[g--];}return e;}.protect());}Array.forEachMethod(function(g,e){Elements.implement(e,g);});Array.mirror(Elements);var d; -try{d=(document.createElement("").name=="x");}catch(b){}var c=function(e){return(""+e).replace(/&/g,"&").replace(/"/g,""");};Document.implement({newElement:function(e,g){if(g&&g.checked!=null){g.defaultChecked=g.checked; -}if(d&&g){e="<"+e;if(g.name){e+=' name="'+c(g.name)+'"';}if(g.type){e+=' type="'+c(g.type)+'"';}e+=">";delete g.name;delete g.type;}return this.id(this.createElement(e)).set(g); -}});})();(function(){Slick.uidOf(window);Slick.uidOf(document);Document.implement({newTextNode:function(e){return this.createTextNode(e);},getDocument:function(){return this; -},getWindow:function(){return this.window;},id:(function(){var e={string:function(E,D,l){E=Slick.find(l,"#"+E.replace(/(\W)/g,"\\$1"));return(E)?e.element(E,D):null; -},element:function(D,E){Slick.uidOf(D);if(!E&&!D.$family&&!(/^(?:object|embed)$/i).test(D.tagName)){var l=D.fireEvent;D._fireEvent=function(F,G){return l(F,G); -};Object.append(D,Element.Prototype);}return D;},object:function(D,E,l){if(D.toElement){return e.element(D.toElement(l),E);}return null;}};e.textnode=e.whitespace=e.window=e.document=function(l){return l; -};return function(D,F,E){if(D&&D.$family&&D.uniqueNumber){return D;}var l=typeOf(D);return(e[l])?e[l](D,F,E||document):null;};})()});if(window.$==null){Window.implement("$",function(e,l){return document.id(e,l,this.document); -});}Window.implement({getDocument:function(){return this.document;},getWindow:function(){return this;}});[Document,Element].invoke("implement",{getElements:function(e){return Slick.search(this,e,new Elements); -},getElement:function(e){return document.id(Slick.find(this,e));}});var m={contains:function(e){return Slick.contains(this,e);}};if(!document.contains){Document.implement(m); -}if(!document.createElement("div").contains){Element.implement(m);}Element.implement("hasChild",function(e){return this!==e&&this.contains(e);});(function(l,E,e){this.Selectors={}; -var F=this.Selectors.Pseudo=new Hash();var D=function(){for(var G in F){if(F.hasOwnProperty(G)){Slick.definePseudo(G,F[G]);delete F[G];}}};Slick.search=function(H,I,G){D(); -return l.call(this,H,I,G);};Slick.find=function(G,H){D();return E.call(this,G,H);};Slick.match=function(H,G){D();return e.call(this,H,G);};})(Slick.search,Slick.find,Slick.match); -var r=function(E,D){if(!E){return D;}E=Object.clone(Slick.parse(E));var l=E.expressions;for(var e=l.length;e--;){l[e][0].combinator=D;}return E;};Object.forEach({getNext:"~",getPrevious:"!~",getParent:"!"},function(e,l){Element.implement(l,function(D){return this.getElement(r(D,e)); -});});Object.forEach({getAllNext:"~",getAllPrevious:"!~",getSiblings:"~~",getChildren:">",getParents:"!"},function(e,l){Element.implement(l,function(D){return this.getElements(r(D,e)); -});});Element.implement({getFirst:function(e){return document.id(Slick.search(this,r(e,">"))[0]);},getLast:function(e){return document.id(Slick.search(this,r(e,">")).getLast()); -},getWindow:function(){return this.ownerDocument.window;},getDocument:function(){return this.ownerDocument;},getElementById:function(e){return document.id(Slick.find(this,"#"+(""+e).replace(/(\W)/g,"\\$1"))); -},match:function(e){return !e||Slick.match(this,e);}});if(window.$$==null){Window.implement("$$",function(e){var H=new Elements;if(arguments.length==1&&typeof e=="string"){return Slick.search(this.document,e,H); -}var E=Array.flatten(arguments);for(var F=0,D=E.length;F(?![^<]*<['"])/)).indexOf(F)<0){return null;}E[F]=true;}}var e=Slick.getAttribute(this,F); -return(!e&&!Slick.hasAttribute(this,F))?null:e;},getProperties:function(){var e=Array.from(arguments);return e.map(this.getProperty,this).associate(e); -},removeProperty:function(e){return this.setProperty(e,null);},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this;},set:function(D,l){var e=Element.Properties[D]; -(e&&e.set)?e.set.call(this,l):this.setProperty(D,l);}.overloadSetter(),get:function(l){var e=Element.Properties[l];return(e&&e.get)?e.get.apply(this):this.getProperty(l); -}.overloadGetter(),erase:function(l){var e=Element.Properties[l];(e&&e.erase)?e.erase.apply(this):this.removeProperty(l);return this;},hasClass:function(e){return this.className.clean().contains(e," "); -},addClass:function(e){if(!this.hasClass(e)){this.className=(this.className+" "+e).clean();}return this;},removeClass:function(e){this.className=this.className.replace(new RegExp("(^|\\s)"+e+"(?:\\s|$)"),"$1"); -return this;},toggleClass:function(e,l){if(l==null){l=!this.hasClass(e);}return(l)?this.addClass(e):this.removeClass(e);},adopt:function(){var E=this,e,G=Array.flatten(arguments),F=G.length; -if(F>1){E=e=document.createDocumentFragment();}for(var D=0;D";var a=(t.childNodes.length==1);if(!a){var s="abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "),b=document.createDocumentFragment(),u=s.length; -while(u--){b.createElement(s[u]);}}t=null;var g=Function.attempt(function(){var e=document.createElement("table");e.innerHTML="";return true; -});var c=document.createElement("tr"),o="";c.innerHTML=o;var y=(c.innerHTML==o);c=null;if(!g||!y||!a){Element.Properties.html.set=(function(l){var e={table:[1,"","
    "],select:[1,""],tbody:[2,"","
    "],tr:[3,"","
    "]}; -e.thead=e.tfoot=e.tbody;return function(D){var E=e[this.get("tag")];if(!E&&!a){E=[0,"",""];}if(!E){return l.call(this,D);}var H=E[0],G=document.createElement("div"),F=G; -if(!a){b.appendChild(G);}G.innerHTML=[E[1],D,E[2]].flatten().join("");while(H--){F=F.firstChild;}this.empty().adopt(F.childNodes);if(!a){b.removeChild(G); -}G=null;};})(Element.Properties.html.set);}var n=document.createElement("form");n.innerHTML="";if(n.firstChild.value!="s"){Element.Properties.value={set:function(G){var l=this.get("tag"); -if(l!="select"){return this.setProperty("value",G);}var D=this.getElements("option");for(var E=0;E0||k==null?"visible":"hidden";};var f=(h?function(l,k){l.style.opacity=k;}:(e?function(l,k){var n=l.style; -if(!l.currentStyle||!l.currentStyle.hasLayout){n.zoom=1;}if(k==null||k==1){k="";}else{k="alpha(opacity="+(k*100).limit(0,100).round()+")";}var m=n.filter||l.getComputedStyle("filter")||""; -n.filter=j.test(m)?m.replace(j,k):m+k;if(!n.filter){n.removeAttribute("filter");}}:a));var g=(h?function(l){var k=l.style.opacity||l.getComputedStyle("opacity"); -return(k=="")?1:k.toFloat();}:(e?function(l){var m=(l.style.filter||l.getComputedStyle("filter")),k;if(m){k=m.match(j);}return(k==null||m==null)?1:(k[1]/100); -}:function(l){var k=l.retrieve("$opacity");if(k==null){k=(l.style.visibility=="hidden"?0:1);}return k;}));var b=(i.style.cssFloat==null)?"styleFloat":"cssFloat"; -Element.implement({getComputedStyle:function(m){if(this.currentStyle){return this.currentStyle[m.camelCase()];}var l=Element.getDocument(this).defaultView,k=l?l.getComputedStyle(this,null):null; -return(k)?k.getPropertyValue((m==b)?"float":m.hyphenate()):null;},setStyle:function(l,k){if(l=="opacity"){if(k!=null){k=parseFloat(k);}f(this,k);return this; -}l=(l=="float"?b:l).camelCase();if(typeOf(k)!="string"){var m=(Element.Styles[l]||"@").split(" ");k=Array.from(k).map(function(o,n){if(!m[n]){return""; -}return(typeOf(o)=="number")?m[n].replace("@",Math.round(o)):o;}).join(" ");}else{if(k==String(Number(k))){k=Math.round(k);}}this.style[l]=k;if((k==""||k==null)&&c&&this.style.removeAttribute){this.style.removeAttribute(l); -}return this;},getStyle:function(q){if(q=="opacity"){return g(this);}q=(q=="float"?b:q).camelCase();var k=this.style[q];if(!k||q=="zIndex"){k=[];for(var p in Element.ShortStyles){if(q!=p){continue; -}for(var o in Element.ShortStyles[p]){k.push(this.getStyle(o));}return k.join(" ");}k=this.getComputedStyle(q);}if(k){k=String(k);var m=k.match(/rgba?\([\d\s,]+\)/); -if(m){k=k.replace(m[0],m[0].rgbToHex());}}if(Browser.opera||Browser.ie){if((/^(height|width)$/).test(q)&&!(/px$/.test(k))){var l=(q=="width")?["left","right"]:["top","bottom"],n=0; -l.each(function(r){n+=this.getStyle("border-"+r+"-width").toInt()+this.getStyle("padding-"+r).toInt();},this);return this["offset"+q.capitalize()]-n+"px"; -}if(Browser.ie&&(/^border(.+)Width|margin|padding/).test(q)&&isNaN(parseFloat(k))){return"0px";}}return k;},setStyles:function(l){for(var k in l){this.setStyle(k,l[k]); -}return this;},getStyles:function(){var k={};Array.flatten(arguments).each(function(l){k[l]=this.getStyle(l);},this);return k;}});Element.Styles={left:"@px",top:"@px",bottom:"@px",right:"@px",width:"@px",height:"@px",maxWidth:"@px",maxHeight:"@px",minWidth:"@px",minHeight:"@px",backgroundColor:"rgb(@, @, @)",backgroundPosition:"@px @px",color:"rgb(@, @, @)",fontSize:"@px",letterSpacing:"@px",lineHeight:"@px",clip:"rect(@px @px @px @px)",margin:"@px @px @px @px",padding:"@px @px @px @px",border:"@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)",borderWidth:"@px @px @px @px",borderStyle:"@ @ @ @",borderColor:"rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)",zIndex:"@",zoom:"@",fontWeight:"@",textIndent:"@px",opacity:"@"}; -Element.implement({setOpacity:function(k){f(this,k);return this;},getOpacity:function(){return g(this);}});Element.Properties.opacity={set:function(k){f(this,k); -a(this,k);},get:function(){return g(this);}};Element.Styles=new Hash(Element.Styles);Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}}; -["Top","Right","Bottom","Left"].each(function(q){var p=Element.ShortStyles;var l=Element.Styles;["margin","padding"].each(function(r){var s=r+q;p[r][s]=l[s]="@px"; -});var o="border"+q;p.border[o]=l[o]="@px @ rgb(@, @, @)";var n=o+"Width",k=o+"Style",m=o+"Color";p[o]={};p.borderWidth[n]=p[o][n]=l[n]="@px";p.borderStyle[k]=p[o][k]=l[k]="@"; -p.borderColor[m]=p[o][m]=l[m]="rgb(@, @, @)";});})();(function(){Element.Properties.events={set:function(b){this.addEvents(b);}};[Element,Window,Document].invoke("implement",{addEvent:function(f,h){var i=this.retrieve("events",{}); -if(!i[f]){i[f]={keys:[],values:[]};}if(i[f].keys.contains(h)){return this;}i[f].keys.push(h);var g=f,b=Element.Events[f],d=h,j=this;if(b){if(b.onAdd){b.onAdd.call(this,h,f); -}if(b.condition){d=function(k){if(b.condition.call(this,k,f)){return h.call(this,k);}return true;};}if(b.base){g=Function.from(b.base).call(this,f);}}var e=function(){return h.call(j); -};var c=Element.NativeEvents[g];if(c){if(c==2){e=function(k){k=new DOMEvent(k,j.getWindow());if(d.call(j,k)===false){k.stop();}};}this.addListener(g,e,arguments[2]); -}i[f].values.push(e);return this;},removeEvent:function(e,d){var c=this.retrieve("events");if(!c||!c[e]){return this;}var h=c[e];var b=h.keys.indexOf(d); -if(b==-1){return this;}var g=h.values[b];delete h.keys[b];delete h.values[b];var f=Element.Events[e];if(f){if(f.onRemove){f.onRemove.call(this,d,e);}if(f.base){e=Function.from(f.base).call(this,e); -}}return(Element.NativeEvents[e])?this.removeListener(e,g,arguments[2]):this;},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]);}return this; -},removeEvents:function(b){var d;if(typeOf(b)=="object"){for(d in b){this.removeEvent(d,b[d]);}return this;}var c=this.retrieve("events");if(!c){return this; -}if(!b){for(d in c){this.removeEvents(d);}this.eliminate("events");}else{if(c[b]){c[b].keys.each(function(e){this.removeEvent(b,e);},this);delete c[b]; -}}return this;},fireEvent:function(e,c,b){var d=this.retrieve("events");if(!d||!d[e]){return this;}c=Array.from(c);d[e].keys.each(function(f){if(b){f.delay(b,this,c); -}else{f.apply(this,c);}},this);return this;},cloneEvents:function(e,d){e=document.id(e);var c=e.retrieve("events");if(!c){return this;}if(!d){for(var b in c){this.cloneEvents(e,b); -}}else{if(c[d]){c[d].keys.each(function(f){this.addEvent(d,f);},this);}}return this;}});Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,orientationchange:2,touchstart:2,touchmove:2,touchend:2,touchcancel:2,gesturestart:2,gesturechange:2,gestureend:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,paste:2,input:2,load:2,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,error:1,abort:1,scroll:1}; -Element.Events={mousewheel:{base:(Browser.firefox)?"DOMMouseScroll":"mousewheel"}};if("onmouseenter" in document.documentElement){Element.NativeEvents.mouseenter=Element.NativeEvents.mouseleave=2; -}else{var a=function(b){var c=b.relatedTarget;if(c==null){return true;}if(!c){return false;}return(c!=this&&c.prefix!="xul"&&typeOf(this)!="document"&&!this.contains(c)); -};Element.Events.mouseenter={base:"mouseover",condition:a};Element.Events.mouseleave={base:"mouseout",condition:a};}if(!window.addEventListener){Element.NativeEvents.propertychange=2; -Element.Events.change={base:function(){var b=this.type;return(this.get("tag")=="input"&&(b=="radio"||b=="checkbox"))?"propertychange":"change";},condition:function(b){return this.type!="radio"||(b.event.propertyName=="checked"&&this.checked); -}};}Element.Events=new Hash(Element.Events);})();(function(){var c=!!window.addEventListener;Element.NativeEvents.focusin=Element.NativeEvents.focusout=2; -var k=function(l,m,n,o,p){while(p&&p!=l){if(m(p,o)){return n.call(p,o,p);}p=document.id(p.parentNode);}};var a={mouseenter:{base:"mouseover"},mouseleave:{base:"mouseout"},focus:{base:"focus"+(c?"":"in"),capture:true},blur:{base:c?"blur":"focusout",capture:true}}; -var b="$delegation:";var i=function(l){return{base:"focusin",remove:function(m,o){var p=m.retrieve(b+l+"listeners",{})[o];if(p&&p.forms){for(var n=p.forms.length; -n--;){p.forms[n].removeEvent(l,p.fns[n]);}}},listen:function(x,r,v,n,t,s){var o=(t.get("tag")=="form")?t:n.target.getParent("form");if(!o){return;}var u=x.retrieve(b+l+"listeners",{}),p=u[s]||{forms:[],fns:[]},m=p.forms,w=p.fns; -if(m.indexOf(o)!=-1){return;}m.push(o);var q=function(y){k(x,r,v,y,t);};o.addEvent(l,q);w.push(q);u[s]=p;x.store(b+l+"listeners",u);}};};var d=function(l){return{base:"focusin",listen:function(m,n,p,q,r){var o={blur:function(){this.removeEvents(o); -}};o[l]=function(s){k(m,n,p,s,r);};q.target.addEvents(o);}};};if(!c){Object.append(a,{submit:i("submit"),reset:i("reset"),change:d("change"),select:d("select")}); -}var h=Element.prototype,f=h.addEvent,j=h.removeEvent;var e=function(l,m){return function(r,q,n){if(r.indexOf(":relay")==-1){return l.call(this,r,q,n); -}var o=Slick.parse(r).expressions[0][0];if(o.pseudos[0].key!="relay"){return l.call(this,r,q,n);}var p=o.tag;o.pseudos.slice(1).each(function(s){p+=":"+s.key+(s.value?"("+s.value+")":""); -});l.call(this,r,q);return m.call(this,p,o.pseudos[0].value,q);};};var g={addEvent:function(v,q,x){var t=this.retrieve("$delegates",{}),r=t[v];if(r){for(var y in r){if(r[y].fn==x&&r[y].match==q){return this; -}}}var p=v,u=q,o=x,n=a[v]||{};v=n.base||p;q=function(B){return Slick.match(B,u);};var w=Element.Events[p];if(w&&w.condition){var l=q,m=w.condition;q=function(C,B){return l(C,B)&&m.call(C,B,v); -};}var z=this,s=String.uniqueID();var A=n.listen?function(B,C){if(!C&&B&&B.target){C=B.target;}if(C){n.listen(z,q,x,B,C,s);}}:function(B,C){if(!C&&B&&B.target){C=B.target; -}if(C){k(z,q,x,B,C);}};if(!r){r={};}r[s]={match:u,fn:o,delegator:A};t[p]=r;return f.call(this,v,A,n.capture);},removeEvent:function(r,n,t,u){var q=this.retrieve("$delegates",{}),p=q[r]; -if(!p){return this;}if(u){var m=r,w=p[u].delegator,l=a[r]||{};r=l.base||m;if(l.remove){l.remove(this,u);}delete p[u];q[m]=p;return j.call(this,r,w);}var o,v; -if(t){for(o in p){v=p[o];if(v.match==n&&v.fn==t){return g.removeEvent.call(this,r,n,t,o);}}}else{for(o in p){v=p[o];if(v.match==n){g.removeEvent.call(this,r,n,v.fn,o); -}}}return this;}};[Element,Window,Document].invoke("implement",{addEvent:e(f,g.addEvent),removeEvent:e(j,g.removeEvent)});})();(function(){var h=document.createElement("div"),e=document.createElement("div"); -h.style.height="0";h.appendChild(e);var d=(e.offsetParent===h);h=e=null;var l=function(m){return k(m,"position")!="static"||a(m);};var i=function(m){return l(m)||(/^(?:table|td|th)$/i).test(m.tagName); -};Element.implement({scrollTo:function(m,n){if(a(this)){this.getWindow().scrollTo(m,n);}else{this.scrollLeft=m;this.scrollTop=n;}return this;},getSize:function(){if(a(this)){return this.getWindow().getSize(); -}return{x:this.offsetWidth,y:this.offsetHeight};},getScrollSize:function(){if(a(this)){return this.getWindow().getScrollSize();}return{x:this.scrollWidth,y:this.scrollHeight}; -},getScroll:function(){if(a(this)){return this.getWindow().getScroll();}return{x:this.scrollLeft,y:this.scrollTop};},getScrolls:function(){var n=this.parentNode,m={x:0,y:0}; -while(n&&!a(n)){m.x+=n.scrollLeft;m.y+=n.scrollTop;n=n.parentNode;}return m;},getOffsetParent:d?function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null; -}var n=(k(m,"position")=="static")?i:l;while((m=m.parentNode)){if(n(m)){return m;}}return null;}:function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null; -}try{return m.offsetParent;}catch(n){}return null;},getOffsets:function(){if(this.getBoundingClientRect&&!Browser.Platform.ios){var r=this.getBoundingClientRect(),o=document.id(this.getDocument().documentElement),q=o.getScroll(),t=this.getScrolls(),s=(k(this,"position")=="fixed"); -return{x:r.left.toInt()+t.x+((s)?0:q.x)-o.clientLeft,y:r.top.toInt()+t.y+((s)?0:q.y)-o.clientTop};}var n=this,m={x:0,y:0};if(a(this)){return m;}while(n&&!a(n)){m.x+=n.offsetLeft; -m.y+=n.offsetTop;if(Browser.firefox){if(!c(n)){m.x+=b(n);m.y+=g(n);}var p=n.parentNode;if(p&&k(p,"overflow")!="visible"){m.x+=b(p);m.y+=g(p);}}else{if(n!=this&&Browser.safari){m.x+=b(n); -m.y+=g(n);}}n=n.offsetParent;}if(Browser.firefox&&!c(this)){m.x-=b(this);m.y-=g(this);}return m;},getPosition:function(p){var q=this.getOffsets(),n=this.getScrolls(); -var m={x:q.x-n.x,y:q.y-n.y};if(p&&(p=document.id(p))){var o=p.getPosition();return{x:m.x-o.x-b(p),y:m.y-o.y-g(p)};}return m;},getCoordinates:function(o){if(a(this)){return this.getWindow().getCoordinates(); -}var m=this.getPosition(o),n=this.getSize();var p={left:m.x,top:m.y,width:n.x,height:n.y};p.right=p.left+p.width;p.bottom=p.top+p.height;return p;},computePosition:function(m){return{left:m.x-j(this,"margin-left"),top:m.y-j(this,"margin-top")}; -},setPosition:function(m){return this.setStyles(this.computePosition(m));}});[Document,Window].invoke("implement",{getSize:function(){var m=f(this);return{x:m.clientWidth,y:m.clientHeight}; -},getScroll:function(){var n=this.getWindow(),m=f(this);return{x:n.pageXOffset||m.scrollLeft,y:n.pageYOffset||m.scrollTop};},getScrollSize:function(){var o=f(this),n=this.getSize(),m=this.getDocument().body; -return{x:Math.max(o.scrollWidth,m.scrollWidth,n.x),y:Math.max(o.scrollHeight,m.scrollHeight,n.y)};},getPosition:function(){return{x:0,y:0};},getCoordinates:function(){var m=this.getSize(); -return{top:0,left:0,bottom:m.y,right:m.x,height:m.y,width:m.x};}});var k=Element.getComputedStyle;function j(m,n){return k(m,n).toInt()||0;}function c(m){return k(m,"-moz-box-sizing")=="border-box"; -}function g(m){return j(m,"border-top-width");}function b(m){return j(m,"border-left-width");}function a(m){return(/^(?:body|html)$/i).test(m.tagName); -}function f(m){var n=m.getDocument();return(!n.compatMode||n.compatMode=="CSS1Compat")?n.html:n.body;}})();Element.alias({position:"setPosition"});[Window,Document,Element].invoke("implement",{getHeight:function(){return this.getSize().y; -},getWidth:function(){return this.getSize().x;},getScrollTop:function(){return this.getScroll().y;},getScrollLeft:function(){return this.getScroll().x; -},getScrollHeight:function(){return this.getScrollSize().y;},getScrollWidth:function(){return this.getScrollSize().x;},getTop:function(){return this.getPosition().y; -},getLeft:function(){return this.getPosition().x;}});(function(){var f=this.Fx=new Class({Implements:[Chain,Events,Options],options:{fps:60,unit:false,duration:500,frames:null,frameSkip:true,link:"ignore"},initialize:function(g){this.subject=this.subject||this; -this.setOptions(g);},getTransition:function(){return function(g){return -(Math.cos(Math.PI*g)-1)/2;};},step:function(g){if(this.options.frameSkip){var h=(this.time!=null)?(g-this.time):0,i=h/this.frameInterval; -this.time=g;this.frame+=i;}else{this.frame++;}if(this.frame=(7-4*d)/11){e=c*c-Math.pow((11-6*d-11*f)/4,2);break;}}return e;},Elastic:function(b,a){return Math.pow(2,10*--b)*Math.cos(20*b*Math.PI*(a&&a[0]||1)/3); -}});["Quad","Cubic","Quart","Quint"].each(function(b,a){Fx.Transitions[b]=new Fx.Transition(function(c){return Math.pow(c,a+2);});});(function(){var d=function(){},a=("onprogress" in new Browser.Request); -var c=this.Request=new Class({Implements:[Chain,Events,Options],options:{url:"",data:"",headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript, text/html, application/xml, text/xml, */*"},async:true,format:false,method:"post",link:"ignore",isSuccess:null,emulation:true,urlEncoded:true,encoding:"utf-8",evalScripts:false,evalResponse:false,timeout:0,noCache:false},initialize:function(e){this.xhr=new Browser.Request(); -this.setOptions(e);this.headers=this.options.headers;},onStateChange:function(){var e=this.xhr;if(e.readyState!=4||!this.running){return;}this.running=false; -this.status=0;Function.attempt(function(){var f=e.status;this.status=(f==1223)?204:f;}.bind(this));e.onreadystatechange=d;if(a){e.onprogress=e.onloadstart=d; -}clearTimeout(this.timer);this.response={text:this.xhr.responseText||"",xml:this.xhr.responseXML};if(this.options.isSuccess.call(this,this.status)){this.success(this.response.text,this.response.xml); -}else{this.failure();}},isSuccess:function(){var e=this.status;return(e>=200&&e<300);},isRunning:function(){return !!this.running;},processScripts:function(e){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return Browser.exec(e); -}return e.stripScripts(this.options.evalScripts);},success:function(f,e){this.onSuccess(this.processScripts(f),e);},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain(); -},failure:function(){this.onFailure();},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr);},loadstart:function(e){this.fireEvent("loadstart",[e,this.xhr]); -},progress:function(e){this.fireEvent("progress",[e,this.xhr]);},timeout:function(){this.fireEvent("timeout",this.xhr);},setHeader:function(e,f){this.headers[e]=f; -return this;},getHeader:function(e){return Function.attempt(function(){return this.xhr.getResponseHeader(e);}.bind(this));},check:function(){if(!this.running){return true; -}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.pass(arguments,this));return false;}return false;},send:function(o){if(!this.check(o)){return this; -}this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.running=true;var l=typeOf(o);if(l=="string"||l=="element"){o={data:o};}var h=this.options; -o=Object.append({data:h.data,url:h.url,method:h.method},o);var j=o.data,f=String(o.url),e=o.method.toLowerCase();switch(typeOf(j)){case"element":j=document.id(j).toQueryString(); -break;case"object":case"hash":j=Object.toQueryString(j);}if(this.options.format){var m="format="+this.options.format;j=(j)?m+"&"+j:m;}if(this.options.emulation&&!["get","post"].contains(e)){var k="_method="+e; -j=(j)?k+"&"+j:k;e="post";}if(this.options.urlEncoded&&["post","put"].contains(e)){var g=(this.options.encoding)?"; charset="+this.options.encoding:"";this.headers["Content-type"]="application/x-www-form-urlencoded"+g; -}if(!f){f=document.location.pathname;}var i=f.lastIndexOf("/");if(i>-1&&(i=f.indexOf("#"))>-1){f=f.substr(0,i);}if(this.options.noCache){f+=(f.contains("?")?"&":"?")+String.uniqueID(); -}if(j&&e=="get"){f+=(f.contains("?")?"&":"?")+j;j=null;}var n=this.xhr;if(a){n.onloadstart=this.loadstart.bind(this);n.onprogress=this.progress.bind(this); -}n.open(e.toUpperCase(),f,this.options.async,this.options.user,this.options.password);if(this.options.user&&"withCredentials" in n){n.withCredentials=true; -}n.onreadystatechange=this.onStateChange.bind(this);Object.each(this.headers,function(q,p){try{n.setRequestHeader(p,q);}catch(r){this.fireEvent("exception",[p,q]); -}},this);this.fireEvent("request");n.send(j);if(!this.options.async){this.onStateChange();}else{if(this.options.timeout){this.timer=this.timeout.delay(this.options.timeout,this); -}}return this;},cancel:function(){if(!this.running){return this;}this.running=false;var e=this.xhr;e.abort();clearTimeout(this.timer);e.onreadystatechange=d; -if(a){e.onprogress=e.onloadstart=d;}this.xhr=new Browser.Request();this.fireEvent("cancel");return this;}});var b={};["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(e){b[e]=function(g){var f={method:e}; -if(g!=null){f.data=g;}return this.send(f);};});c.implement(b);Element.Properties.send={set:function(e){var f=this.get("send").cancel();f.setOptions(e); -return this;},get:function(){var e=this.retrieve("send");if(!e){e=new c({data:this,link:"cancel",method:this.get("method")||"post",url:this.get("action")}); -this.store("send",e);}return e;}};Element.implement({send:function(e){var f=this.get("send");f.send({data:this,url:e||f.options.url});return this;}});})(); -Request.HTML=new Class({Extends:Request,options:{update:false,append:false,evalScripts:true,filter:false,headers:{Accept:"text/html, application/xml, text/xml, */*"}},success:function(f){var e=this.options,c=this.response; -c.html=f.stripScripts(function(h){c.javascript=h;});var d=c.html.match(/]*>([\s\S]*?)<\/body>/i);if(d){c.html=d[1];}var b=new Element("div").set("html",c.html); -c.tree=b.childNodes;c.elements=b.getElements(e.filter||"*");if(e.filter){c.tree=c.elements;}if(e.update){var g=document.id(e.update).empty();if(e.filter){g.adopt(c.elements); -}else{g.set("html",c.html);}}else{if(e.append){var a=document.id(e.append);if(e.filter){c.elements.reverse().inject(a);}else{a.adopt(b.getChildren());}}}if(e.evalScripts){Browser.exec(c.javascript); -}this.onSuccess(c.tree,c.elements,c.html,c.javascript);}});Element.Properties.load={set:function(a){var b=this.get("load").cancel();b.setOptions(a);return this; -},get:function(){var a=this.retrieve("load");if(!a){a=new Request.HTML({data:this,link:"cancel",update:this,method:"get"});this.store("load",a);}return a; -}};Element.implement({load:function(){this.get("load").send(Array.link(arguments,{data:Type.isObject,url:Type.isString}));return this;}});if(typeof JSON=="undefined"){this.JSON={}; -}JSON=new Hash({stringify:JSON.stringify,parse:JSON.parse});(function(){var special={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"}; -var escape=function(chr){return special[chr]||"\\u"+("0000"+chr.charCodeAt(0).toString(16)).slice(-4);};JSON.validate=function(string){string=string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""); -return(/^[\],:{}\s]*$/).test(string);};JSON.encode=JSON.stringify?function(obj){return JSON.stringify(obj);}:function(obj){if(obj&&obj.toJSON){obj=obj.toJSON(); -}switch(typeOf(obj)){case"string":return'"'+obj.replace(/[\x00-\x1f\\"]/g,escape)+'"';case"array":return"["+obj.map(JSON.encode).clean()+"]";case"object":case"hash":var string=[]; -Object.each(obj,function(value,key){var json=JSON.encode(value);if(json){string.push(JSON.encode(key)+":"+json);}});return"{"+string+"}";case"number":case"boolean":return""+obj; -case"null":return"null";}return null;};JSON.decode=function(string,secure){if(!string||typeOf(string)!="string"){return null;}if(secure||JSON.secure){if(JSON.parse){return JSON.parse(string); -}if(!JSON.validate(string)){throw new Error("JSON could not decode the input; security is enabled and the value is not secure.");}}return eval("("+string+")"); -};})();Request.JSON=new Class({Extends:Request,options:{secure:true},initialize:function(a){this.parent(a);Object.append(this.headers,{Accept:"application/json","X-Request":"JSON"}); -},success:function(c){var b;try{b=this.response.json=JSON.decode(c,this.options.secure);}catch(a){this.fireEvent("error",[c,a]);return;}if(b==null){this.onFailure(); -}else{this.onSuccess(b,c);}}});var Cookie=new Class({Implements:Options,options:{path:"/",domain:false,duration:false,secure:false,document:document,encode:true},initialize:function(b,a){this.key=b; -this.setOptions(a);},write:function(b){if(this.options.encode){b=encodeURIComponent(b);}if(this.options.domain){b+="; domain="+this.options.domain;}if(this.options.path){b+="; path="+this.options.path; -}if(this.options.duration){var a=new Date();a.setTime(a.getTime()+this.options.duration*24*60*60*1000);b+="; expires="+a.toGMTString();}if(this.options.secure){b+="; secure"; -}this.options.document.cookie=this.key+"="+b;return this;},read:function(){var a=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)"); -return(a)?decodeURIComponent(a[1]):null;},dispose:function(){new Cookie(this.key,Object.merge({},this.options,{duration:-1})).write("");return this;}}); -Cookie.write=function(b,c,a){return new Cookie(b,a).write(c);};Cookie.read=function(a){return new Cookie(a).read();};Cookie.dispose=function(b,a){return new Cookie(b,a).dispose(); -};(function(i,k){var l,f,e=[],c,b,d=k.createElement("div");var g=function(){clearTimeout(b);if(l){return;}Browser.loaded=l=true;k.removeListener("DOMContentLoaded",g).removeListener("readystatechange",a); -k.fireEvent("domready");i.fireEvent("domready");};var a=function(){for(var m=e.length;m--;){if(e[m]()){g();return true;}}return false;};var j=function(){clearTimeout(b); -if(!a()){b=setTimeout(j,10);}};k.addListener("DOMContentLoaded",g);var h=function(){try{d.doScroll();return true;}catch(m){}return false;};if(d.doScroll&&!h()){e.push(h); -c=true;}if(k.readyState){e.push(function(){var m=k.readyState;return(m=="loaded"||m=="complete");});}if("onreadystatechange" in k){k.addListener("readystatechange",a); -}else{c=true;}if(c){j();}Element.Events.domready={onAdd:function(m){if(l){m.call(this);}}};Element.Events.load={base:"load",onAdd:function(m){if(f&&this==i){m.call(this); -}},condition:function(){if(this==i){g();delete Element.Events.load;}return true;}};i.addEvent("load",function(){f=true;});})(window,document);(function(){var Swiff=this.Swiff=new Class({Implements:Options,options:{id:null,height:1,width:1,container:null,properties:{},params:{quality:"high",allowScriptAccess:"always",wMode:"window",swLiveConnect:true},callBacks:{},vars:{}},toElement:function(){return this.object; -},initialize:function(path,options){this.instance="Swiff_"+String.uniqueID();this.setOptions(options);options=this.options;var id=this.id=options.id||this.instance; -var container=document.id(options.container);Swiff.CallBacks[this.instance]={};var params=options.params,vars=options.vars,callBacks=options.callBacks; -var properties=Object.append({height:options.height,width:options.width},options.properties);var self=this;for(var callBack in callBacks){Swiff.CallBacks[this.instance][callBack]=(function(option){return function(){return option.apply(self.object,arguments); -};})(callBacks[callBack]);vars[callBack]="Swiff.CallBacks."+this.instance+"."+callBack;}params.flashVars=Object.toQueryString(vars);if(Browser.ie){properties.classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"; -params.movie=path;}else{properties.type="application/x-shockwave-flash";}properties.data=path;var build='';}}build+="";this.object=((container)?container.empty():new Element("div")).set("html",build).firstChild; -},replaces:function(element){element=document.id(element,true);element.parentNode.replaceChild(this.toElement(),element);return this;},inject:function(element){document.id(element,true).appendChild(this.toElement()); -return this;},remote:function(){return Swiff.remote.apply(Swiff,[this.toElement()].append(arguments));}});Swiff.CallBacks={};Swiff.remote=function(obj,fn){var rs=obj.CallFunction(''+__flash__argumentsToXML(arguments,2)+""); -return eval(rs);};})(); \ No newline at end of file diff -Nru qbittorrent-4.1.3/src/webui/www/public/scripts/misc.js qbittorrent-3.3.15/src/webui/www/public/scripts/misc.js --- qbittorrent-4.1.3/src/webui/www/public/scripts/misc.js 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/scripts/misc.js 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,106 @@ +/* + * JS counterpart of the function in src/misc.cpp + */ +function friendlyUnit(value, isSpeed) { + units = [ + "QBT_TR(B)QBT_TR[CONTEXT=misc]", + "QBT_TR(KiB)QBT_TR[CONTEXT=misc]", + "QBT_TR(MiB)QBT_TR[CONTEXT=misc]", + "QBT_TR(GiB)QBT_TR[CONTEXT=misc]", + "QBT_TR(TiB)QBT_TR[CONTEXT=misc]", + "QBT_TR(PiB)QBT_TR[CONTEXT=misc]", + "QBT_TR(EiB)QBT_TR[CONTEXT=misc]" + ]; + + if (value < 0) + return "QBT_TR(Unknown)QBT_TR[CONTEXT=misc]"; + + var i = 0; + while (value >= 1024.0 && i < 6) { + value /= 1024.0; + ++i; + } + + function friendlyUnitPrecision(sizeUnit) { + if (sizeUnit <= 2) return 1; // KiB, MiB + else if (sizeUnit === 3) return 2; // GiB + else return 3; // TiB, PiB, EiB + } + + var ret; + if (i === 0) + ret = value + " " + units[i]; + else + ret = (Math.floor(10 * value) / 10).toFixed(friendlyUnitPrecision(i)) //Don't round up + + " " + units[i]; + + if (isSpeed) + ret += "QBT_TR(/s)QBT_TR[CONTEXT=misc]"; + return ret; +} + +/* + * JS counterpart of the function in src/misc.cpp + */ +function friendlyDuration(seconds) { + var MAX_ETA = 8640000; + if (seconds < 0 || seconds >= MAX_ETA) + return "∞"; + if (seconds === 0) + return "0"; + if (seconds < 60) + return "QBT_TR(< 1m)QBT_TR[CONTEXT=misc]"; + var minutes = seconds / 60; + if (minutes < 60) + return "QBT_TR(%1m)QBT_TR[CONTEXT=misc]".replace("%1", parseInt(minutes)); + var hours = minutes / 60; + minutes = minutes % 60; + if (hours < 24) + return "QBT_TR(%1h %2m)QBT_TR[CONTEXT=misc]".replace("%1", parseInt(hours)).replace("%2", parseInt(minutes)); + var days = hours / 24; + hours = hours % 24; + if (days < 100) + return "QBT_TR(%1d %2h)QBT_TR[CONTEXT=misc]".replace("%1", parseInt(days)).replace("%2", parseInt(hours)); + return "∞"; +} + +/* + * From: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString + */ +if (!Date.prototype.toISOString) { + (function() { + + function pad(number) { + if (number < 10) { + return '0' + number; + } + return number; + } + + Date.prototype.toISOString = function() { + return this.getUTCFullYear() + + '-' + pad(this.getUTCMonth() + 1) + + '-' + pad(this.getUTCDate()) + + 'T' + pad(this.getUTCHours()) + + ':' + pad(this.getUTCMinutes()) + + ':' + pad(this.getUTCSeconds()) + + '.' + (this.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) + + 'Z'; + }; + + }()); +} + +/* + * JS counterpart of the function in src/misc.cpp + */ +function parseHtmlLinks(text) { + var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig; + return text.replace(exp,"$1"); +} + +function escapeHtml(str) { + var div = document.createElement('div'); + div.appendChild(document.createTextNode(str)); + return div.innerHTML; +} diff -Nru qbittorrent-4.1.3/src/webui/www/public/scripts/mocha-init.js qbittorrent-3.3.15/src/webui/www/public/scripts/mocha-init.js --- qbittorrent-4.1.3/src/webui/www/public/scripts/mocha-init.js 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/scripts/mocha-init.js 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,547 @@ +/* ----------------------------------------------------------------- + + ATTACH MOCHA LINK EVENTS + Notes: Here is where you define your windows and the events that open them. + If you are not using links to run Mocha methods you can remove this function. + + If you need to add link events to links within windows you are creating, do + it in the onContentLoaded function of the new window. + + ----------------------------------------------------------------- */ +/* Define localStorage object for older browsers */ +if (typeof localStorage == 'undefined') { + window['localStorage'] = { + getItem: function(name) { + return Cookie.read(name); + }, + setItem: function(name, value) { + Cookie.write(name, value, { + duration: 365 * 10 + }); + } + }; +} + +function getLocalStorageItem(name, defaultVal) { + val = localStorage.getItem(name); + if (val === null || val === undefined) + val = defaultVal; + return val; +} + +var deleteFN = function() {}; +var startFN = function() {}; +var pauseFN = function() {}; + +initializeWindows = function() { + + function addClickEvent(el, fn) { + ['Link', 'Button'].each(function(item) { + if ($(el + item)) { + $(el + item).addEvent('click', fn); + } + }); + } + + addClickEvent('download', function(e) { + new Event(e).stop(); + new MochaUI.Window({ + id: 'downloadPage', + title: "QBT_TR(Download from URLs)QBT_TR[CONTEXT=downloadFromURL]", + loadMethod: 'iframe', + contentURL: 'download.html', + scrollbars: true, + resizable: false, + maximizable: false, + closable: true, + paddingVertical: 0, + paddingHorizontal: 0, + width: 500, + height: 400 + }); + updateMainData(); + }); + + addClickEvent('preferences', function(e) { + new Event(e).stop(); + new MochaUI.Window({ + id: 'preferencesPage', + title: "QBT_TR(Options)QBT_TR[CONTEXT=OptionsDialog]", + loadMethod: 'xhr', + toolbar: true, + contentURL: 'preferences_content.html', + require: { + css: ['css/Tabs.css'] + }, + toolbarURL: 'preferences.html', + resizable: true, + maximizable: false, + closable: true, + paddingVertical: 0, + paddingHorizontal: 0, + width: 700, + height: 300 + }); + }); + + addClickEvent('upload', function(e) { + new Event(e).stop(); + new MochaUI.Window({ + id: 'uploadPage', + title: "QBT_TR(Upload local torrent)QBT_TR[CONTEXT=HttpServer]", + loadMethod: 'iframe', + contentURL: 'upload.html', + scrollbars: true, + resizable: false, + maximizable: false, + paddingVertical: 0, + paddingHorizontal: 0, + width: 500, + height: 240 + }); + updateMainData(); + }); + + globalUploadLimitFN = function() { + new MochaUI.Window({ + id: 'uploadLimitPage', + title: "QBT_TR(Global Upload Speed Limit)QBT_TR[CONTEXT=MainWindow]", + loadMethod: 'iframe', + contentURL: 'uploadlimit.html?hashes=global', + scrollbars: false, + resizable: false, + maximizable: false, + paddingVertical: 0, + paddingHorizontal: 0, + width: 424, + height: 80 + }); + }; + + uploadLimitFN = function() { + var h = torrentsTable.selectedRowsIds(); + if (h.length) { + var hash = h[0]; + new MochaUI.Window({ + id: 'uploadLimitPage', + title: "QBT_TR(Torrent Upload Speed Limiting)QBT_TR[CONTEXT=TransferListWidget]", + loadMethod: 'iframe', + contentURL: 'uploadlimit.html?hashes=' + h.join("|"), + scrollbars: false, + resizable: false, + maximizable: false, + paddingVertical: 0, + paddingHorizontal: 0, + width: 424, + height: 80 + }); + } + }; + + toggleSequentialDownloadFN = function() { + var h = torrentsTable.selectedRowsIds(); + if (h.length) { + new Request({ + url: 'command/toggleSequentialDownload', + method: 'post', + data: { + hashes: h.join("|") + } + }).send(); + updateMainData(); + } + }; + + toggleFirstLastPiecePrioFN = function() { + var h = torrentsTable.selectedRowsIds(); + if (h.length) { + new Request({ + url: 'command/toggleFirstLastPiecePrio', + method: 'post', + data: { + hashes: h.join("|") + } + }).send(); + updateMainData(); + } + }; + + setSuperSeedingFN = function(val) { + var h = torrentsTable.selectedRowsIds(); + if (h.length) { + new Request({ + url: 'command/setSuperSeeding', + method: 'post', + data: { + value: val, + hashes: h.join("|") + } + }).send(); + updateMainData(); + } + }; + + setForceStartFN = function() { + var h = torrentsTable.selectedRowsIds(); + if (h.length) { + new Request({ + url: 'command/setForceStart', + method: 'post', + data: { + value: 'true', + hashes: h.join("|") + } + }).send(); + updateMainData(); + } + }; + + globalDownloadLimitFN = function() { + new MochaUI.Window({ + id: 'downloadLimitPage', + title: "QBT_TR(Global Download Speed Limit)QBT_TR[CONTEXT=MainWindow]", + loadMethod: 'iframe', + contentURL: 'downloadlimit.html?hashes=global', + scrollbars: false, + resizable: false, + maximizable: false, + paddingVertical: 0, + paddingHorizontal: 0, + width: 424, + height: 80 + }); + }; + + StatisticsLinkFN = function() { + new MochaUI.Window({ + id: 'statisticspage', + title: 'QBT_TR(Statistics)QBT_TR[CONTEXT=StatsDialog]', + loadMethod: 'xhr', + contentURL: 'statistics.html', + scrollbars: false, + resizable: false, + maximizable: false, + width: 275, + height: 370, + padding: 10 + }); + }; + + downloadLimitFN = function() { + var h = torrentsTable.selectedRowsIds(); + if (h.length) { + var hash = h[0]; + new MochaUI.Window({ + id: 'downloadLimitPage', + title: "QBT_TR(Torrent Download Speed Limiting)QBT_TR[CONTEXT=TransferListWidget]", + loadMethod: 'iframe', + contentURL: 'downloadlimit.html?hashes=' + h.join("|"), + scrollbars: false, + resizable: false, + maximizable: false, + paddingVertical: 0, + paddingHorizontal: 0, + width: 424, + height: 80 + }); + } + }; + + deleteFN = function() { + var h = torrentsTable.selectedRowsIds(); + if (h.length) { + new MochaUI.Window({ + id: 'confirmDeletionPage', + title: "QBT_TR(Deletion confirmation)QBT_TR[CONTEXT=confirmDeletionDlg]", + loadMethod: 'iframe', + contentURL: 'confirmdeletion.html?hashes=' + h.join("|"), + scrollbars: false, + resizable: false, + maximizable: false, + padding: 10, + width: 424, + height: 140 + }); + updateMainData(); + } + }; + + addClickEvent('delete', function(e) { + new Event(e).stop(); + deleteFN(); + }); + + pauseFN = function() { + var h = torrentsTable.selectedRowsIds(); + if (h.length) { + h.each(function(hash, index) { + new Request({ + url: 'command/pause', + method: 'post', + data: { + hash: hash + } + }).send(); + }); + updateMainData(); + } + }; + + startFN = function() { + var h = torrentsTable.selectedRowsIds(); + if (h.length) { + h.each(function(hash, index) { + new Request({ + url: 'command/resume', + method: 'post', + data: { + hash: hash + } + }).send(); + }); + updateMainData(); + } + }; + + recheckFN = function() { + var h = torrentsTable.selectedRowsIds(); + if (h.length) { + h.each(function(hash, index) { + new Request({ + url: 'command/recheck', + method: 'post', + data: { + hash: hash + } + }).send(); + }); + updateMainData(); + } + }; + + torrentNewCategoryFN = function () { + var h = torrentsTable.selectedRowsIds(); + if (h.length) { + new MochaUI.Window({ + id: 'newCategoryPage', + title: "QBT_TR(New Category)QBT_TR[CONTEXT=TransferListWidget]", + loadMethod: 'iframe', + contentURL: 'newcategory.html?hashes=' + h.join('|'), + scrollbars: false, + resizable: false, + maximizable: false, + paddingVertical: 0, + paddingHorizontal: 0, + width: 250, + height: 100 + }); + } + }; + + torrentSetCategoryFN = function (categoryHash) { + var categoryName = ''; + if (categoryHash !== 0) + categoryName = category_list[categoryHash].name; + var h = torrentsTable.selectedRowsIds(); + if (h.length) { + new Request({ + url: 'command/setCategory', + method: 'post', + data: { + hashes: h.join("|"), + category: categoryName + } + }).send(); + } + }; + + createCategoryFN = function () { + new MochaUI.Window({ + id: 'newCategoryPage', + title: "QBT_TR(New Category)QBT_TR[CONTEXT=CategoryFilterWidget]", + loadMethod: 'iframe', + contentURL: 'newcategory.html', + scrollbars: false, + resizable: false, + maximizable: false, + paddingVertical: 0, + paddingHorizontal: 0, + width: 250, + height: 100 + }); + updateMainData(); + }; + + removeCategoryFN = function (categoryHash) { + var categoryName = category_list[categoryHash].name; + new Request({ + url: 'command/removeCategories', + method: 'post', + data: { + categories: categoryName + } + }).send(); + setCategoryFilter(CATEGORIES_ALL); + }; + + deleteUnusedCategoriesFN = function () { + var categories = []; + for (var hash in category_list) { + if (torrentsTable.getFilteredTorrentsNumber('all', hash) === 0) + categories.push(category_list[hash].name); + } + new Request({ + url: 'command/removeCategories', + method: 'post', + data: { + categories: categories.join('\n') + } + }).send(); + setCategoryFilter(CATEGORIES_ALL); + }; + + startTorrentsByCategoryFN = function (categoryHash) { + var h = torrentsTable.getFilteredTorrentsHashes('all', categoryHash); + if (h.length) { + h.each(function (hash, index) { + new Request({ + url: 'command/resume', + method: 'post', + data: { + hash: hash + } + }).send(); + }); + updateMainData(); + } + }; + + pauseTorrentsByCategoryFN = function (categoryHash) { + var h = torrentsTable.getFilteredTorrentsHashes('all', categoryHash); + if (h.length) { + h.each(function (hash, index) { + new Request({ + url: 'command/pause', + method: 'post', + data: { + hash: hash + } + }).send(); + }); + updateMainData(); + } + }; + + deleteTorrentsByCategoryFN = function (categoryHash) { + var h = torrentsTable.getFilteredTorrentsHashes('all', categoryHash); + if (h.length) { + new MochaUI.Window({ + id: 'confirmDeletionPage', + title: "QBT_TR(Deletion confirmation)QBT_TR[CONTEXT=confirmDeletionDlg]", + loadMethod: 'iframe', + contentURL: 'confirmdeletion.html?hashes=' + h.join("|"), + scrollbars: false, + resizable: false, + maximizable: false, + padding: 10, + width: 424, + height: 140 + }); + updateMainData(); + } + }; + + ['pauseAll', 'resumeAll'].each(function(item) { + addClickEvent(item, function(e) { + new Event(e).stop(); + new Request({ + url: 'command/' + item + }).send(); + updateMainData(); + }); + }); + + ['pause', 'resume', 'recheck'].each(function(item) { + addClickEvent(item, function(e) { + new Event(e).stop(); + var h = torrentsTable.selectedRowsIds(); + if (h.length) { + h.each(function(hash, index) { + new Request({ + url: 'command/' + item, + method: 'post', + data: { + hash: hash + } + }).send(); + }); + updateMainData(); + } + }); + }); + + ['decreasePrio', 'increasePrio', 'topPrio', 'bottomPrio'].each(function(item) { + addClickEvent(item, function(e) { + new Event(e).stop(); + setPriorityFN(item); + }); + }); + + setPriorityFN = function(cmd) { + var h = torrentsTable.selectedRowsIds(); + if (h.length) { + new Request({ + url: 'command/' + cmd, + method: 'post', + data: { + hashes: h.join("|") + } + }).send(); + updateMainData(); + } + }; + + addClickEvent('about', function(e) { + new Event(e).stop(); + new MochaUI.Window({ + id: 'aboutpage', + title: 'QBT_TR(About)QBT_TR[CONTEXT=AboutDlg]', + loadMethod: 'xhr', + contentURL: 'about.html', + width: 550, + height: 290, + padding: 10 + }); + }); + + addClickEvent('logout', function(e) { + new Event(e).stop(); + new Request({ + url: 'logout', + method: 'get', + onSuccess: function() { + window.location.reload(); + } + }).send(); + }); + + addClickEvent('shutdown', function(e) { + new Event(e).stop(); + if (confirm('QBT_TR(Are you sure you want to quit qBittorrent?)QBT_TR[CONTEXT=MainWindow]')) { + new Request({ + url: 'command/shutdown', + onSuccess: function() { + document.write("QBT_TR(qBittorrent has been shutdown.)QBT_TR[CONTEXT=HttpServer]

    QBT_TR(qBittorrent has been shutdown.)QBT_TR[CONTEXT=HttpServer]

    "); + stop(); + } + }).send(); + } + }); + + // Deactivate menu header links + $$('a.returnFalse').each(function(el) { + el.addEvent('click', function(e) { + new Event(e).stop(); + }); + }); +}; diff -Nru qbittorrent-4.1.3/src/webui/www/public/scripts/mocha.js qbittorrent-3.3.15/src/webui/www/public/scripts/mocha.js --- qbittorrent-4.1.3/src/webui/www/public/scripts/mocha.js 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/scripts/mocha.js 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,6234 @@ +/* + +Script: Core.js + MUI - A Web Applications User Interface Framework. + +Copyright: + Copyright (c) 2007-2009 Greg Houston, . + +License: + MIT-style license. + +Contributors: + - Scott F. Frederick + - Joel Lindau + +Note: + This documentation is taken directly from the javascript source files. It is built using Natural Docs. + +*/ + +var MUI = MochaUI = new Hash({ + + version: '0.9.6 development', + + options: new Hash({ + theme: 'default', + advancedEffects: false, // Effects that require fast browsers and are cpu intensive. + standardEffects: true // Basic effects that tend to run smoothly. + }), + + path: { + source: 'scripts/source/', // Path to MochaUI source JavaScript + themes: 'themes/', // Path to MochaUI Themes + plugins: 'plugins/' // Path to Plugins + }, + + // Returns the path to the current theme directory + themePath: function(){ + return MUI.path.themes + MUI.options.theme + '/'; + }, + + files: new Hash() + +}); + +MUI.files[MUI.path.source + 'Core/Core.js'] = 'loaded'; + +MUI.extend({ + + Windows: { + instances: new Hash() + }, + + ieSupport: 'excanvas', // Makes it easier to switch between Excanvas and Moocanvas for testing + + ieLegacySupport: Browser.Engine.trident && Browser.version < 9, + + /* + + Function: updateContent + Replace the content of a window or panel. + + Arguments: + updateOptions - (object) + + updateOptions: + element - The parent window or panel. + childElement - The child element of the window or panel recieving the content. + method - ('get', or 'post') The way data is transmitted. + data - (hash) Data to be transmitted + title - (string) Change this if you want to change the title of the window or panel. + content - (string or element) An html loadMethod option. + loadMethod - ('html', 'xhr', or 'iframe') + url - Used if loadMethod is set to 'xhr' or 'iframe'. + scrollbars - (boolean) + padding - (object) + onContentLoaded - (function) + + */ + updateContent: function(options){ + + var options = $extend({ + element: null, + childElement: null, + method: null, + data: null, + title: null, + content: null, + loadMethod: null, + url: null, + scrollbars: null, + padding: null, + require: {}, + onContentLoaded: $empty + }, options); + + options.require = $extend({ + css: [], images: [], js: [], onload: null + }, options.require); + + var args = {}; + + if (!options.element) return; + var element = options.element; + + if (MUI.Windows.instances.get(element.id)){ + args.recipient = 'window'; + } + else { + args.recipient = 'panel'; + } + + var instance = element.retrieve('instance'); + if (options.title) instance.titleEl.set('html', options.title); + + var contentEl = instance.contentEl; + args.contentContainer = options.childElement != null ? options.childElement : instance.contentEl; + var contentWrapperEl = instance.contentWrapperEl; + + if (!options.loadMethod){ + if (!instance.options.loadMethod){ + if (!options.url){ + options.loadMethod = 'html'; + } + else { + options.loadMethod = 'xhr'; + } + } + else { + options.loadMethod = instance.options.loadMethod; + } + } + + // Set scrollbars if loading content in main content container. + // Always use 'hidden' for iframe windows + var scrollbars = options.scrollbars || instance.options.scrollbars; + if (args.contentContainer == instance.contentEl) { + contentWrapperEl.setStyles({ + 'overflow': scrollbars != false && options.loadMethod != 'iframe' ? 'auto' : 'hidden' + }); + } + + if (options.padding != null) { + contentEl.setStyles({ + 'padding-top': options.padding.top, + 'padding-bottom': options.padding.bottom, + 'padding-left': options.padding.left, + 'padding-right': options.padding.right + }); + } + + // Remove old content. + if (args.contentContainer == contentEl) { + contentEl.empty().show(); + // Panels are not loaded into the padding div, so we remove them separately. + contentEl.getAllNext('.column').destroy(); + contentEl.getAllNext('.columnHandle').destroy(); + } + + args.onContentLoaded = function(){ + + if (options.require.js.length || typeof options.require.onload == 'function'){ + new MUI.Require({ + js: options.require.js, + onload: function(){ + if (!$defined(options.require.onload)) + return; + if (Browser.Engine.presto){ + options.require.onload.delay(100); + } + else { + options.require.onload(); + } + options.onContentLoaded ? options.onContentLoaded() : instance.fireEvent('onContentLoaded', element); + }.bind(this) + }); + } + else { + options.onContentLoaded ? options.onContentLoaded() : instance.fireEvent('onContentLoaded', element); + } + + }; + + if (options.require.css.length || options.require.images.length){ + new MUI.Require({ + css: options.require.css, + images: options.require.images, + onload: function(){ + this.loadSelect(instance, options, args); + }.bind(this) + }); + } + else { + this.loadSelect(instance, options, args); + } + }, + + loadSelect: function(instance, options, args){ + + // Load new content. + switch(options.loadMethod){ + case 'xhr': + this.updateContentXHR(instance, options, args); + break; + case 'iframe': + this.updateContentIframe(instance, options, args); + break; + case 'html': + default: + this.updateContentHTML(instance, options, args); + break; + } + + }, + + updateContentXHR: function(instance, options, args){ + var contentEl = instance.contentEl; + var contentContainer = args.contentContainer; + var onContentLoaded = args.onContentLoaded; + new Request.HTML({ + url: options.url, + update: contentContainer, + method: options.method != null ? options.method : 'get', + data: options.data != null ? new Hash(options.data).toQueryString() : '', + evalScripts: instance.options.evalScripts, + evalResponse: instance.options.evalResponse, + onRequest: function(){ + if (args.recipient == 'window' && contentContainer == contentEl){ + instance.showSpinner(); + } + else if (args.recipient == 'panel' && contentContainer == contentEl && $('spinner')){ + $('spinner').show(); + } + }.bind(this), + onFailure: function(response){ + if (contentContainer == contentEl){ + var getTitle = new RegExp("[\n\r\s]*(.*)[\n\r\s]*", "gmi"); + var error = getTitle.exec(response.responseText); + if (!error) error = 'Unknown'; + contentContainer.set('html', '

    Error: ' + error + '

    '); + if (args.recipient == 'window'){ + instance.hideSpinner(); + } + else if (args.recipient == 'panel' && $('spinner')){ + $('spinner').hide(); + } + } + }.bind(this), + onSuccess: function(){ + if (contentContainer == contentEl){ + if (args.recipient == 'window') instance.hideSpinner(); + else if (args.recipient == 'panel' && $('spinner')) $('spinner').hide(); + } + Browser.Engine.trident4 ? onContentLoaded.delay(750) : onContentLoaded(); + }.bind(this), + onComplete: function(){}.bind(this) + }).send(); + }, + + updateContentIframe: function(instance, options, args){ + var contentEl = instance.contentEl; + var contentContainer = args.contentContainer; + var contentWrapperEl = instance.contentWrapperEl; + var onContentLoaded = args.onContentLoaded; + if ( instance.options.contentURL == '' || contentContainer != contentEl) { + return; + } + instance.iframeEl = new Element('iframe', { + 'id': instance.options.id + '_iframe', + 'name': instance.options.id + '_iframe', + 'class': 'mochaIframe', + 'src': options.url, + 'marginwidth': 0, + 'marginheight': 0, + 'frameBorder': 0, + 'scrolling': 'auto', + 'styles': { + 'height': contentWrapperEl.offsetHeight - contentWrapperEl.getStyle('margin-top').toInt() - contentWrapperEl.getStyle('margin-bottom').toInt(), + 'width': instance.panelEl ? contentWrapperEl.offsetWidth - contentWrapperEl.getStyle('margin-left').toInt() - contentWrapperEl.getStyle('margin-right').toInt() : '100%' + } + }).injectInside(contentEl); + + // Add onload event to iframe so we can hide the spinner and run onContentLoaded() + instance.iframeEl.addEvent('load', function(e) { + if (args.recipient == 'window') instance.hideSpinner(); + else if (args.recipient == 'panel' && contentContainer == contentEl && $('spinner')) $('spinner').hide(); + Browser.Engine.trident4 ? onContentLoaded.delay(50) : onContentLoaded(); + }.bind(this)); + if (args.recipient == 'window') instance.showSpinner(); + else if (args.recipient == 'panel' && contentContainer == contentEl && $('spinner')) $('spinner').show(); + }, + + updateContentHTML: function(instance, options, args){ + var contentEl = instance.contentEl; + var contentContainer = args.contentContainer; + var onContentLoaded = args.onContentLoaded; + var elementTypes = new Array('element', 'textnode', 'whitespace', 'collection'); + + if (elementTypes.contains($type(options.content))){ + options.content.inject(contentContainer); + } else { + contentContainer.set('html', options.content); + } + if (contentContainer == contentEl){ + if (args.recipient == 'window') instance.hideSpinner(); + else if (args.recipient == 'panel' && $('spinner')) $('spinner').hide(); + } + Browser.Engine.trident4 ? onContentLoaded.delay(50) : onContentLoaded(); + }, + + /* + + Function: reloadIframe + Reload an iframe. Fixes an issue in Firefox when trying to use location.reload on an iframe that has been destroyed and recreated. + + Arguments: + iframe - This should be both the name and the id of the iframe. + + Syntax: + (start code) + MUI.reloadIframe(element); + (end) + + Example: + To reload an iframe from within another iframe: + (start code) + parent.MUI.reloadIframe('myIframeName'); + (end) + + */ + reloadIframe: function(iframe){ + Browser.Engine.gecko ? $(iframe).src = $(iframe).src : top.frames[iframe].location.reload(true); + }, + + roundedRect: function(ctx, x, y, width, height, radius, rgb, a){ + ctx.fillStyle = 'rgba(' + rgb.join(',') + ',' + a + ')'; + ctx.beginPath(); + ctx.moveTo(x, y + radius); + ctx.lineTo(x, y + height - radius); + ctx.quadraticCurveTo(x, y + height, x + radius, y + height); + ctx.lineTo(x + width - radius, y + height); + ctx.quadraticCurveTo(x + width, y + height, x + width, y + height - radius); + ctx.lineTo(x + width, y + radius); + ctx.quadraticCurveTo(x + width, y, x + width - radius, y); + ctx.lineTo(x + radius, y); + ctx.quadraticCurveTo(x, y, x, y + radius); + ctx.fill(); + }, + + triangle: function(ctx, x, y, width, height, rgb, a){ + ctx.beginPath(); + ctx.moveTo(x + width, y); + ctx.lineTo(x, y + height); + ctx.lineTo(x + width, y + height); + ctx.closePath(); + ctx.fillStyle = 'rgba(' + rgb.join(',') + ',' + a + ')'; + ctx.fill(); + }, + + circle: function(ctx, x, y, diameter, rgb, a){ + ctx.beginPath(); + ctx.arc(x, y, diameter, 0, Math.PI*2, true); + ctx.fillStyle = 'rgba(' + rgb.join(',') + ',' + a + ')'; + ctx.fill(); + }, + + notification: function(message){ + new MUI.Window({ + loadMethod: 'html', + closeAfter: 1500, + type: 'notification', + addClass: 'notification', + content: message, + width: 220, + height: 40, + y: 53, + padding: { top: 10, right: 12, bottom: 10, left: 12 }, + shadowBlur: 5 + }); + }, + + /* + + Function: toggleEffects + Turn effects on and off + + */ + toggleAdvancedEffects: function(link){ + if (MUI.options.advancedEffects == false) { + MUI.options.advancedEffects = true; + if (link){ + this.toggleAdvancedEffectsLink = new Element('div', { + 'class': 'check', + 'id': 'toggleAdvancedEffects_check' + }).inject(link); + } + } + else { + MUI.options.advancedEffects = false; + if (this.toggleAdvancedEffectsLink) { + this.toggleAdvancedEffectsLink.destroy(); + } + } + }, + /* + + Function: toggleStandardEffects + Turn standard effects on and off + + */ + toggleStandardEffects: function(link){ + if (MUI.options.standardEffects == false) { + MUI.options.standardEffects = true; + if (link){ + this.toggleStandardEffectsLink = new Element('div', { + 'class': 'check', + 'id': 'toggleStandardEffects_check' + }).inject(link); + } + } + else { + MUI.options.standardEffects = false; + if (this.toggleStandardEffectsLink) { + this.toggleStandardEffectsLink.destroy(); + } + } + }, + + /* + + The underlay is inserted directly under windows when they are being dragged or resized + so that the cursor is not captured by iframes or other plugins (such as Flash) + underneath the window. + + */ + underlayInitialize: function(){ + var windowUnderlay = new Element('div', { + 'id': 'windowUnderlay', + 'styles': { + 'height': parent.getCoordinates().height, + 'opacity': .01, + 'display': 'none' + } + }).inject(document.body); + }, + setUnderlaySize: function(){ + $('windowUnderlay').setStyle('height', parent.getCoordinates().height); + } +}); + +/* + +function: fixPNG + Bob Osola's PngFix for IE6. + +example: + (begin code) + foo + (end) + +note: + You must have the image height and width attributes specified in the markup. + +*/ + +function fixPNG(myImage){ + if (Browser.Engine.trident4 && document.body.filters){ + var imgID = (myImage.id) ? "id='" + myImage.id + "' " : ""; + var imgClass = (myImage.className) ? "class='" + myImage.className + "' " : ""; + var imgTitle = (myImage.title) ? "title='" + myImage.title + "' " : "title='" + myImage.alt + "' "; + var imgStyle = "display:inline-block;" + myImage.style.cssText; + var strNewHTML = ""; + myImage.outerHTML = strNewHTML; + } +} + +// Blur all windows if user clicks anywhere else on the page +document.addEvent('mousedown', function(event){ + MUI.blurAll.delay(50); +}); + +window.addEvent('domready', function(){ + MUI.underlayInitialize(); +}); + +window.addEvent('resize', function(){ + if ($('windowUnderlay')) { + MUI.setUnderlaySize(); + } + else { + MUI.underlayInitialize(); + } +}); + +Element.implement({ + hide: function(){ + this.setStyle('display', 'none'); + return this; + }, + show: function(){ + this.setStyle('display', 'block'); + return this; + } +}); + +/* + +Shake effect by Uvumi Tools +http://tools.uvumi.com/element-shake.html + +Function: shake + +Example: + Shake a window. + (start code) + $('parametrics').shake() + (end) + +*/ + +Element.implement({ + shake: function(radius,duration){ + radius = radius || 3; + duration = duration || 500; + duration = (duration/50).toInt() - 1; + var parent = this.getParent(); + if(parent != $(document.body) && parent.getStyle('position') == 'static'){ + parent.setStyle('position','relative'); + } + var position = this.getStyle('position'); + if(position == 'static'){ + this.setStyle('position','relative'); + position = 'relative'; + } + if(MUI.ieLegacySupport){ + parent.setStyle('height',parent.getStyle('height')); + } + var coords = this.getPosition(parent); + if(position == 'relative' && !Browser.Engine.presto){ + coords.x -= parent.getStyle('paddingLeft').toInt(); + coords.y -= parent.getStyle('paddingTop').toInt(); + } + var morph = this.retrieve('morph'); + if (morph){ + morph.cancel(); + var oldOptions = morph.options; + } + var morph = this.get('morph',{ + duration:50, + link:'chain' + }); + for(var i=0 ; i < duration ; i++){ + morph.start({ + top:coords.y+$random(-radius,radius), + left:coords.x+$random(-radius,radius) + }); + } + morph.start({ + top:coords.y, + left:coords.x + }).chain(function(){ + if(oldOptions){ + this.set('morph',oldOptions); + } + }.bind(this)); + return this; + } +}); + +String.implement({ + + parseQueryString: function() { + var vars = this.split(/[&;]/); + var rs = {}; + if (vars.length) vars.each(function(val) { + var keys = val.split('='); + if (keys.length && keys.length == 2) rs[decodeURIComponent(keys[0])] = decodeURIComponent(keys[1]); + }); + return rs; + } + +}); + +// Mootools Patch: Fixes issues in Safari, Chrome, and Internet Explorer caused by processing text as XML. +Request.HTML.implement({ + + processHTML: function(text){ + var match = text.match(/]*>([\s\S]*?)<\/body>/i); + text = (match) ? match[1] : text; + var container = new Element('div'); + return container.set('html', text); + } + +}); + +/* + + Examples: + (start code) + getCSSRule('.myRule'); + getCSSRule('#myRule'); + (end) + +*/ +MUI.getCSSRule = function(selector) { + for (var ii = 0; ii < document.styleSheets.length; ii++) { + var mysheet = document.styleSheets[ii]; + var myrules = mysheet.cssRules ? mysheet.cssRules : mysheet.rules; + for (i = 0; i < myrules.length; i++){ + if (myrules[i].selectorText == selector){ + return myrules[i]; + } + } + } + return false; +} + +// This makes it so Request will work to some degree locally +if (location.protocol == "file:"){ + + Request.implement({ + isSuccess : function(status){ + return (status == 0 || (status >= 200) && (status < 300)); + } + }); + + Browser.Request = function(){ + return $try(function(){ + return new ActiveXObject('MSXML2.XMLHTTP'); + }, function(){ + return new XMLHttpRequest(); + }); + }; + +} + +MUI.Require = new Class({ + + Implements: [Options], + + options: { + css: [], + images: [], + js: [], + onload: $empty + }, + + initialize: function(options){ + this.setOptions(options); + var options = this.options; + + this.assetsToLoad = options.css.length + options.images.length + options.js.length; + this.assetsLoaded = 0; + + var cssLoaded = 0; + + // Load CSS before images and JavaScript + + if (options.css.length){ + options.css.each( function(sheet){ + + this.getAsset(sheet, function(){ + if (cssLoaded == options.css.length - 1){ + + if (this.assetsLoaded == this.assetsToLoad - 1){ + this.requireOnload(); + } + else { + // Add a little delay since we are relying on cached CSS from XHR request. + this.assetsLoaded++; + this.requireContinue.delay(50, this); + } + } + else { + cssLoaded++; + this.assetsLoaded++; + } + }.bind(this)); + }.bind(this)); + } + else if (!options.js.length && !options.images.length){ + this.options.onload(); + return true; + } + else { + this.requireContinue.delay(50, this); // Delay is for Safari + } + + }, + + requireOnload: function(){ + this.assetsLoaded++; + if (this.assetsLoaded == this.assetsToLoad){ + this.options.onload(); + return true; + } + + }, + + requireContinue: function(){ + + var options = this.options; + if (options.images.length){ + options.images.each( function(image){ + this.getAsset(image, this.requireOnload.bind(this)); + }.bind(this)); + } + + if (options.js.length){ + options.js.each( function(script){ + this.getAsset(script, this.requireOnload.bind(this)); + }.bind(this)); + } + + }, + + getAsset: function(source, onload){ + + // If the asset is loaded, fire the onload function. + if ( MUI.files[source] == 'loaded' ){ + if (typeof onload == 'function'){ + onload(); + } + return true; + } + + // If the asset is loading, wait until it is loaded and then fire the onload function. + // If asset doesn't load by a number of tries, fire onload anyway. + else if ( MUI.files[source] == 'loading' ){ + var tries = 0; + var checker = (function(){ + tries++; + if (MUI.files[source] == 'loading' && tries < '100') return; + $clear(checker); + if (typeof onload == 'function'){ + onload(); + } + }).periodical(50); + } + + // If the asset is not yet loaded or loading, start loading the asset. + else { + MUI.files[source] = 'loading'; + + properties = { + 'onload': onload != 'undefined' ? onload : $empty + }; + + // Add to the onload function + var oldonload = properties.onload; + properties.onload = function() { + MUI.files[source] = 'loaded'; + if (oldonload) { + oldonload(); + } + }.bind(this); + + switch ( source.match(/\.\w+$/)[0] ) { + case '.js': return Asset.javascript(source, properties); + case '.css': return Asset.css(source, properties); + case '.jpg': + case '.png': + case '.gif': return Asset.image(source, properties); + } + + alert('The required file "' + source + '" could not be loaded'); + } + } + +}); + +$extend(Asset, { + + /* Fix an Opera bug in Mootools 1.2 */ + javascript: function(source, properties){ + properties = $extend({ + onload: $empty, + document: document, + check: $lambda(true) + }, properties); + + if ($(properties.id)) { + properties.onload(); + return $(properties.id); + } + + var script = new Element('script', {'src': source, 'type': 'text/javascript'}); + + var load = properties.onload.bind(script), check = properties.check, doc = properties.document; + delete properties.onload; delete properties.check; delete properties.document; + + if (!Browser.Engine.webkit419 && !Browser.Engine.presto){ + script.addEvents({ + load: load, + readystatechange: function(){ + if (MUI.ieLegacySupport && ['loaded', 'complete'].contains(this.readyState)) + load(); + } + }).setProperties(properties); + } + else { + var checker = (function(){ + if (!$try(check)) return; + $clear(checker); + // Opera has difficulty with multiple scripts being injected into the head simultaneously. We need to give it time to catch up. + Browser.Engine.presto ? load.delay(500) : load(); + }).periodical(50); + } + return script.inject(doc.head); + }, + + // Get the CSS with XHR before appending it to document.head so that we can have an onload callback. + css: function(source, properties){ + + properties = $extend({ + id: null, + media: 'screen', + onload: $empty + }, properties); + + new Request({ + method: 'get', + url: source, + onComplete: function(response) { + var newSheet = new Element('link', { + 'id': properties.id, + 'rel': 'stylesheet', + 'media': properties.media, + 'type': 'text/css', + 'href': source + }).inject(document.head); + properties.onload(); + }.bind(this), + onFailure: function(response){ + }, + onSuccess: function(){ + }.bind(this) + }).send(); + } + +}); + +/* + +REGISTER PLUGINS + + Register Components and Plugins for Lazy Loading + + How this works may take a moment to grasp. Take a look at MUI.Window below. + If we try to create a new Window and Window.js has not been loaded then the function + below will run. It will load the CSS required by the MUI.Window Class and then + then it will load Window.js. Here is the interesting part. When Window.js loads, + it will overwrite the function below, and new MUI.Window(arg) will be ran + again. This time it will create a new MUI.Window instance, and any future calls + to new MUI.Window(arg) will immediately create new windows since the assets + have already been loaded and our temporary function below has been overwritten. + + Example: + + MyPlugins.extend({ + + MyGadget: function(arg){ + new MUI.Require({ + css: [MUI.path.plugins + 'myGadget/css/style.css'], + images: [MUI.path.plugins + 'myGadget/images/background.gif'] + js: [MUI.path.plugins + 'myGadget/scripts/myGadget.js'], + onload: function(){ + new MyPlguins.MyGadget(arg); + } + }); + } + + }); + +-------------------------------------------------------------------- */ + +MUI.extend({ + + newWindowsFromJSON: function(arg){ + new MUI.Require({ + js: [MUI.path.source + 'Window/Windows-from-json.js'], + onload: function(){ + new MUI.newWindowsFromJSON(arg); + } + }); + }, + + arrangeCascade: function(){ + new MUI.Require({ + js: [MUI.path.source + 'Window/Arrange-cascade.js'], + onload: function(){ + new MUI.arrangeCascade(); + } + }); + }, + + arrangeTile: function(){ + new MUI.Require({ + js: [MUI.path.source + 'Window/Arrange-tile.js'], + onload: function(){ + new MUI.arrangeTile(); + } + }); + }, + + saveWorkspace: function(){ + new MUI.Require({ + js: [MUI.path.source + 'Layout/Workspaces.js'], + onload: function(){ + new MUI.saveWorkspace(); + } + }); + }, + + loadWorkspace: function(){ + new MUI.Require({ + js: [MUI.path.source + 'Layout/Workspaces.js'], + onload: function(){ + new MUI.loadWorkspace(); + } + }); + }, + + Themes: { + init: function(arg){ + new MUI.Require({ + js: [MUI.path.source + 'Utilities/Themes.js'], + onload: function(){ + MUI.Themes.init(arg); + } + }); + } + } + +}); +/* + +Script: Themes.js + Allows for switching themes dynamically. + +Copyright: + Copyright (c) 2007-2009 Greg Houston, . + +License: + MIT-style license. + +Requires: + Core.js + +Notes: + Themes are new and experimental. + +Syntax: + (start code) + new MUI.Themes.init(newTheme); + (end) + +Example: + (start code) + new MUI.Themes.init('charcoal'); + (end) + +Arguments: + newTheme - (string) The theme name + +*/ + +MUI.files[MUI.path.source + 'Utilities/Themes.js'] = 1; + +MUI.Themes = { + + /* + + Function: themeInit + Initialize a theme. This is experimental and not fully implemented yet. + + */ + init: function(newTheme){ + this.newTheme = newTheme.toLowerCase(); + if (!this.newTheme || this.newTheme == null || this.newTheme == MUI.options.theme.toLowerCase()) return; + + if ($('spinner')) $('spinner').show(); + + this.oldURIs = []; + this.oldSheets = []; + + $$('link').each( function(link){ + var href = link.get('href'); + if (href.contains(MUI.path.themes + MUI.options.theme)){ + this.oldURIs.push(href); + this.oldSheets.push(link); + } + }.bind(this)); + + /* + MUI.files.each( function(value, key, hash){ + if (key.contains(MUI.path.themes + MUI.options.theme)){ + this.oldURIs.push(key); + } + }.bind(this)); + */ + + this.newSheetURLs = this.oldURIs.map(function(item, index){ + return item.replace("/" + MUI.options.theme + "/", "/" + MUI.Themes.newTheme + "/"); + }.bind(this)); + + this.sheetsToLoad = this.oldURIs.length; + this.sheetsLoaded = 0; + + // Download new stylesheets and add them to an array + this.newSheets = []; + this.newSheetURLs.each( function(link){ + var href = link; + + //var id = link.id; + + var cssRequest = new Request({ + method: 'get', + url: href, + onComplete: function(response) { + var newSheet = new Element('link', { + //'id': id, + 'rel': 'stylesheet', + 'media': 'screen', + 'type': 'text/css', + 'href': href + }); + this.newSheets.push(newSheet); + }.bind(this), + onFailure: function(response){ + this.themeLoadSuccess = false; + if ($('spinner')) $('spinner').hide(); + MUI.notification('Stylesheets did not load.'); + }, + onSuccess: function(){ + this.sheetsLoaded++; + if (this.sheetsLoaded == this.sheetsToLoad) { + this.updateThemeStylesheets(); + this.themeLoadSuccess = true; + } + }.bind(this) + }); + cssRequest.send(); + + }.bind(this)); + + }, + updateThemeStylesheets: function(){ + + this.oldSheets.each( function(sheet){ + sheet.destroy(); + }); + + this.newSheets.each( function(sheet){ + MUI.files[sheet.get('href')] = 1; + sheet.inject(document.head); + }); + + // Delay gives the stylesheets time to take effect. IE6 needs more delay. + if (MUI.ieLegacySupport){ + this.redraw.delay(1250, this); + } + else { + this.redraw.delay(250, this); + } + + }, + redraw: function(){ + + $$('.replaced').removeClass('replaced'); + + // Redraw open windows + $$('.mocha').each( function(element){ + var instance = element.retrieve('instance'); + + // Convert CSS colors to Canvas colors. + instance.setColors(); + instance.drawWindow(); + }); + + if (MUI.Dock){ + if (MUI.Dock.options.useControls){ + MUI.Dock.setDockColors(); + MUI.Dock.renderDockControls(); + } + } + + // Reformat layout + if (MUI.Desktop.desktop){ + var checker = (function(){ + // Make sure the style sheets are really ready. + if (MUI.Desktop.desktop.getStyle('overflow') != 'hidden'){ + return; + } + $clear(checker); + MUI.Desktop.setDesktopSize(); + }).periodical(50); + } + + if ($('spinner')) $('spinner').hide(); + MUI.options.theme = this.newTheme; + + /* + this.cookie = new Hash.Cookie('mochaUIthemeCookie', {duration: 3600}); + this.cookie.empty(); + this.cookie.set('theme', MUI.options.theme); + this.cookie.save(); + */ + + } +}; + +window.addEvent('load', function(){ + /* + // Load theme the user was last using. This needs work. + var cookie = new Hash.Cookie('mochaUIthemeCookie', {duration: 3600}); + var themeCookie = cookie.load(); + if(cookie.getKeys().length){ + if (themeCookie.get('theme') != MUI.Themes.options.theme){ + MUI.Themes.init.delay(1000, MUI.Themes, themeCookie.get('theme')); + } + } + */ + + if ($('themeControl')){ + $('themeControl').getElements('option').setProperty('selected', 'false'); + if ($('chooseTheme')){ + $('chooseTheme').setProperty('selected', 'true'); + } + } +}); +/* + +Script: Window.js + Build windows. + +Copyright: + Copyright (c) 2007-2009 Greg Houston, . + +License: + MIT-style license. + +Requires: + Core.js + +*/ + +MUI.files[MUI.path.source + 'Window/Window.js'] = 'loading'; +//$require(MUI.themePath() + '/css/Dock.css'); + +/* +Class: Window + Creates a single MochaUI window. + +Syntax: + (start code) + new MUI.Window(options); + (end) + +Arguments: + options + +Options: + id - The ID of the window. If not defined, it will be set to 'win' + windowIDCount. + title - The title of the window. + icon - Place an icon in the window's titlebar. This is either set to false or to the url of the icon. It is set up for icons that are 16 x 16px. + type - ('window', 'modal', 'modal2', or 'notification') Defaults to 'window'. Modals should be created with new MUI.Modal(options). + loadMethod - ('html', 'xhr', or 'iframe') Defaults to 'html' if there is no contentURL. Defaults to 'xhr' if there is a contentURL. You only really need to set this if using the 'iframe' method. + contentURL - Used if loadMethod is set to 'xhr' or 'iframe'. + closeAfter - Either false or time in milliseconds. Closes the window after a certain period of time in milliseconds. This is particularly useful for notifications. + evalScripts - (boolean) An xhr loadMethod option. Defaults to true. + evalResponse - (boolean) An xhr loadMethod option. Defaults to false. + content - (string or element) An html loadMethod option. + toolbar - (boolean) Create window toolbar. Defaults to false. This can be used for tabs, media controls, and so forth. + toolbarPosition - ('top' or 'bottom') Defaults to top. + toolbarHeight - (number) + toolbarURL - (url) Defaults to 'pages/lipsum.html'. + toolbarContent - (string) + toolbarOnload - (function) + toolbar2 - (boolean) Create window toolbar. Defaults to false. This can be used for tabs, media controls, and so forth. + toolbar2Position - ('top' or 'bottom') Defaults to top. + toolbar2Height - (number) + toolbar2URL - (url) Defaults to 'pages/lipsum.html'. + toolbar2Content - (string) + toolbar2Onload - (function) + container - (element ID) Element the window is injected in. The container defaults to 'desktop'. If no desktop then to document.body. Use 'pageWrapper' if you don't want the windows to overlap the toolbars. + restrict - (boolean) Restrict window to container when dragging. + shape - ('box' or 'gauge') Shape of window. Defaults to 'box'. + collapsible - (boolean) Defaults to true. + minimizable - (boolean) Requires MUI.Desktop and MUI.Dock. Defaults to true if dependenices are met. + maximizable - (boolean) Requires MUI.Desktop. Defaults to true if dependenices are met. + closable - (boolean) Defaults to true. + storeOnClose - (boolean) Hides a window and it's dock tab rather than destroying them on close. If you try to create the window again it will unhide the window and dock tab. + modalOverlayClose - (boolean) Whether or not you can close a modal by clicking on the modal overlay. Defaults to true. + draggable - (boolean) Defaults to false for modals; otherwise true. + draggableGrid - (false or number) Distance in pixels for snap-to-grid dragging. Defaults to false. + draggableLimit - (false or number) An object with x and y properties used to limit the movement of the Window. Defaults to false. + draggableSnap - (boolean) The distance to drag before the Window starts to respond to the drag. Defaults to false. + resizable - (boolean) Defaults to false for modals, notifications and gauges; otherwise true. + resizeLimit - (object) Minimum and maximum width and height of window when resized. + addClass - (string) Add a class to the window for more control over styling. + width - (number) Width of content area. + height - (number) Height of content area. + headerHeight - (number) Height of window titlebar. + footerHeight - (number) Height of window footer. + cornerRadius - (number) + x - (number) If x and y are left undefined the window is centered on the page. + y - (number) + scrollbars - (boolean) + padding - (object) + shadowBlur - (number) Width of shadows. + shadowOffset - Should be positive and not be greater than the ShadowBlur. + controlsOffset - Change this if you want to reposition the window controls. + useCanvas - (boolean) Set this to false if you don't want a canvas body. + useCanvasControls - (boolean) Set this to false if you wish to use images for the buttons. + useSpinner - (boolean) Toggles whether or not the ajax spinners are displayed in window footers. Defaults to true. + headerStartColor - ([r,g,b,]) Titlebar gradient's top color + headerStopColor - ([r,g,b,]) Titlebar gradient's bottom color + bodyBgColor - ([r,g,b,]) Background color of the main canvas shape + minimizeBgColor - ([r,g,b,]) Minimize button background color + minimizeColor - ([r,g,b,]) Minimize button color + maximizeBgColor - ([r,g,b,]) Maximize button background color + maximizeColor - ([r,g,b,]) Maximize button color + closeBgColor - ([r,g,b,]) Close button background color + closeColor - ([r,g,b,]) Close button color + resizableColor - ([r,g,b,]) Resizable icon color + onBeforeBuild - (function) Fired just before the window is built. + onContentLoaded - (function) Fired when content is successfully loaded via XHR or Iframe. + onFocus - (function) Fired when the window is focused. + onBlur - (function) Fired when window loses focus. + onResize - (function) Fired when the window is resized. + onMinimize - (function) Fired when the window is minimized. + onMaximize - (function) Fired when the window is maximized. + onRestore - (function) Fired when a window is restored from minimized or maximized. + onClose - (function) Fired just before the window is closed. + onCloseComplete - (function) Fired after the window is closed. + +Returns: + Window object. + +Example: + Define a window. It is suggested you name the function the same as your window ID + "Window". + (start code) + var mywindowWindow = function(){ + new MUI.Window({ + id: 'mywindow', + title: 'My Window', + loadMethod: 'xhr', + contentURL: 'pages/lipsum.html', + width: 340, + height: 150 + }); + } + (end) + +Example: + Create window onDomReady. + (start code) + window.addEvent('domready', function(){ + mywindow(); + }); + (end) + +Example: + Add link events to build future windows. It is suggested you give your anchor the same ID as your window + "WindowLink" or + "WindowLinkCheck". Use the latter if it is a link in the menu toolbar. + + If you wish to add links in windows that open other windows remember to add events to those links when the windows are created. + + (start code) + // Javascript: + if ($('mywindowLink')){ + $('mywindowLink').addEvent('click', function(e) { + new Event(e).stop(); + mywindow(); + }); + } + + // HTML: + My Window + (end) + + + Loading Content with an XMLHttpRequest(xhr): + For content to load via xhr all the files must be online and in the same domain. If you need to load content from another domain or wish to have it work offline, load the content in an iframe instead of using the xhr option. + + Iframes: + If you use the iframe loadMethod your iframe will automatically be resized when the window it is in is resized. If you want this same functionality when using one of the other load options simply add class="mochaIframe" to those iframes and they will be resized for you as well. + +*/ + +// Having these options outside of the Class allows us to add, change, and remove +// individual options without rewriting all of them. + +MUI.extend({ + Windows: { + instances: new Hash(), + indexLevel: 100, // Used for window z-Index + windowIDCount: 0, // Used for windows without an ID defined by the user + windowsVisible: true, // Ctrl-Alt-Q to toggle window visibility + focusingWindow: false + } +}); + +MUI.Windows.windowOptions = { + id: null, + title: 'New Window', + icon: false, + type: 'window', + require: { + css: [], + images: [], + js: [], + onload: null + }, + loadMethod: null, + method: 'get', + contentURL: null, + data: null, + + closeAfter: false, + + // xhr options + evalScripts: true, + evalResponse: false, + + // html options + content: 'Window content', + + // Toolbar + toolbar: false, + toolbarPosition: 'top', + toolbarHeight: 29, + toolbarURL: 'pages/lipsum.html', + toolbarData: null, + toolbarContent: '', + toolbarOnload: $empty, + + // Toolbar + toolbar2: false, + toolbar2Position: 'bottom', + toolbar2Height: 29, + toolbar2URL: 'pages/lipsum.html', + toolbar2Data: null, + toolbar2Content: '', + toolbar2Onload: $empty, + + // Container options + container: null, + restrict: true, + shape: 'box', + + // Window Controls + collapsible: true, + minimizable: true, + maximizable: true, + closable: true, + + // Close options + storeOnClose: false, + + // Modal options + modalOverlayClose: true, + + // Draggable + draggable: null, + draggableGrid: false, + draggableLimit: false, + draggableSnap: false, + + // Resizable + resizable: null, + resizeLimit: {'x': [250, 2500], 'y': [125, 2000]}, + + // Style options: + addClass: '', + width: 300, + height: 125, + headerHeight: 25, + footerHeight: 25, + cornerRadius: 8, + x: null, + y: null, + scrollbars: true, + padding: { top: 10, right: 12, bottom: 10, left: 12 }, + shadowBlur: 5, + shadowOffset: {'x': 0, 'y': 1}, + controlsOffset: {'right': 6, 'top': 6}, + useCanvas: true, + useCanvasControls: true, + useSpinner: true, + + // Color options: + headerStartColor: [250, 250, 250], + headerStopColor: [229, 229, 229], + bodyBgColor: [229, 229, 229], + minimizeBgColor: [255, 255, 255], + minimizeColor: [0, 0, 0], + maximizeBgColor: [255, 255, 255], + maximizeColor: [0, 0, 0], + closeBgColor: [255, 255, 255], + closeColor: [0, 0, 0], + resizableColor: [254, 254, 254], + + // Events + onBeforeBuild: $empty, + onContentLoaded: $empty, + onFocus: $empty, + onBlur: $empty, + onResize: $empty, + onMinimize: $empty, + onMaximize: $empty, + onRestore: $empty, + onClose: $empty, + onCloseComplete: $empty +}; + +MUI.Windows.windowOptionsOriginal = $merge(MUI.Windows.windowOptions); + +MUI.Window = new Class({ + + Implements: [Events, Options], + + options: MUI.Windows.windowOptions, + + initialize: function(options){ + this.setOptions(options); + + // Shorten object chain + var options = this.options; + + $extend(this, { + mochaControlsWidth: 0, + minimizebuttonX: 0, // Minimize button horizontal position + maximizebuttonX: 0, // Maximize button horizontal position + closebuttonX: 0, // Close button horizontal position + headerFooterShadow: options.headerHeight + options.footerHeight + (options.shadowBlur * 2), + oldTop: 0, + oldLeft: 0, + isMaximized: false, + isMinimized: false, + isCollapsed: false, + timestamp: $time() + }); + + if (options.type != 'window'){ + options.container = document.body; + options.minimizable = false; + } + if (!options.container){ + options.container = MUI.Desktop && MUI.Desktop.desktop ? MUI.Desktop.desktop : document.body; + } + + // Set this.options.resizable to default if it was not defined + if (options.resizable == null){ + if (options.type != 'window' || options.shape == 'gauge'){ + options.resizable = false; + } + else { + options.resizable = true; + } + } + + // Set this.options.draggable if it was not defined + if (options.draggable == null){ + options.draggable = options.type != 'window' ? false : true; + } + + // Gauges are not maximizable or resizable + if (options.shape == 'gauge' || options.type == 'notification'){ + options.collapsible = false; + options.maximizable = false; + options.contentBgColor = 'transparent'; + options.scrollbars = false; + options.footerHeight = 0; + } + if (options.type == 'notification'){ + options.closable = false; + options.headerHeight = 0; + } + + // Minimizable, dock is required and window cannot be modal + if (MUI.Dock && $(MUI.options.dock)){ + if (MUI.Dock.dock && options.type != 'modal' && options.type != 'modal2'){ + options.minimizable = options.minimizable; + } + } + else { + options.minimizable = false; + } + + // Maximizable, desktop is required + options.maximizable = MUI.Desktop && MUI.Desktop.desktop && options.maximizable && options.type != 'modal' && options.type != 'modal2'; + + if (this.options.type == 'modal2') { + this.options.shadowBlur = 0; + this.options.shadowOffset = {'x': 0, 'y': 0}; + this.options.useSpinner = false; + this.options.useCanvas = false; + this.options.footerHeight = 0; + this.options.headerHeight = 0; + } + + // If window has no ID, give it one. + options.id = options.id || 'win' + (++MUI.Windows.windowIDCount); + + this.windowEl = $(options.id); + + if (options.require.css.length || options.require.images.length){ + new MUI.Require({ + css: options.require.css, + images: options.require.images, + onload: function(){ + this.newWindow(); + }.bind(this) + }); + } + else { + this.newWindow(); + } + + // Return window object + return this; + }, + saveValues: function(){ + var coordinates = this.windowEl.getCoordinates(); + this.options.x = coordinates.left.toInt(); + this.options.y = coordinates.top.toInt(); + }, + + /* + + Internal Function: newWindow + + Arguments: + properties + + */ + newWindow: function(properties){ // options is not doing anything + + // Shorten object chain + var instances = MUI.Windows.instances; + var instanceID = MUI.Windows.instances.get(this.options.id); + var options = this.options; + + // Here we check to see if there is already a class instance for this window + if (instanceID) var instance = instanceID; + + // Check if window already exists and is not in progress of closing + if ( this.windowEl && !this.isClosing ){ + // Restore if minimized + if (instance.isMinimized){ + MUI.Dock.restoreMinimized(this.windowEl); + } + // Expand and focus if collapsed + else if (instance.isCollapsed){ + MUI.collapseToggle(this.windowEl); + setTimeout(MUI.focusWindow.pass(this.windowEl, this),10); + } + else if (this.windowEl.hasClass('windowClosed')){ + + if (instance.check) instance.check.show(); + + this.windowEl.removeClass('windowClosed'); + this.windowEl.setStyle('opacity', 0); + this.windowEl.addClass('mocha'); + + if (MUI.Dock && $(MUI.options.dock) && instance.options.type == 'window') { + var currentButton = $(instance.options.id + '_dockTab'); + if (currentButton != null) { + currentButton.show(); + } + MUI.Desktop.setDesktopSize(); + } + + instance.displayNewWindow(); + + } + // Else focus + else { + var coordinates = document.getCoordinates(); + if (this.windowEl.getStyle('left').toInt() > coordinates.width || this.windowEl.getStyle('top').toInt() > coordinates.height){ + MUI.centerWindow(this.windowEl); + } + setTimeout(MUI.focusWindow.pass(this.windowEl, this),10); + if (MUI.options.standardEffects == true) { + this.windowEl.shake(); + } + } + return; + } + else { + instances.set(options.id, this); + } + + this.isClosing = false; + this.fireEvent('onBeforeBuild'); + + // Create window div + MUI.Windows.indexLevel++; + this.windowEl = new Element('div', { + 'class': 'mocha', + 'id': options.id, + 'styles': { + 'position': 'absolute', + 'width': options.width, + 'height': options.height, + 'display': 'block', + 'opacity': 0, + 'zIndex': MUI.Windows.indexLevel += 2 + } + }); + + this.windowEl.store('instance', this); + + this.windowEl.addClass(options.addClass); + + if (options.type == 'modal2') { + this.windowEl.addClass('modal2'); + } + + // Fix a mouseover issue with gauges in IE7 + if ( MUI.ieLegacySupport && options.shape == 'gauge') { + this.windowEl.setStyle('backgroundImage', 'url(../images/skin/spacer.gif)'); + } + + if (options.loadMethod == 'iframe') { + options.padding = { top: 0, right: 0, bottom: 0, left: 0 }; + } + + // Insert sub elements inside windowEl + this.insertWindowElements(); + + // Set title + this.titleEl.set('html', options.title); + + this.contentWrapperEl.setStyle('overflow', 'hidden'); + + this.contentEl.setStyles({ + 'padding-top': options.padding.top, + 'padding-bottom': options.padding.bottom, + 'padding-left': options.padding.left, + 'padding-right': options.padding.right + }); + + if (options.shape == 'gauge'){ + if (options.useCanvasControls){ + this.canvasControlsEl.setStyle('visibility', 'hidden'); + } + else { + this.controlsEl.setStyle('visibility', 'hidden'); + } + this.windowEl.addEvent('mouseover', function(){ + this.mouseover = true; + var showControls = function(){ + if (this.mouseover != false){ + if (options.useCanvasControls){ + this.canvasControlsEl.setStyle('visibility', 'visible'); + } + else { + this.controlsEl.setStyle('visibility', 'visible'); + } + this.canvasHeaderEl.setStyle('visibility', 'visible'); + this.titleEl.show(); + } + }; + showControls.delay(0, this); + + }.bind(this)); + this.windowEl.addEvent('mouseleave', function(){ + this.mouseover = false; + if (this.options.useCanvasControls){ + this.canvasControlsEl.setStyle('visibility', 'hidden'); + } + else { + this.controlsEl.setStyle('visibility', 'hidden'); + } + this.canvasHeaderEl.setStyle('visibility', 'hidden'); + this.titleEl.hide(); + }.bind(this)); + } + + // Inject window into DOM + this.windowEl.inject(options.container); + + // Convert CSS colors to Canvas colors. + this.setColors(); + + if (options.type != 'notification'){ + this.setMochaControlsWidth(); + } + + // Add content to window. + MUI.updateContent({ + 'element': this.windowEl, + 'content': options.content, + 'method': options.method, + 'url': options.contentURL, + 'data': options.data, + 'onContentLoaded': null, + 'require': { + js: options.require.js, + onload: options.require.onload + } + }); + + // Add content to window toolbar. + if (this.options.toolbar == true){ + MUI.updateContent({ + 'element': this.windowEl, + 'childElement': this.toolbarEl, + 'content': options.toolbarContent, + 'loadMethod': 'xhr', + 'method': options.method, + 'url': options.toolbarURL, + 'data': options.toolbarData, + 'onContentLoaded': options.toolbarOnload + }); + } + + // Add content to window toolbar. + if (this.options.toolbar2 == true){ + MUI.updateContent({ + 'element': this.windowEl, + 'childElement': this.toolbar2El, + 'content': options.toolbar2Content, + 'loadMethod': 'xhr', + 'method': options.method, + 'url': options.toolbar2URL, + 'data': options.toolbar2Data, + 'onContentLoaded': options.toolbar2Onload + }); + } + + this.drawWindow(); + + // Attach events to the window + this.attachDraggable(); + this.attachResizable(); + this.setupEvents(); + + if (options.resizable){ + this.adjustHandles(); + } + + // Position window. If position not specified by user then center the window on the page. + if (options.container == document.body || options.container == MUI.Desktop.desktop){ + var dimensions = window.getSize(); + } + else { + var dimensions = $(this.options.container).getSize(); + } + + if (!options.y) { + if (MUI.Desktop && MUI.Desktop.desktop) { + var y = (dimensions.y * .5) - (this.windowEl.offsetHeight * .5); + if (y < -options.shadowBlur) y = -options.shadowBlur; + } + else { + var y = window.getScroll().y + (window.getSize().y * .5) - (this.windowEl.offsetHeight * .5); + if (y < -options.shadowBlur) y = -options.shadowBlur; + } + } + else { + var y = options.y - options.shadowBlur; + } + + if (!this.options.x) { + var x = (dimensions.x * .5) - (this.windowEl.offsetWidth * .5); + if (x < -options.shadowBlur) x = -options.shadowBlur; + } + else { + var x = options.x - options.shadowBlur; + } + + this.windowEl.setStyles({ + 'top': y, + 'left': x + }); + + // Create opacityMorph + + this.opacityMorph = new Fx.Morph(this.windowEl, { + 'duration': 350, + transition: Fx.Transitions.Sine.easeInOut, + onComplete: function(){ + if (MUI.ieLegacySupport){ + this.drawWindow(); + } + }.bind(this) + }); + + this.displayNewWindow(); + + // This is a generic morph that can be reused later by functions like centerWindow() + // It returns the windowEl element rather than this Class. + this.morph = new Fx.Morph(this.windowEl, { + 'duration': 200 + }); + this.windowEl.store('morph', this.morph); + + this.resizeMorph = new Fx.Elements([this.contentWrapperEl, this.windowEl], { + duration: 400, + transition: Fx.Transitions.Sine.easeInOut, + onStart: function(){ + this.resizeAnimation = this.drawWindow.periodical(20, this); + }.bind(this), + onComplete: function(){ + $clear(this.resizeAnimation); + this.drawWindow(); + // Show iframe + if ( this.iframeEl ) { + this.iframeEl.setStyle('visibility', 'visible'); + } + }.bind(this) + }); + this.windowEl.store('resizeMorph', this.resizeMorph); + + // Add check mark to menu if link exists in menu + // Need to make sure the check mark is not added to links not in menu + if ($(this.windowEl.id + 'LinkCheck')){ + this.check = new Element('div', { + 'class': 'check', + 'id': this.options.id + '_check' + }).inject(this.windowEl.id + 'LinkCheck'); + } + + if (this.options.closeAfter != false){ + MUI.closeWindow.delay(this.options.closeAfter, this, this.windowEl); + } + + if (MUI.Dock && $(MUI.options.dock) && this.options.type == 'window' ){ + MUI.Dock.createDockTab(this.windowEl); + } + + }, + displayNewWindow: function(){ + + options = this.options; + if (options.type == 'modal' || options.type == 'modal2') { + MUI.currentModal = this.windowEl; + if (Browser.Engine.trident4){ + $('modalFix').show(); + } + $('modalOverlay').show(); + if (MUI.options.advancedEffects == false){ + $('modalOverlay').setStyle('opacity', .6); + this.windowEl.setStyles({ + 'zIndex': 11000, + 'opacity': 1 + }); + } + else { + MUI.Modal.modalOverlayCloseMorph.cancel(); + MUI.Modal.modalOverlayOpenMorph.start({ + 'opacity': .6 + }); + this.windowEl.setStyles({ + 'zIndex': 11000 + }); + this.opacityMorph.start({ + 'opacity': 1 + }); + } + + $$('.dockTab').removeClass('activeDockTab'); + $$('.mocha').removeClass('isFocused'); + this.windowEl.addClass('isFocused'); + + } + else if (MUI.options.advancedEffects == false){ + this.windowEl.setStyle('opacity', 1); + setTimeout(MUI.focusWindow.pass(this.windowEl, this), 10); + } + else { + // IE cannot handle both element opacity and VML alpha at the same time. + if (MUI.ieLegacySupport){ + this.drawWindow(false); + } + this.opacityMorph.start({ + 'opacity': 1 + }); + setTimeout(MUI.focusWindow.pass(this.windowEl, this), 10); + } + + }, + setupEvents: function() { + var windowEl = this.windowEl; + // Set events + // Note: if a button does not exist, its due to properties passed to newWindow() stating otherwice + if (this.closeButtonEl){ + this.closeButtonEl.addEvent('click', function(e) { + new Event(e).stop(); + MUI.closeWindow(windowEl); + }.bind(this)); + } + + if (this.options.type == 'window'){ + windowEl.addEvent('mousedown', function(e) { + if (MUI.ieLegacySupport) { + new Event(e).stop(); + } + MUI.focusWindow(windowEl); + if (windowEl.getStyle('top').toInt() < -this.options.shadowBlur) { + windowEl.setStyle('top', -this.options.shadowBlur); + } + }.bind(this)); + } + + if (this.minimizeButtonEl) { + this.minimizeButtonEl.addEvent('click', function(e) { + new Event(e).stop(); + MUI.Dock.minimizeWindow(windowEl); + }.bind(this)); + } + + if (this.maximizeButtonEl) { + this.maximizeButtonEl.addEvent('click', function(e) { + new Event(e).stop(); + if (this.isMaximized) { + MUI.Desktop.restoreWindow(windowEl); + } else { + MUI.Desktop.maximizeWindow(windowEl); + } + }.bind(this)); + } + + if (this.options.collapsible == true){ + // Keep titlebar text from being selected on double click in Safari. + this.titleEl.addEvent('selectstart', function(e) { + e = new Event(e).stop(); + }.bind(this)); + + if (MUI.ieLegacySupport) { + this.titleBarEl.addEvent('mousedown', function(e) { + this.titleEl.setCapture(); + }.bind(this)); + this.titleBarEl.addEvent('mouseup', function(e) { + this.titleEl.releaseCapture(); + }.bind(this)); + } + + this.titleBarEl.addEvent('dblclick', function(e) { + e = new Event(e).stop(); + MUI.collapseToggle(this.windowEl); + }.bind(this)); + } + + }, + /* + + Internal Function: attachDraggable() + Make window draggable. + + */ + attachDraggable: function(){ + var windowEl = this.windowEl; + if (!this.options.draggable) return; + this.windowDrag = new Drag.Move(windowEl, { + handle: this.titleBarEl, + container: this.options.restrict == true ? $(this.options.container) : false, + grid: this.options.draggableGrid, + limit: this.options.draggableLimit, + snap: this.options.draggableSnap, + onStart: function() { + if (this.options.type != 'modal' && this.options.type != 'modal2'){ + MUI.focusWindow(windowEl); + $('windowUnderlay').show(); + } + if (this.iframeEl) { + if (!MUI.ieLegacySupport) { + this.iframeEl.setStyle('visibility', 'hidden'); + } + else { + this.iframeEl.hide(); + } + } + }.bind(this), + onComplete: function() { + if (this.options.type != 'modal' && this.options.type != 'modal2') { + $('windowUnderlay').hide(); + } + if ( this.iframeEl ){ + if (!MUI.ieLegacySupport) { + this.iframeEl.setStyle('visibility', 'visible'); + } + else { + this.iframeEl.show(); + } + } + // Store new position in options. + this.saveValues(); + }.bind(this) + }); + }, + /* + + Internal Function: attachResizable + Make window resizable. + + */ + attachResizable: function(){ + var windowEl = this.windowEl; + if (!this.options.resizable) return; + this.resizable1 = this.windowEl.makeResizable({ + handle: [this.n, this.ne, this.nw], + limit: { + y: [ + function(){ + return this.windowEl.getStyle('top').toInt() + this.windowEl.getStyle('height').toInt() - this.options.resizeLimit.y[1]; + }.bind(this), + function(){ + return this.windowEl.getStyle('top').toInt() + this.windowEl.getStyle('height').toInt() - this.options.resizeLimit.y[0]; + }.bind(this) + ] + }, + modifiers: {x: false, y: 'top'}, + onStart: function(){ + this.resizeOnStart(); + this.coords = this.contentWrapperEl.getCoordinates(); + this.y2 = this.coords.top.toInt() + this.contentWrapperEl.offsetHeight; + }.bind(this), + onDrag: function(){ + this.coords = this.contentWrapperEl.getCoordinates(); + this.contentWrapperEl.setStyle('height', this.y2 - this.coords.top.toInt()); + this.resizeOnDrag(); + }.bind(this), + onComplete: function(){ + this.resizeOnComplete(); + }.bind(this) + }); + + this.resizable2 = this.contentWrapperEl.makeResizable({ + handle: [this.e, this.ne], + limit: { + x: [this.options.resizeLimit.x[0] - (this.options.shadowBlur * 2), this.options.resizeLimit.x[1] - (this.options.shadowBlur * 2) ] + }, + modifiers: {x: 'width', y: false}, + onStart: function(){ + this.resizeOnStart(); + }.bind(this), + onDrag: function(){ + this.resizeOnDrag(); + }.bind(this), + onComplete: function(){ + this.resizeOnComplete(); + }.bind(this) + }); + + this.resizable3 = this.contentWrapperEl.makeResizable({ + container: this.options.restrict == true ? $(this.options.container) : false, + handle: this.se, + limit: { + x: [this.options.resizeLimit.x[0] - (this.options.shadowBlur * 2), this.options.resizeLimit.x[1] - (this.options.shadowBlur * 2) ], + y: [this.options.resizeLimit.y[0] - this.headerFooterShadow, this.options.resizeLimit.y[1] - this.headerFooterShadow] + }, + modifiers: {x: 'width', y: 'height'}, + onStart: function(){ + this.resizeOnStart(); + }.bind(this), + onDrag: function(){ + this.resizeOnDrag(); + }.bind(this), + onComplete: function(){ + this.resizeOnComplete(); + }.bind(this) + }); + + this.resizable4 = this.contentWrapperEl.makeResizable({ + handle: [this.s, this.sw], + limit: { + y: [this.options.resizeLimit.y[0] - this.headerFooterShadow, this.options.resizeLimit.y[1] - this.headerFooterShadow] + }, + modifiers: {x: false, y: 'height'}, + onStart: function(){ + this.resizeOnStart(); + }.bind(this), + onDrag: function(){ + this.resizeOnDrag(); + }.bind(this), + onComplete: function(){ + this.resizeOnComplete(); + }.bind(this) + }); + + this.resizable5 = this.windowEl.makeResizable({ + handle: [this.w, this.sw, this.nw], + limit: { + x: [ + function(){ + return this.windowEl.getStyle('left').toInt() + this.windowEl.getStyle('width').toInt() - this.options.resizeLimit.x[1]; + }.bind(this), + function(){ + return this.windowEl.getStyle('left').toInt() + this.windowEl.getStyle('width').toInt() - this.options.resizeLimit.x[0]; + }.bind(this) + ] + }, + modifiers: {x: 'left', y: false}, + onStart: function(){ + this.resizeOnStart(); + this.coords = this.contentWrapperEl.getCoordinates(); + this.x2 = this.coords.left.toInt() + this.contentWrapperEl.offsetWidth; + }.bind(this), + onDrag: function(){ + this.coords = this.contentWrapperEl.getCoordinates(); + this.contentWrapperEl.setStyle('width', this.x2 - this.coords.left.toInt()); + this.resizeOnDrag(); + }.bind(this), + onComplete: function(){ + this.resizeOnComplete(); + }.bind(this) + }); + + }, + resizeOnStart: function(){ + $('windowUnderlay').show(); + if (this.iframeEl){ + if (!MUI.ieLegacySupport) { + this.iframeEl.setStyle('visibility', 'hidden'); + } + else { + this.iframeEl.hide(); + } + } + }, + resizeOnDrag: function(){ + this.drawWindow(); + this.adjustHandles(); + }, + resizeOnComplete: function(){ + $('windowUnderlay').hide(); + if (this.iframeEl){ + if (!MUI.ieLegacySupport) { + this.iframeEl.setStyle('visibility', 'visible'); + } + else { + this.iframeEl.show(); + // The following hack is to get IE8 RC1 IE8 Standards Mode to properly resize an iframe + // when only the vertical dimension is changed. + this.iframeEl.setStyle('width', '99%'); + this.iframeEl.setStyle('height', this.contentWrapperEl.offsetHeight); + this.iframeEl.setStyle('width', '100%'); + this.iframeEl.setStyle('height', this.contentWrapperEl.offsetHeight); + } + } + + // Resize panels if there are any + if (this.contentWrapperEl.getChildren('.column') != null) { + MUI.rWidth(this.contentWrapperEl); + this.contentWrapperEl.getChildren('.column').each(function(column){ + MUI.panelHeight(column); + }); + } + + this.fireEvent('onResize', this.windowEl); + }, + adjustHandles: function(){ + + var shadowBlur = this.options.shadowBlur; + var shadowBlur2x = shadowBlur * 2; + var shadowOffset = this.options.shadowOffset; + var top = shadowBlur - shadowOffset.y - 1; + var right = shadowBlur + shadowOffset.x - 1; + var bottom = shadowBlur + shadowOffset.y - 1; + var left = shadowBlur - shadowOffset.x - 1; + + var coordinates = this.windowEl.getCoordinates(); + var width = coordinates.width - shadowBlur2x + 2; + var height = coordinates.height - shadowBlur2x + 2; + + this.n.setStyles({ + 'top': top, + 'left': left + 10, + 'width': width - 20 + }); + this.e.setStyles({ + 'top': top + 10, + 'right': right, + 'height': height - 30 + }); + this.s.setStyles({ + 'bottom': bottom, + 'left': left + 10, + 'width': width - 30 + }); + this.w.setStyles({ + 'top': top + 10, + 'left': left, + 'height': height - 20 + }); + this.ne.setStyles({ + 'top': top, + 'right': right + }); + this.se.setStyles({ + 'bottom': bottom, + 'right': right + }); + this.sw.setStyles({ + 'bottom': bottom, + 'left': left + }); + this.nw.setStyles({ + 'top': top, + 'left': left + }); + }, + detachResizable: function(){ + this.resizable1.detach(); + this.resizable2.detach(); + this.resizable3.detach(); + this.resizable4.detach(); + this.resizable5.detach(); + this.windowEl.getElements('.handle').hide(); + }, + reattachResizable: function(){ + this.resizable1.attach(); + this.resizable2.attach(); + this.resizable3.attach(); + this.resizable4.attach(); + this.resizable5.attach(); + this.windowEl.getElements('.handle').show(); + }, + /* + + Internal Function: insertWindowElements + + Arguments: + windowEl + + */ + insertWindowElements: function(){ + + var options = this.options; + var height = options.height; + var width = options.width; + var id = options.id; + + var cache = {}; + + if (Browser.Engine.trident4){ + cache.zIndexFixEl = new Element('iframe', { + 'id': id + '_zIndexFix', + 'class': 'zIndexFix', + 'scrolling': 'no', + 'marginWidth': 0, + 'marginHeight': 0, + 'src': '', + 'styles': { + 'position': 'absolute' // This is set here to make theme transitions smoother + } + }).inject(this.windowEl); + } + + cache.overlayEl = new Element('div', { + 'id': id + '_overlay', + 'class': 'mochaOverlay', + 'styles': { + 'position': 'absolute', // This is set here to make theme transitions smoother + 'top': 0, + 'left': 0 + } + }).inject(this.windowEl); + + cache.titleBarEl = new Element('div', { + 'id': id + '_titleBar', + 'class': 'mochaTitlebar', + 'styles': { + 'cursor': options.draggable ? 'move' : 'default' + } + }).inject(cache.overlayEl, 'top'); + + cache.titleEl = new Element('h3', { + 'id': id + '_title', + 'class': 'mochaTitle' + }).inject(cache.titleBarEl); + + if (options.icon != false){ + cache.titleEl.setStyles({ + 'padding-left': 28, + 'background': 'url(' + options.icon + ') 5px 4px no-repeat' + }); + } + + cache.contentBorderEl = new Element('div', { + 'id': id + '_contentBorder', + 'class': 'mochaContentBorder' + }).inject(cache.overlayEl); + + if (options.toolbar){ + cache.toolbarWrapperEl = new Element('div', { + 'id': id + '_toolbarWrapper', + 'class': 'mochaToolbarWrapper', + 'styles': { 'height': options.toolbarHeight } + }).inject(cache.contentBorderEl, options.toolbarPosition == 'bottom' ? 'after' : 'before'); + + if (options.toolbarPosition == 'bottom') { + cache.toolbarWrapperEl.addClass('bottom'); + } + cache.toolbarEl = new Element('div', { + 'id': id + '_toolbar', + 'class': 'mochaToolbar', + 'styles': { 'height': options.toolbarHeight } + }).inject(cache.toolbarWrapperEl); + } + + if (options.toolbar2){ + cache.toolbar2WrapperEl = new Element('div', { + 'id': id + '_toolbar2Wrapper', + 'class': 'mochaToolbarWrapper', + 'styles': { 'height': options.toolbar2Height } + }).inject(cache.contentBorderEl, options.toolbar2Position == 'bottom' ? 'after' : 'before'); + + if (options.toolbar2Position == 'bottom') { + cache.toolbar2WrapperEl.addClass('bottom'); + } + cache.toolbar2El = new Element('div', { + 'id': id + '_toolbar2', + 'class': 'mochaToolbar', + 'styles': { 'height': options.toolbar2Height } + }).inject(cache.toolbar2WrapperEl); + } + + cache.contentWrapperEl = new Element('div', { + 'id': id + '_contentWrapper', + 'class': 'mochaContentWrapper', + 'styles': { + 'width': width + 'px', + 'height': height + 'px' + } + }).inject(cache.contentBorderEl); + + if (this.options.shape == 'gauge'){ + cache.contentBorderEl.setStyle('borderWidth', 0); + } + + cache.contentEl = new Element('div', { + 'id': id + '_content', + 'class': 'mochaContent' + }).inject(cache.contentWrapperEl); + + if (this.options.useCanvas == true && !MUI.ieLegacySupport) { + cache.canvasEl = new Element('canvas', { + 'id': id + '_canvas', + 'class': 'mochaCanvas', + 'width': 10, + 'height': 10 + }).inject(this.windowEl); + } + + if (this.options.useCanvas == true && MUI.ieLegacySupport) { + cache.canvasEl = new Element('canvas', { + 'id': id + '_canvas', + 'class': 'mochaCanvas', + 'width': 50000, // IE8 excanvas requires these large numbers + 'height': 20000, + 'styles': { + 'position': 'absolute', + 'top': 0, + 'left': 0 + } + }).inject(this.windowEl); + + if (MUI.ieLegacySupport && MUI.ieSupport == 'excanvas'){ + G_vmlCanvasManager.initElement(cache.canvasEl); + cache.canvasEl = this.windowEl.getElement('.mochaCanvas'); + } + } + + cache.controlsEl = new Element('div', { + 'id': id + '_controls', + 'class': 'mochaControls' + }).inject(cache.overlayEl, 'after'); + + if (options.useCanvasControls == true){ + cache.canvasControlsEl = new Element('canvas', { + 'id': id + '_canvasControls', + 'class': 'mochaCanvasControls', + 'width': 14, + 'height': 14 + }).inject(this.windowEl); + + if (MUI.ieLegacySupport && MUI.ieSupport == 'excanvas'){ + G_vmlCanvasManager.initElement(cache.canvasControlsEl); + cache.canvasControlsEl = this.windowEl.getElement('.mochaCanvasControls'); + } + } + + if (options.closable){ + cache.closeButtonEl = new Element('div', { + 'id': id + '_closeButton', + 'class': 'mochaCloseButton mochaWindowButton', + 'title': 'Close' + }).inject(cache.controlsEl); + } + + if (options.maximizable){ + cache.maximizeButtonEl = new Element('div', { + 'id': id + '_maximizeButton', + 'class': 'mochaMaximizeButton mochaWindowButton', + 'title': 'Maximize' + }).inject(cache.controlsEl); + } + + if (options.minimizable){ + cache.minimizeButtonEl = new Element('div', { + 'id': id + '_minimizeButton', + 'class': 'mochaMinimizeButton mochaWindowButton', + 'title': 'Minimize' + }).inject(cache.controlsEl); + } + + if (options.useSpinner == true && options.shape != 'gauge' && options.type != 'notification'){ + cache.spinnerEl = new Element('div', { + 'id': id + '_spinner', + 'class': 'mochaSpinner', + 'width': 16, + 'height': 16 + }).inject(this.windowEl, 'bottom'); + } + + if (this.options.shape == 'gauge'){ + cache.canvasHeaderEl = new Element('canvas', { + 'id': id + '_canvasHeader', + 'class': 'mochaCanvasHeader', + 'width': this.options.width, + 'height': 26 + }).inject(this.windowEl, 'bottom'); + + if (MUI.ieLegacySupport && MUI.ieSupport == 'excanvas'){ + G_vmlCanvasManager.initElement(cache.canvasHeaderEl); + cache.canvasHeaderEl = this.windowEl.getElement('.mochaCanvasHeader'); + } + } + + if ( MUI.ieLegacySupport ){ + cache.overlayEl.setStyle('zIndex', 2); + } + + if (options.resizable){ + cache.n = new Element('div', { + 'id': id + '_resizeHandle_n', + 'class': 'handle', + 'styles': { + 'top': 0, + 'left': 10, + 'cursor': 'n-resize' + } + }).inject(cache.overlayEl, 'after'); + + cache.ne = new Element('div', { + 'id': id + '_resizeHandle_ne', + 'class': 'handle corner', + 'styles': { + 'top': 0, + 'right': 0, + 'cursor': 'ne-resize' + } + }).inject(cache.overlayEl, 'after'); + + cache.e = new Element('div', { + 'id': id + '_resizeHandle_e', + 'class': 'handle', + 'styles': { + 'top': 10, + 'right': 0, + 'cursor': 'e-resize' + } + }).inject(cache.overlayEl, 'after'); + + cache.se = new Element('div', { + 'id': id + '_resizeHandle_se', + 'class': 'handle cornerSE', + 'styles': { + 'bottom': 0, + 'right': 0, + 'cursor': 'se-resize' + } + }).inject(cache.overlayEl, 'after'); + + cache.s = new Element('div', { + 'id': id + '_resizeHandle_s', + 'class': 'handle', + 'styles': { + 'bottom': 0, + 'left': 10, + 'cursor': 's-resize' + } + }).inject(cache.overlayEl, 'after'); + + cache.sw = new Element('div', { + 'id': id + '_resizeHandle_sw', + 'class': 'handle corner', + 'styles': { + 'bottom': 0, + 'left': 0, + 'cursor': 'sw-resize' + } + }).inject(cache.overlayEl, 'after'); + + cache.w = new Element('div', { + 'id': id + '_resizeHandle_w', + 'class': 'handle', + 'styles': { + 'top': 10, + 'left': 0, + 'cursor': 'w-resize' + } + }).inject(cache.overlayEl, 'after'); + + cache.nw = new Element('div', { + 'id': id + '_resizeHandle_nw', + 'class': 'handle corner', + 'styles': { + 'top': 0, + 'left': 0, + 'cursor': 'nw-resize' + } + }).inject(cache.overlayEl, 'after'); + } + $extend(this, cache); + + }, + /* + + Convert CSS colors to Canvas colors. + + */ + setColors: function(){ + + if (this.options.useCanvas == true) { + + // Set TitlebarColor + var pattern = /\?(.*?)\)/; + if (this.titleBarEl.getStyle('backgroundImage') != 'none'){ + var gradient = this.titleBarEl.getStyle('backgroundImage'); + gradient = gradient.match(pattern)[1]; + gradient = gradient.parseQueryString(); + var gradientFrom = gradient.from; + var gradientTo = gradient.to.replace(/\"/, ''); // IE7 was adding a quotation mark in. No idea why. + + this.options.headerStartColor = new Color(gradientFrom); + this.options.headerStopColor = new Color(gradientTo); + this.titleBarEl.addClass('replaced'); + } + else if (this.titleBarEl.getStyle('background-color') !== '' && this.titleBarEl.getStyle('background-color') !== 'transparent') { + this.options.headerStartColor = new Color(this.titleBarEl.getStyle('background-color')).mix('#fff', 20); + this.options.headerStopColor = new Color(this.titleBarEl.getStyle('background-color')).mix('#000', 20); + this.titleBarEl.addClass('replaced'); + } + + // Set BodyBGColor + if (this.windowEl.getStyle('background-color') !== '' && this.windowEl.getStyle('background-color') !== 'transparent') { + this.options.bodyBgColor = new Color(this.windowEl.getStyle('background-color')); + this.windowEl.addClass('replaced'); + } + + // Set resizableColor, the color of the SE corner resize handle + if (this.options.resizable && this.se.getStyle('background-color') !== '' && this.se.getStyle('background-color') !== 'transparent') { + this.options.resizableColor = new Color(this.se.getStyle('background-color')); + this.se.addClass('replaced'); + } + + } + + if (this.options.useCanvasControls == true){ + + if (this.minimizeButtonEl){ + + // Set Minimize Button Foreground Color + if (this.minimizeButtonEl.getStyle('color') !== '' && this.minimizeButtonEl.getStyle('color') !== 'transparent') { + this.options.minimizeColor = new Color(this.minimizeButtonEl.getStyle('color')); + } + + // Set Minimize Button Background Color + if (this.minimizeButtonEl.getStyle('background-color') !== '' && this.minimizeButtonEl.getStyle('background-color') !== 'transparent') { + this.options.minimizeBgColor = new Color(this.minimizeButtonEl.getStyle('background-color')); + this.minimizeButtonEl.addClass('replaced'); + } + + } + + if (this.maximizeButtonEl){ + + // Set Maximize Button Foreground Color + if (this.maximizeButtonEl.getStyle('color') !== '' && this.maximizeButtonEl.getStyle('color') !== 'transparent') { + this.options.maximizeColor = new Color(this.maximizeButtonEl.getStyle('color')); + } + + // Set Maximize Button Background Color + if (this.maximizeButtonEl.getStyle('background-color') !== '' && this.maximizeButtonEl.getStyle('background-color') !== 'transparent') { + this.options.maximizeBgColor = new Color(this.maximizeButtonEl.getStyle('background-color')); + this.maximizeButtonEl.addClass('replaced'); + } + + } + + if (this.closeButtonEl){ + + // Set Close Button Foreground Color + if (this.closeButtonEl.getStyle('color') !== '' && this.closeButtonEl.getStyle('color') !== 'transparent') { + this.options.closeColor = new Color(this.closeButtonEl.getStyle('color')); + } + + // Set Close Button Background Color + if (this.closeButtonEl.getStyle('background-color') !== '' && this.closeButtonEl.getStyle('background-color') !== 'transparent') { + this.options.closeBgColor = new Color(this.closeButtonEl.getStyle('background-color')); + this.closeButtonEl.addClass('replaced'); + } + + } + } + }, + /* + + Internal function: drawWindow + This is where we create the canvas GUI + + Arguments: + windowEl: the $(window) + shadows: (boolean) false will draw a window without shadows + + */ + drawWindow: function(shadows) { + + if (this.drawingWindow == true) return; + this.drawingWindow = true; + + if (this.isCollapsed){ + this.drawWindowCollapsed(shadows); + return; + } + + var windowEl = this.windowEl; + + var options = this.options; + var shadowBlur = options.shadowBlur; + var shadowBlur2x = shadowBlur * 2; + var shadowOffset = this.options.shadowOffset; + + this.overlayEl.setStyles({ + 'width': this.contentWrapperEl.offsetWidth + }); + + // Resize iframe when window is resized + if (this.iframeEl) { + this.iframeEl.setStyle('height', this.contentWrapperEl.offsetHeight); + } + + var borderHeight = this.contentBorderEl.getStyle('margin-top').toInt() + this.contentBorderEl.getStyle('margin-bottom').toInt(); + var toolbarHeight = this.toolbarWrapperEl ? this.toolbarWrapperEl.getStyle('height').toInt() + this.toolbarWrapperEl.getStyle('margin-top').toInt() : 0; + var toolbar2Height = this.toolbar2WrapperEl ? this.toolbar2WrapperEl.getStyle('height').toInt() + this.toolbar2WrapperEl.getStyle('margin-top').toInt() : 0; + + this.headerFooterShadow = options.headerHeight + options.footerHeight + shadowBlur2x; + var height = this.contentWrapperEl.getStyle('height').toInt() + this.headerFooterShadow + toolbarHeight + toolbar2Height + borderHeight; + var width = this.contentWrapperEl.getStyle('width').toInt() + shadowBlur2x; + this.windowEl.setStyles({ + 'height': height, + 'width': width + }); + + this.overlayEl.setStyles({ + 'height': height, + 'top': shadowBlur - shadowOffset.y, + 'left': shadowBlur - shadowOffset.x + }); + + if (this.options.useCanvas == true) { + if (MUI.ieLegacySupport) { + this.canvasEl.height = 20000; + this.canvasEl.width = 50000; + } + this.canvasEl.height = height; + this.canvasEl.width = width; + } + + // Part of the fix for IE6 select z-index bug + if (Browser.Engine.trident4){ + this.zIndexFixEl.setStyles({ + 'width': width, + 'height': height + }) + } + + this.titleBarEl.setStyles({ + 'width': width - shadowBlur2x, + 'height': options.headerHeight + }); + + // Make sure loading icon is placed correctly. + if (options.useSpinner == true && options.shape != 'gauge' && options.type != 'notification'){ + this.spinnerEl.setStyles({ + 'left': shadowBlur - shadowOffset.x + 3, + 'bottom': shadowBlur + shadowOffset.y + 4 + }); + } + + if (this.options.useCanvas != false) { + + // Draw Window + var ctx = this.canvasEl.getContext('2d'); + ctx.clearRect(0, 0, width, height); + + switch (options.shape) { + case 'box': + this.drawBox(ctx, width, height, shadowBlur, shadowOffset, shadows); + break; + case 'gauge': + this.drawGauge(ctx, width, height, shadowBlur, shadowOffset, shadows); + break; + } + + if (options.resizable){ + MUI.triangle( + ctx, + width - (shadowBlur + shadowOffset.x + 17), + height - (shadowBlur + shadowOffset.y + 18), + 11, + 11, + options.resizableColor, + 1.0 + ); + } + + // Invisible dummy object. The last element drawn is not rendered consistently while resizing in IE6 and IE7 + if (MUI.ieLegacySupport){ + MUI.triangle(ctx, 0, 0, 10, 10, options.resizableColor, 0); + } + } + + if (options.type != 'notification' && options.useCanvasControls == true){ + this.drawControls(width, height, shadows); + } + + // Resize panels if there are any + if (MUI.Desktop && this.contentWrapperEl.getChildren('.column').length != 0) { + MUI.rWidth(this.contentWrapperEl); + this.contentWrapperEl.getChildren('.column').each(function(column){ + MUI.panelHeight(column); + }); + } + + this.drawingWindow = false; + return this; + + }, + drawWindowCollapsed: function(shadows) { + + var windowEl = this.windowEl; + + var options = this.options; + var shadowBlur = options.shadowBlur; + var shadowBlur2x = shadowBlur * 2; + var shadowOffset = options.shadowOffset; + + var headerShadow = options.headerHeight + shadowBlur2x + 2; + var height = headerShadow; + var width = this.contentWrapperEl.getStyle('width').toInt() + shadowBlur2x; + this.windowEl.setStyle('height', height); + + this.overlayEl.setStyles({ + 'height': height, + 'top': shadowBlur - shadowOffset.y, + 'left': shadowBlur - shadowOffset.x + }); + + // Part of the fix for IE6 select z-index bug + if (Browser.Engine.trident4){ + this.zIndexFixEl.setStyles({ + 'width': width, + 'height': height + }); + } + + // Set width + this.windowEl.setStyle('width', width); + this.overlayEl.setStyle('width', width); + this.titleBarEl.setStyles({ + 'width': width - shadowBlur2x, + 'height': options.headerHeight + }); + + // Draw Window + if (this.options.useCanvas != false) { + this.canvasEl.height = height; + this.canvasEl.width = width; + + var ctx = this.canvasEl.getContext('2d'); + ctx.clearRect(0, 0, width, height); + + this.drawBoxCollapsed(ctx, width, height, shadowBlur, shadowOffset, shadows); + if (options.useCanvasControls == true) { + this.drawControls(width, height, shadows); + } + + // Invisible dummy object. The last element drawn is not rendered consistently while resizing in IE6 and IE7 + if (MUI.ieLegacySupport){ + MUI.triangle(ctx, 0, 0, 10, 10, options.resizableColor, 0); + } + } + + this.drawingWindow = false; + return this; + + }, + drawControls : function(width, height, shadows){ + var options = this.options; + var shadowBlur = options.shadowBlur; + var shadowOffset = options.shadowOffset; + var controlsOffset = options.controlsOffset; + + // Make sure controls are placed correctly. + this.controlsEl.setStyles({ + 'right': shadowBlur + shadowOffset.x + controlsOffset.right, + 'top': shadowBlur - shadowOffset.y + controlsOffset.top + }); + + this.canvasControlsEl.setStyles({ + 'right': shadowBlur + shadowOffset.x + controlsOffset.right, + 'top': shadowBlur - shadowOffset.y + controlsOffset.top + }); + + // Calculate X position for controlbuttons + //var mochaControlsWidth = 52; + this.closebuttonX = options.closable ? this.mochaControlsWidth - 7 : this.mochaControlsWidth + 12; + this.maximizebuttonX = this.closebuttonX - (options.maximizable ? 19 : 0); + this.minimizebuttonX = this.maximizebuttonX - (options.minimizable ? 19 : 0); + + var ctx2 = this.canvasControlsEl.getContext('2d'); + ctx2.clearRect(0, 0, 100, 100); + + if (this.options.closable){ + this.closebutton( + ctx2, + this.closebuttonX, + 7, + options.closeBgColor, + 1.0, + options.closeColor, + 1.0 + ); + } + if (this.options.maximizable){ + this.maximizebutton( + ctx2, + this.maximizebuttonX, + 7, + options.maximizeBgColor, + 1.0, + options.maximizeColor, + 1.0 + ); + } + if (this.options.minimizable){ + this.minimizebutton( + ctx2, + this.minimizebuttonX, + 7, + options.minimizeBgColor, + 1.0, + options.minimizeColor, + 1.0 + ); + } + // Invisible dummy object. The last element drawn is not rendered consistently while resizing in IE6 and IE7 + if (MUI.ieLegacySupport){ + MUI.circle(ctx2, 0, 0, 3, this.options.resizableColor, 0); + } + + }, + drawBox: function(ctx, width, height, shadowBlur, shadowOffset, shadows){ + + var options = this.options; + var shadowBlur2x = shadowBlur * 2; + var cornerRadius = this.options.cornerRadius; + + // This is the drop shadow. It is created onion style. + if ( shadows != false ) { + for (var x = 0; x <= shadowBlur; x++){ + MUI.roundedRect( + ctx, + shadowOffset.x + x, + shadowOffset.y + x, + width - (x * 2) - shadowOffset.x, + height - (x * 2) - shadowOffset.y, + cornerRadius + (shadowBlur - x), + [0, 0, 0], + x == shadowBlur ? .29 : .065 + (x * .01) + ); + } + } + // Window body. + this.bodyRoundedRect( + ctx, // context + shadowBlur - shadowOffset.x, // x + shadowBlur - shadowOffset.y, // y + width - shadowBlur2x, // width + height - shadowBlur2x, // height + cornerRadius, // corner radius + options.bodyBgColor // Footer color + ); + + if (this.options.type != 'notification'){ + // Window header. + this.topRoundedRect( + ctx, // context + shadowBlur - shadowOffset.x, // x + shadowBlur - shadowOffset.y, // y + width - shadowBlur2x, // width + options.headerHeight, // height + cornerRadius, // corner radius + options.headerStartColor, // Header gradient's top color + options.headerStopColor // Header gradient's bottom color + ); + } + }, + drawBoxCollapsed: function(ctx, width, height, shadowBlur, shadowOffset, shadows){ + + var options = this.options; + var shadowBlur2x = shadowBlur * 2; + var cornerRadius = options.cornerRadius; + + // This is the drop shadow. It is created onion style. + if ( shadows != false ){ + for (var x = 0; x <= shadowBlur; x++){ + MUI.roundedRect( + ctx, + shadowOffset.x + x, + shadowOffset.y + x, + width - (x * 2) - shadowOffset.x, + height - (x * 2) - shadowOffset.y, + cornerRadius + (shadowBlur - x), + [0, 0, 0], + x == shadowBlur ? .3 : .06 + (x * .01) + ); + } + } + + // Window header + this.topRoundedRect2( + ctx, // context + shadowBlur - shadowOffset.x, // x + shadowBlur - shadowOffset.y, // y + width - shadowBlur2x, // width + options.headerHeight + 2, // height + cornerRadius, // corner radius + options.headerStartColor, // Header gradient's top color + options.headerStopColor // Header gradient's bottom color + ); + + }, + drawGauge: function(ctx, width, height, shadowBlur, shadowOffset, shadows){ + var options = this.options; + var radius = (width * .5) - (shadowBlur) + 16; + if (shadows != false) { + for (var x = 0; x <= shadowBlur; x++){ + MUI.circle( + ctx, + width * .5 + shadowOffset.x, + (height + options.headerHeight) * .5 + shadowOffset.x, + (width *.5) - (x * 2) - shadowOffset.x, + [0, 0, 0], + x == shadowBlur ? .75 : .075 + (x * .04) + ); + } + } + MUI.circle( + ctx, + width * .5 - shadowOffset.x, + (height + options.headerHeight) * .5 - shadowOffset.y, + (width *.5) - shadowBlur, + options.bodyBgColor, + 1 + ); + + // Draw gauge header + this.canvasHeaderEl.setStyles({ + 'top': shadowBlur - shadowOffset.y, + 'left': shadowBlur - shadowOffset.x + }); + var ctx = this.canvasHeaderEl.getContext('2d'); + ctx.clearRect(0, 0, width, 100); + ctx.beginPath(); + ctx.lineWidth = 24; + ctx.lineCap = 'round'; + ctx.moveTo(13, 13); + ctx.lineTo(width - (shadowBlur*2) - 13, 13); + ctx.strokeStyle = 'rgba(0, 0, 0, .65)'; + ctx.stroke(); + }, + bodyRoundedRect: function(ctx, x, y, width, height, radius, rgb){ + ctx.fillStyle = 'rgba(' + rgb.join(',') + ', 1)'; + ctx.beginPath(); + ctx.moveTo(x, y + radius); + ctx.lineTo(x, y + height - radius); + ctx.quadraticCurveTo(x, y + height, x + radius, y + height); + ctx.lineTo(x + width - radius, y + height); + ctx.quadraticCurveTo(x + width, y + height, x + width, y + height - radius); + ctx.lineTo(x + width, y + radius); + ctx.quadraticCurveTo(x + width, y, x + width - radius, y); + ctx.lineTo(x + radius, y); + ctx.quadraticCurveTo(x, y, x, y + radius); + ctx.fill(); + + }, + topRoundedRect: function(ctx, x, y, width, height, radius, headerStartColor, headerStopColor){ + var lingrad = ctx.createLinearGradient(0, 0, 0, height); + lingrad.addColorStop(0, 'rgb(' + headerStartColor.join(',') + ')'); + lingrad.addColorStop(1, 'rgb(' + headerStopColor.join(',') + ')'); + ctx.fillStyle = lingrad; + ctx.beginPath(); + ctx.moveTo(x, y); + ctx.lineTo(x, y + height); + ctx.lineTo(x + width, y + height); + ctx.lineTo(x + width, y + radius); + ctx.quadraticCurveTo(x + width, y, x + width - radius, y); + ctx.lineTo(x + radius, y); + ctx.quadraticCurveTo(x, y, x, y + radius); + ctx.fill(); + + }, + topRoundedRect2: function(ctx, x, y, width, height, radius, headerStartColor, headerStopColor){ + // Chrome is having trouble rendering the LinearGradient in this particular case + if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1) { + ctx.fillStyle = 'rgba(' + headerStopColor.join(',') + ', 1)'; + } + else { + var lingrad = ctx.createLinearGradient(0, this.options.shadowBlur - 1, 0, height + this.options.shadowBlur + 3); + lingrad.addColorStop(0, 'rgb(' + headerStartColor.join(',') + ')'); + lingrad.addColorStop(1, 'rgb(' + headerStopColor.join(',') + ')'); + ctx.fillStyle = lingrad; + } + ctx.beginPath(); + ctx.moveTo(x, y + radius); + ctx.lineTo(x, y + height - radius); + ctx.quadraticCurveTo(x, y + height, x + radius, y + height); + ctx.lineTo(x + width - radius, y + height); + ctx.quadraticCurveTo(x + width, y + height, x + width, y + height - radius); + ctx.lineTo(x + width, y + radius); + ctx.quadraticCurveTo(x + width, y, x + width - radius, y); + ctx.lineTo(x + radius, y); + ctx.quadraticCurveTo(x, y, x, y + radius); + ctx.fill(); + }, + maximizebutton: function(ctx, x, y, rgbBg, aBg, rgb, a){ + // Circle + ctx.beginPath(); + ctx.arc(x, y, 7, 0, Math.PI*2, true); + ctx.fillStyle = 'rgba(' + rgbBg.join(',') + ',' + aBg + ')'; + ctx.fill(); + // X sign + ctx.strokeStyle = 'rgba(' + rgb.join(',') + ',' + a + ')'; + ctx.lineWidth = 2; + ctx.beginPath(); + ctx.moveTo(x, y - 3.5); + ctx.lineTo(x, y + 3.5); + ctx.moveTo(x - 3.5, y); + ctx.lineTo(x + 3.5, y); + ctx.stroke(); + }, + closebutton: function(ctx, x, y, rgbBg, aBg, rgb, a){ + // Circle + ctx.beginPath(); + ctx.arc(x, y, 7, 0, Math.PI*2, true); + ctx.fillStyle = 'rgba(' + rgbBg.join(',') + ',' + aBg + ')'; + ctx.fill(); + // Plus sign + ctx.strokeStyle = 'rgba(' + rgb.join(',') + ',' + a + ')'; + ctx.lineWidth = 2; + ctx.beginPath(); + ctx.moveTo(x - 3, y - 3); + ctx.lineTo(x + 3, y + 3); + ctx.moveTo(x + 3, y - 3); + ctx.lineTo(x - 3, y + 3); + ctx.stroke(); + }, + minimizebutton: function(ctx, x, y, rgbBg, aBg, rgb, a){ + // Circle + ctx.beginPath(); + ctx.arc(x,y,7,0,Math.PI*2,true); + ctx.fillStyle = 'rgba(' + rgbBg.join(',') + ',' + aBg + ')'; + ctx.fill(); + // Minus sign + ctx.strokeStyle = 'rgba(' + rgb.join(',') + ',' + a + ')'; + ctx.lineWidth = 2; + ctx.beginPath(); + ctx.moveTo(x - 3.5, y); + ctx.lineTo(x + 3.5, y); + ctx.stroke(); + }, + setMochaControlsWidth: function(){ + this.mochaControlsWidth = 0; + var options = this.options; + if (options.minimizable){ + this.mochaControlsWidth += (this.minimizeButtonEl.getStyle('margin-left').toInt() + this.minimizeButtonEl.getStyle('width').toInt()); + } + if (options.maximizable){ + this.mochaControlsWidth += (this.maximizeButtonEl.getStyle('margin-left').toInt() + this.maximizeButtonEl.getStyle('width').toInt()); + } + if (options.closable){ + this.mochaControlsWidth += (this.closeButtonEl.getStyle('margin-left').toInt() + this.closeButtonEl.getStyle('width').toInt()); + } + this.controlsEl.setStyle('width', this.mochaControlsWidth); + if (options.useCanvasControls == true){ + this.canvasControlsEl.setProperty('width', this.mochaControlsWidth); + } + }, + /* + + Function: hideSpinner + Hides the spinner. + + Example: + (start code) + $('myWindow').retrieve('instance').hideSpinner(); + (end) + + */ + hideSpinner: function() { + if (this.spinnerEl) this.spinnerEl.hide(); + return this; + }, + /* + + Function: showSpinner + Shows the spinner. + + Example: + (start code) + $('myWindow').retrieve('instance').showSpinner(); + (end) + + */ + showSpinner: function(){ + if (this.spinnerEl) this.spinnerEl.show(); + return this; + }, + /* + + Function: close + Closes the window. This is an alternative to using MUI.Core.closeWindow(). + + Example: + (start code) + $('myWindow').retrieve('instance').close(); + (end) + + */ + close: function( ) { + if (!this.isClosing) MUI.closeWindow(this.windowEl); + return this; + }, + /* + + Function: minimize + Minimizes the window. + + Example: + (start code) + $('myWindow').retrieve('instance').minimize(); + (end) + + */ + minimize: function( ){ + MUI.Dock.minimizeWindow(this.windowEl); + return this; + }, + /* + + Function: maximize + Maximizes the window. + + Example: + (start code) + $('myWindow').retrieve('instance').maximize(); + (end) + + */ + maximize: function( ) { + if (this.isMinimized){ + MUI.Dock.restoreMinimized(this.windowEl); + } + MUI.Desktop.maximizeWindow(this.windowEl); + return this; + }, + /* + + Function: restore + Restores a minimized/maximized window to its original size. + + Example: + (start code) + $('myWindow').retrieve('instance').restore(); + (end) + + */ + restore: function() { + if ( this.isMinimized ) + MUI.Dock.restoreMinimized(this.windowEl); + else if ( this.isMaximized ) + MUI.Desktop.restoreWindow(this.windowEl); + return this; + }, + /* + + Function: resize + Resize a window. + + Notes: + If Advanced Effects are on the resize is animated. If centered is set to true the window remains centered as it resizes. + + Example: + (start code) + $('myWindow').retrieve('instance').resize({width:500,height:300,centered:true}); + (end) + + */ + resize: function(options){ + MUI.resizeWindow(this.windowEl, options); + return this; + }, + /* + + Function: center + Center a window. + + Example: + (start code) + $('myWindow').retrieve('instance').center(); + (end) + + */ + center: function() { + MUI.centerWindow(this.windowEl); + return this; + }, + + hide: function(){ + this.windowEl.setStyle('display', 'none'); + return this; + }, + + show: function(){ + this.windowEl.setStyle('display', 'block'); + return this; + } + +}); + +MUI.extend({ + /* + + Function: closeWindow + Closes a window. + + Syntax: + (start code) + MUI.closeWindow(); + (end) + + Arguments: + windowEl - the ID of the window to be closed + + Returns: + true - the window was closed + false - the window was not closed + + */ + closeWindow: function(windowEl){ + + var instance = windowEl.retrieve('instance'); + + // Does window exist and is not already in process of closing ? + if (windowEl != $(windowEl) || instance.isClosing) return; + + instance.isClosing = true; + instance.fireEvent('onClose', windowEl); + + if (instance.options.storeOnClose){ + this.storeOnClose(instance, windowEl); + return; + } + if (instance.check) instance.check.destroy(); + + if ((instance.options.type == 'modal' || instance.options.type == 'modal2') && Browser.Engine.trident4){ + $('modalFix').hide(); + } + + if (MUI.options.advancedEffects == false){ + if (instance.options.type == 'modal' || instance.options.type == 'modal2'){ + $('modalOverlay').setStyle('opacity', 0); + } + MUI.closingJobs(windowEl); + return true; + } + else { + // Redraws IE windows without shadows since IE messes up canvas alpha when you change element opacity + if (MUI.ieLegacySupport) instance.drawWindow(false); + if (instance.options.type == 'modal' || instance.options.type == 'modal2'){ + MUI.Modal.modalOverlayCloseMorph.start({ + 'opacity': 0 + }); + } + var closeMorph = new Fx.Morph(windowEl, { + duration: 120, + onComplete: function(){ + MUI.closingJobs(windowEl); + return true; + }.bind(this) + }); + closeMorph.start({ + 'opacity': .4 + }); + } + + }, + closingJobs: function(windowEl){ + + var instances = MUI.Windows.instances; + var instance = instances.get(windowEl.id); + windowEl.setStyle('visibility', 'hidden'); + // Destroy throws an error in IE8 + if (MUI.ieLegacySupport) { + windowEl.dispose(); + } + else { + windowEl.destroy(); + } + instance.fireEvent('onCloseComplete'); + + if (instance.options.type != 'notification'){ + var newFocus = this.getWindowWithHighestZindex(); + this.focusWindow(newFocus); + } + + instances.erase(instance.options.id); + if (this.loadingWorkspace == true) { + this.windowUnload(); + } + + if (MUI.Dock && $(MUI.options.dock) && instance.options.type == 'window') { + var currentButton = $(instance.options.id + '_dockTab'); + if (currentButton != null) { + MUI.Dock.dockSortables.removeItems(currentButton).destroy(); + } + // Need to resize everything in case the dock becomes smaller when a tab is removed + MUI.Desktop.setDesktopSize(); + } + }, + storeOnClose: function(instance, windowEl){ + + if (instance.check) instance.check.hide(); + + windowEl.setStyles({ + zIndex: -1 + }); + windowEl.addClass('windowClosed'); + windowEl.removeClass('mocha'); + + if (MUI.Dock && $(MUI.options.dock) && instance.options.type == 'window') { + var currentButton = $(instance.options.id + '_dockTab'); + if (currentButton != null) { + currentButton.hide(); + } + MUI.Desktop.setDesktopSize(); + } + + instance.fireEvent('onCloseComplete'); + + if (instance.options.type != 'notification'){ + var newFocus = this.getWindowWithHighestZindex(); + this.focusWindow(newFocus); + } + + instance.isClosing = false; + + }, + /* + + Function: closeAll + Close all open windows. + + */ + closeAll: function() { + $$('.mocha').each(function(windowEl){ + this.closeWindow(windowEl); + }.bind(this)); + }, + /* + + Function: collapseToggle + Collapses an expanded window. Expands a collapsed window. + + */ + collapseToggle: function(windowEl){ + var instance = windowEl.retrieve('instance'); + var handles = windowEl.getElements('.handle'); + if (instance.isMaximized == true) return; + if (instance.isCollapsed == false) { + instance.isCollapsed = true; + handles.hide(); + if ( instance.iframeEl ) { + instance.iframeEl.setStyle('visibility', 'hidden'); + } + instance.contentBorderEl.setStyles({ + visibility: 'hidden', + position: 'absolute', + top: -10000, + left: -10000 + }); + if(instance.toolbarWrapperEl){ + instance.toolbarWrapperEl.setStyles({ + visibility: 'hidden', + position: 'absolute', + top: -10000, + left: -10000 + }); + } + instance.drawWindowCollapsed(); + } + else { + instance.isCollapsed = false; + instance.drawWindow(); + instance.contentBorderEl.setStyles({ + visibility: 'visible', + position: null, + top: null, + left: null + }); + if(instance.toolbarWrapperEl){ + instance.toolbarWrapperEl.setStyles({ + visibility: 'visible', + position: null, + top: null, + left: null + }); + } + if ( instance.iframeEl ) { + instance.iframeEl.setStyle('visibility', 'visible'); + } + handles.show(); + } + }, + /* + + Function: toggleWindowVisibility + Toggle window visibility with Ctrl-Alt-Q. + + */ + toggleWindowVisibility: function(){ + MUI.Windows.instances.each(function(instance){ + if (instance.options.type == 'modal' || instance.options.type == 'modal2' || instance.isMinimized == true) return; + var id = $(instance.options.id); + if (id.getStyle('visibility') == 'visible'){ + if (instance.iframe){ + instance.iframeEl.setStyle('visibility', 'hidden'); + } + if (instance.toolbarEl){ + instance.toolbarWrapperEl.setStyle('visibility', 'hidden'); + } + instance.contentBorderEl.setStyle('visibility', 'hidden'); + id.setStyle('visibility', 'hidden'); + MUI.Windows.windowsVisible = false; + } + else { + id.setStyle('visibility', 'visible'); + instance.contentBorderEl.setStyle('visibility', 'visible'); + if (instance.iframe){ + instance.iframeEl.setStyle('visibility', 'visible'); + } + if (instance.toolbarEl){ + instance.toolbarWrapperEl.setStyle('visibility', 'visible'); + } + MUI.Windows.windowsVisible = true; + } + }.bind(this)); + + }, + focusWindow: function(windowEl, fireEvent){ + + // This is used with blurAll + MUI.Windows.focusingWindow = true; + var windowClicked = function(){ + MUI.Windows.focusingWindow = false; + }; + windowClicked.delay(170, this); + + // Only focus when needed + if ($$('.mocha').length == 0) return; + if (windowEl != $(windowEl) || windowEl.hasClass('isFocused')) return; + + var instances = MUI.Windows.instances; + var instance = instances.get(windowEl.id); + + if (instance.options.type == 'notification'){ + windowEl.setStyle('zIndex', 11001); + return; + }; + + MUI.Windows.indexLevel += 2; + windowEl.setStyle('zIndex', MUI.Windows.indexLevel); + + // Used when dragging and resizing windows + $('windowUnderlay').setStyle('zIndex', MUI.Windows.indexLevel - 1).inject($(windowEl),'after'); + + // Fire onBlur for the window that lost focus. + instances.each(function(instance){ + if (instance.windowEl.hasClass('isFocused')){ + instance.fireEvent('onBlur', instance.windowEl); + } + instance.windowEl.removeClass('isFocused'); + }); + + if (MUI.Dock && $(MUI.options.dock) && instance.options.type == 'window') { + MUI.Dock.makeActiveTab(); + } + windowEl.addClass('isFocused'); + + if (fireEvent != false){ + instance.fireEvent('onFocus', windowEl); + } + + }, + getWindowWithHighestZindex: function(){ + this.highestZindex = 0; + $$('.mocha').each(function(element){ + this.zIndex = element.getStyle('zIndex'); + if (this.zIndex >= this.highestZindex) { + this.highestZindex = this.zIndex; + } + }.bind(this)); + $$('.mocha').each(function(element){ + if (element.getStyle('zIndex') == this.highestZindex) { + this.windowWithHighestZindex = element; + } + }.bind(this)); + return this.windowWithHighestZindex; + }, + blurAll: function(){ + if (MUI.Windows.focusingWindow == false) { + $$('.mocha').each(function(windowEl){ + var instance = windowEl.retrieve('instance'); + if (instance.options.type != 'modal' && instance.options.type != 'modal2'){ + windowEl.removeClass('isFocused'); + } + }); + $$('.dockTab').removeClass('activeDockTab'); + } + }, + centerWindow: function(windowEl){ + + if(!windowEl){ + MUI.Windows.instances.each(function(instance){ + if (instance.windowEl.hasClass('isFocused')){ + windowEl = instance.windowEl; + } + }); + } + + var instance = windowEl.retrieve('instance'); + var options = instance.options; + var dimensions = options.container.getCoordinates(); + + var windowPosTop = window.getScroll().y + (window.getSize().y * .5) - (windowEl.offsetHeight * .5); + if (windowPosTop < -instance.options.shadowBlur){ + windowPosTop = -instance.options.shadowBlur; + } + var windowPosLeft = (dimensions.width * .5) - (windowEl.offsetWidth * .5); + if (windowPosLeft < -instance.options.shadowBlur){ + windowPosLeft = -instance.options.shadowBlur; + } + if (MUI.options.advancedEffects == true){ + instance.morph.start({ + 'top': windowPosTop, + 'left': windowPosLeft + }); + } + else { + windowEl.setStyles({ + 'top': windowPosTop, + 'left': windowPosLeft + }); + } + }, + resizeWindow: function(windowEl, options){ + var instance = windowEl.retrieve('instance'); + + $extend({ + width: null, + height: null, + top: null, + left: null, + centered: true + }, options); + + var oldWidth = windowEl.getStyle('width').toInt(); + var oldHeight = windowEl.getStyle('height').toInt(); + var oldTop = windowEl.getStyle('top').toInt(); + var oldLeft = windowEl.getStyle('left').toInt(); + + if (options.centered){ + var top = options.top || oldTop - ((options.height - oldHeight) * .5); + var left = options.left || oldLeft - ((options.width - oldWidth) * .5); + } + else { + var top = options.top || oldTop; + var left = options.left || oldLeft; + } + + if (MUI.options.advancedEffects == false){ + windowEl.setStyles({ + 'top': top, + 'left': left + }); + instance.contentWrapperEl.setStyles({ + 'height': options.height, + 'width': options.width + }); + instance.drawWindow(); + // Show iframe + if (instance.iframeEl){ + if (!MUI.ieLegacySupport) { + instance.iframeEl.setStyle('visibility', 'visible'); + } + else { + instance.iframeEl.show(); + } + } + } + else { + windowEl.retrieve('resizeMorph').start({ + '0': { 'height': options.height, + 'width': options.width + }, + '1': { 'top': top, + 'left': left + } + }); + } + return instance; + }, + /* + + Internal Function: dynamicResize + Use with a timer to resize a window as the window's content size changes, such as with an accordian. + + */ + dynamicResize: function(windowEl){ + var instance = windowEl.retrieve('instance'); + var contentWrapperEl = instance.contentWrapperEl; + var contentEl = instance.contentEl; + + contentWrapperEl.setStyles({ + 'height': contentEl.offsetHeight, + 'width': contentEl.offsetWidth + }); + instance.drawWindow(); + } +}); + +// Toggle window visibility with Ctrl-Alt-Q +document.addEvent('keydown', function(event){ + if (event.key == 'q' && event.control && event.alt) { + MUI.toggleWindowVisibility(); + } +}); +/* + +Script: Modal.js + Create modal dialog windows. + +Copyright: + Copyright (c) 2007-2009 Greg Houston, . + +License: + MIT-style license. + +Requires: + Core.js, Window.js + +See Also: + + +*/ + +MUI.files[MUI.path.source + 'Window/Modal.js'] = 'loaded'; + +MUI.Modal = new Class({ + + Extends: MUI.Window, + + options: { + type: 'modal' + }, + + initialize: function(options){ + + if (!$('modalOverlay')){ + this.modalInitialize(); + + window.addEvent('resize', function(){ + this.setModalSize(); + }.bind(this)); + } + this.parent(options); + + }, + modalInitialize: function(){ + var modalOverlay = new Element('div', { + 'id': 'modalOverlay', + 'styles': { + 'height': document.getCoordinates().height, + 'opacity': .6 + } + }).inject(document.body); + + modalOverlay.setStyles({ + 'position': Browser.Engine.trident4 ? 'absolute' : 'fixed' + }); + + modalOverlay.addEvent('click', function(e){ + var instance = MUI.Windows.instances.get(MUI.currentModal.id); + if (instance.options.modalOverlayClose == true) { + MUI.closeWindow(MUI.currentModal); + } + }); + + if (Browser.Engine.trident4){ + var modalFix = new Element('iframe', { + 'id': 'modalFix', + 'scrolling': 'no', + 'marginWidth': 0, + 'marginHeight': 0, + 'src': '', + 'styles': { + 'height': document.getCoordinates().height + } + }).inject(document.body); + } + + MUI.Modal.modalOverlayOpenMorph = new Fx.Morph($('modalOverlay'), { + 'duration': 150 + }); + MUI.Modal.modalOverlayCloseMorph = new Fx.Morph($('modalOverlay'), { + 'duration': 150, + onComplete: function(){ + $('modalOverlay').hide(); + if (Browser.Engine.trident4){ + $('modalFix').hide(); + } + }.bind(this) + }); + }, + setModalSize: function(){ + $('modalOverlay').setStyle('height', document.getCoordinates().height); + if (Browser.Engine.trident4){ + $('modalFix').setStyle('height', document.getCoordinates().height); + } + } + +}); +/* + +Script: Windows-from-html.js + Create windows from html markup in page. + +Copyright: + Copyright (c) 2007-2009 Greg Houston, . + +License: + MIT-style license. + +Requires: + Core.js, Window.js + +Example: + HTML markup. + (start code) +
    +

    My Window

    +

    My Window Content

    +
    + (end) + +See Also: + + +*/ + +MUI.files[MUI.path.source + 'Window/Windows-from-html.js'] = 'loaded'; + +MUI.extend({ + NewWindowsFromHTML: function(){ + $$('.mocha').each(function(el) { + // Get the window title and destroy that element, so it does not end up in window content + if ( Browser.Engine.presto || Browser.Engine.trident5 ){ + el.hide(); // Required by Opera, and probably IE7 + } + var title = el.getElement('h3.mochaTitle'); + + if(Browser.Engine.presto) el.show(); + + var elDimensions = el.getStyles('height', 'width'); + var properties = { + id: el.getProperty('id'), + height: elDimensions.height.toInt(), + width: elDimensions.width.toInt(), + x: el.getStyle('left').toInt(), + y: el.getStyle('top').toInt() + }; + // If there is a title element, set title and destroy the element so it does not end up in window content + if ( title ) { + properties.title = title.innerHTML; + title.destroy(); + } + + // Get content and destroy the element + properties.content = el.innerHTML; + el.destroy(); + + // Create window + new MUI.Window(properties, true); + }.bind(this)); + } +}); +/* + +Script: Windows-from-json.js + Create one or more windows from JSON data. You can define all the same properties as you can for new MUI.Window(). Undefined properties are set to their defaults. + +Copyright: + Copyright (c) 2007-2009 Greg Houston, . + +License: + MIT-style license. + +Syntax: + (start code) + MUI.newWindowsFromJSON(properties); + (end) + +Example: + (start code) + MUI.jsonWindows = function(){ + var url = 'data/json-windows-data.js'; + var request = new Request.JSON({ + url: url, + method: 'get', + onComplete: function(properties) { + MUI.newWindowsFromJSON(properties.windows); + } + }).send(); + } + (end) + +Note: + Windows created from JSON are not compatible with the current cookie based version + of Save and Load Workspace. + +See Also: + + +*/ + +MUI.files[MUI.path.source + 'Window/Windows-from-json.js'] = 'loaded'; + +MUI.extend({ + newWindowsFromJSON: function(newWindows){ + newWindows.each(function(options) { + var temp = new Hash(options); + temp.each( function(value, key, hash) { + if ($type(value) != 'string') return; + if (value.substring(0,8) == 'function'){ + eval("options." + key + " = " + value); + } + }); + new MUI.Window(options); + }); + } +}); +/* + +Script: Arrange-cascade.js + Cascade windows. + +Copyright: + Copyright (c) 2007-2009 Greg Houston, . + +License: + MIT-style license. + +Requires: + Core.js, Window.js + +Syntax: + (start code) + MUI.arrangeCascade(); + (end) + +*/ + +MUI.files[MUI.path.source + 'Window/Arrange-cascade.js'] = 'loaded'; + +MUI.extend({ + arrangeCascade: function(){ + + var viewportTopOffset = 30; // Use a negative number if neccessary to place first window where you want it + var viewportLeftOffset = 20; + var windowTopOffset = 50; // Initial vertical spacing of each window + var windowLeftOffset = 40; + + // See how much space we have to work with + var coordinates = document.getCoordinates(); + + var openWindows = 0; + MUI.Windows.instances.each(function(instance){ + if (!instance.isMinimized && instance.options.draggable) openWindows ++; + }); + + if ((windowTopOffset * (openWindows + 1)) >= (coordinates.height - viewportTopOffset)) { + var topOffset = (coordinates.height - viewportTopOffset) / (openWindows + 1); + } + else { + var topOffset = windowTopOffset; + } + + if ((windowLeftOffset * (openWindows + 1)) >= (coordinates.width - viewportLeftOffset - 20)) { + var leftOffset = (coordinates.width - viewportLeftOffset - 20) / (openWindows + 1); + } + else { + var leftOffset = windowLeftOffset; + } + + var x = viewportLeftOffset; + var y = viewportTopOffset; + $$('.mocha').each(function(windowEl){ + var instance = windowEl.retrieve('instance'); + if (!instance.isMinimized && !instance.isMaximized && instance.options.draggable){ + id = windowEl.id; + MUI.focusWindow(windowEl); + x += leftOffset; + y += topOffset; + + if (MUI.options.advancedEffects == false){ + windowEl.setStyles({ + 'top': y, + 'left': x + }); + } + else { + var cascadeMorph = new Fx.Morph(windowEl, { + 'duration': 550 + }); + cascadeMorph.start({ + 'top': y, + 'left': x + }); + } + } + }.bind(this)); + } +}); +/* + +Script: Arrange-tile.js + Cascade windows. + +Copyright: + Copyright (c) 2007-2009 Greg Houston, . + +Authors: + Harry Roberts and Greg Houston + +License: + MIT-style license. + +Requires: + Core.js, Window.js + +Syntax: + (start code) + MUI.arrangeTile(); + (end) + +*/ + +MUI.files[MUI.path.source + 'Window/Arrange-tile.js'] = 'loaded'; + +MUI.extend({ + arrangeTile: function(){ + + var viewportTopOffset = 30; // Use a negative number if neccessary to place first window where you want it + var viewportLeftOffset = 20; + + var x = 10; + var y = 80; + + var instances = MUI.Windows.instances; + + var windowsNum = 0; + + instances.each(function(instance){ + if (!instance.isMinimized && !instance.isMaximized){ + windowsNum++; + } + }); + + var cols = 3; + var rows = Math.ceil(windowsNum / cols); + + var coordinates = document.getCoordinates(); + + var col_width = ((coordinates.width - viewportLeftOffset) / cols); + var col_height = ((coordinates.height - viewportTopOffset) / rows); + + var row = 0; + var col = 0; + + instances.each(function(instance){ + if (!instance.isMinimized && !instance.isMaximized && instance.options.draggable ){ + + var content = instance.contentWrapperEl; + var content_coords = content.getCoordinates(); + var window_coords = instance.windowEl.getCoordinates(); + + // Calculate the amount of padding around the content window + var padding_top = content_coords.top - window_coords.top; + var padding_bottom = window_coords.height - content_coords.height - padding_top; + var padding_left = content_coords.left - window_coords.left; + var padding_right = window_coords.width - content_coords.width - padding_left; + + /* + + // This resizes the windows + if (instance.options.shape != 'gauge' && instance.options.resizable == true){ + var width = (col_width - 3 - padding_left - padding_right); + var height = (col_height - 3 - padding_top - padding_bottom); + + if (width > instance.options.resizeLimit.x[0] && width < instance.options.resizeLimit.x[1]){ + content.setStyle('width', width); + } + if (height > instance.options.resizeLimit.y[0] && height < instance.options.resizeLimit.y[1]){ + content.setStyle('height', height); + } + + }*/ + + var left = (x + (col * col_width)); + var top = (y + (row * col_height)); + + instance.drawWindow(); + + MUI.focusWindow(instance.windowEl); + + if (MUI.options.advancedEffects == false){ + instance.windowEl.setStyles({ + 'top': top, + 'left': left + }); + } + else { + var tileMorph = new Fx.Morph(instance.windowEl, { + 'duration': 550 + }); + tileMorph.start({ + 'top': top, + 'left': left + }); + } + + if (++col === cols) { + row++; + col = 0; + } + } + }.bind(this)); + } +}); +/* + +Script: Tabs.js + Functionality for window tabs. + +Copyright: + Copyright (c) 2007-2009 Greg Houston, . + +License: + MIT-style license. + +Requires: + Core.js, Window.js (for tabbed windows) or Layout.js (for tabbed panels) + +*/ + +MUI.files[MUI.path.source + 'Components/Tabs.js'] = 'loaded'; + +MUI.extend({ + /* + + Function: initializeTabs + Add click event to each list item that fires the selected function. + + */ + initializeTabs: function(el){ + $(el).setStyle('list-style', 'none'); // This is to fix a glitch that occurs in IE8 RC1 when dynamically switching themes + $(el).getElements('li').addEvent('click', function(e){ + MUI.selected(this, el); + }); + }, + /* + + Function: selected + Add "selected" class to current list item and remove it from sibling list items. + + Syntax: + (start code) + selected(el, parent); + (end) + + Arguments: + el - the list item + parent - the ul + + */ + selected: function(el, parent){ + $(parent).getChildren().each(function(listitem){ + listitem.removeClass('selected'); + }); + el.addClass('selected'); + } +}); + +/* + +Script: Layout.js + Create web application layouts. Enables window maximize. + +Copyright: + Copyright (c) 2007-2009 Greg Houston, . + +License: + MIT-style license. + +Requires: + Core.js + +*/ + +MUI.files[MUI.path.source + 'Layout/Layout.js'] = 'loaded'; + +MUI.extend({ + Columns: { + instances: new Hash(), + columnIDCount: 0 // Used for columns without an ID defined by the user + }, + Panels: { + instances: new Hash(), + panelIDCount: 0 // Used for panels without an ID defined by the user + } +}); + +MUI.Desktop = { + + options: { + // Naming options: + // If you change the IDs of the MochaUI Desktop containers in your HTML, you need to change them here as well. + desktop: 'desktop', + desktopHeader: 'desktopHeader', + desktopFooter: 'desktopFooter', + desktopNavBar: 'desktopNavbar', + pageWrapper: 'pageWrapper', + page: 'page', + desktopFooter: 'desktopFooterWrapper' + }, + initialize: function(){ + + this.desktop = $(this.options.desktop); + this.desktopHeader = $(this.options.desktopHeader); + this.desktopNavBar = $(this.options.desktopNavBar); + this.pageWrapper = $(this.options.pageWrapper); + this.page = $(this.options.page); + this.desktopFooter = $(this.options.desktopFooter); + + if (this.desktop) { + ($$('body')).setStyles({ + overflow: 'hidden', + height: '100%', + margin: 0 + }); + ($$('html')).setStyles({ + overflow: 'hidden', + height: '100%' + }); + } + + // This is run on dock initialize so no need to do it twice. + if (!MUI.Dock){ + this.setDesktopSize(); + } + this.menuInitialize(); + + // Resize desktop, page wrapper, modal overlay, and maximized windows when browser window is resized + window.addEvent('resize', function(e){ + this.onBrowserResize(); + }.bind(this)); + + if (MUI.myChain){ + MUI.myChain.callChain(); + } + + }, + menuInitialize: function(){ + // Fix for dropdown menus in IE6 + if (Browser.Engine.trident4 && this.desktopNavBar){ + this.desktopNavBar.getElements('li').each(function(element) { + element.addEvent('mouseenter', function(){ + this.addClass('ieHover'); + }); + element.addEvent('mouseleave', function(){ + this.removeClass('ieHover'); + }); + }); + }; + }, + onBrowserResize: function(){ + this.setDesktopSize(); + // Resize maximized windows to fit new browser window size + setTimeout( function(){ + MUI.Windows.instances.each(function(instance){ + if (instance.isMaximized){ + + // Hide iframe while resize for better performance + if ( instance.iframeEl ){ + instance.iframeEl.setStyle('visibility', 'hidden'); + } + + var coordinates = document.getCoordinates(); + var borderHeight = instance.contentBorderEl.getStyle('margin-top').toInt() + instance.contentBorderEl.getStyle('margin-bottom').toInt(); + var toolbarHeight = instance.toolbarWrapperEl ? instance.toolbarWrapperEl.getStyle('height').toInt() + instance.toolbarWrapperEl.getStyle('margin-top').toInt() : 0; + instance.contentWrapperEl.setStyles({ + 'height': coordinates.height - instance.options.headerHeight - instance.options.footerHeight - borderHeight - toolbarHeight, + 'width': coordinates.width + }); + + instance.drawWindow(); + if ( instance.iframeEl ){ + instance.iframeEl.setStyles({ + 'height': instance.contentWrapperEl.getStyle('height') + }); + instance.iframeEl.setStyle('visibility', 'visible'); + } + + } + }.bind(this)); + }.bind(this), 100); + }, + setDesktopSize: function(){ + var windowDimensions = window.getCoordinates(); + + // var dock = $(MUI.options.dock); + var dockWrapper = $(MUI.options.dockWrapper); + + // Setting the desktop height may only be needed by IE7 + if (this.desktop){ + this.desktop.setStyle('height', windowDimensions.height); + } + + // Set pageWrapper height so the dock doesn't cover the pageWrapper scrollbars. + if (this.pageWrapper) { + var dockOffset = MUI.dockVisible ? dockWrapper.offsetHeight : 0; + var pageWrapperHeight = windowDimensions.height; + pageWrapperHeight -= this.pageWrapper.getStyle('margin-top').toInt(); + pageWrapperHeight -= this.pageWrapper.getStyle('margin-bottom').toInt(); + if (this.desktopHeader){ pageWrapperHeight -= this.desktopHeader.offsetHeight; } + if (this.desktopFooter){ pageWrapperHeight -= this.desktopFooter.offsetHeight; } + pageWrapperHeight -= dockOffset; + + if (pageWrapperHeight < 0){ + pageWrapperHeight = 0; + } + this.pageWrapper.setStyle('height', pageWrapperHeight); + } + + if (MUI.Columns.instances.getKeys().length > 0){ // Conditional is a fix for a bug in IE6 in the no toolbars demo. + MUI.Desktop.resizePanels(); + } + }, + resizePanels: function(){ + MUI.panelHeight(); + MUI.rWidth(); + }, + /* + + Function: maximizeWindow + Maximize a window. + + Syntax: + (start code) + MUI.Desktop.maximizeWindow(windowEl); + (end) + + */ + maximizeWindow: function(windowEl){ + + var instance = MUI.Windows.instances.get(windowEl.id); + var options = instance.options; + var windowDrag = instance.windowDrag; + + // If window no longer exists or is maximized, stop + if (windowEl != $(windowEl) || instance.isMaximized ) return; + + if (instance.isCollapsed){ + MUI.collapseToggle(windowEl); + } + + instance.isMaximized = true; + + // If window is restricted to a container, it should not be draggable when maximized. + if (instance.options.restrict){ + windowDrag.detach(); + if (options.resizable) { + instance.detachResizable(); + } + instance.titleBarEl.setStyle('cursor', 'default'); + } + + // If the window has a container that is not the desktop + // temporarily move the window to the desktop while it is minimized. + if (options.container != this.desktop){ + this.desktop.grab(windowEl); + if (this.options.restrict){ + windowDrag.container = this.desktop; + } + } + + // Save original position + instance.oldTop = windowEl.getStyle('top'); + instance.oldLeft = windowEl.getStyle('left'); + + var contentWrapperEl = instance.contentWrapperEl; + + // Save original dimensions + contentWrapperEl.oldWidth = contentWrapperEl.getStyle('width'); + contentWrapperEl.oldHeight = contentWrapperEl.getStyle('height'); + + // Hide iframe + // Iframe should be hidden when minimizing, maximizing, and moving for performance and Flash issues + if ( instance.iframeEl ) { + if (!MUI.ieLegacySupport) { + instance.iframeEl.setStyle('visibility', 'hidden'); + } + else { + instance.iframeEl.hide(); + } + } + + var windowDimensions = document.getCoordinates(); + var options = instance.options; + var shadowBlur = options.shadowBlur; + var shadowOffset = options.shadowOffset; + var newHeight = windowDimensions.height - options.headerHeight - options.footerHeight; + newHeight -= instance.contentBorderEl.getStyle('margin-top').toInt(); + newHeight -= instance.contentBorderEl.getStyle('margin-bottom').toInt(); + newHeight -= (instance.toolbarWrapperEl ? instance.toolbarWrapperEl.getStyle('height').toInt() + instance.toolbarWrapperEl.getStyle('margin-top').toInt() : 0); + + MUI.resizeWindow(windowEl, { + width: windowDimensions.width, + height: newHeight, + top: shadowOffset.y - shadowBlur, + left: shadowOffset.x - shadowBlur + }); + instance.fireEvent('onMaximize', windowEl); + + if (instance.maximizeButtonEl) { + instance.maximizeButtonEl.setProperty('title', 'Restore'); + } + MUI.focusWindow(windowEl); + + }, + /* + + Function: restoreWindow + Restore a maximized window. + + Syntax: + (start code) + MUI.Desktop.restoreWindow(windowEl); + (end) + + */ + restoreWindow: function(windowEl){ + + var instance = windowEl.retrieve('instance'); + + // Window exists and is maximized ? + if (windowEl != $(windowEl) || !instance.isMaximized) return; + + var options = instance.options; + instance.isMaximized = false; + + if (options.restrict){ + instance.windowDrag.attach(); + if (options.resizable){ + instance.reattachResizable(); + } + instance.titleBarEl.setStyle('cursor', 'move'); + } + + // Hide iframe + // Iframe should be hidden when minimizing, maximizing, and moving for performance and Flash issues + if ( instance.iframeEl ) { + if (!MUI.ieLegacySupport) { + instance.iframeEl.setStyle('visibility', 'hidden'); + } + else { + instance.iframeEl.hide(); + } + } + + var contentWrapperEl = instance.contentWrapperEl; + + MUI.resizeWindow(windowEl,{ + width: contentWrapperEl.oldWidth, + height: contentWrapperEl.oldHeight, + top: instance.oldTop, + left: instance.oldLeft + }); + instance.fireEvent('onRestore', windowEl); + + if (instance.maximizeButtonEl){ + instance.maximizeButtonEl.setProperty('title', 'Maximize'); + } + } +}; + +/* + +Class: Column + Create a column. Columns should be created from left to right. + +Syntax: +(start code) + MUI.Column(); +(end) + +Arguments: + options + +Options: + id - The ID of the column. This must be set when creating the column. + container - Defaults to MUI.Desktop.pageWrapper. + placement - Can be 'right', 'main', or 'left'. There must be at least one column with the 'main' option. + width - 'main' column is fluid and should not be given a width. + resizeLimit - resizelimit of a 'right' or 'left' column. + sortable - (boolean) Whether the panels can be reordered via drag and drop. + onResize - (function) Fired when the column is resized. + onCollapse - (function) Fired when the column is collapsed. + onExpand - (function) Fired when the column is expanded. + +*/ +MUI.Column = new Class({ + + Implements: [Events, Options], + + options: { + id: null, + container: null, + placement: null, + width: null, + resizeLimit: [], + sortable: true, + + // Events + onResize: $empty, + onCollapse: $empty, + onExpand: $empty + + }, + + initialize: function(options){ + this.setOptions(options); + + $extend(this, { + timestamp: $time(), + isCollapsed: false, + oldWidth: 0 + }); + + // If column has no ID, give it one. + if (this.options.id == null){ + this.options.id = 'column' + (++MUI.Columns.columnIDCount); + } + + // Shorten object chain + var options = this.options; + var instances = MUI.Columns.instances; + var instanceID = instances.get(options.id); + + if (options.container == null) { + options.container = MUI.Desktop.pageWrapper + } + else { + $(options.container).setStyle('overflow', 'hidden'); + } + + if (typeof this.options.container == 'string'){ + this.options.container = $(this.options.container); + } + + // Check to see if there is already a class instance for this Column + if (instanceID){ + var instance = instanceID; + } + + // Check if column already exists + if ( this.columnEl ){ + return; + } + else { + instances.set(options.id, this); + } + + // If loading columns into a panel, hide the regular content container. + if ($(options.container).getElement('.pad') != null) { + $(options.container).getElement('.pad').hide(); + } + + // If loading columns into a window, hide the regular content container. + if ($(options.container).getElement('.mochaContent') != null) { + $(options.container).getElement('.mochaContent').hide(); + } + + this.columnEl = new Element('div', { + 'id': this.options.id, + 'class': 'column expanded', + 'styles': { + 'width': options.placement == 'main' ? null : options.width + } + }).inject($(options.container)); + + this.columnEl.store('instance', this); + + var parent = this.columnEl.getParent(); + var columnHeight = parent.getStyle('height').toInt(); + this.columnEl.setStyle('height', columnHeight); + + if (this.options.sortable){ + if (!this.options.container.retrieve('sortables')){ + var sortables = new Sortables(this.columnEl, { + opacity: 1, + handle: '.panel-header', + constrain: false, + revert: false, + onSort: function(){ + $$('.column').each(function(column){ + column.getChildren('.panelWrapper').each(function(panelWrapper){ + panelWrapper.getElement('.panel').removeClass('bottomPanel'); + }); + if (column.getChildren('.panelWrapper').getLast()){ + column.getChildren('.panelWrapper').getLast().getElement('.panel').addClass('bottomPanel'); + } + MUI.panelHeight(); + }.bind(this)); + }.bind(this) + }); + this.options.container.store('sortables', sortables); + } + else { + this.options.container.retrieve('sortables').addLists(this.columnEl); + } + } + + if (options.placement == 'main'){ + this.columnEl.addClass('rWidth'); + } + + switch (this.options.placement) { + case 'left': + this.handleEl = new Element('div', { + 'id': this.options.id + '_handle', + 'class': 'columnHandle' + }).inject(this.columnEl, 'after'); + + this.handleIconEl = new Element('div', { + 'id': options.id + '_handle_icon', + 'class': 'handleIcon' + }).inject(this.handleEl); + + addResizeRight(this.columnEl, options.resizeLimit[0], options.resizeLimit[1]); + break; + case 'right': + this.handleEl = new Element('div', { + 'id': this.options.id + '_handle', + 'class': 'columnHandle' + }).inject(this.columnEl, 'before'); + + this.handleIconEl = new Element('div', { + 'id': options.id + '_handle_icon', + 'class': 'handleIcon' + }).inject(this.handleEl); + addResizeLeft(this.columnEl, options.resizeLimit[0], options.resizeLimit[1]); + break; + } + + if (this.handleEl != null){ + this.handleEl.addEvent('dblclick', function(){ + this.columnToggle(); + }.bind(this)); + } + + MUI.rWidth(); + + }, + columnToggle: function(){ + var column = this.columnEl; + + // Collapse + if (this.isCollapsed == false){ + this.oldWidth = column.getStyle('width').toInt(); + + this.resize.detach(); + this.handleEl.removeEvents('dblclick'); + this.handleEl.addEvent('click', function(){ + this.columnToggle(); + }.bind(this)); + this.handleEl.setStyle('cursor', 'pointer').addClass('detached'); + + column.setStyle('width', 0); + this.isCollapsed = true; + column.addClass('collapsed'); + column.removeClass('expanded'); + MUI.rWidth(); + this.fireEvent('onCollapse'); + } + // Expand + else { + column.setStyle('width', this.oldWidth); + this.isCollapsed = false; + column.addClass('expanded'); + column.removeClass('collapsed'); + + this.handleEl.removeEvents('click'); + this.handleEl.addEvent('dblclick', function(){ + this.columnToggle(); + }.bind(this)); + this.resize.attach(); + this.handleEl.setStyle('cursor', (Browser.Engine.webkit || Browser.Engine.gecko) ? 'col-resize' : 'e-resize').addClass('attached'); + + MUI.rWidth(); + this.fireEvent('onExpand'); + } + } +}); +MUI.Column.implement(new Options, new Events); + +/* + +Class: Panel + Create a panel. Panels go one on top of another in columns. Create your columns first and then add your panels. Panels should be created from top to bottom, left to right. + +Syntax: +(start code) + MUI.Panel(); +(end) + +Arguments: + options + +Options: + id - The ID of the panel. This must be set when creating the panel. + column - Where to inject the panel. This must be set when creating the panel. + loadMethod - ('html', 'xhr', or 'iframe') Defaults to 'html' if there is no contentURL. Defaults to 'xhr' if there is a contentURL. You only really need to set this if using the 'iframe' method. May create a 'panel' loadMethod in the future. + contentURL - Used if loadMethod is set to 'xhr' or 'iframe'. + method - ('get', or 'post') The method used to get the data. Defaults to 'get'. + data - (hash) Data to send with the URL. Defaults to null. + evalScripts - (boolean) An xhr loadMethod option. Defaults to true. + evalResponse - (boolean) An xhr loadMethod option. Defaults to false. + content - (string or element) An html loadMethod option. + tabsURL - (url) + tabsData - (hash) Data to send with the URL. Defaults to null. + tabsOnload - (function) + header - (boolean) Display the panel header or not + headerToolbox: (boolean) + headerToolboxURL: (url) + headerToolboxOnload: (function) + height - (number) Height of content area. + addClass - (string) Add a class to the panel. + scrollbars - (boolean) + padding - (object) + collapsible - (boolean) + onBeforeBuild - (function) Fired before the panel is created. + onContentLoaded - (function) Fired after the panel's conten is loaded. + onResize - (function) Fired when the panel is resized. + onCollapse - (function) Fired when the panel is collapsed. + onExpand - (function) Fired when the panel is expanded. + +*/ +MUI.Panel = new Class({ + + Implements: [Events, Options], + + options: { + id: null, + title: 'New Panel', + column: null, + require: { + css: [], + images: [], + js: [], + onload: null + }, + loadMethod: null, + contentURL: null, + + // xhr options + method: 'get', + data: null, + evalScripts: true, + evalResponse: false, + + // html options + content: 'Panel content', + + // Tabs + tabsURL: null, + tabsData: null, + tabsOnload: $empty, + + header: true, + headerToolbox: false, + headerToolboxURL: 'pages/lipsum.html', + headerToolboxOnload: $empty, + + // Style options: + height: 125, + addClass: '', + scrollbars: true, + padding: { top: 8, right: 8, bottom: 8, left: 8 }, + + // Other: + collapsible: true, + + // Events + onBeforeBuild: $empty, + onContentLoaded: $empty, + onResize: $empty, + onCollapse: $empty, + onExpand: $empty + + }, + initialize: function(options){ + this.setOptions(options); + + $extend(this, { + timestamp: $time(), + isCollapsed: false, // This is probably redundant since we can check for the class + oldHeight: 0, + partner: null + }); + + // If panel has no ID, give it one. + if (this.options.id == null){ + this.options.id = 'panel' + (++MUI.Panels.panelIDCount); + } + + // Shorten object chain + var instances = MUI.Panels.instances; + var instanceID = instances.get(this.options.id); + var options = this.options; + + // Check to see if there is already a class instance for this panel + if (instanceID){ + var instance = instanceID; + } + + // Check if panel already exists + if ( this.panelEl ){ + return; + } + else { + instances.set(this.options.id, this); + } + + this.fireEvent('onBeforeBuild'); + + if (options.loadMethod == 'iframe') { + // Iframes have their own padding. + options.padding = { top: 0, right: 0, bottom: 0, left: 0 }; + } + + this.showHandle = true; + if ($(options.column).getChildren().length == 0) { + this.showHandle = false; + } + + this.panelWrapperEl = new Element('div', { + 'id': this.options.id + '_wrapper', + 'class': 'panelWrapper expanded' + }).inject($(options.column)); + + this.panelEl = new Element('div', { + 'id': this.options.id, + 'class': 'panel expanded', + 'styles': { + 'height': options.height + } + }).inject(this.panelWrapperEl); + + this.panelEl.store('instance', this); + + this.panelEl.addClass(options.addClass); + + this.contentEl = new Element('div', { + 'id': options.id + '_pad', + 'class': 'pad' + }).inject(this.panelEl); + + // This is in order to use the same variable as the windows do in updateContent. + // May rethink this. + this.contentWrapperEl = this.panelEl; + + this.contentEl.setStyles({ + 'padding-top': options.padding.top, + 'padding-bottom': options.padding.bottom, + 'padding-left': options.padding.left, + 'padding-right': options.padding.right + }); + + this.panelHeaderEl = new Element('div', { + 'id': this.options.id + '_header', + 'class': 'panel-header', + 'styles': { + 'display': options.header ? 'block' : 'none' + } + }).inject(this.panelEl, 'before'); + + var columnInstances = MUI.Columns.instances; + var columnInstance = columnInstances.get(this.options.column); + + if (columnInstance.options.sortable){ + this.panelHeaderEl.setStyle('cursor', 'move'); + columnInstance.options.container.retrieve('sortables').addItems(this.panelWrapperEl); + } + + if (this.options.collapsible) { + this.collapseToggleInit(); + } + + if (this.options.headerToolbox) { + this.panelHeaderToolboxEl = new Element('div', { + 'id': options.id + '_headerToolbox', + 'class': 'panel-header-toolbox' + }).inject(this.panelHeaderEl); + } + + this.panelHeaderContentEl = new Element('div', { + 'id': options.id + '_headerContent', + 'class': 'panel-headerContent' + }).inject(this.panelHeaderEl); + + this.titleEl = new Element('h2', { + 'id': options.id + '_title' + }).inject(this.panelHeaderContentEl); + + this.handleEl = new Element('div', { + 'id': options.id + '_handle', + 'class': 'horizontalHandle', + 'styles': { + 'display': this.showHandle == true ? 'block' : 'none' + } + }).inject(this.panelEl, 'after'); + + this.handleIconEl = new Element('div', { + 'id': options.id + '_handle_icon', + 'class': 'handleIcon' + }).inject(this.handleEl); + + addResizeBottom(options.id); + + if (options.require.css.length || options.require.images.length){ + new MUI.Require({ + css: options.require.css, + images: options.require.images, + onload: function(){ + this.newPanel(); + }.bind(this) + }); + } + else { + this.newPanel(); + } + }, + newPanel: function(){ + + options = this.options; + + if (this.options.headerToolbox) { + MUI.updateContent({ + 'element': this.panelEl, + 'childElement': this.panelHeaderToolboxEl, + 'loadMethod': 'xhr', + 'url': options.headerToolboxURL, + 'onContentLoaded': options.headerToolboxOnload + }); + } + + if (options.tabsURL == null) { + this.titleEl.set('html', options.title); + } else { + this.panelHeaderContentEl.addClass('tabs'); + MUI.updateContent({ + 'element': this.panelEl, + 'childElement': this.panelHeaderContentEl, + 'loadMethod': 'xhr', + 'url': options.tabsURL, + 'data': options.tabsData, + 'onContentLoaded': options.tabsOnload + }); + } + + // Add content to panel. + MUI.updateContent({ + 'element': this.panelEl, + 'content': options.content, + 'method': options.method, + 'data': options.data, + 'url': options.contentURL, + 'onContentLoaded': null, + 'require': { + js: options.require.js, + onload: options.require.onload + } + }); + + // Do this when creating and removing panels + $(options.column).getChildren('.panelWrapper').each(function(panelWrapper){ + panelWrapper.getElement('.panel').removeClass('bottomPanel'); + }); + $(options.column).getChildren('.panelWrapper').getLast().getElement('.panel').addClass('bottomPanel'); + + MUI.panelHeight(options.column, this.panelEl, 'new'); + + }, + collapseToggleInit: function(options){ + + var options = this.options; + + this.panelHeaderCollapseBoxEl = new Element('div', { + 'id': options.id + '_headerCollapseBox', + 'class': 'toolbox' + }).inject(this.panelHeaderEl); + + if (options.headerToolbox) { + this.panelHeaderCollapseBoxEl.addClass('divider'); + } + + this.collapseToggleEl = new Element('div', { + 'id': options.id + '_collapseToggle', + 'class': 'panel-collapse icon16', + 'styles': { + 'width': 16, + 'height': 16 + }, + 'title': 'Collapse Panel' + }).inject(this.panelHeaderCollapseBoxEl); + + this.collapseToggleEl.addEvent('click', function(event){ + var panel = this.panelEl; + var panelWrapper = this.panelWrapperEl + + // Get siblings and make sure they are not all collapsed. + // If they are all collapsed and the current panel is collapsing + // Then collapse the column. + var instances = MUI.Panels.instances; + var expandedSiblings = []; + + panelWrapper.getAllPrevious('.panelWrapper').each(function(sibling){ + var instance = instances.get(sibling.getElement('.panel').id); + if (instance.isCollapsed == false){ + expandedSiblings.push(sibling.getElement('.panel').id); + } + }); + + panelWrapper.getAllNext('.panelWrapper').each(function(sibling){ + var instance = instances.get(sibling.getElement('.panel').id); + if (instance.isCollapsed == false){ + expandedSiblings.push(sibling.getElement('.panel').id); + } + }); + + // Collapse Panel + if (this.isCollapsed == false) { + var currentColumn = MUI.Columns.instances.get($(options.column).id); + + if (expandedSiblings.length == 0 && currentColumn.options.placement != 'main'){ + var currentColumn = MUI.Columns.instances.get($(options.column).id); + currentColumn.columnToggle(); + return; + } + else if (expandedSiblings.length == 0 && currentColumn.options.placement == 'main'){ + return; + } + this.oldHeight = panel.getStyle('height').toInt(); + if (this.oldHeight < 10) this.oldHeight = 20; + this.contentEl.setStyle('position', 'absolute'); // This is so IE6 and IE7 will collapse the panel all the way + panel.setStyle('height', 0); + this.isCollapsed = true; + panelWrapper.addClass('collapsed'); + panelWrapper.removeClass('expanded'); + MUI.panelHeight(options.column, panel, 'collapsing'); + MUI.panelHeight(); // Run this a second time for panels within panels + this.collapseToggleEl.removeClass('panel-collapsed'); + this.collapseToggleEl.addClass('panel-expand'); + this.collapseToggleEl.setProperty('title','Expand Panel'); + this.fireEvent('onCollapse'); + } + + // Expand Panel + else { + this.contentEl.setStyle('position', null); // This is so IE6 and IE7 will collapse the panel all the way + panel.setStyle('height', this.oldHeight); + this.isCollapsed = false; + panelWrapper.addClass('expanded'); + panelWrapper.removeClass('collapsed'); + MUI.panelHeight(this.options.column, panel, 'expanding'); + MUI.panelHeight(); // Run this a second time for panels within panels + this.collapseToggleEl.removeClass('panel-expand'); + this.collapseToggleEl.addClass('panel-collapsed'); + this.collapseToggleEl.setProperty('title','Collapse Panel'); + this.fireEvent('onExpand'); + } + }.bind(this)); + } +}); +MUI.Panel.implement(new Options, new Events); + +/* + arguments: + column - The column to resize the panels in + changing - The panel that is collapsing, expanding, or new + action - collapsing, expanding, or new + +*/ + +MUI.extend({ + // Panel Height + panelHeight: function(column, changing, action){ + if (column != null) { + MUI.panelHeight2($(column), changing, action); + } + else { + $$('.column').each(function(column){ + MUI.panelHeight2(column); + }.bind(this)); + } + }, + /* + + actions can be new, collapsing or expanding. + + */ + panelHeight2: function(column, changing, action){ + + var instances = MUI.Panels.instances; + + var parent = column.getParent(); + var columnHeight = parent.getStyle('height').toInt(); + if (Browser.Engine.trident4 && parent == MUI.Desktop.pageWrapper) { + columnHeight -= 1; + } + column.setStyle('height', columnHeight); + + // Get column panels + var panels = []; + column.getChildren('.panelWrapper').each( function(panelWrapper){ + panels.push(panelWrapper.getElement('.panel')); + }.bind(this)); + + // Get expanded column panels + var panelsExpanded = []; + column.getChildren('.expanded').each( function(panelWrapper){ + panelsExpanded.push(panelWrapper.getElement('.panel')); + }.bind(this)); + + // All the panels in the column whose height will be effected. + var panelsToResize = []; + + // The panel with the greatest height. Remainders will be added to this panel + var tallestPanel; + var tallestPanelHeight = 0; + + this.panelsTotalHeight = 0; // Height of all the panels in the column + this.height = 0; // Height of all the elements in the column + + // Set panel resize partners + panels.each(function(panel){ + instance = instances.get(panel.id); + if (panel.getParent().hasClass('expanded') && panel.getParent().getNext('.expanded')) { + instance.partner = panel.getParent().getNext('.expanded').getElement('.panel'); + instance.resize.attach(); + instance.handleEl.setStyles({ + 'display': 'block', + 'cursor': (Browser.Engine.webkit || Browser.Engine.gecko) ? 'row-resize' : 'n-resize' + }).removeClass('detached'); + } else { + instance.resize.detach(); + instance.handleEl.setStyles({ + 'display': 'none', + 'cursor': null + }).addClass('detached'); + } + if (panel.getParent().getNext('.panelWrapper') == null) { + instance.handleEl.hide(); + } + }.bind(this)); + + // Add panels to panelsToResize + // Get the total height of all the resizable panels + // Get the total height of all the column's children + column.getChildren().each(function(panelWrapper){ + + panelWrapper.getChildren().each(function(el){ + + if (el.hasClass('panel')){ + var instance = instances.get(el.id); + + // Are any next siblings Expanded? + anyNextSiblingsExpanded = function(el){ + var test; + el.getParent().getAllNext('.panelWrapper').each(function(sibling){ + var siblingInstance = instances.get(sibling.getElement('.panel').id); + if (siblingInstance.isCollapsed == false){ + test = true; + } + }.bind(this)); + return test; + }.bind(this); + + // If a next sibling is expanding, are any of the nexts siblings of the expanding sibling Expanded? + anyExpandingNextSiblingsExpanded = function(el){ + var test; + changing.getParent().getAllNext('.panelWrapper').each(function(sibling){ + var siblingInstance = instances.get(sibling.getElement('.panel').id); + if (siblingInstance.isCollapsed == false){ + test = true; + } + }.bind(this)); + return test; + }.bind(this); + + // Is the panel that is collapsing, expanding, or new located after this panel? + anyNextContainsChanging = function(el){ + var allNext = []; + el.getParent().getAllNext('.panelWrapper').each(function(panelWrapper){ + allNext.push(panelWrapper.getElement('.panel')); + }.bind(this)); + var test = allNext.contains(changing); + return test; + }.bind(this); + + nextExpandedChanging = function(el){ + var test; + if (el.getParent().getNext('.expanded')){ + if (el.getParent().getNext('.expanded').getElement('.panel') == changing) test = true; + } + return test; + } + + // NEW PANEL + // Resize panels that are "new" or not collapsed + if (action == 'new') { + if (!instance.isCollapsed && el != changing) { + panelsToResize.push(el); + this.panelsTotalHeight += el.offsetHeight.toInt(); + } + } + + // COLLAPSING PANELS and CURRENTLY EXPANDED PANELS + // Resize panels that are not collapsed. + // If a panel is collapsing resize any expanded panels below. + // If there are no expanded panels below it, resize the expanded panels above it. + else if (action == null || action == 'collapsing' ){ + if (!instance.isCollapsed && (!anyNextContainsChanging(el) || !anyNextSiblingsExpanded(el))){ + panelsToResize.push(el); + this.panelsTotalHeight += el.offsetHeight.toInt(); + } + } + + // EXPANDING PANEL + // Resize panels that are not collapsed and are not expanding. + // Resize any expanded panels below the expanding panel. + // If there are no expanded panels below the expanding panel, resize the first expanded panel above it. + else if (action == 'expanding' && !instance.isCollapsed && el != changing){ + if (!anyNextContainsChanging(el) || (!anyExpandingNextSiblingsExpanded(el) && nextExpandedChanging(el))){ + panelsToResize.push(el); + this.panelsTotalHeight += el.offsetHeight.toInt(); + } + } + + if (el.style.height){ + this.height += el.getStyle('height').toInt(); + } + } + else { + this.height += el.offsetHeight.toInt(); + } + }.bind(this)); + + }.bind(this)); + + // Get the remaining height + var remainingHeight = column.offsetHeight.toInt() - this.height; + + this.height = 0; + + // Get height of all the column's children + column.getChildren().each(function(el){ + this.height += el.offsetHeight.toInt(); + }.bind(this)); + + var remainingHeight = column.offsetHeight.toInt() - this.height; + + panelsToResize.each(function(panel){ + var ratio = this.panelsTotalHeight / panel.offsetHeight.toInt(); + var panelHeight = panel.getStyle('height').toInt(); + var newPanelHeight = remainingHeight / ratio; + if (!isNaN(panelHeight)) + newPanelHeight += panelHeight; + if (newPanelHeight < 1){ + newPanelHeight = 0; + } + panel.setStyle('height', newPanelHeight); + }.bind(this)); + + // Make sure the remaining height is 0. If not add/subtract the + // remaining height to the tallest panel. This makes up for browser resizing, + // off ratios, and users trying to give panels too much height. + + // Get height of all the column's children + this.height = 0; + column.getChildren().each(function(panelWrapper){ + panelWrapper.getChildren().each(function(el){ + this.height += el.offsetHeight.toInt(); + if (el.hasClass('panel') && el.getStyle('height').toInt() > tallestPanelHeight){ + tallestPanel = el; + tallestPanelHeight = el.getStyle('height').toInt(); + } + }.bind(this)); + }.bind(this)); + + var remainingHeight = column.offsetHeight.toInt() - this.height; + + if (remainingHeight != 0 && tallestPanelHeight > 0){ + tallestPanel.setStyle('height', tallestPanel.getStyle('height').toInt() + remainingHeight ); + if (tallestPanel.getStyle('height') < 1){ + tallestPanel.setStyle('height', 0 ); + } + } + + parent.getChildren('.columnHandle').each(function(handle){ + var parent = handle.getParent(); + if (parent.getStyle('height').toInt() < 1) return; // Keeps IE7 and 8 from throwing an error when collapsing a panel within a panel + var handleHeight = parent.getStyle('height').toInt() - handle.getStyle('margin-top').toInt() - handle.getStyle('margin-bottom').toInt(); + if (Browser.Engine.trident4 && parent == MUI.Desktop.pageWrapper){ + handleHeight -= 1; + } + handle.setStyle('height', handleHeight); + }); + + panelsExpanded.each(function(panel){ + MUI.resizeChildren(panel); + }.bind(this)); + + }, + // May rename this resizeIframeEl() + resizeChildren: function(panel){ + var instances = MUI.Panels.instances; + var instance = instances.get(panel.id); + var contentWrapperEl = instance.contentWrapperEl; + + if (instance.iframeEl) { + if (!MUI.ieLegacySupport) { + instance.iframeEl.setStyles({ + 'height': contentWrapperEl.getStyle('height'), + 'width': contentWrapperEl.offsetWidth - contentWrapperEl.getStyle('margin-left').toInt() - contentWrapperEl.getStyle('margin-right').toInt() + }); + } + else { + // The following hack is to get IE8 RC1 IE8 Standards Mode to properly resize an iframe + // when only the vertical dimension is changed. + instance.iframeEl.setStyles({ + 'height': contentWrapperEl.getStyle('height'), + 'width': contentWrapperEl.offsetWidth - contentWrapperEl.getStyle('margin-left').toInt() - contentWrapperEl.getStyle('margin-right').toInt() - 1 + }); + instance.iframeEl.setStyles({ + 'width': contentWrapperEl.offsetWidth - contentWrapperEl.getStyle('margin-left').toInt() - contentWrapperEl.getStyle('margin-right').toInt() + }); + } + } + + }, + // Remaining Width + rWidth: function(container){ + if (container == null) { + var container = MUI.Desktop.desktop; + } + container.getElements('.rWidth').each(function(column){ + var currentWidth = column.offsetWidth.toInt(); + currentWidth -= column.getStyle('margin-left').toInt(); + currentWidth -= column.getStyle('margin-right').toInt(); + var parent = column.getParent(); + this.width = 0; + + // Get the total width of all the parent element's children + parent.getChildren().each(function(el){ + if (el.hasClass('mocha') != true) { + this.width += el.offsetWidth.toInt(); + } + }.bind(this)); + + // Add the remaining width to the current element + var remainingWidth = parent.offsetWidth.toInt() - this.width; + var newWidth = currentWidth + remainingWidth; + if (newWidth < 1) newWidth = 0; + column.setStyle('width', newWidth); + column.getChildren('.panel').each(function(panel){ + panel.setStyle('width', newWidth - panel.getStyle('margin-left').toInt() - panel.getStyle('margin-right').toInt()); + MUI.resizeChildren(panel); + }.bind(this)); + + }); + } + +}); + +function addResizeRight(element, min, max){ + if (!$(element)) return; + element = $(element); + + var instances = MUI.Columns.instances; + var instance = instances.get(element.id); + + var handle = element.getNext('.columnHandle'); + handle.setStyle('cursor', (Browser.Engine.webkit || Browser.Engine.gecko) ? 'col-resize' : 'e-resize'); + if (!min) min = 50; + if (!max) max = 250; + if (MUI.ieLegacySupport) { + handle.addEvents({ + 'mousedown': function(){ + handle.setCapture(); + }, + 'mouseup': function(){ + handle.releaseCapture(); + } + }); + } + instance.resize = element.makeResizable({ + handle: handle, + modifiers: { + x: 'width', + y: false + }, + limit: { + x: [min, max] + }, + onStart: function(){ + element.getElements('iframe').setStyle('visibility', 'hidden'); + element.getNext('.column').getElements('iframe').setStyle('visibility', 'hidden'); + }.bind(this), + onDrag: function(){ + MUI.rWidth(element.getParent()); + if (Browser.Engine.trident4) { + element.getChildren().each(function(el){ + var width = $(element).getStyle('width').toInt(); + width -= el.getStyle('margin-right').toInt(); + width -= el.getStyle('margin-left').toInt(); + width -= el.getStyle('padding-right').toInt(); + width -= el.getStyle('padding-left').toInt(); + el.setStyle('width', width); + }.bind(this)); + } + }.bind(this), + onComplete: function(){ + MUI.rWidth(element.getParent()); + element.getElements('iframe').setStyle('visibility', 'visible'); + element.getNext('.column').getElements('iframe').setStyle('visibility', 'visible'); + instance.fireEvent('onResize'); + }.bind(this) + }); +} + +function addResizeLeft(element, min, max){ + if (!$(element)) return; + element = $(element); + + var instances = MUI.Columns.instances; + var instance = instances.get(element.id); + + var handle = element.getPrevious('.columnHandle'); + handle.setStyle('cursor', (Browser.Engine.webkit || Browser.Engine.gecko) ? 'col-resize' : 'e-resize'); + var partner = element.getPrevious('.column'); + if (!min) min = 50; + if (!max) max = 250; + if (MUI.ieLegacySupport){ + handle.addEvents({ + 'mousedown': function(){ + handle.setCapture(); + }, + 'mouseup': function(){ + handle.releaseCapture(); + } + }); + } + instance.resize = element.makeResizable({ + handle: handle, + modifiers: {x: 'width' , y: false}, + invert: true, + limit: { x: [min, max] }, + onStart: function(){ + $(element).getElements('iframe').setStyle('visibility','hidden'); + partner.getElements('iframe').setStyle('visibility','hidden'); + }.bind(this), + onDrag: function(){ + MUI.rWidth(element.getParent()); + }.bind(this), + onComplete: function(){ + MUI.rWidth(element.getParent()); + $(element).getElements('iframe').setStyle('visibility','visible'); + partner.getElements('iframe').setStyle('visibility','visible'); + instance.fireEvent('onResize'); + }.bind(this) + }); +} + +function addResizeBottom(element){ + if (!$(element)) return; + var element = $(element); + + var instances = MUI.Panels.instances; + var instance = instances.get(element.id); + var handle = instance.handleEl; + handle.setStyle('cursor', (Browser.Engine.webkit || Browser.Engine.gecko) ? 'row-resize' : 'n-resize'); + partner = instance.partner; + min = 0; + max = function(){ + return element.getStyle('height').toInt() + partner.getStyle('height').toInt(); + }.bind(this); + + if (MUI.ieLegacySupport) { + handle.addEvents({ + 'mousedown': function(){ + handle.setCapture(); + }, + 'mouseup': function(){ + handle.releaseCapture(); + } + }); + } + instance.resize = element.makeResizable({ + handle: handle, + modifiers: {x: false, y: 'height'}, + limit: { y: [min, max] }, + invert: false, + onBeforeStart: function(){ + partner = instance.partner; + this.originalHeight = element.getStyle('height').toInt(); + this.partnerOriginalHeight = partner.getStyle('height').toInt(); + }.bind(this), + onStart: function(){ + if (instance.iframeEl) { + if (!MUI.ieLegacySupport) { + instance.iframeEl.setStyle('visibility', 'hidden'); + partner.getElements('iframe').setStyle('visibility','hidden'); + } + else { + instance.iframeEl.hide(); + partner.getElements('iframe').hide(); + } + } + + }.bind(this), + onDrag: function(){ + partnerHeight = partnerOriginalHeight; + partnerHeight += (this.originalHeight - element.getStyle('height').toInt()); + partner.setStyle('height', partnerHeight); + MUI.resizeChildren(element, element.getStyle('height').toInt()); + MUI.resizeChildren(partner, partnerHeight); + element.getChildren('.column').each( function(column){ + MUI.panelHeight(column); + }); + partner.getChildren('.column').each( function(column){ + MUI.panelHeight(column); + }); + }.bind(this), + onComplete: function(){ + partnerHeight = partnerOriginalHeight; + partnerHeight += (this.originalHeight - element.getStyle('height').toInt()); + partner.setStyle('height', partnerHeight); + MUI.resizeChildren(element, element.getStyle('height').toInt()); + MUI.resizeChildren(partner, partnerHeight); + element.getChildren('.column').each( function(column){ + MUI.panelHeight(column); + }); + partner.getChildren('.column').each( function(column){ + MUI.panelHeight(column); + }); + if (instance.iframeEl) { + if (!MUI.ieLegacySupport) { + instance.iframeEl.setStyle('visibility', 'visible'); + partner.getElements('iframe').setStyle('visibility','visible'); + } + else { + instance.iframeEl.show(); + partner.getElements('iframe').show(); + // The following hack is to get IE8 Standards Mode to properly resize an iframe + // when only the vertical dimension is changed. + var width = instance.iframeEl.getStyle('width').toInt(); + instance.iframeEl.setStyle('width', width - 1); + MUI.rWidth(); + instance.iframeEl.setStyle('width', width); + } + } + instance.fireEvent('onResize'); + }.bind(this) + }); +} + +MUI.extend({ + /* + + Function: closeColumn + Destroys/removes a column. + + Syntax: + (start code) + MUI.closeColumn(); + (end) + + Arguments: + columnEl - the ID of the column to be closed + + Returns: + true - the column was closed + false - the column was not closed + + */ + closeColumn: function(columnEl){ + var instances = MUI.Columns.instances; + var instance = instances.get(columnEl.id); + if (columnEl != $(columnEl) || instance.isClosing) return; + + instance.isClosing = true; + + if (instance.options.sortable){ + instance.container.retrieve('sortables').removeLists(this.columnEl); + } + + // Destroy all the panels in the column. + var panels = columnEl.getChildren('.panel'); + panels.each(function(panel){ + MUI.closePanel($(panel.id)); + }.bind(this)); + + if (MUI.ieLegacySupport) { + columnEl.dispose(); + if (instance.handleEl != null) { + instance.handleEl.dispose(); + } + } + else { + columnEl.destroy(); + if (instance.handleEl != null) { + instance.handleEl.destroy(); + } + } + if (MUI.Desktop) { + MUI.Desktop.resizePanels(); + } + instances.erase(instance.options.id); + return true; + }, + /* + + Function: closePanel + Destroys/removes a panel. + + Syntax: + (start code) + MUI.closePanel(); + (end) + + Arguments: + panelEl - the ID of the panel to be closed + + Returns: + true - the panel was closed + false - the panel was not closed + + */ + closePanel: function(panelEl){ + var instances = MUI.Panels.instances; + var instance = instances.get(panelEl.id); + if (panelEl != $(panelEl) || instance.isClosing) return; + + var column = instance.options.column; + + instance.isClosing = true; + + var columnInstances = MUI.Columns.instances; + var columnInstance = columnInstances.get(column); + + if (columnInstance.options.sortable){ + columnInstance.options.container.retrieve('sortables').removeItems(instance.panelWrapperEl); + } + + instance.panelWrapperEl.destroy(); + + if (MUI.Desktop) { + MUI.Desktop.resizePanels(); + } + + // Do this when creating and removing panels + $(column).getChildren('.panelWrapper').each(function(panelWrapper){ + panelWrapper.getElement('.panel').removeClass('bottomPanel'); + }); + $(column).getChildren('.panelWrapper').getLast().getElement('.panel').addClass('bottomPanel'); + + instances.erase(instance.options.id); + return true; + + } +}); +/* + +Script: Dock.js + Implements the dock/taskbar. Enables window minimize. + +Copyright: + Copyright (c) 2007-2009 Greg Houston, . + +License: + MIT-style license. + +Requires: + Core.js, Window.js, Layout.js + +Todo: + - Make it so the dock requires no initial html markup. + +*/ + +MUI.files[MUI.path.source + 'Layout/Dock.js'] = 'loaded'; + +MUI.options.extend({ + // Naming options: + // If you change the IDs of the Mocha Desktop containers in your HTML, you need to change them here as well. + dockWrapper: 'dockWrapper', + dock: 'dock' +}); + +MUI.extend({ + /* + + Function: minimizeAll + Minimize all windows that are minimizable. + + */ + minimizeAll: function() { + $$('.mocha').each(function(windowEl){ + var instance = windowEl.retrieve('instance'); + if (!instance.isMinimized && instance.options.minimizable == true){ + MUI.Dock.minimizeWindow(windowEl); + } + }.bind(this)); + } +}); + +MUI.Dock = { + + options: { + useControls: true, // Toggles autohide and dock placement controls. + dockPosition: 'bottom', // Position the dock starts in, top or bottom. + // Style options + trueButtonColor: [70, 245, 70], // Color for autohide on + enabledButtonColor: [115, 153, 191], + disabledButtonColor: [170, 170, 170] + }, + + initialize: function(options){ + // Stops if MUI.Desktop is not implemented + if (!MUI.Desktop) return; + + MUI.dockVisible = true; + this.dockWrapper = $(MUI.options.dockWrapper); + this.dock = $(MUI.options.dock); + this.autoHideEvent = null; + this.dockAutoHide = false; // True when dock autohide is set to on, false if set to off + + if (!this.dockWrapper) return; + + if (!this.options.useControls){ + if($('dockPlacement')){ + $('dockPlacement').setStyle('cursor', 'default'); + } + if($('dockAutoHide')){ + $('dockAutoHide').setStyle('cursor', 'default'); + } + } + + this.dockWrapper.setStyles({ + 'display': 'block', + 'position': 'absolute', + 'top': null, + 'bottom': MUI.Desktop.desktopFooter ? MUI.Desktop.desktopFooter.offsetHeight : 0, + 'left': 0 + }); + + if (this.options.useControls){ + this.initializeDockControls(); + } + + // Add check mark to menu if link exists in menu + if ($('dockLinkCheck')){ + this.sidebarCheck = new Element('div', { + 'class': 'check', + 'id': 'dock_check' + }).inject($('dockLinkCheck')); + } + + this.dockSortables = new Sortables('#dockSort', { + opacity: 1, + constrain: true, + clone: false, + revert: false + }); + + MUI.Desktop.setDesktopSize(); + + if (MUI.myChain){ + MUI.myChain.callChain(); + } + + }, + + initializeDockControls: function(){ + + // Convert CSS colors to Canvas colors. + this.setDockColors(); + + if (this.options.useControls){ + // Insert canvas + var canvas = new Element('canvas', { + 'id': 'dockCanvas', + 'width': '15', + 'height': '18' + }).inject(this.dock); + + // Dynamically initialize canvas using excanvas. This is only required by IE + if (MUI.ieLegacySupport && MUI.ieSupport == 'excanvas'){ + G_vmlCanvasManager.initElement(canvas); + } + } + + var dockPlacement = $('dockPlacement'); + var dockAutoHide = $('dockAutoHide'); + + // Position top or bottom selector + dockPlacement.setProperty('title','Position Dock Top'); + + // Attach event + dockPlacement.addEvent('click', function(){ + this.moveDock(); + }.bind(this)); + + // Auto Hide toggle switch + dockAutoHide.setProperty('title','Turn Auto Hide On'); + + // Attach event Auto Hide + dockAutoHide.addEvent('click', function(event){ + if ( this.dockWrapper.getProperty('dockPosition') == 'top' ) + return false; + + var ctx = $('dockCanvas').getContext('2d'); + this.dockAutoHide = !this.dockAutoHide; // Toggle + if (this.dockAutoHide){ + $('dockAutoHide').setProperty('title', 'Turn Auto Hide Off'); + //ctx.clearRect(0, 11, 100, 100); + MUI.circle(ctx, 5 , 14, 3, this.options.trueButtonColor, 1.0); + + // Define event + this.autoHideEvent = function(event) { + if (!this.dockAutoHide) + return; + if (!MUI.Desktop.desktopFooter) { + var dockHotspotHeight = this.dockWrapper.offsetHeight; + if (dockHotspotHeight < 25) dockHotspotHeight = 25; + } + else if (MUI.Desktop.desktopFooter) { + var dockHotspotHeight = this.dockWrapper.offsetHeight + MUI.Desktop.desktopFooter.offsetHeight; + if (dockHotspotHeight < 25) dockHotspotHeight = 25; + } + if (!MUI.Desktop.desktopFooter && event.client.y > (document.getCoordinates().height - dockHotspotHeight)){ + if (!MUI.dockVisible){ + this.dockWrapper.show(); + MUI.dockVisible = true; + MUI.Desktop.setDesktopSize(); + } + } + else if (MUI.Desktop.desktopFooter && event.client.y > (document.getCoordinates().height - dockHotspotHeight)){ + if (!MUI.dockVisible){ + this.dockWrapper.show(); + MUI.dockVisible = true; + MUI.Desktop.setDesktopSize(); + } + } + else if (MUI.dockVisible){ + this.dockWrapper.hide(); + MUI.dockVisible = false; + MUI.Desktop.setDesktopSize(); + + } + }.bind(this); + + // Add event + document.addEvent('mousemove', this.autoHideEvent); + + } else { + $('dockAutoHide').setProperty('title', 'Turn Auto Hide On'); + //ctx.clearRect(0, 11, 100, 100); + MUI.circle(ctx, 5 , 14, 3, this.options.enabledButtonColor, 1.0); + // Remove event + document.removeEvent('mousemove', this.autoHideEvent); + } + + }.bind(this)); + + this.renderDockControls(); + + if (this.options.dockPosition == 'top'){ + this.moveDock(); + } + + }, + + setDockColors: function(){ + var dockButtonEnabled = MUI.getCSSRule('.dockButtonEnabled'); + if (dockButtonEnabled && dockButtonEnabled.style.backgroundColor){ + this.options.enabledButtonColor = new Color(dockButtonEnabled.style.backgroundColor); + } + + var dockButtonDisabled = MUI.getCSSRule('.dockButtonDisabled'); + if (dockButtonDisabled && dockButtonDisabled.style.backgroundColor){ + this.options.disabledButtonColor = new Color(dockButtonDisabled.style.backgroundColor); + } + + var trueButtonColor = MUI.getCSSRule('.dockButtonTrue'); + if (trueButtonColor && trueButtonColor.style.backgroundColor){ + this.options.trueButtonColor = new Color(trueButtonColor.style.backgroundColor); + } + }, + + renderDockControls: function(){ + // Draw dock controls + var ctx = $('dockCanvas').getContext('2d'); + ctx.clearRect(0, 0, 100, 100); + MUI.circle(ctx, 5 , 4, 3, this.options.enabledButtonColor, 1.0); + + if( this.dockWrapper.getProperty('dockPosition') == 'top'){ + MUI.circle(ctx, 5 , 14, 3, this.options.disabledButtonColor, 1.0) + } + else if (this.dockAutoHide){ + MUI.circle(ctx, 5 , 14, 3, this.options.trueButtonColor, 1.0); + } + else { + MUI.circle(ctx, 5 , 14, 3, this.options.enabledButtonColor, 1.0); + } + }, + + moveDock: function(){ + var ctx = $('dockCanvas').getContext('2d'); + // Move dock to top position + if (this.dockWrapper.getStyle('position') != 'relative'){ + this.dockWrapper.setStyles({ + 'position': 'relative', + 'bottom': null + }); + this.dockWrapper.addClass('top'); + MUI.Desktop.setDesktopSize(); + this.dockWrapper.setProperty('dockPosition','top'); + ctx.clearRect(0, 0, 100, 100); + MUI.circle(ctx, 5, 4, 3, this.options.enabledButtonColor, 1.0); + MUI.circle(ctx, 5, 14, 3, this.options.disabledButtonColor, 1.0); + $('dockPlacement').setProperty('title', 'Position Dock Bottom'); + $('dockAutoHide').setProperty('title', 'Auto Hide Disabled in Top Dock Position'); + this.dockAutoHide = false; + } + // Move dock to bottom position + else { + this.dockWrapper.setStyles({ + 'position': 'absolute', + 'bottom': MUI.Desktop.desktopFooter ? MUI.Desktop.desktopFooter.offsetHeight : 0 + }); + this.dockWrapper.removeClass('top'); + MUI.Desktop.setDesktopSize(); + this.dockWrapper.setProperty('dockPosition', 'bottom'); + ctx.clearRect(0, 0, 100, 100); + MUI.circle(ctx, 5, 4, 3, this.options.enabledButtonColor, 1.0); + MUI.circle(ctx, 5 , 14, 3, this.options.enabledButtonColor, 1.0); + $('dockPlacement').setProperty('title', 'Position Dock Top'); + $('dockAutoHide').setProperty('title', 'Turn Auto Hide On'); + } + }, + + createDockTab: function(windowEl){ + + var instance = windowEl.retrieve('instance'); + + var dockTab = new Element('div', { + 'id': instance.options.id + '_dockTab', + 'class': 'dockTab', + 'title': titleText + }).inject($('dockClear'), 'before'); + + dockTab.addEvent('mousedown', function(e){ + new Event(e).stop(); + this.timeDown = $time(); + }); + + dockTab.addEvent('mouseup', function(e){ + this.timeUp = $time(); + if ((this.timeUp - this.timeDown) < 275){ + // If the visibility of the windows on the page are toggled off, toggle visibility on. + if (MUI.Windows.windowsVisible == false) { + MUI.toggleWindowVisibility(); + if (instance.isMinimized == true) { + MUI.Dock.restoreMinimized.delay(25, MUI.Dock, windowEl); + } + else { + MUI.focusWindow(windowEl); + } + return; + } + // If window is minimized, restore window. + if (instance.isMinimized == true) { + MUI.Dock.restoreMinimized.delay(25, MUI.Dock, windowEl); + } + else{ + // If window is not minimized and is focused, minimize window. + if (instance.windowEl.hasClass('isFocused') && instance.options.minimizable == true){ + MUI.Dock.minimizeWindow(windowEl) + } + // If window is not minimized and is not focused, focus window. + else{ + MUI.focusWindow(windowEl); + } + // if the window is not minimized and is outside the viewport, center it in the viewport. + var coordinates = document.getCoordinates(); + if (windowEl.getStyle('left').toInt() > coordinates.width || windowEl.getStyle('top').toInt() > coordinates.height){ + MUI.centerWindow(windowEl); + } + } + } + }); + + this.dockSortables.addItems(dockTab); + + var titleText = instance.titleEl.innerHTML; + + var dockTabText = new Element('div', { + 'id': instance.options.id + '_dockTabText', + 'class': 'dockText' + }).set('html', titleText.substring(0,19) + (titleText.length > 19 ? '...' : '')).inject($(dockTab)); + + // If I implement this again, will need to also adjust the titleText truncate and the tab's + // left padding. + if (instance.options.icon != false){ + // dockTabText.setStyle('background', 'url(' + instance.options.icon + ') 4px 4px no-repeat'); + } + + // Need to resize everything in case the dock wraps when a new tab is added + MUI.Desktop.setDesktopSize(); + + }, + + makeActiveTab: function(){ + + // getWindowWith HighestZindex is used in case the currently focused window + // is closed. + var windowEl = MUI.getWindowWithHighestZindex(); + var instance = windowEl.retrieve('instance'); + + $$('.dockTab').removeClass('activeDockTab'); + if (instance.isMinimized != true) { + + instance.windowEl.addClass('isFocused'); + + var currentButton = $(instance.options.id + '_dockTab'); + if (currentButton != null) { + currentButton.addClass('activeDockTab'); + } + } + else { + instance.windowEl.removeClass('isFocused'); + } + }, + + minimizeWindow: function(windowEl){ + if (windowEl != $(windowEl)) return; + + var instance = windowEl.retrieve('instance'); + instance.isMinimized = true; + + // Hide iframe + // Iframe should be hidden when minimizing, maximizing, and moving for performance and Flash issues + if ( instance.iframeEl ) { + // Some elements are still visible in IE8 in the iframe when the iframe's visibility is set to hidden. + if (!MUI.ieLegacySupport) { + instance.iframeEl.setStyle('visibility', 'hidden'); + } + else { + instance.iframeEl.hide(); + } + } + + // Hide window and add to dock + instance.contentBorderEl.setStyle('visibility', 'hidden'); + if(instance.toolbarWrapperEl){ + instance.toolbarWrapperEl.hide(); + } + windowEl.setStyle('visibility', 'hidden'); + + MUI.Desktop.setDesktopSize(); + + // Have to use timeout because window gets focused when you click on the minimize button + setTimeout(function(){ + windowEl.setStyle('zIndex', 1); + windowEl.removeClass('isFocused'); + this.makeActiveTab(); + }.bind(this),100); + + instance.fireEvent('onMinimize', windowEl); + }, + + restoreMinimized: function(windowEl) { + + var instance = windowEl.retrieve('instance'); + + if (instance.isMinimized == false) return; + + if (MUI.Windows.windowsVisible == false){ + MUI.toggleWindowVisibility(); + } + + MUI.Desktop.setDesktopSize(); + + // Part of Mac FF2 scrollbar fix + if (instance.options.scrollbars == true && !instance.iframeEl){ + instance.contentWrapperEl.setStyle('overflow', 'auto'); + } + + if (instance.isCollapsed) { + MUI.collapseToggle(windowEl); + } + + windowEl.setStyle('visibility', 'visible'); + instance.contentBorderEl.setStyle('visibility', 'visible'); + if(instance.toolbarWrapperEl){ + instance.toolbarWrapperEl.show(); + } + + // Show iframe + if (instance.iframeEl){ + if (!MUI.ieLegacySupport){ + instance.iframeEl.setStyle('visibility', 'visible'); + } + else { + instance.iframeEl.show(); + } + } + + instance.isMinimized = false; + MUI.focusWindow(windowEl); + instance.fireEvent('onRestore', windowEl); + + } +}; +/* + +Script: Workspaces.js + Save and load workspaces. The Workspaces emulate Adobe Illustrator functionality remembering what windows are open and where they are positioned. + +Copyright: + Copyright (c) 2007-2009 Greg Houston, . + +License: + MIT-style license. + +Requires: + Core.js, Window.js + +To do: + - Move to Window + +*/ + +MUI.files[MUI.path.source + 'Layout/Workspaces.js'] = 'loaded'; + +MUI.extend({ + /* + + Function: saveWorkspace + Save the current workspace. + + Syntax: + (start code) + MUI.saveWorkspace(); + (end) + + Notes: + This version saves the ID of each open window to a cookie, and reloads those windows using the functions in mocha-init.js. This requires that each window have a function in mocha-init.js used to open them. Functions must be named the windowID + "Window". So if your window is called mywindow, it needs a function called mywindowWindow in mocha-init.js. + + */ + saveWorkspace: function(){ + this.cookie = new Hash.Cookie('mochaUIworkspaceCookie', {duration: 3600}); + this.cookie.empty(); + MUI.Windows.instances.each(function(instance) { + instance.saveValues(); + this.cookie.set(instance.options.id, { + 'id': instance.options.id, + 'top': instance.options.y, + 'left': instance.options.x, + 'width': instance.contentWrapperEl.getStyle('width').toInt(), + 'height': instance.contentWrapperEl.getStyle('height').toInt() + }); + }.bind(this)); + this.cookie.save(); + + new MUI.Window({ + loadMethod: 'html', + type: 'notification', + addClass: 'notification', + content: 'Workspace saved.', + closeAfter: '1400', + width: 200, + height: 40, + y: 53, + padding: { top: 10, right: 12, bottom: 10, left: 12 }, + shadowBlur: 5, + bodyBgColor: [255, 255, 255] + }); + + }, + windowUnload: function(){ + if ($$('.mocha').length == 0 && this.myChain){ + this.myChain.callChain(); + } + }, + loadWorkspace2: function(workspaceWindows){ + workspaceWindows.each(function(workspaceWindow){ + windowFunction = eval('MUI.' + workspaceWindow.id + 'Window'); + if (windowFunction){ + eval('MUI.' + workspaceWindow.id + 'Window({width:'+ workspaceWindow.width +',height:' + workspaceWindow.height + '});'); + var windowEl = $(workspaceWindow.id); + windowEl.setStyles({ + 'top': workspaceWindow.top, + 'left': workspaceWindow.left + }); + var instance = windowEl.retrieve('instance'); + instance.contentWrapperEl.setStyles({ + 'width': workspaceWindow.width, + 'height': workspaceWindow.height + }); + instance.drawWindow(); + } + }.bind(this)); + this.loadingWorkspace = false; + }, + /* + + Function: loadWorkspace + Load the saved workspace. + + Syntax: + (start code) + MUI.loadWorkspace(); + (end) + + */ + loadWorkspace: function(){ + cookie = new Hash.Cookie('mochaUIworkspaceCookie', {duration: 3600}); + workspaceWindows = cookie.load(); + + if(!cookie.getKeys().length){ + new MUI.Window({ + loadMethod: 'html', + type: 'notification', + addClass: 'notification', + content: 'You have no saved workspace.', + closeAfter: '1400', + width: 220, + height: 40, + y: 25, + padding: { top: 10, right: 12, bottom: 10, left: 12 }, + shadowBlur: 5, + bodyBgColor: [255, 255, 255] + }); + return; + } + + if ($$('.mocha').length != 0){ + this.loadingWorkspace = true; + this.myChain = new Chain(); + this.myChain.chain( + function(){ + $$('.mocha').each(function(el) { + this.closeWindow(el); + }.bind(this)); + }.bind(this), + function(){ + this.loadWorkspace2(workspaceWindows); + }.bind(this) + ); + this.myChain.callChain(); + } + else { + this.loadWorkspace2(workspaceWindows); + } + + } +}); diff -Nru qbittorrent-4.1.3/src/webui/www/public/scripts/mocha-yc.js qbittorrent-3.3.15/src/webui/www/public/scripts/mocha-yc.js --- qbittorrent-4.1.3/src/webui/www/public/scripts/mocha-yc.js 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/scripts/mocha-yc.js 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1 @@ +var MUI=MochaUI=new Hash({version:"0.9.6 development",options:new Hash({theme:"default",advancedEffects:false,standardEffects:true}),path:{source:"scripts/source/",themes:"themes/",plugins:"plugins/"},themePath:function(){return MUI.path.themes+MUI.options.theme+"/"},files:new Hash()});MUI.files[MUI.path.source+"Core/Core.js"]="loaded";MUI.extend({Windows:{instances:new Hash()},ieSupport:"excanvas",ieLegacySupport:Browser.Engine.trident&&Browser.version<9,updateContent:function(c){var c=$extend({element:null,childElement:null,method:null,data:null,title:null,content:null,loadMethod:null,url:null,scrollbars:null,padding:null,require:{},onContentLoaded:$empty},c);c.require=$extend({css:[],images:[],js:[],onload:null},c.require);var b={};if(!c.element){return}var d=c.element;if(MUI.Windows.instances.get(d.id)){b.recipient="window"}else{b.recipient="panel"}var a=d.retrieve("instance");if(c.title){a.titleEl.set("html",c.title)}var e=a.contentEl;b.contentContainer=c.childElement!=null?c.childElement:a.contentEl;var g=a.contentWrapperEl;if(!c.loadMethod){if(!a.options.loadMethod){if(!c.url){c.loadMethod="html"}else{c.loadMethod="xhr"}}else{c.loadMethod=a.options.loadMethod}}var f=c.scrollbars||a.options.scrollbars;if(b.contentContainer==a.contentEl){g.setStyles({overflow:f!=false&&c.loadMethod!="iframe"?"auto":"hidden"})}if(c.padding!=null){e.setStyles({"padding-top":c.padding.top,"padding-bottom":c.padding.bottom,"padding-left":c.padding.left,"padding-right":c.padding.right})}if(b.contentContainer==e){e.empty().show();e.getAllNext(".column").destroy();e.getAllNext(".columnHandle").destroy()}b.onContentLoaded=function(){if(c.require.js.length||typeof c.require.onload=="function"){new MUI.Require({js:c.require.js,onload:function(){if(!$defined(c.require.onload)){return}if(Browser.Engine.presto){c.require.onload.delay(100)}else{c.require.onload()}c.onContentLoaded?c.onContentLoaded():a.fireEvent("onContentLoaded",d)}.bind(this)})}else{c.onContentLoaded?c.onContentLoaded():a.fireEvent("onContentLoaded",d)}};if(c.require.css.length||c.require.images.length){new MUI.Require({css:c.require.css,images:c.require.images,onload:function(){this.loadSelect(a,c,b)}.bind(this)})}else{this.loadSelect(a,c,b)}},loadSelect:function(a,c,b){switch(c.loadMethod){case"xhr":this.updateContentXHR(a,c,b);break;case"iframe":this.updateContentIframe(a,c,b);break;case"html":default:this.updateContentHTML(a,c,b);break}},updateContentXHR:function(a,c,b){var f=a.contentEl;var e=b.contentContainer;var d=b.onContentLoaded;new Request.HTML({url:c.url,update:e,method:c.method!=null?c.method:"get",data:c.data!=null?new Hash(c.data).toQueryString():"",evalScripts:a.options.evalScripts,evalResponse:a.options.evalResponse,onRequest:function(){if(b.recipient=="window"&&e==f){a.showSpinner()}else{if(b.recipient=="panel"&&e==f&&$("spinner")){$("spinner").show()}}}.bind(this),onFailure:function(g){if(e==f){var j=new RegExp("[\n\rs]*(.*)[\n\rs]*","gmi");var h=j.exec(g.responseText);if(!h){h="Unknown"}e.set("html","

    Error: "+h+"

    ");if(b.recipient=="window"){a.hideSpinner()}else{if(b.recipient=="panel"&&$("spinner")){$("spinner").hide()}}}}.bind(this),onSuccess:function(){if(e==f){if(b.recipient=="window"){a.hideSpinner()}else{if(b.recipient=="panel"&&$("spinner")){$("spinner").hide()}}}Browser.Engine.trident4?d.delay(750):d()}.bind(this),onComplete:function(){}.bind(this)}).send()},updateContentIframe:function(a,c,b){var f=a.contentEl;var e=b.contentContainer;var g=a.contentWrapperEl;var d=b.onContentLoaded;if(a.options.contentURL==""||e!=f){return}a.iframeEl=new Element("iframe",{id:a.options.id+"_iframe",name:a.options.id+"_iframe","class":"mochaIframe",src:c.url,marginwidth:0,marginheight:0,frameBorder:0,scrolling:"auto",styles:{height:g.offsetHeight-g.getStyle("margin-top").toInt()-g.getStyle("margin-bottom").toInt(),width:a.panelEl?g.offsetWidth-g.getStyle("margin-left").toInt()-g.getStyle("margin-right").toInt():"100%"}}).injectInside(f);a.iframeEl.addEvent("load",function(h){if(b.recipient=="window"){a.hideSpinner()}else{if(b.recipient=="panel"&&e==f&&$("spinner")){$("spinner").hide()}}Browser.Engine.trident4?d.delay(50):d()}.bind(this));if(b.recipient=="window"){a.showSpinner()}else{if(b.recipient=="panel"&&e==f&&$("spinner")){$("spinner").show()}}},updateContentHTML:function(a,c,b){var f=a.contentEl;var e=b.contentContainer;var d=b.onContentLoaded;var g=new Array("element","textnode","whitespace","collection");if(g.contains($type(c.content))){c.content.inject(e)}else{e.set("html",c.content)}if(e==f){if(b.recipient=="window"){a.hideSpinner()}else{if(b.recipient=="panel"&&$("spinner")){$("spinner").hide()}}}Browser.Engine.trident4?d.delay(50):d()},reloadIframe:function(a){Browser.Engine.gecko?$(a).src=$(a).src:top.frames[a].location.reload(true)},roundedRect:function(f,d,j,h,c,b,g,e){f.fillStyle="rgba("+g.join(",")+","+e+")";f.beginPath();f.moveTo(d,j+b);f.lineTo(d,j+c-b);f.quadraticCurveTo(d,j+c,d+b,j+c);f.lineTo(d+h-b,j+c);f.quadraticCurveTo(d+h,j+c,d+h,j+c-b);f.lineTo(d+h,j+b);f.quadraticCurveTo(d+h,j,d+h-b,j);f.lineTo(d+b,j);f.quadraticCurveTo(d,j,d,j+b);f.fill()},triangle:function(e,c,h,g,b,f,d){e.beginPath();e.moveTo(c+g,h);e.lineTo(c,h+b);e.lineTo(c+g,h+b);e.closePath();e.fillStyle="rgba("+f.join(",")+","+d+")";e.fill()},circle:function(d,b,g,f,e,c){d.beginPath();d.arc(b,g,f,0,Math.PI*2,true);d.fillStyle="rgba("+e.join(",")+","+c+")";d.fill()},notification:function(a){new MUI.Window({loadMethod:"html",closeAfter:1500,type:"notification",addClass:"notification",content:a,width:220,height:40,y:53,padding:{top:10,right:12,bottom:10,left:12},shadowBlur:5})},toggleAdvancedEffects:function(a){if(MUI.options.advancedEffects==false){MUI.options.advancedEffects=true;if(a){this.toggleAdvancedEffectsLink=new Element("div",{"class":"check",id:"toggleAdvancedEffects_check"}).inject(a)}}else{MUI.options.advancedEffects=false;if(this.toggleAdvancedEffectsLink){this.toggleAdvancedEffectsLink.destroy()}}},toggleStandardEffects:function(a){if(MUI.options.standardEffects==false){MUI.options.standardEffects=true;if(a){this.toggleStandardEffectsLink=new Element("div",{"class":"check",id:"toggleStandardEffects_check"}).inject(a)}}else{MUI.options.standardEffects=false;if(this.toggleStandardEffectsLink){this.toggleStandardEffectsLink.destroy()}}},underlayInitialize:function(){var a=new Element("div",{id:"windowUnderlay",styles:{height:parent.getCoordinates().height,opacity:0.01,display:"none"}}).inject(document.body)},setUnderlaySize:function(){$("windowUnderlay").setStyle("height",parent.getCoordinates().height)}});function fixPNG(e){if(Browser.Engine.trident4&&document.body.filters){var b=(e.id)?"id='"+e.id+"' ":"";var d=(e.className)?"class='"+e.className+"' ":"";var f=(e.title)?"title='"+e.title+"' ":"title='"+e.alt+"' ";var c="display:inline-block;"+e.style.cssText;var a="";e.outerHTML=a}}document.addEvent("mousedown",function(a){MUI.blurAll.delay(50)});window.addEvent("domready",function(){MUI.underlayInitialize()});window.addEvent("resize",function(){if($("windowUnderlay")){MUI.setUnderlaySize()}else{MUI.underlayInitialize()}});Element.implement({hide:function(){this.setStyle("display","none");return this},show:function(){this.setStyle("display","block");return this}});Element.implement({shake:function(b,h){b=b||3;h=h||500;h=(h/50).toInt()-1;var e=this.getParent();if(e!=$(document.body)&&e.getStyle("position")=="static"){e.setStyle("position","relative")}var a=this.getStyle("position");if(a=="static"){this.setStyle("position","relative");a="relative"}if(MUI.ieLegacySupport){e.setStyle("height",e.getStyle("height"))}var g=this.getPosition(e);if(a=="relative"&&!Browser.Engine.presto){g.x-=e.getStyle("paddingLeft").toInt();g.y-=e.getStyle("paddingTop").toInt()}var f=this.retrieve("morph");if(f){f.cancel();var c=f.options}var f=this.get("morph",{duration:50,link:"chain"});for(var d=0;d]*>([\s\S]*?)<\/body>/i);c=(b)?b[1]:c;var a=new Element("div");return a.set("html",c)}});MUI.getCSSRule=function(b){for(var c=0;c=200)&&(a<300))}});Browser.Request=function(){return $try(function(){return new ActiveXObject("MSXML2.XMLHTTP")},function(){return new XMLHttpRequest()})}}MUI.Require=new Class({Implements:[Options],options:{css:[],images:[],js:[],onload:$empty},initialize:function(a){this.setOptions(a);var a=this.options;this.assetsToLoad=a.css.length+a.images.length+a.js.length;this.assetsLoaded=0;var b=0;if(a.css.length){a.css.each(function(c){this.getAsset(c,function(){if(b==a.css.length-1){if(this.assetsLoaded==this.assetsToLoad-1){this.requireOnload()}else{this.assetsLoaded++;this.requireContinue.delay(50,this)}}else{b++;this.assetsLoaded++}}.bind(this))}.bind(this))}else{if(!a.js.length&&!a.images.length){this.options.onload();return true}else{this.requireContinue.delay(50,this)}}},requireOnload:function(){this.assetsLoaded++;if(this.assetsLoaded==this.assetsToLoad){this.options.onload();return true}},requireContinue:function(){var a=this.options;if(a.images.length){a.images.each(function(b){this.getAsset(b,this.requireOnload.bind(this))}.bind(this))}if(a.js.length){a.js.each(function(b){this.getAsset(b,this.requireOnload.bind(this))}.bind(this))}},getAsset:function(b,c){if(MUI.files[b]=="loaded"){if(typeof c=="function"){c()}return true}else{if(MUI.files[b]=="loading"){var d=0;var a=(function(){d++;if(MUI.files[b]=="loading"&&d<"100"){return}$clear(a);if(typeof c=="function"){c()}}).periodical(50)}else{MUI.files[b]="loading";properties={onload:c!="undefined"?c:$empty};var e=properties.onload;properties.onload=function(){MUI.files[b]="loaded";if(e){e()}}.bind(this);switch(b.match(/\.\w+$/)[0]){case".js":return Asset.javascript(b,properties);case".css":return Asset.css(b,properties);case".jpg":case".png":case".gif":return Asset.image(b,properties)}alert('The required file "'+b+'" could not be loaded')}}}});$extend(Asset,{javascript:function(f,d){d=$extend({onload:$empty,document:document,check:$lambda(true)},d);if($(d.id)){d.onload();return $(d.id)}var b=new Element("script",{src:f,type:"text/javascript"});var e=d.onload.bind(b),a=d.check,g=d.document;delete d.onload;delete d.check;delete d.document;if(!Browser.Engine.webkit419&&!Browser.Engine.presto){b.addEvents({load:e,readystatechange:function(){if(MUI.ieLegacySupport&&["loaded","complete"].contains(this.readyState)){e()}}}).setProperties(d)}else{var c=(function(){if(!$try(a)){return}$clear(c);Browser.Engine.presto?e.delay(500):e()}).periodical(50)}return b.inject(g.head)},css:function(b,a){a=$extend({id:null,media:"screen",onload:$empty},a);new Request({method:"get",url:b,onComplete:function(c){var d=new Element("link",{id:a.id,rel:"stylesheet",media:a.media,type:"text/css",href:b}).inject(document.head);a.onload()}.bind(this),onFailure:function(c){},onSuccess:function(){}.bind(this)}).send()}});MUI.extend({newWindowsFromJSON:function(a){new MUI.Require({js:[MUI.path.source+"Window/Windows-from-json.js"],onload:function(){new MUI.newWindowsFromJSON(a)}})},arrangeCascade:function(){new MUI.Require({js:[MUI.path.source+"Window/Arrange-cascade.js"],onload:function(){new MUI.arrangeCascade()}})},arrangeTile:function(){new MUI.Require({js:[MUI.path.source+"Window/Arrange-tile.js"],onload:function(){new MUI.arrangeTile()}})},saveWorkspace:function(){new MUI.Require({js:[MUI.path.source+"Layout/Workspaces.js"],onload:function(){new MUI.saveWorkspace()}})},loadWorkspace:function(){new MUI.Require({js:[MUI.path.source+"Layout/Workspaces.js"],onload:function(){new MUI.loadWorkspace()}})},Themes:{init:function(a){new MUI.Require({js:[MUI.path.source+"Utilities/Themes.js"],onload:function(){MUI.Themes.init(a)}})}}});MUI.files[MUI.path.source+"Utilities/Themes.js"]=1;MUI.Themes={init:function(a){this.newTheme=a.toLowerCase();if(!this.newTheme||this.newTheme==null||this.newTheme==MUI.options.theme.toLowerCase()){return}if($("spinner")){$("spinner").show()}this.oldURIs=[];this.oldSheets=[];$$("link").each(function(c){var b=c.get("href");if(b.contains(MUI.path.themes+MUI.options.theme)){this.oldURIs.push(b);this.oldSheets.push(c)}}.bind(this));this.newSheetURLs=this.oldURIs.map(function(c,b){return c.replace("/"+MUI.options.theme+"/","/"+MUI.Themes.newTheme+"/")}.bind(this));this.sheetsToLoad=this.oldURIs.length;this.sheetsLoaded=0;this.newSheets=[];this.newSheetURLs.each(function(d){var b=d;var c=new Request({method:"get",url:b,onComplete:function(e){var f=new Element("link",{rel:"stylesheet",media:"screen",type:"text/css",href:b});this.newSheets.push(f)}.bind(this),onFailure:function(e){this.themeLoadSuccess=false;if($("spinner")){$("spinner").hide()}MUI.notification("Stylesheets did not load.")},onSuccess:function(){this.sheetsLoaded++;if(this.sheetsLoaded==this.sheetsToLoad){this.updateThemeStylesheets();this.themeLoadSuccess=true}}.bind(this)});c.send()}.bind(this))},updateThemeStylesheets:function(){this.oldSheets.each(function(a){a.destroy()});this.newSheets.each(function(a){MUI.files[a.get("href")]=1;a.inject(document.head)});if(MUI.ieLegacySupport){this.redraw.delay(1250,this)}else{this.redraw.delay(250,this)}},redraw:function(){$$(".replaced").removeClass("replaced");$$(".mocha").each(function(c){var b=c.retrieve("instance");b.setColors();b.drawWindow()});if(MUI.Dock){if(MUI.Dock.options.useControls){MUI.Dock.setDockColors();MUI.Dock.renderDockControls()}}if(MUI.Desktop.desktop){var a=(function(){if(MUI.Desktop.desktop.getStyle("overflow")!="hidden"){return}$clear(a);MUI.Desktop.setDesktopSize()}).periodical(50)}if($("spinner")){$("spinner").hide()}MUI.options.theme=this.newTheme}};window.addEvent("load",function(){if($("themeControl")){$("themeControl").getElements("option").setProperty("selected","false");if($("chooseTheme")){$("chooseTheme").setProperty("selected","true")}}});MUI.files[MUI.path.source+"Window/Window.js"]="loading";MUI.extend({Windows:{instances:new Hash(),indexLevel:100,windowIDCount:0,windowsVisible:true,focusingWindow:false}});MUI.Windows.windowOptions={id:null,title:"New Window",icon:false,type:"window",require:{css:[],images:[],js:[],onload:null},loadMethod:null,method:"get",contentURL:null,data:null,closeAfter:false,evalScripts:true,evalResponse:false,content:"Window content",toolbar:false,toolbarPosition:"top",toolbarHeight:29,toolbarURL:"pages/lipsum.html",toolbarData:null,toolbarContent:"",toolbarOnload:$empty,toolbar2:false,toolbar2Position:"bottom",toolbar2Height:29,toolbar2URL:"pages/lipsum.html",toolbar2Data:null,toolbar2Content:"",toolbar2Onload:$empty,container:null,restrict:true,shape:"box",collapsible:true,minimizable:true,maximizable:true,closable:true,storeOnClose:false,modalOverlayClose:true,draggable:null,draggableGrid:false,draggableLimit:false,draggableSnap:false,resizable:null,resizeLimit:{x:[250,2500],y:[125,2000]},addClass:"",width:300,height:125,headerHeight:25,footerHeight:25,cornerRadius:8,x:null,y:null,scrollbars:true,padding:{top:10,right:12,bottom:10,left:12},shadowBlur:5,shadowOffset:{x:0,y:1},controlsOffset:{right:6,top:6},useCanvas:true,useCanvasControls:true,useSpinner:true,headerStartColor:[250,250,250],headerStopColor:[229,229,229],bodyBgColor:[229,229,229],minimizeBgColor:[255,255,255],minimizeColor:[0,0,0],maximizeBgColor:[255,255,255],maximizeColor:[0,0,0],closeBgColor:[255,255,255],closeColor:[0,0,0],resizableColor:[254,254,254],onBeforeBuild:$empty,onContentLoaded:$empty,onFocus:$empty,onBlur:$empty,onResize:$empty,onMinimize:$empty,onMaximize:$empty,onRestore:$empty,onClose:$empty,onCloseComplete:$empty};MUI.Windows.windowOptionsOriginal=$merge(MUI.Windows.windowOptions);MUI.Window=new Class({Implements:[Events,Options],options:MUI.Windows.windowOptions,initialize:function(a){this.setOptions(a);var a=this.options;$extend(this,{mochaControlsWidth:0,minimizebuttonX:0,maximizebuttonX:0,closebuttonX:0,headerFooterShadow:a.headerHeight+a.footerHeight+(a.shadowBlur*2),oldTop:0,oldLeft:0,isMaximized:false,isMinimized:false,isCollapsed:false,timestamp:$time()});if(a.type!="window"){a.container=document.body;a.minimizable=false}if(!a.container){a.container=MUI.Desktop&&MUI.Desktop.desktop?MUI.Desktop.desktop:document.body}if(a.resizable==null){if(a.type!="window"||a.shape=="gauge"){a.resizable=false}else{a.resizable=true}}if(a.draggable==null){a.draggable=a.type!="window"?false:true}if(a.shape=="gauge"||a.type=="notification"){a.collapsible=false;a.maximizable=false;a.contentBgColor="transparent";a.scrollbars=false;a.footerHeight=0}if(a.type=="notification"){a.closable=false;a.headerHeight=0}if(MUI.Dock&&$(MUI.options.dock)){if(MUI.Dock.dock&&a.type!="modal"&&a.type!="modal2"){a.minimizable=a.minimizable}}else{a.minimizable=false}a.maximizable=MUI.Desktop&&MUI.Desktop.desktop&&a.maximizable&&a.type!="modal"&&a.type!="modal2";if(this.options.type=="modal2"){this.options.shadowBlur=0;this.options.shadowOffset={x:0,y:0};this.options.useSpinner=false;this.options.useCanvas=false;this.options.footerHeight=0;this.options.headerHeight=0}a.id=a.id||"win"+(++MUI.Windows.windowIDCount);this.windowEl=$(a.id);if(a.require.css.length||a.require.images.length){new MUI.Require({css:a.require.css,images:a.require.images,onload:function(){this.newWindow()}.bind(this)})}else{this.newWindow()}return this},saveValues:function(){var a=this.windowEl.getCoordinates();this.options.x=a.left.toInt();this.options.y=a.top.toInt()},newWindow:function(c){var a=MUI.Windows.instances;var j=MUI.Windows.instances.get(this.options.id);var k=this.options;if(j){var h=j}if(this.windowEl&&!this.isClosing){if(h.isMinimized){MUI.Dock.restoreMinimized(this.windowEl)}else{if(h.isCollapsed){MUI.collapseToggle(this.windowEl);setTimeout(MUI.focusWindow.pass(this.windowEl,this),10)}else{if(this.windowEl.hasClass("windowClosed")){if(h.check){h.check.show()}this.windowEl.removeClass("windowClosed");this.windowEl.setStyle("opacity",0);this.windowEl.addClass("mocha");if(MUI.Dock&&$(MUI.options.dock)&&h.options.type=="window"){var f=$(h.options.id+"_dockTab");if(f!=null){f.show()}MUI.Desktop.setDesktopSize()}h.displayNewWindow()}else{var g=document.getCoordinates();if(this.windowEl.getStyle("left").toInt()>g.width||this.windowEl.getStyle("top").toInt()>g.height){MUI.centerWindow(this.windowEl)}setTimeout(MUI.focusWindow.pass(this.windowEl,this),10);if(MUI.options.standardEffects==true){this.windowEl.shake()}}}}return}else{a.set(k.id,this)}this.isClosing=false;this.fireEvent("onBeforeBuild");MUI.Windows.indexLevel++;this.windowEl=new Element("div",{"class":"mocha",id:k.id,styles:{position:"absolute",width:k.width,height:k.height,display:"block",opacity:0,zIndex:MUI.Windows.indexLevel+=2}});this.windowEl.store("instance",this);this.windowEl.addClass(k.addClass);if(k.type=="modal2"){this.windowEl.addClass("modal2")}if(MUI.ieLegacySupport&&k.shape=="gauge"){this.windowEl.setStyle("backgroundImage","url(../images/skin/spacer.gif)")}if(k.loadMethod=="iframe"){k.padding={top:0,right:0,bottom:0,left:0}}this.insertWindowElements();this.titleEl.set("html",k.title);this.contentWrapperEl.setStyle("overflow","hidden");this.contentEl.setStyles({"padding-top":k.padding.top,"padding-bottom":k.padding.bottom,"padding-left":k.padding.left,"padding-right":k.padding.right});if(k.shape=="gauge"){if(k.useCanvasControls){this.canvasControlsEl.setStyle("visibility","hidden")}else{this.controlsEl.setStyle("visibility","hidden")}this.windowEl.addEvent("mouseover",function(){this.mouseover=true;var l=function(){if(this.mouseover!=false){if(k.useCanvasControls){this.canvasControlsEl.setStyle("visibility","visible")}else{this.controlsEl.setStyle("visibility","visible")}this.canvasHeaderEl.setStyle("visibility","visible");this.titleEl.show()}};l.delay(0,this)}.bind(this));this.windowEl.addEvent("mouseleave",function(){this.mouseover=false;if(this.options.useCanvasControls){this.canvasControlsEl.setStyle("visibility","hidden")}else{this.controlsEl.setStyle("visibility","hidden")}this.canvasHeaderEl.setStyle("visibility","hidden");this.titleEl.hide()}.bind(this))}this.windowEl.inject(k.container);this.setColors();if(k.type!="notification"){this.setMochaControlsWidth()}MUI.updateContent({element:this.windowEl,content:k.content,method:k.method,url:k.contentURL,data:k.data,onContentLoaded:null,require:{js:k.require.js,onload:k.require.onload}});if(this.options.toolbar==true){MUI.updateContent({element:this.windowEl,childElement:this.toolbarEl,content:k.toolbarContent,loadMethod:"xhr",method:k.method,url:k.toolbarURL,data:k.toolbarData,onContentLoaded:k.toolbarOnload})}if(this.options.toolbar2==true){MUI.updateContent({element:this.windowEl,childElement:this.toolbar2El,content:k.toolbar2Content,loadMethod:"xhr",method:k.method,url:k.toolbar2URL,data:k.toolbar2Data,onContentLoaded:k.toolbar2Onload})}this.drawWindow();this.attachDraggable();this.attachResizable();this.setupEvents();if(k.resizable){this.adjustHandles()}if(k.container==document.body||k.container==MUI.Desktop.desktop){var b=window.getSize()}else{var b=$(this.options.container).getSize()}if(!k.y){if(MUI.Desktop&&MUI.Desktop.desktop){var d=(b.y*0.5)-(this.windowEl.offsetHeight*0.5);if(d<-k.shadowBlur){d=-k.shadowBlur}}else{var d=window.getScroll().y+(window.getSize().y*0.5)-(this.windowEl.offsetHeight*0.5);if(d<-k.shadowBlur){d=-k.shadowBlur}}}else{var d=k.y-k.shadowBlur}if(!this.options.x){var e=(b.x*0.5)-(this.windowEl.offsetWidth*0.5);if(e<-k.shadowBlur){e=-k.shadowBlur}}else{var e=k.x-k.shadowBlur}this.windowEl.setStyles({top:d,left:e});this.opacityMorph=new Fx.Morph(this.windowEl,{duration:350,transition:Fx.Transitions.Sine.easeInOut,onComplete:function(){if(MUI.ieLegacySupport){this.drawWindow()}}.bind(this)});this.displayNewWindow();this.morph=new Fx.Morph(this.windowEl,{duration:200});this.windowEl.store("morph",this.morph);this.resizeMorph=new Fx.Elements([this.contentWrapperEl,this.windowEl],{duration:400,transition:Fx.Transitions.Sine.easeInOut,onStart:function(){this.resizeAnimation=this.drawWindow.periodical(20,this)}.bind(this),onComplete:function(){$clear(this.resizeAnimation);this.drawWindow();if(this.iframeEl){this.iframeEl.setStyle("visibility","visible")}}.bind(this)});this.windowEl.store("resizeMorph",this.resizeMorph);if($(this.windowEl.id+"LinkCheck")){this.check=new Element("div",{"class":"check",id:this.options.id+"_check"}).inject(this.windowEl.id+"LinkCheck")}if(this.options.closeAfter!=false){MUI.closeWindow.delay(this.options.closeAfter,this,this.windowEl)}if(MUI.Dock&&$(MUI.options.dock)&&this.options.type=="window"){MUI.Dock.createDockTab(this.windowEl)}},displayNewWindow:function(){options=this.options;if(options.type=="modal"||options.type=="modal2"){MUI.currentModal=this.windowEl;if(Browser.Engine.trident4){$("modalFix").show()}$("modalOverlay").show();if(MUI.options.advancedEffects==false){$("modalOverlay").setStyle("opacity",0.6);this.windowEl.setStyles({zIndex:11000,opacity:1})}else{MUI.Modal.modalOverlayCloseMorph.cancel();MUI.Modal.modalOverlayOpenMorph.start({opacity:0.6});this.windowEl.setStyles({zIndex:11000});this.opacityMorph.start({opacity:1})}$$(".dockTab").removeClass("activeDockTab");$$(".mocha").removeClass("isFocused");this.windowEl.addClass("isFocused")}else{if(MUI.options.advancedEffects==false){this.windowEl.setStyle("opacity",1);setTimeout(MUI.focusWindow.pass(this.windowEl,this),10)}else{if(MUI.ieLegacySupport){this.drawWindow(false)}this.opacityMorph.start({opacity:1});setTimeout(MUI.focusWindow.pass(this.windowEl,this),10)}}},setupEvents:function(){var a=this.windowEl;if(this.closeButtonEl){this.closeButtonEl.addEvent("click",function(b){new Event(b).stop();MUI.closeWindow(a)}.bind(this))}if(this.options.type=="window"){a.addEvent("mousedown",function(b){if(MUI.ieLegacySupport){new Event(b).stop()}MUI.focusWindow(a);if(a.getStyle("top").toInt()<-this.options.shadowBlur){a.setStyle("top",-this.options.shadowBlur)}}.bind(this))}if(this.minimizeButtonEl){this.minimizeButtonEl.addEvent("click",function(b){new Event(b).stop();MUI.Dock.minimizeWindow(a)}.bind(this))}if(this.maximizeButtonEl){this.maximizeButtonEl.addEvent("click",function(b){new Event(b).stop();if(this.isMaximized){MUI.Desktop.restoreWindow(a)}else{MUI.Desktop.maximizeWindow(a)}}.bind(this))}if(this.options.collapsible==true){this.titleEl.addEvent("selectstart",function(b){b=new Event(b).stop()}.bind(this));if(MUI.ieLegacySupport){this.titleBarEl.addEvent("mousedown",function(b){this.titleEl.setCapture()}.bind(this));this.titleBarEl.addEvent("mouseup",function(b){this.titleEl.releaseCapture()}.bind(this))}this.titleBarEl.addEvent("dblclick",function(b){b=new Event(b).stop();MUI.collapseToggle(this.windowEl)}.bind(this))}},attachDraggable:function(){var a=this.windowEl;if(!this.options.draggable){return}this.windowDrag=new Drag.Move(a,{handle:this.titleBarEl,container:this.options.restrict==true?$(this.options.container):false,grid:this.options.draggableGrid,limit:this.options.draggableLimit,snap:this.options.draggableSnap,onStart:function(){if(this.options.type!="modal"&&this.options.type!="modal2"){MUI.focusWindow(a);$("windowUnderlay").show()}if(this.iframeEl){if(!MUI.ieLegacySupport){this.iframeEl.setStyle("visibility","hidden")}else{this.iframeEl.hide()}}}.bind(this),onComplete:function(){if(this.options.type!="modal"&&this.options.type!="modal2"){$("windowUnderlay").hide()}if(this.iframeEl){if(!MUI.ieLegacySupport){this.iframeEl.setStyle("visibility","visible")}else{this.iframeEl.show()}}this.saveValues()}.bind(this)})},attachResizable:function(){var a=this.windowEl;if(!this.options.resizable){return}this.resizable1=this.windowEl.makeResizable({handle:[this.n,this.ne,this.nw],limit:{y:[function(){return this.windowEl.getStyle("top").toInt()+this.windowEl.getStyle("height").toInt()-this.options.resizeLimit.y[1]}.bind(this),function(){return this.windowEl.getStyle("top").toInt()+this.windowEl.getStyle("height").toInt()-this.options.resizeLimit.y[0]}.bind(this)]},modifiers:{x:false,y:"top"},onStart:function(){this.resizeOnStart();this.coords=this.contentWrapperEl.getCoordinates();this.y2=this.coords.top.toInt()+this.contentWrapperEl.offsetHeight}.bind(this),onDrag:function(){this.coords=this.contentWrapperEl.getCoordinates();this.contentWrapperEl.setStyle("height",this.y2-this.coords.top.toInt());this.resizeOnDrag()}.bind(this),onComplete:function(){this.resizeOnComplete()}.bind(this)});this.resizable2=this.contentWrapperEl.makeResizable({handle:[this.e,this.ne],limit:{x:[this.options.resizeLimit.x[0]-(this.options.shadowBlur*2),this.options.resizeLimit.x[1]-(this.options.shadowBlur*2)]},modifiers:{x:"width",y:false},onStart:function(){this.resizeOnStart()}.bind(this),onDrag:function(){this.resizeOnDrag()}.bind(this),onComplete:function(){this.resizeOnComplete()}.bind(this)});this.resizable3=this.contentWrapperEl.makeResizable({container:this.options.restrict==true?$(this.options.container):false,handle:this.se,limit:{x:[this.options.resizeLimit.x[0]-(this.options.shadowBlur*2),this.options.resizeLimit.x[1]-(this.options.shadowBlur*2)],y:[this.options.resizeLimit.y[0]-this.headerFooterShadow,this.options.resizeLimit.y[1]-this.headerFooterShadow]},modifiers:{x:"width",y:"height"},onStart:function(){this.resizeOnStart()}.bind(this),onDrag:function(){this.resizeOnDrag()}.bind(this),onComplete:function(){this.resizeOnComplete()}.bind(this)});this.resizable4=this.contentWrapperEl.makeResizable({handle:[this.s,this.sw],limit:{y:[this.options.resizeLimit.y[0]-this.headerFooterShadow,this.options.resizeLimit.y[1]-this.headerFooterShadow]},modifiers:{x:false,y:"height"},onStart:function(){this.resizeOnStart()}.bind(this),onDrag:function(){this.resizeOnDrag()}.bind(this),onComplete:function(){this.resizeOnComplete()}.bind(this)});this.resizable5=this.windowEl.makeResizable({handle:[this.w,this.sw,this.nw],limit:{x:[function(){return this.windowEl.getStyle("left").toInt()+this.windowEl.getStyle("width").toInt()-this.options.resizeLimit.x[1]}.bind(this),function(){return this.windowEl.getStyle("left").toInt()+this.windowEl.getStyle("width").toInt()-this.options.resizeLimit.x[0]}.bind(this)]},modifiers:{x:"left",y:false},onStart:function(){this.resizeOnStart();this.coords=this.contentWrapperEl.getCoordinates();this.x2=this.coords.left.toInt()+this.contentWrapperEl.offsetWidth}.bind(this),onDrag:function(){this.coords=this.contentWrapperEl.getCoordinates();this.contentWrapperEl.setStyle("width",this.x2-this.coords.left.toInt());this.resizeOnDrag()}.bind(this),onComplete:function(){this.resizeOnComplete()}.bind(this)})},resizeOnStart:function(){$("windowUnderlay").show();if(this.iframeEl){if(!MUI.ieLegacySupport){this.iframeEl.setStyle("visibility","hidden")}else{this.iframeEl.hide()}}},resizeOnDrag:function(){this.drawWindow();this.adjustHandles()},resizeOnComplete:function(){$("windowUnderlay").hide();if(this.iframeEl){if(!MUI.ieLegacySupport){this.iframeEl.setStyle("visibility","visible")}else{this.iframeEl.show();this.iframeEl.setStyle("width","99%");this.iframeEl.setStyle("height",this.contentWrapperEl.offsetHeight);this.iframeEl.setStyle("width","100%");this.iframeEl.setStyle("height",this.contentWrapperEl.offsetHeight)}}if(this.contentWrapperEl.getChildren(".column")!=null){MUI.rWidth(this.contentWrapperEl);this.contentWrapperEl.getChildren(".column").each(function(a){MUI.panelHeight(a)})}this.fireEvent("onResize",this.windowEl)},adjustHandles:function(){var d=this.options.shadowBlur;var j=d*2;var k=this.options.shadowOffset;var e=d-k.y-1;var g=d+k.x-1;var a=d+k.y-1;var c=d-k.x-1;var f=this.windowEl.getCoordinates();var b=f.width-j+2;var h=f.height-j+2;this.n.setStyles({top:e,left:c+10,width:b-20});this.e.setStyles({top:e+10,right:g,height:h-30});this.s.setStyles({bottom:a,left:c+10,width:b-30});this.w.setStyles({top:e+10,left:c,height:h-20});this.ne.setStyles({top:e,right:g});this.se.setStyles({bottom:a,right:g});this.sw.setStyles({bottom:a,left:c});this.nw.setStyles({top:e,left:c})},detachResizable:function(){this.resizable1.detach();this.resizable2.detach();this.resizable3.detach();this.resizable4.detach();this.resizable5.detach();this.windowEl.getElements(".handle").hide()},reattachResizable:function(){this.resizable1.attach();this.resizable2.attach();this.resizable3.attach();this.resizable4.attach();this.resizable5.attach();this.windowEl.getElements(".handle").show()},insertWindowElements:function(){var c=this.options;var a=c.height;var d=c.width;var e=c.id;var b={};if(Browser.Engine.trident4){b.zIndexFixEl=new Element("iframe",{id:e+"_zIndexFix","class":"zIndexFix",scrolling:"no",marginWidth:0,marginHeight:0,src:"",styles:{position:"absolute"}}).inject(this.windowEl)}b.overlayEl=new Element("div",{id:e+"_overlay","class":"mochaOverlay",styles:{position:"absolute",top:0,left:0}}).inject(this.windowEl);b.titleBarEl=new Element("div",{id:e+"_titleBar","class":"mochaTitlebar",styles:{cursor:c.draggable?"move":"default"}}).inject(b.overlayEl,"top");b.titleEl=new Element("h3",{id:e+"_title","class":"mochaTitle"}).inject(b.titleBarEl);if(c.icon!=false){b.titleEl.setStyles({"padding-left":28,background:"url("+c.icon+") 5px 4px no-repeat"})}b.contentBorderEl=new Element("div",{id:e+"_contentBorder","class":"mochaContentBorder"}).inject(b.overlayEl);if(c.toolbar){b.toolbarWrapperEl=new Element("div",{id:e+"_toolbarWrapper","class":"mochaToolbarWrapper",styles:{height:c.toolbarHeight}}).inject(b.contentBorderEl,c.toolbarPosition=="bottom"?"after":"before");if(c.toolbarPosition=="bottom"){b.toolbarWrapperEl.addClass("bottom")}b.toolbarEl=new Element("div",{id:e+"_toolbar","class":"mochaToolbar",styles:{height:c.toolbarHeight}}).inject(b.toolbarWrapperEl)}if(c.toolbar2){b.toolbar2WrapperEl=new Element("div",{id:e+"_toolbar2Wrapper","class":"mochaToolbarWrapper",styles:{height:c.toolbar2Height}}).inject(b.contentBorderEl,c.toolbar2Position=="bottom"?"after":"before");if(c.toolbar2Position=="bottom"){b.toolbar2WrapperEl.addClass("bottom")}b.toolbar2El=new Element("div",{id:e+"_toolbar2","class":"mochaToolbar",styles:{height:c.toolbar2Height}}).inject(b.toolbar2WrapperEl)}b.contentWrapperEl=new Element("div",{id:e+"_contentWrapper","class":"mochaContentWrapper",styles:{width:d+"px",height:a+"px"}}).inject(b.contentBorderEl);if(this.options.shape=="gauge"){b.contentBorderEl.setStyle("borderWidth",0)}b.contentEl=new Element("div",{id:e+"_content","class":"mochaContent"}).inject(b.contentWrapperEl);if(this.options.useCanvas==true&&!MUI.ieLegacySupport){b.canvasEl=new Element("canvas",{id:e+"_canvas","class":"mochaCanvas",width:10,height:10}).inject(this.windowEl)}if(this.options.useCanvas==true&&MUI.ieLegacySupport){b.canvasEl=new Element("canvas",{id:e+"_canvas","class":"mochaCanvas",width:50000,height:20000,styles:{position:"absolute",top:0,left:0}}).inject(this.windowEl);if(MUI.ieLegacySupport&&MUI.ieSupport=="excanvas"){G_vmlCanvasManager.initElement(b.canvasEl);b.canvasEl=this.windowEl.getElement(".mochaCanvas")}}b.controlsEl=new Element("div",{id:e+"_controls","class":"mochaControls"}).inject(b.overlayEl,"after");if(c.useCanvasControls==true){b.canvasControlsEl=new Element("canvas",{id:e+"_canvasControls","class":"mochaCanvasControls",width:14,height:14}).inject(this.windowEl);if(MUI.ieLegacySupport&&MUI.ieSupport=="excanvas"){G_vmlCanvasManager.initElement(b.canvasControlsEl);b.canvasControlsEl=this.windowEl.getElement(".mochaCanvasControls")}}if(c.closable){b.closeButtonEl=new Element("div",{id:e+"_closeButton","class":"mochaCloseButton mochaWindowButton",title:"Close"}).inject(b.controlsEl)}if(c.maximizable){b.maximizeButtonEl=new Element("div",{id:e+"_maximizeButton","class":"mochaMaximizeButton mochaWindowButton",title:"Maximize"}).inject(b.controlsEl)}if(c.minimizable){b.minimizeButtonEl=new Element("div",{id:e+"_minimizeButton","class":"mochaMinimizeButton mochaWindowButton",title:"Minimize"}).inject(b.controlsEl)}if(c.useSpinner==true&&c.shape!="gauge"&&c.type!="notification"){b.spinnerEl=new Element("div",{id:e+"_spinner","class":"mochaSpinner",width:16,height:16}).inject(this.windowEl,"bottom")}if(this.options.shape=="gauge"){b.canvasHeaderEl=new Element("canvas",{id:e+"_canvasHeader","class":"mochaCanvasHeader",width:this.options.width,height:26}).inject(this.windowEl,"bottom");if(MUI.ieLegacySupport&&MUI.ieSupport=="excanvas"){G_vmlCanvasManager.initElement(b.canvasHeaderEl);b.canvasHeaderEl=this.windowEl.getElement(".mochaCanvasHeader")}}if(MUI.ieLegacySupport){b.overlayEl.setStyle("zIndex",2)}if(c.resizable){b.n=new Element("div",{id:e+"_resizeHandle_n","class":"handle",styles:{top:0,left:10,cursor:"n-resize"}}).inject(b.overlayEl,"after");b.ne=new Element("div",{id:e+"_resizeHandle_ne","class":"handle corner",styles:{top:0,right:0,cursor:"ne-resize"}}).inject(b.overlayEl,"after");b.e=new Element("div",{id:e+"_resizeHandle_e","class":"handle",styles:{top:10,right:0,cursor:"e-resize"}}).inject(b.overlayEl,"after");b.se=new Element("div",{id:e+"_resizeHandle_se","class":"handle cornerSE",styles:{bottom:0,right:0,cursor:"se-resize"}}).inject(b.overlayEl,"after");b.s=new Element("div",{id:e+"_resizeHandle_s","class":"handle",styles:{bottom:0,left:10,cursor:"s-resize"}}).inject(b.overlayEl,"after");b.sw=new Element("div",{id:e+"_resizeHandle_sw","class":"handle corner",styles:{bottom:0,left:0,cursor:"sw-resize"}}).inject(b.overlayEl,"after");b.w=new Element("div",{id:e+"_resizeHandle_w","class":"handle",styles:{top:10,left:0,cursor:"w-resize"}}).inject(b.overlayEl,"after");b.nw=new Element("div",{id:e+"_resizeHandle_nw","class":"handle corner",styles:{top:0,left:0,cursor:"nw-resize"}}).inject(b.overlayEl,"after")}$extend(this,b)},setColors:function(){if(this.options.useCanvas==true){var c=/\?(.*?)\)/;if(this.titleBarEl.getStyle("backgroundImage")!="none"){var d=this.titleBarEl.getStyle("backgroundImage");d=d.match(c)[1];d=d.parseQueryString();var a=d.from;var b=d.to.replace(/\"/,"");this.options.headerStartColor=new Color(a);this.options.headerStopColor=new Color(b);this.titleBarEl.addClass("replaced")}else{if(this.titleBarEl.getStyle("background-color")!==""&&this.titleBarEl.getStyle("background-color")!=="transparent"){this.options.headerStartColor=new Color(this.titleBarEl.getStyle("background-color")).mix("#fff",20);this.options.headerStopColor=new Color(this.titleBarEl.getStyle("background-color")).mix("#000",20);this.titleBarEl.addClass("replaced")}}if(this.windowEl.getStyle("background-color")!==""&&this.windowEl.getStyle("background-color")!=="transparent"){this.options.bodyBgColor=new Color(this.windowEl.getStyle("background-color"));this.windowEl.addClass("replaced")}if(this.options.resizable&&this.se.getStyle("background-color")!==""&&this.se.getStyle("background-color")!=="transparent"){this.options.resizableColor=new Color(this.se.getStyle("background-color"));this.se.addClass("replaced")}}if(this.options.useCanvasControls==true){if(this.minimizeButtonEl){if(this.minimizeButtonEl.getStyle("color")!==""&&this.minimizeButtonEl.getStyle("color")!=="transparent"){this.options.minimizeColor=new Color(this.minimizeButtonEl.getStyle("color"))}if(this.minimizeButtonEl.getStyle("background-color")!==""&&this.minimizeButtonEl.getStyle("background-color")!=="transparent"){this.options.minimizeBgColor=new Color(this.minimizeButtonEl.getStyle("background-color"));this.minimizeButtonEl.addClass("replaced")}}if(this.maximizeButtonEl){if(this.maximizeButtonEl.getStyle("color")!==""&&this.maximizeButtonEl.getStyle("color")!=="transparent"){this.options.maximizeColor=new Color(this.maximizeButtonEl.getStyle("color"))}if(this.maximizeButtonEl.getStyle("background-color")!==""&&this.maximizeButtonEl.getStyle("background-color")!=="transparent"){this.options.maximizeBgColor=new Color(this.maximizeButtonEl.getStyle("background-color"));this.maximizeButtonEl.addClass("replaced")}}if(this.closeButtonEl){if(this.closeButtonEl.getStyle("color")!==""&&this.closeButtonEl.getStyle("color")!=="transparent"){this.options.closeColor=new Color(this.closeButtonEl.getStyle("color"))}if(this.closeButtonEl.getStyle("background-color")!==""&&this.closeButtonEl.getStyle("background-color")!=="transparent"){this.options.closeBgColor=new Color(this.closeButtonEl.getStyle("background-color"));this.closeButtonEl.addClass("replaced")}}}},drawWindow:function(b){if(this.drawingWindow==true){return}this.drawingWindow=true;if(this.isCollapsed){this.drawWindowCollapsed(b);return}var g=this.windowEl;var m=this.options;var c=m.shadowBlur;var j=c*2;var l=this.options.shadowOffset;this.overlayEl.setStyles({width:this.contentWrapperEl.offsetWidth});if(this.iframeEl){this.iframeEl.setStyle("height",this.contentWrapperEl.offsetHeight)}var d=this.contentBorderEl.getStyle("margin-top").toInt()+this.contentBorderEl.getStyle("margin-bottom").toInt();var f=this.toolbarWrapperEl?this.toolbarWrapperEl.getStyle("height").toInt()+this.toolbarWrapperEl.getStyle("margin-top").toInt():0;var e=this.toolbar2WrapperEl?this.toolbar2WrapperEl.getStyle("height").toInt()+this.toolbar2WrapperEl.getStyle("margin-top").toInt():0;this.headerFooterShadow=m.headerHeight+m.footerHeight+j;var h=this.contentWrapperEl.getStyle("height").toInt()+this.headerFooterShadow+f+e+d;var a=this.contentWrapperEl.getStyle("width").toInt()+j;this.windowEl.setStyles({height:h,width:a});this.overlayEl.setStyles({height:h,top:c-l.y,left:c-l.x});if(this.options.useCanvas==true){if(MUI.ieLegacySupport){this.canvasEl.height=20000;this.canvasEl.width=50000}this.canvasEl.height=h;this.canvasEl.width=a}if(Browser.Engine.trident4){this.zIndexFixEl.setStyles({width:a,height:h})}this.titleBarEl.setStyles({width:a-j,height:m.headerHeight});if(m.useSpinner==true&&m.shape!="gauge"&&m.type!="notification"){this.spinnerEl.setStyles({left:c-l.x+3,bottom:c+l.y+4})}if(this.options.useCanvas!=false){var k=this.canvasEl.getContext("2d");k.clearRect(0,0,a,h);switch(m.shape){case"box":this.drawBox(k,a,h,c,l,b);break;case"gauge":this.drawGauge(k,a,h,c,l,b);break}if(m.resizable){MUI.triangle(k,a-(c+l.x+17),h-(c+l.y+18),11,11,m.resizableColor,1)}if(MUI.ieLegacySupport){MUI.triangle(k,0,0,10,10,m.resizableColor,0)}}if(m.type!="notification"&&m.useCanvasControls==true){this.drawControls(a,h,b)}if(MUI.Desktop&&this.contentWrapperEl.getChildren(".column").length!=0){MUI.rWidth(this.contentWrapperEl);this.contentWrapperEl.getChildren(".column").each(function(n){MUI.panelHeight(n)})}this.drawingWindow=false;return this},drawWindowCollapsed:function(b){var e=this.windowEl;var k=this.options;var c=k.shadowBlur;var f=c*2;var j=k.shadowOffset;var d=k.headerHeight+f+2;var g=d;var a=this.contentWrapperEl.getStyle("width").toInt()+f;this.windowEl.setStyle("height",g);this.overlayEl.setStyles({height:g,top:c-j.y,left:c-j.x});if(Browser.Engine.trident4){this.zIndexFixEl.setStyles({width:a,height:g})}this.windowEl.setStyle("width",a);this.overlayEl.setStyle("width",a);this.titleBarEl.setStyles({width:a-f,height:k.headerHeight});if(this.options.useCanvas!=false){this.canvasEl.height=g;this.canvasEl.width=a;var h=this.canvasEl.getContext("2d");h.clearRect(0,0,a,g);this.drawBoxCollapsed(h,a,g,c,j,b);if(k.useCanvasControls==true){this.drawControls(a,g,b)}if(MUI.ieLegacySupport){MUI.triangle(h,0,0,10,10,k.resizableColor,0)}}this.drawingWindow=false;return this},drawControls:function(g,e,h){var f=this.options;var d=f.shadowBlur;var c=f.shadowOffset;var b=f.controlsOffset;this.controlsEl.setStyles({right:d+c.x+b.right,top:d-c.y+b.top});this.canvasControlsEl.setStyles({right:d+c.x+b.right,top:d-c.y+b.top});this.closebuttonX=f.closable?this.mochaControlsWidth-7:this.mochaControlsWidth+12;this.maximizebuttonX=this.closebuttonX-(f.maximizable?19:0);this.minimizebuttonX=this.maximizebuttonX-(f.minimizable?19:0);var a=this.canvasControlsEl.getContext("2d");a.clearRect(0,0,100,100);if(this.options.closable){this.closebutton(a,this.closebuttonX,7,f.closeBgColor,1,f.closeColor,1)}if(this.options.maximizable){this.maximizebutton(a,this.maximizebuttonX,7,f.maximizeBgColor,1,f.maximizeColor,1)}if(this.options.minimizable){this.minimizebutton(a,this.minimizebuttonX,7,f.minimizeBgColor,1,f.minimizeColor,1)}if(MUI.ieLegacySupport){MUI.circle(a,0,0,3,this.options.resizableColor,0)}},drawBox:function(h,a,g,c,j,b){var k=this.options;var f=c*2;var d=this.options.cornerRadius;if(b!=false){for(var e=0;e<=c;e++){MUI.roundedRect(h,j.x+e,j.y+e,a-(e*2)-j.x,g-(e*2)-j.y,d+(c-e),[0,0,0],e==c?0.29:0.065+(e*0.01))}}this.bodyRoundedRect(h,c-j.x,c-j.y,a-f,g-f,d,k.bodyBgColor);if(this.options.type!="notification"){this.topRoundedRect(h,c-j.x,c-j.y,a-f,k.headerHeight,d,k.headerStartColor,k.headerStopColor)}},drawBoxCollapsed:function(h,a,g,c,j,b){var k=this.options;var f=c*2;var d=k.cornerRadius;if(b!=false){for(var e=0;e<=c;e++){MUI.roundedRect(h,j.x+e,j.y+e,a-(e*2)-j.x,g-(e*2)-j.y,d+(c-e),[0,0,0],e==c?0.3:0.06+(e*0.01))}}this.topRoundedRect2(h,c-j.x,c-j.y,a-f,k.headerHeight+2,d,k.headerStartColor,k.headerStopColor)},drawGauge:function(g,a,f,c,h,b){var j=this.options;var d=(a*0.5)-(c)+16;if(b!=false){for(var e=0;e<=c;e++){MUI.circle(g,a*0.5+h.x,(f+j.headerHeight)*0.5+h.x,(a*0.5)-(e*2)-h.x,[0,0,0],e==c?0.75:0.075+(e*0.04))}}MUI.circle(g,a*0.5-h.x,(f+j.headerHeight)*0.5-h.y,(a*0.5)-c,j.bodyBgColor,1);this.canvasHeaderEl.setStyles({top:c-h.y,left:c-h.x});var g=this.canvasHeaderEl.getContext("2d");g.clearRect(0,0,a,100);g.beginPath();g.lineWidth=24;g.lineCap="round";g.moveTo(13,13);g.lineTo(a-(c*2)-13,13);g.strokeStyle="rgba(0, 0, 0, .65)";g.stroke()},bodyRoundedRect:function(d,c,g,f,b,a,e){d.fillStyle="rgba("+e.join(",")+", 1)";d.beginPath();d.moveTo(c,g+a);d.lineTo(c,g+b-a);d.quadraticCurveTo(c,g+b,c+a,g+b);d.lineTo(c+f-a,g+b);d.quadraticCurveTo(c+f,g+b,c+f,g+b-a);d.lineTo(c+f,g+a);d.quadraticCurveTo(c+f,g,c+f-a,g);d.lineTo(c+a,g);d.quadraticCurveTo(c,g,c,g+a);d.fill()},topRoundedRect:function(j,g,f,a,h,e,c,d){var b=j.createLinearGradient(0,0,0,h);b.addColorStop(0,"rgb("+c.join(",")+")");b.addColorStop(1,"rgb("+d.join(",")+")");j.fillStyle=b;j.beginPath();j.moveTo(g,f);j.lineTo(g,f+h);j.lineTo(g+a,f+h);j.lineTo(g+a,f+e);j.quadraticCurveTo(g+a,f,g+a-e,f);j.lineTo(g+e,f);j.quadraticCurveTo(g,f,g,f+e);j.fill()},topRoundedRect2:function(j,g,f,a,h,e,c,d){if(navigator.userAgent.toLowerCase().indexOf("chrome")>-1){j.fillStyle="rgba("+d.join(",")+", 1)"}else{var b=j.createLinearGradient(0,this.options.shadowBlur-1,0,h+this.options.shadowBlur+3);b.addColorStop(0,"rgb("+c.join(",")+")");b.addColorStop(1,"rgb("+d.join(",")+")");j.fillStyle=b}j.beginPath();j.moveTo(g,f+e);j.lineTo(g,f+h-e);j.quadraticCurveTo(g,f+h,g+e,f+h);j.lineTo(g+a-e,f+h);j.quadraticCurveTo(g+a,f+h,g+a,f+h-e);j.lineTo(g+a,f+e);j.quadraticCurveTo(g+a,f,g+a-e,f);j.lineTo(g+e,f);j.quadraticCurveTo(g,f,g,f+e);j.fill()},maximizebutton:function(e,c,h,b,g,f,d){e.beginPath();e.arc(c,h,7,0,Math.PI*2,true);e.fillStyle="rgba("+b.join(",")+","+g+")";e.fill();e.strokeStyle="rgba("+f.join(",")+","+d+")";e.lineWidth=2;e.beginPath();e.moveTo(c,h-3.5);e.lineTo(c,h+3.5);e.moveTo(c-3.5,h);e.lineTo(c+3.5,h);e.stroke()},closebutton:function(e,c,h,b,g,f,d){e.beginPath();e.arc(c,h,7,0,Math.PI*2,true);e.fillStyle="rgba("+b.join(",")+","+g+")";e.fill();e.strokeStyle="rgba("+f.join(",")+","+d+")";e.lineWidth=2;e.beginPath();e.moveTo(c-3,h-3);e.lineTo(c+3,h+3);e.moveTo(c+3,h-3);e.lineTo(c-3,h+3);e.stroke()},minimizebutton:function(e,c,h,b,g,f,d){e.beginPath();e.arc(c,h,7,0,Math.PI*2,true);e.fillStyle="rgba("+b.join(",")+","+g+")";e.fill();e.strokeStyle="rgba("+f.join(",")+","+d+")";e.lineWidth=2;e.beginPath();e.moveTo(c-3.5,h);e.lineTo(c+3.5,h);e.stroke()},setMochaControlsWidth:function(){this.mochaControlsWidth=0;var a=this.options;if(a.minimizable){this.mochaControlsWidth+=(this.minimizeButtonEl.getStyle("margin-left").toInt()+this.minimizeButtonEl.getStyle("width").toInt())}if(a.maximizable){this.mochaControlsWidth+=(this.maximizeButtonEl.getStyle("margin-left").toInt()+this.maximizeButtonEl.getStyle("width").toInt())}if(a.closable){this.mochaControlsWidth+=(this.closeButtonEl.getStyle("margin-left").toInt()+this.closeButtonEl.getStyle("width").toInt())}this.controlsEl.setStyle("width",this.mochaControlsWidth);if(a.useCanvasControls==true){this.canvasControlsEl.setProperty("width",this.mochaControlsWidth)}},hideSpinner:function(){if(this.spinnerEl){this.spinnerEl.hide()}return this},showSpinner:function(){if(this.spinnerEl){this.spinnerEl.show()}return this},close:function(){if(!this.isClosing){MUI.closeWindow(this.windowEl)}return this},minimize:function(){MUI.Dock.minimizeWindow(this.windowEl);return this},maximize:function(){if(this.isMinimized){MUI.Dock.restoreMinimized(this.windowEl)}MUI.Desktop.maximizeWindow(this.windowEl);return this},restore:function(){if(this.isMinimized){MUI.Dock.restoreMinimized(this.windowEl)}else{if(this.isMaximized){MUI.Desktop.restoreWindow(this.windowEl)}}return this},resize:function(a){MUI.resizeWindow(this.windowEl,a);return this},center:function(){MUI.centerWindow(this.windowEl);return this},hide:function(){this.windowEl.setStyle("display","none");return this},show:function(){this.windowEl.setStyle("display","block");return this}});MUI.extend({closeWindow:function(c){var a=c.retrieve("instance");if(c!=$(c)||a.isClosing){return}a.isClosing=true;a.fireEvent("onClose",c);if(a.options.storeOnClose){this.storeOnClose(a,c);return}if(a.check){a.check.destroy()}if((a.options.type=="modal"||a.options.type=="modal2")&&Browser.Engine.trident4){$("modalFix").hide()}if(MUI.options.advancedEffects==false){if(a.options.type=="modal"||a.options.type=="modal2"){$("modalOverlay").setStyle("opacity",0)}MUI.closingJobs(c);return true}else{if(MUI.ieLegacySupport){a.drawWindow(false)}if(a.options.type=="modal"||a.options.type=="modal2"){MUI.Modal.modalOverlayCloseMorph.start({opacity:0})}var b=new Fx.Morph(c,{duration:120,onComplete:function(){MUI.closingJobs(c);return true}.bind(this)});b.start({opacity:0.4})}},closingJobs:function(e){var d=MUI.Windows.instances;var a=d.get(e.id);e.setStyle("visibility","hidden");if(MUI.ieLegacySupport){e.dispose()}else{e.destroy()}a.fireEvent("onCloseComplete");if(a.options.type!="notification"){var c=this.getWindowWithHighestZindex();this.focusWindow(c)}d.erase(a.options.id);if(this.loadingWorkspace==true){this.windowUnload()}if(MUI.Dock&&$(MUI.options.dock)&&a.options.type=="window"){var b=$(a.options.id+"_dockTab");if(b!=null){MUI.Dock.dockSortables.removeItems(b).destroy()}MUI.Desktop.setDesktopSize()}},storeOnClose:function(a,d){if(a.check){a.check.hide()}d.setStyles({zIndex:-1});d.addClass("windowClosed");d.removeClass("mocha");if(MUI.Dock&&$(MUI.options.dock)&&a.options.type=="window"){var c=$(a.options.id+"_dockTab");if(c!=null){c.hide()}MUI.Desktop.setDesktopSize()}a.fireEvent("onCloseComplete");if(a.options.type!="notification"){var b=this.getWindowWithHighestZindex();this.focusWindow(b)}a.isClosing=false},closeAll:function(){$$(".mocha").each(function(a){this.closeWindow(a)}.bind(this))},collapseToggle:function(c){var a=c.retrieve("instance");var b=c.getElements(".handle");if(a.isMaximized==true){return}if(a.isCollapsed==false){a.isCollapsed=true;b.hide();if(a.iframeEl){a.iframeEl.setStyle("visibility","hidden")}a.contentBorderEl.setStyles({visibility:"hidden",position:"absolute",top:-10000,left:-10000});if(a.toolbarWrapperEl){a.toolbarWrapperEl.setStyles({visibility:"hidden",position:"absolute",top:-10000,left:-10000})}a.drawWindowCollapsed()}else{a.isCollapsed=false;a.drawWindow();a.contentBorderEl.setStyles({visibility:"visible",position:null,top:null,left:null});if(a.toolbarWrapperEl){a.toolbarWrapperEl.setStyles({visibility:"visible",position:null,top:null,left:null})}if(a.iframeEl){a.iframeEl.setStyle("visibility","visible")}b.show()}},toggleWindowVisibility:function(){MUI.Windows.instances.each(function(a){if(a.options.type=="modal"||a.options.type=="modal2"||a.isMinimized==true){return}var b=$(a.options.id);if(b.getStyle("visibility")=="visible"){if(a.iframe){a.iframeEl.setStyle("visibility","hidden")}if(a.toolbarEl){a.toolbarWrapperEl.setStyle("visibility","hidden")}a.contentBorderEl.setStyle("visibility","hidden");b.setStyle("visibility","hidden");MUI.Windows.windowsVisible=false}else{b.setStyle("visibility","visible");a.contentBorderEl.setStyle("visibility","visible");if(a.iframe){a.iframeEl.setStyle("visibility","visible")}if(a.toolbarEl){a.toolbarWrapperEl.setStyle("visibility","visible")}MUI.Windows.windowsVisible=true}}.bind(this))},focusWindow:function(e,c){MUI.Windows.focusingWindow=true;var b=function(){MUI.Windows.focusingWindow=false};b.delay(170,this);if($$(".mocha").length==0){return}if(e!=$(e)||e.hasClass("isFocused")){return}var d=MUI.Windows.instances;var a=d.get(e.id);if(a.options.type=="notification"){e.setStyle("zIndex",11001);return}MUI.Windows.indexLevel+=2;e.setStyle("zIndex",MUI.Windows.indexLevel);$("windowUnderlay").setStyle("zIndex",MUI.Windows.indexLevel-1).inject($(e),"after");d.each(function(f){if(f.windowEl.hasClass("isFocused")){f.fireEvent("onBlur",f.windowEl)}f.windowEl.removeClass("isFocused")});if(MUI.Dock&&$(MUI.options.dock)&&a.options.type=="window"){MUI.Dock.makeActiveTab()}e.addClass("isFocused");if(c!=false){a.fireEvent("onFocus",e)}},getWindowWithHighestZindex:function(){this.highestZindex=0;$$(".mocha").each(function(a){this.zIndex=a.getStyle("zIndex");if(this.zIndex>=this.highestZindex){this.highestZindex=this.zIndex}}.bind(this));$$(".mocha").each(function(a){if(a.getStyle("zIndex")==this.highestZindex){this.windowWithHighestZindex=a}}.bind(this));return this.windowWithHighestZindex},blurAll:function(){if(MUI.Windows.focusingWindow==false){$$(".mocha").each(function(b){var a=b.retrieve("instance");if(a.options.type!="modal"&&a.options.type!="modal2"){b.removeClass("isFocused")}});$$(".dockTab").removeClass("activeDockTab")}},centerWindow:function(f){if(!f){MUI.Windows.instances.each(function(g){if(g.windowEl.hasClass("isFocused")){f=g.windowEl}})}var a=f.retrieve("instance");var b=a.options;var d=b.container.getCoordinates();var c=window.getScroll().y+(window.getSize().y*0.5)-(f.offsetHeight*0.5);if(c<-a.options.shadowBlur){c=-a.options.shadowBlur}var e=(d.width*0.5)-(f.offsetWidth*0.5);if(e<-a.options.shadowBlur){e=-a.options.shadowBlur}if(MUI.options.advancedEffects==true){a.morph.start({top:c,left:e})}else{f.setStyles({top:c,left:e})}},resizeWindow:function(f,j){var g=f.retrieve("instance");$extend({width:null,height:null,top:null,left:null,centered:true},j);var c=f.getStyle("width").toInt();var h=f.getStyle("height").toInt();var d=f.getStyle("top").toInt();var b=f.getStyle("left").toInt();if(j.centered){var e=j.top||d-((j.height-h)*0.5);var a=j.left||b-((j.width-c)*0.5)}else{var e=j.top||d;var a=j.left||b}if(MUI.options.advancedEffects==false){f.setStyles({top:e,left:a});g.contentWrapperEl.setStyles({height:j.height,width:j.width});g.drawWindow();if(g.iframeEl){if(!MUI.ieLegacySupport){g.iframeEl.setStyle("visibility","visible")}else{g.iframeEl.show()}}}else{f.retrieve("resizeMorph").start({"0":{height:j.height,width:j.width},"1":{top:e,left:a}})}return g},dynamicResize:function(d){var a=d.retrieve("instance");var c=a.contentWrapperEl;var b=a.contentEl;c.setStyles({height:b.offsetHeight,width:b.offsetWidth});a.drawWindow()}});document.addEvent("keydown",function(a){if(a.key=="q"&&a.control&&a.alt){MUI.toggleWindowVisibility()}});MUI.files[MUI.path.source+"Window/Modal.js"]="loaded";MUI.Modal=new Class({Extends:MUI.Window,options:{type:"modal"},initialize:function(a){if(!$("modalOverlay")){this.modalInitialize();window.addEvent("resize",function(){this.setModalSize()}.bind(this))}this.parent(a)},modalInitialize:function(){var a=new Element("div",{id:"modalOverlay",styles:{height:document.getCoordinates().height,opacity:0.6}}).inject(document.body);a.setStyles({position:Browser.Engine.trident4?"absolute":"fixed"});a.addEvent("click",function(d){var c=MUI.Windows.instances.get(MUI.currentModal.id);if(c.options.modalOverlayClose==true){MUI.closeWindow(MUI.currentModal)}});if(Browser.Engine.trident4){var b=new Element("iframe",{id:"modalFix",scrolling:"no",marginWidth:0,marginHeight:0,src:"",styles:{height:document.getCoordinates().height}}).inject(document.body)}MUI.Modal.modalOverlayOpenMorph=new Fx.Morph($("modalOverlay"),{duration:150});MUI.Modal.modalOverlayCloseMorph=new Fx.Morph($("modalOverlay"),{duration:150,onComplete:function(){$("modalOverlay").hide();if(Browser.Engine.trident4){$("modalFix").hide()}}.bind(this)})},setModalSize:function(){$("modalOverlay").setStyle("height",document.getCoordinates().height);if(Browser.Engine.trident4){$("modalFix").setStyle("height",document.getCoordinates().height)}}});MUI.files[MUI.path.source+"Window/Windows-from-html.js"]="loaded";MUI.extend({NewWindowsFromHTML:function(){$$(".mocha").each(function(b){if(Browser.Engine.presto||Browser.Engine.trident5){b.hide()}var d=b.getElement("h3.mochaTitle");if(Browser.Engine.presto){b.show()}var c=b.getStyles("height","width");var a={id:b.getProperty("id"),height:c.height.toInt(),width:c.width.toInt(),x:b.getStyle("left").toInt(),y:b.getStyle("top").toInt()};if(d){a.title=d.innerHTML;d.destroy()}a.content=b.innerHTML;b.destroy();new MUI.Window(a,true)}.bind(this))}});MUI.files[MUI.path.source+"Window/Windows-from-json.js"]="loaded";MUI.extend({newWindowsFromJSON:function(newWindows){newWindows.each(function(options){var temp=new Hash(options);temp.each(function(value,key,hash){if($type(value)!="string"){return}if(value.substring(0,8)=="function"){eval("options."+key+" = "+value)}});new MUI.Window(options)})}});MUI.files[MUI.path.source+"Window/Arrange-cascade.js"]="loaded";MUI.extend({arrangeCascade:function(){var g=30;var a=20;var k=50;var c=40;var j=document.getCoordinates();var d=0;MUI.Windows.instances.each(function(l){if(!l.isMinimized&&l.options.draggable){d++}});if((k*(d+1))>=(j.height-g)){var e=(j.height-g)/(d+1)}else{var e=k}if((c*(d+1))>=(j.width-a-20)){var b=(j.width-a-20)/(d+1)}else{var b=c}var h=a;var f=g;$$(".mocha").each(function(n){var l=n.retrieve("instance");if(!l.isMinimized&&!l.isMaximized&&l.options.draggable){id=n.id;MUI.focusWindow(n);h+=b;f+=e;if(MUI.options.advancedEffects==false){n.setStyles({top:f,left:h})}else{var m=new Fx.Morph(n,{duration:550});m.start({top:f,left:h})}}}.bind(this))}});MUI.files[MUI.path.source+"Window/Arrange-tile.js"]="loaded";MUI.extend({arrangeTile:function(){var g=30;var b=20;var j=10;var f=80;var a=MUI.Windows.instances;var l=0;a.each(function(o){if(!o.isMinimized&&!o.isMaximized){l++}});var h=3;var n=Math.ceil(l/h);var k=document.getCoordinates();var e=((k.width-b)/h);var d=((k.height-g)/n);var m=0;var c=0;a.each(function(x){if(!x.isMinimized&&!x.isMaximized&&x.options.draggable){var t=x.contentWrapperEl;var o=t.getCoordinates();var w=x.windowEl.getCoordinates();var s=o.top-w.top;var v=w.height-o.height-s;var r=o.left-w.left;var y=w.width-o.width-r;var p=(j+(c*e));var u=(f+(m*d));x.drawWindow();MUI.focusWindow(x.windowEl);if(MUI.options.advancedEffects==false){x.windowEl.setStyles({top:u,left:p})}else{var q=new Fx.Morph(x.windowEl,{duration:550});q.start({top:u,left:p})}if(++c===h){m++;c=0}}}.bind(this))}});MUI.files[MUI.path.source+"Components/Tabs.js"]="loaded";MUI.extend({initializeTabs:function(a){$(a).setStyle("list-style","none");$(a).getElements("li").addEvent("click",function(b){MUI.selected(this,a)})},selected:function(b,a){$(a).getChildren().each(function(c){c.removeClass("selected")});b.addClass("selected")}});MUI.files[MUI.path.source+"Layout/Layout.js"]="loaded";MUI.extend({Columns:{instances:new Hash(),columnIDCount:0},Panels:{instances:new Hash(),panelIDCount:0}});MUI.Desktop={options:{desktop:"desktop",desktopHeader:"desktopHeader",desktopFooter:"desktopFooter",desktopNavBar:"desktopNavbar",pageWrapper:"pageWrapper",page:"page",desktopFooter:"desktopFooterWrapper"},initialize:function(){this.desktop=$(this.options.desktop);this.desktopHeader=$(this.options.desktopHeader);this.desktopNavBar=$(this.options.desktopNavBar);this.pageWrapper=$(this.options.pageWrapper);this.page=$(this.options.page);this.desktopFooter=$(this.options.desktopFooter);if(this.desktop){($$("body")).setStyles({overflow:"hidden",height:"100%",margin:0});($$("html")).setStyles({overflow:"hidden",height:"100%"})}if(!MUI.Dock){this.setDesktopSize()}this.menuInitialize();window.addEvent("resize",function(a){this.onBrowserResize()}.bind(this));if(MUI.myChain){MUI.myChain.callChain()}},menuInitialize:function(){if(Browser.Engine.trident4&&this.desktopNavBar){this.desktopNavBar.getElements("li").each(function(a){a.addEvent("mouseenter",function(){this.addClass("ieHover")});a.addEvent("mouseleave",function(){this.removeClass("ieHover")})})}},onBrowserResize:function(){this.setDesktopSize();setTimeout(function(){MUI.Windows.instances.each(function(a){if(a.isMaximized){if(a.iframeEl){a.iframeEl.setStyle("visibility","hidden")}var d=document.getCoordinates();var b=a.contentBorderEl.getStyle("margin-top").toInt()+a.contentBorderEl.getStyle("margin-bottom").toInt();var c=a.toolbarWrapperEl?a.toolbarWrapperEl.getStyle("height").toInt()+a.toolbarWrapperEl.getStyle("margin-top").toInt():0;a.contentWrapperEl.setStyles({height:d.height-a.options.headerHeight-a.options.footerHeight-b-c,width:d.width});a.drawWindow();if(a.iframeEl){a.iframeEl.setStyles({height:a.contentWrapperEl.getStyle("height")});a.iframeEl.setStyle("visibility","visible")}}}.bind(this))}.bind(this),100)},setDesktopSize:function(){var d=window.getCoordinates();var b=$(MUI.options.dockWrapper);if(this.desktop){this.desktop.setStyle("height",d.height)}if(this.pageWrapper){var a=MUI.dockVisible?b.offsetHeight:0;var c=d.height;c-=this.pageWrapper.getStyle("margin-top").toInt();c-=this.pageWrapper.getStyle("margin-bottom").toInt();if(this.desktopHeader){c-=this.desktopHeader.offsetHeight}if(this.desktopFooter){c-=this.desktopFooter.offsetHeight}c-=a;if(c<0){c=0}this.pageWrapper.setStyle("height",c)}if(MUI.Columns.instances.getKeys().length>0){MUI.Desktop.resizePanels()}},resizePanels:function(){MUI.panelHeight();MUI.rWidth()},maximizeWindow:function(f){var g=MUI.Windows.instances.get(f.id);var j=g.options;var c=g.windowDrag;if(f!=$(f)||g.isMaximized){return}if(g.isCollapsed){MUI.collapseToggle(f)}g.isMaximized=true;if(g.options.restrict){c.detach();if(j.resizable){g.detachResizable()}g.titleBarEl.setStyle("cursor","default")}if(j.container!=this.desktop){this.desktop.grab(f);if(this.options.restrict){c.container=this.desktop}}g.oldTop=f.getStyle("top");g.oldLeft=f.getStyle("left");var d=g.contentWrapperEl;d.oldWidth=d.getStyle("width");d.oldHeight=d.getStyle("height");if(g.iframeEl){if(!MUI.ieLegacySupport){g.iframeEl.setStyle("visibility","hidden")}else{g.iframeEl.hide()}}var b=document.getCoordinates();var j=g.options;var e=j.shadowBlur;var h=j.shadowOffset;var a=b.height-j.headerHeight-j.footerHeight;a-=g.contentBorderEl.getStyle("margin-top").toInt();a-=g.contentBorderEl.getStyle("margin-bottom").toInt();a-=(g.toolbarWrapperEl?g.toolbarWrapperEl.getStyle("height").toInt()+g.toolbarWrapperEl.getStyle("margin-top").toInt():0);MUI.resizeWindow(f,{width:b.width,height:a,top:h.y-e,left:h.x-e});g.fireEvent("onMaximize",f);if(g.maximizeButtonEl){g.maximizeButtonEl.setProperty("title","Restore")}MUI.focusWindow(f)},restoreWindow:function(d){var a=d.retrieve("instance");if(d!=$(d)||!a.isMaximized){return}var b=a.options;a.isMaximized=false;if(b.restrict){a.windowDrag.attach();if(b.resizable){a.reattachResizable()}a.titleBarEl.setStyle("cursor","move")}if(a.iframeEl){if(!MUI.ieLegacySupport){a.iframeEl.setStyle("visibility","hidden")}else{a.iframeEl.hide()}}var c=a.contentWrapperEl;MUI.resizeWindow(d,{width:c.oldWidth,height:c.oldHeight,top:a.oldTop,left:a.oldLeft});a.fireEvent("onRestore",d);if(a.maximizeButtonEl){a.maximizeButtonEl.setProperty("title","Maximize")}}};MUI.Column=new Class({Implements:[Events,Options],options:{id:null,container:null,placement:null,width:null,resizeLimit:[],sortable:true,onResize:$empty,onCollapse:$empty,onExpand:$empty},initialize:function(b){this.setOptions(b);$extend(this,{timestamp:$time(),isCollapsed:false,oldWidth:0});if(this.options.id==null){this.options.id="column"+(++MUI.Columns.columnIDCount)}var b=this.options;var g=MUI.Columns.instances;var d=g.get(b.id);if(b.container==null){b.container=MUI.Desktop.pageWrapper}else{$(b.container).setStyle("overflow","hidden")}if(typeof this.options.container=="string"){this.options.container=$(this.options.container)}if(d){var a=d}if(this.columnEl){return}else{g.set(b.id,this)}if($(b.container).getElement(".pad")!=null){$(b.container).getElement(".pad").hide()}if($(b.container).getElement(".mochaContent")!=null){$(b.container).getElement(".mochaContent").hide()}this.columnEl=new Element("div",{id:this.options.id,"class":"column expanded",styles:{width:b.placement=="main"?null:b.width}}).inject($(b.container));this.columnEl.store("instance",this);var c=this.columnEl.getParent();var f=c.getStyle("height").toInt();this.columnEl.setStyle("height",f);if(this.options.sortable){if(!this.options.container.retrieve("sortables")){var e=new Sortables(this.columnEl,{opacity:1,handle:".panel-header",constrain:false,revert:false,onSort:function(){$$(".column").each(function(h){h.getChildren(".panelWrapper").each(function(j){j.getElement(".panel").removeClass("bottomPanel")});if(h.getChildren(".panelWrapper").getLast()){h.getChildren(".panelWrapper").getLast().getElement(".panel").addClass("bottomPanel")}MUI.panelHeight()}.bind(this))}.bind(this)});this.options.container.store("sortables",e)}else{this.options.container.retrieve("sortables").addLists(this.columnEl)}}if(b.placement=="main"){this.columnEl.addClass("rWidth")}switch(this.options.placement){case"left":this.handleEl=new Element("div",{id:this.options.id+"_handle","class":"columnHandle"}).inject(this.columnEl,"after");this.handleIconEl=new Element("div",{id:b.id+"_handle_icon","class":"handleIcon"}).inject(this.handleEl);addResizeRight(this.columnEl,b.resizeLimit[0],b.resizeLimit[1]);break;case"right":this.handleEl=new Element("div",{id:this.options.id+"_handle","class":"columnHandle"}).inject(this.columnEl,"before");this.handleIconEl=new Element("div",{id:b.id+"_handle_icon","class":"handleIcon"}).inject(this.handleEl);addResizeLeft(this.columnEl,b.resizeLimit[0],b.resizeLimit[1]);break}if(this.handleEl!=null){this.handleEl.addEvent("dblclick",function(){this.columnToggle()}.bind(this))}MUI.rWidth()},columnToggle:function(){var a=this.columnEl;if(this.isCollapsed==false){this.oldWidth=a.getStyle("width").toInt();this.resize.detach();this.handleEl.removeEvents("dblclick");this.handleEl.addEvent("click",function(){this.columnToggle()}.bind(this));this.handleEl.setStyle("cursor","pointer").addClass("detached");a.setStyle("width",0);this.isCollapsed=true;a.addClass("collapsed");a.removeClass("expanded");MUI.rWidth();this.fireEvent("onCollapse")}else{a.setStyle("width",this.oldWidth);this.isCollapsed=false;a.addClass("expanded");a.removeClass("collapsed");this.handleEl.removeEvents("click");this.handleEl.addEvent("dblclick",function(){this.columnToggle()}.bind(this));this.resize.attach();this.handleEl.setStyle("cursor",(Browser.Engine.webkit||Browser.Engine.gecko)?"col-resize":"e-resize").addClass("attached");MUI.rWidth();this.fireEvent("onExpand")}}});MUI.Column.implement(new Options,new Events);MUI.Panel=new Class({Implements:[Events,Options],options:{id:null,title:"New Panel",column:null,require:{css:[],images:[],js:[],onload:null},loadMethod:null,contentURL:null,method:"get",data:null,evalScripts:true,evalResponse:false,content:"Panel content",tabsURL:null,tabsData:null,tabsOnload:$empty,header:true,headerToolbox:false,headerToolboxURL:"pages/lipsum.html",headerToolboxOnload:$empty,height:125,addClass:"",scrollbars:true,padding:{top:8,right:8,bottom:8,left:8},collapsible:true,onBeforeBuild:$empty,onContentLoaded:$empty,onResize:$empty,onCollapse:$empty,onExpand:$empty},initialize:function(b){this.setOptions(b);$extend(this,{timestamp:$time(),isCollapsed:false,oldHeight:0,partner:null});if(this.options.id==null){this.options.id="panel"+(++MUI.Panels.panelIDCount)}var f=MUI.Panels.instances;var c=f.get(this.options.id);var b=this.options;if(c){var a=c}if(this.panelEl){return}else{f.set(this.options.id,this)}this.fireEvent("onBeforeBuild");if(b.loadMethod=="iframe"){b.padding={top:0,right:0,bottom:0,left:0}}this.showHandle=true;if($(b.column).getChildren().length==0){this.showHandle=false}this.panelWrapperEl=new Element("div",{id:this.options.id+"_wrapper","class":"panelWrapper expanded"}).inject($(b.column));this.panelEl=new Element("div",{id:this.options.id,"class":"panel expanded",styles:{height:b.height}}).inject(this.panelWrapperEl);this.panelEl.store("instance",this);this.panelEl.addClass(b.addClass);this.contentEl=new Element("div",{id:b.id+"_pad","class":"pad"}).inject(this.panelEl);this.contentWrapperEl=this.panelEl;this.contentEl.setStyles({"padding-top":b.padding.top,"padding-bottom":b.padding.bottom,"padding-left":b.padding.left,"padding-right":b.padding.right});this.panelHeaderEl=new Element("div",{id:this.options.id+"_header","class":"panel-header",styles:{display:b.header?"block":"none"}}).inject(this.panelEl,"before");var d=MUI.Columns.instances;var e=d.get(this.options.column);if(e.options.sortable){this.panelHeaderEl.setStyle("cursor","move");e.options.container.retrieve("sortables").addItems(this.panelWrapperEl)}if(this.options.collapsible){this.collapseToggleInit()}if(this.options.headerToolbox){this.panelHeaderToolboxEl=new Element("div",{id:b.id+"_headerToolbox","class":"panel-header-toolbox"}).inject(this.panelHeaderEl)}this.panelHeaderContentEl=new Element("div",{id:b.id+"_headerContent","class":"panel-headerContent"}).inject(this.panelHeaderEl);this.titleEl=new Element("h2",{id:b.id+"_title"}).inject(this.panelHeaderContentEl);this.handleEl=new Element("div",{id:b.id+"_handle","class":"horizontalHandle",styles:{display:this.showHandle==true?"block":"none"}}).inject(this.panelEl,"after");this.handleIconEl=new Element("div",{id:b.id+"_handle_icon","class":"handleIcon"}).inject(this.handleEl);addResizeBottom(b.id);if(b.require.css.length||b.require.images.length){new MUI.Require({css:b.require.css,images:b.require.images,onload:function(){this.newPanel()}.bind(this)})}else{this.newPanel()}},newPanel:function(){options=this.options;if(this.options.headerToolbox){MUI.updateContent({element:this.panelEl,childElement:this.panelHeaderToolboxEl,loadMethod:"xhr",url:options.headerToolboxURL,onContentLoaded:options.headerToolboxOnload})}if(options.tabsURL==null){this.titleEl.set("html",options.title)}else{this.panelHeaderContentEl.addClass("tabs");MUI.updateContent({element:this.panelEl,childElement:this.panelHeaderContentEl,loadMethod:"xhr",url:options.tabsURL,data:options.tabsData,onContentLoaded:options.tabsOnload})}MUI.updateContent({element:this.panelEl,content:options.content,method:options.method,data:options.data,url:options.contentURL,onContentLoaded:null,require:{js:options.require.js,onload:options.require.onload}});$(options.column).getChildren(".panelWrapper").each(function(a){a.getElement(".panel").removeClass("bottomPanel")});$(options.column).getChildren(".panelWrapper").getLast().getElement(".panel").addClass("bottomPanel");MUI.panelHeight(options.column,this.panelEl,"new")},collapseToggleInit:function(a){var a=this.options;this.panelHeaderCollapseBoxEl=new Element("div",{id:a.id+"_headerCollapseBox","class":"toolbox"}).inject(this.panelHeaderEl);if(a.headerToolbox){this.panelHeaderCollapseBoxEl.addClass("divider")}this.collapseToggleEl=new Element("div",{id:a.id+"_collapseToggle","class":"panel-collapse icon16",styles:{width:16,height:16},title:"Collapse Panel"}).inject(this.panelHeaderCollapseBoxEl);this.collapseToggleEl.addEvent("click",function(f){var b=this.panelEl;var c=this.panelWrapperEl;var g=MUI.Panels.instances;var e=[];c.getAllPrevious(".panelWrapper").each(function(j){var h=g.get(j.getElement(".panel").id);if(h.isCollapsed==false){e.push(j.getElement(".panel").id)}});c.getAllNext(".panelWrapper").each(function(j){var h=g.get(j.getElement(".panel").id);if(h.isCollapsed==false){e.push(j.getElement(".panel").id)}});if(this.isCollapsed==false){var d=MUI.Columns.instances.get($(a.column).id);if(e.length==0&&d.options.placement!="main"){var d=MUI.Columns.instances.get($(a.column).id);d.columnToggle();return}else{if(e.length==0&&d.options.placement=="main"){return}}this.oldHeight=b.getStyle("height").toInt();if(this.oldHeight<10){this.oldHeight=20}this.contentEl.setStyle("position","absolute");b.setStyle("height",0);this.isCollapsed=true;c.addClass("collapsed");c.removeClass("expanded");MUI.panelHeight(a.column,b,"collapsing");MUI.panelHeight();this.collapseToggleEl.removeClass("panel-collapsed");this.collapseToggleEl.addClass("panel-expand");this.collapseToggleEl.setProperty("title","Expand Panel");this.fireEvent("onCollapse")}else{this.contentEl.setStyle("position",null);b.setStyle("height",this.oldHeight);this.isCollapsed=false;c.addClass("expanded");c.removeClass("collapsed");MUI.panelHeight(this.options.column,b,"expanding");MUI.panelHeight();this.collapseToggleEl.removeClass("panel-expand");this.collapseToggleEl.addClass("panel-collapsed");this.collapseToggleEl.setProperty("title","Collapse Panel");this.fireEvent("onExpand")}}.bind(this))}});MUI.Panel.implement(new Options,new Events);MUI.extend({panelHeight:function(a,c,b){if(a!=null){MUI.panelHeight2($(a),c,b)}else{$$(".column").each(function(d){MUI.panelHeight2(d)}.bind(this))}},panelHeight2:function(e,m,f){var b=MUI.Panels.instances;var j=e.getParent();var h=j.getStyle("height").toInt();if(Browser.Engine.trident4&&j==MUI.Desktop.pageWrapper){h-=1}e.setStyle("height",h);var g=[];e.getChildren(".panelWrapper").each(function(n){g.push(n.getElement(".panel"))}.bind(this));var k=[];e.getChildren(".expanded").each(function(n){k.push(n.getElement(".panel"))}.bind(this));var c=[];var d;var a=0;this.panelsTotalHeight=0;this.height=0;g.each(function(n){instance=b.get(n.id);if(n.getParent().hasClass("expanded")&&n.getParent().getNext(".expanded")){instance.partner=n.getParent().getNext(".expanded").getElement(".panel");instance.resize.attach();instance.handleEl.setStyles({display:"block",cursor:(Browser.Engine.webkit||Browser.Engine.gecko)?"row-resize":"n-resize"}).removeClass("detached")}else{instance.resize.detach();instance.handleEl.setStyles({display:"none",cursor:null}).addClass("detached")}if(n.getParent().getNext(".panelWrapper")==null){instance.handleEl.hide()}}.bind(this));e.getChildren().each(function(n){n.getChildren().each(function(p){if(p.hasClass("panel")){var o=b.get(p.id);anyNextSiblingsExpanded=function(q){var r;q.getParent().getAllNext(".panelWrapper").each(function(s){var t=b.get(s.getElement(".panel").id);if(t.isCollapsed==false){r=true}}.bind(this));return r}.bind(this);anyExpandingNextSiblingsExpanded=function(q){var r;m.getParent().getAllNext(".panelWrapper").each(function(s){var t=b.get(s.getElement(".panel").id);if(t.isCollapsed==false){r=true}}.bind(this));return r}.bind(this);anyNextContainsChanging=function(r){var q=[];r.getParent().getAllNext(".panelWrapper").each(function(t){q.push(t.getElement(".panel"))}.bind(this));var s=q.contains(m);return s}.bind(this);nextExpandedChanging=function(q){var r;if(q.getParent().getNext(".expanded")){if(q.getParent().getNext(".expanded").getElement(".panel")==m){r=true}}return r};if(f=="new"){if(!o.isCollapsed&&p!=m){c.push(p);this.panelsTotalHeight+=p.offsetHeight.toInt()}}else{if(f==null||f=="collapsing"){if(!o.isCollapsed&&(!anyNextContainsChanging(p)||!anyNextSiblingsExpanded(p))){c.push(p);this.panelsTotalHeight+=p.offsetHeight.toInt()}}else{if(f=="expanding"&&!o.isCollapsed&&p!=m){if(!anyNextContainsChanging(p)||(!anyExpandingNextSiblingsExpanded(p)&&nextExpandedChanging(p))){c.push(p);this.panelsTotalHeight+=p.offsetHeight.toInt()}}}}if(p.style.height){this.height+=p.getStyle("height").toInt()}}else{this.height+=p.offsetHeight.toInt()}}.bind(this))}.bind(this));var l=e.offsetHeight.toInt()-this.height;this.height=0;e.getChildren().each(function(n){this.height+=n.offsetHeight.toInt()}.bind(this));var l=e.offsetHeight.toInt()-this.height;c.each(function(n){var q=this.panelsTotalHeight/n.offsetHeight.toInt();var p=n.getStyle("height").toInt();var o=l/q;if(!isNaN(p)){o+=p}if(o<1){o=0}n.setStyle("height",o)}.bind(this));this.height=0;e.getChildren().each(function(n){n.getChildren().each(function(o){this.height+=o.offsetHeight.toInt();if(o.hasClass("panel")&&o.getStyle("height").toInt()>a){d=o;a=o.getStyle("height").toInt()}}.bind(this))}.bind(this));var l=e.offsetHeight.toInt()-this.height;if(l!=0&&a>0){d.setStyle("height",d.getStyle("height").toInt()+l);if(d.getStyle("height")<1){d.setStyle("height",0)}}j.getChildren(".columnHandle").each(function(p){var o=p.getParent();if(o.getStyle("height").toInt()<1){return}var n=o.getStyle("height").toInt()-p.getStyle("margin-top").toInt()-p.getStyle("margin-bottom").toInt();if(Browser.Engine.trident4&&o==MUI.Desktop.pageWrapper){n-=1}p.setStyle("height",n)});k.each(function(n){MUI.resizeChildren(n)}.bind(this))},resizeChildren:function(b){var d=MUI.Panels.instances;var a=d.get(b.id);var c=a.contentWrapperEl;if(a.iframeEl){if(!MUI.ieLegacySupport){a.iframeEl.setStyles({height:c.getStyle("height"),width:c.offsetWidth-c.getStyle("margin-left").toInt()-c.getStyle("margin-right").toInt()})}else{a.iframeEl.setStyles({height:c.getStyle("height"),width:c.offsetWidth-c.getStyle("margin-left").toInt()-c.getStyle("margin-right").toInt()-1});a.iframeEl.setStyles({width:c.offsetWidth-c.getStyle("margin-left").toInt()-c.getStyle("margin-right").toInt()})}}},rWidth:function(a){if(a==null){var a=MUI.Desktop.desktop}a.getElements(".rWidth").each(function(e){var b=e.offsetWidth.toInt();b-=e.getStyle("margin-left").toInt();b-=e.getStyle("margin-right").toInt();var d=e.getParent();this.width=0;d.getChildren().each(function(g){if(g.hasClass("mocha")!=true){this.width+=g.offsetWidth.toInt()}}.bind(this));var c=d.offsetWidth.toInt()-this.width;var f=b+c;if(f<1){f=0}e.setStyle("width",f);e.getChildren(".panel").each(function(g){g.setStyle("width",f-g.getStyle("margin-left").toInt()-g.getStyle("margin-right").toInt());MUI.resizeChildren(g)}.bind(this))})}});function addResizeRight(d,c,b){if(!$(d)){return}d=$(d);var f=MUI.Columns.instances;var a=f.get(d.id);var e=d.getNext(".columnHandle");e.setStyle("cursor",(Browser.Engine.webkit||Browser.Engine.gecko)?"col-resize":"e-resize");if(!c){c=50}if(!b){b=250}if(MUI.ieLegacySupport){e.addEvents({mousedown:function(){e.setCapture()},mouseup:function(){e.releaseCapture()}})}a.resize=d.makeResizable({handle:e,modifiers:{x:"width",y:false},limit:{x:[c,b]},onStart:function(){d.getElements("iframe").setStyle("visibility","hidden");d.getNext(".column").getElements("iframe").setStyle("visibility","hidden")}.bind(this),onDrag:function(){MUI.rWidth(d.getParent());if(Browser.Engine.trident4){d.getChildren().each(function(h){var g=$(d).getStyle("width").toInt();g-=h.getStyle("margin-right").toInt();g-=h.getStyle("margin-left").toInt();g-=h.getStyle("padding-right").toInt();g-=h.getStyle("padding-left").toInt();h.setStyle("width",g)}.bind(this))}}.bind(this),onComplete:function(){MUI.rWidth(d.getParent());d.getElements("iframe").setStyle("visibility","visible");d.getNext(".column").getElements("iframe").setStyle("visibility","visible");a.fireEvent("onResize")}.bind(this)})}function addResizeLeft(d,c,b){if(!$(d)){return}d=$(d);var g=MUI.Columns.instances;var a=g.get(d.id);var f=d.getPrevious(".columnHandle");f.setStyle("cursor",(Browser.Engine.webkit||Browser.Engine.gecko)?"col-resize":"e-resize");var e=d.getPrevious(".column");if(!c){c=50}if(!b){b=250}if(MUI.ieLegacySupport){f.addEvents({mousedown:function(){f.setCapture()},mouseup:function(){f.releaseCapture()}})}a.resize=d.makeResizable({handle:f,modifiers:{x:"width",y:false},invert:true,limit:{x:[c,b]},onStart:function(){$(d).getElements("iframe").setStyle("visibility","hidden");e.getElements("iframe").setStyle("visibility","hidden")}.bind(this),onDrag:function(){MUI.rWidth(d.getParent())}.bind(this),onComplete:function(){MUI.rWidth(d.getParent());$(d).getElements("iframe").setStyle("visibility","visible");e.getElements("iframe").setStyle("visibility","visible");a.fireEvent("onResize")}.bind(this)})}function addResizeBottom(b){if(!$(b)){return}var b=$(b);var d=MUI.Panels.instances;var a=d.get(b.id);var c=a.handleEl;c.setStyle("cursor",(Browser.Engine.webkit||Browser.Engine.gecko)?"row-resize":"n-resize");partner=a.partner;min=0;max=function(){return b.getStyle("height").toInt()+partner.getStyle("height").toInt()}.bind(this);if(MUI.ieLegacySupport){c.addEvents({mousedown:function(){c.setCapture()},mouseup:function(){c.releaseCapture()}})}a.resize=b.makeResizable({handle:c,modifiers:{x:false,y:"height"},limit:{y:[min,max]},invert:false,onBeforeStart:function(){partner=a.partner;this.originalHeight=b.getStyle("height").toInt();this.partnerOriginalHeight=partner.getStyle("height").toInt()}.bind(this),onStart:function(){if(a.iframeEl){if(!MUI.ieLegacySupport){a.iframeEl.setStyle("visibility","hidden");partner.getElements("iframe").setStyle("visibility","hidden")}else{a.iframeEl.hide();partner.getElements("iframe").hide()}}}.bind(this),onDrag:function(){partnerHeight=partnerOriginalHeight;partnerHeight+=(this.originalHeight-b.getStyle("height").toInt());partner.setStyle("height",partnerHeight);MUI.resizeChildren(b,b.getStyle("height").toInt());MUI.resizeChildren(partner,partnerHeight);b.getChildren(".column").each(function(e){MUI.panelHeight(e)});partner.getChildren(".column").each(function(e){MUI.panelHeight(e)})}.bind(this),onComplete:function(){partnerHeight=partnerOriginalHeight;partnerHeight+=(this.originalHeight-b.getStyle("height").toInt());partner.setStyle("height",partnerHeight);MUI.resizeChildren(b,b.getStyle("height").toInt());MUI.resizeChildren(partner,partnerHeight);b.getChildren(".column").each(function(f){MUI.panelHeight(f)});partner.getChildren(".column").each(function(f){MUI.panelHeight(f)});if(a.iframeEl){if(!MUI.ieLegacySupport){a.iframeEl.setStyle("visibility","visible");partner.getElements("iframe").setStyle("visibility","visible")}else{a.iframeEl.show();partner.getElements("iframe").show();var e=a.iframeEl.getStyle("width").toInt();a.iframeEl.setStyle("width",e-1);MUI.rWidth();a.iframeEl.setStyle("width",e)}}a.fireEvent("onResize")}.bind(this)})}MUI.extend({closeColumn:function(b){var d=MUI.Columns.instances;var a=d.get(b.id);if(b!=$(b)||a.isClosing){return}a.isClosing=true;if(a.options.sortable){a.container.retrieve("sortables").removeLists(this.columnEl)}var c=b.getChildren(".panel");c.each(function(e){MUI.closePanel($(e.id))}.bind(this));if(MUI.ieLegacySupport){b.dispose();if(a.handleEl!=null){a.handleEl.dispose()}}else{b.destroy();if(a.handleEl!=null){a.handleEl.destroy()}}if(MUI.Desktop){MUI.Desktop.resizePanels()}d.erase(a.options.id);return true},closePanel:function(f){var e=MUI.Panels.instances;var a=e.get(f.id);if(f!=$(f)||a.isClosing){return}var b=a.options.column;a.isClosing=true;var c=MUI.Columns.instances;var d=c.get(b);if(d.options.sortable){d.options.container.retrieve("sortables").removeItems(a.panelWrapperEl)}a.panelWrapperEl.destroy();if(MUI.Desktop){MUI.Desktop.resizePanels()}$(b).getChildren(".panelWrapper").each(function(g){g.getElement(".panel").removeClass("bottomPanel")});$(b).getChildren(".panelWrapper").getLast().getElement(".panel").addClass("bottomPanel");e.erase(a.options.id);return true}});MUI.files[MUI.path.source+"Layout/Dock.js"]="loaded";MUI.options.extend({dockWrapper:"dockWrapper",dock:"dock"});MUI.extend({minimizeAll:function(){$$(".mocha").each(function(b){var a=b.retrieve("instance");if(!a.isMinimized&&a.options.minimizable==true){MUI.Dock.minimizeWindow(b)}}.bind(this))}});MUI.Dock={options:{useControls:true,dockPosition:"bottom",trueButtonColor:[70,245,70],enabledButtonColor:[115,153,191],disabledButtonColor:[170,170,170]},initialize:function(a){if(!MUI.Desktop){return}MUI.dockVisible=true;this.dockWrapper=$(MUI.options.dockWrapper);this.dock=$(MUI.options.dock);this.autoHideEvent=null;this.dockAutoHide=false;if(!this.dockWrapper){return}if(!this.options.useControls){if($("dockPlacement")){$("dockPlacement").setStyle("cursor","default")}if($("dockAutoHide")){$("dockAutoHide").setStyle("cursor","default")}}this.dockWrapper.setStyles({display:"block",position:"absolute",top:null,bottom:MUI.Desktop.desktopFooter?MUI.Desktop.desktopFooter.offsetHeight:0,left:0});if(this.options.useControls){this.initializeDockControls()}if($("dockLinkCheck")){this.sidebarCheck=new Element("div",{"class":"check",id:"dock_check"}).inject($("dockLinkCheck"))}this.dockSortables=new Sortables("#dockSort",{opacity:1,constrain:true,clone:false,revert:false});MUI.Desktop.setDesktopSize();if(MUI.myChain){MUI.myChain.callChain()}},initializeDockControls:function(){this.setDockColors();if(this.options.useControls){var b=new Element("canvas",{id:"dockCanvas",width:"15",height:"18"}).inject(this.dock);if(MUI.ieLegacySupport&&MUI.ieSupport=="excanvas"){G_vmlCanvasManager.initElement(b)}}var a=$("dockPlacement");var c=$("dockAutoHide");a.setProperty("title","Position Dock Top");a.addEvent("click",function(){this.moveDock()}.bind(this));c.setProperty("title","Turn Auto Hide On");c.addEvent("click",function(e){if(this.dockWrapper.getProperty("dockPosition")=="top"){return false}var d=$("dockCanvas").getContext("2d");this.dockAutoHide=!this.dockAutoHide;if(this.dockAutoHide){$("dockAutoHide").setProperty("title","Turn Auto Hide Off");MUI.circle(d,5,14,3,this.options.trueButtonColor,1);this.autoHideEvent=function(g){if(!this.dockAutoHide){return}if(!MUI.Desktop.desktopFooter){var f=this.dockWrapper.offsetHeight;if(f<25){f=25}}else{if(MUI.Desktop.desktopFooter){var f=this.dockWrapper.offsetHeight+MUI.Desktop.desktopFooter.offsetHeight;if(f<25){f=25}}}if(!MUI.Desktop.desktopFooter&&g.client.y>(document.getCoordinates().height-f)){if(!MUI.dockVisible){this.dockWrapper.show();MUI.dockVisible=true;MUI.Desktop.setDesktopSize()}}else{if(MUI.Desktop.desktopFooter&&g.client.y>(document.getCoordinates().height-f)){if(!MUI.dockVisible){this.dockWrapper.show();MUI.dockVisible=true;MUI.Desktop.setDesktopSize()}}else{if(MUI.dockVisible){this.dockWrapper.hide();MUI.dockVisible=false;MUI.Desktop.setDesktopSize()}}}}.bind(this);document.addEvent("mousemove",this.autoHideEvent)}else{$("dockAutoHide").setProperty("title","Turn Auto Hide On");MUI.circle(d,5,14,3,this.options.enabledButtonColor,1);document.removeEvent("mousemove",this.autoHideEvent)}}.bind(this));this.renderDockControls();if(this.options.dockPosition=="top"){this.moveDock()}},setDockColors:function(){var c=MUI.getCSSRule(".dockButtonEnabled");if(c&&c.style.backgroundColor){this.options.enabledButtonColor=new Color(c.style.backgroundColor)}var a=MUI.getCSSRule(".dockButtonDisabled");if(a&&a.style.backgroundColor){this.options.disabledButtonColor=new Color(a.style.backgroundColor)}var b=MUI.getCSSRule(".dockButtonTrue");if(b&&b.style.backgroundColor){this.options.trueButtonColor=new Color(b.style.backgroundColor)}},renderDockControls:function(){var a=$("dockCanvas").getContext("2d");a.clearRect(0,0,100,100);MUI.circle(a,5,4,3,this.options.enabledButtonColor,1);if(this.dockWrapper.getProperty("dockPosition")=="top"){MUI.circle(a,5,14,3,this.options.disabledButtonColor,1)}else{if(this.dockAutoHide){MUI.circle(a,5,14,3,this.options.trueButtonColor,1)}else{MUI.circle(a,5,14,3,this.options.enabledButtonColor,1)}}},moveDock:function(){var a=$("dockCanvas").getContext("2d");if(this.dockWrapper.getStyle("position")!="relative"){this.dockWrapper.setStyles({position:"relative",bottom:null});this.dockWrapper.addClass("top");MUI.Desktop.setDesktopSize();this.dockWrapper.setProperty("dockPosition","top");a.clearRect(0,0,100,100);MUI.circle(a,5,4,3,this.options.enabledButtonColor,1);MUI.circle(a,5,14,3,this.options.disabledButtonColor,1);$("dockPlacement").setProperty("title","Position Dock Bottom");$("dockAutoHide").setProperty("title","Auto Hide Disabled in Top Dock Position");this.dockAutoHide=false}else{this.dockWrapper.setStyles({position:"absolute",bottom:MUI.Desktop.desktopFooter?MUI.Desktop.desktopFooter.offsetHeight:0});this.dockWrapper.removeClass("top");MUI.Desktop.setDesktopSize();this.dockWrapper.setProperty("dockPosition","bottom");a.clearRect(0,0,100,100);MUI.circle(a,5,4,3,this.options.enabledButtonColor,1);MUI.circle(a,5,14,3,this.options.enabledButtonColor,1);$("dockPlacement").setProperty("title","Position Dock Top");$("dockAutoHide").setProperty("title","Turn Auto Hide On")}},createDockTab:function(e){var a=e.retrieve("instance");var d=new Element("div",{id:a.options.id+"_dockTab","class":"dockTab",title:b}).inject($("dockClear"),"before");d.addEvent("mousedown",function(f){new Event(f).stop();this.timeDown=$time()});d.addEvent("mouseup",function(f){this.timeUp=$time();if((this.timeUp-this.timeDown)<275){if(MUI.Windows.windowsVisible==false){MUI.toggleWindowVisibility();if(a.isMinimized==true){MUI.Dock.restoreMinimized.delay(25,MUI.Dock,e)}else{MUI.focusWindow(e)}return}if(a.isMinimized==true){MUI.Dock.restoreMinimized.delay(25,MUI.Dock,e)}else{if(a.windowEl.hasClass("isFocused")&&a.options.minimizable==true){MUI.Dock.minimizeWindow(e)}else{MUI.focusWindow(e)}var g=document.getCoordinates();if(e.getStyle("left").toInt()>g.width||e.getStyle("top").toInt()>g.height){MUI.centerWindow(e)}}}});this.dockSortables.addItems(d);var b=a.titleEl.innerHTML;var c=new Element("div",{id:a.options.id+"_dockTabText","class":"dockText"}).set("html",b.substring(0,19)+(b.length>19?"...":"")).inject($(d));if(a.options.icon!=false){}MUI.Desktop.setDesktopSize()},makeActiveTab:function(){var c=MUI.getWindowWithHighestZindex();var a=c.retrieve("instance");$$(".dockTab").removeClass("activeDockTab");if(a.isMinimized!=true){a.windowEl.addClass("isFocused");var b=$(a.options.id+"_dockTab");if(b!=null){b.addClass("activeDockTab")}}else{a.windowEl.removeClass("isFocused")}},minimizeWindow:function(b){if(b!=$(b)){return}var a=b.retrieve("instance");a.isMinimized=true;if(a.iframeEl){if(!MUI.ieLegacySupport){a.iframeEl.setStyle("visibility","hidden")}else{a.iframeEl.hide()}}a.contentBorderEl.setStyle("visibility","hidden");if(a.toolbarWrapperEl){a.toolbarWrapperEl.hide()}b.setStyle("visibility","hidden");MUI.Desktop.setDesktopSize();setTimeout(function(){b.setStyle("zIndex",1);b.removeClass("isFocused");this.makeActiveTab()}.bind(this),100);a.fireEvent("onMinimize",b)},restoreMinimized:function(b){var a=b.retrieve("instance");if(a.isMinimized==false){return}if(MUI.Windows.windowsVisible==false){MUI.toggleWindowVisibility()}MUI.Desktop.setDesktopSize();if(a.options.scrollbars==true&&!a.iframeEl){a.contentWrapperEl.setStyle("overflow","auto")}if(a.isCollapsed){MUI.collapseToggle(b)}b.setStyle("visibility","visible");a.contentBorderEl.setStyle("visibility","visible");if(a.toolbarWrapperEl){a.toolbarWrapperEl.show()}if(a.iframeEl){if(!MUI.ieLegacySupport){a.iframeEl.setStyle("visibility","visible")}else{a.iframeEl.show()}}a.isMinimized=false;MUI.focusWindow(b);a.fireEvent("onRestore",b)}};MUI.files[MUI.path.source+"Layout/Workspaces.js"]="loaded";MUI.extend({saveWorkspace:function(){this.cookie=new Hash.Cookie("mochaUIworkspaceCookie",{duration:3600});this.cookie.empty();MUI.Windows.instances.each(function(a){a.saveValues();this.cookie.set(a.options.id,{id:a.options.id,top:a.options.y,left:a.options.x,width:a.contentWrapperEl.getStyle("width").toInt(),height:a.contentWrapperEl.getStyle("height").toInt()})}.bind(this));this.cookie.save();new MUI.Window({loadMethod:"html",type:"notification",addClass:"notification",content:"Workspace saved.",closeAfter:"1400",width:200,height:40,y:53,padding:{top:10,right:12,bottom:10,left:12},shadowBlur:5,bodyBgColor:[255,255,255]})},windowUnload:function(){if($$(".mocha").length==0&&this.myChain){this.myChain.callChain()}},loadWorkspace2:function(workspaceWindows){workspaceWindows.each(function(workspaceWindow){windowFunction=eval("MUI."+workspaceWindow.id+"Window");if(windowFunction){eval("MUI."+workspaceWindow.id+"Window({width:"+workspaceWindow.width+",height:"+workspaceWindow.height+"});");var windowEl=$(workspaceWindow.id);windowEl.setStyles({top:workspaceWindow.top,left:workspaceWindow.left});var instance=windowEl.retrieve("instance");instance.contentWrapperEl.setStyles({width:workspaceWindow.width,height:workspaceWindow.height});instance.drawWindow()}}.bind(this));this.loadingWorkspace=false},loadWorkspace:function(){cookie=new Hash.Cookie("mochaUIworkspaceCookie",{duration:3600});workspaceWindows=cookie.load();if(!cookie.getKeys().length){new MUI.Window({loadMethod:"html",type:"notification",addClass:"notification",content:"You have no saved workspace.",closeAfter:"1400",width:220,height:40,y:25,padding:{top:10,right:12,bottom:10,left:12},shadowBlur:5,bodyBgColor:[255,255,255]});return}if($$(".mocha").length!=0){this.loadingWorkspace=true;this.myChain=new Chain();this.myChain.chain(function(){$$(".mocha").each(function(a){this.closeWindow(a)}.bind(this))}.bind(this),function(){this.loadWorkspace2(workspaceWindows)}.bind(this));this.myChain.callChain()}else{this.loadWorkspace2(workspaceWindows)}}}); \ No newline at end of file diff -Nru qbittorrent-4.1.3/src/webui/www/public/scripts/mootools-1.2-core-yc.js qbittorrent-3.3.15/src/webui/www/public/scripts/mootools-1.2-core-yc.js --- qbittorrent-4.1.3/src/webui/www/public/scripts/mootools-1.2-core-yc.js 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/scripts/mootools-1.2-core-yc.js 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,527 @@ +/* +--- +MooTools: the javascript framework + +web build: + - http://mootools.net/core/76bf47062d6c1983d66ce47ad66aa0e0 + +packager build: + - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Delegation Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady Core/Swiff + +copyrights: + - [MooTools](http://mootools.net) + +licenses: + - [MIT License](http://mootools.net/license.txt) +... +*/ + +(function(){this.MooTools={version:"1.4.5",build:"ab8ea8824dc3b24b6666867a2c4ed58ebb762cf0"};var e=this.typeOf=function(i){if(i==null){return"null";}if(i.$family!=null){return i.$family(); +}if(i.nodeName){if(i.nodeType==1){return"element";}if(i.nodeType==3){return(/\S/).test(i.nodeValue)?"textnode":"whitespace";}}else{if(typeof i.length=="number"){if(i.callee){return"arguments"; +}if("item" in i){return"collection";}}}return typeof i;};var u=this.instanceOf=function(w,i){if(w==null){return false;}var v=w.$constructor||w.constructor; +while(v){if(v===i){return true;}v=v.parent;}if(!w.hasOwnProperty){return false;}return w instanceof i;};var f=this.Function;var r=true;for(var q in {toString:1}){r=null; +}if(r){r=["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"];}f.prototype.overloadSetter=function(v){var i=this; +return function(x,w){if(x==null){return this;}if(v||typeof x!="string"){for(var y in x){i.call(this,y,x[y]);}if(r){for(var z=r.length;z--;){y=r[z];if(x.hasOwnProperty(y)){i.call(this,y,x[y]); +}}}}else{i.call(this,x,w);}return this;};};f.prototype.overloadGetter=function(v){var i=this;return function(x){var y,w;if(typeof x!="string"){y=x;}else{if(arguments.length>1){y=arguments; +}else{if(v){y=[x];}}}if(y){w={};for(var z=0;z>>0; +b>>0;b>>0;for(var a=(d<0)?Math.max(0,b+d):d||0;a>>0,b=Array(d);for(var a=0;a>>0; +b-1:String(this).indexOf(a)>-1;},trim:function(){return String(this).replace(/^\s+|\s+$/g,""); +},clean:function(){return String(this).replace(/\s+/g," ").trim();},camelCase:function(){return String(this).replace(/-\D/g,function(a){return a.charAt(1).toUpperCase(); +});},hyphenate:function(){return String(this).replace(/[A-Z]/g,function(a){return("-"+a.charAt(0).toLowerCase());});},capitalize:function(){return String(this).replace(/\b[a-z]/g,function(a){return a.toUpperCase(); +});},escapeRegExp:function(){return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g,"\\$1");},toInt:function(a){return parseInt(this,a||10);},toFloat:function(){return parseFloat(this); +},hexToRgb:function(b){var a=String(this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);return(a)?a.slice(1).hexToRgb(b):null;},rgbToHex:function(b){var a=String(this).match(/\d{1,3}/g); +return(a)?a.rgbToHex(b):null;},substitute:function(a,b){return String(this).replace(b||(/\\?\{([^{}]+)\}/g),function(d,c){if(d.charAt(0)=="\\"){return d.slice(1); +}return(a[c]!=null)?a[c]:"";});}});Number.implement({limit:function(b,a){return Math.min(a,Math.max(b,this));},round:function(a){a=Math.pow(10,a||0).toFixed(a<0?-a:0); +return Math.round(this*a)/a;},times:function(b,c){for(var a=0;a1?Array.slice(arguments,1):null,d=function(){};var c=function(){var g=e,h=arguments.length;if(this instanceof c){d.prototype=a.prototype; +g=new d;}var f=(!b&&!h)?a.call(g):a.apply(g,b&&h?b.concat(Array.slice(arguments)):b||arguments);return g==e?f:g;};return c;},pass:function(b,c){var a=this; +if(b!=null){b=Array.from(b);}return function(){return a.apply(c,b||arguments);};},delay:function(b,c,a){return setTimeout(this.pass((a==null?[]:a),c),b); +},periodical:function(c,b,a){return setInterval(this.pass((a==null?[]:a),b),c);}});delete Function.prototype.bind;Function.implement({create:function(b){var a=this; +b=b||{};return function(d){var c=b.arguments;c=(c!=null)?Array.from(c):Array.slice(arguments,(b.event)?1:0);if(b.event){c=[d||window.event].extend(c);}var e=function(){return a.apply(b.bind||null,c); +};if(b.delay){return setTimeout(e,b.delay);}if(b.periodical){return setInterval(e,b.periodical);}if(b.attempt){return Function.attempt(e);}return e();}; +},bind:function(c,b){var a=this;if(b!=null){b=Array.from(b);}return function(){return a.apply(c,b||arguments);};},bindWithEvent:function(c,b){var a=this; +if(b!=null){b=Array.from(b);}return function(d){return a.apply(c,(b==null)?arguments:[d].concat(b));};},run:function(a,b){return this.apply(b,Array.from(a)); +}});if(Object.create==Function.prototype.create){Object.create=null;}var $try=Function.attempt;(function(){var a=Object.prototype.hasOwnProperty;Object.extend({subset:function(d,g){var f={}; +for(var e=0,b=g.length;e]*>([\s\S]*?)<\/script>/gi,function(r,s){e+=s+"\n"; +return"";});if(p===true){o.exec(e);}else{if(typeOf(p)=="function"){p(e,q);}}return q;});o.extend({Document:this.Document,Window:this.Window,Element:this.Element,Event:this.Event}); +this.Window=this.$constructor=new Type("Window",function(){});this.$family=Function.from("window").hide();Window.mirror(function(e,p){h[e]=p;});this.Document=k.$constructor=new Type("Document",function(){}); +k.$family=Function.from("document").hide();Document.mirror(function(e,p){k[e]=p;});k.html=k.documentElement;if(!k.head){k.head=k.getElementsByTagName("head")[0]; +}if(k.execCommand){try{k.execCommand("BackgroundImageCache",false,true);}catch(g){}}if(this.attachEvent&&!this.addEventListener){var c=function(){this.detachEvent("onunload",c); +k.head=k.html=k.window=null;};this.attachEvent("onunload",c);}var m=Array.from;try{m(k.html.childNodes);}catch(g){Array.from=function(p){if(typeof p!="string"&&Type.isEnumerable(p)&&typeOf(p)!="array"){var e=p.length,q=new Array(e); +while(e--){q[e]=p[e];}return q;}return m(p);};var l=Array.prototype,n=l.slice;["pop","push","reverse","shift","sort","splice","unshift","concat","join","slice"].each(function(e){var p=l[e]; +Array[e]=function(q){return p.apply(Array.from(q),n.call(arguments,1));};});}if(o.Platform.ios){o.Platform.ipod=true;}o.Engine={};var d=function(p,e){o.Engine.name=p; +o.Engine[p+e]=true;o.Engine.version=e;};if(o.ie){o.Engine.trident=true;switch(o.version){case 6:d("trident",4);break;case 7:d("trident",5);break;case 8:d("trident",6); +}}if(o.firefox){o.Engine.gecko=true;if(o.version>=3){d("gecko",19);}else{d("gecko",18);}}if(o.safari||o.chrome){o.Engine.webkit=true;switch(o.version){case 2:d("webkit",419); +break;case 3:d("webkit",420);break;case 4:d("webkit",525);}}if(o.opera){o.Engine.presto=true;if(o.version>=9.6){d("presto",960);}else{if(o.version>=9.5){d("presto",950); +}else{d("presto",925);}}}if(o.name=="unknown"){switch((a.match(/(?:webkit|khtml|gecko)/)||[])[0]){case"webkit":case"khtml":o.Engine.webkit=true;break;case"gecko":o.Engine.gecko=true; +}}this.$exec=o.exec;})();(function(){var b={};var a=this.DOMEvent=new Type("DOMEvent",function(c,g){if(!g){g=window;}c=c||g.event;if(c.$extended){return c; +}this.event=c;this.$extended=true;this.shift=c.shiftKey;this.control=c.ctrlKey;this.alt=c.altKey;this.meta=c.metaKey;var i=this.type=c.type;var h=c.target||c.srcElement; +while(h&&h.nodeType==3){h=h.parentNode;}this.target=document.id(h);if(i.indexOf("key")==0){var d=this.code=(c.which||c.keyCode);this.key=b[d]||Object.keyOf(Event.Keys,d); +if(i=="keydown"){if(d>111&&d<124){this.key="f"+(d-111);}else{if(d>95&&d<106){this.key=d-96;}}}if(this.key==null){this.key=String.fromCharCode(d).toLowerCase(); +}}else{if(i=="click"||i=="dblclick"||i=="contextmenu"||i=="DOMMouseScroll"||i.indexOf("mouse")==0){var j=g.document;j=(!j.compatMode||j.compatMode=="CSS1Compat")?j.html:j.body; +this.page={x:(c.pageX!=null)?c.pageX:c.clientX+j.scrollLeft,y:(c.pageY!=null)?c.pageY:c.clientY+j.scrollTop};this.client={x:(c.pageX!=null)?c.pageX-g.pageXOffset:c.clientX,y:(c.pageY!=null)?c.pageY-g.pageYOffset:c.clientY}; +if(i=="DOMMouseScroll"||i=="mousewheel"){this.wheel=(c.wheelDelta)?c.wheelDelta/120:-(c.detail||0)/3;}this.rightClick=(c.which==3||c.button==2);if(i=="mouseover"||i=="mouseout"){var k=c.relatedTarget||c[(i=="mouseover"?"from":"to")+"Element"]; +while(k&&k.nodeType==3){k=k.parentNode;}this.relatedTarget=document.id(k);}}else{if(i.indexOf("touch")==0||i.indexOf("gesture")==0){this.rotation=c.rotation; +this.scale=c.scale;this.targetTouches=c.targetTouches;this.changedTouches=c.changedTouches;var f=this.touches=c.touches;if(f&&f[0]){var e=f[0];this.page={x:e.pageX,y:e.pageY}; +this.client={x:e.clientX,y:e.clientY};}}}}if(!this.client){this.client={};}if(!this.page){this.page={};}});a.implement({stop:function(){return this.preventDefault().stopPropagation(); +},stopPropagation:function(){if(this.event.stopPropagation){this.event.stopPropagation();}else{this.event.cancelBubble=true;}return this;},preventDefault:function(){if(this.event.preventDefault){this.event.preventDefault(); +}else{this.event.returnValue=false;}return this;}});a.defineKey=function(d,c){b[d]=c;return this;};a.defineKeys=a.defineKey.overloadSetter(true);a.defineKeys({"38":"up","40":"down","37":"left","39":"right","27":"esc","32":"space","8":"backspace","9":"tab","46":"delete","13":"enter"}); +})();var Event=DOMEvent;Event.Keys={};Event.Keys=new Hash(Event.Keys);(function(){var a=this.Class=new Type("Class",function(h){if(instanceOf(h,Function)){h={initialize:h}; +}var g=function(){e(this);if(g.$prototyping){return this;}this.$caller=null;var i=(this.initialize)?this.initialize.apply(this,arguments):this;this.$caller=this.caller=null; +return i;}.extend(this).implement(h);g.$constructor=a;g.prototype.$constructor=g;g.prototype.parent=c;return g;});var c=function(){if(!this.$caller){throw new Error('The method "parent" cannot be called.'); +}var g=this.$caller.$name,h=this.$caller.$owner.parent,i=(h)?h.prototype[g]:null;if(!i){throw new Error('The method "'+g+'" has no parent.');}return i.apply(this,arguments); +};var e=function(g){for(var h in g){var j=g[h];switch(typeOf(j)){case"object":var i=function(){};i.prototype=j;g[h]=e(new i);break;case"array":g[h]=j.clone(); +break;}}return g;};var b=function(g,h,j){if(j.$origin){j=j.$origin;}var i=function(){if(j.$protected&&this.$caller==null){throw new Error('The method "'+h+'" cannot be called.'); +}var l=this.caller,m=this.$caller;this.caller=m;this.$caller=i;var k=j.apply(this,arguments);this.$caller=m;this.caller=l;return k;}.extend({$owner:g,$origin:j,$name:h}); +return i;};var f=function(h,i,g){if(a.Mutators.hasOwnProperty(h)){i=a.Mutators[h].call(this,i);if(i==null){return this;}}if(typeOf(i)=="function"){if(i.$hidden){return this; +}this.prototype[h]=(g)?i:b(this,h,i);}else{Object.merge(this.prototype,h,i);}return this;};var d=function(g){g.$prototyping=true;var h=new g;delete g.$prototyping; +return h;};a.implement("implement",f.overloadSetter());a.Mutators={Extends:function(g){this.parent=g;this.prototype=d(g);},Implements:function(g){Array.from(g).each(function(j){var h=new j; +for(var i in h){f.call(this,i,h[i],true);}},this);}};})();(function(){this.Chain=new Class({$chain:[],chain:function(){this.$chain.append(Array.flatten(arguments)); +return this;},callChain:function(){return(this.$chain.length)?this.$chain.shift().apply(this,arguments):false;},clearChain:function(){this.$chain.empty(); +return this;}});var a=function(b){return b.replace(/^on([A-Z])/,function(c,d){return d.toLowerCase();});};this.Events=new Class({$events:{},addEvent:function(d,c,b){d=a(d); +if(c==$empty){return this;}this.$events[d]=(this.$events[d]||[]).include(c);if(b){c.internal=true;}return this;},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]); +}return this;},fireEvent:function(e,c,b){e=a(e);var d=this.$events[e];if(!d){return this;}c=Array.from(c);d.each(function(f){if(b){f.delay(b,this,c);}else{f.apply(this,c); +}},this);return this;},removeEvent:function(e,d){e=a(e);var c=this.$events[e];if(c&&!d.internal){var b=c.indexOf(d);if(b!=-1){delete c[b];}}return this; +},removeEvents:function(d){var e;if(typeOf(d)=="object"){for(e in d){this.removeEvent(e,d[e]);}return this;}if(d){d=a(d);}for(e in this.$events){if(d&&d!=e){continue; +}var c=this.$events[e];for(var b=c.length;b--;){if(b in c){this.removeEvent(e,c[b]);}}}return this;}});this.Options=new Class({setOptions:function(){var b=this.options=Object.merge.apply(null,[{},this.options].append(arguments)); +if(this.addEvent){for(var c in b){if(typeOf(b[c])!="function"||!(/^on[A-Z]/).test(c)){continue;}this.addEvent(c,b[c]);delete b[c];}}return this;}});})(); +(function(){var k,n,l,g,a={},c={},m=/\\/g;var e=function(q,p){if(q==null){return null;}if(q.Slick===true){return q;}q=(""+q).replace(/^\s+|\s+$/g,"");g=!!p; +var o=(g)?c:a;if(o[q]){return o[q];}k={Slick:true,expressions:[],raw:q,reverse:function(){return e(this.raw,true);}};n=-1;while(q!=(q=q.replace(j,b))){}k.length=k.expressions.length; +return o[k.raw]=(g)?h(k):k;};var i=function(o){if(o==="!"){return" ";}else{if(o===" "){return"!";}else{if((/^!/).test(o)){return o.replace(/^!/,"");}else{return"!"+o; +}}}};var h=function(u){var r=u.expressions;for(var p=0;p+)\\s*|(\\s+)|(+|\\*)|\\#(+)|\\.(+)|\\[\\s*(+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)".replace(//,"["+f(">+~`!@$%^&={}\\;/g,"(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])").replace(//g,"(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])")); +function b(x,s,D,z,r,C,q,B,A,y,u,F,G,v,p,w){if(s||n===-1){k.expressions[++n]=[];l=-1;if(s){return"";}}if(D||z||l===-1){D=D||" ";var t=k.expressions[n]; +if(g&&t[l]){t[l].reverseCombinator=i(D);}t[++l]={combinator:D,tag:"*"};}var o=k.expressions[n][l];if(r){o.tag=r.replace(m,"");}else{if(C){o.id=C.replace(m,""); +}else{if(q){q=q.replace(m,"");if(!o.classList){o.classList=[];}if(!o.classes){o.classes=[];}o.classList.push(q);o.classes.push({value:q,regexp:new RegExp("(^|\\s)"+f(q)+"(\\s|$)")}); +}else{if(G){w=w||p;w=w?w.replace(m,""):null;if(!o.pseudos){o.pseudos=[];}o.pseudos.push({key:G.replace(m,""),value:w,type:F.length==1?"class":"element"}); +}else{if(B){B=B.replace(m,"");u=(u||"").replace(m,"");var E,H;switch(A){case"^=":H=new RegExp("^"+f(u));break;case"$=":H=new RegExp(f(u)+"$");break;case"~=":H=new RegExp("(^|\\s)"+f(u)+"(\\s|$)"); +break;case"|=":H=new RegExp("^"+f(u)+"(-|$)");break;case"=":E=function(I){return u==I;};break;case"*=":E=function(I){return I&&I.indexOf(u)>-1;};break; +case"!=":E=function(I){return u!=I;};break;default:E=function(I){return !!I;};}if(u==""&&(/^[*$^]=$/).test(A)){E=function(){return false;};}if(!E){E=function(I){return I&&H.test(I); +};}if(!o.attributes){o.attributes=[];}o.attributes.push({key:B,operator:A,value:u,test:E});}}}}}return"";}var d=(this.Slick||{});d.parse=function(o){return e(o); +};d.escapeRegExp=f;if(!this.Slick){this.Slick=d;}}).apply((typeof exports!="undefined")?exports:this);(function(){var k={},m={},d=Object.prototype.toString; +k.isNativeCode=function(c){return(/\{\s*\[native code\]\s*\}/).test(""+c);};k.isXML=function(c){return(!!c.xmlVersion)||(!!c.xml)||(d.call(c)=="[object XMLDocument]")||(c.nodeType==9&&c.documentElement.nodeName!="HTML"); +};k.setDocument=function(w){var p=w.nodeType;if(p==9){}else{if(p){w=w.ownerDocument;}else{if(w.navigator){w=w.document;}else{return;}}}if(this.document===w){return; +}this.document=w;var A=w.documentElement,o=this.getUIDXML(A),s=m[o],r;if(s){for(r in s){this[r]=s[r];}return;}s=m[o]={};s.root=A;s.isXMLDocument=this.isXML(w); +s.brokenStarGEBTN=s.starSelectsClosedQSA=s.idGetsName=s.brokenMixedCaseQSA=s.brokenGEBCN=s.brokenCheckedQSA=s.brokenEmptyAttributeQSA=s.isHTMLDocument=s.nativeMatchesSelector=false; +var q,u,y,z,t;var x,v="slick_uniqueid";var c=w.createElement("div");var n=w.body||w.getElementsByTagName("body")[0]||A;n.appendChild(c);try{c.innerHTML=''; +s.isHTMLDocument=!!w.getElementById(v);}catch(C){}if(s.isHTMLDocument){c.style.display="none";c.appendChild(w.createComment(""));u=(c.getElementsByTagName("*").length>1); +try{c.innerHTML="foo";x=c.getElementsByTagName("*");q=(x&&!!x.length&&x[0].nodeName.charAt(0)=="/");}catch(C){}s.brokenStarGEBTN=u||q;try{c.innerHTML=''; +s.idGetsName=w.getElementById(v)===c.firstChild;}catch(C){}if(c.getElementsByClassName){try{c.innerHTML='';c.getElementsByClassName("b").length; +c.firstChild.className="b";z=(c.getElementsByClassName("b").length!=2);}catch(C){}try{c.innerHTML='';y=(c.getElementsByClassName("a").length!=2); +}catch(C){}s.brokenGEBCN=z||y;}if(c.querySelectorAll){try{c.innerHTML="foo";x=c.querySelectorAll("*");s.starSelectsClosedQSA=(x&&!!x.length&&x[0].nodeName.charAt(0)=="/"); +}catch(C){}try{c.innerHTML='';s.brokenMixedCaseQSA=!c.querySelectorAll(".MiX").length;}catch(C){}try{c.innerHTML=''; +s.brokenCheckedQSA=(c.querySelectorAll(":checked").length==0);}catch(C){}try{c.innerHTML='';s.brokenEmptyAttributeQSA=(c.querySelectorAll('[class*=""]').length!=0); +}catch(C){}}try{c.innerHTML='
    ';t=(c.firstChild.getAttribute("action")!="s");}catch(C){}s.nativeMatchesSelector=A.matchesSelector||A.mozMatchesSelector||A.webkitMatchesSelector; +if(s.nativeMatchesSelector){try{s.nativeMatchesSelector.call(A,":slick");s.nativeMatchesSelector=null;}catch(C){}}}try{A.slick_expando=1;delete A.slick_expando; +s.getUID=this.getUIDHTML;}catch(C){s.getUID=this.getUIDXML;}n.removeChild(c);c=x=n=null;s.getAttribute=(s.isHTMLDocument&&t)?function(G,E){var H=this.attributeGetters[E]; +if(H){return H.call(G);}var F=G.getAttributeNode(E);return(F)?F.nodeValue:null;}:function(F,E){var G=this.attributeGetters[E];return(G)?G.call(F):F.getAttribute(E); +};s.hasAttribute=(A&&this.isNativeCode(A.hasAttribute))?function(F,E){return F.hasAttribute(E);}:function(F,E){F=F.getAttributeNode(E);return !!(F&&(F.specified||F.nodeValue)); +};var D=A&&this.isNativeCode(A.contains),B=w&&this.isNativeCode(w.contains);s.contains=(D&&B)?function(E,F){return E.contains(F);}:(D&&!B)?function(E,F){return E===F||((E===w)?w.documentElement:E).contains(F); +}:(A&&A.compareDocumentPosition)?function(E,F){return E===F||!!(E.compareDocumentPosition(F)&16);}:function(E,F){if(F){do{if(F===E){return true;}}while((F=F.parentNode)); +}return false;};s.documentSorter=(A.compareDocumentPosition)?function(F,E){if(!F.compareDocumentPosition||!E.compareDocumentPosition){return 0;}return F.compareDocumentPosition(E)&4?-1:F===E?0:1; +}:("sourceIndex" in A)?function(F,E){if(!F.sourceIndex||!E.sourceIndex){return 0;}return F.sourceIndex-E.sourceIndex;}:(w.createRange)?function(H,F){if(!H.ownerDocument||!F.ownerDocument){return 0; +}var G=H.ownerDocument.createRange(),E=F.ownerDocument.createRange();G.setStart(H,0);G.setEnd(H,0);E.setStart(F,0);E.setEnd(F,0);return G.compareBoundaryPoints(Range.START_TO_END,E); +}:null;A=null;for(r in s){this[r]=s[r];}};var f=/^([#.]?)((?:[\w-]+|\*))$/,h=/\[.+[*$^]=(?:""|'')?\]/,g={};k.search=function(U,z,H,s){var p=this.found=(s)?null:(H||[]); +if(!U){return p;}else{if(U.navigator){U=U.document;}else{if(!U.nodeType){return p;}}}var F,O,V=this.uniques={},I=!!(H&&H.length),y=(U.nodeType==9);if(this.document!==(y?U:U.ownerDocument)){this.setDocument(U); +}if(I){for(O=p.length;O--;){V[this.getUID(p[O])]=true;}}if(typeof z=="string"){var r=z.match(f);simpleSelectors:if(r){var u=r[1],v=r[2],A,E;if(!u){if(v=="*"&&this.brokenStarGEBTN){break simpleSelectors; +}E=U.getElementsByTagName(v);if(s){return E[0]||null;}for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}else{if(u=="#"){if(!this.isHTMLDocument||!y){break simpleSelectors; +}A=U.getElementById(v);if(!A){return p;}if(this.idGetsName&&A.getAttributeNode("id").nodeValue!=v){break simpleSelectors;}if(s){return A||null;}if(!(I&&V[this.getUID(A)])){p.push(A); +}}else{if(u=="."){if(!this.isHTMLDocument||((!U.getElementsByClassName||this.brokenGEBCN)&&U.querySelectorAll)){break simpleSelectors;}if(U.getElementsByClassName&&!this.brokenGEBCN){E=U.getElementsByClassName(v); +if(s){return E[0]||null;}for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}else{var T=new RegExp("(^|\\s)"+e.escapeRegExp(v)+"(\\s|$)");E=U.getElementsByTagName("*"); +for(O=0;A=E[O++];){className=A.className;if(!(className&&T.test(className))){continue;}if(s){return A;}if(!(I&&V[this.getUID(A)])){p.push(A);}}}}}}if(I){this.sort(p); +}return(s)?null:p;}querySelector:if(U.querySelectorAll){if(!this.isHTMLDocument||g[z]||this.brokenMixedCaseQSA||(this.brokenCheckedQSA&&z.indexOf(":checked")>-1)||(this.brokenEmptyAttributeQSA&&h.test(z))||(!y&&z.indexOf(",")>-1)||e.disableQSA){break querySelector; +}var S=z,x=U;if(!y){var C=x.getAttribute("id"),t="slickid__";x.setAttribute("id",t);S="#"+t+" "+S;U=x.parentNode;}try{if(s){return U.querySelector(S)||null; +}else{E=U.querySelectorAll(S);}}catch(Q){g[z]=1;break querySelector;}finally{if(!y){if(C){x.setAttribute("id",C);}else{x.removeAttribute("id");}U=x;}}if(this.starSelectsClosedQSA){for(O=0; +A=E[O++];){if(A.nodeName>"@"&&!(I&&V[this.getUID(A)])){p.push(A);}}}else{for(O=0;A=E[O++];){if(!(I&&V[this.getUID(A)])){p.push(A);}}}if(I){this.sort(p); +}return p;}F=this.Slick.parse(z);if(!F.length){return p;}}else{if(z==null){return p;}else{if(z.Slick){F=z;}else{if(this.contains(U.documentElement||U,z)){(p)?p.push(z):p=z; +return p;}else{return p;}}}}this.posNTH={};this.posNTHLast={};this.posNTHType={};this.posNTHTypeLast={};this.push=(!I&&(s||(F.length==1&&F.expressions[0].length==1)))?this.pushArray:this.pushUID; +if(p==null){p=[];}var M,L,K;var B,J,D,c,q,G,W;var N,P,o,w,R=F.expressions;search:for(O=0;(P=R[O]);O++){for(M=0;(o=P[M]);M++){B="combinator:"+o.combinator; +if(!this[B]){continue search;}J=(this.isXMLDocument)?o.tag:o.tag.toUpperCase();D=o.id;c=o.classList;q=o.classes;G=o.attributes;W=o.pseudos;w=(M===(P.length-1)); +this.bitUniques={};if(w){this.uniques=V;this.found=p;}else{this.uniques={};this.found=[];}if(M===0){this[B](U,J,D,q,G,W,c);if(s&&w&&p.length){break search; +}}else{if(s&&w){for(L=0,K=N.length;L1)){this.sort(p);}return(s)?(p[0]||null):p;};k.uidx=1;k.uidk="slick-uniqueid";k.getUIDXML=function(n){var c=n.getAttribute(this.uidk); +if(!c){c=this.uidx++;n.setAttribute(this.uidk,c);}return c;};k.getUIDHTML=function(c){return c.uniqueNumber||(c.uniqueNumber=this.uidx++);};k.sort=function(c){if(!this.documentSorter){return c; +}c.sort(this.documentSorter);return c;};k.cacheNTH={};k.matchNTH=/^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;k.parseNTHArgument=function(q){var o=q.match(this.matchNTH); +if(!o){return false;}var p=o[2]||false;var n=o[1]||1;if(n=="-"){n=-1;}var c=+o[3]||0;o=(p=="n")?{a:n,b:c}:(p=="odd")?{a:2,b:1}:(p=="even")?{a:2,b:0}:{a:0,b:n}; +return(this.cacheNTH[q]=o);};k.createNTHPseudo=function(p,n,c,o){return function(s,q){var u=this.getUID(s);if(!this[c][u]){var A=s.parentNode;if(!A){return false; +}var r=A[p],t=1;if(o){var z=s.nodeName;do{if(r.nodeName!=z){continue;}this[c][this.getUID(r)]=t++;}while((r=r[n]));}else{do{if(r.nodeType!=1){continue; +}this[c][this.getUID(r)]=t++;}while((r=r[n]));}}q=q||"n";var v=this.cacheNTH[q]||this.parseNTHArgument(q);if(!v){return false;}var y=v.a,x=v.b,w=this[c][u]; +if(y==0){return x==w;}if(y>0){if(w":function(p,c,r,o,n,q){if((p=p.firstChild)){do{if(p.nodeType==1){this.push(p,c,r,o,n,q); +}}while((p=p.nextSibling));}},"+":function(p,c,r,o,n,q){while((p=p.nextSibling)){if(p.nodeType==1){this.push(p,c,r,o,n,q);break;}}},"^":function(p,c,r,o,n,q){p=p.firstChild; +if(p){if(p.nodeType==1){this.push(p,c,r,o,n,q);}else{this["combinator:+"](p,c,r,o,n,q);}}},"~":function(q,c,s,p,n,r){while((q=q.nextSibling)){if(q.nodeType!=1){continue; +}var o=this.getUID(q);if(this.bitUniques[o]){break;}this.bitUniques[o]=true;this.push(q,c,s,p,n,r);}},"++":function(p,c,r,o,n,q){this["combinator:+"](p,c,r,o,n,q); +this["combinator:!+"](p,c,r,o,n,q);},"~~":function(p,c,r,o,n,q){this["combinator:~"](p,c,r,o,n,q);this["combinator:!~"](p,c,r,o,n,q);},"!":function(p,c,r,o,n,q){while((p=p.parentNode)){if(p!==this.document){this.push(p,c,r,o,n,q); +}}},"!>":function(p,c,r,o,n,q){p=p.parentNode;if(p!==this.document){this.push(p,c,r,o,n,q);}},"!+":function(p,c,r,o,n,q){while((p=p.previousSibling)){if(p.nodeType==1){this.push(p,c,r,o,n,q); +break;}}},"!^":function(p,c,r,o,n,q){p=p.lastChild;if(p){if(p.nodeType==1){this.push(p,c,r,o,n,q);}else{this["combinator:!+"](p,c,r,o,n,q);}}},"!~":function(q,c,s,p,n,r){while((q=q.previousSibling)){if(q.nodeType!=1){continue; +}var o=this.getUID(q);if(this.bitUniques[o]){break;}this.bitUniques[o]=true;this.push(q,c,s,p,n,r);}}};for(var i in j){k["combinator:"+i]=j[i];}var l={empty:function(c){var n=c.firstChild; +return !(n&&n.nodeType==1)&&!(c.innerText||c.textContent||"").length;},not:function(c,n){return !this.matchNode(c,n);},contains:function(c,n){return(c.innerText||c.textContent||"").indexOf(n)>-1; +},"first-child":function(c){while((c=c.previousSibling)){if(c.nodeType==1){return false;}}return true;},"last-child":function(c){while((c=c.nextSibling)){if(c.nodeType==1){return false; +}}return true;},"only-child":function(o){var n=o;while((n=n.previousSibling)){if(n.nodeType==1){return false;}}var c=o;while((c=c.nextSibling)){if(c.nodeType==1){return false; +}}return true;},"nth-child":k.createNTHPseudo("firstChild","nextSibling","posNTH"),"nth-last-child":k.createNTHPseudo("lastChild","previousSibling","posNTHLast"),"nth-of-type":k.createNTHPseudo("firstChild","nextSibling","posNTHType",true),"nth-last-of-type":k.createNTHPseudo("lastChild","previousSibling","posNTHTypeLast",true),index:function(n,c){return this["pseudo:nth-child"](n,""+(c+1)); +},even:function(c){return this["pseudo:nth-child"](c,"2n");},odd:function(c){return this["pseudo:nth-child"](c,"2n+1");},"first-of-type":function(c){var n=c.nodeName; +while((c=c.previousSibling)){if(c.nodeName==n){return false;}}return true;},"last-of-type":function(c){var n=c.nodeName;while((c=c.nextSibling)){if(c.nodeName==n){return false; +}}return true;},"only-of-type":function(o){var n=o,p=o.nodeName;while((n=n.previousSibling)){if(n.nodeName==p){return false;}}var c=o;while((c=c.nextSibling)){if(c.nodeName==p){return false; +}}return true;},enabled:function(c){return !c.disabled;},disabled:function(c){return c.disabled;},checked:function(c){return c.checked||c.selected;},focus:function(c){return this.isHTMLDocument&&this.document.activeElement===c&&(c.href||c.type||this.hasAttribute(c,"tabindex")); +},root:function(c){return(c===this.root);},selected:function(c){return c.selected;}};for(var b in l){k["pseudo:"+b]=l[b];}var a=k.attributeGetters={"for":function(){return("htmlFor" in this)?this.htmlFor:this.getAttribute("for"); +},href:function(){return("href" in this)?this.getAttribute("href",2):this.getAttribute("href");},style:function(){return(this.style)?this.style.cssText:this.getAttribute("style"); +},tabindex:function(){var c=this.getAttributeNode("tabindex");return(c&&c.specified)?c.nodeValue:null;},type:function(){return this.getAttribute("type"); +},maxlength:function(){var c=this.getAttributeNode("maxLength");return(c&&c.specified)?c.nodeValue:null;}};a.MAXLENGTH=a.maxLength=a.maxlength;var e=k.Slick=(this.Slick||{}); +e.version="1.1.7";e.search=function(n,o,c){return k.search(n,o,c);};e.find=function(c,n){return k.search(c,n,null,true);};e.contains=function(c,n){k.setDocument(c); +return k.contains(c,n);};e.getAttribute=function(n,c){k.setDocument(n);return k.getAttribute(n,c);};e.hasAttribute=function(n,c){k.setDocument(n);return k.hasAttribute(n,c); +};e.match=function(n,c){if(!(n&&c)){return false;}if(!c||c===n){return true;}k.setDocument(n);return k.matchNode(n,c);};e.defineAttributeGetter=function(c,n){k.attributeGetters[c]=n; +return this;};e.lookupAttributeGetter=function(c){return k.attributeGetters[c];};e.definePseudo=function(c,n){k["pseudo:"+c]=function(p,o){return n.call(p,o); +};return this;};e.lookupPseudo=function(c){var n=k["pseudo:"+c];if(n){return function(o){return n.call(this,o);};}return null;};e.override=function(n,c){k.override(n,c); +return this;};e.isXML=k.isXML;e.uidOf=function(c){return k.getUIDHTML(c);};if(!this.Slick){this.Slick=e;}}).apply((typeof exports!="undefined")?exports:this); +var Element=function(b,g){var h=Element.Constructors[b];if(h){return h(g);}if(typeof b!="string"){return document.id(b).set(g);}if(!g){g={};}if(!(/^[\w-]+$/).test(b)){var e=Slick.parse(b).expressions[0][0]; +b=(e.tag=="*")?"div":e.tag;if(e.id&&g.id==null){g.id=e.id;}var d=e.attributes;if(d){for(var a,f=0,c=d.length;f=this.length){delete this[g--];}return e;}.protect());}Array.forEachMethod(function(g,e){Elements.implement(e,g);});Array.mirror(Elements);var d; +try{d=(document.createElement("").name=="x");}catch(b){}var c=function(e){return(""+e).replace(/&/g,"&").replace(/"/g,""");};Document.implement({newElement:function(e,g){if(g&&g.checked!=null){g.defaultChecked=g.checked; +}if(d&&g){e="<"+e;if(g.name){e+=' name="'+c(g.name)+'"';}if(g.type){e+=' type="'+c(g.type)+'"';}e+=">";delete g.name;delete g.type;}return this.id(this.createElement(e)).set(g); +}});})();(function(){Slick.uidOf(window);Slick.uidOf(document);Document.implement({newTextNode:function(e){return this.createTextNode(e);},getDocument:function(){return this; +},getWindow:function(){return this.window;},id:(function(){var e={string:function(E,D,l){E=Slick.find(l,"#"+E.replace(/(\W)/g,"\\$1"));return(E)?e.element(E,D):null; +},element:function(D,E){Slick.uidOf(D);if(!E&&!D.$family&&!(/^(?:object|embed)$/i).test(D.tagName)){var l=D.fireEvent;D._fireEvent=function(F,G){return l(F,G); +};Object.append(D,Element.Prototype);}return D;},object:function(D,E,l){if(D.toElement){return e.element(D.toElement(l),E);}return null;}};e.textnode=e.whitespace=e.window=e.document=function(l){return l; +};return function(D,F,E){if(D&&D.$family&&D.uniqueNumber){return D;}var l=typeOf(D);return(e[l])?e[l](D,F,E||document):null;};})()});if(window.$==null){Window.implement("$",function(e,l){return document.id(e,l,this.document); +});}Window.implement({getDocument:function(){return this.document;},getWindow:function(){return this;}});[Document,Element].invoke("implement",{getElements:function(e){return Slick.search(this,e,new Elements); +},getElement:function(e){return document.id(Slick.find(this,e));}});var m={contains:function(e){return Slick.contains(this,e);}};if(!document.contains){Document.implement(m); +}if(!document.createElement("div").contains){Element.implement(m);}Element.implement("hasChild",function(e){return this!==e&&this.contains(e);});(function(l,E,e){this.Selectors={}; +var F=this.Selectors.Pseudo=new Hash();var D=function(){for(var G in F){if(F.hasOwnProperty(G)){Slick.definePseudo(G,F[G]);delete F[G];}}};Slick.search=function(H,I,G){D(); +return l.call(this,H,I,G);};Slick.find=function(G,H){D();return E.call(this,G,H);};Slick.match=function(H,G){D();return e.call(this,H,G);};})(Slick.search,Slick.find,Slick.match); +var r=function(E,D){if(!E){return D;}E=Object.clone(Slick.parse(E));var l=E.expressions;for(var e=l.length;e--;){l[e][0].combinator=D;}return E;};Object.forEach({getNext:"~",getPrevious:"!~",getParent:"!"},function(e,l){Element.implement(l,function(D){return this.getElement(r(D,e)); +});});Object.forEach({getAllNext:"~",getAllPrevious:"!~",getSiblings:"~~",getChildren:">",getParents:"!"},function(e,l){Element.implement(l,function(D){return this.getElements(r(D,e)); +});});Element.implement({getFirst:function(e){return document.id(Slick.search(this,r(e,">"))[0]);},getLast:function(e){return document.id(Slick.search(this,r(e,">")).getLast()); +},getWindow:function(){return this.ownerDocument.window;},getDocument:function(){return this.ownerDocument;},getElementById:function(e){return document.id(Slick.find(this,"#"+(""+e).replace(/(\W)/g,"\\$1"))); +},match:function(e){return !e||Slick.match(this,e);}});if(window.$$==null){Window.implement("$$",function(e){var H=new Elements;if(arguments.length==1&&typeof e=="string"){return Slick.search(this.document,e,H); +}var E=Array.flatten(arguments);for(var F=0,D=E.length;F(?![^<]*<['"])/)).indexOf(F)<0){return null;}E[F]=true;}}var e=Slick.getAttribute(this,F); +return(!e&&!Slick.hasAttribute(this,F))?null:e;},getProperties:function(){var e=Array.from(arguments);return e.map(this.getProperty,this).associate(e); +},removeProperty:function(e){return this.setProperty(e,null);},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this;},set:function(D,l){var e=Element.Properties[D]; +(e&&e.set)?e.set.call(this,l):this.setProperty(D,l);}.overloadSetter(),get:function(l){var e=Element.Properties[l];return(e&&e.get)?e.get.apply(this):this.getProperty(l); +}.overloadGetter(),erase:function(l){var e=Element.Properties[l];(e&&e.erase)?e.erase.apply(this):this.removeProperty(l);return this;},hasClass:function(e){return this.className.clean().contains(e," "); +},addClass:function(e){if(!this.hasClass(e)){this.className=(this.className+" "+e).clean();}return this;},removeClass:function(e){this.className=this.className.replace(new RegExp("(^|\\s)"+e+"(?:\\s|$)"),"$1"); +return this;},toggleClass:function(e,l){if(l==null){l=!this.hasClass(e);}return(l)?this.addClass(e):this.removeClass(e);},adopt:function(){var E=this,e,G=Array.flatten(arguments),F=G.length; +if(F>1){E=e=document.createDocumentFragment();}for(var D=0;D";var a=(t.childNodes.length==1);if(!a){var s="abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video".split(" "),b=document.createDocumentFragment(),u=s.length; +while(u--){b.createElement(s[u]);}}t=null;var g=Function.attempt(function(){var e=document.createElement("table");e.innerHTML="";return true; +});var c=document.createElement("tr"),o="";c.innerHTML=o;var y=(c.innerHTML==o);c=null;if(!g||!y||!a){Element.Properties.html.set=(function(l){var e={table:[1,"","
    "],select:[1,""],tbody:[2,"","
    "],tr:[3,"","
    "]}; +e.thead=e.tfoot=e.tbody;return function(D){var E=e[this.get("tag")];if(!E&&!a){E=[0,"",""];}if(!E){return l.call(this,D);}var H=E[0],G=document.createElement("div"),F=G; +if(!a){b.appendChild(G);}G.innerHTML=[E[1],D,E[2]].flatten().join("");while(H--){F=F.firstChild;}this.empty().adopt(F.childNodes);if(!a){b.removeChild(G); +}G=null;};})(Element.Properties.html.set);}var n=document.createElement("form");n.innerHTML="";if(n.firstChild.value!="s"){Element.Properties.value={set:function(G){var l=this.get("tag"); +if(l!="select"){return this.setProperty("value",G);}var D=this.getElements("option");for(var E=0;E0||k==null?"visible":"hidden";};var f=(h?function(l,k){l.style.opacity=k;}:(e?function(l,k){var n=l.style; +if(!l.currentStyle||!l.currentStyle.hasLayout){n.zoom=1;}if(k==null||k==1){k="";}else{k="alpha(opacity="+(k*100).limit(0,100).round()+")";}var m=n.filter||l.getComputedStyle("filter")||""; +n.filter=j.test(m)?m.replace(j,k):m+k;if(!n.filter){n.removeAttribute("filter");}}:a));var g=(h?function(l){var k=l.style.opacity||l.getComputedStyle("opacity"); +return(k=="")?1:k.toFloat();}:(e?function(l){var m=(l.style.filter||l.getComputedStyle("filter")),k;if(m){k=m.match(j);}return(k==null||m==null)?1:(k[1]/100); +}:function(l){var k=l.retrieve("$opacity");if(k==null){k=(l.style.visibility=="hidden"?0:1);}return k;}));var b=(i.style.cssFloat==null)?"styleFloat":"cssFloat"; +Element.implement({getComputedStyle:function(m){if(this.currentStyle){return this.currentStyle[m.camelCase()];}var l=Element.getDocument(this).defaultView,k=l?l.getComputedStyle(this,null):null; +return(k)?k.getPropertyValue((m==b)?"float":m.hyphenate()):null;},setStyle:function(l,k){if(l=="opacity"){if(k!=null){k=parseFloat(k);}f(this,k);return this; +}l=(l=="float"?b:l).camelCase();if(typeOf(k)!="string"){var m=(Element.Styles[l]||"@").split(" ");k=Array.from(k).map(function(o,n){if(!m[n]){return""; +}return(typeOf(o)=="number")?m[n].replace("@",Math.round(o)):o;}).join(" ");}else{if(k==String(Number(k))){k=Math.round(k);}}this.style[l]=k;if((k==""||k==null)&&c&&this.style.removeAttribute){this.style.removeAttribute(l); +}return this;},getStyle:function(q){if(q=="opacity"){return g(this);}q=(q=="float"?b:q).camelCase();var k=this.style[q];if(!k||q=="zIndex"){k=[];for(var p in Element.ShortStyles){if(q!=p){continue; +}for(var o in Element.ShortStyles[p]){k.push(this.getStyle(o));}return k.join(" ");}k=this.getComputedStyle(q);}if(k){k=String(k);var m=k.match(/rgba?\([\d\s,]+\)/); +if(m){k=k.replace(m[0],m[0].rgbToHex());}}if(Browser.opera||Browser.ie){if((/^(height|width)$/).test(q)&&!(/px$/.test(k))){var l=(q=="width")?["left","right"]:["top","bottom"],n=0; +l.each(function(r){n+=this.getStyle("border-"+r+"-width").toInt()+this.getStyle("padding-"+r).toInt();},this);return this["offset"+q.capitalize()]-n+"px"; +}if(Browser.ie&&(/^border(.+)Width|margin|padding/).test(q)&&isNaN(parseFloat(k))){return"0px";}}return k;},setStyles:function(l){for(var k in l){this.setStyle(k,l[k]); +}return this;},getStyles:function(){var k={};Array.flatten(arguments).each(function(l){k[l]=this.getStyle(l);},this);return k;}});Element.Styles={left:"@px",top:"@px",bottom:"@px",right:"@px",width:"@px",height:"@px",maxWidth:"@px",maxHeight:"@px",minWidth:"@px",minHeight:"@px",backgroundColor:"rgb(@, @, @)",backgroundPosition:"@px @px",color:"rgb(@, @, @)",fontSize:"@px",letterSpacing:"@px",lineHeight:"@px",clip:"rect(@px @px @px @px)",margin:"@px @px @px @px",padding:"@px @px @px @px",border:"@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)",borderWidth:"@px @px @px @px",borderStyle:"@ @ @ @",borderColor:"rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)",zIndex:"@",zoom:"@",fontWeight:"@",textIndent:"@px",opacity:"@"}; +Element.implement({setOpacity:function(k){f(this,k);return this;},getOpacity:function(){return g(this);}});Element.Properties.opacity={set:function(k){f(this,k); +a(this,k);},get:function(){return g(this);}};Element.Styles=new Hash(Element.Styles);Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}}; +["Top","Right","Bottom","Left"].each(function(q){var p=Element.ShortStyles;var l=Element.Styles;["margin","padding"].each(function(r){var s=r+q;p[r][s]=l[s]="@px"; +});var o="border"+q;p.border[o]=l[o]="@px @ rgb(@, @, @)";var n=o+"Width",k=o+"Style",m=o+"Color";p[o]={};p.borderWidth[n]=p[o][n]=l[n]="@px";p.borderStyle[k]=p[o][k]=l[k]="@"; +p.borderColor[m]=p[o][m]=l[m]="rgb(@, @, @)";});})();(function(){Element.Properties.events={set:function(b){this.addEvents(b);}};[Element,Window,Document].invoke("implement",{addEvent:function(f,h){var i=this.retrieve("events",{}); +if(!i[f]){i[f]={keys:[],values:[]};}if(i[f].keys.contains(h)){return this;}i[f].keys.push(h);var g=f,b=Element.Events[f],d=h,j=this;if(b){if(b.onAdd){b.onAdd.call(this,h,f); +}if(b.condition){d=function(k){if(b.condition.call(this,k,f)){return h.call(this,k);}return true;};}if(b.base){g=Function.from(b.base).call(this,f);}}var e=function(){return h.call(j); +};var c=Element.NativeEvents[g];if(c){if(c==2){e=function(k){k=new DOMEvent(k,j.getWindow());if(d.call(j,k)===false){k.stop();}};}this.addListener(g,e,arguments[2]); +}i[f].values.push(e);return this;},removeEvent:function(e,d){var c=this.retrieve("events");if(!c||!c[e]){return this;}var h=c[e];var b=h.keys.indexOf(d); +if(b==-1){return this;}var g=h.values[b];delete h.keys[b];delete h.values[b];var f=Element.Events[e];if(f){if(f.onRemove){f.onRemove.call(this,d,e);}if(f.base){e=Function.from(f.base).call(this,e); +}}return(Element.NativeEvents[e])?this.removeListener(e,g,arguments[2]):this;},addEvents:function(b){for(var c in b){this.addEvent(c,b[c]);}return this; +},removeEvents:function(b){var d;if(typeOf(b)=="object"){for(d in b){this.removeEvent(d,b[d]);}return this;}var c=this.retrieve("events");if(!c){return this; +}if(!b){for(d in c){this.removeEvents(d);}this.eliminate("events");}else{if(c[b]){c[b].keys.each(function(e){this.removeEvent(b,e);},this);delete c[b]; +}}return this;},fireEvent:function(e,c,b){var d=this.retrieve("events");if(!d||!d[e]){return this;}c=Array.from(c);d[e].keys.each(function(f){if(b){f.delay(b,this,c); +}else{f.apply(this,c);}},this);return this;},cloneEvents:function(e,d){e=document.id(e);var c=e.retrieve("events");if(!c){return this;}if(!d){for(var b in c){this.cloneEvents(e,b); +}}else{if(c[d]){c[d].keys.each(function(f){this.addEvent(d,f);},this);}}return this;}});Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,orientationchange:2,touchstart:2,touchmove:2,touchend:2,touchcancel:2,gesturestart:2,gesturechange:2,gestureend:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,paste:2,input:2,load:2,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,error:1,abort:1,scroll:1}; +Element.Events={mousewheel:{base:(Browser.firefox)?"DOMMouseScroll":"mousewheel"}};if("onmouseenter" in document.documentElement){Element.NativeEvents.mouseenter=Element.NativeEvents.mouseleave=2; +}else{var a=function(b){var c=b.relatedTarget;if(c==null){return true;}if(!c){return false;}return(c!=this&&c.prefix!="xul"&&typeOf(this)!="document"&&!this.contains(c)); +};Element.Events.mouseenter={base:"mouseover",condition:a};Element.Events.mouseleave={base:"mouseout",condition:a};}if(!window.addEventListener){Element.NativeEvents.propertychange=2; +Element.Events.change={base:function(){var b=this.type;return(this.get("tag")=="input"&&(b=="radio"||b=="checkbox"))?"propertychange":"change";},condition:function(b){return this.type!="radio"||(b.event.propertyName=="checked"&&this.checked); +}};}Element.Events=new Hash(Element.Events);})();(function(){var c=!!window.addEventListener;Element.NativeEvents.focusin=Element.NativeEvents.focusout=2; +var k=function(l,m,n,o,p){while(p&&p!=l){if(m(p,o)){return n.call(p,o,p);}p=document.id(p.parentNode);}};var a={mouseenter:{base:"mouseover"},mouseleave:{base:"mouseout"},focus:{base:"focus"+(c?"":"in"),capture:true},blur:{base:c?"blur":"focusout",capture:true}}; +var b="$delegation:";var i=function(l){return{base:"focusin",remove:function(m,o){var p=m.retrieve(b+l+"listeners",{})[o];if(p&&p.forms){for(var n=p.forms.length; +n--;){p.forms[n].removeEvent(l,p.fns[n]);}}},listen:function(x,r,v,n,t,s){var o=(t.get("tag")=="form")?t:n.target.getParent("form");if(!o){return;}var u=x.retrieve(b+l+"listeners",{}),p=u[s]||{forms:[],fns:[]},m=p.forms,w=p.fns; +if(m.indexOf(o)!=-1){return;}m.push(o);var q=function(y){k(x,r,v,y,t);};o.addEvent(l,q);w.push(q);u[s]=p;x.store(b+l+"listeners",u);}};};var d=function(l){return{base:"focusin",listen:function(m,n,p,q,r){var o={blur:function(){this.removeEvents(o); +}};o[l]=function(s){k(m,n,p,s,r);};q.target.addEvents(o);}};};if(!c){Object.append(a,{submit:i("submit"),reset:i("reset"),change:d("change"),select:d("select")}); +}var h=Element.prototype,f=h.addEvent,j=h.removeEvent;var e=function(l,m){return function(r,q,n){if(r.indexOf(":relay")==-1){return l.call(this,r,q,n); +}var o=Slick.parse(r).expressions[0][0];if(o.pseudos[0].key!="relay"){return l.call(this,r,q,n);}var p=o.tag;o.pseudos.slice(1).each(function(s){p+=":"+s.key+(s.value?"("+s.value+")":""); +});l.call(this,r,q);return m.call(this,p,o.pseudos[0].value,q);};};var g={addEvent:function(v,q,x){var t=this.retrieve("$delegates",{}),r=t[v];if(r){for(var y in r){if(r[y].fn==x&&r[y].match==q){return this; +}}}var p=v,u=q,o=x,n=a[v]||{};v=n.base||p;q=function(B){return Slick.match(B,u);};var w=Element.Events[p];if(w&&w.condition){var l=q,m=w.condition;q=function(C,B){return l(C,B)&&m.call(C,B,v); +};}var z=this,s=String.uniqueID();var A=n.listen?function(B,C){if(!C&&B&&B.target){C=B.target;}if(C){n.listen(z,q,x,B,C,s);}}:function(B,C){if(!C&&B&&B.target){C=B.target; +}if(C){k(z,q,x,B,C);}};if(!r){r={};}r[s]={match:u,fn:o,delegator:A};t[p]=r;return f.call(this,v,A,n.capture);},removeEvent:function(r,n,t,u){var q=this.retrieve("$delegates",{}),p=q[r]; +if(!p){return this;}if(u){var m=r,w=p[u].delegator,l=a[r]||{};r=l.base||m;if(l.remove){l.remove(this,u);}delete p[u];q[m]=p;return j.call(this,r,w);}var o,v; +if(t){for(o in p){v=p[o];if(v.match==n&&v.fn==t){return g.removeEvent.call(this,r,n,t,o);}}}else{for(o in p){v=p[o];if(v.match==n){g.removeEvent.call(this,r,n,v.fn,o); +}}}return this;}};[Element,Window,Document].invoke("implement",{addEvent:e(f,g.addEvent),removeEvent:e(j,g.removeEvent)});})();(function(){var h=document.createElement("div"),e=document.createElement("div"); +h.style.height="0";h.appendChild(e);var d=(e.offsetParent===h);h=e=null;var l=function(m){return k(m,"position")!="static"||a(m);};var i=function(m){return l(m)||(/^(?:table|td|th)$/i).test(m.tagName); +};Element.implement({scrollTo:function(m,n){if(a(this)){this.getWindow().scrollTo(m,n);}else{this.scrollLeft=m;this.scrollTop=n;}return this;},getSize:function(){if(a(this)){return this.getWindow().getSize(); +}return{x:this.offsetWidth,y:this.offsetHeight};},getScrollSize:function(){if(a(this)){return this.getWindow().getScrollSize();}return{x:this.scrollWidth,y:this.scrollHeight}; +},getScroll:function(){if(a(this)){return this.getWindow().getScroll();}return{x:this.scrollLeft,y:this.scrollTop};},getScrolls:function(){var n=this.parentNode,m={x:0,y:0}; +while(n&&!a(n)){m.x+=n.scrollLeft;m.y+=n.scrollTop;n=n.parentNode;}return m;},getOffsetParent:d?function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null; +}var n=(k(m,"position")=="static")?i:l;while((m=m.parentNode)){if(n(m)){return m;}}return null;}:function(){var m=this;if(a(m)||k(m,"position")=="fixed"){return null; +}try{return m.offsetParent;}catch(n){}return null;},getOffsets:function(){if(this.getBoundingClientRect&&!Browser.Platform.ios){var r=this.getBoundingClientRect(),o=document.id(this.getDocument().documentElement),q=o.getScroll(),t=this.getScrolls(),s=(k(this,"position")=="fixed"); +return{x:r.left.toInt()+t.x+((s)?0:q.x)-o.clientLeft,y:r.top.toInt()+t.y+((s)?0:q.y)-o.clientTop};}var n=this,m={x:0,y:0};if(a(this)){return m;}while(n&&!a(n)){m.x+=n.offsetLeft; +m.y+=n.offsetTop;if(Browser.firefox){if(!c(n)){m.x+=b(n);m.y+=g(n);}var p=n.parentNode;if(p&&k(p,"overflow")!="visible"){m.x+=b(p);m.y+=g(p);}}else{if(n!=this&&Browser.safari){m.x+=b(n); +m.y+=g(n);}}n=n.offsetParent;}if(Browser.firefox&&!c(this)){m.x-=b(this);m.y-=g(this);}return m;},getPosition:function(p){var q=this.getOffsets(),n=this.getScrolls(); +var m={x:q.x-n.x,y:q.y-n.y};if(p&&(p=document.id(p))){var o=p.getPosition();return{x:m.x-o.x-b(p),y:m.y-o.y-g(p)};}return m;},getCoordinates:function(o){if(a(this)){return this.getWindow().getCoordinates(); +}var m=this.getPosition(o),n=this.getSize();var p={left:m.x,top:m.y,width:n.x,height:n.y};p.right=p.left+p.width;p.bottom=p.top+p.height;return p;},computePosition:function(m){return{left:m.x-j(this,"margin-left"),top:m.y-j(this,"margin-top")}; +},setPosition:function(m){return this.setStyles(this.computePosition(m));}});[Document,Window].invoke("implement",{getSize:function(){var m=f(this);return{x:m.clientWidth,y:m.clientHeight}; +},getScroll:function(){var n=this.getWindow(),m=f(this);return{x:n.pageXOffset||m.scrollLeft,y:n.pageYOffset||m.scrollTop};},getScrollSize:function(){var o=f(this),n=this.getSize(),m=this.getDocument().body; +return{x:Math.max(o.scrollWidth,m.scrollWidth,n.x),y:Math.max(o.scrollHeight,m.scrollHeight,n.y)};},getPosition:function(){return{x:0,y:0};},getCoordinates:function(){var m=this.getSize(); +return{top:0,left:0,bottom:m.y,right:m.x,height:m.y,width:m.x};}});var k=Element.getComputedStyle;function j(m,n){return k(m,n).toInt()||0;}function c(m){return k(m,"-moz-box-sizing")=="border-box"; +}function g(m){return j(m,"border-top-width");}function b(m){return j(m,"border-left-width");}function a(m){return(/^(?:body|html)$/i).test(m.tagName); +}function f(m){var n=m.getDocument();return(!n.compatMode||n.compatMode=="CSS1Compat")?n.html:n.body;}})();Element.alias({position:"setPosition"});[Window,Document,Element].invoke("implement",{getHeight:function(){return this.getSize().y; +},getWidth:function(){return this.getSize().x;},getScrollTop:function(){return this.getScroll().y;},getScrollLeft:function(){return this.getScroll().x; +},getScrollHeight:function(){return this.getScrollSize().y;},getScrollWidth:function(){return this.getScrollSize().x;},getTop:function(){return this.getPosition().y; +},getLeft:function(){return this.getPosition().x;}});(function(){var f=this.Fx=new Class({Implements:[Chain,Events,Options],options:{fps:60,unit:false,duration:500,frames:null,frameSkip:true,link:"ignore"},initialize:function(g){this.subject=this.subject||this; +this.setOptions(g);},getTransition:function(){return function(g){return -(Math.cos(Math.PI*g)-1)/2;};},step:function(g){if(this.options.frameSkip){var h=(this.time!=null)?(g-this.time):0,i=h/this.frameInterval; +this.time=g;this.frame+=i;}else{this.frame++;}if(this.frame=(7-4*d)/11){e=c*c-Math.pow((11-6*d-11*f)/4,2);break;}}return e;},Elastic:function(b,a){return Math.pow(2,10*--b)*Math.cos(20*b*Math.PI*(a&&a[0]||1)/3); +}});["Quad","Cubic","Quart","Quint"].each(function(b,a){Fx.Transitions[b]=new Fx.Transition(function(c){return Math.pow(c,a+2);});});(function(){var d=function(){},a=("onprogress" in new Browser.Request); +var c=this.Request=new Class({Implements:[Chain,Events,Options],options:{url:"",data:"",headers:{"X-Requested-With":"XMLHttpRequest",Accept:"text/javascript, text/html, application/xml, text/xml, */*"},async:true,format:false,method:"post",link:"ignore",isSuccess:null,emulation:true,urlEncoded:true,encoding:"utf-8",evalScripts:false,evalResponse:false,timeout:0,noCache:false},initialize:function(e){this.xhr=new Browser.Request(); +this.setOptions(e);this.headers=this.options.headers;},onStateChange:function(){var e=this.xhr;if(e.readyState!=4||!this.running){return;}this.running=false; +this.status=0;Function.attempt(function(){var f=e.status;this.status=(f==1223)?204:f;}.bind(this));e.onreadystatechange=d;if(a){e.onprogress=e.onloadstart=d; +}clearTimeout(this.timer);this.response={text:this.xhr.responseText||"",xml:this.xhr.responseXML};if(this.options.isSuccess.call(this,this.status)){this.success(this.response.text,this.response.xml); +}else{this.failure();}},isSuccess:function(){var e=this.status;return(e>=200&&e<300);},isRunning:function(){return !!this.running;},processScripts:function(e){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader("Content-type"))){return Browser.exec(e); +}return e.stripScripts(this.options.evalScripts);},success:function(f,e){this.onSuccess(this.processScripts(f),e);},onSuccess:function(){this.fireEvent("complete",arguments).fireEvent("success",arguments).callChain(); +},failure:function(){this.onFailure();},onFailure:function(){this.fireEvent("complete").fireEvent("failure",this.xhr);},loadstart:function(e){this.fireEvent("loadstart",[e,this.xhr]); +},progress:function(e){this.fireEvent("progress",[e,this.xhr]);},timeout:function(){this.fireEvent("timeout",this.xhr);},setHeader:function(e,f){this.headers[e]=f; +return this;},getHeader:function(e){return Function.attempt(function(){return this.xhr.getResponseHeader(e);}.bind(this));},check:function(){if(!this.running){return true; +}switch(this.options.link){case"cancel":this.cancel();return true;case"chain":this.chain(this.caller.pass(arguments,this));return false;}return false;},send:function(o){if(!this.check(o)){return this; +}this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.running=true;var l=typeOf(o);if(l=="string"||l=="element"){o={data:o};}var h=this.options; +o=Object.append({data:h.data,url:h.url,method:h.method},o);var j=o.data,f=String(o.url),e=o.method.toLowerCase();switch(typeOf(j)){case"element":j=document.id(j).toQueryString(); +break;case"object":case"hash":j=Object.toQueryString(j);}if(this.options.format){var m="format="+this.options.format;j=(j)?m+"&"+j:m;}if(this.options.emulation&&!["get","post"].contains(e)){var k="_method="+e; +j=(j)?k+"&"+j:k;e="post";}if(this.options.urlEncoded&&["post","put"].contains(e)){var g=(this.options.encoding)?"; charset="+this.options.encoding:"";this.headers["Content-type"]="application/x-www-form-urlencoded"+g; +}if(!f){f=document.location.pathname;}var i=f.lastIndexOf("/");if(i>-1&&(i=f.indexOf("#"))>-1){f=f.substr(0,i);}if(this.options.noCache){f+=(f.contains("?")?"&":"?")+String.uniqueID(); +}if(j&&e=="get"){f+=(f.contains("?")?"&":"?")+j;j=null;}var n=this.xhr;if(a){n.onloadstart=this.loadstart.bind(this);n.onprogress=this.progress.bind(this); +}n.open(e.toUpperCase(),f,this.options.async,this.options.user,this.options.password);if(this.options.user&&"withCredentials" in n){n.withCredentials=true; +}n.onreadystatechange=this.onStateChange.bind(this);Object.each(this.headers,function(q,p){try{n.setRequestHeader(p,q);}catch(r){this.fireEvent("exception",[p,q]); +}},this);this.fireEvent("request");n.send(j);if(!this.options.async){this.onStateChange();}else{if(this.options.timeout){this.timer=this.timeout.delay(this.options.timeout,this); +}}return this;},cancel:function(){if(!this.running){return this;}this.running=false;var e=this.xhr;e.abort();clearTimeout(this.timer);e.onreadystatechange=d; +if(a){e.onprogress=e.onloadstart=d;}this.xhr=new Browser.Request();this.fireEvent("cancel");return this;}});var b={};["get","post","put","delete","GET","POST","PUT","DELETE"].each(function(e){b[e]=function(g){var f={method:e}; +if(g!=null){f.data=g;}return this.send(f);};});c.implement(b);Element.Properties.send={set:function(e){var f=this.get("send").cancel();f.setOptions(e); +return this;},get:function(){var e=this.retrieve("send");if(!e){e=new c({data:this,link:"cancel",method:this.get("method")||"post",url:this.get("action")}); +this.store("send",e);}return e;}};Element.implement({send:function(e){var f=this.get("send");f.send({data:this,url:e||f.options.url});return this;}});})(); +Request.HTML=new Class({Extends:Request,options:{update:false,append:false,evalScripts:true,filter:false,headers:{Accept:"text/html, application/xml, text/xml, */*"}},success:function(f){var e=this.options,c=this.response; +c.html=f.stripScripts(function(h){c.javascript=h;});var d=c.html.match(/]*>([\s\S]*?)<\/body>/i);if(d){c.html=d[1];}var b=new Element("div").set("html",c.html); +c.tree=b.childNodes;c.elements=b.getElements(e.filter||"*");if(e.filter){c.tree=c.elements;}if(e.update){var g=document.id(e.update).empty();if(e.filter){g.adopt(c.elements); +}else{g.set("html",c.html);}}else{if(e.append){var a=document.id(e.append);if(e.filter){c.elements.reverse().inject(a);}else{a.adopt(b.getChildren());}}}if(e.evalScripts){Browser.exec(c.javascript); +}this.onSuccess(c.tree,c.elements,c.html,c.javascript);}});Element.Properties.load={set:function(a){var b=this.get("load").cancel();b.setOptions(a);return this; +},get:function(){var a=this.retrieve("load");if(!a){a=new Request.HTML({data:this,link:"cancel",update:this,method:"get"});this.store("load",a);}return a; +}};Element.implement({load:function(){this.get("load").send(Array.link(arguments,{data:Type.isObject,url:Type.isString}));return this;}});if(typeof JSON=="undefined"){this.JSON={}; +}JSON=new Hash({stringify:JSON.stringify,parse:JSON.parse});(function(){var special={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"}; +var escape=function(chr){return special[chr]||"\\u"+("0000"+chr.charCodeAt(0).toString(16)).slice(-4);};JSON.validate=function(string){string=string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""); +return(/^[\],:{}\s]*$/).test(string);};JSON.encode=JSON.stringify?function(obj){return JSON.stringify(obj);}:function(obj){if(obj&&obj.toJSON){obj=obj.toJSON(); +}switch(typeOf(obj)){case"string":return'"'+obj.replace(/[\x00-\x1f\\"]/g,escape)+'"';case"array":return"["+obj.map(JSON.encode).clean()+"]";case"object":case"hash":var string=[]; +Object.each(obj,function(value,key){var json=JSON.encode(value);if(json){string.push(JSON.encode(key)+":"+json);}});return"{"+string+"}";case"number":case"boolean":return""+obj; +case"null":return"null";}return null;};JSON.decode=function(string,secure){if(!string||typeOf(string)!="string"){return null;}if(secure||JSON.secure){if(JSON.parse){return JSON.parse(string); +}if(!JSON.validate(string)){throw new Error("JSON could not decode the input; security is enabled and the value is not secure.");}}return eval("("+string+")"); +};})();Request.JSON=new Class({Extends:Request,options:{secure:true},initialize:function(a){this.parent(a);Object.append(this.headers,{Accept:"application/json","X-Request":"JSON"}); +},success:function(c){var b;try{b=this.response.json=JSON.decode(c,this.options.secure);}catch(a){this.fireEvent("error",[c,a]);return;}if(b==null){this.onFailure(); +}else{this.onSuccess(b,c);}}});var Cookie=new Class({Implements:Options,options:{path:"/",domain:false,duration:false,secure:false,document:document,encode:true},initialize:function(b,a){this.key=b; +this.setOptions(a);},write:function(b){if(this.options.encode){b=encodeURIComponent(b);}if(this.options.domain){b+="; domain="+this.options.domain;}if(this.options.path){b+="; path="+this.options.path; +}if(this.options.duration){var a=new Date();a.setTime(a.getTime()+this.options.duration*24*60*60*1000);b+="; expires="+a.toGMTString();}if(this.options.secure){b+="; secure"; +}this.options.document.cookie=this.key+"="+b;return this;},read:function(){var a=this.options.document.cookie.match("(?:^|;)\\s*"+this.key.escapeRegExp()+"=([^;]*)"); +return(a)?decodeURIComponent(a[1]):null;},dispose:function(){new Cookie(this.key,Object.merge({},this.options,{duration:-1})).write("");return this;}}); +Cookie.write=function(b,c,a){return new Cookie(b,a).write(c);};Cookie.read=function(a){return new Cookie(a).read();};Cookie.dispose=function(b,a){return new Cookie(b,a).dispose(); +};(function(i,k){var l,f,e=[],c,b,d=k.createElement("div");var g=function(){clearTimeout(b);if(l){return;}Browser.loaded=l=true;k.removeListener("DOMContentLoaded",g).removeListener("readystatechange",a); +k.fireEvent("domready");i.fireEvent("domready");};var a=function(){for(var m=e.length;m--;){if(e[m]()){g();return true;}}return false;};var j=function(){clearTimeout(b); +if(!a()){b=setTimeout(j,10);}};k.addListener("DOMContentLoaded",g);var h=function(){try{d.doScroll();return true;}catch(m){}return false;};if(d.doScroll&&!h()){e.push(h); +c=true;}if(k.readyState){e.push(function(){var m=k.readyState;return(m=="loaded"||m=="complete");});}if("onreadystatechange" in k){k.addListener("readystatechange",a); +}else{c=true;}if(c){j();}Element.Events.domready={onAdd:function(m){if(l){m.call(this);}}};Element.Events.load={base:"load",onAdd:function(m){if(f&&this==i){m.call(this); +}},condition:function(){if(this==i){g();delete Element.Events.load;}return true;}};i.addEvent("load",function(){f=true;});})(window,document);(function(){var Swiff=this.Swiff=new Class({Implements:Options,options:{id:null,height:1,width:1,container:null,properties:{},params:{quality:"high",allowScriptAccess:"always",wMode:"window",swLiveConnect:true},callBacks:{},vars:{}},toElement:function(){return this.object; +},initialize:function(path,options){this.instance="Swiff_"+String.uniqueID();this.setOptions(options);options=this.options;var id=this.id=options.id||this.instance; +var container=document.id(options.container);Swiff.CallBacks[this.instance]={};var params=options.params,vars=options.vars,callBacks=options.callBacks; +var properties=Object.append({height:options.height,width:options.width},options.properties);var self=this;for(var callBack in callBacks){Swiff.CallBacks[this.instance][callBack]=(function(option){return function(){return option.apply(self.object,arguments); +};})(callBacks[callBack]);vars[callBack]="Swiff.CallBacks."+this.instance+"."+callBack;}params.flashVars=Object.toQueryString(vars);if(Browser.ie){properties.classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"; +params.movie=path;}else{properties.type="application/x-shockwave-flash";}properties.data=path;var build='';}}build+="";this.object=((container)?container.empty():new Element("div")).set("html",build).firstChild; +},replaces:function(element){element=document.id(element,true);element.parentNode.replaceChild(this.toElement(),element);return this;},inject:function(element){document.id(element,true).appendChild(this.toElement()); +return this;},remote:function(){return Swiff.remote.apply(Swiff,[this.toElement()].append(arguments));}});Swiff.CallBacks={};Swiff.remote=function(obj,fn){var rs=obj.CallFunction(''+__flash__argumentsToXML(arguments,2)+""); +return eval(rs);};})(); \ No newline at end of file diff -Nru qbittorrent-4.1.3/src/webui/www/public/scripts/mootools-1.2-more.js qbittorrent-3.3.15/src/webui/www/public/scripts/mootools-1.2-more.js --- qbittorrent-4.1.3/src/webui/www/public/scripts/mootools-1.2-more.js 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/scripts/mootools-1.2-more.js 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,326 @@ +// MooTools: the javascript framework. +// Load this file's selection again by visiting: http://mootools.net/more/208dad2fc7517c7e60f4afddd3e7c664 +// Or build this file again with packager using: packager build More/More More/Class.Binds More/Class.Occlude More/String.Extras More/String.QueryString More/URI More/Hash More/Fx.Elements More/Fx.Accordion More/Fx.Move More/Fx.Reveal More/Fx.Scroll More/Fx.Slide More/Fx.SmoothScroll More/Fx.Sort More/Drag More/Drag.Move More/Slider More/Sortables More/Assets More/Color More/Hash.Cookie More/HtmlTable More/Keyboard +/* +--- +copyrights: + - [MooTools](http://mootools.net) + +licenses: + - [MIT License](http://mootools.net/license.txt) +... +*/ +MooTools.More={version:"1.4.0.1",build:"a4244edf2aa97ac8a196fc96082dd35af1abab87"};Class.Mutators.Binds=function(a){if(!this.prototype.initialize){this.implement("initialize",function(){}); +}return Array.from(a).concat(this.prototype.Binds||[]);};Class.Mutators.initialize=function(a){return function(){Array.from(this.Binds).each(function(b){var c=this[b]; +if(c){this[b]=c.bind(this);}},this);return a.apply(this,arguments);};};Class.Occlude=new Class({occlude:function(c,b){b=document.id(b||this.element);var a=b.retrieve(c||this.property); +if(a&&!this.occluded){return(this.occluded=a);}this.occluded=false;b.store(c||this.property,this);return this.occluded;}});(function(){var c={a:/[àáâãäåăą]/g,A:/[ÀÁÂÃÄÅĂĄ]/g,c:/[ćčç]/g,C:/[ĆČÇ]/g,d:/[ďđ]/g,D:/[ĎÐ]/g,e:/[èéêëěę]/g,E:/[ÈÉÊËĚĘ]/g,g:/[ğ]/g,G:/[Ğ]/g,i:/[ìíîï]/g,I:/[ÌÍÎÏ]/g,l:/[ĺľł]/g,L:/[ĹĽŁ]/g,n:/[ñňń]/g,N:/[ÑŇŃ]/g,o:/[òóôõöøő]/g,O:/[ÒÓÔÕÖØ]/g,r:/[řŕ]/g,R:/[ŘŔ]/g,s:/[ššş]/g,S:/[ŠŞŚ]/g,t:/[ťţ]/g,T:/[ŤŢ]/g,ue:/[ü]/g,UE:/[Ü]/g,u:/[ùúûůµ]/g,U:/[ÙÚÛŮ]/g,y:/[ÿý]/g,Y:/[ŸÝ]/g,z:/[žźż]/g,Z:/[ŽŹŻ]/g,th:/[þ]/g,TH:/[Þ]/g,dh:/[ð]/g,DH:/[Ð]/g,ss:/[ß]/g,oe:/[œ]/g,OE:/[Œ]/g,ae:/[æ]/g,AE:/[Æ]/g},b={" ":/[\xa0\u2002\u2003\u2009]/g,"*":/[\xb7]/g,"'":/[\u2018\u2019]/g,'"':/[\u201c\u201d]/g,"...":/[\u2026]/g,"-":/[\u2013]/g,"»":/[\uFFFD]/g}; +var a=function(f,h){var e=f,g;for(g in h){e=e.replace(h[g],g);}return e;};var d=function(e,g){e=e||"";var h=g?"<"+e+"(?!\\w)[^>]*>([\\s\\S]*?)":"]+)?>",f=new RegExp(h,"gi"); +return f;};String.implement({standardize:function(){return a(this,c);},repeat:function(e){return new Array(e+1).join(this);},pad:function(e,h,g){if(this.length>=e){return this; +}var f=(h==null?" ":""+h).repeat(e-this.length).substr(0,e-this.length);if(!g||g=="right"){return this+f;}if(g=="left"){return f+this;}return f.substr(0,(f.length/2).floor())+this+f.substr(0,(f.length/2).ceil()); +},getTags:function(e,f){return this.match(d(e,f))||[];},stripTags:function(e,f){return this.replace(d(e,f),"");},tidy:function(){return a(this,b);},truncate:function(e,f,i){var h=this; +if(f==null&&arguments.length==1){f="…";}if(h.length>e){h=h.substring(0,e);if(i){var g=h.lastIndexOf(i);if(g!=-1){h=h.substr(0,g);}}if(f){h+=f;}}return h; +}});})();String.implement({parseQueryString:function(d,a){if(d==null){d=true;}if(a==null){a=true;}var c=this.split(/[&;]/),b={};if(!c.length){return b; +}c.each(function(i){var e=i.indexOf("=")+1,g=e?i.substr(e):"",f=e?i.substr(0,e-1).match(/([^\]\[]+|(\B)(?=\]))/g):[i],h=b;if(!f){return;}if(a){g=decodeURIComponent(g); +}f.each(function(k,j){if(d){k=decodeURIComponent(k);}var l=h[k];if(j0){c.pop(); +}else{if(f!="."){c.push(f);}}});return c.join("/")+"/";},combine:function(c){return c.value||c.scheme+"://"+(c.user?c.user+(c.password?":"+c.password:"")+"@":"")+(c.host||"")+(c.port&&c.port!=this.schemes[c.scheme]?":"+c.port:"")+(c.directory||"/")+(c.file||"")+(c.query?"?"+c.query:"")+(c.fragment?"#"+c.fragment:""); +},set:function(d,f,e){if(d=="value"){var c=f.match(a.regs.scheme);if(c){c=c[1];}if(c&&this.schemes[c.toLowerCase()]==null){this.parsed={scheme:c,value:f}; +}else{this.parsed=this.parse(f,(e||this).parsed)||(c?{scheme:c,value:f}:{value:f});}}else{if(d=="data"){this.setData(f);}else{this.parsed[d]=f;}}return this; +},get:function(c,d){switch(c){case"value":return this.combine(this.parsed,d?d.parsed:false);case"data":return this.getData();}return this.parsed[c]||""; +},go:function(){document.location.href=this.toString();},toURI:function(){return this;},getData:function(e,d){var c=this.get(d||"query");if(!(c||c===0)){return e?null:{}; +}var f=c.parseQueryString();return e?f[e]:f;},setData:function(c,f,d){if(typeof c=="string"){var e=this.getData();e[arguments[0]]=arguments[1];c=e;}else{if(f){c=Object.merge(this.getData(),c); +}}return this.set(d||"query",Object.toQueryString(c));},clearData:function(c){return this.set(c||"query","");},toString:b,valueOf:b});a.regs={endSlash:/\/$/,scheme:/^(\w+):/,directoryDot:/\.\/|\.$/}; +a.base=new a(Array.from(document.getElements("base[href]",true)).getLast(),{base:document.location});String.implement({toURI:function(c){return new a(this,c); +}});})();(function(){if(this.Hash){return;}var a=this.Hash=new Type("Hash",function(b){if(typeOf(b)=="hash"){b=Object.clone(b.getClean());}for(var c in b){this[c]=b[c]; +}return this;});this.$H=function(b){return new a(b);};a.implement({forEach:function(b,c){Object.forEach(this,b,c);},getClean:function(){var c={};for(var b in this){if(this.hasOwnProperty(b)){c[b]=this[b]; +}}return c;},getLength:function(){var c=0;for(var b in this){if(this.hasOwnProperty(b)){c++;}}return c;}});a.alias("each","forEach");a.implement({has:Object.prototype.hasOwnProperty,keyOf:function(b){return Object.keyOf(this,b); +},hasValue:function(b){return Object.contains(this,b);},extend:function(b){a.each(b||{},function(d,c){a.set(this,c,d);},this);return this;},combine:function(b){a.each(b||{},function(d,c){a.include(this,c,d); +},this);return this;},erase:function(b){if(this.hasOwnProperty(b)){delete this[b];}return this;},get:function(b){return(this.hasOwnProperty(b))?this[b]:null; +},set:function(b,c){if(!this[b]||this.hasOwnProperty(b)){this[b]=c;}return this;},empty:function(){a.each(this,function(c,b){delete this[b];},this);return this; +},include:function(b,c){if(this[b]==undefined){this[b]=c;}return this;},map:function(b,c){return new a(Object.map(this,b,c));},filter:function(b,c){return new a(Object.filter(this,b,c)); +},every:function(b,c){return Object.every(this,b,c);},some:function(b,c){return Object.some(this,b,c);},getKeys:function(){return Object.keys(this);},getValues:function(){return Object.values(this); +},toQueryString:function(b){return Object.toQueryString(this,b);}});a.alias({indexOf:"keyOf",contains:"hasValue"});})();Fx.Elements=new Class({Extends:Fx.CSS,initialize:function(b,a){this.elements=this.subject=$$(b); +this.parent(a);},compute:function(g,h,j){var c={};for(var d in g){var a=g[d],e=h[d],f=c[d]={};for(var b in a){f[b]=this.parent(a[b],e[b],j);}}return c; +},set:function(b){for(var c in b){if(!this.elements[c]){continue;}var a=b[c];for(var d in a){this.render(this.elements[c],d,a[d],this.options.unit);}}return this; +},start:function(c){if(!this.check(c)){return this;}var h={},j={};for(var d in c){if(!this.elements[d]){continue;}var f=c[d],a=h[d]={},g=j[d]={};for(var b in f){var e=this.prepare(this.elements[d],b,f[b]); +a[b]=e.from;g[b]=e.to;}}return this.parent(h,j);}});Fx.Accordion=new Class({Extends:Fx.Elements,options:{fixedHeight:false,fixedWidth:false,display:0,show:false,height:true,width:false,opacity:true,alwaysHide:false,trigger:"click",initialDisplayFx:true,resetHeight:true},initialize:function(){var g=function(h){return h!=null; +};var f=Array.link(arguments,{container:Type.isElement,options:Type.isObject,togglers:g,elements:g});this.parent(f.elements,f.options);var b=this.options,e=this.togglers=$$(f.togglers); +this.previous=-1;this.internalChain=new Chain();if(b.alwaysHide){this.options.link="chain";}if(b.show||this.options.show===0){b.display=false;this.previous=b.show; +}if(b.start){b.display=false;b.show=false;}var d=this.effects={};if(b.opacity){d.opacity="fullOpacity";}if(b.width){d.width=b.fixedWidth?"fullWidth":"offsetWidth"; +}if(b.height){d.height=b.fixedHeight?"fullHeight":"scrollHeight";}for(var c=0,a=e.length;c=0?a-1:0)).chain(d);}else{d();}return this;},detach:function(b){var a=function(c){c.removeEvent(this.options.trigger,c.retrieve("accordion:display")); +}.bind(this);if(!b){this.togglers.each(a);}else{a(b);}return this;},display:function(b,c){if(!this.check(b,c)){return this;}var h={},g=this.elements,a=this.options,f=this.effects; +if(c==null){c=true;}if(typeOf(b)=="element"){b=g.indexOf(b);}if(b==this.previous&&!a.alwaysHide){return this;}if(a.resetHeight){var e=g[this.previous]; +if(e&&!this.selfHidden){for(var d in f){e.setStyle(d,e[f[d]]);}}}if((this.timer&&a.link=="chain")||(b===this.previous&&!a.alwaysHide)){return this;}this.previous=b; +this.selfHidden=false;g.each(function(l,k){h[k]={};var j;if(k!=b){j=true;}else{if(a.alwaysHide&&((l.offsetHeight>0&&a.height)||l.offsetWidth>0&&a.width)){j=true; +this.selfHidden=true;}}this.fireEvent(j?"background":"active",[this.togglers[k],l]);for(var m in f){h[k][m]=j?0:l[f[m]];}if(!c&&!j&&a.resetHeight){h[k].height="auto"; +}},this);this.internalChain.clearChain();this.internalChain.chain(function(){if(a.resetHeight&&!this.selfHidden){var i=g[b];if(i){i.setStyle("height","auto"); +}}}.bind(this));return c?this.start(h):this.set(h).internalChain.callChain();}});var Accordion=new Class({Extends:Fx.Accordion,initialize:function(){this.parent.apply(this,arguments); +var a=Array.link(arguments,{container:Type.isElement});this.container=a.container;},addSection:function(c,b,e){c=document.id(c);b=document.id(b);var d=this.togglers.contains(c); +var a=this.togglers.length;if(a&&(!d||e)){e=e!=null?e:a-1;c.inject(this.togglers[e],"before");b.inject(c,"after");}else{if(this.container&&!d){c.inject(this.container); +b.inject(this.container);}}return this.parent.apply(this,arguments);}});(function(){var b=function(e,d){var f=[];Object.each(d,function(g){Object.each(g,function(h){e.each(function(i){f.push(i+"-"+h+(i=="border"?"-width":"")); +});});});return f;};var c=function(f,e){var d=0;Object.each(e,function(h,g){if(g.test(f)){d=d+h.toInt();}});return d;};var a=function(d){return !!(!d||d.offsetHeight||d.offsetWidth); +};Element.implement({measure:function(h){if(a(this)){return h.call(this);}var g=this.getParent(),e=[];while(!a(g)&&g!=document.body){e.push(g.expose()); +g=g.getParent();}var f=this.expose(),d=h.call(this);f();e.each(function(i){i();});return d;},expose:function(){if(this.getStyle("display")!="none"){return function(){}; +}var d=this.style.cssText;this.setStyles({display:"block",position:"absolute",visibility:"hidden"});return function(){this.style.cssText=d;}.bind(this); +},getDimensions:function(d){d=Object.merge({computeSize:false},d);var i={x:0,y:0};var h=function(j,e){return(e.computeSize)?j.getComputedSize(e):j.getSize(); +};var f=this.getParent("body");if(f&&this.getStyle("display")=="none"){i=this.measure(function(){return h(this,d);});}else{if(f){try{i=h(this,d);}catch(g){}}}return Object.append(i,(i.x||i.x===0)?{width:i.x,height:i.y}:{x:i.width,y:i.height}); +},getComputedSize:function(d){if(d&&d.plains){d.planes=d.plains;}d=Object.merge({styles:["padding","border"],planes:{height:["top","bottom"],width:["left","right"]},mode:"both"},d); +var g={},e={width:0,height:0},f;if(d.mode=="vertical"){delete e.width;delete d.planes.width;}else{if(d.mode=="horizontal"){delete e.height;delete d.planes.height; +}}b(d.styles,d.planes).each(function(h){g[h]=this.getStyle(h).toInt();},this);Object.each(d.planes,function(i,h){var k=h.capitalize(),j=this.getStyle(h); +if(j=="auto"&&!f){f=this.getDimensions();}j=g[h]=(j=="auto")?f[h]:j.toInt();e["total"+k]=j;i.each(function(m){var l=c(m,g);e["computed"+m.capitalize()]=l; +e["total"+k]+=l;});},this);return Object.append(e,g);}});})();(function(b){var a=Element.Position={options:{relativeTo:document.body,position:{x:"center",y:"center"},offset:{x:0,y:0}},getOptions:function(d,c){c=Object.merge({},a.options,c); +a.setPositionOption(c);a.setEdgeOption(c);a.setOffsetOption(d,c);a.setDimensionsOption(d,c);return c;},setPositionOption:function(c){c.position=a.getCoordinateFromValue(c.position); +},setEdgeOption:function(d){var c=a.getCoordinateFromValue(d.edge);d.edge=c?c:(d.position.x=="center"&&d.position.y=="center")?{x:"center",y:"center"}:{x:"left",y:"top"}; +},setOffsetOption:function(f,d){var c={x:0,y:0},g=f.measure(function(){return document.id(this.getOffsetParent());}),e=g.getScroll();if(!g||g==f.getDocument().body){return; +}c=g.measure(function(){var i=this.getPosition();if(this.getStyle("position")=="fixed"){var h=window.getScroll();i.x+=h.x;i.y+=h.y;}return i;});d.offset={parentPositioned:g!=document.id(d.relativeTo),x:d.offset.x-c.x+e.x,y:d.offset.y-c.y+e.y}; +},setDimensionsOption:function(d,c){c.dimensions=d.getDimensions({computeSize:true,styles:["padding","border","margin"]});},getPosition:function(e,d){var c={}; +d=a.getOptions(e,d);var f=document.id(d.relativeTo)||document.body;a.setPositionCoordinates(d,c,f);if(d.edge){a.toEdge(c,d);}var g=d.offset;c.left=((c.x>=0||g.parentPositioned||d.allowNegative)?c.x:0).toInt(); +c.top=((c.y>=0||g.parentPositioned||d.allowNegative)?c.y:0).toInt();a.toMinMax(c,d);if(d.relFixedPosition||f.getStyle("position")=="fixed"){a.toRelFixedPosition(f,c); +}if(d.ignoreScroll){a.toIgnoreScroll(f,c);}if(d.ignoreMargins){a.toIgnoreMargins(c,d);}c.left=Math.ceil(c.left);c.top=Math.ceil(c.top);delete c.x;delete c.y; +return c;},setPositionCoordinates:function(k,g,d){var f=k.offset.y,h=k.offset.x,e=(d==document.body)?window.getScroll():d.getPosition(),j=e.y,c=e.x,i=window.getSize(); +switch(k.position.x){case"left":g.x=c+h;break;case"right":g.x=c+h+d.offsetWidth;break;default:g.x=c+((d==document.body?i.x:d.offsetWidth)/2)+h;break;}switch(k.position.y){case"top":g.y=j+f; +break;case"bottom":g.y=j+f+d.offsetHeight;break;default:g.y=j+((d==document.body?i.y:d.offsetHeight)/2)+f;break;}},toMinMax:function(c,d){var f={left:"x",top:"y"},e; +["minimum","maximum"].each(function(g){["left","top"].each(function(h){e=d[g]?d[g][f[h]]:null;if(e!=null&&((g=="minimum")?c[h]e)){c[h]=e;}});}); +},toRelFixedPosition:function(e,c){var d=window.getScroll();c.top+=d.y;c.left+=d.x;},toIgnoreScroll:function(e,d){var c=e.getScroll();d.top-=c.y;d.left-=c.x; +},toIgnoreMargins:function(c,d){c.left+=d.edge.x=="right"?d.dimensions["margin-right"]:(d.edge.x!="center"?-d.dimensions["margin-left"]:-d.dimensions["margin-left"]+((d.dimensions["margin-right"]+d.dimensions["margin-left"])/2)); +c.top+=d.edge.y=="bottom"?d.dimensions["margin-bottom"]:(d.edge.y!="center"?-d.dimensions["margin-top"]:-d.dimensions["margin-top"]+((d.dimensions["margin-bottom"]+d.dimensions["margin-top"])/2)); +},toEdge:function(c,d){var e={},g=d.dimensions,f=d.edge;switch(f.x){case"left":e.x=0;break;case"right":e.x=-g.x-g.computedRight-g.computedLeft;break;default:e.x=-(Math.round(g.totalWidth/2)); +break;}switch(f.y){case"top":e.y=0;break;case"bottom":e.y=-g.y-g.computedTop-g.computedBottom;break;default:e.y=-(Math.round(g.totalHeight/2));break;}c.x+=e.x; +c.y+=e.y;},getCoordinateFromValue:function(c){if(typeOf(c)!="string"){return c;}c=c.toLowerCase();return{x:c.test("left")?"left":(c.test("right")?"right":"center"),y:c.test(/upper|top/)?"top":(c.test("bottom")?"bottom":"center")}; +}};Element.implement({position:function(d){if(d&&(d.x!=null||d.y!=null)){return(b?b.apply(this,arguments):this);}var c=this.setStyle("position","absolute").calculatePosition(d); +return(d&&d.returnPos)?c:this.setStyles(c);},calculatePosition:function(c){return a.getPosition(this,c);}});})(Element.prototype.position);Fx.Move=new Class({Extends:Fx.Morph,options:{relativeTo:document.body,position:"center",edge:false,offset:{x:0,y:0}},start:function(a){var b=this.element,c=b.getStyles("top","left"); +if(c.top=="auto"||c.left=="auto"){b.setPosition(b.getPosition(b.getOffsetParent()));}return this.parent(b.position(Object.merge({},this.options,a,{returnPos:true}))); +}});Element.Properties.move={set:function(a){this.get("move").cancel().setOptions(a);return this;},get:function(){var a=this.retrieve("move");if(!a){a=new Fx.Move(this,{link:"cancel"}); +this.store("move",a);}return a;}};Element.implement({move:function(a){this.get("move").start(a);return this;}});Element.implement({isDisplayed:function(){return this.getStyle("display")!="none"; +},isVisible:function(){var a=this.offsetWidth,b=this.offsetHeight;return(a==0&&b==0)?false:(a>0&&b>0)?true:this.style.display!="none";},toggle:function(){return this[this.isDisplayed()?"hide":"show"](); +},hide:function(){var b;try{b=this.getStyle("display");}catch(a){}if(b=="none"){return this;}return this.store("element:_originalDisplay",b||"").setStyle("display","none"); +},show:function(a){if(!a&&this.isDisplayed()){return this;}a=a||this.retrieve("element:_originalDisplay")||"block";return this.setStyle("display",(a=="none")?"block":a); +},swapClass:function(a,b){return this.removeClass(a).addClass(b);}});Document.implement({clearSelection:function(){if(window.getSelection){var a=window.getSelection(); +if(a&&a.removeAllRanges){a.removeAllRanges();}}else{if(document.selection&&document.selection.empty){try{document.selection.empty();}catch(b){}}}}});(function(){var a=function(d){var b=d.options.hideInputs; +if(window.OverText){var c=[null];OverText.each(function(e){c.include("."+e.options.labelClass);});if(c){b+=c.join(", ");}}return(b)?d.element.getElements(b):null; +};Fx.Reveal=new Class({Extends:Fx.Morph,options:{link:"cancel",styles:["padding","border","margin"],transitionOpacity:!Browser.ie6,mode:"vertical",display:function(){return this.element.get("tag")!="tr"?"block":"table-row"; +},opacity:1,hideInputs:Browser.ie?"select, input, textarea, object, embed":null},dissolve:function(){if(!this.hiding&&!this.showing){if(this.element.getStyle("display")!="none"){this.hiding=true; +this.showing=false;this.hidden=true;this.cssText=this.element.style.cssText;var d=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode}); +if(this.options.transitionOpacity){d.opacity=this.options.opacity;}var c={};Object.each(d,function(f,e){c[e]=[f,0];});this.element.setStyles({display:Function.from(this.options.display).call(this),overflow:"hidden"}); +var b=a(this);if(b){b.setStyle("visibility","hidden");}this.$chain.unshift(function(){if(this.hidden){this.hiding=false;this.element.style.cssText=this.cssText; +this.element.setStyle("display","none");if(b){b.setStyle("visibility","visible");}}this.fireEvent("hide",this.element);this.callChain();}.bind(this));this.start(c); +}else{this.callChain.delay(10,this);this.fireEvent("complete",this.element);this.fireEvent("hide",this.element);}}else{if(this.options.link=="chain"){this.chain(this.dissolve.bind(this)); +}else{if(this.options.link=="cancel"&&!this.hiding){this.cancel();this.dissolve();}}}return this;},reveal:function(){if(!this.showing&&!this.hiding){if(this.element.getStyle("display")=="none"){this.hiding=false; +this.showing=true;this.hidden=false;this.cssText=this.element.style.cssText;var d;this.element.measure(function(){d=this.element.getComputedSize({styles:this.options.styles,mode:this.options.mode}); +}.bind(this));if(this.options.heightOverride!=null){d.height=this.options.heightOverride.toInt();}if(this.options.widthOverride!=null){d.width=this.options.widthOverride.toInt(); +}if(this.options.transitionOpacity){this.element.setStyle("opacity",0);d.opacity=this.options.opacity;}var c={height:0,display:Function.from(this.options.display).call(this)}; +Object.each(d,function(f,e){c[e]=0;});c.overflow="hidden";this.element.setStyles(c);var b=a(this);if(b){b.setStyle("visibility","hidden");}this.$chain.unshift(function(){this.element.style.cssText=this.cssText; +this.element.setStyle("display",Function.from(this.options.display).call(this));if(!this.hidden){this.showing=false;}if(b){b.setStyle("visibility","visible"); +}this.callChain();this.fireEvent("show",this.element);}.bind(this));this.start(d);}else{this.callChain();this.fireEvent("complete",this.element);this.fireEvent("show",this.element); +}}else{if(this.options.link=="chain"){this.chain(this.reveal.bind(this));}else{if(this.options.link=="cancel"&&!this.showing){this.cancel();this.reveal(); +}}}return this;},toggle:function(){if(this.element.getStyle("display")=="none"){this.reveal();}else{this.dissolve();}return this;},cancel:function(){this.parent.apply(this,arguments); +if(this.cssText!=null){this.element.style.cssText=this.cssText;}this.hiding=false;this.showing=false;return this;}});Element.Properties.reveal={set:function(b){this.get("reveal").cancel().setOptions(b); +return this;},get:function(){var b=this.retrieve("reveal");if(!b){b=new Fx.Reveal(this);this.store("reveal",b);}return b;}};Element.Properties.dissolve=Element.Properties.reveal; +Element.implement({reveal:function(b){this.get("reveal").setOptions(b).reveal();return this;},dissolve:function(b){this.get("reveal").setOptions(b).dissolve(); +return this;},nix:function(b){var c=Array.link(arguments,{destroy:Type.isBoolean,options:Type.isObject});this.get("reveal").setOptions(b).dissolve().chain(function(){this[c.destroy?"destroy":"dispose"](); +}.bind(this));return this;},wink:function(){var c=Array.link(arguments,{duration:Type.isNumber,options:Type.isObject});var b=this.get("reveal").setOptions(c.options); +b.reveal().chain(function(){(function(){b.dissolve();}).delay(c.duration||2000);});}});})();(function(){Fx.Scroll=new Class({Extends:Fx,options:{offset:{x:0,y:0},wheelStops:true},initialize:function(c,b){this.element=this.subject=document.id(c); +this.parent(b);if(typeOf(this.element)!="element"){this.element=document.id(this.element.getDocument().body);}if(this.options.wheelStops){var d=this.element,e=this.cancel.pass(false,this); +this.addEvent("start",function(){d.addEvent("mousewheel",e);},true);this.addEvent("complete",function(){d.removeEvent("mousewheel",e);},true);}},set:function(){var b=Array.flatten(arguments); +if(Browser.firefox){b=[Math.round(b[0]),Math.round(b[1])];}this.element.scrollTo(b[0],b[1]);return this;},compute:function(d,c,b){return[0,1].map(function(e){return Fx.compute(d[e],c[e],b); +});},start:function(c,d){if(!this.check(c,d)){return this;}var b=this.element.getScroll();return this.parent([b.x,b.y],[c,d]);},calculateScroll:function(g,f){var d=this.element,b=d.getScrollSize(),h=d.getScroll(),j=d.getSize(),c=this.options.offset,i={x:g,y:f}; +for(var e in i){if(!i[e]&&i[e]!==0){i[e]=h[e];}if(typeOf(i[e])!="number"){i[e]=b[e]-j[e];}i[e]+=c[e];}return[i.x,i.y];},toTop:function(){return this.start.apply(this,this.calculateScroll(false,0)); +},toLeft:function(){return this.start.apply(this,this.calculateScroll(0,false));},toRight:function(){return this.start.apply(this,this.calculateScroll("right",false)); +},toBottom:function(){return this.start.apply(this,this.calculateScroll(false,"bottom"));},toElement:function(d,e){e=e?Array.from(e):["x","y"];var c=a(this.element)?{x:0,y:0}:this.element.getScroll(); +var b=Object.map(document.id(d).getPosition(this.element),function(g,f){return e.contains(f)?g+c[f]:false;});return this.start.apply(this,this.calculateScroll(b.x,b.y)); +},toElementEdge:function(d,g,e){g=g?Array.from(g):["x","y"];d=document.id(d);var i={},f=d.getPosition(this.element),j=d.getSize(),h=this.element.getScroll(),b=this.element.getSize(),c={x:f.x+j.x,y:f.y+j.y}; +["x","y"].each(function(k){if(g.contains(k)){if(c[k]>h[k]+b[k]){i[k]=c[k]-b[k];}if(f[k]this.elements.length){e.splice(this.elements.length-1,e.length-this.elements.length); +}}var b=0;i=a=0;e.each(function(k){var j={};if(d){j.top=i-f[k].top-b;i+=f[k].height;}else{j.left=a-f[k].left;a+=f[k].width;}b=b+f[k].margin;c[k]=j;},this); +var g={};Array.clone(e).sort().each(function(j){g[j]=c[j];});this.start(g);this.currentOrder=e;return this;},rearrangeDOM:function(a){a=a||this.currentOrder; +var b=this.elements[0].getParent();var c=[];this.elements.setStyle("opacity",0);a.each(function(d){c.push(this.elements[d].inject(b).setStyles({top:0,left:0})); +},this);this.elements.setStyle("opacity",1);this.elements=$$(c);this.setDefaultOrder();return this;},getDefaultOrder:function(){return this.elements.map(function(b,a){return a; +});},getCurrentOrder:function(){return this.currentOrder;},forward:function(){return this.sort(this.getDefaultOrder());},backward:function(){return this.sort(this.getDefaultOrder().reverse()); +},reverse:function(){return this.sort(this.currentOrder.reverse());},sortByElements:function(a){return this.sort(a.map(function(b){return this.elements.indexOf(b); +},this));},swap:function(c,b){if(typeOf(c)=="element"){c=this.elements.indexOf(c);}if(typeOf(b)=="element"){b=this.elements.indexOf(b);}var a=Array.clone(this.currentOrder); +a[this.currentOrder.indexOf(c)]=b;a[this.currentOrder.indexOf(b)]=c;return this.sort(a);}});var Drag=new Class({Implements:[Events,Options],options:{snap:6,unit:"px",grid:false,style:true,limit:false,handle:false,invert:false,preventDefault:false,stopPropagation:false,modifiers:{x:"left",y:"top"}},initialize:function(){var b=Array.link(arguments,{options:Type.isObject,element:function(c){return c!=null; +}});this.element=document.id(b.element);this.document=this.element.getDocument();this.setOptions(b.options||{});var a=typeOf(this.options.handle);this.handles=((a=="array"||a=="collection")?$$(this.options.handle):document.id(this.options.handle))||this.element; +this.mouse={now:{},pos:{}};this.value={start:{},now:{}};this.selection=(Browser.ie)?"selectstart":"mousedown";if(Browser.ie&&!Drag.ondragstartFixed){document.ondragstart=Function.from(false); +Drag.ondragstartFixed=true;}this.bound={start:this.start.bind(this),check:this.check.bind(this),drag:this.drag.bind(this),stop:this.stop.bind(this),cancel:this.cancel.bind(this),eventStop:Function.from(false)}; +this.attach();},attach:function(){this.handles.addEvent("mousedown",this.bound.start);return this;},detach:function(){this.handles.removeEvent("mousedown",this.bound.start); +return this;},start:function(a){var j=this.options;if(a.rightClick){return;}if(j.preventDefault){a.preventDefault();}if(j.stopPropagation){a.stopPropagation(); +}this.mouse.start=a.page;this.fireEvent("beforeStart",this.element);var c=j.limit;this.limit={x:[],y:[]};var e,g;for(e in j.modifiers){if(!j.modifiers[e]){continue; +}var b=this.element.getStyle(j.modifiers[e]);if(b&&!b.match(/px$/)){if(!g){g=this.element.getCoordinates(this.element.getOffsetParent());}b=g[j.modifiers[e]]; +}if(j.style){this.value.now[e]=(b||0).toInt();}else{this.value.now[e]=this.element[j.modifiers[e]];}if(j.invert){this.value.now[e]*=-1;}this.mouse.pos[e]=a.page[e]-this.value.now[e]; +if(c&&c[e]){var d=2;while(d--){var f=c[e][d];if(f||f===0){this.limit[e][d]=(typeof f=="function")?f():f;}}}}if(typeOf(this.options.grid)=="number"){this.options.grid={x:this.options.grid,y:this.options.grid}; +}var h={mousemove:this.bound.check,mouseup:this.bound.cancel};h[this.selection]=this.bound.eventStop;this.document.addEvents(h);},check:function(a){if(this.options.preventDefault){a.preventDefault(); +}var b=Math.round(Math.sqrt(Math.pow(a.page.x-this.mouse.start.x,2)+Math.pow(a.page.y-this.mouse.start.y,2)));if(b>this.options.snap){this.cancel();this.document.addEvents({mousemove:this.bound.drag,mouseup:this.bound.stop}); +this.fireEvent("start",[this.element,a]).fireEvent("snap",this.element);}},drag:function(b){var a=this.options;if(a.preventDefault){b.preventDefault(); +}this.mouse.now=b.page;for(var c in a.modifiers){if(!a.modifiers[c]){continue;}this.value.now[c]=this.mouse.now[c]-this.mouse.pos[c];if(a.invert){this.value.now[c]*=-1; +}if(a.limit&&this.limit[c]){if((this.limit[c][1]||this.limit[c][1]===0)&&(this.value.now[c]>this.limit[c][1])){this.value.now[c]=this.limit[c][1];}else{if((this.limit[c][0]||this.limit[c][0]===0)&&(this.value.now[c]d.left&&b.xd.top);},this).getLast();if(this.overed!=a){if(this.overed){this.fireEvent("leave",[this.element,this.overed]); +}if(a){this.fireEvent("enter",[this.element,a]);}this.overed=a;}},drag:function(a){this.parent(a);if(this.options.checkDroppables&&this.droppables.length){this.checkDroppables(); +}},stop:function(a){this.checkDroppables();this.fireEvent("drop",[this.element,this.overed,a]);this.overed=null;return this.parent(a);}});Element.implement({makeDraggable:function(a){var b=new Drag.Move(this,a); +this.store("dragger",b);return b;}});var Slider=new Class({Implements:[Events,Options],Binds:["clickedElement","draggedKnob","scrolledElement"],options:{onTick:function(a){this.setKnobPosition(a); +},initialStep:0,snap:false,offset:0,range:false,wheel:false,steps:100,mode:"horizontal"},initialize:function(f,a,e){this.setOptions(e);e=this.options;this.element=document.id(f); +a=this.knob=document.id(a);this.previousChange=this.previousEnd=this.step=-1;var b={},d={x:false,y:false};switch(e.mode){case"vertical":this.axis="y";this.property="top"; +this.offset="offsetHeight";break;case"horizontal":this.axis="x";this.property="left";this.offset="offsetWidth";}this.setSliderDimensions();this.setRange(e.range); +if(a.getStyle("position")=="static"){a.setStyle("position","relative");}a.setStyle(this.property,-e.offset);d[this.axis]=this.property;b[this.axis]=[-e.offset,this.full-e.offset]; +var c={snap:0,limit:b,modifiers:d,onDrag:this.draggedKnob,onStart:this.draggedKnob,onBeforeStart:(function(){this.isDragging=true;}).bind(this),onCancel:function(){this.isDragging=false; +}.bind(this),onComplete:function(){this.isDragging=false;this.draggedKnob();this.end();}.bind(this)};if(e.snap){this.setSnap(c);}this.drag=new Drag(a,c); +this.attach();if(e.initialStep!=null){this.set(e.initialStep);}},attach:function(){this.element.addEvent("mousedown",this.clickedElement);if(this.options.wheel){this.element.addEvent("mousewheel",this.scrolledElement); +}this.drag.attach();return this;},detach:function(){this.element.removeEvent("mousedown",this.clickedElement).removeEvent("mousewheel",this.scrolledElement); +this.drag.detach();return this;},autosize:function(){this.setSliderDimensions().setKnobPosition(this.toPosition(this.step));this.drag.options.limit[this.axis]=[-this.options.offset,this.full-this.options.offset]; +if(this.options.snap){this.setSnap();}return this;},setSnap:function(a){if(!a){a=this.drag.options;}a.grid=Math.ceil(this.stepWidth);a.limit[this.axis][1]=this.full; +return this;},setKnobPosition:function(a){if(this.options.snap){a=this.toPosition(this.step);}this.knob.setStyle(this.property,a);return this;},setSliderDimensions:function(){this.full=this.element.measure(function(){this.half=this.knob[this.offset]/2; +return this.element[this.offset]-this.knob[this.offset]+(this.options.offset*2);}.bind(this));return this;},set:function(a){if(!((this.range>0)^(a0)^(a>this.max))){a=this.max;}this.step=Math.round(a);return this.checkStep().fireEvent("tick",this.toPosition(this.step)).end();},setRange:function(a,b){this.min=Array.pick([a[0],0]); +this.max=Array.pick([a[1],this.options.steps]);this.range=this.max-this.min;this.steps=this.options.steps||this.full;this.stepSize=Math.abs(this.range)/this.steps; +this.stepWidth=this.stepSize*this.full/Math.abs(this.range);if(a){this.set(Array.pick([b,this.step]).floor(this.min).max(this.max));}return this;},clickedElement:function(c){if(this.isDragging||c.target==this.knob){return; +}var b=this.range<0?-1:1,a=c.page[this.axis]-this.element.getPosition()[this.axis]-this.half;a=a.limit(-this.options.offset,this.full-this.options.offset); +this.step=Math.round(this.min+b*this.toStep(a));this.checkStep().fireEvent("tick",a).end();},scrolledElement:function(a){var b=(this.options.mode=="horizontal")?(a.wheel<0):(a.wheel>0); +this.set(this.step+(b?-1:1)*this.stepSize);a.stop();},draggedKnob:function(){var b=this.range<0?-1:1,a=this.drag.value.now[this.axis];a=a.limit(-this.options.offset,this.full-this.options.offset); +this.step=Math.round(this.min+b*this.toStep(a));this.checkStep();},checkStep:function(){var a=this.step;if(this.previousChange!=a){this.previousChange=a; +this.fireEvent("change",a);}return this;},end:function(){var a=this.step;if(this.previousEnd!==a){this.previousEnd=a;this.fireEvent("complete",a+"");}return this; +},toStep:function(a){var b=(a+this.options.offset)*this.stepSize/this.full*this.steps;return this.options.steps?Math.round(b-=b%this.stepSize):b;},toPosition:function(a){return(this.full*Math.abs(this.min-a))/(this.steps*this.stepSize)-this.options.offset; +}});var Sortables=new Class({Implements:[Events,Options],options:{opacity:1,clone:false,revert:false,handle:false,dragOptions:{},snap:4,constrain:false,preventDefault:false},initialize:function(a,b){this.setOptions(b); +this.elements=[];this.lists=[];this.idle=true;this.addLists($$(document.id(a)||a));if(!this.options.clone){this.options.revert=false;}if(this.options.revert){this.effect=new Fx.Morph(null,Object.merge({duration:250,link:"cancel"},this.options.revert)); +}},attach:function(){this.addLists(this.lists);return this;},detach:function(){this.lists=this.removeLists(this.lists);return this;},addItems:function(){Array.flatten(arguments).each(function(a){this.elements.push(a); +var b=a.retrieve("sortables:start",function(c){this.start.call(this,c,a);}.bind(this));(this.options.handle?a.getElement(this.options.handle)||a:a).addEvent("mousedown",b); +},this);return this;},addLists:function(){Array.flatten(arguments).each(function(a){this.lists.include(a);this.addItems(a.getChildren());},this);return this; +},removeItems:function(){return $$(Array.flatten(arguments).map(function(a){this.elements.erase(a);var b=a.retrieve("sortables:start");(this.options.handle?a.getElement(this.options.handle)||a:a).removeEvent("mousedown",b); +return a;},this));},removeLists:function(){return $$(Array.flatten(arguments).map(function(a){this.lists.erase(a);this.removeItems(a.getChildren());return a; +},this));},getClone:function(b,a){if(!this.options.clone){return new Element(a.tagName).inject(document.body);}if(typeOf(this.options.clone)=="function"){return this.options.clone.call(this,b,a,this.list); +}var c=a.clone(true).setStyles({margin:0,position:"absolute",visibility:"hidden",width:a.getStyle("width")}).addEvent("mousedown",function(d){a.fireEvent("mousedown",d); +});if(c.get("html").test("radio")){c.getElements("input[type=radio]").each(function(d,e){d.set("name","clone_"+e);if(d.get("checked")){a.getElements("input[type=radio]")[e].set("checked",true); +}});}return c.inject(this.list).setPosition(a.getPosition(a.getOffsetParent()));},getDroppables:function(){var a=this.list.getChildren().erase(this.clone).erase(this.element); +if(!this.options.constrain){a.append(this.lists).erase(this.list);}return a;},insert:function(c,b){var a="inside";if(this.lists.contains(b)){this.list=b; +this.drag.droppables=this.getDroppables();}else{a=this.element.getAllPrevious().contains(b)?"before":"after";}this.element.inject(b,a);this.fireEvent("sort",[this.element,this.clone]); +},start:function(b,a){if(!this.idle||b.rightClick||["button","input","a","textarea"].contains(b.target.get("tag"))){return;}this.idle=false;this.element=a; +this.opacity=a.getStyle("opacity");this.list=a.getParent();this.clone=this.getClone(b,a);this.drag=new Drag.Move(this.clone,Object.merge({preventDefault:this.options.preventDefault,snap:this.options.snap,container:this.options.constrain&&this.element.getParent(),droppables:this.getDroppables()},this.options.dragOptions)).addEvents({onSnap:function(){b.stop(); +this.clone.setStyle("visibility","visible");this.element.setStyle("opacity",this.options.opacity||0);this.fireEvent("start",[this.element,this.clone]); +}.bind(this),onEnter:this.insert.bind(this),onCancel:this.end.bind(this),onComplete:this.end.bind(this)});this.clone.inject(this.element,"before");this.drag.start(b); +},end:function(){this.drag.detach();this.element.setStyle("opacity",this.opacity);if(this.effect){var b=this.element.getStyles("width","height"),d=this.clone,c=d.computePosition(this.element.getPosition(this.clone.getOffsetParent())); +var a=function(){this.removeEvent("cancel",a);d.destroy();};this.effect.element=d;this.effect.start({top:c.top,left:c.left,width:b.width,height:b.height,opacity:0.25}).addEvent("cancel",a).chain(a); +}else{this.clone.destroy();}this.reset();},reset:function(){this.idle=true;this.fireEvent("complete",this.element);},serialize:function(){var c=Array.link(arguments,{modifier:Type.isFunction,index:function(d){return d!=null; +}});var b=this.lists.map(function(d){return d.getChildren().map(c.modifier||function(e){return e.get("id");},this);},this);var a=c.index;if(this.lists.length==1){a=0; +}return(a||a===0)&&a>=0&&a=3){d="rgb";c=Array.slice(arguments,0,3);}else{if(typeof c=="string"){if(c.match(/rgb/)){c=c.rgbToHex().hexToRgb(true); +}else{if(c.match(/hsb/)){c=c.hsbToRgb();}else{c=c.hexToRgb(true);}}}}d=d||"rgb";switch(d){case"hsb":var b=c;c=c.hsbToRgb();c.hsb=b;break;case"hex":c=c.hexToRgb(true); +break;}c.rgb=c.slice(0,3);c.hsb=c.hsb||c.rgbToHsb();c.hex=c.rgbToHex();return Object.append(c,this);});a.implement({mix:function(){var b=Array.slice(arguments); +var d=(typeOf(b.getLast())=="number")?b.pop():50;var c=this.slice();b.each(function(e){e=new a(e);for(var f=0;f<3;f++){c[f]=Math.round((c[f]/100*(100-d))+(e[f]/100*d)); +}});return new a(c,"rgb");},invert:function(){return new a(this.map(function(b){return 255-b;}));},setHue:function(b){return new a([b,this.hsb[1],this.hsb[2]],"hsb"); +},setSaturation:function(b){return new a([this.hsb[0],b,this.hsb[2]],"hsb");},setBrightness:function(b){return new a([this.hsb[0],this.hsb[1],b],"hsb"); +}});this.$RGB=function(e,d,c){return new a([e,d,c],"rgb");};this.$HSB=function(e,d,c){return new a([e,d,c],"hsb");};this.$HEX=function(b){return new a(b,"hex"); +};Array.implement({rgbToHsb:function(){var c=this[0],d=this[1],k=this[2],h=0;var j=Math.max(c,d,k),f=Math.min(c,d,k);var l=j-f;var i=j/255,g=(j!=0)?l/j:0; +if(g!=0){var e=(j-c)/l;var b=(j-d)/l;var m=(j-k)/l;if(c==j){h=m-b;}else{if(d==j){h=2+e-m;}else{h=4+b-e;}}h/=6;if(h<0){h++;}}return[Math.round(h*360),Math.round(g*100),Math.round(i*100)]; +},hsbToRgb:function(){var d=Math.round(this[2]/100*255);if(this[1]==0){return[d,d,d];}else{var b=this[0]%360;var g=b%60;var h=Math.round((this[2]*(100-this[1]))/10000*255); +var e=Math.round((this[2]*(6000-this[1]*g))/600000*255);var c=Math.round((this[2]*(6000-this[1]*(60-g)))/600000*255);switch(Math.floor(b/60)){case 0:return[d,c,h]; +case 1:return[e,d,h];case 2:return[h,d,c];case 3:return[h,e,d];case 4:return[c,h,d];case 5:return[d,h,e];}}return false;}});String.implement({rgbToHsb:function(){var b=this.match(/\d{1,3}/g); +return(b)?b.rgbToHsb():null;},hsbToRgb:function(){var b=this.match(/\d{1,3}/g);return(b)?b.hsbToRgb():null;}});})();Hash.Cookie=new Class({Extends:Cookie,options:{autoSave:true},initialize:function(b,a){this.parent(b,a); +this.load();},save:function(){var a=JSON.encode(this.hash);if(!a||a.length>4096){return false;}if(a=="{}"){this.dispose();}else{this.write(a);}return true; +},load:function(){this.hash=new Hash(JSON.decode(this.read(),true));return this;}});Hash.each(Hash.prototype,function(b,a){if(typeof b=="function"){Hash.Cookie.implement(a,function(){var c=b.apply(this.hash,arguments); +if(this.options.autoSave){this.save();}return c;});}});var HtmlTable=new Class({Implements:[Options,Events,Class.Occlude],options:{properties:{cellpadding:0,cellspacing:0,border:0},rows:[],headers:[],footers:[]},property:"HtmlTable",initialize:function(){var a=Array.link(arguments,{options:Type.isObject,table:Type.isElement,id:Type.isString}); +this.setOptions(a.options);if(!a.table&&a.id){a.table=document.id(a.id);}this.element=a.table||new Element("table",this.options.properties);if(this.occlude()){return this.occluded; +}this.build();},build:function(){this.element.store("HtmlTable",this);this.body=document.id(this.element.tBodies[0])||new Element("tbody").inject(this.element); +$$(this.body.rows);if(this.options.headers.length){this.setHeaders(this.options.headers);}else{this.thead=document.id(this.element.tHead);}if(this.thead){this.head=this.getHead(); +}if(this.options.footers.length){this.setFooters(this.options.footers);}this.tfoot=document.id(this.element.tFoot);if(this.tfoot){this.foot=document.id(this.tfoot.rows[0]); +}this.options.rows.each(function(a){this.push(a);},this);},toElement:function(){return this.element;},empty:function(){this.body.empty();return this;},set:function(e,a){var d=(e=="headers")?"tHead":"tFoot",b=d.toLowerCase(); +this[b]=(document.id(this.element[d])||new Element(b).inject(this.element,"top")).empty();var c=this.push(a,{},this[b],e=="headers"?"th":"td");if(e=="headers"){this.head=this.getHead(); +}else{this.foot=this.getHead();}return c;},getHead:function(){var a=this.thead.rows;return a.length>1?$$(a):a.length?document.id(a[0]):false;},setHeaders:function(a){this.set("headers",a); +return this;},setFooters:function(a){this.set("footers",a);return this;},update:function(d,e,a){var b=d.getChildren(a||"td"),c=b.length-1;e.each(function(i,f){var j=b[f]||new Element(a||"td").inject(d),h=(i?i.content:"")||i,g=typeOf(h); +if(i&&i.properties){j.set(i.properties);}if(/(element(s?)|array|collection)/.test(g)){j.empty().adopt(h);}else{j.set("html",h);}if(f>c){b.push(j);}else{b[f]=j; +}});return{tr:d,tds:b};},push:function(e,c,d,a,b){if(typeOf(e)=="element"&&e.get("tag")=="tr"){e.inject(d||this.body,b);return{tr:e,tds:e.getChildren("td")}; +}return this.update(new Element("tr",c).inject(d||this.body,b),e,a);},pushMany:function(d,c,e,a,b){return d.map(function(f){return this.push(f,c,e,a,b); +},this);}});["adopt","inject","wraps","grab","replaces","dispose"].each(function(a){HtmlTable.implement(a,function(){this.element[a].apply(this.element,arguments); +return this;});});(function(){Events.Pseudos=function(h,e,f){var d="_monitorEvents:";var c=function(i){return{store:i.store?function(j,k){i.store(d+j,k); +}:function(j,k){(i._monitorEvents||(i._monitorEvents={}))[j]=k;},retrieve:i.retrieve?function(j,k){return i.retrieve(d+j,k);}:function(j,k){if(!i._monitorEvents){return k; +}return i._monitorEvents[j]||k;}};};var g=function(k){if(k.indexOf(":")==-1||!h){return null;}var j=Slick.parse(k).expressions[0][0],p=j.pseudos,i=p.length,o=[]; +while(i--){var n=p[i].key,m=h[n];if(m!=null){o.push({event:j.tag,value:p[i].value,pseudo:n,original:k,listener:m});}}return o.length?o:null;};return{addEvent:function(m,p,j){var n=g(m); +if(!n){return e.call(this,m,p,j);}var k=c(this),r=k.retrieve(m,[]),i=n[0].event,l=Array.slice(arguments,2),o=p,q=this;n.each(function(s){var t=s.listener,u=o; +if(t==false){i+=":"+s.pseudo+"("+s.value+")";}else{o=function(){t.call(q,s,u,arguments,o);};}});r.include({type:i,event:p,monitor:o});k.store(m,r);if(m!=i){e.apply(this,[m,p].concat(l)); +}return e.apply(this,[i,o].concat(l));},removeEvent:function(m,l){var k=g(m);if(!k){return f.call(this,m,l);}var n=c(this),j=n.retrieve(m);if(!j){return this; +}var i=Array.slice(arguments,2);f.apply(this,[m,l].concat(i));j.each(function(o,p){if(!l||o.event==l){f.apply(this,[o.type,o.monitor].concat(i));}delete j[p]; +},this);n.store(m,j);return this;}};};var b={once:function(e,f,d,c){f.apply(this,d);this.removeEvent(e.event,c).removeEvent(e.original,f);},throttle:function(d,e,c){if(!e._throttled){e.apply(this,c); +e._throttled=setTimeout(function(){e._throttled=false;},d.value||250);}},pause:function(d,e,c){clearTimeout(e._pause);e._pause=e.delay(d.value||250,this,c); +}};Events.definePseudo=function(c,d){b[c]=d;return this;};Events.lookupPseudo=function(c){return b[c];};var a=Events.prototype;Events.implement(Events.Pseudos(b,a.addEvent,a.removeEvent)); +["Request","Fx"].each(function(c){if(this[c]){this[c].implement(Events.prototype);}});})();(function(){var d={relay:false},c=["once","throttle","pause"],b=c.length; +while(b--){d[c[b]]=Events.lookupPseudo(c[b]);}DOMEvent.definePseudo=function(e,f){d[e]=f;return this;};var a=Element.prototype;[Element,Window,Document].invoke("implement",Events.Pseudos(d,a.addEvent,a.removeEvent)); +})();(function(){var a="$moo:keys-pressed",b="$moo:keys-keyup";DOMEvent.definePseudo("keys",function(d,e,c){var g=c[0],f=[],h=this.retrieve(a,[]);f.append(d.value.replace("++",function(){f.push("+"); +return"";}).split("+"));h.include(g.key);if(f.every(function(j){return h.contains(j);})){e.apply(this,c);}this.store(a,h);if(!this.retrieve(b)){var i=function(j){(function(){h=this.retrieve(a,[]).erase(j.key); +this.store(a,h);}).delay(0,this);};this.store(b,i).addEvent("keyup",i);}});DOMEvent.defineKeys({"16":"shift","17":"control","18":"alt","20":"capslock","33":"pageup","34":"pagedown","35":"end","36":"home","144":"numlock","145":"scrolllock","186":";","187":"=","188":",","190":".","191":"/","192":"`","219":"[","220":"\\","221":"]","222":"'","107":"+"}).defineKey(Browser.firefox?109:189,"-"); +})();(function(){var a=this.Keyboard=new Class({Extends:Events,Implements:[Options],options:{defaultEventType:"keydown",active:false,manager:null,events:{},nonParsedEvents:["activate","deactivate","onactivate","ondeactivate","changed","onchanged"]},initialize:function(f){if(f&&f.manager){this._manager=f.manager; +delete f.manager;}this.setOptions(f);this._setup();},addEvent:function(h,g,f){return this.parent(a.parse(h,this.options.defaultEventType,this.options.nonParsedEvents),g,f); +},removeEvent:function(g,f){return this.parent(a.parse(g,this.options.defaultEventType,this.options.nonParsedEvents),f);},toggleActive:function(){return this[this.isActive()?"deactivate":"activate"](); +},activate:function(f){if(f){if(f.isActive()){return this;}if(this._activeKB&&f!=this._activeKB){this.previous=this._activeKB;this.previous.fireEvent("deactivate"); +}this._activeKB=f.fireEvent("activate");a.manager.fireEvent("changed");}else{if(this._manager){this._manager.activate(this);}}return this;},isActive:function(){return this._manager?(this._manager._activeKB==this):(a.manager==this); +},deactivate:function(f){if(f){if(f===this._activeKB){this._activeKB=null;f.fireEvent("deactivate");a.manager.fireEvent("changed");}}else{if(this._manager){this._manager.deactivate(this); +}}return this;},relinquish:function(){if(this.isActive()&&this._manager&&this._manager.previous){this._manager.activate(this._manager.previous);}else{this.deactivate(); +}return this;},manage:function(f){if(f._manager){f._manager.drop(f);}this._instances.push(f);f._manager=this;if(!this._activeKB){this.activate(f);}return this; +},drop:function(f){f.relinquish();this._instances.erase(f);if(this._activeKB==f){if(this.previous&&this._instances.contains(this.previous)){this.activate(this.previous); +}else{this._activeKB=this._instances[0];}}return this;},trace:function(){a.trace(this);},each:function(f){a.each(this,f);},_instances:[],_disable:function(f){if(this._activeKB==f){this._activeKB=null; +}},_setup:function(){this.addEvents(this.options.events);if(a.manager&&!this._manager){a.manager.manage(this);}if(this.options.active){this.activate(); +}else{this.relinquish();}},_handle:function(h,g){if(h.preventKeyboardPropagation){return;}var f=!!this._manager;if(f&&this._activeKB){this._activeKB._handle(h,g); +if(h.preventKeyboardPropagation){return;}}this.fireEvent(g,h);if(!f&&this._activeKB){this._activeKB._handle(h,g);}}});var b={};var c=["shift","control","alt","meta"]; +var e=/^(?:shift|control|ctrl|alt|meta)$/;a.parse=function(h,g,k){if(k&&k.contains(h.toLowerCase())){return h;}h=h.toLowerCase().replace(/^(keyup|keydown):/,function(m,l){g=l; +return"";});if(!b[h]){var f,j={};h.split("+").each(function(l){if(e.test(l)){j[l]=true;}else{f=l;}});j.control=j.control||j.ctrl;var i=[];c.each(function(l){if(j[l]){i.push(l); +}});if(f){i.push(f);}b[h]=i.join("+");}return g+":keys("+b[h]+")";};a.each=function(f,g){var h=f||a.manager;while(h){g.run(h);h=h._activeKB;}};a.stop=function(f){f.preventKeyboardPropagation=true; +};a.manager=new a({active:true});a.trace=function(f){f=f||a.manager;var g=window.console&&console.log;if(g){console.log("the following items have focus: "); +}a.each(f,function(h){if(g){console.log(document.id(h.widget)||h.wiget||h);}});};var d=function(g){var f=[];c.each(function(h){if(g[h]){f.push(h);}});if(!e.test(g.key)){f.push(g.key); +}a.manager._handle(g,g.type+":keys("+f.join("+")+")");};document.addEvents({keyup:d,keydown:d});})(); \ No newline at end of file diff -Nru qbittorrent-4.1.3/src/webui/www/public/scripts/parametrics.js qbittorrent-3.3.15/src/webui/www/public/scripts/parametrics.js --- qbittorrent-4.1.3/src/webui/www/public/scripts/parametrics.js 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/scripts/parametrics.js 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,224 @@ +/* + +Script: Parametrics.js + Initializes the GUI property sliders. + +Copyright: + Copyright (c) 2007-2008 Greg Houston, . + +License: + MIT-style license. + +Requires: + Core.js, Window.js + +*/ +MochaUI.extend({ + addUpLimitSlider: function(hashes) { + if ($('uplimitSliderarea')) { + var windowOptions = MochaUI.Windows.windowOptions; + var sliderFirst = true; + // Get global upload limit + var maximum = 500; + var req = new Request({ + url: 'command/getGlobalUpLimit', + method: 'post', + data: {}, + onSuccess: function(data) { + if (data) { + var tmp = data.toInt(); + if (tmp > 0) { + maximum = tmp / 1024.0; + } + else { + if (hashes[0] == "global") + maximum = 10000; + else + maximum = 1000; + } + } + // Get torrents upload limit + // And create slider + if (hashes[0] == 'global') { + var up_limit = maximum; + if (up_limit < 0) up_limit = 0; + maximum = 10000; + var mochaSlide = new Slider($('uplimitSliderarea'), $('uplimitSliderknob'), { + steps: maximum, + offset: 0, + initialStep: up_limit.round(), + onChange: function(pos) { + if (pos > 0) { + $('uplimitUpdatevalue').value = pos; + $('upLimitUnit').style.visibility = "visible"; + } + else { + $('uplimitUpdatevalue').value = '∞'; + $('upLimitUnit').style.visibility = "hidden"; + } + }.bind(this) + }); + // Set default value + if (up_limit === 0) { + $('uplimitUpdatevalue').value = '∞'; + $('upLimitUnit').style.visibility = "hidden"; + } + else { + $('uplimitUpdatevalue').value = up_limit.round(); + $('upLimitUnit').style.visibility = "visible"; + } + } + else { + var req = new Request.JSON({ + url: 'command/getTorrentsUpLimit', + noCache : true, + method: 'post', + data: { + hashes: hashes.join('|') + }, + onSuccess: function(data) { + if (data) { + var up_limit = data[hashes[0]]; + for(var key in data) + if (up_limit != data[key]) { + up_limit = 0; + break; + } + if (up_limit < 0) up_limit = 0; + var mochaSlide = new Slider($('uplimitSliderarea'), $('uplimitSliderknob'), { + steps: maximum, + offset: 0, + initialStep: (up_limit / 1024.0).round(), + onChange: function(pos) { + if (pos > 0) { + $('uplimitUpdatevalue').value = pos; + $('upLimitUnit').style.visibility = "visible"; + } + else { + $('uplimitUpdatevalue').value = '∞'; + $('upLimitUnit').style.visibility = "hidden"; + } + }.bind(this) + }); + // Set default value + if (up_limit === 0) { + $('uplimitUpdatevalue').value = '∞'; + $('upLimitUnit').style.visibility = "hidden"; + } + else { + $('uplimitUpdatevalue').value = (up_limit / 1024.0).round(); + $('upLimitUnit').style.visibility = "visible"; + } + } + } + }).send(); + } + } + }).send(); + } + }, + + addDlLimitSlider: function(hashes) { + if ($('dllimitSliderarea')) { + var windowOptions = MochaUI.Windows.windowOptions; + var sliderFirst = true; + // Get global upload limit + var maximum = 500; + var req = new Request({ + url: 'command/getGlobalDlLimit', + method: 'post', + data: {}, + onSuccess: function(data) { + if (data) { + var tmp = data.toInt(); + if (tmp > 0) { + maximum = tmp / 1024.0; + } + else { + if (hashes[0] == "global") + maximum = 10000; + else + maximum = 1000; + } + } + // Get torrents download limit + // And create slider + if (hashes[0] == 'global') { + var dl_limit = maximum; + if (dl_limit < 0) dl_limit = 0; + maximum = 10000; + var mochaSlide = new Slider($('dllimitSliderarea'), $('dllimitSliderknob'), { + steps: maximum, + offset: 0, + initialStep: dl_limit.round(), + onChange: function(pos) { + if (pos > 0) { + $('dllimitUpdatevalue').value = pos; + $('dlLimitUnit').style.visibility = "visible"; + } + else { + $('dllimitUpdatevalue').value = '∞'; + $('dlLimitUnit').style.visibility = "hidden"; + } + }.bind(this) + }); + // Set default value + if (dl_limit === 0) { + $('dllimitUpdatevalue').value = '∞'; + $('dlLimitUnit').style.visibility = "hidden"; + } + else { + $('dllimitUpdatevalue').value = dl_limit.round(); + $('dlLimitUnit').style.visibility = "visible"; + } + } + else { + var req = new Request.JSON({ + url: 'command/getTorrentsDlLimit', + noCache : true, + method: 'post', + data: { + hashes: hashes.join('|') + }, + onSuccess: function(data) { + if (data) { + var dl_limit = data[hashes[0]]; + for(var key in data) + if (dl_limit != data[key]) { + dl_limit = 0; + break; + } + if (dl_limit < 0) dl_limit = 0; + var mochaSlide = new Slider($('dllimitSliderarea'), $('dllimitSliderknob'), { + steps: maximum, + offset: 0, + initialStep: (dl_limit / 1024.0).round(), + onChange: function(pos) { + if (pos > 0) { + $('dllimitUpdatevalue').value = pos; + $('dlLimitUnit').style.visibility = "visible"; + } + else { + $('dllimitUpdatevalue').value = '∞'; + $('dlLimitUnit').style.visibility = "hidden"; + } + }.bind(this) + }); + // Set default value + if (dl_limit === 0) { + $('dllimitUpdatevalue').value = '∞'; + $('dlLimitUnit').style.visibility = "hidden"; + } + else { + $('dllimitUpdatevalue').value = (dl_limit / 1024.0).round(); + $('dlLimitUnit').style.visibility = "visible"; + } + } + } + }).send(); + } + } + }).send(); + } + } +}); diff -Nru qbittorrent-4.1.3/src/webui/www/public/scripts/progressbar.js qbittorrent-3.3.15/src/webui/www/public/scripts/progressbar.js --- qbittorrent-4.1.3/src/webui/www/public/scripts/progressbar.js 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/scripts/progressbar.js 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,110 @@ +var ProgressBar = new Class({ + initialize: function(value, parameters) { + var vals = { + 'id': 'progressbar_' + (ProgressBars++), + 'value': $pick(value, 0), + 'width': 0, + 'height': 0, + 'darkbg': '#006', + 'darkfg': '#fff', + 'lightbg': '#fff', + 'lightfg': '#000' + }; + if (parameters && $type(parameters) == 'object') $extend(vals, parameters); + if (vals.height < 12) vals.height = 12; + var obj = new Element('div', { + 'id': vals.id, + 'class': 'progressbar_wrapper', + 'styles': { + 'border': '1px solid #000', + 'width': vals.width, + 'height': vals.height, + 'position': 'relative', + 'margin': '0 auto' + } + }); + obj.vals = vals; + obj.vals.value = $pick(value, 0); // Fix by Chris + obj.vals.dark = new Element('div', { + 'id': vals.id + '_dark', + 'class': 'progressbar_dark', + 'styles': { + 'width': vals.width, + 'height': vals.height, + 'background': vals.darkbg, + 'color': vals.darkfg, + 'position': 'absolute', + 'text-align': 'center', + 'left': 0, + 'top': 0, + 'line-height': vals.height + } + }); + obj.vals.light = new Element('div', { + 'id': vals.id + '_light', + 'class': 'progressbar_light', + 'styles': { + 'width': vals.width, + 'height': vals.height, + 'background': vals.lightbg, + 'color': vals.lightfg, + 'position': 'absolute', + 'text-align': 'center', + 'left': 0, + 'top': 0, + 'line-height': vals.height + } + }); + obj.appendChild(obj.vals.dark); + obj.appendChild(obj.vals.light); + obj.getValue = ProgressBar_getValue; + obj.setValue = ProgressBar_setValue; + obj.setWidth = ProgressBar_setWidth; + if (vals.width) obj.setValue(vals.value); + else setTimeout('ProgressBar_checkForParent("' + obj.id + '")', 1); + return obj; + } +}); + +function ProgressBar_getValue() { + return this.vals.value; +} + +function ProgressBar_setValue(value) { + value = parseFloat(value); + if (isNaN(value)) value = 0; + if (value > 100) value = 100; + if (value < 0) value = 0; + this.vals.value = value; + this.vals.dark.empty(); + this.vals.light.empty(); + this.vals.dark.appendText(value + '%'); + this.vals.light.appendText(value + '%'); + var r = parseInt(this.vals.width * (value / 100)); + this.vals.dark.setStyle('clip', 'rect(0,' + r + 'px,' + this.vals.height + 'px,0)'); + this.vals.light.setStyle('clip', 'rect(0,' + this.vals.width + 'px,' + this.vals.height + 'px,' + r + 'px)'); +} + +function ProgressBar_setWidth(value) { + if (this.vals.width !== value) { + this.vals.width = value; + this.setStyle('width', value); + this.vals.dark.setStyle('width', value); + this.vals.light.setStyle('width', value); + this.setValue(this.vals.value); + } +} + +function ProgressBar_checkForParent(id) { + var obj = $(id); + if (!obj) return; + if (!obj.parentNode) return setTimeout('ProgressBar_checkForParent("' + id + '")', 1); + obj.setStyle('width', '100%'); + var w = obj.offsetWidth; + obj.vals.dark.setStyle('width', w); + obj.vals.light.setStyle('width', w); + obj.vals.width = w; + obj.setValue(obj.vals.value); +} + +var ProgressBars = 0; diff -Nru qbittorrent-4.1.3/src/webui/www/public/scripts/prop-files.js qbittorrent-3.3.15/src/webui/www/public/scripts/prop-files.js --- qbittorrent-4.1.3/src/webui/www/public/scripts/prop-files.js 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/scripts/prop-files.js 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,351 @@ +var is_seed = true; +var current_hash = ""; + +if (!(Browser.name == "ie" && Browser.version < 9)) { + $("all_files_cb").removeClass("tristate"); + $("all_files_cb").removeClass("partial"); + $("all_files_cb").removeClass("checked"); + $("tristate_cb").style.display = "inline"; +} + +var setCBState = function(state) { + if (Browser.name == "ie" && Browser.version < 9) { + if (state == "partial") { + if (!$("all_files_cb").hasClass("partial")) { + $("all_files_cb").removeClass("checked"); + $("all_files_cb").addClass("partial"); + } + return; + } + if (state == "checked") { + if (!$("all_files_cb").hasClass("checked")) { + $("all_files_cb").removeClass("partial"); + $("all_files_cb").addClass("checked"); + } + return; + } + $("all_files_cb").removeClass("partial"); + $("all_files_cb").removeClass("checked"); + } + else { + if (state == "partial") { + $("tristate_cb").indeterminate = true; + } + else if (state == "checked") { + $("tristate_cb").indeterminate = false; + $("tristate_cb").checked = true; + } + else { + $("tristate_cb").indeterminate = false; + $("tristate_cb").checked = false; + } + } +}; + +var switchCBState = function() { + // Uncheck + if ($("all_files_cb").hasClass("partial")) { + $("all_files_cb").removeClass("partial"); + // Uncheck all checkboxes + $$('input.DownloadedCB').each(function(item, index) { + item.erase("checked"); + setFilePriority(index, 0); + }); + return; + } + if ($("all_files_cb").hasClass("checked")) { + $("all_files_cb").removeClass("checked"); + // Uncheck all checkboxes + $$('input.DownloadedCB').each(function(item, index) { + item.erase("checked"); + setFilePriority(index, 0); + }); + return; + } + // Check + $("all_files_cb").addClass("checked"); + // Check all checkboxes + $$('input.DownloadedCB').each(function(item, index) { + item.set("checked", "checked"); + setFilePriority(index, 1); + }); +}; + +var allCBChecked = function() { + var CBs = $$('input.DownloadedCB'); + for (var i = 0; i < CBs.length; i += 1) { + var item = CBs[i]; + if (!$defined(item.get('checked')) || !item.get('checked')) + return false; + } + return true; +}; + +var allCBUnchecked = function() { + var CBs = $$('input.DownloadedCB'); + for (var i = 0; i < CBs.length; i += 1) { + var item = CBs[i]; + if ($defined(item.get('checked')) && item.get('checked')) + return false; + } + return true; +}; + +var setFilePriority = function(id, priority) { + if (current_hash === "") return; + new Request({ + url: 'command/setFilePrio', + method: 'post', + data: { + 'hash': current_hash, + 'id': id, + 'priority': priority + } + }).send(); + // Display or add combobox + if (priority > 0) { + $('comboPrio' + id).set("value", 1); + $('comboPrio' + id).removeClass("invisible"); + } + else { + $('comboPrio' + id).addClass("invisible"); + } +}; + +var createDownloadedCB = function(id, downloaded) { + var CB = new Element('input'); + CB.set('type', 'checkbox'); + if (downloaded) + CB.set('checked', 'checked'); + CB.set('id', 'cbPrio' + id); + CB.set('class', 'DownloadedCB'); + CB.addEvent('change', function(e) { + var checked = 0; + if ($defined($('cbPrio' + id).get('checked')) && $('cbPrio' + id).get('checked')) + checked = 1; + setFilePriority(id, checked); + if (allCBChecked()) { + setCBState("checked"); + } + else { + if (allCBUnchecked()) { + setCBState("unchecked"); + } + else { + setCBState("partial"); + } + } + }); + return CB; +}; + +var createPriorityCombo = function(id, selected_prio) { + var select = new Element('select'); + select.set('id', 'comboPrio' + id); + select.addEvent('change', function(e) { + var new_prio = $('comboPrio' + id).get('value'); + setFilePriority(id, new_prio); + }); + var opt = new Element("option"); + opt.set('value', '1'); + opt.set('html', "QBT_TR(Normal)QBT_TR[CONTEXT=PropListDelegate]"); + if (selected_prio <= 1) + opt.setAttribute('selected', ''); + opt.injectInside(select); + opt = new Element("option"); + opt.set('value', '2'); + opt.set('html', "QBT_TR(High)QBT_TR[CONTEXT=PropListDelegate]"); + if (selected_prio == 2) + opt.setAttribute('selected', ''); + opt.injectInside(select); + opt = new Element("option"); + opt.set('value', '7'); + opt.set('html', "QBT_TR(Maximum)QBT_TR[CONTEXT=PropListDelegate]"); + if (selected_prio == 7) + opt.setAttribute('selected', ''); + opt.injectInside(select); + if (is_seed || selected_prio < 1) { + select.addClass("invisible"); + } + else { + select.removeClass("invisible"); + } + select.addClass("combo_priority"); + return select; +}; + +var filesDynTable = new Class({ + + initialize: function() {}, + + setup: function(table) { + this.table = $(table); + this.rows = new Hash(); + }, + + removeRow: function(id) { + if (this.rows.has(id)) { + var tr = this.rows.get(id); + tr.dispose(); + this.rows.erase(id); + return true; + } + return false; + }, + + removeAllRows: function() { + this.rows.each(function(tr, id) { + this.removeRow(id); + }.bind(this)); + }, + + updateRow: function(tr, row, id) { + var tds = tr.getElements('td'); + for (var i = 0; i < row.length; i++) { + switch (i) { + case 0: + if (row[i] > 0) + tds[i].getChildren('input')[0].set('checked', 'checked'); + else + tds[i].getChildren('input')[0].removeProperty('checked'); + break; + case 3: + $('pbf_' + id).setValue(row[i].toFloat()); + break; + case 4: + if (!is_seed && row[i] > 0) { + tds[i].getChildren('select').set('value', row[i]); + $('comboPrio' + id).removeClass("invisible"); + } + else { + if (!$('comboPrio' + id).hasClass("invisible")) + $('comboPrio' + id).addClass("invisible"); + } + break; + default: + tds[i].set('html', row[i]); + } + } + return true; + }, + + insertRow: function(id, row) { + if (this.rows.has(id)) { + var tableRow = this.rows.get(id); + this.updateRow(tableRow, row, id); + return; + } + //this.removeRow(id); + var tr = new Element('tr'); + this.rows.set(id, tr); + for (var i = 0; i < row.length; i++) { + var td = new Element('td'); + switch (i) { + case 0: + var tree_img = new Element('img', { + src: 'images/L.gif', + style: 'margin-bottom: -2px' + }); + td.adopt(tree_img, createDownloadedCB(id, row[i])); + break; + case 1: + td.set('html', row[i]); + td.set('title', row[i]); + break; + case 3: + td.adopt(new ProgressBar(row[i].toFloat(), { + 'id': 'pbf_' + id, + 'width': 80 + })); + break; + case 4: + td.adopt(createPriorityCombo(id, row[i])); + break; + default: + td.set('html', row[i]); + break; + } + td.injectInside(tr); + } + tr.injectInside(this.table); + }, +}); + +var loadTorrentFilesDataTimer; +var loadTorrentFilesData = function() { + if ($('prop_files').hasClass('invisible') || + $('propertiesPanel_collapseToggle').hasClass('panel-expand')) { + // Tab changed, don't do anything + return; + } + var new_hash = torrentsTable.getCurrentTorrentHash(); + if (new_hash === "") { + fTable.removeAllRows(); + clearTimeout(loadTorrentFilesDataTimer); + loadTorrentFilesDataTimer = loadTorrentFilesData.delay(5000); + return; + } + if (new_hash != current_hash) { + fTable.removeAllRows(); + current_hash = new_hash; + } + var url = 'query/propertiesFiles/' + current_hash; + var request = new Request.JSON({ + url: url, + noCache: true, + method: 'get', + onFailure: function() { + $('error_div').set('html', 'QBT_TR(qBittorrent client is not reachable)QBT_TR[CONTEXT=HttpServer]'); + clearTimeout(loadTorrentFilesDataTimer); + loadTorrentFilesDataTimer = loadTorrentFilesData.delay(10000); + }, + onSuccess: function(files) { + $('error_div').set('html', ''); + if (files) { + // Update Trackers data + var i = 0; + files.each(function(file) { + if (i === 0) { + is_seed = file.is_seed; + } + var row = []; + row.length = 4; + row[0] = file.priority; + row[1] = escapeHtml(file.name); + row[2] = friendlyUnit(file.size, false); + row[3] = (file.progress * 100).round(1); + if (row[3] == 100.0 && file.progress < 1.0) + row[3] = 99.9; + row[4] = file.priority; + fTable.insertRow(i, row); + i++; + }.bind(this)); + // Set global CB state + if (allCBChecked()) { + setCBState("checked"); + } + else { + if (allCBUnchecked()) { + setCBState("unchecked"); + } + else { + setCBState("partial"); + } + } + } + else { + fTable.removeAllRows(); + } + clearTimeout(loadTorrentFilesDataTimer); + loadTorrentFilesDataTimer = loadTorrentFilesData.delay(5000); + } + }).send(); +}; + +var updateTorrentFilesData = function() { + clearTimeout(loadTorrentFilesDataTimer); + loadTorrentFilesData(); +}; + +fTable = new filesDynTable(); +fTable.setup($('filesTable')); diff -Nru qbittorrent-4.1.3/src/webui/www/public/scripts/prop-general.js qbittorrent-3.3.15/src/webui/www/public/scripts/prop-general.js --- qbittorrent-4.1.3/src/webui/www/public/scripts/prop-general.js 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/scripts/prop-general.js 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,169 @@ +var clearData = function() { + $('time_elapsed').set('html', ''); + $('eta').set('html', ''); + $('nb_connections').set('html', ''); + $('total_downloaded').set('html', ''); + $('total_uploaded').set('html', ''); + $('dl_speed').set('html', ''); + $('up_speed').set('html', ''); + $('dl_limit').set('html', ''); + $('up_limit').set('html', ''); + $('total_wasted').set('html', ''); + $('seeds').set('html', ''); + $('peers').set('html', ''); + $('share_ratio').set('html', ''); + $('reannounce').set('html', ''); + $('last_seen').set('html', ''); + $('total_size').set('html', ''); + $('pieces').set('html', ''); + $('created_by').set('html', ''); + $('addition_date').set('html', ''); + $('completion_date').set('html', ''); + $('creation_date').set('html', ''); + $('torrent_hash').set('html', ''); + $('save_path').set('html', ''); + $('comment').set('html', ''); +}; + +var loadTorrentDataTimer; +var loadTorrentData = function() { + if ($('prop_general').hasClass('invisible') || + $('propertiesPanel_collapseToggle').hasClass('panel-expand')) { + // Tab changed, don't do anything + return; + } + var current_hash = torrentsTable.getCurrentTorrentHash(); + if (current_hash === "") { + clearData(); + clearTimeout(loadTorrentDataTimer); + loadTorrentDataTimer = loadTorrentData.delay(5000); + return; + } + // Display hash + $('torrent_hash').set('html', current_hash); + var url = 'query/propertiesGeneral/' + current_hash; + var request = new Request.JSON({ + url: url, + noCache: true, + method: 'get', + onFailure: function() { + $('error_div').set('html', 'QBT_TR(qBittorrent client is not reachable)QBT_TR[CONTEXT=HttpServer]'); + clearTimeout(loadTorrentDataTimer); + loadTorrentDataTimer = loadTorrentData.delay(10000); + }, + onSuccess: function(data) { + $('error_div').set('html', ''); + if (data) { + var temp; + // Update Torrent data + if (data.seeding_time > 0) + temp = "QBT_TR(%1 (%2 this session))QBT_TR[CONTEXT=PropertiesWidget]" + .replace("%1", friendlyDuration(data.time_elapsed)) + .replace("%2", friendlyDuration(data.seeding_time)); + else + temp = friendlyDuration(data.time_elapsed); + $('time_elapsed').set('html', temp); + + $('eta').set('html', friendlyDuration(data.eta)); + + temp = "QBT_TR(%1 (%2 max))QBT_TR[CONTEXT=PropertiesWidget]" + .replace("%1", data.nb_connections) + .replace("%2", data.nb_connections_limit < 0 ? "∞" : data.nb_connections_limit); + $('nb_connections').set('html', temp); + + temp = "QBT_TR(%1 (%2 this session))QBT_TR[CONTEXT=PropertiesWidget]" + .replace("%1", friendlyUnit(data.total_downloaded)) + .replace("%2", friendlyUnit(data.total_downloaded_session)); + $('total_downloaded').set('html', temp); + + temp = "QBT_TR(%1 (%2 this session))QBT_TR[CONTEXT=PropertiesWidget]" + .replace("%1", friendlyUnit(data.total_uploaded)) + .replace("%2", friendlyUnit(data.total_uploaded_session)); + $('total_uploaded').set('html', temp); + + temp = "QBT_TR(%1 (%2 avg.))QBT_TR[CONTEXT=PropertiesWidget]" + .replace("%1", friendlyUnit(data.dl_speed, true)) + .replace("%2", friendlyUnit(data.dl_speed_avg, true)); + $('dl_speed').set('html', temp); + + temp = "QBT_TR(%1 (%2 avg.))QBT_TR[CONTEXT=PropertiesWidget]" + .replace("%1", friendlyUnit(data.up_speed, true)) + .replace("%2", friendlyUnit(data.up_speed_avg, true)); + $('up_speed').set('html', temp); + + temp = (data.dl_limit == -1 ? "∞" : friendlyUnit(data.dl_limit, true)); + $('dl_limit').set('html', temp); + + temp = (data.up_limit == -1 ? "∞" : friendlyUnit(data.up_limit, true)); + $('up_limit').set('html', temp); + + $('total_wasted').set('html', friendlyUnit(data.total_wasted)); + + temp = "QBT_TR(%1 (%2 total))QBT_TR[CONTEXT=PropertiesWidget]" + .replace("%1", data.seeds) + .replace("%2", data.seeds_total); + $('seeds').set('html', temp); + + temp = "QBT_TR(%1 (%2 total))QBT_TR[CONTEXT=PropertiesWidget]" + .replace("%1", data.peers) + .replace("%2", data.peers_total); + $('peers').set('html', temp); + + $('share_ratio').set('html', data.share_ratio.toFixed(2)); + + $('reannounce').set('html', friendlyDuration(data.reannounce)); + + if (data.last_seen != -1) + temp = new Date(data.last_seen * 1000).toLocaleString(); + else + temp = "QBT_TR(Never)QBT_TR[CONTEXT=PropertiesWidget]"; + $('last_seen').set('html', temp); + + $('total_size').set('html', friendlyUnit(data.total_size)); + + if (data.pieces_num != -1) + temp = "QBT_TR(%1 x %2 (have %3))QBT_TR[CONTEXT=PropertiesWidget]" + .replace("%1", data.pieces_num) + .replace("%2", friendlyUnit(data.piece_size)) + .replace("%3", data.pieces_have); + else + temp = "QBT_TR(Unknown)QBT_TR[CONTEXT=HttpServer]"; + $('pieces').set('html', temp); + + $('created_by').set('html', escapeHtml(data.created_by)); + if (data.addition_date != -1) + temp = new Date(data.addition_date * 1000).toLocaleString(); + else + temp = "QBT_TR(Unknown)QBT_TR[CONTEXT=HttpServer]"; + + $('addition_date').set('html', temp); + if (data.completion_date != -1) + temp = new Date(data.completion_date * 1000).toLocaleString(); + else + temp = ""; + + $('completion_date').set('html', temp); + + if (data.creation_date != -1) + temp = new Date(data.creation_date * 1000).toLocaleString(); + else + temp = "QBT_TR(Unknown)QBT_TR[CONTEXT=HttpServer]"; + $('creation_date').set('html', temp); + + $('save_path').set('html', data.save_path); + + $('comment').set('html', parseHtmlLinks(escapeHtml(data.comment))); + } + else { + clearData(); + } + clearTimeout(loadTorrentDataTimer); + loadTorrentDataTimer = loadTorrentData.delay(5000); + } + }).send(); +}; + +var updateTorrentData = function() { + clearTimeout(loadTorrentDataTimer); + loadTorrentData(); +}; diff -Nru qbittorrent-4.1.3/src/webui/www/public/scripts/prop-trackers.js qbittorrent-3.3.15/src/webui/www/public/scripts/prop-trackers.js --- qbittorrent-4.1.3/src/webui/www/public/scripts/prop-trackers.js 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/scripts/prop-trackers.js 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,131 @@ +var trackersDynTable = new Class({ + + initialize: function() {}, + + setup: function(table) { + this.table = $(table); + this.rows = new Hash(); + }, + + removeRow: function(url) { + if (this.rows.has(url)) { + var tr = this.rows.get(url); + tr.dispose(); + this.rows.erase(url); + return true; + } + return false; + }, + + removeAllRows: function() { + this.rows.each(function(tr, url) { + this.removeRow(url); + }.bind(this)); + }, + + updateRow: function(tr, row) { + var tds = tr.getElements('td'); + for (var i = 0; i < row.length; i++) { + tds[i].set('html', row[i]); + } + return true; + }, + + insertRow: function(row) { + var url = row[0]; + if (this.rows.has(url)) { + var tableRow = this.rows.get(url); + this.updateRow(tableRow, row); + return; + } + //this.removeRow(id); + var tr = new Element('tr'); + this.rows.set(url, tr); + for (var i = 0; i < row.length; i++) { + var td = new Element('td'); + td.set('html', row[i]); + td.injectInside(tr); + } + tr.injectInside(this.table); + }, +}); + +var current_hash = ""; + +var loadTrackersDataTimer; +var loadTrackersData = function() { + if ($('prop_trackers').hasClass('invisible') || + $('propertiesPanel_collapseToggle').hasClass('panel-expand')) { + // Tab changed, don't do anything + return; + } + var new_hash = torrentsTable.getCurrentTorrentHash(); + if (new_hash === "") { + tTable.removeAllRows(); + clearTimeout(loadTrackersDataTimer); + loadTrackersDataTimer = loadTrackersData.delay(10000); + return; + } + if (new_hash != current_hash) { + tTable.removeAllRows(); + current_hash = new_hash; + } + var url = 'query/propertiesTrackers/' + current_hash; + var request = new Request.JSON({ + url: url, + noCache: true, + method: 'get', + onFailure: function() { + $('error_div').set('html', 'QBT_TR(qBittorrent client is not reachable)QBT_TR[CONTEXT=HttpServer]'); + clearTimeout(loadTrackersDataTimer); + loadTrackersDataTimer = loadTrackersData.delay(20000); + }, + onSuccess: function(trackers) { + $('error_div').set('html', ''); + if (trackers) { + // Update Trackers data + trackers.each(function(tracker) { + var row = []; + row.length = 4; + row[0] = escapeHtml(tracker.url); + row[1] = tracker.status; + row[2] = tracker.num_peers; + row[3] = escapeHtml(tracker.msg); + tTable.insertRow(row); + }); + } + else { + tTable.removeAllRows(); + } + clearTimeout(loadTrackersDataTimer); + loadTrackersDataTimer = loadTrackersData.delay(10000); + } + }).send(); +}; + +var updateTrackersData = function() { + clearTimeout(loadTrackersDataTimer); + loadTrackersData(); +}; + +tTable = new trackersDynTable(); +tTable.setup($('trackersTable')); + +// Add trackers code +$('addTrackersPlus').addEvent('click', function addTrackerDlg() { + if (current_hash.length === 0) return; + new MochaUI.Window({ + id: 'trackersPage', + title: "QBT_TR(Trackers addition dialog)QBT_TR[CONTEXT=TrackersAdditionDlg]", + loadMethod: 'iframe', + contentURL: 'addtrackers.html?hash=' + current_hash, + scrollbars: true, + resizable: false, + maximizable: false, + closable: true, + paddingVertical: 0, + paddingHorizontal: 0, + width: 500, + height: 250 + }); +}); diff -Nru qbittorrent-4.1.3/src/webui/www/public/scripts/prop-webseeds.js qbittorrent-3.3.15/src/webui/www/public/scripts/prop-webseeds.js --- qbittorrent-4.1.3/src/webui/www/public/scripts/prop-webseeds.js 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/scripts/prop-webseeds.js 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,109 @@ +var webseedsDynTable = new Class({ + + initialize: function() {}, + + setup: function(table) { + this.table = $(table); + this.rows = new Hash(); + }, + + removeRow: function(url) { + if (this.rows.has(url)) { + var tr = this.rows.get(url); + tr.dispose(); + this.rows.erase(url); + return true; + } + return false; + }, + + removeAllRows: function() { + this.rows.each(function(tr, url) { + this.removeRow(url); + }.bind(this)); + }, + + updateRow: function(tr, row) { + var tds = tr.getElements('td'); + for (var i = 0; i < row.length; i++) { + tds[i].set('html', row[i]); + } + return true; + }, + + insertRow: function(row) { + var url = row[0]; + if (this.rows.has(url)) { + var tableRow = this.rows.get(url); + this.updateRow(tableRow, row); + return; + } + //this.removeRow(id); + var tr = new Element('tr'); + this.rows.set(url, tr); + for (var i = 0; i < row.length; i++) { + var td = new Element('td'); + td.set('html', row[i]); + td.injectInside(tr); + } + tr.injectInside(this.table); + }, +}); + +var current_hash = ""; + +var loadWebSeedsDataTimer; +var loadWebSeedsData = function() { + if ($('prop_webseeds').hasClass('invisible') || + $('propertiesPanel_collapseToggle').hasClass('panel-expand')) { + // Tab changed, don't do anything + return; + } + var new_hash = torrentsTable.getCurrentTorrentHash(); + if (new_hash === "") { + wsTable.removeAllRows(); + clearTimeout(loadWebSeedsDataTimer); + loadWebSeedsDataTimer = loadWebSeedsData.delay(10000); + return; + } + if (new_hash != current_hash) { + wsTable.removeAllRows(); + current_hash = new_hash; + } + var url = 'query/propertiesWebSeeds/' + current_hash; + var request = new Request.JSON({ + url: url, + noCache: true, + method: 'get', + onFailure: function() { + $('error_div').set('html', 'QBT_TR(qBittorrent client is not reachable)QBT_TR[CONTEXT=HttpServer]'); + clearTimeout(loadWebSeedsDataTimer); + loadWebSeedsDataTimer = loadWebSeedsData.delay(20000); + }, + onSuccess: function(webseeds) { + $('error_div').set('html', ''); + if (webseeds) { + // Update WebSeeds data + webseeds.each(function(webseed) { + var row = []; + row.length = 1; + row[0] = webseed.url; + wsTable.insertRow(row); + }); + } + else { + wsTable.removeAllRows(); + } + clearTimeout(loadWebSeedsDataTimer); + loadWebSeedsDataTimer = loadWebSeedsData.delay(10000); + } + }).send(); +}; + +var updateWebSeedsData = function() { + clearTimeout(loadWebSeedsDataTimer); + loadWebSeedsData(); +}; + +wsTable = new webseedsDynTable(); +wsTable.setup($('webseedsTable')); diff -Nru qbittorrent-4.1.3/src/webui/www/public/statistics.html qbittorrent-3.3.15/src/webui/www/public/statistics.html --- qbittorrent-4.1.3/src/webui/www/public/statistics.html 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/statistics.html 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,47 @@ +

    QBT_TR(User statistics)QBT_TR[CONTEXT=StatsDialog]

    + + + + + + + + + + + + + + + + +
    + +

    QBT_TR(Cache statistics)QBT_TR[CONTEXT=StatsDialog]

    + + + + + + + +
    + +

    QBT_TR(Performance statistics)QBT_TR[CONTEXT=StatsDialog]

    + + + + + + + + + + + + + + + + +
    diff -Nru qbittorrent-4.1.3/src/webui/www/public/transferlist.html qbittorrent-3.3.15/src/webui/www/public/transferlist.html --- qbittorrent-4.1.3/src/webui/www/public/transferlist.html 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/transferlist.html 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,75 @@ +
    + + + + +
    +
    + +
    + + + + + +
    +
    + + diff -Nru qbittorrent-4.1.3/src/webui/www/public/upload.html qbittorrent-3.3.15/src/webui/www/public/upload.html --- qbittorrent-4.1.3/src/webui/www/public/upload.html 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/upload.html 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,62 @@ + + + + + QBT_TR(Upload local torrent)QBT_TR[CONTEXT=HttpServer] + + + + + + + +
    +

    +

    + +
    +

    +
    +
    + + +
    +
    + + +
    +
    + + + +
    +
    + + +
    +
    + +
    +
    +
    + +
    + + diff -Nru qbittorrent-4.1.3/src/webui/www/public/uploadlimit.html qbittorrent-3.3.15/src/webui/www/public/uploadlimit.html --- qbittorrent-4.1.3/src/webui/www/public/uploadlimit.html 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/public/uploadlimit.html 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,62 @@ + + + + + QBT_TR(Torrent Upload Speed Limiting)QBT_TR[CONTEXT=TransferListWidget] + + + + + + + +
    +
    +
    QBT_TR(Upload limit:)QBT_TR[CONTEXT=PropertiesWidget] QBT_TR(KiB/s)QBT_TR[CONTEXT=SpeedLimitDialog]
    +
    +
    +
    +
    +
    +
    + + +
    + + + + + diff -Nru qbittorrent-4.1.3/src/webui/www/webui.qrc qbittorrent-3.3.15/src/webui/www/webui.qrc --- qbittorrent-4.1.3/src/webui/www/webui.qrc 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/src/webui/www/webui.qrc 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ - - - private/about.html - private/addtrackers.html - private/confirmdeletion.html - private/css/Core.css - private/css/dynamicTable.css - private/css/Layout.css - private/css/style.css - private/css/Tabs.css - private/css/Window.css - private/download.html - private/downloadlimit.html - private/filters.html - private/index.html - private/newcategory.html - private/preferences.html - private/preferences_content.html - private/properties.html - private/properties_content.html - private/rename.html - private/scripts/client.js - private/scripts/contextmenu.js - private/scripts/download.js - private/scripts/dynamicTable.js - private/scripts/lib/clipboard.min.js - private/scripts/lib/excanvas-compressed.js - private/scripts/lib/mocha-yc.js - private/scripts/lib/mootools-1.2-core-yc.js - private/scripts/lib/mootools-1.2-more.js - private/scripts/lib/parametrics.js - private/scripts/misc.js - private/scripts/mocha-init.js - private/scripts/progressbar.js - private/scripts/prop-files.js - private/scripts/prop-general.js - private/scripts/prop-trackers.js - private/scripts/prop-webseeds.js - private/setlocation.html - private/shareratio.html - private/statistics.html - private/transferlist.html - private/upload.html - private/uploadlimit.html - public/css/login.css - public/login.html - public/scripts/lib/mootools-1.2-core-yc.js - - diff -Nru qbittorrent-4.1.3/.travis.yml qbittorrent-3.3.15/.travis.yml --- qbittorrent-4.1.3/.travis.yml 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/.travis.yml 2017-08-03 20:30:10.000000000 +0000 @@ -10,18 +10,19 @@ # Uncomment when Travis upgraded "Ubuntu 12.04 LTS" to a newer version whose repo will have a more up-to-date libtorrent package #- lt_branch=dist gui=true #- lt_branch=dist gui=false - - lt_branch=RC_1_0 gui=true build_system=cmake - - lt_branch=RC_1_0 gui=false build_system=cmake - - lt_branch=RC_1_0 gui=true build_system=qmake - - lt_branch=RC_1_0 gui=false build_system=qmake + - lt_branch=RC_1_0 qt=5 gui=true + - lt_branch=RC_1_0 qt=5 gui=false + - lt_branch=RC_1_0 qt=4 gui=true + - lt_branch=RC_1_0 qt=4 gui=false global: - secure: "OI9CUjj4lTb0HwwIZU5PbECU3hLlAL6KC8KsbwohG8/O3j5fLcnmDsK4Ad9us5cC39sS11Jcd1kDP2qRcCuST/glVNhLkcjKkiQerOfd5nQ/qL4JYfz/1mfP5mdpz9jHKzpLUIG+TXkbSTjP6VVmsb5KPT+3pKEdRFZB+Pu9+J8=" - coverity_branch: coverity_scan - matrix: allow_failures: - - env: lt_branch=RC_1_0 gui=true build_system=cmake - - env: lt_branch=RC_1_0 gui=false build_system=cmake + - os: osx + env: lt_branch=RC_1_0 qt=4 gui=true + - os: osx + env: lt_branch=RC_1_0 qt=4 gui=false branches: except: @@ -55,36 +56,39 @@ apt: sources: # sources list: https://github.com/travis-ci/apt-source-whitelist/blob/master/ubuntu.json - - ubuntu-toolchain-r-test + #- ubuntu-toolchain-r-test #- boost-latest - sourceline: 'ppa:qbittorrent-team/qbittorrent-stable' - sourceline: 'ppa:beineri/opt-qt551-trusty' - - sourceline: 'ppa:adrozdoff/cmake' packages: # packages list: https://github.com/travis-ci/apt-package-whitelist/blob/master/ubuntu-precise - - [autoconf, automake, colormake] - - [cmake, ninja-build] + - autoconf + - automake + - colormake - libssl-dev - - [libboost-dev, libboost-system-dev] + - libboost-dev + - libboost-system-dev - libtorrent-rasterbar-dev - - [qt55base, qt55svg, qt55tools] - - [gcc-6, g++-6] + # Qt 5.5.1 + - qt55base + - qt55tools + # Qt 4.8 + - qt4-default + - libqt4-dev before_install: # only allow specific build for coverity scan, others will stop - - if [ "$TRAVIS_BRANCH" = "$coverity_branch" ] && ! [ "$TRAVIS_OS_NAME" = "linux" -a "$lt_branch" = "RC_1_0" -a "$gui" = true -a "$build_system" = "qmake" ]; then exit ; fi + - if [ "$TRAVIS_BRANCH" = "$coverity_branch" ] && ! [ "$TRAVIS_OS_NAME" = "linux" -a "$lt_branch" = "RC_1_0" -a "$gui" = true ]; then exit ; fi - shopt -s expand_aliases - alias make="colormake -j3" # Using nprocs/2 sometimes may fail (gcc is killed by system) + #- libt_path="$HOME/libt_install" + #- ltconf="$ltconf --prefix="$libt_path" --disable-geoip" - qbt_path="$HOME/qbt_install" - - | - if [ "$TRAVIS_OS_NAME" = "linux" ]; then - qbtconf="$qbtconf --prefix="$qbt_path" PKG_CONFIG_PATH=/opt/qt55/lib/pkgconfig:$PKG_CONFIG_PATH" - else - qbtconf="$qbtconf --prefix="$qbt_path"" - fi + - qbtconf="$qbtconf --prefix="$qbt_path" PKG_CONFIG_PATH="$libt_path/lib/pkgconfig":/opt/qt55/lib/pkgconfig:$PKG_CONFIG_PATH" # options for specific branches + - if [ "$qt" = 4 ]; then qbtconf="$qbtconf --with-qt4" ; fi - if [ "$gui" = false ]; then qbtconf="$qbtconf --disable-gui" ; fi - | if [ "$TRAVIS_OS_NAME" = "linux" ]; then @@ -93,17 +97,11 @@ # Qt 5 PATH=/opt/qt55/bin:${PATH} - - if [ "$build_system" = "cmake" ]; then - COMPILER_VERSION=6 - export CXX="${CXX}-${COMPILER_VERSION}" CC="${CC}-${COMPILER_VERSION}" - fi fi # print settings - echo $lt_branch - echo $gui - - echo $build_system - echo $ltconf - echo $qbtconf @@ -112,52 +110,49 @@ #if [ "$TRAVIS_OS_NAME" = "linux" ]; then # build libtorrent from source #if [ "$lt_branch" != "dist" ]; then - #cd "$HOME" && pwd && git clone --depth 1 https://github.com/arvidn/libtorrent.git --branch $lt_branch - #cd libtorrent && ./autotool.sh && ./configure $ltconf && make install - #fi + #cd "$HOME" && pwd && git clone --depth 1 https://github.com/arvidn/libtorrent.git --branch $lt_branch ; + #cd libtorrent && ./autotool.sh && ./configure $ltconf && make install ; + #fi ; #fi - | if [ "$TRAVIS_OS_NAME" = "osx" ]; then # dependencies brew update > /dev/null - brew outdated "pkg-config" || brew upgrade "pkg-config" - brew install colormake ccache zlib qt + brew install colormake ccache zlib PATH="/usr/local/opt/ccache/libexec:$PATH" - brew link --force zlib qt + brew link --force zlib + brew outdated "pkg-config" || brew upgrade "pkg-config" - wget https://builds.shiki.hu/homebrew/version + wget https://builds.shiki.hu/homebrew/version ; if ! cmp --quiet "version" "$HOME/hombebrew_cache/version" ; then - echo "Cached files are different from server. Downloading new ones." + echo "Cached files are different from server. Downloading new ones." ; # First delete old files - rm -r "$HOME/hombebrew_cache" - mkdir "$HOME/hombebrew_cache" - cp "version" $HOME/hombebrew_cache - cd "$HOME/hombebrew_cache" - wget https://builds.shiki.hu/homebrew/libtorrent-rasterbar.rb - wget https://builds.shiki.hu/homebrew/5146d2df7e48f321511273fb9829ebdc3a6dc519f9ef36a344a343ae524c3ae6--libtorrent-rasterbar-1.1.9+git20180812.0bcf6cef23+patched-configure.el_capitan.bottle.tar.gz + rm -r "$HOME/hombebrew_cache" ; + mkdir "$HOME/hombebrew_cache"; + cp "version" $HOME/hombebrew_cache ; + cd "$HOME/hombebrew_cache" ; + wget https://builds.shiki.hu/homebrew/libtorrent-rasterbar.rb ; + wget https://builds.shiki.hu/homebrew/libtorrent-rasterbar-1.0.11+git20172003.8736a59adc.el_capitan.bottle.tar.gz + wget https://builds.shiki.hu/homebrew/qt.rb + wget https://builds.shiki.hu/homebrew/qt-5.9.1.el_capitan.bottle.tar.gz fi - # Copy custom libtorrent bottle to homebrew's download cache so it can find and install it + # Copy custom libtorrent bottle to homebrew's cache so it can find and install it # Also install our custom libtorrent formula by passing the local path to it # These 2 files are restored from Travis' cache. - cp "$HOME/hombebrew_cache/5146d2df7e48f321511273fb9829ebdc3a6dc519f9ef36a344a343ae524c3ae6--libtorrent-rasterbar-1.1.9+git20180812.0bcf6cef23+patched-configure.el_capitan.bottle.tar.gz" "$(brew --cache)/downloads" - brew install "$HOME/hombebrew_cache/libtorrent-rasterbar.rb" - - # NOTE about the bottle name - # The part before the "--" characters is a sha256 hash of the string - # of the URL homebrew itself would use to download the bottle. - # In this case the URL is the following: - # http://127.0.0.1/libtorrent-rasterbar-1.1.9+git20180812.0bcf6cef23+patched-configure.el_capitan.bottle.tar.gz - - if [ "$build_system" = "cmake" ]; then - brew outdated cmake || brew upgrade cmake - brew install ninja + cp "$HOME/hombebrew_cache/libtorrent-rasterbar-1.0.11+git20172003.8736a59adc.el_capitan.bottle.tar.gz" "$(brew --cache)" + brew install "$HOME/hombebrew_cache/libtorrent-rasterbar.rb" ; - ln -s /usr/local/opt/qt/mkspecs /usr/local/mkspecs - ln -s /usr/local/opt/qt/plugins /usr/local/plugins + # Qt + if [ "$qt" = 4 ]; then brew install qt && ln -s /usr/local/Cellar/qt/4.8.7_2/plugins /usr/local ; fi ; + if [ "$qt" = 5 ]; then + # Copy custom qt5 bottle to homebrew's cache so it can find and install it + # Also install our custom qt5 formula by passing the local path to it + # These 2 files are restored from Travis' cache. + cp "$HOME/hombebrew_cache/qt-5.9.1.el_capitan.bottle.tar.gz" "$(brew --cache)" + brew install "$HOME/hombebrew_cache/qt.rb" + brew link --force qt fi - - MY_CMAKE_OPENSSL_HINT="-DOPENSSL_ROOT_DIR=/usr/local/opt/openssl/" fi - | if [ "$TRAVIS_BRANCH" != "$coverity_branch" ]; then @@ -167,44 +162,22 @@ script: - if [ "$TRAVIS_BRANCH" = "$coverity_branch" ]; then exit ; fi # skip usual build when running coverity scan + - cd "$TRAVIS_BUILD_DIR" && ./bootstrap.sh && ./configure $qbtconf - | - cd "$TRAVIS_BUILD_DIR" - if [ "$build_system" = "cmake" ]; then - mkdir build - cd build - if [ "$gui" = "false" ]; then - DISABLE_GUI_OPTION="-DCMAKE_DISABLE_FIND_PACKAGE_Qt5Widgets=ON" - fi - cmake $DISABLE_GUI_OPTION -DCMAKE_INSTALL_PREFIX="$qbt_path" "$MY_CMAKE_OPENSSL_HINT" \ - -G "Ninja" -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=TRUE .. - BUILD_TOOL="ninja" - fi - if [ "$build_system" = "qmake" ]; then - if [ "$TRAVIS_OS_NAME" = "osx" ]; then - # For some reason for RC_1_1 we need to also specify the OpenSSL compiler/linker flags - # Homebrew doesn't symlink OpenSSL for security reasons - ./bootstrap.sh && ./configure $qbtconf CXXFLAGS="$(PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig:$PKG_CONFIG_PATH" pkg-config --cflags openssl)" LDFLAGS="$(PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig:$PKG_CONFIG_PATH" pkg-config --libs openssl)" - sed -i "" -e "s/^\(CC.*&&\).*$/\1 $CC/" src/Makefile # workaround for Qt & ccache: https://bugreports.qt.io/browse/QTBUG-31034 - sed -i "" -e "s/^\(CXX.*&&\).*$/\1 $CXX/" src/Makefile - sed -i "" -e 's/^\(CXXFLAGS.*\)$/\1 -Wno-unused-local-typedefs -Wno-inconsistent-missing-override/' src/Makefile - else - ./bootstrap.sh && ./configure $qbtconf - fi - BUILD_TOOL="make" + if [ "$TRAVIS_OS_NAME" = "osx" ]; then + sed -i "" -e "s/^\(CC.*&&\).*$/\1 $CC/" src/Makefile ; # workaround for Qt & ccache: https://bugreports.qt.io/browse/QTBUG-31034 + sed -i "" -e "s/^\(CXX.*&&\).*$/\1 $CXX/" src/Makefile ; + sed -i "" -e 's/^\(CXXFLAGS.*\)$/\1 -Wno-unused-local-typedefs -Wno-inconsistent-missing-override/' src/Makefile ; fi - - $BUILD_TOOL && $BUILD_TOOL install + - make && make install after_success: - if [ "$gui" = true ]; then qbt_exe="qbittorrent" ; else qbt_exe="qbittorrent-nox" ; fi - if [ "$TRAVIS_OS_NAME" = "linux" ]; then cd "$qbt_path/bin" ; fi - | if [ "$TRAVIS_OS_NAME" = "osx" ]; then - if [ "$build_system" = "qmake" ]; then - macdeployqt "$TRAVIS_BUILD_DIR/src/$qbt_exe.app" - cd "$TRAVIS_BUILD_DIR/src/$qbt_exe.app/Contents/MacOS" - else - cd "$qbt_path/$qbt_exe.app/Contents/MacOS" - fi + macdeployqt "$TRAVIS_BUILD_DIR/src/$qbt_exe.app" ; + cd "$TRAVIS_BUILD_DIR/src/$qbt_exe.app/Contents/MacOS" ; fi - ./$qbt_exe --version diff -Nru qbittorrent-4.1.3/.tx/config qbittorrent-3.3.15/.tx/config --- qbittorrent-4.1.3/.tx/config 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/.tx/config 2017-08-03 20:30:10.000000000 +0000 @@ -1,7 +1,7 @@ [main] host = https://www.transifex.com -[qbittorrent.qbittorrent_master] +[qbittorrent.qbittorrent_v3_3_x] file_filter = src/lang/qbittorrent_.ts lang_map = pt: pt_PT source_file = src/lang/qbittorrent_en.ts @@ -12,7 +12,7 @@ [qbittorrent.qbittorrentdesktop_master] -source_file = dist/unix/qbittorrent.desktop +source_file = src/icons/qBittorrent.desktop source_lang = en type = DESKTOP minimum_perc = 23 diff -Nru qbittorrent-4.1.3/uncrustify.cfg qbittorrent-3.3.15/uncrustify.cfg --- qbittorrent-4.1.3/uncrustify.cfg 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/uncrustify.cfg 2017-08-03 20:30:10.000000000 +0000 @@ -1,17 +1,15 @@ set FOR foreach set WORD slots -newlines = LF +newlines = LF indent_with_tabs = 0 indent_columns = 4 -indent_namespace = true -indent_class = true -indent_col1_comment = true -indent_access_spec = -4 indent_switch_case = 0 -indent_case_shift = 0 -indent_case_brace = 4 +indent_namespace = true +indent_class = true +indent_col1_comment = true +indent_access_spec = -4 nl_after_func_body = 2 nl_collapse_empty_body = false @@ -42,14 +40,12 @@ mod_full_brace_if = remove mod_full_brace_if_chain = true mod_full_brace_do = remove -mod_full_brace_while = remove +mod_full_brace_while = remove mod_full_brace_for = remove -mod_full_brace_if_chain = true +mod_full_brace_if_chain = true mod_full_brace_nl = 3 -mod_full_paren_if_bool = true -mod_move_case_break = true +mod_full_paren_if_bool = true -sp_cond_colon = force sp_else_brace = force sp_try_brace = force sp_arith = force @@ -59,19 +55,14 @@ sp_pp_stringify = ignore sp_bool = force sp_after_class_colon = force -sp_before_class_colon = force -sp_after_constr_colon = force +sp_before_class_colon = remove sp_cmt_cpp_start = add sp_cmt_cpp_doxygen = true -sp_endif_cmt = force sp_angle_shift = remove sp_permit_cpp11_shift = true sp_before_sparen = force sp_after_operator = remove sp_after_operator_sym = remove -sp_after_for_colon = force -sp_before_for_colon = force -sp_between_new_paren = force sp_before_ptr_star = force sp_before_byref = force diff -Nru qbittorrent-4.1.3/unixconf.pri qbittorrent-3.3.15/unixconf.pri --- qbittorrent-4.1.3/unixconf.pri 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/unixconf.pri 2017-08-03 20:30:10.000000000 +0000 @@ -9,10 +9,13 @@ include(conf.pri) } +# C++11 support +lessThan(QT_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=c++11 + # COMPILATION SPECIFIC !nogui:dbus: QT += dbus -QMAKE_CXXFLAGS += -Wall -Wextra -Wpedantic -Wformat-security +QMAKE_CXXFLAGS += -Wformat -Wformat-security !haiku: QMAKE_LFLAGS_APP += -rdynamic # Man page @@ -36,7 +39,7 @@ # Menu Icon !nogui { - menuicon.files = $$DIST_PATH/qbittorrent.desktop + menuicon.files = icons/qbittorrent.desktop menuicon.path = $$DATADIR/applications/ INSTALLS += menuicon @@ -90,12 +93,6 @@ statusIcon128.path = $$DATADIR/icons/hicolor/128x128/status/ statusIcon192.files = $$DIST_PATH/menuicons/192x192/status/qbittorrent-tray.png statusIcon192.path = $$DATADIR/icons/hicolor/192x192/status/ - - statusIconScalable.files = $$PWD/src/icons/skin/qbittorrent-tray.svg \ - $$PWD/src/icons/skin/qbittorrent-tray-dark.svg \ - $$PWD/src/icons/skin/qbittorrent-tray-light.svg - statusIconScalable.path = $$DATADIR/icons/hicolor/scalable/status/ - INSTALLS += \ icon16 \ icon22 \ @@ -118,8 +115,7 @@ statusIcon72 \ statusIcon96 \ statusIcon128 \ - statusIcon192 \ - statusIconScalable + statusIcon192 pixmap.files = $$DIST_PATH/menuicons/128x128/apps/qbittorrent.png pixmap.path = $$DATADIR/pixmaps/ diff -Nru qbittorrent-4.1.3/version.pri qbittorrent-3.3.15/version.pri --- qbittorrent-4.1.3/version.pri 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/version.pri 2017-08-03 20:30:10.000000000 +0000 @@ -2,9 +2,9 @@ PROJECT_NAME = qbittorrent # Define version numbers here -VER_MAJOR = 4 -VER_MINOR = 1 -VER_BUGFIX = 3 +VER_MAJOR = 3 +VER_MINOR = 3 +VER_BUGFIX = 15 VER_BUILD = 0 VER_STATUS = # Should be empty for stable releases! @@ -22,5 +22,11 @@ DEFINES += QBT_VERSION_BUGFIX=$${VER_BUGFIX} DEFINES += QBT_VERSION_BUILD=$${VER_BUILD} -DEFINES += QBT_VERSION=\\\"v$${PROJECT_VERSION}\\\" -DEFINES += QBT_VERSION_2=\\\"$${PROJECT_VERSION}\\\" +os2 { + DEFINES += QBT_VERSION=\'\"v$${PROJECT_VERSION}\"\' + DEFINES += QBT_VERSION_2=\'\"$${PROJECT_VERSION}\"\' +} +else { + DEFINES += QBT_VERSION=\\\"v$${PROJECT_VERSION}\\\" + DEFINES += QBT_VERSION_2=\\\"$${PROJECT_VERSION}\\\" +} diff -Nru qbittorrent-4.1.3/winconf-mingw.pri qbittorrent-3.3.15/winconf-mingw.pri --- qbittorrent-4.1.3/winconf-mingw.pri 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/winconf-mingw.pri 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,38 @@ +# C++11 support +lessThan(QT_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=gnu++11 + +strace_win{ + contains(QMAKE_HOST.arch, x86) { + # i686 arch requires frame pointer preservation + QMAKE_CXXFLAGS_RELEASE += -fno-omit-frame-pointer + QMAKE_CXXFLAGS_DEBUG += -fno-omit-frame-pointer + } + + QMAKE_LFLAGS += -Wl,--export-all-symbols + + LIBS += libdbghelp +} + +CONFIG(debug, debug|release) { + # Make sure binary is not relocatable, otherwise debugging will fail + QMAKE_LFLAGS -= -Wl,--dynamicbase +} + +RC_FILE = qbittorrent_mingw.rc + +# Adapt the lib names/versions accordingly +CONFIG(debug, debug|release) { + LIBS += libtorrent-rasterbar \ + libboost_system-mt \ + libboost_filesystem-mt \ + libboost_thread_win32-mt +} else { + LIBS += libtorrent-rasterbar \ + libboost_system-mt \ + libboost_filesystem-mt \ + libboost_thread_win32-mt +} + +LIBS += libadvapi32 libshell32 libuser32 +LIBS += libcrypto libssl libwsock32 libws2_32 libz libiconv +LIBS += libpowrprof diff -Nru qbittorrent-4.1.3/winconf-msvc.pri qbittorrent-3.3.15/winconf-msvc.pri --- qbittorrent-4.1.3/winconf-msvc.pri 1970-01-01 00:00:00.000000000 +0000 +++ qbittorrent-3.3.15/winconf-msvc.pri 2017-08-03 20:30:10.000000000 +0000 @@ -0,0 +1,32 @@ +strace_win { + contains(QMAKE_HOST.arch, x86) { + # i686 arch requires frame pointer preservation + QMAKE_CXXFLAGS_RELEASE += -Oy- + QMAKE_CXXFLAGS_DEBUG += -Oy- + } + release { + QMAKE_CXXFLAGS_RELEASE += -Zi + QMAKE_LFLAGS += "/DEBUG" + } + LIBS += dbghelp.lib +} + +CONFIG -= embed_manifest_exe +QMAKE_LFLAGS += "/MANIFEST:EMBED /MANIFESTINPUT:$$quote($${PWD}/src/qbittorrent.exe.manifest) /STACK:0x800000" +QMAKE_LFLAGS_RELEASE += "/OPT:REF /OPT:ICF" + +RC_FILE = qbittorrent.rc + +# Adapt the lib names/versions accordingly +CONFIG(debug, debug|release) { + LIBS += libtorrentd.lib \ + libboost_system-vc90-mt-sgd-1_51.lib +} else { + LIBS += libtorrent.lib \ + libboost_system-vc90-mt-s-1_51.lib +} + +LIBS += advapi32.lib shell32.lib crypt32.lib User32.lib +LIBS += libeay32.lib ssleay32.lib +LIBS += PowrProf.lib +LIBS += zlib.lib diff -Nru qbittorrent-4.1.3/winconf.pri qbittorrent-3.3.15/winconf.pri --- qbittorrent-4.1.3/winconf.pri 2018-09-18 19:52:17.000000000 +0000 +++ qbittorrent-3.3.15/winconf.pri 2017-08-03 20:30:10.000000000 +0000 @@ -1,79 +1,67 @@ +# Adapt these paths on Windows + +# Point this to the boost include folder +INCLUDEPATH += $$quote(C:/qBittorrent/boost_1_51_0) +# Point this to the libtorrent include folder +INCLUDEPATH += $$quote(C:/qBittorrent/RC_0_16/include) +# Point this to the zlib include folder +INCLUDEPATH += $$quote(C:/qBittorrent/Zlib/include) +# Point this to the openssl include folder +INCLUDEPATH += $$quote(C:/qBittorrent/openssl/include) + +# Point this to the boost lib folder +LIBS += $$quote(-LC:/qBittorrent/boost_1_51_0/stage/lib) +# Point this to the libtorrent lib folder +LIBS += $$quote(-LC:/qBittorrent/RC_0_16/bin/path-according-to-the-build-options-chosen) +# Point this to the zlib lib folder +LIBS += $$quote(-LC:/qBittorrent/Zlib/lib) +# Point this to the openssl lib folder +LIBS += $$quote(-LC:/qBittorrent/openssl/lib) + +# BOOST DEFINES +DEFINES += BOOST_ALL_NO_LIB DEFINES += BOOST_ASIO_HASH_MAP_BUCKETS=1021 +# Disable this if building against libtorrent 1.1.x (RC_1_1) +DEFINES += BOOST_ASIO_SEPARATE_COMPILATION # After 1.55 some Windows users reported regular UI freezes. # This makes ASIO use the pre-1.56 way of doing things. See issue #2003 DEFINES += BOOST_ASIO_DISABLE_CONNECTEX +# Boost 1.60+ defaults to Vista+ support. The define below enables XP support again. +DEFINES += BOOST_USE_WINAPI_VERSION=0x0501 DEFINES += BOOST_EXCEPTION_DISABLE +DEFINES += BOOST_SYSTEM_STATIC_LINK=1 +# LIBTORRENT DEFINES DEFINES += TORRENT_USE_OPENSSL DEFINES += TORRENT_DISABLE_GEO_IP DEFINES += TORRENT_DISABLE_RESOLVE_COUNTRIES +# QBT DEFINES DEFINES += UNICODE DEFINES += _UNICODE DEFINES += WIN32 DEFINES += _WIN32 DEFINES += WIN32_LEAN_AND_MEAN +DEFINES += NTDDI_VERSION=0x05010000 +DEFINES += _WIN32_WINNT=0x0501 +DEFINES += _WIN32_IE=0x0501 DEFINES += _CRT_SECURE_NO_DEPRECATE DEFINES += _SCL_SECURE_NO_DEPRECATE DEFINES += __USE_W32_SOCKETS DEFINES += _FILE_OFFSET_BITS=64 -DEFINES += NOMINMAX CONFIG(debug, debug|release) { - DEFINES += TORRENT_DEBUG -} -else { - DEFINES += NDEBUG -} - -win32-g++* { - CONFIG(debug, debug|release) { - # Make sure binary is not relocatable, otherwise debugging will fail - QMAKE_LFLAGS -= -Wl,--dynamicbase - } - - RC_FILE = qbittorrent_mingw.rc - - LIBS += libadvapi32 libshell32 libuser32 libole32 libwsock32 libws2_32 + DEFINES += TORRENT_DEBUG +} else { + DEFINES += NDEBUG } -else:win32-msvc* { - CONFIG -= embed_manifest_exe - QMAKE_LFLAGS += "/MANIFEST:EMBED /MANIFESTINPUT:$$quote($${PWD}/src/qbittorrent.exe.manifest) /STACK:0x800000" - - RC_FILE = qbittorrent.rc - LIBS += advapi32.lib shell32.lib crypt32.lib User32.lib ole32.lib -} +# Enable backtrace support +CONFIG += strace_win -# See an example build configuration in "conf.pri.windows" -exists(conf.pri) { - include(conf.pri) +win32-g++* { + include(winconf-mingw.pri) } else { - error("'conf.pri' does not exist. See an example configuration in 'conf.pri.windows'.") -} - -# Stack trace support can be enabled in 'conf.pri' -stacktrace { - win32-g++* { - contains(QMAKE_HOST.arch, x86) { - # i686 arch requires frame pointer preservation - QMAKE_CXXFLAGS += -fno-omit-frame-pointer - } - - QMAKE_LFLAGS += -Wl,--export-all-symbols - - LIBS += libdbghelp - } - else:win32-msvc* { - contains(QMAKE_HOST.arch, x86) { - # i686 arch requires frame pointer preservation - QMAKE_CXXFLAGS += -Oy- - } - - QMAKE_CXXFLAGS *= -Zi - QMAKE_LFLAGS *= "/DEBUG" - - LIBS += dbghelp.lib - } + include(winconf-msvc.pri) }